JCEKJCEgVGhpcyBmaWxlIGNvbmZpZ3VyZXMgdGhlIGJmZCBsaWJyYXJ5IGZvciB1c2Ugd2l0aCBvcGVuVk1TLgokIQokISBXZSBkbyBub3QgdXNlIHRoZSBjb25maWd1cmUgc2NyaXB0LCBzaW5jZSB3ZSBkbyBub3QgaGF2ZSAvYmluL3NoCiQhIHRvIGV4ZWN1dGUgaXQuCiQhCiQhIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKJCEgUmV3cml0dGVuIGJ5IFRyaXN0YW4gR2luZ29sZCAoZ2luZ29sZEBhZGFjb3JlLmNvbSkKJCEKJCEgICBDb3B5cmlnaHQgKEMpIDIwMTItMjAyMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KJCEKJCEgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKJCEgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKJCEgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKJCEgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KJCEKJCEgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiQhIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiQhIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKJCEgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KJCEKJCEgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKJCEgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKJCEgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgokIQokIGFyY2g9RiRHRVRTWUkoIkFSQ0hfTkFNRSIpCiQgYXJjaD1GJEVESVQoYXJjaCwiTE9XRVJDQVNFIikKJGlmIGFyY2ggLmVxcy4gImFscGhhIiB0aGVuIHRhcmdldCA9ICJhbHBoYSIKJGlmIGFyY2ggLmVxcy4gImlhNjQiIHRoZW4gdGFyZ2V0ID0gImlhNjQiCiQhCiRpZiAoYXJjaCAuZXFzLiAiYWxwaGEiKSAub3IuIChhcmNoIC5lcXMuICJpYTY0IikKJHRoZW4KJCEKJCB3cml0ZSBzeXMkb3V0cHV0ICJDb25maWd1cmluZyBCRkQgZm9yICcndGFyZ2V0JyB0YXJnZXQiCiQhCiQhCiQhIGNvcHkgYmZkLWluMi5oIHRvIGJmZC5oLCByZXBsYWNpbmcgQCBtYWNyb3MKJCEKJCBlZGl0L3RwdS9ub2pvdXJuYWwvbm9zZWN0aW9uL25vZGlzcGxheS9jb21tYW5kPXN5cyRpbnB1dCAtCiAgICAgICAgW11iZmQtaW4yLmggL291dHB1dD1bXWJmZC5oCiRERUNLCiEKISAgQ29weSBmaWxlLCBjaGFuZ2luZyBsaW5lcyB3aXRoIG1hY3JvcyAoQEApCiEKIQogICBzZXQgKHN1Y2Nlc3Msb2ZmKTsKCiAgIGZpbGUgOj0gQ1JFQVRFX0JVRkZFUigiZmlsZSIsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgImZpbGVfbmFtZSIpKTsKICAgcmFuZyA6PSBDUkVBVEVfUkFOR0UoQkVHSU5OSU5HX09GKGZpbGUpLCBFTkRfT0YoZmlsZSkpOwoKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAd29yZHNpemVAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnNjQnKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQGJmZF9kZWZhdWx0X3RhcmdldF9zaXplQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJzY0Jyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NEJJVF9MT05HQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJzAnKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUX0xPTkdfTE9OR0AnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCcxJyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NEJJVF9MT05HX0xPTkdAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnMScpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfNjRfQklUX0RFRklORURAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnMScpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfNjRfQklUQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJ19faW50NjQnKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUX1VfNjRfQklUQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJ3Vuc2lnbmVkIF9faW50NjQnKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUUFRSX1RAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgndW5zaWduZWQgX19pbnQ2NCcpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAYmZkX2ZpbGVfcHRyQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJ2JmZF9zaWduZWRfdm1hJyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ3Vuc2lnbmVkIEBiZmRfZmlsZV9wdHJAIHVmaWxlX3B0cicsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJ2JmZF92bWEgdWZpbGVfcHRyJyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BzdXBwb3J0c19wbHVnaW5zQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJzAnKTsKICAgRU5ESUY7CiAgIFdSSVRFX0ZJTEUoZmlsZSwgR0VUX0lORk8oQ09NTUFORF9MSU5FLCAib3V0cHV0X2ZpbGUiKSk7CiAgIFFVSVQKJCAgRU9ECiQKJGVsc2UKJAokIHdyaXRlIHN5cyRvdXRwdXQgIkNvbmZpZ3VyaW5nIGZvciBWYXggdGFyZ2V0IgokIHRhcmdldCA9ICJ2YXgiCiQhCiQhIGNvcHkgYmZkLWluMi5oIHRvIGJmZC5oLCByZXBsYWNpbmcgQCBtYWNyb3MKJCEKJCB3cml0ZSBzeXMkb3V0cHV0ICJHZW5lcmF0ZWQgYGJmZC5oJyBmcm9tIGBiZmQtaW4yLmgnLiIKJCBlZGl0L3RwdS9ub2pvdXJuYWwvbm9zZWN0aW9uL25vZGlzcGxheS9jb21tYW5kPXN5cyRpbnB1dCAtCiAgICAgICAgW11iZmQtaW4yLmggL291dHB1dD1bXWJmZC5oCiRERUNLCiEKISAgQ29weSBmaWxlLCBjaGFuZ2luZyBsaW5lcyB3aXRoIG1hY3JvcyAoQEApCiEKIQogICBzZXQgKHN1Y2Nlc3Msb2ZmKTsKCiAgIGZpbGUgOj0gQ1JFQVRFX0JVRkZFUigiZmlsZSIsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgImZpbGVfbmFtZSIpKTsKICAgcmFuZyA6PSBDUkVBVEVfUkFOR0UoQkVHSU5OSU5HX09GKGZpbGUpLCBFTkRfT0YoZmlsZSkpOwoKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAd29yZHNpemVAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnMzInKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0QklUX0xPTkdAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnMCcpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfNjRfQklUX0RFRklORURAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnX19ERUNDJyk7CiAgICAgIFNQTElUX0xJTkU7CiAgICAgIENPUFlfVEVYVCgnI2luY2x1ZGUgPGludHMuaD4nKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0X0JJVEAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCdpbnQ2NCcpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfVV82NF9CSVRAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgndWludDY0Jyk7CiAgIEVORElGOwogICBXUklURV9GSUxFKGZpbGUsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgIm91dHB1dF9maWxlIikpOwogICBRVUlUCiQgIEVPRAokZW5kaWYKJAokIQokISBjcmVhdGUgYmZkdmVyLmgKJCEKJCB3cml0ZSBzeXMkb3V0cHV0ICJHZW5lcmF0ZSBgYmZkdmVyLmgnIGZyb20gJ3ZlcnNpb24uaCcgYW5kIGBjb25maWd1cmUuaW4nLiIKJCBlZGl0L3RwdS9ub2pvdXJuYWwvbm9zZWN0aW9uL25vZGlzcGxheS9jb21tYW5kPXN5cyRpbnB1dCAtCiAgICAgICAgW112ZXJzaW9uLmggL291dHB1dD1bXWJmZHZlci5oCiRERUNLCiEKISAgQ29weSBmaWxlLCBjaGFuZ2luZyBsaW5lcyB3aXRoIG1hY3JvcyAoQEApCiEKIQogICBzZXQgKHN1Y2Nlc3Msb2ZmKTsKICAgdmZpbGUgOj0gQ1JFQVRFX0JVRkZFUigidmZpbGUiLCAiY29uZmlndXJlLmluIik7CiAgIHJhbmcgOj0gQ1JFQVRFX1JBTkdFKEJFR0lOTklOR19PRih2ZmlsZSksIEVORF9PRih2ZmlsZSkpOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0FDX0lOSVQoW2JmZF0sIFsnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgdmVycyA6PSBDVVJSRU5UX0xJTkUtIl0pIjsKICAgRUxTRTsKICAgICB2ZXJzIDo9ICJ1bmtub3duIjsKICAgRU5ESUY7CiAgIHZlcnNudW0gOj0gdmVycyAtICIuIiAtICIuIjsKCiAgIGZpbGUgOj0gQ1JFQVRFX0JVRkZFUigiZmlsZSIsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgImZpbGVfbmFtZSIpKTsKICAgcmFuZyA6PSBDUkVBVEVfUkFOR0UoQkVHSU5OSU5HX09GKGZpbGUpLCBFTkRfT0YoZmlsZSkpOwoKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAYmZkX3ZlcnNpb25AJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCh2ZXJzbnVtKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQGJmZF92ZXJzaW9uX3N0cmluZ0AnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCciJyk7CiAgICAgIENPUFlfVEVYVCh2ZXJzKTsKICAgICAgQ09QWV9URVhUKCciJyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BiZmRfdmVyc2lvbl9wYWNrYWdlQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJyIoR05VIEJpbnV0aWxzKSAiJyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0ByZXBvcnRfYnVnc190b0AnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCciPGh0dHBzOi8vd3d3LnNvdXJjZXdhcmUub3JnL2J1Z3ppbGxhLz4iJyk7CiAgIEVORElGOwogICBXUklURV9GSUxFKGZpbGUsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgIm91dHB1dF9maWxlIikpOwogICBRVUlUCiQgIEVPRAokIQokIQokISBjcmVhdGUgdGFyZ21hdGNoLmgKJCEKJCB3cml0ZSBzeXMkb3V0cHV0ICJHZW5lcmF0ZSBgdGFyZ21hdGNoLmgnIgokIG9wZW4vd3JpdGUgdGZpbGUgW110YXJnbWF0Y2guaAokIHdyaXRlIHRmaWxlICJ7ICIiIiArIHRhcmdldCArICItKi0qdm1zKiIiIiArICIsIgokIHdyaXRlIHRmaWxlICIjaWYgZGVmaW5lZCAoU0VMRUNUX1ZFQ1MpIgokIHdyaXRlIHRmaWxlICJTRUxFQ1RfVkVDUyIKJCB3cml0ZSB0ZmlsZSAiI2Vsc2UiCiQgd3JpdGUgdGZpbGUgIlVOU1VQUE9SVEVEX1RBUkdFVCIKJCB3cml0ZSB0ZmlsZSAiI2VuZGlmIgokIHdyaXRlIHRmaWxlICJ9LCIKJCBjbG9zZSB0ZmlsZQokIQokIQokISBjcmVhdGUgY29uZmlnLmgKJCEKJCB3cml0ZSBzeXMkb3V0cHV0ICJHZW5lcmF0ZSBgY29uZmlnLmgnIgokIGNyZWF0ZSBbXWNvbmZpZy5oCi8qIGNvbmZpZy5oLXZtcy4gIEdlbmVyYXRlZCBieSBoYW5kIGJ5IEtsYXVzIEvkbXBmLCBra2FlbXBmQGRpZHltdXMucm1pLmRlLiAgKi8KLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi8qIFdoZXRoZXIgbWFsbG9jIG11c3QgYmUgZGVjbGFyZWQgZXZlbiBpZiA8c3RkbGliLmg+IGlzIGluY2x1ZGVkLiAgKi8KLyogI3VuZGVmIE5FRURfREVDTEFSQVRJT05fTUFMTE9DICovCi8qIFdoZXRoZXIgZnJlZSBtdXN0IGJlIGRlY2xhcmVkIGV2ZW4gaWYgPHN0ZGxpYi5oPiBpcyBpbmNsdWRlZC4gICovCi8qICN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUgKi8KLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwovKiAjZGVmaW5lIEhBVkVfTU1BUCAxICovCi8qIERvIHdlIG5lZWQgdG8gdXNlIHRoZSBiIG1vZGlmaWVyIHdoZW4gb3BlbmluZyBiaW5hcnkgZmlsZXM/ICAqLwovKiAjdW5kZWYgVVNFX0JJTkFSWV9GT1BFTiAqLwovKiBOYW1lIG9mIGhvc3Qgc3BlY2lmaWMgaGVhZGVyIGZpbGUgdG8gaW5jbHVkZSBpbiB0cmFkLWNvcmUuYy4gICovCi8qICN1bmRlZiBUUkFEX0hFQURFUiAqLwovKiBEZWZpbmUgb25seSBpZiA8c3lzL3Byb2Nmcy5oPiBpcyBhdmFpbGFibGUgKmFuZCogaXQgZGVmaW5lcyBwcnN0YXR1c190LiAgKi8KLyogI3VuZGVmIEhBVkVfU1lTX1BST0NGU19IICovCi8qIERvIHdlIHJlYWxseSB3YW50IHRvIHVzZSBtbWFwIGlmIGl0J3MgYXZhaWxhYmxlPyAgKi8KLyogI3VuZGVmIFVTRV9NTUFQICovCi8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZmNudGwgZnVuY3Rpb24uICAqLwojZGVmaW5lIEhBVkVfRkNOVEwgMQovKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KI2RlZmluZSBIQVZFX0dFVFBBR0VTSVpFIDEKLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtYWR2aXNlIGZ1bmN0aW9uLiAgKi8KI2RlZmluZSBIQVZFX01BRFZJU0UgMQovKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1wcm90ZWN0IGZ1bmN0aW9uLiAgKi8KI2RlZmluZSBIQVZFX01QUk9URUNUIDEKLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICAqLwojZGVmaW5lIEhBVkVfRkNOVExfSCAxCi8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGRlZi5oPiBoZWFkZXIgZmlsZS4gICovCiNkZWZpbmUgSEFWRV9TVERERUZfSCAxCi8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCiNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCi8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCiNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCi8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwojZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2ZpbGUuaD4gaGVhZGVyIGZpbGUuICAqLwojZGVmaW5lIEhBVkVfU1lTX0ZJTEVfSCAxCi8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwojZGVmaW5lIEhBVkVfVElNRV9IIDEKLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLyogRGlzYWJsZSBOTFMgICovCiN1bmRlZiBFTkFCTEVfTkxTCi8qIE5hbWUgb2YgcGFja2FnZSAqLwojZGVmaW5lIFBBQ0tBR0UgImJmZCIKLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovCiNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgIiIKLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLwojZGVmaW5lIFBBQ0tBR0VfTkFNRSAiYmZkIgovKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCiNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgImJmZCIKLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLwojZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiYmZkIgovKiBEZWZpbmUgdG8gdGhlIGhvbWUgcGFnZSBmb3IgdGhpcyBwYWNrYWdlLiAqLwojZGVmaW5lIFBBQ0tBR0VfVVJMICIiCi8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCiNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIocGFja2FnZSB2ZXJzaW9uKSIKJCEKJCB3cml0ZSBzeXMkb3V0cHV0ICJDb3B5IHN5c2RlcC5oIgokIGNvcHkgWy5ob3N0c11hbHBoYXZtcy5oIHN5c2RlcC5oCiQKJCB3cml0ZSBzeXMkb3V0cHV0ICJHZW5lcmF0ZSBidWlsZC5jb20iCiQhCiQgaWYgQVJDSC5lcXMuImFscGhhIgokIHRoZW4KJCAgIGNyZWF0ZSBidWlsZC5jb20KJERFQ0sKJCBERUZTPSIiIlNFTEVDVF9WRUNTPSZhbHBoYV92bXNfdmVjIiIsIistCiAgIiIiU0VMRUNUX0FSQ0hJVEVDVFVSRVM9JmJmZF9hbHBoYV9hcmNoIiIiCiQgRklMRVM9ImNwdS1hbHBoYSx2bXMsdm1zLWhkcix2bXMtZ3NkLHZtcy10aXIsdm1zLW1pc2MsIgokRU9ECiQgZW5kaWYKJCBpZiBBUkNILmVxcy4iaWE2NCIKJCB0aGVuCiQgICBjcmVhdGUgYnVpbGQuY29tCiRERUNLCiQgREVGUz0iIiJTRUxFQ1RfVkVDUz0maWE2NF9lbGY2NF92bXNfdmVjIiIsIistCiAgIiIiU0VMRUNUX0FSQ0hJVEVDVFVSRVM9JmJmZF9pYTY0X2FyY2giIiIKJCBGSUxFUz0iY3B1LWlhNjQsZWxmNjQtaWE2NCxlbGYtc3RydGFiLGNvcmVmaWxlLHN0YWJzLG1lcmdlLGVsZi1laC1mcmFtZSwiKy0KICAiZWxmbGluayxlbGYtYXR0cnMsZHdhcmYxLGVsZjY0LCIKJEVPRAokIGNyZWF0ZSBzdWJzdHh4LnRwdQokREVDSwogICBzZXQgKHN1Y2Nlc3Msb2ZmKTsKICAgZmlsZSA6PSBDUkVBVEVfQlVGRkVSKCJmaWxlIiwgR0VUX0lORk8oQ09NTUFORF9MSU5FLCAiZmlsZV9uYW1lIikpOwogICBmb3VuZF9yYW5nZSA6PSBDUkVBVEVfUkFOR0UoQkVHSU5OSU5HX09GKGZpbGUpLCBCRUdJTk5JTkdfT0YoZmlsZSkpOwoKICAgTE9PUAogICAgIHJhbmcgOj0gQ1JFQVRFX1JBTkdFIChFTkRfT0YoZm91bmRfcmFuZ2UpLEVORF9PRihmaWxlKSk7CiAgICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdOTicsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgICBFWElUSUYgbWF0Y2hfcG9zID0gMDsKICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICBDT1BZX1RFWFQoJzY0Jyk7CiAgIEVORExPT1A7CiAgIFdSSVRFX0ZJTEUoZmlsZSwgR0VUX0lORk8oQ09NTUFORF9MSU5FLCAib3V0cHV0X2ZpbGUiKSk7CiAgIFFVSVQKJCAgRU9ECiQgd3JpdGUgc3lzJG91dHB1dCAiR2VuZXJhdGUgZWxmNjQtdGFyZ2V0LmggZnJvbSBlbGZ4eC10YXJnZXQuaCIKJCBlZGl0L3RwdS9ub2pvdXJuYWwvbm9zZWN0aW9uL25vZGlzcGxheS9jb21tYW5kPXN1YnN0eHgudHB1IC0KICAgICAgICBbXWVsZlhYLXRhcmdldC5oIC9vdXRwdXQ9W11lbGY2NC10YXJnZXQuaAokIGRlbCBzdWJzdHh4LnRwdTsqCiQgZW5kaWYKJCBhcHBlbmQgc3lzJGlucHV0IGJ1aWxkLmNvbQokREVDSwokIERFRlM9REVGUyArICIsIiJ1bmxpbms9cmVtb3ZlIiIsIiJERUJVR0RJUj0iIiIiR05VJERFQlVHRElSOiIiIiIiIiIKJCBPUFQ9Ii9ub29wdC9kZWJ1ZyIKJCBDRkxBR1M9Ii9uYW1lPShhc19pcyxzaG9ydGVuZWQpIiArIC0KICAiL2luY2x1ZGU9KFtdLCIiLi4vIiIsIiIuLi9pbmNsdWRlIiIpIiArIC0KICAiL2RlZmluZT0oIiArIERFRlMgKyAiKSIgKyBPUFQKJCBGSUxFUz1GSUxFUyArICJhcmNoaXZlLGFyY2hpdmU2NCxhcmNodXJlcyxiZmQsYmZkaW8sYmluYXJ5LGNhY2hlLGNvZmZnZW4sIistCiAgImNvbXByZXNzLGNvcmVmaWxlLGR3YXJmMixlbGYsZm9ybWF0LGhhc2gsaWhleCxpbml0LGxpYmJmZCxsaW5rZXIsIistCiAgIm9wbmNscyxyZWxvYyxzZWN0aW9uLHNpbXBsZSxzcmVjLHN0YWItc3ltcyxzeW1zLHRhcmdldHMsdGVraGV4LHZlcmlsb2ciCiQgd3JpdGUgc3lzJG91dHB1dCAiQ0ZMQUdTPSIsQ0ZMQUdTCiQgY2ZsYWdzX2xpYmJmZD0iL3dhcm5pbmc9KGRpc2FibGU9bWlzc2luZ3JldHVybikiCiQgY2ZsYWdzX25pbD0iIgokIE5VTSA9IDAKJCBPQkpTPSIiCiQgTE9PUDoKJCAgIEYgPSBGJEVMRU1FTlQoTlVNLCIsIixGSUxFUykKJCAgIElGIEYuRVFTLiIsIiBUSEVOIEdPVE8gRU5ECiQgICBlZmxhZ3NfbmFtZT0iY2ZsYWdzXycnZiciCiQgICBuYW1lX2xlbj1mJGxlbmd0aChlZmxhZ3NfbmFtZSkKJCAgIGRhc2hfcG9zPWYkbG9jYXRlKCItIixlZmxhZ3NfbmFtZSkKJCAgIGlmIGRhc2hfcG9zLm5lLm5hbWVfbGVuCiQgICB0aGVuCiQgICAgIGVmbGFnc19uYW1lWydkYXNoX3BvcywxXTo9Il8iCiQgICAgIGRhc2hfcG9zPWYkbG9jYXRlKCItIixlZmxhZ3NfbmFtZSkKJCAgICAgaWYgZGFzaF9wb3MubmUubmFtZV9sZW4gdGhlbiBlZmxhZ3NfbmFtZVsnZGFzaF9wb3MsMV06PSJfIgokICAgZW5kaWYKJCAgIGlmIGYkdHlwZSgnZWZsYWdzX25hbWUpLmVxcy4iIiB0aGVuIGVmbGFnc19uYW1lPSJjZmxhZ3NfbmlsIgokICAgZWZsYWdzPSdlZmxhZ3NfbmFtZQokICAgd3JpdGUgc3lzJG91dHB1dCAiQ29tcGlsaW5nICIsIEYsICIuYyIsIGVmbGFncwokICAgY2MgJ0NGTEFHUyAnZWZsYWdzICdGLmMKJCAgIElGIE9CSlMuTkVTLiIiIFRIRU4gT0JKUz1PQkpTICsgIiwiCiQgICBPQkpTPU9CSlMgKyBGICsgIi5vYmoiCiQgICBOVU0gPSBOVU0gKyAxCiQgICBHT1RPIExPT1AKJCBFTkQ6CiQgcHVyZ2UKJCBsaWIvY3JlYXRlIGxpYmJmZCAnT0JKUwokRU9ECg==