I2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgInVzYi5oIgojaW5jbHVkZSAic2NzaWdsdWUuaCIKI2luY2x1ZGUgInRyYW5zcG9ydC5oIgovLyNpbmNsdWRlICJpbml0LmgiCgovLyNpbmNsdWRlICJzdGRsaWIuaCIKLy8jaW5jbHVkZSAiRVVDUjZTSy5oIgojaW5jbHVkZSAic21jb21tb24uaCIKI2luY2x1ZGUgInNtaWwuaCIKCnZvaWQgICBfU2V0X0RfU3NmZGNSZENtZCAgICAgKEJZVEUpOwp2b2lkICAgX1NldF9EX1NzZmRjUmRBZGRyICAgIChCWVRFKTsKdm9pZCAgIF9TZXRfRF9Tc2ZkY1JkQ2hpcCAgICAodm9pZCk7CnZvaWQgICBfU2V0X0RfU3NmZGNSZFN0YW5kYnkgKHZvaWQpOwp2b2lkICAgX1N0YXJ0X0RfU3NmZGNSZEh3RUNDICh2b2lkKTsKdm9pZCAgIF9TdG9wX0RfU3NmZGNSZEh3RUNDICAodm9pZCk7CnZvaWQgICBfTG9hZF9EX1NzZmRjUmRId0VDQyAgKEJZVEUpOwp2b2lkICAgX1NldF9EX1NzZmRjV3JDbWQgICAgIChCWVRFKTsKdm9pZCAgIF9TZXRfRF9Tc2ZkY1dyQWRkciAgICAoQllURSk7CnZvaWQgICBfU2V0X0RfU3NmZGNXckJsb2NrICAgKHZvaWQpOwp2b2lkICAgX1NldF9EX1NzZmRjV3JTdGFuZGJ5ICh2b2lkKTsKdm9pZCAgIF9TdGFydF9EX1NzZmRjV3JId0VDQyAodm9pZCk7CnZvaWQgICBfTG9hZF9EX1NzZmRjV3JId0VDQyAgKEJZVEUpOwppbnQgICAgX0NoZWNrX0RfU3NmZGNCdXN5ICAgIChXT1JEKTsKaW50ICAgIF9DaGVja19EX1NzZmRjU3RhdHVzICAodm9pZCk7CnZvaWQgICBfUmVzZXRfRF9Tc2ZkY0VyciAgICAgKHZvaWQpOwp2b2lkICAgX1JlYWRfRF9Tc2ZkY0J1ZiAgICAgIChCWVRFICopOwp2b2lkICAgX1dyaXRlX0RfU3NmZGNCdWYgICAgIChCWVRFICopOwp2b2lkICAgX1JlYWRfRF9Tc2ZkY0J5dGUgICAgIChCWVRFICopOwp2b2lkICAgX1JlYWRSZWR0X0RfU3NmZGNCdWYgIChCWVRFICopOwp2b2lkICAgX1dyaXRlUmVkdF9EX1NzZmRjQnVmIChCWVRFICopOwpCWVRFICAgX0NoZWNrX0RfRGV2Q29kZSAgICAgIChCWVRFKTsKCnZvaWQgICBfU2V0X0RfRUNDZGF0YSAgICAgICAgKEJZVEUsQllURSAqKTsKdm9pZCAgIF9DYWxjX0RfRUNDZGF0YSAgICAgICAoQllURSAqKTsKCi8vdm9pZCAgIFNNX1JlYWREYXRhV2l0aERNQSAgICAgIChQRkRPX0RFVklDRV9FWFRFTlNJT04sIEJZVEUgKiwgV09SRCk7Ci8vdm9pZCAgIFNNX1dyaXRlRGF0YVdpdGhETUEgICAgIChQRkRPX0RFVklDRV9FWFRFTlNJT04sIEJZVEUgKiwgV09SRCk7Ci8vCnN0cnVjdCBTU0ZEQ1RZUEUgICAgICAgICAgICAgICAgU3NmZGM7CnN0cnVjdCBBRERSRVNTICAgICAgICAgICAgICAgICAgTWVkaWE7CnN0cnVjdCBDSVNfQVJFQSAgICAgICAgICAgICAgICAgQ2lzQXJlYTsKCkJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNjQnVmWzZdOwpleHRlcm4gUEJZVEUgICAgICAgICAgICAgICAgICAgIFNNSG9zdEFkZHI7CmV4dGVybiBCWVRFICAgICAgICAgICAgICAgICAgICAgSXNTU0ZEQ0NvbXBsaWFuY2U7CmV4dGVybiBCWVRFICAgICAgICAgICAgICAgICAgICAgSXNYRENvbXBsaWFuY2U7CmV4dGVybiBEV09SRCAgICAgICAgICAgICAgICAgICAgRXJyWERDb2RlOwoKZXh0ZXJuIFdPUkQgIFJlYWRCbG9jazsKZXh0ZXJuIFdPUkQgIFdyaXRlQmxvY2s7CgovL0tFVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgU01fRE1BRG9uZUV2ZW50OwoKI2RlZmluZSBFVkVOICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgIC8vIEV2ZW4gUGFnZSBmb3IgMjU2Ynl0ZS9wYWdlCiNkZWZpbmUgT0REICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAvLyBPZGQgUGFnZSBmb3IgMjU2Ynl0ZS9wYWdlCgoKLy9TbWFydE1lZGlhIFJlZHVuZGFudCBidWZmZXIgZGF0YSBDb250cm9sbCBTdWJyb3V0aW5lCi8vLS0tLS0gQ2hlY2tfRF9EYXRhQmxhbmsoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgQ2hlY2tfRF9EYXRhQmxhbmsoQllURSAqcmVkdW5kYW50KQp7CgljaGFyIGk7CgoJZm9yKGk9MDsgaTxSRURUU0laRTsgaSsrKQoJCWlmICgqcmVkdW5kYW50KyshPTB4RkYpCgkJCXJldHVybihFUlJPUik7CgoJcmV0dXJuKFNVQ0NFU1MpOwp9CgovLy0tLS0tIENoZWNrX0RfRmFpbEJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IENoZWNrX0RfRmFpbEJsb2NrKEJZVEUgKnJlZHVuZGFudCkKewoJcmVkdW5kYW50Kz1SRURUX0JMT0NLOwoKCWlmICgqcmVkdW5kYW50PT0weEZGKQoJCXJldHVybihTVUNDRVNTKTsKCWlmICghKnJlZHVuZGFudCkKCQlyZXR1cm4oRVJST1IpOwoJaWYgKEJpdF9EX0NvdW50KCpyZWR1bmRhbnQpPDcpCgkJcmV0dXJuKEVSUk9SKTsKCglyZXR1cm4oU1VDQ0VTUyk7Cn0KCi8vLS0tLS0gQ2hlY2tfRF9EYXRhU3RhdHVzKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgQ2hlY2tfRF9EYXRhU3RhdHVzKEJZVEUgKnJlZHVuZGFudCkKewoJcmVkdW5kYW50Kz1SRURUX0RBVEE7CgoJaWYgKCpyZWR1bmRhbnQ9PTB4RkYpCgkJcmV0dXJuKFNVQ0NFU1MpOwoJaWYgKCEqcmVkdW5kYW50KQoJewoJCUVyclhEQ29kZSA9IEVSUl9EYXRhU3RhdHVzOwoJCXJldHVybihFUlJPUik7Cgl9CgllbHNlCgkJRXJyWERDb2RlID0gTk9fRVJST1I7CgoJaWYgKEJpdF9EX0NvdW50KCpyZWR1bmRhbnQpPDUpCgkJcmV0dXJuKEVSUk9SKTsKCglyZXR1cm4oU1VDQ0VTUyk7Cn0KCi8vLS0tLS0gTG9hZF9EX0xvZ0Jsb2NrQWRkcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTG9hZF9EX0xvZ0Jsb2NrQWRkcihCWVRFICpyZWR1bmRhbnQpCnsKCVdPUkQgYWRkcjEsYWRkcjI7CgkvL1NTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwoJLy9BRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCglhZGRyMT0oV09SRCkqKHJlZHVuZGFudCtSRURUX0FERFIxSCkqMHgwMTAwKyhXT1JEKSoocmVkdW5kYW50K1JFRFRfQUREUjFMKTsKCWFkZHIyPShXT1JEKSoocmVkdW5kYW50K1JFRFRfQUREUjJIKSoweDAxMDArKFdPUkQpKihyZWR1bmRhbnQrUkVEVF9BRERSMkwpOwoKCWlmIChhZGRyMT09YWRkcjIpCgkJaWYgKChhZGRyMSAmMHhGMDAwKT09MHgxMDAwKQoJCXsgTWVkaWEuTG9nQmxvY2s9KGFkZHIxICYweDBGRkYpLzI7IHJldHVybihTVUNDRVNTKTsgfQoKCWlmIChCaXRfRF9Db3VudFdvcmQoKFdPUkQpKGFkZHIxXmFkZHIyKSkhPTB4MDEpIHJldHVybihFUlJPUik7CgoJaWYgKChhZGRyMSAmMHhGMDAwKT09MHgxMDAwKQoJCWlmICghKEJpdF9EX0NvdW50V29yZChhZGRyMSkgJjB4MDEpKQoJCXsgTWVkaWEuTG9nQmxvY2s9KGFkZHIxICYweDBGRkYpLzI7IHJldHVybihTVUNDRVNTKTsgfQoKCWlmICgoYWRkcjIgJjB4RjAwMCk9PTB4MTAwMCkKCQlpZiAoIShCaXRfRF9Db3VudFdvcmQoYWRkcjIpICYweDAxKSkKCQl7IE1lZGlhLkxvZ0Jsb2NrPShhZGRyMiAmMHgwRkZGKS8yOyByZXR1cm4oU1VDQ0VTUyk7IH0KCglyZXR1cm4oRVJST1IpOwp9CgovLy0tLS0tIENscl9EX1JlZHVuZGFudERhdGEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kdm9pZCBDbHJfRF9SZWR1bmRhbnREYXRhKEJZVEUgKnJlZHVuZGFudCkKewoJY2hhciBpOwoKCWZvcihpPTA7IGk8UkVEVFNJWkU7IGkrKykKCSoocmVkdW5kYW50K2kpPTB4RkY7Cn0KCi8vLS0tLS0gU2V0X0RfTG9nQmxvY2tBZGRyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIFNldF9EX0xvZ0Jsb2NrQWRkcihCWVRFICpyZWR1bmRhbnQpCnsKCVdPUkQgYWRkcjsKCgkqKHJlZHVuZGFudCtSRURUX0JMT0NLKT0weEZGOwoJKihyZWR1bmRhbnQrUkVEVF9EQVRBKSA9MHhGRjsKCWFkZHI9TWVkaWEuTG9nQmxvY2sqMisweDEwMDA7CgoJaWYgKChCaXRfRF9Db3VudFdvcmQoYWRkciklMikpCgkJYWRkcisrOwoKCSoocmVkdW5kYW50K1JFRFRfQUREUjFIKT0qKHJlZHVuZGFudCtSRURUX0FERFIySCk9KEJZVEUpKGFkZHIvMHgwMTAwKTsKCSoocmVkdW5kYW50K1JFRFRfQUREUjFMKT0qKHJlZHVuZGFudCtSRURUX0FERFIyTCk9KEJZVEUpYWRkcjsKfQoKLy8tLS0tLSBTZXRfRF9GYWlsQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnZvaWQgU2V0X0RfRmFpbEJsb2NrKEJZVEUgKnJlZHVuZGFudCkKewogICAgY2hhciBpOwoKICAgIGZvcihpPTA7IGk8UkVEVFNJWkU7IGkrKykKICAgICAgICAqcmVkdW5kYW50Kys9KEJZVEUpKChpPT1SRURUX0JMT0NLKT8weEYwOjB4RkYpOwp9CgovLy0tLS0tIFNldF9EX0RhdGFTdGF1cygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kdm9pZCBTZXRfRF9EYXRhU3RhdXMoQllURSAqcmVkdW5kYW50KQp7CiAgICByZWR1bmRhbnQrPVJFRFRfREFUQTsKICAgICpyZWR1bmRhbnQ9MHgwMDsKfQoKLy9TbWFydE1lZGlhIEZ1bmN0aW9uIENvbW1hbmQgU3Vicm91dGluZQovLyA2MjUwIENNRCA2Ci8vLS0tLS0gU3NmZGNfRF9SZXNldCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIFNzZmRjX0RfUmVzZXQoc3RydWN0IHVzX2RhdGEgKnVzKQp7CgkvL05UU1RBVFVTICAgICAgICBudFN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwoJLy9QQlVMS19DQlcgICAgICAgcEJ1bGtDYncgPSBmZG9FeHQtPnBCdWxrQ2J3OwoJLy9CWVRFICAgICAgICAgICAgYnVmWzB4MjAwXTsKCgkvL3ByaW50aygiU3NmZGNfRF9SZXNldCAtLS0gQnV0IGRvIG5vdGhpbmcgISFcbiIpOwoJcmV0dXJuOwovKglSdGxaZXJvTWVtb3J5KHBCdWxrQ2J3LCBzaXplb2Yoc3RydWN0IF9CVUxLX0NCVykpOwoJcEJ1bGtDYnctPmRDQldTaWduYXR1cmUgICAgICAgICAgPSBDQldfU0lHTlRVUkU7CglwQnVsa0Nidy0+YkNCV0x1biAgICAgICAgICAgICAgICA9IENCV19MVU47CgkvL3BCdWxrQ2J3LT5kQ0JXRGF0YVRyYW5zZmVyTGVuZ3RoID0gMHgyMDA7CglwQnVsa0Nidy0+Ym1DQldGbGFncyAgICAgICAgICAgICA9IDB4ODA7CglwQnVsa0Nidy0+Q0JXQ2JbMF0gICAgICAgICAgICAgICA9IDB4RjI7CglwQnVsa0Nidy0+Q0JXQ2JbMV0gICAgICAgICAgICAgICA9IDB4MDc7CgoJbnRTdGF0dXMgPSBFTkVfU2VuZFNjc2lDbWQoZmRvRXh0LCBGRElSX1JFQUQsIE5VTEwpOwoKCWlmICghTlRfU1VDQ0VTUyhudFN0YXR1cykpCgl7CgkJRU5FX1ByaW50KCJTc2ZkY19EX1Jlc2V0IEZhaWwgISFcbiIpOwoJCS8vcmV0dXJuIG50U3RhdHVzOwoJfSovCn0KCi8vLS0tLS0gU3NmZGNfRF9SZWFkQ2lzU2VjdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgU3NmZGNfRF9SZWFkQ2lzU2VjdChzdHJ1Y3QgdXNfZGF0YSAqdXMsIEJZVEUgKmJ1ZixCWVRFICpyZWR1bmRhbnQpCnsKCUJZVEUgem9uZSxzZWN0b3I7CglXT1JEIGJsb2NrOwoJLy9TU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKCS8vQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgoJem9uZT1NZWRpYS5ab25lOyBibG9jaz1NZWRpYS5QaHlCbG9jazsgc2VjdG9yPU1lZGlhLlNlY3RvcjsKCU1lZGlhLlpvbmU9MDsKCU1lZGlhLlBoeUJsb2NrPUNpc0FyZWEuUGh5QmxvY2s7CglNZWRpYS5TZWN0b3I9Q2lzQXJlYS5TZWN0b3I7CgoJaWYgKFNzZmRjX0RfUmVhZFNlY3QodXMsYnVmLHJlZHVuZGFudCkpCgl7CgkJTWVkaWEuWm9uZT16b25lOyBNZWRpYS5QaHlCbG9jaz1ibG9jazsgTWVkaWEuU2VjdG9yPXNlY3RvcjsKCQlyZXR1cm4oRVJST1IpOwoJfQoKCU1lZGlhLlpvbmU9em9uZTsgTWVkaWEuUGh5QmxvY2s9YmxvY2s7IE1lZGlhLlNlY3Rvcj1zZWN0b3I7CglyZXR1cm4oU1VDQ0VTUyk7Cn0KLyoKLy8vLy0tLS0tIFNzZmRjX0RfV3JpdGVSZWR0TW9kZSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIFNzZmRjX0RfV3JpdGVSZWR0TW9kZSh2b2lkKQovL3sKLy8gICAgX1NldF9EX1NzZmRjUmRDbWQgICAgIChSU1RfQ0hJUCk7Ci8vICAgIF9DaGVja19EX1NzZmRjQnVzeSAgICAoQlVTWV9SRVNFVCk7Ci8vICAgIF9TZXRfRF9Tc2ZkY1JkQ21kICAgICAoUkVBRF9SRURUKTsKLy8gICAgX0NoZWNrX0RfU3NmZGNCdXN5ICAgIChCVVNZX1JFQUQpOwovLyAgICBfU2V0X0RfU3NmZGNSZFN0YW5kYnkgKCk7Ci8vfQovLwovLy8vLS0tLS0gU3NmZGNfRF9SZWFkSUQoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgU3NmZGNfRF9SZWFkSUQoQllURSAqYnVmLCBCWVRFIFJlYWRJRCkKLy97Ci8vICAgIF9TZXRfRF9Tc2ZkY1JkQ21kICAgICAoUmVhZElEKTsKLy8gICAgX1NldF9EX1NzZmRjUmRDaGlwICAgICgpOwovLyAgICBfUmVhZF9EX1NzZmRjQnl0ZSAgICAgKGJ1ZisrKTsKLy8gICAgX1JlYWRfRF9Tc2ZkY0J5dGUgICAgIChidWYrKyk7Ci8vICAgIF9SZWFkX0RfU3NmZGNCeXRlICAgICAoYnVmKyspOwovLyAgICBfUmVhZF9EX1NzZmRjQnl0ZSAgICAgKGJ1Zik7Ci8vICAgIF9TZXRfRF9Tc2ZkY1JkU3RhbmRieSAoKTsKLy99CiovCi8vIDYyNTAgQ01EIDEKLy8tLS0tLSBTc2ZkY19EX1JlYWRTZWN0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBTc2ZkY19EX1JlYWRTZWN0KHN0cnVjdCB1c19kYXRhICp1cywgQllURSAqYnVmLEJZVEUgKnJlZHVuZGFudCkKewoJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwoJaW50CXJlc3VsdDsKCVdPUkQJYWRkcjsKCglyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIFNNX1JXX1BBVFRFUk4pOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgl7CgkJcHJpbnRrKCJMb2FkIFNNIFJXIENvZGUgRmFpbCAhIVxuIik7CgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCX0KCglhZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7CglhZGRyID0gYWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzK01lZGlhLlNlY3RvcjsKCgkvLyBSZWFkIHNlY3QgZGF0YQoJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoCT0gMHgyMDA7CgliY2ItPkZsYWdzCQkJPSAweDgwOwoJYmNiLT5DREJbMF0JCQk9IDB4RjE7CgliY2ItPkNEQlsxXQkJCT0gMHgwMjsKCWJjYi0+Q0RCWzRdCQkJPSAoQllURSlhZGRyOwoJYmNiLT5DREJbM10JCQk9IChCWVRFKShhZGRyLzB4MDEwMCk7CgliY2ItPkNEQlsyXQkJCT0gTWVkaWEuWm9uZS8yOwoKCXJlc3VsdCA9IEVORV9TZW5kU2NzaUNtZCh1cywgRkRJUl9SRUFELCBidWYsIDApOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCgkvLyBSZWFkIHJlZHVuZGFudAoJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoCT0gMHgxMDsKCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CgliY2ItPkNEQlswXQkJCT0gMHhGMTsKCWJjYi0+Q0RCWzFdCQkJPSAweDAzOwoJYmNiLT5DREJbNF0JCQk9IChCWVRFKWFkZHI7CgliY2ItPkNEQlszXQkJCT0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKCWJjYi0+Q0RCWzJdCQkJPSBNZWRpYS5ab25lLzI7CgliY2ItPkNEQls4XQkJCT0gMDsKCWJjYi0+Q0RCWzldCQkJPSAxOwoKCXJlc3VsdCA9IEVORV9TZW5kU2NzaUNtZCh1cywgRkRJUl9SRUFELCByZWR1bmRhbnQsIDApOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCglyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7Cn0KCi8vLS0tLS0gU3NmZGNfRF9SZWFkQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFNzZmRjX0RfUmVhZEJsb2NrKHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBjb3VudCwgQllURSAqYnVmLEJZVEUgKnJlZHVuZGFudCkKewoJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwoJaW50CXJlc3VsdDsKCVdPUkQJYWRkcjsKCgkvL3ByaW50aygiU3NmZGNfRF9SZWFkQmxvY2tcbiIpOwoJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBTTV9SV19QQVRURVJOKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJewoJCXByaW50aygiTG9hZCBTTSBSVyBDb2RlIEZhaWwgISFcbiIpOwoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7Cgl9CgoJYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK01lZGlhLlBoeUJsb2NrOwoJYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycytNZWRpYS5TZWN0b3I7CgoJLy8gUmVhZCBzZWN0IGRhdGEKCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CgliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CgliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aAk9IDB4MjAwKmNvdW50OwoJYmNiLT5GbGFncwkJCT0gMHg4MDsKCWJjYi0+Q0RCWzBdCQkJPSAweEYxOwoJYmNiLT5DREJbMV0JCQk9IDB4MDI7CgliY2ItPkNEQls0XQkJCT0gKEJZVEUpYWRkcjsKCWJjYi0+Q0RCWzNdCQkJPSAoQllURSkoYWRkci8weDAxMDApOwoJYmNiLT5DREJbMl0JCQk9IE1lZGlhLlpvbmUvMjsKCglyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfUkVBRCwgYnVmLCAwKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CgoJLy8gUmVhZCByZWR1bmRhbnQKCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CgliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CgliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aAk9IDB4MTA7CgliY2ItPkZsYWdzCQkJPSAweDgwOwoJYmNiLT5DREJbMF0JCQk9IDB4RjE7CgliY2ItPkNEQlsxXQkJCT0gMHgwMzsKCWJjYi0+Q0RCWzRdCQkJPSAoQllURSlhZGRyOwoJYmNiLT5DREJbM10JCQk9IChCWVRFKShhZGRyLzB4MDEwMCk7CgliY2ItPkNEQlsyXQkJCT0gTWVkaWEuWm9uZS8yOwoJYmNiLT5DREJbOF0JCQk9IDA7CgliY2ItPkNEQls5XQkJCT0gMTsKCglyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfUkVBRCwgcmVkdW5kYW50LCAwKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CgoJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwp9Ci8qCi8vLy8tLS0tLSBTc2ZkY19EX1JlYWRTZWN0X0RNQSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBTc2ZkY19EX1JlYWRTZWN0X0RNQShQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LCBCWVRFICpidWYsQllURSAqcmVkdW5kYW50KQovL3sKLy8gICAgV09SRCAgICBTZWN0Qnl0ZUNvdW50LCBhZGRyOwovLyAgICBEV09SRCAgIEJ1ZmZlcls0XTsKLy8gICAgV09SRCAgICBsZW47Ci8vCi8vICAgIGlmICghX0h3X0RfQ2hrQ2FyZEluKCkpCi8vICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgIGFkZHI9KFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7Ci8vICAgIGFkZHI9YWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzK01lZGlhLlNlY3RvcjsKLy8gICAgLy8gY3ljbGUgc3RhcnRpbmcgYWRkcmVzcwovLyAgICBTTV9TVEFSVEFERFJfTFNCID0gMHgwMDsKLy8gICAgU01fU1RBUlRBRERSX0lJU0IgPSAoQllURSlhZGRyOwovLyAgICBTTV9TVEFSVEFERFJfSUlJU0IgPSAoQllURSkoYWRkci8weDAxMDApOwovLyAgICBTTV9TVEFSVEFERFJfTVNCID0gTWVkaWEuWm9uZS8yOwovLwovLyAgICAvL1NlY3RvciBieXRlIGNvdW50ID0gMHgyMDAoRE1BKQovLyAgICBTZWN0Qnl0ZUNvdW50ID0gMHgyMGY7Ci8vICAgIFNNX0JZVEVDTlRfTE8gPSAoQllURSlTZWN0Qnl0ZUNvdW50OwovLyAgICBTTV9DTURfQ1RSTDMgPSAoU01fQ01EX0NUUkwzICYgMHhGQykgfCAoQllURSkoU2VjdEJ5dGVDb3VudC8weDAxMDApOwovLyAgICBpZiAoICgoZmRvRXh0LT5DaGlwSUQ9PVJFQURFUl9DQjcxMikmJihmZG9FeHQtPlJldklEPT1DSElQX0EpKSB8fCBmZG9FeHQtPklzSGliZXJuYXRlICkKLy8gICAgICAgU01fRklGT19DVFJMID0gKFNNX0FQQjA4X01BU0sgfCBTTV9ETUFFTl9NQVNLIHwgU01fRE1BX1VQU1RSRUFNX01BU0sgfCBTTV9GSUZPU0hMRFZMVV84X01BU0spOwovLyAgICBlbHNlCi8vICAgICAgIFNNX0ZJRk9fQ1RSTCA9IChTTV9BUEIzMl9NQVNLIHwgU01fRE1BRU5fTUFTSyB8IFNNX0RNQV9VUFNUUkVBTV9NQVNLIHwgU01fRklGT1NITERWTFVfOF9NQVNLKTsKLy8KLy8gICAgX0h3X0RfRWNjUmRSZXNldCgpOwovLyAgICBfSHdfRF9FY2NSZFN0YXJ0KCk7Ci8vCi8vICAgIFNNX0NNRF9DVFJMMSA9IChTTV9DTURfUkVBRF8xKTsKLy8gICAgU01fQ01EX0NUUkwxID0gKFNNX0NNRF9SRUFEXzEgfCBTTV9DTURfU1RBUlRfQklUKTsKLy8KLy8gICAgU2VjdEJ5dGVDb3VudCA9IDB4MWZmOwovLyAgICAvL1NNX1JlYWREYXRhV2l0aERNQShmZG9FeHQsIGJ1ZiwgU2VjdEJ5dGVDb3VudCk7Ci8vICAgIC8vX1JlYWRSZWR0X0RfU3NmZGNCdWYocmVkdW5kYW50KTsKLy8gICAgbGVuID0gMHgxMDAwIC0gKChXT1JEKShidWYpICYgMHgwRkZGKTsKLy8gICAgaWYgKGxlbiA8IDB4MjAwKQovLyAgICB7Ci8vICAgICAgIFNNX1JlYWREYXRhV2l0aERNQShmZG9FeHQsIGJ1ZiwgbGVuLTEpOwovLyAgICAgICBTTV9SZWFkRGF0YVdpdGhETUEoZmRvRXh0LCBidWYrbGVuLCBTZWN0Qnl0ZUNvdW50LWxlbik7Ci8vICAgICAgIC8vRU5FX1ByaW50KCJSZWFkIERNQSAhISEgYnVmMSA9ICVwLCBsZW4gPSAleCwgYnVmMiA9ICVwXG4iLCBidWYsIGxlbiwgYnVmK2xlbik7Ci8vICAgIH0KLy8gICAgZWxzZQovLyAgICAgIFNNX1JlYWREYXRhV2l0aERNQShmZG9FeHQsIGJ1ZiwgU2VjdEJ5dGVDb3VudCk7Ci8vCi8vICAgIGlmICggKChmZG9FeHQtPkNoaXBJRD09UkVBREVSX0NCNzEyKSYmKGZkb0V4dC0+UmV2SUQ9PUNISVBfQSkpIHx8IGZkb0V4dC0+SXNIaWJlcm5hdGUgKQovLyAgICB7Ci8vICAgICAgIF9SZWFkUmVkdF9EX1NzZmRjQnVmKHJlZHVuZGFudCk7Ci8vICAgIH0KLy8gICAgZWxzZQovLyAgICB7Ci8vICAgICAgIEJ1ZmZlclswXSA9IFJFQURfUE9SVF9EV09SRChTTV9SRUdfREFUQSk7Ci8vICAgICAgIEJ1ZmZlclsxXSA9IFJFQURfUE9SVF9EV09SRChTTV9SRUdfREFUQSk7Ci8vICAgICAgIEJ1ZmZlclsyXSA9IFJFQURfUE9SVF9EV09SRChTTV9SRUdfREFUQSk7Ci8vICAgICAgIEJ1ZmZlclszXSA9IFJFQURfUE9SVF9EV09SRChTTV9SRUdfREFUQSk7Ci8vICAgICAgIG1lbWNweShyZWR1bmRhbnQsIEJ1ZmZlciwgMHgxMCk7Ci8vICAgIH0KLy8KLy8gICAgd2hpbGUgKCBfSHdfRF9DaGtDYXJkSW4oKSApCi8vICAgIHsKLy8gICAgICAgIGlmKChSRUFEX1BPUlRfQllURShTTV9SRUdfSU5UX1NUQVRVUykgJiAweDEwKSkKLy8gICAgICAgIHsKLy8gICAgICAgICAgICBXUklURV9QT1JUX0JZVEUoU01fUkVHX0lOVF9TVEFUVVMsIDB4MTApOwovLyAgICAgICAgICAgIGJyZWFrOwovLyAgICAgICAgfQovLyAgICB9Ci8vICAgIF9Id19EX0VjY1JkU3RvcCgpOwovLyAgICBfSHdfRF9TZXRSZFN0YW5kYnkoKTsKLy8gICAgX0xvYWRfRF9Tc2ZkY1JkSHdFQ0MoRVZFTik7Ci8vCi8vICAgIF9DYWxjX0RfRUNDZGF0YShidWYpOwovLyAgICBfU2V0X0RfU3NmZGNSZFN0YW5kYnkoKTsKLy8KLy8gICAgaWYgKCFfSHdfRF9DaGtDYXJkSW4oKSkKLy8gICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgcmV0dXJuKFNVQ0NFU1MpOwovL30KLy8KLy8vLy0tLS0tIFNzZmRjX0RfUmVhZFNlY3RfUElPKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IFNzZmRjX0RfUmVhZFNlY3RfUElPKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQsIEJZVEUgKmJ1ZixCWVRFICpyZWR1bmRhbnQpCi8vewovLyAgICBfU2V0X0RfU3NmZGNSZENtZChSRUFEKTsKLy8gICAgX1NldF9EX1NzZmRjUmRBZGRyKEVWRU4pOwovLwovLyAgICBpZiAoX0NoZWNrX0RfU3NmZGNCdXN5KEJVU1lfUkVBRCkpCi8vICAgIHsgX1Jlc2V0X0RfU3NmZGNFcnIoKTsgcmV0dXJuKEVSUk9SKTsgfQovLwovLyAgICBfU3RhcnRfRF9Tc2ZkY1JkSHdFQ0MoKTsKLy8gICAgX1JlYWRfRF9Tc2ZkY0J1ZihidWYpOwovLyAgICBfU3RvcF9EX1NzZmRjUmRId0VDQygpOwovLyAgICBfUmVhZFJlZHRfRF9Tc2ZkY0J1ZihyZWR1bmRhbnQpOwovLyAgICBfTG9hZF9EX1NzZmRjUmRId0VDQyhFVkVOKTsKLy8KLy8gICAgaWYgKF9DaGVja19EX1NzZmRjQnVzeShCVVNZX1JFQUQpKQovLyAgICB7IF9SZXNldF9EX1NzZmRjRXJyKCk7IHJldHVybihFUlJPUik7IH0KLy8KLy8gICAgX0NhbGNfRF9FQ0NkYXRhKGJ1Zik7Ci8vICAgIF9TZXRfRF9Tc2ZkY1JkU3RhbmRieSgpOwovLyAgICByZXR1cm4oU1VDQ0VTUyk7Ci8vfQoKLy8gNjI1MCBDTUQgMwovLy0tLS0tIFNzZmRjX0RfV3JpdGVTZWN0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFNzZmRjX0RfV3JpdGVTZWN0KFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQsIEJZVEUgKmJ1ZixCWVRFICpyZWR1bmRhbnQpCnsKICAgIFBCVUxLX0NCVyAgICAgICAgICAgICAgIHBCdWxrQ2J3ID0gZmRvRXh0LT5wQnVsa0NidzsKICAgIE5UU1RBVFVTICAgICAgICAgICAgICAgIG50U3RhdHVzOwogICAgV09SRCAgICAgICAgICAgICAgICAgICAgYWRkcjsKCiAgICAvL0VORV9QcmludCgiU01JTFNVQiAtLS0gU3NmZGNfRF9Xcml0ZVNlY3RcbiIpOwogICAgRU5FX0xvYWRCaW5Db2RlKGZkb0V4dCwgU01fUldfUEFUVEVSTik7CgogICAgYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK01lZGlhLlBoeUJsb2NrOwogICAgYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycytNZWRpYS5TZWN0b3I7CgogICAgLy8gV3JpdGUgc2VjdCBkYXRhCiAgICBSdGxaZXJvTWVtb3J5KHBCdWxrQ2J3LCBzaXplb2Yoc3RydWN0IF9CVUxLX0NCVykpOwogICAgcEJ1bGtDYnctPmRDQldTaWduYXR1cmUgICAgICAgICAgPSBDQldfU0lHTlRVUkU7CiAgICBwQnVsa0Nidy0+YkNCV0x1biAgICAgICAgICAgICAgICA9IENCV19MVU47CiAgICBwQnVsa0Nidy0+ZENCV0RhdGFUcmFuc2Zlckxlbmd0aCA9IDB4MjAwOwogICAgcEJ1bGtDYnctPmJtQ0JXRmxhZ3MgICAgICAgICAgICAgPSAweDAwOwogICAgcEJ1bGtDYnctPkNCV0NiWzBdICAgICAgICAgICAgICAgPSAweEYwOwogICAgcEJ1bGtDYnctPkNCV0NiWzFdICAgICAgICAgICAgICAgPSAweDA0OwogICAgLy9wQnVsa0Nidy0+Q0JXQ2JbNF0gICAgICAgICAgICAgICA9IChCWVRFKWFkZHI7CiAgICAvL3BCdWxrQ2J3LT5DQldDYlszXSAgICAgICAgICAgICAgID0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKICAgIC8vcEJ1bGtDYnctPkNCV0NiWzJdICAgICAgICAgICAgICAgPSBNZWRpYS5ab25lLzI7CiAgICAvL3BCdWxrQ2J3LT5DQldDYls1XSAgICAgICAgICAgICAgID0gKihyZWR1bmRhbnQrUkVEVF9BRERSMUgpOwogICAgLy9wQnVsa0Nidy0+Q0JXQ2JbNl0gICAgICAgICAgICAgICA9ICoocmVkdW5kYW50K1JFRFRfQUREUjFMKTsKICAgIHBCdWxrQ2J3LT5DQldDYls3XSAgICAgICAgICAgICAgID0gKEJZVEUpYWRkcjsKICAgIHBCdWxrQ2J3LT5DQldDYls2XSAgICAgICAgICAgICAgID0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKICAgIHBCdWxrQ2J3LT5DQldDYls1XSAgICAgICAgICAgICAgID0gTWVkaWEuWm9uZS8yOwogICAgcEJ1bGtDYnctPkNCV0NiWzhdICAgICAgICAgICAgICAgPSAqKHJlZHVuZGFudCtSRURUX0FERFIxSCk7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbOV0gICAgICAgICAgICAgICA9ICoocmVkdW5kYW50K1JFRFRfQUREUjFMKTsKCiAgICBudFN0YXR1cyA9IEVORV9TZW5kU2NzaUNtZChmZG9FeHQsIEZESVJfV1JJVEUsIGJ1Zik7CgogICAgaWYgKCFOVF9TVUNDRVNTKG50U3RhdHVzKSkKICAgICAgIHJldHVybihFUlJPUik7CgovLyAgLy8gRm9yIFRlc3QKLy8gIHsKLy8gICAgIEJZVEUgICBiZlsweDIwMF0sIHJkZFsweDEwXTsKLy8gICAgIFVMT05HICBpOwovLwovLyAgICAgUnRsWmVyb01lbW9yeShiZiwgMHgyMDApOwovLyAgICAgUnRsWmVyb01lbW9yeShyZGQsIDB4MTApOwovLyAgICAgbnRTdGF0dXMgPSBTTV9SZWFkQmxvY2soZmRvRXh0LCBiZiwgcmRkKTsKLy8gICAgIGZvciAoaT0wOyBpPDB4MjAwOyBpKyspCi8vICAgICB7Ci8vICAgICAgICAgaWYgKGJ1ZltpXSAhPSBiZltpXSkKLy8gICAgICAgICAgICBFTkVfUHJpbnQoImJ1ZlsleF0gPSAleCwgYmZbJXhdID0gJXhcbiIsIGJ1ZiwgYmYpOwovLyAgICAgfQovLyAgICAgaWYgKCFOVF9TVUNDRVNTKG50U3RhdHVzKSkKLy8gICAgICAgIEVORV9QcmludCgiRXJyb3JcbiIpOwovLyAgfQoKICAgIHJldHVybihTVUNDRVNTKTsKfQoqLwovLy0tLS0tIFNzZmRjX0RfQ29weUJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFNzZmRjX0RfQ29weUJsb2NrKHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBjb3VudCwgQllURSAqYnVmLEJZVEUgKnJlZHVuZGFudCkKewoJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwoJaW50CXJlc3VsdDsKICAgIC8vUEJVTEtfQ0JXICAgICAgICAgICAgICAgcEJ1bGtDYncgPSBmZG9FeHQtPnBCdWxrQ2J3OwogICAgLy9OVFNUQVRVUyAgICAgICAgICAgICAgICBudFN0YXR1czsKCVdPUkQJUmVhZEFkZHIsIFdyaXRlQWRkcjsKCgkvL3ByaW50aygiU3NmZGNfRF9Xcml0ZVNlY3QgLS0tIFpPTkUgPSAleCwgUmVhZEJsb2NrID0gJXgsIFdyaXRlQmxvY2sgPSAleFxuIiwgTWVkaWEuWm9uZSwgUmVhZEJsb2NrLCBXcml0ZUJsb2NrKTsKCglyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIFNNX1JXX1BBVFRFUk4pOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgl7CgkJcHJpbnRrKCJMb2FkIFNNIFJXIENvZGUgRmFpbCAhIVxuIik7CgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCX0KCglSZWFkQWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK1JlYWRCbG9jazsKCVJlYWRBZGRyID0gUmVhZEFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9yczsKCVdyaXRlQWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK1dyaXRlQmxvY2s7CglXcml0ZUFkZHIgPSBXcml0ZUFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9yczsKCgkvLyBXcml0ZSBzZWN0IGRhdGEKCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CgliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CgliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aAk9IDB4MjAwKmNvdW50OwoJYmNiLT5GbGFncwkJCT0gMHgwMDsKCWJjYi0+Q0RCWzBdCQkJPSAweEYwOwoJYmNiLT5DREJbMV0JCQk9IDB4MDg7CgliY2ItPkNEQls3XQkJCT0gKEJZVEUpV3JpdGVBZGRyOwoJYmNiLT5DREJbNl0JCQk9IChCWVRFKShXcml0ZUFkZHIvMHgwMTAwKTsKCWJjYi0+Q0RCWzVdCQkJPSBNZWRpYS5ab25lLzI7CgliY2ItPkNEQls4XQkJCT0gKihyZWR1bmRhbnQrUkVEVF9BRERSMUgpOwoJYmNiLT5DREJbOV0JCQk9ICoocmVkdW5kYW50K1JFRFRfQUREUjFMKTsKCWJjYi0+Q0RCWzEwXQkJPSBNZWRpYS5TZWN0b3I7CgoJaWYgKFJlYWRCbG9jayAhPSBOT19BU1NJR04pCgl7CgkJYmNiLT5DREJbNF0JCT0gKEJZVEUpUmVhZEFkZHI7CgkJYmNiLT5DREJbM10JCT0gKEJZVEUpKFJlYWRBZGRyLzB4MDEwMCk7CgkJYmNiLT5DREJbMl0JCT0gTWVkaWEuWm9uZS8yOwoJfQoJZWxzZQoJCWJjYi0+Q0RCWzExXQk9IDE7CgoJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1dSSVRFLCBidWYsIDApOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCglyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7Cn0KLyoKLy8tLS0tLSBTc2ZkY19EX1dyaXRlQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgU3NmZGNfRF9Xcml0ZUJsb2NrKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQsIFdPUkQgY291bnQsIEJZVEUgKmJ1ZixCWVRFICpyZWR1bmRhbnQpCnsKICAgIFBCVUxLX0NCVyAgICAgICAgICAgICAgIHBCdWxrQ2J3ID0gZmRvRXh0LT5wQnVsa0NidzsKICAgIE5UU1RBVFVTICAgICAgICAgICAgICAgIG50U3RhdHVzOwogICAgV09SRCAgICAgICAgICAgICAgICAgICAgYWRkcjsKCiAgICAvL0VORV9QcmludCgiU01JTFNVQiAtLS0gU3NmZGNfRF9Xcml0ZVNlY3RcbiIpOwogICAgRU5FX0xvYWRCaW5Db2RlKGZkb0V4dCwgU01fUldfUEFUVEVSTik7CgogICAgYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK01lZGlhLlBoeUJsb2NrOwogICAgYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycytNZWRpYS5TZWN0b3I7CgogICAgLy8gV3JpdGUgc2VjdCBkYXRhCiAgICBSdGxaZXJvTWVtb3J5KHBCdWxrQ2J3LCBzaXplb2Yoc3RydWN0IF9CVUxLX0NCVykpOwogICAgcEJ1bGtDYnctPmRDQldTaWduYXR1cmUgICAgICAgICAgPSBDQldfU0lHTlRVUkU7CiAgICBwQnVsa0Nidy0+YkNCV0x1biAgICAgICAgICAgICAgICA9IENCV19MVU47CiAgICBwQnVsa0Nidy0+ZENCV0RhdGFUcmFuc2Zlckxlbmd0aCA9IDB4MjAwKmNvdW50OwogICAgcEJ1bGtDYnctPmJtQ0JXRmxhZ3MgICAgICAgICAgICAgPSAweDAwOwogICAgcEJ1bGtDYnctPkNCV0NiWzBdICAgICAgICAgICAgICAgPSAweEYwOwogICAgcEJ1bGtDYnctPkNCV0NiWzFdICAgICAgICAgICAgICAgPSAweDA0OwogICAgcEJ1bGtDYnctPkNCV0NiWzddICAgICAgICAgICAgICAgPSAoQllURSlhZGRyOwogICAgcEJ1bGtDYnctPkNCV0NiWzZdICAgICAgICAgICAgICAgPSAoQllURSkoYWRkci8weDAxMDApOwogICAgcEJ1bGtDYnctPkNCV0NiWzVdICAgICAgICAgICAgICAgPSBNZWRpYS5ab25lLzI7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbOF0gICAgICAgICAgICAgICA9ICoocmVkdW5kYW50K1JFRFRfQUREUjFIKTsKICAgIHBCdWxrQ2J3LT5DQldDYls5XSAgICAgICAgICAgICAgID0gKihyZWR1bmRhbnQrUkVEVF9BRERSMUwpOwoKICAgIG50U3RhdHVzID0gRU5FX1NlbmRTY3NpQ21kKGZkb0V4dCwgRkRJUl9XUklURSwgYnVmKTsKCiAgICBpZiAoIU5UX1NVQ0NFU1MobnRTdGF0dXMpKQogICAgICAgcmV0dXJuKEVSUk9SKTsKCi8vICAvLyBGb3IgVGVzdAovLyAgewovLyAgICAgQllURSAgIGJmWzB4MjAwXSwgcmRkWzB4MTBdOwovLyAgICAgVUxPTkcgIGk7Ci8vCi8vICAgICBSdGxaZXJvTWVtb3J5KGJmLCAweDIwMCk7Ci8vICAgICBSdGxaZXJvTWVtb3J5KHJkZCwgMHgxMCk7Ci8vICAgICBudFN0YXR1cyA9IFNNX1JlYWRCbG9jayhmZG9FeHQsIGJmLCByZGQpOwovLyAgICAgZm9yIChpPTA7IGk8MHgyMDA7IGkrKykKLy8gICAgIHsKLy8gICAgICAgICBpZiAoYnVmW2ldICE9IGJmW2ldKQovLyAgICAgICAgICAgIEVORV9QcmludCgiYnVmWyV4XSA9ICV4LCBiZlsleF0gPSAleFxuIiwgYnVmLCBiZik7Ci8vICAgICB9Ci8vICAgICBpZiAoIU5UX1NVQ0NFU1MobnRTdGF0dXMpKQovLyAgICAgICAgRU5FX1ByaW50KCJFcnJvclxuIik7Ci8vICB9CgogICAgcmV0dXJuKFNVQ0NFU1MpOwp9Ci8vCi8vLy8tLS0tLSBTc2ZkY19EX1dyaXRlU2VjdF9ETUEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBTc2ZkY19EX1dyaXRlU2VjdF9ETUEoUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCwgQllURSAqYnVmLEJZVEUgKnJlZHVuZGFudCkKLy97Ci8vICAgIFdPUkQgICAgU2VjdEJ5dGVDb3VudCwgYWRkcjsKLy8gICAgRFdPUkQgICBCdWZmZXJbNF07Ci8vICAgIFdPUkQgICAgbGVuOwovLwovLyAgICBpZiAoIV9Id19EX0Noa0NhcmRJbigpKQovLyAgICAgICByZXR1cm4oRVJST1IpOwovLyAgICBhZGRyPShXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK01lZGlhLlBoeUJsb2NrOwovLyAgICBhZGRyPWFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycytNZWRpYS5TZWN0b3I7Ci8vICAgIC8vIGN5Y2xlIHN0YXJ0aW5nIGFkZHJlc3MKLy8gICAgU01fU1RBUlRBRERSX0xTQiA9IDB4MDA7Ci8vICAgIFNNX1NUQVJUQUREUl9JSVNCID0gKEJZVEUpYWRkcjsKLy8gICAgU01fU1RBUlRBRERSX0lJSVNCID0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKLy8gICAgU01fU1RBUlRBRERSX01TQiA9IE1lZGlhLlpvbmUvMjsKLy8KLy8gICAgLy9TZWN0b3IgYnl0ZSBjb3VudCAoRE1BKQovLyAgICBTZWN0Qnl0ZUNvdW50ID0gMHgyMGY7Ci8vICAgIFNNX0JZVEVDTlRfTE8gPSAoQllURSlTZWN0Qnl0ZUNvdW50OwovLyAgICBTTV9DTURfQ1RSTDMgPSAoU01fQ01EX0NUUkwzICYgMHhGQykgfCAweDIwIHwgKEJZVEUpKFNlY3RCeXRlQ291bnQvMHgwMTAwKTsKLy8gICAgaWYgKCAoKGZkb0V4dC0+Q2hpcElEPT1SRUFERVJfQ0I3MTIpJiYoZmRvRXh0LT5SZXZJRD09Q0hJUF9BKSkgfHwgZmRvRXh0LT5Jc0hpYmVybmF0ZSApCi8vICAgICAgIFNNX0ZJRk9fQ1RSTCA9IChTTV9BUEIwOF9NQVNLIHwgU01fRE1BRU5fTUFTSyB8IFNNX0RNQV9ET1dOU1RSRUFNX01BU0sgfCBTTV9GSUZPU0hMRFZMVV84X01BU0spOwovLyAgICBlbHNlCi8vICAgICAgIFNNX0ZJRk9fQ1RSTCA9IChTTV9BUEIzMl9NQVNLIHwgU01fRE1BRU5fTUFTSyB8IFNNX0RNQV9ET1dOU1RSRUFNX01BU0sgfCBTTV9GSUZPU0hMRFZMVV84X01BU0spOwovLwovLyAgICBfSHdfRF9FY2NSZFJlc2V0KCk7Ci8vICAgIF9Id19EX0VjY1JkU3RhcnQoKTsKLy8KLy8gICAgU01fQ01EX0NUUkwxID0gU01fQ01EX1BBR1BSR01fVFJVRTsKLy8gICAgU01fQ01EX0NUUkwxID0gKFNNX0NNRF9QQUdQUkdNX1RSVUUgfCBTTV9DTURfU1RBUlRfQklUKTsKLy8KLy8gICAgU2VjdEJ5dGVDb3VudCA9IDB4MWZmOwovLyAgICAvL1NNX1dyaXRlRGF0YVdpdGhETUEoZmRvRXh0LCBidWYsIFNlY3RCeXRlQ291bnQpOwovLyAgICAvL19Xcml0ZVJlZHRfRF9Tc2ZkY0J1ZihyZWR1bmRhbnQpOwovLyAgICBsZW4gPSAweDEwMDAgLSAoKFdPUkQpKGJ1ZikgJiAweDBGRkYpOwovLyAgICBpZiAobGVuIDwgMHgyMDApCi8vICAgIHsKLy8gICAgICAgU01fV3JpdGVEYXRhV2l0aERNQShmZG9FeHQsIGJ1ZiwgbGVuLTEpOwovLyAgICAgICBTTV9Xcml0ZURhdGFXaXRoRE1BKGZkb0V4dCwgYnVmK2xlbiwgU2VjdEJ5dGVDb3VudC1sZW4pOwovLyAgICAgICAvL0VORV9QcmludCgiUmVhZCBETUEgISEhIGJ1ZjEgPSAlcCwgbGVuID0gJXgsIGJ1ZjIgPSAlcFxuIiwgYnVmLCBsZW4sIGJ1ZitsZW4pOwovLyAgICB9Ci8vICAgIGVsc2UKLy8gICAgICBTTV9Xcml0ZURhdGFXaXRoRE1BKGZkb0V4dCwgYnVmLCBTZWN0Qnl0ZUNvdW50KTsKLy8KLy8gICAgLy9UMSA9IChVTE9OR0xPTkcpYnVmICYgMHhGRkZGRkZGRkZGRkZGMDAwOwovLyAgICAvL1QyID0gKChVTE9OR0xPTkcpYnVmICsgMHgxRkYpICYgMHhGRkZGRkZGRkZGRkZGMDAwOwovLyAgICAvL2lmIChUMSAhPSBUMikKLy8gICAgLy8gICBFTkVfUHJpbnQoIlNzZmRjX0RfV3JpdGVTZWN0X0RNQSAhISEgYnVmID0gJXAsIFQxID0gJXAsIFQyID0gJXBcbiIsIGJ1ZiwgVDEsIFQyKTsKLy8gICAgLy9pZiAoVDItVDEpCi8vICAgIC8vewovLyAgICAvLyAgIGwxID0gKFdPUkQpKFQyIC0gKFVMT05HTE9ORylidWYpOwovLyAgICAvLyAgIFNNX1dyaXRlRGF0YVdpdGhETUEoZmRvRXh0LCBidWYsIGwxLTEpOwovLyAgICAvLyAgIFNNX1dyaXRlRGF0YVdpdGhETUEoZmRvRXh0LCAoUEJZVEUpVDIsIFNlY3RCeXRlQ291bnQtbDEpOwovLyAgICAvL30KLy8gICAgLy9lbHNlCi8vICAgIC8vICBTTV9Xcml0ZURhdGFXaXRoRE1BKGZkb0V4dCwgYnVmLCBTZWN0Qnl0ZUNvdW50KTsKLy8KLy8gICAgaWYgKCAoKGZkb0V4dC0+Q2hpcElEPT1SRUFERVJfQ0I3MTIpJiYoZmRvRXh0LT5SZXZJRD09Q0hJUF9BKSkgfHwgZmRvRXh0LT5Jc0hpYmVybmF0ZSApCi8vICAgIHsKLy8gICAgICAgX1dyaXRlUmVkdF9EX1NzZmRjQnVmKHJlZHVuZGFudCk7Ci8vICAgIH0KLy8gICAgZWxzZQovLyAgICB7Ci8vICAgICAgIG1lbWNweShCdWZmZXIsIHJlZHVuZGFudCwgMHgxMCk7Ci8vICAgICAgIFdSSVRFX1BPUlRfRFdPUkQoU01fUkVHX0RBVEEsIEJ1ZmZlclswXSk7Ci8vICAgICAgIFdSSVRFX1BPUlRfRFdPUkQoU01fUkVHX0RBVEEsIEJ1ZmZlclsxXSk7Ci8vICAgICAgIFdSSVRFX1BPUlRfRFdPUkQoU01fUkVHX0RBVEEsIEJ1ZmZlclsyXSk7Ci8vICAgICAgIFdSSVRFX1BPUlRfRFdPUkQoU01fUkVHX0RBVEEsIEJ1ZmZlclszXSk7Ci8vICAgIH0KLy8KLy8gICAgd2hpbGUgKCBfSHdfRF9DaGtDYXJkSW4oKSApCi8vICAgIHsKLy8gICAgICAgaWYgKChSRUFEX1BPUlRfQllURShTTV9SRUdfSU5UX1NUQVRVUykgJiAweDEwKSkKLy8gICAgICAgewovLyAgICAgICAgICAgV1JJVEVfUE9SVF9CWVRFKFNNX1JFR19JTlRfU1RBVFVTLCAweDEwKTsKLy8gICAgICAgICAgIGJyZWFrOwovLyAgICAgICB9Ci8vICAgIH0KLy8gICAgX0h3X0RfRWNjUmRTdG9wKCk7Ci8vICAgIF9Id19EX1NldFJkU3RhbmRieSgpOwovLwovLyAgICBfU2V0X0RfU3NmZGNXclN0YW5kYnkoKTsKLy8gICAgX1NldF9EX1NzZmRjUmRTdGFuZGJ5KCk7Ci8vICAgIGlmICghX0h3X0RfQ2hrQ2FyZEluKCkpCi8vICAgICAgIHJldHVybihFUlJPUik7Ci8vCi8vICAgIHJldHVybihTVUNDRVNTKTsKLy99Ci8vCi8vLy8tLS0tLSBTc2ZkY19EX1dyaXRlU2VjdF9QSU8oKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBTc2ZkY19EX1dyaXRlU2VjdF9QSU8oUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCwgQllURSAqYnVmLEJZVEUgKnJlZHVuZGFudCkKLy97Ci8vICAgIF9DYWxjX0RfRUNDZGF0YShidWYpOwovLyAgICBfU2V0X0RfU3NmZGNXckNtZChXUkRBVEEpOwovLyAgICBfU2V0X0RfU3NmZGNXckFkZHIoRVZFTik7Ci8vICAgIF9TdGFydF9EX1NzZmRjV3JId0VDQygpOwovLwovLyAgICBfV3JpdGVfRF9Tc2ZkY0J1ZihidWYpOwovLwovLyAgICBfTG9hZF9EX1NzZmRjV3JId0VDQyhFVkVOKTsKLy8gICAgX1NldF9EX0VDQ2RhdGEoRVZFTixyZWR1bmRhbnQpOwovLwovLyAgICBfV3JpdGVSZWR0X0RfU3NmZGNCdWYocmVkdW5kYW50KTsKLy8KLy8gICAgX1NldF9EX1NzZmRjV3JDbWQoV1JJVEUpOwovLwovLyAgICBpZiAoX0NoZWNrX0RfU3NmZGNCdXN5KEJVU1lfUFJPRykpCi8vICAgIHsgX1Jlc2V0X0RfU3NmZGNFcnIoKTsgcmV0dXJuKEVSUk9SKTsgfQovLwovLyAgICBfU2V0X0RfU3NmZGNXclN0YW5kYnkoKTsKLy8gICAgX1NldF9EX1NzZmRjUmRTdGFuZGJ5KCk7Ci8vICAgIHJldHVybihTVUNDRVNTKTsKLy99CiovCi8vLS0tLS0gU3NmZGNfRF9Xcml0ZVNlY3RGb3JDb3B5KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgU3NmZGNfRF9Xcml0ZVNlY3RGb3JDb3B5KHN0cnVjdCB1c19kYXRhICp1cywgQllURSAqYnVmLCBCWVRFICpyZWR1bmRhbnQpCnsKCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKCWludAlyZXN1bHQ7CgkvL1BCVUxLX0NCVyAgICAgICAgICAgICAgIHBCdWxrQ2J3ID0gZmRvRXh0LT5wQnVsa0NidzsKCS8vTlRTVEFUVVMgICAgICAgICAgICAgICAgbnRTdGF0dXM7CglXT1JEICAgICAgICAgICAgICAgICAgICBhZGRyOwoKCS8vcHJpbnRrKCJTTUlMU1VCIC0tLSBTc2ZkY19EX1dyaXRlU2VjdEZvckNvcHlcbiIpOwoJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBTTV9SV19QQVRURVJOKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJewoJCXByaW50aygiTG9hZCBTTSBSVyBDb2RlIEZhaWwgISFcbiIpOwoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7Cgl9CgoKCWFkZHIgPSAoV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcytNZWRpYS5QaHlCbG9jazsKCWFkZHIgPSBhZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnMrTWVkaWEuU2VjdG9yOwoKCS8vIFdyaXRlIHNlY3QgZGF0YQoJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoCT0gMHgyMDA7CgliY2ItPkZsYWdzCQkJPSAweDAwOwoJYmNiLT5DREJbMF0JCQk9IDB4RjA7CgliY2ItPkNEQlsxXQkJCT0gMHgwNDsKCWJjYi0+Q0RCWzddCQkJPSAoQllURSlhZGRyOwoJYmNiLT5DREJbNl0JCQk9IChCWVRFKShhZGRyLzB4MDEwMCk7CgliY2ItPkNEQls1XQkJCT0gTWVkaWEuWm9uZS8yOwoJYmNiLT5DREJbOF0JCQk9ICoocmVkdW5kYW50K1JFRFRfQUREUjFIKTs7CgliY2ItPkNEQls5XQkJCT0gKihyZWR1bmRhbnQrUkVEVF9BRERSMUwpOzsKCglyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfV1JJVEUsIGJ1ZiwgMCk7CglpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwoKCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKfQoKLy8gNjI1MCBDTUQgNQovLy0tLS0tIFNzZmRjX0RfRXJhc2VCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFNzZmRjX0RfRXJhc2VCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMpCnsKCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKCWludAlyZXN1bHQ7CglXT1JECWFkZHI7CgoJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBTTV9SV19QQVRURVJOKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJewoJCXByaW50aygiTG9hZCBTTSBSVyBDb2RlIEZhaWwgISFcbiIpOwoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7Cgl9CgoJYWRkcj0oV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcytNZWRpYS5QaHlCbG9jazsKCWFkZHI9YWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzOwoKCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CgliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CgliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aAk9IDB4MjAwOwoJYmNiLT5GbGFncwkJCT0gMHg4MDsKCWJjYi0+Q0RCWzBdCQkJPSAweEYyOwoJYmNiLT5DREJbMV0JCQk9IDB4MDY7CgliY2ItPkNEQls3XQkJCT0gKEJZVEUpYWRkcjsKCWJjYi0+Q0RCWzZdCQkJPSAoQllURSkoYWRkci8weDAxMDApOwoJYmNiLT5DREJbNV0JCQk9IE1lZGlhLlpvbmUvMjsKCglyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfUkVBRCwgTlVMTCwgMCk7CglpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwoKCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKfQoKLy8gNjI1MCBDTUQgMgovLy0tLS0tIFNzZmRjX0RfUmVhZFJlZHREYXRhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFNzZmRjX0RfUmVhZFJlZHREYXRhKHN0cnVjdCB1c19kYXRhICp1cywgQllURSAqcmVkdW5kYW50KQp7CglzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CglpbnQJcmVzdWx0OwoJV09SRAlhZGRyOwoJQllURSAgKmJ1ZjsKCglyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIFNNX1JXX1BBVFRFUk4pOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgl7CgkJcHJpbnRrKCJMb2FkIFNNIFJXIENvZGUgRmFpbCAhIVxuIik7CgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCX0KCglhZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7CglhZGRyID0gYWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzK01lZGlhLlNlY3RvcjsKCgltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwoJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwoJYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGgJPSAweDEwOwoJYmNiLT5GbGFncwkJCT0gMHg4MDsKCWJjYi0+Q0RCWzBdCQkJPSAweEYxOwoJYmNiLT5DREJbMV0JCQk9IDB4MDM7CgliY2ItPkNEQls0XQkJCT0gKEJZVEUpYWRkcjsKCWJjYi0+Q0RCWzNdCQkJPSAoQllURSkoYWRkci8weDAxMDApOwoJYmNiLT5DREJbMl0JCQk9IE1lZGlhLlpvbmUvMjsKCWJjYi0+Q0RCWzhdCQkJPSAwOwoJYmNiLT5DREJbOV0JCQk9IDE7CgoJYnVmID0ga21hbGxvYygweDEwLCBHRlBfS0VSTkVMKTsKCS8vcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIHJlZHVuZGFudCwgMCk7CglyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfUkVBRCwgYnVmLCAwKTsKCW1lbWNweShyZWR1bmRhbnQsIGJ1ZiwgMHgxMCk7CglrZnJlZShidWYpOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCglyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7Cn0KCi8vIDYyNTAgQ01EIDQKLy8tLS0tLSBTc2ZkY19EX1dyaXRlUmVkdERhdGEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBTc2ZkY19EX1dyaXRlUmVkdERhdGEoc3RydWN0IHVzX2RhdGEgKnVzLCBCWVRFICpyZWR1bmRhbnQpCnsKCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKCWludAlyZXN1bHQ7CgkvL1BCVUxLX0NCVyAgICAgICAgICAgICAgIHBCdWxrQ2J3ID0gZmRvRXh0LT5wQnVsa0NidzsKCS8vTlRTVEFUVVMgICAgICAgICAgICAgICAgbnRTdGF0dXM7CglXT1JEICAgICAgICAgICAgICAgICAgICBhZGRyOwoKCXJlc3VsdCA9IEVORV9Mb2FkQmluQ29kZSh1cywgU01fUldfUEFUVEVSTik7CglpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKCXsKCQlwcmludGsoIkxvYWQgU00gUlcgQ29kZSBGYWlsICEhXG4iKTsKCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwoJfQoKCWFkZHIgPSAoV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcytNZWRpYS5QaHlCbG9jazsKCWFkZHIgPSBhZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnMrTWVkaWEuU2VjdG9yOwoKCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CgliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CgliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aAk9IDB4MTA7CgliY2ItPkZsYWdzCQkJPSAweDgwOwoJYmNiLT5DREJbMF0JCQk9IDB4RjI7CgliY2ItPkNEQlsxXQkJCT0gMHgwNTsKCWJjYi0+Q0RCWzddCQkJPSAoQllURSlhZGRyOwoJYmNiLT5DREJbNl0JCQk9IChCWVRFKShhZGRyLzB4MDEwMCk7CgliY2ItPkNEQls1XQkJCT0gTWVkaWEuWm9uZS8yOwoJYmNiLT5DREJbOF0JCQk9ICoocmVkdW5kYW50K1JFRFRfQUREUjFIKTsKCWJjYi0+Q0RCWzldCQkJPSAqKHJlZHVuZGFudCtSRURUX0FERFIxTCk7CgoJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIE5VTEwsIDApOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCglyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7Cn0KCi8vLS0tLS0gU3NmZGNfRF9DaGVja1N0YXR1cygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgU3NmZGNfRF9DaGVja1N0YXR1cyh2b2lkKQp7CiAgICAvLyBEcml2ZXIgpKOwtQogICAgcmV0dXJuKFNVQ0NFU1MpOwogICAgLy9fU2V0X0RfU3NmZGNSZENtZChSRFNUQVRVUyk7CiAgICAvLwogICAgLy9pZiAoX0NoZWNrX0RfU3NmZGNTdGF0dXMoKSkKICAgIC8veyBfU2V0X0RfU3NmZGNSZFN0YW5kYnkoKTsgcmV0dXJuKEVSUk9SKTsgfQogICAgLy8KICAgIC8vX1NldF9EX1NzZmRjUmRTdGFuZGJ5KCk7CiAgICAvL3JldHVybihTVUNDRVNTKTsKfQovKgovLy8vTkFORCBNZW1vcnkgKFNtYXJ0TWVkaWEpIENvbnRyb2wgU3Vicm91dGluZSBmb3IgUmVhZCBEYXRhCi8vLy8tLS0tLSBfU2V0X0RfU3NmZGNSZENtZCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBfU2V0X0RfU3NmZGNSZENtZChCWVRFIGNtZCkKLy97Ci8vICAgIF9Id19EX1NldFJkQ21kKCk7Ci8vICAgIF9Id19EX091dERhdGEoY21kKTsKLy8gICAgX0h3X0RfU2V0UmREYXRhKCk7Ci8vfQovLwovLy8vLS0tLS0gX1NldF9EX1NzZmRjUmRBZGRyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgX1NldF9EX1NzZmRjUmRBZGRyKEJZVEUgYWRkKQovL3sKLy8gICAgV09SRCBhZGRyOwovLyAgICBTU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKLy8gICAgQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7Ci8vCi8vICAgIGFkZHI9KFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7Ci8vICAgIGFkZHI9YWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzK01lZGlhLlNlY3RvcjsKLy8KLy8gICAgLy9pZiAoKFNzZmRjLkF0dHJpYnV0ZSAmTVBTKT09UFMyNTYpIC8vIGZvciAyNTZieXRlL3BhZ2UKLy8gICAgLy8gICAgYWRkcj1hZGRyKjIrKFdPUkQpYWRkOwovLwovLyAgICBfSHdfRF9TZXRSZEFkZHIoKTsKLy8gICAgX0h3X0RfT3V0RGF0YSgweDAwKTsKLy8gICAgX0h3X0RfT3V0RGF0YSgoQllURSlhZGRyKTsKLy8gICAgX0h3X0RfT3V0RGF0YSgoQllURSkoYWRkci8weDAxMDApKTsKLy8KLy8gICAgaWYgKChTc2ZkYy5BdHRyaWJ1dGUgJk1BREMpPT1BRDRDWUMpCi8vICAgICAgICBfSHdfRF9PdXREYXRhKChCWVRFKShNZWRpYS5ab25lLzIpKTsgLy8gUGF0Y2gKLy8KLy8gICAgX0h3X0RfU2V0UmREYXRhKCk7Ci8vfQovLwovLy8vLS0tLS0gX1NldF9EX1NzZmRjUmRDaGlwKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgX1NldF9EX1NzZmRjUmRDaGlwKHZvaWQpCi8vewovLyAgICBfSHdfRF9TZXRSZEFkZHIoKTsKLy8gICAgX0h3X0RfT3V0RGF0YSgweDAwKTsKLy8gICAgX0h3X0RfU2V0UmREYXRhKCk7Ci8vfQovLwovLy8vLS0tLS0gX1NldF9EX1NzZmRjUmRTdGFuZGJ5KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgX1NldF9EX1NzZmRjUmRTdGFuZGJ5KHZvaWQpCi8vewovLyAgICBfSHdfRF9TZXRSZFN0YW5kYnkoKTsKLy99Ci8vCi8vLy8tLS0tLSBfU3RhcnRfRF9Tc2ZkY1JkSHdFQ0MoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBfU3RhcnRfRF9Tc2ZkY1JkSHdFQ0Modm9pZCkKLy97Ci8vI2lmZGVmIEhXX0VDQ19TVVBQT1JURUQKLy8gICAgX0h3X0RfRWNjUmRSZXNldCgpOwovLyAgICBfSHdfRF9JbkRhdGEoKTsKLy8gICAgX0h3X0RfRWNjUmRTdGFydCgpOwovLyNlbmRpZgovL30KLy8KLy8vLy0tLS0tIF9TdG9wX0RfU3NmZGNSZEh3RUNDKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9TdG9wX0RfU3NmZGNSZEh3RUNDKHZvaWQpCi8vewovLyNpZmRlZiBIV19FQ0NfU1VQUE9SVEVECi8vICAgIF9Id19EX0VjY1JkU3RvcCgpOwovLyNlbmRpZgovL30KLy8KLy8vLy0tLS0tIF9Mb2FkX0RfU3NmZGNSZEh3RUNDKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9Mb2FkX0RfU3NmZGNSZEh3RUNDKEJZVEUgYWRkKQovL3sKLy8jaWZkZWYgSFdfRUNDX1NVUFBPUlRFRAovLyAgICBfSHdfRF9FY2NSZFJlYWQoKTsKLy8gICAgLy9pZiAoIShhZGQ9PU9ERCAmJiAoU3NmZGMuQXR0cmlidXRlICZNUFMpPT1QUzI1NikpCi8vICAgIHsKLy8gICAgICAgIEVjY0J1ZlswXT1fSHdfRF9JbkRhdGEoKTsKLy8gICAgICAgIEVjY0J1ZlsxXT1fSHdfRF9JbkRhdGEoKTsKLy8gICAgICAgIEVjY0J1ZlsyXT1fSHdfRF9JbkRhdGEoKTsKLy8gICAgfQovLwovLyAgICAvL2lmICghKGFkZD09RVZFTiAmJiAoU3NmZGMuQXR0cmlidXRlICZNUFMpPT1QUzI1NikpCi8vICAgIHsKLy8gICAgICAgIEVjY0J1ZlszXT1fSHdfRF9JbkRhdGEoKTsKLy8gICAgICAgIEVjY0J1Zls0XT1fSHdfRF9JbkRhdGEoKTsKLy8gICAgICAgIEVjY0J1Zls1XT1fSHdfRF9JbkRhdGEoKTsKLy8gICAgfQovLwovLyAgICBfSHdfRF9FY2NSZFN0b3AoKTsKLy8jZW5kaWYKLy99Ci8vCi8vLy9OQU5EIE1lbW9yeSAoU21hcnRNZWRpYSkgQ29udHJvbCBTdWJyb3V0aW5lIGZvciBXcml0ZSBEYXRhCi8vCi8vLy8tLS0tLSBfU2V0X0RfU3NmZGNXckNtZCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBfU2V0X0RfU3NmZGNXckNtZChCWVRFIGNtZCkKLy97Ci8vICAgIF9Id19EX1NldFdyQ21kKCk7Ci8vICAgIF9Id19EX091dERhdGEoY21kKTsKLy8gICAgX0h3X0RfU2V0V3JEYXRhKCk7Ci8vfQovLwovLy8vLS0tLS0gX1NldF9EX1NzZmRjV3JBZGRyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9TZXRfRF9Tc2ZkY1dyQWRkcihCWVRFIGFkZCkKLy97Ci8vICAgIFdPUkQgYWRkcjsKLy8gICAgU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7Ci8vICAgIEFERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwovLwovLyAgICBhZGRyPShXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK01lZGlhLlBoeUJsb2NrOwovLyAgICBhZGRyPWFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycytNZWRpYS5TZWN0b3I7Ci8vCi8vICAgIC8vaWYgKChTc2ZkYy5BdHRyaWJ1dGUgJk1QUyk9PVBTMjU2KSAvLyBmb3IgMjU2Ynl0ZS9wYWdlCi8vICAgIC8vICAgIGFkZHI9YWRkcioyKyhXT1JEKWFkZDsKLy8KLy8gICAgX0h3X0RfU2V0V3JBZGRyKCk7Ci8vICAgIF9Id19EX091dERhdGEoMHgwMCk7Ci8vICAgIF9Id19EX091dERhdGEoKEJZVEUpYWRkcik7Ci8vICAgIF9Id19EX091dERhdGEoKEJZVEUpKGFkZHIvMHgwMTAwKSk7Ci8vCi8vICAgIGlmICgoU3NmZGMuQXR0cmlidXRlICZNQURDKT09QUQ0Q1lDKQovLyAgICAgICAgX0h3X0RfT3V0RGF0YSgoQllURSkoTWVkaWEuWm9uZS8yKSk7IC8vIFBhdGNoCi8vCi8vICAgIF9Id19EX1NldFdyRGF0YSgpOwovL30KLy8KLy8vLy0tLS0tIF9TZXRfRF9Tc2ZkY1dyQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgX1NldF9EX1NzZmRjV3JCbG9jayh2b2lkKQovL3sKLy8gICAgV09SRCBhZGRyOwovLyAgICBTU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKLy8gICAgQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7Ci8vCi8vICAgIGFkZHI9KFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7Ci8vICAgIGFkZHI9YWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzOwovLwovLyAgICAvL2lmICgoU3NmZGMuQXR0cmlidXRlICZNUFMpPT1QUzI1NikgLy8gZm9yIDI1NmJ5dGUvcGFnZQovLyAgICAvLyAgICBhZGRyPWFkZHIqMjsKLy8KLy8gICAgX0h3X0RfU2V0V3JBZGRyKCk7Ci8vICAgIF9Id19EX091dERhdGEoKEJZVEUpYWRkcik7Ci8vICAgIF9Id19EX091dERhdGEoKEJZVEUpKGFkZHIvMHgwMTAwKSk7Ci8vCi8vICAgIGlmICgoU3NmZGMuQXR0cmlidXRlICZNQURDKT09QUQ0Q1lDKQovLyAgICAgICAgX0h3X0RfT3V0RGF0YSgoQllURSkoTWVkaWEuWm9uZS8yKSk7IC8vIFBhdGNoCi8vCi8vICAgIF9Id19EX1NldFdyRGF0YSgpOwovL30KLy8KLy8vLy0tLS0tIF9TZXRfRF9Tc2ZkY1dyU3RhbmRieSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBfU2V0X0RfU3NmZGNXclN0YW5kYnkodm9pZCkKLy97Ci8vICAgIF9Id19EX1NldFdyU3RhbmRieSgpOwovL30KLy8KLy8vLy0tLS0tIF9TdGFydF9EX1NzZmRjV3JId0VDQygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBfU3RhcnRfRF9Tc2ZkY1dySHdFQ0Modm9pZCkKLy97Ci8vI2lmZGVmIEhXX0VDQ19TVVBQT1JURUQKLy8gICAgX0h3X0RfRWNjV3JSZXNldCgpOwovLyAgICBfSHdfRF9JbkRhdGEoKTsKLy8gICAgX0h3X0RfRWNjV3JTdGFydCgpOwovLyNlbmRpZgovL30KLy8KLy8vLy0tLS0tIF9Mb2FkX0RfU3NmZGNXckh3RUNDKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9Mb2FkX0RfU3NmZGNXckh3RUNDKEJZVEUgYWRkKQovL3sKLy8jaWZkZWYgSFdfRUNDX1NVUFBPUlRFRAovLyAgICBfSHdfRF9FY2NXclJlYWQoKTsKLy8gICAgLy9pZiAoIShhZGQ9PU9ERCAmJiAoU3NmZGMuQXR0cmlidXRlICZNUFMpPT1QUzI1NikpCi8vICAgIHsKLy8gICAgICAgIEVjY0J1ZlswXT1fSHdfRF9JbkRhdGEoKTsKLy8gICAgICAgIEVjY0J1ZlsxXT1fSHdfRF9JbkRhdGEoKTsKLy8gICAgICAgIEVjY0J1ZlsyXT1fSHdfRF9JbkRhdGEoKTsKLy8gICAgfQovLwovLyAgICAvL2lmICghKGFkZD09RVZFTiAmJiAoU3NmZGMuQXR0cmlidXRlICZNUFMpPT1QUzI1NikpCi8vICAgIHsKLy8gICAgICAgIEVjY0J1ZlszXT1fSHdfRF9JbkRhdGEoKTsKLy8gICAgICAgIEVjY0J1Zls0XT1fSHdfRF9JbkRhdGEoKTsKLy8gICAgICAgIEVjY0J1Zls1XT1fSHdfRF9JbkRhdGEoKTsKLy8gICAgfQovLwovLyAgICBfSHdfRF9FY2NXclN0b3AoKTsKLy8jZW5kaWYKLy99Ci8vCi8vLy9OQU5EIE1lbW9yeSAoU21hcnRNZWRpYSkgQ29udHJvbCBTdWJyb3V0aW5lCi8vLy8tLS0tLSBfQ2hlY2tfRF9Tc2ZkY0J1c3koKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IF9DaGVja19EX1NzZmRjQnVzeShXT1JEIHRpbWUpCi8vewovLyAgICBXT1JEICBjb3VudCA9IDA7Ci8vCi8vICAgIGRvIHsKLy8gICAgICAgIGlmICghX0h3X0RfQ2hrQnVzeSgpKQovLyAgICAgICAgICAgIHJldHVybihTVUNDRVNTKTsKLy8gICAgICAgIEVEZWxheSgxMDApOwovLyAgICAgICAgY291bnQrKzsKLy8gICAgfSB3aGlsZSAoY291bnQ8PXRpbWUpOwovLwovLyAgICByZXR1cm4oRVJST1IpOwovL30KLy8KLy8vLy0tLS0tIF9DaGVja19EX1NzZmRjU3RhdHVzKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgX0NoZWNrX0RfU3NmZGNTdGF0dXModm9pZCkKLy97Ci8vICAgIGlmIChfSHdfRF9JbkRhdGEoKSAmIFdSX0ZBSUwpCi8vICAgICAgICByZXR1cm4oRVJST1IpOwovLwovLyAgICByZXR1cm4oU1VDQ0VTUyk7Ci8vfQovLwovLy8vIEZvciA3MTIKLy8vLy0tLS0tIF9SZXNldF9EX1NzZmRjRXJyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9SZXNldF9EX1NzZmRjRXJyKHZvaWQpCi8vewovLyAgICBXT1JEICBjb3VudCA9IDA7Ci8vCi8vICAgIF9Id19EX1NldFJkQ21kKCk7Ci8vICAgIF9Id19EX091dERhdGEoUlNUX0NISVApOwovLyAgICBfSHdfRF9TZXRSZERhdGEoKTsKLy8KLy8gICAgZG8gewovLyAgICAgICAgaWYgKCFfSHdfRF9DaGtCdXN5KCkpCi8vICAgICAgICAgICAgYnJlYWs7Ci8vICAgICAgICBFRGVsYXkoMTAwKTsKLy8gICAgICAgIGNvdW50Kys7Ci8vICAgIH0gd2hpbGUgKGNvdW50PD1CVVNZX1JFU0VUKTsKLy8KLy8gICAgX0h3X0RfU2V0UmRTdGFuZGJ5KCk7Ci8vfQovLwovLy8vTkFORCBNZW1vcnkgKFNtYXJ0TWVkaWEpIEJ1ZmZlciBEYXRhIFhmZXIgU3Vicm91dGluZQovLy8vLS0tLS0gU01fUmVhZERhdGFXaXRoRE1BKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIFNNX1JlYWREYXRhV2l0aERNQShQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LCBCWVRFICpkYXRhYnVmLCBXT1JEIFNlY3RCeXRlQ291bnQpCi8vewovLyAgICBQSFlTSUNBTF9BRERSRVNTICAgICAgICBBZGRyOwovLyAgICBMQVJHRV9JTlRFR0VSICAgICAgICAgICBwdGltZW91dCA7Ci8vCi8vICAgIEtlQ2xlYXJFdmVudCgmZmRvRXh0LT5TTV9ETUFEb25lRXZlbnQpOwovLwovLyAgICBBZGRyID0gTW1HZXRQaHlzaWNhbEFkZHJlc3MoZGF0YWJ1Zik7Ci8vCi8vICAgIFdSSVRFX1BPUlRfRFdPUkQoU01fRE1BX0FERFJfUkVHLCAoRFdPUkQpQWRkci5Mb3dQYXJ0KTsKLy8gICAgV1JJVEVfUE9SVF9CWVRFKFNNX0RNQV9EQVRBX0NUUkwsIDApOwovLyAgICBXUklURV9QT1JUX1dPUkQoU01fRE1BX0JZVEVfQ09VTlRfUkVHLCBTZWN0Qnl0ZUNvdW50KTsKLy8KLy8gICAgd2hpbGUgKCBfSHdfRF9DaGtDYXJkSW4oKSApCi8vICAgIHsKLy8gICAgICAgIGlmICgoUkVBRF9QT1JUX0JZVEUoU01fUkVHX0ZJRk9fU1RBVFVTKSAmIDB4ODApKQovLyAgICAgICAgICAgYnJlYWs7Ci8vICAgIH0KLy8gICAgaWYgKCFfSHdfRF9DaGtDYXJkSW4oKSkgICAgICByZXR1cm47Ci8vICAgIFdSSVRFX1BPUlRfQllURShTTV9ETUFfREFUQV9DVFJMLCAweDAxKTsKLy8KLy8gICAgcHRpbWVvdXQuUXVhZFBhcnQgPSAyMDAwICogKC0xMDAwMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMiBzZWMKLy8gICAgS2VXYWl0Rm9yU2luZ2xlT2JqZWN0KCZmZG9FeHQtPlNNX0RNQURvbmVFdmVudCwgRXhlY3V0aXZlLCBLZXJuZWxNb2RlLCBGQUxTRSwgJnB0aW1lb3V0KTsKLy8gICAgX0h3X0RfU2V0RE1BSW50TWFzaygpOwovL30KLy8KLy8vLy0tLS0tIFNNX1dyaXRlRGF0YVdpdGhETUEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgU01fV3JpdGVEYXRhV2l0aERNQShQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LCBCWVRFICpkYXRhYnVmLCBXT1JEIFNlY3RCeXRlQ291bnQpCi8vewovLyAgICBQSFlTSUNBTF9BRERSRVNTICAgICAgICBBZGRyOwovLyAgICBMQVJHRV9JTlRFR0VSICAgICAgICAgICBwdGltZW91dCA7Ci8vCi8vICAgIEtlQ2xlYXJFdmVudCgmZmRvRXh0LT5TTV9ETUFEb25lRXZlbnQpOwovLwovLyAgICBBZGRyID0gTW1HZXRQaHlzaWNhbEFkZHJlc3MoZGF0YWJ1Zik7Ci8vCi8vICAgIFdSSVRFX1BPUlRfRFdPUkQoU01fRE1BX0FERFJfUkVHLCAoRFdPUkQpQWRkci5Mb3dQYXJ0KTsKLy8gICAgV1JJVEVfUE9SVF9CWVRFKFNNX0RNQV9EQVRBX0NUUkwsIDIpOwovLyAgICBXUklURV9QT1JUX1dPUkQoU01fRE1BX0JZVEVfQ09VTlRfUkVHLCBTZWN0Qnl0ZUNvdW50KTsKLy8KLy8gICAgd2hpbGUgKCBfSHdfRF9DaGtDYXJkSW4oKSApCi8vICAgIHsKLy8gICAgICAgaWYgKChSRUFEX1BPUlRfQllURShTTV9SRUdfRklGT19TVEFUVVMpICYgMHg0MCkpCi8vICAgICAgICAgICBicmVhazsKLy8gICAgfQovLyAgICBpZiAoIV9Id19EX0Noa0NhcmRJbigpKSAgICAgIHJldHVybjsKLy8gICAgV1JJVEVfUE9SVF9CWVRFKFNNX0RNQV9EQVRBX0NUUkwsIDB4MDMpOwovLwovLyAgICBwdGltZW91dC5RdWFkUGFydCA9IDIwMDAgKiAoLTEwMDAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyIHNlYwovLyAgICBLZVdhaXRGb3JTaW5nbGVPYmplY3QoJmZkb0V4dC0+U01fRE1BRG9uZUV2ZW50LCBFeGVjdXRpdmUsIEtlcm5lbE1vZGUsIEZBTFNFLCAmcHRpbWVvdXQpOwovLyAgICBfSHdfRF9TZXRETUFJbnRNYXNrKCk7Ci8vfQovLwovLy8vLS0tLS0gX1JlYWRfRF9Tc2ZkY0J1ZigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBfUmVhZF9EX1NzZmRjQnVmKEJZVEUgKmRhdGFidWYpCi8vewovLyAgICBpbnQgaTsKLy8KLy8gICAgLy9mb3IoaT0weDAwMDA7aTwoKChTc2ZkYy5BdHRyaWJ1dGUgJk1QUyk9PVBTMjU2KT8weDAxMDA6MHgwMjAwKTtpKyspCi8vICAgIGZvcihpPTA7IGk8MHgyMDA7IGkrKykKLy8gICAgICAgICpkYXRhYnVmKysgPV9Id19EX0luRGF0YSgpOwovL30KLy8KLy8vLy0tLS0tIF9Xcml0ZV9EX1NzZmRjQnVmKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9Xcml0ZV9EX1NzZmRjQnVmKEJZVEUgKmRhdGFidWYpCi8vewovLyAgICBpbnQgaTsKLy8KLy8gICAgLy9mb3IoaT0weDAwMDA7aTwoKChTc2ZkYy5BdHRyaWJ1dGUgJk1QUyk9PVBTMjU2KT8weDAxMDA6MHgwMjAwKTtpKyspCi8vICAgIGZvcihpPTA7IGk8MHgyMDA7IGkrKykKLy8gICAgICAgIF9Id19EX091dERhdGEoKmRhdGFidWYrKyk7Ci8vfQovLwovLy8vLS0tLS0gX1JlYWRfRF9Tc2ZkY0J5dGUoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgX1JlYWRfRF9Tc2ZkY0J5dGUoQllURSAqZGF0YWJ1ZikKLy97Ci8vICAgICpkYXRhYnVmPShCWVRFKV9Id19EX0luRGF0YSgpOwovL30KLy8KLy8vLy0tLS0tIF9SZWFkUmVkdF9EX1NzZmRjQnVmKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9SZWFkUmVkdF9EX1NzZmRjQnVmKEJZVEUgKnJlZHVuZGFudCkKLy97Ci8vICAgIGNoYXIgaTsKLy8KLy8gICAgLy9mb3IoaT0weDAwO2k8KCgoU3NmZGMuQXR0cmlidXRlICZNUFMpPT1QUzI1Nik/MHgwODoweDEwKTtpKyspCi8vICAgIGZvcihpPTA7IGk8MHgxMDsgaSsrKQovLyAgICAgICAgcmVkdW5kYW50W2ldID1fSHdfRF9JbkRhdGEoKTsKLy99Ci8vCi8vLy8tLS0tLSBfV3JpdGVSZWR0X0RfU3NmZGNCdWYoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgX1dyaXRlUmVkdF9EX1NzZmRjQnVmKEJZVEUgKnJlZHVuZGFudCkKLy97Ci8vICAgIGNoYXIgaTsKLy8KLy8gICAgLy9mb3IoaT0weDAwO2k8KCgoU3NmZGMuQXR0cmlidXRlICZNUFMpPT1QUzI1Nik/MHgwODoweDEwKTtpKyspCi8vICAgIGZvcihpPTA7IGk8MHgxMDsgaSsrKQovLyAgICAgICAgX0h3X0RfT3V0RGF0YSgqcmVkdW5kYW50KyspOwovL30KKi8KLy9TbWFydE1lZGlhIElEIENvZGUgQ2hlY2sgJiBNb2RlIFNldCBTdWJyb3V0aW5lCi8vLS0tLS0gU2V0X0RfU3NmZGNNb2RlbCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgU2V0X0RfU3NmZGNNb2RlbChCWVRFIGRjb2RlKQp7CiAgICBzd2l0Y2ggKF9DaGVja19EX0RldkNvZGUoZGNvZGUpKSB7CiAgICAgICAgY2FzZSBTU0ZEQzFNQjoKICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREMxTUI7CiAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQzQ1lDIHwgQlMxNiB8IFBTMjU2OwogICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSAxOwogICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSAyNTY7CiAgICAgICAgICAgIFNzZmRjLk1heExvZ0Jsb2NrcyA9IDI1MDsKICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gODsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTU0ZEQzJNQjoKICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREMyTUI7CiAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQzQ1lDIHwgQlMxNiB8IFBTMjU2OwogICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSAxOwogICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSA1MTI7CiAgICAgICAgICAgIFNzZmRjLk1heExvZ0Jsb2NrcyA9IDUwMDsKICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gODsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTU0ZEQzRNQjoKICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREM0TUI7CiAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQzQ1lDIHwgQlMxNiB8IFBTNTEyOwogICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSAxOwogICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSA1MTI7CiAgICAgICAgICAgIFNzZmRjLk1heExvZ0Jsb2NrcyA9IDUwMDsKICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gMTY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU1NGREM4TUI6CiAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDOE1COwogICAgICAgICAgICBTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFEM0NZQyB8IEJTMTYgfCBQUzUxMjsKICAgICAgICAgICAgU3NmZGMuTWF4Wm9uZXMgICAgID0gMTsKICAgICAgICAgICAgU3NmZGMuTWF4QmxvY2tzICAgID0gMTAyNDsKICAgICAgICAgICAgU3NmZGMuTWF4TG9nQmxvY2tzID0gMTAwMDsKICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gMTY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU1NGREMxNk1COgogICAgICAgICAgICBTc2ZkYy5Nb2RlbCAgICAgICAgPSBTU0ZEQzE2TUI7CiAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQzQ1lDIHwgQlMzMiB8IFBTNTEyOwogICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSAxOwogICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSAxMDI0OwogICAgICAgICAgICBTc2ZkYy5NYXhMb2dCbG9ja3MgPSAxMDAwOwogICAgICAgICAgICBTc2ZkYy5NYXhTZWN0b3JzICAgPSAzMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTU0ZEQzMyTUI6CiAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDMzJNQjsKICAgICAgICAgICAgU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDNDWUMgfCBCUzMyIHwgUFM1MTI7CiAgICAgICAgICAgIFNzZmRjLk1heFpvbmVzICAgICA9IDI7CiAgICAgICAgICAgIFNzZmRjLk1heEJsb2NrcyAgICA9IDEwMjQ7CiAgICAgICAgICAgIFNzZmRjLk1heExvZ0Jsb2NrcyA9IDEwMDA7CiAgICAgICAgICAgIFNzZmRjLk1heFNlY3RvcnMgICA9IDMyOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFNTRkRDNjRNQjoKICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREM2NE1COwogICAgICAgICAgICBTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFENENZQyB8IEJTMzIgfCBQUzUxMjsKICAgICAgICAgICAgU3NmZGMuTWF4Wm9uZXMgICAgID0gNDsKICAgICAgICAgICAgU3NmZGMuTWF4QmxvY2tzICAgID0gMTAyNDsKICAgICAgICAgICAgU3NmZGMuTWF4TG9nQmxvY2tzID0gMTAwMDsKICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gMzI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU1NGREMxMjhNQjoKICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREMxMjhNQjsKICAgICAgICAgICAgU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDRDWUMgfCBCUzMyIHwgUFM1MTI7CiAgICAgICAgICAgIFNzZmRjLk1heFpvbmVzICAgICA9IDg7CiAgICAgICAgICAgIFNzZmRjLk1heEJsb2NrcyAgICA9IDEwMjQ7CiAgICAgICAgICAgIFNzZmRjLk1heExvZ0Jsb2NrcyA9IDEwMDA7CiAgICAgICAgICAgIFNzZmRjLk1heFNlY3RvcnMgICA9IDMyOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFNTRkRDMjU2TUI6CiAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDMjU2TUI7CiAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQ0Q1lDIHwgQlMzMiB8IFBTNTEyOwogICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSAxNjsKICAgICAgICAgICAgU3NmZGMuTWF4QmxvY2tzICAgID0gMTAyNDsKICAgICAgICAgICAgU3NmZGMuTWF4TG9nQmxvY2tzID0gMTAwMDsKICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gMzI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU1NGREM1MTJNQjoKICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREM1MTJNQjsKICAgICAgICAgICAgU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDRDWUMgfCBCUzMyIHwgUFM1MTI7CiAgICAgICAgICAgIFNzZmRjLk1heFpvbmVzICAgICA9IDMyOwogICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSAxMDI0OwogICAgICAgICAgICBTc2ZkYy5NYXhMb2dCbG9ja3MgPSAxMDAwOwogICAgICAgICAgICBTc2ZkYy5NYXhTZWN0b3JzICAgPSAzMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTU0ZEQzFHQjoKICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREMxR0I7CiAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQ0Q1lDIHwgQlMzMiB8IFBTNTEyOwogICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSA2NDsKICAgICAgICAgICAgU3NmZGMuTWF4QmxvY2tzICAgID0gMTAyNDsKICAgICAgICAgICAgU3NmZGMuTWF4TG9nQmxvY2tzID0gMTAwMDsKICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gMzI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU1NGREMyR0I6CiAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDMkdCOwogICAgICAgICAgICBTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFENENZQyB8IEJTMzIgfCBQUzUxMjsKICAgICAgICAgICAgU3NmZGMuTWF4Wm9uZXMgICAgID0gMTI4OwogICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSAxMDI0OwogICAgICAgICAgICBTc2ZkYy5NYXhMb2dCbG9ja3MgPSAxMDAwOwogICAgICAgICAgICBTc2ZkYy5NYXhTZWN0b3JzICAgPSAzMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgU3NmZGMuTW9kZWwgPSBOT1NTRkRDOwogICAgICAgICAgICByZXR1cm4oRVJST1IpOwogICAgfQoKICAgIHJldHVybihTVUNDRVNTKTsKfQoKLy8tLS0tLSBfQ2hlY2tfRF9EZXZDb2RlKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkJZVEUgX0NoZWNrX0RfRGV2Q29kZShCWVRFIGRjb2RlKQp7CiAgICBzd2l0Y2goZGNvZGUpewogICAgICAgIGNhc2UgMHg2RToKICAgICAgICBjYXNlIDB4RTg6CiAgICAgICAgY2FzZSAweEVDOiByZXR1cm4oU1NGREMxTUIpOyAgIC8vIDhNYml0ICgxTSkgTkFORAogICAgICAgIGNhc2UgMHg2NDoKICAgICAgICBjYXNlIDB4RUE6IHJldHVybihTU0ZEQzJNQik7ICAgLy8gMTZNYml0ICgyTSkgTkFORAogICAgICAgIGNhc2UgMHg2QjoKICAgICAgICBjYXNlIDB4RTM6CiAgICAgICAgY2FzZSAweEU1OiByZXR1cm4oU1NGREM0TUIpOyAgIC8vIDMyTWJpdCAoNE0pIE5BTkQKICAgICAgICBjYXNlIDB4RTY6IHJldHVybihTU0ZEQzhNQik7ICAgLy8gNjRNYml0ICg4TSkgTkFORAogICAgICAgIGNhc2UgMHg3MzogcmV0dXJuKFNTRkRDMTZNQik7ICAvLyAxMjhNYml0ICgxNk0pTkFORAogICAgICAgIGNhc2UgMHg3NTogcmV0dXJuKFNTRkRDMzJNQik7ICAvLyAyNTZNYml0ICgzMk0pTkFORAogICAgICAgIGNhc2UgMHg3NjogcmV0dXJuKFNTRkRDNjRNQik7ICAvLyA1MTJNYml0ICg2NE0pTkFORAogICAgICAgIGNhc2UgMHg3OTogcmV0dXJuKFNTRkRDMTI4TUIpOyAvLyAxR2JpdCgxMjhNKU5BTkQKICAgICAgICBjYXNlIDB4NzE6IHJldHVybihTU0ZEQzI1Nk1CKTsKICAgICAgICBjYXNlIDB4REM6IHJldHVybihTU0ZEQzUxMk1CKTsKICAgICAgICBjYXNlIDB4RDM6IHJldHVybihTU0ZEQzFHQik7CiAgICAgICAgY2FzZSAweEQ1OiByZXR1cm4oU1NGREMyR0IpOwogICAgICAgIGRlZmF1bHQ6IHJldHVybihOT1NTRkRDKTsKICAgIH0KfQovKgovLy8vU21hcnRNZWRpYSBQb3dlciBDb250cm9sbCBTdWJyb3V0aW5lCi8vLy8tLS0tLSBDbnRfRF9SZXNldCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIENudF9EX1Jlc2V0KHZvaWQpCi8vewovLyAgICBfSHdfRF9MZWRPZmYoKTsKLy8gICAgX0h3X0RfU2V0UmRTdGFuZGJ5KCk7Ci8vICAgIF9Id19EX1ZjY09mZigpOwovL30KLy8KLy8vLy0tLS0tIENudF9EX1Bvd2VyT24oKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IENudF9EX1Bvd2VyT24odm9pZCkKLy97Ci8vICAgIC8vIE5vIHN1cHBvcnQgNVYuCi8vICAgIF9Id19EX0VuYWJsZVZjYzNWT24oKTsgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IFNNX1JFR19DVFJMXzUgUmVnLiB0byAzVgovLyAgICBfSHdfRF9WY2NPbigpOwovLyAgICBfSHdfRF9TZXRSZFN0YW5kYnkoKTsKLy8gICAgX1dhaXRfRF9UaW1lcihUSU1FX1BPTik7Ci8vCi8vICAgIGlmIChfSHdfRF9DaGtQb3dlcigpKQovLyAgICB7Ci8vICAgICAgICBfSHdfRF9FbmFibGVPQigpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IFNNX1JFR19DVFJMXzUgUmVnLiB0byAweDgzCi8vICAgICAgICByZXR1cm4oU1VDQ0VTUyk7Ci8vICAgIH0KLy8KLy8gICAgX0h3X0RfU2V0VmNjT2ZmKCk7Ci8vICAgIHJldHVybihFUlJPUik7Ci8vfQovLwovLy8vLS0tLS0gQ250X0RfUG93ZXJPZmYoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBDbnRfRF9Qb3dlck9mZih2b2lkKQovL3sKLy8gICAgX0h3X0RfU2V0UmRTdGFuZGJ5KCk7Ci8vICAgIF9Id19EX1NldFZjY09mZigpOwovLyAgICBfSHdfRF9WY2NPZmYoKTsKLy99Ci8vCi8vLy8tLS0tLSBDbnRfRF9MZWRPbigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIENudF9EX0xlZE9uKHZvaWQpCi8vewovLyAgICBfSHdfRF9MZWRPbigpOwovL30KLy8KLy8vLy0tLS0tIENudF9EX0xlZE9mZigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIENudF9EX0xlZE9mZih2b2lkKQovL3sKLy8gICAgX0h3X0RfTGVkT2ZmKCk7Ci8vfQovLwovLy8vLS0tLS0gQ2hlY2tfRF9DbnRQb3dlcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgQ2hlY2tfRF9DbnRQb3dlcih2b2lkKQovL3sKLy8gICAgaWYgKF9Id19EX0Noa1Bvd2VyKCkpCi8vICAgICAgICByZXR1cm4oU1VDQ0VTUyk7IC8vIFBvd2VyIE9uCi8vCi8vICAgIHJldHVybihFUlJPUik7ICAgICAgIC8vIFBvd2VyIE9mZgovL30KLy8KLy8vLy0tLS0tIENoZWNrX0RfQ2FyZEV4aXN0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBDaGVja19EX0NhcmRFeGlzdCh2b2lkKQovL3sKLy8gICAgY2hhciBpLGosazsKLy8KLy8gICAgaWYgKCFfSHdfRF9DaGtTdGF0dXMoKSkgLy8gTm90IFN0YXR1cyBDaGFuZ2UKLy8gICAgICAgIGlmIChfSHdfRF9DaGtDYXJkSW4oKSkKLy8gICAgICAgICAgICByZXR1cm4oU1VDQ0VTUyk7IC8vIENhcmQgZXhpc3QgaW4gU2xvdAovLwovLyAgICBmb3IoaT0wLGo9MCxrPTA7IGk8MTY7IGkrKykgewovLyAgICAgICAgaWYgKF9Id19EX0Noa0NhcmRJbigpKSAvLyBTdGF0dXMgQ2hhbmdlCi8vICAgICAgICB7Ci8vICAgICAgICAgICAgaisrOyBrPTA7Ci8vICAgICAgICB9Ci8vICAgICAgICBlbHNlCi8vICAgICAgICB7Ci8vICAgICAgICAgICAgaj0wOyBrKys7Ci8vICAgICAgICB9Ci8vCi8vICAgICAgICBpZiAoaj4zKQovLyAgICAgICAgICAgIHJldHVybihTVUNDRVNTKTsgLy8gQ2FyZCBleGlzdCBpbiBTbG90Ci8vICAgICAgICBpZiAoaz4zKQovLyAgICAgICAgICAgIHJldHVybihFUlJPUik7IC8vIE5PIENhcmQgZXhpc3QgaW4gU2xvdAovLwovLyAgICAgICAgX1dhaXRfRF9UaW1lcihUSU1FX0NEQ0hLKTsKLy8gICAgfQovLwovLyAgICByZXR1cm4oRVJST1IpOwovL30KLy8KLy8vLy0tLS0tIENoZWNrX0RfQ2FyZFN0c0NoZygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgQ2hlY2tfRF9DYXJkU3RzQ2hnKHZvaWQpCi8vewovLyAgICBpZiAoX0h3X0RfQ2hrU3RhdHVzKCkpCi8vICAgICAgICByZXR1cm4oRVJST1IpOyAvLyBTdGF0dXMgQ2hhbmdlCi8vCi8vICAgIHJldHVybihTVUNDRVNTKTsgICAvLyBOb3QgU3RhdHVzIENoYW5nZQovL30KLy8KLy8vLy0tLS0tIENoZWNrX0RfU3NmZGNXUCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgQ2hlY2tfRF9Tc2ZkY1dQKHZvaWQpCi8veyAvLyBFUlJPUjogV1AsIFNVQ0NFU1M6IE5vdCBXUAovLyAgICBjaGFyIGk7Ci8vCi8vICAgIGZvcihpPTA7IGk8ODsgaSsrKSB7Ci8vICAgICAgICBpZiAoX0h3X0RfQ2hrV1AoKSkKLy8gICAgICAgICAgICByZXR1cm4oRVJST1IpOwovLyAgICAgICAgX1dhaXRfRF9UaW1lcihUSU1FX1dQQ0hLKTsKLy8gICAgfQovLwovLyAgICByZXR1cm4oU1VDQ0VTUyk7Ci8vfQovLwoqLwovL1NtYXJ0TWVkaWEgRUNDIENvbnRyb2xsIFN1YnJvdXRpbmUKLy8tLS0tLSBDaGVja19EX1JlYWRFcnJvcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IENoZWNrX0RfUmVhZEVycm9yKEJZVEUgKnJlZHVuZGFudCkKewogICAgLy8gRHJpdmVyIKSjsLUgRUNDIENoZWNrCiAgICByZXR1cm4oU1VDQ0VTUyk7CiAgICBpZiAoIVN0cmluZ0NtcCgoY2hhciAqKShyZWR1bmRhbnQrMHgwRCksKGNoYXIgKilFY2NCdWYsMykpCiAgICAgICAgaWYgKCFTdHJpbmdDbXAoKGNoYXIgKikocmVkdW5kYW50KzB4MDgpLChjaGFyICopKEVjY0J1ZisweDAzKSwzKSkKICAgICAgICAgICAgcmV0dXJuKFNVQ0NFU1MpOwoKICAgIHJldHVybihFUlJPUik7Cn0KCi8vLS0tLS0gQ2hlY2tfRF9Db3JyZWN0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgQ2hlY2tfRF9Db3JyZWN0KEJZVEUgKmJ1ZixCWVRFICpyZWR1bmRhbnQpCnsKICAgIC8vIERyaXZlciCko7C1IEVDQyBDaGVjawogICAgcmV0dXJuKFNVQ0NFU1MpOwogICAgaWYgKFN0cmluZ0NtcCgoY2hhciAqKShyZWR1bmRhbnQrMHgwRCksKGNoYXIgKilFY2NCdWYsMykpCiAgICAgICAgaWYgKF9Db3JyZWN0X0RfU3dFQ0MoYnVmLHJlZHVuZGFudCsweDBELEVjY0J1ZikpCiAgICAgICAgICAgIHJldHVybihFUlJPUik7CgogICAgYnVmKz0weDEwMDsKICAgIGlmIChTdHJpbmdDbXAoKGNoYXIgKikocmVkdW5kYW50KzB4MDgpLChjaGFyICopKEVjY0J1ZisweDAzKSwzKSkKICAgICAgICBpZiAoX0NvcnJlY3RfRF9Td0VDQyhidWYscmVkdW5kYW50KzB4MDgsRWNjQnVmKzB4MDMpKQogICAgICAgICAgICByZXR1cm4oRVJST1IpOwoKICAgIHJldHVybihTVUNDRVNTKTsKfQoKLy8tLS0tLSBDaGVja19EX0NJU2RhdGEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBDaGVja19EX0NJU2RhdGEoQllURSAqYnVmLCBCWVRFICpyZWR1bmRhbnQpCnsKICAgIEJZVEUgY2lzW109ezB4MDEsMHgwMywweEQ5LDB4MDEsMHhGRiwweDE4LDB4MDIsMHhERiwweDAxLDB4MjB9OwoKICAgIGlmICghSXNTU0ZEQ0NvbXBsaWFuY2UgJiYgIUlzWERDb21wbGlhbmNlKQogICAgICAgIHJldHVybihTVUNDRVNTKTsgICAgICAgICAgICAgLy8gpdirZaywsWqo7iBTVUNDRVNTIFtBcm5vbGQgMDItMDgtMjNdIFNTRkRDILT6uNUsIKSjr+CxaqjuIFNVQ0NFU1MKCiAgICBpZiAoIVN0cmluZ0NtcCgoY2hhciAqKShyZWR1bmRhbnQrMHgwRCksKGNoYXIgKilFY2NCdWYsMykpCiAgICAgICAgcmV0dXJuKFN0cmluZ0NtcCgoY2hhciAqKWJ1ZiwoY2hhciAqKWNpcywxMCkpOwoKICAgIGlmICghX0NvcnJlY3RfRF9Td0VDQyhidWYscmVkdW5kYW50KzB4MEQsRWNjQnVmKSkKICAgICAgICByZXR1cm4oU3RyaW5nQ21wKChjaGFyICopYnVmLChjaGFyICopY2lzLDEwKSk7CgogICAgYnVmKz0weDEwMDsKICAgIGlmICghU3RyaW5nQ21wKChjaGFyICopKHJlZHVuZGFudCsweDA4KSwoY2hhciAqKShFY2NCdWYrMHgwMyksMykpCiAgICAgICAgcmV0dXJuKFN0cmluZ0NtcCgoY2hhciAqKWJ1ZiwoY2hhciAqKWNpcywxMCkpOwoKICAgIGlmICghX0NvcnJlY3RfRF9Td0VDQyhidWYscmVkdW5kYW50KzB4MDgsRWNjQnVmKzB4MDMpKQogICAgICAgIHJldHVybihTdHJpbmdDbXAoKGNoYXIgKilidWYsKGNoYXIgKiljaXMsMTApKTsKCiAgICByZXR1cm4oRVJST1IpOwp9CgovLy0tLS0tIFNldF9EX1JpZ2h0RUNDKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIFNldF9EX1JpZ2h0RUNDKEJZVEUgKnJlZHVuZGFudCkKewogICAgLy8gRHJpdmVyIKSjsLUgRUNDIENoZWNrCiAgICByZXR1cm47CiAgICAvL1N0cmluZ0NvcHkoKGNoYXIgKikocmVkdW5kYW50KzB4MEQpLChjaGFyICopRWNjQnVmLDMpOwogICAgLy9TdHJpbmdDb3B5KChjaGFyICopKHJlZHVuZGFudCsweDA4KSwoY2hhciAqKShFY2NCdWYrMHgwMyksMyk7Cn0KLyoKLy8vLy0tLS0tIF9DYWxjX0RfRUNDZGF0YSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9DYWxjX0RfRUNDZGF0YShCWVRFICpidWYpCi8vewovLyNpZmRlZiBIV19FQ0NfU1VQUE9SVEVECi8vI2Vsc2UKLy8gICAgX0NhbGN1bGF0ZV9EX1N3RUNDKGJ1ZixFY2NCdWYpOwovLyAgICBidWYrPTB4MDEwMDsKLy8gICAgX0NhbGN1bGF0ZV9EX1N3RUNDKGJ1ZixFY2NCdWYrMHgwMyk7Ci8vI2VuZGlmCi8vfQovLwovLy8vLS0tLS0gX1NldF9EX0VDQ2RhdGEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBfU2V0X0RfRUNDZGF0YShCWVRFIGFkZCxCWVRFICpyZWR1bmRhbnQpCi8vewovLyAgICAvL2lmIChhZGQ9PUVWRU4gJiYgKFNzZmRjLkF0dHJpYnV0ZSAmTVBTKT09UFMyNTYpCi8vICAgIC8vICAgIHJldHVybjsKLy8KLy8gICAgLy8gZm9yIDI1NmJ5dGUvcGFnZQovLyAgICBTdHJpbmdDb3B5KChjaGFyICopKHJlZHVuZGFudCsweDBEKSwoY2hhciAqKUVjY0J1ZiwzKTsKLy8gICAgU3RyaW5nQ29weSgoY2hhciAqKShyZWR1bmRhbnQrMHgwOCksKGNoYXIgKikoRWNjQnVmKzB4MDMpLDMpOwovL30KKi8KLy9Db21tb24gU3Vicm91dGluZQpjaGFyIEJpdF9EX0NvdW50KEJZVEUgY2RhdGEpCnsKICAgIFdPUkQgYml0Y291bnQ9MDsKCiAgICB3aGlsZShjZGF0YSkgewogICAgICAgIGJpdGNvdW50Kz0oV09SRCkoY2RhdGEgJjB4MDEpOwogICAgICAgIGNkYXRhIC89MjsKICAgIH0KCiAgICByZXR1cm4oKGNoYXIpYml0Y291bnQpOwp9CgovLy0tLS0tCmNoYXIgQml0X0RfQ291bnRXb3JkKFdPUkQgY2RhdGEpCnsKICAgIFdPUkQgYml0Y291bnQ9MDsKCiAgICB3aGlsZShjZGF0YSkgewogICAgICAgIGJpdGNvdW50Kz0oY2RhdGEgJjB4MDEpOwogICAgICAgIGNkYXRhIC89MjsKICAgIH0KCiAgICByZXR1cm4oKGNoYXIpYml0Y291bnQpOwp9Cgp2b2lkIFN0cmluZ0NvcHkoY2hhciAqc3RyaW5nQSwgY2hhciAqc3RyaW5nQiwgaW50IGNvdW50KQp7CiAgICBpbnQgaTsKCiAgICBmb3IoaT0wOyBpPGNvdW50OyBpKyspCiAgICAgICAgKnN0cmluZ0ErKyA9ICpzdHJpbmdCKys7Cn0KCi8vLS0tLS0KaW50IFN0cmluZ0NtcChjaGFyICpzdHJpbmdBLCBjaGFyICpzdHJpbmdCLCBpbnQgY291bnQpCnsKICAgIGludCBpOwoKICAgIGZvciAoaT0wO2k8Y291bnQ7aSsrKQogICAgICAgIGlmICgqc3RyaW5nQSsrICE9ICpzdHJpbmdCKyspCiAgICAgICAgICAgIHJldHVybihFUlJPUik7CgogICAgcmV0dXJuKFNVQ0NFU1MpOwp9Ci8qCi8vLS0tLS0gU01fUmVhZEJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBTTV9SZWFkQmxvY2soUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCwgQllURSAqYnVmLEJZVEUgKnJlZHVuZGFudCkKewogICAgUEJVTEtfQ0JXICAgICAgICAgICAgICAgcEJ1bGtDYncgPSBmZG9FeHQtPnBCdWxrQ2J3OwogICAgTlRTVEFUVVMgICAgICAgICAgICAgICAgbnRTdGF0dXM7CiAgICBXT1JEICAgICAgICAgICAgICAgICAgICBhZGRyOwoKICAgIEVORV9Mb2FkQmluQ29kZShmZG9FeHQsIFNNX1JXX1BBVFRFUk4pOwoKICAgIGFkZHIgPSAoV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcytNZWRpYS5QaHlCbG9jazsKICAgIGFkZHIgPSBhZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnMrTWVkaWEuU2VjdG9yOwoKICAgIC8vIFJlYWQgc2VjdCBkYXRhCiAgICBSdGxaZXJvTWVtb3J5KHBCdWxrQ2J3LCBzaXplb2Yoc3RydWN0IF9CVUxLX0NCVykpOwogICAgcEJ1bGtDYnctPmRDQldTaWduYXR1cmUgICAgICAgICAgPSBDQldfU0lHTlRVUkU7CiAgICBwQnVsa0Nidy0+YkNCV0x1biAgICAgICAgICAgICAgICA9IENCV19MVU47CiAgICBwQnVsa0Nidy0+ZENCV0RhdGFUcmFuc2Zlckxlbmd0aCA9IDB4MjAwOwogICAgcEJ1bGtDYnctPmJtQ0JXRmxhZ3MgICAgICAgICAgICAgPSAweDgwOwogICAgcEJ1bGtDYnctPkNCV0NiWzBdICAgICAgICAgICAgICAgPSAweEYxOwogICAgcEJ1bGtDYnctPkNCV0NiWzFdICAgICAgICAgICAgICAgPSAweDAyOwogICAgcEJ1bGtDYnctPkNCV0NiWzRdICAgICAgICAgICAgICAgPSAoQllURSlhZGRyOwogICAgcEJ1bGtDYnctPkNCV0NiWzNdICAgICAgICAgICAgICAgPSAoQllURSkoYWRkci8weDAxMDApOwogICAgcEJ1bGtDYnctPkNCV0NiWzJdICAgICAgICAgICAgICAgPSBNZWRpYS5ab25lLzI7CgogICAgbnRTdGF0dXMgPSBFTkVfU2VuZFNjc2lDbWQoZmRvRXh0LCBGRElSX1JFQUQsIGJ1Zik7CgogICAgaWYgKCFOVF9TVUNDRVNTKG50U3RhdHVzKSkKICAgICAgIHJldHVybihFUlJPUik7CgogICAgLy8gUmVhZCByZWR1bmRhbnQKICAgIFJ0bFplcm9NZW1vcnkocEJ1bGtDYncsIHNpemVvZihzdHJ1Y3QgX0JVTEtfQ0JXKSk7CiAgICBwQnVsa0Nidy0+ZENCV1NpZ25hdHVyZSAgICAgICAgICA9IENCV19TSUdOVFVSRTsKICAgIHBCdWxrQ2J3LT5iQ0JXTHVuICAgICAgICAgICAgICAgID0gQ0JXX0xVTjsKICAgIHBCdWxrQ2J3LT5kQ0JXRGF0YVRyYW5zZmVyTGVuZ3RoID0gMHgxMDsKICAgIHBCdWxrQ2J3LT5ibUNCV0ZsYWdzICAgICAgICAgICAgID0gMHg4MDsKICAgIHBCdWxrQ2J3LT5DQldDYlswXSAgICAgICAgICAgICAgID0gMHhGMTsKICAgIHBCdWxrQ2J3LT5DQldDYlsxXSAgICAgICAgICAgICAgID0gMHgwMzsKICAgIHBCdWxrQ2J3LT5DQldDYls0XSAgICAgICAgICAgICAgID0gKEJZVEUpYWRkcjsKICAgIHBCdWxrQ2J3LT5DQldDYlszXSAgICAgICAgICAgICAgID0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKICAgIHBCdWxrQ2J3LT5DQldDYlsyXSAgICAgICAgICAgICAgID0gTWVkaWEuWm9uZS8yOwogICAgcEJ1bGtDYnctPkNCV0NiWzVdICAgICAgICAgICAgICAgPSAwOwogICAgcEJ1bGtDYnctPkNCV0NiWzZdICAgICAgICAgICAgICAgPSAxOwoKICAgIG50U3RhdHVzID0gRU5FX1NlbmRTY3NpQ21kKGZkb0V4dCwgRkRJUl9SRUFELCByZWR1bmRhbnQpOwoKICAgIGlmICghTlRfU1VDQ0VTUyhudFN0YXR1cykpCiAgICAgICByZXR1cm4oRVJST1IpOwoKICAgIHJldHVybihTVUNDRVNTKTsKfSovCg==