ZG5sICRJZCQKZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCgpBQ19QUkVSRVEoMi41NykKCmRubCBXZSBkb24ndCBrbm93IHRoZSB2ZXJzaW9uIG51bWJlciAic3RhdGljbHkiIHNvIHdlIHVzZSBhIGRhc2ggaGVyZQpBQ19JTklUKGN1cmwsIFstXSwgW2Egc3VpdGFibGUgY3VybCBtYWlsaW5nIGxpc3QgPT4gaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL10pCgpkbmwgY29uZmlndXJlIHNjcmlwdCBjb3B5cmlnaHQKQUNfQ09QWVJJR0hUKFtDb3B5cmlnaHQgKGMpIDE5OTggLSAyMDA1IERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPgpUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQgYW5kIG1vZGlmaWVkIHVuZGVyIHRoZSAKdGVybXMgb2YgdGhlIGN1cmwgbGljZW5zZTsgc2VlIENPUFlJTkcgZm9yIG1vcmUgZGV0YWlsc10pCgpBQ19DT05GSUdfU1JDRElSKFtsaWIvdXJsZGF0YS5oXSkKQU1fQ09ORklHX0hFQURFUihsaWIvY29uZmlnLmggc3JjL2NvbmZpZy5oKQpBTV9NQUlOVEFJTkVSX01PREUKCmRubCBTRUQgaXMgbmVlZGVkIGJ5IHNvbWUgb2YgdGhlIHRvb2xzCkFDX1BBVEhfUFJPRyggU0VELCBzZWQsIHNlZC13YXMtbm90LWZvdW5kLWJ5LWNvbmZpZ3VyZSwKICAgICAgICAgICAgICAkUEFUSDovdXNyL2JpbjovdXNyL2xvY2FsL2JpbikKQUNfU1VCU1QoU0VEKQoKaWYgdGVzdCAieCRTRUQiID0gInhzZWQtd2FzLW5vdC1mb3VuZC1ieS1jb25maWd1cmUiOyB0aGVuCiAgQUNfTVNHX1dBUk4oW3NlZCB3YXMgbm90IGZvdW5kLCB0aGlzIG1heSBydWluIHlvdXIgY2hhbmNlcyB0byBidWlsZCBmaW5lXSkKZmkKCmRubCBBUiBpcyB1c2VkIGJ5IGxpYnRvb2wsIGFuZCB0cnkgdGhlIG9kZCBTb2xhcmlzIHBhdGggdG9vCmRubCB3ZSB1c2UgQUNfQ0hFQ0tfVE9PTCBzaW5jZSB0aGlzIHNob3VsZCBtYWtlIGEgbGlicmFyeSBmb3IgdGhlIHRhcmdldApkbmwgcGxhdGZvcm0KQUNfQ0hFQ0tfVE9PTChBUiwgYXIsCiAgICAgICAgICAgICAgYXItd2FzLW5vdC1mb3VuZC1ieS1jb25maWd1cmUsCiAgICAgICAgICAgICAgJFBBVEg6L3Vzci9iaW46L3Vzci9sb2NhbC9iaW46L3Vzci9jY3MvYmluKQpBQ19TVUJTVChBUikKaWYgdGVzdCAieCRBUiIgPSAieGFyLXdhcy1ub3QtZm91bmQtYnktY29uZmlndXJlIjsgdGhlbgogIEFDX01TR19XQVJOKFthciB3YXMgbm90IGZvdW5kLCB0aGlzIG1heSBydWluIHlvdXIgY2hhbmNlcyB0byBidWlsZCBmaW5lXSkKZmkKCmRubCBmaWd1cmUgb3V0IHRoZSBsaWJjdXJsIHZlcnNpb24KVkVSU0lPTj1gJFNFRCAtbmUgJ3MvXiNkZWZpbmUgTElCQ1VSTF9WRVJTSU9OICJcKC4qXCkiL1wxL3AnICR7c3JjZGlyfS9pbmNsdWRlL2N1cmwvY3VybHZlci5oYApBTV9JTklUX0FVVE9NQUtFKGN1cmwsJFZFUlNJT04pCkFDX01TR19DSEVDS0lORyhbY3VybCB2ZXJzaW9uXSkKQUNfTVNHX1JFU1VMVCgkVkVSU0lPTikKCmRubApkbmwgd2UgZXh0cmFjdCB0aGUgbnVtZXJpY2FsIHZlcnNpb24gZm9yIGN1cmwtY29uZmlnIG9ubHkKVkVSU0lPTk5VTT1gJFNFRCAtbmUgJ3MvXiNkZWZpbmUgTElCQ1VSTF9WRVJTSU9OX05VTSAweFwoLipcKS9cMS9wJyAke3NyY2Rpcn0vaW5jbHVkZS9jdXJsL2N1cmx2ZXIuaGAKQUNfU1VCU1QoVkVSU0lPTk5VTSkKCmRubCBTb2xhcmlzIHBrZ2FkZCBzdXBwb3J0IGRlZmluaXRpb25zClBLR0FERF9QS0c9IkhBWFhjdXJsIgpQS0dBRERfTkFNRT0iY1VSTCAtIGEgY2xpZW50IHRoYXQgZ3Jva3MgVVJMcyIKUEtHQUREX1ZFTkRPUj0iY3VybC5oYXh4LnNlIgpBQ19TVUJTVChQS0dBRERfUEtHKQpBQ19TVUJTVChQS0dBRERfTkFNRSkKQUNfU1VCU1QoUEtHQUREX1ZFTkRPUikKCmRubApkbmwgaW5pdGlhbGl6ZSBhbGwgdGhlIGluZm8gdmFyaWFibGVzCiAgICBjdXJsX3NzbF9tc2c9Im5vICAgICAgKC0td2l0aC1zc2wgLyAtLXdpdGgtZ251dGxzKSIKICAgY3VybF96bGliX21zZz0ibm8gICAgICAoLS13aXRoLXpsaWIpIgogICBjdXJsX2tyYjRfbXNnPSJubyAgICAgICgtLXdpdGgta3JiNCopIgogICAgY3VybF9nc3NfbXNnPSJubyAgICAgICgtLXdpdGgtZ3NzYXBpKSIKIGN1cmxfc3BuZWdvX21zZz0ibm8gICAgICAoLS13aXRoLXNwbmVnbykiCiAgIGN1cmxfYXJlc19tc2c9Im5vICAgICAgKC0tZW5hYmxlLWFyZXMpIgogICBjdXJsX2lwdjZfbXNnPSJubyAgICAgICgtLWVuYWJsZS1pcHY2KSIKICAgIGN1cmxfaWRuX21zZz0ibm8gICAgICAoLS13aXRoLWxpYmlkbikiCiBjdXJsX21hbnVhbF9tc2c9Im5vICAgICAgKC0tZW5hYmxlLW1hbnVhbCkiCmN1cmxfdmVyYm9zZV9tc2c9ImVuYWJsZWQgKC0tZGlzYWJsZS12ZXJib3NlKSIKICAgY3VybF9zc3BpX21zZz0ibm8gICAgICAoLS1lbmFibGUtc3NwaSkiCgpkbmwKZG5sIERldGVjdCB0aGUgY2Fub25pY2FsIGhvc3QgYW5kIHRhcmdldCBidWlsZCBlbnZpcm9ubWVudApkbmwKCkFDX0NBTk9OSUNBTF9IT1NUCmRubCBHZXQgc3lzdGVtIGNhbm9uaWNhbCBuYW1lCkFDX0RFRklORV9VTlFVT1RFRChPUywgIiR7aG9zdH0iLCBbY3B1LW1hY2hpbmUtT1NdKQoKZG5sIENoZWNrIGZvciBBSVggd2VpcmRvcwpBQ19BSVgKCmRubCBDaGVja3MgZm9yIHByb2dyYW1zLgpBQ19QUk9HX0NDCgpkbmwgY2hlY2sgZm9yIGhvdyB0byBkbyBsYXJnZSBmaWxlcwpBQ19TWVNfTEFSR0VGSUxFCgpkbmwgY2hlY2sgZm9yIGN5Z3dpbiBzdHVmZgpBQ19MSUJUT09MX1dJTjMyX0RMTAoKZG5sIGxpYnRvb2wgc2V0dXAKQUNfUFJPR19MSUJUT09MCgpBQ19NU0dfQ0hFQ0tJTkcoW2lmIHdlIG5lZWQgLW5vLXVuZGVmaW5lZF0pCmNhc2UgJGhvc3QgaW4KICAqLSotY3lnd2luIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKikKICAgIG5lZWRfbm9fdW5kZWZpbmVkPXllcwogICAgOzsKICAqKQogICAgbmVlZF9ub191bmRlZmluZWQ9bm8KICAgIDs7CmVzYWMKQUNfTVNHX1JFU1VMVCgkbmVlZF9ub191bmRlZmluZWQpCkFNX0NPTkRJVElPTkFMKE5PX1VOREVGSU5FRCwgdGVzdCB4JG5lZWRfbm9fdW5kZWZpbmVkID0geHllcykKCkFDX01TR19DSEVDS0lORyhbaWYgd2UgbmVlZCAtbWltcHVyZS10ZXh0XSkKbWltcHVyZT1ubwpjYXNlICRob3N0IGluCiAgKi0qLXNvbGFyaXMyKikKICAgIGlmIHRlc3QgIiRHQ0MiID0gInllcyI7IHRoZW4KICAgICAgbWltcHVyZT0ieWVzIgogICAgZmkKICAgIDs7CiAgKikKICAgIDs7CmVzYWMKQUNfTVNHX1JFU1VMVCgkbWltcHVyZSkKQU1fQ09ORElUSU9OQUwoTUlNUFVSRSwgdGVzdCB4JG1pbXB1cmUgPSB4eWVzKQoKQUNfTVNHX0NIRUNLSU5HKFtpZiB3ZSBuZWVkIEJVSUxESU5HX0xJQkNVUkxdKQpjYXNlICRob3N0IGluCiAgKi0qLW1pbmd3KikKICAgIEFDX0RFRklORShCVUlMRElOR19MSUJDVVJMLCAxLCBbd2hlbiBidWlsZGluZyBsaWJjdXJsIGl0c2VsZl0pCiAgICBBQ19NU0dfUkVTVUxUKHllcykKIKAgoEFDX01TR19DSEVDS0lORyhbaWYgd2UgbmVlZCBDVVJMX1NUQVRJQ0xJQl0pCiAgICBpZiB0ZXN0ICJYJGVuYWJsZV9zaGFyZWQiID0gIlhubyIKICAgIHRoZW4KICAgICAgQUNfREVGSU5FKENVUkxfU1RBVElDTElCLCAxLCBbd2hlbiBub3QgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeV0pCiAgICAgIEFDX01TR19SRVNVTFQoeWVzKQogoCCgZWxzZQogoCCgIKBBQ19NU0dfUkVTVUxUKG5vKQogICAgZmkKICAgIDs7CiAgKikKICAgIEFDX01TR19SRVNVTFQobm8pCiAgICA7Owplc2FjCgpkbmwgVGhlIGluc3RhbGwgc3R1ZmYgaGFzIGFscmVhZHkgYmVlbiB0YWtlbiBjYXJlIG9mIGJ5IHRoZSBhdXRvbWFrZSBzdHVmZgpkbmwgQUNfUFJPR19JTlNUQUxMCkFDX1BST0dfTUFLRV9TRVQKCmRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZG5sIHN3aXRjaCBvZmYgcGFydGljdWxhciBwcm90b2NvbHMKZG5sCkFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBzdXBwb3J0IGh0dHBdKQpBQ19BUkdfRU5BQkxFKGh0dHAsCkFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1odHRwXSxbRW5hYmxlIEhUVFAgc3VwcG9ydF0pCkFDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtaHR0cF0sW0Rpc2FibGUgSFRUUCBzdXBwb3J0XSksClsgY2FzZSAiJGVuYWJsZXZhbCIgaW4KICBubykKICAgICAgIEFDX01TR19SRVNVTFQobm8pCiAgICAgICBBQ19ERUZJTkUoQ1VSTF9ESVNBQkxFX0hUVFAsIDEsIFt0byBkaXNhYmxlIEhUVFBdKQogICAgICAgQUNfTVNHX1dBUk4oW2Rpc2FibGUgSFRUUCBkaXNhYmxlcyBGVFAgb3ZlciBwcm94eSBhbmQgR09QSEVSIHRvb10pCiAgICAgICBBQ19ERUZJTkUoQ1VSTF9ESVNBQkxFX0dPUEhFUiwgMSwgW3RvIGRpc2FibGUgR09QSEVSXSkKICAgICAgIEFDX1NVQlNUKENVUkxfRElTQUJMRV9IVFRQLCBbMV0pCiAgICAgICBBQ19TVUJTVChDVVJMX0RJU0FCTEVfR09QSEVSLCBbMV0pCiAgICAgICA7OwogICopICAgQUNfTVNHX1JFU1VMVCh5ZXMpCiAgICAgICA7OwogIGVzYWMgXSwKICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQopCkFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBzdXBwb3J0IGZ0cF0pCkFDX0FSR19FTkFCTEUoZnRwLApBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtZnRwXSxbRW5hYmxlIEZUUCBzdXBwb3J0XSkKQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1mdHBdLFtEaXNhYmxlIEZUUCBzdXBwb3J0XSksClsgY2FzZSAiJGVuYWJsZXZhbCIgaW4KICBubykKICAgICAgIEFDX01TR19SRVNVTFQobm8pCiAgICAgICBBQ19ERUZJTkUoQ1VSTF9ESVNBQkxFX0ZUUCwgMSwgW3RvIGRpc2FibGUgRlRQXSkKICAgICAgIEFDX1NVQlNUKENVUkxfRElTQUJMRV9GVFAsIFsxXSkKICAgICAgIDs7CiAgKikgICBBQ19NU0dfUkVTVUxUKHllcykKICAgICAgIDs7CiAgZXNhYyBdLAogICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCikKQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIHN1cHBvcnQgZ29waGVyXSkKQUNfQVJHX0VOQUJMRShnb3BoZXIsCkFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1nb3BoZXJdLFtFbmFibGUgR09QSEVSIHN1cHBvcnRdKQpBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWdvcGhlcl0sW0Rpc2FibGUgR09QSEVSIHN1cHBvcnRdKSwKWyBjYXNlICIkZW5hYmxldmFsIiBpbgogIG5vKQogICAgICAgQUNfTVNHX1JFU1VMVChubykKICAgICAgIEFDX0RFRklORShDVVJMX0RJU0FCTEVfR09QSEVSLCAxLCBbdG8gZGlzYWJsZSBHT1BIRVJdKQogICAgICAgQUNfU1VCU1QoQ1VSTF9ESVNBQkxFX0dPUEhFUiwgWzFdKQogICAgICAgOzsKICAqKSAgIEFDX01TR19SRVNVTFQoeWVzKQogICAgICAgOzsKICBlc2FjIF0sCiAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKKQpBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gc3VwcG9ydCBmaWxlXSkKQUNfQVJHX0VOQUJMRShmaWxlLApBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtZmlsZV0sW0VuYWJsZSBGSUxFIHN1cHBvcnRdKQpBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWZpbGVdLFtEaXNhYmxlIEZJTEUgc3VwcG9ydF0pLApbIGNhc2UgIiRlbmFibGV2YWwiIGluCiAgbm8pCiAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQogICAgICAgQUNfREVGSU5FKENVUkxfRElTQUJMRV9GSUxFLCAxLCBbdG8gZGlzYWJsZSBGSUxFXSkKICAgICAgIEFDX1NVQlNUKENVUkxfRElTQUJMRV9GSUxFLCBbMV0pCiAgICAgICA7OwogICopICAgQUNfTVNHX1JFU1VMVCh5ZXMpCiAgICAgICA7OwogIGVzYWMgXSwKICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQopCkFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBzdXBwb3J0IGxkYXBdKQpBQ19BUkdfRU5BQkxFKGxkYXAsCkFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1sZGFwXSxbRW5hYmxlIExEQVAgc3VwcG9ydF0pCkFDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtbGRhcF0sW0Rpc2FibGUgTERBUCBzdXBwb3J0XSksClsgY2FzZSAiJGVuYWJsZXZhbCIgaW4KICBubykKICAgICAgIEFDX01TR19SRVNVTFQobm8pCiAgICAgICBBQ19ERUZJTkUoQ1VSTF9ESVNBQkxFX0xEQVAsIDEsIFt0byBkaXNhYmxlIExEQVBdKQogICAgICAgQUNfU1VCU1QoQ1VSTF9ESVNBQkxFX0xEQVAsIFsxXSkKICAgICAgIDs7CiAgKikgICBBQ19NU0dfUkVTVUxUKHllcykKICAgICAgIDs7CiAgZXNhYyBdLAogICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCikKQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIHN1cHBvcnQgZGljdF0pCkFDX0FSR19FTkFCTEUoZGljdCwKQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWRpY3RdLFtFbmFibGUgRElDVCBzdXBwb3J0XSkKQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1kaWN0XSxbRGlzYWJsZSBESUNUIHN1cHBvcnRdKSwKWyBjYXNlICIkZW5hYmxldmFsIiBpbgogIG5vKQogICAgICAgQUNfTVNHX1JFU1VMVChubykKICAgICAgIEFDX0RFRklORShDVVJMX0RJU0FCTEVfRElDVCwgMSwgW3RvIGRpc2FibGUgRElDVF0pCiAgICAgICBBQ19TVUJTVChDVVJMX0RJU0FCTEVfRElDVCwgWzFdKQogICAgICAgOzsKICAqKSAgIEFDX01TR19SRVNVTFQoeWVzKQogICAgICAgOzsKICBlc2FjIF0sCiAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKKQpBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gc3VwcG9ydCB0ZWxuZXRdKQpBQ19BUkdfRU5BQkxFKHRlbG5ldCwKQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXRlbG5ldF0sW0VuYWJsZSBURUxORVQgc3VwcG9ydF0pCkFDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtdGVsbmV0XSxbRGlzYWJsZSBURUxORVQgc3VwcG9ydF0pLApbIGNhc2UgIiRlbmFibGV2YWwiIGluCiAgbm8pCiAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQogICAgICAgQUNfREVGSU5FKENVUkxfRElTQUJMRV9URUxORVQsIDEsIFt0byBkaXNhYmxlIFRFTE5FVF0pCiAgICAgICBBQ19TVUJTVChDVVJMX0RJU0FCTEVfVEVMTkVULCBbMV0pCiAgICAgICA7OwogICopICAgQUNfTVNHX1JFU1VMVCh5ZXMpCiAgICAgICA7OwogIGVzYWMgXSwKICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQopCgpkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkbmwgQ2hlY2sgZm9yIGJ1aWx0LWluIG1hbnVhbApkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIHByb3ZpZGUgYnVpbHQtaW4gbWFudWFsXSkKQUNfQVJHX0VOQUJMRShtYW51YWwsCkFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1tYW51YWxdLFtFbmFibGUgYnVpbHQtaW4gbWFudWFsXSkKQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1tYW51YWxdLFtEaXNhYmxlIGJ1aWx0LWluIG1hbnVhbF0pLApbIGNhc2UgIiRlbmFibGV2YWwiIGluCiAgbm8pCiAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQogICAgICAgOzsKICAqKSAgIEFDX01TR19SRVNVTFQoeWVzKQogICAgICAgVVNFX01BTlVBTD0iMSIKICAgICAgIDs7CiAgZXNhYyBdLAogICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCiAgICAgICBVU0VfTUFOVUFMPSIxIgopCmRubCBUaGUgYWN0dWFsIHVzZSBvZiB0aGUgVVNFX01BTlVBTCB2YXJpYWJsZSBpcyBkb25lIG11Y2ggbGF0ZXIgaW4gdGhpcwpkbmwgc2NyaXB0IHRvIGFsbG93IG90aGVyIGFjdGlvbnMgdG8gZGlzYWJsZSBpdCBhcyB3ZWxsLgoKCmRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRubCBDaGVja3MgZm9yIGxpYnJhcmllcy4KZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCmRubCBnZXRob3N0YnluYW1lIHdpdGhvdXQgbGliIG9yIGluIHRoZSBuc2wgbGliPwpBQ19DSEVDS19GVU5DKGdldGhvc3RieW5hbWUsCiAgICAgICAgICAgICAgW0hBVkVfR0VUSE9TVEJZTkFNRT0iMSIKICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgIFsgQUNfQ0hFQ0tfTElCKG5zbCwgZ2V0aG9zdGJ5bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSEFWRV9HRVRIT1NUQllOQU1FPSIxIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQlM9IiRMSUJTIC1sbnNsIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCiAgICAgICAgICAgICAgXSkKCmlmIHRlc3QgIiRIQVZFX0dFVEhPU1RCWU5BTUUiICE9ICIxIgp0aGVuCiAgZG5sIGdldGhvc3RieW5hbWUgaW4gdGhlIHNvY2tldCBsaWI/CiAgQUNfQ0hFQ0tfTElCKHNvY2tldCwgZ2V0aG9zdGJ5bmFtZSwKICAgICAgICAgICAgICAgW0hBVkVfR0VUSE9TVEJZTkFNRT0iMSIKICAgICAgICAgICAgICAgTElCUz0iJExJQlMgLWxzb2NrZXQiCiAgICAgICAgICAgICAgIF0pCmZpCgpkbmwgQXQgbGVhc3Qgb25lIHN5c3RlbSBoYXMgYmVlbiBpZGVudGlmaWVkIHRvIHJlcXVpcmUgQk9USCBuc2wgYW5kIHNvY2tldApkbmwgbGlicyBhdCB0aGUgc2FtZSB0aW1lIHRvIGxpbmsgcHJvcGVybHkuCmlmIHRlc3QgIiRIQVZFX0dFVEhPU1RCWU5BTUUiICE9ICIxIgp0aGVuCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgZ2V0aG9zdGJ5bmFtZSB3aXRoIGJvdGggbnNsIGFuZCBzb2NrZXQgbGlic10pCiAgbXlfYWNfc2F2ZV9MSUJTPSRMSUJTCiAgTElCUz0iLWxuc2wgLWxzb2NrZXQgJExJQlMiCiAgQUNfVFJZX0xJTksoICwKICAgICAgICAgICAgIFtnZXRob3N0YnluYW1lKCk7XSwKICAgICAgICAgICAgIFsgZG5sIGZvdW5kIGl0IQogICAgICAgICAgICAgSEFWRV9HRVRIT1NUQllOQU1FPSIxIgogICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSldLAogICAgICAgICAgICAgWyBkbmwgZmFpbGVkIQogICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQogICAgICAgICAgICAgZG5sIHJlc3RvcmUgTElCUwogICAgICAgICAgICAgTElCUz0kbXlfYWNfc2F2ZV9MSUJTXQogICAgICAgICAgICAgKQpmaQoKaWYgdGVzdCAiJEhBVkVfR0VUSE9TVEJZTkFNRSIgIT0gIjEiCnRoZW4KICBkbmwgVGhpcyBpcyBmb3IgTXN5cy9NaW5ndwogIEFDX01TR19DSEVDS0lORyhbZm9yIGdldGhvc3RieW5hbWUgaW4gd3MyXzMyXSkKICBteV9hY19zYXZlX0xJQlM9JExJQlMKICBMSUJTPSItbHdzMl8zMiAkTElCUyIKICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPHdpbnNvY2syLmg+XSwKICAgICAgICAgICAgICAgW2dldGhvc3RieW5hbWUoInd3dy5kdW1teXNpdGUuY29tIik7XSwKICAgICAgICAgICAgICAgWyBkbmwgd29ya2VkIQogICAgICAgICAgICAgICB3czI9InllcyIKICAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKICAgICAgICAgICAgICAgSEFWRV9HRVRIT1NUQllOQU1FPSIxIl0sCiAgICAgICAgICAgICAgIFsgZG5sIGZhaWxlZCwgcmVzdG9yZSBMSUJTCiAgICAgICAgICAgICAgIExJQlM9JG15X2FjX3NhdmVfTElCUwogICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKG5vKV0KICAgICAgICAgICAgICkKZmkKCmlmIHRlc3QgIiRIQVZFX0dFVEhPU1RCWU5BTUUiICE9ICIxIgp0aGVuCiAgZG5sIGdldGhvc3RieW5hbWUgaW4gdGhlIG5ldCBsaWIgLSBmb3IgQmVPUwogIEFDX0NIRUNLX0xJQihuZXQsIGdldGhvc3RieW5hbWUsCiAgICAgICAgICAgICAgIFtIQVZFX0dFVEhPU1RCWU5BTUU9IjEiCiAgICAgICAgICAgICAgIExJQlM9IiRMSUJTIC1sbmV0IgogICAgICAgICAgICAgICBdKQpmaQoKCmlmIHRlc3QgIiRIQVZFX0dFVEhPU1RCWU5BTUUiID0gIjEiOyB0aGVuCiAgQUNfREVGSU5FKEhBVkVfR0VUSE9TVEJZTkFNRSwgMSwgW0lmIHlvdSBoYXZlIGdldGhvc3RieW5hbWVdKQplbHNlCiAgQUNfTVNHX0VSUk9SKFtjb3VsZG4ndCBmaW5kIGxpYnJhcmllcyBmb3IgZ2V0aG9zdGJ5bmFtZSgpXSkKZmkKCmRubCByZXNvbHZlIGxpYj8KQUNfQ0hFQ0tfRlVOQyhzdHJjYXNlY21wLCAsIFsgQUNfQ0hFQ0tfTElCKHJlc29sdmUsIHN0cmNhc2VjbXApIF0pCgppZiB0ZXN0ICIkYWNfY3ZfbGliX3Jlc29sdmVfc3RyY2FzZWNtcCIgPSAiJGFjX2N2X2Z1bmNfc3RyY2FzZWNtcCI7IHRoZW4KICBBQ19DSEVDS19MSUIocmVzb2x2ZSwgc3RyY2FzZWNtcCwKICAgICAgICAgICAgICBbTElCUz0iLWxyZXNvbHZlICRMSUJTIl0sCiAgICAgICAgICAgICAgICwKICAgICAgICAgICAgICAgLWxuc2wpCmZpCgpkbmwgc29ja2V0IGxpYj8KQUNfQ0hFQ0tfRlVOQyhjb25uZWN0LCAsIFsgQUNfQ0hFQ0tfTElCKHNvY2tldCwgY29ubmVjdCkgXSkKCmRubCBkbCBsaWI/CkFDX0NIRUNLX0ZVTkMoZGxjbG9zZSwgLCBbIEFDX0NIRUNLX0xJQihkbCwgZGxvcGVuKSBdKQoKQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIHVzZSBsaWJnY2NdKQpBQ19BUkdfRU5BQkxFKGxpYmdjYywKQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWxpYmdjY10sW3VzZSBsaWJnY2Mgd2hlbiBsaW5raW5nXSksClsgY2FzZSAiJGVuYWJsZXZhbCIgaW4KICB5ZXMpCiAgICAgICAgTElCUz0iJExJQlMgLWxnY2MiCiAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKICAgICAgIDs7CiAgKikgICBBQ19NU0dfUkVTVUxUKG5vKQogICAgICAgOzsKICBlc2FjIF0sCiAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQopCgpkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkbmwgQ2hlY2sgZm9yIHRoZSBuYW1lIG9mIGR5bmFtaWMgT3BlbkxEQVAgbGlicmFyaWVzCmRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpMREFQTElCTkFNRT0iIgpBQ19BUkdfV0lUSChsZGFwLWxpYiwKQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1sZGFwLWxpYj1saWJuYW1lXSxbU3BlY2lmeSBuYW1lIG9mIGR5bmFtaWMgbGRhcCBsaWIgZmlsZV0pLAogW0xEQVBMSUJOQU1FPSIkd2l0aHZhbCJdKQoKTEJFUkxJQk5BTUU9IiIKQUNfQVJHX1dJVEgobGJlci1saWIsCkFDX0hFTFBfU1RSSU5HKFstLXdpdGgtbGJlci1saWI9bGlibmFtZV0sW1NwZWNpZnkgbmFtZSBvZiBkeW5hbWljIGxiZXIgbGliIGZpbGVdKSwKIFtMQkVSTElCTkFNRT0iJHdpdGh2YWwiXSkKCmlmIHRlc3QgeCRDVVJMX0RJU0FCTEVfTERBUCAhPSB4MSA7IHRoZW4KCiAgaWYgdGVzdCAteiAiJExEQVBMSUJOQU1FIiA7IHRoZW4KICAgIGNhc2UgJGhvc3QgaW4KICAgICAgKi0qLWN5Z3dpbiB8ICotKi1taW5ndyogfCAqLSotcHczMiopCiAgICAgICAgZG5sIFdpbmRvd3MgdXNlcyBhIHNpbmdsZSBhbmQgdW5pcXVlIE9wZW5MREFQIERMTCBuYW1lCiAgICAgICAgTERBUExJQk5BTUU9IndsZGFwMzIuZGxsIgogICAgICAgIExCRVJMSUJOQU1FPSJubyIKICAgICAgICA7OwogICAgZXNhYwogIGZpCgogIGlmIHRlc3QgIiRMREFQTElCTkFNRSIgOyB0aGVuCiAgICBBQ19ERUZJTkVfVU5RVU9URUQoRExfTERBUF9GSUxFLCAiJExEQVBMSUJOQU1FIikKICAgIEFDX01TR19DSEVDS0lORyhbbmFtZSBvZiBkeW5hbWljIGxpYnJhcnkgbGRhcF0pCiAgICBBQ19NU0dfUkVTVUxUKCRMREFQTElCTkFNRSkKICBlbHNlCiAgICBkbmwgVHJ5IHRvIGZpbmQgdGhlIHJpZ2h0IGxkYXAgbGlicmFyeSBuYW1lIGZvciB0aGlzIHN5c3RlbQogICAgQ1VSTF9ETExJQl9OQU1FKERMX0xEQVBfRklMRSwgbGRhcCkKICBmaQoKICBpZiB0ZXN0ICIkTEJFUkxJQk5BTUUiIDsgdGhlbgogICAgZG5sIElmIG5hbWUgaXMgIm5vIiB0aGVuIGRvbid0IGRlZmluZSB0aGlzIHZhcmlhYmxlIGF0IGFsbAogICAgZG5sIChpdCdzIG9ubHkgbmVlZGVkIGlmIGxpYmxkYXAuc28ncyBkZXBlbmRlbmNpZXMgYXJlIGJyb2tlbikuCiAgICBpZiB0ZXN0ICIkTEJFUkxJQk5BTUUiICE9ICJubyIgOyB0aGVuIAogICAgICBBQ19ERUZJTkVfVU5RVU9URUQoRExfTEJFUl9GSUxFLCAiJExCRVJMSUJOQU1FIikKICAgIGZpCiAgICBBQ19NU0dfQ0hFQ0tJTkcoW25hbWUgb2YgZHluYW1pYyBsaWJyYXJ5IGxiZXJdKQogICAgQUNfTVNHX1JFU1VMVCgkTEJFUkxJQk5BTUUpCiAgZWxzZQogICAgZG5sIFRyeSB0byBmaW5kIHRoZSByaWdodCBsYmVyIGxpYnJhcnkgbmFtZSBmb3IgdGhpcyBzeXN0ZW0KICAgIENVUkxfRExMSUJfTkFNRShETF9MQkVSX0ZJTEUsIGxiZXIpCiAgZmkKZmkKCmRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRubCBDaGVjayBmb3IgdGhlIHByZXNlbmNlIG9mIHRoZSB3aW5tbSBsaWJyYXJ5LgpkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKQUNfTVNHX0NIRUNLSU5HKFtmb3IgdGltZUdldFRpbWUgaW4gd2lubW1dKQpteV9hY19zYXZlX0xJQlM9JExJQlMKTElCUz0iLWx3aW5tbSAkTElCUyIKQUNfVFJZX0xJTksoWyNpbmNsdWRlIDx3aW5kZWYuaD4KICAgICAgICAgICAgICNpbmNsdWRlIDxtbXN5c3RlbS5oPgogICAgICAgICAgICAgXSwKICAgICAgICAgICAgIFt0aW1lR2V0VGltZSgpO10sCiAgICAgICAgICAgICBbIGRubCB3b3JrZWQhCiAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQogICAgICAgICAgICAgXSwKICAgICAgICAgICAgIFsgZG5sIGZhaWxlZCwgcmVzdG9yZSBMSUJTCiAgICAgICAgICAgICBMSUJTPSRteV9hY19zYXZlX0xJQlMKICAgICAgICAgICAgIEFDX01TR19SRVNVTFQobm8pXQogICAgICAgICAgICkKCmRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRubCBDaGVja3MgZm9yIElQdjYKZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCkFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgaXB2Nl0pCkFDX0FSR19FTkFCTEUoaXB2NiwKQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWlwdjZdLFtFbmFibGUgaXB2NiAod2l0aCBpcHY0KSBzdXBwb3J0XSkKQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1pcHY2XSxbRGlzYWJsZSBpcHY2IHN1cHBvcnRdKSwKWyBjYXNlICIkZW5hYmxldmFsIiBpbgogIG5vKQogICAgICAgQUNfTVNHX1JFU1VMVChubykKICAgICAgIGlwdjY9bm8KICAgICAgIDs7CiAgKikgICBBQ19NU0dfUkVTVUxUKHllcykKICAgICAgIGlwdjY9eWVzCiAgICAgICA7OwogIGVzYWMgXSwKCiAgQUNfVFJZX1JVTihbIC8qIGlzIEFGX0lORVQ2IGF2YWlsYWJsZT8gKi8KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgptYWluKCkKewogaWYgKHNvY2tldChBRl9JTkVUNiwgU09DS19TVFJFQU0sIDApIDwgMCkKICAgZXhpdCgxKTsKIGVsc2UKICAgZXhpdCgwKTsKfQpdLAogIEFDX01TR19SRVNVTFQoeWVzKQogIGlwdjY9eWVzLAogIEFDX01TR19SRVNVTFQobm8pCiAgaXB2Nj1ubywKICBBQ19NU0dfUkVTVUxUKG5vKQogIGlwdjY9bm8KKSkKCmlmIHRlc3QgIiRpcHY2IiA9ICJ5ZXMiOyB0aGVuCiAgY3VybF9pcHY2X21zZz0iZW5hYmxlZCIKCiAgQ1VSTF9DSEVDS19XT1JLSU5HX0dFVEFERFJJTkZPCgogIENVUkxfQ0hFQ0tfTklfV0lUSFNDT1BFSUQKZmkKCmRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRubCBDaGVjayBob3cgbm9uLWJsb2NraW5nIHNvY2tldHMgYXJlIHNldApkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpBQ19BUkdfRU5BQkxFKG5vbmJsb2NraW5nLApBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtbm9uYmxvY2tpbmddLFtFbmFibGUgZGV0ZWN0aW5nIGhvdyB0byBkbyBpdF0pCkFDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtbm9uYmxvY2tpbmddLFtEaXNhYmxlIG5vbi1ibG9ja2luZyBzb2NrZXQgZGV0ZWN0aW9uXSksClsKICBpZiB0ZXN0ICIkZW5hYmxldmFsIiA9ICJubyIgOyB0aGVuCiAgICBBQ19NU0dfV0FSTihbbm9uLWJsb2NraW5nIHNvY2tldHMgZGlzYWJsZWRdKQogICAgQUNfREVGSU5FKEhBVkVfRElTQUJMRURfTk9OQkxPQ0tJTkcsIDEsCiAgICBbdG8gZGlzYWJsZSBOT04tQkxPQ0tJTkcgY29ubmVjdGlvbnNdKQogIGVsc2UKICAgIENVUkxfQ0hFQ0tfTk9OQkxPQ0tJTkdfU09DS0VUCiAgZmkKXSwKWwogIENVUkxfQ0hFQ0tfTk9OQkxPQ0tJTkdfU09DS0VUCl0pCgpkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkbmwgQ2hlY2sgaWYgdGhlIG9wZXJhdGluZyBzeXN0ZW0gYWxsb3dzIHByb2dyYW1zIHRvIHdyaXRlIHRvIHRoZWlyIG93biBhcmd2W10KZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCkFDX01TR19DSEVDS0lORyhbaWYgYXJndiBjYW4gYmUgd3JpdHRlbiB0b10pCkFDX0NBQ0hFX1ZBTChjdXJsX2N2X3dyaXRhYmxlX2FyZ3YsIFsKQUNfUlVOX0lGRUxTRShbWwppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKiBhcmd2KSB7Cglhcmd2WzBdWzBdID0gJyAnOwoJcmV0dXJuIChhcmd2WzBdWzBdID09ICcgJyk/MDoxOwp9CgldXSwKCWN1cmxfY3Zfd3JpdGFibGVfYXJndj15ZXMsCgljdXJsX2N2X3dyaXRhYmxlX2FyZ3Y9bm8sCgljdXJsX2N2X3dyaXRhYmxlX2FyZ3Y9Y3Jvc3MpCl0pCmNhc2UgJGN1cmxfY3Zfd3JpdGFibGVfYXJndiBpbgp5ZXMpCglBQ19ERUZJTkUoSEFWRV9XUklUQUJMRV9BUkdWLCAxLCBbRGVmaW5lIHRoaXMgc3ltYm9sIGlmIHlvdXIgT1Mgc3VwcG9ydHMgY2hhbmdpbmcgdGhlIGNvbnRlbnRzIG9mIGFyZ3ZdKQoJQUNfTVNHX1JFU1VMVCh5ZXMpCgk7OwpubykKCUFDX01TR19SRVNVTFQobm8pCgk7OwoqKQogICAgICAgIEFDX01TR19SRVNVTFQobm8pCiAgICAgICAgQUNfTVNHX1dBUk4oW3RoZSBwcmV2aW91cyBjaGVjayBjb3VsZCBub3QgYmUgbWFkZSBkZWZhdWx0IHdhcyB1c2VkXSkKCTs7CmVzYWMKCmRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRubCBDaGVjayBmb3IgdGhlIHByZXNlbmNlIG9mIEtlcmJlcm9zNCBsaWJyYXJpZXMgYW5kIGhlYWRlcnMKZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCkFDX0FSR19XSVRIKGtyYjQtaW5jbHVkZXMsCkFDX0hFTFBfU1RSSU5HKFstLXdpdGgta3JiNC1pbmNsdWRlcz1ESVJdLAogICAgICAgICAgICAgICBbU3BlY2lmeSBsb2NhdGlvbiBvZiBrZXJiZXJvczQgaGVhZGVyc10pLFsKIENQUEZMQUdTPSIkQ1BQRkxBR1MgLUkkd2l0aHZhbCIKIEtSQjRJTkM9IiR3aXRodmFsIgogd2FudF9rcmI0PXllcwogXSkKCkFDX0FSR19XSVRIKGtyYjQtbGlicywKQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1rcmI0LWxpYnM9RElSXSxbU3BlY2lmeSBsb2NhdGlvbiBvZiBrZXJiZXJvczQgbGlic10pLFsKIExERkxBR1M9IiRMREZMQUdTIC1MJHdpdGh2YWwiCiBLUkI0TElCPSIkd2l0aHZhbCIKIHdhbnRfa3JiND15ZXMKIF0pCgoKT1BUX0tSQjQ9b2ZmCkFDX0FSR19XSVRIKGtyYjQsZG5sCkFDX0hFTFBfU1RSSU5HKFstLXdpdGgta3JiND1ESVJdLFt3aGVyZSB0byBsb29rIGZvciBLZXJiZXJvczRdKSxbCiAgT1BUX0tSQjQ9IiR3aXRodmFsIgogIGlmIHRlc3QgWCIkT1BUX0tSQjQiICE9IFhubzsgdGhlbgogICAgd2FudF9rcmI0PSJ5ZXMiCiAgICBpZiB0ZXN0IFgiJE9QVF9LUkI0IiAhPSBYeWVzOyB0aGVuCiAgICAgIExERkxBR1M9IiRMREZMQUdTIC1MJE9QVF9LUkI0L2xpYiRsaWJzdWZmIgogICAgICBLUkI0TElCPSIkT1BUX0tSQjQvbGliJGxpYnN1ZmYiCiAgICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgLUkkT1BUX0tSQjQvaW5jbHVkZSIKICAgICAgS1JCNElOQz0iJE9QVF9LUkI0L2luY2x1ZGUiCiAgICBmaQogIGZpCiBdKQoKQUNfTVNHX0NIRUNLSU5HKFtpZiBLZXJiZXJvczQgc3VwcG9ydCBpcyByZXF1ZXN0ZWRdKQoKaWYgdGVzdCAiJHdhbnRfa3JiNCIgPSB5ZXMKdGhlbgogIGlmIHRlc3QgIiRpcHY2IiA9ICJ5ZXMiOyB0aGVuCiAgICBlY2hvIGtyYjQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBJUHY2CiAgICBleGl0IDEKICBmaQogIEFDX01TR19SRVNVTFQoeWVzKQoKICBkbmwgQ2hlY2sgZm9yICYgaGFuZGxlIGFyZ3VtZW50IHRvIC0td2l0aC1rcmI0CgogIEFDX01TR19DSEVDS0lORyh3aGVyZSB0byBsb29rIGZvciBLZXJiZXJvczQpCiAgaWYgdGVzdCBYIiRPUFRfS1JCNCIgPSBYeWVzCiAgdGhlbgogICAgQUNfTVNHX1JFU1VMVChbZGVmYXVsdHNdKQogIGVsc2UKICAgIEFDX01TR19SRVNVTFQoW2xpYnMgaW4gJEtSQjRMSUIsIGhlYWRlcnMgaW4gJEtSQjRJTkNdKQogIGZpCgogIGRubCBDaGVjayBmb3IgREVTIGxpYnJhcnkKICBBQ19DSEVDS19MSUIoZGVzLCBkZXNfcGNiY19lbmNyeXB0LAogIFsKICAgIEFDX0NIRUNLX0hFQURFUlMoZGVzLmgpCgogICAgZG5sIHJlc29sdiBsaWI/CiAgICBBQ19DSEVDS19GVU5DKHJlc19zZWFyY2gsICwgW0FDX0NIRUNLX0xJQihyZXNvbHYsIHJlc19zZWFyY2gpXSkKCiAgICBkbmwgQ2hlY2sgZm9yIHRoZSBLZXJiZXJvczQgbGlicmFyeQogICAgQUNfQ0hFQ0tfTElCKGtyYiwga3JiX25ldF9yZWFkLAogICAgWwogICAgICBkbmwgQ2hlY2sgZm9yIGhlYWRlciBmaWxlcwogICAgICBBQ19DSEVDS19IRUFERVJTKGtyYi5oKQoKICAgICAgZG5sIHdlIGZvdW5kIHRoZSByZXF1aXJlZCBsaWJyYXJpZXMsIGFkZCB0byBMSUJTCiAgICAgIExJQlM9Ii1sa3JiIC1sY29tX2VyciAtbGRlcyAkTElCUyIKCiAgICAgIGRubCBDaGVjayBmb3IgZnVuY3Rpb24ga3JiX2dldF9vdXJfaXBfZm9yX3JlYWxtCiAgICAgIGRubCB0aGlzIGlzIG5lZWRlZCBmb3IgTkFUIG5ldHdvcmtzCiAgICAgIEFDX0NIRUNLX0ZVTkNTKGtyYl9nZXRfb3VyX2lwX2Zvcl9yZWFsbSkKCiAgICAgIGRubCBhZGQgZGVmaW5lIEtSQjQKICAgICAgQUNfREVGSU5FKEhBVkVfS1JCNCwgMSwKICAgICAgW2lmIHlvdSBoYXZlIHRoZSBLZXJiZXJvczQgbGlicmFyaWVzIChpbmNsdWRpbmcgLWxkZXMpXSkKCiAgICAgIGRubCBzdWJzdGl0dXRlIGl0IHRvbyEKICAgICAgS1JCNF9FTkFCTEVEPTEKICAgICAgQUNfU1VCU1QoS1JCNF9FTkFCTEVEKQoKICAgICAgY3VybF9rcmI0X21zZz0iZW5hYmxlZCIKCiAgICAgIGRubCB0aGUga3JiNCBzdHVmZiBuZWVkcyBhIHN0cmxjcHkoKQogICAgICBBQ19DSEVDS19GVU5DUyhzdHJsY3B5KQoKICAgIF0pCiAgXSkKZWxzZQogIEFDX01TR19SRVNVTFQobm8pCmZpCgpkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkbmwgQ2hlY2sgZm9yIEZCb3BlbnNzbChTUE5FR08pIGxpYnJhcmllcwpkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKQUNfQVJHX1dJVEgoc3BuZWdvLAogIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtc3BuZWdvPURJUl0sCiAgICAgICAgICAgICAgICAgW1NwZWNpZnkgbG9jYXRpb24gb2YgU1BORUdPIGxpYnJhcnkgZmJvcGVuc3NsXSksIFsKICBTUE5FR09fUk9PVD0iJHdpdGh2YWwiCiAgaWYgdGVzdCB4IiRTUE5FR09fUk9PVCIgIT0geG5vOyB0aGVuCiAgICB3YW50X3NwbmVnbz0ieWVzIgogIGZpCl0pCgpBQ19NU0dfQ0hFQ0tJTkcoW2lmIFNQTkVHTyBzdXBwb3J0IGlzIHJlcXVlc3RlZF0pCmlmIHRlc3QgeCIkd2FudF9zcG5lZ28iID0geHllczsgdGhlbgoKICBpZiB0ZXN0IFgiJFNQTkVHT19ST09UIiA9IFh5ZXM7IHRoZW4KICAgICBBQ19NU0dfRVJST1IoW0ZCT3BlblNTTCBsaWJzIGFuZC9vciBkaXJlY3RvcmllcyB3ZXJlIG5vdCBmb3VuZCB3aGVyZSBzcGVjaWZpZWQhXSkKICAgICBBQ19NU0dfUkVTVUxUKG5vKQogIGVsc2UKICAgICBpZiB0ZXN0IC16ICIkU1BORUdPX0xJQl9ESVIiOyB0aGVuCiAgICAgICAgTERGTEFHUz0iJExERkxBR1MgLUwkU1BORUdPX1JPT1QgLWxmYm9wZW5zc2wiCiAgICAgZWxzZQogICAgICAgIExERkxBR1M9IiRMREZMQUdTICRTUE5FR09fTElCX0RJUiIKICAgICBmaQogCiAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCiAgICAgQUNfREVGSU5FKEhBVkVfU1BORUdPLCAxLAogICAgICAgICAgICAgICBbRGVmaW5lIHRoaXMgaWYgeW91IGhhdmUgdGhlIFNQTkVHTyBsaWJyYXJ5IGZib3BlbnNzbF0pCiAgICAgY3VybF9zcG5lZ29fbXNnPSJlbmFibGVkIgogIGZpCmVsc2UKICBBQ19NU0dfUkVTVUxUKG5vKQpmaQoKZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZG5sIENoZWNrIGZvciBHU1MtQVBJIGxpYnJhcmllcwpkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKQUNfQVJHX1dJVEgoZ3NzYXBpLWluY2x1ZGVzLAogIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtZ3NzYXBpLWluY2x1ZGVzPURJUl0sCiAgICAgICAgICAgICAgICAgW1NwZWNpZnkgbG9jYXRpb24gb2YgR1NTQVBJIGhlYWRlcl0pLAogIFsgR1NTQVBJX0lOQ1M9Ii1JJHdpdGh2YWwiIAogICAgd2FudF9nc3M9InllcyIgXQopCgpBQ19BUkdfV0lUSChnc3NhcGktbGlicywKICBBQ19IRUxQX1NUUklORyhbLS13aXRoLWdzc2FwaS1saWJzPURJUl0sCiAgCQkgW1NwZWNpZnkgbG9jYXRpb24gb2YgR1NTQVBJIGxpYnNdKSwKICBbIEdTU0FQSV9MSUJTPSItTCR3aXRodmFsIC1sZ3NzYXBpIgogICAgd2FudF9nc3M9InllcyIgXQopCgpBQ19BUkdfV0lUSChnc3NhcGksCiAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1nc3NhcGk9RElSXSwKICAgICAgICAgICAgICAgICBbV2hlcmUgdG8gbG9vayBmb3IgR1NTQVBJXSksIFsKICBHU1NBUElfUk9PVD0iJHdpdGh2YWwiCiAgaWYgdGVzdCB4IiRHU1NBUElfUk9PVCIgIT0geG5vOyB0aGVuCiAgICB3YW50X2dzcz0ieWVzIiAKICBmaQpdKQoKQUNfTVNHX0NIRUNLSU5HKFtpZiBHU1NBUEkgc3VwcG9ydCBpcyByZXF1ZXN0ZWRdKQppZiB0ZXN0IHgiJHdhbnRfZ3NzIiA9IHh5ZXM7IHRoZW4KICBpZiB0ZXN0IC16ICIkR1NTQVBJX0lOQ1MiOyB0aGVuCiAgICAgaWYgdGVzdCAtZiAiJEdTU0FQSV9ST09UL2Jpbi9rcmI1LWNvbmZpZyI7IHRoZW4KICAgICAgICBHU1NBUElfSU5DUz1gJEdTU0FQSV9ST09UL2Jpbi9rcmI1LWNvbmZpZyAtLWNmbGFncyBnc3NhcGlgCiAgICAgZWxpZiB0ZXN0ICIkR1NTQVBJX1JPT1QiICE9ICJ5ZXMiOyB0aGVuCiAgICAgICAgR1NTQVBJX0lOQ1M9Ii1JJEdTU0FQSV9ST09UL2luY2x1ZGUiCiAgICAgZmkKICBmaQogIENQUEZMQUdTPSIkQ1BQRkxBR1MgJEdTU0FQSV9JTkNTIgogIAogIGlmIHRlc3QgLXogIiRHU1NBUElfTElCX0RJUiI7IHRoZW4KICAgICBpZiB0ZXN0IC1mICIkR1NTQVBJX1JPT1QvYmluL2tyYjUtY29uZmlnIjsgdGhlbgogICAgICAgIGdzc19sZGZsYWdzPWAkR1NTQVBJX1JPT1QvYmluL2tyYjUtY29uZmlnIC0tbGlicyBnc3NhcGlgCglMREZMQUdTPSIkTERGTEFHUyAkZ3NzX2xkZmxhZ3MiCiAgICAgZWxpZiB0ZXN0ICIkR1NTQVBJX1JPT1QiICE9ICJ5ZXMiOyB0aGVuCiAgICAgICAgTERGTEFHUz0iJExERkxBR1MgLUwkR1NTQVBJX1JPT1QvbGliJGxpYnN1ZmYgLWxnc3NhcGkiCiAgICAgZWxzZQogICAgICAgIExERkxBR1M9IiRMREZMQUdTIC1sZ3NzYXBpIgogICAgIGZpCiAgZWxzZQogICAgIExERkxBR1M9IiRMREZMQUdTICRHU1NBUElfTElCX0RJUiIKICBmaQoKICBBQ19NU0dfUkVTVUxUKHllcykKICBBQ19ERUZJTkUoSEFWRV9HU1NBUEksIDEsIFtpZiB5b3UgaGF2ZSB0aGUgZ3NzYXBpIGxpYnJhcmllc10pCgogIGN1cmxfZ3NzX21zZz0iZW5hYmxlZCIKCiAgQUNfQ0hFQ0tfSEVBREVSKGdzc2FwaS5oLAogICAgWwogICAgICAgZG5sIGZvdW5kIGluIHRoZSBnaXZlbiBkaXJzCiAgICAgIEFDX0RFRklORShIQVZFX0dTU0hFSU1EQUwsIDEsIFtpZiB5b3UgaGF2ZSB0aGUgSGVpbWRhbCBnc3NhcGkgbGlicmFyaWVzXSkKICAgIF0sCiAgICBbCiAgICAgIGRubCBub3QgZm91bmQsIGNoZWNrIGluIGdzc2FwaS8gc3ViZGlyIAogICAgICBBQ19DSEVDS19IRUFERVIoZ3NzYXBpL2dzc2FwaS5oLAogICAgICAgIGRubCBmb3VuZCAKICAgICAgICBBQ19ERUZJTkUoSEFWRV9HU1NNSVQsIDEsIFtpZiB5b3UgaGF2ZSB0aGUgTUlUIGdzc2FwaSBsaWJyYXJpZXNdKQogICAgICApCiAgICAgIAogICAgXQogICkKCmVsc2UKICBBQ19NU0dfUkVTVUxUKG5vKQpmaQogIApkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkbmwgQ2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBTU0wgbGlicmFyaWVzIGFuZCBoZWFkZXJzCmRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpkbmwgRGVmYXVsdCB0byBjb21waWxlciAmIGxpbmtlciBkZWZhdWx0cyBmb3IgU1NMIGZpbGVzICYgbGlicmFyaWVzLgpPUFRfU1NMPW9mZgpkbmwgRGVmYXVsdCB0byBubyBDQSBidW5kbGUKY2E9Im5vIgpBQ19BUkdfV0lUSChzc2wsZG5sCkFDX0hFTFBfU1RSSU5HKFstLXdpdGgtc3NsPVBBVEhdLFt3aGVyZSB0byBsb29rIGZvciBTU0wsIFBBVEggcG9pbnRzIHRvIHRoZSBTU0wgaW5zdGFsbGF0aW9uIChkZWZhdWx0OiAvdXNyL2xvY2FsL3NzbCldKQpBQ19IRUxQX1NUUklORyhbLS13aXRob3V0LXNzbF0sIFtkaXNhYmxlIFNTTF0pLAogIE9QVF9TU0w9JHdpdGh2YWwpCgppZiB0ZXN0IFgiJE9QVF9TU0wiICE9IFhubzsgdGhlbgogIGRubCBiYWNrdXAgdGhlIHByZS1zc2wgdmFyaWFibGVzCiAgQ0xFQU5MREZMQUdTPSIkTERGTEFHUyIKICBDTEVBTkNQUEZMQUdTPSIkQ1BQRkxBR1MiCiAgQ0xFQU5MSUJTPSIkTElCUyIKCiAgY2FzZSAiJE9QVF9TU0wiIGluCiAgeWVzKQogICAgZG5sIC0td2l0aC1zc2wgKHdpdGhvdXQgcGF0aCkgdXNlZAogICAgaWYgdGVzdCB4JGNyb3NzX2NvbXBpbGluZyAhPSB4eWVzOyB0aGVuCiAgICAgIGRubCBvbmx5IGRvIHBrZy1jb25maWcgbWFnaWMgd2hlbiBub3QgY3Jvc3MtY29tcGlsaW5nCiAgICAgIFBLR1RFU1Q9InllcyIKICAgIGZpCiAgICBQUkVGSVhfT1BFTlNTTD0vdXNyL2xvY2FsL3NzbAogICAgTElCX09QRU5TU0w9IiRQUkVGSVhfT1BFTlNTTC9saWIkbGlic3VmZiIKICAgIDs7CiAgb2ZmKQogICAgZG5sIG5vIC0td2l0aC1zc2wgb3B0aW9uIGdpdmVuLCBqdXN0IGNoZWNrIGRlZmF1bHQgcGxhY2VzCiAgICBpZiB0ZXN0IHgkY3Jvc3NfY29tcGlsaW5nICE9IHh5ZXM7IHRoZW4KICAgICAgZG5sIG9ubHkgZG8gcGtnLWNvbmZpZyBtYWdpYyB3aGVuIG5vdCBjcm9zcy1jb21waWxpbmcKICAgICAgUEtHVEVTVD0ieWVzIgogICAgZmkKICAgIFBSRUZJWF9PUEVOU1NMPQogICAgOzsKICAqKQogICAgZG5sIGNoZWNrIHRoZSBnaXZlbiAtLXdpdGgtc3NsIHNwb3QKICAgIFBLR1RFU1Q9Im5vIgogICAgUFJFRklYX09QRU5TU0w9JE9QVF9TU0wKICAgIExJQl9PUEVOU1NMPSIkUFJFRklYX09QRU5TU0wvbGliJGxpYnN1ZmYiCiAgICBMREZMQUdTPSIkTERGTEFHUyAtTCRMSUJfT1BFTlNTTCIKICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgLUkkUFJFRklYX09QRU5TU0wvaW5jbHVkZS9vcGVuc3NsIC1JJFBSRUZJWF9PUEVOU1NML2luY2x1ZGUiCiAgICA7OwogIGVzYWMKCiAgaWYgdGVzdCAiJFBLR1RFU1QiID0gInllcyI7IHRoZW4KCiAgICBkbmwgRGV0ZWN0IHRoZSBwa2ctY29uZmlnIHRvb2wsIGFzIGl0IG1heSBoYXZlIGV4dHJhIGluZm8gYWJvdXQgdGhlCiAgICBkbmwgb3BlbnNzbCBpbnN0YWxsYXRpb24gd2UgY2FuIHVzZS4gSSAqYmVsaWV2ZSogdGhpcyBpcyB3aGF0IHdlIGFyZQogICAgZG5sIGV4cGVjdGVkIHRvIGRvIG9uIHJlYWxseSByZWNlbnQgUmVkaGF0IExpbnV4IGhvc3RzLgoKICAgIEFDX1BBVEhfUFJPRyggUEtHQ09ORklHLCBwa2ctY29uZmlnLCBubywgJFBBVEg6L3Vzci9iaW46L3Vzci9sb2NhbC9iaW4pCiAgICBpZiB0ZXN0ICIkUEtHQ09ORklHIiAhPSAibm8iIDsgdGhlbgogICAgICBBQ19NU0dfQ0hFQ0tJTkcoW09wZW5TU0wgb3B0aW9ucyB3aXRoIHBrZy1jb25maWddKQoKICAgICAgJFBLR0NPTkZJRyAtLWV4aXN0cyBvcGVuc3NsCiAgICAgIFNTTF9FWElTVFM9JD8KCiAgICAgIGlmIHRlc3QgIiRTU0xfRVhJU1RTIiAtZXEgIjAiOyB0aGVuCiAgICAgICAgU1NMX0xJQlM9YCRQS0dDT05GSUcgLS1saWJzLW9ubHktbCBvcGVuc3NsIDI+L2Rldi9udWxsYAogICAgICAgIFNTTF9MREZMQUdTPWAkUEtHQ09ORklHIC0tbGlicy1vbmx5LUwgb3BlbnNzbCAyPi9kZXYvbnVsbGAKICAgICAgICBTU0xfQ1BQRkxBR1M9YCRQS0dDT05GSUcgLS1jZmxhZ3Mtb25seS1JIG9wZW5zc2wgMj4vZGV2L251bGxgCgoJTElCX09QRU5TU0w9YGVjaG8gJFNTTF9MREZMQUdTIHwgc2VkIC1lICdzLy1MLy9nJ2AKCiAgICAgICAgZG5sIHVzZSB0aGUgdmFsdWVzIHBrZy1jb25maWcgcmVwb3J0ZWQKICAgICAgICBMSUJTPSIkTElCUyAkU1NMX0xJQlMiCiAgICAgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAkU1NMX0NQUEZMQUdTIgogICAgICAgIExERkxBR1M9IiRMREZMQUdTICRTU0xfTERGTEFHUyIKICAgICAgICBBQ19NU0dfUkVTVUxUKFtmb3VuZF0pCiAgICAgIGVsc2UKICAgICAgICBBQ19NU0dfUkVTVUxUKFtub10pCiAgICAgIGZpCiAgICBmaQogIGZpCgogIGRubCBUaGlzIGlzIGZvciBNc3lzL01pbmd3CiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgZ2RpMzJdKQogIG15X2FjX3NhdmVfTElCUz0kTElCUwogIExJQlM9Ii1sZ2RpMzIgJExJQlMiCiAgQUNfVFJZX0xJTksoWyNpbmNsdWRlIDx3aW5kZWYuaD4KICAgICAgICAgICAgICAgI2luY2x1ZGUgPHdpbmdkaS5oPl0sCiAgICAgICAgICAgICAgIFtHZGlGbHVzaCgpO10sCiAgICAgICAgICAgICAgIFsgZG5sIHdvcmtlZCEKICAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSldLAogICAgICAgICAgICAgICBbIGRubCBmYWlsZWQsIHJlc3RvcmUgTElCUwogICAgICAgICAgICAgICBMSUJTPSRteV9hY19zYXZlX0xJQlMKICAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChubyldCiAgICAgICAgICAgICAgKQoKICBBQ19DSEVDS19MSUIoY3J5cHRvLCBDUllQVE9fbG9jayxbCiAgICAgSEFWRUNSWVBUTz0ieWVzIgogICAgIExJQlM9Ii1sY3J5cHRvICRMSUJTIgogICAgIF0sWwogICAgIExERkxBR1M9IiRDTEVBTkxERkxBR1MgLUwkTElCX09QRU5TU0wiCiAgICAgQ1BQRkxBR1M9IiRDTEVBTkNQUEZMQUdTIC1JJFBSRUZJWF9PUEVOU1NML2luY2x1ZGUvb3BlbnNzbCAtSSRQUkVGSVhfT1BFTlNTTC9pbmNsdWRlIgogICAgIEFDX0NIRUNLX0xJQihjcnlwdG8sIENSWVBUT19hZGRfbG9jayxbCiAgICAgICBIQVZFQ1JZUFRPPSJ5ZXMiCiAgICAgICBMSUJTPSItbGNyeXB0byAkTElCUyJdLCBbCiAgICAgICBMREZMQUdTPSIkQ0xFQU5MREZMQUdTIgogICAgICAgQ1BQRkxBR1M9IiRDTEVBTkNQUEZMQUdTIgogICAgICAgTElCUz0iJENMRUFOTElCUyIKICAgICAgIF0pCiAgICBdKQoKCiAgaWYgdGVzdCBYIiRIQVZFQ1JZUFRPIiA9IFgieWVzIjsgdGhlbgogICAgZG5sIFRoaXMgaXMgb25seSByZWFzb25hYmxlIHRvIGRvIGlmIGNyeXB0byBhY3R1YWxseSBpcyB0aGVyZTogY2hlY2sgZm9yCiAgICBkbmwgU1NMIGxpYnMgTk9URTogaXQgaXMgaW1wb3J0YW50IHRvIGRvIHRoaXMgQUZURVIgdGhlIGNyeXB0byBsaWIKCiAgICBBQ19DSEVDS19MSUIoc3NsLCBTU0xfY29ubmVjdCkKCiAgICBpZiB0ZXN0ICIkYWNfY3ZfbGliX3NzbF9TU0xfY29ubmVjdCIgIT0geWVzOyB0aGVuCiAgICAgICAgZG5sIHdlIGRpZG4ndCBmaW5kIHRoZSBTU0wgbGliLCB0cnkgdGhlIFJTQWdsdWUvcnNhcmVmIHN0dWZmCiAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBzc2wgd2l0aCBSU0FnbHVlL3JzYXJlZiBsaWJzIGluIHVzZSk7CiAgICAgICAgT0xJQlM9JExJQlMKICAgICAgICBMSUJTPSIkTElCUyAtbFJTQWdsdWUgLWxyc2FyZWYiCiAgICAgICAgQUNfQ0hFQ0tfTElCKHNzbCwgU1NMX2Nvbm5lY3QpCiAgICAgICAgaWYgdGVzdCAiJGFjX2N2X2xpYl9zc2xfU1NMX2Nvbm5lY3QiICE9IHllczsgdGhlbgogICAgICAgICAgICBkbmwgc3RpbGwgbm8gU1NMX2Nvbm5lY3QKICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChubykKICAgICAgICAgICAgTElCUz0kT0xJQlMKICAgICAgICBlbHNlCiAgICAgICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQogICAgICAgIGZpCgogICAgZWxzZQoKICAgICAgZG5sIEhhdmUgdGhlIGxpYnJhcmllcy0tY2hlY2sgZm9yIFNTTGVheS9PcGVuU1NMIGhlYWRlcnMKICAgICAgQUNfQ0hFQ0tfSEVBREVSUyhvcGVuc3NsL3g1MDkuaCBvcGVuc3NsL3JzYS5oIG9wZW5zc2wvY3J5cHRvLmggXAogICAgICAgICAgICAgICAgICAgICAgIG9wZW5zc2wvcGVtLmggb3BlbnNzbC9zc2wuaCBvcGVuc3NsL2Vyci5oLAogICAgICAgIGN1cmxfc3NsX21zZz0iZW5hYmxlZCAoT3BlblNTTCkiCiAgICAgICAgT1BFTlNTTF9FTkFCTEVEPTEKICAgICAgICBBQ19ERUZJTkUoVVNFX09QRU5TU0wsIDEsIFtpZiBPcGVuU1NMIGlzIGluIHVzZV0pKQoKICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX29wZW5zc2xfeDUwOV9oID0gbm87IHRoZW4KICAgICAgICBBQ19DSEVDS19IRUFERVJTKHg1MDkuaCByc2EuaCBjcnlwdG8uaCBwZW0uaCBzc2wuaCBlcnIuaCwKICAgICAgICAgIGN1cmxfc3NsX21zZz0iZW5hYmxlZCAoT3BlblNTTCkiCiAgICAgICAgICBPUEVOU1NMX0VOQUJMRUQ9MSkKICAgICAgZmkKICAgIGZpCgogICAgaWYgdGVzdCBYIiRPUEVOU1NMX0VOQUJMRUQiID0gWCIxIjsgdGhlbgogICAgICAgQUNfREVGSU5FKFVTRV9TU0xFQVksIDEsIFtpZiBTU0wgaXMgZW5hYmxlZF0pCgogICAgICAgZG5sIGlzIHRoZXJlIGEgcGtjczEyLmggaGVhZGVyIHByZXNlbnQ/CiAgICAgICBBQ19DSEVDS19IRUFERVJTKG9wZW5zc2wvcGtjczEyLmgpCiAgICBlbHNlCiAgICAgICBMSUJTPSIkQ0xFQU5MSUJTIgogICAgZmkKICAgIGRubCBVU0VfU1NMRUFZIGlzIHRoZSBoaXN0b3JpY2FsIG5hbWUgZm9yIHdoYXQgY29uZmlndXJlIGNhbGxzCiAgICBkbmwgT1BFTlNTTF9FTkFCTEVEOyB0aGUgbmFtZXMgc2hvdWxkIHJlYWxseSBiZSB1bmlmaWVkCiAgICBVU0VfU1NMRUFZPSIkT1BFTlNTTF9FTkFCTEVEIgogICAgQUNfU1VCU1QoVVNFX1NTTEVBWSkKCiAgICBpZiB0ZXN0IFgiJE9QVF9TU0wiICE9IFhvZmYgJiYKICAgICAgIHRlc3QgIiRPUEVOU1NMX0VOQUJMRUQiICE9ICIxIjsgdGhlbgogICAgICBBQ19NU0dfRVJST1IoW09wZW5TU0wgbGlicyBhbmQvb3IgZGlyZWN0b3JpZXMgd2VyZSBub3QgZm91bmQgd2hlcmUgc3BlY2lmaWVkIV0pCiAgICBmaQogIGZpCgogIGlmIHRlc3QgWCIkT1BFTlNTTF9FTkFCTEVEIiA9IFgiMSI7IHRoZW4KICAgIGRubCBJZiB0aGUgRU5HSU5FIGxpYnJhcnkgc2VlbXMgdG8gYmUgYXJvdW5kLCBjaGVjayBmb3IgdGhlIE9wZW5TU0wgZW5naW5lCiAgICBkbmwgc3R1ZmYsIGl0IGlzIGtpbmQgb2YgInNlcGFyYXRlZCIgZnJvbSB0aGUgbWFpbiBTU0wgY2hlY2sKICAgIEFDX0NIRUNLX0ZVTkMoRU5HSU5FX2luaXQsCiAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgQUNfQ0hFQ0tfSEVBREVSUyhvcGVuc3NsL2VuZ2luZS5oKQogICAgICAgICAgICAgICAgQUNfQ0hFQ0tfRlVOQ1MoIEVOR0lORV9sb2FkX2J1aWx0aW5fZW5naW5lcyApCiAgICAgICAgICAgICAgXSkKCiAgICBkbmwgdGhlc2UgY2FuIG9ubHkgZXhpc3QgaWYgb3BlbnNzbCBleGlzdHMKCiAgICBBQ19DSEVDS19GVU5DUyggUkFORF9zdGF0dXMgXAogICAgICAgICAgICAgICAgICAgIFJBTkRfc2NyZWVuIFwKICAgICAgICAgICAgICAgICAgICBSQU5EX2VnZCBcCiAgICAgICAgICAgICAgICAgICAgQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEgKQoKICBmaQoKICBpZiB0ZXN0ICIkT1BFTlNTTF9FTkFCTEVEIiA9ICIxIjsgdGhlbgogICAgaWYgdGVzdCAtbiAiJExJQl9PUEVOU1NMIjsgdGhlbgogICAgICAgZG5sIHdoZW4gdGhlIHNzbCBzaGFyZWQgbGlicyB3ZXJlIGZvdW5kIGluIGEgcGF0aCB0aGF0IHRoZSBydW4tdGltZQogICAgICAgZG5sIGxpbmtlciBkb2Vzbid0IHNlYXJjaCB0aHJvdWdoLCB3ZSBuZWVkIHRvIGFkZCBpdCB0byBMRF9MSUJSQVJZX1BBVEgKICAgICAgIGRubCB0byBwcmV2ZW50IGZ1cnRoZXIgY29uZmlndXJlIHRlc3RzIHRvIGZhaWwgZHVlIHRvIHRoaXMKCiAgICAgICBMRF9MSUJSQVJZX1BBVEg9IiRMRF9MSUJSQVJZX1BBVEg6JExJQl9PUEVOU1NMIgogICAgICAgZXhwb3J0IExEX0xJQlJBUllfUEFUSAogICAgICAgQUNfTVNHX05PVElDRShbQWRkZWQgJExJQl9PUEVOU1NMIHRvIExEX0xJQlJBUllfUEFUSF0pCiAgICBmaQogIGZpCgpmaQoKZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZG5sIENoZWNrIGZvciB0aGUgcmFuZG9tIHNlZWQgcHJlZmVyZW5jZXMgCmRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgppZiB0ZXN0IFgiJE9QRU5TU0xfRU5BQkxFRCIgPSBYIjEiOyB0aGVuCiAgQUNfQVJHX1dJVEgoZWdkLXNvY2tldCwKICBBQ19IRUxQX1NUUklORyhbLS13aXRoLWVnZC1zb2NrZXQ9RklMRV0sCiAgICAgICAgICAgICAgICAgW0VudHJvcHkgR2F0aGVyaW5nIERhZW1vbiBzb2NrZXQgcGF0aG5hbWVdKSwKICAgICAgWyBFR0RfU09DS0VUPSIkd2l0aHZhbCIgXQogICkKICBpZiB0ZXN0IC1uICIkRUdEX1NPQ0tFVCIgOyB0aGVuCiAgICAgICAgICBBQ19ERUZJTkVfVU5RVU9URUQoRUdEX1NPQ0tFVCwgIiRFR0RfU09DS0VUIiwKICAgICAgICAgIFt5b3VyIEVudHJvcHkgR2F0aGVyaW5nIERhZW1vbiBzb2NrZXQgcGF0aG5hbWVdICkKICBmaQoKICBkbmwgQ2hlY2sgZm9yIHVzZXItc3BlY2lmaWVkIHJhbmRvbSBkZXZpY2UKICBBQ19BUkdfV0lUSChyYW5kb20sCiAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1yYW5kb209RklMRV0sCiAgICAgICAgICAgICAgICAgW3JlYWQgcmFuZG9tbmVzcyBmcm9tIEZJTEUgKGRlZmF1bHQ9L2Rldi91cmFuZG9tKV0pLAogICAgICBbIFJBTkRPTV9GSUxFPSIkd2l0aHZhbCIgXSwKICAgICAgWwogICAgICAgICAgZG5sIENoZWNrIGZvciByYW5kb20gZGV2aWNlCiAgICAgICAgICBBQ19DSEVDS19GSUxFKCIvZGV2L3VyYW5kb20iLCBbIFJBTkRPTV9GSUxFPSIvZGV2L3VyYW5kb20iXSApCiAgICAgIF0KICApCiAgaWYgdGVzdCAtbiAiJFJBTkRPTV9GSUxFIiAmJiB0ZXN0IFgiJFJBTkRPTV9GSUxFIiAhPSBYbm8gOyB0aGVuCiAgICAgICAgICBBQ19TVUJTVChSQU5ET01fRklMRSkKICAgICAgICAgIEFDX0RFRklORV9VTlFVT1RFRChSQU5ET01fRklMRSwgIiRSQU5ET01fRklMRSIsCiAgICAgICAgICBbYSBzdWl0YWJsZSBmaWxlIHRvIHJlYWQgcmFuZG9tIGRhdGEgZnJvbV0pCiAgZmkKZmkKCmRubCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRubCBGSVg6IG9ubHkgY2hlY2sgZm9yIEdudVRMUyBpZiBPcGVuU1NMIGlzIG5vdCBlbmFibGVkCmRubCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpkbmwgRGVmYXVsdCB0byBjb21waWxlciAmIGxpbmtlciBkZWZhdWx0cyBmb3IgR251VExTIGZpbGVzICYgbGlicmFyaWVzLgpPUFRfR05VVExTPW5vCgpBQ19BUkdfV0lUSChnbnV0bHMsZG5sCkFDX0hFTFBfU1RSSU5HKFstLXdpdGgtZ251dGxzPVBBVEhdLFt3aGVyZSB0byBsb29rIGZvciBHbnVUTFMsIFBBVEggcG9pbnRzIHRvIHRoZSBpbnN0YWxsYXRpb24gcm9vdCAoZGVmYXVsdDogL3Vzci9sb2NhbC8pXSkKQUNfSEVMUF9TVFJJTkcoWy0td2l0aG91dC1nbnV0bHNdLCBbZGlzYWJsZSBHbnVUTFMgZGV0ZWN0aW9uXSksCiAgT1BUX0dOVVRMUz0kd2l0aHZhbCkKCmlmIHRlc3QgIiRPUEVOU1NMX0VOQUJMRUQiICE9ICIxIjsgdGhlbgoKICBpZiB0ZXN0IFgiJE9QVF9HTlVUTFMiICE9IFhubzsgdGhlbgogICAgaWYgdGVzdCAieCRPUFRfR05VVExTIiA9ICJ4eWVzIjsgdGhlbgogICAgIGNoZWNrPWBsaWJnbnV0bHMtY29uZmlnIC0tdmVyc2lvbiAyPi9kZXYvbnVsbGAKICAgICBpZiB0ZXN0IC1uICIkY2hlY2siOyB0aGVuCiAgICAgICBhZGRsaWI9YGxpYmdudXRscy1jb25maWcgLS1saWJzYAogICAgICAgYWRkY2ZsYWdzPWBsaWJnbnV0bHMtY29uZmlnIC0tY2ZsYWdzYAogICAgICAgdmVyc2lvbj1gbGliZ251dGxzLWNvbmZpZyAtLXZlcnNpb25gCiAgICAgICBndGxzcHJlZml4PWBsaWJnbnV0bHMtY29uZmlnIC0tcHJlZml4YAogICAgIGZpCiAgICBlbHNlCiAgICAgIGFkZGxpYj1gJE9QVF9HTlVUTFMvYmluL2xpYmdudXRscy1jb25maWcgLS1saWJzYAogICAgICBhZGRjZmxhZ3M9YCRPUFRfR05VVExTL2Jpbi9saWJnbnV0bHMtY29uZmlnIC0tY2ZsYWdzYAogICAgICB2ZXJzaW9uPWAkT1BUX0dOVVRMUy9iaW4vbGliZ251dGxzLWNvbmZpZyAtLXZlcnNpb24gMj4vZGV2L251bGxgCiAgICAgIGd0bHNwcmVmaXg9JE9QVF9HTlVUTFMKICAgICAgaWYgdGVzdCAteiAiJHZlcnNpb24iOyB0aGVuCiAgICAgICAgdmVyc2lvbj0idW5rbm93biIKICAgICAgZmkKICAgIGZpCiAgICBpZiB0ZXN0IC1uICIkYWRkbGliIjsgdGhlbgoKICAgICAgQ0xFQU5MREZMQUdTPSIkTERGTEFHUyIKICAgICAgQ0xFQU5DUFBGTEFHUz0iJENQUEZMQUdTIgogIAogICAgICBMREZMQUdTPSIkTERGTEFHUyAkYWRkbGliIgogICAgICBpZiB0ZXN0ICIkYWRkY2ZsYWdzIiAhPSAiLUkvdXNyL2luY2x1ZGUiOyB0aGVuCiAgICAgICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgJGFkZGNmbGFncyIKICAgICAgZmkKICAKICAgICAgQUNfQ0hFQ0tfTElCKGdudXRscywgZ251dGxzX2NoZWNrX3ZlcnNpb24sCiAgICAgICBbCiAgICAgICBBQ19ERUZJTkUoVVNFX0dOVVRMUywgMSwgW2lmIEdudVRMUyBpcyBlbmFibGVkXSkKICAgICAgIEFDX1NVQlNUKFVTRV9HTlVUTFMsIFsxXSkKICAgICAgIFVTRV9HTlVUTFM9InllcyIKICAgICAgIGN1cmxfc3NsX21zZz0iZW5hYmxlZCAoR251VExTKSIKICAgICAgIF0sCiAgICAgICBbCiAgICAgICAgIExERkxBR1M9IiRDTEVBTkxERkxBR1MiCiAgICAgICAgIENQUEZMQUdTPSIkQ0xFQU5DUFBGTEFHUyIKICAgICAgIF0pCiAgCiAgICAgIGlmIHRlc3QgIngkVVNFX0dOVVRMUyIgPSAieHllcyI7IHRoZW4KICAgICAgICBBQ19NU0dfTk9USUNFKFtkZXRlY3RlZCBHbnVUTFMgdmVyc2lvbiAkdmVyc2lvbl0pCgogICAgICAgIGRubCB3aGVuIHNoYXJlZCBsaWJzIHdlcmUgZm91bmQgaW4gYSBwYXRoIHRoYXQgdGhlIHJ1bi10aW1lCiAgICAgICAgZG5sIGxpbmtlciBkb2Vzbid0IHNlYXJjaCB0aHJvdWdoLCB3ZSBuZWVkIHRvIGFkZCBpdCB0bwogICAgICAgIGRubCBMRF9MSUJSQVJZX1BBVEggdG8gcHJldmVudCBmdXJ0aGVyIGNvbmZpZ3VyZSB0ZXN0cyB0byBmYWlsCiAgICAgICAgZG5sIGR1ZSB0byB0aGlzCgogICAgICAgIExEX0xJQlJBUllfUEFUSD0iJExEX0xJQlJBUllfUEFUSDokZ3Rsc3ByZWZpeC9saWIkbGlic3VmZiIKICAgICAgICBleHBvcnQgTERfTElCUkFSWV9QQVRICiAgICAgICAgQUNfTVNHX05PVElDRShbQWRkZWQgJGd0bHNwcmVmaXgvbGliJGxpYnN1ZmYgdG8gTERfTElCUkFSWV9QQVRIXSkKICAgICAgZmkKCiAgICBmaQoKICBmaSBkbmwgR05VVExTIG5vdCBkaXNhYmxlZAoKICBpZiB0ZXN0IFgiJFVTRV9HTlVUTFMiICE9ICJYeWVzIjsgdGhlbgogICAgQUNfTVNHX1dBUk4oW1NTTCBkaXNhYmxlZCwgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gdXNlIEhUVFBTLCBGVFBTLCBOVExNIGFuZCBtb3JlLl0pCiAgICBBQ19NU0dfV0FSTihbVXNlIC0td2l0aC1zc2wgb3IgLS13aXRoLWdudXRscyB0byBhZGRyZXNzIHRoaXMuXSkKICBmaQoKZmkgZG5sIE9QRU5TU0wgIT0gMQoKZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZG5sIENoZWNrIGZvciB0aGUgQ0EgYnVuZGxlCmRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgppZiB0ZXN0IFgiJFVTRV9HTlVUTFMkT1BFTlNTTF9FTkFCTEVEIiAhPSAiWCI7IHRoZW4KCiAgQUNfTVNHX0NIRUNLSU5HKFtDQSBjZXJ0IGJ1bmRsZSBpbnN0YWxsIHBhdGhdKQoKICBBQ19BUkdfV0lUSChjYS1idW5kbGUsCkFDX0hFTFBfU1RSSU5HKFstLXdpdGgtY2EtYnVuZGxlPUZJTEVdLCBbRmlsZSBuYW1lIHRvIGluc3RhbGwgdGhlIENBIGJ1bmRsZSBhc10pCkFDX0hFTFBfU1RSSU5HKFstLXdpdGhvdXQtY2EtYnVuZGxlXSwgW0Rvbid0IGluc3RhbGwgdGhlIENBIGJ1bmRsZV0pLAogICAgWyBjYT0iJHdpdGh2YWwiIF0sCiAgICBbCiAgICAgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgogICAgICAgIGNhPSJcJHtwcmVmaXh9L3NoYXJlL2N1cmwvY3VybC1jYS1idW5kbGUuY3J0IgogICAgICBlbHNlCiAgICAgICAgY2E9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jdXJsL2N1cmwtY2EtYnVuZGxlLmNydCIKICAgICAgZmkKICAgIF0gKQoKICAgIGlmIHRlc3QgIngkY2EiICE9ICJ4bm8iOyB0aGVuCiAgICAgIENVUkxfQ0FfQlVORExFPSciJyRjYSciJwogICAgICBBQ19TVUJTVChDVVJMX0NBX0JVTkRMRSkgIAogICAgZmkKICAgIEFDX01TR19SRVNVTFQoWyRjYV0pCmZpIGRubCBvbmx5IGRvbmUgaWYgc29tZSBraW5kIG9mIFNTTCB3YXMgZW5hYmxlZAoKQU1fQ09ORElUSU9OQUwoQ0FCVU5ETEUsIHRlc3QgeCRjYSAhPSB4bm8pCgoKCiAgCmRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRubCBDaGVjayBmb3IgdGhlIHByZXNlbmNlIG9mIFpMSUIgbGlicmFyaWVzIGFuZCBoZWFkZXJzCmRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpkbmwgQ2hlY2sgZm9yICYgaGFuZGxlIGFyZ3VtZW50IHRvIC0td2l0aC16bGliLgoKX2NwcGZsYWdzPSRDUFBGTEFHUwpfbGRmbGFncz0kTERGTEFHUwpBQ19BUkdfV0lUSCh6bGliLApBQ19IRUxQX1NUUklORyhbLS13aXRoLXpsaWI9UEFUSF0sW3NlYXJjaCBmb3IgemxpYiBpbiBQQVRIXSkKQUNfSEVMUF9TVFJJTkcoWy0td2l0aG91dC16bGliXSxbZGlzYWJsZSB1c2Ugb2YgemxpYl0pLAogICAgICAgICAgICAgICBbT1BUX1pMSUI9IiR3aXRodmFsIl0pCgppZiB0ZXN0ICIkT1BUX1pMSUIiID0gIm5vIiA7IHRoZW4KICAgIEFDX01TR19XQVJOKFt6bGliIGRpc2FibGVkXSkKZWxzZQogIGlmIHRlc3QgIiRPUFRfWkxJQiIgPSAieWVzIiA7IHRoZW4KICAgICBPUFRfWkxJQj0iIgogIGZpCgogIGlmIHRlc3QgLXogIiRPUFRfWkxJQiIgOyB0aGVuCiAgICBkbmwgY2hlY2sgZm9yIHRoZSBsaWIgZmlyc3Qgd2l0aG91dCBzZXR0aW5nIGFueSBuZXcgcGF0aCwgc2luY2UgbWFueQogICAgZG5sIHBlb3BsZSBoYXZlIGl0IGluIHRoZSBkZWZhdWx0IHBhdGgKCiAgICBBQ19DSEVDS19MSUIoeiwgaW5mbGF0ZUVuZCwKICAgICAgICAgICAgICAgICAgIGRubCBsaWJ6IGZvdW5kLCBzZXQgdGhlIHZhcmlhYmxlCiAgICAgICAgICAgICAgICAgICBbSEFWRV9MSUJaPSIxIl0sCiAgICAgICAgICAgICAgICAgICBkbmwgaWYgbm8gbGliIGZvdW5kLCB0cnkgL3Vzci9sb2NhbAogICAgICAgICAgICAgICAgICAgW09QVF9aTElCPSIvdXNyL2xvY2FsIl0pCgogIGZpCgogIGRubCBBZGQgYSBub25lbXB0eSBwYXRoIHRvIHRoZSBjb21waWxlciBmbGFncwogIGlmIHRlc3QgLW4gIiRPUFRfWkxJQiI7IHRoZW4KICAgICBDUFBGTEFHUz0iJENQUEZMQUdTIC1JJE9QVF9aTElCL2luY2x1ZGUiCiAgICAgTERGTEFHUz0iJExERkxBR1MgLUwkT1BUX1pMSUIvbGliJGxpYnN1ZmYiCiAgZmkKCiAgQUNfQ0hFQ0tfSEVBREVSKHpsaWIuaCwKICAgIFsKICAgIGRubCB6bGliLmggd2FzIGZvdW5kCiAgICBIQVZFX1pMSUJfSD0iMSIKICAgIGRubCBpZiB0aGUgbGliIHdhc24ndCBmb3VuZCBhbHJlYWR5LCB0cnkgYWdhaW4gd2l0aCB0aGUgbmV3IHBhdGhzCiAgICBpZiB0ZXN0ICIkSEFWRV9MSUJaIiAhPSAiMSI7IHRoZW4KICAgICAgQUNfQ0hFQ0tfTElCKHosIGd6cmVhZCwKICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgIGRubCB0aGUgbGliIHdhcyBmb3VuZCEKICAgICAgICAgICAgICAgICAgIEhBVkVfTElCWj0iMSIKICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICBbIENQUEZMQUdTPSRfY3BwZmxhZ3MKICAgICAgICAgICAgICAgICAgIExERkxBR1M9JF9sZGZsYWdzXSkKICAgIGZpCiAgICBdLAogICAgWwogICAgICBkbmwgemxpYi5oIHdhcyBub3QgZm91bmQsIHJlc3RvcmUgdGhlIGZsYWdzCiAgICAgIENQUEZMQUdTPSRfY3BwZmxhZ3MKICAgICAgTERGTEFHUz0kX2xkZmxhZ3NdCiAgICApCgogIGlmIHRlc3QgIiRIQVZFX0xJQloiID0gIjEiICYmIHRlc3QgIiRIQVZFX1pMSUJfSCIgIT0gIjEiCiAgdGhlbgogICAgQUNfTVNHX1dBUk4oW2NvbmZpZ3VyZSBmb3VuZCBvbmx5IHRoZSBsaWJ6IGxpYiwgbm90IHRoZSBoZWFkZXIgZmlsZSFdKQogIGVsaWYgdGVzdCAiJEhBVkVfTElCWiIgIT0gIjEiICYmIHRlc3QgIiRIQVZFX1pMSUJfSCIgPSAiMSIKICB0aGVuCiAgICBBQ19NU0dfV0FSTihbY29uZmlndXJlIGZvdW5kIG9ubHkgdGhlIGxpYnogaGVhZGVyIGZpbGUsIG5vdCB0aGUgbGliIV0pCiAgZWxpZiB0ZXN0ICIkSEFWRV9MSUJaIiA9ICIxIiAmJiB0ZXN0ICIkSEFWRV9aTElCX0giID0gIjEiCiAgdGhlbgogICAgZG5sIGJvdGggaGVhZGVyIGFuZCBsaWIgd2VyZSBmb3VuZCEKICAgIEFDX1NVQlNUKEhBVkVfTElCWikKICAgIEFDX0RFRklORShIQVZFX1pMSUJfSCwgMSwgW2lmIHlvdSBoYXZlIHRoZSB6bGliLmggaGVhZGVyIGZpbGVdKQogICAgQUNfREVGSU5FKEhBVkVfTElCWiwgMSwgW2lmIHpsaWIgaXMgYXZhaWxhYmxlXSkKCiAgICBMSUJTPSIkTElCUyAtbHoiCgogICAgZG5sIHJlcGxhY2UgJ0hBVkVfTElCWicgaW4gdGhlIGF1dG9tYWtlIG1ha2VmaWxlLmFtcwogICAgQU1GSVhMSUI9IjEiCiAgICBBQ19NU0dfTk9USUNFKFtmb3VuZCBib3RoIGxpYnogYW5kIGxpYnouaCBoZWFkZXJdKQogICAgY3VybF96bGliX21zZz0iZW5hYmxlZCIKICBmaQpmaQoKZG5sIHNldCB2YXJpYWJsZSBmb3IgdXNlIGluIGF1dG9tYWtlZmlsZShzKQpBTV9DT05ESVRJT05BTChIQVZFX0xJQlosIHRlc3QgeCIkQU1GSVhMSUIiID0geDEpCgpBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgd2l0aCBsaWJpZG5dKQpBQ19BUkdfV0lUSChsaWJpZG4sCkFDX0hFTFBfU1RSSU5HKFstLXdpdGgtbGliaWRuPVBBVEhdLFtFbmFibGUgbGliaWRuIHVzYWdlXSkKQUNfSEVMUF9TVFJJTkcoWy0td2l0aG91dC1saWJpZG5dLFtEaXNhYmxlIGxpYmlkbiB1c2FnZV0pLAogIFtMSUJJRE49IiR3aXRodmFsIl0pCgpjYXNlICIkTElCSUROIiBpbgogIG5vKQogICAgICAgQUNfTVNHX1JFU1VMVChubykKICAgICAgIDs7CiAgKikgICBBQ19NU0dfUkVTVUxUKHllcykKCiAgICAgICBpZG49IiIKICAgICAgIGRubCBpZiB0aGVyZSBpcyBhIGdpdmVuIHBhdGgsIGNoZWNrIHRoYXQgRklSU1QKICAgICAgIGlmIHRlc3QgLW4gIiRMSUJJRE4iOyB0aGVuCiAgICAgICAgIGlmIHRlc3QgIngkTElCSUROIiAhPSAieHllcyI7IHRoZW4KICAgICAgICAgICAgb2xkTERGTEFHUz0kTERGTEFHUwogICAgICAgICAgICBvbGRDUFBGTEFHUz0kQ1BQRkxBR1MKICAgICAgICAgICAgTERGTEFHUz0iJExERkxBR1MgLUwkTElCSUROL2xpYiIKICAgICAgICAgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSRMSUJJRE4vaW5jbHVkZSIKICAgICAgICAgICAgaWRuPSJ5ZXMiCiAgICAgICAgICAgIEFDX0NIRUNLX0xJQihpZG4sIGlkbmFfdG9fYXNjaWlfNGksICwKICAgICAgICAgICAgICAgICAgICAgICAgIGlkbj0iIgogICAgICAgICAgICAgICAgICAgICAgICAgTERGTEFHUz0kb2xkTERGTEFHUwogICAgICAgICAgICAgICAgICAgICAgICAgQ1BQRkxBR1M9JG9sZENQUEZMQUdTKQogICAgICAgICBmaQogICAgICAgZmkKCiAgICAgICBpZiB0ZXN0ICJ4JGlkbiIgIT0gInh5ZXMiOyB0aGVuCiAgICAgICAgICBkbmwgY2hlY2sgd2l0aCBkZWZhdWx0IHBhdGhzCiAgICAgICAgICBpZG49InllcyIKICAgICAgICAgIEFDX0NIRUNLX0xJQihpZG4sIGlkbmFfdG9fYXNjaWlfbHosICwKICAgICAgICAgICAgICAgICAgICAgICBpZG49IiIpCiAgICAgICBmaQoKICAgICAgIGlmIHRlc3QgIngkaWRuIiA9ICJ4eWVzIjsgdGhlbgogICAgICAgICBjdXJsX2lkbl9tc2c9ImVuYWJsZWQiCiAgICAgICAgIEFDX1NVQlNUKElETl9FTkFCTEVELCBbMV0pCiAgICAgICAgIGRubCBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgbGliaWRuIGhhdmUgZGlmZmVyZW50IHNldHVwcyBvZiB0aGVzZToKICAgICAgICAgQUNfQ0hFQ0tfRlVOQ1MoIGlkbl9mcmVlIGlkbmFfc3RyZXJyb3IgdGxkX3N0cmVycm9yKQogICAgICAgICBBQ19DSEVDS19IRUFERVJTKCBpZG4tZnJlZS5oIHRsZC5oICkKICAgICAgIGZpCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICA7OyAKZXNhYwoKZG5sIERlZmF1bHQgaXMgdG8gdHJ5IHRoZSB0aHJlYWQtc2FmZSB2ZXJzaW9ucyBvZiBhIGZldyBmdW5jdGlvbnMKT1BUX1RIUkVBRD1vbgoKZG5sIGRldGVjdCBBSVggNC4zIG9yIGxhdGVyCmRubCBzZWUgZnVsbCBkb2NzIG9uIHRoaXMgcmVhc29uaW5nIGluIHRoZSBsaWIvaG9zdGlwLmMgc291cmNlIGZpbGUKQUNfTVNHX0NIRUNLSU5HKFtBSVggNC4zIG9yIGxhdGVyXSkKQUNfUFJFUFJPQ19JRkVMU0UoWwojaWYgZGVmaW5lZChfQUlYKSAmJiBkZWZpbmVkKF9BSVg0MykKcHJpbnRmKCJqdXN0IGZpbmUiKTsKI2Vsc2UKI2Vycm9yICJ0aGlzIGlzIG5vdCBBSVggNC4zIG9yIGxhdGVyIgojZW5kaWYKXSwKIFsgQUNfTVNHX1JFU1VMVChbeWVzXSkKICAgUkVDRU5UQUlYPXllcwogICBPUFRfVEhSRUFEPW9mZiBdLAogWyBBQ19NU0dfUkVTVUxUKFtub10pIF0KKQoKQUNfQVJHX0VOQUJMRSh0aHJlYWQsZG5sCkFDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtdGhyZWFkXSxbZG9uJ3QgbG9vayBmb3IgdGhyZWFkLXNhZmUgZnVuY3Rpb25zXSkKQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXRocmVhZF0sW2xvb2sgZm9yIHRocmVhZC1zYWZlIGZ1bmN0aW9uc10pLApbIGNhc2UgIiRlbmFibGV2YWwiIGluCiAgbm8pCiAgICBPUFRfVEhSRUFEPW9mZgogICAgQUNfTVNHX1dBUk4obGliY3VybCB3aWxsIG5vdCBnZXQgYnVpbHQgdXNpbmcgdGhyZWFkLXNhZmUgZnVuY3Rpb25zKQogICAgOzsKICAqKQogICAgOzsKICBlc2FjCl0KKQoKaWYgdGVzdCBYIiRPUFRfVEhSRUFEIiA9IFhvZmYKdGhlbgogIEFDX0RFRklORShESVNBQkxFRF9USFJFQURTQUZFLCAxLCBcClNldCB0byBleHBsaWNpdGx5IHNwZWNpZnkgd2UgZG9uJ3Qgd2FudCB0byB1c2UgdGhyZWFkLXNhZmUgZnVuY3Rpb25zKQplbHNlCiAgaWYgdGVzdCAiJGlwdjYiICE9ICJ5ZXMiOyB0aGVuCiAgICBkbmwgZGlnIGFyb3VuZCBmb3IgZ2V0aG9zdGJ5bmFtZV9yKCkKICAgIENVUkxfQ0hFQ0tfR0VUSE9TVEJZTkFNRV9SKCkKCiAgICBkbmwgZGlnIGFyb3VuZCBmb3IgZ2V0aG9zdGJ5YWRkcl9yKCkKICAgIGRubCBDVVJMX0NIRUNLX0dFVEhPU1RCWUFERFJfUigpCiAgZmkKCiAgZG5sIHBva2UgYXJvdW5kIGZvciBpbmV0X250b2FfcigpCiAgQ1VSTF9DSEVDS19JTkVUX05UT0FfUigpCgogIGRubCBpcyB0aGVyZSBhIGxvY2FsdGltZV9yKCkKICBDVVJMX0NIRUNLX0xPQ0FMVElNRV9SKCkKCiAgZG5sIGlzIHRoZXJlIGEgc3RyZXJyb3JfcigpCiAgQ1VSTF9DSEVDS19TVFJFUlJPUl9SKCkKCiAgY2hlY2tmb3JfZ210aW1lX3I9InllcyIKZmkKCmRubCBmb3IgcmVjZW50IEFJWCB2ZXJzaW9ucywgd2Ugc2tpcCBhbGwgdGhlIHRocmVhZC1zYWZlIGNoZWNrcyBhYm92ZSBzaW5jZQpkbmwgdGhleSBjbGFpbSBhIHRocmVhZC1zYWZlIGxpYmMgdXNpbmcgdGhlIHN0YW5kYXJkIEFQSS4gQnV0IHRoZXJlIGFyZQpkbmwgc29tZSBmdW5jdGlvbnMgc3RpbGwgbm90IHRocmVhZC1zYWZlLiBDaGVjayBmb3IgdGhlc2UhCgpkbmwgTGV0J3MgaG9wZSB0aGlzIHNwbGl0IFVSTCByZW1haW5zIHdvcmtpbmc6CmRubCBodHRwOi8vcHVibGlibi5ib3VsZGVyLmlibS5jb20vZG9jX2xpbmsvZW5fVVMvYV9kb2NfbGliL2FpeHByZ2dkLyBcCmRubCBnZW5wcm9nYy90aHJlYWRfcXVpY2tfcmVmLmh0bQoKaWYgdGVzdCAieCRSRUNFTlRBSVgiID0gInh5ZXMiOyB0aGVuCgogIEFDX0RFRklORShfVEhSRUFEX1NBRkUsIDEsIFtkZWZpbmUgdGhpcyBpZiB5b3UgbmVlZCBpdCB0byBjb21waWxlIHRocmVhZC1zYWZlIGNvZGVdKQoKICBkbmwgY2hlY2sgaWYgdGhpcyBpcyB0aGUgSU1CIHhsYyBjb21waWxlcgogIGRubCBEZXRhaWxzIHRoYW5rcyB0byA9PiBodHRwOi8vcHJlZGVmLnNvdXJjZWZvcmdlLm5ldC8KICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIHRoaXMgaXMgdGhlIHhsYyBjb21waWxlcl0pCiAgQUNfRUdSRVBfQ1BQKFteX194bENfX10sIFtfX3hsQ19fXSwKICAgICAgICAgZG5sIGFjdGlvbiBpZiB0aGUgdGV4dCBpcyBmb3VuZCwgdGhpcyBpdCBoYXMgbm90IGJlZW4gcmVwbGFjZWQgYnkgdGhlCiAgICAgICAgIGRubCBjcHAKICAgICAgICAgWExDPSJubyIKICAgICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKSwKICAgICAgICAgZG5sIHRoZSB0ZXh0IHdhcyBub3QgZm91bmQsIGl0IHdhcyByZXBsYWNlZCBieSB0aGUgY3BwCiAgICAgICAgIFhMQz0ieWVzIgogICAgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQogICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLXF0aHJlYWRlZCIKICAgICAgICkKCgogIGRubCBpcyB0aGVyZSBhIGxvY2FsdGltZV9yKCkKICBDVVJMX0NIRUNLX0xPQ0FMVElNRV9SKCkKCiAgZG5sIGlzIHRoZXJlIGEgc3RyZXJyb3JfcigpCiAgQ1VSTF9DSEVDS19TVFJFUlJPUl9SKCkKCiAgY2hlY2tmb3JfZ210aW1lX3I9InllcyIKZmkKCmlmIHRlc3QgeCRjcm9zc19jb21waWxpbmcgIT0geHllczsgdGhlbgoKICBpZiB0ZXN0IHgkY2hlY2tmb3JfZ210aW1lX3IgPSB4eWVzOyB0aGVuCgogICAgZG5sIGlmIGdtdGltZV9yIHdhcyBmb3VuZCwgdmVyaWZ5IHRoYXQgaXQgYWN0dWFsbCB3b3JrcywgYXMgKGF0IGxlYXN0KSBIUFVYCiAgICBkbmwgMTAuMjAgaXMga25vd24gdG8gaGF2ZSBhIGJ1Z2d5IG9uZS4gSWYgaXQgZG9lc24ndCB3b3JrLCBkaXNhYmxlIHVzZSBvZgogICAgZG5sIGl0LgoKICAgIEFDX01TR19DSEVDS0lORyhbaWYgZ210aW1lX3IgZXhpc3RzIGFuZCB3b3Jrc10pCiAgICBBQ19SVU5fSUZFTFNFKFtbCiAgICAjaW5jbHVkZSA8dGltZS5oPgogICAgaW50IG1haW4odm9pZCkKICAgIHsKICAgIHRpbWVfdCBsb2NhbCA9IDExNzAzNTI1ODc7CiAgICBzdHJ1Y3QgdG0gKmdtdDsKICAgIHN0cnVjdCB0bSBrZWVwZXI7CiAgICBwdXRlbnYoIlRaPUNTVDZDRFQiKTsKICAgIHR6c2V0KCk7CiAgICBnbXQgPSBnbXRpbWVfcigmbG9jYWwsICZrZWVwZXIpOwogICAgaWYoZ210KSB7CiAgICAgIHJldHVybiAwOwogICAgfQogICAgcmV0dXJuIDE7IC8qIGZhaWx1cmUgKi8KICAgIH0KICAgICBdXSwKICAgICBkbmwgc3VjY2VzcywgZG8gbm90aGluZwogICAgIEFDX01TR19SRVNVTFQoeWVzKQogICAgIEFDX0RFRklORShIQVZFX0dNVElNRV9SLCAxLCBbaWYgeW91IGhhdmUgKGEgd29ya2luZykgZ210aW1lX3JdKQogICAgICwKICAgICBkbmwgZmFpbHVyZSwgbm93IGRpc2FibGUgdGhlIGZ1bmN0aW9uCiAgICAgQUNfTVNHX1JFU1VMVChubykKICAgICwKICAgIGRubCBub3QgaW52b2tlZCB3aGVuIGNyb3NzY29tcGlsaW5nKQogICAgXSkKICBmaQplbHNlCiAgZG5sIGFuZCBmb3IgY3Jvc3Njb21waWxpbmdzCiAgQUNfQ0hFQ0tfRlVOQ1MoZ210aW1lX3IpCmZpCgoKZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZG5sIEJhY2sgdG8gIm5vcm1hbCIgY29uZmlndXJpbmcKZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCmRubCBDaGVja3MgZm9yIGhlYWRlciBmaWxlcy4KQUNfSEVBREVSX1NUREMKCmRubCBGaXJzdCBjaGVjayBmb3IgdGhlIHZlcnkgbW9zdCBiYXNpYyBoZWFkZXJzLiBUaGVuIHdlIGNhbiB1c2UgdGhlc2UKZG5sIG9uZXMgYXMgZGVmYXVsdC1oZWFkZXJzIHdoZW4gY2hlY2tpbmcgZm9yIHRoZSByZXN0IQpBQ19DSEVDS19IRUFERVJTKAogICAgICAgIHN5cy90eXBlcy5oIFwKICAgICAgICBzeXMvdGltZS5oIFwKICAgICAgICBzeXMvc2VsZWN0LmggXAogICAgICAgIHN5cy9zb2NrZXQuaCBcCiAgICAgICAgc3lzL2lvY3RsLmggXAogICAgICAgIGFzc2VydC5oIFwKICAgICAgICB1bmlzdGQuaCBcCiAgICAgICAgbWFsbG9jLmggXAogICAgICAgIHN0ZGxpYi5oIFwKICAgICAgICBsaW1pdHMuaCBcCiAgICAgICAgYXJwYS9pbmV0LmggXAogICAgICAgIG5ldC9pZi5oIFwKICAgICAgICBuZXRpbmV0L2luLmggXAogICAgICAgIG5ldGluZXQvdGNwLmggXAogICAgICAgIG5ldGRiLmggXAogICAgICAgIHN5cy9zb2NraW8uaCBcCiAgICAgICAgc3lzL3N0YXQuaCBcCiAgICAgICAgc3lzL3BhcmFtLmggXAogICAgICAgIHRlcm1pb3MuaCBcCiAgICAgICAgdGVybWlvLmggXAogICAgICAgIHNndHR5LmggXAogICAgICAgIGZjbnRsLmggXAogICAgICAgIGRsZmNuLmggXAogICAgICAgIGFsbG9jYS5oIFwKICAgICAgICB3aW5zb2NrLmggXAogICAgICAgIHdpbnNvY2syLmggXAogICAgICAgIHRpbWUuaCBcCiAgICAgICAgaW8uaCBcCiAgICAgICAgcHdkLmggXAogICAgICAgIHV0aW1lLmggXAogICAgICAgIHN5cy91dGltZS5oIFwKICAgICAgICBzeXMvcG9sbC5oIFwKICAgICAgICBzeXMvcmVzb3VyY2UuaCBcCiAgICAgICAgbGliZ2VuLmggXAogICAgICAgIGxvY2FsZS5oIFwKICAgICAgICBlcnJuby5oIFwKICAgICAgICBzZXRqbXAuaCwKZG5sIHRvIGRvIGlmIG5vdCBmb3VuZApbXSwKZG5sIHRvIGRvIGlmIGZvdW5kCltdLApkbmwgZGVmYXVsdCBpbmNsdWRlcwpbCiNpZmRlZiBIQVZFX1NZU19UWVBFU19ICiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19USU1FX0gKI2luY2x1ZGUgPHN5cy90aW1lLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9TWVNfU0VMRUNUX0gKI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojZW5kaWYKI2lmZGVmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgpdCikKCmRubCBDaGVja3MgZm9yIHR5cGVkZWZzLCBzdHJ1Y3R1cmVzLCBhbmQgY29tcGlsZXIgY2hhcmFjdGVyaXN0aWNzLgpBQ19DX0NPTlNUCkFDX1RZUEVfU0laRV9UCkFDX0hFQURFUl9USU1FCgpBQ19DSEVDS19TSVpFT0YoY3VybF9vZmZfdCwgLFsKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlICIkc3JjZGlyL2luY2x1ZGUvY3VybC9jdXJsLmgiCl0pCkFDX0NIRUNLX1NJWkVPRihzaXplX3QpCkFDX0NIRUNLX1NJWkVPRihsb25nKQpBQ19DSEVDS19TSVpFT0YodGltZV90KQoKQUNfQ0hFQ0tfVFlQRShsb25nIGxvbmcsCiAgIFtBQ19ERUZJTkUoSEFWRV9MT05HTE9ORywgMSwgW2lmIHlvdXIgY29tcGlsZXIgc3VwcG9ydHMgbG9uZyBsb25nXSldCiAgIGxvbmdsb25nPSJ5ZXMiICAKKQoKaWYgdGVzdCAieHllcyIgPSAieCRsb25nbG9uZyI7IHRoZW4KICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIG51bWJlckxMIHdvcmtzXSkKICBBQ19DT01QSUxFX0lGRUxTRShbbG9uZyBsb25nIHZhbCA9IDEwMDBMTDtdLAogICBbQUNfREVGSU5FKEhBVkVfTEwsIDEsIFtpZiB5b3VyIGNvbXBpbGVyIHN1cHBvcnRzIExMXSldCiAgIEFDX01TR19SRVNVTFQoeWVzKSwKICAgQUNfTVNHX1JFU1VMVChubykKICApCmZpCgoKIyBjaGVjayBmb3Igc3NpemVfdApBQ19DSEVDS19UWVBFKHNzaXplX3QsICwKICAgQUNfREVGSU5FKHNzaXplX3QsIGludCwgW3RoZSBzaWduZWQgdmVyc2lvbiBvZiBzaXplX3RdKSkKClRZUEVfU09DS0xFTl9UClRZUEVfSU5fQUREUl9UCgpUWVBFX1NPQ0tBRERSX1NUT1JBR0UKCkFDX0ZVTkNfU0VMRUNUX0FSR1RZUEVTCgpkbmwgQ2hlY2tzIGZvciBsaWJyYXJ5IGZ1bmN0aW9ucy4KZG5sIEFDX1BST0dfR0NDX1RSQURJVElPTkFMCkFDX1RZUEVfU0lHTkFMCmRubCBBQ19GVU5DX1ZQUklOVEYKQUNfQ0hFQ0tfRlVOQ1MoIHN0cnRvbGwgXAogICAgICAgICAgICAgICAgc29ja2V0IFwKICAgICAgICAgICAgICAgIHNlbGVjdCBcCiAgICAgICAgICAgICAgICBzdHJkdXAgXAogICAgICAgICAgICAgICAgc3Ryc3RyIFwKICAgICAgICAgICAgICAgIHN0cnRva19yIFwKICAgICAgICAgICAgICAgIHVuYW1lIFwKICAgICAgICAgICAgICAgIHN0cmNhc2VjbXAgXAogICAgICAgICAgICAgICAgc3RyaWNtcCBcCiAgICAgICAgICAgICAgICBzdHJjbXBpIFwKICAgICAgICAgICAgICAgIGdldGhvc3RieWFkZHIgXAogICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5IFwKICAgICAgICAgICAgICAgIGluZXRfYWRkciBcCiAgICAgICAgICAgICAgICBpbmV0X250b2EgXAogICAgICAgICAgICAgICAgaW5ldF9wdG9uIFwKICAgICAgICAgICAgICAgIHBlcnJvciBcCiAgICAgICAgICAgICAgICBjbG9zZXNvY2tldCBcCiAgICAgICAgICAgICAgICBzaWdpbnRlcnJ1cHQgXAogICAgICAgICAgICAgICAgc2lnYWN0aW9uIFwKICAgICAgICAgICAgICAgIHNpZ25hbCBcCiAgICAgICAgICAgICAgICBnZXRwYXNzX3IgXAogICAgICAgICAgICAgICAgc3RybGNhdCBcCiAgICAgICAgICAgICAgICBnZXRwd3VpZCBcCiAgICAgICAgICAgICAgICBnZXRldWlkIFwKICAgICAgICAgICAgICAgIGRsb3BlbiBcCiAgICAgICAgICAgICAgICB1dGltZSBcCiAgICAgICAgICAgICAgICBzaWdzZXRqbXAgXAogICAgICAgICAgICAgICAgYmFzZW5hbWUgXAogICAgICAgICAgICAgICAgc2V0bG9jYWxlIFwKICAgICAgICAgICAgICAgIGZ0cnVuY2F0ZSBcCiAgICAgICAgICAgICAgICBwaXBlIFwKICAgICAgICAgICAgICAgIHBvbGwgXAogICAgICAgICAgICAgICAgZ2V0cmxpbWl0IFwKICAgICAgICAgICAgICAgIHNldHJsaW1pdCwKZG5sIGlmIGZvdW5kCltdLApkbmwgaWYgbm90IGZvdW5kLCAkYWNfZnVuYyBpcyB0aGUgbmFtZSB3ZSBjaGVjayBmb3IKICBmdW5jPSIkYWNfZnVuYyIKICBBQ19NU0dfQ0hFQ0tJTkcoW2RlZXBlciBmb3IgJGZ1bmNdKQogIEFDX1RSWV9MSU5LKCBbXSwKICAgICAgICAgICAgICAgWyAkZnVuYyAoKTtdLAogICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKHllcyEpCiAgICAgICAgICAgICAgIGV2YWwgImFjX2N2X2Z1bmNfJGZ1bmM9eWVzIgogICAgICAgICAgICAgICBkZWY9YGVjaG8gIkhBVkVfJGZ1bmMiIHwgdHIgJ2EteicgJ0EtWidgCiAgICAgICAgICAgICAgIEFDX0RFRklORV9VTlFVT1RFRCgkZGVmLCAxLCBbSWYgeW91IGhhdmUgJGZ1bmNdKSwKICAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChidXQgc3RpbGwgbm8pCiAgICAgICAgICAgICAgICkKCikKCmRubCBGb3Igc29tZSByZWFzb24sIHRoZSBjaGVjayBhYm92ZSBkb2Vzbid0IHByb3Blcmx5IGRldGVjdCBzZWxlY3QoKSB3aXRoCmRubCBNc3lzL01pbmd3CmlmIHRlc3QgIiRhY19jdl9mdW5jX3NlbGVjdCIgIT0gInllcyI7IHRoZW4KICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzZWxlY3QgaW4gd3MyXzMyXSkKICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPHdpbnNvY2syLmg+XSwKICAgICAgICAgICAgICAgW3NlbGVjdCgwLChmZF9zZXQgKilOVUxMLChmZF9zZXQgKilOVUxMLChmZF9zZXQgKilOVUxMLChzdHJ1Y3QgdGltZXZhbCAqKU5VTEwpO10sCiAgICAgICAgICAgICAgIFsgZG5sIHdvcmtlZCEKICAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKICAgICAgICAgICAgICAgSEFWRV9TRUxFQ1Q9IjEiCiAgICAgICAgICAgICAgIEFDX0RFRklORV9VTlFVT1RFRChIQVZFX1NFTEVDVCwxKV0sCiAgICAgICAgICAgICAgIFtBQ19NU0dfRVJST1IoWW91IGNhbid0IGNvbXBpbGUgd2l0aG91dCBhIHNlbGVjdCldCiAgICAgICAgICAgICApCmZpCgpkbmwgc2lnc2V0am1wKCkgbWlnaHQgYmUgYSBtYWNybyBhbmQgbm8gZnVuY3Rpb24gc28gaWYgaXQgaXNuJ3QgZm91bmQgYWxyZWFkeQpkbmwgd2UgbWFrZSBhbiBleHRyYSBjaGVjayBoZXJlIQppZiB0ZXN0ICIkYWNfY3ZfZnVuY19zaWdzZXRqbXAiICE9ICJ5ZXMiOyB0aGVuCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igc2lnc2V0am1wIGRlZmluZWQgYXMgbWFjcm9dKQogIEFDX1RSWV9MSU5LKCBbI2luY2x1ZGUgPHNldGptcC5oPl0sCiAgICAgICAgICAgICAgIFtzaWdqbXBfYnVmIGptcGVudjsKICAgICAgICAgICAgICAgIHNpZ3NldGptcChqbXBlbnYsIDEpO10sCiAgICAgICAgICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQogICAgICAgICAgICAgICBBQ19ERUZJTkUoSEFWRV9TSUdTRVRKTVAsIDEsIFtJZiB5b3UgaGF2ZSBzaWdzZXRqbXBdKSwKICAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChubykKICAgICAgICAgICAgICAgKQpmaQoKQUNfQ0hFQ0tfREVDTChiYXNlbmFtZSwgLAogICAgICAgICAgICAgIEFDX0RFRklORShORUVEX0JBU0VOQU1FX1BST1RPLCAxLCBbSWYgeW91IGxhY2sgYSBmaW5lIGJhc2VuYW1lKCkgcHJvdG90eXBlXSksCiNpZmRlZiBIQVZFX1NUUklOR19ICiNpbmNsdWRlIDxzdHJpbmcuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX0xJQkdFTl9ICiNpbmNsdWRlIDxsaWJnZW4uaD4KI2VuZGlmCikKCkFDX01TR19DSEVDS0lORyhbaWYgd2UgYXJlIE1hYyBPUyBYICh0byBkaXNhYmxlIHBvbGwpXSkKZGlzYWJsZV9wb2xsPW5vCmNhc2UgJGhvc3QgaW4KICAqLSotZGFyd2luKikKICAgIGRpc2FibGVfcG9sbD0ieWVzIjsKICAgIDs7CiAgKikKICAgIDs7CmVzYWMKQUNfTVNHX1JFU1VMVCgkZGlzYWJsZV9wb2xsKQoKaWYgdGVzdCAiJGRpc2FibGVfcG9sbCIgPSAibm8iOyB0aGVuCgogIGRubCBwb2xsKCkgbWlnaHQgYmUgYmFkbHkgZW11bGF0ZWQsIGFzIGluIE1hYyBPUyBYIDEwLjMgKGFuZCBvdGhlciBCU0RzPykgYW5kCiAgZG5sIHRvIGZpbmQgb3V0IHdlIG1ha2UgYW4gZXh0cmEgY2hlY2sgaGVyZSEKICBpZiB0ZXN0ICIkYWNfY3ZfZnVuY19wb2xsIiA9ICJ5ZXMiOyB0aGVuCiAgICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIHBvbGwgd29ya3Mgd2l0aCBOVUxMIGlucHV0c10pCiAgICBBQ19SVU5fSUZFTFNFKFsKI2lmZGVmIEhBVkVfU1lTX1BPTExfSAojaW5jbHVkZSA8c3lzL3BvbGwuaD4KI2VuZGlmCgogIGludCBtYWluKHZvaWQpCiAgewogICAgLyogbWFrZSB0aGlzIHJldHVybiAwID09IHRpbWVvdXQgc2luY2UgdGhlcmUncyBub3RoaW5nIHRvIHJlYWQgZnJvbSAqLwogICAgcmV0dXJuIHBvbGwoKHZvaWQgKikwLCAwLCAxMCAvKm1zKi8pOwogIH0KXSwKICAgIEFDX01TR19SRVNVTFQoeWVzKQogICAgQUNfREVGSU5FKEhBVkVfUE9MTF9GSU5FLCAxLCBbSWYgeW91IGhhdmUgYSBmaW5lIHBvbGxdKSwKICAgIEFDX01TR19SRVNVTFQobm8pLAogICAgQUNfTVNHX1JFU1VMVChjcm9zcy1jb21waWxpbmcgYXNzdW1lcyB5ZXMpCiAgICBBQ19ERUZJTkUoSEFWRV9QT0xMX0ZJTkUsIDEsIFtJZiB5b3UgaGF2ZSBhIGZpbmUgcG9sbF0pCiAgICApIGRubCBlbmQgb2YgQUNfUlVOX0lGRUxTRQogIGZpIGRubCBwb2xsKCkgd2FzIGZvdW5kCmZpIGRubCBwb2xsKCktY2hlY2sgaXMgbm90IGRpc2FibGVkCgoKQUNfUEFUSF9QUk9HKCBQRVJMLCBwZXJsLCAsIAogICRQQVRIOi91c3IvbG9jYWwvYmluL3Blcmw6L3Vzci9iaW4vOi91c3IvbG9jYWwvYmluICkKQUNfU1VCU1QoUEVSTCkKCkFDX1BBVEhfUFJPR1MoIE5ST0ZGLCBnbnJvZmYgbnJvZmYsICwgCiAgJFBBVEg6L3Vzci9iaW4vOi91c3IvbG9jYWwvYmluICkKQUNfU1VCU1QoTlJPRkYpCgppZiB0ZXN0IC1uICIkTlJPRkYiOyB0aGVuCiAgZG5sIG9ubHkgY2hlY2sgZm9yIG5yb2ZmIG9wdGlvbnMgaWYgYW4gbnJvZmYgY29tbWFuZCB3YXMgZm91bmQKCiAgQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gdXNlICpucm9mZiB0byBnZXQgcGxhaW4gdGV4dCBmcm9tIG1hbiBwYWdlc10pCiAgTUFOT1BUPSItbWFuIgogIG1hbmNoZWNrPWBlY2hvIGZvbyB8ICROUk9GRiAkTUFOT1BUIDI+L2Rldi9udWxsYAogIGlmIHRlc3QgLXogIiRtYW5jaGVjayI7IHRoZW4KICAgIE1BTk9QVD0iLW1hbmRvYyIKICAgbWFuY2hlY2s9YGVjaG8gZm9vIHwgJE5ST0ZGICRNQU5PUFQgMj4vZGV2L251bGxgCiAgICBpZiB0ZXN0IC16ICIkbWFuY2hlY2siOyB0aGVuCiAgICAgIE1BTk9QVD0iIgogICAgICBBQ19NU0dfUkVTVUxUKFtmYWlsZWRdKQogICAgICBBQ19NU0dfV0FSTihbZm91bmQgbm8gKm5yb2ZmIG9wdGlvbiB0byBnZXQgcGxhaW50ZXh0IGZyb20gbWFuIHBhZ2VzXSkKICAgIGVsc2UKICAgICAgQUNfTVNHX1JFU1VMVChbJE1BTk9QVF0pCiAgICBmaQogIGVsc2UKICAgIEFDX01TR19SRVNVTFQoWyRNQU5PUFRdKQogIGZpCiAgQUNfU1VCU1QoTUFOT1BUKQpmaQoKaWYgdGVzdCAteiAiJE1BTk9QVCIKdGhlbgogIGRubCBpZiBubyBucm9mZiB0b29sIHdhcyBmb3VuZCwgb3Igbm8gb3B0aW9uIHRoYXQgY291bGQgY29udmVydCBtYW4gcGFnZXMKICBkbmwgd2FzIGZvdW5kLCB0aGVuIGRpc2FibGUgdGhlIGJ1aWx0LWluIG1hbnVhbCBzdHVmZgogIEFDX01TR19XQVJOKFtkaXNhYmxpbmcgYnVpbHQtaW4gbWFudWFsXSkKICBVU0VfTUFOVUFMPSJubyI7CmZpCgpkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkbmwgSWYgdGhlIG1hbnVhbCB2YXJpYWJsZSBzdGlsbCBpcyBzZXQsIHRoZW4gd2UgZ28gd2l0aCBwcm92aWRpbmcgYSBidWlsdC1pbgpkbmwgbWFudWFsCgppZiB0ZXN0ICIkVVNFX01BTlVBTCIgPSAiMSI7IHRoZW4KICBBQ19ERUZJTkUoVVNFX01BTlVBTCwgMSwgW0lmIHlvdSB3YW50IHRvIGJ1aWxkIGN1cmwgd2l0aCB0aGUgYnVpbHQtaW4gbWFudWFsXSkKICBjdXJsX21hbnVhbF9tc2c9ImVuYWJsZWQiCmZpCgpkbmwgc2V0IHZhcmlhYmxlIGZvciB1c2UgaW4gYXV0b21ha2VmaWxlKHMpCkFNX0NPTkRJVElPTkFMKFVTRV9NQU5VQUwsIHRlc3QgeCIkVVNFX01BTlVBTCIgPSB4MSkKCkFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgYXJlc10pCkFDX0FSR19FTkFCTEUoYXJlcywKQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWFyZXM9UEFUSF0sW0VuYWJsZSBhcmVzIGZvciBuYW1lIGxvb2t1cHNdKQpBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWFyZXNdLFtEaXNhYmxlIGFyZXMgZm9yIG5hbWUgbG9va3Vwc10pLApbIGNhc2UgIiRlbmFibGV2YWwiIGluCiAgbm8pCiAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQogICAgICAgOzsKICAqKSAgIEFDX01TR19SRVNVTFQoeWVzKQoKICAgICAgIGlmIHRlc3QgIngkSVBWNl9FTkFCTEVEIiA9ICJ4MSI7IHRoZW4KICAgICAgICAgQUNfTVNHX0VSUk9SKFthcmVzIGRvZXNuJ3Qgd29yayB3aXRoIGlwdjYsIGRpc2FibGUgaXB2NiB0byB1c2UgYXJlc10pCiAgICAgICBmaQoKICAgICAgIEFDX0RFRklORShVU0VfQVJFUywgMSwgW0RlZmluZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgYXJlcyBzdXBwb3J0XSkKICAgICAgIGRubCBzdWJzdGl0dXRlIEhBVkVfQVJFUyBmb3IgY3VybC1jb25maWcgYW5kIHNpbWlsYXIKICAgICAgIEhBVkVfQVJFUz0iMSIKICAgICAgIEFDX1NVQlNUKEhBVkVfQVJFUykKICAgICAgIGN1cmxfYXJlc19tc2c9ImVuYWJsZWQiCgogICAgICAgTElCUz0iLWxjYXJlcyAkTElCUyIKCiAgICAgICBkbmwgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGRlZmF1bHQgdG8gaW5jbHVkZXMvbGliIGluIHNyY2Rpci9hcmVzCiAgICAgICBkbmwgSWYgYSB2YWx1ZSBpcyBzcGVjaWZpZWQgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBsaWJzIGFyZSBpbiAkdmFsL2xpYgogICAgICAgZG5sIGFuZCB0aGUgaW5jbHVkZXMgYXJlIGluICR2YWwvaW5jbHVkZS4gVGhpcyBpcyB0aGUgZGVmYXVsdCBzZXR1cCBmb3IKICAgICAgIGRubCBhcmVzIHNvIGl0IHNob3VsZCBub3QgYmUgYSBwcm9ibGVtLgogICAgICAgaWYgdGVzdCAieCRlbmFibGV2YWwiID0gInh5ZXMiIDsgdGhlbgogICAgICAgICBpZiB0ZXN0IC1kICIkc3JjZGlyL2FyZXMiOyB0aGVuCiAgICAgICAgICAgIGFyZXNlbWJlZGRlZD0ieWVzIgogICAgICAgICAgICBBQ19DT05GSUdfU1VCRElSUyhhcmVzKQogICAgICAgICAgICBhcmVzaW5jPWBjZCAkc3JjZGlyL2FyZXMgJiYgcHdkYAogICAgICAgICAgICBDUFBGTEFHUz0iJENQUEZMQUdTIC1JJGFyZXNpbmMiCgogICAgICAgICAgICBkbmwgdGhlIHB3ZD0gYmVsb3cgY2Fubm90ICdjZCcgaW50byB0aGUgYXJlcyBkaXIgdG8gZ2V0IHRoZSBmdWxsCiAgICAgICAgICAgIGRubCBwYXRoIHRvIGl0LCBzaW5jZSBpdCBtYXkgbm90IGV4aXN0IHlldCBpZiB3ZSBidWlsZCBvdXRzaWRlIG9mCiAgICAgICAgICAgIGRubCB0aGUgc291cmNlIHRyZWUKICAgICAgICAgICAgcHdkPWBwd2RgCiAgICAgICAgICAgIExERkxBR1M9IiRMREZMQUdTIC1MJHB3ZC9hcmVzIgogICAgICAgICBmaQogICAgICAgZWxzZQogICAgICAgICBDUFBGTEFHUz0iJENQUEZMQUdTIC1JJGVuYWJsZXZhbC9pbmNsdWRlIgogICAgICAgICBMREZMQUdTPSIkTERGTEFHUyAtTCRlbmFibGV2YWwvbGliIgogICAgICAgZmkKCiAgICAgICBpZiB0ZXN0IC16ICIkYXJlc2VtYmVkZGVkIjsgdGhlbgogICAgICAgICBkbmwgdmVyaWZ5IHRoYXQgYSBzdWZmaWNpZW50IGMtYXJlcyBpcyBoZXJlIGlmIHdlIGhhdmUgcG9pbnRlZCBvbmUKICAgICAgICAgZG5sIG91dCBhbmQgZG9uJ3QgdXNlIHRoZSAiZW1iZWRkZWQiIGFyZXMgZGlyIChpbiB3aGljaCBjYXNlIHdlIGRvbid0CiAgICAgICAgIGRubCBjaGVjayBpdCBiZWNhdXNlIGl0IG1pZ2h0IG5vdCBoYXZlIGJlZW4gYnVpbHQgeWV0KQogICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3RoYXQgYy1hcmVzIGlzIGdvb2QgYW5kIHJlY2VudCBlbm91Z2hdKQogICAgICAgICBBQ19MSU5LX0lGRUxTRSggWwojaW5jbHVkZSA8YXJlcy5oPgovKiBwcm92aWRlIGEgc2V0IG9mIGR1bW15IGZ1bmN0aW9ucyBpbiBjYXNlIGMtYXJlcyB3YXMgYnVpbHQgd2l0aCBkZWJ1ZyAqLwp2b2lkIGN1cmxfZG9mcmVlKCkgeyB9CnZvaWQgY3VybF9zY2xvc2UoKSB7IH0Kdm9pZCBjdXJsX2RvbWFsbG9jKCkgeyB9CgppbnQgbWFpbih2b2lkKQp7CiAgYXJlc19jaGFubmVsIGNoYW5uZWw7CiAgYXJlc19jYW5jZWwoY2hhbm5lbCk7CiAgcmV0dXJuIDA7Cn0KXSwKICAgICAgICAgIEFDX01TR19SRVNVTFQoeWVzKSwKICAgICAgICAgIEFDX01TR19SRVNVTFQobm8pCiAgICAgICAgICBBQ19NU0dfRVJST1IoW2MtYXJlcyBsaWJyYXJ5IGRlZmVjdGl2ZSBvciB0b28gb2xkXSkKICAgICAgICAgICkKICAgICAgIGZpCiAgICAgICA7OwogIGVzYWMgXSwKICAgICAgIEFDX01TR19SRVNVTFQobm8pCikKCmRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZG5sIGRpc2FibGUgdmVyYm9zZSB0ZXh0IHN0cmluZ3MKZG5sCkFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgdmVyYm9zZSBzdHJpbmdzXSkKQUNfQVJHX0VOQUJMRSh2ZXJib3NlLApBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtdmVyYm9zZV0sW0VuYWJsZSB2ZXJib3NlIHN0cmluZ3NdKQpBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLXZlcmJvc2VdLFtEaXNhYmxlIHZlcmJvc2Ugc3RyaW5nc10pLApbIGNhc2UgIiRlbmFibGV2YWwiIGluCiAgbm8pCiAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQogICAgICAgQUNfREVGSU5FKENVUkxfRElTQUJMRV9WRVJCT1NFX1NUUklOR1MsIDEsIFt0byBkaXNhYmxlIHZlcmJvc2Ugc3RyaW5nc10pCiAgICAgICBBQ19TVUJTVChDVVJMX0RJU0FCTEVfVkVSQk9TRV9TVFJJTkdTKQogICAgICAgY3VybF92ZXJib3NlX21zZz0ibm8iCiAgICAgICA7OwogICopICAgQUNfTVNHX1JFU1VMVCh5ZXMpCiAgICAgICA7OwogIGVzYWMgXSwKICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQopCgpkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRubCBlbmFibGUgU1NQSSBzdXBwb3J0CmRubApBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gZW5hYmxlIFNTUEkgc3VwcG9ydCAod2luMzIgYnVpbGRzIG9ubHkpXSkKQUNfQVJHX0VOQUJMRShzc3BpLApBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtc3NwaV0sW0VuYWJsZSBTU1BJXSkKQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1zc3BpXSxbRGlzYWJsZSBTU1BJXSksClsgY2FzZSAiJGVuYWJsZXZhbCIgaW4KICB5ZXMpCiAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKICAgICAgIEFDX0RFRklORShVU0VfV0lORE9XU19TU1BJLCAxLCBbdG8gZW5hYmxlIFNTUEkgc3VwcG9ydF0pCiAgICAgICBBQ19TVUJTVChVU0VfV0lORE9XU19TU1BJKQogICAgICAgTElCUz0iJExJQlMgLWxzZWN1cjMyIgogICAgICAgY3VybF9zc3BpX21zZz0ieWVzIgogICAgICAgOzsKICAqKQogICAgICAgQUNfTVNHX1JFU1VMVChubykKICAgICAgIDs7CiAgZXNhYyBdLAogICAgICAgQUNfTVNHX1JFU1VMVChubykKKQoKZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkbmwgbGFtZSBvcHRpb24gdG8gc3dpdGNoIG9uIGRlYnVnIG9wdGlvbnMKZG5sCkFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgZGVidWcgb3B0aW9uc10pCkFDX0FSR19FTkFCTEUoZGVidWcsCkFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1kZWJ1Z10sW0VuYWJsZSBwZWRhbnRpYyBkZWJ1ZyBvcHRpb25zXSkKQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1kZWJ1Z10sW0Rpc2FibGUgZGVidWcgb3B0aW9uc10pLApbIGNhc2UgIiRlbmFibGV2YWwiIGluCiAgbm8pCiAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQogICAgICAgOzsKICAqKSAgIEFDX01TR19SRVNVTFQoeWVzKQoKICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgLURDVVJMREVCVUciCiAgICBDRkxBR1M9IiRDRkxBR1MgLWciCgogICAgZG5sIHNldCBjb21waWxlciAiZGVidWciIG9wdGlvbnMgdG8gYmVjb21lIG1vcmUgcGlja3ksIGFuZCByZW1vdmUKICAgIGRubCBvcHRpbWl6ZSBvcHRpb25zIGZyb20gQ0ZMQUdTCiAgICBDVVJMX0NDX0RFQlVHX09QVFMKICAgICAgIDs7CiAgZXNhYwogXSwKICAgICAgIEFDX01TR19SRVNVTFQobm8pCikKCmRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZG5sIGRpc2FibGUgY3J5cHRvZ3JhcGhpYyBhdXRoZW50aWNhdGlvbgpkbmwKQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGVuYWJsZSBjcnlwdG9ncmFwaGljIGF1dGhlbnRpY2F0aW9uIG1ldGhvZHNdKQpBQ19BUkdfRU5BQkxFKGNyeXB0by1hdXRoLApBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtY3J5cHRvLWF1dGhdLFtFbmFibGUgY3J5cHRvZ3JhcGhpYyBhdXRoZW50aWNhdGlvbl0pCkFDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtY3J5cHRvLWF1dGhdLFtEaXNhYmxlIGNyeXB0b2dyYXBoaWMgYXV0aGVudGljYXRpb25dKSwKWyBjYXNlICIkZW5hYmxldmFsIiBpbgogIG5vKQogICAgICAgQUNfTVNHX1JFU1VMVChubykKICAgICAgIEFDX0RFRklORShDVVJMX0RJU0FCTEVfQ1JZUFRPX0FVVEgsIDEsIFt0byBkaXNhYmxlIGNyeXB0b2dyYXBoaWMgYXV0aGVudGljYXRpb25dKQogICAgICAgQUNfU1VCU1QoQ1VSTF9ESVNBQkxFX0NSWVBUT19BVVRIKQogICAgICAgOzsKICAqKSAgIEFDX01TR19SRVNVTFQoeWVzKQogICAgICAgOzsKICBlc2FjIF0sCiAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKKQoKZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkbmwgZGlzYWJsZSBjb29raWVzIHN1cHBvcnQKZG5sCkFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgc3VwcG9ydCBmb3IgY29va2llc10pCkFDX0FSR19FTkFCTEUoY29va2llcywKQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWNvb2tpZXNdLFtFbmFibGUgY29va2llcyBzdXBwb3J0XSkKQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1jb29raWVzXSxbRGlzYWJsZSBjb29raWVzIHN1cHBvcnRdKSwKWyBjYXNlICIkZW5hYmxldmFsIiBpbgogIG5vKQogICAgICAgQUNfTVNHX1JFU1VMVChubykKICAgICAgIEFDX0RFRklORShDVVJMX0RJU0FCTEVfQ09PS0lFUywgMSwgW3RvIGRpc2FibGUgY29va2llcyBzdXBwb3J0XSkKICAgICAgIEFDX1NVQlNUKENVUkxfRElTQUJMRV9DT09LSUVTKQogICAgICAgOzsKICAqKSAgIEFDX01TR19SRVNVTFQoeWVzKQogICAgICAgOzsKICBlc2FjIF0sCiAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKKQoKaWYgdGVzdCAieCR3czIiID0gInh5ZXMiOyB0aGVuCgogIGRubCBJZiB3czJfMzIgaXMgd2FudGVkLCBtYWtlIHN1cmUgaXQgaXMgdGhlIF9sYXN0XyBsaWIgaW4gTElCUyAobWFrZXMKICBkbmwgdGhpbmdzIHdvcmsgd2hlbiBidWlsdCB3aXRoIGMtYXJlcykuIEJ1dCB3ZSBjYW4ndCBqdXN0IG1vdmUgaXQgbGFzdAogIGRubCBzaW5jZSB0aGVuIG90aGVyIHN0dWZmIChTU0wpIHdvbid0IGJ1aWxkLiBTbyB3ZSBzaW1wbHkgYXBwZW5kIGl0IHRvIHRoZQogIGRubCBlbmQuCgogIExJQlM9IiRMSUJTIC1sd3MyXzMyIgoKZmkKCkFNX0NPTkRJVElPTkFMKENST1NTQ09NUElMSU5HLCB0ZXN0IHgkY3Jvc3NfY29tcGlsaW5nID0geHllcykKCkFDX0NPTkZJR19GSUxFUyhbTWFrZWZpbGUgXAoJICAgZG9jcy9NYWtlZmlsZSBcCiAgICAgICAgICAgZG9jcy9leGFtcGxlcy9NYWtlZmlsZSBcCiAgICAgICAgICAgZG9jcy9saWJjdXJsL01ha2VmaWxlIFwKCSAgIGluY2x1ZGUvTWFrZWZpbGUgXAoJICAgaW5jbHVkZS9jdXJsL01ha2VmaWxlIFwKCSAgIHNyYy9NYWtlZmlsZSBcCiAgICAgICAgICAgbGliL01ha2VmaWxlIFwKICAgICAgICAgICB0ZXN0cy9NYWtlZmlsZSBcCiAgICAgICAgICAgdGVzdHMvZGF0YS9NYWtlZmlsZSBcCiAgICAgICAgICAgdGVzdHMvc2VydmVyL01ha2VmaWxlIFwKICAgICAgICAgICB0ZXN0cy9saWJ0ZXN0L01ha2VmaWxlIFwKCSAgIHBhY2thZ2VzL01ha2VmaWxlIFwKCSAgIHBhY2thZ2VzL1dpbjMyL01ha2VmaWxlIFwKCSAgIHBhY2thZ2VzL1dpbjMyL2N5Z3dpbi9NYWtlZmlsZSBcCgkgICBwYWNrYWdlcy9MaW51eC9NYWtlZmlsZSBcCgkgICBwYWNrYWdlcy9MaW51eC9SUE0vTWFrZWZpbGUgXAoJICAgcGFja2FnZXMvTGludXgvUlBNL2N1cmwuc3BlYyBcCgkgICBwYWNrYWdlcy9MaW51eC9SUE0vY3VybC1zc2wuc3BlYyBcCiAgICAgICAgICAgcGFja2FnZXMvU29sYXJpcy9NYWtlZmlsZSBcCiAgICAgICAgICAgcGFja2FnZXMvRE9TL01ha2VmaWxlIFwKICAgICAgICAgICBwYWNrYWdlcy9FUE0vY3VybC5saXN0IFwKICAgICAgICAgICBwYWNrYWdlcy9FUE0vTWFrZWZpbGUgXAogICAgICAgICAgIHBhY2thZ2VzL3Ztcy9NYWtlZmlsZSBcCiAgICAgICAgICAgY3VybC1jb25maWcgXAogICAgICAgICAgIGxpYmN1cmwucGMKXSkKQUNfT1VUUFVUCgpBQ19NU0dfTk9USUNFKFtDb25maWd1cmVkIHRvIGJ1aWxkIGN1cmwvbGliY3VybDoKCiAgY3VybCB2ZXJzaW9uOiAgICAke1ZFUlNJT059CiAgSG9zdCBzZXR1cDogICAgICAke2hvc3R9CiAgSW5zdGFsbCBwcmVmaXg6ICAke3ByZWZpeH0KICBDb21waWxlcjogICAgICAgICR7Q0N9CiAgU1NMIHN1cHBvcnQ6ICAgICAke2N1cmxfc3NsX21zZ30KICB6bGliIHN1cHBvcnQ6ICAgICR7Y3VybF96bGliX21zZ30KICBrcmI0IHN1cHBvcnQ6ICAgICR7Y3VybF9rcmI0X21zZ30KICBHU1NBUEkgc3VwcG9ydDogICR7Y3VybF9nc3NfbXNnfQogIFNQTkVHTyBzdXBwb3J0OiAgJHtjdXJsX3NwbmVnb19tc2d9CiAgYy1hcmVzIHN1cHBvcnQ6ICAke2N1cmxfYXJlc19tc2d9CiAgaXB2NiBzdXBwb3J0OiAgICAke2N1cmxfaXB2Nl9tc2d9CiAgSUROIHN1cHBvcnQ6ICAgICAke2N1cmxfaWRuX21zZ30KICBCdWlsZCBsaWJjdXJsOiAgIFNoYXJlZD0ke2VuYWJsZV9zaGFyZWR9LCBTdGF0aWM9JHtlbmFibGVfc3RhdGljfSAKICBCdWlsdC1pbiBtYW51YWw6ICR7Y3VybF9tYW51YWxfbXNnfQogIFZlcmJvc2UgZXJyb3JzOiAgJHtjdXJsX3ZlcmJvc2VfbXNnfQogIFNTUEkgc3VwcG9ydDogICAgJHtjdXJsX3NzcGlfbXNnfQogIGNhIGNlcnQgcGF0aDogICAgJHtjYX0KXSkK