Ly8geyBkZy1yZXF1aXJlLW5hbWVkbG9jYWxlICJkZV9ERS5JU084ODU5LTE1IiB9CgovLyAyMDAxLTA4LTE1IEJlbmphbWluIEtvc25payAgPGJrb3pAcmVkaGF0LmNvbT4KCi8vIENvcHlyaWdodCAoQykgMjAwMS0yMDIzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgovLwovLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCi8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQovLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQovLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKLy8gYW55IGxhdGVyIHZlcnNpb24uCgovLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQovLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLy8gd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgoKLy8gMjIuMi40LjIgVGVtcGxhdGUgY2xhc3MgY29sbGF0ZV9ieW5hbWUKCiNpbmNsdWRlIDxsb2NhbGU+CiNpbmNsdWRlIDxjc3RyaW5nPgojaW5jbHVkZSA8dGVzdHN1aXRlX2hvb2tzLmg+Cgp2b2lkIHRlc3QwMSgpCnsKICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogIHR5cGVkZWYgc3RkOjpjb2xsYXRlPGNoYXI+OjpzdHJpbmdfdHlwZSBzdHJpbmdfdHlwZTsKCiAgc3RyaW5nIHN0cjsKICBsb2NhbGUgbG9jX2MgPSBsb2NhbGU6OmNsYXNzaWMoKTsKCiAgbG9jYWxlIGxvY19kZSA9IGxvY2FsZShJU09fODg1OSgxNSxkZV9ERSkpOwogIHN0ciA9IGxvY19kZS5uYW1lKCk7CgogIGxvY2FsZSBsb2NfYnluYW1lKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgY29sbGF0ZV9ieW5hbWU8Y2hhcj4oSVNPXzg4NTkoMTUsZGVfREUpKSk7CiAgc3RyID0gbG9jX2J5bmFtZS5uYW1lKCk7CgogIFZFUklGWSggbG9jX2RlICE9IGxvY19ieW5hbWUgKTsKCiAgLy8gY2FjaGUgdGhlIGNvbGxhdGUgZmFjZXRzCiAgY29uc3QgY29sbGF0ZTxjaGFyPiYgY29sbF9kZSA9IHVzZV9mYWNldDxjb2xsYXRlPGNoYXI+ID4obG9jX2RlKTsgCgogIC8vIENoZWNrIEdlcm1hbiAiZGVfREUuSVNPODg1OS0xNSIgbG9jYWxlLgogIGludCBpMTsKICBpbnQgaTI7CiAgbG9uZyBsMTsKICBsb25nIGwyOwogIGNvbnN0IGNoYXIqIHN0cmxpdDMgPSAixHVnbGVpbiBBdWdtZW50IjsgLy8gIkMiID09ICJBdWdtZW50IMR1Z2xlaW4iCiAgY29uc3QgY2hhciogc3RybGl0NCA9ICJCYXNlIGJh3yBCYd8gQmFzdCI7IC8vICJDIiA9PSAiQmFzZSBiYd8gQmHfIEJhc3QiCgogIGludCBzaXplMyA9IHN0cmxlbihzdHJsaXQzKSAtIDE7CiAgaTEgPSBjb2xsX2RlLmNvbXBhcmUoc3RybGl0Mywgc3RybGl0MyArIHNpemUzLCBzdHJsaXQzLCBzdHJsaXQzICsgNyk7CiAgVkVSSUZZICggaTEgPT0gMSApOwogIGkxID0gY29sbF9kZS5jb21wYXJlKHN0cmxpdDMsIHN0cmxpdDMgKyA3LCBzdHJsaXQzLCBzdHJsaXQzICsgc2l6ZTMpOwogIFZFUklGWSAoIGkxID09IC0xICk7CiAgaTEgPSBjb2xsX2RlLmNvbXBhcmUoc3RybGl0Mywgc3RybGl0MyArIDcsIHN0cmxpdDMsIHN0cmxpdDMgKyA3KTsKICBWRVJJRlkgKCBpMSA9PSAwICk7CgogIGkxID0gY29sbF9kZS5jb21wYXJlKHN0cmxpdDMsIHN0cmxpdDMgKyA2LCBzdHJsaXQzICsgOCwgc3RybGl0MyArIDE0KTsKICBWRVJJRlkgKCBpMSA9PSAtMSApOwoKICBpbnQgc2l6ZTQgPSBzdHJsZW4oc3RybGl0NCkgLSAxOwogIGkyID0gY29sbF9kZS5jb21wYXJlKHN0cmxpdDQsIHN0cmxpdDQgKyBzaXplNCwgc3RybGl0NCwgc3RybGl0NCArIDEzKTsKICBWRVJJRlkgKCBpMiA9PSAxICk7CiAgaTIgPSBjb2xsX2RlLmNvbXBhcmUoc3RybGl0NCwgc3RybGl0NCArIDEzLCBzdHJsaXQ0LCBzdHJsaXQ0ICsgc2l6ZTQpOwogIFZFUklGWSAoIGkyID09IC0xICk7CiAgaTIgPSBjb2xsX2RlLmNvbXBhcmUoc3RybGl0NCwgc3RybGl0NCArIHNpemU0LCBzdHJsaXQ0LCBzdHJsaXQ0ICsgc2l6ZTQpOwogIFZFUklGWSAoIGkyID09IDAgKTsKCiAgbDEgPSBjb2xsX2RlLmhhc2goc3RybGl0Mywgc3RybGl0MyArIHNpemUzKTsKICBsMiA9IGNvbGxfZGUuaGFzaChzdHJsaXQzLCBzdHJsaXQzICsgc2l6ZTMgLSAxKTsKICBWRVJJRlkgKCBsMSAhPSBsMiApOwogIGwxID0gY29sbF9kZS5oYXNoKHN0cmxpdDMsIHN0cmxpdDMgKyBzaXplMyk7CiAgbDIgPSBjb2xsX2RlLmhhc2goc3RybGl0NCwgc3RybGl0NCArIHNpemU0KTsKICBWRVJJRlkgKCBsMSAhPSBsMiApOwoKICBzdHJpbmcgc3RyMyA9IGNvbGxfZGUudHJhbnNmb3JtKHN0cmxpdDMsIHN0cmxpdDMgKyBzaXplMyk7CiAgc3RyaW5nIHN0cjQgPSBjb2xsX2RlLnRyYW5zZm9ybShzdHJsaXQ0LCBzdHJsaXQ0ICsgc2l6ZTQpOwogIGkxID0gc3RyMy5jb21wYXJlKHN0cjQpOwogIGkyID0gY29sbF9kZS5jb21wYXJlKHN0cmxpdDMsIHN0cmxpdDMgKyBzaXplMywgc3RybGl0NCwgc3RybGl0NCArIHNpemU0KTsKICBWRVJJRlkgKCBpMiA9PSAtMSApOwogIFZFUklGWSAoIGkxICogaTIgPiAwICk7CgoKICAvLyBDaGVjayBieW5hbWUgbG9jYWxlCiAgaW50IGkzOwogIGludCBpNDsKICBsb25nIGwzOwogIGxvbmcgbDQ7CiAgc2l6ZTQgPSBzdHJsZW4oc3RybGl0MykgLSAxOwogIGkzID0gY29sbF9kZS5jb21wYXJlKHN0cmxpdDMsIHN0cmxpdDMgKyBzaXplNCwgc3RybGl0Mywgc3RybGl0MyArIDcpOwogIFZFUklGWSAoIGkzID09IDEgKTsKICBpMyA9IGNvbGxfZGUuY29tcGFyZShzdHJsaXQzLCBzdHJsaXQzICsgNywgc3RybGl0Mywgc3RybGl0MyArIHNpemU0KTsKICBWRVJJRlkgKCBpMyA9PSAtMSApOwogIGkzID0gY29sbF9kZS5jb21wYXJlKHN0cmxpdDMsIHN0cmxpdDMgKyA3LCBzdHJsaXQzLCBzdHJsaXQzICsgNyk7CiAgVkVSSUZZICggaTMgPT0gMCApOwoKICBpMyA9IGNvbGxfZGUuY29tcGFyZShzdHJsaXQzLCBzdHJsaXQzICsgNiwgc3RybGl0MyArIDgsIHN0cmxpdDMgKyAxNCk7CiAgVkVSSUZZICggaTMgPT0gLTEgKTsKCiAgc2l6ZTQgPSBzdHJsZW4oc3RybGl0NCkgLSAxOwogIGk0ID0gY29sbF9kZS5jb21wYXJlKHN0cmxpdDQsIHN0cmxpdDQgKyBzaXplNCwgc3RybGl0NCwgc3RybGl0NCArIDEzKTsKICBWRVJJRlkgKCBpNCA9PSAxICk7CiAgaTQgPSBjb2xsX2RlLmNvbXBhcmUoc3RybGl0NCwgc3RybGl0NCArIDEzLCBzdHJsaXQ0LCBzdHJsaXQ0ICsgc2l6ZTQpOwogIFZFUklGWSAoIGk0ID09IC0xICk7CiAgaTQgPSBjb2xsX2RlLmNvbXBhcmUoc3RybGl0NCwgc3RybGl0NCArIHNpemU0LCBzdHJsaXQ0LCBzdHJsaXQ0ICsgc2l6ZTQpOwogIFZFUklGWSAoIGk0ID09IDAgKTsKCiAgbDMgPSBjb2xsX2RlLmhhc2goc3RybGl0Mywgc3RybGl0MyArIHNpemU0KTsKICBsNCA9IGNvbGxfZGUuaGFzaChzdHJsaXQzLCBzdHJsaXQzICsgc2l6ZTQgLSAxKTsKICBWRVJJRlkgKCBsMyAhPSBsNCApOwogIGwzID0gY29sbF9kZS5oYXNoKHN0cmxpdDMsIHN0cmxpdDMgKyBzaXplNCk7CiAgbDQgPSBjb2xsX2RlLmhhc2goc3RybGl0NCwgc3RybGl0NCArIHNpemU0KTsKICBWRVJJRlkgKCBsMyAhPSBsNCApOwoKICBzdHJpbmcgc3RyNSA9IGNvbGxfZGUudHJhbnNmb3JtKHN0cmxpdDMsIHN0cmxpdDMgKyBzaXplMyk7CiAgc3RyaW5nIHN0cjYgPSBjb2xsX2RlLnRyYW5zZm9ybShzdHJsaXQ0LCBzdHJsaXQ0ICsgc2l6ZTQpOwogIGkzID0gc3RyNS5jb21wYXJlKHN0cjYpOwogIGk0ID0gY29sbF9kZS5jb21wYXJlKHN0cmxpdDMsIHN0cmxpdDMgKyBzaXplNCwgc3RybGl0NCwgc3RybGl0NCArIHNpemU0KTsKICBWRVJJRlkgKCBpNCA9PSAtMSApOwogIFZFUklGWSAoIGkzICogaTQgPiAwICk7CgogIC8vIFZlcmlmeSBieW5hbWUgPT0gZGUKICBWRVJJRlkgKCBzdHI1ID09IHN0cjMgKTsKICBWRVJJRlkgKCBzdHI2ID09IHN0cjQgKTsKfQoKaW50IG1haW4oKQp7CiAgdGVzdDAxKCk7CiAgcmV0dXJuIDA7Cn0K