LyoKICogQ29weXJpZ2h0IChDKSAyMDEwIE5YUCBTZW1pY29uZHVjdG9ycwogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKiEKICogXGZpbGUgIHBoRnJpTmZjX01hcFRvb2xzLmMKICogXGJyaWVmIE5GQyBOZGVmIEludGVybmFsIE1hcHBpbmcgRmlsZS4KICoKICogUHJvamVjdDogTkZDLUZSSQogKgogKiAkRGF0ZTogRnJpIE9jdCAxNSAxMzo1MDo1NCAyMDEwICQKICogJEF1dGhvcjogaW5nMDIyNjAgJAogKiAkUmV2aXNpb246IDEuNiAkCiAqICRBbGlhc2VzOiAgJAogKgogKi8KCiNpbmNsdWRlIDxwaEZyaU5mY19OZGVmTWFwLmg+CiNpbmNsdWRlIDxwaEZyaU5mY19NYXBUb29scy5oPgoKI2lmbmRlZiBQSF9GUklORkNfTUFQX01JRkFSRVVMX0RJU0FCTEVECiNpbmNsdWRlIDxwaEZyaU5mY19NaWZhcmVVTE1hcC5oPgojZW5kaWYgIC8qIFBIX0ZSSU5GQ19NQVBfTUlGQVJFVUxfRElTQUJMRUQqLwoKI2lmbmRlZiBQSF9GUklORkNfTUFQX01JRkFSRVNURF9ESVNBQkxFRAojaW5jbHVkZSA8cGhGcmlOZmNfTWlmYXJlU3RkTWFwLmg+CiNlbmRpZiAgLyogUEhfRlJJTkZDX01BUF9NSUZBUkVTVERfRElTQUJMRUQgKi8KCiNpZm5kZWYgUEhfRlJJTkZDX01BUF9ERVNGSVJFX0RJU0FCTEVECiNpbmNsdWRlIDxwaEZyaU5mY19EZXNmaXJlTWFwLmg+CiNlbmRpZiAgLyogUEhfRlJJTkZDX01BUF9ERVNGSVJFX0RJU0FCTEVEICovCgojaWZuZGVmIFBIX0ZSSU5GQ19NQVBfRkVMSUNBX0RJU0FCTEVECiNpbmNsdWRlIDxwaEZyaU5mY19GZWxpY2FNYXAuaD4KI2VuZGlmICAvKiBQSF9GUklORkNfTUFQX0ZFTElDQV9ESVNBQkxFRCAqLwoKI2luY2x1ZGUgPHBoRnJpTmZjX092ckhhbC5oPgoKLyohIFxpbmdyb3VwIGdycF9maWxlX2F0dHJpYnV0ZXMKICogIFxuYW1lIE5ERUYgTWFwcGluZwogKgogKiBGaWxlOiBccmVmIHBoRnJpTmZjX01hcFRvb2xzLmMKICogICAgICAgVGhpcyBmaWxlIGhhcyBmdW5jdGlvbnMgd2hpY2ggYXJlIHVzZWQgY29tbW9uIGFjcm9zcyBhbGwgdGhlCiAqICAgICAgIHR5cDEvdHlwZTIvdHlwZTMvdHlwZTQgdGFncy4KICoKICovCi8qQHsqLwojZGVmaW5lIFBIRlJJTkZDTkRFRk1BUF9GSUxFUkVWSVNJT04gIiRSZXZpc2lvbjogMS42ICQiCiNkZWZpbmUgUEhGUklORkNOREVGTUFQX0ZJTEVBTElBU0VTICAiJEFsaWFzZXM6ICAkIgovKkB9Ki8KCk5GQ1NUQVRVUyBwaEZyaU5mY19NYXBUb29sX1NldENhcmRTdGF0ZShwaEZyaU5mY19OZGVmTWFwX3QgICpOZGVmTWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBMZW5ndGgpCnsKICAgIE5GQ1NUQVRVUyAgIFJlc3VsdCA9IE5GQ1NUQVRVU19TVUNDRVNTOwogICAgaWYoTGVuZ3RoID09IFBIX0ZSSU5GQ19OREVGTUFQX01GVUxfVkFMMCkKICAgIHsKICAgICAgICAvKiBBcyB0aGUgTkRFRiBMRU4gLyBUTFYgTGVuIGlzIFplcm8sIGlycmVzcGVjdGl2ZSBvZiBhbnkgc3RhdGUgdGhlIGNhcmQKICAgICAgICAgICBzaGFsbCBiZSBzZXQgdG8gSU5JVElBTElaRUQgU1RBVEUqLwogICAgICAgIE5kZWZNYXAtPkNhcmRTdGF0ZSA9KHVpbnQ4X3QpICgoKE5kZWZNYXAtPkNhcmRTdGF0ZSA9PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBIX05ERUZNQVBfQ0FSRF9TVEFURV9SRUFEX09OTFkpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5kZWZNYXAtPkNhcmRTdGF0ZSA9PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBIX05ERUZNQVBfQ0FSRF9TVEFURV9JTlZBTElEKSk/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhfTkRFRk1BUF9DQVJEX1NUQVRFX0lOVkFMSUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhfTkRFRk1BUF9DQVJEX1NUQVRFX0lOSVRJQUxJWkVEKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBzd2l0Y2goTmRlZk1hcC0+Q2FyZFN0YXRlKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSBQSF9OREVGTUFQX0NBUkRfU1RBVEVfSU5JVElBTElaRUQ6CiAgICAgICAgICAgICAgICBOZGVmTWFwLT5DYXJkU3RhdGUgPSh1aW50OF90KSAoKE5kZWZNYXAtPkNhcmRTdGF0ZSA9PQogICAgICAgICAgICAgICAgICAgIFBIX05ERUZNQVBfQ0FSRF9TVEFURV9JTlZBTElEKT8KICAgICAgICAgICAgICAgICAgICBOZGVmTWFwLT5DYXJkU3RhdGU6CiAgICAgICAgICAgICAgICAgICAgUEhfTkRFRk1BUF9DQVJEX1NUQVRFX1JFQURfV1JJVEUpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhfTkRFRk1BUF9DQVJEX1NUQVRFX1JFQURfT05MWToKICAgICAgICAgICAgICAgIE5kZWZNYXAtPkNhcmRTdGF0ZSA9ICh1aW50OF90KSgoTmRlZk1hcC0+Q2FyZFN0YXRlID09CiAgICAgICAgICAgICAgICAgICAgUEhfTkRFRk1BUF9DQVJEX1NUQVRFX0lOVkFMSUQpPwogICAgICAgICAgICAgICAgICAgIE5kZWZNYXAtPkNhcmRTdGF0ZToKICAgICAgICAgICAgICAgICAgICBQSF9OREVGTUFQX0NBUkRfU1RBVEVfUkVBRF9PTkxZKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIX05ERUZNQVBfQ0FSRF9TVEFURV9SRUFEX1dSSVRFOgogICAgICAgICAgICAgICAgTmRlZk1hcC0+Q2FyZFN0YXRlID0gKHVpbnQ4X3QpKChOZGVmTWFwLT5DYXJkU3RhdGUgPT0KICAgICAgICAgICAgICAgICAgICBQSF9OREVGTUFQX0NBUkRfU1RBVEVfSU5WQUxJRCk/CiAgICAgICAgICAgICAgICAgICAgTmRlZk1hcC0+Q2FyZFN0YXRlOgogICAgICAgICAgICAgICAgICAgIFBIX05ERUZNQVBfQ0FSRF9TVEFURV9SRUFEX1dSSVRFKTsKICAgICAgICAgICAgICAgIGlmIChOZGVmTWFwLT5DYXJkVHlwZSA9PSBQSF9GUklORkNfTkRFRk1BUF9NSUZBUkVfU1REXzFLX0NBUkQgfHwKICAgICAgICAgICAgICAgICAgICBOZGVmTWFwLT5DYXJkVHlwZSA9PSBQSF9GUklORkNfTkRFRk1BUF9NSUZBUkVfU1REXzRLX0NBUkQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYoTmRlZk1hcC0+U3RkTWlmYXJlQ29udGFpbmVyLlJlYWRPbmx5U2VjdG9ySW5kZXggJiYKICAgICAgICAgICAgICAgICAgICAgICBOZGVmTWFwLT5TdGRNaWZhcmVDb250YWluZXIuU2VjdG9yVHJhaWxlckJsb2NrTm8gPT0gTmRlZk1hcC0+U3RkTWlmYXJlQ29udGFpbmVyLmN1cnJlbnRCbG9jayApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBOZGVmTWFwLT5DYXJkU3RhdGUgPSAodWludDhfdCkoKE5kZWZNYXAtPkNhcmRTdGF0ZSA9PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBIX05ERUZNQVBfQ0FSRF9TVEFURV9JTlZBTElEKT8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZGVmTWFwLT5DYXJkU3RhdGU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhfTkRFRk1BUF9DQVJEX1NUQVRFX1JFQURfT05MWSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBOZGVmTWFwLT5DYXJkU3RhdGUgPSBQSF9OREVGTUFQX0NBUkRfU1RBVEVfSU5WQUxJRDsKICAgICAgICAgICAgICAgIFJlc3VsdCA9IFBITkZDU1RWQUwoQ0lEX0ZSSV9ORkNfTkRFRl9NQVAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBORkNTVEFUVVNfTk9fTkRFRl9TVVBQT1JUKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgUmVzdWx0ID0gKChOZGVmTWFwLT5DYXJkU3RhdGUgPT0KICAgICAgICAgICAgICAgIFBIX05ERUZNQVBfQ0FSRF9TVEFURV9JTlZBTElEKT8KICAgICAgICAgICAgICAgIFBITkZDU1RWQUwoQ0lEX0ZSSV9ORkNfTkRFRl9NQVAsCiAgICAgICAgICAgICAgICBORkNTVEFUVVNfTk9fTkRFRl9TVVBQT1JUKToKICAgICAgICAgICAgICAgIFJlc3VsdCk7CiAgICByZXR1cm4gUmVzdWx0Owp9CgovKiAgVG8gY2hlY2sgbWFwcGluZyBzcGVjIHZlcnNpb24gKi8KCk5GQ1NUQVRVUyAgIHBoRnJpTmZjX01hcFRvb2xfQ2hrU3BjVmVyKCBjb25zdCBwaEZyaU5mY19OZGVmTWFwX3QgICpOZGVmTWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICBWZXJzaW9uSW5kZXgpCnsKICAgIE5GQ1NUQVRVUyBzdGF0dXMgPSBORkNTVEFUVVNfU1VDQ0VTUzsKCiAgICB1aW50OF90IFRhZ1Zlck5vID0gTmRlZk1hcC0+U2VuZFJlY3ZCdWZbVmVyc2lvbkluZGV4XTsKCiAgICBpZiAoIFRhZ1Zlck5vID09IDAgKQogICAgewogICAgICAgIC8qUmV0dXJuIFN0YXR1cyBFcnJvciCTIEludmFsaWQgRm9ybWF0lCovCiAgICAgICAgc3RhdHVzID0gUEhORkNTVFZBTChDSURfRlJJX05GQ19OREVGX01BUCxORkNTVEFUVVNfSU5WQUxJRF9GT1JNQVQpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHN3aXRjaCAoTmRlZk1hcC0+Q2FyZFR5cGUpCiAgICAgICAgewogICAgICAgICAgICBjYXNlIFBIX0ZSSU5GQ19OREVGTUFQX01JRkFSRV9TVERfMUtfQ0FSRDoKICAgICAgICAgICAgY2FzZSBQSF9GUklORkNfTkRFRk1BUF9NSUZBUkVfU1REXzRLX0NBUkQ6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgbWFqb3IgYW5kIG1pbm9yIHZlcnNpb24gbnVtYmVyIG9mIE1pZmFyZSBzdGQgdmVyc2lvbiBudW1iZXIgKi8KICAgICAgICAgICAgICAgIHN0YXR1cyA9ICgoICgoIFBIX05GQ0ZSSV9NRlNURE1BUF9ORkNERVZfTUFKT1JfVkVSX05VTSA9PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBIX05GQ0ZSSV9NRlNURE1BUF9HRVRfTUFKT1JfVEFHX1ZFUk5PKFRhZ1Zlck5vICkgKSYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIFBIX05GQ0ZSSV9NRlNURE1BUF9ORkNERVZfTUlOT1JfVkVSX05VTSA9PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBIX05GQ0ZSSV9NRlNURE1BUF9HRVRfTUlOT1JfVEFHX1ZFUk5PKFRhZ1Zlck5vKSkpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCBQSF9ORkNGUklfTUZTVERNQVBfTkZDREVWX01BSk9SX1ZFUl9OVU0gPT0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSF9ORkNGUklfTUZTVERNQVBfR0VUX01BSk9SX1RBR19WRVJOTyhUYWdWZXJObyApICkmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBQSF9ORkNGUklfTUZTVERNQVBfTkZDREVWX01JTk9SX1ZFUl9OVU0gPAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBIX05GQ0ZSSV9NRlNURE1BUF9HRVRfTUlOT1JfVEFHX1ZFUk5PKFRhZ1Zlck5vKSApKSk/CiAgICAgICAgICAgICAgICAgICAgICAgIE5GQ1NUQVRVU19TVUNDRVNTOgogICAgICAgICAgICAgICAgICAgICAgICBQSE5GQ1NUVkFMKENJRF9GUklfTkZDX05ERUZfTUFQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORkNTVEFUVVNfSU5WQUxJRF9GT1JNQVQpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgojaWZkZWYgREVTRklSRV9FVjEKICAgICAgICAgICAgY2FzZSBQSF9GUklORkNfTkRFRk1BUF9JU08xNDQ0M180QV9DQVJEX0VWMToKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogY2FsY3VsYXRlIHRoZSBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBudW1iZXIgb2YgVDNWZXJObyAqLwogICAgICAgICAgICAgICAgaWYoICgoIFBIX05GQ0ZSSV9OREVGTUFQX05GQ0RFVl9NQUpPUl9WRVJfTlVNXzIgPT0KICAgICAgICAgICAgICAgICAgICAgICAgUEhfTkZDRlJJX05ERUZNQVBfR0VUX01BSk9SX1RBR19WRVJOTyhUYWdWZXJObyApICkmJgogICAgICAgICAgICAgICAgICAgICggUEhfTkZDRlJJX05ERUZNQVBfTkZDREVWX01JTk9SX1ZFUl9OVU0gPT0KICAgICAgICAgICAgICAgICAgICAgICAgUEhfTkZDRlJJX05ERUZNQVBfR0VUX01JTk9SX1RBR19WRVJOTyhUYWdWZXJObykpKSB8fAogICAgICAgICAgICAgICAgICAgICgoIFBIX05GQ0ZSSV9OREVGTUFQX05GQ0RFVl9NQUpPUl9WRVJfTlVNXzIgPT0KICAgICAgICAgICAgICAgICAgICAgICAgUEhfTkZDRlJJX05ERUZNQVBfR0VUX01BSk9SX1RBR19WRVJOTyhUYWdWZXJObyApICkmJgogICAgICAgICAgICAgICAgICAgICggUEhfTkZDRlJJX05ERUZNQVBfTkZDREVWX01JTk9SX1ZFUl9OVU0gPAogICAgICAgICAgICAgICAgICAgICAgICBQSF9ORkNGUklfTkRFRk1BUF9HRVRfTUlOT1JfVEFHX1ZFUk5PKFRhZ1Zlck5vKSApKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQSE5GQ1NUVkFMKENJRF9ORkNfTk9ORSxORkNTVEFUVVNfU1VDQ0VTUyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCggUEhfTkZDRlJJX05ERUZNQVBfTkZDREVWX01BSk9SX1ZFUl9OVU1fMiA8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSF9ORkNGUklfTkRFRk1BUF9HRVRfTUFKT1JfVEFHX1ZFUk5PKFRhZ1Zlck5vKSApIHx8CiAgICAgICAgICAgICAgICAgICAgKCBQSF9ORkNGUklfTkRFRk1BUF9ORkNERVZfTUFKT1JfVkVSX05VTV8yID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBIX05GQ0ZSSV9OREVGTUFQX0dFVF9NQUpPUl9UQUdfVkVSTk8oVGFnVmVyTm8pKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBITkZDU1RWQUwoQ0lEX0ZSSV9ORkNfTkRFRl9NQVAsTkZDU1RBVFVTX0lOVkFMSURfRk9STUFUKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQojZW5kaWYgLyogI2lmZGVmIERFU0ZJUkVfRVYxICovCgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIG51bWJlciBvZiBUM1Zlck5vICovCiAgICAgICAgICAgICAgICBpZiggKCggUEhfTkZDRlJJX05ERUZNQVBfTkZDREVWX01BSk9SX1ZFUl9OVU0gPT0KICAgICAgICAgICAgICAgICAgICAgICAgUEhfTkZDRlJJX05ERUZNQVBfR0VUX01BSk9SX1RBR19WRVJOTyhUYWdWZXJObyApICkmJgogICAgICAgICAgICAgICAgICAgICggUEhfTkZDRlJJX05ERUZNQVBfTkZDREVWX01JTk9SX1ZFUl9OVU0gPT0KICAgICAgICAgICAgICAgICAgICAgICAgUEhfTkZDRlJJX05ERUZNQVBfR0VUX01JTk9SX1RBR19WRVJOTyhUYWdWZXJObykpKSB8fAogICAgICAgICAgICAgICAgICAgICgoIFBIX05GQ0ZSSV9OREVGTUFQX05GQ0RFVl9NQUpPUl9WRVJfTlVNID09CiAgICAgICAgICAgICAgICAgICAgICAgIFBIX05GQ0ZSSV9OREVGTUFQX0dFVF9NQUpPUl9UQUdfVkVSTk8oVGFnVmVyTm8gKSApJiYKICAgICAgICAgICAgICAgICAgICAoIFBIX05GQ0ZSSV9OREVGTUFQX05GQ0RFVl9NSU5PUl9WRVJfTlVNIDwKICAgICAgICAgICAgICAgICAgICAgICAgUEhfTkZDRlJJX05ERUZNQVBfR0VUX01JTk9SX1RBR19WRVJOTyhUYWdWZXJObykgKSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUEhORkNTVFZBTChDSURfTkZDX05PTkUsTkZDU1RBVFVTX1NVQ0NFU1MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICgoIFBIX05GQ0ZSSV9OREVGTUFQX05GQ0RFVl9NQUpPUl9WRVJfTlVNIDwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBIX05GQ0ZSSV9OREVGTUFQX0dFVF9NQUpPUl9UQUdfVkVSTk8oVGFnVmVyTm8pICkgfHwKICAgICAgICAgICAgICAgICAgICAoIFBIX05GQ0ZSSV9OREVGTUFQX05GQ0RFVl9NQUpPUl9WRVJfTlVNID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBIX05GQ0ZSSV9OREVGTUFQX0dFVF9NQUpPUl9UQUdfVkVSTk8oVGFnVmVyTm8pKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBITkZDU1RWQUwoQ0lEX0ZSSV9ORkNfTkRFRl9NQVAsTkZDU1RBVFVTX0lOVkFMSURfRk9STUFUKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKCiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAoc3RhdHVzKTsKfQo=