LyoKICogKGMpIENvcHlyaWdodCAxOTkzLCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCiAqIENvcHlyaWdodCCpIDIwMTIgTGluYXJvIExpbWl0ZWQKICoKICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGdsbWFyazIgT3BlbkdMIChFUykgMi4wIGJlbmNobWFyay4KICoKICogZ2xtYXJrMiBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQogKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCiAqIHZlcnNpb24uCiAqCiAqIGdsbWFyazIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCiAqIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQogKiBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCiAqIGdsbWFyazIuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAqCiAqIEF1dGhvcnM6CiAqICBKZXNzZSBCYXJrZXIKICovCiNpZm5kZWYgU1BMSU5FU19IXwojZGVmaW5lIFNQTElORVNfSF8KCiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlICJ2ZWMuaCIKCmNsYXNzIFNwbGluZQp7CnB1YmxpYzoKICAgIFNwbGluZSgpIDoKICAgICAgICBwYXJhbURhdGFfKDApIHt9CiAgICB+U3BsaW5lKCkKICAgIHsKICAgICAgICBkZWxldGUgW10gcGFyYW1EYXRhXzsKICAgIH0KICAgIHZvaWQgYWRkQ29udHJvbFBvaW50KGNvbnN0IExpYk1hdHJpeDo6dmVjMyYgcG9pbnQpIHsgY29udHJvbERhdGFfLnB1c2hfYmFjayhwb2ludCk7IH0KICAgIHZvaWQgZ2V0Q3VycmVudFZlYyhmbG9hdCBjdXJyZW50VGltZSwgTGliTWF0cml4Ojp2ZWMzJiB2KSBjb25zdDsKICAgIHZvaWQgY2FsY1BhcmFtcygpOwoKcHJpdmF0ZToKICAgIHN0ZDo6dmVjdG9yPExpYk1hdHJpeDo6dmVjMz4gY29udHJvbERhdGFfOwogICAgdHlwZWRlZiBMaWJNYXRyaXg6OnZlYzMgcGFyYW1bNF07CiAgICBwYXJhbSogcGFyYW1EYXRhXzsKfTsKCmNsYXNzIFZpZXdGcm9tU3BsaW5lIDogcHVibGljIFNwbGluZQp7CnB1YmxpYzoKICAgIFZpZXdGcm9tU3BsaW5lKCk7CiAgICB+Vmlld0Zyb21TcGxpbmUoKSB7fQp9OwoKY2xhc3MgVmlld1RvU3BsaW5lIDogcHVibGljIFNwbGluZQp7CnB1YmxpYzoKICAgIFZpZXdUb1NwbGluZSgpOwogICAgflZpZXdUb1NwbGluZSgpIHt9Cn07CgpjbGFzcyBMaWdodFBvc2l0aW9uU3BsaW5lIDogcHVibGljIFNwbGluZQp7CnB1YmxpYzoKICAgIExpZ2h0UG9zaXRpb25TcGxpbmUoKTsKICAgIH5MaWdodFBvc2l0aW9uU3BsaW5lKCkge30KfTsKCmNsYXNzIExvZ29Qb3NpdGlvblNwbGluZSA6IHB1YmxpYyBTcGxpbmUKewpwdWJsaWM6CiAgICBMb2dvUG9zaXRpb25TcGxpbmUoKTsKICAgIH5Mb2dvUG9zaXRpb25TcGxpbmUoKSB7fQp9OwoKY2xhc3MgTG9nb1JvdGF0aW9uU3BsaW5lIDogcHVibGljIFNwbGluZQp7CnB1YmxpYzoKICAgIExvZ29Sb3RhdGlvblNwbGluZSgpOwogICAgfkxvZ29Sb3RhdGlvblNwbGluZSgpIHt9Cn07CgojZW5kaWYgLy8gU1BMSU5FU19IXwo=