I2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8YXNtL2FyY2gvc2VjdXJlX2FwYi5oPgovLyNpbmNsdWRlPHN0ZGlvLmg+CgovLyNpbmNsdWRlIDxhc20vaW8uaD4KLy8jaW5jbHVkZSA8YXNtL2FyY2gvaW8uaD4KLy8jaW5jbHVkZSA8YXNtL2FyY2gvcmVnaXN0ZXIuaD4KLy8jaW5jbHVkZSA8YXNtL2FyY2gtZzl0di9tbWMuaD4gIC8vamlheGluZyBkZWJ1ZwoKLy9leHRlcm4gIHZvaWQgYW1sX2NhY2hlX2Rpc2FibGUodm9pZCk7Ci8vI2lmbmRlZiAgIGNoYXIqIGl0b2EoaW50bnVtLGNoYXIqc3RyLGludHJhZGl4KQoKCgpjaGFyKiBpdG9hX2Rkcl90ZXN0KGludCBudW0sY2hhcipzdHIsaW50IHJhZGl4KQp7LyrL99L9se0qLwpwcmludGYoIlxuaXRvYV9kZHJfdGVzdCAxXG4iKTsKY2hhciBpbmRleFtdPSIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiOwp1bnNpZ25lZCB1bnVtOy8q1tC85LHkwb8qLwppbnQgaT0wLGosazsKLyrIt7aodW51bbXE1rUqLwppZiAocmFkaXggPT0gMTAgJiYgbnVtPDApIC8qyq69+NbGuLrK/SovCnsKdW51bT0odW5zaWduZWQpLW51bTsKc3RyW2krK109Jy0nOwp9CmVsc2UgdW51bT0odW5zaWduZWQpbnVtOy8qxuTL+8fpv/YqLwovKtequ7sqLwpwcmludGYoIlxuaXRvYV9kZHJfdGVzdCAyXG4iKTsKcHJpbnRmKCJcbnVudW09MHglMDh4XG4iLHVudW0pOwpwcmludGYoIlxudW51bTI9MHglMDh4XG4iLCh1bnVtJSh1bnNpZ25lZClyYWRpeCkpOwpwcmludGYoIlxucmFkaXg9MHglMDh4XG4iLHJhZGl4KTsKc3RyWzBdPWluZGV4WzBdOwpwcmludGYoIlxuaXRvYV9kZHJfdGVzdCAyMlxuIik7CnVudW0vPXJhZGl4OwpwcmludGYoIlxuaXRvYV9kZHJfdGVzdCAyM1xuIik7CmRvIHsKc3RyW2krK109aW5kZXhbdW51bSUodW5zaWduZWQpcmFkaXhdOwp1bnVtLz1yYWRpeDsKfXdoaWxlKHVudW0pOwpwcmludGYoIlxuaXRvYV9kZHJfdGVzdCAzXG4iKTsKc3RyW2ldPSdcMCc7Ci8qxObQ8iovCmlmIChzdHJbMF0gPT0gJy0nKSBrPTE7LyrKrr341sa4usr9Ki8KZWxzZSBrPTA7CmNoYXIgdGVtcDsKcHJpbnRmKCJcbml0b2FfZGRyX3Rlc3QgNFxuIik7CmZvciAoaj1rO2o8PShpLTEpLzI7aisrKQp7CnRlbXA9c3RyW2pdOwpzdHJbal09c3RyW2ktMStrLWpdOwpzdHJbaS0xK2stal09dGVtcDsKfQpyZXR1cm4gc3RyOwp9Ci8vI2VuZGlmCgojZGVmaW5lIFREQVRBMzJGIDB4ZmZmZmZmZmYKI2RlZmluZSBUREFUQTMyQSAweGFhYWFhYWFhCiNkZWZpbmUgVERBVEEzMjUgMHg1NTU1NTU1NQoKLy8jZGVmaW5lIEREUl9URVNUX0FDTENETFIKCnVuc2lnbmVkIGludCBnbG9iYWxfZGRyX2Nsaz0xOwogIHVuc2lnbmVkIGludCAgIGVycm9yX2NvdW50ID0wOwogdW5zaWduZWQgaW50ICBlcnJvcl9vdXRvZl9jb3VudF9mbGFnPTA7CiB1bnNpZ25lZCBpbnQgIGNvcHlfdGVzdF9mbGFnID0gMDsKICB1bnNpZ25lZCBpbnQgIHRyYWluaW5nX3BhdHRlcm5fZmxhZyA9IDA7CiAgdW5zaWduZWQgaW50IHRlc3Rfc3RhcnRfYWRkcj0weDEwODAwMDA7CgogICB1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfd2RxX29yZ19hWzRdOwogICB1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVs0XTsKICAgdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX3dkcV9taW5fYVs0XTsKICAgdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX3dkcV9tYXhfYVs0XTsKICAgdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2FbNF07CiAgIHVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21heF9hWzRdOwoKICAgdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX3dkcV9vcmdfYls0XTsKICAgdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2JbNF07CiAgIHVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWluX2JbNF07CiAgIHVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWF4X2JbNF07CiAgIHVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21pbl9iWzRdOwogICB1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfcmRxc19tYXhfYls0XTsKICAgdW5zaWduZWQgaW50ICBhY2JkbHIwXzlfcmVnX29yZ1sxMF07CiAgIHVuc2lnbmVkIGludCAgYWNiZGxyMF85X3JlZ19zZXR1cF9tYXhbNDBdOwogICB1bnNpZ25lZCBpbnQgIGFjYmRscjBfOV9yZWdfaG9sZF9tYXhbNDBdOwogICAgICB1bnNpZ25lZCBpbnQgIGFjYmRscjBfOV9yZWdfc2V0dXBfdGltZVs0MF07CiAgIHVuc2lnbmVkIGludCAgYWNiZGxyMF85X3JlZ19ob2xkX3RpbWVbNDBdOwogICAvLyAgICB1bnNpZ25lZCBpbnQgIGRhdGFfYmRscjBfNV9yZWdfb3JnWzZdOwogICAgICB1bnNpZ25lZCBpbnQgIGRhdGFfYmRscjBfNV9yZWdfb3JnWzI4XTsvLzQvLzRsYW5lCiAgIHVuc2lnbmVkIGludCAgYmRscjBfOV9yZWdfc2V0dXBfbWF4WzI0KjRdOy8vNC8vNCBsYW5lIDk2IGJkbHIKICAgdW5zaWduZWQgaW50ICBiZGxyMF85X3JlZ19ob2xkX21heFsyNCo0XTsKICAgIHVuc2lnbmVkIGludCAgYmRscjBfOV9yZWdfc2V0dXBfdGltZVsyNCo0XTsKICAgdW5zaWduZWQgaW50ICBiZGxyMF85X3JlZ19ob2xkX3RpbWVbMjQqNF07CgojZGVmaW5lIHJlYWRsKGFkZHIpICAgICh1bnNpZ25lZCBpbnQgKSgqKCh2b2xhdGlsZSAgdW5zaWduZWQgaW50ICAqKSgodW5zaWduZWQgbG9uZykodW5zaWduZWQgaW50IClhZGRyKSkpICAvL3JkX3JlZyhhZGRyKQojZGVmaW5lIHdyaXRlbChkYXRhICxhZGRyKSAgKCooKHZvbGF0aWxlICB1bnNpZ25lZCBpbnQgICopKCh1bnNpZ25lZCBsb25nKSh1bnNpZ25lZCBpbnQgKWFkZHIpKSk9KGRhdGEpICAvL3dyX3JlZyhhZGRyLCBkYXRhKQoKI2RlZmluZSB3cl9yZWcoYWRkciwgZGF0YSkJKCooKHZvbGF0aWxlICB1bnNpZ25lZCBpbnQgICopKCh1bnNpZ25lZCBsb25nKSh1bnNpZ25lZCBpbnQgKWFkZHIpKSk9KGRhdGEpICAvL3dyX3JlZyhhZGRyLCBkYXRhKQojZGVmaW5lIHJkX3JlZyhhZGRyKQkJICh1bnNpZ25lZCBpbnQgKSgqKCh2b2xhdGlsZSAgdW5zaWduZWQgaW50ICAqKSgodW5zaWduZWQgbG9uZykodW5zaWduZWQgaW50IClhZGRyKSkpICAvL3JkX3JlZyhhZGRyKQoKCgovLyNkZWZpbmUgZGRyX3VkZWxheShhKSAgZG97fXdoaWxlKChhPDw1KS0tKTsKI2RlZmluZSBQX0VFX1RJTUVSX0UxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDI2NjIgIDw8IDIpICsgMHhjMTEwMDAwMCkKdm9pZCBkZHJfdWRlbGF5KHVuc2lnbmVkIGludCB1cykKewovLyNpZm5kZWYgQ09ORklHX1BYUF9FTVVMQVRPUgoJdW5zaWduZWQgaW50IHQwID0gKCooKHZvbGF0aWxlIHVuc2lnbmVkICopKFBfRUVfVElNRVJfRTEpKSk7CgoJd2hpbGUgKCgqKCh2b2xhdGlsZSB1bnNpZ25lZCAqKShQX0VFX1RJTUVSX0UxKSkpIC0gdDAgPD0gdXMpCgkJOwovLyNlbmRpZgp9Cgp2b2lkIGRkcl90ZXN0X3dhdGNoZG9nX2luaXQodWludDMyX3QgbXNlYykKewojZGVmaW5lIFBfV0FUQ0hET0dfQ05UTCAgICAgICAgICAgICAgMHhjMTEwOThkMAojZGVmaW5lIFBfV0FUQ0hET0dfQ05UTDEgICAgICAgICAgICAweGMxMTA5OGQ0CiNkZWZpbmUgUF9XQVRDSERPR19UQ05UICAgICAgICAgICAgIDB4YzExMDk4ZDgKI2RlZmluZSBQX1dBVENIRE9HX1JFU0VUICAgICAgICAgICAgMHhjMTEwOThkYwoJLy8gc3JjOiAyNE1IegoJLy8gZGl2OiAyNDAwMCBmb3IgMW1zCgkvLyByZXNldCBhby0yMiBhbmQgZWUtMjEKCXdyaXRlbCggKDE8PDI0KXwoMTw8MjUpfCgxPDwyMyl8KDE8PDIxKXwoMjQwMDAtMSksUF9XQVRDSERPR19DTlRMKTsKCgkvLyBzZXQgdGltZW91dAoJLy8qUF9XQVRDSERPR19UQ05UID0gbXNlYzsKCXdyaXRlbChtc2VjLFBfV0FUQ0hET0dfVENOVCk7IC8vYml0MC0xNQoJd3JpdGVsKDAsUF9XQVRDSERPR19SRVNFVCk7CgkvLypQX1dBVENIRE9HX1JFU0VUID0gMDsKCgkvLyBlbmFibGUKCXdyaXRlbCgocmVhZGwoUF9XQVRDSERPR19DTlRMKSl8KDE8PDE4KSxQX1dBVENIRE9HX0NOVEwpOwoJLy8qUF9XQVRDSERPR19DTlRMIHw9ICgxPDwxOCk7Cn0KCnZvaWQgZGRyX3Rlc3Rfd2F0Y2hkb2dfcmVzZXRfc3lzdGVtKHZvaWQpCnsKI2RlZmluZSBQX1dBVENIRE9HX0NOVEwgICAgICAgICAgICAgIDB4YzExMDk4ZDAKI2RlZmluZSBQX1dBVENIRE9HX0NOVEwxICAgICAgICAgICAgMHhjMTEwOThkNAojZGVmaW5lIFBfV0FUQ0hET0dfVENOVCAgICAgICAgICAgICAweGMxMTA5OGQ4CiNkZWZpbmUgUF9XQVRDSERPR19SRVNFVCAgICAgICAgICAgIDB4YzExMDk4ZGMKCQlpbnQgaTsKCgkJd2hpbGUgKDEpIHsKCQl3cml0ZWwoCTB4Mwl8ICgxIDw8IDIxKSAvLyBzeXMgcmVzZXQgZW4gIGFvIGVlIDMKCQkJCXwgKDEgPDwgMjMpIC8vIGludGVycnVwdCBlbgoJCQkJfCAoMSA8PCAyNCkgLy8gY2xrIGVuCgkJCQl8ICgxIDw8IDI1KSAvLyBjbGsgZGl2IGVuCgkJCQl8ICgxIDw8IDI2KSAvLyBzeXMgcmVzZXQgbm93ICBhbyBlZSAzCgkJCSwgUF9XQVRDSERPR19DTlRMKTsKCQlwcmludGYoIlxuUF9XQVRDSERPR19DTlRMPT0leDA4IixyZWFkbChQX1dBVENIRE9HX0NOVEwpKTsKCQlwcmludGYoIlxuUF9XQVRDSERPR19DTlRMPT0leDA4IixyZWFkbChQX1dBVENIRE9HX0NOVEwpKTsKCQlwcmludGYoIlxuUF9XQVRDSERPR19DTlRMPT0leDA4IixyZWFkbChQX1dBVENIRE9HX0NOVEwpKTsKCQkJCXdyaXRlbCgwLCBQX1dBVENIRE9HX1JFU0VUKTsKCgkJCQl3cml0ZWwocmVhZGwoUF9XQVRDSERPR19DTlRMKSB8ICgxPDwxOCksIC8vIHdhdGNoZG9nIGVuCgkJCVBfV0FUQ0hET0dfQ05UTCk7CgkJCQlmb3IgKGk9MDsgaTwxMDA7IGkrKykKCQkJCQkJcmVhZGwoUF9XQVRDSERPR19DTlRMKTsvKkRlY2VpdmUgZ2NjIGZvciB3YWl0aW5nIHNvbWUgY3ljbGVzICovCgl9Cn0KCi8vI2RlZmluZSBDT05GSUdfRERSX0NNRF9CRExfVFVORQovLyNkZWZpbmUgIENPTkZJR19DTURfRERSX1RFU1QKI2RlZmluZSBQX0REUl9QSFlfREVGQVVMVCAgICAgICAgICAgMAojZGVmaW5lIFBfRERSX1BIWV9HWF9CQUJZICAgICAgICAgICAgIDEKI2RlZmluZSAgUF9ERFJfUEhZX0dYX1RWX0JBQlkgICAgIDIKI2RlZmluZSAgUF9ERFJfUEhZXzkwNVggICAgICAgIDMKCiNkZWZpbmUgQ09ORklHX0REUl9QSFkgICAgUF9ERFJfUEhZXzkwNVgvL1BfRERSX1BIWV9HWF9CQUJZLy9QX0REUl9QSFlfOTA1WC8vIFBfRERSX1BIWV9HWF9CQUJZCgojZGVmaW5lIFBBVFRFUk5fVVNFX0REUl9ERVMKI2RlZmluZSAgVVNFXzY0QklUX1BPSU5URVIKLy8jZGVmaW5lICBVU0VfMzJCSVRfUE9JTlRFUgojaWZkZWYgVVNFXzY0QklUX1BPSU5URVIKI2RlZmluZSBwX2NvbnZ0ZXJfaW50KGEpICAoIHVuc2lnbmVkIGludCApKCB1bnNpZ25lZCBsb25nICkoYSkKI2RlZmluZSBpbnRfY29udnRlcl9wKGEpICAoIHVuc2lnbmVkIGxvbmcgKShhKQoKICNlbHNlCiAjZGVmaW5lIHBfY29udnRlcl9pbnQoYSkgICggdW5zaWduZWQgaW50ICkoYSkKICNkZWZpbmUgaW50X2NvbnZ0ZXJfcChhKSAgKCB1bnNpZ25lZCBpbnQgKShhKQogI2VuZGlmCgojaWZkZWYgUEFUVEVSTl9VU0VfRERSX0RFUwojZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICAoZGVzW2FdXnBhdHRlcm5fIyNiW2NdW2RdKQojZGVmaW5lIGRlc19pbnZfcGF0dGVybihhLGIsYyxkKSAgICggZGVzW2FdXih+KHBhdHRlcm5fIyNiW2NdW2RdKSkpCiNkZWZpbmUgZGVzX3hvcl9wYXR0ZXJuKGEsYikgICAoIGFeYikKLy9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldCgogI2Vsc2UKI2RlZmluZSBkZXNfcGF0dGVybihhLGIsYyxkKSAgKGRlc1thXSYwKStwYXR0ZXJuXyMjYltjXVtkXQojZGVmaW5lIGRlc19pbnZfcGF0dGVybihhLGIsYyxkKSAgKGRlc1thXSYwKSt+KHBhdHRlcm5fIyNiW2NdW2RdKQojZGVmaW5lIGRlc194b3JfcGF0dGVybihhLGIpICAoYSYwK2IpCiAjZW5kaWYKCgojZGVmaW5lICBERFJfTENETFJfQ0tfVVNFX0ZBU1RfUEFUVEVSTgoKI2RlZmluZSAgRERSX1BSRUZFVENIX0NBQ0hFCiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKI2RlZmluZSBkZHJfcGxkX2NhY2hlKFApICAgYXNtICgicHJmbSBQTERMMUtFRVAsIFslMCwgIzM3Nl0iOjoiciIgKFApKQojZWxzZQojZGVmaW5lIGRkcl9wbGRfY2FjaGUoUCkKI2VuZGlmCgojaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfR1hfQkFCWSkKCSAgI2RlZmluZSBERFIwX1BVQl9SRUdfQkFTRQkJCTB4Yzg4MzYwMDAKICAgICAgICAgICNkZWZpbmUgRERSMV9QVUJfUkVHX0JBU0UJCQkweGM4ODM2MDAwCgkgI2RlZmluZSAgQ0hBTk5FTF9BX1JFR19CQVNFICAwCgkgICNkZWZpbmUgIENIQU5ORUxfQl9SRUdfQkFTRSAgMHgyMDAwCgkgICNkZWZpbmUgUF9ERFIwX0NMS19DVFJMICAgMHhjODgzNmMwMAogICAgICAgICAjZGVmaW5lIFBfRERSMV9DTEtfQ1RSTCAgMHhjODgzNmMwMAoJICAjZGVmaW5lIE9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKSAgICAgICh3cml0ZWwoKDApLCAweGM4ODM2YzAwKSkKCSAgI2RlZmluZSBPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCkgICAgICh3cml0ZWwoKDApLCAweGM4ODM2YzAwKSkKCSAgI2RlZmluZSBDTE9TRV9DSEFOTkVMX0FfUEhZX0NMSygpICAgICAgKHdyaXRlbCgoNSksIDB4Yzg4MzZjMDApKQoJICAjZGVmaW5lIENMT1NFX0NIQU5ORUxfQl9QSFlfQ0xLKCkgICAgICh3cml0ZWwoKDUpLCAweGM4ODM2YzAwKSkKCSAgI2RlZmluZSBQX0lTQV9USU1FUkUgICAgICAgICAgICAgICAgMHhjMTEwOTk4OAoJICAgI2RlZmluZSBnZXRfdXNfdGltZSgpICAgIChyZWFkbChQX0lTQV9USU1FUkUpKQogICAgICAgI2RlZmluZSBBTV9ERFJfUExMX0NOVEwJCQkJCQkweGM4ODM2ODAwCgkgICAjZGVmaW5lIEREUjBfUFVCX1pRQ1IJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OTA8PDIpKQoJI2RlZmluZSBERFIwX1BVQl9aUTBQUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5MTw8MikpCgkjZGVmaW5lIEREUjBfUFVCX1pRMERSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDkyPDwyKSkKCgkgICAjZGVmaW5lIEREUjFfUFVCX1pRQ1IJCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4OTA8PDIpKQoJI2RlZmluZSBERFIxX1BVQl9aUTBQUgkJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHg5MTw8MikpCgkjZGVmaW5lIEREUjFfUFVCX1pRMERSCQkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweDkyPDwyKSkKCgkjZGVmaW5lIEREUjBfUFVCX1pRMVBSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDk1PDwyKSkKI2RlZmluZSBERFIwX1BVQl9aUTFEUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5Njw8MikpCiNkZWZpbmUgRERSMF9QVUJfWlExU1IJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OTc8PDIpKQovLzB4OTggcmVzZXJ2ZWQpCiNkZWZpbmUgRERSMF9QVUJfWlEyUFIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OTk8PDIpKQojZGVmaW5lIEREUjBfUFVCX1pRMkRSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDlBPDwyKSkKI2RlZmluZSBERFIwX1BVQl9aUTJTUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5Qjw8MikpCi8vMHg5YyByZXNlcnZlZCkKI2RlZmluZSBERFIwX1BVQl9aUTNQUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5RDw8MikpCiNkZWZpbmUgRERSMF9QVUJfWlEzRFIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OUU8PDIpKQojZGVmaW5lIEREUjBfUFVCX1pRM1NSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDlGPDwyKSkKICAgICNkZWZpbmUgQUNCRExSX01BWCAgIDBYMUYKICAgICNkZWZpbmUgQUNMQ0RMUl9NQVggICAwWEZGCiAgICAjZGVmaW5lIERRQkRMUl9NQVggICAwWDFGCiAgICAjZGVmaW5lIERRTENETFJfTUFYICAgMFhGRgogICAgI2RlZmluZSBEWE5HVFJfTUFYICAgMFg3CiAgICAjZGVmaW5lIEFDQkRMUl9OVU0gICAxMAoKCgojZGVmaW5lIERNQ19SRUdfQkFTRQkJCQkJCTB4Yzg4MzgwMDAKI2RlZmluZSBETUNfTU9OX0NUUkwyCQkJCQkJKERNQ19SRUdfQkFTRSArICgweDI2IDw8MiApKQogICAvL2JpdCAzMS4gICBxb3NfbW9uX2VuLiAgICB3cml0ZSAxIHRvIHRyaWdnZXIgdGhlIGVuYWJsZS4gcG9sbGluZyB0aGlzIGJpdCAwLCBtZWFucyBmaW5pc2hlZC4gIG9yIHVzZSBpbnRlcnJ1cHQgdG8gY2hlY2sgZmluaXNoLgogICAvL2JpdCAzMC4gICBxb3NfbW9uIGludGVycnVwdCBjbGVhci4gIGNsZWFyIHRoZSBxb3MgbW9uaXRvciByZXN1bHQuICByZWFkIDEgPSBxb3MgbW9uIGZpbmlzaCBpbnRlcnJ1cHQuCiAgIC8vYml0IDIwLiAgIHFvc19tb25fdHJpZ19zZWwuICAxID0gdnN5bmMuICAwID0gdGltZXIuCiAgIC8vYml0IDE5OjE2LiAgcW9zIG1vbml0b3IgY2hhbm5lbCBzZWxlY3QuICAgc2VsZWN0IG9uZSBhdCBvbmUgdGltZSBvbmx5LgogICAvL2JpdCAxNTowLiAgIHBvcnQgc2VsZWN0IGZvciB0aGUgc2VsZWN0ZWQgY2hhbm5lbC4KI2RlZmluZSBETUNfTU9OX0NUUkwzCQkJCQkJKERNQ19SRUdfQkFTRSArICgweDI3IDw8MiApKQogIC8vIHFvc19tb25fY2xrX3RpbWVyLiAgIEhvdyBsb25nIHRvIG1lYXN1cmUgdGhlIGJhbmR3aWR0aC4KCgojZGVmaW5lIERNQ19NT05fQUxMX1JFUV9DTlQJCQkJCShETUNfUkVHX0JBU0UgKyAoMHgyOCA8PDIgKSkKICAvLyBhdCB0aGUgdGVzdCBwZXJpb2QsICB0aGUgd2hvbGUgTU1DIHJlcXVlc3QgdGltZS4KI2RlZmluZSBETUNfTU9OX0FMTF9HUkFOVF9DTlQJCQkJKERNQ19SRUdfQkFTRSArICgweDI5IDw8MiApKQogIC8vIGF0IHRoZSB0ZXN0IHBlcmlvZCwgIHRoZSB3aG9sZSBNTUMgZ3JhbnRlZCBkYXRhIGN5Y2xlcy4gNjRiaXRzIHVuaXQuCiNkZWZpbmUgRE1DX01PTl9PTkVfR1JBTlRfQ05UCQkJCShETUNfUkVHX0JBU0UgKyAoMHgyYSA8PDIgKSkKCgojZWxpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV9HWF9UVl9CQUJZKQoKCgkgICNkZWZpbmUgRERSMF9QVUJfUkVHX0JBU0UJCQkweGM4ODM2MDAwCiAgICAgICAgICAjZGVmaW5lIEREUjFfUFVCX1JFR19CQVNFCQkJMHhjODgzNzAwMAoJICNkZWZpbmUgIENIQU5ORUxfQV9SRUdfQkFTRSAgMAoJICAjZGVmaW5lICBDSEFOTkVMX0JfUkVHX0JBU0UgIDB4MTAwMAoJCSNkZWZpbmUgUF9ERFIwX0NMS19DVFJMICAgMHhjODgzNmMwMAogICAgICAgICAjZGVmaW5lIFBfRERSMV9DTEtfQ1RSTCAgMHhjODgzNmMwMAoJICAjZGVmaW5lIE9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKSAgICAgICh3cml0ZWwoKDApLCAweGM4ODM2YzAwKSkKCSAgICNkZWZpbmUgT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpICAgICAgKHdyaXRlbCgoMCksIDB4Yzg4MzdjMDApKQoJICAgICNkZWZpbmUgQ0xPU0VfQ0hBTk5FTF9BX1BIWV9DTEsoKSAgICAgICh3cml0ZWwoKDB4MTJhKSwgMHhjODgzNmMwMCkpCgkJICNkZWZpbmUgQ0xPU0VfQ0hBTk5FTF9CX1BIWV9DTEsoKSAgICAod3JpdGVsKCgweDEyYSksIDB4Yzg4MzdjMDApKQoJCSNkZWZpbmUgUF9JU0FfVElNRVJFICAgICAgICAgICAgICAgICAweGMxMTA5OTg4CgkgICAjZGVmaW5lIGdldF91c190aW1lKCkgICAocmVhZGwoUF9JU0FfVElNRVJFKSApCgkgICAjZGVmaW5lIEFNX0REUl9QTExfQ05UTAkJCQkJCTB4Yzg4MzY4MDAKCSAgICNkZWZpbmUgRERSMF9QVUJfWlFDUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5MDw8MikpCgkgICAjZGVmaW5lIEREUjBfUFVCX1pRMFBSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDkxPDwyKSkKCSAgICNkZWZpbmUgRERSMF9QVUJfWlEwRFIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OTI8PDIpKQoJCSNkZWZpbmUgRERSMV9QVUJfWlFDUgkJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHg5MDw8MikpCgkjZGVmaW5lIEREUjFfUFVCX1pRMFBSCQkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweDkxPDwyKSkKCSNkZWZpbmUgRERSMV9QVUJfWlEwRFIJCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4OTI8PDIpKQoKCgojZGVmaW5lIEREUjBfUFVCX1pRMFNSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDkzPDwyKSkKLy8weDk0IHJlc2VydmVkKQojZGVmaW5lIEREUjBfUFVCX1pRMVBSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDk1PDwyKSkKI2RlZmluZSBERFIwX1BVQl9aUTFEUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5Njw8MikpCiNkZWZpbmUgRERSMF9QVUJfWlExU1IJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OTc8PDIpKQovLzB4OTggcmVzZXJ2ZWQpCiNkZWZpbmUgRERSMF9QVUJfWlEyUFIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OTk8PDIpKQojZGVmaW5lIEREUjBfUFVCX1pRMkRSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDlBPDwyKSkKI2RlZmluZSBERFIwX1BVQl9aUTJTUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5Qjw8MikpCi8vMHg5YyByZXNlcnZlZCkKI2RlZmluZSBERFIwX1BVQl9aUTNQUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5RDw8MikpCiNkZWZpbmUgRERSMF9QVUJfWlEzRFIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OUU8PDIpKQojZGVmaW5lIEREUjBfUFVCX1pRM1NSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDlGPDwyKSkKICAgICNkZWZpbmUgQUNCRExSX01BWCAgIDBYMUYKICAgICNkZWZpbmUgQUNMQ0RMUl9NQVggICAwWEZGCiAgICAjZGVmaW5lIERRQkRMUl9NQVggICAwWDFGCiAgICAjZGVmaW5lIERRTENETFJfTUFYICAgMFhGRgoJICAjZGVmaW5lIERYTkdUUl9NQVggICAwWDcKCiNkZWZpbmUgRE1DX1JFR19CQVNFCQkJCQkJMHhjODgzODAwMAojZGVmaW5lIERNQ19NT05fQ1RSTDIJCQkJCQkoRE1DX1JFR19CQVNFICsgKDB4MjYgPDwyICkpCiAgIC8vYml0IDMxLiAgIHFvc19tb25fZW4uICAgIHdyaXRlIDEgdG8gdHJpZ2dlciB0aGUgZW5hYmxlLiBwb2xsaW5nIHRoaXMgYml0IDAsIG1lYW5zIGZpbmlzaGVkLiAgb3IgdXNlIGludGVycnVwdCB0byBjaGVjayBmaW5pc2guCiAgIC8vYml0IDMwLiAgIHFvc19tb24gaW50ZXJydXB0IGNsZWFyLiAgY2xlYXIgdGhlIHFvcyBtb25pdG9yIHJlc3VsdC4gIHJlYWQgMSA9IHFvcyBtb24gZmluaXNoIGludGVycnVwdC4KICAgLy9iaXQgMjAuICAgcW9zX21vbl90cmlnX3NlbC4gIDEgPSB2c3luYy4gIDAgPSB0aW1lci4KICAgLy9iaXQgMTk6MTYuICBxb3MgbW9uaXRvciBjaGFubmVsIHNlbGVjdC4gICBzZWxlY3Qgb25lIGF0IG9uZSB0aW1lIG9ubHkuCiAgIC8vYml0IDE1OjAuICAgcG9ydCBzZWxlY3QgZm9yIHRoZSBzZWxlY3RlZCBjaGFubmVsLgojZGVmaW5lIERNQ19NT05fQ1RSTDMJCQkJCQkoRE1DX1JFR19CQVNFICsgKDB4MjcgPDwyICkpCiAgLy8gcW9zX21vbl9jbGtfdGltZXIuICAgSG93IGxvbmcgdG8gbWVhc3VyZSB0aGUgYmFuZHdpZHRoLgoKCiNkZWZpbmUgRE1DX01PTl9BTExfUkVRX0NOVAkJCQkJKERNQ19SRUdfQkFTRSArICgweDI4IDw8MiApKQogIC8vIGF0IHRoZSB0ZXN0IHBlcmlvZCwgIHRoZSB3aG9sZSBNTUMgcmVxdWVzdCB0aW1lLgojZGVmaW5lIERNQ19NT05fQUxMX0dSQU5UX0NOVAkJCQkoRE1DX1JFR19CQVNFICsgKDB4MjkgPDwyICkpCiAgLy8gYXQgdGhlIHRlc3QgcGVyaW9kLCAgdGhlIHdob2xlIE1NQyBncmFudGVkIGRhdGEgY3ljbGVzLiA2NGJpdHMgdW5pdC4KI2RlZmluZSBETUNfTU9OX09ORV9HUkFOVF9DTlQJCQkJKERNQ19SRUdfQkFTRSArICgweDJhIDw8MiApKQogIC8vIGF0IHRoZSB0ZXN0IHBlcmlvZCwgIHRoZSBncmFudGVkIGRhdGEgY3ljbGVzIGZvciB0aGUgc2VsZWN0ZWQgY2hhbm5lbCBhbmQgcG9ydHMuCgojZWxpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV85MDVYKQoKCSAgICNkZWZpbmUgUF9JU0FfVElNRVJFICAgICAgICAgICAgICAgICAweGMxMTA5OTg4CgkgICAjZGVmaW5lIGdldF91c190aW1lKCkgICAocmVhZGwoUF9JU0FfVElNRVJFKSApCgoJICAgI2RlZmluZSBERFIwX1BVQl9SRUdfQkFTRQkJCTB4Yzg4MzYwMDAKICAgICAgICAgICNkZWZpbmUgRERSMV9QVUJfUkVHX0JBU0UJCQkweGM4ODM2MDAwCgkgICAjZGVmaW5lICBDSEFOTkVMX0FfUkVHX0JBU0UgIDAKCSAgICNkZWZpbmUgIENIQU5ORUxfQl9SRUdfQkFTRSAgMC8vMHgxMDAwCgkgICAjZGVmaW5lIE1NQ19SRUdfQkFTRSAgIDB4Yzg4MzcwMDAKCSAgICNkZWZpbmUgICBERFJfQ0xLX0NOVEwgICAoTU1DX1JFR19CQVNFICsgKCAweDcJPDwgMiApKQoJICAgI2RlZmluZSBQX0REUjBfQ0xLX0NUUkwgICBERFJfQ0xLX0NOVEwKICAgICAgICAgICNkZWZpbmUgUF9ERFIxX0NMS19DVFJMICBERFJfQ0xLX0NOVEwKCSAgICNkZWZpbmUgT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpICAgICAgKHdyaXRlbCgoMFhiMDAwYTAwMCksIEREUl9DTEtfQ05UTCkpCgkgICAjZGVmaW5lIE9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKSAgICAgICh3cml0ZWwoKDBYYjAwMGEwMDApLCBERFJfQ0xLX0NOVEwpKQoJICAgI2RlZmluZSBDTE9TRV9DSEFOTkVMX0FfUEhZX0NMSygpICAgICAod3JpdGVsKCgwWGIwMDBhMDA1KSwgRERSX0NMS19DTlRMKSkKCSAgICNkZWZpbmUgQ0xPU0VfQ0hBTk5FTF9CX1BIWV9DTEsoKSAgICAgKHdyaXRlbCgoMFhiMDAwYTAwNSksIEREUl9DTEtfQ05UTCkpCgoKCgkgICAjZGVmaW5lIEFNX0REUl9QTExfQ05UTDAgICAgIAkgICAgICAgKE1NQ19SRUdfQkFTRSArICggMHgwCTw8IDIgKSkKCSAgICNkZWZpbmUgQU1fRERSX1BMTF9DTlRMCQkJCQkJQU1fRERSX1BMTF9DTlRMMAoJICAgI2RlZmluZSAgRERSMF9QVUJfWlFDUiAgICAgICAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYTAgPDwgMiApKQogICAgICAgICAgI2RlZmluZSAgRERSMF9QVUJfWlEwUFIgICAgICAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYTEgPDwgMiApKQogICAgICAgICAgI2RlZmluZSAgRERSMF9QVUJfWlEwRFIgICAgICAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYTIgPDwgMiApKQogICAgICAgICAgI2RlZmluZSAgRERSMF9QVUJfWlEwU1IgICAgICAgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYTMgPDwgMiApKQoKICAgICAgICAgICNkZWZpbmUgIEREUjBfUFVCX1pRMVBSICAgICAgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWE1IDw8IDIgKSkKICAgICAgICAgICNkZWZpbmUgIEREUjBfUFVCX1pRMURSICAgICAgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWE2IDw8IDIgKSkKICAgICAgICAgICNkZWZpbmUgIEREUjBfUFVCX1pRMVNSICAgICAgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWE3IDw8IDIgKSkKCiAgICAgICAgICAjZGVmaW5lICBERFIwX1BVQl9aUTJQUiAgICAgICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFhOSA8PCAyICkpCiAgICAgICAgICAjZGVmaW5lICBERFIwX1BVQl9aUTJEUiAgICAgICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFhQSA8PCAyICkpCiAgICAgICAgICAjZGVmaW5lICBERFIwX1BVQl9aUTJTUiAgICAgICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFhQiA8PCAyICkpCgoJICAgI2RlZmluZSBERFIxX1BVQl9aUUNSCQkJCQlERFIwX1BVQl9aUTBQUgoJICAgI2RlZmluZSBERFIxX1BVQl9aUTBQUgkJCQkJRERSMF9QVUJfWlEwUFIKCSAgICNkZWZpbmUgRERSMV9QVUJfWlEwRFIJCQkJCUREUjBfUFVCX1pRMERSCgogICAgI2RlZmluZSBBQ0JETFJfTUFYICAgMFgzRgogICAgI2RlZmluZSBBQ0xDRExSX01BWCAgIDBYMUZGCiAgICAjZGVmaW5lIERRQkRMUl9NQVggICAwWDNGCiAgICAjZGVmaW5lIERRTENETFJfTUFYICAgMFgxRkYKICAjZGVmaW5lIERYTkdUUl9NQVggICAwWDFGCgogICAgICAgICAgI2RlZmluZSBETUNfUkVHX0JBU0UJCQkJCQlNTUNfUkVHX0JBU0UKICAgICAgICAgICNkZWZpbmUgRE1DX01PTl9DVFJMMgkJCQkJCShETUNfUkVHX0JBU0UgKyAoMHgyNiA8PDIgKSkKICAgLy9iaXQgMzEuICAgcW9zX21vbl9lbi4gICAgd3JpdGUgMSB0byB0cmlnZ2VyIHRoZSBlbmFibGUuIHBvbGxpbmcgdGhpcyBiaXQgMCwgbWVhbnMgZmluaXNoZWQuICBvciB1c2UgaW50ZXJydXB0IHRvIGNoZWNrIGZpbmlzaC4KICAgLy9iaXQgMzAuICAgcW9zX21vbiBpbnRlcnJ1cHQgY2xlYXIuICBjbGVhciB0aGUgcW9zIG1vbml0b3IgcmVzdWx0LiAgcmVhZCAxID0gcW9zIG1vbiBmaW5pc2ggaW50ZXJydXB0LgogICAvL2JpdCAyMC4gICBxb3NfbW9uX3RyaWdfc2VsLiAgMSA9IHZzeW5jLiAgMCA9IHRpbWVyLgogICAvL2JpdCAxOToxNi4gIHFvcyBtb25pdG9yIGNoYW5uZWwgc2VsZWN0LiAgIHNlbGVjdCBvbmUgYXQgb25lIHRpbWUgb25seS4KICAgLy9iaXQgMTU6MC4gICBwb3J0IHNlbGVjdCBmb3IgdGhlIHNlbGVjdGVkIGNoYW5uZWwuCiAgICAgICAgICNkZWZpbmUgRE1DX01PTl9DVFJMMwkJCQkJCShETUNfUkVHX0JBU0UgKyAoMHgyNyA8PDIgKSkKICAvLyBxb3NfbW9uX2Nsa190aW1lci4gICBIb3cgbG9uZyB0byBtZWFzdXJlIHRoZSBiYW5kd2lkdGguCgoKI2RlZmluZSBETUNfTU9OX0FMTF9SRVFfQ05UCQkJCQkoRE1DX1JFR19CQVNFICsgKDB4MjggPDwyICkpCiAgLy8gYXQgdGhlIHRlc3QgcGVyaW9kLCAgdGhlIHdob2xlIE1NQyByZXF1ZXN0IHRpbWUuCiNkZWZpbmUgRE1DX01PTl9BTExfR1JBTlRfQ05UCQkJCShETUNfUkVHX0JBU0UgKyAoMHgyOSA8PDIgKSkKICAvLyBhdCB0aGUgdGVzdCBwZXJpb2QsICB0aGUgd2hvbGUgTU1DIGdyYW50ZWQgZGF0YSBjeWNsZXMuIDY0Yml0cyB1bml0LgojZGVmaW5lIERNQ19NT05fT05FX0dSQU5UX0NOVAkJCQkoRE1DX1JFR19CQVNFICsgKDB4MmEgPDwyICkpCiAgLy8gYXQgdGhlIHRlc3QgcGVyaW9kLCAgdGhlIGdyYW50ZWQgZGF0YSBjeWNsZXMgZm9yIHRoZSBzZWxlY3RlZCBjaGFubmVsIGFuZCBwb3J0cy4KCiNlbGlmIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZX0RFRkFVTFQpCgogICAgICAgICAgICNkZWZpbmUgRERSMF9QVUJfUkVHX0JBU0UJCQkweGM4MDAxMDAwCQkvLzB4Yzg4MzYwMDAKICAgICAgICAgICNkZWZpbmUgRERSMV9QVUJfUkVHX0JBU0UJCQkweGM4MDAxMDAwCQkvLwkweGM4ODM2MDAwCiAgICAgICAgICAjZGVmaW5lICBDSEFOTkVMX0FfUkVHX0JBU0UgIDAKCSAgI2RlZmluZSAgQ0hBTk5FTF9CX1JFR19CQVNFICAweDIwMDAKCSAgI2RlZmluZSBQX0REUjBfQ0xLX0NUUkwgICAweGM4MDAwODAwCiAgICAgICAgICNkZWZpbmUgUF9ERFIxX0NMS19DVFJMICAweGM4MDAyODAwCgkgICAjZGVmaW5lIE9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKSAgICAgICh3cml0ZWwoKDB4MTJiKSwgMHhjODAwMDgwMCkpCgkgICAjZGVmaW5lIE9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKSAgICAgICh3cml0ZWwoKDB4MTJiKSwgMHhjODAwMjgwMCkpCgkJI2RlZmluZSBDTE9TRV9DSEFOTkVMX0FfUEhZX0NMSygpICAgICAgKHdyaXRlbCgoMHgxMmEpLCAweGM4MDAwODAwKSkKCSAgICNkZWZpbmUgQ0xPU0VfQ0hBTk5FTF9CX1BIWV9DTEsoKSAgICAgICh3cml0ZWwoKDB4MTJhKSwgMHhjODAwMjgwMCkpCgkJI2RlZmluZSBQX0lTQV9USU1FUkUgICAgICAgICAgICAgICAgIDB4YzExMDk5ODgKCSAgICNkZWZpbmUgZ2V0X3VzX3RpbWUoKSAgIChyZWFkbChQX0lTQV9USU1FUkUpKQoJI2RlZmluZSBBTV9ERFJfUExMX0NOVEwgIDB4YzgwMDA0MDAKCSNkZWZpbmUgRERSMF9QVUJfWlFDUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5MDw8MikpCgkjZGVmaW5lIEREUjBfUFVCX1pRMFBSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDkxPDwyKSkKCSNkZWZpbmUgRERSMF9QVUJfWlEwRFIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OTI8PDIpKQoJCSAgICNkZWZpbmUgRERSMV9QVUJfWlFDUgkJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHg5MDw8MikpCgkjZGVmaW5lIEREUjFfUFVCX1pRMFBSCQkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweDkxPDwyKSkKCSNkZWZpbmUgRERSMV9QVUJfWlEwRFIJCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4OTI8PDIpKQogICAgI2RlZmluZSBBQ0JETFJfTUFYICAgMFgxRgogICAgI2RlZmluZSBBQ0xDRExSX01BWCAgIDBYRkYKICAgICNkZWZpbmUgRFFCRExSX01BWCAgIDBYMUYKICAgICNkZWZpbmUgRFFMQ0RMUl9NQVggICAwWEZGCiAgICAjZGVmaW5lIERYTkdUUl9NQVggICAwWDcKCgkjZGVmaW5lIERNQ19SRUdfQkFTRSAgICAgIDB4YzgwMDYwMDAKI2RlZmluZSBETUNfTU9OX0NUUkwyCQkJCQkJKERNQ19SRUdfQkFTRSArICgweDI2IDw8MiApKQogICAvL2JpdCAzMS4gICBxb3NfbW9uX2VuLiAgICB3cml0ZSAxIHRvIHRyaWdnZXIgdGhlIGVuYWJsZS4gcG9sbGluZyB0aGlzIGJpdCAwLCBtZWFucyBmaW5pc2hlZC4gIG9yIHVzZSBpbnRlcnJ1cHQgdG8gY2hlY2sgZmluaXNoLgogICAvL2JpdCAzMC4gICBxb3NfbW9uIGludGVycnVwdCBjbGVhci4gIGNsZWFyIHRoZSBxb3MgbW9uaXRvciByZXN1bHQuICByZWFkIDEgPSBxb3MgbW9uIGZpbmlzaCBpbnRlcnJ1cHQuCiAgIC8vYml0IDIwLiAgIHFvc19tb25fdHJpZ19zZWwuICAxID0gdnN5bmMuICAwID0gdGltZXIuCiAgIC8vYml0IDE5OjE2LiAgcW9zIG1vbml0b3IgY2hhbm5lbCBzZWxlY3QuICAgc2VsZWN0IG9uZSBhdCBvbmUgdGltZSBvbmx5LgogICAvL2JpdCAxNTowLiAgIHBvcnQgc2VsZWN0IGZvciB0aGUgc2VsZWN0ZWQgY2hhbm5lbC4KI2RlZmluZSBETUNfTU9OX0NUUkwzCQkJCQkJKERNQ19SRUdfQkFTRSArICgweDI3IDw8MiApKQogIC8vIHFvc19tb25fY2xrX3RpbWVyLiAgIEhvdyBsb25nIHRvIG1lYXN1cmUgdGhlIGJhbmR3aWR0aC4KCgojZGVmaW5lIERNQ19NT05fQUxMX1JFUV9DTlQJCQkJCShETUNfUkVHX0JBU0UgKyAoMHgyOCA8PDIgKSkKICAvLyBhdCB0aGUgdGVzdCBwZXJpb2QsICB0aGUgd2hvbGUgTU1DIHJlcXVlc3QgdGltZS4KI2RlZmluZSBETUNfTU9OX0FMTF9HUkFOVF9DTlQJCQkJKERNQ19SRUdfQkFTRSArICgweDI5IDw8MiApKQogIC8vIGF0IHRoZSB0ZXN0IHBlcmlvZCwgIHRoZSB3aG9sZSBNTUMgZ3JhbnRlZCBkYXRhIGN5Y2xlcy4gNjRiaXRzIHVuaXQuCiNkZWZpbmUgRE1DX01PTl9PTkVfR1JBTlRfQ05UCQkJCShETUNfUkVHX0JBU0UgKyAoMHgyYSA8PDIgKSkKICAvLyBhdCB0aGUgdGVzdCBwZXJpb2QsICB0aGUgZ3JhbnRlZCBkYXRhIGN5Y2xlcyBmb3IgdGhlIHNlbGVjdGVkIGNoYW5uZWwgYW5kIHBvcnRzLgogICAjZW5kaWYKCgoKICNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV85MDVYKQoKICAjZGVmaW5lIEREUjBfUFVCX1BJUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHgwMTw8MikpCiNkZWZpbmUgRERSMF9QVUJfUEdDUjAgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDA0IDw8IDIgICkpLy8gUi9XIC0gUEhZIEdlbmVyYWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAwCiNkZWZpbmUgRERSMF9QVUJfUEdDUjEgICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDA1IDw8IDIgKSkgLy8gUi9XIC0gUEhZIEdlbmVyYWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxCiNkZWZpbmUgRERSMF9QVUJfUEdDUjIgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDA2IDw8IDIgKSkgLy8gUi9XIC0gUEhZIEdlbmVyYWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyCiNkZWZpbmUgRERSMF9QVUJfUEdDUjMgICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDA3IDw8IDIgKSkgLy8gUi9XIC0gUEhZIEdlbmVyYWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAzCiNkZWZpbmUgRERSMF9QVUJfUEdDUjQgICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDA4IDw8IDIgKSkgLy8gUi9XIC0gUEhZIEdlbmVyYWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciA0CiNkZWZpbmUgRERSMF9QVUJfUEdDUjUgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDA5IDw8IDIgKSkgLy8gUi9XIC0gUEhZIEdlbmVyYWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciA1CiNkZWZpbmUgRERSMF9QVUJfUEdDUjYgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDBBIDw8IDIgKSkgLy8gUi9XIC0gUEhZIEdlbmVyYWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciA2CiNkZWZpbmUgRERSMF9QVUJfUEdDUjcgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDBCIDw8IDIgKSkgLy8gUi9XIC0gUEhZIEdlbmVyYWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciA3CiNkZWZpbmUgRERSMF9QVUJfUEdDUjggICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDBDIDw8IDIgKSkgLy8gUi9XIC0gUEhZIEdlbmVyYWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciA4CgojZGVmaW5lIEREUjFfUFVCX1BJUgkJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHgwMTw8MikpCiNkZWZpbmUgRERSMV9QVUJfUEdDUjAgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDA0IDw8IDIgKSkgLy8gUi9XIC0gUEhZIEdlbmVyYWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAwCiNkZWZpbmUgRERSMV9QVUJfUEdDUjEgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDA1IDw8IDIgKSkgLy8gUi9XIC0gUEhZIEdlbmVyYWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxCiNkZWZpbmUgRERSMV9QVUJfUEdDUjIgICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDA2IDw8IDIgKSkgLy8gUi9XIC0gUEhZIEdlbmVyYWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyCiNkZWZpbmUgRERSMV9QVUJfUEdDUjMgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDA3IDw8IDIgKSkgLy8gUi9XIC0gUEhZIEdlbmVyYWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAzCiNkZWZpbmUgRERSMV9QVUJfUEdDUjQgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDA4IDw8IDIgKSApLy8gUi9XIC0gUEhZIEdlbmVyYWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciA0CiNkZWZpbmUgRERSMV9QVUJfUEdDUjUgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDA5IDw8IDIgKSkgLy8gUi9XIC0gUEhZIEdlbmVyYWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciA1CiNkZWZpbmUgRERSMV9QVUJfUEdDUjYgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDBBIDw8IDIgKSkgLy8gUi9XIC0gUEhZIEdlbmVyYWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciA2CiNkZWZpbmUgRERSMV9QVUJfUEdDUjcgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDBCIDw8IDIgKSkgLy8gUi9XIC0gUEhZIEdlbmVyYWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciA3CiNkZWZpbmUgRERSMV9QVUJfUEdDUjggICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDBDIDw8IDIgKSApLy8gUi9XIC0gUEhZIEdlbmVyYWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciA4CgojZGVmaW5lIEREUjBfUFVCX0RYMEJETFIwICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWQwICA8PCAyICkpCiNkZWZpbmUgRERSMF9QVUJfRFgwQkRMUjEgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZDEgIDw8IDIgKSkKI2RlZmluZSBERFIwX1BVQl9EWDBCRExSMiAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFkMiAgPDwgMiApKQojZGVmaW5lIEREUjBfUFVCX0RYMEJETFIzICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWQ0ICA8PCAyICkpCiNkZWZpbmUgRERSMF9QVUJfRFgwQkRMUjQgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZDUgIDw8IDIgKSkKI2RlZmluZSBERFIwX1BVQl9EWDBCRExSNSAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFkNiAgPDwgMiApKQojZGVmaW5lIEREUjBfUFVCX0RYMEJETFI2ICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWQ4ICA8PCAyICkpCiNkZWZpbmUgRERSMF9QVUJfRFgwTENETFIwICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZTAgIDw8IDIgKSkKI2RlZmluZSBERFIwX1BVQl9EWDBMQ0RMUjEgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFlMSAgPDwgMiApKQojZGVmaW5lIEREUjBfUFVCX0RYMExDRExSMiAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWUyICA8PCAyICkpCiNkZWZpbmUgRERSMF9QVUJfRFgwTENETFIzICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZTMgIDw8IDIgKSkKI2RlZmluZSBERFIwX1BVQl9EWDBMQ0RMUjQgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFlNCAgPDwgMiApKQojZGVmaW5lIEREUjBfUFVCX0RYMExDRExSNSAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWU1ICA8PCAyICkpCiNkZWZpbmUgRERSMF9QVUJfRFgwTURMUjAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZTggIDw8IDIgKSkKI2RlZmluZSBERFIwX1BVQl9EWDBNRExSMSAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFlOSAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMEdUUjAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWYwICA8PCAyICkpCiNkZWZpbmUgRERSMF9QVUJfRFgwR1RSMSAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZjEgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDBHVFIyICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFmMiAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMEdUUjMgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWYzICA8PCAyKSkKCiNkZWZpbmUgRERSMF9QVUJfRFgxQkRMUjAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMTAgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDFCRExSMSAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIxMSAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMUJETFIyICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjEyICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgxQkRMUjMgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMTQgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDFCRExSNCAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIxNSAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMUJETFI1ICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjE2ICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgxQkRMUjYgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMTggIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDFMQ0RMUjAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIyMCAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMUxDRExSMSAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjIxICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgxTENETFIyICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMjIgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDFMQ0RMUjMgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIyMyAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMUxDRExSNCAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjI0ICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgxTENETFI1ICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMjUgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDFNRExSMCAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIyOCAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMU1ETFIxICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjI5ICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgxR1RSMCAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMzAgIDw8IDIgKSkKI2RlZmluZSBERFIwX1BVQl9EWDFHVFIxICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIzMSAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMUdUUjIgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjMyICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgxR1RSMyAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMzMgIDw8IDIpICkKCiNkZWZpbmUgRERSMF9QVUJfRFgyQkRMUjAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNTAgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDJCRExSMSAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI1MSAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMkJETFIyICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjUyICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgyQkRMUjMgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNTQgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDJCRExSNCAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI1NSAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMkJETFI1ICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjU2ICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgyQkRMUjYgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNTggIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDJMQ0RMUjAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI2MCAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMkxDRExSMSAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjYxICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgyTENETFIyICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNjIgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDJMQ0RMUjMgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI2MyAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMkxDRExSNCAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjY0ICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgyTENETFI1ICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNjUgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDJNRExSMCAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI2OCAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMk1ETFIxICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjY5ICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgyR1RSMCAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNzAgIDw8IDIgKSkKI2RlZmluZSBERFIwX1BVQl9EWDJHVFIxICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI3MSAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMkdUUjIgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjcyICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgyR1RSMyAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNzMgIDw8IDIpICkKCiNkZWZpbmUgRERSMF9QVUJfRFgzQkRMUjAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyOTAgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDNCRExSMSAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI5MSAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYM0JETFIyICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjkyICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgzQkRMUjMgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyOTQgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDNCRExSNCAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI5NSAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYM0JETFI1ICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4Mjk2ICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgzQkRMUjYgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyOTggIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDNMQ0RMUjAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDJhMCAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYM0xDRExSMSAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MmExICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgzTENETFIyICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyYTIgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDNMQ0RMUjMgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDJhMyAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYM0xDRExSNCAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MmE0ICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgzTENETFI1ICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyYTUgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDNNRExSMCAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDJhOCAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYM01ETFIxICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MmE5ICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgzR1RSMCAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyYjAgIDw8IDIgKSkKI2RlZmluZSBERFIwX1BVQl9EWDNHVFIxICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDJiMSAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYM0dUUjIgICAgKCAgRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MmIyICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgzR1RSMyAgICAoICBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyYjMgIDw8IDIpICkKCiNkZWZpbmUgRERSMV9QVUJfRFgwQkRMUjAgKAlERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZDAgIDw8IDIpICkKI2RlZmluZSBERFIxX1BVQl9EWDBCRExSMSAoCUREUjBfUFVCX1JFR19CQVNFICsgKCAweDFkMSAgPDwgMikgKQojZGVmaW5lIEREUjFfUFVCX0RYMEJETFIyCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZDIgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDBCRExSMwkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWQ0ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgwQkRMUjQJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFkNSAgPDwgMikgKQojZGVmaW5lIEREUjFfUFVCX0RYMEJETFI1CShERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZDYgIDw8IDIpICkKI2RlZmluZSBERFIxX1BVQl9EWDBCRExSNgkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWQ4ICA8PCAyKSApCiNkZWZpbmUgRERSMV9QVUJfRFgwTENETFIwICAoCUREUjBfUFVCX1JFR19CQVNFICsgKCAweDFlMCAgPDwgMikgKQojZGVmaW5lIEREUjFfUFVCX0RYMExDRExSMQkgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZTEgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDBMQ0RMUjIgICgJRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWUyICA8PCAyKSApCiNkZWZpbmUgRERSMV9QVUJfRFgwTENETFIzCSAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFlMyAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMExDRExSNCAgKAlERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZTQgIDw8IDIpICkKI2RlZmluZSBERFIxX1BVQl9EWDBMQ0RMUjUJICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWU1ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgwTURMUjAJICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWU4ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgwTURMUjEJIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZTkgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDBHVFIwCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZjAgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDBHVFIxCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZjEgIDw8IDIpICkKI2RlZmluZSBERFIxX1BVQl9EWDBHVFIyCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZjIgIDw8IDIpICkKI2RlZmluZSBERFIxX1BVQl9EWDBHVFIzCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZjMgIDw8IDIpKQoKI2RlZmluZSBERFIxX1BVQl9EWDFCRExSMAkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjEwICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgxQkRMUjEJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIxMSAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMUJETFIyCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMTIgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDFCRExSMwkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjE0ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgxQkRMUjQJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIxNSAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMUJETFI1CShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMTYgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDFCRExSNgkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjE4ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgxTENETFIwCSAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjIwICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgxTENETFIxCSAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjIxICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgxTENETFIyICgJRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjIyICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgxTENETFIzCSAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjIzICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgxTENETFI0ICgJRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjI0ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgxTENETFI1CSAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjI1ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgxTURMUjAJIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMjggIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDFNRExSMQkgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIyOSAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMUdUUjAJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIzMCAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMUdUUjEJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIzMSAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMUdUUjIJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIzMiAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMUdUUjMJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIzMyAgPDwgMiApKQoKI2RlZmluZSBERFIxX1BVQl9EWDJCRExSMAkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjUwICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgyQkRMUjEJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI1MSAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMkJETFIyCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNTIgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDJCRExSMwkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjU0ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgyQkRMUjQJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI1NSAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMkJETFI1CShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNTYgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDJCRExSNgkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjU4ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgyTENETFIwCSAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjYwICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgyTENETFIxCSAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjYxICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgyTENETFIyICgJRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjYyICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgyTENETFIzCSAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjYzICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgyTENETFI0CSAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjY0ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgyTENETFI1CSAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjY1ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgyTURMUjAJIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNjggIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDJNRExSMQkgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI2OSAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMkdUUjAJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI3MCAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMkdUUjEJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI3MSAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMkdUUjIJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI3MiAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMkdUUjMJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI3MyAgPDwgMiApKQoKI2RlZmluZSBERFIxX1BVQl9EWDNCRExSMAkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjkwICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgzQkRMUjEJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI5MSAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYM0JETFIyCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyOTIgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDNCRExSMwkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4Mjk0ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgzQkRMUjQJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI5NSAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYM0JETFI1CShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyOTYgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDNCRExSNgkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4Mjk4ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgzTENETFIwCSAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MmEwICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgzTENETFIxCSAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MmExICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgzTENETFIyICgJRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MmEyICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgzTENETFIzCSAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MmEzICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgzTENETFI0CSAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MmE0ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgzTENETFI1ICgJRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MmE1ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgzTURMUjAJIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyYTggIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDNNRExSMQkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MmE5ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgzR1RSMAkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MmIwICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgzR1RSMQkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MmIxICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgzR1RSMgkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MmIyICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgzR1RSMwkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MmIzICA8PCAyICkpCgoKI2RlZmluZSBERFIwX1BVQl9BQ0xDRExSICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxNjAgPDwgMiApKSAvLyBSL1cgLSBMQyBEZWxheSBMaW5lIFByZXNlbnQgUmVnaXN0ZXIKI2RlZmluZSBERFIwX1BVQl9BQ01ETFIwICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgxNjggPDwgMiApKSAvLyBSL1cgLSBBQyBNYXN0ZXIgRGVsYXkgTGluZSBSZWdpc3RlciAwCiNkZWZpbmUgRERSMF9QVUJfQUNNRExSMSAgICAgKCAgRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MTY5IDw8IDIgKSkgLy8gUi9XIC0gTWFzdGVyIERlbGF5IExpbmUgUmVnaXN0ZXIgMQojZGVmaW5lIEREUjBfUFVCX0FDQkRMUjAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDE1MCA8PCAyICkpIC8vIFIvVyAtIEFDIEJpdCBEZWxheSBMaW5lIFJlZ2lzdGVyIDAKI2RlZmluZSBERFIwX1BVQl9BQ0JETFIzICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MTUzIDw8IDIgKSApIC8vIFIvVyAtIEFDIEJpdCBEZWxheSBMaW5lIFJlZ2lzdGVyIDMKCiNkZWZpbmUgRERSMV9QVUJfQUNMQ0RMUiAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MTYwIDw8IDIgKSApLy8gUi9XIC0gTEMgRGVsYXkgTGluZSBQcmVzZW50IFJlZ2lzdGVyCiNkZWZpbmUgRERSMV9QVUJfQUNNRExSMCAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MTY4IDw8IDIgKSkgLy8gUi9XIC0gQUMgTWFzdGVyIERlbGF5IExpbmUgUmVnaXN0ZXIgMAojZGVmaW5lIEREUjFfUFVCX0FDTURMUjEgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDE2OSA8PCAyICkpIC8vIFIvVyAtIE1hc3RlciBEZWxheSBMaW5lIFJlZ2lzdGVyIDEKI2RlZmluZSBERFIxX1BVQl9BQ0JETFIwICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgxNTAgPDwgMiApICkvLyBSL1cgLSBBQyBCaXQgRGVsYXkgTGluZSBSZWdpc3RlciAwCgoKICNkZWZpbmUgRERSMF9QVUJfQUNNRExSCQkJCQlERFIwX1BVQl9BQ01ETFIwCiAjZGVmaW5lIEREUjFfUFVCX0FDTURMUgkJCQkJRERSMV9QVUJfQUNNRExSMAogI2RlZmluZSBERFIwX1BVQl9EWDBHVFIJICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREUjBfUFVCX0RYMEdUUjAKICNkZWZpbmUgRERSMF9QVUJfRFgxR1RSCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFIwX1BVQl9EWDFHVFIwCiAjZGVmaW5lIEREUjBfUFVCX0RYMkdUUgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERSMF9QVUJfRFgyR1RSMAogI2RlZmluZSBERFIwX1BVQl9EWDNHVFIJICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREUjBfUFVCX0RYM0dUUjAKICNkZWZpbmUgRERSMV9QVUJfRFgwR1RSCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFIwX1BVQl9EWDBHVFIwCiAjZGVmaW5lIEREUjFfUFVCX0RYMUdUUgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERSMF9QVUJfRFgxR1RSMAogI2RlZmluZSBERFIxX1BVQl9EWDJHVFIJICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREUjBfUFVCX0RYMkdUUjAKICNkZWZpbmUgRERSMV9QVUJfRFgzR1RSCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFIwX1BVQl9EWDNHVFIwCgoKI2RlZmluZSBERFIwX1BVQl9JT1ZDUjAgICAgICAgKCAgRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MTQ4IDw8IDIgKSkgLy8gUi9XIC0gSU8gVlJFRiBDb250cm9sIFJlZ2lzdGVyIDAKI2RlZmluZSBERFIwX1BVQl9JT1ZDUjEgICAgICAoICAgRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MTQ5IDw8IDIgKSkgLy8gUi9XIC0gSU8gVlJFRiBDb250cm9sIFJlZ2lzdGVyIDEKI2RlZmluZSBERFIwX1BVQl9WVENSMCAgICAgICAgKCAgRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MTRBIDw8IDIgKSApLy8gUi9XIC0gVlJFRiBUcmFpbmluZyBDb250cm9sIFJlZ2lzdGVyIDAKI2RlZmluZSBERFIwX1BVQl9WVENSMSAgICAgICAgKCAgRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MTRCIDw8IDIgKSkgLy8gUi9XIC0gVlJFRiBUcmFpbmluZyBDb250cm9sIFJlZ2lzdGVyIDEKI2RlZmluZSBERFIxX1BVQl9JT1ZDUjAgICAgICggICAgRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MTQ4IDw8IDIgKSkgLy8gUi9XIC0gSU8gVlJFRiBDb250cm9sIFJlZ2lzdGVyIDAKI2RlZmluZSBERFIxX1BVQl9JT1ZDUjEgICAgICAoICAgRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MTQ5IDw8IDIgKSkgLy8gUi9XIC0gSU8gVlJFRiBDb250cm9sIFJlZ2lzdGVyIDEKI2RlZmluZSBERFIxX1BVQl9WVENSMCAgICAgICAgKCAgRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MTRBIDw8IDIgKSkgLy8gUi9XIC0gVlJFRiBUcmFpbmluZyBDb250cm9sIFJlZ2lzdGVyIDAKI2RlZmluZSBERFIxX1BVQl9WVENSMSAgICAgICAgKCAgRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MTRCIDw8IDIgKSkgLy8gUi9XIC0gVlJFRiBUcmFpbmluZyBDb250cm9sIFJlZ2lzdGVyIDEKCiNkZWZpbmUgRERSMF9QVUJfTVI2ICAgICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDA2NiA8PCAyICkgKSAvLyBSL1cgLSBFeHRlbmRlZCBNb2RlIFJlZ2lzdGVyIDYKI2RlZmluZSBERFIxX1BVQl9NUjYgICAgICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDY2IDw8IDIgKSApIC8vIFIvVyAtIEV4dGVuZGVkIE1vZGUgUmVnaXN0ZXIgNgojZGVmaW5lIEREUjBfUFVCX0RYMEdDUjYgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFjNiAgPDwgMiApICkKI2RlZmluZSBERFIwX1BVQl9EWDFHQ1I2ICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMDYgIDw8IDIgKSApCiNkZWZpbmUgRERSMF9QVUJfRFgyR0NSNiAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjQ2ICA8PCAyICkgKQojZGVmaW5lIEREUjBfUFVCX0RYM0dDUjYgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI4NiAgPDwgMiApICkKICNlbHNlCgogI2RlZmluZSBERFIwX1BVQl9QSVIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4MDE8PDIpKQojZGVmaW5lIEREUjBfUFVCX1BHQ1IwCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDAyPDwyKSkKI2RlZmluZSBERFIwX1BVQl9QR0NSMQkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHgwMzw8MikpCgojZGVmaW5lIEREUjFfUFVCX1BJUgkJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHgwMTw8MikpCiNkZWZpbmUgRERSMV9QVUJfUEdDUjAJCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4MDI8PDIpKQojZGVmaW5lIEREUjFfUFVCX1BHQ1IxCQkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweDAzPDwyKSkKCgkgI2RlZmluZSAgRERSMF9QVUJfRFgwQkRMUjAgICAoRERSMF9QVUJfUkVHX0JBU0UrKDB4QTc8PDIpKQoJICNkZWZpbmUgIEREUjBfUFVCX0RYMUJETFIwICAgIChERFIwX1BVQl9SRUdfQkFTRSsoMHhDNzw8MikpCgkgI2RlZmluZSAgRERSMF9QVUJfRFgyQkRMUjAgICAoRERSMF9QVUJfUkVHX0JBU0UrKDB4RTc8PDIpKQoJICNkZWZpbmUgIEREUjBfUFVCX0RYM0JETFIwICAgIChERFIwX1BVQl9SRUdfQkFTRSsoMHgxMDc8PDIpKQoKI2RlZmluZSBERFIwX1BVQl9EWDBCRExSMQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweEE4PDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDBCRExSMgkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweEE5PDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDBCRExSMwkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweEFBPDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDBCRExSNAkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweEFCPDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDBCRExSNQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweEFDPDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDBCRExSNgkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweEFEPDwyKSkKCiNkZWZpbmUgRERSMF9QVUJfRFgwTENETFIwCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4QUU8PDIpKQojZGVmaW5lIEREUjBfUFVCX0RYMExDRExSMQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweEFGPDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDBMQ0RMUjIJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHhCMDw8MikpCiNkZWZpbmUgRERSMF9QVUJfRFgwTURMUgkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweEIxPDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDBHVFIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4QjI8PDIpKQojZGVmaW5lIEREUjBfUFVCX0RYMUxDRExSMAkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweENFPDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDFMQ0RMUjEJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHhDRjw8MikpCiNkZWZpbmUgRERSMF9QVUJfRFgxTENETFIyCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4RDA8PDIpKQojZGVmaW5lIEREUjBfUFVCX0RYMU1ETFIJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHhEMTw8MikpCiNkZWZpbmUgRERSMF9QVUJfRFgxR1RSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweEQyPDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDJMQ0RMUjAJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHhFRTw8MikpCiNkZWZpbmUgRERSMF9QVUJfRFgyTENETFIxCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4RUY8PDIpKQojZGVmaW5lIEREUjBfUFVCX0RYMkxDRExSMgkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweEYwPDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDJNRExSCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4RjE8PDIpKQojZGVmaW5lIEREUjBfUFVCX0RYM0xDRExSMAkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDEwRTw8MikpCiNkZWZpbmUgRERSMF9QVUJfRFgzTENETFIxCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4MTBGPDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDNMQ0RMUjIJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHgxMTA8PDIpKQojZGVmaW5lIEREUjBfUFVCX0RYM01ETFIJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHgxMTE8PDIpKQojZGVmaW5lIEREUjBfUFVCX0RYM0dUUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHgxMTI8PDIpKQoKI2RlZmluZSBERFIxX1BVQl9EWDBMQ0RMUjAJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHhBRTw8MikpCiNkZWZpbmUgRERSMV9QVUJfRFgwTENETFIxCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4QUY8PDIpKQojZGVmaW5lIEREUjFfUFVCX0RYMExDRExSMgkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweEIwPDwyKSkKI2RlZmluZSBERFIxX1BVQl9EWDBNRExSCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4QjE8PDIpKQojZGVmaW5lIEREUjFfUFVCX0RYMEdUUgkJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHhCMjw8MikpCiNkZWZpbmUgRERSMV9QVUJfRFgxTENETFIwCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4Q0U8PDIpKQojZGVmaW5lIEREUjFfUFVCX0RYMUxDRExSMQkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweENGPDwyKSkKI2RlZmluZSBERFIxX1BVQl9EWDFMQ0RMUjIJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHhEMDw8MikpCiNkZWZpbmUgRERSMV9QVUJfRFgxTURMUgkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweEQxPDwyKSkKI2RlZmluZSBERFIxX1BVQl9EWDFHVFIJCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4RDI8PDIpKQojZGVmaW5lIEREUjFfUFVCX0RYMkxDRExSMAkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweEVFPDwyKSkKI2RlZmluZSBERFIxX1BVQl9EWDJMQ0RMUjEJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHhFRjw8MikpCiNkZWZpbmUgRERSMV9QVUJfRFgyTENETFIyCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4RjA8PDIpKQojZGVmaW5lIEREUjFfUFVCX0RYMk1ETFIJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHhGMTw8MikpCiNkZWZpbmUgRERSMV9QVUJfRFgzTENETFIwCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4MTBFPDwyKSkKI2RlZmluZSBERFIxX1BVQl9EWDNMQ0RMUjEJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHgxMEY8PDIpKQojZGVmaW5lIEREUjFfUFVCX0RYM0xDRExSMgkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweDExMDw8MikpCiNkZWZpbmUgRERSMV9QVUJfRFgzTURMUgkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweDExMTw8MikpCiNkZWZpbmUgRERSMV9QVUJfRFgzR1RSCQkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweDExMjw8MikpCgoKCSAjZGVmaW5lIEREUjBfUFVCX0FDTURMUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHgwRTw8MikpCiNkZWZpbmUgRERSMF9QVUJfQUNMQ0RMUgkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDBGPDwyKSkKI2RlZmluZSBERFIwX1BVQl9BQ0JETFIwCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4MTA8PDIpKQojZGVmaW5lIEREUjBfUFVCX0FDQkRMUjMJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHgxMzw8MikpCgkgI2RlZmluZSBERFIxX1BVQl9BQ01ETFIJCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4MEU8PDIpKQojZGVmaW5lIEREUjFfUFVCX0FDTENETFIJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHgwRjw8MikpCiNkZWZpbmUgRERSMV9QVUJfQUNCRExSMAkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweDEwPDwyKSkKCiAjZGVmaW5lIEREUjBfUFVCX0FDTURMUjAJRERSMF9QVUJfQUNNRExSCiAjZGVmaW5lIEREUjFfUFVCX0FDTURMUjAJRERSMV9QVUJfQUNNRExSCiAjZGVmaW5lIEREUjBfUFVCX0RYME1ETFIwIEREUjBfUFVCX0RYME1ETFIKICNkZWZpbmUgRERSMF9QVUJfRFgxTURMUjAgRERSMF9QVUJfRFgxTURMUgogI2RlZmluZSBERFIwX1BVQl9EWDJNRExSMCBERFIwX1BVQl9EWDJNRExSCiAjZGVmaW5lIEREUjBfUFVCX0RYM01ETFIwIEREUjBfUFVCX0RYM01ETFIKI2RlZmluZSBERFIxX1BVQl9EWDBNRExSMCBERFIwX1BVQl9EWDBNRExSCiNkZWZpbmUgRERSMV9QVUJfRFgxTURMUjAgRERSMF9QVUJfRFgxTURMUgojZGVmaW5lIEREUjFfUFVCX0RYMk1ETFIwIEREUjBfUFVCX0RYMk1ETFIKI2RlZmluZSBERFIxX1BVQl9EWDNNRExSMCBERFIwX1BVQl9EWDNNRExSCgojaWZuZGVmICBQX0REUjBfQ0xLX0NUUkwKI2RlZmluZSBQX0REUjBfQ0xLX0NUUkwgICAweGM4MDAwODAwCiNlbmRpZgojaWZuZGVmICBQX0REUjFfQ0xLX0NUUkwKI2RlZmluZSBQX0REUjFfQ0xLX0NUUkwgIDB4YzgwMDI4MDAKI2VuZGlmCgojZGVmaW5lIEREUjBfUFVCX0lPVkNSMAkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg4RTw8MikpCiNkZWZpbmUgRERSMF9QVUJfSU9WQ1IxCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDhGPDwyKSkKI2VuZGlmCgojaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfR1hfQkFCWSkKLy91bnNpZ25lZCBpbnQgZGVzWzhdOwovKgoJdW5zaWduZWQgaW50IHBhdHRlcm5fMVs0XVs4XT0KCXsKCTB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKCgl9OwoJdW5zaWduZWQgaW50IHBhdHRlcm5fMls0XVs4XT17CjB4MDAwMWZlMDAJLAoweDAwMDBmZjAwCSwKMHgwMDAwZmYwMAksCjB4MDAwMGZmMDAJLAoweDAwMDJmZDAwCSwKMHgwMDAwZmYwMAksCjB4MDAwMGZmMDAJLAoweDAwMDBmZjAwCSwKMHgwMDA0ZmIwMAksCjB4MDAwMGZmMDAJLAoweDAwMDBmZjAwCSwKMHgwMDAwZmYwMAksCjB4MDAwOGY3MDAJLAoweDAwMDBmZjAwCSwKMHgwMDAwZmYwMAksCjB4MDAwMGZmMDAJLAoweDAwMTBlZjAwCSwKMHgwMDAwZmYwMAksCjB4MDAwMGZmMDAJLAoweDAwMDBmZjAwCSwKMHgwMDIwZGYwMAksCjB4MDAwMGZmMDAJLAoweDAwMDBmZjAwCSwKMHgwMDAwZmYwMAksCjB4MDA0MGJmMDAJLAoweDAwMDBmZjAwCSwKMHgwMDAwZmYwMAksCjB4MDAwMGZmMDAJLAoweDAwODA3ZjAwCSwKMHgwMDAwZmYwMAksCjB4MDAwMGZmMDAJLAoweDAwMDBmZjAwCSwKCgl9OwoJdW5zaWduZWQgaW50IHBhdHRlcm5fM1s0XVs4XT17CgkJMHgwMDAxMDAwMAksCjB4MDAwMDAwMDAJLAoweDAwMDAwMDAwCSwKMHgwMDAwMDAwMAksCjB4MDAwMjAwMDAJLAoweDAwMDAwMDAwCSwKMHgwMDAwMDAwMAksCjB4MDAwMDAwMDAJLAoweDAwMDQwMDAwCSwKMHgwMDAwMDAwMAksCjB4MDAwMDAwMDAJLAoweDAwMDAwMDAwCSwKMHgwMDA4MDAwMAksCjB4MDAwMDAwMDAJLAoweDAwMDAwMDAwCSwKMHgwMDAwMDAwMAksCjB4MDAxMDAwMDAJLAoweDAwMDAwMDAwCSwKMHgwMDAwMDAwMAksCjB4MDAwMDAwMDAJLAoweDAwMjAwMDAwCSwKMHgwMDAwMDAwMAksCjB4MDAwMDAwMDAJLAoweDAwMDAwMDAwCSwKMHgwMDQwMDAwMAksCjB4MDAwMDAwMDAJLAoweDAwMDAwMDAwCSwKMHgwMDAwMDAwMAksCjB4MDA4MDAwMDAJLAoweDAwMDAwMDAwCSwKMHgwMDAwMDAwMAksCjB4MDAwMDAwMDAJLAp9OwoJdW5zaWduZWQgaW50IHBhdHRlcm5fNFs0XVs4XT17CgkJMHg1MWM4YzA0OQksCjB4MmQ0MzU5MmMJLAoweDA3NzdiNTBiCSwKMHg5Y2QyZWJlNQksCjB4YzA0MTk5ZDUJLAoweGRjOTY4ZGMwCSwKMHhiOGJhOGEzMwksCjB4MzVlNDMyN2YJLAoweDUxYzhjMDQ5CSwKMHgyZDQzNTkyYwksCjB4MDc3N2I1MGIJLAoweDljZDJlYmU1CSwKMHhjMDQxOTlkNQksCjB4ZGM5NjhkYzAJLAoweGI4YmE4YTMzCSwKMHgzNWU0MzI3ZgksCjB4NTFjOGMwNDkJLAoweDJkNDM1OTJjCSwKMHgwNzc3YjUwYgksCjB4OWNkMmViZTUJLAoweGMwNDE5OWQ1CSwKMHhkYzk2OGRjMAksCjB4YjhiYThhMzMJLAoweDM1ZTQzMjdmCSwKMHg1MWM4YzA0OQksCjB4MmQ0MzU5MmMJLAoweDA3NzdiNTBiCSwKMHg5Y2QyZWJlNQksCjB4YzA0MTk5ZDUJLAoweGRjOTY4ZGMwCSwKMHhiOGJhOGEzMwksCjB4MzVlNDMyN2YJLAp9OwoJdW5zaWduZWQgaW50IHBhdHRlcm5fNVs0XVs4XT17CgkJMHhhZWM5YzE0OQksCjB4ZDI0MzU5MmMJLAoweGY4NzdiNTBiCSwKMHg2M2QyZWJlNQksCjB4M2Y0MzliZDUJLAoweDIzOTY4ZGMwCSwKMHg0N2JhOGEzMwksCjB4Y2FlNDMyN2YJLAoweGFlY2NjNDQ5CSwKMHhkMjQzNTkyYwksCjB4Zjg3N2I1MGIJLAoweDYzZDJlYmU1CSwKMHgzZjQ5OTFkNQksCjB4MjM5NjhkYzAJLAoweDQ3YmE4YTMzCSwKMHhjYWU0MzI3ZgksCjB4YWVkOGQwNDkJLAoweGQyNDM1OTJjCSwKMHhmODc3YjUwYgksCjB4NjNkMmViZTUJLAoweDNmNjFiOWQ1CSwKMHgyMzk2OGRjMAksCjB4NDdiYThhMzMJLAoweGNhZTQzMjdmCSwKMHhhZTg4ODA0OQksCjB4ZDI0MzU5MmMJLAoweGY4NzdiNTBiCSwKMHg2M2QyZWJlNQksCjB4M2ZjMTE5ZDUJLAoweDIzOTY4ZGMwCSwKMHg0N2JhOGEzMwksCjB4Y2FlNDMyN2YJLAp9OwoJdW5zaWduZWQgaW50IHBhdHRlcm5fNls0XVs4XT17CjB4YWVjOWMxNDkJLAoweGQyNDNhNjJjCSwKMHhmODc3NGEwYgksCjB4NjNkMjE0ZTUJLAoweDNmNDM2NmQ1CSwKMHgyMzk2NzJjMAksCjB4NDdiYTc1MzMJLAoweGNhZTRjZDdmCSwKMHhhZWNjM2Y0OQksCjB4ZDI0M2E2MmMJLAoweGY4Nzc0YTBiCSwKMHg2M2QyMTRlNQksCjB4M2Y0OTY2ZDUJLAoweDIzOTY3MmMwCSwKMHg0N2JhNzUzMwksCjB4Y2FlNGNkN2YJLAoweGFlZDgzZjQ5CSwKMHhkMjQzYTYyYwksCjB4Zjg3NzRhMGIJLAoweDYzZDIxNGU1CSwKMHgzZjYxNjZkNQksCjB4MjM5NjcyYzAJLAoweDQ3YmE3NTMzCSwKMHhjYWU0Y2Q3ZgksCjB4YWU4ODNmNDkJLAoweGQyNDNhNjJjCSwKMHhmODc3NGEwYgksCjB4NjNkMjE0ZTUJLAoweDNmYzE2NmQ1CSwKMHgyMzk2NzJjMAksCjB4NDdiYTc1MzMJLAoweGNhZTRjZDdmCSwKCgl9OwogIHVuc2lnbmVkIGludCAgZGVzWzhdID17CgkweGFlYzgzZjQ5LAoJICAgMHhkMjQzYTYyYywKCSAgIDB4Zjg3NzRhMGIsCgkgICAweDYzZDIxNGU1LAoJICAgMHgzZjQxNjZkNSwKCSAgIDB4MjM5NjcyYzAsCgkgICAweDQ3YmE3NTMzLAoJICAgMHhjYWU0Y2Q3ZiwKCX07CiAgKi8KICAvKgoJdW5zaWduZWQgaW50ICBkZXNbOF0gOwogIGRlc1swXSA9IAkweGFlYzgzZjQ5OwogICBkZXNbMV0gPSAgICAgIDB4ZDI0M2E2MmM7CiAgIGRlc1syXSA9ICAgICAgMHhmODc3NGEwYjsKICBkZXNbM10gPSAgICAgICAweDYzZDIxNGU1OwogICBkZXNbNF0gPSAgICAgIDB4M2Y0MTY2ZDU7CglkZXNbNV0gPSAgICAgMHgyMzk2NzJjMDsKICAgZGVzWzZdID0gICAgICAweDQ3YmE3NTMzOwogICBkZXNbN10gPSAgICAgIDB4Y2FlNGNkN2Y7CglwYXR0ZXJuXzFbMF1bMF0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzBdWzFdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVswXVsyXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbMF1bM10gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzBdWzRdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVswXVs1XSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbMF1bNl0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzBdWzddID0gMHhmZjAwZmYwMDsKCglwYXR0ZXJuXzFbMV1bMF0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzFdWzFdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVsxXVsyXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbMV1bM10gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzFdWzRdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVsxXVs1XSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbMV1bNl0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzFdWzddID0gMHhmZjAwZmYwMDsKCglwYXR0ZXJuXzFbMl1bMF0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzJdWzFdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVsyXVsyXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbMl1bM10gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzJdWzRdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVsyXVs1XSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbMl1bNl0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzJdWzddID0gMHhmZjAwZmYwMDsKCglwYXR0ZXJuXzFbM11bMF0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzNdWzFdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVszXVsyXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbM11bM10gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzNdWzRdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVszXVs1XSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbM11bNl0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzNdWzddID0gMHhmZjAwZmYwMDsKCglwYXR0ZXJuXzJbMF1bMF0gPSAweDAwMDFmZTAwOwoJcGF0dGVybl8yWzBdWzFdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlswXVsyXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMF1bM10gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzBdWzRdID0gMHgwMDAyZmQwMDsKCXBhdHRlcm5fMlswXVs1XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMF1bNl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzBdWzddID0gMHgwMDAwZmYwMDsKCglwYXR0ZXJuXzJbMV1bMF0gPSAweDAwMDRmYjAwOwoJcGF0dGVybl8yWzFdWzFdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsxXVsyXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMV1bM10gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzFdWzRdID0gMHgwMDA4ZjcwMDsKCXBhdHRlcm5fMlsxXVs1XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMV1bNl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzFdWzddID0gMHgwMDAwZmYwMDsKCglwYXR0ZXJuXzJbMl1bMF0gPSAweDAwMTBlZjAwOwoJcGF0dGVybl8yWzJdWzFdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsyXVsyXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMl1bM10gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzJdWzRdID0gMHgwMDIwZGYwMDsKCXBhdHRlcm5fMlsyXVs1XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMl1bNl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzJdWzddID0gMHgwMDAwZmYwMDsKCglwYXR0ZXJuXzJbM11bMF0gPSAweDAwNDBiZjAwOwoJcGF0dGVybl8yWzNdWzFdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlszXVsyXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbM11bM10gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzNdWzRdID0gMHgwMDgwN2YwMDsKCXBhdHRlcm5fMlszXVs1XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbM11bNl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzNdWzddID0gMHgwMDAwZmYwMDsKCglwYXR0ZXJuXzNbMF1bMF0gPSAweDAwMDEwMDAwOwoJcGF0dGVybl8zWzBdWzFdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1swXVsyXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMF1bM10gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzBdWzRdID0gMHgwMDAyMDAwMDsKCXBhdHRlcm5fM1swXVs1XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMF1bNl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzBdWzddID0gMHgwMDAwMDAwMDsKCglwYXR0ZXJuXzNbMV1bMF0gPSAweDAwMDQwMDAwOwoJcGF0dGVybl8zWzFdWzFdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1sxXVsyXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMV1bM10gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzFdWzRdID0gMHgwMDA4MDAwMDsKCXBhdHRlcm5fM1sxXVs1XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMV1bNl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzFdWzddID0gMHgwMDAwMDAwMDsKCglwYXR0ZXJuXzNbMl1bMF0gPSAweDAwMTAwMDAwOwoJcGF0dGVybl8zWzJdWzFdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1syXVsyXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMl1bM10gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzJdWzRdID0gMHgwMDIwMDAwMDsKCXBhdHRlcm5fM1syXVs1XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMl1bNl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzJdWzddID0gMHgwMDAwMDAwMDsKCglwYXR0ZXJuXzNbM11bMF0gPSAweDAwNDAwMDAwOwoJcGF0dGVybl8zWzNdWzFdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1szXVsyXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbM11bM10gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzNdWzRdID0gMHgwMDgwMDAwMDsKCXBhdHRlcm5fM1szXVs1XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbM11bNl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzNdWzddID0gMHgwMDAwMDAwMDsKCnBhdHRlcm5fNFswXVswXSA9CTB4NTFjOGMwNDkJOwpwYXR0ZXJuXzRbMF1bMV0gPQkweDJkNDM1OTJjCTsKcGF0dGVybl80WzBdWzJdID0JMHgwNzc3YjUwYgk7CnBhdHRlcm5fNFswXVszXSA9CTB4OWNkMmViZTUJOwpwYXR0ZXJuXzRbMF1bNF0gPQkweGMwNDE5OWQ1CTsKcGF0dGVybl80WzBdWzVdID0JMHhkYzk2OGRjMAk7CnBhdHRlcm5fNFswXVs2XSA9CTB4YjhiYThhMzMJOwpwYXR0ZXJuXzRbMF1bN10gPQkweDM1ZTQzMjdmCTsKCnBhdHRlcm5fNFsxXVswXSA9CTB4NTFjOGMwNDkJOwpwYXR0ZXJuXzRbMV1bMV0gPQkweDJkNDM1OTJjCTsKcGF0dGVybl80WzFdWzJdID0JMHgwNzc3YjUwYgk7CnBhdHRlcm5fNFsxXVszXSA9CTB4OWNkMmViZTUJOwpwYXR0ZXJuXzRbMV1bNF0gPQkweGMwNDE5OWQ1CTsKcGF0dGVybl80WzFdWzVdID0JMHhkYzk2OGRjMAk7CnBhdHRlcm5fNFsxXVs2XSA9CTB4YjhiYThhMzMJOwpwYXR0ZXJuXzRbMV1bN10gPQkweDM1ZTQzMjdmCTsKCnBhdHRlcm5fNFsyXVswXSA9CTB4NTFjOGMwNDkJOwpwYXR0ZXJuXzRbMl1bMV0gPQkweDJkNDM1OTJjCTsKcGF0dGVybl80WzJdWzJdID0JMHgwNzc3YjUwYgk7CnBhdHRlcm5fNFsyXVszXSA9CTB4OWNkMmViZTUJOwpwYXR0ZXJuXzRbMl1bNF0gPQkweGMwNDE5OWQ1CTsKcGF0dGVybl80WzJdWzVdID0JMHhkYzk2OGRjMAk7CnBhdHRlcm5fNFsyXVs2XSA9CTB4YjhiYThhMzMJOwpwYXR0ZXJuXzRbMl1bN10gPQkweDM1ZTQzMjdmCTsKCnBhdHRlcm5fNFszXVswXSA9CTB4NTFjOGMwNDkJOwpwYXR0ZXJuXzRbM11bMV0gPQkweDJkNDM1OTJjCTsKcGF0dGVybl80WzNdWzJdID0JMHgwNzc3YjUwYgk7CnBhdHRlcm5fNFszXVszXSA9CTB4OWNkMmViZTUJOwpwYXR0ZXJuXzRbM11bNF0gPQkweGMwNDE5OWQ1CTsKcGF0dGVybl80WzNdWzVdID0JMHhkYzk2OGRjMAk7CnBhdHRlcm5fNFszXVs2XSA9CTB4YjhiYThhMzMJOwpwYXR0ZXJuXzRbM11bN10gPQkweDM1ZTQzMjdmCTsKCnBhdHRlcm5fNVswXVswXSA9CTB4YWVjOWMxNDkJOwpwYXR0ZXJuXzVbMF1bMV0gPQkweGQyNDM1OTJjCTsKcGF0dGVybl81WzBdWzJdID0JMHhmODc3YjUwYgk7CnBhdHRlcm5fNVswXVszXSA9CTB4NjNkMmViZTUJOwpwYXR0ZXJuXzVbMF1bNF0gPQkweDNmNDM5YmQ1CTsKcGF0dGVybl81WzBdWzVdID0JMHgyMzk2OGRjMAk7CnBhdHRlcm5fNVswXVs2XSA9CTB4NDdiYThhMzMJOwpwYXR0ZXJuXzVbMF1bN10gPQkweGNhZTQzMjdmCTsKcGF0dGVybl81WzFdWzBdID0JMHhhZWNjYzQ0OQk7CnBhdHRlcm5fNVsxXVsxXSA9CTB4ZDI0MzU5MmMJOwpwYXR0ZXJuXzVbMV1bMl0gPQkweGY4NzdiNTBiCTsKcGF0dGVybl81WzFdWzNdID0JMHg2M2QyZWJlNQk7CnBhdHRlcm5fNVsxXVs0XSA9CTB4M2Y0OTkxZDUJOwpwYXR0ZXJuXzVbMV1bNV0gPQkweDIzOTY4ZGMwCTsKcGF0dGVybl81WzFdWzZdID0JMHg0N2JhOGEzMwk7CnBhdHRlcm5fNVsxXVs3XSA9CTB4Y2FlNDMyN2YJOwpwYXR0ZXJuXzVbMl1bMF0gPQkweGFlZDhkMDQ5CTsKcGF0dGVybl81WzJdWzFdID0JMHhkMjQzNTkyYwk7CnBhdHRlcm5fNVsyXVsyXSA9CTB4Zjg3N2I1MGIJOwpwYXR0ZXJuXzVbMl1bM10gPQkweDYzZDJlYmU1CTsKcGF0dGVybl81WzJdWzRdID0JMHgzZjYxYjlkNQk7CnBhdHRlcm5fNVsyXVs1XSA9CTB4MjM5NjhkYzAJOwpwYXR0ZXJuXzVbMl1bNl0gPQkweDQ3YmE4YTMzCTsKcGF0dGVybl81WzJdWzddID0JMHhjYWU0MzI3Zgk7CnBhdHRlcm5fNVszXVswXSA9CTB4YWU4ODgwNDkJOwpwYXR0ZXJuXzVbM11bMV0gPQkweGQyNDM1OTJjCTsKcGF0dGVybl81WzNdWzJdID0JMHhmODc3YjUwYgk7CnBhdHRlcm5fNVszXVszXSA9CTB4NjNkMmViZTUJOwpwYXR0ZXJuXzVbM11bNF0gPQkweDNmYzExOWQ1CTsKcGF0dGVybl81WzNdWzVdID0JMHgyMzk2OGRjMAk7CnBhdHRlcm5fNVszXVs2XSA9CTB4NDdiYThhMzMJOwpwYXR0ZXJuXzVbM11bN10gPQkweGNhZTQzMjdmCTsKCnBhdHRlcm5fNlswXVsxXSA9CTB4ZDI0M2E2MmMJOwpwYXR0ZXJuXzZbMF1bMl0gPQkweGY4Nzc0YTBiCTsKcGF0dGVybl82WzBdWzNdID0JMHg2M2QyMTRlNQk7CnBhdHRlcm5fNlswXVs0XSA9CTB4M2Y0MzY2ZDUJOwpwYXR0ZXJuXzZbMF1bNV0gPQkweDIzOTY3MmMwCTsKcGF0dGVybl82WzBdWzZdID0JMHg0N2JhNzUzMwk7CnBhdHRlcm5fNlswXVs3XSA9CTB4Y2FlNGNkN2YJOwpwYXR0ZXJuXzZbMV1bMF0gPQkweGFlY2MzZjQ5CTsKcGF0dGVybl82WzFdWzFdID0JMHhkMjQzYTYyYwk7CnBhdHRlcm5fNlsxXVsyXSA9CTB4Zjg3NzRhMGIJOwpwYXR0ZXJuXzZbMV1bM10gPQkweDYzZDIxNGU1CTsKcGF0dGVybl82WzFdWzRdID0JMHgzZjQ5NjZkNQk7CnBhdHRlcm5fNlsxXVs1XSA9CTB4MjM5NjcyYzAJOwpwYXR0ZXJuXzZbMV1bNl0gPQkweDQ3YmE3NTMzCTsKcGF0dGVybl82WzFdWzddID0JMHhjYWU0Y2Q3Zgk7CnBhdHRlcm5fNlsyXVswXSA9CTB4YWVkODNmNDkJOwpwYXR0ZXJuXzZbMl1bMV0gPQkweGQyNDNhNjJjCTsKcGF0dGVybl82WzJdWzJdID0JMHhmODc3NGEwYgk7CnBhdHRlcm5fNlsyXVszXSA9CTB4NjNkMjE0ZTUJOwpwYXR0ZXJuXzZbMl1bNF0gPQkweDNmNjE2NmQ1CTsKcGF0dGVybl82WzJdWzVdID0JMHgyMzk2NzJjMAk7CnBhdHRlcm5fNlsyXVs2XSA9CTB4NDdiYTc1MzMJOwpwYXR0ZXJuXzZbMl1bN10gPQkweGNhZTRjZDdmCTsKcGF0dGVybl82WzNdWzBdID0JMHhhZTg4M2Y0OQk7CnBhdHRlcm5fNlszXVsxXSA9CTB4ZDI0M2E2MmMJOwpwYXR0ZXJuXzZbM11bMl0gPQkweGY4Nzc0YTBiCTsKcGF0dGVybl82WzNdWzNdID0JMHg2M2QyMTRlNQk7CnBhdHRlcm5fNlszXVs0XSA9CTB4M2ZjMTY2ZDUJOwpwYXR0ZXJuXzZbM11bNV0gPQkweDIzOTY3MmMwCTsKcGF0dGVybl82WzNdWzZdID0JMHg0N2JhNzUzMwk7CnBhdHRlcm5fNlszXVs3XSA9CTB4Y2FlNGNkN2YJOwoqLwojZW5kaWYKCiNkZWZpbmUgRERSX1RFU1RfU1RBUlRfQUREUiAgMHgxMDgwMDAwLy8gIDB4MTAwMDAwMDAgLy9DT05GSUdfU1lTX01FTVRFU1RfU1RBUlQKI2RlZmluZSBERFJfVEVTVF9TSVpFIDB4MjAwMDAwMAovLyNkZWZpbmUgRERSX1RFU1RfU0laRSAweDIwMDAKCnN0YXRpYyB2b2lkIGRkcl93cml0ZSh2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKewoJIHVuc2lnbmVkIGludCAgKnA7CgkgdW5zaWduZWQgaW50ICBpLCBqLCBuOwoJIHVuc2lnbmVkIGludCAgbV9sZW4gPSBtX2xlbmd0aDsKCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCiAgICB3aGlsZSAobV9sZW4pCgl7CiAgICAgICAgZm9yIChqPTA7ajwzMjtqKyspCgkJewoKICAgICAgICAgICAgaWYgKG1fbGVuID49IDEyOCkKCQkJCW4gPSAzMjsKCQkJZWxzZQoJCQkJbiA9IG1fbGVuPj4yOwoKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKCQkJewoJCQkJI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCSAgIGRkcl9wbGRfY2FjaGUocCkgIDsKCQkjZW5kaWYKICAgICAgICAgICAgICAgIHN3aXRjaCAoaSkKCQkJCXsKCQkJCQljYXNlIDA6CgkJCQkJY2FzZSA5OgoJCQkJCWNhc2UgMTQ6CgkJCQkJY2FzZSAyNToKCQkJCQljYXNlIDMwOgoJCQkJCQkqKHAraSkgPSBUREFUQTMyRjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAxOgoJCQkJCWNhc2UgNjoKCQkJCQljYXNlIDg6CgkJCQkJY2FzZSAxNzoKCQkJCQljYXNlIDIyOgoJCQkJCQkqKHAraSkgPSAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDE2OgoJCQkJCWNhc2UgMjM6CgkJCQkJY2FzZSAzMToKCQkJCQkJKihwK2kpID0gVERBVEEzMkE7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgNzoKCQkJCQljYXNlIDE1OgoJCQkJCWNhc2UgMjQ6CgkJCQkJCSoocCtpKSA9IFREQVRBMzI1OwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDI6CgkJCQkJY2FzZSA0OgoJCQkJCWNhc2UgMTA6CgkJCQkJY2FzZSAxMjoKCQkJCQljYXNlIDE5OgoJCQkJCWNhc2UgMjE6CgkJCQkJY2FzZSAyNzoKCQkJCQljYXNlIDI5OgoJCQkJCQkqKHAraSkgPSAxPDxqOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDM6CgkJCQkJY2FzZSA1OgoJCQkJCWNhc2UgMTE6CgkJCQkJY2FzZSAxMzoKCQkJCQljYXNlIDE4OgoJCQkJCWNhc2UgMjA6CgkJCQkJY2FzZSAyNjoKCQkJCQljYXNlIDI4OgoJCQkJCQkqKHAraSkgPSB+KDE8PGopOwoJCQkJCQlicmVhazsKCQkJCX0KCQkJfQoKICAgICAgICAgICAgaWYgKG1fbGVuID4gMTI4KQoJCQl7CgkJCQltX2xlbiAtPSAxMjg7CgkJCQlwICs9IDMyOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcCArPSAobV9sZW4+PjIpOwoJCQkJbV9sZW4gPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn0KCgoKCgpzdGF0aWMgdm9pZCBkZHJfcmVhZCh2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKewoJIHVuc2lnbmVkIGludCAgKnA7CgkgdW5zaWduZWQgaW50ICBpLCBqLCBuOwoJIHVuc2lnbmVkIGludCAgbV9sZW4gPSBtX2xlbmd0aDsKCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCiAgICB3aGlsZSAobV9sZW4pCgl7CiAgICAgICAgZm9yIChqPTA7ajwzMjtqKyspCgkJewoKICAgICAgICAgICAgaWYgKG1fbGVuID49IDEyOCkKCQkJCW4gPSAzMjsKCQkJZWxzZQoJCQkJbiA9IG1fbGVuPj4yOwoKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKCQkJewoJCQkJI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCSAgIGRkcl9wbGRfY2FjaGUocCkgIDsKCQkjZW5kaWYKICAgICAgICAgICAgICAgaWYgKChlcnJvcl9vdXRvZl9jb3VudF9mbGFnKSAmJiAoZXJyb3JfY291bnQpKQoJCQkJewoJCQkJcHJpbnRmKCJFcnJvciBkYXRhIG91dCBvZiBjb3VudCIpOwoJCQkJIG1fbGVuPTA7CgkJCQkgYnJlYWs7CgkJCQl9CiAgICAgICAgICAgICAgICBzd2l0Y2ggKGkpCgkJCQl7CgoJCQkJCWNhc2UgMDoKCQkJCQljYXNlIDk6CgkJCQkJY2FzZSAxNDoKCQkJCQljYXNlIDI1OgoJCQkJCWNhc2UgMzA6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqKHAraSkgIT0gVERBVEEzMkYpCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIFREQVRBMzJGKTsKCQkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAxOgoJCQkJCWNhc2UgNjoKCQkJCQljYXNlIDg6CgkJCQkJY2FzZSAxNzoKCQkJCQljYXNlIDIyOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKihwK2kpICE9IDApIHtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMCk7CgkJCQkJCX1icmVhazsKCQkJCQljYXNlIDE2OgoJCQkJCWNhc2UgMjM6CgkJCQkJY2FzZSAzMToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCoocCtpKSAhPSBUREFUQTMyQSkge2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCBUREFUQTMyQSk7CgkJCQkJICAgfSBicmVhazsKCQkJCQljYXNlIDc6CgkJCQkJY2FzZSAxNToKCQkJCQljYXNlIDI0OgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKihwK2kpICE9IFREQVRBMzI1KSB7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIFREQVRBMzI1KTsKCQkJCQkgICB9IGJyZWFrOwoJCQkJCWNhc2UgMjoKCQkJCQljYXNlIDQ6CgkJCQkJY2FzZSAxMDoKCQkJCQljYXNlIDEyOgoJCQkJCWNhc2UgMTk6CgkJCQkJY2FzZSAyMToKCQkJCQljYXNlIDI3OgoJCQkJCWNhc2UgMjk6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqKHAraSkgIT0gMTw8aikge2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAxPDxqKTsKCQkJCQkgICB9IGJyZWFrOwoJCQkJCWNhc2UgMzoKCQkJCQljYXNlIDU6CgkJCQkJY2FzZSAxMToKCQkJCQljYXNlIDEzOgoJCQkJCWNhc2UgMTg6CgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIDI2OgoJCQkJCWNhc2UgMjg6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqKHAraSkgIT0gfigxPDxqKSkge2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+KDE8PGopKTsKCQkJCQkgICB9IGJyZWFrOwoJCQkJfQoJCQl9CgogICAgICAgICAgICBpZiAobV9sZW4gPiAxMjgpCgkJCXsKCQkJCW1fbGVuIC09IDEyODsKCQkJCXAgKz0gMzI7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwICs9IChtX2xlbj4+Mik7CgkJCQltX2xlbiA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQoKCgoKc3RhdGljIHZvaWQgZGRyX3dyaXRlNCh2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKewoJIHVuc2lnbmVkIGludCAgKnA7CgkgdW5zaWduZWQgaW50ICBpLCBqLCBuOwoJIHVuc2lnbmVkIGludCAgbV9sZW4gPSBtX2xlbmd0aDsKCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCiAgICB3aGlsZSAobV9sZW4pCgl7CiAgICAgICAgZm9yIChqPTA7ajwzMjtqKyspCgkJewoKICAgICAgICAgICAgaWYgKG1fbGVuID49IDEyOCkKCQkJCW4gPSAzMjsKCQkJZWxzZQoJCQkJbiA9IG1fbGVuPj4yOwoKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKCQkJewoJCQkJI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCSAgIGRkcl9wbGRfY2FjaGUocCkgIDsKCQkjZW5kaWYKICAgICAgICAgICAgICAgIHN3aXRjaCAoaSkKCQkJCXsKCQkJCQljYXNlIDA6CgkJCQkJY2FzZSAxOgoJCQkJCWNhc2UgMjoKCQkJCQljYXNlIDM6CgoJCQkJCQkqKHAraSkgPSAweGZmMDBmZjAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDQ6CgkJCQkJY2FzZSA1OgoJCQkJCWNhc2UgNjoKCQkJCQljYXNlIDc6CgoJCQkJCQkqKHAraSkgPSB+MHhmZjAwZmYwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA4OgoJCQkJCWNhc2UgOToKCQkJCQljYXNlIDEwOgoJCSAgICAgIGNhc2UgMTE6CgkJCQkJCSoocCtpKSA9IDB4YWE1NWFhNTU7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMTI6CgkJCQkJY2FzZSAxMzoKCQkJCQljYXNlIDE0OgoJCSAgICAgIGNhc2UgMTU6CgkJCQkJCSoocCtpKSA9IH4weGFhNTVhYTU1OwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDE2OgoJCQkJCWNhc2UgMTc6CgkJCQkJY2FzZSAxODoKCQkJCQljYXNlIDE5OgoKCQkJIGNhc2UgMjQ6CgkJCQkJY2FzZSAyNToKCQkJCQljYXNlIDI2OgoJCQkJCWNhc2UgMjc6CgoJCQkJICAgKihwK2kpID0gMTw8ajsKCQkJCQkJYnJlYWs7CgoJCQkJCSBjYXNlIDIwOgoJCQkJCWNhc2UgMjE6CgkJCQkJY2FzZSAyMjoKCQkJCQljYXNlIDIzOgoJCQkJCWNhc2UgMjg6CgkJCQkJY2FzZSAyOToKCQkJCQljYXNlIDMwOgoJCQkJCWNhc2UgMzE6CgkJCQkJCSoocCtpKSA9IH4oMTw8aik7CgkJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgogICAgICAgICAgICBpZiAobV9sZW4gPiAxMjgpCgkJCXsKCQkJCW1fbGVuIC09IDEyODsKCQkJCXAgKz0gMzI7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwICs9IChtX2xlbj4+Mik7CgkJCQltX2xlbiA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQoKCgoKCgoKc3RhdGljIHZvaWQgZGRyX3JlYWQ0KHZvaWQgKmJ1ZmYsICB1bnNpZ25lZCBpbnQgIG1fbGVuZ3RoKQp7CgkgdW5zaWduZWQgaW50ICAqcDsKCSB1bnNpZ25lZCBpbnQgIGksIGosIG47CgkgdW5zaWduZWQgaW50ICBtX2xlbiA9IG1fbGVuZ3RoOwoKCXAgPSAoIHVuc2lnbmVkIGludCAgKilidWZmOwoKICAgIHdoaWxlIChtX2xlbikKCXsKICAgICAgICBmb3IgKGo9MDtqPDMyO2orKykKCQl7CgogICAgICAgICAgICBpZiAobV9sZW4gPj0gMTI4KQoJCQkJbiA9IDMyOwoJCQllbHNlCgkJCQluID0gbV9sZW4+PjI7CgogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQoJCQl7CgkJCQkjaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJICAgZGRyX3BsZF9jYWNoZShwKSAgOwoJCSNlbmRpZgogICAgICAgICAgICAgICBpZiAoKGVycm9yX291dG9mX2NvdW50X2ZsYWcpICYmIChlcnJvcl9jb3VudCkpCgkJCQl7CgkJCQlwcmludGYoIkVycm9yIGRhdGEgb3V0IG9mIGNvdW50Iik7CgkJCQkgbV9sZW49MDsKCQkJCSBicmVhazsKCQkJCX0KICAgICAgICAgICAgICAgIHN3aXRjaCAoaSkKCQkJCXsKCgkJCQkJY2FzZSAwOgoJCQkJCWNhc2UgMToKCQkJCQljYXNlIDI6CgkJCQkJY2FzZSAzOgoKCQkJCQkgLy8gICAqKHAraSkgPSAweGZmMDBmZjAwOwogICAgICAgICAgICAgICAgICAgICAgIGlmICgqKHAraSkgIT0gMHhmZjAwZmYwMCkKCQkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgVERBVEEzMkYpOwoJCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIDQ6CgkJCQkJY2FzZSA1OgoJCQkJCWNhc2UgNjoKCQkJCQljYXNlIDc6CgoJCQkJICAvLyAgICAgICoocCtpKSA9IH4weGZmMDBmZjAwOwogICAgICAgICAgICAgICAgICAgIGlmICgqKHAraSkgIT0gfjB4ZmYwMGZmMDApCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIFREQVRBMzJGKTsKCQkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA4OgoJCQkJCWNhc2UgOToKCQkJCQljYXNlIDEwOgoJCSAgICAgIGNhc2UgMTE6CgkJCQkJLy8gICAgKihwK2kpID0gMHhhYTU1YWE1NTsKICAgICAgICAgICAgICAgICAgICAgIGlmICgqKHAraSkgIT0gMHhhYTU1YWE1NSkKCQkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgVERBVEEzMkYpOwoJCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIDEyOgoJCQkJCWNhc2UgMTM6CgkJCQkJY2FzZSAxNDoKCQkgICAgICBjYXNlIDE1OgoJCQkJCSAvLyAgICoocCtpKSA9IH4weGFhNTVhYTU1OwogICAgICAgICAgICAgICAgICAgICAgIGlmICgqKHAraSkgIT0gfjB4YWE1NWFhNTUpCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIFREQVRBMzJGKTsKCQkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAxNjoKCQkJCQljYXNlIDE3OgoJCQkJCWNhc2UgMTg6CgkJCQkJY2FzZSAxOToKCgkJCSBjYXNlIDI0OgoJCQkJCWNhc2UgMjU6CgkJCQkJY2FzZSAyNjoKCQkJCQljYXNlIDI3OgoKCQkJCS8vICAgKihwK2kpID0gMTw8ajsKCQkJCSAgaWYgKCoocCtpKSAhPSAoMTw8aikpCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIFREQVRBMzJGKTsKCQkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCSBjYXNlIDIwOgoJCQkJCWNhc2UgMjE6CgkJCQkJY2FzZSAyMjoKCQkJCQljYXNlIDIzOgoJCQkJCWNhc2UgMjg6CgkJCQkJY2FzZSAyOToKCQkJCQljYXNlIDMwOgoJCQkJCWNhc2UgMzE6CgkJCQkJICAvLyAgKihwK2kpID0gfigxPDxqKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCoocCtpKSAhPX4oIDE8PGopKQoJCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCBUREFUQTMyRik7CgkJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgogICAgICAgICAgICBpZiAobV9sZW4gPiAxMjgpCgkJCXsKCQkJCW1fbGVuIC09IDEyODsKCQkJCXAgKz0gMzI7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwICs9IChtX2xlbj4+Mik7CgkJCQltX2xlbiA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQoKLy8vKgpzdGF0aWMgdm9pZCBkZHJfdGVzdF9jb3B5KHZvaWQgKmFkZHJfZGVzdCx2b2lkICphZGRyX3NyYyx1bnNpZ25lZCBpbnQgbWVtY3B5X3NpemUpCnsKCSB1bnNpZ25lZCBpbnQgICpwX2Rlc3Q7CgkgdW5zaWduZWQgaW50ICAqcF9zcmM7CgoJIHVuc2lnbmVkIGludCAgbV9sZW4gPSBtZW1jcHlfc2l6ZTsKCglwX2Rlc3QgPSAoIHVuc2lnbmVkIGludCAgKilhZGRyX2Rlc3Q7CglwX3NyYyA9ICggdW5zaWduZWQgaW50ICAqKWFkZHJfc3JjOwptX2xlbiA9IG1fbGVuLzQ7IC8vYXNzdW1lIGl0J3MgbXVsdGlwbGUgb2YgNAp3aGlsZSAobV9sZW4tLSkgewoJCWRkcl9wbGRfY2FjaGUocF9zcmMpICA7Ly8jZGVmaW5lIGRkcl9wbGRfY2FjaGUoUCkgICBhc20gKCJwcmZtIFBMREwxS0VFUCwgWyUwLCAjMzc2XSI6OiJyIiAoUCkpCgkqcF9kZXN0KysgPSAqcF9zcmMrKzsKCSpwX2Rlc3QrKyA9ICpwX3NyYysrOwoJKnBfZGVzdCsrID0gKnBfc3JjKys7CgkqcF9kZXN0KysgPSAqcF9zcmMrKzsKfQp9Ci8vKi8KLyoKc3RhdGljIHZvaWQgZGRyX3Rlc3RfY29weSh2b2lkICphZGRyX2Rlc3Qsdm9pZCAqYWRkcl9zcmMsdW5zaWduZWQgaW50IG1lbWNweV9zaXplKQp7CiAgIC8vICB1bnNpZ25lZCBpbnQgICpwX2Rlc3Q7CgkvLyB1bnNpZ25lZCBpbnQgICpwX3NyYzsKCgkgdW5zaWduZWQgaW50ICBtX2xlbiA9IG1lbWNweV9zaXplOwoJIHVuc2lnbmVkIGludCAgdGVtcDMgPSAwOwoJIHVuc2lnbmVkIGludCAgdGVtcDQgPSAwOwoKCWFzbSAoIm1vdiAlMCwlMSI6OiJyIiAodGVtcDQpLCJyIiAoYWRkcl9kZXN0KSk7Cglhc20gKCJzdWJzICUwLCUwLCM4Ijo6InIiIChtX2xlbikpOwoJIGFzbSAoIjE6IGxkciAlMCxbJTFdLCM4Ijo6InIiICh0ZW1wMyksInIiIChhZGRyX3NyYykpOwoJICBhc20gKCJzdWJzICUwLCUwLCM4Ijo6InIiIChtX2xlbikpOwoJICAgYXNtICgic3RyICUwLFslMV0sIzgiOjoiciIgKHRlbXAzKSwiciIgKHRlbXA0KSk7CgkJYXNtICgicHJmbSBQTERMMUtFRVAsIFslMCwgIzM3Nl0iOjoiciIgKGFkZHJfc3JjKSk7CgkJYXNtICgiYi5wbCAxYiI6Oik7CgkJYXNtICgicmV0Ijo6KTsKCgoKCgp9CiovCmludCBkb19kZHJfdGVzdF9jb3B5KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJY2hhciAqZW5kcDsKCSB1bnNpZ25lZCBsb25nICAgbG9vcCA9IDE7Cgl1bnNpZ25lZCBpbnQgICBwcmludF9mbGFnID0xOwoJLy8gdW5zaWduZWQgaW50ICBzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUjsKCSB1bnNpZ25lZCBpbnQgIHNyY19hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUjsKCSB1bnNpZ25lZCBpbnQgIGRlY19hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUisweDgwMDAwMDA7CgkgICAgICB1bnNpZ25lZCBpbnQgIHRlc3Rfc2l6ZSA9IEREUl9URVNUX1NJWkU7CgoKcHJpbnRfZmxhZz0xOwoKCQkgICBwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CgkJCWludCBpIDsKCWZvciAoaSA9IDA7aTxhcmdjO2krKykKCQl7CgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7CgkJfQoKCgoJCS8vICAgIHByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CgkJICAgIGlmIChhcmdjID09MSkgewoJLy8gICAgc3RhcnRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sICZlbmRwLCAxNik7CgkvLyAgICBpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlzcmNfYWRkciA9IEREUl9URVNUX1NUQVJUX0FERFI7CgkgIGxvb3AgPSAxOwoKCX0KICAgIGlmIChhcmdjID4gMikgewoJLy8gICAgc3RhcnRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sICZlbmRwLCAxNik7CiAgICAgICAgaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJc3JjX2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSOwoKCX0KCSAgICBpZiAoYXJnYyA+IDMpIHsKCglzcmNfYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sICZlbmRwLCAxNik7CgkgICBkZWNfYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sICZlbmRwLCAxNik7CgkgICAgdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgJmVuZHAsIDE2KTsKCQkgICBsb29wID0gMTsKICAgICAgICBpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl0ZXN0X3NpemUgPSBERFJfVEVTVF9TSVpFOwoKCX0KCQlpZiAodGVzdF9zaXplPDB4MTAwMCkKCQkJdGVzdF9zaXplID0gRERSX1RFU1RfU0laRTsKCSAgIGlmIChhcmdjID4gNCkgewoJCWxvb3AgPSBzaW1wbGVfc3RydG91bChhcmd2WzRdLCAmZW5kcCwgMTYpOwoJCSAgICAgICBpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlsb29wID0gMTsKCQl9CgkJCSAgIGlmIChhcmdjID4gNSkgewoJCXByaW50X2ZsYWcgPSBzaW1wbGVfc3RydG91bChhcmd2WzVdLCAmZW5kcCwgMTYpOwoJCSAgICAgICBpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlwcmludF9mbGFnID0gMTsKCQl9Ci8vQ09QWV9URVNUX1NUQVJUOgoKLy8vKgoJICB1bnNpZ25lZCBsb25nIHRpbWVfc3RhcnQsIHRpbWVfZW5kLHRlc3RfbG9vcHM7CnRlc3RfbG9vcHM9bG9vcDsKdW5zaWduZWQgbG9uZyBzaXplX2NvdW50PTA7CnNpemVfY291bnQ9bG9vcCp0ZXN0X3NpemU7CnRpbWVfc3RhcnQgPSBnZXRfdXNfdGltZSgpOy8vdXMKCglkbyB7CgoJICAvLyAgICAgbG9vcCA9IDE7CgoKZGRyX3Rlc3RfY29weSgodm9pZCAqKShpbnRfY29udnRlcl9wKGRlY19hZGRyKSksKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzcmNfYWRkcikpLHRlc3Rfc2l6ZSk7Ci8vYmNvcHkoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzcmNfYWRkcikpLCh2b2lkICopKGludF9jb252dGVyX3AoZGVjX2FkZHIpKSx0ZXN0X3NpemUpOwovL21jb3B5KCh2b2lkICopKGludF9jb252dGVyX3Aoc3JjX2FkZHIpKSwodm9pZCAqKShpbnRfY29udnRlcl9wKGRlY19hZGRyKSksdGVzdF9zaXplKTsKaWYgKHByaW50X2ZsYWcpCnsKCQkgIHByaW50ZigiXG5sb29wPT0weCUwOHgiLCAoIHVuc2lnbmVkIGludCApbG9vcCk7CgkJICAgcHJpbnRmKCJcbiAgICAgIFxuIik7Cn0KCSAgfXdoaWxlKC0tbG9vcCk7Ci8vKi8KCXRpbWVfZW5kID0gZ2V0X3VzX3RpbWUoKTsvL3VzCglwcmludGYoIlxuY29weSAlZCB0aW1lcyB1c2UgJWR1c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIsKCB1bnNpZ25lZCBpbnQgKXRlc3RfbG9vcHMsKCB1bnNpZ25lZCBpbnQgKSh0aW1lX2VuZC10aW1lX3N0YXJ0KSk7CgoJcHJpbnRmKCJcbmRkciBjb3B5IGJhbmR3aWR0aD09JWQgTUJZVEUvUyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iLCh1bnNpZ25lZCBpbnQpKHNpemVfY291bnQvKHRpbWVfZW5kLXRpbWVfc3RhcnQpKSk7CiBwcmludGYoIlxyRW5kIGRkciB0ZXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7Cgp1bnNpZ25lZCBpbnQgbV9sZW49MCxjb3VudGVyPTA7CiAgIHVuc2lnbmVkIGludCAgKnBfZGVzdDsKIHBfZGVzdD0gICh2b2lkICopKGludF9jb252dGVyX3AoZGVjX2FkZHIpKTsKbV9sZW4gPSB0ZXN0X3NpemUvNDsgLy9hc3N1bWUgaXQncyBtdWx0aXBsZSBvZiA0CmNvdW50ZXI9KHVuc2lnbmVkIGludCl0ZXN0X2xvb3BzOwpzaXplX2NvdW50PWNvdW50ZXIqdGVzdF9zaXplOwp0aW1lX3N0YXJ0ID0gZ2V0X3VzX3RpbWUoKTsvL3VzCmRvIHsKCSBsb29wID0gMTsKCW1fbGVuID0gdGVzdF9zaXplLzQ7CndoaWxlIChtX2xlbi0tKSB7CgkJZGRyX3BsZF9jYWNoZShwX2Rlc3QpICA7CgkqcF9kZXN0KysgPSAweDEyMzQ1Njc4OwoJKnBfZGVzdCsrID0gMHgxMjM0NTY3ODsKCSpwX2Rlc3QrKyA9IDB4MTIzNDU2Nzg7CgkqcF9kZXN0KysgPSAweDEyMzQ1Njc4Owp9CiAgfXdoaWxlKC0tY291bnRlcik7CiAgIHRpbWVfZW5kID0gZ2V0X3VzX3RpbWUoKTsvL3VzCglwcmludGYoIlxud3JpdGUgJWQgYnl0ZXMgdXNlICVkdXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iLCggdW5zaWduZWQgaW50ICl0ZXN0X3NpemUsKCB1bnNpZ25lZCBpbnQgKSh0aW1lX2VuZC10aW1lX3N0YXJ0KSk7CgoJcHJpbnRmKCJcbmRkciB3cml0ZSBiYW5kd2lkdGg9PSVkIE1CWVRFL1MgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiwodW5zaWduZWQgaW50KShzaXplX2NvdW50Lyh0aW1lX2VuZC10aW1lX3N0YXJ0KSkpOwoKdW5zaWduZWQgaW50ICAqcF9zcmM7CiBwX3NyYz0gICh2b2lkICopKGludF9jb252dGVyX3Aoc3JjX2FkZHIpKTsKbV9sZW4gPSB0ZXN0X3NpemUvNDsgLy9hc3N1bWUgaXQncyBtdWx0aXBsZSBvZiA0CnVuc2lnbmVkIGludCB0ZW1wMD0wOwovL3Vuc2lnbmVkIGludCB0ZW1wMT0wOwovL3Vuc2lnbmVkIGludCB0ZW1wMj0wOwovL3Vuc2lnbmVkIGludCB0ZW1wMz0wOwpjb3VudGVyPSh1bnNpZ25lZCBpbnQpdGVzdF9sb29wczsKc2l6ZV9jb3VudD1jb3VudGVyKnRlc3Rfc2l6ZTsKCi8vICAjZGVmaW5lIE9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKSAgICAgICh3cml0ZWwoKDApLCAweGM4ODM2YzAwKSkKLy93cml0ZWwoKDEwMDAwMDA8PDApLCBETUNfTU9OX0NUUkwxKTsKLy93cml0ZWwoKDA8PDMxKXwoMTw8MzApfCgwPDwyMCl8KDE8PDE2KXwoMTw8MCksIERNQ19NT05fQ1RSTDIpOwovL3dyaXRlbCgoMTw8MzEpfCgwPDwzMCl8KDA8PDIwKXwoMTw8MTYpfCgxPDwwKSwgRE1DX01PTl9DVFJMMik7CnRpbWVfc3RhcnQgPSBnZXRfdXNfdGltZSgpOy8vdXMKZG8gewoJIGxvb3AgPSAxOwoJbV9sZW4gPSB0ZXN0X3NpemUvNDsKd2hpbGUgKG1fbGVuLS0pIHsKCSAgLy8gIGRkcl9wbGRfY2FjaGUocF9zcmMrKykgIDsKCSNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCSAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJwcmZtIFBMREwxS0VFUCwgWyUwLCAjMzc2XSI6OiJyIiAocF9zcmMpKTsKCSNlbmRpZgoJICAgIHBfc3JjKys7CgkJIHRlbXAwID0oICpwX3NyYyk7Cm1fbGVuLS07Cm1fbGVuLS07Cm1fbGVuLS07Cm1fbGVuLS07Cm1fbGVuLS07Cm1fbGVuLS07Cm1fbGVuLS07Cn0KICB9d2hpbGUoLS1jb3VudGVyKTsKCSpwX2Rlc3QrKyA9IHRlbXAwOwoJKnBfZGVzdCsrID0gKnBfc3JjOwoJKnBfZGVzdCsrID0gKnBfc3JjOwoJKnBfZGVzdCsrID0gKnBfc3JjOwogICB0aW1lX2VuZCA9IGdldF91c190aW1lKCk7Ly91cwoKCgoJcHJpbnRmKCJcbnJlYWQgJWQgS2J5dGVzIHVzZSAlZHVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiwodW5zaWduZWQgaW50KShzaXplX2NvdW50LzEwMDApLCggdW5zaWduZWQgaW50ICkodGltZV9lbmQtdGltZV9zdGFydCkpOwoJcHJpbnRmKCJcbmRkciByZWFkIGJhbmR3aWR0aD09JWQgTUJZVEUvUyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iLCh1bnNpZ25lZCBpbnQpKHNpemVfY291bnQvKHRpbWVfZW5kLXRpbWVfc3RhcnQpKSk7CgoJICByZXR1cm4gMDsKCi8vdXNhZ2U6Ci8vCWNtZF91c2FnZShjbWR0cCk7CglyZXR1cm4gMTsKfQoKVV9CT09UX0NNRCgKCWRkcl90ZXN0X2NvcHksCTcsCTEsCWRvX2Rkcl90ZXN0X2NvcHksCgkiZGRyX3Rlc3RfY29weSBmdW5jdGlvbiIsCgkiZGRyX3Rlc3RfY29weSAgMHgwODAwMDAwMCAweDEwMDAwMDAwIDB4MDIwMDAwMDAgMSAwID8gXG4iCik7CgovLy8qCiNkZWZpbmUgRERSX1BBVFRFUk5fTE9PUF8xIDMyCiNkZWZpbmUgRERSX1BBVFRFUk5fTE9PUF8yIDY0CiNkZWZpbmUgRERSX1BBVFRFUk5fTE9PUF8zIDk2Ci8qCl9fYXNtCnsKLkdsb2JhbCBtZW1jcHlfcGxkCi50eXBlIG1lbWNweV9wbGQgLCVmdW5jdGlvbgouYWxpZ24gOAptZW1jcHlfcGxkOgptb3YgeDQseDAKc3VicyB4Mix4MiwjOApiLm1pIDJmCjE6IGxkciB4MyxbeDFdLCM4CglzdWJzIHgyLHgyLCM4CglzdHIgeDMsW3g0XSwjOAoJcHJmbSBQTERMMUtFRVAsW3gxLCMzNzZdCgliLnBsICAxYgoKMjogYWRkcyB4Mix4MiwjNAoJYi5taSAzZgoJbGRyIHczLFt4MV0sIzQKCXN1YiB4Mix4MiwjNAoJc3RyIHczLFt4NF0sIzQKCjM6IGFkZHMgeDIseDIsIzIKCWIubWkgNGYKCWxkciB3MyxbeDFdLCMyCglzdWIgeDIseDIsIzQKCXN0ciB3MyxbeDRdLCM0Cgo0OiBhZGRzIHgyLHgyLCMxCgliLm1pIDVmCglsZHIgdzMsW3gxXSwjMgoJc3ViIHgyLHgyLCM0CglzdHIgdzMsW3g0XSwjNAoKNTogcmV0Cn0KKi8KLy9zdGF0aWMgdm9pZCBkZHJfbWVtY3B5X3BsZCh2b2lkICphZGRyX2Rlc3QsICB2b2lkICphZGRyX3NyYywgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKLy97Ci8qCmFzbQp7Ci8vLkdsb2JhbCBtZW1jcHlfcGxkCi50eXBlIG1lbWNweV9wbGQgLCVmdW5jdGlvbgouYWxpZ24gOAptZW1jcHlfcGxkOgptb3YgeDQseDAKc3VicyB4Mix4MiwjOApiLm1pIDJmCjE6IGxkciB4MyxbeDFdLCM4CglzdWJzIHgyLHgyLCM4CglzdHIgeDMsW3g0XSwjOAoJcHJmbSBQTERMMUtFRVAsW3gxLCMzNzZdCgliLnBsICAxYgoKMjogYWRkcyB4Mix4MiwjNAoJYi5taSAzZgoJbGRyIHczLFt4MV0sIzQKCXN1YiB4Mix4MiwjNAoJc3RyIHczLFt4NF0sIzQKCjM6IGFkZHMgeDIseDIsIzIKCWIubWkgNGYKCWxkciB3MyxbeDFdLCMyCglzdWIgeDIseDIsIzQKCXN0ciB3MyxbeDRdLCM0Cgo0OiBhZGRzIHgyLHgyLCMxCgliLm1pIDVmCglsZHIgdzMsW3gxXSwjMgoJc3ViIHgyLHgyLCM0CglzdHIgdzMsW3g0XSwjNAoKNTogcmV0Cn0KbWVtY3B5X3BsZChhZGRyX2Rlc3QsYWRkcl9zcmMsbV9sZW5ndGgpOwoqLwovL30KCgoKI2lmIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZX0dYX0JBQlkpCgovLy8qCgppbnQgZGRyX3Rlc3RfZ3hfY3Jvc3NfdGFsa19wYXR0ZXJuKGludCBkZHJfdGVzdF9zaXplKQp7CiB1bnNpZ25lZCBpbnQgIHN0YXJ0X2FkZHIgPSAweDEwMDAwMDAwOwoJZXJyb3Jfb3V0b2ZfY291bnRfZmxhZz0xOwoJCWVycm9yX2NvdW50PTA7CgoJIHVuc2lnbmVkIGludCAgZGVzWzhdIDsKIHVuc2lnbmVkIGludCAgcGF0dGVybl8xWzRdWzhdIDsKIHVuc2lnbmVkIGludCAgcGF0dGVybl8yWzRdWzhdIDsKIHVuc2lnbmVkIGludCAgcGF0dGVybl8zWzRdWzhdIDsKIHVuc2lnbmVkIGludCAgcGF0dGVybl80WzRdWzhdIDsKIHVuc2lnbmVkIGludCAgcGF0dGVybl81WzRdWzhdIDsKICB1bnNpZ25lZCBpbnQgIHBhdHRlcm5fNls0XVs4XSA7CgogIGRlc1swXSA9IAkweGFlYzgzZjQ5OwogICBkZXNbMV0gPSAgICAgIDB4ZDI0M2E2MmM7CiAgIGRlc1syXSA9ICAgICAgMHhmODc3NGEwYjsKICBkZXNbM10gPSAgICAgICAweDYzZDIxNGU1OwogICBkZXNbNF0gPSAgICAgIDB4M2Y0MTY2ZDU7CglkZXNbNV0gPSAgICAgMHgyMzk2NzJjMDsKICAgZGVzWzZdID0gICAgICAweDQ3YmE3NTMzOwogICBkZXNbN10gPSAgICAgIDB4Y2FlNGNkN2Y7CglwYXR0ZXJuXzFbMF1bMF0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzBdWzFdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVswXVsyXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbMF1bM10gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzBdWzRdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVswXVs1XSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbMF1bNl0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzBdWzddID0gMHhmZjAwZmYwMDsKCgkgcGF0dGVybl8xWzFdWzBdID0gMHgwMGZmZmYwMDsKCXBhdHRlcm5fMVsxXVsxXSA9IDB4MDBmZmZmMDA7CglwYXR0ZXJuXzFbMV1bMl0gPSAweDAwZmZmZjAwOwoJcGF0dGVybl8xWzFdWzNdID0gMHgwMGZmZmYwMDsKCXBhdHRlcm5fMVsxXVs0XSA9IDB4MDBmZmZmMDA7CglwYXR0ZXJuXzFbMV1bNV0gPSAweDAwZmZmZjAwOwoJcGF0dGVybl8xWzFdWzZdID0gMHgwMGZmZmYwMDsKCXBhdHRlcm5fMVsxXVs3XSA9IDB4MDBmZmZmMDA7CgoJcGF0dGVybl8xWzJdWzBdID0gMHhmZmZmMDAwMDsKCXBhdHRlcm5fMVsyXVsxXSA9IDB4ZmZmZjAwMDA7CglwYXR0ZXJuXzFbMl1bMl0gPSAweGZmZmYwMDAwOwoJcGF0dGVybl8xWzJdWzNdID0gMHhmZmZmMDAwMDsKCXBhdHRlcm5fMVsyXVs0XSA9IDB4ZmZmZjAwMDA7CglwYXR0ZXJuXzFbMl1bNV0gPSAweGZmZmYwMDAwOwoJcGF0dGVybl8xWzJdWzZdID0gMHhmZmZmMDAwMDsKCXBhdHRlcm5fMVsyXVs3XSA9IDB4ZmZmZjAwMDA7CglwYXR0ZXJuXzFbM11bMF0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzNdWzFdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVszXVsyXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbM11bM10gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzNdWzRdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVszXVs1XSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbM11bNl0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzNdWzddID0gMHhmZjAwZmYwMDsKCglwYXR0ZXJuXzJbMF1bMF0gPSAweDAwMDFmZTAwOwoJcGF0dGVybl8yWzBdWzFdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlswXVsyXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMF1bM10gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzBdWzRdID0gMHgwMDAyZmQwMDsKCXBhdHRlcm5fMlswXVs1XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMF1bNl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzBdWzddID0gMHgwMDAwZmYwMDsKCglwYXR0ZXJuXzJbMV1bMF0gPSAweDAwMDRmYjAwOwoJcGF0dGVybl8yWzFdWzFdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsxXVsyXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMV1bM10gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzFdWzRdID0gMHgwMDA4ZjcwMDsKCXBhdHRlcm5fMlsxXVs1XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMV1bNl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzFdWzddID0gMHgwMDAwZmYwMDsKCglwYXR0ZXJuXzJbMl1bMF0gPSAweDAwMTBlZjAwOwoJcGF0dGVybl8yWzJdWzFdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsyXVsyXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMl1bM10gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzJdWzRdID0gMHgwMDIwZGYwMDsKCXBhdHRlcm5fMlsyXVs1XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMl1bNl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzJdWzddID0gMHgwMDAwZmYwMDsKCglwYXR0ZXJuXzJbM11bMF0gPSAweDAwNDBiZjAwOwoJcGF0dGVybl8yWzNdWzFdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlszXVsyXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbM11bM10gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzNdWzRdID0gMHgwMDgwN2YwMDsKCXBhdHRlcm5fMlszXVs1XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbM11bNl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzNdWzddID0gMHgwMDAwZmYwMDsKCglwYXR0ZXJuXzNbMF1bMF0gPSAweDAwMDEwMDAwOwoJcGF0dGVybl8zWzBdWzFdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1swXVsyXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMF1bM10gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzBdWzRdID0gMHgwMDAyMDAwMDsKCXBhdHRlcm5fM1swXVs1XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMF1bNl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzBdWzddID0gMHgwMDAwMDAwMDsKCglwYXR0ZXJuXzNbMV1bMF0gPSAweDAwMDQwMDAwOwoJcGF0dGVybl8zWzFdWzFdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1sxXVsyXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMV1bM10gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzFdWzRdID0gMHgwMDA4MDAwMDsKCXBhdHRlcm5fM1sxXVs1XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMV1bNl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzFdWzddID0gMHgwMDAwMDAwMDsKCglwYXR0ZXJuXzNbMl1bMF0gPSAweDAwMTAwMDAwOwoJcGF0dGVybl8zWzJdWzFdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1syXVsyXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMl1bM10gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzJdWzRdID0gMHgwMDIwMDAwMDsKCXBhdHRlcm5fM1syXVs1XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMl1bNl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzJdWzddID0gMHgwMDAwMDAwMDsKCglwYXR0ZXJuXzNbM11bMF0gPSAweDAwNDAwMDAwOwoJcGF0dGVybl8zWzNdWzFdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1szXVsyXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbM11bM10gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzNdWzRdID0gMHgwMDgwMDAwMDsKCXBhdHRlcm5fM1szXVs1XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbM11bNl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzNdWzddID0gMHgwMDAwMDAwMDsKCi8vLyoKcGF0dGVybl80WzBdWzBdID0JMHg1MWM4YzA0OQk7CnBhdHRlcm5fNFswXVsxXSA9CTB4MmQ0MzU5MmMJOwpwYXR0ZXJuXzRbMF1bMl0gPQkweDA3NzdiNTBiCTsKcGF0dGVybl80WzBdWzNdID0JMHg5Y2QyZWJlNQk7CnBhdHRlcm5fNFswXVs0XSA9CTB4YzA0MTk5ZDUJOwpwYXR0ZXJuXzRbMF1bNV0gPQkweGRjOTY4ZGMwCTsKcGF0dGVybl80WzBdWzZdID0JMHhiOGJhOGEzMwk7CnBhdHRlcm5fNFswXVs3XSA9CTB4MzVlNDMyN2YJOwoKcGF0dGVybl80WzFdWzBdID0JMHhhZTM3YzA0OQk7CnBhdHRlcm5fNFsxXVsxXSA9CTB4ZDJiYzU5MmMJOwpwYXR0ZXJuXzRbMV1bMl0gPQkweGY4ODhiNTBiCTsKcGF0dGVybl80WzFdWzNdID0JMHg2MzJkZWJlNQk7CnBhdHRlcm5fNFsxXVs0XSA9CTB4M2ZiZTk5ZDUJOwpwYXR0ZXJuXzRbMV1bNV0gPQkweDIzNjk4ZGMwCTsKcGF0dGVybl80WzFdWzZdID0JMHg0NzQ1OGEzMwk7CnBhdHRlcm5fNFsxXVs3XSA9CTB4Y2ExYjMyN2YJOwoKcGF0dGVybl80WzJdWzBdID0JMHg1MTM3M2Y0OQk7CnBhdHRlcm5fNFsyXVsxXSA9CTB4MmRiY2E2MmMJOwpwYXR0ZXJuXzRbMl1bMl0gPQkweDA3ODg0YTBiCTsKcGF0dGVybl80WzJdWzNdID0JMHg5YzJkMTRlNQk7CnBhdHRlcm5fNFsyXVs0XSA9CTB4YzBiZTY2ZDUJOwpwYXR0ZXJuXzRbMl1bNV0gPQkweGRjNjk3MmMwCTsKcGF0dGVybl80WzJdWzZdID0JMHhiODQ1NzUzMwk7CnBhdHRlcm5fNFsyXVs3XSA9CTB4MzUxYmNkN2YJOwoKCnBhdHRlcm5fNFszXVswXSA9CTB4NTFjOGMwNDkJOwpwYXR0ZXJuXzRbM11bMV0gPQkweDJkNDM1OTJjCTsKcGF0dGVybl80WzNdWzJdID0JMHgwNzc3YjUwYgk7CnBhdHRlcm5fNFszXVszXSA9CTB4OWNkMmViZTUJOwpwYXR0ZXJuXzRbM11bNF0gPQkweGMwNDE5OWQ1CTsKcGF0dGVybl80WzNdWzVdID0JMHhkYzk2OGRjMAk7CnBhdHRlcm5fNFszXVs2XSA9CTB4YjhiYThhMzMJOwpwYXR0ZXJuXzRbM11bN10gPQkweDM1ZTQzMjdmCTsKCnBhdHRlcm5fNVswXVswXSA9CTB4YWVjOWMxNDkJOwpwYXR0ZXJuXzVbMF1bMV0gPQkweGQyNDM1OTJjCTsKcGF0dGVybl81WzBdWzJdID0JMHhmODc3YjUwYgk7CnBhdHRlcm5fNVswXVszXSA9CTB4NjNkMmViZTUJOwpwYXR0ZXJuXzVbMF1bNF0gPQkweDNmNDM5YmQ1CTsKcGF0dGVybl81WzBdWzVdID0JMHgyMzk2OGRjMAk7CnBhdHRlcm5fNVswXVs2XSA9CTB4NDdiYThhMzMJOwpwYXR0ZXJuXzVbMF1bN10gPQkweGNhZTQzMjdmCTsKcGF0dGVybl81WzFdWzBdID0JMHhhZWNjYzQ0OQk7CnBhdHRlcm5fNVsxXVsxXSA9CTB4ZDI0MzU5MmMJOwpwYXR0ZXJuXzVbMV1bMl0gPQkweGY4NzdiNTBiCTsKcGF0dGVybl81WzFdWzNdID0JMHg2M2QyZWJlNQk7CnBhdHRlcm5fNVsxXVs0XSA9CTB4M2Y0OTkxZDUJOwpwYXR0ZXJuXzVbMV1bNV0gPQkweDIzOTY4ZGMwCTsKcGF0dGVybl81WzFdWzZdID0JMHg0N2JhOGEzMwk7CnBhdHRlcm5fNVsxXVs3XSA9CTB4Y2FlNDMyN2YJOwpwYXR0ZXJuXzVbMl1bMF0gPQkweGFlZDhkMDQ5CTsKcGF0dGVybl81WzJdWzFdID0JMHhkMjQzNTkyYwk7CnBhdHRlcm5fNVsyXVsyXSA9CTB4Zjg3N2I1MGIJOwpwYXR0ZXJuXzVbMl1bM10gPQkweDYzZDJlYmU1CTsKcGF0dGVybl81WzJdWzRdID0JMHgzZjYxYjlkNQk7CnBhdHRlcm5fNVsyXVs1XSA9CTB4MjM5NjhkYzAJOwpwYXR0ZXJuXzVbMl1bNl0gPQkweDQ3YmE4YTMzCTsKcGF0dGVybl81WzJdWzddID0JMHhjYWU0MzI3Zgk7CnBhdHRlcm5fNVszXVswXSA9CTB4YWU4ODgwNDkJOwpwYXR0ZXJuXzVbM11bMV0gPQkweGQyNDM1OTJjCTsKcGF0dGVybl81WzNdWzJdID0JMHhmODc3YjUwYgk7CnBhdHRlcm5fNVszXVszXSA9CTB4NjNkMmViZTUJOwpwYXR0ZXJuXzVbM11bNF0gPQkweDNmYzExOWQ1CTsKcGF0dGVybl81WzNdWzVdID0JMHgyMzk2OGRjMAk7CnBhdHRlcm5fNVszXVs2XSA9CTB4NDdiYThhMzMJOwpwYXR0ZXJuXzVbM11bN10gPQkweGNhZTQzMjdmCTsKCnBhdHRlcm5fNlswXVswXSA9ICAgMHhhZWM5M2Y0OSAgIDsKcGF0dGVybl82WzBdWzFdID0JMHhkMjQzYTYyYwk7CnBhdHRlcm5fNlswXVsyXSA9CTB4Zjg3NzRhMGIJOwpwYXR0ZXJuXzZbMF1bM10gPQkweDYzZDIxNGU1CTsKcGF0dGVybl82WzBdWzRdID0JMHgzZjQzNjZkNQk7CnBhdHRlcm5fNlswXVs1XSA9CTB4MjM5NjcyYzAJOwpwYXR0ZXJuXzZbMF1bNl0gPQkweDQ3YmE3NTMzCTsKcGF0dGVybl82WzBdWzddID0JMHhjYWU0Y2Q3Zgk7CnBhdHRlcm5fNlsxXVswXSA9CTB4YWVjYzNmNDkJOwpwYXR0ZXJuXzZbMV1bMV0gPQkweGQyNDNhNjJjCTsKcGF0dGVybl82WzFdWzJdID0JMHhmODc3NGEwYgk7CnBhdHRlcm5fNlsxXVszXSA9CTB4NjNkMjE0ZTUJOwpwYXR0ZXJuXzZbMV1bNF0gPQkweDNmNDk2NmQ1CTsKcGF0dGVybl82WzFdWzVdID0JMHgyMzk2NzJjMAk7CnBhdHRlcm5fNlsxXVs2XSA9CTB4NDdiYTc1MzMJOwpwYXR0ZXJuXzZbMV1bN10gPQkweGNhZTRjZDdmCTsKcGF0dGVybl82WzJdWzBdID0JMHhhZWQ4M2Y0OQk7CnBhdHRlcm5fNlsyXVsxXSA9CTB4ZDI0M2E2MmMJOwpwYXR0ZXJuXzZbMl1bMl0gPQkweGY4Nzc0YTBiCTsKcGF0dGVybl82WzJdWzNdID0JMHg2M2QyMTRlNQk7CnBhdHRlcm5fNlsyXVs0XSA9CTB4M2Y2MTY2ZDUJOwpwYXR0ZXJuXzZbMl1bNV0gPQkweDIzOTY3MmMwCTsKcGF0dGVybl82WzJdWzZdID0JMHg0N2JhNzUzMwk7CnBhdHRlcm5fNlsyXVs3XSA9CTB4Y2FlNGNkN2YJOwpwYXR0ZXJuXzZbM11bMF0gPQkweGFlODgzZjQ5CTsKcGF0dGVybl82WzNdWzFdID0JMHhkMjQzYTYyYwk7CnBhdHRlcm5fNlszXVsyXSA9CTB4Zjg3NzRhMGIJOwpwYXR0ZXJuXzZbM11bM10gPQkweDYzZDIxNGU1CTsKcGF0dGVybl82WzNdWzRdID0JMHgzZmMxNjZkNQk7CnBhdHRlcm5fNlszXVs1XSA9CTB4MjM5NjcyYzAJOwpwYXR0ZXJuXzZbM11bNl0gPQkweDQ3YmE3NTMzCTsKcGF0dGVybl82WzNdWzddID0JMHhjYWU0Y2Q3Zgk7Ci8vKi8KLy8qLwoJc3RhcnRfYWRkcj0weDEwMDAwMDAwOwp1bnNpZ25lZCBpbnQJCQl0ZXN0X3NpemUgPSAweDIwOwp1bnNpZ25lZCBpbnQgdGVzdF9hZGRyOwp1bnNpZ25lZCBpbnQgdGVtcF9pPTA7CnVuc2lnbmVkIGludCB0ZW1wX2s9MDsKdW5zaWduZWQgaW50IHBhdHRlcm5fb1s4XTsKdW5zaWduZWQgaW50IHBhdHRlcm5fZFs4XTsKewoJICAvLyAgaWYobGZsYWcpCgkgIC8vICAgICAgbG9vcCA9IDg4ODsKCgkJLy9pZihvbGRfcGF0dGVybl9mbGFnPT0xKQoJCQl7CgoJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLlxuIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CgovKgoJIGZvciAoKHRlbXBfaz0wKTsodGVtcF9rPDQpOyh0ZW1wX2srKykpIHsKewoKCQkgIGZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCXsKCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkqKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk9ZGVzX3BhdHRlcm4odGVtcF9pLDIsdGVtcF9rLHRlbXBfaSk7Ly9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldOwoJLy8JI2RlZmluZSBkZXNfcGF0dGVybihhLGIsYyxkKSAgZGVzW2FdXnBhdHRlcm5fIyNiW2NdW2RdCi8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXQoJCX0KICAgLy8gICBfY2xlYW5fZGNhY2hlX2FkZHIoMHgxMDAwMDAwMCk7CgkgIGZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwoKCSAgZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCXBhdHRlcm5fb1t0ZW1wX2ldPSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKTsKCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0pOwogLy9wcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwogLy9wcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldKTsKCWlmIChwYXR0ZXJuX29bdGVtcF9pXSAhPSBwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldKQoJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoInA1RXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF0tRDB4JTA4eFxuIixwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCBwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldLHBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJfQoJICB9CgkJCX0KCQl9CiovCgkJLy9pZihwYXR0ZXJuX2ZsYWcxPT0xKQoJCQl7CgkJICBmb3IgKCh0ZW1wX2s9MCk7KHRlbXBfazw0KTsodGVtcF9rKyspKQoJCQl7CnsKZGRyX3VkZWxheSgxMDAwMCk7CgkJICBmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKQoJCQl7CgkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJKih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpPWRlc19wYXR0ZXJuKHRlbXBfaSwxLHRlbXBfayx0ZW1wX2kpOy8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXTsKCS8vCSNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIGRlc1thXV5wYXR0ZXJuXyMjYltjXVtkXQovL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0KCQl9CiAgIC8vICAgX2NsZWFuX2RjYWNoZV9hZGRyKDB4MTAwMDAwMDApOwogICAjaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkgIGZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwogICAjZW5kaWYKCSAgZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCXBhdHRlcm5fb1t0ZW1wX2ldPSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKTsKCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fMVt0ZW1wX2tdW3RlbXBfaV0pOwoJCS8vICBwcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwoJLy8JICBwcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzRbdGVtcF9rXVt0ZW1wX2ldKTsKCWlmIChwYXR0ZXJuX29bdGVtcF9pXSAhPSBwYXR0ZXJuXzRbdGVtcF9rXVt0ZW1wX2ldKQoJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoInA0RXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF0tRDB4JTA4eFxuIixwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCBwYXR0ZXJuXzRbdGVtcF9rXVt0ZW1wX2ldLHBhdHRlcm5fMVt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJfQoKCQl9CgkJCX0KCQl9CgkJICBmb3IgKCh0ZW1wX2s9MCk7KHRlbXBfazw0KTsodGVtcF9rKyspKQoJCSAgewp7CmRkcl91ZGVsYXkoMTAwMDApOwoJCSAgZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkKCQkJewoJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKT1kZXNfaW52X3BhdHRlcm4odGVtcF9pLDEsdGVtcF9rLHRlbXBfaSk7Ly9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldOwoJLy8JI2RlZmluZSBkZXNfcGF0dGVybihhLGIsYyxkKSAgZGVzW2FdXnBhdHRlcm5fIyNiW2NdW2RdCi8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXQoJCX0KICAgLy8gICBfY2xlYW5fZGNhY2hlX2FkZHIoMHgxMDAwMDAwMCk7CiAgICNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCSAgZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0X2FkZHIsc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CiAgICNlbmRpZgoJICBmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKSB7CgkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJcGF0dGVybl9vW3RlbXBfaV09Kih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpOwoJLy8JIHByaW50ZigiXG4gdGVzdF9hZGRyIHBhdHRlcm5fbyBwYXR0ZXJuX2QgIDB4JTA4eCAtIDB4JTA4eCAtIDB4JTA4eCIsIHRlc3RfYWRkcixwYXR0ZXJuX29bdGVtcF9pXSwgcGF0dGVybl8xW3RlbXBfa11bdGVtcF9pXSk7CgkJLy8gIHByaW50ZigiXG4weCUwOHgiLChwYXR0ZXJuX29bdGVtcF9pXSleKGRlc1t0ZW1wX2ldKSk7CgkvLwkgIHByaW50ZigiXG4weCUwOHgiLHBhdHRlcm5fNFt0ZW1wX2tdW3RlbXBfaV0pOwoJcGF0dGVybl9kW3RlbXBfaV09ZGVzX3hvcl9wYXR0ZXJuKChkZXNbdGVtcF9pXSksKHBhdHRlcm5fb1t0ZW1wX2ldKSk7CglpZiAoKGRlc194b3JfcGF0dGVybigoZGVzW3RlbXBfaV0pLChwYXR0ZXJuX29bdGVtcF9pXSkpKSAhPSBwYXR0ZXJuX2RbdGVtcF9pXSkKCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJwNCBpbnZFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIH4ocGF0dGVybl80W3RlbXBfa11bdGVtcF9pXSkscGF0dGVybl9kW3RlbXBfaV0pOwoJCQkJCQl9CgoJCX0KCQkJfQoJCX0KCQkgIH0KCQkvL2lmKHBhdHRlcm5fZmxhZzI9PTEpCgkJCXsKCSBmb3IgKCh0ZW1wX2s9MCk7KHRlbXBfazw0KTsodGVtcF9rKyspKSB7CnsKZGRyX3VkZWxheSgxMDAwMCk7CgkJICBmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKQoJCQl7CgkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJKih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpPWRlc19wYXR0ZXJuKHRlbXBfaSwyLHRlbXBfayx0ZW1wX2kpOy8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXTsKCS8vCSNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIGRlc1thXV5wYXR0ZXJuXyMjYltjXVtkXQovL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0KCQl9CiAgIC8vICAgX2NsZWFuX2RjYWNoZV9hZGRyKDB4MTAwMDAwMDApOwogICAjaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkgIGZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwogICAjZW5kaWYKCSAgZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCXBhdHRlcm5fb1t0ZW1wX2ldPSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKTsKCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0pOwogLy9wcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwogLy9wcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldKTsKCWlmIChwYXR0ZXJuX29bdGVtcF9pXSAhPSBwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldKQoJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoInA1RXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF0tRDB4JTA4eFxuIixwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCBwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldLHBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJfQoJICB9CgkJCX0KCQl9CgkgIGZvciAoKHRlbXBfaz0wKTsodGVtcF9rPDQpOyh0ZW1wX2srKykpCnsKewpkZHJfdWRlbGF5KDEwMDAwKTsKCQkgIGZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCXsKCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkqKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk9ZGVzX2ludl9wYXR0ZXJuKHRlbXBfaSwyLHRlbXBfayx0ZW1wX2kpOy8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXTsKCS8vCSNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIGRlc1thXV5wYXR0ZXJuXyMjYltjXVtkXQovL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0KCQl9CiAgIC8vICAgX2NsZWFuX2RjYWNoZV9hZGRyKDB4MTAwMDAwMDApOwogICAjaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkgIGZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwogICAjZW5kaWYKCSAgZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCXBhdHRlcm5fb1t0ZW1wX2ldPSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKTsKCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0pOwogLy9wcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwogLy9wcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldKTsKCXBhdHRlcm5fZFt0ZW1wX2ldPWRlc194b3JfcGF0dGVybigoZGVzW3RlbXBfaV0pLChwYXR0ZXJuX29bdGVtcF9pXSkpOwoJCWlmICgoZGVzX3hvcl9wYXR0ZXJuKChkZXNbdGVtcF9pXSksKHBhdHRlcm5fb1t0ZW1wX2ldKSkpICE9IHBhdHRlcm5fZFt0ZW1wX2ldKQoJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoInA1IGludkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgfihwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldKSxwYXR0ZXJuX2RbdGVtcF9pXSk7CgkJCQkJCX0KCSAgfQoJCQl9CgkJfQoKCQkJfQoKCS8vCWlmKHBhdHRlcm5fZmxhZzM9PTEpCgkJCXsKCWZvciAoKHRlbXBfaz0wKTsodGVtcF9rPDQpOyh0ZW1wX2srKykpIHsKewpkZHJfdWRlbGF5KDEwMDAwKTsKCQkgIGZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCXsKCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkqKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk9ZGVzX3BhdHRlcm4odGVtcF9pLDMsdGVtcF9rLHRlbXBfaSk7Ly9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldOwoJLy8JI2RlZmluZSBkZXNfcGF0dGVybihhLGIsYyxkKSAgZGVzW2FdXnBhdHRlcm5fIyNiW2NdW2RdCi8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXQoJCX0KICAgLy8gICBfY2xlYW5fZGNhY2hlX2FkZHIoMHgxMDAwMDAwMCk7CiAgICNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCSAgZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0X2FkZHIsc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CiAgICNlbmRpZgoJICBmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKSB7CgkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJcGF0dGVybl9vW3RlbXBfaV09Kih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpOwoJLy8JIHByaW50ZigiXG4gdGVzdF9hZGRyIHBhdHRlcm5fbyBwYXR0ZXJuX2QgIDB4JTA4eCAtIDB4JTA4eCAtIDB4JTA4eCIsIHRlc3RfYWRkcixwYXR0ZXJuX29bdGVtcF9pXSwgcGF0dGVybl8zW3RlbXBfa11bdGVtcF9pXSk7CiAvL3ByaW50ZigiXG4weCUwOHgiLChwYXR0ZXJuX29bdGVtcF9pXSleKGRlc1t0ZW1wX2ldKSk7Ci8vIHByaW50ZigiXG4weCUwOHgiLHBhdHRlcm5fNlt0ZW1wX2tdW3RlbXBfaV0pOwoJaWYgKHBhdHRlcm5fb1t0ZW1wX2ldICE9IHBhdHRlcm5fNlt0ZW1wX2tdW3RlbXBfaV0pCgl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigicDZFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIHBhdHRlcm5fNlt0ZW1wX2tdW3RlbXBfaV0scGF0dGVybl8zW3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQl9CgkgIH0KCQkJfQoJCX0KCSBmb3IgKCh0ZW1wX2s9MCk7KHRlbXBfazw0KTsodGVtcF9rKyspKQoJIHsKewpkZHJfdWRlbGF5KDEwMDAwKTsKCQkgIGZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCXsKCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkqKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk9ZGVzX2ludl9wYXR0ZXJuKHRlbXBfaSwzLHRlbXBfayx0ZW1wX2kpOy8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXTsKCS8vCSNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIGRlc1thXV5wYXR0ZXJuXyMjYltjXVtkXQovL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0KCQl9CiAgIC8vICAgX2NsZWFuX2RjYWNoZV9hZGRyKDB4MTAwMDAwMDApOwogICAjaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkgIGZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwogICAjZW5kaWYKCSAgZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCXBhdHRlcm5fb1t0ZW1wX2ldPSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKTsKCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fM1t0ZW1wX2tdW3RlbXBfaV0pOwogLy9wcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwovLyBwcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzZbdGVtcF9rXVt0ZW1wX2ldKTsKCXBhdHRlcm5fZFt0ZW1wX2ldPWRlc194b3JfcGF0dGVybigoZGVzW3RlbXBfaV0pLChwYXR0ZXJuX29bdGVtcF9pXSkpOwoJCWlmICgoZGVzX3hvcl9wYXR0ZXJuKChkZXNbdGVtcF9pXSksKHBhdHRlcm5fb1t0ZW1wX2ldKSkpICE9IHBhdHRlcm5fZFt0ZW1wX2ldKQoJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoInA2IGludkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgfihwYXR0ZXJuXzZbdGVtcF9rXVt0ZW1wX2ldKSxwYXR0ZXJuX2RbdGVtcF9pXSk7CgkJCQkJCX0KCSAgfQoJCQl9CgkJfQoJCQl9CgoKCn0KCgkJICBwcmludGYoIlxFcnJvciBjb3VudD09MHglMDh4IiwgZXJyb3JfY291bnQpOwoJCSAgIHByaW50ZigiXG4gICAgICBcbiIpOwoJICB9CgoKCgoKCgppZiAoZXJyb3JfY291bnQpCglyZXR1cm4gMTsKZWxzZQoJcmV0dXJuIDA7Cn0KCmludCBkZHJfdGVzdF9neF90cmFpbmluZ19wYXR0ZXJuKGludCBkZHJfdGVzdF9zaXplKQp7CiB1bnNpZ25lZCBpbnQgIHN0YXJ0X2FkZHIgPSAweDEwMDAwMDAwOwoJZXJyb3Jfb3V0b2ZfY291bnRfZmxhZz0xOwoJCWVycm9yX2NvdW50PTA7CgoJIHVuc2lnbmVkIGludCAgZGVzWzhdIDsKIHVuc2lnbmVkIGludCAgcGF0dGVybl8xWzRdWzhdIDsKLy8gdW5zaWduZWQgaW50ICBwYXR0ZXJuXzJbNF1bOF0gOwovLyB1bnNpZ25lZCBpbnQgIHBhdHRlcm5fM1s0XVs4XSA7Ci8vIHVuc2lnbmVkIGludCAgcGF0dGVybl80WzRdWzhdIDsKLy8gdW5zaWduZWQgaW50ICBwYXR0ZXJuXzVbNF1bOF0gOwogIC8vdW5zaWduZWQgaW50ICBwYXR0ZXJuXzZbNF1bOF0gOwoKICBkZXNbMF0gPSAJMHhhZWM4M2Y0OTsKICAgZGVzWzFdID0gICAgICAweGQyNDNhNjJjOwogICBkZXNbMl0gPSAgICAgIDB4Zjg3NzRhMGI7CiAgZGVzWzNdID0gICAgICAgMHg2M2QyMTRlNTsKICAgZGVzWzRdID0gICAgICAweDNmNDE2NmQ1OwoJZGVzWzVdID0gICAgIDB4MjM5NjcyYzA7CiAgIGRlc1s2XSA9ICAgICAgMHg0N2JhNzUzMzsKICAgZGVzWzddID0gICAgICAweGNhZTRjZDdmOwogICAvKgoJcGF0dGVybl8xWzBdWzBdID0gMHg1NTAwNTUwMDsKCXBhdHRlcm5fMVswXVsxXSA9IDB4YWEwMGFhMDA7CglwYXR0ZXJuXzFbMF1bMl0gPSAweDU1MDA1NTAwOwoJcGF0dGVybl8xWzBdWzNdID0gMHhhYTAwYWEwMDsKCXBhdHRlcm5fMVswXVs0XSA9IDB4NTUwMDU1MDA7CglwYXR0ZXJuXzFbMF1bNV0gPSAweGFhMDBhYTAwOwoJcGF0dGVybl8xWzBdWzZdID0gMHg1NTAwNTUwMDsKCXBhdHRlcm5fMVswXVs3XSA9IDB4YWEwMGFhMDA7CgoJcGF0dGVybl8xWzFdWzBdID0gMHg1NTAwNTUwMDsKCXBhdHRlcm5fMVsxXVsxXSA9IDB4YWEwMGFhMDA7CglwYXR0ZXJuXzFbMV1bMl0gPSAweDU1MDA1NTAwOwoJcGF0dGVybl8xWzFdWzNdID0gMHhhYTAwYWEwMDsKCXBhdHRlcm5fMVsxXVs0XSA9IDB4NTUwMDU1MDA7CglwYXR0ZXJuXzFbMV1bNV0gPSAweGFhMDBhYTAwOwoJcGF0dGVybl8xWzFdWzZdID0gMHg1NTAwNTUwMDsKCXBhdHRlcm5fMVsxXVs3XSA9IDB4YWEwMGFhMDA7CgoJcGF0dGVybl8xWzJdWzBdID0gMHg1NTAwNTUwMDsKCXBhdHRlcm5fMVsyXVsxXSA9IDB4YWEwMGFhMDA7CglwYXR0ZXJuXzFbMl1bMl0gPSAweDU1MDA1NTAwOwoJcGF0dGVybl8xWzJdWzNdID0gMHhhYTAwYWEwMDsKCXBhdHRlcm5fMVsyXVs0XSA9IDB4NTUwMDU1MDA7CglwYXR0ZXJuXzFbMl1bNV0gPSAweGFhMDBhYTAwOwoJcGF0dGVybl8xWzJdWzZdID0gMHg1NTAwNTUwMDsKCXBhdHRlcm5fMVsyXVs3XSA9IDB4YWEwMGFhMDA7CgoJcGF0dGVybl8xWzNdWzBdID0gMHg1NTAwNTUwMDsKCXBhdHRlcm5fMVszXVsxXSA9IDB4YWEwMGFhMDA7CglwYXR0ZXJuXzFbM11bMl0gPSAweDU1MDA1NTAwOwoJcGF0dGVybl8xWzNdWzNdID0gMHhhYTAwYWEwMDsKCXBhdHRlcm5fMVszXVs0XSA9IDB4NTUwMDU1MDA7CglwYXR0ZXJuXzFbM11bNV0gPSAweGFhMDBhYTAwOwoJcGF0dGVybl8xWzNdWzZdID0gMHg1NTAwNTUwMDsKCXBhdHRlcm5fMVszXVs3XSA9IDB4YWEwMGFhMDA7CgkqLwogICAvLyAvKgoJIHBhdHRlcm5fMVswXVswXSA9IDB4NTVhYTU1MDA7CglwYXR0ZXJuXzFbMF1bMV0gPSAweDU1YWE1NTAwOwoJcGF0dGVybl8xWzBdWzJdID0gMHg1NWFhNTUwMDsKCXBhdHRlcm5fMVswXVszXSA9IDB4NTVhYTU1MDA7CglwYXR0ZXJuXzFbMF1bNF0gPSAweGFhMDBmZjAwOwoJcGF0dGVybl8xWzBdWzVdID0gMHhhYTAwZmYwMDsKCXBhdHRlcm5fMVswXVs2XSA9IDB4YWEwMGZmMDA7CglwYXR0ZXJuXzFbMF1bN10gPSAweGFhMDBmZjAwOwoKCXBhdHRlcm5fMVsxXVswXSA9IDB4NTUwMDU1MDA7CglwYXR0ZXJuXzFbMV1bMV0gPSAweGFhMDBhYTAwOwoJcGF0dGVybl8xWzFdWzJdID0gMHg1NTAwNTUwMDsKCXBhdHRlcm5fMVsxXVszXSA9IDB4YWEwMGFhMDA7CglwYXR0ZXJuXzFbMV1bNF0gPSAweDU1MDA1NTAwOwoJcGF0dGVybl8xWzFdWzVdID0gMHhhYTAwYWEwMDsKCXBhdHRlcm5fMVsxXVs2XSA9IDB4NTUwMDU1MDA7CglwYXR0ZXJuXzFbMV1bN10gPSAweGFhMDBhYTAwOwoKCXBhdHRlcm5fMVsyXVswXSA9IDB4MDAwMWZlMDA7CglwYXR0ZXJuXzFbMl1bMV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8xWzJdWzJdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMVsyXVszXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzFbMl1bNF0gPSAweDAwMDJmZDAwOwoJcGF0dGVybl8xWzJdWzVdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMVsyXVs2XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzFbMl1bN10gPSAweDAwMDBmZjAwOwoKCXBhdHRlcm5fMVszXVswXSA9IDB4MDAwNGZiMDA7CglwYXR0ZXJuXzFbM11bMV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8xWzNdWzJdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMVszXVszXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzFbM11bNF0gPSAweDAwMDhmNzAwOwoJcGF0dGVybl8xWzNdWzVdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMVszXVs2XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzFbM11bN10gPSAweDAwMDBmZjAwOwovLyovCgkvKgoJcGF0dGVybl8yWzBdWzBdID0gMHgwMDAxZmUwMDsKCXBhdHRlcm5fMlswXVsxXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMF1bMl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzBdWzNdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlswXVs0XSA9IDB4MDAwMmZkMDA7CglwYXR0ZXJuXzJbMF1bNV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzBdWzZdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlswXVs3XSA9IDB4MDAwMGZmMDA7CgoJcGF0dGVybl8yWzFdWzBdID0gMHgwMDA0ZmIwMDsKCXBhdHRlcm5fMlsxXVsxXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMV1bMl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzFdWzNdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsxXVs0XSA9IDB4MDAwOGY3MDA7CglwYXR0ZXJuXzJbMV1bNV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzFdWzZdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsxXVs3XSA9IDB4MDAwMGZmMDA7CgoJcGF0dGVybl8yWzJdWzBdID0gMHgwMDEwZWYwMDsKCXBhdHRlcm5fMlsyXVsxXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMl1bMl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzJdWzNdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsyXVs0XSA9IDB4MDAyMGRmMDA7CglwYXR0ZXJuXzJbMl1bNV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzJdWzZdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsyXVs3XSA9IDB4MDAwMGZmMDA7CgoJcGF0dGVybl8yWzNdWzBdID0gMHgwMDQwYmYwMDsKCXBhdHRlcm5fMlszXVsxXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbM11bMl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzNdWzNdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlszXVs0XSA9IDB4MDA4MDdmMDA7CglwYXR0ZXJuXzJbM11bNV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzNdWzZdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlszXVs3XSA9IDB4MDAwMGZmMDA7CgoJcGF0dGVybl8zWzBdWzBdID0gMHgwMDAxMDAwMDsKCXBhdHRlcm5fM1swXVsxXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMF1bMl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzBdWzNdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1swXVs0XSA9IDB4MDAwMjAwMDA7CglwYXR0ZXJuXzNbMF1bNV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzBdWzZdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1swXVs3XSA9IDB4MDAwMDAwMDA7CgoJcGF0dGVybl8zWzFdWzBdID0gMHgwMDA0MDAwMDsKCXBhdHRlcm5fM1sxXVsxXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMV1bMl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzFdWzNdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1sxXVs0XSA9IDB4MDAwODAwMDA7CglwYXR0ZXJuXzNbMV1bNV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzFdWzZdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1sxXVs3XSA9IDB4MDAwMDAwMDA7CgoJcGF0dGVybl8zWzJdWzBdID0gMHgwMDEwMDAwMDsKCXBhdHRlcm5fM1syXVsxXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMl1bMl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzJdWzNdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1syXVs0XSA9IDB4MDAyMDAwMDA7CglwYXR0ZXJuXzNbMl1bNV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzJdWzZdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1syXVs3XSA9IDB4MDAwMDAwMDA7CgoJcGF0dGVybl8zWzNdWzBdID0gMHgwMDQwMDAwMDsKCXBhdHRlcm5fM1szXVsxXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbM11bMl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzNdWzNdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1szXVs0XSA9IDB4MDA4MDAwMDA7CglwYXR0ZXJuXzNbM11bNV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzNdWzZdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1szXVs3XSA9IDB4MDAwMDAwMDA7CgoKcGF0dGVybl80WzBdWzBdID0JMHg1MWM4YzA0OQk7CnBhdHRlcm5fNFswXVsxXSA9CTB4MmQ0MzU5MmMJOwpwYXR0ZXJuXzRbMF1bMl0gPQkweDA3NzdiNTBiCTsKcGF0dGVybl80WzBdWzNdID0JMHg5Y2QyZWJlNQk7CnBhdHRlcm5fNFswXVs0XSA9CTB4YzA0MTk5ZDUJOwpwYXR0ZXJuXzRbMF1bNV0gPQkweGRjOTY4ZGMwCTsKcGF0dGVybl80WzBdWzZdID0JMHhiOGJhOGEzMwk7CnBhdHRlcm5fNFswXVs3XSA9CTB4MzVlNDMyN2YJOwoKcGF0dGVybl80WzFdWzBdID0JMHhhZTM3YzA0OQk7CnBhdHRlcm5fNFsxXVsxXSA9CTB4ZDJiYzU5MmMJOwpwYXR0ZXJuXzRbMV1bMl0gPQkweGY4ODhiNTBiCTsKcGF0dGVybl80WzFdWzNdID0JMHg2MzJkZWJlNQk7CnBhdHRlcm5fNFsxXVs0XSA9CTB4M2ZiZTk5ZDUJOwpwYXR0ZXJuXzRbMV1bNV0gPQkweDIzNjk4ZGMwCTsKcGF0dGVybl80WzFdWzZdID0JMHg0NzQ1OGEzMwk7CnBhdHRlcm5fNFsxXVs3XSA9CTB4Y2ExYjMyN2YJOwoKcGF0dGVybl80WzJdWzBdID0JMHg1MTM3M2Y0OQk7CnBhdHRlcm5fNFsyXVsxXSA9CTB4MmRiY2E2MmMJOwpwYXR0ZXJuXzRbMl1bMl0gPQkweDA3ODg0YTBiCTsKcGF0dGVybl80WzJdWzNdID0JMHg5YzJkMTRlNQk7CnBhdHRlcm5fNFsyXVs0XSA9CTB4YzBiZTY2ZDUJOwpwYXR0ZXJuXzRbMl1bNV0gPQkweGRjNjk3MmMwCTsKcGF0dGVybl80WzJdWzZdID0JMHhiODQ1NzUzMwk7CnBhdHRlcm5fNFsyXVs3XSA9CTB4MzUxYmNkN2YJOwoKCnBhdHRlcm5fNFszXVswXSA9CTB4NTFjOGMwNDkJOwpwYXR0ZXJuXzRbM11bMV0gPQkweDJkNDM1OTJjCTsKcGF0dGVybl80WzNdWzJdID0JMHgwNzc3YjUwYgk7CnBhdHRlcm5fNFszXVszXSA9CTB4OWNkMmViZTUJOwpwYXR0ZXJuXzRbM11bNF0gPQkweGMwNDE5OWQ1CTsKcGF0dGVybl80WzNdWzVdID0JMHhkYzk2OGRjMAk7CnBhdHRlcm5fNFszXVs2XSA9CTB4YjhiYThhMzMJOwpwYXR0ZXJuXzRbM11bN10gPQkweDM1ZTQzMjdmCTsKCnBhdHRlcm5fNVswXVswXSA9CTB4YWVjOWMxNDkJOwpwYXR0ZXJuXzVbMF1bMV0gPQkweGQyNDM1OTJjCTsKcGF0dGVybl81WzBdWzJdID0JMHhmODc3YjUwYgk7CnBhdHRlcm5fNVswXVszXSA9CTB4NjNkMmViZTUJOwpwYXR0ZXJuXzVbMF1bNF0gPQkweDNmNDM5YmQ1CTsKcGF0dGVybl81WzBdWzVdID0JMHgyMzk2OGRjMAk7CnBhdHRlcm5fNVswXVs2XSA9CTB4NDdiYThhMzMJOwpwYXR0ZXJuXzVbMF1bN10gPQkweGNhZTQzMjdmCTsKcGF0dGVybl81WzFdWzBdID0JMHhhZWNjYzQ0OQk7CnBhdHRlcm5fNVsxXVsxXSA9CTB4ZDI0MzU5MmMJOwpwYXR0ZXJuXzVbMV1bMl0gPQkweGY4NzdiNTBiCTsKcGF0dGVybl81WzFdWzNdID0JMHg2M2QyZWJlNQk7CnBhdHRlcm5fNVsxXVs0XSA9CTB4M2Y0OTkxZDUJOwpwYXR0ZXJuXzVbMV1bNV0gPQkweDIzOTY4ZGMwCTsKcGF0dGVybl81WzFdWzZdID0JMHg0N2JhOGEzMwk7CnBhdHRlcm5fNVsxXVs3XSA9CTB4Y2FlNDMyN2YJOwpwYXR0ZXJuXzVbMl1bMF0gPQkweGFlZDhkMDQ5CTsKcGF0dGVybl81WzJdWzFdID0JMHhkMjQzNTkyYwk7CnBhdHRlcm5fNVsyXVsyXSA9CTB4Zjg3N2I1MGIJOwpwYXR0ZXJuXzVbMl1bM10gPQkweDYzZDJlYmU1CTsKcGF0dGVybl81WzJdWzRdID0JMHgzZjYxYjlkNQk7CnBhdHRlcm5fNVsyXVs1XSA9CTB4MjM5NjhkYzAJOwpwYXR0ZXJuXzVbMl1bNl0gPQkweDQ3YmE4YTMzCTsKcGF0dGVybl81WzJdWzddID0JMHhjYWU0MzI3Zgk7CnBhdHRlcm5fNVszXVswXSA9CTB4YWU4ODgwNDkJOwpwYXR0ZXJuXzVbM11bMV0gPQkweGQyNDM1OTJjCTsKcGF0dGVybl81WzNdWzJdID0JMHhmODc3YjUwYgk7CnBhdHRlcm5fNVszXVszXSA9CTB4NjNkMmViZTUJOwpwYXR0ZXJuXzVbM11bNF0gPQkweDNmYzExOWQ1CTsKcGF0dGVybl81WzNdWzVdID0JMHgyMzk2OGRjMAk7CnBhdHRlcm5fNVszXVs2XSA9CTB4NDdiYThhMzMJOwpwYXR0ZXJuXzVbM11bN10gPQkweGNhZTQzMjdmCTsKCnBhdHRlcm5fNlswXVswXSA9ICAgMHhhZWM5M2Y0OSAgIDsKcGF0dGVybl82WzBdWzFdID0JMHhkMjQzYTYyYwk7CnBhdHRlcm5fNlswXVsyXSA9CTB4Zjg3NzRhMGIJOwpwYXR0ZXJuXzZbMF1bM10gPQkweDYzZDIxNGU1CTsKcGF0dGVybl82WzBdWzRdID0JMHgzZjQzNjZkNQk7CnBhdHRlcm5fNlswXVs1XSA9CTB4MjM5NjcyYzAJOwpwYXR0ZXJuXzZbMF1bNl0gPQkweDQ3YmE3NTMzCTsKcGF0dGVybl82WzBdWzddID0JMHhjYWU0Y2Q3Zgk7CnBhdHRlcm5fNlsxXVswXSA9CTB4YWVjYzNmNDkJOwpwYXR0ZXJuXzZbMV1bMV0gPQkweGQyNDNhNjJjCTsKcGF0dGVybl82WzFdWzJdID0JMHhmODc3NGEwYgk7CnBhdHRlcm5fNlsxXVszXSA9CTB4NjNkMjE0ZTUJOwpwYXR0ZXJuXzZbMV1bNF0gPQkweDNmNDk2NmQ1CTsKcGF0dGVybl82WzFdWzVdID0JMHgyMzk2NzJjMAk7CnBhdHRlcm5fNlsxXVs2XSA9CTB4NDdiYTc1MzMJOwpwYXR0ZXJuXzZbMV1bN10gPQkweGNhZTRjZDdmCTsKcGF0dGVybl82WzJdWzBdID0JMHhhZWQ4M2Y0OQk7CnBhdHRlcm5fNlsyXVsxXSA9CTB4ZDI0M2E2MmMJOwpwYXR0ZXJuXzZbMl1bMl0gPQkweGY4Nzc0YTBiCTsKcGF0dGVybl82WzJdWzNdID0JMHg2M2QyMTRlNQk7CnBhdHRlcm5fNlsyXVs0XSA9CTB4M2Y2MTY2ZDUJOwpwYXR0ZXJuXzZbMl1bNV0gPQkweDIzOTY3MmMwCTsKcGF0dGVybl82WzJdWzZdID0JMHg0N2JhNzUzMwk7CnBhdHRlcm5fNlsyXVs3XSA9CTB4Y2FlNGNkN2YJOwpwYXR0ZXJuXzZbM11bMF0gPQkweGFlODgzZjQ5CTsKcGF0dGVybl82WzNdWzFdID0JMHhkMjQzYTYyYwk7CnBhdHRlcm5fNlszXVsyXSA9CTB4Zjg3NzRhMGIJOwpwYXR0ZXJuXzZbM11bM10gPQkweDYzZDIxNGU1CTsKcGF0dGVybl82WzNdWzRdID0JMHgzZmMxNjZkNQk7CnBhdHRlcm5fNlszXVs1XSA9CTB4MjM5NjcyYzAJOwpwYXR0ZXJuXzZbM11bNl0gPQkweDQ3YmE3NTMzCTsKcGF0dGVybl82WzNdWzddID0JMHhjYWU0Y2Q3Zgk7CiovCi8vKi8KLy8qLwoJc3RhcnRfYWRkcj0weDEwMDAwMDAwOwp1bnNpZ25lZCBpbnQJCQl0ZXN0X3NpemUgPSAweDIwOwp1bnNpZ25lZCBpbnQgdGVzdF9hZGRyOwp1bnNpZ25lZCBpbnQgdGVtcF9pPTA7CnVuc2lnbmVkIGludCB0ZW1wX2s9MDsKdW5zaWduZWQgaW50IHBhdHRlcm5fb1s4XTsKdW5zaWduZWQgaW50IHBhdHRlcm5fZFs4XTsKewoJICAvLyAgaWYobGZsYWcpCgkgIC8vICAgICAgbG9vcCA9IDg4ODsKCgkJLy9pZihvbGRfcGF0dGVybl9mbGFnPT0xKQoJCQl7CgoJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLlxuIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CgovKgoJIGZvciAoKHRlbXBfaz0wKTsodGVtcF9rPDQpOyh0ZW1wX2srKykpIHsKewoKCQkgIGZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCXsKCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkqKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk9ZGVzX3BhdHRlcm4odGVtcF9pLDIsdGVtcF9rLHRlbXBfaSk7Ly9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldOwoJLy8JI2RlZmluZSBkZXNfcGF0dGVybihhLGIsYyxkKSAgZGVzW2FdXnBhdHRlcm5fIyNiW2NdW2RdCi8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXQoJCX0KICAgLy8gICBfY2xlYW5fZGNhY2hlX2FkZHIoMHgxMDAwMDAwMCk7CgkgIGZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwoKCSAgZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCXBhdHRlcm5fb1t0ZW1wX2ldPSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKTsKCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0pOwogLy9wcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwogLy9wcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldKTsKCWlmIChwYXR0ZXJuX29bdGVtcF9pXSAhPSBwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldKQoJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoInA1RXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF0tRDB4JTA4eFxuIixwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCBwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldLHBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJfQoJICB9CgkJCX0KCQl9CiovCgkJLy9pZihwYXR0ZXJuX2ZsYWcxPT0xKQoJCQl7CgkJICBmb3IgKCh0ZW1wX2s9MCk7KHRlbXBfazw0KTsodGVtcF9rKyspKQoJCQl7CnsKZGRyX3VkZWxheSgxMDAwMCk7CgkJICBmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKQoJCQl7CgkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJKih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpPWRlc19wYXR0ZXJuKHRlbXBfaSwxLHRlbXBfayx0ZW1wX2kpOy8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXTsKCS8vCSNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIGRlc1thXV5wYXR0ZXJuXyMjYltjXVtkXQovL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0KCQl9CiAgIC8vICAgX2NsZWFuX2RjYWNoZV9hZGRyKDB4MTAwMDAwMDApOwogICAjaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkgIGZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwogICAjZW5kaWYKCSAgZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCXBhdHRlcm5fb1t0ZW1wX2ldPSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKTsKCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fMVt0ZW1wX2tdW3RlbXBfaV0pOwoJCS8vICBwcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwoJLy8JICBwcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzRbdGVtcF9rXVt0ZW1wX2ldKTsKCWlmICgocGF0dGVybl9vW3RlbXBfaV0pICE9IChkZXNfcGF0dGVybih0ZW1wX2ksMSx0ZW1wX2ssdGVtcF9pKSkpCgl7ZXJyb3JfY291bnQrKzsKCQkJLy8gICAgICAgICAgICAgICAgcHJpbnRmKCJwNEVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgcGF0dGVybl80W3RlbXBfa11bdGVtcF9pXSxwYXR0ZXJuXzFbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkgIHByaW50ZigicDRFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIGRlc19wYXR0ZXJuKHRlbXBfaSwxLHRlbXBfayx0ZW1wX2kpLHBhdHRlcm5fMVt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJfQoKCgkJfQoJCQl9CgkJfQoKCQkgIGZvciAoKHRlbXBfaz0wKTsodGVtcF9rPDQpOyh0ZW1wX2srKykpCgkJICB7CnsKZGRyX3VkZWxheSgxMDAwMCk7CgkJICBmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKQoJCQl7CgkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJKih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpPWRlc19pbnZfcGF0dGVybih0ZW1wX2ksMSx0ZW1wX2ssdGVtcF9pKTsvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV07CgkvLwkjZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICBkZXNbYV1ecGF0dGVybl8jI2JbY11bZF0KLy9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldCgkJfQogICAvLyAgIF9jbGVhbl9kY2FjaGVfYWRkcigweDEwMDAwMDAwKTsKICAgI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJICBmbHVzaF9kY2FjaGVfcmFuZ2Uoc3RhcnRfYWRkcixzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKICAgI2VuZGlmCgkgIGZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpIHsKCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQlwYXR0ZXJuX29bdGVtcF9pXT0qKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk7CgkvLwkgcHJpbnRmKCJcbiB0ZXN0X2FkZHIgcGF0dGVybl9vIHBhdHRlcm5fZCAgMHglMDh4IC0gMHglMDh4IC0gMHglMDh4IiwgdGVzdF9hZGRyLHBhdHRlcm5fb1t0ZW1wX2ldLCBwYXR0ZXJuXzFbdGVtcF9rXVt0ZW1wX2ldKTsKCQkvLyAgcHJpbnRmKCJcbjB4JTA4eCIsKHBhdHRlcm5fb1t0ZW1wX2ldKV4oZGVzW3RlbXBfaV0pKTsKCS8vCSAgcHJpbnRmKCJcbjB4JTA4eCIscGF0dGVybl80W3RlbXBfa11bdGVtcF9pXSk7CglwYXR0ZXJuX2RbdGVtcF9pXT1kZXNfeG9yX3BhdHRlcm4oKGRlc1t0ZW1wX2ldKSwocGF0dGVybl9vW3RlbXBfaV0pKTsKCWlmICgoZGVzX3hvcl9wYXR0ZXJuKChkZXNbdGVtcF9pXSksZGVzX2ludl9wYXR0ZXJuKHRlbXBfaSwxLHRlbXBfayx0ZW1wX2kpKSkgIT0gcGF0dGVybl9kW3RlbXBfaV0pCgl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigicDQgaW52RXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF0tRDB4JTA4eFxuIiwKCQkJCQkJCQlwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCB+KHBhdHRlcm5fMVt0ZW1wX2tdW3RlbXBfaV0pLHBhdHRlcm5fZFt0ZW1wX2ldKTsKCQkJCQkJfQoKCQl9CgkJCX0KCQl9CgoJCSAgfQoJCS8vaWYocGF0dGVybl9mbGFnMj09MSkKCgoJLy8JaWYocGF0dGVybl9mbGFnMz09MSkKCgoKCn0KCgkJICBwcmludGYoIlxFcnJvciBjb3VudD09MHglMDh4IiwgZXJyb3JfY291bnQpOwoJCSAgIHByaW50ZigiXG4gICAgICBcbiIpOwoJICB9CgoKCgoKCgppZiAoZXJyb3JfY291bnQpCglyZXR1cm4gMTsKZWxzZQoJcmV0dXJuIDA7Cn0KCgojZW5kaWYKCnN0YXRpYyB2b2lkIGRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX3Aodm9pZCAqYnVmZiwgIHVuc2lnbmVkIGludCAgbV9sZW5ndGgpCnsKCSB1bnNpZ25lZCBpbnQgICpwOwogLy8gICAgdW5zaWduZWQgaW50ICBpLCBqLCBuOwoJICB1bnNpZ25lZCBpbnQgIGksIG47CgkgdW5zaWduZWQgaW50ICBtX2xlbiA9IG1fbGVuZ3RoOwovLyNkZWZpbmUgZGRyX3BhdHRlcm5fbG9vcCAzMgoJcCA9ICggdW5zaWduZWQgaW50ICAqKWJ1ZmY7CgogICAgd2hpbGUgKG1fbGVuKQoJewoJICAvLyAgZm9yKGo9MDtqPDMyO2orKykKCQl7CiAgICAgICAgICAgIGlmIChtX2xlbiA+PSAxMjgqNCkKCQkJCW4gPSAzMio0OwoJCQllbHNlCgkJCQluID0gbV9sZW4+PjI7CgogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQoJCQl7CgkJCQkjaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJICAgZGRyX3BsZF9jYWNoZShwKSAgOwoJCSNlbmRpZgogICAgICAgICAgICAgICAgc3dpdGNoIChpKQoJCQkJewoJCQkJCWNhc2UgMDoKCQkJCQljYXNlIDE6CgkJCQkJY2FzZSAyOgoJCQkJCWNhc2UgMzoKCQkJCQljYXNlIDg6CgkJCQkJY2FzZSA5OgoJCQkJCWNhc2UgMTA6CgkJCQkJY2FzZSAxMToKCQkgICAgICBjYXNlIDE2OgoJCQkJCWNhc2UgMTc6CgkJCQkJY2FzZSAxODoKCQkJCQljYXNlIDE5OgoJCQkJCWNhc2UgMjQ6CgkJCQkJY2FzZSAyNToKCQkJCQljYXNlIDI2OgoJCQkJCWNhc2UgMjc6CgkJCQkgLy8gICBjYXNlIDMwOgoJCQkJCQkqKHAraSkgPSBUREFUQTMyRjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA0OgoJCQkJCWNhc2UgNToKCQkJCQljYXNlIDY6CgkJCQkJY2FzZSA3OgoJCQkJCWNhc2UgMTI6CgkJCQkJY2FzZSAxMzoKCQkJCQljYXNlIDE0OgoJCQkJCWNhc2UgMTU6CgkJICAgICAgY2FzZSAyMDoKCQkJCQljYXNlIDIxOgoJCQkJCWNhc2UgMjI6CgkJCQkJY2FzZSAyMzoKCQkgICAgICBjYXNlIDI4OgoJCQkJCWNhc2UgMjk6CgkJCQkJY2FzZSAzMDoKCQkJCQljYXNlIDMxOgoJCQkJIC8vICAgY2FzZSAyMjoKCQkJCQkJKihwK2kpID0gMDsKCQkJCQkJYnJlYWs7CgkJICAgICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTE6CgkJICAgICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjc6CgkJCQkgLy8gICBjYXNlIDMwOgoJCQkJCQkgICoocCtpKSA9IFREQVRBMzJBOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE1OgoJCSAgICAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIzOgoJCSAgICAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzMxOgoJCQkJKihwK2kpID0gVERBVEEzMjU7CgoKCQkJCQkJYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzA6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzM6CgkJCQkqKHAraSkgPTB4ZmUwMWZlMDE7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMis0OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMis1OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMis2OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMis3OgoJCQkJKihwK2kpID0weGZkMDJmZDAyOwoJCQkJICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrODoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrOToKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTA6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzExOgoJCQkJKihwK2kpID0weGZiMDRmYjA0OwoJCQkJICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTI6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEzOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTU6CgkJCQkqKHAraSkgPTB4ZjcwOGY3MDg7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTc6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE4OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisxOToKCQkJCSoocCtpKSA9MHhlZjEwZWYxMDsKCQkJCSAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIwOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMToKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjI6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIzOgoJCQkJKihwK2kpID0weGRmMjBkZjIwOwoJCQkJICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjQ6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI1OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjc6CgkJCQkqKHAraSkgPTB4YmY0MGJmNDA7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisyODoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjk6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMwOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMiszMToKCQkJCSoocCtpKSA9MHg3ZjgwN2Y4MDsKCQkJCSAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzA6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzM6CgkJCQkqKHAraSkgPTB4MDAwMDAxMDA7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMys0OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMys1OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMys2OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMys3OgoJCQkJKihwK2kpID0weDAwMDAwMjAwOwoJCQkJICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrODoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrOToKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTA6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzExOgoJCQkJKihwK2kpID0weDAwMDAwNDAwOwoJCQkJICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTI6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEzOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTU6CgkJCQkqKHAraSkgPTB4MDAwMDA4MDA7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTc6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE4OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOToKCQkJCSoocCtpKSA9MHgwMDAwMTAwMDsKCQkJCSAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIwOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMToKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjI6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIzOgoJCQkJKihwK2kpID0weDAwMDAyMDAwOwoJCQkJICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjQ6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI1OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjc6CgkJCQkqKHAraSkgPTB4MDAwMDQwMDA7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysyODoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjk6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzMwOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMToKCQkJCSoocCtpKSA9MHgwMDAwODAwMDsKCQkJCSAgYnJlYWs7CgoKCQkJCX0KCQkJfQoKICAgICAgICAgICAgaWYgKG1fbGVuID4oIDEyOCo0KSkKCQkJewoJCQkJbV9sZW4gLT0oIDEyOCo0KTsKCQkJCXAgKz0gMzIqNDsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXAgKz0gKG1fbGVuPj4yKTsKCQkJCW1fbGVuID0gMDsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQp9CgpzdGF0aWMgdm9pZCBkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19wMih2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKewoJIHVuc2lnbmVkIGludCAgKnA7CiAvLyAgICB1bnNpZ25lZCBpbnQgIGksIGosIG47CgkgIHVuc2lnbmVkIGludCAgaSwgbjsKCSB1bnNpZ25lZCBpbnQgIG1fbGVuID0gbV9sZW5ndGg7Ci8vI2RlZmluZSBkZHJfcGF0dGVybl9sb29wIDMyCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCiAgICB3aGlsZSAobV9sZW4pCgl7CgkgIC8vICBmb3Ioaj0wO2o8MzI7aisrKQoJCXsKICAgICAgICAgICAgaWYgKG1fbGVuID49IDEyOCo0KQoJCQkJbiA9IDMyKjQ7CgkJCWVsc2UKCQkJCW4gPSBtX2xlbj4+MjsKCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCgkJCXsKCSNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkgICBkZHJfcGxkX2NhY2hlKHApICA7CgkJI2VuZGlmCgogICAgICAgICAgICAgICAgc3dpdGNoIChpKQoJCQkJewoKCQkJCQkgY2FzZSAwOgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxOgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszOgoJCQkJCQkJKihwK2kpID0gMHhmZTAxZmUwMTsKCQkJCQkJCWJyZWFrOwoJCQkJCSBjYXNlIDQ6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzU6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzY6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzc6CgkJCQkJCSAgICoocCtpKSA9IDB4ZmQwMmZkMDI7CgkJCQkJCQkJCSBicmVhazsKCgkJCQkJIGNhc2UgODoKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErOToKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTA6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzExOgoJCQkJCQkgICAqKHAraSkgPSAweGZiMDRmYjA0OwoJCQkJCQlicmVhazsKCgkJCQkJIGNhc2UgMTI6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEzOgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNDoKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTU6CgkJCQkJCSAgICoocCtpKSA9IDB4ZjcwOGY3MDg7CgkJCQkJCWJyZWFrOwoKCQkJCQkgY2FzZSAxNjoKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTc6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE4OgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOToKCQkJCQkJICAgKihwK2kpID0gMHhlZjEwZWYxMDsKCQkJCQkJYnJlYWs7CgoJCQkJCSBjYXNlIDIwOgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMToKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjI6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIzOgoJCQkJCQkgICAqKHAraSkgPSAweGRmMjBkZjIwOwoJCQkJCQlicmVhazsKCgkJCQkJIGNhc2UgMjQ6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI1OgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNjoKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjc6CgkJCQkJCSAgICoocCtpKSA9IDB4YmY0MGJmNDA7CgkJCSBicmVhazsKCgkJCQkJICAgY2FzZSAyODoKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjk6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMwOgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMToKCQkJCQkJICAgKihwK2kpID0gMHg3ZjgwN2Y4MDsKCQkJCQkJYnJlYWs7CgoKCQkJICAgZGVmYXVsdDoKCgkJCQkJCSAgKihwK2kpID0gMHhmZjAwZmYwMDsKCQkJCQkJYnJlYWs7CgoJCQkJCQlicmVhazsKCgoJCQkJfQoJCQl9CgogICAgICAgICAgICBpZiAobV9sZW4gPiggMTI4KjQpKQoJCQl7CgkJCQltX2xlbiAtPSggMTI4KjQpOwoJCQkJcCArPSAzMio0OwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcCArPSAobV9sZW4+PjIpOwoJCQkJbV9sZW4gPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn0Kc3RhdGljIHZvaWQgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wKHZvaWQgKmJ1ZmYsICB1bnNpZ25lZCBpbnQgIG1fbGVuZ3RoKQp7CgkgdW5zaWduZWQgaW50ICAqcDsKICAvLyAgIHVuc2lnbmVkIGludCAgaSwgaiwgbjsKCSAgdW5zaWduZWQgaW50ICBpLCBuOwoJIHVuc2lnbmVkIGludCAgbV9sZW4gPSBtX2xlbmd0aDsKCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCiAgICB3aGlsZSAobV9sZW4pCgl7CgkgIC8vICBmb3Ioaj0wO2o8MzI7aisrKQoJCXsKICAgICAgICAgICAgaWYgKG1fbGVuID49IDEyOCo0KQoJCQkJbiA9IDMyKjQ7CgkJCWVsc2UKCQkJCW4gPSBtX2xlbj4+MjsKCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCgkJCXsKCQkJCSNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkgICBkZHJfcGxkX2NhY2hlKHApICA7CgkJI2VuZGlmCiAgICAgICAgICAgIGlmICgoZXJyb3Jfb3V0b2ZfY291bnRfZmxhZykgJiYgKGVycm9yX2NvdW50KSkKCQkJCXsKCQkJCXByaW50ZigiRXJyb3IgZGF0YSBvdXQgb2YgY291bnQiKTsKCQkJCSBtX2xlbj0wOwoJCQkJIGJyZWFrOwoJCQkJfQoKICAgICAgICAgICAgICAgIHN3aXRjaCAoaSkKCQkJCXsKCgkJCQkJIGNhc2UgMDoKCQkJCQljYXNlIDE6CgkJCQkJY2FzZSAyOgoJCQkJCWNhc2UgMzoKCQkJCQljYXNlIDg6CgkJCQkJY2FzZSA5OgoJCQkJCWNhc2UgMTA6CgkJCQkJY2FzZSAxMToKCQkgICAgICBjYXNlIDE2OgoJCQkJCWNhc2UgMTc6CgkJCQkJY2FzZSAxODoKCQkJCQljYXNlIDE5OgoJCQkJCWNhc2UgMjQ6CgkJCQkJY2FzZSAyNToKCQkJCQljYXNlIDI2OgoJCQkJCWNhc2UgMjc6CgkJCQkgLy8gICBjYXNlIDMwOgoJCQkJICAvLyAgICAgICoocCtpKSA9IFREQVRBMzJGOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKihwK2kpICE9IFREQVRBMzJGKQoJCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCBUREFUQTMyRik7CgkJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCQkJCQkJCX0KCQkJCQkJIGJyZWFrOwoJCQkJCSBjYXNlIDQ6CgkJCQkJY2FzZSA1OgoJCQkJCWNhc2UgNjoKCQkJCQljYXNlIDc6CgkJCQkJY2FzZSAxMjoKCQkJCQljYXNlIDEzOgoJCQkJCWNhc2UgMTQ6CgkJCQkJY2FzZSAxNToKCQkgICAgICBjYXNlIDIwOgoJCQkJCWNhc2UgMjE6CgkJCQkJY2FzZSAyMjoKCQkJCQljYXNlIDIzOgoJCSAgICAgIGNhc2UgMjg6CgkJCQkJY2FzZSAyOToKCQkJCQljYXNlIDMwOgoJCQkJCWNhc2UgMzE6CgkJCQkgLy8gICBjYXNlIDIyOgoJCQkJCSAvLyAgICoocCtpKSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqKHAraSkgIT0gMCkKCQkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMCk7CgkJCQkJCWJyZWFrO30KCQkJCQkJIGJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzExOgoJCSAgICAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI3OgoJCQkJIC8vICAgY2FzZSAzMDoKCQkJCSAgLy8gICAgICAgICoocCtpKSA9IFREQVRBMzJBOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKihwK2kpICE9IFREQVRBMzJBKQoJCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCBUREFUQTMyQSk7CgkJCQkJCWJyZWFrOwoJCQkJCQkJfQoJCQkJCQkgYnJlYWs7CgkJCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNToKCQkgICAgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMzoKCQkgICAgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSszMToKCQkJLy8JKihwK2kpID0gVERBVEEzMjU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqKHAraSkgIT0gVERBVEEzMjUpCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIFREQVRBMzI1KTsKCQkJCQkJYnJlYWs7CgkJCQkJCQl9CgkJCQkJCSBicmVhazsKCQkJCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMToKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzoKCQkJLy8gICAJKihwK2kpID0weGZlMDFmZTAxOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKihwK2kpICE9MHhmZTAxZmUwMSkKCQkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZTAxZmUwMSk7CgkJCQkJCWJyZWFrOwoJCQkJCQkJfQoJCQkJCQkgYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNToKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNzoKCQkJICAvLyAJKihwK2kpID0weGZkMDJmZDAyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKihwK2kpICE9IDB4ZmQwMmZkMDIpCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmQwMmZkMDIpOwoJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMis4OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMis5OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTE6CgkJCSAgIC8vCSoocCtpKSA9MHhmYjA0ZmIwNDsKCQkJICAgICBpZiAoKihwK2kpICE9IDB4ZmIwNGZiMDQpCgkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGZiMDRmYjA0KTsKCQkJCSAgYnJlYWs7CgkJCQkJfQoJCQkJICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTI6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEzOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTU6CgkJCSAgIC8vCSoocCtpKSA9MHhmN2IwOGY3MDg7CgkJCQkgIGlmICgqKHAraSkgIT0gMHhmNzA4ZjcwOCkKCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZjcwOGY3MDgpOwoJCQkJICBicmVhazsKCQkJCQl9CgkJCQkgICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTY6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE3OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisxODoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTk6CgkJCSAgIC8vCSoocCtpKSA9MHhlZjEwZWYxMDsKCQkJCSAgaWYgKCoocCtpKSAhPSAweGVmMTBlZjEwKQoJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhlZjEwZWYxMCk7CgkJCQkgIGJyZWFrOwoJCQkJCX0KCQkJCSAgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjE6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIyOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMzoKCQkJICAgLy8JKihwK2kpID0weGRmMjBkZjIwOwoJCQkJICBpZiAoKihwK2kpICE9IDB4ZGYyMGRmMjApCgkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGRmMjBkZjIwKTsKCQkJCSAgYnJlYWs7CgkJCQkJfQoJCQkJICAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI0OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNToKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjY6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI3OgoJCQkgLy8gIAkqKHAraSkgPTB4YmY0MGJmNDA7CgkJCQkgIGlmICgqKHAraSkgIT0gMHhiZjQwYmY0MCkKCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4YmY0MGJmNDApOwoJCQkJICBicmVhazsKCQkJCQl9CgkJCQkgICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjg6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI5OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMiszMDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzE6CgkJCS8vICAgCSoocCtpKSA9MHg3ZjgwN2Y4MDsKCQkJCSAgaWYgKCoocCtpKSAhPSAweDdmODA3ZjgwKQoJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHg3ZjgwN2Y4MCk7CgkJCQkgIGJyZWFrOwoKCQkJCQl9CgkJCQkgICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMToKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzoKCQkJICAgLy8JKihwK2kpID0weDAwMDAwMTAwOwoJCQkJCSAgaWYgKCoocCtpKSAhPSAweDAwMDAwMTAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4MDAwMDAxMDApOwoJCQkJICBicmVhazsKCQkJCQkJfQoJCQkJCSAgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMys0OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMys1OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMys2OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMys3OgoJCQkgLy8gIAkqKHAraSkgPTB4MDAwMDAxMDA7CgkJCQkgIGlmICgqKHAraSkgIT0gMHgwMDAwMDIwMCkKCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4MDAwMDAyMDApOwoJCQkJICBicmVhazsKCQkJCQl9CgkJCQkgICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrODoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrOToKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTA6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzExOgoJCQkgICAvLwkqKHAraSkgPTB4MDAwMDAxMDA7CgkJCQkgaWYgKCoocCtpKSAhPSAweDAwMDAwNDAwKQoJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHgwMDAwMDQwMCk7CgkJCQkgIGJyZWFrOwoJCQkJCX0KCQkJCSAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEyOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMzoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTQ6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE1OgoJCQkgICAvLwkqKHAraSkgPTB4MDAwMDAxMDA7CgkJCQkgaWYgKCoocCtpKSAhPSAweDAwMDAwODAwKQoJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHgwMDAwMDgwMCk7CgkJCQkgIGJyZWFrOwoJCQkJCX0KCQkJCSAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE2OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNzoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTg6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE5OgoJCQkgICAvLwkqKHAraSkgPTB4ZmZmZmZlZmY7CgkJCQkgaWYgKCoocCtpKSAhPSAweDAwMDAxMDAwKQoJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHgwMDAwMTAwMCk7CgkJCQkgIGJyZWFrOwoJCQkJCX0KCQkJCSAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIwOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMToKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjI6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIzOgoJCQkgIC8vIAkqKHAraSkgPTB4ZmZmZmZlZmY7CgkJCQkgaWYgKCoocCtpKSAhPSAweDAwMDAyMDAwKQoJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHgwMDAwMjAwMCk7CgoJCQkJCX0gYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI0OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNToKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjY6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI3OgoJCQkgICAvLwkqKHAraSkgPTB4ZmZmZmZlZmY7CgkJCQkgaWYgKCoocCtpKSAhPSAweDAwMDA0MDAwKQoJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHgwMDAwNDAwMCk7CgkJCQkgIGJyZWFrOwoJCQkJCX0KCQkJCSAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI4OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysyOToKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzA6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzMxOgoJCQkgICAvLwkqKHAraSkgPTB4ZmZmZmZlZmY7CgkJCQkgaWYgKCoocCtpKSAhPSAweDAwMDA4MDAwKQoJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHgwMDAwODAwMCk7CgkJCQkgIGJyZWFrOwoJCQkJCX0KCQkJCSAgYnJlYWs7CgoKCgkJCQl9CgkJCX0KCiAgICAgICAgICAgIGlmIChtX2xlbiA+IDEyOCo0KQoJCQl7CgkJCQltX2xlbiAtPSAxMjgqNDsKCQkJCXAgKz0gMzIqNDsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXAgKz0gKG1fbGVuPj4yKTsKCQkJCW1fbGVuID0gMDsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQp9Ci8vKi8Kc3RhdGljIHZvaWQgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wMih2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKewoJIHVuc2lnbmVkIGludCAgKnA7CiAgLy8gICB1bnNpZ25lZCBpbnQgIGksIGosIG47CgkgIHVuc2lnbmVkIGludCAgaSwgbjsKCSB1bnNpZ25lZCBpbnQgIG1fbGVuID0gbV9sZW5ndGg7CgoJcCA9ICggdW5zaWduZWQgaW50ICAqKWJ1ZmY7CgogICAgd2hpbGUgKG1fbGVuKQoJewoJICAvLyAgZm9yKGo9MDtqPDMyO2orKykKCQl7CiAgICAgICAgICAgIGlmIChtX2xlbiA+PSAxMjgqNCkKCQkJCW4gPSAzMio0OwoJCQllbHNlCgkJCQluID0gbV9sZW4+PjI7CgogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQoJCQl7CgkJCQkjaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJICAgZGRyX3BsZF9jYWNoZShwKSAgOwoJCSNlbmRpZgogICAgICAgICAgICBpZiAoKGVycm9yX291dG9mX2NvdW50X2ZsYWcpICYmIChlcnJvcl9jb3VudCkpCgkJCQl7CgkJCQlwcmludGYoIkVycm9yIGRhdGEgb3V0IG9mIGNvdW50Iik7CgkJCQkgbV9sZW49MDsKCQkJCSBicmVhazsKCQkJCX0KCiAgICAgICAgICAgICAgICBzd2l0Y2ggKGkpCgkJCQl7CgkJCQkJIGNhc2UgMDoKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMToKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjoKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzoKCQkJCQkJCS8vICAgKihwK2kpID0gMHhmZTAxZmUwMTsKCQkJCQkJCSAgIGlmICgqKHAraSkgIT0gMHhmZTAxZmUwMSkKCQkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZTAxZmUwMSk7CgkJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCQkJCQkJCX0KCQkJCQkJCWJyZWFrOwoJCQkJCSBjYXNlIDQ6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzU6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzY6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzc6CgkJCQkJLy8JICAgKihwK2kpID0gMHhmZDAyZmQwMjsKCQkJCQkJICAgICAgaWYgKCoocCtpKSAhPSAweGZkMDJmZDAyKQoJCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGZkMDJmZDAyKTsKCQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJCQkJCQkJfQoJCQkJCQkJCQkgYnJlYWs7CgoJCQkJCSBjYXNlIDg6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzk6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEwOgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMToKCQkJCQkJLy8gICAqKHAraSkgPSAweGZiMDRmYjA0OwoJCQkJCQkgICAgICBpZiAoKihwK2kpICE9IDB4ZmIwNGZiMDQpCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmIwNGZiMDQpOwoJCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQkgY2FzZSAxMjoKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTM6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE0OgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNToKCQkJCQkvLwkgICAqKHAraSkgPSAweGY3MDhmNzA4OwoJCQkJCQkgICAgICBpZiAoKihwK2kpICE9IDB4ZjcwOGY3MDgpCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZjcwOGY3MDgpOwoJCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQkgY2FzZSAxNjoKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTc6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE4OgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOToKCQkJCQkvLwkgICAqKHAraSkgPSAweGVmMTBlZjEwOwoJCQkJCQkgICAgICBpZiAoKihwK2kpICE9IDB4ZWYxMGVmMTApCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZWYxMGVmMTApOwoJCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQkgY2FzZSAyMDoKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjE6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIyOgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMzoKCQkJCQkJLy8gICAqKHAraSkgPSAweGRmMjBkZjIwOwoJCQkJCQkgICAgICBpZiAoKihwK2kpICE9IDB4ZGYyMGRmMjApCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZGYyMGRmMjApOwoJCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQkgY2FzZSAyNDoKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjU6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI2OgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNzoKCQkJCQkvLwkgICAqKHAraSkgPSAweGJmNDBiZjQwOwoJCQkJCQkgICAgICBpZiAoKihwK2kpICE9IDB4YmY0MGJmNDApCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4YmY0MGJmNDApOwoJCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkJCQkJCQl9CgkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJICAgY2FzZSAyODoKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjk6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMwOgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMToKCQkJCQkvLwkgICAqKHAraSkgPSAweDdmODA3ZjgwOwoJCQkJCQkgICAgICBpZiAoKihwK2kpICE9IDB4N2Y4MDdmODApCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4N2Y4MDdmODApOwoJCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCgkJCSAgIGRlZmF1bHQ6CgoJCQkJCQkvLyAgKihwK2kpID0gMHhmZjAwZmYwMDsKCQkJCQkJICAgICBpZiAoKihwK2kpICE9IDB4ZmYwMGZmMDApCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmYwMGZmMDApOwoJCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQkJYnJlYWs7CgoKCQkJCX0KCQkJfQoKICAgICAgICAgICAgaWYgKG1fbGVuID4gMTI4KjQpCgkJCXsKCQkJCW1fbGVuIC09IDEyOCo0OwoJCQkJcCArPSAzMio0OwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcCArPSAobV9sZW4+PjIpOwoJCQkJbV9sZW4gPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn0KCnN0YXRpYyB2b2lkIGRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX24odm9pZCAqYnVmZiwgIHVuc2lnbmVkIGludCAgbV9sZW5ndGgpCnsKCSB1bnNpZ25lZCBpbnQgICpwOwogLy8gICAgdW5zaWduZWQgaW50ICBpLCBqLCBuOwoJICB1bnNpZ25lZCBpbnQgIGksIG47CgkgdW5zaWduZWQgaW50ICBtX2xlbiA9IG1fbGVuZ3RoOwovLyNkZWZpbmUgZGRyX3BhdHRlcm5fbG9vcCAzMgoJcCA9ICggdW5zaWduZWQgaW50ICAqKWJ1ZmY7CgogICAgd2hpbGUgKG1fbGVuKQoJewoJICAvLyAgZm9yKGo9MDtqPDMyO2orKykKCQl7CiAgICAgICAgICAgIGlmIChtX2xlbiA+PSAxMjgqNCkKCQkJCW4gPSAzMio0OwoJCQllbHNlCgkJCQluID0gbV9sZW4+PjI7CgogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQoJCQl7CgkJCQkjaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJICAgZGRyX3BsZF9jYWNoZShwKSAgOwoJCSNlbmRpZgogICAgICAgICAgICAgICAgc3dpdGNoIChpKQoJCQkJewoJCQkJCWNhc2UgMDoKCQkJCQljYXNlIDE6CgkJCQkJY2FzZSAyOgoJCQkJCWNhc2UgMzoKCQkJCQljYXNlIDg6CgkJCQkJY2FzZSA5OgoJCQkJCWNhc2UgMTA6CgkJCQkJY2FzZSAxMToKCQkgICAgICBjYXNlIDE2OgoJCQkJCWNhc2UgMTc6CgkJCQkJY2FzZSAxODoKCQkJCQljYXNlIDE5OgoJCQkJCWNhc2UgMjQ6CgkJCQkJY2FzZSAyNToKCQkJCQljYXNlIDI2OgoJCQkJCWNhc2UgMjc6CgkJCQkgLy8gICBjYXNlIDMwOgoJCQkJCQkqKHAraSkgPSB+VERBVEEzMkY7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgNDoKCQkJCQljYXNlIDU6CgkJCQkJY2FzZSA2OgoJCQkJCWNhc2UgNzoKCQkJCQljYXNlIDEyOgoJCQkJCWNhc2UgMTM6CgkJCQkJY2FzZSAxNDoKCQkJCQljYXNlIDE1OgoJCSAgICAgIGNhc2UgMjA6CgkJCQkJY2FzZSAyMToKCQkJCQljYXNlIDIyOgoJCQkJCWNhc2UgMjM6CgkJICAgICAgY2FzZSAyODoKCQkJCQljYXNlIDI5OgoJCQkJCWNhc2UgMzA6CgkJCQkJY2FzZSAzMToKCQkJCSAvLyAgIGNhc2UgMjI6CgkJCQkJCSoocCtpKSA9IH4wOwoJCQkJCQlicmVhazsKCQkgICAgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSswOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSszOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMToKCQkgICAgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNzoKCQkJCSAvLyAgIGNhc2UgMzA6CgkJCQkJCSAgKihwK2kpID0gflREQVRBMzJBOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE1OgoJCSAgICAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIzOgoJCSAgICAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzMxOgoJCQkJKihwK2kpID1+VERBVEEzMjU7CgoKCQkJCQkJYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzA6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzM6CgkJCQkqKHAraSkgPX4weGZlMDFmZTAxOwoJCQkJICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNToKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNzoKCQkJCSoocCtpKSA9fjB4ZmQwMmZkMDI7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMis4OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMis5OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTE6CgkJCQkqKHAraSkgPX4weGZiMDRmYjA0OwoJCQkJICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTI6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEzOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTU6CgkJCQkqKHAraSkgPX4weGY3MDhmNzA4OwoJCQkJICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTY6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE3OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisxODoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTk6CgkJCQkqKHAraSkgPX4weGVmMTBlZjEwOwoJCQkJICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjA6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIxOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjM6CgkJCQkqKHAraSkgPX4weGRmMjBkZjIwOwoJCQkJICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjQ6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI1OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjc6CgkJCQkqKHAraSkgPX4weGJmNDBiZjQwOwoJCQkJICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjg6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI5OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMiszMDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzE6CgkJCQkqKHAraSkgPX4weDdmODA3ZjgwOwoJCQkJICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMToKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzoKCQkJCSoocCtpKSA9fjB4MDAwMDAxMDA7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMys0OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMys1OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMys2OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMys3OgoJCQkJKihwK2kpID1+MHgwMDAwMDIwMDsKCQkJCSAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzg6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzk6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEwOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMToKCQkJCSoocCtpKSA9fjB4MDAwMDA0MDA7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTM6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE0OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNToKCQkJCSoocCtpKSA9fjB4MDAwMDA4MDA7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTc6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE4OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOToKCQkJCSoocCtpKSA9fjB4MDAwMDEwMDA7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjE6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIyOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMzoKCQkJCSoocCtpKSA9fjB4MDAwMDIwMDA7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjU6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI2OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNzoKCQkJCSoocCtpKSA9fjB4MDAwMDQwMDA7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysyODoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjk6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzMwOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMToKCQkJCSoocCtpKSA9fjB4MDAwMDgwMDA7CgkJCQkgIGJyZWFrOwoKCgkJCQl9CgkJCX0KCiAgICAgICAgICAgIGlmIChtX2xlbiA+KCAxMjgqNCkpCgkJCXsKCQkJCW1fbGVuIC09KCAxMjgqNCk7CgkJCQlwICs9IDMyKjQ7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwICs9IChtX2xlbj4+Mik7CgkJCQltX2xlbiA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQoKCnN0YXRpYyB2b2lkIGRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX24yKHZvaWQgKmJ1ZmYsICB1bnNpZ25lZCBpbnQgIG1fbGVuZ3RoKQp7CgkgdW5zaWduZWQgaW50ICAqcDsKIC8vICAgIHVuc2lnbmVkIGludCAgaSwgaiwgbjsKCSAgdW5zaWduZWQgaW50ICBpLCBuOwoJIHVuc2lnbmVkIGludCAgbV9sZW4gPSBtX2xlbmd0aDsKLy8jZGVmaW5lIGRkcl9wYXR0ZXJuX2xvb3AgMzIKCXAgPSAoIHVuc2lnbmVkIGludCAgKilidWZmOwoKICAgIHdoaWxlIChtX2xlbikKCXsKCSAgLy8gIGZvcihqPTA7ajwzMjtqKyspCgkJewogICAgICAgICAgICBpZiAobV9sZW4gPj0gMTI4KjQpCgkJCQluID0gMzIqNDsKCQkJZWxzZQoJCQkJbiA9IG1fbGVuPj4yOwoKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKCQkJewoJI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCSAgIGRkcl9wbGRfY2FjaGUocCkgIDsKCQkjZW5kaWYKCiAgICAgICAgICAgICAgICBzd2l0Y2ggKGkpCgkJCQl7CgkJCQkJIGNhc2UgMDoKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMToKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjoKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzoKCQkJCQkJCSoocCtpKSA9IH4weGZlMDFmZTAxOwoJCQkJCQkJYnJlYWs7CgkJCQkJIGNhc2UgNDoKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNToKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNjoKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNzoKCQkJCQkJICAgKihwK2kpID0gfjB4ZmQwMmZkMDI7CgkJCQkJCQkJCSBicmVhazsKCgkJCQkJIGNhc2UgODoKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErOToKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTA6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzExOgoJCQkJCQkgICAqKHAraSkgPSB+MHhmYjA0ZmIwNDsKCQkJCQkJYnJlYWs7CgoJCQkJCSBjYXNlIDEyOgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMzoKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTQ6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE1OgoJCQkJCQkgICAqKHAraSkgPSB+MHhmNzA4ZjcwODsKCQkJCQkJYnJlYWs7CgoJCQkJCSBjYXNlIDE2OgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNzoKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTg6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE5OgoJCQkJCQkgICAqKHAraSkgPSB+MHhlZjEwZWYxMDsKCQkJCQkJYnJlYWs7CgoJCQkJCSBjYXNlIDIwOgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMToKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjI6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIzOgoJCQkJCQkgICAqKHAraSkgPSB+MHhkZjIwZGYyMDsKCQkJCQkJYnJlYWs7CgoJCQkJCSBjYXNlIDI0OgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNToKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjY6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI3OgoJCQkJCQkgICAqKHAraSkgPX4weGJmNDBiZjQwOwoJCQkJCQkJYnJlYWs7CgkJCQkJICAgY2FzZSAyODoKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjk6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMwOgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMToKCQkJCQkJICAgKihwK2kpID0gfjB4N2Y4MDdmODA7CgkJCQkJCWJyZWFrOwoKCgkJCSAgIGRlZmF1bHQ6CgoJCQkJCQkgICoocCtpKSA9IH4weGZmMDBmZjAwOwoJCQkJCQlicmVhazsKCgkJCQkJCWJyZWFrOwoKCgkJCQl9CgkJCX0KCiAgICAgICAgICAgIGlmIChtX2xlbiA+KCAxMjgqNCkpCgkJCXsKCQkJCW1fbGVuIC09KCAxMjgqNCk7CgkJCQlwICs9IDMyKjQ7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwICs9IChtX2xlbj4+Mik7CgkJCQltX2xlbiA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQoKc3RhdGljIHZvaWQgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKHZvaWQgKmJ1ZmYsICB1bnNpZ25lZCBpbnQgIG1fbGVuZ3RoKQp7CgkgdW5zaWduZWQgaW50ICAqcDsKICAvLyAgIHVuc2lnbmVkIGludCAgaSwgaiwgbjsKCSAgdW5zaWduZWQgaW50ICBpLCBuOwoJIHVuc2lnbmVkIGludCAgbV9sZW4gPSBtX2xlbmd0aDsKCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCiAgICB3aGlsZSAobV9sZW4pCgl7CgkgIC8vICBmb3Ioaj0wO2o8MzI7aisrKQoJCXsKICAgICAgICAgICAgaWYgKG1fbGVuID49IDEyOCo0KQoJCQkJbiA9IDMyKjQ7CgkJCWVsc2UKCQkJCW4gPSBtX2xlbj4+MjsKCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCgkJCXsKCQkJCSNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkgICBkZHJfcGxkX2NhY2hlKHApICA7CgkJI2VuZGlmCiAgICAgICAgICAgICAgIGlmICgoZXJyb3Jfb3V0b2ZfY291bnRfZmxhZykgJiYgKGVycm9yX2NvdW50KSkKCQkJCXsKCQkJCXByaW50ZigiRXJyb3IgZGF0YSBvdXQgb2YgY291bnQiKTsKCQkJCSBtX2xlbj0wOwoJCQkJICBicmVhazsKCQkJCX0KICAgICAgICAgICAgICAgIHN3aXRjaCAoaSkKCQkJCXsKCQkJCQkgY2FzZSAwOgoJCQkJCWNhc2UgMToKCQkJCQljYXNlIDI6CgkJCQkJY2FzZSAzOgoJCQkJCWNhc2UgODoKCQkJCQljYXNlIDk6CgkJCQkJY2FzZSAxMDoKCQkJCQljYXNlIDExOgoJCSAgICAgIGNhc2UgMTY6CgkJCQkJY2FzZSAxNzoKCQkJCQljYXNlIDE4OgoJCQkJCWNhc2UgMTk6CgkJCQkJY2FzZSAyNDoKCQkJCQljYXNlIDI1OgoJCQkJCWNhc2UgMjY6CgkJCQkJY2FzZSAyNzoKCQkJCSAvLyAgIGNhc2UgMzA6CgkJCQkgIC8vICAgICAgKihwK2kpID0gVERBVEEzMkY7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqKHAraSkgIT1+VERBVEEzMkYpCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH5UREFUQTMyRik7CgkJCQkJCWJyZWFrOwoJCQkJCQkJfQoJCQkJCQkgYnJlYWs7CgkJCQkJIGNhc2UgNDoKCQkJCQljYXNlIDU6CgkJCQkJY2FzZSA2OgoJCQkJCWNhc2UgNzoKCQkJCQljYXNlIDEyOgoJCQkJCWNhc2UgMTM6CgkJCQkJY2FzZSAxNDoKCQkJCQljYXNlIDE1OgoJCSAgICAgIGNhc2UgMjA6CgkJCQkJY2FzZSAyMToKCQkJCQljYXNlIDIyOgoJCQkJCWNhc2UgMjM6CgkJICAgICAgY2FzZSAyODoKCQkJCQljYXNlIDI5OgoJCQkJCWNhc2UgMzA6CgkJCQkJY2FzZSAzMToKCQkJCSAvLyAgIGNhc2UgMjI6CgkJCQkJIC8vICAgKihwK2kpID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCoocCtpKSAhPX4wKQoJCQkJICAge2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MCk7CgkJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzExOgoJCSAgICAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI3OgoJCQkJIC8vICAgY2FzZSAzMDoKCQkJCSAgLy8gICAgICAgICoocCtpKSA9IFREQVRBMzJBOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKihwK2kpICE9IH5UREFUQTMyQSkKCQkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSx+VERBVEEzMkEpOwoJCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSs0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE1OgoJCSAgICAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIzOgoJCSAgICAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzMxOgoJCQkvLwkqKHAraSkgPSBUREFUQTMyNTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCoocCtpKSAhPSB+VERBVEEzMjUpCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH5UREFUQTMyNSk7CgkJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMiswOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisxOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMiszOgoJCQkvLyAgIAkqKHAraSkgPTB4ZmUwMWZlMDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqKHAraSkgIT1+MHhmZTAxZmUwMSkKCQkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmUwMWZlMDEpOwoJCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis0OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMis1OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMis2OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMis3OgoJCQkgIC8vIAkqKHAraSkgPTB4ZmQwMmZkMDI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqKHAraSkgIT0gfjB4ZmQwMmZkMDIpCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZkMDJmZDAyKTsKCQkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMis4OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMis5OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTE6CgkJCSAgIC8vCSoocCtpKSA9MHhmYjA0ZmIwNDsKCQkJICAgICBpZiAoKihwK2kpICE9IH4weGZiMDRmYjA0KQoJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmIwNGZiMDQpOwoJCQkJCX0KCQkJCSAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEyOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMzoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTQ6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE1OgoJCQkgICAvLwkqKHAraSkgPTB4ZjdiMDhmNzA4OwoJCQkJICBpZiAoKihwK2kpICE9IH4weGY3MDhmNzA4KQoJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZjcwOGY3MDgpOwoJCQkJCX0KCQkJCSAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE2OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNzoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTg6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE5OgoJCQkgICAvLwkqKHAraSkgPTB4ZWYxMGVmMTA7CgkJCQkgIGlmICgqKHAraSkgIT0gfjB4ZWYxMGVmMTApCgkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhlZjEwZWYxMCk7CgkJCQkJfQoJCQkJICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjA6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIxOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjM6CgkJCSAgIC8vCSoocCtpKSA9MHhkZjIwZGYyMDsKCQkJCSAgaWYgKCoocCtpKSAhPSB+MHhkZjIwZGYyMCkKCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGRmMjBkZjIwKTsKCQkJCQl9CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjU6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI2OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNzoKCQkJIC8vICAJKihwK2kpID0weGJmNDBiZjQwOwoJCQkJICBpZiAoKihwK2kpICE9IH4weGJmNDBiZjQwKQoJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4YmY0MGJmNDApOwoJCQkJCX0KCQkJCSAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI4OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOToKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzA6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMxOgoJCQkvLyAgIAkqKHAraSkgPTB4N2Y4MDdmODA7CgkJCQkgIGlmICgqKHAraSkgIT0gfjB4N2Y4MDdmODApCgkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHg3ZjgwN2Y4MCk7CgkJCQkJfQoJCQkJICBicmVhazsKCQkJCSAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzA6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzM6CgkJCSAgIC8vCSoocCtpKSA9MHgwMDAwMDEwMDsKCQkJCQkgIGlmICgqKHAraSkgIT0gfjB4MDAwMDAxMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4MDAwMDAxMDApOwoJCQkJCQl9CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMys0OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMys1OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMys2OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMys3OgoJCQkgLy8gIAkqKHAraSkgPTB4MDAwMDAxMDA7CgkJCQkgIGlmICgqKHAraSkgIT0gfjB4MDAwMDAyMDApCgkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHgwMDAwMDIwMCk7CgkJCQkJfQoJCQkJICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrODoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrOToKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTA6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzExOgoJCQkgICAvLwkqKHAraSkgPTB4MDAwMDAxMDA7CgkJCQkgaWYgKCoocCtpKSAhPSB+MHgwMDAwMDQwMCkKCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weDAwMDAwNDAwKTsKCQkJCQl9CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTM6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE0OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNToKCQkJICAgLy8JKihwK2kpID0weDAwMDAwMTAwOwoJCQkJIGlmICgqKHAraSkgIT0gfjB4MDAwMDA4MDApCgkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHgwMDAwMDgwMCk7CgkJCQkJfQoJCQkJICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTY6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE3OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysxODoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTk6CgkJCSAgIC8vCSoocCtpKSA9MHhmZmZmZmVmZjsKCQkJCSBpZiAoKihwK2kpICE9IH4weDAwMDAxMDAwKQoJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4MDAwMDEwMDApOwoJCQkJCX0KCQkJCSAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIwOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMToKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjI6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIzOgoJCQkgIC8vIAkqKHAraSkgPTB4ZmZmZmZlZmY7CgkJCQkgaWYgKCoocCtpKSAhPSB+MHgwMDAwMjAwMCkKCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weDAwMDAyMDAwKTsKCQkJCQl9CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjU6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI2OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNzoKCQkJICAgLy8JKihwK2kpID0weGZmZmZmZWZmOwoJCQkJIGlmICgqKHAraSkgIT0gfjB4MDAwMDQwMDApCgkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHgwMDAwNDAwMCk7CgkJCQkJfQoJCQkJICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjg6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI5OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzE6CgkJCSAgIC8vCSoocCtpKSA9MHhmZmZmZmVmZjsKCQkJCSBpZiAoKihwK2kpICE9IH4weDAwMDA4MDAwKQoJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4MDAwMDgwMDApOwoJCQkJCX0KCQkJCSAgYnJlYWs7CgoKCgkJCQl9CgkJCX0KCiAgICAgICAgICAgIGlmIChtX2xlbiA+IDEyOCo0KQoJCQl7CgkJCQltX2xlbiAtPSAxMjgqNDsKCQkJCXAgKz0gMzIqNDsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXAgKz0gKG1fbGVuPj4yKTsKCQkJCW1fbGVuID0gMDsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQp9CgoKLy8qLwpzdGF0aWMgdm9pZCBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24yKHZvaWQgKmJ1ZmYsICB1bnNpZ25lZCBpbnQgIG1fbGVuZ3RoKQp7CgkgdW5zaWduZWQgaW50ICAqcDsKICAvLyAgIHVuc2lnbmVkIGludCAgaSwgaiwgbjsKCSAgdW5zaWduZWQgaW50ICBpLCBuOwoJIHVuc2lnbmVkIGludCAgbV9sZW4gPSBtX2xlbmd0aDsKCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCiAgICB3aGlsZSAobV9sZW4pCgl7CgkgIC8vICBmb3Ioaj0wO2o8MzI7aisrKQoJCXsKICAgICAgICAgICAgaWYgKG1fbGVuID49IDEyOCo0KQoJCQkJbiA9IDMyKjQ7CgkJCWVsc2UKCQkJCW4gPSBtX2xlbj4+MjsKCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCgkJCXsKCQkJCSNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkgICBkZHJfcGxkX2NhY2hlKHApICA7CgkJI2VuZGlmCiAgICAgICAgICAgIGlmICgoZXJyb3Jfb3V0b2ZfY291bnRfZmxhZykgJiYgKGVycm9yX2NvdW50KSkKCQkJCXsKCQkJCXByaW50ZigiRXJyb3IgZGF0YSBvdXQgb2YgY291bnQiKTsKCQkJCSBtX2xlbj0wOwoJCQkJIGJyZWFrOwoJCQkJfQoKICAgICAgICAgICAgICAgIHN3aXRjaCAoaSkKCQkJCXsKCQkJCQkgY2FzZSAwOgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxOgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszOgoJCQkJCQkJLy8gICAqKHAraSkgPSAweGZlMDFmZTAxOwoJCQkJCQkJICAgaWYgKCoocCtpKSAhPSB+MHhmZTAxZmUwMSkKCQkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmUwMWZlMDEpOwoJCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkJCQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQkgY2FzZSA0OgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs1OgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis2OgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys3OgoJCQkJCS8vCSAgICoocCtpKSA9IDB4ZmQwMmZkMDI7CgkJCQkJCSAgICAgIGlmICgqKHAraSkgIT0gfjB4ZmQwMmZkMDIpCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZkMDJmZDAyKTsKCQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJCQkJCQkJfQoJCQkJCQkJCQkgYnJlYWs7CgoJCQkJCSBjYXNlIDg6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzk6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEwOgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMToKCQkJCQkJLy8gICAqKHAraSkgPSAweGZiMDRmYjA0OwoJCQkJCQkgICAgICBpZiAoKihwK2kpICE9IH4weGZiMDRmYjA0KQoJCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmYjA0ZmIwNCk7CgkJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCQkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCSBjYXNlIDEyOgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMzoKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTQ6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE1OgoJCQkJCS8vCSAgICoocCtpKSA9IDB4ZjcwOGY3MDg7CgkJCQkJCSAgICAgIGlmICgqKHAraSkgIT0gfjB4ZjcwOGY3MDgpCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGY3MDhmNzA4KTsKCQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJIGNhc2UgMTY6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE3OgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxODoKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTk6CgkJCQkJLy8JICAgKihwK2kpID0gMHhlZjEwZWYxMDsKCQkJCQkJICAgICAgaWYgKCoocCtpKSAhPSB+MHhlZjEwZWYxMCkKCQkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZWYxMGVmMTApOwoJCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQkgY2FzZSAyMDoKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjE6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIyOgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMzoKCQkJCQkJLy8gICAqKHAraSkgPSAweGRmMjBkZjIwOwoJCQkJCQkgICAgICBpZiAoKihwK2kpICE9IH4weGRmMjBkZjIwKQoJCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhkZjIwZGYyMCk7CgkJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCQkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCSBjYXNlIDI0OgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNToKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjY6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI3OgoJCQkJCS8vCSAgICoocCtpKSA9IDB4YmY0MGJmNDA7CgkJCQkJCSAgICAgIGlmICgqKHAraSkgIT0gfjB4YmY0MGJmNDApCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGJmNDBiZjQwKTsKCQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJCQkJCQkJfQoJCQkJCQkJYnJlYWs7CgkJCQkJICAgY2FzZSAyODoKCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjk6CgkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMwOgoJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMToKCQkJCQkvLwkgICAqKHAraSkgPSAweDdmODA3ZjgwOwoJCQkJCQkgICAgICBpZiAoKihwK2kpICE9IH4weDdmODA3ZjgwKQoJCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHg3ZjgwN2Y4MCk7CgkJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCQkJCQkJCX0KCQkJCQkJYnJlYWs7CgoKCQkJICAgZGVmYXVsdDoKCgkJCQkJCS8vICAqKHAraSkgPSAweGZmMDBmZjAwOwoJCQkJCQkgICAgIGlmICgqKHAraSkgIT0gfjB4ZmYwMGZmMDApCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZmMDBmZjAwKTsKCQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJCWJyZWFrOwoKCgkJCQl9CgkJCX0KCiAgICAgICAgICAgIGlmIChtX2xlbiA+IDEyOCo0KQoJCQl7CgkJCQltX2xlbiAtPSAxMjgqNDsKCQkJCXAgKz0gMzIqNDsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXAgKz0gKG1fbGVuPj4yKTsKCQkJCW1fbGVuID0gMDsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQp9CgpzdGF0aWMgdm9pZCBkZHJfd3JpdGVfcGF0dGVybjRfbm9fY3Jvc3NfdGFsayh2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKewoJIHVuc2lnbmVkIGludCAgKnA7CiAvLyAgICB1bnNpZ25lZCBpbnQgIGksIGosIG47CgkgIHVuc2lnbmVkIGludCAgaSwgbjsKCSB1bnNpZ25lZCBpbnQgIG1fbGVuID0gbV9sZW5ndGg7Ci8vI2RlZmluZSBkZHJfcGF0dGVybl9sb29wIDMyCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCiAgICB3aGlsZSAobV9sZW4pCgl7CgkgIC8vICBmb3Ioaj0wO2o8MzI7aisrKQoJCXsKICAgICAgICAgICAgaWYgKG1fbGVuID49IDEyOCo0KQoJCQkJbiA9IDMyKjQ7CgkJCWVsc2UKCQkJCW4gPSBtX2xlbj4+MjsKCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCgkJCXsKCQkJCSNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkgICBkZHJfcGxkX2NhY2hlKHApICA7CgkJI2VuZGlmCiAgICAgICAgICAgICAgICBzd2l0Y2ggKGkpCgkJCQl7CgkJCQkJY2FzZSAwOgoJCQkJCWNhc2UgMToKCQkJCQljYXNlIDI6CgkJCQkJY2FzZSAzOgoJCQkJICoocCtpKSA9IDB4ZmYwMGZmMDA7CgkJCQkgICAgIGJyZWFrOwoJCSAgICAgIGNhc2UgNDoKCQkJCQljYXNlIDU6CgkJCQkJY2FzZSA2OgoJCQkJCWNhc2UgNzoKCQkJCSAqKHAraSkgPSAweGZmZmYwMDAwOwoJCQkJICAgICBicmVhazsKCgkJCQkJY2FzZSA4OgoJCQkJCWNhc2UgOToKCQkJCQljYXNlIDEwOgoJCQkJCWNhc2UgMTE6CgkJCQkgKihwK2kpID0gMHhmZjAwMDAwMDsKCQkJCSAgICAgYnJlYWs7CgkJICAgICAgY2FzZSAxMjoKCQkJCQljYXNlIDEzOgoJCQkJCWNhc2UgMTQ6CgkJCQkJY2FzZSAxNToKCQkJCSAqKHAraSkgPSAweGZmMDBmZmZmOwoJCQkJICAgICBicmVhazsKCgkJICAgICAgY2FzZSAxNjoKCQkJCQljYXNlIDE3OgoJCQkJCWNhc2UgMTg6CgkJCQkJY2FzZSAxOToKCQkJCSAqKHAraSkgPSAweGZmMDBmZmZmOwoJCQkJICAgICBicmVhazsKCQkgICAgICBjYXNlIDIwOgoJCQkJCWNhc2UgMjE6CgkJCQkJY2FzZSAyMjoKCQkJCQljYXNlIDIzOgoJCQkJICAqKHAraSkgPSAweGZmMDAwMGZmOwoJCQkJCQkgICBicmVhazsKCQkJCQljYXNlIDI0OgoJCQkJCWNhc2UgMjU6CgkJCQkJY2FzZSAyNjoKCQkJCQljYXNlIDI3OgoJCQkJICAqKHAraSkgPSAweGZmZmYwMDAwOwoJCQkJCSAgIGJyZWFrOwoKCQkgICAgICBjYXNlIDI4OgoJCQkJCWNhc2UgMjk6CgkJCQkJY2FzZSAzMDoKCQkJCQljYXNlIDMxOgoJCQkJCQkJCSAqKHAraSkgPSAweDAwZmYwMGZmOwoJCQkJCQkgICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMToKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzoKCQkJCSoocCtpKSA9fjB4ZmYwMGZmMDA7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSs0OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSs1OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSs2OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSs3OgoJCQkJKihwK2kpID1+MHhmZmZmMDAwMDsKCQkJCSAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzg6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzk6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEwOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMToKCQkJCSoocCtpKSA9fjB4ZmYwMDAwMDA7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTM6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE0OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNToKCQkJCSoocCtpKSA9fjB4ZmYwMGZmZmY7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTc6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE4OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxOToKCQkJCSoocCtpKSA9fjB4ZmYwMGZmZmY7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjE6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIyOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMzoKCQkJCSoocCtpKSA9fjB4ZmYwMGZmZmY7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjU6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI2OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNzoKCQkJCSoocCtpKSA9fjB4ZmZmZjAwMDA7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyODoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjk6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzMwOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSszMToKCQkJCSoocCtpKSA9fjB4MDBmZjAwZmY7CgkJCQkgIGJyZWFrOwoKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMToKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzoKCQkJCSoocCtpKSA9MHgwMGZmMDAwMDsKCQkJCSAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzQ6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzU6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzY6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzc6CgkJCQkqKHAraSkgPTB4ZmYwMDAwMDA7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMis4OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMis5OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTE6CgkJCQkqKHAraSkgPTB4MDAwMGZmZmY7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTM6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE0OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNToKCQkJCSoocCtpKSA9MHgwMDAwMDBmZjsKCQkJCSAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE2OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNzoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTg6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE5OgoJCQkJKihwK2kpID0weDAwZmYwMGZmOwoJCQkJICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjA6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIxOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjM6CgkJCQkqKHAraSkgPTB4ZmYwMGZmMDA7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjU6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI2OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNzoKCQkJCSoocCtpKSA9MHhmZjAwZmZmZjsKCQkJCSAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI4OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOToKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzA6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMxOgoJCQkJKihwK2kpID0weGZmMDBmZjAwOwoJCQkJICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMToKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzoKCQkJCSoocCtpKSA9fjB4MDBmZjAwMDA7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMys0OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMys1OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMys2OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMys3OgoJCQkJKihwK2kpID1+MHhmZjAwMDAwMDsKCQkJCSAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzg6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzk6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEwOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMToKCQkJCSoocCtpKSA9fjB4MDAwMGZmZmY7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTM6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE0OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNToKCQkJCSoocCtpKSA9fjB4MDAwMDAwZmY7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTc6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE4OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOToKCQkJCSoocCtpKSA9fjB4MDBmZjAwZmY7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjE6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIyOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMzoKCQkJCSoocCtpKSA9fjB4ZmYwMGZmMDA7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjU6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI2OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNzoKCQkJCSoocCtpKSA9fjB4ZmYwMGZmZmY7CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysyODoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjk6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzMwOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMToKCQkJCSoocCtpKSA9fjB4ZmYwMGZmMDA7CgkJCQkgIGJyZWFrOwoKCgkJCQl9CgkJCX0KCiAgICAgICAgICAgIGlmIChtX2xlbiA+KCAxMjgqNCkpCgkJCXsKCQkJCW1fbGVuIC09KCAxMjgqNCk7CgkJCQlwICs9IDMyKjQ7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwICs9IChtX2xlbj4+Mik7CgkJCQltX2xlbiA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQoKc3RhdGljIHZvaWQgZGRyX3JlYWRfcGF0dGVybjRfbm9fY3Jvc3NfdGFsayh2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKewoJIHVuc2lnbmVkIGludCAgKnA7CiAgLy8gICB1bnNpZ25lZCBpbnQgIGksIGosIG47CgkgIHVuc2lnbmVkIGludCAgaSwgbjsKCSB1bnNpZ25lZCBpbnQgIG1fbGVuID0gbV9sZW5ndGg7CgoJcCA9ICggdW5zaWduZWQgaW50ICAqKWJ1ZmY7CiAgd2hpbGUgKG1fbGVuKQoJewoJICAvLyAgZm9yKGo9MDtqPDMyO2orKykKCQl7CiAgICAgICAgICAgIGlmIChtX2xlbiA+PSAxMjgqNCkKCQkJCW4gPSAzMio0OwoJCQllbHNlCgkJCQluID0gbV9sZW4+PjI7CgogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQoJCQl7CgkJCQkjaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJICAgZGRyX3BsZF9jYWNoZShwKSAgOwoJCSNlbmRpZgogICAgICAgICAgICAgICBpZiAoKGVycm9yX291dG9mX2NvdW50X2ZsYWcpICYmIChlcnJvcl9jb3VudCkpCgkJCQl7CgkJCQlwcmludGYoIkVycm9yIGRhdGEgb3V0IG9mIGNvdW50Iik7CgkJCQkgbV9sZW49MDsKCQkJCSAgYnJlYWs7CgkJCQl9CiAgICAgICAgICAgICAgICBzd2l0Y2ggKGkpCgkJCQl7CgkJCQkJY2FzZSAwOgoJCQkJCWNhc2UgMToKCQkJCQljYXNlIDI6CgkJCQkJY2FzZSAzOgoJCQkJCS8vCSAgaWYoKihwK2kpICE9flREQVRBMzJGKQoKCQkJCWlmICggKihwK2kpICE9IDB4ZmYwMGZmMDApCgkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZjAwZmYwMCk7CgkJCQkJfQoJCQkJCQkJCQlicmVhazsKCQkgICAgICBjYXNlIDQ6CgkJCQkJY2FzZSA1OgoJCQkJCWNhc2UgNjoKCQkJCQljYXNlIDc6CgkJCQkJCWlmICggKihwK2kpICE9IDB4ZmZmZjAwMDApCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmZmZjAwMDApOwoJCQkJCQkJfQoJCQkJICAgICBicmVhazsKCgkJCQkJY2FzZSA4OgoJCQkJCWNhc2UgOToKCQkJCQljYXNlIDEwOgoJCQkJCWNhc2UgMTE6CgkJCQkvLyAqKHAraSkgPSAweGZmMDAwMDAwOwoJCQkJIGlmICggKihwK2kpICE9IDB4ZmYwMDAwMDApCgkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGZmMDAwMDAwKTsKCQkJCQl9CgkJCQkgICAgIGJyZWFrOwoJCSAgICAgIGNhc2UgMTI6CgkJCQkJY2FzZSAxMzoKCQkJCQljYXNlIDE0OgoJCQkJCWNhc2UgMTU6CgkJCQkvLyAqKHAraSkgPSAweGZmMDBmZmZmOwoJCQkJIGlmICggKihwK2kpICE9IDB4ZmYwMGZmZmYpCgkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGZmMDBmZmZmKTsKCQkJCQl9CgkJCQkgICAgIGJyZWFrOwoKCQkgICAgICBjYXNlIDE2OgoJCQkJCWNhc2UgMTc6CgkJCQkJY2FzZSAxODoKCQkJCQljYXNlIDE5OgoJCQkvLwkgKihwK2kpID0gMHhmZjAwZmZmZjsKCQkJCSBpZiAoICoocCtpKSAhPSAweGZmMDBmZmZmKQoJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZjAwZmZmZik7CgkJCQkJfQoJCQkJICAgICBicmVhazsKCQkgICAgICBjYXNlIDIwOgoJCQkJCWNhc2UgMjE6CgkJCQkJY2FzZSAyMjoKCQkJCQljYXNlIDIzOgoJCQkJLy8gICoocCtpKSA9IDB4ZmYwMDAwZmY7CgkJCQkgIGlmICggKihwK2kpICE9IDB4ZmYwMDAwZmYpCgkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGZmMDAwMGZmKTsKCQkJCQl9CgkJCQkJCSAgIGJyZWFrOwoJCQkJCWNhc2UgMjQ6CgkJCQkJY2FzZSAyNToKCQkJCQljYXNlIDI2OgoJCQkJCWNhc2UgMjc6CgkJCQkvLyAgKihwK2kpID0gMHhmZmZmMDAwMDsKCQkJCSAgaWYgKCAqKHAraSkgIT0gMHhmZmZmMDAwMCkKCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmZmZjAwMDApOwoJCQkJCX0KCQkJCQkgICBicmVhazsKCgkJICAgICAgY2FzZSAyODoKCQkJCQljYXNlIDI5OgoJCQkJCWNhc2UgMzA6CgkJCQkJY2FzZSAzMToKCQkJCQkJCSAgIC8vICAqKHAraSkgPSAweDAwZmYwMGZmOwoJCQkJCQkJCSBpZiAoICoocCtpKSAhPSAweDAwZmYwMGZmKQoJCQkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4MDBmZjAwZmYpOwoJCQkJCQkJCQl9CgkJCQkJCSAgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSswOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSszOgoJCQkgLy8gIAkqKHAraSkgPX4weGZmMDBmZjAwOwoJCQkJaWYgKCAqKHAraSkgIT0gfjB4ZmYwMGZmMDApCgkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmZjAwZmYwMCk7CgkJCQkJfQoJCQkJICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNToKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNzoKCQkJICAvLyAJKihwK2kpID1+MHhmZmZmMDAwMDsKCQkJCWlmICggKihwK2kpICE9IH4weGZmZmYwMDAwKQoJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmZmZjAwMDApOwoJCQkJCX0KCQkJCSAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzg6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzk6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEwOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMToKCQkJICAvLyAJKihwK2kpID1+MHhmZjAwMDAwMDsKCQkJCWlmICggKihwK2kpICE9IH4weGZmMDAwMDAwKQoJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmYwMDAwMDApOwoJCQkJCX0KCQkJCSAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEyOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMzoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTQ6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE1OgoJCQkgICAvLwkqKHAraSkgPX4weGZmMDBmZmZmOwoJCQkJaWYgKCAqKHAraSkgIT0gfjB4ZmYwMGZmZmYpCgkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmZjAwZmZmZik7CgkJCQkJfQoJCQkJICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTY6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE3OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxODoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTk6CgkJCSAgIC8vCSoocCtpKSA9fjB4ZmYwMGZmZmY7CgkJCQlpZiAoICoocCtpKSAhPSB+MHhmZjAwZmZmZikKCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZmMDBmZmZmKTsKCQkJCQl9CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjE6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIyOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMzoKCQkJICAgLy8JKihwK2kpID1+MHhmZjAwZmZmZjsKCQkJCWlmICggKihwK2kpICE9IH4weGZmMDBmZmZmKQoJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmYwMGZmZmYpOwoJCQkJCX0KCQkJCSAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI0OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNToKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjY6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI3OgoJCQkgICAvLwkqKHAraSkgPX4weGZmZmYwMDAwOwoJCQkJaWYgKCAqKHAraSkgIT0gfjB4ZmZmZjAwMDApCgkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmZmZmMDAwMCk7CgkJCQkJfQoJCQkJICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjg6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI5OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMSszMDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzE6CgkJCSAvLyAgCSoocCtpKSA9fjB4MDBmZjAwZmY7CgkJCQlpZiAoICoocCtpKSAhPSB+MHgwMGZmMDBmZikKCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weDAwZmYwMGZmKTsKCQkJCQl9CgkJCQkgIGJyZWFrOwoKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMToKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzoKCQkJIC8vICAJKihwK2kpID0weDAwZmYwMDAwOwoJCQkJaWYgKCAqKHAraSkgIT0gMHgwMGZmMDAwMCkKCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4MDBmZjAwMDApOwoJCQkJCX0KCQkJCSAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzQ6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzU6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzY6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzc6CgkJCS8vICAgCSoocCtpKSA9MHhmZjAwMDAwMDsKCQkJCWlmICggKihwK2kpICE9IDB4ZmYwMDAwMDApCgkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGZmMDAwMDAwKTsKCQkJCQl9CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMis4OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMis5OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTE6CgkJCSAgLy8gCSoocCtpKSA9MHgwMDAwZmZmZjsKCQkJCWlmICggKihwK2kpICE9IDB4MDAwMGZmZmYpCgkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweDAwMDBmZmZmKTsKCQkJCQl9CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTM6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE0OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNToKCQkJLy8gICAJKihwK2kpID0weDAwMDAwMGZmOwoJCQkJaWYgKCAqKHAraSkgIT0gMHgwMDAwMDBmZikKCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4MDAwMDAwZmYpOwoJCQkJCX0KCQkJCSAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE2OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNzoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTg6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE5OgoJCQkvLyAgIAkqKHAraSkgPTB4MDBmZjAwZmY7CgkJCQlpZiAoICoocCtpKSAhPSAweDAwZmYwMGZmKQoJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHgwMGZmMDBmZik7CgkJCQkJfQoJCQkJICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjA6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIxOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjM6CgkJCSAgIC8vCSoocCtpKSA9MHhmZjAwZmYwMDsKCQkJCWlmICggKihwK2kpICE9IDB4ZmYwMGZmMDApCgkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGZmMDBmZjAwKTsKCQkJCQl9CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjU6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI2OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNzoKCQkJLy8gICAJKihwK2kpID0weGZmMDBmZmZmOwoJCQkJaWYgKCAqKHAraSkgIT0gMHhmZjAwZmZmZikKCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmYwMGZmZmYpOwoJCQkJCX0KCQkJCSAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI4OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOToKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzA6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMxOgoJCS8vCSAgIAkqKHAraSkgPTB4ZmYwMGZmMDA7CgkJCQlpZiAoICoocCtpKSAhPSAweGZmMDBmZjAwKQoJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZjAwZmYwMCk7CgkJCQkJfQoJCQkJICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMToKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzoKCQkJICAgLy8JKihwK2kpID1+MHgwMGZmMDAwMDsKCQkJCWlmICggKihwK2kpICE9IH4weDAwZmYwMDAwKQoJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4MDBmZjAwMDApOwoJCQkJCX0KCQkJCSAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzQ6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzU6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzY6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzc6CgkJCS8vICAgCSoocCtpKSA9fjB4ZmYwMDAwMDA7CgkJCQlpZiAoICoocCtpKSAhPSB+MHhmZjAwMDAwMCkKCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZmMDAwMDAwKTsKCQkJCQl9CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMys4OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMys5OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTE6CgkJCSAvLyAgCSoocCtpKSA9fjB4MDAwMGZmZmY7CgkJCQlpZiAoICoocCtpKSAhPSB+MHgwMDAwZmZmZikKCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weDAwMDBmZmZmKTsKCQkJCQl9CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTM6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE0OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNToKCQkJLy8gICAJKihwK2kpID1+MHgwMDAwMDBmZjsKCQkJCWlmICggKihwK2kpICE9IH4weDAwMDAwMGZmKQoJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4MDAwMDAwZmYpOwoJCQkJCX0KCQkJCSAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE2OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNzoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTg6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE5OgoJCQkvLyAgIAkqKHAraSkgPX4weDAwZmYwMGZmOwoJCQkJaWYgKCAqKHAraSkgIT0gfjB4MDBmZjAwZmYpCgkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHgwMGZmMDBmZik7CgkJCQkJfQoJCQkJICBicmVhazsKCQkJICAgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjA6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIxOgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMjoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjM6CgkJCSAgIC8vCSoocCtpKSA9fjB4ZmYwMGZmMDA7CgkJCQlpZiAoICoocCtpKSAhPSB+MHhmZjAwZmYwMCkKCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZmMDBmZjAwKTsKCQkJCQl9CgkJCQkgIGJyZWFrOwoJCQkgICBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNDoKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjU6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI2OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNzoKCQkJIC8vICAJKihwK2kpID1+MHhmZjAwZmZmZjsKCQkJCWlmICggKihwK2kpICE9IH4weGZmMDBmZmZmKQoJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmYwMGZmZmYpOwoJCQkJCX0KCQkJCSAgYnJlYWs7CgkJCSAgIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI4OgoJCSBjYXNlIEREUl9QQVRURVJOX0xPT1BfMysyOToKCQkgY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzA6CgkJIGNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzMxOgoJCQkvLyAgIAkqKHAraSkgPX4weGZmMDBmZjAwOwoJCQkJaWYgKCAqKHAraSkgIT0gfjB4ZmYwMGZmMDApCgkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmZjAwZmYwMCk7CgkJCQkJfQoJCQkJICBicmVhazsKCgoJCQkJfQoJCQl9CgogICAgICAgICAgICBpZiAobV9sZW4gPiggMTI4KjQpKQoJCQl7CgkJCQltX2xlbiAtPSggMTI4KjQpOwoJCQkJcCArPSAzMio0OwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcCArPSAobV9sZW4+PjIpOwoJCQkJbV9sZW4gPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn0KCgoKaW50IGRvX2Rkcl90ZXN0KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJY2hhciAqZW5kcDsKCSB1bnNpZ25lZCBpbnQgICBsb29wID0gMTsKCSB1bnNpZ25lZCBpbnQgICBsZmxhZyA9IDA7CgkgdW5zaWduZWQgaW50ICBzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUjsKCSAgICAgIHVuc2lnbmVkIGludCAgdGVzdF9zaXplID0gRERSX1RFU1RfU0laRTsKCSAgdW5zaWduZWQgaW50ICAgc2ltcGxlX3BhdHRlcm5fZmxhZyA9IDE7CgkgICAgIHVuc2lnbmVkIGludCAgIGNyb3NzX3RhbGtfcGF0dGVybl9mbGFnID0gMTsKCQkgIHVuc2lnbmVkIGludCAgIG9sZF9wYXR0ZXJuX2ZsYWcgPSAxOwoKCQkgIHVuc2lnbmVkIGludCAgIHByaW50X2ZsYWcgPSAxOwoJLy8JICBjb3B5X3Rlc3RfZmxhZyA9IDA7CgkJICBwcmludF9mbGFnID0gMTsKCQkgICBlcnJvcl9vdXRvZl9jb3VudF9mbGFnID0wOwoJCSBlcnJvcl9jb3VudCA9MDsKCQkgICBwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CgkJCWludCBpIDsKCWZvciAoaSA9IDA7aTxhcmdjO2krKykKCQl7CgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7CgkJfQogICAgaWYgKCFhcmdjKQoJCWdvdG8gRERSX1RFU1RfU1RBUlQ7CmlmIChhcmdjID4gMSkgewogICAgaWYgKHN0cmNtcChhcmd2WzFdLCAibCIpID09IDApIHsKCQlsZmxhZyA9IDE7Cgl9CgllbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImgiKSA9PSAwKXsKCQlnb3RvIHVzYWdlOwoJfQoJZWxzZXsKCQlsb29wID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgJmVuZHAsIDEwKTsKICAgICAgICBpZiAoKmFyZ3ZbMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlsb29wID0gMTsKCX0KfQoJCS8vICAgIHByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CgkJICAgIGlmIChhcmdjID09MSkgewoJLy8gICAgc3RhcnRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sICZlbmRwLCAxNik7CgkvLyAgICBpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUjsKCSAgbG9vcCA9IDE7CgoJfQogICAgaWYgKGFyZ2MgPiAyKSB7CgkJc3RhcnRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sICZlbmRwLCAxNik7CiAgICAgICAgaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJc3RhcnRfYWRkciA9IEREUl9URVNUX1NUQVJUX0FERFI7CgoJfQoJICAgIGlmIChhcmdjID4gMykgewoJICAgdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgJmVuZHAsIDE2KTsKICAgICAgICBpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl0ZXN0X3NpemUgPSBERFJfVEVTVF9TSVpFOwoKCX0KCQlpZiAodGVzdF9zaXplPDB4MTAwMCkKCQkJdGVzdF9zaXplID0gRERSX1RFU1RfU0laRTsKCglvbGRfcGF0dGVybl9mbGFnID0gMTsKCSAgc2ltcGxlX3BhdHRlcm5fZmxhZyA9IDE7CgkgICAgY3Jvc3NfdGFsa19wYXR0ZXJuX2ZsYWcgPSAxOwovL3ByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CiBpZiAoYXJnYyA9PTIpIHsKICAgIGlmICggKHN0cmNtcChhcmd2WzFdLCAicyIpID09IDApKQoJCXsKCQlzaW1wbGVfcGF0dGVybl9mbGFnID0gMTsKCQlvbGRfcGF0dGVybl9mbGFnPTA7CgkJIGNyb3NzX3RhbGtfcGF0dGVybl9mbGFnID0gMDsKCX0KIGVsc2UgaWYgKChzdHJjbXAoYXJndlsxXSwgImMiKSA9PSAwKSkKCQl7CgkgICBzaW1wbGVfcGF0dGVybl9mbGFnID0gMDsKCQlvbGRfcGF0dGVybl9mbGFnPTA7CgkJIGNyb3NzX3RhbGtfcGF0dGVybl9mbGFnID0gMTsKCX0KZWxzZSAgaWYgKCAoc3RyY21wKGFyZ3ZbMV0sICJlIikgPT0gMCkpCgl7CgllcnJvcl9vdXRvZl9jb3VudF9mbGFnPTE7Cgl9Cgl9CiBpZiAoYXJnYyA+MikgewoJaWYgKCAoc3RyY21wKGFyZ3ZbMV0sICJuIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAibiIpID09IDApKQoJCXsKCQlwcmludF9mbGFnID0gMDsKCQl9CgkJaWYgKCAoc3RyY21wKGFyZ3ZbMV0sICJwIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAicCIpID09IDApKQoJCXsKCQljb3B5X3Rlc3RfZmxhZyA9IDE7CgkJfQogICAgaWYgKCAoc3RyY21wKGFyZ3ZbMV0sICJzIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAicyIpID09IDApKQoJCXsKCQlzaW1wbGVfcGF0dGVybl9mbGFnID0gMTsKCQlvbGRfcGF0dGVybl9mbGFnPTA7CgkJIGNyb3NzX3RhbGtfcGF0dGVybl9mbGFnID0gMDsKCX0KIGVsc2UgaWYgKChzdHJjbXAoYXJndlsxXSwgImMiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzJdLCAiYyIpID09IDApKQoJCXsKCSAgIHNpbXBsZV9wYXR0ZXJuX2ZsYWcgPSAwOwoJCW9sZF9wYXR0ZXJuX2ZsYWc9MDsKCQkgY3Jvc3NfdGFsa19wYXR0ZXJuX2ZsYWcgPSAxOwoJfQplbHNlICBpZiAoIChzdHJjbXAoYXJndlsxXSwgImUiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzJdLCAiZSIpID09IDApKQoJewoJZXJyb3Jfb3V0b2ZfY291bnRfZmxhZz0xOwoJfQoJfQovL3ByaW50ZigiXG5MSU5FMT09IDB4JTA4eFxuIiwgX19MSU5FX18pOwoJCSBpZiAoYXJnYyA+IDMpIHsKCQkJCQlpZiAoIChzdHJjbXAoYXJndlsxXSwgInAiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJwIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzNdLCAicCIpID09IDApKQoJCXsKCQljb3B5X3Rlc3RfZmxhZyA9IDE7CgkJfQoJCQlpZiAoIChzdHJjbXAoYXJndlsxXSwgIm4iKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJuIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzNdLCAibiIpID09IDApKQoJCXsKCQlwcmludF9mbGFnID0gMDsKCQl9CiAgICBpZiAoIChzdHJjbXAoYXJndlsxXSwgInMiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJzIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzNdLCAicyIpID09IDApKQoJCXsKCQlzaW1wbGVfcGF0dGVybl9mbGFnID0gMTsKCQlvbGRfcGF0dGVybl9mbGFnPTA7CgkJIGNyb3NzX3RhbGtfcGF0dGVybl9mbGFnID0gMDsKCX0KICBpZiAoKHN0cmNtcChhcmd2WzFdLCAiYyIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImMiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbM10sICJjIikgPT0gMCkpCgkJewoJICAgc2ltcGxlX3BhdHRlcm5fZmxhZyA9IDA7CgkJb2xkX3BhdHRlcm5fZmxhZz0wOwoJCSBjcm9zc190YWxrX3BhdHRlcm5fZmxhZyA9IDE7Cgl9CiAgaWYgKCAoc3RyY21wKGFyZ3ZbMV0sICJlIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiZSIpID09IDApIHx8IChzdHJjbXAoYXJndlszXSwgImUiKSA9PSAwKSkKCXsKCWVycm9yX291dG9mX2NvdW50X2ZsYWc9MTsKCX0KCQkJfQoKCQkvLyAgICBwcmludGYoIlxuTElORTI9PSAweCUwOHhcbiIsIF9fTElORV9fKTsKCQkvLwlwcmludGYoIlxuTElORTM9PSAweCUwOHhcbiIsIF9fTElORV9fKTsKCQkvLwlwcmludGYoIlxuTElORT09IDB4JTA4eFxuIiwgX19MSU5FX18pOwoKRERSX1RFU1RfU1RBUlQ6CgovLy8qCglkbyB7CiAgICAgICAgaWYgKGxmbGFnKQoJCQlsb29wID0gODg4OwoKCQlpZiAob2xkX3BhdHRlcm5fZmxhZyA9PSAxKQoJCQl7CgkJCXsKCQkvLwlwcmludGYoIlxuTElORT09IDB4JTA4eFxuIiwgX19MSU5FX18pOwovL3ByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7Ci8vcHJpbnRmKCJcbkxJTkU9PSAweCUwOHhcbiIsIF9fTElORV9fKTsKaWYgKHByaW50X2ZsYWcpCgkJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJLy8JIGZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwoJaWYgKHByaW50X2ZsYWcpIHsKCSAgICBwcmludGYoIlxuRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgIHByaW50ZigiXG5TdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJfQoJICAgIGRkcl9yZWFkKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkgICAgcHJpbnRmKCJcbkVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgICBwcmludGYoIlxuU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCSAgICBkZHJfcmVhZCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJICAgIHByaW50ZigiXG5FbmQgMm5kIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICAgcHJpbnRmKCJcblN0YXJ0IDNyZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkgICAgZGRyX3JlYWQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJaWYgKHByaW50X2ZsYWcpCgkgICAgcHJpbnRmKCJcbkVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKaWYgKGNvcHlfdGVzdF9mbGFnKQp7aWYocHJpbnRfZmxhZykKCSAgICBwcmludGYoIlxuIGNvcHlfdGVzdF9mbGFnID0gMSxzdGFydCBjb3B5IHRlc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKIGRkcl90ZXN0X2NvcHkoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK3Rlc3Rfc2l6ZS8yKSksKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZS8yICk7CiAgZGRyX3JlYWQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK3Rlc3Rfc2l6ZS8yKSksIHRlc3Rfc2l6ZS8yKTsKICAgZGRyX3JlYWQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK3Rlc3Rfc2l6ZS8yKSksIHRlc3Rfc2l6ZS8yKTsKfQoKCQkJfQoJCXsKCQkvLwlwcmludGYoIlxuTElORT09IDB4JTA4eFxuIiwgX19MSU5FX18pOwovL3ByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7Ci8vcHJpbnRmKCJcbkxJTkU9PSAweCUwOHhcbiIsIF9fTElORV9fKTsKaWYgKHByaW50X2ZsYWcpIHsKIHByaW50ZigiXG5TdGFydCAqNCBub3JtYWwgcGF0dGVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKfQoJCWRkcl93cml0ZTQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJaWYgKHByaW50X2ZsYWcpIHsKCSAgICBwcmludGYoIlxuRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgIHByaW50ZigiXG5TdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7fQoJICAgIGRkcl9yZWFkNCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJICAgIHByaW50ZigiXG5FbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICAgcHJpbnRmKCJcblN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkgICAgZGRyX3JlYWQ0KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkgICAgcHJpbnRmKCJcbkVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgICBwcmludGYoIlxuU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCSAgICBkZHJfcmVhZDQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJaWYgKHByaW50X2ZsYWcpCgkgICAgcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwppZiAoY29weV90ZXN0X2ZsYWcpCnsKCiBkZHJfdGVzdF9jb3B5KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcit0ZXN0X3NpemUvMikpLCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUvMiApOwogIGRkcl9yZWFkNCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrdGVzdF9zaXplLzIpKSwgdGVzdF9zaXplLzIpOwogICBkZHJfcmVhZDQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK3Rlc3Rfc2l6ZS8yKSksIHRlc3Rfc2l6ZS8yKTsKfQoKCgkJCX0KCQkJfQoKaWYgKHNpbXBsZV9wYXR0ZXJuX2ZsYWcgPT0gMSkKewppZiAocHJpbnRfZmxhZykgewoJCSAgICBwcmludGYoIlxuU3RhcnQgKjQgbm8gY3Jvc3MgdGFsayBwYXR0ZXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCSAgcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7Cn0KCQlkZHJfd3JpdGVfcGF0dGVybjRfbm9fY3Jvc3NfdGFsaygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJICAgIHByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICAgcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkgICAgZGRyX3JlYWRfcGF0dGVybjRfbm9fY3Jvc3NfdGFsaygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJICAgIHByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICAgcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkgICAgZGRyX3JlYWRfcGF0dGVybjRfbm9fY3Jvc3NfdGFsaygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJICAgIHByaW50ZigiXHJFbmQgMm5kIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICAgcHJpbnRmKCJcclN0YXJ0IDNyZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkgICAgZGRyX3JlYWRfcGF0dGVybjRfbm9fY3Jvc3NfdGFsaygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykKCSAgICBwcmludGYoIlxyRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgoJCWlmIChjb3B5X3Rlc3RfZmxhZykKewogIGRkcl90ZXN0X2NvcHkoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK3Rlc3Rfc2l6ZS8yKSksKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZS8yICk7CiAgZGRyX3JlYWRfcGF0dGVybjRfbm9fY3Jvc3NfdGFsaygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrdGVzdF9zaXplLzIpKSwgdGVzdF9zaXplLzIpOwogICBkZHJfcmVhZF9wYXR0ZXJuNF9ub19jcm9zc190YWxrKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcit0ZXN0X3NpemUvMikpLCB0ZXN0X3NpemUvMik7Cn0KCn0KCmlmIChjcm9zc190YWxrX3BhdHRlcm5fZmxhZyA9PSAxKQp7aWYocHJpbnRfZmxhZyl7CgkJICAgIHByaW50ZigiXG5TdGFydCAqNCAgY3Jvc3MgdGFsayBwYXR0ZXJuIHAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJICBwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKfQoJCWRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJaWYgKHByaW50X2ZsYWcpIHsKCSAgICBwcmludGYoIlxyRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgIHByaW50ZigiXHJTdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7fQoJICAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJICAgIHByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICAgcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkgICAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkgICAgcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgICBwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCSAgICBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJaWYgKHByaW50X2ZsYWcpIHsKCSAgICBwcmludGYoIlxyRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgoJCQkgICAgcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkgIHByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpO30KCQlkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkgICAgcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgICBwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCSAgICBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24oKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJaWYgKHByaW50X2ZsYWcpIHsKCSAgICBwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgIHByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7fQoJICAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJICAgIHByaW50ZigiXHJFbmQgMm5kIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICAgcHJpbnRmKCJcclN0YXJ0IDNyZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkgICAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkgICAgcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKLy8vKgoJCQkJICAgIHByaW50ZigiXG5TdGFydCAqNCAgY3Jvc3MgdGFsayBwYXR0ZXJuIHAyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCSAgcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7fQoJCWRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX3AyKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkgICAgcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgICBwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCSAgICBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AyKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkgICAgcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgICBwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCSAgICBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AyKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkgICAgcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgICBwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCSAgICBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AyKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkgICAgcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCQkJICAgIHByaW50ZigiXG5TdGFydCAqNCAgY3Jvc3MgdGFsayBwYXR0ZXJuIG4yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCSAgcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7fQoJCWRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkgICAgcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgICBwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCSAgICBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkgICAgcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgICBwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCSAgICBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkgICAgcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgICBwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCSAgICBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKQoJICAgIHByaW50ZigiXHJFbmQgM3JkIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCgkJCQlpZiAoY29weV90ZXN0X2ZsYWcpCnsKICBkZHJfdGVzdF9jb3B5KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcit0ZXN0X3NpemUvMikpLCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUvMiApOwogIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK3Rlc3Rfc2l6ZS8yKSksIHRlc3Rfc2l6ZS8yKTsKICAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrdGVzdF9zaXplLzIpKSwgdGVzdF9zaXplLzIpOwp9CgkvLyAgICAqLwoKfQoKCWlmIChwcmludF9mbGFnKQoJCSAgcHJpbnRmKCJcbkVycm9yIGNvdW50PT0weCUwOHgiLCBlcnJvcl9jb3VudCk7CgoJICB9d2hpbGUoLS1sb29wKTsKLy8qLwoKIHByaW50ZigiXHJFbmQgZGRyIHRlc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCgkgIHJldHVybiAwOwoKdXNhZ2U6CgljbWRfdXNhZ2UoY21kdHApOwoJcmV0dXJuIDE7Cn0KClVfQk9PVF9DTUQoCglkZHJ0ZXN0LAk1LAkxLAlkb19kZHJfdGVzdCwKCSJERFIgdGVzdCBmdW5jdGlvbiIsCgkiZGRydGVzdCBbTE9PUF0gW0FERFJdLkRlZmF1bHQgYWRkcmVzcyBpcyAweDhkMDAwMDAwXG4iCik7CgppbnQgZG9fZGRyX3NwZWNpYWxfdGVzdChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCWNoYXIgKmVuZHA7CgkgdW5zaWduZWQgaW50ICAgbG9vcCA9IDE7CgkgdW5zaWduZWQgaW50ICAgbGZsYWcgPSAwOwoJIHVuc2lnbmVkIGludCAgc3RhcnRfYWRkciA9IEREUl9URVNUX1NUQVJUX0FERFI7CgkgICAgdW5zaWduZWQgaW50IHRlc3RfYWRkciA9IEREUl9URVNUX1NUQVJUX0FERFI7CgkgICAgICB1bnNpZ25lZCBpbnQgIHRlc3Rfc2l6ZSA9IEREUl9URVNUX1NJWkU7CgkgIHVuc2lnbmVkIGludCAgIHdyaXRlX3RpbWVzID0gMTsKCSAgICAgdW5zaWduZWQgaW50ICByZWFkX3RpbWVzID0gMzsKCQkvLyAgdW5zaWduZWQgaW50ICAgb2xkX3BhdHRlcm5fZmxhZyA9IDE7CgoJCSAgdW5zaWduZWQgaW50ICAgcHJpbnRfZmxhZyA9IDE7CgkvLwkgIGNvcHlfdGVzdF9mbGFnID0gMDsKCQkgIHByaW50X2ZsYWcgPSAxOwoJCSAgIGVycm9yX291dG9mX2NvdW50X2ZsYWcgPTA7CgkJIGVycm9yX2NvdW50ID0wOwoJCSAgIHByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCQkJaW50IGkgOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJCXsKCQlwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKCQl9CgogICAgaWYgKHN0cmNtcChhcmd2WzFdLCAibCIpID09IDApIHsKCQlsZmxhZyA9IDE7Cgl9CgllbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImgiKSA9PSAwKXsKCQlnb3RvIHVzYWdlOwoJfQoJZWxzZXsKCQlsb29wID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgJmVuZHAsIDEwKTsKICAgICAgICBpZiAoKmFyZ3ZbMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlsb29wID0gMTsKCX0KCgkJLy8gICAgcHJpbnRmKCJcbkxJTkU9PSAweCUwOHhcbiIsIF9fTElORV9fKTsKCQkgICAgaWYgKGFyZ2MgPT0xKSB7CgkvLyAgICBzdGFydF9hZGRyID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgJmVuZHAsIDE2KTsKCS8vICAgIGlmICgqYXJndlsyXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXN0YXJ0X2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSOwoJICBsb29wID0gMTsKCgl9CiAgICBpZiAoYXJnYyA+IDIpIHsKCQlzdGFydF9hZGRyID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgJmVuZHAsIDE2KTsKICAgICAgICBpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUjsKCgl9CgkgICAgaWYgKGFyZ2MgPiAzKSB7CgkgICB0ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bChhcmd2WzNdLCAmZW5kcCwgMTYpOwogICAgICAgIGlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXRlc3Rfc2l6ZSA9IEREUl9URVNUX1NJWkU7CgoJfQoJCWlmICh0ZXN0X3NpemU8MHgxMDAwKQoJCQl0ZXN0X3NpemUgPSBERFJfVEVTVF9TSVpFOwoJCSAgICBpZiAoYXJnYyA+IDQpIHsKCSAgIHdyaXRlX3RpbWVzID0gc2ltcGxlX3N0cnRvdWwoYXJndls0XSwgJmVuZHAsIDE2KTsKICAgICAgICBpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl3cml0ZV90aW1lcyA9IDA7CgoJfQoJCQkJICAgIGlmIChhcmdjID4gNSkgewoJICAgcmVhZF90aW1lcyA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNV0sICZlbmRwLCAxNik7CiAgICAgICAgaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJcmVhZF90aW1lcyA9IDA7CgoJfQoJCQkJCXVuc2lnbmVkIGludCAgYmFzZV9wYXR0ZXJuID0gMTsKCQkJCQl1bnNpZ25lZCBpbnQgIGluY19mbGFnID0gMTsKCQkgaWYgKGFyZ2MgPiA2KSB7CgkgICBiYXNlX3BhdHRlcm4gPSBzaW1wbGVfc3RydG91bChhcmd2WzZdLCAmZW5kcCwgMTYpOwogICAgICAgIGlmICgqYXJndls2XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCWJhc2VfcGF0dGVybiA9IDA7CgoJfQoJICAgIGlmIChhcmdjID4gNykgewoJICAgaW5jX2ZsYWcgPSBzaW1wbGVfc3RydG91bChhcmd2WzddLCAmZW5kcCwgMTYpOwogICAgICAgIGlmICgqYXJndls3XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCWluY19mbGFnID0gMDsKCgl9CgoKLy9wcmludGYoIlxuTElORT09IDB4JTA4eFxuIiwgX19MSU5FX18pOwoKLy9wcmludGYoIlxuTElORTE9PSAweCUwOHhcbiIsIF9fTElORV9fKTsKCgoJCS8vICAgIHByaW50ZigiXG5MSU5FMj09IDB4JTA4eFxuIiwgX19MSU5FX18pOwoJCS8vCXByaW50ZigiXG5MSU5FMz09IDB4JTA4eFxuIiwgX19MSU5FX18pOwoJCS8vCXByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CgoKdW5zaWduZWQgaW50ICBjb3VudCAgICA9IDE7CnVuc2lnbmVkIGludCAgIHRlc3RfdmFsID0gMTsKCi8vLyoKCWRvIHsKICAgICAgICBpZiAobGZsYWcpCgkJCWxvb3AgPSA4ODg7CgoJCWlmICgxKQoJCQl7CgoJCQkJZm9yIChpPTA7aTx3cml0ZV90aW1lczspCgkJCXtpKys7CgpwcmludGYoIlxud3JpdGVfdGltZXM9PTB4JTA4eCBcbiIsKCh1bnNpZ25lZCBpbnQpaSkpOwovLyAgc2VyaWFsX3B1dF9oZXgoKCh1bnNpZ25lZCBsb25nKWkpLDMyKTsKCS8vCWNvdW50PWNvdW50X21heDsKCS8vCXJlZz1yZWdfYmFzZTsKCS8vICAgICAgIHZhbD12YWxfYmFzZTsKCXRlc3RfYWRkcj1zdGFydF9hZGRyOwp0ZXN0X3ZhbD1iYXNlX3BhdHRlcm47CmNvdW50PSh0ZXN0X3NpemU+PjIpOwoJCWRvCgkJCXsKCQkJIHdyaXRlbCh0ZXN0X3ZhbCwodW5zaWduZWQgbG9uZyl0ZXN0X2FkZHIpOwoJCQl0ZXN0X2FkZHI9dGVzdF9hZGRyKzQ7CgkJaWYgKGluY19mbGFnKQoJCQl0ZXN0X3ZhbD10ZXN0X3ZhbCsxOwoKCQkJfQoJCXdoaWxlIChjb3VudC0tKSA7CgkJCQkJfQoKCQlmb3IgKGk9MDtpPHJlYWRfdGltZXM7KQoJCQl7aSsrOwoJCXByaW50ZigiXG5yZWFkX3RpbWVzPT0weCUwOHggXG4iLCgodW5zaWduZWQgaW50KWkpKTsKLy9zZXJpYWxfcHV0cygiXG5yZWFkX3RpbWVzPSAiKTsKIC8vICAgc2VyaWFsX3B1dF9oZXgoKCh1bnNpZ25lZCBsb25nKWkpLDMyKTsKCXRlc3RfYWRkcj1zdGFydF9hZGRyOwp0ZXN0X3ZhbD1iYXNlX3BhdHRlcm47CmNvdW50PSh0ZXN0X3NpemU+PjIpOwoKCQkJCWRvCgkJCXsKCgkJCS8vd3JpdGVsKHZhbCwodW5zaWduZWQgbG9uZylyZWcpOwoJCQlpZiAodGVzdF92YWwgIT0gKHJlYWRsKCh1bnNpZ25lZCBsb25nKXRlc3RfYWRkcikpKSB7CgpwcmludGYoIlxuYWRkPT0weCUwOHgscGF0dGVybj09MHglMDh4LHJlYWQ9PTB4JTA4eCBcbiIsKCh1bnNpZ25lZCBpbnQpdGVzdF9hZGRyKSwoKHVuc2lnbmVkIGludCl0ZXN0X3ZhbCksKHJlYWRsKCh1bnNpZ25lZCBpbnQpdGVzdF9hZGRyKSkpOwoJCQkJfQoJCXRlc3RfYWRkcj10ZXN0X2FkZHIrNDsKCQlpZiAoaW5jX2ZsYWcpCgkJCXRlc3RfdmFsPXRlc3RfdmFsKzE7CgkJCX0KCQl3aGlsZSAoY291bnQtLSkgOwoJCQl9CgkJfQoKCgoJaWYgKHByaW50X2ZsYWcpCgkJICBwcmludGYoIlxuRXJyb3IgY291bnQ9PTB4JTA4eCIsIGVycm9yX2NvdW50KTsKCgkgIH13aGlsZSgtLWxvb3ApOwovLyovCgogcHJpbnRmKCJcckVuZCBkZHIgdGVzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCSAgcmV0dXJuIDA7Cgp1c2FnZToKCWNtZF91c2FnZShjbWR0cCk7CglyZXR1cm4gMTsKfQpVX0JPT1RfQ01EKAoJZGRyX3NwZWNfdGVzdCwJOCwJMSwJZG9fZGRyX3NwZWNpYWxfdGVzdCwKCSJERFIgdGVzdCBmdW5jdGlvbiIsCgkiZGRydGVzdCBbTE9PUF0gW0FERFJdIFtzaXplXSBbd3JpdGVfdGltZXNdIFtyZWFkIHRpbWVzXSBbcGF0dGVybl0gW2luY10uZGRyX3NwZWNfdGVzdCAxIDB4MTA4MDAwMCAweDIwMDAwMCAxICAzIDEgMSBcbiIKKTsKLyoKaW50IGRvX213X21hc2soY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgkgY2hhciAqZW5kcDsKdW5zaWduZWQgaW50ICAgcmVnX2FkZD0wOwogdW5zaWduZWQgaW50ICAgd3JfcmVnX3ZhbHVlPTA7CiB1bnNpZ25lZCBpbnQgICByZF9yZWdfdmFsdWU9MDsKICB1bnNpZ25lZCBpbnQgICB3cl9yZWdfYW5kX21hc2tfMT0weGZmZmZmZmZmOwogaWYgKGFyZ2MgPT0gMSkKCXsgIHByaW50ZigiXG5wbGVhc2UgcmVhZCBoZWxwXG4iKTsKCQkgICBwcmludGYoIlxuZXhhbXBsZSBvbmx5IGNoYW5nZSAweGM4ODM2ODAwIDB4OGMwMTAyMjYgMHgwMDBmZmZmZiBiaXQyMC1iaXQzMSxubyBjaGFuZ2UgcGxsIG9kIG9jIFxuIik7CgkJICAgcHJpbnRmKCJcbm13bSAweGM4ODM2ODAwIDB4OGMwMTAyMjYgMHgwMDBmZmZmZlxuIik7Cgl9CiBlbHNlewoJaWYgKGFyZ2MgPj0gMikKCQkJewoJCXJlZ19hZGQgPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCAmZW5kcCwgMTApOwoJCX0KCQlpZiAoYXJnYyA+PSAzKQoJCQl7CgkJd3JfcmVnX3ZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgJmVuZHAsIDEwKTsKCQl9CgkJCQlpZiAoYXJnYyA+PSA0KQoJCQl7CgkJd3JfcmVnX2FuZF9tYXNrXzEgPSBzaW1wbGVfc3RydG91bChhcmd2WzNdLCAmZW5kcCwgMTApOwoKCQl9CgkgICAgICAgICAgICAgIHJkX3JlZ192YWx1ZT0gKHJkX3JlZyhyZWdfYWRkKSk7CgkJd3JfcmVnKHJlZ19hZGQsKHJkX3JlZ192YWx1ZSZ3cl9yZWdfYW5kX21hc2tfMSl8KHdyX3JlZ192YWx1ZSYofndyX3JlZ19hbmRfbWFza18xKSkgKTsKCglwcmludGYoIlxubW9kaWZ5IG9rIHJlYWQ9PTB4JTA4eFxuIiwocmRfcmVnKHJlZ19hZGQpKSk7CgoJfQpyZXR1cm4gMTsKfQpVX0JPT1RfQ01EKAoJbXdtLAkzMCwJMSwJZG9fbXdfbWFzaywKCSJtdyBtYXNrIGZ1bmN0aW9uIiwKCSJtdyAweGM4ODM2ODAwIDB4OGM4MjAyMmMgMHgwMDBmZmZmZlxuIgopOwoqLwoKLy8vKgoKaW50IGRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGludCBkZHJfdGVzdF9zaXplKQp7CiNkZWZpbmUgVEVTVF9PRkZTRVQgIDAvLzBYNDAwMDAwMDAKLy8gdW5zaWduZWQgaW50ICBzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUitURVNUX09GRlNFVDsKdW5zaWduZWQgaW50ICBzdGFydF9hZGRyPXRlc3Rfc3RhcnRfYWRkcjsKCgllcnJvcl9vdXRvZl9jb3VudF9mbGFnPTE7CgoJCWVycm9yX2NvdW50PTA7CgojaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfOTA1WCkKdHJhaW5pbmdfcGF0dGVybl9mbGFnPTA7CiNlbmRpZgovLy8qCmlmICh0cmFpbmluZ19wYXR0ZXJuX2ZsYWcpCgkJCXsKCQkJI2lmIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZX0dYX0JBQlkpCgkJZGRyX3Rlc3RfZ3hfdHJhaW5pbmdfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJI2VuZGlmCgkJaWYgKGVycm9yX2NvdW50KQoJcmV0dXJuIDE7CmVsc2UKCXJldHVybiAwOwoJCQkJfQplbHNlCgl7CgkjaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfR1hfQkFCWSkKCQlkZHJfdGVzdF9neF90cmFpbmluZ19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJI2VuZGlmCgoJCQkJfQoJLy8JCQkqLwovKgpkZHJfdGVzdF9neF9jcm9zc190YWxrX3BhdHRlcm4oIGRkcl90ZXN0X3NpemUpOwppZiAoZXJyb3JfY291bnQpCglyZXR1cm4gMTsKZWxzZQoJcmV0dXJuIDA7CgkqLwoKewogcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIGRkcl90ZXN0X3NpemUpOwoJCWRkcl93cml0ZSgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkgICAgcHJpbnRmKCJcbkVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgICBwcmludGYoIlxuU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgIGRkcl9yZWFkKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCSAgICBwcmludGYoIlxuRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgIHByaW50ZigiXG5TdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICAgZGRyX3JlYWQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBwYXR0ZXJuNCBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlNCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkgICAgcHJpbnRmKCJcbkVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgICBwcmludGYoIlxuU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgIGRkcl9yZWFkNCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkgICAgcHJpbnRmKCJcbkVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgICBwcmludGYoIlxuU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgIGRkcl9yZWFkNCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgogcHJpbnRmKCJcblN0YXJ0ICo0IG5vIGNyb3NzIHRhbGsgcGF0dGVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkgIHByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCQlkZHJfd3JpdGVfcGF0dGVybjRfbm9fY3Jvc3NfdGFsaygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkgICAgcHJpbnRmKCJcbkVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgICBwcmludGYoIlxuU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgIGRkcl9yZWFkX3BhdHRlcm40X25vX2Nyb3NzX3RhbGsoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJICAgIHByaW50ZigiXG5FbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICAgcHJpbnRmKCJcblN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgICBkZHJfcmVhZF9wYXR0ZXJuNF9ub19jcm9zc190YWxrKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKfQovL2lmKGNyb3NzX3RhbGtfcGF0dGVybl9mbGFnPT0xKQp7CgkJICAgIHByaW50ZigiXG5TdGFydCAqNCAgY3Jvc3MgdGFsayBwYXR0ZXJuIHAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJICBwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkgICAgcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgICBwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkgICAgcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgICBwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkgICAgcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCgkgLy8gICBwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJLy8gICAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wKCh2b2lkICopc3RhcnRfYWRkciwgZGRyX3Rlc3Rfc2l6ZSk7CgkvLyAgICBwcmludGYoIlxyRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgoJCQkgICAgcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkgIHByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCQlkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCSAgICBwcmludGYoIlxyRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgIHByaW50ZigiXHJTdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCSAgICBwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgIHByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCSAgICBwcmludGYoIlxyRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJLy8gICAgcHJpbnRmKCJcclN0YXJ0IDNyZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCS8vICAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKXN0YXJ0X2FkZHIsIGRkcl90ZXN0X3NpemUpOwoJIC8vICAgcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCn0KCnsKCQkgICAgcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gcDIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJICBwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfcDIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJICAgIHByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICAgcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgICBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AyKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCSAgICBwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgIHByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkgICAgcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCgkgLy8gICBwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJLy8gICAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wKCh2b2lkICopc3RhcnRfYWRkciwgZGRyX3Rlc3Rfc2l6ZSk7CgkvLyAgICBwcmludGYoIlxyRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgoJCQkgICAgcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkgIHByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCQlkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkgICAgcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgICBwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJICAgIHByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICAgcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgICBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCSAgICBwcmludGYoIlxyRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJLy8gICAgcHJpbnRmKCJcclN0YXJ0IDNyZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCS8vICAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKXN0YXJ0X2FkZHIsIGRkcl90ZXN0X3NpemUpOwoJIC8vICAgcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwppZiAoY29weV90ZXN0X2ZsYWcpCnsKIHByaW50ZigiXG4gc3RhcnQgY29weSB0ZXN0ICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CiBkZHJfdGVzdF9jb3B5KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcitkZHJfdGVzdF9zaXplLzIpKSwodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZS8yICk7CiAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrZGRyX3Rlc3Rfc2l6ZS8yKSksIGRkcl90ZXN0X3NpemUvMik7CiAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK2Rkcl90ZXN0X3NpemUvMikpLCBkZHJfdGVzdF9zaXplLzIpOwp9Cgp9CgppZiAoZXJyb3JfY291bnQpCglyZXR1cm4gMTsKZWxzZQoJcmV0dXJuIDA7Cn0KCgppbnQgZG9fZGRyX3Rlc3RfZmluZV90dW5lX2RxcyhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKICAgcHJpbnRmKCJcbkVudGVyIFR1bmUgZGRyIGRxcyBmdW5jdGlvblxuIik7CiAvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CiAgcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwogLy8gIHVuc2lnbmVkIGludCAgIGxvb3AgPSAxOwogICB1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2kgPSAxOwogICB1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2o9IDE7Cgl1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2s9IDE7CiAgIHVuc2lnbmVkIGludCAgIHRlbXBfdGVzdF9lcnJvcj0gMDsKCgoJIGNoYXIgKmVuZHA7CiAvLyAgdW5zaWduZWQgaW50ICAgKnBfc3RhcnRfYWRkcjsKICB1bnNpZ25lZCBpbnQgICB0ZXN0X2xvb3A9MTsKICAgdW5zaWduZWQgaW50ICAgdGVzdF90aW1lcz0xOwogICB1bnNpZ25lZCBpbnQgICByZWdfYWRkPTA7CiAgIHVuc2lnbmVkIGludCAgIHJlZ19iYXNlX2Fkaj0wOwoJCSAgdW5zaWduZWQgaW50ICAgY2hhbm5lbF9hX2VuID0gMDsKCSAgIHVuc2lnbmVkIGludCAgIGNoYW5uZWxfYl9lbiA9IDA7CgkgICB1bnNpZ25lZCBpbnQgICB0ZXN0aW5nX2NoYW5uZWwgPSAwOwoKCSAjZGVmaW5lICBEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCAgMTIKCgkgI2RlZmluZSAgREFUWDhfRFFfTEFORV9XSURUSCAgNAoJICNkZWZpbmUgIENIQU5ORUxfQ0hBTk5FTF9XSURUSCAgMgoKCSAgI2RlZmluZSAgQ0hBTk5FTF9BICAwCgkgICNkZWZpbmUgIENIQU5ORUxfQiAgMQoKCgoJI2RlZmluZSAgREFUWDhfRFFfTEFORV9MQU5FMDAgIDAKCSNkZWZpbmUgIERBVFg4X0RRX0xBTkVfTEFORTAxICAxCgkjZGVmaW5lICBEQVRYOF9EUV9MQU5FX0xBTkUwMiAgMgoJI2RlZmluZSAgREFUWDhfRFFfTEFORV9MQU5FMDMgIDMKCgkgI2RlZmluZSAgREFUWDhfRFFfQkRMUjAgIDAKCSAjZGVmaW5lICBEQVRYOF9EUV9CRExSMSAgMQoJICNkZWZpbmUgIERBVFg4X0RRX0JETFIyICAyCgkgI2RlZmluZSAgREFUWDhfRFFfQkRMUjMgIDMKCSAjZGVmaW5lICBEQVRYOF9EUV9CRExSNCAgNAoJICNkZWZpbmUgIERBVFg4X0RRX0JETFI1ICA1CgkgI2RlZmluZSAgREFUWDhfRFFfQkRMUjYgIDYKCSAjZGVmaW5lICBEQVRYOF9EUV9EWE5MQ0RMUjAgICAgIDcKCSAjZGVmaW5lICBEQVRYOF9EUV9EWE5MQ0RMUjEgICAgIDgKCSAjZGVmaW5lICBEQVRYOF9EUV9EWE5MQ0RMUjIgICAgIDkKCSAjZGVmaW5lICBEQVRYOF9EUV9EWE5NRExSICAgICAgICAxMAoJICNkZWZpbmUgIERBVFg4X0RRX0RYTkdUUiAgICAgICAgICAxMQoKCgkgI2RlZmluZSAgRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFICAgMHgyMDAwMAoKCSAjZGVmaW5lICBEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwgIERBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIKkRBVFg4X0RRX0xBTkVfV0lEVEgKCQkjZGVmaW5lICBEUV9MQ0RfQkRMX1JFR19OVU0gICAgRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMKkNIQU5ORUxfQ0hBTk5FTF9XSURUSAoKCSAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfb3JnW0RRX0xDRF9CRExfUkVHX05VTV07CgkgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX2xlZnRbRFFfTENEX0JETF9SRUdfTlVNXTsKCSAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfcmlnaHRbRFFfTENEX0JETF9SRUdfTlVNXTsKCSAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX2luZGV4W0RRX0xDRF9CRExfUkVHX05VTV07CgoJICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19sZWZ0X21pbltEUV9MQ0RfQkRMX1JFR19OVU1dOwoJICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19yaWdodF9taW5bRFFfTENEX0JETF9SRUdfTlVNXTsKCgkgICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoJICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM7CgkgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZDsKCSAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q7CgkgIC8vICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNuZDsKCSAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZTsKCSAgICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlOwoJLy8gICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxczsKCS8vICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ7CgkvLyAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q7CgoJICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWY7CgkgICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZzsKCSAgICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX2NlbnRlcjsKCSAgICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3dpbmRvd3M7CgkgICAgICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX2NlbnRlcl9taW47CgkgICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ193aW5kb3dzX21pbjsKCgkgICAgdW5zaWduZWQgaW50ICAgZGRyX3Rlc3Rfc2l6ZT0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoKCgoJIGlmIChhcmdjID09IDIpCgkJewogICAgaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkpCgoJe2NoYW5uZWxfYV9lbiA9IDE7Cgl9CgllbHNlIGlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApKQoKCXtjaGFubmVsX2JfZW4gPSAxOwoJfQoJZWxzZQoJCXsKCWdvdG8gdXNhZ2U7CgkJfQoJCX0KCQlpZiAoYXJnYyA+IDIpCgkJewogICAgaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkEiKSA9PSAwKSkKCgl7Y2hhbm5lbF9hX2VuID0gMTsKCX0KICAgICBpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJCIikgPT0gMCkpCgoJe2NoYW5uZWxfYl9lbiA9IDE7Cgl9CgkJCX0KCQkgICBkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwogIGlmIChhcmdjID4zKSB7CglkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgJmVuZHAsIDE2KTsKICAgICAgICBpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJCX0KCgl9CiAgICBpZiAoYXJnYyA+NCkgewoJdGVzdF9sb29wID0gc2ltcGxlX3N0cnRvdWwoYXJndls0XSwgJmVuZHAsIDE2KTsKICAgICAgICBpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCXRlc3RfbG9vcCA9IDE7CgkJCX0KCQkgaWYgICAoKHN0cmNtcChhcmd2WzRdLCAibCIpID09IDApIHx8IChzdHJjbXAoYXJndls0XSwgIkwiKSA9PSAwKSkKCQkJewoJCQl0ZXN0X2xvb3AgPSAxMDAwMDA7CgkJCX0KCX0KCSAgICBpZiAoYXJnYyA+NSkgewoJdHJhaW5pbmdfcGF0dGVybl9mbGFnID0gc2ltcGxlX3N0cnRvdWwoYXJndls1XSwgJmVuZHAsIDE2KTsKICAgICAgICBpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCXRyYWluaW5nX3BhdHRlcm5fZmxhZyA9IDA7CgkJCX0KCQllbHNlIGlmKHRyYWluaW5nX3BhdHRlcm5fZmxhZykKCQkJdHJhaW5pbmdfcGF0dGVybl9mbGFnID0gMTsKCgoJfQoKCgkJIHByaW50ZigiXG5jaGFubmVsX2FfZW49PSAweCUwOHhcbiIsIGNoYW5uZWxfYV9lbik7CgkJIHByaW50ZigiXG5jaGFubmVsX2JfZW49PSAweCUwOHhcbiIsIGNoYW5uZWxfYl9lbik7CgkJICBwcmludGYoIlxuZGRyX3Rlc3Rfc2l6ZT09IDB4JTA4eFxuIiwgZGRyX3Rlc3Rfc2l6ZSk7CgkJICAgcHJpbnRmKCJcbnRlc3RfbG9vcD09IDB4JTA4eFxuIiwgdGVzdF9sb29wKTsKCQkgICAgcHJpbnRmKCJcdHJhaW5pbmdfcGF0dGVybl9mbGFnPT0gMHglMDh4XG4iLCB0cmFpbmluZ19wYXR0ZXJuX2ZsYWcpOwppZiAoIGNoYW5uZWxfYV9lbikKewovL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwpPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7Cn0KaWYgKCBjaGFubmVsX2JfZW4pCnsKT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpOwovL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwp9CgoKLy9zYXZlIGFuZCBwcmludCBvcmcgdHJhaW5pbmcgZHFzIHZhbHVlCmlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQp7CgoKCS8vZGNhY2hlX2Rpc2FibGUoKTsKIC8vc2VyaWFsX3B1dHMoIlxuZGVidWcgZm9yIGRkcnRlc3QgLGppYXhpbmcgZGlzYWJsZSBkY2FjaGUiKTsKCnsKZm9yICgodGVzdGluZ19jaGFubmVsPTApOyh0ZXN0aW5nX2NoYW5uZWw8KGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pKTsodGVzdGluZ19jaGFubmVsKyspKQp7CmlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCnsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKfQplbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQp7CnJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7Cn0KZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQogewppZiAoIHRlc3RpbmdfY2hhbm5lbCA9PSBDSEFOTkVMX0EpCiAgIHsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKICAgfQplbHNlIGlmKCB0ZXN0aW5nX2NoYW5uZWw9PUNIQU5ORUxfQikKICAgewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwogICB9CiB9Cgpmb3IgKCh0ZW1wX2NvdW50X2k9MCk7KHRlbXBfY291bnRfaTxEQVRYOF9EUV9MQU5FX1dJRFRIKTsodGVtcF9jb3VudF9pKyspKQogICB7CgogICBpZiAodGVtcF9jb3VudF9pID09IERBVFg4X0RRX0xBTkVfTEFORTAwKQoJewogICByZWdfYWRkPUREUjBfUFVCX0RYMEJETFIwK3JlZ19iYXNlX2Fkajt9CgoJICBlbHNlICAgIGlmKHRlbXBfY291bnRfaT09REFUWDhfRFFfTEFORV9MQU5FMDEpCgl7CiAgIHJlZ19hZGQ9RERSMF9QVUJfRFgxQkRMUjArcmVnX2Jhc2VfYWRqO30KCgllbHNlICAgCSBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAyKQoJewogICByZWdfYWRkPUREUjBfUFVCX0RYMkJETFIwK3JlZ19iYXNlX2Fkajt9CgkgZWxzZSAgICBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAzKQoJewogICByZWdfYWRkPUREUjBfUFVCX0RYM0JETFIwK3JlZ19iYXNlX2Fkajt9CgoKCiAgICAgICBmb3IgKCh0ZW1wX2NvdW50X2o9MCk7KHRlbXBfY291bnRfajxEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCk7KHRlbXBfY291bnRfaisrKSkKCSAgIHsKCQlkcV9sY2RfYmRsX3JlZ19vcmdbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrdGVtcF9jb3VudF9qXT1yZWFkbChyZWdfYWRkKzQqdGVtcF9jb3VudF9qKTsKZHFfbGNkX2JkbF9yZWdfaW5kZXhbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrdGVtcF9jb3VudF9qXT1yZWdfYWRkKzQqdGVtcF9jb3VudF9qOwoJCXByaW50ZigiXG4gb3JnIGFkZCAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCs0KnRlbXBfY291bnRfaiksIChkcV9sY2RfYmRsX3JlZ19vcmdbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrdGVtcF9jb3VudF9qXSkpOwpkcV9sY2RfYmRsX3JlZ19sZWZ0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCt0ZW1wX2NvdW50X2pdCiA9ZHFfbGNkX2JkbF9yZWdfb3JnW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK3RlbXBfY291bnRfal07CmRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCt0ZW1wX2NvdW50X2pdCiA9ZHFfbGNkX2JkbF9yZWdfb3JnW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK3RlbXBfY291bnRfal07CgoJICAgfQoJfQoKfQoKfQoKfS8vLy9zYXZlIGFuZCBwcmludCBvcmcgdHJhaW5pbmcgZHFzIHZhbHVlCgoKZm9yICh0ZXN0X3RpbWVzPTA7KHRlc3RfdGltZXM8dGVzdF9sb29wKTsodGVzdF90aW1lcysrKSkKewovLy8vdHVuZSBhbmQgc2F2ZSB0cmFpbmluZyBkcXMgdmFsdWUKaWYgKGNoYW5uZWxfYV9lbiB8fCBjaGFubmVsX2JfZW4pCgp7CmZvciAoKHRlc3RpbmdfY2hhbm5lbD0wKTsodGVzdGluZ19jaGFubmVsPChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKSk7KHRlc3RpbmdfY2hhbm5lbCsrKSkKewoKaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwp9CmVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCnsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKfQplbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCiB7CmlmICggdGVzdGluZ19jaGFubmVsID09IENIQU5ORUxfQSkKICAgewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwogICB9CmVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQogICB7CnJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CiAgIH0KIH0KCmZvciAoKHRlbXBfY291bnRfaT0wKTsodGVtcF9jb3VudF9pPERBVFg4X0RRX0xBTkVfV0lEVEgpOyh0ZW1wX2NvdW50X2krKykpCnsKICAgeyBwcmludGYoIlxudGVzdCBsYW5lPT0weCUwOHhcbiAiLHRlbXBfY291bnRfaSk7CgogICBpZiAodGVtcF9jb3VudF9pID09IERBVFg4X0RRX0xBTkVfTEFORTAwKQoJewogICByZWdfYWRkPUREUjBfUFVCX0RYMEJETFIwK3JlZ19iYXNlX2Fkajt9CgoJICBlbHNlICAgIGlmKHRlbXBfY291bnRfaT09REFUWDhfRFFfTEFORV9MQU5FMDEpCgl7CiAgIHJlZ19hZGQ9RERSMF9QVUJfRFgxQkRMUjArcmVnX2Jhc2VfYWRqO30KCgllbHNlICAgCSBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAyKQoJewogICByZWdfYWRkPUREUjBfUFVCX0RYMkJETFIwK3JlZ19iYXNlX2Fkajt9CgkgZWxzZSAgICBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAzKQoJewogICByZWdfYWRkPUREUjBfUFVCX0RYM0JETFIwK3JlZ19iYXNlX2Fkajt9Cn0KCiAgZm9yICgodGVtcF9jb3VudF9rPTApOyh0ZW1wX2NvdW50X2s8Mik7KHRlbXBfY291bnRfaysrKSkKCSAgIHsKCmlmICh0ZW1wX2NvdW50X2sgPT0gMCkKewojaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfOTA1WCkKICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz0ocmVhZGwocmVnX2FkZCtERFIwX1BVQl9EWDBMQ0RMUjEtRERSMF9QVUJfRFgwQkRMUjApKTsKCSAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZD0ocmVhZGwocmVnX2FkZCtERFIwX1BVQl9EWDBMQ0RMUjEtRERSMF9QVUJfRFgwQkRMUjApKSZEUUxDRExSX01BWDsKCSAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q9KHJlYWRsKHJlZ19hZGQrRERSMF9QVUJfRFgwTENETFIzLUREUjBfUFVCX0RYMEJETFIwKSkmRFFMQ0RMUl9NQVg7CgkgLy8gIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc25kPSgoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXMmMHhmZjAwMDApKT4+MTY7CiNlbHNlCiAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9cmVhZGwocmVnX2FkZCs0KkRBVFg4X0RRX0RYTkxDRExSMSk7CgkgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzJjB4ZmYpOwoJICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZD0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzJjB4ZmYwMCkpPj44OwoJIC8vICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNuZD0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzJjB4ZmYwMDAwKSk+PjE2OwojZW5kaWYKCndoaWxlIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ+MCkKewp0ZW1wX3Rlc3RfZXJyb3I9MDsKZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkLS07CnByaW50ZigiXG53ZHFkIGxlZnQgdGVtcD09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQpOwoJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZHwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDE2KSk7CiNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV85MDVYKQp3cml0ZWwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkLChyZWdfYWRkK0REUjBfUFVCX0RYMExDRExSMS1ERFIwX1BVQl9EWDBCRExSMCkpOwojZWxzZQoJIHdyaXRlbChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxcywocmVnX2FkZCs0KkRBVFg4X0RRX0RYTkxDRExSMSkpOwojZW5kaWYKCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJewoJCS8vcHJpbnRmKCJcbndkcWQgbGVmdCBlZGdlIGRldGVjdCBcbiIpOwoJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZCsrOwoJCWJyZWFrOwoJCX0KfQpwcmludGYoIlxud2RxZCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CnByaW50ZigiXG53ZHFkIGxlZnQgZWRnZT09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQpOwpkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz0oZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8MTYpKTsKLy9vbmx5IHVwZGF0ZSBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQKZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT1kcV9sY2RfYmRsX3JlZ19sZWZ0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV07CmRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPSgoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSYweDAwKXxkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQpOwpkcV9sY2RfYmRsX3JlZ19sZWZ0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV09ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM7CgoKZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlPWRxX2xjZF9iZGxfcmVnX2xlZnRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV07CmlmIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ+KGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZSYweGZmKSkgIC8vdXBkYXRlIHdkcWQgbWluIHZhbHVlCnsKZHFfbGNkX2JkbF9yZWdfbGVmdF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXQo9KChkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWUmMHhmZmZmMDApfGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZCkJOwp9CgoKd3JpdGVsKGRxX2xjZF9iZGxfcmVnX29yZ1t0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdLChyZWdfYWRkKzQqREFUWDhfRFFfRFhOTENETFIxKSk7CgogZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9cmVhZGwocmVnX2FkZCs0KkRBVFg4X0RRX0RYTkxDRExSMSk7CgkgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzJjB4ZmYpOwoJICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZD0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzJjB4ZmYwMCkpPj44OwoKCndoaWxlIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ8MHhmZikKewp0ZW1wX3Rlc3RfZXJyb3I9MDsKZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkKys7CnByaW50ZigiXG53ZHFkIHJpZyB0ZW1wPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZCk7CglkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz0oZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8MTYpKTsKCSB3cml0ZWwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXMsKHJlZ19hZGQrNCpEQVRYOF9EUV9EWE5MQ0RMUjEpKTsKCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJewoJCS8vcHJpbnRmKCJcbndkcWQgcmlnaHQgZWRnZSBkZXRlY3QgXG4iKTsKCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQtLTsKCQlicmVhazsKCQl9Cn0KcHJpbnRmKCJcbndkcWQgcmlnaHQgZWRnZSBkZXRlY3QgXG4iKTsKcHJpbnRmKCJcbndkcWQgcmlnaHQgZWRnZT09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQpOwpkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz0oZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8MTYpKTsKLy9vbmx5IHVwZGF0ZSBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQKZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT1kcV9sY2RfYmRsX3JlZ19yaWdodFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdOwpkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUmMHgwMCl8ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkKTsKCmRxX2xjZF9iZGxfcmVnX3JpZ2h0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV09ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM7CgpkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWU9ZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV07CmlmIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ8KGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZSYweGZmKSkgIC8vdXBkYXRlIHdkcWQgbWluIHZhbHVlCnsKZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0KPSgoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlJjB4ZmZmZjAwKXxkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQpCTsKfQoKCgp3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0sKHJlZ19hZGQrNCpEQVRYOF9EUV9EWE5MQ0RMUjEpKTsKCgp9CmVsc2UgaWYodGVtcF9jb3VudF9rPT0xKQp7CgogZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9cmVhZGwocmVnX2FkZCs0KkRBVFg4X0RRX0RYTkxDRExSMSk7CgkgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzJjB4ZmYpOwoJICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZD0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzJjB4ZmYwMCkpPj44OwoKd2hpbGUgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q+MCkKewp0ZW1wX3Rlc3RfZXJyb3I9MDsKZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZC0tOwpwcmludGYoIlxucmRxc2QgbGVmdCB0ZW1wPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2QpOwoJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZHwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDE2KSk7Cgkgd3JpdGVsKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzLChyZWdfYWRkKzQqREFUWDhfRFFfRFhOTENETFIxKSk7Cgl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CglpZiAodGVtcF90ZXN0X2Vycm9yKQoJCXsKCQkvL3ByaW50ZigiXG5yZHFzZCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZCsrOwoJCWJyZWFrOwoJCX0KfQpwcmludGYoIlxucmRxc2QgbGVmdCBlZGdlIGRldGVjdCBcbiIpOwpwcmludGYoIlxucmRxc2QgbGVmdCBlZGdlPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2QpOwpkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz0oZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8MTYpKTsKLy9vbmx5IHVwZGF0ZSBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkIHJkcXNuZApkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPWRxX2xjZF9iZGxfcmVnX2xlZnRbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXTsKZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9KChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlJjB4MDAwMGZmKXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDE2KSk7CgpkcV9sY2RfYmRsX3JlZ19sZWZ0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV09ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM7CgoKZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlPWRxX2xjZF9iZGxfcmVnX2xlZnRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV07CmlmIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPigoZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlPj44KSYweGZmKSkgIC8vdXBkYXRlIHdkcWQgbWluIHZhbHVlCnsKZHFfbGNkX2JkbF9yZWdfbGVmdF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXQo9KChkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWUmMHhmZil8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDgpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDwxNikpCTsKfQoKCndyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmdbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSwocmVnX2FkZCs0KkRBVFg4X0RRX0RYTkxDRExSMSkpOwoKIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPXJlYWRsKHJlZ19hZGQrNCpEQVRYOF9EUV9EWE5MQ0RMUjEpOwoJICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkPShkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxcyYweGZmKTsKCSAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q9KChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxcyYweGZmMDApKT4+ODsKCndoaWxlIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDB4ZmYpCnsKdGVtcF90ZXN0X2Vycm9yPTA7CmRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2QrKzsKcHJpbnRmKCJcbnJkcXNkIHJpZ2h0IHRlbXA9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZCk7CglkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz0oZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8MTYpKTsKCSB3cml0ZWwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXMsKHJlZ19hZGQrNCpEQVRYOF9EUV9EWE5MQ0RMUjEpKTsKCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJewoJCS8vcHJpbnRmKCJcbnJkcXNkIHJpZ2h0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZC0tOwoJCWJyZWFrOwoJCX0KfQpwcmludGYoIlxucmRxc2QgcmlnaHQgZWRnZSBkZXRlY3QgXG4iKTsKcHJpbnRmKCJcbnJkcXNkIHJpZ2h0IGVkZ2U9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZCk7CmRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPShkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWR8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDgpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDwxNikpOwovL29ubHkgdXBkYXRlIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2QgcmRxc25kCmRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9ZHFfbGNkX2JkbF9yZWdfcmlnaHRbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXTsKZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9KChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlJjB4MDAwMGZmKXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDE2KSk7CmRxX2xjZF9iZGxfcmVnX3JpZ2h0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV09ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM7CgoKZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlPWRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdOwppZiAoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDwoKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZT4+OCkmMHhmZikpICAvL3VwZGF0ZSB3ZHFkIG1pbiB2YWx1ZQp7CmRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdCj0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZSYweGZmKXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDE2KSkJOwp9CgoKCndyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmdbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSwocmVnX2FkZCs0KkRBVFg4X0RRX0RYTkxDRExSMSkpOwoKCgoKICAgfQoKIH0KfQoKfQp9CgovLy8vdHVuZSBhbmQgc2F2ZSB0cmFpbmluZyBkcXMgdmFsdWUKCgoKCi8vLy9jYWxjdWxhdGUgYW5kIHByaW50ICBkcXMgdmFsdWUKZm9yICgodGVzdGluZ19jaGFubmVsPTApOyh0ZXN0aW5nX2NoYW5uZWw8KGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pKTsodGVzdGluZ19jaGFubmVsKyspKQp7CmlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCnsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKfQplbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQp7CnJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7Cn0KZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQogewppZiAoIHRlc3RpbmdfY2hhbm5lbCA9PSBDSEFOTkVMX0EpCiAgIHsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKICAgfQplbHNlIGlmKCB0ZXN0aW5nX2NoYW5uZWw9PUNIQU5ORUxfQikKICAgewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwogICB9CiB9CnJlZ19hZGQ9RERSMF9QVUJfRFgwQkRMUjArcmVnX2Jhc2VfYWRqOwoKCiAgZm9yICgodGVtcF9jb3VudF9qPTApOyh0ZW1wX2NvdW50X2o8RFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMKTsodGVtcF9jb3VudF9qKyspKQoJICAgewoJIC8vICBkcV9sY2RfYmRsX3JlZ19pbmRleFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCt0ZW1wX2NvdW50X2pdPXJlZ19hZGQrNCp0ZW1wX2NvdW50X2o7CgoJCXByaW50ZigiXG4gb3JnIGFkZCAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwoZHFfbGNkX2JkbF9yZWdfaW5kZXhbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2pdKSwgKGRxX2xjZF9iZGxfcmVnX29yZ1t0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfal0pKTsKCSAgIH0KCiAgZm9yICgodGVtcF9jb3VudF9qPTApOyh0ZW1wX2NvdW50X2o8RFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMKTsodGVtcF9jb3VudF9qKyspKQoJICAgewoJCXByaW50ZigiXG4gbGVmIGFkZCAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwoZHFfbGNkX2JkbF9yZWdfaW5kZXhbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2pdKSwgKGRxX2xjZF9iZGxfcmVnX2xlZnRbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2pdKSk7CgkgICB9CgogIGZvciAoKHRlbXBfY291bnRfaj0wKTsodGVtcF9jb3VudF9qPERRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCk7KHRlbXBfY291bnRfaisrKSkKCSAgIHsKCQlwcmludGYoIlxuIHJpZyBhZGQgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKGRxX2xjZF9iZGxfcmVnX2luZGV4W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9qXSksIChkcV9sY2RfYmRsX3JlZ19yaWdodFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfal0pKTsKCSAgIH0KCnByaW50ZigiXG4gZGRydGVzdCBzaXplID09MHglMDh4LCB0ZXN0IHRpbWVzPT0weCUwOHgsdGVzdF9sb29wPT0weCUwOHhcbiIsZGRyX3Rlc3Rfc2l6ZSwodGVzdF90aW1lcysxKSx0ZXN0X2xvb3ApOwpwcmludGYoIlxuIGFkZCAgMHgwMDAwMDAwMCByZWc9PSAgICBvcmcgICAgICAgICAgIGxlZiAgICAgICAgICAgcmlnICAgICAgICAgICBjZW50ZXIgICAgICAgIHdpbiAgICAgICAgICAgbGVmX20gICAgICAgICByaWdfbSAgICAgICAgIG1pbl9jICAgICAgICAgbWluX3dpbiAgICAgICAgXG4iKTsKZm9yICgodGVtcF9jb3VudF9pPTApOyh0ZW1wX2NvdW50X2k8REFUWDhfRFFfTEFORV9XSURUSCk7KHRlbXBfY291bnRfaSsrKSkKewogICB7CgogICBpZiAodGVtcF9jb3VudF9pID09IERBVFg4X0RRX0xBTkVfTEFORTAwKQoJewogICByZWdfYWRkPUREUjBfUFVCX0RYMEJETFIwK3JlZ19iYXNlX2FkaitEQVRYOF9EUV9EWE5MQ0RMUjEqNDt9CgoJICBlbHNlICAgIGlmKHRlbXBfY291bnRfaT09REFUWDhfRFFfTEFORV9MQU5FMDEpCgl7CiAgIHJlZ19hZGQ9RERSMF9QVUJfRFgxQkRMUjArcmVnX2Jhc2VfYWRqK0RBVFg4X0RRX0RYTkxDRExSMSo0O30KCgllbHNlICAgCSBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAyKQoJewogICByZWdfYWRkPUREUjBfUFVCX0RYMkJETFIwK3JlZ19iYXNlX2FkaitEQVRYOF9EUV9EWE5MQ0RMUjEqNDt9CgkgZWxzZSAgICBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAzKQoJewogICByZWdfYWRkPUREUjBfUFVCX0RYM0JETFIwK3JlZ19iYXNlX2FkaitEQVRYOF9EUV9EWE5MQ0RMUjEqNDt9Cn0KCmRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmPShkcV9sY2RfYmRsX3JlZ19sZWZ0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0pOwpkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZz0oZHFfbGNkX2JkbF9yZWdfcmlnaHRbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSk7CgppZiAodGVzdF90aW1lcyA9PSAwKQp7CihkcV9sY2RfYmRsX3JlZ19sZWZ0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKT1kcV9sY2RfYmRsX3RlbXBfcmVnX2xlZjsKKGRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKT1kcV9sY2RfYmRsX3RlbXBfcmVnX3JpZzsKCn0KZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlPShkcV9sY2RfYmRsX3JlZ19sZWZ0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKTsKZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlPShkcV9sY2RfYmRsX3JlZ19yaWdodF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSk7CgoKLy9kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUmMHgwMDAwZmYpOwogICBkcV9sY2RfYmRsX3RlbXBfcmVnX2NlbnRlcj0oICgoKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmJjB4ZmYpKyhkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZyYweGZmKSkvMikKICAgfCgoKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWY+PjgpJjB4ZmYpKygoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWc+PjgpJjB4ZmYpKS8yKTw8OCkKCXwoKCgoKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmPj4xNikmMHhmZikrKChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZz4+OCkmMHhmZikpLzIpPDwxNikgKTsKCiAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfd2luZG93cz0oICgoKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnJjB4ZmYpLShkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZiYweGZmKSkpCiAgIHwoKCgoKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnPj44KSYweGZmKS0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmPj44KSYweGZmKSkpPDw4KQoJfCgoKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWc+PjE2KSYweGZmKS0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmPj44KSYweGZmKSkpPDwxNikgKTsKCgoJICBkcV9sY2RfYmRsX3RlbXBfcmVnX2NlbnRlcl9taW49KCAoKChkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWUmMHhmZikrKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZSYweGZmKSkvMikKICAgfCgoKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlPj44KSYweGZmKSsoKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZT4+OCkmMHhmZikpLzIpPDw4KQoJfCgoKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlPj4xNikmMHhmZikrKChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWU+PjgpJjB4ZmYpKS8yKTw8MTYpICk7CgogICBkcV9sY2RfYmRsX3RlbXBfcmVnX3dpbmRvd3NfbWluPSggKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlJjB4ZmYpLShkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWUmMHhmZikpKQogICB8KCgoKChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWU+PjgpJjB4ZmYpLSgoZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlPj44KSYweGZmKSkpPDw4KQoJfCgoKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlPj4xNikmMHhmZiktKChkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWU+PjgpJjB4ZmYpKSk8PDE2KSApOwoKcHJpbnRmKCJcbiBhZGQgIDB4JTA4eCByZWc9PSAgICAweCUwOHggICAgMHglMDh4ICAgIDB4JTA4eCAgICAweCUwOHggICAgMHglMDh4ICAgIDB4JTA4eCAgICAweCUwOHggICAgMHglMDh4ICAgIDB4JTA4eFxuIiwKCShkcV9sY2RfYmRsX3JlZ19pbmRleFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKSwKCSAgIChkcV9sY2RfYmRsX3JlZ19vcmdbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSksCgkgICAoZHFfbGNkX2JkbF9yZWdfbGVmdFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKSwKCSAgIChkcV9sY2RfYmRsX3JlZ19yaWdodFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKSwKCSAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfY2VudGVyLGRxX2xjZF9iZGxfdGVtcF9yZWdfd2luZG93cywKCQkoZHFfbGNkX2JkbF9yZWdfbGVmdF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSksCgkgICAoZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0pLAoJCWRxX2xjZF9iZGxfdGVtcF9yZWdfY2VudGVyX21pbixkcV9sY2RfYmRsX3RlbXBfcmVnX3dpbmRvd3NfbWluCik7CgkgICB9CgoKfQoKfQoKCgoKIHJldHVybiAwOwoKdXNhZ2U6CgljbWRfdXNhZ2UoY21kdHApOwoJcmV0dXJuIDE7Cgp9CgoKCgpVX0JPT1RfQ01EKAoJZGRyX3R1bmVfZHFzLAk2LAkxLAlkb19kZHJfdGVzdF9maW5lX3R1bmVfZHFzLAoJIkREUiB0dW5lIGRxcyBmdW5jdGlvbiIsCgkiZGRyX3R1bmVfZHFzIGEgMCAweDgwMDAwIDMgb3IgZGRyX3R1bmVfZHFzIGIgMCAweDgwMDAwIDUgb3IgZGRyX3R1bmVfZHFzIGEgYiAweDgwMDAwIGxcbiBkY2FjaGUgb2ZmID8gXG4iCik7CgoKCmludCBkb19kZHJfdGVzdF9kcXNfd2luZG93X3N0ZXAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CiAgIHByaW50ZigiXG5FbnRlciB0ZXN0IGRkciBkcXMgd2luZG93IHN0ZXAgZnVuY3Rpb25cbiIpOwogLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwogIHByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCiAgIHVuc2lnbmVkIGludCAgIHRlbXBfdGVzdF9lcnJvcj0gMDsKCgoJIGNoYXIgKmVuZHA7CiAvLyAgdW5zaWduZWQgaW50ICAgKnBfc3RhcnRfYWRkcjsKICB1bnNpZ25lZCBpbnQgICB0ZXN0X2xhbmVfc3RlcD0wOwogdW5zaWduZWQgaW50ICAgdGVzdGluZ19sYW5lPTA7CiB1bnNpZ25lZCBpbnQgICB0ZXN0X2xhbmVfc3RlcF9yZHFzX2ZsYWc9MDsKICB1bnNpZ25lZCBpbnQgICB0ZXN0X21pbl9tYXhfZmxhZz0wOwogICB1bnNpZ25lZCBpbnQgICB0ZXN0X3RpbWVzPTE7CiAgIHVuc2lnbmVkIGludCAgIHJlZ19hZGQ9MDsKICAgdW5zaWduZWQgaW50ICAgcmVnX2Jhc2VfYWRqPTA7CgkJICB1bnNpZ25lZCBpbnQgICBjaGFubmVsX2FfZW4gPSAwOwoJICAgdW5zaWduZWQgaW50ICAgY2hhbm5lbF9iX2VuID0gMDsKCgoJICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19vcmc9MDsKCSAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfbGVmdD0wOwoJICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19yaWdodD0wOwoKCgkgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX2xlZnRfbWluPTA7CgkgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbj0wOwoKCSAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9MDsKCgoJIC8vICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWU7CgkvLyAgICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlOwoKCgkvLyAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmOwoJLy8gICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZzsKCgoJICAgIHVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCgoKCSBpZiAoYXJnYyA9PSAyKQoJCXsKICAgIGlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApKQoKCXtjaGFubmVsX2FfZW4gPSAxOwoJfQoJZWxzZSBpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCl8fChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSkKCgl7Y2hhbm5lbF9iX2VuID0gMTsKCX0KCWVsc2UKCQl7Cglnb3RvIHVzYWdlOwoJCX0KCQl9CgkJaWYgKGFyZ2MgPiAyKQoJCXsKICAgIGlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJBIikgPT0gMCkpCgoJe2NoYW5uZWxfYV9lbiA9IDE7Cgl9CiAgICAgaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQiIpID09IDApKQoKCXtjaGFubmVsX2JfZW4gPSAxOwoJfQoJCQl9CgkJICAgZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKICBpZiAoYXJnYyA+MykgewoJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sICZlbmRwLCAxNik7CiAgICAgICAgaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQlkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJCQl9CgoJfQogICAgaWYgKGFyZ2MgPjQpIHsKCQkgdGVzdF9sYW5lX3N0ZXAgPSAwOwoJdGVzdF9sYW5lX3N0ZXAgPSBzaW1wbGVfc3RydG91bChhcmd2WzRdLCAmZW5kcCwgMTYpOwogICAgICAgIGlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJdGVzdF9sYW5lX3N0ZXAgPSAwOwoJCQl9CgkJIGlmICAgKChzdHJjbXAoYXJndls0XSwgImwiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbNF0sICJMIikgPT0gMCkpCgkJCXsKCQkJdGVzdF9sYW5lX3N0ZXAgPSAwOwoJCQl9Cgl9CglpZiAodGVzdF9sYW5lX3N0ZXAgPjcpCgkJdGVzdF9sYW5lX3N0ZXAgPSAwOwoJIHVuc2lnbmVkIGludCAgIHRlc3RfbG9vcD0xOwoJICAgIGlmIChhcmdjID41KSB7CgoJdGVzdF9taW5fbWF4X2ZsYWcgPSBzaW1wbGVfc3RydG91bChhcmd2WzVdLCAmZW5kcCwgMTYpOwogICAgICAgIGlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJdGVzdF9taW5fbWF4X2ZsYWcgPSAwOwoJCQl9CgkJIGVsc2UKCQkJdGVzdF9taW5fbWF4X2ZsYWcgPTE7Cgl9CgoJCSBwcmludGYoIlxuY2hhbm5lbF9hX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2FfZW4pOwoJCSBwcmludGYoIlxuY2hhbm5lbF9iX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2JfZW4pOwoJCSAgcHJpbnRmKCJcbmRkcl90ZXN0X3NpemU9PSAweCUwOHhcbiIsIGRkcl90ZXN0X3NpemUpOwoJCSAgIHByaW50ZigiXG50ZXN0X2xhbmVfc3RlcD09IDB4JTA4eFxuIiwgdGVzdF9sYW5lX3N0ZXApOwoJCSAgICBwcmludGYoIlxudGVzdF9taW5fbWF4X2ZsYWc9PSAweCUwOHhcbiIsIHRlc3RfbWluX21heF9mbGFnKTsKaWYgKCBjaGFubmVsX2FfZW4pCnsKLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpOwp9CmlmICggY2hhbm5lbF9iX2VuKQp7Ck9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKTsKLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKfQoKCgovL3NhdmUgYW5kIHByaW50IG9yZyB0cmFpbmluZyBkcXMgdmFsdWUKaWYgKGNoYW5uZWxfYV9lbiB8fCBjaGFubmVsX2JfZW4pCnsKCS8vZGNhY2hlX2Rpc2FibGUoKTsKIC8vc2VyaWFsX3B1dHMoIlxuZGVidWcgZm9yIGRkcnRlc3QgLGppYXhpbmcgZGlzYWJsZSBkY2FjaGUiKTsKCn0vLy8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nIGRxcyB2YWx1ZQoKCmZvciAodGVzdF90aW1lcz0wOyh0ZXN0X3RpbWVzPHRlc3RfbG9vcCk7KHRlc3RfdGltZXMrKykpCnsKLy8vL3R1bmUgYW5kIHNhdmUgdHJhaW5pbmcgZHFzIHZhbHVlCmlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoKewoKewoKaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwp9CmVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCnsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKfQplbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCiB7CiByZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwogIH0KCgoKewoJcHJpbnRmKCJcbnNob3VsZCBwYXVzZSBkZGwgcGlyPT0gMHglMDh4LGlmIG5vIHBhdXNlIGRkbCAsd3JpdGUgbGNkbHIgc29tZSB0aW1lIG1heSBvY2NvdXIgZXJyb3JcbiIsIHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKIHdyaXRlbCgocmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpfCgxPDwyOSksKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKcHJpbnRmKCJcbiBwYXVzZSBkZGwgcGlyPT0gMHglMDh4XG4iLCByZWFkbChERFIwX1BVQl9SRUdfQkFTRSs0KSk7CmlmICh0ZXN0X2xhbmVfc3RlcD44KQoJdGVzdF9sYW5lX3N0ZXA9MDsKcHJpbnRmKCJcbnRlc3RfbGFuZV9zdGVwPT0weCUwOHhcbiAiLHRlc3RfbGFuZV9zdGVwKTsKCiAgcmVnX2FkZD1ERFIwX1BVQl9EWDBCRExSMCtyZWdfYmFzZV9hZGorKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVzdF9sYW5lX3N0ZXA+PjEpOwp0ZXN0X2xhbmVfc3RlcF9yZHFzX2ZsYWc9dGVzdF9sYW5lX3N0ZXAlMjsKdGVzdGluZ19sYW5lPSh0ZXN0X2xhbmVfc3RlcD4+MSk7CiBpZiAoIXRlc3RfbGFuZV9zdGVwX3JkcXNfZmxhZykKCXtyZWdfYWRkPXJlZ19hZGQrRERSMF9QVUJfRFgwTENETFIxLUREUjBfUFVCX0RYMEJETFIwOwoJfQogZWxzZQoJewoJI2lmICggQ09ORklHX0REUl9QSFk8UF9ERFJfUEhZXzkwNVgpCglyZWdfYWRkPXJlZ19hZGQrRERSMF9QVUJfRFgwTENETFIxLUREUjBfUFVCX0RYMEJETFIwOwoJI2Vsc2UKCXJlZ19hZGQ9cmVnX2FkZCtERFIwX1BVQl9EWDBMQ0RMUjMtRERSMF9QVUJfRFgwQkRMUjA7CgkjZW5kaWYKCgl9CgpkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPXJlYWRsKHJlZ19hZGQpOwpkcV9sY2RfYmRsX3JlZ19vcmc9ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKcHJpbnRmKCJcbnJlZ19hZGRfMHglMDh4PT0weCUwOHhcbiAiLHJlZ19hZGQsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSk7CiNpZiAoIENPTkZJR19ERFJfUEhZPFBfRERSX1BIWV85MDVYKQogaWYgKHRlc3RfbGFuZV9zdGVwX3JkcXNfZmxhZykKCXtkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPSgoKHJlYWRsKHJlZ19hZGQpKSYweGZmMDApPj44KTsKZHFfbGNkX2JkbF9yZWdfb3JnPWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7Cgl9CiBlbHNlCgl7ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT0oKChyZWFkbChyZWdfYWRkKSkmMHgwMGZmKT4+MCk7CmRxX2xjZF9iZGxfcmVnX29yZz1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoJfQojZW5kaWYKCmlmICh0ZXN0X21pbl9tYXhfZmxhZyA9PSAwKQp7CndoaWxlIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPjApCnsKdGVtcF90ZXN0X2Vycm9yPTA7CmRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUtLTsKcHJpbnRmKCJcbiBsZWZ0IHRlbXA9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSk7CgkgaWYgKCF0ZXN0X2xhbmVfc3RlcF9yZHFzX2ZsYWcpCgkJewoJCQkjaWYgKCBDT05GSUdfRERSX1BIWTxQX0REUl9QSFlfOTA1WCkKCQkgd3JpdGVsKChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwwKXwoKChyZWFkbChyZWdfYWRkKSkmMHhmZmZmMDApKSxyZWdfYWRkKTsKCQkJI2Vsc2UKCSB3cml0ZWwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSxyZWdfYWRkKTsKCQkJI2VuZGlmCgkJfQoJIGVsc2UKCQl7CgkJI2lmICggQ09ORklHX0REUl9QSFk8UF9ERFJfUEhZXzkwNVgpCgkJIHdyaXRlbCgoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PDE2KXwoKChyZWFkbChyZWdfYWRkKSkmMHhmZikpLHJlZ19hZGQpOwoJCSNlbHNlCgkJd3JpdGVsKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUscmVnX2FkZCk7CgkJICB3cml0ZWwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSxyZWdfYWRkK0REUjBfUFVCX0RYMExDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjMpOwoJCSAgI2VuZGlmCgkJfQoJIHByaW50ZigiXG4gcm1pbiByZWFkIHJlZz09MHglMDh4XG4gIiwocmVhZGwocmVnX2FkZCkpKTsKCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCglpZiAodGVtcF90ZXN0X2Vycm9yKQoJCXsKCQkvL3ByaW50ZigiXG53ZHFkIGxlZnQgZWRnZSBkZXRlY3QgXG4iKTsKCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKys7CgkJYnJlYWs7CgkJfQp9CnByaW50ZigiXG4gbGVmdCBlZGdlIGRldGVjdCBcbiIpOwpwcmludGYoIlxubGVmdCBlZGdlPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUpOwoKCmRxX2xjZF9iZGxfcmVnX2xlZnQ9ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKaWYgKHRlc3RfdGltZXMgPT0gMCkKZHFfbGNkX2JkbF9yZWdfbGVmdF9taW49ZHFfbGNkX2JkbF9yZWdfbGVmdDsKaWYgKGRxX2xjZF9iZGxfcmVnX2xlZnQ+ZHFfbGNkX2JkbF9yZWdfbGVmdF9taW4pICAvL3VwZGF0ZSB3ZHFkIG1pbiB2YWx1ZQp7CmRxX2xjZF9iZGxfcmVnX2xlZnRfbWluPWRxX2xjZF9iZGxfcmVnX2xlZnQJOwp9Cn0gZWxzZQp7CnByaW50ZigiXG4gbGVmdCBlZGdlIHNraXAgXG4iKTsKfQoKCSBpZiAoIXRlc3RfbGFuZV9zdGVwX3JkcXNfZmxhZykKCQl7CgkJCQkjaWYgKCBDT05GSUdfRERSX1BIWTxQX0REUl9QSFlfOTA1WCkKCQkgd3JpdGVsKChkcV9sY2RfYmRsX3JlZ19vcmc8PDApfCgoKHJlYWRsKHJlZ19hZGQpKSYweGZmZmYwMCkpLHJlZ19hZGQpOwoJCQkjZWxzZQoJIHdyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmcscmVnX2FkZCk7CgkJCSNlbmRpZgogICAvLyAgd3JpdGVsKGRxX2xjZF9iZGxfcmVnX29yZyxyZWdfYWRkKTsKCQl9CgkgZWxzZQoJCXsKCQkJCSNpZiAoIENPTkZJR19ERFJfUEhZPFBfRERSX1BIWV85MDVYKQoJCSB3cml0ZWwoKGRxX2xjZF9iZGxfcmVnX29yZzw8OCl8KGRxX2xjZF9iZGxfcmVnX29yZzw8MTYpfCgoKHJlYWRsKHJlZ19hZGQpKSYweGZmKSkscmVnX2FkZCk7CgkJI2Vsc2UKCQl3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnLHJlZ19hZGQpOwoJCSAgd3JpdGVsKGRxX2xjZF9iZGxfcmVnX29yZyxyZWdfYWRkK0REUjBfUFVCX0RYMExDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjMpOwoJCSAgI2VuZGlmCgkgLy8JICB3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnLHJlZ19hZGQpOwoJLy8JICB3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnLHJlZ19hZGQrRERSMF9QVUJfRFgwTENETFI0LUREUjBfUFVCX0RYMExDRExSMyk7CgkJfQoKZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT1kcV9sY2RfYmRsX3JlZ19vcmc7CgpwcmludGYoIlxuIHJlYWQgcmVnPT0weCUwOHhcbiAiLChyZWFkbChyZWdfYWRkKSkpOwoKd2hpbGUgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8RFFMQ0RMUl9NQVgpCnsKdGVtcF90ZXN0X2Vycm9yPTA7CmRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUrKzsKcHJpbnRmKCJcbiByaWcgdGVtcD09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKTsKIGlmICghdGVzdF9sYW5lX3N0ZXBfcmRxc19mbGFnKQoJCXsKCSAvL3dyaXRlbChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLHJlZ19hZGQpOwoJCQkJI2lmICggQ09ORklHX0REUl9QSFk8UF9ERFJfUEhZXzkwNVgpCgkJIHdyaXRlbCgoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8MCl8KCgocmVhZGwocmVnX2FkZCkpJjB4ZmZmZjAwKSkscmVnX2FkZCk7CgkJCSNlbHNlCgkgd3JpdGVsKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUscmVnX2FkZCk7CgkJCSNlbmRpZgoJCX0KCSBlbHNlCgkJewoJCQkJI2lmICggQ09ORklHX0REUl9QSFk8UF9ERFJfUEhZXzkwNVgpCgkJIHdyaXRlbCgoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PDE2KXwoKChyZWFkbChyZWdfYWRkKSkmMHhmZikpLHJlZ19hZGQpOwoJCSNlbHNlCgkJd3JpdGVsKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUscmVnX2FkZCk7CgkJICB3cml0ZWwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSxyZWdfYWRkK0REUjBfUFVCX0RYMExDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjMpOwoJCSAgI2VuZGlmCgkgLy8JICB3cml0ZWwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSxyZWdfYWRkKTsKCS8vCSAgd3JpdGVsKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUscmVnX2FkZCtERFIwX1BVQl9EWDBMQ0RMUjQtRERSMF9QVUJfRFgwTENETFIzKTsKCQl9CnByaW50ZigiXG4gciBtYXggcmVhZCByZWc9PTB4JTA4eFxuICIsKHJlYWRsKHJlZ19hZGQpKSk7Cgl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CglpZiAodGVtcF90ZXN0X2Vycm9yKQoJCXsKCQkvL3ByaW50ZigiXG53ZHFkIHJpZ2h0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZS0tOwoJCWJyZWFrOwoJCX0KfQpwcmludGYoIlxuIHJpZ2h0IGVkZ2UgZGV0ZWN0IFxuIik7CnByaW50ZigiXG4gcmlnaHQgZWRnZT09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKTsKCmRxX2xjZF9iZGxfcmVnX3JpZ2h0PWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7CmlmICh0ZXN0X3RpbWVzID09IDApCmRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbj1kcV9sY2RfYmRsX3JlZ19yaWdodDsKaWYgKGRxX2xjZF9iZGxfcmVnX3JpZ2h0PGRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbikgIC8vdXBkYXRlIHdkcWQgbWluIHZhbHVlCnsKZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluPWRxX2xjZF9iZGxfcmVnX3JpZ2h0CTsKfQoJIGlmICghdGVzdF9sYW5lX3N0ZXBfcmRxc19mbGFnKQoJCXsKCS8vIHdyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmcscmVnX2FkZCk7CgkJCQkJI2lmICggQ09ORklHX0REUl9QSFk8UF9ERFJfUEhZXzkwNVgpCgkJIHdyaXRlbCgoZHFfbGNkX2JkbF9yZWdfb3JnPDwwKXwoKChyZWFkbChyZWdfYWRkKSkmMHhmZmZmMDApKSxyZWdfYWRkKTsKCQkJI2Vsc2UKCSB3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnLHJlZ19hZGQpOwoJCQkjZW5kaWYKCQl9CgkgZWxzZQoJCXsKCQkJCQkJI2lmICggQ09ORklHX0REUl9QSFk8UF9ERFJfUEhZXzkwNVgpCgkJIHdyaXRlbCgoZHFfbGNkX2JkbF9yZWdfb3JnPDw4KXwoZHFfbGNkX2JkbF9yZWdfb3JnPDwxNil8KCgocmVhZGwocmVnX2FkZCkpJjB4ZmYpKSxyZWdfYWRkKTsKCQkjZWxzZQoJCXdyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmcscmVnX2FkZCk7CgkJICB3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnLHJlZ19hZGQrRERSMF9QVUJfRFgwTENETFI0LUREUjBfUFVCX0RYMExDRExSMyk7CgkJICAjZW5kaWYKCS8vIAkgIHdyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmcscmVnX2FkZCk7CgkvLwkgIHdyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmcscmVnX2FkZCtERFIwX1BVQl9EWDBMQ0RMUjQtRERSMF9QVUJfRFgwTENETFIzKTsKCQl9CgogcHJpbnRmKCJcbiByZWFkIHJlZz09MHglMDh4XG4gIiwocmVhZGwocmVnX2FkZCkpKTsKCXByaW50ZigiXG5lbmQgcGF1c2UgZGRsIHBpcj09IDB4JTA4eFxuIiwgcmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwogd3JpdGVsKCgocmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpJih+KDE8PDI5KSkpLChERFIwX1BVQl9SRUdfQkFTRSs0KSk7CnByaW50ZigiXG4gcmVzdW1lIGRkbCBwaXI9PSAweCUwOHhcbiIsIHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKfQoKCgogfQp9Cgp9CgpkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPShkcV9sY2RfYmRsX3JlZ19yaWdodF9taW48PDE2KXxkcV9sY2RfYmRsX3JlZ19sZWZ0X21pbjsKIGlmICghdGVzdF9sYW5lX3N0ZXBfcmRxc19mbGFnKQoJe2lmKGNoYW5uZWxfYV9lbil7CglkcV9sY2RfYmRsX3ZhbHVlX3dkcV9vcmdfYVt0ZXN0aW5nX2xhbmVdPWRxX2xjZF9iZGxfcmVnX29yZzsKCSBkcV9sY2RfYmRsX3ZhbHVlX3dkcV9taW5fYVt0ZXN0aW5nX2xhbmVdPWRxX2xjZF9iZGxfcmVnX2xlZnRfbWluOwoJIGRxX2xjZF9iZGxfdmFsdWVfd2RxX21heF9hW3Rlc3RpbmdfbGFuZV09ZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluOwoJfQppZiAoY2hhbm5lbF9iX2VuKQoJewoJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX29yZ19iW3Rlc3RpbmdfbGFuZV09ZHFfbGNkX2JkbF9yZWdfb3JnOwoJZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWluX2JbdGVzdGluZ19sYW5lXT1kcV9sY2RfYmRsX3JlZ19sZWZ0X21pbjsKCSBkcV9sY2RfYmRsX3ZhbHVlX3dkcV9tYXhfYlt0ZXN0aW5nX2xhbmVdPWRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbjsKCX0KCX0KIGVsc2UKCXsKCWlmIChjaGFubmVsX2FfZW4pIHsKCSBkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2FbdGVzdGluZ19sYW5lXT1kcV9sY2RfYmRsX3JlZ19vcmc7CglkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2FbdGVzdGluZ19sYW5lXT1kcV9sY2RfYmRsX3JlZ19sZWZ0X21pbjsKCSBkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2FbdGVzdGluZ19sYW5lXT1kcV9sY2RfYmRsX3JlZ19yaWdodF9taW47CgkJfQoJCWlmIChjaGFubmVsX2JfZW4pIHsKCSBkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2JbdGVzdGluZ19sYW5lXT1kcV9sY2RfYmRsX3JlZ19vcmc7CglkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2JbdGVzdGluZ19sYW5lXT1kcV9sY2RfYmRsX3JlZ19sZWZ0X21pbjsKCSBkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2JbdGVzdGluZ19sYW5lXT1kcV9sY2RfYmRsX3JlZ19yaWdodF9taW47CgkJfQoJfQoKIHJldHVybiBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoKdXNhZ2U6CgljbWRfdXNhZ2UoY21kdHApOwoJcmV0dXJuIDE7Cgp9CgovLy8qClVfQk9PVF9DTUQoCglkZHJfdHVuZV9kcXNfc3RlcCwJNiwJMSwJZG9fZGRyX3Rlc3RfZHFzX3dpbmRvd19zdGVwLAoJImRkcl90dW5lX2Rxc19zdGVwIGZ1bmN0aW9uIiwKCSJkZHJfdHVuZV9kcXNfc3RlcCBhIDAgMHg4MDAwMCAzIG9yIGRkcl90dW5lX2Rxc19zdGVwIGIgMCAweDgwMDAwIDUgXG4gZGNhY2hlIG9mZiA/IFxuIgopOwoKCmludCBkb19kZHJfdGVzdF9kcXNfd2luZG93KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewogcHJpbnRmKCJcbkVudGVyZGRyX3Rlc3RfZHFzX3dpbmRvdyBmdW5jdGlvblxuIik7CgkJICAgdW5zaWduZWQgaW50ICAgY2hhbm5lbF9hX2VuID0gMDsKCSAgIHVuc2lnbmVkIGludCAgIGNoYW5uZWxfYl9lbiA9IDA7CiAgLy8gdW5zaWduZWQgaW50ICAgcmVnX2FkZD0wOwogIC8vIHVuc2lnbmVkIGludCAgIHJlZ19iYXNlX2Fkaj0wOwoKCSAgdW5zaWduZWQgaW50ICAgbGFuZV9zdGVwPSAwOwoJICB1bnNpZ25lZCBpbnQgICByZWdfdmFsdWU9IDA7Ci8vaW50IGFyZ2MyOwovL2NoYXIgICAgICogIGFyZ3YyWzMwXTsKY2hhciAqZW5kcDsKCgkJaWYgKGFyZ2MgPT0gMikKCQl7CiAgICBpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSkKCgl7Y2hhbm5lbF9hX2VuID0gMTsKCX0KCWVsc2UgaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApfHwoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkpCgoJe2NoYW5uZWxfYl9lbiA9IDE7Cgl9CgoKCQl9CgkJaWYgKGFyZ2MgPiAyKQoJCXsKICAgIGlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJBIikgPT0gMCkpCgoJe2NoYW5uZWxfYV9lbiA9IDE7Cgl9CiAgICAgaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQiIpID09IDApKQoKCXtjaGFubmVsX2JfZW4gPSAxOwoJfQoJCQl9CnVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQkgICBkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwogIGlmIChhcmdjID4zKSB7CglkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgJmVuZHAsIDE2KTsKICAgICAgICBpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJCX0KCX0KLy9hcmdjMj01OwoJLy9mb3IoaSA9IDE7aTwoYXJnYyk7aSsrKQoJCXsKCQkvL2FyZ3YyW2ktMV09YXJndltpXTsKCQl9CgovL2FyZ3YyWzBdPWFyZ3ZbMV07Ci8vYXJndjJbMV09YXJndlsyXTsKLy9hcmd2MlsyXT1hcmd2WzNdOwpjaGFyIHN0clsxMDBdOwoKaWYgKGNoYW5uZWxfYV9lbikKewoKLy8qKGNoYXIgICAgICopKGFyZ3YyWzBdKT0iYSI7CgkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDExIGEgMCAweDgwMDAwICAiLDApOwoJIHByaW50ZigiXG50ZXN0IGRxcyB3aW5kb3cgbGFuZSBhXG4iKTsKZm9yICgobGFuZV9zdGVwPTApOyhsYW5lX3N0ZXA8OCk7KGxhbmVfc3RlcCsrKSkKewovL3NwcmludGYoYXJndjJbM10sImQlIiwoIGxhbmVfc3RlcCkpOwovL2l0b2FfZGRyX3Rlc3QobGFuZV9zdGVwLChhcmd2MlszXSksMTApOwovL3ByaW50ZigiXG5hcmd2MlslZF09JXNcbiIsMCxhcmd2MlswXSk7Ci8vCXByaW50ZigiXG5hcmd2MlslZF09JXNcbiIsMyxhcmd2MlszXSk7CgkvLyByZWdfdmFsdWU9ZG9fZGRyX3Rlc3RfZHFzX3dpbmRvd19zdGVwKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCXNwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYSAwIDB4JTA4eCAlZCIsZGRyX3Rlc3Rfc2l6ZSwoIGxhbmVfc3RlcCkpOwoJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJLy9zcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGIgMCAweDgwMDAwICVkIiwoIGxhbmVfc3RlcCkpOwoJLy9wcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CglydW5fY29tbWFuZChzdHIsMCk7Cgp9Cn0KCgppZiAoY2hhbm5lbF9iX2VuKQp7Ly8qKGNoYXIgICAgICopKGFyZ3YyWzBdKT0iYiI7CgkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDExIGEgMCAweDgwMDAwICAiLDApOwoJIHByaW50ZigiXG50ZXN0IGRxcyB3aW5kb3cgbGFuZSBiXG4iKTsKZm9yICgobGFuZV9zdGVwPTApOyhsYW5lX3N0ZXA8OCk7KGxhbmVfc3RlcCsrKSkKewoJLy9zcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGEgMCAweDgwMDAwICVkIiwoIGxhbmVfc3RlcCkpOwoJLy9wcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CglzcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGIgMCAweCUwOHggJWQiLGRkcl90ZXN0X3NpemUsKCBsYW5lX3N0ZXApKTsKCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCXJ1bl9jb21tYW5kKHN0ciwwKTsKCn0KfQoKaWYgKGNoYW5uZWxfYV9lbikKewpmb3IgKChsYW5lX3N0ZXA9MCk7KGxhbmVfc3RlcDw0KTsobGFuZV9zdGVwKyspKQp7CnByaW50ZigiXG4gYV9sYW5lXzB4JTA4eHx3ZHFfb3JnIDB4JTA4eCAgfHdkcV9taW4gMHglMDh4IHx3ZHFfbWF4IDB4JTA4eCA6OnxyZHFzX29yZyAgMHglMDh4ICB8cmRxc19taW4gMHglMDh4IHxyZHFzX21heCAweCUwOHggIFxuIiwKbGFuZV9zdGVwLApkcV9sY2RfYmRsX3ZhbHVlX3dkcV9vcmdfYVtsYW5lX3N0ZXBdLApkcV9sY2RfYmRsX3ZhbHVlX3dkcV9taW5fYVtsYW5lX3N0ZXBdLGRxX2xjZF9iZGxfdmFsdWVfd2RxX21heF9hW2xhbmVfc3RlcF0sCmRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVtsYW5lX3N0ZXBdLApkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2FbbGFuZV9zdGVwXSxkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2FbbGFuZV9zdGVwXSk7Cn19CmlmIChjaGFubmVsX2JfZW4pCnsKZm9yICgobGFuZV9zdGVwPTApOyhsYW5lX3N0ZXA8NCk7KGxhbmVfc3RlcCsrKSkKewpwcmludGYoIlxuIGJfbGFuZV8weCUwOHh8d2RxX29yZyAweCUwOHggIHx3ZHFfbWluIDB4JTA4eCB8d2RxX21heCAweCUwOHggOjp8cmRxc19vcmcgIDB4JTA4eCAgfHJkcXNfbWluIDB4JTA4eCB8cmRxc19tYXggMHglMDh4ICBcbiIsCmxhbmVfc3RlcCwKZHFfbGNkX2JkbF92YWx1ZV93ZHFfb3JnX2JbbGFuZV9zdGVwXSwKZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWluX2JbbGFuZV9zdGVwXSxkcV9sY2RfYmRsX3ZhbHVlX3dkcV9tYXhfYltsYW5lX3N0ZXBdLApkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2JbbGFuZV9zdGVwXSwKZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21pbl9iW2xhbmVfc3RlcF0sZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21heF9iW2xhbmVfc3RlcF0pOwp9fQoKcmV0dXJuIHJlZ192YWx1ZTsKfQoKLyoKVV9CT09UX0NNRCgKCWRkcl90dW5lX2Rxc19zdGVwLAk1LAkxLAlkb19kZHJfdGVzdF9maW5lX3R1bmVfZHFzX3N0ZXAsCgkiZGRyX3R1bmVfZHFzX3N0ZXAgZnVuY3Rpb24iLAoJImRkcl90dW5lX2Rxc19zdGVwIGEgMCAweDgwMDAwMCAzIG9yIGRkcl90dW5lX2Rxc19zdGVwIGIgMCAweDgwMDAwMCA1IG9yIGRkcl90dW5lX2Rxc19zdGVwIGEgYiAweDgwMDAwMCBsXG4gZGNhY2hlIG9mZiA/IFxuIgopOwoqLwoKaW50IGRvX2Rkcl90ZXN0X2ZpbmVfdHVuZV9kcXNfc3RlcChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKICAgcHJpbnRmKCJcbkVudGVyIFR1bmUgZGRyIGRxcyBzdGVwIGZ1bmN0aW9uXG4iKTsKIC8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKICBwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CiAvLyAgdW5zaWduZWQgaW50ICAgbG9vcCA9IDE7CiAgIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaSA9IDE7CiAgIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaj0gMTsKCXVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaz0gMTsKICAgdW5zaWduZWQgaW50ICAgdGVtcF90ZXN0X2Vycm9yPSAwOwoKCgkgY2hhciAqZW5kcDsKIC8vICB1bnNpZ25lZCBpbnQgICAqcF9zdGFydF9hZGRyOwogICB1bnNpZ25lZCBpbnQgICB0ZXN0X2xhbmVfc3RlcD0wOwogdW5zaWduZWQgaW50ICAgdGVzdF9sYW5lX3N0ZXBfcmRxc19mbGFnPTA7CiAgdW5zaWduZWQgaW50ICAgdGVzdF9sb29wPTE7CiAgIHVuc2lnbmVkIGludCAgIHRlc3RfdGltZXM9MTsKICAgdW5zaWduZWQgaW50ICAgcmVnX2FkZD0wOwogICB1bnNpZ25lZCBpbnQgICByZWdfYmFzZV9hZGo9MDsKCQkgIHVuc2lnbmVkIGludCAgIGNoYW5uZWxfYV9lbiA9IDA7CgkgICB1bnNpZ25lZCBpbnQgICBjaGFubmVsX2JfZW4gPSAwOwoJICAgdW5zaWduZWQgaW50ICAgdGVzdGluZ19jaGFubmVsID0gMDsKCgkgI2RlZmluZSAgREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEggIDEyCgoJICNkZWZpbmUgIERBVFg4X0RRX0xBTkVfV0lEVEggIDQKCSAjZGVmaW5lICBDSEFOTkVMX0NIQU5ORUxfV0lEVEggIDIKCgkgICNkZWZpbmUgIENIQU5ORUxfQSAgMAoJICAjZGVmaW5lICBDSEFOTkVMX0IgIDEKCgoKCSNkZWZpbmUgIERBVFg4X0RRX0xBTkVfTEFORTAwICAwCgkjZGVmaW5lICBEQVRYOF9EUV9MQU5FX0xBTkUwMSAgMQoJI2RlZmluZSAgREFUWDhfRFFfTEFORV9MQU5FMDIgIDIKCSNkZWZpbmUgIERBVFg4X0RRX0xBTkVfTEFORTAzICAzCgoJICNkZWZpbmUgIERBVFg4X0RRX0JETFIwICAwCgkgI2RlZmluZSAgREFUWDhfRFFfQkRMUjEgIDEKCSAjZGVmaW5lICBEQVRYOF9EUV9CRExSMiAgMgoJICNkZWZpbmUgIERBVFg4X0RRX0JETFIzICAzCgkgI2RlZmluZSAgREFUWDhfRFFfQkRMUjQgIDQKCSAjZGVmaW5lICBEQVRYOF9EUV9CRExSNSAgNQoJICNkZWZpbmUgIERBVFg4X0RRX0JETFI2ICA2CgkgI2RlZmluZSAgREFUWDhfRFFfRFhOTENETFIwICAgICA3CgkgI2RlZmluZSAgREFUWDhfRFFfRFhOTENETFIxICAgICA4CgkgI2RlZmluZSAgREFUWDhfRFFfRFhOTENETFIyICAgICA5CgkgI2RlZmluZSAgREFUWDhfRFFfRFhOTURMUiAgICAgICAgMTAKCSAjZGVmaW5lICBEQVRYOF9EUV9EWE5HVFIgICAgICAgICAgMTEKCgoJICNkZWZpbmUgIEREUl9DT1JTU19UQUxLX1RFU1RfU0laRSAgIDB4MjAwMDAKCgkgI2RlZmluZSAgRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMICBEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCpEQVRYOF9EUV9MQU5FX1dJRFRICgkJI2RlZmluZSAgRFFfTENEX0JETF9SRUdfTlVNICAgIERRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCpDSEFOTkVMX0NIQU5ORUxfV0lEVEgKCgkgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX29yZ1tEUV9MQ0RfQkRMX1JFR19OVU1dOwoJICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19sZWZ0W0RRX0xDRF9CRExfUkVHX05VTV07CgkgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX3JpZ2h0W0RRX0xDRF9CRExfUkVHX05VTV07CgkgICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19pbmRleFtEUV9MQ0RfQkRMX1JFR19OVU1dOwoKCSAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfbGVmdF9taW5bRFFfTENEX0JETF9SRUdfTlVNXTsKCSAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluW0RRX0xDRF9CRExfUkVHX05VTV07CgoJICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCSAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzOwoJICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ7CgkgICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkOwoJICAvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzbmQ7CgkgICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWU7CgkgICAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZTsKCS8vICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM7CgkvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkOwoJLy8gICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkOwoKCSAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmOwoJICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWc7CgkgICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19jZW50ZXI7CgkgICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ193aW5kb3dzOwoJICAgICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19jZW50ZXJfbWluOwoJICAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfd2luZG93c19taW47CgoJICAgIHVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCgoKCSBpZiAoYXJnYyA9PSAyKQoJCXsKICAgIGlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApKQoKCXtjaGFubmVsX2FfZW4gPSAxOwoJfQoJZWxzZSBpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCl8fChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSkKCgl7Y2hhbm5lbF9iX2VuID0gMTsKCX0KCWVsc2UKCQl7Cglnb3RvIHVzYWdlOwoJCX0KCQl9CgkJaWYgKGFyZ2MgPiAyKQoJCXsKICAgIGlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJBIikgPT0gMCkpCgoJe2NoYW5uZWxfYV9lbiA9IDE7Cgl9CiAgICAgaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQiIpID09IDApKQoKCXtjaGFubmVsX2JfZW4gPSAxOwoJfQoJCQl9CgkJICAgZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKICBpZiAoYXJnYyA+MykgewoJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sICZlbmRwLCAxNik7CiAgICAgICAgaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQlkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJCQl9CgoJfQogICAgaWYgKGFyZ2MgPjQpIHsKCQkgdGVzdF9sYW5lX3N0ZXAgPSAwOwoJdGVzdF9sYW5lX3N0ZXAgPSBzaW1wbGVfc3RydG91bChhcmd2WzRdLCAmZW5kcCwgMTYpOwogICAgICAgIGlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJdGVzdF9sYW5lX3N0ZXAgPSAwOwoJCQl9CgkJIGlmICAgKChzdHJjbXAoYXJndls0XSwgImwiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbNF0sICJMIikgPT0gMCkpCgkJCXsKCQkJdGVzdF9sYW5lX3N0ZXAgPSAwOwoJCQl9Cgl9Cgl0ZXN0X2xvb3A9MTsKCgkJIHByaW50ZigiXG5jaGFubmVsX2FfZW49PSAweCUwOHhcbiIsIGNoYW5uZWxfYV9lbik7CgkJIHByaW50ZigiXG5jaGFubmVsX2JfZW49PSAweCUwOHhcbiIsIGNoYW5uZWxfYl9lbik7CgkJICBwcmludGYoIlxuZGRyX3Rlc3Rfc2l6ZT09IDB4JTA4eFxuIiwgZGRyX3Rlc3Rfc2l6ZSk7CgkJICAgcHJpbnRmKCJcbnRlc3RfbGFuZV9zdGVwPT0gMHglMDh4XG4iLCB0ZXN0X2xhbmVfc3RlcCk7CgkJICAgIHByaW50ZigiXG50ZXN0X2xvb3A9PSAweCUwOHhcbiIsIHRlc3RfbG9vcCk7CmlmICggY2hhbm5lbF9hX2VuKQp7Ci8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7Ck9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKTsKfQppZiAoIGNoYW5uZWxfYl9lbikKewpPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCk7Ci8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7Cn0KCgoKLy9zYXZlIGFuZCBwcmludCBvcmcgdHJhaW5pbmcgZHFzIHZhbHVlCmlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQp7CgoKCS8vZGNhY2hlX2Rpc2FibGUoKTsKIC8vc2VyaWFsX3B1dHMoIlxuZGVidWcgZm9yIGRkcnRlc3QgLGppYXhpbmcgZGlzYWJsZSBkY2FjaGUiKTsKCnsKZm9yICgodGVzdGluZ19jaGFubmVsPTApOyh0ZXN0aW5nX2NoYW5uZWw8KGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pKTsodGVzdGluZ19jaGFubmVsKyspKQp7CmlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCnsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKfQplbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQp7CnJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7Cn0KZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQogewppZiAoIHRlc3RpbmdfY2hhbm5lbCA9PSBDSEFOTkVMX0EpCiAgIHsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKICAgfQplbHNlIGlmKCB0ZXN0aW5nX2NoYW5uZWw9PUNIQU5ORUxfQikKICAgewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwogICB9CiB9Cgpmb3IgKCh0ZW1wX2NvdW50X2k9MCk7KHRlbXBfY291bnRfaTxEQVRYOF9EUV9MQU5FX1dJRFRIKTsodGVtcF9jb3VudF9pKyspKQogICB7CgogICBpZiAodGVtcF9jb3VudF9pID09IERBVFg4X0RRX0xBTkVfTEFORTAwKQoJewogICByZWdfYWRkPUREUjBfUFVCX0RYMEJETFIwK3JlZ19iYXNlX2Fkajt9CgoJICBlbHNlICAgIGlmKHRlbXBfY291bnRfaT09REFUWDhfRFFfTEFORV9MQU5FMDEpCgl7CiAgIHJlZ19hZGQ9RERSMF9QVUJfRFgxQkRMUjArcmVnX2Jhc2VfYWRqO30KCgllbHNlICAgCSBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAyKQoJewogICByZWdfYWRkPUREUjBfUFVCX0RYMkJETFIwK3JlZ19iYXNlX2Fkajt9CgkgZWxzZSAgICBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAzKQoJewogICByZWdfYWRkPUREUjBfUFVCX0RYM0JETFIwK3JlZ19iYXNlX2Fkajt9CgoKCiAgICAgICBmb3IgKCh0ZW1wX2NvdW50X2o9MCk7KHRlbXBfY291bnRfajxEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCk7KHRlbXBfY291bnRfaisrKSkKCSAgIHsKCQlkcV9sY2RfYmRsX3JlZ19vcmdbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrdGVtcF9jb3VudF9qXT1yZWFkbChyZWdfYWRkKzQqdGVtcF9jb3VudF9qKTsKZHFfbGNkX2JkbF9yZWdfaW5kZXhbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrdGVtcF9jb3VudF9qXT1yZWdfYWRkKzQqdGVtcF9jb3VudF9qOwoJCXByaW50ZigiXG4gb3JnIGFkZCAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCs0KnRlbXBfY291bnRfaiksIChkcV9sY2RfYmRsX3JlZ19vcmdbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrdGVtcF9jb3VudF9qXSkpOwpkcV9sY2RfYmRsX3JlZ19sZWZ0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCt0ZW1wX2NvdW50X2pdCiA9ZHFfbGNkX2JkbF9yZWdfb3JnW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK3RlbXBfY291bnRfal07CmRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCt0ZW1wX2NvdW50X2pdCiA9ZHFfbGNkX2JkbF9yZWdfb3JnW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK3RlbXBfY291bnRfal07CgoJICAgfQoJfQoKfQoKfQoKfS8vLy9zYXZlIGFuZCBwcmludCBvcmcgdHJhaW5pbmcgZHFzIHZhbHVlCgoKZm9yICh0ZXN0X3RpbWVzPTA7KHRlc3RfdGltZXM8dGVzdF9sb29wKTsodGVzdF90aW1lcysrKSkKewovLy8vdHVuZSBhbmQgc2F2ZSB0cmFpbmluZyBkcXMgdmFsdWUKaWYgKGNoYW5uZWxfYV9lbiB8fCBjaGFubmVsX2JfZW4pCgp7CmZvciAoKHRlc3RpbmdfY2hhbm5lbD0wKTsodGVzdGluZ19jaGFubmVsPChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKSk7KHRlc3RpbmdfY2hhbm5lbCsrKSkKewoKaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwp9CmVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCnsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKfQplbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCiB7CmlmICggdGVzdGluZ19jaGFubmVsID09IENIQU5ORUxfQSkKICAgewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwogICB9CmVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQogICB7CnJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CiAgIH0KIH0KCmZvciAoKHRlbXBfY291bnRfaT0wKTsodGVtcF9jb3VudF9pPERBVFg4X0RRX0xBTkVfV0lEVEgpOyh0ZW1wX2NvdW50X2krKykpCnsKaWYgKHRlc3RfbGFuZV9zdGVwPjgpCgl0ZXN0X2xhbmVfc3RlcD0wOwppZiAodGVzdF9sYW5lX3N0ZXApCnsKcHJpbnRmKCJcbnRlc3RfbGFuZV9zdGVwPT0weCUwOHhcbiAiLHRlc3RfbGFuZV9zdGVwKTsKdGVtcF9jb3VudF9pPSh0ZXN0X2xhbmVfc3RlcD4+MSk7CnRlc3RfbGFuZV9zdGVwX3JkcXNfZmxhZz10ZXN0X2xhbmVfc3RlcC0odGVtcF9jb3VudF9pPDwxKTsKdGVzdF9sYW5lX3N0ZXA9MDsKfQogICB7CiAgIHByaW50ZigiXG50ZXN0IGxhbmU9PTB4JTA4eFxuICIsdGVtcF9jb3VudF9pKTsKICAgaWYgKHRlbXBfY291bnRfaSA9PSBEQVRYOF9EUV9MQU5FX0xBTkUwMCkKCXsKICAgcmVnX2FkZD1ERFIwX1BVQl9EWDBCRExSMCtyZWdfYmFzZV9hZGo7fQoKCSAgZWxzZSAgICBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAxKQoJewogICByZWdfYWRkPUREUjBfUFVCX0RYMUJETFIwK3JlZ19iYXNlX2Fkajt9CgoJZWxzZSAgIAkgaWYodGVtcF9jb3VudF9pPT1EQVRYOF9EUV9MQU5FX0xBTkUwMikKCXsKICAgcmVnX2FkZD1ERFIwX1BVQl9EWDJCRExSMCtyZWdfYmFzZV9hZGo7fQoJIGVsc2UgICAgaWYodGVtcF9jb3VudF9pPT1EQVRYOF9EUV9MQU5FX0xBTkUwMykKCXsKICAgcmVnX2FkZD1ERFIwX1BVQl9EWDNCRExSMCtyZWdfYmFzZV9hZGo7fQp9CgogIGZvciAoKHRlbXBfY291bnRfaz0wKTsodGVtcF9jb3VudF9rPDIpOyh0ZW1wX2NvdW50X2srKykpCgkgICB7CiAgICAgaWYgKHRlc3RfbGFuZV9zdGVwX3JkcXNfZmxhZykKCQl7CgkJdGVtcF9jb3VudF9rPTE7Cgl0ZXN0X2xhbmVfc3RlcF9yZHFzX2ZsYWc9MDsKCQl9CmlmICh0ZW1wX2NvdW50X2sgPT0gMCkKewogIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPXJlYWRsKHJlZ19hZGQrNCpEQVRYOF9EUV9EWE5MQ0RMUjEpOwoJICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkPShkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxcyYweGZmKTsKCSAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q9KChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxcyYweGZmMDApKT4+ODsKCSAvLyAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzbmQ9KChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxcyYweGZmMDAwMCkpPj4xNjsKCndoaWxlIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ+MCkKewp0ZW1wX3Rlc3RfZXJyb3I9MDsKZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkLS07CnByaW50ZigiXG53ZHFkIGxlZnQgdGVtcD09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQpOwoJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZHwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDE2KSk7Cgkgd3JpdGVsKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzLChyZWdfYWRkKzQqREFUWDhfRFFfRFhOTENETFIxKSk7Cgl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgoJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQl7CgkJLy9wcmludGYoIlxud2RxZCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkKys7CgkJYnJlYWs7CgkJfQp9CnByaW50ZigiXG53ZHFkIGxlZnQgZWRnZSBkZXRlY3QgXG4iKTsKcHJpbnRmKCJcbndkcWQgbGVmdCBlZGdlPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZCk7CmRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPShkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWR8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDgpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDwxNikpOwovL29ubHkgdXBkYXRlIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZApkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPWRxX2xjZF9iZGxfcmVnX2xlZnRbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXTsKZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9KChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlJjB4MDApfGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZCk7CmRxX2xjZF9iZGxfcmVnX2xlZnRbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXT1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxczsKCgpkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWU9ZHFfbGNkX2JkbF9yZWdfbGVmdF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXTsKaWYgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZD4oZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlJjB4ZmYpKSAgLy91cGRhdGUgd2RxZCBtaW4gdmFsdWUKewpkcV9sY2RfYmRsX3JlZ19sZWZ0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdCj0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZSYweGZmZmYwMCl8ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkKQk7Cn0KCgp3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0sKHJlZ19hZGQrNCpEQVRYOF9EUV9EWE5MQ0RMUjEpKTsKCiBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz1yZWFkbChyZWdfYWRkKzQqREFUWDhfRFFfRFhOTENETFIxKTsKCSAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZD0oZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXMmMHhmZik7CgkgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPSgoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXMmMHhmZjAwKSk+Pjg7CgoKd2hpbGUgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZDwweGZmKQp7CnRlbXBfdGVzdF9lcnJvcj0wOwpkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQrKzsKcHJpbnRmKCJcbndkcWQgcmlnIHRlbXA9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkKTsKCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPShkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWR8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDgpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDwxNikpOwoJIHdyaXRlbChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxcywocmVnX2FkZCs0KkRBVFg4X0RRX0RYTkxDRExSMSkpOwoJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQl7CgkJLy9wcmludGYoIlxud2RxZCByaWdodCBlZGdlIGRldGVjdCBcbiIpOwoJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZC0tOwoJCWJyZWFrOwoJCX0KfQpwcmludGYoIlxud2RxZCByaWdodCBlZGdlIGRldGVjdCBcbiIpOwpwcmludGYoIlxud2RxZCByaWdodCBlZGdlPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZCk7CmRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPShkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWR8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDgpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDwxNikpOwovL29ubHkgdXBkYXRlIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZApkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPWRxX2xjZF9iZGxfcmVnX3JpZ2h0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV07CmRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPSgoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSYweDAwKXxkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQpOwoKZHFfbGNkX2JkbF9yZWdfcmlnaHRbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXT1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxczsKCmRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZT1kcV9sY2RfYmRsX3JlZ19yaWdodF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXTsKaWYgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZDwoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlJjB4ZmYpKSAgLy91cGRhdGUgd2RxZCBtaW4gdmFsdWUKewpkcV9sY2RfYmRsX3JlZ19yaWdodF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXQo9KChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWUmMHhmZmZmMDApfGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZCkJOwp9CgoKCndyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmdbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSwocmVnX2FkZCs0KkRBVFg4X0RRX0RYTkxDRExSMSkpOwoKCn0KZWxzZSBpZih0ZW1wX2NvdW50X2s9PTEpCnsKCiBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz1yZWFkbChyZWdfYWRkKzQqREFUWDhfRFFfRFhOTENETFIxKTsKCSAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZD0oZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXMmMHhmZik7CgkgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPSgoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXMmMHhmZjAwKSk+Pjg7Cgp3aGlsZSAoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZD4wKQp7CnRlbXBfdGVzdF9lcnJvcj0wOwpkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkLS07CnByaW50ZigiXG5yZHFzZCBsZWZ0IHRlbXA9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZCk7CglkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz0oZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8MTYpKTsKCSB3cml0ZWwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXMsKHJlZ19hZGQrNCpEQVRYOF9EUV9EWE5MQ0RMUjEpKTsKCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJewoJCS8vcHJpbnRmKCJcbnJkcXNkIGxlZnQgZWRnZSBkZXRlY3QgXG4iKTsKCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkKys7CgkJYnJlYWs7CgkJfQp9CnByaW50ZigiXG5yZHFzZCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CnByaW50ZigiXG5yZHFzZCBsZWZ0IGVkZ2U9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZCk7CmRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPShkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWR8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDgpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDwxNikpOwovL29ubHkgdXBkYXRlIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2QgcmRxc25kCmRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9ZHFfbGNkX2JkbF9yZWdfbGVmdFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdOwpkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUmMHgwMDAwZmYpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8MTYpKTsKCmRxX2xjZF9iZGxfcmVnX2xlZnRbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXT1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxczsKCgpkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWU9ZHFfbGNkX2JkbF9yZWdfbGVmdF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXTsKaWYgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q+KChkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWU+PjgpJjB4ZmYpKSAgLy91cGRhdGUgd2RxZCBtaW4gdmFsdWUKewpkcV9sY2RfYmRsX3JlZ19sZWZ0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdCj0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZSYweGZmKXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDE2KSkJOwp9CgoKd3JpdGVsKGRxX2xjZF9iZGxfcmVnX29yZ1t0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdLChyZWdfYWRkKzQqREFUWDhfRFFfRFhOTENETFIxKSk7CgogZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9cmVhZGwocmVnX2FkZCs0KkRBVFg4X0RRX0RYTkxDRExSMSk7CgkgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzJjB4ZmYpOwoJICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZD0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzJjB4ZmYwMCkpPj44OwoKd2hpbGUgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8MHhmZikKewp0ZW1wX3Rlc3RfZXJyb3I9MDsKZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZCsrOwpwcmludGYoIlxucmRxc2QgcmlnaHQgdGVtcD09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkKTsKCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPShkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWR8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDgpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDwxNikpOwoJIHdyaXRlbChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxcywocmVnX2FkZCs0KkRBVFg4X0RRX0RYTkxDRExSMSkpOwoJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQl7CgkJLy9wcmludGYoIlxucmRxc2QgcmlnaHQgZWRnZSBkZXRlY3QgXG4iKTsKCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkLS07CgkJYnJlYWs7CgkJfQp9CnByaW50ZigiXG5yZHFzZCByaWdodCBlZGdlIGRldGVjdCBcbiIpOwpwcmludGYoIlxucmRxc2QgcmlnaHQgZWRnZT09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkKTsKZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZHwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDE2KSk7Ci8vb25seSB1cGRhdGUgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZCByZHFzbmQKZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT1kcV9sY2RfYmRsX3JlZ19yaWdodFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdOwpkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUmMHgwMDAwZmYpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8MTYpKTsKZHFfbGNkX2JkbF9yZWdfcmlnaHRbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXT1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxczsKCgpkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWU9ZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV07CmlmIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlPj44KSYweGZmKSkgIC8vdXBkYXRlIHdkcWQgbWluIHZhbHVlCnsKZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0KPSgoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlJjB4ZmYpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8MTYpKQk7Cn0KCgoKd3JpdGVsKGRxX2xjZF9iZGxfcmVnX29yZ1t0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdLChyZWdfYWRkKzQqREFUWDhfRFFfRFhOTENETFIxKSk7CgoKCgogICB9CgogfQp9Cgp9Cn0KCi8vLy90dW5lIGFuZCBzYXZlIHRyYWluaW5nIGRxcyB2YWx1ZQoKCgoKLy8vL2NhbGN1bGF0ZSBhbmQgcHJpbnQgIGRxcyB2YWx1ZQpmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCnsKaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwp9CmVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCnsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKfQplbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCiB7CmlmICggdGVzdGluZ19jaGFubmVsID09IENIQU5ORUxfQSkKICAgewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwogICB9CmVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQogICB7CnJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CiAgIH0KIH0KcmVnX2FkZD1ERFIwX1BVQl9EWDBCRExSMCtyZWdfYmFzZV9hZGo7CgoKICBmb3IgKCh0ZW1wX2NvdW50X2o9MCk7KHRlbXBfY291bnRfajxEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwpOyh0ZW1wX2NvdW50X2orKykpCgkgICB7CgkgLy8gIGRxX2xjZF9iZGxfcmVnX2luZGV4W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK3RlbXBfY291bnRfal09cmVnX2FkZCs0KnRlbXBfY291bnRfajsKCgkJcHJpbnRmKCJcbiBvcmcgYWRkICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChkcV9sY2RfYmRsX3JlZ19pbmRleFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfal0pLCAoZHFfbGNkX2JkbF9yZWdfb3JnW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9qXSkpOwoJICAgfQoKICBmb3IgKCh0ZW1wX2NvdW50X2o9MCk7KHRlbXBfY291bnRfajxEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwpOyh0ZW1wX2NvdW50X2orKykpCgkgICB7CgkJcHJpbnRmKCJcbiBsZWYgYWRkICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChkcV9sY2RfYmRsX3JlZ19pbmRleFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfal0pLCAoZHFfbGNkX2JkbF9yZWdfbGVmdFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfal0pKTsKCSAgIH0KCiAgZm9yICgodGVtcF9jb3VudF9qPTApOyh0ZW1wX2NvdW50X2o8RFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMKTsodGVtcF9jb3VudF9qKyspKQoJICAgewoJCXByaW50ZigiXG4gcmlnIGFkZCAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwoZHFfbGNkX2JkbF9yZWdfaW5kZXhbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2pdKSwgKGRxX2xjZF9iZGxfcmVnX3JpZ2h0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9qXSkpOwoJICAgfQoKcHJpbnRmKCJcbiBkZHJ0ZXN0IHNpemUgPT0weCUwOHgsIHRlc3QgdGltZXM9PTB4JTA4eCx0ZXN0X2xvb3A9PTB4JTA4eFxuIixkZHJfdGVzdF9zaXplLCh0ZXN0X3RpbWVzKzEpLHRlc3RfbG9vcCk7CnByaW50ZigiXG4gYWRkICAweDAwMDAwMDAwIHJlZz09ICAgIG9yZyAgICAgICAgICAgbGVmICAgICAgICAgICByaWcgICAgICAgICAgIGNlbnRlciAgICAgICAgd2luICAgICAgICAgICBsZWZfbSAgICAgICAgIHJpZ19tICAgICAgICAgbWluX2MgICAgICAgICBtaW5fd2luICAgICAgICBcbiIpOwpmb3IgKCh0ZW1wX2NvdW50X2k9MCk7KHRlbXBfY291bnRfaTxEQVRYOF9EUV9MQU5FX1dJRFRIKTsodGVtcF9jb3VudF9pKyspKQp7CiAgIHsKCiAgIGlmICh0ZW1wX2NvdW50X2kgPT0gREFUWDhfRFFfTEFORV9MQU5FMDApCgl7CiAgIHJlZ19hZGQ9RERSMF9QVUJfRFgwQkRMUjArcmVnX2Jhc2VfYWRqK0RBVFg4X0RRX0RYTkxDRExSMSo0O30KCgkgIGVsc2UgICAgaWYodGVtcF9jb3VudF9pPT1EQVRYOF9EUV9MQU5FX0xBTkUwMSkKCXsKICAgcmVnX2FkZD1ERFIwX1BVQl9EWDFCRExSMCtyZWdfYmFzZV9hZGorREFUWDhfRFFfRFhOTENETFIxKjQ7fQoKCWVsc2UgICAJIGlmKHRlbXBfY291bnRfaT09REFUWDhfRFFfTEFORV9MQU5FMDIpCgl7CiAgIHJlZ19hZGQ9RERSMF9QVUJfRFgyQkRMUjArcmVnX2Jhc2VfYWRqK0RBVFg4X0RRX0RYTkxDRExSMSo0O30KCSBlbHNlICAgIGlmKHRlbXBfY291bnRfaT09REFUWDhfRFFfTEFORV9MQU5FMDMpCgl7CiAgIHJlZ19hZGQ9RERSMF9QVUJfRFgzQkRMUjArcmVnX2Jhc2VfYWRqK0RBVFg4X0RRX0RYTkxDRExSMSo0O30KfQoKZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWY9KGRxX2xjZF9iZGxfcmVnX2xlZnRbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSk7CmRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnPShkcV9sY2RfYmRsX3JlZ19yaWdodFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKTsKCmlmICh0ZXN0X3RpbWVzID09IDApCnsKKGRxX2xjZF9iZGxfcmVnX2xlZnRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0pPWRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmOwooZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0pPWRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnOwoKfQpkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWU9KGRxX2xjZF9iZGxfcmVnX2xlZnRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0pOwpkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWU9KGRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKTsKCgovL2RxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZD0oZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSYweDAwMDBmZik7CiAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfY2VudGVyPSggKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWYmMHhmZikrKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnJjB4ZmYpKS8yKQogICB8KCgoKChkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZj4+OCkmMHhmZikrKChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZz4+OCkmMHhmZikpLzIpPDw4KQoJfCgoKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWY+PjE2KSYweGZmKSsoKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnPj44KSYweGZmKSkvMik8PDE2KSApOwoKICAgZHFfbGNkX2JkbF90ZW1wX3JlZ193aW5kb3dzPSggKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWcmMHhmZiktKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmJjB4ZmYpKSkKICAgfCgoKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWc+PjgpJjB4ZmYpLSgoZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWY+PjgpJjB4ZmYpKSk8PDgpCgl8KCgoKChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZz4+MTYpJjB4ZmYpLSgoZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWY+PjgpJjB4ZmYpKSk8PDE2KSApOwoKCgkgIGRxX2xjZF9iZGxfdGVtcF9yZWdfY2VudGVyX21pbj0oICgoKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZSYweGZmKSsoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlJjB4ZmYpKS8yKQogICB8KCgoKChkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWU+PjgpJjB4ZmYpKygoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlPj44KSYweGZmKSkvMik8PDgpCgl8KCgoKChkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWU+PjE2KSYweGZmKSsoKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZT4+OCkmMHhmZikpLzIpPDwxNikgKTsKCiAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfd2luZG93c19taW49KCAoKChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWUmMHhmZiktKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZSYweGZmKSkpCiAgIHwoKCgoKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZT4+OCkmMHhmZiktKChkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWU+PjgpJjB4ZmYpKSk8PDgpCgl8KCgoKChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWU+PjE2KSYweGZmKS0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZT4+OCkmMHhmZikpKTw8MTYpICk7CgpwcmludGYoIlxuIGFkZCAgMHglMDh4IHJlZz09ICAgIDB4JTA4eCAgICAweCUwOHggICAgMHglMDh4ICAgIDB4JTA4eCAgICAweCUwOHggICAgMHglMDh4ICAgIDB4JTA4eCAgICAweCUwOHggICAgMHglMDh4XG4iLAoJKGRxX2xjZF9iZGxfcmVnX2luZGV4W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0pLAoJICAgKGRxX2xjZF9iZGxfcmVnX29yZ1t0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKSwKCSAgIChkcV9sY2RfYmRsX3JlZ19sZWZ0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0pLAoJICAgKGRxX2xjZF9iZGxfcmVnX3JpZ2h0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0pLAoJICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19jZW50ZXIsZHFfbGNkX2JkbF90ZW1wX3JlZ193aW5kb3dzLAoJCShkcV9sY2RfYmRsX3JlZ19sZWZ0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKSwKCSAgIChkcV9sY2RfYmRsX3JlZ19yaWdodF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSksCgkJZHFfbGNkX2JkbF90ZW1wX3JlZ19jZW50ZXJfbWluLGRxX2xjZF9iZGxfdGVtcF9yZWdfd2luZG93c19taW4KKTsKCSAgIH0KCgp9Cgp9CgoKCgogcmV0dXJuIDA7Cgp1c2FnZToKCWNtZF91c2FnZShjbWR0cCk7CglyZXR1cm4gMTsKCn0KClVfQk9PVF9DTUQoCglkZHJfZHFzX3dpbmRvd19zdGVwLAk1LAkxLAlkb19kZHJfdGVzdF9kcXNfd2luZG93X3N0ZXAsCgkiRERSIHR1bmUgZHFzIGZ1bmN0aW9uIiwKCSJkZHJfZHFzX3dpbmRvd19zdGVwIGEgMCAweDgwMDAwMCAxIG9yIGRkcl9kcXNfd2luZG93X3N0ZXAgYiAwIDB4ODAwMDAwIDVcbiBkY2FjaGUgb2ZmID8gXG4iCik7CgovLy8qCgoKaW50IGRvX2RkcjJwbGxfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoKI2RlZmluZSBERFJfVEVTVF9DTURfVEVTVF9aUSAgICAgMAojZGVmaW5lIEREUl9URVNUX0NNRF9URVNUX0FDX0JJVF9TRVRVUCAgICAgIDEKI2RlZmluZSBERFJfVEVTVF9DTURfVEVTVF9BQ19CSVRfSE9MRCAgICAgMgojZGVmaW5lIEREUl9URVNUX0NNRF9URVNUX0RBVEFfV1JJVEVfQklUX1NFVFVQICAgICAgMwojZGVmaW5lIEREUl9URVNUX0NNRF9URVNUX0RBVEFfV1JJVEVfQklUX0hPTEQgICAgICA0CiNkZWZpbmUgRERSX1RFU1RfQ01EX1RFU1RfREFUQV9SRUFEX0JJVF9TRVRVUCAgICAgIDUKI2RlZmluZSBERFJfVEVTVF9DTURfVEVTVF9EQVRBX1JFQURfQklUX0hPTEQgICAgIDYKI2RlZmluZSBERFJfVEVTVF9DTURfVEVTVF9EQVRBX1ZSRUYgICAgIDcKI2RlZmluZSBERFJfVEVTVF9DTURfVEVTVF9DTEtfSU5WRVRFUiAgICAgOAoJY2hhciAqZW5kcDsKCXVuc2lnbmVkIGludCBwbGwsIHpxY3I7CnVuc2lnbmVkIGludCBkZHJfdGVzdF9jbWRfdHlwZT0wOwogdW5zaWduZWQgaW50IGRkcl90ZXN0X2NtZF9zb2NfdnJlZj0wOwp1bnNpZ25lZCBpbnQgZGRyX3Rlc3RfY21kX2RyYW1fdnJlZj0wOy8vMHgzZjsKdW5zaWduZWQgaW50IGRkcl90ZXN0X2NtZF96cV92cmVmPTA7Ly8weDNmOwoJLyogbmVlZCBhdCBsZWFzdCB0d28gYXJndW1lbnRzICovCglpZiAoYXJnYyA8IDIpCgkJZ290byB1c2FnZTsKCglwbGwgPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCAmZW5kcCwwKTsKCWlmICgqYXJndlsxXSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQlwcmludGYgKCJFcnJvcjogV3JvbmcgZm9ybWF0IHBhcmFtZW50IVxuIik7CgkJcmV0dXJuIDE7Cgl9CmlmIChhcmdjID4yKQp7Cgl6cWNyID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgJmVuZHAsIDE2KTsKCWlmICgqYXJndlsyXSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQl6cWNyID0gMDsKCX0KfQplbHNlCnsKCSAgenFjciA9IDA7Cn0KaWYgKGFyZ2MgPjMpCnsKCWRkcl90ZXN0X2NtZF90eXBlID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgJmVuZHAsIDE2KTsKCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQlkZHJfdGVzdF9jbWRfdHlwZSA9IDA7Cgl9Cn0KZWxzZQp7CgkgIGRkcl90ZXN0X2NtZF90eXBlID0gMDsKfQoKaWYgKGFyZ2MgPjQpCnsKCWRkcl90ZXN0X2NtZF9zb2NfdnJlZiA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNF0sICZlbmRwLCAxNik7CglpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJZGRyX3Rlc3RfY21kX3NvY192cmVmID0gMDsKCX0KfQplbHNlCnsKCSAgZGRyX3Rlc3RfY21kX3NvY192cmVmID0gMDsKfQppZiAoYXJnYyA+NSkKewoJZGRyX3Rlc3RfY21kX2RyYW1fdnJlZiA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNV0sICZlbmRwLCAxNik7CglpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJZGRyX3Rlc3RfY21kX2RyYW1fdnJlZiA9IDA7Cgl9Cn0KdW5zaWduZWQgaW50IHNvY19kcmFtX2hleF9kZWM9MDsKaWYgKGFyZ2MgPjYpCnsKCXNvY19kcmFtX2hleF9kZWMgPSBzaW1wbGVfc3RydG91bChhcmd2WzZdLCAmZW5kcCwgMTYpOwoJaWYgKCphcmd2WzZdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCXNvY19kcmFtX2hleF9kZWMgPSAwOwoJfQp9CmlmIChhcmdjID43KQp7CglkZHJfdGVzdF9jbWRfenFfdnJlZiA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbN10sICZlbmRwLCAxNik7CglpZiAoKmFyZ3ZbN10gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJZGRyX3Rlc3RfY21kX3pxX3ZyZWYgPSAwOwoJfQp9CgppZiAoc29jX2RyYW1faGV4X2RlYykKewppZiAoYXJnYyA+NCkKewoJZGRyX3Rlc3RfY21kX3NvY192cmVmID0gc2ltcGxlX3N0cnRvdWwoYXJndls0XSwgJmVuZHAsIDApOwoJaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCWRkcl90ZXN0X2NtZF9zb2NfdnJlZiA9IDA7Cgl9Cn0KZWxzZQp7CgkgIGRkcl90ZXN0X2NtZF9zb2NfdnJlZiA9IDA7Cn0KaWYgKGFyZ2MgPjUpCnsKCWRkcl90ZXN0X2NtZF9kcmFtX3ZyZWYgPSBzaW1wbGVfc3RydG91bChhcmd2WzVdLCAmZW5kcCwgMCk7CglpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJZGRyX3Rlc3RfY21kX2RyYW1fdnJlZiA9IDA7Cgl9Cn0KaWYgKGFyZ2MgPjcpCnsKCWRkcl90ZXN0X2NtZF96cV92cmVmID0gc2ltcGxlX3N0cnRvdWwoYXJndls3XSwgJmVuZHAsIDApOwoJaWYgKCphcmd2WzddID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCWRkcl90ZXN0X2NtZF96cV92cmVmID0gMDsKCX0KfQppZiAoZGRyX3Rlc3RfY21kX3NvY192cmVmKQp7CmlmIChkZHJfdGVzdF9jbWRfc29jX3ZyZWY8NDUpCglkZHJfdGVzdF9jbWRfc29jX3ZyZWY9NDU7CmlmIChkZHJfdGVzdF9jbWRfc29jX3ZyZWY+ODgpCglkZHJfdGVzdF9jbWRfc29jX3ZyZWY9ODg7CmRkcl90ZXN0X2NtZF9zb2NfdnJlZj0oZGRyX3Rlc3RfY21kX3NvY192cmVmKjEwMC00NDA3KS83MDsKfQoKaWYgKGRkcl90ZXN0X2NtZF9kcmFtX3ZyZWYpCnsKaWYgKGRkcl90ZXN0X2NtZF9kcmFtX3ZyZWY8NDUpCglkZHJfdGVzdF9jbWRfZHJhbV92cmVmPTQ1OwppZiAoZGRyX3Rlc3RfY21kX2RyYW1fdnJlZj45MikKCWRkcl90ZXN0X2NtZF9kcmFtX3ZyZWY9OTI7CmlmIChkZHJfdGVzdF9jbWRfZHJhbV92cmVmPjYwKSB7CmRkcl90ZXN0X2NtZF9kcmFtX3ZyZWY9KGRkcl90ZXN0X2NtZF9kcmFtX3ZyZWYqMTAwLTYwMDApLzY1Owp9CmVsc2V7CmRkcl90ZXN0X2NtZF9kcmFtX3ZyZWY9KChkZHJfdGVzdF9jbWRfZHJhbV92cmVmKjEwMC00NTAwKS82NSl8KDE8PDYpOwp9Cn0KCgpwcmludGYoIlxuU2V0IGRkcl90ZXN0X2NtZF9kcmFtX3ZyZWYgWzB4JTA4eF1cbiIsZGRyX3Rlc3RfY21kX2RyYW1fdnJlZik7CmlmIChkZHJfdGVzdF9jbWRfenFfdnJlZiA9PSAwKQoJZGRyX3Rlc3RfY21kX3pxX3ZyZWY9MDsKaWYgKGRkcl90ZXN0X2NtZF96cV92cmVmKSB7CmlmIChkZHJfdGVzdF9jbWRfenFfdnJlZjw0NSkKCWRkcl90ZXN0X2NtZF96cV92cmVmPTQ1OwppZiAoZGRyX3Rlc3RfY21kX3pxX3ZyZWY+ODgpCglkZHJfdGVzdF9jbWRfenFfdnJlZj04ODsKZGRyX3Rlc3RfY21kX3pxX3ZyZWY9KGRkcl90ZXN0X2NtZF96cV92cmVmKjEwMC00NDA3KS83MDsKfQp9CgovL2lmKGRkcl90ZXN0X2NtZF90eXBlPT1ERFJfVEVTVF9DTURfVEVTVF9BQ19CSVRfSE9MRCkKLy97aWYgKGRkcl90ZXN0X2NtZF9jbGtfc2VlZCA9PTApCi8vZGRyX3Rlc3RfY21kX2Nsa19zZWVkID0gMHgzZjsKLy9pZiAoZGRyX3Rlc3RfY21kX2FjYmRsX3hfc2VlZCA9PTApCi8vZGRyX3Rlc3RfY21kX2FjYmRsX3hfc2VlZCA9IDB4M2Y7Ci8vfQoKI2lmIGRlZmluZWQoQ09ORklHX002VFYpIHx8IGRlZmluZWQoQ09ORklHX002VFZEKQoJd3JpdGVsKHpxY3IgfCAoMHgzYyA8PCAyNCksIFBSRUdfU1RJQ0tZX1JFRzApOwojZWxzZQoJd3JpdGVsKChkZHJfdGVzdF9jbWRfdHlwZTw8MTYpfHpxY3IgfCAoMHhmMTMgPDwgMjApLCBQUkVHX1NUSUNLWV9SRUcwKTsKI2VuZGlmCiNpZiAoIENPTkZJR19ERFJfUEhZPj1QX0REUl9QSFlfOTA1WCkKCSAgd3JpdGVsKChkZHJfdGVzdF9jbWRfenFfdnJlZjw8MjQpfChkZHJfdGVzdF9jbWRfc29jX3ZyZWY8PDgpfGRkcl90ZXN0X2NtZF9kcmFtX3ZyZWYgLCBQUkVHX1NUSUNLWV9SRUc5KTsKI2VuZGlmCgl3cml0ZWwocGxsLCBQUkVHX1NUSUNLWV9SRUcxKTsKCXByaW50ZigiU2V0IHBsbCBkb25lIFsweCUwOHhdXG4iLCByZWFkbChQUkVHX1NUSUNLWV9SRUcxKSk7CglwcmludGYoIlNldCBTVElDS1lfUkVHMCBbMHglMDh4XVxuIiwgcmVhZGwoUFJFR19TVElDS1lfUkVHMCkpOwoJI2lmICggQ09ORklHX0REUl9QSFk+PVBfRERSX1BIWV85MDVYKQoJcHJpbnRmKCJTZXQgU1RJQ0tZX1JFRzkgWzB4JTA4eF1cbiIsIHJlYWRsKFBSRUdfU1RJQ0tZX1JFRzkpKTsKCXByaW50ZigiU2V0IFNUSUNLWV9SRUc4IFsweCUwOHhdXG4iLCByZWFkbChQUkVHX1NUSUNLWV9SRUc4KSk7CgkjZW5kaWYKCXByaW50ZigiXG5iZWdpbiByZXNldCAxMTEuLi4uLi4uLi4uLlxuIik7CglwcmludGYoIlxuYmVnaW4gcmVzZXQgMi4uLi4uLi4uLi4uXG4iKTsKCXByaW50ZigiXG5iZWdpbiByZXNldCAzLi4uLi4uLi4uLi5cbiIpOwoKI2lmZGVmIENPTkZJR19NOEIKCXdyaXRlbCgweGYwODAwMDAgfCAyMDAwLCBXQVRDSERPR19UQyk7CiNlbHNlCiAgLy8gIHdyaXRlbChXQVRDSERPR19UQywgMHhmNDAwMDAwIHwgMjAwMCk7CiAvLyAqUF9XQVRDSERPR19SRVNFVCA9IDA7CiBkZHJfdGVzdF93YXRjaGRvZ19yZXNldF9zeXN0ZW0oKTsKI2VuZGlmCgoJcmV0dXJuIDA7Cgp1c2FnZToKCWNtZF91c2FnZShjbWR0cCk7CglyZXR1cm4gMTsKfQppbnQgZG9fZGRyX3Rlc3RfYWNfYml0X3NldHVwX2hvbGRfd2luZG93KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewogICBwcmludGYoIlxuRW50ZXIgdGVzdCBkZHIgYWMgYml0IHdpbmRvdyAgZnVuY3Rpb25cbiIpOwogLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwogIHByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKIHVuc2lnbmVkIGludCAgIGRkbF8xMDBzdGVwX3BzPSAwOwoKICAgdW5zaWduZWQgaW50ICAgdGVtcF90ZXN0X2Vycm9yPSAwOwoJIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnQ9IDA7CiB1bnNpZ25lZCBpbnQgICB0ZW1wX3JlZ192YWx1ZVs0MF07CgoJIGNoYXIgKmVuZHA7CiAvLyAgdW5zaWduZWQgaW50ICAgKnBfc3RhcnRfYWRkcjsKICB1bnNpZ25lZCBpbnQgICB0ZXN0X2FjX3NldHVwX2hvbGQ9MDsKLy91bnNpZ25lZCBpbnQgICB0ZXN0aW5nX3NlZWQ9MDsKLy8gdW5zaWduZWQgaW50ICAgdGVzdF9sYW5lX3N0ZXBfcmRxc19mbGFnPTA7CiAgdW5zaWduZWQgaW50ICAgdGVzdF9hY2JkbD0wOwovLyAgIHVuc2lnbmVkIGludCAgIHRlc3RfdGltZXM9MTsKICAgdW5zaWduZWQgaW50ICAgcmVnX2FkZD0wOwogICB1bnNpZ25lZCBpbnQgICByZWdfYmFzZV9hZGo9MDsKCQkgIHVuc2lnbmVkIGludCAgIGNoYW5uZWxfYV9lbiA9IDA7CgkgICB1bnNpZ25lZCBpbnQgICBjaGFubmVsX2JfZW4gPSAwOwoKCgkgIHVuc2lnbmVkIGludCAgIGFjYmRscjBfcmVnX29yZz0wOwoJICB1bnNpZ25lZCBpbnQgICBhY2JkbHJfeF9yZWdfb3JnPTA7CgkgICB1bnNpZ25lZCBpbnQgICBhY2JkbHJfeF9yZWdfaG9sZF9taW49MDsKCSAgICAvLyAgdW5zaWduZWQgaW50ICAgYWNiZGxyX3hfcmVnX2hvbGRfbWluPTA7CgkgICB1bnNpZ25lZCBpbnQgICBhY2JkbHJfeF9yZWdfc2V0dXBfbWF4PTA7CgkvLyAgICB1bnNpZ25lZCBpbnQgICBhY2JkbHJfeF9yZWdfc2V0dXBfbWF4PTA7CgkvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfbGVmdD0wOwoJLy8gIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX3JpZ2h0PTA7CgoKCS8vICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19sZWZ0X21pbj0wOwoJLy8gIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbj0wOwoKCSAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9MDsKCgoJIC8vICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWU7CgkvLyAgICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlOwoKCgkvLyAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmOwoJLy8gICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZzsKCgoJICAgIHVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCgoJCXsKCSBpZiAoYXJnYyA9PSAyKQoJCXsKICAgIGlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApKQoKCXtjaGFubmVsX2FfZW4gPSAxOwoJfQoJZWxzZSBpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCl8fChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSkKCgl7Y2hhbm5lbF9iX2VuID0gMTsKCX0KCWVsc2UKCQl7Cglnb3RvIHVzYWdlOwoJCX0KCQl9CgkJaWYgKGFyZ2MgPiAyKQoJCXsKICAgIGlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJBIikgPT0gMCkpCgoJe2NoYW5uZWxfYV9lbiA9IDE7Cgl9CiAgICAgaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQiIpID09IDApKQoKCXtjaGFubmVsX2JfZW4gPSAxOwoJfQoJCQl9CgkJICAgZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKICBpZiAoYXJnYyA+MykgewoJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sICZlbmRwLCAxNik7CiAgICAgICAgaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQlkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJCQl9CgoJfQogICAgaWYgKGFyZ2MgPjQpIHsKCQkgdGVzdF9hY19zZXR1cF9ob2xkID0gMDsKCXRlc3RfYWNfc2V0dXBfaG9sZCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNF0sICZlbmRwLCAxNik7CiAgICAgICAgaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQl0ZXN0X2FjX3NldHVwX2hvbGQgPSAwOwoJCQl9CgkJIGlmICAgKChzdHJjbXAoYXJndls0XSwgImwiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbNF0sICJMIikgPT0gMCkpCgkJCXsKCQkJdGVzdF9hY19zZXR1cF9ob2xkID0gMDsKCQkJfQoJfQoJaWYgKHRlc3RfYWNfc2V0dXBfaG9sZCA+MSkKCQl0ZXN0X2FjX3NldHVwX2hvbGQgPSAyOwoJCSAgICBpZiAoYXJnYyA+NSkgewoKCXRlc3RfYWNiZGw9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNV0sICZlbmRwLCAxNik7CiAgICAgICAgaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQl0ZXN0X2FjYmRsID0gMDsKCQkJfQoJaWYgKHRlc3RfYWNiZGw+MzkpCgkJIHRlc3RfYWNiZGwgPTEyOy8vZGVmYXVsdCB0ZXN0IGNzMCBwaW4KCX0KfQoJCSBwcmludGYoIlxuY2hhbm5lbF9hX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2FfZW4pOwoJCSBwcmludGYoIlxuY2hhbm5lbF9iX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2JfZW4pOwoJCSAgcHJpbnRmKCJcbmRkcl90ZXN0X3NpemU9PSAweCUwOHhcbiIsIGRkcl90ZXN0X3NpemUpOwoJCSAgIHByaW50ZigiXG50ZXN0X2FjX3NldHVwX2hvbGQ9PSAweCUwOHhcbiIsIHRlc3RfYWNfc2V0dXBfaG9sZCk7CgkJICAgIHByaW50ZigiXG50ZXN0X2FjYmRsPT0gMHglMDh4XG4iLCB0ZXN0X2FjYmRsKTsKaWYgKCBjaGFubmVsX2FfZW4pCnsKLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpOwp9CmlmICggY2hhbm5lbF9iX2VuKQp7Ck9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKTsKLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKfQoKCgovL3NhdmUgYW5kIHByaW50IG9yZyB0cmFpbmluZyBkcXMgdmFsdWUKaWYgKGNoYW5uZWxfYV9lbiB8fCBjaGFubmVsX2JfZW4pCnsKCS8vZGNhY2hlX2Rpc2FibGUoKTsKIC8vc2VyaWFsX3B1dHMoIlxuZGVidWcgZm9yIGRkcnRlc3QgLGppYXhpbmcgZGlzYWJsZSBkY2FjaGUiKTsKCn0vLy8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nIGRxcyB2YWx1ZQoKCgp7Ci8vLy90dW5lIGFuZCBzYXZlIHRyYWluaW5nIGRxcyB2YWx1ZQppZiAoY2hhbm5lbF9hX2VuIHx8IGNoYW5uZWxfYl9lbikKCnsKCnsKCmlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCnsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKfQplbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQp7CnJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7Cn0KZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQogewogcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKICB9CnByaW50ZigiXG5zaG91bGQgcGF1c2UgZGRsIHBpcj09IDB4JTA4eFxuIiwgcmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwogd3JpdGVsKChyZWFkbChERFIwX1BVQl9SRUdfQkFTRSs0KSl8KDE8PDI5KSwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwpwcmludGYoIlxuIHBhdXNlIGRkbCBwaXI9PSAweCUwOHhcbiIsIHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCgoJCQlmb3IgKCh0ZW1wX2NvdW50PTApOyh0ZW1wX2NvdW50PDEwKTsodGVtcF9jb3VudCsrKSkKCQkJCXsKCQkJCWFjYmRscjBfOV9yZWdfb3JnW3RlbXBfY291bnRdPShyZWFkbChERFIwX1BVQl9BQ0JETFIwKyh0ZW1wX2NvdW50PDwyKStyZWdfYmFzZV9hZGopKTsKCgkJCQl9OwoKCnsKICAgZGRsXzEwMHN0ZXBfcHM9KCgxMDAqMTAwMCoxMDAwKS8oMipnbG9iYWxfZGRyX2NsaykpLygoKChyZWFkbChERFIwX1BVQl9BQ01ETFIwK3JlZ19iYXNlX2FkaikpKT4+MTYpJjB4ZmYpOwogICBwcmludGYoIlxuZGRsXzEwMHN0ZXBfcHM9PSAlMDhkLDBfNWN5Y2xlX3BzPT0gJTA4ZCwwXzVjeWNsZT09MHglMDh4XG4iLCBkZGxfMTAwc3RlcF9wcywoKDEwMDAqMTAwMCkvKDIqZ2xvYmFsX2Rkcl9jbGspKSwKCSgoKChyZWFkbChERFIwX1BVQl9BQ01ETFIwK3JlZ19iYXNlX2FkaikpKT4+MTYpJjB4ZmYpKTsKCiAgcmVnX2FkZD1ERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2FkajsKICAgYWNiZGxyMF9yZWdfb3JnPXJlYWRsKEREUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKTsKICBhY2JkbHJfeF9yZWdfb3JnPXJlYWRsKCgodGVzdF9hY2JkbD4+Mik8PDIpK0REUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKTsKICBwcmludGYoIlxudGVzdF9hY2JkbCAlMDh4IHwgYWNfc2V0dXBfaG9sZD09MHglMDh4XG4gIix0ZXN0X2FjYmRsLHRlc3RfYWNfc2V0dXBfaG9sZCk7CiAgcHJpbnRmKCJcbmFjYmRscjBfcmVnXzB4JTA4eF9vcmc9PTB4JTA4eCAgfCAgYWNiZGxyX3hfcmVnXzB4JTA4eF9vcmc9PTB4JTA4eFxuICIsKEREUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKSwKCWFjYmRscjBfcmVnX29yZywoKCh0ZXN0X2FjYmRsPj4yKTw8MikrRERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGopLGFjYmRscl94X3JlZ19vcmcpOwppZiAodGVzdF9hY19zZXR1cF9ob2xkID09IDApCnsKcHJpbnRmKCJcbnRlc3RfYWNfc2V0dXBcbiAiKTsKCgovL3dyaXRlbCgwLChERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2FkaikpOwogZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT1yZWFkbCgoKHRlc3RfYWNiZGw+PjIpPDwyKStERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2Fkaik7CgoKLy97d3JpdGVsKChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlJih+KDB4ZmY8PCg4Kih0ZXN0X2FjYmRsJTQpKSkpKSwoKHRlc3RfYWNiZGwvNCkqNCtERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2FkaikpOwovL30KCgoKcmVnX2FkZD0oKCh0ZXN0X2FjYmRsPj4yKTw8MikrRERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGopOwphY2JkbHJfeF9yZWdfb3JnPXJlYWRsKCgodGVzdF9hY2JkbD4+Mik8PDIpK0REUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKTsKZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT0oKGFjYmRscl94X3JlZ19vcmc+Pig4Kih0ZXN0X2FjYmRsJTQpKSkmMHhmZik7CndoaWxlIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPEFDQkRMUl9NQVgpCnsKdGVtcF90ZXN0X2Vycm9yPTA7CmRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUrKzsKcHJpbnRmKCJcbiByZWdfYWRkPT0weCUwOHgscmlnaHQgdGVtcD09MHglMDh4XG4sdmFsdWU9PTB4JTA4eCIscmVnX2FkZCxkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLAoJKChhY2JkbHJfeF9yZWdfb3JnKSYofigweGZmPDwoOCoodGVzdF9hY2JkbCU0KSkpKSl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCg4Kih0ZXN0X2FjYmRsJTQpKSkpOwoKCQl7CiB3cml0ZWwoKChhY2JkbHJfeF9yZWdfb3JnKSYofigweGZmPDwoOCoodGVzdF9hY2JkbCU0KSkpKSl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCg4Kih0ZXN0X2FjYmRsJTQpKSkscmVnX2FkZCk7CgoJCX0KCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCglpZiAodGVtcF90ZXN0X2Vycm9yKQoJCXsKCQkvL3ByaW50ZigiXG53ZHFkIGxlZnQgZWRnZSBkZXRlY3QgXG4iKTsKCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLS07CgkJYnJlYWs7CgkJfQp9CnByaW50ZigiXG4gcmlnaHQgZWRnZSBkZXRlY3QgLHJlZz09MHglMDh4XG4iLCgoKHRlc3RfYWNiZGw+PjIpPDwyKStERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2FkaikpOwpwcmludGYoIlxuIG9yZz09MHglMDh4LHJpZ2h0IGVkZ2U9PTB4JTA4eCx2YWx1ZT09MHglMDh4XG4gIiwoKGFjYmRscl94X3JlZ19vcmc+Pig4Kih0ZXN0X2FjYmRsJTQpKSkmMHhmZiksZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSwKCSgoYWNiZGxyX3hfcmVnX29yZykmKH4oMHhmZjw8KDgqKHRlc3RfYWNiZGwlNCkpKSkpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoOCoodGVzdF9hY2JkbCU0KSkpKTsKCgl7YWNiZGxyX3hfcmVnX3NldHVwX21heD1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlO30KCmRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9MDsKIC8vd3JpdGVsKCgoYWNiZGxyX3hfcmVnX29yZykmKH4oMHhmZjw8KDgqKHRlc3RfYWNiZGwlNCkpKSkpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoOCoodGVzdF9hY2JkbCU0KSkpLHJlZ19hZGQpOwoJIHdyaXRlbCgoKGFjYmRscl94X3JlZ19vcmcpKSxyZWdfYWRkKTsKLy90ZXN0X2FjX3NldHVwX2hvbGQ9MTsKewogcHJpbnRmKCJcbnRlc3RfYWNiZGwgJTA4eCB8IGFjX3NldHVwX2hvbGQ9PTB4JTA4eCBhY21kbHI9PTB4JTA4eCAgZGRsXzEwMHN0ZXBfcHM9PSUwOGRcbiIsdGVzdF9hY2JkbCx0ZXN0X2FjX3NldHVwX2hvbGQsCglyZWFkbChERFIwX1BVQl9BQ01ETFIwK3JlZ19iYXNlX2FkaiksZGRsXzEwMHN0ZXBfcHMpOwogICBwcmludGYoIlxuYWNiZGxyMF9yZWdfb3JnPT0weCUwOHggIHwgIGFjYmRscl94X3JlZ19vcmc9PTB4JTA4eFxuICIsYWNiZGxyMF9yZWdfb3JnLGFjYmRscl94X3JlZ19vcmcpOwpwcmludGYoImFjYmRscl94X3JlZ19zZXR1cF9tYXggMHglMDh4ICBcCglzZXR1cCB0aW1lPT0weCUwOHgsICUwOGQgcHMgXG4gIiwKCWFjYmRscl94X3JlZ19zZXR1cF9tYXgsKGFjYmRscl94X3JlZ19zZXR1cF9tYXgtCgkoKGFjYmRscl94X3JlZ19vcmc+Pig4Kih0ZXN0X2FjYmRsJTQpKSkmMHhmZikpLCgoYWNiZGxyX3hfcmVnX3NldHVwX21heC0KCSgoYWNiZGxyX3hfcmVnX29yZz4+KDgqKHRlc3RfYWNiZGwlNCkpKSYweGZmKSkgKmRkbF8xMDBzdGVwX3BzKS8xMDAKCSk7CmFjYmRscjBfOV9yZWdfc2V0dXBfbWF4W3Rlc3RfYWNiZGxdPShhY2JkbHJfeF9yZWdfc2V0dXBfbWF4LQoJKChhY2JkbHJfeF9yZWdfb3JnPj4oOCoodGVzdF9hY2JkbCU0KSkpJjB4ZmYpKTsKYWNiZGxyMF85X3JlZ19zZXR1cF90aW1lW3Rlc3RfYWNiZGxdPSgoYWNiZGxyX3hfcmVnX3NldHVwX21heC0KCSgoYWNiZGxyX3hfcmVnX29yZz4+KDgqKHRlc3RfYWNiZGwlNCkpKSYweGZmKSkgKmRkbF8xMDBzdGVwX3BzKS8xMDA7CgkJCWZvciAoKHRlbXBfY291bnQ9MCk7KHRlbXBfY291bnQ8MTApOyh0ZW1wX2NvdW50KyspKQoJCQkJewoJCQkJIHdyaXRlbCgoKGFjYmRscjBfOV9yZWdfb3JnW3RlbXBfY291bnRdKSksKEREUjBfUFVCX0FDQkRMUjArKHRlbXBfY291bnQ8PDIpK3JlZ19iYXNlX2FkaikpOwoKCQkJCX07Cgp9Cgp9CgppZiAodGVzdF9hY19zZXR1cF9ob2xkID09IDEpCnsKcHJpbnRmKCJcbnRlc3RfYWNfaG9sZCAxXG4gIik7CiAgYWNiZGxyMF9yZWdfb3JnPXJlYWRsKEREUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKTsKICBhY2JkbHJfeF9yZWdfb3JnPXJlYWRsKCgodGVzdF9hY2JkbD4+Mik8PDIpK0REUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKTsKICBwcmludGYoIlxudGVzdF9hY2JkbCAlMDh4IHwgYWNfc2V0dXBfaG9sZD09MHglMDh4XG4gIix0ZXN0X2FjYmRsLHRlc3RfYWNfc2V0dXBfaG9sZCk7CiAgcHJpbnRmKCJcbmFjYmRscjBfcmVnX29yZz09MHglMDh4ICB8ICBhY2JkbHJfeF9yZWdfb3JnPT0weCUwOHhcbiAiLGFjYmRscjBfcmVnX29yZyxhY2JkbHJfeF9yZWdfb3JnKTsKCgogcHJpbnRmKCJcbmFjYmRscjBfcmVnPT0weCUwOHggIHwgIGFjYmRscl94X3JlZz09MHglMDh4XG4gIiwKCXJlYWRsKEREUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKSxyZWFkbCgoKHRlc3RfYWNiZGw+PjIpPDwyKStERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2FkaikpOwoKcmVnX2FkZD0oKCh0ZXN0X2FjYmRsPj4yKTw8MikrRERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGopOwpkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPXJlYWRsKCgodGVzdF9hY2JkbD4+Mik8PDIpK0REUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKTsKZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU+Pig4Kih0ZXN0X2FjYmRsJTQpKSkmMHhmZik7CndoaWxlIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPjApCnsKdGVtcF90ZXN0X2Vycm9yPTA7CmRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUtLTsKcHJpbnRmKCJcbiByZWc9PTB4JTA4eCwgbGVmdCB0ZW1wPT0weCUwOHhcbiAsdmFsdWU9PTB4JTA4eCAiLHJlZ19hZGQsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSwKCSgoYWNiZGxyX3hfcmVnX29yZykmKH4oMHhmZjw8KDgqKHRlc3RfYWNiZGwlNCkpKSkpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoOCoodGVzdF9hY2JkbCU0KSkpKTsKCgkJewogd3JpdGVsKCgoYWNiZGxyX3hfcmVnX29yZykmKH4oMHhmZjw8KDgqKHRlc3RfYWNiZGwlNCkpKSkpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoOCoodGVzdF9hY2JkbCU0KSkpLHJlZ19hZGQpOwoKCQl9Cgl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgoJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQl7CgkJLy9wcmludGYoIlxud2RxZCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSsrOwoJCWJyZWFrOwoJCX0KfQpwcmludGYoIlxuIGxlZnQgZWRnZSBkZXRlY3QgLHJlZz09MHglMDh4XG4iLCgoKHRlc3RfYWNiZGw+PjIpPDwyKStERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2FkaikpOwpwcmludGYoIlxuIG9yZz09MHglMDh4LGxlZnQgZWRnZT09MHglMDh4XG4gIiwoKGFjYmRscl94X3JlZ19vcmc+Pig4Kih0ZXN0X2FjYmRsJTQpKSkmMHhmZiksZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSk7CgoJe2FjYmRscl94X3JlZ19ob2xkX21pbj1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlO30KCgovL3Rlc3RfYWNfc2V0dXBfaG9sZD0xOwovL3dyaXRlbChhY2JkbHIwX3JlZ19vcmcsKEREUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKSk7CndyaXRlbChhY2JkbHJfeF9yZWdfb3JnLCgoKHRlc3RfYWNiZGw+PjIpPDwyKStERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2FkaikpOwovL2RxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9MDsKLy8gd3JpdGVsKCgoYWNiZGxyX3hfcmVnX29yZykmKH4oMHhmZjw8KDgqKHRlc3RfYWNiZGwlNCkpKSkpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoOCoodGVzdF9hY2JkbCU0KSkpLHJlZ19hZGQpOwp7CgoKIHByaW50ZigiXG50ZXN0X2FjYmRsICUwOHggfCBhY19zZXR1cF9ob2xkPT0weCUwOHggYWNtZGxyPT0weCUwOHggIGRkbF8xMDBzdGVwX3BzPT0lMDhkXG4iLHRlc3RfYWNiZGwsdGVzdF9hY19zZXR1cF9ob2xkLAoJcmVhZGwoRERSMF9QVUJfQUNNRExSMCtyZWdfYmFzZV9hZGopLGRkbF8xMDBzdGVwX3BzKTsKICAgcHJpbnRmKCJcbmFjYmRscjBfcmVnX29yZz09MHglMDh4ICB8ICBhY2JkbHJfeF9yZWdfb3JnPT0weCUwOHhcbiAiLGFjYmRscjBfcmVnX29yZyxhY2JkbHJfeF9yZWdfb3JnKTsKcHJpbnRmKCJhY2JkbHJfeF9yZWdfaG9sZF9taW49PTB4JTA4eCBcCglob2xkdXAgdGltZT09MHglMDh4LCAlMDhkIHBzXG4gIiwKCWFjYmRscl94X3JlZ19ob2xkX21pbiwKCSgoKGFjYmRscl94X3JlZ19vcmc+Pig4Kih0ZXN0X2FjYmRsJTQpKSkmMHhmZiktYWNiZGxyX3hfcmVnX2hvbGRfbWluKSwKCSgoKChhY2JkbHJfeF9yZWdfb3JnPj4oOCoodGVzdF9hY2JkbCU0KSkpJjB4ZmYpLWFjYmRscl94X3JlZ19ob2xkX21pbikqZGRsXzEwMHN0ZXBfcHMpLzEwMCk7Cgp9CmFjYmRscjBfOV9yZWdfaG9sZF9tYXhbdGVzdF9hY2JkbF09KCgoYWNiZGxyX3hfcmVnX29yZz4+KDgqKHRlc3RfYWNiZGwlNCkpKSYweGZmKS1hY2JkbHJfeF9yZWdfaG9sZF9taW4pOwphY2JkbHIwXzlfcmVnX2hvbGRfdGltZVt0ZXN0X2FjYmRsXT0oKCgoYWNiZGxyX3hfcmVnX29yZz4+KDgqKHRlc3RfYWNiZGwlNCkpKSYweGZmKS1hY2JkbHJfeF9yZWdfaG9sZF9taW4pKmRkbF8xMDBzdGVwX3BzKS8xMDA7CgoJCQlmb3IgKCh0ZW1wX2NvdW50PTApOyh0ZW1wX2NvdW50PDEwKTsodGVtcF9jb3VudCsrKSkKCQkJCXsKCQkJCSB3cml0ZWwoKChhY2JkbHIwXzlfcmVnX29yZ1t0ZW1wX2NvdW50XSkpLChERFIwX1BVQl9BQ0JETFIwKyh0ZW1wX2NvdW50PDwyKStyZWdfYmFzZV9hZGopKTsKCgkJCQl9OwoKfQoKaWYgKHRlc3RfYWNfc2V0dXBfaG9sZCA9PSAyKQp7CnByaW50ZigiXG50ZXN0X2FjX2hvbGQgMiBtZXRob2RcbiAiKTsKICBhY2JkbHIwX3JlZ19vcmc9cmVhZGwoRERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGopOwogIGFjYmRscl94X3JlZ19vcmc9cmVhZGwoKCh0ZXN0X2FjYmRsPj4yKTw8MikrRERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGopOwogIHByaW50ZigiXG50ZXN0X2FjYmRsICUwOHggfCBhY19zZXR1cF9ob2xkPT0weCUwOHhcbiAiLHRlc3RfYWNiZGwsdGVzdF9hY19zZXR1cF9ob2xkKTsKICBwcmludGYoIlxuYWNiZGxyMF9yZWdfb3JnPT0weCUwOHggIHwgIGFjYmRscl94X3JlZ19vcmc9PTB4JTA4eFxuICIsYWNiZGxyMF9yZWdfb3JnLGFjYmRscl94X3JlZ19vcmcpOwoKCiBwcmludGYoIlxuYWNiZGxyMF9yZWc9PTB4JTA4eCAgfCAgYWNiZGxyX3hfcmVnPT0weCUwOHhcbiAiLAoJcmVhZGwoRERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGopLHJlYWRsKCgodGVzdF9hY2JkbD4+Mik8PDIpK0REUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKSk7CgpyZWdfYWRkPSgoKHRlc3RfYWNiZGw+PjIpPDwyKStERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2Fkaik7Ci8vZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT1yZWFkbCgoKHRlc3RfYWNiZGw+PjIpPDwyKStERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2Fkaik7Ci8vZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU+Pig4Kih0ZXN0X2FjYmRsJTQpKSkmMHhmZik7CmRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9KHJlYWRsKEREUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKSYweGZmKTsKd2hpbGUgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8MHgzZikKewp0ZW1wX3Rlc3RfZXJyb3I9MDsKZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSsrOwpwcmludGYoIlxuIHJlZz09MHglMDh4LCByaWdodCB0ZW1wPT0weCUwOHgsdmFsdWU9PTB4JTA4eFxuICIsKCgodGVzdF9hY2JkbD4+Mik8PDIpK0REUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKSxkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLAoJKChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoOCkpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoMTYpKQoJCXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8KDI0KSkpJih+KDB4ZmY8PCg4Kih0ZXN0X2FjYmRsJTQpKSkpKXwoYWNiZGxyX3hfcmVnX29yZyYoKDB4ZmY8PCg4Kih0ZXN0X2FjYmRsJTQpKSkpKSk7Ci8qCgkJewoJCQlmb3IgKCh0ZW1wX2NvdW50PTApOyh0ZW1wX2NvdW50PDEwKTsodGVtcF9jb3VudCsrKSkKCQkJCXsKCSB3cml0ZWwoKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWV8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCg4KSl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCgxNikpCgkJfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoMjQpKSksKEREUjBfUFVCX0FDQkRMUjArKHRlbXBfY291bnQ8PDIpK3JlZ19iYXNlX2FkaikpOwoJCQkJfTsKCiB3cml0ZWwoKChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoOCkpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoMTYpKQoJCXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8KDI0KSkpJih+KDB4ZmY8PCg4Kih0ZXN0X2FjYmRsJTQpKSkpKXwoYWNiZGxyX3hfcmVnX29yZyYoKDB4ZmY8PCg4Kih0ZXN0X2FjYmRsJTQpKSkpKSwKCQkoKCh0ZXN0X2FjYmRsPj4yKTw8MikrRERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGopKTsKCgkJfQoqLwoKewoJCQlmb3IgKCh0ZW1wX2NvdW50PTApOyh0ZW1wX2NvdW50PDQwKTsodGVtcF9jb3VudCsrKSkKCQkJCXtpZih0ZW1wX2NvdW50PT0odGVzdF9hY2JkbCkpCgkJCQl7CgkJCQl0ZW1wX3JlZ192YWx1ZVt0ZW1wX2NvdW50XT0oKHJlYWRsKEREUjBfUFVCX0FDQkRMUjArKCgodGVtcF9jb3VudCk+PjIpPDwyKSsKCXJlZ19iYXNlX2FkaikpPj4oOCoodGVtcF9jb3VudCU0KSkpJjB4ZmY7CgkJCQl9ZWxzZQoJCQkJewoJCQkJdGVtcF9yZWdfdmFsdWVbdGVtcF9jb3VudF09KCgocmVhZGwoRERSMF9QVUJfQUNCRExSMCsoKCh0ZW1wX2NvdW50KT4+Mik8PDIpKwoJcmVnX2Jhc2VfYWRqKSk+Pig4Kih0ZW1wX2NvdW50JTQpKSkmMHhmZikrMTsKCQkJCQl9CgkJCQl0ZW1wX3JlZ192YWx1ZVt0ZW1wX2NvdW50XT0oKHRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnRdPkFDQkRMUl9NQVgpPyhBQ0JETFJfTUFYKToodGVtcF9yZWdfdmFsdWVbdGVtcF9jb3VudF0pKTsKCgkJCQkJfTsKCQkJZm9yICgodGVtcF9jb3VudD0wKTsodGVtcF9jb3VudDw0MCk7KHRlbXBfY291bnQrKykpCgkJCQl7CgkJCQkgd3JpdGVsKCgoKHRlbXBfcmVnX3ZhbHVlWyh0ZW1wX2NvdW50KV0pfCgodGVtcF9yZWdfdmFsdWVbdGVtcF9jb3VudCsxXSk8PCg4KSl8KCgodGVtcF9yZWdfdmFsdWVbdGVtcF9jb3VudCsyXSk8PCgxNikpKQoJCXwoKHRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnQrM10pPDwoMjQpKSkpLAoJCShERFIwX1BVQl9BQ0JETFIwKygoKHRlbXBfY291bnQpPj4yKTw8MikrCglyZWdfYmFzZV9hZGopKTsKCQkJIHRlbXBfY291bnQ9dGVtcF9jb3VudCszOwoJCQkJCX07CgkJCXByaW50ZigiXG4gcmVnX2JkbHJfY2s9PTB4JTA4eCxyaWdodCB0ZW1wPT0weCUwOHhcbixja192YWx1ZT09MHglMDh4IiwoRERSMF9QVUJfQUNCRExSMCsKCXJlZ19iYXNlX2FkaiksKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUpLAoJKHJlYWRsKEREUjBfUFVCX0FDQkRMUjArCglyZWdfYmFzZV9hZGopKSk7CgkJCXByaW50ZigiXG4gcmVnX2JkbHJfeD09MHglMDh4LHJpZ2h0IHRlbXA9PTB4JTA4eFxuLHhfdmFsdWU9PTB4JTA4eCIsKEREUjBfUFVCX0FDQkRMUjArKCgodGVzdF9hY2JkbCk+PjIpPDwyKSsKCXJlZ19iYXNlX2FkaiksKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUpLAoJKHJlYWRsKEREUjBfUFVCX0FDQkRMUjArKCgodGVzdF9hY2JkbCk+PjIpPDwyKSsKCXJlZ19iYXNlX2FkaikpKTsKCn0KCgoKCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCglpZiAodGVtcF90ZXN0X2Vycm9yKQoJCXsKCQkvL3ByaW50ZigiXG53ZHFkIGxlZnQgZWRnZSBkZXRlY3QgXG4iKTsKCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLS07CgkJYnJlYWs7CgkJfQp9CnByaW50ZigiXG4gcmlnaHQgZWRnZSBkZXRlY3QgLHJlZz09MHglMDh4XG4iLCgoKHRlc3RfYWNiZGw+PjIpPDwyKStERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2FkaikpOwpwcmludGYoIlxub3JnPT0weCUwOHgsIHJpZ2h0IGVkZ2U9PTB4JTA4eFxuICIsYWNiZGxyMF9yZWdfb3JnJjB4ZmYsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSk7CgoJe2FjYmRscl94X3JlZ19ob2xkX21pbj1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlO30KCgovL3Rlc3RfYWNfc2V0dXBfaG9sZD0xOwpkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPTA7CgoJCXsKCgogcHJpbnRmKCJcbnRlc3RfYWNiZGwgJTA4eCB8IGFjX3NldHVwX2hvbGQ9PTB4JTA4eCBhY21kbHI9PTB4JTA4eCAgZGRsXzEwMHN0ZXBfcHM9PSUwOGRcbiIsdGVzdF9hY2JkbCx0ZXN0X2FjX3NldHVwX2hvbGQsCglyZWFkbChERFIwX1BVQl9BQ01ETFIwK3JlZ19iYXNlX2FkaiksZGRsXzEwMHN0ZXBfcHMpOwogICBwcmludGYoIlxuYWNiZGxyMF9yZWdfb3JnPT0weCUwOHggIHwgIGFjYmRscl94X3JlZ19vcmc9PTB4JTA4eFxuICIsYWNiZGxyMF9yZWdfb3JnLGFjYmRscl94X3JlZ19vcmcpOwpwcmludGYoImFjYmRscl94X3JlZ19ob2xkX21heD09MHglMDh4IFwKCWhvbGR1cCB0aW1lPT0weCUwOHgsICUwOGQgcHNcbiAiLAoJYWNiZGxyX3hfcmVnX2hvbGRfbWluLAoJKChhY2JkbHJfeF9yZWdfaG9sZF9taW4tKGFjYmRscjBfcmVnX29yZyYweGZmKSkpLCgoYWNiZGxyX3hfcmVnX2hvbGRfbWluLShhY2JkbHIwX3JlZ19vcmcmMHhmZikpKmRkbF8xMDBzdGVwX3BzKS8xMDApOwoKfQoJCQkJYWNiZGxyMF85X3JlZ19ob2xkX21heFt0ZXN0X2FjYmRsXT0oKGFjYmRscl94X3JlZ19ob2xkX21pbi0oYWNiZGxyMF9yZWdfb3JnJjB4ZmYpKSk7CgkJCQlhY2JkbHIwXzlfcmVnX2hvbGRfdGltZVt0ZXN0X2FjYmRsXT0oKGFjYmRscl94X3JlZ19ob2xkX21pbi0oYWNiZGxyMF9yZWdfb3JnJjB4ZmYpKSpkZGxfMTAwc3RlcF9wcykvMTAwOwoJCQkJCQkJZm9yICgodGVtcF9jb3VudD0wKTsodGVtcF9jb3VudDwxMCk7KHRlbXBfY291bnQrKykpCgkJCQl7CgkJCQkgd3JpdGVsKCgoYWNiZGxyMF85X3JlZ19vcmdbdGVtcF9jb3VudF0pKSwoRERSMF9QVUJfQUNCRExSMCsodGVtcF9jb3VudDw8MikrcmVnX2Jhc2VfYWRqKSk7CgoJCQkJfTsKCn0KCgoKCgogfQp9Cgp9CgogLy8gIGRkbF8xMDBzdGVwX3BzPSgoMTAwKjEwMDAqMTAwMCkvKDIqZ2xvYmFsX2Rkcl9jbGspKS8oKCgocmVhZGwoRERSMF9QVUJfQUNNRExSMCtyZWdfYmFzZV9hZGopKSk+PjE2KSYweGZmKTsKCgoKcHJpbnRmKCJcbmRkbF8xMDBzdGVwX3BzPT0gJTA4ZCwwXzVjeWNsZV9wcz09ICUwOGRcbiIsIGRkbF8xMDBzdGVwX3BzLCgoMTAwMCoxMDAwKS8oMipnbG9iYWxfZGRyX2NsaykpKTsKCnByaW50ZigiXG5yZXN1bWUgIGRkbCBwaXI9PSAweCUwOHhcbiIsIHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKIHdyaXRlbCgocmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpJih+KDE8PDI5KSksKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKcHJpbnRmKCJcbiByZXN1bWUgZGRsIHBpcj09IDB4JTA4eFxuIiwgcmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwoKIHJldHVybiBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoKdXNhZ2U6CgljbWRfdXNhZ2UoY21kdHApOwoJcmV0dXJuIDE7Cgp9fQoKVV9CT09UX0NNRCgKCWRkcl90ZXN0X2FjX2JpdF9zZXR1cF9ob2xkX3dpbmRvdywJNiwJMSwJZG9fZGRyX3Rlc3RfYWNfYml0X3NldHVwX2hvbGRfd2luZG93LAoJIkREUiB0ZXN0IGFjIGJpdCBtYXJnaW4gZnVuY3Rpb24iLAoJImRvX2Rkcl90ZXN0X2FjX2JpdF9zZXR1cF9ob2xkX3dpbmRvdyBhIDAgMHg4MDAwMDAwIDAgYyBvciBkb19kZHJfdGVzdF9hY19iaXRfc2V0dXBfaG9sZF93aW5kb3cgYSAwIDB4ODAwMDAwMCAyIGMgIFxuIGRjYWNoZSBvZmYgPyBcbiIKCS8vZG9fZGRyX3Rlc3RfYWNfYml0X3NldHVwX2hvbGRfd2luZG93IGEgMCAweDgwMDAwMDAgc2V0dXAvaG9sZCBwaW5faWQgLy9jIC0tLSBjcyAsLDggLS0tIGJhMAopOwoKaW50IGRvX2Rkcl90ZXN0X2RhdGFfYml0X3NldHVwX2hvbGRfd2luZG93KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewovLy8qCgogICBwcmludGYoIlxuRW50ZXIgdGVzdCBkZHIgZGF0YSBiaXQgd2luZG93ICBmdW5jdGlvblxuIik7CiAvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CiAgcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwogdW5zaWduZWQgaW50ICAgZGRsXzEwMHN0ZXBfcHM9IDA7CgogICB1bnNpZ25lZCBpbnQgICB0ZW1wX3Rlc3RfZXJyb3I9IDA7CgkgdW5zaWduZWQgaW50ICAgdGVtcF9jb3VudD0gMDsKCgoJIGNoYXIgKmVuZHA7CiAvLyAgdW5zaWduZWQgaW50ICAgKnBfc3RhcnRfYWRkcjsKICB1bnNpZ25lZCBpbnQgICB0ZXN0X2RhdGFfc2V0dXBfaG9sZD0wOwovL3Vuc2lnbmVkIGludCAgIHRlc3Rpbmdfc2VlZD0wOwovLyB1bnNpZ25lZCBpbnQgICB0ZXN0X2xhbmVfc3RlcF9yZHFzX2ZsYWc9MDsKICB1bnNpZ25lZCBpbnQgIG9wZW5fdnQ9MDsKICB1bnNpZ25lZCBpbnQgIHRlc3RfYmRsPTA7Ci8vICAgdW5zaWduZWQgaW50ICAgdGVzdF90aW1lcz0xOwogIC8vIHVuc2lnbmVkIGludCAgIHJlZ19hZGQ9MDsKICAgdW5zaWduZWQgaW50ICAgcmVnX2Jhc2VfYWRqPTA7CiAgIHVuc2lnbmVkIGludCAgIHJlZ19iZGxyY2s9MDsKICAgdW5zaWduZWQgaW50ICAgcmVnX2JkbHJfeD0wOwoJCSAgdW5zaWduZWQgaW50ICAgY2hhbm5lbF9hX2VuID0gMDsKCSAgIHVuc2lnbmVkIGludCAgIGNoYW5uZWxfYl9lbiA9IDA7CgoKCSAgdW5zaWduZWQgaW50ICAgYmRscmNrX3JlZ19vcmc9MDsKCSAgdW5zaWduZWQgaW50ICAgYmRscl94X3JlZ19vcmc9MDsKCS8vICAgdW5zaWduZWQgaW50ICAgYmRscl94X3JlZ19ob2xkX21pbj0wOwoJICAgIC8vICB1bnNpZ25lZCBpbnQgICBhY2JkbHJfeF9yZWdfaG9sZF9taW49MDsKCSAgIHVuc2lnbmVkIGludCAgIGJkbHJfeF9yZWdfc2V0dXBfbWF4PTA7CgkJdW5zaWduZWQgaW50ICAgYmRscl94X3JlZ19ob2xkX21heD0wOwoJLy8gICAgdW5zaWduZWQgaW50ICAgYWNiZGxyX3hfcmVnX3NldHVwX21heD0wOwoJLy8gIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX2xlZnQ9MDsKCS8vICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19yaWdodD0wOwoKCgkvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfbGVmdF9taW49MDsKCS8vICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19yaWdodF9taW49MDsKCgkgICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPTA7CgkgdW5zaWduZWQgaW50ICAgdGVtcF9yZWdfdmFsdWVbMjRdOwoKCgkgLy8gIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZTsKCS8vICAgICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWU7CgoKCS8vICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWY7CgkvLyAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnOwoKCgkgICAgdW5zaWduZWQgaW50ICAgZGRyX3Rlc3Rfc2l6ZT0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoKCgkJewoJIGlmIChhcmdjID09IDIpCgkJewogICAgaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkpCgoJe2NoYW5uZWxfYV9lbiA9IDE7Cgl9CgllbHNlIGlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApKQoKCXtjaGFubmVsX2JfZW4gPSAxOwoJfQoJZWxzZQoJCXsKCWdvdG8gdXNhZ2U7CgkJfQoJCX0KCQlpZiAoYXJnYyA+IDIpCgkJewogICAgaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkEiKSA9PSAwKSkKCgl7Y2hhbm5lbF9hX2VuID0gMTsKCX0KICAgICBpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJCIikgPT0gMCkpCgoJe2NoYW5uZWxfYl9lbiA9IDE7Cgl9CgkJCX0KCQkgICBkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwogIGlmIChhcmdjID4zKSB7CglkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgJmVuZHAsIDE2KTsKICAgICAgICBpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJCX0KCgl9CiAgICBpZiAoYXJnYyA+NCkgewoJCSB0ZXN0X2RhdGFfc2V0dXBfaG9sZCA9IDA7Cgl0ZXN0X2RhdGFfc2V0dXBfaG9sZCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNF0sICZlbmRwLCAxNik7CiAgICAgICAgaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQl0ZXN0X2RhdGFfc2V0dXBfaG9sZCA9IDA7CgkJCX0KCQkgaWYgICAoKHN0cmNtcChhcmd2WzRdLCAibCIpID09IDApIHx8IChzdHJjbXAoYXJndls0XSwgIkwiKSA9PSAwKSkKCQkJewoJCQl0ZXN0X2RhdGFfc2V0dXBfaG9sZCA9IDA7CgkJCX0KCX0KCWlmICh0ZXN0X2RhdGFfc2V0dXBfaG9sZCA+MSkKCQl0ZXN0X2RhdGFfc2V0dXBfaG9sZCA9IDE7CgkJICAgIGlmIChhcmdjID41KSB7CgoJdGVzdF9iZGw9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNV0sICZlbmRwLCAwKTsKICAgICAgICBpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCXRlc3RfYmRsID0gMDsKCQkJfQoJaWYgKHRlc3RfYmRsPjk2KQoJCSB0ZXN0X2JkbCA9MDsKCX0KCQkJICAgIGlmIChhcmdjID42KSB7CgoJb3Blbl92dD0gc2ltcGxlX3N0cnRvdWwoYXJndls2XSwgJmVuZHAsIDApOwogICAgICAgIGlmICgqYXJndls2XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJb3Blbl92dCA9IDA7CgkJCX0KCS8vaWYob3Blbl92dCkKCS8vCSBvcGVuX3Z0ID0xOwoJfQp9CgkJIHByaW50ZigiXG5jaGFubmVsX2FfZW49PSAweCUwOHhcbiIsIGNoYW5uZWxfYV9lbik7CgkJIHByaW50ZigiXG5jaGFubmVsX2JfZW49PSAweCUwOHhcbiIsIGNoYW5uZWxfYl9lbik7CgkJICBwcmludGYoIlxuZGRyX3Rlc3Rfc2l6ZT09IDB4JTA4eFxuIiwgZGRyX3Rlc3Rfc2l6ZSk7CgkJICAgcHJpbnRmKCJcbnRlc3RfZGF0YV9zZXR1cF9ob2xkPT0gMHglMDh4XG4iLCB0ZXN0X2RhdGFfc2V0dXBfaG9sZCk7CgkJICAgIHByaW50ZigiXG50ZXN0X2JkbD09IDB4JTA4eFxuIiwgdGVzdF9iZGwpOwppZiAoIGNoYW5uZWxfYV9lbikKewovL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwpPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7Cn0KaWYgKCBjaGFubmVsX2JfZW4pCnsKT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpOwovL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwp9CgoKCi8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nIGRxcyB2YWx1ZQppZiAoY2hhbm5lbF9hX2VuIHx8IGNoYW5uZWxfYl9lbikKewoJLy9kY2FjaGVfZGlzYWJsZSgpOwogLy9zZXJpYWxfcHV0cygiXG5kZWJ1ZyBmb3IgZGRydGVzdCAsamlheGluZyBkaXNhYmxlIGRjYWNoZSIpOwoKfS8vLy9zYXZlIGFuZCBwcmludCBvcmcgdHJhaW5pbmcgZHFzIHZhbHVlCgoKCnsKLy8vL3R1bmUgYW5kIHNhdmUgdHJhaW5pbmcgZHFzIHZhbHVlCmlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoKewoKewoKaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwp9CmVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCnsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKfQplbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCiB7CiByZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwogIH0KCnByaW50ZigiXG5zaG91bGQgcGF1c2UgZGRsIHBpcj09IDB4JTA4eFxuIiwgcmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwogd3JpdGVsKChyZWFkbChERFIwX1BVQl9SRUdfQkFTRSs0KSl8KDE8PDI5KSwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwpwcmludGYoIlxuIHBhdXNlIGRkbCBwaXI9PSAweCUwOHhcbiIsIHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCQkJZm9yICgodGVtcF9jb3VudD0wKTsodGVtcF9jb3VudDwyOCk7KHRlbXBfY291bnQrKykpCgkJCQl7Ci8vZGF0YV9iZGxyMF81X3JlZ19vcmdbdGVtcF9jb3VudF09KCgocmVhZGwoKCh0ZW1wX2NvdW50Pj4yKTw8MikrRERSMF9QVUJfRFgwQkRMUjArKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVtcF9jb3VudC82KStyZWdfYmFzZV9hZGopKQovLwk+Pig4Kih0ZXN0X2JkbCU0KSkpJjB4ZmYpOwpkYXRhX2JkbHIwXzVfcmVnX29yZ1t0ZW1wX2NvdW50XT0oKHJlYWRsKCgodGVtcF9jb3VudCU3KTw8MikrRERSMF9QVUJfRFgwQkRMUjArKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVtcF9jb3VudC83KStyZWdfYmFzZV9hZGopKQoJKTsKCQkJCX07CgoKewogICBkZGxfMTAwc3RlcF9wcz0oKDEwMCoxMDAwKjEwMDApLygyKmdsb2JhbF9kZHJfY2xrKSkvKCgoKHJlYWRsKEREUjBfUFVCX0RYME1ETFIwK3JlZ19iYXNlX2FkaikpKT4+MTYpJjB4ZmYpOwogICBwcmludGYoIlxuZGRsXzEwMHN0ZXBfcHM9PSAlMDhkLDBfNWN5Y2xlX3BzPT0gJTA4ZCwwXzVjeWNsZT09MHglMDh4XG4iLCBkZGxfMTAwc3RlcF9wcywoKDEwMDAqMTAwMCkvKDIqZ2xvYmFsX2Rkcl9jbGspKSwKCSgoKChyZWFkbChERFIwX1BVQl9EWDBNRExSMCtyZWdfYmFzZV9hZGopKSk+PjE2KSYweGZmKSk7CgogIC8vcmVnX2FkZD1ERFIwX1BVQl9EWDBCRExSMCtyZWdfYmFzZV9hZGo7CiAgcmVnX2JkbHJjaz0oKCgodGVzdF9iZGwlMjQpPjExKT8oRERSMF9QVUJfRFgwQkRMUjUpOihERFIwX1BVQl9EWDBCRExSMikpKyhERFIwX1BVQl9EWDFCRExSMC1ERFIwX1BVQl9EWDBCRExSMCkqKHRlc3RfYmRsLzI0KStyZWdfYmFzZV9hZGopOwogICByZWdfYmRscl94PSAoRERSMF9QVUJfRFgwQkRMUjArKCgoKHRlc3RfYmRsJTI0KT4+Mik8PDIpKSsKCShERFIwX1BVQl9EWDFCRExSMC1ERFIwX1BVQl9EWDBCRExSMCkqKHRlc3RfYmRsLzI0KStyZWdfYmFzZV9hZGopOwppZiAoKHRlc3RfYmRsJTI0KT4xMSkKCXtyZWdfYmRscl94PXJlZ19iZGxyX3grNDsvL2R4bmJkbHIzNDUgcmVnaXN0ZXIgYWRkIGhhdmUgYSBnYXAgd2l0aCBkeG5iZGxyMDEyCgl9CiAgIGJkbHJja19yZWdfb3JnPXJlYWRsKHJlZ19iZGxyY2spICA7CiAgYmRscl94X3JlZ19vcmc9cmVhZGwocmVnX2JkbHJfeCk7CiAgcHJpbnRmKCJcbnRlc3RfYmRsICUwOHggfCBkYXRhX3NldHVwX2hvbGQ9PTB4JTA4eFxuICIsdGVzdF9iZGwsdGVzdF9kYXRhX3NldHVwX2hvbGQpOwogIHByaW50ZigiXG5iZGxyMF9yZWdfMHglMDh4X29yZz09MHglMDh4ICB8ICBiZGxyX3hfcmVnXzB4JTA4eF9vcmc9PTB4JTA4eFxuICIscmVnX2JkbHJjaywKCWJkbHJja19yZWdfb3JnLHJlZ19iZGxyX3gsYmRscl94X3JlZ19vcmcpOwppZiAodGVzdF9kYXRhX3NldHVwX2hvbGQgPT0gMCkKewpwcmludGYoIlxudGVzdF9kYXRhX3NldHVwXG4gIik7CgoKCiByZWdfYmRscmNrPSgoKCh0ZXN0X2JkbCUyNCk+MTEpPyhERFIwX1BVQl9EWDBCRExSNSk6KEREUjBfUFVCX0RYMEJETFIyKSkrKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVzdF9iZGwvMjQpK3JlZ19iYXNlX2Fkaik7CiAgIHJlZ19iZGxyX3g9IChERFIwX1BVQl9EWDBCRExSMCsoKCgodGVzdF9iZGwlMjQpPj4yKTw8MikpKwoJKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVzdF9iZGwvMjQpK3JlZ19iYXNlX2Fkaik7CiBpZiAoKHRlc3RfYmRsJTI0KT4xMSkKCXtyZWdfYmRscl94PXJlZ19iZGxyX3grNDsvL2R4bmJkbHIzNDUgcmVnaXN0ZXIgYWRkIGhhdmUgYSBnYXAgd2l0aCBkeG5iZGxyMDEyCgl9CgkgIGJkbHJja19yZWdfb3JnPXJlYWRsKHJlZ19iZGxyY2spICA7CiAgYmRscl94X3JlZ19vcmc9cmVhZGwocmVnX2JkbHJfeCk7CgpkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPSgoYmRscl94X3JlZ19vcmc+Pig4Kih0ZXN0X2JkbCU0KSkpJjB4ZmYpOwp3aGlsZSAoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTxBQ0JETFJfTUFYKQp7CnRlbXBfdGVzdF9lcnJvcj0wOwpkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKys7CnByaW50ZigiXG4gcmVnX2JkbHJfeD09MHglMDh4LHJpZ2h0IHRlbXA9PTB4JTA4eFxuLHZhbHVlPT0weCUwOHgiLHJlZ19iZGxyX3gsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSwKCSgoYmRscl94X3JlZ19vcmcpJih+KDB4ZmY8PCg4Kih0ZXN0X2JkbCU0KSkpKSl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCg4Kih0ZXN0X2JkbCU0KSkpKTsKCgkJewogd3JpdGVsKCgoYmRscl94X3JlZ19vcmcpJih+KDB4ZmY8PCg4Kih0ZXN0X2JkbCU0KSkpKSl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCg4Kih0ZXN0X2JkbCU0KSkpLHJlZ19iZGxyX3gpOwoKCQl9Cgl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgoJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQl7CgkJLy9wcmludGYoIlxud2RxZCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZS0tOwoJCWJyZWFrOwoJCX0KfQpwcmludGYoIlxuIHJpZ2h0IGVkZ2UgZGV0ZWN0ICxyZWc9PTB4JTA4eFxuIiwocmVnX2JkbHJfeCkpOwpwcmludGYoIlxuIG9yZz09MHglMDh4LHJpZ2h0IGVkZ2U9PTB4JTA4eCx2YWx1ZT09MHglMDh4XG4gIiwoKGJkbHJfeF9yZWdfb3JnPj4oOCoodGVzdF9iZGwlNCkpKSYweGZmKSxkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLAoJKChiZGxyX3hfcmVnX29yZykmKH4oMHhmZjw8KDgqKHRlc3RfYmRsJTQpKSkpKXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8KDgqKHRlc3RfYmRsJTQpKSkpOwoKCXtiZGxyX3hfcmVnX3NldHVwX21heD1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlO30KCmRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9MDsKIC8vd3JpdGVsKCgoYWNiZGxyX3hfcmVnX29yZykmKH4oMHhmZjw8KDgqKHRlc3RfYWNiZGwlNCkpKSkpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoOCoodGVzdF9hY2JkbCU0KSkpLHJlZ19hZGQpOwoJIHdyaXRlbCgoKGJkbHJfeF9yZWdfb3JnKSkscmVnX2JkbHJfeCk7Ci8vdGVzdF9hY19zZXR1cF9ob2xkPTE7CnsKIHByaW50ZigiXG50ZXN0X2JkbCAlMDh4IHwgZGF0YV9zZXR1cF9ob2xkPT0weCUwOHggbWRscj09MHglMDh4ICBkZGxfMTAwc3RlcF9wcz09JTA4ZFxuIix0ZXN0X2JkbCx0ZXN0X2RhdGFfc2V0dXBfaG9sZCwKCXJlYWRsKEREUjBfUFVCX0RYME1ETFIwK3JlZ19iYXNlX2FkaiksZGRsXzEwMHN0ZXBfcHMpOwogICBwcmludGYoIlxuYmRscl9ja19yZWdfb3JnPT0weCUwOHggIHwgIGJkbHJfeF9yZWdfb3JnPT0weCUwOHhcbiAiLGJkbHJja19yZWdfb3JnLGJkbHJfeF9yZWdfb3JnKTsKcHJpbnRmKCJhY2JkbHJfeF9yZWdfc2V0dXBfbWF4IDB4JTA4eCAgXAoJc2V0dXAgdGltZT09MHglMDh4LCAlMDhkIHBzIFxuICIsCgliZGxyX3hfcmVnX3NldHVwX21heCwoYmRscl94X3JlZ19zZXR1cF9tYXgtCgkoKGJkbHJfeF9yZWdfb3JnPj4oOCoodGVzdF9iZGwlNCkpKSYweGZmKSksKChiZGxyX3hfcmVnX3NldHVwX21heC0KCSgoYmRscl94X3JlZ19vcmc+Pig4Kih0ZXN0X2JkbCU0KSkpJjB4ZmYpKSAqZGRsXzEwMHN0ZXBfcHMpLzEwMAoJKTsKYmRscjBfOV9yZWdfc2V0dXBfbWF4W3Rlc3RfYmRsXT0oYmRscl94X3JlZ19zZXR1cF9tYXgtCgkoKGJkbHJfeF9yZWdfb3JnPj4oOCoodGVzdF9iZGwlNCkpKSYweGZmKSk7CmJkbHIwXzlfcmVnX3NldHVwX3RpbWVbdGVzdF9iZGxdPSgoYmRscl94X3JlZ19zZXR1cF9tYXgtCgkoKGJkbHJfeF9yZWdfb3JnPj4oOCoodGVzdF9iZGwlNCkpKSYweGZmKSkgKmRkbF8xMDBzdGVwX3BzKS8xMDA7CgkJCWZvciAoKHRlbXBfY291bnQ9MCk7KHRlbXBfY291bnQ8MjgpOyh0ZW1wX2NvdW50KyspKQoJCQkJewoJCQkJIHdyaXRlbCgoKGRhdGFfYmRscjBfNV9yZWdfb3JnW3RlbXBfY291bnRdKSksCgkJCQkJKCgodGVtcF9jb3VudCU3KTw8MikrRERSMF9QVUJfRFgwQkRMUjArKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVtcF9jb3VudC83KStyZWdfYmFzZV9hZGopKTsKCgkJCQl9OwoKfQoKfQoKCgoKaWYgKHRlc3RfZGF0YV9zZXR1cF9ob2xkKQp7CnByaW50ZigiXG50ZXN0X2RhdGFfaG9sZFxuICIpOwoKCgogcmVnX2JkbHJjaz0oKCgodGVzdF9iZGwlMjQpPjExKT8oRERSMF9QVUJfRFgwQkRMUjUpOihERFIwX1BVQl9EWDBCRExSMikpKyhERFIwX1BVQl9EWDFCRExSMC1ERFIwX1BVQl9EWDBCRExSMCkqKHRlc3RfYmRsLzI0KStyZWdfYmFzZV9hZGopOwogICByZWdfYmRscl94PSAoRERSMF9QVUJfRFgwQkRMUjArKCgoKHRlc3RfYmRsJTI0KT4+Mik8PDIpKSsKCShERFIwX1BVQl9EWDFCRExSMC1ERFIwX1BVQl9EWDBCRExSMCkqKHRlc3RfYmRsLzI0KStyZWdfYmFzZV9hZGopOwogICAgaWYgKCh0ZXN0X2JkbCUyNCk+MTEpCgl7cmVnX2JkbHJfeD1yZWdfYmRscl94KzQ7Ly9keG5iZGxyMzQ1IHJlZ2lzdGVyIGFkZCBoYXZlIGEgZ2FwIHdpdGggZHhuYmRscjAxMgoJfQoJICBiZGxyY2tfcmVnX29yZz1yZWFkbChyZWdfYmRscmNrKSAgOwogIGJkbHJfeF9yZWdfb3JnPXJlYWRsKHJlZ19iZGxyX3gpOwoKZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT0oKGJkbHJja19yZWdfb3JnPj4oOCooMSkpKSYweGZmKTsKd2hpbGUgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8QUNCRExSX01BWCkKewp0ZW1wX3Rlc3RfZXJyb3I9MDsKZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSsrOwpwcmludGYoIlxuIHJlZ19iZGxyX2NrPT0weCUwOHgscmlnaHQgdGVtcD09MHglMDh4XG4sdmFsdWU9PTB4JTA4eCIscmVnX2JkbHJjayxkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLAoJKCgoYmRscmNrX3JlZ19vcmcpJih+KDB4ZmZmZjw8KDgqKDEpKSkpKXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8KDgqKDEpKSl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCg4KigyKSkpKSk7CgoJCXsKLy8gd3JpdGVsKCgoKGJkbHJja19yZWdfb3JnKSYofigweGZmZmY8PCg4KigxKSkpKSl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCg4KigxKSkpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoOCooMikpKSkscmVnX2JkbHJjayk7CgoJCX0KCgoKaWYgKCgodGVzdF9iZGwlMjQpPDEyKSkKewoJCQlmb3IgKCh0ZW1wX2NvdW50PTApOyh0ZW1wX2NvdW50PDEyKTsodGVtcF9jb3VudCsrKSkKCQkJCXtpZih0ZW1wX2NvdW50PT0odGVzdF9iZGwlMjQpKQoJCQkJewoJCQkJdGVtcF9yZWdfdmFsdWVbdGVtcF9jb3VudF09KChyZWFkbChERFIwX1BVQl9EWDBCRExSMCsoKCh0ZXN0X2JkbCUyNCk+PjIpPDwyKSsKCShERFIwX1BVQl9EWDFCRExSMC1ERFIwX1BVQl9EWDBCRExSMCkqKHRlc3RfYmRsLzI0KStyZWdfYmFzZV9hZGopKT4+KDgqKHRlbXBfY291bnQlNCkpKSYweGZmOwoJCQkJfWVsc2UKCQkJCXsKCQkJCXRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnRdPSgoKHJlYWRsKEREUjBfUFVCX0RYMEJETFIwKygoKHRlc3RfYmRsJTI0KT4+Mik8PDIpKwoJKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVzdF9iZGwvMjQpK3JlZ19iYXNlX2FkaikpPj4oOCoodGVtcF9jb3VudCU0KSkpJjB4ZmYpKzE7CgkJCQkJfQoJCQkJdGVtcF9yZWdfdmFsdWVbdGVtcF9jb3VudF09KCh0ZW1wX3JlZ192YWx1ZVt0ZW1wX2NvdW50XT5BQ0JETFJfTUFYKT8oQUNCRExSX01BWCk6KHRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnRdKSk7CgoJCQkJCX07CgkJCWZvciAoKHRlbXBfY291bnQ9MCk7KHRlbXBfY291bnQ8MTIpOyh0ZW1wX2NvdW50KyspKQoJCQkJewoJCQkJIHdyaXRlbCgoKCh0ZW1wX3JlZ192YWx1ZVsodGVtcF9jb3VudCldKXwoKHRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnQrMV0pPDwoOCkpfCgoKHRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnQrMl0pPDwoMTYpKSkKCQl8KCh0ZW1wX3JlZ192YWx1ZVt0ZW1wX2NvdW50KzNdKTw8KDI0KSkpKSwKCQkoRERSMF9QVUJfRFgwQkRMUjArKCgodGVtcF9jb3VudCUyNCk+PjIpPDwyKSsKCShERFIwX1BVQl9EWDFCRExSMC1ERFIwX1BVQl9EWDBCRExSMCkqKHRlc3RfYmRsLzI0KStyZWdfYmFzZV9hZGopKTsKCQkJIHRlbXBfY291bnQ9dGVtcF9jb3VudCszOwoJCQkJCX07CgkJCXByaW50ZigiXG4gcmVnX2JkbHJfeD09MHglMDh4LHJpZ2h0IHRlbXA9PTB4JTA4eFxuLHhfdmFsdWU9PTB4JTA4eCIscmVnX2JkbHJfeCxkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLAoJKHJlYWRsKEREUjBfUFVCX0RYMEJETFIwKygoKHRlc3RfYmRsJTI0KT4+Mik8PDIpKwoJKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVzdF9iZGwvMjQpK3JlZ19iYXNlX2FkaikpKTsKCn0KCgppZiAoKCh0ZXN0X2JkbCUyNCkgPj0gMTIpKQp7CgkJCWZvciAoKHRlbXBfY291bnQ9MTIpOyh0ZW1wX2NvdW50PDI0KTsodGVtcF9jb3VudCsrKSkKCQkJCXtpZih0ZW1wX2NvdW50PT0odGVzdF9iZGwlMjQpKQoJCQkJewoJCQkJdGVtcF9yZWdfdmFsdWVbdGVtcF9jb3VudF09KChyZWFkbChERFIwX1BVQl9EWDBCRExSMCsoKCh0ZXN0X2JkbCUyNCk+PjIpPDwyKSs0KwoJKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVzdF9iZGwvMjQpK3JlZ19iYXNlX2FkaikpPj4oOCoodGVtcF9jb3VudCU0KSkpJjB4ZmY7CgkJCQl9ZWxzZQoJCQkJewoJCQkJdGVtcF9yZWdfdmFsdWVbdGVtcF9jb3VudF09KCgocmVhZGwoRERSMF9QVUJfRFgwQkRMUjArKCgodGVzdF9iZGwlMjQpPj4yKTw8MikrNCsKCShERFIwX1BVQl9EWDFCRExSMC1ERFIwX1BVQl9EWDBCRExSMCkqKHRlc3RfYmRsLzI0KStyZWdfYmFzZV9hZGopKT4+KDgqKHRlbXBfY291bnQlNCkpKSYweGZmKSsxOwoJCQkJCX0KCQkJCXRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnRdPSgodGVtcF9yZWdfdmFsdWVbdGVtcF9jb3VudF0+QUNCRExSX01BWCk/KEFDQkRMUl9NQVgpOih0ZW1wX3JlZ192YWx1ZVt0ZW1wX2NvdW50XSkpOwoKCQkJCQl9OwoJCQlmb3IgKCh0ZW1wX2NvdW50PTEyKTsodGVtcF9jb3VudDwyNCk7KHRlbXBfY291bnQrKykpCgkJCQl7CgkJCQkgd3JpdGVsKCgoKHRlbXBfcmVnX3ZhbHVlWyh0ZW1wX2NvdW50KV0pfCgodGVtcF9yZWdfdmFsdWVbdGVtcF9jb3VudCsxXSk8PCg4KSl8KCgodGVtcF9yZWdfdmFsdWVbdGVtcF9jb3VudCsyXSk8PCgxNikpKQoJCXwoKHRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnQrM10pPDwoMjQpKSkpLAoJCShERFIwX1BVQl9EWDBCRExSMCsoKCh0ZW1wX2NvdW50JTI0KT4+Mik8PDIpKzQrCgkoRERSMF9QVUJfRFgxQkRMUjAtRERSMF9QVUJfRFgwQkRMUjApKih0ZXN0X2JkbC8yNCkrcmVnX2Jhc2VfYWRqKSk7CgkJCQkgdGVtcF9jb3VudD10ZW1wX2NvdW50KzM7CgkJCQkJfTsKCQkJCQkJcHJpbnRmKCJcbiByZWdfYmRscl94PT0weCUwOHgscmlnaHQgdGVtcD09MHglMDh4XG4seF92YWx1ZT09MHglMDh4IixyZWdfYmRscl94LGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUsCgkocmVhZGwoRERSMF9QVUJfRFgwQkRMUjArKCgodGVzdF9iZGwlMjQpPj4yKTw8MikrNCsKCShERFIwX1BVQl9EWDFCRExSMC1ERFIwX1BVQl9EWDBCRExSMCkqKHRlc3RfYmRsLzI0KStyZWdfYmFzZV9hZGopKSk7Cn0KCgl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgoJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQl7CgkJLy9wcmludGYoIlxud2RxZCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZS0tOwoJCWJyZWFrOwoJCX0KfQoKcHJpbnRmKCJcbiByaWdodCBlZGdlIGRldGVjdCAscmVnPT0weCUwOHhcbiIsKHJlZ19iZGxyY2spKTsKcHJpbnRmKCJcbiBvcmc9PTB4JTA4eCxyaWdodCBlZGdlPT0weCUwOHgsdmFsdWU9PTB4JTA4eFxuICIsKChiZGxyY2tfcmVnX29yZz4+KDgqKDEpKSkmMHhmZiksZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSwKCSgoKGJkbHJja19yZWdfb3JnKSYofigweGZmZmY8PCg4KigxKSkpKSl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCg4KigxKSkpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoOCooMikpKSkpOwoKCXtiZGxyX3hfcmVnX2hvbGRfbWF4PWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7fQoKZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT0wOwogLy93cml0ZWwoKChhY2JkbHJfeF9yZWdfb3JnKSYofigweGZmPDwoOCoodGVzdF9hY2JkbCU0KSkpKSl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCg4Kih0ZXN0X2FjYmRsJTQpKSkscmVnX2FkZCk7Cgkgd3JpdGVsKCgoYmRscmNrX3JlZ19vcmcpKSxyZWdfYmRscmNrKTsKLy90ZXN0X2FjX3NldHVwX2hvbGQ9MTsKewogcHJpbnRmKCJcbnRlc3RfYmRsICUwOHggfCBkYXRhX3NldHVwX2hvbGQ9PTB4JTA4eCBtZGxyPT0weCUwOHggIGRkbF8xMDBzdGVwX3BzPT0lMDhkXG4iLHRlc3RfYmRsLHRlc3RfZGF0YV9zZXR1cF9ob2xkLAoJcmVhZGwoRERSMF9QVUJfRFgwTURMUjArcmVnX2Jhc2VfYWRqKSxkZGxfMTAwc3RlcF9wcyk7CiAgIHByaW50ZigiXG5iZGxyX2NrX3JlZ19vcmc9PTB4JTA4eCAgfCAgYmRscl94X3JlZ19vcmc9PTB4JTA4eFxuICIsYmRscmNrX3JlZ19vcmcsYmRscl94X3JlZ19vcmcpOwpwcmludGYoImFjYmRscl94X3JlZ19ob2xkX21heCAweCUwOHggIFwKCWhvbGQgdGltZT09MHglMDh4LCAlMDhkIHBzIFxuICIsCgliZGxyX3hfcmVnX2hvbGRfbWF4LChiZGxyX3hfcmVnX2hvbGRfbWF4LQoJKChiZGxyY2tfcmVnX29yZz4+KDgqKDEpKSkmMHhmZikpLCgoYmRscl94X3JlZ19ob2xkX21heC0KCSgoYmRscmNrX3JlZ19vcmc+Pig4KigxKSkpJjB4ZmYpKSAqZGRsXzEwMHN0ZXBfcHMpLzEwMAoJKTsKYmRscjBfOV9yZWdfaG9sZF9tYXhbdGVzdF9iZGxdPShiZGxyX3hfcmVnX2hvbGRfbWF4LQoJKChiZGxyY2tfcmVnX29yZz4+KDgqKDEpKSkmMHhmZikpOwpiZGxyMF85X3JlZ19ob2xkX3RpbWVbdGVzdF9iZGxdPSgoYmRscl94X3JlZ19ob2xkX21heC0KCSgoYmRscmNrX3JlZ19vcmc+Pig4KigxKSkpJjB4ZmYpKSAqZGRsXzEwMHN0ZXBfcHMpLzEwMDsKCQkJZm9yICgodGVtcF9jb3VudD0wKTsodGVtcF9jb3VudDwyOCk7KHRlbXBfY291bnQrKykpCgkJCQl7CgkJCQkgd3JpdGVsKCgoZGF0YV9iZGxyMF81X3JlZ19vcmdbdGVtcF9jb3VudF0pKSwKCQkJCQkoKCh0ZW1wX2NvdW50JTcpPDwyKStERFIwX1BVQl9EWDBCRExSMCsoRERSMF9QVUJfRFgxQkRMUjAtRERSMF9QVUJfRFgwQkRMUjApKih0ZW1wX2NvdW50LzcpK3JlZ19iYXNlX2FkaikpOwoKCQkJCX07Cgp9Cgp9CgoKCgoKIH0KfQoKfQoKIC8vICBkZGxfMTAwc3RlcF9wcz0oKDEwMCoxMDAwKjEwMDApLygyKmdsb2JhbF9kZHJfY2xrKSkvKCgoKHJlYWRsKEREUjBfUFVCX0FDTURMUjArcmVnX2Jhc2VfYWRqKSkpPj4xNikmMHhmZik7CgoKCnByaW50ZigiXG5kZGxfMTAwc3RlcF9wcz09ICUwOGQsMF81Y3ljbGVfcHM9PSAlMDhkXG4iLCBkZGxfMTAwc3RlcF9wcywoKDEwMDAqMTAwMCkvKDIqZ2xvYmFsX2Rkcl9jbGspKSk7CgpwcmludGYoIlxucmVzdW1lICBkZGwgcGlyPT0gMHglMDh4XG4iLCByZWFkbChERFIwX1BVQl9SRUdfQkFTRSs0KSk7CmlmIChvcGVuX3Z0KQp7CiB3cml0ZWwoKHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKSYofigxPDwyOSkpLChERFIwX1BVQl9SRUdfQkFTRSs0KSk7Cn0KcHJpbnRmKCJcbiByZXN1bWUgZGRsIHBpcj09IDB4JTA4eFxuIiwgcmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwoKIHJldHVybiBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoKCgp9Cgp1c2FnZToKCWNtZF91c2FnZShjbWR0cCk7CgkvLyovCglyZXR1cm4gMTsKfQpVX0JPT1RfQ01EKAoJZGRyX3Rlc3RfZGF0YV9iaXRfc2V0dXBfaG9sZF93aW5kb3csCTYsCTEsCWRvX2Rkcl90ZXN0X2RhdGFfYml0X3NldHVwX2hvbGRfd2luZG93LAoJIkREUiB0ZXN0IGRhdGEgYml0IG1hcmdpbiBmdW5jdGlvbiIsCgkiZGRyX3Rlc3RfZGF0YV9iaXRfc2V0dXBfaG9sZF93aW5kb3cgYSAwIDB4ODAwMDAwMCAwIDMgb3IgZGRyX3Rlc3RfZGF0YV9iaXRfc2V0dXBfaG9sZF93aW5kb3cgYSAwIDB4ODAwMDAwMCAxIDMgIFxuIGRjYWNoZSBvZmYgPyBcbiIKKTsKCnVuc2lnbmVkIGludApkb190ZXN0X2FkZHJlc3NfYnVzKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqIGJhc2VBZGRyZXNzLCB1bnNpZ25lZCBpbnQgbkJ5dGVzKQp7Cgl1bnNpZ25lZCBpbnQgYWRkcmVzc01hc2sgPSAobkJ5dGVzL3NpemVvZih1bnNpZ25lZCBpbnQpIC0gMSk7Cgl1bnNpZ25lZCBpbnQgb2Zmc2V0OwoJdW5zaWduZWQgaW50IHRlc3RPZmZzZXQ7CgoJdW5zaWduZWQgaW50IHBhdHRlcm4JID0gKHVuc2lnbmVkIGludCkgMHhBQUFBQUFBQTsKCXVuc2lnbmVkIGludCBhbnRpcGF0dGVybiA9ICh1bnNpZ25lZCBpbnQpIDB4NTU1NTU1NTU7CgoJdW5zaWduZWQgaW50IGRhdGExLCBkYXRhMjsKCgl1bnNpZ25lZCBpbnQgcmV0ID0gMDsKCgkvKgoJICogV3JpdGUgdGhlIGRlZmF1bHQgcGF0dGVybiBhdCBlYWNoIG9mIHRoZSBwb3dlci1vZi10d28gb2Zmc2V0cy4KCSAqLwoJZm9yIChvZmZzZXQgPSAxOyAob2Zmc2V0ICYgYWRkcmVzc01hc2spICE9IDA7IG9mZnNldCA8PD0gMSkKCXsKCQliYXNlQWRkcmVzc1tvZmZzZXRdID0gcGF0dGVybjsKCX0KCgkvKgoJICogQ2hlY2sgZm9yIGFkZHJlc3MgYml0cyBzdHVjayBoaWdoLgoJICovCgl0ZXN0T2Zmc2V0ID0gMDsKCWJhc2VBZGRyZXNzW3Rlc3RPZmZzZXRdID0gYW50aXBhdHRlcm47CgoJZm9yIChvZmZzZXQgPSAxOyAob2Zmc2V0ICYgYWRkcmVzc01hc2spICE9IDA7IG9mZnNldCA8PD0gMSkKCXsKCQlkYXRhMSA9IGJhc2VBZGRyZXNzW29mZnNldF07CgkJZGF0YTIgPSBiYXNlQWRkcmVzc1tvZmZzZXRdOwoJCWlmIChkYXRhMSAhPSBkYXRhMikKCQl7CgkJCXByaW50ZigiICBtZW1UZXN0QWRkcmVzc0J1cyAtIHJlYWQgdHdpY2UgZGlmZmVyZW50W29mZnNldF06IDB4JTh4LTB4JTh4XG4iLCBkYXRhMSwgZGF0YTIpOwoJCQlyZXQgPSAxOwoJCX0KCQlpZiAoZGF0YTEgIT0gcGF0dGVybikKCQl7CgkJCXByaW50ZigiICBtZW1UZXN0QWRkcmVzc0J1cyAtIHdyaXRlWzB4JTh4XTogMHglOHgsIHJlYWRbMHglOHhdOiAweCU4eFxuIiwgXAoJCQkJb2Zmc2V0LCBwYXR0ZXJuLCBvZmZzZXQsIGRhdGExKTsKCQkJcmV0ID0gMTsKCQkJLy9yZXR1cm4gKCh1bnNpZ25lZCBpbnQpICZiYXNlQWRkcmVzc1tvZmZzZXRdKTsKCQl9Cgl9CgoJYmFzZUFkZHJlc3NbdGVzdE9mZnNldF0gPSBwYXR0ZXJuOwoKCS8qCgkgKiBDaGVjayBmb3IgYWRkcmVzcyBiaXRzIHN0dWNrIGxvdyBvciBzaG9ydGVkLgoJICovCglmb3IgKHRlc3RPZmZzZXQgPSAxOyAodGVzdE9mZnNldCAmIGFkZHJlc3NNYXNrKSAhPSAwOyB0ZXN0T2Zmc2V0IDw8PSAxKQoJewoJCWJhc2VBZGRyZXNzW3Rlc3RPZmZzZXRdID0gYW50aXBhdHRlcm47CgoJCWlmIChiYXNlQWRkcmVzc1swXSAhPSBwYXR0ZXJuKQoJCXsKCQkJcHJpbnRmKCIgIG1lbVRlc3RBZGRyZXNzQnVzMiAtIHdyaXRlIGJhc2VBZGRyZXNzWzB4JTh4XTogMHglOHgsIHJlYWQgYmFzZUFkZHJlc3NbMF06IDB4JTh4XG4iLCBcCgkJCQl0ZXN0T2Zmc2V0LCBhbnRpcGF0dGVybiwgYmFzZUFkZHJlc3NbMF0pOwoJCQlyZXQgPSAxOwoJCQkvL3JldHVybiAoKHVuc2lnbmVkIGludCkgJmJhc2VBZGRyZXNzW3Rlc3RPZmZzZXRdKTsKCQl9CgoJCWZvciAob2Zmc2V0ID0gMTsgKG9mZnNldCAmIGFkZHJlc3NNYXNrKSAhPSAwOyBvZmZzZXQgPDw9IDEpCgkJewoJCQlkYXRhMSA9IGJhc2VBZGRyZXNzW29mZnNldF07CgkJCWlmICgoZGF0YTEgIT0gcGF0dGVybikgJiYgKG9mZnNldCAhPSB0ZXN0T2Zmc2V0KSkKCQkJewoJCQkJcHJpbnRmKCIgIG1lbVRlc3RBZGRyZXNzQnVzMyAtIHdyaXRlIGJhc2VBZGRyZXNzWzB4JTh4XTogMHglOHgsIHJlYWQgYmFzZUFkZHJlc3NbMHglOHhdOiAweCU4eFxuIiwgXAoJCQkJCXRlc3RPZmZzZXQsIGFudGlwYXR0ZXJuLCB0ZXN0T2Zmc2V0LCBkYXRhMSk7CgkJCQlyZXQgPSAxOwoJCQkJLy9yZXR1cm4gKCh1bnNpZ25lZCBpbnQpICZiYXNlQWRkcmVzc1t0ZXN0T2Zmc2V0XSk7CgkJCX0KCQl9CgoJCWJhc2VBZGRyZXNzW3Rlc3RPZmZzZXRdID0gcGF0dGVybjsKCX0KCgpmb3IgKG9mZnNldCA9IDB4MTsgKG9mZnNldCA8PWFkZHJlc3NNYXNrKSA7IG9mZnNldCsrKQoJewoJaWYgKCgofm9mZnNldCkgPD0gYWRkcmVzc01hc2spICkKCQl7CgkJYmFzZUFkZHJlc3Nbb2Zmc2V0XSA9IHBhdHRlcm47CgkJYmFzZUFkZHJlc3NbKH5vZmZzZXQpXSA9IGFudGlwYXR0ZXJuOwoJCX0KCX0KCmZvciAob2Zmc2V0ID0gMHgxOyAob2Zmc2V0IDw9YWRkcmVzc01hc2spOyBvZmZzZXQrKykKCXsKCWlmICgoKH5vZmZzZXQpIDw9IGFkZHJlc3NNYXNrKSApCgkJewoJCWlmIChiYXNlQWRkcmVzc1tvZmZzZXRdICE9IHBhdHRlcm4pCgkJCXsKCQkJcHJpbnRmKCIgIG1lbVRlc3RBZGRyZXNzQnVzNCAtIHdyaXRlIGJhc2VBZGRyZXNzWzB4JTh4XTogMHglOHgsIHJlYWQgYmFzZUFkZHJlc3NbMHglOHhdOiAweCU4eFxuIiwgXAoJCQkJCW9mZnNldCwgcGF0dGVybiwgb2Zmc2V0LCBiYXNlQWRkcmVzc1tvZmZzZXRdKTsKCgkJCXJldCA9IDE7CgkJCWJyZWFrOwoJCQl9CgoJCQlpZiAoYmFzZUFkZHJlc3NbKH5vZmZzZXQpXSAhPSBhbnRpcGF0dGVybikKCQkJewoJCQlwcmludGYoIiAgbWVtVGVzdEFkZHJlc3NCdXM1IC0gd3JpdGUgYmFzZUFkZHJlc3NbMHglOHhdOiAweCU4eCwgcmVhZCBiYXNlQWRkcmVzc1sweCU4eF06IDB4JTh4XG4iLCBcCgkJCQkJKCh+b2Zmc2V0KSksIGFudGlwYXR0ZXJuLCAoKH5vZmZzZXQpKSwgYmFzZUFkZHJlc3NbKCh+b2Zmc2V0KSldKTsKCQkJcmV0ID0gMTsKCQkJYnJlYWs7CgkJCX0KCQl9Cgl9CgppZiAocmV0KQp7cmV0dXJuIChyZXQpOwp9Ci8vdW5zaWduZWQgaW50IHN1cV92YWx1ZTsKZm9yIChvZmZzZXQgPSAweDE7IChvZmZzZXQgPD1hZGRyZXNzTWFzaykgOyBvZmZzZXQrKykKCXsKCgkJewoJCXBhdHRlcm49KChvZmZzZXQ8PDIpLW9mZnNldCk7CgkJYmFzZUFkZHJlc3Nbb2Zmc2V0XSA9IHBhdHRlcm47CgkJLy9iYXNlQWRkcmVzc1sofm9mZnNldCldID0gYW50aXBhdHRlcm47CgkJfQoJfQoKZm9yIChvZmZzZXQgPSAweDE7IChvZmZzZXQgPD1hZGRyZXNzTWFzayk7IG9mZnNldCsrKQoJewoKCQl7CgkJcGF0dGVybj0oKG9mZnNldDw8Miktb2Zmc2V0KTsKCQlpZiAoYmFzZUFkZHJlc3Nbb2Zmc2V0XSAhPSBwYXR0ZXJuKQoJCQl7CgkJCXByaW50ZigiICBtZW1UZXN0QWRkcmVzc0J1czYgLSB3cml0ZSBiYXNlQWRkcmVzc1sweCU4eF06IDB4JTh4LCByZWFkIGJhc2VBZGRyZXNzWzB4JTh4XTogMHglOHhcbiIsIFwKCQkJCQlvZmZzZXQscGF0dGVybiwgb2Zmc2V0LCBiYXNlQWRkcmVzc1tvZmZzZXRdKTsKCQkJcmV0ID0gMTsKCQkJYnJlYWs7CgkJCX0KCgoJCX0KCX0KaWYgKHJldCkKe3JldHVybiAocmV0KTsKfQpmb3IgKG9mZnNldCA9IDB4MTsgKG9mZnNldCA8PWFkZHJlc3NNYXNrKSA7IG9mZnNldCsrKQoJewoKCQl7CgkJcGF0dGVybj1+KChvZmZzZXQ8PDIpLW9mZnNldCk7CgkJYmFzZUFkZHJlc3Nbb2Zmc2V0XSA9IHBhdHRlcm47CgkJLy9iYXNlQWRkcmVzc1sofm9mZnNldCldID0gYW50aXBhdHRlcm47CgkJfQoJfQoKZm9yIChvZmZzZXQgPSAweDE7IChvZmZzZXQgPD1hZGRyZXNzTWFzayk7IG9mZnNldCsrKQoJewoKCQl7CgkJcGF0dGVybj1+KChvZmZzZXQ8PDIpLW9mZnNldCk7CgkJaWYgKGJhc2VBZGRyZXNzW29mZnNldF0gIT0gcGF0dGVybikKCQkJewoJCQlwcmludGYoIiAgbWVtVGVzdEFkZHJlc3NCdXM3IC0gd3JpdGUgYmFzZUFkZHJlc3NbMHglOHhdOiAweCU4eCwgcmVhZCBiYXNlQWRkcmVzc1sweCU4eF06IDB4JTh4XG4iLCBcCgkJCQkJb2Zmc2V0LHBhdHRlcm4sIG9mZnNldCwgYmFzZUFkZHJlc3Nbb2Zmc2V0XSk7CgkJCXJldCA9IDE7CgkJCWJyZWFrOwoJCQl9CgoKCQl9Cgl9CgoKCXJldHVybiAocmV0KTsKfSAgIC8qIG1lbVRlc3RBZGRyZXNzQnVzKCkgKi8KCmludCBkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oaW50IGRkcl90ZXN0X3NpemUpCnsKLy8gdW5zaWduZWQgaW50ICBzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUjsKIHVuc2lnbmVkIGludCAgc3RhcnRfYWRkcj10ZXN0X3N0YXJ0X2FkZHI7CgllcnJvcl9vdXRvZl9jb3VudF9mbGFnPTE7CgkJZXJyb3JfY291bnQ9MDsKCiBwcmludGYoIlxyU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCSAgICBwcmludGYoIlxyRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgIHByaW50ZigiXG5TdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICAgZGRyX3JlYWQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJICAgIHByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICBwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgIGRkcl9yZWFkKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCgkJcHJpbnRmKCJcclN0YXJ0IHdyaXRpbmcgcGF0dGVybjQgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIGRkcl90ZXN0X3NpemUpOwoJCWRkcl93cml0ZTQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJICAgcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgICBwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgIGRkcl9yZWFkNCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkgICBwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgIHByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICAgZGRyX3JlYWQ0KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCnByaW50ZigiXHJTdGFydCB3cml0aW5nIGFkZCBwYXR0ZXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CmlmIChkb190ZXN0X2FkZHJlc3NfYnVzKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKSkKe2Vycm9yX2NvdW50Kys7Cn0KCi8qCiBwcmludGYoIlxuU3RhcnQgKjQgbm8gY3Jvc3MgdGFsayBwYXR0ZXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCSAgcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIGRkcl90ZXN0X3NpemUpOwoJCWRkcl93cml0ZV9wYXR0ZXJuNF9ub19jcm9zc190YWxrKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCSAgICBwcmludGYoIlxuRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgIHByaW50ZigiXG5TdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICAgZGRyX3JlYWRfcGF0dGVybjRfbm9fY3Jvc3NfdGFsaygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkgICAgcHJpbnRmKCJcbkVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgICBwcmludGYoIlxuU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgIGRkcl9yZWFkX3BhdHRlcm40X25vX2Nyb3NzX3RhbGsoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoKLy9pZihjcm9zc190YWxrX3BhdHRlcm5fZmxhZz09MSkKewoJCSAgICBwcmludGYoIlxuU3RhcnQgKjQgIGNyb3NzIHRhbGsgcGF0dGVybiBwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCSAgcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIGRkcl90ZXN0X3NpemUpOwoJCWRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJICAgIHByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICAgcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgICBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJICAgIHByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICAgcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgICBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJICAgIHByaW50ZigiXHJFbmQgMm5kIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgoJIC8vICAgcHJpbnRmKCJcclN0YXJ0IDNyZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCS8vICAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkvLyAgICBwcmludGYoIlxyRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgoJCQkgICAgcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkgIHByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCQlkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCSAgICBwcmludGYoIlxyRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgIHByaW50ZigiXHJTdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCSAgICBwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgIHByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCSAgICBwcmludGYoIlxyRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJLy8gICAgcHJpbnRmKCJcclN0YXJ0IDNyZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCS8vICAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkgLy8gICBwcmludGYoIlxyRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgoKfQoKewoJCSAgICBwcmludGYoIlxuU3RhcnQgKjQgIGNyb3NzIHRhbGsgcGF0dGVybiBwMi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkgIHByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCQlkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19wMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkgICAgcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgICBwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcDIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJICAgIHByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICAgcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgICBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AyKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCSAgICBwcmludGYoIlxyRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoKCSAvLyAgIHByaW50ZigiXHJTdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkvLyAgICBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJLy8gICAgcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCQkJICAgIHByaW50ZigiXG5TdGFydCAqNCAgY3Jvc3MgdGFsayBwYXR0ZXJuIG4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJICBwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJICAgIHByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICAgcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgICBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCSAgICBwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgIHByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkgICAgcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCS8vICAgIHByaW50ZigiXHJTdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkvLyAgICBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24oKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJIC8vICAgcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCn0KKi8KaWYgKGVycm9yX2NvdW50KQoJcmV0dXJuIDE7CmVsc2UKCXJldHVybiAwOwp9CgppbnQgZG9fZGRyX3Rlc3RfYWNfd2luZG93c19hY2xjZGxyKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewogICBwcmludGYoIlxuRW50ZXIgVGVzdCBkZHIgYWMgd2luZG93cyBmdW5jdGlvblxuIik7CiAgIHByaW50ZigiXG5zZXQgZGRyICB0ZXN0IHRlc3Rfc3RhcnRfYWRkcj09MHglMDh4IFxuIix0ZXN0X3N0YXJ0X2FkZHIpOwogLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwogIHByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKIC8vICB1bnNpZ25lZCBpbnQgICBsb29wID0gMTsKICAgLy91bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2kgPSAxOwogLy8gIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaj0gMTsKICAvLyAgdW5zaWduZWQgaW50ICAgdGVtcF9jb3VudF9rPSAxOwogICB1bnNpZ25lZCBpbnQgICB0ZW1wX3Rlc3RfZXJyb3I9IDA7CgoKCSBjaGFyICplbmRwOwogLy8gIHVuc2lnbmVkIGludCAgICpwX3N0YXJ0X2FkZHI7CiAgdW5zaWduZWQgaW50ICAgdGVzdF9sb29wPTE7CiAgIHVuc2lnbmVkIGludCAgIHRlc3RfdGltZXM9MTsKICAgdW5zaWduZWQgaW50ICAgcmVnX2FkZD0wOwogICB1bnNpZ25lZCBpbnQgICByZWdfYmFzZV9hZGo9MDsKCQkgIHVuc2lnbmVkIGludCAgIGNoYW5uZWxfYV9lbiA9IDA7CgkgICB1bnNpZ25lZCBpbnQgICBjaGFubmVsX2JfZW4gPSAwOwoJICAgdW5zaWduZWQgaW50ICAgdGVzdGluZ19jaGFubmVsID0gMDsKCgoKCSAgI2RlZmluZSAgQ0hBTk5FTF9BICAwCgkgICNkZWZpbmUgIENIQU5ORUxfQiAgMQoKCgoKCgoJICNkZWZpbmUgIEREUl9DT1JTU19UQUxLX1RFU1RfU0laRSAgIDB4MjAwMDAKCgkJICAgdW5zaWduZWQgaW50ICBhY19tZGxyX2Ffb3JnPTA7CgkgICB1bnNpZ25lZCBpbnQgIGFjX21kbHJfYl9vcmc9MDsKCgkgIHVuc2lnbmVkIGludCAgYWNfbGNkbHJfYV9vcmc9MDsKCSAgdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYV9vcmc9MDsKCSAgdW5zaWduZWQgaW50ICBhY19sY2Rscl9iX29yZz0wOwoJICB1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9iX29yZz0wOwoJICB1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2FfcmlnPTA7CgkgIHVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2FfcmlnPTA7CgkgIHVuc2lnbmVkIGludCAgYWNfbGNkbHJfYl9yaWc9MDsKCSAgdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYl9yaWc9MDsKCSAgdW5zaWduZWQgaW50ICBhY19sY2Rscl9hX2xlZj0wOwoJICB1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9hX2xlZj0wOwoJICB1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2JfbGVmPTA7CgkgIHVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2JfbGVmPTA7CgoJCXVuc2lnbmVkIGludCAgYWNfbGNkbHJfYV9yaWdfbWluPTA7CgkgIHVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2FfcmlnX21pbj0wOwoJICB1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2JfcmlnX21pbj0wOwoJICB1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9iX3JpZ19taW49MDsKCSAgdW5zaWduZWQgaW50ICBhY19sY2Rscl9hX2xlZl9taW49MDsKCSAgdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYV9sZWZfbWluPTA7CgkgIHVuc2lnbmVkIGludCAgYWNfbGNkbHJfYl9sZWZfbWluPTA7CgkgIHVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2JfbGVmX21pbj0wOwoJICAgIHVuc2lnbmVkIGludCAgYWNfbGNkbHJfdGVtcD0wOwoJICB1bnNpZ25lZCBpbnQgICBhY19iZGxyMF90ZW1wPTA7CgoKCgkgICAgdW5zaWduZWQgaW50ICAgZGRyX3Rlc3Rfc2l6ZT0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoKLy8jZGVmaW5lIEREUl9URVNUX0FDTENETFIKCgoJIGlmIChhcmdjID09IDIpCgkJewogICAgaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkpCgoJe2NoYW5uZWxfYV9lbiA9IDE7Cgl9CgllbHNlIGlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApKQoKCXtjaGFubmVsX2JfZW4gPSAxOwoJfQoJZWxzZQoJCXsKCWdvdG8gdXNhZ2U7CgkJfQoJCX0KCQlpZiAoYXJnYyA+IDIpCgkJewogICAgaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkEiKSA9PSAwKSkKCgl7Y2hhbm5lbF9hX2VuID0gMTsKCX0KICAgICBpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJCIikgPT0gMCkpCgoJe2NoYW5uZWxfYl9lbiA9IDE7Cgl9CgkJCX0KCQkgICBkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwogIGlmIChhcmdjID4zKSB7CglkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgJmVuZHAsIDE2KTsKICAgICAgICBpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJCX0KCgl9CiAgICBpZiAoYXJnYyA+NCkgewoJdGVzdF9sb29wID0gc2ltcGxlX3N0cnRvdWwoYXJndls0XSwgJmVuZHAsIDE2KTsKICAgICAgICBpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCXRlc3RfbG9vcCA9IDE7CgkJCX0KCQkgaWYgICAoKHN0cmNtcChhcmd2WzRdLCAibCIpID09IDApIHx8IChzdHJjbXAoYXJndls0XSwgIkwiKSA9PSAwKSkKCQkJewoJCQl0ZXN0X2xvb3AgPSAxMDAwMDA7CgkJCX0KCX0KCgoJCSBwcmludGYoIlxuY2hhbm5lbF9hX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2FfZW4pOwoJCSBwcmludGYoIlxuY2hhbm5lbF9iX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2JfZW4pOwoJCSAgcHJpbnRmKCJcbmRkcl90ZXN0X3NpemU9PSAweCUwOHhcbiIsIGRkcl90ZXN0X3NpemUpOwoJCSAgIHByaW50ZigiXG50ZXN0X2xvb3A9PSAweCUwOHhcbiIsIHRlc3RfbG9vcCk7CmlmICggY2hhbm5lbF9hX2VuKQp7Ci8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7Ck9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKTsKfQppZiAoIGNoYW5uZWxfYl9lbikKewpPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCk7Ci8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7Cn0KCgovL3NhdmUgYW5kIHByaW50IG9yZyB0cmFpbmluZyBkcXMgdmFsdWUKaWYgKGNoYW5uZWxfYV9lbiB8fCBjaGFubmVsX2JfZW4pCnsKCgoJLy9kY2FjaGVfZGlzYWJsZSgpOwogLy9zZXJpYWxfcHV0cygiXG5kZWJ1ZyBmb3IgZGRydGVzdCAsamlheGluZyBkaXNhYmxlIGRjYWNoZSIpOwoKewpmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCnsKaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwp9CmVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCnsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKfQplbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCiB7CmlmICggdGVzdGluZ19jaGFubmVsID09IENIQU5ORUxfQSkKICAgewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwogcmVnX2FkZD1ERFIwX1BVQl9BQ01ETFIrcmVnX2Jhc2VfYWRqOwoKCgogICB9CmVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQogICB7CnJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgogcmVnX2FkZD1ERFIwX1BVQl9BQ01ETFIrcmVnX2Jhc2VfYWRqOwoKCgogICB9CiB9CgogcmVnX2FkZD1ERFIwX1BVQl9BQ01ETFIrcmVnX2Jhc2VfYWRqOwoKcHJpbnRmKCJcbnRlc3QgQSBjaGFubmVsIEFDMTEwXG4iKTsKaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0FfUkVHX0JBU0UpCnsKcHJpbnRmKCJcbnRlc3QgQSBjaGFubmVsIDB4JTA4eFxuIixyZWdfYWRkKTsKIGFjX21kbHJfYV9vcmc9KHVuc2lnbmVkIGludCApKHJlYWRsKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQpKTsvL3JlYWRsKHJlZ19hZGQpOy8vMHhjODgzNjAwMAoJICAgYWNfbGNkbHJfYV9vcmc9KHVuc2lnbmVkIGludCApKHJlYWRsKCh1bnNpZ25lZCBpbnQgKShyZWdfYWRkK0REUjBfUFVCX0FDTENETFItRERSMF9QVUJfQUNNRExSKSkpOy8vcmVhZGwocmVnX2FkZCs0KTsKCWFjX2JkbHIwX2Ffb3JnPSh1bnNpZ25lZCBpbnQgKShyZWFkbCgodW5zaWduZWQgaW50ICkocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUikpKTsvL3JlYWRsKHJlZ19hZGQrOCk7CglwcmludGYoIlxudGVzdCBBIGNoYW5uZWwgQUMxMTNcbiIpOwoJcHJpbnRmKCJcbiBhY19tZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCksIGFjX21kbHJfYV9vcmcpOwoJcHJpbnRmKCJcbiBhY19sY2Rscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpLCBhY19sY2Rscl9hX29yZyk7CglwcmludGYoIlxuIGFjX2JkbHIwX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUiksIGFjX2JkbHIwX2Ffb3JnKTsKfQppZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQl9SRUdfQkFTRSkKewpwcmludGYoIlxudGVzdCBBIGNoYW5uZWwgQUMxMTJcbiIpOwogIGFjX21kbHJfYl9vcmc9cmVhZGwocmVnX2FkZCk7CgkgICBhY19sY2Rscl9iX29yZz1yZWFkbChyZWdfYWRkK0REUjBfUFVCX0FDTENETFItRERSMF9QVUJfQUNNRExSKTsKCWFjX2JkbHIwX2Jfb3JnPXJlYWRsKHJlZ19hZGQrRERSMF9QVUJfQUNCRExSMC1ERFIwX1BVQl9BQ01ETFIpOwoJcHJpbnRmKCJcbiBhY19tZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCksIGFjX21kbHJfYl9vcmcpOwoJcHJpbnRmKCJcbiBhY19sY2Rscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpLCBhY19sY2Rscl9iX29yZyk7CglwcmludGYoIlxuIGFjX2JkbHIwX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUiksIGFjX2JkbHIwX2Jfb3JnKTsKfQoKCn0KCn0KCn0vLy8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nICB2YWx1ZQoKCmZvciAodGVzdF90aW1lcz0wOyh0ZXN0X3RpbWVzPHRlc3RfbG9vcCk7KHRlc3RfdGltZXMrKykpCnsKLy8vL3R1bmUgYW5kIHNhdmUgdHJhaW5pbmcgZHFzIHZhbHVlCmlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoKewpmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCnsKCmlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCnsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKfQplbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQp7CnJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7Cn0KZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQogewppZiAoIHRlc3RpbmdfY2hhbm5lbCA9PSBDSEFOTkVMX0EpCiAgIHsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKICAgfQplbHNlIGlmKCB0ZXN0aW5nX2NoYW5uZWw9PUNIQU5ORUxfQikKICAgewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwogICB9CiB9CgppZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQV9SRUdfQkFTRSkKewpwcmludGYoIlxudGVzdCBBIGNoYW5uZWwgQUNcbiIpOwp9CmVsc2UKewpwcmludGYoIlxudGVzdCBCIGNoYW5uZWwgQUNcbiIpOwp9Cgp7CnsKCS8vI2lmZGVmIEREUl9URVNUX0FDTENETFIKCiByZWdfYWRkPUREUjBfUFVCX0FDTENETFIrcmVnX2Jhc2VfYWRqOwoKYWNfbGNkbHJfdGVtcD1yZWFkbChyZWdfYWRkKTsKCndoaWxlIChhY19sY2Rscl90ZW1wPjApCnsKdGVtcF90ZXN0X2Vycm9yPTA7CmFjX2xjZGxyX3RlbXAtLTsKCnByaW50ZigiXG5sY2RsciB0ZXN0IHZhbHVlPT0weCUwOHhcbiAiLGFjX2xjZGxyX3RlbXApOwoJIHdyaXRlbChhY19sY2Rscl90ZW1wLChyZWdfYWRkKSk7CgkgI2lmZGVmIEREUl9MQ0RMUl9DS19VU0VfRkFTVF9QQVRURVJOCgl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJICNlbHNlCiAgIHRlbXBfdGVzdF9lcnJvcj0gZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwogIHRlbXBfdGVzdF9lcnJvcj0gdGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwogICNlbmRpZgoJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQl7CgkJLy9wcmludGYoIlxud2RxZCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJYWNfbGNkbHJfdGVtcCsrOwoJCWJyZWFrOwoJCX0KfQoKcHJpbnRmKCJcbmxjZGxyIGxlZnQgZWRnZSBkZXRlY3QgXG4iKTsKcHJpbnRmKCJcbmxjZGxyIGxlZnQgZWRnZT09MHglMDh4XG4gIixhY19sY2Rscl90ZW1wKTsKaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0FfUkVHX0JBU0UpCnsKYWNfbGNkbHJfYV9sZWY9YWNfbGNkbHJfdGVtcDsKYWNfbGNkbHJfdGVtcD1hY19sY2Rscl9hX29yZzsKfQplbHNlCnsKYWNfbGNkbHJfYl9sZWY9YWNfbGNkbHJfdGVtcDsKYWNfbGNkbHJfdGVtcD1hY19sY2Rscl9iX29yZzsKCn0KIHdyaXRlbChhY19sY2Rscl90ZW1wLChyZWdfYWRkKSk7Cgogd2hpbGUgKGFjX2xjZGxyX3RlbXA8QUNMQ0RMUl9NQVgpCnsKdGVtcF90ZXN0X2Vycm9yPTA7CmFjX2xjZGxyX3RlbXArKzsKcHJpbnRmKCJcbmxjZGxyIHRlc3QgdmFsdWU9PTB4JTA4eFxuICIsYWNfbGNkbHJfdGVtcCk7Cgkgd3JpdGVsKGFjX2xjZGxyX3RlbXAsKHJlZ19hZGQpKTsKCSAjaWZkZWYgRERSX0xDRExSX0NLX1VTRV9GQVNUX1BBVFRFUk4KCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkgI2Vsc2UKICAgdGVtcF90ZXN0X2Vycm9yPSBkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CiAgdGVtcF90ZXN0X2Vycm9yPSB0ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CiAgI2VuZGlmCglpZiAodGVtcF90ZXN0X2Vycm9yKQoJCXsKCQkvL3ByaW50ZigiXG5sY2RsciByaWdodCBlZGdlIGRldGVjdCBcbiIpOwoJCWFjX2xjZGxyX3RlbXAtLTsKCQlicmVhazsKCQl9Cn0KcHJpbnRmKCJcbmxjZGxycmlnaHQgZWRnZSBkZXRlY3QgXG4iKTsKcHJpbnRmKCJcbmxjZGxyIHJpZ2h0IGVkZ2U9PTB4JTA4eFxuICIsYWNfbGNkbHJfdGVtcCk7CgoKCmlmIChyZWdfYmFzZV9hZGogPT0gQ0hBTk5FTF9BX1JFR19CQVNFKQp7CmFjX2xjZGxyX2FfcmlnPWFjX2xjZGxyX3RlbXA7CmFjX2xjZGxyX3RlbXA9YWNfbGNkbHJfYV9vcmc7Cn0KZWxzZQp7CmFjX2xjZGxyX2JfcmlnPWFjX2xjZGxyX3RlbXA7CmFjX2xjZGxyX3RlbXA9YWNfbGNkbHJfYl9vcmc7Cgp9CndyaXRlbChhY19sY2Rscl90ZW1wLChyZWdfYWRkKSk7CgoKCi8vI2VuZGlmCgp7CiAgIHJlZ19hZGQ9RERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGo7CgphY19iZGxyMF90ZW1wPXJlYWRsKHJlZ19hZGQpOwp3aGlsZSAoYWNfYmRscjBfdGVtcD4wKQp7CnRlbXBfdGVzdF9lcnJvcj0wOwphY19iZGxyMF90ZW1wLS07CglwcmludGYoIlxuYmRscjAgdGVzdCB2YWx1ZT09MHglMDh4XG4gIixhY19iZGxyMF90ZW1wKTsKCSB3cml0ZWwoYWNfYmRscjBfdGVtcCwocmVnX2FkZCkpOwoJICNpZmRlZiBERFJfTENETFJfQ0tfVVNFX0ZBU1RfUEFUVEVSTgoJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCSAjZWxzZQogICB0ZW1wX3Rlc3RfZXJyb3I9IGRkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKICB0ZW1wX3Rlc3RfZXJyb3I9IHRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKICAjZW5kaWYKCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJewoJCS8vcHJpbnRmKCJcbndkcWQgbGVmdCBlZGdlIGRldGVjdCBcbiIpOwoJCWFjX2JkbHIwX3RlbXArKzsKCQlicmVhazsKCQl9Cn0KcHJpbnRmKCJcbmFjYmRscjAgbGVmdCBlZGdlIGRldGVjdCBcbiIpOwpwcmludGYoIlxuYWNiZGxyMCBsZWZ0IGVkZ2U9PTB4JTA4eFxuICIsYWNfYmRscjBfdGVtcCk7CgppZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQV9SRUdfQkFTRSkKewphY19iZGxyMF9hX2xlZj1hY19iZGxyMF90ZW1wOwphY19iZGxyMF90ZW1wPWFjX2JkbHIwX2Ffb3JnOwp9CmVsc2UKewphY19iZGxyMF9iX2xlZj1hY19iZGxyMF90ZW1wOwphY19iZGxyMF90ZW1wPWFjX2JkbHIwX2Jfb3JnOwoKfQoKICB3cml0ZWwoYWNfYmRscjBfdGVtcCwocmVnX2FkZCkpOwoKIHdoaWxlIChhY19iZGxyMF90ZW1wPEFDQkRMUl9NQVgpCnsKdGVtcF90ZXN0X2Vycm9yPTA7CmFjX2JkbHIwX3RlbXArKzsKcHJpbnRmKCJcbmJkbHIwIHRlc3QgdmFsdWU9PTB4JTA4eFxuICIsYWNfYmRscjBfdGVtcCk7Cgkgd3JpdGVsKGFjX2JkbHIwX3RlbXAsKHJlZ19hZGQpKTsKCSAjaWZkZWYgRERSX0xDRExSX0NLX1VTRV9GQVNUX1BBVFRFUk4KCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkgI2Vsc2UKICAgdGVtcF90ZXN0X2Vycm9yPSBkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CiAgdGVtcF90ZXN0X2Vycm9yPSB0ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CiAgI2VuZGlmCglpZiAodGVtcF90ZXN0X2Vycm9yKQoJCXsKCQkvL3ByaW50ZigiXG5hY2JkbHIwIHJpZ2h0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJYWNfYmRscjBfdGVtcC0tOwoJCWJyZWFrOwoJCX0KfQpwcmludGYoIlxuYWNiZGxyMCByaWdodCBlZGdlIGRldGVjdCBcbiIpOwpwcmludGYoIlxuYWNiZGxyMCByaWdodCBlZGdlPT0weCUwOHhcbiAiLGFjX2JkbHIwX3RlbXApOwoKaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0FfUkVHX0JBU0UpCnsKYWNfYmRscjBfYV9yaWc9YWNfYmRscjBfdGVtcDsKYWNfYmRscjBfdGVtcD1hY19iZGxyMF9hX29yZzsKfQplbHNlCnsKYWNfYmRscjBfYl9yaWc9YWNfYmRscjBfdGVtcDsKYWNfYmRscjBfdGVtcD1hY19iZGxyMF9iX29yZzsKCn0KCiAgd3JpdGVsKGFjX2JkbHIwX3RlbXAsKHJlZ19hZGQpKTsKCn0KfQoKfQp9CgovLy8vdHVuZSBhbmQgc2F2ZSB0cmFpbmluZyBkcXMgdmFsdWUKCgoKCi8vLy9jYWxjdWxhdGUgYW5kIHByaW50ICBkcXMgdmFsdWUKZm9yICgodGVzdGluZ19jaGFubmVsPTApOyh0ZXN0aW5nX2NoYW5uZWw8KGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pKTsodGVzdGluZ19jaGFubmVsKyspKQp7CmlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCnsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKfQplbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQp7CnJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7Cn0KZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQogewppZiAoIHRlc3RpbmdfY2hhbm5lbCA9PSBDSEFOTkVMX0EpCiAgIHsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKICAgfQplbHNlIGlmKCB0ZXN0aW5nX2NoYW5uZWw9PUNIQU5ORUxfQikKICAgewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwogICB9CiB9CnJlZ19hZGQ9RERSMF9QVUJfQUNNRExSK3JlZ19iYXNlX2FkajsKCmlmIChyZWdfYmFzZV9hZGogPT0gQ0hBTk5FTF9BX1JFR19CQVNFKQp7CmlmICh0ZXN0X3RpbWVzKQp7CmlmIChhY19sY2Rscl9hX2xlZj5hY19sY2Rscl9hX2xlZl9taW4pCmFjX2xjZGxyX2FfbGVmX21pbj1hY19sY2Rscl9hX2xlZjsKCmlmIChhY19sY2Rscl9hX3JpZzxhY19sY2Rscl9hX3JpZ19taW4pCmFjX2xjZGxyX2FfcmlnX21pbj1hY19sY2Rscl9hX3JpZzsKCmlmIChhY19iZGxyMF9hX2xlZj5hY19iZGxyMF9hX2xlZl9taW4pCmFjX2JkbHIwX2FfbGVmX21pbj1hY19iZGxyMF9hX2xlZjsKCmlmIChhY19iZGxyMF9hX3JpZzxhY19iZGxyMF9hX3JpZ19taW4pCmFjX2JkbHIwX2FfcmlnX21pbj1hY19iZGxyMF9hX3JpZzsKfQoJZWxzZQoJCXsKYWNfbGNkbHJfYV9sZWZfbWluPWFjX2xjZGxyX2FfbGVmOwphY19sY2Rscl9hX3JpZ19taW49YWNfbGNkbHJfYV9yaWc7CmFjX2JkbHIwX2FfbGVmX21pbj1hY19iZGxyMF9hX2xlZjsKYWNfYmRscjBfYV9yaWdfbWluPWFjX2JkbHIwX2FfcmlnOwoJCX0KCSAgIHByaW50ZigiXG50ZXN0IEEgY2hhbm5lbCBBQyByZXN1bHRcbiIpOwoJcHJpbnRmKCJcbiBhY19tZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCksIGFjX21kbHJfYV9vcmcpOwoJcHJpbnRmKCJcbiBhY19sY2Rscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpLCBhY19sY2Rscl9hX29yZyk7CglwcmludGYoIlxuIGFjX2JkbHIwX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUiksIGFjX2JkbHIwX2Ffb3JnKTsKCglwcmludGYoIlxuIGFjX2FjbWRscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHggICBsY2Rscl9sZWYgICBsY2Rscl9yaWcgICBsY2Rscl9sbWluICBsY2Rscl9ybWluXG4iLChyZWdfYWRkKSxhY19tZGxyX2Ffb3JnKTsKCXByaW50ZigiXG4gYWNfbGNkbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4ICAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpLCBhY19sY2Rscl9hX29yZyxhY19sY2Rscl9hX2xlZixhY19sY2Rscl9hX3JpZyxhY19sY2Rscl9hX2xlZl9taW4sYWNfbGNkbHJfYV9yaWdfbWluKTsKCXByaW50ZigiXG4gYWNfYmRscjBfYV9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHggIDB4JTA4eCAgMHglMDh4ICAweCUwOHggIDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUiksIGFjX2JkbHIwX2Ffb3JnLGFjX2JkbHIwX2FfbGVmLGFjX2JkbHIwX2FfcmlnLGFjX2JkbHIwX2FfbGVmX21pbixhY19iZGxyMF9hX3JpZ19taW4pOwoKCgp9CgppZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQl9SRUdfQkFTRSkKewppZiAodGVzdF90aW1lcykKewppZiAoYWNfbGNkbHJfYl9sZWY+YWNfbGNkbHJfYl9sZWZfbWluKQphY19sY2Rscl9iX2xlZl9taW49YWNfbGNkbHJfYl9sZWY7CgppZiAoYWNfbGNkbHJfYl9yaWc8YWNfbGNkbHJfYl9yaWdfbWluKQphY19sY2Rscl9iX3JpZ19taW49YWNfbGNkbHJfYl9yaWc7CgppZiAoYWNfYmRscjBfYl9sZWY+YWNfYmRscjBfYl9sZWZfbWluKQphY19iZGxyMF9iX2xlZl9taW49YWNfYmRscjBfYl9sZWY7CgppZiAoYWNfYmRscjBfYl9yaWc8YWNfYmRscjBfYl9yaWdfbWluKQphY19iZGxyMF9iX3JpZ19taW49YWNfYmRscjBfYl9yaWc7Cn0KCWVsc2UKCQl7CmFjX2xjZGxyX2JfbGVmX21pbj1hY19sY2Rscl9iX2xlZjsKYWNfbGNkbHJfYl9yaWdfbWluPWFjX2xjZGxyX2JfcmlnOwphY19iZGxyMF9iX2xlZl9taW49YWNfYmRscjBfYl9sZWY7CmFjX2JkbHIwX2JfcmlnX21pbj1hY19iZGxyMF9iX3JpZzsKCQl9CgkgICBwcmludGYoIlxudGVzdCBCIGNoYW5uZWwgQUMgcmVzdWx0XG4iKTsKCXByaW50ZigiXG4gYWNfbWRscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQpLCBhY19tZGxyX2Jfb3JnKTsKCXByaW50ZigiXG4gYWNfbGNkbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDTENETFItRERSMF9QVUJfQUNNRExSKSwgYWNfbGNkbHJfYl9vcmcpOwoJcHJpbnRmKCJcbiBhY19iZGxyMF9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNCRExSMC1ERFIwX1BVQl9BQ01ETFIpLCBhY19iZGxyMF9iX29yZyk7CgoJcHJpbnRmKCJcbiBhY19hY21kbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4ICAgbGNkbHJfbGVmICAgbGNkbHJfcmlnICAgbGNkbHJfbG1pbiAgbGNkbHJfcm1pblxuIiwocmVnX2FkZCksYWNfbWRscl9iX29yZyk7CglwcmludGYoIlxuIGFjX2xjZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eCAgMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDTENETFItRERSMF9QVUJfQUNNRExSKSwgYWNfbGNkbHJfYl9vcmcsYWNfbGNkbHJfYl9sZWYsYWNfbGNkbHJfYl9yaWcsYWNfbGNkbHJfYl9sZWZfbWluLGFjX2xjZGxyX2JfcmlnX21pbik7CglwcmludGYoIlxuIGFjX2JkbHIwX2Ffb3JnICAweCUwOHggcmVnPT0gMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4ICAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNCRExSMC1ERFIwX1BVQl9BQ01ETFIpLCBhY19iZGxyMF9iX29yZyxhY19iZGxyMF9iX2xlZixhY19iZGxyMF9iX3JpZyxhY19iZGxyMF9iX2xlZl9taW4sYWNfYmRscjBfYl9yaWdfbWluKTsKCgoKfQoKCgoJICAgfQoKCn0KCn0KCgoKCiByZXR1cm4gMDsKCnVzYWdlOgoJY21kX3VzYWdlKGNtZHRwKTsKCXJldHVybiAxOwoKfQoKCgoKVV9CT09UX0NNRCgKCWRkcl90dW5lX2Rkcl9hY19hY2xjZGxyLAk1LAkxLAlkb19kZHJfdGVzdF9hY193aW5kb3dzX2FjbGNkbHIsCgkiRERSIHR1bmUgZHFzIGZ1bmN0aW9uIiwKCSJkZHJfdHVuZV9kZHJfYWNfYWNsY2RsciBhIDAgMHg4MDAwMDAwIDMgb3IgZGRyX3R1bmVfZGRyX2FjX2FjbGNkbHIgYiAwIDB4ODAwMDAgNSBvciBkZHJfdHVuZV9kZHJfYWNfYWNsY2RsciBhIGIgMHg4MDAwMCBsXG4gZGNhY2hlIG9mZiA/IFxuIgopOwoKCmludCBkb19kZHJfdGVzdF9hY193aW5kb3dzX2FjYmRscl9jayhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKICAgcHJpbnRmKCJcbkVudGVyIFRlc3QgZGRyIGFjIHdpbmRvd3MgZnVuY3Rpb25cbiIpOwogLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwogIHByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKIC8vICB1bnNpZ25lZCBpbnQgICBsb29wID0gMTsKLy8gICB1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2kgPSAxOwovLyAgIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaj0gMTsKLy8gICAgdW5zaWduZWQgaW50ICAgdGVtcF9jb3VudF9rPSAxOwogICB1bnNpZ25lZCBpbnQgICB0ZW1wX3Rlc3RfZXJyb3I9IDA7CgoKCSBjaGFyICplbmRwOwogLy8gIHVuc2lnbmVkIGludCAgICpwX3N0YXJ0X2FkZHI7CiAgdW5zaWduZWQgaW50ICAgdGVzdF9sb29wPTE7CiAgIHVuc2lnbmVkIGludCAgIHRlc3RfdGltZXM9MTsKICAgdW5zaWduZWQgaW50ICAgcmVnX2FkZD0wOwogICB1bnNpZ25lZCBpbnQgICByZWdfYmFzZV9hZGo9MDsKCQkgIHVuc2lnbmVkIGludCAgIGNoYW5uZWxfYV9lbiA9IDA7CgkgICB1bnNpZ25lZCBpbnQgICBjaGFubmVsX2JfZW4gPSAwOwoJICAgdW5zaWduZWQgaW50ICAgdGVzdGluZ19jaGFubmVsID0gMDsKCgoKCSAgI2RlZmluZSAgQ0hBTk5FTF9BICAwCgkgICNkZWZpbmUgIENIQU5ORUxfQiAgMQoKCgoKCgoJICNkZWZpbmUgIEREUl9DT1JTU19UQUxLX1RFU1RfU0laRSAgIDB4MjAwMDAKCgkJICAgdW5zaWduZWQgaW50ICBhY19tZGxyX2Ffb3JnPTA7CgkgICB1bnNpZ25lZCBpbnQgIGFjX21kbHJfYl9vcmc9MDsKCgkgIHVuc2lnbmVkIGludCAgYWNfbGNkbHJfYV9vcmc9MDsKCSAgdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYV9vcmc9MDsKCSAgdW5zaWduZWQgaW50ICBhY19sY2Rscl9iX29yZz0wOwoJICB1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9iX29yZz0wOwoJICB1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2FfcmlnPTA7CgkgIHVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2FfcmlnPTA7CgkgIHVuc2lnbmVkIGludCAgYWNfbGNkbHJfYl9yaWc9MDsKCSAgdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYl9yaWc9MDsKCSAgdW5zaWduZWQgaW50ICBhY19sY2Rscl9hX2xlZj0wOwoJICB1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9hX2xlZj0wOwoJICB1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2JfbGVmPTA7CgkgIHVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2JfbGVmPTA7CgoJCXVuc2lnbmVkIGludCAgYWNfbGNkbHJfYV9yaWdfbWluPTA7CgkgIHVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2FfcmlnX21pbj0wOwoJICB1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2JfcmlnX21pbj0wOwoJICB1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9iX3JpZ19taW49MDsKCSAgdW5zaWduZWQgaW50ICBhY19sY2Rscl9hX2xlZl9taW49MDsKCSAgdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYV9sZWZfbWluPTA7CgkgIHVuc2lnbmVkIGludCAgYWNfbGNkbHJfYl9sZWZfbWluPTA7CgkgIHVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2JfbGVmX21pbj0wOwoJIC8vICAgdW5zaWduZWQgaW50ICBhY19sY2Rscl90ZW1wOwoJICB1bnNpZ25lZCBpbnQgICBhY19iZGxyMF90ZW1wPTA7CgoKCgkgICAgdW5zaWduZWQgaW50ICAgZGRyX3Rlc3Rfc2l6ZT0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoKCi8vI2RlZmluZSBERFJfVEVTVF9BQ0xDRExSCgoKCSBpZiAoYXJnYyA9PSAyKQoJCXsKICAgIGlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApKQoKCXtjaGFubmVsX2FfZW4gPSAxOwoJfQoJZWxzZSBpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCl8fChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSkKCgl7Y2hhbm5lbF9iX2VuID0gMTsKCX0KCWVsc2UKCQl7Cglnb3RvIHVzYWdlOwoJCX0KCQl9CgkJaWYgKGFyZ2MgPiAyKQoJCXsKICAgIGlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJBIikgPT0gMCkpCgoJe2NoYW5uZWxfYV9lbiA9IDE7Cgl9CiAgICAgaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQiIpID09IDApKQoKCXtjaGFubmVsX2JfZW4gPSAxOwoJfQoJCQl9CgkJICAgZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKICBpZiAoYXJnYyA+MykgewoJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sICZlbmRwLCAxNik7CiAgICAgICAgaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQlkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJCQl9CgoJfQogICAgaWYgKGFyZ2MgPjQpIHsKCXRlc3RfbG9vcCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNF0sICZlbmRwLCAxNik7CiAgICAgICAgaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQl0ZXN0X2xvb3AgPSAxOwoJCQl9CgkJIGlmICAgKChzdHJjbXAoYXJndls0XSwgImwiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbNF0sICJMIikgPT0gMCkpCgkJCXsKCQkJdGVzdF9sb29wID0gMTAwMDAwOwoJCQl9Cgl9CgoKCQkgcHJpbnRmKCJcbmNoYW5uZWxfYV9lbj09IDB4JTA4eFxuIiwgY2hhbm5lbF9hX2VuKTsKCQkgcHJpbnRmKCJcbmNoYW5uZWxfYl9lbj09IDB4JTA4eFxuIiwgY2hhbm5lbF9iX2VuKTsKCQkgIHByaW50ZigiXG5kZHJfdGVzdF9zaXplPT0gMHglMDh4XG4iLCBkZHJfdGVzdF9zaXplKTsKCQkgICBwcmludGYoIlxudGVzdF9sb29wPT0gMHglMDh4XG4iLCB0ZXN0X2xvb3ApOwppZiAoIGNoYW5uZWxfYV9lbikKewovL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwpPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7Cn0KaWYgKCBjaGFubmVsX2JfZW4pCnsKT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpOwovL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwp9CgoKLy9zYXZlIGFuZCBwcmludCBvcmcgdHJhaW5pbmcgZHFzIHZhbHVlCmlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQp7CgoKCS8vZGNhY2hlX2Rpc2FibGUoKTsKIC8vc2VyaWFsX3B1dHMoIlxuZGVidWcgZm9yIGRkcnRlc3QgLGppYXhpbmcgZGlzYWJsZSBkY2FjaGUiKTsKCnsKZm9yICgodGVzdGluZ19jaGFubmVsPTApOyh0ZXN0aW5nX2NoYW5uZWw8KGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pKTsodGVzdGluZ19jaGFubmVsKyspKQp7CmlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCnsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKfQplbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQp7CnJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7Cn0KZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQogewppZiAoIHRlc3RpbmdfY2hhbm5lbCA9PSBDSEFOTkVMX0EpCiAgIHsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKIHJlZ19hZGQ9RERSMF9QVUJfQUNNRExSK3JlZ19iYXNlX2FkajsKCgoKICAgfQplbHNlIGlmKCB0ZXN0aW5nX2NoYW5uZWw9PUNIQU5ORUxfQikKICAgewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoKIHJlZ19hZGQ9RERSMF9QVUJfQUNNRExSK3JlZ19iYXNlX2FkajsKCgoKICAgfQogfQoKIHJlZ19hZGQ9RERSMF9QVUJfQUNNRExSK3JlZ19iYXNlX2FkajsKCgppZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQV9SRUdfQkFTRSkKewpwcmludGYoIlxudGVzdCBBIGNoYW5uZWwgMHglMDh4XG4iLHJlZ19hZGQpOwogYWNfbWRscl9hX29yZz0odW5zaWduZWQgaW50ICkocmVhZGwoKHVuc2lnbmVkIGludCApcmVnX2FkZCkpOy8vcmVhZGwocmVnX2FkZCk7Ly8weGM4ODM2MDAwCgkgICBhY19sY2Rscl9hX29yZz0odW5zaWduZWQgaW50ICkocmVhZGwoKHVuc2lnbmVkIGludCApKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpKSk7Ly9yZWFkbChyZWdfYWRkKzQpOwoJYWNfYmRscjBfYV9vcmc9KHVuc2lnbmVkIGludCApKHJlYWRsKCh1bnNpZ25lZCBpbnQgKShyZWdfYWRkK0REUjBfUFVCX0FDQkRMUjAtRERSMF9QVUJfQUNNRExSKSkpOy8vcmVhZGwocmVnX2FkZCs4KTsKCglwcmludGYoIlxuIGFjX21kbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkKSwgYWNfbWRscl9hX29yZyk7CglwcmludGYoIlxuIGFjX2xjZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUiksIGFjX2xjZGxyX2Ffb3JnKTsKCXByaW50ZigiXG4gYWNfYmRscjBfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDQkRMUjAtRERSMF9QVUJfQUNNRExSKSwgYWNfYmRscjBfYV9vcmcpOwp9CmlmIChyZWdfYmFzZV9hZGogPT0gQ0hBTk5FTF9CX1JFR19CQVNFKQp7CgogIGFjX21kbHJfYl9vcmc9cmVhZGwocmVnX2FkZCk7CgkgICBhY19sY2Rscl9iX29yZz1yZWFkbChyZWdfYWRkK0REUjBfUFVCX0FDTENETFItRERSMF9QVUJfQUNNRExSKTsKCWFjX2JkbHIwX2Jfb3JnPXJlYWRsKHJlZ19hZGQrRERSMF9QVUJfQUNCRExSMC1ERFIwX1BVQl9BQ01ETFIpOwoJcHJpbnRmKCJcbiBhY19tZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCksIGFjX21kbHJfYl9vcmcpOwoJcHJpbnRmKCJcbiBhY19sY2Rscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpLCBhY19sY2Rscl9iX29yZyk7CglwcmludGYoIlxuIGFjX2JkbHIwX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUiksIGFjX2JkbHIwX2Jfb3JnKTsKfQoKCn0KCn0KCn0vLy8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nICB2YWx1ZQoKCmZvciAodGVzdF90aW1lcz0wOyh0ZXN0X3RpbWVzPHRlc3RfbG9vcCk7KHRlc3RfdGltZXMrKykpCnsKLy8vL3R1bmUgYW5kIHNhdmUgdHJhaW5pbmcgZHFzIHZhbHVlCmlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoKewpmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCnsKCmlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCnsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKfQplbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQp7CnJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7Cn0KZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQogewppZiAoIHRlc3RpbmdfY2hhbm5lbCA9PSBDSEFOTkVMX0EpCiAgIHsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKICAgfQplbHNlIGlmKCB0ZXN0aW5nX2NoYW5uZWw9PUNIQU5ORUxfQikKICAgewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwogICB9CiB9CgppZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQV9SRUdfQkFTRSkKewpwcmludGYoIlxudGVzdCBBIGNoYW5uZWwgQUNcbiIpOwp9CmVsc2UKewpwcmludGYoIlxudGVzdCBCIGNoYW5uZWwgQUNcbiIpOwp9Cgp7CnsKCSNpZmRlZiBERFJfVEVTVF9BQ0xDRExSCgogcmVnX2FkZD1ERFIwX1BVQl9BQ0xDRExSK3JlZ19iYXNlX2FkajsKCmFjX2xjZGxyX3RlbXA9cmVhZGwocmVnX2FkZCk7Cgp3aGlsZSAoYWNfbGNkbHJfdGVtcD4wKQp7CnRlbXBfdGVzdF9lcnJvcj0wOwphY19sY2Rscl90ZW1wLS07CgpwcmludGYoIlxubGNkbHIgdGVzdCB2YWx1ZT09MHglMDh4XG4gIixhY19sY2Rscl90ZW1wKTsKCSB3cml0ZWwoYWNfbGNkbHJfdGVtcCwocmVnX2FkZCkpOwoJI2lmZGVmIEREUl9MQ0RMUl9DS19VU0VfRkFTVF9QQVRURVJOCgl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJICNlbHNlCiAgIHRlbXBfdGVzdF9lcnJvcj0gZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwogIHRlbXBfdGVzdF9lcnJvcj0gdGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwogICNlbmRpZgoJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQl7CgkJLy9wcmludGYoIlxud2RxZCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJYWNfbGNkbHJfdGVtcCsrOwoJCWJyZWFrOwoJCX0KfQoKcHJpbnRmKCJcbmxjZGxyIGxlZnQgZWRnZSBkZXRlY3QgXG4iKTsKcHJpbnRmKCJcbmxjZGxyIGxlZnQgZWRnZT09MHglMDh4XG4gIixhY19sY2Rscl90ZW1wKTsKaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0FfUkVHX0JBU0UpCnsKYWNfbGNkbHJfYV9sZWY9YWNfbGNkbHJfdGVtcDsKYWNfbGNkbHJfdGVtcD1hY19sY2Rscl9hX29yZzsKfQplbHNlCnsKYWNfbGNkbHJfYl9sZWY9YWNfbGNkbHJfdGVtcDsKYWNfbGNkbHJfdGVtcD1hY19sY2Rscl9iX29yZzsKCn0KIHdyaXRlbChhY19sY2Rscl90ZW1wLChyZWdfYWRkKSk7Cgogd2hpbGUgKGFjX2xjZGxyX3RlbXA8QUNMQ0RMUl9NQVgpCnsKdGVtcF90ZXN0X2Vycm9yPTA7CmFjX2xjZGxyX3RlbXArKzsKcHJpbnRmKCJcbmxjZGxyIHRlc3QgdmFsdWU9PTB4JTA4eFxuICIsYWNfbGNkbHJfdGVtcCk7Cgkgd3JpdGVsKGFjX2xjZGxyX3RlbXAsKHJlZ19hZGQpKTsKCSAjaWZkZWYgRERSX0xDRExSX0NLX1VTRV9GQVNUX1BBVFRFUk4KCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkgI2Vsc2UKICAgdGVtcF90ZXN0X2Vycm9yPSBkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CiAgdGVtcF90ZXN0X2Vycm9yPSB0ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CiAgI2VuZGlmCglpZiAodGVtcF90ZXN0X2Vycm9yKQoJCXsKCQkvL3ByaW50ZigiXG5sY2RsciByaWdodCBlZGdlIGRldGVjdCBcbiIpOwoJCWFjX2xjZGxyX3RlbXAtLTsKCQlicmVhazsKCQl9Cn0KcHJpbnRmKCJcbmxjZGxycmlnaHQgZWRnZSBkZXRlY3QgXG4iKTsKcHJpbnRmKCJcbmxjZGxyIHJpZ2h0IGVkZ2U9PTB4JTA4eFxuICIsYWNfbGNkbHJfdGVtcCk7CgoKCmlmIChyZWdfYmFzZV9hZGogPT0gQ0hBTk5FTF9BX1JFR19CQVNFKQp7CmFjX2xjZGxyX2FfcmlnPWFjX2xjZGxyX3RlbXA7CmFjX2xjZGxyX3RlbXA9YWNfbGNkbHJfYV9vcmc7Cn0KZWxzZQp7CmFjX2xjZGxyX2JfcmlnPWFjX2xjZGxyX3RlbXA7CmFjX2xjZGxyX3RlbXA9YWNfbGNkbHJfYl9vcmc7Cgp9CndyaXRlbChhY19sY2Rscl90ZW1wLChyZWdfYWRkKSk7CgoKCiNlbmRpZgoKewogICByZWdfYWRkPUREUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqOwoKYWNfYmRscjBfdGVtcD1yZWFkbChyZWdfYWRkKTsKd2hpbGUgKGFjX2JkbHIwX3RlbXA+MCkKewp0ZW1wX3Rlc3RfZXJyb3I9MDsKYWNfYmRscjBfdGVtcC0tOwoJcHJpbnRmKCJcbmJkbHIwIHRlc3QgdmFsdWU9PTB4JTA4eFxuICIsYWNfYmRscjBfdGVtcCk7Cgkgd3JpdGVsKGFjX2JkbHIwX3RlbXAsKHJlZ19hZGQpKTsKCQkgI2lmZGVmIEREUl9MQ0RMUl9DS19VU0VfRkFTVF9QQVRURVJOCgl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJICNlbHNlCiAgIHRlbXBfdGVzdF9lcnJvcj0gZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwogIHRlbXBfdGVzdF9lcnJvcj0gdGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwogICNlbmRpZgoJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQl7CgkJLy9wcmludGYoIlxud2RxZCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJYWNfYmRscjBfdGVtcCsrOwoJCWJyZWFrOwoJCX0KfQpwcmludGYoIlxuYWNiZGxyMCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CnByaW50ZigiXG5hY2JkbHIwIGxlZnQgZWRnZT09MHglMDh4XG4gIixhY19iZGxyMF90ZW1wKTsKCmlmIChyZWdfYmFzZV9hZGogPT0gQ0hBTk5FTF9BX1JFR19CQVNFKQp7CmFjX2JkbHIwX2FfbGVmPWFjX2JkbHIwX3RlbXA7CmFjX2JkbHIwX3RlbXA9YWNfYmRscjBfYV9vcmc7Cn0KZWxzZQp7CmFjX2JkbHIwX2JfbGVmPWFjX2JkbHIwX3RlbXA7CmFjX2JkbHIwX3RlbXA9YWNfYmRscjBfYl9vcmc7Cgp9CgogIHdyaXRlbChhY19iZGxyMF90ZW1wLChyZWdfYWRkKSk7Cgogd2hpbGUgKGFjX2JkbHIwX3RlbXA8QUNCRExSX01BWCkKewp0ZW1wX3Rlc3RfZXJyb3I9MDsKYWNfYmRscjBfdGVtcCsrOwpwcmludGYoIlxuYmRscjAgdGVzdCB2YWx1ZT09MHglMDh4XG4gIixhY19iZGxyMF90ZW1wKTsKCSB3cml0ZWwoYWNfYmRscjBfdGVtcCwocmVnX2FkZCkpOwoJICNpZmRlZiBERFJfTENETFJfQ0tfVVNFX0ZBU1RfUEFUVEVSTgoJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCSAjZWxzZQogICB0ZW1wX3Rlc3RfZXJyb3I9IGRkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKICB0ZW1wX3Rlc3RfZXJyb3I9IHRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKICAjZW5kaWYKCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJewoJCS8vcHJpbnRmKCJcbmFjYmRscjAgcmlnaHQgZWRnZSBkZXRlY3QgXG4iKTsKCQlhY19iZGxyMF90ZW1wLS07CgkJYnJlYWs7CgkJfQp9CnByaW50ZigiXG5hY2JkbHIwIHJpZ2h0IGVkZ2UgZGV0ZWN0IFxuIik7CnByaW50ZigiXG5hY2JkbHIwIHJpZ2h0IGVkZ2U9PTB4JTA4eFxuICIsYWNfYmRscjBfdGVtcCk7CgppZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQV9SRUdfQkFTRSkKewphY19iZGxyMF9hX3JpZz1hY19iZGxyMF90ZW1wOwphY19iZGxyMF90ZW1wPWFjX2JkbHIwX2Ffb3JnOwp9CmVsc2UKewphY19iZGxyMF9iX3JpZz1hY19iZGxyMF90ZW1wOwphY19iZGxyMF90ZW1wPWFjX2JkbHIwX2Jfb3JnOwoKfQoKICB3cml0ZWwoYWNfYmRscjBfdGVtcCwocmVnX2FkZCkpOwoKfQp9Cgp9Cn0KCi8vLy90dW5lIGFuZCBzYXZlIHRyYWluaW5nIGRxcyB2YWx1ZQoKCgoKLy8vL2NhbGN1bGF0ZSBhbmQgcHJpbnQgIGRxcyB2YWx1ZQpmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCnsKaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwp9CmVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCnsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKfQplbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCiB7CmlmICggdGVzdGluZ19jaGFubmVsID09IENIQU5ORUxfQSkKICAgewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwogICB9CmVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQogICB7CnJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CiAgIH0KIH0KcmVnX2FkZD1ERFIwX1BVQl9BQ01ETFIrcmVnX2Jhc2VfYWRqOwoKaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0FfUkVHX0JBU0UpCnsKaWYgKHRlc3RfdGltZXMpCnsKaWYgKGFjX2xjZGxyX2FfbGVmPmFjX2xjZGxyX2FfbGVmX21pbikKYWNfbGNkbHJfYV9sZWZfbWluPWFjX2xjZGxyX2FfbGVmOwoKaWYgKGFjX2xjZGxyX2FfcmlnPGFjX2xjZGxyX2FfcmlnX21pbikKYWNfbGNkbHJfYV9yaWdfbWluPWFjX2xjZGxyX2FfcmlnOwoKaWYgKGFjX2JkbHIwX2FfbGVmPmFjX2JkbHIwX2FfbGVmX21pbikKYWNfYmRscjBfYV9sZWZfbWluPWFjX2JkbHIwX2FfbGVmOwoKaWYgKGFjX2JkbHIwX2FfcmlnPGFjX2JkbHIwX2FfcmlnX21pbikKYWNfYmRscjBfYV9yaWdfbWluPWFjX2JkbHIwX2FfcmlnOwp9CgllbHNlCgkJewphY19sY2Rscl9hX2xlZl9taW49YWNfbGNkbHJfYV9sZWY7CmFjX2xjZGxyX2FfcmlnX21pbj1hY19sY2Rscl9hX3JpZzsKYWNfYmRscjBfYV9sZWZfbWluPWFjX2JkbHIwX2FfbGVmOwphY19iZGxyMF9hX3JpZ19taW49YWNfYmRscjBfYV9yaWc7CgkJfQoJICAgcHJpbnRmKCJcbnRlc3QgQSBjaGFubmVsIEFDIHJlc3VsdFxuIik7CglwcmludGYoIlxuIGFjX21kbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkKSwgYWNfbWRscl9hX29yZyk7CglwcmludGYoIlxuIGFjX2xjZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUiksIGFjX2xjZGxyX2Ffb3JnKTsKCXByaW50ZigiXG4gYWNfYmRscjBfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDQkRMUjAtRERSMF9QVUJfQUNNRExSKSwgYWNfYmRscjBfYV9vcmcpOwoKcHJpbnRmKCJcbiBhY19hY21kbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4ICAgbGNkbHJfbGVmICAgbGNkbHJfcmlnICAgbGNkbHJfbG1pbiAgbGNkbHJfcm1pblxuIiwocmVnX2FkZCksYWNfbWRscl9hX29yZyk7CglwcmludGYoIlxuIGFjX2xjZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eCAgMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDTENETFItRERSMF9QVUJfQUNNRExSKSwgYWNfbGNkbHJfYV9vcmcsYWNfbGNkbHJfYV9sZWYsYWNfbGNkbHJfYV9yaWcsYWNfbGNkbHJfYV9sZWZfbWluLGFjX2xjZGxyX2FfcmlnX21pbik7CglwcmludGYoIlxuIGFjX2JkbHIwX2Ffb3JnICAweCUwOHggcmVnPT0gMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4ICAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNCRExSMC1ERFIwX1BVQl9BQ01ETFIpLCBhY19iZGxyMF9hX29yZyxhY19iZGxyMF9hX2xlZixhY19iZGxyMF9hX3JpZyxhY19iZGxyMF9hX2xlZl9taW4sYWNfYmRscjBfYV9yaWdfbWluKTsKCgoKfQoKaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0JfUkVHX0JBU0UpCnsKaWYgKHRlc3RfdGltZXMpCnsKaWYgKGFjX2xjZGxyX2JfbGVmPmFjX2xjZGxyX2JfbGVmX21pbikKYWNfbGNkbHJfYl9sZWZfbWluPWFjX2xjZGxyX2JfbGVmOwoKaWYgKGFjX2xjZGxyX2JfcmlnPGFjX2xjZGxyX2JfcmlnX21pbikKYWNfbGNkbHJfYl9yaWdfbWluPWFjX2xjZGxyX2JfcmlnOwoKaWYgKGFjX2JkbHIwX2JfbGVmPmFjX2JkbHIwX2JfbGVmX21pbikKYWNfYmRscjBfYl9sZWZfbWluPWFjX2JkbHIwX2JfbGVmOwoKaWYgKGFjX2JkbHIwX2JfcmlnPGFjX2JkbHIwX2JfcmlnX21pbikKYWNfYmRscjBfYl9yaWdfbWluPWFjX2JkbHIwX2JfcmlnOwp9CgllbHNlCgkJewphY19sY2Rscl9iX2xlZl9taW49YWNfbGNkbHJfYl9sZWY7CmFjX2xjZGxyX2JfcmlnX21pbj1hY19sY2Rscl9iX3JpZzsKYWNfYmRscjBfYl9sZWZfbWluPWFjX2JkbHIwX2JfbGVmOwphY19iZGxyMF9iX3JpZ19taW49YWNfYmRscjBfYl9yaWc7CgkJfQoJICAgcHJpbnRmKCJcbnRlc3QgQiBjaGFubmVsIEFDIHJlc3VsdFxuIik7CglwcmludGYoIlxuIGFjX21kbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkKSwgYWNfbWRscl9iX29yZyk7CglwcmludGYoIlxuIGFjX2xjZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUiksIGFjX2xjZGxyX2Jfb3JnKTsKCXByaW50ZigiXG4gYWNfYmRscjBfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDQkRMUjAtRERSMF9QVUJfQUNNRExSKSwgYWNfYmRscjBfYl9vcmcpOwoKCXByaW50ZigiXG4gYWNfYWNtZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eCAgIGxjZGxyX2xlZiAgIGxjZGxyX3JpZyAgIGxjZGxyX2xtaW4gIGxjZGxyX3JtaW5cbiIsKHJlZ19hZGQpLGFjX21kbHJfYl9vcmcpOwoJcHJpbnRmKCJcbiBhY19sY2Rscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHggIDB4JTA4eCAgMHglMDh4ICAweCUwOHggIDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUiksIGFjX2xjZGxyX2Jfb3JnLGFjX2xjZGxyX2JfbGVmLGFjX2xjZGxyX2JfcmlnLGFjX2xjZGxyX2JfbGVmX21pbixhY19sY2Rscl9iX3JpZ19taW4pOwoJcHJpbnRmKCJcbiBhY19iZGxyMF9hX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eCAgMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDQkRMUjAtRERSMF9QVUJfQUNNRExSKSwgYWNfYmRscjBfYl9vcmcsYWNfYmRscjBfYl9sZWYsYWNfYmRscjBfYl9yaWcsYWNfYmRscjBfYl9sZWZfbWluLGFjX2JkbHIwX2JfcmlnX21pbik7CgoKCgp9CgoKCgkgICB9CgoKfQoKfQoKCgoKIHJldHVybiAwOwoKdXNhZ2U6CgljbWRfdXNhZ2UoY21kdHApOwoJcmV0dXJuIDE7Cgp9CgoKCgpVX0JPT1RfQ01EKAoJZGRyX3R1bmVfZGRyX2FjX2FjYmRscl9jaywJNSwJMSwJZG9fZGRyX3Rlc3RfYWNfd2luZG93c19hY2JkbHJfY2ssCgkiRERSIHR1bmUgZHFzIGZ1bmN0aW9uIiwKCSJkZHJfdHVuZV9kZHJfYWNfYWNiZGxyX2NrIGEgMCAweDgwMDAwMDAgMyBvciBkZHJfdHVuZV9kZHJfYWNfYWNiZGxyX2NrIGIgMCAweDgwMDAwIDUgb3IgZGRyX3R1bmVfZGRyX2FjX2FjYmRscl9jayBhIGIgMHg4MDAwMCBsXG4gZGNhY2hlIG9mZiA/IFxuIgopOwoKCmludCBkb19kZHJfdGVzdF9hY19iaXRfbWFyZ2luKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewogcHJpbnRmKCJcbkVudGVyZGRyX3Rlc3RfYWNfd2luZG93IGZ1bmN0aW9uXG4iKTsKCQkgICB1bnNpZ25lZCBpbnQgICBjaGFubmVsX2FfZW4gPSAwOwovLwkgICB1bnNpZ25lZCBpbnQgICBjaGFubmVsX2JfZW4gPSAwOwogIC8vIHVuc2lnbmVkIGludCAgIHJlZ19hZGQ9MDsKICAvLyB1bnNpZ25lZCBpbnQgICByZWdfYmFzZV9hZGo9MDsKCgkgIHVuc2lnbmVkIGludCAgIGxhbmVfc3RlcD0gMDsKCSAgdW5zaWduZWQgaW50ICAgcmVnX3ZhbHVlPSAwOwoJIHVuc2lnbmVkIGludCAgIHRlc3RfYWNfc2V0dXBfaG9sZD0gMDsKLy9pbnQgYXJnYzI7Ci8vY2hhciAgICAgKiAgYXJndjJbMzBdOwovLyAgdW5zaWduZWQgaW50ICBhY2JkbHIwXzlfcmVnX29yZ1sxMF07Ci8vICAgdW5zaWduZWQgaW50ICBhY2JkbHIwXzlfcmVnX3NldHVwX21heFs0MF07CiAvLyAgdW5zaWduZWQgaW50ICBhY2JkbHIwXzlfcmVnX2hvbGRfbWF4WzQwXTsKIC8vICAgICB1bnNpZ25lZCBpbnQgIGFjYmRscjBfOV9yZWdfc2V0dXBfdGltZVs0MF07CiAgLy8gdW5zaWduZWQgaW50ICBhY2JkbHIwXzlfcmVnX2hvbGRfdGltZVs0MF07CgpjaGFyICplbmRwOwoKCQlpZiAoYXJnYyA9PSAyKQoJCXsKICAgIGlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApKQoKCXtjaGFubmVsX2FfZW4gPSAxOwoJfQoJZWxzZSBpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCl8fChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSkKCgl7Ly9jaGFubmVsX2JfZW4gPSAxOwoJfQoKCgkJfQoJCWlmIChhcmdjID4gMikKCQl7CiAgICBpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQSIpID09IDApKQoKCXtjaGFubmVsX2FfZW4gPSAxOwoJfQogICAgIGlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkIiKSA9PSAwKSkKCgl7Ly9jaGFubmVsX2JfZW4gPSAxOwoJfQoJCQl9CnVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQkgICBkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwogIGlmIChhcmdjID4zKSB7CglkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgJmVuZHAsIDE2KTsKICAgICAgICBpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJCX0KCX0KLy9hcmdjMj01OwoJLy9mb3IoaSA9IDE7aTwoYXJnYyk7aSsrKQoJCXsKCQkvL2FyZ3YyW2ktMV09YXJndltpXTsKCQl9CgovL2FyZ3YyWzBdPWFyZ3ZbMV07Ci8vYXJndjJbMV09YXJndlsyXTsKLy9hcmd2MlsyXT1hcmd2WzNdOwpjaGFyIHN0clsxMDBdOwp0ZXN0X2FjX3NldHVwX2hvbGQ9MDsKaWYgKGNoYW5uZWxfYV9lbikKewoKLy8qKGNoYXIgICAgICopKGFyZ3YyWzBdKT0iYSI7CgkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDExIGEgMCAweDgwMDAwICAiLDApOwoJIHByaW50ZigiXG50ZXN0IGFjIHdpbmRvdyAgYVxuIik7CmZvciAoKGxhbmVfc3RlcD00KTsobGFuZV9zdGVwPDQwKTsobGFuZV9zdGVwKyspKQp7CmlmIChsYW5lX3N0ZXAgPT0gNykKe2xhbmVfc3RlcD04Owp9CmlmIChsYW5lX3N0ZXAgPT0gMTIpCntsYW5lX3N0ZXA9MTY7Cn0KaWYgKGxhbmVfc3RlcCA9PSAxNCkKe2xhbmVfc3RlcD0xNjsKfQppZiAobGFuZV9zdGVwID09IDE4KQp7bGFuZV9zdGVwPTIwOwp9CmlmIChsYW5lX3N0ZXAgPT0gMjIpCntsYW5lX3N0ZXA9MjQ7Cn0KLy9zcHJpbnRmKGFyZ3YyWzNdLCJkJSIsKCBsYW5lX3N0ZXApKTsKLy9pdG9hX2Rkcl90ZXN0KGxhbmVfc3RlcCwoYXJndjJbM10pLDEwKTsKLy9wcmludGYoIlxuYXJndjJbJWRdPSVzXG4iLDAsYXJndjJbMF0pOwovLwlwcmludGYoIlxuYXJndjJbJWRdPSVzXG4iLDMsYXJndjJbM10pOy8vYSAwIDB4ODAwMDAwMCAwIGMKCS8vIHJlZ192YWx1ZT1kb19kZHJfdGVzdF9kcXNfd2luZG93X3N0ZXAoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJc3ByaW50ZihzdHIsImRkcl90ZXN0X2FjX2JpdF9zZXR1cF9ob2xkX3dpbmRvdyAgYSAwICAweCUwOHggICVkICAweCUwOHgiLGRkcl90ZXN0X3NpemUsdGVzdF9hY19zZXR1cF9ob2xkLCggbGFuZV9zdGVwKSk7CglwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkvL3NwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYiAwIDB4ODAwMDAgJWQiLCggbGFuZV9zdGVwKSk7CgkvL3ByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCXJ1bl9jb21tYW5kKHN0ciwwKTsKCiAgIHRlc3RfYWNfc2V0dXBfaG9sZD0yOwoJCXNwcmludGYoc3RyLCJkZHJfdGVzdF9hY19iaXRfc2V0dXBfaG9sZF93aW5kb3cgIGEgMCAgMHglMDh4ICAlZCAgMHglMDh4IixkZHJfdGVzdF9zaXplLHRlc3RfYWNfc2V0dXBfaG9sZCwoIGxhbmVfc3RlcCkpOwoJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJLy9zcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGIgMCAweDgwMDAwICVkIiwoIGxhbmVfc3RlcCkpOwoJLy9wcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CglydW5fY29tbWFuZChzdHIsMCk7CgkgIHRlc3RfYWNfc2V0dXBfaG9sZD0wOwoKfQp9CgoKCgoKaWYgKGNoYW5uZWxfYV9lbikKewoJCQlmb3IgKChsYW5lX3N0ZXA9MCk7KGxhbmVfc3RlcDwxMCk7KGxhbmVfc3RlcCsrKSkKCQkJCXsKCQkJcHJpbnRmKCJhY2JkbHIwXzlfcmVnX29yZ1slZF0weCUwOHg9PTB4JTA4eFxuIiwJbGFuZV9zdGVwLChERFIwX1BVQl9BQ0JETFIwKyhsYW5lX3N0ZXA8PDIpKSxhY2JkbHIwXzlfcmVnX29yZ1tsYW5lX3N0ZXBdKTsKCgkJCQl9OwoKZm9yICgobGFuZV9zdGVwPTApOyhsYW5lX3N0ZXA8NDApOyhsYW5lX3N0ZXArKykpCnsKcHJpbnRmKCJcbiBhX2FjX2xhbmVfMHglMDh4fHNldHVwX21heCAweCUwOHggIHxob2xkX21heCAweCUwOHggfHNldHVwX3RpbWUgJTA4ZCBwcyA6Onxob2xkX3RpbWUgJTA4ZCBwcyAgXG4iLApsYW5lX3N0ZXAsCmFjYmRscjBfOV9yZWdfc2V0dXBfbWF4W2xhbmVfc3RlcF0sCmFjYmRscjBfOV9yZWdfaG9sZF9tYXhbbGFuZV9zdGVwXSwKYWNiZGxyMF85X3JlZ19zZXR1cF90aW1lW2xhbmVfc3RlcF0sCmFjYmRscjBfOV9yZWdfaG9sZF90aW1lW2xhbmVfc3RlcF0pOwoKfX0KCgoKcmV0dXJuIHJlZ192YWx1ZTsKfQoKaW50IGRvX2Rkcl90ZXN0X2RhdGFfYml0X21hcmdpbihjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKIHByaW50ZigiXG5FbnRlcmRkcl90ZXN0X2RhdGFfd2luZG93IGZ1bmN0aW9uXG4iKTsKCQkgICB1bnNpZ25lZCBpbnQgICBjaGFubmVsX2FfZW4gPSAwOwovLwkgICB1bnNpZ25lZCBpbnQgICBjaGFubmVsX2JfZW4gPSAwOwogIC8vIHVuc2lnbmVkIGludCAgIHJlZ19hZGQ9MDsKICAvLyB1bnNpZ25lZCBpbnQgICByZWdfYmFzZV9hZGo9MDsKCgkgIHVuc2lnbmVkIGludCAgIGxhbmVfc3RlcD0gMDsKCSAgdW5zaWduZWQgaW50ICAgcmVnX3ZhbHVlPSAwOwoJIHVuc2lnbmVkIGludCAgIHRlc3RfYWNfc2V0dXBfaG9sZD0gMDsKLy9pbnQgYXJnYzI7Ci8vY2hhciAgICAgKiAgYXJndjJbMzBdOwovLyAgdW5zaWduZWQgaW50ICBhY2JkbHIwXzlfcmVnX29yZ1sxMF07Ci8vICAgdW5zaWduZWQgaW50ICBhY2JkbHIwXzlfcmVnX3NldHVwX21heFs0MF07CiAvLyAgdW5zaWduZWQgaW50ICBhY2JkbHIwXzlfcmVnX2hvbGRfbWF4WzQwXTsKIC8vICAgICB1bnNpZ25lZCBpbnQgIGFjYmRscjBfOV9yZWdfc2V0dXBfdGltZVs0MF07CiAgLy8gdW5zaWduZWQgaW50ICBhY2JkbHIwXzlfcmVnX2hvbGRfdGltZVs0MF07CgpjaGFyICplbmRwOwoKCQlpZiAoYXJnYyA9PSAyKQoJCXsKICAgIGlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApKQoKCXtjaGFubmVsX2FfZW4gPSAxOwoJfQoJZWxzZSBpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCl8fChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSkKCgl7Ly9jaGFubmVsX2JfZW4gPSAxOwoJfQoKCgkJfQoJCWlmIChhcmdjID4gMikKCQl7CiAgICBpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQSIpID09IDApKQoKCXtjaGFubmVsX2FfZW4gPSAxOwoJfQogICAgIGlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkIiKSA9PSAwKSkKCgl7Ly9jaGFubmVsX2JfZW4gPSAxOwoJfQoJCQl9CnVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQkgICBkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwogIGlmIChhcmdjID4zKSB7CglkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgJmVuZHAsIDE2KTsKICAgICAgICBpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJCX0KCX0KICB1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF90eXBlPTA7CiAgdW5zaWduZWQgaW50ICAgZGRyX3Rlc3RfdHlwZV9wYXJhMT0wOwogIHVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3R5cGVfcGFyYTI9MDsKICAgIGlmIChhcmdjID40KSB7CglkZHJfdGVzdF90eXBlID0gc2ltcGxlX3N0cnRvdWwoYXJndls0XSwgJmVuZHAsIDApOwogICAgICAgIGlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJZGRyX3Rlc3RfdHlwZSA9IDA7CgkJCX0KCX0KCWlmIChkZHJfdGVzdF90eXBlKSB7CgkgICAgaWYgKGFyZ2MgPjUpIHsKCWRkcl90ZXN0X3R5cGVfcGFyYTEgPSBzaW1wbGVfc3RydG91bChhcmd2WzVdLCAmZW5kcCwgMCk7CiAgICAgICAgaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQlkZHJfdGVzdF90eXBlX3BhcmExID0gMDsKCQkJfQoJfQoJCSAgICBpZiAoYXJnYyA+NikgewoJZGRyX3Rlc3RfdHlwZV9wYXJhMiA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNl0sICZlbmRwLCAwKTsKICAgICAgICBpZiAoKmFyZ3ZbNl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCWRkcl90ZXN0X3R5cGVfcGFyYTIgPSA5NjsKCQkJfQoJfQoJCX1lbHNlCgkJCXsgZGRyX3Rlc3RfdHlwZV9wYXJhMSA9IDA7CgkJICAgICAgICBkZHJfdGVzdF90eXBlX3BhcmEyID0gOTY7CgkJCX0KLy9hcmdjMj01OwoJLy9mb3IoaSA9IDE7aTwoYXJnYyk7aSsrKQoJCXsKCQkvL2FyZ3YyW2ktMV09YXJndltpXTsKCQl9CgovL2FyZ3YyWzBdPWFyZ3ZbMV07Ci8vYXJndjJbMV09YXJndlsyXTsKLy9hcmd2MlsyXT1hcmd2WzNdOwoJIHByaW50ZigiXG50ZXN0IGRhdGEgd2luZG93IGRkcl90ZXN0X3R5cGU9PTB4JTA4eCwgZGRyX3Rlc3RfdHlwZV9wYXJhMT09MHglMDh4LGRkcl90ZXN0X3R5cGVfcGFyYTI9PTB4JTA4eFxuIiwKCSBkZHJfdGVzdF90eXBlLGRkcl90ZXN0X3R5cGVfcGFyYTEsZGRyX3Rlc3RfdHlwZV9wYXJhMik7CmNoYXIgc3RyWzEwMF07CnVuc2lnbmVkIGludCAgIHRlbXBfY291bnQ9MDsKdGVzdF9hY19zZXR1cF9ob2xkPTA7CmlmIChjaGFubmVsX2FfZW4pCnsKCQkJZm9yICgodGVtcF9jb3VudD0wKTsodGVtcF9jb3VudDwyOCk7KHRlbXBfY291bnQrKykpCgkJCQl7Ci8vZGF0YV9iZGxyMF81X3JlZ19vcmdbdGVtcF9jb3VudF09KCgocmVhZGwoKCh0ZW1wX2NvdW50Pj4yKTw8MikrRERSMF9QVUJfRFgwQkRMUjArKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVtcF9jb3VudC82KStyZWdfYmFzZV9hZGopKQovLwk+Pig4Kih0ZXN0X2JkbCU0KSkpJjB4ZmYpOwpkYXRhX2JkbHIwXzVfcmVnX29yZ1t0ZW1wX2NvdW50XT0oKHJlYWRsKCgodGVtcF9jb3VudCU3KTw8MikrRERSMF9QVUJfRFgwQkRMUjArKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVtcF9jb3VudC83KSkpCgkpOwoJCQkJfTsKCi8vKihjaGFyICAgICAqKShhcmd2MlswXSk9ImEiOwoJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAxMSBhIDAgMHg4MDAwMCAgIiwwKTsKCSBwcmludGYoIlxudGVzdCBkYXRhIHdpbmRvdyAgYVxuIik7CmZvciAoKGxhbmVfc3RlcD1kZHJfdGVzdF90eXBlX3BhcmExKTsobGFuZV9zdGVwPGRkcl90ZXN0X3R5cGVfcGFyYTIpOyhsYW5lX3N0ZXArKykpCnsKaWYgKGxhbmVfc3RlcCA9PSA5KQp7bGFuZV9zdGVwPTEyOwp9CmlmIChsYW5lX3N0ZXAgPT0gMjEpCntsYW5lX3N0ZXA9MjQ7Cn0KaWYgKGxhbmVfc3RlcCA9PSAzMykKe2xhbmVfc3RlcD0zNjsKfQppZiAobGFuZV9zdGVwID09IDQ1KQp7bGFuZV9zdGVwPTQ4Owp9CmlmIChsYW5lX3N0ZXAgPT0gMzMrMjQpCntsYW5lX3N0ZXA9MzYrMjQ7Cn0KaWYgKGxhbmVfc3RlcCA9PSA0NSsyNCkKe2xhbmVfc3RlcD00OCsyNDsKfQppZiAobGFuZV9zdGVwID09IDMzKzQ4KQp7bGFuZV9zdGVwPTM2KzQ4Owp9CmlmIChsYW5lX3N0ZXAgPT0gNDQrNDgpCntsYW5lX3N0ZXA9NDgrNDg7Cn0KCi8vc3ByaW50Zihhcmd2MlszXSwiZCUiLCggbGFuZV9zdGVwKSk7Ci8vaXRvYV9kZHJfdGVzdChsYW5lX3N0ZXAsKGFyZ3YyWzNdKSwxMCk7Ci8vcHJpbnRmKCJcbmFyZ3YyWyVkXT0lc1xuIiwwLGFyZ3YyWzBdKTsKLy8JcHJpbnRmKCJcbmFyZ3YyWyVkXT0lc1xuIiwzLGFyZ3YyWzNdKTsvL2EgMCAweDgwMDAwMDAgMCBjCgkvLyByZWdfdmFsdWU9ZG9fZGRyX3Rlc3RfZHFzX3dpbmRvd19zdGVwKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCXNwcmludGYoc3RyLCJkZHJfdGVzdF9kYXRhX2JpdF9zZXR1cF9ob2xkX3dpbmRvdyAgYSAwICAweCUwOHggICVkICAweCUwOHgiLGRkcl90ZXN0X3NpemUsdGVzdF9hY19zZXR1cF9ob2xkLCggbGFuZV9zdGVwKSk7CglwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkvL3NwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYiAwIDB4ODAwMDAgJWQiLCggbGFuZV9zdGVwKSk7CgkvL3ByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCXJ1bl9jb21tYW5kKHN0ciwwKTsKCiAgIHRlc3RfYWNfc2V0dXBfaG9sZD0xOwoJCXNwcmludGYoc3RyLCJkZHJfdGVzdF9kYXRhX2JpdF9zZXR1cF9ob2xkX3dpbmRvdyAgYSAwICAweCUwOHggICVkICAweCUwOHgiLGRkcl90ZXN0X3NpemUsdGVzdF9hY19zZXR1cF9ob2xkLCggbGFuZV9zdGVwKSk7CglwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkvL3NwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYiAwIDB4ODAwMDAgJWQiLCggbGFuZV9zdGVwKSk7CgkvL3ByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCXJ1bl9jb21tYW5kKHN0ciwwKTsKCSAgdGVzdF9hY19zZXR1cF9ob2xkPTA7CgkJCWZvciAoKHRlbXBfY291bnQ9MCk7KHRlbXBfY291bnQ8MjgpOyh0ZW1wX2NvdW50KyspKQoJCQkJewoJCQkJIHdyaXRlbCgoKGRhdGFfYmRscjBfNV9yZWdfb3JnW3RlbXBfY291bnRdKSksCgkJCQkJKCgodGVtcF9jb3VudCU3KTw8MikrRERSMF9QVUJfRFgwQkRMUjArKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVtcF9jb3VudC83KSkpOwoKCQkJCX07CgoKfQp9CgoKCgoKaWYgKGNoYW5uZWxfYV9lbikKewoJCQlmb3IgKChsYW5lX3N0ZXA9MCk7KGxhbmVfc3RlcDwyOCk7KGxhbmVfc3RlcCsrKSkKCQkJCXsKCQkJcHJpbnRmKCJkYXRhX2JkbHIwXzVfcmVnX29yZ1slZF0weCUwOHg9PTB4JTA4eFxuIiwJbGFuZV9zdGVwLAoJCQkJKCgobGFuZV9zdGVwJTcpPDwyKStERFIwX1BVQl9EWDBCRExSMCsoRERSMF9QVUJfRFgxQkRMUjAtRERSMF9QVUJfRFgwQkRMUjApKihsYW5lX3N0ZXAvNykpLAoJCQkJZGF0YV9iZGxyMF81X3JlZ19vcmdbbGFuZV9zdGVwXSk7CgoJCQkJfTsKCmZvciAoKGxhbmVfc3RlcD0wKTsobGFuZV9zdGVwPDk2KTsobGFuZV9zdGVwKyspKQp7CnByaW50ZigiXG4gYV9hY19sYW5lXzB4JTA4eHxzZXR1cF9tYXggMHglMDh4ICB8aG9sZF9tYXggMHglMDh4IHxzZXR1cF90aW1lICUwOGQgcHMgOjp8aG9sZF90aW1lICUwOGQgcHMgIFxuIiwKbGFuZV9zdGVwLApiZGxyMF85X3JlZ19zZXR1cF9tYXhbbGFuZV9zdGVwXSwKYmRscjBfOV9yZWdfaG9sZF9tYXhbbGFuZV9zdGVwXSwKYmRscjBfOV9yZWdfc2V0dXBfdGltZVtsYW5lX3N0ZXBdLApiZGxyMF85X3JlZ19ob2xkX3RpbWVbbGFuZV9zdGVwXSk7Cgp9fQoKCgpyZXR1cm4gcmVnX3ZhbHVlOwp9CgovLyNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV9HWF9CQUJZKQppbnQgZG9fZGRyX2d4X2Nyb3NzdGFsayhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKLy8vKgoJdW5zaWduZWQgaW50ICBkZXNbOF0gOwogdW5zaWduZWQgaW50ICBwYXR0ZXJuXzFbNF1bOF0gOwogdW5zaWduZWQgaW50ICBwYXR0ZXJuXzJbNF1bOF0gOwogdW5zaWduZWQgaW50ICBwYXR0ZXJuXzNbNF1bOF0gOwogdW5zaWduZWQgaW50ICBwYXR0ZXJuXzRbNF1bOF0gOwogdW5zaWduZWQgaW50ICBwYXR0ZXJuXzVbNF1bOF0gOwogIHVuc2lnbmVkIGludCAgcGF0dGVybl82WzRdWzhdIDsKCgogIGRlc1swXSA9IAkweGFlYzgzZjQ5OwogICBkZXNbMV0gPSAgICAgIDB4ZDI0M2E2MmM7CiAgIGRlc1syXSA9ICAgICAgMHhmODc3NGEwYjsKICBkZXNbM10gPSAgICAgICAweDYzZDIxNGU1OwogICBkZXNbNF0gPSAgICAgIDB4M2Y0MTY2ZDU7CglkZXNbNV0gPSAgICAgMHgyMzk2NzJjMDsKICAgZGVzWzZdID0gICAgICAweDQ3YmE3NTMzOwogICBkZXNbN10gPSAgICAgIDB4Y2FlNGNkN2Y7CglwYXR0ZXJuXzFbMF1bMF0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzBdWzFdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVswXVsyXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbMF1bM10gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzBdWzRdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVswXVs1XSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbMF1bNl0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzBdWzddID0gMHhmZjAwZmYwMDsKCglwYXR0ZXJuXzFbMV1bMF0gPSAweDAwZmZmZjAwOwoJcGF0dGVybl8xWzFdWzFdID0gMHgwMGZmZmYwMDsKCXBhdHRlcm5fMVsxXVsyXSA9IDB4MDBmZmZmMDA7CglwYXR0ZXJuXzFbMV1bM10gPSAweDAwZmZmZjAwOwoJcGF0dGVybl8xWzFdWzRdID0gMHgwMGZmZmYwMDsKCXBhdHRlcm5fMVsxXVs1XSA9IDB4MDBmZmZmMDA7CglwYXR0ZXJuXzFbMV1bNl0gPSAweDAwZmZmZjAwOwoJcGF0dGVybl8xWzFdWzddID0gMHgwMGZmZmYwMDsKCglwYXR0ZXJuXzFbMl1bMF0gPSAweGZmZmYwMDAwOwoJcGF0dGVybl8xWzJdWzFdID0gMHhmZmZmMDAwMDsKCXBhdHRlcm5fMVsyXVsyXSA9IDB4ZmZmZjAwMDA7CglwYXR0ZXJuXzFbMl1bM10gPSAweGZmZmYwMDAwOwoJcGF0dGVybl8xWzJdWzRdID0gMHhmZmZmMDAwMDsKCXBhdHRlcm5fMVsyXVs1XSA9IDB4ZmZmZjAwMDA7CglwYXR0ZXJuXzFbMl1bNl0gPSAweGZmZmYwMDAwOwoJcGF0dGVybl8xWzJdWzddID0gMHhmZmZmMDAwMDsKCglwYXR0ZXJuXzFbM11bMF0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzNdWzFdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVszXVsyXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbM11bM10gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzNdWzRdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVszXVs1XSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbM11bNl0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzNdWzddID0gMHhmZjAwZmYwMDsKCglwYXR0ZXJuXzJbMF1bMF0gPSAweDAwMDFmZTAwOwoJcGF0dGVybl8yWzBdWzFdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlswXVsyXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMF1bM10gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzBdWzRdID0gMHgwMDAyZmQwMDsKCXBhdHRlcm5fMlswXVs1XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMF1bNl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzBdWzddID0gMHgwMDAwZmYwMDsKCglwYXR0ZXJuXzJbMV1bMF0gPSAweDAwMDRmYjAwOwoJcGF0dGVybl8yWzFdWzFdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsxXVsyXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMV1bM10gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzFdWzRdID0gMHgwMDA4ZjcwMDsKCXBhdHRlcm5fMlsxXVs1XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMV1bNl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzFdWzddID0gMHgwMDAwZmYwMDsKCglwYXR0ZXJuXzJbMl1bMF0gPSAweDAwMTBlZjAwOwoJcGF0dGVybl8yWzJdWzFdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsyXVsyXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMl1bM10gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzJdWzRdID0gMHgwMDIwZGYwMDsKCXBhdHRlcm5fMlsyXVs1XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMl1bNl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzJdWzddID0gMHgwMDAwZmYwMDsKCglwYXR0ZXJuXzJbM11bMF0gPSAweDAwNDBiZjAwOwoJcGF0dGVybl8yWzNdWzFdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlszXVsyXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbM11bM10gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzNdWzRdID0gMHgwMDgwN2YwMDsKCXBhdHRlcm5fMlszXVs1XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbM11bNl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzNdWzddID0gMHgwMDAwZmYwMDsKCglwYXR0ZXJuXzNbMF1bMF0gPSAweDAwMDEwMDAwOwoJcGF0dGVybl8zWzBdWzFdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1swXVsyXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMF1bM10gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzBdWzRdID0gMHgwMDAyMDAwMDsKCXBhdHRlcm5fM1swXVs1XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMF1bNl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzBdWzddID0gMHgwMDAwMDAwMDsKCglwYXR0ZXJuXzNbMV1bMF0gPSAweDAwMDQwMDAwOwoJcGF0dGVybl8zWzFdWzFdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1sxXVsyXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMV1bM10gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzFdWzRdID0gMHgwMDA4MDAwMDsKCXBhdHRlcm5fM1sxXVs1XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMV1bNl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzFdWzddID0gMHgwMDAwMDAwMDsKCglwYXR0ZXJuXzNbMl1bMF0gPSAweDAwMTAwMDAwOwoJcGF0dGVybl8zWzJdWzFdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1syXVsyXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMl1bM10gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzJdWzRdID0gMHgwMDIwMDAwMDsKCXBhdHRlcm5fM1syXVs1XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMl1bNl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzJdWzddID0gMHgwMDAwMDAwMDsKCglwYXR0ZXJuXzNbM11bMF0gPSAweDAwNDAwMDAwOwoJcGF0dGVybl8zWzNdWzFdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1szXVsyXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbM11bM10gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzNdWzRdID0gMHgwMDgwMDAwMDsKCXBhdHRlcm5fM1szXVs1XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbM11bNl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzNdWzddID0gMHgwMDAwMDAwMDsKCi8vLyoKcGF0dGVybl80WzBdWzBdID0JMHg1MWM4YzA0OQk7CnBhdHRlcm5fNFswXVsxXSA9CTB4MmQ0MzU5MmMJOwpwYXR0ZXJuXzRbMF1bMl0gPQkweDA3NzdiNTBiCTsKcGF0dGVybl80WzBdWzNdID0JMHg5Y2QyZWJlNQk7CnBhdHRlcm5fNFswXVs0XSA9CTB4YzA0MTk5ZDUJOwpwYXR0ZXJuXzRbMF1bNV0gPQkweGRjOTY4ZGMwCTsKcGF0dGVybl80WzBdWzZdID0JMHhiOGJhOGEzMwk7CnBhdHRlcm5fNFswXVs3XSA9CTB4MzVlNDMyN2YJOwoKcGF0dGVybl80WzFdWzBdID0JMHhhZTM3YzA0OQk7CnBhdHRlcm5fNFsxXVsxXSA9CTB4ZDJiYzU5MmMJOwpwYXR0ZXJuXzRbMV1bMl0gPQkweGY4ODhiNTBiCTsKcGF0dGVybl80WzFdWzNdID0JMHg2MzJkZWJlNQk7CnBhdHRlcm5fNFsxXVs0XSA9CTB4M2ZiZTk5ZDUJOwpwYXR0ZXJuXzRbMV1bNV0gPQkweDIzNjk4ZGMwCTsKcGF0dGVybl80WzFdWzZdID0JMHg0NzQ1OGEzMwk7CnBhdHRlcm5fNFsxXVs3XSA9CTB4Y2ExYjMyN2YJOwoKcGF0dGVybl80WzJdWzBdID0JMHg1MTM3M2Y0OQk7CnBhdHRlcm5fNFsyXVsxXSA9CTB4MmRiY2E2MmMJOwpwYXR0ZXJuXzRbMl1bMl0gPQkweDA3ODg0YTBiCTsKcGF0dGVybl80WzJdWzNdID0JMHg5YzJkMTRlNQk7CnBhdHRlcm5fNFsyXVs0XSA9CTB4YzBiZTY2ZDUJOwpwYXR0ZXJuXzRbMl1bNV0gPQkweGRjNjk3MmMwCTsKcGF0dGVybl80WzJdWzZdID0JMHhiODQ1NzUzMwk7CnBhdHRlcm5fNFsyXVs3XSA9CTB4MzUxYmNkN2YJOwoKCnBhdHRlcm5fNFszXVswXSA9CTB4NTFjOGMwNDkJOwpwYXR0ZXJuXzRbM11bMV0gPQkweDJkNDM1OTJjCTsKcGF0dGVybl80WzNdWzJdID0JMHgwNzc3YjUwYgk7CnBhdHRlcm5fNFszXVszXSA9CTB4OWNkMmViZTUJOwpwYXR0ZXJuXzRbM11bNF0gPQkweGMwNDE5OWQ1CTsKcGF0dGVybl80WzNdWzVdID0JMHhkYzk2OGRjMAk7CnBhdHRlcm5fNFszXVs2XSA9CTB4YjhiYThhMzMJOwpwYXR0ZXJuXzRbM11bN10gPQkweDM1ZTQzMjdmCTsKCnBhdHRlcm5fNVswXVswXSA9CTB4YWVjOWMxNDkJOwpwYXR0ZXJuXzVbMF1bMV0gPQkweGQyNDM1OTJjCTsKcGF0dGVybl81WzBdWzJdID0JMHhmODc3YjUwYgk7CnBhdHRlcm5fNVswXVszXSA9CTB4NjNkMmViZTUJOwpwYXR0ZXJuXzVbMF1bNF0gPQkweDNmNDM5YmQ1CTsKcGF0dGVybl81WzBdWzVdID0JMHgyMzk2OGRjMAk7CnBhdHRlcm5fNVswXVs2XSA9CTB4NDdiYThhMzMJOwpwYXR0ZXJuXzVbMF1bN10gPQkweGNhZTQzMjdmCTsKcGF0dGVybl81WzFdWzBdID0JMHhhZWNjYzQ0OQk7CnBhdHRlcm5fNVsxXVsxXSA9CTB4ZDI0MzU5MmMJOwpwYXR0ZXJuXzVbMV1bMl0gPQkweGY4NzdiNTBiCTsKcGF0dGVybl81WzFdWzNdID0JMHg2M2QyZWJlNQk7CnBhdHRlcm5fNVsxXVs0XSA9CTB4M2Y0OTkxZDUJOwpwYXR0ZXJuXzVbMV1bNV0gPQkweDIzOTY4ZGMwCTsKcGF0dGVybl81WzFdWzZdID0JMHg0N2JhOGEzMwk7CnBhdHRlcm5fNVsxXVs3XSA9CTB4Y2FlNDMyN2YJOwpwYXR0ZXJuXzVbMl1bMF0gPQkweGFlZDhkMDQ5CTsKcGF0dGVybl81WzJdWzFdID0JMHhkMjQzNTkyYwk7CnBhdHRlcm5fNVsyXVsyXSA9CTB4Zjg3N2I1MGIJOwpwYXR0ZXJuXzVbMl1bM10gPQkweDYzZDJlYmU1CTsKcGF0dGVybl81WzJdWzRdID0JMHgzZjYxYjlkNQk7CnBhdHRlcm5fNVsyXVs1XSA9CTB4MjM5NjhkYzAJOwpwYXR0ZXJuXzVbMl1bNl0gPQkweDQ3YmE4YTMzCTsKcGF0dGVybl81WzJdWzddID0JMHhjYWU0MzI3Zgk7CnBhdHRlcm5fNVszXVswXSA9CTB4YWU4ODgwNDkJOwpwYXR0ZXJuXzVbM11bMV0gPQkweGQyNDM1OTJjCTsKcGF0dGVybl81WzNdWzJdID0JMHhmODc3YjUwYgk7CnBhdHRlcm5fNVszXVszXSA9CTB4NjNkMmViZTUJOwpwYXR0ZXJuXzVbM11bNF0gPQkweDNmYzExOWQ1CTsKcGF0dGVybl81WzNdWzVdID0JMHgyMzk2OGRjMAk7CnBhdHRlcm5fNVszXVs2XSA9CTB4NDdiYThhMzMJOwpwYXR0ZXJuXzVbM11bN10gPQkweGNhZTQzMjdmCTsKCnBhdHRlcm5fNlswXVswXSA9ICAgMHhhZWM5M2Y0OSAgIDsKcGF0dGVybl82WzBdWzFdID0JMHhkMjQzYTYyYwk7CnBhdHRlcm5fNlswXVsyXSA9CTB4Zjg3NzRhMGIJOwpwYXR0ZXJuXzZbMF1bM10gPQkweDYzZDIxNGU1CTsKcGF0dGVybl82WzBdWzRdID0JMHgzZjQzNjZkNQk7CnBhdHRlcm5fNlswXVs1XSA9CTB4MjM5NjcyYzAJOwpwYXR0ZXJuXzZbMF1bNl0gPQkweDQ3YmE3NTMzCTsKcGF0dGVybl82WzBdWzddID0JMHhjYWU0Y2Q3Zgk7CnBhdHRlcm5fNlsxXVswXSA9CTB4YWVjYzNmNDkJOwpwYXR0ZXJuXzZbMV1bMV0gPQkweGQyNDNhNjJjCTsKcGF0dGVybl82WzFdWzJdID0JMHhmODc3NGEwYgk7CnBhdHRlcm5fNlsxXVszXSA9CTB4NjNkMjE0ZTUJOwpwYXR0ZXJuXzZbMV1bNF0gPQkweDNmNDk2NmQ1CTsKcGF0dGVybl82WzFdWzVdID0JMHgyMzk2NzJjMAk7CnBhdHRlcm5fNlsxXVs2XSA9CTB4NDdiYTc1MzMJOwpwYXR0ZXJuXzZbMV1bN10gPQkweGNhZTRjZDdmCTsKcGF0dGVybl82WzJdWzBdID0JMHhhZWQ4M2Y0OQk7CnBhdHRlcm5fNlsyXVsxXSA9CTB4ZDI0M2E2MmMJOwpwYXR0ZXJuXzZbMl1bMl0gPQkweGY4Nzc0YTBiCTsKcGF0dGVybl82WzJdWzNdID0JMHg2M2QyMTRlNQk7CnBhdHRlcm5fNlsyXVs0XSA9CTB4M2Y2MTY2ZDUJOwpwYXR0ZXJuXzZbMl1bNV0gPQkweDIzOTY3MmMwCTsKcGF0dGVybl82WzJdWzZdID0JMHg0N2JhNzUzMwk7CnBhdHRlcm5fNlsyXVs3XSA9CTB4Y2FlNGNkN2YJOwpwYXR0ZXJuXzZbM11bMF0gPQkweGFlODgzZjQ5CTsKcGF0dGVybl82WzNdWzFdID0JMHhkMjQzYTYyYwk7CnBhdHRlcm5fNlszXVsyXSA9CTB4Zjg3NzRhMGIJOwpwYXR0ZXJuXzZbM11bM10gPQkweDYzZDIxNGU1CTsKcGF0dGVybl82WzNdWzRdID0JMHgzZmMxNjZkNQk7CnBhdHRlcm5fNlszXVs1XSA9CTB4MjM5NjcyYzAJOwpwYXR0ZXJuXzZbM11bNl0gPQkweDQ3YmE3NTMzCTsKcGF0dGVybl82WzNdWzddID0JMHhjYWU0Y2Q3Zgk7Ci8vKi8KLy8qLwoKIGNoYXIgKmVuZHA7CgkgdW5zaWduZWQgaW50ICAgbG9vcCA9IDE7CgkgdW5zaWduZWQgaW50ICAgbGZsYWcgPSAwOwoJIHVuc2lnbmVkIGludCAgc3RhcnRfYWRkciA9IEREUl9URVNUX1NUQVJUX0FERFI7CgkgICAgICB1bnNpZ25lZCBpbnQgIHRlc3Rfc2l6ZSA9IEREUl9URVNUX1NJWkU7CgkJICB1bnNpZ25lZCBpbnQgICB0ZXN0X2FkZHI7CgoJCSAgIGVycm9yX291dG9mX2NvdW50X2ZsYWcgPTA7CgkJIGVycm9yX2NvdW50ID0wOwoJCSAgIHByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCQkJaW50IGkgOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJCXsKCQlwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKCQl9CmlmIChhcmdjID09IDEpCiBnb3RvIHVzYWdlOwppZiAoYXJnYz4xKQp7CiAgICBpZiAoc3RyY21wKGFyZ3ZbMV0sICJsIikgPT0gMCkgewoJCWxmbGFnID0gMTsKCX0KCgllbHNlewoJCWxvb3AgPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCAmZW5kcCwgMTApOwogICAgICAgIGlmICgqYXJndlsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCWxvb3AgPSAxOwoJfQoKCQkvLyAgICBwcmludGYoIlxuTElORT09IDB4JTA4eFxuIiwgX19MSU5FX18pOwoJCSAgICBpZiAoYXJnYyA9PTEpIHsKCS8vICAgIHN0YXJ0X2FkZHIgPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCAmZW5kcCwgMTYpOwoJLy8gICAgaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJc3RhcnRfYWRkciA9IEREUl9URVNUX1NUQVJUX0FERFI7CgkgIGxvb3AgPSAxOwoKCX0KfQoKCgogICAgaWYgKGFyZ2MgPj0gMikgewoJCWxvb3AgPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCAmZW5kcCwgMTYpOwogICAgICAgIGlmICgqYXJndlsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCWxvb3AgPSAxOwoKCX0KCXVuc2lnbmVkIGludCBwYXR0ZXJuX2ZsYWcxPTE7Cgl1bnNpZ25lZCBpbnQgcGF0dGVybl9mbGFnMj0xOwoJdW5zaWduZWQgaW50IHBhdHRlcm5fZmxhZzM9MTsKCSAgICAgICBwYXR0ZXJuX2ZsYWcxID0gMTsKCQlwYXR0ZXJuX2ZsYWcyPTE7CgkJIHBhdHRlcm5fZmxhZzMgPSAxOwoKCgkgaWYgKGFyZ2MgPj0gMyAgKSB7CiAgICBpZiAoIChzdHJjbXAoYXJndlsyXSwgInMiKSA9PSAwKSkKCQl7CgkJcGF0dGVybl9mbGFnMSA9IDE7CgkJcGF0dGVybl9mbGFnMj0wOwoJCSBwYXR0ZXJuX2ZsYWczID0gMDsKCX0KIGVsc2UgaWYgKChzdHJjbXAoYXJndlsyXSwgImMiKSA9PSAwKSkKCQl7CgkJcGF0dGVybl9mbGFnMSA9IDA7CgkJcGF0dGVybl9mbGFnMj0xOwoJCSBwYXR0ZXJuX2ZsYWczID0gMDsKCX0KZWxzZSAgaWYgKCAoc3RyY21wKGFyZ3ZbMl0sICJkIikgPT0gMCkpCgl7CgkJICBwYXR0ZXJuX2ZsYWcxID0gMDsKCQlwYXR0ZXJuX2ZsYWcyPTA7CgkJIHBhdHRlcm5fZmxhZzMgPSAxOwoJfQoJfQoKCS8vCWlmKHRlc3Rfc2l6ZTwweDIwKQoJc3RhcnRfYWRkcj0weDEwMDAwMDAwOwoJCQl0ZXN0X3NpemUgPSAweDIwOwp1bnNpZ25lZCBpbnQgdGVtcF9pPTA7CnVuc2lnbmVkIGludCB0ZW1wX2s9MDsKdW5zaWduZWQgaW50IHBhdHRlcm5fb1s4XTsKdW5zaWduZWQgaW50IHBhdHRlcm5fZFs4XTsKCgovL0REUl9URVNUX1NUQVJUOgoKLy8vKgplcnJvcl9jb3VudD0wOwoJZG8gewogICAgICAgIGlmIChsZmxhZykKCQkJbG9vcCA9IDg4ODsKCgkJLy9pZihvbGRfcGF0dGVybl9mbGFnPT0xKQoJCQl7CgoJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLlxuIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CgovKgoJIGZvciAoKHRlbXBfaz0wKTsodGVtcF9rPDQpOyh0ZW1wX2srKykpIHsKewoKCQkgIGZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCXsKCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkqKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk9ZGVzX3BhdHRlcm4odGVtcF9pLDIsdGVtcF9rLHRlbXBfaSk7Ly9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldOwoJLy8JI2RlZmluZSBkZXNfcGF0dGVybihhLGIsYyxkKSAgZGVzW2FdXnBhdHRlcm5fIyNiW2NdW2RdCi8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXQoJCX0KICAgLy8gICBfY2xlYW5fZGNhY2hlX2FkZHIoMHgxMDAwMDAwMCk7CgkgIGZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwoKCSAgZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCXBhdHRlcm5fb1t0ZW1wX2ldPSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKTsKCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0pOwogLy9wcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwogLy9wcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldKTsKCWlmIChwYXR0ZXJuX29bdGVtcF9pXSAhPSBwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldKQoJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoInA1RXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF0tRDB4JTA4eFxuIixwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCBwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldLHBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJfQoJICB9CgkJCX0KCQl9CiovCgkJaWYgKHBhdHRlcm5fZmxhZzEgPT0gMSkgewoJCSAgZm9yICgodGVtcF9rPTApOyh0ZW1wX2s8NCk7KHRlbXBfaysrKSkKCQkJewp7CmRkcl91ZGVsYXkoMTAwMDApOwoJCSAgZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkKCQkJewoJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKT1kZXNfcGF0dGVybih0ZW1wX2ksMSx0ZW1wX2ssdGVtcF9pKTsvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV07CgkvLwkjZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICBkZXNbYV1ecGF0dGVybl8jI2JbY11bZF0KLy9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldCgkJfQogICAvLyAgIF9jbGVhbl9kY2FjaGVfYWRkcigweDEwMDAwMDAwKTsKICAgI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJICBmbHVzaF9kY2FjaGVfcmFuZ2Uoc3RhcnRfYWRkcixzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKICAgI2VuZGlmCgkgIGZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpIHsKCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQlwYXR0ZXJuX29bdGVtcF9pXT0qKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk7CgkvLwkgcHJpbnRmKCJcbiB0ZXN0X2FkZHIgcGF0dGVybl9vIHBhdHRlcm5fZCAgMHglMDh4IC0gMHglMDh4IC0gMHglMDh4IiwgdGVzdF9hZGRyLHBhdHRlcm5fb1t0ZW1wX2ldLCBwYXR0ZXJuXzFbdGVtcF9rXVt0ZW1wX2ldKTsKCQkvLyAgcHJpbnRmKCJcbjB4JTA4eCIsKHBhdHRlcm5fb1t0ZW1wX2ldKV4oZGVzW3RlbXBfaV0pKTsKCS8vCSAgcHJpbnRmKCJcbjB4JTA4eCIscGF0dGVybl80W3RlbXBfa11bdGVtcF9pXSk7CglpZiAocGF0dGVybl9vW3RlbXBfaV0gIT0gcGF0dGVybl80W3RlbXBfa11bdGVtcF9pXSkKCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJwNEVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgcGF0dGVybl80W3RlbXBfa11bdGVtcF9pXSxwYXR0ZXJuXzFbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCX0KCgkJfQoJCQl9CgkJfQoJCSAgZm9yICgodGVtcF9rPTApOyh0ZW1wX2s8NCk7KHRlbXBfaysrKSkKCQkgIHsKewpkZHJfdWRlbGF5KDEwMDAwKTsKCQkgIGZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCXsKCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkqKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk9ZGVzX2ludl9wYXR0ZXJuKHRlbXBfaSwxLHRlbXBfayx0ZW1wX2kpOy8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXTsKCS8vCSNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIGRlc1thXV5wYXR0ZXJuXyMjYltjXVtkXQovL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0KCQl9CiAgIC8vICAgX2NsZWFuX2RjYWNoZV9hZGRyKDB4MTAwMDAwMDApOwogICAjaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkgIGZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwogICAjZW5kaWYKCSAgZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCXBhdHRlcm5fb1t0ZW1wX2ldPSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKTsKCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fMVt0ZW1wX2tdW3RlbXBfaV0pOwoJCS8vICBwcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwoJLy8JICBwcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzRbdGVtcF9rXVt0ZW1wX2ldKTsKCXBhdHRlcm5fZFt0ZW1wX2ldPWRlc194b3JfcGF0dGVybigoZGVzW3RlbXBfaV0pLChwYXR0ZXJuX29bdGVtcF9pXSkpOwoJaWYgKChkZXNfeG9yX3BhdHRlcm4oKGRlc1t0ZW1wX2ldKSwocGF0dGVybl9vW3RlbXBfaV0pKSkgIT0gcGF0dGVybl9kW3RlbXBfaV0pCgl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigicDQgaW52RXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF0tRDB4JTA4eFxuIixwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCB+KHBhdHRlcm5fNFt0ZW1wX2tdW3RlbXBfaV0pLHBhdHRlcm5fZFt0ZW1wX2ldKTsKCQkJCQkJfQoKCQl9CgkJCX0KCQl9CgkJICB9CgkJaWYgKHBhdHRlcm5fZmxhZzIgPT0gMSkgewoJIGZvciAoKHRlbXBfaz0wKTsodGVtcF9rPDQpOyh0ZW1wX2srKykpIHsKewpkZHJfdWRlbGF5KDEwMDAwKTsKCQkgIGZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCXsKCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkqKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk9ZGVzX3BhdHRlcm4odGVtcF9pLDIsdGVtcF9rLHRlbXBfaSk7Ly9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldOwoJLy8JI2RlZmluZSBkZXNfcGF0dGVybihhLGIsYyxkKSAgZGVzW2FdXnBhdHRlcm5fIyNiW2NdW2RdCi8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXQoJCX0KICAgLy8gICBfY2xlYW5fZGNhY2hlX2FkZHIoMHgxMDAwMDAwMCk7CiAgICNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCSAgZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0X2FkZHIsc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CiAgICNlbmRpZgoJICBmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKSB7CgkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJcGF0dGVybl9vW3RlbXBfaV09Kih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpOwoJLy8JIHByaW50ZigiXG4gdGVzdF9hZGRyIHBhdHRlcm5fbyBwYXR0ZXJuX2QgIDB4JTA4eCAtIDB4JTA4eCAtIDB4JTA4eCIsIHRlc3RfYWRkcixwYXR0ZXJuX29bdGVtcF9pXSwgcGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXSk7CiAvL3ByaW50ZigiXG4weCUwOHgiLChwYXR0ZXJuX29bdGVtcF9pXSleKGRlc1t0ZW1wX2ldKSk7CiAvL3ByaW50ZigiXG4weCUwOHgiLHBhdHRlcm5fNVt0ZW1wX2tdW3RlbXBfaV0pOwoJaWYgKHBhdHRlcm5fb1t0ZW1wX2ldICE9IHBhdHRlcm5fNVt0ZW1wX2tdW3RlbXBfaV0pCgl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigicDVFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIHBhdHRlcm5fNVt0ZW1wX2tdW3RlbXBfaV0scGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQl9CgkgIH0KCQkJfQoJCX0KCSAgZm9yICgodGVtcF9rPTApOyh0ZW1wX2s8NCk7KHRlbXBfaysrKSkKewp7CmRkcl91ZGVsYXkoMTAwMDApOwoJCSAgZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkKCQkJewoJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKT1kZXNfaW52X3BhdHRlcm4odGVtcF9pLDIsdGVtcF9rLHRlbXBfaSk7Ly9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldOwoJLy8JI2RlZmluZSBkZXNfcGF0dGVybihhLGIsYyxkKSAgZGVzW2FdXnBhdHRlcm5fIyNiW2NdW2RdCi8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXQoJCX0KICAgLy8gICBfY2xlYW5fZGNhY2hlX2FkZHIoMHgxMDAwMDAwMCk7CiAgICNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCSAgZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0X2FkZHIsc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CiAgICNlbmRpZgoJICBmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKSB7CgkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJcGF0dGVybl9vW3RlbXBfaV09Kih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpOwoJLy8JIHByaW50ZigiXG4gdGVzdF9hZGRyIHBhdHRlcm5fbyBwYXR0ZXJuX2QgIDB4JTA4eCAtIDB4JTA4eCAtIDB4JTA4eCIsIHRlc3RfYWRkcixwYXR0ZXJuX29bdGVtcF9pXSwgcGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXSk7CiAvL3ByaW50ZigiXG4weCUwOHgiLChwYXR0ZXJuX29bdGVtcF9pXSleKGRlc1t0ZW1wX2ldKSk7CiAvL3ByaW50ZigiXG4weCUwOHgiLHBhdHRlcm5fNVt0ZW1wX2tdW3RlbXBfaV0pOwoJcGF0dGVybl9kW3RlbXBfaV09ZGVzX3hvcl9wYXR0ZXJuKChkZXNbdGVtcF9pXSksKHBhdHRlcm5fb1t0ZW1wX2ldKSk7CgkJaWYgKChkZXNfeG9yX3BhdHRlcm4oKGRlc1t0ZW1wX2ldKSwocGF0dGVybl9vW3RlbXBfaV0pKSkgIT0gcGF0dGVybl9kW3RlbXBfaV0pCgl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigicDUgaW52RXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF0tRDB4JTA4eFxuIixwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCB+KHBhdHRlcm5fNVt0ZW1wX2tdW3RlbXBfaV0pLHBhdHRlcm5fZFt0ZW1wX2ldKTsKCQkJCQkJfQoJICB9CgkJCX0KCQl9CgoJCQl9CgoJCWlmIChwYXR0ZXJuX2ZsYWczID09IDEpIHsKCWZvciAoKHRlbXBfaz0wKTsodGVtcF9rPDQpOyh0ZW1wX2srKykpIHsKewpkZHJfdWRlbGF5KDEwMDAwKTsKCQkgIGZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCXsKCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkqKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk9ZGVzX3BhdHRlcm4odGVtcF9pLDMsdGVtcF9rLHRlbXBfaSk7Ly9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldOwoJLy8JI2RlZmluZSBkZXNfcGF0dGVybihhLGIsYyxkKSAgZGVzW2FdXnBhdHRlcm5fIyNiW2NdW2RdCi8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXQoJCX0KICAgLy8gICBfY2xlYW5fZGNhY2hlX2FkZHIoMHgxMDAwMDAwMCk7CiAgICNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCSAgZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0X2FkZHIsc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CiAgICNlbmRpZgoJICBmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKSB7CgkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJcGF0dGVybl9vW3RlbXBfaV09Kih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpOwoJLy8JIHByaW50ZigiXG4gdGVzdF9hZGRyIHBhdHRlcm5fbyBwYXR0ZXJuX2QgIDB4JTA4eCAtIDB4JTA4eCAtIDB4JTA4eCIsIHRlc3RfYWRkcixwYXR0ZXJuX29bdGVtcF9pXSwgcGF0dGVybl8zW3RlbXBfa11bdGVtcF9pXSk7CiAvL3ByaW50ZigiXG4weCUwOHgiLChwYXR0ZXJuX29bdGVtcF9pXSleKGRlc1t0ZW1wX2ldKSk7Ci8vIHByaW50ZigiXG4weCUwOHgiLHBhdHRlcm5fNlt0ZW1wX2tdW3RlbXBfaV0pOwoJaWYgKHBhdHRlcm5fb1t0ZW1wX2ldICE9IHBhdHRlcm5fNlt0ZW1wX2tdW3RlbXBfaV0pCgl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigicDZFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIHBhdHRlcm5fNlt0ZW1wX2tdW3RlbXBfaV0scGF0dGVybl8zW3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQl9CgkgIH0KCQkJfQoJCX0KCSBmb3IgKCh0ZW1wX2s9MCk7KHRlbXBfazw0KTsodGVtcF9rKyspKQoJIHsKewpkZHJfdWRlbGF5KDEwMDAwKTsKCQkgIGZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCXsKCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkqKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk9ZGVzX2ludl9wYXR0ZXJuKHRlbXBfaSwzLHRlbXBfayx0ZW1wX2kpOy8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXTsKCS8vCSNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIGRlc1thXV5wYXR0ZXJuXyMjYltjXVtkXQovL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0KCQl9CiAgIC8vICAgX2NsZWFuX2RjYWNoZV9hZGRyKDB4MTAwMDAwMDApOwogICAjaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkgIGZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwogICAjZW5kaWYKCSAgZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCXBhdHRlcm5fb1t0ZW1wX2ldPSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKTsKCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fM1t0ZW1wX2tdW3RlbXBfaV0pOwogLy9wcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwovLyBwcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzZbdGVtcF9rXVt0ZW1wX2ldKTsKCXBhdHRlcm5fZFt0ZW1wX2ldPWRlc194b3JfcGF0dGVybigoZGVzW3RlbXBfaV0pLChwYXR0ZXJuX29bdGVtcF9pXSkpOwoJCWlmICgoZGVzX3hvcl9wYXR0ZXJuKChkZXNbdGVtcF9pXSksKHBhdHRlcm5fb1t0ZW1wX2ldKSkpICE9IHBhdHRlcm5fZFt0ZW1wX2ldKQoJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoInA2IGludkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgfihwYXR0ZXJuXzZbdGVtcF9rXVt0ZW1wX2ldKSxwYXR0ZXJuX2RbdGVtcF9pXSk7CgkJCQkJCX0KCSAgfQoJCQl9CgkJfQoJCQl9CgoKCn0KCgkJICBwcmludGYoIlxFcnJvciBjb3VudD09MHglMDh4IiwgZXJyb3JfY291bnQpOwoJCSAgIHByaW50ZigiXG4gICAgICBcbiIpOwoJICB9d2hpbGUoLS1sb29wKTsKLy8qLwoKIHByaW50ZigiXHJFbmQgZGRyIHRlc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCgkgIHJldHVybiAwOwoKdXNhZ2U6CgljbWRfdXNhZ2UoY21kdHApOwoJcmV0dXJuIDE7CgkJCX0KCgpVX0JPT1RfQ01EKAoJZGRydGVzdF9neF9jcm9zc3RhbGssCTUsCTEsCWRvX2Rkcl9neF9jcm9zc3RhbGssCgkiRERSIHRlc3QgZnVuY3Rpb24iLAoJImRkcnRlc3QgW0xPT1BdIFtBRERSXS5EZWZhdWx0IGFkZHJlc3MgaXMgMHgxMDAwMDAwMFxuIgopOwoKCgovLyNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV9HWF9UVl9CQUJZKQppbnQgZG9fZGRyX2d4dHZiYl9jcm9zc3RhbGsoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7Ci8vLyoKCXVuc2lnbmVkIGludCAgYV9kZXNbOF0sYl9kZXNbOF0sZGVzWzhdIDsKIHVuc2lnbmVkIGludCAgcGF0dGVybl8xWzRdWzhdIDsKIHVuc2lnbmVkIGludCAgcGF0dGVybl8yWzRdWzhdIDsKIHVuc2lnbmVkIGludCAgcGF0dGVybl8zWzRdWzhdIDsKLy8gdW5zaWduZWQgaW50ICBwYXR0ZXJuXzRbNF1bOF0gOwovLyB1bnNpZ25lZCBpbnQgIHBhdHRlcm5fNVs0XVs4XSA7Ci8vICB1bnNpZ25lZCBpbnQgIHBhdHRlcm5fNls0XVs4XSA7CgoKICAgYV9kZXNbMF0gPSAgICAgIDB4N2VhMDliNTI7CiAgIGFfZGVzWzFdID0gICAgICAweGJjNTdiYjIzOwogICBhX2Rlc1syXSA9ICAgICAgMHg4ZDJiNmU2NTsKICAgYV9kZXNbM10gPSAgICAgIDB4MTVmZGNkYzQ7CiAgIGFfZGVzWzRdID0gICAgICAweGJjMWRmNDUzOwogICBhX2Rlc1s1XSA9ICAgICAgMHgyMWJjYmNkZjsKICAgYV9kZXNbNl0gPSAgICAgIDB4MjY3YjdhYzE7CiAgIGFfZGVzWzddID0gICAgICAweDZhZjAzZDcyOwoKCiAgIGJfZGVzWzBdID0gICAgICAweGRmYzJlZTEyOwogICBiX2Rlc1sxXSA9ICAgICAgMHg0ZjU4ZGE0MzsKICAgYl9kZXNbMl0gPSAgICAgIDB4ODc4MDk1NTc7CiAgIGJfZGVzWzNdID0gICAgICAweGI4N2RkYmY0OwogICBiX2Rlc1s0XSA9ICAgICAgMHg2NjdmYjAyMTsKICAgYl9kZXNbNV0gPSAgICAgIDB4NjQ1OTM1ODY7CiAgIGJfZGVzWzZdID0gICAgICAweGVlNzNkOGQ1OwogICBiX2Rlc1s3XSA9ICAgICAgMHhlNjVmOTcyZDsKCXBhdHRlcm5fMVswXVswXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbMF1bMV0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzBdWzJdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVswXVszXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbMF1bNF0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzBdWzVdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVswXVs2XSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbMF1bN10gPSAweGZmMDBmZjAwOwoKCXBhdHRlcm5fMVsxXVswXSA9IDB4MDBmZmZmMDA7CglwYXR0ZXJuXzFbMV1bMV0gPSAweDAwZmZmZjAwOwoJcGF0dGVybl8xWzFdWzJdID0gMHgwMGZmZmYwMDsKCXBhdHRlcm5fMVsxXVszXSA9IDB4MDBmZmZmMDA7CglwYXR0ZXJuXzFbMV1bNF0gPSAweDAwZmZmZjAwOwoJcGF0dGVybl8xWzFdWzVdID0gMHgwMGZmZmYwMDsKCXBhdHRlcm5fMVsxXVs2XSA9IDB4MDBmZmZmMDA7CglwYXR0ZXJuXzFbMV1bN10gPSAweDAwZmZmZjAwOwoKCXBhdHRlcm5fMVsyXVswXSA9IDB4ZmZmZjAwMDA7CglwYXR0ZXJuXzFbMl1bMV0gPSAweGZmZmYwMDAwOwoJcGF0dGVybl8xWzJdWzJdID0gMHhmZmZmMDAwMDsKCXBhdHRlcm5fMVsyXVszXSA9IDB4ZmZmZjAwMDA7CglwYXR0ZXJuXzFbMl1bNF0gPSAweGZmZmYwMDAwOwoJcGF0dGVybl8xWzJdWzVdID0gMHhmZmZmMDAwMDsKCXBhdHRlcm5fMVsyXVs2XSA9IDB4ZmZmZjAwMDA7CglwYXR0ZXJuXzFbMl1bN10gPSAweGZmZmYwMDAwOwoKCXBhdHRlcm5fMVszXVswXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbM11bMV0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzNdWzJdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVszXVszXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbM11bNF0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzNdWzVdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVszXVs2XSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbM11bN10gPSAweGZmMDBmZjAwOwoKCXBhdHRlcm5fMlswXVswXSA9IDB4MDAwMWZlMDA7CglwYXR0ZXJuXzJbMF1bMV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzBdWzJdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlswXVszXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMF1bNF0gPSAweDAwMDJmZDAwOwoJcGF0dGVybl8yWzBdWzVdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlswXVs2XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMF1bN10gPSAweDAwMDBmZjAwOwoKCXBhdHRlcm5fMlsxXVswXSA9IDB4MDAwNGZiMDA7CglwYXR0ZXJuXzJbMV1bMV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzFdWzJdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsxXVszXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMV1bNF0gPSAweDAwMDhmNzAwOwoJcGF0dGVybl8yWzFdWzVdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsxXVs2XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMV1bN10gPSAweDAwMDBmZjAwOwoKCXBhdHRlcm5fMlsyXVswXSA9IDB4MDAxMGVmMDA7CglwYXR0ZXJuXzJbMl1bMV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzJdWzJdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsyXVszXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMl1bNF0gPSAweDAwMjBkZjAwOwoJcGF0dGVybl8yWzJdWzVdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsyXVs2XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMl1bN10gPSAweDAwMDBmZjAwOwoKCXBhdHRlcm5fMlszXVswXSA9IDB4MDA0MGJmMDA7CglwYXR0ZXJuXzJbM11bMV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzNdWzJdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlszXVszXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbM11bNF0gPSAweDAwODA3ZjAwOwoJcGF0dGVybl8yWzNdWzVdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlszXVs2XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbM11bN10gPSAweDAwMDBmZjAwOwoKCXBhdHRlcm5fM1swXVswXSA9IDB4MDAwMTAwMDA7CglwYXR0ZXJuXzNbMF1bMV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzBdWzJdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1swXVszXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMF1bNF0gPSAweDAwMDIwMDAwOwoJcGF0dGVybl8zWzBdWzVdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1swXVs2XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMF1bN10gPSAweDAwMDAwMDAwOwoKCXBhdHRlcm5fM1sxXVswXSA9IDB4MDAwNDAwMDA7CglwYXR0ZXJuXzNbMV1bMV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzFdWzJdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1sxXVszXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMV1bNF0gPSAweDAwMDgwMDAwOwoJcGF0dGVybl8zWzFdWzVdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1sxXVs2XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMV1bN10gPSAweDAwMDAwMDAwOwoKCXBhdHRlcm5fM1syXVswXSA9IDB4MDAxMDAwMDA7CglwYXR0ZXJuXzNbMl1bMV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzJdWzJdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1syXVszXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMl1bNF0gPSAweDAwMjAwMDAwOwoJcGF0dGVybl8zWzJdWzVdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1syXVs2XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMl1bN10gPSAweDAwMDAwMDAwOwoKCXBhdHRlcm5fM1szXVswXSA9IDB4MDA0MDAwMDA7CglwYXR0ZXJuXzNbM11bMV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzNdWzJdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1szXVszXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbM11bNF0gPSAweDAwODAwMDAwOwoJcGF0dGVybl8zWzNdWzVdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1szXVs2XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbM11bN10gPSAweDAwMDAwMDAwOwoKLyoKcGF0dGVybl80WzBdWzBdID0JMHg1MWM4YzA0OQk7CnBhdHRlcm5fNFswXVsxXSA9CTB4MmQ0MzU5MmMJOwpwYXR0ZXJuXzRbMF1bMl0gPQkweDA3NzdiNTBiCTsKcGF0dGVybl80WzBdWzNdID0JMHg5Y2QyZWJlNQk7CnBhdHRlcm5fNFswXVs0XSA9CTB4YzA0MTk5ZDUJOwpwYXR0ZXJuXzRbMF1bNV0gPQkweGRjOTY4ZGMwCTsKcGF0dGVybl80WzBdWzZdID0JMHhiOGJhOGEzMwk7CnBhdHRlcm5fNFswXVs3XSA9CTB4MzVlNDMyN2YJOwoKcGF0dGVybl80WzFdWzBdID0JMHhhZTM3YzA0OQk7CnBhdHRlcm5fNFsxXVsxXSA9CTB4ZDJiYzU5MmMJOwpwYXR0ZXJuXzRbMV1bMl0gPQkweGY4ODhiNTBiCTsKcGF0dGVybl80WzFdWzNdID0JMHg2MzJkZWJlNQk7CnBhdHRlcm5fNFsxXVs0XSA9CTB4M2ZiZTk5ZDUJOwpwYXR0ZXJuXzRbMV1bNV0gPQkweDIzNjk4ZGMwCTsKcGF0dGVybl80WzFdWzZdID0JMHg0NzQ1OGEzMwk7CnBhdHRlcm5fNFsxXVs3XSA9CTB4Y2ExYjMyN2YJOwoKcGF0dGVybl80WzJdWzBdID0JMHg1MTM3M2Y0OQk7CnBhdHRlcm5fNFsyXVsxXSA9CTB4MmRiY2E2MmMJOwpwYXR0ZXJuXzRbMl1bMl0gPQkweDA3ODg0YTBiCTsKcGF0dGVybl80WzJdWzNdID0JMHg5YzJkMTRlNQk7CnBhdHRlcm5fNFsyXVs0XSA9CTB4YzBiZTY2ZDUJOwpwYXR0ZXJuXzRbMl1bNV0gPQkweGRjNjk3MmMwCTsKcGF0dGVybl80WzJdWzZdID0JMHhiODQ1NzUzMwk7CnBhdHRlcm5fNFsyXVs3XSA9CTB4MzUxYmNkN2YJOwoKCnBhdHRlcm5fNFszXVswXSA9CTB4NTFjOGMwNDkJOwpwYXR0ZXJuXzRbM11bMV0gPQkweDJkNDM1OTJjCTsKcGF0dGVybl80WzNdWzJdID0JMHgwNzc3YjUwYgk7CnBhdHRlcm5fNFszXVszXSA9CTB4OWNkMmViZTUJOwpwYXR0ZXJuXzRbM11bNF0gPQkweGMwNDE5OWQ1CTsKcGF0dGVybl80WzNdWzVdID0JMHhkYzk2OGRjMAk7CnBhdHRlcm5fNFszXVs2XSA9CTB4YjhiYThhMzMJOwpwYXR0ZXJuXzRbM11bN10gPQkweDM1ZTQzMjdmCTsKCnBhdHRlcm5fNVswXVswXSA9CTB4YWVjOWMxNDkJOwpwYXR0ZXJuXzVbMF1bMV0gPQkweGQyNDM1OTJjCTsKcGF0dGVybl81WzBdWzJdID0JMHhmODc3YjUwYgk7CnBhdHRlcm5fNVswXVszXSA9CTB4NjNkMmViZTUJOwpwYXR0ZXJuXzVbMF1bNF0gPQkweDNmNDM5YmQ1CTsKcGF0dGVybl81WzBdWzVdID0JMHgyMzk2OGRjMAk7CnBhdHRlcm5fNVswXVs2XSA9CTB4NDdiYThhMzMJOwpwYXR0ZXJuXzVbMF1bN10gPQkweGNhZTQzMjdmCTsKcGF0dGVybl81WzFdWzBdID0JMHhhZWNjYzQ0OQk7CnBhdHRlcm5fNVsxXVsxXSA9CTB4ZDI0MzU5MmMJOwpwYXR0ZXJuXzVbMV1bMl0gPQkweGY4NzdiNTBiCTsKcGF0dGVybl81WzFdWzNdID0JMHg2M2QyZWJlNQk7CnBhdHRlcm5fNVsxXVs0XSA9CTB4M2Y0OTkxZDUJOwpwYXR0ZXJuXzVbMV1bNV0gPQkweDIzOTY4ZGMwCTsKcGF0dGVybl81WzFdWzZdID0JMHg0N2JhOGEzMwk7CnBhdHRlcm5fNVsxXVs3XSA9CTB4Y2FlNDMyN2YJOwpwYXR0ZXJuXzVbMl1bMF0gPQkweGFlZDhkMDQ5CTsKcGF0dGVybl81WzJdWzFdID0JMHhkMjQzNTkyYwk7CnBhdHRlcm5fNVsyXVsyXSA9CTB4Zjg3N2I1MGIJOwpwYXR0ZXJuXzVbMl1bM10gPQkweDYzZDJlYmU1CTsKcGF0dGVybl81WzJdWzRdID0JMHgzZjYxYjlkNQk7CnBhdHRlcm5fNVsyXVs1XSA9CTB4MjM5NjhkYzAJOwpwYXR0ZXJuXzVbMl1bNl0gPQkweDQ3YmE4YTMzCTsKcGF0dGVybl81WzJdWzddID0JMHhjYWU0MzI3Zgk7CnBhdHRlcm5fNVszXVswXSA9CTB4YWU4ODgwNDkJOwpwYXR0ZXJuXzVbM11bMV0gPQkweGQyNDM1OTJjCTsKcGF0dGVybl81WzNdWzJdID0JMHhmODc3YjUwYgk7CnBhdHRlcm5fNVszXVszXSA9CTB4NjNkMmViZTUJOwpwYXR0ZXJuXzVbM11bNF0gPQkweDNmYzExOWQ1CTsKcGF0dGVybl81WzNdWzVdID0JMHgyMzk2OGRjMAk7CnBhdHRlcm5fNVszXVs2XSA9CTB4NDdiYThhMzMJOwpwYXR0ZXJuXzVbM11bN10gPQkweGNhZTQzMjdmCTsKCnBhdHRlcm5fNlswXVswXSA9ICAgMHhhZWM5M2Y0OSAgIDsKcGF0dGVybl82WzBdWzFdID0JMHhkMjQzYTYyYwk7CnBhdHRlcm5fNlswXVsyXSA9CTB4Zjg3NzRhMGIJOwpwYXR0ZXJuXzZbMF1bM10gPQkweDYzZDIxNGU1CTsKcGF0dGVybl82WzBdWzRdID0JMHgzZjQzNjZkNQk7CnBhdHRlcm5fNlswXVs1XSA9CTB4MjM5NjcyYzAJOwpwYXR0ZXJuXzZbMF1bNl0gPQkweDQ3YmE3NTMzCTsKcGF0dGVybl82WzBdWzddID0JMHhjYWU0Y2Q3Zgk7CnBhdHRlcm5fNlsxXVswXSA9CTB4YWVjYzNmNDkJOwpwYXR0ZXJuXzZbMV1bMV0gPQkweGQyNDNhNjJjCTsKcGF0dGVybl82WzFdWzJdID0JMHhmODc3NGEwYgk7CnBhdHRlcm5fNlsxXVszXSA9CTB4NjNkMjE0ZTUJOwpwYXR0ZXJuXzZbMV1bNF0gPQkweDNmNDk2NmQ1CTsKcGF0dGVybl82WzFdWzVdID0JMHgyMzk2NzJjMAk7CnBhdHRlcm5fNlsxXVs2XSA9CTB4NDdiYTc1MzMJOwpwYXR0ZXJuXzZbMV1bN10gPQkweGNhZTRjZDdmCTsKcGF0dGVybl82WzJdWzBdID0JMHhhZWQ4M2Y0OQk7CnBhdHRlcm5fNlsyXVsxXSA9CTB4ZDI0M2E2MmMJOwpwYXR0ZXJuXzZbMl1bMl0gPQkweGY4Nzc0YTBiCTsKcGF0dGVybl82WzJdWzNdID0JMHg2M2QyMTRlNQk7CnBhdHRlcm5fNlsyXVs0XSA9CTB4M2Y2MTY2ZDUJOwpwYXR0ZXJuXzZbMl1bNV0gPQkweDIzOTY3MmMwCTsKcGF0dGVybl82WzJdWzZdID0JMHg0N2JhNzUzMwk7CnBhdHRlcm5fNlsyXVs3XSA9CTB4Y2FlNGNkN2YJOwpwYXR0ZXJuXzZbM11bMF0gPQkweGFlODgzZjQ5CTsKcGF0dGVybl82WzNdWzFdID0JMHhkMjQzYTYyYwk7CnBhdHRlcm5fNlszXVsyXSA9CTB4Zjg3NzRhMGIJOwpwYXR0ZXJuXzZbM11bM10gPQkweDYzZDIxNGU1CTsKcGF0dGVybl82WzNdWzRdID0JMHgzZmMxNjZkNQk7CnBhdHRlcm5fNlszXVs1XSA9CTB4MjM5NjcyYzAJOwpwYXR0ZXJuXzZbM11bNl0gPQkweDQ3YmE3NTMzCTsKcGF0dGVybl82WzNdWzddID0JMHhjYWU0Y2Q3Zgk7CiovCi8vKi8KCiBjaGFyICplbmRwOwoJIHVuc2lnbmVkIGludCAgIGxvb3AgPSAxOwoJIHVuc2lnbmVkIGludCAgIGxmbGFnID0gMDsKCSB1bnNpZ25lZCBpbnQgIHN0YXJ0X2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSOwoJICAgICAgdW5zaWduZWQgaW50ICB0ZXN0X3NpemUgPSBERFJfVEVTVF9TSVpFOwoJCSAgdW5zaWduZWQgaW50ICAgdGVzdF9hZGRyOwoKCQkgICBlcnJvcl9vdXRvZl9jb3VudF9mbGFnID0wOwoJCSBlcnJvcl9jb3VudCA9MDsKCgkJICAgcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJCQlpbnQgaSA7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgkJewoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoJCX0KaWYgKGFyZ2MgPT0gMSkKIGdvdG8gdXNhZ2U7CmlmIChhcmdjPjEpCnsKICAgIGlmIChzdHJjbXAoYXJndlsxXSwgImwiKSA9PSAwKSB7CgkJbGZsYWcgPSAxOwoJfQoKCWVsc2V7CgkJbG9vcCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sICZlbmRwLCAxMCk7CiAgICAgICAgaWYgKCphcmd2WzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJbG9vcCA9IDE7Cgl9CgoJCS8vICAgIHByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CgkJICAgIGlmIChhcmdjID09MSkgewoJLy8gICAgc3RhcnRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sICZlbmRwLCAxNik7CgkvLyAgICBpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUjsKCSAgbG9vcCA9IDE7CgoJfQp9CgoKCiAgICBpZiAoYXJnYyA+PSAyKSB7CgkJbG9vcCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sICZlbmRwLCAxNik7CiAgICAgICAgaWYgKCphcmd2WzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJbG9vcCA9IDE7CgoJfQoJdW5zaWduZWQgaW50IHBhdHRlcm5fZmxhZzE9MTsKCXVuc2lnbmVkIGludCBwYXR0ZXJuX2ZsYWcyPTE7Cgl1bnNpZ25lZCBpbnQgcGF0dGVybl9mbGFnMz0xOwoJICAgICAgIHBhdHRlcm5fZmxhZzEgPSAxOwoJCXBhdHRlcm5fZmxhZzI9MTsKCQkgcGF0dGVybl9mbGFnMyA9IDE7CgoKCSBpZiAoYXJnYyA+PSAzICApIHsKICAgIGlmICggKHN0cmNtcChhcmd2WzJdLCAicyIpID09IDApKQoJCXsKCQlwYXR0ZXJuX2ZsYWcxID0gMTsKCQlwYXR0ZXJuX2ZsYWcyPTA7CgkJIHBhdHRlcm5fZmxhZzMgPSAwOwoJfQogZWxzZSBpZiAoKHN0cmNtcChhcmd2WzJdLCAiYyIpID09IDApKQoJCXsKCQlwYXR0ZXJuX2ZsYWcxID0gMDsKCQlwYXR0ZXJuX2ZsYWcyPTE7CgkJIHBhdHRlcm5fZmxhZzMgPSAwOwoJfQplbHNlICBpZiAoIChzdHJjbXAoYXJndlsyXSwgImQiKSA9PSAwKSkKCXsKCQkgIHBhdHRlcm5fZmxhZzEgPSAwOwoJCXBhdHRlcm5fZmxhZzI9MDsKCQkgcGF0dGVybl9mbGFnMyA9IDE7Cgl9Cgl9CgoJLy8JaWYodGVzdF9zaXplPDB4MjApCglzdGFydF9hZGRyPTB4MTAwMDAwMDA7CgkJCXRlc3Rfc2l6ZSA9IDB4MjA7CnVuc2lnbmVkIGludCB0ZW1wX2k9MDsKdW5zaWduZWQgaW50IHRlbXBfaz0wOwp1bnNpZ25lZCBpbnQgcGF0dGVybl9vWzhdOwp1bnNpZ25lZCBpbnQgcGF0dGVybl9kWzhdOwovL3Vuc2lnbmVkIGludCBpPTA7CgogcHJpbnRmKCJcbmxvb3Agc2hvdWxkID4yIGFuZCBub3cgbG9vcD09IDB4JTA4eFxuIiwgbG9vcCk7Ci8vRERSX1RFU1RfU1RBUlQ6CgovLy8qCgplcnJvcl9jb3VudD0wOwoJZG8gewogICAgICAgIGlmIChsZmxhZykKCQkJbG9vcCA9IDg4ODsKaWYgKGxvb3AlMikKewoJCXN0YXJ0X2FkZHI9MHgxMDAwMDAwMDsKCQkJdGVzdF9zaXplID0gMHgyMDsKCQkJZm9yICgoaT0wKTsoaTw4KTsoaSsrKSkKCQkJCXsKCQkJZGVzW2ldPSAgYV9kZXNbaV07CgkJCQl9Cn0KZWxzZQp7CgkJc3RhcnRfYWRkcj0weDEwMDAwNDAwOwoJCQl0ZXN0X3NpemUgPSAweDIwOwoJCQkJZm9yICgoaT0wKTsoaTw4KTsoaSsrKSkKCQkJCXsKCQkJZGVzW2ldPSAgYl9kZXNbaV07CgkJCQl9Cn0KCQkvL2lmKG9sZF9wYXR0ZXJuX2ZsYWc9PTEpCgkJCXsKCgkJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uXG4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKCi8qCgkgZm9yICgodGVtcF9rPTApOyh0ZW1wX2s8NCk7KHRlbXBfaysrKSkgewp7CgoJCSAgZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkKCQkJewoJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKT1kZXNfcGF0dGVybih0ZW1wX2ksMix0ZW1wX2ssdGVtcF9pKTsvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV07CgkvLwkjZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICBkZXNbYV1ecGF0dGVybl8jI2JbY11bZF0KLy9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldCgkJfQogICAvLyAgIF9jbGVhbl9kY2FjaGVfYWRkcigweDEwMDAwMDAwKTsKCSAgZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0X2FkZHIsc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CgoJICBmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKSB7CgkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJcGF0dGVybl9vW3RlbXBfaV09Kih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpOwoJLy8JIHByaW50ZigiXG4gdGVzdF9hZGRyIHBhdHRlcm5fbyBwYXR0ZXJuX2QgIDB4JTA4eCAtIDB4JTA4eCAtIDB4JTA4eCIsIHRlc3RfYWRkcixwYXR0ZXJuX29bdGVtcF9pXSwgcGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXSk7CiAvL3ByaW50ZigiXG4weCUwOHgiLChwYXR0ZXJuX29bdGVtcF9pXSleKGRlc1t0ZW1wX2ldKSk7CiAvL3ByaW50ZigiXG4weCUwOHgiLHBhdHRlcm5fNVt0ZW1wX2tdW3RlbXBfaV0pOwoJaWYgKHBhdHRlcm5fb1t0ZW1wX2ldICE9IHBhdHRlcm5fNVt0ZW1wX2tdW3RlbXBfaV0pCgl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigicDVFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIHBhdHRlcm5fNVt0ZW1wX2tdW3RlbXBfaV0scGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQl9CgkgIH0KCQkJfQoJCX0KKi8KCQlpZiAocGF0dGVybl9mbGFnMSA9PSAxKSB7CgkJICBmb3IgKCh0ZW1wX2s9MCk7KHRlbXBfazw0KTsodGVtcF9rKyspKQoJCQl7CnsKZGRyX3VkZWxheSgxMDAwMCk7CgkJICBmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKQoJCQl7CgkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJKih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpPWRlc19wYXR0ZXJuKHRlbXBfaSwxLHRlbXBfayx0ZW1wX2kpOy8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXTsKCS8vCSNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIGRlc1thXV5wYXR0ZXJuXyMjYltjXVtkXQovL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0KCQl9CiAgIC8vICAgX2NsZWFuX2RjYWNoZV9hZGRyKDB4MTAwMDAwMDApOwojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkgIGZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwogICNlbmRpZgoJICBmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKSB7CgkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJcGF0dGVybl9vW3RlbXBfaV09Kih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpOwoJLy8JIHByaW50ZigiXG4gdGVzdF9hZGRyIHBhdHRlcm5fbyBwYXR0ZXJuX2QgIDB4JTA4eCAtIDB4JTA4eCAtIDB4JTA4eCIsIHRlc3RfYWRkcixwYXR0ZXJuX29bdGVtcF9pXSwgcGF0dGVybl8xW3RlbXBfa11bdGVtcF9pXSk7CgkJLy8gIHByaW50ZigiXG4weCUwOHgiLChwYXR0ZXJuX29bdGVtcF9pXSleKGRlc1t0ZW1wX2ldKSk7CgkvLwkgIHByaW50ZigiXG4weCUwOHgiLHBhdHRlcm5fNFt0ZW1wX2tdW3RlbXBfaV0pOwovLwlpZihwYXR0ZXJuX29bdGVtcF9pXSE9cGF0dGVybl80W3RlbXBfa11bdGVtcF9pXSkKaWYgKChwYXR0ZXJuX29bdGVtcF9pXSkgIT0gKGRlc19wYXR0ZXJuKHRlbXBfaSwxLHRlbXBfayx0ZW1wX2kpKSkKCXtlcnJvcl9jb3VudCsrOwoJCQkvLyAgICAgICAgICAgICAgICBwcmludGYoInA0RXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF0tRDB4JTA4eFxuIixwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCBwYXR0ZXJuXzRbdGVtcF9rXVt0ZW1wX2ldLHBhdHRlcm5fMVt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCSAgcHJpbnRmKCJwNEVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgZGVzX3BhdHRlcm4odGVtcF9pLDEsdGVtcF9rLHRlbXBfaSkscGF0dGVybl8xW3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQl9CgoJCX0KCQkJfQoJCX0KCQkgIGZvciAoKHRlbXBfaz0wKTsodGVtcF9rPDQpOyh0ZW1wX2srKykpCgkJICB7CnsKZGRyX3VkZWxheSgxMDAwMCk7CgkJICBmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKQoJCQl7CgkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJKih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpPWRlc19pbnZfcGF0dGVybih0ZW1wX2ksMSx0ZW1wX2ssdGVtcF9pKTsvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV07CgkvLwkjZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICBkZXNbYV1ecGF0dGVybl8jI2JbY11bZF0KLy9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldCgkJfQogICAvLyAgIF9jbGVhbl9kY2FjaGVfYWRkcigweDEwMDAwMDAwKTsKICAgI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJICBmbHVzaF9kY2FjaGVfcmFuZ2Uoc3RhcnRfYWRkcixzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKICAgI2VuZGlmCgkgIGZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpIHsKCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQlwYXR0ZXJuX29bdGVtcF9pXT0qKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk7CgkvLwkgcHJpbnRmKCJcbiB0ZXN0X2FkZHIgcGF0dGVybl9vIHBhdHRlcm5fZCAgMHglMDh4IC0gMHglMDh4IC0gMHglMDh4IiwgdGVzdF9hZGRyLHBhdHRlcm5fb1t0ZW1wX2ldLCBwYXR0ZXJuXzFbdGVtcF9rXVt0ZW1wX2ldKTsKCQkvLyAgcHJpbnRmKCJcbjB4JTA4eCIsKHBhdHRlcm5fb1t0ZW1wX2ldKV4oZGVzW3RlbXBfaV0pKTsKCS8vCSAgcHJpbnRmKCJcbjB4JTA4eCIscGF0dGVybl80W3RlbXBfa11bdGVtcF9pXSk7CglwYXR0ZXJuX2RbdGVtcF9pXT1kZXNfeG9yX3BhdHRlcm4oKGRlc1t0ZW1wX2ldKSwocGF0dGVybl9vW3RlbXBfaV0pKTsKCWlmICgoZGVzX3hvcl9wYXR0ZXJuKChkZXNbdGVtcF9pXSksKHBhdHRlcm5fb1t0ZW1wX2ldKSkpICE9IHBhdHRlcm5fZFt0ZW1wX2ldKQoJe2Vycm9yX2NvdW50Kys7CgkgICAvLyAgICAgICAgICAgICAgICAgICAgIHByaW50ZigicDQgaW52RXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF0tRDB4JTA4eFxuIixwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCB+KHBhdHRlcm5fNFt0ZW1wX2tdW3RlbXBfaV0pLHBhdHRlcm5fZFt0ZW1wX2ldKTsKCQkJCQkJCSBwcmludGYoInA0IGludkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgfihkZXNfcGF0dGVybih0ZW1wX2ksMSx0ZW1wX2ssdGVtcF9pKSkscGF0dGVybl9kW3RlbXBfaV0pOwoJCQkJCQl9CgoJCX0KCQkJfQoJCX0KCQkgIH0KCQlpZiAocGF0dGVybl9mbGFnMiA9PSAxKSB7CgkgZm9yICgodGVtcF9rPTApOyh0ZW1wX2s8NCk7KHRlbXBfaysrKSkgewp7CmRkcl91ZGVsYXkoMTAwMDApOwoJCSAgZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkKCQkJewoJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKT1kZXNfcGF0dGVybih0ZW1wX2ksMix0ZW1wX2ssdGVtcF9pKTsvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV07CgkvLwkjZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICBkZXNbYV1ecGF0dGVybl8jI2JbY11bZF0KLy9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldCgkJfQogICAvLyAgIF9jbGVhbl9kY2FjaGVfYWRkcigweDEwMDAwMDAwKTsKICAgI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJICBmbHVzaF9kY2FjaGVfcmFuZ2Uoc3RhcnRfYWRkcixzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKICAgI2VuZGlmCgkgIGZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpIHsKCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQlwYXR0ZXJuX29bdGVtcF9pXT0qKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk7CgkvLwkgcHJpbnRmKCJcbiB0ZXN0X2FkZHIgcGF0dGVybl9vIHBhdHRlcm5fZCAgMHglMDh4IC0gMHglMDh4IC0gMHglMDh4IiwgdGVzdF9hZGRyLHBhdHRlcm5fb1t0ZW1wX2ldLCBwYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldKTsKIC8vcHJpbnRmKCJcbjB4JTA4eCIsKHBhdHRlcm5fb1t0ZW1wX2ldKV4oZGVzW3RlbXBfaV0pKTsKIC8vcHJpbnRmKCJcbjB4JTA4eCIscGF0dGVybl81W3RlbXBfa11bdGVtcF9pXSk7CiAvLwlpZihwYXR0ZXJuX29bdGVtcF9pXSE9cGF0dGVybl81W3RlbXBfa11bdGVtcF9pXSkKCQlpZiAoKHBhdHRlcm5fb1t0ZW1wX2ldKSAhPSAoZGVzX3BhdHRlcm4odGVtcF9pLDIsdGVtcF9rLHRlbXBfaSkpKQoJe2Vycm9yX2NvdW50Kys7CgkJCQkgLy8gICAgICAgICAgIHByaW50ZigicDVFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIHBhdHRlcm5fNVt0ZW1wX2tdW3RlbXBfaV0scGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCSAgIHByaW50ZigicDVFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIGRlc19wYXR0ZXJuKHRlbXBfaSwyLHRlbXBfayx0ZW1wX2kpLHBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJfQoJICB9CgkJCX0KCQl9CgkgIGZvciAoKHRlbXBfaz0wKTsodGVtcF9rPDQpOyh0ZW1wX2srKykpCnsKewpkZHJfdWRlbGF5KDEwMDAwKTsKCQkgIGZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCXsKCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkqKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk9ZGVzX2ludl9wYXR0ZXJuKHRlbXBfaSwyLHRlbXBfayx0ZW1wX2kpOy8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXTsKCS8vCSNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIGRlc1thXV5wYXR0ZXJuXyMjYltjXVtkXQovL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0KCQl9CiAgIC8vICAgX2NsZWFuX2RjYWNoZV9hZGRyKDB4MTAwMDAwMDApOwogICAjaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkgIGZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwogICAjZW5kaWYKCSAgZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCXBhdHRlcm5fb1t0ZW1wX2ldPSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKTsKCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0pOwogLy9wcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwogLy9wcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldKTsKCXBhdHRlcm5fZFt0ZW1wX2ldPWRlc194b3JfcGF0dGVybigoZGVzW3RlbXBfaV0pLChwYXR0ZXJuX29bdGVtcF9pXSkpOwoJCWlmICgoZGVzX3hvcl9wYXR0ZXJuKChkZXNbdGVtcF9pXSksKHBhdHRlcm5fb1t0ZW1wX2ldKSkpICE9IHBhdHRlcm5fZFt0ZW1wX2ldKQoJe2Vycm9yX2NvdW50Kys7CgkJCQkgIC8vICAgICAgICAgIHByaW50ZigicDUgaW52RXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF0tRDB4JTA4eFxuIixwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCB+KHBhdHRlcm5fNVt0ZW1wX2tdW3RlbXBfaV0pLHBhdHRlcm5fZFt0ZW1wX2ldKTsKCQkJCQlwcmludGYoInA1IGludkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgfihkZXNfaW52X3BhdHRlcm4odGVtcF9pLDIsdGVtcF9rLHRlbXBfaSkpLHBhdHRlcm5fZFt0ZW1wX2ldKTsKCQkJCQkJCQl9CgkgIH0KCQkJfQoJCX0KCgkJCX0KCgkJaWYgKHBhdHRlcm5fZmxhZzMgPT0gMSkgewoJZm9yICgodGVtcF9rPTApOyh0ZW1wX2s8NCk7KHRlbXBfaysrKSkgewp7CmRkcl91ZGVsYXkoMTAwMDApOwoJCSAgZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkKCQkJewoJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKT1kZXNfcGF0dGVybih0ZW1wX2ksMyx0ZW1wX2ssdGVtcF9pKTsvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV07CgkvLwkjZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICBkZXNbYV1ecGF0dGVybl8jI2JbY11bZF0KLy9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldCgkJfQogICAvLyAgIF9jbGVhbl9kY2FjaGVfYWRkcigweDEwMDAwMDAwKTsKICAgI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJICBmbHVzaF9kY2FjaGVfcmFuZ2Uoc3RhcnRfYWRkcixzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKICAgI2VuZGlmCgkgIGZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpIHsKCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQlwYXR0ZXJuX29bdGVtcF9pXT0qKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk7CgkvLwkgcHJpbnRmKCJcbiB0ZXN0X2FkZHIgcGF0dGVybl9vIHBhdHRlcm5fZCAgMHglMDh4IC0gMHglMDh4IC0gMHglMDh4IiwgdGVzdF9hZGRyLHBhdHRlcm5fb1t0ZW1wX2ldLCBwYXR0ZXJuXzNbdGVtcF9rXVt0ZW1wX2ldKTsKIC8vcHJpbnRmKCJcbjB4JTA4eCIsKHBhdHRlcm5fb1t0ZW1wX2ldKV4oZGVzW3RlbXBfaV0pKTsKLy8gcHJpbnRmKCJcbjB4JTA4eCIscGF0dGVybl82W3RlbXBfa11bdGVtcF9pXSk7CgkvL2lmKHBhdHRlcm5fb1t0ZW1wX2ldIT1wYXR0ZXJuXzZbdGVtcF9rXVt0ZW1wX2ldKQoJCWlmICgocGF0dGVybl9vW3RlbXBfaV0pICE9IChkZXNfcGF0dGVybih0ZW1wX2ksMyx0ZW1wX2ssdGVtcF9pKSkpCgl7ZXJyb3JfY291bnQrKzsKCQkJCQkgLy8gICAgICAgcHJpbnRmKCJwNkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgcGF0dGVybl82W3RlbXBfa11bdGVtcF9pXSxwYXR0ZXJuXzNbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCSBwcmludGYoInA2RXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF0tRDB4JTA4eFxuIixwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCBkZXNfcGF0dGVybih0ZW1wX2ksMyx0ZW1wX2ssdGVtcF9pKSxwYXR0ZXJuXzNbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCX0KCSAgfQoJCQl9CgkJfQoJIGZvciAoKHRlbXBfaz0wKTsodGVtcF9rPDQpOyh0ZW1wX2srKykpCgkgewp7CmRkcl91ZGVsYXkoMTAwMDApOwoJCSAgZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkKCQkJewoJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKT1kZXNfaW52X3BhdHRlcm4odGVtcF9pLDMsdGVtcF9rLHRlbXBfaSk7Ly9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldOwoJLy8JI2RlZmluZSBkZXNfcGF0dGVybihhLGIsYyxkKSAgZGVzW2FdXnBhdHRlcm5fIyNiW2NdW2RdCi8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXQoJCX0KICAgLy8gICBfY2xlYW5fZGNhY2hlX2FkZHIoMHgxMDAwMDAwMCk7CiAgICNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCSAgZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0X2FkZHIsc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CiAgICNlbmRpZgoJICBmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKSB7CgkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJcGF0dGVybl9vW3RlbXBfaV09Kih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpOwoJLy8JIHByaW50ZigiXG4gdGVzdF9hZGRyIHBhdHRlcm5fbyBwYXR0ZXJuX2QgIDB4JTA4eCAtIDB4JTA4eCAtIDB4JTA4eCIsIHRlc3RfYWRkcixwYXR0ZXJuX29bdGVtcF9pXSwgcGF0dGVybl8zW3RlbXBfa11bdGVtcF9pXSk7CiAvL3ByaW50ZigiXG4weCUwOHgiLChwYXR0ZXJuX29bdGVtcF9pXSleKGRlc1t0ZW1wX2ldKSk7Ci8vIHByaW50ZigiXG4weCUwOHgiLHBhdHRlcm5fNlt0ZW1wX2tdW3RlbXBfaV0pOwoJcGF0dGVybl9kW3RlbXBfaV09ZGVzX3hvcl9wYXR0ZXJuKChkZXNbdGVtcF9pXSksKHBhdHRlcm5fb1t0ZW1wX2ldKSk7CgkJaWYgKChkZXNfeG9yX3BhdHRlcm4oKGRlc1t0ZW1wX2ldKSwocGF0dGVybl9vW3RlbXBfaV0pKSkgIT0gcGF0dGVybl9kW3RlbXBfaV0pCgl7ZXJyb3JfY291bnQrKzsKCQkJCQkgLy8gICAgICAgcHJpbnRmKCJwNiBpbnZFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIH4ocGF0dGVybl82W3RlbXBfa11bdGVtcF9pXSkscGF0dGVybl9kW3RlbXBfaV0pOwoJCQkJCQkgcHJpbnRmKCJwNiBpbnZFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIH4oZGVzX2ludl9wYXR0ZXJuKHRlbXBfaSwzLHRlbXBfayx0ZW1wX2kpKSxwYXR0ZXJuX2RbdGVtcF9pXSk7CgkJCQkJCQl9CgkgIH0KCQkJfQoJCX0KCQkJfQoKCgp9CgoJCSAgcHJpbnRmKCJcRXJyb3IgY291bnQ9PTB4JTA4eCIsIGVycm9yX2NvdW50KTsKCQkgICBwcmludGYoIlxuICAgICAgXG4iKTsKCSAgfXdoaWxlKC0tbG9vcCk7Ci8vKi8KCiBwcmludGYoIlxyRW5kIGRkciB0ZXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgoJICByZXR1cm4gMDsKCnVzYWdlOgoJY21kX3VzYWdlKGNtZHRwKTsKCXJldHVybiAxOwoJCQl9CgoKVV9CT09UX0NNRCgKCWRkcnRlc3RfZ3h0dmJiX2Nyb3NzdGFsaywJNSwJMSwJZG9fZGRyX2d4dHZiYl9jcm9zc3RhbGssCgkiRERSIHRlc3QgZnVuY3Rpb24iLAoJImRkcnRlc3QgW0xPT1BdIFtBRERSXS5EZWZhdWx0IGFkZHJlc3MgaXMgMHgxMDAwMDAwMFxuIgopOwoKaW50IGRvX2RkcnRlc3RfZmluZF9nYXRlX3dpbmQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CiAgIHByaW50ZigiXG5FbnRlciBUdW5lIGRkciBkcXMgZnVuY3Rpb25cbiIpOwogLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwogIHByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKIC8vICB1bnNpZ25lZCBpbnQgICBsb29wID0gMTsKICAgdW5zaWduZWQgaW50ICAgdGVtcF9jb3VudF9pID0gMTsKLy8gICB1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2o9IDE7Ci8vICAgIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaz0gMTsKICAgdW5zaWduZWQgaW50ICAgdGVtcF90ZXN0X2Vycm9yPSAwOwoKCgkgY2hhciAqZW5kcDsKIC8vICB1bnNpZ25lZCBpbnQgICAqcF9zdGFydF9hZGRyOwogIHVuc2lnbmVkIGludCAgIHRlc3RfbG9vcD0xOwogICB1bnNpZ25lZCBpbnQgICB0ZXN0X3RpbWVzPTE7CiAgIHVuc2lnbmVkIGludCAgIHJlZ19hZGQ9MDsKICAgdW5zaWduZWQgaW50ICAgcmVnX2Jhc2VfYWRqPTA7CgkJICB1bnNpZ25lZCBpbnQgICBjaGFubmVsX2FfZW4gPSAwOwoJICAgdW5zaWduZWQgaW50ICAgY2hhbm5lbF9iX2VuID0gMDsKCSAgIHVuc2lnbmVkIGludCAgIHRlc3RpbmdfY2hhbm5lbCA9IDA7CgoJLy8gLyoKCS8vICNkZWZpbmUgIERBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIICAxMgoKCSAjZGVmaW5lICBEQVRYOF9EUV9MQU5FX1dJRFRIICA0CgkgI2RlZmluZSAgQ0hBTk5FTF9DSEFOTkVMX1dJRFRIICAyCgoJICAjZGVmaW5lICBDSEFOTkVMX0EgIDAKCSAgI2RlZmluZSAgQ0hBTk5FTF9CICAxCgoKCgkjZGVmaW5lICBEQVRYOF9EUV9MQU5FX0xBTkUwMCAgMAoJI2RlZmluZSAgREFUWDhfRFFfTEFORV9MQU5FMDEgIDEKCSNkZWZpbmUgIERBVFg4X0RRX0xBTkVfTEFORTAyICAyCgkjZGVmaW5lICBEQVRYOF9EUV9MQU5FX0xBTkUwMyAgMwoKCSAjZGVmaW5lICBEQVRYOF9EUV9CRExSMCAgMAoJICNkZWZpbmUgIERBVFg4X0RRX0JETFIxICAxCgkgI2RlZmluZSAgREFUWDhfRFFfQkRMUjIgIDIKCSAjZGVmaW5lICBEQVRYOF9EUV9CRExSMyAgMwoJICNkZWZpbmUgIERBVFg4X0RRX0JETFI0ICA0CgkgI2RlZmluZSAgREFUWDhfRFFfQkRMUjUgIDUKCSAjZGVmaW5lICBEQVRYOF9EUV9CRExSNiAgNgoJICNkZWZpbmUgIERBVFg4X0RRX0RYTkxDRExSMCAgICAgNwoJICNkZWZpbmUgIERBVFg4X0RRX0RYTkxDRExSMSAgICAgOAoJICNkZWZpbmUgIERBVFg4X0RRX0RYTkxDRExSMiAgICAgOQoJICNkZWZpbmUgIERBVFg4X0RRX0RYTk1ETFIgICAgICAgIDEwCgkgI2RlZmluZSAgREFUWDhfRFFfRFhOR1RSICAgICAgICAgIDExCgoKCSAjZGVmaW5lICBERFJfQ09SU1NfVEFMS19URVNUX1NJWkUgICAweDIwMDAwCgoJLy8gI2RlZmluZSAgRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMICA1Ly9EQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCpEQVRYOF9EUV9MQU5FX1dJRFRICgkvLyAgICAjZGVmaW5lICBEUV9MQ0RfQkRMX1JFR19OVU0gICAgRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMKkNIQU5ORUxfQ0hBTk5FTF9XSURUSAovLyovCgoKCS8vICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19vcmdbRFFfTENEX0JETF9SRUdfTlVNXTsKCS8vICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19sZWZ0W0RRX0xDRF9CRExfUkVHX05VTV07CgkvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfcmlnaHRbRFFfTENEX0JETF9SRUdfTlVNXTsKCSAvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfaW5kZXhbRFFfTENEX0JETF9SRUdfTlVNXTsKCgkvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfbGVmdF9taW5bRFFfTENEX0JETF9SRUdfTlVNXTsKCS8vICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19yaWdodF9taW5bRFFfTENEX0JETF9SRUdfTlVNXTsKCgkgICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoJLy8gICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX21pbjsKCS8vICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX21heDsKCS8vICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDsKCSAgLy8gIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc25kOwoJLy8gICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWU7CgkvLyAgICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlOwoJLy8gICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxczsKCS8vICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ7CgkvLyAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q7CgoJLy8gICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZjsKCS8vICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWc7CgkvLyAgICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX2NlbnRlcjsKCS8vICAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfd2luZG93czsKCS8vICAgICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19jZW50ZXJfbWluOwoJLy8gICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ193aW5kb3dzX21pbjsKCgkJIHVuc2lnbmVkIGludCAgIGRxZ3RyX29yZ1s0XSxkcWxjZGxyMl9vcmdbNF0sZHFndHJfbFs0XSxkcWxjZGxyMl9sWzRdLGRxZ3RyX3JbNF0sZHFsY2RscjJfcls0XSxkcW1kbHJbNF07CgkgdW5zaWduZWQgaW50IGRxZ3RyX3RlbXA7CgkgIHVuc2lnbmVkIGludCBkcWxjZGxyMl90ZW1wOwoJICB1bnNpZ25lZCBpbnQgZHFxc2dhdGVfb3JnWzRdLGRxcXNnYXRlX2xbNF0sIGRxcXNnYXRlX3JbNF07CgkgICAgdW5zaWduZWQgaW50ICAgZGRyX2dhdGVfdXBfZG93bj0wOwoJCSB1bnNpZ25lZCBpbnQgICBkZHJfZ2F0ZV9pbml0X2xhbmU9MDsKCgkgICAgdW5zaWduZWQgaW50ICAgZGRyX3Rlc3Rfc2l6ZT0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoKCgoJIGlmIChhcmdjID09IDIpCgkJewogICAgaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkpCgoJe2NoYW5uZWxfYV9lbiA9IDE7Cgl9CgllbHNlIGlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApKQoKCXtjaGFubmVsX2JfZW4gPSAxOwoJfQoJZWxzZQoJCXsKCWdvdG8gdXNhZ2U7CgkJfQoJCX0KCQlpZiAoYXJnYyA+IDIpCgkJewogICAgaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkEiKSA9PSAwKSkKCgl7Y2hhbm5lbF9hX2VuID0gMTsKCX0KICAgICBpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJCIikgPT0gMCkpCgoJe2NoYW5uZWxfYl9lbiA9IDE7Cgl9CgkJCX0KCQkgICBkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwogIGlmIChhcmdjID4zKSB7CglkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgJmVuZHAsIDE2KTsKICAgICAgICBpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJCX0KCgl9CiAgICBpZiAoYXJnYyA+NCkgewoJdGVzdF9sb29wID0gc2ltcGxlX3N0cnRvdWwoYXJndls0XSwgJmVuZHAsIDE2KTsKICAgICAgICBpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCXRlc3RfbG9vcCA9IDE7CgkJCX0KCQkgaWYgICAoKHN0cmNtcChhcmd2WzRdLCAibCIpID09IDApIHx8IChzdHJjbXAoYXJndls0XSwgIkwiKSA9PSAwKSkKCQkJewoJCQl0ZXN0X2xvb3AgPSAxMDAwMDA7CgkJCX0KCX0KCgoJCSAgICAgaWYgKGFyZ2MgPjUpIHsKCWRkcl9nYXRlX3VwX2Rvd24gPSBzaW1wbGVfc3RydG91bChhcmd2WzVdLCAmZW5kcCwgMTYpOwogICAgICAgIGlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJZGRyX2dhdGVfdXBfZG93biA9IDA7CgkJCX0KCQkgaWYgICAoKHN0cmNtcChhcmd2WzVdLCAibCIpID09IDApIHx8IChzdHJjbXAoYXJndls1XSwgIkwiKSA9PSAwKSkKCQkJewoJCQlkZHJfZ2F0ZV91cF9kb3duID0gMDAwMDA7CgkJCX0KCX0KCQkJCQkJaWYgKGFyZ2MgPjYpIHsKCWRkcl9nYXRlX2luaXRfbGFuZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNl0sICZlbmRwLCAxNik7CiAgICAgICAgaWYgKCphcmd2WzZdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQlkZHJfZ2F0ZV9pbml0X2xhbmUgPSAwOwoJCQl9CgkJIGlmICAgKChzdHJjbXAoYXJndls2XSwgImwiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbNl0sICJMIikgPT0gMCkpCgkJCXsKCQkJZGRyX2dhdGVfaW5pdF9sYW5lID0gMDAwMDA7CgkJCX0KCX0KCgoJCSBwcmludGYoIlxuY2hhbm5lbF9hX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2FfZW4pOwoJCSBwcmludGYoIlxuY2hhbm5lbF9iX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2JfZW4pOwoJCSAgcHJpbnRmKCJcbmRkcl90ZXN0X3NpemU9PSAweCUwOHhcbiIsIGRkcl90ZXN0X3NpemUpOwoJCSAgIHByaW50ZigiXG50ZXN0X2xvb3A9PSAweCUwOHhcbiIsIHRlc3RfbG9vcCk7CgkJICAgcHJpbnRmKCJcbmRkcl9nYXRlX3VwX2Rvd249PSAweCUwOHhcbiIsIGRkcl9nYXRlX3VwX2Rvd24pOwoJCSAgIHByaW50ZigiXG5kZHJfZ2F0ZV9pbml0X2xhbmU9PSAweCUwOHhcbiIsIGRkcl9nYXRlX2luaXRfbGFuZSk7CmlmICggY2hhbm5lbF9hX2VuKQp7Ci8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7Ck9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKTsKfQppZiAoIGNoYW5uZWxfYl9lbikKewpPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCk7Ci8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7Cn0KCgovL3NhdmUgYW5kIHByaW50IG9yZyB0cmFpbmluZyBkcXMgdmFsdWUKaWYgKGNoYW5uZWxfYV9lbiB8fCBjaGFubmVsX2JfZW4pCnsKCgoJLy9kY2FjaGVfZGlzYWJsZSgpOwogLy9zZXJpYWxfcHV0cygiXG5kZWJ1ZyBmb3IgZGRydGVzdCAsamlheGluZyBkaXNhYmxlIGRjYWNoZSIpOwoKewpmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCnsKaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwp9CmVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCnsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKfQplbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCiB7CmlmICggdGVzdGluZ19jaGFubmVsID09IENIQU5ORUxfQSkKICAgewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwogICB9CmVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQogICB7CnJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CiAgIH0KIH0KCmZvciAoKHRlbXBfY291bnRfaT0wKTsodGVtcF9jb3VudF9pPERBVFg4X0RRX0xBTkVfV0lEVEgpOyh0ZW1wX2NvdW50X2krKykpCiAgIHsKCiAgIGlmICh0ZW1wX2NvdW50X2kgPT0gREFUWDhfRFFfTEFORV9MQU5FMDApCgl7CiAgIHJlZ19hZGQ9RERSMF9QVUJfRFgwTENETFIwK3JlZ19iYXNlX2Fkajt9CgoJICBlbHNlICAgIGlmKHRlbXBfY291bnRfaT09REFUWDhfRFFfTEFORV9MQU5FMDEpCgl7CiAgIHJlZ19hZGQ9RERSMF9QVUJfRFgxTENETFIwK3JlZ19iYXNlX2Fkajt9CgoJZWxzZSAgIAkgaWYodGVtcF9jb3VudF9pPT1EQVRYOF9EUV9MQU5FX0xBTkUwMikKCXsKICAgcmVnX2FkZD1ERFIwX1BVQl9EWDJMQ0RMUjArcmVnX2Jhc2VfYWRqO30KCSBlbHNlICAgIGlmKHRlbXBfY291bnRfaT09REFUWDhfRFFfTEFORV9MQU5FMDMpCgl7CiAgIHJlZ19hZGQ9RERSMF9QVUJfRFgzTENETFIwK3JlZ19iYXNlX2Fkajt9CgoKCgoKCX0KCn0KCn0KCn0vLy8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nIGRxcyB2YWx1ZQoKCmZvciAodGVzdF90aW1lcz0wOyh0ZXN0X3RpbWVzPHRlc3RfbG9vcCk7KHRlc3RfdGltZXMrKykpCnsKLy8vL3R1bmUgYW5kIHNhdmUgdHJhaW5pbmcgZHFzIHZhbHVlCmlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoKewpmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCnsKCmlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCnsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKfQplbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQp7CnJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7Cn0KZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQogewppZiAoIHRlc3RpbmdfY2hhbm5lbCA9PSBDSEFOTkVMX0EpCiAgIHsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKICAgfQplbHNlIGlmKCB0ZXN0aW5nX2NoYW5uZWw9PUNIQU5ORUxfQikKICAgewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwogICB9CiB9Cgpmb3IgKCh0ZW1wX2NvdW50X2k9MCk7KHRlbXBfY291bnRfaTxEQVRYOF9EUV9MQU5FX1dJRFRIKTsodGVtcF9jb3VudF9pKyspKQp7CiAgIHsgcHJpbnRmKCJcbnRlc3QgbGFuZT09MHglMDh4XG4gIix0ZW1wX2NvdW50X2kpOwogICAgICAgICAgaWYgKGRkcl9nYXRlX2luaXRfbGFuZSkKCQl7CgkJdGVtcF9jb3VudF9pPWRkcl9nYXRlX2luaXRfbGFuZTsKCQlwcmludGYoIlxudGVzdCBsYW5lIGNoYW5nZT09MHglMDh4XG4gIix0ZW1wX2NvdW50X2kpOwoJCX0KCgogICBpZiAodGVtcF9jb3VudF9pID09IERBVFg4X0RRX0xBTkVfTEFORTAwKQoJewogICByZWdfYWRkPUREUjBfUFVCX0RYMExDRExSMCtyZWdfYmFzZV9hZGo7fQoKCSAgZWxzZSAgICBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAxKQoJewogICByZWdfYWRkPUREUjBfUFVCX0RYMUxDRExSMCtyZWdfYmFzZV9hZGo7fQoKCWVsc2UgICAJIGlmKHRlbXBfY291bnRfaT09REFUWDhfRFFfTEFORV9MQU5FMDIpCgl7CiAgIHJlZ19hZGQ9RERSMF9QVUJfRFgyTENETFIwK3JlZ19iYXNlX2Fkajt9CgkgZWxzZSAgICBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAzKQoJewogICByZWdfYWRkPUREUjBfUFVCX0RYM0xDRExSMCtyZWdfYmFzZV9hZGo7fQp9CgogLy8gZm9yKCh0ZW1wX2NvdW50X2s9MCk7KHRlbXBfY291bnRfazwyKTsodGVtcF9jb3VudF9rKyspKQoJICAgewoKLy9pZih0ZW1wX2NvdW50X2s9PTApCnsKICBkcWxjZGxyMl9vcmdbdGVtcF9jb3VudF9pXT1yZWFkbChyZWdfYWRkK0REUjBfUFVCX0RYMExDRExSMi1ERFIwX1BVQl9EWDBMQ0RMUjApOwoJICAgZHFndHJfb3JnW3RlbXBfY291bnRfaV09cmVhZGwocmVnX2FkZCtERFIwX1BVQl9EWDBHVFItRERSMF9QVUJfRFgwTENETFIwKTsKCSAgIGRxbWRsclt0ZW1wX2NvdW50X2ldPXJlYWRsKHJlZ19hZGQrRERSMF9QVUJfQUNNRExSLUREUjBfUFVCX0RYMExDRExSMCk7CgkgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPSgoKGRxbWRsclt0ZW1wX2NvdW50X2ldKSkmQUNMQ0RMUl9NQVgpKjIqKChkcWd0cl9vcmdbdGVtcF9jb3VudF9pXSkmKERYTkdUUl9NQVgpKSsoKChkcWxjZGxyMl9vcmdbdGVtcF9jb3VudF9pXSkpJkFDTENETFJfTUFYKTsKZHFxc2dhdGVfb3JnW3RlbXBfY291bnRfaV09ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCnByaW50ZigiXG5nYXRlIG9yZz09MHglMDh4ICAweCUwOHggICAweCUwOHggMHglMDh4XG4gIixkcXFzZ2F0ZV9vcmdbdGVtcF9jb3VudF9pXSxkcWd0cl9vcmdbdGVtcF9jb3VudF9pXSxkcWxjZGxyMl9vcmdbdGVtcF9jb3VudF9pXSwgZHFtZGxyW3RlbXBfY291bnRfaV0pOwoKaWYgKGRkcl9nYXRlX3VwX2Rvd24gPT0gMCkKewp3aGlsZSAoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT4wKQp7CnRlbXBfdGVzdF9lcnJvcj0wOwpkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLS07CnByaW50ZigiXG5nYXRlIGxlZnQgdGVtcD09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKTsKZHFndHJfdGVtcD1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLygoKChkcW1kbHJbdGVtcF9jb3VudF9pXSkpJkFDTENETFJfTUFYKSoyKTsKZHFsY2RscjJfdGVtcD1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLWRxZ3RyX3RlbXAqKCgoKGRxbWRsclt0ZW1wX2NvdW50X2ldKSkmQUNMQ0RMUl9NQVgpKjIpOwoKCSAgIHdyaXRlbCgoZHFsY2RscjJfdGVtcCksKHJlZ19hZGQrRERSMF9QVUJfRFgwTENETFIyLUREUjBfUFVCX0RYMExDRExSMCkpOwoJIHdyaXRlbCgoKChyZWFkbCgocmVnX2FkZCtERFIwX1BVQl9EWDBHVFItRERSMF9QVUJfRFgwTENETFIwKSkpJjB4ZmZmZmYwMDApfChkcWd0cl90ZW1wKSksKHJlZ19hZGQrRERSMF9QVUJfRFgwR1RSLUREUjBfUFVCX0RYMExDRExSMCkpOwoJIHByaW50ZigiXG4gKHJlZ19hZGQrRERSMF9QVUJfRFgwR1RSLUREUjBfUFVCX0RYMExDRExSMCkgMHglMDh4IGd0cj09MHglMDh4XG4gIiwocmVnX2FkZCtERFIwX1BVQl9EWDBHVFItRERSMF9QVUJfRFgwTENETFIwKSwocmVhZGwoKHJlZ19hZGQrRERSMF9QVUJfRFgwR1RSLUREUjBfUFVCX0RYMExDRExSMCkpKSk7CgkgcHJpbnRmKCJcbmxjZGxyMj09MHglMDh4XG4gIixyZWFkbChyZWdfYWRkK0REUjBfUFVCX0RYMExDRExSMi1ERFIwX1BVQl9EWDBMQ0RMUjApKTsKCSBwcmludGYoIlxuZHFndHJfdGVtcD09MHglMDh4XG4gIixkcWd0cl90ZW1wKTsKCSBwcmludGYoIlxuZ2F0ZWRxbGNkbHIyX3RlbXA9PTB4JTA4eFxuICIsZHFsY2RscjJfdGVtcCk7Cgl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CglpZiAodGVtcF90ZXN0X2Vycm9yKQoJCXsKCQlwcmludGYoIlxuZ2F0ZWxlZnQgZWRnZSBkZXRlY3QgXG4iKTsKCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKys7CgkJYnJlYWs7CgkJfQp9CnByaW50ZigiXG5nYXRlIGxlZnQgZWRnZSBkZXRlY3QgXG4iKTsKcHJpbnRmKCJcbmdhdGUgbGVmdCBlZGdlPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUpOwovL2RxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfbWluPWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7CmRxcXNnYXRlX2xbdGVtcF9jb3VudF9pXT1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoJICAgd3JpdGVsKGRxbGNkbHIyX29yZ1t0ZW1wX2NvdW50X2ldLChyZWdfYWRkK0REUjBfUFVCX0RYMExDRExSMi1ERFIwX1BVQl9EWDBMQ0RMUjApKTsKCSB3cml0ZWwoIGRxZ3RyX29yZ1t0ZW1wX2NvdW50X2ldLChyZWdfYWRkK0REUjBfUFVCX0RYMEdUUi1ERFIwX1BVQl9EWDBMQ0RMUjApKTsKCiBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPSgoKGRxbWRsclt0ZW1wX2NvdW50X2ldKSkmQUNMQ0RMUl9NQVgpKjIqKChkcWd0cl9vcmdbdGVtcF9jb3VudF9pXSkmRFhOR1RSX01BWCkrKCgoZHFsY2RscjJfb3JnW3RlbXBfY291bnRfaV0pKSZBQ0xDRExSX01BWCk7Cn0Kd2hpbGUgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU+MCkKewp0ZW1wX3Rlc3RfZXJyb3I9MDsKZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSsrOwpwcmludGYoIlxuZ2F0ZSByaWcgdGVtcD09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKTsKZHFndHJfdGVtcD1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLygoKChkcW1kbHJbdGVtcF9jb3VudF9pXSkpJkFDTENETFJfTUFYKSoyKTsKZHFsY2RscjJfdGVtcD1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLWRxZ3RyX3RlbXAqKCgoKGRxbWRsclt0ZW1wX2NvdW50X2ldKSkmQUNMQ0RMUl9NQVgpKjIpOwoKCSAgIHdyaXRlbCgoZHFsY2RscjJfdGVtcCksKHJlZ19hZGQrRERSMF9QVUJfRFgwTENETFIyLUREUjBfUFVCX0RYMExDRExSMCkpOwoJIHdyaXRlbCgoKHJlYWRsKChyZWdfYWRkK0REUjBfUFVCX0RYMEdUUi1ERFIwX1BVQl9EWDBMQ0RMUjApKSkmMHhmZmZmZjAwMCl8KGRxZ3RyX3RlbXApLChyZWdfYWRkK0REUjBfUFVCX0RYMEdUUi1ERFIwX1BVQl9EWDBMQ0RMUjApKTsKCSAgcHJpbnRmKCJcbiAocmVnX2FkZEREUjBfUFVCX0RYMEdUUikgMHglMDh4IGd0cj09MHglMDh4XG4gIiwocmVnX2FkZCtERFIwX1BVQl9EWDBHVFItRERSMF9QVUJfRFgwTENETFIwKSwocmVhZGwoKHJlZ19hZGQrRERSMF9QVUJfRFgwR1RSLUREUjBfUFVCX0RYMExDRExSMCkpKSk7CgkgcHJpbnRmKCJcbmxjZGxyMj09MHglMDh4XG4gIixyZWFkbChyZWdfYWRkK0REUjBfUFVCX0RYMExDRExSMi1ERFIwX1BVQl9EWDBMQ0RMUjApKTsKCSBwcmludGYoIlxuZHFndHJfdGVtcD09MHglMDh4XG4gIixkcWd0cl90ZW1wKTsKCSBwcmludGYoIlxuZ2F0ZWRxbGNkbHIyX3RlbXA9PTB4JTA4eFxuICIsZHFsY2RscjJfdGVtcCk7Cgl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CglpZiAodGVtcF90ZXN0X2Vycm9yKQoJCXsKCQlwcmludGYoIlxuZ2F0ZXJpZyBlZGdlIGRldGVjdCBcbiIpOwoJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUrKzsKCQlicmVhazsKCQl9Cn0KcHJpbnRmKCJcbmdhdGUgcmlnIGVkZ2UgZGV0ZWN0IFxuIik7CnByaW50ZigiXG5nYXRlIHJpZyBlZGdlPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUpOwovL2RxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfbWF4PWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7CmRxcXNnYXRlX3JbdGVtcF9jb3VudF9pXT1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoJICAgd3JpdGVsKGRxbGNkbHIyX29yZ1t0ZW1wX2NvdW50X2ldLChyZWdfYWRkK0REUjBfUFVCX0RYMExDRExSMi1ERFIwX1BVQl9EWDBMQ0RMUjApKTsKCSB3cml0ZWwoIGRxZ3RyX29yZ1t0ZW1wX2NvdW50X2ldLChyZWdfYWRkK0REUjBfUFVCX0RYMEdUUi1ERFIwX1BVQl9EWDBMQ0RMUjApKTsKCgoKCgoKfQoKCgogfQp9Cgp9Cn0KCi8vLy90dW5lIGFuZCBzYXZlIHRyYWluaW5nIGRxcyB2YWx1ZQoKCgoKLy8vL2NhbGN1bGF0ZSBhbmQgcHJpbnQgIGRxcyB2YWx1ZQpmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCnsKaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwp9CmVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCnsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKfQplbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCiB7CmlmICggdGVzdGluZ19jaGFubmVsID09IENIQU5ORUxfQSkKICAgewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwogICB9CmVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQogICB7CnJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CiAgIH0KIH0KcmVnX2FkZD1ERFIwX1BVQl9EWDBMQ0RMUjArcmVnX2Jhc2VfYWRqOwoKCgoKcHJpbnRmKCJcbiBkZHJ0ZXN0IHNpemUgPT0weCUwOHgsIHRlc3QgdGltZXM9PTB4JTA4eCx0ZXN0X2xvb3A9PTB4JTA4eFxuIixkZHJfdGVzdF9zaXplLCh0ZXN0X3RpbWVzKzEpLHRlc3RfbG9vcCk7CnByaW50ZigiXG4gYWRkICAweDAwMDAwMDAwIHJlZz09ICAgIG9yZyAgICAgICAgICAgbGVmICAgICAgICAgICByaWcgICAgICAgICAgIGNlbnRlciAgICAgICAgd2luICAgICAgICAgICBsZWZfbSAgICAgICAgIHJpZ19tICAgICAgICAgbWluX2MgICAgICAgICBtaW5fd2luICAgICAgICBcbiIpOwoKZm9yICgodGVtcF9jb3VudF9pPTApOyh0ZW1wX2NvdW50X2k8REFUWDhfRFFfTEFORV9XSURUSCk7KHRlbXBfY291bnRfaSsrKSkKewp7CgogICBpZiAodGVtcF9jb3VudF9pID09IERBVFg4X0RRX0xBTkVfTEFORTAwKQoJewogICByZWdfYWRkPUREUjBfUFVCX0RYMExDRExSMCtyZWdfYmFzZV9hZGorMCo0O30KCgkgIGVsc2UgICAgaWYodGVtcF9jb3VudF9pPT1EQVRYOF9EUV9MQU5FX0xBTkUwMSkKCXsKICAgcmVnX2FkZD1ERFIwX1BVQl9EWDFMQ0RMUjArcmVnX2Jhc2VfYWRqKzAqNDt9CgoJZWxzZSAgIAkgaWYodGVtcF9jb3VudF9pPT1EQVRYOF9EUV9MQU5FX0xBTkUwMikKCXsKICAgcmVnX2FkZD1ERFIwX1BVQl9EWDJMQ0RMUjArcmVnX2Jhc2VfYWRqKzAqNDt9CgkgZWxzZSAgICBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAzKQoJewogICByZWdfYWRkPUREUjBfUFVCX0RYM0xDRExSMCtyZWdfYmFzZV9hZGorMCo0O30KfQoKLy91bnNpZ25lZCBpbnQgICBkcWd0cl9vcmdbNF0sZHFsY2RscjJfb3JnWzRdLGRxZ3RyX2xbNF0sZHFsY2RscjJfbFs0XSxkcWd0cl9yWzRdLGRxbGNkbHIyX3JbNF0sZHFtZGxyWzRdOwovLwkgdW5zaWduZWQgaW50IGRxZ3RyX3RlbXA7Ci8vCSAgdW5zaWduZWQgaW50IGRxbGNkbHIyX3RlbXA7Ci8vCSAgdW5zaWduZWQgaW50IGRxcXNnYXRlX2xbNF0sIGRxcXNnYXRlX3JbNF07CihkcWd0cl9sW3RlbXBfY291bnRfaV0pPShkcXFzZ2F0ZV9sW3RlbXBfY291bnRfaV0pLygoKChkcW1kbHJbdGVtcF9jb3VudF9pXSkpJkFDTENETFJfTUFYKSoyKTsKKGRxbGNkbHIyX2xbdGVtcF9jb3VudF9pXSk9KGRxcXNnYXRlX2xbdGVtcF9jb3VudF9pXSktKGRxZ3RyX2xbdGVtcF9jb3VudF9pXSkqKCgoKGRxbWRsclt0ZW1wX2NvdW50X2ldKSkmQUNMQ0RMUl9NQVgpKjIpOwooZHFndHJfclt0ZW1wX2NvdW50X2ldKT0oZHFxc2dhdGVfclt0ZW1wX2NvdW50X2ldKS8oKCgoZHFtZGxyW3RlbXBfY291bnRfaV0pKSZBQ0xDRExSX01BWCkqMik7CihkcWxjZGxyMl9yW3RlbXBfY291bnRfaV0pPShkcXFzZ2F0ZV9yW3RlbXBfY291bnRfaV0pLShkcWd0cl9yW3RlbXBfY291bnRfaV0pKigoKChkcW1kbHJbdGVtcF9jb3VudF9pXSkpJkFDTENETFJfTUFYKSoyKTsKcHJpbnRmKCJcbiBhZGQgIHJlZz09ICAgIDB4JTA4eCAgICAweCUwOHggICAgMHglMDh4ICAgIDB4JTA4eCAgICAweCUwOHggICAgMHglMDh4ICAgIDB4JTA4eCAgICAweCUwOHggICAgMHglMDh4XG4iLAooZHFxc2dhdGVfb3JnW3RlbXBfY291bnRfaV0pLAoJKGRxcXNnYXRlX2xbdGVtcF9jb3VudF9pXSksCgkgICAoZHFxc2dhdGVfclt0ZW1wX2NvdW50X2ldKSwKCQkoZHFndHJfb3JnW3RlbXBfY291bnRfaV0pLAoJCSAoZHFsY2RscjJfb3JnW3RlbXBfY291bnRfaV0pLAoJCSAgIChkcWd0cl9sW3RlbXBfY291bnRfaV0pLAoJCSAoZHFndHJfclt0ZW1wX2NvdW50X2ldKSwKCQkgICAoZHFsY2RscjJfbFt0ZW1wX2NvdW50X2ldKSwKCQkgKGRxbGNkbHIyX3JbdGVtcF9jb3VudF9pXSkKCSAgICk7CgoKfQoKCgoKCn0KCn0KCgoKCiByZXR1cm4gMDsKCnVzYWdlOgoJY21kX3VzYWdlKGNtZHRwKTsKCXJldHVybiAxOwoKfQoKClVfQk9PVF9DTUQoCglkZHJ0ZXN0X2dhdGUsCTcsCTEsCWRvX2RkcnRlc3RfZmluZF9nYXRlX3dpbmQsCgkiRERSIHRlc3QgZnVuY3Rpb24gc2hvdWxkIGRjYWNoZSBvZmYgZGRydGVzdF9nYXRlIGEgMCAweDgwMDAwIDEgMCAzIiwKCSJkZHJ0ZXN0X2dhdGUgW0xPT1BdIFtBRERSXS5EZWZhdWx0IGFkZHJlc3MgaXMgMHgxMDAwMDAwMFxuIgopOwoKCi8vI2VuZGlmCgovLy8qCmludCBkb19kZHJfdGVzdF9hY193aW5kb3dzX2JkbHIoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CiAgIHByaW50ZigiXG5FbnRlciBUZXN0IGRkciBhYyBiZGxyIHdpbmRvd3MgZnVuY3Rpb25cbiIpOwogLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwogIHByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKIC8vICB1bnNpZ25lZCBpbnQgICBsb29wID0gMTsKLy8gICB1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2kgPSAxOwovLyAgIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaj0gMTsKLy8gICAgdW5zaWduZWQgaW50ICAgdGVtcF9jb3VudF9rPSAxOwogICB1bnNpZ25lZCBpbnQgICB0ZW1wX3Rlc3RfZXJyb3I9IDA7CnN0YXRpYyB1bnNpZ25lZCBpbnQgc29mdF9jYV90cmFpbmluZ19zZWVkPTA7CnN0YXRpYyB1bnNpZ25lZCBpbnQgc29mdF9jYV90cmFpbmluZ19zdGVwPTA7CgoJIGNoYXIgKmVuZHA7CiAvLyAgdW5zaWduZWQgaW50ICAgKnBfc3RhcnRfYWRkcjsKICB1bnNpZ25lZCBpbnQgICB0ZXN0X2xvb3A9MTsKICAgdW5zaWduZWQgaW50ICAgdGVzdF90aW1lcz0xOwogICB1bnNpZ25lZCBpbnQgICByZWdfYWRkPTA7CiAgIHVuc2lnbmVkIGludCAgIHJlZ19iYXNlX2Fkaj0wOwoJCSAgdW5zaWduZWQgaW50ICAgY2hhbm5lbF9hX2VuID0gMDsKCSAgIHVuc2lnbmVkIGludCAgIGNoYW5uZWxfYl9lbiA9IDA7CgkgICB1bnNpZ25lZCBpbnQgICB0ZXN0aW5nX2NoYW5uZWwgPSAwOwoKCgoJICAjZGVmaW5lICBDSEFOTkVMX0EgIDAKCSAgI2RlZmluZSAgQ0hBTk5FTF9CICAxCgoKCgoKCgkgI2RlZmluZSAgRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFICAgMHgyMDAwMAoKCQkgICB1bnNpZ25lZCBpbnQgIGFjX21kbHJfYV9vcmc9MDsKCSAgIHVuc2lnbmVkIGludCAgYWNfbWRscl9iX29yZz0wOwoKCSAgdW5zaWduZWQgaW50ICBhY19sY2Rscl9hX29yZz0wOwoJICB1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9hX29yZz0wOwoJICB1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2Jfb3JnPTA7CgkgIHVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2Jfb3JnPTA7CgkgIHVuc2lnbmVkIGludCAgYWNfbGNkbHJfYV9yaWc9MDsKCSAgdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYV9yaWc9MDsKCSAgdW5zaWduZWQgaW50ICBhY19sY2Rscl9iX3JpZz0wOwoJICB1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9iX3JpZz0wOwoJICB1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2FfbGVmPTA7CgkgIHVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2FfbGVmPTA7CgkgIHVuc2lnbmVkIGludCAgYWNfbGNkbHJfYl9sZWY9MDsKCSAgdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYl9sZWY9MDsKCgkJdW5zaWduZWQgaW50ICBhY19sY2Rscl9hX3JpZ19taW49MDsKCSAgdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYV9yaWdfbWluPTA7CgkgIHVuc2lnbmVkIGludCAgYWNfbGNkbHJfYl9yaWdfbWluPTA7CgkgIHVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2JfcmlnX21pbj0wOwoJICB1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2FfbGVmX21pbj0wOwoJICB1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9hX2xlZl9taW49MDsKCSAgdW5zaWduZWQgaW50ICBhY19sY2Rscl9iX2xlZl9taW49MDsKCSAgdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYl9sZWZfbWluPTA7CgkgLy8gICB1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX3RlbXA7CgkvLyAgdW5zaWduZWQgaW50ICAgYWNfYmRscjBfdGVtcD0wOwoKCgoJICAgIHVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCgkgICB1bnNpZ25lZCBpbnQgICBhY19iZGxyX2xlZlsxMF07CgkgICB1bnNpZ25lZCBpbnQgICBhY19iZGxyX3JpZ1sxMF07CgkgICB1bnNpZ25lZCBpbnQgICBhY19iZGxyX3RlbXBfdmFsdWU7CgkgICAgdW5zaWduZWQgaW50ICAgYWNfYmRscl9yZWdfc2VlZF92YWx1ZTsKCSAgIHVuc2lnbmVkIGludCAgIGFjX2JkbHJfdGVtcF9yZWdfdmFsdWU7CgkgIC8vICB1bnNpZ25lZCBpbnQgICB0ZW1wX3Rlc3RfZXJyb3I7CgkJdW5zaWduZWQgaW50IHRlbXBfaT0wOwoJCXVuc2lnbmVkIGludCB0ZW1wX2o9MDsKCQkvL3Vuc2lnbmVkIGludCByZWdfYWRkPTA7Ci8vCQlzdGF0aWMgdW5zaWduZWQgaW50IHNvZnRfY2FfdHJhaW5pbmdfZW5hYmxlZD0xOwoKLy8jZGVmaW5lIEREUl9URVNUX0FDTENETFIKCgoJIGlmIChhcmdjID09IDIpCgkJewogICAgaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkpCgoJe2NoYW5uZWxfYV9lbiA9IDE7Cgl9CgllbHNlIGlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApKQoKCXtjaGFubmVsX2JfZW4gPSAxOwoJfQoJZWxzZQoJCXsKCWdvdG8gdXNhZ2U7CgkJfQoJCX0KCQlpZiAoYXJnYyA+IDIpCgkJewogICAgaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkEiKSA9PSAwKSkKCgl7Y2hhbm5lbF9hX2VuID0gMTsKCX0KICAgICBpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJCIikgPT0gMCkpCgoJe2NoYW5uZWxfYl9lbiA9IDE7Cgl9CgkJCX0KCQkgICBkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwogIGlmIChhcmdjID4zKSB7CglkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgJmVuZHAsIDE2KTsKICAgICAgICBpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJCX0KCgl9CiAgICBpZiAoYXJnYyA+NCkgewoJdGVzdF9sb29wID0gc2ltcGxlX3N0cnRvdWwoYXJndls0XSwgJmVuZHAsIDE2KTsKICAgICAgICBpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCXRlc3RfbG9vcCA9IDE7CgkJCX0KCQkgaWYgICAoKHN0cmNtcChhcmd2WzRdLCAibCIpID09IDApIHx8IChzdHJjbXAoYXJndls0XSwgIkwiKSA9PSAwKSkKCQkJewoJCQl0ZXN0X2xvb3AgPSAxMDAwMDA7CgkJCX0KCX0KCgkgICAgaWYgKGFyZ2MgPjUpIHsKCXNvZnRfY2FfdHJhaW5pbmdfc2VlZCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNV0sICZlbmRwLCAxNik7CiAgICAgICAgaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQlzb2Z0X2NhX3RyYWluaW5nX3NlZWQgPSAweDFmOwoJCQl9CgoKCX0KCQkgICAgaWYgKGFyZ2MgPjYpIHsKCXNvZnRfY2FfdHJhaW5pbmdfc3RlcCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNl0sICZlbmRwLCAxNik7CiAgICAgICAgaWYgKCphcmd2WzZdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQlzb2Z0X2NhX3RyYWluaW5nX3N0ZXAgPSAwOwoJCQl9CgoKCX0KCQkgcHJpbnRmKCJcbmNoYW5uZWxfYV9lbj09IDB4JTA4eFxuIiwgY2hhbm5lbF9hX2VuKTsKCQkgcHJpbnRmKCJcbmNoYW5uZWxfYl9lbj09IDB4JTA4eFxuIiwgY2hhbm5lbF9iX2VuKTsKCQkgIHByaW50ZigiXG5kZHJfdGVzdF9zaXplPT0gMHglMDh4XG4iLCBkZHJfdGVzdF9zaXplKTsKCQkgICBwcmludGYoIlxudGVzdF9sb29wPT0gMHglMDh4XG4iLCB0ZXN0X2xvb3ApOwoJCSAgICBwcmludGYoIlxuc29mdF9jYV90cmFpbmluZ19zZWVkPT0gMHglMDh4XG4iLCBzb2Z0X2NhX3RyYWluaW5nX3NlZWQpOwoJCQlwcmludGYoIlxuc29mdF9jYV90cmFpbmluZ19zdGVwPT0gMHglMDh4XG4iLCBzb2Z0X2NhX3RyYWluaW5nX3N0ZXApOwppZiAoIGNoYW5uZWxfYV9lbikKewovL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwpPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7Cn0KaWYgKCBjaGFubmVsX2JfZW4pCnsKT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpOwovL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwp9CgovL3NhdmUgYW5kIHByaW50IG9yZyB0cmFpbmluZyBkcXMgdmFsdWUKaWYgKGNoYW5uZWxfYV9lbiB8fCBjaGFubmVsX2JfZW4pCnsKCgoJLy9kY2FjaGVfZGlzYWJsZSgpOwogLy9zZXJpYWxfcHV0cygiXG5kZWJ1ZyBmb3IgZGRydGVzdCAsamlheGluZyBkaXNhYmxlIGRjYWNoZSIpOwoKewpmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCnsKaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwp9CmVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCnsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKfQplbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCiB7CmlmICggdGVzdGluZ19jaGFubmVsID09IENIQU5ORUxfQSkKICAgewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwogcmVnX2FkZD1ERFIwX1BVQl9BQ01ETFIrcmVnX2Jhc2VfYWRqOwoKCgogICB9CmVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQogICB7CnJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgogcmVnX2FkZD1ERFIwX1BVQl9BQ01ETFIrcmVnX2Jhc2VfYWRqOwoKCgogICB9CiB9CgogcmVnX2FkZD1ERFIwX1BVQl9BQ01ETFIrcmVnX2Jhc2VfYWRqOwoKCmlmIChyZWdfYmFzZV9hZGogPT0gQ0hBTk5FTF9BX1JFR19CQVNFKQp7CnByaW50ZigiXG50ZXN0IEEgY2hhbm5lbCAweCUwOHhcbiIscmVnX2FkZCk7CiBhY19tZGxyX2Ffb3JnPSh1bnNpZ25lZCBpbnQgKShyZWFkbCgodW5zaWduZWQgaW50IClyZWdfYWRkKSk7Ly9yZWFkbChyZWdfYWRkKTsvLzB4Yzg4MzYwMDAKCSAgIGFjX2xjZGxyX2Ffb3JnPSh1bnNpZ25lZCBpbnQgKShyZWFkbCgodW5zaWduZWQgaW50ICkocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUikpKTsvL3JlYWRsKHJlZ19hZGQrNCk7CglhY19iZGxyMF9hX29yZz0odW5zaWduZWQgaW50ICkocmVhZGwoKHVuc2lnbmVkIGludCApKHJlZ19hZGQrRERSMF9QVUJfQUNCRExSMC1ERFIwX1BVQl9BQ01ETFIpKSk7Ly9yZWFkbChyZWdfYWRkKzgpOwoKCXByaW50ZigiXG4gYWNfbWRscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQpLCBhY19tZGxyX2Ffb3JnKTsKCXByaW50ZigiXG4gYWNfbGNkbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDTENETFItRERSMF9QVUJfQUNNRExSKSwgYWNfbGNkbHJfYV9vcmcpOwoJcHJpbnRmKCJcbiBhY19iZGxyMF9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNCRExSMC1ERFIwX1BVQl9BQ01ETFIpLCBhY19iZGxyMF9hX29yZyk7Cn0KaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0JfUkVHX0JBU0UpCnsKCiAgYWNfbWRscl9iX29yZz1yZWFkbChyZWdfYWRkKTsKCSAgIGFjX2xjZGxyX2Jfb3JnPXJlYWRsKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpOwoJYWNfYmRscjBfYl9vcmc9cmVhZGwocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUik7CglwcmludGYoIlxuIGFjX21kbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkKSwgYWNfbWRscl9iX29yZyk7CglwcmludGYoIlxuIGFjX2xjZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUiksIGFjX2xjZGxyX2Jfb3JnKTsKCXByaW50ZigiXG4gYWNfYmRscjBfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDQkRMUjAtRERSMF9QVUJfQUNNRExSKSwgYWNfYmRscjBfYl9vcmcpOwp9CgoKfQoKfQoKfS8vLy9zYXZlIGFuZCBwcmludCBvcmcgdHJhaW5pbmcgIHZhbHVlCgoKZm9yICh0ZXN0X3RpbWVzPTA7KHRlc3RfdGltZXM8dGVzdF9sb29wKTsodGVzdF90aW1lcysrKSkKewovLy8vdHVuZSBhbmQgc2F2ZSB0cmFpbmluZyBkcXMgdmFsdWUKaWYgKGNoYW5uZWxfYV9lbiB8fCBjaGFubmVsX2JfZW4pCgp7CmZvciAoKHRlc3RpbmdfY2hhbm5lbD0wKTsodGVzdGluZ19jaGFubmVsPChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKSk7KHRlc3RpbmdfY2hhbm5lbCsrKSkKewoKaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwp9CmVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCnsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKfQplbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCiB7CmlmICggdGVzdGluZ19jaGFubmVsID09IENIQU5ORUxfQSkKICAgewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwogICB9CmVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQogICB7CnJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CiAgIH0KIH0KCmlmIChyZWdfYmFzZV9hZGogPT0gQ0hBTk5FTF9BX1JFR19CQVNFKQp7CnByaW50ZigiXG50ZXN0IEEgY2hhbm5lbCBBQ1xuIik7Cn0KZWxzZQp7CnByaW50ZigiXG50ZXN0IEIgY2hhbm5lbCBBQ1xuIik7Cn0KCgp7CgoKI2RlZmluZSB3cnJfcmVnKGFkZHIsIGRhdGEpCSgqKCh2b2xhdGlsZSAgdW5zaWduZWQgaW50ICAqKSgodW5zaWduZWQgbG9uZykodW5zaWduZWQgaW50IClhZGRyKSkpPShkYXRhKSAgLy93cl9yZWcoYWRkciwgZGF0YSkKI2RlZmluZSByZHJfcmVnKGFkZHIpCQkgKHVuc2lnbmVkIGludCApKCooKHZvbGF0aWxlICB1bnNpZ25lZCBpbnQgICopKCh1bnNpZ25lZCBsb25nKSh1bnNpZ25lZCBpbnQgKWFkZHIpKSkgIC8vcmRfcmVnKGFkZHIpCgkvL3dyX3JlZyhERFIwX1BVQl9BQ0JETFIzLCAweDA4MDgpOyAgLy9jczAgY3MxCgkvL3dyX3JlZyhERFIwX1BVQl9BQ0JETFIwLCAweDFmKTsgIC8vY2swCgkgLy8Jd3JfcmVnKEREUjBfUFVCX0FDQkRMUjQsIDB4MDgwOCk7IC8vb2R0MCBvZHQxCgkvL3dyX3JlZyhERFIwX1BVQl9BQ0JETFI1LCAweDA4MDgpOyAgLy9ja2UwIGNrZTEKCgoJLy93cl9yZWcoRERSMF9QVUJfQUNCRExSMSwgMHgxODE4MTgpOyAvL3JhcyBjYXMgd2UKCS8vd3JfcmVnKEREUjBfUFVCX0FDQkRMUjIsIDB4MTgxODE4KTsgLy9iYTAgYmExIGJhMgoJLy93cl9yZWcoRERSMF9QVUJfQUNCRExSNiwgMHgxMjEyMTIxMik7IC8vYTAgYTEgYTIgYTMKCS8vd3JfcmVnKEREUjBfUFVCX0FDQkRMUjcsIDB4MGQwZDBkMGQpOyAvL2E0IGE1IGE2IGE3CgkvL3dyX3JlZyhERFIwX1BVQl9BQ0JETFI4LCAweDEwMTAxMDEwKTsgIC8vYTggYTkgYTEwIGExMQoJLy93cl9yZWcoRERSMF9QVUJfQUNCRExSOSwgMHgxODE4MTgxOCk7ICAvL2ExMiBhMTMgYTE0IGExNQoJcmVnX2FkZD1ERFIwX1BVQl9BQ0JETFIwOwoJYWNfYmRscl9yZWdfc2VlZF92YWx1ZT0oc29mdF9jYV90cmFpbmluZ19zZWVkfChzb2Z0X2NhX3RyYWluaW5nX3NlZWQ8PDgpfChzb2Z0X2NhX3RyYWluaW5nX3NlZWQ8PDE2KXwoc29mdF9jYV90cmFpbmluZ19zZWVkPDwyNCkpOwpmb3IgKCggIHRlbXBfaT0wKTsodGVtcF9pPDEwKTsoIHRlbXBfaSsrKSkKewovL3dyX3JlZygoRERSMF9QVUJfQUNCRExSMCt0ZW1wX2kqNCksCi8vYWNfYmRscl9yZWdfc2VlZF92YWx1ZSk7ICAvL2NzMCBjczEKLy9yZWdfYWRkPXJlZ19hZGQrdGVtcF9pKjQ7CgovL3JlZ19hZGQ9RERSMF9QVUJfQUNNRExSK3JlZ19iYXNlX2FkajsKcmVnX2FkZD0oRERSMF9QVUJfQUNCRExSMCt0ZW1wX2kqNCk7CnJlZ19hZGQ9cmVnX2FkZCtyZWdfYmFzZV9hZGo7Cndycl9yZWcoKHJlZ19hZGQpLAphY19iZGxyX3JlZ19zZWVkX3ZhbHVlKTsgIC8vY3MwIGNzMQphY19iZGxyX2xlZlt0ZW1wX2ldPWFjX2JkbHJfcmVnX3NlZWRfdmFsdWU7CmFjX2JkbHJfcmlnW3RlbXBfaV09YWNfYmRscl9yZWdfc2VlZF92YWx1ZTsKfQoKcHJpbnRmKCJcbmJkbCAgc29mdF9jYV90cmFpbmluZ19zdGVwPT0weCUwOHhcbiAiLHNvZnRfY2FfdHJhaW5pbmdfc3RlcCk7CmZvciAoKCB0ZW1wX2k9MCk7KHRlbXBfaTwxMCk7KCB0ZW1wX2krKykpCnsKCi8vYWNfYmRscl90ZW1wX3ZhbHVlPXJkcl9yZWcoKHVuc2lnbmVkIGludCApcmVnX2FkZCk7CgppZiAoKCAgdGVtcF9pID09IDEpKQp7Ci8vdGVtcF9pPTM7Cn0KCgpmb3IgKCggdGVtcF9qPTApOyh0ZW1wX2o8NCk7KCB0ZW1wX2orKykpCnsKCmlmIChzb2Z0X2NhX3RyYWluaW5nX3N0ZXApCnt0ZW1wX2k9KHNvZnRfY2FfdHJhaW5pbmdfc3RlcD4+Mik7CnRlbXBfaj1zb2Z0X2NhX3RyYWluaW5nX3N0ZXAtKChzb2Z0X2NhX3RyYWluaW5nX3N0ZXA+PjIpPDwyKTsKc29mdF9jYV90cmFpbmluZ19zdGVwPTA7Cn0KaWYgKCh0ZW1wX2kqNCt0ZW1wX2opID09IDEpCnsKdGVtcF9pPTE7CnRlbXBfaj0wOwp9CmlmICgodGVtcF9pKjQrdGVtcF9qKSA9PSA3KQp7CnRlbXBfaT0yOwp0ZW1wX2o9MDsKfQppZiAoKHRlbXBfaSo0K3RlbXBfaikgPT0gMTQpCnsKdGVtcF9pPTQ7CnRlbXBfaj0wOwp9CmlmICgodGVtcF9pKjQrdGVtcF9qKSA9PSAxOCkKewp0ZW1wX2k9NTsKdGVtcF9qPTA7Cn0KaWYgKCh0ZW1wX2kqNCt0ZW1wX2opID09IDIyKQp7CnRlbXBfaT02Owp0ZW1wX2o9MDsKfQovL3ByaW50ZigiXG5iZGwgIHRlbXBfaT09MHglMDh4XG4gIix0ZW1wX2kpOwpwcmludGYoIlxuYmRsICB0ZW1wX2lqPT0weCUwOHhcbiAiLCh0ZW1wX2kqNCt0ZW1wX2opKTsKcmVnX2FkZD0oRERSMF9QVUJfQUNCRExSMCt0ZW1wX2kqNCk7CnJlZ19hZGQ9cmVnX2FkZCtyZWdfYmFzZV9hZGo7CmFjX2JkbHJfdGVtcF9yZWdfdmFsdWU9cmRyX3JlZygodW5zaWduZWQgaW50IClyZWdfYWRkKTsKYWNfYmRscl90ZW1wX3ZhbHVlPSgoYWNfYmRscl90ZW1wX3JlZ192YWx1ZT4+KHRlbXBfajw8MykpJkFDQkRMUl9NQVgpOwp3aGlsZSAoYWNfYmRscl90ZW1wX3ZhbHVlPjApCnsKdGVtcF90ZXN0X2Vycm9yPTA7CmFjX2JkbHJfdGVtcF92YWx1ZS0tOwoKcHJpbnRmKCJcbmJkbCAgdGVtcF9paj09MHglMDh4IGxlZiB0ZW1wPT0weCUwOHhcbiAiLCh0ZW1wX2kqNCt0ZW1wX2opLGFjX2JkbHJfdGVtcF92YWx1ZSk7CgphY19iZGxyX3RlbXBfcmVnX3ZhbHVlPSgoKH4oMHhmZjw8KHRlbXBfajw8MykpKSZhY19iZGxyX3JlZ19zZWVkX3ZhbHVlKXwoKGFjX2JkbHJfdGVtcF92YWx1ZSk8PCh0ZW1wX2o8PDMpKSk7CnJlZ19hZGQ9KEREUjBfUFVCX0FDQkRMUjArdGVtcF9pKjQpOwpyZWdfYWRkPXJlZ19hZGQrcmVnX2Jhc2VfYWRqOwp3cnJfcmVnKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQsCmFjX2JkbHJfdGVtcF9yZWdfdmFsdWUpOwpwcmludGYoIlxuYmRsIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIixyZWdfYWRkLGFjX2JkbHJfdGVtcF9yZWdfdmFsdWUpOwoKCSAjaWZkZWYgRERSX0xDRExSX0NLX1VTRV9GQVNUX1BBVFRFUk4KCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkgI2Vsc2UKICAgdGVtcF90ZXN0X2Vycm9yPSBkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CiAgdGVtcF90ZXN0X2Vycm9yPSB0ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CiAgI2VuZGlmCglpZiAodGVtcF90ZXN0X2Vycm9yKQoJCXsKCQlwcmludGYoIlxuYmRsIGxlZnQgZWRnZSBkZXRlY3QgXG4iKTsKCQlhY19iZGxyX3RlbXBfdmFsdWUrKzsKCQlicmVhazsKCQl9Cn0KCnByaW50ZigiXG5iZGwgbGVmdCBlZGdlIGRldGVjdCBcbiIpOwpwcmludGYoIlxuXG5iZGwgIHRlbXBfaWo9PTB4JTA4eCAgICAgICAgICBiZGwgbGVmdCBlZGdlPT0weCUwOHhcbiAiLCh0ZW1wX2kqNCt0ZW1wX2opLGFjX2JkbHJfdGVtcF92YWx1ZSk7CnJlZ19hZGQ9KEREUjBfUFVCX0FDQkRMUjArdGVtcF9pKjQpOwpyZWdfYWRkPXJlZ19hZGQrcmVnX2Jhc2VfYWRqOwp3cnJfcmVnKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQsCmFjX2JkbHJfcmVnX3NlZWRfdmFsdWUpOwoKYWNfYmRscl90ZW1wX3JlZ192YWx1ZT0oKCh+KDB4ZmY8PCh0ZW1wX2o8PDMpKSkmYWNfYmRscl9sZWZbdGVtcF9pXSl8KChhY19iZGxyX3RlbXBfdmFsdWUpPDwodGVtcF9qPDwzKSkpOwphY19iZGxyX2xlZlt0ZW1wX2ldPWFjX2JkbHJfdGVtcF9yZWdfdmFsdWU7CgphY19iZGxyX3RlbXBfdmFsdWU9KChhY19iZGxyX3JlZ19zZWVkX3ZhbHVlPj4odGVtcF9qPDwzKSkmQUNCRExSX01BWCk7CndoaWxlIChhY19iZGxyX3RlbXBfdmFsdWU8QUNCRExSX01BWCkKewp0ZW1wX3Rlc3RfZXJyb3I9MDsKYWNfYmRscl90ZW1wX3ZhbHVlKys7CnByaW50ZigiXG50ZW1wX2lqPT0weCUwOHggcmlnIHRlbXA9PTB4JTA4eFxuICIsKHRlbXBfaSo0K3RlbXBfaiksYWNfYmRscl90ZW1wX3ZhbHVlKTsKCmFjX2JkbHJfdGVtcF9yZWdfdmFsdWU9KCgofigweGZmPDwodGVtcF9qPDwzKSkpJmFjX2JkbHJfcmVnX3NlZWRfdmFsdWUpfCgoYWNfYmRscl90ZW1wX3ZhbHVlKTw8KHRlbXBfajw8MykpKTsKcmVnX2FkZD0oRERSMF9QVUJfQUNCRExSMCt0ZW1wX2kqNCk7CnJlZ19hZGQ9cmVnX2FkZCtyZWdfYmFzZV9hZGo7Cndycl9yZWcoKHVuc2lnbmVkIGludCApcmVnX2FkZCwKYWNfYmRscl90ZW1wX3JlZ192YWx1ZSk7CnByaW50ZigiXG5iZGwgcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLHJlZ19hZGQsYWNfYmRscl90ZW1wX3JlZ192YWx1ZSk7CgkjaWZkZWYgRERSX0xDRExSX0NLX1VTRV9GQVNUX1BBVFRFUk4KCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkgI2Vsc2UKICAgdGVtcF90ZXN0X2Vycm9yPSBkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CiAgdGVtcF90ZXN0X2Vycm9yPSB0ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CiAgI2VuZGlmCglpZiAodGVtcF90ZXN0X2Vycm9yKQoJCXsKCQlwcmludGYoIlxuYmRsIHJpZyBlZGdlIGRldGVjdCBcbiIpOwoJCWFjX2JkbHJfdGVtcF92YWx1ZS0tOwoJCWJyZWFrOwoJCX0KfQoKCgpwcmludGYoIlxuYmRsIHJpZyBlZGdlIGRldGVjdCBcbiIpOwovL3ByaW50ZigiXG5cbmJkbCByaWcgZWRnZT09MHglMDh4XG4gIixhY19iZGxyX3RlbXBfdmFsdWUpOwpwcmludGYoIlxuXG5iZGwgIHRlbXBfaWo9PTB4JTA4eCAgICAgICAgICBiZGwgcmlnaCBlZGdlPT0weCUwOHhcbiAiLCh0ZW1wX2kqNCt0ZW1wX2opLGFjX2JkbHJfdGVtcF92YWx1ZSk7CnJlZ19hZGQ9KEREUjBfUFVCX0FDQkRMUjArdGVtcF9pKjQpOwpyZWdfYWRkPXJlZ19hZGQrcmVnX2Jhc2VfYWRqOwp3cnJfcmVnKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQsCmFjX2JkbHJfcmVnX3NlZWRfdmFsdWUpOwoKYWNfYmRscl90ZW1wX3JlZ192YWx1ZT0oKCh+KDB4ZmY8PCh0ZW1wX2o8PDMpKSkmYWNfYmRscl9yaWdbdGVtcF9pXSl8KChhY19iZGxyX3RlbXBfdmFsdWUpPDwodGVtcF9qPDwzKSkpOwphY19iZGxyX3JpZ1t0ZW1wX2ldPWFjX2JkbHJfdGVtcF9yZWdfdmFsdWU7Cn0KfQoKcHJpbnRmKCJcbmJkbCBsZWYgZWRnZT09YmRscjAgICAgIGJkbHIxICAgICBiZGxyMiAgICAgYmRscjMgICAgIGJkbHI0ICAgICBiZGxyNSAgICAgYmRscjYgICAgIGJkbHI3ICAgICBiZGxyOCAgICAgYmRscjkgICAgIFxuICIpOwpwcmludGYoIlxuYmRsIGxlZiBlZGdlPT1cbiIpOwpmb3IgKCggdGVtcF9pPTApOyh0ZW1wX2k8MTApOyggdGVtcF9pKyspKQp7CgpwcmludGYoIjB4JTA4eFxuICIsYWNfYmRscl9sZWZbdGVtcF9pXSk7Cgp9CgpwcmludGYoIlxuICIpOwpmb3IgKCggdGVtcF9pPTApOyh0ZW1wX2k8MTApOyggdGVtcF9pKyspKQp7CgpwcmludGYoIjB4JTA4eFxuICIsYWNfYmRscl9yaWdbdGVtcF9pXSk7Cgp9CnByaW50ZigiXG5iZGwgcmlnIGVkZ2U9PT09PT09PT09PVxuIik7CnByaW50ZigiXG49PT09PT09PT09PT09PT09PT09XG4iKTsKCnByaW50ZigiXG5iZGwgbGVmIGVkZ2U9PVxuIik7CmZvciAoKCB0ZW1wX2k9MCk7KHRlbXBfaTwxMCk7KCB0ZW1wX2krKykpCnsKZm9yICgoIHRlbXBfaj0wKTsodGVtcF9qPDQpOyggdGVtcF9qKyspKQp7CmlmICgodGVtcF9pKjQrdGVtcF9qKSA9PSAxKQp7CnRlbXBfaT0xOwp0ZW1wX2o9MDsKfQppZiAoKHRlbXBfaSo0K3RlbXBfaikgPT0gNykKewp0ZW1wX2k9MjsKdGVtcF9qPTA7Cn0KaWYgKCh0ZW1wX2kqNCt0ZW1wX2opID09IDE0KQp7CnRlbXBfaT00Owp0ZW1wX2o9MDsKfQppZiAoKHRlbXBfaSo0K3RlbXBfaikgPT0gMTgpCnsKdGVtcF9pPTU7CnRlbXBfaj0wOwp9CmlmICgodGVtcF9pKjQrdGVtcF9qKSA9PSAyMikKewp0ZW1wX2k9NjsKdGVtcF9qPTA7Cn0KYWNfYmRscl90ZW1wX3JlZ192YWx1ZT0oKCgoMHhmZjw8KHRlbXBfajw8MykpKSZhY19iZGxyX2xlZlt0ZW1wX2ldKT4+KHRlbXBfajw8MykpOwpwcmludGYoIlxudGVtcGlfajB4JTA4eD09MHglMDh4IiwoKHRlbXBfaTw8MikrdGVtcF9qKSxhY19iZGxyX3RlbXBfcmVnX3ZhbHVlKTsKfQp9CgpwcmludGYoIlxuICIpOwpwcmludGYoIlxuYmRsIHJpZyBlZGdlPT1cbiIpOwpmb3IgKCggdGVtcF9pPTApOyh0ZW1wX2k8MTApOyggdGVtcF9pKyspKQp7CmZvciAoKCB0ZW1wX2o9MCk7KHRlbXBfajw0KTsoIHRlbXBfaisrKSkKewppZiAoKHRlbXBfaSo0K3RlbXBfaikgPT0gMSkKewp0ZW1wX2k9MTsKdGVtcF9qPTA7Cn0KaWYgKCh0ZW1wX2kqNCt0ZW1wX2opID09IDcpCnsKdGVtcF9pPTI7CnRlbXBfaj0wOwp9CmlmICgodGVtcF9pKjQrdGVtcF9qKSA9PSAxNCkKewp0ZW1wX2k9NDsKdGVtcF9qPTA7Cn0KaWYgKCh0ZW1wX2kqNCt0ZW1wX2opID09IDE4KQp7CnRlbXBfaT01Owp0ZW1wX2o9MDsKfQppZiAoKHRlbXBfaSo0K3RlbXBfaikgPT0gMjIpCnsKdGVtcF9pPTY7CnRlbXBfaj0wOwp9CmFjX2JkbHJfdGVtcF9yZWdfdmFsdWU9KCgoKDB4ZmY8PCh0ZW1wX2o8PDMpKSkmYWNfYmRscl9yaWdbdGVtcF9pXSk+Pih0ZW1wX2o8PDMpKTsKcHJpbnRmKCJcbnRlbXBpX2oweCUwOHg9PTB4JTA4eCIsKCh0ZW1wX2k8PDIpK3RlbXBfaiksYWNfYmRscl90ZW1wX3JlZ192YWx1ZSk7Cn0KfQoKCgoKCQl9CgoKCn0KCi8vLy90dW5lIGFuZCBzYXZlIHRyYWluaW5nIGRxcyB2YWx1ZQoKCgoKLy8vL2NhbGN1bGF0ZSBhbmQgcHJpbnQgIGRxcyB2YWx1ZQpmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCnsKaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwp9CmVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCnsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKfQplbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCiB7CmlmICggdGVzdGluZ19jaGFubmVsID09IENIQU5ORUxfQSkKICAgewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwogICB9CmVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQogICB7CnJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CiAgIH0KIH0KcmVnX2FkZD1ERFIwX1BVQl9BQ01ETFIrcmVnX2Jhc2VfYWRqOwoKaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0FfUkVHX0JBU0UpCnsKaWYgKHRlc3RfdGltZXMpCnsKaWYgKGFjX2xjZGxyX2FfbGVmPmFjX2xjZGxyX2FfbGVmX21pbikKYWNfbGNkbHJfYV9sZWZfbWluPWFjX2xjZGxyX2FfbGVmOwoKaWYgKGFjX2xjZGxyX2FfcmlnPGFjX2xjZGxyX2FfcmlnX21pbikKYWNfbGNkbHJfYV9yaWdfbWluPWFjX2xjZGxyX2FfcmlnOwoKaWYgKGFjX2JkbHIwX2FfbGVmPmFjX2JkbHIwX2FfbGVmX21pbikKYWNfYmRscjBfYV9sZWZfbWluPWFjX2JkbHIwX2FfbGVmOwoKaWYgKGFjX2JkbHIwX2FfcmlnPGFjX2JkbHIwX2FfcmlnX21pbikKYWNfYmRscjBfYV9yaWdfbWluPWFjX2JkbHIwX2FfcmlnOwp9CgllbHNlCgkJewphY19sY2Rscl9hX2xlZl9taW49YWNfbGNkbHJfYV9sZWY7CmFjX2xjZGxyX2FfcmlnX21pbj1hY19sY2Rscl9hX3JpZzsKYWNfYmRscjBfYV9sZWZfbWluPWFjX2JkbHIwX2FfbGVmOwphY19iZGxyMF9hX3JpZ19taW49YWNfYmRscjBfYV9yaWc7CgkJfQoJICAgcHJpbnRmKCJcbnRlc3QgQSBjaGFubmVsIEFDIHJlc3VsdFxuIik7CglwcmludGYoIlxuIGFjX21kbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkKSwgYWNfbWRscl9hX29yZyk7CglwcmludGYoIlxuIGFjX2xjZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUiksIGFjX2xjZGxyX2Ffb3JnKTsKCXByaW50ZigiXG4gYWNfYmRscjBfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDQkRMUjAtRERSMF9QVUJfQUNNRExSKSwgYWNfYmRscjBfYV9vcmcpOwoKcHJpbnRmKCJcbiBhY19hY21kbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4ICAgbGNkbHJfbGVmICAgbGNkbHJfcmlnICAgbGNkbHJfbG1pbiAgbGNkbHJfcm1pblxuIiwocmVnX2FkZCksYWNfbWRscl9hX29yZyk7CglwcmludGYoIlxuIGFjX2xjZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eCAgMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDTENETFItRERSMF9QVUJfQUNNRExSKSwgYWNfbGNkbHJfYV9vcmcsYWNfbGNkbHJfYV9sZWYsYWNfbGNkbHJfYV9yaWcsYWNfbGNkbHJfYV9sZWZfbWluLGFjX2xjZGxyX2FfcmlnX21pbik7CglwcmludGYoIlxuIGFjX2JkbHIwX2Ffb3JnICAweCUwOHggcmVnPT0gMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4ICAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNCRExSMC1ERFIwX1BVQl9BQ01ETFIpLCBhY19iZGxyMF9hX29yZyxhY19iZGxyMF9hX2xlZixhY19iZGxyMF9hX3JpZyxhY19iZGxyMF9hX2xlZl9taW4sYWNfYmRscjBfYV9yaWdfbWluKTsKCgoKfQoKaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0JfUkVHX0JBU0UpCnsKaWYgKHRlc3RfdGltZXMpCnsKaWYgKGFjX2xjZGxyX2JfbGVmPmFjX2xjZGxyX2JfbGVmX21pbikKYWNfbGNkbHJfYl9sZWZfbWluPWFjX2xjZGxyX2JfbGVmOwoKaWYgKGFjX2xjZGxyX2JfcmlnPGFjX2xjZGxyX2JfcmlnX21pbikKYWNfbGNkbHJfYl9yaWdfbWluPWFjX2xjZGxyX2JfcmlnOwoKaWYgKGFjX2JkbHIwX2JfbGVmPmFjX2JkbHIwX2JfbGVmX21pbikKYWNfYmRscjBfYl9sZWZfbWluPWFjX2JkbHIwX2JfbGVmOwoKaWYgKGFjX2JkbHIwX2JfcmlnPGFjX2JkbHIwX2JfcmlnX21pbikKYWNfYmRscjBfYl9yaWdfbWluPWFjX2JkbHIwX2JfcmlnOwp9CgllbHNlCgkJewphY19sY2Rscl9iX2xlZl9taW49YWNfbGNkbHJfYl9sZWY7CmFjX2xjZGxyX2JfcmlnX21pbj1hY19sY2Rscl9iX3JpZzsKYWNfYmRscjBfYl9sZWZfbWluPWFjX2JkbHIwX2JfbGVmOwphY19iZGxyMF9iX3JpZ19taW49YWNfYmRscjBfYl9yaWc7CgkJfQoJICAgcHJpbnRmKCJcbnRlc3QgQiBjaGFubmVsIEFDIHJlc3VsdFxuIik7CglwcmludGYoIlxuIGFjX21kbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkKSwgYWNfbWRscl9iX29yZyk7CglwcmludGYoIlxuIGFjX2xjZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUiksIGFjX2xjZGxyX2Jfb3JnKTsKCXByaW50ZigiXG4gYWNfYmRscjBfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDQkRMUjAtRERSMF9QVUJfQUNNRExSKSwgYWNfYmRscjBfYl9vcmcpOwoKCXByaW50ZigiXG4gYWNfYWNtZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eCAgIGxjZGxyX2xlZiAgIGxjZGxyX3JpZyAgIGxjZGxyX2xtaW4gIGxjZGxyX3JtaW5cbiIsKHJlZ19hZGQpLGFjX21kbHJfYl9vcmcpOwoJcHJpbnRmKCJcbiBhY19sY2Rscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHggIDB4JTA4eCAgMHglMDh4ICAweCUwOHggIDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUiksIGFjX2xjZGxyX2Jfb3JnLGFjX2xjZGxyX2JfbGVmLGFjX2xjZGxyX2JfcmlnLGFjX2xjZGxyX2JfbGVmX21pbixhY19sY2Rscl9iX3JpZ19taW4pOwoJcHJpbnRmKCJcbiBhY19iZGxyMF9hX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eCAgMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDQkRMUjAtRERSMF9QVUJfQUNNRExSKSwgYWNfYmRscjBfYl9vcmcsYWNfYmRscjBfYl9sZWYsYWNfYmRscjBfYl9yaWcsYWNfYmRscjBfYl9sZWZfbWluLGFjX2JkbHIwX2JfcmlnX21pbik7CgoKCgp9CgoKCgkgICB9CgoKfQoKfQoKCgoKIHJldHVybiAwOwoKdXNhZ2U6CgljbWRfdXNhZ2UoY21kdHApOwoJcmV0dXJuIDE7Cgp9CgoKVV9CT09UX0NNRCgKCWRkcl90dW5lX2Rkcl9hY19iZGxyLAk3LAkxLAlkb19kZHJfdGVzdF9hY193aW5kb3dzX2JkbHIsCgkiRERSIHR1bmUgYWMgYmRsIGZ1bmN0aW9uIiwKCSJkZHJfdHVuZV9kZHJfYWNfYmRsciBhIDAgMHg4MDAwMDAwIDEgc2VlZCBzdGVwIG9yIGRkcl90dW5lX2Rkcl9hY19iZGxyIGIgMCAweDgwMDAwMCAxIHNlZWQgc3RlcCBvciBkZHJfdHVuZV9kZHJfYWNfYWNiZGxyX2NrIGEgYiAweDgwMDAwIGxcbiBkY2FjaGUgb2ZmID8gXG4iCik7CgppbnQgZG9fZGRyX3Rlc3RfdnJlZihjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKICAgcHJpbnRmKCJcbkVudGVyIFRlc3QgZGRyIHZyZWYgZnVuY3Rpb25cbiIpOwogLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwogIHByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCgogLy8gIHVuc2lnbmVkIGludCAgIGxvb3AgPSAxOwovLyAgIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaSA9IDE7Ci8vICAgdW5zaWduZWQgaW50ICAgdGVtcF9jb3VudF9qPSAxOwovLyAgICB1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2s9IDE7CiAgIHVuc2lnbmVkIGludCAgIHRlbXBfdGVzdF9lcnJvcj0gMDsKc3RhdGljIHVuc2lnbmVkIGludCB0cmFpbmluZ19zZWVkPTA7CnN0YXRpYyB1bnNpZ25lZCBpbnQgdHJhaW5pbmdfc3RlcD0wOwoKCSBjaGFyICplbmRwOwogLy8gIHVuc2lnbmVkIGludCAgICpwX3N0YXJ0X2FkZHI7CiAgdW5zaWduZWQgaW50ICAgdGVzdF9sb29wPTE7CiAgIHVuc2lnbmVkIGludCAgIHRlc3RfdGltZXM9MTsKICAgdW5zaWduZWQgaW50ICAgcmVnX2FkZD0wOwogICB1bnNpZ25lZCBpbnQgICByZWdfYmFzZV9hZGo9MDsKCQkgIHVuc2lnbmVkIGludCAgIGNoYW5uZWxfYV9lbiA9IDA7CgkgICB1bnNpZ25lZCBpbnQgICBjaGFubmVsX2JfZW4gPSAwOwoJICAgdW5zaWduZWQgaW50ICAgdGVzdGluZ19jaGFubmVsID0gMDsKCgoKCSAgI2RlZmluZSAgQ0hBTk5FTF9BICAwCgkgICNkZWZpbmUgIENIQU5ORUxfQiAgMQoKCgoKCgoJICNkZWZpbmUgIEREUl9DT1JTU19UQUxLX1RFU1RfU0laRSAgIDB4MjAwMDAKCgkJICAgdW5zaWduZWQgaW50ICBhY19tZGxyX2Ffb3JnPTA7CgkgICB1bnNpZ25lZCBpbnQgIGFjX21kbHJfYl9vcmc9MDsKCgkgIHVuc2lnbmVkIGludCAgYWNfbGNkbHJfYV9vcmc9MDsKCSAgdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYV9vcmc9MDsKCSAgdW5zaWduZWQgaW50ICBhY19sY2Rscl9iX29yZz0wOwoJICB1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9iX29yZz0wOwoJLy8gIHVuc2lnbmVkIGludCAgYWNfbGNkbHJfYV9yaWc9MDsKCS8vICB1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9hX3JpZz0wOwoJLy8gIHVuc2lnbmVkIGludCAgYWNfbGNkbHJfYl9yaWc9MDsKCS8vICB1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9iX3JpZz0wOwoJLy8gIHVuc2lnbmVkIGludCAgYWNfbGNkbHJfYV9sZWY9MDsKCS8vICB1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9hX2xlZj0wOwoJLy8gIHVuc2lnbmVkIGludCAgYWNfbGNkbHJfYl9sZWY9MDsKCS8vICB1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9iX2xlZj0wOwoKCSAgLy8JICB1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2FfcmlnX21pbj0wOwoJLy8gIHVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2FfcmlnX21pbj0wOwoJLy8gIHVuc2lnbmVkIGludCAgYWNfbGNkbHJfYl9yaWdfbWluPTA7CgkvLyAgdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYl9yaWdfbWluPTA7CgkvLyAgdW5zaWduZWQgaW50ICBhY19sY2Rscl9hX2xlZl9taW49MDsKCS8vICB1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9hX2xlZl9taW49MDsKCS8vICB1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2JfbGVmX21pbj0wOwoJLy8gIHVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2JfbGVmX21pbj0wOwoJIC8vICAgdW5zaWduZWQgaW50ICBhY19sY2Rscl90ZW1wOwoJLy8gIHVuc2lnbmVkIGludCAgIGFjX2JkbHIwX3RlbXA9MDsKCgoKCSAgICB1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgoJLy8gICB1bnNpZ25lZCBpbnQgICBhY19iZGxyX2xlZlsxMF07CgkvLyAgIHVuc2lnbmVkIGludCAgIGFjX2JkbHJfcmlnWzEwXTsKCSAgIHVuc2lnbmVkIGludCAgIGlvdnJlZl90ZW1wX3ZhbHVlOwoJICAgIHVuc2lnbmVkIGludCAgIGlvdnJlZl90ZW1wX3JlZ192YWx1ZTsKCSAgICB1bnNpZ25lZCBpbnQgIHJlZ19zZWVkX3ZhbHVlOwovLwkgICB1bnNpZ25lZCBpbnQgICB0ZW1wX3JlZ192YWx1ZTsKCSAgICAgdW5zaWduZWQgaW50ICAgaW92cmVmX2xlZjsKCQkgIHVuc2lnbmVkIGludCAgIGlvdnJlZl9yaWc7CgkgIC8vICB1bnNpZ25lZCBpbnQgICB0ZW1wX3Rlc3RfZXJyb3I7CgkvLwl1bnNpZ25lZCBpbnQgdGVtcF9pPTA7CgkvLwl1bnNpZ25lZCBpbnQgdGVtcF9qPTA7CgkJLy91bnNpZ25lZCBpbnQgcmVnX2FkZD0wOwovLwkJc3RhdGljIHVuc2lnbmVkIGludCB0cmFpbmluZ19lbmFibGVkPTE7CgovLwkgaW92cmVmX2xlZj0weDQ5OwovLyBwcmludGYoIlxuXG4gaW92cmVmICBvcmcgICAgICAgICAgICAgICAgICAgICA9PTB4JTA4eCAgICUwOGRtVlxuIixpb3ZyZWZfbGVmLCgoKCgoaW92cmVmX2xlZiYwWDNGKSo3KSs0NDApKjMpLzIpKzEpOwovLyNkZWZpbmUgRERSX1RFU1RfQUNMQ0RMUgoKCgkgaWYgKGFyZ2MgPT0gMikKCQl7CiAgICBpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSkKCgl7Y2hhbm5lbF9hX2VuID0gMTsKCX0KCWVsc2UgaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApfHwoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkpCgoJe2NoYW5uZWxfYl9lbiA9IDE7Cgl9CgllbHNlCgkJewoJZ290byB1c2FnZTsKCQl9CgkJfQoJCWlmIChhcmdjID4gMikKCQl7CiAgICBpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQSIpID09IDApKQoKCXtjaGFubmVsX2FfZW4gPSAxOwoJfQogICAgIGlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkIiKSA9PSAwKSkKCgl7Y2hhbm5lbF9iX2VuID0gMTsKCX0KCQkJfQoJCSAgIGRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CiAgaWYgKGFyZ2MgPjMpIHsKCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bChhcmd2WzNdLCAmZW5kcCwgMTYpOwogICAgICAgIGlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQkJfQoKCX0KICAgIGlmIChhcmdjID40KSB7Cgl0ZXN0X2xvb3AgPSBzaW1wbGVfc3RydG91bChhcmd2WzRdLCAmZW5kcCwgMTYpOwogICAgICAgIGlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJdGVzdF9sb29wID0gMTsKCQkJfQoJCSBpZiAgICgoc3RyY21wKGFyZ3ZbNF0sICJsIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzRdLCAiTCIpID09IDApKQoJCQl7CgkJCXRlc3RfbG9vcCA9IDEwMDAwMDsKCQkJfQoJfQoJdHJhaW5pbmdfc2VlZCA9IDB4NDk7CgkgICAgaWYgKGFyZ2MgPjUpIHsKICAgdHJhaW5pbmdfc2VlZCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNV0sICZlbmRwLCAxNik7CiAgICAgICAgaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQl0cmFpbmluZ19zZWVkID0gMHg0OTsKCQkJfQoKCgl9CgogcHJpbnRmKCJcblxuIGlvdnJlZiAgdHJhaW5pbmdfc2VlZCAgICAgICAgICAgICA9PTB4JTA4eCAgICUwOGRtVlxuIix0cmFpbmluZ19zZWVkLCgoKCgodHJhaW5pbmdfc2VlZCYwWDNGKSo3KSs0NDApKjMpLzIpKzEpOwoKIHRyYWluaW5nX3N0ZXAgPSAwOwoJCQlpZiAoYXJnYyA+NikgewoJdHJhaW5pbmdfc3RlcCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNl0sICZlbmRwLCAxNik7CiAgICAgICAgaWYgKCphcmd2WzZdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQl0cmFpbmluZ19zdGVwID0gMDsKCQkJfQoKCgoJfQoJCSBwcmludGYoIlxuY2hhbm5lbF9hX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2FfZW4pOwoJCSBwcmludGYoIlxuY2hhbm5lbF9iX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2JfZW4pOwoJCSAgcHJpbnRmKCJcbmRkcl90ZXN0X3NpemU9PSAweCUwOHhcbiIsIGRkcl90ZXN0X3NpemUpOwoJCSAgIHByaW50ZigiXG50ZXN0X2xvb3A9PSAweCUwOHhcbiIsIHRlc3RfbG9vcCk7CmlmICggY2hhbm5lbF9hX2VuKQp7Ci8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7Ck9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKTsKfQppZiAoIGNoYW5uZWxfYl9lbikKewpPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCk7Ci8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7Cn0KCi8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nIGRxcyB2YWx1ZQppZiAoY2hhbm5lbF9hX2VuIHx8IGNoYW5uZWxfYl9lbikKewoKCgkvL2RjYWNoZV9kaXNhYmxlKCk7CiAvL3NlcmlhbF9wdXRzKCJcbmRlYnVnIGZvciBkZHJ0ZXN0ICxqaWF4aW5nIGRpc2FibGUgZGNhY2hlIik7Cgp7CmZvciAoKHRlc3RpbmdfY2hhbm5lbD0wKTsodGVzdGluZ19jaGFubmVsPChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKSk7KHRlc3RpbmdfY2hhbm5lbCsrKSkKewppZiAoKCBjaGFubmVsX2FfZW4pICYmICggY2hhbm5lbF9iX2VuID09IDApKQp7CnJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7Cn0KZWxzZSBpZigoIGNoYW5uZWxfYl9lbikmJiggY2hhbm5lbF9hX2VuPT0wKSkKewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwp9CmVsc2UgaWYgKChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKT09MikKIHsKaWYgKCB0ZXN0aW5nX2NoYW5uZWwgPT0gQ0hBTk5FTF9BKQogICB7CnJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CiByZWdfYWRkPUREUjBfUFVCX0FDTURMUityZWdfYmFzZV9hZGo7CgoKCiAgIH0KZWxzZSBpZiggdGVzdGluZ19jaGFubmVsPT1DSEFOTkVMX0IpCiAgIHsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCiByZWdfYWRkPUREUjBfUFVCX0FDTURMUityZWdfYmFzZV9hZGo7CgoKCiAgIH0KIH0KCiByZWdfYWRkPUREUjBfUFVCX0FDTURMUityZWdfYmFzZV9hZGo7CgoKaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0FfUkVHX0JBU0UpCnsKcHJpbnRmKCJcbnRlc3QgQSBjaGFubmVsIDB4JTA4eFxuIixyZWdfYWRkKTsKIGFjX21kbHJfYV9vcmc9KHVuc2lnbmVkIGludCApKHJlYWRsKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQpKTsvL3JlYWRsKHJlZ19hZGQpOy8vMHhjODgzNjAwMAoJICAgYWNfbGNkbHJfYV9vcmc9KHVuc2lnbmVkIGludCApKHJlYWRsKCh1bnNpZ25lZCBpbnQgKShyZWdfYWRkK0REUjBfUFVCX0FDTENETFItRERSMF9QVUJfQUNNRExSKSkpOy8vcmVhZGwocmVnX2FkZCs0KTsKCWFjX2JkbHIwX2Ffb3JnPSh1bnNpZ25lZCBpbnQgKShyZWFkbCgodW5zaWduZWQgaW50ICkocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUikpKTsvL3JlYWRsKHJlZ19hZGQrOCk7CgoJcHJpbnRmKCJcbiBhY19tZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCksIGFjX21kbHJfYV9vcmcpOwoJcHJpbnRmKCJcbiBhY19sY2Rscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpLCBhY19sY2Rscl9hX29yZyk7CglwcmludGYoIlxuIGFjX2JkbHIwX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUiksIGFjX2JkbHIwX2Ffb3JnKTsKfQppZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQl9SRUdfQkFTRSkKewoKICBhY19tZGxyX2Jfb3JnPXJlYWRsKHJlZ19hZGQpOwoJICAgYWNfbGNkbHJfYl9vcmc9cmVhZGwocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUik7CglhY19iZGxyMF9iX29yZz1yZWFkbChyZWdfYWRkKzgpOwoJcHJpbnRmKCJcbiBhY19tZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCksIGFjX21kbHJfYl9vcmcpOwoJcHJpbnRmKCJcbiBhY19sY2Rscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpLCBhY19sY2Rscl9iX29yZyk7CglwcmludGYoIlxuIGFjX2JkbHIwX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUiksIGFjX2JkbHIwX2Jfb3JnKTsKfQoKCn0KCn0KCn0vLy8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nICB2YWx1ZQoKCmZvciAodGVzdF90aW1lcz0wOyh0ZXN0X3RpbWVzPHRlc3RfbG9vcCk7KHRlc3RfdGltZXMrKykpCnsKLy8vL3R1bmUgYW5kIHNhdmUgdHJhaW5pbmcgZHFzIHZhbHVlCmlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoKewpmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCnsKCmlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCnsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKfQplbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQp7CnJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7Cn0KZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQogewppZiAoIHRlc3RpbmdfY2hhbm5lbCA9PSBDSEFOTkVMX0EpCiAgIHsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKICAgfQplbHNlIGlmKCB0ZXN0aW5nX2NoYW5uZWw9PUNIQU5ORUxfQikKICAgewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwogICB9CiB9CgppZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQV9SRUdfQkFTRSkKewpwcmludGYoIlxudGVzdCBBIGNoYW5uZWwgQUNcbiIpOwp9CmVsc2UKewpwcmludGYoIlxudGVzdCBCIGNoYW5uZWwgQUNcbiIpOwp9CgoKewoKCiNkZWZpbmUgd3JyX3JlZyhhZGRyLCBkYXRhKQkoKigodm9sYXRpbGUgIHVuc2lnbmVkIGludCAgKikoKHVuc2lnbmVkIGxvbmcpKHVuc2lnbmVkIGludCApYWRkcikpKT0oZGF0YSkgIC8vd3JfcmVnKGFkZHIsIGRhdGEpCiNkZWZpbmUgcmRyX3JlZyhhZGRyKQkJICh1bnNpZ25lZCBpbnQgKSgqKCh2b2xhdGlsZSAgdW5zaWduZWQgaW50ICAqKSgodW5zaWduZWQgbG9uZykodW5zaWduZWQgaW50IClhZGRyKSkpICAvL3JkX3JlZyhhZGRyKQoJLy93cl9yZWcoRERSMF9QVUJfQUNCRExSMywgMHgwODA4KTsgIC8vY3MwIGNzMQoJLy93cl9yZWcoRERSMF9QVUJfQUNCRExSMCwgMHgxZik7ICAvL2NrMAoJIC8vCXdyX3JlZyhERFIwX1BVQl9BQ0JETFI0LCAweDA4MDgpOyAvL29kdDAgb2R0MQoJLy93cl9yZWcoRERSMF9QVUJfQUNCRExSNSwgMHgwODA4KTsgIC8vY2tlMCBja2UxCgoKCS8vd3JfcmVnKEREUjBfUFVCX0FDQkRMUjEsIDB4MTgxODE4KTsgLy9yYXMgY2FzIHdlCgkvL3dyX3JlZyhERFIwX1BVQl9BQ0JETFIyLCAweDE4MTgxOCk7IC8vYmEwIGJhMSBiYTIKCS8vd3JfcmVnKEREUjBfUFVCX0FDQkRMUjYsIDB4MTIxMjEyMTIpOyAvL2EwIGExIGEyIGEzCgkvL3dyX3JlZyhERFIwX1BVQl9BQ0JETFI3LCAweDBkMGQwZDBkKTsgLy9hNCBhNSBhNiBhNwoJLy93cl9yZWcoRERSMF9QVUJfQUNCRExSOCwgMHgxMDEwMTAxMCk7ICAvL2E4IGE5IGExMCBhMTEKCS8vd3JfcmVnKEREUjBfUFVCX0FDQkRMUjksIDB4MTgxODE4MTgpOyAgLy9hMTIgYTEzIGExNCBhMTUKCXJlZ19hZGQ9RERSMF9QVUJfSU9WQ1IwOwoJcmVnX3NlZWRfdmFsdWU9KHRyYWluaW5nX3NlZWR8KHRyYWluaW5nX3NlZWQ8PDgpfCh0cmFpbmluZ19zZWVkPDwxNil8KHRyYWluaW5nX3NlZWQ8PDI0KSk7Ci8vZm9yKCggIHRlbXBfaT0wKTsodGVtcF9pPDEwKTsoIHRlbXBfaSsrKSkKewovL3dyX3JlZygoRERSMF9QVUJfQUNCRExSMCt0ZW1wX2kqNCksCi8vYWNfYmRscl9yZWdfc2VlZF92YWx1ZSk7ICAvL2NzMCBjczEKLy9yZWdfYWRkPXJlZ19hZGQrdGVtcF9pKjQ7CgovL3JlZ19hZGQ9RERSMF9QVUJfQUNNRExSK3JlZ19iYXNlX2FkajsKLy9yZWdfYWRkPShERFIwX1BVQl9BQ0JETFIwK3RlbXBfaSo0KTsKcmVnX2FkZD1yZWdfYWRkK3JlZ19iYXNlX2FkajsKaW92cmVmX3RlbXBfdmFsdWU9cmRyX3JlZygodW5zaWduZWQgaW50IClyZWdfYWRkKTsKaW92cmVmX3RlbXBfdmFsdWU9KChpb3ZyZWZfdGVtcF92YWx1ZSkmMHhmZik7Ci8vCSBpb3ZyZWZfbGVmPTB4NDk7CmlmIChpb3ZyZWZfdGVtcF92YWx1ZSkKewogcHJpbnRmKCJcblxuIGlvdnJlZiAgb3JnICAgICAgICAgICAgICAgICAgICAgPT0weCUwOHggICAlMDhkbVZcbiIsaW92cmVmX3RlbXBfdmFsdWUsKCgoKChpb3ZyZWZfdGVtcF92YWx1ZSYwWDNGKSo3KSs0NDApKjMpLzIpKzEpOwp9CmVsc2UKewpwcmludGYoIlxuaW8gdnJlZiBwb3dlciBkb3duICx1c2UgZXh0ZXJuYWwgcmVzaXN0ZXIgXG4gIik7Cn0KCndycl9yZWcoKHJlZ19hZGQpLApyZWdfc2VlZF92YWx1ZSk7ICAvLwoKd3JyX3JlZygocmVnX2FkZCs0KSwKcmVnX3NlZWRfdmFsdWUpOyAgLy8KaW92cmVmX2xlZj10cmFpbmluZ19zZWVkOwppb3ZyZWZfcmlnPXRyYWluaW5nX3NlZWQ7Cn0KCnByaW50ZigiXG50cmFpbmluZ19zdGVwPT0weCUwOHhcbiAiLHRyYWluaW5nX3N0ZXApOwp7Cgp7CgoKaW92cmVmX3RlbXBfdmFsdWU9cmRyX3JlZygodW5zaWduZWQgaW50IClyZWdfYWRkKTsKaW92cmVmX3RlbXBfdmFsdWU9KChpb3ZyZWZfdGVtcF92YWx1ZSkmMHhmZik7CndoaWxlIChpb3ZyZWZfdGVtcF92YWx1ZT4weDQwKQp7CnRlbXBfdGVzdF9lcnJvcj0wOwppb3ZyZWZfdGVtcF92YWx1ZS0tOwoKcHJpbnRmKCJcbmlvdnJlZiBsZWYgdGVtcD09MHglMDh4XG4gIixpb3ZyZWZfdGVtcF92YWx1ZSk7Cgppb3ZyZWZfdGVtcF9yZWdfdmFsdWU9KGlvdnJlZl90ZW1wX3ZhbHVlfChpb3ZyZWZfdGVtcF92YWx1ZTw8OCl8KGlvdnJlZl90ZW1wX3ZhbHVlPDwxNil8KGlvdnJlZl90ZW1wX3ZhbHVlPDwyNCkpOzsKd3JyX3JlZygocmVnX2FkZCksCmlvdnJlZl90ZW1wX3JlZ192YWx1ZSk7ICAvLwoKd3JyX3JlZygocmVnX2FkZCtERFIwX1BVQl9JT1ZDUjEtRERSMF9QVUJfSU9WQ1IwKSwKaW92cmVmX3RlbXBfcmVnX3ZhbHVlKTsgIC8vCnByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLHJlZ19hZGQsaW92cmVmX3RlbXBfcmVnX3ZhbHVlKTsKdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CglpZiAodGVtcF90ZXN0X2Vycm9yKQoJCXsKCQlwcmludGYoIlxudnJlZiBkb3duIGVkZ2UgZGV0ZWN0IFxuIik7CgkJaW92cmVmX3RlbXBfdmFsdWUrKzsKCQlicmVhazsKCQl9Cn0KCnByaW50ZigiXG4gZG93biBlZGdlIGRldGVjdCBcbiIpOwpwcmludGYoIlxuXG4gaW92cmVmICAgICAgICAgICAgICAgICAgICAgICBkb3duIGVkZ2U9PTB4JTA4eFxuICIsaW92cmVmX3RlbXBfdmFsdWUpOwppb3ZyZWZfbGVmPWlvdnJlZl90ZW1wX3ZhbHVlOwoKd3JyX3JlZygocmVnX2FkZCksCnJlZ19zZWVkX3ZhbHVlKTsgIC8vCgp3cnJfcmVnKChyZWdfYWRkK0REUjBfUFVCX0lPVkNSMS1ERFIwX1BVQl9JT1ZDUjApLApyZWdfc2VlZF92YWx1ZSk7ICAvLwoKaW92cmVmX3RlbXBfdmFsdWU9cmRyX3JlZygodW5zaWduZWQgaW50IClyZWdfYWRkKTsKaW92cmVmX3RlbXBfdmFsdWU9KChpb3ZyZWZfdGVtcF92YWx1ZSkmMHhmZik7CgoKd2hpbGUgKGlvdnJlZl90ZW1wX3ZhbHVlPDB4N2YpCnsKdGVtcF90ZXN0X2Vycm9yPTA7CmlvdnJlZl90ZW1wX3ZhbHVlKys7CgpwcmludGYoIlxuaW92cmVmIGxlZiB0ZW1wPT0weCUwOHhcbiAiLGlvdnJlZl90ZW1wX3ZhbHVlKTsKCmlvdnJlZl90ZW1wX3JlZ192YWx1ZT0oaW92cmVmX3RlbXBfdmFsdWV8KGlvdnJlZl90ZW1wX3ZhbHVlPDw4KXwoaW92cmVmX3RlbXBfdmFsdWU8PDE2KXwoaW92cmVmX3RlbXBfdmFsdWU8PDI0KSk7Owp3cnJfcmVnKChyZWdfYWRkKSwKaW92cmVmX3RlbXBfcmVnX3ZhbHVlKTsgIC8vCgp3cnJfcmVnKChyZWdfYWRkK0REUjBfUFVCX0lPVkNSMS1ERFIwX1BVQl9JT1ZDUjApLAppb3ZyZWZfdGVtcF9yZWdfdmFsdWUpOyAgLy8KcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIscmVnX2FkZCxpb3ZyZWZfdGVtcF9yZWdfdmFsdWUpOwoKICAgdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CglpZiAodGVtcF90ZXN0X2Vycm9yKQoJCXsKCQlwcmludGYoIlxudnJlZiB1cCBlZGdlIGRldGVjdCBcbiIpOwoJCWlvdnJlZl90ZW1wX3ZhbHVlLS07CgkJYnJlYWs7CgkJfQp9CgpwcmludGYoIlxuIHVwIGVkZ2UgZGV0ZWN0IFxuIik7CnByaW50ZigiXG5cbiBpb3ZyZWYgICAgICAgICAgICAgICAgICAgICAgIHVwIGVkZ2U9PTB4JTA4eFxuICIsaW92cmVmX3RlbXBfdmFsdWUpOwppb3ZyZWZfcmlnPWlvdnJlZl90ZW1wX3ZhbHVlOwoKLy9yZWdfc2VlZF92YWx1ZT0weDQ5NDk0OTQ5Cndycl9yZWcoKHJlZ19hZGQpLAoweDQ5NDk0OTQ5KTsgIC8vCgp3cnJfcmVnKChyZWdfYWRkK0REUjBfUFVCX0lPVkNSMS1ERFIwX1BVQl9JT1ZDUjApLAoweDQ5NDk0OTQ5KTsgIC8vCgoKCgp9Cn0KCnByaW50ZigiXG5cbiBpb3ZyZWYgICAgICAgICAgICAgICAgICAgICAgIGRvd24gZWRnZT09MHglMDh4ICAgJTA4ZG1WXG4iLGlvdnJlZl9sZWYsKCgoKChpb3ZyZWZfbGVmJjBYM0YpKjcpKzQ0MCkqMykvMikrMSk7CnByaW50ZigiXG5cbiBpb3ZyZWYgICAgICAgICAgICAgICAgICAgICAgICAgdXAgZWRnZT09MHglMDh4ICAgJTA4ZG1WXG4iLGlvdnJlZl9yaWcsKCgoKChpb3ZyZWZfcmlnJjBYM0YpKjcpKzQ0MCkqMykvMikrMSk7CnByaW50ZigiXG5cbiBpb3ZyZWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlkID09MHglMDh4ICAgJTA4ZG1WXG4iLAoJKGlvdnJlZl9sZWYraW92cmVmX3JpZykvMiwoKCgoKCgoaW92cmVmX2xlZitpb3ZyZWZfcmlnKS8yKSYwWDNGKSo3KSs0NDApKjMpLzIpKzEpOwppZiAoaW92cmVmX2xlZiA9PSAweDQwKQp7CnByaW50ZigiXG5cbiBpb3ZyZWYgICBkb3duIGVkZ2UgcmVhY2ggIHJlZyBsaW1pdGVkXG4iKTsKfQoKCgoKCgoKCgoKCgoKCgoJCX0KCgoKfQoKCgoKCgp9Cgp9CgoKCgogcmV0dXJuIDA7Cgp1c2FnZToKCWNtZF91c2FnZShjbWR0cCk7CglyZXR1cm4gMTsKCn0KVV9CT09UX0NNRCgKCWRkcl90dW5lX2Rkcl92cmVmLAk3LAkxLAlkb19kZHJfdGVzdF92cmVmLAoJIkREUiB0dW5lIHZyZWYgZnVuY3Rpb24gZGRyX3R1bmVfZGRyX3ZyZWYgIGEgMCAweDgwMDAwMDAgIDEgNDggMSIsCgkiZGRyX3R1bmVfZGRyX3ZyZWYgIGEgMCAweDgwMDAwMDAgIDEgc2VlZCBzdGVwIFxuIGRjYWNoZSBvZmYgPyBcbiIKKTsKCgppbnQgZG9fZGRyNF90ZXN0X3BoeV92cmVmKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoKCSNpZiAoIENPTkZJR19ERFJfUEhZPj1QX0REUl9QSFlfOTA1WCkKLy8gdW5zaWduZWQgaW50ICBzdGFydF9hZGRyPXRlc3Rfc3RhcnRfYWRkcjsKICAgcHJpbnRmKCJcbkVudGVyIFRlc3QgZGRyNCBwaHkgdnJlZiBmdW5jdGlvblxuIik7CiAvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CiAgcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoKCiAvLyAgdW5zaWduZWQgaW50ICAgbG9vcCA9IDE7Ci8vICAgdW5zaWduZWQgaW50ICAgdGVtcF9jb3VudF9pID0gMTsKLy8gICB1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2o9IDE7Ci8vICAgIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaz0gMTsKICAgdW5zaWduZWQgaW50ICAgdGVtcF90ZXN0X2Vycm9yPSAwOwogIGludCB0cmFpbmluZ19zZWVkPTA7CiAgaW50IHRyYWluaW5nX3N0ZXA9MDsKCgkgY2hhciAqZW5kcDsKIC8vICB1bnNpZ25lZCBpbnQgICAqcF9zdGFydF9hZGRyOwogIHVuc2lnbmVkIGludCAgIHRlc3Rfc29jX2RyYW09MDsKIC8vICB1bnNpZ25lZCBpbnQgICB0ZXN0X3RpbWVzPTE7CiAgIHVuc2lnbmVkIGludCAgIHJlZ19hZGQ9MDsKICAgdW5zaWduZWQgaW50ICAgcmVnX2Jhc2VfYWRqPTA7CgkJICB1bnNpZ25lZCBpbnQgICBjaGFubmVsX2FfZW4gPSAwOwoJICAgdW5zaWduZWQgaW50ICAgY2hhbm5lbF9iX2VuID0gMDsKCSAgIHVuc2lnbmVkIGludCAgIHRlc3RpbmdfY2hhbm5lbCA9IDA7CgkgICB1bnNpZ25lZCBpbnQgICBkeG5sY2RscjNbNF07CgkgICB1bnNpZ25lZCBpbnQgICBkeG5sY2RscjRbNF07CgoKCSAgI2RlZmluZSAgQ0hBTk5FTF9BICAwCgkgICNkZWZpbmUgIENIQU5ORUxfQiAgMQoKCgoKCgoJICNkZWZpbmUgIEREUl9DT1JTU19UQUxLX1RFU1RfU0laRSAgIDB4MjAwMDAKICAgI2RlZmluZSBERFIwX1BVQl9SRUdfQkFTRQkJCQkJMHhjODgzNjAwMAogICAjZGVmaW5lIEREUjBfUFVCX0RYMEdDUjQgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFjNCAgPDwgMiApICkKICAgI2RlZmluZSBERFIwX1BVQl9EWDFHQ1I0ICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIwNCAgPDwgMiApICkKICAgI2RlZmluZSBERFIwX1BVQl9EWDJHQ1I0ICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNDQgIDw8IDIgKSApCiAgICNkZWZpbmUgRERSMF9QVUJfRFgzR0NSNCAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4Mjg0ICA8PCAyICkgKQogICAjZGVmaW5lIEREUjBfUFVCX0RYMEdDUjUgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFjNSAgPDwgMiApICkKICAgI2RlZmluZSBERFIwX1BVQl9EWDFHQ1I1ICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMDUgIDw8IDIgKSApCiAgICNkZWZpbmUgRERSMF9QVUJfRFgyR0NSNSAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjQ1ICA8PCAyICkgKQogICAjZGVmaW5lIEREUjBfUFVCX0RYM0dDUjUgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI4NSAgPDwgMiApICkKCgoKCSAgICB1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgoJLy8gICB1bnNpZ25lZCBpbnQgICBhY19iZGxyX2xlZlsxMF07CgkvLyAgIHVuc2lnbmVkIGludCAgIGFjX2JkbHJfcmlnWzEwXTsKCSAgICBpbnQgICBpb3ZyZWZfdGVtcF92YWx1ZTsKCSAgICAgaW50ICAgaW92cmVmX3RlbXBfcmVnX3ZhbHVlOwoJLy8gICAgdW5zaWduZWQgaW50ICByZWdfc2VlZF92YWx1ZTsKLy8JICAgdW5zaWduZWQgaW50ICAgdGVtcF9yZWdfdmFsdWU7CiBpbnQgICBpb3ZyZWZfb3JnWzRdOwoJICAgICAgaW50ICAgaW92cmVmX2xlZls0XTsKCQkgICBpbnQgICBpb3ZyZWZfcmlnWzRdOwoJICAvLyAgdW5zaWduZWQgaW50ICAgdGVtcF90ZXN0X2Vycm9yOwoJLy8JdW5zaWduZWQgaW50IHRlbXBfaT0wOwoJLy8JdW5zaWduZWQgaW50IHRlbXBfaj0wOwoJCS8vdW5zaWduZWQgaW50IHJlZ19hZGQ9MDsKLy8JCXN0YXRpYyB1bnNpZ25lZCBpbnQgdHJhaW5pbmdfZW5hYmxlZD0xOwoKLy8JIGlvdnJlZl9sZWY9MHg0OTsKLy8gcHJpbnRmKCJcblxuIGlvdnJlZiAgb3JnICAgICAgICAgICAgICAgICAgICAgPT0weCUwOHggICAlMDhkbVZcbiIsaW92cmVmX2xlZiwoKCgoKGlvdnJlZl9sZWYmMFgzRikqNykrNDQwKSozKS8yKSsxKTsKLy8jZGVmaW5lIEREUl9URVNUX0FDTENETFIKCgoJIGlmIChhcmdjID09IDIpCgkJewogICAgaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkpCgoJe2NoYW5uZWxfYV9lbiA9IDE7Cgl9CgllbHNlIGlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApKQoKCXtjaGFubmVsX2JfZW4gPSAxOwoJfQoJZWxzZQoJCXsKCWdvdG8gdXNhZ2U7CgkJfQoJCX0KCQlpZiAoYXJnYyA+IDIpCgkJewogICAgaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkEiKSA9PSAwKSkKCgl7Y2hhbm5lbF9hX2VuID0gMTsKCX0KICAgICBpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJCIikgPT0gMCkpCgoJe2NoYW5uZWxfYl9lbiA9IDE7Cgl9CgkJCX0KCQkgICBkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwogIGlmIChhcmdjID4zKSB7CglkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgJmVuZHAsIDE2KTsKICAgICAgICBpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJCX0KCgl9CiAgICBpZiAoYXJnYyA+NCkgewoJdGVzdF9zb2NfZHJhbSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNF0sICZlbmRwLCAxNik7CiAgICAgICAgaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQl0ZXN0X3NvY19kcmFtID0gMDsKCQkJfQoJaWYgKCAgdGVzdF9zb2NfZHJhbSApCgkJICB0ZXN0X3NvY19kcmFtID0gMTsKCgl9Cgl0cmFpbmluZ19zZWVkID0gMDsKCSAgICBpZiAoYXJnYyA+NSkgewogICB0cmFpbmluZ19zZWVkID0gc2ltcGxlX3N0cnRvdWwoYXJndls1XSwgJmVuZHAsIDE2KTsKICAgICAgICBpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCXRyYWluaW5nX3NlZWQgPTA7Ly8gMHgyZTsKCQkJfQoKCgl9CgppZiAodHJhaW5pbmdfc2VlZD4weDNmKQoJdHJhaW5pbmdfc2VlZD0weDNmOwoKIHByaW50ZigiXG5cbiBpb3ZyZWYgIHRyYWluaW5nX3NlZWQgICAgICAgICAgICAgPT0weCUwOHggICAlMDhkbVZcbiIsdHJhaW5pbmdfc2VlZCwoKCgoKCh0cmFpbmluZ19zZWVkJjBYM0YpKjcpKzQ0MCkqMykvMikrMSkqMTIvMTUpOwoKIHRyYWluaW5nX3N0ZXAgPSAwOwoJCQlpZiAoYXJnYyA+NikgewoJdHJhaW5pbmdfc3RlcCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNl0sICZlbmRwLCAxNik7CiAgICAgICAgaWYgKCphcmd2WzZdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQl0cmFpbmluZ19zdGVwID0gMDsKCQkJfQoKCgoJfQoJCQkgaW50IHZyZWZfYWxsPTA7CgkJCSAgICBpZiAoYXJnYyA+NykgewogICB2cmVmX2FsbCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbN10sICZlbmRwLCAxNik7CiAgICAgICAgaWYgKCphcmd2WzddID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQl2cmVmX2FsbCA9MDsvLyAweDJlOwoJCQl9fQoJCQkJCSBpbnQgdnJlZl9sY2Rscl9vZmZzZXQ9MDsKCQkJICAgIGlmIChhcmdjID44KSB7CiAgIHZyZWZfbGNkbHJfb2Zmc2V0ID0gc2ltcGxlX3N0cnRvdWwoYXJndls4XSwgJmVuZHAsIDE2KTsKICAgICAgICBpZiAoKmFyZ3ZbOF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdnJlZl9sY2Rscl9vZmZzZXQgPTA7CgkJCX19CgkgaW50IHZyZWZfc2V0X3Rlc3Rfc3RlcD0wOwoJCQkgICAgaWYgKGFyZ2MgPjkpIHsKICAgdnJlZl9zZXRfdGVzdF9zdGVwID0gc2ltcGxlX3N0cnRvdWwoYXJndls5XSwgJmVuZHAsIDE2KTsKICAgICAgICBpZiAoKmFyZ3ZbOV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdnJlZl9zZXRfdGVzdF9zdGVwID0wOwoJCQl9fQoKCQl1bnNpZ25lZCBpbnQgc29jX2RyYW1faGV4X2RlYz0wOwppZiAoYXJnYyA+MTApCnsKCXNvY19kcmFtX2hleF9kZWMgPSBzaW1wbGVfc3RydG91bChhcmd2WzEwXSwgJmVuZHAsIDApOwoJaWYgKCphcmd2WzEwXSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQlzb2NfZHJhbV9oZXhfZGVjID0gMDsKCX0KfQppZiAoc29jX2RyYW1faGV4X2RlYykKewogICAgaWYgKGFyZ2MgPjUpIHsKICAgdHJhaW5pbmdfc2VlZCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNV0sICZlbmRwLCAwKTsKICAgICAgICBpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCXRyYWluaW5nX3NlZWQgPTA7Ly8gMHgyZTsKCQkJfQogcHJpbnRmKCJcbnRyYWluaW5nX3NlZWQ9PSAweCUwOHhcbiIsIHRyYWluaW5nX3NlZWQpOwoKCX0KaWYgKHRyYWluaW5nX3NlZWQ8NDUpCgl0cmFpbmluZ19zZWVkPTQ1OwppZiAodHJhaW5pbmdfc2VlZD44OCkKCXRyYWluaW5nX3NlZWQ9ODg7CnRyYWluaW5nX3NlZWQgPSgoKHRyYWluaW5nX3NlZWQqMTAwMC00NDA3MCkvNjk4KSk7CgoKIHByaW50ZigiXG5cbiBpb3ZyZWYgIHRyYWluaW5nX3NlZWQgICAgICAgICAgICAgPT0weCUwOHggICAlMDhkbVZcbiIsdHJhaW5pbmdfc2VlZCwoKCgoKCh0cmFpbmluZ19zZWVkJjBYM0YpKjcpKzQ0MCkqMykvMikrMSkqMTIvMTUpOwp9CgkJIHByaW50ZigiXG5jaGFubmVsX2FfZW49PSAweCUwOHhcbiIsIGNoYW5uZWxfYV9lbik7CgkJIHByaW50ZigiXG5jaGFubmVsX2JfZW49PSAweCUwOHhcbiIsIGNoYW5uZWxfYl9lbik7CgkJICBwcmludGYoIlxuZGRyX3Rlc3Rfc2l6ZT09IDB4JTA4eFxuIiwgZGRyX3Rlc3Rfc2l6ZSk7CgkJICAgcHJpbnRmKCJcbnRlc3Rfc29jX2RyYW09PSAweCUwOHhcbiIsIHRlc3Rfc29jX2RyYW0pOwoJCSAgICAgIHByaW50ZigiXG52cmVmX2FsbD09IDB4JTA4eFxuIiwgdnJlZl9hbGwpOwoJCQkgICAgcHJpbnRmKCJcbnZyZWZfbGNkbHJfb2Zmc2V0PT0gMHglMDh4XG4iLCB2cmVmX2xjZGxyX29mZnNldCk7CgkJCQkJICAgIHByaW50ZigiXG5zb2NfZHJhbV9oZXhfZGVjPT0gMHglMDh4XG4iLCBzb2NfZHJhbV9oZXhfZGVjKTsKaWYgKCBjaGFubmVsX2FfZW4pCnsKLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpOwp9CmlmICggY2hhbm5lbF9iX2VuKQp7Ck9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKTsKLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKfQoKLy9zYXZlIGFuZCBwcmludCBvcmcgdHJhaW5pbmcgZHFzIHZhbHVlCmlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQp7CgkvL2RjYWNoZV9kaXNhYmxlKCk7CiAvL3NlcmlhbF9wdXRzKCJcbmRlYnVnIGZvciBkZHJ0ZXN0ICxqaWF4aW5nIGRpc2FibGUgZGNhY2hlIik7Cn0vLy8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nICB2YWx1ZQoKCgp7Ci8vLy90dW5lIGFuZCBzYXZlIHRyYWluaW5nIGRxcyB2YWx1ZQppZiAoY2hhbm5lbF9hX2VuIHx8IGNoYW5uZWxfYl9lbikKCnsKZm9yICgodGVzdGluZ19jaGFubmVsPTApOyh0ZXN0aW5nX2NoYW5uZWw8KGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pKTsodGVzdGluZ19jaGFubmVsKyspKQp7CgppZiAoKCBjaGFubmVsX2FfZW4pICYmICggY2hhbm5lbF9iX2VuID09IDApKQp7CnJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7Cn0KZWxzZSBpZigoIGNoYW5uZWxfYl9lbikmJiggY2hhbm5lbF9hX2VuPT0wKSkKewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwp9CmVsc2UgaWYgKChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKT09MikKIHsKaWYgKCB0ZXN0aW5nX2NoYW5uZWwgPT0gQ0hBTk5FTF9BKQogICB7CnJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CiAgIH0KZWxzZSBpZiggdGVzdGluZ19jaGFubmVsPT1DSEFOTkVMX0IpCiAgIHsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKICAgfQogfQoKaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0FfUkVHX0JBU0UpCnsKcHJpbnRmKCJcbnRlc3QgQSBjaGFubmVsIGRhdGEgbGFuZVxuIik7Cn0KZWxzZQp7CnByaW50ZigiXG50ZXN0IEIgY2hhbm5lbCBkYXRhIGxhbmVcbiIpOwp9CgoKewoKCiNkZWZpbmUgd3JyX3JlZyhhZGRyLCBkYXRhKQkoKigodm9sYXRpbGUgIHVuc2lnbmVkIGludCAgKikoKHVuc2lnbmVkIGxvbmcpKHVuc2lnbmVkIGludCApYWRkcikpKT0oZGF0YSkgIC8vd3JfcmVnKGFkZHIsIGRhdGEpCiNkZWZpbmUgcmRyX3JlZyhhZGRyKQkJICh1bnNpZ25lZCBpbnQgKSgqKCh2b2xhdGlsZSAgdW5zaWduZWQgaW50ICAqKSgodW5zaWduZWQgbG9uZykodW5zaWduZWQgaW50IClhZGRyKSkpICAvL3JkX3JlZyhhZGRyKQoJICAgdW5zaWduZWQgaW50ICAgZHhubWRscj0wOwoJcmVnX2FkZD1ERFIwX1BVQl9EWDBNRExSMCtyZWdfYmFzZV9hZGo7CglkeG5tZGxyPSgocmRyX3JlZygodW5zaWduZWQgaW50IClyZWdfYWRkKSk+PjE2KSYweDFmZjsKLy8JcmVnX3NlZWRfdmFsdWU9KHRyYWluaW5nX3NlZWR8KDB4MDw8OCl8KDB4MDw8MTYpfCgweDA8PDI0KSk7Cndycl9yZWcoKCgoRERSMF9QVUJfRFgwR0NSNCkpKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMEdDUjQpKSkmKH4oMTw8MjgpKSl8KDc8PDI1KXwoMHhmPDwyKSk7Cndycl9yZWcoKCgoRERSMF9QVUJfRFgxR0NSNCkpKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMUdDUjQpKSkmKH4oMTw8MjgpKSl8KDc8PDI1KXwoMHhmPDwyKSk7Cndycl9yZWcoKCgoRERSMF9QVUJfRFgyR0NSNCkpKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMkdDUjQpKSkmKH4oMTw8MjgpKSl8KDc8PDI1KXwoMHhmPDwyKSk7Cndycl9yZWcoKCgoRERSMF9QVUJfRFgzR0NSNCkpKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYM0dDUjQpKSkmKH4oMTw8MjgpKSl8KDc8PDI1KXwoMHhmPDwyKSk7CnByaW50ZigiXG5ERFIwX1BVQl9EWDBHQ1I0PT0weCUwOHhcbiAiLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDBHQ1I0KSkpKTsKcHJpbnRmKCJcbkREUjBfUFVCX0RYMUdDUjQ9PTB4JTA4eFxuICIsKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMUdDUjQpKSkpOwpwcmludGYoIlxuRERSMF9QVUJfRFgyR0NSND09MHglMDh4XG4gIiwocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgyR0NSNCkpKSk7CnByaW50ZigiXG5ERFIwX1BVQl9EWDNHQ1I0PT0weCUwOHhcbiAiLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDNHQ1I0KSkpKTsKCnByaW50ZigiXG5keG5tZGxyPT0weCUwOHhcbiAiLGR4bm1kbHIpOwoJICAgdW5zaWduZWQgaW50ICAgdGVtcF9pPTA7CnVuc2lnbmVkIGludCAgIHRlbXBfaV9tYXg9NDsKZm9yICgoICB0ZW1wX2k9MCk7KHRlbXBfaTw0KTsoIHRlbXBfaSsrKSkKewpkeG5sY2RscjNbdGVtcF9pXT0ocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopK3RlbXBfaSooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpKSk7CmR4bmxjZGxyNFt0ZW1wX2ldPShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrdGVtcF9pKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSkpKTsKcmVnX2FkZD1ERFIwX1BVQl9EWDBHQ1I1K3JlZ19iYXNlX2Fkait0ZW1wX2kqKEREUjBfUFVCX0RYMUdDUjUtRERSMF9QVUJfRFgwR0NSNSk7CmlvdnJlZl90ZW1wX3ZhbHVlPXJkcl9yZWcoKHVuc2lnbmVkIGludCApcmVnX2FkZCk7CmlvdnJlZl9vcmdbdGVtcF9pXT1pb3ZyZWZfdGVtcF92YWx1ZTsKaW92cmVmX3RlbXBfdmFsdWU9KChpb3ZyZWZfdGVtcF92YWx1ZSkmMHhmZik7CnByaW50ZigiXG5keG5sY2RscjNbJTA4eF09PTB4JTA4eCxkeG5sY2RscjRbJTA4eF09PTB4JTA4eFxuICIsdGVtcF9pLGR4bmxjZGxyM1t0ZW1wX2ldLHRlbXBfaSxkeG5sY2RscjRbdGVtcF9pXSk7Ci8vCSBpb3ZyZWZfbGVmPTB4NDk7CmlmIChpb3ZyZWZfdGVtcF92YWx1ZSkKewogcHJpbnRmKCJyZWdfYWRkPT0weCUwOHgsdmFsdWU9PTB4JTA4eCwgaW92cmVmICBvcmcgPT0weCUwOHggICAlMDhkbVZcbiIscmVnX2FkZCwKCWlvdnJlZl9vcmdbdGVtcF9pXSxpb3ZyZWZfdGVtcF92YWx1ZSwoKCgoKChpb3ZyZWZfdGVtcF92YWx1ZSYwWDNGKSo3KSs0NDApKjMpLzIpKzEpKjEyLzE1KTsKfQplbHNlCnsKcHJpbnRmKCJcbmlvIHZyZWYgcG93ZXIgZG93biAsdXNlIGV4dGVybmFsIHJlc2lzdGVyIFxuICIpOwp9Cgp3cnJfcmVnKChyZWdfYWRkKSwKaW92cmVmX29yZ1t0ZW1wX2ldKTsgIC8vCmlvdnJlZl9sZWZbdGVtcF9pXT0oaW92cmVmX29yZ1t0ZW1wX2ldKSYweGZmOwppb3ZyZWZfcmlnW3RlbXBfaV09KGlvdnJlZl9vcmdbdGVtcF9pXSkmMHhmZjsKaWYgKHRyYWluaW5nX3NlZWQpCntpb3ZyZWZfbGVmW3RlbXBfaV09dHJhaW5pbmdfc2VlZDsKaW92cmVmX3JpZ1t0ZW1wX2ldPXRyYWluaW5nX3NlZWQ7Cgp9Cn0KCnByaW50ZigiXG50cmFpbmluZ19zdGVwPT0weCUwOHhcbiAiLHRyYWluaW5nX3N0ZXApOwppZiAodnJlZl9hbGwpCnt0ZW1wX2lfbWF4PTE7Cn0KZm9yICgoICB0ZW1wX2k9MCk7KHRlbXBfaTx0ZW1wX2lfbWF4KTsoIHRlbXBfaSsrKSkKewpyZWdfYWRkPUREUjBfUFVCX0RYMEdDUjUrcmVnX2Jhc2VfYWRqK3RlbXBfaSooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KTsKCgppZiAodHJhaW5pbmdfc2VlZCkKewp3cnJfcmVnKChyZWdfYWRkKSwKKHRyYWluaW5nX3NlZWR8KChpb3ZyZWZfb3JnW3RlbXBfaV0pJjB4ZmZmZmZmMDApKSk7CmlmICh2cmVmX2FsbCkgewoJd3JyX3JlZygoKHJlZ19hZGQrMSooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KSkpLAoodHJhaW5pbmdfc2VlZHwoKGlvdnJlZl9vcmdbdGVtcF9pKzFdKSYweGZmZmZmZjAwKSkpOyAgLy8Kd3JyX3JlZygoKHJlZ19hZGQrMiooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KSkpLAoodHJhaW5pbmdfc2VlZHwoKGlvdnJlZl9vcmdbdGVtcF9pKzJdKSYweGZmZmZmZjAwKSkpOyAgLy8Kd3JyX3JlZygoKHJlZ19hZGQrMyooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KSkpLAoodHJhaW5pbmdfc2VlZHwoKGlvdnJlZl9vcmdbdGVtcF9pKzNdKSYweGZmZmZmZjAwKSkpOyAgLy8KfQp9Cgp7Cgppb3ZyZWZfdGVtcF92YWx1ZT1yZHJfcmVnKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQpOwppb3ZyZWZfdGVtcF92YWx1ZT0oKGlvdnJlZl90ZW1wX3ZhbHVlKSYweGZmKTsKCndoaWxlIChpb3ZyZWZfdGVtcF92YWx1ZT4weDApCnsKaWYgKHZyZWZfc2V0X3Rlc3Rfc3RlcCkKewpwcmludGYoIlxudnJlZl9zZXRfdGVzdF9zdGVwPT0weCUwOHgsc2tpcCB0ZXN0IGxlZnQgZWRnZVxuICIsdnJlZl9zZXRfdGVzdF9zdGVwKTsKYnJlYWs7Cn0KdGVtcF90ZXN0X2Vycm9yPTA7CmlvdnJlZl90ZW1wX3ZhbHVlPWlvdnJlZl90ZW1wX3ZhbHVlLXRyYWluaW5nX3N0ZXA7CmlmIChpb3ZyZWZfdGVtcF92YWx1ZTx0cmFpbmluZ19zdGVwKQoJaW92cmVmX3RlbXBfdmFsdWU9MDsKcHJpbnRmKCJcbmlvdnJlZiBsZWYgdGVtcD09MHglMDh4XG4gIixpb3ZyZWZfdGVtcF92YWx1ZSk7Cgppb3ZyZWZfdGVtcF9yZWdfdmFsdWU9KGlvdnJlZl90ZW1wX3ZhbHVlfCgoaW92cmVmX29yZ1t0ZW1wX2ldKSYweGZmZmZmZjAwKSk7Cndycl9yZWcoKHJlZ19hZGQpLAppb3ZyZWZfdGVtcF9yZWdfdmFsdWUpOyAgLy8KaWYgKHZyZWZfYWxsKSB7Cndycl9yZWcoKHJlZ19hZGQrMSooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KSksCmlvdnJlZl90ZW1wX3JlZ192YWx1ZSk7ICAvLwp3cnJfcmVnKChyZWdfYWRkKzIqKEREUjBfUFVCX0RYMUdDUjUtRERSMF9QVUJfRFgwR0NSNSkpLAppb3ZyZWZfdGVtcF9yZWdfdmFsdWUpOyAgLy8Kd3JyX3JlZygocmVnX2FkZCszKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSwKaW92cmVmX3RlbXBfcmVnX3ZhbHVlKTsgIC8vCn0KcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIscmVnX2FkZCxpb3ZyZWZfdGVtcF9yZWdfdmFsdWUpOwpwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwocmVnX2FkZCsxKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSxpb3ZyZWZfdGVtcF9yZWdfdmFsdWUpOwpwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwocmVnX2FkZCsyKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSxpb3ZyZWZfdGVtcF9yZWdfdmFsdWUpOwpwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwocmVnX2FkZCszKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSxpb3ZyZWZfdGVtcF9yZWdfdmFsdWUpOwp0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7Cgl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCWlmICh2cmVmX2xjZGxyX29mZnNldCkKCQl7CnsKd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaiksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSkpK3ZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwp3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCmlmICh2cmVmX2FsbCkgewp3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAooKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSkpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8Kd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCigocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSkpK3ZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwp3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAooKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSkpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8Kd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCigocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSkpK3ZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwp9CnByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMCooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMCooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpKSkpOwoJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSkpKSk7CglwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSkpKTsKCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpKSkpOwoJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMCooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMCooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpKSkpOwoJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSkpKSk7CglwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSkpKTsKCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpKSkpOwogdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgoJCXsKewp3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjNbMF0pOyAgLy8Kd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaiksZHhubGNkbHI0WzBdKTsgIC8vCmlmICh2cmVmX2FsbCkgewp3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLApkeG5sY2RscjNbMV0pOyAgLy8Kd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKZHhubGNkbHIzWzJdKTsgIC8vCndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCmR4bmxjZGxyM1szXSk7ICAvLwp3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLApkeG5sY2RscjRbMV0pOyAgLy8Kd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKZHhubGNkbHI0WzJdKTsgIC8vCndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCmR4bmxjZGxyNFszXSk7ICAvLwp9CgoJCX0KCQl9CgoJCX0KCgkJfQoKCWlmICh2cmVmX2xjZGxyX29mZnNldCkKCQl7CnsKd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaiksKGR4bmxjZGxyM1swXS12cmVmX2xjZGxyX29mZnNldCkpOyAgLy8Kd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaiksKGR4bmxjZGxyNFswXS12cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KaWYgKHZyZWZfYWxsKSB7Cndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCihkeG5sY2RscjNbMV0tdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCihkeG5sY2RscjNbMl0tdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCihkeG5sY2RscjNbM10tdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCihkeG5sY2RscjRbMV0tdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCihkeG5sY2RscjRbMl0tdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCihkeG5sY2RscjRbM10tdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCn0KcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSswKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSswKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSkpKSk7CglwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSkpKTsKCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpKSkpOwoJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSkpKSk7CgkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSswKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSswKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSkpKSk7CglwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSkpKTsKCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpKSkpOwoJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSkpKSk7CiB0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCgkJewp7Cndycl9yZWcoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopLGR4bmxjZGxyM1swXSk7ICAvLwp3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjRbMF0pOyAgLy8KaWYgKHZyZWZfYWxsKSB7Cndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCmR4bmxjZGxyM1sxXSk7ICAvLwp3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLApkeG5sY2RscjNbMl0pOyAgLy8Kd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKZHhubGNkbHIzWzNdKTsgIC8vCndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCmR4bmxjZGxyNFsxXSk7ICAvLwp3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLApkeG5sY2RscjRbMl0pOyAgLy8Kd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKZHhubGNkbHI0WzNdKTsgIC8vCn0KCgkJfQoJCX0KCgkJfQoKCQl9CglpZiAodGVtcF90ZXN0X2Vycm9yKQoJCXsKCQlwcmludGYoIlxudnJlZiBkb3duIGVkZ2UgZGV0ZWN0IFxuIik7CgkJaW92cmVmX3RlbXBfdmFsdWU9aW92cmVmX3RlbXBfdmFsdWUrdHJhaW5pbmdfc3RlcDsKCQlicmVhazsKCQl9Cn0KCnByaW50ZigiXG4gZG93biBlZGdlIGRldGVjdCBcbiIpOwpwcmludGYoIlxuXG4gaW92cmVmICAgICAgICAgICAgICAgICAgICAgICBkb3duIGVkZ2U9PTB4JTA4eFxuICIsaW92cmVmX3RlbXBfdmFsdWUpOwppb3ZyZWZfbGVmW3RlbXBfaV09aW92cmVmX3RlbXBfdmFsdWU7Cgp3cnJfcmVnKChyZWdfYWRkKSwKaW92cmVmX29yZ1t0ZW1wX2ldKTsgIC8vCmlmICh2cmVmX2FsbCkgewoJd3JyX3JlZygoKHJlZ19hZGQrMSooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KSkpLAppb3ZyZWZfb3JnW3RlbXBfaSsxXSk7ICAvLwp3cnJfcmVnKCgocmVnX2FkZCsyKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSksCmlvdnJlZl9vcmdbdGVtcF9pKzJdKTsgIC8vCndycl9yZWcoKChyZWdfYWRkKzMqKEREUjBfUFVCX0RYMUdDUjUtRERSMF9QVUJfRFgwR0NSNSkpKSwKaW92cmVmX29yZ1t0ZW1wX2krM10pOyAgLy8KfQoKaWYgKHZyZWZfbGNkbHJfb2Zmc2V0KQoJCXsKewp3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjNbMF0pOyAgLy8Kd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaiksZHhubGNkbHI0WzBdKTsgIC8vCmlmICh2cmVmX2FsbCkgewp3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLApkeG5sY2RscjNbMV0pOyAgLy8Kd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKZHhubGNkbHIzWzJdKTsgIC8vCndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCmR4bmxjZGxyM1szXSk7ICAvLwp3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLApkeG5sY2RscjRbMV0pOyAgLy8Kd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKZHhubGNkbHI0WzJdKTsgIC8vCndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCmR4bmxjZGxyNFszXSk7ICAvLwp9CgoJCX0KCQl9Cn0KCgp7CmlmICh0cmFpbmluZ19zZWVkKQp7Cndycl9yZWcoKHJlZ19hZGQpLAoodHJhaW5pbmdfc2VlZHwoKGlvdnJlZl9vcmdbdGVtcF9pXSkmMHhmZmZmZmYwMCkpKTsKaWYgKHZyZWZfYWxsKSB7Cgl3cnJfcmVnKCgocmVnX2FkZCsxKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSksCih0cmFpbmluZ19zZWVkfCgoaW92cmVmX29yZ1t0ZW1wX2krMV0pJjB4ZmZmZmZmMDApKSk7ICAvLwp3cnJfcmVnKCgocmVnX2FkZCsyKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSksCih0cmFpbmluZ19zZWVkfCgoaW92cmVmX29yZ1t0ZW1wX2krMl0pJjB4ZmZmZmZmMDApKSk7ICAvLwp3cnJfcmVnKCgocmVnX2FkZCszKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSksCih0cmFpbmluZ19zZWVkfCgoaW92cmVmX29yZ1t0ZW1wX2krM10pJjB4ZmZmZmZmMDApKSk7ICAvLwp9Cn0KCmlvdnJlZl90ZW1wX3ZhbHVlPXJkcl9yZWcoKHVuc2lnbmVkIGludCApcmVnX2FkZCk7CmlvdnJlZl90ZW1wX3ZhbHVlPSgoaW92cmVmX3RlbXBfdmFsdWUpJjB4ZmYpOwoKCndoaWxlIChpb3ZyZWZfdGVtcF92YWx1ZTwweDNmKQp7CnRlbXBfdGVzdF9lcnJvcj0wOwppb3ZyZWZfdGVtcF92YWx1ZT1pb3ZyZWZfdGVtcF92YWx1ZSt0cmFpbmluZ19zdGVwOwppZiAoaW92cmVmX3RlbXBfdmFsdWU+MHgzZikKCWlvdnJlZl90ZW1wX3ZhbHVlPTB4M2Y7CnByaW50ZigiXG5pb3ZyZWYgcmlnIHRlbXA9PTB4JTA4eFxuICIsaW92cmVmX3RlbXBfdmFsdWUpOwoKaW92cmVmX3RlbXBfcmVnX3ZhbHVlPShpb3ZyZWZfdGVtcF92YWx1ZXwoKGlvdnJlZl9vcmdbdGVtcF9pXSkmMHhmZmZmZmYwMCkpOwp3cnJfcmVnKChyZWdfYWRkKSwKaW92cmVmX3RlbXBfcmVnX3ZhbHVlKTsgIC8vCmlmICh2cmVmX2FsbCkgewp3cnJfcmVnKChyZWdfYWRkKzEqKEREUjBfUFVCX0RYMUdDUjUtRERSMF9QVUJfRFgwR0NSNSkpLAppb3ZyZWZfdGVtcF9yZWdfdmFsdWUpOyAgLy8Kd3JyX3JlZygocmVnX2FkZCsyKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSwKaW92cmVmX3RlbXBfcmVnX3ZhbHVlKTsgIC8vCndycl9yZWcoKHJlZ19hZGQrMyooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KSksCmlvdnJlZl90ZW1wX3JlZ192YWx1ZSk7ICAvLwp9CgpwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIixyZWdfYWRkLGlvdnJlZl90ZW1wX3JlZ192YWx1ZSk7CnByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLChyZWdfYWRkKzEqKEREUjBfUFVCX0RYMUdDUjUtRERSMF9QVUJfRFgwR0NSNSkpLGlvdnJlZl90ZW1wX3JlZ192YWx1ZSk7CnByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLChyZWdfYWRkKzIqKEREUjBfUFVCX0RYMUdDUjUtRERSMF9QVUJfRFgwR0NSNSkpLGlvdnJlZl90ZW1wX3JlZ192YWx1ZSk7CnByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLChyZWdfYWRkKzMqKEREUjBfUFVCX0RYMUdDUjUtRERSMF9QVUJfRFgwR0NSNSkpLGlvdnJlZl90ZW1wX3JlZ192YWx1ZSk7CgogICB0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7Cgl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCWlmICh2cmVmX2xjZGxyX29mZnNldCkKCQl7CnsKd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaiksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSkpK3ZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwp3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCmlmICh2cmVmX2FsbCkgewp3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAooKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSkpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8Kd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCigocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSkpK3ZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwp3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAooKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSkpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8Kd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCigocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSkpK3ZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwp9CnByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMCooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMCooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpKSkpOwoJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSkpKSk7CglwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSkpKTsKCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpKSkpOwoJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMCooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMCooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpKSkpOwoJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSkpKSk7CglwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSkpKTsKCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpKSkpOwogdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKewp7Cndycl9yZWcoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopLGR4bmxjZGxyM1swXSk7ICAvLwp3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjRbMF0pOyAgLy8KaWYgKHZyZWZfYWxsKSB7Cndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCmR4bmxjZGxyM1sxXSk7ICAvLwp3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLApkeG5sY2RscjNbMl0pOyAgLy8Kd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKZHhubGNkbHIzWzNdKTsgIC8vCndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCmR4bmxjZGxyNFsxXSk7ICAvLwp3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLApkeG5sY2RscjRbMl0pOyAgLy8Kd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKZHhubGNkbHI0WzNdKTsgIC8vCn0KCgkJfQoJCX0KCgkJfQoKCQl9CgoJCWlmICh2cmVmX2xjZGxyX29mZnNldCkKCQl7CnsKd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaiksKGR4bmxjZGxyM1swXS12cmVmX2xjZGxyX29mZnNldCkpOyAgLy8Kd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaiksKGR4bmxjZGxyNFswXS12cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KaWYgKHZyZWZfYWxsKSB7Cndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCihkeG5sY2RscjNbMV0tdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCihkeG5sY2RscjNbMl0tdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCihkeG5sY2RscjNbM10tdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCihkeG5sY2RscjRbMV0tdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCihkeG5sY2RscjRbMl0tdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCihkeG5sY2RscjRbM10tdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCn0KcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSswKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSswKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSkpKSk7CglwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSkpKTsKCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpKSkpOwoJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSkpKSk7CgkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSswKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSswKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSkpKSk7CglwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSkpKTsKCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpKSkpOwoJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSkpKSk7CiB0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCgkJewp7Cndycl9yZWcoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopLGR4bmxjZGxyM1swXSk7ICAvLwp3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjRbMF0pOyAgLy8KaWYgKHZyZWZfYWxsKSB7Cndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCmR4bmxjZGxyM1sxXSk7ICAvLwp3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLApkeG5sY2RscjNbMl0pOyAgLy8Kd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKZHhubGNkbHIzWzNdKTsgIC8vCndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCmR4bmxjZGxyNFsxXSk7ICAvLwp3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLApkeG5sY2RscjRbMl0pOyAgLy8Kd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKZHhubGNkbHI0WzNdKTsgIC8vCn0KCgkJfQoJCX0KCgkJfQoKCQl9CgoJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQl7CgkJcHJpbnRmKCJcbnZyZWYgdXAgZWRnZSBkZXRlY3QgXG4iKTsKCQlpb3ZyZWZfdGVtcF92YWx1ZT1pb3ZyZWZfdGVtcF92YWx1ZS10cmFpbmluZ19zdGVwOwoJCWJyZWFrOwoJCX0KfQoKcHJpbnRmKCJcbiB1cCBlZGdlIGRldGVjdCBcbiIpOwpwcmludGYoIlxuXG4gaW92cmVmICAgICAgICAgICAgICAgICAgICAgICB1cCBlZGdlPT0weCUwOHhcbiAiLGlvdnJlZl90ZW1wX3ZhbHVlKTsKaW92cmVmX3JpZ1t0ZW1wX2ldPWlvdnJlZl90ZW1wX3ZhbHVlOwoKd3JyX3JlZygocmVnX2FkZCksCmlvdnJlZl9vcmdbdGVtcF9pXSk7ICAvLwppZiAodnJlZl9hbGwpIHsKCXdycl9yZWcoKChyZWdfYWRkKzEqKEREUjBfUFVCX0RYMUdDUjUtRERSMF9QVUJfRFgwR0NSNSkpKSwKaW92cmVmX29yZ1t0ZW1wX2krMV0pOyAgLy8Kd3JyX3JlZygoKHJlZ19hZGQrMiooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KSkpLAppb3ZyZWZfb3JnW3RlbXBfaSsyXSk7ICAvLwp3cnJfcmVnKCgocmVnX2FkZCszKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSksCmlvdnJlZl9vcmdbdGVtcF9pKzNdKTsgIC8vCn0KCmlmICh2cmVmX2xjZGxyX29mZnNldCkKCQl7CnsKd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaiksZHhubGNkbHIzWzBdKTsgIC8vCndycl9yZWcoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopLGR4bmxjZGxyNFswXSk7ICAvLwppZiAodnJlZl9hbGwpIHsKd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKZHhubGNkbHIzWzFdKTsgIC8vCndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCmR4bmxjZGxyM1syXSk7ICAvLwp3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLApkeG5sY2RscjNbM10pOyAgLy8Kd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKZHhubGNkbHI0WzFdKTsgIC8vCndycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCmR4bmxjZGxyNFsyXSk7ICAvLwp3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLApkeG5sY2RscjRbM10pOyAgLy8KfQoKCQl9CgkJfQoKCn0KfS8vIHZkZHE9MS41dgpwcmludGYoIlxuXG4gaW92cmVmICB2ZGRxPTEuMnYsaWYgdXNlIG90aGVyIHZkZHEgLHBsZWFzZSByZWNvdW50XG4iKTsKZm9yICgoICB0ZW1wX2k9MCk7KHRlbXBfaTw0KTsoIHRlbXBfaSsrKSkKewpwcmludGYoIlxuXG4gaW92cmVmICBsYW5lX3g9MHglMDh4LCAgICAgb3JnPT0weCUwOHggICAlMDhkbVZcbiIsdGVtcF9pLGlvdnJlZl9vcmdbdGVtcF9pXSwoKCgoKChpb3ZyZWZfb3JnW3RlbXBfaV0mMFgzRikqNykrNDQwKSozKS8yKSsxKSoxMi8xNSk7CnByaW50ZigiXG5cbiBpb3ZyZWYgIGxhbmVfeD0weCUwOHgsICAgICBkb3duIGVkZ2U9PTB4JTA4eCAgICUwOGRtVlxuIix0ZW1wX2ksaW92cmVmX2xlZlt0ZW1wX2ldLCgoKCgoKGlvdnJlZl9sZWZbdGVtcF9pXSYwWDNGKSo3KSs0NDApKjMpLzIpKzEpKjEyLzE1KTsKcHJpbnRmKCJcblxuIGlvdnJlZiAgbGFuZV94PTB4JTA4eCwgICAgIHVwIGVkZ2U9PTB4JTA4eCAgICUwOGRtVlxuIix0ZW1wX2ksaW92cmVmX3JpZ1t0ZW1wX2ldLCgoKCgoKGlvdnJlZl9yaWdbdGVtcF9pXSYwWDNGKSo3KSs0NDApKjMpLzIpKzEpKjEyLzE1KTsKcHJpbnRmKCJcblxuIGlvdnJlZiAgbGFuZV94PTB4JTA4eCwgICAgIG1pZCA9PTB4JTA4eCAgICUwOGRtVlxuIix0ZW1wX2ksCgkoaW92cmVmX2xlZlt0ZW1wX2ldK2lvdnJlZl9yaWdbdGVtcF9pXSkvMiwoKCgoKCgoKGlvdnJlZl9sZWZbdGVtcF9pXStpb3ZyZWZfcmlnW3RlbXBfaV0pLzIpJjBYM0YpKjcpKzQ0MCkqMykvMikrMSkqMTIvMTUpOwppZiAoaW92cmVmX2xlZlt0ZW1wX2ldID09IDB4MCkKewpwcmludGYoIlxuXG4gaW92cmVmICAgZG93biBlZGdlIHJlYWNoICByZWcgbGltaXRlZFxuIik7Cn0KaWYgKGlvdnJlZl9yaWdbdGVtcF9pXSA9PSAweDNmKQp7CnByaW50ZigiXG5cbiBpb3ZyZWYgICB1cCBlZGdlIHJlYWNoICByZWcgbGltaXRlZFxuIik7Cn0KfQoKCgoKCgoKCgoKCgoKCgkJfQoKCgp9CgoKCgoKCn0KCn0KCgoKCiByZXR1cm4gMDsKCnVzYWdlOgoJY21kX3VzYWdlKGNtZHRwKTsKCSNlbmRpZgoJcmV0dXJuIDE7Cgp9Ci8vKi8KCmludCBkb19kZHI0X3Rlc3RfZHJhbV92cmVmKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewojaWYgKCBDT05GSUdfRERSX1BIWT49UF9ERFJfUEhZXzkwNVgpCi8vIHVuc2lnbmVkIGludCAgc3RhcnRfYWRkcj10ZXN0X3N0YXJ0X2FkZHI7CiAgIHByaW50ZigiXG5FbnRlciBUZXN0IGRkcjQgZHJhbSB2cmVmIGZ1bmN0aW9uXG4iKTsKIC8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKICBwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CgoKIC8vICB1bnNpZ25lZCBpbnQgICBsb29wID0gMTsKLy8gICB1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2kgPSAxOwovLyAgIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaj0gMTsKLy8gICAgdW5zaWduZWQgaW50ICAgdGVtcF9jb3VudF9rPSAxOwogICB1bnNpZ25lZCBpbnQgICB0ZW1wX3Rlc3RfZXJyb3I9IDA7CiAgaW50IHRyYWluaW5nX3NlZWQ9MDsKICBpbnQgdHJhaW5pbmdfc3RlcD0wOwoKCSBjaGFyICplbmRwOwogLy8gIHVuc2lnbmVkIGludCAgICpwX3N0YXJ0X2FkZHI7CiAgdW5zaWduZWQgaW50ICAgdGVzdF9jbGVhcj0wOwogLy8gIHVuc2lnbmVkIGludCAgIHRlc3RfdGltZXM9MTsKICAgdW5zaWduZWQgaW50ICAgcmVnX2FkZD0wOwogICB1bnNpZ25lZCBpbnQgICByZWdfYmFzZV9hZGo9MDsKCQkgIHVuc2lnbmVkIGludCAgIGNoYW5uZWxfYV9lbiA9IDA7CgkgICB1bnNpZ25lZCBpbnQgICBjaGFubmVsX2JfZW4gPSAwOwoJICAgdW5zaWduZWQgaW50ICAgdGVzdGluZ19jaGFubmVsID0gMDsKCSAgIHVuc2lnbmVkIGludCAgIGR4bmxjZGxyMVs0XTsKCSAvLyAgdW5zaWduZWQgaW50ICAgZHhubGNkbHI0WzRdOwoKCgkgICNkZWZpbmUgIENIQU5ORUxfQSAgMAoJICAjZGVmaW5lICBDSEFOTkVMX0IgIDEKCgoJICNkZWZpbmUgIEREUl9DT1JTU19UQUxLX1RFU1RfU0laRSAgIDB4MjAwMDAKICAgI2RlZmluZSBERFIwX1BVQl9SRUdfQkFTRQkJCQkJMHhjODgzNjAwMAogICAjZGVmaW5lIEREUjBfUFVCX0RYMEdDUjQgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFjNCAgPDwgMiApICkKICAgI2RlZmluZSBERFIwX1BVQl9EWDFHQ1I0ICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIwNCAgPDwgMiApICkKICAgI2RlZmluZSBERFIwX1BVQl9EWDJHQ1I0ICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNDQgIDw8IDIgKSApCiAgICNkZWZpbmUgRERSMF9QVUJfRFgzR0NSNCAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4Mjg0ICA8PCAyICkgKQogICAjZGVmaW5lIEREUjBfUFVCX0RYMEdDUjUgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFjNSAgPDwgMiApICkKICAgI2RlZmluZSBERFIwX1BVQl9EWDFHQ1I1ICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMDUgIDw8IDIgKSApCiAgICNkZWZpbmUgRERSMF9QVUJfRFgyR0NSNSAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjQ1ICA8PCAyICkgKQogICAjZGVmaW5lIEREUjBfUFVCX0RYM0dDUjUgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI4NSAgPDwgMiApICkKCgoKCSAgICB1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgoJLy8gICB1bnNpZ25lZCBpbnQgICBhY19iZGxyX2xlZlsxMF07CgkvLyAgIHVuc2lnbmVkIGludCAgIGFjX2JkbHJfcmlnWzEwXTsKCSAgICBpbnQgICBpb3ZyZWZfdGVtcF92YWx1ZTsKCS8vICAgICBpbnQgICBpb3ZyZWZfdGVtcF9yZWdfdmFsdWU7CgkvLyAgICB1bnNpZ25lZCBpbnQgIHJlZ19zZWVkX3ZhbHVlOwovLwkgICB1bnNpZ25lZCBpbnQgICB0ZW1wX3JlZ192YWx1ZTsKIGludCAgIGlvdnJlZl9vcmc7CiBpbnQgICBpb3ZyZWZfbGVmOwogaW50ICAgaW92cmVmX3JpZzsKIGludCAgIGlvdnJlZl9taWQ7CiBpbnQgICBpb3ZyZWZfdGVzdF9yZWFkOwogaW50ICAgaW92cmVmX3Rlc3Rfc3RlcDsKCSAgLy8gIHVuc2lnbmVkIGludCAgIHRlbXBfdGVzdF9lcnJvcjsKCS8vCXVuc2lnbmVkIGludCB0ZW1wX2k9MDsKCS8vCXVuc2lnbmVkIGludCB0ZW1wX2o9MDsKCQkvL3Vuc2lnbmVkIGludCByZWdfYWRkPTA7Ci8vCQlzdGF0aWMgdW5zaWduZWQgaW50IHRyYWluaW5nX2VuYWJsZWQ9MTsKCi8vCSBpb3ZyZWZfbGVmPTB4NDk7Ci8vIHByaW50ZigiXG5cbiBpb3ZyZWYgIG9yZyAgICAgICAgICAgICAgICAgICAgID09MHglMDh4ICAgJTA4ZG1WXG4iLGlvdnJlZl9sZWYsKCgoKChpb3ZyZWZfbGVmJjBYM0YpKjcpKzQ0MCkqMykvMikrMSk7Ci8vI2RlZmluZSBERFJfVEVTVF9BQ0xDRExSCgoKCSBpZiAoYXJnYyA9PSAyKQoJCXsKICAgIGlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApKQoKCXtjaGFubmVsX2FfZW4gPSAxOwoJfQoJZWxzZSBpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCl8fChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSkKCgl7Y2hhbm5lbF9iX2VuID0gMTsKCX0KCWVsc2UKCQl7Cglnb3RvIHVzYWdlOwoJCX0KCQl9CgkJaWYgKGFyZ2MgPiAyKQoJCXsKICAgIGlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJBIikgPT0gMCkpCgoJe2NoYW5uZWxfYV9lbiA9IDE7Cgl9CiAgICAgaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQiIpID09IDApKQoKCXtjaGFubmVsX2JfZW4gPSAxOwoJfQoJCQl9CgkJICAgZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKICBpZiAoYXJnYyA+MykgewoJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sICZlbmRwLCAxNik7CiAgICAgICAgaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQlkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJCQl9CgoJfQogICAgaWYgKGFyZ2MgPjQpIHsKCXRlc3RfY2xlYXIgPSBzaW1wbGVfc3RydG91bChhcmd2WzRdLCAmZW5kcCwgMTYpOwogICAgICAgIGlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJdGVzdF9jbGVhciA9IDA7CgkJCX0KCWlmICggIHRlc3RfY2xlYXIgKQoJCSAgdGVzdF9jbGVhciA9IDE7CgoJfQoJdHJhaW5pbmdfc2VlZCA9IDA7CgkgICAgaWYgKGFyZ2MgPjUpIHsKICAgdHJhaW5pbmdfc2VlZCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNV0sICZlbmRwLCAxNik7CiAgICAgICAgaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQl0cmFpbmluZ19zZWVkID0wOy8vIDB4MmU7CgkJCX0KCgoJfQoKCgoKCiB0cmFpbmluZ19zdGVwID0gMDsKCQkJaWYgKGFyZ2MgPjYpIHsKCXRyYWluaW5nX3N0ZXAgPSBzaW1wbGVfc3RydG91bChhcmd2WzZdLCAmZW5kcCwgMTYpOwogICAgICAgIGlmICgqYXJndls2XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJdHJhaW5pbmdfc3RlcCA9IDA7CgkJCX0KCgl9CgkJCWlmICghdHJhaW5pbmdfc3RlcCkKCQkJCXRyYWluaW5nX3N0ZXA9MTsKCQkJIGludCB2cmVmX2FsbD0wOwoJCQkgICAgaWYgKGFyZ2MgPjcpIHsKICAgdnJlZl9hbGwgPSBzaW1wbGVfc3RydG91bChhcmd2WzddLCAmZW5kcCwgMTYpOwogICAgICAgIGlmICgqYXJndls3XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJdnJlZl9hbGwgPTA7Ly8gMHgyZTsKCQkJfX0KCQkJCQkgaW50IHZyZWZfbGNkbHJfb2Zmc2V0PTA7CgkJCSAgICBpZiAoYXJnYyA+OCkgewogICB2cmVmX2xjZGxyX29mZnNldCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbOF0sICZlbmRwLCAxNik7CiAgICAgICAgaWYgKCphcmd2WzhdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXZyZWZfbGNkbHJfb2Zmc2V0ID0wOwoJCQl9fQoJCQkJCQkJIGludCB2cmVmX3NldF90ZXN0X3N0ZXA9MDsKCQkJICAgIGlmIChhcmdjID45KSB7CiAgIHZyZWZfc2V0X3Rlc3Rfc3RlcCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbOV0sICZlbmRwLCAxNik7CiAgICAgICAgaWYgKCphcmd2WzldID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXZyZWZfc2V0X3Rlc3Rfc3RlcCA9MDsKCQkJfX0KCQkJCQkJCQkJIGludCB2cmVmX2RyYW1fcmFuZ2U9MDsKCQkJICAgIGlmIChhcmdjID4xMCkgewogICB2cmVmX2RyYW1fcmFuZ2UgPSBzaW1wbGVfc3RydG91bChhcmd2WzEwXSwgJmVuZHAsIDE2KTsKICAgICAgICBpZiAoKmFyZ3ZbMTBdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXZyZWZfZHJhbV9yYW5nZSA9MDsKCQkJfX0KCgoJCSBwcmludGYoIlxuY2hhbm5lbF9hX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2FfZW4pOwoJCSBwcmludGYoIlxuY2hhbm5lbF9iX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2JfZW4pOwoJCSAgcHJpbnRmKCJcbmRkcl90ZXN0X3NpemU9PSAweCUwOHhcbiIsIGRkcl90ZXN0X3NpemUpOwoJCSAgIHByaW50ZigiXG50ZXN0X2NsZWFyPT0gMHglMDh4XG4iLCB0ZXN0X2NsZWFyKTsKCQkgICAgICBwcmludGYoIlxudnJlZl9hbGw9PSAweCUwOHhcbiIsIHZyZWZfYWxsKTsKCQkJICAgIHByaW50ZigiXG52cmVmX2xjZGxyX29mZnNldD09IDB4JTA4eFxuIiwgdnJlZl9sY2Rscl9vZmZzZXQpOwoJCQkJICBwcmludGYoIlxudnJlZl9kcmFtX3JhbmdlPT0gMHglMDh4XG4iLCB2cmVmX2RyYW1fcmFuZ2UpOwoKCQkJCQkJdW5zaWduZWQgaW50IHNvY19kcmFtX2hleF9kZWM9MDsKaWYgKGFyZ2MgPjExKQp7Cglzb2NfZHJhbV9oZXhfZGVjID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxMV0sICZlbmRwLCAxNik7CglpZiAoKmFyZ3ZbMTFdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCXNvY19kcmFtX2hleF9kZWMgPSAwOwoJfQp9CmlmIChzb2NfZHJhbV9oZXhfZGVjKQp7CiAgICBpZiAoYXJnYyA+NSkgewogICB0cmFpbmluZ19zZWVkID0gc2ltcGxlX3N0cnRvdWwoYXJndls1XSwgJmVuZHAsIDApOwogICAgICAgIGlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJdHJhaW5pbmdfc2VlZCA9MDsvLyAweDJlOwoJCQl9CgoKCX0KCn0KIGlmICh0cmFpbmluZ19zZWVkKQp7CmlmIChzb2NfZHJhbV9oZXhfZGVjKQp7CmlmICh2cmVmX2RyYW1fcmFuZ2UpCnsKaWYgKHRyYWluaW5nX3NlZWQ8NDUpCgl0cmFpbmluZ19zZWVkPTQ1OwppZiAodHJhaW5pbmdfc2VlZD43NykKCXRyYWluaW5nX3NlZWQ9Nzc7CnRyYWluaW5nX3NlZWQgPSgoKCgodHJhaW5pbmdfc2VlZCoxMDAwLTQ1MDAwKS82NTApPjBYMzIpPygwWDMyKTooKCh0cmFpbmluZ19zZWVkKjEwMDAtNDUwMDApLzY1MCkpKSk7Cn0KaWYgKHZyZWZfZHJhbV9yYW5nZSA9PSAwKQp7CmlmICh0cmFpbmluZ19zZWVkPDYwKQoJdHJhaW5pbmdfc2VlZD02MDsKaWYgKHRyYWluaW5nX3NlZWQ+OTIpCgl0cmFpbmluZ19zZWVkPTkyOwp0cmFpbmluZ19zZWVkID0oKCgoKHRyYWluaW5nX3NlZWQqMTAwMC02MDAwMCkvNjUwKT4wWDMyKT8oMFgzMik6KCgodHJhaW5pbmdfc2VlZCoxMDAwLTYwMDAwKS82NTApKSkpOwp9Cn0KaWYgKHZyZWZfZHJhbV9yYW5nZSA9PSAwKQogcHJpbnRmKCJcblxuIGlvdnJlZiAgdHJhaW5pbmdfc2VlZCAgICAgICAgICAgICA9PTB4JTA4eCAgICUwOGRtVlxuIix0cmFpbmluZ19zZWVkLCgoKCgodHJhaW5pbmdfc2VlZCYwWDNGKSo2NSkrNjAwMCkqMTIwMCkvMTAwMDApKTsKZWxzZQpwcmludGYoIlxuXG4gaW92cmVmICB0cmFpbmluZ19zZWVkICAgICAgICAgICAgID09MHglMDh4ICAgJTA4ZG1WXG4iLHRyYWluaW5nX3NlZWQsKCgoKCh0cmFpbmluZ19zZWVkJjBYM0YpKjY1KSs0NTAwKSoxMjAwKS8xMDAwMCkpOwp9CmlmICggY2hhbm5lbF9hX2VuKQp7Ci8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7Ck9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKTsKfQppZiAoIGNoYW5uZWxfYl9lbikKewpPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCk7Ci8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7Cn0KCi8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nIGRxcyB2YWx1ZQppZiAoY2hhbm5lbF9hX2VuIHx8IGNoYW5uZWxfYl9lbikKewoJLy9kY2FjaGVfZGlzYWJsZSgpOwogLy9zZXJpYWxfcHV0cygiXG5kZWJ1ZyBmb3IgZGRydGVzdCAsamlheGluZyBkaXNhYmxlIGRjYWNoZSIpOwp9Ly8vL3NhdmUgYW5kIHByaW50IG9yZyB0cmFpbmluZyAgdmFsdWUKCgoKewovLy8vdHVuZSBhbmQgc2F2ZSB0cmFpbmluZyBkcXMgdmFsdWUKaWYgKGNoYW5uZWxfYV9lbiB8fCBjaGFubmVsX2JfZW4pCgp7CmZvciAoKHRlc3RpbmdfY2hhbm5lbD0wKTsodGVzdGluZ19jaGFubmVsPChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKSk7KHRlc3RpbmdfY2hhbm5lbCsrKSkKewoKaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwp9CmVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCnsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKfQplbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCiB7CmlmICggdGVzdGluZ19jaGFubmVsID09IENIQU5ORUxfQSkKICAgewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwogICB9CmVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQogICB7CnJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CiAgIH0KIH0KCmlmIChyZWdfYmFzZV9hZGogPT0gQ0hBTk5FTF9BX1JFR19CQVNFKQp7CnByaW50ZigiXG50ZXN0IEEgY2hhbm5lbCBkYXRhIGxhbmVcbiIpOwp9CmVsc2UKewpwcmludGYoIlxudGVzdCBCIGNoYW5uZWwgZGF0YSBsYW5lXG4iKTsKfQoKCnsKCgojZGVmaW5lIHdycl9yZWcoYWRkciwgZGF0YSkJKCooKHZvbGF0aWxlICB1bnNpZ25lZCBpbnQgICopKCh1bnNpZ25lZCBsb25nKSh1bnNpZ25lZCBpbnQgKWFkZHIpKSk9KGRhdGEpICAvL3dyX3JlZyhhZGRyLCBkYXRhKQojZGVmaW5lIHJkcl9yZWcoYWRkcikJCSAodW5zaWduZWQgaW50ICkoKigodm9sYXRpbGUgIHVuc2lnbmVkIGludCAgKikoKHVuc2lnbmVkIGxvbmcpKHVuc2lnbmVkIGludCApYWRkcikpKSAgLy9yZF9yZWcoYWRkcikKCSAgIHVuc2lnbmVkIGludCAgIGR4bm1kbHI9MDsKCXJlZ19hZGQ9RERSMF9QVUJfRFgwTURMUjArcmVnX2Jhc2VfYWRqOwoJZHhubWRscj0oKHJkcl9yZWcoKHVuc2lnbmVkIGludCApcmVnX2FkZCkpPj4xNikmMHgxZmY7Ci8vCXJlZ19zZWVkX3ZhbHVlPSh0cmFpbmluZ19zZWVkfCgweDA8PDgpfCgweDA8PDE2KXwoMHgwPDwyNCkpOwpwcmludGYoIlxuZHhubWRscj09MHglMDh4XG4gIixkeG5tZGxyKTsKLy90dXJuIG9mZiBkZHI0IHBoeSByZWFkIHZyZWYgZ2F0ZSxvbmx5IG91dHB1dCBhYyBsYW5lIHZyZWYKd3JyX3JlZygoKChERFIwX1BVQl9EWDBHQ1I0KSkpLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgwR0NSNCkpKSYofigxPDwyOCkpKXwoNzw8MjUpfCgweGY8PDIpKTsKd3JyX3JlZygoKChERFIwX1BVQl9EWDFHQ1I0KSkpLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgxR0NSNCkpKSYofigxPDwyOCkpKXwoNzw8MjUpfCgweGY8PDIpKTsKd3JyX3JlZygoKChERFIwX1BVQl9EWDJHQ1I0KSkpLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgyR0NSNCkpKSYofigxPDwyOCkpKXwoNzw8MjUpfCgweGY8PDIpKTsKd3JyX3JlZygoKChERFIwX1BVQl9EWDNHQ1I0KSkpLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgzR0NSNCkpKSYofigxPDwyOCkpKXwoNzw8MjUpfCgweGY8PDIpKTsKd3JyX3JlZygoKChERFIwX1BVQl9JT1ZDUjApKSksMHgwMDA5MDkwOXwoMHgwZjw8MjQpKTsKd3JyX3JlZygoKChERFIwX1BVQl9JT1ZDUjEpKSksMHgxMDkpOwpwcmludGYoIlxuRERSMF9QVUJfRFgwR0NSND09MHglMDh4XG4gIiwocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgwR0NSNCkpKSk7CnByaW50ZigiXG5ERFIwX1BVQl9EWDFHQ1I0PT0weCUwOHhcbiAiLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDFHQ1I0KSkpKTsKcHJpbnRmKCJcbkREUjBfUFVCX0RYMkdDUjQ9PTB4JTA4eFxuICIsKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMkdDUjQpKSkpOwpwcmludGYoIlxuRERSMF9QVUJfRFgzR0NSND09MHglMDh4XG4gIiwocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgzR0NSNCkpKSk7CnByaW50ZigiXG5ERFIwX1BVQl9JT1ZDUjA9PTB4JTA4eFxuICIsKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0lPVkNSMCkpKSk7CnByaW50ZigiXG5ERFIwX1BVQl9JT1ZDUjE9PTB4JTA4eFxuICIsKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0lPVkNSMSkpKSk7CgkgICB1bnNpZ25lZCBpbnQgICB0ZW1wX2k9MDsKLy91bnNpZ25lZCBpbnQgICB0ZW1wX2lfbWF4PTQ7Ly9ERFIwX1BVQl9NUjYKZm9yICgoICB0ZW1wX2k9MCk7KHRlbXBfaTw0KTsoIHRlbXBfaSsrKSkKewpkeG5sY2RscjFbdGVtcF9pXT0ocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopK3RlbXBfaSooRERSMF9QVUJfRFgxTENETFIxLUREUjBfUFVCX0RYMExDRExSMSkpKSk7CgpwcmludGYoIlxucmVnPT0weCUwOHgsZHhubGNkbHIxWyUwOHhdPT0weCUwOHhcbiAiLAoJKChERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSt0ZW1wX2kqKEREUjBfUFVCX0RYMUxDRExSMS1ERFIwX1BVQl9EWDBMQ0RMUjEpKSwKCXRlbXBfaSxkeG5sY2RscjFbdGVtcF9pXSk7Cgp9CgoKaW92cmVmX3RlbXBfdmFsdWU9cmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgwR0NSNikpOwppZiAoKGlvdnJlZl90ZW1wX3ZhbHVlJjB4M2YpID09IDB4MDkpCnsKLy9pb3ZyZWZfdGVtcF92YWx1ZT1yZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9NUjYpKTsKfQppb3ZyZWZfb3JnPShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoUFJFR19TVElDS1lfUkVHOCkpKSkmMHhmZjsKaW92cmVmX3Rlc3RfcmVhZD0ocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX01SNikpKSkmMHgzZjsKcHJpbnRmKCJQUkVHX1NUSUNLWV9SRUc4PT0weCUwOHhcbiAiLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoUFJFR19TVElDS1lfUkVHOCkpKSkpOwpwcmludGYoIkREUjBfUFVCX01SNj09MHglMDh4XG4gIiwocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX01SNikpKSkpOwpwcmludGYoIkREUjBfUFVCX0RYMEdDUjY9PTB4JTA4eFxuICIsKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBHQ1I2KSkpKSk7CmlmICgoKGlvdnJlZl9vcmcpID09IDApIHx8ICh0ZXN0X2NsZWFyKSkKewoKaW92cmVmX29yZz1pb3ZyZWZfdGVtcF92YWx1ZSYweDNmOwppb3ZyZWZfbGVmPWlvdnJlZl9vcmc7CmlvdnJlZl9yaWc9aW92cmVmX29yZzsKaW92cmVmX3Rlc3Rfc3RlcD0wOwoKaWYgKHRyYWluaW5nX3NlZWQpCnsKaW92cmVmX29yZz10cmFpbmluZ19zZWVkJjB4M2Y7CmlvdnJlZl9sZWY9aW92cmVmX29yZzsKaW92cmVmX3JpZz1pb3ZyZWZfb3JnOwppb3ZyZWZfdGVzdF9zdGVwPTA7Cgp9CmlmICh2cmVmX2RyYW1fcmFuZ2UgPT0gMCkKIHByaW50ZigiXG5cbiBpb3ZyZWYgIHRyYWluaW5nX3NlZWQgICAgICAgICAgICAgPT0weCUwOHggICAlMDhkbVZcbiIsdHJhaW5pbmdfc2VlZCwoKCgoKHRyYWluaW5nX3NlZWQmMFgzRikqNjUpKzYwMDApKjEyMDApLzEwMDAwKSk7CmVsc2UKcHJpbnRmKCJcblxuIGlvdnJlZiAgdHJhaW5pbmdfc2VlZCAgICAgICAgICAgICA9PTB4JTA4eCAgICUwOGRtVlxuIix0cmFpbmluZ19zZWVkLCgoKCgodHJhaW5pbmdfc2VlZCYwWDNGKSo2NSkrNDUwMCkqMTIwMCkvMTAwMDApKTsKd3JyX3JlZygoUFJFR19TVElDS1lfUkVHOCksaW92cmVmX29yZ3woaW92cmVmX2xlZjw8OCl8KChpb3ZyZWZfcmlnPDwxNikpfChpb3ZyZWZfdGVzdF9zdGVwPDwyNCkpOwp9CgpwcmludGYoIlBSRUdfU1RJQ0tZX1JFRzg9PTB4JTA4eFxuICIsKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChQUkVHX1NUSUNLWV9SRUc4KSkpKSk7CnsKCWlmICgoKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfTVI2KSkpKT4+NikmMSkgPT0gMCkKCQl7CiBwcmludGYoInJlZ19hZGQ9PTB4JTA4eCx2YWx1ZT09MHglMDh4LCBpb3ZyZWYgIG9yZyA9PTB4JTA4eCAgICUwOGRtVlxuIixERFIwX1BVQl9NUjYsCglpb3ZyZWZfdGVtcF92YWx1ZSxpb3ZyZWZfb3JnLCgoKCgoKGlvdnJlZl9vcmcmMFgzRikqNjUpKzYwMDApKjEyMDApLzEwMDAwKSkpOwogICBwcmludGYoInJlZ19hZGQ9PTB4JTA4eCx2YWx1ZT09MHglMDh4LCBpb3ZyZWZfZHgwZ2NyNiA9PTB4JTA4eCAgICUwOGRtVlxuIixERFIwX1BVQl9EWDBHQ1I2LAoJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBHQ1I2KSkpKSwocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMEdDUjYpKSkpLAoJKCgoKCgoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBHQ1I2KSkpKSYwWDNGKSo2NSkrNjAwMCkqMTIwMCkvMTAwMDApKSk7CgoJCX0KCQlpZiAoKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfTVI2KSkpKT4+NikmMSkKCQl7CiBwcmludGYoInJlZ19hZGQ9PTB4JTA4eCx2YWx1ZT09MHglMDh4LCBpb3ZyZWYgIG9yZyA9PTB4JTA4eCAgICUwOGRtVlxuIixERFIwX1BVQl9NUjYsCglpb3ZyZWZfdGVtcF92YWx1ZSxpb3ZyZWZfb3JnLCgoKCgoKGlvdnJlZl9vcmcmMFgzRikqNjUpKzQ1MDApKjEyMDApLzEwMDAwKSkpOwogICBwcmludGYoInJlZ19hZGQ9PTB4JTA4eCx2YWx1ZT09MHglMDh4LCBpb3ZyZWZfZHgwZ2NyNiA9PTB4JTA4eCAgICUwOGRtVlxuIixERFIwX1BVQl9EWDBHQ1I2LAoJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBHQ1I2KSkpKSwocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMEdDUjYpKSkpLAoJKCgoKCgoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBHQ1I2KSkpKSYwWDNGKSo2NSkrNDUwMCkqMTIwMCkvMTAwMDApKSk7CgoJCX0KCn0KCmlvdnJlZl9vcmc9KHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChQUkVHX1NUSUNLWV9SRUc4KSkpKSYweDNmOyAgLy8KaW92cmVmX2xlZj0oKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChQUkVHX1NUSUNLWV9SRUc4KSkpKT4+OCkmMHgzZjsKaW92cmVmX3JpZz0oKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChQUkVHX1NUSUNLWV9SRUc4KSkpKT4+MTYpJjB4M2Y7CmlvdnJlZl90ZXN0X3N0ZXA9KChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoUFJFR19TVElDS1lfUkVHOCkpKSk+PjI0KSYweDNmOwoKCgpwcmludGYoIlxudHJhaW5pbmdfc3RlcD09MHglMDh4XG4gIix0cmFpbmluZ19zdGVwKTsKcHJpbnRmKCJcbmlvdnJlZl90ZXN0X3N0ZXA9PTB4JTA4eFxuICIsaW92cmVmX3Rlc3Rfc3RlcCk7CnByaW50ZigiXG5pb3ZyZWZfbGVmPT0weCUwOHhcbiAiLGlvdnJlZl9sZWYpOwpwcmludGYoIlxuaW92cmVmX3JpZz09MHglMDh4XG4gIixpb3ZyZWZfcmlnKTsKaWYgKHZyZWZfc2V0X3Rlc3Rfc3RlcCkKe2lmKGlvdnJlZl90ZXN0X3N0ZXA9PTApCglpb3ZyZWZfdGVzdF9zdGVwPXZyZWZfc2V0X3Rlc3Rfc3RlcDsKfQppZiAoaW92cmVmX3Rlc3Rfc3RlcDwyKQp7CmlmIChpb3ZyZWZfdGVzdF9zdGVwID09IDApCnsKaW92cmVmX3RlbXBfdmFsdWU9aW92cmVmX2xlZjsKCn0KaWYgKGlvdnJlZl90ZXN0X3N0ZXAgPT0gMSkKewppb3ZyZWZfdGVtcF92YWx1ZT1pb3ZyZWZfcmlnOwp9Ci8vaW92cmVmX3RlbXBfdmFsdWU9aW92cmVmX2xlZi10cmFpbmluZ19zdGVwOwpwcmludGYoIlxuaW92cmVmICB0ZW1wPT0weCUwOHhcbiAiLGlvdnJlZl90ZW1wX3ZhbHVlKTsKcHJpbnRmKCJcbmlvdnJlZl90ZXN0X3JlYWQ9PTB4JTA4eFxuICIsaW92cmVmX3Rlc3RfcmVhZCk7CnRlbXBfdGVzdF9lcnJvcj0wOwppZiAoKGlvdnJlZl9vcmcgPT0gaW92cmVmX2xlZikgJiYgKGlvdnJlZl9vcmcgPT0gaW92cmVmX3JpZykpIHsKCXByaW50ZigiXG5maXJzdCB0ZXN0Iik7Cn0KZWxzZSBpZihpb3ZyZWZfdGVzdF9yZWFkIT1pb3ZyZWZfdGVtcF92YWx1ZSkKe3RlbXBfdGVzdF9lcnJvcj0xOwp9CnRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CnRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJaWYgKHZyZWZfbGNkbHJfb2Zmc2V0KQp7CnsKd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaiksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpK3ZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwp3cnJfcmVnKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCndycl9yZWcoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaikpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8Kd3JyX3JlZygoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaiksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpK3ZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoKCnByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaikpLAoJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaikpKSkpOwpwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopKSwKCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopKSkpKTsKcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSksCgkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpKSk7CnByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaikpLAoJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaikpKSkpOwoKIHRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7Cgp7Cndycl9yZWcoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVswXSk7ICAvLwp3cnJfcmVnKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbMV0pOyAgLy8Kd3JyX3JlZygoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzJdKTsgIC8vCndycl9yZWcoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVszXSk7ICAvLwoKfQp9CgovLwkvKgp7CnsKd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaiksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpLXZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwp3cnJfcmVnKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopKSktdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCndycl9yZWcoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaikpKS12cmVmX2xjZGxyX29mZnNldCkpOyAgLy8Kd3JyX3JlZygoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaiksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpLXZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoKCnByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaikpLAoJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaikpKSkpOwpwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopKSwKCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopKSkpKTsKcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSksCgkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpKSk7CnByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaikpLAoJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaikpKSkpOwoKIHRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7Cgp7Cndycl9yZWcoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVswXSk7ICAvLwp3cnJfcmVnKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbMV0pOyAgLy8Kd3JyX3JlZygoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzJdKTsgIC8vCndycl9yZWcoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVszXSk7ICAvLwoKfQp9CgoKCQl9CgkvLyovCgkJfQoKCglpZiAodGVtcF90ZXN0X2Vycm9yKQoJCXsKCQlwcmludGYoIlxudnJlZiAgZWRnZSBkZXRlY3QgXG4iKTsKCQlpZiAoaW92cmVmX3Rlc3Rfc3RlcCA9PSAwKQoJCQl7CgoJCWlvdnJlZl9sZWY9KChpb3ZyZWZfdGVtcF92YWx1ZSt0cmFpbmluZ19zdGVwKTwweDMyKT8oKGlvdnJlZl90ZW1wX3ZhbHVlK3RyYWluaW5nX3N0ZXApKTooMHgzMik7CgkJaW92cmVmX3RlbXBfdmFsdWU9aW92cmVmX29yZzsKCQkJfQoJCWlmIChpb3ZyZWZfdGVzdF9zdGVwID09IDEpCgkJCXsKCgkJaW92cmVmX3JpZz0oaW92cmVmX3RlbXBfdmFsdWU+dHJhaW5pbmdfc3RlcCk/KChpb3ZyZWZfdGVtcF92YWx1ZS10cmFpbmluZ19zdGVwKSk6KDApOwoJCWlvdnJlZl90ZW1wX3ZhbHVlPWlvdnJlZl9vcmc7CgkJCX0KCQlpb3ZyZWZfdGVzdF9zdGVwKys7CgkvLwlicmVhazsKCQl9CgllbHNlCgkJewoJCXByaW50ZigiXG5pb3ZyZWZfbGVmMT0leFxuIixpb3ZyZWZfbGVmKTsKCQlwcmludGYoIlxuaW92cmVmX3Rlc3Rfc3RlcD0leFxuIixpb3ZyZWZfdGVzdF9zdGVwKTsKCQlpZiAoaW92cmVmX3Rlc3Rfc3RlcCA9PSAwKQoJCQl7CglwcmludGYoIlxuaW92cmVmX2xlZjFfMj0leFxuIiwoaW92cmVmX3RlbXBfdmFsdWUtdHJhaW5pbmdfc3RlcCkpOwoJCWlvdnJlZl9sZWY9KGlvdnJlZl90ZW1wX3ZhbHVlPnRyYWluaW5nX3N0ZXApPygoaW92cmVmX3RlbXBfdmFsdWUtdHJhaW5pbmdfc3RlcCkpOigwKTsKCQlpb3ZyZWZfdGVtcF92YWx1ZT1pb3ZyZWZfbGVmOwoJCWlmIChpb3ZyZWZfbGVmID09IDApCgkJCXsKCQkJaW92cmVmX3Rlc3Rfc3RlcCsrOwoJCQlpb3ZyZWZfdGVtcF92YWx1ZT1pb3ZyZWZfb3JnOwoJCQl9CgkJCX0KCQlpZiAoaW92cmVmX3Rlc3Rfc3RlcCA9PSAxKQoJCQl7CgkJaW92cmVmX3JpZz0oKGlvdnJlZl90ZW1wX3ZhbHVlK3RyYWluaW5nX3N0ZXApPDB4MzIpPyhpb3ZyZWZfdGVtcF92YWx1ZSt0cmFpbmluZ19zdGVwKTooMHgzMik7CgkJaW92cmVmX3RlbXBfdmFsdWU9aW92cmVmX3JpZzsKCQkJaWYgKGlvdnJlZl9yaWcgPT0gMHgzMikKCQkJaW92cmVmX3Rlc3Rfc3RlcCsrOwoJCQl9CgkJcHJpbnRmKCJcbmlvdnJlZl9sZWYyPSV4XG4iLGlvdnJlZl9sZWYpOwoJCX0KCXsKCgp3cnJfcmVnKChQUkVHX1NUSUNLWV9SRUc4KSxpb3ZyZWZfb3JnfChpb3ZyZWZfbGVmPDw4KXwoKGlvdnJlZl9yaWc8PDE2KSl8KGlvdnJlZl90ZXN0X3N0ZXA8PDI0KSk7CnByaW50ZigiXG5kZHI0cmFtIHZyZWYgdGVzdCB3aWxsIHJlYm9vdCB1c2UgbmV3IGRyYW0gdnJlZiBzZXR0aW5nPT0weCUwOHhcbiAiLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShQUkVHX1NUSUNLWV9SRUc4KSkpKTsKY2hhciBzdHJbMTAwXTsKc3ByaW50ZihzdHIsImRkcl90ZXN0X2NtZCAweDE3ICVkIDAgMCAwIDB4JXgiLGdsb2JhbF9kZHJfY2xrLGlvdnJlZl90ZW1wX3ZhbHVlfCgodnJlZl9kcmFtX3JhbmdlJjEpPDw2KSk7CnByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKcnVuX2NvbW1hbmQoc3RyLDApOwovL3J1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgxNyAxMTAwIDAgMCAweHNvYyAweGRyYW0gIiwwKTsvLwp9Cn0KaWYgKGlvdnJlZl90ZXN0X3N0ZXAgPj0gMikKewpwcmludGYoIlxuXG4gaW92cmVmICB2ZGRxPTEuMnYsaWYgdXNlIG90aGVyIHZkZHEgLHBsZWFzZSByZWNvdW50XG4iKTsKcHJpbnRmKCJcbmRkcjRyYW0gdnJlZiB0ZXN0IGZpbmlzaCBpb3ZyZWZfdGVzdF9zdGVwPT0weCUwOHhcbiAiLGlvdnJlZl90ZXN0X3N0ZXApOwppb3ZyZWZfb3JnPShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoUFJFR19TVElDS1lfUkVHOCkpKSkmMHgzZjsgIC8vCmlvdnJlZl9sZWY9KChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoUFJFR19TVElDS1lfUkVHOCkpKSk+PjgpJjB4M2Y7CmlvdnJlZl9yaWc9KChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoUFJFR19TVElDS1lfUkVHOCkpKSk+PjE2KSYweDNmOwppb3ZyZWZfdGVzdF9zdGVwPSgocmRyX3JlZygodW5zaWduZWQgaW50ICkoKFBSRUdfU1RJQ0tZX1JFRzgpKSkpPj4yNCkmMHgzZjsKaW92cmVmX21pZD0oaW92cmVmX2xlZitpb3ZyZWZfcmlnKS8yOwppZiAodnJlZl9kcmFtX3JhbmdlID09IDApCnsKIHByaW50ZigiaW92cmVmX29yZz09MHglMDh4LCUwOGRtVnx8aW92cmVmX2xlZj09MHglMDh4LCUwOGRtVnx8aW92cmVmX3JpZz09MHglMDh4LCUwOGRtVnx8aW92cmVmX21pZDB4JTA4eCwlMDhkbVZcbiIsCglpb3ZyZWZfb3JnLCgoKCgoKGlvdnJlZl9vcmcmMFgzRikqNjUpKzYwMDApKjEyMDApLzEwMDAwKSksaW92cmVmX2xlZiwoKCgoKChpb3ZyZWZfbGVmJjBYM0YpKjY1KSs2MDAwKSoxMjAwKS8xMDAwMCkpLAoJaW92cmVmX3JpZywoKCgoKChpb3ZyZWZfcmlnJjBYM0YpKjY1KSs2MDAwKSoxMjAwKS8xMDAwMCkpLGlvdnJlZl9taWQsKCgoKCgoaW92cmVmX21pZCYwWDNGKSo2NSkrNjAwMCkqMTIwMCkvMTAwMDApKSk7Cn0KaWYgKHZyZWZfZHJhbV9yYW5nZSkKewogcHJpbnRmKCJpb3ZyZWZfb3JnPT0weCUwOHgsJTA4ZG1WfHxpb3ZyZWZfbGVmPT0weCUwOHgsJTA4ZG1WfHxpb3ZyZWZfcmlnPT0weCUwOHgsJTA4ZG1WfHxpb3ZyZWZfbWlkMHglMDh4LCUwOGRtVlxuIiwKCWlvdnJlZl9vcmcsKCgoKCgoaW92cmVmX29yZyYwWDNGKSo2NSkrNDUwMCkqMTIwMCkvMTAwMDApKSxpb3ZyZWZfbGVmLCgoKCgoKGlvdnJlZl9sZWYmMFgzRikqNjUpKzQ1MDApKjEyMDApLzEwMDAwKSksCglpb3ZyZWZfcmlnLCgoKCgoKGlvdnJlZl9yaWcmMFgzRikqNjUpKzQ1MDApKjEyMDApLzEwMDAwKSksaW92cmVmX21pZCwoKCgoKChpb3ZyZWZfbWlkJjBYM0YpKjY1KSs0NTAwKSoxMjAwKS8xMDAwMCkpKTsKfQppZiAoaW92cmVmX3JpZyA9PSAweDMyKQp7CnByaW50ZigiXG5cbiBpb3ZyZWYgIHJpZyByZWFjaCByZWcgbWF4XG4iKTsKfQppZiAoaW92cmVmX3JpZyA9PSAweDApCnsKcHJpbnRmKCJcblxuIGlvdnJlZiAgbGVmIHJlYWNoIHJlZyBtaW5cbiIpOwp9Ci8vY2hhciBzdHIyWzEwMF07Ci8vc3ByaW50ZihzdHIyLCJkZHJfdGVzdF9jbWQgMHgxNyAlZCAwIDAgMCAweCV4IixnbG9iYWxfZGRyX2Nsayxpb3ZyZWZfb3JnKTsKLy9wcmludGYoIlxuc3RyMj0lc1xuIixzdHIyKTsKLy9ydW5fY29tbWFuZChzdHIyLDApOwp9CgoKCgoKCgoKCgoKCgoKCgoKCgkJfQoKCgp9CgoKCgoKCn0KCn0KCgoKCiByZXR1cm4gMDsKCnVzYWdlOgoJY21kX3VzYWdlKGNtZHRwKTsKCSNlbmRpZgoJcmV0dXJuIDE7Cgp9CgoKaW50IGRvX2RkcjRfdGVzdF9kcmFtX2FjX3ZyZWYoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CiNpZiAoIENPTkZJR19ERFJfUEhZPj1QX0REUl9QSFlfOTA1WCkKLy8vKgovLyB1bnNpZ25lZCBpbnQgIHN0YXJ0X2FkZHI9dGVzdF9zdGFydF9hZGRyOwogICBwcmludGYoIlxuRW50ZXIgVGVzdCBkZHI0IHBoeV9hYyBvciBkZHIzIGRyYW0gZGF0YSB2cmVmIGZ1bmN0aW9uXG4iKTsKIC8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKICBwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CgoKIC8vICB1bnNpZ25lZCBpbnQgICBsb29wID0gMTsKLy8gICB1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2kgPSAxOwovLyAgIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaj0gMTsKLy8gICAgdW5zaWduZWQgaW50ICAgdGVtcF9jb3VudF9rPSAxOwogICB1bnNpZ25lZCBpbnQgICB0ZW1wX3Rlc3RfZXJyb3I9IDA7CiAgaW50IHRyYWluaW5nX3NlZWQ9MDsKICBpbnQgdHJhaW5pbmdfc3RlcD0wOwoKCSBjaGFyICplbmRwOwogLy8gIHVuc2lnbmVkIGludCAgICpwX3N0YXJ0X2FkZHI7CiAgdW5zaWduZWQgaW50ICAgdGVzdF9kcmFtX2FjX2RhdGE9MDsKIC8vICB1bnNpZ25lZCBpbnQgICB0ZXN0X3RpbWVzPTE7CiAgIHVuc2lnbmVkIGludCAgIHJlZ19hZGQ9MDsKICAgdW5zaWduZWQgaW50ICAgcmVnX2Jhc2VfYWRqPTA7CgkJICB1bnNpZ25lZCBpbnQgICBjaGFubmVsX2FfZW4gPSAwOwoJICAgdW5zaWduZWQgaW50ICAgY2hhbm5lbF9iX2VuID0gMDsKCSAgIHVuc2lnbmVkIGludCAgIHRlc3RpbmdfY2hhbm5lbCA9IDA7CgkgICB1bnNpZ25lZCBpbnQgICBkeG5sY2RscjFbNF07CgkgIC8vIHVuc2lnbmVkIGludCAgIGR4bmxjZGxyNFs0XTsKCgoJICAjZGVmaW5lICBDSEFOTkVMX0EgIDAKCSAgI2RlZmluZSAgQ0hBTk5FTF9CICAxCgoKCgoKCgkgI2RlZmluZSAgRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFICAgMHgyMDAwMAogICAjZGVmaW5lIEREUjBfUFVCX1JFR19CQVNFCQkJCQkweGM4ODM2MDAwCiAgICNkZWZpbmUgRERSMF9QVUJfRFgwR0NSNCAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWM0ICA8PCAyICkgKQogICAjZGVmaW5lIEREUjBfUFVCX0RYMUdDUjQgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjA0ICA8PCAyICkgKQogICAjZGVmaW5lIEREUjBfUFVCX0RYMkdDUjQgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI0NCAgPDwgMiApICkKICAgI2RlZmluZSBERFIwX1BVQl9EWDNHQ1I0ICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyODQgIDw8IDIgKSApCiAgICNkZWZpbmUgRERSMF9QVUJfRFgwR0NSNSAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWM1ICA8PCAyICkgKQogICAjZGVmaW5lIEREUjBfUFVCX0RYMUdDUjUgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIwNSAgPDwgMiApICkKICAgI2RlZmluZSBERFIwX1BVQl9EWDJHQ1I1ICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNDUgIDw8IDIgKSApCiAgICNkZWZpbmUgRERSMF9QVUJfRFgzR0NSNSAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4Mjg1ICA8PCAyICkgKQoKLy8jZGVmaW5lIEREUjBfUFVCX0lPVkNSMCAgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgxNDggPDwgMiApICkgLy8gUi9XIC0gSU8gVlJFRiBDb250cm9sIFJlZ2lzdGVyIDAKLy8jZGVmaW5lIEREUjBfUFVCX0lPVkNSMSAgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgxNDkgPDwgMiApICkgLy8gUi9XIC0gSU8gVlJFRiBDb250cm9sIFJlZ2lzdGVyIDEKCgoJICAgIHVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCgkvLyAgIHVuc2lnbmVkIGludCAgIGFjX2JkbHJfbGVmWzEwXTsKCS8vICAgdW5zaWduZWQgaW50ICAgYWNfYmRscl9yaWdbMTBdOwoJICAgIGludCAgIGlvdnJlZl90ZW1wX3ZhbHVlOwoJIC8vICAgIGludCAgIGlvdnJlZl90ZW1wX3JlZ192YWx1ZTsKCS8vICAgIHVuc2lnbmVkIGludCAgcmVnX3NlZWRfdmFsdWU7Ci8vCSAgIHVuc2lnbmVkIGludCAgIHRlbXBfcmVnX3ZhbHVlOwogaW50ICAgaW92cmVmX29yZzsKCSAgICAgIGludCAgIGlvdnJlZl9sZWY7CgkJICAgaW50ICAgaW92cmVmX3JpZzsKCSAgLy8gIHVuc2lnbmVkIGludCAgIHRlbXBfdGVzdF9lcnJvcjsKCS8vCXVuc2lnbmVkIGludCB0ZW1wX2k9MDsKCS8vCXVuc2lnbmVkIGludCB0ZW1wX2o9MDsKCQkvL3Vuc2lnbmVkIGludCByZWdfYWRkPTA7Ci8vCQlzdGF0aWMgdW5zaWduZWQgaW50IHRyYWluaW5nX2VuYWJsZWQ9MTsKCi8vCSBpb3ZyZWZfbGVmPTB4NDk7Ci8vIHByaW50ZigiXG5cbiBpb3ZyZWYgIG9yZyAgICAgICAgICAgICAgICAgICAgID09MHglMDh4ICAgJTA4ZG1WXG4iLGlvdnJlZl9sZWYsKCgoKChpb3ZyZWZfbGVmJjBYM0YpKjcpKzQ0MCkqMykvMikrMSk7Ci8vI2RlZmluZSBERFJfVEVTVF9BQ0xDRExSCgoKCSBpZiAoYXJnYyA9PSAyKQoJCXsKICAgIGlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApKQoKCXtjaGFubmVsX2FfZW4gPSAxOwoJfQoJZWxzZSBpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCl8fChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSkKCgl7Y2hhbm5lbF9iX2VuID0gMTsKCX0KCWVsc2UKCQl7Cglnb3RvIHVzYWdlOwoJCX0KCQl9CgkJaWYgKGFyZ2MgPiAyKQoJCXsKICAgIGlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJBIikgPT0gMCkpCgoJe2NoYW5uZWxfYV9lbiA9IDE7Cgl9CiAgICAgaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQiIpID09IDApKQoKCXtjaGFubmVsX2JfZW4gPSAxOwoJfQoJCQl9CgkJICAgZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKICBpZiAoYXJnYyA+MykgewoJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sICZlbmRwLCAxNik7CiAgICAgICAgaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQlkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJCQl9CgoJfQogICAgaWYgKGFyZ2MgPjQpIHsKCXRlc3RfZHJhbV9hY19kYXRhID0gc2ltcGxlX3N0cnRvdWwoYXJndls0XSwgJmVuZHAsIDE2KTsKICAgICAgICBpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCXRlc3RfZHJhbV9hY19kYXRhID0gMDsKCQkJfQoJaWYgKCAgdGVzdF9kcmFtX2FjX2RhdGEgKQoJCSAgdGVzdF9kcmFtX2FjX2RhdGEgPSAxOwoKCX0KCXRyYWluaW5nX3NlZWQgPSAwOwoJICAgIGlmIChhcmdjID41KSB7CiAgIHRyYWluaW5nX3NlZWQgPSBzaW1wbGVfc3RydG91bChhcmd2WzVdLCAmZW5kcCwgMTYpOwogICAgICAgIGlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJdHJhaW5pbmdfc2VlZCA9MDsvLyAweDJlOwoJCQl9CgoKCX0KCgogdHJhaW5pbmdfc3RlcCA9IDA7CgkJCWlmIChhcmdjID42KSB7Cgl0cmFpbmluZ19zdGVwID0gc2ltcGxlX3N0cnRvdWwoYXJndls2XSwgJmVuZHAsIDE2KTsKICAgICAgICBpZiAoKmFyZ3ZbNl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCXRyYWluaW5nX3N0ZXAgPSAwOwoJCQl9CgoKCgl9CgkJCSBpbnQgdnJlZl9hbGw9MDsKCQkJICAgIGlmIChhcmdjID43KSB7CiAgIHZyZWZfYWxsID0gc2ltcGxlX3N0cnRvdWwoYXJndls3XSwgJmVuZHAsIDE2KTsKICAgICAgICBpZiAoKmFyZ3ZbN10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCXZyZWZfYWxsID0wOy8vIDB4MmU7CgkJCX19CgkJCQkJIGludCB2cmVmX2xjZGxyX29mZnNldD0wOwoJCQkgICAgaWYgKGFyZ2MgPjgpIHsKICAgdnJlZl9sY2Rscl9vZmZzZXQgPSBzaW1wbGVfc3RydG91bChhcmd2WzhdLCAmZW5kcCwgMTYpOwogICAgICAgIGlmICgqYXJndls4XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl2cmVmX2xjZGxyX29mZnNldCA9MDsKCQkJfX0KIGludCBzb2NfZHJhbV9oZXhfZGVjPTA7CmlmIChhcmdjID45KQp7Cglzb2NfZHJhbV9oZXhfZGVjID0gc2ltcGxlX3N0cnRvdWwoYXJndls5XSwgJmVuZHAsIDE2KTsKCWlmICgqYXJndls5XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQlzb2NfZHJhbV9oZXhfZGVjID0gMDsKCX0KfQppZiAodHJhaW5pbmdfc2VlZCA9PTApIC8vIDB4MmU7Cnt0cmFpbmluZ19zZWVkPTB4OTsKfQppZiAoc29jX2RyYW1faGV4X2RlYykKewogICAgaWYgKGFyZ2MgPjUpIHsKICAgdHJhaW5pbmdfc2VlZCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNV0sICZlbmRwLCAwKTsKICAgICAgICBpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCXRyYWluaW5nX3NlZWQgPTA7Ly8gMHgyZTsKCQkJfQoKCgl9CglpZiAodHJhaW5pbmdfc2VlZCA9PTApIC8vIDB4MmU7Cnt0cmFpbmluZ19zZWVkPTUwOwp9CglpZiAodHJhaW5pbmdfc2VlZDw0NSkKCXRyYWluaW5nX3NlZWQ9NDU7CmlmICh0cmFpbmluZ19zZWVkPjg4KQoJdHJhaW5pbmdfc2VlZD04ODsKdHJhaW5pbmdfc2VlZCA9KCgodHJhaW5pbmdfc2VlZCoxMDAwLTQ0MDcwKS82OTgpKTsKCn0KCgoKIHByaW50ZigiXG5cbiBpb3ZyZWYgIHRyYWluaW5nX3NlZWQgICAgICAgICAgICAgPT0weCUwOHggICAlMDhkbVZcbiIsdHJhaW5pbmdfc2VlZCwoKCgoKHRyYWluaW5nX3NlZWQmMFgzRikqNykrNDQwKSozKS8yKSsxKTsKCQkgcHJpbnRmKCJcbmNoYW5uZWxfYV9lbj09IDB4JTA4eFxuIiwgY2hhbm5lbF9hX2VuKTsKCQkgcHJpbnRmKCJcbmNoYW5uZWxfYl9lbj09IDB4JTA4eFxuIiwgY2hhbm5lbF9iX2VuKTsKCQkgIHByaW50ZigiXG5kZHJfdGVzdF9zaXplPT0gMHglMDh4XG4iLCBkZHJfdGVzdF9zaXplKTsKCQkgICBwcmludGYoIlxudGVzdF9kcmFtX2FjX2RhdGE9PSAweCUwOHhcbiIsIHRlc3RfZHJhbV9hY19kYXRhKTsKCQkgICAgICBwcmludGYoIlxudnJlZl9hbGw9PSAweCUwOHhcbiIsIHZyZWZfYWxsKTsKCQkJICAgIHByaW50ZigiXG52cmVmX2xjZGxyX29mZnNldD09IDB4JTA4eFxuIiwgdnJlZl9sY2Rscl9vZmZzZXQpOwppZiAoIGNoYW5uZWxfYV9lbikKewovL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwpPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7Cn0KaWYgKCBjaGFubmVsX2JfZW4pCnsKT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpOwovL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwp9CgovL3NhdmUgYW5kIHByaW50IG9yZyB0cmFpbmluZyBkcXMgdmFsdWUKaWYgKGNoYW5uZWxfYV9lbiB8fCBjaGFubmVsX2JfZW4pCnsKCS8vZGNhY2hlX2Rpc2FibGUoKTsKIC8vc2VyaWFsX3B1dHMoIlxuZGVidWcgZm9yIGRkcnRlc3QgLGppYXhpbmcgZGlzYWJsZSBkY2FjaGUiKTsKfS8vLy9zYXZlIGFuZCBwcmludCBvcmcgdHJhaW5pbmcgIHZhbHVlCgoKCnsKLy8vL3R1bmUgYW5kIHNhdmUgdHJhaW5pbmcgZHFzIHZhbHVlCmlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoKewpmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCnsKCmlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCnsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKfQplbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQp7CnJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7Cn0KZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQogewppZiAoIHRlc3RpbmdfY2hhbm5lbCA9PSBDSEFOTkVMX0EpCiAgIHsKcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKICAgfQplbHNlIGlmKCB0ZXN0aW5nX2NoYW5uZWw9PUNIQU5ORUxfQikKICAgewpyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwogICB9CiB9CgppZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQV9SRUdfQkFTRSkKewpwcmludGYoIlxudGVzdCBBIGNoYW5uZWwgZGF0YSBsYW5lXG4iKTsKfQplbHNlCnsKcHJpbnRmKCJcbnRlc3QgQiBjaGFubmVsIGRhdGEgbGFuZVxuIik7Cn0KCgp7CgoKI2RlZmluZSB3cnJfcmVnKGFkZHIsIGRhdGEpCSgqKCh2b2xhdGlsZSAgdW5zaWduZWQgaW50ICAqKSgodW5zaWduZWQgbG9uZykodW5zaWduZWQgaW50IClhZGRyKSkpPShkYXRhKSAgLy93cl9yZWcoYWRkciwgZGF0YSkKI2RlZmluZSByZHJfcmVnKGFkZHIpCQkgKHVuc2lnbmVkIGludCApKCooKHZvbGF0aWxlICB1bnNpZ25lZCBpbnQgICopKCh1bnNpZ25lZCBsb25nKSh1bnNpZ25lZCBpbnQgKWFkZHIpKSkgIC8vcmRfcmVnKGFkZHIpCgkgICB1bnNpZ25lZCBpbnQgICBkeG5tZGxyPTA7CglyZWdfYWRkPUREUjBfUFVCX0RYME1ETFIwK3JlZ19iYXNlX2FkajsKCWR4bm1kbHI9KChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQpKT4+MTYpJjB4MWZmOwovLwlyZWdfc2VlZF92YWx1ZT0odHJhaW5pbmdfc2VlZHwoMHgwPDw4KXwoMHgwPDwxNil8KDB4MDw8MjQpKTsKcHJpbnRmKCJcbmR4bm1kbHI9PTB4JTA4eFxuICIsZHhubWRscik7Ci8vdHVybiBvZmYgZGRyNCBwaHkgcmVhZCB2cmVmIGdhdGUsb25seSBvdXRwdXQgYWMgbGFuZSB2cmVmCndycl9yZWcoKCgoRERSMF9QVUJfRFgwR0NSNCkpKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMEdDUjQpKSkmKH4oMTw8MjgpKSl8KDc8PDI1KXwoMHhmPDwyKSk7Cndycl9yZWcoKCgoRERSMF9QVUJfRFgxR0NSNCkpKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMUdDUjQpKSkmKH4oMTw8MjgpKSl8KDc8PDI1KXwoMHhmPDwyKSk7Cndycl9yZWcoKCgoRERSMF9QVUJfRFgyR0NSNCkpKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMkdDUjQpKSkmKH4oMTw8MjgpKSl8KDc8PDI1KXwoMHhmPDwyKSk7Cndycl9yZWcoKCgoRERSMF9QVUJfRFgzR0NSNCkpKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYM0dDUjQpKSkmKH4oMTw8MjgpKSl8KDc8PDI1KXwoMHhmPDwyKSk7Cndycl9yZWcoKCgoRERSMF9QVUJfSU9WQ1IwKSkpLDB4MDAwOTA5MDl8KDB4MWY8PDI0KSk7Cndycl9yZWcoKCgoRERSMF9QVUJfSU9WQ1IxKSkpLDB4MTA5KTsKcHJpbnRmKCJcbkREUjBfUFVCX0RYMEdDUjQ9PTB4JTA4eFxuICIsKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMEdDUjQpKSkpOwpwcmludGYoIlxuRERSMF9QVUJfRFgxR0NSND09MHglMDh4XG4gIiwocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgxR0NSNCkpKSk7CnByaW50ZigiXG5ERFIwX1BVQl9EWDJHQ1I0PT0weCUwOHhcbiAiLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDJHQ1I0KSkpKTsKcHJpbnRmKCJcbkREUjBfUFVCX0RYM0dDUjQ9PTB4JTA4eFxuICIsKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYM0dDUjQpKSkpOwpwcmludGYoIlxuRERSMF9QVUJfSU9WQ1IwPT0weCUwOHhcbiAiLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9JT1ZDUjApKSkpOwpwcmludGYoIlxuRERSMF9QVUJfSU9WQ1IxPT0weCUwOHhcbiAiLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9JT1ZDUjEpKSkpOwoJICAgdW5zaWduZWQgaW50ICAgdGVtcF9pPTA7Cgpmb3IgKCggIHRlbXBfaT0wKTsodGVtcF9pPDQpOyggdGVtcF9pKyspKQp7CnsKZHhubGNkbHIxW3RlbXBfaV09KHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSt0ZW1wX2kqKEREUjBfUFVCX0RYMUxDRExSMS1ERFIwX1BVQl9EWDBMQ0RMUjEpKSkpOwoKcHJpbnRmKCJcbmR4bmxjZGxyMVslMDh4XT09MHglMDh4LGR4bmxjZGxyMVslMDh4XT09MHglMDh4XG4gIix0ZW1wX2ksZHhubGNkbHIxW3RlbXBfaV0sdGVtcF9pLGR4bmxjZGxyMVt0ZW1wX2ldKTsKCn0KfQpyZWdfYWRkPUREUjBfUFVCX0lPVkNSMCtyZWdfYmFzZV9hZGo7CmlvdnJlZl90ZW1wX3ZhbHVlPXJkcl9yZWcoKHVuc2lnbmVkIGludCApcmVnX2FkZCk7CmlvdnJlZl9vcmc9KChpb3ZyZWZfdGVtcF92YWx1ZSkmMHhmZik7Ci8vCSBpb3ZyZWZfbGVmPTB4NDk7Cgp7CiBwcmludGYoInJlZ19hZGQ9PTB4JTA4eCx2YWx1ZT09MHglMDh4LCBpb3ZyZWYgIG9yZyA9PTB4JTA4eCAgICUwOGRtVlxuIixyZWdfYWRkLAoJaW92cmVmX3RlbXBfdmFsdWUsaW92cmVmX29yZywoKCgoKChpb3ZyZWZfdGVtcF92YWx1ZSYwWDNGKSo3KSs0NDApKjMpLzIpKzEpKjE1LzE1KTsKfQoKCndycl9yZWcoKHJlZ19hZGQpLGlvdnJlZl90ZW1wX3ZhbHVlKTsgIC8vCmlvdnJlZl9sZWY9KGlvdnJlZl9vcmcpJjB4ZmY7CmlvdnJlZl9yaWc9KGlvdnJlZl9vcmcpJjB4ZmY7Cgp9CgpwcmludGYoIlxudHJhaW5pbmdfc3RlcD09MHglMDh4XG4gIix0cmFpbmluZ19zdGVwKTsKCgp7CgoKCgoKCnsKCmlvdnJlZl90ZW1wX3ZhbHVlPXJkcl9yZWcoKHVuc2lnbmVkIGludCApcmVnX2FkZCk7CmlvdnJlZl90ZW1wX3ZhbHVlPSgoaW92cmVmX3RlbXBfdmFsdWUpJjB4ZmYpOwoKd2hpbGUgKGlvdnJlZl90ZW1wX3ZhbHVlPjB4MCkKewp0ZW1wX3Rlc3RfZXJyb3I9MDsKaW92cmVmX3RlbXBfdmFsdWU9aW92cmVmX3RlbXBfdmFsdWUtdHJhaW5pbmdfc3RlcDsKaWYgKGlvdnJlZl90ZW1wX3ZhbHVlPHRyYWluaW5nX3N0ZXApCglpb3ZyZWZfdGVtcF92YWx1ZT0wOwpwcmludGYoIlxuaW92cmVmIGxlZiB0ZW1wPT0weCUwOHhcbiAiLGlvdnJlZl90ZW1wX3ZhbHVlKTsKCgp3cnJfcmVnKChyZWdfYWRkKSwoMHgxZjAwMDAwMHxpb3ZyZWZfdGVtcF92YWx1ZXwoaW92cmVmX3RlbXBfdmFsdWU8PDgpfChpb3ZyZWZfdGVtcF92YWx1ZTw8MTYpKSk7CgpwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIixyZWdfYWRkLHJkcl9yZWcoKHVuc2lnbmVkIGludCApcmVnX2FkZCkpOwoKdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CglpZiAodnJlZl9sY2Rscl9vZmZzZXQpCgkJewp7Cndycl9yZWcoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaikpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8Kd3JyX3JlZygoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaiksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpK3ZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwp3cnJfcmVnKChERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCndycl9yZWcoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaikpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCgpwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopKSwKCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopKSkpKTsKcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSksCgkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpKSk7CnByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaikpLAoJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaikpKSkpOwpwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopKSwKCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopKSkpKTsKCiB0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCgkJewp3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbMF0pOyAgLy8Kd3JyX3JlZygoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzFdKTsgIC8vCndycl9yZWcoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVsyXSk7ICAvLwp3cnJfcmVnKChERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbM10pOyAgLy8KCgkJfQoKCQl9CgoJCX0KCglpZiAodnJlZl9sY2Rscl9vZmZzZXQpCgkJewp7Cndycl9yZWcoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaikpKS12cmVmX2xjZGxyX29mZnNldCkpOyAgLy8Kd3JyX3JlZygoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaiksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpLXZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwp3cnJfcmVnKChERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopKSktdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCndycl9yZWcoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaikpKS12cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCgpwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopKSwKCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopKSkpKTsKcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSksCgkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpKSk7CnByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaikpLAoJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaikpKSkpOwpwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopKSwKCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopKSkpKTsKCiB0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCgkJewp3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbMF0pOyAgLy8Kd3JyX3JlZygoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzFdKTsgIC8vCndycl9yZWcoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVsyXSk7ICAvLwp3cnJfcmVnKChERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbM10pOyAgLy8KCgkJfQoKCQl9CgoJCX0KCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJewoJCXByaW50ZigiXG52cmVmIGRvd24gZWRnZSBkZXRlY3QgXG4iKTsKCQlpb3ZyZWZfdGVtcF92YWx1ZT1pb3ZyZWZfdGVtcF92YWx1ZSt0cmFpbmluZ19zdGVwOwoJCWJyZWFrOwoJCX0KfQoKcHJpbnRmKCJcbiBkb3duIGVkZ2UgZGV0ZWN0IFxuIik7CnByaW50ZigiXG5cbiBpb3ZyZWYgICAgICAgICAgICAgICAgICAgICAgIGRvd24gZWRnZT09MHglMDh4XG4gIixpb3ZyZWZfdGVtcF92YWx1ZSk7CmlvdnJlZl9sZWY9aW92cmVmX3RlbXBfdmFsdWU7Cgp3cnJfcmVnKChyZWdfYWRkKSxpb3ZyZWZfb3JnKTsgIC8vCndycl9yZWcoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVswXSk7ICAvLwp3cnJfcmVnKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbMV0pOyAgLy8Kd3JyX3JlZygoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzJdKTsgIC8vCndycl9yZWcoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVszXSk7ICAvLwoKCgp9Cgp7Cgppb3ZyZWZfdGVtcF92YWx1ZT1yZHJfcmVnKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQpOwppb3ZyZWZfdGVtcF92YWx1ZT0oKGlvdnJlZl90ZW1wX3ZhbHVlKSYweGZmKTsKCndoaWxlIChpb3ZyZWZfdGVtcF92YWx1ZTwweDNmKQp7CnRlbXBfdGVzdF9lcnJvcj0wOwppb3ZyZWZfdGVtcF92YWx1ZT1pb3ZyZWZfdGVtcF92YWx1ZSt0cmFpbmluZ19zdGVwOwppZiAoaW92cmVmX3RlbXBfdmFsdWU+MHgzZikKCWlvdnJlZl90ZW1wX3ZhbHVlPTB4M2Y7CnByaW50ZigiXG5pb3ZyZWYgcmlnIHRlbXA9PTB4JTA4eFxuICIsaW92cmVmX3RlbXBfdmFsdWUpOwoKd3JyX3JlZygocmVnX2FkZCksKDB4MWYwMDAwMDB8aW92cmVmX3RlbXBfdmFsdWV8KGlvdnJlZl90ZW1wX3ZhbHVlPDw4KXwoaW92cmVmX3RlbXBfdmFsdWU8PDE2KSkpOwoKcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIscmVnX2FkZCxyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQpKTsKCnRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJaWYgKHZyZWZfbGNkbHJfb2Zmc2V0KQoJCXsKewp3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCndycl9yZWcoKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaikpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8Kd3JyX3JlZygoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaiksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpK3ZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwp3cnJfcmVnKChERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgoKcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSksCgkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpKSk7CnByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaikpLAoJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaikpKSkpOwpwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopKSwKCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopKSkpKTsKcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSksCgkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpKSk7CgogdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgoJCXsKd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzBdKTsgIC8vCndycl9yZWcoKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVsxXSk7ICAvLwp3cnJfcmVnKChERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbMl0pOyAgLy8Kd3JyX3JlZygoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzNdKTsgIC8vCgoJCX0KCgkJfQoKCQl9CgoJaWYgKHZyZWZfbGNkbHJfb2Zmc2V0KQoJCXsKewp3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopKSktdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCndycl9yZWcoKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaikpKS12cmVmX2xjZGxyX29mZnNldCkpOyAgLy8Kd3JyX3JlZygoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaiksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpLXZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwp3cnJfcmVnKChERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopKSktdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgoKcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSksCgkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpKSk7CnByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaikpLAoJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaikpKSkpOwpwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopKSwKCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopKSkpKTsKcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSksCgkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpKSk7CgogdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgoJCXsKd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzBdKTsgIC8vCndycl9yZWcoKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVsxXSk7ICAvLwp3cnJfcmVnKChERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbMl0pOyAgLy8Kd3JyX3JlZygoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzNdKTsgIC8vCgoJCX0KCgkJfQoKCQl9CglpZiAodGVtcF90ZXN0X2Vycm9yKQoJCXsKCQlwcmludGYoIlxudnJlZiB1cCBlZGdlIGRldGVjdCBcbiIpOwoJCWlvdnJlZl90ZW1wX3ZhbHVlPWlvdnJlZl90ZW1wX3ZhbHVlLXRyYWluaW5nX3N0ZXA7CgkJYnJlYWs7CgkJfQp9CgpwcmludGYoIlxuIHVwIGVkZ2UgZGV0ZWN0IFxuIik7CnByaW50ZigiXG5cbiBpb3ZyZWYgICAgICAgICAgICAgICAgICAgICAgIHVwIGVkZ2U9PTB4JTA4eFxuICIsaW92cmVmX3RlbXBfdmFsdWUpOwppb3ZyZWZfcmlnPWlvdnJlZl90ZW1wX3ZhbHVlOwoKd3JyX3JlZygocmVnX2FkZCksaW92cmVmX29yZyk7ICAvLwp3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbMF0pOyAgLy8Kd3JyX3JlZygoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzFdKTsgIC8vCndycl9yZWcoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVsyXSk7ICAvLwp3cnJfcmVnKChERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbM10pOyAgLy8KCgoKfQoKCgp7CglwcmludGYoIlxuXG4gaW92cmVmICB2ZGRxPTEuNXYsaWYgdXNlIG90aGVyIHZkZHEgLHBsZWFzZSByZWNvdW50XG4iKTsKcHJpbnRmKCJcbiB2ZGRxPTEuNXYgaW92cmVmICBhYytkcmFtX2RhdGEgb3JnPT0weCUwOHggICAlMDhkbVZ8fGRvd24gZWRnZT09MHglMDh4ICUwOGRtVnx8dXAgZWRnZT09MHglMDh4ICUwOGRtVnx8bWlkPT0weCUwOHggICAlMDhkbVZcbiIsCglpb3ZyZWZfb3JnLCgoKCgoKChpb3ZyZWZfb3JnJjBYM0YpKjcpKzQ0MCkqMykvMikrMSkqMTUvMTUpLGlvdnJlZl9sZWYsKCgoKCgoKGlvdnJlZl9sZWYmMFgzRikqNykrNDQwKSozKS8yKSsxKSoxNS8xNSksCglpb3ZyZWZfcmlnLCgoKCgoKChpb3ZyZWZfcmlnJjBYM0YpKjcpKzQ0MCkqMykvMikrMSkqMTUvMTUpLCgoaW92cmVmX2xlZitpb3ZyZWZfcmlnKS8yKSwKCSgoKCgoKCgoKGlvdnJlZl9sZWYraW92cmVmX3JpZykvMikmMFgzRikqNykrNDQwKSozKS8yKSsxKSoxNS8xNSkKCSk7CgppZiAoaW92cmVmX2xlZiA9PSAweDApCnsKcHJpbnRmKCJcblxuIGlvdnJlZiAgIGRvd24gZWRnZSByZWFjaCAgcmVnIGxpbWl0ZWRcbiIpOwp9CmlmIChpb3ZyZWZfcmlnID09IDB4M2YpCnsKcHJpbnRmKCJcblxuIGlvdnJlZiAgIHVwIGVkZ2UgcmVhY2ggIHJlZyBsaW1pdGVkXG4iKTsKfQp9CgoKCgoKCgoKCgoKCgoKCQl9CgoKCn0KCgoKCgoKfQoKfQoKCgoKIHJldHVybiAwOwoKdXNhZ2U6CgljbWRfdXNhZ2UoY21kdHApOwoJLy8qLwoJI2VuZGlmCglyZXR1cm4gMTsKCn0KLy8KCmludCBwbGxfY29udmVydF90b19kZHJfY2xrKHVuc2lnbmVkIGludCBkZHJfcGxsKQp7CmRkcl9wbGw9ZGRyX3BsbCYweGZmZmZmOwojaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfOTA1WCkKLy91bnNpZ25lZCBpbnQgZGRyX2NsayA9IDIqKCgoKDI0ICogKChkZHJfcGxsPj40KSYweDFmZikpLygoZGRyX3BsbD4+MTYpJjB4MWYpKT4+KCgoKGRkcl9wbGw+PjApJjB4Myk9PTMpPygyKTooKChkZHJfcGxsPj4wKSYweDMpKSkpLygoKGRkcl9wbGw+PjIpJjB4MykrMSkpOwp1bnNpZ25lZCBpbnQgZGRyX2NsayA9IDIqKCgoKDI0ICogKChkZHJfcGxsPj40KSYweDFmZikpLygoZGRyX3BsbD4+MTYpJjB4MWYpKT4+KCgoKGRkcl9wbGw+PjApJjB4Myk9PTMpPygyKTooKChkZHJfcGxsPj4wKSYweDMpKSkpPj4oKCgoZGRyX3BsbD4+MikmMHgzKT09Myk/KDIpOigoKGRkcl9wbGw+PjIpJjB4MykpKSk7CgoJI2Vsc2UKdW5zaWduZWQgaW50IGRkcl9jbGsgPSAyKigoKDI0ICogKGRkcl9wbGwmMHgxZmYpKS8oKGRkcl9wbGw+PjkpJjB4MWYpKT4+KChkZHJfcGxsPj4xNikmMHgzKSk7CgkjZW5kaWYKcmV0dXJuIGRkcl9jbGs7Cn0KCmludCBkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKHVuc2lnbmVkIGludCBkZHJfY2xrKQp7CnVuc2lnbmVkIGludCBkZHJfcGxsPTB4MTAyMjE7CgkJLyogc2V0IGRkciBwbGwgcmVnICovCglpZiAoKGRkcl9jbGsgPj0gNDApICYmIChkZHJfY2xrIDwgNzUwKSkgewoJCS8vCQkJCQkJCU9ECQkJTgkJCQkJTQoJCWRkcl9wbGw9ICgyIDw8IDE2KSB8ICgxIDw8IDkpIHwgKCgoKGRkcl9jbGsvNikqNikvMTIpIDw8IDApOwoJfQoJZWxzZSBpZigoZGRyX2NsayA+PSA3NTApICYmIChkZHJfY2xrIDwgMjAwMCkpIHsKCQkvLwkJCQkJCQlPRAkJCU4JCQkJCU0KCQlkZHJfcGxsPSAoMSA8PCAxNikgfCAoMSA8PCA5KSB8ICgoKChkZHJfY2xrLzEyKSoxMikvMjQpIDw8IDApOwoJfQoKCSNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV85MDVYKQoJIGRkcl9wbGw9MHgwMDEwNGM1OwoJCS8qIHNldCBkZHIgcGxsIHJlZyAqLwoJCS8qCglpZiAoKGRkcl9jbGsgPj0gNDApICYmIChkZHJfY2xrIDwgNzUwKSkgewoJCS8vCQkJCQkJCU9ECQkJTgkJCQkJTQoJCWRkcl9wbGw9ICgyIDw8IDIpIHwgKDEgPDwgMTYpIHwgKCgoKGRkcl9jbGsvNikqNikvMTIpIDw8IDQpOwoJfQoJZWxzZSBpZigoZGRyX2NsayA+PSA3NTApICYmIChkZHJfY2xrIDwgMjAwMCkpIHsKCQkvLwkJCQkJCQlPRAkJCU4JCQkJCU0KCQlkZHJfcGxsPSAoMSA8PCAyKSB8ICgxIDw8IDE2KSB8ICgoKChkZHJfY2xrLzEyKSoxMikvMjQpIDw8IDQpOwoJfQoqLwoJaWYgKChkZHJfY2xrIDwgMjAwKSkgewoJCS8vCQkJCQkJCU9EMQkJCU9ECQkJTgkJCQkJTQoJCWRkcl9wbGw9ICgyIDw8IDApIHwgKDMgPDwgMikgfCAoMSA8PCAxNikgfCAoKCgoZGRyX2Nsayo2KS82KS8zKSA8PCA0KTsKCX0KCWVsc2UgaWYgKChkZHJfY2xrPj0gMjAwKSAmJiAoZGRyX2NsazwgNDAwKSkgewoJCS8vCQkJCQkJCU9EMQkJCU9ECQkJTgkJCQkJTQoJCWRkcl9wbGw9ICgyIDw8IDApIHwgKDEgPDwgMikgfCAoMSA8PCAxNikgfCAoKCgoZGRyX2Nsayo2KS82KS82KSA8PCA0KTsKCX0KCWVsc2UgaWYgKChkZHJfY2xrPj0gNDAwKSAmJiAoZGRyX2NsayA8IDgwMCkpIHsKCQkvLwkJCQkJCQlPRDEJCQlPRAkJCU4JCQkJCU0KCQlkZHJfcGxsPSAoMSA8PCAwKSB8ICgxIDw8IDIpIHwgKDEgPDwgMTYpIHwgKCgoKGRkcl9jbGsqMTIpLzEyKS8xMikgPDwgNCk7Cgl9CgllbHNlIGlmICgoZGRyX2NsayA+PSA4MDApICYmIChkZHJfY2xrIDwgMjAwMCkpIHsKCQkvLwkJCQkJCQlPRDEJCQlPRAkJCU4JCQkJCU0KCQlkZHJfcGxsPSAoMCA8PCAwKSB8ICgxIDw8IDIpIHwgKDEgPDwgMTYpIHwgKCgoKGRkcl9jbGsqMTIpLzEyKS8yNCkgPDwgNCk7Cgl9CgkjZW5kaWYKcmV0dXJuIGRkcl9wbGw7Cn0KCmludCBkb19kZHI0X3Rlc3RfZHJhbV9jbGsoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7Ci8vLyoKCWludCBpPTA7CiAgcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwogZm9yIChpID0gMDtpPGFyZ2M7aSsrKQogIHsKICBwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKICB9CgkgY2hhciAqZW5kcDsKCiAjZGVmaW5lIFRFU1RfRFJBTV9DTEtfVVNFX0VOViAgMQoKCi8vcmV0dXJuIDE7CgoKCnByaW50ZigiXG50dW5lIGRkciBDTEsgdXNlIHVib290IGVudlxuIik7CgoJICNkZWZpbmUgIEREUl9DT1JTU19UQUxLX1RFU1RfU0laRSAgIDB4MjAwMDAKCSAgICNkZWZpbmUgIEREUl9URVNUX01JTl9GUkVRX0xJTUlURUQgIDUwCgkgICNkZWZpbmUgIEREUl9URVNUX01JTl9GUkVRICAzMDAKCSAgICAjZGVmaW5lICBERFJfVEVTVF9NQVhfRlJFUSAgMTUwMAoKCSAgICB1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CnVuc2lnbmVkIGludCBzdGFydF9mcmVxPUREUl9URVNUX01JTl9GUkVROwp1bnNpZ25lZCBpbnQgZW5kX2ZyZXE9RERSX1RFU1RfTUFYX0ZSRVE7CnVuc2lnbmVkIGludCB0ZXN0X2xvb3BzPTE7CgkgaWYgKGFyZ2MgPT0gMSkKCQl7CgkJcHJpbnRmKCJcbnBsZWFzZSByZWFkIGhlbHBcbiIpOwoJCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJc3RhcnRfZnJlcT1ERFJfVEVTVF9NSU5fRlJFUTsKCQkJCSBlbmRfZnJlcT1ERFJfVEVTVF9NQVhfRlJFUTsKCgkJfQoKCSAgaWYgKGFyZ2MgPT0gMikKCQl7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQlzdGFydF9mcmVxPUREUl9URVNUX01JTl9GUkVROwoJCQkJIGVuZF9mcmVxPUREUl9URVNUX01BWF9GUkVROwoJCX0KCQlpZiAoYXJnYz09IDMpCgkJCXsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgJmVuZHAsIDApOwoJCXN0YXJ0X2ZyZXE9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sICZlbmRwLCAwKTsKCQkJCSBlbmRfZnJlcT1ERFJfVEVTVF9NQVhfRlJFUTsKCgkJfQoJCQlpZiAoYXJnYz09IDQpCgkJCXsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgJmVuZHAsIDApOwoJCXN0YXJ0X2ZyZXE9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sICZlbmRwLCAwKTsKCQkJCSBlbmRfZnJlcT1zaW1wbGVfc3RydG91bChhcmd2WzNdLCAmZW5kcCwgMCk7CgoJCX0KCQkJCQkJaWYgKGFyZ2M+IDQpCgkJCXsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgJmVuZHAsIDApOwoJCXN0YXJ0X2ZyZXE9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sICZlbmRwLCAwKTsKCQkJCSBlbmRfZnJlcT1zaW1wbGVfc3RydG91bChhcmd2WzNdLCAmZW5kcCwgMCk7CgkJCQkgdGVzdF9sb29wcz1zaW1wbGVfc3RydG91bChhcmd2WzRdLCAmZW5kcCwgMCk7CgkJfQp1bnNpZ25lZCBpbnQgdGVtcF90ZXN0X2Vycm9yPTB4MDsKCSAgIHVuc2lnbmVkIGludCBkZHJfcGxsPTA7Cgl1bnNpZ25lZCBpbnQgZGRyX2Nsa19vcmc9MDsKCXVuc2lnbmVkIGludCBkZHJfY2xrX2hvcGVfdGVzdD0wOwoJIGRkcl9wbGwgPSByZF9yZWcoQU1fRERSX1BMTF9DTlRMKTsKCS8vZGRyX3BsbD1kZHJfcGxsX29yZzsKCXVuc2lnbmVkIGludCBkZHJfY2xrID0gcGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfcGxsKTsKCWRkcl9jbGtfb3JnPWRkcl9jbGs7CgkgICBwcmludGYoIlxuZGRyX2Nsaz09ICVkTUh6XG4iLCBkZHJfY2xrKTsKCSAgIHByaW50ZigiXG5zdGFydF9mcmVxPT0gJWRNSHpcbiIsIHN0YXJ0X2ZyZXEpOwoJICAgcHJpbnRmKCJcbmVuZF9mcmVxPT0gJWRNSHpcbiIsIGVuZF9mcmVxKTsKCWRkcl9wbGwgPSBkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKGRkcl9jbGspOwogIC8vCXsKCS8vCXdyX3JlZyhBTV9ERFJfUExMX0NOVEwsICgoKHJkX3JlZyhBTV9ERFJfUExMX0NOVEwpKSYofigweGZmZmZmKSkpfChkZHJfcGxsKSkpOwoJLy8JZGRyX3VkZWxheSgyMDAwKTsKCS8vfQoKCnVuc2lnbmVkIGludCBmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbKEREUl9URVNUX01BWF9GUkVRKS8xMl07IC8vIHN0ZXAgPTAgaW5pdCAgLDEgdGVzdCBmYWlsLCAsMiB0ZXN0IHBhc3MsMyB0ZXN0IHNraXA7Ci8vICBjaGFyIGNoYXJfZnJlcV9uYW1lX3RhYmxlWzMwXTsKIC8vICBjb25zdCBjaGFyICpwX2NoYXJfZnJlcV90YWJsZTsKCiBjb25zdCBjaGFyICpwX2NoYXJfZGRyX3Rlc3Rfc3RlcDsKIGNvbnN0IGNoYXIgKiBwX2NoYXJfZnJlcV9vcmc7CiBjaGFyIGNoYXJfZnJlcV9vcmdbMzBdOwogaW50ICBkZHJfZmVxX3Rlc3Rfc3RlcD0wOyAvLyBzdGVwID0wIGluaXQgLDEgZ29pbmcgLDIgZG9uZTsKCiBjb25zdCBjaGFyICogcF9jaGFyX2ZyZXFfbmFtZV90YWJsZTsKICBjaGFyIGNoYXJfZnJlcV9uYW1lX3RhYmxlWzMwXTsKICBjaGFyIGNoYXJfY21kX3RhYmxlWzEwMF07CgljaGFyICogcF9jaGFyX3N0b3JlX2Jvb3Q7Ci8vICBjaGFyIGNoYXJfZnJlcV9zdG9yZV9ib290WzIwMF07CgogLy9jb25zdCBjaGFyICpwX2ZyZXFfdGFibGVfaW50OwovL2NoYXIgY2hhcl9kZHJfZmVxX3Rlc3Rfc3RlcFtdPSJkZHJfZmVxX3Rlc3Rfc3RlcCI7Ci8vIGNvbnN0IGNoYXIgKnZhcm5hbWU7Ci8vIGNvbnN0IGNoYXIgKnZhcnZhbHVlOwp1bnNpZ25lZCBpbnQgdGVtcF9jb3VudD0wOwogdW5zaWduZWQgaW50IHRlbXBfY291bnRfc3ViPTA7CgoKLy8KcF9jaGFyX2Rkcl90ZXN0X3N0ZXA9IGdldGVudigiZGRyX2ZlcV90ZXN0X3N0ZXAiKTsKIGlmIChwX2NoYXJfZGRyX3Rlc3Rfc3RlcCkKCXsKCXByaW50ZigiJXMiLHBfY2hhcl9kZHJfdGVzdF9zdGVwKTsKCiAgZGRyX2ZlcV90ZXN0X3N0ZXAgPSBzaW1wbGVfc3RydG91bChwX2NoYXJfZGRyX3Rlc3Rfc3RlcCwgJmVuZHAsIDApOwoJcHJpbnRmKCJkZHJfZmVxX3Rlc3Rfc3RlcD0lZFxuIixkZHJfZmVxX3Rlc3Rfc3RlcCk7Cgl9CiBpZiAoZGRyX2ZlcV90ZXN0X3N0ZXApIHsKcF9jaGFyX2ZyZXFfb3JnPSBnZXRlbnYoImRkcl9mZXFfb3JnIik7CiBpZiAocF9jaGFyX2ZyZXFfb3JnKQoJewoJcHJpbnRmKCIlcyIscF9jaGFyX2ZyZXFfb3JnKTsKCiAgZGRyX2Nsa19vcmcgPSBzaW1wbGVfc3RydG91bChwX2NoYXJfZnJlcV9vcmcsICZlbmRwLCAxMCk7IC8vbXVzdCB1c2UgMTAgLGZyZXEgIDA3OTIgbWF5YmUgbm90IHJlYWQgc3Vzc2NlZnVsIHVzZSAwIGF1dG8gcmVhZAoJcHJpbnRmKCJkZHJfY2xrX29yZz0lZFxuIixkZHJfY2xrX29yZyk7Cgl9CiB9CiAgaWYgKGRkcl9mZXFfdGVzdF9zdGVwID09IDApCgl7CglkZHJfZmVxX3Rlc3Rfc3RlcD0xOwoJZGRyX2Nsa19vcmc9ZGRyX2NsazsKCSAgIHNwcmludGYoY2hhcl9mcmVxX29yZywiJTA0ZCIsZGRyX2Nsayk7CiAgcHJpbnRmKCJcbmRkcl9vcmdfZnJlcT0lc1xuIixjaGFyX2ZyZXFfb3JnKTsKCXNldGVudigiZGRyX2ZlcV9vcmciLCBjaGFyX2ZyZXFfb3JnKTsKCgoKICB0ZW1wX2NvdW50PShERFJfVEVTVF9NSU5fRlJFUV9MSU1JVEVELzEyKTsKICB3aGlsZSAodGVtcF9jb3VudDwoRERSX1RFU1RfTUFYX0ZSRVEvMTIpKSB7CgogIC8vIHNwcmludGYoZnJlcV90YWJsZSwiJXMlMDRkICUwMWQgJTAxZCAgIixmcmVxX3RhYmxlLCh0ZW1wX2NvdW50KjEyKSwwLDApOwogICBzcHJpbnRmKGNoYXJfZnJlcV9uYW1lX3RhYmxlLCJkZHJfZnJlXyUwNGQiLChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoxMikpKSk7CiAgcHJpbnRmKCJcbmNoYXJfZnJlcV9uYW1lX3RhYmxlPSVzXG4iLGNoYXJfZnJlcV9uYW1lX3RhYmxlKTsKCXNldGVudihjaGFyX2ZyZXFfbmFtZV90YWJsZSwgIjAiKTsKCXNldGVudigiZGRyX2ZlcV90ZXN0X3N0ZXAiLCAiMSIpOwoJdGVtcF9jb3VudCsrOwoJfQoJdGVtcF9jb3VudD0oRERSX1RFU1RfTUlOX0ZSRVFfTElNSVRFRC8xMik7CiAgd2hpbGUgKHRlbXBfY291bnQ8KChzdGFydF9mcmVxKS8xMikpIHsKCiAgLy8gc3ByaW50ZihmcmVxX3RhYmxlLCIlcyUwNGQgJTAxZCAlMDFkICAiLGZyZXFfdGFibGUsKHRlbXBfY291bnQqMTIpLDAsMCk7CiAgIHNwcmludGYoY2hhcl9mcmVxX25hbWVfdGFibGUsImRkcl9mcmVfJTA0ZCIsKHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50KjEyKSkpKTsKICBwcmludGYoIlxuY2hhcl9mcmVxX25hbWVfdGFibGU9JXNcbiIsY2hhcl9mcmVxX25hbWVfdGFibGUpOwoJc2V0ZW52KGNoYXJfZnJlcV9uYW1lX3RhYmxlLCAiMyIpOwoJc2V0ZW52KCJkZHJfZmVxX3Rlc3Rfc3RlcCIsICIxIik7Cgl0ZW1wX2NvdW50Kys7Cgl9CiAgICB3aGlsZSAodGVtcF9jb3VudD4oKGVuZF9mcmVxKS8xMikpIHsKCiAgLy8gc3ByaW50ZihmcmVxX3RhYmxlLCIlcyUwNGQgJTAxZCAlMDFkICAiLGZyZXFfdGFibGUsKHRlbXBfY291bnQqMTIpLDAsMCk7CiAgIHNwcmludGYoY2hhcl9mcmVxX25hbWVfdGFibGUsImRkcl9mcmVfJTA0ZCIsKHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50KjEyKSkpKTsKICBwcmludGYoIlxuY2hhcl9mcmVxX25hbWVfdGFibGU9JXNcbiIsY2hhcl9mcmVxX25hbWVfdGFibGUpOwoJc2V0ZW52KGNoYXJfZnJlcV9uYW1lX3RhYmxlLCAiMyIpOwoJc2V0ZW52KCJkZHJfZmVxX3Rlc3Rfc3RlcCIsICIxIik7Cgl0ZW1wX2NvdW50Kys7Cgl9CgpwX2NoYXJfc3RvcmVfYm9vdD0gZ2V0ZW52KCJzdG9yZWJvb3QiKTsKaWYgKHBfY2hhcl9zdG9yZV9ib290KQpwcmludGYoInN0b3JlYm9vdCAgICVzXG4iLHBfY2hhcl9zdG9yZV9ib290KTsKCXNwcmludGYoY2hhcl9jbWRfdGFibGUsImRkcl90ZXN0X2NtZCAweDFjICAweCUwOHggJWQgJWQgJWQ7JXM7IixkZHJfdGVzdF9zaXplLHN0YXJ0X2ZyZXEsZW5kX2ZyZXEsdGVzdF9sb29wcyxwX2NoYXJfc3RvcmVfYm9vdCk7CglzZXRlbnYoInN0b3JlYm9vdCIsIGNoYXJfY21kX3RhYmxlKTsKCgkgcnVuX2NvbW1hbmQoInNhdmUiLDApOwoKCi8vcnVuX2NvbW1hbmQoInNhdmUiLDApOwovL3RlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKLy90ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKLy9pZih0ZW1wX3Rlc3RfZXJyb3IpCnsKfQoKCX0KCiAgICBpZiAoZGRyX2ZlcV90ZXN0X3N0ZXAgPT0gMSkKCXsKCgkgdGVtcF9jb3VudD0oRERSX1RFU1RfTUlOX0ZSRVFfTElNSVRFRC8xMik7CiAgd2hpbGUgKHRlbXBfY291bnQ8KChERFJfVEVTVF9NQVhfRlJFUSkvMTIpKSB7CgoJc3ByaW50ZihjaGFyX2ZyZXFfbmFtZV90YWJsZSwiZGRyX2ZyZV8lMDRkIiwocGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKHRlbXBfY291bnQqMTIpKSkpOwogIHByaW50ZigiXG5jaGFyX2ZyZXFfbmFtZV90YWJsZT0lc1xuIixjaGFyX2ZyZXFfbmFtZV90YWJsZSk7CgoJCXBfY2hhcl9mcmVxX25hbWVfdGFibGU9IGdldGVudihjaGFyX2ZyZXFfbmFtZV90YWJsZSk7CgkgaWYgKHBfY2hhcl9mcmVxX25hbWVfdGFibGUpCgl7CglwcmludGYoIiVzXG4iLHBfY2hhcl9mcmVxX25hbWVfdGFibGUpOwoKICBmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0gPSBzaW1wbGVfc3RydG91bChwX2NoYXJfZnJlcV9uYW1lX3RhYmxlLCAmZW5kcCwgMCk7CglwcmludGYoIiVzIHwgJWRcbiIsY2hhcl9mcmVxX25hbWVfdGFibGUsZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdKTsKCX0KdGVtcF9jb3VudCsrOwoJfQoKdGVtcF9jb3VudD0oRERSX1RFU1RfTUlOX0ZSRVFfTElNSVRFRC8xMik7CiAgd2hpbGUgKHRlbXBfY291bnQ8KChERFJfVEVTVF9NQVhfRlJFUSkvMTIpKSB7CgkJZGRyX2Nsa19ob3BlX3Rlc3Q9KHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50KjEyKSkpOwoJCWlmIChmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0gPT0xKQoJCQl7CgkJCXRlbXBfY291bnRfc3ViPXRlbXBfY291bnQrMTsKCQkJd2hpbGUgKChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudF9zdWIqMTIpKSkgPT0KCQkJKHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50KjEyKSkpKQoJCQkJe3RlbXBfY291bnRfc3ViPXRlbXBfY291bnRfc3ViKzE7CgkJCQl9CgkJCSB3aGlsZSAodGVtcF9jb3VudF9zdWI8KChERFJfVEVTVF9NQVhfRlJFUSkvMTIpKSB7CgkJCQlzcHJpbnRmKGNoYXJfZnJlcV9uYW1lX3RhYmxlLCJkZHJfZnJlXyUwNGQiLChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudF9zdWIqMTIpKSkpOwoJCQkJICBwcmludGYoIlxuY2hhcl9mcmVxX25hbWVfdGFibGU9JXNcbiIsY2hhcl9mcmVxX25hbWVfdGFibGUpOwoJCQkJICAvLyBmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF9zdWJdID0xOwoJCQkJCQkJCXNldGVudihjaGFyX2ZyZXFfbmFtZV90YWJsZSwgIjMiKTsKCQkJCQkJCQl0ZW1wX2NvdW50X3N1YisrOwoJCQkJfQoJCQkJewpkZHJfZmVxX3Rlc3Rfc3RlcCsrOwpzZXRlbnYoImRkcl9mZXFfdGVzdF9zdGVwIiwgIjIiKTsKIHJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCgkJCQl9CgkJCQkJe2Rkcl9jbGtfaG9wZV90ZXN0PWRkcl9jbGtfb3JnOwoJfQpzcHJpbnRmKGNoYXJfY21kX3RhYmxlLCJkZHJfdGVzdF9jbWQgMHgxNyAlZCAwIDAgMCIsZGRyX2Nsa19ob3BlX3Rlc3QpOwpwcmludGYoIlxuY2hhcl9jbWRfdGFibGU9JXNcbiIsY2hhcl9jbWRfdGFibGUpOwpydW5fY29tbWFuZChjaGFyX2NtZF90YWJsZSwwKTsKCgkJfQoJCWlmIChmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0gPT0wKQoJCQl7CgkJCWlmICgoZGRyX2Nsa19ob3BlX3Rlc3QpICE9IChkZHJfY2xrKSkKCQkJCXsKc3ByaW50ZihjaGFyX2NtZF90YWJsZSwiZGRyX3Rlc3RfY21kIDB4MTcgJWQgMCAwIDAiLGRkcl9jbGtfaG9wZV90ZXN0KTsKcHJpbnRmKCJcbmNoYXJfY21kX3RhYmxlPSVzXG4iLGNoYXJfY21kX3RhYmxlKTsKcnVuX2NvbW1hbmQoY2hhcl9jbWRfdGFibGUsMCk7CgkJCX0KCQkJaWYgKChkZHJfY2xrX2hvcGVfdGVzdCkgPT0gKGRkcl9jbGspKQoJCQkJewoKIHNwcmludGYoY2hhcl9mcmVxX25hbWVfdGFibGUsImRkcl9mcmVfJTA0ZCIsKHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50KjEyKSkpKTsKICBwcmludGYoIlxuY2hhcl9mcmVxX25hbWVfdGFibGU9JXNcbiIsY2hhcl9mcmVxX25hbWVfdGFibGUpOwogICBmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0gPTE7CiBzZXRlbnYoY2hhcl9mcmVxX25hbWVfdGFibGUsICIxIik7CiBydW5fY29tbWFuZCgic2F2ZSIsMCk7CgoJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJd2hpbGUgKHRlc3RfbG9vcHMtLSkgewoJCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJfQovL3RlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKICAgc3ByaW50ZihjaGFyX2ZyZXFfbmFtZV90YWJsZSwiZGRyX2ZyZV8lMDRkIiwocGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKHRlbXBfY291bnQqMTIpKSkpOwogIHByaW50ZigiXG5jaGFyX2ZyZXFfbmFtZV90YWJsZT0lc1xuIixjaGFyX2ZyZXFfbmFtZV90YWJsZSk7CiAgaWYgKHRlbXBfdGVzdF9lcnJvcikKewogZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdID0xOwogc2V0ZW52KGNoYXJfZnJlcV9uYW1lX3RhYmxlLCAiMSIpOwp9CmVsc2UKewogZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdID0yOwogc2V0ZW52KGNoYXJfZnJlcV9uYW1lX3RhYmxlLCAiMiIpOwp9CiBydW5fY29tbWFuZCgic2F2ZSIsMCk7CgpkZHJfY2xrX2hvcGVfdGVzdD0odGVtcF9jb3VudCoxMikrMTI7CndoaWxlICgocGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKGRkcl9jbGtfaG9wZV90ZXN0KSkpID09CgkJCShwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoxMikpKSkKe2Rkcl9jbGtfaG9wZV90ZXN0PWRkcl9jbGtfaG9wZV90ZXN0KzEyOwp9CiBpZiAodGVtcF90ZXN0X2Vycm9yKQoJe2Rkcl9jbGtfaG9wZV90ZXN0PWRkcl9jbGtfb3JnOwoJfQpzcHJpbnRmKGNoYXJfY21kX3RhYmxlLCJkZHJfdGVzdF9jbWQgMHgxNyAlZCAwIDAgMCIsZGRyX2Nsa19ob3BlX3Rlc3QpOwpwcmludGYoIlxuY2hhcl9jbWRfdGFibGU9JXNcbiIsY2hhcl9jbWRfdGFibGUpOwpydW5fY29tbWFuZChjaGFyX2NtZF90YWJsZSwwKTsKCQkJCX0KCgkJfQoKCgoKCgkJdGVtcF9jb3VudCsrOwoJfQpkZHJfZmVxX3Rlc3Rfc3RlcCsrOwpzZXRlbnYoImRkcl9mZXFfdGVzdF9zdGVwIiwgIjIiKTsKcnVuX2NvbW1hbmQoInNhdmUiLDApOwoKCX0KCgkgICBpZiAoZGRyX2ZlcV90ZXN0X3N0ZXAgPj0gMikKCXsKCXByaW50ZigiXG5maW5pc2ggdGVzdCBkZHJfZmVxX3Rlc3Rfc3RlcD0lZFxuIixkZHJfZmVxX3Rlc3Rfc3RlcCk7CgkJdGVtcF9jb3VudD0oRERSX1RFU1RfTUlOX0ZSRVFfTElNSVRFRC8xMik7CiAgd2hpbGUgKHRlbXBfY291bnQ8KChERFJfVEVTVF9NQVhfRlJFUSkvMTIpKSB7CgoJc3ByaW50ZihjaGFyX2ZyZXFfbmFtZV90YWJsZSwiZGRyX2ZyZV8lMDRkIiwocGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKHRlbXBfY291bnQqMTIpKSkpOwogIHByaW50ZigiXG5jaGFyX2ZyZXFfbmFtZV90YWJsZT0lc1xuIixjaGFyX2ZyZXFfbmFtZV90YWJsZSk7CgoJCXBfY2hhcl9mcmVxX25hbWVfdGFibGU9IGdldGVudihjaGFyX2ZyZXFfbmFtZV90YWJsZSk7CgkgaWYgKHBfY2hhcl9mcmVxX25hbWVfdGFibGUpCgl7CglwcmludGYoIiVzXG4iLHBfY2hhcl9mcmVxX25hbWVfdGFibGUpOwoKICBmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0gPSBzaW1wbGVfc3RydG91bChwX2NoYXJfZnJlcV9uYW1lX3RhYmxlLCAmZW5kcCwgMCk7CglwcmludGYoIiVzIHwgJWRcbiIsY2hhcl9mcmVxX25hbWVfdGFibGUsZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdKTsKCX0KdGVtcF9jb3VudCsrOwoJfQoKcHJpbnRmKCJcbnByaW50IHRlc3QgZGRyX2ZlcV90ZXN0X3Jlc3VsdCEhIVxuIik7CiAgIHRlbXBfY291bnQ9KEREUl9URVNUX01JTl9GUkVRX0xJTUlURUQvMTIpOwogIHdoaWxlICh0ZW1wX2NvdW50PCgoRERSX1RFU1RfTUFYX0ZSRVEpLzEyKSkgewoKCXNwcmludGYoY2hhcl9mcmVxX25hbWVfdGFibGUsImRkcl9mcmVfJTA0ZCIsKHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50KjEyKSkpKTsKCQlwX2NoYXJfZnJlcV9uYW1lX3RhYmxlPSBnZXRlbnYoY2hhcl9mcmVxX25hbWVfdGFibGUpOwoJIGlmIChwX2NoYXJfZnJlcV9uYW1lX3RhYmxlKQoJewogLy8JcHJpbnRmKCIlc1xuIixwX2NoYXJfZnJlcV9uYW1lX3RhYmxlKTsKCiAgZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdID0gc2ltcGxlX3N0cnRvdWwocF9jaGFyX2ZyZXFfbmFtZV90YWJsZSwgJmVuZHAsIDApOwogLy9wcmludGYoIiVkXG4iLGZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSk7CiBpZiAoIChmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0pID09IDApIHsKCXByaW50ZigiJTA0ZCAgbm8gaW5pdCAgICAgJWQgXG4iLChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoxMikpKSxmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0pOwoJfQoJICBpZiAoIChmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0pID09IDEpIHsKCXByaW50ZigiJTA0ZCAgZmFpbCAgICAgICVkXG4iLChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoxMikpKSxmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0pOwoJfQogICBpZiAoIChmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0pID09IDIpIHsKCXByaW50ZigiJTA0ZCAgcGFzcyAgICAgICVkXG4iLChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoxMikpKSxmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0pOwoJfQoJICAgIGlmICggKGZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSkgPj0gMykgewoJcHJpbnRmKCIlMDRkICBza2lwIHRlc3QgJWQgXG4iLChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoxMikpKSxmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0pOwoJfQp0ZW1wX2NvdW50Kys7Cgl9CgkJfQoKCQl9CiAvL3NwcmludGYoc3RyLCJkZHJfdGVzdF9hY19iaXRfc2V0dXBfaG9sZF93aW5kb3cgIGEgMCAgMHglMDh4ICAlZCAgMHglMDh4IixkZHJfdGVzdF9zaXplLHRlc3RfYWNfc2V0dXBfaG9sZCwoIGxhbmVfc3RlcCkpOwovLwlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgoKCgogLy9zcHJpbnRmKHN0ciwgIiVseCIsIHZhbHVlKTsKLy8gIHNldGVudigiZW52X2RkcnRlc3QiLCBzdHIpOwoKCi8vcnVuX2NvbW1hbmQoInNhdmUiLDApOwoKCgoKCi8vKi8KICByZXR1cm4gMTsKCn0KaW50IHVwZGF0ZV9kZHJfenEodW5zaWduZWQgaW50IHpxMHByKQp7Cgp3cl9yZWcoIEREUjBfUFVCX1pRMFBSLHpxMHByKTsKCXdyX3JlZyggRERSMF9QVUJfWlFDUiwocmRfcmVnKEREUjBfUFVCX1pRQ1IpKXwoMTw8Mil8KDE8PDI3KSk7Cgl3cl9yZWcoIEREUjBfUFVCX1pRQ1IsKHJkX3JlZyhERFIwX1BVQl9aUUNSKSkmKH4oKDE8PDIpfCgxPDwyNykpKSk7CgkgcHJpbnRmKCJcbnVwZGF0ZSB6cSB6cTBwcj0weCUwOHgsenEwZHI9MHglMDh4LFxuIixyZF9yZWcoRERSMF9QVUJfWlEwUFIpLHJkX3JlZyhERFIwX1BVQl9aUTBEUikpOwpyZXR1cm4gcmRfcmVnKEREUjBfUFVCX1pRMFBSKTsKfQoKaW50IGRvX2Rkcl90ZXN0X2Rkcl9tYXhfZnJlcShjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKICAgcHJpbnRmKCJcbkVudGVyIFRlc3QgZGRyIG1heCBmcmVxdWVuY3kgIGZ1bmN0aW9uXG4iKTsKIC8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKICBwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CgoKCnsKLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpOwp9Cgp7Ck9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKTsKLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKfQoKCSBjaGFyICplbmRwOwogLy8gIHVuc2lnbmVkIGludCAgICpwX3N0YXJ0X2FkZHI7CiAgdW5zaWduZWQgaW50ICAgdGVzdF9sb29wPTE7CiAgIHVuc2lnbmVkIGludCAgIHRlc3RfdGltZXM9MTsKICAgdW5zaWduZWQgaW50ICAgYWRkX2ZyZXE9MTsKICAgdW5zaWduZWQgaW50ICAgc3ViX2ZyZXE9MTsKCSB1bnNpZ25lZCBpbnQgICBtYXhfZnJlcT03OTI7CgkgdW5zaWduZWQgaW50ICAgbWluX2ZyZXE9NzkyOwoJdW5zaWduZWQgaW50ICAgbG9vcF9tYXhfZnJlcT03OTI7CgkgdW5zaWduZWQgaW50ICAgIGxvb3BfbWluX2ZyZXE9NzkyOwoKCSAgIHVuc2lnbmVkIGludCBkZHJfcGxsPTB4MTAyMjE7Cgl1bnNpZ25lZCBpbnQgZGRyX2Nsa19vcmc9NzkyOwoJdW5zaWduZWQgaW50IGRkcl9wbGxfb3JnID0gcmRfcmVnKEFNX0REUl9QTExfQ05UTCk7CglkZHJfcGxsPWRkcl9wbGxfb3JnOwoJdW5zaWduZWQgaW50IGRkcl9jbGsgPSBwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9wbGwpOwoJZGRyX2Nsa19vcmc9ZGRyX2NsazsKCQlwcmludGYoIlxuZGRyX2Nsa19vcmc9PSAlZE1IelxuIiwgZGRyX2Nsa19vcmcpOwoKCXVuc2lnbmVkIGludCB6cTBwciA9IHJkX3JlZyhERFIwX1BVQl9aUTBQUik7CglwcmludGYoIlxuZGRyX3pxMHByPT0gMHglMDh4XG4iLCB6cTBwcik7CgoJICAgZGRyX3BsbCA9IGRkcl9jbGtfY29udmVydF90b19wbGwoZGRyX2Nsayk7CgoKCXsKCgkJd3JfcmVnKEFNX0REUl9QTExfQ05UTCwgKCgocmRfcmVnKEFNX0REUl9QTExfQ05UTCkpJih+KDB4ZmZmZmYpKSl8KGRkcl9wbGwpKSk7CgkJZGRyX3VkZWxheSgyMDAwKTsKCX0KCgoKCgoKCSAgICAgbWF4X2ZyZXE9ZGRyX2Nsa19vcmc7CgkgICAgIG1pbl9mcmVxPWRkcl9jbGtfb3JnOwoKCgoKCSAjZGVmaW5lICBERFJfQ09SU1NfVEFMS19URVNUX1NJWkUgICAweDIwMDAwCgoJICAgIHVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCgoKCgkgaWYgKGFyZ2MgPT0gMSkKCQl7CgkJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQl0ZXN0X2xvb3A9MTsKCQkJCSBhZGRfZnJlcT0xOwoJCQkJICBzdWJfZnJlcT0xOwoJCX0KCgkgIGlmIChhcmdjID09IDIpCgkJewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCAmZW5kcCwgMTYpOwoJCXRlc3RfbG9vcD0xOwoJCQkJIGFkZF9mcmVxPTE7CgkJCQkgIHN1Yl9mcmVxPTE7CgkJfQoJCWlmIChhcmdjPT0gMykKCQkJewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCAmZW5kcCwgMTYpOwoJCXRlc3RfbG9vcD0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgJmVuZHAsIDE2KTsKCQkJCSBhZGRfZnJlcT0xOwoJCQkJICBzdWJfZnJlcT0xOwoJCX0KCQlpZiAoYXJnYyA+PSA0KQoJCQl7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sICZlbmRwLCAxNik7CgkJdGVzdF9sb29wPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCAmZW5kcCwgMTYpOwoJCQkJYWRkX2ZyZXE9MTsKCQkJICAgICAgICBzdWJfZnJlcT0xOwogICAgICAgICAgICAgICAgICAgIGlmICgoc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgJmVuZHAsIDE2KSkgPT0gMSkKCQkJCQkJewoJCQkJIGFkZF9mcmVxPTE7CgkJCSAgICAgICAgc3ViX2ZyZXE9MDsKCQkJCQkJfQoJCSAgICAgZWxzZSBpZigoc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgJmVuZHAsIDE2KSk9PTApCgkJCQl7CgkJCQkJYWRkX2ZyZXE9MDsKCQkJICAgICAgICBzdWJfZnJlcT0xOwoJCQkJfQoJCX0KCgoKCgl1bnNpZ25lZCBpbnQgIAl0ZW1wX3Rlc3RfZXJyb3I9MDsKd2hpbGUgKHRlc3RfdGltZXM8KHRlc3RfbG9vcCsxKSkKewpwcmludGYoIlxudGVzdF90aW1lcz09ICVkIHRpbWVzXG4iLCB0ZXN0X3RpbWVzKTsKCiBpZiAoYWRkX2ZyZXEpCgl7CgoJd2hpbGUgKGRkcl9jbGs8MTUwMCkKCQl7CgkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJZGRyX2Nsaz1kZHJfY2xrKzEyOwoJZGRyX3BsbCA9IGRkcl9jbGtfY29udmVydF90b19wbGwoZGRyX2Nsayk7Cgl7CgoJCXdyX3JlZyhBTV9ERFJfUExMX0NOVEwsICgoKHJkX3JlZyhBTV9ERFJfUExMX0NOVEwpKSYofigweGZmZmZmKSkpfChkZHJfcGxsKSkpOwoJCWRkcl91ZGVsYXkoMjAwMCk7CgkJIHByaW50ZigiXG50ZXN0aW5nX2Rkcl9jbGs9PSAlZE1IelxuIiwgZGRyX2Nsayk7Cgl9Cgp0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CnRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwppZiAodGVtcF90ZXN0X2Vycm9yKQp7Cm1heF9mcmVxPWRkcl9jbGstMTI7CiAgcHJpbnRmKCJcbm1heF9kZHJfY2xrPT0gJWRNSHpcbiIsIG1heF9mcmVxKTsKCXRlbXBfdGVzdF9lcnJvcj0wOwogIGJyZWFrOwp9CgoJCX0KCgl3aGlsZSAoZGRyX2Nsaz5kZHJfY2xrX29yZykKCQl7CglkZHJfY2xrPWRkcl9jbGstMTI7CglkZHJfcGxsID0gZGRyX2Nsa19jb252ZXJ0X3RvX3BsbChkZHJfY2xrKTsKCXsKCgkJd3JfcmVnKEFNX0REUl9QTExfQ05UTCwgKCgocmRfcmVnKEFNX0REUl9QTExfQ05UTCkpJih+KDB4ZmZmZmYpKSl8KGRkcl9wbGwpKSk7CgkJZGRyX3VkZWxheSgyMDAwKTsKCX0KCQl9CnByaW50ZigiXG5iYWNrIHRvICBvcmdfZGRyX2Nsaz09ICVkTUh6XG4iLCBkZHJfY2xrKTsKCgoJfQoKIGlmIChzdWJfZnJlcSkKCXsKCgl3aGlsZSAoZGRyX2Nsaz4yNCkKCQl7CgkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJZGRyX2Nsaz1kZHJfY2xrLTEyOwoJZGRyX3BsbCA9IGRkcl9jbGtfY29udmVydF90b19wbGwoZGRyX2Nsayk7Cgl7CgoJCXdyX3JlZyhBTV9ERFJfUExMX0NOVEwsICgoKHJkX3JlZyhBTV9ERFJfUExMX0NOVEwpKSYofigweGZmZmZmKSkpfChkZHJfcGxsKSkpOwoJCWRkcl91ZGVsYXkoMjAwMCk7CgkJIHByaW50ZigiXG50ZXN0aW5nX2Rkcl9jbGs9PSAlZE1IelxuIiwgZGRyX2Nsayk7Cgl9Cgp0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CnRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwppZiAodGVtcF90ZXN0X2Vycm9yKQp7Cm1pbl9mcmVxPWRkcl9jbGsrMTI7CiAgcHJpbnRmKCJcbm1pbl9kZHJfY2xrPT0gJWRNSHpcbiIsIG1pbl9mcmVxKTsKCXRlbXBfdGVzdF9lcnJvcj0wOwogIGJyZWFrOwp9CgoJCX0KCgl3aGlsZSAoZGRyX2NsazxkZHJfY2xrX29yZykKCQl7CglkZHJfY2xrPWRkcl9jbGsrMTI7CglkZHJfcGxsID0gZGRyX2Nsa19jb252ZXJ0X3RvX3BsbChkZHJfY2xrKTsKCXsKCgkJd3JfcmVnKEFNX0REUl9QTExfQ05UTCwgKCgocmRfcmVnKEFNX0REUl9QTExfQ05UTCkpJih+KDB4ZmZmZmYpKSl8KGRkcl9wbGwpKSk7CgkJZGRyX3VkZWxheSgyMDAwKTsKCX0KCQl9CnByaW50ZigiXG5iYWNrIHRvICBvcmdfZGRyX2Nsaz09ICVkTUh6XG4iLCBkZHJfY2xrKTsKCgoJfQoKaWYgKHRlc3RfdGltZXMgPT0gMSkKewoKCSAgbG9vcF9tYXhfZnJlcT1tYXhfZnJlcTsKCSAgbG9vcF9taW5fZnJlcT1taW5fZnJlcTsKfQplbHNlCnsKaWYgKGxvb3BfbWF4X2ZyZXE+bWF4X2ZyZXEpCnsKbG9vcF9tYXhfZnJlcT1tYXhfZnJlcTsKfQppZiAobWluX2ZyZXE+bG9vcF9taW5fZnJlcSkKewpsb29wX21pbl9mcmVxPW1pbl9mcmVxOwp9Cn0KdGVzdF90aW1lcysrOwoKfQoKIHByaW50ZigiXG5sb29wX21pbl9mcmVxPT0gJWRNSHoscGxsPT0weCUwOHhcbiIsIGxvb3BfbWluX2ZyZXEsZGRyX2Nsa19jb252ZXJ0X3RvX3BsbChsb29wX21pbl9mcmVxKSk7CiBwcmludGYoIlxubG9vcF9tYXhfZnJlcT09ICVkTUh6LHBsbD09MHglMDh4XG4iLCBsb29wX21heF9mcmVxLGRkcl9jbGtfY29udmVydF90b19wbGwobG9vcF9tYXhfZnJlcSkpOwoKCgoKCiByZXR1cm4gbG9vcF9tYXhfZnJlcTsKCgoKfQoKCmludCBkb19kZHJfdGVzdF9kZHJfenEoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CiAgIHByaW50ZigiXG5FbnRlciBUZXN0IGRkciB6cSAgZnVuY3Rpb25cbiIpOwogLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwogIHByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCgoKewovL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwpPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7Cn0KCnsKT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpOwovL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwp9CgoJIGNoYXIgKmVuZHA7CiAvLyAgdW5zaWduZWQgaW50ICAgKnBfc3RhcnRfYWRkcjsKICB1bnNpZ25lZCBpbnQgICB0ZXN0X2xvb3A9MTsKICAgdW5zaWduZWQgaW50ICAgdGVzdF90aW1lcz0xOwogICB1bnNpZ25lZCBpbnQgICBhZGRfZnJlcT0xOwogICB1bnNpZ25lZCBpbnQgICBzdWJfZnJlcT0xOwoJIHVuc2lnbmVkIGludCAgIG1heF9mcmVxPTc5MjsKCSB1bnNpZ25lZCBpbnQgICBtaW5fZnJlcT03OTI7Cgl1bnNpZ25lZCBpbnQgICBsb29wX21heF9mcmVxPTc5MjsKCSB1bnNpZ25lZCBpbnQgICAgbG9vcF9taW5fZnJlcT03OTI7CgoJICAgdW5zaWduZWQgaW50IGRkcl9wbGw9MHgxMDIyMTsKCXVuc2lnbmVkIGludCBkZHJfY2xrX29yZz03OTI7Cgl1bnNpZ25lZCBpbnQgZGRyX3BsbF9vcmcgPSByZF9yZWcoQU1fRERSX1BMTF9DTlRMKTsKCWRkcl9wbGw9ZGRyX3BsbF9vcmc7Cgl1bnNpZ25lZCBpbnQgZGRyX2NsayA9IHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX3BsbCk7CglkZHJfY2xrX29yZz1kZHJfY2xrOwoJCXByaW50ZigiXG5kZHJfY2xrX29yZz09ICVkTUh6XG4iLCBkZHJfY2xrX29yZyk7CgoJdW5zaWduZWQgaW50IHpxMHByX29yZyA9IHJkX3JlZyhERFIwX1BVQl9aUTBQUik7Ci8vCXVuc2lnbmVkIGludCB6cTBwcl9iZXN0OwoJdW5zaWduZWQgaW50IHpxMHByPSByZF9yZWcoRERSMF9QVUJfWlEwUFIpOwovLwl6cTBwcl9iZXN0PXpxMHByX29yZzsKCXVuc2lnbmVkIGludCB6cTBwcl9kcnZfbWF4OwoJdW5zaWduZWQgaW50IHpxMHByX2Rydl9taW47Cgl1bnNpZ25lZCBpbnQgenEwcHJfb2R0X21heDsKCXVuc2lnbmVkIGludCB6cTBwcl9vZHRfbWluOwoJdW5zaWduZWQgaW50IHpxMHByX2Rydl9mbGFnPTE7Cgl1bnNpZ25lZCBpbnQgenEwcHJfb2R0X2ZsYWc9MTsKCgoJcHJpbnRmKCJcbnpxMHByX29yZz09IDB4JTA4eFxuIiwgenEwcHJfb3JnKTsKCgkgICBkZHJfcGxsID0gZGRyX2Nsa19jb252ZXJ0X3RvX3BsbChkZHJfY2xrKTsKCgoJewoKCQl3cl9yZWcoQU1fRERSX1BMTF9DTlRMLCAoKChyZF9yZWcoQU1fRERSX1BMTF9DTlRMKSkmKH4oMHhmZmZmZikpKXwoZGRyX3BsbCkpKTsKCQlkZHJfdWRlbGF5KDIwMDApOwoJfQoKCgoKCgoJICAgICBtYXhfZnJlcT1kZHJfY2xrX29yZzsKCSAgICAgbWluX2ZyZXE9ZGRyX2Nsa19vcmc7CgoKCgoKCSAgI2RlZmluZSAgRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFICAgMHgyMDAwMAoJICAgIHVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCgoKCgkgaWYgKGFyZ2MgPT0gMSkKCQl7CgkJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQl0ZXN0X2xvb3A9MTsKCQkJCSBhZGRfZnJlcT0xOwoJCQkJICBzdWJfZnJlcT0xOwoJCX0KCgkgIGlmIChhcmdjID09IDIpCgkJewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCAmZW5kcCwgMTYpOwoJCXRlc3RfbG9vcD0xOwoJCQkJIGFkZF9mcmVxPTE7CgkJCQkgIHN1Yl9mcmVxPTE7CgkJfQoJCWlmIChhcmdjPT0gMykKCQkJewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCAmZW5kcCwgMTYpOwoJCXRlc3RfbG9vcD0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgJmVuZHAsIDE2KTsKCQkJCSBhZGRfZnJlcT0xOwoJCQkJICBzdWJfZnJlcT0xOwoJCX0KCQlpZiAoYXJnYyA+PSA0KQoJCQl7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sICZlbmRwLCAxNik7CgkJdGVzdF9sb29wPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCAmZW5kcCwgMTYpOwoJCQkJYWRkX2ZyZXE9MTsKCQkJICAgICAgICBzdWJfZnJlcT0xOwogICAgICAgICAgICAgICAgICAgIGlmICgoc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgJmVuZHAsIDE2KSkgPT0gMSkKCQkJCQkJewoJCQkJIGFkZF9mcmVxPTE7CgkJCSAgICAgICAgc3ViX2ZyZXE9MDsKCQkJCQkJfQoJCSAgICAgZWxzZSBpZigoc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgJmVuZHAsIDE2KSk9PTApCgkJCQl7CgkJCQkJYWRkX2ZyZXE9MDsKCQkJICAgICAgICBzdWJfZnJlcT0xOwoJCQkJfQoJCX0KCiAgICAgIGlmIChhcmdjPjQpCgkJewogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc2ltcGxlX3N0cnRvdWwoYXJndls0XSwgJmVuZHAsIDE2KSkgPT0gMSkKCQkJCQkJewoJCQkJIHpxMHByX2Rydl9mbGFnPTA7CgkJCSAgICAgICAgenEwcHJfb2R0X2ZsYWc9MTsKCQkJCQkJfQoJCSAgICAgZWxzZSBpZigoc2ltcGxlX3N0cnRvdWwoYXJndls0XSwgJmVuZHAsIDE2KSk9PTApCgkJCQl7CgkJCQkJenEwcHJfZHJ2X2ZsYWc9MTsKCQkJICAgICAgICB6cTBwcl9vZHRfZmxhZz0wOwoJCQkJfQoKCQl9CgoKCXVuc2lnbmVkIGludCAgCXRlbXBfdGVzdF9lcnJvcj0wOwoKCgl0ZXN0X3RpbWVzPTE7Cgl0ZW1wX3Rlc3RfZXJyb3I9MDsKd2hpbGUgKHRlc3RfdGltZXM8KHRlc3RfbG9vcCsxKSkKewpwcmludGYoIlxudGVzdF90aW1lcz09ICVkIHRpbWVzXG4iLCB0ZXN0X3RpbWVzKTsKCiBpZiAoYWRkX2ZyZXEpCgl7CgoJd2hpbGUgKGRkcl9jbGs8MTUwMCkKCQl7CgkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJZGRyX2Nsaz1kZHJfY2xrKzEyOwoJZGRyX3BsbCA9IGRkcl9jbGtfY29udmVydF90b19wbGwoZGRyX2Nsayk7Cgl7CgoJCXdyX3JlZyhBTV9ERFJfUExMX0NOVEwsICgoKHJkX3JlZyhBTV9ERFJfUExMX0NOVEwpKSYofigweGZmZmZmKSkpfChkZHJfcGxsKSkpOwoJCWRkcl91ZGVsYXkoMjAwMCk7CgkJIHByaW50ZigiXG50ZXN0aW5nX2Rkcl9jbGs9PSAlZE1IelxuIiwgZGRyX2Nsayk7Cgl9Cgp0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CnRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwppZiAodGVtcF90ZXN0X2Vycm9yKQp7Cm1heF9mcmVxPWRkcl9jbGstMTI7CiAgcHJpbnRmKCJcbm1heF9kZHJfY2xrPT0gJWRNSHpcbiIsIG1heF9mcmVxKTsKCXRlbXBfdGVzdF9lcnJvcj0wOwogIGJyZWFrOwp9CgoJCX0KCgl3aGlsZSAoZGRyX2Nsaz5kZHJfY2xrX29yZykKCQl7CglkZHJfY2xrPWRkcl9jbGstMTI7CglkZHJfcGxsID0gZGRyX2Nsa19jb252ZXJ0X3RvX3BsbChkZHJfY2xrKTsKCXsKCgkJd3JfcmVnKEFNX0REUl9QTExfQ05UTCwgKCgocmRfcmVnKEFNX0REUl9QTExfQ05UTCkpJih+KDB4ZmZmZmYpKSl8KGRkcl9wbGwpKSk7CgkJZGRyX3VkZWxheSgyMDAwKTsKCX0KCQl9CnByaW50ZigiXG5iYWNrIHRvICBvcmdfZGRyX2Nsaz09ICVkTUh6XG4iLCBkZHJfY2xrKTsKCgoJfQoKIGlmIChzdWJfZnJlcSkKCXsKCgl3aGlsZSAoZGRyX2Nsaz4yNCkKCQl7CgkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJZGRyX2Nsaz1kZHJfY2xrLTEyOwoJZGRyX3BsbCA9IGRkcl9jbGtfY29udmVydF90b19wbGwoZGRyX2Nsayk7Cgl7CgoJCXdyX3JlZyhBTV9ERFJfUExMX0NOVEwsICgoKHJkX3JlZyhBTV9ERFJfUExMX0NOVEwpKSYofigweGZmZmZmKSkpfChkZHJfcGxsKSkpOwoJCWRkcl91ZGVsYXkoMjAwMCk7CgkJIHByaW50ZigiXG50ZXN0aW5nX2Rkcl9jbGs9PSAlZE1IelxuIiwgZGRyX2Nsayk7Cgl9Cgp0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CnRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwppZiAodGVtcF90ZXN0X2Vycm9yKQp7Cm1pbl9mcmVxPWRkcl9jbGsrMTI7CiAgcHJpbnRmKCJcbm1pbl9kZHJfY2xrPT0gJWRNSHpcbiIsIG1pbl9mcmVxKTsKCXRlbXBfdGVzdF9lcnJvcj0wOwogIGJyZWFrOwp9CgoJCX0KCgl3aGlsZSAoZGRyX2NsazxkZHJfY2xrX29yZykKCQl7CglkZHJfY2xrPWRkcl9jbGsrMTI7CglkZHJfcGxsID0gZGRyX2Nsa19jb252ZXJ0X3RvX3BsbChkZHJfY2xrKTsKCXsKCgkJd3JfcmVnKEFNX0REUl9QTExfQ05UTCwgKCgocmRfcmVnKEFNX0REUl9QTExfQ05UTCkpJih+KDB4ZmZmZmYpKSl8KGRkcl9wbGwpKSk7CgkJZGRyX3VkZWxheSgyMDAwKTsKCX0KCQl9CnByaW50ZigiXG5iYWNrIHRvICBvcmdfZGRyX2Nsaz09ICVkTUh6XG4iLCBkZHJfY2xrKTsKCgoJfQoKaWYgKHRlc3RfdGltZXMgPT0gMSkKewoKCSAgbG9vcF9tYXhfZnJlcT1tYXhfZnJlcTsKCSAgbG9vcF9taW5fZnJlcT1taW5fZnJlcTsKfQplbHNlCnsKaWYgKGxvb3BfbWF4X2ZyZXE+bWF4X2ZyZXEpCnsKbG9vcF9tYXhfZnJlcT1tYXhfZnJlcTsKfQppZiAobWluX2ZyZXE+bG9vcF9taW5fZnJlcSkKewpsb29wX21pbl9mcmVxPW1pbl9mcmVxOwp9Cn0KdGVzdF90aW1lcysrOwoKfQoKIHByaW50ZigiXG5sb29wX21pbl9mcmVxPT0gJWRNSHoscGxsPT0weCUwOHhcbiIsIGxvb3BfbWluX2ZyZXEsZGRyX2Nsa19jb252ZXJ0X3RvX3BsbChsb29wX21pbl9mcmVxKSk7CiBwcmludGYoIlxubG9vcF9tYXhfZnJlcT09ICVkTUh6LHBsbD09MHglMDh4XG4iLCBsb29wX21heF9mcmVxLGRkcl9jbGtfY29udmVydF90b19wbGwobG9vcF9tYXhfZnJlcSkpOwoKCgl3aGlsZSAoZGRyX2Nsaw08bG9vcF9tYXhfZnJlcSkKCQl7CglkZHJfY2xrPWRkcl9jbGsrMTI7CglkZHJfcGxsID0gZGRyX2Nsa19jb252ZXJ0X3RvX3BsbChkZHJfY2xrKTsKCXsKCgkJd3JfcmVnKEFNX0REUl9QTExfQ05UTCwgKCgocmRfcmVnKEFNX0REUl9QTExfQ05UTCkpJih+KDB4ZmZmZmYpKSl8KGRkcl9wbGwpKSk7CgkJZGRyX3VkZWxheSgyMDAwKTsKCX0KCQl9CnByaW50ZigiXG5zZXQgdG8gIGxvb3BfbWF4X2ZyZXE9PSAlZE1IelxuIiwgbG9vcF9tYXhfZnJlcSk7Cgp1cGRhdGVfZGRyX3pxKHpxMHByKTsKCgkgenEwcHJfZHJ2X21heD0oenEwcHImMHhmKTsKCSB6cTBwcl9kcnZfbWluPSh6cTBwciYweGYpOwoJIHpxMHByX29kdF9tYXg9KHpxMHByJjB4ZjApOwoJIHpxMHByX29kdF9taW49KHpxMHByJjB4ZjApOwoKaWYgKHpxMHByX2Rydl9mbGFnKQp7CndoaWxlICgoenEwcHImMHhmKTwweGYpCnsKenEwcHIrKzsKdXBkYXRlX2Rkcl96cSh6cTBwcik7CnRlbXBfdGVzdF9lcnJvcj0wOwp0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CnRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwppZiAodGVtcF90ZXN0X2Vycm9yKQp7CnpxMHByLS07CnVwZGF0ZV9kZHJfenEoenEwcHIpOwpicmVhazsKCgp9Cn0KenEwcHJfZHJ2X21heD0oenEwcHImMHhmKTsKcHJpbnRmKCJcbnpxMHByX2Rydl9tYXg9PSAweCUwOHhcbiIsIHpxMHByX2Rydl9tYXgpOwoKdXBkYXRlX2Rkcl96cSh6cTBwcl9vcmcpOwoKd2hpbGUgKCh6cTBwciYweGYpPjB4MCkKewp6cTBwci0tOwp1cGRhdGVfZGRyX3pxKHpxMHByKTsKdGVtcF90ZXN0X2Vycm9yPTA7CnRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CmlmICh0ZW1wX3Rlc3RfZXJyb3IpCnsKenEwcHIrKzsKdXBkYXRlX2Rkcl96cSh6cTBwcik7CmJyZWFrOwoKCn0KfQoKCnpxMHByX2Rydl9taW49KHpxMHByJjB4Zik7CnByaW50ZigiXG56cTBwcl9kcnZfbWF4PT0gMHglMDh4XG4iLCB6cTBwcl9kcnZfbWluKTsKfQoKaWYgKHpxMHByX29kdF9mbGFnKQp7CndoaWxlICgoenEwcHImMHhmMCk8MHhmMCkKewp6cTBwcj16cTBwcisweDEwOwp1cGRhdGVfZGRyX3pxKHpxMHByKTsKdGVtcF90ZXN0X2Vycm9yPTA7CnRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CmlmICh0ZW1wX3Rlc3RfZXJyb3IpCnsKenEwcHI9enEwcHItMHgxMDsKdXBkYXRlX2Rkcl96cSh6cTBwcik7CmJyZWFrOwoKCn0KfQp6cTBwcl9vZHRfbWF4PSh6cTBwciYweGYwKTsKcHJpbnRmKCJcbnpxMHByX29kdF9tYXg9PSAweCUwOHhcbiIsIHpxMHByX29kdF9tYXgpOwoKdXBkYXRlX2Rkcl96cSh6cTBwcl9vcmcpOwoKCndoaWxlICgoenEwcHImMHhmMCk+MHgwKQp7CnpxMHByPXpxMHByLTB4MTA7CnVwZGF0ZV9kZHJfenEoenEwcHIpOwp0ZW1wX3Rlc3RfZXJyb3I9MDsKdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwp0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKaWYgKHRlbXBfdGVzdF9lcnJvcikKewp6cTBwcj16cTBwcisweDEwOwp1cGRhdGVfZGRyX3pxKHpxMHByKTsKYnJlYWs7CgoKfQp9CnpxMHByX29kdF9taW49KHpxMHByJjB4ZjApOwpwcmludGYoIlxuenEwcHJfb2R0X21pbj09IDB4JTA4eFxuIiwgenEwcHJfb2R0X21pbik7Cn0KdXBkYXRlX2Rkcl96cSh6cTBwcl9vcmcpOwoKcHJpbnRmKCJcbnpxMHByX2Rydl9tYXg9PSAweCUwOHhcbiIsIHpxMHByX2Rydl9tYXgpOwpwcmludGYoIlxuenEwcHJfZHJ2X21pbj09IDB4JTA4eFxuIiwgenEwcHJfZHJ2X21pbik7CnByaW50ZigiXG56cTBwcl9vZHRfbWF4PT0gMHglMDh4XG4iLCB6cTBwcl9vZHRfbWF4KTsKcHJpbnRmKCJcbnpxMHByX29kdF9taW49PSAweCUwOHhcbiIsIHpxMHByX29kdF9taW4pOwoKIHJldHVybiBsb29wX21heF9mcmVxOwoKCgp9CgppbnQgY2xlYXJfZGRyX2JhbmRfbW9uaXRvcih1bnNpZ25lZCBpbnQgcG9ydCx1bnNpZ25lZCBpbnQgcG9ydF9pZCx1bnNpZ25lZCBpbnQgdGltZXJfY291bnRlcikKewp3cl9yZWcoRE1DX01PTl9DVFJMMywgdGltZXJfY291bnRlcik7CndyX3JlZyhETUNfTU9OX0NUUkwyLCAocG9ydF9pZDw8MCl8KHBvcnQ8PDE2KXwoMDw8MjApfCgxPDwzMCkpOwpkZHJfdWRlbGF5KDEpOwppZiAoKChyZF9yZWcoRE1DX01PTl9DVFJMMikpPj4zMCkgPT0gMSkKCXJldHVybiAxOwplbHNlCglyZXR1cm4gMDsKCgp9CmludCBvcGVuX2Rkcl9iYW5kX21vbml0b3IodW5zaWduZWQgaW50IHBvcnQsdW5zaWduZWQgaW50IHBvcnRfaWQsdW5zaWduZWQgaW50IHRpbWVyX2NvdW50ZXIpCnsKd3JfcmVnKERNQ19NT05fQ1RSTDMsIHRpbWVyX2NvdW50ZXIpOwp3cl9yZWcoRE1DX01PTl9DVFJMMiwgKChyZF9yZWcoRE1DX01PTl9DVFJMMikpJigxPDwzMCkpfChwb3J0X2lkPDwwKXwocG9ydDw8MTYpfCgwPDwyMCl8KDE8PDMxKSk7CgoJcmV0dXJuIDE7CgoKfQoKaW50IGZpbmlzaF9kZHJfYmFuZF9tb25pdG9yKHVuc2lnbmVkIGludCBwb3J0LHVuc2lnbmVkIGludCBwb3J0X2lkLHVuc2lnbmVkIGludCB0aW1lcl9jb3VudGVyKQp7Ci8vd3JfcmVnKERNQ19NT05fQ1RSTDMsIHRpbWVyX3RpbWUpOwppZiAoKChyZF9yZWcoRE1DX01PTl9DVFJMMikpPj4zMSkgPT0gMCkKewpwcmludGYoIlxuZGRyIGJhbmR3aWR0aCB0aW1lciBmaW5pc2ggY291bnQgYW5kIHByaW50IHJlc3VsdFxuIik7CnByaW50ZigiXG5ETUNfTU9OX3BvcnQJPT0gMHglMDh4IHBvcnRfaWQ9PTB4JTA4eCB0aW1lcl90aW1lPT0weCUwOHgiLHBvcnQscG9ydF9pZCx0aW1lcl9jb3VudGVyKTsKcHJpbnRmKCJcbkRNQ19NT05fQUxMX1JFUV9DTlQJPT0gMHglMDh4IiwocmRfcmVnKERNQ19NT05fQUxMX1JFUV9DTlQpKSk7CgpwcmludGYoIlxuRE1DX01PTl9BTExfR1JBTlRfQ05UCT09IDB4JTA4eCIsKHJkX3JlZyhETUNfTU9OX0FMTF9HUkFOVF9DTlQpKSk7CnByaW50ZigiXG5ETUNfTU9OX0FMTF9HUkFOVF9DTlRfYmFuZAk9PSAweCUwOHgga2J5dGUsZGVjPT0gJWQgTWJ5dGUiLCgocmRfcmVnKERNQ19NT05fQUxMX0dSQU5UX0NOVCkpKig4KSkvMTAyNCwoKHJkX3JlZyhETUNfTU9OX0FMTF9HUkFOVF9DTlQpKSooOCkpLygxMDI0KjEwMjQpKTsKcHJpbnRmKCJcbkRNQ19NT05fT05FIF9HUkFOVF9DTlQgZm9yIHNlbGVjdGVkIHBvcnQgYW5kIHN1Ymlkcwk9PSAweCUwOHgiLChyZF9yZWcoRE1DX01PTl9PTkVfR1JBTlRfQ05UKSkpOwpwcmludGYoIlxuRE1DX01PTl9PTkUgX0dSQU5UX0NOVF9iYW5kIGZvciBzZWxlY3RlZCBwb3J0IGFuZCBzdWJpZHMJPT0gMHglMDh4LGRlYz09ICVkTWJ5dGUiLCgocmRfcmVnKERNQ19NT05fT05FX0dSQU5UX0NOVCkpKig4KSkvMTAyNCwoKHJkX3JlZyhETUNfTU9OX09ORV9HUkFOVF9DTlQpKSooOCkpLygxMDI0KjEwMjQpKTsKfQovL3dyX3JlZyhETUNfTU9OX0NUUkwyLCAoKHJkX3JlZyhETUNfTU9OX0NUUkwyKSkmKDE8PDMwKSl8KHBvcnRfaWQ8PDApfChwb3J0PDwxNil8KDA8PDIwKXwoMTw8MzEpKTsKCglyZXR1cm4gMTsKCgp9CgoKCmludCBkb19kZHJfdGVzdF9iYW5kd2lkdGgoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CiAgIHByaW50ZigiXG5FbnRlciBUZXN0IGRkciBiYW5kd2lkdGggIGZ1bmN0aW9uXG4iKTsKIC8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKICBwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CgoKCnsKLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpOwp9Cgp7Ck9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKTsKLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKfQoKCSBjaGFyICplbmRwOwogLy8gIHVuc2lnbmVkIGludCAgICpwX3N0YXJ0X2FkZHI7CiAgdW5zaWduZWQgaW50ICAgdGVzdF9sb29wPTE7CiAgIHVuc2lnbmVkIGludCAgIHRlc3RfdGltZXM9MTsKICAgdW5zaWduZWQgaW50IHRpbWVyX3RpbWVfbXM9MTAwMDsKCgoJICAgdW5zaWduZWQgaW50IGRkcl9wbGw9MHgxMDIyMTsKCXVuc2lnbmVkIGludCBkZHJfY2xrX29yZz03OTI7Cgl1bnNpZ25lZCBpbnQgZGRyX3BsbF9vcmcgPSByZF9yZWcoQU1fRERSX1BMTF9DTlRMKSYofigxPDwyOSkpOwoJZGRyX3BsbD1kZHJfcGxsX29yZzsKCXVuc2lnbmVkIGludCBkZHJfY2xrID0gcGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfcGxsKTsKCWRkcl9jbGtfb3JnPWRkcl9jbGs7CgkJcHJpbnRmKCJcbmRkcl9jbGtfb3JnPT0gJWRNSHpcbiIsIGRkcl9jbGtfb3JnKTsKCgl1bnNpZ25lZCBpbnQgenEwcHIgPSByZF9yZWcoRERSMF9QVUJfWlEwUFIpOwoJcHJpbnRmKCJcbmRkcl96cTBwcj09IDB4JTA4eFxuIiwgenEwcHIpOwoKCSAgIGRkcl9wbGwgPSBkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKGRkcl9jbGspOwoKCgoKCgoJICNkZWZpbmUgIEREUl9DT1JTU19UQUxLX1RFU1RfU0laRSAgIDB4MjAwMDAKCgkgICAgdW5zaWduZWQgaW50ICAgZGRyX3Rlc3Rfc2l6ZT0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoKdW5zaWduZWQgaW50IHRlc3RfcG9ydD0wOwp1bnNpZ25lZCBpbnQgdGVzdF9wb3J0X3N1Yl9pZD0xOwoKCgkgaWYgKGFyZ2MgPT0gMSkKCQl7CgkJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQl0ZXN0X2xvb3A9MTsKCgkJfQoKCSAgaWYgKGFyZ2MgPT0gMikKCQl7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sICZlbmRwLCAxNik7CgkJdGVzdF9sb29wPTE7CgoJCX0KCQlpZiAoYXJnYz09IDMpCgkJCXsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgJmVuZHAsIDE2KTsKCQl0ZXN0X2xvb3A9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sICZlbmRwLCAxNik7CgoJCX0KCQlpZiAoYXJnYyA+PSA0KQoJCQl7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sICZlbmRwLCAxNik7CgkJdGVzdF9sb29wPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCAmZW5kcCwgMTYpOwoJCQl0ZXN0X3BvcnQ9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sICZlbmRwLCAxNik7CgoKCQl9CglpZiAoYXJnYyA+PSA1KQoJCQl7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sICZlbmRwLCAxNik7CgkJdGVzdF9sb29wPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCAmZW5kcCwgMTYpOwoJCQl0ZXN0X3BvcnQ9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sICZlbmRwLCAxNik7CgkJCQkgIHRlc3RfcG9ydF9zdWJfaWQ9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNF0sICZlbmRwLCAxNik7CgoJCX0KCWlmIChhcmdjID41KQoJCQl7CgoJCQkJICB0aW1lcl90aW1lX21zPSBzaW1wbGVfc3RydG91bChhcmd2WzVdLCAmZW5kcCwgMTYpOwoKCQl9CgoKCgoJLy91bnNpZ25lZCBpbnQgIAl0ZW1wX3Rlc3RfZXJyb3I9MDsKCXVuc2lnbmVkIGludCB0aW1lcl9jb3VudGVyPTA7Cgl0aW1lcl9jb3VudGVyPSh0aW1lcl90aW1lX21zKjEwMDAqZGRyX2Nsay8yKTsKLy93aGlsZSh0ZXN0X3RpbWVzPCh0ZXN0X2xvb3ArMSkpCnsKCgoKCXsKCWNsZWFyX2Rkcl9iYW5kX21vbml0b3IoIHRlc3RfcG9ydCwgdGVzdF9wb3J0X3N1Yl9pZCwgdGltZXJfY291bnRlcik7Cgkgb3Blbl9kZHJfYmFuZF9tb25pdG9yKCB0ZXN0X3BvcnQsIHRlc3RfcG9ydF9zdWJfaWQsIHRpbWVyX2NvdW50ZXIpOwoJIHdoaWxlICh0ZXN0X3RpbWVzPCh0ZXN0X2xvb3ArMSkpCgkJewoJCXByaW50ZigiXG50ZXN0X3RpbWVzPT0gJWQgdGltZXNcbiIsIHRlc3RfdGltZXMpOwoJIGRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJIHRlc3RfdGltZXMrKzsKCQl9CgkgZmluaXNoX2Rkcl9iYW5kX21vbml0b3IoIHRlc3RfcG9ydCwgdGVzdF9wb3J0X3N1Yl9pZCwgdGltZXJfY291bnRlcik7CiBwcmludGYoIlxudGltZXJfdGltZV9tcz09ICVkIG1zXG4iLCB0aW1lcl90aW1lX21zKTsKCiBwcmludGYoIlxuZGRyX2Nsaz09ICVkTUh6XG4iLCBkZHJfY2xrKTsKCgoJfQoKCgoKCgp9CgoKCgoKCgogcmV0dXJuIDE7CgoKCn0KCmludCBkb19kZHJfZmluZV90dW5lX2xjZGxyX2VudihjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKICAgcHJpbnRmKCJcbkVudGVyIGRkcl9maW5lX3R1bmVfbGNkbHJfZW52ICBmdW5jdGlvblxuIik7CiAvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CglpbnQgaT0wOwogIHByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKIGZvciAoaSA9IDA7aTxhcmdjO2krKykKICB7CiAgcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7CiAgfQoKCnsKLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpOwp9Cgp7Ck9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKTsKLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKfQoKCSBjaGFyICplbmRwOwogLy8gIHVuc2lnbmVkIGludCAgICpwX3N0YXJ0X2FkZHI7CgoKCgoJICAgI2RlZmluZSBXUl9SRF9BREpfVVNFX0VOViAgMQoJICAgICAjZGVmaW5lIFdSX1JEX0FESl9VU0VfVUFSVF9JTlBVVCAyCnVuc2lnbmVkIGludCAgIHdyX3JkX2Fkal9pbnB1dF9zcmM9MTsKIHsKCmludCB3cl9hZGpfcGVyWzEyXT17CgkxMDAJLAoJMTAwMAksCgkxMDAJLAoJMTAwCSwKCTEwMAksCgkxMDAJLAoJMTAwCSwKCTEwMAksCgkxMDAJLAoJMTAwCSwKCTEwMAksCgkxMDAJLAoKfTsKaW50IHJkX2Fkal9wZXJbMTJdPXsKMTAwCSwKMTAwCSwKODAJLAo4MAksCjgwCSwKODAJLAoxMDAJLAoxMDAJLAoxMDAJLAoxMDAJLAoxMDAJLAoxMDAJLAp9OwogaWYgKGFyZ2MgPT0gMSkKCXsgIHByaW50ZigiXG5wbGVhc2UgcmVhZCBoZWxwXG4iKTsKCX0KCWlmIChhcmdjID49IDIpCgkJCXsKCQl3cl9yZF9hZGpfaW5wdXRfc3JjID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgJmVuZHAsIDEwKTsKCgkgdW5zaWduZWQgaW50IGk9MDsKaWYgKHdyX3JkX2Fkal9pbnB1dF9zcmMgPT0gV1JfUkRfQURKX1VTRV9VQVJUX0lOUFVUKQp7CnByaW50ZigiXG50dW5lIGRkciBsY2RsciB1c2UgdWFydCBpbnB1dFxuIik7CmlmIChhcmdjPjI0KzIpCgkJe2FyZ2M9MjQrMjt9CnsKCglmb3IgKGkgPSAyO2k8YXJnYztpKyspCgkJewoJCWlmIChpPCgyKzEyKSkgewoJCXdyX2Fkal9wZXJbaS0yXT1zaW1wbGVfc3RydG91bChhcmd2W2ldLCAmZW5kcCwgMTApOwoJCX0KCWVsc2UKCQl7CgkJcmRfYWRqX3BlcltpLTE0XT1zaW1wbGVfc3RydG91bChhcmd2W2ldLCAmZW5kcCwgMTApOwoJCX0KCQl9Cn0KCn0KaWYgKHdyX3JkX2Fkal9pbnB1dF9zcmMgPT0gV1JfUkRfQURKX1VTRV9FTlYpCntwcmludGYoIlxudHVuZSBkZHIgbGNkbHIgdXNlIHVib290IGVudlxuIik7CnsKLy9jaGFyIHN0clsyNF07CiBjb25zdCBjaGFyICpzOwoKIC8vIGNoYXIgKnZhcm5hbWU7CiBpbnQgdmFsdWU9MDsKCi8vKnZhcm5hbWU9ImVudl9kZHJ0ZXN0IjsKIHMgPSBnZXRlbnYoImVudl93cl9sY2Rscl9wciIpOwogaWYgKHMpCgl7Ly9pPTA7CgkvL3doaWxlKHNfdGVtcCkKCXsKCXByaW50ZigiJXMiLHMpOwoJLy9zc2NhbmYocywiZCUsIix3cl9hZGpfcGVyKTsKCS8vc3ByaW50ZihzdHIsImQlIixzKTsKCS8vZ2V0YwoKCX0KICB2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKHMsICZlbmRwLCAxNik7CglwcmludGYoIiVkIix2YWx1ZSk7Cgl9CiBzID0gZ2V0ZW52KCJlbnZfcmRfbGNkbHJfcHIiKTsKCiBpZiAocykKCXsvL2k9MDsKCS8vd2hpbGUoc190ZW1wKQoJewoJcHJpbnRmKCIlcyIscyk7CgkvL3NzY2FuZihzLCJkJSwiLHJkX2Fkal9wZXIpOwoKCX0KICAvL3ZhbHVlID0gc2ltcGxlX3N0cnRvdWwocywgJmVuZHAsIDE2KTsKCX0KCiAvL3NwcmludGYoc3RyLCAiJWx4IiwgdmFsdWUpOwovLyAgc2V0ZW52KCJlbnZfZGRydGVzdCIsIHN0cik7CgoKLy9ydW5fY29tbWFuZCgic2F2ZSIsMCk7Cn0KCmlmIChhcmdjPjI0KzIpCglhcmdjPTI0KzI7Cglmb3IgKGkgPSAyO2k8YXJnYztpKyspCgkJewoJCWlmIChpPCgyKzEyKSkgewoJCXdyX2Fkal9wZXJbaS0yXT1zaW1wbGVfc3RydG91bChhcmd2W2ldLCAmZW5kcCwgMTYpOwoJCX0KCWVsc2UKCQl7CgkJcmRfYWRqX3BlcltpLTE0XT1zaW1wbGVfc3RydG91bChhcmd2W2ldLCAmZW5kcCwgMTYpOwoJCX0KCQl9CgoKfQpwcmludGYoIiBpbnQgd3JfYWRqX3BlclsxMl09e1xuIik7Cglmb3IgKGkgPSAwO2k8MTI7aSsrKQoJCXsKCQlwcmludGYoIiUwNGQgLFxuIix3cl9hZGpfcGVyW2ldKTsKCQl9CglwcmludGYoIn07XG4iKTsKCXByaW50ZigiIGludCByZF9hZGpfcGVyWzEyXT17XG4iKTsKCWZvciAoaSA9IDA7aTwxMjtpKyspCgkJewoJCXByaW50ZigiJTA0ZCAsXG4iLHJkX2Fkal9wZXJbaV0pOwoJCX0KCSAgIHByaW50ZigifTtcbiIpOwoKCiNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV85MDVYKQp3cl9yZWcoRERSMF9QVUJfUElSLCAocmRfcmVnKEREUjBfUFVCX1BJUikpfCgxPDwyOSkpOwp3cl9yZWcoRERSMF9QVUJfUEdDUjYsIChyZF9yZWcoRERSMF9QVUJfUEdDUjYpKXwoMTw8MCkpOwp3cl9yZWcoRERSMV9QVUJfUElSLCAocmRfcmVnKEREUjFfUFVCX1BJUikpfCgxPDwyOSkpOwp3cl9yZWcoRERSMV9QVUJfUEdDUjYsIChyZF9yZWcoRERSMV9QVUJfUEdDUjYpKXwoMTw8MCkpOwojZWxzZQp3cl9yZWcoRERSMF9QVUJfUElSLCAocmRfcmVnKEREUjBfUFVCX1BJUikpfCgxPDwyOSkpOwp3cl9yZWcoRERSMF9QVUJfUEdDUjEsIChyZF9yZWcoRERSMF9QVUJfUEdDUjEpKXwoMTw8MjYpKTsKd3JfcmVnKEREUjFfUFVCX1BJUiwgKHJkX3JlZyhERFIxX1BVQl9QSVIpKXwoMTw8MjkpKTsKd3JfcmVnKEREUjFfUFVCX1BHQ1IxLCAocmRfcmVnKEREUjFfUFVCX1BHQ1IxKSl8KDE8PDI2KSk7CiNlbmRpZgoKaW50IGxjZGxyX3c9MCxsY2Rscl9yPTA7CnVuc2lnbmVkIHRlbXBfcmVnPTA7CmludCB0ZW1wX2NvdW50PTA7CmZvciAoIHRlbXBfY291bnQ9MDt0ZW1wX2NvdW50PDI7dGVtcF9jb3VudCsrKQp7ICAgICB0ZW1wX3JlZz0odW5zaWduZWQpKEREUjBfUFVCX0FDTENETFIrKHRlbXBfY291bnQ8PDIpKTsKCSAgIGxjZGxyX3c9KGludCkoKHJkX3JlZygodWludDY0X3QpKHRlbXBfcmVnKSkpJkFDTENETFJfTUFYKTsKCSAgIGxjZGxyX3c9bGNkbHJfdz9sY2Rscl93OjE7CglsY2Rscl93PShsY2Rscl93Kih3cl9hZGpfcGVyW3RlbXBfY291bnRdKSkvMTAwOwoJaWYgKHRlbXBfY291bnQgPT0gMSkKCQlsY2Rscl93PWxjZGxyX3cmQUNCRExSX01BWDsKCXdyX3JlZygoKHVpbnQ2NF90KSh0ZW1wX3JlZykpLCgobGNkbHJfdykmQUNMQ0RMUl9NQVgpKTsKfQojaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfOTA1WCkKZm9yICggdGVtcF9jb3VudD0yO3RlbXBfY291bnQ8Njt0ZW1wX2NvdW50KyspCnsgICAgIHRlbXBfcmVnPSh1bnNpZ25lZCkoRERSMF9QVUJfRFgwTENETFIxKyhERFIwX1BVQl9EWDFMQ0RMUjEtRERSMF9QVUJfRFgwTENETFIxKSoodGVtcF9jb3VudC0yKSk7CgkgICBsY2Rscl93PShpbnQpKChyZF9yZWcoKHVpbnQ2NF90KSh0ZW1wX3JlZykpKSZEUUxDRExSX01BWCk7CglsY2Rscl93PWxjZGxyX3c/bGNkbHJfdzoxOwoJbGNkbHJfcj0oaW50KSgoKHJkX3JlZygodWludDY0X3QpKHRlbXBfcmVnK0REUjBfUFVCX0RYMExDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjEpKSkpJkRRTENETFJfTUFYKTsKCWxjZGxyX3I9bGNkbHJfcj9sY2Rscl9yOjE7CglsY2Rscl93PShsY2Rscl93Kih3cl9hZGpfcGVyW3RlbXBfY291bnRdKSkvMTAwOwoJbGNkbHJfcj0obGNkbHJfcioocmRfYWRqX3Blclt0ZW1wX2NvdW50XSkpLzEwMDsKCXdyX3JlZygoKHVpbnQ2NF90KSh0ZW1wX3JlZykpLChsY2Rscl93KSk7Cgl3cl9yZWcoKCh1aW50NjRfdCkodGVtcF9yZWcrRERSMF9QVUJfRFgwTENETFIzLUREUjBfUFVCX0RYMExDRExSMSkpLChsY2Rscl9yKSk7Cgl3cl9yZWcoKCh1aW50NjRfdCkodGVtcF9yZWcrRERSMF9QVUJfRFgwTENETFI0LUREUjBfUFVCX0RYMExDRExSMSkpLChsY2Rscl9yKSk7Cn0KI2Vsc2UKZm9yICggdGVtcF9jb3VudD0yO3RlbXBfY291bnQ8Njt0ZW1wX2NvdW50KyspCnsgICAgIHRlbXBfcmVnPSh1bnNpZ25lZCkoRERSMF9QVUJfRFgwTENETFIxKyhERFIwX1BVQl9EWDFMQ0RMUjEtRERSMF9QVUJfRFgwTENETFIxKSoodGVtcF9jb3VudC0yKSk7CgkgICBsY2Rscl93PShpbnQpKChyZF9yZWcoKHVpbnQ2NF90KSh0ZW1wX3JlZykpKSZEUUxDRExSX01BWCk7CglsY2Rscl93PWxjZGxyX3c/bGNkbHJfdzoxOwoJbGNkbHJfcj0oaW50KSgoKHJkX3JlZygodWludDY0X3QpKHRlbXBfcmVnKSkpPj44KSZEUUxDRExSX01BWCk7CglsY2Rscl9yPWxjZGxyX3I/bGNkbHJfcjoxOwoJbGNkbHJfdz0obGNkbHJfdyood3JfYWRqX3Blclt0ZW1wX2NvdW50XSkpLzEwMDsKCWxjZGxyX3I9KGxjZGxyX3IqKHJkX2Fkal9wZXJbdGVtcF9jb3VudF0pKS8xMDA7Cgl3cl9yZWcoKCh1aW50NjRfdCkodGVtcF9yZWcpKSwoKChsY2Rscl9yPDwxNil8KGxjZGxyX3I8PDgpfChsY2Rscl93KSkpKTsKfQojZW5kaWYKZm9yICggdGVtcF9jb3VudD02O3RlbXBfY291bnQ8ODt0ZW1wX2NvdW50KyspCnsgICAgIHRlbXBfcmVnPSh1bnNpZ25lZCkoRERSMV9QVUJfQUNMQ0RMUisoKHRlbXBfY291bnQtNik8PDIpKTsKCgkgICBsY2Rscl93PShpbnQpKChyZF9yZWcoKHVpbnQ2NF90KSh0ZW1wX3JlZykpKSZBQ0xDRExSX01BWCk7CgkgICBsY2Rscl93PWxjZGxyX3c/bGNkbHJfdzoxOwoJbGNkbHJfdz0obGNkbHJfdyood3JfYWRqX3Blclt0ZW1wX2NvdW50XSkpLzEwMDsKCQlpZiAodGVtcF9jb3VudCA9PSA3KQoJCWxjZGxyX3c9bGNkbHJfdyZBQ0JETFJfTUFYOwoJd3JfcmVnKCgodWludDY0X3QpKHRlbXBfcmVnKSksKChsY2Rscl93KSZBQ0xDRExSX01BWCkpOwp9CiNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV85MDVYKQpmb3IgKCB0ZW1wX2NvdW50PTg7dGVtcF9jb3VudDwxMjt0ZW1wX2NvdW50KyspCnsgICAgIHRlbXBfcmVnPSh1bnNpZ25lZCkoRERSMV9QVUJfRFgwTENETFIxKyhERFIxX1BVQl9EWDFMQ0RMUjEtRERSMV9QVUJfRFgwTENETFIxKSoodGVtcF9jb3VudC0yKSk7CgkgICBsY2Rscl93PShpbnQpKChyZF9yZWcoKHVpbnQ2NF90KSh0ZW1wX3JlZykpKSZEUUxDRExSX01BWCk7CglsY2Rscl93PWxjZGxyX3c/bGNkbHJfdzoxOwoJbGNkbHJfcj0oaW50KSgoKHJkX3JlZygodWludDY0X3QpKHRlbXBfcmVnK0REUjFfUFVCX0RYMExDRExSMy1ERFIxX1BVQl9EWDBMQ0RMUjEpKSkpJkRRTENETFJfTUFYKTsKCWxjZGxyX3I9bGNkbHJfcj9sY2Rscl9yOjE7CglsY2Rscl93PShsY2Rscl93Kih3cl9hZGpfcGVyW3RlbXBfY291bnRdKSkvMTAwOwoJbGNkbHJfcj0obGNkbHJfcioocmRfYWRqX3Blclt0ZW1wX2NvdW50XSkpLzEwMDsKCXdyX3JlZygoKHVpbnQ2NF90KSh0ZW1wX3JlZykpLChsY2Rscl93KSk7Cgl3cl9yZWcoKCh1aW50NjRfdCkodGVtcF9yZWcrRERSMV9QVUJfRFgwTENETFIzLUREUjFfUFVCX0RYMExDRExSMSkpLChsY2Rscl9yKSk7Cgl3cl9yZWcoKCh1aW50NjRfdCkodGVtcF9yZWcrRERSMV9QVUJfRFgwTENETFI0LUREUjFfUFVCX0RYMExDRExSMSkpLChsY2Rscl9yKSk7Cn0KI2Vsc2UKZm9yICggdGVtcF9jb3VudD04O3RlbXBfY291bnQ8MTI7dGVtcF9jb3VudCsrKQp7ICAgICB0ZW1wX3JlZz0odW5zaWduZWQpKEREUjFfUFVCX0RYMExDRExSMSsoRERSMV9QVUJfRFgxTENETFIxLUREUjFfUFVCX0RYMExDRExSMSkqKHRlbXBfY291bnQtOCkpOwoJICAgbGNkbHJfdz0oaW50KSgocmRfcmVnKCh1aW50NjRfdCkodGVtcF9yZWcpKSkmMHhmZik7CgkgICBsY2Rscl93PWxjZGxyX3c/bGNkbHJfdzoxOwoJbGNkbHJfcj0oaW50KSgoKHJkX3JlZygodWludDY0X3QpKHRlbXBfcmVnKSkpPj44KSYweGZmKTsKCWxjZGxyX3I9bGNkbHJfcj9sY2Rscl9yOjE7CglsY2Rscl93PShsY2Rscl93Kih3cl9hZGpfcGVyW3RlbXBfY291bnRdKSkvMTAwOwoJbGNkbHJfcj0obGNkbHJfcioocmRfYWRqX3Blclt0ZW1wX2NvdW50XSkpLzEwMDsKCXdyX3JlZygoKHVpbnQ2NF90KSh0ZW1wX3JlZykpLCgoKGxjZGxyX3I8PDE2KXwobGNkbHJfcjw8OCl8KGxjZGxyX3cpKSkpOwp9CiAjZW5kaWYKCiAjaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfOTA1WCkKCgogIHdyX3JlZyhERFIwX1BVQl9QR0NSNiwgKHJkX3JlZyhERFIwX1BVQl9QR0NSNikpJih+KDE8PDApKSk7CiAgd3JfcmVnKEREUjBfUFVCX1BJUiwgKHJkX3JlZyhERFIwX1BVQl9QSVIpKSYofigxPDwyOSkpKTsKCiAgd3JfcmVnKEREUjFfUFVCX1BHQ1I2LCAocmRfcmVnKEREUjFfUFVCX1BHQ1I2KSkmKH4oMTw8MCkpKTsKICB3cl9yZWcoRERSMV9QVUJfUElSLCAocmRfcmVnKEREUjFfUFVCX1BJUikpJih+KDE8PDI5KSkpOwoKCiAjZWxzZQogd3JfcmVnKEREUjBfUFVCX1BHQ1IxLCAocmRfcmVnKEREUjBfUFVCX1BHQ1IxKSkmKH4oMTw8MjYpKSk7CiB3cl9yZWcoRERSMF9QVUJfUElSLCAocmRfcmVnKEREUjBfUFVCX1BJUikpJih+KDE8PDI5KSkpOwoKIHdyX3JlZyhERFIxX1BVQl9QR0NSMSwgKHJkX3JlZyhERFIxX1BVQl9QR0NSMSkpJih+KDE8PDI2KSkpOwogd3JfcmVnKEREUjFfUFVCX1BJUiwgKHJkX3JlZyhERFIxX1BVQl9QSVIpKSYofigxPDwyOSkpKTsKI2VuZGlmCglwcmludGYoIlxuZW5kIGFkanVzdCBsY2RsclxuIik7CgoJIENMT1NFX0NIQU5ORUxfQV9QSFlfQ0xLKCk7CgkgQ0xPU0VfQ0hBTk5FTF9CX1BIWV9DTEsoKTsKCgoKCgoKCgkJfQoKCgoJfQogIHJldHVybiAxOwoKfQovLyovCmludCBkb19kZHJfbW9kaWZ5X3JlZ191c2VfbWFzayhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKICAgcHJpbnRmKCJcbkVudGVyIGRkcl9tb2RpZnlfcmVnX3VzZV9tYXNrICBmdW5jdGlvblxuIik7CiAvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CglpbnQgaT0wOwogIHByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKIGZvciAoaSA9IDA7aTxhcmdjO2krKykKICB7CiAgcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7CiAgfQoKCnsKLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpOwp9Cgp7Ck9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKTsKLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKfQoKCSBjaGFyICplbmRwOwogLy8gIHVuc2lnbmVkIGludCAgICpwX3N0YXJ0X2FkZHI7CgoKCnVuc2lnbmVkIGludCAgIHJlZ19hZGQ9MDsKIHVuc2lnbmVkIGludCAgIHdyX3JlZ192YWx1ZT0wOwogdW5zaWduZWQgaW50ICAgcmRfcmVnX3ZhbHVlPTA7CiAgdW5zaWduZWQgaW50ICAgd3JfcmVnX2FuZF9tYXNrXzE9MHhmZmZmZmZmZjsKIC8vIHVuc2lnbmVkIGludCAgIHdyX3JlZ19vcl9tYXNrXzI9MHgwOwoKCiB7CgoKCiBpZiAoYXJnYyA9PSAxKQoJeyAgcHJpbnRmKCJcbnBsZWFzZSByZWFkIGhlbHBcbiIpOwoJCSAgIHByaW50ZigiXG5leGFtcGxlIG9ubHkgY2hhbmdlIDB4Yzg4MzY4MDAgMHg4YzAxMDIyNiAweDAwMGZmZmZmIGJpdDIwLWJpdDMxLG5vIGNoYW5nZSBwbGwgb2Qgb2MgXG4iKTsKCQkgICBwcmludGYoIlxuZGRyX3Rlc3RfY21kIDkgMHhjODgzNjgwMCAweDhjMDEwMjI2IDB4MDAwZmZmZmZcbiIpOwoJfQogZWxzZXsKCWlmIChhcmdjID49IDIpCgkJCXsKCQlyZWdfYWRkID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgJmVuZHAsIDEwKTsKCQl9CgkJaWYgKGFyZ2MgPj0gMykKCQkJewoJCXdyX3JlZ192YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sICZlbmRwLCAxMCk7CgkJfQoJCQkJaWYgKGFyZ2MgPj0gNCkKCQkJewoJCXdyX3JlZ19hbmRfbWFza18xID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgJmVuZHAsIDEwKTsKCgkJfQoJCQkvLwkgCQkgCSAgIAkgaWYoYXJnYyA+PSA1KQoJCS8vCXsKCSAvLwkgd3JfcmVnX29yX21hc2tfMj0gc2ltcGxlX3N0cnRvdWwoYXJndls0XSwgJmVuZHAsIDEwKTsKCgkvLwl9CgoKCgkJCSAgcmRfcmVnX3ZhbHVlPSAocmRfcmVnKHJlZ19hZGQpKTsKCQl3cl9yZWcocmVnX2FkZCwocmRfcmVnX3ZhbHVlJndyX3JlZ19hbmRfbWFza18xKXwod3JfcmVnX3ZhbHVlJih+d3JfcmVnX2FuZF9tYXNrXzEpKSApOwoJCS8vcmRfcmVnX3ZhbHVlPSAocmRfcmVnKHJlZ19hZGQpKTsKCQkvL3dyX3JlZyhyZWdfYWRkLChyZF9yZWdfdmFsdWUmKH53cl9yZWdfb3JfbWFza18yKSl8KHdyX3JlZ192YWx1ZSYod3JfcmVnX29yX21hc2tfMikpICk7CgoJcHJpbnRmKCJcbm1vZGlmeSBvayByZWFkPT0weCUwOHhcbiIsKHJkX3JlZyhyZWdfYWRkKSkpOwoKCgkgQ0xPU0VfQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCSBDTE9TRV9DSEFOTkVMX0JfUEhZX0NMSygpOwoKCgoKCgoKCgoJfQoKCX0KICByZXR1cm4gMTsKCn0KaW50IGRvX2Rkcl9zZXRfenEoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CiAgIHByaW50ZigiXG5FbnRlciBzZXQgZGRyIHpxICBmdW5jdGlvblxuIik7CiAvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CglpbnQgaT0wOwogIHByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKIGZvciAoaSA9IDA7aTxhcmdjO2krKykKICB7CiAgcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7CiAgfQoKCnsKLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpOwp9Cgp7Ck9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKTsKLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKfQoKCSBjaGFyICplbmRwOwoKCXVuc2lnbmVkIGludCB6cTBwcl9vcmcgPSByZF9yZWcoRERSMF9QVUJfWlEwUFIpOwoJdW5zaWduZWQgaW50IHpxMXByX29yZyA9IHJkX3JlZyhERFIwX1BVQl9aUTFQUik7Cgl1bnNpZ25lZCBpbnQgenEycHJfb3JnID0gcmRfcmVnKEREUjBfUFVCX1pRMlBSKTsKLy8JdW5zaWduZWQgaW50IHpxMHByX2Jlc3Q7CnVuc2lnbmVkIGludCB6cTBwcjA9IHJkX3JlZyhERFIwX1BVQl9aUTBQUik7CnVuc2lnbmVkIGludCB6cTFwcjA9IHJkX3JlZyhERFIwX1BVQl9aUTFQUik7CnVuc2lnbmVkIGludCB6cTJwcjA9IHJkX3JlZyhERFIwX1BVQl9aUTJQUik7CgoJewoJCXsKCgoKIGlmIChhcmdjID09IDEpCgl7ICBwcmludGYoIlxucGxlYXNlIHJlYWQgaGVscFxuIik7CgkJICAgcHJpbnRmKCJcbmV4YW1wbGUgb25seSBjaGFuZ2UgenEgXG4iKTsKCQkgICBwcmludGYoIlxuZGRyX3Rlc3RfY21kIDEwIDB4MTlcbiIpOwoJfQogZWxzZXsKCWlmIChhcmdjID49IDIpCgkJCXsKCQkvLyB6cTBwcjAgPSBhcmd2WzFdOwoJCXpxMHByMD0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgJmVuZHAsIDApOwoJCX0KCglpZiAoYXJnYyA+PSAzKQoJCQl7CgkJLy8genExcHIwID0gYXJndlsyXTsKCQkgenExcHIwPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCAmZW5kcCwgMCk7CgkJfQoKCWlmIChhcmdjID49IDQpCgkJCXsKCQkvLyB6cTJwcjAgPWFyZ3ZbM107CgkJIHpxMnByMD0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgJmVuZHAsIDApOwoKCQl9fQoKCXByaW50ZigiXG56cTBwcl9vcmc9PSAweCUwOHhcbiIsIHpxMHByX29yZyk7CglwcmludGYoIlxuenExcHJfb3JnPT0gMHglMDh4XG4iLCB6cTFwcl9vcmcpOwoJcHJpbnRmKCJcbnpxMnByX29yZz09IDB4JTA4eFxuIiwgenEycHJfb3JnKTsKd3JfcmVnKCBERFIwX1BVQl9aUUNSLChyZF9yZWcoRERSMF9QVUJfWlFDUikpfCgxPDwyKXwoMTw8MjcpKTsKIHByaW50ZigiXG5vcmcgY2hhbm5lbCAwIHpxIHpxMHByPTB4JTA4eCx6cTBkcj0weCUwOHgsXG4iLHJkX3JlZyhERFIwX1BVQl9aUTBQUikscmRfcmVnKEREUjBfUFVCX1pRMERSKSk7CiBwcmludGYoIlxub3JnIGNoYW5uZWwgMCB6cSB6cTFwcj0weCUwOHgsenExZHI9MHglMDh4LFxuIixyZF9yZWcoRERSMF9QVUJfWlExUFIpLHJkX3JlZyhERFIwX1BVQl9aUTFEUikpOwogcHJpbnRmKCJcbm9yZyBjaGFubmVsIDAgenEgenEycHI9MHglMDh4LHpxMmRyPTB4JTA4eCxcbiIscmRfcmVnKEREUjBfUFVCX1pRMlBSKSxyZF9yZWcoRERSMF9QVUJfWlEyRFIpKTsKCndyX3JlZyggRERSMF9QVUJfWlEwUFIsenEwcHIwKTsKd3JfcmVnKCBERFIwX1BVQl9aUTFQUix6cTFwcjApOwp3cl9yZWcoIEREUjBfUFVCX1pRMlBSLHpxMnByMCk7Cgl3cl9yZWcoIEREUjBfUFVCX1pRQ1IsKHJkX3JlZyhERFIwX1BVQl9aUUNSKSl8KDE8PDIpfCgxPDwyNykpOwoJd3JfcmVnKCBERFIwX1BVQl9aUUNSLChyZF9yZWcoRERSMF9QVUJfWlFDUikpJih+KCgxPDwyKXwoMTw8MjcpKSkpOwogcHJpbnRmKCJcbnVwZGF0ZSBjaGFubmVsIDAgenEgenEwcHI9MHglMDh4LHpxMGRyPTB4JTA4eCxcbiIscmRfcmVnKEREUjBfUFVCX1pRMFBSKSxyZF9yZWcoRERSMF9QVUJfWlEwRFIpKTsKIHByaW50ZigiXG51cGRhdGUgY2hhbm5lbCAwIHpxIHpxMXByPTB4JTA4eCx6cTFkcj0weCUwOHgsXG4iLHJkX3JlZyhERFIwX1BVQl9aUTFQUikscmRfcmVnKEREUjBfUFVCX1pRMURSKSk7CiBwcmludGYoIlxudXBkYXRlIGNoYW5uZWwgMCB6cSB6cTJwcj0weCUwOHgsenEyZHI9MHglMDh4LFxuIixyZF9yZWcoRERSMF9QVUJfWlEyUFIpLHJkX3JlZyhERFIwX1BVQl9aUTJEUikpOwoKd3JfcmVnKCBERFIwX1BVQl9aUTBQUix6cTBwcjApOwp3cl9yZWcoIEREUjBfUFVCX1pRMVBSLHpxMXByMCk7CndyX3JlZyggRERSMF9QVUJfWlEyUFIsenEycHIwKTsKIHByaW50ZigiXG51cGRhdGUgY2hhbm5lbCAwIHpxIHpxMHByPTB4JTA4eCx6cTBkcj0weCUwOHgsXG4iLHJkX3JlZyhERFIwX1BVQl9aUTBQUikscmRfcmVnKEREUjBfUFVCX1pRMERSKSk7CiBwcmludGYoIlxudXBkYXRlIGNoYW5uZWwgMCB6cSB6cTFwcj0weCUwOHgsenExZHI9MHglMDh4LFxuIixyZF9yZWcoRERSMF9QVUJfWlExUFIpLHJkX3JlZyhERFIwX1BVQl9aUTFEUikpOwogcHJpbnRmKCJcbnVwZGF0ZSBjaGFubmVsIDAgenEgenEycHI9MHglMDh4LHpxMmRyPTB4JTA4eCxcbiIscmRfcmVnKEREUjBfUFVCX1pRMlBSKSxyZF9yZWcoRERSMF9QVUJfWlEyRFIpKTsKCgkvL3dyX3JlZyggRERSMV9QVUJfWlFDUiwocmRfcmVnKEREUjFfUFVCX1pRQ1IpKXwoMTw8Mil8KDE8PDI3KSk7CgkvL3dyX3JlZyggRERSMV9QVUJfWlFDUiwocmRfcmVnKEREUjFfUFVCX1pRQ1IpKSYofigoMTw8Mil8KDE8PDI3KSkpKTsKCgoKCgoJIENMT1NFX0NIQU5ORUxfQV9QSFlfQ0xLKCk7CgkgQ0xPU0VfQ0hBTk5FTF9CX1BIWV9DTEsoKTsKCgoKCgoKCgoKCX0KCgl9CiAgcmV0dXJuIDE7Cgp9CgoKCgoKaW50IGRkcl9lZV9wd21fdm9sdGFnZV90YWJsZVszMV1bMl0gPSB7Cgl7IDB4MWMwMDAwLCAgODYwfSwKCXsgMHgxYjAwMDEsICA4NzB9LAoJeyAweDFhMDAwMiwgIDg4MH0sCgl7IDB4MTkwMDAzLCAgODkwfSwKCXsgMHgxODAwMDQsICA5MDB9LAoJeyAweDE3MDAwNSwgIDkxMH0sCgl7IDB4MTYwMDA2LCAgOTIwfSwKCXsgMHgxNTAwMDcsICA5MzB9LAoJeyAweDE0MDAwOCwgIDk0MH0sCgl7IDB4MTMwMDA5LCAgOTUwfSwKCXsgMHgxMjAwMGEsICA5NjB9LAoJeyAweDExMDAwYiwgIDk3MH0sCgl7IDB4MTAwMDBjLCAgOTgwfSwKCXsgMHgwZjAwMGQsICA5OTB9LAoJeyAweDBlMDAwZSwgMTAwMH0sCgl7IDB4MGQwMDBmLCAxMDEwfSwKCXsgMHgwYzAwMTAsIDEwMjB9LAoJeyAweDBiMDAxMSwgMTAzMH0sCgl7IDB4MGEwMDEyLCAxMDQwfSwKCXsgMHgwOTAwMTMsIDEwNTB9LAoJeyAweDA4MDAxNCwgMTA2MH0sCgl7IDB4MDcwMDE1LCAxMDcwfSwKCXsgMHgwNjAwMTYsIDEwODB9LAoJeyAweDA1MDAxNywgMTA5MH0sCgl7IDB4MDQwMDE4LCAxMTAwfSwKCXsgMHgwMzAwMTksIDExMTB9LAoJeyAweDAyMDAxYSwgMTEyMH0sCgl7IDB4MDEwMDFiLCAxMTMwfSwKCXsgMHgwMDAwMWMsIDExNDB9Cn07CgoKCnZvaWQgZGRyX3Rlc3RfcHdtX3NldF92b2x0YWdlKHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IHZvbHRhZ2UpCnsKCWludCB0bzsKCgoKI2RlZmluZSBBUlJBWV9TSVpFKHgpIChzaXplb2YoeCkgLyBzaXplb2YoKHgpWzBdKSkKCgoKCiNkZWZpbmUgUF9QSU5fTVVYX1JFRzEgICAgICAgICAoKigodm9sYXRpbGUgdW5zaWduZWQgKikoMHhkYTgzNDQwMCArICgweDJkIDw8IDIpKSkpCiNkZWZpbmUgUF9QSU5fTVVYX1JFRzIgICAgICAgICAoKigodm9sYXRpbGUgdW5zaWduZWQgKikoMHhkYTgzNDQwMCArICgweDJlIDw8IDIpKSkpCiNkZWZpbmUgUF9QSU5fTVVYX1JFRzMJCSgqKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgweGRhODM0NDAwICsgKDB4MmYgPDwgMikpKSkKI2RlZmluZSBQX1BJTl9NVVhfUkVHNwkJKCooKHZvbGF0aWxlIHVuc2lnbmVkICopKDB4ZGE4MzQ0MDAgKyAoMHgzMyA8PCAyKSkpKQoKCiNkZWZpbmUgUF9QV01fTUlTQ19SRUdfQUIJKCooKHZvbGF0aWxlIHVuc2lnbmVkICopKDB4YzExMDAwMDAgKyAoMHgyMTU2IDw8IDIpKSkpCiNkZWZpbmUgUF9QV01fUFdNX0IJCSgqKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgweGMxMTAwMDAwICsgKDB4MjE1NSA8PCAyKSkpKQojZGVmaW5lIFBfUFdNX01JU0NfUkVHX0NECSgqKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgweGMxMTAwMDAwICsgKDB4MjE5MiA8PCAyKSkpKQojZGVmaW5lIFBfUFdNX1BXTV9ECQkoKigodm9sYXRpbGUgdW5zaWduZWQgKikoMHhjMTEwMDAwMCArICgweDIxOTEgPDwgMikpKSkKCiNkZWZpbmUgUF9FRV9USU1FUl9FCQkoKigodm9sYXRpbGUgdW5zaWduZWQgKikoMHhjMTEwMDAwMCArICgweDI2NjIgPDwgMikpKSkKCmVudW0gcHdtX2lkIHsKCXB3bV9hID0gMCwKCXB3bV9iLAoJcHdtX2MsCglwd21fZCwKCXB3bV9lLAoJcHdtX2YsCn07CgoKLy9wcmludGYoInRlc3QgZGRyIGluaXQgcHdtICBpZCAlMDhkIFxuIixpZCk7CgoJdW5zaWduZWQgaW50IHJlZzsKCgkvKgoJICogVE9ETzogc3VwcG9ydCBtb3JlIHB3bSBjb250cm9sbGVycywgcmlnaHQgbm93IG9ubHkgc3VwcG9ydAoJICogUFdNX0IsIFBXTV9ECgkgKi8KCglzd2l0Y2ggKGlkKSB7CgljYXNlIHB3bV9iOgoJCXJlZyA9IFBfUFdNX01JU0NfUkVHX0FCOwoJCXJlZyAmPSB+KDB4N2YgPDwgMTYpOwoJCXJlZyB8PSAgKCgxIDw8IDIzKSB8ICgxIDw8IDEpKTsKCQlQX1BXTV9NSVNDX1JFR19BQiA9IHJlZzsKCQkvKgoJCSAqIGRlZmF1bHQgc2V0IHRvIG1heCB2b2x0YWdlCgkJICovCgkJUF9QV01fUFdNX0IgPSBkZHJfZWVfcHdtX3ZvbHRhZ2VfdGFibGVbQVJSQVlfU0laRShkZHJfZWVfcHdtX3ZvbHRhZ2VfdGFibGUpIC0gMV1bMF07CgkJcmVnICA9IFBfUElOX01VWF9SRUcxOwoJCXJlZyAmPSB+KDEgPDwgMTApOwoJCVBfUElOX01VWF9SRUcxID0gcmVnOwoKCQlyZWcgID0gUF9QSU5fTVVYX1JFRzI7CgkJcmVnICY9IH4oMSA8PCA1KTsKCQlyZWcgfD0gICgxIDw8IDExKTsJCS8vIGVuYWJsZSBQV01fQgoJCVBfUElOX01VWF9SRUcyID0gcmVnOwoJCWJyZWFrOwoKCWNhc2UgcHdtX2Q6CgkJcmVnID0gUF9QV01fTUlTQ19SRUdfQ0Q7CgkJcmVnICY9IH4oMHg3ZiA8PCAxNik7CgkJcmVnIHw9ICAoKDEgPDwgMjMpIHwgKDEgPDwgMSkpOwoJCVBfUFdNX01JU0NfUkVHX0NEID0gcmVnOwoJCS8qCgkJICogZGVmYXVsdCBzZXQgdG8gbWF4IHZvbHRhZ2UKCQkgKi8KCQlQX1BXTV9QV01fRCA9IGRkcl9lZV9wd21fdm9sdGFnZV90YWJsZVtBUlJBWV9TSVpFKGRkcl9lZV9wd21fdm9sdGFnZV90YWJsZSkgLSAxXVswXTsKCQlyZWcgID0gUF9QSU5fTVVYX1JFRzE7CgkJcmVnICY9IH4oMSA8PCA5KTsKCQlyZWcgJj0gfigxIDw8IDExKTsKCQlQX1BJTl9NVVhfUkVHMSA9IHJlZzsKCgkJcmVnICA9IFBfUElOX01VWF9SRUcyOwoJCXJlZyB8PSAgKDEgPDwgMTIpOwkJLy8gZW5hYmxlIFBXTV9ECgkJUF9QSU5fTVVYX1JFRzIgPSByZWc7CgkJYnJlYWs7CglkZWZhdWx0OgoJCWJyZWFrOwoJfQoKCWRkcl91ZGVsYXkoMjAwKTsKCgkvL3ByaW50ZigidGVzdCBkZHIgc2V0IHZkZGVlIHRvICAlMDhkIG12XG4iLHZvbHRhZ2UpOwoKCWZvciAodG8gPSAwOyB0byA8IEFSUkFZX1NJWkUoZGRyX2VlX3B3bV92b2x0YWdlX3RhYmxlKTsgdG8rKykgewoJCWlmIChkZHJfZWVfcHdtX3ZvbHRhZ2VfdGFibGVbdG9dWzFdID49IHZvbHRhZ2UpIHsKCQkJYnJlYWs7CgkJfQoJfQoJaWYgKHRvID49IEFSUkFZX1NJWkUoZGRyX2VlX3B3bV92b2x0YWdlX3RhYmxlKSkgewoJCXRvID0gQVJSQVlfU0laRShkZHJfZWVfcHdtX3ZvbHRhZ2VfdGFibGUpIC0gMTsKCX0KCXN3aXRjaCAoaWQpIHsKCWNhc2UgcHdtX2I6CgkJUF9QV01fUFdNX0IgPSBkZHJfZWVfcHdtX3ZvbHRhZ2VfdGFibGVbdG9dWzBdOwoJCWJyZWFrOwoKCWNhc2UgcHdtX2Q6CgkJUF9QV01fUFdNX0QgPSBkZHJfZWVfcHdtX3ZvbHRhZ2VfdGFibGVbdG9dWzBdOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlicmVhazsKCX0KCWRkcl91ZGVsYXkoMjAwKTsKfQoKaW50IGRvX2Rkcl90ZXN0X3B3bV9jbWQgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewogICBwcmludGYoIlxuRW50ZXIgZG9fZGRyX3Rlc3RfcHdtX2NtZCBmdW5jdGlvblxuIik7CiAvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CglpbnQgaT0wOwogIHByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKIGZvciAoaSA9IDA7aTxhcmdjO2krKykKICB7CiAgcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7CiAgfQoKCnsKLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpOwp9Cgp7Ck9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKTsKLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKfQoKCSBjaGFyICplbmRwOwoKCiAgdW5zaWduZWQgaW50IGlkPTA7Ci8vICB1bnNpZ25lZCBpbnQgdm9sdGFnZT0xMDAwOwoJdW5zaWduZWQgaW50IHB3bV9sb3c9MHgxZjsKCSAgdW5zaWduZWQgaW50IHB3bV9oaWdoPTA7CgoKCQl7CgoKCiBpZiAoYXJnYyA9PSAxKQoJeyAgcHJpbnRmKCJcbnBsZWFzZSByZWFkIGhlbHBcbiIpOwoKCX0KIGVsc2V7CglpZiAoYXJnYyA+PSAyKQoJCQl7CgkJLy8genEwcHIwID0gYXJndlsxXTsKCQkJLy8genExcHIwID0gYXJndlsyXTsKCQkgaWQ9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQkvL3ZvbHRhZ2U9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQl9CgoJaWYgKGFyZ2MgPj0gMykKCQkJewoKCXB3bV9sb3c9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sICZlbmRwLCAwKTsKCQl9CgkJCWlmIChhcmdjID49IDQpCgkJCXsKCglwd21faGlnaD0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgJmVuZHAsIDApOwoJCX0KCXB3bV9sb3c9KHB3bV9sb3c+MHgxZik/KDB4MWYpOihwd21fbG93KTsKCSBwd21faGlnaD0ocHdtX2hpZ2g+MHgxZik/KDB4MWYpOihwd21faGlnaCk7CgoJcHJpbnRmKCJcbnB3bV9sb3c9PSAweCUwOGQgMC0xZlxuIiwgcHdtX2xvdyk7CglwcmludGYoIlxucHdtX2hpZ2g9PSAweCUwOGQgIDAtMWZcbiIsIHB3bV9oaWdoKTsKCXByaW50ZigiXG5wd21faWQ9PSAweCUwOGRcbiIsIGlkKTsKCXByaW50ZigiXG5wd21faWQgMD09IHB3bV9hXG4iKTsKCXByaW50ZigiXG5wd21faWQgMT09IHB3bV9iXG4iKTsKCXByaW50ZigiXG5wd21faWQgMj09IHB3bV9jXG4iKTsKCXByaW50ZigiXG5wd21faWQgMz09IHB3bV9kXG4iKTsKCXByaW50ZigiXG5wd21faWQgND09IHB3bV9lXG4iKTsKCXByaW50ZigiXG5wd21faWQgNT09IHB3bV9mXG4iKTsKLy9kZHJfdGVzdF9wd21fc2V0X3ZvbHRhZ2UoaWQsdm9sdGFnZSk7Cgp7CgoKCgojZGVmaW5lIEFSUkFZX1NJWkUoeCkgKHNpemVvZih4KSAvIHNpemVvZigoeClbMF0pKQoKCgoKI2RlZmluZSBQX1BJTl9NVVhfUkVHMSAgICAgICAgICgqKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgweGRhODM0NDAwICsgKDB4MmQgPDwgMikpKSkKI2RlZmluZSBQX1BJTl9NVVhfUkVHMiAgICAgICAgICgqKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgweGRhODM0NDAwICsgKDB4MmUgPDwgMikpKSkKI2RlZmluZSBQX1BJTl9NVVhfUkVHMwkJKCooKHZvbGF0aWxlIHVuc2lnbmVkICopKDB4ZGE4MzQ0MDAgKyAoMHgyZiA8PCAyKSkpKQojZGVmaW5lIFBfUElOX01VWF9SRUc3CQkoKigodm9sYXRpbGUgdW5zaWduZWQgKikoMHhkYTgzNDQwMCArICgweDMzIDw8IDIpKSkpCgoKI2RlZmluZSBQX1BXTV9NSVNDX1JFR19BQgkoKigodm9sYXRpbGUgdW5zaWduZWQgKikoMHhjMTEwMDAwMCArICgweDIxNTYgPDwgMikpKSkKI2RlZmluZSBQX1BXTV9QV01fQgkJKCooKHZvbGF0aWxlIHVuc2lnbmVkICopKDB4YzExMDAwMDAgKyAoMHgyMTU1IDw8IDIpKSkpCiNkZWZpbmUgUF9QV01fTUlTQ19SRUdfQ0QJKCooKHZvbGF0aWxlIHVuc2lnbmVkICopKDB4YzExMDAwMDAgKyAoMHgyMTkyIDw8IDIpKSkpCiNkZWZpbmUgUF9QV01fUFdNX0QJCSgqKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgweGMxMTAwMDAwICsgKDB4MjE5MSA8PCAyKSkpKQoKI2RlZmluZSBQX0VFX1RJTUVSX0UJCSgqKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgweGMxMTAwMDAwICsgKDB4MjY2MiA8PCAyKSkpKQoKZW51bSBwd21faWQgewoJcHdtX2EgPSAwLAoJcHdtX2IsCglwd21fYywKCXB3bV9kLAoJcHdtX2UsCglwd21fZiwKfTsKCgovL3ByaW50ZigidGVzdCBkZHIgaW5pdCBwd20gIGlkICUwOGQgXG4iLGlkKTsKCgl1bnNpZ25lZCBpbnQgcmVnOwoKCS8qCgkgKiBUT0RPOiBzdXBwb3J0IG1vcmUgcHdtIGNvbnRyb2xsZXJzLCByaWdodCBub3cgb25seSBzdXBwb3J0CgkgKiBQV01fQiwgUFdNX0QKCSAqLwoKCXN3aXRjaCAoaWQpIHsKCWNhc2UgcHdtX2I6CgkJcmVnID0gUF9QV01fTUlTQ19SRUdfQUI7CgkJcmVnICY9IH4oMHg3ZiA8PCAxNik7CgkJcmVnIHw9ICAoKDEgPDwgMjMpIHwgKDEgPDwgMSkpOwoJCVBfUFdNX01JU0NfUkVHX0FCID0gcmVnOwoJCS8qCgkJICogZGVmYXVsdCBzZXQgdG8gbWF4IHZvbHRhZ2UKCQkgKi8KCQlQX1BXTV9QV01fQiA9MHgwMDAwMWY7Ly9wd21fbG93fChwd21faGlnaDw8MTYpOy8vIGRkcl9lZV9wd21fdm9sdGFnZV90YWJsZVtBUlJBWV9TSVpFKGRkcl9lZV9wd21fdm9sdGFnZV90YWJsZSkgLSAxXVswXTsKCQlyZWcgID0gUF9QSU5fTVVYX1JFRzE7CgkJcmVnICY9IH4oMSA8PCAxMCk7CgkJUF9QSU5fTVVYX1JFRzEgPSByZWc7CgoJCXJlZyAgPSBQX1BJTl9NVVhfUkVHMjsKCQlyZWcgJj0gfigxIDw8IDUpOwoJCXJlZyB8PSAgKDEgPDwgMTEpOwkJLy8gZW5hYmxlIFBXTV9CCgkJUF9QSU5fTVVYX1JFRzIgPSByZWc7CgkJYnJlYWs7CgoJY2FzZSBwd21fZDoKCQlyZWcgPSBQX1BXTV9NSVNDX1JFR19DRDsKCQlyZWcgJj0gfigweDdmIDw8IDE2KTsKCQlyZWcgfD0gICgoMSA8PCAyMykgfCAoMSA8PCAxKSk7CgkJUF9QV01fTUlTQ19SRUdfQ0QgPSByZWc7CgkJLyoKCQkgKiBkZWZhdWx0IHNldCB0byBtYXggdm9sdGFnZQoJCSAqLwoJCVBfUFdNX1BXTV9EID0gMHgwMDAwMWY7Ly9wd21fbG93fChwd21faGlnaDw8MTYpOy8vZGRyX2VlX3B3bV92b2x0YWdlX3RhYmxlW0FSUkFZX1NJWkUoZGRyX2VlX3B3bV92b2x0YWdlX3RhYmxlKSAtIDFdWzBdOwoJCXJlZyAgPSBQX1BJTl9NVVhfUkVHMTsKCQlyZWcgJj0gfigxIDw8IDkpOwoJCXJlZyAmPSB+KDEgPDwgMTEpOwoJCVBfUElOX01VWF9SRUcxID0gcmVnOwoKCQlyZWcgID0gUF9QSU5fTVVYX1JFRzI7CgkJcmVnIHw9ICAoMSA8PCAxMik7CQkvLyBlbmFibGUgUFdNX0QKCQlQX1BJTl9NVVhfUkVHMiA9IHJlZzsKCQlicmVhazsKCWRlZmF1bHQ6CgkJYnJlYWs7Cgl9CgoJZGRyX3VkZWxheSgyMDApOwoKCS8vcHJpbnRmKCJ0ZXN0IGRkciBzZXQgdmRkZWUgdG8gICUwOGQgbXZcbiIsdm9sdGFnZSk7CgoJLy9mb3IgKHRvID0gMDsgdG8gPCBBUlJBWV9TSVpFKGRkcl9lZV9wd21fdm9sdGFnZV90YWJsZSk7IHRvKyspIHsKCS8vCWlmIChkZHJfZWVfcHdtX3ZvbHRhZ2VfdGFibGVbdG9dWzFdID49IHZvbHRhZ2UpIHsKCS8vCQlicmVhazsKCS8vCX0KCS8vfQoJLy9pZiAodG8gPj0gQVJSQVlfU0laRShkZHJfZWVfcHdtX3ZvbHRhZ2VfdGFibGUpKSB7CgkvLwl0byA9IEFSUkFZX1NJWkUoZGRyX2VlX3B3bV92b2x0YWdlX3RhYmxlKSAtIDE7CgkvL30KCglzd2l0Y2ggKGlkKSB7CgljYXNlIHB3bV9iOgoJCVBfUFdNX1BXTV9CID0gcHdtX2xvd3wocHdtX2hpZ2g8PDE2KTsvL2Rkcl9lZV9wd21fdm9sdGFnZV90YWJsZVt0b11bMF07CgkJYnJlYWs7CgoJY2FzZSBwd21fZDoKCQlQX1BXTV9QV01fRCA9IHB3bV9sb3d8KHB3bV9oaWdoPDwxNik7Ly9kZHJfZWVfcHdtX3ZvbHRhZ2VfdGFibGVbdG9dWzBdOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlicmVhazsKCX0KCWRkcl91ZGVsYXkoMjAwKTsKfQoKIHVuc2lnbmVkIGludCAgIGRkbF8xMDBzdGVwX3BzPSAwOwogICBkZGxfMTAwc3RlcF9wcz0oKDEwMCoxMDAwKjEwMDApLygyKmdsb2JhbF9kZHJfY2xrKSkvKCgoKHJlYWRsKEREUjBfUFVCX0FDTURMUjApKSk+PjE2KSYweGZmKTsKICAgcHJpbnRmKCJcbmRkbF8xMDBzdGVwX3BzPT0gJTA4ZCwwXzVjeWNsZV9wcz09ICUwOGQsMF81Y3ljbGU9PTB4JTA4eFxuIiwgZGRsXzEwMHN0ZXBfcHMsKCgxMDAwKjEwMDApLygyKmdsb2JhbF9kZHJfY2xrKSksCgkoKCgocmVhZGwoRERSMF9QVUJfQUNNRExSMCkpKT4+MTYpJjB4ZmYpKTsKCgkgQ0xPU0VfQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCSBDTE9TRV9DSEFOTkVMX0JfUEhZX0NMSygpOwoKCgl9CgoJfQogIHJldHVybiAxOwoKfQppbnQgZG9fZGRyX3Rlc3RfcHdtX2RkbCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CiAgIHByaW50ZigiXG5FbnRlciBkb19kZHJfdGVzdF9wd21fZGRsIGZ1bmN0aW9uXG4iKTsKIC8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCWludCBpPTA7CiAgcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwogZm9yIChpID0gMDtpPGFyZ2M7aSsrKQogIHsKICBwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKICB9CgoKewovL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwpPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7Cn0KCnsKT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpOwovL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwp9CgoJIGNoYXIgKmVuZHA7CgoKICB1bnNpZ25lZCBpbnQgaWQ9MDsKICB1bnNpZ25lZCBpbnQgdm9sdGFnZT0xMDAwOwoJdW5zaWduZWQgaW50IGxvb3A9MDsKCWludCB0bzsKCQl7CgoKCiBpZiAoYXJnYyA9PSAxKQoJeyAgcHJpbnRmKCJcbnBsZWFzZSByZWFkIGhlbHBcbiIpOwoKCX0KIGVsc2V7CglpZiAoYXJnYyA+PSAyKQoJCQl7CgkJLy8genEwcHIwID0gYXJndlsxXTsKCQl2b2x0YWdlPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCAmZW5kcCwgMCk7CgkJfQoKCWlmIChhcmdjID49IDMpCgkJCXsKCQkvLyB6cTFwcjAgPSBhcmd2WzJdOwoJCSBpZD0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgJmVuZHAsIDApOwoJCX0KCWlmIChhcmdjID49IDQpCgkJCXsKCQkvLyB6cTFwcjAgPSBhcmd2WzJdOwoJCSBsb29wPSBzaW1wbGVfc3RydG91bChhcmd2WzNdLCAmZW5kcCwgMCk7CgkJfQoKCXByaW50ZigiXG52b2x0YWdlPT0gMHglMDhkXG4iLCB2b2x0YWdlKTsKCXByaW50ZigiXG5wd21faWQ9PSAweCUwOGRcbiIsIGlkKTsKCXByaW50ZigiXG5wd21faWQgMD09IHB3bV9hXG4iKTsKCXByaW50ZigiXG5wd21faWQgMT09IHB3bV9iXG4iKTsKCXByaW50ZigiXG5wd21faWQgMj09IHB3bV9jXG4iKTsKCXByaW50ZigiXG5wd21faWQgMz09IHB3bV9kXG4iKTsKCXByaW50ZigiXG5wd21faWQgND09IHB3bV9lXG4iKTsKCXByaW50ZigiXG5wd21faWQgNT09IHB3bV9mXG4iKTsKZGRyX3Rlc3RfcHdtX3NldF92b2x0YWdlKGlkLHZvbHRhZ2UpOwogdW5zaWduZWQgaW50ICAgZGRsXzEwMHN0ZXBfcHM9IDA7CiAgIGRkbF8xMDBzdGVwX3BzPSgoMTAwKjEwMDAqMTAwMCkvKDIqZ2xvYmFsX2Rkcl9jbGspKS8oKCgocmVhZGwoRERSMF9QVUJfQUNNRExSMCkpKT4+MTYpJjB4ZmYpOwogICBwcmludGYoIlxudm9sdGFnZSA9PSUwOGQsZGRsXzEwMHN0ZXBfcHM9PSAlMDhkLDBfNWN5Y2xlX3BzPT0gJTA4ZCwwXzVjeWNsZT09MHglMDh4XG4iLHZvbHRhZ2UsIGRkbF8xMDBzdGVwX3BzLCgoMTAwMCoxMDAwKS8oMipnbG9iYWxfZGRyX2NsaykpLAoJKCgoKHJlYWRsKEREUjBfUFVCX0FDTURMUjApKSk+PjE2KSYweGZmKSk7CgppZiAobG9vcCkKewoKCWZvciAodG8gPSAwOyB0byA8IEFSUkFZX1NJWkUoZGRyX2VlX3B3bV92b2x0YWdlX3RhYmxlKTsgdG8rKykgewoKCQkJZGRyX3Rlc3RfcHdtX3NldF92b2x0YWdlKGlkLChkZHJfZWVfcHdtX3ZvbHRhZ2VfdGFibGVbdG9dWzFdKSk7CgkJCSAgZGRsXzEwMHN0ZXBfcHM9KCgxMDAqMTAwMCoxMDAwKS8oMipnbG9iYWxfZGRyX2NsaykpLygoKChyZWFkbChERFIwX1BVQl9BQ01ETFIwKSkpPj4xNikmMHhmZik7CiAgIHByaW50ZigiXG52b2x0YWdlID09JTA4ZCxkZGxfMTAwc3RlcF9wcz09ICUwOGQsMF81Y3ljbGVfcHM9PSAlMDhkLDBfNWN5Y2xlPT0weCUwOHhcbiIsCgkoZGRyX2VlX3B3bV92b2x0YWdlX3RhYmxlW3RvXVsxXSksZGRsXzEwMHN0ZXBfcHMsKCgxMDAwKjEwMDApLygyKmdsb2JhbF9kZHJfY2xrKSksCgkoKCgocmVhZGwoRERSMF9QVUJfQUNNRExSMCkpKT4+MTYpJjB4ZmYpKTsKCX0KfQoKCgkgQ0xPU0VfQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCSBDTE9TRV9DSEFOTkVMX0JfUEhZX0NMSygpOwoKCgl9CgoJfQogIHJldHVybiAxOwoKfQoKaW50IGRvX2Rkcl90ZXN0X3NoaWZ0X2Rkcl9jbGsoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CiAgIHByaW50ZigiXG5FbnRlciB0ZXN0IHNoaWZ0IGRkciBjbGsgZnVuY3Rpb25cbiIpOwogLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwoJaW50IGk9MDsKICBwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CiBmb3IgKGkgPSAwO2k8YXJnYztpKyspCiAgewogIHByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwogIH0KCiBpbnQgdGVzdF9hcHBfcHJhWzRdID0gezAsMCwwLDB9OwoKCSBjaGFyICplbmRwOwoKCgl7CgkJewoKCgogaWYgKGFyZ2MgPT0gMSkKCXsgIHByaW50ZigiXG5wbGVhc2UgcmVhZCBoZWxwXG4iKTsKCgl9CiBlbHNlewoJaWYgKGFyZ2MgPj0gMikKCQkJewoJCS8vIHpxMHByMCA9IGFyZ3ZbMV07CgkJdGVzdF9hcHBfcHJhWzBdPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCAmZW5kcCwgMCk7CgkJfQoKCWlmIChhcmdjID49IDMpCgkJCXsKCQkvLyB6cTFwcjAgPSBhcmd2WzJdOwoJCSB0ZXN0X2FwcF9wcmFbMV09IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sICZlbmRwLCAwKTsKCQl9CgoJaWYgKGFyZ2MgPj0gNCkKCQkJewoJCS8vIHpxMnByMCA9YXJndlszXTsKCQkgdGVzdF9hcHBfcHJhWzJdPSBzaW1wbGVfc3RydG91bChhcmd2WzNdLCAmZW5kcCwgMCk7CgoJCX19CgoKCX0KCgl9CgoJewoKLy9zaGlmdCBkZHIgZnJlcXVlbmN5IHRlc3QKCXByaW50ZigidGVzdF9hcHBfcHJhWzBdPT0weCUwOHhcbiIsdGVzdF9hcHBfcHJhWzBdICk7CgkgICBwcmludGYoInRlc3RfYXBwX3ByYVsxXT09MHglMDh4XG4iLHRlc3RfYXBwX3ByYVsxXSApOwoJICAgcHJpbnRmKCJ0ZXN0X2FwcF9wcmFbMl09PTB4JTA4eFxuIix0ZXN0X2FwcF9wcmFbMl0gKTsKCSAgIHVuc2lnbmVkIGludCByZWdfdmFsdWVbNF0gPSB7MH07Cgl1bnNpZ25lZCBpbnQgZGVsYXlfbXNfdGltZT0zMDsKCXVuc2lnbmVkIGludCB0ZXN0X3RpbWVzPTB4ZmZmZjsKCXVuc2lnbmVkIGludCB0ZXN0X2NvdW50PTA7Cgl1bnNpZ25lZCBpbnQgdGVzdF9sb29wX2ZsYWc9MDsKCXJlZ192YWx1ZVswXT0weGM0YWFlODYwIDsKCXdyX3JlZyggMHhjODgzNjAxYywocmVnX3ZhbHVlWzBdKSk7CgkvL3VwZGF0ZV9yZWdfZGVidWdfdmFsdWUoJihyZWdfdmFsdWVbMF0pLDB4Yzg4MzYwMWMgKTsKCXJlZ192YWx1ZVsxXT0weDAwMGVhMjAzICA7Cgl3cl9yZWcoIDB4Yzg4MzcwMDQsKHJlZ192YWx1ZVsxXSkpOwoJLy91cGRhdGVfcmVnX2RlYnVnX3ZhbHVlKCYocmVnX3ZhbHVlWzFdKSwweGM4ODM3MDA0ICApOwoKCXJlZ192YWx1ZVszXT0weDAzZTNiNzQwICA7CglpZiAoKHRlc3RfYXBwX3ByYVsxXSkpCgkJe2RlbGF5X21zX3RpbWU9KHRlc3RfYXBwX3ByYVsxXSk7CgkJfQoJaWYgKCh0ZXN0X2FwcF9wcmFbMl0pKQoJCXt0ZXN0X3RpbWVzPSh0ZXN0X2FwcF9wcmFbMl0pOwoJaWYgKHRlc3RfdGltZXMgPT0gMHhmZmZmZmZmZikKCQl0ZXN0X2xvb3BfZmxhZz0xOwoJCX0KCSAgICAgcHJpbnRmKCJkZWxheV9tc190aW1lPT0lZFxuIixkZWxheV9tc190aW1lICk7CgkgICAgIHByaW50ZigidGVzdF90aW1lcz09JWRcbiIsdGVzdF90aW1lcyApOwoJaWYgKHRlc3RfYXBwX3ByYVswXSA9PTApCgkJcmVnX3ZhbHVlWzJdPTB4MDNlM2I3NTAgIDsKCWlmICh0ZXN0X2FwcF9wcmFbMF0gPT0xKQoJCXJlZ192YWx1ZVsyXT0weDAzZTNiNzU0ICA7CglpZiAodGVzdF9hcHBfcHJhWzBdID09MikKCQlyZWdfdmFsdWVbMl09MHgwM2UzYjc1OCAgOwoJaWYgKHRlc3RfYXBwX3ByYVswXSA9PTMpCgkJcmVnX3ZhbHVlWzJdPTB4MDNlM2I3NWMgIDsKCgkJaWYgKHRlc3RfYXBwX3ByYVswXSA9PTQpCgkJCXsKCQlyZWdfdmFsdWVbMl09MHgwM2UzYjc1MCAgOwoJCXJlZ192YWx1ZVszXT0weDAzZTNiNzU0ICA7CgkJCX0KCQlpZiAodGVzdF9hcHBfcHJhWzBdID09NSkKCQkJewoJCXJlZ192YWx1ZVsyXT0weDAzZTNiNzUwICA7CgkJcmVnX3ZhbHVlWzNdPTB4MDNlM2I3NTggIDsKCQkJfQoJCWlmICh0ZXN0X2FwcF9wcmFbMF0gPT02KQoJCQl7CgkJcmVnX3ZhbHVlWzJdPTB4MDNlM2I3NTAgIDsKCQlyZWdfdmFsdWVbM109MHgwM2UzYjc1YyAgOwoJCQl9CgkJaWYgKHRlc3RfYXBwX3ByYVswXSA9PTcpCgkJCXsKCQlyZWdfdmFsdWVbMl09MHgwM2UzYjc1NCAgOwoJCXJlZ192YWx1ZVszXT0weDAzZTNiNzU4ICA7CgkJCX0KCQlpZiAodGVzdF9hcHBfcHJhWzBdID09OCkKCQkJewoJCXJlZ192YWx1ZVsyXT0weDAzZTNiNzU0ICA7CgkJcmVnX3ZhbHVlWzNdPTB4MDNlM2I3NWMgIDsKCQkJfQoJCWlmICh0ZXN0X2FwcF9wcmFbMF0gPT05KQoJCQl7CgkJcmVnX3ZhbHVlWzJdPTB4MDNlM2I3NTggIDsKCQlyZWdfdmFsdWVbM109MHgwM2UzYjc1YyAgOwoJCQl9Cgl3aGlsZSAoMSkge3Rlc3RfY291bnQrKzsKCQkvLwlyZWdfdmFsdWVbMl09MHgwM2UzYjc1MCAgOwoJLy91cGRhdGVfcmVnX2RlYnVnX3ZhbHVlKCYocmVnX3ZhbHVlWzJdKSwweGM4ODM3MDBjICApOwoKCXdyX3JlZyggMHhjODgzNzAxMCwoMHgwMDFjMDEwMSkpOwoJIGRkcl91ZGVsYXkoZGVsYXlfbXNfdGltZSAqIDEwMDApOwoJd3JfcmVnKCAweGM4ODM3MDBjLChyZWdfdmFsdWVbMl0pKTsKCXByaW50ZigiXG51cGRhdGUgIHJlZyAweGM4ODM3MDBjPTB4JTA4eFxuIixyZF9yZWcoMHhjODgzNzAwYykpOwoJIGRkcl91ZGVsYXkoZGVsYXlfbXNfdGltZSAqIDEwMDApOwoJCXdyX3JlZyggMHhjODgzNzAxMCwoMHgwMDBjMDEwMSkpOwoJIGRkcl91ZGVsYXkoZGVsYXlfbXNfdGltZSAqIDEwMDApOwoJCXdyX3JlZyggMHhjODgzNzAxMCwoMHgwMDFjMDEwMSkpOwoJIGRkcl91ZGVsYXkoZGVsYXlfbXNfdGltZSAqIDEwMDApOwoJIC8vdXNsZWVwKDEwMDAgKiAxMDAwKTsKCS8vcmVnX3ZhbHVlWzNdPTB4MDNlM2I3NDAgIDsKCS8vdXBkYXRlX3JlZ19kZWJ1Z192YWx1ZSgmKHJlZ192YWx1ZVszXSksMHhjODgzNzAwYyAgICk7Cgkgd3JfcmVnKCAweGM4ODM3MDBjLChyZWdfdmFsdWVbM10pKTsKCSBwcmludGYoIlxudXBkYXRlICByZWcgMHhjODgzNzAwYz0weCUwOHhcbiIscmRfcmVnKDB4Yzg4MzcwMGMpKTsKCSBkZHJfdWRlbGF5KGRlbGF5X21zX3RpbWUgKiAxMDAwKTsKCQl3cl9yZWcoIDB4Yzg4MzcwMTAsKDB4MDAwYzAxMDEpKTsKCSBkZHJfdWRlbGF5KGRlbGF5X21zX3RpbWUgKiAxMDAwKTsKCSAgcHJpbnRmKCJcbnRlc3RpbmcgJWQgdGltZXNcbiIsKHRlc3RfY291bnQpKTsKCSAgaWYgKCF0ZXN0X2xvb3BfZmxhZykKCQl7CgkJaWYgKHRlc3RfY291bnQgPT0gdGVzdF90aW1lcykKCQkJYnJlYWs7CgkJfQoJCX0KCgoKfQogIHJldHVybiAxOwoKfQoKaW50IGRvX2Rkcl90ZXN0X3dyaXRlX3JlYWQgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewovL3R1cm4gMTsKLy8vKgp7CiAgIHByaW50ZigiXG5FbnRlciBkb19kZHJfdGVzdF9kZHJfd3JpdGVfcmVhZF9jdXJyZW50XG4iKTsKIC8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCWludCBpPTA7CiAgcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwogZm9yIChpID0gMDtpPGFyZ2M7aSsrKQogIHsKICBwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKICB9CgoKewovL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwpPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7Cn0KCnsKT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpOwovL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwp9CgoJIGNoYXIgKmVuZHA7CgogIHVuc2lnbmVkIGludCBwYXR0ZXJuX2lkPTE7CiAgdW5zaWduZWQgaW50IHBhdHRlcm5bNF0gPXswfTsKICB1bnNpZ25lZCBpbnQgd3JpdGVfcmVhZD0wOwogIHVuc2lnbmVkIGludCByZWFkX3BhdHRlcm5bNF09ezB9IDsKICB1bnNpZ25lZCBpbnQgbG9vcD0xOwogIHVuc2lnbmVkIGludCAgc3RhcnRfYWRkciA9IEREUl9URVNUX1NUQVJUX0FERFI7CiAgdW5zaWduZWQgaW50ICB0ZXN0X3NpemUgPSBERFJfVEVTVF9TSVpFOwogIHVuc2lnbmVkIGludCAgY29weV9vZmZzZXQ9IEREUl9URVNUX1NJWkU7CgoKCgogaWYgKGFyZ2MgPT0gMSkKCXsgIHByaW50ZigiXG5wbGVhc2UgcmVhZCBoZWxwXG4iKTsKCgl9CiBlbHNlewoJaWYgKGFyZ2MgPj0gMikKCQkJewoJCS8vIHpxMHByMCA9IGFyZ3ZbMV07CgkJd3JpdGVfcmVhZD0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgJmVuZHAsIDApOwoJCX0KCglpZiAoYXJnYyA+PSAzKQoJCQl7CgkJLy8genExcHIwID0gYXJndlsyXTsKCQlwYXR0ZXJuX2lkPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCAmZW5kcCwgMCk7CgkJfQoJaWYgKGFyZ2MgPj0gNCkKCQkJewoJCS8vIHpxMXByMCA9IGFyZ3ZbMl07Cglsb29wPSBzaW1wbGVfc3RydG91bChhcmd2WzNdLCAmZW5kcCwgMCk7CgkJfQoJIGlmIChhcmdjID49NSkKCQkJewoJCS8vIHpxMXByMCA9IGFyZ3ZbMl07CgkJIHN0YXJ0X2FkZHI9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNF0sICZlbmRwLCAwKTsKCQl9CgkJaWYgKGFyZ2MgPj02KQoJCQl7CgkJLy8genExcHIwID0gYXJndlsyXTsKCQkgdGVzdF9zaXplPSBzaW1wbGVfc3RydG91bChhcmd2WzVdLCAmZW5kcCwgMCk7CgkJfQoJfQoJcHJpbnRmKCJcbndyaXRlX3JlYWQ9PSAweCUwOGRcbiIsIHdyaXRlX3JlYWQpOwoJcHJpbnRmKCJcbnBhdHRlcm5faWQ9PSAweCUwOGRcbiIsIHBhdHRlcm5faWQpOwoJcHJpbnRmKCJcbmxvb3A9PSAweCUwOGRcbiIsIGxvb3ApOwoJcHJpbnRmKCJcbnN0YXJ0X2FkZHI9PSAweCUwOHhcbiIsIHN0YXJ0X2FkZHIpOwoJcHJpbnRmKCJcbnRlc3Rfc2l6ZT09IDB4JTA4eFxuIiwgdGVzdF9zaXplKTsKCSAgY29weV9vZmZzZXQ9dGVzdF9zaXplOwoKICAgdW5zaWduZWQgaW50ICAqcDsKCSB1bnNpZ25lZCBpbnQgICBqOwoKCglwID0gKHVuc2lnbmVkIGludCAgKiApKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpOwoKCQlpZiAocGF0dGVybl9pZCA9PSAwKQoJCQl7CgkJcGF0dGVyblswXT0wOwoJCXBhdHRlcm5bMV09MDsKCQlwYXR0ZXJuWzJdPTA7CgkJcGF0dGVyblszXT0wOwoJCQl9CgkJaWYgKHBhdHRlcm5faWQgPT0gMSkKCQkJewoJCXBhdHRlcm5bMF09MHhmZmZmZmZmZjsKCQlwYXR0ZXJuWzFdPTB4ZmZmZmZmZmY7CgkJcGF0dGVyblsyXT0weGZmZmZmZmZmOwoJCXBhdHRlcm5bM109MHhmZmZmZmZmZjsKCQkJfQoKCmRvCnsKCglpZiAod3JpdGVfcmVhZCA9PSAwKQoJeyAgIHByaW50ZigiXG5sb29wOjB4JTA4eDpTdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIGxvb3Asc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7Cglmb3IgKGo9MDtqPHRlc3Rfc2l6ZS80OykKCQl7CgkJCSAqKHAraik9KHBhdHRlcm5bMF0pOwoJCQkgKihwK2orMSk9KHBhdHRlcm5bMV0pOwoJCQkgKihwK2orMik9KHBhdHRlcm5bMl0pOwoJCQkgKihwK2orMyk9KHBhdHRlcm5bM10pOwoJCQkgaj1qKzQ7CgkJfQoJfQoJaWYgKHdyaXRlX3JlYWQgPT0gMSkKCXsgICBwcmludGYoIlxubG9vcDoweCUwOHg6U3RhcnQgcmVhZGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBsb29wLHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwoJZm9yIChqPTA7ajx0ZXN0X3NpemUvNDspCgkJewoJCQlyZWFkX3BhdHRlcm5bMF09ICoocCtqKTsKCQkJcmVhZF9wYXR0ZXJuWzFdPSAqKHAraisxKTsKCQkJcmVhZF9wYXR0ZXJuWzJdPSoocCtqKzIpOwoJCQlyZWFkX3BhdHRlcm5bM109ICoocCtqKzMpOwoJCQkgaj1qKzQ7CgkJfQoJaWYgKGxvb3AgPT0gMSkgewoJcHJpbnRmKCIgXG5sb29wOjB4JTA4eDpTdGFydCByZWFkaW5nIHJlYWRfcGF0dGVyblswXSAweCUwOHgsIHBhdHRlcm5bMV0gMHglMDh4LHBhdHRlcm5bMl0gMHglMDh4LHBhdHRlcm5bM10gMHglMDh4IiwKCQlsb29wLHJlYWRfcGF0dGVyblswXSwgcmVhZF9wYXR0ZXJuWzFdLHJlYWRfcGF0dGVyblsyXSxyZWFkX3BhdHRlcm5bM10KCQkpOyAgfQoJfQoJaWYgKHdyaXRlX3JlYWQgPT0gMikKCXsgICBwcmludGYoIlxubG9vcDoweCUwOHg6U3RhcnQgY29weWluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBsb29wLHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwoJZm9yIChqPTA7ajx0ZXN0X3NpemUvNDspCgkJewoJCQkqKHAraitjb3B5X29mZnNldC80KT0gKihwK2opOwoJCQkqKHAraisxK2NvcHlfb2Zmc2V0LzQpPSAqKHAraisxKTsKCQkJKihwK2orMitjb3B5X29mZnNldC80KT0gKihwK2orMik7CgkJCSoocCtqKzMrY29weV9vZmZzZXQvNCk9ICoocCtqKzMpOwoJCQkgaj1qKzQ7CgkJfQoJfQoKCgoKCgoKCn13aGlsZShsb29wLS0pOwoKCgkgQ0xPU0VfQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCSBDTE9TRV9DSEFOTkVMX0JfUEhZX0NMSygpOwoKCgogIHByaW50ZigiXG50ZXN0IGVuZFxuIik7CgogIHJldHVybiAxOwp9Ci8vKi8KfQppbnQgZG9fZGRyX3Rlc3RfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewovL2Rkcl90ZXN0X3dhdGNoZG9nX2luaXQoNDAwMCk7Ci8vcHJpbnRmKCJcbm9wZW4gd2F0Y2hkb2cgJWRtc1xuIiw0MDAwKTsKCQkgICBwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CgkJCWludCBpIDsKCWZvciAoaSA9IDA7aTxhcmdjO2krKykKCQl7CgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7CgkJfQoKCS8qIG5lZWQgYXQgbGVhc3QgdHdvIGFyZ3VtZW50cyAqLwoJaWYgKGFyZ2MgPCAyKQoJCWdvdG8gdXNhZ2U7CglpZiAoKHN0cmNtcChhcmd2WzFdLCAiaCIpID09IDApKQoJCWdvdG8gdXNhZ2U7CgoKCnsKLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpOwp9Cgp7Ck9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKTsKLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKfQoKCgl1bnNpZ25lZCBpbnQgZGRyX3BsbCA9IHJkX3JlZyhBTV9ERFJfUExMX0NOVEwpOwoJdW5zaWduZWQgaW50IGRkcl9jbGsgPXBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX3BsbCk7CgkJLy8vMiooKCgyNCAqIChkZHJfcGxsJjB4MWZmKSkvKChkZHJfcGxsPj45KSYweDFmKSk+PigoZGRyX3BsbD4+MTYpJjB4MykpOwoKCQlwcmludGYoIlxuZGRyX2Nsaz09ICVkTUh6XG4iLCBkZHJfY2xrKTsKZ2xvYmFsX2Rkcl9jbGs9ZGRyX2NsazsKCXVuc2lnbmVkIGludCB6cTBwciA9IHJkX3JlZyhERFIwX1BVQl9aUTBQUik7CglwcmludGYoIlxuZGRyX3pxMHByPT0gMHglMDh4XG4iLCB6cTBwcik7CgojZGVmaW5lICBERFJfVEVTVF9DTURfX05PTkUgICAwCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RFU1QgICAgICAgICAxCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RVTkVfQUNMQ0RMUiAgICAgICAgMgojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9UVU5FX01BWF9DTEsgICAgIDMgICAvL2Rkcl90ZXN0X2NtZCAzIDB4ODAwMDAwMCAzIDEKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfVFVORV9aUSAgICAgNAojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9UVU5FX1ZSRUYgICAgNQojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9HWFRWQkJfQ1JPU1NUQUxLICAgIDYKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfQkFORFdJRFRIX1RFU1QgICA3CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX0xDRExSX0VOVl9UVU5FICAgOAojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9NT0RJRllfUkVHX1VTRV9NQVNLICAgOQojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9ERFJfVFVORV9BQ19DTEsgICAweGEKCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1NFVFpRICAgMHgxMAojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9UVU5FX0RRUyAgMHgxMQojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9TRVRfVEVTVF9TVEFSVF9BREQgIDB4MTIKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfVEVTVF9BQ19CSVRfU0VUVVBfSE9MRF9NQVJHSU4gIDB4MTMKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfVEVTVF9EQVRBX0JJVF9TRVRVUF9IT0xEX01BUkdJTiAgMHgxNAojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9URVNUX0FDX0xBTkVfQklUX01BUkdJTiAgMHgxNQojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9URVNUX0VFX1ZPTFRBR0VfTURMUl9TVEVQICAweDE2CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RFU1RfRDJQTExfQ01EICAweDE3CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RFU1RfREFUQV9MQU5FX0JJVF9NQVJHSU4gIDB4MTgKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFI0X1RVTkVfUEhZX1ZSRUYgICAweDE5CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSNF9UVU5FX0RSQU1fVlJFRiAgIDB4MUEKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFI0X1RVTkVfQUNfVlJFRiAgIDB4MWIKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFI0X1NXRUVQX0RSQU1fQ0xLX1VTRV9EMlBMTCAgIDB4MWMKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFI0X1RFU1RfU0hJRlRfRERSX0ZSRVFVRU5DWSAgMHgxZAojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUjRfVEVTVF9EQVRBX1dSVElFX1JFQUQgIDB4MWUKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfVEVTVF9QV01fQ01EICAgICAgICAgICAgICAweDFmCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RFU1RfRUVfU0kgICAgICAgICAgICAgMHgyMAojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9URVNUX1ZERFFfU0kgICAgICAgICAgICAgMHgyMQoKCiB1bnNpZ25lZCBpbnQgIGRkcl90ZXN0X2NtZD0wOwogdW5zaWduZWQgaW50ICBhcmdbMzBdPXswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCx9OwogY2hhciAqZW5kcDsKIGRkcl90ZXN0X2NtZCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCWZvciAoaSA9IDI7aTxhcmdjO2krKykKCQl7CgkJYXJnW2ktMl09c2ltcGxlX3N0cnRvdWwoYXJndltpXSwgJmVuZHAsIDApOwoJCX0KCQkgICBwcmludGYoIlxuZGRyX3Rlc3RfY21kPT0gMHglMDh4XG4iLCBkZHJfdGVzdF9jbWQpOwoKCWZvciAoaSA9IDA7aTwoYXJnYy0yKTtpKyspCgkJewoJCXByaW50ZigiXG5hcmdbJTA4eF09JTA4eFxuIixpLGFyZ1tpXSk7CgkJfQovL2ludCBhcmdjMl9sZW5ndGg7Ci8vYXJnYzJfbGVuZ3RoPShhcmdjLTIpOwovL2NtZF90YmxfdCAqY21kdHAyOwovL2ludCBmbGFnMjsKaW50IGFyZ2MyOwpjaGFyICAgICAqICBhcmd2MlszMF07CgoKYXJnYzI9YXJnYy0xOwoJZm9yIChpID0gMTtpPChhcmdjKTtpKyspCgkJewoJCWFyZ3YyW2ktMV09YXJndltpXTsKCQl9Ci8vYXJndjI9KGNoYXIgICAgKilhcmd2Kys7CnsKc3dpdGNoIChkZHJfdGVzdF9jbWQpCntjYXNlKEREUl9URVNUX0NNRF9fTk9ORSk6CnsKCSBwcmludGYoIlxuICAweDAgaGVscFxuIik7CgkgcHJpbnRmKCJcbiAgMHgxIGRkcnRlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDEgc3RhcnRfYWRkIHRlc3Rfc2l6ZSBsb29wcyAgIik7CgkgcHJpbnRmKCJcbiAgMHgyIHRlc3QgYWNsY2RsciAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDIgc3RhcnRfYWRkIHRlc3Rfc2l6ZSBsb29wcyAgICBkZHJfdGVzdF9jbWQgMHgyIGEgMCAweDgwMDAwMDAgIDEiKTsKCSBwcmludGYoIlxuICAweDMgdGVzdCBtYXhfcGxsY2xrICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MyAgdGVzdF9zaXplIGxvb3BzIGFkZF9mcmVxIHN1Yl9mcmVxICIpOwoJIHByaW50ZigiXG4gIDB4NCB0ZXN0IHpxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4NCAgdGVzdF9zaXplIGxvb3BzIGFkZF9mcmVxIHN1Yl9mcmVxIGRydl9vZHRfZmxhZyAiKTsKCSBwcmludGYoIlxuICAweDUgdGVzdCB2cmVmICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDUgICAiKTsKCSBwcmludGYoIlxuICAweDYgdGVzdCBneHR2YmJfY3Jvc3N0YWxrICAgICAgICAgZGRyX3Rlc3RfY21kIDB4NiAgbG9vcHMgcGF0dGVybl9mbGFnICIpOwoJIHByaW50ZigiXG4gIDB4NyB0ZXN0IGJhbmR3aWR0aCAgICAgICAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHg3IHNpemUgbG9vcHMgcG9ydCBzdWJfaWQgdGltZXJfbXMgIik7CgkgcHJpbnRmKCJcbiAgMHg4IHRlc3QgbGNkbHJfdXNlX2Vudl91YXJ0ICAgICAgZGRyX3Rlc3RfY21kIDB4OCBpbnB1dF9zcmMgd3JfYWRqX3BlcltdIHJkX2Fkal9wZXJbXVtdICIpOwoJIHByaW50ZigiXG4gIDB4OSB0ZXN0X3JlZ191c2VfbWFzayAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDkgcmVnX2FkZCB2YWx1ZSBtYXNrICAiKTsKCSBwcmludGYoIlxuICAweGEgdGVzdCBhY19jbGsgICAgICAgICAgICAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHhhIHN0YXJ0X2FkZCB0ZXN0X3NpemUgbG9vcHMgICBkZHJfdGVzdF9jbWQgMHhhIGEgMCAweDgwMDAwMDAgIDEgICIpOwoJIHByaW50ZigiXG4gIDB4YiAuLi4gICIpOwoJIHByaW50ZigiXG4gIDB4YyAuLi4gICIpOwoJIHByaW50ZigiXG4gIDB4ZCAuLi4gICIpOwoJIHByaW50ZigiXG4gIDB4ZSAuLi4gICIpOwoJIHByaW50ZigiXG4gIDB4ZiAuLi4gICIpOwoJIHByaW50ZigiXG4gIDB4MTAgdGVzdCBzZXQgenEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgxMCB6cTBwcjAgenExcHIwIHpxMnByMCAgICIpOwoJIHByaW50ZigiXG4gIDB4MTEgdGVzdCB0dW5lIGRxcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MTEgYSAwIHRlc3Rfc2l6ZSAgIGRkcl90ZXN0X2NtZCAweDExIGEgMCAweDgwMDAwIik7CgkgcHJpbnRmKCJcbiAgMHgxMiB0ZXN0IHNldCBzdGFydF9hZGQgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDEyIHN0YXJ0X2FkZCAgICIpOwoJIHByaW50ZigiXG4gIDB4MTMgdGVzdCBhY19iaXRfc2V0dXBfaG9sZCB0aW1lICAgICAgICBkZHJfdGVzdF9jbWQgMHgxMyBhIDAgc2l6ZSBtZXRob2QgIHBpbl9pZCAgIGRkcl90ZXN0X2NtZCAweDEzIGEgMCAweDgwMDAwMDAgMCAgMHhjIik7CgkgcHJpbnRmKCJcbiAgMHgxNCB0ZXN0IGRhdGFfYml0X3NldHVwX2hvbGQgdGltZSAgICAgIGRkcl90ZXN0X2NtZCAweDE0IGEgMCBzaXplIHNldHVwL2hvbGQgcGluX2lkICAgZGRyX3Rlc3RfY21kIDB4MTQgYSAwIDB4ODAwMDAgMCAzICIpOwoJIHByaW50ZigiXG4gIDB4MTUgdGVzdCBhY19sYW5lX3NldHVwX2hvbGQgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MTUgYSAwIHNpemUgICAiKTsKCSBwcmludGYoIlxuICAweDE2IHRlc3QgZWUgbWRsciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDE2ICB2b2x0YWdlIHB3bV9pZCBsb29wcyAgICIpOwoJCXByaW50ZigiXG4gIDB4MTcgZDJwbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDE3IGNsayB6cSBjbWRfdHlwZSBzb2NfdnJlZiBkcmFtX3ZyZWYgaGV4X2RlYyB6cV92cmVmICAgXAoJCQlkZHJfdGVzdF9jbWQgMHgxNyAxNDIwICAwICAwIDU2IDAgMSAwICIpOwoJIHByaW50ZigiXG4gIDB4MTggdGVzdCBkYXRhX2xhbmVfc2V0dXBfaG9sZCAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgxOCBhIDAgc2l6ZSByYW5nZSBzdGFydF9waW5faWQgZW5kX3Bpbl9pZCAgZGRyX3Rlc3RfY21kIDB4MTggYSAwIDB4ODAwMDAgMSAwIDk2ICIpOwoJIHByaW50ZigiXG4gIDB4MTkgdGVzdCBwaHkgdnJlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MTkgYSAwIDB4ODAwMDAgIDEgc2VlZCBzdGVwIHZyZWZfYWxsIHZyZWZfbGNkbHJfb2Zmc2V0IHRlc3RfZG93bl91cF9zdGVwIHNlZWRfaGV4X2RlYyAgXAoJCWRkcl90ZXN0X2NtZCAweDE5IGEgMCAweDEwMDAwMDAgIDEgIDYzICAxIDEgIDB4OCAwIDEgIik7CgkgcHJpbnRmKCJcbiAgMHgxYSB0ZXN0IGRyYW0gdnJlZiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDFBIGEgMCAweDgwMDAwICBjbGVhciBzZWVkIHN0ZXAgdnJlZl9hbGwgdnJlZl9sY2Rscl9vZmZzZXQgdGVzdF9kb3duX3VwX3N0ZXAgdnJlZl9yYW5nZSBzZWVkX2hleF9kZWMgXAoJXG4gc2V0ZW52ICBkZHJfdGVzdF9kZHI0cmFtX3ZyZWYgZGRyX3Rlc3RfY21kIDB4MUEgYSAwIDB4MDgwMDAwMCAgMCAgMHgxNCAxICAwICAweDggMCAwIDAgIHNldGVudiAgc3RvcmVib290ICBydW4gZGRyX3Rlc3RfZGRyNHJhbV92cmVmICAiKTsKCSBwcmludGYoIlxuICAweDFiIHRlc3QgYWMgdnJlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgxQiBhIDAgMHg4MDAwMCAgY2xlYXIgc2VlZCBzdGVwIHZyZWZfYWxsIHZyZWZfbGNkbHJfb2Zmc2V0IHNlZWRfaGV4X2RlYyIpOwoJCXByaW50ZigiXG4gIDB4MWMgc3dlZXAgZHJhbSBjbGsgdXNlIGQycGxsX2VudiAgICAgZGRyX3Rlc3RfY21kIDB4MWMgIHRlc3Rfc2l6ZSBzdGFydF9mcmVxIGVuZF9mcmVxIHRlc3RfbG9vcHMgIGRkcl90ZXN0X2NtZCAweDFjIDB4ODAwMDAwMCA4MDAgMTUwMCAxIik7CgkJcHJpbnRmKCJcbiAgMHgxZCB0ZXN0IHNoaWZ0IGNsayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgxZCB0eXBlIGRlbGF5X21zIHRpbWVzIik7CgkgcHJpbnRmKCJcbiAgMHgxZSB0ZXN0IHdyaXRlX3JlYWQgICAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDFlIHdyaXRlX3JlYWQgcGF0dGVybl9pZCBsb29wIHN0YXJ0X2FkZCB0ZXN0X3NpemUiKTsKCSBwcmludGYoIlxuICAweDFmIHRlc3QgcHdtX2NtZCAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDFmIHB3bWlkICAgcHdtX2xvdyBwd21faGlnaCIpOwp9CglyZXR1cm4gMTsKICBjYXNlKEREUl9URVNUX0NNRF9fRERSX1RFU1QpOgoJCXsKCS8vCXJ1bl9jb21tYW5kKCJkZHJ0ZXN0IDB4MTAwMDAwMDAgMHg4MDAwMDAwIDMiLDApOwoJLy9kZHJfdGVzdF9jbWQgMHgxIHN0YXJfYWRkIHRlc3Rfc2l6ZSBsb29wcwoJLy8gZG9fZGRyX3Rlc3QoY21kdHAsICBmbGFnLCBhcmdjMixhcmd2KTsKCSBkb19kZHJfdGVzdCgoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwoYXJndjIpKTsKCWJyZWFrOwoJCX0KICBjYXNlKEREUl9URVNUX0NNRF9fRERSX1RVTkVfQUNMQ0RMUik6CgkJewoJLy8JcnVuX2NvbW1hbmQoImRkcl90dW5lX2Rkcl9hY19hY2xjZGxyIGEgMCAgMHg4MDAwMDAwIDMiLDApOwoJLy9kZHJfdGVzdF9jbWQgMHgyIGEgMCAweDgwMDAwMDAgIDEKCSBkb19kZHJfdGVzdF9hY193aW5kb3dzX2FjbGNkbHIoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCX0KCWJyZWFrOwogIGNhc2UoRERSX1RFU1RfQ01EX19ERFJfRERSX1RVTkVfQUNfQ0xLKToKCQl7CgkvLwlydW5fY29tbWFuZCgiZGRyX3R1bmVfZGRyX2FjX2FjYmRscl9jayBhIDAgMHg4MDAwMDAwIDMiLDApOwoJLy9kZHJfdGVzdF9jbWQgMHhBIGEgMCAweDgwMDAwMDAgIDEKCSBkb19kZHJfdGVzdF9hY193aW5kb3dzX2FjYmRscl9jaygoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJfQoJYnJlYWs7CgoKICBjYXNlKEREUl9URVNUX0NNRF9fRERSX1RVTkVfTUFYX0NMSyk6CgkJewoJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAzIDB4ODAwMDAwMCAwIiwwKTsKCSBwcmludGYoIlxuVGVzdCBkZHIgbWF4IGZyZXF1ZW5jeSBzaG91bGQgdXNlIG1heCB0aW1taW5nICxzdWNoIGFzIDE0LTE0LTE0XG4iKTsKCgkgZG9fZGRyX3Rlc3RfZGRyX21heF9mcmVxKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQl9CglicmVhazsKCSAgY2FzZShERFJfVEVTVF9DTURfX0REUl9UVU5FX1pRKToKCQl7CgkvLwlydW5fY29tbWFuZCgiZGRyX3R1bmVfZGRyX2FjX2FjbGNkbHIgMHgxMDAwMDAwMCAweDgwMDAwMDAgMyIsMCk7CgkgcHJpbnRmKCJcblRlc3QgenEsc2hvdWxkIGZpcnN0IHRlc3QgbWF4IGRkciBmcmVxdWVuY3kgdXNlIGRlZmF1bHQgenEgdmFsdWVcbiIpOwoKCSBkb19kZHJfdGVzdF9kZHJfenEoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCX0KCWJyZWFrOwoJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfR1hUVkJCX0NST1NTVEFMSyk6CgkJewoJLy8JcnVuX2NvbW1hbmQoImRkcl90dW5lX2Rkcl9hY19hY2xjZGxyIDB4MTAwMDAwMDAgMHg4MDAwMDAwIDMiLDApOwoJIHByaW50ZigiXG5UZXN0IEdYVFZCQiBjcm9zcyB0YWxrLHRlc3Qgb25seSBjaGFubmVsIDAgLS0weDEwMDAwMDAwIGNoYW5uZWwgMSAtLTB4MTAwMDA0MDAgMzJieXRlXG4iKTsKCgkgZG9fZGRyX2d4dHZiYl9jcm9zc3RhbGsoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCX0KCWJyZWFrOwoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX0JBTkRXSURUSF9URVNUKToKCQl7CgkvLwlydW5fY29tbWFuZCgiZGRyX3R1bmVfZGRyX2FjX2FjbGNkbHIgMHgxMDAwMDAwMCAweDgwMDAwMDAgMyIsMCk7CgkgcHJpbnRmKCJcbk5PVEUgdGVzdCBERFIgYmFuZHdpZHRoIGluIHVib290IGxpbWl0ZWQgYnkgY3B1IHNwZWVkIFxuIik7CgoJIGRvX2Rkcl90ZXN0X2JhbmR3aWR0aCgoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJfQoJYnJlYWs7CgkJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX0xDRExSX0VOVl9UVU5FKToKCQl7CgkvLwlydW5fY29tbWFuZCgiZGRyX3R1bmVfZGRyX2FjX2FjbGNkbHIgMHgxMDAwMDAwMCAweDgwMDAwMDAgMyIsMCk7CgkgcHJpbnRmKCJcbnR1bmUgZGRyIGxjZGxyIHVzZSB1Ym9vdCBlbnYgb3IgdWFydCBpbnB1dCBcbiIpOwoKCSBkb19kZHJfZmluZV90dW5lX2xjZGxyX2VudigoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJfQoJYnJlYWs7CgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfTU9ESUZZX1JFR19VU0VfTUFTSyk6CgkJewoJLy8JcnVuX2NvbW1hbmQoImRkcl90dW5lX2Rkcl9hY19hY2xjZGxyIDB4MTAwMDAwMDAgMHg4MDAwMDAwIDMiLDApOwoJIHByaW50ZigiXG5tb2RpZnkgZGRyIHJlZyB1c2UgbWFzayBcbiIpOwoKCSBkb19kZHJfbW9kaWZ5X3JlZ191c2VfbWFzaygoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJfQoJYnJlYWs7CgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfU0VUWlEpOgoJCXsKCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgxMCAgMHg1OSAweDVkIDB4NWIgICIsMCk7CgkgcHJpbnRmKCJcbnNldCBkZHIgenEgXG4iKTsKCgkgZG9fZGRyX3NldF96cSgoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJfQoJYnJlYWs7CgkgICAgICAgICAgICAgY2FzZShERFJfVEVTVF9DTURfX0REUl9UVU5FX0RRUyk6CgkJewoJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDExIGEgMCAweDgwMDAwICAiLDApOwoJIHByaW50ZigiXG50ZXN0IGRxcyB3aW5kb3cgXG4iKTsKCgkgZG9fZGRyX3Rlc3RfZHFzX3dpbmRvdygoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJfQoJYnJlYWs7CgkgY2FzZShERFJfVEVTVF9DTURfX0REUl9TRVRfVEVTVF9TVEFSVF9BREQpOgoJCXsKCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMTIgIDB4NDEwODAwMDAgICIsMCk7CgoKCSB0ZXN0X3N0YXJ0X2FkZHI9YXJnWzBdOwoJIGlmICh0ZXN0X3N0YXJ0X2FkZHIgPT0gMCkKCQl0ZXN0X3N0YXJ0X2FkZHI9MHgxMDgwMDAwOwoJICBwcmludGYoIlxuc2V0IGRkciAgdGVzdCB0ZXN0X3N0YXJ0X2FkZHI9PTB4JTA4eCBcbiIsdGVzdF9zdGFydF9hZGRyKTsKCQl9CglicmVhazsKCSAgY2FzZShERFJfVEVTVF9DTURfX0REUl9URVNUX0FDX0JJVF9TRVRVUF9IT0xEX01BUkdJTik6CgkJeyAgLy9jbGsgc2VlZCB1c2UgZm9yIGNsayB0b28gZWFybHksY2xrIG11c3QgZGVsYXkKCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgxMyBhIDAgMHg4MDAwMDAwIDAgIDB4YyAgIiwwKTsgY3MwIHNldHVwCgkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MTMgYSAwIDB4ODAwMDAwMCAxICAweGMgICIsMCk7IGNzMCBob2xkCgkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MTMgYSAwIDB4ODAwMDAwMCAyICAweGMgICIsMCk7IGNzMCBob2xkICAgLy9zb21lIHRpbWVzIGRkciBmcmVxdWVuY3kgdG9vIGhpZ2ggY2Fubm90IG1vdmUgY2xrIGRlbGF5LnRoZW4gc2hvdWxkIG9ubHkgbW92ZSBjbWQgYmRsCgkvL3NvIHNob3VsZHQgdGVzdCBob2xkIHRpbWUgdXNlIG1ldGhvZCAxIGFuZCBtZXRob2QgMi0tLS10ZXN0IGhvbGQgdGltZSB0YWtlIGNhcmUtLTIwMTYwODA0LWppYXhpbmcKCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgxMyBhIDAgMHg4MDAwMDAwIDAgIDB4ZCAgIiwwKTsgY3MxIHNldHVwCgkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MTMgYSAwIDB4ODAwMDAwMCAxICAweGQgICAiLDApOyBjczEgaG9sZAoJIHByaW50ZigiXG50ZXN0IEFDIGJpdCB3aW5kb3cgXG4iKTsKCgkgZG9fZGRyX3Rlc3RfYWNfYml0X3NldHVwX2hvbGRfd2luZG93KChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCSAvL2RvX2Rkcl90ZXN0X2FjX2JpdF9zZXR1cF9ob2xkX3dpbmRvdyBhIDAgMHg4MDAwMDAwIDAgYwoJCX0KCWJyZWFrOwoJCSAgY2FzZShERFJfVEVTVF9DTURfX0REUl9URVNUX0QyUExMX0NNRCk6CgkJewoJLy9kZHJfdGVzdF9jbWQgMHgxNyAxNDIwICAwICAwIDU2IDAgMSAwCgkgcHJpbnRmKCJcbnRlc3QgZDJwbGwgY21kIFxuIik7CgoJIGRvX2RkcjJwbGxfY21kKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQl9CglicmVhazsKCQkgY2FzZShERFJfVEVTVF9DTURfX0REUl9URVNUX0VFX1ZPTFRBR0VfTURMUl9TVEVQKToKCQl7CgkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MTYgMTAwMCAxIDEiLDApOy8vdGVzdCBFRSAxMDAwbVYgZGRsIHN0ZXAgcHdtYiAgLTEgMjExICAgIDIxMi0tcHdtZC0tMwoJLy8xMDAwIDEgMSAgLS0tMTAwMG12ICBwd21pZCAgbG9vcCAsaWYgbG9vcCB0aGVuIHRlc3QgYWxsIHB3bSB2b2x0YWdlCgkvL2Rkcl90ZXN0X2NtZCAweDE2IDEwMDAgMSAgIHNldCB0byAxMDAwbXYKCSBwcmludGYoIlxudGVzdCBlZSB2b2x0YWdlIGRkbCBzdGVwIFxuIik7CgoJIGRvX2Rkcl90ZXN0X3B3bV9kZGwoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCX0KCWJyZWFrOwoJCQkgY2FzZShERFJfVEVTVF9DTURfX0REUl9URVNUX0FDX0xBTkVfQklUX01BUkdJTik6CgkJewoJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDE1IGEgMCAweDgwMDAwMCAwIiwwKTsKCSBwcmludGYoIlxudGVzdCBhYyBsYW5lIGJpdCBtYXJnaW4gbm90IGluY2x1ZGUgY3MgcGluIFxuIik7CgoJIGRvX2Rkcl90ZXN0X2FjX2JpdF9tYXJnaW4oKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJIC8vZG9fZGRyX3Rlc3RfYWNfYml0X3NldHVwX2hvbGRfd2luZG93IGEgMCAweDgwMDAwMDAgMCBjCgkJfQoJYnJlYWs7CgljYXNlKEREUl9URVNUX0NNRF9fRERSX1RFU1RfREFUQV9CSVRfU0VUVVBfSE9MRF9NQVJHSU4pOgoJCXsKCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgxNCBhIDAgMHg4MDAwMCBzZXR1cC9ob2xkIHBpbl9pZCIsMCk7CgkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MTQgYSAwIDB4ODAwMDAgMCAzIiwwKTsKCSBwcmludGYoIlxudGVzdCBkYXRhIGxhbmUgYml0IHNldHVwIGhvbGQgXG4iKTsKCgkgZG9fZGRyX3Rlc3RfZGF0YV9iaXRfc2V0dXBfaG9sZF93aW5kb3coKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCX0KCWJyZWFrOwoJY2FzZShERFJfVEVTVF9DTURfX0REUl9URVNUX0RBVEFfTEFORV9CSVRfTUFSR0lOKToKCQl7CgkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MTggYSAwIDB4ODAwMDAgMCIsMCk7CgkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDE4IGEgMCAweDgwMDAwIDEgMCA5NiIsMCk7CgkgcHJpbnRmKCJcbnRlc3QgZGF0YSBsYW5lIGJpdCBtYXJnaW4gIFxuIik7CgoJIGRvX2Rkcl90ZXN0X2RhdGFfYml0X21hcmdpbigoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJfQoJYnJlYWs7CgljYXNlKEREUl9URVNUX0NNRF9fRERSNF9UVU5FX1BIWV9WUkVGKToKCQl7CgkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MTkgYSAwIDB4ODAwMDAgIDEgc2VlZCBzdGVwIHZyZWZfYWxsIHZyZWZfbGNkbHJfb2Zmc2V0IHRlc3RfZG93bl91cF9zdGVwIHNlZWRfaGV4X2RlYyIsMCk7CgkvL2Rkcl90ZXN0X2NtZCAweDE5IGEgMCAweDEwMDAwMDAgIDEgIDB4MWEgIDEgMSAgMHg4IDAgMAoJLy9kZHJfdGVzdF9jbWQgMHgxOSBhIDAgMHgxMDAwMDAwICAxICA2MyAgMSAxICAweDggMCAxCgkgcHJpbnRmKCJcbnRlc3QgZGRyNCBwaHkgdnJlZiAgXG4iKTsKCgkgZG9fZGRyNF90ZXN0X3BoeV92cmVmKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQl9CglicmVhazsKCWNhc2UoRERSX1RFU1RfQ01EX19ERFI0X1RVTkVfRFJBTV9WUkVGKToKCQl7CgkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MUEgYSAwIDB4ODAwMDAgIGNsZWFyIHNlZWQgc3RlcCB2cmVmX2FsbCB2cmVmX2xjZGxyX29mZnNldCB0ZXN0X2Rvd25fdXBfc3RlcCB2cmVmX3JhbmdlIHNlZWRfaGV4X2RlYyIsMCk7CgkvL2Rkcl90ZXN0X2NtZCAweDFBIGEgMCAweDEwMDAwMDAgIDAgIDAgMyAgMCAgMHgxMAoJLy9zZXRlbnYgIGRkcl90ZXN0X2RkcjRyYW1fdnJlZiAiZGRyX3Rlc3RfY21kIDB4MUEgYSAwIDB4MDgwMDAwMCAgMCAgMHgxNCAwICAwICAweDggMCAwIDAiCgkvL3NldGVudiBzdG9yZWJvb3QgInJ1biBkZHJfdGVzdF9kZHI0cmFtX3ZyZWYiCgkgcHJpbnRmKCJcbnRlc3QgZGRyNCBEUkFNIHZyZWYgIFxuIik7CgoJIGRvX2RkcjRfdGVzdF9kcmFtX3ZyZWYoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCX0KCWJyZWFrOwoJCWNhc2UoRERSX1RFU1RfQ01EX19ERFI0X1RVTkVfQUNfVlJFRik6CgkJewoJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDFCIGEgMCAweDgwMDAwICBjbGVhciBzZWVkIHN0ZXAgdnJlZl9hbGwgdnJlZl9sY2Rscl9vZmZzZXQgc2VlZF9oZXhfZGVjIiwwKTsKCS8vZGRyX3Rlc3RfY21kIDB4MUIgYSAwIDB4MTAwMDAwMCAgMCAgMCAxICAwICAweDEwIDAKCSBwcmludGYoIlxudGVzdCBkZHI0IEFDIG9yIGRkMyBkcmFtIGFjX2RhdGEgdnJlZiAgXG4iKTsKCgkgZG9fZGRyNF90ZXN0X2RyYW1fYWNfdnJlZigoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJfQoJYnJlYWs7CgoJLy9ERFJfVEVTVF9DTURfX0REUjRfU1dFRVBfRFJBTV9DTEtfVVNFX0QyUExMCgkJY2FzZShERFJfVEVTVF9DTURfX0REUjRfU1dFRVBfRFJBTV9DTEtfVVNFX0QyUExMKToKCQl7CgkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MWMgIHRlc3Rfc2l6ZSBzdGFydF9mcmVxIGVuZF9mcmVxIHRlc3RfbG9vcHMiLDApOwoJLy9kZHJfdGVzdF9jbWQgMHgxYyAweDgwMDAwMDAgODAwIDE1MDAgMwoJIHByaW50ZigiXG50ZXN0IGRkcjQgc3dlZXAgZGRyIGNsayB1c2UgZDJwbGwgXG4iKTsKCgkgZG9fZGRyNF90ZXN0X2RyYW1fY2xrKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQl9CglicmVhazsKCQljYXNlKEREUl9URVNUX0NNRF9fRERSNF9URVNUX1NISUZUX0REUl9GUkVRVUVOQ1kpOgoJCXsKCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgxZCAiLDApOwoJLy9kZHJfdGVzdF9jbWQgMHgxZCB0eXBlIGRlbGF5X21zIHRpbWVzIC8vZGRyX3Rlc3RfY21kIDB4MWQgMCAxMDAwIDEwMDAwMAoJLy90aW1lcyA9MHhmZmZmZmZmZiB3aWxsIGF1dG8gbG9vcAoJIHByaW50ZigiXG50ZXN0IGRkciBzaGlmdCBkZHIgY2xrICBcbiIpOwoKCSBkb19kZHJfdGVzdF9zaGlmdF9kZHJfY2xrKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQl9CglicmVhazsKCS8vRERSX1RFU1RfQ01EX19ERFI0X1RFU1RfREFUQV9XUlRJRV9SRUFECgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFI0X1RFU1RfREFUQV9XUlRJRV9SRUFEKToKCQl7CgkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MWUgIHdyaXRlX3JlYWQgIHBhdHRlcm5faWQgbG9vcCBzdGFydF9hZGRyIHRlc3Rfc2l6ZSIsMCk7CgkvL2Rkcl90ZXN0X2NtZCAweDFkIHR5cGUgZGVsYXlfbXMgdGltZXMgLy9kZHJfdGVzdF9jbWQgMHgxZSAxIDIgMTAgMHg0MDAwMDAwMCAweDEwMDAwMDAwCgkvL3RpbWVzID0weGZmZmZmZmZmIHdpbGwgYXV0byBsb29wCgkgcHJpbnRmKCJcbnRlc3QgZGRyIHdyaXRlIHJlYWQgIFxuIik7CgoJIGRvX2Rkcl90ZXN0X3dyaXRlX3JlYWQoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCX0KCWJyZWFrOwoJCSBjYXNlKEREUl9URVNUX0NNRF9fRERSX1RFU1RfUFdNX0NNRCk6CgkJewoJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDFmIDB4MSAweDIgMHgxQSAiLDApOy8vdGVzdCBFRSAgIHB3bWIgIC0tMSAyMTEgICAgMjEyLS1wd21kLS0zCgkvLzEwMDAgMSAxICAtLS1wd21pZCAgIHB3bV9sb3cgcHdtX2hpZ2ggICBwd21fbG93K3B3bV9oaWdoPT1ub3JtYWw9MjgKCSBwcmludGYoIlxucHdtaWQgICBwd21fbG93IHB3bV9oaWdoIFxuIik7CgoJIGRvX2Rkcl90ZXN0X3B3bV9jbWQoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCX0KCWJyZWFrOwoJCSBjYXNlKEREUl9URVNUX0NNRF9fRERSX1RFU1RfRUVfU0kpOgoJCXsKCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgyMCAweDEgMHgyIDB4MUEgIiwwKTsvL3Rlc3QgRUUgICBwd21iICAtLTEgMjExICAgIDIxMi0tcHdtZC0tMwoJLy8xMDAwIDEgMSAgLS0tcHdtaWQgICBwd21fbG93IHB3bV9oaWdoICAgcHdtX2xvdytwd21faGlnaD09bm9ybWFsPTI4CgkJLy8gZG9fZGRyX3Rlc3RfZWVfc2koKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCX0KCWJyZWFrOwp9CiAgcmV0dXJuIDE7Ly90ZXN0X3N0YXJ0X2FkZHIKfQoKdXNhZ2U6CgljbWRfdXNhZ2UoY21kdHApOwoJcmV0dXJuIDE7Cgp9ClVfQk9PVF9DTUQoCglkZHJfdGVzdF9jbWQsCTMwLAkxLAlkb19kZHJfdGVzdF9jbWQsCgkiZGRyX3Rlc3RfY21kIGNtZCBhcmcxIGFyZzIgYXJnMy4uLiIsCgkiZGRyX3Rlc3RfY21kIGNtZCBhcmcxIGFyZzIgYXJnMy4uLiBcbiBkY2FjaGUgb2ZmID8gXG4iCgkpOwoKCg==