ZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmMgYi9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5jCmluZGV4IGY2NTc0OGEuLjFjZTI3NWMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmMKKysrIGIvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uYwpAQCAtMSw2ICsxLDYgQEAKIC8qIGNvbm5lY3Rpb24uYyAtIHRoZSBjb25uZWN0aW9uIHR5cGUKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiAgKiAKQEAgLTMyLDYgKzMyLDkgQEAKIAogI2luY2x1ZGUgInB5dGhyZWFkLmgiCiAKKyNkZWZpbmUgQUNUSU9OX0ZJTkFMSVpFIDEKKyNkZWZpbmUgQUNUSU9OX1JFU0VUIDIKKwogc3RhdGljIGludCBweXNxbGl0ZV9jb25uZWN0aW9uX3NldF9pc29sYXRpb25fbGV2ZWwocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGlzb2xhdGlvbl9sZXZlbCk7CiAKIApAQCAtNTEsNyArNTQsNyBAQAogewogICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZGF0YWJhc2UiLCAidGltZW91dCIsICJkZXRlY3RfdHlwZXMiLCAiaXNvbGF0aW9uX2xldmVsIiwgImNoZWNrX3NhbWVfdGhyZWFkIiwgImZhY3RvcnkiLCAiY2FjaGVkX3N0YXRlbWVudHMiLCBOVUxMLCBOVUxMfTsKIAotICAgIGNoYXIqIGRhdGFiYXNlOworICAgIFB5T2JqZWN0KiBkYXRhYmFzZTsKICAgICBpbnQgZGV0ZWN0X3R5cGVzID0gMDsKICAgICBQeU9iamVjdCogaXNvbGF0aW9uX2xldmVsID0gTlVMTDsKICAgICBQeU9iamVjdCogZmFjdG9yeSA9IE5VTEw7CkBAIC01OSwxMSArNjIsMTUgQEAKICAgICBpbnQgY2FjaGVkX3N0YXRlbWVudHMgPSAxMDA7CiAgICAgZG91YmxlIHRpbWVvdXQgPSA1LjA7CiAgICAgaW50IHJjOworICAgIFB5T2JqZWN0KiBjbGFzc19hdHRyID0gTlVMTDsKKyAgICBQeU9iamVjdCogY2xhc3NfYXR0cl9zdHIgPSBOVUxMOworICAgIGludCBpc19hcHN3X2Nvbm5lY3Rpb24gPSAwOworICAgIFB5T2JqZWN0KiBkYXRhYmFzZV91dGY4OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAic3xkaU9pT2kiLCBrd2xpc3QsCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xkaU9pT2kiLCBrd2xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFiYXNlLCAmdGltZW91dCwgJmRldGVjdF90eXBlcywgJmlzb2xhdGlvbl9sZXZlbCwgJmNoZWNrX3NhbWVfdGhyZWFkLCAmZmFjdG9yeSwgJmNhY2hlZF9zdGF0ZW1lbnRzKSkKICAgICB7Ci0gICAgICAgIHJldHVybiAtMTsgCisgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKICAgICBzZWxmLT5iZWdpbl9zdGF0ZW1lbnQgPSBOVUxMOwpAQCAtNzcsMTMgKzg0LDUzIEBACiAgICAgUHlfSU5DUkVGKCZQeVVuaWNvZGVfVHlwZSk7CiAgICAgc2VsZi0+dGV4dF9mYWN0b3J5ID0gKFB5T2JqZWN0KikmUHlVbmljb2RlX1R5cGU7CiAKLSAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCi0gICAgcmMgPSBzcWxpdGUzX29wZW4oZGF0YWJhc2UsICZzZWxmLT5kYik7Ci0gICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2soZGF0YWJhc2UpIHx8IFB5VW5pY29kZV9DaGVjayhkYXRhYmFzZSkpIHsKKyAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGRhdGFiYXNlKSkgeworICAgICAgICAgICAgZGF0YWJhc2VfdXRmOCA9IGRhdGFiYXNlOworICAgICAgICAgICAgUHlfSU5DUkVGKGRhdGFiYXNlX3V0ZjgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGF0YWJhc2VfdXRmOCA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcoZGF0YWJhc2UpOworICAgICAgICAgICAgaWYgKCFkYXRhYmFzZV91dGY4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLSAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7Ci0gICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYik7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICByYyA9IHNxbGl0ZTNfb3BlbihQeVN0cmluZ19Bc1N0cmluZyhkYXRhYmFzZV91dGY4KSwgJnNlbGYtPmRiKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKworICAgICAgICBQeV9ERUNSRUYoZGF0YWJhc2VfdXRmOCk7CisKKyAgICAgICAgaWYgKHJjICE9IFNRTElURV9PSykgeworICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmRiLCBOVUxMKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIENyZWF0ZSBhIHB5c3FsaXRlIGNvbm5lY3Rpb24gZnJvbSBhIEFQU1cgY29ubmVjdGlvbiAqLworICAgICAgICBjbGFzc19hdHRyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhkYXRhYmFzZSwgIl9fY2xhc3NfXyIpOworICAgICAgICBpZiAoY2xhc3NfYXR0cikgeworICAgICAgICAgICAgY2xhc3NfYXR0cl9zdHIgPSBQeU9iamVjdF9TdHIoY2xhc3NfYXR0cik7CisgICAgICAgICAgICBpZiAoY2xhc3NfYXR0cl9zdHIpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RyY21wKFB5U3RyaW5nX0FzU3RyaW5nKGNsYXNzX2F0dHJfc3RyKSwgIjx0eXBlICdhcHN3LkNvbm5lY3Rpb24nPiIpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogSW4gdGhlIEFQU1cgQ29ubmVjdGlvbiBvYmplY3QsIHRoZSBmaXJzdCBlbnRyeSBhZnRlcgorICAgICAgICAgICAgICAgICAgICAgKiBQeU9iamVjdF9IRUFEIGlzIHRoZSBzcWxpdGUzKiB3ZSB3YW50IHRvIGdldCBob2xkIG9mLgorICAgICAgICAgICAgICAgICAgICAgKiBMdWNraWx5LCB0aGlzIGlzIHRoZSBzYW1lIGxheW91dCBhcyB3ZSBoYXZlIGluIG91cgorICAgICAgICAgICAgICAgICAgICAgKiBweXNxbGl0ZV9Db25uZWN0aW9uICovCisgICAgICAgICAgICAgICAgICAgIHNlbGYtPmRiID0gKChweXNxbGl0ZV9Db25uZWN0aW9uKilkYXRhYmFzZSktPmRiOworCisgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihkYXRhYmFzZSk7CisgICAgICAgICAgICAgICAgICAgIHNlbGYtPmFwc3dfY29ubmVjdGlvbiA9IGRhdGFiYXNlOworICAgICAgICAgICAgICAgICAgICBpc19hcHN3X2Nvbm5lY3Rpb24gPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeV9YREVDUkVGKGNsYXNzX2F0dHJfc3RyKTsKKyAgICAgICAgUHlfWERFQ1JFRihjbGFzc19hdHRyKTsKKworICAgICAgICBpZiAoIWlzX2Fwc3dfY29ubmVjdGlvbikgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJkYXRhYmFzZSBwYXJhbWV0ZXIgbXVzdCBiZSBzdHJpbmcgb3IgQVBTVyBDb25uZWN0aW9uIG9iamVjdCIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKCFpc29sYXRpb25fbGV2ZWwpIHsKQEAgLTE2OSw3ICsyMTYsOCBAQAogICAgIHNlbGYtPnN0YXRlbWVudF9jYWNoZS0+ZGVjcmVmX2ZhY3RvcnkgPSAwOwogfQogCi12b2lkIHB5c3FsaXRlX3Jlc2V0X2FsbF9zdGF0ZW1lbnRzKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYpCisvKiBhY3Rpb24gaW4gKEFDVElPTl9SRVNFVCwgQUNUSU9OX0ZJTkFMSVpFKSAqLwordm9pZCBweXNxbGl0ZV9kb19hbGxfc3RhdGVtZW50cyhweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBpbnQgYWN0aW9uKQogewogICAgIGludCBpOwogICAgIFB5T2JqZWN0KiB3ZWFrcmVmOwpAQCAtMTc5LDEzICsyMjcsMTkgQEAKICAgICAgICAgd2Vha3JlZiA9IFB5TGlzdF9HZXRJdGVtKHNlbGYtPnN0YXRlbWVudHMsIGkpOwogICAgICAgICBzdGF0ZW1lbnQgPSBQeVdlYWtyZWZfR2V0T2JqZWN0KHdlYWtyZWYpOwogICAgICAgICBpZiAoc3RhdGVtZW50ICE9IFB5X05vbmUpIHsKLSAgICAgICAgICAgICh2b2lkKXB5c3FsaXRlX3N0YXRlbWVudF9yZXNldCgocHlzcWxpdGVfU3RhdGVtZW50KilzdGF0ZW1lbnQpOworICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBBQ1RJT05fUkVTRVQpIHsKKyAgICAgICAgICAgICAgICAodm9pZClweXNxbGl0ZV9zdGF0ZW1lbnRfcmVzZXQoKHB5c3FsaXRlX1N0YXRlbWVudCopc3RhdGVtZW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKHZvaWQpcHlzcWxpdGVfc3RhdGVtZW50X2ZpbmFsaXplKChweXNxbGl0ZV9TdGF0ZW1lbnQqKXN0YXRlbWVudCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKIHZvaWQgcHlzcWxpdGVfY29ubmVjdGlvbl9kZWFsbG9jKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYpCiB7CisgICAgUHlPYmplY3QqIHJldCA9IE5VTEw7CisKICAgICBQeV9YREVDUkVGKHNlbGYtPnN0YXRlbWVudF9jYWNoZSk7CiAKICAgICAvKiBDbGVhbiB1cCBpZiB1c2VyIGhhcyBub3QgY2FsbGVkIC5jbG9zZSgpIGV4cGxpY2l0bHkuICovCkBAIC0xOTMsNiArMjQ3LDEwIEBACiAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICAgICAgc3FsaXRlM19jbG9zZShzZWxmLT5kYik7CiAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgfSBlbHNlIGlmIChzZWxmLT5hcHN3X2Nvbm5lY3Rpb24pIHsKKyAgICAgICAgcmV0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzZWxmLT5hcHN3X2Nvbm5lY3Rpb24sICJjbG9zZSIsICIiKTsKKyAgICAgICAgUHlfWERFQ1JFRihyZXQpOworICAgICAgICBQeV9YREVDUkVGKHNlbGYtPmFwc3dfY29ubmVjdGlvbik7CiAgICAgfQogCiAgICAgaWYgKHNlbGYtPmJlZ2luX3N0YXRlbWVudCkgewpAQCAtMjA1LDcgKzI2Myw3IEBACiAgICAgUHlfWERFQ1JFRihzZWxmLT5jb2xsYXRpb25zKTsKICAgICBQeV9YREVDUkVGKHNlbGYtPnN0YXRlbWVudHMpOwogCi0gICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QqKXNlbGYpOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKIH0KIAogUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fY3Vyc29yKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQpAQCAtMjQxLDI0ICsyOTksMzMgQEAKIAogUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fY2xvc2UocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7CisgICAgUHlPYmplY3QqIHJldDsKICAgICBpbnQgcmM7CiAKICAgICBpZiAoIXB5c3FsaXRlX2NoZWNrX3RocmVhZChzZWxmKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBweXNxbGl0ZV9mbHVzaF9zdGF0ZW1lbnRfY2FjaGUoc2VsZik7CisgICAgcHlzcWxpdGVfZG9fYWxsX3N0YXRlbWVudHMoc2VsZiwgQUNUSU9OX0ZJTkFMSVpFKTsKIAogICAgIGlmIChzZWxmLT5kYikgewotICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCi0gICAgICAgIHJjID0gc3FsaXRlM19jbG9zZShzZWxmLT5kYik7Ci0gICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCi0KLSAgICAgICAgaWYgKHJjICE9IFNRTElURV9PSykgewotICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmRiKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoc2VsZi0+YXBzd19jb25uZWN0aW9uKSB7CisgICAgICAgICAgICByZXQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHNlbGYtPmFwc3dfY29ubmVjdGlvbiwgImNsb3NlIiwgIiIpOworICAgICAgICAgICAgUHlfWERFQ1JFRihyZXQpOworICAgICAgICAgICAgUHlfWERFQ1JFRihzZWxmLT5hcHN3X2Nvbm5lY3Rpb24pOworICAgICAgICAgICAgc2VsZi0+YXBzd19jb25uZWN0aW9uID0gTlVMTDsKICAgICAgICAgICAgIHNlbGYtPmRiID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgIHJjID0gc3FsaXRlM19jbG9zZShzZWxmLT5kYik7CisgICAgICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworCisgICAgICAgICAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7CisgICAgICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmRiLCBOVUxMKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2VsZi0+ZGIgPSBOVUxMOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0yOTIsNyArMzU5LDcgQEAKICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCiAgICAgaWYgKHJjICE9IFNRTElURV9PSykgewotICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIpOworICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIHN0YXRlbWVudCk7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCkBAIC0zMDAsNyArMzY3LDcgQEAKICAgICBpZiAocmMgPT0gU1FMSVRFX0RPTkUpIHsKICAgICAgICAgc2VsZi0+aW5UcmFuc2FjdGlvbiA9IDE7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmRiKTsKKyAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmRiLCBzdGF0ZW1lbnQpOwogICAgIH0KIAogICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKQEAgLTMwOCw3ICszNzUsNyBAQAogICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKICAgICBpZiAocmMgIT0gU1FMSVRFX09LICYmICFQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYik7CisgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYiwgTlVMTCk7CiAgICAgfQogCiBlcnJvcjoKQEAgLTMzNSw3ICs0MDIsNyBAQAogICAgICAgICByYyA9IHNxbGl0ZTNfcHJlcGFyZShzZWxmLT5kYiwgIkNPTU1JVCIsIC0xLCAmc3RhdGVtZW50LCAmdGFpbCk7CiAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKLSAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYik7CisgICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIE5VTEwpOwogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogCkBAIC0zNDMsMTQgKzQxMCwxNCBAQAogICAgICAgICBpZiAocmMgPT0gU1FMSVRFX0RPTkUpIHsKICAgICAgICAgICAgIHNlbGYtPmluVHJhbnNhY3Rpb24gPSAwOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmRiKTsKKyAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYiwgc3RhdGVtZW50KTsKICAgICAgICAgfQogCiAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICAgICAgcmMgPSBzcWxpdGUzX2ZpbmFsaXplKHN0YXRlbWVudCk7CiAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0sgJiYgIVB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYik7CisgICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIE5VTEwpOwogICAgICAgICB9CiAKICAgICB9CkBAIC0zNzUsMTMgKzQ0MiwxMyBAQAogICAgIH0KIAogICAgIGlmIChzZWxmLT5pblRyYW5zYWN0aW9uKSB7Ci0gICAgICAgIHB5c3FsaXRlX3Jlc2V0X2FsbF9zdGF0ZW1lbnRzKHNlbGYpOworICAgICAgICBweXNxbGl0ZV9kb19hbGxfc3RhdGVtZW50cyhzZWxmLCBBQ1RJT05fUkVTRVQpOwogCiAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICAgICAgcmMgPSBzcWxpdGUzX3ByZXBhcmUoc2VsZi0+ZGIsICJST0xMQkFDSyIsIC0xLCAmc3RhdGVtZW50LCAmdGFpbCk7CiAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKLSAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYik7CisgICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIE5VTEwpOwogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogCkBAIC0zODksMTQgKzQ1NiwxNCBAQAogICAgICAgICBpZiAocmMgPT0gU1FMSVRFX0RPTkUpIHsKICAgICAgICAgICAgIHNlbGYtPmluVHJhbnNhY3Rpb24gPSAwOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmRiKTsKKyAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYiwgc3RhdGVtZW50KTsKICAgICAgICAgfQogCiAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICAgICAgcmMgPSBzcWxpdGUzX2ZpbmFsaXplKHN0YXRlbWVudCk7CiAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0sgJiYgIVB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYik7CisgICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+ZGIsIE5VTEwpOwogICAgICAgICB9CiAKICAgICB9CkBAIC03NjIsNiArODI5LDMzIEBACiAgICAgcmV0dXJuIHJjOwogfQogCitzdGF0aWMgaW50IF9wcm9ncmVzc19oYW5kbGVyKHZvaWQqIHVzZXJfYXJnKQoreworICAgIGludCByYzsKKyAgICBQeU9iamVjdCAqcmV0OworICAgIFB5R0lMU3RhdGVfU1RBVEUgZ2lsc3RhdGU7CisKKyAgICBnaWxzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CisgICAgcmV0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCopdXNlcl9hcmcsICIiKTsKKworICAgIGlmICghcmV0KSB7CisgICAgICAgIGlmIChfZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MpIHsKKyAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgLyogYWJvcnQgcXVlcnkgaWYgZXJyb3Igb2NjdXJlZCAqLworICAgICAgICByYyA9IDE7IAorICAgIH0gZWxzZSB7CisgICAgICAgIHJjID0gKGludClQeU9iamVjdF9Jc1RydWUocmV0KTsKKyAgICB9CisKKyAgICBQeV9ERUNSRUYocmV0KTsKKyAgICBQeUdJTFN0YXRlX1JlbGVhc2UoZ2lsc3RhdGUpOworICAgIHJldHVybiByYzsKK30KKwogUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fc2V0X2F1dGhvcml6ZXIocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QqIGF1dGhvcml6ZXJfY2I7CkBAIC03ODcsNiArODgxLDMwIEBACiAgICAgfQogfQogCitQeU9iamVjdCogcHlzcWxpdGVfY29ubmVjdGlvbl9zZXRfcHJvZ3Jlc3NfaGFuZGxlcihweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKK3sKKyAgICBQeU9iamVjdCogcHJvZ3Jlc3NfaGFuZGxlcjsKKyAgICBpbnQgbjsKKworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsgInByb2dyZXNzX2hhbmRsZXIiLCAibiIsIE5VTEwgfTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk9pOnNldF9wcm9ncmVzc19oYW5kbGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmcHJvZ3Jlc3NfaGFuZGxlciwgJm4pKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChwcm9ncmVzc19oYW5kbGVyID09IFB5X05vbmUpIHsKKyAgICAgICAgLyogTm9uZSBjbGVhcnMgdGhlIHByb2dyZXNzIGhhbmRsZXIgcHJldmlvdXNseSBzZXQgKi8KKyAgICAgICAgc3FsaXRlM19wcm9ncmVzc19oYW5kbGVyKHNlbGYtPmRiLCAwLCAwLCAodm9pZCopMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3FsaXRlM19wcm9ncmVzc19oYW5kbGVyKHNlbGYtPmRiLCBuLCBfcHJvZ3Jlc3NfaGFuZGxlciwgcHJvZ3Jlc3NfaGFuZGxlcik7CisgICAgICAgIFB5RGljdF9TZXRJdGVtKHNlbGYtPmZ1bmN0aW9uX3BpbmJvYXJkLCBwcm9ncmVzc19oYW5kbGVyLCBQeV9Ob25lKTsKKyAgICB9CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKIGludCBweXNxbGl0ZV9jaGVja190aHJlYWQocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZikKIHsKICAgICBpZiAoc2VsZi0+Y2hlY2tfc2FtZV90aHJlYWQpIHsKQEAgLTg5Miw3ICsxMDEwLDggQEAKICAgICAgICAgfSBlbHNlIGlmIChyYyA9PSBQWVNRTElURV9TUUxfV1JPTkdfVFlQRSkgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX1dhcm5pbmcsICJTUUwgaXMgb2Ygd3JvbmcgdHlwZS4gTXVzdCBiZSBzdHJpbmcgb3IgdW5pY29kZS4iKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYik7CisgICAgICAgICAgICAodm9pZClweXNxbGl0ZV9zdGF0ZW1lbnRfcmVzZXQoc3RhdGVtZW50KTsKKyAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYiwgTlVMTCk7CiAgICAgICAgIH0KIAogICAgICAgICBQeV9ERUNSRUYoc3RhdGVtZW50KTsKQEAgLTExMzQsNyArMTI1Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhbGxhYmxlICE9IFB5X05vbmUpID8gcHlzcWxpdGVfY29sbGF0aW9uX2NhbGxiYWNrIDogTlVMTCk7CiAgICAgaWYgKHJjICE9IFNRTElURV9PSykgewogICAgICAgICBQeURpY3RfRGVsSXRlbShzZWxmLT5jb2xsYXRpb25zLCB1cHBlcmNhc2VfbmFtZSk7Ci0gICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYik7CisgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5kYiwgTlVMTCk7CiAgICAgICAgIGdvdG8gZmluYWxseTsKICAgICB9CiAKQEAgLTExNTEsNiArMTI3MCw0NCBAQAogICAgIHJldHVybiByZXR2YWw7CiB9CiAKKy8qIENhbGxlZCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIHVzZWQgYXMgYSBjb250ZXh0IG1hbmFnZXIuIFJldHVybnMgaXRzZWxmIGFzIGEKKyAqIGNvbnZlbmllbmNlIHRvIHRoZSBjYWxsZXIuICovCitzdGF0aWMgUHlPYmplY3QgKgorcHlzcWxpdGVfY29ubmVjdGlvbl9lbnRlcihweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykKK3sKKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgcmV0dXJuIChQeU9iamVjdCopc2VsZjsKK30KKworLyoqIENhbGxlZCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIHVzZWQgYXMgYSBjb250ZXh0IG1hbmFnZXIuIElmIHRoZXJlIHdhcyBhbnkKKyAqIGV4Y2VwdGlvbiwgYSByb2xsYmFjayB0YWtlcyBwbGFjZTsgb3RoZXJ3aXNlIHdlIGNvbW1pdC4gKi8KK3N0YXRpYyBQeU9iamVjdCAqCitweXNxbGl0ZV9jb25uZWN0aW9uX2V4aXQocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCit7CisgICAgUHlPYmplY3QqIGV4Y190eXBlLCAqZXhjX3ZhbHVlLCAqZXhjX3RiOworICAgIGNoYXIqIG1ldGhvZF9uYW1lOworICAgIFB5T2JqZWN0KiByZXN1bHQ7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PTyIsICZleGNfdHlwZSwgJmV4Y192YWx1ZSwgJmV4Y190YikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKGV4Y190eXBlID09IFB5X05vbmUgJiYgZXhjX3ZhbHVlID09IFB5X05vbmUgJiYgZXhjX3RiID09IFB5X05vbmUpIHsKKyAgICAgICAgbWV0aG9kX25hbWUgPSAiY29tbWl0IjsKKyAgICB9IGVsc2UgeworICAgICAgICBtZXRob2RfbmFtZSA9ICJyb2xsYmFjayI7CisgICAgfQorCisgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZCgoUHlPYmplY3QqKXNlbGYsIG1ldGhvZF9uYW1lLCAiIik7CisgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0RFQ1JFRihyZXN1bHQpOworCisgICAgUHlfSU5DUkVGKFB5X0ZhbHNlKTsKKyAgICByZXR1cm4gUHlfRmFsc2U7Cit9CisKIHN0YXRpYyBjaGFyIGNvbm5lY3Rpb25fZG9jW10gPQogUHlEb2NfU1RSKCJTUUxpdGUgZGF0YWJhc2UgY29ubmVjdGlvbiBvYmplY3QuIik7CiAKQEAgLTExNzUsNiArMTMzMiw4IEBACiAgICAgICAgIFB5RG9jX1NUUigiQ3JlYXRlcyBhIG5ldyBhZ2dyZWdhdGUuIE5vbi1zdGFuZGFyZC4iKX0sCiAgICAgeyJzZXRfYXV0aG9yaXplciIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jb25uZWN0aW9uX3NldF9hdXRob3JpemVyLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywKICAgICAgICAgUHlEb2NfU1RSKCJTZXRzIGF1dGhvcml6ZXIgY2FsbGJhY2suIE5vbi1zdGFuZGFyZC4iKX0sCisgICAgeyJzZXRfcHJvZ3Jlc3NfaGFuZGxlciIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jb25uZWN0aW9uX3NldF9wcm9ncmVzc19oYW5kbGVyLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywKKyAgICAgICAgUHlEb2NfU1RSKCJTZXRzIHByb2dyZXNzIGhhbmRsZXIgY2FsbGJhY2suIE5vbi1zdGFuZGFyZC4iKX0sCiAgICAgeyJleGVjdXRlIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25fZXhlY3V0ZSwgTUVUSF9WQVJBUkdTLAogICAgICAgICBQeURvY19TVFIoIkV4ZWN1dGVzIGEgU1FMIHN0YXRlbWVudC4gTm9uLXN0YW5kYXJkLiIpfSwKICAgICB7ImV4ZWN1dGVtYW55IiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2Nvbm5lY3Rpb25fZXhlY3V0ZW1hbnksIE1FVEhfVkFSQVJHUywKQEAgLTExODUsNiArMTM0NCwxMCBAQAogICAgICAgICBQeURvY19TVFIoIkNyZWF0ZXMgYSBjb2xsYXRpb24gZnVuY3Rpb24uIE5vbi1zdGFuZGFyZC4iKX0sCiAgICAgeyJpbnRlcnJ1cHQiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9pbnRlcnJ1cHQsIE1FVEhfTk9BUkdTLAogICAgICAgICBQeURvY19TVFIoIkFib3J0IGFueSBwZW5kaW5nIGRhdGFiYXNlIG9wZXJhdGlvbi4gTm9uLXN0YW5kYXJkLiIpfSwKKyAgICB7Il9fZW50ZXJfXyIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jb25uZWN0aW9uX2VudGVyLCBNRVRIX05PQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJGb3IgY29udGV4dCBtYW5hZ2VyLiBOb24tc3RhbmRhcmQuIil9LAorICAgIHsiX19leGl0X18iLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY29ubmVjdGlvbl9leGl0LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIFB5RG9jX1NUUigiRm9yIGNvbnRleHQgbWFuYWdlci4gTm9uLXN0YW5kYXJkLiIpfSwKICAgICB7TlVMTCwgTlVMTH0KIH07CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmggYi9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5oCmluZGV4IDIxZmNkMmEuLjNiMWM2MzIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmgKKysrIGIvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uaApAQCAtMSw2ICsxLDYgQEAKIC8qIGNvbm5lY3Rpb24uaCAtIGRlZmluaXRpb25zIGZvciB0aGUgY29ubmVjdGlvbiB0eXBlCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgogICoKQEAgLTk1LDYgKzk1LDExIEBACiAgICAgLyogYSBkaWN0aW9uYXJ5IG9mIHJlZ2lzdGVyZWQgY29sbGF0aW9uIG5hbWUgPT4gY29sbGF0aW9uIGNhbGxhYmxlIG1hcHBpbmdzICovCiAgICAgUHlPYmplY3QqIGNvbGxhdGlvbnM7CiAKKyAgICAvKiBpZiBvdXIgY29ubmVjdGlvbiB3YXMgY3JlYXRlZCBmcm9tIGEgQVBTVyBjb25uZWN0aW9uLCB3ZSBrZWVwIGEKKyAgICAgKiByZWZlcmVuY2UgdG8gdGhlIEFQU1cgY29ubmVjdGlvbiBhcm91bmQgYW5kIGdldCByaWQgb2YgaXQgaW4gb3VyCisgICAgICogZGVzdHJ1Y3RvciAqLworICAgIFB5T2JqZWN0KiBhcHN3X2Nvbm5lY3Rpb247CisKICAgICAvKiBFeGNlcHRpb24gb2JqZWN0cyAqLwogICAgIFB5T2JqZWN0KiBXYXJuaW5nOwogICAgIFB5T2JqZWN0KiBFcnJvcjsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuYyBiL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuYwppbmRleCA4NzVkNTViLi41NjZlNGZmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmMKKysrIGIvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5jCkBAIC0xLDYgKzEsNiBAQAogLyogY3Vyc29yLmMgLSB0aGUgY3Vyc29yIHR5cGUKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiAgKgpAQCAtODAsNyArODAsNyBAQAogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZweXNxbGl0ZV9Db25uZWN0aW9uVHlwZSwgJmNvbm5lY3Rpb24pKQogICAgIHsKLSAgICAgICAgcmV0dXJuIC0xOyAKKyAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAogICAgIFB5X0lOQ1JFRihjb25uZWN0aW9uKTsKQEAgLTQzNSw3ICs0MzUsNyBAQAogICAgIGlmIChtdWx0aXBsZSkgewogICAgICAgICAvKiBleGVjdXRlbWFueSgpICovCiAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT08iLCAmb3BlcmF0aW9uLCAmc2Vjb25kX2FyZ3VtZW50KSkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7IAorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKG9wZXJhdGlvbikgJiYgIVB5VW5pY29kZV9DaGVjayhvcGVyYXRpb24pKSB7CkBAIC00NTcsNyArNDU3LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICAvKiBleGVjdXRlKCkgKi8KICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8iLCAmb3BlcmF0aW9uLCAmc2Vjb25kX2FyZ3VtZW50KSkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7IAorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKG9wZXJhdGlvbikgJiYgIVB5VW5pY29kZV9DaGVjayhvcGVyYXRpb24pKSB7CkBAIC01MDYsNTMgKzUwNiwxMSBAQAogICAgICAgICBvcGVyYXRpb25fY3N0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKG9wZXJhdGlvbl9ieXRlc3RyKTsKICAgICB9CiAKLSAgICAvKiByZXNldCBkZXNjcmlwdGlvbiBhbmQgcm93Y291bnQgKi8KKyAgICAvKiByZXNldCBkZXNjcmlwdGlvbiAqLwogICAgIFB5X0RFQ1JFRihzZWxmLT5kZXNjcmlwdGlvbik7CiAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgIHNlbGYtPmRlc2NyaXB0aW9uID0gUHlfTm9uZTsKIAotICAgIFB5X0RFQ1JFRihzZWxmLT5yb3djb3VudCk7Ci0gICAgc2VsZi0+cm93Y291bnQgPSBQeUludF9Gcm9tTG9uZygtMUwpOwotICAgIGlmICghc2VsZi0+cm93Y291bnQpIHsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBzdGF0ZW1lbnRfdHlwZSA9IGRldGVjdF9zdGF0ZW1lbnRfdHlwZShvcGVyYXRpb25fY3N0cik7Ci0gICAgaWYgKHNlbGYtPmNvbm5lY3Rpb24tPmJlZ2luX3N0YXRlbWVudCkgewotICAgICAgICBzd2l0Y2ggKHN0YXRlbWVudF90eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFTUVOVF9VUERBVEU6Ci0gICAgICAgICAgICBjYXNlIFNUQVRFTUVOVF9ERUxFVEU6Ci0gICAgICAgICAgICBjYXNlIFNUQVRFTUVOVF9JTlNFUlQ6Ci0gICAgICAgICAgICBjYXNlIFNUQVRFTUVOVF9SRVBMQUNFOgotICAgICAgICAgICAgICAgIGlmICghc2VsZi0+Y29ubmVjdGlvbi0+aW5UcmFuc2FjdGlvbikgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBfcHlzcWxpdGVfY29ubmVjdGlvbl9iZWdpbihzZWxmLT5jb25uZWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTVEFURU1FTlRfT1RIRVI6Ci0gICAgICAgICAgICAgICAgLyogaXQncyBhIERETCBzdGF0ZW1lbnQgb3Igc29tZXRoaW5nIHNpbWlsYXIKLSAgICAgICAgICAgICAgICAgICAtIHdlIGJldHRlciBDT01NSVQgZmlyc3Qgc28gaXQgd29ya3MgZm9yIGFsbCBjYXNlcyAqLwotICAgICAgICAgICAgICAgIGlmIChzZWxmLT5jb25uZWN0aW9uLT5pblRyYW5zYWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHB5c3FsaXRlX2Nvbm5lY3Rpb25fY29tbWl0KHNlbGYtPmNvbm5lY3Rpb24sIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFTUVOVF9TRUxFQ1Q6Ci0gICAgICAgICAgICAgICAgaWYgKG11bHRpcGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9Qcm9ncmFtbWluZ0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWW91IGNhbm5vdCBleGVjdXRlIFNFTEVDVCBzdGF0ZW1lbnRzIGluIGV4ZWN1dGVtYW55KCkuIik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgZnVuY19hcmdzID0gUHlUdXBsZV9OZXcoMSk7CiAgICAgaWYgKCFmdW5jX2FyZ3MpIHsKICAgICAgICAgZ290byBlcnJvcjsKQEAgLTU5MCw2ICs1NDgsNDIgQEAKICAgICBweXNxbGl0ZV9zdGF0ZW1lbnRfcmVzZXQoc2VsZi0+c3RhdGVtZW50KTsKICAgICBweXNxbGl0ZV9zdGF0ZW1lbnRfbWFya19kaXJ0eShzZWxmLT5zdGF0ZW1lbnQpOwogCisgICAgc3RhdGVtZW50X3R5cGUgPSBkZXRlY3Rfc3RhdGVtZW50X3R5cGUob3BlcmF0aW9uX2NzdHIpOworICAgIGlmIChzZWxmLT5jb25uZWN0aW9uLT5iZWdpbl9zdGF0ZW1lbnQpIHsKKyAgICAgICAgc3dpdGNoIChzdGF0ZW1lbnRfdHlwZSkgeworICAgICAgICAgICAgY2FzZSBTVEFURU1FTlRfVVBEQVRFOgorICAgICAgICAgICAgY2FzZSBTVEFURU1FTlRfREVMRVRFOgorICAgICAgICAgICAgY2FzZSBTVEFURU1FTlRfSU5TRVJUOgorICAgICAgICAgICAgY2FzZSBTVEFURU1FTlRfUkVQTEFDRToKKyAgICAgICAgICAgICAgICBpZiAoIXNlbGYtPmNvbm5lY3Rpb24tPmluVHJhbnNhY3Rpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX3B5c3FsaXRlX2Nvbm5lY3Rpb25fYmVnaW4oc2VsZi0+Y29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVNRU5UX09USEVSOgorICAgICAgICAgICAgICAgIC8qIGl0J3MgYSBEREwgc3RhdGVtZW50IG9yIHNvbWV0aGluZyBzaW1pbGFyCisgICAgICAgICAgICAgICAgICAgLSB3ZSBiZXR0ZXIgQ09NTUlUIGZpcnN0IHNvIGl0IHdvcmtzIGZvciBhbGwgY2FzZXMgKi8KKyAgICAgICAgICAgICAgICBpZiAoc2VsZi0+Y29ubmVjdGlvbi0+aW5UcmFuc2FjdGlvbikgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBweXNxbGl0ZV9jb25uZWN0aW9uX2NvbW1pdChzZWxmLT5jb25uZWN0aW9uLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVEFURU1FTlRfU0VMRUNUOgorICAgICAgICAgICAgICAgIGlmIChtdWx0aXBsZSkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfUHJvZ3JhbW1pbmdFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIllvdSBjYW5ub3QgZXhlY3V0ZSBTRUxFQ1Qgc3RhdGVtZW50cyBpbiBleGVjdXRlbWFueSgpLiIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHdoaWxlICgxKSB7CiAgICAgICAgIHBhcmFtZXRlcnMgPSBQeUl0ZXJfTmV4dChwYXJhbWV0ZXJzX2l0ZXIpOwogICAgICAgICBpZiAoIXBhcmFtZXRlcnMpIHsKQEAgLTYwMywxMSArNTk3LDYgQEAKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAocHlzcWxpdGVfYnVpbGRfcm93X2Nhc3RfbWFwKHNlbGYpICE9IDApIHsKLSAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9PcGVyYXRpb25hbEVycm9yLCAiRXJyb3Igd2hpbGUgYnVpbGRpbmcgcm93X2Nhc3RfbWFwIik7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0KICAgICAgICAgLyogS2VlcCB0cnlpbmcgdGhlIFNRTCBzdGF0ZW1lbnQgdW50aWwgdGhlIHNjaGVtYSBzdG9wcyBjaGFuZ2luZy4gKi8KICAgICAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgICAgIC8qIEFjdHVhbGx5IGV4ZWN1dGUgdGhlIFNRTCBzdGF0ZW1lbnQuICovCkBAIC02MjYsNyArNjE1LDggQEAKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIGRhdGFiYXNlIGdhdmUgdXMgYW4gZXJyb3IsIHByb21vdGUgaXQgdG8gUHl0aG9uLiAqLwotICAgICAgICAgICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+Y29ubmVjdGlvbi0+ZGIpOworICAgICAgICAgICAgICAgICAgICAodm9pZClweXNxbGl0ZV9zdGF0ZW1lbnRfcmVzZXQoc2VsZi0+c3RhdGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmNvbm5lY3Rpb24tPmRiLCBOVUxMKTsKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNjM4LDE3ICs2MjgsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmNvbm5lY3Rpb24tPmRiKTsKKyAgICAgICAgICAgICAgICAodm9pZClweXNxbGl0ZV9zdGF0ZW1lbnRfcmVzZXQoc2VsZi0+c3RhdGVtZW50KTsKKyAgICAgICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+Y29ubmVjdGlvbi0+ZGIsIE5VTEwpOwogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAocmMgPT0gU1FMSVRFX1JPVyB8fCAocmMgPT0gU1FMSVRFX0RPTkUgJiYgc3RhdGVtZW50X3R5cGUgPT0gU1RBVEVNRU5UX1NFTEVDVCkpIHsKLSAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLSAgICAgICAgICAgIG51bWNvbHMgPSBzcWxpdGUzX2NvbHVtbl9jb3VudChzZWxmLT5zdGF0ZW1lbnQtPnN0KTsKLSAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGlmIChweXNxbGl0ZV9idWlsZF9yb3dfY2FzdF9tYXAoc2VsZikgIT0gMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX09wZXJhdGlvbmFsRXJyb3IsICJFcnJvciB3aGlsZSBidWlsZGluZyByb3dfY2FzdF9tYXAiKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KIAorICAgICAgICBpZiAocmMgPT0gU1FMSVRFX1JPVyB8fCAocmMgPT0gU1FMSVRFX0RPTkUgJiYgc3RhdGVtZW50X3R5cGUgPT0gU1RBVEVNRU5UX1NFTEVDVCkpIHsKICAgICAgICAgICAgIGlmIChzZWxmLT5kZXNjcmlwdGlvbiA9PSBQeV9Ob25lKSB7CisgICAgICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgICAgIG51bWNvbHMgPSBzcWxpdGUzX2NvbHVtbl9jb3VudChzZWxmLT5zdGF0ZW1lbnQtPnN0KTsKKyAgICAgICAgICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworCiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYtPmRlc2NyaXB0aW9uKTsKICAgICAgICAgICAgICAgICBzZWxmLT5kZXNjcmlwdGlvbiA9IFB5VHVwbGVfTmV3KG51bWNvbHMpOwogICAgICAgICAgICAgICAgIGlmICghc2VsZi0+ZGVzY3JpcHRpb24pIHsKQEAgLTY4OSwxNSArNjg1LDExIEBACiAgICAgICAgICAgICBjYXNlIFNUQVRFTUVOVF9ERUxFVEU6CiAgICAgICAgICAgICBjYXNlIFNUQVRFTUVOVF9JTlNFUlQ6CiAgICAgICAgICAgICBjYXNlIFNUQVRFTUVOVF9SRVBMQUNFOgotICAgICAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICAgICAgICAgICAgICByb3djb3VudCArPSAobG9uZylzcWxpdGUzX2NoYW5nZXMoc2VsZi0+Y29ubmVjdGlvbi0+ZGIpOwotICAgICAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCi0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYtPnJvd2NvdW50KTsKLSAgICAgICAgICAgICAgICBzZWxmLT5yb3djb3VudCA9IFB5SW50X0Zyb21Mb25nKHJvd2NvdW50KTsKICAgICAgICAgfQogCiAgICAgICAgIFB5X0RFQ1JFRihzZWxmLT5sYXN0cm93aWQpOwotICAgICAgICBpZiAoc3RhdGVtZW50X3R5cGUgPT0gU1RBVEVNRU5UX0lOU0VSVCkgeworICAgICAgICBpZiAoIW11bHRpcGxlICYmIHN0YXRlbWVudF90eXBlID09IFNUQVRFTUVOVF9JTlNFUlQpIHsKICAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICAgICAgICAgIGxhc3Ryb3dpZCA9IHNxbGl0ZTNfbGFzdF9pbnNlcnRfcm93aWQoc2VsZi0+Y29ubmVjdGlvbi0+ZGIpOwogICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKQEAgLTcxNCwxNCArNzA2LDI3IEBACiAgICAgfQogCiBlcnJvcjoKKyAgICAvKiBqdXN0IHRvIGJlIHN1cmUgKGltcGxpY2l0IFJPTExCQUNLcyB3aXRoIE9OIENPTkZMSUNUIFJPTExCQUNLL09SCisgICAgICogUk9MTEJBQ0sgY291bGQgaGF2ZSBoYXBwZW5lZCAqLworICAgICNpZmRlZiBTUUxJVEVfVkVSU0lPTl9OVU1CRVIKKyAgICAjaWYgU1FMSVRFX1ZFUlNJT05fTlVNQkVSID49IDMwMDIwMDIKKyAgICBzZWxmLT5jb25uZWN0aW9uLT5pblRyYW5zYWN0aW9uID0gIXNxbGl0ZTNfZ2V0X2F1dG9jb21taXQoc2VsZi0+Y29ubmVjdGlvbi0+ZGIpOworICAgICNlbmRpZgorICAgICNlbmRpZgorCiAgICAgUHlfWERFQ1JFRihvcGVyYXRpb25fYnl0ZXN0cik7CiAgICAgUHlfWERFQ1JFRihwYXJhbWV0ZXJzKTsKICAgICBQeV9YREVDUkVGKHBhcmFtZXRlcnNfaXRlcik7CiAgICAgUHlfWERFQ1JFRihwYXJhbWV0ZXJzX2xpc3QpOwogCiAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYtPnJvd2NvdW50KTsKKyAgICAgICAgc2VsZi0+cm93Y291bnQgPSBQeUludF9Gcm9tTG9uZygtMUwpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9IGVsc2UgeworICAgICAgICBQeV9ERUNSRUYoc2VsZi0+cm93Y291bnQpOworICAgICAgICBzZWxmLT5yb3djb3VudCA9IFB5SW50X0Zyb21Mb25nKHJvd2NvdW50KTsKKwogICAgICAgICBQeV9JTkNSRUYoc2VsZik7CiAgICAgICAgIHJldHVybiAoUHlPYmplY3QqKXNlbGY7CiAgICAgfQpAQCAtNzQ4LDcgKzc1Myw3IEBACiAgICAgaW50IHN0YXRlbWVudF9jb21wbGV0ZWQgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIiwgJnNjcmlwdF9vYmopKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOyAKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgaWYgKCFweXNxbGl0ZV9jaGVja190aHJlYWQoc2VsZi0+Y29ubmVjdGlvbikgfHwgIXB5c3FsaXRlX2NoZWNrX2Nvbm5lY3Rpb24oc2VsZi0+Y29ubmVjdGlvbikpIHsKQEAgLTc4OCw3ICs3OTMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0X2NzdHIpOwogICAgICAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7Ci0gICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+Y29ubmVjdGlvbi0+ZGIpOworICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmNvbm5lY3Rpb24tPmRiLCBOVUxMKTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KIApAQCAtNzk2LDE3ICs4MDEsMTggQEAKICAgICAgICAgcmMgPSBTUUxJVEVfUk9XOwogICAgICAgICB3aGlsZSAocmMgPT0gU1FMSVRFX1JPVykgewogICAgICAgICAgICAgcmMgPSBfc3FsaXRlX3N0ZXBfd2l0aF9idXN5aGFuZGxlcihzdGF0ZW1lbnQsIHNlbGYtPmNvbm5lY3Rpb24pOworICAgICAgICAgICAgLyogVE9ETzogd2UgcHJvYmFibHkgbmVlZCBtb3JlIGVycm9yIGhhbmRsaW5nIGhlcmUgKi8KICAgICAgICAgfQogCiAgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfRE9ORSkgewogICAgICAgICAgICAgKHZvaWQpc3FsaXRlM19maW5hbGl6ZShzdGF0ZW1lbnQpOwotICAgICAgICAgICAgX3B5c3FsaXRlX3NldGVycm9yKHNlbGYtPmNvbm5lY3Rpb24tPmRiKTsKKyAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5jb25uZWN0aW9uLT5kYiwgTlVMTCk7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAKICAgICAgICAgcmMgPSBzcWxpdGUzX2ZpbmFsaXplKHN0YXRlbWVudCk7CiAgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKLSAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5jb25uZWN0aW9uLT5kYik7CisgICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+Y29ubmVjdGlvbi0+ZGIsIE5VTEwpOwogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogICAgIH0KQEAgLTg2NCw4ICs4NzAsOSBAQAogICAgIGlmIChzZWxmLT5zdGF0ZW1lbnQpIHsKICAgICAgICAgcmMgPSBfc3FsaXRlX3N0ZXBfd2l0aF9idXN5aGFuZGxlcihzZWxmLT5zdGF0ZW1lbnQtPnN0LCBzZWxmLT5jb25uZWN0aW9uKTsKICAgICAgICAgaWYgKHJjICE9IFNRTElURV9ET05FICYmIHJjICE9IFNRTElURV9ST1cpIHsKKyAgICAgICAgICAgICh2b2lkKXB5c3FsaXRlX3N0YXRlbWVudF9yZXNldChzZWxmLT5zdGF0ZW1lbnQpOwogICAgICAgICAgICAgUHlfREVDUkVGKG5leHRfcm93KTsKLSAgICAgICAgICAgIF9weXNxbGl0ZV9zZXRlcnJvcihzZWxmLT5jb25uZWN0aW9uLT5kYik7CisgICAgICAgICAgICBfcHlzcWxpdGVfc2V0ZXJyb3Ioc2VsZi0+Y29ubmVjdGlvbi0+ZGIsIE5VTEwpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIApAQCAtODkwLDE1ICs4OTcsMTcgQEAKICAgICByZXR1cm4gcm93OwogfQogCi1QeU9iamVjdCogcHlzcWxpdGVfY3Vyc29yX2ZldGNobWFueShweXNxbGl0ZV9DdXJzb3IqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQorUHlPYmplY3QqIHB5c3FsaXRlX2N1cnNvcl9mZXRjaG1hbnkocHlzcWxpdGVfQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKIHsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InNpemUiLCBOVUxMLCBOVUxMfTsKKwogICAgIFB5T2JqZWN0KiByb3c7CiAgICAgUHlPYmplY3QqIGxpc3Q7CiAgICAgaW50IG1heHJvd3MgPSBzZWxmLT5hcnJheXNpemU7CiAgICAgaW50IGNvdW50ZXIgPSAwOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aSIsICZtYXhyb3dzKSkgewotICAgICAgICByZXR1cm4gTlVMTDsgCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifGk6ZmV0Y2htYW55Iiwga3dsaXN0LCAmbWF4cm93cykpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgbGlzdCA9IFB5TGlzdF9OZXcoMCk7CkBAIC05OTIsNyArMTAwMSw3IEBACiAgICAgICAgIFB5RG9jX1NUUigiRXhlY3V0ZXMgYSBtdWx0aXBsZSBTUUwgc3RhdGVtZW50cyBhdCBvbmNlLiBOb24tc3RhbmRhcmQuIil9LAogICAgIHsiZmV0Y2hvbmUiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY3Vyc29yX2ZldGNob25lLCBNRVRIX05PQVJHUywKICAgICAgICAgUHlEb2NfU1RSKCJGZXRjaGVzIG9uZSByb3cgZnJvbSB0aGUgcmVzdWx0c2V0LiIpfSwKLSAgICB7ImZldGNobWFueSIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jdXJzb3JfZmV0Y2htYW55LCBNRVRIX1ZBUkFSR1MsCisgICAgeyJmZXRjaG1hbnkiLCAoUHlDRnVuY3Rpb24pcHlzcWxpdGVfY3Vyc29yX2ZldGNobWFueSwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCiAgICAgICAgIFB5RG9jX1NUUigiRmV0Y2hlcyBzZXZlcmFsIHJvd3MgZnJvbSB0aGUgcmVzdWx0c2V0LiIpfSwKICAgICB7ImZldGNoYWxsIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2N1cnNvcl9mZXRjaGFsbCwgTUVUSF9OT0FSR1MsCiAgICAgICAgIFB5RG9jX1NUUigiRmV0Y2hlcyBhbGwgcm93cyBmcm9tIHRoZSByZXN1bHRzZXQuIil9LApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5oIGIvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5oCmluZGV4IDVmY2U2NGEuLmQ5MTZjYTUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuaAorKysgYi9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmgKQEAgLTEsNiArMSw2IEBACiAvKiBjdXJzb3IuaCAtIGRlZmluaXRpb25zIGZvciB0aGUgY3Vyc29yIHR5cGUKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiAgKgpAQCAtNjAsNyArNjAsNyBAQAogUHlPYmplY3QqIHB5c3FsaXRlX2N1cnNvcl9nZXRpdGVyKHB5c3FsaXRlX0N1cnNvciAqc2VsZik7CiBQeU9iamVjdCogcHlzcWxpdGVfY3Vyc29yX2l0ZXJuZXh0KHB5c3FsaXRlX0N1cnNvciAqc2VsZik7CiBQeU9iamVjdCogcHlzcWxpdGVfY3Vyc29yX2ZldGNob25lKHB5c3FsaXRlX0N1cnNvciogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOwotUHlPYmplY3QqIHB5c3FsaXRlX2N1cnNvcl9mZXRjaG1hbnkocHlzcWxpdGVfQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitQeU9iamVjdCogcHlzcWxpdGVfY3Vyc29yX2ZldGNobWFueShweXNxbGl0ZV9DdXJzb3IqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKTsKIFB5T2JqZWN0KiBweXNxbGl0ZV9jdXJzb3JfZmV0Y2hhbGwocHlzcWxpdGVfQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CiBQeU9iamVjdCogcHlzcWxpdGVfbm9vcChweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CiBQeU9iamVjdCogcHlzcWxpdGVfY3Vyc29yX2Nsb3NlKHB5c3FsaXRlX0N1cnNvciogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL21pY3JvcHJvdG9jb2xzLmggYi9Nb2R1bGVzL19zcWxpdGUvbWljcm9wcm90b2NvbHMuaAppbmRleCBkODRlYzkzLi5jOTExYzgxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvbWljcm9wcm90b2NvbHMuaAorKysgYi9Nb2R1bGVzL19zcWxpdGUvbWljcm9wcm90b2NvbHMuaApAQCAtMjgsMTAgKzI4LDYgQEAKIAogI2luY2x1ZGUgPFB5dGhvbi5oPgogCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KIC8qKiBhZGFwdGVycyByZWdpc3RyeSAqKi8KIAogZXh0ZXJuIFB5T2JqZWN0ICpwc3ljb19hZGFwdGVyczsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuYyBiL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuYwppbmRleCA4ODQ0ZDgxLi5hZjdlYWNlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5jCkBAIC0xLDI1ICsxLDI1IEBACi0gICAgLyogbW9kdWxlLmMgLSB0aGUgbW9kdWxlIGl0c2VsZgotICAgICAqCi0gICAgICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgotICAgICAqCi0gICAgICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCi0gICAgICoKLSAgICAgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAotICAgICAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKLSAgICAgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotICAgICAqCi0gICAgICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gICAgICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAotICAgICAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLSAgICAgKgotICAgICAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKLSAgICAgKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAgICAgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAgICAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCi0gICAgICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICAgICAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0gICAgICovCisvKiBtb2R1bGUuYyAtIHRoZSBtb2R1bGUgaXRzZWxmCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisgKi8KIAogI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKICNpbmNsdWRlICJzdGF0ZW1lbnQuaCIKQEAgLTQxLDYgKzQxLDcgQEAKIAogUHlPYmplY3QqIGNvbnZlcnRlcnM7CiBpbnQgX2VuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzOworaW50IHB5c3FsaXRlX0Jhc2VUeXBlQWRhcHRlZDsKIAogc3RhdGljIFB5T2JqZWN0KiBtb2R1bGVfY29ubmVjdChQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KgogICAgICAgICBrd2FyZ3MpCkBAIC01MCw3ICs1MSw3IEBACiAgICAgICogY29ubmVjdGlvbi5jIGFuZCBtdXN0IGFsd2F5cyBiZSBjb3BpZWQgZnJvbSB0aGVyZSAuLi4gKi8KIAogICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZGF0YWJhc2UiLCAidGltZW91dCIsICJkZXRlY3RfdHlwZXMiLCAiaXNvbGF0aW9uX2xldmVsIiwgImNoZWNrX3NhbWVfdGhyZWFkIiwgImZhY3RvcnkiLCAiY2FjaGVkX3N0YXRlbWVudHMiLCBOVUxMLCBOVUxMfTsKLSAgICBjaGFyKiBkYXRhYmFzZTsKKyAgICBQeU9iamVjdCogZGF0YWJhc2U7CiAgICAgaW50IGRldGVjdF90eXBlcyA9IDA7CiAgICAgUHlPYmplY3QqIGlzb2xhdGlvbl9sZXZlbDsKICAgICBQeU9iamVjdCogZmFjdG9yeSA9IE5VTEw7CkBAIC02MCw3ICs2MSw3IEBACiAKICAgICBQeU9iamVjdCogcmVzdWx0OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAic3xkaU9pT2kiLCBrd2xpc3QsCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xkaU9pT2kiLCBrd2xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFiYXNlLCAmdGltZW91dCwgJmRldGVjdF90eXBlcywgJmlzb2xhdGlvbl9sZXZlbCwgJmNoZWNrX3NhbWVfdGhyZWFkLCAmZmFjdG9yeSwgJmNhY2hlZF9zdGF0ZW1lbnRzKSkKICAgICB7CiAgICAgICAgIHJldHVybiBOVUxMOyAKQEAgLTEzMyw2ICsxMzQsMTMgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCisgICAgLyogYSBiYXNpYyB0eXBlIGlzIGFkYXB0ZWQ7IHRoZXJlJ3MgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gaWYgdGhhdCdzIG5vdCB0aGUgY2FzZQorICAgICAqICg5OSAlIG9mIGFsbCB1c2FnZXMpICovCisgICAgaWYgKHR5cGUgPT0gJlB5SW50X1R5cGUgfHwgdHlwZSA9PSAmUHlMb25nX1R5cGUgfHwgdHlwZSA9PSAmUHlGbG9hdF9UeXBlCisgICAgICAgICAgICB8fCB0eXBlID09ICZQeVN0cmluZ19UeXBlIHx8IHR5cGUgPT0gJlB5VW5pY29kZV9UeXBlIHx8IHR5cGUgPT0gJlB5QnVmZmVyX1R5cGUpIHsKKyAgICAgICAgcHlzcWxpdGVfQmFzZVR5cGVBZGFwdGVkID0gMTsKKyAgICB9CisKICAgICBtaWNyb3Byb3RvY29sc19hZGQodHlwZSwgKFB5T2JqZWN0KikmcHlzcWxpdGVfUHJlcGFyZVByb3RvY29sVHlwZSwgY2FzdGVyKTsKIAogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKQEAgLTM3OSw2ICszODcsOCBAQAogCiAgICAgX2VuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzID0gMDsKIAorICAgIHB5c3FsaXRlX0Jhc2VUeXBlQWRhcHRlZCA9IDA7CisKICAgICAvKiBPcmlnaW5hbCBjb21tZW50IGZvcm0gX2JzZGRiLmMgaW4gdGhlIFB5dGhvbiBjb3JlLiBUaGlzIGlzIGFsc28gc3RpbGwKICAgICAgKiBuZWVkZWQgbm93YWRheXMgZm9yIFB5dGhvbiAyLjMvMi40LgogICAgICAqIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5oIGIvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5oCmluZGV4IGFkYTZiNGMuLmIxNGJlMmEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuaAorKysgYi9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmgKQEAgLTEsNiArMSw2IEBACiAvKiBtb2R1bGUuaCAtIGRlZmluaXRpb25zIGZvciB0aGUgbW9kdWxlCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgogICoKQEAgLTI1LDcgKzI1LDcgQEAKICNkZWZpbmUgUFlTUUxJVEVfTU9EVUxFX0gKICNpbmNsdWRlICJQeXRob24uaCIKIAotI2RlZmluZSBQWVNRTElURV9WRVJTSU9OICIyLjMuMyIKKyNkZWZpbmUgUFlTUUxJVEVfVkVSU0lPTiAiMi40LjEiCiAKIGV4dGVybiBQeU9iamVjdCogcHlzcWxpdGVfRXJyb3I7CiBleHRlcm4gUHlPYmplY3QqIHB5c3FsaXRlX1dhcm5pbmc7CkBAIC01MSw2ICs1MSw3IEBACiBleHRlcm4gUHlPYmplY3QqIGNvbnZlcnRlcnM7CiAKIGV4dGVybiBpbnQgX2VuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzOworZXh0ZXJuIGludCBweXNxbGl0ZV9CYXNlVHlwZUFkYXB0ZWQ7CiAKICNkZWZpbmUgUEFSU0VfREVDTFRZUEVTIDEKICNkZWZpbmUgUEFSU0VfQ09MTkFNRVMgMgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL3N0YXRlbWVudC5jIGIvTW9kdWxlcy9fc3FsaXRlL3N0YXRlbWVudC5jCmluZGV4IDgzYzA3OTAuLjU1NmVhMDEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9zdGF0ZW1lbnQuYworKysgYi9Nb2R1bGVzL19zcWxpdGUvc3RhdGVtZW50LmMKQEAgLTEsNiArMSw2IEBACiAvKiBzdGF0ZW1lbnQuYyAtIHRoZSBzdGF0ZW1lbnQgdHlwZQogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA3IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KICAqCkBAIC00MCw2ICs0MCwxNiBAQAogICAgIE5PUk1BTAogfSBwYXJzZV9yZW1haW5pbmdfc3FsX3N0YXRlOwogCit0eXBlZGVmIGVudW0geworICAgIFRZUEVfSU5ULAorICAgIFRZUEVfTE9ORywKKyAgICBUWVBFX0ZMT0FULAorICAgIFRZUEVfU1RSSU5HLAorICAgIFRZUEVfVU5JQ09ERSwKKyAgICBUWVBFX0JVRkZFUiwKKyAgICBUWVBFX1VOS05PV04KK30gcGFyYW1ldGVyX3R5cGU7CisKIGludCBweXNxbGl0ZV9zdGF0ZW1lbnRfY3JlYXRlKHB5c3FsaXRlX1N0YXRlbWVudCogc2VsZiwgcHlzcWxpdGVfQ29ubmVjdGlvbiogY29ubmVjdGlvbiwgUHlPYmplY3QqIHNxbCkKIHsKICAgICBjb25zdCBjaGFyKiB0YWlsOwpAQCAtOTcsNDIgKzEwNyw5NiBAQAogICAgIGNoYXIqIHN0cmluZzsKICAgICBQeV9zc2l6ZV90IGJ1ZmxlbjsKICAgICBQeU9iamVjdCogc3RyaW5ndmFsOworICAgIHBhcmFtZXRlcl90eXBlIHBhcmFtdHlwZTsKIAogICAgIGlmIChwYXJhbWV0ZXIgPT0gUHlfTm9uZSkgewogICAgICAgICByYyA9IHNxbGl0ZTNfYmluZF9udWxsKHNlbGYtPnN0LCBwb3MpOwotICAgIH0gZWxzZSBpZiAoUHlJbnRfQ2hlY2socGFyYW1ldGVyKSkgewotICAgICAgICBsb25ndmFsID0gUHlJbnRfQXNMb25nKHBhcmFtZXRlcik7Ci0gICAgICAgIHJjID0gc3FsaXRlM19iaW5kX2ludDY0KHNlbGYtPnN0LCBwb3MsIChzcWxpdGVfaW50NjQpbG9uZ3ZhbCk7Ci0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLSAgICB9IGVsc2UgaWYgKFB5TG9uZ19DaGVjayhwYXJhbWV0ZXIpKSB7Ci0gICAgICAgIGxvbmdsb25ndmFsID0gUHlMb25nX0FzTG9uZ0xvbmcocGFyYW1ldGVyKTsKLSAgICAgICAgLyogaW4gdGhlIG92ZXJmbG93IGVycm9yIGNhc2UsIGxvbmdsb25ndmFsIGlzIC0xLCBhbmQgYW4gZXhjZXB0aW9uIGlzIHNldCAqLwotICAgICAgICByYyA9IHNxbGl0ZTNfYmluZF9pbnQ2NChzZWxmLT5zdCwgcG9zLCAoc3FsaXRlX2ludDY0KWxvbmdsb25ndmFsKTsKLSNlbmRpZgotICAgIH0gZWxzZSBpZiAoUHlGbG9hdF9DaGVjayhwYXJhbWV0ZXIpKSB7Ci0gICAgICAgIHJjID0gc3FsaXRlM19iaW5kX2RvdWJsZShzZWxmLT5zdCwgcG9zLCBQeUZsb2F0X0FzRG91YmxlKHBhcmFtZXRlcikpOwotICAgIH0gZWxzZSBpZiAoUHlCdWZmZXJfQ2hlY2socGFyYW1ldGVyKSkgewotICAgICAgICBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHBhcmFtZXRlciwgJmJ1ZmZlciwgJmJ1ZmxlbikgPT0gMCkgewotICAgICAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfYmxvYihzZWxmLT5zdCwgcG9zLCBidWZmZXIsIGJ1ZmxlbiwgU1FMSVRFX1RSQU5TSUVOVCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImNvdWxkIG5vdCBjb252ZXJ0IEJMT0IgdG8gYnVmZmVyIik7Ci0gICAgICAgICAgICByYyA9IC0xOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIFB5U3RyaW5nX0NoZWNrKHBhcmFtZXRlcikgewotICAgICAgICBzdHJpbmcgPSBQeVN0cmluZ19Bc1N0cmluZyhwYXJhbWV0ZXIpOwotICAgICAgICByYyA9IHNxbGl0ZTNfYmluZF90ZXh0KHNlbGYtPnN0LCBwb3MsIHN0cmluZywgLTEsIFNRTElURV9UUkFOU0lFTlQpOwotICAgIH0gZWxzZSBpZiBQeVVuaWNvZGVfQ2hlY2socGFyYW1ldGVyKSB7Ci0gICAgICAgIHN0cmluZ3ZhbCA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcocGFyYW1ldGVyKTsKLSAgICAgICAgc3RyaW5nID0gUHlTdHJpbmdfQXNTdHJpbmcoc3RyaW5ndmFsKTsKLSAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfdGV4dChzZWxmLT5zdCwgcG9zLCBzdHJpbmcsIC0xLCBTUUxJVEVfVFJBTlNJRU5UKTsKLSAgICAgICAgUHlfREVDUkVGKHN0cmluZ3ZhbCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgZ290byBmaW5hbDsKICAgICB9CiAKKyAgICBpZiAoUHlJbnRfQ2hlY2tFeGFjdChwYXJhbWV0ZXIpKSB7CisgICAgICAgIHBhcmFtdHlwZSA9IFRZUEVfSU5UOworICAgIH0gZWxzZSBpZiAoUHlMb25nX0NoZWNrRXhhY3QocGFyYW1ldGVyKSkgeworICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX0xPTkc7CisgICAgfSBlbHNlIGlmIChQeUZsb2F0X0NoZWNrRXhhY3QocGFyYW1ldGVyKSkgeworICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX0ZMT0FUOworICAgIH0gZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChwYXJhbWV0ZXIpKSB7CisgICAgICAgIHBhcmFtdHlwZSA9IFRZUEVfU1RSSU5HOworICAgIH0gZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrRXhhY3QocGFyYW1ldGVyKSkgeworICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX1VOSUNPREU7CisgICAgfSBlbHNlIGlmIChQeUJ1ZmZlcl9DaGVjayhwYXJhbWV0ZXIpKSB7CisgICAgICAgIHBhcmFtdHlwZSA9IFRZUEVfQlVGRkVSOworICAgIH0gZWxzZSBpZiAoUHlJbnRfQ2hlY2socGFyYW1ldGVyKSkgeworICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX0lOVDsKKyAgICB9IGVsc2UgaWYgKFB5TG9uZ19DaGVjayhwYXJhbWV0ZXIpKSB7CisgICAgICAgIHBhcmFtdHlwZSA9IFRZUEVfTE9ORzsKKyAgICB9IGVsc2UgaWYgKFB5RmxvYXRfQ2hlY2socGFyYW1ldGVyKSkgeworICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX0ZMT0FUOworICAgIH0gZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2socGFyYW1ldGVyKSkgeworICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX1NUUklORzsKKyAgICB9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhwYXJhbWV0ZXIpKSB7CisgICAgICAgIHBhcmFtdHlwZSA9IFRZUEVfVU5JQ09ERTsKKyAgICB9IGVsc2UgeworICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX1VOS05PV047CisgICAgfQorCisgICAgc3dpdGNoIChwYXJhbXR5cGUpIHsKKyAgICAgICAgY2FzZSBUWVBFX0lOVDoKKyAgICAgICAgICAgIGxvbmd2YWwgPSBQeUludF9Bc0xvbmcocGFyYW1ldGVyKTsKKyAgICAgICAgICAgIHJjID0gc3FsaXRlM19iaW5kX2ludDY0KHNlbGYtPnN0LCBwb3MsIChzcWxpdGVfaW50NjQpbG9uZ3ZhbCk7CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworICAgICAgICBjYXNlIFRZUEVfTE9ORzoKKyAgICAgICAgICAgIGxvbmdsb25ndmFsID0gUHlMb25nX0FzTG9uZ0xvbmcocGFyYW1ldGVyKTsKKyAgICAgICAgICAgIC8qIGluIHRoZSBvdmVyZmxvdyBlcnJvciBjYXNlLCBsb25nbG9uZ3ZhbCBpcyAtMSwgYW5kIGFuIGV4Y2VwdGlvbiBpcyBzZXQgKi8KKyAgICAgICAgICAgIHJjID0gc3FsaXRlM19iaW5kX2ludDY0KHNlbGYtPnN0LCBwb3MsIChzcWxpdGVfaW50NjQpbG9uZ2xvbmd2YWwpOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgY2FzZSBUWVBFX0ZMT0FUOgorICAgICAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfZG91YmxlKHNlbGYtPnN0LCBwb3MsIFB5RmxvYXRfQXNEb3VibGUocGFyYW1ldGVyKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUWVBFX1NUUklORzoKKyAgICAgICAgICAgIHN0cmluZyA9IFB5U3RyaW5nX0FTX1NUUklORyhwYXJhbWV0ZXIpOworICAgICAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfdGV4dChzZWxmLT5zdCwgcG9zLCBzdHJpbmcsIC0xLCBTUUxJVEVfVFJBTlNJRU5UKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRZUEVfVU5JQ09ERToKKyAgICAgICAgICAgIHN0cmluZ3ZhbCA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcocGFyYW1ldGVyKTsKKyAgICAgICAgICAgIHN0cmluZyA9IFB5U3RyaW5nX0FzU3RyaW5nKHN0cmluZ3ZhbCk7CisgICAgICAgICAgICByYyA9IHNxbGl0ZTNfYmluZF90ZXh0KHNlbGYtPnN0LCBwb3MsIHN0cmluZywgLTEsIFNRTElURV9UUkFOU0lFTlQpOworICAgICAgICAgICAgUHlfREVDUkVGKHN0cmluZ3ZhbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUWVBFX0JVRkZFUjoKKyAgICAgICAgICAgIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIocGFyYW1ldGVyLCAmYnVmZmVyLCAmYnVmbGVuKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfYmxvYihzZWxmLT5zdCwgcG9zLCBidWZmZXIsIGJ1ZmxlbiwgU1FMSVRFX1RSQU5TSUVOVCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiY291bGQgbm90IGNvbnZlcnQgQkxPQiB0byBidWZmZXIiKTsKKyAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFlQRV9VTktOT1dOOgorICAgICAgICAgICAgcmMgPSAtMTsKKyAgICB9CisKK2ZpbmFsOgogICAgIHJldHVybiByYzsKIH0KIAorLyogcmV0dXJucyAwIGlmIHRoZSBvYmplY3QgaXMgb25lIG9mIFB5dGhvbidzIGludGVybmFsIG9uZXMgdGhhdCBkb24ndCBuZWVkIHRvIGJlIGFkYXB0ZWQgKi8KK3N0YXRpYyBpbnQgX25lZWRfYWRhcHQoUHlPYmplY3QqIG9iaikKK3sKKyAgICBpZiAocHlzcWxpdGVfQmFzZVR5cGVBZGFwdGVkKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmIChQeUludF9DaGVja0V4YWN0KG9iaikgfHwgUHlMb25nX0NoZWNrRXhhY3Qob2JqKSAKKyAgICAgICAgICAgIHx8IFB5RmxvYXRfQ2hlY2tFeGFjdChvYmopIHx8IFB5U3RyaW5nX0NoZWNrRXhhY3Qob2JqKQorICAgICAgICAgICAgfHwgUHlVbmljb2RlX0NoZWNrRXhhY3Qob2JqKSB8fCBQeUJ1ZmZlcl9DaGVjayhvYmopKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KK30KKwogdm9pZCBweXNxbGl0ZV9zdGF0ZW1lbnRfYmluZF9wYXJhbWV0ZXJzKHB5c3FsaXRlX1N0YXRlbWVudCogc2VsZiwgUHlPYmplY3QqIHBhcmFtZXRlcnMpCiB7CiAgICAgUHlPYmplY3QqIGN1cnJlbnRfcGFyYW07CkBAIC0xNDcsNyArMjExLDU1IEBACiAgICAgbnVtX3BhcmFtc19uZWVkZWQgPSBzcWxpdGUzX2JpbmRfcGFyYW1ldGVyX2NvdW50KHNlbGYtPnN0KTsKICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0gICAgaWYgKFB5RGljdF9DaGVjayhwYXJhbWV0ZXJzKSkgeworICAgIGlmIChQeVR1cGxlX0NoZWNrRXhhY3QocGFyYW1ldGVycykgfHwgUHlMaXN0X0NoZWNrRXhhY3QocGFyYW1ldGVycykgfHwgKCFQeURpY3RfQ2hlY2socGFyYW1ldGVycykgJiYgUHlTZXF1ZW5jZV9DaGVjayhwYXJhbWV0ZXJzKSkpIHsKKyAgICAgICAgLyogcGFyYW1ldGVycyBwYXNzZWQgYXMgc2VxdWVuY2UgKi8KKyAgICAgICAgaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdChwYXJhbWV0ZXJzKSkgeworICAgICAgICAgICAgbnVtX3BhcmFtcyA9IFB5VHVwbGVfR0VUX1NJWkUocGFyYW1ldGVycyk7CisgICAgICAgIH0gZWxzZSBpZiAoUHlMaXN0X0NoZWNrRXhhY3QocGFyYW1ldGVycykpIHsKKyAgICAgICAgICAgIG51bV9wYXJhbXMgPSBQeUxpc3RfR0VUX1NJWkUocGFyYW1ldGVycyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBudW1fcGFyYW1zID0gUHlTZXF1ZW5jZV9TaXplKHBhcmFtZXRlcnMpOworICAgICAgICB9CisgICAgICAgIGlmIChudW1fcGFyYW1zICE9IG51bV9wYXJhbXNfbmVlZGVkKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQocHlzcWxpdGVfUHJvZ3JhbW1pbmdFcnJvciwgIkluY29ycmVjdCBudW1iZXIgb2YgYmluZGluZ3Mgc3VwcGxpZWQuIFRoZSBjdXJyZW50IHN0YXRlbWVudCB1c2VzICVkLCBhbmQgdGhlcmUgYXJlICVkIHN1cHBsaWVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BhcmFtc19uZWVkZWQsIG51bV9wYXJhbXMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFyYW1zOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChQeVR1cGxlX0NoZWNrRXhhY3QocGFyYW1ldGVycykpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50X3BhcmFtID0gUHlUdXBsZV9HRVRfSVRFTShwYXJhbWV0ZXJzLCBpKTsKKyAgICAgICAgICAgICAgICBQeV9YSU5DUkVGKGN1cnJlbnRfcGFyYW0pOworICAgICAgICAgICAgfSBlbHNlIGlmIChQeUxpc3RfQ2hlY2tFeGFjdChwYXJhbWV0ZXJzKSkgeworICAgICAgICAgICAgICAgIGN1cnJlbnRfcGFyYW0gPSBQeUxpc3RfR0VUX0lURU0ocGFyYW1ldGVycywgaSk7CisgICAgICAgICAgICAgICAgUHlfWElOQ1JFRihjdXJyZW50X3BhcmFtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY3VycmVudF9wYXJhbSA9IFB5U2VxdWVuY2VfR2V0SXRlbShwYXJhbWV0ZXJzLCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghY3VycmVudF9wYXJhbSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFfbmVlZF9hZGFwdChjdXJyZW50X3BhcmFtKSkgeworICAgICAgICAgICAgICAgIGFkYXB0ZWQgPSBjdXJyZW50X3BhcmFtOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhZGFwdGVkID0gbWljcm9wcm90b2NvbHNfYWRhcHQoY3VycmVudF9wYXJhbSwgKFB5T2JqZWN0KikmcHlzcWxpdGVfUHJlcGFyZVByb3RvY29sVHlwZSwgTlVMTCk7CisgICAgICAgICAgICAgICAgaWYgKGFkYXB0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGN1cnJlbnRfcGFyYW0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIGFkYXB0ZWQgPSBjdXJyZW50X3BhcmFtOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmMgPSBweXNxbGl0ZV9zdGF0ZW1lbnRfYmluZF9wYXJhbWV0ZXIoc2VsZiwgaSArIDEsIGFkYXB0ZWQpOworICAgICAgICAgICAgUHlfREVDUkVGKGFkYXB0ZWQpOworCisgICAgICAgICAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KHB5c3FsaXRlX0ludGVyZmFjZUVycm9yLCAiRXJyb3IgYmluZGluZyBwYXJhbWV0ZXIgJWQgLSBwcm9iYWJseSB1bnN1cHBvcnRlZCB0eXBlLiIsIGkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoUHlEaWN0X0NoZWNrKHBhcmFtZXRlcnMpKSB7CiAgICAgICAgIC8qIHBhcmFtZXRlcnMgcGFzc2VkIGFzIGRpY3Rpb25hcnkgKi8KICAgICAgICAgZm9yIChpID0gMTsgaSA8PSBudW1fcGFyYW1zX25lZWRlZDsgaSsrKSB7CiAgICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCkBAIC0xNTksMTkgKzI3MSwyNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBiaW5kaW5nX25hbWUrKzsgLyogc2tpcCBmaXJzdCBjaGFyICh0aGUgY29sb24pICovCi0gICAgICAgICAgICBjdXJyZW50X3BhcmFtID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcocGFyYW1ldGVycywgYmluZGluZ19uYW1lKTsKKyAgICAgICAgICAgIGlmIChQeURpY3RfQ2hlY2tFeGFjdChwYXJhbWV0ZXJzKSkgeworICAgICAgICAgICAgICAgIGN1cnJlbnRfcGFyYW0gPSBQeURpY3RfR2V0SXRlbVN0cmluZyhwYXJhbWV0ZXJzLCBiaW5kaW5nX25hbWUpOworICAgICAgICAgICAgICAgIFB5X1hJTkNSRUYoY3VycmVudF9wYXJhbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGN1cnJlbnRfcGFyYW0gPSBQeU1hcHBpbmdfR2V0SXRlbVN0cmluZyhwYXJhbWV0ZXJzLCAoY2hhciopYmluZGluZ19uYW1lKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghY3VycmVudF9wYXJhbSkgewogICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChweXNxbGl0ZV9Qcm9ncmFtbWluZ0Vycm9yLCAiWW91IGRpZCBub3Qgc3VwcGx5IGEgdmFsdWUgZm9yIGJpbmRpbmcgJWQuIiwgaSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBQeV9JTkNSRUYoY3VycmVudF9wYXJhbSk7Ci0gICAgICAgICAgICBhZGFwdGVkID0gbWljcm9wcm90b2NvbHNfYWRhcHQoY3VycmVudF9wYXJhbSwgKFB5T2JqZWN0KikmcHlzcWxpdGVfUHJlcGFyZVByb3RvY29sVHlwZSwgTlVMTCk7Ci0gICAgICAgICAgICBpZiAoYWRhcHRlZCkgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjdXJyZW50X3BhcmFtKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIGlmICghX25lZWRfYWRhcHQoY3VycmVudF9wYXJhbSkpIHsKICAgICAgICAgICAgICAgICBhZGFwdGVkID0gY3VycmVudF9wYXJhbTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWRhcHRlZCA9IG1pY3JvcHJvdG9jb2xzX2FkYXB0KGN1cnJlbnRfcGFyYW0sIChQeU9iamVjdCopJnB5c3FsaXRlX1ByZXBhcmVQcm90b2NvbFR5cGUsIE5VTEwpOworICAgICAgICAgICAgICAgIGlmIChhZGFwdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjdXJyZW50X3BhcmFtKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgICAgICBhZGFwdGVkID0gY3VycmVudF9wYXJhbTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJjID0gcHlzcWxpdGVfc3RhdGVtZW50X2JpbmRfcGFyYW1ldGVyKHNlbGYsIGksIGFkYXB0ZWQpOwpAQCAtMTgzLDM1ICszMDMsNyBAQAogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICAvKiBwYXJhbWV0ZXJzIHBhc3NlZCBhcyBzZXF1ZW5jZSAqLwotICAgICAgICBudW1fcGFyYW1zID0gUHlTZXF1ZW5jZV9MZW5ndGgocGFyYW1ldGVycyk7Ci0gICAgICAgIGlmIChudW1fcGFyYW1zICE9IG51bV9wYXJhbXNfbmVlZGVkKSB7Ci0gICAgICAgICAgICBQeUVycl9Gb3JtYXQocHlzcWxpdGVfUHJvZ3JhbW1pbmdFcnJvciwgIkluY29ycmVjdCBudW1iZXIgb2YgYmluZGluZ3Mgc3VwcGxpZWQuIFRoZSBjdXJyZW50IHN0YXRlbWVudCB1c2VzICVkLCBhbmQgdGhlcmUgYXJlICVkIHN1cHBsaWVkLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BhcmFtc19uZWVkZWQsIG51bV9wYXJhbXMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFyYW1zOyBpKyspIHsKLSAgICAgICAgICAgIGN1cnJlbnRfcGFyYW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0ocGFyYW1ldGVycywgaSk7Ci0gICAgICAgICAgICBpZiAoIWN1cnJlbnRfcGFyYW0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGFwdGVkID0gbWljcm9wcm90b2NvbHNfYWRhcHQoY3VycmVudF9wYXJhbSwgKFB5T2JqZWN0KikmcHlzcWxpdGVfUHJlcGFyZVByb3RvY29sVHlwZSwgTlVMTCk7Ci0KLSAgICAgICAgICAgIGlmIChhZGFwdGVkKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGN1cnJlbnRfcGFyYW0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICAgICAgICAgIGFkYXB0ZWQgPSBjdXJyZW50X3BhcmFtOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByYyA9IHB5c3FsaXRlX3N0YXRlbWVudF9iaW5kX3BhcmFtZXRlcihzZWxmLCBpICsgMSwgYWRhcHRlZCk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoYWRhcHRlZCk7Ci0KLSAgICAgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKLSAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQocHlzcWxpdGVfSW50ZXJmYWNlRXJyb3IsICJFcnJvciBiaW5kaW5nIHBhcmFtZXRlciAlZCAtIHByb2JhYmx5IHVuc3VwcG9ydGVkIHR5cGUuIiwgaSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAicGFyYW1ldGVycyBhcmUgb2YgdW5zdXBwb3J0ZWQgdHlwZSIpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL3V0aWwuYyBiL01vZHVsZXMvX3NxbGl0ZS91dGlsLmMKaW5kZXggNWU3OGQ1OC4uZTA2YzI5OSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL3V0aWwuYworKysgYi9Nb2R1bGVzL19zcWxpdGUvdXRpbC5jCkBAIC0xLDYgKzEsNiBAQAogLyogdXRpbC5jIC0gdmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9ucwogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA3IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KICAqCkBAIC00NSwxMCArNDUsMTUgQEAKICAqIENoZWNrcyB0aGUgU1FMaXRlIGVycm9yIGNvZGUgYW5kIHNldHMgdGhlIGFwcHJvcHJpYXRlIERCLUFQSSBleGNlcHRpb24uCiAgKiBSZXR1cm5zIHRoZSBlcnJvciBjb2RlICgwIG1lYW5zIG5vIGVycm9yIG9jY3VycmVkKS4KICAqLwotaW50IF9weXNxbGl0ZV9zZXRlcnJvcihzcWxpdGUzKiBkYikKK2ludCBfcHlzcWxpdGVfc2V0ZXJyb3Ioc3FsaXRlMyogZGIsIHNxbGl0ZTNfc3RtdCogc3QpCiB7CiAgICAgaW50IGVycm9yY29kZTsKIAorICAgIC8qIFNRTGl0ZSBvZnRlbiBkb2Vzbid0IHJlcG9ydCBhbnl0aGluZyB1c2VmdWwsIHVubGVzcyB5b3UgcmVzZXQgdGhlIHN0YXRlbWVudCBmaXJzdCAqLworICAgIGlmIChzdCAhPSBOVUxMKSB7CisgICAgICAgICh2b2lkKXNxbGl0ZTNfcmVzZXQoc3QpOworICAgIH0KKwogICAgIGVycm9yY29kZSA9IHNxbGl0ZTNfZXJyY29kZShkYik7CiAKICAgICBzd2l0Y2ggKGVycm9yY29kZSkKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS91dGlsLmggYi9Nb2R1bGVzL19zcWxpdGUvdXRpbC5oCmluZGV4IDk2OWM1ZTUuLjZjMzQzMjkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS91dGlsLmgKKysrIGIvTW9kdWxlcy9fc3FsaXRlL3V0aWwuaApAQCAtMzQsNSArMzQsNSBAQAogICogQ2hlY2tzIHRoZSBTUUxpdGUgZXJyb3IgY29kZSBhbmQgc2V0cyB0aGUgYXBwcm9wcmlhdGUgREItQVBJIGV4Y2VwdGlvbi4KICAqIFJldHVybnMgdGhlIGVycm9yIGNvZGUgKDAgbWVhbnMgbm8gZXJyb3Igb2NjdXJyZWQpLgogICovCi1pbnQgX3B5c3FsaXRlX3NldGVycm9yKHNxbGl0ZTMqIGRiKTsKK2ludCBfcHlzcWxpdGVfc2V0ZXJyb3Ioc3FsaXRlMyogZGIsIHNxbGl0ZTNfc3RtdCogc3QpOwogI2VuZGlmCg==