Ly8gMjAwMS0wOC0xNSBCZW5qYW1pbiBLb3NuaWsgIDxia296QHJlZGhhdC5jb20+CgovLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi8vCi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCi8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQovLyBhbnkgbGF0ZXIgdmVyc2lvbi4KCi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAovLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgovLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgovLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwovLyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi8vIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAovLyBVU0EuCgovLyAyMi4yLjQuMS4xIGNvbGxhdGUgbWVtYmVycwoKLy8geyBkZy1kbyBydW4gfQovLyB7IGRnLXhmYWlsLWlmICIiIHsgIiotKi1ocHV4MTEuMjMiIH0geyAiKiIgfSB7ICIiIH0gfSAqLwovLyB7IGRnLW9wdGlvbnMgIi1maW5wdXQtY2hhcnNldD1JU084ODU5LTEiIH0KLy8geyBkZy1yZXF1aXJlLWljb252ICJJU084ODU5LTEiIH0KCiNpbmNsdWRlIDxsb2NhbGU+CiNpbmNsdWRlIDx0ZXN0c3VpdGVfaG9va3MuaD4KCnZvaWQgdGVzdDAyKCkKewogIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAgdHlwZWRlZiBzdGQ6OmNvbGxhdGU8d2NoYXJfdD46OnN0cmluZ190eXBlIHN0cmluZ190eXBlOwoKICBib29sIHRlc3QgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgPSB0cnVlOwoKICAvLyBiYXNpYyBjb25zdHJ1Y3Rpb24KICBsb2NhbGUgbG9jX2MgPSBsb2NhbGU6OmNsYXNzaWMoKTsKICBsb2NhbGUgbG9jX3VzID0gX19nbnVfdGVzdDo6dHJ5X25hbWVkX2xvY2FsZSgiZW5fVVMiKTsKICBsb2NhbGUgbG9jX2ZyID0gX19nbnVfdGVzdDo6dHJ5X25hbWVkX2xvY2FsZSgiZnJfRlIiKTsKICBsb2NhbGUgbG9jX2RlID0gX19nbnVfdGVzdDo6dHJ5X25hbWVkX2xvY2FsZSgiZGVfREUiKTsKICBWRVJJRlkoIGxvY19jICE9IGxvY19kZSApOwogIFZFUklGWSggbG9jX3VzICE9IGxvY19mciApOwogIFZFUklGWSggbG9jX3VzICE9IGxvY19kZSApOwogIFZFUklGWSggbG9jX2RlICE9IGxvY19mciApOwoKICAvLyBjYWNoZSB0aGUgY29sbGF0ZSBmYWNldHMKICBjb25zdCBjb2xsYXRlPHdjaGFyX3Q+JiBjb2xsX2RlID0gdXNlX2ZhY2V0PGNvbGxhdGU8d2NoYXJfdD4gPihsb2NfZGUpOyAKCiAgLy8gbG9uZyBoYXNoKGNvbnN0IGNoYXJUKiwgY29uc3QgY2hhclQqKSBjb3NudAogIGNvbnN0IHdjaGFyX3QqIHN0cmxpdDMgPSBMIsR1Z2xlaW4gQXVnbWVudCI7IC8vICJDIiA9PSAiQXVnbWVudCDEdWdsZWluIgogIGNvbnN0IHdjaGFyX3QqIHN0cmxpdDQgPSBMIkJhc2UgYmHfIEJh3yBCYXN0IjsgLy8gIkMiID09ICJCYXNlIGJh3yBCYd8gQmFzdCIKCiAgaW50IGkxOwogIGludCBpMjsKICBpbnQgc2l6ZTMgPSBjaGFyX3RyYWl0czx3Y2hhcl90Pjo6bGVuZ3RoKHN0cmxpdDMpIC0gMTsKICBpbnQgc2l6ZTQgPSBjaGFyX3RyYWl0czx3Y2hhcl90Pjo6bGVuZ3RoKHN0cmxpdDQpIC0gMTsKCiAgc3RyaW5nX3R5cGUgc3RyMyA9IGNvbGxfZGUudHJhbnNmb3JtKHN0cmxpdDMsIHN0cmxpdDMgKyBzaXplMyk7CiAgc3RyaW5nX3R5cGUgc3RyNCA9IGNvbGxfZGUudHJhbnNmb3JtKHN0cmxpdDQsIHN0cmxpdDQgKyBzaXplNCk7CiAgaTEgPSBzdHIzLmNvbXBhcmUoc3RyNCk7CiAgaTIgPSBjb2xsX2RlLmNvbXBhcmUoc3RybGl0Mywgc3RybGl0MyArIHNpemUzLCBzdHJsaXQ0LCBzdHJsaXQ0ICsgc2l6ZTQpOwogIFZFUklGWSAoIGkyID09IC0xICk7CiAgVkVSSUZZICggaTEgKiBpMiA+IDAgKTsKfQoKaW50IG1haW4oKQp7CiAgdGVzdDAyKCk7CiAgcmV0dXJuIDA7Cn0K