CmRubApkbmwgR0xJQkNYWF9DT05ESVRJT05BTCAoTkFNRSwgU0hFTEwtVEVTVCkKZG5sCmRubCBFeGFjdGx5IGxpa2UgQU1fQ09ORElUSU9OQUwsIGJ1dCBkZWxheXMgZXZhbHVhdGlvbiBvZiB0aGUgdGVzdCB1bnRpbCB0aGUKZG5sIGVuZCBvZiBjb25maWd1cmUuICBUaGlzIGxldHMgdGVzdGVkIHZhcmlhYmxlcyBiZSByZWFzc2lnbmVkLCBhbmQgdGhlCmRubCBjb25kaXRpb25hbCB3aWxsIGRlcGVuZCBvbiB0aGUgZmluYWwgc3RhdGUgb2YgdGhlIHZhcmlhYmxlLiAgRm9yIGEgc2ltcGxlCmRubCBleGFtcGxlIG9mIHdoeSB0aGlzIGlzIG5lZWRlZCwgc2VlIEdMSUJDWFhfRU5BQkxFX0hPU1RFRC4KZG5sCm00X2RlZmluZShbX200X2RpdmVydChnbGliY3h4X2RpdmVyc2lvbildLCA4MDAwKWRubApBQ19ERUZVTihbR0xJQkNYWF9DT05ESVRJT05BTF0sIFtkbmwKICBtNF9kaXZlcnRfdGV4dChbZ2xpYmN4eF9kaXZlcnNpb25dLGRubAogICBBTV9DT05ESVRJT05BTChbJDFdLFskMl0pCiAgKWRubApdKWRubApBQ19ERUZVTihbR0xJQkNYWF9FVkFMVUFURV9DT05ESVRJT05BTFNdLCBbbTRfdW5kaXZlcnQoW2dsaWJjeHhfZGl2ZXJzaW9uXSldKWRubAoKCmRubApkbmwgQ2hlY2sgdG8gc2VlIHdoYXQgYXJjaGl0ZWN0dXJlIGFuZCBvcGVyYXRpbmcgc3lzdGVtIHdlIGFyZSBjb21waWxpbmcKZG5sIGZvci4gIEFsc28sIGlmIGFyY2hpdGVjdHVyZS0gb3IgT1Mtc3BlY2lmaWMgZmxhZ3MgYXJlIHJlcXVpcmVkIGZvcgpkbmwgY29tcGlsYXRpb24sIHBpY2sgdGhlbSB1cCBoZXJlLgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfQ0hFQ0tfSE9TVF0sIFsKICAuICRnbGliY3h4X3NyY2Rpci9jb25maWd1cmUuaG9zdAogIEFDX01TR19OT1RJQ0UoW0NQVSBjb25maWcgZGlyZWN0b3J5IGlzICRjcHVfaW5jbHVkZV9kaXJdKQogIEFDX01TR19OT1RJQ0UoW09TIGNvbmZpZyBkaXJlY3RvcnkgaXMgJG9zX2luY2x1ZGVfZGlyXSkKXSkKCmRubApkbmwgSW5pdGlhbGl6ZSB0aGUgcmVzdCBvZiB0aGUgbGlicmFyeSBjb25maWd1cnkuICBBdCB0aGlzIHBvaW50IHdlIGhhdmUKZG5sIHZhcmlhYmxlcyBsaWtlICRob3N0LgpkbmwKZG5sIFNldHM6CmRubCAgU1VCRElSUwpkbmwgU3Vic3RzOgpkbmwgIGdsaWJjeHhfYnVpbGRkaXIgICAgIChhYnNvbHV0ZSBwYXRoKQpkbmwgIGdsaWJjeHhfc3JjZGlyICAgICAgIChhYnNvbHV0ZSBwYXRoKQpkbmwgIHRvcGxldmVsX3NyY2RpciAgICAgIChhYnNvbHV0ZSBwYXRoKQpkbmwgIHdpdGhfY3Jvc3NfaG9zdApkbmwgIHdpdGhfbmV3bGliCmRubCAgd2l0aF90YXJnZXRfc3ViZGlyCmRubCBwbHVzCmRubCAgLSB0aGUgdmFyaWFibGVzIGluIEdMSUJDWFhfQ0hFQ0tfSE9TVCAvIGNvbmZpZ3VyZS5ob3N0CmRubCAgLSBkZWZhdWx0IHNldHRpbmdzIGZvciBhbGwgQU1fQ09ORklUSU9OQUwgdGVzdCB2YXJpYWJsZXMKZG5sICAtIGxvdHMgb2YgdG9vbHMsIGxpa2UgQ0MgYW5kIENYWApkbmwKQUNfREVGVU4oW0dMSUJDWFhfQ09ORklHVVJFXSwgWwogICMgS2VlcCB0aGVzZSBzeW5jJ2Qgd2l0aCB0aGUgbGlzdCBpbiBNYWtlZmlsZS5hbS4gIFRoZSBmaXJzdCBwcm92aWRlcyBhbgogICMgZXhwYW5kYWJsZSBsaXN0IGF0IGF1dG9jb25mIHRpbWU7IHRoZSBzZWNvbmQgcHJvdmlkZXMgYW4gZXhwYW5kYWJsZSBsaXN0CiAgIyAoaS5lLiwgc2hlbGwgdmFyaWFibGUpIGF0IGNvbmZpZ3VyZSB0aW1lLgogIG00X2RlZmluZShbZ2xpYmN4eF9TVUJESVJTXSxbaW5jbHVkZSBsaWJzdXBjKysgc3JjIGRvYyBwbyB0ZXN0c3VpdGVdKQogIFNVQkRJUlM9J2dsaWJjeHhfU1VCRElSUycKCiAgIyBUaGVzZSBuZWVkIHRvIGJlIGFic29sdXRlIHBhdGhzLCB5ZXQgYXQgdGhlIHNhbWUgdGltZSBuZWVkIHRvCiAgIyBjYW5vbmljYWxpemUgb25seSByZWxhdGl2ZSBwYXRocywgYmVjYXVzZSB0aGVuIGFtZCB3aWxsIG5vdCB1bm1vdW50CiAgIyBkcml2ZXMuIFRodXMgdGhlIHVzZSBvZiBQV0RDTUQ6IHNldCBpdCB0byAncGF3ZCcgb3IgJ2FtcSAtdycgaWYgdXNpbmcgYW1kLgogIGdsaWJjeHhfYnVpbGRkaXI9YCR7UFdEQ01ELXB3ZH1gCiAgY2FzZSAkc3JjZGlyIGluCiAgICBbXFwvJF0qIHwgPzpbXFwvXSopIGdsaWJjeHhfc3JjZGlyPSR7c3JjZGlyfSA7OwogICAgKikgZ2xpYmN4eF9zcmNkaXI9YGNkICIkc3JjZGlyIiAmJiAke1BXRENNRC1wd2R9IHx8IGVjaG8gIiRzcmNkaXIiYCA7OwogIGVzYWMKICB0b3BsZXZlbF9zcmNkaXI9JHtnbGliY3h4X3NyY2Rpcn0vLi4KICBBQ19TVUJTVChnbGliY3h4X2J1aWxkZGlyKQogIEFDX1NVQlNUKGdsaWJjeHhfc3JjZGlyKQogIEFDX1NVQlNUKHRvcGxldmVsX3NyY2RpcikKCiAgIyBXZSB1c2UgdGhlc2Ugb3B0aW9ucyB0byBkZWNpZGUgd2hpY2ggZnVuY3Rpb25zIHRvIGluY2x1ZGUuICBUaGV5IGFyZQogICMgc2V0IGZyb20gdGhlIHRvcCBsZXZlbC4KICBBQ19BUkdfV0lUSChbdGFyZ2V0LXN1YmRpcl0sCiAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLXRhcmdldC1zdWJkaXI9U1VCRElSXSwKICAgICAgICAgICAgICAgICAgIFtjb25maWd1cmluZyBpbiBhIHN1YmRpcmVjdG9yeV0pKQoKICBBQ19BUkdfV0lUSChbY3Jvc3MtaG9zdF0sCiAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLWNyb3NzLWhvc3Q9SE9TVF0sCiAgICAgICAgICAgICAgICAgICBbY29uZmlndXJpbmcgd2l0aCBhIGNyb3NzIGNvbXBpbGVyXSkpCgogIEFDX0FSR19XSVRIKFtuZXdsaWJdLAogICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1uZXdsaWJdLAogICAgICAgICAgICAgICAgICAgW2Fzc3VtZSBuZXdsaWIgYXMgYSBzeXN0ZW0gQyBsaWJyYXJ5XSkpCgogICMgV2UncmUgYWxtb3N0IGNlcnRhaW5seSBiZWluZyBjb25maWd1cmVkIGJlZm9yZSBhbnl0aGluZyBlbHNlIHdoaWNoIHVzZXMKICAjIEMrKywgc28gYWxsIG9mIG91ciBBQ19QUk9HXyogZGlzY292ZXJpZXMgd2lsbCBiZSBjYWNoZWQuICBJdCdzIHZpdGFsIHRoYXQKICAjIHdlIG5vdCBjYWNoZSB0aGUgdmFsdWUgb2YgQ1hYIHRoYXQgd2UgImRpc2NvdmVyIiBoZXJlLCBiZWNhdXNlIGl0J3Mgc2V0CiAgIyB0byBzb21ldGhpbmcgdW5pcXVlIGZvciB1cyBhbmQgbGliamF2YS4gIE90aGVyIHRhcmdldCBsaWJyYXJpZXMgbmVlZCB0bwogICMgZmluZCBDWFggZm9yIHRoZW1zZWx2ZXMuICBXZSB5YW5rIHRoZSBydWcgb3V0IGZyb20gdW5kZXIgdGhlIG5vcm1hbCBBQ18qCiAgIyBwcm9jZXNzIGJ5IHNuZWFraWx5IHJlbmFtaW5nIHRoZSBjYWNoZSB2YXJpYWJsZS4gIFRoaXMgYWxzbyBsZXRzIHVzIGRlYnVnCiAgIyB0aGUgdmFsdWUgb2YgIm91ciIgQ1hYIGluIHBvc3Rtb3J0ZW1zLgogICMKICAjIFdlIG11c3QgYWxzbyBmb3JjZSBDWFggdG8gL25vdC8gYmUgYSBwcmVjaW91cyB2YXJpYWJsZSwgb3RoZXJ3aXNlIHRoZQogICMgd3JvbmcgKG5vbi1tdWx0aWxpYi1hZGp1c3RlZCkgdmFsdWUgd2lsbCBiZSB1c2VkIGluIG11bHRpbGlicy4gIFRoaXMKICAjIGxpdHRsZSB0cmljayBhbHNvIGFmZmVjdHMgQ1BQRkxBR1MsIENYWEZMQUdTLCBhbmQgTERGTEFHUy4gIEFuZCBhcyBhIHNpZGUKICAjIGVmZmVjdCwgQ1hYRkxBR1MgaXMgbm8gbG9uZ2VyIGF1dG9tYWdpY2FsbHkgc3Vic3QnZCwgc28gd2UgaGF2ZSB0byBkbwogICMgdGhhdCBvdXJzZWx2ZXMuICBVbi1wcmVjaW91c2luZyBBQ19QUk9HX0NDIGFsc28gYWZmZWN0cyBDQyBhbmQgQ0ZMQUdTLgogICMKICAjIC1mbm8tYnVpbHRpbiBtdXN0IGJlIHByZXNlbnQgaGVyZSBzbyB0aGF0IGEgbm9uLWNvbmZsaWN0aW5nIGZvcm0gb2YKICAjIHN0ZDo6ZXhpdCBjYW4gYmUgZ3Vlc3NlZCBieSBBQ19QUk9HX0NYWCwgYW5kIHVzZWQgaW4gbGF0ZXIgdGVzdHMuCgogIG00X2RlZmluZShbYWNfY3ZfcHJvZ19DWFhdLFtnbGliY3h4X2N2X3Byb2dfQ1hYXSkKICBtNF9yZW5hbWUoW19BQ19BUkdfVkFSX1BSRUNJT1VTXSxbZ2xpYmN4eF9QUkVDSU9VU10pCiAgbTRfZGVmaW5lKFtfQUNfQVJHX1ZBUl9QUkVDSU9VU10sW10pCiAgc2F2ZV9DWFhGTEFHUz0iJENYWEZMQUdTIgogIENYWEZMQUdTPSIkQ1hYRkxBR1MgLWZuby1idWlsdGluIgogIEFDX1BST0dfQ0MKICBBQ19QUk9HX0NYWAogIENYWEZMQUdTPSIkc2F2ZV9DWFhGTEFHUyIKICBtNF9yZW5hbWUoW2dsaWJjeHhfUFJFQ0lPVVNdLFtfQUNfQVJHX1ZBUl9QUkVDSU9VU10pCiAgQUNfU1VCU1QoQ0ZMQUdTKQogIEFDX1NVQlNUKENYWEZMQUdTKQoKICAjIFdpbGwgc2V0IExOX1MgdG8gZWl0aGVyICdsbiAtcycsICdsbicsIG9yICdjcCAtcCcgKGlmIGxpbmtpbmcgaXNuJ3QKICAjIGF2YWlsYWJsZSkuICBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBmb3JjZSBhIHBhcnRpY3VsYXIgbWV0aG9kLgogIEFDX1BST0dfTE5fUwogICNMTl9TPSdjcCAtcCcKCiAgQUNfQ0hFQ0tfVE9PTChBUywgYXMpCiAgQUNfQ0hFQ0tfVE9PTChBUiwgYXIpCiAgQUNfQ0hFQ0tfVE9PTChSQU5MSUIsIHJhbmxpYiwgcmFubGliLW5vdC1mb3VuZC1pbi1wYXRoLWVycm9yKQoKICBBTV9NQUlOVEFJTkVSX01PREUKCiAgIyBTZXQgdXAgc2FmZSBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIHN1YnNlcXVlbnQgQU1fQ09ORElUSU9OQUwgdGVzdHMKICAjIHdoaWNoIGFyZSB0aGVtc2VsdmVzIGNvbmRpdGlvbmFsbHkgZXhwYW5kZWQuCiAgIyMgKFJpZ2h0IG5vdywgdGhpcyBvbmx5IG1hdHRlcnMgZm9yIGVuYWJsZV93Y2hhcl90LCBidXQgbm90aGluZyBwcmV2ZW50cwogICMjIG90aGVyIG1hY3JvcyBmcm9tIGRvaW5nIHRoZSBzYW1lLiAgVGhpcyBzaG91bGQgYmUgYXV0b21hdGVkLikgIC1wbWUKCiAgIyBDaGVjayBmb3IgdUNsaWJjIHNpbmNlIExpbnV4IHBsYXRmb3JtcyB1c2UgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24KICAjIGRpcmVjdG9yaWVzIGRlcGVuZGluZyBvbiB0aGUgQyBsaWJyYXJ5IGluIHVzZS4KICBBQ19FR1JFUF9DUFAoW191c2luZ191Y2xpYmNdLCBbCiAgI2luY2x1ZGUgPHN0ZGlvLmg+CiAgI2lmIF9fVUNMSUJDX18KICAgIF91c2luZ191Y2xpYmMKICAjZW5kaWYKICBdLCB1Y2xpYmM9eWVzLCB1Y2xpYmM9bm8pCgogICMgRmluZCBwbGF0Zm9ybS1zcGVjaWZpYyBkaXJlY3RvcmllcyBjb250YWluaW5nIGNvbmZpZ3VyYXRpb24gaW5mby4KICAjIEFsc28gcG9zc2libHkgbW9kaWZ5IGZsYWdzIHVzZWQgZWxzZXdoZXJlLCBhcyBuZWVkZWQgYnkgdGhlIHBsYXRmb3JtLgogIEdMSUJDWFhfQ0hFQ0tfSE9TVApdKQoKCmRubApkbmwgVGVzdHMgZm9yIG5ld2VyIGNvbXBpbGVyIGZlYXR1cmVzLCBvciBmZWF0dXJlcyB0aGF0IGFyZSBwcmVzZW50IGluIG5ld2VyCmRubCBjb21waWxlciB2ZXJzaW9ucyBidXQgbm90IG9sZGVyIGNvbXBpbGVyIHZlcnNpb25zIHN0aWxsIGluIHVzZSwgc2hvdWxkCmRubCBiZSBwbGFjZWQgaGVyZS4KZG5sCmRubCBEZWZpbmVzOgpkbmwgIFdFUlJPUj0nLVdlcnJvcicgaWYgcmVxdWVzdGVkIGFuZCBwb3NzaWJsZTsgZysrJ3MgdGhhdCBsYWNrIHRoZQpkbmwgICBuZXcgaW5saW5pbmcgY29kZSBvciB0aGUgbmV3IHN5c3RlbV9oZWFkZXIgcHJhZ21hIHdpbGwgZGllIG9uIC1XZXJyb3IuCmRubCAgIExlYXZlIGl0IG91dCBieSBkZWZhdWx0IGFuZCB1c2UgbWFpbnQtbW9kZSB0byB1c2UgaXQuCmRubCAgU0VDVElPTl9GTEFHUz0nLWZmdW5jdGlvbi1zZWN0aW9ucyAtZmRhdGEtc2VjdGlvbnMnIGlmCmRubCAgIGNvbXBpbGVyIHN1cHBvcnRzIGl0IGFuZCB0aGUgdXNlciBoYXMgbm90IHJlcXVlc3RlZCBkZWJ1ZyBtb2RlLgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfQ0hFQ0tfQ09NUElMRVJfRkVBVFVSRVNdLCBbCiAgIyBBbGwgdGhlc2UgdGVzdHMgYXJlIGZvciBDKys7IHNhdmUgdGhlIGxhbmd1YWdlIGFuZCB0aGUgY29tcGlsZXIgZmxhZ3MuCiAgIyBUaGUgQ1hYRkxBR1MgdGhpbmcgaXMgc3VzcGljaW91cywgYnV0IGJhc2VkIG9uIHNpbWlsYXIgYml0cyBwcmV2aW91c2x5CiAgIyBmb3VuZCBpbiBHTElCQ1hYX0NPTkZJR1VSRS4KICBBQ19MQU5HX1NBVkUKICBBQ19MQU5HX0NQTFVTUExVUwogIGFjX3Rlc3RfQ1hYRkxBR1M9IiR7Q1hYRkxBR1Mrc2V0fSIKICBhY19zYXZlX0NYWEZMQUdTPSIkQ1hYRkxBR1MiCgogICMgQ2hlY2sgZm9yIG1haW50YWluZXItbW9kZSBiaXRzLgogIGlmIHRlc3QgeCIkVVNFX01BSU5UQUlORVJfTU9ERSIgPSB4bm87IHRoZW4KICAgIFdFUlJPUj0nJwogIGVsc2UKICAgIFdFUlJPUj0nLVdlcnJvcicKICBmaQoKICAjIENoZWNrIGZvciAtZmZ1bmN0aW9uLXNlY3Rpb25zIC1mZGF0YS1zZWN0aW9ucwogIEFDX01TR19DSEVDS0lORyhbZm9yIGcrKyB0aGF0IHN1cHBvcnRzIC1mZnVuY3Rpb24tc2VjdGlvbnMgLWZkYXRhLXNlY3Rpb25zXSkKICBDWFhGTEFHUz0nLWcgLVdlcnJvciAtZmZ1bmN0aW9uLXNlY3Rpb25zIC1mZGF0YS1zZWN0aW9ucycKICBBQ19UUllfQ09NUElMRShbaW50IGZvbzsgdm9pZCBiYXIoKSB7IH07XSwsIFthY19mZHNlY3Rpb25zPXllc10sIFthY19mZHNlY3Rpb25zPW5vXSkKICBpZiB0ZXN0ICIkYWNfdGVzdF9DWFhGTEFHUyIgPSBzZXQ7IHRoZW4KICAgIENYWEZMQUdTPSIkYWNfc2F2ZV9DWFhGTEFHUyIKICBlbHNlCiAgICAjIHRoaXMgaXMgdGhlIHN1c3BpY2lvdXMgcGFydAogICAgQ1hYRkxBR1M9JycKICBmaQogIGlmIHRlc3QgeCIkYWNfZmRzZWN0aW9ucyIgPSB4InllcyI7IHRoZW4KICAgIFNFQ1RJT05fRkxBR1M9Jy1mZnVuY3Rpb24tc2VjdGlvbnMgLWZkYXRhLXNlY3Rpb25zJwogIGZpCiAgQUNfTVNHX1JFU1VMVCgkYWNfZmRzZWN0aW9ucykKCiAgQUNfTEFOR19SRVNUT1JFCiAgQUNfU1VCU1QoV0VSUk9SKQogIEFDX1NVQlNUKFNFQ1RJT05fRkxBR1MpCl0pCgoKZG5sCmRubCBJZiBHTlUgbGQgaXMgaW4gdXNlLCBjaGVjayB0byBzZWUgaWYgdHJpY2t5IGxpbmtlciBvcHRzIGNhbiBiZSB1c2VkLiAgSWYKZG5sIHRoZSBuYXRpdmUgbGlua2VyIGlzIGluIHVzZSwgYWxsIHZhcmlhYmxlcyB3aWxsIGJlIGRlZmluZWQgdG8gc29tZXRoaW5nCmRubCBzYWZlIChsaWtlIGFuIGVtcHR5IHN0cmluZykuCmRubApkbmwgRGVmaW5lczoKZG5sICBTRUNUSU9OX0xERkxBR1M9Jy1XbCwtLWdjLXNlY3Rpb25zJyBpZiBwb3NzaWJsZQpkbmwgIE9QVF9MREZMQUdTPSctV2wsLU8xJyBhbmQgJy16LHJlbHJvJyBpZiBwb3NzaWJsZQpkbmwgIExEIChhcyBhIHNpZGUgZWZmZWN0IG9mIHRlc3RpbmcpCmRubCBTZXRzOgpkbmwgIHdpdGhfZ251X2xkCmRubCAgZ2xpYmN4eF9sZF9pc19nb2xkIChzZXQgdG8gIm5vIiBvciAieWVzIikKZG5sICBnbGliY3h4X2dudV9sZF92ZXJzaW9uIChwb3NzaWJseSkKZG5sCmRubCBUaGUgbGFzdCB3aWxsIGJlIGEgc2luZ2xlIGludGVnZXIsIGUuZy4sIHZlcnNpb24gMS4yMy40NS4wLjY3Ljg5IHdpbGwKZG5sIHNldCBnbGliY3h4X2dudV9sZF92ZXJzaW9uIHRvIDEyMzQ1LiAgWmVyb3MgY2F1c2UgcHJvYmxlbXMuCmRubApBQ19ERUZVTihbR0xJQkNYWF9DSEVDS19MSU5LRVJfRkVBVFVSRVNdLCBbCiAgIyBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gZXZlbiB0cnlpbmcgdGhlc2UKICAjIHRlc3RzLiAgQ2hlY2sgZm9yIHRoYXQgZmlyc3QuICBXZSBzaG91bGQgaGF2ZSBhbHJlYWR5IHRlc3RlZCBmb3IgZ2xkCiAgIyBieSBub3cgKGluIGxpYnRvb2wpLCBidXQgcmVxdWlyZSBpdCBub3cganVzdCB0byBiZSBzYWZlLi4uCiAgdGVzdCAteiAiJFNFQ1RJT05fTERGTEFHUyIgJiYgU0VDVElPTl9MREZMQUdTPScnCiAgdGVzdCAteiAiJE9QVF9MREZMQUdTIiAmJiBPUFRfTERGTEFHUz0nJwogIEFDX1JFUVVJUkUoW0FDX1BST0dfTERdKQogIEFDX1JFUVVJUkUoW0FDX1BST0dfQVdLXSkKCiAgIyBUaGUgbmFtZSBzZXQgYnkgbGlidG9vbCBkZXBlbmRzIG9uIHRoZSB2ZXJzaW9uIG9mIGxpYnRvb2wuICBTaGFtZSBvbiB1cwogICMgZm9yIGRlcGVuZGluZyBvbiBhbiBpbXBsIGRldGFpbCwgYnV0IGMnZXN0IGxhIHZpZS4gIE9sZGVyIHZlcnNpb25zIHVzZWQKICAjIGFjX2N2X3Byb2dfZ251X2xkLCBidXQgbm93IGl0J3MgbHRfY3ZfcHJvZ19nbnVfbGQsIGFuZCBpcyBjb3BpZWQgYmFjayBvbgogICMgdG9wIG9mIHdpdGhfZ251X2xkICh3aGljaCBpcyBhbHNvIHNldCBieSAtLXdpdGgtZ251LWxkLCBzbyB0aGF0IGFjdHVhbGx5CiAgIyBtYWtlcyBzZW5zZSkuICBXZSdsbCB0ZXN0IHdpdGhfZ251X2xkIGV2ZXJ5d2hlcmUgZWxzZSwgc28gaWYgdGhhdCBpc24ndAogICMgc2V0IChoZW5jZSB3ZSdyZSB1c2luZyBhbiBvbGRlciBsaWJ0b29sKSwgdGhlbiBzZXQgaXQuCiAgaWYgdGVzdCB4JHt3aXRoX2dudV9sZCtzZXR9ICE9IHhzZXQ7IHRoZW4KICAgIGlmIHRlc3QgeCR7YWNfY3ZfcHJvZ19nbnVfbGQrc2V0fSAhPSB4c2V0OyB0aGVuCiAgICAgICMgV2UgZ290IHRocm91Z2ggImFjX3JlcXVpcmUoYWNfcHJvZ19sZCkiIGFuZCBzdGlsbCBub3Qgc2V0PyAgSHVoPwogICAgICB3aXRoX2dudV9sZD1ubwogICAgZWxzZQogICAgICB3aXRoX2dudV9sZD0kYWNfY3ZfcHJvZ19nbnVfbGQKICAgIGZpCiAgZmkKCiAgIyBTdGFydCBieSBnZXR0aW5nIHRoZSB2ZXJzaW9uIG51bWJlci4gIEkgdGhpbmsgdGhlIGxpYnRvb2wgdGVzdCBhbHJlYWR5CiAgIyBkb2VzIHNvbWUgb2YgdGhpcywgYnV0IHRocm93cyBhd2F5IHRoZSByZXN1bHQuCiAgZ2xpYmN4eF9sZF9pc19nb2xkPW5vCiAgaWYgdGVzdCB4IiR3aXRoX2dudV9sZCIgPSB4InllcyI7IHRoZW4KICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGxkIHZlcnNpb25dKQogICAgY2hhbmdlcXVvdGUoLCkKICAgIGlmICRMRCAtLXZlcnNpb24gMj4vZGV2L251bGwgfCBncmVwICdHTlUgZ29sZCcgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIGdsaWJjeHhfbGRfaXNfZ29sZD15ZXMKICAgIGZpCiAgICBsZHZlcj1gJExEIC0tdmVyc2lvbiAyPi9kZXYvbnVsbCB8IGhlYWQgLTEgfCBcCiAgICAgICAgICAgc2VkIC1lICdzL0dOVSBcKGdvXClcezAsMVx9bGQgXCh2ZXJzaW9uIFwpXHswLDFcfVwoKFteKV0qKSBcKVx7MCwxXH1cKFswLTkuXVswLTkuXSpcKS4qL1w0LydgCiAgICBjaGFuZ2VxdW90ZShbLF0pCiAgICBnbGliY3h4X2dudV9sZF92ZXJzaW9uPWBlY2hvICRsZHZlciB8IFwKICAgICAgICAgICAkQVdLIC1GLiAneyBpZiAoTkY8MykgWyRdMz0wOyBwcmludCAoWyRdMSoxMDArWyRdMikqMTAwK1skXTMgfSdgCiAgICBBQ19NU0dfUkVTVUxUKCRnbGliY3h4X2dudV9sZF92ZXJzaW9uKQogIGZpCgogICMgU2V0IC0tZ2Mtc2VjdGlvbnMuCiAgZ2xpYmN4eF9oYXZlX2djX3NlY3Rpb25zPW5vCiAgaWYgdGVzdCAiJGdsaWJjeHhfbGRfaXNfZ29sZCIgPSAieWVzIjsgdGhlbgogICAgaWYgJExEIC0taGVscCAyPi9kZXYvbnVsbCB8IGdyZXAgZ2Mtc2VjdGlvbnMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIGdsaWJjeHhfaGF2ZV9nY19zZWN0aW9ucz15ZXMKICAgIGZpCiAgZWxzZQogICAgZ2xpYmN4eF9nY3NlY3Rpb25zX21pbl9sZD0yMTYwMgogICAgaWYgdGVzdCB4IiR3aXRoX2dudV9sZCIgPSB4InllcyIgJiYgCgl0ZXN0ICRnbGliY3h4X2dudV9sZF92ZXJzaW9uIC1ndCAkZ2xpYmN4eF9nY3NlY3Rpb25zX21pbl9sZCA7IHRoZW4KICAgICAgZ2xpYmN4eF9oYXZlX2djX3NlY3Rpb25zPXllcwogICAgZmkKICBmaQogIGlmIHRlc3QgIiRnbGliY3h4X2hhdmVfZ2Nfc2VjdGlvbnMiID0gInllcyI7IHRoZW4KICAgICMgU3VmZmljaWVudGx5IHlvdW5nIEdOVSBsZCBpdCBpcyEgIEpveSBhbmQgYnVubnkgcmFiYml0cyEKICAgICMgTkI6IFRoaXMgZmxhZyBvbmx5IHdvcmtzIHJlbGlhYmx5IGFmdGVyIDIuMTYuMS4gQ29uZmlndXJlIHRlc3RzCiAgICAjIGZvciB0aGlzIGFyZSBkaWZmaWN1bHQsIHNvIGhhcmQgd2lyZSBhIHZhbHVlIHRoYXQgc2hvdWxkIHdvcmsuCgogICAgYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCiAgICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKICAgIENGTEFHUz0nLVdsLC0tZ2Mtc2VjdGlvbnMnCgogICAgIyBDaGVjayBmb3IgLVdsLC0tZ2Mtc2VjdGlvbnMKICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGxkIHRoYXQgc3VwcG9ydHMgLVdsLC0tZ2Mtc2VjdGlvbnNdKQogICAgQUNfVFJZX0xJTksoWyBpbnQgb25lKHZvaWQpIHsgcmV0dXJuIDE7IH0KICAgICBpbnQgdHdvKHZvaWQpIHsgcmV0dXJuIDI7IH0KCV0sIFsgdHdvKCk7IF0gLCBbYWNfZ2NzZWN0aW9ucz15ZXNdLCBbYWNfZ2NzZWN0aW9ucz1ub10pCiAgICBpZiB0ZXN0ICIkYWNfZ2NzZWN0aW9ucyIgPSAieWVzIjsgdGhlbgogICAgICBybSAtZiBjb25mdGVzdC5jCiAgICAgIHRvdWNoIGNvbmZ0ZXN0LmMKICAgICAgaWYgJENDIC1jIGNvbmZ0ZXN0LmM7IHRoZW4KCWlmICRMRCAtLWdjLXNlY3Rpb25zIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0Lm8gMj4mMSB8IFwKCSAgIGdyZXAgIldhcm5pbmc6IGdjLXNlY3Rpb25zIG9wdGlvbiBpZ25vcmVkIiA+IC9kZXYvbnVsbDsgdGhlbgoJICBhY19nY3NlY3Rpb25zPW5vCglmaQogICAgICBmaQogICAgICBybSAtZiBjb25mdGVzdC5jIGNvbmZ0ZXN0Lm8gY29uZnRlc3QKICAgIGZpCiAgICBpZiB0ZXN0ICIkYWNfZ2NzZWN0aW9ucyIgPSAieWVzIjsgdGhlbgogICAgICBTRUNUSU9OX0xERkxBR1M9Ii1XbCwtLWdjLXNlY3Rpb25zICRTRUNUSU9OX0xERkxBR1MiCiAgICBmaQogICAgQUNfTVNHX1JFU1VMVCgkYWNfZ2NzZWN0aW9ucykKCiAgICBpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCiAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgogICAgZWxzZQogICAgICAjIHRoaXMgaXMgdGhlIHN1c3BpY2lvdXMgcGFydAogICAgICBDRkxBR1M9JycKICAgIGZpCiAgZmkKCiAgIyBTZXQgLXoscmVscm8uCiAgIyBOb3RlIHRoaXMgaXMgb25seSBmb3Igc2hhcmVkIG9iamVjdHMuCiAgYWNfbGRfcmVscm89bm8KICBpZiB0ZXN0IHgiJHdpdGhfZ251X2xkIiA9IHgieWVzIjsgdGhlbgogICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbGQgdGhhdCBzdXBwb3J0cyAtV2wsLXoscmVscm9dKQogICAgY3h4X3pfcmVsbz1gJExEIC12IC0taGVscCAyPi9kZXYvbnVsbCB8IGdyZXAgInogcmVscm8iYAogICAgaWYgdGVzdCAtbiAiJGN4eF96X3JlbG8iOyB0aGVuCiAgICAgIE9QVF9MREZMQUdTPSItV2wsLXoscmVscm8iCiAgICAgIGFjX2xkX3JlbHJvPXllcwogICAgZmkKICAgIEFDX01TR19SRVNVTFQoJGFjX2xkX3JlbHJvKQogIGZpCgogICMgU2V0IGxpbmtlciBvcHRpbWl6YXRpb24gZmxhZ3MuCiAgaWYgdGVzdCB4IiR3aXRoX2dudV9sZCIgPSB4InllcyI7IHRoZW4KICAgIE9QVF9MREZMQUdTPSItV2wsLU8xICRPUFRfTERGTEFHUyIKICBmaQoKICBBQ19TVUJTVChTRUNUSU9OX0xERkxBR1MpCiAgQUNfU1VCU1QoT1BUX0xERkxBR1MpCl0pCgoKZG5sCmRubCBDaGVjayBmb3IgaGVhZGVycyBmb3IsIGFuZCBhcmd1bWVudHMgdG8sIHRoZSBzZXRybGltaXQoKSBmdW5jdGlvbi4KZG5sIFVzZWQgb25seSBpbiB0ZXN0c3VpdGVfaG9va3MuaC4gIENhbGxlZCBmcm9tIEdMSUJDWFhfQ09ORklHVVJFX1RFU1RTVUlURS4KZG5sCmRubCBEZWZpbmVzOgpkbmwgIF9HTElCQ1hYX1JFU19MSU1JVFMgaWYgd2UgY2FuIHNldCBhcnRpZmljaWFsIHJlc291cmNlIGxpbWl0cyAKZG5sICB2YXJpb3VzIEhBVkVfTElNSVRfKiBmb3IgaW5kaXZpZHVhbCBsaW1pdCBuYW1lcwpkbmwKQUNfREVGVU4oW0dMSUJDWFhfQ0hFQ0tfU0VUUkxJTUlUX2FuY2lsbGlhcnldLCBbCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgUkxJTUlUXyQxXSkKICBBQ19UUllfQ09NUElMRSgKICAgIFsjaW5jbHVkZSA8dW5pc3RkLmg+CiAgICAgI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAgICAgI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogICAgXSwKICAgIFsgaW50IGYgPSBSTElNSVRfJDEgOyBdLAogICAgW2dsaWJjeHhfbXJlc3VsdD0xXSwgW2dsaWJjeHhfbXJlc3VsdD0wXSkKICBBQ19ERUZJTkVfVU5RVU9URUQoSEFWRV9MSU1JVF8kMSwgJGdsaWJjeHhfbXJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgW09ubHkgdXNlZCBpbiBidWlsZCBkaXJlY3RvcnkgdGVzdHN1aXRlX2hvb2tzLmguXSkKICBpZiB0ZXN0ICRnbGliY3h4X21yZXN1bHQgPSAxIDsgdGhlbiByZXM9eWVzIDsgZWxzZSByZXM9bm8gOyBmaQogIEFDX01TR19SRVNVTFQoJHJlcykKXSkKCkFDX0RFRlVOKFtHTElCQ1hYX0NIRUNLX1NFVFJMSU1JVF0sIFsKICBzZXRybGltaXRfaGF2ZV9oZWFkZXJzPXllcwogIEFDX0NIRUNLX0hFQURFUlModW5pc3RkLmggc3lzL3RpbWUuaCBzeXMvcmVzb3VyY2UuaCwKICAgICAgICAgICAgICAgICAgIFtdLAogICAgICAgICAgICAgICAgICAgW3NldHJsaW1pdF9oYXZlX2hlYWRlcnM9bm9dKQogICMgSWYgZG9uJ3QgaGF2ZSB0aGUgaGVhZGVycywgdGhlbiB3ZSBjYW4ndCBydW4gdGhlIHRlc3RzIG5vdywgYW5kIHdlCiAgIyB3b24ndCBiZSBzZWVpbmcgYW55IG9mIHRoZXNlIGR1cmluZyB0ZXN0c3VpdGUgY29tcGlsYXRpb24uCiAgaWYgdGVzdCAkc2V0cmxpbWl0X2hhdmVfaGVhZGVycyA9IHllczsgdGhlbgogICAgIyBDYW4ndCBkbyB0aGVzZSBpbiBhIGxvb3AsIGVsc2UgdGhlIHJlc3VsdGluZyBzeW50YXggaXMgd3JvbmcuCiAgICBHTElCQ1hYX0NIRUNLX1NFVFJMSU1JVF9hbmNpbGxpYXJ5KERBVEEpCiAgICBHTElCQ1hYX0NIRUNLX1NFVFJMSU1JVF9hbmNpbGxpYXJ5KFJTUykKICAgIEdMSUJDWFhfQ0hFQ0tfU0VUUkxJTUlUX2FuY2lsbGlhcnkoVk1FTSkKICAgIEdMSUJDWFhfQ0hFQ0tfU0VUUkxJTUlUX2FuY2lsbGlhcnkoQVMpCiAgICBHTElCQ1hYX0NIRUNLX1NFVFJMSU1JVF9hbmNpbGxpYXJ5KEZTSVpFKQoKICAgICMgQ2hlY2sgZm9yIHJsaW1pdCwgc2V0cmxpbWl0LgogICAgQUNfQ0FDSEVfVkFMKGdsaWJjeHhfY3Zfc2V0cmxpbWl0LCBbCiAgICAgIEFDX1RSWV9DT01QSUxFKAogICAgICAgIFsjaW5jbHVkZSA8dW5pc3RkLmg+CiAgICAgICAgICNpbmNsdWRlIDxzeXMvdGltZS5oPgogICAgICAgICAjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiAgICAgICAgXSwKICAgICAgICBbc3RydWN0IHJsaW1pdCByOwogICAgICAgICBzZXRybGltaXQoMCwgJnIpO10sCiAgICAgICAgW2dsaWJjeHhfY3Zfc2V0cmxpbWl0PXllc10sIFtnbGliY3h4X2N2X3NldHJsaW1pdD1ub10pCiAgICBdKQogIGZpCgogIEFDX01TR19DSEVDS0lORyhbZm9yIHRlc3RzdWl0ZSByZXNvdXJjZSBsaW1pdHMgc3VwcG9ydF0pCiAgaWYgdGVzdCAkc2V0cmxpbWl0X2hhdmVfaGVhZGVycyA9IHllcyAmJiB0ZXN0ICRnbGliY3h4X2N2X3NldHJsaW1pdCA9IHllczsgdGhlbgogICAgYWNfcmVzX2xpbWl0cz15ZXMKICAgIEFDX0RFRklORShfR0xJQkNYWF9SRVNfTElNSVRTLCAxLAogICAgICAgICAgICAgIFtEZWZpbmUgaWYgdXNpbmcgc2V0cmxpbWl0IHRvIHNldCByZXNvdXJjZSBsaW1pdHMgZHVyaW5nCiAgICAgICAgICAgICAgIm1ha2UgY2hlY2siXSkKICBlbHNlCiAgICBhY19yZXNfbGltaXRzPW5vCiAgZmkKICBBQ19NU0dfUkVTVUxUKCRhY19yZXNfbGltaXRzKQpdKQoKCmRubApkbmwgQ2hlY2sgd2hldGhlciBTX0lTUkVHIChQb3NpeCkgb3IgU19JRlJFRyBpcyBhdmFpbGFibGUgaW4gPHN5cy9zdGF0Lmg+LgpkbmwgRGVmaW5lIEhBVkVfU19JU1JFRyAvIEhBVkVfU19JRlJFRyBhcHByb3ByaWF0ZWx5LgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfQ0hFQ0tfU19JU1JFR19PUl9TX0lGUkVHXSwgWwoKICBBQ19MQU5HX1NBVkUKICBBQ19MQU5HX0NQTFVTUExVUwogIGFjX3NhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKICBDWFhGTEFHUz0iJENYWEZMQUdTIC1mbm8tZXhjZXB0aW9ucyIKCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgU19JU1JFRyBvciBTX0lGUkVHXSkKICBBQ19DQUNIRV9WQUwoZ2xpYmN4eF9jdl9TX0lTUkVHLCBbCiAgICBHQ0NfVFJZX0NPTVBJTEVfT1JfTElOSygKICAgICAgWyNpbmNsdWRlIDxzeXMvc3RhdC5oPl0sCiAgICAgIFtzdHJ1Y3Qgc3RhdCBidWZmZXI7CiAgICAgICBmc3RhdCgwLCAmYnVmZmVyKTsKICAgICAgIFNfSVNSRUcoYnVmZmVyLnN0X21vZGUpO10sCiAgICAgIFtnbGliY3h4X2N2X1NfSVNSRUc9eWVzXSwKICAgICAgW2dsaWJjeHhfY3ZfU19JU1JFRz1ub10pCiAgXSkKICBBQ19DQUNIRV9WQUwoZ2xpYmN4eF9jdl9TX0lGUkVHLCBbCiAgICBHQ0NfVFJZX0NPTVBJTEVfT1JfTElOSygKICAgICAgWyNpbmNsdWRlIDxzeXMvc3RhdC5oPl0sCiAgICAgIFtzdHJ1Y3Qgc3RhdCBidWZmZXI7CiAgICAgICBmc3RhdCgwLCAmYnVmZmVyKTsKICAgICAgIFNfSUZSRUcgJiBidWZmZXIuc3RfbW9kZTtdLAogICAgICBbZ2xpYmN4eF9jdl9TX0lGUkVHPXllc10sCiAgICAgIFtnbGliY3h4X2N2X1NfSUZSRUc9bm9dKQogIF0pCiAgcmVzPW5vCiAgaWYgdGVzdCAkZ2xpYmN4eF9jdl9TX0lTUkVHID0geWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoSEFWRV9TX0lTUkVHLCAxLCAKICAgICAgICAgICAgICBbRGVmaW5lIGlmIFNfSUZSRUcgaXMgYXZhaWxhYmxlIGluIDxzeXMvc3RhdC5oPi5dKQogICAgcmVzPVNfSVNSRUcKICBlbGlmIHRlc3QgJGdsaWJjeHhfY3ZfU19JRlJFRyA9IHllczsgdGhlbgogICAgQUNfREVGSU5FKEhBVkVfU19JRlJFRywgMSwKICAgICAgICAgICAgICBbRGVmaW5lIGlmIFNfSUZSRUcgaXMgYXZhaWxhYmxlIGluIDxzeXMvc3RhdC5oPi5dKQogICAgcmVzPVNfSUZSRUcKICBmaQogIEFDX01TR19SRVNVTFQoJHJlcykKCiAgQ1hYRkxBR1M9IiRhY19zYXZlX0NYWEZMQUdTIgogIEFDX0xBTkdfUkVTVE9SRQpdKQoKCmRubApkbmwgQ2hlY2sgd2hldGhlciBwb2xsIGlzIGF2YWlsYWJsZSBpbiA8cG9sbC5oPiwgYW5kIGRlZmluZSBIQVZFX1BPTEwuCmRubApBQ19ERUZVTihbR0xJQkNYWF9DSEVDS19QT0xMXSwgWwoKICBBQ19MQU5HX1NBVkUKICBBQ19MQU5HX0NQTFVTUExVUwogIGFjX3NhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKICBDWFhGTEFHUz0iJENYWEZMQUdTIC1mbm8tZXhjZXB0aW9ucyIKCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgcG9sbF0pCiAgQUNfQ0FDSEVfVkFMKGdsaWJjeHhfY3ZfUE9MTCwgWwogICAgR0NDX1RSWV9DT01QSUxFX09SX0xJTksoCiAgICAgIFsjaW5jbHVkZSA8cG9sbC5oPl0sCiAgICAgIFtzdHJ1Y3QgcG9sbGZkIHBmZFsxXTsKICAgICAgIHBmZFswXS5ldmVudHMgPSBQT0xMSU47CiAgICAgICBwb2xsKHBmZCwgMSwgMCk7XSwKICAgICAgW2dsaWJjeHhfY3ZfUE9MTD15ZXNdLAogICAgICBbZ2xpYmN4eF9jdl9QT0xMPW5vXSkKICBdKQogIGlmIHRlc3QgJGdsaWJjeHhfY3ZfUE9MTCA9IHllczsgdGhlbgogICAgQUNfREVGSU5FKEhBVkVfUE9MTCwgMSwgW0RlZmluZSBpZiBwb2xsIGlzIGF2YWlsYWJsZSBpbiA8cG9sbC5oPi5dKQogIGZpCiAgQUNfTVNHX1JFU1VMVCgkZ2xpYmN4eF9jdl9QT0xMKQoKICBDWFhGTEFHUz0iJGFjX3NhdmVfQ1hYRkxBR1MiCiAgQUNfTEFOR19SRVNUT1JFCl0pCgoKZG5sCmRubCBDaGVjayB3aGV0aGVyIHdyaXRldiBpcyBhdmFpbGFibGUgaW4gPHN5cy91aW8uaD4sIGFuZCBkZWZpbmUgSEFWRV9XUklURVYuCmRubApBQ19ERUZVTihbR0xJQkNYWF9DSEVDS19XUklURVZdLCBbCgogIEFDX0xBTkdfU0FWRQogIEFDX0xBTkdfQ1BMVVNQTFVTCiAgYWNfc2F2ZV9DWFhGTEFHUz0iJENYWEZMQUdTIgogIENYWEZMQUdTPSIkQ1hYRkxBR1MgLWZuby1leGNlcHRpb25zIgoKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciB3cml0ZXZdKQogIEFDX0NBQ0hFX1ZBTChnbGliY3h4X2N2X1dSSVRFViwgWwogICAgR0NDX1RSWV9DT01QSUxFX09SX0xJTksoCiAgICAgIFsjaW5jbHVkZSA8c3lzL3Vpby5oPl0sCiAgICAgIFtzdHJ1Y3QgaW92ZWMgaW92WzJdOwogICAgICAgd3JpdGV2KDAsIGlvdiwgMCk7XSwKICAgICAgW2dsaWJjeHhfY3ZfV1JJVEVWPXllc10sCiAgICAgIFtnbGliY3h4X2N2X1dSSVRFVj1ub10pCiAgXSkKICBpZiB0ZXN0ICRnbGliY3h4X2N2X1dSSVRFViA9IHllczsgdGhlbgogICAgQUNfREVGSU5FKEhBVkVfV1JJVEVWLCAxLCBbRGVmaW5lIGlmIHdyaXRldiBpcyBhdmFpbGFibGUgaW4gPHN5cy91aW8uaD4uXSkKICBmaQogIEFDX01TR19SRVNVTFQoJGdsaWJjeHhfY3ZfV1JJVEVWKQoKICBDWFhGTEFHUz0iJGFjX3NhdmVfQ1hYRkxBR1MiCiAgQUNfTEFOR19SRVNUT1JFCl0pCgoKZG5sCmRubCBDaGVjayB3aGV0aGVyIGludDY0X3QgaXMgYXZhaWxhYmxlIGluIDxzdGRpbnQuaD4sIGFuZCBkZWZpbmUgSEFWRV9JTlQ2NF9ULgpkbmwgQWxzbyBjaGVjayB3aGV0aGVyIGludDY0X3QgaXMgYWN0dWFsbHkgYSB0eXBlZGVmIHRvIGxvbmcgb3IgbG9uZyBsb25nLgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfQ0hFQ0tfSU5UNjRfVF0sIFsKCiAgQUNfTEFOR19TQVZFCiAgQUNfTEFOR19DUExVU1BMVVMKCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgaW50NjRfdF0pCiAgQUNfQ0FDSEVfVkFMKGdsaWJjeHhfY3ZfSU5UNjRfVCwgWwogICAgQUNfVFJZX0NPTVBJTEUoCiAgICAgIFsjaW5jbHVkZSA8c3RkaW50Lmg+XSwKICAgICAgW2ludDY0X3QgdmFyO10sCiAgICAgIFtnbGliY3h4X2N2X0lOVDY0X1Q9eWVzXSwKICAgICAgW2dsaWJjeHhfY3ZfSU5UNjRfVD1ub10pCiAgXSkKCiAgaWYgdGVzdCAkZ2xpYmN4eF9jdl9JTlQ2NF9UID0geWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoSEFWRV9JTlQ2NF9ULCAxLCBbRGVmaW5lIGlmIGludDY0X3QgaXMgYXZhaWxhYmxlIGluIDxzdGRpbnQuaD4uXSkKICAgIEFDX01TR19SRVNVTFQoJGdsaWJjeHhfY3ZfSU5UNjRfVCkKCiAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBpbnQ2NF90IGFzIGxvbmddKQogICAgQUNfQ0FDSEVfVkFMKGdsaWJjeHhfY3ZfaW50NjRfdF9sb25nLCBbCiAgICAgIEFDX1RSWV9DT01QSUxFKAogICAgICAgIFsjaW5jbHVkZSA8c3RkaW50Lmg+CiAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPiBzdHJ1Y3Qgc2FtZSB7IGVudW0geyB2YWx1ZSA9IC0xIH07IH07CiAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVHA+IHN0cnVjdCBzYW1lPFRwLCBUcD4geyBlbnVtIHsgdmFsdWUgPSAxIH07IH07CiAgICAgICAgaW50IGFycmF5W3NhbWU8aW50NjRfdCwgbG9uZz46OnZhbHVlXTtdLCBbXSwKCVtnbGliY3h4X2N2X2ludDY0X3RfbG9uZz15ZXNdLCBbZ2xpYmN4eF9jdl9pbnQ2NF90X2xvbmc9bm9dKQogICAgXSkKCiAgICBpZiB0ZXN0ICRnbGliY3h4X2N2X2ludDY0X3RfbG9uZyA9IHllczsgdGhlbgogICAgICBBQ19ERUZJTkUoSEFWRV9JTlQ2NF9UX0xPTkcsIDEsIFtEZWZpbmUgaWYgaW50NjRfdCBpcyBhIGxvbmcuXSkKICAgICAgQUNfTVNHX1JFU1VMVCgkZ2xpYmN4eF9jdl9pbnQ2NF90X2xvbmcpCiAgICBmaQoKICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGludDY0X3QgYXMgbG9uZyBsb25nXSkKICAgIEFDX0NBQ0hFX1ZBTChnbGliY3h4X2N2X2ludDY0X3RfbG9uZ19sb25nLCBbCiAgICAgIEFDX1RSWV9DT01QSUxFKAogICAgICAgIFsjaW5jbHVkZSA8c3RkaW50Lmg+CiAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPiBzdHJ1Y3Qgc2FtZSB7IGVudW0geyB2YWx1ZSA9IC0xIH07IH07CiAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVHA+IHN0cnVjdCBzYW1lPFRwLCBUcD4geyBlbnVtIHsgdmFsdWUgPSAxIH07IH07CiAgICAgICAgaW50IGFycmF5W3NhbWU8aW50NjRfdCwgbG9uZyBsb25nPjo6dmFsdWVdO10sIFtdLAoJW2dsaWJjeHhfY3ZfaW50NjRfdF9sb25nX2xvbmc9eWVzXSwgW2dsaWJjeHhfY3ZfaW50NjRfdF9sb25nX2xvbmc9bm9dKQogICAgXSkKCiAgICBpZiB0ZXN0ICRnbGliY3h4X2N2X2ludDY0X3RfbG9uZ19sb25nID0geWVzOyB0aGVuCiAgICAgIEFDX0RFRklORShIQVZFX0lOVDY0X1RfTE9OR19MT05HLCAxLCBbRGVmaW5lIGlmIGludDY0X3QgaXMgYSBsb25nIGxvbmcuXSkKICAgICAgQUNfTVNHX1JFU1VMVCgkZ2xpYmN4eF9jdl9pbnQ2NF90X2xvbmdfbG9uZykKICAgIGZpCiAgZmkKCiAgQUNfTEFOR19SRVNUT1JFCl0pCgoKZG5sCmRubCBDaGVjayB3aGV0aGVyIExGUyBzdXBwb3J0IGlzIGF2YWlsYWJsZS4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0NIRUNLX0xGU10sIFsKICBBQ19MQU5HX1NBVkUKICBBQ19MQU5HX0NQTFVTUExVUwogIGFjX3NhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKICBDWFhGTEFHUz0iJENYWEZMQUdTIC1mbm8tZXhjZXB0aW9ucyIJCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgTEZTIHN1cHBvcnRdKQogIEFDX0NBQ0hFX1ZBTChnbGliY3h4X2N2X0xGUywgWwogICAgR0NDX1RSWV9DT01QSUxFX09SX0xJTksoCiAgICAgIFsjaW5jbHVkZSA8dW5pc3RkLmg+CiAgICAgICAjaW5jbHVkZSA8c3RkaW8uaD4KICAgICAgICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogICAgICBdLAogICAgICBbRklMRSogZnA7CiAgICAgICBmb3BlbjY0KCJ0IiwgInciKTsKICAgICAgIGZzZWVrbzY0KGZwLCAwLCBTRUVLX0NVUik7CiAgICAgICBmdGVsbG82NChmcCk7CiAgICAgICBsc2VlazY0KDEsIDAsIFNFRUtfQ1VSKTsKICAgICAgIHN0cnVjdCBzdGF0NjQgYnVmOwogICAgICAgZnN0YXQ2NCgxLCAmYnVmKTtdLAogICAgICBbZ2xpYmN4eF9jdl9MRlM9eWVzXSwKICAgICAgW2dsaWJjeHhfY3ZfTEZTPW5vXSkKICBdKQogIGlmIHRlc3QgJGdsaWJjeHhfY3ZfTEZTID0geWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoX0dMSUJDWFhfVVNFX0xGUywgMSwgW0RlZmluZSBpZiBMRlMgc3VwcG9ydCBpcyBhdmFpbGFibGUuXSkKICBmaQogIEFDX01TR19SRVNVTFQoJGdsaWJjeHhfY3ZfTEZTKQogIENYWEZMQUdTPSIkYWNfc2F2ZV9DWFhGTEFHUyIKICBBQ19MQU5HX1JFU1RPUkUKXSkKCgpkbmwKZG5sIENoZWNrIGZvciB3aGV0aGVyIGEgZnVsbHkgZHluYW1pYyBiYXNpY19zdHJpbmcgaW1wbGVtZW50YXRpb24gc2hvdWxkCmRubCBiZSB0dXJuZWQgb24sIHRoYXQgZG9lcyBub3QgcHV0IGVtcHR5IG9iamVjdHMgaW4gcGVyLXByb2Nlc3Mgc3RhdGljCmRubCBtZW1vcnkgKG1vc3RseSB1c2VmdWwgdG9nZXRoZXIgd2l0aCBzaGFyZWQgbWVtb3J5IGFsbG9jYXRvcnMsIHNlZSBQUgpkbmwgbGlic3RkYysrLzE2NjEyIGZvciBkZXRhaWxzKS4KZG5sCmRubCAtLWVuYWJsZS1mdWxseS1keW5hbWljLXN0cmluZyBkZWZpbmVzIF9HTElCQ1hYX0ZVTExZX0RZTkFNSUNfU1RSSU5HCmRubCAtLWRpc2FibGUtZnVsbHktZHluYW1pYy1zdHJpbmcgbGVhdmVzIF9HTElCQ1hYX0ZVTExZX0RZTkFNSUNfU1RSSU5HIHVuZGVmaW5lZApkbmwgICsgIFVzYWdlOiAgR0xJQkNYWF9FTkFCTEVfRlVMTFlfRFlOQU1JQ19TVFJJTkdbKERFRkFVTFQpXQpkbmwgICAgICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0VOQUJMRV9GVUxMWV9EWU5BTUlDX1NUUklOR10sIFsKICBHTElCQ1hYX0VOQUJMRShmdWxseS1keW5hbWljLXN0cmluZywkMSwsW2RvIG5vdCBwdXQgZW1wdHkgc3RyaW5ncyBpbiBwZXItcHJvY2VzcyBzdGF0aWMgbWVtb3J5XSkKICBpZiB0ZXN0ICRlbmFibGVfZnVsbHlfZHluYW1pY19zdHJpbmcgPSB5ZXM7IHRoZW4KICAgIEFDX0RFRklORShfR0xJQkNYWF9GVUxMWV9EWU5BTUlDX1NUUklORywgMSwKICAgICAgICAgICAgICBbRGVmaW5lIGlmIGEgZnVsbHkgZHluYW1pYyBiYXNpY19zdHJpbmcgaXMgd2FudGVkLl0pCiAgZmkKXSkKCgpkbmwKZG5sIERvZXMgYW55IG5lY2Vzc2FyeSBjb25maWd1cmF0aW9uIG9mIHRoZSB0ZXN0c3VpdGUgZGlyZWN0b3J5LiAgR2VuZXJhdGVzCmRubCB0aGUgdGVzdHN1aXRlX2hvb2tzLmggaGVhZGVyLgpkbmwKZG5sIEdMSUJDWFhfRU5BQkxFX1NZTVZFUlMgYW5kIEdMSUJDWFhfSVNfTkFUSVZFIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhpcy4KZG5sCmRubCBTZXRzOgpkbmwgIGVuYWJsZV9hYmlfY2hlY2sgCmRubCAgR0xJQkNYWF9URVNUX1dDSEFSX1QKZG5sICBHTElCQ1hYX1RFU1RfVEhSRUFECmRubCBTdWJzdHM6CmRubCAgYmFzZWxpbmVfZGlyCmRubApBQ19ERUZVTihbR0xJQkNYWF9DT05GSUdVUkVfVEVTVFNVSVRFXSwgWwogIGlmICRHTElCQ1hYX0lTX05BVElWRSA7IHRoZW4KICAgICMgRG8gY2hlY2tzIGZvciByZXNvdXJjZSBsaW1pdCBmdW5jdGlvbnMuCiAgICBHTElCQ1hYX0NIRUNLX1NFVFJMSU1JVAoKICAgICMgTG9vayBmb3Igc2V0ZW52LCBzbyB0aGF0IGV4dGVuZGVkIGxvY2FsZSB0ZXN0cyBjYW4gYmUgcGVyZm9ybWVkLgogICAgR0xJQkNYWF9DSEVDS19TVERMSUJfREVDTF9BTkRfTElOS0FHRV8zKHNldGVudikKICBmaQoKICBpZiAkR0xJQkNYWF9JU19OQVRJVkUgJiYgdGVzdCAkaXNfaG9zdGVkID0geWVzICYmCiAgICAgdGVzdCAkZW5hYmxlX3N5bXZlcnMgIT0gbm87IHRoZW4KICAgIGNhc2UgIiRob3N0IiBpbgogICAgICAqLSotY3lnd2luKikKICAgICAgICBlbmFibGVfYWJpX2NoZWNrPW5vIDs7CiAgICAgICopCiAgICAgICAgZW5hYmxlX2FiaV9jaGVjaz15ZXMgOzsKICAgIGVzYWMKICBlbHNlCiAgICAjIE9ubHkgYnVpbGQgdGhpcyBhcyBuYXRpdmUsIHNpbmNlIGF1dG9tYWtlIGRvZXMgbm90IHVuZGVyc3RhbmQKICAgICMgQ1hYX0ZPUl9CVUlMRC4KICAgIGVuYWJsZV9hYmlfY2hlY2s9bm8KICBmaQogIAogICMgRXhwb3J0IGZpbGUgbmFtZXMgZm9yIEFCSSBjaGVja2luZy4KICBiYXNlbGluZV9kaXI9IiRnbGliY3h4X3NyY2Rpci9jb25maWcvYWJpL3Bvc3QvJHthYmlfYmFzZWxpbmVfcGFpcn0iCiAgQUNfU1VCU1QoYmFzZWxpbmVfZGlyKQpdKQoKCmRubApkbmwgU2V0IHVwICpfSU5DTFVERVMgdmFyaWFibGVzIGZvciBhbGwgc3VuZHJ5IE1ha2VmaWxlLmFtJ3MuCmRubApkbmwgU3Vic3RzOgpkbmwgIEdMSUJDWFhfSU5DTFVERVMKZG5sICBUT1BMRVZFTF9JTkNMVURFUwpkbmwKQUNfREVGVU4oW0dMSUJDWFhfRVhQT1JUX0lOQ0xVREVTXSwgWwogICMgVXNlZCBmb3IgZXZlcnkgQysrIGNvbXBpbGUgd2UgcGVyZm9ybS4KICBHTElCQ1hYX0lOQ0xVREVTPSJcCi1JJGdsaWJjeHhfYnVpbGRkaXIvaW5jbHVkZS8kaG9zdF9hbGlhcyBcCi1JJGdsaWJjeHhfYnVpbGRkaXIvaW5jbHVkZSBcCi1JJGdsaWJjeHhfc3JjZGlyL2xpYnN1cGMrKyIKCiAgIyBGb3IgQ2FuYWRpYW4gY3Jvc3NlcywgcGljayB0aGlzIHVwIHRvby4KICBpZiB0ZXN0ICRDQU5BRElBTiA9IHllczsgdGhlbgogICAgR0xJQkNYWF9JTkNMVURFUz0iJEdMSUJDWFhfSU5DTFVERVMgLUlcJHtpbmNsdWRlZGlyfSIKICBmaQoKICAjIFN0dWZmIGluIHRoZSBhY3R1YWwgdG9wIGxldmVsLiAgQ3VycmVudGx5IG9ubHkgdXNlZCBieSBsaWJzdXBjKysgdG8KICAjIGdldCB1bndpbmQqIGhlYWRlcnMgZnJvbSB0aGUgZ2NjIGRpci4KICAjVE9QTEVWRUxfSU5DTFVERVM9Jy1JJCh0b3BsZXZlbF9zcmNkaXIpL2djYyAtSSQodG9wbGV2ZWxfc3JjZGlyKS9pbmNsdWRlJwogIFRPUExFVkVMX0lOQ0xVREVTPSctSSQodG9wbGV2ZWxfc3JjZGlyKS9nY2MnCgogICMgTm93LCBleHBvcnQgdGhpcyB0byBhbGwgdGhlIGxpdHRsZSBNYWtlZmlsZXMuLi4uCiAgQUNfU1VCU1QoR0xJQkNYWF9JTkNMVURFUykKICBBQ19TVUJTVChUT1BMRVZFTF9JTkNMVURFUykKXSkKCgpkbmwKZG5sIFNldCB1cCAqX0ZMQUdTIGFuZCAqRkxBR1MgdmFyaWFibGVzIGZvciBhbGwgc3VuZHJ5IE1ha2VmaWxlLmFtJ3MuCmRubCAoU0VDVElPTl9GTEFHUyBpcyBkb25lIHVuZGVyIENIRUNLX0NPTVBJTEVSX0ZFQVRVUkVTLikKZG5sCmRubCBTdWJzdHM6CmRubCAgREVURVJNSU5JU01fQ1hYRkxBR1MKZG5sICBPUFRJTUlaRV9DWFhGTEFHUwpkbmwgIFdBUk5fRkxBR1MKZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0VYUE9SVF9GTEFHU10sIFsKICAjIEJ5IGRlZmF1bHQgd2UgdXNlIGEgZml4ZWQgcmFuZG9tIHNlZWQgcGVyIG91dHB1dC4gIChUaGlzIGlzIGV4cGFuZGVkCiAgIyBieSBtYWtlIHRvIHNldCB0aGUgcmFuZG9tIHNlZWQgZm9yIGVhY2ggb3V0cHV0IGZpbGUgdG8gYmUgdGhlIG91dHB1dAogICMgZmlsZSdzIG5hbWUuKQogIERFVEVSTUlOSVNNX0NYWEZMQUdTPS1mcmFuZG9tLXNlZWQ9XCRbQF0KICBBQ19TVUJTVChERVRFUk1JTklTTV9DWFhGTEFHUykKCiAgIyBPcHRpbWl6YXRpb24gZmxhZ3MgdGhhdCBhcmUgcHJvYmFibHkgYSBnb29kIGlkZWEgZm9yIHRocmlsbC1zZWVrZXJzLiBKdXN0CiAgIyB1bmNvbW1lbnQgdGhlIGxpbmVzIGJlbG93IGFuZCBtYWtlLCBldmVyeXRoaW5nIGVsc2UgaXMgcmVhZHkgdG8gZ28uLi4KICAjIEFsdGVybmF0aXZlbHkgT1BUSU1JWkVfQ1hYRkxBR1MgY2FuIGJlIHNldCBpbiBjb25maWd1cmUuaG9zdC4KICAjIE9QVElNSVpFX0NYWEZMQUdTID0gLU8zIC1mc3RyaWN0LWFsaWFzaW5nIC1mdnRhYmxlLWdjCiAgQUNfU1VCU1QoT1BUSU1JWkVfQ1hYRkxBR1MpCgogIFdBUk5fRkxBR1M9Jy1XYWxsIC1XZXh0cmEgLVd3cml0ZS1zdHJpbmdzIC1XY2FzdC1xdWFsJwogIEFDX1NVQlNUKFdBUk5fRkxBR1MpCl0pCgoKZG5sCmRubCBBbGwgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiBpcyBkZXRlcm1pbmVkIGhlcmUuCmRubApkbmwgU3Vic3RzOgpkbmwgIGd4eF9pbnN0YWxsX2RpcgpkbmwgIGdsaWJjeHhfcHJlZml4ZGlyCmRubCAgZ2xpYmN4eF90b29sZXhlY2RpcgpkbmwgIGdsaWJjeHhfdG9vbGV4ZWNsaWJkaXIKZG5sCmRubCBBc3N1bWVzIGNyb3NzX2NvbXBpbGluZyBiaXRzIGFscmVhZHkgZG9uZSwgYW5kIHdpdGhfY3Jvc3NfaG9zdCBpbgpkbmwgcGFydGljdWxhci4KZG5sCmRubCBUaGlzIGxvZ2ljIG11c3QgbWF0Y2ggZ2NjL2NvbmZpZ3VyZS5hYydzIHNldHRpbmcgb2YgZ2NjX2d4eF9pbmNsdWRlX2Rpci4KZG5sIGNvbmZpZy9neHgtaW5jbHVkZS1kaXIubTQgbXVzdCBiZSBrZXB0IGNvbnNpc3RhbnQgd2l0aCB0aGlzIGFzIHdlbGwuCkFDX0RFRlVOKFtHTElCQ1hYX0VYUE9SVF9JTlNUQUxMX0lORk9dLCBbCiAgZ2xpYmN4eF90b29sZXhlY2Rpcj1ubwogIGdsaWJjeHhfdG9vbGV4ZWNsaWJkaXI9bm8KICBnbGliY3h4X3ByZWZpeGRpcj0kcHJlZml4CgogIEFDX01TR19DSEVDS0lORyhbZm9yIGd4eC1pbmNsdWRlLWRpcl0pCiAgQUNfQVJHX1dJVEgoW2d4eC1pbmNsdWRlLWRpcl0sCiAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLWd4eC1pbmNsdWRlLWRpcj1ESVJdLAogICAgICAgICAgICAgICAgICAgW2luc3RhbGxhdGlvbiBkaXJlY3RvcnkgZm9yIGluY2x1ZGUgZmlsZXNdKSwKICAgIFtjYXNlICIkd2l0aHZhbCIgaW4KICAgICAgeWVzKSBBQ19NU0dfRVJST1IoW01pc3NpbmcgZGlyZWN0b3J5IGZvciAtLXdpdGgtZ3h4LWluY2x1ZGUtZGlyXSkgOzsKICAgICAgbm8pICBneHhfaW5jbHVkZV9kaXI9bm8gOzsKICAgICAgKikgICBneHhfaW5jbHVkZV9kaXI9JHdpdGh2YWwgOzsKICAgICBlc2FjXSwKICAgIFtneHhfaW5jbHVkZV9kaXI9bm9dKQogIEFDX01TR19SRVNVTFQoJGd4eF9pbmNsdWRlX2RpcikKCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgLS1lbmFibGUtdmVyc2lvbi1zcGVjaWZpYy1ydW50aW1lLWxpYnNdKQogIEFDX0FSR19FTkFCTEUoW3ZlcnNpb24tc3BlY2lmaWMtcnVudGltZS1saWJzXSwKICAgIEFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS12ZXJzaW9uLXNwZWNpZmljLXJ1bnRpbWUtbGlic10sCiAgICAgICAgICAgICAgICAgICBbU3BlY2lmeSB0aGF0IHJ1bnRpbWUgbGlicmFyaWVzIHNob3VsZCBiZSBpbnN0YWxsZWQgaW4gYSBjb21waWxlci1zcGVjaWZpYyBkaXJlY3RvcnldKSwKICAgIFtjYXNlICIkZW5hYmxldmFsIiBpbgogICAgICB5ZXMpIHZlcnNpb25fc3BlY2lmaWNfbGlicz15ZXMgOzsKICAgICAgbm8pICB2ZXJzaW9uX3NwZWNpZmljX2xpYnM9bm8gOzsKICAgICAgKikgICBBQ19NU0dfRVJST1IoW1Vua25vd24gYXJndW1lbnQgdG8gZW5hYmxlL2Rpc2FibGUgdmVyc2lvbi1zcGVjaWZpYyBsaWJzXSk7OwogICAgIGVzYWNdLAogICAgW3ZlcnNpb25fc3BlY2lmaWNfbGlicz1ub10pCiAgQUNfTVNHX1JFU1VMVCgkdmVyc2lvbl9zcGVjaWZpY19saWJzKQoKICAjIERlZmF1bHQgY2FzZSBmb3IgaW5zdGFsbCBkaXJlY3RvcnkgZm9yIGluY2x1ZGUgZmlsZXMuCiAgaWYgdGVzdCAkdmVyc2lvbl9zcGVjaWZpY19saWJzID0gbm8gJiYgdGVzdCAkZ3h4X2luY2x1ZGVfZGlyID0gbm87IHRoZW4KICAgIGd4eF9pbmNsdWRlX2Rpcj0naW5jbHVkZS9jKysvJHtnY2NfdmVyc2lvbn0nCiAgICBpZiB0ZXN0IC1uICIkd2l0aF9jcm9zc19ob3N0IiAmJiAKICAgICAgIHRlc3QgeCIkd2l0aF9jcm9zc19ob3N0IiAhPSB4Im5vIjsgdGhlbgkKICAgICAgZ3h4X2luY2x1ZGVfZGlyPScke3ByZWZpeH0vJHt0YXJnZXRfYWxpYXN9LyciJGd4eF9pbmNsdWRlX2RpciIKICAgIGVsc2UKICAgICAgZ3h4X2luY2x1ZGVfZGlyPScke3ByZWZpeH0vJyIkZ3h4X2luY2x1ZGVfZGlyIgogICAgZmkKICBmaQoKICAjIFZlcnNpb24tc3BlY2lmaWMgcnVudGltZSBsaWJzIHByb2Nlc3NpbmcuCiAgaWYgdGVzdCAkdmVyc2lvbl9zcGVjaWZpY19saWJzID0geWVzOyB0aGVuCiAgICAjIE5lZWQgdGhlIGdjYyBjb21waWxlciB2ZXJzaW9uIHRvIGtub3cgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJpZXMKICAgICMgYW5kIGhlYWRlciBmaWxlcyBpZiAtLWVuYWJsZS12ZXJzaW9uLXNwZWNpZmljLXJ1bnRpbWUtbGlicyBvcHRpb24KICAgICMgaXMgc2VsZWN0ZWQuICBGSVhNRTogdGhlc2UgdmFyaWFibGVzIGFyZSBtaXNuYW1lZCwgdGhlcmUgYXJlCiAgICAjIG5vIGV4ZWN1dGFibGVzIGluc3RhbGxlZCBpbiBfdG9vbGV4ZWNkaXIgb3IgX3Rvb2xleGVjbGliZGlyLgogICAgaWYgdGVzdCB4IiRneHhfaW5jbHVkZV9kaXIiID0geCJubyI7IHRoZW4KICAgICAgZ3h4X2luY2x1ZGVfZGlyPScke2xpYmRpcn0vZ2NjLyR7aG9zdF9hbGlhc30vJHtnY2NfdmVyc2lvbn0vaW5jbHVkZS9jKysnCiAgICBmaQogICAgZ2xpYmN4eF90b29sZXhlY2Rpcj0nJHtsaWJkaXJ9L2djYy8ke2hvc3RfYWxpYXN9JwogICAgZ2xpYmN4eF90b29sZXhlY2xpYmRpcj0nJHt0b29sZXhlY2Rpcn0vJHtnY2NfdmVyc2lvbn0kKE1VTFRJU1VCRElSKScKICBmaQoKICAjIENhbGN1bGF0ZSBnbGliY3h4X3Rvb2xleGVjZGlyLCBnbGliY3h4X3Rvb2xleGVjbGliZGlyCiAgIyBJbnN0YWxsIGEgbGlicmFyeSBidWlsdCB3aXRoIGEgY3Jvc3MgY29tcGlsZXIgaW4gdG9vbGRpciwgbm90IGxpYmRpci4KICBpZiB0ZXN0IHgiJGdsaWJjeHhfdG9vbGV4ZWNkaXIiID0geCJubyI7IHRoZW4KICAgIGlmIHRlc3QgLW4gIiR3aXRoX2Nyb3NzX2hvc3QiICYmCiAgICAgICB0ZXN0IHgiJHdpdGhfY3Jvc3NfaG9zdCIgIT0geCJubyI7IHRoZW4KICAgICAgZ2xpYmN4eF90b29sZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vJHtob3N0X2FsaWFzfScKICAgICAgZ2xpYmN4eF90b29sZXhlY2xpYmRpcj0nJHt0b29sZXhlY2Rpcn0vbGliJwogICAgZWxzZQogICAgICBnbGliY3h4X3Rvb2xleGVjZGlyPScke2xpYmRpcn0vZ2NjLyR7aG9zdF9hbGlhc30nCiAgICAgIGdsaWJjeHhfdG9vbGV4ZWNsaWJkaXI9JyR7bGliZGlyfScKICAgIGZpCiAgICBtdWx0aV9vc19kaXJlY3Rvcnk9YCRDWFggLXByaW50LW11bHRpLW9zLWRpcmVjdG9yeWAKICAgIGNhc2UgJG11bHRpX29zX2RpcmVjdG9yeSBpbgogICAgICAuKSA7OyAjIEF2b2lkIHRyYWlsaW5nIC8uCiAgICAgICopIGdsaWJjeHhfdG9vbGV4ZWNsaWJkaXI9JGdsaWJjeHhfdG9vbGV4ZWNsaWJkaXIvJG11bHRpX29zX2RpcmVjdG9yeSA7OwogICAgZXNhYwogIGZpCgogIEFDX01TR19DSEVDS0lORyhbZm9yIGluc3RhbGwgbG9jYXRpb25dKQogIEFDX01TR19SRVNVTFQoJGd4eF9pbmNsdWRlX2RpcikKCiAgQUNfU1VCU1QoZ2xpYmN4eF9wcmVmaXhkaXIpCiAgQUNfU1VCU1QoZ3h4X2luY2x1ZGVfZGlyKQogIEFDX1NVQlNUKGdsaWJjeHhfdG9vbGV4ZWNkaXIpCiAgQUNfU1VCU1QoZ2xpYmN4eF90b29sZXhlY2xpYmRpcikKXSkKCgpkbmwKZG5sIEdMSUJDWFhfRU5BQkxFCmRubCAgICAoRkVBVFVSRSwgREVGQVVMVCwgSEVMUC1BUkcsIEhFTFAtU1RSSU5HKQpkbmwgICAgKEZFQVRVUkUsIERFRkFVTFQsIEhFTFAtQVJHLCBIRUxQLVNUUklORywgcGVybWl0IGF8YnxjKQpkbmwgICAgKEZFQVRVUkUsIERFRkFVTFQsIEhFTFAtQVJHLCBIRUxQLVNUUklORywgU0hFTEwtQ09ERS1IQU5ETEVSKQpkbmwKZG5sIFNlZSBkb2NzL2h0bWwvMTdfaW50cm8vY29uZmlndXJ5Lmh0bWwjZW5hYmxlIGZvciBkb2N1bWVudGF0aW9uLgpkbmwKbTRfZGVmaW5lKFtHTElCQ1hYX0VOQUJMRV0sW2RubAptNF9kZWZpbmUoW19nX3N3aXRjaF0sWy0tZW5hYmxlLSQxXSlkbmwKbTRfZGVmaW5lKFtfZ19oZWxwXSxbQUNfSEVMUF9TVFJJTkcoX2dfc3dpdGNoJDMsWyQ0IEA8OkBkZWZhdWx0PSQyQDo+QF0pXSlkbmwKIEFDX0FSR19FTkFCTEUoJDEsX2dfaGVscCwKICBtNF9ibWF0Y2goWyQ1XSwKICAgW15wZXJtaXQgXSwKICAgICBbWwogICAgICBjYXNlICIkZW5hYmxldmFsIiBpbgogICAgICAgbTRfYnBhdHN1YnN0KFskNV0sW3Blcm1pdCBdKSkgOzsKICAgICAgICopIEFDX01TR19FUlJPUihVbmtub3duIGFyZ3VtZW50IHRvIGVuYWJsZS9kaXNhYmxlICQxKSA7OwogICAgICAgICAgZG5sIElkZWEgZm9yIGZ1dHVyZTogIGdlbmVyYXRlIGEgVVJMIHBvaW50aW5nIHRvCiAgICAgICAgICBkbmwgIm9ubGluZWRvY3MvY29uZmlnb3B0cy5odG1sI3doYXRldmVyIgogICAgICBlc2FjCiAgICAgXV0sCiAgIFteJF0sCiAgICAgW1sKICAgICAgY2FzZSAiJGVuYWJsZXZhbCIgaW4KICAgICAgIHllc3xubykgOzsKICAgICAgICopIEFDX01TR19FUlJPUihBcmd1bWVudCB0byBlbmFibGUvZGlzYWJsZSAkMSBtdXN0IGJlIHllcyBvciBubykgOzsKICAgICAgZXNhYwogICAgIF1dLAogICBbWyQ1XV0pLAogIFtlbmFibGVfXW00X2JwYXRzdWJzdChbJDFdLC0sXylbPV1bJDJdKQptNF91bmRlZmluZShbX2dfc3dpdGNoXSlkbmwKbTRfdW5kZWZpbmUoW19nX2hlbHBdKWRubApdKQoKCmRubApkbmwgQ2hlY2sgZm9yIElTTy9JRUMgOTg5OToxOTk5ICJDOTkiIHN1cHBvcnQuCmRubApkbmwgLS1lbmFibGUtYzk5IGRlZmluZXMgX0dMSUJDWFhfVVNFX0M5OQpkbmwgLS1kaXNhYmxlLWM5OSBsZWF2ZXMgX0dMSUJDWFhfVVNFX0M5OSB1bmRlZmluZWQKZG5sICArICBVc2FnZTogIEdMSUJDWFhfRU5BQkxFX0M5OVsoREVGQVVMVCldCmRubCAgICAgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLgpkbmwgICsgIElmICdDOTknIHN0dWZmIGlzIG5vdCBhdmFpbGFibGUsIGlnbm9yZXMgREVGQVVMVCBhbmQgc2V0cyBgbm8nLgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfRU5BQkxFX0M5OV0sIFsKICBHTElCQ1hYX0VOQUJMRShjOTksJDEsLFt0dXJucyBvbiBJU08vSUVDIDk4OTk6MTk5OSBzdXBwb3J0XSkKCiAgaWYgdGVzdCB4IiRlbmFibGVfYzk5IiA9IHgieWVzIjsgdGhlbgoKICBBQ19MQU5HX1NBVkUKICBBQ19MQU5HX0NQTFVTUExVUwoKICAjIFVzZSAtc3RkPWMrKzk4IGJlY2F1c2UgdGhlIGRlZmF1bHQgKC1zdGQ9Z251Kys5OCkgbGVhdmVzIF9fU1RSSUNUX0FOU0lfXwogICMgdW5kZWZpbmVkIGFuZCBmYWtlIEM5OSBmYWNpbGl0aWVzIC0gbGlrZSBwcmUtc3RhbmRhcmQgc25wcmludGYgLSBtYXkgYmUKICAjIHNwdXJpb3VzbHkgZW5hYmxlZC4KICAjIExvbmcgdGVybSwgLXN0ZD1jKysweCBjb3VsZCBiZSBldmVuIGJldHRlciwgY291bGQgbWFuYWdlIHRvIGV4cGxpY2l0ZWx5CiAgIyByZXF1ZXN0IEM5OSBmYWNpbGl0aWVzIHRvIHRoZSB1bmRlcmx5aW5nIEMgaGVhZGVycy4KICBhY19zYXZlX0NYWEZMQUdTPSIkQ1hYRkxBR1MiCiAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAtc3RkPWMrKzk4IgogIGFjX3NhdmVfTElCUz0iJExJQlMiCiAgYWNfc2F2ZV9nY2Nfbm9fbGluaz0iJGdjY19ub19saW5rIgoKICBpZiB0ZXN0IHgkZ2NjX25vX2xpbmsgIT0geHllczsgdGhlbgogICAgIyBVc2UgLWZuby1leGNlcHRpb25zIHRvIHRoYXQgdGhlIEMgZHJpdmVyIGNhbiBsaW5rIHRoZXNlIHRlc3RzIHdpdGhvdXQKICAgICMgaGl0dGluZyB1bmRlZmluZWQgcmVmZXJlbmNlcyB0byBwZXJzb25hbGl0eSByb3V0aW5lcy4KICAgIENYWEZMQUdTPSIkQ1hYRkxBR1MgLWZuby1leGNlcHRpb25zIgogICAgQUNfQ0hFQ0tfTElCKG0sIHNpbiwgWwogICAgICBMSUJTPSIkTElCUyAtbG0iCiAgICBdLCBbCiAgICAgICMgVXNlIHRoZSBkZWZhdWx0IGNvbXBpbGUtb25seSB0ZXN0cyBpbiBHQ0NfVFJZX0NPTVBJTEVfT1JfTElOSwogICAgICBnY2Nfbm9fbGluaz15ZXMKICAgIF0pCiAgZmkKCiAgIyBDaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiA8bWF0aC5oPiBmdW5jdGlvbnMgdXNlZCBpZiBDOTkgaXMgZW5hYmxlZC4KICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBJU08gQzk5IHN1cHBvcnQgaW4gPG1hdGguaD5dKQogIEFDX0NBQ0hFX1ZBTChnbGliY3h4X2N2X2M5OV9tYXRoLCBbCiAgR0NDX1RSWV9DT01QSUxFX09SX0xJTksoCiAgICAgWyNpbmNsdWRlIDxtYXRoLmg+CiAgICAgIHZvbGF0aWxlIGRvdWJsZSBkMSwgZDI7CiAgICAgIHZvbGF0aWxlIGludCBpO10sCiAgICAgW2kgPSBmcGNsYXNzaWZ5KGQxKTsKICAgICAgaSA9IGlzZmluaXRlKGQxKTsKICAgICAgaSA9IGlzaW5mKGQxKTsKICAgICAgaSA9IGlzbmFuKGQxKTsKICAgICAgaSA9IGlzbm9ybWFsKGQxKTsKICAgICAgaSA9IHNpZ25iaXQoZDEpOwogICAgICBpID0gaXNncmVhdGVyKGQxLCBkMik7CiAgICAgIGkgPSBpc2dyZWF0ZXJlcXVhbChkMSwgZDIpOwogICAgICBpID0gaXNsZXNzKGQxLCBkMik7CiAgICAgIGkgPSBpc2xlc3NlcXVhbChkMSwgZDIpOwogICAgICBpID0gaXNsZXNzZ3JlYXRlcihkMSwgZDIpOwogICAgICBpID0gaXNsZXNzZ3JlYXRlcihkMSwgZDIpOwogICAgICBpID0gaXN1bm9yZGVyZWQoZDEsIGQyKTsKICAgICBdLFtnbGliY3h4X2N2X2M5OV9tYXRoPXllc10sIFtnbGliY3h4X2N2X2M5OV9tYXRoPW5vXSkKICBdKQogIEFDX01TR19SRVNVTFQoJGdsaWJjeHhfY3ZfYzk5X21hdGgpCiAgaWYgdGVzdCB4IiRnbGliY3h4X2N2X2M5OV9tYXRoIiA9IHgieWVzIjsgdGhlbgogICAgQUNfREVGSU5FKF9HTElCQ1hYX1VTRV9DOTlfTUFUSCwgMSwKICAgICAgICAgICAgICBbRGVmaW5lIGlmIEM5OSBmdW5jdGlvbnMgb3IgbWFjcm9zIGluIDxtYXRoLmg+IHNob3VsZCBiZSBpbXBvcnRlZAogICAgICAgICAgICAgIGluIDxjbWF0aD4gaW4gbmFtZXNwYWNlIHN0ZC5dKQogIGZpCgogICMgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgPGNvbXBsZXguaD4gY29tcGxleCBtYXRoIGZ1bmN0aW9ucy4KICAjIFRoaXMgaXMgbmVjZXNzYXJ5IGV2ZW4gdGhvdWdoIGxpYnN0ZGMrKyB1c2VzIHRoZSBidWlsdGluIHZlcnNpb25zCiAgIyBvZiB0aGVzZSBmdW5jdGlvbnMsIGJlY2F1c2UgaWYgdGhlIGJ1aWx0aW4gY2Fubm90IGJlIHVzZWQsIGEgcmVmZXJlbmNlCiAgIyB0byB0aGUgbGlicmFyeSBmdW5jdGlvbiBpcyBlbWl0dGVkLgogIEFDX0NIRUNLX0hFQURFUlModGdtYXRoLmgsIGFjX2hhc190Z21hdGhfaD15ZXMsIGFjX2hhc190Z21hdGhfaD1ubykKICBBQ19DSEVDS19IRUFERVJTKGNvbXBsZXguaCwgYWNfaGFzX2NvbXBsZXhfaD15ZXMsIGFjX2hhc19jb21wbGV4X2g9bm8pCiAgZ2xpYmN4eF9jdl9jOTlfY29tcGxleD1ubzsKICBpZiB0ZXN0IHgiJGFjX2hhc19jb21wbGV4X2giID0geCJ5ZXMiOyB0aGVuCiAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBJU08gQzk5IHN1cHBvcnQgaW4gPGNvbXBsZXguaD5dKQogICAgR0NDX1RSWV9DT01QSUxFX09SX0xJTksoCiAgICAgICBbI2luY2x1ZGUgPGNvbXBsZXguaD4KCXR5cGVkZWYgX19jb21wbGV4X18gZmxvYXQgZmxvYXRfdHlwZTsKCXR5cGVkZWYgX19jb21wbGV4X18gZG91YmxlIGRvdWJsZV90eXBlOwoJdHlwZWRlZiBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSBsZF90eXBlOwoJdm9sYXRpbGUgZmxvYXRfdHlwZSB0bXBmOwoJdm9sYXRpbGUgZG91YmxlX3R5cGUgdG1wZDsKCXZvbGF0aWxlIGxkX3R5cGUgdG1wbGQ7Cgl2b2xhdGlsZSBmbG9hdCBmOwoJdm9sYXRpbGUgZG91YmxlIGQ7Cgl2b2xhdGlsZSBsb25nIGRvdWJsZSBsZDtdLAogICAgICAgW2YgPSBjYWJzZih0bXBmKTsKCWYgPSBjYXJnZih0bXBmKTsKCXRtcGYgPSBjY29zZih0bXBmKTsKCXRtcGYgPSBjY29zaGYodG1wZik7Cgl0bXBmID0gY2V4cGYodG1wZik7Cgl0bXBmID0gY2xvZ2YodG1wZik7Cgl0bXBmID0gY3NpbmYodG1wZik7Cgl0bXBmID0gY3NpbmhmKHRtcGYpOwoJdG1wZiA9IGNzcXJ0Zih0bXBmKTsKCXRtcGYgPSBjdGFuZih0bXBmKTsKCXRtcGYgPSBjdGFuaGYodG1wZik7Cgl0bXBmID0gY3Bvd2YodG1wZiwgdG1wZik7Cgl0bXBmID0gY3Byb2pmKHRtcGYpOwoJZCA9IGNhYnModG1wZCk7CglkID0gY2FyZyh0bXBkKTsKCXRtcGQgPSBjY29zKHRtcGQpOwoJdG1wZCA9IGNjb3NoKHRtcGQpOwoJdG1wZCA9IGNleHAodG1wZCk7Cgl0bXBkID0gY2xvZyh0bXBkKTsKCXRtcGQgPSBjc2luKHRtcGQpOwoJdG1wZCA9IGNzaW5oKHRtcGQpOwoJdG1wZCA9IGNzcXJ0KHRtcGQpOwoJdG1wZCA9IGN0YW4odG1wZCk7Cgl0bXBkID0gY3RhbmgodG1wZCk7Cgl0bXBkID0gY3Bvdyh0bXBkLCB0bXBkKTsKCXRtcGQgPSBjcHJvaih0bXBkKTsKCWxkID0gY2Fic2wodG1wbGQpOwoJbGQgPSBjYXJnbCh0bXBsZCk7Cgl0bXBsZCA9IGNjb3NsKHRtcGxkKTsKCXRtcGxkID0gY2Nvc2hsKHRtcGxkKTsKCXRtcGxkID0gY2V4cGwodG1wbGQpOwoJdG1wbGQgPSBjbG9nbCh0bXBsZCk7Cgl0bXBsZCA9IGNzaW5sKHRtcGxkKTsKCXRtcGxkID0gY3NpbmhsKHRtcGxkKTsKCXRtcGxkID0gY3NxcnRsKHRtcGxkKTsKCXRtcGxkID0gY3RhbmwodG1wbGQpOwoJdG1wbGQgPSBjdGFuaGwodG1wbGQpOwoJdG1wbGQgPSBjcG93bCh0bXBsZCwgdG1wbGQpOwoJdG1wbGQgPSBjcHJvamwodG1wbGQpOwogICAgICAgXSxbZ2xpYmN4eF9jdl9jOTlfY29tcGxleD15ZXNdLCBbZ2xpYmN4eF9jdl9jOTlfY29tcGxleD1ub10pCiAgZmkKICBBQ19NU0dfUkVTVUxUKCRnbGliY3h4X2N2X2M5OV9jb21wbGV4KQogIGlmIHRlc3QgeCIkZ2xpYmN4eF9jdl9jOTlfY29tcGxleCIgPSB4InllcyI7IHRoZW4KICAgIEFDX0RFRklORShfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVgsIDEsCiAgICAgICAgICAgICAgW0RlZmluZSBpZiBDOTkgZnVuY3Rpb25zIGluIDxjb21wbGV4Lmg+IHNob3VsZCBiZSB1c2VkIGluCiAgICAgICAgICAgICAgPGNvbXBsZXg+LiBVc2luZyBjb21waWxlciBidWlsdGlucyBmb3IgdGhlc2UgZnVuY3Rpb25zIHJlcXVpcmVzCiAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyBDOTkgbGlicmFyeSBmdW5jdGlvbnMgdG8gYmUgcHJlc2VudC5dKQogIGZpCgogICMgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2UgaW4gPHN0ZGlvLmg+IG9mIHZzY2FuZiwgZXQuIGFsLgogIEFDX01TR19DSEVDS0lORyhbZm9yIElTTyBDOTkgc3VwcG9ydCBpbiA8c3RkaW8uaD5dKQogIEFDX0NBQ0hFX1ZBTChnbGliY3h4X2N2X2M5OV9zdGRpbywgWwogIEdDQ19UUllfQ09NUElMRV9PUl9MSU5LKAogICAgIFsjaW5jbHVkZSA8c3RkaW8uaD4KICAgICAgI2luY2x1ZGUgPHN0ZGFyZy5oPgogICAgICB2b2lkIGZvbyhjaGFyKiBmbXQsIC4uLikKICAgICAgewoJdmFfbGlzdCBhcmdzOyB2YV9zdGFydChhcmdzLCBmbXQpOwoJdmZzY2FuZihzdGRlcnIsICIlaSIsIGFyZ3MpOyAKCXZzY2FuZigiJWkiLCBhcmdzKTsKCXZzbnByaW50ZihmbXQsIDAsICIlaSIsIGFyZ3MpOwoJdnNzY2FuZihmbXQsICIlaSIsIGFyZ3MpOwogICAgICB9XSwKICAgICBbc25wcmludGYoIjEyIiwgMCwgIiVpIik7XSwKICAgICBbZ2xpYmN4eF9jdl9jOTlfc3RkaW89eWVzXSwgW2dsaWJjeHhfY3ZfYzk5X3N0ZGlvPW5vXSkKICBdKQogIEFDX01TR19SRVNVTFQoJGdsaWJjeHhfY3ZfYzk5X3N0ZGlvKQoKICAjIENoZWNrIGZvciB0aGUgZXhpc3RlbmNlIGluIDxzdGRsaWIuaD4gb2YgbGxkaXZfdCwgZXQuIGFsLgogIEFDX01TR19DSEVDS0lORyhbZm9yIElTTyBDOTkgc3VwcG9ydCBpbiA8c3RkbGliLmg+XSkKICBBQ19DQUNIRV9WQUwoZ2xpYmN4eF9jdl9jOTlfc3RkbGliLCBbCiAgR0NDX1RSWV9DT01QSUxFX09SX0xJTksoCiAgICAgWyNpbmNsdWRlIDxzdGRsaWIuaD4KICAgICAgdm9sYXRpbGUgZmxvYXQgZjsKICAgICAgdm9sYXRpbGUgbG9uZyBkb3VibGUgbGQ7CiAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgbG9uZyBsbDsKICAgICAgbGxkaXZfdCBteWRpdnQ7XSwKICAgICBbY2hhciogdG1wOwogICAgICBmID0gc3RydG9mKCJnbnUiLCAmdG1wKTsKICAgICAgbGQgPSBzdHJ0b2xkKCJnbnUiLCAmdG1wKTsKICAgICAgbGwgPSBzdHJ0b2xsKCJnbnUiLCAmdG1wLCAxMCk7CiAgICAgIGxsID0gc3RydG91bGwoImdudSIsICZ0bXAsIDEwKTsKICAgICAgbGwgPSBsbGFicygxMCk7CiAgICAgIG15ZGl2dCA9IGxsZGl2KDEwLDEpOwogICAgICBsbCA9IG15ZGl2dC5xdW90OwogICAgICBsbCA9IG15ZGl2dC5yZW07CiAgICAgIGxsID0gYXRvbGwoIjEwIik7CiAgICAgIF9FeGl0KDApOwogICAgICBdLFtnbGliY3h4X2N2X2M5OV9zdGRsaWI9eWVzXSwgW2dsaWJjeHhfY3ZfYzk5X3N0ZGxpYj1ub10pCiAgXSkKICBBQ19NU0dfUkVTVUxUKCRnbGliY3h4X2N2X2M5OV9zdGRsaWIpCgogICMgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2UgaW4gPHdjaGFyLmg+IG9mIHdjc3RvbGQsIGV0Yy4KICBnbGliY3h4X2N2X2M5OV93Y2hhcj1ubzsKICBpZiB0ZXN0IHgiJGFjX2hhc193Y2hhcl9oIiA9IHh5ZXMgJiYKICAgICB0ZXN0IHgiJGFjX2hhc193Y3R5cGVfaCIgPSB4eWVzOyB0aGVuCiAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBJU08gQzk5IHN1cHBvcnQgaW4gPHdjaGFyLmg+XSkJCiAgICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHdjaGFyLmg+CiAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlIHRlc3QKICAgICAgICAgICAgICAgICAgICB7CgkJICAgICAgdXNpbmcgOjp3Y3N0b2xkOwoJCSAgICAgIHVzaW5nIDo6d2NzdG9sbDsKCQkgICAgICB1c2luZyA6Ondjc3RvdWxsOwoJCSAgICB9CgkJICAgXSxbXSxbZ2xpYmN4eF9jdl9jOTlfd2NoYXI9eWVzXSwgW2dsaWJjeHhfY3ZfYzk5X3djaGFyPW5vXSkKCiAgICAjIENoZWNrcyBmb3Igd2lkZSBjaGFyYWN0ZXIgZnVuY3Rpb25zIHRoYXQgbWF5IG5vdCBiZSBwcmVzZW50LgogICAgIyBJbmplY3Rpb24gb2YgdGhlc2UgaXMgd3JhcHBlZCB3aXRoIGd1YXJkIG1hY3Jvcy4KICAgICMgTkI6IG9ubHkgcHV0IGZ1bmN0aW9ucyBoZXJlLCBpbnN0ZWFkIG9mIGltbWVkaWF0ZWx5IGFib3ZlLCBpZgogICAgIyBhYnNvbHV0ZWx5IG5lY2Vzc2FyeS4KICAgIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8d2NoYXIuaD4KICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgdGVzdCB7IHVzaW5nIDo6dmZ3c2NhbmY7IH0gXSwgW10sCiAJICAgIAkgICBbQUNfREVGSU5FKEhBVkVfVkZXU0NBTkYsMSwKCQkJW0RlZmluZWQgaWYgdmZ3c2NhbmYgZXhpc3RzLl0pXSxbXSkKCiAgICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHdjaGFyLmg+CiAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlIHRlc3QgeyB1c2luZyA6OnZzd3NjYW5mOyB9IF0sIFtdLAogCSAgICAJICAgW0FDX0RFRklORShIQVZFX1ZTV1NDQU5GLDEsCgkJCVtEZWZpbmVkIGlmIHZzd3NjYW5mIGV4aXN0cy5dKV0sW10pCgogICAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDx3Y2hhci5oPgogICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSB0ZXN0IHsgdXNpbmcgOjp2d3NjYW5mOyB9IF0sIFtdLAogCSAgICAJICAgW0FDX0RFRklORShIQVZFX1ZXU0NBTkYsMSxbRGVmaW5lZCBpZiB2d3NjYW5mIGV4aXN0cy5dKV0sW10pCgogICAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDx3Y2hhci5oPgogICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSB0ZXN0IHsgdXNpbmcgOjp3Y3N0b2Y7IH0gXSwgW10sCiAJICAgIAkgICBbQUNfREVGSU5FKEhBVkVfV0NTVE9GLDEsW0RlZmluZWQgaWYgd2NzdG9mIGV4aXN0cy5dKV0sW10pCgogICAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDx3Y3R5cGUuaD5dLAogICAgICAgICAgICAgICAgICAgWyB3aW50X3QgdDsgaW50IGkgPSBpc3dibGFuayh0KTtdLCAKIAkgICAgCSAgIFtBQ19ERUZJTkUoSEFWRV9JU1dCTEFOSywxLAoJCQlbRGVmaW5lZCBpZiBpc3dibGFuayBleGlzdHMuXSldLFtdKQoKICAgIEFDX01TR19SRVNVTFQoJGdsaWJjeHhfY3ZfYzk5X3djaGFyKQogIGZpCgogICMgT3B0aW9uIHBhcnNlZCwgbm93IHNldCB0aGluZ3MgYXBwcm9wcmlhdGVseS4KICBpZiB0ZXN0IHgiJGdsaWJjeHhfY3ZfYzk5X21hdGgiID0geCJubyIgfHwKICAgICB0ZXN0IHgiJGdsaWJjeHhfY3ZfYzk5X2NvbXBsZXgiID0geCJubyIgfHwKICAgICB0ZXN0IHgiJGdsaWJjeHhfY3ZfYzk5X3N0ZGlvIiA9IHgibm8iIHx8CiAgICAgdGVzdCB4IiRnbGliY3h4X2N2X2M5OV9zdGRsaWIiID0geCJubyIgfHwKICAgICB0ZXN0IHgiJGdsaWJjeHhfY3ZfYzk5X3djaGFyIiA9IHgibm8iOyB0aGVuCiAgICBlbmFibGVfYzk5PW5vOwogIGVsc2UKICAgIEFDX0RFRklORShfR0xJQkNYWF9VU0VfQzk5LCAxLAogICAgW0RlZmluZSBpZiBDOTkgZnVuY3Rpb25zIG9yIG1hY3JvcyBmcm9tIDx3Y2hhci5oPiwgPG1hdGguaD4sCiAgICA8Y29tcGxleC5oPiwgPHN0ZGlvLmg+LCBhbmQgPHN0ZGxpYi5oPiBjYW4gYmUgdXNlZCBvciBleHBvc2VkLl0pCiAgZmkKCiAgZ2NjX25vX2xpbms9IiRhY19zYXZlX2djY19ub19saW5rIgogIExJQlM9IiRhY19zYXZlX0xJQlMiCiAgQ1hYRkxBR1M9IiRhY19zYXZlX0NYWEZMQUdTIgogIEFDX0xBTkdfUkVTVE9SRQogIGZpCQoKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBmdWxseSBlbmFibGVkIElTTyBDOTkgc3VwcG9ydF0pCiAgQUNfTVNHX1JFU1VMVCgkZW5hYmxlX2M5OSkKXSkKCgpkbmwKZG5sIENoZWNrIGZvciBjbG9ja19nZXR0aW1lLCBuYW5vc2xlZXAgYW5kIHNjaGVkX3lpZWxkLCB1c2VkIGluIHRoZQpkbmwgaW1wbGVtZW50YXRpb24gb2YgMjAuOC41IFt0aW1lLmNsb2NrXSwgYW5kIDMwLjIuMiBbdGhyZWFkLnRocmVhZC50aGlzXQpkbmwgaW4gdGhlIGN1cnJlbnQgQysrMHggd29ya2luZyBkcmFmdC4KZG5sCmRubCAtLWVuYWJsZS1saWJzdGRjeHgtdGltZQpkbmwgLS1lbmFibGUtbGlic3RkY3h4LXRpbWU9eWVzCmRubCAgICAgICAgY2hlY2tzIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIG1vbm90b25pYyBhbmQgcmVhbHRpbWUgY2xvY2tzLApkbmwgICAgICAgIG5hbm9zbGVlcCBhbmQgc2NoZWRfeWllbGQgaW4gbGliYyBhbmQgbGlicG9zaXg0IGFuZCwgaW4gY2FzZSwgbGlua3MKZG5sICAgICAgIHRoZSBsYXR0ZXIKZG5sIC0tZW5hYmxlLWxpYnN0ZGN4eC10aW1lPXJ0CmRubCAgICAgICAgYWxzbyBzZWFyY2hlcyAoYW5kLCBpbiBjYXNlLCBsaW5rcykgbGlicnQuICBOb3RlIHRoYXQgdGhpcyBpcwpkbmwgICAgICAgIG5vdCBhbHdheXMgZGVzaXJhYmxlIGJlY2F1c2UsIGluIGdsaWJjLCBmb3IgZXhhbXBsZSwgaW4gdHVybiBpdApkbmwgICAgICAgIHRyaWdnZXJzIHRoZSBsaW5raW5nIG9mIGxpYnB0aHJlYWQgdG9vLCB3aGljaCBhY3RpdmF0ZXMgbG9ja2luZywKZG5sICAgICAgICBhIGxhcmdlIG92ZXJoZWFkIGZvciBzaW5nbGUtdGhyZWFkIHByb2dyYW1zLgpkbmwgLS1lbmFibGUtbGlic3RkY3h4LXRpbWU9bm8KZG5sIC0tZGlzYWJsZS1saWJzdGRjeHgtdGltZQpkbmwgICAgICAgIGRpc2FibGVzIHRoZSBjaGVja3MgY29tcGxldGVseQpkbmwKQUNfREVGVU4oW0dMSUJDWFhfRU5BQkxFX0xJQlNURENYWF9USU1FXSwgWwoKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBjbG9ja19nZXR0aW1lLCBuYW5vc2xlZXAgYW5kIHNjaGVkX3lpZWxkXSkKICBHTElCQ1hYX0VOQUJMRShsaWJzdGRjeHgtdGltZSwkMSxbPUtJTkRdLAogICAgW3VzZSBLSU5EIGZvciBjaGVjayB0eXBlXSwKICAgIFtwZXJtaXQgeWVzfG5vfHJ0XSkKCiAgQUNfTEFOR19TQVZFCiAgQUNfTEFOR19DUExVU1BMVVMKICBhY19zYXZlX0NYWEZMQUdTPSIkQ1hYRkxBR1MiCiAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAtZm5vLWV4Y2VwdGlvbnMiCiAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKCiAgYWNfaGFzX2Nsb2NrX21vbm90b25pYz1ubzsKICBhY19oYXNfY2xvY2tfcmVhbHRpbWU9bm87CgogIGlmIHRlc3QgeCIkZW5hYmxlX2xpYnN0ZGN4eF90aW1lIiAhPSB4Im5vIjsgdGhlbgoKICAgIGlmIHRlc3QgeCIkZW5hYmxlX2xpYnN0ZGN4eF90aW1lIiA9IHgicnQiOyB0aGVuCiAgICAgIEFDX1NFQVJDSF9MSUJTKGNsb2NrX2dldHRpbWUsIFtydCBwb3NpeDRdKQogICAgICBBQ19TRUFSQ0hfTElCUyhuYW5vc2xlZXAsIFtydCBwb3NpeDRdKQogICAgZWxzZQogICAgICBBQ19TRUFSQ0hfTElCUyhjbG9ja19nZXR0aW1lLCBbcG9zaXg0XSkKICAgICAgQUNfU0VBUkNIX0xJQlMobmFub3NsZWVwLCBbcG9zaXg0XSkKICAgIGZpCgogICAgY2FzZSAiJGFjX2N2X3NlYXJjaF9jbG9ja19nZXR0aW1lIiBpbgogICAgICAtbCopIEdMSUJDWFhfTElCUz0kYWNfY3Zfc2VhcmNoX2Nsb2NrX2dldHRpbWUKICAgICAgOzsKICAgIGVzYWMKICAgIGNhc2UgIiRhY19jdl9zZWFyY2hfbmFub3NsZWVwIiBpbgogICAgICAtbCopIEdMSUJDWFhfTElCUz0iJEdMSUJDWFhfTElCUyAkYWNfY3Zfc2VhcmNoX25hbm9zbGVlcCIKICAgICAgOzsKICAgIGVzYWMKCiAgICBBQ19TRUFSQ0hfTElCUyhzY2hlZF95aWVsZCwgW3J0IHBvc2l4NF0pCgogICAgY2FzZSAiJGFjX2N2X3NlYXJjaF9zY2hlZF95aWVsZCIgaW4KICAgICAgLWxwb3NpeDQqKQogICAgICBHTElCQ1hYX0xJQlM9IiRHTElCQ1hYX0xJQlMgJGFjX2N2X3NlYXJjaF9zY2hlZF95aWVsZCIKICAgICAgQUNfREVGSU5FKF9HTElCQ1hYX1VTRV9TQ0hFRF9ZSUVMRCwgMSwKICAgICAgICAgICAgICAgIFsgRGVmaW5lZCBpZiBzY2hlZF95aWVsZCBpcyBhdmFpbGFibGUuIF0pCiAgICAgIDs7CiAgICAgIC1scnQqKQogICAgICBpZiB0ZXN0IHgiJGVuYWJsZV9saWJzdGRjeHhfdGltZSIgPSB4InJ0IjsgdGhlbgogICAgICAgIEdMSUJDWFhfTElCUz0iJEdMSUJDWFhfTElCUyAkYWNfY3Zfc2VhcmNoX3NjaGVkX3lpZWxkIgoJQUNfREVGSU5FKF9HTElCQ1hYX1VTRV9TQ0hFRF9ZSUVMRCwgMSwgCgkgICAgICAgICAgWyBEZWZpbmVkIGlmIHNjaGVkX3lpZWxkIGlzIGF2YWlsYWJsZS4gXSkKICAgICAgZmkKICAgICAgOzsKICAgICAgKikKICAgICAgQUNfREVGSU5FKF9HTElCQ1hYX1VTRV9TQ0hFRF9ZSUVMRCwgMSwKICAgICAgICAgICAgICAgIFsgRGVmaW5lZCBpZiBzY2hlZF95aWVsZCBpcyBhdmFpbGFibGUuIF0pCiAgICAgIDs7CiAgICBlc2FjCgogICAgQUNfQ0hFQ0tfSEVBREVSUyh1bmlzdGQuaCwgYWNfaGFzX3VuaXN0ZF9oPXllcywgYWNfaGFzX3VuaXN0ZF9oPW5vKQoKICAgIGlmIHRlc3QgeCIkYWNfaGFzX3VuaXN0ZF9oIiA9IHgieWVzIjsgdGhlbgogICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBtb25vdG9uaWMgY2xvY2tdKQogICAgICBBQ19UUllfTElOSygKICAgICAgICBbI2luY2x1ZGUgPHVuaXN0ZC5oPgogICAgICAgICAjaW5jbHVkZSA8dGltZS5oPgogICAgICAgIF0sCiAgICAgICAgWyNpZiBfUE9TSVhfVElNRVJTID4gMCAmJiBkZWZpbmVkKF9QT1NJWF9NT05PVE9OSUNfQ0xPQ0spCiAgICAgICAgICB0aW1lc3BlYyB0cDsgICAgIAogICAgICAgICAjZW5kaWYKICAgICAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHApOwogICAgICAgIF0sIFthY19oYXNfY2xvY2tfbW9ub3RvbmljPXllc10sIFthY19oYXNfY2xvY2tfbW9ub3RvbmljPW5vXSkKCiAgICAgIEFDX01TR19SRVNVTFQoJGFjX2hhc19jbG9ja19tb25vdG9uaWMpICAgCiAgICAKICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgcmVhbHRpbWUgY2xvY2tdKQogICAgICBBQ19UUllfTElOSygKICAgICAgICBbI2luY2x1ZGUgPHVuaXN0ZC5oPgogICAgICAgICAjaW5jbHVkZSA8dGltZS5oPgogICAgICAgIF0sCiAgICAgICAgWyNpZiBfUE9TSVhfVElNRVJTID4gMAogICAgICAgICAgdGltZXNwZWMgdHA7ICAgICAgCiAgICAgICAgICNlbmRpZgogICAgICAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRwKTsKICAgICAgICBdLCBbYWNfaGFzX2Nsb2NrX3JlYWx0aW1lPXllc10sIFthY19oYXNfY2xvY2tfcmVhbHRpbWU9bm9dKQoKICAgICAgQUNfTVNHX1JFU1VMVCgkYWNfaGFzX2Nsb2NrX3JlYWx0aW1lKQoKICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbmFub3NsZWVwXSkKICAgICAgQUNfVFJZX0xJTksoCiAgICAgICAgWyNpbmNsdWRlIDx1bmlzdGQuaD4KICAgICAgICAgI2luY2x1ZGUgPHRpbWUuaD4KICAgICAgICBdLAogICAgICAgIFsjaWYgX1BPU0lYX1RJTUVSUyA+IDAKICAgICAgICAgIHRpbWVzcGVjIHRwOwogICAgICAgICAjZW5kaWYKICAgICAgICAgIG5hbm9zbGVlcCgmdHAsIDApOwogICAgICAgIF0sIFthY19oYXNfbmFub3NsZWVwPXllc10sIFthY19oYXNfbmFub3NsZWVwPW5vXSkKCiAgICAgIEFDX01TR19SRVNVTFQoJGFjX2hhc19uYW5vc2xlZXApCiAgICBmaQogIGZpCgogIGlmIHRlc3QgeCIkYWNfaGFzX2Nsb2NrX21vbm90b25pYyIgPSB4InllcyI7IHRoZW4KICAgIEFDX0RFRklORShfR0xJQkNYWF9VU0VfQ0xPQ0tfTU9OT1RPTklDLCAxLAogICAgICBbIERlZmluZWQgaWYgY2xvY2tfZ2V0dGltZSBoYXMgbW9ub3RvbmljIGNsb2NrIHN1cHBvcnQuIF0pCiAgZmkKCiAgaWYgdGVzdCB4IiRhY19oYXNfY2xvY2tfcmVhbHRpbWUiID0geCJ5ZXMiOyB0aGVuCiAgICBBQ19ERUZJTkUoX0dMSUJDWFhfVVNFX0NMT0NLX1JFQUxUSU1FLCAxLAogICAgICBbIERlZmluZWQgaWYgY2xvY2tfZ2V0dGltZSBoYXMgcmVhbHRpbWUgY2xvY2sgc3VwcG9ydC4gXSkKICBmaQoKICBpZiB0ZXN0IHgiJGFjX2hhc19uYW5vc2xlZXAiID0geCJ5ZXMiOyB0aGVuCiAgICBBQ19ERUZJTkUoX0dMSUJDWFhfVVNFX05BTk9TTEVFUCwgMSwKICAgICAgWyBEZWZpbmVkIGlmIG5hbm9zbGVlcCBpcyBhdmFpbGFibGUuIF0pCiAgZmkKCiAgQUNfU1VCU1QoR0xJQkNYWF9MSUJTKQoKICBDWFhGTEFHUz0iJGFjX3NhdmVfQ1hYRkxBR1MiCiAgTElCUz0iJGFjX3NhdmVfTElCUyIKICBBQ19MQU5HX1JFU1RPUkUKXSkKCmRubApkbmwgQ2hlY2sgZm9yIGdldHRpbWVvZmRheSwgdXNlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgMjAuOC41CmRubCBbdGltZS5jbG9ja10gaW4gdGhlIGN1cnJlbnQgQysrMHggd29ya2luZyBkcmFmdC4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0NIRUNLX0dFVFRJTUVPRkRBWV0sIFsKICAKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBnZXR0aW1lb2ZkYXldKQoKICBBQ19MQU5HX1NBVkUKICBBQ19MQU5HX0NQTFVTUExVUwogIGFjX3NhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKICBDWFhGTEFHUz0iJENYWEZMQUdTIC1mbm8tZXhjZXB0aW9ucyIKICAKICBhY19oYXNfZ2V0dGltZW9mZGF5PW5vOwogIEFDX0NIRUNLX0hFQURFUlMoc3lzL3RpbWUuaCwgYWNfaGFzX3N5c190aW1lX2g9eWVzLCBhY19oYXNfc3lzX3RpbWVfaD1ubykKICBpZiB0ZXN0IHgiJGFjX2hhc19zeXNfdGltZV9oIiA9IHgieWVzIjsgdGhlbgogICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgZ2V0dGltZW9mZGF5XSkKICAgIEdDQ19UUllfQ09NUElMRV9PUl9MSU5LKFsjaW5jbHVkZSA8c3lzL3RpbWUuaD5dLAogICAgICBbdGltZXZhbCB0djsgZ2V0dGltZW9mZGF5KCZ0diwgMCk7XSwKICAgICAgW2FjX2hhc19nZXR0aW1lb2ZkYXk9eWVzXSwgW2FjX2hhc19nZXR0aW1lb2ZkYXk9bm9dKQogICAgCiAgICBBQ19NU0dfUkVTVUxUKCRhY19oYXNfZ2V0dGltZW9mZGF5KQogIGZpCiAgCiAgaWYgdGVzdCB4IiRhY19oYXNfZ2V0dGltZW9mZGF5IiA9IHgieWVzIjsgdGhlbgogICAgQUNfREVGSU5FKF9HTElCQ1hYX1VTRV9HRVRUSU1FT0ZEQVksIDEsCiAgICAgIFsgRGVmaW5lZCBpZiBnZXR0aW1lb2ZkYXkgaXMgYXZhaWxhYmxlLiBdKQogIGZpCiAgCiAgQ1hYRkxBR1M9IiRhY19zYXZlX0NYWEZMQUdTIgogIEFDX0xBTkdfUkVTVE9SRQpdKQoKZG5sCmRubCBDaGVjayBmb3IgSVNPL0lFQyA5ODk5OjE5OTkgIkM5OSIgc3VwcG9ydCB0byBJU08vSUVDIERUUiAxOTc2OCAiVFIxIgpkbmwgZmFjaWxpdGllcyBpbiBDaGFwdGVyIDgsICJDIGNvbXBhdGliaWxpdHkiLgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfQ0hFQ0tfQzk5X1RSMV0sIFsKCiAgQUNfTEFOR19TQVZFCiAgQUNfTEFOR19DUExVU1BMVVMKCiAgIyBVc2UgLXN0ZD1jKys5OCBiZWNhdXNlIHRoZSBkZWZhdWx0ICgtc3RkPWdudSsrOTgpIGxlYXZlcyBfX1NUUklDVF9BTlNJX18KICAjIHVuZGVmaW5lZCBhbmQgZmFrZSBDOTkgZmFjaWxpdGllcyBtYXkgYmUgc3B1cmlvdXNseSBlbmFibGVkLgogIGFjX3NhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKICBDWFhGTEFHUz0iJENYWEZMQUdTIC1zdGQ9YysrOTgiCgogICMgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgPGNvbXBsZXguaD4gY29tcGxleCBtYXRoIGZ1bmN0aW9ucyB1c2VkCiAgIyBieSB0cjEvY29tcGxleC4KICBBQ19DSEVDS19IRUFERVJTKGNvbXBsZXguaCwgYWNfaGFzX2NvbXBsZXhfaD15ZXMsIGFjX2hhc19jb21wbGV4X2g9bm8pCiAgYWNfYzk5X2NvbXBsZXhfdHIxPW5vOwogIGlmIHRlc3QgeCIkYWNfaGFzX2NvbXBsZXhfaCIgPSB4InllcyI7IHRoZW4KICAgIEFDX01TR19DSEVDS0lORyhbZm9yIElTTyBDOTkgc3VwcG9ydCB0byBUUjEgaW4gPGNvbXBsZXguaD5dKQogICAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxjb21wbGV4Lmg+XSwKCSAgICAgICAgICAgW3R5cGVkZWYgX19jb21wbGV4X18gZmxvYXQgZmxvYXRfdHlwZTsgZmxvYXRfdHlwZSB0bXBmOwoJICAgICAgICAgICAgY2Fjb3NmKHRtcGYpOwoJICAgICAgICAgICAgY2FzaW5mKHRtcGYpOwoJICAgICAgICAgICAgY2F0YW5mKHRtcGYpOwoJICAgICAgICAgICAgY2Fjb3NoZih0bXBmKTsKCSAgICAgICAgICAgIGNhc2luaGYodG1wZik7CgkgICAgICAgICAgICBjYXRhbmhmKHRtcGYpOwoJCSAgICB0eXBlZGVmIF9fY29tcGxleF9fIGRvdWJsZSBkb3VibGVfdHlwZTsgZG91YmxlX3R5cGUgdG1wZDsKCSAgICAgICAgICAgIGNhY29zKHRtcGQpOwoJICAgICAgICAgICAgY2FzaW4odG1wZCk7CgkgICAgICAgICAgICBjYXRhbih0bXBkKTsKCSAgICAgICAgICAgIGNhY29zaCh0bXBkKTsKCSAgICAgICAgICAgIGNhc2luaCh0bXBkKTsKCSAgICAgICAgICAgIGNhdGFuaCh0bXBkKTsKCQkgICAgdHlwZWRlZiBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSBsZF90eXBlOyBsZF90eXBlIHRtcGxkOwoJICAgICAgICAgICAgY2Fjb3NsKHRtcGxkKTsKCSAgICAgICAgICAgIGNhc2lubCh0bXBsZCk7CgkgICAgICAgICAgICBjYXRhbmwodG1wbGQpOwoJICAgICAgICAgICAgY2Fjb3NobCh0bXBsZCk7CgkgICAgICAgICAgICBjYXNpbmhsKHRtcGxkKTsKCSAgICAgICAgICAgIGNhdGFuaGwodG1wbGQpOwoJCSAgIF0sW2FjX2M5OV9jb21wbGV4X3RyMT15ZXNdLCBbYWNfYzk5X2NvbXBsZXhfdHIxPW5vXSkKICBmaQogIEFDX01TR19SRVNVTFQoJGFjX2M5OV9jb21wbGV4X3RyMSkKICBpZiB0ZXN0IHgiJGFjX2M5OV9jb21wbGV4X3RyMSIgPSB4InllcyI7IHRoZW4KICAgIEFDX0RFRklORShfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVhfVFIxLCAxLAogICAgICAgICAgICAgIFtEZWZpbmUgaWYgQzk5IGZ1bmN0aW9ucyBpbiA8Y29tcGxleC5oPiBzaG91bGQgYmUgdXNlZCBpbgogICAgICAgICAgICAgIDx0cjEvY29tcGxleD4uIFVzaW5nIGNvbXBpbGVyIGJ1aWx0aW5zIGZvciB0aGVzZSBmdW5jdGlvbnMKCSAgICAgIHJlcXVpcmVzIGNvcnJlc3BvbmRpbmcgQzk5IGxpYnJhcnkgZnVuY3Rpb25zIHRvIGJlIHByZXNlbnQuXSkKICBmaQoKICAjIENoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIDxjdHlwZS5oPiBmdW5jdGlvbnMuCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgSVNPIEM5OSBzdXBwb3J0IHRvIFRSMSBpbiA8Y3R5cGUuaD5dKQogIEFDX0NBQ0hFX1ZBTChnbGliY3h4X2N2X2M5OV9jdHlwZV90cjEsIFsKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPGN0eXBlLmg+XSwKCSAgICAgICAgIFtpbnQgY2g7CgkgICAgICAgICAgaW50IHJldDsKCSAgICAgICAgICByZXQgPSBpc2JsYW5rKGNoKTsKCQkgXSxbZ2xpYmN4eF9jdl9jOTlfY3R5cGVfdHIxPXllc10sCgkJICAgW2dsaWJjeHhfY3ZfYzk5X2N0eXBlX3RyMT1ub10pCiAgXSkKICBBQ19NU0dfUkVTVUxUKCRnbGliY3h4X2N2X2M5OV9jdHlwZV90cjEpCiAgaWYgdGVzdCB4IiRnbGliY3h4X2N2X2M5OV9jdHlwZV90cjEiID0geCJ5ZXMiOyB0aGVuCiAgICBBQ19ERUZJTkUoX0dMSUJDWFhfVVNFX0M5OV9DVFlQRV9UUjEsIDEsCiAgICAgICAgICAgICAgW0RlZmluZSBpZiBDOTkgZnVuY3Rpb25zIGluIDxjdHlwZS5oPiBzaG91bGQgYmUgaW1wb3J0ZWQgaW4KCSAgICAgIDx0cjEvY2N0eXBlPiBpbiBuYW1lc3BhY2Ugc3RkOjp0cjEuXSkKICBmaQoKICAjIENoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIDxmZW52Lmg+IGZ1bmN0aW9ucy4KICBBQ19DSEVDS19IRUFERVJTKGZlbnYuaCwgYWNfaGFzX2ZlbnZfaD15ZXMsIGFjX2hhc19mZW52X2g9bm8pCiAgYWNfYzk5X2ZlbnZfdHIxPW5vOwogIGlmIHRlc3QgeCIkYWNfaGFzX2ZlbnZfaCIgPSB4InllcyI7IHRoZW4KICAgIEFDX01TR19DSEVDS0lORyhbZm9yIElTTyBDOTkgc3VwcG9ydCB0byBUUjEgaW4gPGZlbnYuaD5dKQogICAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxmZW52Lmg+XSwKCSAgICAgICAgICAgW2ludCBleGNlcHQsIG1vZGU7CgkgICAgICAgICAgICBmZXhjZXB0X3QqIHBmbGFnOwogICAgICAgICAgICAgICAgICAgIGZlbnZfdCogcGVudjsKCSAgICAgICAgICAgIGludCByZXQ7CgkgICAgICAgICAgICByZXQgPSBmZWNsZWFyZXhjZXB0KGV4Y2VwdCk7CgkgICAgICAgICAgICByZXQgPSBmZWdldGV4Y2VwdGZsYWcocGZsYWcsIGV4Y2VwdCk7CgkgICAgICAgICAgICByZXQgPSBmZXJhaXNlZXhjZXB0KGV4Y2VwdCk7CgkgICAgICAgICAgICByZXQgPSBmZXNldGV4Y2VwdGZsYWcocGZsYWcsIGV4Y2VwdCk7CgkgICAgICAgICAgICByZXQgPSBmZXRlc3RleGNlcHQoZXhjZXB0KTsKCSAgICAgICAgICAgIHJldCA9IGZlZ2V0cm91bmQoKTsKCSAgICAgICAgICAgIHJldCA9IGZlc2V0cm91bmQobW9kZSk7CgkgICAgICAgICAgICByZXQgPSBmZWdldGVudihwZW52KTsKCSAgICAgICAgICAgIHJldCA9IGZlaG9sZGV4Y2VwdChwZW52KTsKCSAgICAgICAgICAgIHJldCA9IGZlc2V0ZW52KHBlbnYpOwoJICAgICAgICAgICAgcmV0ID0gZmV1cGRhdGVlbnYocGVudik7CgkJICAgXSxbYWNfYzk5X2ZlbnZfdHIxPXllc10sIFthY19jOTlfZmVudl90cjE9bm9dKQogIGZpCiAgQUNfTVNHX1JFU1VMVCgkYWNfYzk5X2ZlbnZfdHIxKQogIGlmIHRlc3QgeCIkYWNfYzk5X2ZlbnZfdHIxIiA9IHgieWVzIjsgdGhlbgogICAgQUNfREVGSU5FKF9HTElCQ1hYX1VTRV9DOTlfRkVOVl9UUjEsIDEsCiAgICAgICAgICAgICAgW0RlZmluZSBpZiBDOTkgZnVuY3Rpb25zIGluIDxmZW52Lmg+IHNob3VsZCBiZSBpbXBvcnRlZCBpbgoJICAgICAgPHRyMS9jZmVudj4gaW4gbmFtZXNwYWNlIHN0ZDo6dHIxLl0pCiAgZmkKCiAgIyBDaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiA8c3RkaW50Lmg+IHR5cGVzLgogIEFDX01TR19DSEVDS0lORyhbZm9yIElTTyBDOTkgc3VwcG9ydCB0byBUUjEgaW4gPHN0ZGludC5oPl0pCiAgQUNfQ0FDSEVfVkFMKGdsaWJjeHhfY3ZfYzk5X3N0ZGludF90cjEsIFsKICBBQ19UUllfQ09NUElMRShbI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCiAgICAgICAgICAgICAgICAgICNkZWZpbmUgX19TVERDX0NPTlNUQU5UX01BQ1JPUwogICAgICAgICAgICAgICAgICAjaW5jbHVkZSA8c3RkaW50Lmg+XSwKCSAgICAgICAgIFt0eXBlZGVmIGludDhfdCAgICAgICAgICBteV9pbnQ4X3Q7CgkJICBteV9pbnQ4X3QgICAgICAgICAgICAgICBpOCA9IElOVDhfTUlOOwoJCSAgaTggPSBJTlQ4X01BWDsKCSAgICAgICAgICB0eXBlZGVmIGludDE2X3QgICAgICAgICBteV9pbnQxNl90OwoJCSAgbXlfaW50MTZfdCAgICAgICAgICAgICAgaTE2ID0gSU5UMTZfTUlOOwoJCSAgaTE2ID0gSU5UMTZfTUFYOwoJICAgICAgICAgIHR5cGVkZWYgaW50MzJfdCAgICAgICAgIG15X2ludDMyX3Q7CgkJICBteV9pbnQzMl90ICAgICAgICAgICAgICBpMzIgPSBJTlQzMl9NSU47CgkJICBpMzIgPSBJTlQzMl9NQVg7CgkgICAgICAgICAgdHlwZWRlZiBpbnQ2NF90ICAgICAgICAgbXlfaW50NjRfdDsKCQkgIG15X2ludDY0X3QgICAgICAgICAgICAgIGk2NCA9IElOVDY0X01JTjsKCQkgIGk2NCA9IElOVDY0X01BWDsKCSAgICAgICAgICB0eXBlZGVmIGludF9mYXN0OF90ICAgICBteV9pbnRfZmFzdDhfdDsKCQkgIG15X2ludF9mYXN0OF90ICAgICAgICAgIGlmOCA9IElOVF9GQVNUOF9NSU47CgkJICBpZjggPSBJTlRfRkFTVDhfTUFYOwoJICAgICAgICAgIHR5cGVkZWYgaW50X2Zhc3QxNl90ICAgIG15X2ludF9mYXN0MTZfdDsKCQkgIG15X2ludF9mYXN0MTZfdCAgICAgICAgIGlmMTYgPSBJTlRfRkFTVDE2X01JTjsKCQkgIGlmMTYgPSBJTlRfRkFTVDE2X01BWDsKCSAgICAgICAgICB0eXBlZGVmIGludF9mYXN0MzJfdCAgICBteV9pbnRfZmFzdDMyX3Q7CgkJICBteV9pbnRfZmFzdDMyX3QgICAgICAgICBpZjMyID0gSU5UX0ZBU1QzMl9NSU47CgkJICBpZjMyID0gSU5UX0ZBU1QzMl9NQVg7CgkgICAgICAgICAgdHlwZWRlZiBpbnRfZmFzdDY0X3QgICAgbXlfaW50X2Zhc3Q2NF90OwoJCSAgbXlfaW50X2Zhc3Q2NF90ICAgICAgICAgaWY2NCA9IElOVF9GQVNUNjRfTUlOOwoJCSAgaWY2NCA9IElOVF9GQVNUNjRfTUFYOwoJICAgICAgICAgIHR5cGVkZWYgaW50X2xlYXN0OF90ICAgIG15X2ludF9sZWFzdDhfdDsKCQkgIG15X2ludF9sZWFzdDhfdCAgICAgICAgIGlsOCA9IElOVF9MRUFTVDhfTUlOOwoJCSAgaWw4ID0gSU5UX0xFQVNUOF9NQVg7CgkgICAgICAgICAgdHlwZWRlZiBpbnRfbGVhc3QxNl90ICAgbXlfaW50X2xlYXN0MTZfdDsKCQkgIG15X2ludF9sZWFzdDE2X3QgICAgICAgIGlsMTYgPSBJTlRfTEVBU1QxNl9NSU47CgkJICBpbDE2ID0gSU5UX0xFQVNUMTZfTUFYOwoJICAgICAgICAgIHR5cGVkZWYgaW50X2xlYXN0MzJfdCAgIG15X2ludF9sZWFzdDMyX3Q7CgkJICBteV9pbnRfbGVhc3QzMl90ICAgICAgICBpbDMyID0gSU5UX0xFQVNUMzJfTUlOOwoJCSAgaWwzMiA9IElOVF9MRUFTVDMyX01BWDsKCSAgICAgICAgICB0eXBlZGVmIGludF9sZWFzdDY0X3QgICBteV9pbnRfbGVhc3Q2NF90OwoJCSAgbXlfaW50X2xlYXN0NjRfdCAgICAgICAgaWw2NCA9IElOVF9MRUFTVDY0X01JTjsKCQkgIGlsNjQgPSBJTlRfTEVBU1Q2NF9NQVg7CgkJICB0eXBlZGVmIGludG1heF90ICAgICAgICBteV9pbnRtYXhfdDsKCQkgIG15X2ludG1heF90ICAgICAgICAgICAgIGltID0gSU5UTUFYX01BWDsKCQkgIGltID0gSU5UTUFYX01JTjsKCQkgIHR5cGVkZWYgaW50cHRyX3QgICAgICAgIG15X2ludHB0cl90OwoJCSAgbXlfaW50cHRyX3QgICAgICAgICAgICAgaXAgPSBJTlRQVFJfTUFYOwoJCSAgaXAgPSBJTlRQVFJfTUlOOwoJICAgICAgICAgIHR5cGVkZWYgdWludDhfdCAgICAgICAgIG15X3VpbnQ4X3Q7CgkJICBteV91aW50OF90ICAgICAgICAgICAgICB1aTggPSBVSU5UOF9NQVg7CgkJICB1aTggPSBVSU5UOF9NQVg7CgkgICAgICAgICAgdHlwZWRlZiB1aW50MTZfdCAgICAgICAgbXlfdWludDE2X3Q7CgkJICBteV91aW50MTZfdCAgICAgICAgICAgICB1aTE2ID0gVUlOVDE2X01BWDsKCQkgIHVpMTYgPSBVSU5UMTZfTUFYOwoJICAgICAgICAgIHR5cGVkZWYgdWludDMyX3QgICAgICAgIG15X3VpbnQzMl90OwoJCSAgbXlfdWludDMyX3QgICAgICAgICAgICAgdWkzMiA9IFVJTlQzMl9NQVg7CgkJICB1aTMyID0gVUlOVDMyX01BWDsKCSAgICAgICAgICB0eXBlZGVmIHVpbnQ2NF90ICAgICAgICBteV91aW50NjRfdDsKCQkgIG15X3VpbnQ2NF90ICAgICAgICAgICAgIHVpNjQgPSBVSU5UNjRfTUFYOwoJCSAgdWk2NCA9IFVJTlQ2NF9NQVg7CgkgICAgICAgICAgdHlwZWRlZiB1aW50X2Zhc3Q4X3QgICAgbXlfdWludF9mYXN0OF90OwoJCSAgbXlfdWludF9mYXN0OF90ICAgICAgICAgdWlmOCA9IFVJTlRfRkFTVDhfTUFYOwoJCSAgdWlmOCA9IFVJTlRfRkFTVDhfTUFYOwoJICAgICAgICAgIHR5cGVkZWYgdWludF9mYXN0MTZfdCAgIG15X3VpbnRfZmFzdDE2X3Q7CgkJICBteV91aW50X2Zhc3QxNl90ICAgICAgICB1aWYxNiA9IFVJTlRfRkFTVDE2X01BWDsKCQkgIHVpZjE2ID0gVUlOVF9GQVNUMTZfTUFYOwoJICAgICAgICAgIHR5cGVkZWYgdWludF9mYXN0MzJfdCAgIG15X3VpbnRfZmFzdDMyX3Q7CgkJICBteV91aW50X2Zhc3QzMl90ICAgICAgICB1aWYzMiA9IFVJTlRfRkFTVDMyX01BWDsKCQkgIHVpZjMyID0gVUlOVF9GQVNUMzJfTUFYOwoJICAgICAgICAgIHR5cGVkZWYgdWludF9mYXN0NjRfdCAgIG15X3VpbnRfZmFzdDY0X3Q7CgkJICBteV91aW50X2Zhc3Q2NF90ICAgICAgICB1aWY2NCA9IFVJTlRfRkFTVDY0X01BWDsKCQkgIHVpZjY0ID0gVUlOVF9GQVNUNjRfTUFYOwoJICAgICAgICAgIHR5cGVkZWYgdWludF9sZWFzdDhfdCAgIG15X3VpbnRfbGVhc3Q4X3Q7CgkJICBteV91aW50X2xlYXN0OF90ICAgICAgICB1aWw4ID0gVUlOVF9MRUFTVDhfTUFYOwoJCSAgdWlsOCA9IFVJTlRfTEVBU1Q4X01BWDsKCSAgICAgICAgICB0eXBlZGVmIHVpbnRfbGVhc3QxNl90ICBteV91aW50X2xlYXN0MTZfdDsKCQkgIG15X3VpbnRfbGVhc3QxNl90ICAgICAgIHVpbDE2ID0gVUlOVF9MRUFTVDE2X01BWDsKCQkgIHVpbDE2ID0gVUlOVF9MRUFTVDE2X01BWDsKCSAgICAgICAgICB0eXBlZGVmIHVpbnRfbGVhc3QzMl90ICBteV91aW50X2xlYXN0MzJfdDsKCQkgIG15X3VpbnRfbGVhc3QzMl90ICAgICAgIHVpbDMyID0gVUlOVF9MRUFTVDMyX01BWDsKCQkgIHVpbDMyID0gVUlOVF9MRUFTVDMyX01BWDsKCSAgICAgICAgICB0eXBlZGVmIHVpbnRfbGVhc3Q2NF90ICBteV91aW50X2xlYXN0NjRfdDsKCQkgIG15X3VpbnRfbGVhc3Q2NF90ICAgICAgIHVpbDY0ID0gVUlOVF9MRUFTVDY0X01BWDsKCQkgIHVpbDY0ID0gVUlOVF9MRUFTVDY0X01BWDsKCQkgIHR5cGVkZWYgdWludG1heF90ICAgICAgIG15X3VpbnRtYXhfdDsKCQkgIG15X3VpbnRtYXhfdCAgICAgICAgICAgIHVpbSA9IFVJTlRNQVhfTUFYOwoJCSAgdWltID0gVUlOVE1BWF9NQVg7CgkJICB0eXBlZGVmIHVpbnRwdHJfdCAgICAgICBteV91aW50cHRyX3Q7CgkJICBteV91aW50cHRyX3QgICAgICAgICAgICB1aXAgPSBVSU5UUFRSX01BWDsKCQkgIHVpcCA9IFVJTlRQVFJfTUFYOwoJCSBdLFtnbGliY3h4X2N2X2M5OV9zdGRpbnRfdHIxPXllc10sCgkJICAgW2dsaWJjeHhfY3ZfYzk5X3N0ZGludF90cjE9bm9dKQogIF0pCiAgQUNfTVNHX1JFU1VMVCgkZ2xpYmN4eF9jdl9jOTlfc3RkaW50X3RyMSkKICBpZiB0ZXN0IHgiJGdsaWJjeHhfY3ZfYzk5X3N0ZGludF90cjEiID0geCJ5ZXMiOyB0aGVuCiAgICBBQ19ERUZJTkUoX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxLCAxLAogICAgICAgICAgICAgIFtEZWZpbmUgaWYgQzk5IHR5cGVzIGluIDxzdGRpbnQuaD4gc2hvdWxkIGJlIGltcG9ydGVkIGluCgkgICAgICA8dHIxL2NzdGRpbnQ+IGluIG5hbWVzcGFjZSBzdGQ6OnRyMS5dKQogIGZpCgogICMgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgPG1hdGguaD4gZnVuY3Rpb25zLgogIEFDX01TR19DSEVDS0lORyhbZm9yIElTTyBDOTkgc3VwcG9ydCB0byBUUjEgaW4gPG1hdGguaD5dKQogIEFDX0NBQ0hFX1ZBTChnbGliY3h4X2N2X2M5OV9tYXRoX3RyMSwgWwogIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8bWF0aC5oPl0sCgkgICAgICAgICBbdHlwZWRlZiBkb3VibGVfdCAgbXlfZG91YmxlX3Q7CgkgICAgICAgICAgdHlwZWRlZiBmbG9hdF90ICAgbXlfZmxvYXRfdDsKCSAgICAgICAgICBhY29zaCgwLjApOwoJICAgICAgICAgIGFjb3NoZigwLjBmKTsKCSAgICAgICAgICBhY29zaGwoMC4wbCk7CgkgICAgICAgICAgYXNpbmgoMC4wKTsKCSAgICAgICAgICBhc2luaGYoMC4wZik7CgkgICAgICAgICAgYXNpbmhsKDAuMGwpOwoJICAgICAgICAgIGF0YW5oKDAuMCk7CgkgICAgICAgICAgYXRhbmhmKDAuMGYpOwoJICAgICAgICAgIGF0YW5obCgwLjBsKTsKCSAgICAgICAgICBjYnJ0KDAuMCk7CgkgICAgICAgICAgY2JydGYoMC4wZik7CgkgICAgICAgICAgY2JydGwoMC4wbCk7CgkgICAgICAgICAgY29weXNpZ24oMC4wLCAwLjApOwoJICAgICAgICAgIGNvcHlzaWduZigwLjBmLCAwLjBmKTsKCSAgICAgICAgICBjb3B5c2lnbmwoMC4wbCwgMC4wbCk7CgkgICAgICAgICAgZXJmKDAuMCk7CgkgICAgICAgICAgZXJmZigwLjBmKTsKCSAgICAgICAgICBlcmZsKDAuMGwpOwoJICAgICAgICAgIGVyZmMoMC4wKTsKCSAgICAgICAgICBlcmZjZigwLjBmKTsKCSAgICAgICAgICBlcmZjbCgwLjBsKTsKCSAgICAgICAgICBleHAyKDAuMCk7CgkgICAgICAgICAgZXhwMmYoMC4wZik7CgkgICAgICAgICAgZXhwMmwoMC4wbCk7CgkgICAgICAgICAgZXhwbTEoMC4wKTsKCSAgICAgICAgICBleHBtMWYoMC4wZik7CgkgICAgICAgICAgZXhwbTFsKDAuMGwpOwoJICAgICAgICAgIGZkaW0oMC4wLCAwLjApOwoJICAgICAgICAgIGZkaW1mKDAuMGYsIDAuMGYpOwoJICAgICAgICAgIGZkaW1sKDAuMGwsIDAuMGwpOwoJICAgICAgICAgIGZtYSgwLjAsIDAuMCwgMC4wKTsKCSAgICAgICAgICBmbWFmKDAuMGYsIDAuMGYsIDAuMGYpOwoJICAgICAgICAgIGZtYWwoMC4wbCwgMC4wbCwgMC4wbCk7CgkgICAgICAgICAgZm1heCgwLjAsIDAuMCk7CgkgICAgICAgICAgZm1heGYoMC4wZiwgMC4wZik7CgkgICAgICAgICAgZm1heGwoMC4wbCwgMC4wbCk7CgkgICAgICAgICAgZm1pbigwLjAsIDAuMCk7CgkgICAgICAgICAgZm1pbmYoMC4wZiwgMC4wZik7CgkgICAgICAgICAgZm1pbmwoMC4wbCwgMC4wbCk7CgkgICAgICAgICAgaHlwb3QoMC4wLCAwLjApOwoJICAgICAgICAgIGh5cG90ZigwLjBmLCAwLjBmKTsKCSAgICAgICAgICBoeXBvdGwoMC4wbCwgMC4wbCk7CgkgICAgICAgICAgaWxvZ2IoMC4wKTsKCSAgICAgICAgICBpbG9nYmYoMC4wZik7CgkgICAgICAgICAgaWxvZ2JsKDAuMGwpOwoJICAgICAgICAgIGxnYW1tYSgwLjApOwoJICAgICAgICAgIGxnYW1tYWYoMC4wZik7CgkgICAgICAgICAgbGdhbW1hbCgwLjBsKTsKCSAgICAgICAgICBsbHJpbnQoMC4wKTsKCSAgICAgICAgICBsbHJpbnRmKDAuMGYpOwoJICAgICAgICAgIGxscmludGwoMC4wbCk7CgkgICAgICAgICAgbGxyb3VuZCgwLjApOwoJICAgICAgICAgIGxscm91bmRmKDAuMGYpOwoJICAgICAgICAgIGxscm91bmRsKDAuMGwpOwoJICAgICAgICAgIGxvZzFwKDAuMCk7CgkgICAgICAgICAgbG9nMXBmKDAuMGYpOwoJICAgICAgICAgIGxvZzFwbCgwLjBsKTsKCSAgICAgICAgICBsb2cyKDAuMCk7CgkgICAgICAgICAgbG9nMmYoMC4wZik7CgkgICAgICAgICAgbG9nMmwoMC4wbCk7CgkgICAgICAgICAgbG9nYigwLjApOwoJICAgICAgICAgIGxvZ2JmKDAuMGYpOwoJICAgICAgICAgIGxvZ2JsKDAuMGwpOwoJICAgICAgICAgIGxyaW50KDAuMCk7CgkgICAgICAgICAgbHJpbnRmKDAuMGYpOwoJICAgICAgICAgIGxyaW50bCgwLjBsKTsKCSAgICAgICAgICBscm91bmQoMC4wKTsKCSAgICAgICAgICBscm91bmRmKDAuMGYpOwoJICAgICAgICAgIGxyb3VuZGwoMC4wbCk7CgkgICAgICAgICAgbmFuKDApOwoJICAgICAgICAgIG5hbmYoMCk7CgkgICAgICAgICAgbmFubCgwKTsKCSAgICAgICAgICBuZWFyYnlpbnQoMC4wKTsKCSAgICAgICAgICBuZWFyYnlpbnRmKDAuMGYpOwoJICAgICAgICAgIG5lYXJieWludGwoMC4wbCk7CgkgICAgICAgICAgbmV4dGFmdGVyKDAuMCwgMC4wKTsKCSAgICAgICAgICBuZXh0YWZ0ZXJmKDAuMGYsIDAuMGYpOwoJICAgICAgICAgIG5leHRhZnRlcmwoMC4wbCwgMC4wbCk7CgkgICAgICAgICAgbmV4dHRvd2FyZCgwLjAsIDAuMCk7CgkgICAgICAgICAgbmV4dHRvd2FyZGYoMC4wZiwgMC4wZik7CgkgICAgICAgICAgbmV4dHRvd2FyZGwoMC4wbCwgMC4wbCk7CgkgICAgICAgICAgcmVtYWluZGVyKDAuMCwgMC4wKTsKCSAgICAgICAgICByZW1haW5kZXJmKDAuMGYsIDAuMGYpOwoJICAgICAgICAgIHJlbWFpbmRlcmwoMC4wbCwgMC4wbCk7CgkgICAgICAgICAgcmVtcXVvKDAuMCwgMC4wLCAwKTsKCSAgICAgICAgICByZW1xdW9mKDAuMGYsIDAuMGYsIDApOwoJICAgICAgICAgIHJlbXF1b2woMC4wbCwgMC4wbCwgMCk7CgkgICAgICAgICAgcmludCgwLjApOwoJICAgICAgICAgIHJpbnRmKDAuMGYpOwoJICAgICAgICAgIHJpbnRsKDAuMGwpOwoJICAgICAgICAgIHJvdW5kKDAuMCk7CgkgICAgICAgICAgcm91bmRmKDAuMGYpOwoJICAgICAgICAgIHJvdW5kbCgwLjBsKTsKCSAgICAgICAgICBzY2FsYmxuKDAuMCwgMGwpOwoJICAgICAgICAgIHNjYWxibG5mKDAuMGYsIDBsKTsKCSAgICAgICAgICBzY2FsYmxubCgwLjBsLCAwbCk7CgkgICAgICAgICAgc2NhbGJuKDAuMCwgMCk7CgkgICAgICAgICAgc2NhbGJuZigwLjBmLCAwKTsKCSAgICAgICAgICBzY2FsYm5sKDAuMGwsIDApOwoJICAgICAgICAgIHRnYW1tYSgwLjApOwoJICAgICAgICAgIHRnYW1tYWYoMC4wZik7CgkgICAgICAgICAgdGdhbW1hbCgwLjBsKTsKCSAgICAgICAgICB0cnVuYygwLjApOwoJICAgICAgICAgIHRydW5jZigwLjBmKTsKCSAgICAgICAgICB0cnVuY2woMC4wbCk7CgkJIF0sW2dsaWJjeHhfY3ZfYzk5X21hdGhfdHIxPXllc10sIFtnbGliY3h4X2N2X2M5OV9tYXRoX3RyMT1ub10pCiAgXSkKICBBQ19NU0dfUkVTVUxUKCRnbGliY3h4X2N2X2M5OV9tYXRoX3RyMSkKICBpZiB0ZXN0IHgiJGdsaWJjeHhfY3ZfYzk5X21hdGhfdHIxIiA9IHgieWVzIjsgdGhlbgogICAgQUNfREVGSU5FKF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEsIDEsCiAgICAgICAgICAgICAgW0RlZmluZSBpZiBDOTkgZnVuY3Rpb25zIG9yIG1hY3JvcyBpbiA8bWF0aC5oPiBzaG91bGQgYmUgaW1wb3J0ZWQKICAgICAgICAgICAgICBpbiA8dHIxL2NtYXRoPiBpbiBuYW1lc3BhY2Ugc3RkOjp0cjEuXSkKICBmaQoKICAjIENoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIDxpbnR0eXBlcy5oPiBmdW5jdGlvbnMgKE5COiBkb2Vzbid0IG1ha2UKICAjIHNlbnNlIGlmIHRoZSBnbGliY3h4X2N2X2M5OV9zdGRpbnRfdHIxIGNoZWNrIGZhaWxzLCBwZXIgQzk5LCA3LjgvMSkuCiAgYWNfYzk5X2ludHR5cGVzX3RyMT1ubzsKICBpZiB0ZXN0IHgiJGdsaWJjeHhfY3ZfYzk5X3N0ZGludF90cjEiID0geCJ5ZXMiOyB0aGVuCiAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBJU08gQzk5IHN1cHBvcnQgdG8gVFIxIGluIDxpbnR0eXBlcy5oPl0pCiAgICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPGludHR5cGVzLmg+XSwKCSAgICAgICAgICAgW2ludG1heF90IGksIG51bWVyLCBkZW5vbSwgYmFzZTsKCSAgICAgICAgICAgIGNvbnN0IGNoYXIqIHM7CgkgICAgICAgICAgICBjaGFyKiogZW5kcHRyOwoJICAgICAgICAgICAgaW50bWF4X3QgcmV0ID0gaW1heGFicyhpKTsKCSAgICAgICAgICAgIGltYXhkaXZfdCBkcmV0ID0gaW1heGRpdihudW1lciwgZGVub20pOwoJICAgICAgICAgICAgcmV0ID0gc3RydG9pbWF4KHMsIGVuZHB0ciwgYmFzZSk7CgkgICAgICAgICAgICB1aW50bWF4X3QgdXJldCA9IHN0cnRvdW1heChzLCBlbmRwdHIsIGJhc2UpOwogICAgICAgIAkgICBdLFthY19jOTlfaW50dHlwZXNfdHIxPXllc10sIFthY19jOTlfaW50dHlwZXNfdHIxPW5vXSkKICBmaQogIEFDX01TR19SRVNVTFQoJGFjX2M5OV9pbnR0eXBlc190cjEpCiAgaWYgdGVzdCB4IiRhY19jOTlfaW50dHlwZXNfdHIxIiA9IHgieWVzIjsgdGhlbgogICAgQUNfREVGSU5FKF9HTElCQ1hYX1VTRV9DOTlfSU5UVFlQRVNfVFIxLCAxLAogICAgICAgICAgICAgIFtEZWZpbmUgaWYgQzk5IGZ1bmN0aW9ucyBpbiA8aW50dHlwZXMuaD4gc2hvdWxkIGJlIGltcG9ydGVkIGluCiAgICAgICAgICAgICAgPHRyMS9jaW50dHlwZXM+IGluIG5hbWVzcGFjZSBzdGQ6OnRyMS5dKQogIGZpCgogICMgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2Ygd2hjYXJfdCA8aW50dHlwZXMuaD4gZnVuY3Rpb25zIChOQjogZG9lc24ndAogICMgbWFrZSBzZW5zZSBpZiB0aGUgZ2xpYmN4eF9jdl9jOTlfc3RkaW50X3RyMSBjaGVjayBmYWlscywgcGVyIEM5OSwgNy44LzEpLgogIGFjX2M5OV9pbnR0eXBlc193Y2hhcl90X3RyMT1ubzsKICBpZiB0ZXN0IHgiJGdsaWJjeHhfY3ZfYzk5X3N0ZGludF90cjEiID0geCJ5ZXMiOyB0aGVuCiAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciB3Y2hhcl90IElTTyBDOTkgc3VwcG9ydCB0byBUUjEgaW4gPGludHR5cGVzLmg+XSkKICAgIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8aW50dHlwZXMuaD5dLAoJICAgICAgICAgICBbaW50bWF4X3QgYmFzZTsKCQkgICAgY29uc3Qgd2NoYXJfdCogczsKCSAgICAgICAgICAgIHdjaGFyX3QqKiBlbmRwdHI7CgkgICAgICAgICAgICBpbnRtYXhfdCByZXQgPSB3Y3N0b2ltYXgocywgZW5kcHRyLCBiYXNlKTsKCSAgICAgICAgICAgIHVpbnRtYXhfdCB1cmV0ID0gd2NzdG91bWF4KHMsIGVuZHB0ciwgYmFzZSk7CiAgICAgICAgCSAgIF0sW2FjX2M5OV9pbnR0eXBlc193Y2hhcl90X3RyMT15ZXNdLAoJCSAgICAgW2FjX2M5OV9pbnR0eXBlc193Y2hhcl90X3RyMT1ub10pCiAgZmkKICBBQ19NU0dfUkVTVUxUKCRhY19jOTlfaW50dHlwZXNfd2NoYXJfdF90cjEpCiAgaWYgdGVzdCB4IiRhY19jOTlfaW50dHlwZXNfd2NoYXJfdF90cjEiID0geCJ5ZXMiOyB0aGVuCiAgICBBQ19ERUZJTkUoX0dMSUJDWFhfVVNFX0M5OV9JTlRUWVBFU19XQ0hBUl9UX1RSMSwgMSwKICAgICAgICAgICAgICBbRGVmaW5lIGlmIHdjaGFyX3QgQzk5IGZ1bmN0aW9ucyBpbiA8aW50dHlwZXMuaD4gc2hvdWxkIGJlCgkgICAgICBpbXBvcnRlZCBpbiA8dHIxL2NpbnR0eXBlcz4gaW4gbmFtZXNwYWNlIHN0ZDo6dHIxLl0pCiAgZmkKCiAgIyBDaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgPHN0ZGJvb2wuaD4gaGVhZGVyLgkKICBBQ19DSEVDS19IRUFERVJTKHN0ZGJvb2wuaCkKCiAgQ1hYRkxBR1M9IiRhY19zYXZlX0NYWEZMQUdTIgogIEFDX0xBTkdfUkVTVE9SRQpdKQoKZG5sCmRubCBDaGVjayB3aGV0aGVyICIvZGV2L3JhbmRvbSIgYW5kICIvZGV2L3VyYW5kb20iIGFyZSBhdmFpbGFibGUgZm9yIHRoZQpkbmwgcmFuZG9tX2RldmljZSBvZiAiVFIxIiAoQ2hhcHRlciA1LjEsICJSYW5kb20gbnVtYmVyIGdlbmVyYXRpb24iKS4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0NIRUNLX1JBTkRPTV9UUjFdLCBbCgogIEFDX01TR19DSEVDS0lORyhbZm9yICIvZGV2L3JhbmRvbSIgYW5kICIvZGV2L3VyYW5kb20iIGZvciBUUjEgcmFuZG9tX2RldmljZV0pCiAgQUNfQ0FDSEVfVkFMKGdsaWJjeHhfY3ZfcmFuZG9tX3RyMSwgWwogICAgaWYgdGVzdCAtciAvZGV2L3JhbmRvbSAmJiB0ZXN0IC1yIC9kZXYvdXJhbmRvbTsgdGhlbgogICAgICBnbGliY3h4X2N2X3JhbmRvbV90cjE9eWVzOwogICAgZWxzZQogICAgICBnbGliY3h4X2N2X3JhbmRvbV90cjE9bm87CiAgICBmaQogIF0pCiAgQUNfTVNHX1JFU1VMVCgkZ2xpYmN4eF9jdl9yYW5kb21fdHIxKQoKICBpZiB0ZXN0IHgiJGdsaWJjeHhfY3ZfcmFuZG9tX3RyMSIgPSB4InllcyI7IHRoZW4KICAgIEFDX0RFRklORShfR0xJQkNYWF9VU0VfUkFORE9NX1RSMSwgMSwKICAgICAgICAgICAgICBbRGVmaW5lIGlmIC9kZXYvcmFuZG9tIGFuZCAvZGV2L3VyYW5kb20gYXJlIGF2YWlsYWJsZSBmb3IKCSAgICAgICB0aGUgcmFuZG9tX2RldmljZSBvZiBUUjEgKENoYXB0ZXIgNS4xKS5dKQogIGZpCgpdKQoKZG5sCmRubCBDaGVjayB3aGV0aGVyIEVPRiwgU0VFS19DVVIsIGFuZCBTRUVLX0VORCBoYXZlIHRoZSBtb3N0IGNvbW1vbiB2YWx1ZXM6CmRubCBpbiB0aGF0IGNhc2UgaW5jbHVkaW5nIDxjc3RkaW8+IGluIHNvbWUgQysrIGhlYWRlcnMgY2FuIGJlIGF2b2lkZWQuCmRubApBQ19ERUZVTihbR0xJQkNYWF9DSEVDS19TVERJT19NQUNST1NdLCBbCgogIEFDX01TR19DSEVDS0lORyhbZm9yIEVPRiA9PSAtMSwgU0VFS19DVVIgPT0gMSwgU0VFS19FTkQgPT0gMl0pCiAgQUNfQ0FDSEVfVkFMKGdsaWJjeHhfY3Zfc3RkaW9fbWFjcm9zLCBbCiAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzdGRpby5oPl0sCiAgICAgICAgICAgICAgICAgWyNpZiAoKEVPRiAhPSAtMSkgfHwgKFNFRUtfQ1VSICE9IDEpIHx8IChTRUVLX0VORCAhPSAyKSkKCSAgICAgICAgICAgIHVudXN1YWwgdmFsdWVzLi4uCgkgICAgICAgICAgI2VuZGlmCgkgICAgICAgICBdLCBbZ2xpYmN4eF9jdl9zdGRpb19tYWNyb3M9eWVzXSwKCQkgICAgW2dsaWJjeHhfY3Zfc3RkaW9fbWFjcm9zPW5vXSkKICBdKQogIEFDX01TR19SRVNVTFQoJGdsaWJjeHhfY3Zfc3RkaW9fbWFjcm9zKQogIGlmIHRlc3QgeCIkZ2xpYmN4eF9jdl9zdGRpb19tYWNyb3MiID0geCJ5ZXMiOyB0aGVuCiAgICBBQ19ERUZJTkUoX0dMSUJDWFhfU1RESU9fTUFDUk9TLCAxLAogICAgICAgICAgICAgIFtEZWZpbmUgaWYgRU9GID09IC0xLCBTRUVLX0NVUiA9PSAxLCBTRUVLX0VORCA9PSAyLl0pCiAgZmkKCl0pCgpkbmwKZG5sIENoZWNrIHdoZXRoZXIgbWFjcm9zLCBldGMgYXJlIHByZXNlbnQgZm9yIDxzeXN0ZW1fZXJyb3I+CmRubApBQ19ERUZVTihbR0xJQkNYWF9DSEVDS19TWVNURU1fRVJST1JdLCBbCgptNF9wdXNoZGVmKFtuX3N5c2Vycl0sIFsxXSlkbmwKbTRfZm9yZWFjaChbc3lzZXJyXSwgW0VPV05FUkRFQUQsIEVOT1RSRUNPVkVSQUJMRSwgRU5PTElOSywgRVBST1RPLCBFTk9EQVRBLAoJCSAgICAgIEVOT1NSLCBFTk9TVFIsIEVUSU1FLCBFQkFETVNHLCBFQ0FOQ0VMRUQsCgkJICAgICAgRU9WRVJGTE9XLCBFTk9UU1VQLCBFSURSTSwgRVRYVEJTWV0sClttNF9wdXNoZGVmKFtTWVNFUlJdLCBtNF90b3VwcGVyKHN5c2VycikpZG5sCkFDX01TR19DSEVDS0lORyhbZm9yIHN5c2Vycl0pCkFDX0NBQ0hFX1ZBTChbZ2xpYmN4eF9jdl9zeXN0ZW1fZXJyb3JbXW5fc3lzZXJyXSwgWwpBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbI2luY2x1ZGUgPGVycm5vLmg+XV0sCgkJCQkgICBbaW50IGkgPSBzeXNlcnI7XSldLAoJCSAgW2dsaWJjeHhfY3Zfc3lzdGVtX2Vycm9yW11uX3N5c2Vycj15ZXNdLAoJCSAgW2dsaWJjeHhfY3Zfc3lzdGVtX2Vycm9yW11uX3N5c2Vycj1ub10pCl0pCkFDX01TR19SRVNVTFQoWyRnbGliY3h4X2N2X3N5c3RlbV9lcnJvcltdbl9zeXNlcnJdKQppZiB0ZXN0IHgiJGdsaWJjeHhfY3Zfc3lzdGVtX2Vycm9yW11uX3N5c2VyciIgPSB4InllcyI7IHRoZW4KICBBQ19ERUZJTkUoW0hBVkVfXVNZU0VSUiwgMSwgW0RlZmluZSBpZiBdc3lzZXJyWyBleGlzdHMuXSkKZmkKbTRfZGVmaW5lKFtuX3N5c2Vycl0sIG00X2luY3Iobl9zeXNlcnIpKWRubAptNF9wb3BkZWYoW1NZU0VSUl0pZG5sCl0pCm00X3BvcGRlZihbbl9zeXNlcnJdKWRubApdKQoKZG5sCmRubCBDaGVjayBmb3Igd2hhdCB0eXBlIG9mIEMgaGVhZGVycyB0byB1c2UuCmRubApkbmwgLS1lbmFibGUtY2hlYWRlcnM9IFtkb2VzIHN0dWZmXS4KZG5sIC0tZGlzYWJsZS1jaGVhZGVycyBbZG9lcyBub3QgZG8gYW55dGhpbmcsIHJlYWxseV0uCmRubCAgKyAgVXNhZ2U6ICBHTElCQ1hYX0VOQUJMRV9DSEVBREVSU1soREVGQVVMVCldCmRubCAgICAgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciAnYycgb3IgJ2Nfc3RkJyBvciAnY19nbG9iYWwnLgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfRU5BQkxFX0NIRUFERVJTXSwgWwogIEdMSUJDWFhfRU5BQkxFKGNoZWFkZXJzLCQxLFs9S0lORF0sCiAgICBbY29uc3RydWN0ICJDIiBoZWFkZXJzIGZvciBnKytdLCBbcGVybWl0IGN8Y19zdGR8Y19nbG9iYWxdKQogIEFDX01TR19OT1RJQ0UoIkMiIGhlYWRlciBzdHJhdGVneSBzZXQgdG8gJGVuYWJsZV9jaGVhZGVycykKCiAgQ19JTkNMVURFX0RJUj0nJHtnbGliY3h4X3NyY2Rpcn0vaW5jbHVkZS8nJGVuYWJsZV9jaGVhZGVycwoKICAjIEFsbG93IG92ZXJyaWRlcyB0byBjb25maWd1cmUuaG9zdCBoZXJlLgogIGlmIHRlc3QgJGVuYWJsZV9jaGVhZGVycyA9IGNfZ2xvYmFsOyB0aGVuCiAgICAgY19jb21wYXRpYmlsaXR5PXllcwogIGZpCgogIGlmIHRlc3QgJGVuYWJsZV9jaGVhZGVycyA9IGNfZ2xvYmFsIHx8IHRlc3QgJGVuYWJsZV9jaGVhZGVycyA9IGNfc3RkOyB0aGVuCiAgICAgY19leHRyYT15ZXMKICBmaQoKICBBQ19TVUJTVChDX0lOQ0xVREVfRElSKQogIEdMSUJDWFhfQ09ORElUSU9OQUwoR0xJQkNYWF9DX0hFQURFUlNfQywgdGVzdCAkZW5hYmxlX2NoZWFkZXJzID0gYykKICBHTElCQ1hYX0NPTkRJVElPTkFMKEdMSUJDWFhfQ19IRUFERVJTX0NfU1RELCB0ZXN0ICRlbmFibGVfY2hlYWRlcnMgPSBjX3N0ZCkKICBHTElCQ1hYX0NPTkRJVElPTkFMKEdMSUJDWFhfQ19IRUFERVJTX0NfR0xPQkFMLCB0ZXN0ICRlbmFibGVfY2hlYWRlcnMgPSBjX2dsb2JhbCkKICBHTElCQ1hYX0NPTkRJVElPTkFMKEdMSUJDWFhfQ19IRUFERVJTX0NPTVBBVElCSUxJVFksIHRlc3QgJGNfY29tcGF0aWJpbGl0eSA9IHllcykKICBHTElCQ1hYX0NPTkRJVElPTkFMKEdMSUJDWFhfQ19IRUFERVJTX0VYVFJBLCB0ZXN0ICRjX2V4dHJhID0geWVzKQpdKQoKCmRubApkbmwgQ2hlY2sgZm9yIHdoaWNoIGxvY2FsZSBsaWJyYXJ5IHRvIHVzZS4gIFRoZSBjaG9pY2UgaXMgbWFwcGVkIHRvCmRubCBhIHN1YmRpcmVjdG9yeSBvZiBjb25maWcvbG9jYWxlLgpkbmwKZG5sIERlZmF1bHQgaXMgZ2VuZXJpYy4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0VOQUJMRV9DTE9DQUxFXSwgWwogIEdMSUJDWFhfRU5BQkxFKGNsb2NhbGUsYXV0byxbQDw6QD1NT0RFTEA6PkBdLAogICAgW3VzZSBNT0RFTCBmb3IgdGFyZ2V0IGxvY2FsZSBwYWNrYWdlXSwKICAgIFtwZXJtaXQgZ2VuZXJpY3xnbnV8aWVlZV8xMDAzLjEtMjAwMXx5ZXN8bm98YXV0b10pCgogICMgRGVhbCB3aXRoIGdldHRleHQgaXNzdWVzLiAgRGVmYXVsdCB0byBub3QgdXNpbmcgaXQgKD1ubykgdW50aWwgd2UgZGV0ZWN0CiAgIyBzdXBwb3J0IGZvciBpdCBsYXRlci4gIExldCB0aGUgdXNlciB0dXJuIGl0IG9mZiB2aWEgLS1lL2QsIGJ1dCBsZXQgdGhhdAogICMgZGVmYXVsdCB0byBvbiBmb3IgZWFzaWVyIGhhbmRsaW5nLgogIFVTRV9OTFM9bm8KICBBQ19BUkdfRU5BQkxFKG5scywKICAgIEFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1ubHNdLFt1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQgKGRlZmF1bHQpXSksCiAgICBbXSwKICAgIFtlbmFibGVfbmxzPXllc10pCiAgCiAgIyBFaXRoZXIgYSBrbm93biBwYWNrYWFnZSwgb3IgImF1dG8iCiAgaWYgdGVzdCAkZW5hYmxlX2Nsb2NhbGUgPSBubyB8fCB0ZXN0ICRlbmFibGVfY2xvY2FsZSA9IHllczsgdGhlbgogICAgIGVuYWJsZV9jbG9jYWxlPWF1dG8KICBmaQogIGVuYWJsZV9jbG9jYWxlX2ZsYWc9JGVuYWJsZV9jbG9jYWxlCgogICMgUHJvYmUgZm9yIGxvY2FsZSBtb2RlbCB0byB1c2UgaWYgbm9uZSBzcGVjaWZpZWQuCiAgIyBEZWZhdWx0IHRvICJnZW5lcmljIi4KICBpZiB0ZXN0ICRlbmFibGVfY2xvY2FsZV9mbGFnID0gYXV0bzsgdGhlbgogICAgY2FzZSAke3RhcmdldF9vc30gaW4KICAgICAgbGludXgqIHwgZ251KiB8IGtmcmVlYnNkKi1nbnUgfCBrbmV0YnNkKi1nbnUpCiAgICAgICAgZW5hYmxlX2Nsb2NhbGVfZmxhZz1nbnUJCiAgICAgICAgOzsKICAgICAgZGFyd2luKiB8IGZyZWVic2QqKQogICAgICAgIGVuYWJsZV9jbG9jYWxlX2ZsYWc9ZGFyd2luCgk7OwogICAgICAqKQogICAgICAgIGVuYWJsZV9jbG9jYWxlX2ZsYWc9Z2VuZXJpYwogICAgICAgIDs7CiAgICBlc2FjCiAgZmkKCiAgIyBTYW5pdHkgY2hlY2sgbW9kZWwsIGFuZCB0ZXN0IGZvciBzcGVjaWFsIGZ1bmN0aW9uYWxpdHkuCiAgaWYgdGVzdCAkZW5hYmxlX2Nsb2NhbGVfZmxhZyA9IGdudTsgdGhlbgogICAgQUNfRUdSRVBfQ1BQKFtfR0xJQkNYWF9va10sIFsKICAgICNpbmNsdWRlIDxmZWF0dXJlcy5oPgogICAgI2lmIF9fR0xJQkNfXyA+IDIgfHwgKF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA+PSAyKQogICAgICBfR0xJQkNYWF9vawogICAgI2VuZGlmCiAgICBdLCBlbmFibGVfY2xvY2FsZV9mbGFnPWdudSwgZW5hYmxlX2Nsb2NhbGVfZmxhZz1nZW5lcmljKQoKICAgIGlmIHRlc3QgJGVuYWJsZV9jbG9jYWxlID0gYXV0bzsgdGhlbgogICAgICAjIFRlc3QgZm9yIGJ1Z3MgZWFybHkgaW4gZ2xpYmMtMi4yLnggc2VyaWVzCiAgICAgIEFDX1RSWV9SVU4oWwogICAgICAjZGVmaW5lIF9HTlVfU09VUkNFIDEKICAgICAgI2luY2x1ZGUgPGxvY2FsZS5oPgogICAgICAjaW5jbHVkZSA8c3RyaW5nLmg+CiAgICAgICNpZiBfX0dMSUJDX18gPiAyIHx8IChfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPiAyKQogICAgICBleHRlcm4gX190eXBlb2YobmV3bG9jYWxlKSBfX25ld2xvY2FsZTsKICAgICAgZXh0ZXJuIF9fdHlwZW9mKGR1cGxvY2FsZSkgX19kdXBsb2NhbGU7CiAgICAgIGV4dGVybiBfX3R5cGVvZihzdHJjb2xsX2wpIF9fc3RyY29sbF9sOwogICAgICAjZW5kaWYKICAgICAgaW50IG1haW4oKQogICAgICB7Cgljb25zdCBjaGFyIF9fb25lW10gPSAixHVnbGVpbiBBdWdtZW4iOwogICAgICAgIGNvbnN0IGNoYXIgX190d29bXSA9ICLEdWdsZWluIjsKICAgICAgIAlpbnQgaTsKICAgICAgICBpbnQgajsKICAgICAgICBfX2xvY2FsZV90ICAgICAgICBsb2M7CiAgICAgICAgX19sb2NhbGVfdCAgICAgICAgbG9jX2R1cDsKICAgICAgICBsb2MgPSBfX25ld2xvY2FsZSgxIDw8IExDX0FMTCwgImRlX0RFIiwgMCk7CiAgICAgICAgbG9jX2R1cCA9IF9fZHVwbG9jYWxlKGxvYyk7CiAgICAgICAgaSA9IF9fc3RyY29sbF9sKF9fb25lLCBfX3R3bywgbG9jKTsKICAgICAgICBqID0gX19zdHJjb2xsX2woX19vbmUsIF9fdHdvLCBsb2NfZHVwKTsKICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgICBdLAogICAgICBbZW5hYmxlX2Nsb2NhbGVfZmxhZz1nbnVdLFtlbmFibGVfY2xvY2FsZV9mbGFnPWdlbmVyaWNdLAogICAgICBbZW5hYmxlX2Nsb2NhbGVfZmxhZz1nZW5lcmljXSkKICAgIGZpCgogICAgIyBTZXQgaXQgdG8gc2NyZWFtIHdoZW4gaXQgaHVydHMuCiAgICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIJCiAgICBDRkxBR1M9Ii1XaW1wbGljaXQtZnVuY3Rpb24tZGVjbGFyYXRpb24gLVdlcnJvciIKCiAgICAjIFVzZSBzdHJ4ZnJtX2wgaWYgYXZhaWxhYmxlLgogICAgQUNfVFJZX0NPTVBJTEUoWyNkZWZpbmUgX0dOVV9TT1VSQ0UgMQogICAgIAkJICAgICNpbmNsdWRlIDxzdHJpbmcuaD4KCQkgICAgI2luY2x1ZGUgPGxvY2FsZS5oPl0sCgkgICAgICAgICAgICBbY2hhciBzWzEyOF07IF9fbG9jYWxlX3QgbG9jOyBzdHJ4ZnJtX2wocywgIkMiLCA1LCBsb2MpO10sIAogICAgICAgICAgICAgICAgICAgIEFDX0RFRklORShIQVZFX1NUUlhGUk1fTCwgMSwgCiAgICAgICAgICAgICAgICAgICAgW0RlZmluZSBpZiBzdHJ4ZnJtX2wgaXMgYXZhaWxhYmxlIGluIDxzdHJpbmcuaD4uXSksKQogICAgCiAgICAjIFVzZSBzdHJlcnJvcl9sIGlmIGF2YWlsYWJsZS4KICAgIEFDX1RSWV9DT01QSUxFKFsjZGVmaW5lIF9HTlVfU09VUkNFIDEKCQkgICAgI2luY2x1ZGUgPHN0cmluZy5oPgoJCSAgICAjaW5jbHVkZSA8bG9jYWxlLmg+XSwKCSAgICAgICAgICAgIFtfX2xvY2FsZV90IGxvYzsgc3RyZXJyb3JfbCg1LCBsb2MpO10sIAogICAgICAgICAgICAgICAgICAgIEFDX0RFRklORShIQVZFX1NUUkVSUk9SX0wsIDEsIAogICAgICAgICAgICAgICAgICAgIFtEZWZpbmUgaWYgc3RyZXJyb3JfbCBpcyBhdmFpbGFibGUgaW4gPHN0cmluZy5oPi5dKSwpCgogICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCiAgZmkKCiAgIyBQZXJoYXBzIHVzZSBzdHJlcnJvcl9yIGlmIGF2YWlsYWJsZSwgYW5kIHN0cmVycm9yX2wgaXNuJ3QuCiAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCQogIENGTEFHUz0iLVdpbXBsaWNpdC1mdW5jdGlvbi1kZWNsYXJhdGlvbiAtV2Vycm9yIgogIEFDX1RSWV9DT01QSUxFKFsjZGVmaW5lIF9HTlVfU09VUkNFIDEKCSAgICAgCSAgI2luY2x1ZGUgPHN0cmluZy5oPgoJCSAgI2luY2x1ZGUgPGxvY2FsZS5oPl0sCgkgICAgICAgICAgW2NoYXIgc1sxMjhdOyBzdHJlcnJvcl9yKDUsIHMsIDEyOCk7XSwgCiAgICAgICAgICAgICAgICAgIEFDX0RFRklORShIQVZFX1NUUkVSUk9SX1IsIDEsIAogICAgICAgICAgICAgICAgICBbRGVmaW5lIGlmIHN0cmVycm9yX3IgaXMgYXZhaWxhYmxlIGluIDxzdHJpbmcuaD4uXSksKQogIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgoKICAjIFNldCBjb25maWd1cmUgYml0cyBmb3Igc3BlY2lmaWVkIGxvY2FsZSBwYWNrYWdlCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgQyBsb2NhbGUgdG8gdXNlXSkKICBjYXNlICR7ZW5hYmxlX2Nsb2NhbGVfZmxhZ30gaW4KICAgIGdlbmVyaWMpCiAgICAgIEFDX01TR19SRVNVTFQoZ2VuZXJpYykKCiAgICAgIENMT0NBTEVfSD1jb25maWcvbG9jYWxlL2dlbmVyaWMvY19sb2NhbGUuaAogICAgICBDTE9DQUxFX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9jX2xvY2FsZS5jYwogICAgICBDQ09ERUNWVF9DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvY29kZWN2dF9tZW1iZXJzLmNjCiAgICAgIENDT0xMQVRFX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9jb2xsYXRlX21lbWJlcnMuY2MKICAgICAgQ0NUWVBFX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9jdHlwZV9tZW1iZXJzLmNjCiAgICAgIENNRVNTQUdFU19IPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9tZXNzYWdlc19tZW1iZXJzLmgKICAgICAgQ01FU1NBR0VTX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9tZXNzYWdlc19tZW1iZXJzLmNjCiAgICAgIENNT05FWV9DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvbW9uZXRhcnlfbWVtYmVycy5jYwogICAgICBDTlVNRVJJQ19DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvbnVtZXJpY19tZW1iZXJzLmNjCiAgICAgIENUSU1FX0g9Y29uZmlnL2xvY2FsZS9nZW5lcmljL3RpbWVfbWVtYmVycy5oCiAgICAgIENUSU1FX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy90aW1lX21lbWJlcnMuY2MKICAgICAgQ0xPQ0FMRV9JTlRFUk5BTF9IPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9jKytsb2NhbGVfaW50ZXJuYWwuaAogICAgICA7OwogICAgZGFyd2luKQogICAgICBBQ19NU0dfUkVTVUxUKGRhcndpbiBvciBmcmVlYnNkKQoKICAgICAgQ0xPQ0FMRV9IPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9jX2xvY2FsZS5oCiAgICAgIENMT0NBTEVfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL2NfbG9jYWxlLmNjCiAgICAgIENDT0RFQ1ZUX0NDPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy9jb2RlY3Z0X21lbWJlcnMuY2MKICAgICAgQ0NPTExBVEVfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL2NvbGxhdGVfbWVtYmVycy5jYwogICAgICBDQ1RZUEVfQ0M9Y29uZmlnL2xvY2FsZS9kYXJ3aW4vY3R5cGVfbWVtYmVycy5jYwogICAgICBDTUVTU0FHRVNfSD1jb25maWcvbG9jYWxlL2dlbmVyaWMvbWVzc2FnZXNfbWVtYmVycy5oCiAgICAgIENNRVNTQUdFU19DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvbWVzc2FnZXNfbWVtYmVycy5jYwogICAgICBDTU9ORVlfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL21vbmV0YXJ5X21lbWJlcnMuY2MKICAgICAgQ05VTUVSSUNfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL251bWVyaWNfbWVtYmVycy5jYwogICAgICBDVElNRV9IPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy90aW1lX21lbWJlcnMuaAogICAgICBDVElNRV9DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvdGltZV9tZW1iZXJzLmNjCiAgICAgIENMT0NBTEVfSU5URVJOQUxfSD1jb25maWcvbG9jYWxlL2dlbmVyaWMvYysrbG9jYWxlX2ludGVybmFsLmgKICAgICAgOzsKCQogICAgZ251KQogICAgICBBQ19NU0dfUkVTVUxUKGdudSkKCiAgICAgICMgRGVjbGFyZSBpbnRlbnRpb24gdG8gdXNlIGdldHRleHQsIGFuZCBhZGQgc3VwcG9ydCBmb3Igc3BlY2lmaWMKICAgICAgIyBsYW5ndWFnZXMuCiAgICAgICMgRm9yIHNvbWUgcmVhc29uLCBBTExfTElOR1VBUyBoYXMgdG8gYmUgYmVmb3JlIEFNLUdOVS1HRVRURVhUCiAgICAgIEFMTF9MSU5HVUFTPSJkZSBmciIKCiAgICAgICMgRG9uJ3QgY2FsbCBBTS1HTlUtR0VUVEVYVCBoZXJlLiBJbnN0ZWFkLCBhc3N1bWUgZ2xpYmMuCiAgICAgIEFDX0NIRUNLX1BST0coY2hlY2tfbXNnZm10LCBtc2dmbXQsIHllcywgbm8pCiAgICAgIGlmIHRlc3QgeCIkY2hlY2tfbXNnZm10IiA9IHgieWVzIiAmJiB0ZXN0IHgiJGVuYWJsZV9ubHMiID0geCJ5ZXMiOyB0aGVuCiAgICAgICAgVVNFX05MUz15ZXMKICAgICAgZmkKICAgICAgIyBFeHBvcnQgdGhlIGJ1aWxkIG9iamVjdHMuCiAgICAgIGZvciBsaW5nIGluICRBTExfTElOR1VBUzsgZG8gXAogICAgICAgIGdsaWJjeHhfTU9GSUxFUz0iJGdsaWJjeHhfTU9GSUxFUyAkbGluZy5tbyI7IFwKICAgICAgICBnbGliY3h4X1BPRklMRVM9IiRnbGliY3h4X1BPRklMRVMgJGxpbmcucG8iOyBcCiAgICAgIGRvbmUKICAgICAgQUNfU1VCU1QoZ2xpYmN4eF9NT0ZJTEVTKQogICAgICBBQ19TVUJTVChnbGliY3h4X1BPRklMRVMpCgogICAgICBDTE9DQUxFX0g9Y29uZmlnL2xvY2FsZS9nbnUvY19sb2NhbGUuaAogICAgICBDTE9DQUxFX0NDPWNvbmZpZy9sb2NhbGUvZ251L2NfbG9jYWxlLmNjCiAgICAgIENDT0RFQ1ZUX0NDPWNvbmZpZy9sb2NhbGUvZ251L2NvZGVjdnRfbWVtYmVycy5jYwogICAgICBDQ09MTEFURV9DQz1jb25maWcvbG9jYWxlL2dudS9jb2xsYXRlX21lbWJlcnMuY2MKICAgICAgQ0NUWVBFX0NDPWNvbmZpZy9sb2NhbGUvZ251L2N0eXBlX21lbWJlcnMuY2MKICAgICAgQ01FU1NBR0VTX0g9Y29uZmlnL2xvY2FsZS9nbnUvbWVzc2FnZXNfbWVtYmVycy5oCiAgICAgIENNRVNTQUdFU19DQz1jb25maWcvbG9jYWxlL2dudS9tZXNzYWdlc19tZW1iZXJzLmNjCiAgICAgIENNT05FWV9DQz1jb25maWcvbG9jYWxlL2dudS9tb25ldGFyeV9tZW1iZXJzLmNjCiAgICAgIENOVU1FUklDX0NDPWNvbmZpZy9sb2NhbGUvZ251L251bWVyaWNfbWVtYmVycy5jYwogICAgICBDVElNRV9IPWNvbmZpZy9sb2NhbGUvZ251L3RpbWVfbWVtYmVycy5oCiAgICAgIENUSU1FX0NDPWNvbmZpZy9sb2NhbGUvZ251L3RpbWVfbWVtYmVycy5jYwogICAgICBDTE9DQUxFX0lOVEVSTkFMX0g9Y29uZmlnL2xvY2FsZS9nbnUvYysrbG9jYWxlX2ludGVybmFsLmgKICAgICAgOzsKICAgIGllZWVfMTAwMy4xLTIwMDEpCiAgICAgIEFDX01TR19SRVNVTFQoSUVFRSAxMDAzLjEpCgogICAgICBDTE9DQUxFX0g9Y29uZmlnL2xvY2FsZS9pZWVlXzEwMDMuMS0yMDAxL2NfbG9jYWxlLmgKICAgICAgQ0xPQ0FMRV9DQz1jb25maWcvbG9jYWxlL2llZWVfMTAwMy4xLTIwMDEvY19sb2NhbGUuY2MKICAgICAgQ0NPREVDVlRfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL2NvZGVjdnRfbWVtYmVycy5jYwogICAgICBDQ09MTEFURV9DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvY29sbGF0ZV9tZW1iZXJzLmNjCiAgICAgIENDVFlQRV9DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvY3R5cGVfbWVtYmVycy5jYwogICAgICBDTUVTU0FHRVNfSD1jb25maWcvbG9jYWxlL2llZWVfMTAwMy4xLTIwMDEvbWVzc2FnZXNfbWVtYmVycy5oCiAgICAgIENNRVNTQUdFU19DQz1jb25maWcvbG9jYWxlL2llZWVfMTAwMy4xLTIwMDEvbWVzc2FnZXNfbWVtYmVycy5jYwogICAgICBDTU9ORVlfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL21vbmV0YXJ5X21lbWJlcnMuY2MKICAgICAgQ05VTUVSSUNfQ0M9Y29uZmlnL2xvY2FsZS9nZW5lcmljL251bWVyaWNfbWVtYmVycy5jYwogICAgICBDVElNRV9IPWNvbmZpZy9sb2NhbGUvZ2VuZXJpYy90aW1lX21lbWJlcnMuaAogICAgICBDVElNRV9DQz1jb25maWcvbG9jYWxlL2dlbmVyaWMvdGltZV9tZW1iZXJzLmNjCiAgICAgIENMT0NBTEVfSU5URVJOQUxfSD1jb25maWcvbG9jYWxlL2dlbmVyaWMvYysrbG9jYWxlX2ludGVybmFsLmgKICAgICAgOzsKICBlc2FjCgogICMgVGhpcyBpcyB3aGVyZSB0aGUgdGVzdHN1aXRlIGxvb2tzIGZvciBsb2NhbGUgY2F0YWxvZ3MsIHVzaW5nIHRoZQogICMgLURMT0NBTEVESVIgZGVmaW5lIGR1cmluZyB0ZXN0c3VpdGUgY29tcGlsYXRpb24uCiAgZ2xpYmN4eF9sb2NhbGVkaXI9JHtnbGliY3h4X2J1aWxkZGlyfS9wby9zaGFyZS9sb2NhbGUKICBBQ19TVUJTVChnbGliY3h4X2xvY2FsZWRpcikKCiAgIyBBIHN0YW5kYWxvbmUgbGliaW50bCAoZS5nLiwgR05VIGxpYmludGwpIG1heSBiZSBpbiB1c2UuCiAgaWYgdGVzdCAkVVNFX05MUyA9IHllczsgdGhlbgogICAgQUNfQ0hFQ0tfSEVBREVSUyhbbGliaW50bC5oXSwgW10sIFVTRV9OTFM9bm8pCiAgICBBQ19TRUFSQ0hfTElCUyhnZXR0ZXh0LCBpbnRsLCBbXSwgVVNFX05MUz1ubykKICBmaQogIGlmIHRlc3QgJFVTRV9OTFMgPSB5ZXM7IHRoZW4KICAgIEFDX0RFRklORShfR0xJQkNYWF9VU0VfTkxTLCAxLCAKICAgICAgICAgICAgICBbRGVmaW5lIGlmIE5MUyB0cmFuc2xhdGlvbnMgYXJlIHRvIGJlIHVzZWQuXSkKICBmaQoKICBBQ19TVUJTVChVU0VfTkxTKQogIEFDX1NVQlNUKENMT0NBTEVfSCkKICBBQ19TVUJTVChDTUVTU0FHRVNfSCkKICBBQ19TVUJTVChDQ09ERUNWVF9DQykKICBBQ19TVUJTVChDQ09MTEFURV9DQykKICBBQ19TVUJTVChDQ1RZUEVfQ0MpCiAgQUNfU1VCU1QoQ01FU1NBR0VTX0NDKQogIEFDX1NVQlNUKENNT05FWV9DQykKICBBQ19TVUJTVChDTlVNRVJJQ19DQykKICBBQ19TVUJTVChDVElNRV9IKQogIEFDX1NVQlNUKENUSU1FX0NDKQogIEFDX1NVQlNUKENMT0NBTEVfQ0MpCiAgQUNfU1VCU1QoQ0xPQ0FMRV9JTlRFUk5BTF9IKQpdKQoKCmRubApkbmwgQ2hlY2sgZm9yIHdoaWNoIHN0ZDo6YWxsb2NhdG9yIGJhc2UgY2xhc3MgdG8gdXNlLiAgVGhlIGNob2ljZSBpcwpkbmwgbWFwcGVkIGZyb20gYSBzdWJkaXJlY3Rvcnkgb2YgaW5jbHVkZS9leHQuCmRubApkbmwgRGVmYXVsdCBpcyBuZXcuCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfQUxMT0NBVE9SXSwgWwogIEFDX01TR19DSEVDS0lORyhbZm9yIHN0ZDo6YWxsb2NhdG9yIGJhc2UgY2xhc3NdKQogIEdMSUJDWFhfRU5BQkxFKGxpYnN0ZGN4eC1hbGxvY2F0b3IsYXV0byxbPUtJTkRdLAogICAgW3VzZSBLSU5EIGZvciB0YXJnZXQgc3RkOjphbGxvY2F0b3IgYmFzZV0sCiAgICBbcGVybWl0IG5ld3xtYWxsb2N8bXR8Yml0bWFwfHBvb2x8eWVzfG5vfGF1dG9dKQoKICAjIElmIHRoZXkgZGlkbid0IHVzZSB0aGlzIG9wdGlvbiBzd2l0Y2gsIG9yIGlmIHRoZXkgc3BlY2lmaWVkIC0tZW5hYmxlCiAgIyB3aXRoIG5vIHNwZWNpZmljIG1vZGVsLCB3ZSdsbCBoYXZlIHRvIGxvb2sgZm9yIG9uZS4gIElmIHRoZXkKICAjIHNwZWNpZmllZCAtLWRpc2FibGUgKD8/PyksIGRvIGxpa2V3aXNlLgogIGlmIHRlc3QgJGVuYWJsZV9saWJzdGRjeHhfYWxsb2NhdG9yID0gbm8gfHwKICAgICB0ZXN0ICRlbmFibGVfbGlic3RkY3h4X2FsbG9jYXRvciA9IHllczsKICB0aGVuCiAgICAgZW5hYmxlX2xpYnN0ZGN4eF9hbGxvY2F0b3I9YXV0bwogIGZpCgogICMgRWl0aGVyIGEga25vd24gcGFja2FnZSwgb3IgImF1dG8iLiBBdXRvIGltcGxpZXMgdGhlIGRlZmF1bHQgY2hvaWNlCiAgIyBmb3IgYSBwYXJ0aWN1bGFyIHBsYXRmb3JtLgogIGVuYWJsZV9saWJzdGRjeHhfYWxsb2NhdG9yX2ZsYWc9JGVuYWJsZV9saWJzdGRjeHhfYWxsb2NhdG9yCgogICMgUHJvYmUgZm9yIGhvc3Qtc3BlY2lmaWMgc3VwcG9ydCBpZiBubyBzcGVjaWZpYyBtb2RlbCBpcyBzcGVjaWZpZWQuCiAgIyBEZWZhdWx0IHRvICJuZXciLgogIGlmIHRlc3QgJGVuYWJsZV9saWJzdGRjeHhfYWxsb2NhdG9yX2ZsYWcgPSBhdXRvOyB0aGVuCiAgICBjYXNlICR7dGFyZ2V0X29zfSBpbgogICAgICBsaW51eCogfCBnbnUqIHwga2ZyZWVic2QqLWdudSB8IGtuZXRic2QqLWdudSkKICAgICAgICBlbmFibGVfbGlic3RkY3h4X2FsbG9jYXRvcl9mbGFnPW5ldwogICAgICAgIDs7CiAgICAgICopCiAgICAgICAgZW5hYmxlX2xpYnN0ZGN4eF9hbGxvY2F0b3JfZmxhZz1uZXcKICAgICAgICA7OwogICAgZXNhYwogIGZpCiAgQUNfTVNHX1JFU1VMVCgkZW5hYmxlX2xpYnN0ZGN4eF9hbGxvY2F0b3JfZmxhZykKICAKCiAgIyBTZXQgY29uZmlndXJlIGJpdHMgZm9yIHNwZWNpZmllZCBsb2NhbGUgcGFja2FnZQogIGNhc2UgJHtlbmFibGVfbGlic3RkY3h4X2FsbG9jYXRvcl9mbGFnfSBpbgogICAgYml0bWFwKQogICAgICBBTExPQ0FUT1JfSD1jb25maWcvYWxsb2NhdG9yL2JpdG1hcF9hbGxvY2F0b3JfYmFzZS5oCiAgICAgIEFMTE9DQVRPUl9OQU1FPV9fZ251X2N4eDo6Yml0bWFwX2FsbG9jYXRvcgogICAgICA7OwogICAgbWFsbG9jKQogICAgICBBTExPQ0FUT1JfSD1jb25maWcvYWxsb2NhdG9yL21hbGxvY19hbGxvY2F0b3JfYmFzZS5oCiAgICAgIEFMTE9DQVRPUl9OQU1FPV9fZ251X2N4eDo6bWFsbG9jX2FsbG9jYXRvcgogICAgICA7OwogICAgbXQpCiAgICAgIEFMTE9DQVRPUl9IPWNvbmZpZy9hbGxvY2F0b3IvbXRfYWxsb2NhdG9yX2Jhc2UuaAogICAgICBBTExPQ0FUT1JfTkFNRT1fX2dudV9jeHg6Ol9fbXRfYWxsb2MKICAgICAgOzsKICAgIG5ldykKICAgICAgQUxMT0NBVE9SX0g9Y29uZmlnL2FsbG9jYXRvci9uZXdfYWxsb2NhdG9yX2Jhc2UuaAogICAgICBBTExPQ0FUT1JfTkFNRT1fX2dudV9jeHg6Om5ld19hbGxvY2F0b3IKICAgICAgOzsKICAgIHBvb2wpCiAgICAgIEFMTE9DQVRPUl9IPWNvbmZpZy9hbGxvY2F0b3IvcG9vbF9hbGxvY2F0b3JfYmFzZS5oCiAgICAgIEFMTE9DQVRPUl9OQU1FPV9fZ251X2N4eDo6X19wb29sX2FsbG9jCiAgICAgIDs7CQogIGVzYWMKCiAgQUNfU1VCU1QoQUxMT0NBVE9SX0gpCiAgQUNfU1VCU1QoQUxMT0NBVE9SX05BTUUpCl0pCgoKZG5sCmRubCBDaGVjayBmb3Igd2hldGhlciB0aGUgQm9vc3QtZGVyaXZlZCBjaGVja3Mgc2hvdWxkIGJlIHR1cm5lZCBvbi4KZG5sCmRubCAtLWVuYWJsZS1jb25jZXB0LWNoZWNrcyB0dXJucyB0aGVtIG9uLgpkbmwgLS1kaXNhYmxlLWNvbmNlcHQtY2hlY2tzIGxlYXZlcyB0aGVtIG9mZi4KZG5sICArICBVc2FnZTogIEdMSUJDWFhfRU5BQkxFX0NPTkNFUFRfQ0hFQ0tTWyhERUZBVUxUKV0KZG5sICAgICAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfQ09OQ0VQVF9DSEVDS1NdLCBbCiAgR0xJQkNYWF9FTkFCTEUoY29uY2VwdC1jaGVja3MsJDEsLFt1c2UgQm9vc3QtZGVyaXZlZCB0ZW1wbGF0ZSBjaGVja3NdKQogIGlmIHRlc3QgJGVuYWJsZV9jb25jZXB0X2NoZWNrcyA9IHllczsgdGhlbgogICAgQUNfREVGSU5FKF9HTElCQ1hYX0NPTkNFUFRfQ0hFQ0tTLCAxLAogICAgICAgICAgICAgIFtEZWZpbmUgdG8gdXNlIGNvbmNlcHQgY2hlY2tpbmcgY29kZSBmcm9tIHRoZSBib29zdCBsaWJyYXJpZXMuXSkKICBmaQpdKQoKZG5sCmRubCBDaGVjayBmb3IgcGFyYWxsZWwgbW9kZSBwcmUtcmVxdWlzaXRlcywgaW5jbHVkaW5nIE9wZW5NUCBzdXBwb3J0LgpkbmwKZG5sICArICBVc2FnZTogIEdMSUJDWFhfRU5BQkxFX1BBUkFMTEVMCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfUEFSQUxMRUxdLCBbCgogIGVuYWJsZV9wYXJhbGxlbD1ubzsKCiAgIyBTZWUgaWYgY29uZmlndXJlZCBsaWJnb21wL29tcC5oIGV4aXN0cy4gKGxpYmdvbXAgbWF5IGJlIGluCiAgIyBub2NvbmZpZ2RpcnMgYnV0IG5vdCBleHBsaWNpdGx5IGRpc2FibGVkLikKICBpZiB0ZXN0IC1mICRnbGliY3h4X2J1aWxkZGlyLy4uL2xpYmdvbXAvb21wLmg7IHRoZW4KICAgIGVuYWJsZV9wYXJhbGxlbD15ZXM7CiAgZWxzZQogICAgQUNfTVNHX05PVElDRShbJGdsaWJjeHhfYnVpbGRkaXIvLi4vbGliZ29tcC9vbXAuaCBub3QgZm91bmRdKQogIGZpCgogIEFDX01TR19DSEVDS0lORyhbZm9yIHBhcmFsbGVsIG1vZGUgc3VwcG9ydF0pCiAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9wYXJhbGxlbF0pCiAgR0xJQkNYWF9DT05ESVRJT05BTChFTkFCTEVfUEFSQUxMRUwsIHRlc3QgJGVuYWJsZV9wYXJhbGxlbCA9IHllcykKXSkKCgpkbmwKZG5sIENoZWNrIGZvciB3aGljaCBJL08gbGlicmFyeSB0byB1c2U6ICBzdGRpbywgb3Igc29tZXRoaW5nIHNwZWNpZmljLgpkbmwKZG5sIERlZmF1bHQgaXMgc3RkaW8uCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfQ1NURElPXSwgWwogIEFDX01TR19DSEVDS0lORyhbZm9yIHVuZGVybHlpbmcgSS9PIHRvIHVzZV0pCiAgR0xJQkNYWF9FTkFCTEUoY3N0ZGlvLHN0ZGlvLFs9UEFDS0FHRV0sCiAgICBbdXNlIHRhcmdldC1zcGVjaWZpYyBJL08gcGFja2FnZV0sIFtwZXJtaXQgc3RkaW9dKQoKICAjIE5vdyB0aGF0IGxpYmlvIGhhcyBiZWVuIHJlbW92ZWQsIHlvdSBjYW4gaGF2ZSBhbnkgY29sb3IgeW91IHdhbnQgYXMgbG9uZwogICMgYXMgaXQncyBibGFjay4gIFRoaXMgaXMgb25lIGJpZyBuby1vcCB1bnRpbCBvdGhlciBwYWNrYWdlcyBhcmUgYWRkZWQsIGJ1dAogICMgc2hvd2luZyB0aGUgZnJhbWV3b3JrIG5ldmVyIGh1cnRzLgogIGNhc2UgJHtlbmFibGVfY3N0ZGlvfSBpbgogICAgc3RkaW8pCiAgICAgIENTVERJT19IPWNvbmZpZy9pby9jX2lvX3N0ZGlvLmgKICAgICAgQkFTSUNfRklMRV9IPWNvbmZpZy9pby9iYXNpY19maWxlX3N0ZGlvLmgKICAgICAgQkFTSUNfRklMRV9DQz1jb25maWcvaW8vYmFzaWNfZmlsZV9zdGRpby5jYwogICAgICBBQ19NU0dfUkVTVUxUKHN0ZGlvKQogICAgICA7OwogIGVzYWMKCiAgQUNfU1VCU1QoQ1NURElPX0gpCiAgQUNfU1VCU1QoQkFTSUNfRklMRV9IKQogIEFDX1NVQlNUKEJBU0lDX0ZJTEVfQ0MpCl0pCgoKZG5sCmRubCBDaGVjayBmb3IgInVudXN1YWwiIGZsYWdzIHRvIHBhc3MgdG8gdGhlIGNvbXBpbGVyIHdoaWxlIGJ1aWxkaW5nLgpkbmwKZG5sIC0tZW5hYmxlLWN4eC1mbGFncz0nLWZvbyAtYmFyIC1iYXonIGlzIGEgZ2VuZXJhbCBtZXRob2QgZm9yIHBhc3NpbmcKZG5sICAgICBleHBlcmltZW50YWwgZmxhZ3Mgc3VjaCBhcyAtZnBjaCwgLWZJTUksIC1EZmxvYXQ9Y2hhciwgZXRjLgpkbmwgLS1kaXNhYmxlLWN4eC1mbGFncyBwYXNzZXMgbm90aGluZy4KZG5sICArICBTZWUgaHR0cDovL2djYy5nbnUub3JnL21sL2xpYnN0ZGMrKy8yMDAwLXEyL21zZzAwMTMxLmh0bWwKZG5sICAgICAgICAgaHR0cDovL2djYy5nbnUub3JnL21sL2xpYnN0ZGMrKy8yMDAwLXEyL21zZzAwMjg0Lmh0bWwKZG5sICAgICAgICAgaHR0cDovL2djYy5nbnUub3JnL21sL2xpYnN0ZGMrKy8yMDAwLXExL21zZzAwMDM1Lmh0bWwKZG5sICArICBVc2FnZTogIEdMSUJDWFhfRU5BQkxFX0NYWF9GTEFHUyhkZWZhdWx0IGZsYWdzKQpkbmwgICAgICAgSWYgImRlZmF1bHQgZmxhZ3MiIGlzIGFuIGVtcHR5IHN0cmluZywgdGhlIGVmZmVjdCBpcyB0aGUgc2FtZQpkbmwgICAgICAgYXMgLS1kaXNhYmxlIG9yIC0tZW5hYmxlPW5vLgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfRU5BQkxFX0NYWF9GTEFHU10sIFtkbmwKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBleHRyYSBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmddKQogIEdMSUJDWFhfRU5BQkxFKGN4eC1mbGFncywkMSxbPUZMQUdTXSwKICAgIFtwYXNzIGNvbXBpbGVyIEZMQUdTIHdoZW4gYnVpbGRpbmcgbGlicmFyeV0sCiAgICBbY2FzZSAieCRlbmFibGVfY3h4X2ZsYWdzIiBpbgogICAgICB4bm8gfCB4KSAgIGVuYWJsZV9jeHhfZmxhZ3M9IDs7CiAgICAgIHgtKikgICAgICAgOzsKICAgICAgKikgICAgICAgICBBQ19NU0dfRVJST1IoX2dfc3dpdGNoIG5lZWRzIGNvbXBpbGVyIGZsYWdzIGFzIGFyZ3VtZW50cykgOzsKICAgICBlc2FjXSkKCiAgIyBSdW4gdGhyb3VnaCBmbGFncyAoZWl0aGVyIGRlZmF1bHQgb3IgY29tbWFuZC1saW5lKSBhbmQgc2V0IGFueXRoaW5nCiAgIyBleHRyYSAoZS5nLiwgI2RlZmluZXMpIHRoYXQgbXVzdCBhY2NvbXBhbnkgcGFydGljdWxhciBnKysgb3B0aW9ucy4KICBpZiB0ZXN0IC1uICIkZW5hYmxlX2N4eF9mbGFncyI7IHRoZW4KICAgIGZvciBmIGluICRlbmFibGVfY3h4X2ZsYWdzOyBkbwogICAgICBjYXNlICIkZiIgaW4KICAgICAgICAtZmhvbm9yLXN0ZCkgIDs7CiAgICAgICAgLSopICA7OwogICAgICAgICopICAgIyBhbmQgd2UncmUgdHJ5aW5nIHRvIHBhc3MgL3doYXQvIGV4YWN0bHk/CiAgICAgICAgICAgICBBQ19NU0dfRVJST1IoW2NvbXBpbGVyIGZsYWdzIHN0YXJ0IHdpdGggYSAtXSkgOzsKICAgICAgZXNhYwogICAgZG9uZQogIGZpCgogIEVYVFJBX0NYWF9GTEFHUz0iJGVuYWJsZV9jeHhfZmxhZ3MiCiAgQUNfTVNHX1JFU1VMVCgkRVhUUkFfQ1hYX0ZMQUdTKQogIEFDX1NVQlNUKEVYVFJBX0NYWF9GTEFHUykKXSkKCgpkbmwKZG5sIENoZWNrIHRvIHNlZSBpZiBkZWJ1Z2dpbmcgbGlicmFyaWVzIGFyZSB0byBiZSBidWlsdC4KZG5sCmRubCAtLWVuYWJsZS1saWJzdGRjeHgtZGVidWcKZG5sIGJ1aWxkcyBhIHNlcGFyYXRlIHNldCBvZiBkZWJ1Z2dpbmcgbGlicmFyaWVzIGluIGFkZGl0aW9uIHRvIHRoZQpkbmwgbm9ybWFsIChzaGFyZWQsIHN0YXRpYykgbGlic3RkYysrIGJpbmFyaWVzLgpkbmwKZG5sIC0tZGlzYWJsZS1saWJzdGRjeHgtZGVidWcKZG5sIGJ1aWxkcyBvbmx5IG9uZSAobm9uLWRlYnVnKSB2ZXJzaW9uIG9mIGxpYnN0ZGMrKy4KZG5sCmRubCAtLWVuYWJsZS1saWJzdGRjeHgtZGVidWctZmxhZ3M9RkxBR1MKZG5sIGlmZiAtLWVuYWJsZS1kZWJ1ZyA9PSB5ZXMsIHRoZW4gdXNlIEZMQUdTIHRvIGJ1aWxkIHRoZSBkZWJ1ZyBsaWJyYXJ5LgpkbmwKZG5sICArICBVc2FnZTogIEdMSUJDWFhfRU5BQkxFX0RFQlVHWyhERUZBVUxUKV0KZG5sICAgICAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfREVCVUddLCBbCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgYWRkaXRpb25hbCBkZWJ1ZyBidWlsZF0pCiAgR0xJQkNYWF9FTkFCTEUobGlic3RkY3h4LWRlYnVnLCQxLCxbYnVpbGQgZXh0cmEgZGVidWcgbGlicmFyeV0pCiAgQUNfTVNHX1JFU1VMVCgkZW5hYmxlX2xpYnN0ZGN4eF9kZWJ1ZykKICBHTElCQ1hYX0NPTkRJVElPTkFMKEdMSUJDWFhfQlVJTERfREVCVUcsIHRlc3QgJGVuYWJsZV9saWJzdGRjeHhfZGVidWcgPSB5ZXMpCl0pCgoKZG5sCmRubCBDaGVjayBmb3IgZXhwbGljaXQgZGVidWcgZmxhZ3MuCmRubApkbmwgLS1lbmFibGUtbGlic3RkY3h4LWRlYnVnLWZsYWdzPSctTzEnCmRubCBpcyBhIGdlbmVyYWwgbWV0aG9kIGZvciBwYXNzaW5nIGZsYWdzIHRvIGJlIHVzZWQgd2hlbgpkbmwgYnVpbGRpbmcgZGVidWcgbGlicmFyaWVzIHdpdGggLS1lbmFibGUtZGVidWcuCmRubApkbmwgLS1kaXNhYmxlLWxpYnN0ZGN4eC1kZWJ1Zy1mbGFncyBkb2VzIG5vdGhpbmcuCmRubCAgKyAgVXNhZ2U6ICBHTElCQ1hYX0VOQUJMRV9ERUJVR19GTEFHUyhkZWZhdWx0IGZsYWdzKQpkbmwgICAgICAgSWYgImRlZmF1bHQgZmxhZ3MiIGlzIGFuIGVtcHR5IHN0cmluZywgdGhlIGVmZmVjdCBpcyB0aGUgc2FtZQpkbmwgICAgICAgYXMgLS1kaXNhYmxlIG9yIC0tZW5hYmxlPW5vLgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfRU5BQkxFX0RFQlVHX0ZMQUdTXSwgWwogIEdMSUJDWFhfRU5BQkxFKGxpYnN0ZGN4eC1kZWJ1Zy1mbGFncyxbJDFdLFs9RkxBR1NdLAogICAgW3Bhc3MgY29tcGlsZXIgRkxBR1Mgd2hlbiBidWlsZGluZyBkZWJ1ZyBsaWJyYXJ5XSwKICAgIFtjYXNlICJ4JGVuYWJsZV9saWJzdGRjeHhfZGVidWdfZmxhZ3MiIGluCiAgICAgIHhubyB8IHgpICAgIGVuYWJsZV9saWJzdGRjeHhfZGVidWdfZmxhZ3M9IDs7CiAgICAgIHgtKikgICAgICAgIDs7CiAgICAgICopICAgICAgICAgIEFDX01TR19FUlJPUihfZ19zd2l0Y2ggbmVlZHMgY29tcGlsZXIgZmxhZ3MgYXMgYXJndW1lbnRzKSA7OwogICAgIGVzYWNdKQoKICAjIE9wdGlvbiBwYXJzZWQsIG5vdyBzZXQgdGhpbmdzIGFwcHJvcHJpYXRlbHkKICBERUJVR19GTEFHUz0iJGVuYWJsZV9saWJzdGRjeHhfZGVidWdfZmxhZ3MiCiAgQUNfU1VCU1QoREVCVUdfRkxBR1MpCgogIEFDX01TR19OT1RJQ0UoW0RlYnVnIGJ1aWxkIGZsYWdzIHNldCB0byAkREVCVUdfRkxBR1NdKQpdKQoKCmRubApkbmwgQ2hlY2sgaWYgdGhlIHVzZXIgb25seSB3YW50cyBhIGZyZWVzdGFuZGluZyBsaWJyYXJ5IGltcGxlbWVudGF0aW9uLgpkbmwKZG5sIC0tZGlzYWJsZS1ob3N0ZWQtbGlic3RkY3h4IHdpbGwgdHVybiBvZmYgbW9zdCBvZiB0aGUgbGlicmFyeSBidWlsZCwKZG5sIGluc3RhbGxpbmcgb25seSB0aGUgaGVhZGVycyByZXF1aXJlZCBieSBbMTcuNC4xLjNdIGFuZCB0aGUgbGFuZ3VhZ2UKZG5sIHN1cHBvcnQgbGlicmFyeS4gIE1vcmUgdGhhbiB0aGF0IHdpbGwgYmUgYnVpbHQgKHRvIGtlZXAgdGhlIE1ha2VmaWxlcwpkbmwgY29udmVuaWVudGx5IGNsZWFuKSwgYnV0IG5vdCBpbnN0YWxsZWQuCmRubApkbmwgU2V0czoKZG5sICBpc19ob3N0ZWQgICh5ZXMvbm8pCmRubApkbmwgRGVmaW5lczoKZG5sICBfR0xJQkNYWF9IT1NURUQgICAoYWx3YXlzIGRlZmluZWQsIGVpdGhlciB0byAxIG9yIDApCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfSE9TVEVEXSwgWwogIEFDX0FSR19FTkFCTEUoW2hvc3RlZC1saWJzdGRjeHhdLAogICAgQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1ob3N0ZWQtbGlic3RkY3h4XSwKICAgICAgICAgICAgICAgICAgIFtvbmx5IGJ1aWxkIGZyZWVzdGFuZGluZyBDKysgcnVudGltZSBzdXBwb3J0XSksLAogICAgW2Nhc2UgIiRob3N0IiBpbgoJYXJtKi0qLXN5bWJpYW5lbGYqKSAKCSAgICBlbmFibGVfaG9zdGVkX2xpYnN0ZGN4eD1ubwoJICAgIDs7CiAgICAgICAgKikgCgkgICAgZW5hYmxlX2hvc3RlZF9saWJzdGRjeHg9eWVzCgkgICAgOzsKICAgICBlc2FjXSkKICBpZiB0ZXN0ICIkZW5hYmxlX2hvc3RlZF9saWJzdGRjeHgiID0gbm87IHRoZW4KICAgIEFDX01TR19OT1RJQ0UoW09ubHkgZnJlZXN0YW5kaW5nIGxpYnJhcmllcyB3aWxsIGJlIGJ1aWx0XSkKICAgIGlzX2hvc3RlZD1ubwogICAgaG9zdGVkX2RlZmluZT0wCiAgICBlbmFibGVfYWJpX2NoZWNrPW5vCiAgICBlbmFibGVfbGlic3RkY3h4X3BjaD1ubwogIGVsc2UKICAgIGlzX2hvc3RlZD15ZXMKICAgIGhvc3RlZF9kZWZpbmU9MQogIGZpCiAgR0xJQkNYWF9DT05ESVRJT05BTChHTElCQ1hYX0hPU1RFRCwgdGVzdCAkaXNfaG9zdGVkID0geWVzKQogIEFDX0RFRklORV9VTlFVT1RFRChfR0xJQkNYWF9IT1NURUQsICRob3N0ZWRfZGVmaW5lLAogICAgW0RlZmluZSB0byAxIGlmIGEgZnVsbCBob3N0ZWQgbGlicmFyeSBpcyBidWlsdCwgb3IgMCBpZiBmcmVlc3RhbmRpbmcuXSkKXSkKCgpkbmwKZG5sIENoZWNrIGZvciB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMgZm9yIHRoZSAnbG9uZyBsb25nJyB0eXBlLgpkbmwgVGhlIHJlc3VsdCBkZXRlcm1pbmVzIG9ubHkgd2hldGhlciAnbG9uZyBsb25nJyBJL08gaXMgZW5hYmxlZDsgdGhpbmdzCmRubCBsaWtlIG51bWVyaWNfbGltaXRzPD4gc3BlY2lhbGl6YXRpb25zIGFyZSBhbHdheXMgYXZhaWxhYmxlLgpkbmwKZG5sIC0tZW5hYmxlLWxvbmctbG9uZyBkZWZpbmVzIF9HTElCQ1hYX1VTRV9MT05HX0xPTkcKZG5sIC0tZGlzYWJsZS1sb25nLWxvbmcgbGVhdmVzIF9HTElCQ1hYX1VTRV9MT05HX0xPTkcgdW5kZWZpbmVkCmRubCAgKyAgVXNhZ2U6ICBHTElCQ1hYX0VOQUJMRV9MT05HX0xPTkdbKERFRkFVTFQpXQpkbmwgICAgICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4KZG5sCkFDX0RFRlVOKFtHTElCQ1hYX0VOQUJMRV9MT05HX0xPTkddLCBbCiAgR0xJQkNYWF9FTkFCTEUobG9uZy1sb25nLCQxLCxbZW5hYmxlIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9ucyBmb3IgJ2xvbmcgbG9uZyddKQogIGlmIHRlc3QgJGVuYWJsZV9sb25nX2xvbmcgPSB5ZXM7IHRoZW4KICAgIEFDX0RFRklORShfR0xJQkNYWF9VU0VfTE9OR19MT05HLCAxLCAKICAgICAgICAgICAgICBbRGVmaW5lIGlmIGNvZGUgc3BlY2lhbGl6ZWQgZm9yIGxvbmcgbG9uZyBzaG91bGQgYmUgdXNlZC5dKQogIGZpCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgZW5hYmxlZCBsb25nIGxvbmcgc3BlY2lhbGl6YXRpb25zXSkKICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX2xvbmdfbG9uZ10pCl0pCgoKZG5sCmRubCBDaGVjayBmb3IgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zIGZvciB0aGUgJ3djaGFyX3QnIHR5cGUuCmRubApkbmwgLS1lbmFibGUtd2NoYXJfdCBkZWZpbmVzIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCmRubCAtLWRpc2FibGUtd2NoYXJfdCBsZWF2ZXMgX0dMSUJDWFhfVVNFX1dDSEFSX1QgdW5kZWZpbmVkCmRubCAgKyAgVXNhZ2U6ICBHTElCQ1hYX0VOQUJMRV9XQ0hBUl9UWyhERUZBVUxUKV0KZG5sICAgICAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuCmRubApkbmwgTmVjZXNzYXJ5IHN1cHBvcnQgbXVzdCBhbHNvIGJlIHByZXNlbnQuCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfV0NIQVJfVF0sIFsKICBHTElCQ1hYX0VOQUJMRSh3Y2hhcl90LCQxLCxbZW5hYmxlIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9ucyBmb3IgJ3djaGFyX3QnXSkKCiAgIyBUZXN0IHdjaGFyLmggZm9yIG1ic3RhdGVfdCwgd2hpY2ggaXMgbmVlZGVkIGZvciBjaGFyX3RyYWl0cyBhbmQgZnBvcy4KICBBQ19DSEVDS19IRUFERVJTKHdjaGFyLmgsIGFjX2hhc193Y2hhcl9oPXllcywgYWNfaGFzX3djaGFyX2g9bm8pCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbWJzdGF0ZV90XSkKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHdjaGFyLmg+XSwKICBbbWJzdGF0ZV90IHRlc3RzdGF0ZTtdLAogIGhhdmVfbWJzdGF0ZV90PXllcywgaGF2ZV9tYnN0YXRlX3Q9bm8pCiAgQUNfTVNHX1JFU1VMVCgkaGF2ZV9tYnN0YXRlX3QpCiAgaWYgdGVzdCB4IiRoYXZlX21ic3RhdGVfdCIgPSB4eWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoSEFWRV9NQlNUQVRFX1QsMSxbRGVmaW5lIGlmIG1ic3RhdGVfdCBleGlzdHMgaW4gd2NoYXIuaC5dKQogIGZpCgogICMgVGVzdCBpdCBhbHdheXMsIGZvciB1c2UgaW4gR0xJQkNYWF9FTkFCTEVfQzk5LCB0b2dldGhlciB3aXRoCiAgIyBhY19oYXNfd2NoYXJfaC4KICBBQ19DSEVDS19IRUFERVJTKHdjdHlwZS5oLCBhY19oYXNfd2N0eXBlX2g9eWVzLCBhY19oYXNfd2N0eXBlX2g9bm8pCiAgCiAgaWYgdGVzdCB4IiRlbmFibGVfd2NoYXJfdCIgPSB4InllcyI7IHRoZW4KCiAgICBBQ19MQU5HX1NBVkUKICAgIEFDX0xBTkdfQ1BMVVNQTFVTCiAgICAKICAgIGlmIHRlc3QgeCIkYWNfaGFzX3djaGFyX2giID0geHllcyAmJgogICAgICAgdGVzdCB4IiRhY19oYXNfd2N0eXBlX2giID0geHllczsgdGhlbgogICAgICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHdjaGFyLmg+CiAgICAgICAgICAgICAgICAgICAgICAjaW5jbHVkZSA8c3RkZGVmLmg+CiAgICAgICAgICAgICAgICAgICAgICB3aW50X3QgaTsKCQkgICAgICBsb25nIGwgPSBXRU9GOwoJCSAgICAgIGxvbmcgaiA9IFdDSEFSX01JTjsKCQkgICAgICBsb25nIGsgPSBXQ0hBUl9NQVg7CiAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgdGVzdAogICAgICAgICAgICAgICAgICAgICAgewoJCQl1c2luZyA6OmJ0b3djOwoJCQl1c2luZyA6OmZnZXR3YzsKCQkJdXNpbmcgOjpmZ2V0d3M7CgkJCXVzaW5nIDo6ZnB1dHdjOwoJCQl1c2luZyA6OmZwdXR3czsKCQkJdXNpbmcgOjpmd2lkZTsKCQkJdXNpbmcgOjpmd3ByaW50ZjsgCgkJCXVzaW5nIDo6ZndzY2FuZjsKCQkJdXNpbmcgOjpnZXR3YzsKCQkJdXNpbmcgOjpnZXR3Y2hhcjsKIAkJCXVzaW5nIDo6bWJybGVuOyAKCQkJdXNpbmcgOjptYnJ0b3djOyAKCQkJdXNpbmcgOjptYnNpbml0OyAKCQkJdXNpbmcgOjptYnNydG93Y3M7IAoJCQl1c2luZyA6OnB1dHdjOwoJCQl1c2luZyA6OnB1dHdjaGFyOwoJCQl1c2luZyA6OnN3cHJpbnRmOyAKCQkJdXNpbmcgOjpzd3NjYW5mOyAKCQkJdXNpbmcgOjp1bmdldHdjOwoJCQl1c2luZyA6OnZmd3ByaW50ZjsgCgkJCXVzaW5nIDo6dnN3cHJpbnRmOyAKCQkJdXNpbmcgOjp2d3ByaW50ZjsgCgkJCXVzaW5nIDo6d2NydG9tYjsgCgkJCXVzaW5nIDo6d2NzY2F0OyAKCQkJdXNpbmcgOjp3Y3NjaHI7IAoJCQl1c2luZyA6Ondjc2NtcDsgCgkJCXVzaW5nIDo6d2NzY29sbDsgCgkJCXVzaW5nIDo6d2NzY3B5OyAKCQkJdXNpbmcgOjp3Y3Njc3BuOyAKCQkJdXNpbmcgOjp3Y3NmdGltZTsgCgkJCXVzaW5nIDo6d2NzbGVuOwoJCQl1c2luZyA6Ondjc25jYXQ7IAoJCQl1c2luZyA6Ondjc25jbXA7IAoJCQl1c2luZyA6Ondjc25jcHk7IAoJCQl1c2luZyA6Ondjc3Bicms7CgkJCXVzaW5nIDo6d2NzcmNocjsgCgkJCXVzaW5nIDo6d2NzcnRvbWJzOyAKCQkJdXNpbmcgOjp3Y3NzcG47IAoJCQl1c2luZyA6Ondjc3N0cjsKCQkJdXNpbmcgOjp3Y3N0b2Q7IAoJCQl1c2luZyA6Ondjc3RvazsgCgkJCXVzaW5nIDo6d2NzdG9sOwoJCQl1c2luZyA6Ondjc3RvdWw7IAoJCQl1c2luZyA6Ondjc3hmcm07IAoJCQl1c2luZyA6OndjdG9iOyAKCQkJdXNpbmcgOjp3bWVtY2hyOwoJCQl1c2luZyA6OndtZW1jbXA7CgkJCXVzaW5nIDo6d21lbWNweTsKCQkJdXNpbmcgOjp3bWVtbW92ZTsKCQkJdXNpbmcgOjp3bWVtc2V0OwoJCQl1c2luZyA6OndwcmludGY7IAoJCQl1c2luZyA6OndzY2FuZjsgCgkJICAgICAgfQoJCSAgICAgXSxbXSxbXSwgW2VuYWJsZV93Y2hhcl90PW5vXSkKICAgIGVsc2UKICAgICAgZW5hYmxlX3djaGFyX3Q9bm8KICAgIGZpCgogICAgQUNfTEFOR19SRVNUT1JFCiAgZmkKCiAgaWYgdGVzdCB4IiRlbmFibGVfd2NoYXJfdCIgPSB4InllcyI7IHRoZW4KICAgIEFDX0RFRklORShfR0xJQkNYWF9VU0VfV0NIQVJfVCwgMSwKICAgICAgICAgICAgICBbRGVmaW5lIGlmIGNvZGUgc3BlY2lhbGl6ZWQgZm9yIHdjaGFyX3Qgc2hvdWxkIGJlIHVzZWQuXSkKICBmaQoKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBlbmFibGVkIHdjaGFyX3Qgc3BlY2lhbGl6YXRpb25zXSkKICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3djaGFyX3RdKQpdKQoKCmRubApkbmwgQ2hlY2sgdG8gc2VlIGlmIGJ1aWxkaW5nIGFuZCB1c2luZyBhIEMrKyBwcmVjb21waWxlZCBoZWFkZXIgY2FuIGJlIGRvbmUuCmRubApkbmwgLS1lbmFibGUtbGlic3RkY3h4LXBjaD15ZXMKZG5sIGRlZmF1bHQsIHRoaXMgc2hvd3MgaW50ZW50IHRvIHVzZSBzdGRjKysuaC5nY2ggSWYgaXQgbG9va3MgbGlrZSBpdApkbmwgbWF5IHdvcmssIGFmdGVyIHNvbWUgbGlnaHQtaGVhcnRlZCBhdHRlbXB0cyB0byBwdXp6bGUgb3V0IGNvbXBpbGVyCmRubCBzdXBwb3J0LCBmbGlwIGJpdHMgb24gaW4gaW5jbHVkZS9NYWtlZmlsZS5hbQpkbmwKZG5sIC0tZGlzYWJsZS1saWJzdGRjeHgtcGNoCmRubCB0dXJucyBvZmYgYXR0ZW1wdHMgdG8gdXNlIG9yIGJ1aWxkIHN0ZGMrKy5oLmdjaC4KZG5sCmRubCBTdWJzdHM6CmRubCAgZ2xpYmN4eF9QQ0hGTEFHUwpkbmwKQUNfREVGVU4oW0dMSUJDWFhfRU5BQkxFX1BDSF0sIFsKICBHTElCQ1hYX0VOQUJMRShsaWJzdGRjeHgtcGNoLCQxLCxbYnVpbGQgcHJlLWNvbXBpbGVkIGxpYnN0ZGMrKyBoZWFkZXJzXSkKICBpZiB0ZXN0ICRlbmFibGVfbGlic3RkY3h4X3BjaCA9IHllczsgdGhlbgogICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBjb21waWxlciB3aXRoIFBDSCBzdXBwb3J0XSwKICAgICAgW2dsaWJjeHhfY3ZfcHJvZ19DWFhfcGNoXSwKICAgICAgW2FjX3NhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKICAgICAgIENYWEZMQUdTPSIkQ1hYRkxBR1MgLVdlcnJvciAtV2ludmFsaWQtcGNoIC1Xbm8tZGVwcmVjYXRlZCIKICAgICAgIEFDX0xBTkdfU0FWRQogICAgICAgQUNfTEFOR19DUExVU1BMVVMKICAgICAgIGVjaG8gJyNpbmNsdWRlIDxtYXRoLmg+JyA+IGNvbmZ0ZXN0LmgKICAgICAgIGlmICRDWFggJENYWEZMQUdTICRDUFBGTEFHUyAteCBjKystaGVhZGVyIGNvbmZ0ZXN0LmggXAoJCSAgICAgICAgICAtbyBjb25mdGVzdC5oLmdjaCAxPiY1IDI+JjEgJiYKCSAgICAgICAgZWNobyAnI2Vycm9yICJwY2ggZmFpbGVkIicgPiBjb25mdGVzdC5oICYmCiAgICAgICAgICBlY2hvICcjaW5jbHVkZSAiY29uZnRlc3QuaCInID4gY29uZnRlc3QuY2MgJiYKCSAgICAgICAkQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuY2MgMT4mNSAyPiYxIDsKICAgICAgIHRoZW4KICAgICAgICAgZ2xpYmN4eF9jdl9wcm9nX0NYWF9wY2g9eWVzCiAgICAgICBlbHNlCiAgICAgICAgIGdsaWJjeHhfY3ZfcHJvZ19DWFhfcGNoPW5vCiAgICAgICBmaQogICAgICAgcm0gLWYgY29uZnRlc3QqCiAgICAgICBDWFhGTEFHUz0kYWNfc2F2ZV9DWFhGTEFHUwogICAgICAgQUNfTEFOR19SRVNUT1JFCiAgICAgIF0pCiAgICBlbmFibGVfbGlic3RkY3h4X3BjaD0kZ2xpYmN4eF9jdl9wcm9nX0NYWF9wY2gKICBmaQoKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBlbmFibGVkIFBDSF0pCiAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9saWJzdGRjeHhfcGNoXSkKCiAgR0xJQkNYWF9DT05ESVRJT05BTChHTElCQ1hYX0JVSUxEX1BDSCwgdGVzdCAkZW5hYmxlX2xpYnN0ZGN4eF9wY2ggPSB5ZXMpCiAgaWYgdGVzdCAkZW5hYmxlX2xpYnN0ZGN4eF9wY2ggPSB5ZXM7IHRoZW4KICAgIGdsaWJjeHhfUENIRkxBR1M9Ii1pbmNsdWRlIGJpdHMvc3RkYysrLmgiCiAgZWxzZQogICAgZ2xpYmN4eF9QQ0hGTEFHUz0iIgogIGZpCiAgQUNfU1VCU1QoZ2xpYmN4eF9QQ0hGTEFHUykKXSkKCgpkbmwKZG5sIENoZWNrIGZvciBhdG9taWMgYnVpbHRpbnMuCmRubCBTZWU6CmRubCBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9nY2MvQXRvbWljLUJ1aWx0aW5zLmh0bWwjQXRvbWljLUJ1aWx0aW5zCmRubApkbmwgVGhpcyBjaGVja3MgdG8gc2VlIGlmIHRoZSBob3N0IHN1cHBvcnRzIHRoZSBjb21waWxlci1nZW5lcmF0ZWQKZG5sIGJ1aWx0aW5zIGZvciBhdG9taWMgb3BlcmF0aW9ucyBmb3IgdmFyaW91cyBpbnRlZ3JhbCBzaXplcy4gTm90ZSwgdGhpcyAKZG5sIGlzIGludGVuZGVkIHRvIGJlIGFuIGFsbC1vci1ub3RoaW5nIHN3aXRjaCwgc28gYWxsIHRoZSBhdG9taWMgb3BlcmF0aW9ucwpkbmwgdGhhdCBhcmUgdXNlZCBzaG91bGQgYmUgY2hlY2tlZC4KZG5sCmRubCBOb3RlOgpkbmwgbGliZ29tcCBhbmQgbGliZ2ZvcnRyYW4gZG8gdGhpcyB3aXRoIGEgbGluayB0ZXN0LCBpbnN0ZWFkIG9mIGFuIGFzbSB0ZXN0Lgpkbmwgc2VlOiBDSEVDS19TWU5DX0ZFVENIX0FORF9BREQKZG5sCmRubCBEZWZpbmVzOgpkbmwgIF9HTElCQ1hYX0FUT01JQ19CVUlMVElOU18xIApkbmwgIF9HTElCQ1hYX0FUT01JQ19CVUlMVElOU18yCmRubCAgX0dMSUJDWFhfQVRPTUlDX0JVSUxUSU5TXzQKZG5sICBfR0xJQkNYWF9BVE9NSUNfQlVJTFRJTlNfOApkbmwKQUNfREVGVU4oW0dMSUJDWFhfRU5BQkxFX0FUT01JQ19CVUlMVElOU10sIFsKICBBQ19MQU5HX1NBVkUKICBBQ19MQU5HX0NQTFVTUExVUwogIG9sZF9DWFhGTEFHUz0iJENYWEZMQUdTIgogIAogICMgQ29tcGlsZSB1bm9wdGltaXplZC4KICBDWFhGTEFHUz0nLU8wIC1TJwoKICAjIEZha2Ugd2hhdCBBQ19UUllfQ09NUElMRSBkb2VzLCB3aXRob3V0IGxpbmtpbmcgYXMgdGhpcyBpcwogICMgdW5uZWNlc3NhcnkgZm9yIGEgYnVpbHRpbnMgdGVzdC4KCiAgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgpbI11saW5lIF9fb2xpbmVfXyAiY29uZmlndXJlIgppbnQgbWFpbigpCnsKICB0eXBlZGVmIGJvb2wgYXRvbWljX3R5cGU7CiAgYXRvbWljX3R5cGUgYzE7CiAgYXRvbWljX3R5cGUgYzI7CiAgY29uc3QgYXRvbWljX3R5cGUgYzMoMCk7CiAgX19zeW5jX2ZldGNoX2FuZF9hZGQoJmMxLCBjMik7CiAgX19zeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwKCZjMSwgYzMsIGMyKTsKICBfX3N5bmNfbG9ja190ZXN0X2FuZF9zZXQoJmMxLCBjMyk7CiAgX19zeW5jX2xvY2tfcmVsZWFzZSgmYzEpOwogIF9fc3luY19zeW5jaHJvbml6ZSgpOwogIHJldHVybiAwOwp9CkVPRgoKICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGF0b21pYyBidWlsdGlucyBmb3IgYm9vbF0pCiAgICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgogICAgICBpZiBncmVwIF9fc3luY18gY29uZnRlc3QucyA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCiAgICAgICAgZW5hYmxlX2F0b21pY19idWlsdGluc2I9bm8KICAgICAgZWxzZQogICAgICBBQ19ERUZJTkUoX0dMSUJDWFhfQVRPTUlDX0JVSUxUSU5TXzEsIDEsCiAgICAgIFtEZWZpbmUgaWYgYnVpbHRpbiBhdG9taWMgb3BlcmF0aW9ucyBmb3IgYm9vbCBhcmUgc3VwcG9ydGVkIG9uIHRoaXMgaG9zdC5dKQogICAgICAgIGVuYWJsZV9hdG9taWNfYnVpbHRpbnNiPXllcwogICAgICBmaQogICAgZmkKICAgIEFDX01TR19SRVNVTFQoJGVuYWJsZV9hdG9taWNfYnVpbHRpbnNiKQogICAgcm0gLWYgY29uZnRlc3QqCgogICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKWyNdbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSIKaW50IG1haW4oKQp7CiAgdHlwZWRlZiBzaG9ydCBhdG9taWNfdHlwZTsKICBhdG9taWNfdHlwZSBjMTsKICBhdG9taWNfdHlwZSBjMjsKICBjb25zdCBhdG9taWNfdHlwZSBjMygwKTsKICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCgmYzEsIGMyKTsKICBfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAoJmMxLCBjMywgYzIpOwogIF9fc3luY19sb2NrX3Rlc3RfYW5kX3NldCgmYzEsIGMzKTsKICBfX3N5bmNfbG9ja19yZWxlYXNlKCZjMSk7CiAgX19zeW5jX3N5bmNocm9uaXplKCk7CiAgcmV0dXJuIDA7Cn0KRU9GCgogICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgYXRvbWljIGJ1aWx0aW5zIGZvciBzaG9ydF0pCiAgICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgogICAgICBpZiBncmVwIF9fc3luY18gY29uZnRlc3QucyA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCiAgICAgICAgZW5hYmxlX2F0b21pY19idWlsdGluc3M9bm8KICAgICAgZWxzZQogICAgICBBQ19ERUZJTkUoX0dMSUJDWFhfQVRPTUlDX0JVSUxUSU5TXzIsIDEsCiAgICAgIFtEZWZpbmUgaWYgYnVpbHRpbiBhdG9taWMgb3BlcmF0aW9ucyBmb3Igc2hvcnQgYXJlIHN1cHBvcnRlZCBvbiB0aGlzIGhvc3QuXSkKICAgICAgICBlbmFibGVfYXRvbWljX2J1aWx0aW5zcz15ZXMKICAgICAgZmkKICAgIGZpCiAgICBBQ19NU0dfUkVTVUxUKCRlbmFibGVfYXRvbWljX2J1aWx0aW5zcykKICAgIHJtIC1mIGNvbmZ0ZXN0KgoKICAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GClsjXWxpbmUgX19vbGluZV9fICJjb25maWd1cmUiCmludCBtYWluKCkKewogIC8vIE5COiBfQXRvbWljX3dvcmQgbm90IG5lY2Vzc2FyaWx5IGludC4gCiAgdHlwZWRlZiBpbnQgYXRvbWljX3R5cGU7CiAgYXRvbWljX3R5cGUgYzE7CiAgYXRvbWljX3R5cGUgYzI7CiAgY29uc3QgYXRvbWljX3R5cGUgYzMoMCk7CiAgX19zeW5jX2ZldGNoX2FuZF9hZGQoJmMxLCBjMik7CiAgX19zeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwKCZjMSwgYzMsIGMyKTsKICBfX3N5bmNfbG9ja190ZXN0X2FuZF9zZXQoJmMxLCBjMyk7CiAgX19zeW5jX2xvY2tfcmVsZWFzZSgmYzEpOwogIF9fc3luY19zeW5jaHJvbml6ZSgpOwogIHJldHVybiAwOwp9CkVPRgoKICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGF0b21pYyBidWlsdGlucyBmb3IgaW50XSkKICAgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCiAgICAgIGlmIGdyZXAgX19zeW5jXyBjb25mdGVzdC5zID4vZGV2L251bGwgMj4mMSA7IHRoZW4KICAgICAgICBlbmFibGVfYXRvbWljX2J1aWx0aW5zaT1ubwogICAgICBlbHNlCiAgICAgIEFDX0RFRklORShfR0xJQkNYWF9BVE9NSUNfQlVJTFRJTlNfNCwgMSwKICAgICAgICBbRGVmaW5lIGlmIGJ1aWx0aW4gYXRvbWljIG9wZXJhdGlvbnMgZm9yIGludCBhcmUgc3VwcG9ydGVkIG9uIHRoaXMgaG9zdC5dKQogICAgICAgIGVuYWJsZV9hdG9taWNfYnVpbHRpbnNpPXllcwogICAgICBmaQogICAgZmkKICAgIEFDX01TR19SRVNVTFQoJGVuYWJsZV9hdG9taWNfYnVpbHRpbnNpKQogICAgcm0gLWYgY29uZnRlc3QqCgogICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKWyNdbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSIKaW50IG1haW4oKQp7CiAgdHlwZWRlZiBsb25nIGxvbmcgYXRvbWljX3R5cGU7CiAgYXRvbWljX3R5cGUgYzE7CiAgYXRvbWljX3R5cGUgYzI7CiAgY29uc3QgYXRvbWljX3R5cGUgYzMoMCk7CiAgX19zeW5jX2ZldGNoX2FuZF9hZGQoJmMxLCBjMik7CiAgX19zeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwKCZjMSwgYzMsIGMyKTsKICBfX3N5bmNfbG9ja190ZXN0X2FuZF9zZXQoJmMxLCBjMyk7CiAgX19zeW5jX2xvY2tfcmVsZWFzZSgmYzEpOwogIF9fc3luY19zeW5jaHJvbml6ZSgpOwogIHJldHVybiAwOwp9CkVPRgoKICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGF0b21pYyBidWlsdGlucyBmb3IgbG9uZyBsb25nXSkKICAgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCiAgICAgIGlmIGdyZXAgX19zeW5jXyBjb25mdGVzdC5zID4vZGV2L251bGwgMj4mMSA7IHRoZW4KICAgICAgICBlbmFibGVfYXRvbWljX2J1aWx0aW5zbGw9bm8KICAgICAgZWxzZQogICAgICBBQ19ERUZJTkUoX0dMSUJDWFhfQVRPTUlDX0JVSUxUSU5TXzgsIDEsCiAgICAgIFtEZWZpbmUgaWYgYnVpbHRpbiBhdG9taWMgb3BlcmF0aW9ucyBmb3IgbG9uZyBsb25nIGFyZSBzdXBwb3J0ZWQgb24gdGhpcyBob3N0Ll0pCiAgICAgICAgZW5hYmxlX2F0b21pY19idWlsdGluc2xsPXllcwogICAgICBmaQogICAgZmkKICAgIEFDX01TR19SRVNVTFQoJGVuYWJsZV9hdG9taWNfYnVpbHRpbnNsbCkKICAgIHJtIC1mIGNvbmZ0ZXN0KgoKCiAgQ1hYRkxBR1M9IiRvbGRfQ1hYRkxBR1MiCiAgQUNfTEFOR19SRVNUT1JFCgogICMgU2V0IGF0b21pY2l0eV9kaXIgdG8gYnVpbHRpbnMgaWYgZWl0aGVyIG9mIGFib3ZlIHRlc3RzIHBhc3MuCiAgaWYgdGVzdCAkZW5hYmxlX2F0b21pY19idWlsdGluc2kgPSB5ZXMgfHwgdGVzdCAkZW5hYmxlX2F0b21pY19idWlsdGluc2IgPSB5ZXMgOyB0aGVuCiAgICBhdG9taWNpdHlfZGlyPWNwdS9nZW5lcmljL2F0b21pY2l0eV9idWlsdGlucwogIGZpCgogICMgSWYgc3RpbGwgZ2VuZXJpYywgc2V0IHRvIG11dGV4LgogIGlmIHRlc3QgJGF0b21pY2l0eV9kaXIgPSAiY3B1L2dlbmVyaWMiIDsgdGhlbgogICAgYXRvbWljaXR5X2Rpcj1jcHUvZ2VuZXJpYy9hdG9taWNpdHlfbXV0ZXgKICAgIEFDX01TR19XQVJOKFtObyBuYXRpdmUgYXRvbWljIG9wZXJhdGlvbnMgYXJlIHByb3ZpZGVkIGZvciB0aGlzIHBsYXRmb3JtLl0pCiAgICAgIGlmIHRlc3QgIngkdGFyZ2V0X3RocmVhZF9maWxlIiA9IHhzaW5nbGU7IHRoZW4KICAgICAgICBBQ19NU0dfV0FSTihbVGhleSBjYW5ub3QgYmUgZmFrZWQgd2hlbiB0aHJlYWQgc3VwcG9ydCBpcyBkaXNhYmxlZC5dKQogICAgICAgIEFDX01TR19XQVJOKFtUaHJlYWQtc2FmZXR5IG9mIGNlcnRhaW4gY2xhc3NlcyBpcyBub3QgZ3VhcmFudGVlZC5dKQogICAgICBlbHNlCiAgICAgICAgQUNfTVNHX1dBUk4oW1RoZXkgd2lsbCBiZSBmYWtlZCB1c2luZyBhIG11dGV4Ll0pCiAgICAgICAgQUNfTVNHX1dBUk4oW1BlcmZvcm1hbmNlIG9mIGNlcnRhaW4gY2xhc3NlcyB3aWxsIGRlZ3JhZGUgYXMgYSByZXN1bHQuXSkKICAgICAgZmkKICBmaQoKXSkKCgpkbmwKZG5sIENoZWNrIGZvciBleGNlcHRpb24gaGFuZGxpbmcgc3VwcG9ydC4gIElmIGFuIGV4cGxpY2l0IGVuYWJsZS9kaXNhYmxlCmRubCBzamxqIGV4Y2VwdGlvbnMgaXMgZ2l2ZW4sIHdlIGRvbid0IGhhdmUgdG8gZGV0ZWN0LiAgT3RoZXJ3aXNlIHRoZQpkbmwgdGFyZ2V0IG1heSBvciBtYXkgbm90IHN1cHBvcnQgY2FsbCBmcmFtZSBleGNlcHRpb25zLgpkbmwKZG5sIC0tZW5hYmxlLXNqbGotZXhjZXB0aW9ucyBmb3JjZXMgdGhlIHVzZSBvZiBidWlsdGluIHNldGptcC4KZG5sIC0tZGlzYWJsZS1zamxqLWV4Y2VwdGlvbnMgZm9yY2VzIHRoZSB1c2Ugb2YgY2FsbCBmcmFtZSB1bndpbmRpbmcuCmRubCBOZWl0aGVyIG9uZSBmb3JjZXMgYW4gYXR0ZW1wdCBhdCBkZXRlY3Rpb24uCmRubApkbmwgRGVmaW5lczoKZG5sICBfR0xJQkNYWF9TSkxKX0VYQ0VQVElPTlMgaWYgdGhlIGNvbXBpbGVyIGlzIGNvbmZpZ3VyZWQgZm9yIGl0CmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfU0pMSl9FWENFUFRJT05TXSwgWwogIEFDX01TR19DSEVDS0lORyhbZm9yIGV4Y2VwdGlvbiBtb2RlbCB0byB1c2VdKQogIEFDX0xBTkdfU0FWRQogIEFDX0xBTkdfQ1BMVVNQTFVTCiAgR0xJQkNYWF9FTkFCTEUoc2psai1leGNlcHRpb25zLGF1dG8sLAogICAgW2ZvcmNlIHVzZSBvZiBidWlsdGluX3NldGptcCBmb3IgZXhjZXB0aW9uc10sCiAgICBbcGVybWl0IHllc3xub3xhdXRvXSkKCiAgaWYgdGVzdCAkZW5hYmxlX3NqbGpfZXhjZXB0aW9ucyA9IGF1dG87IHRoZW4KICAgICMgQm90aGVyYXRpb24uICBOb3cgd2UndmUgZ290IHRvIGRldGVjdCB0aGUgZXhjZXB0aW9uIG1vZGVsLiAgTGluayB0ZXN0cwogICAgIyBhZ2FpbnN0IGxpYmdjYy5hIGFyZSBwcm9ibGVtYXRpYyBzaW5jZSB3ZSd2ZSBub3QgYmVlbiBnaXZlbiBwcm9wZXIgLUwKICAgICMgYml0cyBmb3Igc2luZ2xlLXRyZWUgbmV3bGliIGFuZCBsaWJnbG9zcy4KICAgICMKICAgICMgRmFrZSB3aGF0IEFDX1RSWV9DT01QSUxFIGRvZXMuICBYWFggTG9vayBhdCByZWRvaW5nIHRoaXMgbmV3LXN0eWxlLgogICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKWyNdbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSIKc3RydWN0IFMgeyB+UygpOyB9Owp2b2lkIGJhcigpOwp2b2lkIGZvbygpCnsKICBTIHM7CiAgYmFyKCk7Cn0KRU9GCiAgICBvbGRfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKICAgIENYWEZMQUdTPS1TCiAgICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgogICAgICBpZiBncmVwIF9VbndpbmRfU2pMal9SZXN1bWUgY29uZnRlc3QucyA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCiAgICAgICAgZW5hYmxlX3NqbGpfZXhjZXB0aW9ucz15ZXMKICAgICAgZWxpZiBncmVwIF9VbndpbmRfUmVzdW1lIGNvbmZ0ZXN0LnMgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgogICAgICAgIGVuYWJsZV9zamxqX2V4Y2VwdGlvbnM9bm8KICAgICAgZWxpZiBncmVwIF9fY3hhX2VuZF9jbGVhbnVwIGNvbmZ0ZXN0LnMgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgogICAgICAgIGVuYWJsZV9zamxqX2V4Y2VwdGlvbnM9bm8KICAgICAgZmkKICAgIGZpCiAgICBDWFhGTEFHUz0iJG9sZF9DWFhGTEFHUyIKICAgIHJtIC1mIGNvbmZ0ZXN0KgogIGZpCgogICMgVGhpcyBpcyBhIHRhZCB3ZWlyZCwgZm9yIGh5c3RlcmljYWwgcmFpc2lucy4gIFdlIGhhdmUgdG8gbWFwCiAgIyBlbmFibGUvZGlzYWJsZSB0byB0d28gZGlmZmVyZW50IG1vZGVscy4KICBjYXNlICRlbmFibGVfc2psal9leGNlcHRpb25zIGluCiAgICB5ZXMpCiAgICAgIEFDX0RFRklORShfR0xJQkNYWF9TSkxKX0VYQ0VQVElPTlMsIDEsCiAgICAgICAgW0RlZmluZSBpZiB0aGUgY29tcGlsZXIgaXMgY29uZmlndXJlZCBmb3Igc2V0am1wL2xvbmdqbXAgZXhjZXB0aW9ucy5dKQogICAgICBhY19leGNlcHRpb25fbW9kZWxfbmFtZT1zamxqCiAgICAgIDs7CiAgICBubykKICAgICAgYWNfZXhjZXB0aW9uX21vZGVsX25hbWU9ImNhbGwgZnJhbWUiCiAgICAgIDs7CiAgICAqKQogICAgICBBQ19NU0dfRVJST1IoW3VuYWJsZSB0byBkZXRlY3QgZXhjZXB0aW9uIG1vZGVsXSkKICAgICAgOzsKICBlc2FjCiBBQ19MQU5HX1JFU1RPUkUKIEFDX01TR19SRVNVTFQoJGFjX2V4Y2VwdGlvbl9tb2RlbF9uYW1lKQpdKQoKCmRubApkbmwgQWxsb3cgdmlzaWJpbGl0eSBhdHRyaWJ1dGVzIHRvIGJlIHVzZWQgb24gbmFtZXNwYWNlcywgb2JqZWN0cywgZXRjLgpkbmwKZG5sIC0tZW5hYmxlLXZpc2liaWxpdHkgZW5hYmxlcyBhdHRlbXB0IHRvIHVzZSB2aXNpYmlsaXR5IGF0dHJpYnV0ZXMuCmRubCAtLWRpc2FibGUtdmlzaWJpbGl0eSB0dXJucyBvZmYgYWxsIHVzZSBvZiB2aXNpYmlsaXR5IGF0dHJpYnV0ZXMuCmRubCAgKyAgVXNhZ2U6ICBHTElCQ1hYX0VOQUJMRV9WSVNJQklMSVRZWyhERUZBVUxUKV0KZG5sICAgICAgIFdoZXJlIERFRkFVTFQgaXMgJ3llcycuCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfVklTSUJJTElUWV0sIFsKR0xJQkNYWF9FTkFCTEUodmlzaWJpbGl0eSwkMSwsW2VuYWJsZXMgdmlzaWJpbGl0eSBzYWZlIHVzYWdlXSkKCmlmIHRlc3QgeCRlbmFibGVfdmlzaWJpbGl0eSA9IHh5ZXMgOyB0aGVuCiAgZG5sIGFsbCBoYWlsIGxpYmdmb3J0cmFuCiAgZG5sIENoZWNrIHdoZXRoZXIgdGhlIHRhcmdldCBzdXBwb3J0cyBoaWRkZW4gdmlzaWJpbGl0eS4KICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciB0aGUgdGFyZ2V0IHN1cHBvcnRzIGhpZGRlbiB2aXNpYmlsaXR5XSwKCQkgZ2xpYmN4eF9jdl9oYXZlX2F0dHJpYnV0ZV92aXNpYmlsaXR5LCBbCiAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCiAgQ0ZMQUdTPSIkQ0ZMQUdTIC1XZXJyb3IiCiAgQUNfVFJZX0NPTVBJTEUoW3ZvaWQgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiaGlkZGVuIikpKSBmb28odm9pZCkgeyB9XSwKCQkgW10sIGdsaWJjeHhfY3ZfaGF2ZV9hdHRyaWJ1dGVfdmlzaWJpbGl0eT15ZXMsCgkJIGdsaWJjeHhfY3ZfaGF2ZV9hdHRyaWJ1dGVfdmlzaWJpbGl0eT1ubykKICBDRkxBR1M9IiRzYXZlX0NGTEFHUyJdKQogIGlmIHRlc3QgJGdsaWJjeHhfY3ZfaGF2ZV9hdHRyaWJ1dGVfdmlzaWJpbGl0eSA9IG5vOyB0aGVuCiAgICBlbmFibGVfdmlzaWJpbGl0eT1ubwogIGZpCmZpCgpHTElCQ1hYX0NPTkRJVElPTkFMKEVOQUJMRV9WSVNJQklMSVRZLCB0ZXN0ICRlbmFibGVfdmlzaWJpbGl0eSA9IHllcykKQUNfTVNHX05PVElDRShbdmlzaWJpbGl0eSBzdXBwb3J0ZWQ6ICRlbmFibGVfdmlzaWJpbGl0eV0pCl0pCgoKZG5sCmRubCBBZGQgdmVyc2lvbiB0YWdzIHRvIHN5bWJvbHMgaW4gc2hhcmVkIGxpYnJhcnkgKG9yIG5vdCksIGFkZGl0aW9uYWxseQpkbmwgbWFya2luZyBvdGhlciBzeW1ib2xzIGFzIHByaXZhdGUvbG9jYWwgKG9yIG5vdCkuCmRubApkbmwgLS1lbmFibGUtc3ltdmVycz1zdHlsZSBhZGRzIGEgdmVyc2lvbiBzY3JpcHQgdG8gdGhlIGxpbmtlciBjYWxsIHdoZW4KZG5sICAgICAgIGNyZWF0aW5nIHRoZSBzaGFyZWQgbGlicmFyeS4gIFRoZSBjaG9pY2Ugb2YgdmVyc2lvbiBzY3JpcHQgaXMKZG5sICAgICAgIGNvbnRyb2xsZWQgYnkgJ3N0eWxlJy4KZG5sIC0tZGlzYWJsZS1zeW12ZXJzIGRvZXMgbm90LgpkbmwgICsgIFVzYWdlOiAgR0xJQkNYWF9FTkFCTEVfU1lNVkVSU1soREVGQVVMVCldCmRubCAgICAgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciAneWVzJyBvciAnbm8nLiAgUGFzc2luZyBgeWVzJyB0cmllcyB0bwpkbmwgICAgICAgY2hvb3NlIGEgZGVmYXVsdCBzdHlsZSBiYXNlZCBvbiBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzLiAgUGFzc2luZwpkbmwgICAgICAgJ25vJyBkaXNhYmxlcyB2ZXJzaW9uaW5nLgpkbmwKQUNfREVGVU4oW0dMSUJDWFhfRU5BQkxFX1NZTVZFUlNdLCBbCgpHTElCQ1hYX0VOQUJMRShzeW12ZXJzLCQxLFs9U1RZTEVdLAogIFtlbmFibGVzIHN5bWJvbCB2ZXJzaW9uaW5nIG9mIHRoZSBzaGFyZWQgbGlicmFyeV0sCiAgW3Blcm1pdCB5ZXN8bm98Z251fGdudS12ZXJzaW9uZWQtbmFtZXNwYWNlfGRhcndpbnxkYXJ3aW4tZXhwb3J0XSkKCiMgSWYgd2UgbmV2ZXIgd2VudCB0aHJvdWdoIHRoZSBHTElCQ1hYX0NIRUNLX0xJTktFUl9GRUFUVVJFUyBtYWNybywgdGhlbiB3ZQojIGRvbid0IGtub3cgZW5vdWdoIGFib3V0ICRMRCB0byBkbyB0cmlja3MuLi4KQUNfUkVRVUlSRShbR0xJQkNYWF9DSEVDS19MSU5LRVJfRkVBVFVSRVNdKQoKIyBUdXJuIGEgJ3llcycgaW50byBhIHN1aXRhYmxlIGRlZmF1bHQuCmlmIHRlc3QgeCRlbmFibGVfc3ltdmVycyA9IHh5ZXMgOyB0aGVuCiAgaWYgdGVzdCAkZW5hYmxlX3NoYXJlZCA9IG5vIHx8IHRlc3QgIngkTEQiID0geCB8fCB0ZXN0IHgkZ2NjX25vX2xpbmsgPSB4eWVzOyB0aGVuCiAgICBlbmFibGVfc3ltdmVycz1ubwogIGVsc2UKICAgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0geWVzIDsgdGhlbgogICAgICBjYXNlICR7dGFyZ2V0X29zfSBpbgogICAgICAgIGN5Z3dpbiogfCBwZSB8IG1pbmd3MzIqIHwgaHB1eCopCiAgICAgICAgICBlbmFibGVfc3ltdmVycz1ubyA7OwogICAgICAgICopCiAgICAgICAgICBlbmFibGVfc3ltdmVycz1nbnUgOzsKICAgICAgZXNhYwogICAgZWxzZQogICAgICBjYXNlICR7dGFyZ2V0X29zfSBpbgogICAgICAgIGRhcndpbiopCgkgIGVuYWJsZV9zeW12ZXJzPWRhcndpbiA7OwogICAgICAgICopCiAgICAgICAgICBlbmFibGVfc3ltdmVycz1ubyA7OwogICAgICBlc2FjCiAgICBmaQogIGZpCmZpCgojIENoZWNrIHRvIHNlZSBpZiAnZGFyd2luJyBvciAnZGFyd2luLWV4cG9ydCcgY2FuIHdpbi4KaWYgdGVzdCB4JGVuYWJsZV9zeW12ZXJzID0geGRhcndpbi1leHBvcnQgOyB0aGVuCiAgICBlbmFibGVfc3ltdmVycz1kYXJ3aW4KZmkKCiMgQ2hlY2sgdG8gc2VlIGlmICdnbnUnIGNhbiB3aW4uCmlmIHRlc3QgJGVuYWJsZV9zeW12ZXJzID0gZ251IHx8IHRlc3QgJGVuYWJsZV9zeW12ZXJzID0gZ251LXZlcnNpb25lZC1uYW1lc3BhY2U7IHRoZW4KICAjIENoZWNrIHRvIHNlZSBpZiBsaWJnY2NfcyBleGlzdHMsIGluZGljYXRpbmcgdGhhdCBzaGFyZWQgbGliZ2NjIGlzIHBvc3NpYmxlLgogIEFDX01TR19DSEVDS0lORyhbZm9yIHNoYXJlZCBsaWJnY2NdKQogIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgogIENGTEFHUz0nIC1sZ2NjX3MnCiAgQUNfVFJZX0xJTksoLCBbcmV0dXJuIDA7XSwgZ2xpYmN4eF9zaGFyZWRfbGliZ2NjPXllcywgZ2xpYmN4eF9zaGFyZWRfbGliZ2NjPW5vKQogIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgogIGlmIHRlc3QgJGdsaWJjeHhfc2hhcmVkX2xpYmdjYyA9IG5vOyB0aGVuCiAgICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCmludCBtYWluICh2b2lkKSB7IHJldHVybiAwOyB9CkVPRgpjaGFuZ2VxdW90ZSgsKWRubAogICAgZ2xpYmN4eF9saWJnY2Nfc19zdWZmaXg9YCR7Q0MtY2N9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIFwKCQkJICAgICAtc2hhcmVkIC1zaGFyZWQtbGliZ2NjIC1vIGNvbmZ0ZXN0LnNvIFwKCQkJICAgICBjb25mdGVzdC5jIC12IDI+JjEgPi9kZXYvbnVsbCBcCgkJCSAgICAgfCBzZWQgLW4gJ3MvXi4qIC1sZ2NjX3NcKFteIF0qXCkgLiokL1wxL3AnYApjaGFuZ2VxdW90ZShbLF0pZG5sCiAgICBybSAtZiBjb25mdGVzdC5jIGNvbmZ0ZXN0LnNvCiAgICBpZiB0ZXN0IHgke2dsaWJjeHhfbGliZ2NjX3Nfc3VmZml4K3NldH0gPSB4c2V0OyB0aGVuCiAgICAgIENGTEFHUz0iIC1sZ2NjX3MkZ2xpYmN4eF9saWJnY2Nfc19zdWZmaXgiCiAgICAgIEFDX1RSWV9MSU5LKCwgW3JldHVybiAwO10sIGdsaWJjeHhfc2hhcmVkX2xpYmdjYz15ZXMpCiAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgogICAgZmkKICBmaQogIEFDX01TR19SRVNVTFQoJGdsaWJjeHhfc2hhcmVkX2xpYmdjYykKCiAgIyBGb3IgR05VIGxkLCB3ZSBuZWVkIGF0IGxlYXN0IHRoaXMgdmVyc2lvbi4gIFRoZSBmb3JtYXQgaXMgZGVzY3JpYmVkIGluCiAgIyBHTElCQ1hYX0NIRUNLX0xJTktFUl9GRUFUVVJFUyBhYm92ZS4KICBnbGliY3h4X21pbl9nbnVfbGRfdmVyc2lvbj0yMTQwMAoKICAjIElmIG5vIHNoYXJlZCBsaWJnY2MsIGNhbid0IHdpbi4KICBpZiB0ZXN0ICRnbGliY3h4X3NoYXJlZF9saWJnY2MgIT0geWVzOyB0aGVuCiAgICAgIEFDX01TR19XQVJOKFs9PT0gWW91IGhhdmUgcmVxdWVzdGVkIEdOVSBzeW1ib2wgdmVyc2lvbmluZywgYnV0XSkKICAgICAgQUNfTVNHX1dBUk4oWz09PSB5b3UgYXJlIG5vdCBidWlsZGluZyBhIHNoYXJlZCBsaWJnY2Nfcy5dKQogICAgICBBQ19NU0dfV0FSTihbPT09IFN5bWJvbCB2ZXJzaW9uaW5nIHdpbGwgYmUgZGlzYWJsZWQuXSkKICAgICAgZW5hYmxlX3N5bXZlcnM9bm8KICBlbGlmIHRlc3QgJHdpdGhfZ251X2xkICE9IHllcyA7IHRoZW4KICAgICMganVzdCBmYWlsIGZvciBub3cKICAgIEFDX01TR19XQVJOKFs9PT0gWW91IGhhdmUgcmVxdWVzdGVkIEdOVSBzeW1ib2wgdmVyc2lvbmluZywgYnV0XSkKICAgIEFDX01TR19XQVJOKFs9PT0geW91IGFyZSBub3QgdXNpbmcgdGhlIEdOVSBsaW5rZXIuXSkKICAgIEFDX01TR19XQVJOKFs9PT0gU3ltYm9sIHZlcnNpb25pbmcgd2lsbCBiZSBkaXNhYmxlZC5dKQogICAgZW5hYmxlX3N5bXZlcnM9bm8KICBlbGlmIHRlc3QgJGdsaWJjeHhfbGRfaXNfZ29sZCA9IHllcyA7IHRoZW4KICAgIDogQWxsIHZlcnNpb25zIG9mIGdvbGQgc3VwcG9ydCBzeW1ib2wgdmVyc2lvbmluZy4KICBlbGlmIHRlc3QgJGdsaWJjeHhfZ251X2xkX3ZlcnNpb24gLWx0ICRnbGliY3h4X21pbl9nbnVfbGRfdmVyc2lvbiA7IHRoZW4KICAgICMgVGhlIHJpZ2h0IHRvb2xzLCB0aGUgcmlnaHQgc2V0dXAsIGJ1dCB0b28gb2xkLiAgRmFsbGJhY2tzPwogICAgQUNfTVNHX1dBUk4oPT09IExpbmtlciB2ZXJzaW9uICRnbGliY3h4X2dudV9sZF92ZXJzaW9uIGlzIHRvbyBvbGQgZm9yKQogICAgQUNfTVNHX1dBUk4oPT09IGZ1bGwgc3ltYm9sIHZlcnNpb25pbmcgc3VwcG9ydCBpbiB0aGlzIHJlbGVhc2Ugb2YgR0NDLikKICAgIEFDX01TR19XQVJOKD09PSBZb3Ugd291bGQgbmVlZCB0byB1cGdyYWRlIHlvdXIgYmludXRpbHMgdG8gdmVyc2lvbikKICAgIEFDX01TR19XQVJOKD09PSAkZ2xpYmN4eF9taW5fZ251X2xkX3ZlcnNpb24gb3IgbGF0ZXIgYW5kIHJlYnVpbGQgR0NDLikKICAgIEFDX01TR19XQVJOKFs9PT0gU3ltYm9sIHZlcnNpb25pbmcgd2lsbCBiZSBkaXNhYmxlZC5dKQogICAgZW5hYmxlX3N5bXZlcnM9bm8KICBmaQpmaQoKIyBFdmVyeXRoaW5nIHBhcnNlZDsgZmlndXJlIG91dCB3aGF0IGZpbGUgdG8gdXNlLgpjYXNlICRlbmFibGVfc3ltdmVycyBpbgogIG5vKQogICAgU1lNVkVSX0ZJTEU9Y29uZmlnL2FiaS9wcmUvbm9uZS52ZXIKICAgIDs7CiAgZ251KQogICAgU1lNVkVSX0ZJTEU9Y29uZmlnL2FiaS9wcmUvZ251LnZlcgogICAgQUNfREVGSU5FKF9HTElCQ1hYX1NZTVZFUl9HTlUsIDEsIAogICAgICAgICAgICAgIFtEZWZpbmUgdG8gdXNlIEdOVSB2ZXJzaW9uaW5nIGluIHRoZSBzaGFyZWQgbGlicmFyeS5dKQogICAgOzsKICBnbnUtdmVyc2lvbmVkLW5hbWVzcGFjZSkKICAgIFNZTVZFUl9GSUxFPWNvbmZpZy9hYmkvcHJlL2dudS12ZXJzaW9uZWQtbmFtZXNwYWNlLnZlcgogICAgQUNfREVGSU5FKF9HTElCQ1hYX1NZTVZFUl9HTlVfTkFNRVNQQUNFLCAxLCAKICAgICAgICAgICAgICBbRGVmaW5lIHRvIHVzZSBHTlUgbmFtZXNwYWNlIHZlcnNpb25pbmcgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5Ll0pCiAgICA7OwogIGRhcndpbikKICAgIFNZTVZFUl9GSUxFPWNvbmZpZy9hYmkvcHJlL2dudS52ZXIKICAgIEFDX0RFRklORShfR0xJQkNYWF9TWU1WRVJfREFSV0lOLCAxLCAKICAgICAgICAgICAgICBbRGVmaW5lIHRvIHVzZSBkYXJ3aW4gdmVyc2lvbmluZyBpbiB0aGUgc2hhcmVkIGxpYnJhcnkuXSkKICAgIDs7CmVzYWMKCmlmIHRlc3QgeCRlbmFibGVfc3ltdmVycyAhPSB4bm8gOyB0aGVuCiAgQUNfREVGSU5FKF9HTElCQ1hYX1NZTVZFUiwgMSwKCSBbRGVmaW5lIHRvIHVzZSBzeW1ib2wgdmVyc2lvbmluZyBpbiB0aGUgc2hhcmVkIGxpYnJhcnkuXSkKZmkKCkFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSB0YXJnZXQgc3VwcG9ydHMgLnN5bXZlciBkaXJlY3RpdmVdLAoJICAgICAgIGdsaWJjeHhfY3ZfaGF2ZV9hc19zeW12ZXJfZGlyZWN0aXZlLCBbCiAgQUNfVFJZX0NPTVBJTEUoW3ZvaWQgZm9vICh2b2lkKTsgX19hc20gKCIuc3ltdmVyIGZvbywgYmFyQFNZTVZFUiIpO10sCgkJIFtdLCBnbGliY3h4X2N2X2hhdmVfYXNfc3ltdmVyX2RpcmVjdGl2ZT15ZXMsCgkJIGdsaWJjeHhfY3ZfaGF2ZV9hc19zeW12ZXJfZGlyZWN0aXZlPW5vKV0pCmlmIHRlc3QgJGdsaWJjeHhfY3ZfaGF2ZV9hc19zeW12ZXJfZGlyZWN0aXZlID0geWVzOyB0aGVuCiAgQUNfREVGSU5FKEhBVkVfQVNfU1lNVkVSX0RJUkVDVElWRSwgMSwKICAgIFtEZWZpbmUgdG8gMSBpZiB0aGUgdGFyZ2V0IGFzc2VtYmxlciBzdXBwb3J0cyAuc3ltdmVyIGRpcmVjdGl2ZS5dKQpmaQoKQUNfU1VCU1QoU1lNVkVSX0ZJTEUpCkFDX1NVQlNUKHBvcnRfc3BlY2lmaWNfc3ltYm9sX2ZpbGVzKQpHTElCQ1hYX0NPTkRJVElPTkFMKEVOQUJMRV9TWU1WRVJTLCB0ZXN0ICRlbmFibGVfc3ltdmVycyAhPSBubykKR0xJQkNYWF9DT05ESVRJT05BTChFTkFCTEVfU1lNVkVSU19HTlUsIHRlc3QgJGVuYWJsZV9zeW12ZXJzID0gZ251KQpHTElCQ1hYX0NPTkRJVElPTkFMKEVOQUJMRV9TWU1WRVJTX0dOVV9OQU1FU1BBQ0UsIHRlc3QgJGVuYWJsZV9zeW12ZXJzID0gZ251LXZlcnNpb25lZC1uYW1lc3BhY2UpCkdMSUJDWFhfQ09ORElUSU9OQUwoRU5BQkxFX1NZTVZFUlNfREFSV0lOLCB0ZXN0ICRlbmFibGVfc3ltdmVycyA9IGRhcndpbikKQUNfTVNHX05PVElDRSh2ZXJzaW9uaW5nIG9uIHNoYXJlZCBsaWJyYXJ5IHN5bWJvbHMgaXMgJGVuYWJsZV9zeW12ZXJzKQoKIyBOb3csIHNldCB1cCBjb21wYXRpYmlsaXR5IHN1cHBvcnQsIGlmIGFueS4KIyBJbiBhZGRpdGlvbiwgbmVlZCB0aGlzIHRvIGRlYWwgd2l0aCBzdGQ6OnNpemVfdCBtYW5nbGluZyBpbgojIHNyYy9jb21wYXRpYmlsaXR5LmNjLiAgSW4gYSBwZXJmZWN0IHdvcmxkLCBjb3VsZCB1c2UKIyB0eXBlaWQoc3RkOjpzaXplX3QpLm5hbWUoKVswXSB0byBkbyBkaXJlY3Qgc3Vic3RpdHV0aW9uLgpBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzaXplX3QgYXMgdW5zaWduZWQgaW50XSkKYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCkNGTEFHUz0iLVdlcnJvciIKQUNfVFJZX0NPTVBJTEUoLCBbX19TSVpFX1RZUEVfXyogc3RwOyB1bnNpZ25lZCBpbnQqIHVpcDsgc3RwID0gdWlwO10sIAoJICAgICAgICAgW2dsaWJjeHhfc2l6ZV90X2lzX2k9eWVzXSwgW2dsaWJjeHhfc2l6ZV90X2lzX2k9bm9dKQpDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCmlmIHRlc3QgIiRnbGliY3h4X3NpemVfdF9pc19pIiA9IHllczsgdGhlbgogIEFDX0RFRklORShfR0xJQkNYWF9TSVpFX1RfSVNfVUlOVCwgMSwgW0RlZmluZSBpZiBzaXplX3QgaXMgdW5zaWduZWQgaW50Ll0pCmZpCkFDX01TR19SRVNVTFQoWyRnbGliY3h4X3NpemVfdF9pc19pXSkKCkFDX01TR19DSEVDS0lORyhbZm9yIHB0cmRpZmZfdCBhcyBpbnRdKQphY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKQ0ZMQUdTPSItV2Vycm9yIgpBQ19UUllfQ09NUElMRSgsIFtfX1BUUkRJRkZfVFlQRV9fKiBwdHA7IGludCogaXA7IHB0cCA9IGlwO10sIAoJICAgICAgICAgW2dsaWJjeHhfcHRyZGlmZl90X2lzX2k9eWVzXSwgW2dsaWJjeHhfcHRyZGlmZl90X2lzX2k9bm9dKQpDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCmlmIHRlc3QgIiRnbGliY3h4X3B0cmRpZmZfdF9pc19pIiA9IHllczsgdGhlbgogIEFDX0RFRklORShfR0xJQkNYWF9QVFJESUZGX1RfSVNfSU5ULCAxLCBbRGVmaW5lIGlmIHB0cmRpZmZfdCBpcyBpbnQuXSkKZmkKQUNfTVNHX1JFU1VMVChbJGdsaWJjeHhfcHRyZGlmZl90X2lzX2ldKQpdKQoKCmRubApkbmwgU2V0dXAgdG8gdXNlIHRoZSBnY2MgZ3Roci5oIHRocmVhZC1zcGVjaWZpYyBtZW1vcnkgYW5kIG11dGV4IG1vZGVsLgpkbmwgV2UgbXVzdCBzdGFnZSB0aGUgcmVxdWlyZWQgaGVhZGVycyBzbyB0aGF0IHRoZXkgd2lsbCBiZSBpbnN0YWxsZWQKZG5sIHdpdGggdGhlIGxpYnJhcnkgKHVubGlrZSBsaWJnY2MsIHRoZSBTVEwgaW1wbGVtZW50YXRpb24gaXMgcHJvdmlkZWQKZG5sIHNvbGVseSB3aXRoaW4gaGVhZGVycykuICBTaW5jZSB3ZSBtdXN0IG5vdCBpbmplY3QgcmFuZG9tIHVzZXItc3BhY2UKZG5sIG1hY3JvIG5hbWVzIGludG8gdXNlci1wcm92aWRlZCBDKysgY29kZSwgd2UgZmlyc3Qgc3RhZ2UgaW50byA8ZmlsZT4taW4KZG5sIGFuZCBwcm9jZXNzIHRvIDxmaWxlPiB3aXRoIGFuIG91dHB1dCBjb21tYW5kLiAgVGhlIHJlYXNvbiBmb3IgYSB0d28tCmRubCBzdGFnZSBwcm9jZXNzIGhlcmUgaXMgdG8gY29ycmVjdGx5IGhhbmRsZSAkc3JjZGlyIT0kb2JqZGlyIHdpdGhvdXQKZG5sIGhhdmluZyB0byB3cml0ZSBjb21wbGV4IGNvZGUgKHRoZSBzZWQgY29tbWFuZHMgdG8gY2xlYW4gdGhlIG1hY3JvCmRubCBuYW1lc3BhY2UgYXJlIGNvbXBsZXggYW5kIGZyYWdpbGUgZW5vdWdoIGFzIGl0IGlzKS4gIFdlIG11c3QgYWxzbwpkbmwgYWRkIGEgcmVsYXRpdmUgcGF0aCBzbyB0aGF0IC1JLSBpcyBzdXBwb3J0ZWQgcHJvcGVybHkuCmRubApkbmwgU3Vic3RzOgpkbmwgIGdsaWJjeHhfdGhyZWFkX2gKZG5sCmRubCBEZWZpbmVzOgpkbmwgIEhBVkVfR1RIUl9ERUZBVUxUCmRubApBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfVEhSRUFEU10sIFsKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciB0aHJlYWQgbW9kZWwgdXNlZCBieSBHQ0NdKQogIHRhcmdldF90aHJlYWRfZmlsZT1gJENYWCAtdiAyPiYxIHwgc2VkIC1uICdzL15UaHJlYWQgbW9kZWw6IC8vcCdgCiAgQUNfTVNHX1JFU1VMVChbJHRhcmdldF90aHJlYWRfZmlsZV0pCgogIGlmIHRlc3QgJHRhcmdldF90aHJlYWRfZmlsZSAhPSBzaW5nbGU7IHRoZW4KICAgIEFDX0RFRklORShIQVZFX0dUSFJfREVGQVVMVCwgMSwKICAgICAgICAgICAgICBbRGVmaW5lIGlmIGd0aHItZGVmYXVsdC5oIGV4aXN0cyAKICAgICAgICAgICAgICAobWVhbmluZyB0aGF0IHRocmVhZGluZyBzdXBwb3J0IGlzIGVuYWJsZWQpLl0pCiAgZmkKCiAgZ2xpYmN4eF90aHJlYWRfaD1ndGhyLSR0YXJnZXRfdGhyZWFkX2ZpbGUuaAoKICBkbmwgQ2hlY2sgZm9yIF9fR1RIUkVBRFMgZGVmaW5lLgogIGd0aHJlYWRfZmlsZT0ke3RvcGxldmVsX3NyY2Rpcn0vZ2NjLyR7Z2xpYmN4eF90aHJlYWRfaH0KICBpZiBncmVwIF9fR1RIUkVBRFMgJGd0aHJlYWRfZmlsZSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCiAgICBlbmFibGVfdGhyZWFkPXllcwogIGVsc2UKICAgZW5hYmxlX3RocmVhZD1ubwogIGZpCgogIEFDX1NVQlNUKGdsaWJjeHhfdGhyZWFkX2gpCl0pCgoKZG5sCmRubCBDaGVjayBpZiBndGhyZWFkIGltcGxlbWVudGF0aW9uIGRlZmluZXMgdGhlIHR5cGVzIGFuZCBmdW5jdGlvbnMKZG5sIHJlcXVpcmVkIGJ5IHRoZSBjKysweCB0aHJlYWQgbGlicmFyeS4gIENvbmZvcm1pbmcgZ3RocmVhZApkbmwgaW1wbGVtZW50YXRpb25zIGNhbiBkZWZpbmUgX19HVEhSRUFEU19DWFgwWCB0byBlbmFibGUgdXNlIHdpdGggYysrMHguCmRubApBQ19ERUZVTihbR0xJQkNYWF9DSEVDS19HVEhSRUFEU10sIFsKICBBQ19MQU5HX1NBVkUKICBBQ19MQU5HX0NQTFVTUExVUwoKICBhY19zYXZlX0NYWEZMQUdTPSIkQ1hYRkxBR1MiCiAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAtZm5vLWV4Y2VwdGlvbnMgLUkke3RvcGxldmVsX3NyY2Rpcn0vZ2NjIgoKICB0YXJnZXRfdGhyZWFkX2ZpbGU9YCRDWFggLXYgMj4mMSB8IHNlZCAtbiAncy9eVGhyZWFkIG1vZGVsOiAvL3AnYAogIGNhc2UgJHRhcmdldF90aHJlYWRfZmlsZSBpbgogICAgcG9zaXgpCiAgICAgIENYWEZMQUdTPSIkQ1hYRkxBR1MgLURTVVBQT1JUU19XRUFLIC1ER1RIUkVBRF9VU0VfV0VBSyAtRF9QVEhSRUFEUyIKICBlc2FjCgogIEFDX01TR19DSEVDS0lORyhbZm9yIGd0aHJlYWRzIGxpYnJhcnldKQoKICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgImd0aHIuaCJdLAogICAgWwogICAgICAjaWZuZGVmIF9fR1RIUkVBRFNfQ1hYMFgKICAgICAgI2Vycm9yCiAgICAgICNlbmRpZgoKICAgICAgLy8gSW4gY2FzZSBvZiBQT1NJWCB0aHJlYWRzIGNoZWNrIF9QT1NJWF9USU1FT1VUUyB0b28uCiAgICAgICNpZiAoZGVmaW5lZChfUFRIUkVBRFMpIFwKICAgICAgICAgICAmJiAoIWRlZmluZWQoX1BPU0lYX1RJTUVPVVRTKSB8fCBfUE9TSVhfVElNRU9VVFMgPD0gMCkpCiAgICAgICNlcnJvcgogICAgICAjZW5kaWYKICAgIF0sIFthY19oYXNfZ3RocmVhZHM9eWVzXSwgW2FjX2hhc19ndGhyZWFkcz1ub10pCgogIEFDX01TR19SRVNVTFQoWyRhY19oYXNfZ3RocmVhZHNdKQoKICBpZiB0ZXN0IHgiJGFjX2hhc19ndGhyZWFkcyIgPSB4InllcyI7IHRoZW4KICAgIEFDX0RFRklORShfR0xJQkNYWF9IQVNfR1RIUkVBRFMsIDEsCiAgICAgICAgICAgICAgW0RlZmluZSBpZiBndGhyZWFkcyBsaWJyYXJ5IGlzIGF2YWlsYWJsZS5dKQogIGZpCgogIENYWEZMQUdTPSIkYWNfc2F2ZV9DWFhGTEFHUyIKICBBQ19MQU5HX1JFU1RPUkUKXSkKCgojIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCiMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCiMKIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCiMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCiMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgpBQ19ERUZVTihbQUNfTENfTUVTU0FHRVNdLCBbCiAgQUNfQ0hFQ0tfSEVBREVSKGxvY2FsZS5oLCBbCiAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIExDX01FU1NBR0VTXSwgYWNfY3ZfdmFsX0xDX01FU1NBR0VTLAogICAgICBbQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxsb2NhbGUuaD5dLCBbcmV0dXJuIExDX01FU1NBR0VTXSwKICAgICAgIGFjX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMsIGFjX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubyldKQogICAgaWYgdGVzdCAkYWNfY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCiAgICAgIEFDX0RFRklORShIQVZFX0xDX01FU1NBR0VTLCAxLCAKICAgICAgICAgICAgICAgIFtEZWZpbmUgaWYgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uXSkKICAgIGZpCiAgXSkKXSkKCiMgTWFjcm9zIGZyb20gdGhlIHRvcC1sZXZlbCBnY2MgZGlyZWN0b3J5LgptNF9pbmNsdWRlKFsuLi9jb25maWcvdGxzLm00XSkKCg==