ZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbWlsc3ViLmMgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbHN1Yi5jCmluZGV4IDRmY2I3ZDYuLmQ0ZGQ1ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbWlsc3ViLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL3NtaWxzdWIuYwpAQCAtNiwzMSArNiwzMSBAQAogI2luY2x1ZGUgInNtY29tbW9uLmgiCiAjaW5jbHVkZSAic21pbC5oIgogCi12b2lkICAgX1NldF9EX1NzZmRjUmRDbWQgICAgIChCWVRFKTsKLXZvaWQgICBfU2V0X0RfU3NmZGNSZEFkZHIgICAgKEJZVEUpOwotdm9pZCAgIF9TZXRfRF9Tc2ZkY1JkQ2hpcCAgICAodm9pZCk7Ci12b2lkICAgX1NldF9EX1NzZmRjUmRTdGFuZGJ5ICh2b2lkKTsKLXZvaWQgICBfU3RhcnRfRF9Tc2ZkY1JkSHdFQ0MgKHZvaWQpOwotdm9pZCAgIF9TdG9wX0RfU3NmZGNSZEh3RUNDICAodm9pZCk7Ci12b2lkICAgX0xvYWRfRF9Tc2ZkY1JkSHdFQ0MgIChCWVRFKTsKLXZvaWQgICBfU2V0X0RfU3NmZGNXckNtZCAgICAgKEJZVEUpOwotdm9pZCAgIF9TZXRfRF9Tc2ZkY1dyQWRkciAgICAoQllURSk7Ci12b2lkICAgX1NldF9EX1NzZmRjV3JCbG9jayAgICh2b2lkKTsKLXZvaWQgICBfU2V0X0RfU3NmZGNXclN0YW5kYnkgKHZvaWQpOwotdm9pZCAgIF9TdGFydF9EX1NzZmRjV3JId0VDQyAodm9pZCk7Ci12b2lkICAgX0xvYWRfRF9Tc2ZkY1dySHdFQ0MgIChCWVRFKTsKLWludCAgICBfQ2hlY2tfRF9Tc2ZkY0J1c3kgICAgKFdPUkQpOwotaW50ICAgIF9DaGVja19EX1NzZmRjU3RhdHVzICAodm9pZCk7Ci12b2lkICAgX1Jlc2V0X0RfU3NmZGNFcnIgICAgICh2b2lkKTsKLXZvaWQgICBfUmVhZF9EX1NzZmRjQnVmICAgICAgKEJZVEUgKik7Ci12b2lkICAgX1dyaXRlX0RfU3NmZGNCdWYgICAgIChCWVRFICopOwotdm9pZCAgIF9SZWFkX0RfU3NmZGNCeXRlICAgICAoQllURSAqKTsKLXZvaWQgICBfUmVhZFJlZHRfRF9Tc2ZkY0J1ZiAgKEJZVEUgKik7Ci12b2lkICAgX1dyaXRlUmVkdF9EX1NzZmRjQnVmIChCWVRFICopOwotQllURSAgIF9DaGVja19EX0RldkNvZGUgICAgICAoQllURSk7Cit2b2lkICAgX1NldF9EX1NzZmRjUmRDbWQoQllURSk7Cit2b2lkICAgX1NldF9EX1NzZmRjUmRBZGRyKEJZVEUpOwordm9pZCAgIF9TZXRfRF9Tc2ZkY1JkQ2hpcCh2b2lkKTsKK3ZvaWQgICBfU2V0X0RfU3NmZGNSZFN0YW5kYnkodm9pZCk7Cit2b2lkICAgX1N0YXJ0X0RfU3NmZGNSZEh3RUNDKHZvaWQpOwordm9pZCAgIF9TdG9wX0RfU3NmZGNSZEh3RUNDKHZvaWQpOwordm9pZCAgIF9Mb2FkX0RfU3NmZGNSZEh3RUNDKEJZVEUpOwordm9pZCAgIF9TZXRfRF9Tc2ZkY1dyQ21kKEJZVEUpOwordm9pZCAgIF9TZXRfRF9Tc2ZkY1dyQWRkcihCWVRFKTsKK3ZvaWQgICBfU2V0X0RfU3NmZGNXckJsb2NrKHZvaWQpOwordm9pZCAgIF9TZXRfRF9Tc2ZkY1dyU3RhbmRieSh2b2lkKTsKK3ZvaWQgICBfU3RhcnRfRF9Tc2ZkY1dySHdFQ0Modm9pZCk7Cit2b2lkICAgX0xvYWRfRF9Tc2ZkY1dySHdFQ0MoQllURSk7CitpbnQgICAgX0NoZWNrX0RfU3NmZGNCdXN5KFdPUkQpOworaW50ICAgIF9DaGVja19EX1NzZmRjU3RhdHVzKHZvaWQpOwordm9pZCAgIF9SZXNldF9EX1NzZmRjRXJyKHZvaWQpOwordm9pZCAgIF9SZWFkX0RfU3NmZGNCdWYoQllURSAqKTsKK3ZvaWQgICBfV3JpdGVfRF9Tc2ZkY0J1ZihCWVRFICopOwordm9pZCAgIF9SZWFkX0RfU3NmZGNCeXRlKEJZVEUgKik7Cit2b2lkICAgX1JlYWRSZWR0X0RfU3NmZGNCdWYoQllURSAqKTsKK3ZvaWQgICBfV3JpdGVSZWR0X0RfU3NmZGNCdWYoQllURSAqKTsKK0JZVEUgICBfQ2hlY2tfRF9EZXZDb2RlKEJZVEUpOwogCi12b2lkICAgX1NldF9EX0VDQ2RhdGEgICAgICAgIChCWVRFLEJZVEUgKik7Ci12b2lkICAgX0NhbGNfRF9FQ0NkYXRhICAgICAgIChCWVRFICopOwordm9pZCAgIF9TZXRfRF9FQ0NkYXRhKEJZVEUsIEJZVEUgKik7Cit2b2lkICAgX0NhbGNfRF9FQ0NkYXRhKEJZVEUgKik7CiAKIAogc3RydWN0IFNTRkRDVFlQRSAgICAgICAgICAgICAgICBTc2ZkYzsKQEAgLTQ2LDE3MyArNDYsMTc3IEBACiAKIAogCi0jZGVmaW5lIEVWRU4gICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgLy8gRXZlbiBQYWdlIGZvciAyNTZieXRlL3BhZ2UKLSNkZWZpbmUgT0REICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAvLyBPZGQgUGFnZSBmb3IgMjU2Ynl0ZS9wYWdlCisjZGVmaW5lIEVWRU4gICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgLyogRXZlbiBQYWdlIGZvciAyNTZieXRlL3BhZ2UgKi8KKyNkZWZpbmUgT0REICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAvKiBPZGQgUGFnZSBmb3IgMjU2Ynl0ZS9wYWdlICovCiAKIAotLy9TbWFydE1lZGlhIFJlZHVuZGFudCBidWZmZXIgZGF0YSBDb250cm9sIFN1YnJvdXRpbmUKLS8vLS0tLS0gQ2hlY2tfRF9EYXRhQmxhbmsoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogU21hcnRNZWRpYSBSZWR1bmRhbnQgYnVmZmVyIGRhdGEgQ29udHJvbCBTdWJyb3V0aW5lCisgKi0tLS0tIENoZWNrX0RfRGF0YUJsYW5rKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogaW50IENoZWNrX0RfRGF0YUJsYW5rKEJZVEUgKnJlZHVuZGFudCkKIHsKIAljaGFyIGk7CiAKLQlmb3IoaT0wOyBpPFJFRFRTSVpFOyBpKyspCi0JCWlmICgqcmVkdW5kYW50KyshPTB4RkYpCi0JCQlyZXR1cm4oRVJST1IpOworCWZvciAoaSA9IDA7IGkgPCBSRURUU0laRTsgaSsrKQorCQlpZiAoKnJlZHVuZGFudCsrICE9IDB4RkYpCisJCQlyZXR1cm4gIEVSUk9SOwogCi0JcmV0dXJuKFNNU1VDQ0VTUyk7CisJcmV0dXJuIFNNU1VDQ0VTUzsKIH0KIAotLy8tLS0tLSBDaGVja19EX0ZhaWxCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLSBDaGVja19EX0ZhaWxCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBpbnQgQ2hlY2tfRF9GYWlsQmxvY2soQllURSAqcmVkdW5kYW50KQogewotCXJlZHVuZGFudCs9UkVEVF9CTE9DSzsKKwlyZWR1bmRhbnQgKz0gUkVEVF9CTE9DSzsKIAotCWlmICgqcmVkdW5kYW50PT0weEZGKQotCQlyZXR1cm4oU01TVUNDRVNTKTsKKwlpZiAoKnJlZHVuZGFudCA9PSAweEZGKQorCQlyZXR1cm4gU01TVUNDRVNTOwogCWlmICghKnJlZHVuZGFudCkKLQkJcmV0dXJuKEVSUk9SKTsKLQlpZiAoaHdlaWdodDgoKnJlZHVuZGFudCk8NykKLQkJcmV0dXJuKEVSUk9SKTsKKwkJcmV0dXJuIEVSUk9SOworCWlmIChod2VpZ2h0OCgqcmVkdW5kYW50KSA8IDcpCisJCXJldHVybiBFUlJPUjsKIAotCXJldHVybihTTVNVQ0NFU1MpOworCXJldHVybiBTTVNVQ0NFU1M7CiB9CiAKLS8vLS0tLS0gQ2hlY2tfRF9EYXRhU3RhdHVzKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0gQ2hlY2tfRF9EYXRhU3RhdHVzKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogaW50IENoZWNrX0RfRGF0YVN0YXR1cyhCWVRFICpyZWR1bmRhbnQpCiB7Ci0JcmVkdW5kYW50Kz1SRURUX0RBVEE7CisJcmVkdW5kYW50ICs9IFJFRFRfREFUQTsKIAotCWlmICgqcmVkdW5kYW50PT0weEZGKQotCQlyZXR1cm4oU01TVUNDRVNTKTsKLQlpZiAoISpyZWR1bmRhbnQpCi0JeworCWlmICgqcmVkdW5kYW50ID09IDB4RkYpCisJCXJldHVybiBTTVNVQ0NFU1M7CisJaWYgKCEqcmVkdW5kYW50KSB7CiAJCUVyclhEQ29kZSA9IEVSUl9EYXRhU3RhdHVzOwotCQlyZXR1cm4oRVJST1IpOwotCX0KLQllbHNlCisJCXJldHVybiBFUlJPUjsKKwl9IGVsc2UKIAkJRXJyWERDb2RlID0gTk9fRVJST1I7CiAKLQlpZiAoaHdlaWdodDgoKnJlZHVuZGFudCk8NSkKLQkJcmV0dXJuKEVSUk9SKTsKKwlpZiAoaHdlaWdodDgoKnJlZHVuZGFudCkgPCA1KQorCQlyZXR1cm4gRVJST1I7CiAKLQlyZXR1cm4oU01TVUNDRVNTKTsKKwlyZXR1cm4gU01TVUNDRVNTOwogfQogCi0vLy0tLS0tIExvYWRfRF9Mb2dCbG9ja0FkZHIoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tIExvYWRfRF9Mb2dCbG9ja0FkZHIoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIGludCBMb2FkX0RfTG9nQmxvY2tBZGRyKEJZVEUgKnJlZHVuZGFudCkKIHsKLQlXT1JEIGFkZHIxLGFkZHIyOworCVdPUkQgYWRkcjEsIGFkZHIyOwogCi0JYWRkcjE9KFdPUkQpKihyZWR1bmRhbnQrUkVEVF9BRERSMUgpKjB4MDEwMCsoV09SRCkqKHJlZHVuZGFudCtSRURUX0FERFIxTCk7Ci0JYWRkcjI9KFdPUkQpKihyZWR1bmRhbnQrUkVEVF9BRERSMkgpKjB4MDEwMCsoV09SRCkqKHJlZHVuZGFudCtSRURUX0FERFIyTCk7CisJYWRkcjEgPSAoV09SRCkqKHJlZHVuZGFudCArIFJFRFRfQUREUjFIKSoweDAxMDAgKyAoV09SRCkqKHJlZHVuZGFudCArIFJFRFRfQUREUjFMKTsKKwlhZGRyMiA9IChXT1JEKSoocmVkdW5kYW50ICsgUkVEVF9BRERSMkgpKjB4MDEwMCArIChXT1JEKSoocmVkdW5kYW50ICsgUkVEVF9BRERSMkwpOwogCi0JaWYgKGFkZHIxPT1hZGRyMikKLQkJaWYgKChhZGRyMSAmMHhGMDAwKT09MHgxMDAwKQotCQl7IE1lZGlhLkxvZ0Jsb2NrPShhZGRyMSAmMHgwRkZGKS8yOyByZXR1cm4oU01TVUNDRVNTKTsgfQorCWlmIChhZGRyMSA9PSBhZGRyMikKKwkJaWYgKChhZGRyMSAmIDB4RjAwMCkgPT0gMHgxMDAwKSB7CisJCQlNZWRpYS5Mb2dCbG9jayA9IChhZGRyMSAmIDB4MEZGRikgLyAyOworCQkJcmV0dXJuIFNNU1VDQ0VTUzsKKwkJfQogCi0JaWYgKGh3ZWlnaHQxNigoV09SRCkoYWRkcjFeYWRkcjIpKSE9MHgwMSkgcmV0dXJuKEVSUk9SKTsKKwlpZiAoaHdlaWdodDE2KChXT1JEKShhZGRyMV5hZGRyMikpICE9IDB4MDEpCisJCXJldHVybiBFUlJPUjsKIAotCWlmICgoYWRkcjEgJjB4RjAwMCk9PTB4MTAwMCkKLQkJaWYgKCEoaHdlaWdodDE2KGFkZHIxKSAmMHgwMSkpCi0JCXsgTWVkaWEuTG9nQmxvY2s9KGFkZHIxICYweDBGRkYpLzI7IHJldHVybihTTVNVQ0NFU1MpOyB9CisJaWYgKChhZGRyMSAmIDB4RjAwMCkgPT0gMHgxMDAwKQorCQlpZiAoIShod2VpZ2h0MTYoYWRkcjEpICYgMHgwMSkpIHsKKwkJCU1lZGlhLkxvZ0Jsb2NrID0gKGFkZHIxICYgMHgwRkZGKSAvIDI7CisJCQlyZXR1cm4gU01TVUNDRVNTOworCQl9CiAKLQlpZiAoKGFkZHIyICYweEYwMDApPT0weDEwMDApCi0JCWlmICghKGh3ZWlnaHQxNihhZGRyMikgJjB4MDEpKQotCQl7IE1lZGlhLkxvZ0Jsb2NrPShhZGRyMiAmMHgwRkZGKS8yOyByZXR1cm4oU01TVUNDRVNTKTsgfQorCWlmICgoYWRkcjIgJiAweEYwMDApID09IDB4MTAwMCkKKwkJaWYgKCEoaHdlaWdodDE2KGFkZHIyKSAmIDB4MDEpKSB7CisJCQlNZWRpYS5Mb2dCbG9jayA9IChhZGRyMiAmIDB4MEZGRikgLyAyOworCQkJcmV0dXJuIFNNU1VDQ0VTUzsKKwkJfQogCi0JcmV0dXJuKEVSUk9SKTsKKwlyZXR1cm4gRVJST1I7CiB9CiAKLS8vLS0tLS0gQ2xyX0RfUmVkdW5kYW50RGF0YSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0gQ2xyX0RfUmVkdW5kYW50RGF0YSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogdm9pZCBDbHJfRF9SZWR1bmRhbnREYXRhKEJZVEUgKnJlZHVuZGFudCkKIHsKIAljaGFyIGk7CiAKLQlmb3IoaT0wOyBpPFJFRFRTSVpFOyBpKyspCi0JKihyZWR1bmRhbnQraSk9MHhGRjsKKwlmb3IgKGkgPSAwOyBpIDwgUkVEVFNJWkU7IGkrKykKKwkJKihyZWR1bmRhbnQgKyBpKSA9IDB4RkY7CiB9CiAKLS8vLS0tLS0gU2V0X0RfTG9nQmxvY2tBZGRyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0gU2V0X0RfTG9nQmxvY2tBZGRyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogdm9pZCBTZXRfRF9Mb2dCbG9ja0FkZHIoQllURSAqcmVkdW5kYW50KQogewogCVdPUkQgYWRkcjsKIAotCSoocmVkdW5kYW50K1JFRFRfQkxPQ0spPTB4RkY7Ci0JKihyZWR1bmRhbnQrUkVEVF9EQVRBKSA9MHhGRjsKLQlhZGRyPU1lZGlhLkxvZ0Jsb2NrKjIrMHgxMDAwOworCSoocmVkdW5kYW50ICsgUkVEVF9CTE9DSykgPSAweEZGOworCSoocmVkdW5kYW50ICsgUkVEVF9EQVRBKSA9IDB4RkY7CisJYWRkciA9IE1lZGlhLkxvZ0Jsb2NrKjIgKyAweDEwMDA7CiAKLQlpZiAoKGh3ZWlnaHQxNihhZGRyKSUyKSkKKwlpZiAoKGh3ZWlnaHQxNihhZGRyKSAlIDIpKQogCQlhZGRyKys7CiAKLQkqKHJlZHVuZGFudCtSRURUX0FERFIxSCk9KihyZWR1bmRhbnQrUkVEVF9BRERSMkgpPShCWVRFKShhZGRyLzB4MDEwMCk7Ci0JKihyZWR1bmRhbnQrUkVEVF9BRERSMUwpPSoocmVkdW5kYW50K1JFRFRfQUREUjJMKT0oQllURSlhZGRyOworCSoocmVkdW5kYW50ICsgUkVEVF9BRERSMUgpID0gKihyZWR1bmRhbnQgKyBSRURUX0FERFIySCkgPSAoQllURSkoYWRkciAvIDB4MDEwMCk7CisJKihyZWR1bmRhbnQgKyBSRURUX0FERFIxTCkgPSAqKHJlZHVuZGFudCArIFJFRFRfQUREUjJMKSA9IChCWVRFKWFkZHI7CiB9CiAKLS8vLS0tLS0gU2V0X0RfRmFpbEJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyotLS0tLSBTZXRfRF9GYWlsQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiB2b2lkIFNldF9EX0ZhaWxCbG9jayhCWVRFICpyZWR1bmRhbnQpCiB7Ci0gICAgY2hhciBpOwotCi0gICAgZm9yKGk9MDsgaTxSRURUU0laRTsgaSsrKQotICAgICAgICAqcmVkdW5kYW50Kys9KEJZVEUpKChpPT1SRURUX0JMT0NLKT8weEYwOjB4RkYpOworCWNoYXIgaTsKKwlmb3IgKGkgPSAwOyBpIDwgUkVEVFNJWkU7IGkrKykKKwkJKnJlZHVuZGFudCsrID0gKEJZVEUpKChpID09IFJFRFRfQkxPQ0spID8gMHhGMCA6IDB4RkYpOwogfQogCi0vLy0tLS0tIFNldF9EX0RhdGFTdGF1cygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tIFNldF9EX0RhdGFTdGF1cygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHZvaWQgU2V0X0RfRGF0YVN0YXVzKEJZVEUgKnJlZHVuZGFudCkKIHsKLSAgICByZWR1bmRhbnQrPVJFRFRfREFUQTsKLSAgICAqcmVkdW5kYW50PTB4MDA7CisJcmVkdW5kYW50ICs9IFJFRFRfREFUQTsKKwkqcmVkdW5kYW50ID0gMHgwMDsKIH0KIAotLy9TbWFydE1lZGlhIEZ1bmN0aW9uIENvbW1hbmQgU3Vicm91dGluZQotLy8gNjI1MCBDTUQgNgotLy8tLS0tLSBTc2ZkY19EX1Jlc2V0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiBTbWFydE1lZGlhIEZ1bmN0aW9uIENvbW1hbmQgU3Vicm91dGluZQorICogNjI1MCBDTUQgNgorICovCisvKiAtLS0tLSBTc2ZkY19EX1Jlc2V0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiB2b2lkIFNzZmRjX0RfUmVzZXQoc3RydWN0IHVzX2RhdGEgKnVzKQogewogCXJldHVybjsKIH0KIAotLy8tLS0tLSBTc2ZkY19EX1JlYWRDaXNTZWN0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbnQgU3NmZGNfRF9SZWFkQ2lzU2VjdChzdHJ1Y3QgdXNfZGF0YSAqdXMsIEJZVEUgKmJ1ZixCWVRFICpyZWR1bmRhbnQpCisvKiAtLS0tLSBTc2ZkY19EX1JlYWRDaXNTZWN0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitpbnQgU3NmZGNfRF9SZWFkQ2lzU2VjdChzdHJ1Y3QgdXNfZGF0YSAqdXMsIEJZVEUgKmJ1ZiwgQllURSAqcmVkdW5kYW50KQogewotCUJZVEUgem9uZSxzZWN0b3I7CisJQllURSB6b25lLCBzZWN0b3I7CiAJV09SRCBibG9jazsKIAotCXpvbmU9TWVkaWEuWm9uZTsgYmxvY2s9TWVkaWEuUGh5QmxvY2s7IHNlY3Rvcj1NZWRpYS5TZWN0b3I7Ci0JTWVkaWEuWm9uZT0wOwotCU1lZGlhLlBoeUJsb2NrPUNpc0FyZWEuUGh5QmxvY2s7Ci0JTWVkaWEuU2VjdG9yPUNpc0FyZWEuU2VjdG9yOworCXpvbmUgPSBNZWRpYS5ab25lOyBibG9jayA9IE1lZGlhLlBoeUJsb2NrOyBzZWN0b3IgPSBNZWRpYS5TZWN0b3I7CisJTWVkaWEuWm9uZSA9IDA7CisJTWVkaWEuUGh5QmxvY2sgPSBDaXNBcmVhLlBoeUJsb2NrOworCU1lZGlhLlNlY3RvciA9IENpc0FyZWEuU2VjdG9yOwogCi0JaWYgKFNzZmRjX0RfUmVhZFNlY3QodXMsYnVmLHJlZHVuZGFudCkpCi0JewotCQlNZWRpYS5ab25lPXpvbmU7IE1lZGlhLlBoeUJsb2NrPWJsb2NrOyBNZWRpYS5TZWN0b3I9c2VjdG9yOwotCQlyZXR1cm4oRVJST1IpOworCWlmIChTc2ZkY19EX1JlYWRTZWN0KHVzLCBidWYsIHJlZHVuZGFudCkpIHsKKwkJTWVkaWEuWm9uZSA9IHpvbmU7IE1lZGlhLlBoeUJsb2NrID0gYmxvY2s7IE1lZGlhLlNlY3RvciA9IHNlY3RvcjsKKwkJcmV0dXJuIEVSUk9SOwogCX0KIAotCU1lZGlhLlpvbmU9em9uZTsgTWVkaWEuUGh5QmxvY2s9YmxvY2s7IE1lZGlhLlNlY3Rvcj1zZWN0b3I7Ci0JcmV0dXJuKFNNU1VDQ0VTUyk7CisJTWVkaWEuWm9uZSA9IHpvbmU7IE1lZGlhLlBoeUJsb2NrID0gYmxvY2s7IE1lZGlhLlNlY3RvciA9IHNlY3RvcjsKKwlyZXR1cm4gU01TVUNDRVNTOwogfQogCi0vLyA2MjUwIENNRCAxCi0vLy0tLS0tIFNzZmRjX0RfUmVhZFNlY3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludCBTc2ZkY19EX1JlYWRTZWN0KHN0cnVjdCB1c19kYXRhICp1cywgQllURSAqYnVmLEJZVEUgKnJlZHVuZGFudCkKKy8qIDYyNTAgQ01EIDEgKi8KKy8qIC0tLS0tIFNzZmRjX0RfUmVhZFNlY3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2ludCBTc2ZkY19EX1JlYWRTZWN0KHN0cnVjdCB1c19kYXRhICp1cywgQllURSAqYnVmLCBCWVRFICpyZWR1bmRhbnQpCiB7CiAJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwogCWludAlyZXN1bHQ7CiAJV09SRAlhZGRyOwogCiAJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBTTV9SV19QQVRURVJOKTsKLQlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKLQl7CisJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpIHsKIAkJcHJpbnRrKCJMb2FkIFNNIFJXIENvZGUgRmFpbCAhIVxuIik7CiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJfQogCi0JYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK01lZGlhLlBoeUJsb2NrOwotCWFkZHIgPSBhZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnMrTWVkaWEuU2VjdG9yOworCWFkZHIgPSAoV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcyArIE1lZGlhLlBoeUJsb2NrOworCWFkZHIgPSBhZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnMgKyBNZWRpYS5TZWN0b3I7CiAKLQkvLyBSZWFkIHNlY3QgZGF0YQorCS8qIFJlYWQgc2VjdCBkYXRhICovCiAJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKIAliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CiAJYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGgJPSAweDIwMDsKQEAgLTIyMCwxNCArMjI0LDE0IEBACiAJYmNiLT5DREJbMF0JCQk9IDB4RjE7CiAJYmNiLT5DREJbMV0JCQk9IDB4MDI7CiAJYmNiLT5DREJbNF0JCQk9IChCWVRFKWFkZHI7Ci0JYmNiLT5DREJbM10JCQk9IChCWVRFKShhZGRyLzB4MDEwMCk7Ci0JYmNiLT5DREJbMl0JCQk9IE1lZGlhLlpvbmUvMjsKKwliY2ItPkNEQlszXQkJCT0gKEJZVEUpKGFkZHIgLyAweDAxMDApOworCWJjYi0+Q0RCWzJdCQkJPSBNZWRpYS5ab25lIC8gMjsKIAogCXJlc3VsdCA9IEVORV9TZW5kU2NzaUNtZCh1cywgRkRJUl9SRUFELCBidWYsIDApOwogCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCi0JLy8gUmVhZCByZWR1bmRhbnQKKwkvKiBSZWFkIHJlZHVuZGFudCAqLwogCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CiAJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwogCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoCT0gMHgxMDsKQEAgLTIzNSw4ICsyMzksOCBAQAogCWJjYi0+Q0RCWzBdCQkJPSAweEYxOwogCWJjYi0+Q0RCWzFdCQkJPSAweDAzOwogCWJjYi0+Q0RCWzRdCQkJPSAoQllURSlhZGRyOwotCWJjYi0+Q0RCWzNdCQkJPSAoQllURSkoYWRkci8weDAxMDApOwotCWJjYi0+Q0RCWzJdCQkJPSBNZWRpYS5ab25lLzI7CisJYmNiLT5DREJbM10JCQk9IChCWVRFKShhZGRyIC8gMHgwMTAwKTsKKwliY2ItPkNEQlsyXQkJCT0gTWVkaWEuWm9uZSAvIDI7CiAJYmNiLT5DREJbOF0JCQk9IDA7CiAJYmNiLT5DREJbOV0JCQk9IDE7CiAKQEAgLTI0NywyNCArMjUxLDIzIEBACiAJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwogfQogCi0vLy0tLS0tIFNzZmRjX0RfUmVhZEJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbnQgU3NmZGNfRF9SZWFkQmxvY2soc3RydWN0IHVzX2RhdGEgKnVzLCBXT1JEIGNvdW50LCBCWVRFICpidWYsQllURSAqcmVkdW5kYW50KQorLyogLS0tLS0gU3NmZGNfRF9SZWFkQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2ludCBTc2ZkY19EX1JlYWRCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgY291bnQsIEJZVEUgKmJ1ZiwgQllURSAqcmVkdW5kYW50KQogewogCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKIAlpbnQJcmVzdWx0OwogCVdPUkQJYWRkcjsKIAogCXJlc3VsdCA9IEVORV9Mb2FkQmluQ29kZSh1cywgU01fUldfUEFUVEVSTik7Ci0JaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCi0JeworCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKSB7CiAJCXByaW50aygiTG9hZCBTTSBSVyBDb2RlIEZhaWwgISFcbiIpOwogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCX0KIAotCWFkZHIgPSAoV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcytNZWRpYS5QaHlCbG9jazsKLQlhZGRyID0gYWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzK01lZGlhLlNlY3RvcjsKKwlhZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MgKyBNZWRpYS5QaHlCbG9jazsKKwlhZGRyID0gYWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzICsgTWVkaWEuU2VjdG9yOwogCi0JLy8gUmVhZCBzZWN0IGRhdGEKKwkvKiBSZWFkIHNlY3QgZGF0YSAqLwogCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CiAJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwogCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoCT0gMHgyMDAqY291bnQ7CkBAIC0yNzIsMTQgKzI3NSwxNCBAQAogCWJjYi0+Q0RCWzBdCQkJPSAweEYxOwogCWJjYi0+Q0RCWzFdCQkJPSAweDAyOwogCWJjYi0+Q0RCWzRdCQkJPSAoQllURSlhZGRyOwotCWJjYi0+Q0RCWzNdCQkJPSAoQllURSkoYWRkci8weDAxMDApOwotCWJjYi0+Q0RCWzJdCQkJPSBNZWRpYS5ab25lLzI7CisJYmNiLT5DREJbM10JCQk9IChCWVRFKShhZGRyIC8gMHgwMTAwKTsKKwliY2ItPkNEQlsyXQkJCT0gTWVkaWEuWm9uZSAvIDI7CiAKIAlyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfUkVBRCwgYnVmLCAwKTsKIAlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAotCS8vIFJlYWQgcmVkdW5kYW50CisJLyogUmVhZCByZWR1bmRhbnQgKi8KIAltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwogCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKIAliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aAk9IDB4MTA7CkBAIC0yODcsOCArMjkwLDggQEAKIAliY2ItPkNEQlswXQkJCT0gMHhGMTsKIAliY2ItPkNEQlsxXQkJCT0gMHgwMzsKIAliY2ItPkNEQls0XQkJCT0gKEJZVEUpYWRkcjsKLQliY2ItPkNEQlszXQkJCT0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKLQliY2ItPkNEQlsyXQkJCT0gTWVkaWEuWm9uZS8yOworCWJjYi0+Q0RCWzNdCQkJPSAoQllURSkoYWRkciAvIDB4MDEwMCk7CisJYmNiLT5DREJbMl0JCQk9IE1lZGlhLlpvbmUgLyAyOwogCWJjYi0+Q0RCWzhdCQkJPSAwOwogCWJjYi0+Q0RCWzldCQkJPSAxOwogCkBAIC0zMDAsMjYgKzMwMywyNSBAQAogfQogCiAKLS8vLS0tLS0gU3NmZGNfRF9Db3B5QmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50IFNzZmRjX0RfQ29weUJsb2NrKHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBjb3VudCwgQllURSAqYnVmLEJZVEUgKnJlZHVuZGFudCkKKy8qIC0tLS0tIFNzZmRjX0RfQ29weUJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2ludCBTc2ZkY19EX0NvcHlCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgY291bnQsIEJZVEUgKmJ1ZiwgQllURSAqcmVkdW5kYW50KQogewogCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKIAlpbnQJcmVzdWx0OwogCVdPUkQJUmVhZEFkZHIsIFdyaXRlQWRkcjsKIAogCXJlc3VsdCA9IEVORV9Mb2FkQmluQ29kZSh1cywgU01fUldfUEFUVEVSTik7Ci0JaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCi0JeworCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKSB7CiAJCXByaW50aygiTG9hZCBTTSBSVyBDb2RlIEZhaWwgISFcbiIpOwogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCX0KIAotCVJlYWRBZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrUmVhZEJsb2NrOworCVJlYWRBZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MgKyBSZWFkQmxvY2s7CiAJUmVhZEFkZHIgPSBSZWFkQWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzOwotCVdyaXRlQWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK1dyaXRlQmxvY2s7CisJV3JpdGVBZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MgKyBXcml0ZUJsb2NrOwogCVdyaXRlQWRkciA9IFdyaXRlQWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzOwogCi0JLy8gV3JpdGUgc2VjdCBkYXRhCisJLyogV3JpdGUgc2VjdCBkYXRhICovCiAJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKIAliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CiAJYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGgJPSAweDIwMCpjb3VudDsKQEAgLTMyNywxOSArMzI5LDE3IEBACiAJYmNiLT5DREJbMF0JCQk9IDB4RjA7CiAJYmNiLT5DREJbMV0JCQk9IDB4MDg7CiAJYmNiLT5DREJbN10JCQk9IChCWVRFKVdyaXRlQWRkcjsKLQliY2ItPkNEQls2XQkJCT0gKEJZVEUpKFdyaXRlQWRkci8weDAxMDApOwotCWJjYi0+Q0RCWzVdCQkJPSBNZWRpYS5ab25lLzI7Ci0JYmNiLT5DREJbOF0JCQk9ICoocmVkdW5kYW50K1JFRFRfQUREUjFIKTsKLQliY2ItPkNEQls5XQkJCT0gKihyZWR1bmRhbnQrUkVEVF9BRERSMUwpOworCWJjYi0+Q0RCWzZdCQkJPSAoQllURSkoV3JpdGVBZGRyIC8gMHgwMTAwKTsKKwliY2ItPkNEQls1XQkJCT0gTWVkaWEuWm9uZSAvIDI7CisJYmNiLT5DREJbOF0JCQk9ICoocmVkdW5kYW50ICsgUkVEVF9BRERSMUgpOworCWJjYi0+Q0RCWzldCQkJPSAqKHJlZHVuZGFudCArIFJFRFRfQUREUjFMKTsKIAliY2ItPkNEQlsxMF0JCT0gTWVkaWEuU2VjdG9yOwogCi0JaWYgKFJlYWRCbG9jayAhPSBOT19BU1NJR04pCi0JeworCWlmIChSZWFkQmxvY2sgIT0gTk9fQVNTSUdOKSB7CiAJCWJjYi0+Q0RCWzRdCQk9IChCWVRFKVJlYWRBZGRyOwotCQliY2ItPkNEQlszXQkJPSAoQllURSkoUmVhZEFkZHIvMHgwMTAwKTsKLQkJYmNiLT5DREJbMl0JCT0gTWVkaWEuWm9uZS8yOwotCX0KLQllbHNlCisJCWJjYi0+Q0RCWzNdCQk9IChCWVRFKShSZWFkQWRkciAvIDB4MDEwMCk7CisJCWJjYi0+Q0RCWzJdCQk9IE1lZGlhLlpvbmUgLyAyOworCX0gZWxzZQogCQliY2ItPkNEQlsxMV0JPSAxOwogCiAJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1dSSVRFLCBidWYsIDApOwpAQCAtMzQ5LDI1ICszNDksMjQgQEAKIAlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7CiB9CiAKLS8vLS0tLS0gU3NmZGNfRF9Xcml0ZVNlY3RGb3JDb3B5KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0gU3NmZGNfRF9Xcml0ZVNlY3RGb3JDb3B5KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogaW50IFNzZmRjX0RfV3JpdGVTZWN0Rm9yQ29weShzdHJ1Y3QgdXNfZGF0YSAqdXMsIEJZVEUgKmJ1ZiwgQllURSAqcmVkdW5kYW50KQogewogCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKIAlpbnQJcmVzdWx0OwotCVdPUkQgICAgICAgICAgICAgICAgICAgIGFkZHI7CisJV09SRAlhZGRyOwogCiAJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBTTV9SV19QQVRURVJOKTsKLQlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKLQl7CisJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpIHsKIAkJcHJpbnRrKCJMb2FkIFNNIFJXIENvZGUgRmFpbCAhIVxuIik7CiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJfQogCiAKLQlhZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7Ci0JYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycytNZWRpYS5TZWN0b3I7CisJYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzICsgTWVkaWEuUGh5QmxvY2s7CisJYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycyArIE1lZGlhLlNlY3RvcjsKIAotCS8vIFdyaXRlIHNlY3QgZGF0YQorCS8qIFdyaXRlIHNlY3QgZGF0YSAqLwogCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CiAJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwogCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoCT0gMHgyMDA7CkBAIC0zNzUsMTAgKzM3NCwxMCBAQAogCWJjYi0+Q0RCWzBdCQkJPSAweEYwOwogCWJjYi0+Q0RCWzFdCQkJPSAweDA0OwogCWJjYi0+Q0RCWzddCQkJPSAoQllURSlhZGRyOwotCWJjYi0+Q0RCWzZdCQkJPSAoQllURSkoYWRkci8weDAxMDApOwotCWJjYi0+Q0RCWzVdCQkJPSBNZWRpYS5ab25lLzI7Ci0JYmNiLT5DREJbOF0JCQk9ICoocmVkdW5kYW50K1JFRFRfQUREUjFIKTsKLQliY2ItPkNEQls5XQkJCT0gKihyZWR1bmRhbnQrUkVEVF9BRERSMUwpOworCWJjYi0+Q0RCWzZdCQkJPSAoQllURSkoYWRkciAvIDB4MDEwMCk7CisJYmNiLT5DREJbNV0JCQk9IE1lZGlhLlpvbmUgLyAyOworCWJjYi0+Q0RCWzhdCQkJPSAqKHJlZHVuZGFudCArIFJFRFRfQUREUjFIKTsKKwliY2ItPkNEQls5XQkJCT0gKihyZWR1bmRhbnQgKyBSRURUX0FERFIxTCk7CiAKIAlyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfV1JJVEUsIGJ1ZiwgMCk7CiAJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCkBAIC0zODcsOCArMzg2LDggQEAKIAlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7CiB9CiAKLS8vIDYyNTAgQ01EIDUKLS8vLS0tLS0gU3NmZGNfRF9FcmFzZUJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogNjI1MCBDTUQgNSAqLworLyogLS0tLS0gU3NmZGNfRF9FcmFzZUJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogaW50IFNzZmRjX0RfRXJhc2VCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMpCiB7CiAJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwpAQCAtMzk2LDE0ICszOTUsMTMgQEAKIAlXT1JECWFkZHI7CiAKIAlyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIFNNX1JXX1BBVFRFUk4pOwotCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQotCXsKKwlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgewogCQlwcmludGsoIkxvYWQgU00gUlcgQ29kZSBGYWlsICEhXG4iKTsKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKLQlhZGRyPShXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK01lZGlhLlBoeUJsb2NrOwotCWFkZHI9YWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzOworCWFkZHIgPSAoV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcyArIE1lZGlhLlBoeUJsb2NrOworCWFkZHIgPSBhZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnM7CiAKIAltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwogCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKQEAgLTQxMiw4ICs0MTAsOCBAQAogCWJjYi0+Q0RCWzBdCQkJPSAweEYyOwogCWJjYi0+Q0RCWzFdCQkJPSAweDA2OwogCWJjYi0+Q0RCWzddCQkJPSAoQllURSlhZGRyOwotCWJjYi0+Q0RCWzZdCQkJPSAoQllURSkoYWRkci8weDAxMDApOwotCWJjYi0+Q0RCWzVdCQkJPSBNZWRpYS5ab25lLzI7CisJYmNiLT5DREJbNl0JCQk9IChCWVRFKShhZGRyIC8gMHgwMTAwKTsKKwliY2ItPkNEQls1XQkJCT0gTWVkaWEuWm9uZSAvIDI7CiAKIAlyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfUkVBRCwgTlVMTCwgMCk7CiAJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCkBAIC00MjIsMjQgKzQyMCwyMyBAQAogCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKIH0KIAotLy8gNjI1MCBDTUQgMgotLy8tLS0tLSBTc2ZkY19EX1JlYWRSZWR0RGF0YSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiA2MjUwIENNRCAyICovCisvKi0tLS0tIFNzZmRjX0RfUmVhZFJlZHREYXRhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIGludCBTc2ZkY19EX1JlYWRSZWR0RGF0YShzdHJ1Y3QgdXNfZGF0YSAqdXMsIEJZVEUgKnJlZHVuZGFudCkKIHsKIAlzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CiAJaW50CXJlc3VsdDsKIAlXT1JECWFkZHI7Ci0JQllURSAgKmJ1ZjsKKwlCWVRFCSpidWY7CiAKIAlyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIFNNX1JXX1BBVFRFUk4pOwotCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQotCXsKKwlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgewogCQlwcmludGsoIkxvYWQgU00gUlcgQ29kZSBGYWlsICEhXG4iKTsKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKLQlhZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7Ci0JYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycytNZWRpYS5TZWN0b3I7CisJYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzICsgTWVkaWEuUGh5QmxvY2s7CisJYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycyArIE1lZGlhLlNlY3RvcjsKIAogCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CiAJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwpAQCAtNDQ4LDggKzQ0NSw4IEBACiAJYmNiLT5DREJbMF0JCQk9IDB4RjE7CiAJYmNiLT5DREJbMV0JCQk9IDB4MDM7CiAJYmNiLT5DREJbNF0JCQk9IChCWVRFKWFkZHI7Ci0JYmNiLT5DREJbM10JCQk9IChCWVRFKShhZGRyLzB4MDEwMCk7Ci0JYmNiLT5DREJbMl0JCQk9IE1lZGlhLlpvbmUvMjsKKwliY2ItPkNEQlszXQkJCT0gKEJZVEUpKGFkZHIgLyAweDAxMDApOworCWJjYi0+Q0RCWzJdCQkJPSBNZWRpYS5ab25lIC8gMjsKIAliY2ItPkNEQls4XQkJCT0gMDsKIAliY2ItPkNEQls5XQkJCT0gMTsKIApAQCAtNDYzLDggKzQ2MCw4IEBACiAJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwogfQogCi0vLyA2MjUwIENNRCA0Ci0vLy0tLS0tIFNzZmRjX0RfV3JpdGVSZWR0RGF0YSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIDYyNTAgQ01EIDQgKi8KKy8qIC0tLS0tIFNzZmRjX0RfV3JpdGVSZWR0RGF0YSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIGludCBTc2ZkY19EX1dyaXRlUmVkdERhdGEoc3RydWN0IHVzX2RhdGEgKnVzLCBCWVRFICpyZWR1bmRhbnQpCiB7CiAJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwpAQCAtNDcyLDE0ICs0NjksMTMgQEAKIAlXT1JEICAgICAgICAgICAgICAgICAgICBhZGRyOwogCiAJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBTTV9SV19QQVRURVJOKTsKLQlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKLQl7CisJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpIHsKIAkJcHJpbnRrKCJMb2FkIFNNIFJXIENvZGUgRmFpbCAhIVxuIik7CiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJfQogCi0JYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK01lZGlhLlBoeUJsb2NrOwotCWFkZHIgPSBhZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnMrTWVkaWEuU2VjdG9yOworCWFkZHIgPSAoV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcyArIE1lZGlhLlBoeUJsb2NrOworCWFkZHIgPSBhZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnMgKyBNZWRpYS5TZWN0b3I7CiAKIAltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwogCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKQEAgLTQ4OCwxMCArNDg0LDEwIEBACiAJYmNiLT5DREJbMF0JCQk9IDB4RjI7CiAJYmNiLT5DREJbMV0JCQk9IDB4MDU7CiAJYmNiLT5DREJbN10JCQk9IChCWVRFKWFkZHI7Ci0JYmNiLT5DREJbNl0JCQk9IChCWVRFKShhZGRyLzB4MDEwMCk7Ci0JYmNiLT5DREJbNV0JCQk9IE1lZGlhLlpvbmUvMjsKLQliY2ItPkNEQls4XQkJCT0gKihyZWR1bmRhbnQrUkVEVF9BRERSMUgpOwotCWJjYi0+Q0RCWzldCQkJPSAqKHJlZHVuZGFudCtSRURUX0FERFIxTCk7CisJYmNiLT5DREJbNl0JCQk9IChCWVRFKShhZGRyIC8gMHgwMTAwKTsKKwliY2ItPkNEQls1XQkJCT0gTWVkaWEuWm9uZSAvIDI7CisJYmNiLT5DREJbOF0JCQk9ICoocmVkdW5kYW50ICsgUkVEVF9BRERSMUgpOworCWJjYi0+Q0RCWzldCQkJPSAqKHJlZHVuZGFudCArIFJFRFRfQUREUjFMKTsKIAogCXJlc3VsdCA9IEVORV9TZW5kU2NzaUNtZCh1cywgRkRJUl9SRUFELCBOVUxMLCAwKTsKIAlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKQEAgLTUwMCwxNjUgKzQ5NiwxNjcgQEAKIAlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7CiB9CiAKLS8vLS0tLS0gU3NmZGNfRF9DaGVja1N0YXR1cygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0gU3NmZGNfRF9DaGVja1N0YXR1cygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogaW50IFNzZmRjX0RfQ2hlY2tTdGF0dXModm9pZCkKIHsKLSAgICByZXR1cm4oU01TVUNDRVNTKTsKKwlyZXR1cm4gU01TVUNDRVNTOwogfQogCiAKIAotLy9TbWFydE1lZGlhIElEIENvZGUgQ2hlY2sgJiBNb2RlIFNldCBTdWJyb3V0aW5lCi0vLy0tLS0tIFNldF9EX1NzZmRjTW9kZWwoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIFNtYXJ0TWVkaWEgSUQgQ29kZSBDaGVjayAmIE1vZGUgU2V0IFN1YnJvdXRpbmUKKyAqIC0tLS0tIFNldF9EX1NzZmRjTW9kZWwoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogaW50IFNldF9EX1NzZmRjTW9kZWwoQllURSBkY29kZSkKIHsKLSAgICBzd2l0Y2ggKF9DaGVja19EX0RldkNvZGUoZGNvZGUpKSB7Ci0gICAgICAgIGNhc2UgU1NGREMxTUI6Ci0gICAgICAgICAgICBTc2ZkYy5Nb2RlbCAgICAgICAgPSBTU0ZEQzFNQjsKLSAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQzQ1lDIHwgQlMxNiB8IFBTMjU2OwotICAgICAgICAgICAgU3NmZGMuTWF4Wm9uZXMgICAgID0gMTsKLSAgICAgICAgICAgIFNzZmRjLk1heEJsb2NrcyAgICA9IDI1NjsKLSAgICAgICAgICAgIFNzZmRjLk1heExvZ0Jsb2NrcyA9IDI1MDsKLSAgICAgICAgICAgIFNzZmRjLk1heFNlY3RvcnMgICA9IDg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTU0ZEQzJNQjoKLSAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDMk1COwotICAgICAgICAgICAgU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDNDWUMgfCBCUzE2IHwgUFMyNTY7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSAxOwotICAgICAgICAgICAgU3NmZGMuTWF4QmxvY2tzICAgID0gNTEyOwotICAgICAgICAgICAgU3NmZGMuTWF4TG9nQmxvY2tzID0gNTAwOwotICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gODsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNTRkRDNE1COgotICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREM0TUI7Ci0gICAgICAgICAgICBTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFEM0NZQyB8IEJTMTYgfCBQUzUxMjsKLSAgICAgICAgICAgIFNzZmRjLk1heFpvbmVzICAgICA9IDE7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSA1MTI7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhMb2dCbG9ja3MgPSA1MDA7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhTZWN0b3JzICAgPSAxNjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNTRkRDOE1COgotICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREM4TUI7Ci0gICAgICAgICAgICBTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFEM0NZQyB8IEJTMTYgfCBQUzUxMjsKLSAgICAgICAgICAgIFNzZmRjLk1heFpvbmVzICAgICA9IDE7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSAxMDI0OwotICAgICAgICAgICAgU3NmZGMuTWF4TG9nQmxvY2tzID0gMTAwMDsKLSAgICAgICAgICAgIFNzZmRjLk1heFNlY3RvcnMgICA9IDE2OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1NGREMxNk1COgotICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREMxNk1COwotICAgICAgICAgICAgU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDNDWUMgfCBCUzMyIHwgUFM1MTI7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSAxOwotICAgICAgICAgICAgU3NmZGMuTWF4QmxvY2tzICAgID0gMTAyNDsKLSAgICAgICAgICAgIFNzZmRjLk1heExvZ0Jsb2NrcyA9IDEwMDA7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhTZWN0b3JzICAgPSAzMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNTRkRDMzJNQjoKLSAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDMzJNQjsKLSAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQzQ1lDIHwgQlMzMiB8IFBTNTEyOwotICAgICAgICAgICAgU3NmZGMuTWF4Wm9uZXMgICAgID0gMjsKLSAgICAgICAgICAgIFNzZmRjLk1heEJsb2NrcyAgICA9IDEwMjQ7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhMb2dCbG9ja3MgPSAxMDAwOwotICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gMzI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTU0ZEQzY0TUI6Ci0gICAgICAgICAgICBTc2ZkYy5Nb2RlbCAgICAgICAgPSBTU0ZEQzY0TUI7Ci0gICAgICAgICAgICBTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFENENZQyB8IEJTMzIgfCBQUzUxMjsKLSAgICAgICAgICAgIFNzZmRjLk1heFpvbmVzICAgICA9IDQ7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSAxMDI0OwotICAgICAgICAgICAgU3NmZGMuTWF4TG9nQmxvY2tzID0gMTAwMDsKLSAgICAgICAgICAgIFNzZmRjLk1heFNlY3RvcnMgICA9IDMyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1NGREMxMjhNQjoKLSAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDMTI4TUI7Ci0gICAgICAgICAgICBTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFENENZQyB8IEJTMzIgfCBQUzUxMjsKLSAgICAgICAgICAgIFNzZmRjLk1heFpvbmVzICAgICA9IDg7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSAxMDI0OwotICAgICAgICAgICAgU3NmZGMuTWF4TG9nQmxvY2tzID0gMTAwMDsKLSAgICAgICAgICAgIFNzZmRjLk1heFNlY3RvcnMgICA9IDMyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1NGREMyNTZNQjoKLSAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDMjU2TUI7Ci0gICAgICAgICAgICBTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFENENZQyB8IEJTMzIgfCBQUzUxMjsKLSAgICAgICAgICAgIFNzZmRjLk1heFpvbmVzICAgICA9IDE2OwotICAgICAgICAgICAgU3NmZGMuTWF4QmxvY2tzICAgID0gMTAyNDsKLSAgICAgICAgICAgIFNzZmRjLk1heExvZ0Jsb2NrcyA9IDEwMDA7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhTZWN0b3JzICAgPSAzMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNTRkRDNTEyTUI6Ci0gICAgICAgICAgICBTc2ZkYy5Nb2RlbCAgICAgICAgPSBTU0ZEQzUxMk1COwotICAgICAgICAgICAgU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDRDWUMgfCBCUzMyIHwgUFM1MTI7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSAzMjsKLSAgICAgICAgICAgIFNzZmRjLk1heEJsb2NrcyAgICA9IDEwMjQ7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhMb2dCbG9ja3MgPSAxMDAwOwotICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gMzI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTU0ZEQzFHQjoKLSAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDMUdCOwotICAgICAgICAgICAgU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDRDWUMgfCBCUzMyIHwgUFM1MTI7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSA2NDsKLSAgICAgICAgICAgIFNzZmRjLk1heEJsb2NrcyAgICA9IDEwMjQ7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhMb2dCbG9ja3MgPSAxMDAwOwotICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gMzI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTU0ZEQzJHQjoKLSAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDMkdCOwotICAgICAgICAgICAgU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDRDWUMgfCBCUzMyIHwgUFM1MTI7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSAxMjg7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSAxMDI0OwotICAgICAgICAgICAgU3NmZGMuTWF4TG9nQmxvY2tzID0gMTAwMDsKLSAgICAgICAgICAgIFNzZmRjLk1heFNlY3RvcnMgICA9IDMyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBTc2ZkYy5Nb2RlbCA9IE5PU1NGREM7Ci0gICAgICAgICAgICByZXR1cm4oRVJST1IpOwotICAgIH0KKwlzd2l0Y2ggKF9DaGVja19EX0RldkNvZGUoZGNvZGUpKSB7CisJY2FzZSBTU0ZEQzFNQjoKKwkJU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREMxTUI7CisJCVNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQzQ1lDIHwgQlMxNiB8IFBTMjU2OworCQlTc2ZkYy5NYXhab25lcyAgICAgPSAxOworCQlTc2ZkYy5NYXhCbG9ja3MgICAgPSAyNTY7CisJCVNzZmRjLk1heExvZ0Jsb2NrcyA9IDI1MDsKKwkJU3NmZGMuTWF4U2VjdG9ycyAgID0gODsKKwkJYnJlYWs7CisJY2FzZSBTU0ZEQzJNQjoKKwkJU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREMyTUI7CisJCVNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQzQ1lDIHwgQlMxNiB8IFBTMjU2OworCQlTc2ZkYy5NYXhab25lcyAgICAgPSAxOworCQlTc2ZkYy5NYXhCbG9ja3MgICAgPSA1MTI7CisJCVNzZmRjLk1heExvZ0Jsb2NrcyA9IDUwMDsKKwkJU3NmZGMuTWF4U2VjdG9ycyAgID0gODsKKwkJYnJlYWs7CisJY2FzZSBTU0ZEQzRNQjoKKwkJU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREM0TUI7CisJCVNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQzQ1lDIHwgQlMxNiB8IFBTNTEyOworCQlTc2ZkYy5NYXhab25lcyAgICAgPSAxOworCQlTc2ZkYy5NYXhCbG9ja3MgICAgPSA1MTI7CisJCVNzZmRjLk1heExvZ0Jsb2NrcyA9IDUwMDsKKwkJU3NmZGMuTWF4U2VjdG9ycyAgID0gMTY7CisJCWJyZWFrOworCWNhc2UgU1NGREM4TUI6CisJCVNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDOE1COworCQlTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFEM0NZQyB8IEJTMTYgfCBQUzUxMjsKKwkJU3NmZGMuTWF4Wm9uZXMgICAgID0gMTsKKwkJU3NmZGMuTWF4QmxvY2tzICAgID0gMTAyNDsKKwkJU3NmZGMuTWF4TG9nQmxvY2tzID0gMTAwMDsKKwkJU3NmZGMuTWF4U2VjdG9ycyAgID0gMTY7CisJCWJyZWFrOworCWNhc2UgU1NGREMxNk1COgorCQlTc2ZkYy5Nb2RlbCAgICAgICAgPSBTU0ZEQzE2TUI7CisJCVNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQzQ1lDIHwgQlMzMiB8IFBTNTEyOworCQlTc2ZkYy5NYXhab25lcyAgICAgPSAxOworCQlTc2ZkYy5NYXhCbG9ja3MgICAgPSAxMDI0OworCQlTc2ZkYy5NYXhMb2dCbG9ja3MgPSAxMDAwOworCQlTc2ZkYy5NYXhTZWN0b3JzICAgPSAzMjsKKwkJYnJlYWs7CisJY2FzZSBTU0ZEQzMyTUI6CisJCVNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDMzJNQjsKKwkJU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDNDWUMgfCBCUzMyIHwgUFM1MTI7CisJCVNzZmRjLk1heFpvbmVzICAgICA9IDI7CisJCVNzZmRjLk1heEJsb2NrcyAgICA9IDEwMjQ7CisJCVNzZmRjLk1heExvZ0Jsb2NrcyA9IDEwMDA7CisJCVNzZmRjLk1heFNlY3RvcnMgICA9IDMyOworCQlicmVhazsKKwljYXNlIFNTRkRDNjRNQjoKKwkJU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREM2NE1COworCQlTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFENENZQyB8IEJTMzIgfCBQUzUxMjsKKwkJU3NmZGMuTWF4Wm9uZXMgICAgID0gNDsKKwkJU3NmZGMuTWF4QmxvY2tzICAgID0gMTAyNDsKKwkJU3NmZGMuTWF4TG9nQmxvY2tzID0gMTAwMDsKKwkJU3NmZGMuTWF4U2VjdG9ycyAgID0gMzI7CisJCWJyZWFrOworCWNhc2UgU1NGREMxMjhNQjoKKwkJU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREMxMjhNQjsKKwkJU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDRDWUMgfCBCUzMyIHwgUFM1MTI7CisJCVNzZmRjLk1heFpvbmVzICAgICA9IDg7CisJCVNzZmRjLk1heEJsb2NrcyAgICA9IDEwMjQ7CisJCVNzZmRjLk1heExvZ0Jsb2NrcyA9IDEwMDA7CisJCVNzZmRjLk1heFNlY3RvcnMgICA9IDMyOworCQlicmVhazsKKwljYXNlIFNTRkRDMjU2TUI6CisJCVNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDMjU2TUI7CisJCVNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQ0Q1lDIHwgQlMzMiB8IFBTNTEyOworCQlTc2ZkYy5NYXhab25lcyAgICAgPSAxNjsKKwkJU3NmZGMuTWF4QmxvY2tzICAgID0gMTAyNDsKKwkJU3NmZGMuTWF4TG9nQmxvY2tzID0gMTAwMDsKKwkJU3NmZGMuTWF4U2VjdG9ycyAgID0gMzI7CisJCWJyZWFrOworCWNhc2UgU1NGREM1MTJNQjoKKwkJU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREM1MTJNQjsKKwkJU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDRDWUMgfCBCUzMyIHwgUFM1MTI7CisJCVNzZmRjLk1heFpvbmVzICAgICA9IDMyOworCQlTc2ZkYy5NYXhCbG9ja3MgICAgPSAxMDI0OworCQlTc2ZkYy5NYXhMb2dCbG9ja3MgPSAxMDAwOworCQlTc2ZkYy5NYXhTZWN0b3JzICAgPSAzMjsKKwkJYnJlYWs7CisJY2FzZSBTU0ZEQzFHQjoKKwkJU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREMxR0I7CisJCVNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQ0Q1lDIHwgQlMzMiB8IFBTNTEyOworCQlTc2ZkYy5NYXhab25lcyAgICAgPSA2NDsKKwkJU3NmZGMuTWF4QmxvY2tzICAgID0gMTAyNDsKKwkJU3NmZGMuTWF4TG9nQmxvY2tzID0gMTAwMDsKKwkJU3NmZGMuTWF4U2VjdG9ycyAgID0gMzI7CisJCWJyZWFrOworCWNhc2UgU1NGREMyR0I6CisJCVNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDMkdCOworCQlTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFENENZQyB8IEJTMzIgfCBQUzUxMjsKKwkJU3NmZGMuTWF4Wm9uZXMgICAgID0gMTI4OworCQlTc2ZkYy5NYXhCbG9ja3MgICAgPSAxMDI0OworCQlTc2ZkYy5NYXhMb2dCbG9ja3MgPSAxMDAwOworCQlTc2ZkYy5NYXhTZWN0b3JzICAgPSAzMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJU3NmZGMuTW9kZWwgPSBOT1NTRkRDOworCQlyZXR1cm4gRVJST1I7CisJfQogCi0gICAgcmV0dXJuKFNNU1VDQ0VTUyk7CisgICAgcmV0dXJuIFNNU1VDQ0VTUzsKIH0KIAotLy8tLS0tLSBfQ2hlY2tfRF9EZXZDb2RlKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLSBfQ2hlY2tfRF9EZXZDb2RlKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBCWVRFIF9DaGVja19EX0RldkNvZGUoQllURSBkY29kZSkKIHsKLSAgICBzd2l0Y2goZGNvZGUpewotICAgICAgICBjYXNlIDB4NkU6Ci0gICAgICAgIGNhc2UgMHhFODoKLSAgICAgICAgY2FzZSAweEVDOiByZXR1cm4oU1NGREMxTUIpOyAgIC8vIDhNYml0ICgxTSkgTkFORAotICAgICAgICBjYXNlIDB4NjQ6Ci0gICAgICAgIGNhc2UgMHhFQTogcmV0dXJuKFNTRkRDMk1CKTsgICAvLyAxNk1iaXQgKDJNKSBOQU5ECi0gICAgICAgIGNhc2UgMHg2QjoKLSAgICAgICAgY2FzZSAweEUzOgotICAgICAgICBjYXNlIDB4RTU6IHJldHVybihTU0ZEQzRNQik7ICAgLy8gMzJNYml0ICg0TSkgTkFORAotICAgICAgICBjYXNlIDB4RTY6IHJldHVybihTU0ZEQzhNQik7ICAgLy8gNjRNYml0ICg4TSkgTkFORAotICAgICAgICBjYXNlIDB4NzM6IHJldHVybihTU0ZEQzE2TUIpOyAgLy8gMTI4TWJpdCAoMTZNKU5BTkQKLSAgICAgICAgY2FzZSAweDc1OiByZXR1cm4oU1NGREMzMk1CKTsgIC8vIDI1Nk1iaXQgKDMyTSlOQU5ECi0gICAgICAgIGNhc2UgMHg3NjogcmV0dXJuKFNTRkRDNjRNQik7ICAvLyA1MTJNYml0ICg2NE0pTkFORAotICAgICAgICBjYXNlIDB4Nzk6IHJldHVybihTU0ZEQzEyOE1CKTsgLy8gMUdiaXQoMTI4TSlOQU5ECi0gICAgICAgIGNhc2UgMHg3MTogcmV0dXJuKFNTRkRDMjU2TUIpOwotICAgICAgICBjYXNlIDB4REM6IHJldHVybihTU0ZEQzUxMk1CKTsKLSAgICAgICAgY2FzZSAweEQzOiByZXR1cm4oU1NGREMxR0IpOwotICAgICAgICBjYXNlIDB4RDU6IHJldHVybihTU0ZEQzJHQik7Ci0gICAgICAgIGRlZmF1bHQ6IHJldHVybihOT1NTRkRDKTsKLSAgICB9CisJc3dpdGNoIChkY29kZSkgeworCWNhc2UgMHg2RToKKwljYXNlIDB4RTg6CisJY2FzZSAweEVDOiByZXR1cm4gU1NGREMxTUI7ICAgLyogOE1iaXQgKDFNKSBOQU5EICovCisJY2FzZSAweDY0OgorCWNhc2UgMHhFQTogcmV0dXJuIFNTRkRDMk1COyAgIC8qIDE2TWJpdCAoMk0pIE5BTkQgKi8KKwljYXNlIDB4NkI6CisJY2FzZSAweEUzOgorCWNhc2UgMHhFNTogcmV0dXJuIFNTRkRDNE1COyAgIC8qIDMyTWJpdCAoNE0pIE5BTkQgKi8KKwljYXNlIDB4RTY6IHJldHVybiBTU0ZEQzhNQjsgICAvKiA2NE1iaXQgKDhNKSBOQU5EICovCisJY2FzZSAweDczOiByZXR1cm4gU1NGREMxNk1COyAgLyogMTI4TWJpdCAoMTZNKU5BTkQgKi8KKwljYXNlIDB4NzU6IHJldHVybiBTU0ZEQzMyTUI7ICAvKiAyNTZNYml0ICgzMk0pTkFORCAqLworCWNhc2UgMHg3NjogcmV0dXJuIFNTRkRDNjRNQjsgIC8qIDUxMk1iaXQgKDY0TSlOQU5EICovCisJY2FzZSAweDc5OiByZXR1cm4gU1NGREMxMjhNQjsgLyogMUdiaXQoMTI4TSlOQU5EICovCisJY2FzZSAweDcxOiByZXR1cm4gU1NGREMyNTZNQjsKKwljYXNlIDB4REM6IHJldHVybiBTU0ZEQzUxMk1COworCWNhc2UgMHhEMzogcmV0dXJuIFNTRkRDMUdCOworCWNhc2UgMHhENTogcmV0dXJuIFNTRkRDMkdCOworCWRlZmF1bHQ6IHJldHVybiBOT1NTRkRDOworCX0KIH0KIAogCiAKIAotLy9TbWFydE1lZGlhIEVDQyBDb250cm9sIFN1YnJvdXRpbmUKLS8vLS0tLS0gQ2hlY2tfRF9SZWFkRXJyb3IoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiBTbWFydE1lZGlhIEVDQyBDb250cm9sIFN1YnJvdXRpbmUKKyAqIC0tLS0tIENoZWNrX0RfUmVhZEVycm9yKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiBpbnQgQ2hlY2tfRF9SZWFkRXJyb3IoQllURSAqcmVkdW5kYW50KQogewogCXJldHVybiBTTVNVQ0NFU1M7CiB9CiAKLS8vLS0tLS0gQ2hlY2tfRF9Db3JyZWN0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50IENoZWNrX0RfQ29ycmVjdChCWVRFICpidWYsQllURSAqcmVkdW5kYW50KQorLyogLS0tLS0gQ2hlY2tfRF9Db3JyZWN0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworaW50IENoZWNrX0RfQ29ycmVjdChCWVRFICpidWYsIEJZVEUgKnJlZHVuZGFudCkKIHsKIAlyZXR1cm4gU01TVUNDRVNTOwogfQogCi0vLy0tLS0tIENoZWNrX0RfQ0lTZGF0YSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tIENoZWNrX0RfQ0lTZGF0YSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIGludCBDaGVja19EX0NJU2RhdGEoQllURSAqYnVmLCBCWVRFICpyZWR1bmRhbnQpCiB7CiAJQllURSBjaXNbXSA9IHsweDAxLCAweDAzLCAweEQ5LCAweDAxLCAweEZGLCAweDE4LCAweDAyLApAQCAtNjg1LDEwICs2ODMsMTAgQEAKIAlyZXR1cm4gRVJST1I7CiB9CiAKLS8vLS0tLS0gU2V0X0RfUmlnaHRFQ0MoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLSBTZXRfRF9SaWdodEVDQygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHZvaWQgU2V0X0RfUmlnaHRFQ0MoQllURSAqcmVkdW5kYW50KQogewotICAgIC8vIERyaXZlciCko7C1IEVDQyBDaGVjaworICAgIC8qIERyaXZlciBFQ0MgQ2hlY2sgKi8KICAgICByZXR1cm47CiB9CiAK