IyBjVVJML2xpYmN1cmwgQ01ha2Ugc2NyaXB0CiMgYnkgVGV0ZXRlc3QgYW5kIFN1a2VuZGVyIChCZW5vaXQgTmVpbCkKCiMgVE9ETzoKIyBUaGUgb3V0cHV0IC5zbyBmaWxlIGxhY2tzIHRoZSBzb25hbWUgbnVtYmVyIHdoaWNoIHdlIGN1cnJlbnRseSBoYXZlIHdpdGhpbiB0aGUgbGliL01ha2VmaWxlLmFtIGZpbGUKIyBBZGQgZnVsbCAoNCBvciA1IGxpYnMpIFNTTCBzdXBwb3J0CiMgQWRkIElOU1RBTEwgdGFyZ2V0IChFWFRSQV9ESVNUIHZhcmlhYmxlcyBpbiBNYWtlZmlsZS5hbSBtYXkgYmUgbW92ZWQgdG8gTWFrZWZpbGUuaW5jIHNvIHRoYXQgQ01ha2UvQ1BhY2sgaXMgYXdhcmUgb2Ygd2hhdCdzIHRvIGluY2x1ZGUpLgojIEFkZCBDVGVzdHMoPykKIyBDaGVjayBvbiBhbGwgcG9zc2libGUgcGxhdGZvcm1zCiMgVGVzdCB3aXRoIGFzIG1hbnkgY29uZmlndXJhdGlvbnMgcG9zc2libGUgKFdpdGggb3Igd2l0aG91dCBhbnkgb3B0aW9uKQojIENyZWF0ZSBzY3JpcHRzIHRoYXQgaGVscCBrZWVwaW5nIHRoZSBDTWFrZSBidWlsZCBzeXN0ZW0gdXAgdG8gZGF0ZSAodG8gcmVkdWNlIG1haW50ZW5hbmNlKS4gQWNjb3JkaW5nIHRvIFRldGV0ZXN0OgojICAtIGxpc3RzIG9mIGhlYWRlcnMgdGhhdCAnY29uZmlndXJlJyBjaGVja3MgZm9yOwojICAtIGN1cmwtc3BlY2lmaWMgdGVzdHMgKHRoZSBvbmVzIHRoYXQgYXJlIGluIG00L2N1cmwtKi5tNCBmaWxlcyk7CiMgIC0gKG1vc3Qgb2J2aW91cyB0aGluZzopIGN1cmwgdmVyc2lvbiBudW1iZXJzLgojIEFkZCBkb2N1bWVudGF0aW9uIHN1YnByb2plY3QKIwojIFRvIGNoZWNrOgojIChGcm9tIERhbmllbCBTdGVuYmVyZykgVGhlIGNtYWtlIGJ1aWxkIHNlbGVjdGVkIHRvIHJ1biBnY2Mgd2l0aCAtZlBJQyBvbiBteSBib3ggd2hpbGUgdGhlIHBsYWluIGNvbmZpZ3VyZSBzY3JpcHQgZGlkIG5vdC4KIyAoRnJvbSBEYW5pZWwgU3RlbmJlcmcpIFRoZSBnY2MgY29tbWFuZCBsaW5lIHVzZSBuZWl0aGVyIC1nIG5vciBhbnkgLU8gb3B0aW9ucy4gQXMgYSBkZXZlbG9wZXIsIEkgYWxzbyB0cmVhc3VyZSBvdXIgY29uZmlndXJlIHNjcmlwdHMncyAtLWVuYWJsZS1kZWJ1ZyBvcHRpb24gdGhhdCBzZXRzIGEgbG9uZyByYW5nZSBvZiAicGlja3kiIGNvbXBpbGVyIG9wdGlvbnMuCmNtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjYuMiBGQVRBTF9FUlJPUikKc2V0KENNQUtFX01PRFVMRV9QQVRIICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vQ01ha2U7JHtDTUFLRV9NT0RVTEVfUEFUSH0iKQppbmNsdWRlKFV0aWxpdGllcykKCnByb2plY3QoIENVUkwgQyApCgoKZmlsZSAoUkVBRCAke0NVUkxfU09VUkNFX0RJUn0vaW5jbHVkZS9jdXJsL2N1cmx2ZXIuaCBDVVJMX1ZFUlNJT05fSF9DT05URU5UUykKc3RyaW5nIChSRUdFWCBNQVRDSCAiTElCQ1VSTF9WRVJTSU9OX01BSk9SWyBcdF0rKFswLTldKykiCiAgTElCQ1VSTF9WRVJTSU9OX01KICR7Q1VSTF9WRVJTSU9OX0hfQ09OVEVOVFN9KQpzdHJpbmcgKFJFR0VYIE1BVENIICIoWzAtOV0rKSIKICBMSUJDVVJMX1ZFUlNJT05fTUogJHtMSUJDVVJMX1ZFUlNJT05fTUp9KQpzdHJpbmcgKFJFR0VYIE1BVENICiAgIkxJQkNVUkxfVkVSU0lPTl9NSU5PUlsgXHRdKyhbMC05XSspIgogIExJQkNVUkxfVkVSU0lPTl9NSSAke0NVUkxfVkVSU0lPTl9IX0NPTlRFTlRTfSkKc3RyaW5nIChSRUdFWCBNQVRDSCAiKFswLTldKykiIExJQkNVUkxfVkVSU0lPTl9NSSAke0xJQkNVUkxfVkVSU0lPTl9NSX0pCnN0cmluZyAoUkVHRVggTUFUQ0gKICAiTElCQ1VSTF9WRVJTSU9OX1BBVENIWyBcdF0rKFswLTldKykiCiAgTElCQ1VSTF9WRVJTSU9OX1BUICR7Q1VSTF9WRVJTSU9OX0hfQ09OVEVOVFN9KQpzdHJpbmcgKFJFR0VYIE1BVENIICIoWzAtOV0rKSIgTElCQ1VSTF9WRVJTSU9OX1BUICR7TElCQ1VSTF9WRVJTSU9OX1BUfSkKc2V0IChDVVJMX01BSk9SX1ZFUlNJT04gJHtMSUJDVVJMX1ZFUlNJT05fTUp9KQpzZXQgKENVUkxfTUlOT1JfVkVSU0lPTiAke0xJQkNVUkxfVkVSU0lPTl9NSX0pCnNldCAoQ1VSTF9QQVRDSF9WRVJTSU9OICR7TElCQ1VSTF9WRVJTSU9OX1BUfSkKCmluY2x1ZGVfcmVndWxhcl9leHByZXNzaW9uKCJeLiokIikgICAgIyBTdWtlbmRlcjogSXMgaXQgbmVjZXNzYXJ5PwoKIyBTZXR1cCBwYWNrYWdlIG1ldGEtZGF0YQojIFNFVChQQUNLQUdFICJjdXJsIikKc2V0KENVUkxfVkVSU0lPTiAke0NVUkxfTUFKT1JfVkVSU0lPTn0uJHtDVVJMX01JTk9SX1ZFUlNJT059LiR7Q1VSTF9QQVRDSF9WRVJTSU9OfSkKbWVzc2FnZShTVEFUVVMgImN1cmwgdmVyc2lvbj1bJHtDVVJMX1ZFUlNJT059XSIpCiMgU0VUKFBBQ0tBR0VfVEFSTkFNRSAiY3VybCIpCiMgU0VUKFBBQ0tBR0VfTkFNRSAiY3VybCIpCiMgU0VUKFBBQ0tBR0VfVkVSU0lPTiAiLSIpCiMgU0VUKFBBQ0tBR0VfU1RSSU5HICJjdXJsLSIpCiMgU0VUKFBBQ0tBR0VfQlVHUkVQT1JUICJhIHN1aXRhYmxlIGN1cmwgbWFpbGluZyBsaXN0ID0+IGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC8iKQpzZXQoT1BFUkFUSU5HX1NZU1RFTSAiJHtDTUFLRV9TWVNURU1fTkFNRX0iKQpzZXQoT1MgIlwiJHtDTUFLRV9TWVNURU1fTkFNRX1cIiIpCgppbmNsdWRlX2RpcmVjdG9yaWVzKCR7UFJPSkVDVF9CSU5BUllfRElSfS9pbmNsdWRlL2N1cmwpCmluY2x1ZGVfZGlyZWN0b3JpZXMoICR7Q1VSTF9TT1VSQ0VfRElSfS9pbmNsdWRlICkKCmlmKFdJTjMyKQogIHNldChOQVRJVkVfV0lORE9XUyBPTikKZW5kaWYoKQoKb3B0aW9uKEJVSUxEX0NVUkxfRVhFICJTZXQgdG8gT04gdG8gYnVpbGQgY1VSTCBleGVjdXRhYmxlLiIgT04pCm9wdGlvbihCVUlMRF9DVVJMX1RFU1RTICJTZXQgdG8gT04gdG8gYnVpbGQgY1VSTCB0ZXN0cy4iIE9OKQpvcHRpb24oQ1VSTF9TVEFUSUNMSUIgIlNldCB0byBPTiB0byBidWlsZCBsaWJjdXJsIHdpdGggc3RhdGljIGxpbmtpbmcuIiBPRkYpCm9wdGlvbihDVVJMX1VTRV9BUkVTICJTZXQgdG8gT04gdG8gZW5hYmxlIGMtYXJlcyBzdXBwb3J0IiBPRkYpCiMgaW5pdGlhbGl6ZSBDVVJMX0xJQlMKc2V0KENVUkxfTElCUyAiIikKCmlmKENVUkxfVVNFX0FSRVMpCiAgc2V0KFVTRV9BUkVTICR7Q1VSTF9VU0VfQVJFU30pCiAgZmluZF9wYWNrYWdlKENBUkVTIFJFUVVJUkVEKQogIGxpc3QoQVBQRU5EIENVUkxfTElCUyAke0NBUkVTX0xJQlJBUll9ICkKICBzZXQoQ1VSTF9MSUJTICR7Q1VSTF9MSUJTfSAke0NBUkVTX0xJQlJBUll9KQplbmRpZigpCgpvcHRpb24oQlVJTERfREFTSEJPQVJEX1JFUE9SVFMgIlNldCB0byBPTiB0byBhY3RpdmF0ZSByZXBvcnRpbmcgb2YgY1VSTCBidWlsZHMgaGVyZSBodHRwOi8vd3d3LmNkYXNoLm9yZy9DRGFzaFB1YmxpYy9pbmRleC5waHA/cHJvamVjdD1DVVJMIiBPRkYpCmlmKEJVSUxEX0RBU0hCT0FSRF9SRVBPUlRTKQogICNJTkNMVURFKERhcnQpCiAgaW5jbHVkZShDVGVzdCkKZW5kaWYoQlVJTERfREFTSEJPQVJEX1JFUE9SVFMpCgppZihNU1ZDKQogIG9wdGlvbihCVUlMRF9SRUxFQVNFX0RFQlVHX0RJUlMgIlNldCBPRkYgdG8gYnVpbGQgZWFjaCBjb25maWd1cmF0aW9uIHRvIGEgc2VwYXJhdGUgZGlyZWN0b3J5IiBPRkYpCiAgbWFya19hc19hZHZhbmNlZChCVUlMRF9SRUxFQVNFX0RFQlVHX0RJUlMpCmVuZGlmKCkKCm9wdGlvbihDVVJMX0hJRERFTl9TWU1CT0xTICJTZXQgdG8gT04gdG8gaGlkZSBsaWJjdXJsIGludGVybmFsIHN5bWJvbHMgKD1oaWRlIGFsbCBzeW1ib2xzIHRoYXQgYXJlbid0IG9mZmljaWFsbHkgZXh0ZXJuYWwpLiIgT04pCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ISURERU5fU1lNQk9MUykKCiMgSUYoV0lOMzIpCiMgT1BUSU9OKENVUkxfV0lORE9XU19TU1BJICJVc2Ugd2luZG93cyBsaWJyYXJpZXMgdG8gYWxsb3cgTlRMTSBhdXRoZW50aWNhdGlvbiB3aXRob3V0IG9wZW5zc2wiIE9OKQojIE1BUktfQVNfQURWQU5DRUQoQ1VSTF9XSU5ET1dTX1NTUEkpCiMgRU5ESUYoKQoKb3B0aW9uKEhUVFBfT05MWSAiZGlzYWJsZXMgYWxsIHByb3RvY29scyBleGNlcHQgSFRUUCAoVGhpcyBvdmVycmlkZXMgYWxsIENVUkxfRElTQUJMRV8qIG9wdGlvbnMpIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoSFRUUF9PTkxZKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0ZUUCAiZGlzYWJsZXMgRlRQIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0ZUUCkKb3B0aW9uKENVUkxfRElTQUJMRV9MREFQICJkaXNhYmxlcyBMREFQIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0xEQVApCm9wdGlvbihDVVJMX0RJU0FCTEVfVEVMTkVUICJkaXNhYmxlcyBUZWxuZXQiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfVEVMTkVUKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0RJQ1QgImRpc2FibGVzIERJQ1QiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfRElDVCkKb3B0aW9uKENVUkxfRElTQUJMRV9GSUxFICJkaXNhYmxlcyBGSUxFIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0ZJTEUpCm9wdGlvbihDVVJMX0RJU0FCTEVfVEZUUCAiZGlzYWJsZXMgVEZUUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9URlRQKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0hUVFAgImRpc2FibGVzIEhUVFAiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfSFRUUCkKCm9wdGlvbihDVVJMX0RJU0FCTEVfTERBUFMgInRvIGRpc2FibGUgTERBUFMiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfTERBUFMpCmlmKFdJTjMyKQogIHNldChDVVJMX0RFRkFVTFRfRElTQUJMRV9MREFQIE9GRikKICAjIHNvbWUgd2luZG93cyBjb21waWxlcnMgZG8gbm90IGhhdmUgd2xkYXAzMgogIGlmKCBOT1QgSEFWRV9XTERBUDMyKQogICAgc2V0KENVUkxfRElTQUJMRV9MREFQIE9OIENBQ0hFIEJPT0wgIiIgRk9SQ0UpCiAgICBtZXNzYWdlKFNUQVRVUyAid2xkYXAzMiBub3QgZm91bmQgQ1VSTF9ESVNBQkxFX0xEQVAgc2V0IE9OIikKICAgIG9wdGlvbihDVVJMX0xEQVBfV0lOICJVc2UgV2luZG93cyBMREFQIGltcGxlbWVudGF0aW9uIiBPRkYpCiAgZWxzZSgpCiAgICBvcHRpb24oQ1VSTF9MREFQX1dJTiAiVXNlIFdpbmRvd3MgTERBUCBpbXBsZW1lbnRhdGlvbiIgT04pCiAgZW5kaWYoKQogIG1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9MREFQX1dJTikKZW5kaWYoKQoKaWYoSFRUUF9PTkxZKQogIHNldChDVVJMX0RJU0FCTEVfRlRQIE9OKQogIHNldChDVVJMX0RJU0FCTEVfTERBUCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX1RFTE5FVCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX0RJQ1QgT04pCiAgc2V0KENVUkxfRElTQUJMRV9GSUxFIE9OKQogIHNldChDVVJMX0RJU0FCTEVfVEZUUCBPTikKZW5kaWYoKQoKb3B0aW9uKENVUkxfRElTQUJMRV9DT09LSUVTICJ0byBkaXNhYmxlIGNvb2tpZXMgc3VwcG9ydCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9DT09LSUVTKQoKb3B0aW9uKENVUkxfRElTQUJMRV9DUllQVE9fQVVUSCAidG8gZGlzYWJsZSBjcnlwdG9ncmFwaGljIGF1dGhlbnRpY2F0aW9uIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0NSWVBUT19BVVRIKQpvcHRpb24oQ1VSTF9ESVNBQkxFX1ZFUkJPU0VfU1RSSU5HUyAidG8gZGlzYWJsZSB2ZXJib3NlIHN0cmluZ3MiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfVkVSQk9TRV9TVFJJTkdTKQpvcHRpb24oRElTQUJMRURfVEhSRUFEU0FGRSAiU2V0IHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB3ZSBkb24ndCB3YW50IHRvIHVzZSB0aHJlYWQtc2FmZSBmdW5jdGlvbnMiIE9GRikKbWFya19hc19hZHZhbmNlZChESVNBQkxFRF9USFJFQURTQUZFKQpvcHRpb24oRU5BQkxFX0lQVjYgIkRlZmluZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgSVB2NiBzdXBwb3J0IiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoRU5BQkxFX0lQVjYpCgppZihXSU4zMikKICBsaXN0X3NwYWNlc19hcHBlbmRfb25jZShDTUFLRV9DX1NUQU5EQVJEX0xJQlJBUklFUyB3c29jazMyLmxpYiB3czJfMzIubGliKSAgIyBidWZmZXJvdmVyZmxvd3UubGliCiAgaWYoQ1VSTF9ESVNBQkxFX0xEQVApCiAgICAjIFJlbW92ZSB3bGRhcDMyLmxpYiBmcm9tIHNwYWNlLXNlcGFyYXRlZCBsaXN0CiAgICBzdHJpbmcoUkVQTEFDRSAiICIgIjsiIF9MSVNUICR7Q01BS0VfQ19TVEFOREFSRF9MSUJSQVJJRVN9KQogICAgbGlzdChSRU1PVkVfSVRFTSBfTElTVCAid2xkYXAzMi5saWIiKQogICAgdG9fbGlzdF9zcGFjZXMoX0xJU1QgQ01BS0VfQ19TVEFOREFSRF9MSUJSQVJJRVMpCiAgZWxzZSgpCiAgICAjIEFwcGVuZCB3bGRhcDMyLmxpYgogICAgbGlzdF9zcGFjZXNfYXBwZW5kX29uY2UoQ01BS0VfQ19TVEFOREFSRF9MSUJSQVJJRVMgd2xkYXAzMi5saWIpCiAgZW5kaWYoKQogIHNldChDTUFLRV9DX1NUQU5EQVJEX0xJQlJBUklFUyAiJHtDTUFLRV9DX1NUQU5EQVJEX0xJQlJBUklFU30iICAgQ0FDSEUgU1RSSU5HICIiIEZPUkNFKQplbmRpZigpCgoKIyBXZSBuZWVkIGFuc2kgYy1mbGFncywgZXNwZWNpYWxseSBvbiBIUApzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9BTlNJX0NGTEFHU30gJHtDTUFLRV9DX0ZMQUdTfSIpCnNldChDTUFLRV9SRVFVSVJFRF9GTEFHUyAke0NNQUtFX0FOU0lfQ0ZMQUdTfSkKCiMgRGlzYWJsZSB3YXJuaW5ncyBvbiBCb3JsYW5kIHRvIGF2b2lkIGNoYW5naW5nIDNyZCBwYXJ0eSBjb2RlLgppZihCT1JMQU5EKQogIHNldChDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0NfRkxBR1N9IC13LSIpCmVuZGlmKEJPUkxBTkQpCgojIElmIHdlIGFyZSBvbiBBSVgsIGRvIHRoZSBfQUxMX1NPVVJDRSBtYWdpYwppZigke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTIEFJWCkKICBzZXQoX0FMTF9TT1VSQ0UgMSkKZW5kaWYoJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyBBSVgpCgojIEluY2x1ZGUgYWxsIHRoZSBuZWNlc3NhcnkgZmlsZXMgZm9yIG1hY3JvcwppbmNsdWRlIChDaGVja0Z1bmN0aW9uRXhpc3RzKQppbmNsdWRlIChDaGVja0luY2x1ZGVGaWxlKQppbmNsdWRlIChDaGVja0luY2x1ZGVGaWxlcykKaW5jbHVkZSAoQ2hlY2tMaWJyYXJ5RXhpc3RzKQppbmNsdWRlIChDaGVja1N5bWJvbEV4aXN0cykKaW5jbHVkZSAoQ2hlY2tUeXBlU2l6ZSkKCiMgT24gd2luZG93cyBwcmVsb2FkIHNldHRpbmdzCmlmKFdJTjMyKQogIGluY2x1ZGUoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L0NNYWtlL1BsYXRmb3Jtcy9XaW5kb3dzQ2FjaGUuY21ha2UpCmVuZGlmKFdJTjMyKQoKIyBUaGlzIG1hY3JvIGNoZWNrcyBpZiB0aGUgc3ltYm9sIGV4aXN0cyBpbiB0aGUgbGlicmFyeSBhbmQgaWYgaXQKIyBkb2VzLCBpdCBhcHBlbmRzIGxpYnJhcnkgdG8gdGhlIGxpc3QuCm1hY3JvKENIRUNLX0xJQlJBUllfRVhJU1RTX0NPTkNBVCBMSUJSQVJZIFNZTUJPTCBWQVJJQUJMRSkKICBjaGVja19saWJyYXJ5X2V4aXN0cygiJHtMSUJSQVJZfTske0NVUkxfTElCU30iICR7U1lNQk9MfSAiIgogICAgJHtWQVJJQUJMRX0pCiAgaWYoJHtWQVJJQUJMRX0pCiAgICBzZXQoQ1VSTF9MSUJTICR7Q1VSTF9MSUJTfSAke0xJQlJBUll9KQogIGVuZGlmKCR7VkFSSUFCTEV9KQplbmRtYWNybyhDSEVDS19MSUJSQVJZX0VYSVNUU19DT05DQVQpCgojIENoZWNrIGZvciBhbGwgbmVlZGVkIGxpYnJhcmllcwpjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoImRsIiAgICAgZGxvcGVuICAgICAgIEhBVkVfTElCREwpCmNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgic29ja2V0IiBjb25uZWN0ICAgICAgSEFWRV9MSUJTT0NLRVQpCmNoZWNrX2xpYnJhcnlfZXhpc3RzKCJjIiBnZXRob3N0YnluYW1lICIiIE5PVF9ORUVEX0xJQk5TTCkKCiMgWWVsbG93dGFiIFpldGEgbmVlZHMgZGlmZmVyZW50IGxpYnJhcmllcyB0aGFuIEJlT1MgNS4KaWYoQkVPUykKICBzZXQoTk9UX05FRURfTElCTlNMIDEpCiAgY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJiaW5kIiBnZXRob3N0YnluYW1lIEhBVkVfTElCQklORCkKICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoImJuZXRhcGkiIGNsb3Nlc29ja2V0IEhBVkVfTElCQk5FVEFQSSkKZW5kaWYoQkVPUykKCmlmKE5PVCBOT1RfTkVFRF9MSUJOU0wpCiAgY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJuc2wiICAgIGdldGhvc3RieW5hbWUgIEhBVkVfTElCTlNMKQplbmRpZihOT1QgTk9UX05FRURfTElCTlNMKQoKY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJ3czJfMzIiIGdldGNoICAgICAgICBIQVZFX0xJQldTMl8zMikKY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJ3aW5tbSIgIGdldGNoICAgICAgICBIQVZFX0xJQldJTk1NKQpjaGVja19saWJyYXJ5X2V4aXN0cygid2xkYXAzMiIgY2xkYXBfb3BlbiAiIiBIQVZFX1dMREFQMzIpCgojIElGKE5PVCBDVVJMX1NQRUNJQUxfTElCWikKIyAgQ0hFQ0tfTElCUkFSWV9FWElTVFNfQ09OQ0FUKCJ6IiAgICAgIGluZmxhdGVFbmQgICBIQVZFX0xJQlopCiMgRU5ESUYoTk9UIENVUkxfU1BFQ0lBTF9MSUJaKQoKb3B0aW9uKENNQUtFX1VTRV9PUEVOU1NMICJVc2UgT3BlblNTTCBjb2RlLiBFeHBlcmltZW50YWwiIE9OKQptYXJrX2FzX2FkdmFuY2VkKENNQUtFX1VTRV9PUEVOU1NMKQppZihDTUFLRV9VU0VfT1BFTlNTTCkKICBpZihXSU4zMikKICAgIGZpbmRfcGFja2FnZShPcGVuU1NMKQogICAgaWYoT1BFTlNTTF9GT1VORCkKICAgICAgc2V0KFVTRV9TU0xFQVkgVFJVRSkKICAgICAgc2V0KFVTRV9PUEVOU1NMIFRSVUUpCiAgICAgIGxpc3QoQVBQRU5EIENVUkxfTElCUyAke09QRU5TU0xfTElCUkFSSUVTfSApCiAgICBlbHNlKCkKICAgICAgc2V0KENNQUtFX1VTRV9PUEVOU1NMIEZBTFNFKQogICAgICBtZXNzYWdlKFNUQVRVUyAiT3BlblNTTCBOT1QgRm91bmQsIGRpc2FibGluZyBDTUFLRV9VU0VfT1BFTlNTTCIpCiAgICBlbmRpZigpCiAgZWxzZShXSU4zMikKICAgIGNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgiY3J5cHRvIiBDUllQVE9fbG9jayAgSEFWRV9MSUJDUllQVE8pCiAgICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoInNzbCIgICAgU1NMX2Nvbm5lY3QgIEhBVkVfTElCU1NMKQogIGVuZGlmKFdJTjMyKQplbmRpZihDTUFLRV9VU0VfT1BFTlNTTCkKCiMgQ2hlY2sgZm9yIGlkbgpjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoImlkbiIgaWRuYV90b19hc2NpaV9seiBIQVZFX0xJQklETikKCiMgQ2hlY2sgZm9yIExEQVAKY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJsZGFwIiBsZGFwX2luaXQgSEFWRV9MSUJMREFQKQojIGlmKE5PVCBIQVZFX0xJQkxEQVApCiMgU0VUKENVUkxfRElTQUJMRV9MREFQIE9OKQojIGVuZGlmKE5PVCBIQVZFX0xJQkxEQVApCgojIENoZWNrIGZvciBzeW1ib2wgZGxvcGVuIChzYW1lIGFzIEhBVkVfTElCREwpCmNoZWNrX2xpYnJhcnlfZXhpc3RzKCIke0NVUkxfTElCU30iIGRsb3BlbiAiIiBIQVZFX0RMT1BFTikKCiMgRm9yIG90aGVyIHRlc3RzIHRvIHVzZSB0aGUgc2FtZSBsaWJyYXJpZXMKc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAke0NVUkxfTElCU30pCgpvcHRpb24oQ1VSTF9aTElCICJTZXQgdG8gT04gdG8gZW5hYmxlIGJ1aWxkaW5nIGNVUkwgd2l0aCB6bGliIHN1cHBvcnQuIiBPTikKc2V0KEhBVkVfTElCWiBPRkYpCnNldChIQVZFX1pMSUJfSCBPRkYpCnNldChIQVZFX1pMSUIgT0ZGKQppZihDVVJMX1pMSUIpICAjIEFORCBDVVJMX0NPTkZJR19IQVNfQkVFTl9SVU5fQkVGT1JFCiAgZmluZF9wYWNrYWdlKFpMSUIgUVVJRVQpCiAgaWYoWkxJQl9GT1VORCkKICAgIHNldChIQVZFX1pMSUJfSCBPTikKICAgIHNldChIQVZFX1pMSUIgT04pCiAgICBzZXQoSEFWRV9MSUJaIE9OKQogIGVuZGlmKCkKZW5kaWYoKQoKIyBJZiB3ZSBoYXZlIGZlYXR1cmVzLmgsIHRoZW4gZG8gdGhlIF9CU0RfU09VUkNFIG1hZ2ljCmNoZWNrX2luY2x1ZGVfZmlsZSgiZmVhdHVyZXMuaCIgICAgICAgSEFWRV9GRUFUVVJFU19IKQoKIyBDaGVjayBpZiBoZWFkZXIgZmlsZSBleGlzdHMgYW5kIGFkZCBpdCB0byB0aGUgbGlzdC4KbWFjcm8oQ0hFQ0tfSU5DTFVERV9GSUxFX0NPTkNBVCBGSUxFIFZBUklBQkxFKQogIGNoZWNrX2luY2x1ZGVfZmlsZXMoIiR7Q1VSTF9JTkNMVURFU307JHtGSUxFfSIgJHtWQVJJQUJMRX0pCiAgaWYoJHtWQVJJQUJMRX0pCiAgICBzZXQoQ1VSTF9JTkNMVURFUyAke0NVUkxfSU5DTFVERVN9ICR7RklMRX0pCiAgICBzZXQoQ1VSTF9URVNUX0RFRklORVMgIiR7Q1VSTF9URVNUX0RFRklORVN9IC1EJHtWQVJJQUJMRX0iKQogIGVuZGlmKCR7VkFSSUFCTEV9KQplbmRtYWNybyhDSEVDS19JTkNMVURFX0ZJTEVfQ09OQ0FUKQoKCiMgQ2hlY2sgZm9yIGhlYWRlciBmaWxlcwppZihOT1QgVU5JWCkKICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ3czJ0Y3BpcC5oIiAgICAgSEFWRV9XUzJUQ1BJUF9IKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIndpbnNvY2syLmgiICAgICBIQVZFX1dJTlNPQ0syX0gpCmVuZGlmKE5PVCBVTklYKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRpby5oIiAgICAgICAgICBIQVZFX1NURElPX0gpCmlmKE5PVCBVTklYKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIndpbmRvd3MuaCIgICAgICBIQVZFX1dJTkRPV1NfSCkKICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ3aW5zb2NrLmgiICAgICAgSEFWRV9XSU5TT0NLX0gpCmVuZGlmKE5PVCBVTklYKQoKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaW50dHlwZXMuaCIgICAgICAgSEFWRV9JTlRUWVBFU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvZmlsaW8uaCIgICAgICBIQVZFX1NZU19GSUxJT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvaW9jdGwuaCIgICAgICBIQVZFX1NZU19JT0NUTF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvcGFyYW0uaCIgICAgICBIQVZFX1NZU19QQVJBTV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvcG9sbC5oIiAgICAgICBIQVZFX1NZU19QT0xMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9yZXNvdXJjZS5oIiAgIEhBVkVfU1lTX1JFU09VUkNFX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9zZWxlY3QuaCIgICAgIEhBVkVfU1lTX1NFTEVDVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvc29ja2V0LmgiICAgICBIQVZFX1NZU19TT0NLRVRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3NvY2tpby5oIiAgICAgSEFWRV9TWVNfU09DS0lPX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9zdGF0LmgiICAgICAgIEhBVkVfU1lTX1NUQVRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3RpbWUuaCIgICAgICAgSEFWRV9TWVNfVElNRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdHlwZXMuaCIgICAgICBIQVZFX1NZU19UWVBFU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdWlvLmgiICAgICAgICBIQVZFX1NZU19VSU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3VuLmgiICAgICAgICAgSEFWRV9TWVNfVU5fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3V0aW1lLmgiICAgICAgSEFWRV9TWVNfVVRJTUVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiYWxsb2NhLmgiICAgICAgICAgSEFWRV9BTExPQ0FfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiYXJwYS9pbmV0LmgiICAgICAgSEFWRV9BUlBBX0lORVRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiYXJwYS90ZnRwLmgiICAgICAgSEFWRV9BUlBBX1RGVFBfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiYXNzZXJ0LmgiICAgICAgICAgSEFWRV9BU1NFUlRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiY3J5cHRvLmgiICAgICAgICAgSEFWRV9DUllQVE9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZGVzLmgiICAgICAgICAgICAgSEFWRV9ERVNfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZXJyLmgiICAgICAgICAgICAgSEFWRV9FUlJfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZXJybm8uaCIgICAgICAgICAgSEFWRV9FUlJOT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJmY250bC5oIiAgICAgICAgICBIQVZFX0ZDTlRMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImdzc2FwaS9nc3NhcGkuaCIgIEhBVkVfR1NTQVBJX0dTU0FQSV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJnc3NhcGkvZ3NzYXBpX2dlbmVyaWMuaCIgSEFWRV9HU1NBUElfR1NTQVBJX0dFTkVSSUNfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZ3NzYXBpL2dzc2FwaV9rcmI1LmgiIEhBVkVfR1NTQVBJX0dTU0FQSV9LUkI1X0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImlkbi1mcmVlLmgiICAgICAgIEhBVkVfSUROX0ZSRUVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaWZhZGRycy5oIiAgICAgICAgSEFWRV9JRkFERFJTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImlvLmgiICAgICAgICAgICAgIEhBVkVfSU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgia3JiLmgiICAgICAgICAgICAgSEFWRV9LUkJfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibGliZ2VuLmgiICAgICAgICAgSEFWRV9MSUJHRU5fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibGlic3NoMi5oIiAgICAgICAgSEFWRV9MSUJTU0gyX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImxpbWl0cy5oIiAgICAgICAgIEhBVkVfTElNSVRTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImxvY2FsZS5oIiAgICAgICAgIEhBVkVfTE9DQUxFX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm5ldC9pZi5oIiAgICAgICAgIEhBVkVfTkVUX0lGX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm5ldGRiLmgiICAgICAgICAgIEhBVkVfTkVUREJfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibmV0aW5ldC9pbi5oIiAgICAgSEFWRV9ORVRJTkVUX0lOX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm5ldGluZXQvdGNwLmgiICAgIEhBVkVfTkVUSU5FVF9UQ1BfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgib3BlbnNzbC9jcnlwdG8uaCIgSEFWRV9PUEVOU1NMX0NSWVBUT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJvcGVuc3NsL2VuZ2luZS5oIiBIQVZFX09QRU5TU0xfRU5HSU5FX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm9wZW5zc2wvZXJyLmgiICAgIEhBVkVfT1BFTlNTTF9FUlJfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgib3BlbnNzbC9wZW0uaCIgICAgSEFWRV9PUEVOU1NMX1BFTV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJvcGVuc3NsL3BrY3MxMi5oIiBIQVZFX09QRU5TU0xfUEtDUzEyX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm9wZW5zc2wvcnNhLmgiICAgIEhBVkVfT1BFTlNTTF9SU0FfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgib3BlbnNzbC9zc2wuaCIgICAgSEFWRV9PUEVOU1NMX1NTTF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJvcGVuc3NsL3g1MDkuaCIgICBIQVZFX09QRU5TU0xfWDUwOV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJwZW0uaCIgICAgICAgICAgICBIQVZFX1BFTV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJwb2xsLmgiICAgICAgICAgICBIQVZFX1BPTExfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgicHdkLmgiICAgICAgICAgICAgSEFWRV9QV0RfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgicnNhLmgiICAgICAgICAgICAgSEFWRV9SU0FfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic2V0am1wLmgiICAgICAgICAgSEFWRV9TRVRKTVBfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic2d0dHkuaCIgICAgICAgICAgSEFWRV9TR1RUWV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzaWduYWwuaCIgICAgICAgICBIQVZFX1NJR05BTF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzc2wuaCIgICAgICAgICAgICBIQVZFX1NTTF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRib29sLmgiICAgICAgICBIQVZFX1NUREJPT0xfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RkaW50LmgiICAgICAgICAgSEFWRV9TVERJTlRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RkaW8uaCIgICAgICAgICAgSEFWRV9TVERJT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRsaWIuaCIgICAgICAgICBIQVZFX1NURExJQl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdHJpbmcuaCIgICAgICAgICBIQVZFX1NUUklOR19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdHJpbmdzLmgiICAgICAgICBIQVZFX1NUUklOR1NfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3Ryb3B0cy5oIiAgICAgICAgSEFWRV9TVFJPUFRTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInRlcm1pby5oIiAgICAgICAgIEhBVkVfVEVSTUlPX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInRlcm1pb3MuaCIgICAgICAgIEhBVkVfVEVSTUlPU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ0aW1lLmgiICAgICAgICAgICBIQVZFX1RJTUVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgidGxkLmgiICAgICAgICAgICAgSEFWRV9UTERfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgidW5pc3RkLmgiICAgICAgICAgSEFWRV9VTklTVERfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgidXRpbWUuaCIgICAgICAgICAgSEFWRV9VVElNRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ4NTA5LmgiICAgICAgICAgICBIQVZFX1g1MDlfSCkKCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInByb2Nlc3MuaCIgICAgICAgIEhBVkVfUFJPQ0VTU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRkZWYuaCIgICAgICAgICBIQVZFX1NURERFRl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJkbGZjbi5oIiAgICAgICAgICBIQVZFX0RMRkNOX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm1hbGxvYy5oIiAgICAgICAgIEhBVkVfTUFMTE9DX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm1lbW9yeS5oIiAgICAgICAgIEhBVkVfTUVNT1JZX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImxkYXAuaCIgICAgICAgICAgIEhBVkVfTERBUF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJuZXRpbmV0L2lmX2V0aGVyLmgiIEhBVkVfTkVUSU5FVF9JRl9FVEhFUl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRpbnQuaCIgICAgICAgIEhBVkVfU1RESU5UX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInNvY2tpby5oIiAgICAgICAgSEFWRV9TT0NLSU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3V0c25hbWUuaCIgICBIQVZFX1NZU19VVFNOQU1FX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImlkbmEuaCIgICAgICAgICAgSEFWRV9JRE5BX0gpCgppZihDTUFLRV9VU0VfT1BFTlNTTCkKICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJvcGVuc3NsL3JhbmQuaCIgICBIQVZFX09QRU5TU0xfUkFORF9IKQplbmRpZihDTUFLRV9VU0VfT1BFTlNTTCkKCmlmKE5PVCBIQVZFX0xEQVBfSCkgCiAgbWVzc2FnZShTVEFUVVMgIkxEQVBfSCBub3QgZm91bmQgQ1VSTF9ESVNBQkxFX0xEQVAgc2V0IE9OIikKICBzZXQoQ1VSTF9ESVNBQkxFX0xEQVAgT04gQ0FDSEUgQk9PTCAiIiBGT1JDRSkKZW5kaWYoKQoKCmNoZWNrX3R5cGVfc2l6ZShzaXplX3QgIFNJWkVPRl9TSVpFX1QpCmNoZWNrX3R5cGVfc2l6ZShzc2l6ZV90ICBTSVpFT0ZfU1NJWkVfVCkKY2hlY2tfdHlwZV9zaXplKCJsb25nIGxvbmciICBTSVpFT0ZfTE9OR19MT05HKQpjaGVja190eXBlX3NpemUoImxvbmciICBTSVpFT0ZfTE9ORykKY2hlY2tfdHlwZV9zaXplKCJzaG9ydCIgIFNJWkVPRl9TSE9SVCkKY2hlY2tfdHlwZV9zaXplKCJpbnQiICBTSVpFT0ZfSU5UKQpjaGVja190eXBlX3NpemUoIl9faW50NjQiICBTSVpFT0ZfX19JTlQ2NCkKY2hlY2tfdHlwZV9zaXplKCJsb25nIGRvdWJsZSIgIFNJWkVPRl9MT05HX0RPVUJMRSkKY2hlY2tfdHlwZV9zaXplKCJ0aW1lX3QiICBTSVpFT0ZfVElNRV9UKQppZihOT1QgSEFWRV9TSVpFT0ZfU1NJWkVfVCkKICBpZihTSVpFT0ZfTE9ORyBFUVVBTCBTSVpFT0ZfU0laRV9UKQogICAgc2V0KHNzaXplX3QgbG9uZykKICBlbmRpZihTSVpFT0ZfTE9ORyBFUVVBTCBTSVpFT0ZfU0laRV9UKQogIGlmKE5PVCBzc2l6ZV90IEFORCBTSVpFT0ZfX19JTlQ2NCBFUVVBTCBTSVpFT0ZfU0laRV9UKQogICAgc2V0KHNzaXplX3QgX19pbnQ2NCkKICBlbmRpZihOT1Qgc3NpemVfdCBBTkQgU0laRU9GX19fSU5UNjQgRVFVQUwgU0laRU9GX1NJWkVfVCkKZW5kaWYoTk9UIEhBVkVfU0laRU9GX1NTSVpFX1QpCgojIERpZmZlcmVudCBzaXplb2ZzLCBldGMuCgojICAgIGRlZmluZSBDVVJMX1NJWkVPRl9MT05HICAgICAgICA0CiMgICAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgIGxvbmcgbG9uZwojICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAibGxkIgojICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAibGx1IgojICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9PRkZfVCAgICAgICAiJWxsZCIKIyAgICBkZWZpbmUgQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCAgOAojICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICBMTAojICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSBVTEwKCnNldChDVVJMX1NJWkVPRl9MT05HICR7U0laRU9GX0xPTkd9KQoKaWYoU0laRU9GX0xPTkcgRVFVQUwgOCkKICBzZXQoQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCBsb25nKQogIHNldChDVVJMX1NJWkVPRl9DVVJMX09GRl9UIDgpCiAgc2V0KENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgImxkIikKICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgImx1IikKICBzZXQoQ1VSTF9GT1JNQVRfT0ZGX1QgIiVsZCIpCiAgc2V0KENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgTCkKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgTFUpCmVuZGlmKFNJWkVPRl9MT05HIEVRVUFMIDgpCgppZihTSVpFT0ZfTE9OR19MT05HIEVRVUFMIDgpCiAgc2V0KENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgImxvbmcgbG9uZyIpCiAgc2V0KENVUkxfU0laRU9GX0NVUkxfT0ZGX1QgOCkKICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAibGxkIikKICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgImxsdSIpCiAgc2V0KENVUkxfRk9STUFUX09GRl9UICIlbGxkIikKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCBMTCkKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgTExVKQplbmRpZihTSVpFT0ZfTE9OR19MT05HIEVRVUFMIDgpCgppZihOT1QgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCkKICBzZXQoQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAke3NzaXplX3R9KQogIHNldChDVVJMX1NJWkVPRl9DVVJMX09GRl9UICR7U0laRU9GX1NTSVpFX1R9KQogICMgVE9ETzogbmVlZCBhZGp1c3RtZW50IGhlcmUuCiAgc2V0KENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgImxkIikKICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgImx1IikKICBzZXQoQ1VSTF9GT1JNQVRfT0ZGX1QgIiVsZCIpCiAgc2V0KENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgTCkKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgTFUpCmVuZGlmKE5PVCBDVVJMX1RZUEVPRl9DVVJMX09GRl9UKQoKaWYoSEFWRV9TSVpFT0ZfTE9OR19MT05HKQogIHNldChIQVZFX0xPTkdMT05HIDEpCiAgc2V0KEhBVkVfTEwgMSkKZW5kaWYoSEFWRV9TSVpFT0ZfTE9OR19MT05HKQoKZmluZF9maWxlKFJBTkRPTV9GSUxFIHVyYW5kb20gL2RldikKbWFya19hc19hZHZhbmNlZChSQU5ET01fRklMRSkKCiMgQ2hlY2sgZm9yIHNvbWUgZnVuY3Rpb25zIHRoYXQgYXJlIHVzZWQKY2hlY2tfc3ltYm9sX2V4aXN0cyhiYXNlbmFtZSAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0JBU0VOQU1FKQpjaGVja19zeW1ib2xfZXhpc3RzKHNvY2tldCAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU09DS0VUKQpjaGVja19zeW1ib2xfZXhpc3RzKHBvbGwgICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUE9MTCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzZWxlY3QgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NFTEVDVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJkdXAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUkRVUCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJzdHIgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUlNUUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJ0b2tfciAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUlRPS19SKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cmZ0aW1lICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSRlRJTUUpCmNoZWNrX3N5bWJvbF9leGlzdHModW5hbWUgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9VTkFNRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJjYXNlY21wICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUkNBU0VDTVApCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RyaWNtcCAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJJQ01QKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cmNtcGkgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSQ01QSSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJuY21waSAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUk5DTVBJKQpjaGVja19zeW1ib2xfZXhpc3RzKGFsYXJtICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfQUxBUk0pCmlmKE5PVCBIQVZFX1NUUk5DTVBJKQogIHNldChIQVZFX1NUUkNNUEkpCmVuZGlmKE5PVCBIQVZFX1NUUk5DTVBJKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldGhvc3RieWFkZHIgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUSE9TVEJZQUREUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRob3N0YnlhZGRyX3IgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUSE9TVEJZQUREUl9SKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldHRpbWVvZmRheSAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUVElNRU9GREFZKQpjaGVja19zeW1ib2xfZXhpc3RzKGluZXRfYWRkciAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfSU5FVF9BRERSKQpjaGVja19zeW1ib2xfZXhpc3RzKGluZXRfbnRvYSAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfSU5FVF9OVE9BKQpjaGVja19zeW1ib2xfZXhpc3RzKGluZXRfbnRvYV9yICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfSU5FVF9OVE9BX1IpCmNoZWNrX3N5bWJvbF9leGlzdHModGNzZXRhdHRyICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9UQ1NFVEFUVFIpCmNoZWNrX3N5bWJvbF9leGlzdHModGNnZXRhdHRyICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9UQ0dFVEFUVFIpCmNoZWNrX3N5bWJvbF9leGlzdHMocGVycm9yICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9QRVJST1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoY2xvc2Vzb2NrZXQgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9DTE9TRVNPQ0tFVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzZXR2YnVmICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NFVFZCVUYpCmNoZWNrX3N5bWJvbF9leGlzdHMoc2lnc2V0am1wICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TSUdTRVRKTVApCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0cGFzc19yICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRQQVNTX1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RybGNhdCAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJMQ0FUKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldHB3dWlkICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUUFdVSUQpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0ZXVpZCAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRFVUlEKQpjaGVja19zeW1ib2xfZXhpc3RzKHV0aW1lICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfVVRJTUUpCmlmKENNQUtFX1VTRV9PUEVOU1NMKQogIGNoZWNrX3N5bWJvbF9leGlzdHMoUkFORF9zdGF0dXMgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9SQU5EX1NUQVRVUykKICBjaGVja19zeW1ib2xfZXhpc3RzKFJBTkRfc2NyZWVuICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUkFORF9TQ1JFRU4pCiAgY2hlY2tfc3ltYm9sX2V4aXN0cyhSQU5EX2VnZCAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1JBTkRfRUdEKQogIGNoZWNrX3N5bWJvbF9leGlzdHMoQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEgIiR7Q1VSTF9JTkNMVURFU30iCiAgICBIQVZFX0NSWVBUT19DTEVBTlVQX0FMTF9FWF9EQVRBKQogIGlmKEhBVkVfTElCQ1JZUFRPIEFORCBIQVZFX0xJQlNTTCkKICAgIHNldChVU0VfT1BFTlNTTCAxKQogICAgc2V0KFVTRV9TU0xFQVkgMSkKICBlbmRpZihIQVZFX0xJQkNSWVBUTyBBTkQgSEFWRV9MSUJTU0wpCmVuZGlmKENNQUtFX1VTRV9PUEVOU1NMKQpjaGVja19zeW1ib2xfZXhpc3RzKGdtdGltZV9yICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR01USU1FX1IpCmNoZWNrX3N5bWJvbF9leGlzdHMobG9jYWx0aW1lX3IgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9MT0NBTFRJTUVfUikKCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0aG9zdGJ5bmFtZSAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVEhPU1RCWU5BTUUpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0aG9zdGJ5bmFtZV9yICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVEhPU1RCWU5BTUVfUikKCmNoZWNrX3N5bWJvbF9leGlzdHMoc2lnbmFsICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TSUdOQUxfRlVOQykKY2hlY2tfc3ltYm9sX2V4aXN0cyhTSUdBTFJNICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NJR05BTF9NQUNSTykKaWYoSEFWRV9TSUdOQUxfRlVOQyBBTkQgSEFWRV9TSUdOQUxfTUFDUk8pCiAgc2V0KEhBVkVfU0lHTkFMIDEpCmVuZGlmKEhBVkVfU0lHTkFMX0ZVTkMgQU5EIEhBVkVfU0lHTkFMX01BQ1JPKQpjaGVja19zeW1ib2xfZXhpc3RzKHVuYW1lICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1VOQU1FKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cnRvbGwgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUlRPTEwpCmNoZWNrX3N5bWJvbF9leGlzdHMoX3N0cnRvaTY0ICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfX1NUUlRPSTY0KQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cmVycm9yX3IgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUkVSUk9SX1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoc2lnaW50ZXJydXB0ICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0lHSU5URVJSVVBUKQpjaGVja19zeW1ib2xfZXhpc3RzKHBlcnJvciAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1BFUlJPUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhmb3JrICAgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9GT1JLKQpjaGVja19zeW1ib2xfZXhpc3RzKGZyZWVhZGRyaW5mbyAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0ZSRUVBRERSSU5GTykKY2hlY2tfc3ltYm9sX2V4aXN0cyhmcmVlaWZhZGRycyAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9GUkVFSUZBRERSUykKY2hlY2tfc3ltYm9sX2V4aXN0cyhwaXBlICAgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9QSVBFKQpjaGVja19zeW1ib2xfZXhpc3RzKGZ0cnVuY2F0ZSAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0ZUUlVOQ0FURSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRwcm90b2J5bmFtZSAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRQUk9UT0JZTkFNRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRybGltaXQgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRSTElNSVQpCmNoZWNrX3N5bWJvbF9leGlzdHMoaWRuX2ZyZWUgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfSUROX0ZSRUUpCmNoZWNrX3N5bWJvbF9leGlzdHMoaWRuYV9zdHJlcnJvciAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfSUROQV9TVFJFUlJPUikKY2hlY2tfc3ltYm9sX2V4aXN0cyh0bGRfc3RyZXJyb3IgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9UTERfU1RSRVJST1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoc2V0bG9jYWxlICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0VUTE9DQUxFKQpjaGVja19zeW1ib2xfZXhpc3RzKHNldHJsaW1pdCAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NFVFJMSU1JVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhmY250bCAgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9GQ05UTCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhpb2N0bCAgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9JT0NUTCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzZXRzb2Nrb3B0ICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TRVRTT0NLT1BUKQoKIyBzeW1ib2wgZXhpc3RzIGluIHdpbjMyLCBidXQgZnVuY3Rpb24gZG9lcyBub3QuCmNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhpbmV0X3B0b24gSEFWRV9JTkVUX1BUT04pCgojIHNpZ2FjdGlvbiBhbmQgc2lnc2V0am1wIGFyZSBzcGVjaWFsLiBVc2Ugc3BlY2lhbCBtZWNoYW5pc20gZm9yCiMgZGV0ZWN0aW5nIHRob3NlLCBidXQgb25seSBpZiBwcmV2aW91cyBhdHRlbXB0IGZhaWxlZC4KaWYoSEFWRV9TSUdOQUxfSCkKICBjaGVja19zeW1ib2xfZXhpc3RzKHNpZ2FjdGlvbiAic2lnbmFsLmgiIEhBVkVfU0lHQUNUSU9OKQplbmRpZihIQVZFX1NJR05BTF9IKQoKaWYoTk9UIEhBVkVfU0lHU0VUSk1QKQogIGlmKEhBVkVfU0VUSk1QX0gpCiAgICBjaGVja19zeW1ib2xfZXhpc3RzKHNpZ3NldGptcCAic2V0am1wLmgiIEhBVkVfTUFDUk9fU0lHU0VUSk1QKQogICAgaWYoSEFWRV9NQUNST19TSUdTRVRKTVApCiAgICAgIHNldChIQVZFX1NJR1NFVEpNUCAxKQogICAgZW5kaWYoSEFWRV9NQUNST19TSUdTRVRKTVApCiAgZW5kaWYoSEFWRV9TRVRKTVBfSCkKZW5kaWYoTk9UIEhBVkVfU0lHU0VUSk1QKQoKIyBJZiB0aGVyZSBpcyBubyBzdHJpY21wKCksIGRvIG5vdCBhbGxvdyBMREFQIHRvIHBhcnNlIFVSTHMKaWYoTk9UIEhBVkVfU1RSSUNNUCkKICBzZXQoSEFWRV9MREFQX1VSTF9QQVJTRSAxKQplbmRpZihOT1QgSEFWRV9TVFJJQ01QKQoKIyBGb3Igb3RoZXIgY3VybCBzcGVjaWZpYyB0ZXN0cywgdXNlIHRoaXMgbWFjcm8uCm1hY3JvKENVUkxfSU5URVJOQUxfVEVTVCBDVVJMX1RFU1QpCiAgaWYoIiR7Q1VSTF9URVNUfSIgTUFUQ0hFUyAiXiR7Q1VSTF9URVNUfSQiKQogICAgc2V0KE1BQ1JPX0NIRUNLX0ZVTkNUSU9OX0RFRklOSVRJT05TCiAgICAgICItRCR7Q1VSTF9URVNUfSAke0NVUkxfVEVTVF9ERUZJTkVTfSAke0NNQUtFX1JFUVVJUkVEX0ZMQUdTfSIpCiAgICBpZihDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMpCiAgICAgIHNldChDVVJMX1RFU1RfQUREX0xJQlJBUklFUwogICAgICAgICItRExJTktfTElCUkFSSUVTOlNUUklORz0ke0NNQUtFX1JFUVVJUkVEX0xJQlJBUklFU30iKQogICAgZW5kaWYoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTKQoKICAgIG1lc3NhZ2UoU1RBVFVTICJQZXJmb3JtaW5nIEN1cmwgVGVzdCAke0NVUkxfVEVTVH0iKQogICAgdHJ5X2NvbXBpbGUoJHtDVVJMX1RFU1R9CiAgICAgICR7Q01BS0VfQklOQVJZX0RJUn0KICAgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L0NNYWtlL0N1cmxUZXN0cy5jCiAgICAgIENNQUtFX0ZMQUdTIC1EQ09NUElMRV9ERUZJTklUSU9OUzpTVFJJTkc9JHtNQUNST19DSEVDS19GVU5DVElPTl9ERUZJTklUSU9OU30KICAgICAgIiR7Q1VSTF9URVNUX0FERF9MSUJSQVJJRVN9IgogICAgICBPVVRQVVRfVkFSSUFCTEUgT1VUUFVUKQogICAgaWYoJHtDVVJMX1RFU1R9KQogICAgICBzZXQoJHtDVVJMX1RFU1R9IDEgQ0FDSEUgSU5URVJOQUwgIkN1cmwgdGVzdCAke0ZVTkNUSU9OfSIpCiAgICAgIG1lc3NhZ2UoU1RBVFVTICJQZXJmb3JtaW5nIEN1cmwgVGVzdCAke0NVUkxfVEVTVH0gLSBTdWNjZXNzIikKICAgICAgZmlsZShBUFBFTkQgJHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZU91dHB1dC5sb2cKICAgICAgICAiUGVyZm9ybWluZyBDdXJsIFRlc3QgJHtDVVJMX1RFU1R9IHBhc3NlZCB3aXRoIHRoZSBmb2xsb3dpbmcgb3V0cHV0OlxuIgogICAgICAgICIke09VVFBVVH1cbiIpCiAgICBlbHNlKCR7Q1VSTF9URVNUfSkKICAgICAgbWVzc2FnZShTVEFUVVMgIlBlcmZvcm1pbmcgQ3VybCBUZXN0ICR7Q1VSTF9URVNUfSAtIEZhaWxlZCIpCiAgICAgIHNldCgke0NVUkxfVEVTVH0gIiIgQ0FDSEUgSU5URVJOQUwgIkN1cmwgdGVzdCAke0ZVTkNUSU9OfSIpCiAgICAgIGZpbGUoQVBQRU5EICR7Q01BS0VfQklOQVJZX0RJUn0ke0NNQUtFX0ZJTEVTX0RJUkVDVE9SWX0vQ01ha2VFcnJvci5sb2cKICAgICAgICAiUGVyZm9ybWluZyBDdXJsIFRlc3QgJHtDVVJMX1RFU1R9IGZhaWxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgb3V0cHV0OlxuIgogICAgICAgICIke09VVFBVVH1cbiIpCiAgICBlbmRpZigke0NVUkxfVEVTVH0pCiAgZW5kaWYoIiR7Q1VSTF9URVNUfSIgTUFUQ0hFUyAiXiR7Q1VSTF9URVNUfSQiKQplbmRtYWNybyhDVVJMX0lOVEVSTkFMX1RFU1QpCgptYWNybyhDVVJMX0lOVEVSTkFMX1RFU1RfUlVOIENVUkxfVEVTVCkKICBpZigiJHtDVVJMX1RFU1R9X0NPTVBJTEUiIE1BVENIRVMgIl4ke0NVUkxfVEVTVH1fQ09NUElMRSQiKQogICAgc2V0KE1BQ1JPX0NIRUNLX0ZVTkNUSU9OX0RFRklOSVRJT05TCiAgICAgICItRCR7Q1VSTF9URVNUfSAke0NNQUtFX1JFUVVJUkVEX0ZMQUdTfSIpCiAgICBpZihDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMpCiAgICAgIHNldChDVVJMX1RFU1RfQUREX0xJQlJBUklFUwogICAgICAgICItRExJTktfTElCUkFSSUVTOlNUUklORz0ke0NNQUtFX1JFUVVJUkVEX0xJQlJBUklFU30iKQogICAgZW5kaWYoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTKQoKICAgIG1lc3NhZ2UoU1RBVFVTICJQZXJmb3JtaW5nIEN1cmwgVGVzdCAke0NVUkxfVEVTVH0iKQogICAgdHJ5X3J1bigke0NVUkxfVEVTVH0gJHtDVVJMX1RFU1R9X0NPTVBJTEUKICAgICAgJHtDTUFLRV9CSU5BUllfRElSfQogICAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vQ01ha2UvQ3VybFRlc3RzLmMKICAgICAgQ01BS0VfRkxBR1MgLURDT01QSUxFX0RFRklOSVRJT05TOlNUUklORz0ke01BQ1JPX0NIRUNLX0ZVTkNUSU9OX0RFRklOSVRJT05TfQogICAgICAiJHtDVVJMX1RFU1RfQUREX0xJQlJBUklFU30iCiAgICAgIE9VVFBVVF9WQVJJQUJMRSBPVVRQVVQpCiAgICBpZigke0NVUkxfVEVTVH1fQ09NUElMRSBBTkQgTk9UICR7Q1VSTF9URVNUfSkKICAgICAgc2V0KCR7Q1VSTF9URVNUfSAxIENBQ0hFIElOVEVSTkFMICJDdXJsIHRlc3QgJHtGVU5DVElPTn0iKQogICAgICBtZXNzYWdlKFNUQVRVUyAiUGVyZm9ybWluZyBDdXJsIFRlc3QgJHtDVVJMX1RFU1R9IC0gU3VjY2VzcyIpCiAgICBlbHNlKCR7Q1VSTF9URVNUfV9DT01QSUxFIEFORCBOT1QgJHtDVVJMX1RFU1R9KQogICAgICBtZXNzYWdlKFNUQVRVUyAiUGVyZm9ybWluZyBDdXJsIFRlc3QgJHtDVVJMX1RFU1R9IC0gRmFpbGVkIikKICAgICAgc2V0KCR7Q1VSTF9URVNUfSAiIiBDQUNIRSBJTlRFUk5BTCAiQ3VybCB0ZXN0ICR7RlVOQ1RJT059IikKICAgICAgZmlsZShBUFBFTkQgIiR7Q01BS0VfQklOQVJZX0RJUn0ke0NNQUtFX0ZJTEVTX0RJUkVDVE9SWX0vQ01ha2VFcnJvci5sb2ciCiAgICAgICAgIlBlcmZvcm1pbmcgQ3VybCBUZXN0ICR7Q1VSTF9URVNUfSBmYWlsZWQgd2l0aCB0aGUgZm9sbG93aW5nIG91dHB1dDpcbiIKICAgICAgICAiJHtPVVRQVVR9IikKICAgICAgaWYoJHtDVVJMX1RFU1R9X0NPTVBJTEUpCiAgICAgICAgZmlsZShBUFBFTkQKICAgICAgICAgICIke0NNQUtFX0JJTkFSWV9ESVJ9JHtDTUFLRV9GSUxFU19ESVJFQ1RPUll9L0NNYWtlRXJyb3IubG9nIgogICAgICAgICAgIlRoZXJlIHdhcyBhIHByb2JsZW0gcnVubmluZyB0aGlzIHRlc3RcbiIpCiAgICAgIGVuZGlmKCR7Q1VSTF9URVNUfV9DT01QSUxFKQogICAgICBmaWxlKEFQUEVORCAiJHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZUVycm9yLmxvZyIKICAgICAgICAiXG5cbiIpCiAgICBlbmRpZigke0NVUkxfVEVTVH1fQ09NUElMRSBBTkQgTk9UICR7Q1VSTF9URVNUfSkKICBlbmRpZigiJHtDVVJMX1RFU1R9X0NPTVBJTEUiIE1BVENIRVMgIl4ke0NVUkxfVEVTVH1fQ09NUElMRSQiKQplbmRtYWNybyhDVVJMX0lOVEVSTkFMX1RFU1RfUlVOKQoKIyBEbyBjdXJsIHNwZWNpZmljIHRlc3RzCmZvcmVhY2goQ1VSTF9URVNUCiAgICBIQVZFX0ZDTlRMX09fTk9OQkxPQ0sKICAgIEhBVkVfSU9DVExTT0NLRVQKICAgIEhBVkVfSU9DVExTT0NLRVRfQ0FNRUwKICAgIEhBVkVfSU9DVExTT0NLRVRfQ0FNRUxfRklPTkJJTwogICAgSEFWRV9JT0NUTFNPQ0tFVF9GSU9OQklPCiAgICBIQVZFX0lPQ1RMX0ZJT05CSU8KICAgIEhBVkVfSU9DVExfU0lPQ0dJRkFERFIKICAgIEhBVkVfU0VUU09DS09QVF9TT19OT05CTE9DSwogICAgSEFWRV9TT0NLQUREUl9JTjZfU0lONl9TQ09QRV9JRAogICAgVElNRV9XSVRIX1NZU19USU1FCiAgICBIQVZFX09fTk9OQkxPQ0sKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzUKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzcKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzgKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzVfUkVFTlRSQU5UCiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl83X1JFRU5UUkFOVAogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfOF9SRUVOVFJBTlQKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzMKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzUKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzYKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzNfUkVFTlRSQU5UCiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl81X1JFRU5UUkFOVAogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNl9SRUVOVFJBTlQKICAgIEhBVkVfU09DS0xFTl9UCiAgICBIQVZFX0lOX0FERFJfVAogICAgSEFWRV9CT09MX1QKICAgIFNURENfSEVBREVSUwogICAgUkVUU0lHVFlQRV9URVNUCiAgICBIQVZFX0lORVRfTlRPQV9SX0RFQ0wKICAgIEhBVkVfSU5FVF9OVE9BX1JfREVDTF9SRUVOVFJBTlQKICAgIEhBVkVfR0VUQUREUklORk8KICAgIEhBVkVfRklMRV9PRkZTRVRfQklUUwogICAgKQogIGN1cmxfaW50ZXJuYWxfdGVzdCgke0NVUkxfVEVTVH0pCmVuZGZvcmVhY2goQ1VSTF9URVNUKQppZihIQVZFX0ZJTEVfT0ZGU0VUX0JJVFMpCiAgc2V0KF9GSUxFX09GRlNFVF9CSVRTIDY0KQplbmRpZihIQVZFX0ZJTEVfT0ZGU0VUX0JJVFMpCmZvcmVhY2goQ1VSTF9URVNUCiAgICBIQVZFX0dMSUJDX1NUUkVSUk9SX1IKICAgIEhBVkVfUE9TSVhfU1RSRVJST1JfUgogICAgKQogIGN1cmxfaW50ZXJuYWxfdGVzdF9ydW4oJHtDVVJMX1RFU1R9KQplbmRmb3JlYWNoKENVUkxfVEVTVCkKCiMgQ2hlY2sgZm9yIHJlZW50cmFudApmb3JlYWNoKENVUkxfVEVTVAogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfNQogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfNwogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfOAogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfMwogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNQogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNgogICAgSEFWRV9JTkVUX05UT0FfUl9ERUNMX1JFRU5UUkFOVCkKICBpZihOT1QgJHtDVVJMX1RFU1R9KQogICAgaWYoJHtDVVJMX1RFU1R9X1JFRU5UUkFOVCkKICAgICAgc2V0KE5FRURfUkVFTlRSQU5UIDEpCiAgICBlbmRpZigke0NVUkxfVEVTVH1fUkVFTlRSQU5UKQogIGVuZGlmKE5PVCAke0NVUkxfVEVTVH0pCmVuZGZvcmVhY2goQ1VSTF9URVNUKQoKaWYoTkVFRF9SRUVOVFJBTlQpCiAgZm9yZWFjaChDVVJMX1RFU1QKICAgICAgSEFWRV9HRVRIT1NUQllBRERSX1JfNQogICAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl83CiAgICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzgKICAgICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfMwogICAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl81CiAgICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzYpCiAgICBzZXQoJHtDVVJMX1RFU1R9IDApCiAgICBpZigke0NVUkxfVEVTVH1fUkVFTlRSQU5UKQogICAgICBzZXQoJHtDVVJMX1RFU1R9IDEpCiAgICBlbmRpZigke0NVUkxfVEVTVH1fUkVFTlRSQU5UKQogIGVuZGZvcmVhY2goQ1VSTF9URVNUKQplbmRpZihORUVEX1JFRU5UUkFOVCkKCmlmKEhBVkVfSU5FVF9OVE9BX1JfREVDTF9SRUVOVFJBTlQpCiAgc2V0KEhBVkVfSU5FVF9OVE9BX1JfREVDTCAxKQogIHNldChORUVEX1JFRU5UUkFOVCAxKQplbmRpZihIQVZFX0lORVRfTlRPQV9SX0RFQ0xfUkVFTlRSQU5UKQoKIyBTb21lIG90aGVyIG1pbm9yIHRlc3RzCgppZihOT1QgSEFWRV9JTl9BRERSX1QpCiAgc2V0KGluX2FkZHJfdCAidW5zaWduZWQgbG9uZyIpCmVuZGlmKE5PVCBIQVZFX0lOX0FERFJfVCkKCiMgRml4IGxpYnogLyB6bGliLmgKCmlmKE5PVCBDVVJMX1NQRUNJQUxfTElCWikKICBpZihOT1QgSEFWRV9MSUJaKQogICAgc2V0KEhBVkVfWkxJQl9IIDApCiAgZW5kaWYoTk9UIEhBVkVfTElCWikKCiAgaWYoTk9UIEhBVkVfWkxJQl9IKQogICAgc2V0KEhBVkVfTElCWiAwKQogIGVuZGlmKE5PVCBIQVZFX1pMSUJfSCkKZW5kaWYoTk9UIENVUkxfU1BFQ0lBTF9MSUJaKQoKaWYoX0ZJTEVfT0ZGU0VUX0JJVFMpCiAgc2V0KF9GSUxFX09GRlNFVF9CSVRTIDY0KQplbmRpZihfRklMRV9PRkZTRVRfQklUUykKc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTICItRF9GSUxFX09GRlNFVF9CSVRTPTY0IikKc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jdXJsL2N1cmwuaCIpCmNoZWNrX3R5cGVfc2l6ZSgiY3VybF9vZmZfdCIgU0laRU9GX0NVUkxfT0ZGX1QpCnNldChDTUFLRV9FWFRSQV9JTkNMVURFX0ZJTEVTKQpzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MpCgoKIyBDaGVjayBmb3Igbm9uYmxvY2tpbmcKc2V0KEhBVkVfRElTQUJMRURfTk9OQkxPQ0tJTkcgMSkKaWYoSEFWRV9GSU9OQklPIE9SCiAgICBIQVZFX0lPQ1RMU09DS0VUIE9SCiAgICBIQVZFX0lPQ1RMU09DS0VUX0NBU0UgT1IKICAgIEhBVkVfT19OT05CTE9DSykKICBzZXQoSEFWRV9ESVNBQkxFRF9OT05CTE9DS0lORykKZW5kaWYoSEFWRV9GSU9OQklPIE9SCiAgSEFWRV9JT0NUTFNPQ0tFVCBPUgogIEhBVkVfSU9DVExTT0NLRVRfQ0FTRSBPUgogIEhBVkVfT19OT05CTE9DSykKCmlmKFJFVFNJR1RZUEVfVEVTVCkKICBzZXQoUkVUU0lHVFlQRSB2b2lkKQplbHNlKFJFVFNJR1RZUEVfVEVTVCkKICBzZXQoUkVUU0lHVFlQRSBpbnQpCmVuZGlmKFJFVFNJR1RZUEVfVEVTVCkKCmlmKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNDIEFORCBBUFBMRSkKICBpbmNsdWRlKENoZWNrQ0NvbXBpbGVyRmxhZykKICBjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVduby1sb25nLWRvdWJsZSBIQVZFX0NfRkxBR19Xbm9fbG9uZ19kb3VibGUpCiAgaWYoSEFWRV9DX0ZMQUdfV25vX2xvbmdfZG91YmxlKQogICAgIyBUaGUgTWFjIHZlcnNpb24gb2YgR0NDIHdhcm5zIGFib3V0IHVzZSBvZiBsb25nIGRvdWJsZS4gIERpc2FibGUgaXQuCiAgICBnZXRfc291cmNlX2ZpbGVfcHJvcGVydHkoTVBSSU5URl9DT01QSUxFX0ZMQUdTIG1wcmludGYuYyBDT01QSUxFX0ZMQUdTKQogICAgaWYoTVBSSU5URl9DT01QSUxFX0ZMQUdTKQogICAgICBzZXQoTVBSSU5URl9DT01QSUxFX0ZMQUdTICIke01QUklOVEZfQ09NUElMRV9GTEFHU30gLVduby1sb25nLWRvdWJsZSIpCiAgICBlbHNlKE1QUklOVEZfQ09NUElMRV9GTEFHUykKICAgICAgc2V0KE1QUklOVEZfQ09NUElMRV9GTEFHUyAiLVduby1sb25nLWRvdWJsZSIpCiAgICBlbmRpZihNUFJJTlRGX0NPTVBJTEVfRkxBR1MpCiAgICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMobXByaW50Zi5jIFBST1BFUlRJRVMKICAgICAgQ09NUElMRV9GTEFHUyAke01QUklOVEZfQ09NUElMRV9GTEFHU30pCiAgZW5kaWYoSEFWRV9DX0ZMQUdfV25vX2xvbmdfZG91YmxlKQplbmRpZihDTUFLRV9DT01QSUxFUl9JU19HTlVDQyBBTkQgQVBQTEUpCgppZihIQVZFX1NPQ0tMRU5fVCkKICBzZXQoQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QgInNvY2tsZW5fdCIpCiAgaWYoV0lOMzIpCiAgICBzZXQoQ01BS0VfRVhUUkFfSU5DTFVERV9GSUxFUyAid2luc29jazIuaDt3czJ0Y3BpcC5oIikKICBlbHNlaWYoSEFWRV9TWVNfU09DS0VUX0gpCiAgICBzZXQoQ01BS0VfRVhUUkFfSU5DTFVERV9GSUxFUyAic3lzL3NvY2tldC5oIikKICBlbmRpZigpCiAgY2hlY2tfdHlwZV9zaXplKCJzb2NrbGVuX3QiIENVUkxfU0laRU9GX0NVUkxfU09DS0xFTl9UKQogIHNldChDTUFLRV9FWFRSQV9JTkNMVURFX0ZJTEVTKQogIGlmKE5PVCBIQVZFX0NVUkxfU0laRU9GX0NVUkxfU09DS0xFTl9UKQogICAgbWVzc2FnZShGQVRBTF9FUlJPUiAKICAgICAiQ2hlY2sgZm9yIHNpemVvZiBzb2NrbGVuX3QgZmFpbGVkLCBzZWUgQ01ha2VGaWxlcy9DTWFrZXJyb3IubG9nIikKICBlbmRpZigpCmVsc2UoKQogIHNldChDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBpbnQpCiAgc2V0KENVUkxfU0laRU9GX0NVUkxfU09DS0xFTl9UICR7U0laRU9GX0lOVH0pCmVuZGlmKCkKCmluY2x1ZGUoQ01ha2UvT3RoZXJUZXN0cy5jbWFrZSkKCmFkZF9kZWZpbml0aW9ucygtREhBVkVfQ09ORklHX0gpCgojIEZvciB3aW5kb3dzLCBkbyBub3QgYWxsb3cgdGhlIGNvbXBpbGVyIHRvIHVzZSBkZWZhdWx0IHRhcmdldCAoVmlzdGEpLgppZihXSU4zMikKICBhZGRfZGVmaW5pdGlvbnMoLURfV0lOMzJfV0lOTlQ9MHgwNTAxKQplbmRpZihXSU4zMikKCmlmKE1TVkMpCiAgYWRkX2RlZmluaXRpb25zKC1EX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIC1EX0NSVF9OT05TVERDX05PX0RFUFJFQ0FURSkKZW5kaWYoTVNWQykKCiMgU2V0cyB1cCB0aGUgZGVwZW5kZW5jaWVzICh6bGliLCBPcGVuU1NMLCBldGMuKSBvZiBhIGNVUkwgc3VicHJvamVjdCBhY2NvcmRpbmcgdG8gb3B0aW9ucy4KIyBUT0RPIFRoaXMgaXMgZmFyIHRvIGJlIGNvbXBsZXRlIQpmdW5jdGlvbihTRVRVUF9DVVJMX0RFUEVOREVOQ0lFUyBUQVJHRVRfTkFNRSkKICBpZihDVVJMX1pMSUIgQU5EIFpMSUJfRk9VTkQpCiAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7WkxJQl9JTkNMVURFX0RJUn0pCiAgZW5kaWYoKQogIGlmKENVUkxfWkxJQiBBTkQgWkxJQl9GT1VORCkKICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke1RBUkdFVF9OQU1FfSAke1pMSUJfTElCUkFSSUVTfSkKICAgICNBRERfREVGSU5JVElPTlMoIC1ESEFWRV9aTElCX0ggLURIQVZFX1pMSUIgLURIQVZFX0xJQlogKQogIGVuZGlmKCkKCiAgaWYoQ01BS0VfVVNFX09QRU5TU0wgQU5EIE9QRU5TU0xfRk9VTkQpCiAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7T1BFTlNTTF9JTkNMVURFX0RJUn0pCiAgZW5kaWYoKQogIGlmKENNQUtFX1VTRV9PUEVOU1NMIEFORCBDVVJMX0NPTkZJR19IQVNfQkVFTl9SVU5fQkVGT1JFKQogICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7VEFSR0VUX05BTUV9ICR7T1BFTlNTTF9MSUJSQVJJRVN9KQogICAgI0FERF9ERUZJTklUSU9OUyggLURVU0VfU1NMRUFZICkKICBlbmRpZigpCmVuZGZ1bmN0aW9uKCkKCiMgVWdseSAoYnV0IGZ1bmN0aW9uYWwpIHdheSB0byBpbmNsdWRlICJNYWtlZmlsZS5pbmMiIGJ5IHRyYW5zZm9ybWluZyBpdCAoPSByZWdlbmVyYXRlIGl0KS4KZnVuY3Rpb24oVFJBTlNGT1JNX01BS0VGSUxFX0lOQyBJTlBVVF9GSUxFIE9VVFBVVF9GSUxFKQogIGZpbGUoUkVBRCAke0lOUFVUX0ZJTEV9IE1BS0VGSUxFX0lOQ19URVhUKQogIHN0cmluZyhSRVBMQUNFICIkKHRvcF9zcmNkaXIpIiAgICJcJHtDVVJMX1NPVVJDRV9ESVJ9IiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkKICBzdHJpbmcoUkVQTEFDRSAiJCh0b3BfYnVpbGRkaXIpIiAiXCR7Q1VSTF9CSU5BUllfRElSfSIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pCgogIHN0cmluZyhSRUdFWCBSRVBMQUNFICJcXFxcXG4iICKnIaciIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KQogIHN0cmluZyhSRUdFWCBSRVBMQUNFICIoW2EtekEtWl9dW2EtekEtWjAtOV9dKilbXHQgXSo9W1x0IF0qKFteXG5dKikiICJTRVQoXFwxIFxcMikiIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KQogIHN0cmluZyhSRVBMQUNFICKnIaciICJcbiIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pCgogIHN0cmluZyhSRUdFWCBSRVBMQUNFICJcXCRcXCgoW2EtekEtWl9dW2EtekEtWjAtOV9dKilcXCkiICJcJHtcXDF9IiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkgICAgIyBSZXBsYWNlICQoKSB3aXRoICR7fQogIHN0cmluZyhSRUdFWCBSRVBMQUNFICJAKFthLXpBLVpfXVthLXpBLVowLTlfXSopQCIgIlwke1xcMX0iIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KSAgICAjIFJlcGxhY2UgQEAgd2l0aCAke30sIGV2ZW4gaWYgdGhhdCBtYXkgbm90IGJlIHJlYWQgYnkgQ01ha2Ugc2NyaXB0cy4KICBmaWxlKFdSSVRFICR7T1VUUFVUX0ZJTEV9ICR7TUFLRUZJTEVfSU5DX1RFWFR9KQoKZW5kZnVuY3Rpb24oKQoKYWRkX3N1YmRpcmVjdG9yeShsaWIpCmlmKEJVSUxEX0NVUkxfRVhFKQogIGFkZF9zdWJkaXJlY3Rvcnkoc3JjKQplbmRpZigpCmlmKEJVSUxEX0NVUkxfVEVTVFMpCiAgYWRkX3N1YmRpcmVjdG9yeSh0ZXN0cykKZW5kaWYoKQoKIyBUaGlzIG5lZWRzIHRvIGJlIHJ1biB2ZXJ5IGxhc3Qgc28gb3RoZXIgcGFydHMgb2YgdGhlIHNjcmlwdHMgY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoaXMuCmlmKE5PVCBDVVJMX0NPTkZJR19IQVNfQkVFTl9SVU5fQkVGT1JFKQogIHNldChDVVJMX0NPTkZJR19IQVNfQkVFTl9SVU5fQkVGT1JFIDEgQ0FDSEUgSU5URVJOQUwgIkZsYWcgdG8gdHJhY2sgd2hldGhlciB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHJ1bm5pbmcgQ01ha2Ugb3IgaWYgQ01ha2UgaGFzIGJlZW4gY29uZmlndXJlZCBiZWZvcmUiKQplbmRpZigpCg==