ZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmEuY3BwIGIvY2FtZXJhL0NhbWVyYS5jcHAKaW5kZXggM2E5ZmI0Yy4uOWJmMzEzNCAxMDA2NDQKLS0tIGEvY2FtZXJhL0NhbWVyYS5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYS5jcHAKQEAgLTk3LDcgKzk3LDggQEAKICAgICAgICAgYy0+bVN0YXR1cyA9IE5PX0VSUk9SOwogICAgICAgICBjYW1lcmEgPSBjOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBjb25uZWN0aW5nIHRvIGNhbWVyYTogJWQiLCBjYW1lcmFJZCk7CisgICAgICAgIEFMT0dXKCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBjb25uZWN0aW5nIHRvIGNhbWVyYSAlZDogJWQgKCVzKSIsCisgICAgICAgICAgICAgICAgY2FtZXJhSWQsIHN0YXR1cywgc3RyZXJyb3IoLXN0YXR1cykpOwogICAgICAgICBjLmNsZWFyKCk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CmRpZmYgLS1naXQgYS9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwIGIvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmNwcAppbmRleCBlMjE2ZDI2Li5iOTZhODhmIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwCisrKyBiL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAKQEAgLTU4Myw3ICs1ODMsNyBAQAogICAgICAqLwogICAgIFdyaXRhYmxlQmxvYiBibG9iOwogICAgIGRvIHsKLSAgICAgICAgcmVzID0gZGF0YS53cml0ZUJsb2IoYmxvYlNpemUsICZibG9iKTsKKyAgICAgICAgcmVzID0gZGF0YS53cml0ZUJsb2IoYmxvYlNpemUsIGZhbHNlLCAmYmxvYik7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuY3BwIGIvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlLmNwcAppbmRleCAwMDcxZTcwLi43YmIyNGVlIDEwMDY0NAotLS0gYS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuY3BwCisrKyBiL2NhbWVyYS9JQ2FtZXJhU2VydmljZS5jcHAKQEAgLTE3NSwxMCArMTc1LDEzIEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihjYW1lcmFJZCk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihjbGllbnRQYWNrYWdlTmFtZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihjbGllbnRVaWQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQm5DYW1lcmFTZXJ2aWNlOjpDT05ORUNULCBkYXRhLCAmcmVwbHkpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1czsKKyAgICAgICAgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEJuQ2FtZXJhU2VydmljZTo6Q09OTkVDVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKIAogICAgICAgICBpZiAocmVhZEV4Y2VwdGlvbkNvZGUocmVwbHkpKSByZXR1cm4gLUVQUk9UTzsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICBpZiAocmVwbHkucmVhZEludDMyKCkgIT0gMCkgewogICAgICAgICAgICAgZGV2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SUNhbWVyYT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICAgICAgfQpAQCAtMTk4LDEwICsyMDEsMTMgQEAKICAgICAgICAgZGF0YS53cml0ZUludDMyKGhhbFZlcnNpb24pOwogICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYoY2xpZW50UGFja2FnZU5hbWUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoY2xpZW50VWlkKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEJuQ2FtZXJhU2VydmljZTo6Q09OTkVDVF9MRUdBQ1ksIGRhdGEsICZyZXBseSk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQm5DYW1lcmFTZXJ2aWNlOjpDT05ORUNUX0xFR0FDWSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKIAogICAgICAgICBpZiAocmVhZEV4Y2VwdGlvbkNvZGUocmVwbHkpKSByZXR1cm4gLUVQUk9UTzsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICBpZiAocmVwbHkucmVhZEludDMyKCkgIT0gMCkgewogICAgICAgICAgICAgZGV2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SUNhbWVyYT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICAgICAgfQpAQCAtMjM3LDEwICsyNDMsMTMgQEAKICAgICAgICAgZGF0YS53cml0ZUludDMyKGNhbWVyYUlkKTsKICAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KGNsaWVudFBhY2thZ2VOYW1lKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGNsaWVudFVpZCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChCbkNhbWVyYVNlcnZpY2U6OkNPTk5FQ1RfREVWSUNFLCBkYXRhLCAmcmVwbHkpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1czsKKyAgICAgICAgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEJuQ2FtZXJhU2VydmljZTo6Q09OTkVDVF9ERVZJQ0UsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CiAKICAgICAgICAgaWYgKHJlYWRFeGNlcHRpb25Db2RlKHJlcGx5KSkgcmV0dXJuIC1FUFJPVE87Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgaWYgKHJlcGx5LnJlYWRJbnQzMigpICE9IDApIHsKICAgICAgICAgICAgIGRldmljZSA9IGludGVyZmFjZV9jYXN0PElDYW1lcmFEZXZpY2VVc2VyPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5jcHAgYi9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5jcHAKaW5kZXggOTcwMDI1OC4uYTc1NDlmMiAxMDA2NDQKLS0tIGEvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuY3BwCisrKyBiL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmNwcApAQCAtMTkwLDExICsxOTAsMTMgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5kQ29uZmlndXJlKCkKKyAgICB2aXJ0dWFsIHN0YXR1c190IGVuZENvbmZpZ3VyZShib29sIGlzQ29uc3RyYWluZWRIaWdoU3BlZWQpCiAgICAgewogICAgICAgICBBTE9HVigiZW5kQ29uZmlndXJlIik7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFEZXZpY2VVc2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCk7CisKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEVORF9DT05GSUdVUkUsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKQEAgLTU1Niw4ICs1NTgsOSBAQAogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEVORF9DT05GSUdVUkU6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhRGV2aWNlVXNlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlbmRDb25maWd1cmUoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlbmRDb25maWd1cmUoaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFBSRVBBUkU6IHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuaCBiL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuaAppbmRleCA2MTliMTYxLi5iM2RkMTQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmgKKysrIGIvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oCkBAIC05Nyw3ICs5Nyw3IEBACiAgICAgICogbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSByZXF1ZXN0cyBjYW4gYmUgc3VibWl0dGVkLgogICAgICAqIDxwPgogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGVuZENvbmZpZ3VyZSgpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBlbmRDb25maWd1cmUoYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkID0gZmFsc2UpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGRlbGV0ZVN0cmVhbShpbnQgc3RyZWFtSWQpID0gMDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAppbmRleCAzZWZhNzRjLi5jMGJjNTE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaApAQCAtNDMsMjIgKzQzLDMwIEBACiAgICAgICovCiAgICAgZW51bSBldmVudF90eXBlIHsKICAgICAgICAgRVZFTlRfTU9SRV9EQVRBID0gMCwgICAgICAgIC8vIFJlcXVlc3QgdG8gd3JpdGUgbW9yZSBkYXRhIHRvIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZXZlbnQgb25seSBvY2N1cnMgZm9yIFRSQU5TRkVSX0NBTExCQUNLLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBldmVudCBpcyBkZWxpdmVyZWQgYnV0IHRoZSBjYWxsYmFjayBoYW5kbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb2VzIG5vdCB3YW50IHRvIHdyaXRlIG1vcmUgZGF0YSwgdGhlIGhhbmRsZXIgbXVzdCBleHBsaWNpdGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb2VzIG5vdCB3YW50IHRvIHdyaXRlIG1vcmUgZGF0YSwgdGhlIGhhbmRsZXIgbXVzdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoZSBldmVudCBieSBzZXR0aW5nIGZyYW1lQ291bnQgdG8gemVyby4KLSAgICAgICAgRVZFTlRfVU5ERVJSVU4gPSAxLCAgICAgICAgIC8vIEJ1ZmZlciB1bmRlcnJ1biBvY2N1cnJlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbWlnaHQgb2NjdXIsIGZvciBleGFtcGxlLCBpZiB0aGUgYXBwbGljYXRpb24gaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXRpbmcgZm9yIHNvdXJjZSBkYXRhIG9yIGlzIGF0IHRoZSBlbmQgb2Ygc3RyZWFtLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBkYXRhIGZpbGxpbmcsIGl0IGlzIHByZWZlcnJlZCB0aGF0IHRoZSBjYWxsYmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lcyBub3QgYmxvY2sgYW5kIGluc3RlYWQgcmV0dXJucyBhIHNob3J0IGNvdW50IG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYW1vdW50IG9mIGRhdGEgYWN0dWFsbHkgZGVsaXZlcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAob3IgMCwgaWYgbm8gZGF0YSBpcyBjdXJyZW50bHkgYXZhaWxhYmxlKS4KKyAgICAgICAgRVZFTlRfVU5ERVJSVU4gPSAxLCAgICAgICAgIC8vIEJ1ZmZlciB1bmRlcnJ1biBvY2N1cnJlZC4gVGhpcyB3aWxsIG5vdCBvY2N1ciBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXRpYyB0cmFja3MuCiAgICAgICAgIEVWRU5UX0xPT1BfRU5EID0gMiwgICAgICAgICAvLyBTYW1wbGUgbG9vcCBlbmQgd2FzIHJlYWNoZWQ7IHBsYXliYWNrIHJlc3RhcnRlZCBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb29wIHN0YXJ0IGlmIGxvb3AgY291bnQgd2FzIG5vdCAwLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9vcCBzdGFydCBpZiBsb29wIGNvdW50IHdhcyBub3QgMCBmb3IgYSBzdGF0aWMgdHJhY2suCiAgICAgICAgIEVWRU5UX01BUktFUiA9IDMsICAgICAgICAgICAvLyBQbGF5YmFjayBoZWFkIGlzIGF0IHRoZSBzcGVjaWZpZWQgbWFya2VyIHBvc2l0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoU2VlIHNldE1hcmtlclBvc2l0aW9uKCkpLgogICAgICAgICBFVkVOVF9ORVdfUE9TID0gNCwgICAgICAgICAgLy8gUGxheWJhY2sgaGVhZCBpcyBhdCBhIG5ldyBwb3NpdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKFNlZSBzZXRQb3NpdGlvblVwZGF0ZVBlcmlvZCgpKS4KLSAgICAgICAgRVZFTlRfQlVGRkVSX0VORCA9IDUsICAgICAgIC8vIFBsYXliYWNrIGhlYWQgaXMgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90IGN1cnJlbnRseSB1c2VkIGJ5IGFuZHJvaWQubWVkaWEuQXVkaW9UcmFjay4KKyAgICAgICAgRVZFTlRfQlVGRkVSX0VORCA9IDUsICAgICAgIC8vIFBsYXliYWNrIGhhcyBjb21wbGV0ZWQgZm9yIGEgc3RhdGljIHRyYWNrLgogICAgICAgICBFVkVOVF9ORVdfSUFVRElPVFJBQ0sgPSA2LCAgLy8gSUF1ZGlvVHJhY2sgd2FzIHJlLWNyZWF0ZWQsIGVpdGhlciBkdWUgdG8gcmUtcm91dGluZyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZvbHVudGFyeSBpbnZhbGlkYXRpb24gYnkgbWVkaWFzZXJ2ZXIsIG9yIG1lZGlhc2VydmVyIGNyYXNoLgogICAgICAgICBFVkVOVF9TVFJFQU1fRU5EID0gNywgICAgICAgLy8gU2VudCBhZnRlciBhbGwgdGhlIGJ1ZmZlcnMgcXVldWVkIGluIEFGIGFuZCBIVyBhcmUgcGxheWVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrIChhZnRlciBzdG9wIGlzIGNhbGxlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2sgKGFmdGVyIHN0b3AgaXMgY2FsbGVkKSBmb3IgYW4gb2ZmbG9hZGVkIHRyYWNrLgogI2lmIDAgICAvLyBGSVhNRSBub3QgeWV0IGltcGxlbWVudGVkCiAgICAgICAgIEVWRU5UX05FV19USU1FU1RBTVAgPSA4LCAgICAvLyBEZWxpdmVyZWQgcGVyaW9kaWNhbGx5IGFuZCB3aGVuIHRoZXJlJ3MgYSBzaWduaWZpY2FudCBjaGFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBtYXBwaW5nIGZyb20gZnJhbWUgcG9zaXRpb24gdG8gcHJlc2VudGF0aW9uIHRpbWUuCkBAIC04ODYsNiArODk0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHVzZWQgZm9yIG9mZmxvYWRlZCBhbmQgZGlyZWN0IHRyYWNrcy4KIAogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c1RpbWVzdGFtcFZhbGlkOy8vIHRydWUgaWYgbVByZXZpb3VzVGltZXN0YW1wIGlzIHZhbGlkCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFN0YXJ0dXBHbGl0Y2hSZXBvcnRlZDsgLy8gcmVkdWNlIGxvZyBzcGFtCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVJldHJvZ3JhZGVNb3Rpb25SZXBvcnRlZDsgLy8gcmVkdWNlIGxvZyBzcGFtCiAgICAgQXVkaW9UaW1lc3RhbXAgICAgICAgICAgbVByZXZpb3VzVGltZXN0YW1wOyAgICAgLy8gdXNlZCB0byBkZXRlY3QgcmV0cm9ncmFkZSBtb3Rpb24KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JT01YLmggYi9pbmNsdWRlL21lZGlhL0lPTVguaAppbmRleCA4NGZkZjgzLi43MDIzNDUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lPTVguaAorKysgYi9pbmNsdWRlL21lZGlhL0lPTVguaApAQCAtMjUsNiArMjUsOCBAQAogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKKyNpbmNsdWRlIDxsaXN0PgorCiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmg+CiAKICNpbmNsdWRlIDxPTVhfQ29yZS5oPgpAQCAtMjMxLDcgKzIzMyw4IEBACiBwdWJsaWM6CiAgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShPTVhPYnNlcnZlcik7CiAKLSAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlKGNvbnN0IG9teF9tZXNzYWdlICZtc2cpID0gMDsKKyAgICAvLyBIYW5kbGUgKGxpc3Qgb2YpIG1lc3NhZ2VzLgorICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VzKGNvbnN0IHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT4gJm1lc3NhZ2VzKSA9IDA7CiB9OwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oCmluZGV4IDQ2ZjkwMGUuLmRlODI1NTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmgKQEAgLTExNCw3ICsxMTQsOCBAQAogICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSA9IE5VTEwsCiAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwsCi0gICAgICAgICAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCA9IGZhbHNlKSA9IDA7CisgICAgICAgICAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgIHVpbnQzMl90IHN1Z2dlc3RlZEZyYW1lQ291bnQgPSAwKSA9IDA7CiAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydCgpID0gMDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKaW5kZXggZjdhM2RmNy4uZDQ4OTFhMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCkBAIC0xMDksNiArMTA5LDcgQEAKICAgICBlbnVtIHsKICAgICAgICAga1doYXRTZXR1cCAgICAgICAgICAgICAgICAgICA9ICdzZXR1JywKICAgICAgICAga1doYXRPTVhNZXNzYWdlICAgICAgICAgICAgICA9ICdvbXggJywKKyAgICAgICAga1doYXRPTVhNZXNzYWdlTGlzdCAgICAgICAgICA9ICdvbXhMJywKICAgICAgICAga1doYXRJbnB1dEJ1ZmZlckZpbGxlZCAgICAgICA9ICdpbnBGJywKICAgICAgICAga1doYXRPdXRwdXRCdWZmZXJEcmFpbmVkICAgICA9ICdvdXREJywKICAgICAgICAga1doYXRTaHV0ZG93biAgICAgICAgICAgICAgICA9ICdzaHV0JywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFjay5jcHAKaW5kZXggMDcwYmFhMS4uODFhZTZkNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFjay5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFjay5jcHAKQEAgLTM4LDExICszOCwyMyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKKy8vIFRPRE86IE1vdmUgdG8gYSBzZXBhcmF0ZSAuaAorCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNvbnN0IFQgJm1pbihjb25zdCBUICZ4LCBjb25zdCBUICZ5KSB7CitzdGF0aWMgaW5saW5lIGNvbnN0IFQgJm1pbihjb25zdCBUICZ4LCBjb25zdCBUICZ5KSB7CiAgICAgcmV0dXJuIHggPCB5ID8geCA6IHk7CiB9CiAKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIGlubGluZSBjb25zdCBUICZtYXgoY29uc3QgVCAmeCwgY29uc3QgVCAmeSkgeworICAgIHJldHVybiB4ID4geSA/IHggOiB5OworfQorCitzdGF0aWMgaW5saW5lIG5zZWNzX3QgZnJhbWVzVG9OYW5vc2Vjb25kcyhzc2l6ZV90IGZyYW1lcywgdWludDMyX3Qgc2FtcGxlUmF0ZSwgZmxvYXQgc3BlZWQpCit7CisgICAgcmV0dXJuICgoZG91YmxlKWZyYW1lcyAqIDEwMDAwMDAwMDApIC8gKChkb3VibGUpc2FtcGxlUmF0ZSAqIHNwZWVkKTsKK30KKwogc3RhdGljIGludDY0X3QgY29udmVydFRpbWVzcGVjVG9Vcyhjb25zdCBzdHJ1Y3QgdGltZXNwZWMgJnR2KQogewogICAgIHJldHVybiB0di50dl9zZWMgKiAxMDAwMDAwbGwgKyB0di50dl9uc2VjIC8gMTAwMDsKQEAgLTQ4MCw2ICs0OTIsOCBAQAogICAgIG1PYnNlcnZlZFNlcXVlbmNlID0gbVNlcXVlbmNlOwogICAgIG1JblVuZGVycnVuID0gZmFsc2U7CiAgICAgbVByZXZpb3VzVGltZXN0YW1wVmFsaWQgPSBmYWxzZTsKKyAgICBtVGltZXN0YW1wU3RhcnR1cEdsaXRjaFJlcG9ydGVkID0gZmFsc2U7CisgICAgbVJldHJvZ3JhZGVNb3Rpb25SZXBvcnRlZCA9IGZhbHNlOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtNTA3LDYgKzUyMSw4IEBACiAgICAgICAgIC8vIHJlc2V0IGN1cnJlbnQgcG9zaXRpb24gYXMgc2VlbiBieSBjbGllbnQgdG8gMAogICAgICAgICBtUG9zaXRpb24gPSAwOwogICAgICAgICBtUHJldmlvdXNUaW1lc3RhbXBWYWxpZCA9IGZhbHNlOworICAgICAgICBtVGltZXN0YW1wU3RhcnR1cEdsaXRjaFJlcG9ydGVkID0gZmFsc2U7CisgICAgICAgIG1SZXRyb2dyYWRlTW90aW9uUmVwb3J0ZWQgPSBmYWxzZTsKIAogICAgICAgICAvLyBGb3Igb2ZmbG9hZGVkIHRyYWNrcywgd2UgZG9uJ3Qga25vdyBpZiB0aGUgaGFyZHdhcmUgY291bnRlcnMgYXJlIHJlYWxseSB6ZXJvIGhlcmUsCiAgICAgICAgIC8vIHNpbmNlIHRoZSBmbHVzaCBpcyBhc3luY2hyb25vdXMgYW5kIHN0b3AgbWF5IG5vdCBmdWxseSBkcmFpbi4KQEAgLTE3NTksNyArMTc3NSw3IEBACiAgICAgLy8gQ2FjaGUgb3RoZXIgZmllbGRzIHRoYXQgd2lsbCBiZSBuZWVkZWQgc29vbgogICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKICAgICBmbG9hdCBzcGVlZCA9IG1QbGF5YmFja1JhdGUubVNwZWVkOwotICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IG1Ob3RpZmljYXRpb25GcmFtZXNBY3Q7CisgICAgY29uc3QgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdDsKICAgICBpZiAobVJlZnJlc2hSZW1haW5pbmcpIHsKICAgICAgICAgbVJlZnJlc2hSZW1haW5pbmcgPSBmYWxzZTsKICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcyA9IG5vdGlmaWNhdGlvbkZyYW1lczsKQEAgLTE3OTcsNyArMTgxMywxNCBAQAogCiAgICAgbUxvY2sudW5sb2NrKCk7CiAKKyAgICAvLyBnZXQgYW5jaG9yIHRpbWUgdG8gYWNjb3VudCBmb3IgY2FsbGJhY2tzLgorICAgIGNvbnN0IG5zZWNzX3QgdGltZUJlZm9yZUNhbGxiYWNrcyA9IHN5c3RlbVRpbWUoKTsKKwogICAgIGlmICh3YWl0U3RyZWFtRW5kKSB7CisgICAgICAgIC8vIEZJWE1FOiAgSW5zdGVhZCBvZiBibG9ja2luZyBpbiBwcm94eS0+d2FpdFN0cmVhbUVuZERvbmUoKSwgQ2FsbGJhY2sgdGhyZWFkCisgICAgICAgIC8vIHNob3VsZCB3YWl0IG9uIHByb3h5IGZ1dGV4IGFuZCBoYW5kbGUgQ0JMS19TVFJFQU1fRU5EX0RPTkUgd2l0aGluIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgLy8gKGFuZCBtYWtlIHN1cmUgd2UgZG9uJ3QgY2FsbGJhY2sgZm9yIG1vcmUgZGF0YSB3aGlsZSB3ZSdyZSBzdG9wcGluZykuCisgICAgICAgIC8vIFRoaXMgaGVscHMgd2l0aCBwb3NpdGlvbiwgbWFya2VyIG5vdGlmaWNhdGlvbnMsIGFuZCB0cmFjayBpbnZhbGlkYXRpb24uCiAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyB0aW1lb3V0OwogICAgICAgICB0aW1lb3V0LnR2X3NlYyA9IFdBSVRfU1RSRUFNX0VORF9USU1FT1VUX1NFQzsKICAgICAgICAgdGltZW91dC50dl9uc2VjID0gMDsKQEAgLTE4ODIsMTIgKzE5MDUsMTcgQEAKICAgICAgICAgbWluRnJhbWVzID0ga1BvbGwgKiBub3RpZmljYXRpb25GcmFtZXM7CiAgICAgfQogCisgICAgLy8gVGhpcyAiZnVkZ2UgZmFjdG9yIiBhdm9pZHMgc29ha2luZyBDUFUsIGFuZCBjb21wZW5zYXRlcyBmb3IgbGF0ZSBwcm9ncmVzcyBieSBzZXJ2ZXIKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrV2FpdFBlcmlvZE5zID0gV0FJVF9QRVJJT0RfTVMgKiAxMDAwMDAwTEw7CisgICAgY29uc3QgbnNlY3NfdCB0aW1lQWZ0ZXJDYWxsYmFja3MgPSBzeXN0ZW1UaW1lKCk7CisKICAgICAvLyBDb252ZXJ0IGZyYW1lIHVuaXRzIHRvIHRpbWUgdW5pdHMKICAgICBuc2Vjc190IG5zID0gTlNfV0hFTkVWRVI7CiAgICAgaWYgKG1pbkZyYW1lcyAhPSAodWludDMyX3QpIH4wKSB7Ci0gICAgICAgIC8vIFRoaXMgImZ1ZGdlIGZhY3RvciIgYXZvaWRzIHNvYWtpbmcgQ1BVLCBhbmQgY29tcGVuc2F0ZXMgZm9yIGxhdGUgcHJvZ3Jlc3MgYnkgc2VydmVyCi0gICAgICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtGdWRnZU5zID0gMTAwMDAwMDBMTDsgLy8gMTAgbXMKLSAgICAgICAgbnMgPSAoKGRvdWJsZSltaW5GcmFtZXMgKiAxMDAwMDAwMDAwKSAvICgoZG91YmxlKXNhbXBsZVJhdGUgKiBzcGVlZCkgKyBrRnVkZ2VOczsKKyAgICAgICAgbnMgPSBmcmFtZXNUb05hbm9zZWNvbmRzKG1pbkZyYW1lcywgc2FtcGxlUmF0ZSwgc3BlZWQpICsga1dhaXRQZXJpb2ROczsKKyAgICAgICAgbnMgLT0gKHRpbWVBZnRlckNhbGxiYWNrcyAtIHRpbWVCZWZvcmVDYWxsYmFja3MpOyAgLy8gYWNjb3VudCBmb3IgY2FsbGJhY2sgdGltZQorICAgICAgICAvLyBUT0RPOiBTaG91bGQgd2Ugd2FybiBpZiB0aGUgY2FsbGJhY2sgdGltZSBpcyB0b28gbG9uZz8KKyAgICAgICAgaWYgKG5zIDwgMCkgbnMgPSAwOwogICAgIH0KIAogICAgIC8vIElmIG5vdCBzdXBwbHlpbmcgZGF0YSBieSBFVkVOVF9NT1JFX0RBVEEsIHRoZW4gd2UncmUgZG9uZQpAQCAtMTg5NSw2ICsxOTIzLDEzIEBACiAgICAgICAgIHJldHVybiBuczsKICAgICB9CiAKKyAgICAvLyBFVkVOVF9NT1JFX0RBVEEgY2FsbGJhY2sgaGFuZGxpbmcuCisgICAgLy8gVGltaW5nIGZvciBsaW5lYXIgcGNtIGF1ZGlvIGRhdGEgZm9ybWF0cyBjYW4gYmUgZGVyaXZlZCBkaXJlY3RseSBmcm9tIHRoZQorICAgIC8vIGJ1ZmZlciBmaWxsIGxldmVsLgorICAgIC8vIFRpbWluZyBmb3IgY29tcHJlc3NlZCBkYXRhIGlzIG5vdCBkaXJlY3RseSBhdmFpbGFibGUgZnJvbSB0aGUgYnVmZmVyIGZpbGwgbGV2ZWwsCisgICAgLy8gcmF0aGVyIGluZGlyZWN0bHkgZnJvbSB3YWl0aW5nIGZvciBibG9ja2luZyBtb2RlIGNhbGxiYWNrcyBvciB3YWl0aW5nIGZvciBvYnRhaW4oKQorICAgIC8vIHRvIHJldHVybiBhIGNlcnRhaW4gZmlsbCBsZXZlbC4KKwogICAgIHN0cnVjdCB0aW1lc3BlYyB0aW1lb3V0OwogICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqcmVxdWVzdGVkID0gJkNsaWVudFByb3h5OjprRm9yZXZlcjsKICAgICBpZiAobnMgIT0gTlNfV0hFTkVWRVIpIHsKQEAgLTE5MjUsMTIgKzE5NjAsMTUgQEAKICAgICAgICAgICAgIHJldHVybiBOU19ORVZFUjsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtUmV0cnlPblBhcnRpYWxCdWZmZXIgJiYgIWlzT2ZmbG9hZGVkKCkpIHsKKyAgICAgICAgaWYgKG1SZXRyeU9uUGFydGlhbEJ1ZmZlciAmJiBhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CiAgICAgICAgICAgICBtUmV0cnlPblBhcnRpYWxCdWZmZXIgPSBmYWxzZTsKICAgICAgICAgICAgIGlmIChhdmFpbCA8IG1SZW1haW5pbmdGcmFtZXMpIHsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IG15bnMgPSAoKGRvdWJsZSkobVJlbWFpbmluZ0ZyYW1lcyAtIGF2YWlsKSAqIDExMDAwMDAwMDApCi0gICAgICAgICAgICAgICAgICAgICAgICAvICgoZG91YmxlKXNhbXBsZVJhdGUgKiBzcGVlZCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5zIDwgMCB8fCBteW5zIDwgbnMpIHsKKyAgICAgICAgICAgICAgICBpZiAobnMgPiAwKSB7IC8vIGFjY291bnQgZm9yIG9idGFpbiB0aW1lCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5zZWNzX3QgdGltZU5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgbnMgPSBtYXgoKG5zZWNzX3QpMCwgbnMgLSAodGltZU5vdyAtIHRpbWVBZnRlckNhbGxiYWNrcykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuc2Vjc190IG15bnMgPSBmcmFtZXNUb05hbm9zZWNvbmRzKG1SZW1haW5pbmdGcmFtZXMgLSBhdmFpbCwgc2FtcGxlUmF0ZSwgc3BlZWQpOworICAgICAgICAgICAgICAgIGlmIChucyA8IDAgLyogTlNfV0hFTkVWRVIgKi8gfHwgbXlucyA8IG5zKSB7CiAgICAgICAgICAgICAgICAgICAgIG5zID0gbXluczsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIG5zOwpAQCAtMTk1Myw3ICsxOTkxLDQyIEBACiAgICAgICAgICAgICAvLyBLZWVwIHRoaXMgdGhyZWFkIGdvaW5nIHRvIGhhbmRsZSB0aW1lZCBldmVudHMgYW5kCiAgICAgICAgICAgICAvLyBzdGlsbCB0cnkgdG8gZ2V0IG1vcmUgZGF0YSBpbiBpbnRlcnZhbHMgb2YgV0FJVF9QRVJJT0RfTVMKICAgICAgICAgICAgIC8vIGJ1dCBkb24ndCBqdXN0IGxvb3AgYW5kIGJsb2NrIHRoZSBDUFUsIHNvIHdhaXQKLSAgICAgICAgICAgIHJldHVybiBXQUlUX1BFUklPRF9NUyAqIDEwMDAwMDBMTDsKKworICAgICAgICAgICAgLy8gbUNiZihFVkVOVF9NT1JFX0RBVEEsIC4uLikgbWlnaHQgZWl0aGVyCisgICAgICAgICAgICAvLyAoMSkgQmxvY2sgdW50aWwgaXQgY2FuIGZpbGwgdGhlIGJ1ZmZlciwgcmV0dXJuaW5nIDAgc2l6ZSBvbiBFT1MuCisgICAgICAgICAgICAvLyAoMikgQmxvY2sgdW50aWwgaXQgY2FuIGZpbGwgdGhlIGJ1ZmZlciwgcmV0dXJuaW5nIDAgZGF0YSAoc2lsZW5jZSkgb24gRU9TLgorICAgICAgICAgICAgLy8gKDMpIFJldHVybiAwIHNpemUgd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZSwgZG9lcyBub3Qgd2FpdCBmb3IgbW9yZSBkYXRhLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICgxKSBhbmQgKDIpIG9jY3VycyB3aXRoIEF1ZGlvUGxheWVyL0F3ZXNvbWVQbGF5ZXI7ICgzKSBvY2N1cnMgd2l0aCBOdVBsYXllci4KKyAgICAgICAgICAgIC8vIFdlIHRyeSB0byBjb21wdXRlIHRoZSB3YWl0IHRpbWUgdG8gYXZvaWQgYSB0aWdodCBzbGVlcC13YWl0IGN5Y2xlLAorICAgICAgICAgICAgLy8gZXNwZWNpYWxseSBmb3IgY2FzZSAoMykuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVGhlIGRlY2lzaW9uIHRvIHN1cHBvcnQgKDEpIGFuZCAoMikgYWZmZWN0IHRoZSBzaXppbmcgb2YgbVJlbWFpbmluZ0ZyYW1lcworICAgICAgICAgICAgLy8gYW5kIHRoaXMgbG9vcDsgd2hlcmVhcyBmb3IgY2FzZSAoMykgd2UgY291bGQgc2ltcGx5IGNoZWNrIG9uY2Ugd2l0aCB0aGUgZnVsbAorICAgICAgICAgICAgLy8gYnVmZmVyIHNpemUgYW5kIHNraXAgdGhlIGxvb3AgZW50aXJlbHkuCisKKyAgICAgICAgICAgIG5zZWNzX3QgbXluczsKKyAgICAgICAgICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgLy8gdGltZSB0byB3YWl0IGJhc2VkIG9uIGJ1ZmZlciBvY2N1cGFuY3kKKyAgICAgICAgICAgICAgICBjb25zdCBuc2Vjc190IGRhdGFucyA9IG1SZW1haW5pbmdGcmFtZXMgPD0gYXZhaWwgPyAwIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc1RvTmFub3NlY29uZHMobVJlbWFpbmluZ0ZyYW1lcyAtIGF2YWlsLCBzYW1wbGVSYXRlLCBzcGVlZCk7CisgICAgICAgICAgICAgICAgLy8gYXVkaW8gZmxpbmdlciB0aHJlYWQgYnVmZmVyIHNpemUgKFRPRE86IGFkanVzdCBmb3IgZmFzdCB0cmFja3MpCisgICAgICAgICAgICAgICAgY29uc3QgbnNlY3NfdCBhZm5zID0gZnJhbWVzVG9OYW5vc2Vjb25kcyhtQWZGcmFtZUNvdW50LCBtQWZTYW1wbGVSYXRlLCBzcGVlZCk7CisgICAgICAgICAgICAgICAgLy8gYWRkIGEgaGFsZiB0aGUgQXVkaW9GbGluZ2VyIGJ1ZmZlciB0aW1lIHRvIGF2b2lkIHNvYWtpbmcgQ1BVIGlmIGRhdGFucyBpcyAwLgorICAgICAgICAgICAgICAgIG15bnMgPSBkYXRhbnMgKyAoYWZucyAvIDIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogVGhpcyBjb3VsZCBwaW5nIHF1aXRlIGEgYml0IGlmIHRoZSBidWZmZXIgaXNuJ3QgZnVsbC4KKyAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2hlbiBtU3RhdGUgaXMgc3RvcHBpbmcgd2Ugd2FpdFN0cmVhbUVuZCwgc28gaXQgbmV2ZXIgZ2V0cyBoZXJlLgorICAgICAgICAgICAgICAgIG15bnMgPSBrV2FpdFBlcmlvZE5zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5zID4gMCkgeyAvLyBhY2NvdW50IGZvciBvYnRhaW4gYW5kIGNhbGxiYWNrIHRpbWUKKyAgICAgICAgICAgICAgICBjb25zdCBuc2Vjc190IHRpbWVOb3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICAgICAgICAgbnMgPSBtYXgoKG5zZWNzX3QpMCwgbnMgLSAodGltZU5vdyAtIHRpbWVBZnRlckNhbGxiYWNrcykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5zIDwgMCAvKiBOU19XSEVORVZFUiAqLyB8fCBteW5zIDwgbnMpIHsKKyAgICAgICAgICAgICAgICBucyA9IG15bnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnM7CiAgICAgICAgIH0KIAogICAgICAgICBzaXplX3QgcmVsZWFzZWRGcmFtZXMgPSB3cml0dGVuU2l6ZSAvIG1GcmFtZVNpemU7CkBAIC0yMTQ5LDcgKzIyMjIsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgYSBwZW5kaW5nIGZsdXNoIG9yIHN0b3AgaGFzIGNvbXBsZXRlZCwgYXMgdGhvc2UgY29tbWFuZHMgbWF5Ci0gICAgICAgIC8vIGJlIGFzeW5jaHJvbm91cyBvciByZXR1cm4gbmVhciBmaW5pc2guCisgICAgICAgIC8vIGJlIGFzeW5jaHJvbm91cyBvciByZXR1cm4gbmVhciBmaW5pc2ggb3IgZXhoaWJpdCBnbGl0Y2h5IGJlaGF2aW9yLgorICAgICAgICAvLworICAgICAgICAvLyBPcmlnaW5hbGx5IHRoaXMgc2hvd2VkIHVwIGFzIHRoZSBmaXJzdCB0aW1lc3RhbXAgYmVpbmcgYSBjb250aW51YXRpb24gb2YKKyAgICAgICAgLy8gdGhlIHByZXZpb3VzIHNvbmcgdW5kZXIgZ2FwbGVzcyBwbGF5YmFjay4KKyAgICAgICAgLy8gSG93ZXZlciwgd2Ugc29tZXRpbWVzIHNlZSB6ZXJvIHRpbWVzdGFtcHMsIHRoZW4gYSBnbGl0Y2ggb2YKKyAgICAgICAgLy8gdGhlIHByZXZpb3VzIHNvbmcncyBwb3NpdGlvbiwgYW5kIHRoZW4gY29ycmVjdCB0aW1lc3RhbXBzIGFmdGVyd2FyZHMuCiAgICAgICAgIGlmIChtU3RhcnRVcyAhPSAwICYmIG1TYW1wbGVSYXRlICE9IDApIHsKICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga1RpbWVKaXR0ZXJVcyA9IDEwMDAwMDsgLy8gMTAwIG1zCiAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IGsxU2VjVXMgPSAxMDAwMDAwOwpAQCAtMjE2NywxNiArMjI0NSwyOSBAQAogCiAgICAgICAgICAgICAgICAgaWYgKGRlbHRhUG9zaXRpb25CeVVzID4gZGVsdGFUaW1lVXMgKyBrVGltZUppdHRlclVzKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBjb3VudGVyIGNhbid0IGNvdW50IGZhc3RlciB0aGFuIHRoZSBzYW1wbGUgcmF0ZQotICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgc3RhcnQgdGltZS4gIElmIGdyZWF0ZXIsIHRoZW4gdGhhdCBtZWFucyB3ZSBoYXZlIGZhaWxlZAorICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgc3RhcnQgdGltZS4gIElmIGdyZWF0ZXIsIHRoZW4gdGhhdCBtZWFucyB3ZSBtYXkgaGF2ZSBmYWlsZWQKICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY29tcGxldGVseSBmbHVzaCBvciBzdG9wIHRoZSBwcmV2aW91cyBwbGF5aW5nIHRyYWNrLgotICAgICAgICAgICAgICAgICAgICBBTE9HVygiaW5jb21wbGV0ZSBmbHVzaCBvciBzdG9wOiIKKyAgICAgICAgICAgICAgICAgICAgQUxPR1dfSUYoIW1UaW1lc3RhbXBTdGFydHVwR2xpdGNoUmVwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldFRpbWVzdGFtcCBzdGFydHVwIGdsaXRjaCBkZXRlY3RlZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRlbHRhVGltZVVzKCVsbGQpIGRlbHRhUG9zaXRpb25VcyglbGxkKSB0c21Qb3NpdGlvbigldSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZGVsdGFUaW1lVXMsIChsb25nIGxvbmcpZGVsdGFQb3NpdGlvbkJ5VXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBTdGFydHVwR2xpdGNoUmVwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNUaW1lc3RhbXBWYWxpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1QcmV2aW91c1RpbWVzdGFtcC5tUG9zaXRpb24gPT0gMCAvKiBzaG91bGQgYmUgdHJ1ZSBpZiB2YWxpZCAqLykgeworICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wID0gbVByZXZpb3VzVGltZXN0YW1wOworICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzVGltZXN0YW1wVmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGRlbHRhUG9zaXRpb25CeVVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VXMgPSAwOyAvLyBkb24ndCBjaGVjayBhZ2Fpbiwgd2UgZ290IHZhbGlkIG5vbnplcm8gcG9zaXRpb24uCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU3RhcnRVcyA9IDA7IC8vIGRvbid0IGNoZWNrIGFnYWluLCBzdGFydCB0aW1lIGV4cGlyZWQuCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU3RhcnRVcyA9IDA7IC8vIG5vIG5lZWQgdG8gY2hlY2sgYWdhaW4sIHN0YXJ0IHRpbWVzdGFtcCBoYXMgZWl0aGVyIGV4cGlyZWQgb3IgdW5uZWVkZWQuCisgICAgICAgICAgICBtVGltZXN0YW1wU3RhcnR1cEdsaXRjaFJlcG9ydGVkID0gZmFsc2U7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICAvLyBVcGRhdGUgdGhlIG1hcHBpbmcgYmV0d2VlbiBsb2NhbCBjb25zdW1lZCAobVBvc2l0aW9uKSBhbmQgc2VydmVyIGNvbnN1bWVkIChtU2VydmVyKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JT01YLmNwcAppbmRleCBjYTFjZGM3Li4xNmRhNjVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JT01YLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JT01YLmNwcApAQCAtMTA3NywxNiArMTA3NywyOSBAQAogICAgICAgICA6IEJwSW50ZXJmYWNlPElPTVhPYnNlcnZlcj4oaW1wbCkgewogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2UoY29uc3Qgb214X21lc3NhZ2UgJm1zZykgeworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VzKGNvbnN0IHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT4gJm1lc3NhZ2VzKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVhPYnNlcnZlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZSgmbXNnLCBzaXplb2YobXNnKSk7Ci0gICAgICAgIGlmIChtc2cuZmVuY2VGZCA+PSAwKSB7Ci0gICAgICAgICAgICBkYXRhLndyaXRlRmlsZURlc2NyaXB0b3IobXNnLmZlbmNlRmQsIHRydWUgLyogdGFrZU93bmVyc2hpcCAqLyk7CisgICAgICAgIHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWVzc2FnZXMuY2JlZ2luKCk7CisgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICB3aGlsZSAoaXQgIT0gbWVzc2FnZXMuY2VuZCgpKSB7CisgICAgICAgICAgICBjb25zdCBvbXhfbWVzc2FnZSAmbXNnID0gKml0Kys7CisgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWE9ic2VydmVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihtc2cubm9kZSk7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihtc2cuZmVuY2VGZCA+PSAwKTsKKyAgICAgICAgICAgIGlmIChtc2cuZmVuY2VGZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgZGF0YS53cml0ZUZpbGVEZXNjcmlwdG9yKG1zZy5mZW5jZUZkLCB0cnVlIC8qIHRha2VPd25lcnNoaXAgKi8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKG1zZy50eXBlKTsKKyAgICAgICAgICAgIGRhdGEud3JpdGUoJm1zZy51LCBzaXplb2YobXNnLnUpKTsKKyAgICAgICAgICAgIEFMT0dWKCJvbk1lc3NhZ2Ugd3JpdGluZyBtZXNzYWdlICVkLCBzaXplICV6dSIsIG1zZy50eXBlLCBzaXplb2YobXNnKSk7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoIm9uTWVzc2FnZSB3cml0aW5nIG1lc3NhZ2UgJWQsIHNpemUgJXp1IiwgbXNnLnR5cGUsIHNpemVvZihtc2cpKTsKLQotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT0JTRVJWRVJfT05fTVNHLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKKyAgICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKC0xKTsgLy8gbWFyayBlbmQKKyAgICAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChPQlNFUlZFUl9PTl9NU0csIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOworICAgICAgICB9CiAgICAgfQogfTsKIApAQCAtMTA5OCwxOSArMTExMSwyOCBAQAogICAgICAgICBjYXNlIE9CU0VSVkVSX09OX01TRzoKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YT2JzZXJ2ZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIElPTVg6Om5vZGVfaWQgbm9kZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8b214X21lc3NhZ2U+IG1lc3NhZ2VzOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gRkFJTEVEX1RSQU5TQUNUSU9OOyAvLyBtdXN0IHJlY2VpdmUgYXQgbGVhc3Qgb25lIG1lc3NhZ2UKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgaGF2ZUZlbmNlID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgICAgICBpZiAoaGF2ZUZlbmNlIDwgMCkgeyAvLyB3ZSB1c2UgLTEgdG8gbWFyayBlbmQgb2YgbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9teF9tZXNzYWdlIG1zZzsKKyAgICAgICAgICAgICAgICBtc2cubm9kZSA9IG5vZGU7CisgICAgICAgICAgICAgICAgbXNnLmZlbmNlRmQgPSBoYXZlRmVuY2UgPyA6OmR1cChkYXRhLnJlYWRGaWxlRGVzY3JpcHRvcigpKSA6IC0xOworICAgICAgICAgICAgICAgIG1zZy50eXBlID0gKHR5cGVvZihtc2cudHlwZSkpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBkYXRhLnJlYWQoJm1zZy51LCBzaXplb2YobXNnLnUpKTsKKyAgICAgICAgICAgICAgICBBTE9HVigib25UcmFuc2FjdCByZWFkaW5nIG1lc3NhZ2UgJWQsIHNpemUgJXp1IiwgbXNnLnR5cGUsIHNpemVvZihtc2cpKTsKKyAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoX2JhY2sobXNnKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKGVyciA9PSBPSyk7CiAKLSAgICAgICAgICAgIG9teF9tZXNzYWdlIG1zZzsKLSAgICAgICAgICAgIGRhdGEucmVhZCgmbXNnLCBzaXplb2YobXNnKSk7Ci0gICAgICAgICAgICBpZiAobXNnLmZlbmNlRmQgPj0gMCkgewotICAgICAgICAgICAgICAgIG1zZy5mZW5jZUZkID0gOjpkdXAoZGF0YS5yZWFkRmlsZURlc2NyaXB0b3IoKSk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgb25NZXNzYWdlcyhtZXNzYWdlcyk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIEFMT0dWKCJvblRyYW5zYWN0IHJlYWRpbmcgbWVzc2FnZSAlZCwgc2l6ZSAlenUiLCBtc2cudHlwZSwgc2l6ZW9mKG1zZykpOwotCi0gICAgICAgICAgICAvLyBYWFggQ291bGQgdXNlIHJlYWRJbnBsYWNlIG1heWJlPwotICAgICAgICAgICAgb25NZXNzYWdlKG1zZyk7Ci0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KIAogICAgICAgICBkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAppbmRleCA3YzQwMTIxLi5jMGIzNWU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcApAQCAtMTQ4MiwyMCArMTQ4MiwxMSBAQAogICAgICAgICBBdWRpb0NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUsCiAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8sCi0gICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QpCisgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QsCisgICAgICAgIHVpbnQzMl90IHN1Z2dlc3RlZEZyYW1lQ291bnQpCiB7Ci0gICAgbUNhbGxiYWNrID0gY2I7Ci0gICAgbUNhbGxiYWNrQ29va2llID0gY29va2llOwotCi0gICAgLy8gQ2hlY2sgYXJndW1lbnQgImJ1ZmZlckNvdW50IiBhZ2FpbnN0IHRoZSBtaW5pbnVtIGJ1ZmZlciBjb3VudAotICAgIGlmIChidWZmZXJDb3VudCA8IG1NaW5CdWZmZXJDb3VudCkgewotICAgICAgICBBTE9HRCgiYnVmZmVyQ291bnQgKCVkKSBpcyB0b28gc21hbGwgYW5kIGluY3JlYXNlZCB0byAlZCIsIGJ1ZmZlckNvdW50LCBtTWluQnVmZmVyQ291bnQpOwotICAgICAgICBidWZmZXJDb3VudCA9IG1NaW5CdWZmZXJDb3VudDsKLQotICAgIH0KICAgICBBTE9HVigib3BlbigldSwgJWQsIDB4JXgsIDB4JXgsICVkLCAlZCAweCV4KSIsIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCwgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgZm9ybWF0LCBidWZmZXJDb3VudCwgbVNlc3Npb25JZCwgZmxhZ3MpOwotICAgIHNpemVfdCBmcmFtZUNvdW50OwogCiAgICAgLy8gb2ZmbG9hZGluZyBpcyBvbmx5IHN1cHBvcnRlZCBpbiBjYWxsYmFjayBtb2RlIGZvciBub3cuCiAgICAgLy8gb2ZmbG9hZEluZm8gbXVzdCBiZSBwcmVzZW50IGlmIG9mZmxvYWQgZmxhZyBpcyBzZXQKQEAgLTE1MDQsMjAgKzE0OTUsMzYgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKKyAgICAvLyBjb21wdXRlIGZyYW1lIGNvdW50IGZvciB0aGUgQXVkaW9UcmFjayBpbnRlcm5hbCBidWZmZXIKKyAgICBzaXplX3QgZnJhbWVDb3VudDsKICAgICBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgewogICAgICAgICBmcmFtZUNvdW50ID0gMDsgLy8gQXVkaW9UcmFjayB3aWxsIGdldCBmcmFtZSBjb3VudCBmcm9tIEF1ZGlvRmxpbmdlcgogICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHRyeSB0byBlc3RpbWF0ZSB0aGUgYnVmZmVyIHByb2Nlc3NpbmcgZmV0Y2ggc2l6ZSBmcm9tIEF1ZGlvRmxpbmdlci4KKyAgICAgICAgLy8gZnJhbWVzUGVyQnVmZmVyIGlzIGFwcHJveGltYXRlIGFuZCBnZW5lcmFsbHkgY29ycmVjdCwgZXhjZXB0IHdoZW4gaXQncyBub3QgOi0pLgogICAgICAgICB1aW50MzJfdCBhZlNhbXBsZVJhdGU7CiAgICAgICAgIHNpemVfdCBhZkZyYW1lQ291bnQ7Ci0KICAgICAgICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGcmFtZUNvdW50KCZhZkZyYW1lQ291bnQsIG1TdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUoJmFmU2FtcGxlUmF0ZSwgbVN0cmVhbVR5cGUpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICAgICAgfQorICAgICAgICBjb25zdCBzaXplX3QgZnJhbWVzUGVyQnVmZmVyID0KKyAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNhbXBsZVJhdGUgKiBhZkZyYW1lQ291bnQgLyBhZlNhbXBsZVJhdGU7CiAKLSAgICAgICAgZnJhbWVDb3VudCA9IChzYW1wbGVSYXRlKmFmRnJhbWVDb3VudCpidWZmZXJDb3VudCkvYWZTYW1wbGVSYXRlOworICAgICAgICBpZiAoYnVmZmVyQ291bnQgPT0gMCkgeworICAgICAgICAgICAgLy8gdXNlIHN1Z2dlc3RlZEZyYW1lQ291bnQKKyAgICAgICAgICAgIGJ1ZmZlckNvdW50ID0gKHN1Z2dlc3RlZEZyYW1lQ291bnQgKyBmcmFtZXNQZXJCdWZmZXIgLSAxKSAvIGZyYW1lc1BlckJ1ZmZlcjsKKyAgICAgICAgfQorICAgICAgICAvLyBDaGVjayBhcmd1bWVudCBidWZmZXJDb3VudCBhZ2FpbnN0IHRoZSBtaW5pbnVtIGJ1ZmZlciBjb3VudAorICAgICAgICBpZiAoYnVmZmVyQ291bnQgIT0gMCAmJiBidWZmZXJDb3VudCA8IG1NaW5CdWZmZXJDb3VudCkgeworICAgICAgICAgICAgQUxPR1YoImJ1ZmZlckNvdW50ICglZCkgaW5jcmVhc2VkIHRvICVkIiwgYnVmZmVyQ291bnQsIG1NaW5CdWZmZXJDb3VudCk7CisgICAgICAgICAgICBidWZmZXJDb3VudCA9IG1NaW5CdWZmZXJDb3VudDsKKyAgICAgICAgfQorICAgICAgICAvLyBpZiBmcmFtZUNvdW50IGlzIDAsIHRoZW4gQXVkaW9UcmFjayB3aWxsIGdldCBmcmFtZSBjb3VudCBmcm9tIEF1ZGlvRmxpbmdlcgorICAgICAgICAvLyB3aGljaCB3aWxsIGJlIHRoZSBtaW5pbXVtIHNpemUgcGVybWl0dGVkLgorICAgICAgICBmcmFtZUNvdW50ID0gYnVmZmVyQ291bnQgKiBmcmFtZXNQZXJCdWZmZXI7CiAgICAgfQogCiAgICAgaWYgKGNoYW5uZWxNYXNrID09IENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUikgewpAQCAtMTUyOCw2ICsxNTM1LDkgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIG1DYWxsYmFjayA9IGNiOworICAgIG1DYWxsYmFja0Nvb2tpZSA9IGNvb2tpZTsKKwogICAgIC8vIENoZWNrIHdoZXRoZXIgd2UgY2FuIHJlY3ljbGUgdGhlIHRyYWNrCiAgICAgYm9vbCByZXVzZSA9IGZhbHNlOwogICAgIGJvb2wgYm90aE9mZmxvYWRlZCA9IGZhbHNlOwpAQCAtMTc0NCwxMiArMTc1NCwxNCBAQAogdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpzdG9wKCkKIHsKICAgICBBTE9HVigic3RvcCIpOworICAgIG1CeXRlc1dyaXR0ZW4gPSAwOwogICAgIGlmIChtVHJhY2sgIT0gMCkgbVRyYWNrLT5zdG9wKCk7CiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6Zmx1c2goKQogewogICAgIEFMT0dWKCJmbHVzaCIpOworICAgIG1CeXRlc1dyaXR0ZW4gPSAwOwogICAgIGlmIChtVHJhY2sgIT0gMCkgbVRyYWNrLT5mbHVzaCgpOwogfQogCkBAIC0xODUxLDIwICsxODYzLDIzIEBACiAgICAgICAgICAgICAgICAgbWUsIGJ1ZmZlci0+cmF3LCBidWZmZXItPnNpemUsIG1lLT5tQ2FsbGJhY2tDb29raWUsCiAgICAgICAgICAgICAgICAgQ0JfRVZFTlRfRklMTF9CVUZGRVIpOwogCi0gICAgICAgIGlmICgobWUtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpID09IDAgJiYKLSAgICAgICAgICAgIGFjdHVhbFNpemUgPT0gMCAmJiBidWZmZXItPnNpemUgPiAwICYmIG1lLT5tTmV4dE91dHB1dCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyBXZSd2ZSByZWFjaGVkIEVPUyBidXQgdGhlIGF1ZGlvIHRyYWNrIGlzIG5vdCBzdG9wcGVkIHlldCwKLSAgICAgICAgICAgIC8vIGtlZXAgcGxheWluZyBzaWxlbmNlLgorICAgICAgICAvLyBMb2cgd2hlbiBubyBkYXRhIGlzIHJldHVybmVkIGZyb20gdGhlIGNhbGxiYWNrLgorICAgICAgICAvLyAoMSkgV2UgbWF5IGhhdmUgbm8gZGF0YSAoZXNwZWNpYWxseSB3aXRoIG5ldHdvcmsgc3RyZWFtaW5nIHNvdXJjZXMpLgorICAgICAgICAvLyAoMikgV2UgbWF5IGhhdmUgcmVhY2hlZCB0aGUgRU9TIGFuZCB0aGUgYXVkaW8gdHJhY2sgaXMgbm90IHN0b3BwZWQgeWV0LgorICAgICAgICAvLyBOb3RlIHRoYXQgQXdlc29tZVBsYXllci9BdWRpb1BsYXllciB3aWxsIG9ubHkgcmV0dXJuIHplcm8gc2l6ZSB3aGVuIGl0IHJlYWNoZXMgdGhlIEVPUy4KKyAgICAgICAgLy8gTnVQbGF5ZXJSZW5kZXJlciB3aWxsIHJldHVybiB6ZXJvIHdoZW4gaXQgZG9lc24ndCBoYXZlIGRhdGEgKGl0IGRvZXNuJ3QgYmxvY2sgdG8gZmlsbCkuCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoaXMgaXMgYSBiZW5pZ24gYnVzeS13YWl0LCB3aXRoIHRoZSBuZXh0IGRhdGEgcmVxdWVzdCBnZW5lcmF0ZWQgMTAgbXMgb3IgbW9yZSBsYXRlcjsKKyAgICAgICAgLy8gbmV2ZXJ0aGVsZXNzIGZvciBwb3dlciByZWFzb25zLCB3ZSBkb24ndCB3YW50IHRvIHNlZSB0b28gbWFueSBvZiB0aGVzZS4KIAotICAgICAgICAgICAgbWVtc2V0KGJ1ZmZlci0+cmF3LCAwLCBidWZmZXItPnNpemUpOwotICAgICAgICAgICAgYWN0dWFsU2l6ZSA9IGJ1ZmZlci0+c2l6ZTsKLSAgICAgICAgfQorICAgICAgICBBTE9HVl9JRihhY3R1YWxTaXplID09IDAgJiYgYnVmZmVyLT5zaXplID4gMCwgImNhbGxiYWNrd3JhcHBlcjogZW1wdHkgYnVmZmVyIHJldHVybmVkIik7CiAKKyAgICAgICAgbWUtPm1CeXRlc1dyaXR0ZW4gKz0gYWN0dWFsU2l6ZTsgIC8vIGJlbmlnbiByYWNlIHdpdGggcmVhZGVyLgogICAgICAgICBidWZmZXItPnNpemUgPSBhY3R1YWxTaXplOwogICAgICAgICB9IGJyZWFrOwogCi0KICAgICBjYXNlIEF1ZGlvVHJhY2s6OkVWRU5UX1NUUkVBTV9FTkQ6CisgICAgICAgIC8vIGN1cnJlbnRseSBvbmx5IG9jY3VycyBmb3Igb2ZmbG9hZGVkIGNhbGxiYWNrcwogICAgICAgICBBTE9HVigiY2FsbGJhY2t3cmFwcGVyOiBkZWxpdmVyIEVWRU5UX1NUUkVBTV9FTkQiKTsKICAgICAgICAgKCptZS0+bUNhbGxiYWNrKShtZSwgTlVMTCAvKiBidWZmZXIgKi8sIDAgLyogc2l6ZSAqLywKICAgICAgICAgICAgICAgICBtZS0+bUNhbGxiYWNrQ29va2llLCBDQl9FVkVOVF9TVFJFQU1fRU5EKTsKQEAgLTE4NzcsMTEgKzE4OTIsMTUgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEF1ZGlvVHJhY2s6OkVWRU5UX1VOREVSUlVOOgotICAgICAgICAvLyBUaGlzIG9jY3VycyB3aGVuIHRoZXJlIGlzIG5vIGRhdGEgYXZhaWxhYmxlLCB0eXBpY2FsbHkgb2NjdXJyaW5nCisgICAgICAgIC8vIFRoaXMgb2NjdXJzIHdoZW4gdGhlcmUgaXMgbm8gZGF0YSBhdmFpbGFibGUsIHR5cGljYWxseQogICAgICAgICAvLyB3aGVuIHRoZXJlIGlzIGEgZmFpbHVyZSB0byBzdXBwbHkgZGF0YSB0byB0aGUgQXVkaW9UcmFjay4gIEl0IGNhbiBhbHNvCiAgICAgICAgIC8vIG9jY3VyIGluIG5vbi1vZmZsb2FkZWQgbW9kZSB3aGVuIHRoZSBhdWRpbyBkZXZpY2UgY29tZXMgb3V0IG9mIHN0YW5kYnkuCiAgICAgICAgIC8vCi0gICAgICAgIC8vIElmIHlvdSBzZWUgdGhpcyBhdCB0aGUgc3RhcnQgb2YgcGxheWJhY2ssIHRoZXJlIHByb2JhYmx5IHdhcyBhIGdsaXRjaC4KKyAgICAgICAgLy8gSWYgYW4gQXVkaW9UcmFjayB1bmRlcnJ1bnMgaXQgb3V0cHV0cyBzaWxlbmNlLiBTaW5jZSB0aGlzIGhhcHBlbnMgc3VkZGVubHkKKyAgICAgICAgLy8gaXQgbWF5IHNvdW5kIGxpa2UgYW4gYXVkaWJsZSBwb3Agb3IgZ2xpdGNoLgorICAgICAgICAvLworICAgICAgICAvLyBUaGUgdW5kZXJydW4gZXZlbnQgaXMgc2VudCBvbmNlIHBlciB0cmFjayB1bmRlcnJ1bjsgdGhlIGNvbmRpdGlvbiBpcyByZXNldAorICAgICAgICAvLyB3aGVuIG1vcmUgZGF0YSBpcyBzZW50IHRvIHRoZSBBdWRpb1RyYWNrLgogICAgICAgICBBTE9HSSgiY2FsbGJhY2t3cmFwcGVyOiBFVkVOVF9VTkRFUlJVTiAoZGlzY2FyZGVkKSIpOwogICAgICAgICBicmVhazsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCmluZGV4IGU5ZjcyYjguLjc1Mjc1MDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKQEAgLTk4LDcgKzk4LDggQEAKICAgICAgICAgICAgICAgICBBdWRpb0NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUsCiAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwsCi0gICAgICAgICAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCA9IGZhbHNlKTsKKyAgICAgICAgICAgICAgICBib29sIGRvTm90UmVjb25uZWN0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgdWludDMyX3Qgc3VnZ2VzdGVkRnJhbWVDb3VudCA9IDApOwogCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN0YXJ0KCk7CiAgICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgICAgIHdyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYmxvY2tpbmcgPSB0cnVlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKaW5kZXggNmFiYzgxYy4uYzY0OWM2MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJOdVBsYXllclJlbmRlcmVyLmgiCiAjaW5jbHVkZSAiTnVQbGF5ZXJTb3VyY2UuaCIKIAorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC00MCw2ICs0MSwxMCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBnZXRBdWRpb0RlZXBCdWZmZXJTZXR0aW5nKCkgeworICAgIHJldHVybiBwcm9wZXJ0eV9nZXRfYm9vbCgibWVkaWEuc3RhZ2VmcmlnaHQuYXVkaW8uZGVlcCIsIGZhbHNlIC8qIGRlZmF1bHRfdmFsdWUgKi8pOworfQorCiBOdVBsYXllcjo6RGVjb2Rlcjo6RGVjb2RlcigKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCiAgICAgICAgIGNvbnN0IHNwPFNvdXJjZT4gJnNvdXJjZSwKQEAgLTUzOSw5ICs1NDQsMTAgQEAKICAgICAgICAgdWludDMyX3QgZmxhZ3M7CiAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKICAgICAgICAgYm9vbCBoYXNWaWRlbyA9IChtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pICE9IE5VTEwpOwotICAgICAgICBpZiAoIWhhc1ZpZGVvICYmCi0gICAgICAgICAgICAgICAgbVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LICYmCi0gICAgICAgICAgICAgICAgZHVyYXRpb25VcyA+IEFVRElPX1NJTktfTUlOX0RFRVBfQlVGRkVSX0RVUkFUSU9OX1VTKSB7CisgICAgICAgIGlmIChnZXRBdWRpb0RlZXBCdWZmZXJTZXR0aW5nKCkgLy8gb3ZlcnJpZGUgcmVnYXJkbGVzcyBvZiBzb3VyY2UgZHVyYXRpb24KKyAgICAgICAgICAgICAgICB8fCAoIWhhc1ZpZGVvCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBtU291cmNlLT5nZXREdXJhdGlvbigmZHVyYXRpb25VcykgPT0gT0sKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGR1cmF0aW9uVXMgPiBBVURJT19TSU5LX01JTl9ERUVQX0JVRkZFUl9EVVJBVElPTl9VUykpIHsKICAgICAgICAgICAgIGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVI7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKaW5kZXggNDA5ZGVkZi4uZjdlMzExNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcApAQCAtMTksNyArMTksNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiTnVQbGF5ZXJSZW5kZXJlci5oIgotCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KQEAgLTM2LDYgKzM2LDM2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLyoKKyAqIEV4YW1wbGUgb2YgY29tbW9uIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgaW4gc2hlbGwgc2NyaXB0IGZvcm0KKworICAgI1R1cm4gb2ZmbG9hZCBhdWRpbyBvZmYgKHVzZSBQQ00gZm9yIFBsYXkgTXVzaWMpIC0tIEF1ZGlvUG9saWN5TWFuYWdlcgorICAgYWRiIHNoZWxsIHNldHByb3AgYXVkaW8ub2ZmbG9hZC5kaXNhYmxlIDEKKworICAgI0FsbG93IG9mZmxvYWQgYXVkaW8gd2l0aCB2aWRlbyAocmVxdWlyZXMgb2ZmbG9hZGluZyB0byBiZSBlbmFibGVkKSAtLSBBdWRpb1BvbGljeU1hbmFnZXIKKyAgIGFkYiBzaGVsbCBzZXRwcm9wIGF1ZGlvLm9mZmxvYWQudmlkZW8gMQorCisgICAjVXNlIGF1ZGlvIGNhbGxiYWNrcyBmb3IgUENNIGRhdGEKKyAgIGFkYiBzaGVsbCBzZXRwcm9wIG1lZGlhLnN0YWdlZnJpZ2h0LmF1ZGlvLmNiayAxCisKKyAgICNVc2UgZGVlcCBidWZmZXIgZm9yIFBDTSBkYXRhIHdpdGggdmlkZW8gKGl0IGlzIGdlbmVyYWxseSBlbmFibGVkIGZvciBhdWRpby1vbmx5KQorICAgYWRiIHNoZWxsIHNldHByb3AgbWVkaWEuc3RhZ2VmcmlnaHQuYXVkaW8uZGVlcCAxCisKKyAgICNTZXQgc2l6ZSBvZiBidWZmZXJzIGZvciBwY20gYXVkaW8gc2luayBpbiBtc2VjIChleGFtcGxlOiAxMDAwIG1zZWMpCisgICBhZGIgc2hlbGwgc2V0cHJvcCBtZWRpYS5zdGFnZWZyaWdodC5hdWRpby5zaW5rIDEwMDAKKworICogVGhlc2UgY29uZmlndXJhdGlvbnMgdGFrZSBlZmZlY3QgZm9yIHRoZSBuZXh0IHRyYWNrIHBsYXllZCAobm90IHRoZSBjdXJyZW50IHRyYWNrKS4KKyAqLworCitzdGF0aWMgaW5saW5lIGJvb2wgZ2V0VXNlQXVkaW9DYWxsYmFja1NldHRpbmcoKSB7CisgICAgcmV0dXJuIHByb3BlcnR5X2dldF9ib29sKCJtZWRpYS5zdGFnZWZyaWdodC5hdWRpby5jYmsiLCBmYWxzZSAvKiBkZWZhdWx0X3ZhbHVlICovKTsKK30KKworc3RhdGljIGlubGluZSBpbnQzMl90IGdldEF1ZGlvU2lua1BjbU1zU2V0dGluZygpIHsKKyAgICByZXR1cm4gcHJvcGVydHlfZ2V0X2ludDMyKAorICAgICAgICAgICAgIm1lZGlhLnN0YWdlZnJpZ2h0LmF1ZGlvLnNpbmsiLCA1MDAgLyogZGVmYXVsdF92YWx1ZSAqLyk7Cit9CisKIC8vIE1heGltdW0gdGltZSBpbiBwYXVzZWQgc3RhdGUgd2hlbiBvZmZsb2FkaW5nIGF1ZGlvIGRlY29tcHJlc3Npb24uIFdoZW4gZWxhcHNlZCwgdGhlIEF1ZGlvU2luawogLy8gaXMgY2xvc2VkIHRvIGFsbG93IHRoZSBhdWRpbyBEU1AgdG8gcG93ZXIgZG93bi4KIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtPZmZsb2FkUGF1c2VNYXhVcyA9IDEwMDAwMDAwbGw7CkBAIC04Nyw2ICsxMTcsNyBAQAogICAgICAgbUN1cnJlbnRQY21JbmZvKEFVRElPX1BDTUlORk9fSU5JVElBTElaRVIpLAogICAgICAgbVRvdGFsQnVmZmVyc1F1ZXVlZCgwKSwKICAgICAgIG1MYXN0QXVkaW9CdWZmZXJEcmFpbmVkKDApLAorICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2soZmFsc2UpLAogICAgICAgbVdha2VMb2NrKG5ldyBBV2FrZUxvY2soKSkgewogICAgIG1NZWRpYUNsb2NrID0gbmV3IE1lZGlhQ2xvY2s7CiAgICAgbVBsYXliYWNrUmF0ZSA9IG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZDsKQEAgLTU5Miw4ICs2MjMsNyBAQAogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6cG9zdERyYWluQXVkaW9RdWV1ZV9sKGludDY0X3QgZGVsYXlVcykgewotICAgIGlmIChtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyB8fCBtU3luY1F1ZXVlcyB8fCBtUGF1c2VkCi0gICAgICAgICAgICB8fCBvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgIGlmIChtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyB8fCBtU3luY1F1ZXVlcyB8fCBtVXNlQXVkaW9DYWxsYmFjaykgewogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC02NDIsMTIgKzY3MiwxNCBAQAogCiAgICAgICAgIGNhc2UgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms6OkNCX0VWRU5UX1NUUkVBTV9FTkQ6CiAgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dWKCJBdWRpb1Npbms6OkNCX0VWRU5UX1NUUkVBTV9FTkQiKTsKICAgICAgICAgICAgIG1lLT5ub3RpZnlFT1ModHJ1ZSAvKiBhdWRpbyAqLywgRVJST1JfRU5EX09GX1NUUkVBTSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms6OkNCX0VWRU5UX1RFQVJfRE9XTjoKICAgICAgICAgeworICAgICAgICAgICAgQUxPR1YoIkF1ZGlvU2luazo6Q0JfRVZFTlRfVEVBUl9ET1dOIik7CiAgICAgICAgICAgICBtZS0+bm90aWZ5QXVkaW9UZWFyRG93bigpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTY1OSw3ICs2OTEsNyBAQAogc2l6ZV90IE51UGxheWVyOjpSZW5kZXJlcjo6ZmlsbEF1ZGlvQnVmZmVyKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgaWYgKCFvZmZsb2FkaW5nQXVkaW8oKSB8fCBtUGF1c2VkKSB7CisgICAgaWYgKCFtVXNlQXVkaW9DYWxsYmFjaykgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKQEAgLTY2NywxMyArNjk5LDEzIEBACiAKICAgICBzaXplX3Qgc2l6ZUNvcGllZCA9IDA7CiAgICAgYm9vbCBmaXJzdEVudHJ5ID0gdHJ1ZTsKKyAgICBRdWV1ZUVudHJ5ICplbnRyeTsgIC8vIHdpbGwgYmUgdmFsaWQgYWZ0ZXIgd2hpbGUgbG9vcCBpZiBoYXNFT1MgaXMgc2V0LgogICAgIHdoaWxlIChzaXplQ29waWVkIDwgc2l6ZSAmJiAhbUF1ZGlvUXVldWUuZW1wdHkoKSkgewotICAgICAgICBRdWV1ZUVudHJ5ICplbnRyeSA9ICYqbUF1ZGlvUXVldWUuYmVnaW4oKTsKKyAgICAgICAgZW50cnkgPSAmKm1BdWRpb1F1ZXVlLmJlZ2luKCk7CiAKICAgICAgICAgaWYgKGVudHJ5LT5tQnVmZmVyID09IE5VTEwpIHsgLy8gRU9TCiAgICAgICAgICAgICBoYXNFT1MgPSB0cnVlOwogICAgICAgICAgICAgbUF1ZGlvUXVldWUuZXJhc2UobUF1ZGlvUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICBlbnRyeSA9IE5VTEw7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC02ODEsNyArNzEzLDcgQEAKICAgICAgICAgICAgIGZpcnN0RW50cnkgPSBmYWxzZTsKICAgICAgICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXM7CiAgICAgICAgICAgICBDSEVDSyhlbnRyeS0+bUJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcykpOwotICAgICAgICAgICAgQUxPR1YoInJlbmRlcmluZyBhdWRpbyBhdCBtZWRpYSB0aW1lICUuMmYgc2VjcyIsIG1lZGlhVGltZVVzIC8gMUU2KTsKKyAgICAgICAgICAgIEFMT0dWKCJmaWxsQXVkaW9CdWZmZXI6IHJlbmRlcmluZyBhdWRpbyBhdCBtZWRpYSB0aW1lICUuMmYgc2VjcyIsIG1lZGlhVGltZVVzIC8gMUU2KTsKICAgICAgICAgICAgIHNldEF1ZGlvRmlyc3RBbmNob3JUaW1lSWZOZWVkZWRfbChtZWRpYVRpbWVVcyk7CiAgICAgICAgIH0KIApAQCAtNzE0LDEwICs3NDYsMjggQEAKICAgICAgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZUFuY2hvcihub3dNZWRpYVVzLCBub3dVcywgSU5UNjRfTUFYKTsKICAgICB9CiAKLSAgICBpZiAoaGFzRU9TKSB7Ci0gICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wQXVkaW9TaW5rLCB0aGlzKSktPnBvc3QoKTsKKyAgICAvLyBmb3Igbm9uLW9mZmxvYWRlZCBhdWRpbywgd2UgbmVlZCB0byBjb21wdXRlIHRoZSBmcmFtZXMgd3JpdHRlbiBiZWNhdXNlCisgICAgLy8gdGhlcmUgaXMgbm8gRVZFTlRfU1RSRUFNX0VORCBub3RpZmljYXRpb24uIFRoZSBmcmFtZXMgd3JpdHRlbiBnaXZlcworICAgIC8vIGFuIGVzdGltYXRlIG9uIHRoZSBwZW5kaW5nIHBsYXllZCBvdXQgZHVyYXRpb24uCisgICAgaWYgKCFvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiArPSBzaXplQ29waWVkIC8gbUF1ZGlvU2luay0+ZnJhbWVTaXplKCk7CiAgICAgfQogCisgICAgaWYgKGhhc0VPUykgeworICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RvcEF1ZGlvU2luaywgdGhpcykpLT5wb3N0KCk7CisgICAgICAgIC8vIEFzIHRoZXJlIGlzIGN1cnJlbnRseSBubyBFVkVOVF9TVFJFQU1fRU5EIGNhbGxiYWNrIG5vdGlmaWNhdGlvbiBmb3IKKyAgICAgICAgLy8gbm9uLW9mZmxvYWRlZCBhdWRpbyB0cmFja3MsIHdlIG5lZWQgdG8gcG9zdCB0aGUgRU9TIG91cnNlbHZlcy4KKyAgICAgICAgaWYgKCFvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICAgICAgaW50NjRfdCBwb3N0RU9TRGVsYXlVcyA9IDA7CisgICAgICAgICAgICBpZiAobUF1ZGlvU2luay0+bmVlZHNUcmFpbGluZ1BhZGRpbmcoKSkgeworICAgICAgICAgICAgICAgIHBvc3RFT1NEZWxheVVzID0gZ2V0UGVuZGluZ0F1ZGlvUGxheW91dER1cmF0aW9uVXMoQUxvb3Blcjo6R2V0Tm93VXMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiZmlsbEF1ZGlvQnVmZmVyOiBub3RpZnlFT1MgIgorICAgICAgICAgICAgICAgICAgICAibU51bUZyYW1lc1dyaXR0ZW46JXUgIGZpbmFsUmVzdWx0OiVkICBwb3N0RU9TRGVsYXk6JWxsZCIsCisgICAgICAgICAgICAgICAgICAgIG1OdW1GcmFtZXNXcml0dGVuLCBlbnRyeS0+bUZpbmFsUmVzdWx0LCAobG9uZyBsb25nKXBvc3RFT1NEZWxheVVzKTsKKyAgICAgICAgICAgIG5vdGlmeUVPUyh0cnVlIC8qIGF1ZGlvICovLCBlbnRyeS0+bUZpbmFsUmVzdWx0LCBwb3N0RU9TRGVsYXlVcyk7CisgICAgICAgIH0KKyAgICB9CiAgICAgcmV0dXJuIHNpemVDb3BpZWQ7CiB9CiAKQEAgLTc0OSw2ICs3OTksNyBAQAogICAgIH0KICNlbmRpZgogCisgICAgdWludDMyX3QgcHJldkZyYW1lc1dyaXR0ZW4gPSBtTnVtRnJhbWVzV3JpdHRlbjsKICAgICB3aGlsZSAoIW1BdWRpb1F1ZXVlLmVtcHR5KCkpIHsKICAgICAgICAgUXVldWVFbnRyeSAqZW50cnkgPSAmKm1BdWRpb1F1ZXVlLmJlZ2luKCk7CiAKQEAgLTc3OCw3ICs4MjksOCBAQAogICAgICAgICBpZiAoZW50cnktPm1PZmZzZXQgPT0gMCAmJiBlbnRyeS0+bUJ1ZmZlci0+c2l6ZSgpID4gMCkgewogICAgICAgICAgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKICAgICAgICAgICAgIENIRUNLKGVudHJ5LT5tQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7Ci0gICAgICAgICAgICBBTE9HVigicmVuZGVyaW5nIGF1ZGlvIGF0IG1lZGlhIHRpbWUgJS4yZiBzZWNzIiwgbWVkaWFUaW1lVXMgLyAxRTYpOworICAgICAgICAgICAgQUxPR1YoIm9uRHJhaW5BdWRpb1F1ZXVlOiByZW5kZXJpbmcgYXVkaW8gYXQgbWVkaWEgdGltZSAlLjJmIHNlY3MiLAorICAgICAgICAgICAgICAgICAgICBtZWRpYVRpbWVVcyAvIDFFNik7CiAgICAgICAgICAgICBvbk5ld0F1ZGlvTWVkaWFUaW1lKG1lZGlhVGltZVVzKTsKICAgICAgICAgfQogCkBAIC04NDYsNyArODk4LDEzIEBACiAgICAgfQogICAgIG1NZWRpYUNsb2NrLT51cGRhdGVNYXhUaW1lTWVkaWEobWF4VGltZU1lZGlhKTsKIAotICAgIHJldHVybiAhbUF1ZGlvUXVldWUuZW1wdHkoKTsKKyAgICAvLyBjYWxjdWxhdGUgd2hldGhlciB3ZSBuZWVkIHRvIHJlc2NoZWR1bGUgYW5vdGhlciB3cml0ZS4KKyAgICBib29sIHJlc2NoZWR1bGUgPSAhbUF1ZGlvUXVldWUuZW1wdHkoKQorICAgICAgICAgICAgJiYgKCFtUGF1c2VkCisgICAgICAgICAgICAgICAgfHwgcHJldkZyYW1lc1dyaXR0ZW4gIT0gbU51bUZyYW1lc1dyaXR0ZW4pOyAvLyBwZXJtaXQgcGF1c2UgdG8gZmlsbCBidWZmZXJzCisgICAgLy9BTE9HRCgicmVzY2hlZHVsZTolZCAgZW1wdHk6JWQgIG1QYXVzZWQ6JWQgIHByZXZGcmFtZXNXcml0dGVuOiV1ICBtTnVtRnJhbWVzV3JpdHRlbjoldSIsCisgICAgLy8gICAgICAgIHJlc2NoZWR1bGUsIG1BdWRpb1F1ZXVlLmVtcHR5KCksIG1QYXVzZWQsIHByZXZGcmFtZXNXcml0dGVuLCBtTnVtRnJhbWVzV3JpdHRlbik7CisgICAgcmV0dXJuIHJlc2NoZWR1bGU7CiB9CiAKIGludDY0X3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpnZXREdXJhdGlvblVzSWZQbGF5ZWRBdFNhbXBsZVJhdGUodWludDMyX3QgbnVtRnJhbWVzKSB7CkBAIC0xMjMwLDkgKzEyODgsOCBAQAogICAgICAgICAgICAgKyttQXVkaW9EcmFpbkdlbmVyYXRpb247CiAgICAgICAgICAgICBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydF9sKCk7CiAKLSAgICAgICAgICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgewotICAgICAgICAgICAgICAgIGNsZWFyQXVkaW9GaXJzdEFuY2hvclRpbWVfbCgpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gdGhlIGZyYW1lIGNvdW50IHdpbGwgYmUgcmVzZXQgYWZ0ZXIgZmx1c2guCisgICAgICAgICAgICBjbGVhckF1ZGlvRmlyc3RBbmNob3JUaW1lX2woKTsKICAgICAgICAgfQogCiAgICAgICAgIG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nID0gZmFsc2U7CkBAIC0xMjQwLDcgKzEyOTcsOSBAQAogICAgICAgICBpZiAob2ZmbG9hZGluZ0F1ZGlvKCkpIHsKICAgICAgICAgICAgIG1BdWRpb1NpbmstPnBhdXNlKCk7CiAgICAgICAgICAgICBtQXVkaW9TaW5rLT5mbHVzaCgpOwotICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKKyAgICAgICAgICAgIGlmICghbVBhdXNlZCkgeworICAgICAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtQXVkaW9TaW5rLT5wYXVzZSgpOwogICAgICAgICAgICAgbUF1ZGlvU2luay0+Zmx1c2goKTsKQEAgLTEzNDUsNyArMTQwNCw3IEBACiAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgICsrbUF1ZGlvRHJhaW5HZW5lcmF0aW9uOworICAgICAgICAvLyB3ZSBkbyBub3QgaW5jcmVtZW50IGF1ZGlvIGRyYWluIGdlbmVyYXRpb24gc28gdGhhdCB3ZSBmaWxsIGF1ZGlvIGJ1ZmZlciBkdXJpbmcgcGF1c2UuCiAgICAgICAgICsrbVZpZGVvRHJhaW5HZW5lcmF0aW9uOwogICAgICAgICBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydF9sKCk7CiAgICAgICAgIG1QYXVzZWQgPSB0cnVlOwpAQCAtMTU5MCwxMiArMTY0OSwxMyBAQAogICAgICAgICAgICAgb2ZmbG9hZEZsYWdzICY9IH5BVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUjsKICAgICAgICAgICAgIGF1ZGlvU2lua0NoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKKwogICAgICAgICAgICAgZXJyID0gbUF1ZGlvU2luay0+b3BlbigKICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCljaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgIDggLyogYnVmZmVyQ291bnQgKi8sCisgICAgICAgICAgICAgICAgICAgIDAgLyogYnVmZmVyQ291bnQgLSB1bnVzZWQgKi8sCiAgICAgICAgICAgICAgICAgICAgICZOdVBsYXllcjo6UmVuZGVyZXI6OkF1ZGlvU2lua0NhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICB0aGlzLAogICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3Qpb2ZmbG9hZEZsYWdzLApAQCAtMTYxMyw3ICsxNjczLDkgQEAKICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgcmVhY2hpbmcgdGhlIGhhcmR3YXJlLgogICAgICAgICAgICAgICAgIC8vIFRPRE8KICAgICAgICAgICAgICAgICBtQ3VycmVudE9mZmxvYWRJbmZvID0gb2ZmbG9hZEluZm87Ci0gICAgICAgICAgICAgICAgZXJyID0gbUF1ZGlvU2luay0+c3RhcnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1QYXVzZWQpIHsgLy8gZm9yIHByZXZpZXcgbW9kZSwgZG9uJ3Qgc3RhcnQgaWYgcGF1c2VkCisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1BdWRpb1NpbmstPnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEFMT0dWX0lGKGVyciA9PSBPSywgIm9wZW5BdWRpb1Npbms6IG9mZmxvYWQgc3VjY2VlZGVkIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0xNjIzLDYgKzE2ODUsNyBAQAogICAgICAgICAgICAgICAgIG1DdXJyZW50T2ZmbG9hZEluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOwogICAgICAgICAgICAgICAgIEFMT0dWKCJvcGVuQXVkaW9TaW5rOiBvZmZsb2FkIGZhaWxlZCIpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2sgPSB0cnVlOyAgLy8gb2ZmbG9hZCBtb2RlIHRyYW5zZmVycyBkYXRhIHRocm91Z2ggY2FsbGJhY2sKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoIW9mZmxvYWRPbmx5ICYmICFvZmZsb2FkaW5nQXVkaW8oKSkgewpAQCAtMTY0NiwxNyArMTcwOSwyNyBAQAogICAgICAgICBhdWRpb1NpbmtDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKICAgICAgICAgbUN1cnJlbnRPZmZsb2FkSW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgICAgIC8vIE5vdGU6IEl0IGlzIHBvc3NpYmxlIHRvIHNldCB1cCB0aGUgY2FsbGJhY2ssIGJ1dCBub3QgdXNlIGl0IHRvIHNlbmQgYXVkaW8gZGF0YS4KKyAgICAgICAgLy8gVGhpcyByZXF1aXJlcyBhIGZpeCBpbiBBdWRpb1NpbmsgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHRoZSB0cmFuc2ZlciBtb2RlLgorICAgICAgICBtVXNlQXVkaW9DYWxsYmFjayA9IGdldFVzZUF1ZGlvQ2FsbGJhY2tTZXR0aW5nKCk7CisKKyAgICAgICAgLy8gQ29tcHV0ZSB0aGUgZGVzaXJlZCBidWZmZXIgc2l6ZS4KKyAgICAgICAgLy8gRm9yIGNhbGxiYWNrIG1vZGUsIHRoZSBhbW91bnQgb2YgdGltZSBiZWZvcmUgd2FrZXVwIGlzIGFib3V0IGhhbGYgdGhlIGJ1ZmZlciBzaXplLgorICAgICAgICBjb25zdCB1aW50MzJfdCBmcmFtZUNvdW50ID0KKyAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNhbXBsZVJhdGUgKiBnZXRBdWRpb1NpbmtQY21Nc1NldHRpbmcoKSAvIDEwMDA7CisKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvU2luay0+b3BlbigKICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCljaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCi0gICAgICAgICAgICAgICAgICAgIDggLyogYnVmZmVyQ291bnQgKi8sCi0gICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgIDAgLyogYnVmZmVyQ291bnQgLSB1bnVzZWQgKi8sCisgICAgICAgICAgICAgICAgICAgIG1Vc2VBdWRpb0NhbGxiYWNrID8gJk51UGxheWVyOjpSZW5kZXJlcjo6QXVkaW9TaW5rQ2FsbGJhY2sgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICBtVXNlQXVkaW9DYWxsYmFjayA/IHRoaXMgOiBOVUxMLAogICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpcGNtRmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgIHRydWUgLyogZG9Ob3RSZWNvbm5lY3QgKi8pOworICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGRvTm90UmVjb25uZWN0ICovLAorICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50KTsKICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgZXJyID0gbUF1ZGlvU2luay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1NldHRpbmdzKTsKICAgICAgICAgfQpAQCAtMTY2Niw3ICsxNzM5LDkgQEAKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICAgICAgbUN1cnJlbnRQY21JbmZvID0gaW5mbzsKLSAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKKyAgICAgICAgaWYgKCFtUGF1c2VkKSB7IC8vIGZvciBwcmV2aWV3IG1vZGUsIGRvbid0IHN0YXJ0IGlmIHBhdXNlZAorICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKKyAgICAgICAgfQogICAgIH0KICAgICBpZiAoYXVkaW9TaW5rQ2hhbmdlZCkgewogICAgICAgICBvbkF1ZGlvU2lua0NoYW5nZWQoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCmluZGV4IGZiZGY1YmYuLmMyZmVhNDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaApAQCAtMTk0LDYgKzE5NCw3IEBACiAKICAgICBpbnQzMl90IG1Ub3RhbEJ1ZmZlcnNRdWV1ZWQ7CiAgICAgaW50MzJfdCBtTGFzdEF1ZGlvQnVmZmVyRHJhaW5lZDsKKyAgICBib29sIG1Vc2VBdWRpb0NhbGxiYWNrOwogCiAgICAgc3A8QVdha2VMb2NrPiBtV2FrZUxvY2s7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCmluZGV4IDNhOThlOGMuLjE3MmUxOWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcApAQCAtMTA2LDYgKzEwNiwxNiBAQAogICAgIHBhcmFtcy0+blZlcnNpb24ucy5uU3RlcCA9IDA7CiB9CiAKK3N0cnVjdCBNZXNzYWdlTGlzdCA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBNZXNzYWdlTGlzdCgpIHsKKyAgICB9CisgICAgc3RkOjpsaXN0PHNwPEFNZXNzYWdlPiA+ICZnZXRMaXN0KCkgeyByZXR1cm4gbUxpc3Q7IH0KK3ByaXZhdGU6CisgICAgc3RkOjpsaXN0PHNwPEFNZXNzYWdlPiA+IG1MaXN0OworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVzc2FnZUxpc3QpOworfTsKKwogc3RydWN0IENvZGVjT2JzZXJ2ZXIgOiBwdWJsaWMgQm5PTVhPYnNlcnZlciB7CiAgICAgQ29kZWNPYnNlcnZlcigpIHt9CiAKQEAgLTExNCw1NSArMTI0LDY1IEBACiAgICAgfQogCiAgICAgLy8gZnJvbSBJT01YT2JzZXJ2ZXIKLSAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlKGNvbnN0IG9teF9tZXNzYWdlICZvbXhfbXNnKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKLQotICAgICAgICBtc2ctPnNldEludDMyKCJ0eXBlIiwgb214X21zZy50eXBlKTsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigibm9kZSIsIG9teF9tc2cubm9kZSk7Ci0KLSAgICAgICAgc3dpdGNoIChvbXhfbXNnLnR5cGUpIHsKLSAgICAgICAgICAgIGNhc2Ugb214X21lc3NhZ2U6OkVWRU5UOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImV2ZW50Iiwgb214X21zZy51LmV2ZW50X2RhdGEuZXZlbnQpOwotICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImRhdGExIiwgb214X21zZy51LmV2ZW50X2RhdGEuZGF0YTEpOwotICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImRhdGEyIiwgb214X21zZy51LmV2ZW50X2RhdGEuZGF0YTIpOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VzKGNvbnN0IHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT4gJm1lc3NhZ2VzKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnk7CisgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICBzcDxNZXNzYWdlTGlzdD4gbXNnTGlzdCA9IG5ldyBNZXNzYWdlTGlzdCgpOworICAgICAgICBmb3IgKHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWVzc2FnZXMuY2JlZ2luKCk7CisgICAgICAgICAgICAgIGl0ICE9IG1lc3NhZ2VzLmNlbmQoKTsgKytpdCkgeworICAgICAgICAgICAgY29uc3Qgb214X21lc3NhZ2UgJm9teF9tc2cgPSAqaXQ7CisgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJub2RlIiwgb214X21zZy5ub2RlKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY2FzZSBvbXhfbWVzc2FnZTo6RU1QVFlfQlVGRkVSX0RPTkU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiYnVmZmVyIiwgb214X21zZy51LmJ1ZmZlcl9kYXRhLmJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiZmVuY2VfZmQiLCBvbXhfbXNnLmZlbmNlRmQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoInR5cGUiLCBvbXhfbXNnLnR5cGUpOworICAgICAgICAgICAgc3dpdGNoIChvbXhfbXNnLnR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIG9teF9tZXNzYWdlOjpFVkVOVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImV2ZW50Iiwgb214X21zZy51LmV2ZW50X2RhdGEuZXZlbnQpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJkYXRhMSIsIG9teF9tc2cudS5ldmVudF9kYXRhLmRhdGExKTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiZGF0YTIiLCBvbXhfbXNnLnUuZXZlbnRfZGF0YS5kYXRhMik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY2FzZSBvbXhfbWVzc2FnZTo6RklMTF9CVUZGRVJfRE9ORToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKAotICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciIsIG9teF9tc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5idWZmZXIpOwotICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAicmFuZ2Vfb2Zmc2V0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9teF9tc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5yYW5nZV9vZmZzZXQpOwotICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAicmFuZ2VfbGVuZ3RoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9teF9tc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5yYW5nZV9sZW5ndGgpOwotICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAiZmxhZ3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgb214X21zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmZsYWdzKTsKLSAgICAgICAgICAgICAgICBtc2ctPnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVzdGFtcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBvbXhfbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEudGltZXN0YW1wKTsKLSAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKAotICAgICAgICAgICAgICAgICAgICAgICAgImZlbmNlX2ZkIiwgb214X21zZy5mZW5jZUZkKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIG9teF9tZXNzYWdlOjpFTVBUWV9CVUZGRVJfRE9ORToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImJ1ZmZlciIsIG9teF9tc2cudS5idWZmZXJfZGF0YS5idWZmZXIpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJmZW5jZV9mZCIsIG9teF9tc2cuZmVuY2VGZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBBTE9HRSgiVW5yZWNvZ25pemVkIG1lc3NhZ2UgdHlwZTogJWQiLCBvbXhfbXNnLnR5cGUpOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2Ugb214X21lc3NhZ2U6OkZJTExfQlVGRkVSX0RPTkU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidWZmZXIiLCBvbXhfbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEuYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmFuZ2Vfb2Zmc2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXhfbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEucmFuZ2Vfb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmFuZ2VfbGVuZ3RoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXhfbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEucmFuZ2VfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxhZ3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9teF9tc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5mbGFncyk7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVzdGFtcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb214X21zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlbmNlX2ZkIiwgb214X21zZy5mZW5jZUZkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlVucmVjb2duaXplZCBtZXNzYWdlIHR5cGU6ICVkIiwgb214X21zZy50eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtc2dMaXN0LT5nZXRMaXN0KCkucHVzaF9iYWNrKG1zZyk7CiAgICAgICAgIH0KLQotICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRPYmplY3QoIm1lc3NhZ2VzIiwgbXNnTGlzdCk7CisgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogICAgIH0KIAogcHJvdGVjdGVkOgpAQCAtMjAwLDggKzIyMCwxNSBAQAogICAgIHZvaWQgcG9zdEZpbGxUaGlzQnVmZmVyKEJ1ZmZlckluZm8gKmluZm8pOwogCiBwcml2YXRlOgorICAgIC8vIEhhbmRsZXMgYW4gT01YIG1lc3NhZ2UuIFJldHVybnMgdHJ1ZSBpZmYgbWVzc2FnZSB3YXMgaGFuZGxlZC4KICAgICBib29sIG9uT01YTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKKyAgICAvLyBIYW5kbGVzIGEgbGlzdCBvZiBtZXNzYWdlcy4gUmV0dXJucyB0cnVlIGlmZiBtZXNzYWdlcyB3ZXJlIGhhbmRsZWQuCisgICAgYm9vbCBvbk9NWE1lc3NhZ2VMaXN0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIC8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBtZXNzYWdlIGlzIGZvciB0aGlzIGNvbXBvbmVudCBhbmQgdGhlIGNvbXBvbmVudCBpcyBhbGl2ZQorICAgIGJvb2wgY2hlY2tPTVhNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKwogICAgIGJvb2wgb25PTVhFbXB0eUJ1ZmZlckRvbmUoSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlcklELCBpbnQgZmVuY2VGZCk7CiAKICAgICBib29sIG9uT01YRmlsbEJ1ZmZlckRvbmUoCkBAIC00NDAyLDkgKzQ0MjksMTQgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0T01YTWVzc2FnZUxpc3Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjaGVja09NWE1lc3NhZ2UobXNnKSA/IG9uT01YTWVzc2FnZUxpc3QobXNnKSA6IHRydWU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRPTVhNZXNzYWdlOgogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gb25PTVhNZXNzYWdlKG1zZyk7CisgICAgICAgICAgICByZXR1cm4gY2hlY2tPTVhNZXNzYWdlKG1zZykgPyBvbk9NWE1lc3NhZ2UobXNnKSA6IHRydWU7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRTZXRTdXJmYWNlOgpAQCAtNDQ2MywxNiArNDQ5NSwxMyBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIEFDb2RlYzo6QmFzZVN0YXRlOjpvbk9NWE1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBpbnQzMl90IHR5cGU7Ci0gICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInR5cGUiLCAmdHlwZSkpOwotCitib29sIEFDb2RlYzo6QmFzZVN0YXRlOjpjaGVja09NWE1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICAvLyB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgdGhpcyBpcyBhbiBvdXRzdGFuZGluZyBtZXNzYWdlIGZvciBhCiAgICAgLy8gY29kZWMgdGhhdCB3ZSBoYXZlIGFscmVhZHkgZGVzdHJveWVkCiAgICAgaWYgKG1Db2RlYy0+bU5vZGUgPT0gMCkgewogICAgICAgICBBTE9HSSgiaWdub3JpbmcgbWVzc2FnZSBhcyBhbHJlYWR5IGZyZWVkIGNvbXBvbmVudDogJXMiLAogICAgICAgICAgICAgICAgIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBJT01YOjpub2RlX2lkIG5vZGVJRDsKQEAgLTQ0ODEsNiArNDUxMCwyNCBAQAogICAgICAgICBBTE9HRSgiVW5leHBlY3RlZCBtZXNzYWdlIGZvciBub2RlSUQ6ICV1LCBzaG91bGQgaGF2ZSBiZWVuICV1Iiwgbm9kZUlELCBtQ29kZWMtPm1Ob2RlKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBQ29kZWM6OkJhc2VTdGF0ZTo6b25PTVhNZXNzYWdlTGlzdChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoIm1lc3NhZ2VzIiwgJm9iaikpOworICAgIHNwPE1lc3NhZ2VMaXN0PiBtc2dMaXN0ID0gc3RhdGljX2Nhc3Q8TWVzc2FnZUxpc3QgKj4ob2JqLmdldCgpKTsKKworICAgIGZvciAoc3RkOjpsaXN0PHNwPEFNZXNzYWdlPj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbXNnTGlzdC0+Z2V0TGlzdCgpLmNiZWdpbigpOworICAgICAgICAgIGl0ICE9IG1zZ0xpc3QtPmdldExpc3QoKS5jZW5kKCk7ICsraXQpIHsKKyAgICAgICAgb25PTVhNZXNzYWdlKCppdCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFDb2RlYzo6QmFzZVN0YXRlOjpvbk9NWE1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQzMl90IHR5cGU7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInR5cGUiLCAmdHlwZSkpOwogCiAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgIGNhc2Ugb214X21lc3NhZ2U6OkVWRU5UOgpAQCAtNTMxNiw3ICs1MzYzLDcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE9NWE1lc3NhZ2UsIG1Db2RlYyk7CisgICAgbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0T01YTWVzc2FnZUxpc3QsIG1Db2RlYyk7CiAgICAgb2JzZXJ2ZXItPnNldE5vdGlmaWNhdGlvbk1lc3NhZ2Uobm90aWZ5KTsKIAogICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwCmluZGV4IDY1ZDhhMDQuLjYyNjEyYzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKQEAgLTE1ODYsMTMgKzE1ODYsMTMgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gqXh5egorICAgICAgICAvLyBceEE5eHl6CiAgICAgICAgIGNhc2UgRk9VUkNDKDB4QTksICd4JywgJ3knLCAneicpOgogICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAKLSAgICAgICAgICAgIC8vIEJlc3QgY2FzZSB0aGUgdG90YWwgZGF0YSBsZW5ndGggaW5zaWRlICKpeHl6IiBib3gKLSAgICAgICAgICAgIC8vIHdvdWxkIGJlIDgsIGZvciBpbnN0YW5jZSAiqXh5eiIgKyAiXHgwMFx4MDRceDE1XHhjNyIgKyAiMCswLyIsCisgICAgICAgICAgICAvLyBCZXN0IGNhc2UgdGhlIHRvdGFsIGRhdGEgbGVuZ3RoIGluc2lkZSAiXHhBOXh5eiIgYm94CisgICAgICAgICAgICAvLyB3b3VsZCBiZSA4LCBmb3IgaW5zdGFuY2UgIlx4QTl4eXoiICsgIlx4MDBceDA0XHgxNVx4YzciICsgIjArMC8iLAogICAgICAgICAgICAgLy8gd2hlcmUgIlx4MDBceDA0IiBpcyB0aGUgdGV4dCBzdHJpbmcgbGVuZ3RoIHdpdGggdmFsdWUgPSA0LAogICAgICAgICAgICAgLy8gIlwweDE1XHhjNyIgaXMgdGhlIGxhbmd1YWdlIGNvZGUgPSBlbiwgYW5kICIwKzAiIGlzIGEKICAgICAgICAgICAgIC8vIGxvY2F0aW9uIChzdHJpbmcpIHZhbHVlIHdpdGggbG9uZ2l0dWRlID0gMCBhbmQgbGF0aXR1ZGUgPSAwLgpAQCAtMzI5NCwxNiArMzI5NCwyNCBAQAogICAgICAgICBtV2FudHNOQUxGcmFnbWVudHMgPSBmYWxzZTsKICAgICB9CiAKKyAgICBpbnQzMl90IHRtcDsKKyAgICBDSEVDSyhtRm9ybWF0LT5maW5kSW50MzIoa0tleU1heElucHV0U2l6ZSwgJnRtcCkpOworICAgIHNpemVfdCBtYXhfc2l6ZSA9IHRtcDsKKworICAgIC8vIEEgc29tZXdoYXQgYXJiaXRyYXJ5IGxpbWl0IHRoYXQgc2hvdWxkIGJlIHN1ZmZpY2llbnQgZm9yIDhrIHZpZGVvIGZyYW1lcworICAgIC8vIElmIHlvdSBzZWUgdGhlIG1lc3NhZ2UgYmVsb3cgZm9yIGEgdmFsaWQgaW5wdXQgc3RyZWFtOiBpbmNyZWFzZSB0aGUgbGltaXQKKyAgICBpZiAobWF4X3NpemUgPiA2NCAqIDEwMjQgKiAxMDI0KSB7CisgICAgICAgIEFMT0dFKCJib2d1cyBtYXggaW5wdXQgc2l6ZTogJXp1IiwgbWF4X3NpemUpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KICAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKLQotICAgIGludDMyX3QgbWF4X3NpemU7Ci0gICAgQ0hFQ0sobUZvcm1hdC0+ZmluZEludDMyKGtLZXlNYXhJbnB1dFNpemUsICZtYXhfc2l6ZSkpOwotCiAgICAgbUdyb3VwLT5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcihtYXhfc2l6ZSkpOwogCiAgICAgbVNyY0J1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W21heF9zaXplXTsKICAgICBpZiAobVNyY0J1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgIC8vIGZpbGUgcHJvYmFibHkgc3BlY2lmaWVkIGEgYmFkIG1heCBzaXplCisgICAgICAgIGRlbGV0ZSBtR3JvdXA7CisgICAgICAgIG1Hcm91cCA9IE5VTEw7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKaW5kZXggOTVmMzYxZS4uODY3Y2UwYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcApAQCAtMzg1LDYgKzM4NSwxMyBAQAogICAgICAgbVN0YXJ0VGltZU9mZnNldE1zKC0xKSwKICAgICAgIG1NZXRhS2V5cyhuZXcgQU1lc3NhZ2UoKSkgewogICAgIGFkZERldmljZU1ldGEoKTsKKworICAgIC8vIFZlcmlmeSBtRmQgaXMgc2Vla2FibGUKKyAgICBvZmY2NF90IG9mZiA9IGxzZWVrNjQobUZkLCAwLCBTRUVLX1NFVCk7CisgICAgaWYgKG9mZiA8IDApIHsKKyAgICAgICAgQUxPR0UoImNhbm5vdCBzZWVrIG1GZDogJXMgKCVkKSIsIHN0cmVycm9yKGVycm5vKSwgZXJybm8pOworICAgICAgICByZWxlYXNlKCk7CisgICAgfQogfQogCiBNUEVHNFdyaXRlcjo6fk1QRUc0V3JpdGVyKCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCmluZGV4IDkyN2NjNmMuLjk2YWE4MDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKQEAgLTExNiwxMiArMTE2LDE1IEBACiAgICAgfQogCiAgICAgLy8gZnJvbSBJT01YT2JzZXJ2ZXIKLSAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlKGNvbnN0IG9teF9tZXNzYWdlICZtc2cpIHsKKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlcyhjb25zdCBzdGQ6Omxpc3Q8b214X21lc3NhZ2U+ICZtZXNzYWdlcykgewogICAgICAgICBzcDxPTVhDb2RlYz4gY29kZWMgPSBtVGFyZ2V0LnByb21vdGUoKTsKIAogICAgICAgICBpZiAoY29kZWMuZ2V0KCkgIT0gTlVMTCkgewogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKGNvZGVjLT5tTG9jayk7Ci0gICAgICAgICAgICBjb2RlYy0+b25fbWVzc2FnZShtc2cpOworICAgICAgICAgICAgZm9yIChzdGQ6Omxpc3Q8b214X21lc3NhZ2U+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1lc3NhZ2VzLmNiZWdpbigpOworICAgICAgICAgICAgICAgICAgaXQgIT0gbWVzc2FnZXMuY2VuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgY29kZWMtPm9uX21lc3NhZ2UoKml0KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNvZGVjLmNsZWFyKCk7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnRXh0cmFjdG9yLmNwcAppbmRleCA0Mjk3NTQ5Li4yNDUxNjQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ0V4dHJhY3Rvci5jcHAKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlICJpbmNsdWRlL09nZ0V4dHJhY3Rvci5oIgogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgpAQCAtNjUsMjQgKzY2LDI4IEBACiAgICAgT2dnU291cmNlICZvcGVyYXRvcj0oY29uc3QgT2dnU291cmNlICYpOwogfTsKIAotc3RydWN0IE15Vm9yYmlzRXh0cmFjdG9yIHsKLSAgICBNeVZvcmJpc0V4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKTsKLSAgICB2aXJ0dWFsIH5NeVZvcmJpc0V4dHJhY3RvcigpOworc3RydWN0IE15T2dnRXh0cmFjdG9yIHsKKyAgICBNeU9nZ0V4dHJhY3RvcigKKyAgICAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lVHlwZSwKKyAgICAgICAgICAgIHNpemVfdCBudW1IZWFkZXJzLAorICAgICAgICAgICAgaW50NjRfdCBzZWVrUHJlUm9sbFVzKTsKKyAgICB2aXJ0dWFsIH5NeU9nZ0V4dHJhY3RvcigpOwogCiAgICAgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpIGNvbnN0OwogCiAgICAgLy8gUmV0dXJucyBhbiBhcHByb3hpbWF0ZSBiaXRyYXRlIGluIGJpdHMgcGVyIHNlY29uZC4KLSAgICB1aW50NjRfdCBhcHByb3hCaXRyYXRlKCk7CisgICAgdmlydHVhbCB1aW50NjRfdCBhcHByb3hCaXRyYXRlKCkgY29uc3QgPSAwOwogCiAgICAgc3RhdHVzX3Qgc2Vla1RvVGltZShpbnQ2NF90IHRpbWVVcyk7CiAgICAgc3RhdHVzX3Qgc2Vla1RvT2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KTsKLSAgICBzdGF0dXNfdCByZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgYm9vbCBjb25mKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyICoqYnVmZmVyKSA9IDA7CiAKICAgICBzdGF0dXNfdCBpbml0KCk7CiAKICAgICBzcDxNZXRhRGF0YT4gZ2V0RmlsZU1ldGFEYXRhKCkgeyByZXR1cm4gbUZpbGVNZXRhOyB9CiAKLXByaXZhdGU6Citwcm90ZWN0ZWQ6CiAgICAgc3RydWN0IFBhZ2UgewogICAgICAgICB1aW50NjRfdCBtR3JhbnVsZVBvc2l0aW9uOwogICAgICAgICBpbnQzMl90IG1QcmV2UGFja2V0U2l6ZTsKQEAgLTEwMiwxMiArMTA3LDE3IEBACiAgICAgc3A8RGF0YVNvdXJjZT4gbVNvdXJjZTsKICAgICBvZmY2NF90IG1PZmZzZXQ7CiAgICAgUGFnZSBtQ3VycmVudFBhZ2U7CisgICAgdWludDY0X3QgbUN1ckdyYW51bGVQb3NpdGlvbjsKICAgICB1aW50NjRfdCBtUHJldkdyYW51bGVQb3NpdGlvbjsKICAgICBzaXplX3QgbUN1cnJlbnRQYWdlU2l6ZTsKICAgICBib29sIG1GaXJzdFBhY2tldEluUGFnZTsKICAgICB1aW50NjRfdCBtQ3VycmVudFBhZ2VTYW1wbGVzOwogICAgIHNpemVfdCBtTmV4dExhY2VJbmRleDsKIAorICAgIGNvbnN0IGNoYXIgKm1NaW1lVHlwZTsKKyAgICBzaXplX3QgbU51bUhlYWRlcnM7CisgICAgaW50NjRfdCBtU2Vla1ByZVJvbGxVczsKKwogICAgIG9mZjY0X3QgbUZpcnN0RGF0YU9mZnNldDsKIAogICAgIHZvcmJpc19pbmZvIG1WaTsKQEAgLTEyMSwxMCArMTMxLDI2IEBACiAgICAgc3NpemVfdCByZWFkUGFnZShvZmY2NF90IG9mZnNldCwgUGFnZSAqcGFnZSk7CiAgICAgc3RhdHVzX3QgZmluZE5leHRQYWdlKG9mZjY0X3Qgc3RhcnRPZmZzZXQsIG9mZjY0X3QgKnBhZ2VPZmZzZXQpOwogCi0gICAgc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciwgdWludDhfdCB0eXBlKTsKKyAgICB2aXJ0dWFsIGludDY0X3QgZ2V0VGltZVVzT2ZHcmFudWxlKHVpbnQ2NF90IGdyYW51bGVQb3MpIGNvbnN0ID0gMDsKIAotICAgIGludDMyX3QgcGFja2V0QmxvY2tTaXplKE1lZGlhQnVmZmVyICpidWZmZXIpOworICAgIC8vIEV4dHJhY3QgY29kZWMgZm9ybWF0LCBtZXRhZGF0YSB0YWdzLCBhbmQgdmFyaW91cyBjb2RlYyBzcGVjaWZpYyBkYXRhOworICAgIC8vIHRoZSBmb3JtYXQgYW5kIENTRCdzIGFyZSByZXF1aXJlZCB0byBzZXR1cCB0aGUgZGVjb2RlcnMgZm9yIHRoZSBlbmNsb3NlZCBtZWRpYSBjb250ZW50LgorICAgIC8vCisgICAgLy8gVmFsaWQgdmFsdWVzIGZvciBgdHlwZWAgYXJlOgorICAgIC8vIDEgLSBiaXRzdHJlYW0gaWRlbnRpZmljYXRpb24gaGVhZGVyCisgICAgLy8gMyAtIGNvbW1lbnQgaGVhZGVyCisgICAgLy8gNSAtIGNvZGVjIHNldHVwIGhlYWRlciAoVm9yYmlzIG9ubHkpCisgICAgdmlydHVhbCBzdGF0dXNfdCB2ZXJpZnlIZWFkZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlciwgdWludDhfdCB0eXBlKSA9IDA7CisKKyAgICAvLyBSZWFkIHRoZSBuZXh0IG9nZyBwYWNrZXQgZnJvbSB0aGUgdW5kZXJseWluZyBkYXRhIHNvdXJjZTsgb3B0aW9uYWxseQorICAgIC8vIGNhbGN1bGF0ZSB0aGUgdGltZXN0YW1wIGZvciB0aGUgb3V0cHV0IHBhY2tldCB3aGlsc3QgcHJldGVuZGluZworICAgIC8vIHRoYXQgd2UgYXJlIHBhcnNpbmcgYW4gT2dnIFZvcmJpcyBzdHJlYW0uCisgICAgLy8KKyAgICAvLyAqYnVmZmVyIGlzIE5VTEwnZWQgb3V0IGltbWVkaWF0ZWx5IHVwb24gZW50cnksIGFuZCBpZiBzdWNjZXNzZnVsIGEgbmV3IGJ1ZmZlciBpcyBhbGxvY2F0ZWQ7CisgICAgLy8gY2xpZW50cyBhcmUgcmVzcG9uc2libGUgZm9yIHJlbGVhc2luZyB0aGUgb3JpZ2luYWwgYnVmZmVyLgorICAgIHN0YXR1c190IF9yZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgYm9vbCBjYWxjVm9yYmlzVGltZXN0YW1wKTsKKworICAgIGludDMyX3QgZ2V0UGFja2V0QmxvY2tTaXplKE1lZGlhQnVmZmVyICpidWZmZXIpOwogCiAgICAgdm9pZCBwYXJzZUZpbGVNZXRhRGF0YSgpOwogCkBAIC0xMzIsOCArMTU4LDU5IEBACiAKICAgICB2b2lkIGJ1aWxkVGFibGVPZkNvbnRlbnRzKCk7CiAKLSAgICBNeVZvcmJpc0V4dHJhY3Rvcihjb25zdCBNeVZvcmJpc0V4dHJhY3RvciAmKTsKLSAgICBNeVZvcmJpc0V4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE15Vm9yYmlzRXh0cmFjdG9yICYpOworICAgIE15T2dnRXh0cmFjdG9yKGNvbnN0IE15T2dnRXh0cmFjdG9yICYpOworICAgIE15T2dnRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgTXlPZ2dFeHRyYWN0b3IgJik7Cit9OworCitzdHJ1Y3QgTXlWb3JiaXNFeHRyYWN0b3IgOiBwdWJsaWMgTXlPZ2dFeHRyYWN0b3IgeworICAgIE15Vm9yYmlzRXh0cmFjdG9yKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpCisgICAgICAgIDogTXlPZ2dFeHRyYWN0b3Ioc291cmNlLAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywKKyAgICAgICAgICAgICAgICAvKiBudW1IZWFkZXJzICovIDMsCisgICAgICAgICAgICAgICAgLyogc2Vla1ByZVJvbGxVcyAqLyAwKSB7CisgICAgfQorCisgICAgdmlydHVhbCB1aW50NjRfdCBhcHByb3hCaXRyYXRlKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyICoqYnVmZmVyKSB7CisgICAgICAgIHJldHVybiBfcmVhZE5leHRQYWNrZXQoYnVmZmVyLCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi8gdHJ1ZSk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCBpbnQ2NF90IGdldFRpbWVVc09mR3JhbnVsZSh1aW50NjRfdCBncmFudWxlUG9zKSBjb25zdCB7CisgICAgICAgIHJldHVybiBncmFudWxlUG9zICogMTAwMDAwMGxsIC8gbVZpLnJhdGU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCB2ZXJpZnlIZWFkZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlciwgdWludDhfdCB0eXBlKTsKK307CisKK3N0cnVjdCBNeU9wdXNFeHRyYWN0b3IgOiBwdWJsaWMgTXlPZ2dFeHRyYWN0b3IgeworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtPcHVzU2FtcGxlUmF0ZSA9IDQ4MDAwOworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtPcHVzU2Vla1ByZVJvbGxVcyA9IDgwMDAwOyAvLyA4MCBtcworCisgICAgTXlPcHVzRXh0cmFjdG9yKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpCisgICAgICAgIDogTXlPZ2dFeHRyYWN0b3Ioc291cmNlLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLCAvKm51bUhlYWRlcnMqLyAyLCBrT3B1c1NlZWtQcmVSb2xsVXMpLAorICAgICAgICAgIG1DaGFubmVsQ291bnQoMCksCisgICAgICAgICAgbUNvZGVjRGVsYXkoMCkgeworICAgIH0KKworICAgIHZpcnR1YWwgdWludDY0X3QgYXBwcm94Qml0cmF0ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlciAqKmJ1ZmZlcik7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIGludDY0X3QgZ2V0VGltZVVzT2ZHcmFudWxlKHVpbnQ2NF90IGdyYW51bGVQb3MpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSk7CisKK3ByaXZhdGU6CisgICAgc3RhdHVzX3QgdmVyaWZ5T3B1c0hlYWRlcihNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKKyAgICBzdGF0dXNfdCB2ZXJpZnlPcHVzQ29tbWVudHMoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CisgICAgdWludDMyX3QgZ2V0TnVtU2FtcGxlc0luUGFja2V0KE1lZGlhQnVmZmVyICpidWZmZXIpIGNvbnN0OworCisgICAgdWludDhfdCBtQ2hhbm5lbENvdW50OworICAgIHVpbnQxNl90IG1Db2RlY0RlbGF5OwogfTsKIAogc3RhdGljIHZvaWQgZXh0cmFjdEFsYnVtQXJ0KApAQCAtMTc5LDEzICsyNTYsMTQgQEAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CiAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CiAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKLSAgICAgICAgaWYgKG1FeHRyYWN0b3ItPm1JbXBsLT5zZWVrVG9UaW1lKHNlZWtUaW1lVXMpICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+bUltcGwtPnNlZWtUb1RpbWUoc2Vla1RpbWVVcyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBNZWRpYUJ1ZmZlciAqcGFja2V0OwotICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPm1JbXBsLT5yZWFkTmV4dFBhY2tldCgmcGFja2V0LCAvKiBjb25mID0gKi8gZmFsc2UpOworICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPm1JbXBsLT5yZWFkTmV4dFBhY2tldCgmcGFja2V0KTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTIwOSwxNCArMjg3LDIyIEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLU15Vm9yYmlzRXh0cmFjdG9yOjpNeVZvcmJpc0V4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKQorTXlPZ2dFeHRyYWN0b3I6Ok15T2dnRXh0cmFjdG9yKAorICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLAorICAgICAgICBjb25zdCBjaGFyICptaW1lVHlwZSwKKyAgICAgICAgc2l6ZV90IG51bUhlYWRlcnMsCisgICAgICAgIGludDY0X3Qgc2Vla1ByZVJvbGxVcykKICAgICA6IG1Tb3VyY2Uoc291cmNlKSwKICAgICAgIG1PZmZzZXQoMCksCisgICAgICBtQ3VyR3JhbnVsZVBvc2l0aW9uKDApLAogICAgICAgbVByZXZHcmFudWxlUG9zaXRpb24oMCksCiAgICAgICBtQ3VycmVudFBhZ2VTaXplKDApLAogICAgICAgbUZpcnN0UGFja2V0SW5QYWdlKHRydWUpLAogICAgICAgbUN1cnJlbnRQYWdlU2FtcGxlcygwKSwKICAgICAgIG1OZXh0TGFjZUluZGV4KDApLAorICAgICAgbU1pbWVUeXBlKG1pbWVUeXBlKSwKKyAgICAgIG1OdW1IZWFkZXJzKG51bUhlYWRlcnMpLAorICAgICAgbVNlZWtQcmVSb2xsVXMoc2Vla1ByZVJvbGxVcyksCiAgICAgICBtRmlyc3REYXRhT2Zmc2V0KC0xKSB7CiAgICAgbUN1cnJlbnRQYWdlLm1OdW1TZWdtZW50cyA9IDA7CiAKQEAgLTIyNCwxNiArMzEwLDE2IEBACiAgICAgdm9yYmlzX2NvbW1lbnRfaW5pdCgmbVZjKTsKIH0KIAotTXlWb3JiaXNFeHRyYWN0b3I6On5NeVZvcmJpc0V4dHJhY3RvcigpIHsKK015T2dnRXh0cmFjdG9yOjp+TXlPZ2dFeHRyYWN0b3IoKSB7CiAgICAgdm9yYmlzX2NvbW1lbnRfY2xlYXIoJm1WYyk7CiAgICAgdm9yYmlzX2luZm9fY2xlYXIoJm1WaSk7CiB9CiAKLXNwPE1ldGFEYXRhPiBNeVZvcmJpc0V4dHJhY3Rvcjo6Z2V0Rm9ybWF0KCkgY29uc3Qgeworc3A8TWV0YURhdGE+IE15T2dnRXh0cmFjdG9yOjpnZXRGb3JtYXQoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1NZXRhOwogfQogCi1zdGF0dXNfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6ZmluZE5leHRQYWdlKAorc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6OmZpbmROZXh0UGFnZSgKICAgICAgICAgb2ZmNjRfdCBzdGFydE9mZnNldCwgb2ZmNjRfdCAqcGFnZU9mZnNldCkgewogICAgICpwYWdlT2Zmc2V0ID0gc3RhcnRPZmZzZXQ7CiAKQEAgLTI2NCw3ICszNTAsNyBAQAogLy8gaXQgKGlmIGFueSkgYW5kIHJldHVybiBpdHMgZ3JhbnVsZSBwb3NpdGlvbi4KIC8vIFRvIGRvIHRoaXMgd2UgYmFjayB1cCBmcm9tIHRoZSAiY3VycmVudCIgcGFnZSdzIG9mZnNldCB1bnRpbCB3ZSBmaW5kIGFueQogLy8gcGFnZSBwcmVjZWRpbmcgaXQgYW5kIHRoZW4gc2NhbiBmb3J3YXJkIHRvIGp1c3QgYmVmb3JlIHRoZSBjdXJyZW50IHBhZ2UuCi1zdGF0dXNfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6ZmluZFByZXZHcmFudWxlUG9zaXRpb24oCitzdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6ZmluZFByZXZHcmFudWxlUG9zaXRpb24oCiAgICAgICAgIG9mZjY0X3QgcGFnZU9mZnNldCwgdWludDY0X3QgKmdyYW51bGVQb3MpIHsKICAgICAqZ3JhbnVsZVBvcyA9IDA7CiAKQEAgLTI4MCw3ICszNjYsMTEgQEAKICAgICAgICAgQUxPR1YoImJhY2tpbmcgdXAgJWxsZCBieXRlcyIsIChsb25nIGxvbmcpKHBhZ2VPZmZzZXQgLSBwcmV2R3Vlc3MpKTsKIAogICAgICAgICBzdGF0dXNfdCBlcnIgPSBmaW5kTmV4dFBhZ2UocHJldkd1ZXNzLCAmcHJldlBhZ2VPZmZzZXQpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgLy8gV2UgYXJlIGF0IHRoZSBsYXN0IHBhZ2UgYW5kIGRpZG4ndCBiYWNrIG9mZiBlbm91Z2g7CisgICAgICAgICAgICAvLyBiYWNrIG9mZiA1MDAwIGJ5dGVzIG1vcmUgYW5kIHRyeSBhZ2Fpbi4KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogCkBAIC0zMTQsMTEgKzQwNCwyMCBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgTXlWb3JiaXNFeHRyYWN0b3I6OnNlZWtUb1RpbWUoaW50NjRfdCB0aW1lVXMpIHsKK3N0YXR1c190IE15T2dnRXh0cmFjdG9yOjpzZWVrVG9UaW1lKGludDY0X3QgdGltZVVzKSB7CisgICAgdGltZVVzIC09IG1TZWVrUHJlUm9sbFVzOworICAgIGlmICh0aW1lVXMgPCAwKSB7CisgICAgICAgIHRpbWVVcyA9IDA7CisgICAgfQorCiAgICAgaWYgKG1UYWJsZU9mQ29udGVudHMuaXNFbXB0eSgpKSB7CiAgICAgICAgIC8vIFBlcmZvcm0gYXBwcm94aW1hdGUgc2Vla2luZyBiYXNlZCBvbiBhdmcuIGJpdHJhdGUuCisgICAgICAgIHVpbnQ2NF90IGJwcyA9IGFwcHJveEJpdHJhdGUoKTsKKyAgICAgICAgaWYgKGJwcyA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KIAotICAgICAgICBvZmY2NF90IHBvcyA9IHRpbWVVcyAqIGFwcHJveEJpdHJhdGUoKSAvIDgwMDAwMDBsbDsKKyAgICAgICAgb2ZmNjRfdCBwb3MgPSB0aW1lVXMgKiBicHMgLyA4MDAwMDAwbGw7CiAKICAgICAgICAgQUxPR1YoInNlZWtpbmcgdG8gb2Zmc2V0ICVsbGQiLCAobG9uZyBsb25nKXBvcyk7CiAgICAgICAgIHJldHVybiBzZWVrVG9PZmZzZXQocG9zKTsKQEAgLTM1Myw3ICs0NTIsNyBAQAogICAgIHJldHVybiBzZWVrVG9PZmZzZXQoZW50cnkubVBhZ2VPZmZzZXQpOwogfQogCi1zdGF0dXNfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6c2Vla1RvT2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KSB7CitzdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6c2Vla1RvT2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KSB7CiAgICAgaWYgKG1GaXJzdERhdGFPZmZzZXQgPj0gMCAmJiBvZmZzZXQgPCBtRmlyc3REYXRhT2Zmc2V0KSB7CiAgICAgICAgIC8vIE9uY2Ugd2Uga25vdyB3aGVyZSB0aGUgYWN0dWFsIGF1ZGlvIGRhdGEgc3RhcnRzIChwYXN0IHRoZSBoZWFkZXJzKQogICAgICAgICAvLyBkb24ndCBldmVyIHNlZWsgdG8gYW55d2hlcmUgYmVmb3JlIHRoYXQuCkBAIC0zODYsNyArNDg1LDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXNzaXplX3QgTXlWb3JiaXNFeHRyYWN0b3I6OnJlYWRQYWdlKG9mZjY0X3Qgb2Zmc2V0LCBQYWdlICpwYWdlKSB7Citzc2l6ZV90IE15T2dnRXh0cmFjdG9yOjpyZWFkUGFnZShvZmY2NF90IG9mZnNldCwgUGFnZSAqcGFnZSkgewogICAgIHVpbnQ4X3QgaGVhZGVyWzI3XTsKICAgICBzc2l6ZV90IG47CiAgICAgaWYgKChuID0gbVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkpCkBAIC00NTcsNyArNTU2LDc1IEBACiAgICAgcmV0dXJuIHNpemVvZihoZWFkZXIpICsgcGFnZS0+bU51bVNlZ21lbnRzICsgdG90YWxTaXplOwogfQogCi1zdGF0dXNfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6cmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXIgKipvdXQsIGJvb2wgY29uZikgeworc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjpyZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlciAqKm91dCkgeworICAgIHN0YXR1c190IGVyciA9IF9yZWFkTmV4dFBhY2tldChvdXQsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqL2ZhbHNlKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50MzJfdCBjdXJyZW50UGFnZVNhbXBsZXM7CisgICAgLy8gQ2FsY3VsYXRlIHRpbWVzdGFtcHMgYnkgYWNjdW11bGF0aW5nIGR1cmF0aW9ucyBzdGFydGluZyBmcm9tIHRoZSBmaXJzdCBzYW1wbGUgb2YgYSBwYWdlOworICAgIC8vIFdlIGFzc3VtZSB0aGF0IHdlIG9ubHkgc2VlayB0byBwYWdlIGJvdW5kYXJpZXMuCisgICAgaWYgKCgqb3V0KS0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5VmFsaWRTYW1wbGVzLCAmY3VycmVudFBhZ2VTYW1wbGVzKSkgeworICAgICAgICAvLyBmaXJzdCBwYWNrZXQgaW4gcGFnZQorICAgICAgICBtQ3VyR3JhbnVsZVBvc2l0aW9uID0gbUN1cnJlbnRQYWdlLm1HcmFudWxlUG9zaXRpb24gLSBjdXJyZW50UGFnZVNhbXBsZXM7CisgICAgfQorCisgICAgaW50NjRfdCB0aW1lVXMgPSBnZXRUaW1lVXNPZkdyYW51bGUobUN1ckdyYW51bGVQb3NpdGlvbik7CisgICAgKCpvdXQpLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisKKyAgICB1aW50MzJfdCBmcmFtZXMgPSBnZXROdW1TYW1wbGVzSW5QYWNrZXQoKm91dCk7CisgICAgbUN1ckdyYW51bGVQb3NpdGlvbiArPSBmcmFtZXM7CisgICAgcmV0dXJuIE9LOworfQorCit1aW50MzJfdCBNeU9wdXNFeHRyYWN0b3I6OmdldE51bVNhbXBsZXNJblBhY2tldChNZWRpYUJ1ZmZlciAqYnVmZmVyKSBjb25zdCB7CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMIHx8IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPCAxKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHVpbnQ4X3QgKmRhdGEgPSAodWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKyAgICB1aW50OF90IHRvYyA9IGRhdGFbMF07CisgICAgdWludDhfdCBjb25maWcgPSAodG9jID4+IDMpICYgMHgxZjsKKyAgICB1aW50MzJfdCBmcmFtZVNpemVzVXNbXSA9IHsKKyAgICAgICAgMTAwMDAsIDIwMDAwLCA0MDAwMCwgNjAwMDAsIC8vIDAuLi4zCisgICAgICAgIDEwMDAwLCAyMDAwMCwgNDAwMDAsIDYwMDAwLCAvLyA0Li4uNworICAgICAgICAxMDAwMCwgMjAwMDAsIDQwMDAwLCA2MDAwMCwgLy8gOC4uLjExCisgICAgICAgIDEwMDAwLCAyMDAwMCwgICAgICAgICAgICAgICAvLyAxMi4uLjEzCisgICAgICAgIDEwMDAwLCAyMDAwMCwgICAgICAgICAgICAgICAvLyAxNC4uLjE1CisgICAgICAgIDI1MDAsIDUwMDAsIDEwMDAwLCAyMDAwMCwgICAvLyAxNi4uLjE5CisgICAgICAgIDI1MDAsIDUwMDAsIDEwMDAwLCAyMDAwMCwgICAvLyAyMC4uLjIzCisgICAgICAgIDI1MDAsIDUwMDAsIDEwMDAwLCAyMDAwMCwgICAvLyAyNC4uLjI3CisgICAgICAgIDI1MDAsIDUwMDAsIDEwMDAwLCAyMDAwMCAgICAvLyAyOC4uLjMxCisgICAgfTsKKyAgICB1aW50MzJfdCBmcmFtZVNpemVVcyA9IGZyYW1lU2l6ZXNVc1tjb25maWddOworCisgICAgdWludDMyX3QgbnVtRnJhbWVzOworICAgIHVpbnQ4X3QgYyA9IHRvYyAmIDM7CisgICAgc3dpdGNoIChjKSB7CisgICAgY2FzZSAwOgorICAgICAgICBudW1GcmFtZXMgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgY2FzZSAyOgorICAgICAgICBudW1GcmFtZXMgPSAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIGlmIChidWZmZXItPnJhbmdlX2xlbmd0aCgpIDwgMykgeworICAgICAgICAgICAgbnVtRnJhbWVzID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG51bUZyYW1lcyA9IGRhdGFbMl0gJiAweDNmOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorCisgICAgdWludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lU2l6ZVVzICogbnVtRnJhbWVzICoga09wdXNTYW1wbGVSYXRlIC8gMTAwMDAwMDsKKyAgICByZXR1cm4gbnVtU2FtcGxlczsKK30KKworc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6Ol9yZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlciAqKm91dCwgYm9vbCBjYWxjVm9yYmlzVGltZXN0YW1wKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gTlVMTDsKQEAgLTUyMyw5ICs2OTAsOCBAQAogICAgICAgICAgICAgICAgICAgICBtRmlyc3RQYWNrZXRJblBhZ2UgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGltZXN0YW1wIGZvciBjb25maWd1cmF0aW9uIHBhY2tldHMKLSAgICAgICAgICAgICAgICBpZiAoIWNvbmYpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjdXJCbG9ja1NpemUgPSBwYWNrZXRCbG9ja1NpemUoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoY2FsY1ZvcmJpc1RpbWVzdGFtcCkgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGN1ckJsb2NrU2l6ZSA9IGdldFBhY2tldEJsb2NrU2l6ZShidWZmZXIpOwogICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRQYWdlLm1QcmV2UGFja2V0U2l6ZSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50UGFnZS5tUHJldlBhY2tldFNpemUgPSBjdXJCbG9ja1NpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFBhZ2UubVByZXZQYWNrZXRQb3MgPQpAQCAtNTk3LDQzICs3NjMsMjQgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IE15Vm9yYmlzRXh0cmFjdG9yOjppbml0KCkgeworc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6OmluaXQoKSB7CiAgICAgbU1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbU1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpOworICAgIG1NZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbU1pbWVUeXBlKTsKIAotICAgIE1lZGlhQnVmZmVyICpwYWNrZXQ7CiAgICAgc3RhdHVzX3QgZXJyOwotICAgIGlmICgoZXJyID0gcmVhZE5leHRQYWNrZXQoJnBhY2tldCwgLyogY29uZiA9ICovIHRydWUpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBBTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlenVcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgIGVyciA9IHZlcmlmeUhlYWRlcihwYWNrZXQsIDEpOwotICAgIHBhY2tldC0+cmVsZWFzZSgpOwotICAgIHBhY2tldCA9IE5VTEw7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmICgoZXJyID0gcmVhZE5leHRQYWNrZXQoJnBhY2tldCwgLyogY29uZiA9ICovIHRydWUpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBBTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlenVcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgIGVyciA9IHZlcmlmeUhlYWRlcihwYWNrZXQsIDMpOwotICAgIHBhY2tldC0+cmVsZWFzZSgpOwotICAgIHBhY2tldCA9IE5VTEw7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmICgoZXJyID0gcmVhZE5leHRQYWNrZXQoJnBhY2tldCwgLyogY29uZiA9ICovIHRydWUpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBBTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlenVcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgIGVyciA9IHZlcmlmeUhlYWRlcihwYWNrZXQsIDUpOwotICAgIHBhY2tldC0+cmVsZWFzZSgpOwotICAgIHBhY2tldCA9IE5VTEw7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOworICAgIE1lZGlhQnVmZmVyICpwYWNrZXQ7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtSGVhZGVyczsgKytpKSB7CisgICAgICAgIC8vIGlnbm9yZSB0aW1lc3RhbXAgZm9yIGNvbmZpZ3VyYXRpb24gcGFja2V0cworICAgICAgICBpZiAoKGVyciA9IF9yZWFkTmV4dFBhY2tldCgmcGFja2V0LCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi8gZmFsc2UpKSAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlenVcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICBlcnIgPSB2ZXJpZnlIZWFkZXIocGFja2V0LCAvKiB0eXBlID0gKi8gaSAqIDIgKyAxKTsKKyAgICAgICAgcGFja2V0LT5yZWxlYXNlKCk7CisgICAgICAgIHBhY2tldCA9IE5VTEw7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KICAgICB9CiAKICAgICBtRmlyc3REYXRhT2Zmc2V0ID0gbU9mZnNldCArIG1DdXJyZW50UGFnZVNpemU7CkBAIC02NDksNyArNzk2LDcgQEAKICAgICAgICAgLy8gd2UgY2FuIG9ubHkgYXBwcm94aW1hdGUgdXNpbmcgYXZnLiBiaXRyYXRlIGlmIHNlZWtpbmcgdG8KICAgICAgICAgLy8gdGhlIGVuZCBpcyB0b28gZXhwZW5zaXZlIG9yIGltcG9zc2libGUgKGxpdmUgc3RyZWFtaW5nKS4KIAotICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSBsYXN0R3JhbnVsZVBvc2l0aW9uICogMTAwMDAwMGxsIC8gbVZpLnJhdGU7CisgICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9IGdldFRpbWVVc09mR3JhbnVsZShsYXN0R3JhbnVsZVBvc2l0aW9uKTsKIAogICAgICAgICBtTWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKIApAQCAtNjU5LDcgKzgwNiw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIE15Vm9yYmlzRXh0cmFjdG9yOjpidWlsZFRhYmxlT2ZDb250ZW50cygpIHsKK3ZvaWQgTXlPZ2dFeHRyYWN0b3I6OmJ1aWxkVGFibGVPZkNvbnRlbnRzKCkgewogICAgIG9mZjY0X3Qgb2Zmc2V0ID0gbUZpcnN0RGF0YU9mZnNldDsKICAgICBQYWdlIHBhZ2U7CiAgICAgc3NpemVfdCBwYWdlU2l6ZTsKQEAgLTY3MCw3ICs4MTcsNyBAQAogICAgICAgICAgICAgbVRhYmxlT2ZDb250ZW50cy5lZGl0SXRlbUF0KG1UYWJsZU9mQ29udGVudHMuc2l6ZSgpIC0gMSk7CiAKICAgICAgICAgZW50cnkubVBhZ2VPZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgIGVudHJ5Lm1UaW1lVXMgPSBwYWdlLm1HcmFudWxlUG9zaXRpb24gKiAxMDAwMDAwbGwgLyBtVmkucmF0ZTsKKyAgICAgICAgZW50cnkubVRpbWVVcyA9IGdldFRpbWVVc09mR3JhbnVsZShwYWdlLm1HcmFudWxlUG9zaXRpb24pOwogCiAgICAgICAgIG9mZnNldCArPSAoc2l6ZV90KXBhZ2VTaXplOwogICAgIH0KQEAgLTY5OCw3ICs4NDUsNyBAQAogICAgIH0KIH0KIAotaW50MzJfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6cGFja2V0QmxvY2tTaXplKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKK2ludDMyX3QgTXlPZ2dFeHRyYWN0b3I6OmdldFBhY2tldEJsb2NrU2l6ZShNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7CiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9CiAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOwogCkBAIC03MjcsNiArODc0LDE0NCBAQAogICAgIHJldHVybiB2b3JiaXNfcGFja2V0X2Jsb2Nrc2l6ZSgmbVZpLCAmcGFjayk7CiB9CiAKK2ludDY0X3QgTXlPcHVzRXh0cmFjdG9yOjpnZXRUaW1lVXNPZkdyYW51bGUodWludDY0X3QgZ3JhbnVsZVBvcykgY29uc3QgeworICAgIHVpbnQ2NF90IHBjbVNhbXBsZVBvc2l0aW9uID0gMDsKKyAgICBpZiAoZ3JhbnVsZVBvcyA+IG1Db2RlY0RlbGF5KSB7CisgICAgICAgIHBjbVNhbXBsZVBvc2l0aW9uID0gZ3JhbnVsZVBvcyAtIG1Db2RlY0RlbGF5OworICAgIH0KKyAgICByZXR1cm4gcGNtU2FtcGxlUG9zaXRpb24gKiAxMDAwMDAwbGwgLyBrT3B1c1NhbXBsZVJhdGU7Cit9CisKK3N0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6dmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAvLyB0aGVyZSBhcmUgYWN0dWFsbHkgbm8gaGVhZGVyIHR5cGVzIGRlZmluZWQgaW4gdGhlIE9wdXMgc3BlYzsgd2UgY2hvb3NlIDEgYW5kIDMgdG8gbWVhbgorICAgICAgICAvLyBoZWFkZXIgYW5kIGNvbW1lbnRzIHN1Y2ggdGhhdCB3ZSBjYW4gc2hhcmUgY29kZSB3aXRoIE15Vm9yYmlzRXh0cmFjdG9yLgorICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICByZXR1cm4gdmVyaWZ5T3B1c0hlYWRlcihidWZmZXIpOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICByZXR1cm4gdmVyaWZ5T3B1c0NvbW1lbnRzKGJ1ZmZlcik7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorfQorCitzdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeU9wdXNIZWFkZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgeworICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlclNpemUgPSAxOTsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0KKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CisKKyAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisKKyAgICBpZiAoc2l6ZSA8IGtPcHVzSGVhZGVyU2l6ZQorICAgICAgICAgICAgfHwgbWVtY21wKGRhdGEsICJPcHVzSGVhZCIsIDgpCisgICAgICAgICAgICB8fCAvKiB2ZXJzaW9uID0gKi8gZGF0YVs4XSAhPSAxKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgbUNoYW5uZWxDb3VudCA9IGRhdGFbOV07CisgICAgbUNvZGVjRGVsYXkgPSBVMTZMRV9BVCgmZGF0YVsxMF0pOworCisgICAgbU1ldGEtPnNldERhdGEoa0tleU9wdXNIZWFkZXIsIDAsIGRhdGEsIHNpemUpOworICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwga09wdXNTYW1wbGVSYXRlKTsKKyAgICBtTWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbUNoYW5uZWxDb3VudCk7CisgICAgbU1ldGEtPnNldEludDY0KGtLZXlPcHVzU2Vla1ByZVJvbGwgLyogbnMgKi8sIGtPcHVzU2Vla1ByZVJvbGxVcyAqIDEwMDAgLyogPSA4MCBtcyovKTsKKyAgICBtTWV0YS0+c2V0SW50NjQoa0tleU9wdXNDb2RlY0RlbGF5IC8qIG5zICovLAorICAgICAgICAgICAgbUNvZGVjRGVsYXkgLyogc2FtcGxlL3MgKi8gKiAxMDAwMDAwMDAwIC8ga09wdXNTYW1wbGVSYXRlKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjp2ZXJpZnlPcHVzQ29tbWVudHMoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgeworICAgIC8vIGFkZCBhcnRpZmljaWFsIGZyYW1pbmcgYml0IHNvIHdlIGNhbiByZXVzZSBfdm9yYmlzX3VucGFja19jb21tZW50CisgICAgaW50MzJfdCBjb21tZW50U2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgKyAxOworICAgIHNwPEFCdWZmZXI+IGFCdWYgPSBuZXcgQUJ1ZmZlcihjb21tZW50U2l6ZSk7CisgICAgaWYgKGFCdWYtPmNhcGFjaXR5KCkgPD0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQ4X3QqIGNvbW1lbnREYXRhID0gYUJ1Zi0+ZGF0YSgpOworICAgIG1lbWNweShjb21tZW50RGF0YSwKKyAgICAgICAgICAgICh1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAorICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisKKyAgICBvZ2dfYnVmZmVyIGJ1ZjsKKyAgICBidWYuZGF0YSA9IGNvbW1lbnREYXRhOworICAgIGJ1Zi5zaXplID0gY29tbWVudFNpemU7CisgICAgYnVmLnJlZmNvdW50ID0gMTsKKyAgICBidWYucHRyLm93bmVyID0gTlVMTDsKKworICAgIG9nZ19yZWZlcmVuY2UgcmVmOworICAgIHJlZi5idWZmZXIgPSAmYnVmOworICAgIHJlZi5iZWdpbiA9IDA7CisgICAgcmVmLmxlbmd0aCA9IGNvbW1lbnRTaXplOworICAgIHJlZi5uZXh0ID0gTlVMTDsKKworICAgIG9nZ3BhY2tfYnVmZmVyIGJpdHM7CisgICAgb2dncGFja19yZWFkaW5pdCgmYml0cywgJnJlZik7CisKKyAgICAvLyBza2lwICdPcHVzVGFncycKKyAgICBjb25zdCBjaGFyICpPcHVzVGFncyA9ICJPcHVzVGFncyI7CisgICAgY29uc3QgaW50MzJfdCBoZWFkZXJMZW4gPSBzdHJsZW4oT3B1c1RhZ3MpOworICAgIGludDMyX3QgZnJhbWluZ0JpdE9mZnNldCA9IGhlYWRlckxlbjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlckxlbjsgKytpKSB7CisgICAgICAgIGNoYXIgY2hyID0gb2dncGFja19yZWFkKCZiaXRzLCA4KTsKKyAgICAgICAgaWYgKGNociAhPSBPcHVzVGFnc1tpXSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludDMyX3QgdmVuZG9yTGVuID0gb2dncGFja19yZWFkKCZiaXRzLCAzMik7CisgICAgZnJhbWluZ0JpdE9mZnNldCArPSA0OworICAgIGlmICh2ZW5kb3JMZW4gPCAwIHx8IHZlbmRvckxlbiA+IGNvbW1lbnRTaXplIC0gOCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICAvLyBza2lwIHZlbmRvciBzdHJpbmcKKyAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IHZlbmRvckxlbjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlbmRvckxlbjsgKytpKSB7CisgICAgICAgIG9nZ3BhY2tfcmVhZCgmYml0cywgOCk7CisgICAgfQorCisgICAgaW50MzJfdCBuID0gb2dncGFja19yZWFkKCZiaXRzLCAzMik7CisgICAgZnJhbWluZ0JpdE9mZnNldCArPSA0OworICAgIGlmIChuIDwgMCB8fCBuID4gKChjb21tZW50U2l6ZSAtIG9nZ3BhY2tfYnl0ZXMoJmJpdHMpKSA+PiAyKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBpbnQzMl90IGxlbiA9IG9nZ3BhY2tfcmVhZCgmYml0cywgMzIpOworICAgICAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IDQ7CisgICAgICAgIGlmIChsZW4gIDwgMCB8fCBsZW4gID4gKGNvbW1lbnRTaXplIC0gb2dncGFja19ieXRlcygmYml0cykpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIGZyYW1pbmdCaXRPZmZzZXQgKz0gbGVuOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbjsgKytqKSB7CisgICAgICAgICAgICBvZ2dwYWNrX3JlYWQoJmJpdHMsIDgpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChmcmFtaW5nQml0T2Zmc2V0IDwgMCB8fCBmcmFtaW5nQml0T2Zmc2V0ID49IGNvbW1lbnRTaXplKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGNvbW1lbnREYXRhW2ZyYW1pbmdCaXRPZmZzZXRdID0gMTsKKworICAgIGJ1Zi5kYXRhID0gY29tbWVudERhdGEgKyBoZWFkZXJMZW47CisgICAgYnVmLnNpemUgPSBjb21tZW50U2l6ZSAtIGhlYWRlckxlbjsKKyAgICBidWYucmVmY291bnQgPSAxOworICAgIGJ1Zi5wdHIub3duZXIgPSBOVUxMOworCisgICAgcmVmLmJ1ZmZlciA9ICZidWY7CisgICAgcmVmLmJlZ2luID0gMDsKKyAgICByZWYubGVuZ3RoID0gY29tbWVudFNpemUgLSBoZWFkZXJMZW47CisgICAgcmVmLm5leHQgPSBOVUxMOworCisgICAgb2dncGFja19yZWFkaW5pdCgmYml0cywgJnJlZik7CisgICAgaW50IGVyciA9IF92b3JiaXNfdW5wYWNrX2NvbW1lbnQoJm1WYywgJmJpdHMpOworICAgIGlmICgwICE9IGVycikgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHBhcnNlRmlsZU1ldGFEYXRhKCk7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6dmVyaWZ5SGVhZGVyKAogICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpIHsKICAgICBjb25zdCB1aW50OF90ICpkYXRhID0KQEAgLTgxNCw3ICsxMDk5LDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXVpbnQ2NF90IE15Vm9yYmlzRXh0cmFjdG9yOjphcHByb3hCaXRyYXRlKCkgewordWludDY0X3QgTXlWb3JiaXNFeHRyYWN0b3I6OmFwcHJveEJpdHJhdGUoKSBjb25zdCB7CiAgICAgaWYgKG1WaS5iaXRyYXRlX25vbWluYWwgIT0gMCkgewogICAgICAgICByZXR1cm4gbVZpLmJpdHJhdGVfbm9taW5hbDsKICAgICB9CkBAIC04MjIsNyArMTEwNyw3IEBACiAgICAgcmV0dXJuIChtVmkuYml0cmF0ZV9sb3dlciArIG1WaS5iaXRyYXRlX3VwcGVyKSAvIDI7CiB9CiAKLXZvaWQgTXlWb3JiaXNFeHRyYWN0b3I6OnBhcnNlRmlsZU1ldGFEYXRhKCkgewordm9pZCBNeU9nZ0V4dHJhY3Rvcjo6cGFyc2VGaWxlTWV0YURhdGEoKSB7CiAgICAgbUZpbGVNZXRhID0gbmV3IE1ldGFEYXRhOwogICAgIG1GaWxlTWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9PR0cpOwogCkBAIC0xMDI2LDExICsxMzExLDIzIEBACiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKICAgICAgIG1JbXBsKE5VTEwpIHsKLSAgICBtSW1wbCA9IG5ldyBNeVZvcmJpc0V4dHJhY3RvcihtRGF0YVNvdXJjZSk7Ci0gICAgbUluaXRDaGVjayA9IG1JbXBsLT5zZWVrVG9PZmZzZXQoMCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgICAgaWYgKG1JbXBsICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBtSW1wbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICBtSW1wbCA9IG5ldyBNeVZvcmJpc0V4dHJhY3RvcihtRGF0YVNvdXJjZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSW1wbCA9IG5ldyBNeU9wdXNFeHRyYWN0b3IobURhdGFTb3VyY2UpOworICAgICAgICB9CisgICAgICAgIG1Jbml0Q2hlY2sgPSBtSW1wbC0+c2Vla1RvT2Zmc2V0KDApOwogCi0gICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0spIHsKLSAgICAgICAgbUluaXRDaGVjayA9IG1JbXBsLT5pbml0KCk7CisgICAgICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7CisgICAgICAgICAgICBtSW5pdENoZWNrID0gbUltcGwtPmluaXQoKTsKKyAgICAgICAgICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZVRhYmxlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZVRhYmxlLmNwcAppbmRleCA3Zjk4NDg1Li40MGRmMzRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVUYWJsZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlVGFibGUuY3BwCkBAIC0zMzUsNyArMzM1LDcgQEAKICAgICB9CiAKICAgICBtVGltZVRvU2FtcGxlQ291bnQgPSBVMzJfQVQoJmhlYWRlcls0XSk7Ci0gICAgdWludDY0X3QgYWxsb2NTaXplID0gbVRpbWVUb1NhbXBsZUNvdW50ICogMiAqICh1aW50NjRfdClzaXplb2YodWludDMyX3QpOworICAgIHVpbnQ2NF90IGFsbG9jU2l6ZSA9ICh1aW50NjRfdCltVGltZVRvU2FtcGxlQ291bnQgKiAyICogc2l6ZW9mKHVpbnQzMl90KTsKICAgICBpZiAoYWxsb2NTaXplID4gU0laRV9NQVgpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKICAgICB9CkBAIC0zODMsNyArMzgzLDcgQEAKICAgICB9CiAKICAgICBtTnVtQ29tcG9zaXRpb25UaW1lRGVsdGFFbnRyaWVzID0gbnVtRW50cmllczsKLSAgICB1aW50NjRfdCBhbGxvY1NpemUgPSBudW1FbnRyaWVzICogMiAqICh1aW50NjRfdClzaXplb2YodWludDMyX3QpOworICAgIHVpbnQ2NF90IGFsbG9jU2l6ZSA9ICh1aW50NjRfdCludW1FbnRyaWVzICogMiAqIHNpemVvZih1aW50MzJfdCk7CiAgICAgaWYgKGFsbG9jU2l6ZSA+IFNJWkVfTUFYKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwCmluZGV4IDJkOWIzZDQuLjgwMWZmMjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAKQEAgLTUzLDcgKzUzLDEwIEBACiAgICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgewogICAgICAgICBleHRIZWFkZXJzID0gKmhlYWRlcnM7CiAgICAgfQotICAgIGV4dEhlYWRlcnMuYWRkKFN0cmluZzgoIlVzZXItQWdlbnQiKSwgU3RyaW5nOChNYWtlVXNlckFnZW50KCkuY19zdHIoKSkpOworCisgICAgaWYgKGV4dEhlYWRlcnMuaW5kZXhPZktleShTdHJpbmc4KCJVc2VyLUFnZW50IikpIDwgMCkgeworICAgICAgICBleHRIZWFkZXJzLmFkZChTdHJpbmc4KCJVc2VyLUFnZW50IiksIFN0cmluZzgoTWFrZVVzZXJBZ2VudCgpLmNfc3RyKCkpKTsKKyAgICB9CiAKICAgICBib29sIHN1Y2Nlc3MgPSBtSFRUUENvbm5lY3Rpb24tPmNvbm5lY3QodXJpLCAmZXh0SGVhZGVycyk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oCmluZGV4IDc2ZGY4MTUuLmY2OGUwYTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVhOb2RlSW5zdGFuY2UuaApAQCAtMTI1LDYgKzEyNSw4IEBACiAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLAogICAgICAgICAgICAgc2l6ZV90IHNpemUpOwogCisgICAgLy8gaGFuZGxlcyBtZXNzYWdlcyBhbmQgcmVtb3ZlcyB0aGVtIGZyb20gdGhlIGxpc3QKKyAgICB2b2lkIG9uTWVzc2FnZXMoc3RkOjpsaXN0PG9teF9tZXNzYWdlPiAmbWVzc2FnZXMpOwogICAgIHZvaWQgb25NZXNzYWdlKGNvbnN0IG9teF9tZXNzYWdlICZtc2cpOwogICAgIHZvaWQgb25PYnNlcnZlckRpZWQoT01YTWFzdGVyICptYXN0ZXIpOwogICAgIHZvaWQgb25HZXRIYW5kbGVGYWlsZWQoKTsKQEAgLTIzMSw2ICsyMzMsMTAgQEAKICAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBnZXRHcmFwaGljQnVmZmVyU291cmNlKCk7CiAgICAgdm9pZCBzZXRHcmFwaGljQnVmZmVyU291cmNlKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBidWZmZXJTb3VyY2UpOwogCisgICAgLy8gSGFuZGxlcyB8bXNnfCwgYW5kIG1heSBtb2RpZnkgaXQuIFJldHVybnMgdHJ1ZSBpZmYgY29tcGxldGVseSBoYW5kbGVkIGl0IGFuZAorICAgIC8vIHxtc2d8IGRvZXMgbm90IG5lZWQgdG8gYmUgc2VudCB0byB0aGUgZXZlbnQgbGlzdGVuZXIuCisgICAgYm9vbCBoYW5kbGVNZXNzYWdlKG9teF9tZXNzYWdlICZtc2cpOworCiAgICAgT01YTm9kZUluc3RhbmNlKGNvbnN0IE9NWE5vZGVJbnN0YW5jZSAmKTsKICAgICBPTVhOb2RlSW5zdGFuY2UgJm9wZXJhdG9yPShjb25zdCBPTVhOb2RlSW5zdGFuY2UgJik7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PZ2dFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT2dnRXh0cmFjdG9yLmgKaW5kZXggZTk3YzhjZC4uYzY0N2NiYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PZ2dFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09nZ0V4dHJhY3Rvci5oCkBAIC0yNyw3ICsyNyw3IEBACiBjbGFzcyBEYXRhU291cmNlOwogY2xhc3MgU3RyaW5nODsKIAotc3RydWN0IE15Vm9yYmlzRXh0cmFjdG9yOworc3RydWN0IE15T2dnRXh0cmFjdG9yOwogc3RydWN0IE9nZ1NvdXJjZTsKIAogc3RydWN0IE9nZ0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CkBAIC00OCw3ICs0OCw3IEBACiAgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKIAotICAgIE15Vm9yYmlzRXh0cmFjdG9yICptSW1wbDsKKyAgICBNeU9nZ0V4dHJhY3RvciAqbUltcGw7CiAKICAgICBPZ2dFeHRyYWN0b3IoY29uc3QgT2dnRXh0cmFjdG9yICYpOwogICAgIE9nZ0V4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE9nZ0V4dHJhY3RvciAmKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKaW5kZXggNzYyMTdlYy4uZTk0YWRiZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKQEAgLTYxLDcgKzYxLDExIEBACiBzdHJ1Y3QgT01YOjpDYWxsYmFja0Rpc3BhdGNoZXIgOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgQ2FsbGJhY2tEaXNwYXRjaGVyKE9NWE5vZGVJbnN0YW5jZSAqb3duZXIpOwogCi0gICAgdm9pZCBwb3N0KGNvbnN0IG9teF9tZXNzYWdlICZtc2cpOworICAgIC8vIFBvc3RzIHxtc2d8IHRvIHRoZSBsaXN0ZW5lcidzIHF1ZXVlLiBJZiB8cmVhbFRpbWV8IGlzIHRydWUsIHRoZSBsaXN0ZW5lciB0aHJlYWQgaXMgbm90aWZpZWQKKyAgICAvLyB0aGF0IGEgbmV3IG1lc3NhZ2UgaXMgYXZhaWxhYmxlIG9uIHRoZSBxdWV1ZS4gT3RoZXJ3aXNlLCB0aGUgbWVzc2FnZSBzdGF5cyBvbiB0aGUgcXVldWUsIGJ1dAorICAgIC8vIHRoZSBsaXN0ZW5lciBpcyBub3Qgbm90aWZpZWQgb2YgaXQuIEl0IHdpbGwgcHJvY2VzcyB0aGlzIG1lc3NhZ2Ugd2hlbiBhIHN1YnNlcXVlbnQgbWVzc2FnZQorICAgIC8vIGlzIHBvc3RlZCB3aXRoIHxyZWFsVGltZXwgc2V0IHRvIHRydWUuCisgICAgdm9pZCBwb3N0KGNvbnN0IG9teF9tZXNzYWdlICZtc2csIGJvb2wgcmVhbFRpbWUgPSB0cnVlKTsKIAogICAgIGJvb2wgbG9vcCgpOwogCkBAIC03NCwxMSArNzgsMTEgQEAKICAgICBPTVhOb2RlSW5zdGFuY2UgKm1Pd25lcjsKICAgICBib29sIG1Eb25lOwogICAgIENvbmRpdGlvbiBtUXVldWVDaGFuZ2VkOwotICAgIExpc3Q8b214X21lc3NhZ2U+IG1RdWV1ZTsKKyAgICBzdGQ6Omxpc3Q8b214X21lc3NhZ2U+IG1RdWV1ZTsKIAogICAgIHNwPENhbGxiYWNrRGlzcGF0Y2hlclRocmVhZD4gbVRocmVhZDsKIAotICAgIHZvaWQgZGlzcGF0Y2goY29uc3Qgb214X21lc3NhZ2UgJm1zZyk7CisgICAgdm9pZCBkaXNwYXRjaChzdGQ6Omxpc3Q8b214X21lc3NhZ2U+ICZtZXNzYWdlcyk7CiAKICAgICBDYWxsYmFja0Rpc3BhdGNoZXIoY29uc3QgQ2FsbGJhY2tEaXNwYXRjaGVyICYpOwogICAgIENhbGxiYWNrRGlzcGF0Y2hlciAmb3BlcmF0b3I9KGNvbnN0IENhbGxiYWNrRGlzcGF0Y2hlciAmKTsKQEAgLTEwOSwyNCArMTEzLDI2IEBACiAgICAgfQogfQogCi12b2lkIE9NWDo6Q2FsbGJhY2tEaXNwYXRjaGVyOjpwb3N0KGNvbnN0IG9teF9tZXNzYWdlICZtc2cpIHsKK3ZvaWQgT01YOjpDYWxsYmFja0Rpc3BhdGNoZXI6OnBvc3QoY29uc3Qgb214X21lc3NhZ2UgJm1zZywgYm9vbCByZWFsVGltZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBtUXVldWUucHVzaF9iYWNrKG1zZyk7Ci0gICAgbVF1ZXVlQ2hhbmdlZC5zaWduYWwoKTsKKyAgICBpZiAocmVhbFRpbWUpIHsKKyAgICAgICAgbVF1ZXVlQ2hhbmdlZC5zaWduYWwoKTsKKyAgICB9CiB9CiAKLXZvaWQgT01YOjpDYWxsYmFja0Rpc3BhdGNoZXI6OmRpc3BhdGNoKGNvbnN0IG9teF9tZXNzYWdlICZtc2cpIHsKK3ZvaWQgT01YOjpDYWxsYmFja0Rpc3BhdGNoZXI6OmRpc3BhdGNoKHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT4gJm1lc3NhZ2VzKSB7CiAgICAgaWYgKG1Pd25lciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJXb3VsZCBoYXZlIGRpc3BhdGNoZWQgYSBtZXNzYWdlIHRvIGEgbm9kZSB0aGF0J3MgYWxyZWFkeSBnb25lLiIpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIG1Pd25lci0+b25NZXNzYWdlKG1zZyk7CisgICAgbU93bmVyLT5vbk1lc3NhZ2VzKG1lc3NhZ2VzKTsKIH0KIAogYm9vbCBPTVg6OkNhbGxiYWNrRGlzcGF0Y2hlcjo6bG9vcCgpIHsKICAgICBmb3IgKDs7KSB7Ci0gICAgICAgIG9teF9tZXNzYWdlIG1zZzsKKyAgICAgICAgc3RkOjpsaXN0PG9teF9tZXNzYWdlPiBtZXNzYWdlczsKIAogICAgICAgICB7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwpAQCAtMTM4LDExICsxNDQsMTAgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbXNnID0gKm1RdWV1ZS5iZWdpbigpOwotICAgICAgICAgICAgbVF1ZXVlLmVyYXNlKG1RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIG1lc3NhZ2VzLnN3YXAobVF1ZXVlKTsKICAgICAgICAgfQogCi0gICAgICAgIGRpc3BhdGNoKG1zZyk7CisgICAgICAgIGRpc3BhdGNoKG1lc3NhZ2VzKTsKICAgICB9CiAKICAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCmluZGV4IDllMzk5ZjkuLjdlOTJkYTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCkBAIC0xMzU3LDcgKzEzNTcsNyBAQAogICAgIH0KIH0KIAotdm9pZCBPTVhOb2RlSW5zdGFuY2U6Om9uTWVzc2FnZShjb25zdCBvbXhfbWVzc2FnZSAmbXNnKSB7Citib29sIE9NWE5vZGVJbnN0YW5jZTo6aGFuZGxlTWVzc2FnZShvbXhfbWVzc2FnZSAmbXNnKSB7CiAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4mIGJ1ZmZlclNvdXJjZShnZXRHcmFwaGljQnVmZmVyU291cmNlKCkpOwogCiAgICAgaWYgKG1zZy50eXBlID09IG9teF9tZXNzYWdlOjpGSUxMX0JVRkZFUl9ET05FKSB7CkBAIC0xMzg0LDEwICsxMzg0LDcgQEAKICAgICAgICAgICAgIC8vIGZpeCB1cCB0aGUgYnVmZmVyIGluZm8gKGVzcGVjaWFsbHkgdGltZXN0YW1wKSBpZiBuZWVkZWQKICAgICAgICAgICAgIGJ1ZmZlclNvdXJjZS0+Y29kZWNCdWZmZXJGaWxsZWQoYnVmZmVyKTsKIAotICAgICAgICAgICAgb214X21lc3NhZ2UgbmV3TXNnID0gbXNnOwotICAgICAgICAgICAgbmV3TXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEudGltZXN0YW1wID0gYnVmZmVyLT5uVGltZVN0YW1wOwotICAgICAgICAgICAgbU9ic2VydmVyLT5vbk1lc3NhZ2UobmV3TXNnKTsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnRpbWVzdGFtcCA9IGJ1ZmZlci0+blRpbWVTdGFtcDsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobXNnLnR5cGUgPT0gb214X21lc3NhZ2U6OkVNUFRZX0JVRkZFUl9ET05FKSB7CiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIgPQpAQCAtMTQwOCwxMSArMTQwNSwyMyBAQAogICAgICAgICAgICAgLy8ga25vdyB0aGF0IGFueW9uZSBhc2tlZCB0byBoYXZlIHRoZSBidWZmZXIgZW1wdGllZCBhbmQgd2lsbAogICAgICAgICAgICAgLy8gYmUgdmVyeSBjb25mdXNlZC4KICAgICAgICAgICAgIGJ1ZmZlclNvdXJjZS0+Y29kZWNCdWZmZXJFbXB0aWVkKGJ1ZmZlciwgbXNnLmZlbmNlRmQpOwotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtT2JzZXJ2ZXItPm9uTWVzc2FnZShtc2cpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBPTVhOb2RlSW5zdGFuY2U6Om9uTWVzc2FnZXMoc3RkOjpsaXN0PG9teF9tZXNzYWdlPiAmbWVzc2FnZXMpIHsKKyAgICBmb3IgKHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT46Oml0ZXJhdG9yIGl0ID0gbWVzc2FnZXMuYmVnaW4oKTsgaXQgIT0gbWVzc2FnZXMuZW5kKCk7ICkgeworICAgICAgICBpZiAoaGFuZGxlTWVzc2FnZSgqaXQpKSB7CisgICAgICAgICAgICBtZXNzYWdlcy5lcmFzZShpdCsrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtT2JzZXJ2ZXItPm9uTWVzc2FnZXMobWVzc2FnZXMpOwogfQogCiB2b2lkIE9NWE5vZGVJbnN0YW5jZTo6b25PYnNlcnZlckRpZWQoT01YTWFzdGVyICptYXN0ZXIpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcAppbmRleCAyOTRiMmVkLi42NDRiNmVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwCkBAIC02NCw5ICs2NCwxMSBAQAogICAgIHJldHVybiBtT01YICE9IDAgPyBPSyA6IE5PX0lOSVQ7CiB9CiAKLXZvaWQgSGFybmVzczo6b25NZXNzYWdlKGNvbnN0IG9teF9tZXNzYWdlICZtc2cpIHsKK3ZvaWQgSGFybmVzczo6b25NZXNzYWdlcyhjb25zdCBzdGQ6Omxpc3Q8b214X21lc3NhZ2U+ICZtZXNzYWdlcykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbU1lc3NhZ2VRdWV1ZS5wdXNoX2JhY2sobXNnKTsKKyAgICBmb3IgKHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWVzc2FnZXMuY2JlZ2luKCk7IGl0ICE9IG1lc3NhZ2VzLmNlbmQoKTsgKSB7CisgICAgICAgIG1NZXNzYWdlUXVldWUucHVzaF9iYWNrKCppdCsrKTsKKyAgICB9CiAgICAgbU1lc3NhZ2VBZGRlZENvbmRpdGlvbi5zaWduYWwoKTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmgKaW5kZXggYmI4ZmQwYy4uMWViZjNhYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5oCkBAIC03NCw3ICs3NCw3IEBACiAKICAgICBzdGF0dXNfdCB0ZXN0QWxsKCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlKGNvbnN0IG9teF9tZXNzYWdlICZtc2cpOworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VzKGNvbnN0IHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT4gJm1lc3NhZ2VzKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkhhcm5lc3MoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCmluZGV4IDgyYzllNTUuLjBhZGFhYzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcApAQCAtNDU4NSw3ICs0NTg1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKIHsKLSAgICBBTE9HVlYoInNldFN0cmF0ZWd5TXV0ZSgpIHN0cmF0ZWd5ICVkLCBtdXRlICVkLCBvdXRwdXQgJWQiLCBzdHJhdGVneSwgb24sIG91dHB1dCk7CisgICAgQUxPR1ZWKCJzZXRTdHJhdGVneU11dGUoKSBzdHJhdGVneSAlZCwgbXV0ZSAlZCwgb3V0cHV0IElEICVkIiwKKyAgICAgICAgICAgc3RyYXRlZ3ksIG9uLCBvdXRwdXREZXNjLT5nZXRJZCgpKTsKICAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOyBzdHJlYW0rKykgewogICAgICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9QQVRDSCkgewogICAgICAgICAgICAgY29udGludWU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCmluZGV4IDZmMDczZWQuLmY0MmZhZGEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCkBAIC0xODY0LDcgKzE4NjQsOCBAQAogICAgIGlmIChyZXMgPT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9JR05PUkVEKSB7CiAgICAgICAgIEFMT0dJKCJDYW1lcmEgJWQ6IEFjY2VzcyBmb3IgXCIlc1wiIGhhcyBiZWVuIHJlc3RyaWN0ZWQiLAogICAgICAgICAgICAgICAgIG1DYW1lcmFJZCwgU3RyaW5nOChtQ2xpZW50UGFja2FnZU5hbWUpLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAvLyBSZXR1cm4gdGhlIHNhbWUgZXJyb3IgYXMgZm9yIGRldmljZSBwb2xpY3kgbWFuYWdlciByZWplY3Rpb24KKyAgICAgICAgcmV0dXJuIC1FQUNDRVM7CiAgICAgfQogCiAgICAgbU9wc0FjdGl2ZSA9IHRydWU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKaW5kZXggYjZmNjY3Ny4uNGQyNzZiZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcApAQCAtMjY5LDE0ICsyNjksMzQgQEAKIAogc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpiZWdpbkNvbmZpZ3VyZSgpIHsKICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcy4KLSAgICBBTE9HRSgiJXM6IE5vdCBpbXBsZW1lbnRlZCB5ZXQuIiwgX19GVU5DVElPTl9fKTsKKyAgICBBTE9HVigiJXM6IE5vdCBpbXBsZW1lbnRlZCB5ZXQuIiwgX19GVU5DVElPTl9fKTsKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6ZW5kQ29uZmlndXJlKCkgeworc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjplbmRDb25maWd1cmUoYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkKSB7CiAgICAgQUxPR1YoIiVzOiBlbmRpbmcgY29uZmlndXJlICglZCBpbnB1dCBzdHJlYW0sICV6dSBvdXRwdXQgc3RyZWFtcykiLAogICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSW5wdXRTdHJlYW0uY29uZmlndXJlZCA/IDEgOiAwLCBtU3RyZWFtTWFwLnNpemUoKSk7CiAKKyAgICAvLyBTYW5pdGl6ZSB0aGUgaGlnaCBzcGVlZCBzZXNzaW9uIGFnYWluc3QgbmVjZXNzYXJ5IGNhcGFiaWxpdHkgYml0LgorICAgIGlmIChpc0NvbnN0cmFpbmVkSGlnaFNwZWVkKSB7CisgICAgICAgIENhbWVyYU1ldGFkYXRhIHN0YXRpY0luZm8gPSBtRGV2aWNlLT5pbmZvKCk7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICAgICAgYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgKytpKSB7CisgICAgICAgICAgICB1aW50OF90IGNhcGFiaWxpdHkgPSBlbnRyeS5kYXRhLnU4W2ldOworICAgICAgICAgICAgaWYgKGNhcGFiaWxpdHkgPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfQ09OU1RSQUlORURfSElHSF9TUEVFRF9WSURFTykgeworICAgICAgICAgICAgICAgIGlzQ29uc3RyYWluZWRIaWdoU3BlZWRTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghaXNDb25zdHJhaW5lZEhpZ2hTcGVlZFN1cHBvcnRlZCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFRyeSB0byBjcmVhdGUgYSBjb25zdHJhaW5lZCBoaWdoIHNwZWVkIGNvbmZpZ3VyYXRpb24gb24gYSBkZXZpY2UiCisgICAgICAgICAgICAgICAgICAgICIgdGhhdCBkb2Vzbid0IHN1cHBvcnQgaXQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorCiAgICAgc3RhdHVzX3QgcmVzOwogICAgIGlmICggKHJlcyA9IGNoZWNrUGlkKF9fRlVOQ1RJT05fXykgKSAhPSBPSykgcmV0dXJuIHJlczsKIApAQCAtMjg0LDcgKzMwNCw3IEBACiAKICAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHJldHVybiBERUFEX09CSkVDVDsKIAotICAgIHJldHVybiBtRGV2aWNlLT5jb25maWd1cmVTdHJlYW1zKCk7CisgICAgcmV0dXJuIG1EZXZpY2UtPmNvbmZpZ3VyZVN0cmVhbXMoaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCk7CiB9CiAKIHN0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6ZGVsZXRlU3RyZWFtKGludCBzdHJlYW1JZCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKaW5kZXggYjhkOGJlYS4uM2JkYTcwYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCkBAIC03OSw3ICs3OSw3IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGJlZ2luQ29uZmlndXJlKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGVuZENvbmZpZ3VyZSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5kQ29uZmlndXJlKGJvb2wgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCA9IGZhbHNlKTsKIAogICAgIC8vIFJldHVybnMgLUVCVVNZIGlmIGRldmljZSBpcyBub3QgaWRsZQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBkZWxldGVTdHJlYW0oaW50IHN0cmVhbUlkKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oCmluZGV4IGYwMmZjMzIuLjY0MjM2YzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYURldmljZUJhc2UuaApAQCAtMTU3LDcgKzE1Nyw3IEBACiAgICAgICogLSBCQURfVkFMVUUgaWYgdGhlIHNldCBvZiBzdHJlYW1zIHdhcyBpbnZhbGlkIChlLmcuIGZtdHMgb3Igc2l6ZXMpCiAgICAgICogLSBJTlZBTElEX09QRVJBVElPTiBpZiB0aGUgZGV2aWNlIHdhcyBpbiB0aGUgd3Jvbmcgc3RhdGUKICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXMoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zKGJvb2wgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCA9IGZhbHNlKSA9IDA7CiAKICAgICAvLyBnZXQgdGhlIGJ1ZmZlciBwcm9kdWNlciBvZiB0aGUgaW5wdXQgc3RyZWFtCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclByb2R1Y2VyKApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYU1vZHVsZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhTW9kdWxlLmNwcAppbmRleCAyZjAxMTdkLi5mY2JmOTU4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhTW9kdWxlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhTW9kdWxlLmNwcApAQCAtMTE2LDYgKzExNiwyMSBAQAogICAgICAgICBhdmFpbGFibGVDaGFyc0tleXMucHVzaChBTkRST0lEX1NUQVRJU1RJQ1NfSU5GT19BVkFJTEFCTEVfTEVOU19TSEFESU5HX01BUF9NT0RFUyk7CiAgICAgICAgIGNoYXJzLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTLCBhdmFpbGFibGVDaGFyc0tleXMpOwogCisgICAgICAgIC8vIE5lZWQgdXBkYXRlIGFuZHJvaWQuY29udHJvbC5hdmFpbGFibGVIaWdoU3BlZWRWaWRlb0NvbmZpZ3VyYXRpb25zIHNpbmNlIEhBTDMuMworICAgICAgICAvLyBhZGRzIGJhdGNoIHNpemUgdG8gdGhpcyBhcnJheS4KKyAgICAgICAgZW50cnkgPSBjaGFycy5maW5kKEFORFJPSURfQ09OVFJPTF9BVkFJTEFCTEVfSElHSF9TUEVFRF9WSURFT19DT05GSUdVUkFUSU9OUyk7CisgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgICAgIFZlY3RvcjxpbnQzMl90PiBoaWdoU3BlZWRDb25maWc7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyBpICs9IDQpIHsKKyAgICAgICAgICAgICAgICBoaWdoU3BlZWRDb25maWcuYWRkKGVudHJ5LmRhdGEuaTMyW2ldKTsgLy8gd2lkdGgKKyAgICAgICAgICAgICAgICBoaWdoU3BlZWRDb25maWcuYWRkKGVudHJ5LmRhdGEuaTMyW2kgKyAxXSk7IC8vIGhlaWdodAorICAgICAgICAgICAgICAgIGhpZ2hTcGVlZENvbmZpZy5hZGQoZW50cnkuZGF0YS5pMzJbaSArIDJdKTsgLy8gZnBzX21pbgorICAgICAgICAgICAgICAgIGhpZ2hTcGVlZENvbmZpZy5hZGQoZW50cnkuZGF0YS5pMzJbaSArIDNdKTsgLy8gZnBzX21heAorICAgICAgICAgICAgICAgIGhpZ2hTcGVlZENvbmZpZy5hZGQoMSk7IC8vIGJhdGNoU2l6ZV9tYXguIGRlZmF1bHQgdG8gMSBmb3IgSEFMMy4yCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFycy51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FWQUlMQUJMRV9ISUdIX1NQRUVEX1ZJREVPX0NPTkZJR1VSQVRJT05TLAorICAgICAgICAgICAgICAgICAgICBoaWdoU3BlZWRDb25maWcpOworICAgICAgICB9CiAgICAgfQogICAgIHJldHVybjsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTIvQ2FtZXJhMkRldmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuY3BwCmluZGV4IGY2NjQ1ZjMuLjdhYmEwZWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTIvQ2FtZXJhMkRldmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmNwcApAQCAtNDE1LDcgKzQxNSw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpjb25maWd1cmVTdHJlYW1zKCkgeworc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Y29uZmlndXJlU3RyZWFtcyhib29sIGlzQ29uc3RyYWluZWRIaWdoU3BlZWQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogRSIsIF9fRlVOQ1RJT05fXyk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTIvQ2FtZXJhMkRldmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmgKaW5kZXggZmQxMjQwYS4uYTlhZmZhMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmgKQEAgLTY4LDcgKzY4LDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGRlbGV0ZVN0cmVhbShpbnQgaWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVsZXRlUmVwcm9jZXNzU3RyZWFtKGludCBpZCk7CiAgICAgLy8gTm8tb3Agb24gSEFMMiBkZXZpY2VzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zKGJvb2wgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCA9IGZhbHNlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyUHJvZHVjZXIoCiAgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqcHJvZHVjZXIpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlRGVmYXVsdFJlcXVlc3QoaW50IHRlbXBsYXRlSWQsIENhbWVyYU1ldGFkYXRhICpyZXF1ZXN0KTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCmluZGV4IDQ1ZDk0MjEuLjczMWY3NGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcApAQCAtNDE5LDYgKzQxOSw4IEBACiAgICAgICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgIEVycm9yIGNhdXNlOiAlc1xuIiwgbUVycm9yQ2F1c2Uuc3RyaW5nKCkpOwogICAgIH0KICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICBTdHJlYW0gY29uZmlndXJhdGlvbjpcbiIpOworICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgIE9wZXJhdGlvbiBtb2RlOiAlcyBcbiIsIG1Jc0NvbnN0cmFpbmVkSGlnaFNwZWVkQ29uZmlndXJhdGlvbiA/CisgICAgICAgICAgICAiQ09OU1RBSU5FRCBISUdIIFNQRUVEIFZJREVPIiA6ICJOT1JNQUwiKTsKIAogICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gTlVMTCkgewogICAgICAgICB3cml0ZShmZCwgbGluZXMuc3RyaW5nKCksIGxpbmVzLnNpemUoKSk7CkBAIC0xMDIzLDEyICsxMDI1LDEzIEBACiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjb25maWd1cmVTdHJlYW1zKCkgeworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y29uZmlndXJlU3RyZWFtcyhib29sIGlzQ29uc3RyYWluZWRIaWdoU3BlZWQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogRSIsIF9fRlVOQ1RJT05fXyk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBtSXNDb25zdHJhaW5lZEhpZ2hTcGVlZENvbmZpZ3VyYXRpb24gPSBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkOwogCiAgICAgcmV0dXJuIGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoKTsKIH0KQEAgLTE1MjgsNyArMTUzMSw5IEBACiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFN0YXJ0aW5nIHN0cmVhbSBjb25maWd1cmF0aW9uIiwgX19GVU5DVElPTl9fLCBtSWQpOwogCiAgICAgY2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbiBjb25maWc7Ci0KKyAgICBjb25maWcub3BlcmF0aW9uX21vZGUgPSBtSXNDb25zdHJhaW5lZEhpZ2hTcGVlZENvbmZpZ3VyYXRpb24gPworICAgICAgICAgICAgQ0FNRVJBM19TVFJFQU1fQ09ORklHVVJBVElPTl9DT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREUgOgorICAgICAgICAgICAgQ0FNRVJBM19TVFJFQU1fQ09ORklHVVJBVElPTl9OT1JNQUxfTU9ERTsKICAgICBjb25maWcubnVtX3N0cmVhbXMgPSAobUlucHV0U3RyZWFtICE9IE5VTEwpICsgbU91dHB1dFN0cmVhbXMuc2l6ZSgpOwogCiAgICAgVmVjdG9yPGNhbWVyYTNfc3RyZWFtX3QqPiBzdHJlYW1zOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAppbmRleCBiOTMxM2ZjLi5iM2RiMmU5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaApAQCAtMTE1LDcgKzExNSw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZWxldGVTdHJlYW0oaW50IGlkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGRlbGV0ZVJlcHJvY2Vzc1N0cmVhbShpbnQgaWQpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zKGJvb2wgaXNDb25zdHJhaWVkSGlnaFNwZWVkID0gZmFsc2UpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJQcm9kdWNlcigKICAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpwcm9kdWNlcik7CiAKQEAgLTE3Myw2ICsxNzMsOSBAQAogICAgIC8vIENhbWVyYSBkZXZpY2UgSUQKICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICAgICBtSWQ7CiAKKyAgICAvLyBGbGFnIGluZGljYXRpbmcgaXMgdGhlIGN1cnJlbnQgYWN0aXZlIHN0cmVhbSBjb25maWd1cmF0aW9uIGlzIGNvbnN0cmFpbmVkIGhpZ2ggc3BlZWQuCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgbUlzQ29uc3RyYWluZWRIaWdoU3BlZWRDb25maWd1cmF0aW9uOworCiAgICAgLyoqKiogU2NvcGUgZm9yIG1Mb2NrICoqKiovCiAKICAgICBjYW1lcmEzX2RldmljZV90ICAgICAgICAgICptSGFsM0RldmljZTsK