Ly8geyBkZy1yZXF1aXJlLW5hbWVkbG9jYWxlICIiIH0KCi8vIDIwMDEtMDgtMTUgQmVuamFtaW4gS29zbmlrICA8YmtvekByZWRoYXQuY29tPgoKLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgovLwovLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCi8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQovLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQovLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLy8gYW55IGxhdGVyIHZlcnNpb24uCgovLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQovLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLy8gd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQovLyBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi8vIFVTQS4KCi8vIDIyLjIuNC4xLjEgY29sbGF0ZSBtZW1iZXJzCgojaW5jbHVkZSA8bG9jYWxlPgojaW5jbHVkZSA8dGVzdHN1aXRlX2hvb2tzLmg+CgovLyBDaGVjayBHZXJtYW4gImRlX0RFIiBsb2NhbGUuCnZvaWQgdGVzdDAyKCkKewogIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAgdHlwZWRlZiBzdGQ6OmNvbGxhdGU8Y2hhcj46OnN0cmluZ190eXBlIHN0cmluZ190eXBlOwoKICBib29sIHRlc3QgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgPSB0cnVlOwoKICAvLyBiYXNpYyBjb25zdHJ1Y3Rpb24KICBsb2NhbGUgbG9jX2MgPSBsb2NhbGU6OmNsYXNzaWMoKTsKICBsb2NhbGUgbG9jX3VzID0gbG9jYWxlKCJlbl9VUyIpOwogIGxvY2FsZSBsb2NfZnIgPSBsb2NhbGUoImZyX0ZSIik7CiAgbG9jYWxlIGxvY19kZSA9IGxvY2FsZSgiZGVfREUiKTsKICBWRVJJRlkoIGxvY19jICE9IGxvY19kZSApOwogIFZFUklGWSggbG9jX3VzICE9IGxvY19mciApOwogIFZFUklGWSggbG9jX3VzICE9IGxvY19kZSApOwogIFZFUklGWSggbG9jX2RlICE9IGxvY19mciApOwoKICAvLyBjYWNoZSB0aGUgY29sbGF0ZSBmYWNldHMKICBjb25zdCBjb2xsYXRlPGNoYXI+JiBjb2xsX2RlID0gdXNlX2ZhY2V0PGNvbGxhdGU8Y2hhcj4gPihsb2NfZGUpOyAKCiAgLy8gaW50IGNvbXBhcmUoY29uc3QgY2hhclQqLCBjb25zdCBjaGFyVCosIGNvbnN0IGNoYXJUKiwgY29uc3QgY2hhclQqKSBjb25zdAoKICBjb25zdCBjaGFyKiBzdHJsaXQxID0gIm1vbmtleSBwaWNrZWQgdGlrdWFueWluIG9vbG9uZyI7CiAgY29uc3QgY2hhciogc3RybGl0MyA9ICLEdWdsZWluIEF1Z21lbnQiOyAvLyAiQyIgPT0gIkF1Z21lbnQgxHVnbGVpbiIKICBjb25zdCBjaGFyKiBzdHJsaXQ0ID0gIkJhc2UgYmHfIEJh3yBCYXN0IjsgLy8gIkMiID09ICJCYXNlIGJh3yBCYd8gQmFzdCIKCiAgaW50IGkxOwogIGludCBpMjsKICBpbnQgc2l6ZTEgPSBjaGFyX3RyYWl0czxjaGFyPjo6bGVuZ3RoKHN0cmxpdDEpIC0gMTsKICBpbnQgc2l6ZTMgPSBjaGFyX3RyYWl0czxjaGFyPjo6bGVuZ3RoKHN0cmxpdDMpIC0gMTsKICBpbnQgc2l6ZTQgPSBjaGFyX3RyYWl0czxjaGFyPjo6bGVuZ3RoKHN0cmxpdDQpIC0gMTsKCiAgaTEgPSBjb2xsX2RlLmNvbXBhcmUoc3RybGl0Mywgc3RybGl0MyArIHNpemUzLCBzdHJsaXQzLCBzdHJsaXQzICsgNyk7CiAgVkVSSUZZICggaTEgPT0gMSApOwogIGkxID0gY29sbF9kZS5jb21wYXJlKHN0cmxpdDMsIHN0cmxpdDMgKyA3LCBzdHJsaXQzLCBzdHJsaXQzICsgc2l6ZTEpOwogIFZFUklGWSAoIGkxID09IC0xICk7CiAgaTEgPSBjb2xsX2RlLmNvbXBhcmUoc3RybGl0Mywgc3RybGl0MyArIDcsIHN0cmxpdDMsIHN0cmxpdDMgKyA3KTsKICBWRVJJRlkgKCBpMSA9PSAwICk7CgogIGkxID0gY29sbF9kZS5jb21wYXJlKHN0cmxpdDMsIHN0cmxpdDMgKyA2LCBzdHJsaXQzICsgOCwgc3RybGl0MyArIDE0KTsKICBWRVJJRlkgKCBpMSA9PSAtMSApOwoKICBpMiA9IGNvbGxfZGUuY29tcGFyZShzdHJsaXQ0LCBzdHJsaXQ0ICsgc2l6ZTQsIHN0cmxpdDQsIHN0cmxpdDQgKyAxMyk7CiAgVkVSSUZZICggaTIgPT0gMSApOwogIGkyID0gY29sbF9kZS5jb21wYXJlKHN0cmxpdDQsIHN0cmxpdDQgKyAxMywgc3RybGl0NCwgc3RybGl0NCArIHNpemU0KTsKICBWRVJJRlkgKCBpMiA9PSAtMSApOwogIGkyID0gY29sbF9kZS5jb21wYXJlKHN0cmxpdDQsIHN0cmxpdDQgKyBzaXplNCwgc3RybGl0NCwgc3RybGl0NCArIHNpemU0KTsKICBWRVJJRlkgKCBpMiA9PSAwICk7Cn0KCmludCBtYWluKCkKewogIHRlc3QwMigpOwogIHJldHVybiAwOwp9Cg==