IyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KIyAgUHJvamVjdCAgICAgICAgICAgICAgICAgICAgIF9fX3wgfCB8IHwgIF8gXHwgfAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIF9ffCB8IHwgfCB8XykgfCB8CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKIwojIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTQsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAojIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKIyBhcmUgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL2N1cmwuaGF4eC5zZS9kb2NzL2NvcHlyaWdodC5odG1sLgojCiMgWW91IG1heSBvcHQgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlIGFuZC9vciBzZWxsCiMgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCiMgZnVybmlzaGVkIHRvIGRvIHNvLCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENPUFlJTkcgZmlsZS4KIwojIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgojCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIGNVUkwvbGliY3VybCBDTWFrZSBzY3JpcHQKIyBieSBUZXRldGVzdCBhbmQgU3VrZW5kZXIgKEJlbm9pdCBOZWlsKQoKIyBUT0RPOgojIFRoZSBvdXRwdXQgLnNvIGZpbGUgbGFja3MgdGhlIHNvbmFtZSBudW1iZXIgd2hpY2ggd2UgY3VycmVudGx5IGhhdmUgd2l0aGluIHRoZSBsaWIvTWFrZWZpbGUuYW0gZmlsZQojIEFkZCBmdWxsICg0IG9yIDUgbGlicykgU1NMIHN1cHBvcnQKIyBBZGQgSU5TVEFMTCB0YXJnZXQgKEVYVFJBX0RJU1QgdmFyaWFibGVzIGluIE1ha2VmaWxlLmFtIG1heSBiZSBtb3ZlZCB0byBNYWtlZmlsZS5pbmMgc28gdGhhdCBDTWFrZS9DUGFjayBpcyBhd2FyZSBvZiB3aGF0J3MgdG8gaW5jbHVkZSkuCiMgQWRkIENUZXN0cyg/KQojIENoZWNrIG9uIGFsbCBwb3NzaWJsZSBwbGF0Zm9ybXMKIyBUZXN0IHdpdGggYXMgbWFueSBjb25maWd1cmF0aW9ucyBwb3NzaWJsZSAoV2l0aCBvciB3aXRob3V0IGFueSBvcHRpb24pCiMgQ3JlYXRlIHNjcmlwdHMgdGhhdCBoZWxwIGtlZXBpbmcgdGhlIENNYWtlIGJ1aWxkIHN5c3RlbSB1cCB0byBkYXRlICh0byByZWR1Y2UgbWFpbnRlbmFuY2UpLiBBY2NvcmRpbmcgdG8gVGV0ZXRlc3Q6CiMgIC0gbGlzdHMgb2YgaGVhZGVycyB0aGF0ICdjb25maWd1cmUnIGNoZWNrcyBmb3I7CiMgIC0gY3VybC1zcGVjaWZpYyB0ZXN0cyAodGhlIG9uZXMgdGhhdCBhcmUgaW4gbTQvY3VybC0qLm00IGZpbGVzKTsKIyAgLSAobW9zdCBvYnZpb3VzIHRoaW5nOikgY3VybCB2ZXJzaW9uIG51bWJlcnMuCiMgQWRkIGRvY3VtZW50YXRpb24gc3VicHJvamVjdAojCiMgVG8gY2hlY2s6CiMgKEZyb20gRGFuaWVsIFN0ZW5iZXJnKSBUaGUgY21ha2UgYnVpbGQgc2VsZWN0ZWQgdG8gcnVuIGdjYyB3aXRoIC1mUElDIG9uIG15IGJveCB3aGlsZSB0aGUgcGxhaW4gY29uZmlndXJlIHNjcmlwdCBkaWQgbm90LgojIChGcm9tIERhbmllbCBTdGVuYmVyZykgVGhlIGdjYyBjb21tYW5kIGxpbmUgdXNlIG5laXRoZXIgLWcgbm9yIGFueSAtTyBvcHRpb25zLiBBcyBhIGRldmVsb3BlciwgSSBhbHNvIHRyZWFzdXJlIG91ciBjb25maWd1cmUgc2NyaXB0cydzIC0tZW5hYmxlLWRlYnVnIG9wdGlvbiB0aGF0IHNldHMgYSBsb25nIHJhbmdlIG9mICJwaWNreSIgY29tcGlsZXIgb3B0aW9ucy4KY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOCBGQVRBTF9FUlJPUikKc2V0KENNQUtFX01PRFVMRV9QQVRIICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vQ01ha2U7JHtDTUFLRV9NT0RVTEVfUEFUSH0iKQppbmNsdWRlKFV0aWxpdGllcykKaW5jbHVkZShNYWNyb3MpCgpwcm9qZWN0KCBDVVJMIEMgKQoKbWVzc2FnZShXQVJOSU5HICJ0aGUgY3VybCBjbWFrZSBidWlsZCBzeXN0ZW0gaXMgcG9vcmx5IG1haW50YWluZWQuIEJlIGF3YXJlIikKCmZpbGUgKFJFQUQgJHtDVVJMX1NPVVJDRV9ESVJ9L2luY2x1ZGUvY3VybC9jdXJsdmVyLmggQ1VSTF9WRVJTSU9OX0hfQ09OVEVOVFMpCnN0cmluZyAoUkVHRVggTUFUQ0ggIkxJQkNVUkxfVkVSU0lPTl9NQUpPUlsgXHRdKyhbMC05XSspIgogIExJQkNVUkxfVkVSU0lPTl9NSiAke0NVUkxfVkVSU0lPTl9IX0NPTlRFTlRTfSkKc3RyaW5nIChSRUdFWCBNQVRDSCAiKFswLTldKykiCiAgTElCQ1VSTF9WRVJTSU9OX01KICR7TElCQ1VSTF9WRVJTSU9OX01KfSkKc3RyaW5nIChSRUdFWCBNQVRDSAogICJMSUJDVVJMX1ZFUlNJT05fTUlOT1JbIFx0XSsoWzAtOV0rKSIKICBMSUJDVVJMX1ZFUlNJT05fTUkgJHtDVVJMX1ZFUlNJT05fSF9DT05URU5UU30pCnN0cmluZyAoUkVHRVggTUFUQ0ggIihbMC05XSspIiBMSUJDVVJMX1ZFUlNJT05fTUkgJHtMSUJDVVJMX1ZFUlNJT05fTUl9KQpzdHJpbmcgKFJFR0VYIE1BVENICiAgIkxJQkNVUkxfVkVSU0lPTl9QQVRDSFsgXHRdKyhbMC05XSspIgogIExJQkNVUkxfVkVSU0lPTl9QVCAke0NVUkxfVkVSU0lPTl9IX0NPTlRFTlRTfSkKc3RyaW5nIChSRUdFWCBNQVRDSCAiKFswLTldKykiIExJQkNVUkxfVkVSU0lPTl9QVCAke0xJQkNVUkxfVkVSU0lPTl9QVH0pCnNldCAoQ1VSTF9NQUpPUl9WRVJTSU9OICR7TElCQ1VSTF9WRVJTSU9OX01KfSkKc2V0IChDVVJMX01JTk9SX1ZFUlNJT04gJHtMSUJDVVJMX1ZFUlNJT05fTUl9KQpzZXQgKENVUkxfUEFUQ0hfVkVSU0lPTiAke0xJQkNVUkxfVkVSU0lPTl9QVH0pCgppbmNsdWRlX3JlZ3VsYXJfZXhwcmVzc2lvbigiXi4qJCIpICAgICMgU3VrZW5kZXI6IElzIGl0IG5lY2Vzc2FyeT8KCiMgU2V0dXAgcGFja2FnZSBtZXRhLWRhdGEKIyBTRVQoUEFDS0FHRSAiY3VybCIpCnNldChDVVJMX1ZFUlNJT04gJHtDVVJMX01BSk9SX1ZFUlNJT059LiR7Q1VSTF9NSU5PUl9WRVJTSU9OfS4ke0NVUkxfUEFUQ0hfVkVSU0lPTn0pCm1lc3NhZ2UoU1RBVFVTICJjdXJsIHZlcnNpb249WyR7Q1VSTF9WRVJTSU9OfV0iKQojIFNFVChQQUNLQUdFX1RBUk5BTUUgImN1cmwiKQojIFNFVChQQUNLQUdFX05BTUUgImN1cmwiKQojIFNFVChQQUNLQUdFX1ZFUlNJT04gIi0iKQojIFNFVChQQUNLQUdFX1NUUklORyAiY3VybC0iKQojIFNFVChQQUNLQUdFX0JVR1JFUE9SVCAiYSBzdWl0YWJsZSBjdXJsIG1haWxpbmcgbGlzdCA9PiBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvIikKc2V0KE9QRVJBVElOR19TWVNURU0gIiR7Q01BS0VfU1lTVEVNX05BTUV9IikKc2V0KE9TICJcIiR7Q01BS0VfU1lTVEVNX05BTUV9XCIiKQoKaW5jbHVkZV9kaXJlY3Rvcmllcygke1BST0pFQ1RfQklOQVJZX0RJUn0vaW5jbHVkZS9jdXJsKQppbmNsdWRlX2RpcmVjdG9yaWVzKCAke0NVUkxfU09VUkNFX0RJUn0vaW5jbHVkZSApCgpvcHRpb24oQlVJTERfQ1VSTF9FWEUgIlNldCB0byBPTiB0byBidWlsZCBjVVJMIGV4ZWN1dGFibGUuIiBPTikKb3B0aW9uKEJVSUxEX0NVUkxfVEVTVFMgIlNldCB0byBPTiB0byBidWlsZCBjVVJMIHRlc3RzLiIgT04pCm9wdGlvbihDVVJMX1NUQVRJQ0xJQiAiU2V0IHRvIE9OIHRvIGJ1aWxkIGxpYmN1cmwgd2l0aCBzdGF0aWMgbGlua2luZy4iIE9GRikKb3B0aW9uKENVUkxfVVNFX0FSRVMgIlNldCB0byBPTiB0byBlbmFibGUgYy1hcmVzIHN1cHBvcnQiIE9GRikKIyBpbml0aWFsaXplIENVUkxfTElCUwpzZXQoQ1VSTF9MSUJTICIiKQoKaWYoQ1VSTF9VU0VfQVJFUykKICBzZXQoVVNFX0FSRVMgJHtDVVJMX1VTRV9BUkVTfSkKICBmaW5kX3BhY2thZ2UoQ0FSRVMgUkVRVUlSRUQpCiAgbGlzdChBUFBFTkQgQ1VSTF9MSUJTICR7Q0FSRVNfTElCUkFSWX0gKQogIHNldChDVVJMX0xJQlMgJHtDVVJMX0xJQlN9ICR7Q0FSRVNfTElCUkFSWX0pCmVuZGlmKCkKCm9wdGlvbihCVUlMRF9EQVNIQk9BUkRfUkVQT1JUUyAiU2V0IHRvIE9OIHRvIGFjdGl2YXRlIHJlcG9ydGluZyBvZiBjVVJMIGJ1aWxkcyBoZXJlIGh0dHA6Ly93d3cuY2Rhc2gub3JnL0NEYXNoUHVibGljL2luZGV4LnBocD9wcm9qZWN0PUNVUkwiIE9GRikKaWYoQlVJTERfREFTSEJPQVJEX1JFUE9SVFMpCiAgI0lOQ0xVREUoRGFydCkKICBpbmNsdWRlKENUZXN0KQplbmRpZihCVUlMRF9EQVNIQk9BUkRfUkVQT1JUUykKCmlmKE1TVkMpCiAgb3B0aW9uKEJVSUxEX1JFTEVBU0VfREVCVUdfRElSUyAiU2V0IE9GRiB0byBidWlsZCBlYWNoIGNvbmZpZ3VyYXRpb24gdG8gYSBzZXBhcmF0ZSBkaXJlY3RvcnkiIE9GRikKICBtYXJrX2FzX2FkdmFuY2VkKEJVSUxEX1JFTEVBU0VfREVCVUdfRElSUykKZW5kaWYoKQoKb3B0aW9uKENVUkxfSElEREVOX1NZTUJPTFMgIlNldCB0byBPTiB0byBoaWRlIGxpYmN1cmwgaW50ZXJuYWwgc3ltYm9scyAoPWhpZGUgYWxsIHN5bWJvbHMgdGhhdCBhcmVuJ3Qgb2ZmaWNpYWxseSBleHRlcm5hbCkuIiBPTikKbWFya19hc19hZHZhbmNlZChDVVJMX0hJRERFTl9TWU1CT0xTKQoKIyBJRihXSU4zMikKIyBPUFRJT04oQ1VSTF9XSU5ET1dTX1NTUEkgIlVzZSB3aW5kb3dzIGxpYnJhcmllcyB0byBhbGxvdyBOVExNIGF1dGhlbnRpY2F0aW9uIHdpdGhvdXQgb3BlbnNzbCIgT04pCiMgTUFSS19BU19BRFZBTkNFRChDVVJMX1dJTkRPV1NfU1NQSSkKIyBFTkRJRigpCgpvcHRpb24oSFRUUF9PTkxZICJkaXNhYmxlcyBhbGwgcHJvdG9jb2xzIGV4Y2VwdCBIVFRQIChUaGlzIG92ZXJyaWRlcyBhbGwgQ1VSTF9ESVNBQkxFXyogb3B0aW9ucykiIE9GRikKbWFya19hc19hZHZhbmNlZChIVFRQX09OTFkpCm9wdGlvbihDVVJMX0RJU0FCTEVfRlRQICJkaXNhYmxlcyBGVFAiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfRlRQKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0xEQVAgImRpc2FibGVzIExEQVAiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfTERBUCkKb3B0aW9uKENVUkxfRElTQUJMRV9URUxORVQgImRpc2FibGVzIFRlbG5ldCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9URUxORVQpCm9wdGlvbihDVVJMX0RJU0FCTEVfRElDVCAiZGlzYWJsZXMgRElDVCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9ESUNUKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0ZJTEUgImRpc2FibGVzIEZJTEUiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfRklMRSkKb3B0aW9uKENVUkxfRElTQUJMRV9URlRQICJkaXNhYmxlcyBURlRQIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX1RGVFApCm9wdGlvbihDVVJMX0RJU0FCTEVfSFRUUCAiZGlzYWJsZXMgSFRUUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9IVFRQKQoKb3B0aW9uKENVUkxfRElTQUJMRV9MREFQUyAidG8gZGlzYWJsZSBMREFQUyIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9MREFQUykKCm9wdGlvbihDVVJMX0RJU0FCTEVfUlRTUCAidG8gZGlzYWJsZSBSVFNQIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX1JUU1ApCm9wdGlvbihDVVJMX0RJU0FCTEVfUFJPWFkgInRvIGRpc2FibGUgcHJveHkiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfUFJPWFkpCm9wdGlvbihDVVJMX0RJU0FCTEVfUE9QMyAidG8gZGlzYWJsZSBQT1AzIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX1BPUDMpCm9wdGlvbihDVVJMX0RJU0FCTEVfSU1BUCAidG8gZGlzYWJsZSBJTUFQIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0lNQVApCm9wdGlvbihDVVJMX0RJU0FCTEVfU01UUCAidG8gZGlzYWJsZSBTTVRQIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX1NNVFApCm9wdGlvbihDVVJMX0RJU0FCTEVfR09QSEVSICJ0byBkaXNhYmxlIEdvcGhlciIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9HT1BIRVIpCgppZihIVFRQX09OTFkpCiAgc2V0KENVUkxfRElTQUJMRV9GVFAgT04pCiAgc2V0KENVUkxfRElTQUJMRV9MREFQIE9OKQogIHNldChDVVJMX0RJU0FCTEVfTERBUFMgT04pCiAgc2V0KENVUkxfRElTQUJMRV9URUxORVQgT04pCiAgc2V0KENVUkxfRElTQUJMRV9ESUNUIE9OKQogIHNldChDVVJMX0RJU0FCTEVfRklMRSBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX1RGVFAgT04pCiAgc2V0KENVUkxfRElTQUJMRV9SVFNQIE9OKQogIHNldChDVVJMX0RJU0FCTEVfUE9QMyBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX0lNQVAgT04pCiAgc2V0KENVUkxfRElTQUJMRV9TTVRQIE9OKQogIHNldChDVVJMX0RJU0FCTEVfR09QSEVSIE9OKQplbmRpZigpCgpvcHRpb24oQ1VSTF9ESVNBQkxFX0NPT0tJRVMgInRvIGRpc2FibGUgY29va2llcyBzdXBwb3J0IiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0NPT0tJRVMpCgpvcHRpb24oQ1VSTF9ESVNBQkxFX0NSWVBUT19BVVRIICJ0byBkaXNhYmxlIGNyeXB0b2dyYXBoaWMgYXV0aGVudGljYXRpb24iIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfQ1JZUFRPX0FVVEgpCm9wdGlvbihDVVJMX0RJU0FCTEVfVkVSQk9TRV9TVFJJTkdTICJ0byBkaXNhYmxlIHZlcmJvc2Ugc3RyaW5ncyIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9WRVJCT1NFX1NUUklOR1MpCm9wdGlvbihESVNBQkxFRF9USFJFQURTQUZFICJTZXQgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHdlIGRvbid0IHdhbnQgdG8gdXNlIHRocmVhZC1zYWZlIGZ1bmN0aW9ucyIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKERJU0FCTEVEX1RIUkVBRFNBRkUpCm9wdGlvbihFTkFCTEVfSVBWNiAiRGVmaW5lIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBJUHY2IHN1cHBvcnQiIE9GRikKbWFya19hc19hZHZhbmNlZChFTkFCTEVfSVBWNikKCgojIFdlIG5lZWQgYW5zaSBjLWZsYWdzLCBlc3BlY2lhbGx5IG9uIEhQCnNldChDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0FOU0lfQ0ZMQUdTfSAke0NNQUtFX0NfRkxBR1N9IikKc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTICR7Q01BS0VfQU5TSV9DRkxBR1N9KQoKIyBEaXNhYmxlIHdhcm5pbmdzIG9uIEJvcmxhbmQgdG8gYXZvaWQgY2hhbmdpbmcgM3JkIHBhcnR5IGNvZGUuCmlmKEJPUkxBTkQpCiAgc2V0KENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQ19GTEFHU30gLXctIikKZW5kaWYoQk9STEFORCkKCiMgSWYgd2UgYXJlIG9uIEFJWCwgZG8gdGhlIF9BTExfU09VUkNFIG1hZ2ljCmlmKCR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgQUlYKQogIHNldChfQUxMX1NPVVJDRSAxKQplbmRpZigke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTIEFJWCkKCiMgSW5jbHVkZSBhbGwgdGhlIG5lY2Vzc2FyeSBmaWxlcyBmb3IgbWFjcm9zCmluY2x1ZGUgKENoZWNrRnVuY3Rpb25FeGlzdHMpCmluY2x1ZGUgKENoZWNrSW5jbHVkZUZpbGUpCmluY2x1ZGUgKENoZWNrSW5jbHVkZUZpbGVzKQppbmNsdWRlIChDaGVja0xpYnJhcnlFeGlzdHMpCmluY2x1ZGUgKENoZWNrU3ltYm9sRXhpc3RzKQppbmNsdWRlIChDaGVja1R5cGVTaXplKQppbmNsdWRlIChDaGVja0NTb3VyY2VDb21waWxlcykKCiMgT24gd2luZG93cyBwcmVsb2FkIHNldHRpbmdzCmlmKFdJTjMyKQogIGluY2x1ZGUoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L0NNYWtlL1BsYXRmb3Jtcy9XaW5kb3dzQ2FjaGUuY21ha2UpCmVuZGlmKFdJTjMyKQoKIyBDaGVjayBmb3IgYWxsIG5lZWRlZCBsaWJyYXJpZXMKY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJkbCIgICAgIGRsb3BlbiAgICAgICBIQVZFX0xJQkRMKQpjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoInNvY2tldCIgY29ubmVjdCAgICAgIEhBVkVfTElCU09DS0VUKQpjaGVja19saWJyYXJ5X2V4aXN0cygiYyIgZ2V0aG9zdGJ5bmFtZSAiIiBOT1RfTkVFRF9MSUJOU0wpCgojIFllbGxvd3RhYiBaZXRhIG5lZWRzIGRpZmZlcmVudCBsaWJyYXJpZXMgdGhhbiBCZU9TIDUuCmlmKEJFT1MpCiAgc2V0KE5PVF9ORUVEX0xJQk5TTCAxKQogIGNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgiYmluZCIgZ2V0aG9zdGJ5bmFtZSBIQVZFX0xJQkJJTkQpCiAgY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJibmV0YXBpIiBjbG9zZXNvY2tldCBIQVZFX0xJQkJORVRBUEkpCmVuZGlmKEJFT1MpCgppZihOT1QgTk9UX05FRURfTElCTlNMKQogIGNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgibnNsIiAgICBnZXRob3N0YnluYW1lICBIQVZFX0xJQk5TTCkKZW5kaWYoTk9UIE5PVF9ORUVEX0xJQk5TTCkKCmlmKFdJTjMyKQogIGNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgid3MyXzMyIiBnZXRjaCAgICAgICAgSEFWRV9MSUJXUzJfMzIpCiAgY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJ3aW5tbSIgIGdldGNoICAgICAgICBIQVZFX0xJQldJTk1NKQplbmRpZigpCgppZihOT1QgQ1VSTF9ESVNBQkxFX0xEQVApCgogIGlmKFdJTjMyKQogICAgb3B0aW9uKENVUkxfTERBUF9XSU4gIlVzZSBXaW5kb3dzIExEQVAgaW1wbGVtZW50YXRpb24iIE9OKQogICAgaWYoQ1VSTF9MREFQX1dJTikKICAgICAgY2hlY2tfbGlicmFyeV9leGlzdHMoIndsZGFwMzIiIGNsZGFwX29wZW4gIiIgSEFWRV9XTERBUDMyKQogICAgICBpZihOT1QgSEFWRV9XTERBUDMyKQogICAgICAgIHNldChDVVJMX0xEQVBfV0lOIE9GRikKICAgICAgZW5kaWYoKQogICAgZW5kaWYoKQogIGVuZGlmKCkKCiAgb3B0aW9uKENNQUtFX1VTRV9PUEVOTERBUCAiVXNlIE9wZW5MREFQIGNvZGUuIiBPRkYpCiAgbWFya19hc19hZHZhbmNlZChDTUFLRV9VU0VfT1BFTkxEQVApCiAgc2V0KENNQUtFX0xEQVBfTElCICJsZGFwIiBDQUNIRSBTVFJJTkcgIk5hbWUgb3IgZnVsbCBwYXRoIHRvIGxkYXAgbGlicmFyeSIpCiAgc2V0KENNQUtFX0xCRVJfTElCICJsYmVyIiBDQUNIRSBTVFJJTkcgIk5hbWUgb3IgZnVsbCBwYXRoIHRvIGxiZXIgbGlicmFyeSIpCgogIGlmKENNQUtFX1VTRV9PUEVOTERBUCBBTkQgQ1VSTF9MREFQX1dJTikKICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkNhbm5vdCB1c2UgQ1VSTF9MREFQX1dJTiBhbmQgQ01BS0VfVVNFX09QRU5MREFQIGF0IHRoZSBzYW1lIHRpbWUiKQogIGVuZGlmKCkKICAKICAjIE5vdyB0aGF0IHdlIGtub3csIHdlJ3JlIG5vdCB1c2luZyB3aW5kb3dzIExEQVAuLi4KICBpZihOT1QgQ1VSTF9MREFQX1dJTikKICAgICMgQ2hlY2sgZm9yIExEQVAKICAgIGNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgke0NNQUtFX0xEQVBfTElCfSBsZGFwX2luaXQgSEFWRV9MSUJMREFQKQogICAgY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCR7Q01BS0VfTEJFUl9MSUJ9IGJlcl9pbml0IEhBVkVfTElCTEJFUikKICBlbHNlKCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIndpbmxkYXAuaCIgSEFWRV9XSU5MREFQX0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ3aW5iZXIuaCIgIEhBVkVfV0lOQkVSX0gpCiAgZW5kaWYoKQogIAogIHNldChDTUFLRV9MREFQX0lOQ0xVREVfRElSICIiIENBQ0hFIFNUUklORyAiUGF0aCB0byBMREFQIGluY2x1ZGUgZGlyZWN0b3J5IikKICBpZihDTUFLRV9MREFQX0lOQ0xVREVfRElSKQogICAgc2V0KENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICR7Q01BS0VfTERBUF9JTkNMVURFX0RJUn0pCiAgZW5kaWYoKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImxkYXAuaCIgICAgICAgICAgIEhBVkVfTERBUF9IKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImxiZXIuaCIgICAgICAgICAgIEhBVkVfTEJFUl9IKQoKICBpZihOT1QgSEFWRV9MREFQX0gpCiAgICBtZXNzYWdlKFNUQVRVUyAiTERBUF9IIG5vdCBmb3VuZCBDVVJMX0RJU0FCTEVfTERBUCBzZXQgT04iKQogICAgc2V0KENVUkxfRElTQUJMRV9MREFQIE9OIENBQ0hFIEJPT0wgIiIgRk9SQ0UpCiAgZWxzZWlmKE5PVCBIQVZFX0xJQkxEQVApCiAgICBtZXNzYWdlKFNUQVRVUyAiTERBUCBsaWJyYXJ5ICcke0NNQUtFX0xEQVBfTElCfScgbm90IGZvdW5kIENVUkxfRElTQUJMRV9MREFQIHNldCBPTiIpCiAgICBzZXQoQ1VSTF9ESVNBQkxFX0xEQVAgT04gQ0FDSEUgQk9PTCAiIiBGT1JDRSkKICBlbHNlKCkKICAgIGlmKENNQUtFX1VTRV9PUEVOTERBUCkKICAgICAgc2V0KFVTRV9PUEVOTERBUCBPTikKICAgIGVuZGlmKCkKICAgIGlmKENNQUtFX0xEQVBfSU5DTFVERV9ESVIpCiAgICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtDTUFLRV9MREFQX0lOQ0xVREVfRElSfSkKICAgIGVuZGlmKCkKICAgIHNldChORUVEX0xCRVJfSCBPTikKICAgIHNldChfSEVBREVSX0xJU1QpCiAgICBpZihIQVZFX1dJTkRPV1NfSCkKICAgICAgbGlzdChBUFBFTkQgX0hFQURFUl9MSVNUICJ3aW5kb3dzLmgiKQogICAgZW5kaWYoKQogICAgaWYoSEFWRV9TWVNfVFlQRVNfSCkKICAgICAgbGlzdChBUFBFTkQgX0hFQURFUl9MSVNUICJzeXMvdHlwZXMuaCIpCiAgICBlbmRpZigpCiAgICBsaXN0KEFQUEVORCBfSEVBREVSX0xJU1QgImxkYXAuaCIpCgogICAgc2V0KF9TUkNfU1RSSU5HICIiKQogICAgZm9yZWFjaChfSEVBREVSICR7X0hFQURFUl9MSVNUfSkKICAgICAgc2V0KF9JTkNMVURFX1NUUklORyAiJHtfSU5DTFVERV9TVFJJTkd9I2luY2x1ZGUgPCR7X0hFQURFUn0+XG4iKQogICAgZW5kZm9yZWFjaCgpCgogICAgc2V0KF9TUkNfU1RSSU5HCiAgICAgICIKICAgICAgJHtfSU5DTFVERV9TVFJJTkd9CiAgICAgIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpCiAgICAgIHsKICAgICAgICBCZXJWYWx1ZSAqYnZwID0gTlVMTDsKICAgICAgICBCZXJFbGVtZW50ICpiZXAgPSBiZXJfaW5pdChidnApOwogICAgICAgIGJlcl9mcmVlKGJlcCwgMSk7CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0iCiAgICApCiAgICBzZXQoQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgIi1ETERBUF9ERVBSRUNBVEVEPTEiICItRFdJTjMyX0xFQU5fQU5EX01FQU4iKQogICAgc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAke0NNQUtFX0xEQVBfTElCfSkKICAgIGlmKEhBVkVfTElCTEJFUikKICAgICAgbGlzdChBUFBFTkQgQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTICR7Q01BS0VfTEJFUl9MSUJ9KQogICAgZW5kaWYoKQogICAgY2hlY2tfY19zb3VyY2VfY29tcGlsZXMoIiR7X1NSQ19TVFJJTkd9IiBOT1RfTkVFRF9MQkVSX0gpCgogICAgaWYoTk9UX05FRURfTEJFUl9IKQogICAgICBzZXQoTkVFRF9MQkVSX0ggT0ZGKQogICAgZWxzZSgpCiAgICAgIHNldChDVVJMX1RFU1RfREVGSU5FUyAiJHtDVVJMX1RFU1RfREVGSU5FU30gLURORUVEX0xCRVJfSCIpCiAgICBlbmRpZigpCiAgZW5kaWYoKQoKZW5kaWYoKQoKIyBObyBsZGFwLCBubyBsZGFwcy4KaWYoQ1VSTF9ESVNBQkxFX0xEQVApCiAgaWYoTk9UIENVUkxfRElTQUJMRV9MREFQUykKICAgIG1lc3NhZ2UoU1RBVFVTICJMREFQIG5lZWRzIHRvIGJlIGVuYWJsZWQgdG8gc3VwcG9ydCBMREFQUyIpCiAgICBzZXQoQ1VSTF9ESVNBQkxFX0xEQVBTIE9OIENBQ0hFIEJPT0wgIiIgRk9SQ0UpCiAgZW5kaWYoKQplbmRpZigpCgppZihOT1QgQ1VSTF9ESVNBQkxFX0xEQVBTKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImxkYXBfc3NsLmgiIEhBVkVfTERBUF9TU0xfSCkKICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJsZGFwc3NsLmgiICBIQVZFX0xEQVBTU0xfSCkKZW5kaWYoKQoKIyBDaGVjayBmb3IgaWRuCmNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgiaWRuIiBpZG5hX3RvX2FzY2lpX2x6IEhBVkVfTElCSUROKQoKIyBDaGVjayBmb3Igc3ltYm9sIGRsb3BlbiAoc2FtZSBhcyBIQVZFX0xJQkRMKQpjaGVja19saWJyYXJ5X2V4aXN0cygiJHtDVVJMX0xJQlN9IiBkbG9wZW4gIiIgSEFWRV9ETE9QRU4pCgojIEZvciBvdGhlciB0ZXN0cyB0byB1c2UgdGhlIHNhbWUgbGlicmFyaWVzCnNldChDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgJHtDVVJMX0xJQlN9KQoKb3B0aW9uKENVUkxfWkxJQiAiU2V0IHRvIE9OIHRvIGVuYWJsZSBidWlsZGluZyBjVVJMIHdpdGggemxpYiBzdXBwb3J0LiIgT04pCnNldChIQVZFX0xJQlogT0ZGKQpzZXQoSEFWRV9aTElCX0ggT0ZGKQpzZXQoSEFWRV9aTElCIE9GRikKaWYoQ1VSTF9aTElCKQogIGZpbmRfcGFja2FnZShaTElCIFFVSUVUKQogIGlmKFpMSUJfRk9VTkQpCiAgICBzZXQoSEFWRV9aTElCX0ggT04pCiAgICBzZXQoSEFWRV9aTElCIE9OKQogICAgc2V0KEhBVkVfTElCWiBPTikKICAgIGxpc3QoQVBQRU5EIENVUkxfTElCUyAke1pMSUJfTElCUkFSSUVTfSkKICBlbmRpZigpCmVuZGlmKCkKCm9wdGlvbihDTUFLRV9VU0VfT1BFTlNTTCAiVXNlIE9wZW5TU0wgY29kZS4gRXhwZXJpbWVudGFsIiBPTikKbWFya19hc19hZHZhbmNlZChDTUFLRV9VU0VfT1BFTlNTTCkKCnNldChVU0VfU1NMRUFZIE9GRikKc2V0KFVTRV9PUEVOU1NMIE9GRikKc2V0KEhBVkVfTElCQ1JZUFRPIE9GRikKc2V0KEhBVkVfTElCU1NMIE9GRikKCmlmKENNQUtFX1VTRV9PUEVOU1NMKQogIGZpbmRfcGFja2FnZShPcGVuU1NMKQogIGlmKE9QRU5TU0xfRk9VTkQpCiAgICBsaXN0KEFQUEVORCBDVVJMX0xJQlMgJHtPUEVOU1NMX0xJQlJBUklFU30pCiAgICBzZXQoVVNFX1NTTEVBWSBPTikKICAgIHNldChVU0VfT1BFTlNTTCBPTikKICAgIHNldChIQVZFX0xJQkNSWVBUTyBPTikKICAgIHNldChIQVZFX0xJQlNTTCBPTikKICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtPUEVOU1NMX0lOQ0xVREVfRElSfSkKICAgIHNldChDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyAke09QRU5TU0xfSU5DTFVERV9ESVJ9KQogICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgib3BlbnNzbC9jcnlwdG8uaCIgSEFWRV9PUEVOU1NMX0NSWVBUT19IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgib3BlbnNzbC9lbmdpbmUuaCIgSEFWRV9PUEVOU1NMX0VOR0lORV9IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgib3BlbnNzbC9lcnIuaCIgICAgSEFWRV9PUEVOU1NMX0VSUl9IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgib3BlbnNzbC9wZW0uaCIgICAgSEFWRV9PUEVOU1NMX1BFTV9IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgib3BlbnNzbC9wa2NzMTIuaCIgSEFWRV9PUEVOU1NMX1BLQ1MxMl9IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgib3BlbnNzbC9yc2EuaCIgICAgSEFWRV9PUEVOU1NMX1JTQV9IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgib3BlbnNzbC9zc2wuaCIgICAgSEFWRV9PUEVOU1NMX1NTTF9IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgib3BlbnNzbC94NTA5LmgiICAgSEFWRV9PUEVOU1NMX1g1MDlfSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm9wZW5zc2wvcmFuZC5oIiAgIEhBVkVfT1BFTlNTTF9SQU5EX0gpCiAgZW5kaWYoT1BFTlNTTF9GT1VORCkKZW5kaWYoQ01BS0VfVVNFX09QRU5TU0wpCgojbGliU1NIMgpvcHRpb24oQ01BS0VfVVNFX0xJQlNTSDIgIlVzZSBsaWJTU0gyIiBPTikKbWFya19hc19hZHZhbmNlZChDTUFLRV9VU0VfTElCU1NIMikKc2V0KFVTRV9MSUJTU0gyIE9GRikKc2V0KEhBVkVfTElCU1NIMiBPRkYpCnNldChIQVZFX0xJQlNTSDJfSCBPRkYpCgppZihDTUFLRV9VU0VfTElCU1NIMikKICBmaW5kX3BhY2thZ2UoTGliU1NIMikKICBpZihMSUJTU0gyX0ZPVU5EKQogICAgbGlzdChBUFBFTkQgQ1VSTF9MSUJTICR7TElCU1NIMl9MSUJSQVJZfSkKICAgIHNldChDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgJHtMSUJTU0gyX0xJQlJBUll9KQogICAgc2V0KENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICIke0xJQlNTSDJfSU5DTFVERV9ESVJ9IikKICAgIHNldChIQVZFX0xJQlNTSDIgT04pCiAgICBzZXQoVVNFX0xJQlNTSDIgT04pCgogICAgIyBmaW5kX3BhY2thZ2UgaGFzIGFscmVhZHkgZm91bmQgdGhlIGhlYWRlcnMKICAgIHNldChIQVZFX0xJQlNTSDJfSCBPTikKICAgIHNldChDVVJMX0lOQ0xVREVTICR7Q1VSTF9JTkNMVURFU30gIiR7TElCU1NIMl9JTkNMVURFX0RJUn0vbGlic3NoMi5oIikKICAgIHNldChDVVJMX1RFU1RfREVGSU5FUyAiJHtDVVJMX1RFU1RfREVGSU5FU30gLURIQVZFX0xJQlNTSDJfSCIpCgogICAgIyBub3cgY2hlY2sgZm9yIHNwZWNpZmljIGxpYnNzaDIgc3ltYm9scyBhcyB0aGV5IHdlcmUgYWRkZWQgaW4gZGlmZmVyZW50IHZlcnNpb25zCiAgICBzZXQoQ01BS0VfRVhUUkFfSU5DTFVERV9GSUxFUyAibGlic3NoMi5oIikKICAgIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhsaWJzc2gyX3ZlcnNpb24gICAgICAgICAgIEhBVkVfTElCU1NIMl9WRVJTSU9OKQogICAgY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGxpYnNzaDJfaW5pdCAgICAgICAgICAgICAgSEFWRV9MSUJTU0gyX0lOSVQpCiAgICBjaGVja19mdW5jdGlvbl9leGlzdHMobGlic3NoMl9leGl0ICAgICAgICAgICAgICBIQVZFX0xJQlNTSDJfRVhJVCkKICAgIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhsaWJzc2gyX3NjcF9zZW5kNjQgICAgICAgIEhBVkVfTElCU1NIMl9TQ1BfU0VORDY0KQogICAgY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGxpYnNzaDJfc2Vzc2lvbl9oYW5kc2hha2UgSEFWRV9MSUJTU0gyX1NFU1NJT05fSEFORFNIQUtFKQogICAgc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMgIiIpCgogIGVuZGlmKExJQlNTSDJfRk9VTkQpCmVuZGlmKENNQUtFX1VTRV9MSUJTU0gyKQoKIyBJZiB3ZSBoYXZlIGZlYXR1cmVzLmgsIHRoZW4gZG8gdGhlIF9CU0RfU09VUkNFIG1hZ2ljCmNoZWNrX2luY2x1ZGVfZmlsZSgiZmVhdHVyZXMuaCIgICAgICAgSEFWRV9GRUFUVVJFU19IKQoKIyBDaGVjayBmb3IgaGVhZGVyIGZpbGVzCmlmKE5PVCBVTklYKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIndzMnRjcGlwLmgiICAgICBIQVZFX1dTMlRDUElQX0gpCiAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgid2luc29jazIuaCIgICAgIEhBVkVfV0lOU09DSzJfSCkKZW5kaWYoTk9UIFVOSVgpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGlvLmgiICAgICAgICAgIEhBVkVfU1RESU9fSCkKaWYoTk9UIFVOSVgpCiAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgid2luZG93cy5oIiAgICAgIEhBVkVfV0lORE9XU19IKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIndpbnNvY2suaCIgICAgICBIQVZFX1dJTlNPQ0tfSCkKZW5kaWYoTk9UIFVOSVgpCgpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJpbnR0eXBlcy5oIiAgICAgICBIQVZFX0lOVFRZUEVTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9maWxpby5oIiAgICAgIEhBVkVfU1lTX0ZJTElPX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9pb2N0bC5oIiAgICAgIEhBVkVfU1lTX0lPQ1RMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9wYXJhbS5oIiAgICAgIEhBVkVfU1lTX1BBUkFNX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9wb2xsLmgiICAgICAgIEhBVkVfU1lTX1BPTExfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3Jlc291cmNlLmgiICAgSEFWRV9TWVNfUkVTT1VSQ0VfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3NlbGVjdC5oIiAgICAgSEFWRV9TWVNfU0VMRUNUX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9zb2NrZXQuaCIgICAgIEhBVkVfU1lTX1NPQ0tFVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvc29ja2lvLmgiICAgICBIQVZFX1NZU19TT0NLSU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3N0YXQuaCIgICAgICAgSEFWRV9TWVNfU1RBVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdGltZS5oIiAgICAgICBIQVZFX1NZU19USU1FX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy90eXBlcy5oIiAgICAgIEhBVkVfU1lTX1RZUEVTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy91aW8uaCIgICAgICAgIEhBVkVfU1lTX1VJT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdW4uaCIgICAgICAgICBIQVZFX1NZU19VTl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdXRpbWUuaCIgICAgICBIQVZFX1NZU19VVElNRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJhbGxvY2EuaCIgICAgICAgICBIQVZFX0FMTE9DQV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJhcnBhL2luZXQuaCIgICAgICBIQVZFX0FSUEFfSU5FVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJhcnBhL3RmdHAuaCIgICAgICBIQVZFX0FSUEFfVEZUUF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJhc3NlcnQuaCIgICAgICAgICBIQVZFX0FTU0VSVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJjcnlwdG8uaCIgICAgICAgICBIQVZFX0NSWVBUT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJkZXMuaCIgICAgICAgICAgICBIQVZFX0RFU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJlcnIuaCIgICAgICAgICAgICBIQVZFX0VSUl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJlcnJuby5oIiAgICAgICAgICBIQVZFX0VSUk5PX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImZjbnRsLmgiICAgICAgICAgIEhBVkVfRkNOVExfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZ3NzYXBpL2dzc2FwaS5oIiAgSEFWRV9HU1NBUElfR1NTQVBJX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImdzc2FwaS9nc3NhcGlfZ2VuZXJpYy5oIiBIQVZFX0dTU0FQSV9HU1NBUElfR0VORVJJQ19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJnc3NhcGkvZ3NzYXBpX2tyYjUuaCIgSEFWRV9HU1NBUElfR1NTQVBJX0tSQjVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaWRuLWZyZWUuaCIgICAgICAgSEFWRV9JRE5fRlJFRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJpZmFkZHJzLmgiICAgICAgICBIQVZFX0lGQUREUlNfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaW8uaCIgICAgICAgICAgICAgSEFWRV9JT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJrcmIuaCIgICAgICAgICAgICBIQVZFX0tSQl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJsaWJnZW4uaCIgICAgICAgICBIQVZFX0xJQkdFTl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJsaW1pdHMuaCIgICAgICAgICBIQVZFX0xJTUlUU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJsb2NhbGUuaCIgICAgICAgICBIQVZFX0xPQ0FMRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJuZXQvaWYuaCIgICAgICAgICBIQVZFX05FVF9JRl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJuZXRkYi5oIiAgICAgICAgICBIQVZFX05FVERCX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm5ldGluZXQvaW4uaCIgICAgIEhBVkVfTkVUSU5FVF9JTl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJuZXRpbmV0L3RjcC5oIiAgICBIQVZFX05FVElORVRfVENQX0gpCgpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJwZW0uaCIgICAgICAgICAgICBIQVZFX1BFTV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJwb2xsLmgiICAgICAgICAgICBIQVZFX1BPTExfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgicHdkLmgiICAgICAgICAgICAgSEFWRV9QV0RfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgicnNhLmgiICAgICAgICAgICAgSEFWRV9SU0FfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic2V0am1wLmgiICAgICAgICAgSEFWRV9TRVRKTVBfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic2d0dHkuaCIgICAgICAgICAgSEFWRV9TR1RUWV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzaWduYWwuaCIgICAgICAgICBIQVZFX1NJR05BTF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzc2wuaCIgICAgICAgICAgICBIQVZFX1NTTF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRib29sLmgiICAgICAgICBIQVZFX1NUREJPT0xfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RkaW50LmgiICAgICAgICAgSEFWRV9TVERJTlRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RkaW8uaCIgICAgICAgICAgSEFWRV9TVERJT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRsaWIuaCIgICAgICAgICBIQVZFX1NURExJQl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdHJpbmcuaCIgICAgICAgICBIQVZFX1NUUklOR19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdHJpbmdzLmgiICAgICAgICBIQVZFX1NUUklOR1NfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3Ryb3B0cy5oIiAgICAgICAgSEFWRV9TVFJPUFRTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInRlcm1pby5oIiAgICAgICAgIEhBVkVfVEVSTUlPX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInRlcm1pb3MuaCIgICAgICAgIEhBVkVfVEVSTUlPU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ0aW1lLmgiICAgICAgICAgICBIQVZFX1RJTUVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgidGxkLmgiICAgICAgICAgICAgSEFWRV9UTERfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgidW5pc3RkLmgiICAgICAgICAgSEFWRV9VTklTVERfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgidXRpbWUuaCIgICAgICAgICAgSEFWRV9VVElNRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ4NTA5LmgiICAgICAgICAgICBIQVZFX1g1MDlfSCkKCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInByb2Nlc3MuaCIgICAgICAgIEhBVkVfUFJPQ0VTU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRkZWYuaCIgICAgICAgICBIQVZFX1NURERFRl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJkbGZjbi5oIiAgICAgICAgICBIQVZFX0RMRkNOX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm1hbGxvYy5oIiAgICAgICAgIEhBVkVfTUFMTE9DX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm1lbW9yeS5oIiAgICAgICAgIEhBVkVfTUVNT1JZX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm5ldGluZXQvaWZfZXRoZXIuaCIgSEFWRV9ORVRJTkVUX0lGX0VUSEVSX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGludC5oIiAgICAgICAgSEFWRV9TVERJTlRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic29ja2lvLmgiICAgICAgICBIQVZFX1NPQ0tJT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdXRzbmFtZS5oIiAgIEhBVkVfU1lTX1VUU05BTUVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaWRuYS5oIiAgICAgICAgICBIQVZFX0lETkFfSCkKCgoKY2hlY2tfdHlwZV9zaXplKHNpemVfdCAgU0laRU9GX1NJWkVfVCkKY2hlY2tfdHlwZV9zaXplKHNzaXplX3QgIFNJWkVPRl9TU0laRV9UKQpjaGVja190eXBlX3NpemUoImxvbmcgbG9uZyIgIFNJWkVPRl9MT05HX0xPTkcpCmNoZWNrX3R5cGVfc2l6ZSgibG9uZyIgIFNJWkVPRl9MT05HKQpjaGVja190eXBlX3NpemUoInNob3J0IiAgU0laRU9GX1NIT1JUKQpjaGVja190eXBlX3NpemUoImludCIgIFNJWkVPRl9JTlQpCmNoZWNrX3R5cGVfc2l6ZSgiX19pbnQ2NCIgIFNJWkVPRl9fX0lOVDY0KQpjaGVja190eXBlX3NpemUoImxvbmcgZG91YmxlIiAgU0laRU9GX0xPTkdfRE9VQkxFKQpjaGVja190eXBlX3NpemUoInRpbWVfdCIgIFNJWkVPRl9USU1FX1QpCmlmKE5PVCBIQVZFX1NJWkVPRl9TU0laRV9UKQogIGlmKFNJWkVPRl9MT05HIEVRVUFMIFNJWkVPRl9TSVpFX1QpCiAgICBzZXQoc3NpemVfdCBsb25nKQogIGVuZGlmKFNJWkVPRl9MT05HIEVRVUFMIFNJWkVPRl9TSVpFX1QpCiAgaWYoTk9UIHNzaXplX3QgQU5EIFNJWkVPRl9fX0lOVDY0IEVRVUFMIFNJWkVPRl9TSVpFX1QpCiAgICBzZXQoc3NpemVfdCBfX2ludDY0KQogIGVuZGlmKE5PVCBzc2l6ZV90IEFORCBTSVpFT0ZfX19JTlQ2NCBFUVVBTCBTSVpFT0ZfU0laRV9UKQplbmRpZihOT1QgSEFWRV9TSVpFT0ZfU1NJWkVfVCkKCiMgRGlmZmVyZW50IHNpemVvZnMsIGV0Yy4KCiMgICAgZGVmaW5lIENVUkxfU0laRU9GX0xPTkcgICAgICAgIDQKIyAgICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAgbG9uZyBsb25nCiMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICJsbGQiCiMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICJsbHUiCiMgICAgZGVmaW5lIENVUkxfRk9STUFUX09GRl9UICAgICAgICIlbGxkIgojICAgIGRlZmluZSBDVVJMX1NJWkVPRl9DVVJMX09GRl9UICA4CiMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgIExMCiMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVIFVMTAoKc2V0KENVUkxfU0laRU9GX0xPTkcgJHtTSVpFT0ZfTE9OR30pCgppZihTSVpFT0ZfTE9ORyBFUVVBTCA4KQogIHNldChDVVJMX1RZUEVPRl9DVVJMX09GRl9UIGxvbmcpCiAgc2V0KENVUkxfU0laRU9GX0NVUkxfT0ZGX1QgOCkKICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAibGQiKQogIHNldChDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAibHUiKQogIHNldChDVVJMX0ZPUk1BVF9PRkZfVCAiJWxkIikKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCBMKQogIHNldChDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSBVTCkKZW5kaWYoU0laRU9GX0xPTkcgRVFVQUwgOCkKCmlmKFNJWkVPRl9MT05HX0xPTkcgRVFVQUwgOCkKICBzZXQoQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAibG9uZyBsb25nIikKICBzZXQoQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCA4KQogIHNldChDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICJsbGQiKQogIHNldChDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAibGx1IikKICBzZXQoQ1VSTF9GT1JNQVRfT0ZGX1QgIiVsbGQiKQogIHNldChDVVJMX1NVRkZJWF9DVVJMX09GRl9UIExMKQogIHNldChDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSBVTEwpCmVuZGlmKFNJWkVPRl9MT05HX0xPTkcgRVFVQUwgOCkKCmlmKE5PVCBDVVJMX1RZUEVPRl9DVVJMX09GRl9UKQogIHNldChDVVJMX1RZUEVPRl9DVVJMX09GRl9UICR7c3NpemVfdH0pCiAgc2V0KENVUkxfU0laRU9GX0NVUkxfT0ZGX1QgJHtTSVpFT0ZfU1NJWkVfVH0pCiAgIyBUT0RPOiBuZWVkIGFkanVzdG1lbnQgaGVyZS4KICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAibGQiKQogIHNldChDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAibHUiKQogIHNldChDVVJMX0ZPUk1BVF9PRkZfVCAiJWxkIikKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCBMKQogIHNldChDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSBMVSkKZW5kaWYoTk9UIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QpCgppZihIQVZFX1NJWkVPRl9MT05HX0xPTkcpCiAgc2V0KEhBVkVfTE9OR0xPTkcgMSkKICBzZXQoSEFWRV9MTCAxKQplbmRpZihIQVZFX1NJWkVPRl9MT05HX0xPTkcpCgpmaW5kX2ZpbGUoUkFORE9NX0ZJTEUgdXJhbmRvbSAvZGV2KQptYXJrX2FzX2FkdmFuY2VkKFJBTkRPTV9GSUxFKQoKIyBDaGVjayBmb3Igc29tZSBmdW5jdGlvbnMgdGhhdCBhcmUgdXNlZApjaGVja19zeW1ib2xfZXhpc3RzKGJhc2VuYW1lICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfQkFTRU5BTUUpCmNoZWNrX3N5bWJvbF9leGlzdHMoc29ja2V0ICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TT0NLRVQpCmNoZWNrX3N5bWJvbF9leGlzdHMocG9sbCAgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9QT0xMKQpjaGVja19zeW1ib2xfZXhpc3RzKHNlbGVjdCAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0VMRUNUKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cmR1cCAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSRFVQKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cnN0ciAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSU1RSKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cnRva19yICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSVE9LX1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RyZnRpbWUgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJGVElNRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyh1bmFtZSAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1VOQU1FKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cmNhc2VjbXAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSQ0FTRUNNUCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJpY21wICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUklDTVApCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RyY21waSAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJDTVBJKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cm5jbXBpICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSTkNNUEkpCmNoZWNrX3N5bWJvbF9leGlzdHMoYWxhcm0gICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9BTEFSTSkKaWYoTk9UIEhBVkVfU1RSTkNNUEkpCiAgc2V0KEhBVkVfU1RSQ01QSSkKZW5kaWYoTk9UIEhBVkVfU1RSTkNNUEkpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0aG9zdGJ5YWRkciAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRIT1NUQllBRERSKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldGhvc3RieWFkZHJfciAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRIT1NUQllBRERSX1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0dGltZW9mZGF5ICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRUSU1FT0ZEQVkpCmNoZWNrX3N5bWJvbF9leGlzdHMoaW5ldF9hZGRyICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9JTkVUX0FERFIpCmNoZWNrX3N5bWJvbF9leGlzdHMoaW5ldF9udG9hICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9JTkVUX05UT0EpCmNoZWNrX3N5bWJvbF9leGlzdHMoaW5ldF9udG9hX3IgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9JTkVUX05UT0FfUikKY2hlY2tfc3ltYm9sX2V4aXN0cyh0Y3NldGF0dHIgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1RDU0VUQVRUUikKY2hlY2tfc3ltYm9sX2V4aXN0cyh0Y2dldGF0dHIgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1RDR0VUQVRUUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhwZXJyb3IgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1BFUlJPUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhjbG9zZXNvY2tldCAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0NMT1NFU09DS0VUKQpjaGVja19zeW1ib2xfZXhpc3RzKHNldHZidWYgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0VUVkJVRikKY2hlY2tfc3ltYm9sX2V4aXN0cyhzaWdzZXRqbXAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NJR1NFVEpNUCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRwYXNzX3IgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVFBBU1NfUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJsY2F0ICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUkxDQVQpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0cHd1aWQgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRQV1VJRCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRldWlkICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVEVVSUQpCmNoZWNrX3N5bWJvbF9leGlzdHModXRpbWUgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9VVElNRSkKaWYoQ01BS0VfVVNFX09QRU5TU0wpCiAgY2hlY2tfc3ltYm9sX2V4aXN0cyhSQU5EX3N0YXR1cyAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1JBTkRfU1RBVFVTKQogIGNoZWNrX3N5bWJvbF9leGlzdHMoUkFORF9zY3JlZW4gICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9SQU5EX1NDUkVFTikKICBjaGVja19zeW1ib2xfZXhpc3RzKFJBTkRfZWdkICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUkFORF9FR0QpCiAgY2hlY2tfc3ltYm9sX2V4aXN0cyhDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSAiJHtDVVJMX0lOQ0xVREVTfSIKICAgIEhBVkVfQ1JZUFRPX0NMRUFOVVBfQUxMX0VYX0RBVEEpCiAgaWYoSEFWRV9MSUJDUllQVE8gQU5EIEhBVkVfTElCU1NMKQogICAgc2V0KFVTRV9PUEVOU1NMIDEpCiAgICBzZXQoVVNFX1NTTEVBWSAxKQogIGVuZGlmKEhBVkVfTElCQ1JZUFRPIEFORCBIQVZFX0xJQlNTTCkKZW5kaWYoQ01BS0VfVVNFX09QRU5TU0wpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ210aW1lX3IgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HTVRJTUVfUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhsb2NhbHRpbWVfciAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0xPQ0FMVElNRV9SKQoKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRob3N0YnluYW1lICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUSE9TVEJZTkFNRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRob3N0YnluYW1lX3IgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUSE9TVEJZTkFNRV9SKQoKY2hlY2tfc3ltYm9sX2V4aXN0cyhzaWduYWwgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NJR05BTF9GVU5DKQpjaGVja19zeW1ib2xfZXhpc3RzKFNJR0FMUk0gICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0lHTkFMX01BQ1JPKQppZihIQVZFX1NJR05BTF9GVU5DIEFORCBIQVZFX1NJR05BTF9NQUNSTykKICBzZXQoSEFWRV9TSUdOQUwgMSkKZW5kaWYoSEFWRV9TSUdOQUxfRlVOQyBBTkQgSEFWRV9TSUdOQUxfTUFDUk8pCmNoZWNrX3N5bWJvbF9leGlzdHModW5hbWUgICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfVU5BTUUpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RydG9sbCAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSVE9MTCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhfc3RydG9pNjQgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9fU1RSVE9JNjQpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RyZXJyb3JfciAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSRVJST1JfUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhzaWdpbnRlcnJ1cHQgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TSUdJTlRFUlJVUFQpCmNoZWNrX3N5bWJvbF9leGlzdHMocGVycm9yICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUEVSUk9SKQpjaGVja19zeW1ib2xfZXhpc3RzKGZvcmsgICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0ZPUkspCmNoZWNrX3N5bWJvbF9leGlzdHMoZnJlZWFkZHJpbmZvICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfRlJFRUFERFJJTkZPKQpjaGVja19zeW1ib2xfZXhpc3RzKGZyZWVpZmFkZHJzICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0ZSRUVJRkFERFJTKQpjaGVja19zeW1ib2xfZXhpc3RzKHBpcGUgICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1BJUEUpCmNoZWNrX3N5bWJvbF9leGlzdHMoZnRydW5jYXRlICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfRlRSVU5DQVRFKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldHByb3RvYnluYW1lICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVFBST1RPQllOQU1FKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldHJsaW1pdCAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVFJMSU1JVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhpZG5fZnJlZSAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9JRE5fRlJFRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhpZG5hX3N0cmVycm9yICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9JRE5BX1NUUkVSUk9SKQpjaGVja19zeW1ib2xfZXhpc3RzKHRsZF9zdHJlcnJvciAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1RMRF9TVFJFUlJPUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhzZXRsb2NhbGUgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TRVRMT0NBTEUpCmNoZWNrX3N5bWJvbF9leGlzdHMoc2V0cmxpbWl0ICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0VUUkxJTUlUKQpjaGVja19zeW1ib2xfZXhpc3RzKGZjbnRsICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0ZDTlRMKQpjaGVja19zeW1ib2xfZXhpc3RzKGlvY3RsICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0lPQ1RMKQpjaGVja19zeW1ib2xfZXhpc3RzKHNldHNvY2tvcHQgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NFVFNPQ0tPUFQpCgojIHN5bWJvbCBleGlzdHMgaW4gd2luMzIsIGJ1dCBmdW5jdGlvbiBkb2VzIG5vdC4KY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGluZXRfcHRvbiBIQVZFX0lORVRfUFRPTikKCiMgc2lnYWN0aW9uIGFuZCBzaWdzZXRqbXAgYXJlIHNwZWNpYWwuIFVzZSBzcGVjaWFsIG1lY2hhbmlzbSBmb3IKIyBkZXRlY3RpbmcgdGhvc2UsIGJ1dCBvbmx5IGlmIHByZXZpb3VzIGF0dGVtcHQgZmFpbGVkLgppZihIQVZFX1NJR05BTF9IKQogIGNoZWNrX3N5bWJvbF9leGlzdHMoc2lnYWN0aW9uICJzaWduYWwuaCIgSEFWRV9TSUdBQ1RJT04pCmVuZGlmKEhBVkVfU0lHTkFMX0gpCgppZihOT1QgSEFWRV9TSUdTRVRKTVApCiAgaWYoSEFWRV9TRVRKTVBfSCkKICAgIGNoZWNrX3N5bWJvbF9leGlzdHMoc2lnc2V0am1wICJzZXRqbXAuaCIgSEFWRV9NQUNST19TSUdTRVRKTVApCiAgICBpZihIQVZFX01BQ1JPX1NJR1NFVEpNUCkKICAgICAgc2V0KEhBVkVfU0lHU0VUSk1QIDEpCiAgICBlbmRpZihIQVZFX01BQ1JPX1NJR1NFVEpNUCkKICBlbmRpZihIQVZFX1NFVEpNUF9IKQplbmRpZihOT1QgSEFWRV9TSUdTRVRKTVApCgojIElmIHRoZXJlIGlzIG5vIHN0cmljbXAoKSwgZG8gbm90IGFsbG93IExEQVAgdG8gcGFyc2UgVVJMcwppZihOT1QgSEFWRV9TVFJJQ01QKQogIHNldChIQVZFX0xEQVBfVVJMX1BBUlNFIDEpCmVuZGlmKE5PVCBIQVZFX1NUUklDTVApCgoKCiMgRG8gY3VybCBzcGVjaWZpYyB0ZXN0cwppZihIQVZFX0xJQldTMl8zMikKICBzZXQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTIHdzMl8zMikKZW5kaWYoKQpmb3JlYWNoKENVUkxfVEVTVAogICAgSEFWRV9GQ05UTF9PX05PTkJMT0NLCiAgICBIQVZFX0lPQ1RMU09DS0VUCiAgICBIQVZFX0lPQ1RMU09DS0VUX0NBTUVMCiAgICBIQVZFX0lPQ1RMU09DS0VUX0NBTUVMX0ZJT05CSU8KICAgIEhBVkVfSU9DVExTT0NLRVRfRklPTkJJTwogICAgSEFWRV9JT0NUTF9GSU9OQklPCiAgICBIQVZFX0lPQ1RMX1NJT0NHSUZBRERSCiAgICBIQVZFX1NFVFNPQ0tPUFRfU09fTk9OQkxPQ0sKICAgIEhBVkVfU09DS0FERFJfSU42X1NJTjZfU0NPUEVfSUQKICAgIFRJTUVfV0lUSF9TWVNfVElNRQogICAgSEFWRV9PX05PTkJMT0NLCiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl81CiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl83CiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl84CiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl81X1JFRU5UUkFOVAogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfN19SRUVOVFJBTlQKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzhfUkVFTlRSQU5UCiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl8zCiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl81CiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl82CiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl8zX1JFRU5UUkFOVAogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNV9SRUVOVFJBTlQKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzZfUkVFTlRSQU5UCiAgICBIQVZFX1NPQ0tMRU5fVAogICAgSEFWRV9JTl9BRERSX1QKICAgIEhBVkVfQk9PTF9UCiAgICBTVERDX0hFQURFUlMKICAgIFJFVFNJR1RZUEVfVEVTVAogICAgSEFWRV9JTkVUX05UT0FfUl9ERUNMCiAgICBIQVZFX0lORVRfTlRPQV9SX0RFQ0xfUkVFTlRSQU5UCiAgICBIQVZFX0dFVEFERFJJTkZPCiAgICBIQVZFX0ZJTEVfT0ZGU0VUX0JJVFMKICAgICkKICBjdXJsX2ludGVybmFsX3Rlc3QoJHtDVVJMX1RFU1R9KQplbmRmb3JlYWNoKENVUkxfVEVTVCkKaWYoSEFWRV9GSUxFX09GRlNFVF9CSVRTKQogIHNldChfRklMRV9PRkZTRVRfQklUUyA2NCkKZW5kaWYoSEFWRV9GSUxFX09GRlNFVF9CSVRTKQpmb3JlYWNoKENVUkxfVEVTVAogICAgSEFWRV9HTElCQ19TVFJFUlJPUl9SCiAgICBIQVZFX1BPU0lYX1NUUkVSUk9SX1IKICAgICkKICBjdXJsX2ludGVybmFsX3Rlc3RfcnVuKCR7Q1VSTF9URVNUfSkKZW5kZm9yZWFjaChDVVJMX1RFU1QpCgojIENoZWNrIGZvciByZWVudHJhbnQKZm9yZWFjaChDVVJMX1RFU1QKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzUKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzcKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzgKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzMKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzUKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzYKICAgIEhBVkVfSU5FVF9OVE9BX1JfREVDTF9SRUVOVFJBTlQpCiAgaWYoTk9UICR7Q1VSTF9URVNUfSkKICAgIGlmKCR7Q1VSTF9URVNUfV9SRUVOVFJBTlQpCiAgICAgIHNldChORUVEX1JFRU5UUkFOVCAxKQogICAgZW5kaWYoJHtDVVJMX1RFU1R9X1JFRU5UUkFOVCkKICBlbmRpZihOT1QgJHtDVVJMX1RFU1R9KQplbmRmb3JlYWNoKENVUkxfVEVTVCkKCmlmKE5FRURfUkVFTlRSQU5UKQogIGZvcmVhY2goQ1VSTF9URVNUCiAgICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzUKICAgICAgSEFWRV9HRVRIT1NUQllBRERSX1JfNwogICAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl84CiAgICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzMKICAgICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNQogICAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl82KQogICAgc2V0KCR7Q1VSTF9URVNUfSAwKQogICAgaWYoJHtDVVJMX1RFU1R9X1JFRU5UUkFOVCkKICAgICAgc2V0KCR7Q1VSTF9URVNUfSAxKQogICAgZW5kaWYoJHtDVVJMX1RFU1R9X1JFRU5UUkFOVCkKICBlbmRmb3JlYWNoKENVUkxfVEVTVCkKZW5kaWYoTkVFRF9SRUVOVFJBTlQpCgppZihIQVZFX0lORVRfTlRPQV9SX0RFQ0xfUkVFTlRSQU5UKQogIHNldChIQVZFX0lORVRfTlRPQV9SX0RFQ0wgMSkKICBzZXQoTkVFRF9SRUVOVFJBTlQgMSkKZW5kaWYoSEFWRV9JTkVUX05UT0FfUl9ERUNMX1JFRU5UUkFOVCkKCiMgU29tZSBvdGhlciBtaW5vciB0ZXN0cwoKaWYoTk9UIEhBVkVfSU5fQUREUl9UKQogIHNldChpbl9hZGRyX3QgInVuc2lnbmVkIGxvbmciKQplbmRpZihOT1QgSEFWRV9JTl9BRERSX1QpCgojIEZpeCBsaWJ6IC8gemxpYi5oCgppZihOT1QgQ1VSTF9TUEVDSUFMX0xJQlopCiAgaWYoTk9UIEhBVkVfTElCWikKICAgIHNldChIQVZFX1pMSUJfSCAwKQogIGVuZGlmKE5PVCBIQVZFX0xJQlopCgogIGlmKE5PVCBIQVZFX1pMSUJfSCkKICAgIHNldChIQVZFX0xJQlogMCkKICBlbmRpZihOT1QgSEFWRV9aTElCX0gpCmVuZGlmKE5PVCBDVVJMX1NQRUNJQUxfTElCWikKCmlmKF9GSUxFX09GRlNFVF9CSVRTKQogIHNldChfRklMRV9PRkZTRVRfQklUUyA2NCkKZW5kaWYoX0ZJTEVfT0ZGU0VUX0JJVFMpCnNldChDTUFLRV9SRVFVSVJFRF9GTEFHUyAiLURfRklMRV9PRkZTRVRfQklUUz02NCIpCnNldChDTUFLRV9FWFRSQV9JTkNMVURFX0ZJTEVTICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY3VybC9jdXJsLmgiKQpjaGVja190eXBlX3NpemUoImN1cmxfb2ZmX3QiIFNJWkVPRl9DVVJMX09GRl9UKQpzZXQoQ01BS0VfRVhUUkFfSU5DTFVERV9GSUxFUykKc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTKQoKCiMgQ2hlY2sgZm9yIG5vbmJsb2NraW5nCnNldChIQVZFX0RJU0FCTEVEX05PTkJMT0NLSU5HIDEpCmlmKEhBVkVfRklPTkJJTyBPUgogICAgSEFWRV9JT0NUTFNPQ0tFVCBPUgogICAgSEFWRV9JT0NUTFNPQ0tFVF9DQVNFIE9SCiAgICBIQVZFX09fTk9OQkxPQ0spCiAgc2V0KEhBVkVfRElTQUJMRURfTk9OQkxPQ0tJTkcpCmVuZGlmKEhBVkVfRklPTkJJTyBPUgogIEhBVkVfSU9DVExTT0NLRVQgT1IKICBIQVZFX0lPQ1RMU09DS0VUX0NBU0UgT1IKICBIQVZFX09fTk9OQkxPQ0spCgppZihSRVRTSUdUWVBFX1RFU1QpCiAgc2V0KFJFVFNJR1RZUEUgdm9pZCkKZWxzZShSRVRTSUdUWVBFX1RFU1QpCiAgc2V0KFJFVFNJR1RZUEUgaW50KQplbmRpZihSRVRTSUdUWVBFX1RFU1QpCgppZihDTUFLRV9DT01QSUxFUl9JU19HTlVDQyBBTkQgQVBQTEUpCiAgaW5jbHVkZShDaGVja0NDb21waWxlckZsYWcpCiAgY2hlY2tfY19jb21waWxlcl9mbGFnKC1Xbm8tbG9uZy1kb3VibGUgSEFWRV9DX0ZMQUdfV25vX2xvbmdfZG91YmxlKQogIGlmKEhBVkVfQ19GTEFHX1dub19sb25nX2RvdWJsZSkKICAgICMgVGhlIE1hYyB2ZXJzaW9uIG9mIEdDQyB3YXJucyBhYm91dCB1c2Ugb2YgbG9uZyBkb3VibGUuICBEaXNhYmxlIGl0LgogICAgZ2V0X3NvdXJjZV9maWxlX3Byb3BlcnR5KE1QUklOVEZfQ09NUElMRV9GTEFHUyBtcHJpbnRmLmMgQ09NUElMRV9GTEFHUykKICAgIGlmKE1QUklOVEZfQ09NUElMRV9GTEFHUykKICAgICAgc2V0KE1QUklOVEZfQ09NUElMRV9GTEFHUyAiJHtNUFJJTlRGX0NPTVBJTEVfRkxBR1N9IC1Xbm8tbG9uZy1kb3VibGUiKQogICAgZWxzZShNUFJJTlRGX0NPTVBJTEVfRkxBR1MpCiAgICAgIHNldChNUFJJTlRGX0NPTVBJTEVfRkxBR1MgIi1Xbm8tbG9uZy1kb3VibGUiKQogICAgZW5kaWYoTVBSSU5URl9DT01QSUxFX0ZMQUdTKQogICAgc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKG1wcmludGYuYyBQUk9QRVJUSUVTCiAgICAgIENPTVBJTEVfRkxBR1MgJHtNUFJJTlRGX0NPTVBJTEVfRkxBR1N9KQogIGVuZGlmKEhBVkVfQ19GTEFHX1dub19sb25nX2RvdWJsZSkKZW5kaWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ0MgQU5EIEFQUExFKQoKaWYoSEFWRV9TT0NLTEVOX1QpCiAgc2V0KENVUkxfVFlQRU9GX0NVUkxfU09DS0xFTl9UICJzb2NrbGVuX3QiKQogIGlmKFdJTjMyKQogICAgc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMgIndpbnNvY2syLmg7d3MydGNwaXAuaCIpCiAgZWxzZWlmKEhBVkVfU1lTX1NPQ0tFVF9IKQogICAgc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMgInN5cy9zb2NrZXQuaCIpCiAgZW5kaWYoKQogIGNoZWNrX3R5cGVfc2l6ZSgic29ja2xlbl90IiBDVVJMX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCkKICBzZXQoQ01BS0VfRVhUUkFfSU5DTFVERV9GSUxFUykKICBpZihOT1QgSEFWRV9DVVJMX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCkKICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IKICAgICAiQ2hlY2sgZm9yIHNpemVvZiBzb2NrbGVuX3QgZmFpbGVkLCBzZWUgQ01ha2VGaWxlcy9DTWFrZXJyb3IubG9nIikKICBlbmRpZigpCmVsc2UoKQogIHNldChDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBpbnQpCiAgc2V0KENVUkxfU0laRU9GX0NVUkxfU09DS0xFTl9UICR7U0laRU9GX0lOVH0pCmVuZGlmKCkKCiMgVE9ETyB0ZXN0IHdoaWNoIG9mIHRoZXNlIGhlYWRlcnMgYXJlIHJlcXVpcmVkIGZvciB0aGUgdHlwZWRlZnMgdXNlZCBpbiBjdXJsYnVpbGQuaAppZihXSU4zMikKICBzZXQoQ1VSTF9QVUxMX1dTMlRDUElQX0ggJHtIQVZFX1dTMlRDUElQX0h9KQplbHNlKCkKICBzZXQoQ1VSTF9QVUxMX1NZU19UWVBFU19IICR7SEFWRV9TWVNfVFlQRVNfSH0pCiAgc2V0KENVUkxfUFVMTF9TWVNfU09DS0VUX0ggJHtIQVZFX1NZU19TT0NLRVRfSH0pCiAgc2V0KENVUkxfUFVMTF9TWVNfUE9MTF9IICR7SEFWRV9TWVNfUE9MTF9IfSkKZW5kaWYoKQpzZXQoQ1VSTF9QVUxMX1NURElOVF9IICR7SEFWRV9TVERJTlRfSH0pCnNldChDVVJMX1BVTExfSU5UVFlQRVNfSCAke0hBVkVfSU5UVFlQRVNfSH0pCgppbmNsdWRlKENNYWtlL090aGVyVGVzdHMuY21ha2UpCgphZGRfZGVmaW5pdGlvbnMoLURIQVZFX0NPTkZJR19IKQoKIyBGb3Igd2luZG93cywgZG8gbm90IGFsbG93IHRoZSBjb21waWxlciB0byB1c2UgZGVmYXVsdCB0YXJnZXQgKFZpc3RhKS4KaWYoV0lOMzIpCiAgYWRkX2RlZmluaXRpb25zKC1EX1dJTjMyX1dJTk5UPTB4MDUwMSkKZW5kaWYoV0lOMzIpCgppZihNU1ZDKQogIGFkZF9kZWZpbml0aW9ucygtRF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSAtRF9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEUpCmVuZGlmKE1TVkMpCgojIFNldHMgdXAgdGhlIGRlcGVuZGVuY2llcyAoemxpYiwgT3BlblNTTCwgZXRjLikgb2YgYSBjVVJMIHN1YnByb2plY3QgYWNjb3JkaW5nIHRvIG9wdGlvbnMuCiMgVE9ETyBUaGlzIGlzIGZhciB0byBiZSBjb21wbGV0ZSEKZnVuY3Rpb24oU0VUVVBfQ1VSTF9ERVBFTkRFTkNJRVMgVEFSR0VUX05BTUUpCiAgaWYoQ1VSTF9aTElCIEFORCBaTElCX0ZPVU5EKQogICAgaW5jbHVkZV9kaXJlY3Rvcmllcygke1pMSUJfSU5DTFVERV9ESVJ9KQogIGVuZGlmKCkKCiAgaWYoQ01BS0VfVVNFX09QRU5TU0wgQU5EIE9QRU5TU0xfRk9VTkQpCiAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7T1BFTlNTTF9JTkNMVURFX0RJUn0pCiAgZW5kaWYoKQoKICBpZihDTUFLRV9VU0VfTElCU1NIMiBBTkQgTElCU1NIMl9GT1VORCkKICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtMSUJTU0gyX0lOQ0xVREVfRElSfSkKICBlbmRpZigpCgogIHRhcmdldF9saW5rX2xpYnJhcmllcygke1RBUkdFVF9OQU1FfSAke0NVUkxfTElCU30pCmVuZGZ1bmN0aW9uKCkKCiMgVWdseSAoYnV0IGZ1bmN0aW9uYWwpIHdheSB0byBpbmNsdWRlICJNYWtlZmlsZS5pbmMiIGJ5IHRyYW5zZm9ybWluZyBpdCAoPSByZWdlbmVyYXRlIGl0KS4KZnVuY3Rpb24oVFJBTlNGT1JNX01BS0VGSUxFX0lOQyBJTlBVVF9GSUxFIE9VVFBVVF9GSUxFKQogIGZpbGUoUkVBRCAke0lOUFVUX0ZJTEV9IE1BS0VGSUxFX0lOQ19URVhUKQogIHN0cmluZyhSRVBMQUNFICIkKHRvcF9zcmNkaXIpIiAgICJcJHtDVVJMX1NPVVJDRV9ESVJ9IiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkKICBzdHJpbmcoUkVQTEFDRSAiJCh0b3BfYnVpbGRkaXIpIiAiXCR7Q1VSTF9CSU5BUllfRElSfSIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pCgogIHN0cmluZyhSRUdFWCBSRVBMQUNFICJcXFxcXG4iICKnIaciIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KQogIHN0cmluZyhSRUdFWCBSRVBMQUNFICIoW2EtekEtWl9dW2EtekEtWjAtOV9dKilbXHQgXSo9W1x0IF0qKFteXG5dKikiICJTRVQoXFwxIFxcMikiIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KQogIHN0cmluZyhSRVBMQUNFICKnIaciICJcbiIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pCgogIHN0cmluZyhSRUdFWCBSRVBMQUNFICJcXCRcXCgoW2EtekEtWl9dW2EtekEtWjAtOV9dKilcXCkiICJcJHtcXDF9IiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkgICAgIyBSZXBsYWNlICQoKSB3aXRoICR7fQogIHN0cmluZyhSRUdFWCBSRVBMQUNFICJAKFthLXpBLVpfXVthLXpBLVowLTlfXSopQCIgIlwke1xcMX0iIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KSAgICAjIFJlcGxhY2UgQEAgd2l0aCAke30sIGV2ZW4gaWYgdGhhdCBtYXkgbm90IGJlIHJlYWQgYnkgQ01ha2Ugc2NyaXB0cy4KICBmaWxlKFdSSVRFICR7T1VUUFVUX0ZJTEV9ICR7TUFLRUZJTEVfSU5DX1RFWFR9KQoKZW5kZnVuY3Rpb24oKQoKYWRkX3N1YmRpcmVjdG9yeShsaWIpCmlmKEJVSUxEX0NVUkxfRVhFKQogIGFkZF9zdWJkaXJlY3Rvcnkoc3JjKQplbmRpZigpCmlmKEJVSUxEX0NVUkxfVEVTVFMpCiAgYWRkX3N1YmRpcmVjdG9yeSh0ZXN0cykKZW5kaWYoKQoKIyBUaGlzIG5lZWRzIHRvIGJlIHJ1biB2ZXJ5IGxhc3Qgc28gb3RoZXIgcGFydHMgb2YgdGhlIHNjcmlwdHMgY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoaXMuCmlmKE5PVCBDVVJMX0NPTkZJR19IQVNfQkVFTl9SVU5fQkVGT1JFKQogIHNldChDVVJMX0NPTkZJR19IQVNfQkVFTl9SVU5fQkVGT1JFIDEgQ0FDSEUgSU5URVJOQUwgIkZsYWcgdG8gdHJhY2sgd2hldGhlciB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHJ1bm5pbmcgQ01ha2Ugb3IgaWYgQ01ha2UgaGFzIGJlZW4gY29uZmlndXJlZCBiZWZvcmUiKQplbmRpZigpCgojIEluc3RhbGxhdGlvbi4KIyBGaXJzdCwgaW5zdGFsbCBnZW5lcmF0ZWQgY3VybGJ1aWxkLmgKaW5zdGFsbChGSUxFUyAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2luY2x1ZGUvY3VybC9jdXJsYnVpbGQuaCIKICAgIERFU1RJTkFUSU9OIGluY2x1ZGUvY3VybCApCiMgTmV4dCwgaW5zdGFsbCBvdGhlciBoZWFkZXJzIGV4Y2x1ZGluZyBjdXJsYnVpbGQuaAppbnN0YWxsKERJUkVDVE9SWSAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2luY2x1ZGUvY3VybCIKICAgIERFU1RJTkFUSU9OIGluY2x1ZGUKICAgIEZJTEVTX01BVENISU5HIFBBVFRFUk4gIiouaCIKICAgIFBBVFRFUk4gImN1cmxidWlsZC5oIiBFWENMVURFKQoKCiMgV29ya2Fyb3VuZCBmb3IgTVNWUzEwIHRvIGF2b2lkIHRoZSBEaWFsb2cgSGVsbAojIEZJWE1FOiBUaGlzIGNvdWxkIGJlIHJlbW92ZWQgd2l0aCBmdXR1cmUgdmVyc2lvbiBvZiBDTWFrZS4KaWYoTVNWQ19WRVJTSU9OIEVRVUFMIDE2MDApCiAgc2V0KENVUkxfU0xOX0ZJTEVOQU1FICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vQ1VSTC5zbG4iKQogIGlmKEVYSVNUUyAiJHtDVVJMX1NMTl9GSUxFTkFNRX0iKQogICAgZmlsZShBUFBFTkQgIiR7Q1VSTF9TTE5fRklMRU5BTUV9IiAiXG4jIFRoaXMgc2hvdWxkIGJlIHJlZ2VuZXJhdGVkIVxuIikKICBlbmRpZigpCmVuZGlmKCkK