JCEKJCEgVGhpcyBmaWxlIGNvbmZpZ3VyZXMgdGhlIGJmZCBsaWJyYXJ5IGZvciB1c2Ugd2l0aCBvcGVuVk1TLgokIQokISBXZSBkbyBub3QgdXNlIHRoZSBjb25maWd1cmUgc2NyaXB0LCBzaW5jZSB3ZSBkbyBub3QgaGF2ZSAvYmluL3NoCiQhIHRvIGV4ZWN1dGUgaXQuCiQhCiQhIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKJCEgUmV3cml0dGVuIGJ5IFRyaXN0YW4gR2luZ29sZCAoZ2luZ29sZEBhZGFjb3JlLmNvbSkKJCEKJCEgICBDb3B5cmlnaHQgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KJCEKJCEgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKJCEgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKJCEgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKJCEgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KJCEgCiQhIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAokISBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgokISBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiQhIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiQhIAokISBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQokISBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQokISA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiQhCiQgYXJjaD1GJEdFVFNZSSgiQVJDSF9OQU1FIikKJCBhcmNoPUYkRURJVChhcmNoLCJMT1dFUkNBU0UiKQokaWYgYXJjaCAuZXFzLiAiYWxwaGEiIHRoZW4gdGFyZ2V0ID0gImFscGhhIgokaWYgYXJjaCAuZXFzLiAiaWE2NCIgdGhlbiB0YXJnZXQgPSAiaWE2NCIKJCEKJGlmIChhcmNoIC5lcXMuICJhbHBoYSIpIC5vci4gKGFyY2ggLmVxcy4gImlhNjQiKQokdGhlbgokIQokIHdyaXRlIHN5cyRvdXRwdXQgIkNvbmZpZ3VyaW5nIEJGRCBmb3IgJyd0YXJnZXQnIHRhcmdldCIKJCEKJCEKJCEgY29weSBiZmQtaW4yLmggdG8gYmZkLmgsIHJlcGxhY2luZyBAIG1hY3JvcwokIQokIGVkaXQvdHB1L25vam91cm5hbC9ub3NlY3Rpb24vbm9kaXNwbGF5L2NvbW1hbmQ9c3lzJGlucHV0IC0KICAgICAgICBbXWJmZC1pbjIuaCAvb3V0cHV0PVtdYmZkLmgKJERFQ0sKIQohICBDb3B5IGZpbGUsIGNoYW5naW5nIGxpbmVzIHdpdGggbWFjcm9zIChAQCkKIQohCiAgIHNldCAoc3VjY2VzcyxvZmYpOwogICB2ZmlsZSA6PSBDUkVBVEVfQlVGRkVSKCJ2ZmlsZSIsICJDT05GSUdVUkUuSU4iKTsKICAgcmFuZyA6PSBDUkVBVEVfUkFOR0UoQkVHSU5OSU5HX09GKHZmaWxlKSwgRU5EX09GKHZmaWxlKSk7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQU1fSU5JVF9BVVRPTUFLRShiZmQsICcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICB2ZXJzIDo9IENVUlJFTlRfTElORS0iKSI7CiAgIEVMU0U7CiAgICAgdmVycyA6PSAidW5rbm93biI7CiAgIEVORElGOwoKICAgZmlsZSA6PSBDUkVBVEVfQlVGRkVSKCJmaWxlIiwgR0VUX0lORk8oQ09NTUFORF9MSU5FLCAiZmlsZV9uYW1lIikpOwogICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YoZmlsZSksIEVORF9PRihmaWxlKSk7CgogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BWRVJTSU9OQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQodmVycyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0B3b3Jkc2l6ZUAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCc2NCcpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAYmZkX2RlZmF1bHRfdGFyZ2V0X3NpemVAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnNjQnKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0QklUX0xPTkdAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnMCcpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfTE9OR19MT05HQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJzEnKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0QklUX0xPTkdfTE9OR0AnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCcxJyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NF9CSVRfREVGSU5FREAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCdfX0RFQ0MnKTsKICAgICAgU1BMSVRfTElORTsKICAgICAgQ09QWV9URVhUKCcjaW5jbHVkZSA8aW50cy5oPicpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfNjRfQklUQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJ2ludDY0Jyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF9VXzY0X0JJVEAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCd1aW50NjQnKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUUFRSX1RAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgndWludDY0Jyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BiZmRfZmlsZV9wdHJAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnYmZkX3NpZ25lZF92bWEnKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgndW5zaWduZWQgQGJmZF9maWxlX3B0ckAgdWZpbGVfcHRyJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnYmZkX3ZtYSB1ZmlsZV9wdHInKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQHN1cHBvcnRzX3BsdWdpbnNAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnMCcpOwogICBFTkRJRjsKICAgV1JJVEVfRklMRShmaWxlLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJvdXRwdXRfZmlsZSIpKTsKICAgUVVJVAokICBFT0QKJAokZWxzZQokCiQgd3JpdGUgc3lzJG91dHB1dCAiQ29uZmlndXJpbmcgZm9yIFZheCB0YXJnZXQiCiQgdGFyZ2V0ID0gInZheCIKJCEKJCEgY29weSBiZmQtaW4yLmggdG8gYmZkLmgsIHJlcGxhY2luZyBAIG1hY3JvcwokIQokIHdyaXRlIHN5cyRvdXRwdXQgIkdlbmVyYXRlZCBgYmZkLmgnIGZyb20gYGJmZC1pbjIuaCcuIgokIGVkaXQvdHB1L25vam91cm5hbC9ub3NlY3Rpb24vbm9kaXNwbGF5L2NvbW1hbmQ9c3lzJGlucHV0IC0KICAgICAgICBbXWJmZC1pbjIuaCAvb3V0cHV0PVtdYmZkLmgKJERFQ0sKIQohICBDb3B5IGZpbGUsIGNoYW5naW5nIGxpbmVzIHdpdGggbWFjcm9zIChAQCkKIQohCiAgIHNldCAoc3VjY2VzcyxvZmYpOwogICB2ZmlsZSA6PSBDUkVBVEVfQlVGRkVSKCJ2ZmlsZSIsICJDT05GSUdVUkUuSU4iKTsKICAgcmFuZyA6PSBDUkVBVEVfUkFOR0UoQkVHSU5OSU5HX09GKHZmaWxlKSwgRU5EX09GKHZmaWxlKSk7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQU1fSU5JVF9BVVRPTUFLRShiZmQsICcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICB2ZXJzIDo9IENVUlJFTlRfTElORS0iKSI7CiAgIEVMU0U7CiAgICAgdmVycyA6PSAidW5rbm93biI7CiAgIEVORElGOwoKICAgZmlsZSA6PSBDUkVBVEVfQlVGRkVSKCJmaWxlIiwgR0VUX0lORk8oQ09NTUFORF9MSU5FLCAiZmlsZV9uYW1lIikpOwogICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YoZmlsZSksIEVORF9PRihmaWxlKSk7CgogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BWRVJTSU9OQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQodmVycyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0B3b3Jkc2l6ZUAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCczMicpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfNjRCSVRfTE9OR0AnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCcwJyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NF9CSVRfREVGSU5FREAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCdfX0RFQ0MnKTsKICAgICAgU1BMSVRfTElORTsKICAgICAgQ09QWV9URVhUKCcjaW5jbHVkZSA8aW50cy5oPicpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfNjRfQklUQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJ2ludDY0Jyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF9VXzY0X0JJVEAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCd1aW50NjQnKTsKICAgRU5ESUY7CiAgIFdSSVRFX0ZJTEUoZmlsZSwgR0VUX0lORk8oQ09NTUFORF9MSU5FLCAib3V0cHV0X2ZpbGUiKSk7CiAgIFFVSVQKJCAgRU9ECiRlbmRpZgokCiQhCiQhIGNyZWF0ZSBiZmR2ZXIuaAokIQokIHdyaXRlIHN5cyRvdXRwdXQgIkdlbmVyYXRlIGBiZmR2ZXIuaCcgZnJvbSAndmVyc2lvbi5oJyBhbmQgYGNvbmZpZ3VyZS5pbicuIgokIGVkaXQvdHB1L25vam91cm5hbC9ub3NlY3Rpb24vbm9kaXNwbGF5L2NvbW1hbmQ9c3lzJGlucHV0IC0KICAgICAgICBbXXZlcnNpb24uaCAvb3V0cHV0PVtdYmZkdmVyLmgKJERFQ0sKIQohICBDb3B5IGZpbGUsIGNoYW5naW5nIGxpbmVzIHdpdGggbWFjcm9zIChAQCkKIQohCiAgIHNldCAoc3VjY2VzcyxvZmYpOwogICB2ZmlsZSA6PSBDUkVBVEVfQlVGRkVSKCJ2ZmlsZSIsICJjb25maWd1cmUuaW4iKTsKICAgcmFuZyA6PSBDUkVBVEVfUkFOR0UoQkVHSU5OSU5HX09GKHZmaWxlKSwgRU5EX09GKHZmaWxlKSk7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQU1fSU5JVF9BVVRPTUFLRShiZmQsICcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICB2ZXJzIDo9IENVUlJFTlRfTElORS0iKSI7CiAgIEVMU0U7CiAgICAgdmVycyA6PSAidW5rbm93biI7CiAgIEVORElGOwogICB2ZXJzbnVtIDo9IHZlcnMgLSAiLiIgLSAiLiI7CgogICBmaWxlIDo9IENSRUFURV9CVUZGRVIoImZpbGUiLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJmaWxlX25hbWUiKSk7CiAgIHJhbmcgOj0gQ1JFQVRFX1JBTkdFKEJFR0lOTklOR19PRihmaWxlKSwgRU5EX09GKGZpbGUpKTsKCiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQGJmZF92ZXJzaW9uQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQodmVyc251bSk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BiZmRfdmVyc2lvbl9zdHJpbmdAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnIicpOwogICAgICBDT1BZX1RFWFQodmVycyk7CiAgICAgIENPUFlfVEVYVCgnIicpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAYmZkX3ZlcnNpb25fcGFja2FnZUAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCciKEdOVSBCaW51dGlscykgIicpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAcmVwb3J0X2J1Z3NfdG9AJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnIjxodHRwOi8vd3d3LnNvdXJjZXdhcmUub3JnL2J1Z3ppbGxhLz4iJyk7CiAgIEVORElGOwogICBXUklURV9GSUxFKGZpbGUsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgIm91dHB1dF9maWxlIikpOwogICBRVUlUCiQgIEVPRAokIQokIQokISBjcmVhdGUgYmZkX3N0ZGludC5oCiQhCiQgd3JpdGUgc3lzJG91dHB1dCAiR2VuZXJhdGUgYGJmZF9zdGRpbnQuaCciCiQgY3JlYXRlIFtdYmZkX3N0ZGludC5oCiNpbmNsdWRlIDxpbnR0eXBlcy5oPgokIQokIQokISBjcmVhdGUgdGFyZ21hdGNoLmgKJCEKJCB3cml0ZSBzeXMkb3V0cHV0ICJHZW5lcmF0ZSBgdGFyZ21hdGNoLmgnIgokIG9wZW4vd3JpdGUgdGZpbGUgW110YXJnbWF0Y2guaAokIHdyaXRlIHRmaWxlICJ7ICIiIiArIHRhcmdldCArICItKi0qdm1zKiIiIiArICIsIgokIHdyaXRlIHRmaWxlICIjaWYgZGVmaW5lZCAoU0VMRUNUX1ZFQ1MpIgokIHdyaXRlIHRmaWxlICJTRUxFQ1RfVkVDUyIKJCB3cml0ZSB0ZmlsZSAiI2Vsc2UiCiQgd3JpdGUgdGZpbGUgIlVOU1VQUE9SVEVEX1RBUkdFVCIKJCB3cml0ZSB0ZmlsZSAiI2VuZGlmIgokIHdyaXRlIHRmaWxlICJ9LCIKJCBjbG9zZSB0ZmlsZQokIQokIQokISBjcmVhdGUgY29uZmlnLmgKJCEKJCB3cml0ZSBzeXMkb3V0cHV0ICJHZW5lcmF0ZSBgY29uZmlnLmgnIgokIGNyZWF0ZSBbXWNvbmZpZy5oCi8qIGNvbmZpZy5oLXZtcy4gIEdlbmVyYXRlZCBieSBoYW5kIGJ5IEtsYXVzIEvkbXBmLCBra2FlbXBmQGRpZHltdXMucm1pLmRlLiAgKi8KLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi8qIFdoZXRoZXIgbWFsbG9jIG11c3QgYmUgZGVjbGFyZWQgZXZlbiBpZiA8c3RkbGliLmg+IGlzIGluY2x1ZGVkLiAgKi8KLyogI3VuZGVmIE5FRURfREVDTEFSQVRJT05fTUFMTE9DICovCi8qIFdoZXRoZXIgZnJlZSBtdXN0IGJlIGRlY2xhcmVkIGV2ZW4gaWYgPHN0ZGxpYi5oPiBpcyBpbmNsdWRlZC4gICovCi8qICN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUgKi8KLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwovKiAjZGVmaW5lIEhBVkVfTU1BUCAxICovCi8qIERvIHdlIG5lZWQgdG8gdXNlIHRoZSBiIG1vZGlmaWVyIHdoZW4gb3BlbmluZyBiaW5hcnkgZmlsZXM/ICAqLwovKiAjdW5kZWYgVVNFX0JJTkFSWV9GT1BFTiAqLwovKiBOYW1lIG9mIGhvc3Qgc3BlY2lmaWMgaGVhZGVyIGZpbGUgdG8gaW5jbHVkZSBpbiB0cmFkLWNvcmUuYy4gICovCi8qICN1bmRlZiBUUkFEX0hFQURFUiAqLwovKiBEZWZpbmUgb25seSBpZiA8c3lzL3Byb2Nmcy5oPiBpcyBhdmFpbGFibGUgKmFuZCogaXQgZGVmaW5lcyBwcnN0YXR1c190LiAgKi8KLyogI3VuZGVmIEhBVkVfU1lTX1BST0NGU19IICovCi8qIERvIHdlIHJlYWxseSB3YW50IHRvIHVzZSBtbWFwIGlmIGl0J3MgYXZhaWxhYmxlPyAgKi8KLyogI3VuZGVmIFVTRV9NTUFQICovCi8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZmNudGwgZnVuY3Rpb24uICAqLwojZGVmaW5lIEhBVkVfRkNOVEwgMQovKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KI2RlZmluZSBIQVZFX0dFVFBBR0VTSVpFIDEKLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtYWR2aXNlIGZ1bmN0aW9uLiAgKi8KI2RlZmluZSBIQVZFX01BRFZJU0UgMQovKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1wcm90ZWN0IGZ1bmN0aW9uLiAgKi8KI2RlZmluZSBIQVZFX01QUk9URUNUIDEKLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICAqLwojZGVmaW5lIEhBVkVfRkNOVExfSCAxCi8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGRlZi5oPiBoZWFkZXIgZmlsZS4gICovCiNkZWZpbmUgSEFWRV9TVERERUZfSCAxCi8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCiNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCi8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCiNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCi8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwojZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2ZpbGUuaD4gaGVhZGVyIGZpbGUuICAqLwojZGVmaW5lIEhBVkVfU1lTX0ZJTEVfSCAxCi8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwojZGVmaW5lIEhBVkVfVElNRV9IIDEKLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLyogRGlzYWJsZSBOTFMgICovCiN1bmRlZiBFTkFCTEVfTkxTCiQhCiQgd3JpdGUgc3lzJG91dHB1dCAiQ29weSBzeXNkZXAuaCIKJCBjb3B5IFsuaG9zdHNdYWxwaGF2bXMuaCBzeXNkZXAuaAokCiQgd3JpdGUgc3lzJG91dHB1dCAiR2VuZXJhdGUgYnVpbGQuY29tIgokIQokIGlmIEFSQ0guZXFzLiJhbHBoYSIKJCB0aGVuCiQgICBjcmVhdGUgYnVpbGQuY29tCiRERUNLCiQgREVGUz0iIiJTRUxFQ1RfVkVDUz0mdm1zX2FscGhhX3ZlYyIiLCIrLQogICIiIlNFTEVDVF9BUkNISVRFQ1RVUkVTPSZiZmRfYWxwaGFfYXJjaCIiIgokIEZJTEVTPSJjcHUtYWxwaGEsdm1zLHZtcy1oZHIsdm1zLWdzZCx2bXMtdGlyLHZtcy1taXNjLCIKJEVPRAokIGVuZGlmCiQgaWYgQVJDSC5lcXMuImlhNjQiCiQgdGhlbgokICAgY3JlYXRlIGJ1aWxkLmNvbQokREVDSwokIERFRlM9IiIiU0VMRUNUX1ZFQ1M9JmJmZF9lbGY2NF9pYTY0X3Ztc192ZWMiIiwiKy0KICAiIiJTRUxFQ1RfQVJDSElURUNUVVJFUz0mYmZkX2lhNjRfYXJjaCIiIgokIEZJTEVTPSJjcHUtaWE2NCxlbGY2NC1pYTY0LGVsZi1zdHJ0YWIsY29yZWZpbGUsc3RhYnMsbWVyZ2UsZWxmLWVoLWZyYW1lLCIrLQogICJlbGZsaW5rLGVsZi1hdHRycyxkd2FyZjEsZWxmNjQsIgokRU9ECiQgY3JlYXRlIHN1YnN0eHgudHB1CiRERUNLCiAgIHNldCAoc3VjY2VzcyxvZmYpOwogICBmaWxlIDo9IENSRUFURV9CVUZGRVIoImZpbGUiLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJmaWxlX25hbWUiKSk7CiAgIGZvdW5kX3JhbmdlIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YoZmlsZSksIEJFR0lOTklOR19PRihmaWxlKSk7CgogICBMT09QCiAgICAgcmFuZyA6PSBDUkVBVEVfUkFOR0UgKEVORF9PRihmb3VuZF9yYW5nZSksRU5EX09GKGZpbGUpKTsKICAgICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ05OJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICAgIEVYSVRJRiBtYXRjaF9wb3MgPSAwOwogICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgIENPUFlfVEVYVCgnNjQnKTsKICAgRU5ETE9PUDsKICAgV1JJVEVfRklMRShmaWxlLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJvdXRwdXRfZmlsZSIpKTsKICAgUVVJVAokICBFT0QKJCB3cml0ZSBzeXMkb3V0cHV0ICJHZW5lcmF0ZSBlbGY2NC1pYTY0LmMgZnJvbSBlbGZ4eC1pYTY0LmMiCiQgZWRpdC90cHUvbm9qb3VybmFsL25vc2VjdGlvbi9ub2Rpc3BsYXkvY29tbWFuZD1zdWJzdHh4LnRwdSAtCiAgICAgICAgW11lbGZYWC1pYTY0LmMgL291dHB1dD1bXWVsZjY0LWlhNjQuYwokIHdyaXRlIHN5cyRvdXRwdXQgIkdlbmVyYXRlIGVsZjY0LXRhcmdldC5oIGZyb20gZWxmeHgtdGFyZ2V0LmgiCiQgZWRpdC90cHUvbm9qb3VybmFsL25vc2VjdGlvbi9ub2Rpc3BsYXkvY29tbWFuZD1zdWJzdHh4LnRwdSAtCiAgICAgICAgW11lbGZYWC10YXJnZXQuaCAvb3V0cHV0PVtdZWxmNjQtdGFyZ2V0LmgKJCBkZWwgc3Vic3R4eC50cHU7KgokIGVuZGlmCiQgYXBwZW5kIHN5cyRpbnB1dCBidWlsZC5jb20KJERFQ0sKJCBERUZTPURFRlMgKyAiLCIidW5saW5rPXJlbW92ZSIiLCIiREVCVUdESVI9IiIiIkdOVSRERUJVR0RJUjoiIiIiIiIiCiQgT1BUPSIvbm9vcHQvZGVidWciCiQgQ0ZMQUdTPSIvbmFtZT0oYXNfaXMsc2hvcnRlbmVkKSIgKyAtCiAgIi9pbmNsdWRlPShbXSwiIi4uLyIiLCIiLi4vaW5jbHVkZSIiKSIgKyAtCiAgIi9kZWZpbmU9KCIgKyBERUZTICsgIikiICsgT1BUCiQgRklMRVM9RklMRVMgKyAiYXJjaGl2ZSxhcmNoaXZlNjQsYXJjaHVyZXMsYmZkLGJmZGlvLGJpbmFyeSxjYWNoZSxjb2ZmZ2VuLCIrLQogICJjb21wcmVzcyxjb3JlZmlsZSxkd2FyZjIsZWxmLGZvcm1hdCxoYXNoLGloZXgsaW5pdCxsaWJiZmQsbGlua2VyLCIrLQogICJvcG5jbHMscmVsb2Msc2VjdGlvbixzaW1wbGUsc3JlYyxzdGFiLXN5bXMsc3ltcyx0YXJnZXRzLHRla2hleCx2ZXJpbG9nIgokIHdyaXRlIHN5cyRvdXRwdXQgIkNGTEFHUz0iLENGTEFHUwokIGNmbGFnc19saWJiZmQ9Ii93YXJuaW5nPShkaXNhYmxlPW1pc3NpbmdyZXR1cm4pIgokIGNmbGFnc19uaWw9IiIKJCBOVU0gPSAwCiQgT0JKUz0iIgokIExPT1A6CiQgICBGID0gRiRFTEVNRU5UKE5VTSwiLCIsRklMRVMpCiQgICBJRiBGLkVRUy4iLCIgVEhFTiBHT1RPIEVORAokICAgZWZsYWdzX25hbWU9ImNmbGFnc18nJ2YnIgokICAgbmFtZV9sZW49ZiRsZW5ndGgoZWZsYWdzX25hbWUpCiQgICBkYXNoX3Bvcz1mJGxvY2F0ZSgiLSIsZWZsYWdzX25hbWUpCiQgICBpZiBkYXNoX3Bvcy5uZS5uYW1lX2xlbgokICAgdGhlbgokICAgICBlZmxhZ3NfbmFtZVsnZGFzaF9wb3MsMV06PSJfIgokICAgICBkYXNoX3Bvcz1mJGxvY2F0ZSgiLSIsZWZsYWdzX25hbWUpCiQgICAgIGlmIGRhc2hfcG9zLm5lLm5hbWVfbGVuIHRoZW4gZWZsYWdzX25hbWVbJ2Rhc2hfcG9zLDFdOj0iXyIKJCAgIGVuZGlmCiQgICBpZiBmJHR5cGUoJ2VmbGFnc19uYW1lKS5lcXMuIiIgdGhlbiBlZmxhZ3NfbmFtZT0iY2ZsYWdzX25pbCIKJCAgIGVmbGFncz0nZWZsYWdzX25hbWUKJCAgIHdyaXRlIHN5cyRvdXRwdXQgIkNvbXBpbGluZyAiLCBGLCAiLmMiLCBlZmxhZ3MKJCAgIGNjICdDRkxBR1MgJ2VmbGFncyAnRi5jCiQgICBJRiBPQkpTLk5FUy4iIiBUSEVOIE9CSlM9T0JKUyArICIsIgokICAgT0JKUz1PQkpTICsgRiArICIub2JqIgokICAgTlVNID0gTlVNICsgMQokICAgR09UTyBMT09QCiQgRU5EOgokIHB1cmdlCiQgbGliL2NyZWF0ZSBsaWJiZmQgJ09CSlMKJEVPRAo=