IyEvdXNyL2Jpbi9lbnYgcGVybAojCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQG9wZW5zc2wub3JnPiBmb3IgdGhlIE9wZW5TU0wKIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCiMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojCiMgR0hBU0ggZm9yIEFSTXY4IENyeXB0byBFeHRlbnNpb24sIDY0LWJpdCBwb2x5bm9taWFsIG11bHRpcGxpY2F0aW9uLgojCiMgSnVuZSAyMDE0CiMKIyBJbml0aWFsIHZlcnNpb24gd2FzIGRldmVsb3BlZCBpbiB0aWdodCBjb29wZXJhdGlvbiB3aXRoIEFyZAojIEJpZXNoZXV2ZWwgPGFyZC5iaWVzaGV1dmVsQGxpbmFyby5vcmc+IGZyb20gYml0cy1uLXBpZWNlcyBmcm9tCiMgb3RoZXIgYXNzZW1ibHkgbW9kdWxlcy4gSnVzdCBsaWtlIGFlc3Y4LWFybXgucGwgdGhpcyBtb2R1bGUKIyBzdXBwb3J0cyBib3RoIEFBcmNoMzIgYW5kIEFBcmNoNjQgZXhlY3V0aW9uIG1vZGVzLgojCiMgQ3VycmVudCBwZXJmb3JtYW5jZSBpbiBjeWNsZXMgcGVyIHByb2Nlc3NlZCBieXRlOgojCiMJCVBNVUxMWzJdCTMyLWJpdCBORU9OKCopCiMgQXBwbGUgQTcJMS43NgkJNS42MgojIENvcnRleC1BNTMJMS40NQkJOC4zOQojIENvcnRleC1BNTcJMi4yMgkJNy42MQojCiMgKCopCXByZXNlbnRlZCBmb3IgcmVmZXJlbmNlL2NvbXBhcmlzb24gcHVycG9zZXM7CgokZmxhdm91ciA9IHNoaWZ0OwpvcGVuIFNURE9VVCwiPiIuc2hpZnQ7CgokWGk9IngwIjsJIyBhcmd1bWVudCBibG9jawokSHRibD0ieDEiOwokaW5wPSJ4MiI7CiRsZW49IngzIjsKCiRpbmM9IngxMiI7Cgp7Cm15ICgkWGwsJFhtLCRYaCwkSU4pPW1hcCgicSRfIiwoMC4uMykpOwpteSAoJHQwLCR0MSwkdDIsJHQzLCRILCRIaGwpPW1hcCgicSRfIiwoOC4uMTQpKTsKCiRjb2RlPTw8X19fOwojaW5jbHVkZSAiYXJtX2FyY2guaCIKCi50ZXh0Cl9fXwokY29kZS49Ii5hcmNoCWFybXY4LWErY3J5cHRvXG4iCWlmICgkZmxhdm91ciA9fiAvNjQvKTsKJGNvZGUuPSIuZnB1CW5lb25cbi5jb2RlCTMyXG4iCWlmICgkZmxhdm91ciAhfiAvNjQvKTsKCiRjb2RlLj08PF9fXzsKLmdsb2JhbAlnY21faW5pdF92OAoudHlwZQlnY21faW5pdF92OCwlZnVuY3Rpb24KLmFsaWduCTQKZ2NtX2luaXRfdjg6Cgl2bGQxLjY0CQl7JHQxfSxbeDFdCQlAIGxvYWQgSAoJdm1vdi5pOAkJJHQwLCMweGUxCgl2ZXh0LjgJCSRJTiwkdDEsJHQxLCM4Cgl2c2hsLmk2NAkkdDAsJHQwLCM1NwoJdnNoci51NjQJJHQyLCR0MCwjNjMKCXZleHQuOAkJJHQwLCR0MiwkdDAsIzgJCUAgdDA9MHhjMi4uLi4wMQoJdmR1cC4zMgkJJHQxLCR7dDF9WzFdCgl2c2hyLnU2NAkkdDMsJElOLCM2MwoJdnNoci5zMzIJJHQxLCR0MSwjMzEJCUAgYnJvYWRjYXN0IGNhcnJ5IGJpdAoJdmFuZAkJJHQzLCR0MywkdDAKCXZzaGwuaTY0CSRJTiwkSU4sIzEKCXZleHQuOAkJJHQzLCR0MywkdDMsIzgKCXZhbmQJCSR0MCwkdDAsJHQxCgl2b3JyCQkkSU4sJElOLCR0MwkJQCBIPDw8PTEKCXZlb3IJCSRJTiwkSU4sJHQwCQlAIHR3aXN0ZWQgSAoJdnN0MS42NAkJeyRJTn0sW3gwXQoKCXJldAouc2l6ZQlnY21faW5pdF92OCwuLWdjbV9pbml0X3Y4CgouZ2xvYmFsCWdjbV9nbXVsdF92OAoudHlwZQlnY21fZ211bHRfdjgsJWZ1bmN0aW9uCi5hbGlnbgk0CmdjbV9nbXVsdF92ODoKCXZsZDEuNjQJCXskdDF9LFskWGldCQlAIGxvYWQgWGkKCXZtb3YuaTgJCSR0MywjMHhlMQoJdmxkMS42NAkJeyRIfSxbJEh0YmxdCQlAIGxvYWQgdHdpc3RlZCBICgl2c2hsLnU2NAkkdDMsJHQzLCM1NwojaWZuZGVmIF9fQVJNRUJfXwoJdnJldjY0LjgJJHQxLCR0MQojZW5kaWYKCXZleHQuOAkJJEhobCwkSCwkSCwjOAoJbW92CQkkbGVuLCMwCgl2ZXh0LjgJCSRJTiwkdDEsJHQxLCM4Cgltb3YJCSRpbmMsIzAKCXZlb3IJCSRIaGwsJEhobCwkSAkJQCBLYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKCW1vdgkJJGlucCwkWGkKCWIJCS5MZ211bHRfdjgKLnNpemUJZ2NtX2dtdWx0X3Y4LC4tZ2NtX2dtdWx0X3Y4CgouZ2xvYmFsCWdjbV9naGFzaF92OAoudHlwZQlnY21fZ2hhc2hfdjgsJWZ1bmN0aW9uCi5hbGlnbgk0CmdjbV9naGFzaF92ODoKCXZsZDEuNjQJCXskWGx9LFskWGldCQlAIGxvYWQgW3JvdGF0ZWRdIFhpCglzdWJzCQkkbGVuLCRsZW4sIzE2Cgl2bW92Lmk4CQkkdDMsIzB4ZTEKCW1vdgkJJGluYywjMTYKCXZsZDEuNjQJCXskSH0sWyRIdGJsXQkJQCBsb2FkIHR3aXN0ZWQgSAoJY2NscgkJJGluYyxlcQoJdmV4dC44CQkkWGwsJFhsLCRYbCwjOAoJdnNobC51NjQJJHQzLCR0MywjNTcKCXZsZDEuNjQJCXskdDF9LFskaW5wXSwkaW5jCUAgbG9hZCBbcm90YXRlZF0gaW5wCgl2ZXh0LjgJCSRIaGwsJEgsJEgsIzgKI2lmbmRlZiBfX0FSTUVCX18KCXZyZXY2NC44CSRYbCwkWGwKCXZyZXY2NC44CSR0MSwkdDEKI2VuZGlmCgl2ZW9yCQkkSGhsLCRIaGwsJEgJCUAgS2FyYXRzdWJhIHByZS1wcm9jZXNzaW5nCgl2ZXh0LjgJCSRJTiwkdDEsJHQxLCM4CgliCQkuTG9vcF92OAoKLmFsaWduCTQKLkxvb3Bfdjg6Cgl2ZXh0LjgJCSR0MiwkWGwsJFhsLCM4Cgl2ZW9yCQkkSU4sJElOLCRYbAkJQCBpbnBePVhpCgl2ZW9yCQkkdDEsJHQxLCR0MgkJQCAkdDEgaXMgcm90YXRlZCBpbnBeWGkKCi5MZ211bHRfdjg6Cgl2cG11bGwucDY0CSRYbCwkSCwkSU4JCUAgSC5sb7dYaS5sbwoJdmVvcgkJJHQxLCR0MSwkSU4JCUAgS2FyYXRzdWJhIHByZS1wcm9jZXNzaW5nCgl2cG11bGwyLnA2NAkkWGgsJEgsJElOCQlAIEguaGm3WGkuaGkKCXN1YnMJCSRsZW4sJGxlbiwjMTYKCXZwbXVsbC5wNjQJJFhtLCRIaGwsJHQxCQlAIChILmxvK0guaGkptyhYaS5sbytYaS5oaSkKCWNjbHIJCSRpbmMsZXEKCgl2ZXh0LjgJCSR0MSwkWGwsJFhoLCM4CQlAIEthcmF0c3ViYSBwb3N0LXByb2Nlc3NpbmcKCXZlb3IJCSR0MiwkWGwsJFhoCgl2ZW9yCQkkWG0sJFhtLCR0MQoJIHZsZDEuNjQJeyR0MX0sWyRpbnBdLCRpbmMJQCBsb2FkIFtyb3RhdGVkXSBpbnAKCXZlb3IJCSRYbSwkWG0sJHQyCgl2cG11bGwucDY0CSR0MiwkWGwsJHQzCQlAIDFzdCBwaGFzZQoKCXZtb3YJCSRYaCNsbywkWG0jaGkJCUAgWGh8WG0gLSAyNTYtYml0IHJlc3VsdAoJdm1vdgkJJFhtI2hpLCRYbCNsbwkJQCBYbSBpcyByb3RhdGVkIFhsCiNpZm5kZWYgX19BUk1FQl9fCgkgdnJldjY0LjgJJHQxLCR0MQojZW5kaWYKCXZlb3IJCSRYbCwkWG0sJHQyCgkgdmV4dC44CQkkSU4sJHQxLCR0MSwjOAoKCXZleHQuOAkJJHQyLCRYbCwkWGwsIzgJCUAgMm5kIHBoYXNlCgl2cG11bGwucDY0CSRYbCwkWGwsJHQzCgl2ZW9yCQkkdDIsJHQyLCRYaAoJdmVvcgkJJFhsLCRYbCwkdDIKCWIuaHMJCS5Mb29wX3Y4CgojaWZuZGVmIF9fQVJNRUJfXwoJdnJldjY0LjgJJFhsLCRYbAojZW5kaWYKCXZleHQuOAkJJFhsLCRYbCwkWGwsIzgKCXZzdDEuNjQJCXskWGx9LFskWGldCQlAIHdyaXRlIG91dCBYaQoKCXJldAouc2l6ZQlnY21fZ2hhc2hfdjgsLi1nY21fZ2hhc2hfdjgKX19fCn0KJGNvZGUuPTw8X19fOwouYXNjaXogICJHSEFTSCBmb3IgQVJNdjgsIENSWVBUT0dBTVMgYnkgPGFwcHJvXEBvcGVuc3NsLm9yZz4iCi5hbGlnbiAgMgpfX18KCmlmICgkZmxhdm91ciA9fiAvNjQvKSB7CQkJIyMjIyMjIyMgNjQtYml0IGNvZGUKICAgIHN1YiB1bnZtb3YgewoJbXkgJGFyZz1zaGlmdDsKCgkkYXJnID1+IG0vcShbMC05XSspIyhsb3xoaSksXHMqcShbMC05XSspIyhsb3xoaSkvbyAmJgoJc3ByaW50ZgkiaW5zCXYlZC5kWyVkXSx2JWQuZFslZF0iLCQxLCgkMiBlcSAibG8iKT8wOjEsJDMsKCQ0IGVxICJsbyIpPzA6MTsKICAgIH0KICAgIGZvcmVhY2goc3BsaXQoIlxuIiwkY29kZSkpIHsKCXMvY2NsclxzKyhbd3hdKShbXixdKyksXHMqKFthLXpdKykvY3NlbAkkMSQyLCQxenIsJDEkMiwkMy9vCW9yCglzL3Ztb3ZcLmk4L21vdmkvbwkJb3IJIyBmaXggdXAgbGVnYWN5IG1uZW1vbmljcwoJcy92bW92XHMrKC4qKS91bnZtb3YoJDEpL2dlbwlvcgoJcy92ZXh0XC44L2V4dC9vCQkJb3IKCXMvdnNoclwucy9zc2hyXC5zL28JCW9yCglzL3ZzaHIvdXNoci9vCQkJb3IKCXMvXihccyspdi8kMS9vCQkJb3IJIyBzdHJpcCBvZmYgdiBwcmVmaXgKCXMvXGJieFxzK2xyXGIvcmV0L287CgoJcy9cYnEoWzAtOV0rKVxiLyJ2Ii4oJDE8OD8kMTokMSs4KS4iLjE2YiIvZ2VvOwkjIG9sZC0+bmV3IHJlZ2lzdGVycwoJcy9AXHMvXC9cLy9vOwkJCQkjIG9sZC0+bmV3IHN0eWxlIGNvbW1lbnRhcnkKCgkjIGZpeCB1cCByZW1haW5pZyBsZWdhY3kgc3VmZml4ZXMKCXMvXC5bdWldPzgoXHMpLyQxL287CglzL1wuW3Vpc10/MzIvL28gYW5kIHMvXC4xNmIvXC40cy9nbzsKCW0vXC5wNjQvbyBhbmQgcy9cLjE2Yi9cLjFxL287CQkjIDFzdCBwbXVsbCBhcmd1bWVudAoJbS9sXC5wNjQvbyBhbmQgcy9cLjE2Yi9cLjFkL2dvOwkJIyAybmQgYW5kIDNyZCBwbXVsbCBhcmd1bWVudHMKCXMvXC5bdWlzcF0/NjQvL28gYW5kIHMvXC4xNmIvXC4yZC9nbzsKCXMvXC5bNDJdKFtzZF0pXFsoWzAtM10pXF0vXC4kMVxbJDJcXS9vOwoKCXByaW50ICRfLCJcbiI7CiAgICB9Cn0gZWxzZSB7CQkJCSMjIyMjIyMjIDMyLWJpdCBjb2RlCiAgICBzdWIgdW52ZHVwMzIgewoJbXkgJGFyZz1zaGlmdDsKCgkkYXJnID1+IG0vcShbMC05XSspLFxzKnEoWzAtOV0rKVxbKFswLTNdKVxdL28gJiYKCXNwcmludGYJInZkdXAuMzIJcSVkLGQlZFslZF0iLCQxLDIqJDIrKCQzPj4xKSwkMyYxOwogICAgfQogICAgc3ViIHVudnBtdWxscDY0IHsKCW15ICgkbW5lbW9uaWMsJGFyZyk9QF87CgoJaWYgKCRhcmcgPX4gbS9xKFswLTldKyksXHMqcShbMC05XSspLFxzKnEoWzAtOV0rKS9vKSB7CgkgICAgbXkgJHdvcmQgPSAweGYyYTAwZTAwfCgoJDEmNyk8PDEzKXwoKCQxJjgpPDwxOSkKCQkJCSB8KCgkMiY3KTw8MTcpfCgoJDImOCk8PDQpCgkJCQkgfCgoJDMmNyk8PDEpIHwoKCQzJjgpPDwyKTsKCSAgICAkd29yZCB8PSAweDAwMDEwMDAxCSBpZiAoJG1uZW1vbmljID1+ICIyIik7CgkgICAgIyBzaW5jZSBBUk12NyBpbnN0cnVjdGlvbnMgYXJlIGFsd2F5cyBlbmNvZGVkIGxpdHRsZS1lbmRpYW4uCgkgICAgIyBjb3JyZWN0IHNvbHV0aW9uIGlzIHRvIHVzZSAuaW5zdCBkaXJlY3RpdmUsIGJ1dCBvbGRlcgoJICAgICMgYXNzZW1ibGVycyBkb24ndCBpbXBsZW1lbnQgaXQ6LSgKCSAgICBzcHJpbnRmICIuYnl0ZVx0MHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4XHRAICVzICVzIiwKCQkJJHdvcmQmMHhmZiwoJHdvcmQ+PjgpJjB4ZmYsCgkJCSgkd29yZD4+MTYpJjB4ZmYsKCR3b3JkPj4yNCkmMHhmZiwKCQkJJG1uZW1vbmljLCRhcmc7Cgl9CiAgICB9CgogICAgZm9yZWFjaChzcGxpdCgiXG4iLCRjb2RlKSkgewoJcy9cYlt3eF0oWzAtOV0rKVxiL3IkMS9nbzsJCSMgbmV3LT5vbGQgcmVnaXN0ZXJzCglzL1xidihbMC05XSlcLlsxMjQ2OF0rW2JzZF1cYi9xJDEvZ287CSMgbmV3LT5vbGQgcmVnaXN0ZXJzCiAgICAgICAgcy9cL1wvXHM/L0AgL287CQkJCSMgbmV3LT5vbGQgc3R5bGUgY29tbWVudGFyeQoKCSMgZml4IHVwIHJlbWFpbmlnIG5ldy1zdHlsZSBzdWZmaXhlcwoJcy9cXSwjWzAtOV0rL10hL287CgoJcy9jY2xyXHMrKFteLF0rKSxccyooW2Etel0rKS9tb3YkMgkkMSwjMC9vCQkJb3IKCXMvdmR1cFwuMzJccysoLiopL3VudmR1cDMyKCQxKS9nZW8JCQkJb3IKCXMvdj8ocG11bGwyPylcLnA2NFxzKyguKikvdW52cG11bGxwNjQoJDEsJDIpL2dlbwkJb3IKCXMvXGJxKFswLTldKykjKGxvfGhpKS9zcHJpbnRmICJkJWQiLDIqJDErKCQyIGVxICJoaSIpL2dlbwlvcgoJcy9eKFxzKyliXC4vJDFiL28JCQkJCQlvcgoJcy9eKFxzKylyZXQvJDFieFx0bHIvbzsKCiAgICAgICAgcHJpbnQgJF8sIlxuIjsKICAgIH0KfQoKY2xvc2UgU1RET1VUOyAjIGVuZm9yY2UgZmx1c2gK