ZGlmZiAtLWdpdCBhL2NhbWVyYS9BbmRyb2lkLm1rIGIvY2FtZXJhL0FuZHJvaWQubWsKaW5kZXggZGE1YWM1OS4uNDcxY2IwZCAxMDA2NDQKLS0tIGEvY2FtZXJhL0FuZHJvaWQubWsKKysrIGIvY2FtZXJhL0FuZHJvaWQubWsKQEAgLTI4LDE0ICsyOCwxMyBAQAogCUlDYW1lcmFDbGllbnQuY3BwIFwKIAlJQ2FtZXJhU2VydmljZS5jcHAgXAogCUlDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuY3BwIFwKKwlJQ2FtZXJhU2VydmljZVByb3h5LmNwcCBcCiAJSUNhbWVyYVJlY29yZGluZ1Byb3h5LmNwcCBcCiAJSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIuY3BwIFwKLQlJUHJvQ2FtZXJhVXNlci5jcHAgXAotCUlQcm9DYW1lcmFDYWxsYmFja3MuY3BwIFwKIAljYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmNwcCBcCiAJY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmNwcCBcCiAJY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5jcHAgXAotCVByb0NhbWVyYS5jcHAgXAorCWNhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAgXAogCUNhbWVyYUJhc2UuY3BwIFwKIAlDYW1lcmFVdGlscy5jcHAgXAogCVZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwCmRpZmYgLS1naXQgYS9jYW1lcmEvQ2FtZXJhLmNwcCBiL2NhbWVyYS9DYW1lcmEuY3BwCmluZGV4IDNhOWZiNGMuLjliZjMxMzQgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmEuY3BwCisrKyBiL2NhbWVyYS9DYW1lcmEuY3BwCkBAIC05Nyw3ICs5Nyw4IEBACiAgICAgICAgIGMtPm1TdGF0dXMgPSBOT19FUlJPUjsKICAgICAgICAgY2FtZXJhID0gYzsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgY29ubmVjdGluZyB0byBjYW1lcmE6ICVkIiwgY2FtZXJhSWQpOworICAgICAgICBBTE9HVygiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgY29ubmVjdGluZyB0byBjYW1lcmEgJWQ6ICVkICglcykiLAorICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBzdGF0dXMsIHN0cmVycm9yKC1zdGF0dXMpKTsKICAgICAgICAgYy5jbGVhcigpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhbWVyYUJhc2UuY3BwIGIvY2FtZXJhL0NhbWVyYUJhc2UuY3BwCmluZGV4IDY1YTFhNDcuLjVkNTBhYTggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmFCYXNlLmNwcAorKysgYi9jYW1lcmEvQ2FtZXJhQmFzZS5jcHAKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYVNlcnZpY2UuaD4KIAogLy8gbmVlZGVkIHRvIGluc3RhbnRpYXRlCi0jaW5jbHVkZSA8Y2FtZXJhL1Byb0NhbWVyYS5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmEuaD4KIAogI2luY2x1ZGUgPHN5c3RlbS9jYW1lcmFfbWV0YWRhdGEuaD4KQEAgLTIxNyw3ICsyMTYsNiBAQAogICAgIHJldHVybiBjcy0+cmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwogfQogCi10ZW1wbGF0ZSBjbGFzcyBDYW1lcmFCYXNlPFByb0NhbWVyYT47CiB0ZW1wbGF0ZSBjbGFzcyBDYW1lcmFCYXNlPENhbWVyYT47CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAgYi9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwCmluZGV4IDA0MzQzN2YuLjQ2YmNjMWQgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmNwcApAQCAtNzQsNyArNzQsNyBAQAogICAgIGNsZWFyKCk7CiB9CiAKLWNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KiBDYW1lcmFNZXRhZGF0YTo6Z2V0QW5kTG9jaygpIHsKK2NvbnN0IGNhbWVyYV9tZXRhZGF0YV90KiBDYW1lcmFNZXRhZGF0YTo6Z2V0QW5kTG9jaygpIGNvbnN0IHsKICAgICBtTG9ja2VkID0gdHJ1ZTsKICAgICByZXR1cm4gbUJ1ZmZlcjsKIH0KQEAgLTI4OSw2ICsyODksMTcgQEAKICAgICAgICAgQUxPR0UoIiVzOiBUYWcgJWQgbm90IGZvdW5kIiwgX19GVU5DVElPTl9fLCB0YWcpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KKyAgICAvLyBTYWZldHkgY2hlY2sgLSBlbnN1cmUgdGhhdCBkYXRhIGlzbid0IHBvaW50aW5nIHRvIHRoaXMgbWV0YWRhdGEsIHNpbmNlCisgICAgLy8gdGhhdCB3b3VsZCBnZXQgaW52YWxpZGF0ZWQgaWYgYSByZXNpemUgaXMgbmVlZGVkCisgICAgc2l6ZV90IGJ1ZmZlclNpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUobUJ1ZmZlcik7CisgICAgdWludHB0cl90IGJ1ZkFkZHIgPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4obUJ1ZmZlcik7CisgICAgdWludHB0cl90IGRhdGFBZGRyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGRhdGEpOworICAgIGlmIChkYXRhQWRkciA+IGJ1ZkFkZHIgJiYgZGF0YUFkZHIgPCAoYnVmQWRkciArIGJ1ZmZlclNpemUpKSB7CisgICAgICAgIEFMT0dFKCIlczogVXBkYXRlIGF0dGVtcHRlZCB3aXRoIGRhdGEgZnJvbSB0aGUgc2FtZSBtZXRhZGF0YSBidWZmZXIhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCiAgICAgc2l6ZV90IGRhdGFfc2l6ZSA9IGNhbGN1bGF0ZV9jYW1lcmFfbWV0YWRhdGFfZW50cnlfZGF0YV9zaXplKHR5cGUsCiAgICAgICAgICAgICBkYXRhX2NvdW50KTsKIApAQCAtNTgzLDcgKzU5NCw3IEBACiAgICAgICovCiAgICAgV3JpdGFibGVCbG9iIGJsb2I7CiAgICAgZG8gewotICAgICAgICByZXMgPSBkYXRhLndyaXRlQmxvYihibG9iU2l6ZSwgJmJsb2IpOworICAgICAgICByZXMgPSBkYXRhLndyaXRlQmxvYihibG9iU2l6ZSwgZmFsc2UsICZibG9iKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcCBiL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcAppbmRleCBlNWU0ZTkwLi42ODk2OWNmIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwCkBAIC01MjYsOCArNTI2LDEyIEBACiAgICAgICAgICFzdHJjbXAoZm9ybWF0LCBQSVhFTF9GT1JNQVRfUkdCQTg4ODgpID8KICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4IDogICAgLy8gUkdCODg4OAogICAgICAgICAhc3RyY21wKGZvcm1hdCwgUElYRUxfRk9STUFUX0JBWUVSX1JHR0IpID8KLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfUkFXX1NFTlNPUiA6ICAgLy8gUmF3IHNlbnNvciBkYXRhCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JBVzE2IDogICAvLyBSYXcgc2Vuc29yIGRhdGEKICAgICAgICAgLTE7CiB9CiAKK2Jvb2wgQ2FtZXJhUGFyYW1ldGVyczo6aXNFbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU1hcC5pc0VtcHR5KCk7Cit9CisKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuY3BwIGIvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlLmNwcAppbmRleCBmYzNlNDM3Li5iMzU5ZjU3IDEwMDY0NAotLS0gYS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuY3BwCisrKyBiL2NhbWVyYS9JQ2FtZXJhU2VydmljZS5jcHAKQEAgLTIsMTYgKzIsMTYgQEAKICoqCiAqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KIApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCkBAIC0yOSw4ICszMCw2IEBACiAKICNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYVNlcnZpY2UuaD4KICNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYVNlcnZpY2VMaXN0ZW5lci5oPgotI2luY2x1ZGUgPGNhbWVyYS9JUHJvQ2FtZXJhVXNlci5oPgotI2luY2x1ZGUgPGNhbWVyYS9JUHJvQ2FtZXJhQ2FsbGJhY2tzLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmEuaD4KICNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYUNsaWVudC5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmg+CkBAIC05NSwxMSArOTQsMTggQEAKICAgICB7CiAgICAgfQogCi0gICAgLy8gZ2V0IG51bWJlciBvZiBjYW1lcmFzIGF2YWlsYWJsZQorICAgIC8vIGdldCBudW1iZXIgb2YgY2FtZXJhcyBhdmFpbGFibGUgdGhhdCBzdXBwb3J0IHN0YW5kYXJkIGNhbWVyYSBvcGVyYXRpb25zCiAgICAgdmlydHVhbCBpbnQzMl90IGdldE51bWJlck9mQ2FtZXJhcygpCiAgICAgeworICAgICAgICByZXR1cm4gZ2V0TnVtYmVyT2ZDYW1lcmFzKENBTUVSQV9UWVBFX0JBQ0tXQVJEX0NPTVBBVElCTEUpOworICAgIH0KKworICAgIC8vIGdldCBudW1iZXIgb2YgY2FtZXJhcyBhdmFpbGFibGUgb2YgYSBnaXZlbiB0eXBlCisgICAgdmlydHVhbCBpbnQzMl90IGdldE51bWJlck9mQ2FtZXJhcyhpbnQgdHlwZSkKKyAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIodHlwZSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChCbkNhbWVyYVNlcnZpY2U6OkdFVF9OVU1CRVJfT0ZfQ0FNRVJBUywgZGF0YSwgJnJlcGx5KTsKIAogICAgICAgICBpZiAocmVhZEV4Y2VwdGlvbkNvZGUocmVwbHkpKSByZXR1cm4gMDsKQEAgLTE3NiwxMCArMTgyLDEzIEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihjYW1lcmFJZCk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihjbGllbnRQYWNrYWdlTmFtZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihjbGllbnRVaWQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQm5DYW1lcmFTZXJ2aWNlOjpDT05ORUNULCBkYXRhLCAmcmVwbHkpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1czsKKyAgICAgICAgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEJuQ2FtZXJhU2VydmljZTo6Q09OTkVDVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKIAogICAgICAgICBpZiAocmVhZEV4Y2VwdGlvbkNvZGUocmVwbHkpKSByZXR1cm4gLUVQUk9UTzsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICBpZiAocmVwbHkucmVhZEludDMyKCkgIT0gMCkgewogICAgICAgICAgICAgZGV2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SUNhbWVyYT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICAgICAgfQpAQCAtMTk5LDM2ICsyMDgsMzEgQEAKICAgICAgICAgZGF0YS53cml0ZUludDMyKGhhbFZlcnNpb24pOwogICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYoY2xpZW50UGFja2FnZU5hbWUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoY2xpZW50VWlkKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEJuQ2FtZXJhU2VydmljZTo6Q09OTkVDVF9MRUdBQ1ksIGRhdGEsICZyZXBseSk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQm5DYW1lcmFTZXJ2aWNlOjpDT05ORUNUX0xFR0FDWSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKIAogICAgICAgICBpZiAocmVhZEV4Y2VwdGlvbkNvZGUocmVwbHkpKSByZXR1cm4gLUVQUk9UTzsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICBpZiAocmVwbHkucmVhZEludDMyKCkgIT0gMCkgewogICAgICAgICAgICAgZGV2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SUNhbWVyYT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAotICAgIC8vIGNvbm5lY3QgdG8gY2FtZXJhIHNlcnZpY2UgKHBybyBjbGllbnQpCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0UHJvKGNvbnN0IHNwPElQcm9DYW1lcmFDYWxsYmFja3M+JiBjYW1lcmFDYiwgaW50IGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiAmY2xpZW50UGFja2FnZU5hbWUsIGludCBjbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVByb0NhbWVyYVVzZXI+JiBkZXZpY2UpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLCBib29sIGVuYWJsZWQsCisgICAgICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgY2xpZW50QmluZGVyKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoY2FtZXJhQ2IpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGNhbWVyYUlkKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KGNsaWVudFBhY2thZ2VOYW1lKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGNsaWVudFVpZCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChCbkNhbWVyYVNlcnZpY2U6OkNPTk5FQ1RfUFJPLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYoY2FtZXJhSWQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoZW5hYmxlZCA/IDEgOiAwKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihjbGllbnRCaW5kZXIpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQm5DYW1lcmFTZXJ2aWNlOjpTRVRfVE9SQ0hfTU9ERSwgZGF0YSwgJnJlcGx5KTsKIAogICAgICAgICBpZiAocmVhZEV4Y2VwdGlvbkNvZGUocmVwbHkpKSByZXR1cm4gLUVQUk9UTzsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChyZXBseS5yZWFkSW50MzIoKSAhPSAwKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJUHJvQ2FtZXJhVXNlcj4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCiAgICAgLy8gY29ubmVjdCB0byBjYW1lcmEgc2VydmljZSAoYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYURldmljZSkKQEAgLTI0NiwxMCArMjUwLDEzIEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihjYW1lcmFJZCk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihjbGllbnRQYWNrYWdlTmFtZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihjbGllbnRVaWQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQm5DYW1lcmFTZXJ2aWNlOjpDT05ORUNUX0RFVklDRSwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChCbkNhbWVyYVNlcnZpY2U6OkNPTk5FQ1RfREVWSUNFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwogCiAgICAgICAgIGlmIChyZWFkRXhjZXB0aW9uQ29kZShyZXBseSkpIHJldHVybiAtRVBST1RPOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIGlmIChyZXBseS5yZWFkSW50MzIoKSAhPSAwKSB7CiAgICAgICAgICAgICBkZXZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJQ2FtZXJhRGV2aWNlVXNlcj4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICAgICAgfQpAQCAtMjg1LDYgKzI5Miw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKIAogICAgICAgICBkYXRhLndyaXRlSW50MzIoY2FtZXJhSWQpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQm5DYW1lcmFTZXJ2aWNlOjpHRVRfTEVHQUNZX1BBUkFNRVRFUlMsIGRhdGEsICZyZXBseSk7CkBAIC0zMDQsNiArMzEyLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQ2FtZXJhQXBpKGludCBjYW1lcmFJZCwgaW50IGFwaVZlcnNpb24pIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogCisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGNhbWVyYUlkKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGFwaVZlcnNpb24pOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQm5DYW1lcmFTZXJ2aWNlOjpTVVBQT1JUU19DQU1FUkFfQVBJLCBkYXRhLCAmcmVwbHkpOwpAQCAtMzEyLDYgKzMyMSwxNiBAQAogICAgICAgICBzdGF0dXNfdCByZXMgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBub3RpZnlTeXN0ZW1FdmVudChpbnQzMl90IGV2ZW50SWQsIGNvbnN0IGludDMyX3QqIGFyZ3MsIHNpemVfdCBsZW4pIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihldmVudElkKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyQXJyYXkobGVuLCBhcmdzKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEJuQ2FtZXJhU2VydmljZTo6Tk9USUZZX1NZU1RFTV9FVkVOVCwgZGF0YSwgJnJlcGx5LAorICAgICAgICAgICAgICAgIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKKyAgICB9CisKIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShDYW1lcmFTZXJ2aWNlLCAiYW5kcm9pZC5oYXJkd2FyZS5JQ2FtZXJhU2VydmljZSIpOwpAQCAtMzI1LDcgKzM0NCw3IEBACiAgICAgICAgIGNhc2UgR0VUX05VTUJFUl9PRl9DQU1FUkFTOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZXROdW1iZXJPZkNhbWVyYXMoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZXROdW1iZXJPZkNhbWVyYXMoZGF0YS5yZWFkSW50MzIoKSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEdFVF9DQU1FUkFfSU5GTzogewpAQCAtMzkwLDI2ICs0MDksNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIENPTk5FQ1RfUFJPOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNwPElQcm9DYW1lcmFDYWxsYmFja3M+IGNhbWVyYUNsaWVudCA9Ci0gICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SVByb0NhbWVyYUNhbGxiYWNrcz4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICAgICAgaW50MzJfdCBjYW1lcmFJZCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBjb25zdCBTdHJpbmcxNiBjbGllbnROYW1lID0gZGF0YS5yZWFkU3RyaW5nMTYoKTsKLSAgICAgICAgICAgIGludDMyX3QgY2xpZW50VWlkID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHNwPElQcm9DYW1lcmFVc2VyPiBjYW1lcmE7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBjb25uZWN0UHJvKGNhbWVyYUNsaWVudCwgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudE5hbWUsIGNsaWVudFVpZCwgLypvdXQqL2NhbWVyYSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIGlmIChjYW1lcmEgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDEpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihjYW1lcmEpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQ09OTkVDVF9ERVZJQ0U6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhU2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3A8SUNhbWVyYURldmljZUNhbGxiYWNrcz4gY2FtZXJhQ2xpZW50ID0KQEAgLTQ5MCw2ICs0ODksNDEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTRVRfVE9SQ0hfTU9ERTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmFTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBTdHJpbmcxNiBjYW1lcmFJZCA9IGRhdGEucmVhZFN0cmluZzE2KCk7CisgICAgICAgICAgICBib29sIGVuYWJsZWQgPSBkYXRhLnJlYWRJbnQzMigpICE9IDAgPyB0cnVlIDogZmFsc2U7CisgICAgICAgICAgICBjb25zdCBzcDxJQmluZGVyPiBjbGllbnRCaW5kZXIgPSBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldFRvcmNoTW9kZShjYW1lcmFJZCwgZW5hYmxlZCwgY2xpZW50QmluZGVyKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIE5PVElGWV9TWVNURU1fRVZFTlQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhU2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgaW50MzJfdCBldmVudElkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludDMyX3QgbGVuID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBSZWNlaXZlZCBwb29ybHkgZm9ybWF0dGVkIGxlbmd0aCBpbiBiaW5kZXIgcmVxdWVzdDogbm90aWZ5U3lzdGVtRXZlbnQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsZW4gPiA1MTIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IExlbmd0aCAlIiBQUklpMzIgIiB0b28gbG9uZyBpbiBiaW5kZXIgcmVxdWVzdDogbm90aWZ5U3lzdGVtRXZlbnQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbGVuKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFJTEVEX1RSQU5TQUNUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50MzJfdCBldmVudHNbbGVuXTsKKyAgICAgICAgICAgIG1lbXNldChldmVudHMsIDAsIHNpemVvZihpbnQzMl90KSAqIGxlbik7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWQoZXZlbnRzLCBzaXplb2YoaW50MzJfdCkgKiBsZW4pOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogUmVjZWl2ZWQgcG9vcmx5IGZvcm1hdHRlZCBiaW5kZXIgcmVxdWVzdDogbm90aWZ5U3lzdGVtRXZlbnQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmeVN5c3RlbUV2ZW50KGV2ZW50SWQsIGV2ZW50cywgbGVuKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuY3BwIGIvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuY3BwCmluZGV4IGIyZjE3MjkuLjAwMTAzMjUgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9JQ2FtZXJhU2VydmljZUxpc3RlbmVyLmNwcAorKysgYi9jYW1lcmEvSUNhbWVyYVNlcnZpY2VMaXN0ZW5lci5jcHAKQEAgLTI5LDYgKzI5LDcgQEAKIG5hbWVzcGFjZSB7CiAgICAgZW51bSB7CiAgICAgICAgIFNUQVRVU19DSEFOR0VEID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICAgICAgVE9SQ0hfU1RBVFVTX0NIQU5HRUQsCiAgICAgfTsKIH07IC8vIG5hbWVzcGFjZSBhbm9ueW1vdXMKIApAQCAtNDQsOCArNDUsNyBAQAogICAgIHZpcnR1YWwgdm9pZCBvblN0YXR1c0NoYW5nZWQoU3RhdHVzIHN0YXR1cywgaW50MzJfdCBjYW1lcmFJZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAKICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoY2FtZXJhSWQpOwpAQCAtNTQsMTkgKzU0LDI5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJpbmRlcjo6RkxBR19PTkVXQVkpOworICAgIH0KIAotICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOworICAgIHZpcnR1YWwgdm9pZCBvblRvcmNoU3RhdHVzQ2hhbmdlZChUb3JjaFN0YXR1cyBzdGF0dXMsIGNvbnN0IFN0cmluZzE2ICZjYW1lcmFJZCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYoY2FtZXJhSWQpOworCisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChUT1JDSF9TVEFUVVNfQ0hBTkdFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJQmluZGVyOjpGTEFHX09ORVdBWSk7CiAgICAgfQogfTsKIAotSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKENhbWVyYVNlcnZpY2VMaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5JQ2FtZXJhU2VydmljZUxpc3RlbmVyIik7CitJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQ2FtZXJhU2VydmljZUxpc3RlbmVyLCAiYW5kcm9pZC5oYXJkd2FyZS5JQ2FtZXJhU2VydmljZUxpc3RlbmVyIik7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotc3RhdHVzX3QgQm5DYW1lcmFTZXJ2aWNlTGlzdGVuZXI6Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKK3N0YXR1c190IEJuQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwKKyAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKICAgICBzd2l0Y2goY29kZSkgewogICAgICAgICBjYXNlIFNUQVRVU19DSEFOR0VEOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lciwgZGF0YSwgcmVwbHkpOwpAQCAtNzUsNyArODUsMTYgQEAKICAgICAgICAgICAgIGludDMyX3QgY2FtZXJhSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCiAgICAgICAgICAgICBvblN0YXR1c0NoYW5nZWQoc3RhdHVzLCBjYW1lcmFJZCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpOworCisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgVE9SQ0hfU1RBVFVTX0NIQU5HRUQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhU2VydmljZUxpc3RlbmVyLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgICAgIFRvcmNoU3RhdHVzIHN0YXR1cyA9IHN0YXRpY19jYXN0PFRvcmNoU3RhdHVzPihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIFN0cmluZzE2IGNhbWVyYUlkID0gZGF0YS5yZWFkU3RyaW5nMTYoKTsKKworICAgICAgICAgICAgb25Ub3JjaFN0YXR1c0NoYW5nZWQoc3RhdHVzLCBjYW1lcmFJZCk7CiAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKZGlmZiAtLWdpdCBhL2NhbWVyYS9JQ2FtZXJhU2VydmljZVByb3h5LmNwcCBiL2NhbWVyYS9JQ2FtZXJhU2VydmljZVByb3h5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmE1YWZiCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlUHJveHkuY3BwCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkJwQ2FtZXJhU2VydmljZVByb3h5IgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKKyNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYVNlcnZpY2VQcm94eS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEJwQ2FtZXJhU2VydmljZVByb3h5OiBwdWJsaWMgQnBJbnRlcmZhY2U8SUNhbWVyYVNlcnZpY2VQcm94eT4geworcHVibGljOgorICAgIEJwQ2FtZXJhU2VydmljZVByb3h5KGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKSA6IEJwSW50ZXJmYWNlPElDYW1lcmFTZXJ2aWNlUHJveHk+KGltcGwpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgcGluZ0ZvclVzZXJVcGRhdGUoKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFTZXJ2aWNlUHJveHk6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChCbkNhbWVyYVNlcnZpY2VQcm94eTo6UElOR19GT1JfVVNFUl9VUERBVEUsIGRhdGEsICZyZXBseSwKKyAgICAgICAgICAgICAgICBJQmluZGVyOjpGTEFHX09ORVdBWSk7CisgICAgfQorfTsKKworCitJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQ2FtZXJhU2VydmljZVByb3h5LCAiYW5kcm9pZC5oYXJkd2FyZS5JQ2FtZXJhU2VydmljZVByb3h5Iik7CisKK3N0YXR1c190IEJuQ2FtZXJhU2VydmljZVByb3h5OjpvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwKKyAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBzd2l0Y2goY29kZSkgeworICAgICAgICBjYXNlIFBJTkdfRk9SX1VTRVJfVVBEQVRFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYVNlcnZpY2VQcm94eSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgcGluZ0ZvclVzZXJVcGRhdGUoKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgfQorfQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvY2FtZXJhL0lQcm9DYW1lcmFDYWxsYmFja3MuY3BwIGIvY2FtZXJhL0lQcm9DYW1lcmFDYWxsYmFja3MuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDNkNDIwLi4wMDAwMDAwCi0tLSBhL2NhbWVyYS9JUHJvQ2FtZXJhQ2FsbGJhY2tzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotKioKLSoqIENvcHlyaWdodCAyMDEzLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIklQcm9DYW1lcmFDYWxsYmFja3MiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+Ci0KLSNpbmNsdWRlIDxjYW1lcmEvSVByb0NhbWVyYUNhbGxiYWNrcy5oPgotCi0jaW5jbHVkZSAiY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotZW51bSB7Ci0gICAgTk9USUZZX0NBTExCQUNLID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKLSAgICBMT0NLX1NUQVRVU19DSEFOR0VELAotICAgIFJFU1VMVF9SRUNFSVZFRCwKLX07Ci0KLWNsYXNzIEJwUHJvQ2FtZXJhQ2FsbGJhY2tzOiBwdWJsaWMgQnBJbnRlcmZhY2U8SVByb0NhbWVyYUNhbGxiYWNrcz4KLXsKLXB1YmxpYzoKLSAgICBCcFByb0NhbWVyYUNhbGxiYWNrcyhjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJUHJvQ2FtZXJhQ2FsbGJhY2tzPihpbXBsKQotICAgIHsKLSAgICB9Ci0KLSAgICAvLyBnZW5lcmljIGNhbGxiYWNrIGZyb20gY2FtZXJhIHNlcnZpY2UgdG8gYXBwCi0gICAgdm9pZCBub3RpZnlDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGludDMyX3QgZXh0MSwgaW50MzJfdCBleHQyKQotICAgIHsKLSAgICAgICAgQUxPR1YoIm5vdGlmeUNhbGxiYWNrIik7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElQcm9DYW1lcmFDYWxsYmFja3M6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihtc2dUeXBlKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGV4dDEpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoZXh0Mik7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChOT1RJRllfQ0FMTEJBQ0ssIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwotICAgIH0KLQotICAgIHZvaWQgb25Mb2NrU3RhdHVzQ2hhbmdlZChMb2NrU3RhdHVzIG5ld0xvY2tTdGF0dXMpIHsKLSAgICAgICAgQUxPR1YoIm9uTG9ja1N0YXR1c0NoYW5nZWQiKTsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVByb0NhbWVyYUNhbGxiYWNrczo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG5ld0xvY2tTdGF0dXMpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoTE9DS19TVEFUVVNfQ0hBTkdFRCwgZGF0YSwgJnJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwotICAgIH0KLQotICAgIHZvaWQgb25SZXN1bHRSZWNlaXZlZChpbnQzMl90IHJlcXVlc3RJZCwgY2FtZXJhX21ldGFkYXRhKiByZXN1bHQpIHsKLSAgICAgICAgQUxPR1YoIm9uUmVzdWx0UmVjZWl2ZWQiKTsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVByb0NhbWVyYUNhbGxiYWNrczo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHJlcXVlc3RJZCk7Ci0gICAgICAgIENhbWVyYU1ldGFkYXRhOjp3cml0ZVRvUGFyY2VsKGRhdGEsIHJlc3VsdCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRVNVTFRfUkVDRUlWRUQsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwotICAgIH0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShQcm9DYW1lcmFDYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuSVByb0NhbWVyYUNhbGxiYWNrcyIpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IEJuUHJvQ2FtZXJhQ2FsbGJhY2tzOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgQUxPR1YoIm9uVHJhbnNhY3QgLSBjb2RlID0gJWQiLCBjb2RlKTsKLSAgICBzd2l0Y2goY29kZSkgewotICAgICAgICBjYXNlIE5PVElGWV9DQUxMQkFDSzogewotICAgICAgICAgICAgQUxPR1YoIk5PVElGWV9DQUxMQkFDSyIpOwotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElQcm9DYW1lcmFDYWxsYmFja3MsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGludDMyX3QgbXNnVHlwZSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpbnQzMl90IGV4dDEgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaW50MzJfdCBleHQyID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIG5vdGlmeUNhbGxiYWNrKG1zZ1R5cGUsIGV4dDEsIGV4dDIpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIExPQ0tfU1RBVFVTX0NIQU5HRUQ6IHsKLSAgICAgICAgICAgIEFMT0dWKCJMT0NLX1NUQVRVU19DSEFOR0VEIik7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVByb0NhbWVyYUNhbGxiYWNrcywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgTG9ja1N0YXR1cyBuZXdMb2NrU3RhdHVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHN0YXRpY19jYXN0PExvY2tTdGF0dXM+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgb25Mb2NrU3RhdHVzQ2hhbmdlZChuZXdMb2NrU3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBSRVNVTFRfUkVDRUlWRUQ6IHsKLSAgICAgICAgICAgIEFMT0dWKCJSRVNVTFRfUkVDRUlWRUQiKTsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUHJvQ2FtZXJhQ2FsbGJhY2tzLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQzMl90IHJlcXVlc3RJZCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCAqcmVzdWx0ID0gTlVMTDsKLSAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhOjpyZWFkRnJvbVBhcmNlbChkYXRhLCAmcmVzdWx0KTsKLSAgICAgICAgICAgIG9uUmVzdWx0UmVjZWl2ZWQocmVxdWVzdElkLCByZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL2NhbWVyYS9JUHJvQ2FtZXJhVXNlci5jcHAgYi9jYW1lcmEvSVByb0NhbWVyYVVzZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmQ3NTk3Li4wMDAwMDAwCi0tLSBhL2NhbWVyYS9JUHJvQ2FtZXJhVXNlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyoKLSoqCi0qKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiSVByb0NhbWVyYVVzZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGNhbWVyYS9JUHJvQ2FtZXJhVXNlci5oPgotI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KLSNpbmNsdWRlICJjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1lbnVtIHsKLSAgICBESVNDT05ORUNUID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKLSAgICBDT05ORUNULAotICAgIEVYQ0xVU0lWRV9UUllfTE9DSywKLSAgICBFWENMVVNJVkVfTE9DSywKLSAgICBFWENMVVNJVkVfVU5MT0NLLAotICAgIEhBU19FWENMVVNJVkVfTE9DSywKLSAgICBTVUJNSVRfUkVRVUVTVCwKLSAgICBDQU5DRUxfUkVRVUVTVCwKLSAgICBERUxFVEVfU1RSRUFNLAotICAgIENSRUFURV9TVFJFQU0sCi0gICAgQ1JFQVRFX0RFRkFVTFRfUkVRVUVTVCwKLSAgICBHRVRfQ0FNRVJBX0lORk8sCi19OwotCi1jbGFzcyBCcFByb0NhbWVyYVVzZXI6IHB1YmxpYyBCcEludGVyZmFjZTxJUHJvQ2FtZXJhVXNlcj4KLXsKLXB1YmxpYzoKLSAgICBCcFByb0NhbWVyYVVzZXIoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCi0gICAgICAgIDogQnBJbnRlcmZhY2U8SVByb0NhbWVyYVVzZXI+KGltcGwpCi0gICAgewotICAgIH0KLQotICAgIC8vIGRpc2Nvbm5lY3QgZnJvbSBjYW1lcmEgc2VydmljZQotICAgIHZvaWQgZGlzY29ubmVjdCgpCi0gICAgewotICAgICAgICBBTE9HVigiZGlzY29ubmVjdCIpOwotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUHJvQ2FtZXJhVXNlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KERJU0NPTk5FQ1QsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0KGNvbnN0IHNwPElQcm9DYW1lcmFDYWxsYmFja3M+JiBjYW1lcmFDbGllbnQpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUHJvQ2FtZXJhVXNlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihjYW1lcmFDbGllbnQpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENPTk5FQ1QsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICAvKiBTaGFyZWQgUHJvQ2FtZXJhVXNlciAqLwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBleGNsdXNpdmVUcnlMb2NrKCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElQcm9DYW1lcmFVc2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoRVhDTFVTSVZFX1RSWV9MT0NLLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZXhjbHVzaXZlTG9jaygpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUHJvQ2FtZXJhVXNlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEVYQ0xVU0lWRV9MT0NLLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBleGNsdXNpdmVVbmxvY2soKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVByb0NhbWVyYVVzZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChFWENMVVNJVkVfVU5MT0NLLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIGhhc0V4Y2x1c2l2ZUxvY2soKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVByb0NhbWVyYVVzZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChIQVNfRVhDTFVTSVZFX0xPQ0ssIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiAhIXJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgaW50IHN1Ym1pdFJlcXVlc3QoY2FtZXJhX21ldGFkYXRhX3QqIG1ldGFkYXRhLCBib29sIHN0cmVhbWluZykKLSAgICB7Ci0KLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVByb0NhbWVyYVVzZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0KLSAgICAgICAgLy8gYXJnMCthcmcxCi0gICAgICAgIENhbWVyYU1ldGFkYXRhOjp3cml0ZVRvUGFyY2VsKGRhdGEsIG1ldGFkYXRhKTsKLQotICAgICAgICAvLyBhcmcyID0gc3RyZWFtaW5nIChib29sKQotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RyZWFtaW5nKTsKLQotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1VCTUlUX1JFUVVFU1QsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNhbmNlbFJlcXVlc3QoaW50IHJlcXVlc3RJZCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElQcm9DYW1lcmFVc2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIocmVxdWVzdElkKTsKLQotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ0FOQ0VMX1JFUVVFU1QsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlbGV0ZVN0cmVhbShpbnQgc3RyZWFtSWQpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUHJvQ2FtZXJhVXNlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHN0cmVhbUlkKTsKLQotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoREVMRVRFX1NUUkVBTSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlU3RyZWFtKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJ1ZmZlclByb2R1Y2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCogc3RyZWFtSWQpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUHJvQ2FtZXJhVXNlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHdpZHRoKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGhlaWdodCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihmb3JtYXQpOwotCi0gICAgICAgIHNwPElCaW5kZXI+IGIoSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVyUHJvZHVjZXIpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihiKTsKLQotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ1JFQVRFX1NUUkVBTSwgZGF0YSwgJnJlcGx5KTsKLQotICAgICAgICBpbnQgc0lkID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChzdHJlYW1JZCkgewotICAgICAgICAgICAgKnN0cmVhbUlkID0gc0lkOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgYSByZXF1ZXN0IG9iamVjdCBmcm9tIGEgdGVtcGxhdGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVEZWZhdWx0UmVxdWVzdChpbnQgdGVtcGxhdGVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGEqKiByZXF1ZXN0KQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVByb0NhbWVyYVVzZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMih0ZW1wbGF0ZUlkKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENSRUFURV9ERUZBVUxUX1JFUVVFU1QsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIENhbWVyYU1ldGFkYXRhOjpyZWFkRnJvbVBhcmNlbChyZXBseSwgLypvdXQqL3JlcXVlc3QpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUluZm8oaW50IGNhbWVyYUlkLCBjYW1lcmFfbWV0YWRhdGEqKiBpbmZvKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVByb0NhbWVyYVVzZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihjYW1lcmFJZCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQ0FNRVJBX0lORk8sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIENhbWVyYU1ldGFkYXRhOjpyZWFkRnJvbVBhcmNlbChyZXBseSwgLypvdXQqL2luZm8pOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0KLXByaXZhdGU6Ci0KLQotfTsKLQotSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFByb0NhbWVyYVVzZXIsICJhbmRyb2lkLmhhcmR3YXJlLklQcm9DYW1lcmFVc2VyIik7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQm5Qcm9DYW1lcmFVc2VyOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgc3dpdGNoKGNvZGUpIHsKLSAgICAgICAgY2FzZSBESVNDT05ORUNUOiB7Ci0gICAgICAgICAgICBBTE9HVigiRElTQ09OTkVDVCIpOwotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElQcm9DYW1lcmFVc2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBkaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIENPTk5FQ1Q6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUHJvQ2FtZXJhVXNlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8SVByb0NhbWVyYUNhbGxiYWNrcz4gY2FtZXJhQ2xpZW50ID0KLSAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJUHJvQ2FtZXJhQ2FsbGJhY2tzPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihjb25uZWN0KGNhbWVyYUNsaWVudCkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIC8qIFNoYXJlZCBQcm9DYW1lcmFVc2VyICovCi0gICAgICAgIGNhc2UgRVhDTFVTSVZFX1RSWV9MT0NLOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVByb0NhbWVyYVVzZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGV4Y2x1c2l2ZVRyeUxvY2soKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgRVhDTFVTSVZFX0xPQ0s6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUHJvQ2FtZXJhVXNlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXhjbHVzaXZlTG9jaygpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBFWENMVVNJVkVfVU5MT0NLOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVByb0NhbWVyYVVzZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGV4Y2x1c2l2ZVVubG9jaygpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBIQVNfRVhDTFVTSVZFX0xPQ0s6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUHJvQ2FtZXJhVXNlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaGFzRXhjbHVzaXZlTG9jaygpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTVUJNSVRfUkVRVUVTVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElQcm9DYW1lcmFVc2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCogbWV0YWRhdGE7Ci0gICAgICAgICAgICBDYW1lcmFNZXRhZGF0YTo6cmVhZEZyb21QYXJjZWwoZGF0YSwgLypvdXQqLyZtZXRhZGF0YSk7Ci0KLSAgICAgICAgICAgIC8vIGFyZzIgPSBzdHJlYW1pbmcgKGJvb2wpCi0gICAgICAgICAgICBib29sIHN0cmVhbWluZyA9IGRhdGEucmVhZEludDMyKCk7Ci0KLSAgICAgICAgICAgIC8vIHJldHVybiBjb2RlOiByZXF1ZXN0SWQgKGludDMyKQotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3VibWl0UmVxdWVzdChtZXRhZGF0YSwgc3RyZWFtaW5nKSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBDQU5DRUxfUkVRVUVTVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElQcm9DYW1lcmFVc2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQgcmVxdWVzdElkID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGNhbmNlbFJlcXVlc3QocmVxdWVzdElkKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgREVMRVRFX1NUUkVBTTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElQcm9DYW1lcmFVc2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQgc3RyZWFtSWQgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZGVsZXRlU3RyZWFtKHN0cmVhbUlkKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1JFQVRFX1NUUkVBTTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElQcm9DYW1lcmFVc2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQgd2lkdGgsIGhlaWdodCwgZm9ybWF0OwotCi0gICAgICAgICAgICB3aWR0aCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBoZWlnaHQgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgZm9ybWF0ID0gZGF0YS5yZWFkSW50MzIoKTsKLQotICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gYnAgPQotICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwotCi0gICAgICAgICAgICBpbnQgc3RyZWFtSWQgPSAtMTsKLSAgICAgICAgICAgIHN0YXR1c190IHJldDsKLSAgICAgICAgICAgIHJldCA9IGNyZWF0ZVN0cmVhbSh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGJwLCAmc3RyZWFtSWQpOwotCi0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdHJlYW1JZCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXQpOwotCi0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBDUkVBVEVfREVGQVVMVF9SRVFVRVNUOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVByb0NhbWVyYVVzZXIsIGRhdGEsIHJlcGx5KTsKLQotICAgICAgICAgICAgaW50IHRlbXBsYXRlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwotCi0gICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCogcmVxdWVzdCA9IE5VTEw7Ci0gICAgICAgICAgICBzdGF0dXNfdCByZXQ7Ci0gICAgICAgICAgICByZXQgPSBjcmVhdGVEZWZhdWx0UmVxdWVzdCh0ZW1wbGF0ZUlkLCAmcmVxdWVzdCk7Ci0KLSAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhOjp3cml0ZVRvUGFyY2VsKCpyZXBseSwgcmVxdWVzdCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXQpOwotCi0gICAgICAgICAgICBmcmVlX2NhbWVyYV9tZXRhZGF0YShyZXF1ZXN0KTsKLQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIEdFVF9DQU1FUkFfSU5GTzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElQcm9DYW1lcmFVc2VyLCBkYXRhLCByZXBseSk7Ci0KLSAgICAgICAgICAgIGludCBjYW1lcmFJZCA9IGRhdGEucmVhZEludDMyKCk7Ci0KLSAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90KiBpbmZvID0gTlVMTDsKLSAgICAgICAgICAgIHN0YXR1c190IHJldDsKLSAgICAgICAgICAgIHJldCA9IGdldENhbWVyYUluZm8oY2FtZXJhSWQsICZpbmZvKTsKLQotICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGE6OndyaXRlVG9QYXJjZWwoKnJlcGx5LCBpbmZvKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJldCk7Ci0KLSAgICAgICAgICAgIGZyZWVfY2FtZXJhX21ldGFkYXRhKGluZm8pOwotCi0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvY2FtZXJhL1Byb0NhbWVyYS5jcHAgYi9jYW1lcmEvUHJvQ2FtZXJhLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhmOGU4ZS4uMDAwMDAwMAotLS0gYS9jYW1lcmEvUHJvQ2FtZXJhLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQzNiArMCwwIEBACi0vKgotKioKLSoqIENvcHlyaWdodCAoQykgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJQcm9DYW1lcmEiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLQotI2luY2x1ZGUgPGNhbWVyYS9Qcm9DYW1lcmEuaD4KLSNpbmNsdWRlIDxjYW1lcmEvSVByb0NhbWVyYVVzZXIuaD4KLSNpbmNsdWRlIDxjYW1lcmEvSVByb0NhbWVyYUNhbGxiYWNrcy5oPgotCi0jaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KLQotI2luY2x1ZGUgPHN5c3RlbS9jYW1lcmFfbWV0YWRhdGEuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zcDxQcm9DYW1lcmE+IFByb0NhbWVyYTo6Y29ubmVjdChpbnQgY2FtZXJhSWQpCi17Ci0gICAgcmV0dXJuIENhbWVyYUJhc2VUOjpjb25uZWN0KGNhbWVyYUlkLCBTdHJpbmcxNigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNhbWVyYVNlcnZpY2U6OlVTRV9DQUxMSU5HX1VJRCk7Ci19Ci0KLVByb0NhbWVyYTo6UHJvQ2FtZXJhKGludCBjYW1lcmFJZCkKLSAgICA6IENhbWVyYUJhc2UoY2FtZXJhSWQpCi17Ci19Ci0KLUNhbWVyYVRyYWl0czxQcm9DYW1lcmE+OjpUQ2FtQ29ubmVjdFNlcnZpY2UgQ2FtZXJhVHJhaXRzPFByb0NhbWVyYT46OmZuQ29ubmVjdFNlcnZpY2UgPQotICAgICAgICAmSUNhbWVyYVNlcnZpY2U6OmNvbm5lY3RQcm87Ci0KLVByb0NhbWVyYTo6flByb0NhbWVyYSgpCi17Ci0KLX0KLQotLyogSVByb0NhbWVyYVVzZXIncyBpbXBsZW1lbnRhdGlvbiAqLwotCi0vLyBjYWxsYmFjayBmcm9tIGNhbWVyYSBzZXJ2aWNlCi12b2lkIFByb0NhbWVyYTo6bm90aWZ5Q2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0MikKLXsKLSAgICByZXR1cm4gQ2FtZXJhQmFzZVQ6Om5vdGlmeUNhbGxiYWNrKG1zZ1R5cGUsIGV4dDEsIGV4dDIpOwotfQotCi12b2lkIFByb0NhbWVyYTo6b25Mb2NrU3RhdHVzQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9DYW1lcmFDYWxsYmFja3M6OkxvY2tTdGF0dXMgbmV3TG9ja1N0YXR1cykKLXsKLSAgICBBTE9HVigiJXM6IG5ld0xvY2tTdGF0dXMgPSAlZCIsIF9fRlVOQ1RJT05fXywgbmV3TG9ja1N0YXR1cyk7Ci0KLSAgICBzcDxQcm9DYW1lcmFMaXN0ZW5lcj4gbGlzdGVuZXI7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBsaXN0ZW5lciA9IG1MaXN0ZW5lcjsKLSAgICB9Ci0gICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKLSAgICAgICAgc3dpdGNoIChuZXdMb2NrU3RhdHVzKSB7Ci0gICAgICAgICAgICBjYXNlIElQcm9DYW1lcmFDYWxsYmFja3M6OkxPQ0tfQUNRVUlSRUQ6Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXItPm9uTG9ja0FjcXVpcmVkKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElQcm9DYW1lcmFDYWxsYmFja3M6OkxPQ0tfUkVMRUFTRUQ6Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXItPm9uTG9ja1JlbGVhc2VkKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElQcm9DYW1lcmFDYWxsYmFja3M6OkxPQ0tfU1RPTEVOOgotICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5vbkxvY2tTdG9sZW4oKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmtub3duIGxvY2sgc3RhdHVzOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBuZXdMb2NrU3RhdHVzKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBQcm9DYW1lcmE6Om9uUmVzdWx0UmVjZWl2ZWQoaW50MzJfdCByZXF1ZXN0SWQsIGNhbWVyYV9tZXRhZGF0YSogcmVzdWx0KSB7Ci0gICAgQUxPR1YoIiVzOiByZXF1ZXN0SWQgPSAlZCwgcmVzdWx0ID0gJXAiLCBfX0ZVTkNUSU9OX18sIHJlcXVlc3RJZCwgcmVzdWx0KTsKLQotICAgIHNwPFByb0NhbWVyYUxpc3RlbmVyPiBsaXN0ZW5lcjsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIGxpc3RlbmVyID0gbUxpc3RlbmVyOwotICAgIH0KLQotICAgIENhbWVyYU1ldGFkYXRhIHRtcChyZXN1bHQpOwotCi0gICAgLy8gVW5ibG9jayB3YWl0Rm9yRnJhbWUoaWQpIGNhbGxlcnMKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtV2FpdE11dGV4KTsKLSAgICAgICAgbU1ldGFkYXRhUmVhZHkgPSB0cnVlOwotICAgICAgICBtTGF0ZXN0TWV0YWRhdGEgPSB0bXA7IC8vIG1ha2UgY29weQotICAgICAgICBtV2FpdENvbmRpdGlvbi5icm9hZGNhc3QoKTsKLSAgICB9Ci0KLSAgICByZXN1bHQgPSB0bXAucmVsZWFzZSgpOwotCi0gICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKLSAgICAgICAgbGlzdGVuZXItPm9uUmVzdWx0UmVjZWl2ZWQocmVxdWVzdElkLCByZXN1bHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZyZWVfY2FtZXJhX21ldGFkYXRhKHJlc3VsdCk7Ci0gICAgfQotCi19Ci0KLXN0YXR1c190IFByb0NhbWVyYTo6ZXhjbHVzaXZlVHJ5TG9jaygpCi17Ci0gICAgc3AgPElQcm9DYW1lcmFVc2VyPiBjID0gbUNhbWVyYTsKLSAgICBpZiAoYyA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLQotICAgIHJldHVybiBjLT5leGNsdXNpdmVUcnlMb2NrKCk7Ci19Ci1zdGF0dXNfdCBQcm9DYW1lcmE6OmV4Y2x1c2l2ZUxvY2soKQotewotICAgIHNwIDxJUHJvQ2FtZXJhVXNlcj4gYyA9IG1DYW1lcmE7Ci0gICAgaWYgKGMgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0KLSAgICByZXR1cm4gYy0+ZXhjbHVzaXZlTG9jaygpOwotfQotc3RhdHVzX3QgUHJvQ2FtZXJhOjpleGNsdXNpdmVVbmxvY2soKQotewotICAgIHNwIDxJUHJvQ2FtZXJhVXNlcj4gYyA9IG1DYW1lcmE7Ci0gICAgaWYgKGMgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0KLSAgICByZXR1cm4gYy0+ZXhjbHVzaXZlVW5sb2NrKCk7Ci19Ci1ib29sIFByb0NhbWVyYTo6aGFzRXhjbHVzaXZlTG9jaygpCi17Ci0gICAgc3AgPElQcm9DYW1lcmFVc2VyPiBjID0gbUNhbWVyYTsKLSAgICBpZiAoYyA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLQotICAgIHJldHVybiBjLT5oYXNFeGNsdXNpdmVMb2NrKCk7Ci19Ci0KLS8vIE5vdGUgdGhhdCB0aGUgY2FsbGVlIGdldHMgYSBjb3B5IG9mIHRoZSBtZXRhZGF0YS4KLWludCBQcm9DYW1lcmE6OnN1Ym1pdFJlcXVlc3QoY29uc3Qgc3RydWN0IGNhbWVyYV9tZXRhZGF0YSogbWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nKQotewotICAgIHNwIDxJUHJvQ2FtZXJhVXNlcj4gYyA9IG1DYW1lcmE7Ci0gICAgaWYgKGMgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0KLSAgICByZXR1cm4gYy0+c3VibWl0UmVxdWVzdChjb25zdF9jYXN0PHN0cnVjdCBjYW1lcmFfbWV0YWRhdGEqPihtZXRhZGF0YSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtaW5nKTsKLX0KLQotc3RhdHVzX3QgUHJvQ2FtZXJhOjpjYW5jZWxSZXF1ZXN0KGludCByZXF1ZXN0SWQpCi17Ci0gICAgc3AgPElQcm9DYW1lcmFVc2VyPiBjID0gbUNhbWVyYTsKLSAgICBpZiAoYyA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLQotICAgIHJldHVybiBjLT5jYW5jZWxSZXF1ZXN0KHJlcXVlc3RJZCk7Ci19Ci0KLXN0YXR1c190IFByb0NhbWVyYTo6ZGVsZXRlU3RyZWFtKGludCBzdHJlYW1JZCkKLXsKLSAgICBzcCA8SVByb0NhbWVyYVVzZXI+IGMgPSBtQ2FtZXJhOwotICAgIGlmIChjID09IDApIHJldHVybiBOT19JTklUOwotCi0gICAgc3RhdHVzX3QgcyA9IGMtPmRlbGV0ZVN0cmVhbShzdHJlYW1JZCk7Ci0KLSAgICBtU3RyZWFtcy5yZW1vdmVJdGVtKHN0cmVhbUlkKTsKLQotICAgIHJldHVybiBzOwotfQotCi1zdGF0dXNfdCBQcm9DYW1lcmE6OmNyZWF0ZVN0cmVhbShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogc3RyZWFtSWQpCi17Ci0gICAgKnN0cmVhbUlkID0gLTE7Ci0KLSAgICBBTE9HVigiJXM6IGNyZWF0ZVN0cmVhbVcgJWR4JWQgKGZtdD0weCV4KSIsIF9fRlVOQ1RJT05fXywgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KTsKLQotICAgIGlmIChzdXJmYWNlID09IDApIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY3JlYXRlU3RyZWFtKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlkKTsKLX0KLQotc3RhdHVzX3QgUHJvQ2FtZXJhOjpjcmVhdGVTdHJlYW0oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJ1ZmZlclByb2R1Y2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzdHJlYW1JZCkgewotICAgICpzdHJlYW1JZCA9IC0xOwotCi0gICAgQUxPR1YoIiVzOiBjcmVhdGVTdHJlYW1UICVkeCVkIChmbXQ9MHgleCkiLCBfX0ZVTkNUSU9OX18sIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCk7Ci0KLSAgICBpZiAoYnVmZmVyUHJvZHVjZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIHNwIDxJUHJvQ2FtZXJhVXNlcj4gYyA9IG1DYW1lcmE7Ci0gICAgc3RhdHVzX3Qgc3RhdCA9IGMtPmNyZWF0ZVN0cmVhbSh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGJ1ZmZlclByb2R1Y2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSWQpOwotCi0gICAgaWYgKHN0YXQgPT0gT0spIHsKLSAgICAgICAgU3RyZWFtSW5mbyBzKCpzdHJlYW1JZCk7Ci0KLSAgICAgICAgbVN0cmVhbXMuYWRkKCpzdHJlYW1JZCwgcyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXQ7Ci19Ci0KLXN0YXR1c190IFByb0NhbWVyYTo6Y3JlYXRlU3RyZWFtQ3B1KGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWFwQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxDcHVDb25zdW1lcj4qIGNwdUNvbnN1bWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzdHJlYW1JZCkgewotICAgIHJldHVybiBjcmVhdGVTdHJlYW1DcHUod2lkdGgsIGhlaWdodCwgZm9ybWF0LCBoZWFwQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKnN5bmNocm9ub3VzTW9kZSovdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdUNvbnN1bWVyLCBzdHJlYW1JZCk7Ci19Ci0KLXN0YXR1c190IFByb0NhbWVyYTo6Y3JlYXRlU3RyZWFtQ3B1KGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWFwQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN5bmNocm9ub3VzTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPENwdUNvbnN1bWVyPiogY3B1Q29uc3VtZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHN0cmVhbUlkKQotewotICAgIEFMT0dWKCIlczogY3JlYXRlU3RyZWFtVyAlZHglZCAoZm10PTB4JXgpIiwgX19GVU5DVElPTl9fLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KTsKLQotICAgICpjcHVDb25zdW1lciA9IE5VTEw7Ci0KLSAgICBzcCA8SVByb0NhbWVyYVVzZXI+IGMgPSBtQ2FtZXJhOwotICAgIGlmIChjID09IDApIHJldHVybiBOT19JTklUOwotCi0gICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7Ci0gICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7Ci0gICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKLSAgICBzcDxDcHVDb25zdW1lcj4gY2MgPSBuZXcgQ3B1Q29uc3VtZXIoY29uc3VtZXIsIGhlYXBDb3VudAotICAgICAgICAgICAgLyosIHN5bmNocm9ub3VzTW9kZSovKTsKLSAgICBjYy0+c2V0TmFtZShTdHJpbmc4KCJQcm9DYW1lcmE6Om1DcHVDb25zdW1lciIpKTsKLQotICAgIHNwPFN1cmZhY2U+IHN0YyA9IG5ldyBTdXJmYWNlKHByb2R1Y2VyKTsKLQotICAgIHN0YXR1c190IHMgPSBjcmVhdGVTdHJlYW0od2lkdGgsIGhlaWdodCwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RjLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JZCk7Ci0KLSAgICBpZiAocyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IEZhaWx1cmUgdG8gY3JlYXRlIHN0cmVhbSAlZHglZCAoZm10PTB4JXgpIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpOwotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBzcDxQcm9GcmFtZUxpc3RlbmVyPiBmcmFtZUF2YWlsYWJsZUxpc3RlbmVyID0KLSAgICAgICAgbmV3IFByb0ZyYW1lTGlzdGVuZXIodGhpcywgKnN0cmVhbUlkKTsKLQotICAgIGdldFN0cmVhbUluZm8oKnN0cmVhbUlkKS5jcHVTdHJlYW0gPSB0cnVlOwotICAgIGdldFN0cmVhbUluZm8oKnN0cmVhbUlkKS5jcHVDb25zdW1lciA9IGNjOwotICAgIGdldFN0cmVhbUluZm8oKnN0cmVhbUlkKS5zeW5jaHJvbm91c01vZGUgPSBzeW5jaHJvbm91c01vZGU7Ci0gICAgZ2V0U3RyZWFtSW5mbygqc3RyZWFtSWQpLnN0YyA9IHN0YzsKLSAgICAvLyBmb3IgbGlmZXRpbWUgbWFuYWdlbWVudAotICAgIGdldFN0cmVhbUluZm8oKnN0cmVhbUlkKS5mcmFtZUF2YWlsYWJsZUxpc3RlbmVyID0gZnJhbWVBdmFpbGFibGVMaXN0ZW5lcjsKLQotICAgIGNjLT5zZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKGZyYW1lQXZhaWxhYmxlTGlzdGVuZXIpOwotCi0gICAgKmNwdUNvbnN1bWVyID0gY2M7Ci0KLSAgICByZXR1cm4gczsKLX0KLQotY2FtZXJhX21ldGFkYXRhKiBQcm9DYW1lcmE6OmdldENhbWVyYUluZm8oaW50IGNhbWVyYUlkKSB7Ci0gICAgQUxPR1YoIiVzOiBjYW1lcmFJZCA9ICVkIiwgX19GVU5DVElPTl9fLCBjYW1lcmFJZCk7Ci0KLSAgICBzcCA8SVByb0NhbWVyYVVzZXI+IGMgPSBtQ2FtZXJhOwotICAgIGlmIChjID09IDApIHJldHVybiBOVUxMOwotCi0gICAgY2FtZXJhX21ldGFkYXRhKiBwdHIgPSBOVUxMOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGMtPmdldENhbWVyYUluZm8oY2FtZXJhSWQsICZwdHIpOwotCi0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgY2FtZXJhIGluZm8sIGVycm9yID0gJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHB0cjsKLX0KLQotc3RhdHVzX3QgUHJvQ2FtZXJhOjpjcmVhdGVEZWZhdWx0UmVxdWVzdChpbnQgdGVtcGxhdGVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YSoqIHJlcXVlc3QpIGNvbnN0IHsKLSAgICBBTE9HVigiJXM6IHRlbXBsYXRlSWQgPSAlZCIsIF9fRlVOQ1RJT05fXywgdGVtcGxhdGVJZCk7Ci0KLSAgICBzcCA8SVByb0NhbWVyYVVzZXI+IGMgPSBtQ2FtZXJhOwotICAgIGlmIChjID09IDApIHJldHVybiBOT19JTklUOwotCi0gICAgcmV0dXJuIGMtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KHRlbXBsYXRlSWQsIHJlcXVlc3QpOwotfQotCi12b2lkIFByb0NhbWVyYTo6b25GcmFtZUF2YWlsYWJsZShpbnQgc3RyZWFtSWQpIHsKLSAgICBBTE9HVigiJXM6IHN0cmVhbUlkID0gJWQiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKLQotICAgIHNwPFByb0NhbWVyYUxpc3RlbmVyPiBsaXN0ZW5lciA9IG1MaXN0ZW5lcjsKLSAgICBTdHJlYW1JbmZvJiBzdHJlYW0gPSBnZXRTdHJlYW1JbmZvKHN0cmVhbUlkKTsKLQotICAgIGlmIChsaXN0ZW5lci5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgIGxpc3RlbmVyLT5vbkZyYW1lQXZhaWxhYmxlKHN0cmVhbUlkLCBzdHJlYW0uY3B1Q29uc3VtZXIpOwotICAgIH0KLQotICAgIC8vIFVuYmxvY2sgd2FpdEZvckZyYW1lKGlkKSBjYWxsZXJzCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobVdhaXRNdXRleCk7Ci0gICAgICAgIGdldFN0cmVhbUluZm8oc3RyZWFtSWQpLmZyYW1lUmVhZHkrKzsKLSAgICAgICAgbVdhaXRDb25kaXRpb24uYnJvYWRjYXN0KCk7Ci0gICAgfQotfQotCi1pbnQgUHJvQ2FtZXJhOjp3YWl0Rm9yRnJhbWVCdWZmZXIoaW50IHN0cmVhbUlkKSB7Ci0gICAgc3RhdHVzX3Qgc3RhdCA9IEJBRF9WQUxVRTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYWwobVdhaXRNdXRleCk7Ci0KLSAgICBTdHJlYW1JbmZvJiBzaSA9IGdldFN0cmVhbUluZm8oc3RyZWFtSWQpOwotCi0gICAgaWYgKHNpLmZyYW1lUmVhZHkgPiAwKSB7Ci0gICAgICAgIGludCBudW1GcmFtZXMgPSBzaS5mcmFtZVJlYWR5OwotICAgICAgICBzaS5mcmFtZVJlYWR5ID0gMDsKLSAgICAgICAgcmV0dXJuIG51bUZyYW1lczsKLSAgICB9IGVsc2UgewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgc3RhdCA9IG1XYWl0Q29uZGl0aW9uLndhaXRSZWxhdGl2ZShtV2FpdE11dGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdhaXRUaW1lb3V0KTsKLSAgICAgICAgICAgIGlmIChzdGF0ICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciB3aGlsZSB3YWl0aW5nIGZvciBmcmFtZSBidWZmZXI6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdGF0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNpLmZyYW1lUmVhZHkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaW50IG51bUZyYW1lcyA9IHNpLmZyYW1lUmVhZHk7Ci0gICAgICAgICAgICAgICAgc2kuZnJhbWVSZWFkeSA9IDA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bUZyYW1lczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGVsc2UgaXQgd2FzIHNvbWUgb3RoZXIgc3RyZWFtIHRoYXQgZ290IHVuYmxvY2tlZAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXQ7Ci19Ci0KLWludCBQcm9DYW1lcmE6OmRyb3BGcmFtZUJ1ZmZlcihpbnQgc3RyZWFtSWQsIGludCBjb3VudCkgewotICAgIFN0cmVhbUluZm8mIHNpID0gZ2V0U3RyZWFtSW5mbyhzdHJlYW1JZCk7Ci0KLSAgICBpZiAoIXNpLmNwdVN0cmVhbSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoY291bnQgPCAwKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgaWYgKCFzaS5zeW5jaHJvbm91c01vZGUpIHsKLSAgICAgICAgQUxPR1coIiVzOiBObyBuZWVkIHRvIGRyb3AgZnJhbWVzIG9uIGFzeW5jaHJvbm91cyBzdHJlYW1zLCIKLSAgICAgICAgICAgICAgIiBhcyBhc3luY2hyb25vdXMgbW9kZSBvbmx5IGtlZXBzIDEgbGF0ZXN0IGZyYW1lIGFyb3VuZC4iLAotICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIGludCBudW1Ecm9wcGVkID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgQ3B1Q29uc3VtZXI6OkxvY2tlZEJ1ZmZlciBidWZmZXI7Ci0gICAgICAgIGlmIChzaS5jcHVDb25zdW1lci0+bG9ja05leHRCdWZmZXIoJmJ1ZmZlcikgIT0gT0spIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgc2kuY3B1Q29uc3VtZXItPnVubG9ja0J1ZmZlcihidWZmZXIpOwotICAgICAgICBudW1Ecm9wcGVkKys7Ci0gICAgfQotCi0gICAgcmV0dXJuIG51bURyb3BwZWQ7Ci19Ci0KLXN0YXR1c190IFByb0NhbWVyYTo6d2FpdEZvckZyYW1lTWV0YWRhdGEoKSB7Ci0gICAgc3RhdHVzX3Qgc3RhdCA9IEJBRF9WQUxVRTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYWwobVdhaXRNdXRleCk7Ci0KLSAgICBpZiAobU1ldGFkYXRhUmVhZHkpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBzdGF0ID0gbVdhaXRDb25kaXRpb24ud2FpdFJlbGF0aXZlKG1XYWl0TXV0ZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XYWl0VGltZW91dCk7Ci0KLSAgICAgICAgICAgIGlmIChzdGF0ICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciB3aGlsZSB3YWl0aW5nIGZvciBtZXRhZGF0YTogJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdGF0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1NZXRhZGF0YVJlYWR5KSB7Ci0gICAgICAgICAgICAgICAgbU1ldGFkYXRhUmVhZHkgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBlbHNlIGl0IHdhcyBzb21lIG90aGVyIHN0cmVhbSBvciBtZXRhZGF0YQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXQ7Ci19Ci0KLUNhbWVyYU1ldGFkYXRhIFByb0NhbWVyYTo6Y29uc3VtZUZyYW1lTWV0YWRhdGEoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1XYWl0TXV0ZXgpOwotCi0gICAgLy8gRGVzdHJ1Y3RpdmU6IFN1YnNlcXVlbnQgY2FsbHMgcmV0dXJuIGVtcHR5IG1ldGFkYXRhcwotICAgIENhbWVyYU1ldGFkYXRhIHRtcCA9IG1MYXRlc3RNZXRhZGF0YTsKLSAgICBtTGF0ZXN0TWV0YWRhdGEuY2xlYXIoKTsKLQotICAgIHJldHVybiB0bXA7Ci19Ci0KLVByb0NhbWVyYTo6U3RyZWFtSW5mbyYgUHJvQ2FtZXJhOjpnZXRTdHJlYW1JbmZvKGludCBzdHJlYW1JZCkgewotICAgIHJldHVybiBtU3RyZWFtcy5lZGl0VmFsdWVGb3Ioc3RyZWFtSWQpOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuY3BwIGIvY2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuY3BwCmluZGV4IDY2ZDY5MTMuLjQyMTdiYzYgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmNwcAorKysgYi9jYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5jcHAKQEAgLTgxLDYgKzgxLDEzIEBACiAgICAgICAgIG1TdXJmYWNlTGlzdC5wdXNoX2JhY2soc3VyZmFjZSk7CiAgICAgfQogCisgICAgaW50IGlzUmVwcm9jZXNzID0gMDsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZpc1JlcHJvY2VzcykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgcmVwcm9jZXNzaW5nIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgbUlzUmVwcm9jZXNzID0gKGlzUmVwcm9jZXNzICE9IDApOworCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0xMTgsNiArMTI1LDggQEAKICAgICAgICAgcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlcihiaW5kZXIpOwogICAgIH0KIAorICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtSXNSZXByb2Nlc3MgPyAxIDogMCk7CisKICAgICByZXR1cm4gT0s7CiB9CiAKZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuY3BwIGIvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5jcHAKaW5kZXggNGNjN2I1ZC4uZjU5OTg3OSAxMDA2NDQKLS0tIGEvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5jcHAKKysrIGIvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5jcHAKQEAgLTM3LDYgKzM3LDcgQEAKICAgICBDQU1FUkFfSURMRSwKICAgICBDQVBUVVJFX1NUQVJURUQsCiAgICAgUkVTVUxUX1JFQ0VJVkVELAorICAgIFBSRVBBUkVECiB9OwogCiBjbGFzcyBCcENhbWVyYURldmljZUNhbGxiYWNrczogcHVibGljIEJwSW50ZXJmYWNlPElDYW1lcmFEZXZpY2VDYWxsYmFja3M+CkBAIC04MCw3ICs4MSw2IEBACiAgICAgICAgIGRhdGEud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgIH0KIAotCiAgICAgdm9pZCBvblJlc3VsdFJlY2VpdmVkKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSwKICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgewogICAgICAgICBBTE9HVigib25SZXN1bHRSZWNlaXZlZCIpOwpAQCAtOTMsNiArOTMsMTcgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFU1VMVF9SRUNFSVZFRCwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CiAgICAgICAgIGRhdGEud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgIH0KKworICAgIHZvaWQgb25QcmVwYXJlZChpbnQgc3RyZWFtSWQpCisgICAgeworICAgICAgICBBTE9HVigib25QcmVwYXJlZCIpOworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RyZWFtSWQpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUFJFUEFSRUQsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOworICAgICAgICBkYXRhLndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICB9CisKIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShDYW1lcmFEZXZpY2VDYWxsYmFja3MsCkBAIC0xNjAsNiArMTcxLDE1IEBACiAgICAgICAgICAgICBkYXRhLnJlYWRFeGNlcHRpb25Db2RlKCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgUFJFUEFSRUQ6IHsKKyAgICAgICAgICAgIEFMT0dWKCJvblByZXBhcmVkIik7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYURldmljZUNhbGxiYWNrcywgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHQ7CisgICAgICAgICAgICBpbnQgc3RyZWFtSWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgb25QcmVwYXJlZChzdHJlYW1JZCk7CisgICAgICAgICAgICBkYXRhLnJlYWRFeGNlcHRpb25Db2RlKCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmNwcCBiL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmNwcAppbmRleCAyNzdiNWRiLi5kMmRjMjAwIDEwMDY0NAotLS0gYS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5jcHAKKysrIGIvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuY3BwCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5oPgorI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00MSwxMCArNDIsMTQgQEAKICAgICBFTkRfQ09ORklHVVJFLAogICAgIERFTEVURV9TVFJFQU0sCiAgICAgQ1JFQVRFX1NUUkVBTSwKKyAgICBDUkVBVEVfSU5QVVRfU1RSRUFNLAorICAgIEdFVF9JTlBVVF9TVVJGQUNFLAogICAgIENSRUFURV9ERUZBVUxUX1JFUVVFU1QsCiAgICAgR0VUX0NBTUVSQV9JTkZPLAogICAgIFdBSVRfVU5USUxfSURMRSwKLSAgICBGTFVTSAorICAgIEZMVVNILAorICAgIFBSRVBBUkUsCisgICAgVEVBUl9ET1dOCiB9OwogCiBuYW1lc3BhY2UgewpAQCAtNzgsNyArODMsNyBAQAogICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VibWl0UmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCwgYm9vbCByZXBlYXRpbmcsCisgICAgdmlydHVhbCBpbnQgc3VibWl0UmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCwgYm9vbCByZXBlYXRpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC0xMDcsMTMgKzExMiwxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLQlpZiAoKHJlcyA8IE5PX0VSUk9SKSB8fCAocmVzRnJhbWVOdW1iZXIgIT0gTk9fRVJST1IpKSB7CisgICAgICAgIGlmIChyZXMgPCAwIHx8IChyZXNGcmFtZU51bWJlciAhPSBOT19FUlJPUikpIHsKICAgICAgICAgICAgIHJlcyA9IEZBSUxFRF9UUkFOU0FDVElPTjsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VibWl0UmVxdWVzdExpc3QoTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPiByZXF1ZXN0TGlzdCwgYm9vbCByZXBlYXRpbmcsCisgICAgdmlydHVhbCBpbnQgc3VibWl0UmVxdWVzdExpc3QoTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPiByZXF1ZXN0TGlzdCwgYm9vbCByZXBlYXRpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtMTQ3LDcgKzE1Miw3IEBACiAgICAgICAgICAgICAgICAgcmVzRnJhbWVOdW1iZXIgPSByZXBseS5yZWFkSW50NjQobGFzdEZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoKHJlcyA8IE5PX0VSUk9SKSB8fCAocmVzRnJhbWVOdW1iZXIgIT0gTk9fRVJST1IpKSB7CisgICAgICAgIGlmIChyZXMgPCAwIHx8IChyZXNGcmFtZU51bWJlciAhPSBOT19FUlJPUikpIHsKICAgICAgICAgICAgIHJlcyA9IEZBSUxFRF9UUkFOU0FDVElPTjsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVzOwpAQCAtMTg2LDExICsxOTEsMTMgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5kQ29uZmlndXJlKCkKKyAgICB2aXJ0dWFsIHN0YXR1c190IGVuZENvbmZpZ3VyZShib29sIGlzQ29uc3RyYWluZWRIaWdoU3BlZWQpCiAgICAgewogICAgICAgICBBTE9HVigiZW5kQ29uZmlndXJlIik7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFEZXZpY2VVc2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCk7CisKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEVORF9DT05GSUdVUkUsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKQEAgLTIwOCw4ICsyMTUsMjMgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlU3RyZWFtKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJ1ZmZlclByb2R1Y2VyKQorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlU3RyZWFtKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24mIG91dHB1dENvbmZpZ3VyYXRpb24pCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhRGV2aWNlVXNlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgaWYgKG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgIT0gTlVMTCkgeworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOyAvLyBtYXJrZXIgdGhhdCBPdXRwdXRDb25maWd1cmF0aW9uIGlzIG5vdCBudWxsLiBNaW1pYyBhaWRsIGJlaGF2aW9yCisgICAgICAgICAgICBvdXRwdXRDb25maWd1cmF0aW9uLndyaXRlVG9QYXJjZWwoZGF0YSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMCk7CisgICAgICAgIH0KKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENSRUFURV9TVFJFQU0sIGRhdGEsICZyZXBseSk7CisKKyAgICAgICAgcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKTsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlSW5wdXRTdHJlYW0oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0KQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYURldmljZVVzZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC0yMTcsMTcgKzIzOSw0MiBAQAogICAgICAgICBkYXRhLndyaXRlSW50MzIoaGVpZ2h0KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGZvcm1hdCk7CiAKLSAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOyAvLyBtYXJrZXIgdGhhdCBidWZmZXJQcm9kdWNlciBpcyBub3QgbnVsbAotICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYoU3RyaW5nMTYoInVua25vd25fbmFtZSIpKTsgLy8gbmFtZSBvZiBzdXJmYWNlCi0gICAgICAgIHNwPElCaW5kZXI+IGIoSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVyUHJvZHVjZXIpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihiKTsKLQotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ1JFQVRFX1NUUkVBTSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENSRUFURV9JTlBVVF9TVFJFQU0sIGRhdGEsICZyZXBseSk7CiAKICAgICAgICAgcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAorICAgIC8vIGdldCB0aGUgYnVmZmVyIHByb2R1Y2VyIG9mIHRoZSBpbnB1dCBzdHJlYW0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyUHJvZHVjZXIoCisgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqcHJvZHVjZXIpIHsKKyAgICAgICAgaWYgKHByb2R1Y2VyID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhRGV2aWNlVXNlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0lOUFVUX1NVUkZBQ0UsIGRhdGEsICZyZXBseSk7CisKKyAgICAgICAgcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gcmVwbHkucmVhZEludDMyKCkgOworICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gYnAgPSBOVUxMOworICAgICAgICBpZiAocmVwbHkucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgU3RyaW5nMTYgbmFtZSA9IHJlYWRNYXliZUVtcHR5U3RyaW5nMTYocmVwbHkpOworICAgICAgICAgICAgYnAgPSBpbnRlcmZhY2VfY2FzdDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPigKKyAgICAgICAgICAgICAgICAgICAgcmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgfQorCisgICAgICAgICpwcm9kdWNlciA9IGJwOworCisgICAgICAgIHJldHVybiAqcHJvZHVjZXIgPT0gTlVMTCA/IElOVkFMSURfT1BFUkFUSU9OIDogT0s7CisgICAgfQorCiAgICAgLy8gQ3JlYXRlIGEgcmVxdWVzdCBvYmplY3QgZnJvbSBhIHRlbXBsYXRlLgogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlRGVmYXVsdFJlcXVlc3QoaW50IHRlbXBsYXRlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCkBAIC0zMDUsNiArMzUyLDM0IEBACiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlKGludCBzdHJlYW1JZCkKKyAgICB7CisgICAgICAgIEFMT0dWKCJwcmVwYXJlIik7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYURldmljZVVzZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdHJlYW1JZCk7CisKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFBSRVBBUkUsIGRhdGEsICZyZXBseSk7CisKKyAgICAgICAgcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKTsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgdGVhckRvd24oaW50IHN0cmVhbUlkKQorICAgIHsKKyAgICAgICAgQUxPR1YoInRlYXJEb3duIik7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYURldmljZVVzZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdHJlYW1JZCk7CisKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFRFQVJfRE9XTiwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCiBwcml2YXRlOgogCiAKQEAgLTM5NiwzMSArNDcxLDE1IEBACiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQ1JFQVRFX1NUUkVBTTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmFEZXZpY2VVc2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQgd2lkdGgsIGhlaWdodCwgZm9ybWF0OwogCi0gICAgICAgICAgICB3aWR0aCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBBTE9HVigiJXM6IENSRUFURV9TVFJFQU06IHdpZHRoID0gJWQiLCBfX0ZVTkNUSU9OX18sIHdpZHRoKTsKLSAgICAgICAgICAgIGhlaWdodCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBBTE9HVigiJXM6IENSRUFURV9TVFJFQU06IGhlaWdodCA9ICVkIiwgX19GVU5DVElPTl9fLCBoZWlnaHQpOwotICAgICAgICAgICAgZm9ybWF0ID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIEFMT0dWKCIlczogQ1JFQVRFX1NUUkVBTTogZm9ybWF0ID0gJWQiLCBfX0ZVTkNUSU9OX18sIGZvcm1hdCk7Ci0KLSAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGJwOworICAgICAgICAgICAgc3RhdHVzX3QgcmV0ID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgaWYgKGRhdGEucmVhZEludDMyKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIFN0cmluZzE2IG5hbWUgPSByZWFkTWF5YmVFbXB0eVN0cmluZzE2KGRhdGEpOwotICAgICAgICAgICAgICAgIGJwID0gaW50ZXJmYWNlX2Nhc3Q8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4oCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0KLSAgICAgICAgICAgICAgICBBTE9HVigiJXM6IENSRUFURV9TVFJFQU06IGJwID0gJXAsIG5hbWUgPSAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICBicC5nZXQoKSwgU3RyaW5nOChuYW1lKS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBvdXRwdXRDb25maWd1cmF0aW9uKGRhdGEpOworICAgICAgICAgICAgICAgIHJldCA9IGNyZWF0ZVN0cmVhbShvdXRwdXRDb25maWd1cmF0aW9uKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBDUkVBVEVfU1RSRUFNOiBicCA9IHVuc2V0LCBuYW1lID0gdW5zZXQiLAotICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgdGFrZSBhbiBlbXB0eSBPdXRwdXRDb25maWd1cmF0aW9uIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3RhdHVzX3QgcmV0OwotICAgICAgICAgICAgcmV0ID0gY3JlYXRlU3RyZWFtKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgYnApOwotCiAgICAgICAgICAgICByZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgICAgQUxPR1YoIiVzOiBDUkVBVEVfU1RSRUFNOiB3cml0ZSBub0V4Y2VwdGlvbiIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXQpOwpAQCAtNDI4LDcgKzQ4NywzNSBAQAogCiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgQ1JFQVRFX0lOUFVUX1NUUkVBTTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmFEZXZpY2VVc2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBpbnQgd2lkdGgsIGhlaWdodCwgZm9ybWF0OwogCisgICAgICAgICAgICB3aWR0aCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBoZWlnaHQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgZm9ybWF0ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHN0YXR1c190IHJldCA9IGNyZWF0ZUlucHV0U3RyZWFtKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCk7CisKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXQpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworCisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgR0VUX0lOUFVUX1NVUkZBQ0U6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhRGV2aWNlVXNlciwgZGF0YSwgcmVwbHkpOworCisgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBicDsKKyAgICAgICAgICAgIHN0YXR1c190IHJldCA9IGdldElucHV0QnVmZmVyUHJvZHVjZXIoJmJwKTsKKyAgICAgICAgICAgIHNwPElCaW5kZXI+IGIoSUludGVyZmFjZTo6YXNCaW5kZXIocmV0ID09IE9LID8gYnAgOiBOVUxMKSk7CisKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJpbmcxNihTdHJpbmcxNigiY2FtZXJhIGlucHV0IikpOyAvLyBuYW1lIG9mIHN1cmZhY2UKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihiKTsKKworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIENSRUFURV9ERUZBVUxUX1JFUVVFU1Q6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhRGV2aWNlVXNlciwgZGF0YSwgcmVwbHkpOwogCkBAIC00ODYsMTAgKzU3MywyNiBAQAogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEVORF9DT05GSUdVUkU6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhRGV2aWNlVXNlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlbmRDb25maWd1cmUoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlbmRDb25maWd1cmUoaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFBSRVBBUkU6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhRGV2aWNlVXNlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgaW50IHN0cmVhbUlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihwcmVwYXJlKHN0cmVhbUlkKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgVEVBUl9ET1dOOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYURldmljZVVzZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGludCBzdHJlYW1JZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIodGVhckRvd24oc3RyZWFtSWQpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcCBiL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYTIzZTAKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcApAQCAtMCwwICsxLDg0IEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjZGVmaW5lIExPR19UQUcgIk91dHB1dENvbmZpZ3VyYXRpb24iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKworY29uc3QgaW50IE91dHB1dENvbmZpZ3VyYXRpb246OklOVkFMSURfUk9UQVRJT04gPSAtMTsKKworLy8gUmVhZCBlbXB0eSBzdHJpbmdzIHdpdGhvdXQgcHJpbnRpbmcgYSBmYWxzZSBlcnJvciBtZXNzYWdlLgorU3RyaW5nMTYgT3V0cHV0Q29uZmlndXJhdGlvbjo6cmVhZE1heWJlRW1wdHlTdHJpbmcxNihjb25zdCBQYXJjZWwmIHBhcmNlbCkgeworICAgIHNpemVfdCBsZW47CisgICAgY29uc3QgY2hhcjE2X3QqIHN0ciA9IHBhcmNlbC5yZWFkU3RyaW5nMTZJbnBsYWNlKCZsZW4pOworICAgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gU3RyaW5nMTYoc3RyLCBsZW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBTdHJpbmcxNigpOworICAgIH0KK30KKworc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gT3V0cHV0Q29uZmlndXJhdGlvbjo6Z2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgY29uc3QgeworICAgIHJldHVybiBtR2JwOworfQorCitpbnQgT3V0cHV0Q29uZmlndXJhdGlvbjo6Z2V0Um90YXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIG1Sb3RhdGlvbjsKK30KKworT3V0cHV0Q29uZmlndXJhdGlvbjo6T3V0cHV0Q29uZmlndXJhdGlvbihjb25zdCBQYXJjZWwmIHBhcmNlbCkgeworICAgIHN0YXR1c190IGVycjsKKyAgICBpbnQgcm90YXRpb24gPSAwOworICAgIGlmICgoZXJyID0gcGFyY2VsLnJlYWRJbnQzMigmcm90YXRpb24pKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHJvdGF0aW9uIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgbUdicCA9IE5VTEw7CisgICAgICAgIG1Sb3RhdGlvbiA9IElOVkFMSURfUk9UQVRJT047CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTdHJpbmcxNiBuYW1lID0gcmVhZE1heWJlRW1wdHlTdHJpbmcxNihwYXJjZWwpOworICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAgPQorICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4ocGFyY2VsLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgbUdicCA9IGdicDsKKyAgICBtUm90YXRpb24gPSByb3RhdGlvbjsKKworICAgIEFMT0dWKCIlczogT3V0cHV0Q29uZmlndXJhdGlvbjogYnAgPSAlcCwgbmFtZSA9ICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgIGdicC5nZXQoKSwgU3RyaW5nOChuYW1lKS5zdHJpbmcoKSk7Cit9CisKK091dHB1dENvbmZpZ3VyYXRpb246Ok91dHB1dENvbmZpZ3VyYXRpb24oc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGdicCwgaW50IHJvdGF0aW9uKSB7CisgICAgbUdicCA9IGdicDsKKyAgICBtUm90YXRpb24gPSByb3RhdGlvbjsKK30KKworc3RhdHVzX3QgT3V0cHV0Q29uZmlndXJhdGlvbjo6d3JpdGVUb1BhcmNlbChQYXJjZWwmIHBhcmNlbCkgY29uc3QgeworCisgICAgcGFyY2VsLndyaXRlSW50MzIobVJvdGF0aW9uKTsKKyAgICBwYXJjZWwud3JpdGVTdHJpbmcxNihTdHJpbmcxNigidW5rbm93bl9uYW1lIikpOyAvLyBuYW1lIG9mIHN1cmZhY2UKKyAgICBzcDxJQmluZGVyPiBiKElJbnRlcmZhY2U6OmFzQmluZGVyKG1HYnApKTsKKyAgICBwYXJjZWwud3JpdGVTdHJvbmdCaW5kZXIoYik7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rIGIvY2FtZXJhL3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggMmRiNGMxNC4uMzc3N2Q5NCAxMDA2NDQKLS0tIGEvY2FtZXJhL3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvY2FtZXJhL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTE3LDggKzE3LDggQEAKIExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9ICQoTE9DQUxfUEFUSCkvQW5kcm9pZC5tawogCiBMT0NBTF9TUkNfRklMRVM6PSBcCi0JUHJvQ2FtZXJhVGVzdHMuY3BwIFwKLQlWZW5kb3JUYWdEZXNjcmlwdG9yVGVzdHMuY3BwCisJVmVuZG9yVGFnRGVzY3JpcHRvclRlc3RzLmNwcCBcCisJQ2FtZXJhQmluZGVyVGVzdHMuY3BwCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogCWxpYnV0aWxzIFwKZGlmZiAtLWdpdCBhL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAgYi9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MmZiNzIKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwCkBAIC0wLDAgKzEsNDg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhQmluZGVyVGVzdHMiCisKKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKyNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KKworI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhU2VydmljZUxpc3RlbmVyLmg+CisjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuaD4KKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmg+CisKKyNpbmNsdWRlIDxndWkvQnVmZmVySXRlbUNvbnN1bWVyLmg+CisjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworI2RlZmluZSBBU1NFUlRfTk9UX05VTEwoeCkgXAorICAgIEFTU0VSVF9UUlVFKCh4KSAhPSBudWxscHRyKQorCisjZGVmaW5lIFNFVFVQX1RJTUVPVVQgMjAwMDAwMDAwMCAvLyBucworI2RlZmluZSBJRExFX1RJTUVPVVQgMjAwMDAwMDAwMCAvLyBucworCisvLyBTdHViIGxpc3RlbmVyIGltcGxlbWVudGF0aW9uCitjbGFzcyBUZXN0Q2FtZXJhU2VydmljZUxpc3RlbmVyIDogcHVibGljIEJuQ2FtZXJhU2VydmljZUxpc3RlbmVyIHsKKyAgICBzdGQ6Om1hcDxTdHJpbmcxNiwgVG9yY2hTdGF0dXM+IG1DYW1lcmFUb3JjaFN0YXR1c2VzOworICAgIHN0ZDo6bWFwPGludDMyX3QsIFN0YXR1cz4gbUNhbWVyYVN0YXR1c2VzOworICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CisgICAgbXV0YWJsZSBDb25kaXRpb24gbUNvbmRpdGlvbjsKKyAgICBtdXRhYmxlIENvbmRpdGlvbiBtVG9yY2hDb25kaXRpb247CitwdWJsaWM6CisgICAgdmlydHVhbCB+VGVzdENhbWVyYVNlcnZpY2VMaXN0ZW5lcigpIHt9OworCisgICAgdmlydHVhbCB2b2lkIG9uU3RhdHVzQ2hhbmdlZChTdGF0dXMgc3RhdHVzLCBpbnQzMl90IGNhbWVyYUlkKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgbUNhbWVyYVN0YXR1c2VzW2NhbWVyYUlkXSA9IHN0YXR1czsKKyAgICAgICAgbUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKKyAgICB9OworCisgICAgdmlydHVhbCB2b2lkIG9uVG9yY2hTdGF0dXNDaGFuZ2VkKFRvcmNoU3RhdHVzIHN0YXR1cywgY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgbUNhbWVyYVRvcmNoU3RhdHVzZXNbY2FtZXJhSWRdID0gc3RhdHVzOworICAgICAgICBtVG9yY2hDb25kaXRpb24uYnJvYWRjYXN0KCk7CisgICAgfTsKKworICAgIGJvb2wgd2FpdEZvck51bUNhbWVyYXMoc2l6ZV90IG51bSkgY29uc3QgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICAgICAgaWYgKG1DYW1lcmFTdGF0dXNlcy5zaXplKCkgPT0gbnVtKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChtQ2FtZXJhU3RhdHVzZXMuc2l6ZSgpIDwgbnVtKSB7CisgICAgICAgICAgICBpZiAobUNvbmRpdGlvbi53YWl0UmVsYXRpdmUobUxvY2ssIFNFVFVQX1RJTUVPVVQpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH07CisKKyAgICBib29sIHdhaXRGb3JUb3JjaFN0YXRlKFRvcmNoU3RhdHVzIHN0YXR1cywgaW50MzJfdCBjYW1lcmFJZCkgY29uc3QgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICAgICAgY29uc3QgYXV0byYgaXRlciA9IG1DYW1lcmFUb3JjaFN0YXR1c2VzLmZpbmQoU3RyaW5nMTYoU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGNhbWVyYUlkKSkpOworICAgICAgICBpZiAoaXRlciAhPSBtQ2FtZXJhVG9yY2hTdGF0dXNlcy5lbmQoKSAmJiBpdGVyLT5zZWNvbmQgPT0gc3RhdHVzKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgZm91bmRTdGF0dXMgPSBmYWxzZTsKKyAgICAgICAgd2hpbGUgKCFmb3VuZFN0YXR1cykgeworICAgICAgICAgICAgaWYgKG1Ub3JjaENvbmRpdGlvbi53YWl0UmVsYXRpdmUobUxvY2ssIFNFVFVQX1RJTUVPVVQpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgYXV0byYgaXRlciA9CisgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFUb3JjaFN0YXR1c2VzLmZpbmQoU3RyaW5nMTYoU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGNhbWVyYUlkKSkpOworICAgICAgICAgICAgZm91bmRTdGF0dXMgPSAoaXRlciAhPSBtQ2FtZXJhVG9yY2hTdGF0dXNlcy5lbmQoKSAmJiBpdGVyLT5zZWNvbmQgPT0gc3RhdHVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9OworCisgICAgVG9yY2hTdGF0dXMgZ2V0VG9yY2hTdGF0dXMoaW50MzJfdCBjYW1lcmFJZCkgY29uc3QgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgICAgIGNvbnN0IGF1dG8mIGl0ZXIgPSBtQ2FtZXJhVG9yY2hTdGF0dXNlcy5maW5kKFN0cmluZzE2KFN0cmluZzg6OmZvcm1hdCgiJWQiLCBjYW1lcmFJZCkpKTsKKyAgICAgICAgaWYgKGl0ZXIgPT0gbUNhbWVyYVRvcmNoU3RhdHVzZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpUT1JDSF9TVEFUVVNfVU5LTk9XTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXRlci0+c2Vjb25kOworICAgIH07CisKKyAgICBTdGF0dXMgZ2V0U3RhdHVzKGludDMyX3QgY2FtZXJhSWQpIGNvbnN0IHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICBjb25zdCBhdXRvJiBpdGVyID0gbUNhbWVyYVN0YXR1c2VzLmZpbmQoY2FtZXJhSWQpOworICAgICAgICBpZiAoaXRlciA9PSBtQ2FtZXJhU3RhdHVzZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfVU5LTk9XTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXRlci0+c2Vjb25kOworICAgIH07Cit9OworCisvLyBDYWxsYmFjayBpbXBsZW1lbnRhdGlvbgorY2xhc3MgVGVzdENhbWVyYURldmljZUNhbGxiYWNrcyA6IHB1YmxpYyBCbkNhbWVyYURldmljZUNhbGxiYWNrcyB7CitwdWJsaWM6CisgICAgZW51bSBTdGF0dXMgeworICAgICAgICBJRExFLAorICAgICAgICBFUlJPUiwKKyAgICAgICAgUFJFUEFSRUQsCisgICAgICAgIFJVTk5JTkcsCisgICAgICAgIFNFTlRfUkVTVUxULAorICAgICAgICBVTklOSVRJQUxJWkVECisgICAgfTsKKworcHJvdGVjdGVkOgorICAgIGJvb2wgbUVycm9yOworICAgIFN0YXR1cyBtTGFzdFN0YXR1czsKKyAgICBtdXRhYmxlIHN0ZDo6dmVjdG9yPFN0YXR1cz4gbVN0YXR1c2VzSGl0OworICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CisgICAgbXV0YWJsZSBDb25kaXRpb24gbVN0YXR1c0NvbmRpdGlvbjsKK3B1YmxpYzoKKyAgICBUZXN0Q2FtZXJhRGV2aWNlQ2FsbGJhY2tzKCkgOiBtRXJyb3IoZmFsc2UpLCBtTGFzdFN0YXR1cyhVTklOSVRJQUxJWkVEKSB7fQorCisgICAgdmlydHVhbCB+VGVzdENhbWVyYURldmljZUNhbGxiYWNrcygpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25EZXZpY2VFcnJvcihDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgICAgIEFMT0dFKCIlczogb25EZXZpY2VFcnJvciBvY2N1cnJlZCB3aXRoOiAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdGljX2Nhc3Q8aW50PihlcnJvckNvZGUpKTsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICBtRXJyb3IgPSB0cnVlOworICAgICAgICBtTGFzdFN0YXR1cyA9IEVSUk9SOworICAgICAgICBtU3RhdHVzZXNIaXQucHVzaF9iYWNrKG1MYXN0U3RhdHVzKTsKKyAgICAgICAgbVN0YXR1c0NvbmRpdGlvbi5icm9hZGNhc3QoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25EZXZpY2VJZGxlKCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgICAgIG1MYXN0U3RhdHVzID0gSURMRTsKKyAgICAgICAgbVN0YXR1c2VzSGl0LnB1c2hfYmFjayhtTGFzdFN0YXR1cyk7CisgICAgICAgIG1TdGF0dXNDb25kaXRpb24uYnJvYWRjYXN0KCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uQ2FwdHVyZVN0YXJ0ZWQoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXApIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICBtTGFzdFN0YXR1cyA9IFJVTk5JTkc7CisgICAgICAgIG1TdGF0dXNlc0hpdC5wdXNoX2JhY2sobUxhc3RTdGF0dXMpOworICAgICAgICBtU3RhdHVzQ29uZGl0aW9uLmJyb2FkY2FzdCgpOworICAgIH0KKworCisgICAgdmlydHVhbCB2b2lkIG9uUmVzdWx0UmVjZWl2ZWQoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhLAorICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgbUxhc3RTdGF0dXMgPSBTRU5UX1JFU1VMVDsKKyAgICAgICAgbVN0YXR1c2VzSGl0LnB1c2hfYmFjayhtTGFzdFN0YXR1cyk7CisgICAgICAgIG1TdGF0dXNDb25kaXRpb24uYnJvYWRjYXN0KCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uUHJlcGFyZWQoaW50IHN0cmVhbUlkKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgbUxhc3RTdGF0dXMgPSBQUkVQQVJFRDsKKyAgICAgICAgbVN0YXR1c2VzSGl0LnB1c2hfYmFjayhtTGFzdFN0YXR1cyk7CisgICAgICAgIG1TdGF0dXNDb25kaXRpb24uYnJvYWRjYXN0KCk7CisgICAgfQorCisgICAgLy8gVGVzdCBoZWxwZXIgZnVuY3Rpb25zOgorCisgICAgYm9vbCBoYWRFcnJvcigpIGNvbnN0IHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICByZXR1cm4gbUVycm9yOworICAgIH0KKworICAgIGJvb2wgd2FpdEZvclN0YXR1cyhTdGF0dXMgc3RhdHVzKSBjb25zdCB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1MYXN0U3RhdHVzID09IHN0YXR1cykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoc3RkOjpmaW5kKG1TdGF0dXNlc0hpdC5iZWdpbigpLCBtU3RhdHVzZXNIaXQuZW5kKCksIHN0YXR1cykKKyAgICAgICAgICAgICAgICA9PSBtU3RhdHVzZXNIaXQuZW5kKCkpIHsKKworICAgICAgICAgICAgaWYgKG1TdGF0dXNDb25kaXRpb24ud2FpdFJlbGF0aXZlKG1Mb2NrLCBJRExFX1RJTUVPVVQpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgbVN0YXR1c2VzSGl0LmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1TdGF0dXNlc0hpdC5jbGVhcigpOworCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgfQorCisgICAgdm9pZCBjbGVhclN0YXR1cygpIGNvbnN0IHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICBtU3RhdHVzZXNIaXQuY2xlYXIoKTsKKyAgICB9CisKKyAgICBib29sIHdhaXRGb3JJZGxlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gd2FpdEZvclN0YXR1cyhJRExFKTsKKyAgICB9CisKK307CisKKy8vIEV4ZXJjaXNlIGJhc2ljIGJpbmRlciBjYWxscyBmb3IgdGhlIGNhbWVyYSBzZXJ2aWNlCitURVNUKENhbWVyYVNlcnZpY2VCaW5kZXJUZXN0LCBDaGVja0JpbmRlckNhbWVyYVNlcnZpY2UpIHsKKyAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CisgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5jYW1lcmEiKSk7CisgICAgQVNTRVJUX05PVF9OVUxMKGJpbmRlcik7CisgICAgc3A8SUNhbWVyYVNlcnZpY2U+IHNlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJQ2FtZXJhU2VydmljZT4oYmluZGVyKTsKKworCisgICAgaW50MzJfdCBudW1DYW1lcmFzID0gc2VydmljZS0+Z2V0TnVtYmVyT2ZDYW1lcmFzKCk7CisgICAgRVhQRUNUX0xFKDAsIG51bUNhbWVyYXMpOworCisgICAgLy8gQ2hlY2sgbGlzdGVuZXIgYmluZGVyIGNhbGxzCisgICAgc3A8VGVzdENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gbGlzdGVuZXIobmV3IFRlc3RDYW1lcmFTZXJ2aWNlTGlzdGVuZXIoKSk7CisgICAgRVhQRUNUX0VRKE9LLCBzZXJ2aWNlLT5hZGRMaXN0ZW5lcihsaXN0ZW5lcikpOworCisgICAgRVhQRUNUX1RSVUUobGlzdGVuZXItPndhaXRGb3JOdW1DYW1lcmFzKG51bUNhbWVyYXMpKTsKKworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bUNhbWVyYXM7IGkrKykgeworICAgICAgICAvLyBXZSBvbmx5IGNhcmUgYWJvdXQgYmluZGVyIGNhbGxzIGZvciB0aGUgQ2FtZXJhMiBBUEkuICBDYW1lcmExIGlzIGRlcHJlY2F0ZWQuCisgICAgICAgIHN0YXR1c190IGNhbWVyYTJTdXBwb3J0ID0gc2VydmljZS0+c3VwcG9ydHNDYW1lcmFBcGkoaSwgSUNhbWVyYVNlcnZpY2U6OkFQSV9WRVJTSU9OXzIpOworICAgICAgICBpZiAoY2FtZXJhMlN1cHBvcnQgIT0gT0spIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgtRU9QTk9UU1VQUCwgY2FtZXJhMlN1cHBvcnQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBtZXRhZGF0YSBiaW5kZXIgY2FsbAorICAgICAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YTsKKyAgICAgICAgRVhQRUNUX0VRKE9LLCBzZXJ2aWNlLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoaSwgJm1ldGFkYXRhKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShtZXRhZGF0YS5pc0VtcHR5KCkpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSdyZSBhdmFpbGFibGUsIG9yIHNraXAgZGV2aWNlIHRlc3RzIG90aGVyd2lzZQorICAgICAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXMgcyA9IGxpc3RlbmVyLT5nZXRTdGF0dXMoaSk7CisgICAgICAgIEVYUEVDVF9FUShJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfQVZBSUxBQkxFLCBzKTsKKyAgICAgICAgaWYgKHMgIT0gSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX0FWQUlMQUJMRSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBjb25uZWN0IGJpbmRlciBjYWxscworICAgICAgICBzcDxUZXN0Q2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjYWxsYmFja3MobmV3IFRlc3RDYW1lcmFEZXZpY2VDYWxsYmFja3MoKSk7CisgICAgICAgIHNwPElDYW1lcmFEZXZpY2VVc2VyPiBkZXZpY2U7CisgICAgICAgIEVYUEVDVF9FUShPSywgc2VydmljZS0+Y29ubmVjdERldmljZShjYWxsYmFja3MsIGksIFN0cmluZzE2KCJtZWVlZWVlZWVlISIpLAorICAgICAgICAgICAgICAgIElDYW1lcmFTZXJ2aWNlOjpVU0VfQ0FMTElOR19VSUQsIC8qb3V0Ki9kZXZpY2UpKTsKKyAgICAgICAgQVNTRVJUX05FKG51bGxwdHIsIGRldmljZS5nZXQoKSk7CisgICAgICAgIGRldmljZS0+ZGlzY29ubmVjdCgpOworICAgICAgICBFWFBFQ1RfRkFMU0UoY2FsbGJhY2tzLT5oYWRFcnJvcigpKTsKKworICAgICAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpUb3JjaFN0YXR1cyB0b3JjaFN0YXR1cyA9IGxpc3RlbmVyLT5nZXRUb3JjaFN0YXR1cyhpKTsKKyAgICAgICAgaWYgKHRvcmNoU3RhdHVzID09IElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlRPUkNIX1NUQVRVU19BVkFJTEFCTEVfT0ZGKSB7CisgICAgICAgICAgICAvLyBDaGVjayB0b3JjaCBjYWxscworICAgICAgICAgICAgRVhQRUNUX0VRKE9LLCBzZXJ2aWNlLT5zZXRUb3JjaE1vZGUoU3RyaW5nMTYoU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGkpKSwKKyAgICAgICAgICAgICAgICAgICAgLyplbmFibGVkKi90cnVlLCBjYWxsYmFja3MpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKGxpc3RlbmVyLT53YWl0Rm9yVG9yY2hTdGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VE9SQ0hfU1RBVFVTX0FWQUlMQUJMRV9PTiwgaSkpOworICAgICAgICAgICAgRVhQRUNUX0VRKE9LLCBzZXJ2aWNlLT5zZXRUb3JjaE1vZGUoU3RyaW5nMTYoU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGkpKSwKKyAgICAgICAgICAgICAgICAgICAgLyplbmFibGVkKi9mYWxzZSwgY2FsbGJhY2tzKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShsaXN0ZW5lci0+d2FpdEZvclRvcmNoU3RhdGUoCisgICAgICAgICAgICAgICAgICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlRPUkNIX1NUQVRVU19BVkFJTEFCTEVfT0ZGLCBpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoT0ssIHNlcnZpY2UtPnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKSk7Cit9CisKKy8vIFRlc3QgZml4dHVyZSBmb3IgY2xpZW50IGZvY3VzZWQgYmluZGVyIHRlc3RzCitjbGFzcyBDYW1lcmFDbGllbnRCaW5kZXJUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworcHJvdGVjdGVkOgorICAgIHNwPElDYW1lcmFTZXJ2aWNlPiBzZXJ2aWNlOworICAgIGludDMyX3QgbnVtQ2FtZXJhczsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3A8VGVzdENhbWVyYURldmljZUNhbGxiYWNrcz4sIHNwPElDYW1lcmFEZXZpY2VVc2VyPj4+IG9wZW5EZXZpY2VMaXN0OworICAgIHNwPFRlc3RDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IHNlcnZpY2VMaXN0ZW5lcjsKKworICAgIHN0ZDo6cGFpcjxzcDxUZXN0Q2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiwgc3A8SUNhbWVyYURldmljZVVzZXI+PiBvcGVuTmV3RGV2aWNlKGludCBkZXZpY2VJZCkgeworCisgICAgICAgIHNwPFRlc3RDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGNhbGxiYWNrcyhuZXcgVGVzdENhbWVyYURldmljZUNhbGxiYWNrcygpKTsKKyAgICAgICAgc3A8SUNhbWVyYURldmljZVVzZXI+IGRldmljZTsKKyAgICAgICAgeworICAgICAgICAgICAgU0NPUEVEX1RSQUNFKCJvcGVuTmV3RGV2aWNlIik7CisgICAgICAgICAgICBFWFBFQ1RfRVEoT0ssIHNlcnZpY2UtPmNvbm5lY3REZXZpY2UoY2FsbGJhY2tzLCBkZXZpY2VJZCwgU3RyaW5nMTYoIm1lZWVlZWVlZWUhIiksCisgICAgICAgICAgICAgICAgICAgIElDYW1lcmFTZXJ2aWNlOjpVU0VfQ0FMTElOR19VSUQsIC8qb3V0Ki9kZXZpY2UpKTsKKyAgICAgICAgfQorICAgICAgICBhdXRvIHAgPSBzdGQ6Om1ha2VfcGFpcihjYWxsYmFja3MsIGRldmljZSk7CisgICAgICAgIG9wZW5EZXZpY2VMaXN0LnB1c2hfYmFjayhwKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorCisgICAgdm9pZCBjbG9zZURldmljZShzdGQ6OnBhaXI8c3A8VGVzdENhbWVyYURldmljZUNhbGxiYWNrcz4sIHNwPElDYW1lcmFEZXZpY2VVc2VyPj4mIHApIHsKKyAgICAgICAgaWYgKHAuc2Vjb25kLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHAuc2Vjb25kLT5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU0NPUEVEX1RSQUNFKCJjbG9zZURldmljZSIpOworICAgICAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZpcnN0LT5oYWRFcnJvcigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmQob3BlbkRldmljZUxpc3QuYmVnaW4oKSwgb3BlbkRldmljZUxpc3QuZW5kKCksIHApOworICAgICAgICBpZiAoaXRlciAhPSBvcGVuRGV2aWNlTGlzdC5lbmQoKSkgeworICAgICAgICAgICAgb3BlbkRldmljZUxpc3QuZXJhc2UoaXRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKyAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBzbS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEuY2FtZXJhIikpOworICAgICAgICBzZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SUNhbWVyYVNlcnZpY2U+KGJpbmRlcik7CisgICAgICAgIHNlcnZpY2VMaXN0ZW5lciA9IG5ldyBUZXN0Q2FtZXJhU2VydmljZUxpc3RlbmVyKCk7CisgICAgICAgIHNlcnZpY2UtPmFkZExpc3RlbmVyKHNlcnZpY2VMaXN0ZW5lcik7CisgICAgICAgIG51bUNhbWVyYXMgPSBzZXJ2aWNlLT5nZXROdW1iZXJPZkNhbWVyYXMoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgICAgIHNlcnZpY2UgPSBudWxscHRyOworICAgICAgICBudW1DYW1lcmFzID0gMDsKKyAgICAgICAgZm9yIChhdXRvJiBwIDogb3BlbkRldmljZUxpc3QpIHsKKyAgICAgICAgICAgIGNsb3NlRGV2aWNlKHApOworICAgICAgICB9CisgICAgfQorCit9OworCitURVNUX0YoQ2FtZXJhQ2xpZW50QmluZGVyVGVzdCwgQ2hlY2tCaW5kZXJDYW1lcmFEZXZpY2VVc2VyKSB7CisgICAgQVNTRVJUX05PVF9OVUxMKHNlcnZpY2UpOworCisgICAgRVhQRUNUX1RSVUUoc2VydmljZUxpc3RlbmVyLT53YWl0Rm9yTnVtQ2FtZXJhcyhudW1DYW1lcmFzKSk7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSdyZSBhdmFpbGFibGUsIG9yIHNraXAgZGV2aWNlIHRlc3RzIG90aGVyd2lzZQorICAgICAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXMgcyA9IHNlcnZpY2VMaXN0ZW5lci0+Z2V0U3RhdHVzKGkpOworICAgICAgICBFWFBFQ1RfRVEoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX0FWQUlMQUJMRSwgcyk7CisgICAgICAgIGlmIChzICE9IElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19BVkFJTEFCTEUpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgYXV0byBwID0gb3Blbk5ld0RldmljZShpKTsKKyAgICAgICAgc3A8VGVzdENhbWVyYURldmljZUNhbGxiYWNrcz4gY2FsbGJhY2tzID0gcC5maXJzdDsKKyAgICAgICAgc3A8SUNhbWVyYURldmljZVVzZXI+IGRldmljZSA9IHAuc2Vjb25kOworCisgICAgICAgIC8vIFNldHVwIGEgYnVmZmVyIHF1ZXVlOyBJJ20ganVzdCB1c2luZyB0aGUgdmVuZG9yIG9wYXF1ZSBmb3JtYXQgaGVyZSBhcyB0aGF0IGlzCisgICAgICAgIC8vIGd1YXJhbnRlZWQgdG8gYmUgcHJlc2VudAorICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnYlByb2R1Y2VyOworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBnYkNvbnN1bWVyOworICAgICAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJmdiUHJvZHVjZXIsICZnYkNvbnN1bWVyKTsKKyAgICAgICAgc3A8QnVmZmVySXRlbUNvbnN1bWVyPiBvcGFxdWVDb25zdW1lciA9IG5ldyBCdWZmZXJJdGVtQ29uc3VtZXIoZ2JDb25zdW1lciwKKyAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfTkVWRVIsIC8qbWF4SW1hZ2VzKi8yLCAvKmNvbnRyb2xsZWRCeUFwcCovdHJ1ZSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG9wYXF1ZUNvbnN1bWVyLmdldCgpICE9IG51bGxwdHIpOworICAgICAgICBvcGFxdWVDb25zdW1lci0+c2V0TmFtZShTdHJpbmc4KCJub20gbm9tIG5vbSIpKTsKKworICAgICAgICAvLyBTZXQgdG8gVkdBIGRpbWVucyBmb3IgZGVmYXVsdCwgYXMgdGhhdCBpcyBndWFyYW50ZWVkIHRvIGJlIHByZXNlbnQKKyAgICAgICAgRVhQRUNUX0VRKE9LLCBnYkNvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyU2l6ZSg2NDAsIDQ4MCkpOworICAgICAgICBFWFBFQ1RfRVEoT0ssIGdiQ29uc3VtZXItPnNldERlZmF1bHRCdWZmZXJGb3JtYXQoSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKSk7CisKKyAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZShuZXcgU3VyZmFjZShnYlByb2R1Y2VyLCAvKmNvbnRyb2xsZWRCeUFwcCovZmFsc2UpKTsKKworICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uIG91dHB1dChnYlByb2R1Y2VyLCAvKnJvdGF0aW9uKi8wKTsKKworICAgICAgICAvLyBDYW4gd2UgY29uZmlndXJlPworICAgICAgICBFWFBFQ1RfRVEoT0ssIGRldmljZS0+YmVnaW5Db25maWd1cmUoKSk7CisgICAgICAgIHN0YXR1c190IHN0cmVhbUlkID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0ob3V0cHV0KTsKKyAgICAgICAgRVhQRUNUX0xFKDAsIHN0cmVhbUlkKTsKKyAgICAgICAgRVhQRUNUX0VRKE9LLCBkZXZpY2UtPmVuZENvbmZpZ3VyZSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGNhbGxiYWNrcy0+aGFkRXJyb3IoKSk7CisKKyAgICAgICAgLy8gQ2FuIHdlIG1ha2UgcmVxdWVzdHM/CisgICAgICAgIENhbWVyYU1ldGFkYXRhIHJlcXVlc3RUZW1wbGF0ZTsKKyAgICAgICAgRVhQRUNUX0VRKE9LLCBkZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KC8qcHJldmlldyB0ZW1wbGF0ZSovMSwKKyAgICAgICAgICAgICAgICAvKm91dCovJnJlcXVlc3RUZW1wbGF0ZSkpOworICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdChuZXcgQ2FwdHVyZVJlcXVlc3QoKSk7CisgICAgICAgIHJlcXVlc3QtPm1NZXRhZGF0YSA9IHJlcXVlc3RUZW1wbGF0ZTsKKyAgICAgICAgcmVxdWVzdC0+bVN1cmZhY2VMaXN0LmFkZChzdXJmYWNlKTsKKyAgICAgICAgcmVxdWVzdC0+bUlzUmVwcm9jZXNzID0gZmFsc2U7CisgICAgICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gMDsKKyAgICAgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXJQcmV2ID0gMDsKKyAgICAgICAgY2FsbGJhY2tzLT5jbGVhclN0YXR1cygpOworICAgICAgICBpbnQgcmVxdWVzdElkID0gZGV2aWNlLT5zdWJtaXRSZXF1ZXN0KHJlcXVlc3QsIC8qc3RyZWFtaW5nKi90cnVlLCAvKm91dCovJmxhc3RGcmFtZU51bWJlcik7CisgICAgICAgIEVYUEVDVF9UUlVFKGNhbGxiYWNrcy0+d2FpdEZvclN0YXR1cyhUZXN0Q2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpTRU5UX1JFU1VMVCkpOworICAgICAgICBFWFBFQ1RfTEUoMCwgcmVxdWVzdElkKTsKKworICAgICAgICAvLyBDYW4gd2Ugc3RvcCByZXF1ZXN0cz8KKyAgICAgICAgRVhQRUNUX0VRKE9LLCBkZXZpY2UtPmNhbmNlbFJlcXVlc3QocmVxdWVzdElkLCAvKm91dCovJmxhc3RGcmFtZU51bWJlcikpOworICAgICAgICBFWFBFQ1RfVFJVRShjYWxsYmFja3MtPndhaXRGb3JJZGxlKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoY2FsbGJhY2tzLT5oYWRFcnJvcigpKTsKKworICAgICAgICAvLyBDYW4gd2UgZG8gaXQgYWdhaW4/CisgICAgICAgIGxhc3RGcmFtZU51bWJlclByZXYgPSBsYXN0RnJhbWVOdW1iZXI7CisgICAgICAgIGxhc3RGcmFtZU51bWJlciA9IDA7CisgICAgICAgIHJlcXVlc3RUZW1wbGF0ZS5jbGVhcigpOworICAgICAgICBFWFBFQ1RfRVEoT0ssIGRldmljZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoLypwcmV2aWV3IHRlbXBsYXRlKi8xLAorICAgICAgICAgICAgICAgIC8qb3V0Ki8mcmVxdWVzdFRlbXBsYXRlKSk7CisgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0MihuZXcgQ2FwdHVyZVJlcXVlc3QoKSk7CisgICAgICAgIHJlcXVlc3QyLT5tTWV0YWRhdGEgPSByZXF1ZXN0VGVtcGxhdGU7CisgICAgICAgIHJlcXVlc3QyLT5tU3VyZmFjZUxpc3QuYWRkKHN1cmZhY2UpOworICAgICAgICByZXF1ZXN0Mi0+bUlzUmVwcm9jZXNzID0gZmFsc2U7CisgICAgICAgIGNhbGxiYWNrcy0+Y2xlYXJTdGF0dXMoKTsKKyAgICAgICAgaW50IHJlcXVlc3RJZDIgPSBkZXZpY2UtPnN1Ym1pdFJlcXVlc3QocmVxdWVzdDIsIC8qc3RyZWFtaW5nKi90cnVlLAorICAgICAgICAgICAgICAgIC8qb3V0Ki8mbGFzdEZyYW1lTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKC0xLCBsYXN0RnJhbWVOdW1iZXIpOworICAgICAgICBsYXN0RnJhbWVOdW1iZXIgPSAwOworICAgICAgICBFWFBFQ1RfVFJVRShjYWxsYmFja3MtPndhaXRGb3JTdGF0dXMoVGVzdENhbWVyYURldmljZUNhbGxiYWNrczo6U0VOVF9SRVNVTFQpKTsKKyAgICAgICAgRVhQRUNUX0xFKDAsIHJlcXVlc3RJZDIpOworICAgICAgICBFWFBFQ1RfRVEoT0ssIGRldmljZS0+Y2FuY2VsUmVxdWVzdChyZXF1ZXN0SWQyLCAvKm91dCovJmxhc3RGcmFtZU51bWJlcikpOworICAgICAgICBFWFBFQ1RfVFJVRShjYWxsYmFja3MtPndhaXRGb3JJZGxlKCkpOworICAgICAgICBFWFBFQ1RfTEUobGFzdEZyYW1lTnVtYmVyUHJldiwgbGFzdEZyYW1lTnVtYmVyKTsKKyAgICAgICAgc2xlZXAoLypzZWNvbmQqLzEpOyAvLyBhbGxvdyBzb21lIHRpbWUgZm9yIGVycm9ycyB0byBzaG93IHVwLCBpZiBhbnkKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGNhbGxiYWNrcy0+aGFkRXJyb3IoKSk7CisKKyAgICAgICAgLy8gQ2FuIHdlIGRvIGl0IHdpdGggYSByZXF1ZXN0IGxpc3Q/CisgICAgICAgIGxhc3RGcmFtZU51bWJlclByZXYgPSBsYXN0RnJhbWVOdW1iZXI7CisgICAgICAgIGxhc3RGcmFtZU51bWJlciA9IDA7CisgICAgICAgIHJlcXVlc3RUZW1wbGF0ZS5jbGVhcigpOworICAgICAgICBDYW1lcmFNZXRhZGF0YSByZXF1ZXN0VGVtcGxhdGUyOworICAgICAgICBFWFBFQ1RfRVEoT0ssIGRldmljZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoLypwcmV2aWV3IHRlbXBsYXRlKi8xLAorICAgICAgICAgICAgICAgIC8qb3V0Ki8mcmVxdWVzdFRlbXBsYXRlKSk7CisgICAgICAgIEVYUEVDVF9FUShPSywgZGV2aWNlLT5jcmVhdGVEZWZhdWx0UmVxdWVzdCgvKnByZXZpZXcgdGVtcGxhdGUqLzEsCisgICAgICAgICAgICAgICAgLypvdXQqLyZyZXF1ZXN0VGVtcGxhdGUyKSk7CisgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0MyhuZXcgQ2FwdHVyZVJlcXVlc3QoKSk7CisgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0NChuZXcgQ2FwdHVyZVJlcXVlc3QoKSk7CisgICAgICAgIHJlcXVlc3QzLT5tTWV0YWRhdGEgPSByZXF1ZXN0VGVtcGxhdGU7CisgICAgICAgIHJlcXVlc3QzLT5tU3VyZmFjZUxpc3QuYWRkKHN1cmZhY2UpOworICAgICAgICByZXF1ZXN0My0+bUlzUmVwcm9jZXNzID0gZmFsc2U7CisgICAgICAgIHJlcXVlc3Q0LT5tTWV0YWRhdGEgPSByZXF1ZXN0VGVtcGxhdGUyOworICAgICAgICByZXF1ZXN0NC0+bVN1cmZhY2VMaXN0LmFkZChzdXJmYWNlKTsKKyAgICAgICAgcmVxdWVzdDQtPm1Jc1JlcHJvY2VzcyA9IGZhbHNlOworICAgICAgICBMaXN0PHNwPENhcHR1cmVSZXF1ZXN0Pj4gcmVxdWVzdExpc3Q7CisgICAgICAgIHJlcXVlc3RMaXN0LnB1c2hfYmFjayhyZXF1ZXN0Myk7CisgICAgICAgIHJlcXVlc3RMaXN0LnB1c2hfYmFjayhyZXF1ZXN0NCk7CisKKyAgICAgICAgY2FsbGJhY2tzLT5jbGVhclN0YXR1cygpOworICAgICAgICBpbnQgcmVxdWVzdElkMyA9IGRldmljZS0+c3VibWl0UmVxdWVzdExpc3QocmVxdWVzdExpc3QsIC8qc3RyZWFtaW5nKi9mYWxzZSwKKyAgICAgICAgICAgICAgICAvKm91dCovJmxhc3RGcmFtZU51bWJlcik7CisgICAgICAgIEVYUEVDVF9UUlVFKGNhbGxiYWNrcy0+d2FpdEZvclN0YXR1cyhUZXN0Q2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpTRU5UX1JFU1VMVCkpOworICAgICAgICBFWFBFQ1RfVFJVRShjYWxsYmFja3MtPndhaXRGb3JJZGxlKCkpOworICAgICAgICBFWFBFQ1RfTEUobGFzdEZyYW1lTnVtYmVyUHJldiwgbGFzdEZyYW1lTnVtYmVyKTsKKyAgICAgICAgc2xlZXAoLypzZWNvbmQqLzEpOyAvLyBhbGxvdyBzb21lIHRpbWUgZm9yIGVycm9ycyB0byBzaG93IHVwLCBpZiBhbnkKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGNhbGxiYWNrcy0+aGFkRXJyb3IoKSk7CisKKyAgICAgICAgLy8gQ2FuIHdlIHVuY29uZmlndXJlPworICAgICAgICBFWFBFQ1RfRVEoT0ssIGRldmljZS0+YmVnaW5Db25maWd1cmUoKSk7CisgICAgICAgIEVYUEVDVF9FUShPSywgZGV2aWNlLT5kZWxldGVTdHJlYW0oc3RyZWFtSWQpKTsKKyAgICAgICAgRVhQRUNUX0VRKE9LLCBkZXZpY2UtPmVuZENvbmZpZ3VyZSgpKTsKKyAgICAgICAgc2xlZXAoLypzZWNvbmQqLzEpOyAvLyBhbGxvdyBzb21lIHRpbWUgZm9yIGVycm9ycyB0byBzaG93IHVwLCBpZiBhbnkKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGNhbGxiYWNrcy0+aGFkRXJyb3IoKSk7CisKKyAgICAgICAgY2xvc2VEZXZpY2UocCk7CisgICAgfQorCit9OwpkaWZmIC0tZ2l0IGEvY2FtZXJhL3Rlc3RzL1Byb0NhbWVyYVRlc3RzLmNwcCBiL2NhbWVyYS90ZXN0cy9Qcm9DYW1lcmFUZXN0cy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNTg2N2EuLjAwMDAwMDAKLS0tIGEvY2FtZXJhL3Rlc3RzL1Byb0NhbWVyYVRlc3RzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+Ci0KLSNpbmNsdWRlICJDYW1lcmEuaCIKLSNpbmNsdWRlICJQcm9DYW1lcmEuaCIKLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgotI2luY2x1ZGUgPHV0aWxzL0NvbmRpdGlvbi5oPgotCi0jaW5jbHVkZSA8Z3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0KLSNpbmNsdWRlIDxzeXN0ZW0vY2FtZXJhX21ldGFkYXRhLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhMi5oPiAvLyBmb3IgQ0FNRVJBMl9URU1QTEFURV9QUkVWSUVXIG9ubHkKLSNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KLQotI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhU2VydmljZUxpc3RlbmVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBjYW1lcmEyIHsKLW5hbWVzcGFjZSB0ZXN0cyB7Ci1uYW1lc3BhY2UgY2xpZW50IHsKLQotI2RlZmluZSBDQU1FUkFfSUQgMAotI2RlZmluZSBURVNUX0RFQlVHR0lORyAwCi0KLSNkZWZpbmUgVEVTVF9MSVNURU5FUl9USU1FT1VUIDEwMDAwMDAwMDAgLy8gMSBzZWNvbmQgbGlzdGVuZXIgdGltZW91dAotI2RlZmluZSBURVNUX0ZPUk1BVCBIQUxfUElYRUxfRk9STUFUX1kxNiAvL1RPRE86IFlVWTIgaW5zdGVhZAotCi0jZGVmaW5lIFRFU1RfRk9STUFUX01BSU4gSEFMX1BJWEVMX0ZPUk1BVF9ZOAotI2RlZmluZSBURVNUX0ZPUk1BVF9ERVBUSCBIQUxfUElYRUxfRk9STUFUX1kxNgotCi0vLyBkZWZhdWx0cyBmb3IgZGlzcGxheSAidGVzdCIKLSNkZWZpbmUgVEVTVF9ESVNQTEFZX0ZPUk1BVCBIQUxfUElYRUxfRk9STUFUX1k4Ci0jZGVmaW5lIFRFU1RfRElTUExBWV9XSURUSCAzMjAKLSNkZWZpbmUgVEVTVF9ESVNQTEFZX0hFSUdIVCAyNDAKLQotI2RlZmluZSBURVNUX0NQVV9GUkFNRV9DT1VOVCAyCi0jZGVmaW5lIFRFU1RfQ1BVX0hFQVBfQ09VTlQgNQotCi0jZGVmaW5lIFRFU1RfRlJBTUVfUFJPQ0VTU0lOR19ERUxBWV9VUyAyMDAwMDAgLy8gMjAwIG1zCi0KLSNpZiBURVNUX0RFQlVHR0lORwotI2RlZmluZSBkb3V0IHN0ZDo6Y2VycgotI2Vsc2UKLSNkZWZpbmUgZG91dCBpZiAoMCkgc3RkOjpjZXJyCi0jZW5kaWYKLQotI2RlZmluZSBFWFBFQ1RfT0soeCkgRVhQRUNUX0VRKE9LLCAoeCkpCi0jZGVmaW5lIEFTU0VSVF9PSyh4KSBBU1NFUlRfRVEoT0ssICh4KSkKLQotY2xhc3MgUHJvQ2FtZXJhVGVzdDsKLQotc3RydWN0IFNlcnZpY2VMaXN0ZW5lciA6IHB1YmxpYyBCbkNhbWVyYVNlcnZpY2VMaXN0ZW5lciB7Ci0KLSAgICBTZXJ2aWNlTGlzdGVuZXIoKSA6Ci0gICAgICAgIG1MYXRlc3RTdGF0dXMoU1RBVFVTX1VOS05PV04pLAotICAgICAgICBtUHJldlN0YXR1cyhTVEFUVVNfVU5LTk9XTikKLSAgICB7Ci0gICAgfQotCi0gICAgdm9pZCBvblN0YXR1c0NoYW5nZWQoU3RhdHVzIHN0YXR1cywgaW50MzJfdCBjYW1lcmFJZCkgewotICAgICAgICBkb3V0IDw8ICJPbiBzdGF0dXMgY2hhbmdlZDogMHgiIDw8IHN0ZDo6aGV4Ci0gICAgICAgICAgICAgPDwgKHVuc2lnbmVkIGludCkgc3RhdHVzIDw8ICIgY2FtZXJhSWQgIiA8PCBjYW1lcmFJZAotICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKLQotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobU11dGV4KTsKLQotICAgICAgICBtTGF0ZXN0U3RhdHVzID0gc3RhdHVzOwotICAgICAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwotICAgIH0KLQotICAgIHN0YXR1c190IHdhaXRGb3JTdGF0dXNDaGFuZ2UoU3RhdHVzJiBuZXdTdGF0dXMpIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1NdXRleCk7Ci0KLSAgICAgICAgaWYgKG1MYXRlc3RTdGF0dXMgIT0gbVByZXZTdGF0dXMpIHsKLSAgICAgICAgICAgIG5ld1N0YXR1cyA9IG1MYXRlc3RTdGF0dXM7Ci0gICAgICAgICAgICBtUHJldlN0YXR1cyA9IG1MYXRlc3RTdGF0dXM7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0dXNfdCBzdGF0ID0gbUNvbmRpdGlvbi53YWl0UmVsYXRpdmUobU11dGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX0xJU1RFTkVSX1RJTUVPVVQpOwotCi0gICAgICAgIGlmIChzdGF0ID09IE9LKSB7Ci0gICAgICAgICAgICBuZXdTdGF0dXMgPSBtTGF0ZXN0U3RhdHVzOwotICAgICAgICAgICAgbVByZXZTdGF0dXMgPSBtTGF0ZXN0U3RhdHVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXQ7Ci0gICAgfQotCi0gICAgQ29uZGl0aW9uIG1Db25kaXRpb247Ci0gICAgTXV0ZXggbU11dGV4OwotCi0gICAgU3RhdHVzIG1MYXRlc3RTdGF0dXM7Ci0gICAgU3RhdHVzIG1QcmV2U3RhdHVzOwotfTsKLQotZW51bSBQcm9FdmVudCB7Ci0gICAgVU5LTk9XTiwKLSAgICBBQ1FVSVJFRCwKLSAgICBSRUxFQVNFRCwKLSAgICBTVE9MRU4sCi0gICAgRlJBTUVfUkVDRUlWRUQsCi0gICAgUkVTVUxUX1JFQ0VJVkVELAotfTsKLQotaW5saW5lIGludCBQcm9FdmVudF9NYXNrKFByb0V2ZW50IGUpIHsKLSAgICByZXR1cm4gKDEgPDwgc3RhdGljX2Nhc3Q8aW50PihlKSk7Ci19Ci0KLXR5cGVkZWYgVmVjdG9yPFByb0V2ZW50PiBFdmVudExpc3Q7Ci0KLWNsYXNzIFByb0NhbWVyYVRlc3RUaHJlYWQgOiBwdWJsaWMgVGhyZWFkCi17Ci1wdWJsaWM6Ci0gICAgUHJvQ2FtZXJhVGVzdFRocmVhZCgpIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpIHsKLSAgICAgICAgbVByb2MgPSBQcm9jZXNzU3RhdGU6OnNlbGYoKTsKLSAgICAgICAgbVByb2MtPnN0YXJ0VGhyZWFkUG9vbCgpOwotCi0gICAgICAgIElQQ1RocmVhZFN0YXRlICpwdHIgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOwotCi0gICAgICAgIHB0ci0+am9pblRocmVhZFBvb2woKTsKLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc3A8UHJvY2Vzc1N0YXRlPiBtUHJvYzsKLX07Ci0KLWNsYXNzIFByb0NhbWVyYVRlc3RMaXN0ZW5lciA6IHB1YmxpYyBQcm9DYW1lcmFMaXN0ZW5lciB7Ci0KLXB1YmxpYzoKLSAgICBzdGF0aWMgY29uc3QgaW50IEVWRU5UX01BU0tfQUxMID0gMHhGRkZGRkZGRjsKLQotICAgIFByb0NhbWVyYVRlc3RMaXN0ZW5lcigpIHsKLSAgICAgICAgbUV2ZW50TWFzayA9IEVWRU5UX01BU0tfQUxMOwotICAgICAgICBtRHJvcEZyYW1lcyA9IGZhbHNlOwotICAgIH0KLQotICAgIHN0YXR1c190IFdhaXRGb3JFdmVudCgpIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGNhbChtQ29uZGl0aW9uTXV0ZXgpOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtTGlzdGVuZXJNdXRleCk7Ci0KLSAgICAgICAgICAgIGlmIChtUHJvRXZlbnRMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbUxpc3RlbmVyQ29uZGl0aW9uLndhaXRSZWxhdGl2ZShtQ29uZGl0aW9uTXV0ZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfTElTVEVORVJfVElNRU9VVCk7Ci0gICAgfQotCi0gICAgLyogUmVhZCBldmVudHMgaW50byBvdXQuIEV4aXN0aW5nIHF1ZXVlIGlzIGZsdXNoZWQgKi8KLSAgICB2b2lkIFJlYWRFdmVudHMoRXZlbnRMaXN0JiBvdXQpIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1MaXN0ZW5lck11dGV4KTsKLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Qcm9FdmVudExpc3Quc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIG91dC5wdXNoKG1Qcm9FdmVudExpc3RbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgbVByb0V2ZW50TGlzdC5jbGVhcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAgKiBEZXF1ZXVlIDEgZXZlbnQgZnJvbSB0aGUgZXZlbnQgcXVldWUuCi0gICAgICAqIFJldHVybnMgVU5LTk9XTiBpZiBxdWV1ZSBpcyBlbXB0eQotICAgICAgKi8KLSAgICBQcm9FdmVudCBSZWFkRXZlbnQoKSB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtTGlzdGVuZXJNdXRleCk7Ci0KLSAgICAgICAgaWYgKG1Qcm9FdmVudExpc3Quc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOOwotICAgICAgICB9Ci0KLSAgICAgICAgUHJvRXZlbnQgZXYgPSBtUHJvRXZlbnRMaXN0WzBdOwotICAgICAgICBtUHJvRXZlbnRMaXN0LnJlbW92ZUF0KDApOwotCi0gICAgICAgIHJldHVybiBldjsKLSAgICB9Ci0KLSAgICB2b2lkIFNldEV2ZW50TWFzayhpbnQgZXZlbnRNYXNrKSB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtTGlzdGVuZXJNdXRleCk7Ci0gICAgICAgIG1FdmVudE1hc2sgPSBldmVudE1hc2s7Ci0gICAgfQotCi0gICAgLy8gQXV0b21hdGljYWxseSBhY3F1aXJlL3JlbGVhc2UgZnJhbWVzIGFzIHRoZXkgYXJlIGF2YWlsYWJsZQotICAgIHZvaWQgU2V0RHJvcEZyYW1lcyhib29sIGRyb3BGcmFtZXMpIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1MaXN0ZW5lck11dGV4KTsKLSAgICAgICAgbURyb3BGcmFtZXMgPSBkcm9wRnJhbWVzOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICB2b2lkIFF1ZXVlRXZlbnQoUHJvRXZlbnQgZXYpIHsKLSAgICAgICAgYm9vbCBldmVudEFkZGVkID0gZmFsc2U7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtTGlzdGVuZXJNdXRleCk7Ci0KLSAgICAgICAgICAgIC8vIERyb3AgZXZlbnRzIG5vdCBwYXJ0IG9mIG1hc2sKLSAgICAgICAgICAgIGlmIChQcm9FdmVudF9NYXNrKGV2KSAmIG1FdmVudE1hc2spIHsKLSAgICAgICAgICAgICAgICBtUHJvRXZlbnRMaXN0LnB1c2goZXYpOwotICAgICAgICAgICAgICAgIGV2ZW50QWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV2ZW50QWRkZWQpIHsKLSAgICAgICAgICAgIG1MaXN0ZW5lckNvbmRpdGlvbi5icm9hZGNhc3QoKTsKLSAgICAgICAgfQotICAgIH0KLQotcHJvdGVjdGVkOgotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLy8vLy8vLy8gUHJvQ2FtZXJhTGlzdGVuZXIgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQotICAgIC8vIExvY2sgaGFzIGJlZW4gYWNxdWlyZWQuIFdyaXRlIG9wZXJhdGlvbnMgbm93IGF2YWlsYWJsZS4KLSAgICB2aXJ0dWFsIHZvaWQgb25Mb2NrQWNxdWlyZWQoKSB7Ci0gICAgICAgIFF1ZXVlRXZlbnQoQUNRVUlSRUQpOwotICAgIH0KLSAgICAvLyBMb2NrIGhhcyBiZWVuIHJlbGVhc2VkIHdpdGggZXhjbHVzaXZlVW5sb2NrCi0gICAgdmlydHVhbCB2b2lkIG9uTG9ja1JlbGVhc2VkKCkgewotICAgICAgICBRdWV1ZUV2ZW50KFJFTEVBU0VEKTsKLSAgICB9Ci0KLSAgICAvLyBMb2NrIGhhcyBiZWVuIHN0b2xlbiBieSBhbm90aGVyIGNsaWVudC4KLSAgICB2aXJ0dWFsIHZvaWQgb25Mb2NrU3RvbGVuKCkgewotICAgICAgICBRdWV1ZUV2ZW50KFNUT0xFTik7Ci0gICAgfQotCi0gICAgLy8gTG9jayBmcmVlLgotICAgIHZpcnR1YWwgdm9pZCBvblRyaWdnZXJOb3RpZnkoaW50MzJfdCBleHQxLCBpbnQzMl90IGV4dDIsIGludDMyX3QgZXh0MykgewotCi0gICAgICAgIGRvdXQgPDwgIlRyaWdnZXIgbm90aWZ5OiAiIDw8IGV4dDEgPDwgIiAiIDw8IGV4dDIKLSAgICAgICAgICAgICA8PCAiICIgPDwgZXh0MyA8PCBzdGQ6OmVuZGw7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoaW50IHN0cmVhbUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENwdUNvbnN1bWVyPiYgY29uc3VtZXIpIHsKLQotICAgICAgICBRdWV1ZUV2ZW50KEZSQU1FX1JFQ0VJVkVEKTsKLQotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUxpc3RlbmVyTXV0ZXgpOwotICAgICAgICBpZiAobURyb3BGcmFtZXMpIHsKLSAgICAgICAgICAgIENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIgYnVmOwotICAgICAgICAgICAgc3RhdHVzX3QgcmV0OwotCi0gICAgICAgICAgICBpZiAoT0sgPT0gKHJldCA9IGNvbnN1bWVyLT5sb2NrTmV4dEJ1ZmZlcigmYnVmKSkpIHsKLQotICAgICAgICAgICAgICAgIGRvdXQgPDwgIkZyYW1lIHJlY2VpdmVkIG9uIHN0cmVhbUlkID0gIiA8PCBzdHJlYW1JZCA8PAotICAgICAgICAgICAgICAgICAgICAgICAgIiwgZGF0YVB0ciA9ICIgPDwgKHZvaWQqKWJ1Zi5kYXRhIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAiLCB0aW1lc3RhbXAgPSAiIDw8IGJ1Zi50aW1lc3RhbXAgPDwgc3RkOjplbmRsOwotCi0gICAgICAgICAgICAgICAgRVhQRUNUX09LKGNvbnN1bWVyLT51bmxvY2tCdWZmZXIoYnVmKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkb3V0IDw8ICJGcmFtZSByZWNlaXZlZCBvbiBzdHJlYW1JZCA9ICIgPDwgc3RyZWFtSWQgPDwgc3RkOjplbmRsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIG9uUmVzdWx0UmVjZWl2ZWQoaW50MzJfdCByZXF1ZXN0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhKiByZXF1ZXN0KSB7Ci0gICAgICAgIGRvdXQgPDwgIlJlc3VsdCByZWNlaXZlZCByZXF1ZXN0SWQgPSAiIDw8IHJlcXVlc3RJZAotICAgICAgICAgICAgIDw8ICIsIHJlcXVlc3RQdHIgPSAiIDw8ICh2b2lkKilyZXF1ZXN0IDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgUXVldWVFdmVudChSRVNVTFRfUkVDRUlWRUQpOwotICAgICAgICBmcmVlX2NhbWVyYV9tZXRhZGF0YShyZXF1ZXN0KTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludDMyX3QgbXNnLCBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0MikgewotICAgICAgICBkb3V0IDw8ICJOb3RpZnkgcmVjZWl2ZWQ6IG1zZyAiIDw8IHN0ZDo6aGV4IDw8IG1zZwotICAgICAgICAgICAgIDw8ICIsIGV4dDE6ICIgPDwgc3RkOjpoZXggPDwgZXh0MSA8PCAiLCBleHQyOiAiIDw8IHN0ZDo6aGV4IDw8IGV4dDIKLSAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7Ci0gICAgfQotCi0gICAgVmVjdG9yPFByb0V2ZW50PiBtUHJvRXZlbnRMaXN0OwotICAgIE11dGV4ICAgICAgICAgICAgIG1MaXN0ZW5lck11dGV4OwotICAgIE11dGV4ICAgICAgICAgICAgIG1Db25kaXRpb25NdXRleDsKLSAgICBDb25kaXRpb24gICAgICAgICBtTGlzdGVuZXJDb25kaXRpb247Ci0gICAgaW50ICAgICAgICAgICAgICAgbUV2ZW50TWFzazsKLSAgICBib29sICAgICAgICAgICAgICBtRHJvcEZyYW1lczsKLX07Ci0KLWNsYXNzIFByb0NhbWVyYVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLQotcHVibGljOgotICAgIFByb0NhbWVyYVRlc3QoKSB7Ci0gICAgICAgIGNoYXIqIGRpc3BsYXlTZWNzRW52ID0gZ2V0ZW52KCJURVNUX0RJU1BMQVlfU0VDUyIpOwotICAgICAgICBpZiAoZGlzcGxheVNlY3NFbnYgIT0gTlVMTCkgewotICAgICAgICAgICAgbURpc3BsYXlTZWNzID0gYXRvaShkaXNwbGF5U2Vjc0Vudik7Ci0gICAgICAgICAgICBpZiAobURpc3BsYXlTZWNzIDwgMCkgewotICAgICAgICAgICAgICAgIG1EaXNwbGF5U2VjcyA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRGlzcGxheVNlY3MgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgY2hhciogZGlzcGxheUZtdEVudiA9IGdldGVudigiVEVTVF9ESVNQTEFZX0ZPUk1BVCIpOwotICAgICAgICBpZiAoZGlzcGxheUZtdEVudiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtRGlzcGxheUZtdCA9IEZvcm1hdEZyb21TdHJpbmcoZGlzcGxheUZtdEVudik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRGlzcGxheUZtdCA9IFRFU1RfRElTUExBWV9GT1JNQVQ7Ci0gICAgICAgIH0KLQotICAgICAgICBjaGFyKiBkaXNwbGF5V2lkdGhFbnYgPSBnZXRlbnYoIlRFU1RfRElTUExBWV9XSURUSCIpOwotICAgICAgICBpZiAoZGlzcGxheVdpZHRoRW52ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1EaXNwbGF5VyA9IGF0b2koZGlzcGxheVdpZHRoRW52KTsKLSAgICAgICAgICAgIGlmIChtRGlzcGxheVcgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbURpc3BsYXlXID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1EaXNwbGF5VyA9IFRFU1RfRElTUExBWV9XSURUSDsKLSAgICAgICAgfQotCi0gICAgICAgIGNoYXIqIGRpc3BsYXlIZWlnaHRFbnYgPSBnZXRlbnYoIlRFU1RfRElTUExBWV9IRUlHSFQiKTsKLSAgICAgICAgaWYgKGRpc3BsYXlIZWlnaHRFbnYgIT0gTlVMTCkgewotICAgICAgICAgICAgbURpc3BsYXlIID0gYXRvaShkaXNwbGF5SGVpZ2h0RW52KTsKLSAgICAgICAgICAgIGlmIChtRGlzcGxheUggPCAwKSB7Ci0gICAgICAgICAgICAgICAgbURpc3BsYXlIID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1EaXNwbGF5SCA9IFRFU1RfRElTUExBWV9IRUlHSFQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBTZXRVcFRlc3RDYXNlKCkgewotICAgICAgICAvLyBCaW5kZXIgVGhyZWFkIFBvb2wgSW5pdGlhbGl6YXRpb24KLSAgICAgICAgbVRlc3RUaHJlYWQgPSBuZXcgUHJvQ2FtZXJhVGVzdFRocmVhZCgpOwotICAgICAgICBtVGVzdFRocmVhZC0+cnVuKCJQcm9DYW1lcmFUZXN0VGhyZWFkIik7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgICAgICBtQ2FtZXJhID0gUHJvQ2FtZXJhOjpjb25uZWN0KENBTUVSQV9JRCk7Ci0gICAgICAgIEFTU0VSVF9ORSgodm9pZCopTlVMTCwgbUNhbWVyYS5nZXQoKSk7Ci0KLSAgICAgICAgbUxpc3RlbmVyID0gbmV3IFByb0NhbWVyYVRlc3RMaXN0ZW5lcigpOwotICAgICAgICBtQ2FtZXJhLT5zZXRMaXN0ZW5lcihtTGlzdGVuZXIpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICAgICAgQVNTRVJUX05FKCh2b2lkKilOVUxMLCBtQ2FtZXJhLmdldCgpKTsKLSAgICAgICAgbUNhbWVyYS0+ZGlzY29ubmVjdCgpOwotICAgIH0KLQotcHJvdGVjdGVkOgotICAgIHNwPFByb0NhbWVyYT4gbUNhbWVyYTsKLSAgICBzcDxQcm9DYW1lcmFUZXN0TGlzdGVuZXI+IG1MaXN0ZW5lcjsKLQotICAgIHN0YXRpYyBzcDxUaHJlYWQ+IG1UZXN0VGhyZWFkOwotCi0gICAgaW50IG1EaXNwbGF5U2VjczsKLSAgICBpbnQgbURpc3BsYXlGbXQ7Ci0gICAgaW50IG1EaXNwbGF5VzsKLSAgICBpbnQgbURpc3BsYXlIOwotCi0gICAgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBtQ29tcG9zZXJDbGllbnQ7Ci0gICAgc3A8U3VyZmFjZUNvbnRyb2w+IG1TdXJmYWNlQ29udHJvbDsKLQotICAgIHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4gbURlcHRoQ29tcG9zZXJDbGllbnQ7Ci0gICAgc3A8U3VyZmFjZUNvbnRyb2w+IG1EZXB0aFN1cmZhY2VDb250cm9sOwotCi0gICAgaW50IGdldFN1cmZhY2VXaWR0aCgpIHsKLSAgICAgICAgcmV0dXJuIDUxMjsKLSAgICB9Ci0gICAgaW50IGdldFN1cmZhY2VIZWlnaHQoKSB7Ci0gICAgICAgIHJldHVybiA1MTI7Ci0gICAgfQotCi0gICAgdm9pZCBjcmVhdGVPblNjcmVlblN1cmZhY2Uoc3A8U3VyZmFjZT4mIHN1cmZhY2UpIHsKLSAgICAgICAgbUNvbXBvc2VyQ2xpZW50ID0gbmV3IFN1cmZhY2VDb21wb3NlckNsaWVudDsKLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQ29tcG9zZXJDbGllbnQtPmluaXRDaGVjaygpKTsKLQotICAgICAgICBtU3VyZmFjZUNvbnRyb2wgPSBtQ29tcG9zZXJDbGllbnQtPmNyZWF0ZVN1cmZhY2UoCi0gICAgICAgICAgICAgICAgU3RyaW5nOCgiUHJvQ2FtZXJhVGVzdCBTdHJlYW1pbmdJbWFnZSBTdXJmYWNlIiksCi0gICAgICAgICAgICAgICAgZ2V0U3VyZmFjZVdpZHRoKCksIGdldFN1cmZhY2VIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICBQSVhFTF9GT1JNQVRfUkdCXzg4OCwgMCk7Ci0KLSAgICAgICAgbVN1cmZhY2VDb250cm9sLT5zZXRQb3NpdGlvbigwLCAwKTsKLQotICAgICAgICBBU1NFUlRfVFJVRShtU3VyZmFjZUNvbnRyb2wgIT0gTlVMTCk7Ci0gICAgICAgIEFTU0VSVF9UUlVFKG1TdXJmYWNlQ29udHJvbC0+aXNWYWxpZCgpKTsKLQotICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6Om9wZW5HbG9iYWxUcmFuc2FjdGlvbigpOwotICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1TdXJmYWNlQ29udHJvbC0+c2V0TGF5ZXIoMHg3RkZGRkZGRikpOwotICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1TdXJmYWNlQ29udHJvbC0+c2hvdygpKTsKLSAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpjbG9zZUdsb2JhbFRyYW5zYWN0aW9uKCk7Ci0KLSAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gd2luZG93ID0gbVN1cmZhY2VDb250cm9sLT5nZXRTdXJmYWNlKCk7Ci0gICAgICAgIHN1cmZhY2UgPSBtU3VyZmFjZUNvbnRyb2wtPmdldFN1cmZhY2UoKTsKLQotICAgICAgICBBU1NFUlRfTkUoKHZvaWQqKU5VTEwsIHN1cmZhY2UuZ2V0KCkpOwotICAgIH0KLQotICAgIHZvaWQgY3JlYXRlRGVwdGhPblNjcmVlblN1cmZhY2Uoc3A8U3VyZmFjZT4mIHN1cmZhY2UpIHsKLSAgICAgICAgbURlcHRoQ29tcG9zZXJDbGllbnQgPSBuZXcgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OwotICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1EZXB0aENvbXBvc2VyQ2xpZW50LT5pbml0Q2hlY2soKSk7Ci0KLSAgICAgICAgbURlcHRoU3VyZmFjZUNvbnRyb2wgPSBtRGVwdGhDb21wb3NlckNsaWVudC0+Y3JlYXRlU3VyZmFjZSgKLSAgICAgICAgICAgICAgICBTdHJpbmc4KCJQcm9DYW1lcmFUZXN0IFN0cmVhbWluZ0ltYWdlIFN1cmZhY2UiKSwKLSAgICAgICAgICAgICAgICBnZXRTdXJmYWNlV2lkdGgoKSwgZ2V0U3VyZmFjZUhlaWdodCgpLAotICAgICAgICAgICAgICAgIFBJWEVMX0ZPUk1BVF9SR0JfODg4LCAwKTsKLQotICAgICAgICBtRGVwdGhTdXJmYWNlQ29udHJvbC0+c2V0UG9zaXRpb24oNjQwLCAwKTsKLQotICAgICAgICBBU1NFUlRfVFJVRShtRGVwdGhTdXJmYWNlQ29udHJvbCAhPSBOVUxMKTsKLSAgICAgICAgQVNTRVJUX1RSVUUobURlcHRoU3VyZmFjZUNvbnRyb2wtPmlzVmFsaWQoKSk7Ci0KLSAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpvcGVuR2xvYmFsVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtRGVwdGhTdXJmYWNlQ29udHJvbC0+c2V0TGF5ZXIoMHg3RkZGRkZGRikpOwotICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1EZXB0aFN1cmZhY2VDb250cm9sLT5zaG93KCkpOwotICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmNsb3NlR2xvYmFsVHJhbnNhY3Rpb24oKTsKLQotICAgICAgICBzcDxBTmF0aXZlV2luZG93PiB3aW5kb3cgPSBtRGVwdGhTdXJmYWNlQ29udHJvbC0+Z2V0U3VyZmFjZSgpOwotICAgICAgICBzdXJmYWNlID0gbURlcHRoU3VyZmFjZUNvbnRyb2wtPmdldFN1cmZhY2UoKTsKLQotICAgICAgICBBU1NFUlRfTkUoKHZvaWQqKU5VTEwsIHN1cmZhY2UuZ2V0KCkpOwotICAgIH0KLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICAgIHN0YXRpYyBib29sIEV4aXN0c0l0ZW0oVCBuZWVkbGUsIFQqIGFycmF5LCBzaXplX3QgY291bnQpIHsKLSAgICAgICAgaWYgKCFhcnJheSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoYXJyYXlbaV0gPT0gbmVlZGxlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotCi0gICAgc3RhdGljIGludCBGb3JtYXRGcm9tU3RyaW5nKGNvbnN0IGNoYXIqIHN0cikgewotICAgICAgICBzdGQ6OnN0cmluZyBzKHN0cik7Ci0KLSNkZWZpbmUgQ01QX1NUUih4LCB5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChzID09ICN4KSByZXR1cm4gSEFMX1BJWEVMX0ZPUk1BVF8gIyMgeTsKLSNkZWZpbmUgQ01QX1NUUl9TQU1FKHgpIENNUF9TVFIoeCwgeCkKLQotICAgICAgICBDTVBfU1RSX1NBTUUoIFkxNik7Ci0gICAgICAgIENNUF9TVFJfU0FNRSggWTgpOwotICAgICAgICBDTVBfU1RSX1NBTUUoIFlWMTIpOwotICAgICAgICBDTVBfU1RSKE5WMTYsIFlDYkNyXzQyMl9TUCk7Ci0gICAgICAgIENNUF9TVFIoTlYyMSwgWUNyQ2JfNDIwX1NQKTsKLSAgICAgICAgQ01QX1NUUihZVVkyLCBZQ2JDcl80MjJfSSk7Ci0gICAgICAgIENNUF9TVFIoUkFXLCAgUkFXX1NFTlNPUik7Ci0gICAgICAgIENNUF9TVFIoUkdCQSwgUkdCQV84ODg4KTsKLQotICAgICAgICBzdGQ6OmNlcnIgPDwgIlVua25vd24gZm9ybWF0IHN0cmluZyAiIDw8IHN0ciA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgIHJldHVybiAtMTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0aW5nIGEgc3RyZWFtaW5nIHJlcXVlc3QgZm9yIHRoZXNlIG91dHB1dCBzdHJlYW1zIGZyb20gYSB0ZW1wbGF0ZSwKLSAgICAgKiAgYW5kIHN1Ym1pdCBpdAotICAgICAqLwotICAgIHZvaWQgY3JlYXRlU3VibWl0UmVxdWVzdEZvclN0cmVhbXMoaW50MzJfdCogc3RyZWFtSWRzLCBzaXplX3QgY291bnQsIGludCByZXF1ZXN0Q291bnQ9LTEpIHsKLQotICAgICAgICBBU1NFUlRfTkUoKHZvaWQqKU5VTEwsIHN0cmVhbUlkcyk7Ci0gICAgICAgIEFTU0VSVF9MVCgwdSwgY291bnQpOwotCi0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV90ICpyZXF1ZXN0VG1wID0gTlVMTDsKLSAgICAgICAgRVhQRUNUX09LKG1DYW1lcmEtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KENBTUVSQTJfVEVNUExBVEVfUFJFVklFVywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8mcmVxdWVzdFRtcCkpOwotICAgICAgICBBU1NFUlRfTkUoKHZvaWQqKU5VTEwsIHJlcXVlc3RUbXApOwotICAgICAgICBDYW1lcmFNZXRhZGF0YSByZXF1ZXN0KHJlcXVlc3RUbXApOwotCi0gICAgICAgIC8vIHNldCB0aGUgb3V0cHV0IHN0cmVhbXMuIGRlZmF1bHQgaXMgZW1wdHkKLQotICAgICAgICB1aW50MzJfdCB0YWcgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oQU5EUk9JRF9SRVFVRVNUX09VVFBVVF9TVFJFQU1TKTsKLSAgICAgICAgcmVxdWVzdC51cGRhdGUodGFnLCBzdHJlYW1JZHMsIGNvdW50KTsKLQotICAgICAgICByZXF1ZXN0VG1wID0gcmVxdWVzdC5yZWxlYXNlKCk7Ci0KLSAgICAgICAgaWYgKHJlcXVlc3RDb3VudCA8IDApIHsKLSAgICAgICAgICAgIEVYUEVDVF9PSyhtQ2FtZXJhLT5zdWJtaXRSZXF1ZXN0KHJlcXVlc3RUbXAsIC8qc3RyZWFtaW5nKi90cnVlKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcXVlc3RDb3VudDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX09LKG1DYW1lcmEtPnN1Ym1pdFJlcXVlc3QocmVxdWVzdFRtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnN0cmVhbWluZyovZmFsc2UpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXF1ZXN0LmFjcXVpcmUocmVxdWVzdFRtcCk7Ci0gICAgfQotfTsKLQotc3A8VGhyZWFkPiBQcm9DYW1lcmFUZXN0OjptVGVzdFRocmVhZDsKLQotVEVTVF9GKFByb0NhbWVyYVRlc3QsIEF2YWlsYWJsZUZvcm1hdHMpIHsKLSAgICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIENhbWVyYU1ldGFkYXRhIHN0YXRpY0luZm8gPSBtQ2FtZXJhLT5nZXRDYW1lcmFJbmZvKENBTUVSQV9JRCk7Ci0gICAgQVNTRVJUX0ZBTFNFKHN0YXRpY0luZm8uaXNFbXB0eSgpKTsKLQotICAgIHVpbnQzMl90IHRhZyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfRk9STUFUUyk7Ci0gICAgRVhQRUNUX1RSVUUoc3RhdGljSW5mby5leGlzdHModGFnKSk7Ci0gICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQodGFnKTsKLQotICAgIEVYUEVDVF9UUlVFKEV4aXN0c0l0ZW08aW50MzJfdD4oSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5kYXRhLmkzMiwgZW50cnkuY291bnQpKTsKLSAgICBFWFBFQ1RfVFJVRShFeGlzdHNJdGVtPGludDMyX3Q+KEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5kYXRhLmkzMiwgZW50cnkuY291bnQpKTsKLX0KLQotLy8gdGVzdCBhcm91bmQgZXhjbHVzaXZlVHJ5TG9jayAoaW1tZWRpYXRlIGxvY2tpbmcpCi1URVNUX0YoUHJvQ2FtZXJhVGVzdCwgTG9ja2luZ0ltbWVkaWF0ZSkgewotCi0gICAgaWYgKEhhc0ZhdGFsRmFpbHVyZSgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtTGlzdGVuZXItPlNldEV2ZW50TWFzayhQcm9FdmVudF9NYXNrKEFDUVVJUkVEKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvRXZlbnRfTWFzayhTVE9MRU4pICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb0V2ZW50X01hc2soUkVMRUFTRUQpKTsKLQotICAgIEVYUEVDVF9GQUxTRShtQ2FtZXJhLT5oYXNFeGNsdXNpdmVMb2NrKCkpOwotICAgIEVYUEVDVF9FUShPSywgbUNhbWVyYS0+ZXhjbHVzaXZlVHJ5TG9jaygpKTsKLSAgICAvLyBhdCB0aGlzIHBvaW50IHdlIGRlZmluaXRlbHkgaGF2ZSB0aGUgbG9jawotCi0gICAgRVhQRUNUX0VRKE9LLCBtTGlzdGVuZXItPldhaXRGb3JFdmVudCgpKTsKLSAgICBFWFBFQ1RfRVEoQUNRVUlSRUQsIG1MaXN0ZW5lci0+UmVhZEV2ZW50KCkpOwotCi0gICAgRVhQRUNUX1RSVUUobUNhbWVyYS0+aGFzRXhjbHVzaXZlTG9jaygpKTsKLSAgICBFWFBFQ1RfRVEoT0ssIG1DYW1lcmEtPmV4Y2x1c2l2ZVVubG9jaygpKTsKLQotICAgIEVYUEVDVF9FUShPSywgbUxpc3RlbmVyLT5XYWl0Rm9yRXZlbnQoKSk7Ci0gICAgRVhQRUNUX0VRKFJFTEVBU0VELCBtTGlzdGVuZXItPlJlYWRFdmVudCgpKTsKLQotICAgIEVYUEVDVF9GQUxTRShtQ2FtZXJhLT5oYXNFeGNsdXNpdmVMb2NrKCkpOwotfQotCi0vLyB0ZXN0IGFyb3VuZCBleGNsdXNpdmVMb2NrIChsb2NraW5nIGF0IHNvbWUgZnV0dXJlIHBvaW50IGluIHRpbWUpCi1URVNUX0YoUHJvQ2FtZXJhVGVzdCwgTG9ja2luZ0FzeW5jaHJvbm91cykgewotCi0gICAgaWYgKEhhc0ZhdGFsRmFpbHVyZSgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLQotICAgIG1MaXN0ZW5lci0+U2V0RXZlbnRNYXNrKFByb0V2ZW50X01hc2soQUNRVUlSRUQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9FdmVudF9NYXNrKFNUT0xFTikgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvRXZlbnRfTWFzayhSRUxFQVNFRCkpOwotCi0gICAgLy8gVE9ETzogQWRkIGFub3RoZXIgcHJvY2FtZXJhIHRoYXQgaGFzIGEgbG9jayBoZXJlLgotICAgIC8vIHRoZW4gd2UgY2FuIGJlIHRlc3QgdGhhdCB0aGUgbG9jayB3b250IGltbWVkaWF0ZWx5IGJlIGFjcXVpcmVkCi0KLSAgICBFWFBFQ1RfRkFMU0UobUNhbWVyYS0+aGFzRXhjbHVzaXZlTG9jaygpKTsKLSAgICBFWFBFQ1RfRVEoT0ssIG1DYW1lcmEtPmV4Y2x1c2l2ZVRyeUxvY2soKSk7Ci0gICAgLy8gYXQgdGhpcyBwb2ludCB3ZSBkZWZpbml0ZWx5IGhhdmUgdGhlIGxvY2sKLQotICAgIEVYUEVDVF9FUShPSywgbUxpc3RlbmVyLT5XYWl0Rm9yRXZlbnQoKSk7Ci0gICAgRVhQRUNUX0VRKEFDUVVJUkVELCBtTGlzdGVuZXItPlJlYWRFdmVudCgpKTsKLQotICAgIEVYUEVDVF9UUlVFKG1DYW1lcmEtPmhhc0V4Y2x1c2l2ZUxvY2soKSk7Ci0gICAgRVhQRUNUX0VRKE9LLCBtQ2FtZXJhLT5leGNsdXNpdmVVbmxvY2soKSk7Ci0KLSAgICBFWFBFQ1RfRVEoT0ssIG1MaXN0ZW5lci0+V2FpdEZvckV2ZW50KCkpOwotICAgIEVYUEVDVF9FUShSRUxFQVNFRCwgbUxpc3RlbmVyLT5SZWFkRXZlbnQoKSk7Ci0KLSAgICBFWFBFQ1RfRkFMU0UobUNhbWVyYS0+aGFzRXhjbHVzaXZlTG9jaygpKTsKLX0KLQotLy8gU3RyZWFtIGRpcmVjdGx5IHRvIHRoZSBzY3JlZW4uCi1URVNUX0YoUHJvQ2FtZXJhVGVzdCwgRElTQUJMRURfU3RyZWFtaW5nSW1hZ2VTaW5nbGUpIHsKLSAgICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNwPFN1cmZhY2U+IHN1cmZhY2U7Ci0gICAgaWYgKG1EaXNwbGF5U2VjcyA+IDApIHsKLSAgICAgICAgY3JlYXRlT25TY3JlZW5TdXJmYWNlKC8qb3V0Ki9zdXJmYWNlKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGRvdXQgPDwgIlNraXBwaW5nLCB3aWxsIG5vdCByZW5kZXIgdG8gc2NyZWVuIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpbnQgZGVwdGhTdHJlYW1JZCA9IC0xOwotCi0gICAgc3A8U2VydmljZUxpc3RlbmVyPiBsaXN0ZW5lciA9IG5ldyBTZXJ2aWNlTGlzdGVuZXIoKTsKLSAgICBFWFBFQ1RfT0soUHJvQ2FtZXJhOjphZGRTZXJ2aWNlTGlzdGVuZXIobGlzdGVuZXIpKTsKLQotICAgIFNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzIGN1cnJlbnRTdGF0dXM7Ci0KLSAgICAvLyB3aGVuIHN1YnNjcmliaW5nIGEgbmV3IGxpc3RlbmVyLAotICAgIC8vIHdlIGltbWVkaWF0ZWx5IGdldCBhIGNhbGxiYWNrIHRvIHRoZSBjdXJyZW50IHN0YXR1cwotICAgIHdoaWxlIChsaXN0ZW5lci0+d2FpdEZvclN0YXR1c0NoYW5nZSgvKm91dCovY3VycmVudFN0YXR1cykgIT0gT0spOwotICAgIEVYUEVDVF9FUShTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19QUkVTRU5ULCBjdXJyZW50U3RhdHVzKTsKLQotICAgIGRvdXQgPDwgIldpbGwgbm93IHN0cmVhbSBhbmQgcmVzdW1lIGluZmluaXRlbHkuLi4iIDw8IHN0ZDo6ZW5kbDsKLSAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICAgIGlmIChjdXJyZW50U3RhdHVzID09IFNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX1BSRVNFTlQpIHsKLQotICAgICAgICAgICAgQVNTRVJUX09LKG1DYW1lcmEtPmNyZWF0ZVN0cmVhbShtRGlzcGxheVcsIG1EaXNwbGF5SCwgbURpc3BsYXlGbXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aFN0cmVhbUlkKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfTkUoLTEsIGRlcHRoU3RyZWFtSWQpOwotCi0gICAgICAgICAgICBFWFBFQ1RfT0sobUNhbWVyYS0+ZXhjbHVzaXZlVHJ5TG9jaygpKTsKLQotICAgICAgICAgICAgaW50MzJfdCBzdHJlYW1zW10gPSB7IGRlcHRoU3RyZWFtSWQgfTsKLSAgICAgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGNyZWF0ZVN1Ym1pdFJlcXVlc3RGb3JTdHJlYW1zKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjb3VudCovMSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgU2VydmljZUxpc3RlbmVyOjpTdGF0dXMgc3RhdCA9IFNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX1VOS05PV047Ci0KLSAgICAgICAgLy8gVE9ETzogbWF5YmUgY2hlY2sgZm9yIGdldGNoIGV2ZXJ5IG9uY2UgaW4gYSB3aGlsZT8KLSAgICAgICAgd2hpbGUgKGxpc3RlbmVyLT53YWl0Rm9yU3RhdHVzQ2hhbmdlKC8qb3V0Ki9zdGF0KSAhPSBPSyk7Ci0KLSAgICAgICAgaWYgKGN1cnJlbnRTdGF0dXMgIT0gc3RhdCkgewotICAgICAgICAgICAgaWYgKHN0YXQgPT0gU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfUFJFU0VOVCkgewotICAgICAgICAgICAgICAgIGRvdXQgPDwgIlJlY29ubmVjdGluZyB0byBjYW1lcmEiIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgICAgICAgICBtQ2FtZXJhID0gUHJvQ2FtZXJhOjpjb25uZWN0KENBTUVSQV9JRCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXQgPT0gU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX0FWQUlMQUJMRSkgewotICAgICAgICAgICAgICAgIGRvdXQgPDwgIkRpc2Nvbm5lY3RpbmcgZnJvbSBjYW1lcmEiIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgICAgICAgICBtQ2FtZXJhLT5kaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXQgPT0gU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX1BSRVNFTlQpIHsKLSAgICAgICAgICAgICAgICBkb3V0IDw8ICJDYW1lcmEgdW5wbHVnZ2VkIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgICAgICAgICAgbUNhbWVyYSA9IE5VTEw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRvdXQgPDwgIlVua25vd24gc3RhdHVzIGNoYW5nZSAiCi0gICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmhleCA8PCBzdGF0IDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3VycmVudFN0YXR1cyA9IHN0YXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBFWFBFQ1RfT0soUHJvQ2FtZXJhOjpyZW1vdmVTZXJ2aWNlTGlzdGVuZXIobGlzdGVuZXIpKTsKLSAgICBFWFBFQ1RfT0sobUNhbWVyYS0+ZGVsZXRlU3RyZWFtKGRlcHRoU3RyZWFtSWQpKTsKLSAgICBFWFBFQ1RfT0sobUNhbWVyYS0+ZXhjbHVzaXZlVW5sb2NrKCkpOwotfQotCi0vLyBTdHJlYW0gZGlyZWN0bHkgdG8gdGhlIHNjcmVlbi4KLVRFU1RfRihQcm9DYW1lcmFUZXN0LCBESVNBQkxFRF9TdHJlYW1pbmdJbWFnZUR1YWwpIHsKLSAgICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzcDxTdXJmYWNlPiBzdXJmYWNlOwotICAgIHNwPFN1cmZhY2U+IGRlcHRoU3VyZmFjZTsKLSAgICBpZiAobURpc3BsYXlTZWNzID4gMCkgewotICAgICAgICBjcmVhdGVPblNjcmVlblN1cmZhY2UoLypvdXQqL3N1cmZhY2UpOwotICAgICAgICBjcmVhdGVEZXB0aE9uU2NyZWVuU3VyZmFjZSgvKm91dCovZGVwdGhTdXJmYWNlKTsKLSAgICB9Ci0KLSAgICBpbnQgc3RyZWFtSWQgPSAtMTsKLSAgICBFWFBFQ1RfT0sobUNhbWVyYS0+Y3JlYXRlU3RyZWFtKC8qd2lkdGgqLzEyODAsIC8qaGVpZ2h0Ki85NjAsCi0gICAgICAgICAgICAgIFRFU1RfRk9STUFUX01BSU4sIHN1cmZhY2UsICZzdHJlYW1JZCkpOwotICAgIEVYUEVDVF9ORSgtMSwgc3RyZWFtSWQpOwotCi0gICAgaW50IGRlcHRoU3RyZWFtSWQgPSAtMTsKLSAgICBFWFBFQ1RfT0sobUNhbWVyYS0+Y3JlYXRlU3RyZWFtKC8qd2lkdGgqLzMyMCwgLypoZWlnaHQqLzI0MCwKLSAgICAgICAgICAgICAgVEVTVF9GT1JNQVRfREVQVEgsIGRlcHRoU3VyZmFjZSwgJmRlcHRoU3RyZWFtSWQpKTsKLSAgICBFWFBFQ1RfTkUoLTEsIGRlcHRoU3RyZWFtSWQpOwotCi0gICAgRVhQRUNUX09LKG1DYW1lcmEtPmV4Y2x1c2l2ZVRyeUxvY2soKSk7Ci0gICAgLyoKLSAgICAqLwotICAgIC8qIGl0ZXJhdGUgaW4gYSBsb29wIHN1Ym1pdHRpbmcgcmVxdWVzdHMgZXZlcnkgZnJhbWUuCi0gICAgICogIHdoYXQga2luZCBvZiByZXF1ZXN0cyBkb2VzbnQgcmVhbGx5IG1hdHRlciwganVzdCB3aGF0ZXZlci4KLSAgICAgKi8KLQotICAgIC8vIGl0IHdvdWxkIHByb2JhYmx5IGJlIGJldHRlciB0byB1c2UgQ2FtZXJhTWV0YWRhdGEgZnJvbSBjYW1lcmEgc2VydmljZS4KLSAgICBjYW1lcmFfbWV0YWRhdGFfdCAqcmVxdWVzdCA9IE5VTEw7Ci0gICAgRVhQRUNUX09LKG1DYW1lcmEtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KENBTUVSQTJfVEVNUExBVEVfUFJFVklFVywKLSAgICAgICAgICAgICAgLypvdXQqLyZyZXF1ZXN0KSk7Ci0gICAgRVhQRUNUX05FKCh2b2lkKilOVUxMLCByZXF1ZXN0KTsKLQotICAgIC8qRklYTUU6IGRvbnQgbmVlZCB0aGlzIGxhdGVyLCBhdCB3aGljaCBwb2ludCB0aGUgYWJvdmUgc2hvdWxkIGJlY29tZSBhbgotICAgICAgICAgICAgIEFTU0VSVF9ORSovCi0gICAgaWYocmVxdWVzdCA9PSBOVUxMKSByZXF1ZXN0ID0gYWxsb2NhdGVfY2FtZXJhX21ldGFkYXRhKDEwLCAxMDApOwotCi0gICAgLy8gc2V0IHRoZSBvdXRwdXQgc3RyZWFtcyB0byBqdXN0IHRoaXMgc3RyZWFtIElECi0KLSAgICAvLyB3b3cgd2hhdCBhIHZlcmJvc2UgQVBJLgotICAgIGludDMyX3QgYWxsU3RyZWFtc1tdID0geyBzdHJlYW1JZCwgZGVwdGhTdHJlYW1JZCB9OwotICAgIC8vIElNUE9SVEFOVC4gYmFkIHRoaW5ncyB3aWxsIGhhcHBlbiBpZiBpdHMgbm90IGEgdWludDguCi0gICAgc2l6ZV90IHN0cmVhbUNvdW50ID0gc2l6ZW9mKGFsbFN0cmVhbXMpIC8gc2l6ZW9mKGFsbFN0cmVhbXNbMF0pOwotICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5OwotICAgIHVpbnQzMl90IHRhZyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihBTkRST0lEX1JFUVVFU1RfT1VUUFVUX1NUUkVBTVMpOwotICAgIGludCBmaW5kID0gZmluZF9jYW1lcmFfbWV0YWRhdGFfZW50cnkocmVxdWVzdCwgdGFnLCAmZW50cnkpOwotICAgIGlmIChmaW5kID09IC1FTk9FTlQpIHsKLSAgICAgICAgaWYgKGFkZF9jYW1lcmFfbWV0YWRhdGFfZW50cnkocmVxdWVzdCwgdGFnLCAmYWxsU3RyZWFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypkYXRhX2NvdW50Ki9zdHJlYW1Db3VudCkgIT0gT0spIHsKLSAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90ICp0bXAgPSBhbGxvY2F0ZV9jYW1lcmFfbWV0YWRhdGEoMTAwMCwgMTAwMDApOwotICAgICAgICAgICAgQVNTRVJUX09LKGFwcGVuZF9jYW1lcmFfbWV0YWRhdGEodG1wLCByZXF1ZXN0KSk7Ci0gICAgICAgICAgICBmcmVlX2NhbWVyYV9tZXRhZGF0YShyZXF1ZXN0KTsKLSAgICAgICAgICAgIHJlcXVlc3QgPSB0bXA7Ci0KLSAgICAgICAgICAgIEFTU0VSVF9PSyhhZGRfY2FtZXJhX21ldGFkYXRhX2VudHJ5KHJlcXVlc3QsIHRhZywgJmFsbFN0cmVhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmRhdGFfY291bnQqL3N0cmVhbUNvdW50KSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBU1NFUlRfT0sodXBkYXRlX2NhbWVyYV9tZXRhZGF0YV9lbnRyeShyZXF1ZXN0LCBlbnRyeS5pbmRleCwKLSAgICAgICAgICAgICAgICAgICZhbGxTdHJlYW1zLCAvKmRhdGFfY291bnQqL3N0cmVhbUNvdW50LCAmZW50cnkpKTsKLSAgICB9Ci0KLSAgICBFWFBFQ1RfT0sobUNhbWVyYS0+c3VibWl0UmVxdWVzdChyZXF1ZXN0LCAvKnN0cmVhbWluZyovdHJ1ZSkpOwotCi0gICAgZG91dCA8PCAid2lsbCBzbGVlcCBub3cgZm9yICIgPDwgbURpc3BsYXlTZWNzIDw8IHN0ZDo6ZW5kbDsKLSAgICBzbGVlcChtRGlzcGxheVNlY3MpOwotCi0gICAgZnJlZV9jYW1lcmFfbWV0YWRhdGEocmVxdWVzdCk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0cmVhbUNvdW50OyArK2kpIHsKLSAgICAgICAgRVhQRUNUX09LKG1DYW1lcmEtPmRlbGV0ZVN0cmVhbShhbGxTdHJlYW1zW2ldKSk7Ci0gICAgfQotICAgIEVYUEVDVF9PSyhtQ2FtZXJhLT5leGNsdXNpdmVVbmxvY2soKSk7Ci19Ci0KLVRFU1RfRihQcm9DYW1lcmFUZXN0LCBDcHVDb25zdW1lclNpbmdsZSkgewotICAgIGlmIChIYXNGYXRhbEZhaWx1cmUoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbUxpc3RlbmVyLT5TZXRFdmVudE1hc2soUHJvRXZlbnRfTWFzayhBQ1FVSVJFRCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb0V2ZW50X01hc2soU1RPTEVOKSAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9FdmVudF9NYXNrKFJFTEVBU0VEKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvRXZlbnRfTWFzayhGUkFNRV9SRUNFSVZFRCkpOwotICAgIG1MaXN0ZW5lci0+U2V0RHJvcEZyYW1lcyh0cnVlKTsKLQotICAgIGludCBzdHJlYW1JZCA9IC0xOwotICAgIHNwPENwdUNvbnN1bWVyPiBjb25zdW1lcjsKLSAgICBFWFBFQ1RfT0sobUNhbWVyYS0+Y3JlYXRlU3RyZWFtQ3B1KC8qd2lkdGgqLzMyMCwgLypoZWlnaHQqLzI0MCwKLSAgICAgICAgICAgICAgICBURVNUX0ZPUk1BVF9ERVBUSCwgVEVTVF9DUFVfSEVBUF9DT1VOVCwgJmNvbnN1bWVyLCAmc3RyZWFtSWQpKTsKLSAgICBFWFBFQ1RfTkUoLTEsIHN0cmVhbUlkKTsKLQotICAgIEVYUEVDVF9PSyhtQ2FtZXJhLT5leGNsdXNpdmVUcnlMb2NrKCkpOwotICAgIEVYUEVDVF9FUShPSywgbUxpc3RlbmVyLT5XYWl0Rm9yRXZlbnQoKSk7Ci0gICAgRVhQRUNUX0VRKEFDUVVJUkVELCBtTGlzdGVuZXItPlJlYWRFdmVudCgpKTsKLSAgICAvKiBpdGVyYXRlIGluIGEgbG9vcCBzdWJtaXR0aW5nIHJlcXVlc3RzIGV2ZXJ5IGZyYW1lLgotICAgICAqICB3aGF0IGtpbmQgb2YgcmVxdWVzdHMgZG9lc250IHJlYWxseSBtYXR0ZXIsIGp1c3Qgd2hhdGV2ZXIuCi0gICAgICovCi0KLSAgICAvLyBpdCB3b3VsZCBwcm9iYWJseSBiZSBiZXR0ZXIgdG8gdXNlIENhbWVyYU1ldGFkYXRhIGZyb20gY2FtZXJhIHNlcnZpY2UuCi0gICAgY2FtZXJhX21ldGFkYXRhX3QgKnJlcXVlc3QgPSBOVUxMOwotICAgIEVYUEVDVF9PSyhtQ2FtZXJhLT5jcmVhdGVEZWZhdWx0UmVxdWVzdChDQU1FUkEyX1RFTVBMQVRFX1BSRVZJRVcsCi0gICAgICAgIC8qb3V0Ki8mcmVxdWVzdCkpOwotICAgIEVYUEVDVF9ORSgodm9pZCopTlVMTCwgcmVxdWVzdCk7Ci0KLSAgICAvKkZJWE1FOiBkb250IG5lZWQgdGhpcyBsYXRlciwgYXQgd2hpY2ggcG9pbnQgdGhlIGFib3ZlIHNob3VsZCBiZWNvbWUgYW4KLSAgICAgIEFTU0VSVF9ORSovCi0gICAgaWYocmVxdWVzdCA9PSBOVUxMKSByZXF1ZXN0ID0gYWxsb2NhdGVfY2FtZXJhX21ldGFkYXRhKDEwLCAxMDApOwotCi0gICAgLy8gc2V0IHRoZSBvdXRwdXQgc3RyZWFtcyB0byBqdXN0IHRoaXMgc3RyZWFtIElECi0KLSAgICBpbnQzMl90IGFsbFN0cmVhbXNbXSA9IHsgc3RyZWFtSWQgfTsKLSAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeTsKLSAgICB1aW50MzJfdCB0YWcgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oQU5EUk9JRF9SRVFVRVNUX09VVFBVVF9TVFJFQU1TKTsKLSAgICBpbnQgZmluZCA9IGZpbmRfY2FtZXJhX21ldGFkYXRhX2VudHJ5KHJlcXVlc3QsIHRhZywgJmVudHJ5KTsKLSAgICBpZiAoZmluZCA9PSAtRU5PRU5UKSB7Ci0gICAgICAgIGlmIChhZGRfY2FtZXJhX21ldGFkYXRhX2VudHJ5KHJlcXVlc3QsIHRhZywgJmFsbFN0cmVhbXMsCi0gICAgICAgICAgICAgICAgLypkYXRhX2NvdW50Ki8xKSAhPSBPSykgewotICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QgKnRtcCA9IGFsbG9jYXRlX2NhbWVyYV9tZXRhZGF0YSgxMDAwLCAxMDAwMCk7Ci0gICAgICAgICAgICBBU1NFUlRfT0soYXBwZW5kX2NhbWVyYV9tZXRhZGF0YSh0bXAsIHJlcXVlc3QpKTsKLSAgICAgICAgICAgIGZyZWVfY2FtZXJhX21ldGFkYXRhKHJlcXVlc3QpOwotICAgICAgICAgICAgcmVxdWVzdCA9IHRtcDsKLQotICAgICAgICAgICAgQVNTRVJUX09LKGFkZF9jYW1lcmFfbWV0YWRhdGFfZW50cnkocmVxdWVzdCwgdGFnLCAmYWxsU3RyZWFtcywKLSAgICAgICAgICAgICAgICAvKmRhdGFfY291bnQqLzEpKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFTU0VSVF9PSyh1cGRhdGVfY2FtZXJhX21ldGFkYXRhX2VudHJ5KHJlcXVlc3QsIGVudHJ5LmluZGV4LAotICAgICAgICAgICAgJmFsbFN0cmVhbXMsIC8qZGF0YV9jb3VudCovMSwgJmVudHJ5KSk7Ci0gICAgfQotCi0gICAgRVhQRUNUX09LKG1DYW1lcmEtPnN1Ym1pdFJlcXVlc3QocmVxdWVzdCwgLypzdHJlYW1pbmcqL3RydWUpKTsKLQotICAgIC8vIENvbnN1bWUgYSBjb3VwbGUgb2YgZnJhbWVzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBURVNUX0NQVV9GUkFNRV9DT1VOVDsgKytpKSB7Ci0gICAgICAgIEVYUEVDVF9FUShPSywgbUxpc3RlbmVyLT5XYWl0Rm9yRXZlbnQoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShGUkFNRV9SRUNFSVZFRCwgbUxpc3RlbmVyLT5SZWFkRXZlbnQoKSk7Ci0gICAgfQotCi0gICAgLy8gRG9uZTogY2xlYW4gdXAKLSAgICBmcmVlX2NhbWVyYV9tZXRhZGF0YShyZXF1ZXN0KTsKLSAgICBFWFBFQ1RfT0sobUNhbWVyYS0+ZGVsZXRlU3RyZWFtKHN0cmVhbUlkKSk7Ci0gICAgRVhQRUNUX09LKG1DYW1lcmEtPmV4Y2x1c2l2ZVVubG9jaygpKTsKLX0KLQotVEVTVF9GKFByb0NhbWVyYVRlc3QsIENwdUNvbnN1bWVyRHVhbCkgewotICAgIGlmIChIYXNGYXRhbEZhaWx1cmUoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbUxpc3RlbmVyLT5TZXRFdmVudE1hc2soUHJvRXZlbnRfTWFzayhGUkFNRV9SRUNFSVZFRCkpOwotICAgIG1MaXN0ZW5lci0+U2V0RHJvcEZyYW1lcyh0cnVlKTsKLQotICAgIGludCBzdHJlYW1JZCA9IC0xOwotICAgIHNwPENwdUNvbnN1bWVyPiBjb25zdW1lcjsKLSAgICBFWFBFQ1RfT0sobUNhbWVyYS0+Y3JlYXRlU3RyZWFtQ3B1KC8qd2lkdGgqLzEyODAsIC8qaGVpZ2h0Ki85NjAsCi0gICAgICAgICAgICAgICAgVEVTVF9GT1JNQVRfTUFJTiwgVEVTVF9DUFVfSEVBUF9DT1VOVCwgJmNvbnN1bWVyLCAmc3RyZWFtSWQpKTsKLSAgICBFWFBFQ1RfTkUoLTEsIHN0cmVhbUlkKTsKLQotICAgIGludCBkZXB0aFN0cmVhbUlkID0gLTE7Ci0gICAgRVhQRUNUX09LKG1DYW1lcmEtPmNyZWF0ZVN0cmVhbUNwdSgvKndpZHRoKi8zMjAsIC8qaGVpZ2h0Ki8yNDAsCi0gICAgICAgICAgICBURVNUX0ZPUk1BVF9ERVBUSCwgVEVTVF9DUFVfSEVBUF9DT1VOVCwgJmNvbnN1bWVyLCAmZGVwdGhTdHJlYW1JZCkpOwotICAgIEVYUEVDVF9ORSgtMSwgZGVwdGhTdHJlYW1JZCk7Ci0KLSAgICBFWFBFQ1RfT0sobUNhbWVyYS0+ZXhjbHVzaXZlVHJ5TG9jaygpKTsKLSAgICAvKgotICAgICovCi0gICAgLyogaXRlcmF0ZSBpbiBhIGxvb3Agc3VibWl0dGluZyByZXF1ZXN0cyBldmVyeSBmcmFtZS4KLSAgICAgKiAgd2hhdCBraW5kIG9mIHJlcXVlc3RzIGRvZXNudCByZWFsbHkgbWF0dGVyLCBqdXN0IHdoYXRldmVyLgotICAgICAqLwotCi0gICAgLy8gaXQgd291bGQgcHJvYmFibHkgYmUgYmV0dGVyIHRvIHVzZSBDYW1lcmFNZXRhZGF0YSBmcm9tIGNhbWVyYSBzZXJ2aWNlLgotICAgIGNhbWVyYV9tZXRhZGF0YV90ICpyZXF1ZXN0ID0gTlVMTDsKLSAgICBFWFBFQ1RfT0sobUNhbWVyYS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoQ0FNRVJBMl9URU1QTEFURV9QUkVWSUVXLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovJnJlcXVlc3QpKTsKLSAgICBFWFBFQ1RfTkUoKHZvaWQqKU5VTEwsIHJlcXVlc3QpOwotCi0gICAgaWYocmVxdWVzdCA9PSBOVUxMKSByZXF1ZXN0ID0gYWxsb2NhdGVfY2FtZXJhX21ldGFkYXRhKDEwLCAxMDApOwotCi0gICAgLy8gc2V0IHRoZSBvdXRwdXQgc3RyZWFtcyB0byBqdXN0IHRoaXMgc3RyZWFtIElECi0KLSAgICAvLyB3b3cgd2hhdCBhIHZlcmJvc2UgQVBJLgotICAgIGludDMyX3QgYWxsU3RyZWFtc1tdID0geyBzdHJlYW1JZCwgZGVwdGhTdHJlYW1JZCB9OwotICAgIHNpemVfdCBzdHJlYW1Db3VudCA9IDI7Ci0gICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnk7Ci0gICAgdWludDMyX3QgdGFnID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KEFORFJPSURfUkVRVUVTVF9PVVRQVVRfU1RSRUFNUyk7Ci0gICAgaW50IGZpbmQgPSBmaW5kX2NhbWVyYV9tZXRhZGF0YV9lbnRyeShyZXF1ZXN0LCB0YWcsICZlbnRyeSk7Ci0gICAgaWYgKGZpbmQgPT0gLUVOT0VOVCkgewotICAgICAgICBpZiAoYWRkX2NhbWVyYV9tZXRhZGF0YV9lbnRyeShyZXF1ZXN0LCB0YWcsICZhbGxTdHJlYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmRhdGFfY291bnQqL3N0cmVhbUNvdW50KSAhPSBPSykgewotICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QgKnRtcCA9IGFsbG9jYXRlX2NhbWVyYV9tZXRhZGF0YSgxMDAwLCAxMDAwMCk7Ci0gICAgICAgICAgICBBU1NFUlRfT0soYXBwZW5kX2NhbWVyYV9tZXRhZGF0YSh0bXAsIHJlcXVlc3QpKTsKLSAgICAgICAgICAgIGZyZWVfY2FtZXJhX21ldGFkYXRhKHJlcXVlc3QpOwotICAgICAgICAgICAgcmVxdWVzdCA9IHRtcDsKLQotICAgICAgICAgICAgQVNTRVJUX09LKGFkZF9jYW1lcmFfbWV0YWRhdGFfZW50cnkocmVxdWVzdCwgdGFnLCAmYWxsU3RyZWFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qZGF0YV9jb3VudCovc3RyZWFtQ291bnQpKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFTU0VSVF9PSyh1cGRhdGVfY2FtZXJhX21ldGFkYXRhX2VudHJ5KHJlcXVlc3QsIGVudHJ5LmluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsbFN0cmVhbXMsIC8qZGF0YV9jb3VudCovc3RyZWFtQ291bnQsICZlbnRyeSkpOwotICAgIH0KLQotICAgIEVYUEVDVF9PSyhtQ2FtZXJhLT5zdWJtaXRSZXF1ZXN0KHJlcXVlc3QsIC8qc3RyZWFtaW5nKi90cnVlKSk7Ci0KLSAgICAvLyBDb25zdW1lIGEgY291cGxlIG9mIGZyYW1lcwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVEVTVF9DUFVfRlJBTUVfQ09VTlQ7ICsraSkgewotICAgICAgICAvLyBzdHJlYW0gaWQgMQotICAgICAgICBFWFBFQ1RfRVEoT0ssIG1MaXN0ZW5lci0+V2FpdEZvckV2ZW50KCkpOwotICAgICAgICBFWFBFQ1RfRVEoRlJBTUVfUkVDRUlWRUQsIG1MaXN0ZW5lci0+UmVhZEV2ZW50KCkpOwotCi0gICAgICAgIC8vIHN0cmVhbSBpZCAyCi0gICAgICAgIEVYUEVDVF9FUShPSywgbUxpc3RlbmVyLT5XYWl0Rm9yRXZlbnQoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShGUkFNRV9SRUNFSVZFRCwgbUxpc3RlbmVyLT5SZWFkRXZlbnQoKSk7Ci0KLSAgICAgICAgLy9UT0RPOiBldmVudHMgc2hvdWxkIGJlIGEgc3RydWN0IHdpdGggc29tZSBkYXRhIGxpa2UgdGhlIHN0cmVhbSBpZAotICAgIH0KLQotICAgIC8vIERvbmU6IGNsZWFuIHVwCi0gICAgZnJlZV9jYW1lcmFfbWV0YWRhdGEocmVxdWVzdCk7Ci0gICAgRVhQRUNUX09LKG1DYW1lcmEtPmRlbGV0ZVN0cmVhbShzdHJlYW1JZCkpOwotICAgIEVYUEVDVF9PSyhtQ2FtZXJhLT5leGNsdXNpdmVVbmxvY2soKSk7Ci19Ci0KLVRFU1RfRihQcm9DYW1lcmFUZXN0LCBSZXN1bHRSZWNlaXZlcikgewotICAgIGlmIChIYXNGYXRhbEZhaWx1cmUoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbUxpc3RlbmVyLT5TZXRFdmVudE1hc2soUHJvRXZlbnRfTWFzayhSRVNVTFRfUkVDRUlWRUQpKTsKLSAgICBtTGlzdGVuZXItPlNldERyb3BGcmFtZXModHJ1ZSk7Ci0gICAgLy9GSVhNRTogaWYgdGhpcyBpcyBydW4gcmlnaHQgYWZ0ZXIgdGhlIHByZXZpb3VzIHRlc3Qgd2UgZ2V0IEZSQU1FX1JFQ0VJVkVECi0gICAgLy8gbmVlZCB0byBmaWx0ZXIgb3V0IGV2ZW50cyBhdCByZWFkIHRpbWUKLQotICAgIGludCBzdHJlYW1JZCA9IC0xOwotICAgIHNwPENwdUNvbnN1bWVyPiBjb25zdW1lcjsKLSAgICBFWFBFQ1RfT0sobUNhbWVyYS0+Y3JlYXRlU3RyZWFtQ3B1KC8qd2lkdGgqLzEyODAsIC8qaGVpZ2h0Ki85NjAsCi0gICAgICAgICAgICAgICAgVEVTVF9GT1JNQVRfTUFJTiwgVEVTVF9DUFVfSEVBUF9DT1VOVCwgJmNvbnN1bWVyLCAmc3RyZWFtSWQpKTsKLSAgICBFWFBFQ1RfTkUoLTEsIHN0cmVhbUlkKTsKLQotICAgIEVYUEVDVF9PSyhtQ2FtZXJhLT5leGNsdXNpdmVUcnlMb2NrKCkpOwotICAgIC8qCi0gICAgKi8KLSAgICAvKiBpdGVyYXRlIGluIGEgbG9vcCBzdWJtaXR0aW5nIHJlcXVlc3RzIGV2ZXJ5IGZyYW1lLgotICAgICAqICB3aGF0IGtpbmQgb2YgcmVxdWVzdHMgZG9lc250IHJlYWxseSBtYXR0ZXIsIGp1c3Qgd2hhdGV2ZXIuCi0gICAgICovCi0KLSAgICBjYW1lcmFfbWV0YWRhdGFfdCAqcmVxdWVzdCA9IE5VTEw7Ci0gICAgRVhQRUNUX09LKG1DYW1lcmEtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KENBTUVSQTJfVEVNUExBVEVfUFJFVklFVywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLyZyZXF1ZXN0KSk7Ci0gICAgRVhQRUNUX05FKCh2b2lkKilOVUxMLCByZXF1ZXN0KTsKLQotICAgIC8qRklYTUUqLwotICAgIGlmKHJlcXVlc3QgPT0gTlVMTCkgcmVxdWVzdCA9IGFsbG9jYXRlX2NhbWVyYV9tZXRhZGF0YSgxMCwgMTAwKTsKLQotICAgIC8vIHNldCB0aGUgb3V0cHV0IHN0cmVhbXMgdG8ganVzdCB0aGlzIHN0cmVhbSBJRAotCi0gICAgaW50MzJfdCBhbGxTdHJlYW1zW10gPSB7IHN0cmVhbUlkIH07Ci0gICAgc2l6ZV90IHN0cmVhbUNvdW50ID0gMTsKLSAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeTsKLSAgICB1aW50MzJfdCB0YWcgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oQU5EUk9JRF9SRVFVRVNUX09VVFBVVF9TVFJFQU1TKTsKLSAgICBpbnQgZmluZCA9IGZpbmRfY2FtZXJhX21ldGFkYXRhX2VudHJ5KHJlcXVlc3QsIHRhZywgJmVudHJ5KTsKLSAgICBpZiAoZmluZCA9PSAtRU5PRU5UKSB7Ci0gICAgICAgIGlmIChhZGRfY2FtZXJhX21ldGFkYXRhX2VudHJ5KHJlcXVlc3QsIHRhZywgJmFsbFN0cmVhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qZGF0YV9jb3VudCovc3RyZWFtQ291bnQpICE9IE9LKSB7Ci0gICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCAqdG1wID0gYWxsb2NhdGVfY2FtZXJhX21ldGFkYXRhKDEwMDAsIDEwMDAwKTsKLSAgICAgICAgICAgIEFTU0VSVF9PSyhhcHBlbmRfY2FtZXJhX21ldGFkYXRhKHRtcCwgcmVxdWVzdCkpOwotICAgICAgICAgICAgZnJlZV9jYW1lcmFfbWV0YWRhdGEocmVxdWVzdCk7Ci0gICAgICAgICAgICByZXF1ZXN0ID0gdG1wOwotCi0gICAgICAgICAgICBBU1NFUlRfT0soYWRkX2NhbWVyYV9tZXRhZGF0YV9lbnRyeShyZXF1ZXN0LCB0YWcsICZhbGxTdHJlYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypkYXRhX2NvdW50Ki9zdHJlYW1Db3VudCkpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQVNTRVJUX09LKHVwZGF0ZV9jYW1lcmFfbWV0YWRhdGFfZW50cnkocmVxdWVzdCwgZW50cnkuaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsbFN0cmVhbXMsIC8qZGF0YV9jb3VudCovc3RyZWFtQ291bnQsICZlbnRyeSkpOwotICAgIH0KLQotICAgIEVYUEVDVF9PSyhtQ2FtZXJhLT5zdWJtaXRSZXF1ZXN0KHJlcXVlc3QsIC8qc3RyZWFtaW5nKi90cnVlKSk7Ci0KLSAgICAvLyBDb25zdW1lIGEgY291cGxlIG9mIHJlc3VsdHMKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IFRFU1RfQ1BVX0ZSQU1FX0NPVU5UOyArK2kpIHsKLSAgICAgICAgRVhQRUNUX0VRKE9LLCBtTGlzdGVuZXItPldhaXRGb3JFdmVudCgpKTsKLSAgICAgICAgRVhQRUNUX0VRKFJFU1VMVF9SRUNFSVZFRCwgbUxpc3RlbmVyLT5SZWFkRXZlbnQoKSk7Ci0gICAgfQotCi0gICAgLy8gRG9uZTogY2xlYW4gdXAKLSAgICBmcmVlX2NhbWVyYV9tZXRhZGF0YShyZXF1ZXN0KTsKLSAgICBFWFBFQ1RfT0sobUNhbWVyYS0+ZGVsZXRlU3RyZWFtKHN0cmVhbUlkKSk7Ci0gICAgRVhQRUNUX09LKG1DYW1lcmEtPmV4Y2x1c2l2ZVVubG9jaygpKTsKLX0KLQotLy8gRklYTUU6IFRoaXMgaXMgcmFjeSBhbmQgc29tZXRpbWVzIGZhaWxzIG9uIHdhaXRGb3JGcmFtZU1ldGFkYXRhCi1URVNUX0YoUHJvQ2FtZXJhVGVzdCwgRElTQUJMRURfV2FpdEZvclJlc3VsdCkgewotICAgIGlmIChIYXNGYXRhbEZhaWx1cmUoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbUxpc3RlbmVyLT5TZXREcm9wRnJhbWVzKHRydWUpOwotCi0gICAgaW50IHN0cmVhbUlkID0gLTE7Ci0gICAgc3A8Q3B1Q29uc3VtZXI+IGNvbnN1bWVyOwotICAgIEVYUEVDVF9PSyhtQ2FtZXJhLT5jcmVhdGVTdHJlYW1DcHUoLyp3aWR0aCovMTI4MCwgLypoZWlnaHQqLzk2MCwKLSAgICAgICAgICAgICAgICAgVEVTVF9GT1JNQVRfTUFJTiwgVEVTVF9DUFVfSEVBUF9DT1VOVCwgJmNvbnN1bWVyLCAmc3RyZWFtSWQpKTsKLSAgICBFWFBFQ1RfTkUoLTEsIHN0cmVhbUlkKTsKLQotICAgIEVYUEVDVF9PSyhtQ2FtZXJhLT5leGNsdXNpdmVUcnlMb2NrKCkpOwotCi0gICAgaW50MzJfdCBzdHJlYW1zW10gPSB7IHN0cmVhbUlkIH07Ci0gICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoY3JlYXRlU3VibWl0UmVxdWVzdEZvclN0cmVhbXMoc3RyZWFtcywgLypjb3VudCovMSkpOwotCi0gICAgLy8gQ29uc3VtZSBhIGNvdXBsZSBvZiByZXN1bHRzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBURVNUX0NQVV9GUkFNRV9DT1VOVDsgKytpKSB7Ci0gICAgICAgIEVYUEVDVF9PSyhtQ2FtZXJhLT53YWl0Rm9yRnJhbWVNZXRhZGF0YSgpKTsKLSAgICAgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YSA9IG1DYW1lcmEtPmNvbnN1bWVGcmFtZU1ldGFkYXRhKCk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShtZXRhLmlzRW1wdHkoKSk7Ci0gICAgfQotCi0gICAgLy8gRG9uZTogY2xlYW4gdXAKLSAgICBFWFBFQ1RfT0sobUNhbWVyYS0+ZGVsZXRlU3RyZWFtKHN0cmVhbUlkKSk7Ci0gICAgRVhQRUNUX09LKG1DYW1lcmEtPmV4Y2x1c2l2ZVVubG9jaygpKTsKLX0KLQotVEVTVF9GKFByb0NhbWVyYVRlc3QsIFdhaXRGb3JTaW5nbGVTdHJlYW1CdWZmZXIpIHsKLSAgICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGludCBzdHJlYW1JZCA9IC0xOwotICAgIHNwPENwdUNvbnN1bWVyPiBjb25zdW1lcjsKLSAgICBFWFBFQ1RfT0sobUNhbWVyYS0+Y3JlYXRlU3RyZWFtQ3B1KC8qd2lkdGgqLzEyODAsIC8qaGVpZ2h0Ki85NjAsCi0gICAgICAgICAgICAgICAgICBURVNUX0ZPUk1BVF9NQUlOLCBURVNUX0NQVV9IRUFQX0NPVU5ULCAmY29uc3VtZXIsICZzdHJlYW1JZCkpOwotICAgIEVYUEVDVF9ORSgtMSwgc3RyZWFtSWQpOwotCi0gICAgRVhQRUNUX09LKG1DYW1lcmEtPmV4Y2x1c2l2ZVRyeUxvY2soKSk7Ci0KLSAgICBpbnQzMl90IHN0cmVhbXNbXSA9IHsgc3RyZWFtSWQgfTsKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShjcmVhdGVTdWJtaXRSZXF1ZXN0Rm9yU3RyZWFtcyhzdHJlYW1zLCAvKmNvdW50Ki8xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnJlcXVlc3RzKi9URVNUX0NQVV9GUkFNRV9DT1VOVCkpOwotCi0gICAgLy8gQ29uc3VtZSBhIGNvdXBsZSBvZiByZXN1bHRzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBURVNUX0NQVV9GUkFNRV9DT1VOVDsgKytpKSB7Ci0gICAgICAgIEVYUEVDVF9FUSgxLCBtQ2FtZXJhLT53YWl0Rm9yRnJhbWVCdWZmZXIoc3RyZWFtSWQpKTsKLQotICAgICAgICBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyIGJ1ZjsKLSAgICAgICAgRVhQRUNUX09LKGNvbnN1bWVyLT5sb2NrTmV4dEJ1ZmZlcigmYnVmKSk7Ci0KLSAgICAgICAgZG91dCA8PCAiQnVmZmVyIHN5bmNocm9ub3VzbHkgcmVjZWl2ZWQgb24gc3RyZWFtSWQgPSAiIDw8IHN0cmVhbUlkIDw8Ci0gICAgICAgICAgICAgICAgIiwgZGF0YVB0ciA9ICIgPDwgKHZvaWQqKWJ1Zi5kYXRhIDw8Ci0gICAgICAgICAgICAgICAgIiwgdGltZXN0YW1wID0gIiA8PCBidWYudGltZXN0YW1wIDw8IHN0ZDo6ZW5kbDsKLQotICAgICAgICBFWFBFQ1RfT0soY29uc3VtZXItPnVubG9ja0J1ZmZlcihidWYpKTsKLSAgICB9Ci0KLSAgICAvLyBEb25lOiBjbGVhbiB1cAotICAgIEVYUEVDVF9PSyhtQ2FtZXJhLT5kZWxldGVTdHJlYW0oc3RyZWFtSWQpKTsKLSAgICBFWFBFQ1RfT0sobUNhbWVyYS0+ZXhjbHVzaXZlVW5sb2NrKCkpOwotfQotCi0vLyBGSVhNRTogVGhpcyBpcyByYWN5IGFuZCBzb21ldGltZXMgZmFpbHMgb24gd2FpdEZvckZyYW1lTWV0YWRhdGEKLVRFU1RfRihQcm9DYW1lcmFUZXN0LCBESVNBQkxFRF9XYWl0Rm9yRHVhbFN0cmVhbUJ1ZmZlcikgewotICAgIGlmIChIYXNGYXRhbEZhaWx1cmUoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY29uc3QgaW50IFJFUVVFU1RfQ09VTlQgPSBURVNUX0NQVV9GUkFNRV9DT1VOVCAqIDEwOwotCi0gICAgLy8gMTUgZnBzCi0gICAgaW50IHN0cmVhbUlkID0gLTE7Ci0gICAgc3A8Q3B1Q29uc3VtZXI+IGNvbnN1bWVyOwotICAgIEVYUEVDVF9PSyhtQ2FtZXJhLT5jcmVhdGVTdHJlYW1DcHUoLyp3aWR0aCovMTI4MCwgLypoZWlnaHQqLzk2MCwKLSAgICAgICAgICAgICAgICAgVEVTVF9GT1JNQVRfTUFJTiwgVEVTVF9DUFVfSEVBUF9DT1VOVCwgJmNvbnN1bWVyLCAmc3RyZWFtSWQpKTsKLSAgICBFWFBFQ1RfTkUoLTEsIHN0cmVhbUlkKTsKLQotICAgIC8vIDMwIGZwcwotICAgIGludCBkZXB0aFN0cmVhbUlkID0gLTE7Ci0gICAgc3A8Q3B1Q29uc3VtZXI+IGRlcHRoQ29uc3VtZXI7Ci0gICAgRVhQRUNUX09LKG1DYW1lcmEtPmNyZWF0ZVN0cmVhbUNwdSgvKndpZHRoKi8zMjAsIC8qaGVpZ2h0Ki8yNDAsCi0gICAgICAgVEVTVF9GT1JNQVRfREVQVEgsIFRFU1RfQ1BVX0hFQVBfQ09VTlQsICZkZXB0aENvbnN1bWVyLCAmZGVwdGhTdHJlYW1JZCkpOwotICAgIEVYUEVDVF9ORSgtMSwgZGVwdGhTdHJlYW1JZCk7Ci0KLSAgICBFWFBFQ1RfT0sobUNhbWVyYS0+ZXhjbHVzaXZlVHJ5TG9jaygpKTsKLQotICAgIGludDMyX3Qgc3RyZWFtc1tdID0geyBzdHJlYW1JZCwgZGVwdGhTdHJlYW1JZCB9OwotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGNyZWF0ZVN1Ym1pdFJlcXVlc3RGb3JTdHJlYW1zKHN0cmVhbXMsIC8qY291bnQqLzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypyZXF1ZXN0cyovUkVRVUVTVF9DT1VOVCkpOwotCi0gICAgaW50IGRlcHRoRnJhbWVzID0gMDsKLSAgICBpbnQgZ3JleUZyYW1lcyA9IDA7Ci0KLSAgICAvLyBDb25zdW1lIHR3byBmcmFtZXMgc2ltdWx0YW5lb3VzbHkuIFVuc3luY2hyb25pemVkIGJ5IHRpbWVzdGFtcHMuCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBSRVFVRVNUX0NPVU5UOyArK2kpIHsKLQotICAgICAgICAvLyBFeGhhdXN0IGV2ZW50IHF1ZXVlIHNvIGl0IGRvZXNuJ3Qga2VlcCBncm93aW5nCi0gICAgICAgIHdoaWxlIChtTGlzdGVuZXItPlJlYWRFdmVudCgpICE9IFVOS05PV04pOwotCi0gICAgICAgIC8vIEdldCB0aGUgbWV0YWRhdGEKLSAgICAgICAgRVhQRUNUX09LKG1DYW1lcmEtPndhaXRGb3JGcmFtZU1ldGFkYXRhKCkpOwotICAgICAgICBDYW1lcmFNZXRhZGF0YSBtZXRhID0gbUNhbWVyYS0+Y29uc3VtZUZyYW1lTWV0YWRhdGEoKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKG1ldGEuaXNFbXB0eSgpKTsKLQotICAgICAgICAvLyBHZXQgdGhlIGJ1ZmZlcnMKLQotICAgICAgICBFWFBFQ1RfRVEoMSwgbUNhbWVyYS0+d2FpdEZvckZyYW1lQnVmZmVyKGRlcHRoU3RyZWFtSWQpKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICAqIEd1YXJhbnRlZWQgdG8gYmUgYWJsZSB0byBjb25zdW1lIHRoZSBkZXB0aCBmcmFtZSwKLSAgICAgICAgICAqIHNpbmNlIHdlIHdhaXRlZCBvbiBpdC4KLSAgICAgICAgICAqLwotICAgICAgICBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyIGRlcHRoQnVmZmVyOwotICAgICAgICBFWFBFQ1RfT0soZGVwdGhDb25zdW1lci0+bG9ja05leHRCdWZmZXIoJmRlcHRoQnVmZmVyKSk7Ci0KLSAgICAgICAgZG91dCA8PCAiRGVwdGggQnVmZmVyIHN5bmNocm9ub3VzbHkgcmVjZWl2ZWQgb24gc3RyZWFtSWQgPSAiIDw8Ci0gICAgICAgICAgICAgICAgc3RyZWFtSWQgPDwKLSAgICAgICAgICAgICAgICAiLCBkYXRhUHRyID0gIiA8PCAodm9pZCopZGVwdGhCdWZmZXIuZGF0YSA8PAotICAgICAgICAgICAgICAgICIsIHRpbWVzdGFtcCA9ICIgPDwgZGVwdGhCdWZmZXIudGltZXN0YW1wIDw8IHN0ZDo6ZW5kbDsKLQotICAgICAgICBFWFBFQ1RfT0soZGVwdGhDb25zdW1lci0+dW5sb2NrQnVmZmVyKGRlcHRoQnVmZmVyKSk7Ci0KLSAgICAgICAgZGVwdGhGcmFtZXMrKzsKLQotCi0gICAgICAgIC8qKiBDb25zdW1lIEdyZXlzY2FsZSBmcmFtZXMgaWYgdGhlcmUgYXJlIGFueS4KLSAgICAgICAgICAqIFRoZXJlIG1heSBub3QgYmUgc2luY2UgaXQgcnVucyBhdCBoYWxmIEZQUyAqLwotICAgICAgICBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyIGdyZXlCdWZmZXI7Ci0gICAgICAgIHdoaWxlIChjb25zdW1lci0+bG9ja05leHRCdWZmZXIoJmdyZXlCdWZmZXIpID09IE9LKSB7Ci0KLSAgICAgICAgICAgIGRvdXQgPDwgIkdSQVkgQnVmZmVyIHN5bmNocm9ub3VzbHkgcmVjZWl2ZWQgb24gc3RyZWFtSWQgPSAiIDw8Ci0gICAgICAgICAgICAgICAgc3RyZWFtSWQgPDwKLSAgICAgICAgICAgICAgICAiLCBkYXRhUHRyID0gIiA8PCAodm9pZCopZ3JleUJ1ZmZlci5kYXRhIDw8Ci0gICAgICAgICAgICAgICAgIiwgdGltZXN0YW1wID0gIiA8PCBncmV5QnVmZmVyLnRpbWVzdGFtcCA8PCBzdGQ6OmVuZGw7Ci0KLSAgICAgICAgICAgIEVYUEVDVF9PSyhjb25zdW1lci0+dW5sb2NrQnVmZmVyKGdyZXlCdWZmZXIpKTsKLQotICAgICAgICAgICAgZ3JleUZyYW1lcysrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZG91dCA8PCAiRG9uZSwgc3VtbWFyeTogZGVwdGggZnJhbWVzICIgPDwgc3RkOjpkZWMgPDwgZGVwdGhGcmFtZXMKLSAgICAgICAgIDw8ICIsIGdyZXkgZnJhbWVzICIgPDwgc3RkOjpkZWMgPDwgZ3JleUZyYW1lcyA8PCBzdGQ6OmVuZGw7Ci0KLSAgICAvLyBEb25lOiBjbGVhbiB1cAotICAgIEVYUEVDVF9PSyhtQ2FtZXJhLT5kZWxldGVTdHJlYW0oc3RyZWFtSWQpKTsKLSAgICBFWFBFQ1RfT0sobUNhbWVyYS0+ZXhjbHVzaXZlVW5sb2NrKCkpOwotfQotCi1URVNUX0YoUHJvQ2FtZXJhVGVzdCwgV2FpdEZvclNpbmdsZVN0cmVhbUJ1ZmZlckFuZERyb3BGcmFtZXNTeW5jKSB7Ci0gICAgaWYgKEhhc0ZhdGFsRmFpbHVyZSgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjb25zdCBpbnQgTlVNX1JFUVVFU1RTID0gMjAgKiBURVNUX0NQVV9GUkFNRV9DT1VOVDsKLQotICAgIGludCBzdHJlYW1JZCA9IC0xOwotICAgIHNwPENwdUNvbnN1bWVyPiBjb25zdW1lcjsKLSAgICBFWFBFQ1RfT0sobUNhbWVyYS0+Y3JlYXRlU3RyZWFtQ3B1KC8qd2lkdGgqLzEyODAsIC8qaGVpZ2h0Ki85NjAsCi0gICAgICAgICAgICAgICAgICBURVNUX0ZPUk1BVF9NQUlOLCBURVNUX0NQVV9IRUFQX0NPVU5ULAotICAgICAgICAgICAgICAgICAgLypzeW5jaHJvbm91c01vZGUqL3RydWUsICZjb25zdW1lciwgJnN0cmVhbUlkKSk7Ci0gICAgRVhQRUNUX05FKC0xLCBzdHJlYW1JZCk7Ci0KLSAgICBFWFBFQ1RfT0sobUNhbWVyYS0+ZXhjbHVzaXZlVHJ5TG9jaygpKTsKLQotICAgIGludDMyX3Qgc3RyZWFtc1tdID0geyBzdHJlYW1JZCB9OwotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGNyZWF0ZVN1Ym1pdFJlcXVlc3RGb3JTdHJlYW1zKHN0cmVhbXMsIC8qY291bnQqLzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcmVxdWVzdHMqL05VTV9SRVFVRVNUUykpOwotCi0gICAgLy8gQ29uc3VtZSBhIGNvdXBsZSBvZiByZXN1bHRzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fUkVRVUVTVFM7ICsraSkgewotICAgICAgICBpbnQgbnVtRnJhbWVzOwotICAgICAgICBFWFBFQ1RfVFJVRSgobnVtRnJhbWVzID0gbUNhbWVyYS0+d2FpdEZvckZyYW1lQnVmZmVyKHN0cmVhbUlkKSkgPiAwKTsKLQotICAgICAgICAvLyBEcm9wIGFsbCBidXQgdGhlIG5ld2VzdCBmcmFtZWJ1ZmZlcgotICAgICAgICBFWFBFQ1RfRVEobnVtRnJhbWVzLTEsIG1DYW1lcmEtPmRyb3BGcmFtZUJ1ZmZlcihzdHJlYW1JZCwgbnVtRnJhbWVzLTEpKTsKLQotICAgICAgICBkb3V0IDw8ICJEcm9wcGVkICIgPDwgKG51bUZyYW1lcyAtIDEpIDw8ICIgZnJhbWVzIiA8PCBzdGQ6OmVuZGw7Ci0KLSAgICAgICAgLy8gU2tpcCB0aGUgY291bnRlciBhaGVhZCwgZG9uJ3QgdHJ5IHRvIGNvbnN1bWUgdGhlc2UgZnJhbWVzIGFnYWluCi0gICAgICAgIGkgKz0gbnVtRnJhbWVzLTE7Ci0KLSAgICAgICAgLy8gIkNvbnN1bWUiIHRoZSBidWZmZXIKLSAgICAgICAgQ3B1Q29uc3VtZXI6OkxvY2tlZEJ1ZmZlciBidWY7Ci0gICAgICAgIEVYUEVDVF9PSyhjb25zdW1lci0+bG9ja05leHRCdWZmZXIoJmJ1ZikpOwotCi0gICAgICAgIGRvdXQgPDwgIkJ1ZmZlciBzeW5jaHJvbm91c2x5IHJlY2VpdmVkIG9uIHN0cmVhbUlkID0gIiA8PCBzdHJlYW1JZCA8PAotICAgICAgICAgICAgICAgICIsIGRhdGFQdHIgPSAiIDw8ICh2b2lkKilidWYuZGF0YSA8PAotICAgICAgICAgICAgICAgICIsIHRpbWVzdGFtcCA9ICIgPDwgYnVmLnRpbWVzdGFtcCA8PCBzdGQ6OmVuZGw7Ci0KLSAgICAgICAgLy8gUHJvY2VzcyBhdCAxMGZwcywgc3RyZWFtIGlzIGF0IDE1ZnBzLgotICAgICAgICAvLyBUaGlzIG1lYW5zIHdlIHdpbGwgZGVmaW5pdGVseSBmaWxsIHVwIHRoZSBidWZmZXIgcXVldWUgd2l0aAotICAgICAgICAvLyBleHRyYSBidWZmZXJzIGFuZCBuZWVkIHRvIGRyb3AgdGhlbS4KLSAgICAgICAgdXNsZWVwKFRFU1RfRlJBTUVfUFJPQ0VTU0lOR19ERUxBWV9VUyk7Ci0KLSAgICAgICAgRVhQRUNUX09LKGNvbnN1bWVyLT51bmxvY2tCdWZmZXIoYnVmKSk7Ci0gICAgfQotCi0gICAgLy8gRG9uZTogY2xlYW4gdXAKLSAgICBFWFBFQ1RfT0sobUNhbWVyYS0+ZGVsZXRlU3RyZWFtKHN0cmVhbUlkKSk7Ci0gICAgRVhQRUNUX09LKG1DYW1lcmEtPmV4Y2x1c2l2ZVVubG9jaygpKTsKLX0KLQotVEVTVF9GKFByb0NhbWVyYVRlc3QsIFdhaXRGb3JTaW5nbGVTdHJlYW1CdWZmZXJBbmREcm9wRnJhbWVzQXN5bmMpIHsKLSAgICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNvbnN0IGludCBOVU1fUkVRVUVTVFMgPSAyMCAqIFRFU1RfQ1BVX0ZSQU1FX0NPVU5UOwotCi0gICAgaW50IHN0cmVhbUlkID0gLTE7Ci0gICAgc3A8Q3B1Q29uc3VtZXI+IGNvbnN1bWVyOwotICAgIEVYUEVDVF9PSyhtQ2FtZXJhLT5jcmVhdGVTdHJlYW1DcHUoLyp3aWR0aCovMTI4MCwgLypoZWlnaHQqLzk2MCwKLSAgICAgICAgICAgICAgICAgIFRFU1RfRk9STUFUX01BSU4sIFRFU1RfQ1BVX0hFQVBfQ09VTlQsCi0gICAgICAgICAgICAgICAgICAvKnN5bmNocm9ub3VzTW9kZSovZmFsc2UsICZjb25zdW1lciwgJnN0cmVhbUlkKSk7Ci0gICAgRVhQRUNUX05FKC0xLCBzdHJlYW1JZCk7Ci0KLSAgICBFWFBFQ1RfT0sobUNhbWVyYS0+ZXhjbHVzaXZlVHJ5TG9jaygpKTsKLQotICAgIGludDMyX3Qgc3RyZWFtc1tdID0geyBzdHJlYW1JZCB9OwotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGNyZWF0ZVN1Ym1pdFJlcXVlc3RGb3JTdHJlYW1zKHN0cmVhbXMsIC8qY291bnQqLzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcmVxdWVzdHMqL05VTV9SRVFVRVNUUykpOwotCi0gICAgdWludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gMDsKLSAgICBpbnQgbnVtRnJhbWVzOwotCi0gICAgLy8gQ29uc3VtZSBhIGNvdXBsZSBvZiByZXN1bHRzCi0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IE5VTV9SRVFVRVNUUyAmJiBsYXN0RnJhbWVOdW1iZXIgPCBOVU1fUkVRVUVTVFM7ICsraSkgewotICAgICAgICBFWFBFQ1RfTFQoMCwgKG51bUZyYW1lcyA9IG1DYW1lcmEtPndhaXRGb3JGcmFtZUJ1ZmZlcihzdHJlYW1JZCkpKTsKLQotICAgICAgICBkb3V0IDw8ICJEcm9wcGVkICIgPDwgKG51bUZyYW1lcyAtIDEpIDw8ICIgZnJhbWVzIiA8PCBzdGQ6OmVuZGw7Ci0KLSAgICAgICAgLy8gU2tpcCB0aGUgY291bnRlciBhaGVhZCwgZG9uJ3QgdHJ5IHRvIGNvbnN1bWUgdGhlc2UgZnJhbWVzIGFnYWluCi0gICAgICAgIGkgKz0gbnVtRnJhbWVzLTE7Ci0KLSAgICAgICAgLy8gIkNvbnN1bWUiIHRoZSBidWZmZXIKLSAgICAgICAgQ3B1Q29uc3VtZXI6OkxvY2tlZEJ1ZmZlciBidWY7Ci0KLSAgICAgICAgRVhQRUNUX0VRKE9LLCBjb25zdW1lci0+bG9ja05leHRCdWZmZXIoJmJ1ZikpOwotCi0gICAgICAgIGxhc3RGcmFtZU51bWJlciA9IGJ1Zi5mcmFtZU51bWJlcjsKLQotICAgICAgICBkb3V0IDw8ICJCdWZmZXIgYXN5bmNocm9ub3VzbHkgcmVjZWl2ZWQgb24gc3RyZWFtSWQgPSAiIDw8IHN0cmVhbUlkIDw8Ci0gICAgICAgICAgICAgICAgIiwgZGF0YVB0ciA9ICIgPDwgKHZvaWQqKWJ1Zi5kYXRhIDw8Ci0gICAgICAgICAgICAgICAgIiwgdGltZXN0YW1wID0gIiA8PCBidWYudGltZXN0YW1wIDw8Ci0gICAgICAgICAgICAgICAgIiwgZnJhbWVudW1iZXIgPSAiIDw8IGJ1Zi5mcmFtZU51bWJlciA8PCBzdGQ6OmVuZGw7Ci0KLSAgICAgICAgLy8gUHJvY2VzcyBhdCAxMGZwcywgc3RyZWFtIGlzIGF0IDE1ZnBzLgotICAgICAgICAvLyBUaGlzIG1lYW5zIHdlIHdpbGwgZGVmaW5pdGVseSBmaWxsIHVwIHRoZSBidWZmZXIgcXVldWUgd2l0aAotICAgICAgICAvLyBleHRyYSBidWZmZXJzIGFuZCBuZWVkIHRvIGRyb3AgdGhlbS4KLSAgICAgICAgdXNsZWVwKFRFU1RfRlJBTUVfUFJPQ0VTU0lOR19ERUxBWV9VUyk7Ci0KLSAgICAgICAgRVhQRUNUX09LKGNvbnN1bWVyLT51bmxvY2tCdWZmZXIoYnVmKSk7Ci0gICAgfQotCi0gICAgZG91dCA8PCAiRG9uZSBhZnRlciAiIDw8IGkgPDwgIiBpdGVyYXRpb25zICIgPDwgc3RkOjplbmRsOwotCi0gICAgLy8gRG9uZTogY2xlYW4gdXAKLSAgICBFWFBFQ1RfT0sobUNhbWVyYS0+ZGVsZXRlU3RyZWFtKHN0cmVhbUlkKSk7Ci0gICAgRVhQRUNUX09LKG1DYW1lcmEtPmV4Y2x1c2l2ZVVubG9jaygpKTsKLX0KLQotCi0KLS8vVE9ETzogcmVmYWN0b3IgaW50byBzZXBhcmF0ZSBmaWxlCi1URVNUX0YoUHJvQ2FtZXJhVGVzdCwgU2VydmljZUxpc3RlbmVyc1N1YnNjcmliZSkgewotCi0gICAgQVNTRVJUX0VRKDR1LCBzaXplb2YoU2VydmljZUxpc3RlbmVyOjpTdGF0dXMpKTsKLQotICAgIHNwPFNlcnZpY2VMaXN0ZW5lcj4gbGlzdGVuZXIgPSBuZXcgU2VydmljZUxpc3RlbmVyKCk7Ci0KLSAgICBFWFBFQ1RfRVEoQkFEX1ZBTFVFLCBQcm9DYW1lcmE6OnJlbW92ZVNlcnZpY2VMaXN0ZW5lcihsaXN0ZW5lcikpOwotICAgIEVYUEVDVF9PSyhQcm9DYW1lcmE6OmFkZFNlcnZpY2VMaXN0ZW5lcihsaXN0ZW5lcikpOwotCi0gICAgRVhQRUNUX0VRKEFMUkVBRFlfRVhJU1RTLCBQcm9DYW1lcmE6OmFkZFNlcnZpY2VMaXN0ZW5lcihsaXN0ZW5lcikpOwotICAgIEVYUEVDVF9PSyhQcm9DYW1lcmE6OnJlbW92ZVNlcnZpY2VMaXN0ZW5lcihsaXN0ZW5lcikpOwotCi0gICAgRVhQRUNUX0VRKEJBRF9WQUxVRSwgUHJvQ2FtZXJhOjpyZW1vdmVTZXJ2aWNlTGlzdGVuZXIobGlzdGVuZXIpKTsKLX0KLQotLy9UT0RPOiByZWZhY3RvciBpbnRvIHNlcGFyYXRlIGZpbGUKLVRFU1RfRihQcm9DYW1lcmFUZXN0LCBTZXJ2aWNlTGlzdGVuZXJzRnVuY3Rpb25hbCkgewotCi0gICAgc3A8U2VydmljZUxpc3RlbmVyPiBsaXN0ZW5lciA9IG5ldyBTZXJ2aWNlTGlzdGVuZXIoKTsKLQotICAgIEVYUEVDVF9PSyhQcm9DYW1lcmE6OmFkZFNlcnZpY2VMaXN0ZW5lcihsaXN0ZW5lcikpOwotCi0gICAgc3A8Q2FtZXJhPiBjYW0gPSBDYW1lcmE6OmNvbm5lY3QoQ0FNRVJBX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qY2xpZW50UGFja2FnZU5hbWUqL1N0cmluZzE2KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEpOwotICAgIEVYUEVDVF9ORSgodm9pZCopTlVMTCwgY2FtLmdldCgpKTsKLQotICAgIFNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzIHN0YXQgPSBTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19VTktOT1dOOwotICAgIEVYUEVDVF9PSyhsaXN0ZW5lci0+d2FpdEZvclN0YXR1c0NoYW5nZSgvKm91dCovc3RhdCkpOwotCi0gICAgRVhQRUNUX0VRKFNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9BVkFJTEFCTEUsIHN0YXQpOwotCi0gICAgaWYgKGNhbS5nZXQoKSkgewotICAgICAgICBjYW0tPmRpc2Nvbm5lY3QoKTsKLSAgICB9Ci0KLSAgICBFWFBFQ1RfT0sobGlzdGVuZXItPndhaXRGb3JTdGF0dXNDaGFuZ2UoLypvdXQqL3N0YXQpKTsKLSAgICBFWFBFQ1RfRVEoU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfUFJFU0VOVCwgc3RhdCk7Ci0KLSAgICBFWFBFQ1RfT0soUHJvQ2FtZXJhOjpyZW1vdmVTZXJ2aWNlTGlzdGVuZXIobGlzdGVuZXIpKTsKLX0KLQotCi0KLX0KLX0KLX0KLX0KZGlmZiAtLWdpdCBhL2NhbWVyYS90ZXN0cy9WZW5kb3JUYWdEZXNjcmlwdG9yVGVzdHMuY3BwIGIvY2FtZXJhL3Rlc3RzL1ZlbmRvclRhZ0Rlc2NyaXB0b3JUZXN0cy5jcHAKaW5kZXggNjYyNGU3OS4uOTA4MmRiZiAxMDA2NDQKLS0tIGEvY2FtZXJhL3Rlc3RzL1ZlbmRvclRhZ0Rlc2NyaXB0b3JUZXN0cy5jcHAKKysrIGIvY2FtZXJhL3Rlc3RzL1ZlbmRvclRhZ0Rlc2NyaXB0b3JUZXN0cy5jcHAKQEAgLTUzLDYgKzUzLDEwIEBACiAKIGV4dGVybiAiQyIgewogCitzdGF0aWMgaW50IHplcm9fZ2V0X3RhZ19jb3VudChjb25zdCB2ZW5kb3JfdGFnX29wc190KiB2T3BzKSB7CisgICAgcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgZGVmYXVsdF9nZXRfdGFnX2NvdW50KGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIHZPcHMpIHsKICAgICByZXR1cm4gVkVORE9SX1RBR19DT1VOVF9FUlI7CiB9CkBAIC0xNzMsMTAgKzE3NywxMyBAQAogICAgIHZlbmRvcl90YWdfb3BzX3Qgdk9wczsKICAgICBGaWxsV2l0aERlZmF1bHRzKCZ2T3BzKTsKIAorICAgIC8vIE1ha2UgZW1wdHkgdGFnIGNvdW50CisgICAgdk9wcy5nZXRfdGFnX2NvdW50ID0gemVyb19nZXRfdGFnX2NvdW50OworCiAgICAgLy8gRW5zdXJlIGNyZWF0ZSBmYWlscyB3aGVuIHVzaW5nIG51bGwgdk9wcwogICAgIEVYUEVDVF9FUShCQURfVkFMVUUsIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZURlc2NyaXB0b3JGcm9tT3BzKC8qdk9wcyovTlVMTCwgdkRlc2MpKTsKIAotICAgIC8vIEVuc3VyZSBjcmVhdGUgd29ya3Mgd2hlbiB0aGVyZSBhcmUgbm8gdnRhZ3MgZGVmaW5lZCBpbiBhIHdlbGwtZm9ybWVkIHZPcHMKKyAgICAvLyBFbnN1cmUgY3JlYXQgc3VjY2VlZHMgZm9yIGVtcHR5IHZlbmRvciB0YWcgb3BzCiAgICAgQVNTRVJUX0VRKE9LLCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbU9wcygmdk9wcywgdkRlc2MpKTsKIAogICAgIC8vIEVuc3VyZSBkZWZhdWx0cyBhcmUgcmV0dXJuZWQgd2hlbiBubyB2dGFncyBhcmUgZGVmaW5lZCwgb3IgdGFnIGlzIHVua25vd24KZGlmZiAtLWdpdCBhL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAgYi9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwCmluZGV4IDAyZGYxZDIuLjM2YTdlNzMgMTAwNjQ0Ci0tLSBhL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAKKysrIGIvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcApAQCAtMjMsNyArMjMsMTAgQEAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKwogI2luY2x1ZGUgPHRlcm1pb3MuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIApAQCAtNjM3LDcgKzY0MCwxMyBAQAogICAgICAgICBjYXNlIEZPUk1BVF9NUDQ6IHsKICAgICAgICAgICAgIC8vIENvbmZpZ3VyZSBtdXhlci4gIFdlIGhhdmUgdG8gd2FpdCBmb3IgdGhlIENTRCBibG9iIGZyb20gdGhlIGVuY29kZXIKICAgICAgICAgICAgIC8vIGJlZm9yZSB3ZSBjYW4gc3RhcnQgaXQuCi0gICAgICAgICAgICBtdXhlciA9IG5ldyBNZWRpYU11eGVyKGZpbGVOYW1lLCBNZWRpYU11eGVyOjpPVVRQVVRfRk9STUFUX01QRUdfNCk7CisgICAgICAgICAgICBpbnQgZmQgPSBvcGVuKGZpbGVOYW1lLCBPX0NSRUFUIHwgT19MQVJHRUZJTEUgfCBPX1RSVU5DIHwgT19SRFdSLCBTX0lSVVNSIHwgU19JV1VTUik7CisgICAgICAgICAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogY291bGRuJ3Qgb3BlbiBmaWxlXG4iKTsKKyAgICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXV4ZXIgPSBuZXcgTWVkaWFNdXhlcihmZCwgTWVkaWFNdXhlcjo6T1VUUFVUX0ZPUk1BVF9NUEVHXzQpOworICAgICAgICAgICAgY2xvc2UoZmQpOwogICAgICAgICAgICAgaWYgKGdSb3RhdGUpIHsKICAgICAgICAgICAgICAgICBtdXhlci0+c2V0T3JpZW50YXRpb25IaW50KDkwKTsgIC8vIFRPRE86IGRvZXMgdGhpcyBkbyBhbnl0aGluZz8KICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tayBiL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tawppbmRleCA1NjFjZTAyLi4yMGMwMDk0IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsKKysrIGIvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rCkBAIC0xNyw3ICsxNyw4IEBACiAJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCiAJZXh0ZXJuYWwvanBlZyBcCiAKLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIApAQCAtNDAsNyArNDEsOCBAQAogCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAogCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCitMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgLVdlcnJvciAtV2FsbAorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCkBAIC02Myw3ICs2NSw4IEBACiAJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCiAJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKQEAgLTg3LDcgKzkwLDggQEAKIAlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIApAQCAtMTEwLDcgKzExNCw4IEBACiAJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCiAJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKQEAgLTEzMyw3ICsxMzgsOCBAQAogCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAogCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCitMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgLVdlcnJvciAtV2FsbAorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCkBAIC0xNTcsNyArMTYzLDggQEAKIAlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIApAQCAtMTY5LDYgKzE3Niw0OSBAQAogCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAorTE9DQUxfU1JDX0ZJTEVTOj0gXAorCWZpbHRlcnMvYXJnYnRvcmdiYS5ycyBcCisJZmlsdGVycy9uaWdodHZpc2lvbi5ycyBcCisJZmlsdGVycy9zYXR1cmF0aW9uLnJzIFwKKwltZWRpYWZpbHRlci5jcHAgXAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJzdGFnZWZyaWdodCBcCisJbGlibG9nIFwKKwlsaWJ1dGlscyBcCisJbGliYmluZGVyIFwKKwlsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKKwlsaWJtZWRpYSBcCisJbGliZ3VpIFwKKwlsaWJjdXRpbHMgXAorCWxpYnVpIFwKKwlsaWJSU2NwcCBcCisKK0xPQ0FMX0NfSU5DTFVERVM6PSBcCisJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAorCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAorCSQoVE9QKS9mcmFtZXdvcmtzL3JzL2NwcCBcCisJJChUT1ApL2ZyYW1ld29ya3MvcnMgXAorCitpbnRlcm1lZGlhdGVzIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsU1RBVElDX0xJQlJBUklFUyxsaWJSUyxUQVJHRVQsKQorTE9DQUxfQ19JTkNMVURFUyArPSAkKGludGVybWVkaWF0ZXMpCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVM6PSBcCisJbGlic3RhZ2VmcmlnaHRfbWVkaWFmaWx0ZXIKKworTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfTU9EVUxFOj0gbWVkaWFmaWx0ZXIKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCiBMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgIFwKICAgICAgICAgbXV4ZXIuY3BwICAgICAgICAgICAgXAogCkBAIC0xODAsNyArMjMwLDggQEAKIAlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIApkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9TaW1wbGVQbGF5ZXIuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9TaW1wbGVQbGF5ZXIuY3BwCmluZGV4IDRiMmY5ODAuLjUwOTEzY2QgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvU2ltcGxlUGxheWVyLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L1NpbXBsZVBsYXllci5jcHAKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlICJTaW1wbGVQbGF5ZXIuaCIKIAogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CkBAIC0yOSw3ICszMCw2IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L05hdGl2ZVdpbmRvd1dyYXBwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTU5LDQ3ICs1OSw0NiBAQAogICAgIHJldHVybiBlcnI7CiB9CiBzdGF0dXNfdCBTaW1wbGVQbGF5ZXI6OnNldERhdGFTb3VyY2UoY29uc3QgY2hhciAqcGF0aCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXREYXRhU291cmNlLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0RGF0YVNvdXJjZSwgdGhpcyk7CiAgICAgbXNnLT5zZXRTdHJpbmcoInBhdGgiLCBwYXRoKTsKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CiAgICAgcmV0dXJuIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKIH0KIAogc3RhdHVzX3QgU2ltcGxlUGxheWVyOjpzZXRTdXJmYWNlKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZidWZmZXJQcm9kdWNlcikgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRTdXJmYWNlLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0U3VyZmFjZSwgdGhpcyk7CiAKICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlOwogICAgIGlmIChidWZmZXJQcm9kdWNlciAhPSBOVUxMKSB7CiAgICAgICAgIHN1cmZhY2UgPSBuZXcgU3VyZmFjZShidWZmZXJQcm9kdWNlcik7CiAgICAgfQogCi0gICAgbXNnLT5zZXRPYmplY3QoCi0gICAgICAgICAgICAibmF0aXZlLXdpbmRvdyIsIG5ldyBOYXRpdmVXaW5kb3dXcmFwcGVyKHN1cmZhY2UpKTsKKyAgICBtc2ctPnNldE9iamVjdCgic3VyZmFjZSIsIHN1cmZhY2UpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwogICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7CiB9CiAKIHN0YXR1c190IFNpbXBsZVBsYXllcjo6cHJlcGFyZSgpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UHJlcGFyZSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFByZXBhcmUsIHRoaXMpOwogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKICAgICByZXR1cm4gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOwogfQogCiBzdGF0dXNfdCBTaW1wbGVQbGF5ZXI6OnN0YXJ0KCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCB0aGlzKTsKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CiAgICAgcmV0dXJuIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKIH0KIAogc3RhdHVzX3QgU2ltcGxlUGxheWVyOjpzdG9wKCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgdGhpcyk7CiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwogICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7CiB9CiAKIHN0YXR1c190IFNpbXBsZVBsYXllcjo6cmVzZXQoKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlc2V0LCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVzZXQsIHRoaXMpOwogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKICAgICByZXR1cm4gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOwogfQpAQCAtMTE2LDcgKzExNSw3IEBACiAgICAgICAgICAgICAgICAgbVN0YXRlID0gVU5QUkVQQVJFRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CkBAIC0xMzIsMTQgKzEzMSwxMiBAQAogICAgICAgICAgICAgICAgIGVyciA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJuYXRpdmUtd2luZG93IiwgJm9iaikpOwotCi0gICAgICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdyA9IHN0YXRpY19jYXN0PE5hdGl2ZVdpbmRvd1dyYXBwZXIgKj4ob2JqLmdldCgpKTsKLQorICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgic3VyZmFjZSIsICZvYmopKTsKKyAgICAgICAgICAgICAgICBtU3VyZmFjZSA9IHN0YXRpY19jYXN0PFN1cmZhY2UgKj4ob2JqLmdldCgpKTsKICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CkBAIC0xNjEsNyArMTU4LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwpAQCAtMTk0LDcgKzE5MSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKQEAgLTIxNyw3ICsyMTQsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CkBAIC0yNDAsNyArMjM3LDcgQEAKICAgICAgICAgICAgICAgICBtU3RhdGUgPSBVTklOSVRJQUxJWkVEOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKQEAgLTMyNCw3ICszMjEsNyBAQAogCiAgICAgICAgIGVyciA9IHN0YXRlLT5tQ29kZWMtPmNvbmZpZ3VyZSgKICAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgaXNWaWRlbyA/IG1OYXRpdmVXaW5kb3ctPmdldFN1cmZhY2VUZXh0dXJlQ2xpZW50KCkgOiBOVUxMLAorICAgICAgICAgICAgICAgIGlzVmlkZW8gPyBtU3VyZmFjZSA6IE5VTEwsCiAgICAgICAgICAgICAgICAgTlVMTCAvKiBjcnlwdG8gKi8sCiAgICAgICAgICAgICAgICAgMCAvKiBmbGFncyAqLyk7CiAKQEAgLTM4Miw3ICszNzksNyBAQAogCiAgICAgbVN0YXJ0VGltZVJlYWxVcyA9IC0xbGw7CiAKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RG9Nb3JlU3R1ZmYsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREb01vcmVTdHVmZiwgdGhpcyk7CiAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsICsrbURvTW9yZVN0dWZmR2VuZXJhdGlvbik7CiAgICAgbXNnLT5wb3N0KCk7CiAKQEAgLTQxMSw3ICs0MDgsNyBAQAogICAgIG1TdGF0ZUJ5VHJhY2tJbmRleC5jbGVhcigpOwogICAgIG1Db2RlY0xvb3Blci5jbGVhcigpOwogICAgIG1FeHRyYWN0b3IuY2xlYXIoKTsKLSAgICBtTmF0aXZlV2luZG93LmNsZWFyKCk7CisgICAgbVN1cmZhY2UuY2xlYXIoKTsKICAgICBtUGF0aC5jbGVhcigpOwogCiAgICAgcmV0dXJuIE9LOwpAQCAtNDI4LDEyICs0MjUsMTIgQEAKICAgICAgICAgICAgIGVyciA9IHN0YXRlLT5tQ29kZWMtPmRlcXVldWVJbnB1dEJ1ZmZlcigmaW5kZXgpOwogCiAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImRlcXVldWVkIGlucHV0IGJ1ZmZlciBvbiB0cmFjayAlZCIsCisgICAgICAgICAgICAgICAgQUxPR1YoImRlcXVldWVkIGlucHV0IGJ1ZmZlciBvbiB0cmFjayAlenUiLAogICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZUJ5VHJhY2tJbmRleC5rZXlBdChpKSk7CiAKICAgICAgICAgICAgICAgICBzdGF0ZS0+bUF2YWlsSW5wdXRCdWZmZXJJbmRpY2VzLnB1c2hfYmFjayhpbmRleCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJkZXF1ZXVlSW5wdXRCdWZmZXIgb24gdHJhY2sgJWQgcmV0dXJuZWQgJWQiLAorICAgICAgICAgICAgICAgIEFMT0dWKCJkZXF1ZXVlSW5wdXRCdWZmZXIgb24gdHJhY2sgJXp1IHJldHVybmVkICVkIiwKICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGVCeVRyYWNrSW5kZXgua2V5QXQoaSksIGVycik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gd2hpbGUgKGVyciA9PSBPSyk7CkBAIC00NDgsNyArNDQ1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgJmluZm8ubUZsYWdzKTsKIAogICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIEFMT0dWKCJkZXF1ZXVlZCBvdXRwdXQgYnVmZmVyIG9uIHRyYWNrICVkIiwKKyAgICAgICAgICAgICAgICBBTE9HVigiZGVxdWV1ZWQgb3V0cHV0IGJ1ZmZlciBvbiB0cmFjayAlenUiLAogICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZUJ5VHJhY2tJbmRleC5rZXlBdChpKSk7CiAKICAgICAgICAgICAgICAgICBzdGF0ZS0+bUF2YWlsT3V0cHV0QnVmZmVySW5mb3MucHVzaF9iYWNrKGluZm8pOwpAQCAtNDU5LDcgKzQ1Niw3IEBACiAgICAgICAgICAgICAgICAgZXJyID0gc3RhdGUtPm1Db2RlYy0+Z2V0T3V0cHV0QnVmZmVycygmc3RhdGUtPm1CdWZmZXJzWzFdKTsKICAgICAgICAgICAgICAgICBDSEVDS19FUShlcnIsIChzdGF0dXNfdClPSyk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJkZXF1ZXVlT3V0cHV0QnVmZmVyIG9uIHRyYWNrICVkIHJldHVybmVkICVkIiwKKyAgICAgICAgICAgICAgICBBTE9HVigiZGVxdWV1ZU91dHB1dEJ1ZmZlciBvbiB0cmFjayAlenUgcmV0dXJuZWQgJWQiLAogICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZUJ5VHJhY2tJbmRleC5rZXlBdChpKSwgZXJyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSB3aGlsZSAoZXJyID09IE9LCkBAIC01MDIsNyArNDk5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgMCk7CiAgICAgICAgICAgICBDSEVDS19FUShlcnIsIChzdGF0dXNfdClPSyk7CiAKLSAgICAgICAgICAgIEFMT0dWKCJlbnF1ZXVlZCBpbnB1dCBkYXRhIG9uIHRyYWNrICVkIiwgdHJhY2tJbmRleCk7CisgICAgICAgICAgICBBTE9HVigiZW5xdWV1ZWQgaW5wdXQgZGF0YSBvbiB0cmFjayAlenUiLCB0cmFja0luZGV4KTsKIAogICAgICAgICAgICAgZXJyID0gbUV4dHJhY3Rvci0+YWR2YW5jZSgpOwogICAgICAgICAgICAgQ0hFQ0tfRVEoZXJyLCAoc3RhdHVzX3QpT0spOwpAQCAtNTI4LDggKzUyNSw4IEBACiAgICAgICAgICAgICAgICAgYm9vbCByZWxlYXNlID0gdHJ1ZTsKIAogICAgICAgICAgICAgICAgIGlmIChsYXRlQnlVcyA+IDMwMDAwbGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0koInRyYWNrICVkIGJ1ZmZlciBsYXRlIGJ5ICVsbGQgdXMsIGRyb3BwaW5nLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZUJ5VHJhY2tJbmRleC5rZXlBdChpKSwgbGF0ZUJ5VXMpOworICAgICAgICAgICAgICAgICAgICBBTE9HSSgidHJhY2sgJXp1IGJ1ZmZlciBsYXRlIGJ5ICVsbGQgdXMsIGRyb3BwaW5nLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZUJ5VHJhY2tJbmRleC5rZXlBdChpKSwgKGxvbmcgbG9uZylsYXRlQnlVcyk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tQ29kZWMtPnJlbGVhc2VPdXRwdXRCdWZmZXIoaW5mby0+bUluZGV4KTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPm1BdWRpb1RyYWNrICE9IE5VTEwpIHsKQEAgLTU1OCw4ICs1NTUsOCBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJ0cmFjayAlZCBidWZmZXIgZWFybHkgYnkgJWxsZCB1cy4iLAotICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZUJ5VHJhY2tJbmRleC5rZXlBdChpKSwgLWxhdGVCeVVzKTsKKyAgICAgICAgICAgICAgICBBTE9HVigidHJhY2sgJXp1IGJ1ZmZlciBlYXJseSBieSAlbGxkIHVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlQnlUcmFja0luZGV4LmtleUF0KGkpLCAobG9uZyBsb25nKS1sYXRlQnlVcyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTU2OSw3ICs1NjYsNyBAQAogfQogCiBzdGF0dXNfdCBTaW1wbGVQbGF5ZXI6Om9uT3V0cHV0Rm9ybWF0Q2hhbmdlZCgKLSAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXgsIENvZGVjU3RhdGUgKnN0YXRlKSB7CisgICAgICAgIHNpemVfdCB0cmFja0luZGV4IF9fdW51c2VkLCBDb2RlY1N0YXRlICpzdGF0ZSkgewogICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CiAgICAgc3RhdHVzX3QgZXJyID0gc3RhdGUtPm1Db2RlYy0+Z2V0T3V0cHV0Rm9ybWF0KCZmb3JtYXQpOwogCkBAIC02NDAsNyArNjM3LDcgQEAKICAgICBpZiAoZGVsYXlVcyA+IDIwMDBsbCkgewogICAgICAgICBBTE9HVygiQXVkaW9UcmFjazo6d3JpdGUgdG9vayAlbGxkIHVzLCBudW1GcmFtZXNBdmFpbGFibGVUb1dyaXRlPSV1LCAiCiAgICAgICAgICAgICAgICJudW1GcmFtZXNXcml0dGVuPSV1IiwKLSAgICAgICAgICAgICAgZGVsYXlVcywgbnVtRnJhbWVzQXZhaWxhYmxlVG9Xcml0ZSwgbnVtRnJhbWVzV3JpdHRlbik7CisgICAgICAgICAgICAgIChsb25nIGxvbmcpZGVsYXlVcywgbnVtRnJhbWVzQXZhaWxhYmxlVG9Xcml0ZSwgbnVtRnJhbWVzV3JpdHRlbik7CiAgICAgfQogCiAgICAgaW5mby0+bU9mZnNldCArPSBuYnl0ZXM7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L1NpbXBsZVBsYXllci5oIGIvY21kcy9zdGFnZWZyaWdodC9TaW1wbGVQbGF5ZXIuaAppbmRleCAwYTA2MDU5Li5hZTlkZmQyIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L1NpbXBsZVBsYXllci5oCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvU2ltcGxlUGxheWVyLmgKQEAgLTIzLDEwICsyMywxMCBAQAogc3RydWN0IEFCdWZmZXI7CiBzdHJ1Y3QgQUxvb3BlcjsKIHN0cnVjdCBBdWRpb1RyYWNrOwotc3RydWN0IElHcmFwaGljQnVmZmVyUHJvZHVjZXI7CitjbGFzcyBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwogc3RydWN0IE1lZGlhQ29kZWM7Ci1zdHJ1Y3QgTmF0aXZlV2luZG93V3JhcHBlcjsKIHN0cnVjdCBOdU1lZGlhRXh0cmFjdG9yOworY2xhc3MgU3VyZmFjZTsKIAogc3RydWN0IFNpbXBsZVBsYXllciA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgU2ltcGxlUGxheWVyKCk7CkBAIC04NCw3ICs4NCw3IEBACiAKICAgICBTdGF0ZSBtU3RhdGU7CiAgICAgQVN0cmluZyBtUGF0aDsKLSAgICBzcDxOYXRpdmVXaW5kb3dXcmFwcGVyPiBtTmF0aXZlV2luZG93OworICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlOwogCiAgICAgc3A8TnVNZWRpYUV4dHJhY3Rvcj4gbUV4dHJhY3RvcjsKICAgICBzcDxBTG9vcGVyPiBtQ29kZWNMb29wZXI7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L2F1ZGlvbG9vcC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L2F1ZGlvbG9vcC5jcHAKaW5kZXggOTYwNzNmMS4uNmU5ZTZlYyAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9hdWRpb2xvb3AuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvYXVkaW9sb29wLmNwcApAQCAtMTQsNiArMTQsMTIgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorCiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtMzAsNyArMzYsNyBAQAogCiBzdGF0aWMgdm9pZCB1c2FnZShjb25zdCBjaGFyKiBuYW1lKQogewotICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstZCBkdXJhdGlvbl0gWy1tXSBbLXddIFs8b3V0cHV0LWZpbGU+XVxuIiwgbmFtZSk7CisgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgWy1kIGR1LnJhdGlvbl0gWy1tXSBbLXddIFs8b3V0cHV0LWZpbGU+XVxuIiwgbmFtZSk7CiAgICAgZnByaW50ZihzdGRlcnIsICJFbmNvZGVzIGVpdGhlciBhIHNpbmUgd2F2ZSBvciBtaWNyb3Bob25lIGlucHV0IHRvIEFNUiBmb3JtYXRcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1kICAgIGR1cmF0aW9uIGluIHNlY29uZHMsIGRlZmF1bHQgNSBzZWNvbmRzXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtbSAgICB1c2UgbWljcm9waG9uZSBmb3IgaW5wdXQsIGRlZmF1bHQgc2luZSBzb3VyY2VcbiIpOwpAQCAtODEsNiArODcsNyBAQAogICAgICAgICAvLyB0YWxrIGludG8gdGhlIGFwcHJvcHJpYXRlIG1pY3JvcGhvbmUgZm9yIHRoZSBkdXJhdGlvbgogICAgICAgICBzb3VyY2UgPSBuZXcgQXVkaW9Tb3VyY2UoCiAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywKKyAgICAgICAgICAgICAgICBTdHJpbmcxNigpLAogICAgICAgICAgICAgICAgIGtTYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgIGNoYW5uZWxzKTsKICAgICB9IGVsc2UgewpAQCAtMTA5LDcgKzExNiwxMiBAQAogCiAgICAgaWYgKGZpbGVPdXQgIT0gTlVMTCkgewogICAgICAgICAvLyB0YXJnZXQgZmlsZSBzcGVjaWZpZWQsIHdyaXRlIGVuY29kZWQgQU1SIG91dHB1dAotICAgICAgICBzcDxBTVJXcml0ZXI+IHdyaXRlciA9IG5ldyBBTVJXcml0ZXIoZmlsZU91dCk7CisgICAgICAgIGludCBmZCA9IG9wZW4oZmlsZU91dCwgT19DUkVBVCB8IE9fTEFSR0VGSUxFIHwgT19UUlVOQyB8IE9fUkRXUiwgU19JUlVTUiB8IFNfSVdVU1IpOworICAgICAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBzcDxBTVJXcml0ZXI+IHdyaXRlciA9IG5ldyBBTVJXcml0ZXIoZmQpOworICAgICAgICBjbG9zZShmZCk7CiAgICAgICAgIHdyaXRlci0+YWRkU291cmNlKGVuY29kZXIpOwogICAgICAgICB3cml0ZXItPnN0YXJ0KCk7CiAgICAgICAgIHNsZWVwKGR1cmF0aW9uKTsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9jb2RlYy5jcHAKaW5kZXggZmQwMmJjYy4uZGFlOWJiZSAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9jb2RlYy5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9jb2RlYy5jcHAKQEAgLTQ1LDkgKzQ1LDEwIEBACiAgICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgWy1hXSB1c2UgYXVkaW9cbiIKICAgICAgICAgICAgICAgICAgICAgIlx0XHRbLXZdIHVzZSB2aWRlb1xuIgogICAgICAgICAgICAgICAgICAgICAiXHRcdFstcF0gcGxheWJhY2tcbiIKLSAgICAgICAgICAgICAgICAgICAgIlx0XHRbLVNdIGFsbG9jYXRlIGJ1ZmZlcnMgZnJvbSBhIHN1cmZhY2VcbiIsCisgICAgICAgICAgICAgICAgICAgICJcdFx0Wy1TXSBhbGxvY2F0ZSBidWZmZXJzIGZyb20gYSBzdXJmYWNlXG4iCisgICAgICAgICAgICAgICAgICAgICJcdFx0Wy1SXSByZW5kZXIgb3V0cHV0IHRvIHN1cmZhY2UgKGVuYWJsZXMgLVMpXG4iCisgICAgICAgICAgICAgICAgICAgICJcdFx0Wy1UXSB1c2UgcmVuZGVyIHRpbWVzdGFtcHMgKGVuYWJsZXMgLVIpXG4iLAogICAgICAgICAgICAgICAgICAgICBtZSk7Ci0KICAgICBleGl0KDEpOwogfQogCkBAIC03MSw3ICs3Miw5IEBACiAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsCiAgICAgICAgIGJvb2wgdXNlQXVkaW8sCiAgICAgICAgIGJvb2wgdXNlVmlkZW8sCi0gICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OlN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OlN1cmZhY2U+ICZzdXJmYWNlLAorICAgICAgICBib29sIHJlbmRlclN1cmZhY2UsCisgICAgICAgIGJvb2wgdXNlVGltZXN0YW1wKSB7CiAgICAgdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKICAgICBzdGF0aWMgaW50NjRfdCBrVGltZW91dCA9IDUwMGxsOwpAQCAtMTA1LDcgKzEwOCw3IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIEFMT0dWKCJzZWxlY3RpbmcgdHJhY2sgJWQiLCBpKTsKKyAgICAgICAgQUxPR1YoInNlbGVjdGluZyB0cmFjayAlenUiLCBpKTsKIAogICAgICAgICBlcnIgPSBleHRyYWN0b3ItPnNlbGVjdFRyYWNrKGkpOwogICAgICAgICBDSEVDS19FUShlcnIsIChzdGF0dXNfdClPSyk7CkBAIC0xMzYsNiArMTM5LDcgQEAKICAgICBDSEVDSyghc3RhdGVCeVRyYWNrLmlzRW1wdHkoKSk7CiAKICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICBpbnQ2NF90IHN0YXJ0VGltZVJlbmRlciA9IC0xOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0ZUJ5VHJhY2suc2l6ZSgpOyArK2kpIHsKICAgICAgICAgQ29kZWNTdGF0ZSAqc3RhdGUgPSAmc3RhdGVCeVRyYWNrLmVkaXRWYWx1ZUF0KGkpOwpAQCAtMTQ3LDcgKzE1MSw3IEBACiAgICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgY29kZWMtPmdldElucHV0QnVmZmVycygmc3RhdGUtPm1JbkJ1ZmZlcnMpKTsKICAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBjb2RlYy0+Z2V0T3V0cHV0QnVmZmVycygmc3RhdGUtPm1PdXRCdWZmZXJzKSk7CiAKLSAgICAgICAgQUxPR1YoImdvdCAlZCBpbnB1dCBhbmQgJWQgb3V0cHV0IGJ1ZmZlcnMiLAorICAgICAgICBBTE9HVigiZ290ICV6dSBpbnB1dCBhbmQgJXp1IG91dHB1dCBidWZmZXJzIiwKICAgICAgICAgICAgICAgc3RhdGUtPm1JbkJ1ZmZlcnMuc2l6ZSgpLCBzdGF0ZS0+bU91dEJ1ZmZlcnMuc2l6ZSgpKTsKICAgICB9CiAKQEAgLTE2OCw3ICsxNzIsNyBAQAogICAgICAgICAgICAgICAgIGVyciA9IHN0YXRlLT5tQ29kZWMtPmRlcXVldWVJbnB1dEJ1ZmZlcigmaW5kZXgsIGtUaW1lb3V0KTsKIAogICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImZpbGxpbmcgaW5wdXQgYnVmZmVyICVkIiwgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiZmlsbGluZyBpbnB1dCBidWZmZXIgJXp1IiwgaW5kZXgpOwogCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIgPSBzdGF0ZS0+bUluQnVmZmVycy5pdGVtQXQoaW5kZXgpOwogCkBAIC0yMDUsNyArMjA5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tQ29kZWMtPmRlcXVldWVJbnB1dEJ1ZmZlcigmaW5kZXgsIGtUaW1lb3V0KTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigic2lnbmFsbGluZyBpbnB1dCBFT1Mgb24gdHJhY2sgJWQiLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGlucHV0IEVPUyBvbiB0cmFjayAlenUiLCBpKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gc3RhdGUtPm1Db2RlYy0+cXVldWVJbnB1dEJ1ZmZlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCkBAIC0yNTQsMTMgKzI1OCwyOSBAQAogICAgICAgICAgICAgICAgICAgICBrVGltZW91dCk7CiAKICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiZHJhaW5pbmcgb3V0cHV0IGJ1ZmZlciAlZCwgdGltZSA9ICVsbGQgdXMiLAotICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBwcmVzZW50YXRpb25UaW1lVXMpOworICAgICAgICAgICAgICAgIEFMT0dWKCJkcmFpbmluZyBvdXRwdXQgYnVmZmVyICV6dSwgdGltZSA9ICVsbGQgdXMiLAorICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCAobG9uZyBsb25nKXByZXNlbnRhdGlvblRpbWVVcyk7CiAKICAgICAgICAgICAgICAgICArK3N0YXRlLT5tTnVtQnVmZmVyc0RlY29kZWQ7CiAgICAgICAgICAgICAgICAgc3RhdGUtPm1OdW1CeXRlc0RlY29kZWQgKz0gc2l6ZTsKIAotICAgICAgICAgICAgICAgIGVyciA9IHN0YXRlLT5tQ29kZWMtPnJlbGVhc2VPdXRwdXRCdWZmZXIoaW5kZXgpOworICAgICAgICAgICAgICAgIGlmIChzdXJmYWNlID09IE5VTEwgfHwgIXJlbmRlclN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gc3RhdGUtPm1Db2RlYy0+cmVsZWFzZU91dHB1dEJ1ZmZlcihpbmRleCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1c2VUaW1lc3RhbXApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0VGltZVJlbmRlciA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVnaW4gcmVuZGVyaW5nIDIgdnN5bmNzICh+MzNtcykgYWZ0ZXIgZmlyc3QgZGVjb2RlCisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWVSZW5kZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykgKyAzMzAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIChwcmVzZW50YXRpb25UaW1lVXMgKiAxMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb25UaW1lVXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcmVzZW50YXRpb25UaW1lVXMgKiAxMDAwKSArIHN0YXJ0VGltZVJlbmRlcjsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gc3RhdGUtPm1Db2RlYy0+cmVuZGVyT3V0cHV0QnVmZmVyQW5kUmVsZWFzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwgcHJlc2VudGF0aW9uVGltZVVzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBzdGF0ZS0+bUNvZGVjLT5yZW5kZXJPdXRwdXRCdWZmZXJBbmRSZWxlYXNlKGluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBDSEVDS19FUShlcnIsIChzdGF0dXNfdClPSyk7CiAKICAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1MpIHsKQEAgLTI3Myw3ICsyOTMsNyBAQAogICAgICAgICAgICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bUNvZGVjLT5nZXRPdXRwdXRCdWZmZXJzKCZzdGF0ZS0+bU91dEJ1ZmZlcnMpKTsKIAotICAgICAgICAgICAgICAgIEFMT0dWKCJnb3QgJWQgb3V0cHV0IGJ1ZmZlcnMiLCBzdGF0ZS0+bU91dEJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiZ290ICV6dSBvdXRwdXQgYnVmZmVycyIsIHN0YXRlLT5tT3V0QnVmZmVycy5zaXplKCkpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgewogICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CiAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBzdGF0ZS0+bUNvZGVjLT5nZXRPdXRwdXRGb3JtYXQoJmZvcm1hdCkpOwpAQCAtMjkzLDE3ICszMTMsMTcgQEAKICAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBzdGF0ZS0+bUNvZGVjLT5yZWxlYXNlKCkpOwogCiAgICAgICAgIGlmIChzdGF0ZS0+bUlzQXVkaW8pIHsKLSAgICAgICAgICAgIHByaW50ZigidHJhY2sgJXp1OiAlIiBQUklkNjQgIiBieXRlcyByZWNlaXZlZC4gJS4yZiBLQi9zZWNcbiIsCisgICAgICAgICAgICBwcmludGYoInRyYWNrICV6dTogJWxsZCBieXRlcyByZWNlaXZlZC4gJS4yZiBLQi9zZWNcbiIsCiAgICAgICAgICAgICAgICAgICAgaSwKLSAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bU51bUJ5dGVzRGVjb2RlZCwKKyAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXN0YXRlLT5tTnVtQnl0ZXNEZWNvZGVkLAogICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tTnVtQnl0ZXNEZWNvZGVkICogMUU2IC8gMTAyNCAvIGVsYXBzZWRUaW1lVXMpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJpbnRmKCJ0cmFjayAlenU6ICUiIFBSSWQ2NCAiIGZyYW1lcyBkZWNvZGVkLCAlLjJmIGZwcy4gJSIgUFJJZDY0CisgICAgICAgICAgICBwcmludGYoInRyYWNrICV6dTogJWxsZCBmcmFtZXMgZGVjb2RlZCwgJS4yZiBmcHMuICVsbGQiCiAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgcmVjZWl2ZWQuICUuMmYgS0Ivc2VjXG4iLAogICAgICAgICAgICAgICAgICAgIGksCi0gICAgICAgICAgICAgICAgICAgc3RhdGUtPm1OdW1CdWZmZXJzRGVjb2RlZCwKKyAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXN0YXRlLT5tTnVtQnVmZmVyc0RlY29kZWQsCiAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1OdW1CdWZmZXJzRGVjb2RlZCAqIDFFNiAvIGVsYXBzZWRUaW1lVXMsCi0gICAgICAgICAgICAgICAgICAgc3RhdGUtPm1OdW1CeXRlc0RlY29kZWQsCisgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzdGF0ZS0+bU51bUJ5dGVzRGVjb2RlZCwKICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bU51bUJ5dGVzRGVjb2RlZCAqIDFFNiAvIDEwMjQgLyBlbGFwc2VkVGltZVVzKTsKICAgICAgICAgfQogICAgIH0KQEAgLTMyMCwzNCArMzQwLDQyIEBACiAgICAgYm9vbCB1c2VWaWRlbyA9IGZhbHNlOwogICAgIGJvb2wgcGxheWJhY2sgPSBmYWxzZTsKICAgICBib29sIHVzZVN1cmZhY2UgPSBmYWxzZTsKKyAgICBib29sIHJlbmRlclN1cmZhY2UgPSBmYWxzZTsKKyAgICBib29sIHVzZVRpbWVzdGFtcCA9IGZhbHNlOwogCiAgICAgaW50IHJlczsKLSAgICB3aGlsZSAoKHJlcyA9IGdldG9wdChhcmdjLCBhcmd2LCAiaGF2cFNEIikpID49IDApIHsKKyAgICB3aGlsZSAoKHJlcyA9IGdldG9wdChhcmdjLCBhcmd2LCAiaGF2cFNEUlQiKSkgPj0gMCkgewogICAgICAgICBzd2l0Y2ggKHJlcykgewogICAgICAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdXNlQXVkaW8gPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBjYXNlICd2JzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB1c2VWaWRlbyA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIGNhc2UgJ3AnOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHBsYXliYWNrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgY2FzZSAnVCc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNlVGltZXN0YW1wID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgY2FzZSAnUic6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVuZGVyU3VyZmFjZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKICAgICAgICAgICAgIGNhc2UgJ1MnOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHVzZVN1cmZhY2UgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBjYXNlICc/JzoKICAgICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTM5MCw3ICs0MTgsNyBAQAogICAgICAgICBzc2l6ZV90IGRpc3BsYXlXaWR0aCA9IGluZm8udzsKICAgICAgICAgc3NpemVfdCBkaXNwbGF5SGVpZ2h0ID0gaW5mby5oOwogCi0gICAgICAgIEFMT0dWKCJkaXNwbGF5IGlzICVsZCB4ICVsZFxuIiwgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0KTsKKyAgICAgICAgQUxPR1YoImRpc3BsYXkgaXMgJXpkIHggJXpkXG4iLCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQpOwogCiAgICAgICAgIGNvbnRyb2wgPSBjb21wb3NlckNsaWVudC0+Y3JlYXRlU3VyZmFjZSgKICAgICAgICAgICAgICAgICBTdHJpbmc4KCJBIFN1cmZhY2UiKSwKQEAgLTQyMiw3ICs0NTAsOCBAQAogICAgICAgICBwbGF5ZXItPnN0b3AoKTsKICAgICAgICAgcGxheWVyLT5yZXNldCgpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGRlY29kZShsb29wZXIsIGFyZ3ZbMF0sIHVzZUF1ZGlvLCB1c2VWaWRlbywgc3VyZmFjZSk7CisgICAgICAgIGRlY29kZShsb29wZXIsIGFyZ3ZbMF0sIHVzZUF1ZGlvLCB1c2VWaWRlbywgc3VyZmFjZSwgcmVuZGVyU3VyZmFjZSwKKyAgICAgICAgICAgICAgICB1c2VUaW1lc3RhbXApOwogICAgIH0KIAogICAgIGlmIChwbGF5YmFjayB8fCAodXNlU3VyZmFjZSAmJiB1c2VWaWRlbykpIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vcm91bmR1cC5oIGIvY21kcy9zdGFnZWZyaWdodC9maWx0ZXJzL2FyZ2J0b3JnYmEucnMKc2ltaWxhcml0eSBpbmRleCA2NSUKY29weSBmcm9tIGluY2x1ZGUvbWVkaWEvbmJhaW8vcm91bmR1cC5oCmNvcHkgdG8gY21kcy9zdGFnZWZyaWdodC9maWx0ZXJzL2FyZ2J0b3JnYmEucnMKaW5kZXggNGMzY2MyNS4uMjI5ZmY4YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9uYmFpby9yb3VuZHVwLmgKKysrIGIvY21kcy9zdGFnZWZyaWdodC9maWx0ZXJzL2FyZ2J0b3JnYmEucnMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxOCArMTQsMTMgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZm5kZWYgUk9VTkRVUF9ICi0jZGVmaW5lIFJPVU5EVVBfSAorI3ByYWdtYSB2ZXJzaW9uKDEpCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLnJzLmNwcGJhc2ljKQorI3ByYWdtYSByc19mcF9yZWxheGVkCiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8gUm91bmQgdXAgdG8gdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyCi11bnNpZ25lZCByb3VuZHVwKHVuc2lnbmVkIHYpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgIC8vIFJPVU5EVVBfSAordm9pZCByb290KGNvbnN0IHVjaGFyNCAqdl9pbiwgdWNoYXI0ICp2X291dCkgeworICAgIHZfb3V0LT54ID0gdl9pbi0+eTsKKyAgICB2X291dC0+eSA9IHZfaW4tPno7CisgICAgdl9vdXQtPnogPSB2X2luLT53OworICAgIHZfb3V0LT53ID0gdl9pbi0+eDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L2ZpbHRlcnMvbmlnaHR2aXNpb24ucnMgYi9jbWRzL3N0YWdlZnJpZ2h0L2ZpbHRlcnMvbmlnaHR2aXNpb24ucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxNDEzYwotLS0gL2Rldi9udWxsCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvZmlsdGVycy9uaWdodHZpc2lvbi5ycwpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSB2ZXJzaW9uKDEpCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLnJzLmNwcGJhc2ljKQorI3ByYWdtYSByc19mcF9yZWxheGVkCisKK2NvbnN0IHN0YXRpYyBmbG9hdDMgZ01vbm9NdWx0ID0gezAuMjk5ZiwgMC41ODdmLCAwLjExNGZ9OworY29uc3Qgc3RhdGljIGZsb2F0MyBnTmlnaHRWaXNpb25NdWx0ID0gezAuNWYsIDEuZiwgMC41Zn07CisKKy8vIGNhbGN1bGF0ZXMgbHVtaW5hbmNlIG9mIHBpeGVsLCB0aGVuIGJpYXNlcyBjb2xvciBiYWxhbmNlIHRvd2FyZCBncmVlbgordm9pZCByb290KGNvbnN0IHVjaGFyNCAqdl9pbiwgdWNoYXI0ICp2X291dCkgeworICAgIHZfb3V0LT54ID0gdl9pbi0+eDsgLy8gZG9uJ3QgbW9kaWZ5IEEKKworICAgIC8vIGdldCBSR0IsIHNjYWxlIDAtMjU1IHVjaGFyIHRvIDAtMS4wIGZsb2F0CisgICAgZmxvYXQzIHJnYiA9IHt2X2luLT55ICogMC4wMDM5MjE1NjlmLCB2X2luLT56ICogMC4wMDM5MjE1NjlmLAorICAgICAgICAgICAgdl9pbi0+dyAqIDAuMDAzOTIxNTY5Zn07CisKKyAgICAvLyBhcHBseSBmaWx0ZXIKKyAgICBmbG9hdDMgcmVzdWx0ID0gZG90KHJnYiwgZ01vbm9NdWx0KSAqIGdOaWdodFZpc2lvbk11bHQ7CisKKyAgICB2X291dC0+eSA9ICh1Y2hhciljbGFtcCgocmVzdWx0LnIgKiAyNTUuZiArIDAuNWYpLCAwLmYsIDI1NS5mKTsKKyAgICB2X291dC0+eiA9ICh1Y2hhciljbGFtcCgocmVzdWx0LmcgKiAyNTUuZiArIDAuNWYpLCAwLmYsIDI1NS5mKTsKKyAgICB2X291dC0+dyA9ICh1Y2hhciljbGFtcCgocmVzdWx0LmIgKiAyNTUuZiArIDAuNWYpLCAwLmYsIDI1NS5mKTsKK30KZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvZmlsdGVycy9zYXR1cmF0aW9uLnJzIGIvY21kcy9zdGFnZWZyaWdodC9maWx0ZXJzL3NhdHVyYXRpb24ucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRlOWRkOAotLS0gL2Rldi9udWxsCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvZmlsdGVycy9zYXR1cmF0aW9uLnJzCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIHZlcnNpb24oMSkKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQucnMuY3BwYmFzaWMpCisjcHJhZ21hIHJzX2ZwX3JlbGF4ZWQKKworY29uc3Qgc3RhdGljIGZsb2F0MyBnTW9ub011bHQgPSB7MC4yOTlmLCAwLjU4N2YsIDAuMTE0Zn07CisKKy8vIGdsb2JhbCB2YXJpYWJsZXMgKHBhcmFtZXRlcnMgYWNjZXNzaWJsZSB0byBhcHBsaWNhdGlvbiBjb2RlKQorZmxvYXQgZ1NhdHVyYXRpb24gPSAxLjBmOworCit2b2lkIHJvb3QoY29uc3QgdWNoYXI0ICp2X2luLCB1Y2hhcjQgKnZfb3V0KSB7CisgICAgdl9vdXQtPnggPSB2X2luLT54OyAvLyBkb24ndCBtb2RpZnkgQQorCisgICAgLy8gZ2V0IFJHQiwgc2NhbGUgMC0yNTUgdWNoYXIgdG8gMC0xLjAgZmxvYXQKKyAgICBmbG9hdDMgcmdiID0ge3ZfaW4tPnkgKiAwLjAwMzkyMTU2OWYsIHZfaW4tPnogKiAwLjAwMzkyMTU2OWYsCisgICAgICAgICAgICB2X2luLT53ICogMC4wMDM5MjE1NjlmfTsKKworICAgIC8vIGFwcGx5IHNhdHVyYXRpb24gZmlsdGVyCisgICAgZmxvYXQzIHJlc3VsdCA9IGRvdChyZ2IsIGdNb25vTXVsdCk7CisgICAgcmVzdWx0ID0gbWl4KHJlc3VsdCwgcmdiLCBnU2F0dXJhdGlvbik7CisKKyAgICB2X291dC0+eSA9ICh1Y2hhciljbGFtcCgocmVzdWx0LnIgKiAyNTUuZiArIDAuNWYpLCAwLmYsIDI1NS5mKTsKKyAgICB2X291dC0+eiA9ICh1Y2hhciljbGFtcCgocmVzdWx0LmcgKiAyNTUuZiArIDAuNWYpLCAwLmYsIDI1NS5mKTsKKyAgICB2X291dC0+dyA9ICh1Y2hhciljbGFtcCgocmVzdWx0LmIgKiAyNTUuZiArIDAuNWYpLCAwLmYsIDI1NS5mKTsKK30KZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvbWVkaWFmaWx0ZXIuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9tZWRpYWZpbHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4MzExMgotLS0gL2Rldi9udWxsCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvbWVkaWFmaWx0ZXIuY3BwCkBAIC0wLDAgKzEsNzg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJtZWRpYWZpbHRlclRlc3QiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGZpbHRlcnMvQ29sb3JDb252ZXJ0Lmg+CisjaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXIuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9SZW5kZXJTY3JpcHRXcmFwcGVyLmg+CisjaW5jbHVkZSA8T01YX0lWQ29tbW9uLmg+CisjaW5jbHVkZSA8dWkvRGlzcGxheUluZm8uaD4KKworI2luY2x1ZGUgIlJlbmRlclNjcmlwdC5oIgorI2luY2x1ZGUgIlNjcmlwdENfYXJnYnRvcmdiYS5oIgorI2luY2x1ZGUgIlNjcmlwdENfbmlnaHR2aXNpb24uaCIKKyNpbmNsdWRlICJTY3JpcHRDX3NhdHVyYXRpb24uaCIKKworLy8gdGVzdCBwYXJhbWV0ZXJzCitzdGF0aWMgY29uc3QgYm9vbCBrVGVzdEZsdXNoID0gdHJ1ZTsgICAgICAgIC8vIE5vdGU6IHRydWUgd2lsbCBkcm9wIDEgb3V0IG9mCitzdGF0aWMgY29uc3QgaW50IGtGbHVzaEFmdGVyRnJhbWVzID0gMjU7ICAgIC8vIGtGbHVzaEFmdGVyRnJhbWVzIG91dHB1dCBmcmFtZXMKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtUaW1lb3V0ID0gNTAwbGw7CisKKy8vIGJ1aWx0LWluIGZpbHRlciBwYXJhbWV0ZXJzCitzdGF0aWMgY29uc3QgaW50MzJfdCBrSW52ZXJ0ID0gZmFsc2U7ICAgLy8gWmVyb0ZpbHRlciBwYXJhbQorc3RhdGljIGNvbnN0IGZsb2F0IGtCbHVyUmFkaXVzID0gMTUuMGY7IC8vIEludHJpbnNpY0JsdXJGaWx0ZXIgcGFyYW0KK3N0YXRpYyBjb25zdCBmbG9hdCBrU2F0dXJhdGlvbiA9IDAuMGY7ICAvLyBTYXR1cmF0aW9uRmlsdGVyIHBhcmFtCisKK3N0YXRpYyB2b2lkIHVzYWdlKGNvbnN0IGNoYXIgKm1lKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogW2ZsYWdzXSAlc1xuIgorICAgICAgICAgICAgICAgICAgICAiXHRbLWJdIHVzZSBJbnRyaW5zaWNCbHVyRmlsdGVyXG4iCisgICAgICAgICAgICAgICAgICAgICJcdFstY10gdXNlIGFyZ2IgdG8gcmdiYSBjb252ZXJzaW9uIFJTRmlsdGVyXG4iCisgICAgICAgICAgICAgICAgICAgICJcdFstbl0gdXNlIG5pZ2h0IHZpc2lvbiBSU0ZpbHRlclxuIgorICAgICAgICAgICAgICAgICAgICAiXHRbLXJdIHVzZSBzYXR1cmF0aW9uIFJTRmlsdGVyXG4iCisgICAgICAgICAgICAgICAgICAgICJcdFstc10gdXNlIFNhdHVyYXRpb25GaWx0ZXJcbiIKKyAgICAgICAgICAgICAgICAgICAgIlx0Wy16XSB1c2UgWmVyb0ZpbHRlciAoY29weSBmaWx0ZXIpXG4iCisgICAgICAgICAgICAgICAgICAgICJcdFstUl0gcmVuZGVyIG91dHB1dCB0byBzdXJmYWNlIChlbmFibGVzIC1TKVxuIgorICAgICAgICAgICAgICAgICAgICAiXHRbLVNdIGFsbG9jYXRlIGJ1ZmZlcnMgZnJvbSBhIHN1cmZhY2VcbiIKKyAgICAgICAgICAgICAgICAgICAgIlx0Wy1UXSB1c2UgcmVuZGVyIHRpbWVzdGFtcHMgKGVuYWJsZXMgLVIpXG4iLAorICAgICAgICAgICAgICAgICAgICBtZSk7CisgICAgZXhpdCgxKTsKK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgU2F0dXJhdGlvblJTRmlsdGVyIDogUmVuZGVyU2NyaXB0V3JhcHBlcjo6UlNGaWx0ZXJDYWxsYmFjayB7CisgICAgdm9pZCBpbml0KFJTQzo6c3A8UlNDOjpSUz4gY29udGV4dCkgeworICAgICAgICBtU2NyaXB0ID0gbmV3IFNjcmlwdENfc2F0dXJhdGlvbihjb250ZXh0KTsKKyAgICAgICAgbVNjcmlwdC0+c2V0X2dTYXR1cmF0aW9uKDMuZik7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcm9jZXNzQnVmZmVycygKKyAgICAgICAgICAgIFJTQzo6QWxsb2NhdGlvbiAqaW5CdWZmZXIsIFJTQzo6QWxsb2NhdGlvbiAqb3V0QnVmZmVyKSB7CisgICAgICAgIG1TY3JpcHQtPmZvckVhY2hfcm9vdChpbkJ1ZmZlciwgb3V0QnVmZmVyKTsKKworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3QgaGFuZGxlU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyBfX3VudXNlZCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCitwcml2YXRlOgorICAgIFJTQzo6c3A8U2NyaXB0Q19zYXR1cmF0aW9uPiBtU2NyaXB0OworfTsKKworc3RydWN0IE5pZ2h0VmlzaW9uUlNGaWx0ZXIgOiBSZW5kZXJTY3JpcHRXcmFwcGVyOjpSU0ZpbHRlckNhbGxiYWNrIHsKKyAgICB2b2lkIGluaXQoUlNDOjpzcDxSU0M6OlJTPiBjb250ZXh0KSB7CisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19uaWdodHZpc2lvbihjb250ZXh0KTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3NCdWZmZXJzKAorICAgICAgICAgICAgUlNDOjpBbGxvY2F0aW9uICppbkJ1ZmZlciwgUlNDOjpBbGxvY2F0aW9uICpvdXRCdWZmZXIpIHsKKyAgICAgICAgbVNjcmlwdC0+Zm9yRWFjaF9yb290KGluQnVmZmVyLCBvdXRCdWZmZXIpOworCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBoYW5kbGVTZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnIF9fdW51c2VkKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgUlNDOjpzcDxTY3JpcHRDX25pZ2h0dmlzaW9uPiBtU2NyaXB0OworfTsKKworc3RydWN0IEFSR0JUb1JHQkFSU0ZpbHRlciA6IFJlbmRlclNjcmlwdFdyYXBwZXI6OlJTRmlsdGVyQ2FsbGJhY2sgeworICAgIHZvaWQgaW5pdChSU0M6OnNwPFJTQzo6UlM+IGNvbnRleHQpIHsKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX2FyZ2J0b3JnYmEoY29udGV4dCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcm9jZXNzQnVmZmVycygKKyAgICAgICAgICAgIFJTQzo6QWxsb2NhdGlvbiAqaW5CdWZmZXIsIFJTQzo6QWxsb2NhdGlvbiAqb3V0QnVmZmVyKSB7CisgICAgICAgIG1TY3JpcHQtPmZvckVhY2hfcm9vdChpbkJ1ZmZlciwgb3V0QnVmZmVyKTsKKworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3QgaGFuZGxlU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyBfX3VudXNlZCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCitwcml2YXRlOgorICAgIFJTQzo6c3A8U2NyaXB0Q19hcmdidG9yZ2JhPiBtU2NyaXB0OworfTsKKworc3RydWN0IENvZGVjU3RhdGUgeworICAgIHNwPE1lZGlhQ29kZWM+IG1Db2RlYzsKKyAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBtSW5CdWZmZXJzOworICAgIFZlY3RvcjxzcDxBQnVmZmVyPiA+IG1PdXRCdWZmZXJzOworICAgIGJvb2wgbVNpZ25hbGxlZElucHV0RU9TOworICAgIGJvb2wgbVNhd091dHB1dEVPUzsKKyAgICBpbnQ2NF90IG1OdW1CdWZmZXJzRGVjb2RlZDsKK307CisKK3N0cnVjdCBEZWNvZGVkRnJhbWUgeworICAgIHNpemVfdCBpbmRleDsKKyAgICBzaXplX3Qgb2Zmc2V0OworICAgIHNpemVfdCBzaXplOworICAgIGludDY0X3QgcHJlc2VudGF0aW9uVGltZVVzOworICAgIHVpbnQzMl90IGZsYWdzOworfTsKKworZW51bSBGaWx0ZXJUeXBlIHsKKyAgICBGSUxURVJUWVBFX1pFUk8sCisgICAgRklMVEVSVFlQRV9JTlRSSU5TSUNfQkxVUiwKKyAgICBGSUxURVJUWVBFX1NBVFVSQVRJT04sCisgICAgRklMVEVSVFlQRV9SU19TQVRVUkFUSU9OLAorICAgIEZJTFRFUlRZUEVfUlNfTklHSFRfVklTSU9OLAorICAgIEZJTFRFUlRZUEVfUlNfQVJHQl9UT19SR0JBLAorfTsKKworc2l6ZV90IGlucHV0RnJhbWVzU2luY2VGbHVzaCA9IDA7Cit2b2lkIHRyeUNvcHlEZWNvZGVkQnVmZmVyKAorICAgICAgICBMaXN0PERlY29kZWRGcmFtZT4gKmRlY29kZWRGcmFtZUluZGljZXMsCisgICAgICAgIENvZGVjU3RhdGUgKmZpbHRlclN0YXRlLAorICAgICAgICBDb2RlY1N0YXRlICp2aWRTdGF0ZSkgeworICAgIGlmIChkZWNvZGVkRnJhbWVJbmRpY2VzLT5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaXplX3QgZmlsdGVySW5kZXg7CisgICAgc3RhdHVzX3QgZXJyID0gZmlsdGVyU3RhdGUtPm1Db2RlYy0+ZGVxdWV1ZUlucHV0QnVmZmVyKAorICAgICAgICAgICAgJmZpbHRlckluZGV4LCBrVGltZW91dCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgKytpbnB1dEZyYW1lc1NpbmNlRmx1c2g7CisKKyAgICBEZWNvZGVkRnJhbWUgZnJhbWUgPSAqZGVjb2RlZEZyYW1lSW5kaWNlcy0+YmVnaW4oKTsKKworICAgIC8vIG9ubHkgY29uc3VtZSBhIGJ1ZmZlciBpZiB3ZSBhcmUgbm90IGdvaW5nIHRvIGZsdXNoLCBzaW5jZSB3ZSBleHBlY3QKKyAgICAvLyB0aGUgZGVxdWV1ZSAtPiBmbHVzaCAtPiBxdWV1ZSBvcGVyYXRpb24gdG8gY2F1c2UgYW4gZXJyb3IgYW5kCisgICAgLy8gbm90IHByb2R1Y2UgYW4gb3V0cHV0IGZyYW1lCisgICAgaWYgKCFrVGVzdEZsdXNoIHx8IGlucHV0RnJhbWVzU2luY2VGbHVzaCA8IGtGbHVzaEFmdGVyRnJhbWVzKSB7CisgICAgICAgIGRlY29kZWRGcmFtZUluZGljZXMtPmVyYXNlKGRlY29kZWRGcmFtZUluZGljZXMtPmJlZ2luKCkpOworICAgIH0KKyAgICBzaXplX3Qgb3V0SW5kZXggPSBmcmFtZS5pbmRleDsKKworICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZzcmNCdWZmZXIgPQorICAgICAgICB2aWRTdGF0ZS0+bU91dEJ1ZmZlcnMuaXRlbUF0KG91dEluZGV4KTsKKyAgICBjb25zdCBzcDxBQnVmZmVyPiAmZGVzdEJ1ZmZlciA9CisgICAgICAgIGZpbHRlclN0YXRlLT5tSW5CdWZmZXJzLml0ZW1BdChmaWx0ZXJJbmRleCk7CisKKyAgICBzcDxBTWVzc2FnZT4gc3JjRm9ybWF0LCBkZXN0Rm9ybWF0OworICAgIHZpZFN0YXRlLT5tQ29kZWMtPmdldE91dHB1dEZvcm1hdCgmc3JjRm9ybWF0KTsKKyAgICBmaWx0ZXJTdGF0ZS0+bUNvZGVjLT5nZXRJbnB1dEZvcm1hdCgmZGVzdEZvcm1hdCk7CisKKyAgICBpbnQzMl90IHNyY1dpZHRoLCBzcmNIZWlnaHQsIHNyY1N0cmlkZSwgc3JjU2xpY2VIZWlnaHQ7CisgICAgaW50MzJfdCBzcmNDb2xvckZvcm1hdCwgZGVzdENvbG9yRm9ybWF0OworICAgIGludDMyX3QgZGVzdFdpZHRoLCBkZXN0SGVpZ2h0LCBkZXN0U3RyaWRlLCBkZXN0U2xpY2VIZWlnaHQ7CisgICAgQ0hFQ0soc3JjRm9ybWF0LT5maW5kSW50MzIoInN0cmlkZSIsICZzcmNTdHJpZGUpCisgICAgICAgICAgICAmJiBzcmNGb3JtYXQtPmZpbmRJbnQzMigic2xpY2UtaGVpZ2h0IiwgJnNyY1NsaWNlSGVpZ2h0KQorICAgICAgICAgICAgJiYgc3JjRm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJnNyY1dpZHRoKQorICAgICAgICAgICAgJiYgc3JjRm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICYgc3JjSGVpZ2h0KQorICAgICAgICAgICAgJiYgc3JjRm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZzcmNDb2xvckZvcm1hdCkpOworICAgIENIRUNLKGRlc3RGb3JtYXQtPmZpbmRJbnQzMigic3RyaWRlIiwgJmRlc3RTdHJpZGUpCisgICAgICAgICAgICAmJiBkZXN0Rm9ybWF0LT5maW5kSW50MzIoInNsaWNlLWhlaWdodCIsICZkZXN0U2xpY2VIZWlnaHQpCisgICAgICAgICAgICAmJiBkZXN0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJmRlc3RXaWR0aCkKKyAgICAgICAgICAgICYmIGRlc3RGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJiBkZXN0SGVpZ2h0KQorICAgICAgICAgICAgJiYgZGVzdEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmZGVzdENvbG9yRm9ybWF0KSk7CisKKyAgICBDSEVDSyhzcmNXaWR0aCA8PSBkZXN0U3RyaWRlICYmIHNyY0hlaWdodCA8PSBkZXN0U2xpY2VIZWlnaHQpOworCisgICAgY29udmVydFlVVjQyMHNwVG9BUkdCKAorICAgICAgICAgICAgc3JjQnVmZmVyLT5kYXRhKCksCisgICAgICAgICAgICBzcmNCdWZmZXItPmRhdGEoKSArIHNyY1N0cmlkZSAqIHNyY1NsaWNlSGVpZ2h0LAorICAgICAgICAgICAgc3JjV2lkdGgsCisgICAgICAgICAgICBzcmNIZWlnaHQsCisgICAgICAgICAgICBkZXN0QnVmZmVyLT5kYXRhKCkpOworCisgICAgLy8gY29weSB0aW1lc3RhbXAKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBDSEVDSyhzcmNCdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisgICAgZGVzdEJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKworICAgIGlmIChrVGVzdEZsdXNoICYmIGlucHV0RnJhbWVzU2luY2VGbHVzaCA+PSBrRmx1c2hBZnRlckZyYW1lcykgeworICAgICAgICBpbnB1dEZyYW1lc1NpbmNlRmx1c2ggPSAwOworCisgICAgICAgIC8vIGNoZWNrIHRoYXQgcXVldWVpbmcgYSBidWZmZXIgdGhhdCB3YXMgZGVxdWV1ZWQgYmVmb3JlIGZsdXNoCisgICAgICAgIC8vIGZhaWxzIHdpdGggZXhwZWN0ZWQgZXJyb3IgRUFDQ0VTCisgICAgICAgIGZpbHRlclN0YXRlLT5tQ29kZWMtPmZsdXNoKCk7CisKKyAgICAgICAgZXJyID0gZmlsdGVyU3RhdGUtPm1Db2RlYy0+cXVldWVJbnB1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICBmaWx0ZXJJbmRleCwgMCAvKiBvZmZzZXQgKi8sIGRlc3RCdWZmZXItPnNpemUoKSwKKyAgICAgICAgICAgICAgICB0aW1lVXMsIGZyYW1lLmZsYWdzKTsKKworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRkFJTDogcXVldWUgYWZ0ZXIgZmx1c2ggcmV0dXJuZWQgT0siKTsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gLUVBQ0NFUykgeworICAgICAgICAgICAgQUxPR0UoInF1ZXVlSW5wdXRCdWZmZXIgYWZ0ZXIgZmx1c2ggcmV0dXJuZWQgJWQsICIKKyAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIC1FQUNDRVMgKC0xMykiLCBlcnIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyID0gZmlsdGVyU3RhdGUtPm1Db2RlYy0+cXVldWVJbnB1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICBmaWx0ZXJJbmRleCwgMCAvKiBvZmZzZXQgKi8sIGRlc3RCdWZmZXItPnNpemUoKSwKKyAgICAgICAgICAgICAgICB0aW1lVXMsIGZyYW1lLmZsYWdzKTsKKyAgICAgICAgQ0hFQ0soZXJyID09IE9LKTsKKworICAgICAgICBlcnIgPSB2aWRTdGF0ZS0+bUNvZGVjLT5yZWxlYXNlT3V0cHV0QnVmZmVyKG91dEluZGV4KTsKKyAgICAgICAgQ0hFQ0soZXJyID09IE9LKTsKKyAgICB9Cit9CisKK3NpemVfdCBvdXRwdXRGcmFtZXNTaW5jZUZsdXNoID0gMDsKK3ZvaWQgdHJ5RHJhaW5PdXRwdXRCdWZmZXIoCisgICAgICAgIENvZGVjU3RhdGUgKmZpbHRlclN0YXRlLAorICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSwgYm9vbCByZW5kZXJTdXJmYWNlLAorICAgICAgICBib29sIHVzZVRpbWVzdGFtcCwgaW50NjRfdCAqc3RhcnRUaW1lUmVuZGVyKSB7CisgICAgc2l6ZV90IGluZGV4OworICAgIHNpemVfdCBvZmZzZXQ7CisgICAgc2l6ZV90IHNpemU7CisgICAgaW50NjRfdCBwcmVzZW50YXRpb25UaW1lVXM7CisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgc3RhdHVzX3QgZXJyID0gZmlsdGVyU3RhdGUtPm1Db2RlYy0+ZGVxdWV1ZU91dHB1dEJ1ZmZlcigKKyAgICAgICAgICAgICZpbmRleCwgJm9mZnNldCwgJnNpemUsICZwcmVzZW50YXRpb25UaW1lVXMsICZmbGFncywKKyAgICAgICAgICAgIGtUaW1lb3V0KTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgICsrb3V0cHV0RnJhbWVzU2luY2VGbHVzaDsKKworICAgIGlmIChrVGVzdEZsdXNoICYmIG91dHB1dEZyYW1lc1NpbmNlRmx1c2ggPj0ga0ZsdXNoQWZ0ZXJGcmFtZXMpIHsKKyAgICAgICAgZmlsdGVyU3RhdGUtPm1Db2RlYy0+Zmx1c2goKTsKKyAgICB9CisKKyAgICBpZiAoc3VyZmFjZSA9PSBOVUxMIHx8ICFyZW5kZXJTdXJmYWNlKSB7CisgICAgICAgIGVyciA9IGZpbHRlclN0YXRlLT5tQ29kZWMtPnJlbGVhc2VPdXRwdXRCdWZmZXIoaW5kZXgpOworICAgIH0gZWxzZSBpZiAodXNlVGltZXN0YW1wKSB7CisgICAgICAgIGlmICgqc3RhcnRUaW1lUmVuZGVyID09IC0xKSB7CisgICAgICAgICAgICAvLyBiZWdpbiByZW5kZXJpbmcgMiB2c3luY3MgYWZ0ZXIgZmlyc3QgZGVjb2RlCisgICAgICAgICAgICAqc3RhcnRUaW1lUmVuZGVyID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpCisgICAgICAgICAgICAgICAgICAgICsgMzMwMDAwMDAgLSAocHJlc2VudGF0aW9uVGltZVVzICogMTAwMCk7CisgICAgICAgIH0KKyAgICAgICAgcHJlc2VudGF0aW9uVGltZVVzID0KKyAgICAgICAgICAgICAgICAocHJlc2VudGF0aW9uVGltZVVzICogMTAwMCkgKyAqc3RhcnRUaW1lUmVuZGVyOworICAgICAgICBlcnIgPSBmaWx0ZXJTdGF0ZS0+bUNvZGVjLT5yZW5kZXJPdXRwdXRCdWZmZXJBbmRSZWxlYXNlKAorICAgICAgICAgICAgICAgIGluZGV4LCBwcmVzZW50YXRpb25UaW1lVXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IGZpbHRlclN0YXRlLT5tQ29kZWMtPnJlbmRlck91dHB1dEJ1ZmZlckFuZFJlbGVhc2UoaW5kZXgpOworICAgIH0KKworICAgIGlmIChrVGVzdEZsdXNoICYmIG91dHB1dEZyYW1lc1NpbmNlRmx1c2ggPj0ga0ZsdXNoQWZ0ZXJGcmFtZXMpIHsKKyAgICAgICAgb3V0cHV0RnJhbWVzU2luY2VGbHVzaCA9IDA7CisKKyAgICAgICAgLy8gcmVsZWFzaW5nIHRoZSBidWZmZXIgZGVxdWV1ZWQgYmVmb3JlIGZsdXNoIHNob3VsZCBjYXVzZSBhbiBlcnJvcgorICAgICAgICAvLyBpZiBzbywgdGhlIGZyYW1lIHdpbGwgYWxzbyBiZSBza2lwcGVkIGluIG91dHB1dCBzdHJlYW0KKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkZBSUw6IHJlbGVhc2UgYWZ0ZXIgZmx1c2ggcmV0dXJuZWQgT0siKTsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gLUVBQ0NFUykgeworICAgICAgICAgICAgQUxPR0UoInJlbGVhc2VPdXRwdXRCdWZmZXIgYWZ0ZXIgZmx1c2ggcmV0dXJuZWQgJWQsICIKKyAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIC1FQUNDRVMgKC0xMykiLCBlcnIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ0hFQ0soZXJyID09IE9LKTsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1MpIHsKKyAgICAgICAgQUxPR1YoInJlYWNoZWQgRU9TIG9uIG91dHB1dC4iKTsKKyAgICAgICAgZmlsdGVyU3RhdGUtPm1TYXdPdXRwdXRFT1MgPSB0cnVlOworICAgIH0KK30KKworc3RhdGljIGludCBkZWNvZGUoCisgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsCisgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsCisgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLAorICAgICAgICBib29sIHJlbmRlclN1cmZhY2UsCisgICAgICAgIGJvb2wgdXNlVGltZXN0YW1wLAorICAgICAgICBGaWx0ZXJUeXBlIGZpbHRlclR5cGUpIHsKKworICAgIHN0YXRpYyBpbnQ2NF90IGtUaW1lb3V0ID0gNTAwbGw7CisKKyAgICBzcDxOdU1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPSBuZXcgTnVNZWRpYUV4dHJhY3RvcjsKKyAgICBpZiAoZXh0cmFjdG9yLT5zZXREYXRhU291cmNlKE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIHBhdGgpICE9IE9LKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIGluc3RhbnRpYXRlIGV4dHJhY3Rvci5cbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBLZXllZFZlY3RvcjxzaXplX3QsIENvZGVjU3RhdGU+IHN0YXRlQnlUcmFjazsKKworICAgIENvZGVjU3RhdGUgKnZpZFN0YXRlID0gTlVMTDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsgKytpKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgICAgIHN0YXR1c190IGVyciA9IGV4dHJhY3Rvci0+Z2V0VHJhY2tGb3JtYXQoaSwgJmZvcm1hdCk7CisgICAgICAgIENIRUNLKGVyciA9PSBPSyk7CisKKyAgICAgICAgQVN0cmluZyBtaW1lOworICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOworICAgICAgICBib29sIGlzVmlkZW8gPSAhc3RybmNhc2VjbXAobWltZS5jX3N0cigpLCAidmlkZW8vIiwgNik7CisgICAgICAgIGlmICghaXNWaWRlbykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigic2VsZWN0aW5nIHRyYWNrICV6dSIsIGkpOworCisgICAgICAgIGVyciA9IGV4dHJhY3Rvci0+c2VsZWN0VHJhY2soaSk7CisgICAgICAgIENIRUNLKGVyciA9PSBPSyk7CisKKyAgICAgICAgQ29kZWNTdGF0ZSAqc3RhdGUgPQorICAgICAgICAgICAgJnN0YXRlQnlUcmFjay5lZGl0VmFsdWVBdChzdGF0ZUJ5VHJhY2suYWRkKGksIENvZGVjU3RhdGUoKSkpOworCisgICAgICAgIHZpZFN0YXRlID0gc3RhdGU7CisKKyAgICAgICAgc3RhdGUtPm1OdW1CdWZmZXJzRGVjb2RlZCA9IDA7CisKKyAgICAgICAgc3RhdGUtPm1Db2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5VHlwZSgKKyAgICAgICAgICAgICAgICBsb29wZXIsIG1pbWUuY19zdHIoKSwgZmFsc2UgLyogZW5jb2RlciAqLyk7CisKKyAgICAgICAgQ0hFQ0soc3RhdGUtPm1Db2RlYyAhPSBOVUxMKTsKKworICAgICAgICBlcnIgPSBzdGF0ZS0+bUNvZGVjLT5jb25maWd1cmUoCisgICAgICAgICAgICAgICAgZm9ybWF0LCBOVUxMIC8qIHN1cmZhY2UgKi8sIE5VTEwgLyogY3J5cHRvICovLCAwIC8qIGZsYWdzICovKTsKKworICAgICAgICBDSEVDSyhlcnIgPT0gT0spOworCisgICAgICAgIHN0YXRlLT5tU2lnbmFsbGVkSW5wdXRFT1MgPSBmYWxzZTsKKyAgICAgICAgc3RhdGUtPm1TYXdPdXRwdXRFT1MgPSBmYWxzZTsKKworICAgICAgICBicmVhazsKKyAgICB9CisgICAgQ0hFQ0soIXN0YXRlQnlUcmFjay5pc0VtcHR5KCkpOworICAgIENIRUNLKHZpZFN0YXRlICE9IE5VTEwpOworICAgIHNwPEFNZXNzYWdlPiB2aWRGb3JtYXQ7CisgICAgdmlkU3RhdGUtPm1Db2RlYy0+Z2V0T3V0cHV0Rm9ybWF0KCZ2aWRGb3JtYXQpOworCisgICAgLy8gc2V0IGZpbHRlciB0byB1c2UgQVJHQjg4ODgKKyAgICB2aWRGb3JtYXQtPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBPTVhfQ09MT1JfRm9ybWF0MzJiaXRBUkdCODg4OCk7CisgICAgLy8gc2V0IGFwcCBjYWNoZSBkaXJlY3RvcnkgcGF0aAorICAgIHZpZEZvcm1hdC0+c2V0U3RyaW5nKCJjYWNoZURpciIsICIvc3lzdGVtL2JpbiIpOworCisgICAgLy8gY3JlYXRlIFJlbmRlclNjcmlwdCBjb250ZXh0IGZvciBSU0ZpbHRlcnMKKyAgICBSU0M6OnNwPFJTQzo6UlM+IGNvbnRleHQgPSBuZXcgUlNDOjpSUygpOworICAgIGNvbnRleHQtPmluaXQoIi9zeXN0ZW0vYmluIik7CisKKyAgICBzcDxSZW5kZXJTY3JpcHRXcmFwcGVyOjpSU0ZpbHRlckNhbGxiYWNrPiByc0ZpbHRlcjsKKworICAgIC8vIGNyZWF0ZSByZW5kZXJzY3JpcHQgd3JhcHBlciBmb3IgUlNGaWx0ZXJzCisgICAgc3A8UmVuZGVyU2NyaXB0V3JhcHBlcj4gcnNXcmFwcGVyID0gbmV3IFJlbmRlclNjcmlwdFdyYXBwZXI7CisgICAgcnNXcmFwcGVyLT5tQ29udGV4dCA9IGNvbnRleHQuZ2V0KCk7CisKKyAgICBDb2RlY1N0YXRlICpmaWx0ZXJTdGF0ZSA9IG5ldyBDb2RlY1N0YXRlKCk7CisgICAgZmlsdGVyU3RhdGUtPm1OdW1CdWZmZXJzRGVjb2RlZCA9IDA7CisKKyAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbmV3IEFNZXNzYWdlKCk7CisKKyAgICBzd2l0Y2ggKGZpbHRlclR5cGUpIHsKKyAgICAgICAgY2FzZSBGSUxURVJUWVBFX1pFUk86CisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbHRlclN0YXRlLT5tQ29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUoCisgICAgICAgICAgICAgICAgICAgIGxvb3BlciwgImFuZHJvaWQuZmlsdGVyLnplcm9maWx0ZXIiKTsKKyAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImludmVydCIsIGtJbnZlcnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGSUxURVJUWVBFX0lOVFJJTlNJQ19CTFVSOgorICAgICAgICB7CisgICAgICAgICAgICBmaWx0ZXJTdGF0ZS0+bUNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKAorICAgICAgICAgICAgICAgICAgICBsb29wZXIsICJhbmRyb2lkLmZpbHRlci5pbnRyaW5zaWNibHVyIik7CisgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJibHVyLXJhZGl1cyIsIGtCbHVyUmFkaXVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRklMVEVSVFlQRV9TQVRVUkFUSU9OOgorICAgICAgICB7CisgICAgICAgICAgICBmaWx0ZXJTdGF0ZS0+bUNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKAorICAgICAgICAgICAgICAgICAgICBsb29wZXIsICJhbmRyb2lkLmZpbHRlci5zYXR1cmF0aW9uIik7CisgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzYXR1cmF0aW9uIiwga1NhdHVyYXRpb24pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGSUxURVJUWVBFX1JTX1NBVFVSQVRJT046CisgICAgICAgIHsKKyAgICAgICAgICAgIFNhdHVyYXRpb25SU0ZpbHRlciAqc2F0RmlsdGVyID0gbmV3IFNhdHVyYXRpb25SU0ZpbHRlcjsKKyAgICAgICAgICAgIHNhdEZpbHRlci0+aW5pdChjb250ZXh0KTsKKyAgICAgICAgICAgIHJzRmlsdGVyID0gc2F0RmlsdGVyOworICAgICAgICAgICAgcnNXcmFwcGVyLT5tQ2FsbGJhY2sgPSByc0ZpbHRlcjsKKyAgICAgICAgICAgIHZpZEZvcm1hdC0+c2V0T2JqZWN0KCJycy13cmFwcGVyIiwgcnNXcmFwcGVyKTsKKworICAgICAgICAgICAgZmlsdGVyU3RhdGUtPm1Db2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgbG9vcGVyLCAiYW5kcm9pZC5maWx0ZXIuUmVuZGVyU2NyaXB0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZJTFRFUlRZUEVfUlNfTklHSFRfVklTSU9OOgorICAgICAgICB7CisgICAgICAgICAgICBOaWdodFZpc2lvblJTRmlsdGVyICpuaWdodFZpc2lvbkZpbHRlciA9IG5ldyBOaWdodFZpc2lvblJTRmlsdGVyOworICAgICAgICAgICAgbmlnaHRWaXNpb25GaWx0ZXItPmluaXQoY29udGV4dCk7CisgICAgICAgICAgICByc0ZpbHRlciA9IG5pZ2h0VmlzaW9uRmlsdGVyOworICAgICAgICAgICAgcnNXcmFwcGVyLT5tQ2FsbGJhY2sgPSByc0ZpbHRlcjsKKyAgICAgICAgICAgIHZpZEZvcm1hdC0+c2V0T2JqZWN0KCJycy13cmFwcGVyIiwgcnNXcmFwcGVyKTsKKworICAgICAgICAgICAgZmlsdGVyU3RhdGUtPm1Db2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgbG9vcGVyLCAiYW5kcm9pZC5maWx0ZXIuUmVuZGVyU2NyaXB0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZJTFRFUlRZUEVfUlNfQVJHQl9UT19SR0JBOgorICAgICAgICB7CisgICAgICAgICAgICBBUkdCVG9SR0JBUlNGaWx0ZXIgKmFyZ2JUb1JnYmFGaWx0ZXIgPSBuZXcgQVJHQlRvUkdCQVJTRmlsdGVyOworICAgICAgICAgICAgYXJnYlRvUmdiYUZpbHRlci0+aW5pdChjb250ZXh0KTsKKyAgICAgICAgICAgIHJzRmlsdGVyID0gYXJnYlRvUmdiYUZpbHRlcjsKKyAgICAgICAgICAgIHJzV3JhcHBlci0+bUNhbGxiYWNrID0gcnNGaWx0ZXI7CisgICAgICAgICAgICB2aWRGb3JtYXQtPnNldE9iamVjdCgicnMtd3JhcHBlciIsIHJzV3JhcHBlcik7CisKKyAgICAgICAgICAgIGZpbHRlclN0YXRlLT5tQ29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUoCisgICAgICAgICAgICAgICAgICAgIGxvb3BlciwgImFuZHJvaWQuZmlsdGVyLlJlbmRlclNjcmlwdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgibWVkaWFjb2RlYy5jcHAgZXJyb3I6IHVucmVjb2duaXplZCBGaWx0ZXJUeXBlIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBDSEVDSyhmaWx0ZXJTdGF0ZS0+bUNvZGVjICE9IE5VTEwpOworCisgICAgc3RhdHVzX3QgZXJyID0gZmlsdGVyU3RhdGUtPm1Db2RlYy0+Y29uZmlndXJlKAorICAgICAgICAgICAgdmlkRm9ybWF0IC8qIGZvcm1hdCAqLywgc3VyZmFjZSwgTlVMTCAvKiBjcnlwdG8gKi8sIDAgLyogZmxhZ3MgKi8pOworICAgIENIRUNLKGVyciA9PSBPSyk7CisKKyAgICBmaWx0ZXJTdGF0ZS0+bVNpZ25hbGxlZElucHV0RU9TID0gZmFsc2U7CisgICAgZmlsdGVyU3RhdGUtPm1TYXdPdXRwdXRFT1MgPSBmYWxzZTsKKworICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgIGludDY0X3Qgc3RhcnRUaW1lUmVuZGVyID0gLTE7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRlQnlUcmFjay5zaXplKCk7ICsraSkgeworICAgICAgICBDb2RlY1N0YXRlICpzdGF0ZSA9ICZzdGF0ZUJ5VHJhY2suZWRpdFZhbHVlQXQoaSk7CisKKyAgICAgICAgc3A8TWVkaWFDb2RlYz4gY29kZWMgPSBzdGF0ZS0+bUNvZGVjOworCisgICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgY29kZWMtPnN0YXJ0KCkpOworCisgICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgY29kZWMtPmdldElucHV0QnVmZmVycygmc3RhdGUtPm1JbkJ1ZmZlcnMpKTsKKyAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBjb2RlYy0+Z2V0T3V0cHV0QnVmZmVycygmc3RhdGUtPm1PdXRCdWZmZXJzKSk7CisKKyAgICAgICAgQUxPR1YoImdvdCAlenUgaW5wdXQgYW5kICV6dSBvdXRwdXQgYnVmZmVycyIsCisgICAgICAgICAgICAgICAgc3RhdGUtPm1JbkJ1ZmZlcnMuc2l6ZSgpLCBzdGF0ZS0+bU91dEJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIGZpbHRlclN0YXRlLT5tQ29kZWMtPnNldFBhcmFtZXRlcnMocGFyYW1zKSk7CisKKyAgICBpZiAoa1Rlc3RGbHVzaCkgeworICAgICAgICBzdGF0dXNfdCBmbHVzaEVyciA9IGZpbHRlclN0YXRlLT5tQ29kZWMtPmZsdXNoKCk7CisgICAgICAgIGlmIChmbHVzaEVyciA9PSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkZBSUw6IEZsdXNoIGJlZm9yZSBzdGFydCByZXR1cm5lZCBPSyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoIkZsdXNoIGJlZm9yZSBzdGFydCByZXR1cm5lZCBzdGF0dXMgJWQsIHVzdWFsbHkgRU5PU1lTICgtMzgpIiwKKyAgICAgICAgICAgICAgICAgICAgZmx1c2hFcnIpOworICAgICAgICB9CisgICAgfQorCisgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBmaWx0ZXJTdGF0ZS0+bUNvZGVjLT5zdGFydCgpKTsKKyAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIGZpbHRlclN0YXRlLT5tQ29kZWMtPmdldElucHV0QnVmZmVycygKKyAgICAgICAgICAgICZmaWx0ZXJTdGF0ZS0+bUluQnVmZmVycykpOworICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgZmlsdGVyU3RhdGUtPm1Db2RlYy0+Z2V0T3V0cHV0QnVmZmVycygKKyAgICAgICAgICAgICZmaWx0ZXJTdGF0ZS0+bU91dEJ1ZmZlcnMpKTsKKworICAgIGlmIChrVGVzdEZsdXNoKSB7CisgICAgICAgIHN0YXR1c190IGZsdXNoRXJyID0gZmlsdGVyU3RhdGUtPm1Db2RlYy0+Zmx1c2goKTsKKyAgICAgICAgaWYgKGZsdXNoRXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRkFJTDogRmx1c2ggYWZ0ZXIgc3RhcnQgcmV0dXJuZWQgJWQsIGV4cGVjdCBPSyAoMCkiLAorICAgICAgICAgICAgICAgICAgICBmbHVzaEVycik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiRmx1c2ggaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnQgT0siKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIExpc3Q8RGVjb2RlZEZyYW1lPiBkZWNvZGVkRnJhbWVJbmRpY2VzOworCisgICAgLy8gbG9vcCB1bnRpbCBkZWNvZGVyIHJlYWNoZXMgRU9TCisgICAgYm9vbCBzYXdJbnB1dEVPUyA9IGZhbHNlOworICAgIGJvb2wgc2F3T3V0cHV0RU9TT25BbGxUcmFja3MgPSBmYWxzZTsKKyAgICB3aGlsZSAoIXNhd091dHB1dEVPU09uQWxsVHJhY2tzKSB7CisgICAgICAgIGlmICghc2F3SW5wdXRFT1MpIHsKKyAgICAgICAgICAgIHNpemVfdCB0cmFja0luZGV4OworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZXh0cmFjdG9yLT5nZXRTYW1wbGVUcmFja0luZGV4KCZ0cmFja0luZGV4KTsKKworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJzYXcgaW5wdXQgZW9zIik7CisgICAgICAgICAgICAgICAgc2F3SW5wdXRFT1MgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDb2RlY1N0YXRlICpzdGF0ZSA9ICZzdGF0ZUJ5VHJhY2suZWRpdFZhbHVlRm9yKHRyYWNrSW5kZXgpOworCisgICAgICAgICAgICAgICAgc2l6ZV90IGluZGV4OworICAgICAgICAgICAgICAgIGVyciA9IHN0YXRlLT5tQ29kZWMtPmRlcXVldWVJbnB1dEJ1ZmZlcigmaW5kZXgsIGtUaW1lb3V0KTsKKworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImZpbGxpbmcgaW5wdXQgYnVmZmVyICV6dSIsIGluZGV4KTsKKworICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyID0gc3RhdGUtPm1JbkJ1ZmZlcnMuaXRlbUF0KGluZGV4KTsKKworICAgICAgICAgICAgICAgICAgICBlcnIgPSBleHRyYWN0b3ItPnJlYWRTYW1wbGVEYXRhKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKGVyciA9PSBPSyk7CisKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IGV4dHJhY3Rvci0+Z2V0U2FtcGxlVGltZSgmdGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soZXJyID09IE9LKTsKKworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJGbGFncyA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gc3RhdGUtPm1Db2RlYy0+cXVldWVJbnB1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwgMCAvKiBvZmZzZXQgKi8sIGJ1ZmZlci0+c2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVVcywgYnVmZmVyRmxhZ3MpOworCisgICAgICAgICAgICAgICAgICAgIENIRUNLKGVyciA9PSBPSyk7CisKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yLT5hZHZhbmNlKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoZXJyLCAtRUFHQUlOKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRlQnlUcmFjay5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIENvZGVjU3RhdGUgKnN0YXRlID0gJnN0YXRlQnlUcmFjay5lZGl0VmFsdWVBdChpKTsKKworICAgICAgICAgICAgICAgIGlmICghc3RhdGUtPm1TaWduYWxsZWRJbnB1dEVPUykgeworICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5kZXg7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bUNvZGVjLT5kZXF1ZXVlSW5wdXRCdWZmZXIoJmluZGV4LCBrVGltZW91dCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgaW5wdXQgRU9TIG9uIHRyYWNrICV6dSIsIGkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBzdGF0ZS0+bUNvZGVjLT5xdWV1ZUlucHV0QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwgMCAvKiBvZmZzZXQgKi8sIDAgLyogc2l6ZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMGxsIC8qIHRpbWVVcyAqLywgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soZXJyID09IE9LKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1TaWduYWxsZWRJbnB1dEVPUyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShlcnIsIC1FQUdBSU4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2F3T3V0cHV0RU9TT25BbGxUcmFja3MgPSB0cnVlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRlQnlUcmFjay5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgQ29kZWNTdGF0ZSAqc3RhdGUgPSAmc3RhdGVCeVRyYWNrLmVkaXRWYWx1ZUF0KGkpOworCisgICAgICAgICAgICBpZiAoc3RhdGUtPm1TYXdPdXRwdXRFT1MpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2F3T3V0cHV0RU9TT25BbGxUcmFja3MgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRGVjb2RlZEZyYW1lIGZyYW1lOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc3RhdGUtPm1Db2RlYy0+ZGVxdWV1ZU91dHB1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgJmZyYW1lLmluZGV4LCAmZnJhbWUub2Zmc2V0LCAmZnJhbWUuc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgJmZyYW1lLnByZXNlbnRhdGlvblRpbWVVcywgJmZyYW1lLmZsYWdzLCBrVGltZW91dCk7CisKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiZHJhaW5pbmcgZGVjb2RlZCBidWZmZXIgJXp1LCB0aW1lID0gJWxsZCB1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5pbmRleCwgKGxvbmcgbG9uZylmcmFtZS5wcmVzZW50YXRpb25UaW1lVXMpOworCisgICAgICAgICAgICAgICAgKysoc3RhdGUtPm1OdW1CdWZmZXJzRGVjb2RlZCk7CisKKyAgICAgICAgICAgICAgICBkZWNvZGVkRnJhbWVJbmRpY2VzLnB1c2hfYmFjayhmcmFtZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZnJhbWUuZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1MpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoInJlYWNoZWQgRU9TIG9uIGRlY29kZXIgb3V0cHV0LiIpOworICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bVNhd091dHB1dEVPUyA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBJTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEIik7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBzdGF0ZS0+bUNvZGVjLT5nZXRPdXRwdXRCdWZmZXJzKAorICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlLT5tT3V0QnVmZmVycykpOworCisgICAgICAgICAgICAgICAgQUxPR1YoImdvdCAlenUgb3V0cHV0IGJ1ZmZlcnMiLCBzdGF0ZS0+bU91dEJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgc3RhdGUtPm1Db2RlYy0+Z2V0T3V0cHV0Rm9ybWF0KCZmb3JtYXQpKTsKKworICAgICAgICAgICAgICAgIEFMT0dWKCJJTkZPX0ZPUk1BVF9DSEFOR0VEOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENIRUNLX0VRKGVyciwgLUVBR0FJTik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeUNvcHlEZWNvZGVkQnVmZmVyKCZkZWNvZGVkRnJhbWVJbmRpY2VzLCBmaWx0ZXJTdGF0ZSwgdmlkU3RhdGUpOworCisgICAgICAgICAgICB0cnlEcmFpbk91dHB1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyU3RhdGUsIHN1cmZhY2UsIHJlbmRlclN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgIHVzZVRpbWVzdGFtcCwgJnN0YXJ0VGltZVJlbmRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBhZnRlciBFT1Mgb24gZGVjb2RlciwgbGV0IGZpbHRlciByZWFjaCBFT1MKKyAgICB3aGlsZSAoIWZpbHRlclN0YXRlLT5tU2F3T3V0cHV0RU9TKSB7CisgICAgICAgIHRyeUNvcHlEZWNvZGVkQnVmZmVyKCZkZWNvZGVkRnJhbWVJbmRpY2VzLCBmaWx0ZXJTdGF0ZSwgdmlkU3RhdGUpOworCisgICAgICAgIHRyeURyYWluT3V0cHV0QnVmZmVyKAorICAgICAgICAgICAgICAgIGZpbHRlclN0YXRlLCBzdXJmYWNlLCByZW5kZXJTdXJmYWNlLAorICAgICAgICAgICAgICAgIHVzZVRpbWVzdGFtcCwgJnN0YXJ0VGltZVJlbmRlcik7CisgICAgfQorCisgICAgaW50NjRfdCBlbGFwc2VkVGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZVVzOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0ZUJ5VHJhY2suc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgQ29kZWNTdGF0ZSAqc3RhdGUgPSAmc3RhdGVCeVRyYWNrLmVkaXRWYWx1ZUF0KGkpOworCisgICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgc3RhdGUtPm1Db2RlYy0+cmVsZWFzZSgpKTsKKworICAgICAgICBwcmludGYoInRyYWNrICV6dTogJSIgUFJJZDY0ICIgZnJhbWVzIGRlY29kZWQgYW5kIGZpbHRlcmVkLCAiCisgICAgICAgICAgICAgICAgIiUuMmYgZnBzLlxuIiwgaSwgc3RhdGUtPm1OdW1CdWZmZXJzRGVjb2RlZCwKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bU51bUJ1ZmZlcnNEZWNvZGVkICogMUU2IC8gZWxhcHNlZFRpbWVVcyk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisgICAgY29uc3QgY2hhciAqbWUgPSBhcmd2WzBdOworCisgICAgYm9vbCB1c2VTdXJmYWNlID0gZmFsc2U7CisgICAgYm9vbCByZW5kZXJTdXJmYWNlID0gZmFsc2U7CisgICAgYm9vbCB1c2VUaW1lc3RhbXAgPSBmYWxzZTsKKyAgICBGaWx0ZXJUeXBlIGZpbHRlclR5cGUgPSBGSUxURVJUWVBFX1pFUk87CisKKyAgICBpbnQgcmVzOworICAgIHdoaWxlICgocmVzID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJiY25yc3pUUlNoIikpID49IDApIHsKKyAgICAgICAgc3dpdGNoIChyZXMpIHsKKyAgICAgICAgICAgIGNhc2UgJ2InOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpbHRlclR5cGUgPSBGSUxURVJUWVBFX0lOVFJJTlNJQ19CTFVSOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAnYyc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlsdGVyVHlwZSA9IEZJTFRFUlRZUEVfUlNfQVJHQl9UT19SR0JBOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAnbic6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlsdGVyVHlwZSA9IEZJTFRFUlRZUEVfUlNfTklHSFRfVklTSU9OOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAncic6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlsdGVyVHlwZSA9IEZJTFRFUlRZUEVfUlNfU0FUVVJBVElPTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpbHRlclR5cGUgPSBGSUxURVJUWVBFX1NBVFVSQVRJT047CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlICd6JzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWx0ZXJUeXBlID0gRklMVEVSVFlQRV9aRVJPOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAnVCc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNlVGltZXN0YW1wID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgY2FzZSAnUic6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVuZGVyU3VyZmFjZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgICAgIGNhc2UgJ1MnOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzZVN1cmZhY2UgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAnPyc6CisgICAgICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNhZ2UobWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYXJnYyAtPSBvcHRpbmQ7CisgICAgYXJndiArPSBvcHRpbmQ7CisKKyAgICBpZiAoYXJnYyAhPSAxKSB7CisgICAgICAgIHVzYWdlKG1lKTsKKyAgICB9CisKKyAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CisKKyAgICBEYXRhU291cmNlOjpSZWdpc3RlckRlZmF1bHRTbmlmZmVycygpOworCisgICAgYW5kcm9pZDo6c3A8QUxvb3Blcj4gbG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbG9vcGVyLT5zdGFydCgpOworCisgICAgYW5kcm9pZDo6c3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBjb21wb3NlckNsaWVudDsKKyAgICBhbmRyb2lkOjpzcDxTdXJmYWNlQ29udHJvbD4gY29udHJvbDsKKyAgICBhbmRyb2lkOjpzcDxTdXJmYWNlPiBzdXJmYWNlOworCisgICAgaWYgKHVzZVN1cmZhY2UpIHsKKyAgICAgICAgY29tcG9zZXJDbGllbnQgPSBuZXcgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OworICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIGNvbXBvc2VyQ2xpZW50LT5pbml0Q2hlY2soKSk7CisKKyAgICAgICAgYW5kcm9pZDo6c3A8SUJpbmRlcj4gZGlzcGxheShTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldEJ1aWx0SW5EaXNwbGF5KAorICAgICAgICAgICAgICAgIElTdXJmYWNlQ29tcG9zZXI6OmVEaXNwbGF5SWRNYWluKSk7CisgICAgICAgIERpc3BsYXlJbmZvIGluZm87CisgICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheUluZm8oZGlzcGxheSwgJmluZm8pOworICAgICAgICBzc2l6ZV90IGRpc3BsYXlXaWR0aCA9IGluZm8udzsKKyAgICAgICAgc3NpemVfdCBkaXNwbGF5SGVpZ2h0ID0gaW5mby5oOworCisgICAgICAgIEFMT0dWKCJkaXNwbGF5IGlzICV6ZCB4ICV6ZCIsIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCk7CisKKyAgICAgICAgY29udHJvbCA9IGNvbXBvc2VyQ2xpZW50LT5jcmVhdGVTdXJmYWNlKAorICAgICAgICAgICAgICAgIFN0cmluZzgoIkEgU3VyZmFjZSIpLCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQsCisgICAgICAgICAgICAgICAgUElYRUxfRk9STUFUX1JHQkFfODg4OCwgMCk7CisKKyAgICAgICAgQ0hFQ0soY29udHJvbCAhPSBOVUxMKTsKKyAgICAgICAgQ0hFQ0soY29udHJvbC0+aXNWYWxpZCgpKTsKKworICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6Om9wZW5HbG9iYWxUcmFuc2FjdGlvbigpOworICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIGNvbnRyb2wtPnNldExheWVyKElOVF9NQVgpKTsKKyAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBjb250cm9sLT5zaG93KCkpOworICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmNsb3NlR2xvYmFsVHJhbnNhY3Rpb24oKTsKKworICAgICAgICBzdXJmYWNlID0gY29udHJvbC0+Z2V0U3VyZmFjZSgpOworICAgICAgICBDSEVDSyhzdXJmYWNlICE9IE5VTEwpOworICAgIH0KKworICAgIGRlY29kZShsb29wZXIsIGFyZ3ZbMF0sIHN1cmZhY2UsIHJlbmRlclN1cmZhY2UsIHVzZVRpbWVzdGFtcCwgZmlsdGVyVHlwZSk7CisKKyAgICBpZiAodXNlU3VyZmFjZSkgeworICAgICAgICBjb21wb3NlckNsaWVudC0+ZGlzcG9zZSgpOworICAgIH0KKworICAgIGxvb3Blci0+c3RvcCgpOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L211eGVyLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvbXV4ZXIuY3BwCmluZGV4IGY0YTMzZTguLjM2ZmEzYjUgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvbXV4ZXIuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvbXV4ZXIuY3BwCkBAIC0xNyw2ICsxNyw5IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIm11eGVyIgogI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgpAQCAtNTAsNyArNTMsNiBAQAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIHN0YXRpYyBpbnQgbXV4aW5nKAotICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpBTG9vcGVyPiAmbG9vcGVyLAogICAgICAgICBjb25zdCBjaGFyICpwYXRoLAogICAgICAgICBib29sIHVzZUF1ZGlvLAogICAgICAgICBib29sIHVzZVZpZGVvLApAQCAtNzIsOCArNzQsMTUgQEAKICAgICBBTE9HVigiaW5wdXQgZmlsZSAlcywgb3V0cHV0IGZpbGUgJXMiLCBwYXRoLCBvdXRwdXRGaWxlTmFtZSk7CiAgICAgQUxPR1YoInVzZUF1ZGlvICVkLCB1c2VWaWRlbyAlZCIsIHVzZUF1ZGlvLCB1c2VWaWRlbyk7CiAKLSAgICBzcDxNZWRpYU11eGVyPiBtdXhlciA9IG5ldyBNZWRpYU11eGVyKG91dHB1dEZpbGVOYW1lLAorICAgIGludCBmZCA9IG9wZW4ob3V0cHV0RmlsZU5hbWUsIE9fQ1JFQVQgfCBPX0xBUkdFRklMRSB8IE9fVFJVTkMgfCBPX1JEV1IsIFNfSVJVU1IgfCBTX0lXVVNSKTsKKworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgQUxPR0UoImNvdWxkbid0IG9wZW4gZmlsZSIpOworICAgICAgICByZXR1cm4gZmQ7CisgICAgfQorICAgIHNwPE1lZGlhTXV4ZXI+IG11eGVyID0gbmV3IE1lZGlhTXV4ZXIoZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYU11eGVyOjpPVVRQVVRfRk9STUFUX01QRUdfNCk7CisgICAgY2xvc2UoZmQpOwogCiAgICAgc2l6ZV90IHRyYWNrQ291bnQgPSBleHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CiAgICAgLy8gTWFwIHRoZSBleHRyYWN0b3IncyB0cmFjayBpbmRleCB0byB0aGUgbXV4ZXIncyB0cmFjayBpbmRleC4KQEAgLTEyNywxNCArMTM2LDE5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBBTE9HVigic2VsZWN0aW5nIHRyYWNrICVkIiwgaSk7CisgICAgICAgIEFMT0dWKCJzZWxlY3RpbmcgdHJhY2sgJXp1IiwgaSk7CiAKICAgICAgICAgZXJyID0gZXh0cmFjdG9yLT5zZWxlY3RUcmFjayhpKTsKICAgICAgICAgQ0hFQ0tfRVEoZXJyLCAoc3RhdHVzX3QpT0spOwogCiAgICAgICAgIHNzaXplX3QgbmV3VHJhY2tJbmRleCA9IG11eGVyLT5hZGRUcmFjayhmb3JtYXQpOwotICAgICAgICBDSEVDS19HRShuZXdUcmFja0luZGV4LCAwKTsKLSAgICAgICAgdHJhY2tJbmRleE1hcC5hZGQoaSwgbmV3VHJhY2tJbmRleCk7CisgICAgICAgIGlmIChuZXdUcmFja0luZGV4IDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyB0cmFjayAoJXp1KSB1bnN1cHBvcnRlZCBieSBtdXhlclxuIiwKKyAgICAgICAgICAgICAgICAgICAgaXNBdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iLAorICAgICAgICAgICAgICAgICAgICBpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyYWNrSW5kZXhNYXAuYWRkKGksIG5ld1RyYWNrSW5kZXgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaW50NjRfdCBtdXhlclN0YXJ0VGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKQEAgLTE1Myw3ICsxNjcsMTIgQEAKICAgICAgICAgICAgIEFMT0dWKCJzYXcgaW5wdXQgZW9zLCBlcnIgJWQiLCBlcnIpOwogICAgICAgICAgICAgc2F3SW5wdXRFT1MgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAodHJhY2tJbmRleE1hcC5pbmRleE9mS2V5KHRyYWNrSW5kZXgpIDwgMCkgeworICAgICAgICAgICAgLy8gQUxPR1YoInNraXBwaW5nIGlucHV0IGZyb20gdW5zdXBwb3J0ZWQgdHJhY2sgJXp1IiwgdHJhY2tJbmRleCk7CisgICAgICAgICAgICBleHRyYWN0b3ItPmFkdmFuY2UoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQUxPR1YoInJlYWRpbmcgc2FtcGxlIGZyb20gdHJhY2sgaW5kZXggJXp1XG4iLCB0cmFja0luZGV4KTsKICAgICAgICAgICAgIGVyciA9IGV4dHJhY3Rvci0+cmVhZFNhbXBsZURhdGEobmV3QnVmZmVyKTsKICAgICAgICAgICAgIENIRUNLX0VRKGVyciwgKHN0YXR1c190KU9LKTsKIApAQCAtMjk4LDcgKzMxNyw3IEBACiAgICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gbmV3IEFMb29wZXI7CiAgICAgbG9vcGVyLT5zdGFydCgpOwogCi0gICAgaW50IHJlc3VsdCA9IG11eGluZyhsb29wZXIsIGFyZ3ZbMF0sIHVzZUF1ZGlvLCB1c2VWaWRlbywgb3V0cHV0RmlsZU5hbWUsCisgICAgaW50IHJlc3VsdCA9IG11eGluZyhhcmd2WzBdLCB1c2VBdWRpbywgdXNlVmlkZW8sIG91dHB1dEZpbGVOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlVHJpbSwgdHJpbVN0YXJ0VGltZU1zLCB0cmltRW5kVGltZU1zLCByb3RhdGlvbkRlZ3JlZXMpOwogCiAgICAgbG9vcGVyLT5zdG9wKCk7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAKaW5kZXggZmRjMzUyZS4uNTk0YzkzMyAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcApAQCAtMzIsMTMgKzMyLDEzIEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCitzdGF0aWMgY29uc3QgaW50MzJfdCBrQXVkaW9CaXRSYXRlID0gMTIyMDA7CisjaWYgMAogc3RhdGljIGNvbnN0IGludDMyX3Qga0ZyYW1lcmF0ZSA9IDI0OyAgLy8gZnBzCiBzdGF0aWMgY29uc3QgaW50MzJfdCBrSUZyYW1lc0ludGVydmFsU2VjID0gMTsKIHN0YXRpYyBjb25zdCBpbnQzMl90IGtWaWRlb0JpdFJhdGUgPSA1MTIgKiAxMDI0Owotc3RhdGljIGNvbnN0IGludDMyX3Qga0F1ZGlvQml0UmF0ZSA9IDEyMjAwOwogc3RhdGljIGNvbnN0IGludDY0X3Qga0R1cmF0aW9uVXMgPSAxMDAwMDAwMExMOyAgLy8gMTAgc2Vjb25kcwogCi0jaWYgMAogY2xhc3MgRHVtbXlTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewogCiBwdWJsaWM6CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZHZpZGVvLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkdmlkZW8uY3BwCmluZGV4IDlmNTQ3YzcuLjJhZDQwYmQgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkdmlkZW8uY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkdmlkZW8uY3BwCkBAIC0xNyw2ICsxNywxMCBAQAogI2luY2x1ZGUgIlNpbmVTb3VyY2UuaCIKIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaD4KQEAgLTMwMCw3ICszMDQsMTMgQEAKICAgICAgICAgICAgICAgICBjbGllbnQuaW50ZXJmYWNlKCksIGVuY19tZXRhLCB0cnVlIC8qIGNyZWF0ZUVuY29kZXIgKi8sIHNvdXJjZSwKICAgICAgICAgICAgICAgICAwLCBwcmVmZXJTb2Z0d2FyZUNvZGVjID8gT01YQ29kZWM6OmtQcmVmZXJTb2Z0d2FyZUNvZGVjcyA6IDApOwogCi0gICAgc3A8TVBFRzRXcml0ZXI+IHdyaXRlciA9IG5ldyBNUEVHNFdyaXRlcihmaWxlTmFtZSk7CisgICAgaW50IGZkID0gb3BlbihmaWxlTmFtZSwgT19DUkVBVCB8IE9fTEFSR0VGSUxFIHwgT19UUlVOQyB8IE9fUkRXUiwgU19JUlVTUiB8IFNfSVdVU1IpOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZG4ndCBvcGVuIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHNwPE1QRUc0V3JpdGVyPiB3cml0ZXIgPSBuZXcgTVBFRzRXcml0ZXIoZmQpOworICAgIGNsb3NlKGZkKTsKICAgICB3cml0ZXItPmFkZFNvdXJjZShlbmNvZGVyKTsKICAgICBpbnQ2NF90IHN0YXJ0ID0gc3lzdGVtVGltZSgpOwogICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgd3JpdGVyLT5zdGFydCgpKTsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvc2YyLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvc2YyLmNwcAppbmRleCAwZjcyOWEzLi4wZDY0ZDJmIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3NmMi5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9zZjIuY3BwCkBAIC0zOCwxMCArMzgsMTAgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9OYXRpdmVXaW5kb3dXcmFwcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KIAogI2luY2x1ZGUgPGd1aS9TdXJmYWNlQ29tcG9zZXJDbGllbnQuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogCiAjaW5jbHVkZSAiaW5jbHVkZS9FU0RTLmgiCiAKQEAgLTcyLDcgKzcyLDcgQEAKICAgICB9CiAKICAgICB2b2lkIHN0YXJ0QXN5bmMoKSB7Ci0gICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgdGhpcykpLT5wb3N0KCk7CiAgICAgfQogCiBwcm90ZWN0ZWQ6CkBAIC0xMDAsNyArMTAwLDcgQEAKICAgICAgICAgaWYgKGN0cmxjKSB7CiAgICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgICAgICBwcmludFN0YXRpc3RpY3MoKTsKLSAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCBpZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCB0aGlzKSktPnBvc3QoKTsKICAgICAgICAgICAgIGN0cmxjID0gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgewpAQCAtMTQ5LDEzICsxNDksMTIgQEAKICAgICAgICAgICAgICAgICBtRGVjb2RlTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUNvZGVjKTsKIAogICAgICAgICAgICAgICAgIG1Db2RlYy0+c2V0Tm90aWZpY2F0aW9uTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBTWVzc2FnZShrV2hhdENvZGVjTm90aWZ5LCBpZCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQU1lc3NhZ2Uoa1doYXRDb2RlY05vdGlmeSwgdGhpcykpOwogCiAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG1ha2VGb3JtYXQobVNvdXJjZS0+Z2V0Rm9ybWF0KCkpOwogCiAgICAgICAgICAgICAgICAgaWYgKG1TdXJmYWNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0LT5zZXRPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hdGl2ZS13aW5kb3ciLCBuZXcgTmF0aXZlV2luZG93V3JhcHBlcihtU3VyZmFjZSkpOworICAgICAgICAgICAgICAgICAgICBmb3JtYXQtPnNldE9iamVjdCgic3VyZmFjZSIsIG1TdXJmYWNlKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBtQ29kZWMtPmluaXRpYXRlU2V0dXAoZm9ybWF0KTsKQEAgLTE2OCw3ICsxNjcsNyBAQAogICAgICAgICAgICAgICAgIG1GaW5hbFJlc3VsdCA9IE9LOwogICAgICAgICAgICAgICAgIG1TZWVrU3RhdGUgPSBTRUVLX05PTkU7CiAKLSAgICAgICAgICAgICAgICAvLyAobmV3IEFNZXNzYWdlKGtXaGF0U2VlaywgaWQoKSkpLT5wb3N0KDUwMDAwMDBsbCk7CisgICAgICAgICAgICAgICAgLy8gKG5ldyBBTWVzc2FnZShrV2hhdFNlZWssIHRoaXMpKS0+cG9zdCg1MDAwMDAwbGwpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0yMjUsMTIgKzIyNCwxMiBAQAogICAgICAgICAgICAgICAgICAgICBwcmludGYoKHdoYXQgPT0gQ29kZWNCYXNlOjprV2hhdEVPUykgPyAiJFxuIiA6ICJFXG4iKTsKIAogICAgICAgICAgICAgICAgICAgICBwcmludFN0YXRpc3RpY3MoKTsKLSAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0b3AsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgdGhpcykpLT5wb3N0KCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IENvZGVjQmFzZTo6a1doYXRGbHVzaENvbXBsZXRlZCkgewogICAgICAgICAgICAgICAgICAgICBtU2Vla1N0YXRlID0gU0VFS19GTFVTSF9DT01QTEVURUQ7CiAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsUmVzdW1lKCk7CiAKLSAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFNlZWssIGlkKCkpKS0+cG9zdCg1MDAwMDAwbGwpOworICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0U2VlaywgdGhpcykpLT5wb3N0KDUwMDAwMDBsbCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IENvZGVjQmFzZTo6a1doYXRPdXRwdXRGb3JtYXRDaGFuZ2VkKSB7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IENvZGVjQmFzZTo6a1doYXRTaHV0ZG93bkNvbXBsZXRlZCkgewogICAgICAgICAgICAgICAgICAgICBtRGVjb2RlTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtQ29kZWMtPmlkKCkpOwpAQCAtMzI4LDE0ICszMjcsMTQgQEAKIAogICAgICAgICAgICAgQ0hFQ0soc2l6ZSA+PSA3KTsKICAgICAgICAgICAgIENIRUNLX0VRKCh1bnNpZ25lZClwdHJbMF0sIDF1KTsgIC8vIGNvbmZpZ3VyYXRpb25WZXJzaW9uID09IDEKLSAgICAgICAgICAgIHVpbnQ4X3QgcHJvZmlsZSA9IHB0clsxXTsKLSAgICAgICAgICAgIHVpbnQ4X3QgbGV2ZWwgPSBwdHJbM107CisgICAgICAgICAgICB1aW50OF90IHByb2ZpbGUgX191bnVzZWQgPSBwdHJbMV07CisgICAgICAgICAgICB1aW50OF90IGxldmVsIF9fdW51c2VkID0gcHRyWzNdOwogCiAgICAgICAgICAgICAvLyBUaGVyZSBpcyBkZWNvZGFibGUgY29udGVudCBvdXQgdGhlcmUgdGhhdCBmYWlscyB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgICAvLyBhc3NlcnRpb24sIGxldCdzIGJlIGxlbmllbnQgZm9yIG5vdy4uLgogICAgICAgICAgICAgLy8gQ0hFQ0soKHB0cls0XSA+PiAyKSA9PSAweDNmKTsgIC8vIHJlc2VydmVkCiAKLSAgICAgICAgICAgIHNpemVfdCBsZW5ndGhTaXplID0gMSArIChwdHJbNF0gJiAzKTsKKyAgICAgICAgICAgIHNpemVfdCBsZW5ndGhTaXplIF9fdW51c2VkID0gMSArIChwdHJbNF0gJiAzKTsKIAogICAgICAgICAgICAgLy8gY29tbWVudGVkIG91dCBjaGVjayBiZWxvdyBhcyBIMjY0X1FWR0FfNTAwX05PX0FVRElPLjNncAogICAgICAgICAgICAgLy8gdmlvbGF0ZXMgaXQuLi4KQEAgLTQ5MSw3ICs0OTAsNyBAQAogCiAgICAgICAgICAgICAgICAgaWYgKHNpemVOZWVkZWQgPiBzaXplTGVmdCkgewogICAgICAgICAgICAgICAgICAgICBpZiAob3V0QnVmZmVyLT5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBmaXQgZXZlbiBhIHNpbmdsZSBpbnB1dCBidWZmZXIgb2Ygc2l6ZSAlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBmaXQgZXZlbiBhIHNpbmdsZSBpbnB1dCBidWZmZXIgb2Ygc2l6ZSAlenUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZU5lZWRlZCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfR1Qob3V0QnVmZmVyLT5zaXplKCksIDB1KTsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAKaW5kZXggODFlZGNiNC4uYTljNmVkYSAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAKQEAgLTE5LDYgKzE5LDggQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAic3RhZ2VmcmlnaHQiCkBAIC01MDYsOCArNTA4LDEzIEBACiAgICAgc3A8TVBFRzRXcml0ZXI+IHdyaXRlciA9CiAgICAgICAgIG5ldyBNUEVHNFdyaXRlcihnV3JpdGVNUDRGaWxlbmFtZS5zdHJpbmcoKSk7CiAjZWxzZQorICAgIGludCBmZCA9IG9wZW4oZ1dyaXRlTVA0RmlsZW5hbWUuc3RyaW5nKCksIE9fQ1JFQVQgfCBPX0xBUkdFRklMRSB8IE9fVFJVTkMgfCBPX1JEV1IsIFNfSVJVU1IgfCBTX0lXVVNSKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGRuJ3Qgb3BlbiBmaWxlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgc3A8TVBFRzJUU1dyaXRlcj4gd3JpdGVyID0KLSAgICAgICAgbmV3IE1QRUcyVFNXcml0ZXIoZ1dyaXRlTVA0RmlsZW5hbWUuc3RyaW5nKCkpOworICAgICAgICBuZXcgTVBFRzJUU1dyaXRlcihmZCk7CiAjZW5kaWYKIAogICAgIC8vIGF0IG1vc3Qgb25lIG1pbnV0ZS4KQEAgLTk1OCw3ICs5NjUsNyBAQAogICAgIE9NWENsaWVudCBjbGllbnQ7CiAgICAgc3RhdHVzX3QgZXJyID0gY2xpZW50LmNvbm5lY3QoKTsKIAotICAgIGZvciAoaW50IGsgPSAwOyBrIDwgYXJnYzsgKytrKSB7CisgICAgZm9yIChpbnQgayA9IDA7IGsgPCBhcmdjICYmIGVyciA9PSBPSzsgKytrKSB7CiAgICAgICAgIGJvb2wgc3luY0luZm9QcmVzZW50ID0gdHJ1ZTsKIAogICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IGFyZ3Zba107CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3N0cmVhbS5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0cmVhbS5jcHAKaW5kZXggMDU2NmQxNC4uMWE0MGU1MyAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9zdHJlYW0uY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcApAQCAtMjY5LDcgKzI2OSw3IEBACiAgICAgICAgIDogbUVPUyhmYWxzZSkgewogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikgeworICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50IG1zZywgaW50IGV4dDEgX191bnVzZWQsIGludCBleHQyIF9fdW51c2VkLCBjb25zdCBQYXJjZWwgKm9iaiBfX3VudXNlZCkgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgICAgIGlmIChtc2cgPT0gTUVESUFfRVJST1IgfHwgbXNnID09IE1FRElBX1BMQVlCQUNLX0NPTVBMRVRFKSB7CkBAIC0zMTgsNyArMzE4LDcgQEAKICAgICBzc2l6ZV90IGRpc3BsYXlXaWR0aCA9IGluZm8udzsKICAgICBzc2l6ZV90IGRpc3BsYXlIZWlnaHQgPSBpbmZvLmg7CiAKLSAgICBBTE9HVigiZGlzcGxheSBpcyAlZCB4ICVkXG4iLCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQpOworICAgIEFMT0dWKCJkaXNwbGF5IGlzICV6ZCB4ICV6ZFxuIiwgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0KTsKIAogICAgIHNwPFN1cmZhY2VDb250cm9sPiBjb250cm9sID0KICAgICAgICAgY29tcG9zZXJDbGllbnQtPmNyZWF0ZVN1cmZhY2UoCmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0lEcm1NYW5hZ2VyU2VydmljZS5jcHAgYi9kcm0vY29tbW9uL0lEcm1NYW5hZ2VyU2VydmljZS5jcHAKaW5kZXggNTdlNWZjNS4uZjJlMTRiNiAxMDA2NDQKLS0tIGEvZHJtL2NvbW1vbi9JRHJtTWFuYWdlclNlcnZpY2UuY3BwCisrKyBiL2RybS9jb21tb24vSURybU1hbmFnZXJTZXJ2aWNlLmNwcApAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgIklEcm1NYW5hZ2VyU2VydmljZS5oIgogCiAjZGVmaW5lIElOVkFMSURfQlVGRkVSX0xFTkdUSCAtMQorI2RlZmluZSBNQVhfQklOREVSX1RSQU5TQUNUSU9OX1NJWkUgKCgxKjEwMjQqMTAyNCktKDQwOTYqMikpCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCkBAIC05MzUsNyArOTM2LDEyIEBACiAKICAgICAgICAgLy9GaWxsaW5nIERSTSBpbmZvCiAgICAgICAgIGNvbnN0IGludCBpbmZvVHlwZSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgIGNvbnN0IGludCBidWZmZXJTaXplID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgY29uc3QgdWludDMyX3QgYnVmZmVyU2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CisKKyAgICAgICAgaWYgKGJ1ZmZlclNpemUgPiBkYXRhLmRhdGFBdmFpbCgpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKICAgICAgICAgY2hhciogYnVmZmVyID0gTlVMTDsKICAgICAgICAgaWYgKDAgPCBidWZmZXJTaXplKSB7CiAgICAgICAgICAgICBidWZmZXIgPSAoY2hhciAqKWRhdGEucmVhZElucGxhY2UoYnVmZmVyU2l6ZSk7CkBAIC05ODgsNiArOTk0LDkgQEAKIAogICAgICAgICBjb25zdCBpbnQgc2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzaXplOyArK2luZGV4KSB7CisgICAgICAgICAgICBpZiAoIWRhdGEuZGF0YUF2YWlsKCkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgga2V5KGRhdGEucmVhZFN0cmluZzgoKSk7CiAgICAgICAgICAgICBpZiAoa2V5ID09IFN0cmluZzgoIkZpbGVEZXNjcmlwdG9yS2V5IikpIHsKICAgICAgICAgICAgICAgICBjaGFyIGJ1ZmZlclsxNl07CkBAIC0xMDM3LDcgKzEwNDYsMTIgQEAKICAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKIAogICAgICAgICAvL0ZpbGxpbmcgRFJNIFJpZ2h0cwotICAgICAgICBjb25zdCBpbnQgYnVmZmVyU2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IGJ1ZmZlclNpemUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBpZiAoYnVmZmVyU2l6ZSA+IGRhdGEuZGF0YUF2YWlsKCkpIHsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKEJBRF9WQUxVRSk7CisgICAgICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgICAgICB9CisKICAgICAgICAgY29uc3QgRHJtQnVmZmVyIGRybUJ1ZmZlcigoY2hhciAqKWRhdGEucmVhZElucGxhY2UoYnVmZmVyU2l6ZSksIGJ1ZmZlclNpemUpOwogCiAgICAgICAgIGNvbnN0IFN0cmluZzggbWltZVR5cGUoZGF0YS5yZWFkU3RyaW5nOCgpKTsKQEAgLTEyMDgsMTAgKzEyMjIsMTMgQEAKICAgICAgICAgY29uc3QgaW50IGNvbnZlcnRJZCA9IGRhdGEucmVhZEludDMyKCk7CiAKICAgICAgICAgLy9GaWxsaW5nIGlucHV0IGRhdGEKLSAgICAgICAgY29uc3QgaW50IGJ1ZmZlclNpemUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBjb25zdCB1aW50MzJfdCBidWZmZXJTaXplID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKGJ1ZmZlclNpemUgPiBkYXRhLmRhdGFBdmFpbCgpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CiAgICAgICAgIERybUJ1ZmZlciogaW5wdXREYXRhID0gbmV3IERybUJ1ZmZlcigoY2hhciAqKWRhdGEucmVhZElucGxhY2UoYnVmZmVyU2l6ZSksIGJ1ZmZlclNpemUpOwogCi0gICAgICAgIERybUNvbnZlcnRlZFN0YXR1cyogICAgZHJtQ29udmVydGVkU3RhdHVzID0gY29udmVydERhdGEodW5pcXVlSWQsIGNvbnZlcnRJZCwgaW5wdXREYXRhKTsKKyAgICAgICAgRHJtQ29udmVydGVkU3RhdHVzKiBkcm1Db252ZXJ0ZWRTdGF0dXMgPSBjb252ZXJ0RGF0YSh1bmlxdWVJZCwgY29udmVydElkLCBpbnB1dERhdGEpOwogCiAgICAgICAgIGlmIChOVUxMICE9IGRybUNvbnZlcnRlZFN0YXR1cykgewogICAgICAgICAgICAgLy9GaWxsaW5nIERybSBDb252ZXJ0ZWQgU3RzdHVzCkBAIC0xMzk1LDcgKzE0MTIsMTIgQEAKICAgICAgICAgY29uc3QgaW50IGRlY3J5cHRVbml0SWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCiAgICAgICAgIC8vRmlsbGluZyBIZWFkZXIgaW5mbwotICAgICAgICBjb25zdCBpbnQgYnVmZmVyU2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IGJ1ZmZlclNpemUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBpZiAoYnVmZmVyU2l6ZSA+IGRhdGEuZGF0YUF2YWlsKCkpIHsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKEJBRF9WQUxVRSk7CisgICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoJmhhbmRsZSk7CisgICAgICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgICAgICB9CiAgICAgICAgIERybUJ1ZmZlciogaGVhZGVySW5mbyA9IE5VTEw7CiAgICAgICAgIGhlYWRlckluZm8gPSBuZXcgRHJtQnVmZmVyKChjaGFyICopZGF0YS5yZWFkSW5wbGFjZShidWZmZXJTaXplKSwgYnVmZmVyU2l6ZSk7CiAKQEAgLTE0MTksOSArMTQ0MSwxNyBAQAogICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKCZoYW5kbGUsIGRhdGEpOwogCiAgICAgICAgIGNvbnN0IGludCBkZWNyeXB0VW5pdElkID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgY29uc3QgaW50IGRlY0J1ZmZlclNpemUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBjb25zdCB1aW50MzJfdCBkZWNCdWZmZXJTaXplID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgY29uc3QgdWludDMyX3QgZW5jQnVmZmVyU2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CiAKLSAgICAgICAgY29uc3QgaW50IGVuY0J1ZmZlclNpemUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBpZiAoZW5jQnVmZmVyU2l6ZSA+IGRhdGEuZGF0YUF2YWlsKCkgfHwKKyAgICAgICAgICAgIGRlY0J1ZmZlclNpemUgPiBNQVhfQklOREVSX1RSQU5TQUNUSU9OX1NJWkUpIHsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKEJBRF9WQUxVRSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigwKTsKKyAgICAgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKKyAgICAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgICAgIH0KKwogICAgICAgICBEcm1CdWZmZXIqIGVuY0J1ZmZlcgogICAgICAgICAgICAgPSBuZXcgRHJtQnVmZmVyKChjaGFyICopZGF0YS5yZWFkSW5wbGFjZShlbmNCdWZmZXJTaXplKSwgZW5jQnVmZmVyU2l6ZSk7CiAKQEAgLTE0MzEsOCArMTQ2MSwxMCBAQAogCiAgICAgICAgIERybUJ1ZmZlciogSVYgPSBOVUxMOwogICAgICAgICBpZiAoMCAhPSBkYXRhLmRhdGFBdmFpbCgpKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgaXZCdWZmZXJsZW5ndGggPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgSVYgPSBuZXcgRHJtQnVmZmVyKChjaGFyICopZGF0YS5yZWFkSW5wbGFjZShpdkJ1ZmZlcmxlbmd0aCksIGl2QnVmZmVybGVuZ3RoKTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGl2QnVmZmVybGVuZ3RoID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGlmIChpdkJ1ZmZlcmxlbmd0aCA8PSBkYXRhLmRhdGFBdmFpbCgpKSB7CisgICAgICAgICAgICAgICAgSVYgPSBuZXcgRHJtQnVmZmVyKChjaGFyICopZGF0YS5yZWFkSW5wbGFjZShpdkJ1ZmZlcmxlbmd0aCksIGl2QnVmZmVybGVuZ3RoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cwpAQCAtMTQ4MSw3ICsxNTEzLDExIEBACiAgICAgICAgIERlY3J5cHRIYW5kbGUgaGFuZGxlOwogICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKCZoYW5kbGUsIGRhdGEpOwogCi0gICAgICAgIGNvbnN0IGludCBudW1CeXRlcyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IG51bUJ5dGVzID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKG51bUJ5dGVzID4gTUFYX0JJTkRFUl9UUkFOU0FDVElPTl9TSVpFKSB7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihCQURfVkFMVUUpOworICAgICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICAgICAgfQogICAgICAgICBjaGFyKiBidWZmZXIgPSBuZXcgY2hhcltudW1CeXRlc107CiAKICAgICAgICAgY29uc3Qgb2ZmNjRfdCBvZmZzZXQgPSBkYXRhLnJlYWRJbnQ2NCgpOwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29udmVydGVyL0Z3ZExvY2tDb252LmMgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb252ZXJ0ZXIvRndkTG9ja0NvbnYuYwppbmRleCA5ZDE1ODM1Li42YTBiM2MwIDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb252ZXJ0ZXIvRndkTG9ja0NvbnYuYworKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb252ZXJ0ZXIvRndkTG9ja0NvbnYuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcnlwdG9GYWN0b3J5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b0ZhY3RvcnkuY3BwCmluZGV4IGVlMzE4OWIuLmVlYjY0YzMgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b0ZhY3RvcnkuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b0ZhY3RvcnkuY3BwCkBAIC00MywxMCArNDMsMTggQEAKICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBhbmRyb2lkOjpzcDxTZXNzaW9uPiBzZXNzaW9uID0gU2Vzc2lvbkxpYnJhcnk6OmdldCgpLT5maW5kU2Vzc2lvbigKLSAgICAgICAgICAgIGRhdGEsIHNpemUpOwotICAgICpwbHVnaW4gPSBuZXcgQ3J5cHRvUGx1Z2luKHNlc3Npb24pOwotICAgIHJldHVybiBhbmRyb2lkOjpPSzsKKyAgICBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkOworICAgIHNlc3Npb25JZC5hcHBlbmRBcnJheShyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihkYXRhKSwgc2l6ZSk7CisKKyAgICBDcnlwdG9QbHVnaW4gKmNsZWFyS2V5UGx1Z2luID0gbmV3IENyeXB0b1BsdWdpbihzZXNzaW9uSWQpOworICAgIGFuZHJvaWQ6OnN0YXR1c190IHJlc3VsdCA9IGNsZWFyS2V5UGx1Z2luLT5nZXRJbml0U3RhdHVzKCk7CisgICAgaWYgKHJlc3VsdCA9PSBhbmRyb2lkOjpPSykgeworICAgICAgICAqcGx1Z2luID0gY2xlYXJLZXlQbHVnaW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVsZXRlIGNsZWFyS2V5UGx1Z2luOworICAgICAgICAqcGx1Z2luID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b1BsdWdpbi5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcnlwdG9QbHVnaW4uY3BwCmluZGV4IGFkYWQxMzYuLjUzY2JmODAgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b1BsdWdpbi5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvUGx1Z2luLmNwcApAQCAtMTksOSArMTksOSBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KIAogI2luY2x1ZGUgIkNyeXB0b1BsdWdpbi5oIgorI2luY2x1ZGUgIlNlc3Npb25MaWJyYXJ5LmgiCiAKIG5hbWVzcGFjZSBjbGVhcmtleWRybSB7CiAKQEAgLTgwLDQgKzgwLDE4IEBACiAgICAgfQogfQogCithbmRyb2lkOjpzdGF0dXNfdCBDcnlwdG9QbHVnaW46OnNldE1lZGlhRHJtU2Vzc2lvbigKKyAgICAgICAgY29uc3QgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKKyAgICBpZiAoIXNlc3Npb25JZC5zaXplKCkpIHsKKyAgICAgICAgbVNlc3Npb24uY2xlYXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtU2Vzc2lvbiA9IFNlc3Npb25MaWJyYXJ5OjpnZXQoKS0+ZmluZFNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICAgICAgaWYgKCFtU2Vzc2lvbi5nZXQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQorCisKIH0gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvUGx1Z2luLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcnlwdG9QbHVnaW4uaAppbmRleCAwMDJkOWUwLi5mZDM4ZjI4IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcnlwdG9QbHVnaW4uaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcnlwdG9QbHVnaW4uaApAQCAtMzEsNyArMzEsMTAgQEAKIAogY2xhc3MgQ3J5cHRvUGx1Z2luIDogcHVibGljIGFuZHJvaWQ6OkNyeXB0b1BsdWdpbiB7CiBwdWJsaWM6Ci0gICAgQ3J5cHRvUGx1Z2luKGNvbnN0IGFuZHJvaWQ6OnNwPFNlc3Npb24+JiBzZXNzaW9uKSA6IG1TZXNzaW9uKHNlc3Npb24pIHt9CisgICAgQ3J5cHRvUGx1Z2luKGNvbnN0IGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgICAgIG1Jbml0U3RhdHVzID0gc2V0TWVkaWFEcm1TZXNzaW9uKHNlc3Npb25JZCk7CisgICAgfQorCiAgICAgdmlydHVhbCB+Q3J5cHRvUGx1Z2luKCkge30KIAogICAgIHZpcnR1YWwgYm9vbCByZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoY29uc3QgY2hhciogbWltZSkgY29uc3QgewpAQCAtNDUsMTAgKzQ4LDE2IEBACiAgICAgICAgICAgICBjb25zdCBTdWJTYW1wbGUqIHN1YlNhbXBsZXMsIHNpemVfdCBudW1TdWJTYW1wbGVzLAogICAgICAgICAgICAgdm9pZCogZHN0UHRyLCBhbmRyb2lkOjpBU3RyaW5nKiBlcnJvckRldGFpbE1zZyk7CiAKKyAgICB2aXJ0dWFsIGFuZHJvaWQ6OnN0YXR1c190IHNldE1lZGlhRHJtU2Vzc2lvbigKKyAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKTsKKworICAgIGFuZHJvaWQ6OnN0YXR1c190IGdldEluaXRTdGF0dXMoKSBjb25zdCB7cmV0dXJuIG1Jbml0U3RhdHVzO30KKwogcHJpdmF0ZToKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDcnlwdG9QbHVnaW4pOwogCiAgICAgYW5kcm9pZDo6c3A8U2Vzc2lvbj4gbVNlc3Npb247CisgICAgYW5kcm9pZDo6c3RhdHVzX3QgbUluaXRTdGF0dXM7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtUGx1Z2luLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5jcHAKaW5kZXggOTZmY2E5NC4uZTVlZTQwMyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtUGx1Z2luLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1QbHVnaW4uY3BwCkBAIC0zNyw3ICszNyw5IEBACiAKIHN0YXR1c190IERybVBsdWdpbjo6Y2xvc2VTZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CiAgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oc2Vzc2lvbklkKTsKLSAgICBtU2Vzc2lvbkxpYnJhcnktPmRlc3Ryb3lTZXNzaW9uKHNlc3Npb24pOworICAgIGlmIChzZXNzaW9uLmdldCgpKSB7CisgICAgICAgIG1TZXNzaW9uTGlicmFyeS0+ZGVzdHJveVNlc3Npb24oc2Vzc2lvbik7CisgICAgfQogICAgIHJldHVybiBhbmRyb2lkOjpPSzsKIH0KIApAQCAtNDgsMTQgKzUwLDE4IEBACiAgICAgICAgIEtleVR5cGUga2V5VHlwZSwKICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIG9wdGlvbmFsUGFyYW1ldGVycywKICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LAotICAgICAgICBTdHJpbmc4JiBkZWZhdWx0VXJsKSB7CisgICAgICAgIFN0cmluZzgmIGRlZmF1bHRVcmwsCisgICAgICAgIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUgKmtleVJlcXVlc3RUeXBlKSB7CiAgICAgVU5VU0VEKG9wdGlvbmFsUGFyYW1ldGVycyk7CiAgICAgaWYgKGtleVR5cGUgIT0ga0tleVR5cGVfU3RyZWFtaW5nKSB7CiAgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKICAgICB9Ci0KLSAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbihzY29wZSk7CisgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfSW5pdGlhbDsKICAgICBkZWZhdWx0VXJsLmNsZWFyKCk7CisgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oc2NvcGUpOworICAgIGlmICghc2Vzc2lvbi5nZXQoKSkgeworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICB9CiAgICAgcmV0dXJuIHNlc3Npb24tPmdldEtleVJlcXVlc3QoaW5pdERhdGEsIGluaXREYXRhVHlwZSwgJnJlcXVlc3QpOwogfQogCkBAIC02NCw2ICs3MCw5IEBACiAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UsCiAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYga2V5U2V0SWQpIHsKICAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbihzY29wZSk7CisgICAgaWYgKCFzZXNzaW9uLmdldCgpKSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworICAgIH0KICAgICBzdGF0dXNfdCByZXMgPSBzZXNzaW9uLT5wcm92aWRlS2V5UmVzcG9uc2UocmVzcG9uc2UpOwogICAgIGlmIChyZXMgPT0gYW5kcm9pZDo6T0spIHsKICAgICAgICAga2V5U2V0SWQuY2xlYXIoKTsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtUGx1Z2luLmgKaW5kZXggNjEzOWYxZi4uYmE0YWVmZSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtUGx1Z2luLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtUGx1Z2luLmgKQEAgLTU0LDcgKzU0LDggQEAKICAgICAgICAgICAgIEtleVR5cGUga2V5VHlwZSwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+JiBvcHRpb25hbFBhcmFtZXRlcnMsCiAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHJlcXVlc3QsCi0gICAgICAgICAgICBTdHJpbmc4JiBkZWZhdWx0VXJsKTsKKyAgICAgICAgICAgIFN0cmluZzgmIGRlZmF1bHRVcmwsCisgICAgICAgICAgICBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlICprZXlSZXF1ZXN0VHlwZSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHByb3ZpZGVLZXlSZXNwb25zZSgKICAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2NvcGUsCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9TZXNzaW9uTGlicmFyeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9TZXNzaW9uTGlicmFyeS5jcHAKaW5kZXggZDA0N2M1My4uNDZkN2Y3NyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvU2Vzc2lvbkxpYnJhcnkuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb25MaWJyYXJ5LmNwcApAQCAtNjMsMTMgKzYzLDYgQEAKICAgICByZXR1cm4gbVNlc3Npb25zLnZhbHVlRm9yKHNlc3Npb25JZCk7CiB9CiAKLWNvbnN0IHNwPFNlc3Npb24+JiBTZXNzaW9uTGlicmFyeTo6ZmluZFNlc3Npb24oCi0gICAgICAgIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgVmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZDsKLSAgICBzZXNzaW9uSWQuYXBwZW5kQXJyYXkocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oZGF0YSksIHNpemUpOwotICAgIHJldHVybiBmaW5kU2Vzc2lvbihzZXNzaW9uSWQpOwotfQotCiB2b2lkIFNlc3Npb25MaWJyYXJ5OjpkZXN0cm95U2Vzc2lvbihjb25zdCBzcDxTZXNzaW9uPiYgc2Vzc2lvbikgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXNzaW9uc0xvY2spO1wKICAgICBtU2Vzc2lvbnMucmVtb3ZlSXRlbShzZXNzaW9uLT5zZXNzaW9uSWQoKSk7CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9TZXNzaW9uTGlicmFyeS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvU2Vzc2lvbkxpYnJhcnkuaAppbmRleCA1NmM4ODI4Li4xOTlhZDY0IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9TZXNzaW9uTGlicmFyeS5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb25MaWJyYXJ5LmgKQEAgLTM2LDggKzM2LDYgQEAKICAgICBjb25zdCBhbmRyb2lkOjpzcDxTZXNzaW9uPiYgZmluZFNlc3Npb24oCiAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCk7CiAKLSAgICBjb25zdCBhbmRyb2lkOjpzcDxTZXNzaW9uPiYgZmluZFNlc3Npb24oY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpOwotCiAgICAgdm9pZCBkZXN0cm95U2Vzc2lvbihjb25zdCBhbmRyb2lkOjpzcDxTZXNzaW9uPiYgc2Vzc2lvbik7CiAKIHByaXZhdGU6CkBAIC01MCw3ICs0OCw3IEBACiAKICAgICBhbmRyb2lkOjpNdXRleCBtU2Vzc2lvbnNMb2NrOwogICAgIHVpbnQzMl90IG1OZXh0U2Vzc2lvbklkOwotICAgIGFuZHJvaWQ6OktleWVkVmVjdG9yPGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiwgYW5kcm9pZDo6c3A8U2Vzc2lvbj4gPgorICAgIGFuZHJvaWQ6OkRlZmF1bHRLZXllZFZlY3RvcjxhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4sIGFuZHJvaWQ6OnNwPFNlc3Npb24+ID4KICAgICAgICAgICAgIG1TZXNzaW9uczsKIH07CiAKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svTW9ja0RybUNyeXB0b1BsdWdpbi5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL01vY2tEcm1DcnlwdG9QbHVnaW4uY3BwCmluZGV4IDdlYWMwYTEuLjg1MWFkMmMgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svTW9ja0RybUNyeXB0b1BsdWdpbi5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9Nb2NrRHJtQ3J5cHRvUGx1Z2luLmNwcApAQCAtNTYsNyArNTYsNyBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBNb2NrRHJtRmFjdG9yeTo6Y3JlYXRlRHJtUGx1Z2luKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIERybVBsdWdpbiAqKnBsdWdpbikKKyAgICBzdGF0dXNfdCBNb2NrRHJtRmFjdG9yeTo6Y3JlYXRlRHJtUGx1Z2luKGNvbnN0IHVpbnQ4X3QgLyogdXVpZCAqL1sxNl0sIERybVBsdWdpbiAqKnBsdWdpbikKICAgICB7CiAgICAgICAgICpwbHVnaW4gPSBuZXcgTW9ja0RybVBsdWdpbigpOwogICAgICAgICByZXR1cm4gT0s7CkBAIC02OCw4ICs2OCw5IEBACiAgICAgICAgIHJldHVybiAoIW1lbWNtcCh1dWlkLCBtb2NrX3V1aWQsIHNpemVvZihtb2NrX3V1aWQpKSk7CiAgICAgfQogCi0gICAgc3RhdHVzX3QgTW9ja0NyeXB0b0ZhY3Rvcnk6OmNyZWF0ZVBsdWdpbihjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCB2b2lkICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsIENyeXB0b1BsdWdpbiAqKnBsdWdpbikKKyAgICBzdGF0dXNfdCBNb2NrQ3J5cHRvRmFjdG9yeTo6Y3JlYXRlUGx1Z2luKGNvbnN0IHVpbnQ4X3QgLyogdXVpZCAqL1sxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICogLyogZGF0YSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAvKiBzaXplICovLCBDcnlwdG9QbHVnaW4gKipwbHVnaW4pCiAgICAgewogICAgICAgICAqcGx1Z2luID0gbmV3IE1vY2tDcnlwdG9QbHVnaW4oKTsKICAgICAgICAgcmV0dXJuIE9LOwpAQCAtMTExLDcgKzExMiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmluaXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmbWltZVR5cGUsIEtleVR5cGUga2V5VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGNvbnN0ICZvcHRpb25hbFBhcmFtZXRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnJlcXVlc3QsIFN0cmluZzggJmRlZmF1bHRVcmwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnJlcXVlc3QsIFN0cmluZzggJmRlZmF1bHRVcmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlSZXF1ZXN0VHlwZSAqa2V5UmVxdWVzdFR5cGUpCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgICAgIEFMT0dEKCJNb2NrRHJtUGx1Z2luOjpnZXRLZXlSZXF1ZXN0KHNlc3Npb25JZD0lcywgaW5pdERhdGE9JXMsIG1pbWVUeXBlPSVzIgpAQCAtMTQ5LDYgKzE1MSw3IEBACiAgICAgICAgIC8vIFByb3BlcnRpZXMgdXNlZCBpbiBtb2NrIHRlc3QsIHNldCBieSBjdHMgdGVzdCBhcHAgcmV0dXJuZWQgZnJvbSBtb2NrIHBsdWdpbgogICAgICAgICAvLyAgIGJ5dGVbXSBtb2NrLXJlcXVlc3QgICAgICAgLT4gcmVxdWVzdAogICAgICAgICAvLyAgIHN0cmluZyBtb2NrLWRlZmF1bHQtdXJsICAgLT4gZGVmYXVsdFVybAorICAgICAgICAvLyAgIHN0cmluZyBtb2NrLWtleVJlcXVlc3RUeXBlIC0+IGtleVJlcXVlc3RUeXBlCiAKICAgICAgICAgaW5kZXggPSBtQnl0ZUFycmF5UHJvcGVydGllcy5pbmRleE9mS2V5KFN0cmluZzgoIm1vY2stcmVxdWVzdCIpKTsKICAgICAgICAgaWYgKGluZGV4IDwgMCkgewpAQCAtMTY1LDYgKzE2OCwxNiBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZGVmYXVsdFVybCA9IG1TdHJpbmdQcm9wZXJ0aWVzLnZhbHVlQXQoaW5kZXgpOwogICAgICAgICB9CisKKyAgICAgICAgaW5kZXggPSBtU3RyaW5nUHJvcGVydGllcy5pbmRleE9mS2V5KFN0cmluZzgoIm1vY2sta2V5UmVxdWVzdFR5cGUiKSk7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dEKCJNaXNzaW5nICdtb2NrLWtleVJlcXVlc3RUeXBlJyBwYXJhbWV0ZXIgZm9yIG1vY2siKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBzdGF0aWNfY2FzdDxLZXlSZXF1ZXN0VHlwZT4oCisgICAgICAgICAgICAgICAgYXRvaShtU3RyaW5nUHJvcGVydGllcy52YWx1ZUF0KGluZGV4KS5zdHJpbmcoKSkpOworICAgICAgICB9CisKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIApAQCAtMjU0LDggKzI2Nyw4IEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBNb2NrRHJtUGx1Z2luOjpnZXRQcm92aXNpb25SZXF1ZXN0KFN0cmluZzggY29uc3QgJmNlcnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmY2VydEF1dGhvcml0eSwKKyAgICBzdGF0dXNfdCBNb2NrRHJtUGx1Z2luOjpnZXRQcm92aXNpb25SZXF1ZXN0KFN0cmluZzggY29uc3QgJiAvKiBjZXJ0VHlwZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJiAvKiBjZXJ0QXV0aG9yaXR5ICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZyZXF1ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCAmZGVmYXVsdFVybCkKICAgICB7CkBAIC0yODUsOCArMjk4LDggQEAKICAgICB9CiAKICAgICBzdGF0dXNfdCBNb2NrRHJtUGx1Z2luOjpwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZyZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZjZXJ0aWZpY2F0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ3cmFwcGVkS2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJiAvKiBjZXJ0aWZpY2F0ZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICYgLyogd3JhcHBlZEtleSAqLykKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICAgICAgQUxPR0QoIk1vY2tEcm1QbHVnaW46OnByb3ZpZGVQcm92aXNpb25SZXNwb25zZSglcykiLApAQCAtMzA1LDcgKzMxOCw4IEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBNb2NrRHJtUGx1Z2luOjpnZXRTZWN1cmVTdG9wKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NpZCwgVmVjdG9yPHVpbnQ4X3Q+ICZzZWN1cmVTdG9wKQorICAgIHN0YXR1c190IE1vY2tEcm1QbHVnaW46OmdldFNlY3VyZVN0b3AoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICYgLyogc3NpZCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmIHNlY3VyZVN0b3ApCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgICAgIEFMT0dEKCJNb2NrRHJtUGx1Z2luOjpnZXRTZWN1cmVTdG9wKCkiKTsKQEAgLTQyNyw2ICs0NDEsNjMgQEAKICAgICAgICAgICAgICAgICAgIHBEYXRhID8gdmVjdG9yVG9TdHJpbmcoKnBEYXRhKSA6ICJ7fSIpOwogCiAgICAgICAgICAgICBzZW5kRXZlbnQoZXZlbnRUeXBlLCBleHRyYSwgcFNlc3Npb25JZCwgcERhdGEpOworICAgICAgICB9IGVsc2UgaWYgKG5hbWUgPT0gIm1vY2stc2VuZC1leHBpcmF0aW9uLXVwZGF0ZSIpIHsKKyAgICAgICAgICAgIGludDY0X3QgZXhwaXJ5VGltZU1TOworICAgICAgICAgICAgc3NjYW5mKHZhbHVlLnN0cmluZygpLCAiJWpkIiwgJmV4cGlyeVRpbWVNUyk7CisKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAqcFNlc3Npb25JZCA9IE5VTEw7CisgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUJ5dGVBcnJheVByb3BlcnRpZXMuaW5kZXhPZktleShTdHJpbmc4KCJtb2NrLWV2ZW50LXNlc3Npb24taWQiKSk7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uSWQgPSAmbUJ5dGVBcnJheVByb3BlcnRpZXNbaW5kZXhdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTE9HRCgic2VuZGluZyBleHBpcmF0aW9uLXVwZGF0ZSBmcm9tIG1vY2sgZHJtIHBsdWdpbjogJWpkICVzIiwKKyAgICAgICAgICAgICAgICAgIGV4cGlyeVRpbWVNUywgcFNlc3Npb25JZCA/IHZlY3RvclRvU3RyaW5nKCpwU2Vzc2lvbklkKSA6ICJ7fSIpOworCisgICAgICAgICAgICBzZW5kRXhwaXJhdGlvblVwZGF0ZShwU2Vzc2lvbklkLCBleHBpcnlUaW1lTVMpOworICAgICAgICB9IGVsc2UgaWYgKG5hbWUgPT0gIm1vY2stc2VuZC1rZXlzLWNoYW5nZSIpIHsKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAqcFNlc3Npb25JZCA9IE5VTEw7CisgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUJ5dGVBcnJheVByb3BlcnRpZXMuaW5kZXhPZktleShTdHJpbmc4KCJtb2NrLWV2ZW50LXNlc3Npb24taWQiKSk7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uSWQgPSAmbUJ5dGVBcnJheVByb3BlcnRpZXNbaW5kZXhdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTE9HRCgic2VuZGluZyBrZXlzLWNoYW5nZSBmcm9tIG1vY2sgZHJtIHBsdWdpbjogJXMiLAorICAgICAgICAgICAgICAgICAgcFNlc3Npb25JZCA/IHZlY3RvclRvU3RyaW5nKCpwU2Vzc2lvbklkKSA6ICJ7fSIpOworCisgICAgICAgICAgICBWZWN0b3I8RHJtUGx1Z2luOjpLZXlTdGF0dXM+IGtleVN0YXR1c0xpc3Q7CisgICAgICAgICAgICBEcm1QbHVnaW46OktleVN0YXR1cyBrZXlTdGF0dXM7CisgICAgICAgICAgICB1aW50OF90IGtleUlkMVtdID0geydrJywgJ2UnLCAneScsICcxJ307CisgICAgICAgICAgICBrZXlTdGF0dXMubUtleUlkLmNsZWFyKCk7CisgICAgICAgICAgICBrZXlTdGF0dXMubUtleUlkLmFwcGVuZEFycmF5KGtleUlkMSwgc2l6ZW9mKGtleUlkMSkpOworICAgICAgICAgICAga2V5U3RhdHVzLm1UeXBlID0gRHJtUGx1Z2luOjprS2V5U3RhdHVzVHlwZV9Vc2FibGU7CisgICAgICAgICAgICBrZXlTdGF0dXNMaXN0LmFkZChrZXlTdGF0dXMpOworCisgICAgICAgICAgICB1aW50OF90IGtleUlkMltdID0geydrJywgJ2UnLCAneScsICcyJ307CisgICAgICAgICAgICBrZXlTdGF0dXMubUtleUlkLmNsZWFyKCk7CisgICAgICAgICAgICBrZXlTdGF0dXMubUtleUlkLmFwcGVuZEFycmF5KGtleUlkMiwgc2l6ZW9mKGtleUlkMikpOworICAgICAgICAgICAga2V5U3RhdHVzLm1UeXBlID0gRHJtUGx1Z2luOjprS2V5U3RhdHVzVHlwZV9FeHBpcmVkOworICAgICAgICAgICAga2V5U3RhdHVzTGlzdC5hZGQoa2V5U3RhdHVzKTsKKworICAgICAgICAgICAgdWludDhfdCBrZXlJZDNbXSA9IHsnaycsICdlJywgJ3knLCAnMyd9OworICAgICAgICAgICAga2V5U3RhdHVzLm1LZXlJZC5jbGVhcigpOworICAgICAgICAgICAga2V5U3RhdHVzLm1LZXlJZC5hcHBlbmRBcnJheShrZXlJZDMsIHNpemVvZihrZXlJZDMpKTsKKyAgICAgICAgICAgIGtleVN0YXR1cy5tVHlwZSA9IERybVBsdWdpbjo6a0tleVN0YXR1c1R5cGVfT3V0cHV0Tm90QWxsb3dlZDsKKyAgICAgICAgICAgIGtleVN0YXR1c0xpc3QuYWRkKGtleVN0YXR1cyk7CisKKyAgICAgICAgICAgIHVpbnQ4X3Qga2V5SWQ0W10gPSB7J2snLCAnZScsICd5JywgJzQnfTsKKyAgICAgICAgICAgIGtleVN0YXR1cy5tS2V5SWQuY2xlYXIoKTsKKyAgICAgICAgICAgIGtleVN0YXR1cy5tS2V5SWQuYXBwZW5kQXJyYXkoa2V5SWQ0LCBzaXplb2Yoa2V5SWQ0KSk7CisgICAgICAgICAgICBrZXlTdGF0dXMubVR5cGUgPSBEcm1QbHVnaW46OmtLZXlTdGF0dXNUeXBlX1N0YXR1c1BlbmRpbmc7CisgICAgICAgICAgICBrZXlTdGF0dXNMaXN0LmFkZChrZXlTdGF0dXMpOworCisgICAgICAgICAgICB1aW50OF90IGtleUlkNVtdID0geydrJywgJ2UnLCAneScsICc1J307CisgICAgICAgICAgICBrZXlTdGF0dXMubUtleUlkLmNsZWFyKCk7CisgICAgICAgICAgICBrZXlTdGF0dXMubUtleUlkLmFwcGVuZEFycmF5KGtleUlkNSwgc2l6ZW9mKGtleUlkNSkpOworICAgICAgICAgICAga2V5U3RhdHVzLm1UeXBlID0gRHJtUGx1Z2luOjprS2V5U3RhdHVzVHlwZV9JbnRlcm5hbEVycm9yOworICAgICAgICAgICAga2V5U3RhdHVzTGlzdC5hZGQoa2V5U3RhdHVzKTsKKworICAgICAgICAgICAgc2VuZEtleXNDaGFuZ2UocFNlc3Npb25JZCwgJmtleVN0YXR1c0xpc3QsIHRydWUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbVN0cmluZ1Byb3BlcnRpZXMuYWRkKG5hbWUsIHZhbHVlKTsKICAgICAgICAgfQpAQCAtNzI4LDcgKzc5OSw3IEBACiAgICAgc3NpemVfdAogICAgIE1vY2tDcnlwdG9QbHVnaW46OmRlY3J5cHQoYm9vbCBzZWN1cmUsIGNvbnN0IHVpbnQ4X3Qga2V5WzE2XSwgY29uc3QgdWludDhfdCBpdlsxNl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlIG1vZGUsIGNvbnN0IHZvaWQgKnNyY1B0ciwgY29uc3QgU3ViU2FtcGxlICpzdWJTYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bVN1YlNhbXBsZXMsIHZvaWQgKmRzdFB0ciwgQVN0cmluZyAqZXJyb3JEZXRhaWxNc2cpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtU3ViU2FtcGxlcywgdm9pZCAqZHN0UHRyLCBBU3RyaW5nICogLyogZXJyb3JEZXRhaWxNc2cgKi8pCiAgICAgewogICAgICAgICBBTE9HRCgiTW9ja0NyeXB0b1BsdWdpbjo6ZGVjcnlwdChzZWN1cmU9JWQsIGtleT0lcywgaXY9JXMsIG1vZGU9JWQsIHNyYz0lcCwgIgogICAgICAgICAgICAgICAic3ViU2FtcGxlcz0lcywgZHN0PSVwKSIsCkBAIC03NTcsNyArODI4LDcgQEAKICAgICB7CiAgICAgICAgIFN0cmluZzggcmVzdWx0OwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVN1YlNhbXBsZXM7IGkrKykgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiWyV6dV0ge2NsZWFyOiV6dSwgZW5jcnlwdGVkOiV6dX0gIiwgaSwKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlslenVdIHtjbGVhcjoldSwgZW5jcnlwdGVkOiV1fSAiLCBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mQ2xlYXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svTW9ja0RybUNyeXB0b1BsdWdpbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9Nb2NrRHJtQ3J5cHRvUGx1Z2luLmgKaW5kZXggZDFkODA1OC4uZDBmMmRkYiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9Nb2NrRHJtQ3J5cHRvUGx1Z2luLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9Nb2NrRHJtQ3J5cHRvUGx1Z2luLmgKQEAgLTYyLDcgKzYyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmluaXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJm1pbWVUeXBlLCBLZXlUeXBlIGtleVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gY29uc3QgJm9wdGlvbmFsUGFyYW1ldGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnJlcXVlc3QsIFN0cmluZzggJmRlZmF1bHRVcmwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmcmVxdWVzdCwgU3RyaW5nOCAmZGVmYXVsdFVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlSZXF1ZXN0VHlwZSAqa2V5UmVxdWVzdFR5cGUpOwogCiAgICAgICAgIHN0YXR1c190IHByb3ZpZGVLZXlSZXNwb25zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmcmVzcG9uc2UsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaAppbmRleCAxMjU0ZDNjLi45NTNkNzExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmgKQEAgLTU2LDcgKzU2LDcgQEAKICAgICAgKiB0aHJlYWQtc2FmZXR5LCBpdCBzaW1wbHkgcHJldmVudHMgdGhlIGNhbWVyYV9tZXRhZGF0YV90IHBvaW50ZXIgcmV0dXJuZWQKICAgICAgKiBoZXJlIGZyb20gYmVpbmcgYWNjaWRlbnRhbGx5IGludmFsaWRhdGVkIGJ5IENhbWVyYU1ldGFkYXRhIG9wZXJhdGlvbnMuCiAgICAgICovCi0gICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QqIGdldEFuZExvY2soKTsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCogZ2V0QW5kTG9jaygpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogVW5sb2NrIHRoZSBDYW1lcmFNZXRhZGF0YSBmb3IgdXNlIGFnYWluLiBBZnRlciB0aGlzIHVubG9jaywgdGhlIHBvaW50ZXIKQEAgLTIwOCw3ICsyMDgsNyBAQAogCiAgIHByaXZhdGU6CiAgICAgY2FtZXJhX21ldGFkYXRhX3QgKm1CdWZmZXI7Ci0gICAgYm9vbCAgICAgICAgICAgICAgIG1Mb2NrZWQ7CisgICAgbXV0YWJsZSBib29sICAgICAgIG1Mb2NrZWQ7CiAKICAgICAvKioKICAgICAgKiBDaGVjayBpZiB0YWcgaGFzIGEgZ2l2ZW4gdHlwZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oCmluZGV4IGM2MDc0ZmMuLmJhMzNmZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaAorKysgYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmgKQEAgLTEwOCw2ICsxMDgsOSBAQAogICAgICAqLwogICAgIHZvaWQgZ2V0U3VwcG9ydGVkUHJldmlld0Zvcm1hdHMoVmVjdG9yPGludD4mIGZvcm1hdHMpIGNvbnN0OwogCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIG5vIGtleXMgYXJlIHByZXNlbnQKKyAgICBib29sIGlzRW1wdHkoKSBjb25zdDsKKwogICAgIC8vIFBhcmFtZXRlciBrZXlzIHRvIGNvbW11bmljYXRlIGJldHdlZW4gY2FtZXJhIGFwcGxpY2F0aW9uIGFuZCBkcml2ZXIuCiAgICAgLy8gVGhlIGFjY2VzcyAocmVhZC93cml0ZSwgcmVhZCBvbmx5LCBvciB3cml0ZSBvbmx5KSBpcyB2aWV3ZWQgZnJvbSB0aGUKICAgICAvLyBwZXJzcGVjdGl2ZSBvZiBhcHBsaWNhdGlvbnMsIG5vdCBkcml2ZXIuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhU2VydmljZS5oIGIvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuaAppbmRleCBmN2YwNmJiLi4xYjY4YjVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhU2VydmljZS5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlLmgKQEAgLTI1LDggKzI1LDYgQEAKIAogY2xhc3MgSUNhbWVyYTsKIGNsYXNzIElDYW1lcmFDbGllbnQ7Ci1jbGFzcyBJUHJvQ2FtZXJhVXNlcjsKLWNsYXNzIElQcm9DYW1lcmFDYWxsYmFja3M7CiBjbGFzcyBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOwogY2xhc3MgSUNhbWVyYURldmljZVVzZXI7CiBjbGFzcyBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOwpAQCAtNDQsNyArNDIsNiBAQAogICAgICAgICBHRVRfTlVNQkVSX09GX0NBTUVSQVMgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAogICAgICAgICBHRVRfQ0FNRVJBX0lORk8sCiAgICAgICAgIENPTk5FQ1QsCi0gICAgICAgIENPTk5FQ1RfUFJPLAogICAgICAgICBDT05ORUNUX0RFVklDRSwKICAgICAgICAgQUREX0xJU1RFTkVSLAogICAgICAgICBSRU1PVkVfTElTVEVORVIsCkBAIC01Myw2ICs1MCw4IEBACiAgICAgICAgIEdFVF9MRUdBQ1lfUEFSQU1FVEVSUywKICAgICAgICAgU1VQUE9SVFNfQ0FNRVJBX0FQSSwKICAgICAgICAgQ09OTkVDVF9MRUdBQ1ksCisgICAgICAgIFNFVF9UT1JDSF9NT0RFLAorICAgICAgICBOT1RJRllfU1lTVEVNX0VWRU5ULAogICAgIH07CiAKICAgICBlbnVtIHsKQEAgLTY1LDEzICs2NCwzNCBAQAogICAgIH07CiAKICAgICBlbnVtIHsKKyAgICAgICAgQ0FNRVJBX1RZUEVfQkFDS1dBUkRfQ09NUEFUSUJMRSA9IDAsCisgICAgICAgIENBTUVSQV9UWVBFX0FMTCA9IDEsCisgICAgfTsKKworICAgIGVudW0gewogICAgICAgICBDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVEID0gLTEKLSAgICAgIH07CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEtlZXAgdXAtdG8tZGF0ZSB3aXRoIGRlY2xhcmF0aW9ucyBpbgorICAgICAqIGZyYW1ld29ya3MvYmFzZS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NhbWVyYS9DYW1lcmFTZXJ2aWNlLmphdmEKKyAgICAgKgorICAgICAqIFRoZXNlIGV2ZW50IGNvZGVzIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggdGhlIG5vdGlmeVN5c3RlbUV2ZW50IGNhbGwuCisgICAgICovCisgICAgZW51bSB7CisgICAgICAgIE5PX0VWRU5UID0gMCwKKyAgICAgICAgVVNFUl9TV0lUQ0hFRCwKKyAgICB9OwogCiBwdWJsaWM6CiAgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShDYW1lcmFTZXJ2aWNlKTsKIAorICAgIC8vIEdldCB0aGUgbnVtYmVyIG9mIGNhbWVyYXMgdGhhdCBzdXBwb3J0IGJhc2ljIGNvbG9yIGNhbWVyYSBvcGVyYXRpb24KKyAgICAvLyAodHlwZSBDQU1FUkFfVFlQRV9CQUNLV0FSRF9DT01QQVRJQkxFKQogICAgIHZpcnR1YWwgaW50MzJfdCAgZ2V0TnVtYmVyT2ZDYW1lcmFzKCkgPSAwOworICAgIC8vIEdldCB0aGUgbnVtYmVyIG9mIGNhbWVyYXMgb2YgdGhlIHNwZWNpZmllZCB0eXBlLCBvbmUgb2YgQ0FNRVJBX1RZUEVfKgorICAgIC8vIGVudW1zCisgICAgdmlydHVhbCBpbnQzMl90ICBnZXROdW1iZXJPZkNhbWVyYXMoaW50IGNhbWVyYVR5cGUpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUluZm8oaW50IGNhbWVyYUlkLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3RydWN0IENhbWVyYUluZm8qIGNhbWVyYUluZm8pID0gMDsKQEAgLTEwNCwxMyArMTI0LDYgQEAKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPElDYW1lcmE+JiBkZXZpY2UpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdFBybyhjb25zdCBzcDxJUHJvQ2FtZXJhQ2FsbGJhY2tzPiYgY2FtZXJhQ2IsCi0gICAgICAgICAgICBpbnQgY2FtZXJhSWQsCi0gICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICBpbnQgY2xpZW50VWlkLAotICAgICAgICAgICAgLypvdXQqLwotICAgICAgICAgICAgc3A8SVByb0NhbWVyYVVzZXI+JiBkZXZpY2UpID0gMDsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdERldmljZSgKICAgICAgICAgICAgIGNvbnN0IHNwPElDYW1lcmFEZXZpY2VDYWxsYmFja3M+JiBjYW1lcmFDYiwKICAgICAgICAgICAgIGludCBjYW1lcmFJZCwKQEAgLTE0Miw2ICsxNTUsMjYgQEAKICAgICAgICAgICAgIGludCBjbGllbnRVaWQsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxJQ2FtZXJhPiYgZGV2aWNlKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUdXJuIG9uIG9yIG9mZiBhIGNhbWVyYSdzIHRvcmNoIG1vZGUuIFRvcmNoIG1vZGUgd2lsbCBiZSB0dXJuZWQgb2ZmIGJ5CisgICAgICogY2FtZXJhIHNlcnZpY2UgaWYgdGhlIGxhc3Rlc3QgY2xpZW50IGJpbmRlciB0aGF0IHR1cm5zIGl0IG9uIGRpZXMuCisgICAgICoKKyAgICAgKiByZXR1cm4gdmFsdWVzOgorICAgICAqIDA6ICAgICAgIG9uIGEgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisgICAgICogLUVOT1NZUzogdGhlIGNhbWVyYSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IHRoaXMgb3BlcmF0aW9uLiBJdCBpdCByZXR1cm5lZAorICAgICAqICAgICAgICAgIGlmIGFuZCBvbmx5IGlmIGFuZHJvaWQuZmxhc2guaW50by5hdmFpbGFibGUgaXMgZmFsc2UuCisgICAgICogLUVCVVNZOiAgdGhlIGNhbWVyYSBkZXZpY2UgaXMgb3BlbmVkLgorICAgICAqIC1FSU5WQUw6IGNhbWVyYV9pZCBpcyBpbnZhbGlkIG9yIGNsaWVudEJpbmRlciBpcyBOVUxMIHdoZW4gZW5hYmxpbmcgYQorICAgICAqICAgICAgICAgIHRvcmNoIG1vZGUuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLCBib29sIGVuYWJsZWQsCisgICAgICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgY2xpZW50QmluZGVyKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgdGhlIGNhbWVyYSBzZXJ2aWNlIG9mIGEgc3lzdGVtIGV2ZW50LiAgU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gc3lzdGVtX3NlcnZlci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5U3lzdGVtRXZlbnQoaW50MzJfdCBldmVudElkLCBjb25zdCBpbnQzMl90KiBhcmdzLCBzaXplX3QgbGVuZ3RoKSA9IDA7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhU2VydmljZUxpc3RlbmVyLmggYi9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhU2VydmljZUxpc3RlbmVyLmgKaW5kZXggMGEwZTQzYS4uNzA5ZmYzMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYVNlcnZpY2VMaXN0ZW5lci5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaApAQCAtNjYsOSArNjYsMzUgQEAKICAgICAgICAgU1RBVFVTX1VOS05PV04gICAgICAgICAgPSAweEZGRkZGRkZGLAogICAgIH07CiAKKyAgICAvKioKKyAgICAgKiBUaGUgdG9yY2ggbW9kZSBzdGF0dXMgb2YgYSBjYW1lcmEuCisgICAgICoKKyAgICAgKiBJbml0aWFsIHN0YXR1cyB3aWxsIGJlIHRyYW5zbWl0dGVkIHdpdGggb25Ub3JjaFN0YXR1c0NoYW5nZWQgaW1tZWRpYXRlbHkKKyAgICAgKiBhZnRlciB0aGlzIGxpc3RlbmVyIGlzIGFkZGVkIHRvIHRoZSBzZXJ2aWNlIGxpc3RlbmVyIGxpc3QuCisgICAgICoKKyAgICAgKiBUaGUgZW51bXMgc2hvdWxkIGJlIHNldCB0byB2YWx1ZXMgbWF0Y2hpbmcKKyAgICAgKiBpbmNsdWRlL2hhcmR3YXJlL2NhbWVyYV9jb21tb24uaAorICAgICAqLworICAgIGVudW0gVG9yY2hTdGF0dXMgeworICAgICAgICAvLyBUaGUgY2FtZXJhJ3MgdG9yY2ggbW9kZSBoYXMgYmVjb21lIG5vdCBhdmFpbGFibGUgdG8gdXNlIHZpYQorICAgICAgICAvLyBzZXRUb3JjaE1vZGUoKS4KKyAgICAgICAgVE9SQ0hfU1RBVFVTX05PVF9BVkFJTEFCTEUgID0gVE9SQ0hfTU9ERV9TVEFUVVNfTk9UX0FWQUlMQUJMRSwKKyAgICAgICAgLy8gVGhlIGNhbWVyYSdzIHRvcmNoIG1vZGUgaXMgb2ZmIGFuZCBhdmFpbGFibGUgdG8gYmUgdHVybmVkIG9uIHZpYQorICAgICAgICAvLyBzZXRUb3JjaE1vZGUoKS4KKyAgICAgICAgVE9SQ0hfU1RBVFVTX0FWQUlMQUJMRV9PRkYgID0gVE9SQ0hfTU9ERV9TVEFUVVNfQVZBSUxBQkxFX09GRiwKKyAgICAgICAgLy8gVGhlIGNhbWVyYSdzIHRvcmNoIG1vZGUgaXMgb24gYW5kIGF2YWlsYWJsZSB0byBiZSB0dXJuZWQgb2ZmIHZpYQorICAgICAgICAvLyBzZXRUb3JjaE1vZGUoKS4KKyAgICAgICAgVE9SQ0hfU1RBVFVTX0FWQUlMQUJMRV9PTiAgID0gVE9SQ0hfTU9ERV9TVEFUVVNfQVZBSUxBQkxFX09OLAorCisgICAgICAgIC8vIFVzZSB0byBpbml0aWFsaXplIHZhcmlhYmxlcyBvbmx5CisgICAgICAgIFRPUkNIX1NUQVRVU19VTktOT1dOICAgICAgICA9IDB4RkZGRkZGRkYsCisgICAgfTsKKwogICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoQ2FtZXJhU2VydmljZUxpc3RlbmVyKTsKIAogICAgIHZpcnR1YWwgdm9pZCBvblN0YXR1c0NoYW5nZWQoU3RhdHVzIHN0YXR1cywgaW50MzJfdCBjYW1lcmFJZCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIG9uVG9yY2hTdGF0dXNDaGFuZ2VkKFRvcmNoU3RhdHVzIHN0YXR1cywgY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkKSA9IDA7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhU2VydmljZVByb3h5LmggYi9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhU2VydmljZVByb3h5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJhNTU1ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlUHJveHkuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0lDQU1FUkFTRVJWSUNFUFJPWFlfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0lDQU1FUkFTRVJWSUNFUFJPWFlfSAorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIElDYW1lcmFTZXJ2aWNlUHJveHkgOiBwdWJsaWMgSUludGVyZmFjZSB7CitwdWJsaWM6CisgICAgZW51bSB7CisgICAgICAgIFBJTkdfRk9SX1VTRVJfVVBEQVRFID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICB9OworCisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShDYW1lcmFTZXJ2aWNlUHJveHkpOworCisgICAgdmlydHVhbCB2b2lkIHBpbmdGb3JVc2VyVXBkYXRlKCkgPSAwOworfTsKKworY2xhc3MgQm5DYW1lcmFTZXJ2aWNlUHJveHk6IHB1YmxpYyBCbkludGVyZmFjZTxJQ2FtZXJhU2VydmljZVByb3h5PgoreworcHVibGljOgorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworfTsKKworCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0lDQU1FUkFTRVJWSUNFUFJPWFlfSAorCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL0lQcm9DYW1lcmFDYWxsYmFja3MuaCBiL2luY2x1ZGUvY2FtZXJhL0lQcm9DYW1lcmFDYWxsYmFja3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThhYmI4OS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NhbWVyYS9JUHJvQ2FtZXJhQ2FsbGJhY2tzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0lQUk9DQU1FUkFfQ0FMTEJBQ0tTX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9JUFJPQ0FNRVJBX0NBTExCQUNLU19ICi0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vY2FtZXJhLmg+Ci0KLXN0cnVjdCBjYW1lcmFfbWV0YWRhdGE7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgSVByb0NhbWVyYUNhbGxiYWNrcyA6IHB1YmxpYyBJSW50ZXJmYWNlCi17Ci0gICAgLyoqCi0gICAgICogS2VlcCB1cC10by1kYXRlIHdpdGggSVByb0NhbWVyYUNhbGxiYWNrcy5haWRsIGluIGZyYW1ld29ya3MvYmFzZQotICAgICAqLwotcHVibGljOgotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoUHJvQ2FtZXJhQ2FsbGJhY2tzKTsKLQotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIG5vdGlmeUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGV4dDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBleHQyKSA9IDA7Ci0KLSAgICBlbnVtIExvY2tTdGF0dXMgewotICAgICAgICBMT0NLX0FDUVVJUkVELAotICAgICAgICBMT0NLX1JFTEVBU0VELAotICAgICAgICBMT0NLX1NUT0xFTiwKLSAgICB9OwotCi0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgb25Mb2NrU3RhdHVzQ2hhbmdlZChMb2NrU3RhdHVzIG5ld0xvY2tTdGF0dXMpID0gMDsKLQotICAgIC8qKiBNaXNzaW5nIGJ5IGRlc2lnbjogaW1wbGVtZW50YXRpb24gaXMgY2xpZW50LXNpZGUgaW4gUHJvQ2FtZXJhLmNwcCAqKi8KLSAgICAvLyB2aXJ0dWFsIHZvaWQgb25CdWZmZXJSZWNlaXZlZChpbnQgc3RyZWFtSWQsCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3B1Q29uc3VtZXI6OkxvY2tlZEJ1ZmVyJiBidWYpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIG9uUmVzdWx0UmVjZWl2ZWQoaW50MzJfdCByZXF1ZXN0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGEqIHJlc3VsdCkgPSAwOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBCblByb0NhbWVyYUNhbGxiYWNrcyA6IHB1YmxpYyBCbkludGVyZmFjZTxJUHJvQ2FtZXJhQ2FsbGJhY2tzPgotewotcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9JUHJvQ2FtZXJhVXNlci5oIGIvaW5jbHVkZS9jYW1lcmEvSVByb0NhbWVyYVVzZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjYzRkMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NhbWVyYS9JUHJvQ2FtZXJhVXNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfSVBST0NBTUVSQVVTRVJfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0lQUk9DQU1FUkFVU0VSX0gKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDxjYW1lcmEvSVByb0NhbWVyYUNhbGxiYWNrcy5oPgotCi1zdHJ1Y3QgY2FtZXJhX21ldGFkYXRhOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIElQcm9DYW1lcmFVc2VyQ2xpZW50OwotY2xhc3MgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKLWNsYXNzIFN1cmZhY2U7Ci0KLWNsYXNzIElQcm9DYW1lcmFVc2VyOiBwdWJsaWMgSUludGVyZmFjZQotewotICAgIC8qKgotICAgICAqIEtlZXAgdXAtdG8tZGF0ZSB3aXRoIElQcm9DYW1lcmFVc2VyLmFpZGwgaW4gZnJhbWV3b3Jrcy9iYXNlCi0gICAgICovCi1wdWJsaWM6Ci0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShQcm9DYW1lcmFVc2VyKTsKLQotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGRpc2Nvbm5lY3QoKSA9IDA7Ci0KLSAgICAvLyBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlLCBnaXZlbiBhIGNhbGxiYWNrcyBsaXN0ZW5lcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGNvbm5lY3QoY29uc3Qgc3A8SVByb0NhbWVyYUNhbGxiYWNrcz4mIGNhbGxiYWNrcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBMb2NraW5nCi0gICAgICoqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGV4Y2x1c2l2ZVRyeUxvY2soKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZXhjbHVzaXZlTG9jaygpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBleGNsdXNpdmVVbmxvY2soKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICBoYXNFeGNsdXNpdmVMb2NrKCkgPSAwOwotCi0gICAgLyoqCi0gICAgICogUmVxdWVzdCBIYW5kbGluZwotICAgICAqKi8KLQotICAgIC8vIE5vdGUgdGhhdCB0aGUgY2FsbGVlIGdldHMgYSBjb3B5IG9mIHRoZSBtZXRhZGF0YS4KLSAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICBzdWJtaXRSZXF1ZXN0KHN0cnVjdCBjYW1lcmFfbWV0YWRhdGEqIG1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1pbmcgPSBmYWxzZSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGNhbmNlbFJlcXVlc3QoaW50IHJlcXVlc3RJZCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZGVsZXRlU3RyZWFtKGludCBzdHJlYW1JZCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGNyZWF0ZVN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzdHJlYW1JZCkgPSAwOwotCi0gICAgLy8gQ3JlYXRlIGEgcmVxdWVzdCBvYmplY3QgZnJvbSBhIHRlbXBsYXRlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGNyZWF0ZURlZmF1bHRSZXF1ZXN0KGludCB0ZW1wbGF0ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGEqKiByZXF1ZXN0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOwotCi0gICAgLy8gR2V0IHN0YXRpYyBjYW1lcmEgbWV0YWRhdGEKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRDYW1lcmFJbmZvKGludCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YSoqIGluZm8pID0gMDsKLQotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBCblByb0NhbWVyYVVzZXI6IHB1YmxpYyBCbkludGVyZmFjZTxJUHJvQ2FtZXJhVXNlcj4KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvUHJvQ2FtZXJhLmggYi9pbmNsdWRlL2NhbWVyYS9Qcm9DYW1lcmEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTliNjg3YS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NhbWVyYS9Qcm9DYW1lcmEuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1BST19DQU1FUkFfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1BST19DQU1FUkFfSAotCi0jaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgotI2luY2x1ZGUgPHN5c3RlbS9jYW1lcmEuaD4KLSNpbmNsdWRlIDxjYW1lcmEvSVByb0NhbWVyYUNhbGxiYWNrcy5oPgotI2luY2x1ZGUgPGNhbWVyYS9JUHJvQ2FtZXJhVXNlci5oPgotI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmEuaD4KLSNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KLSNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYVNlcnZpY2UuaD4KLSNpbmNsdWRlIDxndWkvQ3B1Q29uc3VtZXIuaD4KLQotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KLSNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgotCi0jaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYUJhc2UuaD4KLQotc3RydWN0IGNhbWVyYV9tZXRhZGF0YTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBBbGwgY2FsbGJhY2tzIG9uIHRoaXMgY2xhc3MgYXJlIGNvbmN1cnJlbnQKLS8vICh0aGV5IGNvbWUgZnJvbSBzZXBhcmF0ZSB0aHJlYWRzKQotY2xhc3MgUHJvQ2FtZXJhTGlzdGVuZXIgOiB2aXJ0dWFsIHB1YmxpYyBSZWZCYXNlCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQzMl90IG1zZ1R5cGUsIGludDMyX3QgZXh0MSwgaW50MzJfdCBleHQyKSA9IDA7Ci0KLSAgICAvLyBMb2NrIGhhcyBiZWVuIGFjcXVpcmVkLiBXcml0ZSBvcGVyYXRpb25zIG5vdyBhdmFpbGFibGUuCi0gICAgdmlydHVhbCB2b2lkIG9uTG9ja0FjcXVpcmVkKCkgPSAwOwotICAgIC8vIExvY2sgaGFzIGJlZW4gcmVsZWFzZWQgd2l0aCBleGNsdXNpdmVVbmxvY2suCi0gICAgdmlydHVhbCB2b2lkIG9uTG9ja1JlbGVhc2VkKCkgPSAwOwotICAgIC8vIExvY2sgaGFzIGJlZW4gc3RvbGVuIGJ5IGFub3RoZXIgY2xpZW50LgotICAgIHZpcnR1YWwgdm9pZCBvbkxvY2tTdG9sZW4oKSA9IDA7Ci0KLSAgICAvLyBMb2NrIGZyZWUuCi0gICAgdmlydHVhbCB2b2lkIG9uVHJpZ2dlck5vdGlmeShpbnQzMl90IG1zZ1R5cGUsIGludDMyX3QgZXh0MSwgaW50MzJfdCBleHQyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKLSAgICAvLyBvbkZyYW1lQXZhaWxhYmxlIGFuZCBPblJlc3VsdFJlY2VpdmVkIGNhbiBjb21lIGluIHdpdGggYW55IG9yZGVyLAotICAgIC8vIHVzZSBhbmRyb2lkLnNlbnNvci50aW1lc3RhbXAgYW5kIExvY2tlZEJ1ZmZlci50aW1lc3RhbXAgdG8gY29ycmVsYXRlIHRoZW0KLQotICAgIC8qKgotICAgICAgKiBBIG5ldyBtZXRhZGF0YSBidWZmZXIgaGFzIGJlZW4gcmVjZWl2ZWQuCi0gICAgICAqIC0tIE93bmVyc2hpcCBvZiByZXF1ZXN0IHBhc3NlcyBvbiB0byB0aGUgY2FsbGVlLCBmcmVlIHdpdGgKLSAgICAgICogICAgZnJlZV9jYW1lcmFfbWV0YWRhdGEuCi0gICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCBvblJlc3VsdFJlY2VpdmVkKGludDMyX3QgZnJhbWVJZCwgY2FtZXJhX21ldGFkYXRhKiByZXN1bHQpID0gMDsKLQotICAgIC8vIFRPRE86IG1ha2Ugb25GcmFtZUF2YWlsYWJsZSBwdXJlIHZpcnR1YWwKLQotICAgIC8vIEEgbmV3IGZyYW1lIGJ1ZmZlciBoYXMgYmVlbiByZWNlaXZlZCBmb3IgdGhpcyBzdHJlYW0uCi0gICAgLy8gLS0gVGhpcyBjYWxsYmFjayBvbmx5IGZpcmVzIGZvciBjcmVhdGVTdHJlYW1DcHUgc3RyZWFtcwotICAgIC8vIC0tIEEgYnVmZmVyIG1heSBiZSBvYnRhaW5lZCBieSBjYWxsaW5nIGNwdUNvbnN1bWVyLT5sb2NrTmV4dEJ1ZmZlcgotICAgIC8vIC0tIFVzZSBidWYudGltZXN0YW1wIHRvIGNvcnJlbGF0ZSB3aXRoIHJlc3VsdCdzIGFuZHJvaWQuc2Vuc29yLnRpbWVzdGFtcAotICAgIC8vIC0tIFRoZSBidWZmZXIgc2hvdWxkIGJlIGFjY2Vzc2VkIHdpdGggQ3B1Q29uc3VtZXI6OmxvY2tOZXh0QnVmZmVyCi0gICAgLy8gICAgICBhbmQgQ3B1Q29uc3VtZXI6OnVubG9ja0J1ZmZlcgotICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGludCAvKnN0cmVhbUlkKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q3B1Q29uc3VtZXI+JiAvKmNwdUNvbnN1bWVyKi8pIHsKLSAgICB9Ci0KLX07Ci0KLWNsYXNzIFByb0NhbWVyYTsKLQotdGVtcGxhdGUgPD4KLXN0cnVjdCBDYW1lcmFUcmFpdHM8UHJvQ2FtZXJhPgotewotICAgIHR5cGVkZWYgUHJvQ2FtZXJhTGlzdGVuZXIgICAgIFRDYW1MaXN0ZW5lcjsKLSAgICB0eXBlZGVmIElQcm9DYW1lcmFVc2VyICAgICAgICBUQ2FtVXNlcjsKLSAgICB0eXBlZGVmIElQcm9DYW1lcmFDYWxsYmFja3MgICBUQ2FtQ2FsbGJhY2tzOwotICAgIHR5cGVkZWYgc3RhdHVzX3QgKElDYW1lcmFTZXJ2aWNlOjoqVENhbUNvbm5lY3RTZXJ2aWNlKShjb25zdCBzcDxJUHJvQ2FtZXJhQ2FsbGJhY2tzPiYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwgY29uc3QgU3RyaW5nMTYmLCBpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVByb0NhbWVyYVVzZXI+Jik7Ci0gICAgc3RhdGljIFRDYW1Db25uZWN0U2VydmljZSAgICAgZm5Db25uZWN0U2VydmljZTsKLX07Ci0KLQotY2xhc3MgUHJvQ2FtZXJhIDoKLSAgICBwdWJsaWMgQ2FtZXJhQmFzZTxQcm9DYW1lcmE+LAotICAgIHB1YmxpYyBCblByb0NhbWVyYUNhbGxiYWNrcwotewotcHVibGljOgotICAgIC8qKgotICAgICAqIENvbm5lY3QgYSBzaGFyZWQgY2FtZXJhLiBCeSBkZWZhdWx0IGFjY2VzcyBpcyByZXN0cmljdGVkIHRvIHJlYWQgb25seQotICAgICAqIChMb2NrIGZyZWUpIG9wZXJhdGlvbnMuIFRvIGJlIGFibGUgdG8gc3VibWl0IGN1c3RvbSByZXF1ZXN0cyBhIGxvY2sgbmVlZHMKLSAgICAgKiB0byBiZSBhY3F1aXJlZCB3aXRoIGV4Y2x1c2l2ZVtUcnldTG9jay4KLSAgICAgKi8KLSAgICBzdGF0aWMgc3A8UHJvQ2FtZXJhPiBjb25uZWN0KGludCBjYW1lcmFJZCk7Ci0gICAgdmlydHVhbCB+UHJvQ2FtZXJhKCk7Ci0KLSAgICAvKioKLSAgICAgKiBFeGNsdXNpdmUgTG9ja3M6Ci0gICAgICogLSBXZSBtYXkgcmVxdWVzdCBleGNsdXNpdmUgYWNjZXNzIHRvIGEgY2FtZXJhIGlmIG5vIG90aGVyCi0gICAgICogICBjbGllbnRzIGFyZSB1c2luZyB0aGUgY2FtZXJhLiBUaGlzIHdvcmtzIGFzIGEgdHJhZGl0aW9uYWwKLSAgICAgKiAgIGNsaWVudCwgd3JpdGluZy9yZWFkaW5nIGFueSBjYW1lcmEgc3RhdGUuCi0gICAgICogLSBBbiBhcHBsaWNhdGlvbiBvcGVuaW5nIHRoZSBjYW1lcmEgKGEgcmVndWxhciAnQ2FtZXJhJykgd2lsbAotICAgICAqICAgYWx3YXlzIHN0ZWFsIGF3YXkgdGhlIGV4Y2x1c2l2ZSBsb2NrIGZyb20gYSBQcm9DYW1lcmEsCi0gICAgICogICB0aGlzIHdpbGwgY2FsbCBvbkxvY2tSZWxlYXNlZC4KLSAgICAgKiAtIG9uTG9ja0FjcXVpcmVkIHdpbGwgYmUgY2FsbGVkIGFnYWluIG9uY2UgaXQgaXMgcG9zc2libGUKLSAgICAgKiAgIHRvIGFnYWluIGV4Y2x1c2l2ZWx5IGxvY2sgdGhlIGNhbWVyYS4KLSAgICAgKgotICAgICAqLwotCi0gICAgLyoqCi0gICAgICogQWxsIGV4Y2x1c2l2ZUxvY2svdW5sb2NrIGZ1bmN0aW9ucyBhcmUgYXN5bmNocm9ub3VzLiBUaGUgcmVtb3RlIGVuZHBvaW50Ci0gICAgICogc2hhbGwgbm90IGJsb2NrIHdoaWxlIHdhaXRpbmcgdG8gYWNxdWlyZSB0aGUgbG9jay4gSW5zdGVhZCB0aGUgbG9jawotICAgICAqIG5vdGlmaWNhdGlvbnMgd2lsbCBjb21lIGluIGFzeW5jaHJvbm91c2x5IG9uIHRoZSBsaXN0ZW5lci4KLSAgICAgKi8KLQotICAgIC8qKgotICAgICAgKiBBdHRlbXB0IHRvIGFjcXVpcmUgdGhlIGxvY2sgaW5zdGFudGx5IChub24tYmxvY2tpbmcpCi0gICAgICAqIC0gSWYgdGhpcyBzdWNjZWVkcywgeW91IGRvIG5vdCBuZWVkIHRvIHdhaXQgZm9yIG9uTG9ja0FjcXVpcmVkCi0gICAgICAqICAgYnV0IHRoZSBldmVudCB3aWxsIHN0aWxsIGJlIGZpcmVkCi0gICAgICAqCi0gICAgICAqIFJldHVybnMgLUVCVVNZIGlmIGFscmVhZHkgbG9ja2VkLiAwIG9uIHN1Y2Nlc3MuCi0gICAgICAqLwotICAgIHN0YXR1c190IGV4Y2x1c2l2ZVRyeUxvY2soKTsKLSAgICAvLyBhbHdheXMgcmV0dXJucyAwLiB3YWl0IGZvciBvbkxvY2tBY3F1aXJlZCBiZWZvcmUgbG9jayBpcyBhY3F1aXJlZC4KLSAgICBzdGF0dXNfdCBleGNsdXNpdmVMb2NrKCk7Ci0gICAgLy8gcmVsZWFzZSBhIGxvY2sgaWYgd2UgaGF2ZSBvbmUsIG9yIGNhbmNlbCB0aGUgbG9jayByZXF1ZXN0LgotICAgIHN0YXR1c190IGV4Y2x1c2l2ZVVubG9jaygpOwotCi0gICAgLy8gZXhjbHVzaXZlIGxvY2sgPSBkbyB3aGF0ZXZlciB3ZSB3YW50LiBubyBsb2NrID0gcmVhZCBvbmx5LgotICAgIGJvb2wgaGFzRXhjbHVzaXZlTG9jaygpOwotCi0gICAgLyoqCi0gICAgICogPCAwIGVycm9yLCA+PSAwIHRoZSByZXF1ZXN0IElELiBzdHJlYW1pbmcgdG8gaGF2ZSB0aGUgcmVxdWVzdCByZXBlYXQKLSAgICAgKiAgICB1bnRpbCBjYW5jZWxsZWQuCi0gICAgICogVGhlIHJlcXVlc3QgcXVldWUgaXMgZmx1c2hlZCB3aGVuIGEgbG9jayBpcyByZWxlYXNlZCBvciBzdG9sZW4KLSAgICAgKiAgICBpZiBub3QgbG9ja2VkIHdpbGwgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVECi0gICAgICovCi0gICAgaW50IHN1Ym1pdFJlcXVlc3QoY29uc3Qgc3RydWN0IGNhbWVyYV9tZXRhZGF0YSogbWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nID0gZmFsc2UpOwotICAgIC8vIGlmIG5vdCBsb2NrZWQgd2lsbCByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQsIEJBRF9WQUxVRSBpZiByZXF1ZXN0SWQgYmFkCi0gICAgc3RhdHVzX3QgY2FuY2VsUmVxdWVzdChpbnQgcmVxdWVzdElkKTsKLQotICAgIC8qKgotICAgICAqIEFzayBmb3IgYSBzdHJlYW0gdG8gYmUgZW5hYmxlZC4KLSAgICAgKiBMb2NrIGZyZWUuIFNlcnZpY2UgbWFpbnRhaW5zIGNvdW50ZXIgb2Ygc3RyZWFtcy4KLSAgICAgKi8KLSAgICBzdGF0dXNfdCByZXF1ZXN0U3RyZWFtKGludCBzdHJlYW1JZCk7Ci0vLyBUT0RPOiByZW1vdmUgcmVxdWVzdFN0cmVhbSwgaXRzIHVzZWxlc3MuCi0KLSAgICAvKioKLSAgICAgICogRGVsZXRlIGEgc3RyZWFtLgotICAgICAgKiBMb2NrIGZyZWUuCi0gICAgICAqCi0gICAgICAqIE5PVEU6IEFzIGEgc2lkZSBlZmZlY3QgdGhpcyBjYW5jZWxzIEFMTCBzdHJlYW1pbmcgcmVxdWVzdHMuCi0gICAgICAqCi0gICAgICAqIEVycm9yczogQkFEX1ZBTFVFIGlmIHVua25vd24gc3RyZWFtIElELgotICAgICAgKiAgICAgICAgIFBFUk1JU1NJT05fREVOSUVEIGlmIHRoZSBzdHJlYW0gd2Fzbid0IHlvdXJzCi0gICAgICAqLwotICAgIHN0YXR1c190IGRlbGV0ZVN0cmVhbShpbnQgc3RyZWFtSWQpOwotCi0gICAgLyoqCi0gICAgICAqIENyZWF0ZSBhIG5ldyBIVyBzdHJlYW0sIHdob3NlIHNpbmsgd2lsbCBiZSB0aGUgd2luZG93LgotICAgICAgKiBMb2NrIGZyZWUuIFNlcnZpY2UgbWFpbnRhaW5zIGNvdW50ZXIgb2Ygc3RyZWFtcy4KLSAgICAgICogRXJyb3JzOiAtRUJVU1kgaWYgdG9vIG1hbnkgc3RyZWFtcyBjcmVhdGVkCi0gICAgICAqLwotICAgIHN0YXR1c190IGNyZWF0ZVN0cmVhbShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCogc3RyZWFtSWQpOwotCi0gICAgLyoqCi0gICAgICAqIENyZWF0ZSBhIG5ldyBIVyBzdHJlYW0sIHdob3NlIHNpbmsgd2lsbCBiZSB0aGUgU3VyZmFjZVRleHR1cmUuCi0gICAgICAqIExvY2sgZnJlZS4gU2VydmljZSBtYWludGFpbnMgY291bnRlciBvZiBzdHJlYW1zLgotICAgICAgKiBFcnJvcnM6IC1FQlVTWSBpZiB0b28gbWFueSBzdHJlYW1zIGNyZWF0ZWQKLSAgICAgICovCi0gICAgc3RhdHVzX3QgY3JlYXRlU3RyZWFtKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJ1ZmZlclByb2R1Y2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCogc3RyZWFtSWQpOwotICAgIHN0YXR1c190IGNyZWF0ZVN0cmVhbUNwdShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWFwQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8Q3B1Q29uc3VtZXI+KiBjcHVDb25zdW1lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzdHJlYW1JZCk7Ci0gICAgc3RhdHVzX3QgY3JlYXRlU3RyZWFtQ3B1KGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlYXBDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzeW5jaHJvbm91c01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8Q3B1Q29uc3VtZXI+KiBjcHVDb25zdW1lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzdHJlYW1JZCk7Ci0KLSAgICAvLyBDcmVhdGUgYSByZXF1ZXN0IG9iamVjdCBmcm9tIGEgdGVtcGxhdGUuCi0gICAgc3RhdHVzX3QgY3JlYXRlRGVmYXVsdFJlcXVlc3QoaW50IHRlbXBsYXRlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhKiogcmVxdWVzdCkgY29uc3Q7Ci0KLSAgICAvLyBHZXQgc3RhdGljIGNhbWVyYSBtZXRhZGF0YQotICAgIGNhbWVyYV9tZXRhZGF0YSogZ2V0Q2FtZXJhSW5mbyhpbnQgY2FtZXJhSWQpOwotCi0gICAgLy8gQmxvY2tzIHVudGlsIGEgZnJhbWUgaXMgYXZhaWxhYmxlIChDUFUgc3RyZWFtcyBvbmx5KQotICAgIC8vIC0gT2J0YWluIHRoZSBmcmFtZSBkYXRhIGJ5IGNhbGxpbmcgQ3B1Q29uc3VtZXI6OmxvY2tOZXh0QnVmZmVyCi0gICAgLy8gLSBSZWxlYXNlIHRoZSBmcmFtZSBkYXRhIGFmdGVyIHVzZSB3aXRoIENwdUNvbnN1bWVyOjp1bmxvY2tCdWZmZXIKLSAgICAvLyBSZXR1cm4gdmFsdWU6Ci0gICAgLy8gLSA+MCAtIG51bWJlciBvZiBmcmFtZXMgYXZhaWxhYmxlIHRvIGJlIGxvY2tlZAotICAgIC8vIC0gPDAgLSBlcnJvciAocmVmZXIgdG8gZXJyb3IgY29kZXMpCi0gICAgLy8gRXJyb3IgY29kZXM6Ci0gICAgLy8gLUVUSU1FRE9VVCBpZiBpdCB0b29rIHRvbyBsb25nIHRvIGdldCBhIGZyYW1lCi0gICAgaW50IHdhaXRGb3JGcmFtZUJ1ZmZlcihpbnQgc3RyZWFtSWQpOwotCi0gICAgLy8gQmxvY2tzIHVudGlsIGEgbWV0YWRhdGEgcmVzdWx0IGlzIGF2YWlsYWJsZQotICAgIC8vIC0gT2J0YWluIHRoZSBtZXRhZGF0YSBieSBjYWxsaW5nIGNvbnN1bWVGcmFtZU1ldGFkYXRhKCkKLSAgICAvLyBFcnJvciBjb2RlczoKLSAgICAvLyAtRVRJTUVET1VUIGlmIGl0IHRvb2sgdG9vIGxvbmcgdG8gZ2V0IGEgZnJhbWUKLSAgICBzdGF0dXNfdCB3YWl0Rm9yRnJhbWVNZXRhZGF0YSgpOwotCi0gICAgLy8gR2V0IHRoZSBsYXRlc3QgbWV0YWRhdGEuIFRoaXMgaXMgZGVzdHJ1Y3RpdmUuCi0gICAgLy8gLSBDYWxsaW5nIHRoaXMgcmVwZWF0ZWRseSB3aWxsIHByb2R1Y2UgZW1wdHkgbWV0YWRhdGEgb2JqZWN0cy4KLSAgICAvLyAtIFVzZSB3YWl0Rm9yRnJhbWVNZXRhZGF0YSB0byBzeW5jIHVudGlsIG5ldyBkYXRhIGlzIGF2YWlsYWJsZS4KLSAgICBDYW1lcmFNZXRhZGF0YSBjb25zdW1lRnJhbWVNZXRhZGF0YSgpOwotCi0gICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kIHRvIGRyb3AgZnJhbWUgYnVmZmVycyAoQ1BVIHN0cmVhbXMgb25seSkKLSAgICAvLyBSZXR1cm4gdmFsdWVzOgotICAgIC8vICA+PTAgLSBudW1iZXIgb2YgZnJhbWVzIGRyb3BwZWQgKHVwIHRvIGNvdW50KQotICAgIC8vICA8MCAgLSBlcnJvciBjb2RlCi0gICAgLy8gRXJyb3IgY29kZXM6Ci0gICAgLy8gICBCQURfVkFMVUUgLSBpbnZhbGlkIHN0cmVhbUlkIG9yIGNvdW50IHBhc3NlZAotICAgIGludCBkcm9wRnJhbWVCdWZmZXIoaW50IHN0cmVhbUlkLCBpbnQgY291bnQpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBJUHJvQ2FtZXJhQ2FsbGJhY2tzIGltcGxlbWVudGF0aW9uCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG5vdGlmeUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBleHQyKTsKLQotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgb25Mb2NrU3RhdHVzQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb0NhbWVyYUNhbGxiYWNrczo6TG9ja1N0YXR1cyBuZXdMb2NrU3RhdHVzKTsKLQotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgb25SZXN1bHRSZWNlaXZlZChpbnQzMl90IHJlcXVlc3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhKiByZXN1bHQpOwotcHJpdmF0ZToKLSAgICBQcm9DYW1lcmEoaW50IGNhbWVyYUlkKTsKLQotICAgIGNsYXNzIFByb0ZyYW1lTGlzdGVuZXIgOiBwdWJsaWMgQ3B1Q29uc3VtZXI6OkZyYW1lQXZhaWxhYmxlTGlzdGVuZXIgewotICAgIHB1YmxpYzoKLSAgICAgICAgUHJvRnJhbWVMaXN0ZW5lcih3cDxQcm9DYW1lcmE+IGNhbWVyYSwgaW50IHN0cmVhbUlEKSB7Ci0gICAgICAgICAgICBtQ2FtZXJhID0gY2FtZXJhOwotICAgICAgICAgICAgbVN0cmVhbUlkID0gc3RyZWFtSUQ7Ci0gICAgICAgIH0KLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgLyogaXRlbSAqLykgewotICAgICAgICAgICAgc3A8UHJvQ2FtZXJhPiBjID0gbUNhbWVyYS5wcm9tb3RlKCk7Ci0gICAgICAgICAgICBpZiAoYy5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYy0+b25GcmFtZUF2YWlsYWJsZShtU3RyZWFtSWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICB3cDxQcm9DYW1lcmE+IG1DYW1lcmE7Ci0gICAgICAgIGludCBtU3RyZWFtSWQ7Ci0gICAgfTsKLSAgICBmcmllbmQgY2xhc3MgUHJvRnJhbWVMaXN0ZW5lcjsKLQotICAgIHN0cnVjdCBTdHJlYW1JbmZvCi0gICAgewotICAgICAgICBTdHJlYW1JbmZvKGludCBzdHJlYW1JZCkgewotICAgICAgICAgICAgdGhpcy0+c3RyZWFtSUQgPSBzdHJlYW1JZDsKLSAgICAgICAgICAgIGNwdVN0cmVhbSA9IGZhbHNlOwotICAgICAgICAgICAgZnJhbWVSZWFkeSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJlYW1JbmZvKCkgewotICAgICAgICAgICAgc3RyZWFtSUQgPSAtMTsKLSAgICAgICAgICAgIGNwdVN0cmVhbSA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50ICBzdHJlYW1JRDsKLSAgICAgICAgYm9vbCBjcHVTdHJlYW07Ci0gICAgICAgIHNwPENwdUNvbnN1bWVyPiBjcHVDb25zdW1lcjsKLSAgICAgICAgYm9vbCBzeW5jaHJvbm91c01vZGU7Ci0gICAgICAgIHNwPFByb0ZyYW1lTGlzdGVuZXI+IGZyYW1lQXZhaWxhYmxlTGlzdGVuZXI7Ci0gICAgICAgIHNwPFN1cmZhY2U+IHN0YzsKLSAgICAgICAgaW50IGZyYW1lUmVhZHk7Ci0gICAgfTsKLQotICAgIENvbmRpdGlvbiBtV2FpdENvbmRpdGlvbjsKLSAgICBNdXRleCAgICAgbVdhaXRNdXRleDsKLSAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBtV2FpdFRpbWVvdXQgPSAxMDAwMDAwMDAwOyAvLyAxc2VjCi0gICAgS2V5ZWRWZWN0b3I8aW50LCBTdHJlYW1JbmZvPiBtU3RyZWFtczsKLSAgICBib29sIG1NZXRhZGF0YVJlYWR5OwotICAgIENhbWVyYU1ldGFkYXRhIG1MYXRlc3RNZXRhZGF0YTsKLQotICAgIHZvaWQgb25GcmFtZUF2YWlsYWJsZShpbnQgc3RyZWFtSWQpOwotCi0gICAgU3RyZWFtSW5mbyYgZ2V0U3RyZWFtSW5mbyhpbnQgc3RyZWFtSWQpOwotCi0gICAgZnJpZW5kIGNsYXNzIENhbWVyYUJhc2U7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuaCBiL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuaAppbmRleCBlNTZkNjFmLi5lZWFiMjE3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmgKKysrIGIvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5oCkBAIC0zMCw2ICszMCw3IEBACiAKICAgICBDYW1lcmFNZXRhZGF0YSAgICAgICAgICBtTWV0YWRhdGE7CiAgICAgVmVjdG9yPHNwPFN1cmZhY2U+ID4gICAgbVN1cmZhY2VMaXN0OworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1Jc1JlcHJvY2VzczsKIAogICAgIC8qKgogICAgICAqIEtlZXAgaW1wbCB1cC10by1kYXRlIHdpdGggQ2FwdHVyZVJlcXVlc3QuamF2YSBpbiBmcmFtZXdvcmtzL2Jhc2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oIGIvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmgKaW5kZXggNjcwNDgwYi4uYzU3YjM5ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmgKKysrIGIvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmgKQEAgLTY1LDYgKzY1LDkgQEAKICAgICAvLyBPbmUgd2F5CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgb25SZXN1bHRSZWNlaXZlZChjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpID0gMDsKKworICAgIC8vIE9uZSB3YXkKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBvblByZXBhcmVkKGludCBzdHJlYW1JZCkgPSAwOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oIGIvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oCmluZGV4IDM1NDg4YmIuLmE3YmY4YWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuaAorKysgYi9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmgKQEAgLTI3LDkgKzI3LDkgQEAKIAogY2xhc3MgSUNhbWVyYURldmljZVVzZXJDbGllbnQ7CiBjbGFzcyBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwotY2xhc3MgU3VyZmFjZTsKIGNsYXNzIENhcHR1cmVSZXF1ZXN0OwogY2xhc3MgQ2FtZXJhTWV0YWRhdGE7CitjbGFzcyBPdXRwdXRDb25maWd1cmF0aW9uOwogCiBlbnVtIHsKICAgICBOT19JTl9GTElHSFRfUkVQRUFUSU5HX0ZSQU1FUyA9IC0xLApAQCAtOTcsMTIgKzk3LDI0IEBACiAgICAgICogbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSByZXF1ZXN0cyBjYW4gYmUgc3VibWl0dGVkLgogICAgICAqIDxwPgogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGVuZENvbmZpZ3VyZSgpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBlbmRDb25maWd1cmUoYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkID0gZmFsc2UpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGRlbGV0ZVN0cmVhbShpbnQgc3RyZWFtSWQpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBjcmVhdGVTdHJlYW0oCi0gICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQsCi0gICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGNyZWF0ZVN0cmVhbShjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uJiBvdXRwdXRDb25maWd1cmF0aW9uKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gaW5wdXQgc3RyZWFtIG9mIHdpZHRoLCBoZWlnaHQsIGFuZCBmb3JtYXQgKG9uZSBvZgorICAgICAqIEhBTF9QSVhFTF9GT1JNQVRfKikKKyAgICAgKgorICAgICAqIFJldHVybiBzdHJlYW0gSUQgaWYgaXQncyBhIG5vbi1uZWdhdGl2ZSB2YWx1ZS4gc3RhdHVzX3QgaWYgaXQncyBhCisgICAgICogbmVnYXRpdmUgdmFsdWUuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgY3JlYXRlSW5wdXRTdHJlYW0oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0KSA9IDA7CisKKyAgICAvLyBnZXQgdGhlIGJ1ZmZlciBwcm9kdWNlciBvZiB0aGUgaW5wdXQgc3RyZWFtCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0SW5wdXRCdWZmZXJQcm9kdWNlcigKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpwcm9kdWNlcikgPSAwOwogCiAgICAgLy8gQ3JlYXRlIGEgcmVxdWVzdCBvYmplY3QgZnJvbSBhIHRlbXBsYXRlLgogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGNyZWF0ZURlZmF1bHRSZXF1ZXN0KGludCB0ZW1wbGF0ZUlkLApAQCAtMTIxLDYgKzEzMywxNyBAQAogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGZsdXNoKC8qb3V0Ki8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBQcmVhbGxvY2F0ZSBidWZmZXJzIGZvciBhIGdpdmVuIG91dHB1dCBzdHJlYW0gYXN5bmNocm9ub3VzbHkuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgcHJlcGFyZShpbnQgc3RyZWFtSWQpID0gMDsKKworICAgIC8qKgorICAgICAqIEZyZWUgYWxsIHVudXNlZCBidWZmZXJzIGZvciBhIGdpdmVuIG91dHB1dCBzdHJlYW0uCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgdGVhckRvd24oaW50IHN0cmVhbUlkKSA9IDA7CisKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oIGIvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJjYmUxNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfQ0FNRVJBMl9PVVRQVVRDT05GSUdVUkFUSU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9DQU1FUkEyX09VVFBVVENPTkZJR1VSQVRJT05fSAorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgU3VyZmFjZTsKKworY2xhc3MgT3V0cHV0Q29uZmlndXJhdGlvbiA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgeworcHVibGljOgorCisgICAgc3RhdGljIGNvbnN0IGludCBJTlZBTElEX1JPVEFUSU9OOworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIGNvbnN0OworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGdldFJvdGF0aW9uKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBLZWVwIGltcGwgdXAtdG8tZGF0ZSB3aXRoIE91dHB1dENvbmZpZ3VyYXRpb24uamF2YSBpbiBmcmFtZXdvcmtzL2Jhc2UKKyAgICAgKi8KKyAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICAgICB3cml0ZVRvUGFyY2VsKFBhcmNlbCYgcGFyY2VsKSBjb25zdDsKKyAgICAvLyBnZXRHcmFwaGljQnVmZmVyUHJvZHVjZXIgd2lsbCBiZSBOVUxMIGlmIGVycm9yIG9jY3VycmVkCisgICAgLy8gZ2V0Um90YXRpb24gd2lsbCBiZSBJTlZBTElEX1JPVEFUSU9OIGlmIGVycm9yIG9jY3VycmVkCisgICAgT3V0cHV0Q29uZmlndXJhdGlvbihjb25zdCBQYXJjZWwmIHBhcmNlbCk7CisKKyAgICBPdXRwdXRDb25maWd1cmF0aW9uKHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAsIGludCByb3RhdGlvbik7CisKK3ByaXZhdGU6CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbUdicDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBtUm90YXRpb247CisKKyAgICAvLyBoZWxwZXIgZnVuY3Rpb24KKyAgICBzdGF0aWMgU3RyaW5nMTYgcmVhZE1heWJlRW1wdHlTdHJpbmcxNihjb25zdCBQYXJjZWwmIHBhcmNlbCk7Cit9OworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0FWU3luY1NldHRpbmdzLmggYi9pbmNsdWRlL21lZGlhL0FWU3luY1NldHRpbmdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBlM2JjYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvQVZTeW5jU2V0dGluZ3MuaApAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVZfU1lOQ19TRVRUSU5HU19ICisjZGVmaW5lIEFORFJPSURfQVZfU1lOQ19TRVRUSU5HU19ICisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZW51bSBBVlN5bmNTb3VyY2UgOiB1bnNpZ25lZCB7CisgICAgLy8gbGV0IHRoZSBzeXN0ZW0gZGVjaWRlIHRoZSBiZXN0IHN5bmMgc291cmNlCisgICAgQVZTWU5DX1NPVVJDRV9ERUZBVUxUID0gMCwKKyAgICAvLyBzeW5jIHRvIHRoZSBzeXN0ZW0gY2xvY2sKKyAgICBBVlNZTkNfU09VUkNFX1NZU1RFTV9DTE9DSyA9IDEsCisgICAgLy8gc3luYyB0byB0aGUgYXVkaW8gdHJhY2sKKyAgICBBVlNZTkNfU09VUkNFX0FVRElPID0gMiwKKyAgICAvLyBzeW5jIHRvIHRoZSBkaXNwbGF5IHZzeW5jCisgICAgQVZTWU5DX1NPVVJDRV9WU1lOQyA9IDMsCisgICAgQVZTWU5DX1NPVVJDRV9NQVgsCit9OworCitlbnVtIEFWU3luY0F1ZGlvQWRqdXN0TW9kZSA6IHVuc2lnbmVkIHsKKyAgICAvLyBsZXQgdGhlIHN5c3RlbSBkZWNpZGUgdGhlIGJlc3QgYXVkaW8gYWRqdXN0IG1vZGUKKyAgICBBVlNZTkNfQVVESU9fQURKVVNUX01PREVfREVGQVVMVCA9IDAsCisgICAgLy8gYWRqdXN0IGF1ZGlvIGJ5IHRpbWUgc3RyZXRjaGluZworICAgIEFWU1lOQ19BVURJT19BREpVU1RfTU9ERV9TVFJFVENIID0gMSwKKyAgICAvLyBhZGp1c3QgYXVkaW8gYnkgcmVzYW1wbGluZworICAgIEFWU1lOQ19BVURJT19BREpVU1RfTU9ERV9SRVNBTVBMRSA9IDIsCisgICAgQVZTWU5DX0FVRElPX0FESlVTVF9NT0RFX01BWCwKK307CisKKy8vIG1heCB0b2xlcmFuY2Ugd2hlbiBhZGp1c3RpbmcgcGxheWJhY2sgc3BlZWQgdG8gZGVzaXJlZCBwbGF5YmFjayBzcGVlZAorI2RlZmluZSBBVlNZTkNfVE9MRVJBTkNFX01BWCAxLjBmCisKK3N0cnVjdCBBVlN5bmNTZXR0aW5ncyB7CisgICAgQVZTeW5jU291cmNlIG1Tb3VyY2U7CisgICAgQVZTeW5jQXVkaW9BZGp1c3RNb2RlIG1BdWRpb0FkanVzdE1vZGU7CisgICAgZmxvYXQgbVRvbGVyYW5jZTsKKyAgICBBVlN5bmNTZXR0aW5ncygpCisgICAgICAgIDogbVNvdXJjZShBVlNZTkNfU09VUkNFX0RFRkFVTFQpLAorICAgICAgICAgIG1BdWRpb0FkanVzdE1vZGUoQVZTWU5DX0FVRElPX0FESlVTVF9NT0RFX0RFRkFVTFQpLAorICAgICAgICAgIG1Ub2xlcmFuY2UoLjA0NGYpIHsgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vIEFORFJPSURfQVZfU1lOQ19TRVRUSU5HU19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKaW5kZXggNTgzNjk1ZC4uNWFmNmMxMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaApAQCAtMjAxLDggKzIwMSwxMiBAQAogICAgICAqLwogCiAgICAgLyogU2ltcGxlIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKgorICAgICAqIG9wUGFja2FnZU5hbWU6ICAgICAgVGhlIHBhY2thZ2UgbmFtZSB1c2VkIGZvciBhcHAgb3AgY2hlY2tzLgogICAgICAqLwotICAgIEF1ZGlvRWZmZWN0KCk7CisgICAgQXVkaW9FZmZlY3QoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpOwogCiAKICAgICAvKiBDb25zdHJ1Y3Rvci4KQEAgLTIxMSw2ICsyMTUsNyBAQAogICAgICAqCiAgICAgICogdHlwZTogIHR5cGUgb2YgZWZmZWN0IGNyZWF0ZWQ6IGNhbiBiZSBudWxsIGlmIHV1aWQgaXMgc3BlY2lmaWVkLiBUaGlzIGNvcnJlc3BvbmRzIHRvCiAgICAgICogICAgICAgIHRoZSBPcGVuU0wgRVMgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoaXMgZWZmZWN0LgorICAgICAqIG9wUGFja2FnZU5hbWU6ICBUaGUgcGFja2FnZSBuYW1lIHVzZWQgZm9yIGFwcCBvcCBjaGVja3MuCiAgICAgICogdXVpZDogIFV1aWQgb2YgZWZmZWN0IGNyZWF0ZWQ6IGNhbiBiZSBudWxsIGlmIHR5cGUgaXMgc3BlY2lmaWVkLiBUaGlzIHV1aWQgY29ycmVzcG9uZHMgdG8KICAgICAgKiAgICAgICAgYSBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIG9mIGFuIGVmZmVjdCB0eXBlLgogICAgICAqIHByaW9yaXR5OiAgICByZXF1ZXN0ZWQgcHJpb3JpdHkgZm9yIGVmZmVjdCBjb250cm9sOiB0aGUgcHJpb3JpdHkgbGV2ZWwgY29ycmVzcG9uZHMgdG8gdGhlCkBAIC0yMjcsNiArMjMyLDcgQEAKICAgICAgKi8KIAogICAgIEF1ZGlvRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gMCwKICAgICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiA9IE5VTEwsCkBAIC0yMzksNiArMjQ1LDcgQEAKICAgICAgKiAgICAgIFNhbWUgYXMgYWJvdmUgYnV0IHdpdGggdHlwZSBhbmQgdXVpZCBzcGVjaWZpZWQgYnkgY2hhcmFjdGVyIHN0cmluZ3MKICAgICAgKi8KICAgICBBdWRpb0VmZmVjdChjb25zdCBjaGFyICp0eXBlU3RyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXVpZFN0ciA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSAwLAogICAgICAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYgPSBOVUxMLApAQCAtNDA2LDcgKzQxMyw5IEBACiAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIG1Vc2VyRGF0YTsgICAgICAgICAgLy8gY2xpZW50IGNvbnRleHQgZm9yIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgICAgIG1EZXNjcmlwdG9yOyAgICAgICAgLy8gZWZmZWN0IGRlc2NyaXB0b3IKICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbUlkOyAgICAgICAgICAgICAgICAvLyBzeXN0ZW0gd2lkZSB1bmlxdWUgZWZmZWN0IGVuZ2luZSBpbnN0YW5jZSBJRAotICAgICBNdXRleCAgICAgICAgICAgICAgICAgICBtTG9jazsgICAgICAgICAgICAgICAvLyBNdXRleCBmb3IgbUVuYWJsZWQgYWNjZXNzCisgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1Mb2NrOyAgICAgICAgICAgICAgLy8gTXV0ZXggZm9yIG1FbmFibGVkIGFjY2VzcworCisgICAgIFN0cmluZzE2ICAgICAgICAgICAgICAgIG1PcFBhY2thZ2VOYW1lOyAgICAgLy8gVGhlIHBhY2thZ2UgbmFtZSB1c2VkIGZvciBhcHAgb3AgY2hlY2tzLgogCiAgICAgIC8vIElFZmZlY3RDbGllbnQKICAgICAgdmlydHVhbCB2b2lkIGNvbnRyb2xTdGF0dXNDaGFuZ2VkKGJvb2wgY29udHJvbEdyYW50ZWQpOwpAQCAtNDIwLDcgKzQyOSw4IEBACiBwcml2YXRlOgogCiAgICAgIC8vIEltcGxlbWVudHMgdGhlIElFZmZlY3RDbGllbnQgaW50ZXJmYWNlCi0gICAgY2xhc3MgRWZmZWN0Q2xpZW50IDogcHVibGljIGFuZHJvaWQ6OkJuRWZmZWN0Q2xpZW50LCAgcHVibGljIGFuZHJvaWQ6OklCaW5kZXI6OkRlYXRoUmVjaXBpZW50CisgICAgY2xhc3MgRWZmZWN0Q2xpZW50IDoKKyAgICAgICAgcHVibGljIGFuZHJvaWQ6OkJuRWZmZWN0Q2xpZW50LCBwdWJsaWMgYW5kcm9pZDo6SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKICAgICB7CiAgICAgcHVibGljOgogCkBAIC00MjgsMjQgKzQzOCwzOSBAQAogCiAgICAgICAgIC8vIElFZmZlY3RDbGllbnQKICAgICAgICAgdmlydHVhbCB2b2lkIGNvbnRyb2xTdGF0dXNDaGFuZ2VkKGJvb2wgY29udHJvbEdyYW50ZWQpIHsKLSAgICAgICAgICAgIG1FZmZlY3QtPmNvbnRyb2xTdGF0dXNDaGFuZ2VkKGNvbnRyb2xHcmFudGVkKTsKKyAgICAgICAgICAgIHNwPEF1ZGlvRWZmZWN0PiBlZmZlY3QgPSBtRWZmZWN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChlZmZlY3QgIT0gMCkgeworICAgICAgICAgICAgICAgIGVmZmVjdC0+Y29udHJvbFN0YXR1c0NoYW5nZWQoY29udHJvbEdyYW50ZWQpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHZpcnR1YWwgdm9pZCBlbmFibGVTdGF0dXNDaGFuZ2VkKGJvb2wgZW5hYmxlZCkgewotICAgICAgICAgICAgbUVmZmVjdC0+ZW5hYmxlU3RhdHVzQ2hhbmdlZChlbmFibGVkKTsKKyAgICAgICAgICAgIHNwPEF1ZGlvRWZmZWN0PiBlZmZlY3QgPSBtRWZmZWN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChlZmZlY3QgIT0gMCkgeworICAgICAgICAgICAgICAgIGVmZmVjdC0+ZW5hYmxlU3RhdHVzQ2hhbmdlZChlbmFibGVkKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICB2aXJ0dWFsIHZvaWQgY29tbWFuZEV4ZWN1dGVkKHVpbnQzMl90IGNtZENvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwQ21kRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZXBseVNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSkgewotICAgICAgICAgICAgbUVmZmVjdC0+Y29tbWFuZEV4ZWN1dGVkKGNtZENvZGUsIGNtZFNpemUsIHBDbWREYXRhLCByZXBseVNpemUsIHBSZXBseURhdGEpOworICAgICAgICAgICAgc3A8QXVkaW9FZmZlY3Q+IGVmZmVjdCA9IG1FZmZlY3QucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKGVmZmVjdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgZWZmZWN0LT5jb21tYW5kRXhlY3V0ZWQoCisgICAgICAgICAgICAgICAgICAgIGNtZENvZGUsIGNtZFNpemUsIHBDbWREYXRhLCByZXBseVNpemUsIHBSZXBseURhdGEpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKLSAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykge21FZmZlY3QtPmJpbmRlckRpZWQoKTt9CisgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvRWZmZWN0PiBlZmZlY3QgPSBtRWZmZWN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChlZmZlY3QgIT0gMCkgeworICAgICAgICAgICAgICAgIGVmZmVjdC0+YmluZGVyRGllZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICBwcml2YXRlOgotICAgICAgICBBdWRpb0VmZmVjdCAqbUVmZmVjdDsKKyAgICAgICAgd3A8QXVkaW9FZmZlY3Q+IG1FZmZlY3Q7CiAgICAgfTsKIAogICAgIHZvaWQgYmluZGVyRGllZCgpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NGI3MzgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19JT19ERVNDUklQVE9SX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19JT19ERVNDUklQVE9SX0gKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIGF1ZGlvX2lvX2NvbmZpZ19ldmVudCB7CisgICAgQVVESU9fT1VUUFVUX09QRU5FRCwKKyAgICBBVURJT19PVVRQVVRfQ0xPU0VELAorICAgIEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRCwKKyAgICBBVURJT19JTlBVVF9PUEVORUQsCisgICAgQVVESU9fSU5QVVRfQ0xPU0VELAorICAgIEFVRElPX0lOUFVUX0NPTkZJR19DSEFOR0VELAorfTsKKworLy8gYXVkaW8gaW5wdXQvb3V0cHV0IGRlc2NyaXB0b3IgdXNlZCB0byBjYWNoZSBvdXRwdXQgY29uZmlndXJhdGlvbnMgaW4gY2xpZW50IHByb2Nlc3MgdG8gYXZvaWQKKy8vIGZyZXF1ZW50IGNhbGxzIHRocm91Z2ggSUF1ZGlvRmxpbmdlcgorY2xhc3MgQXVkaW9Jb0Rlc2NyaXB0b3IgOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgQXVkaW9Jb0Rlc2NyaXB0b3IoKSA6CisgICAgICAgIG1Jb0hhbmRsZShBVURJT19JT19IQU5ETEVfTk9ORSksCisgICAgICAgIG1TYW1wbGluZ1JhdGUoMCksIG1Gb3JtYXQoQVVESU9fRk9STUFUX0RFRkFVTFQpLCBtQ2hhbm5lbE1hc2soQVVESU9fQ0hBTk5FTF9OT05FKSwKKyAgICAgICAgbUZyYW1lQ291bnQoMCksIG1MYXRlbmN5KDApCisgICAgeworICAgICAgICBtZW1zZXQoJm1QYXRjaCwgMCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOworICAgIH0KKworICAgIHZpcnR1YWwgfkF1ZGlvSW9EZXNjcmlwdG9yKCkge30KKworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0RGV2aWNlSWQoKSB7CisgICAgICAgIGlmIChtUGF0Y2gubnVtX3NvdXJjZXMgIT0gMCAmJiBtUGF0Y2gubnVtX3NpbmtzICE9IDApIHsKKyAgICAgICAgICAgIGlmIChtUGF0Y2guc291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGFuIG91dHB1dCBtaXgKKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogdGhlIEFQSSBvbmx5IHJldHVybnMgdGhlIGZpcnN0IGRldmljZSBpbiBjYXNlIG9mIG11bHRpcGxlIGRldmljZSBzZWxlY3Rpb24KKyAgICAgICAgICAgICAgICByZXR1cm4gbVBhdGNoLnNpbmtzWzBdLmlkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGFuIGlucHV0IG1peAorICAgICAgICAgICAgICAgIHJldHVybiBtUGF0Y2guc291cmNlc1swXS5pZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICB9CisKKyAgICBhdWRpb19pb19oYW5kbGVfdCBtSW9IYW5kbGU7CisgICAgc3RydWN0IGF1ZGlvX3BhdGNoIG1QYXRjaDsKKyAgICB1aW50MzJfdCBtU2FtcGxpbmdSYXRlOworICAgIGF1ZGlvX2Zvcm1hdF90IG1Gb3JtYXQ7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbUNoYW5uZWxNYXNrOworICAgIHNpemVfdCBtRnJhbWVDb3VudDsKKyAgICB1aW50MzJfdCBtTGF0ZW5jeTsKK307CisKKworfTsgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLypBTkRST0lEX0FVRElPX0lPX0RFU0NSSVBUT1JfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5LmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5LmgKaW5kZXggYTc1NWUxZS4uZmVlZDQwMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3kuaApAQCAtMzgsOCArMzgsMTcgQEAKICNkZWZpbmUgTUlYX1RZUEVfUExBWUVSUyAwCiAjZGVmaW5lIE1JWF9UWVBFX1JFQ09SREVSUyAxCiAKLSNkZWZpbmUgUk9VVEVfRkxBR19SRU5ERVIgMHgxCi0jZGVmaW5lIFJPVVRFX0ZMQUdfTE9PUF9CQUNLICgweDEgPDwgMSkKKy8vIGRlZmluaXRpb24gb2YgdGhlIGRpZmZlcmVudCBldmVudHMgdGhhdCBjYW4gYmUgcmVwb3J0ZWQgb24gYSBkeW5hbWljIHBvbGljeSBmcm9tCisvLyAgIEF1ZGlvU3lzdGVtJ3MgaW1wbGVtZW50YXRpb24gb2YgdGhlIEF1ZGlvUG9saWN5Q2xpZW50IGludGVyZmFjZQorLy8ga2VlcCBpbiBzeW5jIHdpdGggQXVkaW9TeXN0ZW0uamF2YQorI2RlZmluZSBEWU5BTUlDX1BPTElDWV9FVkVOVF9NSVhfU1RBVEVfVVBEQVRFIDAKKworI2RlZmluZSBNSVhfU1RBVEVfRElTQUJMRUQgLTEKKyNkZWZpbmUgTUlYX1NUQVRFX0lETEUgMAorI2RlZmluZSBNSVhfU1RBVEVfTUlYSU5HIDEKKworI2RlZmluZSBNSVhfUk9VVEVfRkxBR19SRU5ERVIgMHgxCisjZGVmaW5lIE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSyAoMHgxIDw8IDEpCiAKICNkZWZpbmUgTUFYX01JWEVTX1BFUl9QT0xJQ1kgMTAKICNkZWZpbmUgTUFYX0NSSVRFUklBX1BFUl9NSVggMjAKQEAgLTYxLDExICs3MCwxNSBAQAogCiBjbGFzcyBBdWRpb01peCB7CiBwdWJsaWM6CisgICAgLy8gZmxhZyBvbiBhbiBBdWRpb01peCBpbmRpY2F0aW5nIHRoZSBhY3Rpdml0eSBvbiB0aGlzIG1peCAoSURMRSwgTUlYSU5HKQorICAgIC8vICAgbXVzdCBiZSByZXBvcnRlZCB0aHJvdWdoIHRoZSBBdWRpb1BvbGljeUNsaWVudCBpbnRlcmZhY2UKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga0NiRmxhZ05vdGlmeUFjdGl2aXR5ID0gMHgxOworCiAgICAgQXVkaW9NaXgoKSB7fQogICAgIEF1ZGlvTWl4KFZlY3RvcjxBdHRyaWJ1dGVNYXRjaENyaXRlcmlvbj4gY3JpdGVyaWEsIHVpbnQzMl90IG1peFR5cGUsIGF1ZGlvX2NvbmZpZ190IGZvcm1hdCwKLSAgICAgICAgICAgICB1aW50MzJfdCByb3V0ZUZsYWdzLCBTdHJpbmc4IHJlZ2lzdHJhdGlvbklkKSA6CisgICAgICAgICAgICAgdWludDMyX3Qgcm91dGVGbGFncywgU3RyaW5nOCByZWdpc3RyYXRpb25JZCwgdWludDMyX3QgZmxhZ3MpIDoKICAgICAgICAgbUNyaXRlcmlhKGNyaXRlcmlhKSwgbU1peFR5cGUobWl4VHlwZSksIG1Gb3JtYXQoZm9ybWF0KSwKLSAgICAgICAgbVJvdXRlRmxhZ3Mocm91dGVGbGFncyksIG1SZWdpc3RyYXRpb25JZChyZWdpc3RyYXRpb25JZCkge30KKyAgICAgICAgbVJvdXRlRmxhZ3Mocm91dGVGbGFncyksIG1SZWdpc3RyYXRpb25JZChyZWdpc3RyYXRpb25JZCksIG1DYkZsYWdzKGZsYWdzKXt9CiAKICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChQYXJjZWwgKnBhcmNlbCk7CiAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Q7CkBAIC03NSw2ICs4OCw3IEBACiAgICAgYXVkaW9fY29uZmlnX3QgIG1Gb3JtYXQ7CiAgICAgdWludDMyX3QgICAgICAgIG1Sb3V0ZUZsYWdzOwogICAgIFN0cmluZzggICAgICAgICBtUmVnaXN0cmF0aW9uSWQ7CisgICAgdWludDMyX3QgICAgICAgIG1DYkZsYWdzOyAvLyBmbGFncyBpbmRpY2F0aW5nIHdoaWNoIGNhbGxiYWNrcyB0byB1c2UsIHNlZSBrQ2JGbGFnKgogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaAppbmRleCBmNzBkOTgxLi5jNGM3YjBlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCkBAIC00Miw4ICs0Miw3IEBACiAgICAgICAgIEVWRU5UX01PUkVfREFUQSA9IDAsICAgICAgICAvLyBSZXF1ZXN0IHRvIHJlYWQgYXZhaWxhYmxlIGRhdGEgZnJvbSBidWZmZXIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGV2ZW50IGlzIGRlbGl2ZXJlZCBidXQgdGhlIGNhbGxiYWNrIGhhbmRsZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgbm90IHdhbnQgdG8gcmVhZCB0aGUgYXZhaWxhYmxlIGRhdGEsIHRoZSBoYW5kbGVyIG11c3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0bHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgZXZlbnQgYnkgc2V0dGluZyBmcmFtZUNvdW50IHRvIHplcm8uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBsaWNpdGx5IGlnbm9yZSB0aGUgZXZlbnQgYnkgc2V0dGluZyBmcmFtZUNvdW50IHRvIHplcm8uCiAgICAgICAgIEVWRU5UX09WRVJSVU4gPSAxLCAgICAgICAgICAvLyBCdWZmZXIgb3ZlcnJ1biBvY2N1cnJlZC4KICAgICAgICAgRVZFTlRfTUFSS0VSID0gMiwgICAgICAgICAgIC8vIFJlY29yZCBoZWFkIGlzIGF0IHRoZSBzcGVjaWZpZWQgbWFya2VyIHBvc2l0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoU2VlIHNldE1hcmtlclBvc2l0aW9uKCkpLgpAQCAtNTMsNyArNTIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdm9sdW50YXJ5IGludmFsaWRhdGlvbiBieSBtZWRpYXNlcnZlciwgb3IgbWVkaWFzZXJ2ZXIgY3Jhc2guCiAgICAgfTsKIAotICAgIC8qIENsaWVudCBzaG91bGQgZGVjbGFyZSBCdWZmZXIgb24gdGhlIHN0YWNrIGFuZCBwYXNzIGFkZHJlc3MgdG8gb2J0YWluQnVmZmVyKCkKKyAgICAvKiBDbGllbnQgc2hvdWxkIGRlY2xhcmUgYSBCdWZmZXIgYW5kIHBhc3MgYWRkcmVzcyB0byBvYnRhaW5CdWZmZXIoKQogICAgICAqIGFuZCByZWxlYXNlQnVmZmVyKCkuICBTZWUgYWxzbyBjYWxsYmFja190IGZvciBFVkVOVF9NT1JFX0RBVEEuCiAgICAgICovCiAKQEAgLTYyLDIwICs2MSwyNSBAQAogICAgIHB1YmxpYzoKICAgICAgICAgLy8gRklYTUUgdXNlIG0gcHJlZml4CiAgICAgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQ7ICAgICAvLyBudW1iZXIgb2Ygc2FtcGxlIGZyYW1lcyBjb3JyZXNwb25kaW5nIHRvIHNpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBpbnB1dCBpdCBpcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBhdmFpbGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBvdXRwdXQgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgYWN0dWFsbHkgZHJhaW5lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGN1cnJlbnRseSBpZ25vcmVkIGJ1dCB3aWxsIG1ha2UgdGhlIHByaW1hcnkgZmllbGQgaW4gZnV0dXJlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gaW5wdXQgdG8gb2J0YWluQnVmZmVyKCkgaXQgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgZGVzaXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gb3V0cHV0IGZyb20gb2J0YWluQnVmZmVyKCkgaXQgaXMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGZyYW1lcyB0byBiZSByZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBpbnB1dCB0byByZWxlYXNlQnVmZmVyKCkgaXQgaXMgY3VycmVudGx5IGlnbm9yZWQKIAogICAgICAgICBzaXplX3QgICAgICBzaXplOyAgICAgICAgICAgLy8gaW5wdXQvb3V0cHV0IGluIGJ5dGVzID09IGZyYW1lQ291bnQgKiBmcmFtZVNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIG91dHB1dCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGRyYWluZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIHRoaXMgaXMgcmVkdW5kYW50IHdpdGggcmVzcGVjdCB0byBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIFRSQU5TRkVSX09CVEFJTiBtb2RlIGlzIGJyb2tlbiBmb3IgOC1iaXQgZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2Ugd2UgZG9uJ3QgZGVmaW5lIHRoZSBmcmFtZSBmb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIGlucHV0IHRvIG9idGFpbkJ1ZmZlcigpIGl0IGlzIGlnbm9yZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIG91dHB1dCBmcm9tIG9idGFpbkJ1ZmZlcigpIGl0IGlzIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBieXRlcyB0byBiZSByZWFkLCB3aGljaCBpcyBmcmFtZUNvdW50ICogZnJhbWVTaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBpbnB1dCB0byByZWxlYXNlQnVmZmVyKCkgaXQgaXMgdGhlIG51bWJlciBvZiBieXRlcyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcmVsZWFzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgVGhpcyBpcyByZWR1bmRhbnQgd2l0aCByZXNwZWN0IHRvIGZyYW1lQ291bnQuICBDb25zaWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcmVtb3Zpbmcgc2l6ZSBhbmQgbWFraW5nIGZyYW1lQ291bnQgdGhlIHByaW1hcnkgZmllbGQuCiAKICAgICAgICAgdW5pb24gewogICAgICAgICAgICAgdm9pZCogICAgICAgcmF3OwogICAgICAgICAgICAgc2hvcnQqICAgICAgaTE2OyAgICAgICAgLy8gc2lnbmVkIDE2LWJpdAogICAgICAgICAgICAgaW50OF90KiAgICAgaTg7ICAgICAgICAgLy8gdW5zaWduZWQgOC1iaXQsIG9mZnNldCBieSAweDgwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCB0byBvYnRhaW5CdWZmZXIoKTogdW51c2VkLCBvdXRwdXQ6IHBvaW50ZXIgdG8gYnVmZmVyCiAgICAgICAgIH07CiAgICAgfTsKIApAQCAtODgsOCArOTIsOCBAQAogICAgICAqIHVzZXI6ICAgIFBvaW50ZXIgdG8gY29udGV4dCBmb3IgdXNlIGJ5IHRoZSBjYWxsYmFjayByZWNlaXZlci4KICAgICAgKiBpbmZvOiAgICBQb2ludGVyIHRvIG9wdGlvbmFsIHBhcmFtZXRlciBhY2NvcmRpbmcgdG8gZXZlbnQgdHlwZToKICAgICAgKiAgICAgICAgICAtIEVWRU5UX01PUkVfREFUQTogcG9pbnRlciB0byBBdWRpb1JlY29yZDo6QnVmZmVyIHN0cnVjdC4gVGhlIGNhbGxiYWNrIG11c3Qgbm90IHJlYWQKLSAgICAgKiAgICAgICAgICAgIG1vcmUgYnl0ZXMgdGhhbiBpbmRpY2F0ZWQgYnkgJ3NpemUnIGZpZWxkIGFuZCB1cGRhdGUgJ3NpemUnIGlmIGZld2VyIGJ5dGVzIGFyZQotICAgICAqICAgICAgICAgICAgY29uc3VtZWQuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmUgYnl0ZXMgdGhhbiBpbmRpY2F0ZWQgYnkgJ3NpemUnIGZpZWxkIGFuZCB1cGRhdGUgJ3NpemUnIGlmCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZld2VyIGJ5dGVzIGFyZSBjb25zdW1lZC4KICAgICAgKiAgICAgICAgICAtIEVWRU5UX09WRVJSVU46IHVudXNlZC4KICAgICAgKiAgICAgICAgICAtIEVWRU5UX01BUktFUjogcG9pbnRlciB0byBjb25zdCB1aW50MzJfdCBjb250YWluaW5nIHRoZSBtYXJrZXIgcG9zaXRpb24gaW4gZnJhbWVzLgogICAgICAqICAgICAgICAgIC0gRVZFTlRfTkVXX1BPUzogcG9pbnRlciB0byBjb25zdCB1aW50MzJfdCBjb250YWluaW5nIHRoZSBuZXcgcG9zaXRpb24gaW4gZnJhbWVzLgpAQCAtMTA2LDYgKzExMCw3IEBACiAgICAgICogIC0gQkFEX1ZBTFVFOiB1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9uCiAgICAgICogZnJhbWVDb3VudCBpcyBndWFyYW50ZWVkIHRvIGJlIG5vbi16ZXJvIGlmIHN0YXR1cyBpcyBOT19FUlJPUiwKICAgICAgKiBhbmQgaXMgdW5kZWZpbmVkIG90aGVyd2lzZS4KKyAgICAgKiBGSVhNRSBUaGlzIEFQSSBhc3N1bWVzIGEgcm91dGUsIGFuZCBzbyBzaG91bGQgYmUgZGVwcmVjYXRlZC4KICAgICAgKi8KIAogICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0TWluRnJhbWVDb3VudChzaXplX3QqIGZyYW1lQ291bnQsCkBAIC0xMTgsMTQgKzEyMywxOCBAQAogICAgIGVudW0gdHJhbnNmZXJfdHlwZSB7CiAgICAgICAgIFRSQU5TRkVSX0RFRkFVTFQsICAgLy8gbm90IHNwZWNpZmllZCBleHBsaWNpdGx5OyBkZXRlcm1pbmUgZnJvbSB0aGUgb3RoZXIgcGFyYW1ldGVycwogICAgICAgICBUUkFOU0ZFUl9DQUxMQkFDSywgIC8vIGNhbGxiYWNrIEVWRU5UX01PUkVfREFUQQotICAgICAgICBUUkFOU0ZFUl9PQlRBSU4sICAgIC8vIEZJWE1FIGRlcHJlY2F0ZWQ6IGNhbGwgb2J0YWluQnVmZmVyKCkgYW5kIHJlbGVhc2VCdWZmZXIoKQorICAgICAgICBUUkFOU0ZFUl9PQlRBSU4sICAgIC8vIGNhbGwgb2J0YWluQnVmZmVyKCkgYW5kIHJlbGVhc2VCdWZmZXIoKQogICAgICAgICBUUkFOU0ZFUl9TWU5DLCAgICAgIC8vIHN5bmNocm9ub3VzIHJlYWQoKQogICAgIH07CiAKICAgICAvKiBDb25zdHJ1Y3RzIGFuIHVuaW5pdGlhbGl6ZWQgQXVkaW9SZWNvcmQuIE5vIGNvbm5lY3Rpb24gd2l0aAogICAgICAqIEF1ZGlvRmxpbmdlciB0YWtlcyBwbGFjZS4gIFVzZSBzZXQoKSBhZnRlciB0aGlzLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKgorICAgICAqIG9wUGFja2FnZU5hbWU6ICAgICAgVGhlIHBhY2thZ2UgbmFtZSB1c2VkIGZvciBhcHAgb3BzLgogICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9SZWNvcmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUmVjb3JkKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKTsKIAogICAgIC8qIENyZWF0ZXMgYW4gQXVkaW9SZWNvcmQgb2JqZWN0IGFuZCByZWdpc3RlcnMgaXQgd2l0aCBBdWRpb0ZsaW5nZXIuCiAgICAgICogT25jZSBjcmVhdGVkLCB0aGUgdHJhY2sgbmVlZHMgdG8gYmUgc3RhcnRlZCBiZWZvcmUgaXQgY2FuIGJlIHVzZWQuCkBAIC0xMzgsMjcgKzE0NywzMCBAQAogICAgICAqIGZvcm1hdDogICAgICAgICAgICAgQXVkaW8gZm9ybWF0IChlLmcgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgZm9yIHNpZ25lZAogICAgICAqICAgICAgICAgICAgICAgICAgICAgMTYgYml0cyBwZXIgc2FtcGxlKS4KICAgICAgKiBjaGFubmVsTWFzazogICAgICAgIENoYW5uZWwgbWFzaywgc3VjaCB0aGF0IGF1ZGlvX2lzX2lucHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spIGlzIHRydWUuCisgICAgICogb3BQYWNrYWdlTmFtZTogICAgICBUaGUgcGFja2FnZSBuYW1lIHVzZWQgZm9yIGFwcCBvcHMuCiAgICAgICogZnJhbWVDb3VudDogICAgICAgICBNaW5pbXVtIHNpemUgb2YgdHJhY2sgUENNIGJ1ZmZlciBpbiBmcmFtZXMuIFRoaXMgZGVmaW5lcyB0aGUKICAgICAgKiAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uJ3MgY29udHJpYnV0aW9uIHRvIHRoZQogICAgICAqICAgICAgICAgICAgICAgICAgICAgbGF0ZW5jeSBvZiB0aGUgdHJhY2suICBUaGUgYWN0dWFsIHNpemUgc2VsZWN0ZWQgYnkgdGhlIEF1ZGlvUmVjb3JkIGNvdWxkCiAgICAgICogICAgICAgICAgICAgICAgICAgICBiZSBsYXJnZXIgaWYgdGhlIHJlcXVlc3RlZCBzaXplIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggY3VycmVudCBhdWRpbyBIQUwKICAgICAgKiAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3kuICBaZXJvIG1lYW5zIHRvIHVzZSBhIGRlZmF1bHQgdmFsdWUuCiAgICAgICogY2JmOiAgICAgICAgICAgICAgICBDYWxsYmFjayBmdW5jdGlvbi4gSWYgbm90IG51bGwsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHBlcmlvZGljYWxseQotICAgICAqICAgICAgICAgICAgICAgICAgICAgdG8gY29uc3VtZSBuZXcgZGF0YSBhbmQgaW5mb3JtIG9mIG1hcmtlciwgcG9zaXRpb24gdXBkYXRlcywgZXRjLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgdG8gY29uc3VtZSBuZXcgZGF0YSBpbiBUUkFOU0ZFUl9DQUxMQkFDSyBtb2RlCisgICAgICogICAgICAgICAgICAgICAgICAgICBhbmQgaW5mb3JtIG9mIG1hcmtlciwgcG9zaXRpb24gdXBkYXRlcywgZXRjLgogICAgICAqIHVzZXI6ICAgICAgICAgICAgICAgQ29udGV4dCBmb3IgdXNlIGJ5IHRoZSBjYWxsYmFjayByZWNlaXZlci4KICAgICAgKiBub3RpZmljYXRpb25GcmFtZXM6IFRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgZWFjaCB0aW1lIG5vdGlmaWNhdGlvbkZyYW1lcyBQQ00KICAgICAgKiAgICAgICAgICAgICAgICAgICAgIGZyYW1lcyBhcmUgcmVhZHkgaW4gcmVjb3JkIHRyYWNrIG91dHB1dCBidWZmZXIuCiAgICAgICogc2Vzc2lvbklkOiAgICAgICAgICBOb3QgeWV0IHN1cHBvcnRlZC4KICAgICAgKiB0cmFuc2ZlclR5cGU6ICAgICAgIEhvdyBkYXRhIGlzIHRyYW5zZmVycmVkIGZyb20gQXVkaW9SZWNvcmQuCiAgICAgICogZmxhZ3M6ICAgICAgICAgICAgICBTZWUgY29tbWVudHMgb24gYXVkaW9faW5wdXRfZmxhZ3NfdCBpbiA8c3lzdGVtL2F1ZGlvLmg+CisgICAgICogcEF0dHJpYnV0ZXM6ICAgICAgICBJZiBub3QgTlVMTCwgc3VwZXJzZWRlcyBpbnB1dFNvdXJjZSBmb3IgdXNlIGNhc2Ugc2VsZWN0aW9uLgogICAgICAqIHRocmVhZENhbkNhbGxKYXZhOiAgTm90IHByZXNlbnQgaW4gcGFyYW1ldGVyIGxpc3QsIGFuZCBzbyBpcyBmaXhlZCBhdCBmYWxzZS4KLSAgICAgKiBwQXR0cmlidXRlczogICAgICAgIGlmIG5vdCBOVUxMLCBzdXBlcnNlZGVzIGlucHV0U291cmNlIGZvciB1c2UgY2FzZSBzZWxlY3Rpb24KICAgICAgKi8KIAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9SZWNvcmQoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSBOVUxMLApAQCAtMTY2LDYgKzE3OCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19JTlBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdWlkID0gLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQgPSAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMKTsKIAogICAgIC8qIFRlcm1pbmF0ZXMgdGhlIEF1ZGlvUmVjb3JkIGFuZCB1bnJlZ2lzdGVycyBpdCBmcm9tIEF1ZGlvRmxpbmdlci4KQEAgLTE3Nyw2ICsxOTEsNyBAQAogCiAgICAgLyogSW5pdGlhbGl6ZSBhbiBBdWRpb1JlY29yZCB0aGF0IHdhcyBjcmVhdGVkIHVzaW5nIHRoZSBBdWRpb1JlY29yZCgpIGNvbnN0cnVjdG9yLgogICAgICAqIERvbid0IGNhbGwgc2V0KCkgbW9yZSB0aGFuIG9uY2UsIG9yIGFmdGVyIGFuIEF1ZGlvUmVjb3JkKCkgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBwYXJhbWV0ZXJzLgorICAgICAqIHNldCgpIGlzIG5vdCBtdWx0aS10aHJlYWQgc2FmZS4KICAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKICAgICAgKiAgLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBpbnRpYWxpemF0aW9uCiAgICAgICogIC0gSU5WQUxJRF9PUEVSQVRJT046IEF1ZGlvUmVjb3JkIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgb3IgcmVjb3JkIGRldmljZSBpcyBhbHJlYWR5IGluIHVzZQpAQCAtMjAxLDYgKzIxNiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUgPSBUUkFOU0ZFUl9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19JTlBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVpZCA9IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMKTsKIAogICAgIC8qIFJlc3VsdCBvZiBjb25zdHJ1Y3RpbmcgdGhlIEF1ZGlvUmVjb3JkLiBUaGlzIG11c3QgYmUgY2hlY2tlZCBmb3Igc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbgpAQCAtMjExLDcgKzIyOCw3IEBACiAgICAgICAgICAgICBzdGF0dXNfdCAgICBpbml0Q2hlY2soKSBjb25zdCAgIHsgcmV0dXJuIG1TdGF0dXM7IH0KIAogICAgIC8qIFJldHVybnMgdGhpcyB0cmFjaydzIGVzdGltYXRlZCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4KLSAgICAgKiBUaGlzIGluY2x1ZGVzIHRoZSBsYXRlbmN5IGR1ZSB0byBBdWRpb1JlY29yZCBidWZmZXIgc2l6ZSwKKyAgICAgKiBUaGlzIGluY2x1ZGVzIHRoZSBsYXRlbmN5IGR1ZSB0byBBdWRpb1JlY29yZCBidWZmZXIgc2l6ZSwgcmVzYW1wbGluZyBpZiBhcHBsaWNhYmxlLAogICAgICAqIGFuZCBhdWRpbyBoYXJkd2FyZSBkcml2ZXIuCiAgICAgICovCiAgICAgICAgICAgICB1aW50MzJfdCAgICBsYXRlbmN5KCkgY29uc3QgICAgIHsgcmV0dXJuIG1MYXRlbmN5OyB9CkBAIC0yNDMsMTEgKzI2MCw2IEBACiAgICAgICovCiAgICAgICAgICAgICB1aW50MzJfdCAgICBnZXRTYW1wbGVSYXRlKCkgY29uc3QgICB7IHJldHVybiBtU2FtcGxlUmF0ZTsgfQogCi0gICAgLyogUmV0dXJuIHRoZSBub3RpZmljYXRpb24gZnJhbWUgY291bnQuCi0gICAgICogVGhpcyBpcyBhcHByb3hpbWF0ZWx5IGhvdyBvZnRlbiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZCwgZm9yIHRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfQ0FMTEJBQ0suCi0gICAgICovCi0gICAgICAgICAgICBzaXplX3QgICAgICBub3RpZmljYXRpb25GcmFtZXMoKSBjb25zdCAgeyByZXR1cm4gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdDsgfQotCiAgICAgLyogU2V0cyBtYXJrZXIgcG9zaXRpb24uIFdoZW4gcmVjb3JkIHJlYWNoZXMgdGhlIG51bWJlciBvZiBmcmFtZXMgc3BlY2lmaWVkLAogICAgICAqIGEgY2FsbGJhY2sgd2l0aCBldmVudCB0eXBlIEVWRU5UX01BUktFUiBpcyBjYWxsZWQuIENhbGxpbmcgc2V0TWFya2VyUG9zaXRpb24KICAgICAgKiB3aXRoIG1hcmtlciA9PSAwIGNhbmNlbHMgbWFya2VyIG5vdGlmaWNhdGlvbiBjYWxsYmFjay4KQEAgLTMwOSw3ICszMjEsMTIgQEAKICAgICAgKiBSZXR1cm5lZCB2YWx1ZToKICAgICAgKiAgaGFuZGxlIG9uIGF1ZGlvIGhhcmR3YXJlIGlucHV0CiAgICAgICovCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAgICBnZXRJbnB1dCgpIGNvbnN0OworLy8gRklYTUUgVGhlIG9ubHkga25vd24gcHVibGljIGNhbGxlciBpcyBmcmFtZXdvcmtzL29wdC9uZXQvdm9pcC9zcmMvam5pL3J0cC9BdWRpb0dyb3VwLmNwcAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgICAgZ2V0SW5wdXQoKSBjb25zdCBfX2F0dHJpYnV0ZV9fKChfX2RlcHJlY2F0ZWRfXykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBnZXRJbnB1dFByaXZhdGUoKTsgfQorcHJpdmF0ZToKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgIGdldElucHV0UHJpdmF0ZSgpIGNvbnN0OworcHVibGljOgogCiAgICAgLyogUmV0dXJucyB0aGUgYXVkaW8gc2Vzc2lvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyBBdWRpb1JlY29yZC4KICAgICAgKgpAQCAtMzIzLDEwICszNDAsMTggQEAKICAgICAgKi8KICAgICAgICAgICAgIGludCAgICBnZXRTZXNzaW9uSWQoKSBjb25zdCB7IHJldHVybiBtU2Vzc2lvbklkOyB9CiAKLSAgICAvKiBPYnRhaW5zIGEgYnVmZmVyIG9mIHVwIHRvICJhdWRpb0J1ZmZlci0+ZnJhbWVDb3VudCIgZnVsbCBmcmFtZXMuCisgICAgLyogUHVibGljIEFQSSBmb3IgVFJBTlNGRVJfT0JUQUlOIG1vZGUuCisgICAgICogT2J0YWlucyBhIGJ1ZmZlciBvZiB1cCB0byAiYXVkaW9CdWZmZXItPmZyYW1lQ291bnQiIGZ1bGwgZnJhbWVzLgogICAgICAqIEFmdGVyIGRyYWluaW5nIHRoZXNlIGZyYW1lcyBvZiBkYXRhLCB0aGUgY2FsbGVyIHNob3VsZCByZWxlYXNlIHRoZW0gd2l0aCByZWxlYXNlQnVmZmVyKCkuCiAgICAgICogSWYgdGhlIHRyYWNrIGJ1ZmZlciBpcyBub3QgZW1wdHksIG9idGFpbkJ1ZmZlcigpIHJldHVybnMgYXMgbWFueSBjb250aWd1b3VzCiAgICAgICogZnVsbCBmcmFtZXMgYXMgYXJlIGF2YWlsYWJsZSBpbW1lZGlhdGVseS4KKyAgICAgKgorICAgICAqIElmIG5vbkNvbnRpZyBpcyBub24tTlVMTCwgaXQgaXMgYW4gb3V0cHV0IHBhcmFtZXRlciB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBudW1iZXIgb2YKKyAgICAgKiBhZGRpdGlvbmFsIG5vbi1jb250aWd1b3VzIGZyYW1lcyB0aGF0IGFyZSBwcmVkaWN0ZWQgdG8gYmUgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LAorICAgICAqIGlmIHRoZSBjbGllbnQgd2VyZSB0byByZWxlYXNlIHRoZSBmaXJzdCBmcmFtZXMgYW5kIHRoZW4gY2FsbCBvYnRhaW5CdWZmZXIoKSBhZ2Fpbi4KKyAgICAgKiBUaGlzIHZhbHVlIGlzIG9ubHkgYSBwcmVkaWN0aW9uLCBhbmQgbmVlZHMgdG8gYmUgY29uZmlybWVkLgorICAgICAqIEl0IHdpbGwgYmUgc2V0IHRvIHplcm8gZm9yIGFuIGVycm9yIHJldHVybi4KKyAgICAgKgogICAgICAqIElmIHRoZSB0cmFjayBidWZmZXIgaXMgZW1wdHkgYW5kIHRyYWNrIGlzIHN0b3BwZWQsIG9idGFpbkJ1ZmZlcigpIHJldHVybnMgV09VTERfQkxPQ0sKICAgICAgKiByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiB3YWl0Q291bnQuCiAgICAgICogSWYgdGhlIHRyYWNrIGJ1ZmZlciBpcyBlbXB0eSBhbmQgdHJhY2sgaXMgbm90IHN0b3BwZWQsIG9idGFpbkJ1ZmZlcigpIGJsb2NrcyB3aXRoIGEKQEAgLTMzNiw5ICszNjEsNiBAQAogICAgICAqIG9yIHJldHVybiBXT1VMRF9CTE9DSyBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHRoZSAid2FpdENvdW50IgogICAgICAqIHBhcmFtZXRlci4KICAgICAgKgotICAgICAqIG9idGFpbkJ1ZmZlcigpIGFuZCByZWxlYXNlQnVmZmVyKCkgYXJlIGRlcHJlY2F0ZWQgZm9yIGRpcmVjdCB1c2UgYnkgYXBwbGljYXRpb25zLAotICAgICAqIHdoaWNoIHNob3VsZCB1c2UgcmVhZCgpIG9yIGNhbGxiYWNrIEVWRU5UX01PUkVfREFUQSBpbnN0ZWFkLgotICAgICAqCiAgICAgICogSW50ZXJwcmV0YXRpb24gb2Ygd2FpdENvdW50OgogICAgICAqICArbiAgbGltaXRzIHdhaXQgdGltZSB0byBuICogV0FJVF9QRVJJT0RfTVMsCiAgICAgICogIC0xICBjYXVzZXMgYW4gKGFsbW9zdCkgaW5maW5pdGUgd2FpdCB0aW1lLApAQCAtMzQ3LDYgKzM2OSw4IEBACiAgICAgICogQnVmZmVyIGZpZWxkcwogICAgICAqIE9uIGVudHJ5OgogICAgICAqICBmcmFtZUNvdW50ICBudW1iZXIgb2YgZnJhbWVzIHJlcXVlc3RlZAorICAgICAqICBzaXplICAgICAgICBpZ25vcmVkCisgICAgICogIHJhdyAgICAgICAgIGlnbm9yZWQKICAgICAgKiBBZnRlciBlcnJvciByZXR1cm46CiAgICAgICogIGZyYW1lQ291bnQgIDAKICAgICAgKiAgc2l6ZSAgICAgICAgMApAQCAtMzU3LDEzICszODEsNTggQEAKICAgICAgKiAgcmF3ICAgICAgICAgcG9pbnRlciB0byB0aGUgYnVmZmVyCiAgICAgICovCiAKLSAgICAvKiBGSVhNRSBEZXByZWNhdGVkIHB1YmxpYyBBUEkgZm9yIFRSQU5TRkVSX09CVEFJTiBtb2RlICovCi0gICAgICAgICAgICBzdGF0dXNfdCAgICBvYnRhaW5CdWZmZXIoQnVmZmVyKiBhdWRpb0J1ZmZlciwgaW50MzJfdCB3YWl0Q291bnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYXR0cmlidXRlX18oKF9fZGVwcmVjYXRlZF9fKSk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICBvYnRhaW5CdWZmZXIoQnVmZmVyKiBhdWRpb0J1ZmZlciwgaW50MzJfdCB3YWl0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqbm9uQ29udGlnID0gTlVMTCk7CisKKyAgICAgICAgICAgIC8vIEV4cGxpY2l0IFJvdXRpbmcKKyAgICAvKioKKyAgICAgKiBUT0RPIERvY3VtZW50IHRoaXMgbWV0aG9kLgorICAgICAqLworICAgICAgICAgICAgc3RhdHVzX3Qgc2V0SW5wdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7CisKKyAgICAvKioKKyAgICAgKiBUT0RPIERvY3VtZW50IHRoaXMgbWV0aG9kLgorICAgICAqLworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRJbnB1dERldmljZSgpOworCisgICAgIC8qIFJldHVybnMgdGhlIElEIG9mIHRoZSBhdWRpbyBkZXZpY2UgYWN0dWFsbHkgdXNlZCBieSB0aGUgaW5wdXQgdG8gd2hpY2ggdGhpcyBBdWRpb1JlY29yZAorICAgICAgKiBpcyBhdHRhY2hlZC4KKyAgICAgICogQSB2YWx1ZSBvZiBBVURJT19QT1JUX0hBTkRMRV9OT05FIGluZGljYXRlcyB0aGUgQXVkaW9SZWNvcmQgaXMgbm90IGF0dGFjaGVkIHRvIGFueSBpbnB1dC4KKyAgICAgICoKKyAgICAgICogUGFyYW1ldGVyczoKKyAgICAgICogIG5vbmUuCisgICAgICAqLworICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldFJvdXRlZERldmljZUlkKCk7CisKKyAgICAvKiBBZGQgYW4gQXVkaW9EZXZpY2VDYWxsYmFjay4gVGhlIGNhbGxlciB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGF1ZGlvIGRldmljZQorICAgICAqIHRvIHdoaWNoIHRoaXMgQXVkaW9SZWNvcmQgaXMgcm91dGVkIGlzIHVwZGF0ZWQuCisgICAgICogUmVwbGFjZXMgYW55IHByZXZpb3VzbHkgaW5zdGFsbGVkIGNhbGxiYWNrLgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogIGNhbGxiYWNrOiAgVGhlIGNhbGxiYWNrIGludGVyZmFjZQorICAgICAqIFJldHVybnMgTk9fRVJST1IgaWYgc3VjY2Vzc2Z1bC4KKyAgICAgKiAgICAgICAgIElOVkFMSURfT1BFUkFUSU9OIGlmIHRoZSBzYW1lIGNhbGxiYWNrIGlzIGFscmVhZHkgaW5zdGFsbGVkLgorICAgICAqICAgICAgICAgTk9fSU5JVCBvciBQUkVNSVNTSU9OX0RFTklFRCBpZiBBdWRpb0ZsaW5nZXIgc2VydmljZSBpcyBub3QgcmVhY2hhYmxlCisgICAgICogICAgICAgICBCQURfVkFMVUUgaWYgdGhlIGNhbGxiYWNrIGlzIE5VTEwKKyAgICAgKi8KKyAgICAgICAgICAgIHN0YXR1c190IGFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spOworCisgICAgLyogcmVtb3ZlIGFuIEF1ZGlvRGV2aWNlQ2FsbGJhY2suCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgY2FsbGJhY2s6ICBUaGUgY2FsbGJhY2sgaW50ZXJmYWNlCisgICAgICogUmV0dXJucyBOT19FUlJPUiBpZiBzdWNjZXNzZnVsLgorICAgICAqICAgICAgICAgSU5WQUxJRF9PUEVSQVRJT04gaWYgdGhlIGNhbGxiYWNrIGlzIG5vdCBpbnN0YWxsZWQKKyAgICAgKiAgICAgICAgIEJBRF9WQUxVRSBpZiB0aGUgY2FsbGJhY2sgaXMgTlVMTAorICAgICAqLworICAgICAgICAgICAgc3RhdHVzX3QgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjaygKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjayk7CiAKIHByaXZhdGU6CiAgICAgLyogSWYgbm9uQ29udGlnIGlzIG5vbi1OVUxMLCBpdCBpcyBhbiBvdXRwdXQgcGFyYW1ldGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gdGhlIG51bWJlciBvZgotICAgICAqIGFkZGl0aW9uYWwgbm9uLWNvbnRpZ3VvdXMgZnJhbWVzIHRoYXQgYXJlIGF2YWlsYWJsZSBpbW1lZGlhdGVseS4KKyAgICAgKiBhZGRpdGlvbmFsIG5vbi1jb250aWd1b3VzIGZyYW1lcyB0aGF0IGFyZSBwcmVkaWN0ZWQgdG8gYmUgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LAorICAgICAqIGlmIHRoZSBjbGllbnQgd2VyZSB0byByZWxlYXNlIHRoZSBmaXJzdCBmcmFtZXMgYW5kIHRoZW4gY2FsbCBvYnRhaW5CdWZmZXIoKSBhZ2Fpbi4KKyAgICAgKiBUaGlzIHZhbHVlIGlzIG9ubHkgYSBwcmVkaWN0aW9uLCBhbmQgbmVlZHMgdG8gYmUgY29uZmlybWVkLgorICAgICAqIEl0IHdpbGwgYmUgc2V0IHRvIHplcm8gZm9yIGFuIGVycm9yIHJldHVybi4KICAgICAgKiBGSVhNRSBXZSBjb3VsZCBwYXNzIGFuIGFycmF5IG9mIEJ1ZmZlcnMgaW5zdGVhZCBvZiBvbmx5IG9uZSBCdWZmZXIgdG8gb2J0YWluQnVmZmVyKCksCiAgICAgICogaW4gY2FzZSB0aGUgcmVxdWVzdGVkIGFtb3VudCBvZiBmcmFtZXMgaXMgaW4gdHdvIG9yIG1vcmUgbm9uLWNvbnRpZ3VvdXMgcmVnaW9ucy4KICAgICAgKiBGSVhNRSByZXF1ZXN0ZWQgYW5kIGVsYXBzZWQgYXJlIGJvdGggcmVsYXRpdmUgdGltZXMuICBDb25zaWRlciBjaGFuZ2luZyB0byBhYnNvbHV0ZSB0aW1lLgpAQCAtMzcyLDkgKzQ0MSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyAqZWxhcHNlZCA9IE5VTEwsIHNpemVfdCAqbm9uQ29udGlnID0gTlVMTCk7CiBwdWJsaWM6CiAKLSAgICAvKiBSZWxlYXNlIGFuIGVtcHRpZWQgYnVmZmVyIG9mICJhdWRpb0J1ZmZlci0+ZnJhbWVDb3VudCIgZnJhbWVzIGZvciBBdWRpb0ZsaW5nZXIgdG8gcmUtZmlsbC4gKi8KLSAgICAvLyBGSVhNRSBtYWtlIHByaXZhdGUgd2hlbiBvYnRhaW5CdWZmZXIoKSBmb3IgVFJBTlNGRVJfT0JUQUlOIGlzIHJlbW92ZWQKLSAgICAgICAgICAgIHZvaWQgICAgICAgIHJlbGVhc2VCdWZmZXIoQnVmZmVyKiBhdWRpb0J1ZmZlcik7CisgICAgLyogUHVibGljIEFQSSBmb3IgVFJBTlNGRVJfT0JUQUlOIG1vZGUuCisgICAgICogUmVsZWFzZSBhbiBlbXB0aWVkIGJ1ZmZlciBvZiAiYXVkaW9CdWZmZXItPmZyYW1lQ291bnQiIGZyYW1lcyBmb3IgQXVkaW9GbGluZ2VyIHRvIHJlLWZpbGwuCisgICAgICoKKyAgICAgKiBCdWZmZXIgZmllbGRzOgorICAgICAqICBmcmFtZUNvdW50ICBjdXJyZW50bHkgaWdub3JlZCBidXQgcmVjb21tZW5kIHRvIHNldCB0byBhY3R1YWwgbnVtYmVyIG9mIGZyYW1lcyBjb25zdW1lZAorICAgICAqICBzaXplICAgICAgICBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkLCBtdXN0IGJlIG11bHRpcGxlIG9mIGZyYW1lU2l6ZQorICAgICAqICByYXcgICAgICAgICBpZ25vcmVkCisgICAgICovCisgICAgICAgICAgICB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKGNvbnN0IEJ1ZmZlciogYXVkaW9CdWZmZXIpOwogCiAgICAgLyogQXMgYSBjb252ZW5pZW5jZSB3ZSBwcm92aWRlIGEgcmVhZCgpIGludGVyZmFjZSB0byB0aGUgYXVkaW8gYnVmZmVyLgogICAgICAqIElucHV0IHBhcmFtZXRlciAnc2l6ZScgaXMgaW4gYnl0ZSB1bml0cy4KQEAgLTM4Niw4ICs0NjEsMTEgQEAKICAgICAgKiAgICAgIFdPVUxEX0JMT0NLICAgICAgICAgd2hlbiBvYnRhaW5CdWZmZXIoKSByZXR1cm5zIHNhbWUsIG9yCiAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUmVjb3JkIHdhcyBzdG9wcGVkIGR1cmluZyB0aGUgcmVhZAogICAgICAqICAgICAgb3IgYW55IG90aGVyIGVycm9yIGNvZGUgcmV0dXJuZWQgYnkgSUF1ZGlvUmVjb3JkOjpzdGFydCgpIG9yIHJlc3RvcmVSZWNvcmRfbCgpLgorICAgICAqIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gb25seSByZXR1cm4gd2hlbiBhbGwgZGF0YSBoYXMgYmVlbiB0cmFuc2ZlcnJlZC4gU2V0ICdibG9ja2luZycgdG8KKyAgICAgKiBmYWxzZSBmb3IgdGhlIG1ldGhvZCB0byByZXR1cm4gaW1tZWRpYXRlbHkgd2l0aG91dCB3YWl0aW5nIHRvIHRyeSBtdWx0aXBsZSB0aW1lcyB0byByZWFkCisgICAgICogdGhlIGZ1bGwgY29udGVudCBvZiB0aGUgYnVmZmVyLgogICAgICAqLwotICAgICAgICAgICAgc3NpemVfdCAgICAgcmVhZCh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKTsKKyAgICAgICAgICAgIHNzaXplX3QgICAgIHJlYWQodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBibG9ja2luZyA9IHRydWUpOwogCiAgICAgLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgaW5wdXQgZnJhbWVzIGxvc3QgaW4gdGhlIGF1ZGlvIGRyaXZlciBzaW5jZSB0aGUgbGFzdCBjYWxsIG9mIHRoaXMKICAgICAgKiBmdW5jdGlvbi4gIEF1ZGlvIGRyaXZlciBpcyBleHBlY3RlZCB0byByZXNldCB0aGUgdmFsdWUgdG8gMCBhbmQgcmVzdGFydCBjb3VudGluZyB1cG9uCkBAIC00MTYsNiArNDk0LDcgQEAKIAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHBhdXNlKCk7ICAgIC8vIHN1c3BlbmQgdGhyZWFkIGZyb20gZXhlY3V0aW9uIGF0IG5leHQgbG9vcCBib3VuZGFyeQogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlc3VtZSgpOyAgIC8vIGFsbG93IHRocmVhZCB0byBleGVjdXRlLCBpZiBub3QgcmVxdWVzdGVkIHRvIGV4aXQKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICB3YWtlKCk7ICAgICAvLyB3YWtlIHRvIGhhbmRsZSBjaGFuZ2VkIG5vdGlmaWNhdGlvbiBjb25kaXRpb25zLgogCiAgICAgcHJpdmF0ZToKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBwYXVzZUludGVybmFsKG5zZWNzX3QgbnMgPSAwTEwpOwpAQCAtNDMwLDcgKzUwOSw5IEBACiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgbVBhdXNlZDsgICAgLy8gd2hldGhlciB0aHJlYWQgaXMgcmVxdWVzdGVkIHRvIHBhdXNlIGF0IG5leHQgbG9vcCBlbnRyeQogICAgICAgICBib29sICAgICAgICAgICAgICAgIG1QYXVzZWRJbnQ7IC8vIHdoZXRoZXIgdGhyZWFkIGludGVybmFsbHkgcmVxdWVzdHMgcGF1c2UKICAgICAgICAgbnNlY3NfdCAgICAgICAgICAgICBtUGF1c2VkTnM7ICAvLyBpZiBtUGF1c2VkSW50IHRoZW4gYXNzb2NpYXRlZCB0aW1lb3V0LCBvdGhlcndpc2UgaWdub3JlZAotICAgICAgICBib29sICAgICAgICAgICAgICAgIG1JZ25vcmVOZXh0UGF1c2VkSW50OyAgIC8vIHdoZXRoZXIgdG8gaWdub3JlIG5leHQgbVBhdXNlZEludCByZXF1ZXN0CisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgbUlnbm9yZU5leHRQYXVzZWRJbnQ7ICAgLy8gc2tpcCBhbnkgaW50ZXJuYWwgcGF1c2UgYW5kIGdvIGltbWVkaWF0ZWx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkgYXMgc3RhdGUgbWF5IGhhdmUgY2hhbmdlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHBhdXNlIHRpbWUgY2FsY3VsYXRlZC4KICAgICB9OwogCiAgICAgICAgICAgICAvLyBib2R5IG9mIEF1ZGlvUmVjb3JkVGhyZWFkOjp0aHJlYWRMb29wKCkKQEAgLTQ0NSw3ICs1MjYsNyBAQAogCiAgICAgICAgICAgICAvLyBjYWxsZXIgbXVzdCBob2xkIGxvY2sgb24gbUxvY2sgZm9yIGFsbCBfbCBtZXRob2RzCiAKLSAgICAgICAgICAgIHN0YXR1c190IG9wZW5SZWNvcmRfbChzaXplX3QgZXBvY2gpOworICAgICAgICAgICAgc3RhdHVzX3Qgb3BlblJlY29yZF9sKHNpemVfdCBlcG9jaCwgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpOwogCiAgICAgICAgICAgICAvLyBGSVhNRSBlbnVtIGlzIGZhc3RlciB0aGFuIHN0cmNtcCgpIGZvciBwYXJhbWV0ZXIgJ2Zyb20nCiAgICAgICAgICAgICBzdGF0dXNfdCByZXN0b3JlUmVjb3JkX2woY29uc3QgY2hhciAqZnJvbSk7CkBAIC00NTgsNyArNTM5LDcgQEAKICAgICBib29sICAgICAgICAgICAgICAgICAgICBtQWN0aXZlOwogCiAgICAgLy8gZm9yIGNsaWVudCBjYWxsYmFjayBoYW5kbGVyCi0gICAgY2FsbGJhY2tfdCAgICAgICAgICAgICAgbUNiZjsgICAgICAgICAgICAgICAvLyBjYWxsYmFjayBoYW5kbGVyIGZvciBldmVudHMsIG9yIE5VTEwKKyAgICBjYWxsYmFja190ICAgICAgICAgICAgICBtQ2JmOyAgICAgICAgICAgICAgICAgICAvLyBjYWxsYmFjayBoYW5kbGVyIGZvciBldmVudHMsIG9yIE5VTEwKICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICBtVXNlckRhdGE7CiAKICAgICAvLyBmb3Igbm90aWZpY2F0aW9uIEFQSXMKQEAgLTQ3NSwxMyArNTU2LDE1IEBACiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVJldHJ5T25QYXJ0aWFsQnVmZmVyOyAgLy8gc2xlZXAgYW5kIHJldHJ5IGFmdGVyIHBhcnRpYWwgb2J0YWluQnVmZmVyKCkKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtT2JzZXJ2ZWRTZXF1ZW5jZTsgICAgICAvLyBsYXN0IG9ic2VydmVkIHZhbHVlIG9mIG1TZXF1ZW5jZQogCi0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgbU1hcmtlclBvc2l0aW9uOyAgICAvLyBpbiB3cmFwcGluZyAob3ZlcmZsb3cpIGZyYW1lIHVuaXRzCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbU1hcmtlclBvc2l0aW9uOyAgICAgICAgLy8gaW4gd3JhcHBpbmcgKG92ZXJmbG93KSBmcmFtZSB1bml0cwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1NYXJrZXJSZWFjaGVkOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1OZXdQb3NpdGlvbjsgICAgICAgLy8gaW4gZnJhbWVzCi0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVVwZGF0ZVBlcmlvZDsgICAgICAvLyBpbiBmcmFtZXMsIHplcm8gbWVhbnMgbm8gRVZFTlRfTkVXX1BPUworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1OZXdQb3NpdGlvbjsgICAgICAgICAgIC8vIGluIGZyYW1lcworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1VcGRhdGVQZXJpb2Q7ICAgICAgICAgIC8vIGluIGZyYW1lcywgemVybyBtZWFucyBubyBFVkVOVF9ORVdfUE9TCiAKICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBtU3RhdHVzOwogCisgICAgU3RyaW5nMTYgICAgICAgICAgICAgICAgbU9wUGFja2FnZU5hbWU7ICAgICAgICAgLy8gVGhlIHBhY2thZ2UgbmFtZSB1c2VkIGZvciBhcHAgb3BzLgorCiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQ7ICAgICAgICAgICAgLy8gY29ycmVzcG9uZHMgdG8gY3VycmVudCBJQXVkaW9SZWNvcmQsIHZhbHVlIGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0ZWQgYmFjayBieSBBdWRpb0ZsaW5nZXIgdG8gdGhlIGNsaWVudAogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1SZXFGcmFtZUNvdW50OyAgICAgICAgIC8vIGZyYW1lIGNvdW50IHRvIHJlcXVlc3QgdGhlIGZpcnN0IG9yIG5leHQgdGltZQpAQCAtNTMxLDcgKzYxNCwxNCBAQAogCiAgICAgc3A8RGVhdGhOb3RpZmllcj4gICAgICAgbURlYXRoTm90aWZpZXI7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNlcXVlbmNlOyAgICAgICAgICAgICAgLy8gaW5jcmVtZW50ZWQgZm9yIGVhY2ggbmV3IElBdWRpb1JlY29yZCBhdHRlbXB0CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUNsaWVudFVpZDsKKyAgICBwaWRfdCAgICAgICAgICAgICAgICAgICBtQ2xpZW50UGlkOwogICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAgICAgIG1BdHRyaWJ1dGVzOworCisgICAgLy8gRm9yIERldmljZSBTZWxlY3Rpb24gQVBJCisgICAgLy8gIGEgdmFsdWUgb2YgQVVESU9fUE9SVF9IQU5ETEVfTk9ORSBpbmRpY2F0ZWQgZGVmYXVsdCAoQXVkaW9Qb2xpY3lNYW5hZ2VyKSByb3V0aW5nLgorICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgbVNlbGVjdGVkRGV2aWNlSWQ7CisgICAgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+IG1EZXZpY2VDYWxsYmFjazsKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKaW5kZXggOTc4NDdhMC4uMDU1ZjcyNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaApAQCAtMTcsNiArMTcsMTEgQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfUFVCTElDX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfUFVCTElDX0gKIAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCiAvLyBBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVggaXMgdGhlIG1heGltdW0gcmF0aW8gYmV0d2VlbiB0aGUgb3JpZ2luYWwKIC8vIGF1ZGlvIHNhbXBsZSByYXRlIGFuZCB0aGUgdGFyZ2V0IHJhdGUgd2hlbiBkb3duc2FtcGxpbmcsCiAvLyBhcyBwZXJtaXR0ZWQgaW4gdGhlIGF1ZGlvIGZyYW1ld29yaywgZS5nLiBBdWRpb1RyYWNrIGFuZCBBdWRpb0ZsaW5nZXIuCkBAIC0yNiw0ICszMSwxNDcgQEAKIC8vIFRPRE86IHJlcGxhY2Ugd2l0aCBhbiBBUEkKICNkZWZpbmUgQVVESU9fUkVTQU1QTEVSX0RPV05fUkFUSU9fTUFYIDI1NgogCisvLyBBVURJT19SRVNBTVBMRVJfVVBfUkFUSU9fTUFYIGlzIHRoZSBtYXhpbXVtIHN1Z2dlc3RlZCByYXRpbyBiZXR3ZWVuIHRoZSBvcmlnaW5hbAorLy8gYXVkaW8gc2FtcGxlIHJhdGUgYW5kIHRoZSB0YXJnZXQgcmF0ZSB3aGVuIHVwc2FtcGxpbmcuICBJdCBpcyBsb29zZWx5IGVuZm9yY2VkIGJ5CisvLyB0aGUgc3lzdGVtLiBPbmUgaXNzdWUgd2l0aCBsYXJnZSB1cHNhbXBsaW5nIHJhdGlvcyBpcyB0aGUgYXBwcm94aW1hdGlvbiBieQorLy8gYW4gaW50MzJfdCBvZiB0aGUgcGhhc2UgaW5jcmVtZW50cywgbWFraW5nIHRoZSByZXN1bHRpbmcgc2FtcGxlIHJhdGUgaW5leGFjdC4KKyNkZWZpbmUgQVVESU9fUkVTQU1QTEVSX1VQX1JBVElPX01BWCA2NTUzNgorCisvLyBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NSU4gYW5kIEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01BWCBkZWZpbmUgdGhlIG1pbiBhbmQgbWF4IHRpbWUgc3RyZXRjaAorLy8gc3BlZWRzIHN1cHBvcnRlZCBieSB0aGUgc3lzdGVtLiBUaGVzZSBhcmUgZW5mb3JjZWQgYnkgdGhlIHN5c3RlbSBhbmQgdmFsdWVzIG91dHNpZGUgdGhpcyByYW5nZQorLy8gd2lsbCByZXN1bHQgaW4gYSBydW50aW1lIGVycm9yLgorLy8gRGVwZW5kaW5nIG9uIHRoZSBBdWRpb1BsYXliYWNrUmF0ZTo6bVN0cmV0Y2hNb2RlLCB0aGUgZWZmZWN0aXZlIGxpbWl0cyBtaWdodCBiZSBuYXJyb3dlciB0aGFuCisvLyB0aGUgb25lcyBzcGVjaWZpZWQgaGVyZQorLy8gQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUlOX0RFTFRBIGlzIHRoZSBtaW5pbXVtIGFic29sdXRlIHNwZWVkIGRpZmZlcmVuY2UgdGhhdCBtaWdodCB0cmlnZ2VyIGEKKy8vIHBhcmFtZXRlciB1cGRhdGUKKyNkZWZpbmUgQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUlOICAgIDAuMDFmCisjZGVmaW5lIEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01BWCAgICAyMC4wZgorI2RlZmluZSBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9OT1JNQUwgMS4wZgorI2RlZmluZSBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NSU5fREVMVEEgMC4wMDAxZgorCisvLyBBVURJT19USU1FU1RSRVRDSF9QSVRDSF9NSU4gYW5kIEFVRElPX1RJTUVTVFJFVENIX1BJVENIX01BWCBkZWZpbmUgdGhlIG1pbiBhbmQgbWF4IHRpbWUgc3RyZXRjaAorLy8gcGl0Y2ggc2hpZnRpbmcgc3VwcG9ydGVkIGJ5IHRoZSBzeXN0ZW0uIFRoZXNlIGFyZSBub3QgZW5mb3JjZWQgYnkgdGhlIHN5c3RlbSBhbmQgdmFsdWVzCisvLyBvdXRzaWRlIHRoaXMgcmFuZ2UgbWlnaHQgcmVzdWx0IGluIGEgcGl0Y2ggZGlmZmVyZW50IHRoYW4gdGhlIG9uZSByZXF1ZXN0ZWQuCisvLyBEZXBlbmRpbmcgb24gdGhlIEF1ZGlvUGxheWJhY2tSYXRlOjptU3RyZXRjaE1vZGUsIHRoZSBlZmZlY3RpdmUgbGltaXRzIG1pZ2h0IGJlIG5hcnJvd2VyIHRoYW4KKy8vIHRoZSBvbmVzIHNwZWNpZmllZCBoZXJlLgorLy8gQVVESU9fVElNRVNUUkVUQ0hfUElUQ0hfTUlOX0RFTFRBIGlzIHRoZSBtaW5pbXVtIGFic29sdXRlIHBpdGNoIGRpZmZlcmVuY2UgdGhhdCBtaWdodCB0cmlnZ2VyIGEKKy8vIHBhcmFtZXRlciB1cGRhdGUKKyNkZWZpbmUgQVVESU9fVElNRVNUUkVUQ0hfUElUQ0hfTUlOICAgIDAuMjVmCisjZGVmaW5lIEFVRElPX1RJTUVTVFJFVENIX1BJVENIX01BWCAgICA0LjBmCisjZGVmaW5lIEFVRElPX1RJTUVTVFJFVENIX1BJVENIX05PUk1BTCAxLjBmCisjZGVmaW5lIEFVRElPX1RJTUVTVFJFVENIX1BJVENIX01JTl9ERUxUQSAwLjAwMDFmCisKKworLy9EZXRlcm1pbmVzIHRoZSBjdXJyZW50IGFsZ29yaXRobSB1c2VkIGZvciBzdHJldGNoaW5nCitlbnVtIEF1ZGlvVGltZXN0cmV0Y2hTdHJldGNoTW9kZSA6IGludDMyX3QgeworICAgIEFVRElPX1RJTUVTVFJFVENIX1NUUkVUQ0hfREVGQVVMVCAgICAgICAgICAgID0gMCwKKyAgICBBVURJT19USU1FU1RSRVRDSF9TVFJFVENIX1NQRUVDSCAgICAgICAgICAgICA9IDEsCisgICAgLy9UT0RPOiBhZGQgbW9yZSBzdHJldGNoIG1vZGVzL2FsZ29yaXRobXMKK307CisKKy8vTGltaXRzIGZvciBBVURJT19USU1FU1RSRVRDSF9TVFJFVENIX1NQRUVDSCBtb2RlCisjZGVmaW5lIFRJTUVTVFJFVENIX1NPTklDX1NQRUVEX01JTiAwLjFmCisjZGVmaW5lIFRJTUVTVFJFVENIX1NPTklDX1NQRUVEX01BWCA2LjBmCisKKy8vRGV0ZXJtaW5lcyBiZWhhdmlvciBvZiBUaW1lc3RyZXRjaCBpZiBjdXJyZW50IGFsZ29yaXRobSBjYW4ndCBwZXJmb3JtCisvL3dpdGggY3VycmVudCBwYXJhbWV0ZXJzLgorLy8gRkFMTEJBQ0tfQ1VUX1JFUEVBVDogKGludGVybmFsIG9ubHkpIGZvciBzcGVlZCA8MS4wIHdpbGwgdHJ1bmNhdGUgZnJhbWVzCisvLyAgICBmb3Igc3BlZWQgPiAxLjAgd2lsbCByZXBlYXQgZnJhbWVzCisvLyBGQUxMQkFDS19NVVRFOiB3aWxsIHNldCBhbGwgcHJvY2Vzc2VkIGZyYW1lcyB0byB6ZXJvCisvLyBGQUxMQkFDS19GQUlMOiAgd2lsbCBzdG9wIHByb2dyYW0gZXhlY3V0aW9uIGFuZCBsb2cgYSBmYXRhbCBlcnJvcgorZW51bSBBdWRpb1RpbWVzdHJldGNoRmFsbGJhY2tNb2RlIDogaW50MzJfdCB7CisgICAgQVVESU9fVElNRVNUUkVUQ0hfRkFMTEJBQ0tfQ1VUX1JFUEVBVCAgICAgPSAtMSwKKyAgICBBVURJT19USU1FU1RSRVRDSF9GQUxMQkFDS19ERUZBVUxUICAgICAgICA9IDAsCisgICAgQVVESU9fVElNRVNUUkVUQ0hfRkFMTEJBQ0tfTVVURSAgICAgICAgICAgPSAxLAorICAgIEFVRElPX1RJTUVTVFJFVENIX0ZBTExCQUNLX0ZBSUwgICAgICAgICAgID0gMiwKK307CisKK3N0cnVjdCBBdWRpb1BsYXliYWNrUmF0ZSB7CisgICAgZmxvYXQgbVNwZWVkOworICAgIGZsb2F0IG1QaXRjaDsKKyAgICBlbnVtIEF1ZGlvVGltZXN0cmV0Y2hTdHJldGNoTW9kZSAgbVN0cmV0Y2hNb2RlOworICAgIGVudW0gQXVkaW9UaW1lc3RyZXRjaEZhbGxiYWNrTW9kZSBtRmFsbGJhY2tNb2RlOworfTsKKworc3RhdGljIGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlIEFVRElPX1BMQVlCQUNLX1JBVEVfREVGQVVMVCA9IHsKKyAgICAgICAgQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTk9STUFMLAorICAgICAgICBBVURJT19USU1FU1RSRVRDSF9QSVRDSF9OT1JNQUwsCisgICAgICAgIEFVRElPX1RJTUVTVFJFVENIX1NUUkVUQ0hfREVGQVVMVCwKKyAgICAgICAgQVVESU9fVElNRVNUUkVUQ0hfRkFMTEJBQ0tfREVGQVVMVAorfTsKKworc3RhdGljIGlubGluZSBib29sIGlzQXVkaW9QbGF5YmFja1JhdGVFcXVhbChjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcHIxLAorICAgICAgICBjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcHIyKSB7CisgICAgcmV0dXJuIGZhYnMocHIxLm1TcGVlZCAtIHByMi5tU3BlZWQpIDwgQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUlOX0RFTFRBICYmCisgICAgICAgICAgIGZhYnMocHIxLm1QaXRjaCAtIHByMi5tUGl0Y2gpIDwgQVVESU9fVElNRVNUUkVUQ0hfUElUQ0hfTUlOX0RFTFRBICYmCisgICAgICAgICAgIHByMi5tU3RyZXRjaE1vZGUgPT0gcHIyLm1TdHJldGNoTW9kZSAmJgorICAgICAgICAgICBwcjIubUZhbGxiYWNrTW9kZSA9PSBwcjIubUZhbGxiYWNrTW9kZTsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzQXVkaW9QbGF5YmFja1JhdGVWYWxpZChjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKSB7CisgICAgaWYgKHBsYXliYWNrUmF0ZS5tRmFsbGJhY2tNb2RlID09IEFVRElPX1RJTUVTVFJFVENIX0ZBTExCQUNLX0ZBSUwgJiYKKyAgICAgICAgICAgIChwbGF5YmFja1JhdGUubVN0cmV0Y2hNb2RlID09IEFVRElPX1RJTUVTVFJFVENIX1NUUkVUQ0hfU1BFRUNIIHx8CisgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS5tU3RyZXRjaE1vZGUgPT0gQVVESU9fVElNRVNUUkVUQ0hfU1RSRVRDSF9ERUZBVUxUKSkgeworICAgICAgICAvL3Rlc3Qgc29uaWMgc3BlY2lmaWMgY29uc3RyYWludHMKKyAgICAgICAgcmV0dXJuIHBsYXliYWNrUmF0ZS5tU3BlZWQgPj0gVElNRVNUUkVUQ0hfU09OSUNfU1BFRURfTUlOICYmCisgICAgICAgICAgICAgICAgcGxheWJhY2tSYXRlLm1TcGVlZCA8PSBUSU1FU1RSRVRDSF9TT05JQ19TUEVFRF9NQVggJiYKKyAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUubVBpdGNoID49IEFVRElPX1RJTUVTVFJFVENIX1BJVENIX01JTiAmJgorICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS5tUGl0Y2ggPD0gQVVESU9fVElNRVNUUkVUQ0hfUElUQ0hfTUFYOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBwbGF5YmFja1JhdGUubVNwZWVkID49IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01JTiAmJgorICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS5tU3BlZWQgPD0gQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUFYICYmCisgICAgICAgICAgICAgICAgcGxheWJhY2tSYXRlLm1QaXRjaCA+PSBBVURJT19USU1FU1RSRVRDSF9QSVRDSF9NSU4gJiYKKyAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUubVBpdGNoIDw9IEFVRElPX1RJTUVTVFJFVENIX1BJVENIX01BWDsKKyAgICB9Cit9CisKKy8vIFRPRE86IENvbnNpZGVyIHB1dHRpbmcgdGhlc2UgaW5saW5lcyBpbnRvIGEgY2xhc3Mgc2NvcGUKKworLy8gUmV0dXJucyB0aGUgc291cmNlIGZyYW1lcyBuZWVkZWQgdG8gcmVzYW1wbGUgdG8gZGVzdGluYXRpb24gZnJhbWVzLiAgVGhpcyBpcyBub3QgYSBwcmVjaXNlCisvLyB2YWx1ZSBhbmQgZGVwZW5kcyBvbiB0aGUgcmVzYW1wbGVyIChhbmQgcG9zc2libHkgaG93IGl0IGhhbmRsZXMgcm91bmRpbmcgaW50ZXJuYWxseSkuCisvLyBOZXZlcnRoZWxlc3MsIHRoaXMgc2hvdWxkIGJlIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIHJlc2FtcGxlci4KKy8vIElmIHNyY1NhbXBsZVJhdGUgYW5kIGRzdFNhbXBsZVJhdGUgYXJlIGVxdWFsLCB0aGVuIGl0IHJldHVybnMgZGVzdGluYXRpb24gZnJhbWVzLCB3aGljaAorLy8gbWF5IG5vdCBiZSB0cnVlIGlmIHRoZSByZXNhbXBsZXIgaXMgYXN5bmNocm9ub3VzLgorc3RhdGljIGlubGluZSBzaXplX3Qgc291cmNlRnJhbWVzTmVlZGVkKAorICAgICAgICB1aW50MzJfdCBzcmNTYW1wbGVSYXRlLCBzaXplX3QgZHN0RnJhbWVzUmVxdWlyZWQsIHVpbnQzMl90IGRzdFNhbXBsZVJhdGUpIHsKKyAgICAvLyArMSBmb3Igcm91bmRpbmcgLSBhbHdheXMgZG8gdGhpcyBldmVuIGlmIG1hdGNoZWQgcmF0aW8gKHJlc2FtcGxlciBtYXkgdXNlIHBoYXNlcyBub3QgcmF0aW8pCisgICAgLy8gKzEgZm9yIGFkZGl0aW9uYWwgc2FtcGxlIG5lZWRlZCBmb3IgaW50ZXJwb2xhdGlvbgorICAgIHJldHVybiBzcmNTYW1wbGVSYXRlID09IGRzdFNhbXBsZVJhdGUgPyBkc3RGcmFtZXNSZXF1aXJlZCA6CisgICAgICAgICAgICBzaXplX3QoKHVpbnQ2NF90KWRzdEZyYW1lc1JlcXVpcmVkICogc3JjU2FtcGxlUmF0ZSAvIGRzdFNhbXBsZVJhdGUgKyAxICsgMSk7Cit9CisKKy8vIEFuIHVwcGVyIGJvdW5kIGZvciB0aGUgbnVtYmVyIG9mIGRlc3RpbmF0aW9uIGZyYW1lcyBwb3NzaWJsZSBmcm9tIHNyY0ZyYW1lcworLy8gYWZ0ZXIgc2FtcGxlIHJhdGUgY29udmVyc2lvbi4gIFRoaXMgbWF5IGJlIHVzZWQgZm9yIGJ1ZmZlciBzaXppbmcuCitzdGF0aWMgaW5saW5lIHNpemVfdCBkZXN0aW5hdGlvbkZyYW1lc1Bvc3NpYmxlKHNpemVfdCBzcmNGcmFtZXMsIHVpbnQzMl90IHNyY1NhbXBsZVJhdGUsCisgICAgICAgIHVpbnQzMl90IGRzdFNhbXBsZVJhdGUpIHsKKyAgICBpZiAoc3JjU2FtcGxlUmF0ZSA9PSBkc3RTYW1wbGVSYXRlKSB7CisgICAgICAgIHJldHVybiBzcmNGcmFtZXM7CisgICAgfQorICAgIHVpbnQ2NF90IGRzdEZyYW1lcyA9ICh1aW50NjRfdClzcmNGcmFtZXMgKiBkc3RTYW1wbGVSYXRlIC8gc3JjU2FtcGxlUmF0ZTsKKyAgICByZXR1cm4gZHN0RnJhbWVzID4gMiA/IGRzdEZyYW1lcyAtIDIgOiAwOworfQorCitzdGF0aWMgaW5saW5lIHNpemVfdCBzb3VyY2VGcmFtZXNOZWVkZWRXaXRoVGltZXN0cmV0Y2goCisgICAgICAgIHVpbnQzMl90IHNyY1NhbXBsZVJhdGUsIHNpemVfdCBkc3RGcmFtZXNSZXF1aXJlZCwgdWludDMyX3QgZHN0U2FtcGxlUmF0ZSwKKyAgICAgICAgZmxvYXQgc3BlZWQpIHsKKyAgICAvLyByZXF1aXJlZCBpcyB0aGUgbnVtYmVyIG9mIGlucHV0IGZyYW1lcyB0aGUgcmVzYW1wbGVyIG5lZWRzCisgICAgc2l6ZV90IHJlcXVpcmVkID0gc291cmNlRnJhbWVzTmVlZGVkKHNyY1NhbXBsZVJhdGUsIGRzdEZyYW1lc1JlcXVpcmVkLCBkc3RTYW1wbGVSYXRlKTsKKyAgICAvLyB0byBkZWxpdmVyIHRoaXMsIHRoZSB0aW1lIHN0cmV0Y2hlciByZXF1aXJlczoKKyAgICByZXR1cm4gcmVxdWlyZWQgKiAoZG91YmxlKXNwZWVkICsgMSArIDE7IC8vIGFjY291bnRpbmcgZm9yIHJvdW5kaW5nIGRlcGVuZGVuY2llcworfQorCisvLyBJZGVudGlmaWVzIHNhbXBsZSByYXRlcyB0aGF0IHdlIGFzc29jaWF0ZSB3aXRoIG11c2ljCisvLyBhbmQgdGh1cyBlbGlnaWJsZSBmb3IgYmV0dGVyIHJlc2FtcGxpbmcgYW5kIGZhc3QgY2FwdHVyZS4KKy8vIFRoaXMgaXMgc29tZXdoYXQgbGVzcyB0aGFuIDQ0MTAwIHRvIGFsbG93IGZvciBwaXRjaCBjb3JyZWN0aW9uCisvLyBpbnZvbHZpbmcgcmVzYW1wbGluZyBhcyB3ZWxsIGFzIGFzeW5jaHJvbm91cyByZXNhbXBsaW5nLgorI2RlZmluZSBBVURJT19QUk9DRVNTSU5HX01VU0lDX1JBVEUgNDAwMDAKKworc3RhdGljIGlubGluZSBib29sIGlzTXVzaWNSYXRlKHVpbnQzMl90IHNhbXBsZVJhdGUpIHsKKyAgICByZXR1cm4gc2FtcGxlUmF0ZSA+PSBBVURJT19QUk9DRVNTSU5HX01VU0lDX1JBVEU7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKICNlbmRpZiAvLyBBTkRST0lEX0FVRElPX1JFU0FNUExFUl9QVUJMSUNfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCmluZGV4IDg0M2EzNTQuLjA2MTE2YTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Jb0Rlc2NyaXB0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgpAQCAtMjksNiArMzAsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiB0eXBlZGVmIHZvaWQgKCphdWRpb19lcnJvcl9jYWxsYmFjaykoc3RhdHVzX3QgZXJyKTsKK3R5cGVkZWYgdm9pZCAoKmR5bmFtaWNfcG9saWN5X2NhbGxiYWNrKShpbnQgZXZlbnQsIFN0cmluZzggcmVnSWQsIGludCB2YWwpOwogCiBjbGFzcyBJQXVkaW9GbGluZ2VyOwogY2xhc3MgSUF1ZGlvUG9saWN5U2VydmljZTsKQEAgLTg5LDYgKzkxLDcgQEAKICAgICBzdGF0aWMgU3RyaW5nOCAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKIAogICAgIHN0YXRpYyB2b2lkIHNldEVycm9yQ2FsbGJhY2soYXVkaW9fZXJyb3JfY2FsbGJhY2sgY2IpOworICAgIHN0YXRpYyB2b2lkIHNldER5blBvbGljeUNhbGxiYWNrKGR5bmFtaWNfcG9saWN5X2NhbGxiYWNrIGNiKTsKIAogICAgIC8vIGhlbHBlciBmdW5jdGlvbiB0byBvYnRhaW4gQXVkaW9GbGluZ2VyIHNlcnZpY2UgaGFuZGxlCiAgICAgc3RhdGljIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+IGdldF9hdWRpb19mbGluZ2VyKCk7CkBAIC05OCwxMCArMTAxLDEzIEBACiAKICAgICAvLyBSZXR1cm5lZCBzYW1wbGluZ1JhdGUgYW5kIGZyYW1lQ291bnQgb3V0cHV0IHZhbHVlcyBhcmUgZ3VhcmFudGVlZAogICAgIC8vIHRvIGJlIG5vbi16ZXJvIGlmIHN0YXR1cyA9PSBOT19FUlJPUgorICAgIC8vIEZJWE1FIFRoaXMgQVBJIGFzc3VtZXMgYSByb3V0ZSwgYW5kIHNvIHNob3VsZCBiZSBkZXByZWNhdGVkLgogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRPdXRwdXRTYW1wbGluZ1JhdGUodWludDMyX3QqIHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKyAgICAvLyBGSVhNRSBUaGlzIEFQSSBhc3N1bWVzIGEgcm91dGUsIGFuZCBzbyBzaG91bGQgYmUgZGVwcmVjYXRlZC4KICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0T3V0cHV0RnJhbWVDb3VudChzaXplX3QqIGZyYW1lQ291bnQsCiAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisgICAgLy8gRklYTUUgVGhpcyBBUEkgYXNzdW1lcyBhIHJvdXRlLCBhbmQgc28gc2hvdWxkIGJlIGRlcHJlY2F0ZWQuCiAgICAgc3RhdGljIHN0YXR1c190IGdldE91dHB1dExhdGVuY3kodWludDMyX3QqIGxhdGVuY3ksCiAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CiAgICAgc3RhdGljIHN0YXR1c190IGdldFNhbXBsaW5nUmF0ZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCkBAIC0xMTAsMTkgKzExNiwyMCBAQAogICAgIC8vIGF1ZGlvX3N0cmVhbS0+Z2V0X2J1ZmZlcl9zaXplKCkvYXVkaW9fc3RyZWFtX291dF9mcmFtZV9zaXplKCkKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0RnJhbWVDb3VudChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBmcmFtZUNvdW50KTsKLSAgICAvLyByZXR1cm5zIHRoZSBhdWRpbyBvdXRwdXQgc3RyZWFtIGxhdGVuY3kgaW4gbXMuIENvcnJlc3BvbmRzIHRvCisgICAgLy8gcmV0dXJucyB0aGUgYXVkaW8gb3V0cHV0IGxhdGVuY3kgaW4gbXMuIENvcnJlc3BvbmRzIHRvCiAgICAgLy8gYXVkaW9fc3RyZWFtX291dC0+Z2V0X2xhdGVuY3koKQogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRMYXRlbmN5KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogbGF0ZW5jeSk7CiAKICAgICAvLyByZXR1cm4gc3RhdHVzIE5PX0VSUk9SIGltcGxpZXMgKmJ1ZmZTaXplID4gMAorICAgIC8vIEZJWE1FIFRoaXMgQVBJIGFzc3VtZXMgYSByb3V0ZSwgYW5kIHNvIHNob3VsZCBkZXByZWNhdGVkLgogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclNpemUodWludDMyX3Qgc2FtcGxlUmF0ZSwgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgc2l6ZV90KiBidWZmU2l6ZSk7CiAKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKTsKIAogICAgIC8vIHJldHVybiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3cml0dGVuIGJ5IEF1ZGlvRmxpbmdlciB0byBhdWRpbyBIQUwgYW5kCi0gICAgLy8gYXVkaW8gZHNwIHRvIERBQyBzaW5jZSB0aGUgc3BlY2lmaWVkIG91dHB1dCBJL08gaGFuZGxlIGhhcyBleGl0ZWQgc3RhbmRieS4KKyAgICAvLyBhdWRpbyBkc3AgdG8gREFDIHNpbmNlIHRoZSBzcGVjaWZpZWQgb3V0cHV0IGhhcyBleGl0ZWQgc3RhbmRieS4KICAgICAvLyByZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKICAgICAvLyAtIE5PX0VSUk9SOiBzdWNjZXNzZnVsIG9wZXJhdGlvbiwgaGFsRnJhbWVzIGFuZCBkc3BGcmFtZXMgcG9pbnQgdG8gdmFsaWQgZGF0YQogICAgIC8vIC0gSU5WQUxJRF9PUEVSQVRJT046IE5vdCBzdXBwb3J0ZWQgb24gY3VycmVudCBoYXJkd2FyZSBwbGF0Zm9ybQpAQCAtMTUxLDMyICsxNTgsOCBAQAogICAgIC8vIG9yIG5vIEhXIHN5bmMgc291cmNlIGlzIHVzZWQuCiAgICAgc3RhdGljIGF1ZGlvX2h3X3N5bmNfdCBnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCk7CiAKLSAgICAvLyB0eXBlcyBvZiBpbyBjb25maWd1cmF0aW9uIGNoYW5nZSBldmVudHMgcmVjZWl2ZWQgd2l0aCBpb0NvbmZpZ0NoYW5nZWQoKQotICAgIGVudW0gaW9fY29uZmlnX2V2ZW50IHsKLSAgICAgICAgT1VUUFVUX09QRU5FRCwKLSAgICAgICAgT1VUUFVUX0NMT1NFRCwKLSAgICAgICAgT1VUUFVUX0NPTkZJR19DSEFOR0VELAotICAgICAgICBJTlBVVF9PUEVORUQsCi0gICAgICAgIElOUFVUX0NMT1NFRCwKLSAgICAgICAgSU5QVVRfQ09ORklHX0NIQU5HRUQsCi0gICAgICAgIFNUUkVBTV9DT05GSUdfQ0hBTkdFRCwKLSAgICAgICAgTlVNX0NPTkZJR19FVkVOVFMKLSAgICB9OwotCi0gICAgLy8gYXVkaW8gb3V0cHV0IGRlc2NyaXB0b3IgdXNlZCB0byBjYWNoZSBvdXRwdXQgY29uZmlndXJhdGlvbnMgaW4gY2xpZW50IHByb2Nlc3MgdG8gYXZvaWQKLSAgICAvLyBmcmVxdWVudCBjYWxscyB0aHJvdWdoIElBdWRpb0ZsaW5nZXIKLSAgICBjbGFzcyBPdXRwdXREZXNjcmlwdG9yIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIE91dHB1dERlc2NyaXB0b3IoKQotICAgICAgICA6IHNhbXBsaW5nUmF0ZSgwKSwgZm9ybWF0KEFVRElPX0ZPUk1BVF9ERUZBVUxUKSwgY2hhbm5lbE1hc2soMCksIGZyYW1lQ291bnQoMCksIGxhdGVuY3koMCkKLSAgICAgICAgICAgIHt9Ci0KLSAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlOwotICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQ7Ci0gICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrOwotICAgICAgICBzaXplX3QgZnJhbWVDb3VudDsKLSAgICAgICAgdWludDMyX3QgbGF0ZW5jeTsKLSAgICB9OworICAgIC8vIEluZGljYXRlIEpBVkEgc2VydmljZXMgYXJlIHJlYWR5IChzY2hlZHVsaW5nLCBwb3dlciBtYW5hZ2VtZW50IC4uLikKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc3lzdGVtUmVhZHkoKTsKIAogICAgIC8vIEV2ZW50cyB1c2VkIHRvIHN5bmNocm9uaXplIGFjdGlvbnMgYmV0d2VlbiBhdWRpbyBzZXNzaW9ucy4KICAgICAvLyBGb3IgaW5zdGFuY2UgU1lOQ19FVkVOVF9QUkVTRU5UQVRJT05fQ09NUExFVEUgY2FuIGJlIHVzZWQgdG8gZGVsYXkgcmVjb3JkaW5nIHN0YXJ0IHVudGlsCkBAIC0yMDEsNyArMTg0LDcgQEAKICAgICAvLyBJQXVkaW9Qb2xpY3lTZXJ2aWNlIGludGVyZmFjZSAoc2VlIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGZvciBtZXRob2QgZGVzY3JpcHRpb25zKQogICAgIC8vCiAgICAgc3RhdGljIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpOwogICAgIHN0YXRpYyBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSk7CkBAIC0yMTcsMTQgKzIwMCwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCk7CiAgICAgc3RhdGljIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKQEAgLTI0MCwxMCArMjI1LDEyIEBACiAgICAgc3RhdGljIHN0YXR1c190IGdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CiAKICAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CkBAIC0zMjcsNiArMzE0LDEyIEBACiAKICAgICBzdGF0aWMgc3RhdHVzX3QgcmVnaXN0ZXJQb2xpY3lNaXhlcyhWZWN0b3I8QXVkaW9NaXg+IG1peGVzLCBib29sIHJlZ2lzdHJhdGlvbik7CiAKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaGFuZGxlKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSk7CisKKwogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogICAgIGNsYXNzIEF1ZGlvUG9ydENhbGxiYWNrIDogcHVibGljIFJlZkJhc2UKQEAgLTM0MiwxNiArMzM1LDQyIEBACiAKICAgICB9OwogCi0gICAgc3RhdGljIHZvaWQgc2V0QXVkaW9Qb3J0Q2FsbGJhY2soc3A8QXVkaW9Qb3J0Q2FsbGJhY2s+IGNhbGxCYWNrKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgYWRkQXVkaW9Qb3J0Q2FsbGJhY2soY29uc3Qgc3A8QXVkaW9Qb3J0Q2FsbGJhY2s+JiBjYWxsYmFjayk7CisgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZUF1ZGlvUG9ydENhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvUG9ydENhbGxiYWNrPiYgY2FsbGJhY2spOworCisgICAgY2xhc3MgQXVkaW9EZXZpY2VDYWxsYmFjayA6IHB1YmxpYyBSZWZCYXNlCisgICAgeworICAgIHB1YmxpYzoKKworICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlQ2FsbGJhY2soKSB7fQorICAgICAgICB2aXJ0dWFsIH5BdWRpb0RldmljZUNhbGxiYWNrKCkge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb0RldmljZVVwZGF0ZShhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSA9IDA7CisgICAgfTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCBzcDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9Jbyk7CisKKyAgICBzdGF0aWMgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXREZXZpY2VJZEZvcklvKGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pOwogCiBwcml2YXRlOgogCiAgICAgY2xhc3MgQXVkaW9GbGluZ2VyQ2xpZW50OiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQsIHB1YmxpYyBCbkF1ZGlvRmxpbmdlckNsaWVudAogICAgIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIEF1ZGlvRmxpbmdlckNsaWVudCgpIHsKKyAgICAgICAgQXVkaW9GbGluZ2VyQ2xpZW50KCkgOgorICAgICAgICAgICAgbUluQnVmZlNpemUoMCksIG1JblNhbXBsaW5nUmF0ZSgwKSwKKyAgICAgICAgICAgIG1JbkZvcm1hdChBVURJT19GT1JNQVRfREVGQVVMVCksIG1JbkNoYW5uZWxNYXNrKEFVRElPX0NIQU5ORUxfTk9ORSkgewogICAgICAgICB9CiAKKyAgICAgICAgdm9pZCBjbGVhcklvQ2FjaGUoKTsKKyAgICAgICAgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJTaXplKHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBzaXplX3QqIGJ1ZmZTaXplKTsKKyAgICAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGdldElvRGVzY3JpcHRvcihhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSk7CisKICAgICAgICAgLy8gRGVhdGhSZWNpcGllbnQKICAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7CiAKQEAgLTM1OSw3ICszNzgsMjcgQEAKIAogICAgICAgICAvLyBpbmRpY2F0ZSBhIGNoYW5nZSBpbiB0aGUgY29uZmlndXJhdGlvbiBvZiBhbiBvdXRwdXQgb3IgaW5wdXQ6IGtlZXBzIHRoZSBjYWNoZWQKICAgICAgICAgLy8gdmFsdWVzIGZvciBvdXRwdXQvaW5wdXQgcGFyYW1ldGVycyB1cC10by1kYXRlIGluIGNsaWVudCBwcm9jZXNzCi0gICAgICAgIHZpcnR1YWwgdm9pZCBpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3Qgdm9pZCAqcGFyYW0yKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+JiBpb0Rlc2MpOworCisKKyAgICAgICAgc3RhdHVzX3QgYWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCBzcDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pOworICAgICAgICBzdGF0dXNfdCByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKTsKKworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldERldmljZUlkRm9ySW8oYXVkaW9faW9faGFuZGxlX3QgYXVkaW9Jbyk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKKyAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gPiAgIG1Jb0Rlc2NyaXB0b3JzOworICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIFZlY3RvciA8IHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+ID4gPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzOworICAgICAgICAvLyBjYWNoZWQgdmFsdWVzIGZvciByZWNvcmRpbmcgZ2V0SW5wdXRCdWZmZXJTaXplKCkgcXVlcmllcworICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5CdWZmU2l6ZTsgICAgLy8gemVybyBpbmRpY2F0ZXMgY2FjaGUgaXMgaW52YWxpZAorICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5TYW1wbGluZ1JhdGU7CisgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgICAgICAgICAgICAgIG1JbkZvcm1hdDsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgICAgICAgICAgICAgICAgbUluQ2hhbm5lbE1hc2s7CiAgICAgfTsKIAogICAgIGNsYXNzIEF1ZGlvUG9saWN5U2VydmljZUNsaWVudDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50LApAQCAtMzY5LDI2ICs0MDgsMzUgQEAKICAgICAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50KCkgewogICAgICAgICB9CiAKKyAgICAgICAgaW50IGFkZEF1ZGlvUG9ydENhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvUG9ydENhbGxiYWNrPiYgY2FsbGJhY2spOworICAgICAgICBpbnQgcmVtb3ZlQXVkaW9Qb3J0Q2FsbGJhY2soY29uc3Qgc3A8QXVkaW9Qb3J0Q2FsbGJhY2s+JiBjYWxsYmFjayk7CisKICAgICAgICAgLy8gRGVhdGhSZWNpcGllbnQKICAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7CiAKICAgICAgICAgLy8gSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudAogICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOworICAgICAgICBWZWN0b3IgPHNwIDxBdWRpb1BvcnRDYWxsYmFjaz4gPiAgICBtQXVkaW9Qb3J0Q2FsbGJhY2tzOwogICAgIH07CiAKKyAgICBzdGF0aWMgY29uc3Qgc3A8QXVkaW9GbGluZ2VyQ2xpZW50PiBnZXRBdWRpb0ZsaW5nZXJDbGllbnQoKTsKKyAgICBzdGF0aWMgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGdldElvRGVzY3JpcHRvcihhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSk7CisKICAgICBzdGF0aWMgc3A8QXVkaW9GbGluZ2VyQ2xpZW50PiBnQXVkaW9GbGluZ2VyQ2xpZW50OwogICAgIHN0YXRpYyBzcDxBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+IGdBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ7CiAgICAgZnJpZW5kIGNsYXNzIEF1ZGlvRmxpbmdlckNsaWVudDsKICAgICBmcmllbmQgY2xhc3MgQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OwogCiAgICAgc3RhdGljIE11dGV4IGdMb2NrOyAgICAgIC8vIHByb3RlY3RzIGdBdWRpb0ZsaW5nZXIgYW5kIGdBdWRpb0Vycm9yQ2FsbGJhY2ssCi0gICAgc3RhdGljIE11dGV4IGdMb2NrQ2FjaGU7IC8vIHByb3RlY3RzIGdPdXRwdXRzLCBnUHJldkluU2FtcGxpbmdSYXRlLCBnUHJldkluRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnUHJldkluQ2hhbm5lbE1hc2sgYW5kIGdJbkJ1ZmZTaXplCiAgICAgc3RhdGljIE11dGV4IGdMb2NrQVBTOyAgIC8vIHByb3RlY3RzIGdBdWRpb1BvbGljeVNlcnZpY2UgYW5kIGdBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQKLSAgICBzdGF0aWMgTXV0ZXggZ0xvY2tBUEM7ICAgLy8gcHJvdGVjdHMgZ0F1ZGlvUG9ydENhbGxiYWNrCiAgICAgc3RhdGljIHNwPElBdWRpb0ZsaW5nZXI+IGdBdWRpb0ZsaW5nZXI7CiAgICAgc3RhdGljIGF1ZGlvX2Vycm9yX2NhbGxiYWNrIGdBdWRpb0Vycm9yQ2FsbGJhY2s7CisgICAgc3RhdGljIGR5bmFtaWNfcG9saWN5X2NhbGxiYWNrIGdEeW5Qb2xpY3lDYWxsYmFjazsKIAogICAgIHN0YXRpYyBzaXplX3QgZ0luQnVmZlNpemU7CiAgICAgLy8gcHJldmlvdXMgcGFyYW1ldGVycyBmb3IgcmVjb3JkaW5nIGJ1ZmZlciBzaXplIHF1ZXJpZXMKQEAgLTM5NywxMiArNDQ1LDYgQEAKICAgICBzdGF0aWMgYXVkaW9fY2hhbm5lbF9tYXNrX3QgZ1ByZXZJbkNoYW5uZWxNYXNrOwogCiAgICAgc3RhdGljIHNwPElBdWRpb1BvbGljeVNlcnZpY2U+IGdBdWRpb1BvbGljeVNlcnZpY2U7Ci0KLSAgICAvLyBsaXN0IG9mIG91dHB1dCBkZXNjcmlwdG9ycyBjb250YWluaW5nIGNhY2hlZCBwYXJhbWV0ZXJzCi0gICAgLy8gKHNhbXBsaW5nIHJhdGUsIGZyYW1lY291bnQsIGNoYW5uZWwgY291bnQuLi4pCi0gICAgc3RhdGljIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgT3V0cHV0RGVzY3JpcHRvciAqPiBnT3V0cHV0czsKLQotICAgIHN0YXRpYyBzcDxBdWRpb1BvcnRDYWxsYmFjaz4gZ0F1ZGlvUG9ydENhbGxiYWNrOwogfTsKIAogfTsgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCmluZGV4IGZkNTFiOGYuLmUwMmYxYjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RpbWVzdGFtcC5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1RyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTQyLDI4ICs0MywzOCBAQAogICAgICAqLwogICAgIGVudW0gZXZlbnRfdHlwZSB7CiAgICAgICAgIEVWRU5UX01PUkVfREFUQSA9IDAsICAgICAgICAvLyBSZXF1ZXN0IHRvIHdyaXRlIG1vcmUgZGF0YSB0byBidWZmZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGV2ZW50IG9ubHkgb2NjdXJzIGZvciBUUkFOU0ZFUl9DQUxMQkFDSy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgZXZlbnQgaXMgZGVsaXZlcmVkIGJ1dCB0aGUgY2FsbGJhY2sgaGFuZGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lcyBub3Qgd2FudCB0byB3cml0ZSBtb3JlIGRhdGEsIHRoZSBoYW5kbGVyIG11c3QgZXhwbGljaXRseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lcyBub3Qgd2FudCB0byB3cml0ZSBtb3JlIGRhdGEsIHRoZSBoYW5kbGVyIG11c3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgZXZlbnQgYnkgc2V0dGluZyBmcmFtZUNvdW50IHRvIHplcm8uCi0gICAgICAgIEVWRU5UX1VOREVSUlVOID0gMSwgICAgICAgICAvLyBCdWZmZXIgdW5kZXJydW4gb2NjdXJyZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG1pZ2h0IG9jY3VyLCBmb3IgZXhhbXBsZSwgaWYgdGhlIGFwcGxpY2F0aW9uIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0aW5nIGZvciBzb3VyY2UgZGF0YSBvciBpcyBhdCB0aGUgZW5kIG9mIHN0cmVhbS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZGF0YSBmaWxsaW5nLCBpdCBpcyBwcmVmZXJyZWQgdGhhdCB0aGUgY2FsbGJhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgbm90IGJsb2NrIGFuZCBpbnN0ZWFkIHJldHVybnMgYSBzaG9ydCBjb3VudCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFtb3VudCBvZiBkYXRhIGFjdHVhbGx5IGRlbGl2ZXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKG9yIDAsIGlmIG5vIGRhdGEgaXMgY3VycmVudGx5IGF2YWlsYWJsZSkuCisgICAgICAgIEVWRU5UX1VOREVSUlVOID0gMSwgICAgICAgICAvLyBCdWZmZXIgdW5kZXJydW4gb2NjdXJyZWQuIFRoaXMgd2lsbCBub3Qgb2NjdXIgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0aWMgdHJhY2tzLgogICAgICAgICBFVkVOVF9MT09QX0VORCA9IDIsICAgICAgICAgLy8gU2FtcGxlIGxvb3AgZW5kIHdhcyByZWFjaGVkOyBwbGF5YmFjayByZXN0YXJ0ZWQgZnJvbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9vcCBzdGFydCBpZiBsb29wIGNvdW50IHdhcyBub3QgMC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb3Agc3RhcnQgaWYgbG9vcCBjb3VudCB3YXMgbm90IDAgZm9yIGEgc3RhdGljIHRyYWNrLgogICAgICAgICBFVkVOVF9NQVJLRVIgPSAzLCAgICAgICAgICAgLy8gUGxheWJhY2sgaGVhZCBpcyBhdCB0aGUgc3BlY2lmaWVkIG1hcmtlciBwb3NpdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKFNlZSBzZXRNYXJrZXJQb3NpdGlvbigpKS4KICAgICAgICAgRVZFTlRfTkVXX1BPUyA9IDQsICAgICAgICAgIC8vIFBsYXliYWNrIGhlYWQgaXMgYXQgYSBuZXcgcG9zaXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChTZWUgc2V0UG9zaXRpb25VcGRhdGVQZXJpb2QoKSkuCi0gICAgICAgIEVWRU5UX0JVRkZFUl9FTkQgPSA1LCAgICAgICAvLyBQbGF5YmFjayBoZWFkIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdCBjdXJyZW50bHkgdXNlZCBieSBhbmRyb2lkLm1lZGlhLkF1ZGlvVHJhY2suCisgICAgICAgIEVWRU5UX0JVRkZFUl9FTkQgPSA1LCAgICAgICAvLyBQbGF5YmFjayBoYXMgY29tcGxldGVkIGZvciBhIHN0YXRpYyB0cmFjay4KICAgICAgICAgRVZFTlRfTkVXX0lBVURJT1RSQUNLID0gNiwgIC8vIElBdWRpb1RyYWNrIHdhcyByZS1jcmVhdGVkLCBlaXRoZXIgZHVlIHRvIHJlLXJvdXRpbmcgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2b2x1bnRhcnkgaW52YWxpZGF0aW9uIGJ5IG1lZGlhc2VydmVyLCBvciBtZWRpYXNlcnZlciBjcmFzaC4KICAgICAgICAgRVZFTlRfU1RSRUFNX0VORCA9IDcsICAgICAgIC8vIFNlbnQgYWZ0ZXIgYWxsIHRoZSBidWZmZXJzIHF1ZXVlZCBpbiBBRiBhbmQgSFcgYXJlIHBsYXllZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFjayAoYWZ0ZXIgc3RvcCBpcyBjYWxsZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrIChhZnRlciBzdG9wIGlzIGNhbGxlZCkgZm9yIGFuIG9mZmxvYWRlZCB0cmFjay4KKyNpZiAwICAgLy8gRklYTUUgbm90IHlldCBpbXBsZW1lbnRlZAogICAgICAgICBFVkVOVF9ORVdfVElNRVNUQU1QID0gOCwgICAgLy8gRGVsaXZlcmVkIHBlcmlvZGljYWxseSBhbmQgd2hlbiB0aGVyZSdzIGEgc2lnbmlmaWNhbnQgY2hhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgbWFwcGluZyBmcm9tIGZyYW1lIHBvc2l0aW9uIHRvIHByZXNlbnRhdGlvbiB0aW1lLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlIEF1ZGlvVGltZXN0YW1wIGZvciB0aGUgaW5mb3JtYXRpb24gaW5jbHVkZWQgd2l0aCBldmVudC4KKyNlbmRpZgogICAgIH07CiAKLSAgICAvKiBDbGllbnQgc2hvdWxkIGRlY2xhcmUgQnVmZmVyIG9uIHRoZSBzdGFjayBhbmQgcGFzcyBhZGRyZXNzIHRvIG9idGFpbkJ1ZmZlcigpCisgICAgLyogQ2xpZW50IHNob3VsZCBkZWNsYXJlIGEgQnVmZmVyIGFuZCBwYXNzIHRoZSBhZGRyZXNzIHRvIG9idGFpbkJ1ZmZlcigpCiAgICAgICogYW5kIHJlbGVhc2VCdWZmZXIoKS4gIFNlZSBhbHNvIGNhbGxiYWNrX3QgZm9yIEVWRU5UX01PUkVfREFUQS4KICAgICAgKi8KIApAQCAtNzIsMjIgKzgzLDI2IEBACiAgICAgcHVibGljOgogICAgICAgICAvLyBGSVhNRSB1c2UgbSBwcmVmaXgKICAgICAgICAgc2l6ZV90ICAgICAgZnJhbWVDb3VudDsgICAvLyBudW1iZXIgb2Ygc2FtcGxlIGZyYW1lcyBjb3JyZXNwb25kaW5nIHRvIHNpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gaW5wdXQgaXQgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgZGVzaXJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBvdXRwdXQgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgYWN0dWFsbHkgZmlsbGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGN1cnJlbnRseSBpZ25vcmVkLCBidXQgd2lsbCBtYWtlIHRoZSBwcmltYXJ5IGZpZWxkIGluIGZ1dHVyZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBpbnB1dCB0byBvYnRhaW5CdWZmZXIoKSBpdCBpcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBkZXNpcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIG91dHB1dCBmcm9tIG9idGFpbkJ1ZmZlcigpIGl0IGlzIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgW2VtcHR5IHNsb3RzIGZvcl0gZnJhbWVzIHRvIGJlIGZpbGxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIGlucHV0IHRvIHJlbGVhc2VCdWZmZXIoKSBpdCBpcyBjdXJyZW50bHkgaWdub3JlZAogCiAgICAgICAgIHNpemVfdCAgICAgIHNpemU7ICAgICAgICAgLy8gaW5wdXQvb3V0cHV0IGluIGJ5dGVzID09IGZyYW1lQ291bnQgKiBmcmFtZVNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBpbnB1dCBpdCBpcyB1bnVzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBvdXRwdXQgaXMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSBmaWxsZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSB0aGlzIGlzIHJlZHVuZGFudCB3aXRoIHJlc3BlY3QgdG8gZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgVFJBTlNGRVJfT0JUQUlOIG1vZGUgaXMgYnJva2VuIGZvciA4LWJpdCBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2Ugd2UgZG9uJ3QgZGVmaW5lIHRoZSBmcmFtZSBmb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBpbnB1dCB0byBvYnRhaW5CdWZmZXIoKSBpdCBpcyBpZ25vcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gb3V0cHV0IGZyb20gb2J0YWluQnVmZmVyKCkgaXQgaXMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBbZW1wdHkgc2xvdHMgZm9yXSBieXRlcyB0byBiZSBmaWxsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgd2hpY2ggaXMgZnJhbWVDb3VudCAqIGZyYW1lU2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIGlucHV0IHRvIHJlbGVhc2VCdWZmZXIoKSBpdCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcmVsZWFzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIFRoaXMgaXMgcmVkdW5kYW50IHdpdGggcmVzcGVjdCB0byBmcmFtZUNvdW50LiAgQ29uc2lkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICByZW1vdmluZyBzaXplIGFuZCBtYWtpbmcgZnJhbWVDb3VudCB0aGUgcHJpbWFyeSBmaWVsZC4KIAogICAgICAgICB1bmlvbiB7CiAgICAgICAgICAgICB2b2lkKiAgICAgICByYXc7CiAgICAgICAgICAgICBzaG9ydCogICAgICBpMTY7ICAgICAgLy8gc2lnbmVkIDE2LWJpdAogICAgICAgICAgICAgaW50OF90KiAgICAgaTg7ICAgICAgIC8vIHVuc2lnbmVkIDgtYml0LCBvZmZzZXQgYnkgMHg4MAotICAgICAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0OiB1bnVzZWQsIG91dHB1dDogcG9pbnRlciB0byBidWZmZXIKKyAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCB0byBvYnRhaW5CdWZmZXIoKTogdW51c2VkLCBvdXRwdXQ6IHBvaW50ZXIgdG8gYnVmZmVyCiAgICAgfTsKIAogICAgIC8qIEFzIGEgY29udmVuaWVuY2UsIGlmIGEgY2FsbGJhY2sgaXMgc3VwcGxpZWQsIGEgaGFuZGxlciB0aHJlYWQKQEAgLTEyMSw2ICsxMzYsNyBAQAogICAgICAqICAtIEJBRF9WQUxVRTogdW5zdXBwb3J0ZWQgY29uZmlndXJhdGlvbgogICAgICAqIGZyYW1lQ291bnQgaXMgZ3VhcmFudGVlZCB0byBiZSBub24temVybyBpZiBzdGF0dXMgaXMgTk9fRVJST1IsCiAgICAgICogYW5kIGlzIHVuZGVmaW5lZCBvdGhlcndpc2UuCisgICAgICogRklYTUUgVGhpcyBBUEkgYXNzdW1lcyBhIHJvdXRlLCBhbmQgc28gc2hvdWxkIGJlIGRlcHJlY2F0ZWQuCiAgICAgICovCiAKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0TWluRnJhbWVDb3VudChzaXplX3QqIGZyYW1lQ291bnQsCkBAIC0xMzIsNyArMTQ4LDcgQEAKICAgICBlbnVtIHRyYW5zZmVyX3R5cGUgewogICAgICAgICBUUkFOU0ZFUl9ERUZBVUxULCAgIC8vIG5vdCBzcGVjaWZpZWQgZXhwbGljaXRseTsgZGV0ZXJtaW5lIGZyb20gdGhlIG90aGVyIHBhcmFtZXRlcnMKICAgICAgICAgVFJBTlNGRVJfQ0FMTEJBQ0ssICAvLyBjYWxsYmFjayBFVkVOVF9NT1JFX0RBVEEKLSAgICAgICAgVFJBTlNGRVJfT0JUQUlOLCAgICAvLyBGSVhNRSBkZXByZWNhdGVkOiBjYWxsIG9idGFpbkJ1ZmZlcigpIGFuZCByZWxlYXNlQnVmZmVyKCkKKyAgICAgICAgVFJBTlNGRVJfT0JUQUlOLCAgICAvLyBjYWxsIG9idGFpbkJ1ZmZlcigpIGFuZCByZWxlYXNlQnVmZmVyKCkKICAgICAgICAgVFJBTlNGRVJfU1lOQywgICAgICAvLyBzeW5jaHJvbm91cyB3cml0ZSgpCiAgICAgICAgIFRSQU5TRkVSX1NIQVJFRCwgICAgLy8gc2hhcmVkIG1lbW9yeQogICAgIH07CkBAIC0xNDUsMTggKzE2MSwxNSBAQAogICAgIC8qIENyZWF0ZXMgYW4gQXVkaW9UcmFjayBvYmplY3QgYW5kIHJlZ2lzdGVycyBpdCB3aXRoIEF1ZGlvRmxpbmdlci4KICAgICAgKiBPbmNlIGNyZWF0ZWQsIHRoZSB0cmFjayBuZWVkcyB0byBiZSBzdGFydGVkIGJlZm9yZSBpdCBjYW4gYmUgdXNlZC4KICAgICAgKiBVbnNwZWNpZmllZCB2YWx1ZXMgYXJlIHNldCB0byBhcHByb3ByaWF0ZSBkZWZhdWx0IHZhbHVlcy4KLSAgICAgKiBXaXRoIHRoaXMgY29uc3RydWN0b3IsIHRoZSB0cmFjayBpcyBjb25maWd1cmVkIGZvciBzdHJlYW1pbmcgbW9kZS4KLSAgICAgKiBEYXRhIHRvIGJlIHJlbmRlcmVkIGlzIHN1cHBsaWVkIGJ5IHdyaXRlKCkgb3IgYnkgdGhlIGNhbGxiYWNrIEVWRU5UX01PUkVfREFUQS4KLSAgICAgKiBJbnRlcm1peGluZyBhIGNvbWJpbmF0aW9uIG9mIHdyaXRlKCkgYW5kIG5vbi1pZ25vcmVkIEVWRU5UX01PUkVfREFUQSBpcyBub3QgYWxsb3dlZC4KICAgICAgKgogICAgICAqIFBhcmFtZXRlcnM6CiAgICAgICoKICAgICAgKiBzdHJlYW1UeXBlOiAgICAgICAgIFNlbGVjdCB0aGUgdHlwZSBvZiBhdWRpbyBzdHJlYW0gdGhpcyB0cmFjayBpcyBhdHRhY2hlZCB0bwogICAgICAqICAgICAgICAgICAgICAgICAgICAgKGUuZy4gQVVESU9fU1RSRUFNX01VU0lDKS4KICAgICAgKiBzYW1wbGVSYXRlOiAgICAgICAgIERhdGEgc291cmNlIHNhbXBsaW5nIHJhdGUgaW4gSHouCi0gICAgICogZm9ybWF0OiAgICAgICAgICAgICBBdWRpbyBmb3JtYXQuICBGb3IgbWl4ZWQgdHJhY2tzLCBhbnkgUENNIGZvcm1hdCBzdXBwb3J0ZWQgYnkgc2VydmVyIGlzIE9LCi0gICAgICogICAgICAgICAgICAgICAgICAgICBvciBBVURJT19GT1JNQVRfUENNXzhfQklUIHdoaWNoIGlzIGhhbmRsZWQgb24gY2xpZW50IHNpZGUuICBGb3IgZGlyZWN0Ci0gICAgICogICAgICAgICAgICAgICAgICAgICBhbmQgb2ZmbG9hZGVkIHRyYWNrcywgdGhlIHBvc3NpYmxlIGZvcm1hdChzKSBkZXBlbmRzIG9uIHRoZSBvdXRwdXQgc2luay4KKyAgICAgKiBmb3JtYXQ6ICAgICAgICAgICAgIEF1ZGlvIGZvcm1hdC4gRm9yIG1peGVkIHRyYWNrcywgYW55IFBDTSBmb3JtYXQgc3VwcG9ydGVkIGJ5IHNlcnZlciBpcyBPSy4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIEZvciBkaXJlY3QgYW5kIG9mZmxvYWRlZCB0cmFja3MsIHRoZSBwb3NzaWJsZSBmb3JtYXQocykgZGVwZW5kcyBvbiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBzaW5rLgogICAgICAqIGNoYW5uZWxNYXNrOiAgICAgICAgQ2hhbm5lbCBtYXNrLCBzdWNoIHRoYXQgYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spIGlzIHRydWUuCiAgICAgICogZnJhbWVDb3VudDogICAgICAgICBNaW5pbXVtIHNpemUgb2YgdHJhY2sgUENNIGJ1ZmZlciBpbiBmcmFtZXMuIFRoaXMgZGVmaW5lcyB0aGUKICAgICAgKiAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uJ3MgY29udHJpYnV0aW9uIHRvIHRoZQpAQCAtMTY1LDIwICsxNzgsMzIgQEAKICAgICAgKiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uICBaZXJvIG1lYW5zIHRvIHVzZSBhIGRlZmF1bHQgdmFsdWUuCiAgICAgICogZmxhZ3M6ICAgICAgICAgICAgICBTZWUgY29tbWVudHMgb24gYXVkaW9fb3V0cHV0X2ZsYWdzX3QgaW4gPHN5c3RlbS9hdWRpby5oPi4KICAgICAgKiBjYmY6ICAgICAgICAgICAgICAgIENhbGxiYWNrIGZ1bmN0aW9uLiBJZiBub3QgbnVsbCwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgcGVyaW9kaWNhbGx5Ci0gICAgICogICAgICAgICAgICAgICAgICAgICB0byBwcm92aWRlIG5ldyBkYXRhIGFuZCBpbmZvcm0gb2YgbWFya2VyLCBwb3NpdGlvbiB1cGRhdGVzLCBldGMuCisgICAgICogICAgICAgICAgICAgICAgICAgICB0byBwcm92aWRlIG5ldyBkYXRhIGluIFRSQU5TRkVSX0NBTExCQUNLIG1vZGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIGFuZCBpbmZvcm0gb2YgbWFya2VyLCBwb3NpdGlvbiB1cGRhdGVzLCBldGMuCiAgICAgICogdXNlcjogICAgICAgICAgICAgICBDb250ZXh0IGZvciB1c2UgYnkgdGhlIGNhbGxiYWNrIHJlY2VpdmVyLgogICAgICAqIG5vdGlmaWNhdGlvbkZyYW1lczogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCBlYWNoIHRpbWUgbm90aWZpY2F0aW9uRnJhbWVzIFBDTQogICAgICAqICAgICAgICAgICAgICAgICAgICAgZnJhbWVzIGhhdmUgYmVlbiBjb25zdW1lZCBmcm9tIHRyYWNrIGlucHV0IGJ1ZmZlci4KICAgICAgKiAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgZXhwcmVzc2VkIGluIHVuaXRzIG9mIGZyYW1lcyBhdCB0aGUgaW5pdGlhbCBzb3VyY2Ugc2FtcGxlIHJhdGUuCiAgICAgICogc2Vzc2lvbklkOiAgICAgICAgICBTcGVjaWZpYyBzZXNzaW9uIElELCBvciB6ZXJvIHRvIHVzZSBkZWZhdWx0LgogICAgICAqIHRyYW5zZmVyVHlwZTogICAgICAgSG93IGRhdGEgaXMgdHJhbnNmZXJyZWQgdG8gQXVkaW9UcmFjay4KKyAgICAgKiBvZmZsb2FkSW5mbzogICAgICAgIElmIG5vdCBOVUxMLCBwcm92aWRlcyBvZmZsb2FkIHBhcmFtZXRlcnMgZm9yCisgICAgICogICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cigpLgorICAgICAqIHVpZDogICAgICAgICAgICAgICAgVXNlciBJRCBvZiB0aGUgYXBwIHdoaWNoIGluaXRpYWxseSByZXF1ZXN0ZWQgdGhpcyBBdWRpb1RyYWNrCisgICAgICogICAgICAgICAgICAgICAgICAgICBmb3IgcG93ZXIgbWFuYWdlbWVudCB0cmFja2luZywgb3IgLTEgZm9yIGN1cnJlbnQgdXNlciBJRC4KKyAgICAgKiBwaWQ6ICAgICAgICAgICAgICAgIFByb2Nlc3MgSUQgb2YgdGhlIGFwcCB3aGljaCBpbml0aWFsbHkgcmVxdWVzdGVkIHRoaXMgQXVkaW9UcmFjaworICAgICAqICAgICAgICAgICAgICAgICAgICAgZm9yIHBvd2VyIG1hbmFnZW1lbnQgdHJhY2tpbmcsIG9yIC0xIGZvciBjdXJyZW50IHByb2Nlc3MgSUQuCisgICAgICogcEF0dHJpYnV0ZXM6ICAgICAgICBJZiBub3QgTlVMTCwgc3VwZXJzZWRlcyBzdHJlYW1UeXBlIGZvciB1c2UgY2FzZSBzZWxlY3Rpb24uCisgICAgICogZG9Ob3RSZWNvbm5lY3Q6ICAgICBJZiBzZXQgdG8gdHJ1ZSwgQXVkaW9UcmFjayB3b24ndCBhdXRvbWF0aWNhbGx5IHJlY3JlYXRlIHRoZSBJQXVkaW9UcmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGVyIHRvIEF1ZGlvRmxpbmdlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0IHdpbGwgcmV0dXJuIGFuIGVycm9yIGluc3RlYWQuICBUaGUgYXBwbGljYXRpb24gd2lsbCByZWNyZWF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRyYWNrIGJhc2VkIG9uIG9mZmxvYWRpbmcgb3IgZGlmZmVyZW50IGNoYW5uZWwgY29uZmlndXJhdGlvbiwgZXRjLgogICAgICAqIHRocmVhZENhbkNhbGxKYXZhOiAgTm90IHByZXNlbnQgaW4gcGFyYW1ldGVyIGxpc3QsIGFuZCBzbyBpcyBmaXhlZCBhdCBmYWxzZS4KICAgICAgKi8KIAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjayggYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja190IGNiZiAgICAgICA9IE5VTEwsCkBAIC0xODksMTMgKzIxNCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQgPSAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvTm90UmVjb25uZWN0ID0gZmFsc2UpOwogCiAgICAgLyogQ3JlYXRlcyBhbiBhdWRpbyB0cmFjayBhbmQgcmVnaXN0ZXJzIGl0IHdpdGggQXVkaW9GbGluZ2VyLgogICAgICAqIFdpdGggdGhpcyBjb25zdHJ1Y3RvciwgdGhlIHRyYWNrIGlzIGNvbmZpZ3VyZWQgZm9yIHN0YXRpYyBidWZmZXIgbW9kZS4KLSAgICAgKiBUaGUgZm9ybWF0IG11c3Qgbm90IGJlIDgtYml0IGxpbmVhciBQQ00uCiAgICAgICogRGF0YSB0byBiZSByZW5kZXJlZCBpcyBwYXNzZWQgaW4gYSBzaGFyZWQgbWVtb3J5IGJ1ZmZlcgotICAgICAqIGlkZW50aWZpZWQgYnkgdGhlIGFyZ3VtZW50IHNoYXJlZEJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBub24tMC4KKyAgICAgKiBpZGVudGlmaWVkIGJ5IHRoZSBhcmd1bWVudCBzaGFyZWRCdWZmZXIsIHdoaWNoIHNob3VsZCBiZSBub24tMC4KKyAgICAgKiBJZiBzaGFyZWRCdWZmZXIgaXMgemVybywgdGhpcyBjb25zdHJ1Y3RvciBpcyBlcXVpdmFsZW50IHRvIHRoZSBwcmV2aW91cyBjb25zdHJ1Y3RvcgorICAgICAqIGJ1dCB3aXRob3V0IHRoZSBhYmlsaXR5IHRvIHNwZWNpZnkgYSBub24temVybyB2YWx1ZSBmb3IgdGhlIGZyYW1lQ291bnQgcGFyYW1ldGVyLgogICAgICAqIFRoZSBtZW1vcnkgc2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIHRoZSBkZXNpcmVkIGRhdGEgYmVmb3JlIGNhbGxpbmcgc3RhcnQoKS4KICAgICAgKiBUaGUgd3JpdGUoKSBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGNhc2UuCiAgICAgICogSXQgaXMgcmVjb21tZW5kZWQgdG8gcGFzcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIG5vdGlmaWVkIG9mIHBsYXliYWNrIGVuZCBieSBhbgpAQCAtMjE2LDcgKzI0Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVpZCA9IC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkID0gLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QgPSBmYWxzZSk7CiAKICAgICAvKiBUZXJtaW5hdGVzIHRoZSBBdWRpb1RyYWNrIGFuZCB1bnJlZ2lzdGVycyBpdCBmcm9tIEF1ZGlvRmxpbmdlci4KICAgICAgKiBBbHNvIGRlc3Ryb3lzIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBBdWRpb1RyYWNrLgpAQCAtMjI3LDYgKzI1NSw3IEBACiAKICAgICAvKiBJbml0aWFsaXplIGFuIEF1ZGlvVHJhY2sgdGhhdCB3YXMgY3JlYXRlZCB1c2luZyB0aGUgQXVkaW9UcmFjaygpIGNvbnN0cnVjdG9yLgogICAgICAqIERvbid0IGNhbGwgc2V0KCkgbW9yZSB0aGFuIG9uY2UsIG9yIGFmdGVyIHRoZSBBdWRpb1RyYWNrKCkgY29uc3RydWN0b3JzIHRoYXQgdGFrZSBwYXJhbWV0ZXJzLgorICAgICAqIHNldCgpIGlzIG5vdCBtdWx0aS10aHJlYWQgc2FmZS4KICAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKICAgICAgKiAgLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbgogICAgICAqICAtIElOVkFMSURfT1BFUkFUSU9OOiBBdWRpb1RyYWNrIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQKQEAgLTI1OSw3ICsyODgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVpZCA9IC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvTm90UmVjb25uZWN0ID0gZmFsc2UpOwogCiAgICAgLyogUmVzdWx0IG9mIGNvbnN0cnVjdGluZyB0aGUgQXVkaW9UcmFjay4gVGhpcyBtdXN0IGJlIGNoZWNrZWQgZm9yIHN1Y2Nlc3NmdWwgaW5pdGlhbGl6YXRpb24KICAgICAgKiBiZWZvcmUgdXNpbmcgYW55IEF1ZGlvVHJhY2sgQVBJIChleGNlcHQgZm9yIHNldCgpKSwgYmVjYXVzZSB1c2luZwpAQCAtMzQ3LDYgKzM3NywyNiBAQAogICAgIC8qIFJldHVybiBjdXJyZW50IHNvdXJjZSBzYW1wbGUgcmF0ZSBpbiBIeiAqLwogICAgICAgICAgICAgdWludDMyX3QgICAgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0OwogCisgICAgLyogUmV0dXJuIHRoZSBvcmlnaW5hbCBzb3VyY2Ugc2FtcGxlIHJhdGUgaW4gSHouIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIHNhbXBsZSByYXRlCisgICAgICogaWYgcGxheWJhY2sgcmF0ZSBoYWQgbm9ybWFsIHNwZWVkIGFuZCBwaXRjaC4KKyAgICAgKi8KKyAgICAgICAgICAgIHVpbnQzMl90ICAgIGdldE9yaWdpbmFsU2FtcGxlUmF0ZSgpIGNvbnN0OworCisgICAgLyogU2V0IHNvdXJjZSBwbGF5YmFjayByYXRlIGZvciB0aW1lc3RyZXRjaAorICAgICAqIDEuMCBpcyBub3JtYWwgc3BlZWQ6IDwgMS4wIGlzIHNsb3dlciwgPiAxLjAgaXMgZmFzdGVyCisgICAgICogMS4wIGlzIG5vcm1hbCBwaXRjaDogPCAxLjAgaXMgbG93ZXIgcGl0Y2gsID4gMS4wIGlzIGhpZ2hlciBwaXRjaAorICAgICAqCisgICAgICogQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUlOIDw9IHNwZWVkIDw9IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01BWAorICAgICAqIEFVRElPX1RJTUVTVFJFVENIX1BJVENIX01JTiA8PSBwaXRjaCA8PSBBVURJT19USU1FU1RSRVRDSF9QSVRDSF9NQVgKKyAgICAgKgorICAgICAqIFNwZWVkIGluY3JlYXNlcyB0aGUgcGxheWJhY2sgcmF0ZSBvZiBtZWRpYSwgYnV0IGRvZXMgbm90IGFsdGVyIHBpdGNoLgorICAgICAqIFBpdGNoIGluY3JlYXNlcyB0aGUgInRvbmFsIGZyZXF1ZW5jeSIgb2YgbWVkaWEsIGJ1dCBkb2VzIG5vdCBhZmZlY3QgdGhlIHBsYXliYWNrIHJhdGUuCisgICAgICovCisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSk7CisKKyAgICAvKiBSZXR1cm4gY3VycmVudCBwbGF5YmFjayByYXRlICovCisgICAgICAgICAgICBjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgZ2V0UGxheWJhY2tSYXRlKCkgY29uc3Q7CisKICAgICAvKiBFbmFibGVzIGxvb3BpbmcgYW5kIHNldHMgdGhlIHN0YXJ0IGFuZCBlbmQgcG9pbnRzIG9mIGxvb3BpbmcuCiAgICAgICogT25seSBzdXBwb3J0ZWQgZm9yIHN0YXRpYyBidWZmZXIgbW9kZS4KICAgICAgKgpAQCAtNDYxLDcgKzUxMSwzOCBAQAogICAgICAqICBoYW5kbGUgb24gYXVkaW8gaGFyZHdhcmUgb3V0cHV0LCBvciBBVURJT19JT19IQU5ETEVfTk9ORSBpZiB0aGUKICAgICAgKiAgdHJhY2sgbmVlZGVkIHRvIGJlIHJlLWNyZWF0ZWQgYnV0IHRoYXQgZmFpbGVkCiAgICAgICovCitwcml2YXRlOgogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgICAgZ2V0T3V0cHV0KCkgY29uc3Q7CitwdWJsaWM6CisKKyAgICAvKiBTZWxlY3RzIHRoZSBhdWRpbyBkZXZpY2UgdG8gdXNlIGZvciBvdXRwdXQgb2YgdGhpcyBBdWRpb1RyYWNrLiBBIHZhbHVlIG9mCisgICAgICogQVVESU9fUE9SVF9IQU5ETEVfTk9ORSBpbmRpY2F0ZXMgZGVmYXVsdCAoQXVkaW9Qb2xpY3lNYW5hZ2VyKSByb3V0aW5nLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgVGhlIGRldmljZSBJRCBvZiB0aGUgc2VsZWN0ZWQgZGV2aWNlIChhcyByZXR1cm5lZCBieSB0aGUgQXVkaW9EZXZpY2VzTWFuYWdlciBBUEkpLgorICAgICAqCisgICAgICogUmV0dXJuZWQgdmFsdWU6CisgICAgICogIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uCisgICAgICogICAgVE9ETzogd2hhdCBlbHNlIGNhbiBoYXBwZW4gaGVyZT8KKyAgICAgKi8KKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKKworICAgIC8qIFJldHVybnMgdGhlIElEIG9mIHRoZSBhdWRpbyBkZXZpY2Ugc2VsZWN0ZWQgZm9yIHRoaXMgQXVkaW9UcmFjay4KKyAgICAgKiBBIHZhbHVlIG9mIEFVRElPX1BPUlRfSEFORExFX05PTkUgaW5kaWNhdGVzIGRlZmF1bHQgKEF1ZGlvUG9saWN5TWFuYWdlcikgcm91dGluZy4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogIG5vbmUuCisgICAgICovCisgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0T3V0cHV0RGV2aWNlKCk7CisKKyAgICAgLyogUmV0dXJucyB0aGUgSUQgb2YgdGhlIGF1ZGlvIGRldmljZSBhY3R1YWxseSB1c2VkIGJ5IHRoZSBvdXRwdXQgdG8gd2hpY2ggdGhpcyBBdWRpb1RyYWNrIGlzCisgICAgICAqIGF0dGFjaGVkLgorICAgICAgKiBBIHZhbHVlIG9mIEFVRElPX1BPUlRfSEFORExFX05PTkUgaW5kaWNhdGVzIHRoZSBhdWRpbyB0cmFjayBpcyBub3QgYXR0YWNoZWQgdG8gYW55IG91dHB1dC4KKyAgICAgICoKKyAgICAgICogUGFyYW1ldGVyczoKKyAgICAgICogIG5vbmUuCisgICAgICAqLworICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldFJvdXRlZERldmljZUlkKCk7CiAKICAgICAvKiBSZXR1cm5zIHRoZSB1bmlxdWUgc2Vzc2lvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFjay4KICAgICAgKgpAQCAtNDg3LDEwICs1NjgsMTggQEAKICAgICAgKi8KICAgICAgICAgICAgIHN0YXR1c190ICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpOwogCi0gICAgLyogT2J0YWlucyBhIGJ1ZmZlciBvZiB1cCB0byAiYXVkaW9CdWZmZXItPmZyYW1lQ291bnQiIGVtcHR5IHNsb3RzIGZvciBmcmFtZXMuCisgICAgLyogUHVibGljIEFQSSBmb3IgVFJBTlNGRVJfT0JUQUlOIG1vZGUuCisgICAgICogT2J0YWlucyBhIGJ1ZmZlciBvZiB1cCB0byAiYXVkaW9CdWZmZXItPmZyYW1lQ291bnQiIGVtcHR5IHNsb3RzIGZvciBmcmFtZXMuCiAgICAgICogQWZ0ZXIgZmlsbGluZyB0aGVzZSBzbG90cyB3aXRoIGRhdGEsIHRoZSBjYWxsZXIgc2hvdWxkIHJlbGVhc2UgdGhlbSB3aXRoIHJlbGVhc2VCdWZmZXIoKS4KICAgICAgKiBJZiB0aGUgdHJhY2sgYnVmZmVyIGlzIG5vdCBmdWxsLCBvYnRhaW5CdWZmZXIoKSByZXR1cm5zIGFzIG1hbnkgY29udGlndW91cwogICAgICAqIFtlbXB0eSBzbG90cyBmb3JdIGZyYW1lcyBhcyBhcmUgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LgorICAgICAqCisgICAgICogSWYgbm9uQ29udGlnIGlzIG5vbi1OVUxMLCBpdCBpcyBhbiBvdXRwdXQgcGFyYW1ldGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gdGhlIG51bWJlciBvZgorICAgICAqIGFkZGl0aW9uYWwgbm9uLWNvbnRpZ3VvdXMgZnJhbWVzIHRoYXQgYXJlIHByZWRpY3RlZCB0byBiZSBhdmFpbGFibGUgaW1tZWRpYXRlbHksCisgICAgICogaWYgdGhlIGNsaWVudCB3ZXJlIHRvIHJlbGVhc2UgdGhlIGZpcnN0IGZyYW1lcyBhbmQgdGhlbiBjYWxsIG9idGFpbkJ1ZmZlcigpIGFnYWluLgorICAgICAqIFRoaXMgdmFsdWUgaXMgb25seSBhIHByZWRpY3Rpb24sIGFuZCBuZWVkcyB0byBiZSBjb25maXJtZWQuCisgICAgICogSXQgd2lsbCBiZSBzZXQgdG8gemVybyBmb3IgYW4gZXJyb3IgcmV0dXJuLgorICAgICAqCiAgICAgICogSWYgdGhlIHRyYWNrIGJ1ZmZlciBpcyBmdWxsIGFuZCB0cmFjayBpcyBzdG9wcGVkLCBvYnRhaW5CdWZmZXIoKSByZXR1cm5zIFdPVUxEX0JMT0NLCiAgICAgICogcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2Ygd2FpdENvdW50LgogICAgICAqIElmIHRoZSB0cmFjayBidWZmZXIgaXMgZnVsbCBhbmQgdHJhY2sgaXMgbm90IHN0b3BwZWQsIG9idGFpbkJ1ZmZlcigpIGJsb2NrcyB3aXRoIGEKQEAgLTQ5OSwxMCArNTg4LDYgQEAKICAgICAgKiBpcyBleGhhdXN0ZWQsIGF0IHdoaWNoIHBvaW50IG9idGFpbkJ1ZmZlcigpIHdpbGwgZWl0aGVyIGJsb2NrCiAgICAgICogb3IgcmV0dXJuIFdPVUxEX0JMT0NLIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgdGhlICJ3YWl0Q291bnQiCiAgICAgICogcGFyYW1ldGVyLgotICAgICAqIEVhY2ggc2FtcGxlIGlzIDE2LWJpdCBzaWduZWQgUENNLgotICAgICAqCi0gICAgICogb2J0YWluQnVmZmVyKCkgYW5kIHJlbGVhc2VCdWZmZXIoKSBhcmUgZGVwcmVjYXRlZCBmb3IgZGlyZWN0IHVzZSBieSBhcHBsaWNhdGlvbnMsCi0gICAgICogd2hpY2ggc2hvdWxkIHVzZSB3cml0ZSgpIG9yIGNhbGxiYWNrIEVWRU5UX01PUkVfREFUQSBpbnN0ZWFkLgogICAgICAqCiAgICAgICogSW50ZXJwcmV0YXRpb24gb2Ygd2FpdENvdW50OgogICAgICAqICArbiAgbGltaXRzIHdhaXQgdGltZSB0byBuICogV0FJVF9QRVJJT0RfTVMsCkBAIC01MTEsMjQgKzU5NiwyNyBAQAogICAgICAqCiAgICAgICogQnVmZmVyIGZpZWxkcwogICAgICAqIE9uIGVudHJ5OgotICAgICAqICBmcmFtZUNvdW50ICBudW1iZXIgb2YgZnJhbWVzIHJlcXVlc3RlZAorICAgICAqICBmcmFtZUNvdW50ICBudW1iZXIgb2YgW2VtcHR5IHNsb3RzIGZvcl0gZnJhbWVzIHJlcXVlc3RlZAorICAgICAqICBzaXplICAgICAgICBpZ25vcmVkCisgICAgICogIHJhdyAgICAgICAgIGlnbm9yZWQKICAgICAgKiBBZnRlciBlcnJvciByZXR1cm46CiAgICAgICogIGZyYW1lQ291bnQgIDAKICAgICAgKiAgc2l6ZSAgICAgICAgMAogICAgICAqICByYXcgICAgICAgICB1bmRlZmluZWQKICAgICAgKiBBZnRlciBzdWNjZXNzZnVsIHJldHVybjoKLSAgICAgKiAgZnJhbWVDb3VudCAgYWN0dWFsIG51bWJlciBvZiBmcmFtZXMgYXZhaWxhYmxlLCA8PSBudW1iZXIgcmVxdWVzdGVkCisgICAgICogIGZyYW1lQ291bnQgIGFjdHVhbCBudW1iZXIgb2YgW2VtcHR5IHNsb3RzIGZvcl0gZnJhbWVzIGF2YWlsYWJsZSwgPD0gbnVtYmVyIHJlcXVlc3RlZAogICAgICAqICBzaXplICAgICAgICBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZQogICAgICAqICByYXcgICAgICAgICBwb2ludGVyIHRvIHRoZSBidWZmZXIKICAgICAgKi8KLQotICAgIC8qIEZJWE1FIERlcHJlY2F0ZWQgcHVibGljIEFQSSBmb3IgVFJBTlNGRVJfT0JUQUlOIG1vZGUgKi8KLSAgICAgICAgICAgIHN0YXR1c190ICAgIG9idGFpbkJ1ZmZlcihCdWZmZXIqIGF1ZGlvQnVmZmVyLCBpbnQzMl90IHdhaXRDb3VudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19hdHRyaWJ1dGVfXygoX19kZXByZWNhdGVkX18pKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgIG9idGFpbkJ1ZmZlcihCdWZmZXIqIGF1ZGlvQnVmZmVyLCBpbnQzMl90IHdhaXRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpub25Db250aWcgPSBOVUxMKTsKIAogcHJpdmF0ZToKICAgICAvKiBJZiBub25Db250aWcgaXMgbm9uLU5VTEwsIGl0IGlzIGFuIG91dHB1dCBwYXJhbWV0ZXIgdGhhdCB3aWxsIGJlIHNldCB0byB0aGUgbnVtYmVyIG9mCi0gICAgICogYWRkaXRpb25hbCBub24tY29udGlndW91cyBmcmFtZXMgdGhhdCBhcmUgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LgorICAgICAqIGFkZGl0aW9uYWwgbm9uLWNvbnRpZ3VvdXMgZnJhbWVzIHRoYXQgYXJlIHByZWRpY3RlZCB0byBiZSBhdmFpbGFibGUgaW1tZWRpYXRlbHksCisgICAgICogaWYgdGhlIGNsaWVudCB3ZXJlIHRvIHJlbGVhc2UgdGhlIGZpcnN0IGZyYW1lcyBhbmQgdGhlbiBjYWxsIG9idGFpbkJ1ZmZlcigpIGFnYWluLgorICAgICAqIFRoaXMgdmFsdWUgaXMgb25seSBhIHByZWRpY3Rpb24sIGFuZCBuZWVkcyB0byBiZSBjb25maXJtZWQuCisgICAgICogSXQgd2lsbCBiZSBzZXQgdG8gemVybyBmb3IgYW4gZXJyb3IgcmV0dXJuLgogICAgICAqIEZJWE1FIFdlIGNvdWxkIHBhc3MgYW4gYXJyYXkgb2YgQnVmZmVycyBpbnN0ZWFkIG9mIG9ubHkgb25lIEJ1ZmZlciB0byBvYnRhaW5CdWZmZXIoKSwKICAgICAgKiBpbiBjYXNlIHRoZSByZXF1ZXN0ZWQgYW1vdW50IG9mIGZyYW1lcyBpcyBpbiB0d28gb3IgbW9yZSBub24tY29udGlndW91cyByZWdpb25zLgogICAgICAqIEZJWE1FIHJlcXVlc3RlZCBhbmQgZWxhcHNlZCBhcmUgYm90aCByZWxhdGl2ZSB0aW1lcy4gIENvbnNpZGVyIGNoYW5naW5nIHRvIGFic29sdXRlIHRpbWUuCkBAIC01MzcsOSArNjI1LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjICplbGFwc2VkID0gTlVMTCwgc2l6ZV90ICpub25Db250aWcgPSBOVUxMKTsKIHB1YmxpYzoKIAotICAgIC8qIFJlbGVhc2UgYSBmaWxsZWQgYnVmZmVyIG9mICJhdWRpb0J1ZmZlci0+ZnJhbWVDb3VudCIgZnJhbWVzIGZvciBBdWRpb0ZsaW5nZXIgdG8gcHJvY2Vzcy4gKi8KLSAgICAvLyBGSVhNRSBtYWtlIHByaXZhdGUgd2hlbiBvYnRhaW5CdWZmZXIoKSBmb3IgVFJBTlNGRVJfT0JUQUlOIGlzIHJlbW92ZWQKLSAgICAgICAgICAgIHZvaWQgICAgICAgIHJlbGVhc2VCdWZmZXIoQnVmZmVyKiBhdWRpb0J1ZmZlcik7CisgICAgLyogUHVibGljIEFQSSBmb3IgVFJBTlNGRVJfT0JUQUlOIG1vZGUuCisgICAgICogUmVsZWFzZSBhIGZpbGxlZCBidWZmZXIgb2YgZnJhbWVzIGZvciBBdWRpb0ZsaW5nZXIgdG8gcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIEJ1ZmZlciBmaWVsZHM6CisgICAgICogIGZyYW1lQ291bnQgIGN1cnJlbnRseSBpZ25vcmVkIGJ1dCByZWNvbW1lbmQgdG8gc2V0IHRvIGFjdHVhbCBudW1iZXIgb2YgZnJhbWVzIGZpbGxlZAorICAgICAqICBzaXplICAgICAgICBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIGZpbGxlZCwgbXVzdCBiZSBtdWx0aXBsZSBvZiBmcmFtZVNpemUKKyAgICAgKiAgcmF3ICAgICAgICAgaWdub3JlZAorICAgICAqLworICAgICAgICAgICAgdm9pZCAgICAgICAgcmVsZWFzZUJ1ZmZlcihjb25zdCBCdWZmZXIqIGF1ZGlvQnVmZmVyKTsKIAogICAgIC8qIEFzIGEgY29udmVuaWVuY2Ugd2UgcHJvdmlkZSBhIHdyaXRlKCkgaW50ZXJmYWNlIHRvIHRoZSBhdWRpbyBidWZmZXIuCiAgICAgICogSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyBpbiBieXRlIHVuaXRzLgpAQCAtNTUwLDggKzY0NCwxNCBAQAogICAgICAqICAgICAgQkFEX1ZBTFVFICAgICAgICAgICBzaXplIGlzIGludmFsaWQKICAgICAgKiAgICAgIFdPVUxEX0JMT0NLICAgICAgICAgd2hlbiBvYnRhaW5CdWZmZXIoKSByZXR1cm5zIHNhbWUsIG9yCiAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2sgd2FzIHN0b3BwZWQgZHVyaW5nIHRoZSB3cml0ZQorICAgICAqICAgICAgREVBRF9PQkpFQ1QgICAgICAgICB3aGVuIEF1ZGlvRmxpbmdlciBkaWVzIG9yIHRoZSBvdXRwdXQgZGV2aWNlIGNoYW5nZXMgYW5kCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0cmFjayBjYW5ub3QgYmUgYXV0b21hdGljYWxseSByZXN0b3JlZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIHJlY3JlYXRlIHRoZSBBdWRpb1RyYWNrCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGJlY2F1c2UgdGhlIGF1ZGlvIGRldmljZSBjaGFuZ2VkIG9yIEF1ZGlvRmxpbmdlciBkaWVkLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHR5cGljYWxseSBvY2N1cnMgZm9yIGRpcmVjdCBvciBvZmZsb2FkIHRyYWNrcworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZiBtRG9Ob3RSZWNvbm5lY3QgaXMgdHJ1ZS4KICAgICAgKiAgICAgIG9yIGFueSBvdGhlciBlcnJvciBjb2RlIHJldHVybmVkIGJ5IElBdWRpb1RyYWNrOjpzdGFydCgpIG9yIHJlc3RvcmVUcmFja19sKCkuCi0gICAgICogRGVmYXVsdCBiZWhhdmlvciBpcyB0byBvbmx5IHJldHVybiB1bnRpbCBhbGwgZGF0YSBoYXMgYmVlbiB0cmFuc2ZlcnJlZC4gU2V0ICdibG9ja2luZycgdG8KKyAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIG9ubHkgcmV0dXJuIHdoZW4gYWxsIGRhdGEgaGFzIGJlZW4gdHJhbnNmZXJyZWQuIFNldCAnYmxvY2tpbmcnIHRvCiAgICAgICogZmFsc2UgZm9yIHRoZSBtZXRob2QgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IHdpdGhvdXQgd2FpdGluZyB0byB0cnkgbXVsdGlwbGUgdGltZXMgdG8gd3JpdGUKICAgICAgKiB0aGUgZnVsbCBjb250ZW50IG9mIHRoZSBidWZmZXIuCiAgICAgICovCkBAIC01NTksNiArNjU5LDcgQEAKIAogICAgIC8qCiAgICAgICogRHVtcHMgdGhlIHN0YXRlIG9mIGFuIGF1ZGlvIHRyYWNrLgorICAgICAqIE5vdCBhIGdlbmVyYWwtcHVycG9zZSBBUEk7IGludGVuZGVkIG9ubHkgZm9yIHVzZSBieSBtZWRpYSBwbGF5ZXIgc2VydmljZSB0byBkdW1wIGl0cyB0cmFja3MuCiAgICAgICovCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CiAKQEAgLTU4OSwxOSArNjkwLDQ1IEBACiAgICAgICogICAgICAgICAgICAgICAgICAgICBvdmVyYWxsIGhhcmR3YXJlIGxhdGVuY3kgdG8gcGh5c2ljYWwgb3V0cHV0LiBJbiBXT1VMRF9CTE9DSyBjYXNlcywKICAgICAgKiAgICAgICAgICAgICAgICAgICAgIG9uZSBtaWdodCBwb2xsIGFnYWluLCBvciB1c2UgZ2V0UG9zaXRpb24oKSwgb3IgdXNlIDAgcG9zaXRpb24gYW5kCiAgICAgICogICAgICAgICAgICAgICAgICAgICBjdXJyZW50IHRpbWUgZm9yIHRoZSB0aW1lc3RhbXAuCisgICAgICogICAgICAgICBERUFEX09CSkVDVCBpZiBBdWRpb0ZsaW5nZXIgZGllcyBvciB0aGUgb3V0cHV0IGRldmljZSBjaGFuZ2VzIGFuZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgdGhlIHRyYWNrIGNhbm5vdCBiZSBhdXRvbWF0aWNhbGx5IHJlc3RvcmVkLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIHJlY3JlYXRlIHRoZSBBdWRpb1RyYWNrCisgICAgICogICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIHRoZSBhdWRpbyBkZXZpY2UgY2hhbmdlZCBvciBBdWRpb0ZsaW5nZXIgZGllZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIFRoaXMgdHlwaWNhbGx5IG9jY3VycyBmb3IgZGlyZWN0IG9yIG9mZmxvYWQgdHJhY2tzCisgICAgICogICAgICAgICAgICAgICAgICAgICBvciBpZiBtRG9Ob3RSZWNvbm5lY3QgaXMgdHJ1ZS4KICAgICAgKiAgICAgICAgIElOVkFMSURfT1BFUkFUSU9OICBpZiBjYWxsZWQgb24gYSBGYXN0VHJhY2ssIHdyb25nIHN0YXRlLCBvciBzb21lIG90aGVyIGVycm9yLgogICAgICAqCiAgICAgICogVGhlIHRpbWVzdGFtcCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkIG9uIHJldHVybiwgaWYgc3RhdHVzIGlzIG5vdCBOT19FUlJPUi4KICAgICAgKi8KICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKTsKIAorICAgIC8qIEFkZCBhbiBBdWRpb0RldmljZUNhbGxiYWNrLiBUaGUgY2FsbGVyIHdpbGwgYmUgbm90aWZpZWQgd2hlbiB0aGUgYXVkaW8gZGV2aWNlIHRvIHdoaWNoIHRoaXMKKyAgICAgKiBBdWRpb1RyYWNrIGlzIHJvdXRlZCBpcyB1cGRhdGVkLgorICAgICAqIFJlcGxhY2VzIGFueSBwcmV2aW91c2x5IGluc3RhbGxlZCBjYWxsYmFjay4KKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqICBjYWxsYmFjazogIFRoZSBjYWxsYmFjayBpbnRlcmZhY2UKKyAgICAgKiBSZXR1cm5zIE5PX0VSUk9SIGlmIHN1Y2Nlc3NmdWwuCisgICAgICogICAgICAgICBJTlZBTElEX09QRVJBVElPTiBpZiB0aGUgc2FtZSBjYWxsYmFjayBpcyBhbHJlYWR5IGluc3RhbGxlZC4KKyAgICAgKiAgICAgICAgIE5PX0lOSVQgb3IgUFJFTUlTU0lPTl9ERU5JRUQgaWYgQXVkaW9GbGluZ2VyIHNlcnZpY2UgaXMgbm90IHJlYWNoYWJsZQorICAgICAqICAgICAgICAgQkFEX1ZBTFVFIGlmIHRoZSBjYWxsYmFjayBpcyBOVUxMCisgICAgICovCisgICAgICAgICAgICBzdGF0dXNfdCBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spOworCisgICAgLyogcmVtb3ZlIGFuIEF1ZGlvRGV2aWNlQ2FsbGJhY2suCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgY2FsbGJhY2s6ICBUaGUgY2FsbGJhY2sgaW50ZXJmYWNlCisgICAgICogUmV0dXJucyBOT19FUlJPUiBpZiBzdWNjZXNzZnVsLgorICAgICAqICAgICAgICAgSU5WQUxJRF9PUEVSQVRJT04gaWYgdGhlIGNhbGxiYWNrIGlzIG5vdCBpbnN0YWxsZWQKKyAgICAgKiAgICAgICAgIEJBRF9WQUxVRSBpZiB0aGUgY2FsbGJhY2sgaXMgTlVMTAorICAgICAqLworICAgICAgICAgICAgc3RhdHVzX3QgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjaygKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjayk7CisKIHByb3RlY3RlZDoKICAgICAvKiBjb3B5aW5nIGF1ZGlvIHRyYWNrcyBpcyBub3QgYWxsb3dlZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjayhjb25zdCBBdWRpb1RyYWNrJiBvdGhlcik7CiAgICAgICAgICAgICBBdWRpb1RyYWNrJiBvcGVyYXRvciA9IChjb25zdCBBdWRpb1RyYWNrJiBvdGhlcik7CiAKLSAgICAgICAgICAgIHZvaWQgICAgICAgIHNldEF0dHJpYnV0ZXNGcm9tU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpOwotCiAgICAgLyogYSBzbWFsbCBpbnRlcm5hbCBjbGFzcyB0byBoYW5kbGUgdGhlIGNhbGxiYWNrICovCiAgICAgY2xhc3MgQXVkaW9UcmFja1RocmVhZCA6IHB1YmxpYyBUaHJlYWQKICAgICB7CkBAIC02MTQsNiArNzQxLDcgQEAKIAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHBhdXNlKCk7ICAgIC8vIHN1c3BlbmQgdGhyZWFkIGZyb20gZXhlY3V0aW9uIGF0IG5leHQgbG9vcCBib3VuZGFyeQogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlc3VtZSgpOyAgIC8vIGFsbG93IHRocmVhZCB0byBleGVjdXRlLCBpZiBub3QgcmVxdWVzdGVkIHRvIGV4aXQKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICB3YWtlKCk7ICAgICAvLyB3YWtlIHRvIGhhbmRsZSBjaGFuZ2VkIG5vdGlmaWNhdGlvbiBjb25kaXRpb25zLgogCiAgICAgcHJpdmF0ZToKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBwYXVzZUludGVybmFsKG5zZWNzX3QgbnMgPSAwTEwpOwpAQCAtNjI4LDcgKzc1Niw5IEBACiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgbVBhdXNlZDsgICAgLy8gd2hldGhlciB0aHJlYWQgaXMgcmVxdWVzdGVkIHRvIHBhdXNlIGF0IG5leHQgbG9vcCBlbnRyeQogICAgICAgICBib29sICAgICAgICAgICAgICAgIG1QYXVzZWRJbnQ7IC8vIHdoZXRoZXIgdGhyZWFkIGludGVybmFsbHkgcmVxdWVzdHMgcGF1c2UKICAgICAgICAgbnNlY3NfdCAgICAgICAgICAgICBtUGF1c2VkTnM7ICAvLyBpZiBtUGF1c2VkSW50IHRoZW4gYXNzb2NpYXRlZCB0aW1lb3V0LCBvdGhlcndpc2UgaWdub3JlZAotICAgICAgICBib29sICAgICAgICAgICAgICAgIG1JZ25vcmVOZXh0UGF1c2VkSW50OyAgIC8vIHdoZXRoZXIgdG8gaWdub3JlIG5leHQgbVBhdXNlZEludCByZXF1ZXN0CisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgbUlnbm9yZU5leHRQYXVzZWRJbnQ7ICAgLy8gc2tpcCBhbnkgaW50ZXJuYWwgcGF1c2UgYW5kIGdvIGltbWVkaWF0ZWx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkgYXMgc3RhdGUgbWF5IGhhdmUgY2hhbmdlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHBhdXNlIHRpbWUgY2FsY3VsYXRlZC4KICAgICB9OwogCiAgICAgICAgICAgICAvLyBib2R5IG9mIEF1ZGlvVHJhY2tUaHJlYWQ6OnRocmVhZExvb3AoKQpAQCAtNjQxLDEwICs3NzEsNiBAQAogICAgICAgICAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3QgTlNfV0hFTkVWRVIgPSAtMSwgTlNfSU5BQ1RJVkUgPSAtMiwgTlNfTkVWRVIgPSAtMzsKICAgICAgICAgICAgIG5zZWNzX3QgcHJvY2Vzc0F1ZGlvQnVmZmVyKCk7CiAKLSAgICAgICAgICAgIGJvb2wgICAgIGlzT2ZmbG9hZGVkKCkgY29uc3Q7Ci0gICAgICAgICAgICBib29sICAgICBpc0RpcmVjdCgpIGNvbnN0OwotICAgICAgICAgICAgYm9vbCAgICAgaXNPZmZsb2FkZWRPckRpcmVjdCgpIGNvbnN0OwotCiAgICAgICAgICAgICAvLyBjYWxsZXIgbXVzdCBob2xkIGxvY2sgb24gbUxvY2sgZm9yIGFsbCBfbCBtZXRob2RzCiAKICAgICAgICAgICAgIHN0YXR1c190IGNyZWF0ZVRyYWNrX2woKTsKQEAgLTY1Nyw2ICs3ODMsMTAgQEAKICAgICAgICAgICAgIC8vIEZJWE1FIGVudW0gaXMgZmFzdGVyIHRoYW4gc3RyY21wKCkgZm9yIHBhcmFtZXRlciAnZnJvbScKICAgICAgICAgICAgIHN0YXR1c190IHJlc3RvcmVUcmFja19sKGNvbnN0IGNoYXIgKmZyb20pOwogCisgICAgICAgICAgICBib29sICAgICBpc09mZmxvYWRlZCgpIGNvbnN0OworICAgICAgICAgICAgYm9vbCAgICAgaXNEaXJlY3QoKSBjb25zdDsKKyAgICAgICAgICAgIGJvb2wgICAgIGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSBjb25zdDsKKwogICAgICAgICAgICAgYm9vbCAgICAgaXNPZmZsb2FkZWRfbCgpIGNvbnN0CiAgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDA7IH0KIApAQCAtNjcwLDYgKzgwMCw5IEBACiAgICAgICAgICAgICAvLyBpbmNyZW1lbnQgbVBvc2l0aW9uIGJ5IHRoZSBkZWx0YSBvZiBtU2VydmVyLCBhbmQgcmV0dXJuIG5ldyB2YWx1ZSBvZiBtUG9zaXRpb24KICAgICAgICAgICAgIHVpbnQzMl90IHVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKTsKIAorICAgICAgICAgICAgLy8gY2hlY2sgc2FtcGxlIHJhdGUgYW5kIHNwZWVkIGlzIGNvbXBhdGlibGUgd2l0aCBBdWRpb1RyYWNrCisgICAgICAgICAgICBib29sICAgICBpc1NhbXBsZVJhdGVTcGVlZEFsbG93ZWRfbCh1aW50MzJfdCBzYW1wbGVSYXRlLCBmbG9hdCBzcGVlZCkgY29uc3Q7CisKICAgICAvLyBOZXh0IDQgZmllbGRzIG1heSBiZSBjaGFuZ2VkIGlmIElBdWRpb1RyYWNrIGlzIHJlLWNyZWF0ZWQsIGJ1dCBhbHdheXMgIT0gMAogICAgIHNwPElBdWRpb1RyYWNrPiAgICAgICAgIG1BdWRpb1RyYWNrOwogICAgIHNwPElNZW1vcnk+ICAgICAgICAgICAgIG1DYmxrTWVtb3J5OwpAQCAtNjgwLDEyICs4MTMsMjEgQEAKIAogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVbMl07CiAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbVNlbmRMZXZlbDsKLSAgICBtdXRhYmxlIHVpbnQzMl90ICAgICAgICBtU2FtcGxlUmF0ZTsgICAgICAgICAgICAvLyBtdXRhYmxlIGJlY2F1c2UgZ2V0U2FtcGxlUmF0ZSgpIGNhbiB1cGRhdGUgaXQuCisgICAgbXV0YWJsZSB1aW50MzJfdCAgICAgICAgbVNhbXBsZVJhdGU7ICAgICAgICAgICAgLy8gbXV0YWJsZSBiZWNhdXNlIGdldFNhbXBsZVJhdGUoKSBjYW4gdXBkYXRlIGl0CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbU9yaWdpbmFsU2FtcGxlUmF0ZTsKKyAgICBBdWRpb1BsYXliYWNrUmF0ZSAgICAgICBtUGxheWJhY2tSYXRlOwogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OyAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIGN1cnJlbnQgSUF1ZGlvVHJhY2ssIHZhbHVlIGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0ZWQgYmFjayBieSBBdWRpb0ZsaW5nZXIgdG8gdGhlIGNsaWVudAogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1SZXFGcmFtZUNvdW50OyAgICAgICAgIC8vIGZyYW1lIGNvdW50IHRvIHJlcXVlc3QgdGhlIGZpcnN0IG9yIG5leHQgdGltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgbmV3IElBdWRpb1RyYWNrIGlzIG5lZWRlZCwgbm9uLWRlY3JlYXNpbmcKIAorICAgIC8vIFRoZSBmb2xsb3dpbmcgQXVkaW9GbGluZ2VyIHNlcnZlci1zaWRlIHZhbHVlcyBhcmUgY2FjaGVkIGluIGNyZWF0ZUF1ZGlvVHJhY2tfbCgpLgorICAgIC8vIFRoZXNlIHZhbHVlcyBjYW4gYmUgdXNlZCBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyB1bnRpbCB0aGUgdHJhY2sgaXMgaW52YWxpZGF0ZWQsCisgICAgLy8gd2hlcmV1cG9uIHJlc3RvcmVUcmFja19sKCkgY2FsbHMgY3JlYXRlVHJhY2tfbCgpIHRvIHVwZGF0ZSB0aGUgdmFsdWVzLgorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1BZkxhdGVuY3k7ICAgICAgICAgICAgIC8vIEF1ZGlvRmxpbmdlciBsYXRlbmN5IGluIG1zCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbUFmRnJhbWVDb3VudDsgICAgICAgICAgLy8gQXVkaW9GbGluZ2VyIGZyYW1lIGNvdW50CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUFmU2FtcGxlUmF0ZTsgICAgICAgICAgLy8gQXVkaW9GbGluZ2VyIHNhbXBsZSByYXRlCisKICAgICAvLyBjb25zdGFudCBhZnRlciBjb25zdHJ1Y3RvciBvciBzZXQoKQogICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgIG1Gb3JtYXQ7ICAgICAgICAgICAgICAgIC8vIGFzIHJlcXVlc3RlZCBieSBjbGllbnQsIG5vdCBmb3JjZWQgdG8gMTYtYml0CiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAgICAgbVN0cmVhbVR5cGU7ICAgICAgICAgICAgLy8gbVN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX0RFRkFVTFQgaW1wbGllcwpAQCAtNjk4LDEwICs4NDAsNyBAQAogICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190KiBtT2ZmbG9hZEluZm87CiAgICAgYXVkaW9fYXR0cmlidXRlc190ICAgICAgbUF0dHJpYnV0ZXM7CiAKLSAgICAvLyBtRnJhbWVTaXplIGlzIGVxdWFsIHRvIG1GcmFtZVNpemVBRiBmb3Igbm9uLVBDTSBvciAxNi1iaXQgUENNIGRhdGEuICBGb3IgOC1iaXQgUENNIGRhdGEsIGl0J3MKLSAgICAvLyB0d2ljZSBhcyBsYXJnZSBhcyBtRnJhbWVTaXplIGJlY2F1c2UgZGF0YSBpcyBleHBhbmRlZCB0byAxNi1iaXQgYmVmb3JlIGl0J3Mgc3RvcmVkIGluIGJ1ZmZlci4KLSAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtRnJhbWVTaXplOyAgICAgICAgICAgICAvLyBhcHAtbGV2ZWwgZnJhbWUgc2l6ZQotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZVNpemVBRjsgICAgICAgICAgIC8vIEF1ZGlvRmxpbmdlciBmcmFtZSBzaXplCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZTsgICAgICAgICAgICAgLy8gZnJhbWUgc2l6ZSBpbiBieXRlcwogCiAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgbVN0YXR1czsKIApAQCAtNzMyLDE3ICs4NzEsMjUgQEAKICAgICBib29sICAgICAgICAgICAgICAgICAgICBtUmVmcmVzaFJlbWFpbmluZzsgICAgICAvLyBwcm9jZXNzQXVkaW9CdWZmZXIoKSBzaG91bGQgcmVmcmVzaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1SZW1haW5pbmdGcmFtZXMgYW5kIG1SZXRyeU9uUGFydGlhbEJ1ZmZlcgogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCBmb3Igc3RhdGljIHRyYWNrIGNiZiBhbmQgcmVzdG9yYXRpb24KKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtTG9vcENvdW50OyAgICAgICAgICAgICAvLyBsYXN0IHNldExvb3AgbG9vcENvdW50OyB6ZXJvIG1lYW5zIGRpc2FibGVkCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUxvb3BTdGFydDsgICAgICAgICAgICAgLy8gbGFzdCBzZXRMb29wIGxvb3BTdGFydAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1Mb29wRW5kOyAgICAgICAgICAgICAgIC8vIGxhc3Qgc2V0TG9vcCBsb29wRW5kCisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbUxvb3BDb3VudE5vdGlmaWVkOyAgICAgLy8gdGhlIGxhc3QgbG9vcENvdW50IG5vdGlmaWVkIGJ5IGNhbGxiYWNrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Mb29wQ291bnROb3RpZmllZCBjb3VudHMgZG93biwgbWF0Y2hpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVtYWluaW5nIGxvb3AgY291bnQgZm9yIHN0YXRpYyB0cmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBsYXliYWNrLgorCiAgICAgLy8gVGhlc2UgYXJlIHByaXZhdGUgdG8gcHJvY2Vzc0F1ZGlvQnVmZmVyKCksIGFuZCBhcmUgbm90IHByb3RlY3RlZCBieSBhIGxvY2sKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtUmVtYWluaW5nRnJhbWVzOyAgICAgICAvLyBudW1iZXIgb2YgZnJhbWVzIHRvIHJlcXVlc3QgaW4gb2J0YWluQnVmZmVyKCkKICAgICBib29sICAgICAgICAgICAgICAgICAgICBtUmV0cnlPblBhcnRpYWxCdWZmZXI7ICAvLyBzbGVlcCBhbmQgcmV0cnkgYWZ0ZXIgcGFydGlhbCBvYnRhaW5CdWZmZXIoKQogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1PYnNlcnZlZFNlcXVlbmNlOyAgICAgIC8vIGxhc3Qgb2JzZXJ2ZWQgdmFsdWUgb2YgbVNlcXVlbmNlCiAKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtTG9vcFBlcmlvZDsgICAgICAgICAgICAvLyBpbiBmcmFtZXMsIHplcm8gbWVhbnMgbG9vcGluZyBpcyBkaXNhYmxlZAotCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbU1hcmtlclBvc2l0aW9uOyAgICAgICAgLy8gaW4gd3JhcHBpbmcgKG92ZXJmbG93KSBmcmFtZSB1bml0cwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1NYXJrZXJSZWFjaGVkOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1OZXdQb3NpdGlvbjsgICAgICAgICAgIC8vIGluIGZyYW1lcwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1VcGRhdGVQZXJpb2Q7ICAgICAgICAgIC8vIGluIGZyYW1lcywgemVybyBtZWFucyBubyBFVkVOVF9ORVdfUE9TCisKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtU2VydmVyOyAgICAgICAgICAgICAgICAvLyBpbiBmcmFtZXMsIGxhc3Qga25vd24gbVByb3h5LT5nZXRQb3NpdGlvbigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggaXMgY291bnQgb2YgZnJhbWVzIGNvbnN1bWVkIGJ5IHNlcnZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBieSBuZXcgSUF1ZGlvVHJhY2ssCkBAIC03NTgsMTAgKzkwNSwxNyBAQAogICAgIGludDY0X3QgICAgICAgICAgICAgICAgIG1TdGFydFVzOyAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCB0aW1lIGFmdGVyIGZsdXNoIG9yIHN0b3AuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSB1c2VkIGZvciBvZmZsb2FkZWQgYW5kIGRpcmVjdCB0cmFja3MuCiAKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNUaW1lc3RhbXBWYWxpZDsvLyB0cnVlIGlmIG1QcmV2aW91c1RpbWVzdGFtcCBpcyB2YWxpZAorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBTdGFydHVwR2xpdGNoUmVwb3J0ZWQ7IC8vIHJlZHVjZSBsb2cgc3BhbQorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1SZXRyb2dyYWRlTW90aW9uUmVwb3J0ZWQ7IC8vIHJlZHVjZSBsb2cgc3BhbQorICAgIEF1ZGlvVGltZXN0YW1wICAgICAgICAgIG1QcmV2aW91c1RpbWVzdGFtcDsgICAgIC8vIHVzZWQgdG8gZGV0ZWN0IHJldHJvZ3JhZGUgbW90aW9uCisKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAgICBtRmxhZ3M7CiAgICAgICAgIC8vIGNvbnN0IGFmdGVyIHNldCgpLCBleGNlcHQgZm9yIGJpdHMgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBhbmQgQVVESU9fT1VUUFVUX0ZMQUdfT0ZGTE9BRC4KICAgICAgICAgLy8gbUxvY2sgbXVzdCBiZSBoZWxkIHRvIHJlYWQgb3Igd3JpdGUgdGhvc2UgYml0cyByZWxpYWJseS4KIAorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1Eb05vdFJlY29ubmVjdDsKKwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQ7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUF1eEVmZmVjdElkOwogCkBAIC03ODMsNiArOTM3LDEwIEBACiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbUluVW5kZXJydW47ICAgICAgICAgICAgLy8gd2hldGhlciB0cmFjayBpcyBjdXJyZW50bHkgaW4gdW5kZXJydW4gc3RhdGUKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtUGF1c2VkUG9zaXRpb247CiAKKyAgICAvLyBGb3IgRGV2aWNlIFNlbGVjdGlvbiBBUEkKKyAgICAvLyAgYSB2YWx1ZSBvZiBBVURJT19QT1JUX0hBTkRMRV9OT05FIGluZGljYXRlZCBkZWZhdWx0IChBdWRpb1BvbGljeU1hbmFnZXIpIHJvdXRpbmcuCisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbVNlbGVjdGVkRGV2aWNlSWQ7CisKIHByaXZhdGU6CiAgICAgY2xhc3MgRGVhdGhOb3RpZmllciA6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CiAgICAgcHVibGljOgpAQCAtNzk3LDYgKzk1NSw4IEBACiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNlcXVlbmNlOyAgICAgICAgICAgICAgLy8gaW5jcmVtZW50ZWQgZm9yIGVhY2ggbmV3IElBdWRpb1RyYWNrIGF0dGVtcHQKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50VWlkOwogICAgIHBpZF90ICAgICAgICAgICAgICAgICAgIG1DbGllbnRQaWQ7CisKKyAgICBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4gbURldmljZUNhbGxiYWNrOwogfTsKIAogY2xhc3MgVGltZWRBdWRpb1RyYWNrIDogcHVibGljIEF1ZGlvVHJhY2sKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaCBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaAppbmRleCBiMWVkN2IwLi42NGEzMjEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oCkBAIC0xNzEsNiArMTcxLDggQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiBpbnQgRWZmZWN0SXNOdWxsVXVpZChjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCk7CiAKK2ludCBFZmZlY3REdW1wRWZmZWN0cyhpbnQgZmQpOworCiAjaWYgX19jcGx1c3BsdXMKIH0gIC8vIGV4dGVybiAiQyIKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmggYi9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaAppbmRleCAzMWExNGYwLi41MDUxYWZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaApAQCAtODUsMTUgKzg1LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjYWxsaW5nUGFja2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHRpZCwgIC8vIC0xIG1lYW5zIHVudXNlZCwgb3RoZXJ3aXNlIG11c3QgYmUgdmFsaWQgbm9uLTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaWVudFVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiYgY2JsaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4mIGJ1ZmZlcnMsICAgLy8gcmV0dXJuIHZhbHVlIDAgbWVhbnMgaXQgZm9sbG93cyBjYmxrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpID0gMDsKIAorICAgIC8vIEZJWE1FIFN1cnByaXNpbmdseSwgc2FtcGxlUmF0ZS9mb3JtYXQvZnJhbWVDb3VudC9sYXRlbmN5IGRvbid0IHdvcmsgZm9yIGlucHV0IGhhbmRsZXMKKwogICAgIC8qIHF1ZXJ5IHRoZSBhdWRpbyBoYXJkd2FyZSBzdGF0ZS4gVGhpcyBzdGF0ZSBuZXZlciBjaGFuZ2VzLAogICAgICAqIGFuZCB0aGVyZWZvcmUgY2FuIGJlIGNhY2hlZC4KICAgICAgKi8KQEAgLTE0Miw2ICsxNDYsNyBAQAogICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlckNsaWVudChjb25zdCBzcDxJQXVkaW9GbGluZ2VyQ2xpZW50PiYgY2xpZW50KSA9IDA7CiAKICAgICAvLyByZXRyaWV2ZSB0aGUgYXVkaW8gcmVjb3JkaW5nIGJ1ZmZlciBzaXplCisgICAgLy8gRklYTUUgVGhpcyBBUEkgYXNzdW1lcyBhIHJvdXRlLCBhbmQgc28gc2hvdWxkIGJlIGRlcHJlY2F0ZWQuCiAgICAgdmlydHVhbCBzaXplX3QgZ2V0SW5wdXRCdWZmZXJTaXplKHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSBjb25zdCA9IDA7CiAKQEAgLTE5NSw2ICsyMDAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9GbGluZ2VyIGRvZXNuJ3QgdGFrZSBvdmVyIGhhbmRsZSByZWZlcmVuY2UgZnJvbSBjbGllbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2FsbGluZ1BhY2thZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZW5hYmxlZCkgPSAwOwpAQCAtMjM3LDYgKzI0Myw5IEBACiAKICAgICAvKiBHZXQgdGhlIEhXIHN5bmNocm9uaXphdGlvbiBzb3VyY2UgdXNlZCBmb3IgYW4gYXVkaW8gc2Vzc2lvbiAqLwogICAgIHZpcnR1YWwgYXVkaW9faHdfc3luY190IGdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSA9IDA7CisKKyAgICAvKiBJbmRpY2F0ZSBKQVZBIHNlcnZpY2VzIGFyZSByZWFkeSAoc2NoZWR1bGluZywgcG93ZXIgbWFuYWdlbWVudCAuLi4pICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzeXN0ZW1SZWFkeSgpID0gMDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50LmggYi9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuaAppbmRleCA3NWE5OTcxLi4wMDgwYmM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuaAorKysgYi9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuaApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMzLDcgKzM0LDggQEAKICAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKEF1ZGlvRmxpbmdlckNsaWVudCk7CiAKICAgICAvLyBOb3RpZmllcyBhIGNoYW5nZSBvZiBhdWRpbyBpbnB1dC9vdXRwdXQgY29uZmlndXJhdGlvbi4KLSAgICB2aXJ0dWFsIHZvaWQgaW9Db25maWdDaGFuZ2VkKGludCBldmVudCwgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IHZvaWQgKnBhcmFtMikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBpb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+JiBpb0Rlc2MpID0gMDsKIAogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmggYi9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaAppbmRleCBjOThjNDc1Li42YjkzZjZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaApAQCAtNDQsNyArNDQsOCBAQAogICAgIC8vCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkgPSAwOwogICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKSA9IDA7CkBAIC02MSwxMCArNjIsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCkBAIC03NiwxMiArNzksMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgIGdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LApAQCAtMTQ0LDYgKzE0OSw4IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJDbGllbnQoY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4mIGNsaWVudCkgPSAwOwogCisgICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKSA9IDA7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpID0gMDsKQEAgLTE1Myw2ICsxNjAsMTEgQEAKICAgICB2aXJ0dWFsIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlclBvbGljeU1peGVzKFZlY3RvcjxBdWRpb01peD4gbWl4ZXMsIGJvb2wgcmVnaXN0cmF0aW9uKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmhhbmRsZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSkgPSAwOwogfTsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaCBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCmluZGV4IDU5ZGYwNDYuLmE3ZjJjYzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCkBAIC0zNSw2ICszNSw4IEBACiAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpID0gMDsKICAgICAvLyBOb3RpZmllcyBhIGNoYW5nZSBvZiBhdWRpbyBwYXRjaCBjb25maWd1cmF0aW9uLgogICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkgPSAwOworICAgIC8vIE5vdGlmaWVzIGEgY2hhbmdlIGluIHRoZSBtaXhpbmcgc3RhdGUgb2YgYSBzcGVjaWZpYyBtaXggaW4gYSBkeW5hbWljIGF1ZGlvIHBvbGljeQorICAgIHZpcnR1YWwgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKSA9IDA7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSUNyeXB0by5oIGIvaW5jbHVkZS9tZWRpYS9JQ3J5cHRvLmgKaW5kZXggMDc3NDJjYS4uZWEzMTZkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JQ3J5cHRvLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JQ3J5cHRvLmgKQEAgLTI1LDYgKzI1LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFTdHJpbmc7CitjbGFzcyBJTWVtb3J5OwogCiBzdHJ1Y3QgSUNyeXB0byA6IHB1YmxpYyBJSW50ZXJmYWNlIHsKICAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKENyeXB0byk7CkBAIC00MywxMiArNDQsMTQgQEAKIAogICAgIHZpcnR1YWwgdm9pZCBub3RpZnlSZXNvbHV0aW9uKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpID0gMDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFEcm1TZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkKSA9IDA7CisKICAgICB2aXJ0dWFsIHNzaXplX3QgZGVjcnlwdCgKICAgICAgICAgICAgIGJvb2wgc2VjdXJlLAogICAgICAgICAgICAgY29uc3QgdWludDhfdCBrZXlbMTZdLAogICAgICAgICAgICAgY29uc3QgdWludDhfdCBpdlsxNl0sCiAgICAgICAgICAgICBDcnlwdG9QbHVnaW46Ok1vZGUgbW9kZSwKLSAgICAgICAgICAgIGNvbnN0IHZvaWQgKnNyY1B0ciwKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZzaGFyZWRCdWZmZXIsIHNpemVfdCBvZmZzZXQsCiAgICAgICAgICAgICBjb25zdCBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSAqc3ViU2FtcGxlcywgc2l6ZV90IG51bVN1YlNhbXBsZXMsCiAgICAgICAgICAgICB2b2lkICpkc3RQdHIsCiAgICAgICAgICAgICBBU3RyaW5nICplcnJvckRldGFpbE1zZykgPSAwOwpAQCAtNjEsNiArNjQsOSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCgKICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCAmZGF0YSwgUGFyY2VsICpyZXBseSwKICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Citwcml2YXRlOgorICAgIHZvaWQgcmVhZFZlY3Rvcihjb25zdCBQYXJjZWwgJmRhdGEsIFZlY3Rvcjx1aW50OF90PiAmdmVjdG9yKSBjb25zdDsKKyAgICB2b2lkIHdyaXRlVmVjdG9yKFBhcmNlbCAqcmVwbHksIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmdmVjdG9yKSBjb25zdDsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lEYXRhU291cmNlLmggYi9pbmNsdWRlL21lZGlhL0lEYXRhU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdlNDZmNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvSURhdGFTb3VyY2UuaApAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSURBVEFTT1VSQ0VfSAorI2RlZmluZSBBTkRST0lEX0lEQVRBU09VUkNFX0gKKworI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIElNZW1vcnk7CisKKy8vIEEgYmluZGVyIGludGVyZmFjZSBmb3IgaW1wbGVtZW50aW5nIGEgc3RhZ2VmcmlnaHQgRGF0YVNvdXJjZSByZW1vdGVseS4KK2NsYXNzIElEYXRhU291cmNlIDogcHVibGljIElJbnRlcmZhY2UgeworcHVibGljOgorICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoRGF0YVNvdXJjZSk7CisKKyAgICAvLyBHZXQgdGhlIG1lbW9yeSB0aGF0IHJlYWRBdCB3cml0ZXMgaW50by4KKyAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldElNZW1vcnkoKSA9IDA7CisgICAgLy8gUmVhZCB1cCB0byB8c2l6ZXwgYnl0ZXMgaW50byB0aGUgbWVtb3J5IHJldHVybmVkIGJ5IGdldElNZW1vcnkoKS4gUmV0dXJucworICAgIC8vIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgLTEgb24gZXJyb3IuIHxzaXplfCBtdXN0IG5vdCBiZSBsYXJnZXIgdGhhbgorICAgIC8vIHRoZSBidWZmZXIuCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpID0gMDsKKyAgICAvLyBHZXQgdGhlIHNpemUsIG9yIC0xIGlmIHRoZSBzaXplIGlzIHVua25vd24uCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QqIHNpemUpID0gMDsKKyAgICAvLyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIGRlbGV0aW5nIHx0aGlzfC4gVGhlIG90aGVyIG1ldGhvZHMgbWF5CisgICAgLy8gcmV0dXJuIGVycm9ycyBpZiB0aGV5J3JlIGNhbGxlZCBhZnRlciBjYWxsaW5nIGNsb3NlKCkuCisgICAgdmlydHVhbCB2b2lkIGNsb3NlKCkgPSAwOworCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKElEYXRhU291cmNlKTsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQm5EYXRhU291cmNlIDogcHVibGljIEJuSW50ZXJmYWNlPElEYXRhU291cmNlPiB7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0lEQVRBU09VUkNFX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSURybS5oIGIvaW5jbHVkZS9tZWRpYS9JRHJtLmgKaW5kZXggYWZmY2JkNy4uOTQ0OWJlYjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSURybS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSURybS5oCkBAIC00Nyw3ICs0Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpbml0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZtaW1lVHlwZSwgRHJtUGx1Z2luOjpLZXlUeXBlIGtleVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gY29uc3QgJm9wdGlvbmFsUGFyYW1ldGVycywKLSAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnJlcXVlc3QsIFN0cmluZzggJmRlZmF1bHRVcmwpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnJlcXVlc3QsIFN0cmluZzggJmRlZmF1bHRVcmwsCisgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSAqa2V5UmVxdWVzdFR5cGUpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvdmlkZUtleVJlc3BvbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmcmVzcG9uc2UsCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYUNvZGVjTGlzdC5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFDb2RlY0xpc3QuaAppbmRleCBlOTNlYThiLi4xMmI1MmQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lNZWRpYUNvZGVjTGlzdC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhQ29kZWNMaXN0LmgKQEAgLTIxLDYgKzIxLDggQEAKICNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KIAorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgTWVkaWFDb2RlY0luZm87CkBAIC0zMyw2ICszNSw4IEBACiAgICAgdmlydHVhbCBzaXplX3QgY291bnRDb2RlY3MoKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBzcDxNZWRpYUNvZGVjSW5mbz4gZ2V0Q29kZWNJbmZvKHNpemVfdCBpbmRleCkgY29uc3QgPSAwOwogCisgICAgdmlydHVhbCBjb25zdCBzcDxBTWVzc2FnZT4gZ2V0R2xvYmFsU2V0dGluZ3MoKSBjb25zdCA9IDA7CisKICAgICB2aXJ0dWFsIHNzaXplX3QgZmluZENvZGVjQnlUeXBlKAogICAgICAgICAgICAgY29uc3QgY2hhciAqdHlwZSwgYm9vbCBlbmNvZGVyLCBzaXplX3Qgc3RhcnRJbmRleCA9IDApIGNvbnN0ID0gMDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oCmluZGV4IDI1Mjk4MDAuLmM5MGYyNTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmgKQEAgLTI2LDYgKzI2LDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitjbGFzcyBJRGF0YVNvdXJjZTsKIHN0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIAogY2xhc3MgSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6IHB1YmxpYyBJSW50ZXJmYWNlCkBAIC00MCw2ICs0MSw3IEBACiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGNvbnN0IHNwPElEYXRhU291cmNlPiYgZGF0YVNvdXJjZSkgPSAwOwogICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgIGdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uKSA9IDA7CiAgICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgZXh0cmFjdEFsYnVtQXJ0KCkgPSAwOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciogICAgIGV4dHJhY3RNZXRhZGF0YShpbnQga2V5Q29kZSkgPSAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmgKaW5kZXggZGI2MmNkNS4uMGZkODkzMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oCkBAIC0zMSw5ICszMSwxMiBAQAogCiBjbGFzcyBQYXJjZWw7CiBjbGFzcyBTdXJmYWNlOwotY2xhc3MgSVN0cmVhbVNvdXJjZTsKK2NsYXNzIElEYXRhU291cmNlOworc3RydWN0IElTdHJlYW1Tb3VyY2U7CiBjbGFzcyBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwogc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOworc3RydWN0IEF1ZGlvUGxheWJhY2tSYXRlOworc3RydWN0IEFWU3luY1NldHRpbmdzOwogCiBjbGFzcyBJTWVkaWFQbGF5ZXI6IHB1YmxpYyBJSW50ZXJmYWNlCiB7CkBAIC00OSw2ICs1Miw3IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJU3RyZWFtU291cmNlPiYgc291cmNlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJRGF0YVNvdXJjZT4mIHNvdXJjZSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvU3VyZmFjZVRleHR1cmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBwcmVwYXJlQXN5bmMoKSA9IDA7CkBAIC01Niw2ICs2MCwxMSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN0b3AoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgcGF1c2UoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgaXNQbGF5aW5nKGJvb2wqIHN0YXRlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgcmF0ZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUqIHJhdGUgLyogbm9ubnVsbCAqLykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFN5bmNTZXR0aW5ncyhjb25zdCBBVlN5bmNTZXR0aW5ncyYgc3luYywgZmxvYXQgdmlkZW9GcHNIaW50KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzKiBzeW5jIC8qIG5vbm51bGwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB2aWRlb0ZwcyAvKiBub25udWxsICovKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2Vla1RvKGludCBtc2VjKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0Q3VycmVudFBvc2l0aW9uKGludCogbXNlYykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldER1cmF0aW9uKGludCogbXNlYykgPSAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmggYi9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaAppbmRleCA2N2I1OTlhLi5hMzE2Y2UyIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaApAQCAtNDcsOSArNDcsMTAgQEAKIHB1YmxpYzoKICAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKE1lZGlhUGxheWVyU2VydmljZSk7CiAKLSAgICB2aXJ0dWFsIHNwPElNZWRpYVJlY29yZGVyPiBjcmVhdGVNZWRpYVJlY29yZGVyKCkgPSAwOworICAgIHZpcnR1YWwgc3A8SU1lZGlhUmVjb3JkZXI+IGNyZWF0ZU1lZGlhUmVjb3JkZXIoY29uc3QgU3RyaW5nMTYgJm9wUGFja2FnZU5hbWUpID0gMDsKICAgICB2aXJ0dWFsIHNwPElNZWRpYU1ldGFkYXRhUmV0cmlldmVyPiBjcmVhdGVNZXRhZGF0YVJldHJpZXZlcigpID0gMDsKLSAgICB2aXJ0dWFsIHNwPElNZWRpYVBsYXllcj4gY3JlYXRlKGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCwgaW50IGF1ZGlvU2Vzc2lvbklkID0gMCkgPSAwOworICAgIHZpcnR1YWwgc3A8SU1lZGlhUGxheWVyPiBjcmVhdGUoY29uc3Qgc3A8SU1lZGlhUGxheWVyQ2xpZW50PiYgY2xpZW50LCBpbnQgYXVkaW9TZXNzaW9uSWQgPSAwKQorICAgICAgICAgICAgPSAwOwogCiAgICAgdmlydHVhbCBzcDxJT01YPiAgICAgICAgICAgIGdldE9NWCgpID0gMDsKICAgICB2aXJ0dWFsIHNwPElDcnlwdG8+ICAgICAgICAgbWFrZUNyeXB0bygpID0gMDsKQEAgLTY0LDggKzY1LDggQEAKICAgICAvLyBkaXNwbGF5IGNsaWVudCB3aGVuIGRpc3BsYXkgY29ubmVjdGlvbiwgZGlzY29ubmVjdGlvbiBvciBlcnJvcnMgb2NjdXIuCiAgICAgLy8gVGhlIGFzc3VtcHRpb24gaXMgdGhhdCBhdCBtb3N0IG9uZSByZW1vdGUgZGlzcGxheSB3aWxsIGJlIGNvbm5lY3RlZCB0byB0aGUKICAgICAvLyBwcm92aWRlZCBpbnRlcmZhY2UgYXQgYSB0aW1lLgotICAgIHZpcnR1YWwgc3A8SVJlbW90ZURpc3BsYXk+IGxpc3RlbkZvclJlbW90ZURpc3BsYXkoY29uc3Qgc3A8SVJlbW90ZURpc3BsYXlDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBpZmFjZSkgPSAwOworICAgIHZpcnR1YWwgc3A8SVJlbW90ZURpc3BsYXk+IGxpc3RlbkZvclJlbW90ZURpc3BsYXkoY29uc3QgU3RyaW5nMTYgJm9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICBjb25zdCBzcDxJUmVtb3RlRGlzcGxheUNsaWVudD4mIGNsaWVudCwgY29uc3QgU3RyaW5nOCYgaWZhY2UpID0gMDsKIAogICAgIC8vIGNvZGVjcyBhbmQgYXVkaW8gZGV2aWNlcyB1c2FnZSB0cmFja2luZyBmb3IgdGhlIGJhdHRlcnkgYXBwCiAgICAgZW51bSBCYXR0ZXJ5RGF0YUJpdHMgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oCmluZGV4IDNlNjc1NTAuLjc3ZWQ1ZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmgKQEAgLTI2LDYgKzI2LDcgQEAKIGNsYXNzIElDYW1lcmE7CiBjbGFzcyBJQ2FtZXJhUmVjb3JkaW5nUHJveHk7CiBjbGFzcyBJTWVkaWFSZWNvcmRlckNsaWVudDsKK2NsYXNzIElHcmFwaGljQnVmZmVyQ29uc3VtZXI7CiBjbGFzcyBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwogCiBjbGFzcyBJTWVkaWFSZWNvcmRlcjogcHVibGljIElJbnRlcmZhY2UKQEAgLTQxLDcgKzQyLDYgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dEZvcm1hdChpbnQgb2YpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvRW5jb2RlcihpbnQgdmUpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvRW5jb2RlcihpbnQgYWUpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dEZpbGUoY29uc3QgY2hhciogcGF0aCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9GcmFtZVJhdGUoaW50IGZyYW1lc19wZXJfc2Vjb25kKSA9IDA7CkBAIC01Niw2ICs1Niw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0KCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2UoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlKCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SW5wdXRTdXJmYWNlKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+JiBzdXJmYWNlKSA9IDA7CiAgICAgdmlydHVhbCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBxdWVyeVN1cmZhY2VNZWRpYVNvdXJjZSgpID0gMDsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU9NWC5oIGIvaW5jbHVkZS9tZWRpYS9JT01YLmgKaW5kZXggNTk1ZTUxZi4uMjdhZDY5NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JT01YLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JT01YLmgKQEAgLTIwLDEwICsyMCwxNSBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlckNvbnN1bWVyLmg+CiAjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKKyNpbmNsdWRlIDxsaXN0PgorCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmg+CisKICNpbmNsdWRlIDxPTVhfQ29yZS5oPgogI2luY2x1ZGUgPE9NWF9WaWRlby5oPgogCkBAIC04MCwxNCArODUsMTYgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0YXRlKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfU1RBVEVUWVBFKiBzdGF0ZSkgPSAwOwogCisgICAgLy8gVGhpcyB3aWxsIHNldCAqdHlwZSB0byBwcmV2aW91cyBtZXRhZGF0YSBidWZmZXIgdHlwZSBvbiBPTVggZXJyb3IgKG5vdCBvbiBiaW5kZXIgZXJyb3IpLCBhbmQKKyAgICAvLyBuZXcgbWV0YWRhdGEgYnVmZmVyIHR5cGUgb24gc3VjY2Vzcy4KICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMoCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlKSA9IDA7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlLCBNZXRhZGF0YUJ1ZmZlclR5cGUgKnR5cGUgPSBOVUxMKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAogICAgICAgICAgICAgT01YX1UzMiBtYXhGcmFtZVdpZHRoLCBPTVhfVTMyIG1heEZyYW1lSGVpZ2h0KSA9IDA7CiAKLSAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAorICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgdHVubmVsZWQsCiAgICAgICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSkgPSAwOwogCkBAIC05Nyw5ICsxMDQsMTAgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEdyYXBoaWNCdWZmZXJVc2FnZSgKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfVTMyKiB1c2FnZSkgPSAwOwogCisgICAgLy8gVXNlIHxwYXJhbXN8IGFzIGFuIE9NWCBidWZmZXIsIGJ1dCBsaW1pdCB0aGUgc2l6ZSBvZiB0aGUgT01YIGJ1ZmZlciB0byB8YWxsb3R0ZWRTaXplfC4KICAgICB2aXJ0dWFsIHN0YXR1c190IHVzZUJ1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAotICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIpID0gMDsKKyAgICAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyLCBPTVhfVTMyIGFsbG90dGVkU2l6ZSkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCB1c2VHcmFwaGljQnVmZmVyKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsCkBAIC0xMDksOSArMTE3LDIzIEBACiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwKICAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+ICZncmFwaGljQnVmZmVyLCBidWZmZXJfaWQgYnVmZmVyKSA9IDA7CiAKKyAgICAvLyBUaGlzIHdpbGwgc2V0ICp0eXBlIHRvIHJlc3VsdGluZyBtZXRhZGF0YSBidWZmZXIgdHlwZSBvbiBPTVggZXJyb3IgKG5vdCBvbiBiaW5kZXIgZXJyb3IpIGFzCisgICAgLy8gd2VsbCBhcyBvbiBzdWNjZXNzLgogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlSW5wdXRTdXJmYWNlKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsCi0gICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqYnVmZmVyUHJvZHVjZXIpID0gMDsKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpidWZmZXJQcm9kdWNlciwKKyAgICAgICAgICAgIE1ldGFkYXRhQnVmZmVyVHlwZSAqdHlwZSA9IE5VTEwpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlUGVyc2lzdGVudElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpidWZmZXJQcm9kdWNlciwKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+ICpidWZmZXJDb25zdW1lcikgPSAwOworCisgICAgLy8gVGhpcyB3aWxsIHNldCAqdHlwZSB0byByZXN1bHRpbmcgbWV0YWRhdGEgYnVmZmVyIHR5cGUgb24gT01YIGVycm9yIChub3Qgb24gYmluZGVyIGVycm9yKSBhcworICAgIC8vIHdlbGwgYXMgb24gc3VjY2Vzcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LAorICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gJmJ1ZmZlckNvbnN1bWVyLAorICAgICAgICAgICAgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0obm9kZV9pZCBub2RlKSA9IDA7CiAKQEAgLTEyMywyMCArMTQ1LDMyIEBACiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgc2l6ZV90IHNpemUsCiAgICAgICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlciwgdm9pZCAqKmJ1ZmZlcl9kYXRhKSA9IDA7CiAKKyAgICAvLyBBbGxvY2F0ZSBhbiBPTVggYnVmZmVyIG9mIHNpemUgfGFsbG90ZWRTaXplfC4gVXNlIHxwYXJhbXN8IGFzIHRoZSBiYWNrdXAgYnVmZmVyLCB3aGljaAorICAgIC8vIG1heSBiZSBsYXJnZXIuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcldpdGhCYWNrdXAoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKLSAgICAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyKSA9IDA7CisgICAgICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlciwgT01YX1UzMiBhbGxvdHRlZFNpemUpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZnJlZUJ1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBidWZmZXJfaWQgYnVmZmVyKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGZpbGxCdWZmZXIobm9kZV9pZCBub2RlLCBidWZmZXJfaWQgYnVmZmVyKSA9IDA7CisgICAgZW51bSB7CisgICAgICAgIGtGZW5jZVRpbWVvdXRNcyA9IDEwMDAKKyAgICB9OworICAgIC8vIENhbGxzIE9NWF9GaWxsQnVmZmVyIG9uIGJ1ZmZlciwgYW5kIHBhc3NlcyB8ZmVuY2VGZHwgdG8gY29tcG9uZW50IGlmIGl0IHN1cHBvcnRzCisgICAgLy8gZmVuY2VzLiBPdGhlcndpc2UsIGl0IHdhaXRzIG9uIHxmZW5jZUZkfCBiZWZvcmUgY2FsbGluZyBPTVhfRmlsbEJ1ZmZlci4KKyAgICAvLyBUYWtlcyBvd25lcnNoaXAgb2YgfGZlbmNlRmR8IGV2ZW4gaWYgdGhpcyBjYWxsIGZhaWxzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZmlsbEJ1ZmZlcihub2RlX2lkIG5vZGUsIGJ1ZmZlcl9pZCBidWZmZXIsIGludCBmZW5jZUZkID0gLTEpID0gMDsKIAorICAgIC8vIENhbGxzIE9NWF9FbXB0eUJ1ZmZlciBvbiBidWZmZXIgKGFmdGVyIHVwZGF0aW5nIGJ1ZmZlciBoZWFkZXIgd2l0aCB8cmFuZ2Vfb2Zmc2V0fCwKKyAgICAvLyB8cmFuZ2VfbGVuZ3RofCwgfGZsYWdzfCBhbmQgfHRpbWVzdGFtcHwpLiBQYXNzZXMgfGZlbmNlRmR8IHRvIGNvbXBvbmVudCBpZiBpdAorICAgIC8vIHN1cHBvcnRzIGZlbmNlcy4gT3RoZXJ3aXNlLCBpdCB3YWl0cyBvbiB8ZmVuY2VGZHwgYmVmb3JlIGNhbGxpbmcgT01YX0VtcHR5QnVmZmVyLgorICAgIC8vIFRha2VzIG93bmVyc2hpcCBvZiB8ZmVuY2VGZHwgZXZlbiBpZiB0aGlzIGNhbGwgZmFpbHMuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBlbXB0eUJ1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwKICAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIsCiAgICAgICAgICAgICBPTVhfVTMyIHJhbmdlX29mZnNldCwgT01YX1UzMiByYW5nZV9sZW5ndGgsCi0gICAgICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wKSA9IDA7CisgICAgICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wLCBpbnQgZmVuY2VGZCA9IC0xKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEV4dGVuc2lvbkluZGV4KAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLApAQCAtMTQ3LDYgKzE4MSw3IEBACiAgICAgICAgIElOVEVSTkFMX09QVElPTl9TVVNQRU5ELCAgLy8gZGF0YSBpcyBhIGJvb2wKICAgICAgICAgSU5URVJOQUxfT1BUSU9OX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9ERUxBWSwgIC8vIGRhdGEgaXMgYW4gaW50NjRfdAogICAgICAgICBJTlRFUk5BTF9PUFRJT05fTUFYX1RJTUVTVEFNUF9HQVAsIC8vIGRhdGEgaXMgaW50NjRfdAorICAgICAgICBJTlRFUk5BTF9PUFRJT05fTUFYX0ZQUywgLy8gZGF0YSBpcyBmbG9hdAogICAgICAgICBJTlRFUk5BTF9PUFRJT05fU1RBUlRfVElNRSwgLy8gZGF0YSBpcyBhbiBpbnQ2NF90CiAgICAgICAgIElOVEVSTkFMX09QVElPTl9USU1FX0xBUFNFLCAvLyBkYXRhIGlzIGFuIGludDY0X3RbMl0KICAgICB9OwpAQCAtMTYzLDEwICsxOTgsMTEgQEAKICAgICAgICAgRVZFTlQsCiAgICAgICAgIEVNUFRZX0JVRkZFUl9ET05FLAogICAgICAgICBGSUxMX0JVRkZFUl9ET05FLAotCisgICAgICAgIEZSQU1FX1JFTkRFUkVELAogICAgIH0gdHlwZTsKIAogICAgIElPTVg6Om5vZGVfaWQgbm9kZTsKKyAgICBpbnQgZmVuY2VGZDsgLy8gdXNlZCBmb3IgRU1QVFlfQlVGRkVSX0RPTkUgYW5kIEZJTExfQlVGRkVSX0RPTkU7IGNsaWVudCBtdXN0IGNsb3NlIHRoaXMKIAogICAgIHVuaW9uIHsKICAgICAgICAgLy8gaWYgdHlwZSA9PSBFVkVOVApAQCAtMTkwLDYgKzIyNiwxMSBAQAogICAgICAgICAgICAgT01YX1RJQ0tTIHRpbWVzdGFtcDsKICAgICAgICAgfSBleHRlbmRlZF9idWZmZXJfZGF0YTsKIAorICAgICAgICAvLyBpZiB0eXBlID09IEZSQU1FX1JFTkRFUkVECisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBPTVhfVElDS1MgdGltZXN0YW1wOworICAgICAgICAgICAgT01YX1M2NCBuYW5vVGltZTsKKyAgICAgICAgfSByZW5kZXJfZGF0YTsKICAgICB9IHU7CiB9OwogCkBAIC0xOTcsNyArMjM4LDggQEAKIHB1YmxpYzoKICAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKE9NWE9ic2VydmVyKTsKIAotICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2UoY29uc3Qgb214X21lc3NhZ2UgJm1zZykgPSAwOworICAgIC8vIEhhbmRsZSAobGlzdCBvZikgbWVzc2FnZXMuCisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZXMoY29uc3Qgc3RkOjpsaXN0PG9teF9tZXNzYWdlPiAmbWVzc2FnZXMpID0gMDsKIH07CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0yMjksNCArMjcxLDE1IEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmcoYW5kcm9pZDo6TWV0YWRhdGFCdWZmZXJUeXBlIGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBrTWV0YWRhdGFCdWZmZXJUeXBlQ2FtZXJhU291cmNlOiAgIHJldHVybiAiQ2FtZXJhU291cmNlIjsKKyAgICAgICAgY2FzZSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZTogIHJldHVybiAiR3JhbGxvY1NvdXJjZSI7CisgICAgICAgIGNhc2Uga01ldGFkYXRhQnVmZmVyVHlwZUFOV0J1ZmZlcjogICAgICByZXR1cm4gIkFOV0J1ZmZlciI7CisgICAgICAgIGNhc2Uga01ldGFkYXRhQnVmZmVyVHlwZUludmFsaWQ6ICAgICAgICByZXR1cm4gIkludmFsaWQiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKICNlbmRpZiAgLy8gQU5EUk9JRF9JT01YX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lSZXNvdXJjZU1hbmFnZXJDbGllbnQuaCBiL2luY2x1ZGUvbWVkaWEvSVJlc291cmNlTWFuYWdlckNsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMGNkODgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0lSZXNvdXJjZU1hbmFnZXJDbGllbnQuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSVJFU09VUkNFTUFOQUdFUkNMSUVOVF9ICisjZGVmaW5lIEFORFJPSURfSVJFU09VUkNFTUFOQUdFUkNMSUVOVF9ICisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIElSZXNvdXJjZU1hbmFnZXJDbGllbnQ6IHB1YmxpYyBJSW50ZXJmYWNlCit7CitwdWJsaWM6CisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShSZXNvdXJjZU1hbmFnZXJDbGllbnQpOworCisgICAgdmlydHVhbCBib29sIHJlY2xhaW1SZXNvdXJjZSgpID0gMDsKKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TmFtZSgpID0gMDsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQm5SZXNvdXJjZU1hbmFnZXJDbGllbnQ6IHB1YmxpYyBCbkludGVyZmFjZTxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PgoreworcHVibGljOgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCAqcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9JUkVTT1VSQ0VNQU5BR0VSQ0xJRU5UX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSVJlc291cmNlTWFuYWdlclNlcnZpY2UuaCBiL2luY2x1ZGUvbWVkaWEvSVJlc291cmNlTWFuYWdlclNlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTRmNmRlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9JUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9JUkVTT1VSQ0VNQU5BR0VSU0VSVklDRV9ICisjZGVmaW5lIEFORFJPSURfSVJFU09VUkNFTUFOQUdFUlNFUlZJQ0VfSAorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+ICAvLyBmb3Igc3RhdHVzX3QKKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9JUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFSZXNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhUmVzb3VyY2VQb2xpY3kuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJUmVzb3VyY2VNYW5hZ2VyU2VydmljZTogcHVibGljIElJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKFJlc291cmNlTWFuYWdlclNlcnZpY2UpOworCisgICAgdmlydHVhbCB2b2lkIGNvbmZpZyhjb25zdCBWZWN0b3I8TWVkaWFSZXNvdXJjZVBvbGljeT4gJnBvbGljaWVzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgYWRkUmVzb3VyY2UoCisgICAgICAgICAgICBpbnQgcGlkLAorICAgICAgICAgICAgaW50NjRfdCBjbGllbnRJZCwKKyAgICAgICAgICAgIGNvbnN0IHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxNZWRpYVJlc291cmNlPiAmcmVzb3VyY2VzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlUmVzb3VyY2UoaW50IHBpZCwgaW50NjRfdCBjbGllbnRJZCkgPSAwOworCisgICAgdmlydHVhbCBib29sIHJlY2xhaW1SZXNvdXJjZSgKKyAgICAgICAgICAgIGludCBjYWxsaW5nUGlkLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPE1lZGlhUmVzb3VyY2U+ICZyZXNvdXJjZXMpID0gMDsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQm5SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOiBwdWJsaWMgQm5JbnRlcmZhY2U8SVJlc291cmNlTWFuYWdlclNlcnZpY2U+Cit7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCAmZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsICpyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0lSRVNPVVJDRU1BTkFHRVJTRVJWSUNFX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSVN0cmVhbVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9JU3RyZWFtU291cmNlLmgKaW5kZXggNjc3MTE5Yi4uNGE2YWFmZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JU3RyZWFtU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JU3RyZWFtU291cmNlLmgKQEAgLTIzLDcgKzIzLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFNZXNzYWdlOwotc3RydWN0IElNZW1vcnk7CitjbGFzcyBJTWVtb3J5Owogc3RydWN0IElTdHJlYW1MaXN0ZW5lcjsKIAogc3RydWN0IElTdHJlYW1Tb3VyY2UgOiBwdWJsaWMgSUludGVyZmFjZSB7CkBAIC04MSw2ICs4MSwxMyBAQAogICAgIC8vIHdpdGggdGhlIG5leHQgUFRTIG9jY3VyaW5nIGluIHRoZSBzdHJlYW0uIFRoZSB2YWx1ZSBpcyBvZiB0eXBlIGludDY0X3QuCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGtLZXlNZWRpYVRpbWVVczsKIAorICAgIC8vIE9wdGlvbmFsbHkgc2lnbmFsbGVkIGFzIHBhcnQgb2YgYSBkaXNjb250aW51aXR5IHRoYXQgaW5jbHVkZXMKKyAgICAvLyBESVNDT05USU5VSVRZX1RJTUUuIEl0IGluZGljYXRlcyB0aGUgbWVkaWEgdGltZSAoaW4gdXMpIG9mIGEgcmVjZW50CisgICAgLy8gc2FtcGxlIGZyb20gdGhlIHNhbWUgY29udGVudCwgYW5kIGlzIHVzZWQgYXMgYSBoaW50IGZvciB0aGUgcGFyc2VyIHRvCisgICAgLy8gaGFuZGxlIFBUUyB3cmFwYXJvdW5kLiBUaGlzIGlzIHJlcXVpcmVkIHdoZW4gYSBuZXcgcGFyc2VyIGlzIGNyZWF0ZWQKKyAgICAvLyB0byBjb250aW51ZSBwYXJzaW5nIGNvbnRlbnQgZnJvbSB0aGUgc2FtZSB0aW1lbGluZS4KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qga0tleVJlY2VudE1lZGlhVGltZVVzOworCiAgICAgdmlydHVhbCB2b2lkIGlzc3VlQ29tbWFuZCgKICAgICAgICAgICAgIENvbW1hbmQgY21kLCBib29sIHN5bmNocm9ub3VzLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyA9IE5VTEwpID0gMDsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhQ29kZWNJbmZvLmggYi9pbmNsdWRlL21lZGlhL01lZGlhQ29kZWNJbmZvLmgKaW5kZXggY2Q1NmFkYi4uNDA2N2I0NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0luZm8uaApAQCAtMzIsOSArMzIsMTEgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFNZXNzYWdlOwotc3RydWN0IFBhcmNlbDsKK2NsYXNzIFBhcmNlbDsKIHN0cnVjdCBDb2RlY0NhcGFiaWxpdGllczsKIAordHlwZWRlZiBLZXllZFZlY3RvcjxBU3RyaW5nLCBBU3RyaW5nPiBDb2RlY1NldHRpbmdzOworCiBzdHJ1Y3QgTWVkaWFDb2RlY0luZm8gOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgc3RydWN0IFByb2ZpbGVMZXZlbCB7CiAgICAgICAgIHVpbnQzMl90IG1Qcm9maWxlOwpAQCAtMTA0LDYgKzEwNiw3IEBACiAgICAgTWVkaWFDb2RlY0luZm8oQVN0cmluZyBuYW1lLCBib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKm1pbWUpOwogICAgIHZvaWQgYWRkUXVpcmsoY29uc3QgY2hhciAqbmFtZSk7CiAgICAgc3RhdHVzX3QgYWRkTWltZShjb25zdCBjaGFyICptaW1lKTsKKyAgICBzdGF0dXNfdCB1cGRhdGVNaW1lKGNvbnN0IGNoYXIgKm1pbWUpOwogICAgIHN0YXR1c190IGluaXRpYWxpemVDYXBhYmlsaXRpZXMoY29uc3QgQ29kZWNDYXBhYmlsaXRpZXMgJmNhcHMpOwogICAgIHZvaWQgYWRkRGV0YWlsKGNvbnN0IEFTdHJpbmcgJmtleSwgY29uc3QgQVN0cmluZyAmdmFsdWUpOwogICAgIHZvaWQgYWRkRmVhdHVyZShjb25zdCBBU3RyaW5nICZrZXksIGludDMyX3QgdmFsdWUpOwpAQCAtMTE0LDYgKzExNyw3IEBACiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVkaWFDb2RlY0luZm8pOwogCiAgICAgZnJpZW5kIGNsYXNzIE1lZGlhQ29kZWNMaXN0OworICAgIGZyaWVuZCBjbGFzcyBNZWRpYUNvZGVjTGlzdE92ZXJyaWRlc1Rlc3Q7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmggYi9pbmNsdWRlL21lZGlhL01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UuaAppbmRleCAzOGRiYjIwLi5iY2U2ZWUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UuaApAQCAtMjUsNiArMjUsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK2NsYXNzIERhdGFTb3VyY2U7CiBzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiAKIC8vIEFic3RyYWN0IGJhc2UgY2xhc3MKQEAgLTQwLDYgKzQxLDcgQEAKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+JiBzb3VyY2UpID0gMDsKICAgICB2aXJ0dWFsIFZpZGVvRnJhbWUqIGdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uKSA9IDA7CiAgICAgdmlydHVhbCBNZWRpYUFsYnVtQXJ0KiBleHRyYWN0QWxidW1BcnQoKSA9IDA7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyKiBleHRyYWN0TWV0YWRhdGEoaW50IGtleUNvZGUpID0gMDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaAppbmRleCA0YTZiZjI4Li5kZTgyNTU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oCkBAIC0yNiw4ICsyNiwxMCBAQAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIAogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVGltZXN0YW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvQVZTeW5jU2V0dGluZ3MuaD4KICNpbmNsdWRlIDxtZWRpYS9NZXRhZGF0YS5oPgogCiAvLyBGd2QgZGVjbCB0byBtYWtlIHN1cmUgZXZlcnlvbmUgYWdyZWVzIHRoYXQgdGhlIHNjb3BlIG9mIHN0cnVjdCBzb2NrYWRkcl9pbiBpcwpAQCAtMzYsNiArMzgsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK2NsYXNzIERhdGFTb3VyY2U7CiBjbGFzcyBQYXJjZWw7CiBjbGFzcyBTdXJmYWNlOwogY2xhc3MgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKQEAgLTExMCwyMCArMTEzLDM1IEBACiAgICAgICAgICAgICAgICAgQXVkaW9DYWxsYmFjayBjYiA9IE5VTEwsCiAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llID0gTlVMTCwKICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCi0gICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCkgPSAwOworICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwsCisgICAgICAgICAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgIHVpbnQzMl90IHN1Z2dlc3RlZEZyYW1lQ291bnQgPSAwKSA9IDA7CiAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydCgpID0gMDsKLSAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICB3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSA9IDA7CisKKyAgICAgICAgLyogSW5wdXQgcGFyYW1ldGVyIHxzaXplfCBpcyBpbiBieXRlIHVuaXRzIHN0b3JlZCBpbiB8YnVmZmVyfC4KKyAgICAgICAgICogRGF0YSBpcyBjb3BpZWQgb3ZlciBhbmQgYWN0dWFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuICg+PSAwKQorICAgICAgICAgKiBpcyByZXR1cm5lZCwgb3Igbm8gZGF0YSBpcyBjb3BpZWQgYW5kIGEgbmVnYXRpdmUgc3RhdHVzIGNvZGUKKyAgICAgICAgICogaXMgcmV0dXJuZWQgKGV2ZW4gd2hlbiB8YmxvY2tpbmd8IGlzIHRydWUpLgorICAgICAgICAgKiBXaGVuIHxibG9ja2luZ3wgaXMgZmFsc2UsIEF1ZGlvU2luayB3aWxsIGltbWVkaWF0ZWx5IHJldHVybiBhZnRlcgorICAgICAgICAgKiBwYXJ0IG9mIG9yIGZ1bGwgfGJ1ZmZlcnwgaXMgY29waWVkIG92ZXIuCisgICAgICAgICAqIFdoZW4gfGJsb2NraW5nfCBpcyB0cnVlLCBBdWRpb1Npbmsgd2lsbCB3YWl0IHRvIGNvcHkgdGhlIGVudGlyZQorICAgICAgICAgKiBidWZmZXIsIHVubGVzcyBhbiBlcnJvciBvY2N1cnMgb3IgdGhlIGNvcHkgb3BlcmF0aW9uIGlzCisgICAgICAgICAqIHByZW1hdHVyZWx5IHN0b3BwZWQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgIHdyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYmxvY2tpbmcgPSB0cnVlKSA9IDA7CisKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBzdG9wKCkgPSAwOwogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGZsdXNoKCkgPSAwOwogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHBhdXNlKCkgPSAwOwogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGNsb3NlKCkgPSAwOwogCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UGxheWJhY2tSYXRlUGVybWlsbGUoaW50MzJfdCByYXRlKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgcmF0ZSkgPSAwOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldFBsYXliYWNrUmF0ZShBdWRpb1BsYXliYWNrUmF0ZSogcmF0ZSAvKiBub25udWxsICovKSA9IDA7CiAgICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgbmVlZHNUcmFpbGluZ1BhZGRpbmcoKSB7IHJldHVybiB0cnVlOyB9CiAKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpIHsgcmV0dXJuIE5PX0VSUk9SOyB9OwotICAgICAgICB2aXJ0dWFsIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cykgeyByZXR1cm4gU3RyaW5nODo6ZW1wdHkoKTsgfTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIC8qIGtleVZhbHVlUGFpcnMgKi8pIHsgcmV0dXJuIE5PX0VSUk9SOyB9CisgICAgICAgIHZpcnR1YWwgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiAvKiBrZXlzICovKSB7IHJldHVybiBTdHJpbmc4OjplbXB0eSgpOyB9CiAgICAgfTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXJCYXNlKCkgOiBtQ29va2llKDApLCBtTm90aWZ5KDApIHt9CkBAIC0xMzEsNyArMTQ5LDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRDaGVjaygpID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGhhcmR3YXJlT3V0cHV0KCkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRVSUQodWlkX3QgdWlkKSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRVSUQodWlkX3QgLyogdWlkICovKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKQEAgLTE0Miw3ICsxNjAsMTEgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXREYXRhU291cmNlKGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4mIC8qIHNvdXJjZSAqLykgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+JiAvKiBzb3VyY2UgKi8pIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApAQCAtMTU2LDYgKzE3OCwzMSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RvcCgpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHBhdXNlKCkgPSAwOwogICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNQbGF5aW5nKCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgcmF0ZSkgeworICAgICAgICAvLyBieSBkZWZhdWx0LCBwbGF5ZXJzIG9ubHkgc3VwcG9ydCBzZXR0aW5nIHJhdGUgdG8gdGhlIGRlZmF1bHQKKyAgICAgICAgaWYgKCFpc0F1ZGlvUGxheWJhY2tSYXRlRXF1YWwocmF0ZSwgQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUKSkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSogcmF0ZSAvKiBub25udWxsICovKSB7CisgICAgICAgICpyYXRlID0gQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzJiBzeW5jLCBmbG9hdCAvKiB2aWRlb0ZwcyAqLykgeworICAgICAgICAvLyBCeSBkZWZhdWx0LCBwbGF5ZXJzIG9ubHkgc3VwcG9ydCBzZXR0aW5nIHN5bmMgc291cmNlIHRvIGRlZmF1bHQ7IGFsbCBvdGhlciBzeW5jCisgICAgICAgIC8vIHNldHRpbmdzIGFyZSBpZ25vcmVkLiBUaGVyZSBpcyBubyByZXF1aXJlbWVudCBmb3IgZ2V0dGVycyB0byByZXR1cm4gc2V0IHZhbHVlcy4KKyAgICAgICAgaWYgKHN5bmMubVNvdXJjZSAhPSBBVlNZTkNfU09VUkNFX0RFRkFVTFQpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldFN5bmNTZXR0aW5ncygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTeW5jU2V0dGluZ3MqIHN5bmMgLyogbm9ubnVsbCAqLywgZmxvYXQqIHZpZGVvRnBzIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgKnN5bmMgPSBBVlN5bmNTZXR0aW5ncygpOworICAgICAgICAqdmlkZW9GcHMgPSAtMS5mOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2Vla1RvKGludCBtc2VjKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRDdXJyZW50UG9zaXRpb24oaW50ICptc2VjKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXREdXJhdGlvbihpbnQgKm1zZWMpID0gMDsKQEAgLTE2NiwxMyArMjEzLDEzIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgPSAwOwogCiAgICAgLy8gZGVmYXVsdCBuby1vcCBpbXBsZW1lbnRhdGlvbiBvZiBvcHRpb25hbCBleHRlbnNpb25zCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRSZXRyYW5zbWl0RW5kcG9pbnQoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luKiBlbmRwb2ludCkgeworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UmV0cmFuc21pdEVuZHBvaW50KGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiogLyogZW5kcG9pbnQgKi8pIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJldHJhbnNtaXRFbmRwb2ludChzdHJ1Y3Qgc29ja2FkZHJfaW4qIGVuZHBvaW50KSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZXRyYW5zbWl0RW5kcG9pbnQoc3RydWN0IHNvY2thZGRyX2luKiAvKiBlbmRwb2ludCAqLykgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TmV4dFBsYXllcihjb25zdCBzcDxNZWRpYVBsYXllckJhc2U+JiBuZXh0KSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXROZXh0UGxheWVyKGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZT4mIC8qIG5leHQgKi8pIHsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIApAQCAtMTkyLDggKzIzOSw4IEBACiAgICAgLy8gICAgICAgICAgICB0aGUga25vd24gbWV0YWRhdGEgc2hvdWxkIGJlIHJldHVybmVkLgogICAgIC8vIEBwYXJhbVtpbm91dF0gcmVjb3JkcyBQYXJjZWwgd2hlcmUgdGhlIHBsYXllciBhcHBlbmRzIGl0cyBtZXRhZGF0YS4KICAgICAvLyBAcmV0dXJuIE9LIGlmIHRoZSBjYWxsIHdhcyBzdWNjZXNzZnVsLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0TWV0YWRhdGEoY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXImIGlkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCAqcmVjb3JkcykgeworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0TWV0YWRhdGEoY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXImIC8qIGlkcyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogLyogcmVjb3JkcyAqLykgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfTsKIApAQCAtMjE2LDcgKzI2Myw3IEBACiAgICAgICAgIGlmIChub3RpZnlDQikgbm90aWZ5Q0IoY29va2llLCBtc2csIGV4dDEsIGV4dDIsIG9iaik7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3QgeworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgLyogZmQgKi8sIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIC8qIGFyZ3MgKi8pIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmggYi9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaAppbmRleCBmMDYxZDIyLi5lMDI5MThmIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaApAQCAtNTgsMjQgKzU4LDYgQEAKICAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0xJU1RfRU5EID0gMjAwNSwKIH07CiAKLS8qKgotICogU2V0IENJRiBhcyBkZWZhdWx0IG1heGltdW0gaW1wb3J0IGFuZCBleHBvcnQgcmVzb2x1dGlvbiBvZiB2aWRlbyBlZGl0b3IuCi0gKiBUaGUgbWF4aW11bSBpbXBvcnQgYW5kIGV4cG9ydCByZXNvbHV0aW9ucyBhcmUgcGxhdGZvcm0gc3BlY2lmaWMsCi0gKiB3aGljaCBzaG91bGQgYmUgZGVmaW5lZCBpbiBtZWRpYV9wcm9maWxlcy54bWwuCi0gKiBTZXQgZGVmYXVsdCBtYXhpbXVtIHByZWZldGNoIFlVViBmcmFtZXMgdG8gNiwgd2hpY2ggbWVhbnMgdmlkZW8gZWRpdG9yIGNhbgotICogcXVldWUgdXAgdG8gNiBZVVYgZnJhbWVzIGluIHRoZSB2aWRlbyBlbmNvZGVyIHNvdXJjZS4KLSAqIFRoaXMgdmFsdWUgaXMgdXNlZCB0byBsaW1pdCB0aGUgYW1vdW50IG9mIG1lbW9yeSB1c2VkIGJ5IHZpZGVvIGVkaXRvcgotICogZW5naW5lIHdoZW4gdGhlIGVuY29kZXIgY29uc3VtZXMgWVVWIGZyYW1lcyBhdCBhIGxvd2VyIHNwZWVkCi0gKiB0aGFuIHZpZGVvIGVkaXRvciBlbmdpbmUgcHJvZHVjZXMuCi0gKi8KLWVudW0gdmlkZW9lZGl0b3JfY2FwYWJpbGl0eSB7Ci0gICAgVklERU9FRElUT1JfREVGQVVMVF9NQVhfSU5QVVRfRlJBTUVfV0lEVEggPSAzNTIsCi0gICAgVklERU9FRElUT1JfREVGVUFMVF9NQVhfSU5QVVRfRlJBTUVfSEVJR0hUID0gMjg4LAotICAgIFZJREVPRURJVE9SX0RFRkFVTFRfTUFYX09VVFBVVF9GUkFNRV9XSURUSCA9IDM1MiwKLSAgICBWSURFT0VESVRPUl9ERUZVQUxUX01BWF9PVVRQVVRfRlJBTUVfSEVJR0hUID0gMjg4LAotICAgIFZJREVPRURJVE9SX0RFRkFVTFRfTUFYX1BSRUZFVENIX1lVVl9GUkFNRVMgPSA2Ci19OwotCiBlbnVtIHZpZGVvX2RlY29kZXIgewogICAgIFZJREVPX0RFQ09ERVJfV01WLAogfTsKQEAgLTE0OCwzMiArMTMwLDYgQEAKICAgICBpbnQgZ2V0VmlkZW9FbmNvZGVyUGFyYW1CeU5hbWUoY29uc3QgY2hhciAqbmFtZSwgdmlkZW9fZW5jb2RlciBjb2RlYykgY29uc3Q7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHBhcmFtIG5hbWUgZm9yIHRoZSB2aWRlbyBlZGl0b3IgY2FwCi0gICAgICogcGFyYW0gb3IgLTEgaWYgZXJyb3IuCi0gICAgICogU3VwcG9ydGVkIHBhcmFtIG5hbWUgYXJlOgotICAgICAqIHZpZGVvZWRpdG9yLmlucHV0LndpZHRoLm1heCAtIG1heCBpbnB1dCB2aWRlbyBmcmFtZSB3aWR0aAotICAgICAqIHZpZGVvZWRpdG9yLmlucHV0LmhlaWdodC5tYXggLSBtYXggaW5wdXQgdmlkZW8gZnJhbWUgaGVpZ2h0Ci0gICAgICogdmlkZW9lZGl0b3Iub3V0cHV0LndpZHRoLm1heCAtIG1heCBvdXRwdXQgdmlkZW8gZnJhbWUgd2lkdGgKLSAgICAgKiB2aWRlb2VkaXRvci5vdXRwdXQuaGVpZ2h0Lm1heCAtIG1heCBvdXRwdXQgdmlkZW8gZnJhbWUgaGVpZ2h0Ci0gICAgICogbWF4UHJlZmV0Y2hZVVZGcmFtZXMgLSBtYXggcHJlZmV0Y2ggWVVWIGZyYW1lcyBpbiB2aWRlbyBlZGl0b3IgZW5naW5lLiBUaGlzIHZhbHVlIGlzIHVzZWQKLSAgICAgKiB0byBsaW1pdCB0aGUgbWVtb3J5IGNvbnN1bXB0aW9uLgotICAgICAqLwotICAgIGludCBnZXRWaWRlb0VkaXRvckNhcFBhcmFtQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBwYXJhbSBuYW1lIGZvciB0aGUgdmlkZW8gZWRpdG9yIGV4cG9ydCBjb2RlYyBmb3JtYXQKLSAgICAgKiBwYXJhbSBvciAtMSBpZiBlcnJvci4KLSAgICAgKiBTdXBwb3J0ZWQgcGFyYW0gbmFtZSBhcmU6Ci0gICAgICogdmlkZW9lZGl0b3IuZXhwb3J0LnByb2ZpbGUgLSBleHBvcnQgdmlkZW8gcHJvZmlsZQotICAgICAqIHZpZGVvZWRpdG9yLmV4cG9ydC5sZXZlbCAtIGV4cG9ydCB2aWRlbyBsZXZlbAotICAgICAqIFN1cHBvcnRlZCBwYXJhbSBjb2RlYyBhcmU6Ci0gICAgICogMSBmb3IgaDI2MwotICAgICAqIDIgZm9yIGgyNjQKLSAgICAgKiAzIGZvciBtcGVnNAotICAgICAqLwotICAgIGludCBnZXRWaWRlb0VkaXRvckV4cG9ydFBhcmFtQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUsIGludCBjb2RlYykgY29uc3Q7Ci0KLSAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBhdWRpbyBlbmNvZGVycyBzdXBwb3J0ZWQuCiAgICAgICovCiAgICAgVmVjdG9yPGF1ZGlvX2VuY29kZXI+IGdldEF1ZGlvRW5jb2RlcnMoKSBjb25zdDsKQEAgLTIyMSw3ICsxNzcsNyBAQAogCiAgICAgTWVkaWFQcm9maWxlcyYgb3BlcmF0b3I9KGNvbnN0IE1lZGlhUHJvZmlsZXMmKTsgIC8vIERvbid0IGNhbGwgbWUKICAgICBNZWRpYVByb2ZpbGVzKGNvbnN0IE1lZGlhUHJvZmlsZXMmKTsgICAgICAgICAgICAgLy8gRG9uJ3QgY2FsbCBtZQotICAgIE1lZGlhUHJvZmlsZXMoKSB7IG1WaWRlb0VkaXRvckNhcCA9IE5VTEw7IH0gICAgICAgIC8vIER1bW15IGRlZmF1bHQgY29uc3RydWN0b3IKKyAgICBNZWRpYVByb2ZpbGVzKCkge30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRHVtbXkgZGVmYXVsdCBjb25zdHJ1Y3RvcgogICAgIH5NZWRpYVByb2ZpbGVzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBkZWxldGUgbWUKIAogICAgIHN0cnVjdCBWaWRlb0NvZGVjIHsKQEAgLTM2NiwzMSArMzIyLDYgQEAKICAgICAgICAgaW50IG1DYW1lcmFJZDsKICAgICAgICAgVmVjdG9yPGludD4gbUxldmVsczsKICAgICB9OwotICAgIHN0cnVjdCBFeHBvcnRWaWRlb1Byb2ZpbGUgewotICAgICAgICBFeHBvcnRWaWRlb1Byb2ZpbGUoaW50IGNvZGVjLCBpbnQgcHJvZmlsZSwgaW50IGxldmVsKQotICAgICAgICAgICAgOm1Db2RlYyhjb2RlYyksbVByb2ZpbGUocHJvZmlsZSksbUxldmVsKGxldmVsKSB7fQotICAgICAgICB+RXhwb3J0VmlkZW9Qcm9maWxlKCkge30KLSAgICAgICAgaW50IG1Db2RlYzsKLSAgICAgICAgaW50IG1Qcm9maWxlOwotICAgICAgICBpbnQgbUxldmVsOwotICAgIH07Ci0gICAgc3RydWN0IFZpZGVvRWRpdG9yQ2FwIHsKLSAgICAgICAgVmlkZW9FZGl0b3JDYXAoaW50IGluRnJhbWVXaWR0aCwgaW50IGluRnJhbWVIZWlnaHQsCi0gICAgICAgICAgICBpbnQgb3V0RnJhbWVXaWR0aCwgaW50IG91dEZyYW1lSGVpZ2h0LCBpbnQgZnJhbWVzKQotICAgICAgICAgICAgOiBtTWF4SW5wdXRGcmFtZVdpZHRoKGluRnJhbWVXaWR0aCksCi0gICAgICAgICAgICAgIG1NYXhJbnB1dEZyYW1lSGVpZ2h0KGluRnJhbWVIZWlnaHQpLAotICAgICAgICAgICAgICBtTWF4T3V0cHV0RnJhbWVXaWR0aChvdXRGcmFtZVdpZHRoKSwKLSAgICAgICAgICAgICAgbU1heE91dHB1dEZyYW1lSGVpZ2h0KG91dEZyYW1lSGVpZ2h0KSwKLSAgICAgICAgICAgICAgbU1heFByZWZldGNoWVVWRnJhbWVzKGZyYW1lcykge30KLQotICAgICAgICB+VmlkZW9FZGl0b3JDYXAoKSB7fQotCi0gICAgICAgIGludCBtTWF4SW5wdXRGcmFtZVdpZHRoOwotICAgICAgICBpbnQgbU1heElucHV0RnJhbWVIZWlnaHQ7Ci0gICAgICAgIGludCBtTWF4T3V0cHV0RnJhbWVXaWR0aDsKLSAgICAgICAgaW50IG1NYXhPdXRwdXRGcmFtZUhlaWdodDsKLSAgICAgICAgaW50IG1NYXhQcmVmZXRjaFlVVkZyYW1lczsKLSAgICB9OwogCiAgICAgaW50IGdldENhbWNvcmRlclByb2ZpbGVJbmRleChpbnQgY2FtZXJhSWQsIGNhbWNvcmRlcl9xdWFsaXR5IHF1YWxpdHkpIGNvbnN0OwogICAgIHZvaWQgaW5pdFJlcXVpcmVkUHJvZmlsZVJlZnMoY29uc3QgVmVjdG9yPGludD4mIGNhbWVyYUlkcyk7CkBAIC00MDMsNyArMzM0LDYgQEAKICAgICBzdGF0aWMgdm9pZCBsb2dBdWRpb0VuY29kZXJDYXAoY29uc3QgQXVkaW9FbmNvZGVyQ2FwJiBjYXApOwogICAgIHN0YXRpYyB2b2lkIGxvZ1ZpZGVvRGVjb2RlckNhcChjb25zdCBWaWRlb0RlY29kZXJDYXAmIGNhcCk7CiAgICAgc3RhdGljIHZvaWQgbG9nQXVkaW9EZWNvZGVyQ2FwKGNvbnN0IEF1ZGlvRGVjb2RlckNhcCYgY2FwKTsKLSAgICBzdGF0aWMgdm9pZCBsb2dWaWRlb0VkaXRvckNhcChjb25zdCBWaWRlb0VkaXRvckNhcCYgY2FwKTsKIAogICAgIC8vIElmIHRoZSB4bWwgY29uZmlndXJhdGlvbiBmaWxlIGRvZXMgZXhpc3QsIHVzZSB0aGUgc2V0dGluZ3MKICAgICAvLyBmcm9tIHRoZSB4bWwKQEAgLTQxNSw5ICszNDUsNiBAQAogICAgIHN0YXRpYyBWaWRlb0RlY29kZXJDYXAqIGNyZWF0ZVZpZGVvRGVjb2RlckNhcChjb25zdCBjaGFyICoqYXR0cyk7CiAgICAgc3RhdGljIFZpZGVvRW5jb2RlckNhcCogY3JlYXRlVmlkZW9FbmNvZGVyQ2FwKGNvbnN0IGNoYXIgKiphdHRzKTsKICAgICBzdGF0aWMgQXVkaW9FbmNvZGVyQ2FwKiBjcmVhdGVBdWRpb0VuY29kZXJDYXAoY29uc3QgY2hhciAqKmF0dHMpOwotICAgIHN0YXRpYyBWaWRlb0VkaXRvckNhcCogY3JlYXRlVmlkZW9FZGl0b3JDYXAoCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmF0dHMsIE1lZGlhUHJvZmlsZXMgKnByb2ZpbGVzKTsKLSAgICBzdGF0aWMgRXhwb3J0VmlkZW9Qcm9maWxlKiBjcmVhdGVFeHBvcnRWaWRlb1Byb2ZpbGUoY29uc3QgY2hhciAqKmF0dHMpOwogCiAgICAgc3RhdGljIENhbWNvcmRlclByb2ZpbGUqIGNyZWF0ZUNhbWNvcmRlclByb2ZpbGUoCiAgICAgICAgICAgICAgICAgaW50IGNhbWVyYUlkLCBjb25zdCBjaGFyICoqYXR0cywgVmVjdG9yPGludD4mIGNhbWVyYUlkcyk7CkBAIC00NjEsOCArMzg4LDYgQEAKICAgICBzdGF0aWMgdm9pZCBjcmVhdGVEZWZhdWx0RW5jb2Rlck91dHB1dEZpbGVGb3JtYXRzKE1lZGlhUHJvZmlsZXMgKnByb2ZpbGVzKTsKICAgICBzdGF0aWMgdm9pZCBjcmVhdGVEZWZhdWx0SW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMoTWVkaWFQcm9maWxlcyAqcHJvZmlsZXMpOwogICAgIHN0YXRpYyB2b2lkIGNyZWF0ZURlZmF1bHRJbWFnZURlY29kaW5nTWF4TWVtb3J5KE1lZGlhUHJvZmlsZXMgKnByb2ZpbGVzKTsKLSAgICBzdGF0aWMgdm9pZCBjcmVhdGVEZWZhdWx0VmlkZW9FZGl0b3JDYXAoTWVkaWFQcm9maWxlcyAqcHJvZmlsZXMpOwotICAgIHN0YXRpYyB2b2lkIGNyZWF0ZURlZmF1bHRFeHBvcnRWaWRlb1Byb2ZpbGVzKE1lZGlhUHJvZmlsZXMgKnByb2ZpbGVzKTsKIAogICAgIHN0YXRpYyBWaWRlb0VuY29kZXJDYXAqIGNyZWF0ZURlZmF1bHRIMjYzVmlkZW9FbmNvZGVyQ2FwKCk7CiAgICAgc3RhdGljIFZpZGVvRW5jb2RlckNhcCogY3JlYXRlRGVmYXVsdE00dlZpZGVvRW5jb2RlckNhcCgpOwpAQCAtNTIwLDggKzQ0NSw2IEBACiAKICAgICBSZXF1aXJlZFByb2ZpbGVzICptUmVxdWlyZWRQcm9maWxlUmVmczsKICAgICBWZWN0b3I8aW50PiAgICAgICAgICAgICAgbUNhbWVyYUlkczsKLSAgICBWaWRlb0VkaXRvckNhcCogbVZpZGVvRWRpdG9yQ2FwOwotICAgIFZlY3RvcjxFeHBvcnRWaWRlb1Byb2ZpbGUqPiBtVmlkZW9FZGl0b3JFeHBvcnRQcm9maWxlczsKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmggYi9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmgKaW5kZXggZDdhYzMwMi4uZDZjYzRiYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaApAQCAtMjYsMTAgKzI2LDEyIEBACiAKIGNsYXNzIElDYW1lcmFSZWNvcmRpbmdQcm94eTsKIGNsYXNzIFN1cmZhY2U7CitjbGFzcyBJR3JhcGhpY0J1ZmZlckNvbnN1bWVyOwogY2xhc3MgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKIAogc3RydWN0IE1lZGlhUmVjb3JkZXJCYXNlIHsKLSAgICBNZWRpYVJlY29yZGVyQmFzZSgpIHt9CisgICAgTWVkaWFSZWNvcmRlckJhc2UoY29uc3QgU3RyaW5nMTYgJm9wUGFja2FnZU5hbWUpCisgICAgICAgIDogbU9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSkge30KICAgICB2aXJ0dWFsIH5NZWRpYVJlY29yZGVyQmFzZSgpIHt9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXQoKSA9IDA7CkBAIC00Myw3ICs0NSw2IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYW1lcmEoY29uc3Qgc3A8SUNhbWVyYT4mIGNhbWVyYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQ2FtZXJhUmVjb3JkaW5nUHJveHk+JiBwcm94eSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dEZpbGUoY29uc3QgY2hhciAqcGF0aCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZUF1eGlsaWFyeShpbnQgZmQpIHtyZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047fQogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMpID0gMDsKQEAgLTU2LDggKzU3LDEzIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXNldCgpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1heEFtcGxpdHVkZShpbnQgKm1heCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldElucHV0U3VyZmFjZShjb25zdCBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiYgc3VyZmFjZSkgPSAwOwogICAgIHZpcnR1YWwgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcXVlcnlTdXJmYWNlTWVkaWFTb3VyY2UoKSBjb25zdCA9IDA7CiAKKworcHJvdGVjdGVkOgorICAgIFN0cmluZzE2IG1PcFBhY2thZ2VOYW1lOworCiBwcml2YXRlOgogICAgIE1lZGlhUmVjb3JkZXJCYXNlKGNvbnN0IE1lZGlhUmVjb3JkZXJCYXNlICYpOwogICAgIE1lZGlhUmVjb3JkZXJCYXNlICZvcGVyYXRvcj0oY29uc3QgTWVkaWFSZWNvcmRlckJhc2UgJik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhUmVzb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFSZXNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZjJjYWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhUmVzb3VyY2UuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9SRVNPVVJDRV9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfUkVTT1VSQ0VfSAorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitleHRlcm4gY29uc3QgY2hhciBrUmVzb3VyY2VTZWN1cmVDb2RlY1tdOworZXh0ZXJuIGNvbnN0IGNoYXIga1Jlc291cmNlTm9uU2VjdXJlQ29kZWNbXTsKK2V4dGVybiBjb25zdCBjaGFyIGtSZXNvdXJjZUF1ZGlvQ29kZWNbXTsKK2V4dGVybiBjb25zdCBjaGFyIGtSZXNvdXJjZVZpZGVvQ29kZWNbXTsKK2V4dGVybiBjb25zdCBjaGFyIGtSZXNvdXJjZUdyYXBoaWNNZW1vcnlbXTsKKworY2xhc3MgTWVkaWFSZXNvdXJjZSB7CitwdWJsaWM6CisgICAgTWVkaWFSZXNvdXJjZSgpOworICAgIE1lZGlhUmVzb3VyY2UoU3RyaW5nOCB0eXBlLCB1aW50NjRfdCB2YWx1ZSk7CisgICAgTWVkaWFSZXNvdXJjZShTdHJpbmc4IHR5cGUsIFN0cmluZzggc3ViVHlwZSwgdWludDY0X3QgdmFsdWUpOworCisgICAgdm9pZCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCk7CisgICAgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdDsKKworICAgIFN0cmluZzggdG9TdHJpbmcoKSBjb25zdDsKKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNZWRpYVJlc291cmNlICZvdGhlcikgY29uc3Q7CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1lZGlhUmVzb3VyY2UgJm90aGVyKSBjb25zdDsKKworICAgIFN0cmluZzggbVR5cGU7CisgICAgU3RyaW5nOCBtU3ViVHlwZTsKKyAgICB1aW50NjRfdCBtVmFsdWU7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfUkVTT1VSQ0VfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlc291cmNlUG9saWN5LmggYi9pbmNsdWRlL21lZGlhL01lZGlhUmVzb3VyY2VQb2xpY3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmMyZWVjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVJlc291cmNlUG9saWN5LmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaWZuZGVmIEFORFJPSURfTUVESUFfUkVTT1VSQ0VfUE9MSUNZX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9SRVNPVVJDRV9QT0xJQ1lfSAorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitleHRlcm4gY29uc3QgY2hhciBrUG9saWN5U3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjc1tdOworZXh0ZXJuIGNvbnN0IGNoYXIga1BvbGljeVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjW107CisKK2NsYXNzIE1lZGlhUmVzb3VyY2VQb2xpY3kgeworcHVibGljOgorICAgIE1lZGlhUmVzb3VyY2VQb2xpY3koKTsKKyAgICBNZWRpYVJlc291cmNlUG9saWN5KFN0cmluZzggdHlwZSwgU3RyaW5nOCB2YWx1ZSk7CisKKyAgICB2b2lkIHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKTsKKyAgICB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0OworCisgICAgU3RyaW5nOCB0b1N0cmluZygpIGNvbnN0OworCisgICAgU3RyaW5nOCBtVHlwZTsKKyAgICBTdHJpbmc4IG1WYWx1ZTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9SRVNPVVJDRV9QT0xJQ1lfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9SaW5nQnVmZmVyLmggYi9pbmNsdWRlL21lZGlhL1JpbmdCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjdjMDBlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9SaW5nQnVmZmVyLmgKQEAgLTAsMCArMSwzNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWSUNFX1VUSUxTX1JJTkdfQlVGRkVSX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWSUNFX1VUSUxTX1JJTkdfQlVGRkVSX0gKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorCisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBBIFJpbmdCdWZmZXIgY2xhc3MgdGhhdCBtYWludGFpbnMgYW4gYXJyYXkgb2Ygb2JqZWN0cyB0aGF0IGNhbiBncm93IHVwIHRvIGEgY2VydGFpbiBzaXplLgorICogRWxlbWVudHMgYWRkZWQgdG8gdGhlIFJpbmdCdWZmZXIgYXJlIGluc2VydGVkIGluIHRoZSBsb2dpY2FsIGZyb250IG9mIHRoZSBidWZmZXIsIGFuZAorICogaW52YWxpZGF0ZSBhbGwgY3VycmVudCBpdGVyYXRvcnMgZm9yIHRoYXQgUmluZ0J1ZmZlciBvYmplY3QuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUPgorY2xhc3MgUmluZ0J1ZmZlciBmaW5hbCB7CitwdWJsaWM6CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBSaW5nQnVmZmVyIHRoYXQgY2FuIGdyb3cgdXAgdG8gdGhlIGdpdmVuIGxlbmd0aC4KKyAgICAgKi8KKyAgICBSaW5nQnVmZmVyKHNpemVfdCBsZW5ndGgpOworCisgICAgLyoqCisgICAgICogRm9yd2FyZCBpdGVyYXRvciB0byB0aGlzIGNsYXNzLiAgSW1wbGVtZW50cyBhbiBzdGQ6Zm9yd2FyZF9pdGVyYXRvci4KKyAgICAgKi8KKyAgICBjbGFzcyBpdGVyYXRvciA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIFQ+IHsKKyAgICBwdWJsaWM6CisgICAgICAgIGl0ZXJhdG9yKFQqIHB0ciwgc2l6ZV90IHNpemUsIHNpemVfdCBwb3MsIHNpemVfdCBjdHIpOworCisgICAgICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCk7CisKKyAgICAgICAgaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpOworCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgcmhzKTsKKworICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3ImIHJocyk7CisKKyAgICAgICAgVCYgb3BlcmF0b3IqKCk7CisKKyAgICAgICAgVCogb3BlcmF0b3ItPigpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgVCogbVB0cjsKKyAgICAgICAgc2l6ZV90IG1TaXplOworICAgICAgICBzaXplX3QgbVBvczsKKyAgICAgICAgc2l6ZV90IG1DdHI7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZvcndhcmQgaXRlcmF0b3IgdG8gdGhpcyBjbGFzcy4gIEltcGxlbWVudHMgYW4gc3RkOmZvcndhcmRfaXRlcmF0b3IuCisgICAgICovCisgICAgY2xhc3MgY29uc3RfaXRlcmF0b3IgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBUPiB7CisgICAgcHVibGljOgorICAgICAgICBjb25zdF9pdGVyYXRvcihjb25zdCBUKiBwdHIsIHNpemVfdCBzaXplLCBzaXplX3QgcG9zLCBzaXplX3QgY3RyKTsKKworICAgICAgICBjb25zdF9pdGVyYXRvciYgb3BlcmF0b3IrKygpOworCisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KTsKKworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgY29uc3RfaXRlcmF0b3ImIHJocyk7CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiByaHMpOworCisgICAgICAgIGNvbnN0IFQmIG9wZXJhdG9yKigpOworCisgICAgICAgIGNvbnN0IFQqIG9wZXJhdG9yLT4oKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IFQqIG1QdHI7CisgICAgICAgIHNpemVfdCBtU2l6ZTsKKyAgICAgICAgc2l6ZV90IG1Qb3M7CisgICAgICAgIHNpemVfdCBtQ3RyOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGl0ZW0gdG8gdGhlIGZyb250IG9mIHRoaXMgUmluZ0J1ZmZlci4gIElmIHRoZSBSaW5nQnVmZmVyIGlzIGF0IGl0cyBtYXhpbXVtIGxlbmd0aCwKKyAgICAgKiB0aGlzIHdpbGwgcmVzdWx0IGluIHRoZSBsYXN0IGVsZW1lbnQgYmVpbmcgcmVwbGFjZWQgKHRoaXMgaXMgZG9uZSB1c2luZyB0aGUgZWxlbWVudCdzCisgICAgICogYXNzaWdubWVudCBvcGVyYXRvcikuCisgICAgICoKKyAgICAgKiBBbGwgY3VycmVudCBpdGVyYXRvcnMgYXJlIGludmFsaWRhdGVkLgorICAgICAqLworICAgIHZvaWQgYWRkKGNvbnN0IFQmIGl0ZW0pOworCisgICAgLyoqCisgICAgICogTW92ZXMgaXRlbSB0byB0aGUgZnJvbnQgb2YgdGhpcyBSaW5nQnVmZmVyLiAgRm9sbG93aW5nIGEgY2FsbCB0byB0aGlzLCBpdGVtIHNob3VsZCBubworICAgICAqIGxvbmdlciBiZSB1c2VkLiAgSWYgdGhlIFJpbmdCdWZmZXIgaXMgYXQgaXRzIG1heGltdW0gbGVuZ3RoLCB0aGlzIHdpbGwgcmVzdWx0IGluIHRoZQorICAgICAqIGxhc3QgZWxlbWVudCBiZWluZyByZXBsYWNlZCAodGhpcyBpcyBkb25lIHVzaW5nIHRoZSBlbGVtZW50J3MgYXNzaWdubWVudCBvcGVyYXRvcikuCisgICAgICoKKyAgICAgKiBBbGwgY3VycmVudCBpdGVyYXRvcnMgYXJlIGludmFsaWRhdGVkLgorICAgICAqLworICAgIHZvaWQgYWRkKFQmJiBpdGVtKTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBpdGVtIGluLXBsYWNlIGluIHRoZSBmcm9udCBvZiB0aGlzIFJpbmdCdWZmZXIgdXNpbmcgdGhlIGdpdmVuIGFyZ3VtZW50cy4gIElmCisgICAgICogdGhlIFJpbmdCdWZmZXIgaXMgYXQgaXRzIG1heGltdW0gbGVuZ3RoLCB0aGlzIHdpbGwgcmVzdWx0IGluIHRoZSBsYXN0IGVsZW1lbnQgYmVpbmcKKyAgICAgKiByZXBsYWNlZCAodGhpcyBpcyBkb25lIHVzaW5nIHRoZSBlbGVtZW50J3MgYXNzaWdubWVudCBvcGVyYXRvcikuCisgICAgICoKKyAgICAgKiBBbGwgY3VycmVudCBpdGVyYXRvcnMgYXJlIGludmFsaWRhdGVkLgorICAgICAqLworICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPgorICAgIHZvaWQgZW1wbGFjZShBcmdzJiYuLi4gYXJncyk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYW4gaXRlcmF0b3IgdG8gdGhlIGZyb250IG9mIHRoaXMgUmluZ0J1ZmZlci4KKyAgICAgKi8KKyAgICBpdGVyYXRvciBiZWdpbigpOworCisgICAgLyoqCisgICAgICogR2V0IGFuIGl0ZXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhpcyBSaW5nQnVmZmVyLgorICAgICAqLworICAgIGl0ZXJhdG9yIGVuZCgpOworCisgICAgLyoqCisgICAgICogR2V0IGEgY29uc3RfaXRlcmF0b3IgdG8gdGhlIGZyb250IG9mIHRoaXMgUmluZ0J1ZmZlci4KKyAgICAgKi8KKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0OworCisgICAgLyoqCisgICAgICogR2V0IGEgY29uc3RfaXRlcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGlzIFJpbmdCdWZmZXIuCisgICAgICovCisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgYXQgYSBnaXZlbiBpbmRleC4gIElmIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UgZm9yCisgICAgICogdGhpcyByaW5nYnVmZmVyLCBbMCwgc2l6ZSksIHRoZSBiZWhhdmlvciBmb3IgdGhpcyBpcyB1bmRlZmluZWQuCisgICAgICovCisgICAgVCYgb3BlcmF0b3JbXShzaXplX3QgaW5kZXgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IGF0IGEgZ2l2ZW4gaW5kZXguICBJZiB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlCisgICAgICogZm9yIHRoaXMgcmluZ2J1ZmZlciwgWzAsIHNpemUpLCB0aGUgYmVoYXZpb3IgZm9yIHRoaXMgaXMgdW5kZWZpbmVkLgorICAgICAqLworICAgIGNvbnN0IFQmIG9wZXJhdG9yW10oc2l6ZV90IGluZGV4KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCBzaXplIG9mIHRoaXMgUmluZ0J1ZmZlci4KKyAgICAgKi8KKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFsbCBlbGVtZW50cyBmcm9tIHRoaXMgUmluZ0J1ZmZlciBhbmQgc2V0IHRoZSBzaXplIHRvIDAuCisgICAgICovCisgICAgdm9pZCBjbGVhcigpOworCitwcml2YXRlOgorICAgIHNpemVfdCBtRnJvbnRJZHg7CisgICAgc2l6ZV90IG1NYXhCdWZmZXJTaXplOworICAgIHN0ZDo6dmVjdG9yPFQ+IG1CdWZmZXI7Cit9OyAvLyBjbGFzcyBSaW5nQnVmZmVyCisKKwordGVtcGxhdGUgPGNsYXNzIFQ+CitSaW5nQnVmZmVyPFQ+OjpSaW5nQnVmZmVyKHNpemVfdCBsZW5ndGgpIDogbUZyb250SWR4ezB9LCBtTWF4QnVmZmVyU2l6ZXtsZW5ndGh9IHt9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorUmluZ0J1ZmZlcjxUPjo6aXRlcmF0b3I6Oml0ZXJhdG9yKFQqIHB0ciwgc2l6ZV90IHNpemUsIHNpemVfdCBwb3MsIHNpemVfdCBjdHIpIDoKKyAgICAgICAgbVB0cntwdHJ9LCBtU2l6ZXtzaXplfSwgbVBvc3twb3N9LCBtQ3Rye2N0cn0ge30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Cit0eXBlbmFtZSBSaW5nQnVmZmVyPFQ+OjppdGVyYXRvciYgUmluZ0J1ZmZlcjxUPjo6aXRlcmF0b3I6Om9wZXJhdG9yKysoKSB7CisgICAgKyttQ3RyOworCisgICAgaWYgKENDX1VOTElLRUxZKG1DdHIgPT0gbVNpemUpKSB7CisgICAgICAgIG1Qb3MgPSBtU2l6ZTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG1Qb3MgPSAoKENDX1VOTElLRUxZKG1Qb3MgPT0gMCkpID8gbVNpemUgLSAxIDogbVBvcyAtIDEpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Cit0eXBlbmFtZSBSaW5nQnVmZmVyPFQ+OjppdGVyYXRvciBSaW5nQnVmZmVyPFQ+OjppdGVyYXRvcjo6b3BlcmF0b3IrKyhpbnQpIHsKKyAgICBpdGVyYXRvciB0bXB7bVB0ciwgbVNpemUsIG1Qb3MsIG1DdHJ9OworICAgICsrKCp0aGlzKTsKKyAgICByZXR1cm4gdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2Jvb2wgUmluZ0J1ZmZlcjxUPjo6aXRlcmF0b3I6Om9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIHJocykgeworICAgIHJldHVybiAobVB0ciArIG1Qb3MpID09IChyaHMubVB0ciArIHJocy5tUG9zKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Citib29sIFJpbmdCdWZmZXI8VD46Oml0ZXJhdG9yOjpvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiByaHMpIHsKKyAgICByZXR1cm4gKG1QdHIgKyBtUG9zKSAhPSAocmhzLm1QdHIgKyByaHMubVBvcyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorVCYgUmluZ0J1ZmZlcjxUPjo6aXRlcmF0b3I6Om9wZXJhdG9yKigpIHsKKyAgICByZXR1cm4gKihtUHRyICsgbVBvcyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorVCogUmluZ0J1ZmZlcjxUPjo6aXRlcmF0b3I6Om9wZXJhdG9yLT4oKSB7CisgICAgcmV0dXJuIG1QdHIgKyBtUG9zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK1JpbmdCdWZmZXI8VD46OmNvbnN0X2l0ZXJhdG9yOjpjb25zdF9pdGVyYXRvcihjb25zdCBUKiBwdHIsIHNpemVfdCBzaXplLCBzaXplX3QgcG9zLCBzaXplX3QgY3RyKSA6CisgICAgICAgIG1QdHJ7cHRyfSwgbVNpemV7c2l6ZX0sIG1Qb3N7cG9zfSwgbUN0cntjdHJ9IHt9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgordHlwZW5hbWUgUmluZ0J1ZmZlcjxUPjo6Y29uc3RfaXRlcmF0b3ImIFJpbmdCdWZmZXI8VD46OmNvbnN0X2l0ZXJhdG9yOjpvcGVyYXRvcisrKCkgeworICAgICsrbUN0cjsKKworICAgIGlmIChDQ19VTkxJS0VMWShtQ3RyID09IG1TaXplKSkgeworICAgICAgICBtUG9zID0gbVNpemU7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBtUG9zID0gKChDQ19VTkxJS0VMWShtUG9zID09IDApKSA/IG1TaXplIC0gMSA6IG1Qb3MgLSAxKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgordHlwZW5hbWUgUmluZ0J1ZmZlcjxUPjo6Y29uc3RfaXRlcmF0b3IgUmluZ0J1ZmZlcjxUPjo6Y29uc3RfaXRlcmF0b3I6Om9wZXJhdG9yKysoaW50KSB7CisgICAgY29uc3RfaXRlcmF0b3IgdG1we21QdHIsIG1TaXplLCBtUG9zLCBtQ3RyfTsKKyAgICArKygqdGhpcyk7CisgICAgcmV0dXJuIHRtcDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Citib29sIFJpbmdCdWZmZXI8VD46OmNvbnN0X2l0ZXJhdG9yOjpvcGVyYXRvcj09KGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiByaHMpIHsKKyAgICByZXR1cm4gKG1QdHIgKyBtUG9zKSA9PSAocmhzLm1QdHIgKyByaHMubVBvcyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorYm9vbCBSaW5nQnVmZmVyPFQ+Ojpjb25zdF9pdGVyYXRvcjo6b3BlcmF0b3IhPShjb25zdCBjb25zdF9pdGVyYXRvciYgcmhzKSB7CisgICAgcmV0dXJuIChtUHRyICsgbVBvcykgIT0gKHJocy5tUHRyICsgcmhzLm1Qb3MpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NvbnN0IFQmIFJpbmdCdWZmZXI8VD46OmNvbnN0X2l0ZXJhdG9yOjpvcGVyYXRvciooKSB7CisgICAgcmV0dXJuICoobVB0ciArIG1Qb3MpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NvbnN0IFQqIFJpbmdCdWZmZXI8VD46OmNvbnN0X2l0ZXJhdG9yOjpvcGVyYXRvci0+KCkgeworICAgIHJldHVybiBtUHRyICsgbVBvczsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Cit2b2lkIFJpbmdCdWZmZXI8VD46OmFkZChjb25zdCBUJiBpdGVtKSB7CisgICAgaWYgKG1CdWZmZXIuc2l6ZSgpIDwgbU1heEJ1ZmZlclNpemUpIHsKKyAgICAgICAgbUJ1ZmZlci5wdXNoX2JhY2soaXRlbSk7CisgICAgICAgIG1Gcm9udElkeCA9ICgobUZyb250SWR4ICsgMSkgJSBtTWF4QnVmZmVyU2l6ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtQnVmZmVyW21Gcm9udElkeF0gPSBpdGVtOworICAgIG1Gcm9udElkeCA9ICgobUZyb250SWR4ICsgMSkgJSBtTWF4QnVmZmVyU2l6ZSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgordm9pZCBSaW5nQnVmZmVyPFQ+OjphZGQoVCYmIGl0ZW0pIHsKKyAgICBpZiAobUJ1ZmZlci5zaXplKCkgIT0gbU1heEJ1ZmZlclNpemUpIHsKKyAgICAgICAgbUJ1ZmZlci5wdXNoX2JhY2soc3RkOjpmb3J3YXJkPFQ+KGl0ZW0pKTsKKyAgICAgICAgbUZyb250SWR4ID0gKChtRnJvbnRJZHggKyAxKSAlIG1NYXhCdWZmZXJTaXplKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE9ubHkgd29ya3MgZm9yIHR5cGVzIHdpdGggbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yCisgICAgbUJ1ZmZlclttRnJvbnRJZHhdID0gc3RkOjpmb3J3YXJkPFQ+KGl0ZW0pOworICAgIG1Gcm9udElkeCA9ICgobUZyb250SWR4ICsgMSkgJSBtTWF4QnVmZmVyU2l6ZSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgordGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+Cit2b2lkIFJpbmdCdWZmZXI8VD46OmVtcGxhY2UoQXJncyYmLi4uIGFyZ3MpIHsKKyAgICBpZiAobUJ1ZmZlci5zaXplKCkgIT0gbU1heEJ1ZmZlclNpemUpIHsKKyAgICAgICAgbUJ1ZmZlci5lbXBsYWNlX2JhY2soc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKKyAgICAgICAgbUZyb250SWR4ID0gKChtRnJvbnRJZHggKyAxKSAlIG1NYXhCdWZmZXJTaXplKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE9ubHkgd29ya3MgZm9yIHR5cGVzIHdpdGggbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yCisgICAgbUJ1ZmZlclttRnJvbnRJZHhdID0gVChzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOworICAgIG1Gcm9udElkeCA9ICgobUZyb250SWR4ICsgMSkgJSBtTWF4QnVmZmVyU2l6ZSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgordHlwZW5hbWUgUmluZ0J1ZmZlcjxUPjo6aXRlcmF0b3IgUmluZ0J1ZmZlcjxUPjo6YmVnaW4oKSB7CisgICAgc2l6ZV90IHRtcCA9IChtQnVmZmVyLnNpemUoKSA9PSAwKSA/IDAgOiBtQnVmZmVyLnNpemUoKSAtIDE7CisgICAgcmV0dXJuIGl0ZXJhdG9yKG1CdWZmZXIuZGF0YSgpLCBtQnVmZmVyLnNpemUoKSwgKG1Gcm9udElkeCA9PSAwKSA/IHRtcCA6IG1Gcm9udElkeCAtIDEsIDApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3R5cGVuYW1lIFJpbmdCdWZmZXI8VD46Oml0ZXJhdG9yIFJpbmdCdWZmZXI8VD46OmVuZCgpIHsKKyAgICBzaXplX3QgcyA9IG1CdWZmZXIuc2l6ZSgpOworICAgIHJldHVybiBpdGVyYXRvcihtQnVmZmVyLmRhdGEoKSwgcywgcywgcyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgordHlwZW5hbWUgUmluZ0J1ZmZlcjxUPjo6Y29uc3RfaXRlcmF0b3IgUmluZ0J1ZmZlcjxUPjo6YmVnaW4oKSBjb25zdCB7CisgICAgc2l6ZV90IHRtcCA9IChtQnVmZmVyLnNpemUoKSA9PSAwKSA/IDAgOiBtQnVmZmVyLnNpemUoKSAtIDE7CisgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKG1CdWZmZXIuZGF0YSgpLCBtQnVmZmVyLnNpemUoKSwKKyAgICAgICAgICAgIChtRnJvbnRJZHggPT0gMCkgPyB0bXAgOiBtRnJvbnRJZHggLSAxLCAwKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Cit0eXBlbmFtZSBSaW5nQnVmZmVyPFQ+Ojpjb25zdF9pdGVyYXRvciBSaW5nQnVmZmVyPFQ+OjplbmQoKSBjb25zdCB7CisgICAgc2l6ZV90IHMgPSBtQnVmZmVyLnNpemUoKTsKKyAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IobUJ1ZmZlci5kYXRhKCksIHMsIHMsIHMpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK1QmIFJpbmdCdWZmZXI8VD46Om9wZXJhdG9yW10oc2l6ZV90IGluZGV4KSB7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpbmRleCA+PSBtQnVmZmVyLnNpemUoKSwgIkluZGV4ICV6dSBvdXQgb2YgYm91bmRzLCBzaXplIGlzICV6dS4iLAorICAgICAgICAgICAgaW5kZXgsIG1CdWZmZXIuc2l6ZSgpKTsKKyAgICBzaXplX3QgcG9zID0gKGluZGV4ID49IG1Gcm9udElkeCkgPworICAgICAgICAgICAgbUJ1ZmZlci5zaXplKCkgLSAxIC0gKGluZGV4IC0gbUZyb250SWR4KSA6IG1Gcm9udElkeCAtIDEgLSBpbmRleDsKKyAgICByZXR1cm4gbUJ1ZmZlcltwb3NdOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NvbnN0IFQmIFJpbmdCdWZmZXI8VD46Om9wZXJhdG9yW10oc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpbmRleCA+PSBtQnVmZmVyLnNpemUoKSwgIkluZGV4ICV6dSBvdXQgb2YgYm91bmRzLCBzaXplIGlzICV6dS4iLAorICAgICAgICAgICAgaW5kZXgsIG1CdWZmZXIuc2l6ZSgpKTsKKyAgICBzaXplX3QgcG9zID0gKGluZGV4ID49IG1Gcm9udElkeCkgPworICAgICAgICAgICAgbUJ1ZmZlci5zaXplKCkgLSAxIC0gKGluZGV4IC0gbUZyb250SWR4KSA6IG1Gcm9udElkeCAtIDEgLSBpbmRleDsKKyAgICByZXR1cm4gbUJ1ZmZlcltwb3NdOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3NpemVfdCBSaW5nQnVmZmVyPFQ+OjpzaXplKCkgY29uc3QgeworICAgIHJldHVybiBtQnVmZmVyLnNpemUoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Cit2b2lkIFJpbmdCdWZmZXI8VD46OmNsZWFyKCkgeworICAgIG1CdWZmZXIuY2xlYXIoKTsKKyAgICBtRnJvbnRJZHggPSAwOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9TRVJWSUNFX1VUSUxTX1JJTkdfQlVGRkVSX0gKKworCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1NpbmdsZVN0YXRlUXVldWUuaCBiL2luY2x1ZGUvbWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5oCmluZGV4IDA0YzVmZDAuLmQ0MjM5NjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5oCkBAIC0yMSw2ICsyMSw3IEBACiAvLyBOb24tYmxvY2tpbmcgc2luZ2xlLXJlYWRlciAvIHNpbmdsZS13cml0ZXIgbXVsdGktd29yZCBhdG9taWMgbG9hZCAvIHN0b3JlCiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzEsNiArMzIsMTIgQEAKICAgICBjbGFzcyBNdXRhdG9yOwogICAgIGNsYXNzIE9ic2VydmVyOwogCisgICAgZW51bSBTU1FfU1RBVFVTIHsKKyAgICAgICAgU1NRX1BFTkRJTkcsIC8qID0gMCAqLworICAgICAgICBTU1FfUkVBRCwKKyAgICAgICAgU1NRX0RPTkUsCisgICAgfTsKKwogICAgIHN0cnVjdCBTaGFyZWQgewogICAgICAgICAvLyBuZWVkcyB0byBiZSBwYXJ0IG9mIGEgdW5pb24gc28gZG9uJ3QgZGVmaW5lIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IKIApAQCAtNDEsMjggKzQ4LDU2IEBACiAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgaW5pdCgpIHsgbUFjayA9IDA7IG1TZXF1ZW5jZSA9IDA7IH0KIAogICAgICAgICB2b2xhdGlsZSBpbnQzMl90ICAgIG1BY2s7Ci0jaWYgMAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG1QYWRbN107Ci0gICAgICAgIC8vIGNhY2hlIGxpbmUgYm91bmRhcnkKLSNlbmRpZgogICAgICAgICB2b2xhdGlsZSBpbnQzMl90ICAgIG1TZXF1ZW5jZTsKICAgICAgICAgVCAgICAgICAgICAgICAgICAgICBtVmFsdWU7CiAgICAgfTsKIAogICAgIGNsYXNzIE11dGF0b3IgewogICAgIHB1YmxpYzoKLSAgICAgICAgTXV0YXRvcihTaGFyZWQgKnNoYXJlZCk7Ci0gICAgICAgIC8qdmlydHVhbCovIH5NdXRhdG9yKCkgeyB9CisgICAgICAgIE11dGF0b3IoU2hhcmVkICpzaGFyZWQpCisgICAgICAgICAgICA6IG1TZXF1ZW5jZSgwKSwgbVNoYXJlZChzaGFyZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGV4YWN0bHkgb25lIG9mIE11dGF0b3IgYW5kIE9ic2VydmVyIG11c3QgaW5pdGlhbGl6ZSwgY3VycmVudGx5IGl0IGlzIE9ic2VydmVyCisgICAgICAgICAgICAvLyBzaGFyZWQtPmluaXQoKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIHB1c2ggbmV3IHZhbHVlIG9udG8gc3RhdGUgcXVldWUsIG92ZXJ3cml0aW5nIHByZXZpb3VzIHZhbHVlOwogICAgICAgICAvLyByZXR1cm5zIGEgc2VxdWVuY2UgbnVtYmVyIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggYWNrKCkKLSAgICAgICAgaW50MzJfdCBwdXNoKGNvbnN0IFQmIHZhbHVlKTsKKyAgICAgICAgaW50MzJfdCBwdXNoKGNvbnN0IFQmIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBTaGFyZWQgKnNoYXJlZCA9IG1TaGFyZWQ7CisgICAgICAgICAgICBpbnQzMl90IHNlcXVlbmNlID0gbVNlcXVlbmNlOworICAgICAgICAgICAgc2VxdWVuY2UrKzsKKyAgICAgICAgICAgIGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfc3RvcmUoc2VxdWVuY2UsICZzaGFyZWQtPm1TZXF1ZW5jZSk7CisgICAgICAgICAgICBzaGFyZWQtPm1WYWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgc2VxdWVuY2UrKzsKKyAgICAgICAgICAgIGFuZHJvaWRfYXRvbWljX3JlbGVhc2Vfc3RvcmUoc2VxdWVuY2UsICZzaGFyZWQtPm1TZXF1ZW5jZSk7CisgICAgICAgICAgICBtU2VxdWVuY2UgPSBzZXF1ZW5jZTsKKyAgICAgICAgICAgIC8vIGNvbnNpZGVyIHNpZ25hbGxpbmcgYSBmdXRleCBoZXJlLCBpZiB3ZSBrbm93IHRoYXQgb2JzZXJ2ZXIgaXMgd2FpdGluZworICAgICAgICAgICAgcmV0dXJuIHNlcXVlbmNlOworICAgICAgICB9CiAKLSAgICAgICAgLy8gcmV0dXJuIHRydWUgaWYgbW9zdCByZWNlbnQgcHVzaCBoYXMgYmVlbiBvYnNlcnZlZAotICAgICAgICBib29sIGFjaygpOworICAgICAgICAvLyByZXR1cm5zIHRoZSBzdGF0dXMgb2YgdGhlIGxhc3Qgc3RhdGUgcHVzaC4gIFRoaXMgbWF5IGJlIGEgc3RhbGUgdmFsdWUuCisgICAgICAgIC8vCisgICAgICAgIC8vIFNTUV9QRU5ESU5HLCBvciAwLCBtZWFucyBpdCBoYXMgbm90IGJlZW4gb2JzZXJ2ZWQKKyAgICAgICAgLy8gU1NRX1JFQUQgbWVhbnMgaXQgaGFzIGJlZW4gcmVhZAorICAgICAgICAvLyBTU1FfRE9ORSBtZWFucyBpdCBoYXMgYmVlbiBhY3RlZCB1cG9uLCBhZnRlciBPYnNlcnZlcjo6ZG9uZSgpIGlzIGNhbGxlZAorICAgICAgICBlbnVtIFNTUV9TVEFUVVMgYWNrKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU1NRX0RPTkUsIHByZXZlbnQgYW55IHN1YnRsZSBkYXRhLXJhY2VzIG9mIHN1YnNlcXVlbnQgcmVhZHMKKyAgICAgICAgICAgIC8vIGJlaW5nIHBlcmZvcm1lZCAob3V0LW9mLW9yZGVyKSBiZWZvcmUgdGhlIGFjayByZWFkLCBzaG91bGQgdGhlIGNhbGxlciBiZQorICAgICAgICAgICAgLy8gZGVwZW5kaW5nIG9uIHNlcXVlbnRpYWxpdHkgb2YgcmVhZHMuCisgICAgICAgICAgICBjb25zdCBpbnQzMl90IGFjayA9IGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmbVNoYXJlZC0+bUFjayk7CisgICAgICAgICAgICByZXR1cm4gYWNrIC0gbVNlcXVlbmNlICYgfjEgPyBTU1FfUEVORElORyAvKiBzZXEgZGlmZmVyICovIDoKKyAgICAgICAgICAgICAgICAgICAgYWNrICYgMSA/IFNTUV9ET05FIDogU1NRX1JFQUQ7CisgICAgICAgIH0KIAogICAgICAgICAvLyByZXR1cm4gdHJ1ZSBpZiBhIHB1c2ggd2l0aCBzcGVjaWZpZWQgc2VxdWVuY2UgbnVtYmVyIG9yIGxhdGVyIGhhcyBiZWVuIG9ic2VydmVkCi0gICAgICAgIGJvb2wgYWNrKGludDMyX3Qgc2VxdWVuY2UpOworICAgICAgICBib29sIGFjayhpbnQzMl90IHNlcXVlbmNlKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICAvLyB0aGlzIHJlbGllcyBvbiAyJ3MgY29tcGxlbWVudCByb2xsb3ZlciB0byBkZXRlY3QgYW4gYW5jaWVudCBzZXF1ZW5jZSBudW1iZXIKKyAgICAgICAgICAgIHJldHVybiBtU2hhcmVkLT5tQWNrIC0gc2VxdWVuY2UgPj0gMDsKKyAgICAgICAgfQogCiAgICAgcHJpdmF0ZToKICAgICAgICAgaW50MzJfdCAgICAgbVNlcXVlbmNlOwpAQCAtNzEsMTEgKzEwNiw1NCBAQAogCiAgICAgY2xhc3MgT2JzZXJ2ZXIgewogICAgIHB1YmxpYzoKLSAgICAgICAgT2JzZXJ2ZXIoU2hhcmVkICpzaGFyZWQpOwotICAgICAgICAvKnZpcnR1YWwqLyB+T2JzZXJ2ZXIoKSB7IH0KKyAgICAgICAgT2JzZXJ2ZXIoU2hhcmVkICpzaGFyZWQpCisgICAgICAgICAgICA6IG1TZXF1ZW5jZSgwKSwgbVNlZWQoMSksIG1TaGFyZWQoc2hhcmVkKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBleGFjdGx5IG9uZSBvZiBNdXRhdG9yIGFuZCBPYnNlcnZlciBtdXN0IGluaXRpYWxpemUsIGN1cnJlbnRseSBpdCBpcyBPYnNlcnZlcgorICAgICAgICAgICAgc2hhcmVkLT5pbml0KCk7CisgICAgICAgIH0KIAogICAgICAgICAvLyByZXR1cm4gdHJ1ZSBpZiB2YWx1ZSBoYXMgY2hhbmdlZAotICAgICAgICBib29sIHBvbGwoVCYgdmFsdWUpOworICAgICAgICBib29sIHBvbGwoVCYgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNoYXJlZCAqc2hhcmVkID0gbVNoYXJlZDsKKyAgICAgICAgICAgIGludDMyX3QgYmVmb3JlID0gc2hhcmVkLT5tU2VxdWVuY2U7CisgICAgICAgICAgICBpZiAoYmVmb3JlID09IG1TZXF1ZW5jZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IHRyaWVzID0gMDsgOyApIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgTUFYX1RSSUVTID0gNTsKKyAgICAgICAgICAgICAgICBpZiAoYmVmb3JlICYgMSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKyt0cmllcyA+PSBNQVhfVFJJRVMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBiZWZvcmUgPSBzaGFyZWQtPm1TZXF1ZW5jZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX21lbW9yeV9iYXJyaWVyKCk7CisgICAgICAgICAgICAgICAgICAgIFQgdGVtcCA9IHNoYXJlZC0+bVZhbHVlOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGFmdGVyID0gYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9sb2FkKCZzaGFyZWQtPm1TZXF1ZW5jZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlciA9PSBiZWZvcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGVtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZC0+bUFjayA9IGJlZm9yZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZXF1ZW5jZSA9IGJlZm9yZTsgLy8gbVNlcXVlbmNlIGlzIGV2ZW4gYWZ0ZXIgcG9sbCBzdWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKyt0cmllcyA+PSBNQVhfVFJJRVMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBiZWZvcmUgPSBhZnRlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyAob3B0aW9uYWwpIHVzZWQgdG8gaW5kaWNhdGUgdG8gdGhlIE11dGF0b3IgdGhhdCB0aGUgc3RhdGUgdGhhdCBoYXMgYmVlbiBwb2xsZWQKKyAgICAgICAgLy8gaGFzIGFsc28gYmVlbiBhY3RlZCB1cG9uLgorICAgICAgICB2b2lkIGRvbmUoKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IGFjayA9IG1TaGFyZWQtPm1BY2sgKyAxOworICAgICAgICAgICAgLy8gZW5zdXJlIGFsbCBwcmV2aW91cyB3cml0ZXMgaGF2ZSBiZWVuIHBlcmZvcm1lZC4KKyAgICAgICAgICAgIGFuZHJvaWRfYXRvbWljX3JlbGVhc2Vfc3RvcmUoYWNrLCAmbVNoYXJlZC0+bUFjayk7IC8vIG1TZXF1ZW5jZSBpcyBvZGQgYWZ0ZXIgImRvbmUiCisgICAgICAgIH0KIAogICAgIHByaXZhdGU6CiAgICAgICAgIGludDMyX3QgICAgIG1TZXF1ZW5jZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvU3RyaW5nQXJyYXkuaCBiL2luY2x1ZGUvbWVkaWEvU3RyaW5nQXJyYXkuaAppbmRleCBhZTQ3MDg1Li40OGQ5OGJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL1N0cmluZ0FycmF5LmgKKysrIGIvaW5jbHVkZS9tZWRpYS9TdHJpbmdBcnJheS5oCkBAIC0xNiw3ICsxNiw3IEBACiAKIC8vCiAvLyBTb3J0YWJsZSBhcnJheSBvZiBzdHJpbmdzLiAgU1RMLWlzaCwgYnV0IFNUTC1mcmVlLgotLy8gIAorLy8KICNpZm5kZWYgX0xJQlNfTUVESUFfU1RSSU5HX0FSUkFZX0gKICNkZWZpbmUgX0xJQlNfTUVESUFfU1RSSU5HX0FSUkFZX0gKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9WaXN1YWxpemVyLmggYi9pbmNsdWRlL21lZGlhL1Zpc3VhbGl6ZXIuaAppbmRleCA2MTY3ZGQ2Li4xODZlMDE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL1Zpc3VhbGl6ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL1Zpc3VhbGl6ZXIuaApAQCAtNjUsNyArNjUsOCBAQAogICAgIC8qIENvbnN0cnVjdG9yLgogICAgICAqIFNlZSBBdWRpb0VmZmVjdCBjb25zdHJ1Y3RvciBmb3IgZGV0YWlscyBvbiBwYXJhbWV0ZXJzLgogICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgVmlzdWFsaXplcihpbnQzMl90IHByaW9yaXR5ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZpc3VhbGl6ZXIoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IDApOwpAQCAtOTQsNyArOTUsOCBAQAogCiAgICAgLy8gaW5zdGFsbCBhIGNhbGxiYWNrIHRvIHJlY2VpdmUgcGVyaW9kaWMgY2FwdHVyZXMuIFRoZSBjYXB0dXJlIHJhdGUgaXMgc3BlY2lmaWVkIGluIG1pbGxpSGVydHoKICAgICAvLyBhbmQgdGhlIGNhcHR1cmUgZm9ybWF0IGlzIGFjY29yZGluZyB0byBmbGFncyAgKHNlZSBjYWxsYmFja19mbGFncykuCi0gICAgc3RhdHVzX3Qgc2V0Q2FwdHVyZUNhbGxCYWNrKGNhcHR1cmVfY2JrX3QgY2JrLCB2b2lkKiB1c2VyLCB1aW50MzJfdCBmbGFncywgdWludDMyX3QgcmF0ZSk7CisgICAgc3RhdHVzX3Qgc2V0Q2FwdHVyZUNhbGxCYWNrKGNhcHR1cmVfY2JrX3QgY2JrLCB2b2lkKiB1c2VyLCB1aW50MzJfdCBmbGFncywgdWludDMyX3QgcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSA9IGZhbHNlKTsKIAogICAgIC8vIHNldCB0aGUgY2FwdHVyZSBzaXplIGNhcHR1cmUgc2l6ZSBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvIGluIHRoZSByYW5nZQogICAgIC8vIFtWSVNVQUxJWkVSX0NBUFRVUkVfU0laRV9NQVguIFZJU1VBTElaRVJfQ0FQVFVSRV9TSVpFX01JTl0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oIGIvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKaW5kZXggODRiOTg0Ni4uOGVkMDdlZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKQEAgLTI1LDYgKzI1LDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitjbGFzcyBJRGF0YVNvdXJjZTsKIHN0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIGNsYXNzIElNZWRpYVBsYXllclNlcnZpY2U7CiBjbGFzcyBJTWVkaWFNZXRhZGF0YVJldHJpZXZlcjsKQEAgLTU3LDYgKzU4LDcgQEAKICAgICBNRVRBREFUQV9LRVlfSVNfRFJNICAgICAgICAgID0gMjIsCiAgICAgTUVUQURBVEFfS0VZX0xPQ0FUSU9OICAgICAgICA9IDIzLAogICAgIE1FVEFEQVRBX0tFWV9WSURFT19ST1RBVElPTiAgPSAyNCwKKyAgICBNRVRBREFUQV9LRVlfQ0FQVFVSRV9GUkFNRVJBVEUgPSAyNSwKIAogICAgIC8vIEFkZCBtb3JlIGhlcmUuLi4KIH07CkBAIC03NCw2ICs3Niw3IEBACiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpOwogCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CisgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJRGF0YVNvdXJjZT4mIGRhdGFTb3VyY2UpOwogICAgIHNwPElNZW1vcnk+IGdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uKTsKICAgICBzcDxJTWVtb3J5PiBleHRyYWN0QWxidW1BcnQoKTsKICAgICBjb25zdCBjaGFyKiBleHRyYWN0TWV0YWRhdGEoaW50IGtleUNvZGUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oCmluZGV4IDU4MzA5MzMuLjNmZTc0OWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmgKQEAgLTIwLDYgKzIwLDggQEAKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllckNsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYURlYXRoTm90aWZpZXIuaD4KQEAgLTMyLDggKzM0LDkgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBTdXJmYWNlOworc3RydWN0IEFWU3luY1NldHRpbmdzOwogY2xhc3MgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK2NsYXNzIFN1cmZhY2U7CiAKIGVudW0gbWVkaWFfZXZlbnRfdHlwZSB7CiAgICAgTUVESUFfTk9QICAgICAgICAgICAgICAgPSAwLCAvLyBpbnRlcmZhY2UgdGVzdCBtZXNzYWdlCkBAIC01MCw2ICs1Myw3IEBACiAgICAgTUVESUFfRVJST1IgICAgICAgICAgICAgPSAxMDAsCiAgICAgTUVESUFfSU5GTyAgICAgICAgICAgICAgPSAyMDAsCiAgICAgTUVESUFfU1VCVElUTEVfREFUQSAgICAgPSAyMDEsCisgICAgTUVESUFfTUVUQV9EQVRBICAgICAgICAgPSAyMDIsCiB9OwogCiAvLyBHZW5lcmljIGVycm9yIGNvZGVzIGZvciB0aGUgbWVkaWEgcGxheWVyIGZyYW1ld29yay4gIEVycm9ycyBhcmUgZmF0YWwsIHRoZQpAQCAtMTgzLDYgKzE4Nyw3IEBACiAgICAgTUVESUFfVFJBQ0tfVFlQRV9BVURJTyA9IDIsCiAgICAgTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQgPSAzLAogICAgIE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUgPSA0LAorICAgIE1FRElBX1RSQUNLX1RZUEVfTUVUQURBVEEgPSA1LAogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjExLDYgKzIxNiw3IEBACiAKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SURhdGFTb3VyY2U+ICZzb3VyY2UpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvU3VyZmFjZVRleHR1cmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldExpc3RlbmVyKGNvbnN0IHNwPE1lZGlhUGxheWVyTGlzdGVuZXI+JiBsaXN0ZW5lcik7CkBAIC0yMjAsNiArMjI2LDEyIEBACiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc3RvcCgpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHBhdXNlKCk7CiAgICAgICAgICAgICBib29sICAgICAgICAgICAgaXNQbGF5aW5nKCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgcmF0ZSk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSogcmF0ZSAvKiBub25udWxsICovKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MmIHN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0U3luY1NldHRpbmdzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTeW5jU2V0dGluZ3MqIHN5bmMgLyogbm9ubnVsbCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB2aWRlb0ZwcyAvKiBub25udWxsICovKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRWaWRlb1dpZHRoKGludCAqdyk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0VmlkZW9IZWlnaHQoaW50ICpoKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZWVrVG8oaW50IG1zZWMpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmggYi9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAppbmRleCBiMGE2MmE3Li4xNWZmODJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaApAQCAtMzIsNiArMzIsNyBAQAogY2xhc3MgSUNhbWVyYTsKIGNsYXNzIElDYW1lcmFSZWNvcmRpbmdQcm94eTsKIGNsYXNzIElHcmFwaGljQnVmZmVyUHJvZHVjZXI7CitzdHJ1Y3QgUGVyc2lzdGVudFN1cmZhY2U7CiBjbGFzcyBTdXJmYWNlOwogCiB0eXBlZGVmIHZvaWQgKCptZWRpYV9jb21wbGV0aW9uX2YpKHN0YXR1c190IHN0YXR1cywgdm9pZCAqY29va2llKTsKQEAgLTIwOSw3ICsyMTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElNZWRpYURlYXRoTm90aWZpZXIKIHsKIHB1YmxpYzoKLSAgICBNZWRpYVJlY29yZGVyKCk7CisgICAgTWVkaWFSZWNvcmRlcihjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSk7CiAgICAgfk1lZGlhUmVjb3JkZXIoKTsKIAogICAgIHZvaWQgICAgICAgIGRpZWQoKTsKQEAgLTIyMSw3ICsyMjIsNiBAQAogICAgIHN0YXR1c190ICAgIHNldE91dHB1dEZvcm1hdChpbnQgb2YpOwogICAgIHN0YXR1c190ICAgIHNldFZpZGVvRW5jb2RlcihpbnQgdmUpOwogICAgIHN0YXR1c190ICAgIHNldEF1ZGlvRW5jb2RlcihpbnQgYWUpOwotICAgIHN0YXR1c190ICAgIHNldE91dHB1dEZpbGUoY29uc3QgY2hhciogcGF0aCk7CiAgICAgc3RhdHVzX3QgICAgc2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAgICAgc3RhdHVzX3QgICAgc2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAgICAgc3RhdHVzX3QgICAgc2V0VmlkZW9GcmFtZVJhdGUoaW50IGZyYW1lc19wZXJfc2Vjb25kKTsKQEAgLTIzNyw2ICsyMzcsNyBAQAogICAgIHN0YXR1c190ICAgIGNsb3NlKCk7CiAgICAgc3RhdHVzX3QgICAgcmVsZWFzZSgpOwogICAgIHZvaWQgICAgICAgIG5vdGlmeShpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpOworICAgIHN0YXR1c190ICAgIHNldElucHV0U3VyZmFjZShjb25zdCBzcDxQZXJzaXN0ZW50U3VyZmFjZT4mIHN1cmZhY2UpOwogICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICAgICBxdWVyeVN1cmZhY2VNZWRpYVNvdXJjZUZyb21NZWRpYVNlcnZlcigpOwogCiBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkFJTy5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkFJTy5oCmluZGV4IGQ0MjI1NzYuLmQ5YmJjOGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJBSU8uaAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL05CQUlPLmgKQEAgLTIzMSw3ICsyMzEsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApIHsgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyB9CiAKIHByb3RlY3RlZDoKLSAgICBOQkFJT19TaW5rKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0ID0gRm9ybWF0X0ludmFsaWQpIDogTkJBSU9fUG9ydChmb3JtYXQpLCBtRnJhbWVzV3JpdHRlbigwKSB7IH0KKyAgICBOQkFJT19TaW5rKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0ID0gRm9ybWF0X0ludmFsaWQpIDogTkJBSU9fUG9ydChmb3JtYXQpLCBtRnJhbWVzV3JpdHRlbigwKQorICAgICAgICAgICAgeyB9CiAgICAgdmlydHVhbCB+TkJBSU9fU2luaygpIHsgfQogCiAgICAgLy8gSW1wbGVtZW50YXRpb25zIGFyZSBmcmVlIHRvIGlnbm9yZSB0aGVzZSBpZiB0aGV5IGRvbid0IG5lZWQgdGhlbQpAQCAtMzIyLDcgKzMyMyw4IEBACiAgICAgdmlydHVhbCB2b2lkICAgIG9uVGltZXN0YW1wKGNvbnN0IEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApIHsgfQogCiBwcm90ZWN0ZWQ6Ci0gICAgTkJBSU9fU291cmNlKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0ID0gRm9ybWF0X0ludmFsaWQpIDogTkJBSU9fUG9ydChmb3JtYXQpLCBtRnJhbWVzUmVhZCgwKSB7IH0KKyAgICBOQkFJT19Tb3VyY2UoY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQgPSBGb3JtYXRfSW52YWxpZCkgOiBOQkFJT19Qb3J0KGZvcm1hdCksIG1GcmFtZXNSZWFkKDApCisgICAgICAgICAgICB7IH0KICAgICB2aXJ0dWFsIH5OQkFJT19Tb3VyY2UoKSB7IH0KIAogICAgIC8vIEltcGxlbWVudGF0aW9ucyBhcmUgZnJlZSB0byBpZ25vcmUgdGhlc2UgaWYgdGhleSBkb24ndCBuZWVkIHRoZW0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaAppbmRleCBiY2JiYzA0Li4xMjk3YjUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkxvZy5oCkBAIC0yMSw3ICsyMSw3IEBACiAKICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJhaW8vcm91bmR1cC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3JvdW5kdXAuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FBQ1dyaXRlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQUNXcml0ZXIuaAppbmRleCBkMjI3MDdhLi5hYTYwYTE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FBQ1dyaXRlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmgKQEAgLTI0LDEwICsyNCw5IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBNZWRpYVNvdXJjZTsKLXN0cnVjdCBNZXRhRGF0YTsKK2NsYXNzIE1ldGFEYXRhOwogCiBzdHJ1Y3QgQUFDV3JpdGVyIDogcHVibGljIE1lZGlhV3JpdGVyIHsKLSAgICBBQUNXcml0ZXIoY29uc3QgY2hhciAqZmlsZW5hbWUpOwogICAgIEFBQ1dyaXRlcihpbnQgZmQpOwogCiAgICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaAppbmRleCA3ODI1NTA4Li44YjViODYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKQEAgLTIwLDkgKzIwLDExIEBACiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KICNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU2tpcEN1dEJ1ZmZlci5oPgogI2luY2x1ZGUgPE9NWF9BdWRpby5oPgogCkBAIC00NCw5ICs0NiwxMiBAQAogICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUFsbG9jYXRlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVDb25maWd1cmVDb21wb25lbnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUNyZWF0ZUlucHV0U3VyZmFjZSgpOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVNldElucHV0U3VyZmFjZShjb25zdCBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gJnN1cmZhY2UpOwogICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVN0YXJ0KCk7CiAgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlU2h1dGRvd24oYm9vbCBrZWVwQ29tcG9uZW50QWxsb2NhdGVkID0gZmFsc2UpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKKwogICAgIHZpcnR1YWwgdm9pZCBzaWduYWxGbHVzaCgpOwogICAgIHZpcnR1YWwgdm9pZCBzaWduYWxSZXN1bWUoKTsKIApAQCAtMTA1LDYgKzExMCwxMCBAQAogICAgIGVudW0gewogICAgICAgICBrV2hhdFNldHVwICAgICAgICAgICAgICAgICAgID0gJ3NldHUnLAogICAgICAgICBrV2hhdE9NWE1lc3NhZ2UgICAgICAgICAgICAgID0gJ29teCAnLAorICAgICAgICAvLyBzYW1lIGFzIGtXaGF0T01YTWVzc2FnZSAtIGJ1dCBvbmx5IHVzZWQgd2l0aAorICAgICAgICAvLyBoYW5kbGVNZXNzYWdlIGR1cmluZyBPTVggbWVzc2FnZS1saXN0IGhhbmRsaW5nCisgICAgICAgIGtXaGF0T01YTWVzc2FnZUl0ZW0gICAgICAgICAgPSAnb214SScsCisgICAgICAgIGtXaGF0T01YTWVzc2FnZUxpc3QgICAgICAgICAgPSAnb214TCcsCiAgICAgICAgIGtXaGF0SW5wdXRCdWZmZXJGaWxsZWQgICAgICAgPSAnaW5wRicsCiAgICAgICAgIGtXaGF0T3V0cHV0QnVmZmVyRHJhaW5lZCAgICAgPSAnb3V0RCcsCiAgICAgICAgIGtXaGF0U2h1dGRvd24gICAgICAgICAgICAgICAgPSAnc2h1dCcsCkBAIC0xMTMsMTIgKzEyMiwxNCBAQAogICAgICAgICBrV2hhdERyYWluRGVmZXJyZWRNZXNzYWdlcyAgID0gJ2RyYWknLAogICAgICAgICBrV2hhdEFsbG9jYXRlQ29tcG9uZW50ICAgICAgID0gJ2FsbG8nLAogICAgICAgICBrV2hhdENvbmZpZ3VyZUNvbXBvbmVudCAgICAgID0gJ2NvbmYnLAorICAgICAgICBrV2hhdFNldFN1cmZhY2UgICAgICAgICAgICAgID0gJ3NldFMnLAogICAgICAgICBrV2hhdENyZWF0ZUlucHV0U3VyZmFjZSAgICAgID0gJ2Npc2YnLAorICAgICAgICBrV2hhdFNldElucHV0U3VyZmFjZSAgICAgICAgID0gJ3Npc2YnLAogICAgICAgICBrV2hhdFNpZ25hbEVuZE9mSW5wdXRTdHJlYW0gID0gJ2VvaXMnLAogICAgICAgICBrV2hhdFN0YXJ0ICAgICAgICAgICAgICAgICAgID0gJ3N0YXInLAogICAgICAgICBrV2hhdFJlcXVlc3RJRFJGcmFtZSAgICAgICAgID0gJ3JpZHInLAogICAgICAgICBrV2hhdFNldFBhcmFtZXRlcnMgICAgICAgICAgID0gJ3NldFAnLAotICAgICAgICBrV2hhdFN1Ym1pdE91dHB1dE1ldGFEYXRhQnVmZmVySWZFT1MgPSAnc3VibScsCisgICAgICAgIGtXaGF0U3VibWl0T3V0cHV0TWV0YWRhdGFCdWZmZXJJZkVPUyA9ICdzdWJtJywKICAgICAgICAga1doYXRPTVhEaWVkICAgICAgICAgICAgICAgICA9ICdPTVhkJywKICAgICAgICAga1doYXRSZWxlYXNlQ29kZWNJbnN0YW5jZSAgICA9ICdyZWxDJywKICAgICB9OwpAQCAtMTM0LDYgKzE0NSwxMiBAQAogICAgICAgICBrRmxhZ0lzR3JhbGxvY1VzYWdlUHJvdGVjdGVkICAgICAgICAgICAgICAgICAgPSA0LAogICAgIH07CiAKKyAgICBlbnVtIHsKKyAgICAgICAga1ZpZGVvR3JhbGxvY1VzYWdlID0gKEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgR1JBTExPQ19VU0FHRV9FWFRFUk5BTF9ESVNQKSwKKyAgICB9OworCiAgICAgc3RydWN0IEJ1ZmZlckluZm8gewogICAgICAgICBlbnVtIFN0YXR1cyB7CiAgICAgICAgICAgICBPV05FRF9CWV9VUywKQEAgLTE0MSwxNiArMTU4LDM5IEBACiAgICAgICAgICAgICBPV05FRF9CWV9VUFNUUkVBTSwKICAgICAgICAgICAgIE9XTkVEX0JZX0RPV05TVFJFQU0sCiAgICAgICAgICAgICBPV05FRF9CWV9OQVRJVkVfV0lORE9XLAorICAgICAgICAgICAgVU5SRUNPR05JWkVELCAgICAgICAgICAgIC8vIG5vdCBhIHRyYWNrZWQgYnVmZmVyCiAgICAgICAgIH07CiAKKyAgICAgICAgc3RhdGljIGlubGluZSBTdGF0dXMgZ2V0U2FmZVN0YXR1cyhCdWZmZXJJbmZvICppbmZvKSB7CisgICAgICAgICAgICByZXR1cm4gaW5mbyA9PSBOVUxMID8gVU5SRUNPR05JWkVEIDogaW5mby0+bVN0YXR1czsKKyAgICAgICAgfQorCiAgICAgICAgIElPTVg6OmJ1ZmZlcl9pZCBtQnVmZmVySUQ7CiAgICAgICAgIFN0YXR1cyBtU3RhdHVzOwogICAgICAgICB1bnNpZ25lZCBtRGVxdWV1ZWRBdDsKIAogICAgICAgICBzcDxBQnVmZmVyPiBtRGF0YTsKICAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gbUdyYXBoaWNCdWZmZXI7CisgICAgICAgIGludCBtRmVuY2VGZDsKKyAgICAgICAgRnJhbWVSZW5kZXJUcmFja2VyOjpJbmZvICptUmVuZGVySW5mbzsKKworICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGZpZWxkIGFuZCA0IG1ldGhvZHMgYXJlIHVzZWQgZm9yIGRlYnVnZ2luZyBvbmx5CisgICAgICAgIGJvb2wgbUlzUmVhZEZlbmNlOworICAgICAgICAvLyBTdG9yZSB8ZmVuY2VGZHwgYW5kIHNldCByZWFkL3dyaXRlIGZsYWcuIExvZyBlcnJvciwgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIGZlbmNlIHN0b3JlZC4KKyAgICAgICAgdm9pZCBzZXRSZWFkRmVuY2UoaW50IGZlbmNlRmQsIGNvbnN0IGNoYXIgKmRiZyk7CisgICAgICAgIHZvaWQgc2V0V3JpdGVGZW5jZShpbnQgZmVuY2VGZCwgY29uc3QgY2hhciAqZGJnKTsKKyAgICAgICAgLy8gTG9nIGVycm9yLCBpZiB0aGUgY3VycmVudCBmZW5jZSBpcyBub3QgYSByZWFkL3dyaXRlIGZlbmNlLgorICAgICAgICB2b2lkIGNoZWNrUmVhZEZlbmNlKGNvbnN0IGNoYXIgKmRiZyk7CisgICAgICAgIHZvaWQgY2hlY2tXcml0ZUZlbmNlKGNvbnN0IGNoYXIgKmRiZyk7CiAgICAgfTsKIAorICAgIHN0YXRpYyBjb25zdCBjaGFyICpfYXNTdHJpbmcoQnVmZmVySW5mbzo6U3RhdHVzIHMpOworICAgIHZvaWQgZHVtcEJ1ZmZlcnMoT01YX1UzMiBwb3J0SW5kZXgpOworCisgICAgLy8gSWYgfGZkfCBpcyBub24tbmVnYXRpdmUsIHdhaXRzIGZvciBmZW5jZSB3aXRoIHxmZHwgYW5kIGxvZ3MgYW4gZXJyb3IgaWYgaXQgZmFpbHMuIFJldHVybnMKKyAgICAvLyB0aGUgZXJyb3IgY29kZSBvciBPSyBvbiBzdWNjZXNzLiBJZiB8ZmR8IGlzIG5lZ2F0aXZlLCBpdCByZXR1cm5zIE9LCisgICAgc3RhdHVzX3Qgd2FpdEZvckZlbmNlKGludCBmZCwgY29uc3QgY2hhciAqZGJnKTsKKwogI2lmIFRSQUNLX0JVRkZFUl9USU1JTkcKICAgICBzdHJ1Y3QgQnVmZmVyU3RhdHMgewogICAgICAgICBpbnQ2NF90IG1FbXB0eUJ1ZmZlclRpbWVVczsKQEAgLTE4MSwxMCArMjIxLDEyIEBACiAgICAgc3A8TWVtb3J5RGVhbGVyPiBtRGVhbGVyWzJdOwogCiAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gbU5hdGl2ZVdpbmRvdzsKKyAgICBpbnQgbU5hdGl2ZVdpbmRvd1VzYWdlQml0czsKICAgICBzcDxBTWVzc2FnZT4gbUlucHV0Rm9ybWF0OwogICAgIHNwPEFNZXNzYWdlPiBtT3V0cHV0Rm9ybWF0OwogICAgIHNwPEFNZXNzYWdlPiBtQmFzZU91dHB1dEZvcm1hdDsKIAorICAgIEZyYW1lUmVuZGVyVHJhY2tlciBtUmVuZGVyVHJhY2tlcjsgLy8gcmVuZGVyIGluZm9ybWF0aW9uIGZvciBidWZmZXJzIHJlbmRlcmVkIGJ5IEFDb2RlYwogICAgIFZlY3RvcjxCdWZmZXJJbmZvPiBtQnVmZmVyc1syXTsKICAgICBib29sIG1Qb3J0RU9TWzJdOwogICAgIHN0YXR1c190IG1JbnB1dEVPU1Jlc3VsdDsKQEAgLTE5Miw4ICsyMzQsOCBAQAogICAgIExpc3Q8c3A8QU1lc3NhZ2U+ID4gbURlZmVycmVkUXVldWU7CiAKICAgICBib29sIG1TZW50Rm9ybWF0OworICAgIGJvb2wgbUlzVmlkZW87CiAgICAgYm9vbCBtSXNFbmNvZGVyOwotICAgIGJvb2wgbVVzZU1ldGFkYXRhT25FbmNvZGVyT3V0cHV0OwogICAgIGJvb2wgbUZhdGFsRXJyb3I7CiAgICAgYm9vbCBtU2h1dGRvd25JblByb2dyZXNzOwogICAgIGJvb2wgbUV4cGxpY2l0U2h1dGRvd247CkBAIC0yMDksMTIgKzI1MSwxNSBAQAogICAgIGJvb2wgbUNoYW5uZWxNYXNrUHJlc2VudDsKICAgICBpbnQzMl90IG1DaGFubmVsTWFzazsKICAgICB1bnNpZ25lZCBtRGVxdWV1ZUNvdW50ZXI7Ci0gICAgYm9vbCBtU3RvcmVNZXRhRGF0YUluT3V0cHV0QnVmZmVyczsKLSAgICBpbnQzMl90IG1NZXRhRGF0YUJ1ZmZlcnNUb1N1Ym1pdDsKKyAgICBNZXRhZGF0YUJ1ZmZlclR5cGUgbUlucHV0TWV0YWRhdGFUeXBlOworICAgIE1ldGFkYXRhQnVmZmVyVHlwZSBtT3V0cHV0TWV0YWRhdGFUeXBlOworICAgIGJvb2wgbUxlZ2FjeUFkYXB0aXZlRXhwZXJpbWVudDsKKyAgICBpbnQzMl90IG1NZXRhZGF0YUJ1ZmZlcnNUb1N1Ym1pdDsKICAgICBzaXplX3QgbU51bVVuZGVxdWV1ZWRCdWZmZXJzOwogCiAgICAgaW50NjRfdCBtUmVwZWF0RnJhbWVEZWxheVVzOwogICAgIGludDY0X3QgbU1heFB0c0dhcFVzOworICAgIGZsb2F0IG1NYXhGcHM7CiAKICAgICBpbnQ2NF90IG1UaW1lUGVyRnJhbWVVczsKICAgICBpbnQ2NF90IG1UaW1lUGVyQ2FwdHVyZVVzOwpAQCAtMjI4LDE3ICsyNzMsMjkgQEAKICAgICBzdGF0dXNfdCBmcmVlQnVmZmVyc09uUG9ydChPTVhfVTMyIHBvcnRJbmRleCk7CiAgICAgc3RhdHVzX3QgZnJlZUJ1ZmZlcihPTVhfVTMyIHBvcnRJbmRleCwgc2l6ZV90IGkpOwogCisgICAgc3RhdHVzX3QgaGFuZGxlU2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7CisgICAgc3RhdHVzX3Qgc2V0dXBOYXRpdmVXaW5kb3dTaXplRm9ybWF0QW5kVXNhZ2UoCisgICAgICAgICAgICBBTmF0aXZlV2luZG93ICpuYXRpdmVXaW5kb3cgLyogbm9ubnVsbCAqLywgaW50ICpmaW5hbFVzYWdlIC8qIG5vbm51bGwgKi8pOworCiAgICAgc3RhdHVzX3QgY29uZmlndXJlT3V0cHV0QnVmZmVyc0Zyb21OYXRpdmVXaW5kb3coCiAgICAgICAgICAgICBPTVhfVTMyICpuQnVmZmVyQ291bnQsIE9NWF9VMzIgKm5CdWZmZXJTaXplLAogICAgICAgICAgICAgT01YX1UzMiAqbk1pblVuZGVxdWV1ZWRCdWZmZXJzKTsKLSAgICBzdGF0dXNfdCBhbGxvY2F0ZU91dHB1dE1ldGFEYXRhQnVmZmVycygpOwotICAgIHN0YXR1c190IHN1Ym1pdE91dHB1dE1ldGFEYXRhQnVmZmVyKCk7Ci0gICAgdm9pZCBzaWduYWxTdWJtaXRPdXRwdXRNZXRhRGF0YUJ1ZmZlcklmRU9TX3dvcmthcm91bmQoKTsKKyAgICBzdGF0dXNfdCBhbGxvY2F0ZU91dHB1dE1ldGFkYXRhQnVmZmVycygpOworICAgIHN0YXR1c190IHN1Ym1pdE91dHB1dE1ldGFkYXRhQnVmZmVyKCk7CisgICAgdm9pZCBzaWduYWxTdWJtaXRPdXRwdXRNZXRhZGF0YUJ1ZmZlcklmRU9TX3dvcmthcm91bmQoKTsKICAgICBzdGF0dXNfdCBhbGxvY2F0ZU91dHB1dEJ1ZmZlcnNGcm9tTmF0aXZlV2luZG93KCk7CiAgICAgc3RhdHVzX3QgY2FuY2VsQnVmZmVyVG9OYXRpdmVXaW5kb3coQnVmZmVySW5mbyAqaW5mbyk7CiAgICAgc3RhdHVzX3QgZnJlZU91dHB1dEJ1ZmZlcnNOb3RPd25lZEJ5Q29tcG9uZW50KCk7CiAgICAgQnVmZmVySW5mbyAqZGVxdWV1ZUJ1ZmZlckZyb21OYXRpdmVXaW5kb3coKTsKIAorICAgIGlubGluZSBib29sIHN0b3JpbmdNZXRhZGF0YUluRGVjb2RlZEJ1ZmZlcnMoKSB7CisgICAgICAgIHJldHVybiBtT3V0cHV0TWV0YWRhdGFUeXBlID49IDAgJiYgIW1Jc0VuY29kZXI7CisgICAgfQorCisgICAgaW5saW5lIGJvb2wgdXNpbmdNZXRhZGF0YU9uRW5jb2Rlck91dHB1dCgpIHsKKyAgICAgICAgcmV0dXJuIG1PdXRwdXRNZXRhZGF0YVR5cGUgPj0gMCAmJiBtSXNFbmNvZGVyOworICAgIH0KKwogICAgIEJ1ZmZlckluZm8gKmZpbmRCdWZmZXJCeUlEKAogICAgICAgICAgICAgdWludDMyX3QgcG9ydEluZGV4LCBJT01YOjpidWZmZXJfaWQgYnVmZmVySUQsCiAgICAgICAgICAgICBzc2l6ZV90ICppbmRleCA9IE5VTEwpOwpAQCAtMjk5LDYgKzM1Niw5IEBACiAgICAgc3RhdHVzX3Qgc2V0dXBSYXdBdWRpb0Zvcm1hdCgKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgbnVtQ2hhbm5lbHMpOwogCisgICAgc3RhdHVzX3Qgc2V0UHJpb3JpdHkoaW50MzJfdCBwcmlvcml0eSk7CisgICAgc3RhdHVzX3Qgc2V0T3BlcmF0aW5nUmF0ZShmbG9hdCByYXRlRmxvYXQsIGJvb2wgaXNWaWRlbyk7CisKICAgICBzdGF0dXNfdCBzZXRNaW5CdWZmZXJTaXplKE9NWF9VMzIgcG9ydEluZGV4LCBzaXplX3Qgc2l6ZSk7CiAKICAgICBzdGF0dXNfdCBzZXR1cE1QRUc0RW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwpAQCAtMzE2LDggKzM3Niw2IEBACiAKICAgICBzdGF0dXNfdCBpbml0TmF0aXZlV2luZG93KCk7CiAKLSAgICBzdGF0dXNfdCBwdXNoQmxhbmtCdWZmZXJzVG9OYXRpdmVXaW5kb3coKTsKLQogICAgIC8vIFJldHVybnMgdHJ1ZSBpZmYgYWxsIGJ1ZmZlcnMgb24gdGhlIGdpdmVuIHBvcnQgaGF2ZSBzdGF0dXMKICAgICAvLyBPV05FRF9CWV9VUyBvciBPV05FRF9CWV9OQVRJVkVfV0lORE9XLgogICAgIGJvb2wgYWxsWW91ckJ1ZmZlcnNBcmVCZWxvbmdUb1VzKE9NWF9VMzIgcG9ydEluZGV4KTsKQEAgLTMzMiw2ICszOTAsMjMgQEAKICAgICB2b2lkIGRlZmVyTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgdm9pZCBwcm9jZXNzRGVmZXJyZWRNZXNzYWdlcygpOwogCisgICAgdm9pZCBvbkZyYW1lUmVuZGVyZWQoaW50NjRfdCBtZWRpYVRpbWVVcywgbnNlY3NfdCBzeXN0ZW1OYW5vKTsKKyAgICAvLyBjYWxsZWQgd2hlbiB3ZSBoYXZlIGRlcXVldWVkIGEgYnVmZmVyIHxidWZ8IGZyb20gdGhlIG5hdGl2ZSB3aW5kb3cgdG8gdHJhY2sgcmVuZGVyIGluZm8uCisgICAgLy8gfGZlbmNlRmR8IGlzIHRoZSBkZXF1ZXVlIGZlbmNlLCBhbmQgfGluZm98IHBvaW50cyB0byB0aGUgYnVmZmVyIGluZm8gd2hlcmUgdGhpcyBidWZmZXIgaXMKKyAgICAvLyBzdG9yZWQuCisgICAgdm9pZCB1cGRhdGVSZW5kZXJJbmZvRm9yRGVxdWV1ZWRCdWZmZXIoCisgICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyICpidWYsIGludCBmZW5jZUZkLCBCdWZmZXJJbmZvICppbmZvKTsKKworICAgIC8vIENoZWNrcyB0byBzZWUgaWYgYW55IGZyYW1lcyBoYXZlIHJlbmRlcmVkIHVwIHVudGlsIHx1bnRpbHwsIGFuZCB0byBub3RpZnkgY2xpZW50CisgICAgLy8gKE1lZGlhQ29kZWMpIG9mIHJlbmRlcmVkIGZyYW1lcyB1cC11bnRpbCB0aGUgZnJhbWUgcG9pbnRlZCB0byBieSB8dW50aWx8IG9yIHRoZSBmaXJzdAorICAgIC8vIHVucmVuZGVyZWQgZnJhbWUuIFRoZXNlIGZyYW1lcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSByZW5kZXIgcXVldWUuCisgICAgLy8gSWYgfGRyb3BJbmNvbXBsZXRlfCBpcyB0cnVlLCB1bnJlbmRlcmVkIGZyYW1lcyB1cC11bnRpbCB8dW50aWx8IHdpbGwgYmUgZHJvcHBlZCBmcm9tIHRoZQorICAgIC8vIHF1ZXVlLCBhbGxvd2luZyBhbGwgcmVuZGVyZWQgZnJhbWVkIHVwIHRpbGwgdGhlbiB0byBiZSBub3RpZmllZCBvZi4KKyAgICAvLyAoVGhpcyB3aWxsIGVmZmVjdGl2ZWx5IGNsZWFyIHRoZSByZW5kZXIgcXVldWUgdXAtdW50aWwgKGFuZCBpbmNsdWRpbmcpIHx1bnRpbHwuKQorICAgIC8vIElmIHx1bnRpbHwgaXMgTlVMTCwgb3IgaXMgbm90IGluIHRoZSByZW5kZXJlZCBxdWV1ZSwgdGhpcyBtZXRob2Qgd2lsbCBjaGVjayBhbGwgZnJhbWVzLgorICAgIHZvaWQgbm90aWZ5T2ZSZW5kZXJlZEZyYW1lcygKKyAgICAgICAgICAgIGJvb2wgZHJvcEluY29tcGxldGUgPSBmYWxzZSwgRnJhbWVSZW5kZXJUcmFja2VyOjpJbmZvICp1bnRpbCA9IE5VTEwpOworCiAgICAgdm9pZCBzZW5kRm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpOwogICAgIHN0YXR1c190IGdldFBvcnRGb3JtYXQoT01YX1UzMiBwb3J0SW5kZXgsIHNwPEFNZXNzYWdlPiAmbm90aWZ5KTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BTVJXcml0ZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmgKaW5kZXggMzkyZjk2OC4uYjM4YmU1NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BTVJXcml0ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FNUldyaXRlci5oCkBAIC0yNiwxMCArMjYsOSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgTWVkaWFTb3VyY2U7Ci1zdHJ1Y3QgTWV0YURhdGE7CitjbGFzcyBNZXRhRGF0YTsKIAogc3RydWN0IEFNUldyaXRlciA6IHB1YmxpYyBNZWRpYVdyaXRlciB7Ci0gICAgQU1SV3JpdGVyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKICAgICBBTVJXcml0ZXIoaW50IGZkKTsKIAogICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oCmluZGV4IDE0YWZiODUuLmUwY2Q5NjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmgKQEAgLTI1LDkgKzI1LDEwIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgTWVkaWFTb3VyY2U7CitzdHJ1Y3QgQXVkaW9QbGF5YmFja1JhdGU7CiBjbGFzcyBBdWRpb1RyYWNrOwotY2xhc3MgQXdlc29tZVBsYXllcjsKK3N0cnVjdCBBd2Vzb21lUGxheWVyOworY2xhc3MgTWVkaWFTb3VyY2U7CiAKIGNsYXNzIEF1ZGlvUGxheWVyIDogcHVibGljIFRpbWVTb3VyY2UgewogcHVibGljOgpAQCAtNzMsNyArNzQsOCBAQAogICAgIGJvb2wgaXNTZWVraW5nKCk7CiAgICAgYm9vbCByZWFjaGVkRU9TKHN0YXR1c190ICpmaW5hbFN0YXR1cyk7CiAKLSAgICBzdGF0dXNfdCBzZXRQbGF5YmFja1JhdGVQZXJtaWxsZShpbnQzMl90IHJhdGVQZXJtaWxsZSk7CisgICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tSYXRlKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKTsKKyAgICBzdGF0dXNfdCBnZXRQbGF5YmFja1JhdGUoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUgLyogbm9ubnVsbCAqLyk7CiAKICAgICB2b2lkIG5vdGlmeUF1ZGlvRU9TKCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaAppbmRleCA0YzlhYWFkLi4zMDc0OTEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oCkBAIC0zNSw4ICszNSwxMCBAQAogICAgIC8vIF9ub3RfIGEgYml0bWFzayBvZiBhdWRpb19jaGFubmVsc190IGNvbnN0YW50cy4KICAgICBBdWRpb1NvdXJjZSgKICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYgJm9wUGFja2FnZU5hbWUsCiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMgPSAxKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxzLAorICAgICAgICAgICAgdWludDMyX3Qgb3V0U2FtcGxlUmF0ZSA9IDApOwogCiAgICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CiAKQEAgLTc3LDExICs3OSwxMyBAQAogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAgICAgYm9vbCBtU3RhcnRlZDsKICAgICBpbnQzMl90IG1TYW1wbGVSYXRlOworICAgIGludDMyX3QgbU91dFNhbXBsZVJhdGU7CiAKICAgICBib29sIG1UcmFja01heEFtcGxpdHVkZTsKICAgICBpbnQ2NF90IG1TdGFydFRpbWVVczsKICAgICBpbnQxNl90IG1NYXhBbXBsaXR1ZGU7CiAgICAgaW50NjRfdCBtUHJldlNhbXBsZVRpbWVVczsKKyAgICBpbnQ2NF90IG1GaXJzdFNhbXBsZVRpbWVVczsKICAgICBpbnQ2NF90IG1Jbml0aWFsUmVhZFRpbWVVczsKICAgICBpbnQ2NF90IG1OdW1GcmFtZXNSZWNlaXZlZDsKICAgICBpbnQ2NF90IG1OdW1DbGllbnRPd25lZEJ1ZmZlcnM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0J1ZmZlclByb2R1Y2VyV3JhcHBlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9CdWZmZXJQcm9kdWNlcldyYXBwZXIuaAppbmRleCBkOGFjZjMwLi40Y2FhMmM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0J1ZmZlclByb2R1Y2VyV3JhcHBlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQnVmZmVyUHJvZHVjZXJXcmFwcGVyLmgKQEAgLTE5LDYgKzE5LDcgQEAKICNkZWZpbmUgQlVGRkVSX1BST0RVQ0VSX1dSQVBQRVJfSF8KIAogI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCmluZGV4IGRkMGExMDYuLjA2OWU4OTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaApAQCAtODMsNyArODMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSB2aWRlb1NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBzdXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdG9yZU1ldGFEYXRhSW5WaWRlb0J1ZmZlcnMgPSBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0b3JlTWV0YURhdGFJblZpZGVvQnVmZmVycyA9IHRydWUpOwogCiAgICAgdmlydHVhbCB+Q2FtZXJhU291cmNlKCk7CiAKQEAgLTE0OSw2ICsxNDksOCBAQAogICAgIGludDMyX3QgIG1OdW1JbnB1dEJ1ZmZlcnM7CiAgICAgaW50MzJfdCAgbVZpZGVvRnJhbWVSYXRlOwogICAgIGludDMyX3QgIG1Db2xvckZvcm1hdDsKKyAgICBpbnQzMl90ICBtRW5jb2RlckZvcm1hdDsKKyAgICBpbnQzMl90ICBtRW5jb2RlckRhdGFTcGFjZTsKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogCiAgICAgc3A8Q2FtZXJhPiAgIG1DYW1lcmE7CkBAIC0xODgsNyArMTkwLDcgQEAKICAgICB2b2lkIHJlbGVhc2VDYW1lcmEoKTsKIAogcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgQ2FtZXJhU291cmNlTGlzdGVuZXI7CisgICAgZnJpZW5kIHN0cnVjdCBDYW1lcmFTb3VyY2VMaXN0ZW5lcjsKIAogICAgIE11dGV4IG1Mb2NrOwogICAgIENvbmRpdGlvbiBtRnJhbWVBdmFpbGFibGVDb25kaXRpb247CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaAppbmRleCAxYmYyN2E2Li5iYjM2MDUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmgKQEAgLTI2LDYgKzI2LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFCdWZmZXI7CitzdHJ1Y3QgUGVyc2lzdGVudFN1cmZhY2U7CiAKIHN0cnVjdCBDb2RlY0Jhc2UgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIGVudW0gewpAQCAtMzksOCArNDAsMTAgQEAKICAgICAgICAga1doYXRDb21wb25lbnRBbGxvY2F0ZWQgID0gJ2NBbGwnLAogICAgICAgICBrV2hhdENvbXBvbmVudENvbmZpZ3VyZWQgPSAnY0NvbicsCiAgICAgICAgIGtXaGF0SW5wdXRTdXJmYWNlQ3JlYXRlZCA9ICdpc2ZjJywKKyAgICAgICAga1doYXRJbnB1dFN1cmZhY2VBY2NlcHRlZCA9ICdpc2ZhJywKICAgICAgICAga1doYXRTaWduYWxlZElucHV0RU9TICAgID0gJ3Nlb3MnLAogICAgICAgICBrV2hhdEJ1ZmZlcnNBbGxvY2F0ZWQgICAgPSAnYWxsYycsCisgICAgICAgIGtXaGF0T3V0cHV0RnJhbWVzUmVuZGVyZWQgPSAnb3V0UicsCiAgICAgfTsKIAogICAgIHZpcnR1YWwgdm9pZCBzZXROb3RpZmljYXRpb25NZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSA9IDA7CkBAIC00OCwxMiArNTEsMTYgQEAKICAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVBbGxvY2F0ZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUNvbmZpZ3VyZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUNyZWF0ZUlucHV0U3VyZmFjZSgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTZXRJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gJnN1cmZhY2UpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTdGFydCgpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTaHV0ZG93bihib29sIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQgPSBmYWxzZSkgPSAwOwogCiAgICAgLy8gcmVxdWlyZSBhbiBleHBsaWNpdCBtZXNzYWdlIGhhbmRsZXIKICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpID0gMDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH0KKwogICAgIHZpcnR1YWwgdm9pZCBzaWduYWxGbHVzaCgpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsUmVzdW1lKCkgPSAwOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCmluZGV4IDc2NmE4MWQuLjQ3YzVjMzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCkBAIC0zMiw2ICszMiw3IEBACiAKIHN0cnVjdCBBTWVzc2FnZTsKIHN0cnVjdCBBU3RyaW5nOworY2xhc3MgIElEYXRhU291cmNlOwogc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOwogY2xhc3MgU3RyaW5nODsKIHN0cnVjdCBIVFRQQmFzZTsKQEAgLTUzLDExICs1NCwxNSBAQAogICAgICAgICAgICAgSFRUUEJhc2UgKmh0dHBTb3VyY2UgPSBOVUxMKTsKIAogICAgIHN0YXRpYyBzcDxEYXRhU291cmNlPiBDcmVhdGVNZWRpYUhUVFAoY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSk7CisgICAgc3RhdGljIHNwPERhdGFTb3VyY2U+IENyZWF0ZUZyb21JRGF0YVNvdXJjZShjb25zdCBzcDxJRGF0YVNvdXJjZT4gJnNvdXJjZSk7CiAKICAgICBEYXRhU291cmNlKCkge30KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3QgPSAwOwogCisgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIC0xIG9uIGZhaWx1cmUuIEl0J3Mgbm90IGFuIGVycm9yIGlmCisgICAgLy8gdGhpcyByZXR1cm5zIHplcm87IGl0IGp1c3QgbWVhbnMgdGhlIGdpdmVuIG9mZnNldCBpcyBlcXVhbCB0bywgb3IKKyAgICAvLyBiZXlvbmQsIHRoZSBlbmQgb2YgdGhlIHNvdXJjZS4KICAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgPSAwOwogCiAgICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kczoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZyYW1lUmVuZGVyVHJhY2tlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMzNlOGYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZyYW1lUmVuZGVyVHJhY2tlci5oCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZSQU1FX1JFTkRFUl9UUkFDS0VSX0hfCisKKyNkZWZpbmUgRlJBTUVfUkVOREVSX1RSQUNLRVJfSF8KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorCisjaW5jbHVkZSA8bGlzdD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBGZW5jZTsKK2NsYXNzIEdyYXBoaWNCdWZmZXI7CisKK3N0cnVjdCBGcmFtZVJlbmRlclRyYWNrZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgLy8gVHJhY2tzIHRoZSByZW5kZXIgaW5mb3JtYXRpb24gYWJvdXQgYSBmcmFtZS4gRnJhbWVzIGdvIHRocm91Z2ggc2V2ZXJhbCBzdGF0ZXMgd2hpbGUKKyAgICAvLyB0aGUgcmVuZGVyIGluZm9ybWF0aW9uIGlzIHRyYWNrZWQ6CisgICAgLy8KKyAgICAvLyAxLiBxdWV1ZWQgZnJhbWU6IG1NZWRpYVRpbWUgYW5kIG1HcmFwaGljQnVmZmVyIGFyZSBzZXQgZm9yIHRoZSBmcmFtZS4gbUZlbmNlIGlzIHRoZQorICAgIC8vIHF1ZXVlIGZlbmNlIChyZWFkIGZlbmNlKS4gbUluZGV4IGlzIG5lZ2F0aXZlLCBhbmQgbVJlbmRlclRpbWVOcyBpcyBpbnZhbGlkLgorICAgIC8vIEtleSBjaGFyYWN0ZXJpc3RpY3M6IG1GZW5jZSBpcyBub3QgTlVMTCBhbmQgbUluZGV4IGlzIG5lZ2F0aXZlLgorICAgIC8vCisgICAgLy8gMi4gZGVxdWV1ZWQgZnJhbWU6IG1GZW5jZSBpcyB1cGRhdGVkIHdpdGggdGhlIGRlcXVldWUgZmVuY2UgKHdyaXRlIGZlbmNlKS4gbUluZGV4IGlzIHNldC4KKyAgICAvLyBLZXkgY2hhcmFjdGVyaXN0aWNzOiBtRmVuY2UgaXMgbm90IE5VTEwgYW5kIG1JbmRleCBpcyBub24tbmVnYXRpdmUuIG1SZW5kZXJUaW1lIGlzIHN0aWxsCisgICAgLy8gaW52YWxpZC4KKyAgICAvLworICAgIC8vIDMuIHJlbmRlcmVkIGZyYW1lIG9yIGZyYW1lOiBtRmVuY2UgaXMgY2xlYXJlZCwgbVJlbmRlclRpbWVOcyBpcyBzZXQuCisgICAgLy8gS2V5IGNoYXJhY3RlcmlzdGljczogbUZlbmNlIGlzIE5VTEwuCisgICAgLy8KKyAgICBzdHJ1Y3QgSW5mbyB7CisgICAgICAgIC8vIHNldCBieSBjbGllbnQgZHVyaW5nIG9uRnJhbWVRdWV1ZWQgb3Igb25GcmFtZVJlbmRlcmVkCisgICAgICAgIGludDY0X3QgZ2V0TWVkaWFUaW1lVXMoKSBjb25zdCAgeyByZXR1cm4gbU1lZGlhVGltZVVzOyB9CisKKyAgICAgICAgLy8gLTEgaWYgZnJhbWUgaXMgbm90IHlldCByZW5kZXJlZAorICAgICAgICBuc2Vjc190IGdldFJlbmRlclRpbWVOcygpIGNvbnN0IHsgcmV0dXJuIG1SZW5kZXJUaW1lTnM7IH0KKworICAgICAgICAvLyBzZXQgYnkgY2xpZW50IGR1cmluZyB1cGRhdGVSZW5kZXJJbmZvRm9yRGVxdWV1ZWRCdWZmZXI7IC0xIG90aGVyd2lzZQorICAgICAgICBzc2l6ZV90IGdldEluZGV4KCkgY29uc3QgICAgICAgIHsgcmV0dXJuIG1JbmRleDsgfQorCisgICAgICAgIC8vIGNyZWF0ZXMgaW5mb3JtYXRpb24gZm9yIGEgcXVldWVkIGZyYW1lCisgICAgICAgIEluZm8oaW50NjRfdCBtZWRpYVRpbWVVcywgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIsIGNvbnN0IHNwPEZlbmNlPiAmZmVuY2UpCisgICAgICAgICAgICA6IG1NZWRpYVRpbWVVcyhtZWRpYVRpbWVVcyksCisgICAgICAgICAgICAgIG1SZW5kZXJUaW1lTnMoLTEpLAorICAgICAgICAgICAgICBtSW5kZXgoLTEpLAorICAgICAgICAgICAgICBtR3JhcGhpY0J1ZmZlcihncmFwaGljQnVmZmVyKSwKKyAgICAgICAgICAgICAgbUZlbmNlKGZlbmNlKSB7CisgICAgICAgIH0KKworICAgICAgICAvLyBjcmVhdGVzIGluZm9ybWF0aW9uIGZvciBhIGZyYW1lIHJlbmRlcmVkIG9uIGEgdHVubmVsZWQgc3VyZmFjZQorICAgICAgICBJbmZvKGludDY0X3QgbWVkaWFUaW1lVXMsIG5zZWNzX3QgcmVuZGVyVGltZU5zKQorICAgICAgICAgICAgOiBtTWVkaWFUaW1lVXMobWVkaWFUaW1lVXMpLAorICAgICAgICAgICAgICBtUmVuZGVyVGltZU5zKHJlbmRlclRpbWVOcyksCisgICAgICAgICAgICAgIG1JbmRleCgtMSksCisgICAgICAgICAgICAgIG1HcmFwaGljQnVmZmVyKE5VTEwpLAorICAgICAgICAgICAgICBtRmVuY2UoTlVMTCkgeworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBpbnQ2NF90IG1NZWRpYVRpbWVVczsKKyAgICAgICAgbnNlY3NfdCBtUmVuZGVyVGltZU5zOworICAgICAgICBzc2l6ZV90IG1JbmRleDsgICAgICAgICAvLyB0byBiZSB1c2VkIGJ5IGNsaWVudAorICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBtR3JhcGhpY0J1ZmZlcjsKKyAgICAgICAgc3A8RmVuY2U+IG1GZW5jZTsKKworICAgICAgICBmcmllbmQgY2xhc3MgRnJhbWVSZW5kZXJUcmFja2VyOworICAgIH07CisKKyAgICBGcmFtZVJlbmRlclRyYWNrZXIoKTsKKworICAgIHZvaWQgc2V0Q29tcG9uZW50TmFtZShjb25zdCBBU3RyaW5nICZjb21wb25lbnROYW1lKTsKKworICAgIC8vIGNsZWFycyBhbGwgdHJhY2tlZCBmcmFtZXMsIGFuZCByZXNldHMgbGFzdCByZW5kZXIgdGltZQorICAgIHZvaWQgY2xlYXIobnNlY3NfdCBsYXN0UmVuZGVyVGltZU5zKTsKKworICAgIC8vIGNhbGxlZCB3aGVuIHxncmFwaGljQnVmZmVyfCBjb3JyZXNwb25kaW5nIHRvIHxtZWRpYVRpbWVVc3wgaXMKKyAgICAvLyBxdWV1ZWQgdG8gdGhlIG91dHB1dCBzdXJmYWNlIHVzaW5nIHxmZW5jZXwuCisgICAgdm9pZCBvbkZyYW1lUXVldWVkKAorICAgICAgICAgICAgaW50NjRfdCBtZWRpYVRpbWVVcywgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIsIGNvbnN0IHNwPEZlbmNlPiAmZmVuY2UpOworCisgICAgLy8gQ2FsbGVkIHdoZW4gd2UgaGF2ZSBkZXF1ZXVlZCBhIGJ1ZmZlciB8YnVmfCBmcm9tIHRoZSBuYXRpdmUgd2luZG93IHRvIHRyYWNrIHJlbmRlciBpbmZvLgorICAgIC8vIHxmZW5jZUZkfCBpcyB0aGUgZGVxdWV1ZSBmZW5jZSwgYW5kIHxpbmRleHwgaXMgYSBwb3NpdGl2ZSBidWZmZXIgSUQgdG8gYmUgdXNhYmxlIGJ5IHRoZQorICAgIC8vIGNsaWVudCB0byB0cmFjayB0aGlzIHJlbmRlciBpbmZvIGFtb25nIHRoZSBkZXF1ZXVlZCBidWZmZXJzLgorICAgIC8vIFJldHVybnMgcG9pbnRlciB0byB0aGUgdHJhY2tlZCBpbmZvLCBvciBOVUxMIGlmIGJ1ZmZlciBpcyBub3QgdHJhY2tlZCBvciBpZiB8aW5kZXh8CisgICAgLy8gaXMgbmVnYXRpdmUuCisgICAgSW5mbyAqdXBkYXRlSW5mb0ZvckRlcXVldWVkQnVmZmVyKEFOYXRpdmVXaW5kb3dCdWZmZXIgKmJ1ZiwgaW50IGZlbmNlRmQsIGludCBpbmRleCk7CisKKyAgICAvLyBjYWxsZWQgd2hlbiB0dW5uZWxlZCBjb2RlYyBzaWduYWxzIGZyYW1lIHJlbmRlcmVkIGV2ZW50CisgICAgLy8gcmV0dXJucyBCQURfVkFMVUUgaWYgc3lzdGVtTmFubyBpcyBub3QgbW9ub3RvbmljLiBPdGhlcndpc2UsIHJldHVybnMgT0suCisgICAgc3RhdHVzX3Qgb25GcmFtZVJlbmRlcmVkKGludDY0X3QgbWVkaWFUaW1lVXMsIG5zZWNzX3Qgc3lzdGVtTmFubyk7CisKKyAgICAvLyBDaGVja3MgdG8gc2VlIGlmIGFueSBmcmFtZXMgaGF2ZSByZW5kZXJlZCB1cCB1bnRpbCB8dW50aWx8LiBJZiB8dW50aWx8IGlzIE5VTEwgb3Igbm90IGEKKyAgICAvLyB0cmFja2VkIGluZm8sIHRoaXMgbWV0aG9kIHNlYXJjaGVzIHRoZSBlbnRpcmUgcmVuZGVyIHF1ZXVlLgorICAgIC8vIFJldHVybnMgbGlzdCBvZiByZW5kZXJlZCBmcmFtZXMgdXAtdW50aWwgdGhlIGZyYW1lIHBvaW50ZWQgdG8gYnkgfHVudGlsfCBvciB0aGUgZmlyc3QKKyAgICAvLyB1bnJlbmRlcmVkIGZyYW1lLCBhcyB3ZWxsIGFzIGFueSBkcm9wcGVkIGZyYW1lcyAodGhvc2Ugd2l0aCBpbnZhbGlkIGZlbmNlKSB1cC11bnRpbCB8dW50aWx8LgorICAgIC8vIFRoZXNlIGZyYW1lcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSByZW5kZXIgcXVldWUuCisgICAgLy8gSWYgfGRyb3BJbmNvbXBsZXRlfCBpcyB0cnVlLCB1bnJlbmRlcmVkIGZyYW1lcyB1cC11bnRpbCB8dW50aWx8IHdpbGwgYWxzbyBiZSBkcm9wcGVkIGZyb20gdGhlCisgICAgLy8gcXVldWUsIGFsbG93aW5nIGFsbCByZW5kZXJlZCBmcmFtZWQgdXAgdGlsbCB0aGVuIHRvIGJlIG5vdGlmaWVkIG9mLgorICAgIC8vIChUaGlzIHdpbGwgZWZmZWN0aXZlbHkgY2xlYXIgdGhlIHJlbmRlciBxdWV1ZSB1cC11bnRpbCAoYW5kIGluY2x1ZGluZykgfHVudGlsfC4pCisgICAgc3RkOjpsaXN0PEluZm8+IGNoZWNrRmVuY2VzQW5kR2V0UmVuZGVyZWRGcmFtZXMoY29uc3QgSW5mbyAqdW50aWwsIGJvb2wgZHJvcEluY29tcGxldGUpOworCisgICAgLy8gU3RvcCB0cmFja2luZyBhIHF1ZXVlZCBmcmFtZSAoZS5nLiBpZiB0aGUgZnJhbWUgaGFzIGJlZW4gZGlzY2FyZGVkKS4gSWYgfGluZm98IGlzIE5VTEwgb3IgaXMKKyAgICAvLyBub3QgdHJhY2tlZCwgdGhpcyBtZXRob2QgaXMgYSBuby1vcC4gSWYgfGluZGV4fCBpcyBzcGVjaWZpZWQsIGFsbCBpbmRpY2VzIGxhcmdlciB0aGF0IHxpbmRleHwKKyAgICAvLyBhcmUgZGVjcmVtZW50ZWQuIFRoaXMgaXMgdXNlZnVsIGlmIHRoZSB1bnRyYWNrZWQgZnJhbWUgaXMgZGVsZXRlZCBmcm9tIHRoZSBmcmFtZSB2ZWN0b3IuCisgICAgdm9pZCB1bnRyYWNrRnJhbWUoY29uc3QgSW5mbyAqaW5mbywgc3NpemVfdCBpbmRleCA9IFNTSVpFX01BWCk7CisKKyAgICB2b2lkIGR1bXBSZW5kZXJRdWV1ZSgpIGNvbnN0OworCisgICAgdmlydHVhbCB+RnJhbWVSZW5kZXJUcmFja2VyKCk7CisKK3ByaXZhdGU6CisKKyAgICAvLyBSZW5kZXIgaW5mb3JtYXRpb24gZm9yIGJ1ZmZlcnMuIFJlZ3VsYXIgc3VyZmFjZSBidWZmZXJzIGFyZSBxdWV1ZWQgaW4gdGhlIG9yZGVyIG9mCisgICAgLy8gcmVuZGVyaW5nLiBUdW5uZWxlZCBidWZmZXJzIGFyZSBxdWV1ZWQgaW4gdGhlIG9yZGVyIG9mIHJlY2VpcHQuCisgICAgc3RkOjpsaXN0PEluZm8+IG1SZW5kZXJRdWV1ZTsKKyAgICBuc2Vjc190IG1MYXN0UmVuZGVyVGltZU5zOworICAgIEFTdHJpbmcgbUNvbXBvbmVudE5hbWU7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGcmFtZVJlbmRlclRyYWNrZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBGUkFNRV9SRU5ERVJfVFJBQ0tFUl9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuaAppbmRleCAyZTI5MjJlLi4zZDc5NjBiIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuaApAQCAtMjksNyArMjksNiBAQAogCiBzdHJ1Y3QgTVBFRzJUU1dyaXRlciA6IHB1YmxpYyBNZWRpYVdyaXRlciB7CiAgICAgTVBFRzJUU1dyaXRlcihpbnQgZmQpOwotICAgIE1QRUcyVFNXcml0ZXIoY29uc3QgY2hhciAqZmlsZW5hbWUpOwogCiAgICAgTVBFRzJUU1dyaXRlcigKICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaAppbmRleCAyNmNlNWY5Li5hMTk1ZmU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oCkBAIC0yNiwxMyArMjYsMTMgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitjbGFzcyBBTWVzc2FnZTsKIGNsYXNzIE1lZGlhQnVmZmVyOwogY2xhc3MgTWVkaWFTb3VyY2U7CiBjbGFzcyBNZXRhRGF0YTsKIAogY2xhc3MgTVBFRzRXcml0ZXIgOiBwdWJsaWMgTWVkaWFXcml0ZXIgewogcHVibGljOgotICAgIE1QRUc0V3JpdGVyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKICAgICBNUEVHNFdyaXRlcihpbnQgZmQpOwogCiAgICAgLy8gTGltaXRhdGlvbnMKQEAgLTQ5LDYgKzQ5LDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogICAgIHZvaWQgYmVnaW5Cb3goY29uc3QgY2hhciAqZm91cmNjKTsKKyAgICB2b2lkIGJlZ2luQm94KHVpbnQzMl90IGlkKTsKICAgICB2b2lkIHdyaXRlSW50OChpbnQ4X3QgeCk7CiAgICAgdm9pZCB3cml0ZUludDE2KGludDE2X3QgeCk7CiAgICAgdm9pZCB3cml0ZUludDMyKGludDMyX3QgeCk7CkBAIC02Myw2ICs2NCw3IEBACiAgICAgaW50MzJfdCBnZXRUaW1lU2NhbGUoKSBjb25zdCB7IHJldHVybiBtVGltZVNjYWxlOyB9CiAKICAgICBzdGF0dXNfdCBzZXRHZW9EYXRhKGludCBsYXRpdHVkZXgxMDAwMCwgaW50IGxvbmdpdHVkZXgxMDAwMCk7CisgICAgc3RhdHVzX3Qgc2V0Q2FwdHVyZVJhdGUoZmxvYXQgY2FwdHVyZUZwcyk7CiAgICAgdmlydHVhbCB2b2lkIHNldFN0YXJ0VGltZU9mZnNldE1zKGludCBtcykgeyBtU3RhcnRUaW1lT2Zmc2V0TXMgPSBtczsgfQogICAgIHZpcnR1YWwgaW50MzJfdCBnZXRTdGFydFRpbWVPZmZzZXRNcygpIGNvbnN0IHsgcmV0dXJuIG1TdGFydFRpbWVPZmZzZXRNczsgfQogCkBAIC04OSw2ICs5MSw3IEBACiAgICAgb2ZmNjRfdCBtRnJlZUJveE9mZnNldDsKICAgICBib29sIG1TdHJlYW1hYmxlRmlsZTsKICAgICBvZmY2NF90IG1Fc3RpbWF0ZWRNb292Qm94U2l6ZTsKKyAgICBvZmY2NF90IG1Nb292RXh0cmFTaXplOwogICAgIHVpbnQzMl90IG1JbnRlcmxlYXZlRHVyYXRpb25VczsKICAgICBpbnQzMl90IG1UaW1lU2NhbGU7CiAgICAgaW50NjRfdCBtU3RhcnRUaW1lc3RhbXBVczsKQEAgLTEwMyw2ICsxMDYsOCBAQAogCiAgICAgTGlzdDxvZmY2NF90PiBtQm94ZXM7CiAKKyAgICBzcDxBTWVzc2FnZT4gbU1ldGFLZXlzOworCiAgICAgdm9pZCBzZXRTdGFydFRpbWVzdGFtcFVzKGludDY0X3QgdGltZVVzKTsKICAgICBpbnQ2NF90IGdldFN0YXJ0VGltZXN0YW1wVXMoKTsgIC8vIE5vdCBjb25zdAogICAgIHN0YXR1c190IHN0YXJ0VHJhY2tzKE1ldGFEYXRhICpwYXJhbXMpOwpAQCAtMTk2LDYgKzIwMSwxMiBAQAogICAgIHZvaWQgd3JpdGVHZW9EYXRhQm94KCk7CiAgICAgdm9pZCB3cml0ZUxhdGl0dWRlKGludCBkZWdyZWV4MTAwMDApOwogICAgIHZvaWQgd3JpdGVMb25naXR1ZGUoaW50IGRlZ3JlZXgxMDAwMCk7CisKKyAgICB2b2lkIGFkZERldmljZU1ldGEoKTsKKyAgICB2b2lkIHdyaXRlSGRscigpOworICAgIHZvaWQgd3JpdGVLZXlzKCk7CisgICAgdm9pZCB3cml0ZUlsc3QoKTsKKyAgICB2b2lkIHdyaXRlTWV0YUJveCgpOwogICAgIHZvaWQgc2VuZFNlc3Npb25TdW1tYXJ5KCk7CiAgICAgdm9pZCByZWxlYXNlKCk7CiAgICAgc3RhdHVzX3QgcmVzZXQoKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQxYTgwOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5oCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0NMT0NLX0hfCisKKyNkZWZpbmUgTUVESUFfQ0xPQ0tfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQU1lc3NhZ2U7CisKK3N0cnVjdCBNZWRpYUNsb2NrIDogcHVibGljIFJlZkJhc2UgeworICAgIE1lZGlhQ2xvY2soKTsKKworICAgIHZvaWQgc2V0U3RhcnRpbmdUaW1lTWVkaWEoaW50NjRfdCBzdGFydGluZ1RpbWVNZWRpYVVzKTsKKworICAgIHZvaWQgY2xlYXJBbmNob3IoKTsKKyAgICAvLyBJdCdzIHJlcXVpcmVkIHRvIHVzZSB0aW1lc3RhbXAgb2YganVzdCByZW5kZXJlZCBmcmFtZSBhcworICAgIC8vIGFuY2hvciB0aW1lIGluIHBhdXNlZCBzdGF0ZS4KKyAgICB2b2lkIHVwZGF0ZUFuY2hvcigKKyAgICAgICAgICAgIGludDY0X3QgYW5jaG9yVGltZU1lZGlhVXMsCisgICAgICAgICAgICBpbnQ2NF90IGFuY2hvclRpbWVSZWFsVXMsCisgICAgICAgICAgICBpbnQ2NF90IG1heFRpbWVNZWRpYVVzID0gSU5UNjRfTUFYKTsKKworICAgIHZvaWQgdXBkYXRlTWF4VGltZU1lZGlhKGludDY0X3QgbWF4VGltZU1lZGlhVXMpOworCisgICAgdm9pZCBzZXRQbGF5YmFja1JhdGUoZmxvYXQgcmF0ZSk7CisgICAgZmxvYXQgZ2V0UGxheWJhY2tSYXRlKCkgY29uc3Q7CisKKyAgICAvLyBxdWVyeSBtZWRpYSB0aW1lIGNvcnJlc3BvbmRpbmcgdG8gcmVhbCB0aW1lIHxyZWFsVXN8LCBhbmQgc2F2ZSB0aGUKKyAgICAvLyByZXN1bHQgaW4gfG91dE1lZGlhVXN8LgorICAgIHN0YXR1c190IGdldE1lZGlhVGltZSgKKyAgICAgICAgICAgIGludDY0X3QgcmVhbFVzLAorICAgICAgICAgICAgaW50NjRfdCAqb3V0TWVkaWFVcywKKyAgICAgICAgICAgIGJvb2wgYWxsb3dQYXN0TWF4VGltZSA9IGZhbHNlKSBjb25zdDsKKyAgICAvLyBxdWVyeSByZWFsIHRpbWUgY29ycmVzcG9uZGluZyB0byBtZWRpYSB0aW1lIHx0YXJnZXRNZWRpYVVzfC4KKyAgICAvLyBUaGUgcmVzdWx0IGlzIHNhdmVkIGluIHxvdXRSZWFsVXN8LgorICAgIHN0YXR1c190IGdldFJlYWxUaW1lRm9yKGludDY0X3QgdGFyZ2V0TWVkaWFVcywgaW50NjRfdCAqb3V0UmVhbFVzKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1lZGlhQ2xvY2soKTsKKworcHJpdmF0ZToKKyAgICBzdGF0dXNfdCBnZXRNZWRpYVRpbWVfbCgKKyAgICAgICAgICAgIGludDY0X3QgcmVhbFVzLAorICAgICAgICAgICAgaW50NjRfdCAqb3V0TWVkaWFVcywKKyAgICAgICAgICAgIGJvb2wgYWxsb3dQYXN0TWF4VGltZSkgY29uc3Q7CisKKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOworCisgICAgaW50NjRfdCBtQW5jaG9yVGltZU1lZGlhVXM7CisgICAgaW50NjRfdCBtQW5jaG9yVGltZVJlYWxVczsKKyAgICBpbnQ2NF90IG1NYXhUaW1lTWVkaWFVczsKKyAgICBpbnQ2NF90IG1TdGFydGluZ1RpbWVNZWRpYVVzOworCisgICAgZmxvYXQgbVBsYXliYWNrUmF0ZTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lZGlhQ2xvY2spOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9DTE9DS19IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaAppbmRleCBkNDQ4MDk3Li5jMTA5NjNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaApAQCAtMjAsMTcgKzIwLDI1IEBACiAKICNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0NyeXB0b0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhUmVzb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFCdWZmZXI7CiBzdHJ1Y3QgQU1lc3NhZ2U7CitzdHJ1Y3QgQVJlcGx5VG9rZW47CiBzdHJ1Y3QgQVN0cmluZzsKIHN0cnVjdCBDb2RlY0Jhc2U7Ci1zdHJ1Y3QgSUNyeXB0bzsKIHN0cnVjdCBJQmF0dGVyeVN0YXRzOworc3RydWN0IElDcnlwdG87CitjbGFzcyBJTWVtb3J5Oworc3RydWN0IE1lbW9yeURlYWxlcjsKK2NsYXNzIElSZXNvdXJjZU1hbmFnZXJDbGllbnQ7CitjbGFzcyBJUmVzb3VyY2VNYW5hZ2VyU2VydmljZTsKK3N0cnVjdCBQZXJzaXN0ZW50U3VyZmFjZTsKIHN0cnVjdCBTb2Z0d2FyZVJlbmRlcmVyOwogc3RydWN0IFN1cmZhY2U7CiAKQEAgLTUwLDE1ICs1OCwyMCBAQAogICAgICAgICBDQl9PVVRQVVRfQVZBSUxBQkxFID0gMiwKICAgICAgICAgQ0JfRVJST1IgPSAzLAogICAgICAgICBDQl9PVVRQVVRfRk9STUFUX0NIQU5HRUQgPSA0LAorICAgICAgICBDQl9SRVNPVVJDRV9SRUNMQUlNRUQgPSA1LAogICAgIH07CiAKLSAgICBzdHJ1Y3QgQmF0dGVyeU5vdGlmaWVyOworICAgIHN0YXRpYyBjb25zdCBwaWRfdCBrTm9QaWQgPSAtMTsKIAogICAgIHN0YXRpYyBzcDxNZWRpYUNvZGVjPiBDcmVhdGVCeVR5cGUoCi0gICAgICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLCBjb25zdCBjaGFyICptaW1lLCBib29sIGVuY29kZXIsIHN0YXR1c190ICplcnIgPSBOVUxMKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IGNoYXIgKm1pbWUsIGJvb2wgZW5jb2Rlciwgc3RhdHVzX3QgKmVyciA9IE5VTEwsCisgICAgICAgICAgICBwaWRfdCBwaWQgPSBrTm9QaWQpOwogCiAgICAgc3RhdGljIHNwPE1lZGlhQ29kZWM+IENyZWF0ZUJ5Q29tcG9uZW50TmFtZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IGNoYXIgKm5hbWUsIHN0YXR1c190ICplcnIgPSBOVUxMKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IGNoYXIgKm5hbWUsIHN0YXR1c190ICplcnIgPSBOVUxMLAorICAgICAgICAgICAgcGlkX3QgcGlkID0ga05vUGlkKTsKKworICAgIHN0YXRpYyBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gQ3JlYXRlUGVyc2lzdGVudElucHV0U3VyZmFjZSgpOwogCiAgICAgc3RhdHVzX3QgY29uZmlndXJlKAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCkBAIC02OCw4ICs4MSwxMiBAQAogCiAgICAgc3RhdHVzX3Qgc2V0Q2FsbGJhY2soY29uc3Qgc3A8QU1lc3NhZ2U+ICZjYWxsYmFjayk7CiAKKyAgICBzdGF0dXNfdCBzZXRPbkZyYW1lUmVuZGVyZWROb3RpZmljYXRpb24oY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOworCiAgICAgc3RhdHVzX3QgY3JlYXRlSW5wdXRTdXJmYWNlKHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+KiBidWZmZXJQcm9kdWNlcik7CiAKKyAgICBzdGF0dXNfdCBzZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3A8UGVyc2lzdGVudFN1cmZhY2U+ICZzdXJmYWNlKTsKKwogICAgIHN0YXR1c190IHN0YXJ0KCk7CiAKICAgICAvLyBSZXR1cm5zIHRvIGEgc3RhdGUgaW4gd2hpY2ggdGhlIGNvbXBvbmVudCByZW1haW5zIGFsbG9jYXRlZCBidXQKQEAgLTEyNSw2ICsxNDIsOCBAQAogICAgIHN0YXR1c190IGdldE91dHB1dEZvcm1hdChzcDxBTWVzc2FnZT4gKmZvcm1hdCkgY29uc3Q7CiAgICAgc3RhdHVzX3QgZ2V0SW5wdXRGb3JtYXQoc3A8QU1lc3NhZ2U+ICpmb3JtYXQpIGNvbnN0OwogCisgICAgc3RhdHVzX3QgZ2V0V2lkZXZpbmVMZWdhY3lCdWZmZXJzKFZlY3RvcjxzcDxBQnVmZmVyPiA+ICpidWZmZXJzKSBjb25zdDsKKwogICAgIHN0YXR1c190IGdldElucHV0QnVmZmVycyhWZWN0b3I8c3A8QUJ1ZmZlcj4gPiAqYnVmZmVycykgY29uc3Q7CiAgICAgc3RhdHVzX3QgZ2V0T3V0cHV0QnVmZmVycyhWZWN0b3I8c3A8QUJ1ZmZlcj4gPiAqYnVmZmVycykgY29uc3Q7CiAKQEAgLTEzMiw2ICsxNTEsOCBAQAogICAgIHN0YXR1c190IGdldE91dHB1dEZvcm1hdChzaXplX3QgaW5kZXgsIHNwPEFNZXNzYWdlPiAqZm9ybWF0KTsKICAgICBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlcihzaXplX3QgaW5kZXgsIHNwPEFCdWZmZXI+ICpidWZmZXIpOwogCisgICAgc3RhdHVzX3Qgc2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmbmF0aXZlV2luZG93KTsKKwogICAgIHN0YXR1c190IHJlcXVlc3RJRFJGcmFtZSgpOwogCiAgICAgLy8gTm90aWZpY2F0aW9uIHdpbGwgYmUgcG9zdGVkIG9uY2UgdGhlcmUgImlzIHNvbWV0aGluZyB0byBkbyIsIGkuZS4KQEAgLTE0MywxMSArMTY0LDIyIEBACiAKICAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKTsKIAorICAgIC8vIENyZWF0ZSBhIE1lZGlhQ29kZWMgbm90aWZpY2F0aW9uIG1lc3NhZ2UgZnJvbSBhIGxpc3Qgb2YgcmVuZGVyZWQgb3IgZHJvcHBlZCByZW5kZXIgaW5mb3MKKyAgICAvLyBieSBhZGRpbmcgcmVuZGVyZWQgZnJhbWUgaW5mb3JtYXRpb24gdG8gYSBiYXNlIG5vdGlmaWNhdGlvbiBtZXNzYWdlLiBSZXR1cm5zIHRoZSBudW1iZXIKKyAgICAvLyBvZiBmcmFtZXMgdGhhdCB3ZXJlIHJlbmRlcmVkLgorICAgIHN0YXRpYyBzaXplX3QgQ3JlYXRlRnJhbWVzUmVuZGVyZWRNZXNzYWdlKAorICAgICAgICAgICAgc3RkOjpsaXN0PEZyYW1lUmVuZGVyVHJhY2tlcjo6SW5mbz4gZG9uZSwgc3A8QU1lc3NhZ2U+ICZtc2cpOworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TWVkaWFDb2RlYygpOwogICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKIHByaXZhdGU6CisgICAgLy8gdXNlZCBieSBSZXNvdXJjZU1hbmFnZXJDbGllbnQKKyAgICBzdGF0dXNfdCByZWNsYWltKCk7CisgICAgZnJpZW5kIHN0cnVjdCBSZXNvdXJjZU1hbmFnZXJDbGllbnQ7CisKK3ByaXZhdGU6CiAgICAgZW51bSBTdGF0ZSB7CiAgICAgICAgIFVOSU5JVElBTElaRUQsCiAgICAgICAgIElOSVRJQUxJWklORywKQEAgLTE3MCw3ICsyMDIsOSBAQAogICAgIGVudW0gewogICAgICAgICBrV2hhdEluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdpbml0JywKICAgICAgICAga1doYXRDb25maWd1cmUgICAgICAgICAgICAgICAgICAgICAgPSAnY29uZicsCisgICAgICAgIGtXaGF0U2V0U3VyZmFjZSAgICAgICAgICAgICAgICAgICAgID0gJ3NTdXInLAogICAgICAgICBrV2hhdENyZWF0ZUlucHV0U3VyZmFjZSAgICAgICAgICAgICA9ICdjaXNmJywKKyAgICAgICAga1doYXRTZXRJbnB1dFN1cmZhY2UgICAgICAgICAgICAgICAgPSAnc2lzZicsCiAgICAgICAgIGtXaGF0U3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ3N0cnQnLAogICAgICAgICBrV2hhdFN0b3AgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdzdG9wJywKICAgICAgICAga1doYXRSZWxlYXNlICAgICAgICAgICAgICAgICAgICAgICAgPSAncmVsZScsCkBAIC0xOTEsNiArMjI1LDcgQEAKICAgICAgICAga1doYXRHZXROYW1lICAgICAgICAgICAgICAgICAgICAgICAgPSAnZ2V0TicsCiAgICAgICAgIGtXaGF0U2V0UGFyYW1ldGVycyAgICAgICAgICAgICAgICAgID0gJ3NldFAnLAogICAgICAgICBrV2hhdFNldENhbGxiYWNrICAgICAgICAgICAgICAgICAgICA9ICdzZXRDJywKKyAgICAgICAga1doYXRTZXROb3RpZmljYXRpb24gICAgICAgICAgICAgICAgPSAnc2V0TicsCiAgICAgfTsKIAogICAgIGVudW0gewpAQCAtMjA2LDM5ICsyNDEsNzggQEAKICAgICAgICAga0ZsYWdHYXRoZXJDb2RlY1NwZWNpZmljRGF0YSAgICA9IDUxMiwKICAgICAgICAga0ZsYWdJc0FzeW5jICAgICAgICAgICAgICAgICAgICA9IDEwMjQsCiAgICAgICAgIGtGbGFnSXNDb21wb25lbnRBbGxvY2F0ZWQgICAgICAgPSAyMDQ4LAorICAgICAgICBrRmxhZ1B1c2hCbGFua0J1ZmZlcnNPblNodXRkb3duID0gNDA5NiwKICAgICB9OwogCiAgICAgc3RydWN0IEJ1ZmZlckluZm8gewogICAgICAgICB1aW50MzJfdCBtQnVmZmVySUQ7CiAgICAgICAgIHNwPEFCdWZmZXI+IG1EYXRhOwogICAgICAgICBzcDxBQnVmZmVyPiBtRW5jcnlwdGVkRGF0YTsKKyAgICAgICAgc3A8SU1lbW9yeT4gbVNoYXJlZEVuY3J5cHRlZEJ1ZmZlcjsKICAgICAgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CiAgICAgICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OwogICAgICAgICBib29sIG1Pd25lZEJ5Q2xpZW50OwogICAgIH07CiAKKyAgICBzdHJ1Y3QgUmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3h5IDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKKyAgICAgICAgUmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3h5KHBpZF90IHBpZCk7CisgICAgICAgIH5SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJveHkoKTsKKworICAgICAgICB2b2lkIGluaXQoKTsKKworICAgICAgICAvLyBpbXBsZW1lbnRzIERlYXRoUmVjaXBpZW50CisgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiAvKndobyovKTsKKworICAgICAgICB2b2lkIGFkZFJlc291cmNlKAorICAgICAgICAgICAgICAgIGludDY0X3QgY2xpZW50SWQsCisgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50LAorICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxNZWRpYVJlc291cmNlPiAmcmVzb3VyY2VzKTsKKworICAgICAgICB2b2lkIHJlbW92ZVJlc291cmNlKGludDY0X3QgY2xpZW50SWQpOworCisgICAgICAgIGJvb2wgcmVjbGFpbVJlc291cmNlKGNvbnN0IFZlY3RvcjxNZWRpYVJlc291cmNlPiAmcmVzb3VyY2VzKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIE11dGV4IG1Mb2NrOworICAgICAgICBzcDxJUmVzb3VyY2VNYW5hZ2VyU2VydmljZT4gbVNlcnZpY2U7CisgICAgICAgIHBpZF90IG1QaWQ7CisgICAgfTsKKwogICAgIFN0YXRlIG1TdGF0ZTsKKyAgICBib29sIG1SZWxlYXNlZEJ5UmVzb3VyY2VNYW5hZ2VyOwogICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CiAgICAgc3A8QUxvb3Blcj4gbUNvZGVjTG9vcGVyOwogICAgIHNwPENvZGVjQmFzZT4gbUNvZGVjOwogICAgIEFTdHJpbmcgbUNvbXBvbmVudE5hbWU7Ci0gICAgdWludDMyX3QgbVJlcGx5SUQ7CisgICAgc3A8QVJlcGx5VG9rZW4+IG1SZXBseUlEOwogICAgIHVpbnQzMl90IG1GbGFnczsKICAgICBzdGF0dXNfdCBtU3RpY2t5RXJyb3I7Ci0gICAgc3A8U3VyZmFjZT4gbU5hdGl2ZVdpbmRvdzsKKyAgICBzcDxTdXJmYWNlPiBtU3VyZmFjZTsKICAgICBTb2Z0d2FyZVJlbmRlcmVyICptU29mdFJlbmRlcmVyOworCiAgICAgc3A8QU1lc3NhZ2U+IG1PdXRwdXRGb3JtYXQ7CiAgICAgc3A8QU1lc3NhZ2U+IG1JbnB1dEZvcm1hdDsKICAgICBzcDxBTWVzc2FnZT4gbUNhbGxiYWNrOworICAgIHNwPEFNZXNzYWdlPiBtT25GcmFtZVJlbmRlcmVkTm90aWZpY2F0aW9uOworICAgIHNwPE1lbW9yeURlYWxlcj4gbURlYWxlcjsKKworICAgIHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IG1SZXNvdXJjZU1hbmFnZXJDbGllbnQ7CisgICAgc3A8UmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3h5PiBtUmVzb3VyY2VNYW5hZ2VyU2VydmljZTsKIAogICAgIGJvb2wgbUJhdHRlcnlTdGF0Tm90aWZpZWQ7CiAgICAgYm9vbCBtSXNWaWRlbzsKKyAgICBpbnQzMl90IG1WaWRlb1dpZHRoOworICAgIGludDMyX3QgbVZpZGVvSGVpZ2h0OworICAgIGludDMyX3QgbVJvdGF0aW9uRGVncmVlczsKIAogICAgIC8vIGluaXRpYWwgY3JlYXRlIHBhcmFtZXRlcnMKICAgICBBU3RyaW5nIG1Jbml0TmFtZTsKICAgICBib29sIG1Jbml0TmFtZUlzVHlwZTsKICAgICBib29sIG1Jbml0SXNFbmNvZGVyOwogCisgICAgLy8gY29uZmlndXJlIHBhcmFtZXRlcgorICAgIHNwPEFNZXNzYWdlPiBtQ29uZmlndXJlTXNnOworCiAgICAgLy8gVXNlZCBvbmx5IHRvIHN5bmNocm9uaXplIGFzeW5jaHJvbm91cyBnZXRCdWZmZXJBbmRGb3JtYXQKICAgICAvLyBhY3Jvc3MgYWxsIHRoZSBvdGhlciAoc3luY2hyb25vdXMpIGJ1ZmZlciBzdGF0ZSBjaGFuZ2UKICAgICAvLyBvcGVyYXRpb25zLCBzdWNoIGFzIGRlL3F1ZXVlSW4vT3V0cHV0QnVmZmVyLCBzdGFydCBhbmQKQEAgLTI0OSwxMCArMzIzLDEwIEBACiAgICAgVmVjdG9yPEJ1ZmZlckluZm8+IG1Qb3J0QnVmZmVyc1syXTsKIAogICAgIGludDMyX3QgbURlcXVldWVJbnB1dFRpbWVvdXRHZW5lcmF0aW9uOwotICAgIHVpbnQzMl90IG1EZXF1ZXVlSW5wdXRSZXBseUlEOworICAgIHNwPEFSZXBseVRva2VuPiBtRGVxdWV1ZUlucHV0UmVwbHlJRDsKIAogICAgIGludDMyX3QgbURlcXVldWVPdXRwdXRUaW1lb3V0R2VuZXJhdGlvbjsKLSAgICB1aW50MzJfdCBtRGVxdWV1ZU91dHB1dFJlcGx5SUQ7CisgICAgc3A8QVJlcGx5VG9rZW4+IG1EZXF1ZXVlT3V0cHV0UmVwbHlJRDsKIAogICAgIHNwPElDcnlwdG8+IG1DcnlwdG87CiAKQEAgLTI2MSwxMyArMzM1LDE0IEBACiAgICAgc3A8QU1lc3NhZ2U+IG1BY3Rpdml0eU5vdGlmeTsKIAogICAgIGJvb2wgbUhhdmVJbnB1dFN1cmZhY2U7CisgICAgYm9vbCBtSGF2ZVBlbmRpbmdJbnB1dEJ1ZmZlcnM7CiAKLSAgICBNZWRpYUNvZGVjKGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIpOworICAgIE1lZGlhQ29kZWMoY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwgcGlkX3QgcGlkKTsKIAogICAgIHN0YXRpYyBzdGF0dXNfdCBQb3N0QW5kQXdhaXRSZXNwb25zZSgKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBzcDxBTWVzc2FnZT4gKnJlc3BvbnNlKTsKIAotICAgIHN0YXRpYyB2b2lkIFBvc3RSZXBseVdpdGhFcnJvcihpbnQzMl90IHJlcGx5SUQsIGludDMyX3QgZXJyKTsKKyAgICB2b2lkIFBvc3RSZXBseVdpdGhFcnJvcihjb25zdCBzcDxBUmVwbHlUb2tlbj4gJnJlcGx5SUQsIGludDMyX3QgZXJyKTsKIAogICAgIHN0YXR1c190IGluaXQoY29uc3QgQVN0cmluZyAmbmFtZSwgYm9vbCBuYW1lSXNUeXBlLCBib29sIGVuY29kZXIpOwogCkBAIC0yODMsMTUgKzM1OCwxNiBAQAogICAgICAgICAgICAgc2l6ZV90IHBvcnRJbmRleCwgc2l6ZV90IGluZGV4LAogICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gKmJ1ZmZlciwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQpOwogCi0gICAgYm9vbCBoYW5kbGVEZXF1ZXVlSW5wdXRCdWZmZXIodWludDMyX3QgcmVwbHlJRCwgYm9vbCBuZXdSZXF1ZXN0ID0gZmFsc2UpOwotICAgIGJvb2wgaGFuZGxlRGVxdWV1ZU91dHB1dEJ1ZmZlcih1aW50MzJfdCByZXBseUlELCBib29sIG5ld1JlcXVlc3QgPSBmYWxzZSk7CisgICAgYm9vbCBoYW5kbGVEZXF1ZXVlSW5wdXRCdWZmZXIoY29uc3Qgc3A8QVJlcGx5VG9rZW4+ICZyZXBseUlELCBib29sIG5ld1JlcXVlc3QgPSBmYWxzZSk7CisgICAgYm9vbCBoYW5kbGVEZXF1ZXVlT3V0cHV0QnVmZmVyKGNvbnN0IHNwPEFSZXBseVRva2VuPiAmcmVwbHlJRCwgYm9vbCBuZXdSZXF1ZXN0ID0gZmFsc2UpOwogICAgIHZvaWQgY2FuY2VsUGVuZGluZ0RlcXVldWVPcGVyYXRpb25zKCk7CiAKICAgICB2b2lkIGV4dHJhY3RDU0QoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOwogICAgIHN0YXR1c190IHF1ZXVlQ1NESW5wdXRCdWZmZXIoc2l6ZV90IGJ1ZmZlckluZGV4KTsKIAotICAgIHN0YXR1c190IHNldE5hdGl2ZVdpbmRvdygKLSAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKKyAgICBzdGF0dXNfdCBoYW5kbGVTZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKKyAgICBzdGF0dXNfdCBjb25uZWN0VG9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKKyAgICBzdGF0dXNfdCBkaXNjb25uZWN0RnJvbVN1cmZhY2UoKTsKIAogICAgIHZvaWQgcG9zdEFjdGl2aXR5Tm90aWZpY2F0aW9uSWZQb3NzaWJsZSgpOwogCkBAIC0zMDYsNiArMzgyLDkgQEAKICAgICB2b2lkIHVwZGF0ZUJhdHRlcnlTdGF0KCk7CiAgICAgYm9vbCBpc0V4ZWN1dGluZygpIGNvbnN0OwogCisgICAgdWludDY0X3QgZ2V0R3JhcGhpY0J1ZmZlclNpemUoKTsKKyAgICB2b2lkIGFkZFJlc291cmNlKGNvbnN0IFN0cmluZzggJnR5cGUsIGNvbnN0IFN0cmluZzggJnN1YnR5cGUsIHVpbnQ2NF90IHZhbHVlKTsKKwogICAgIC8qIGNhbGxlZCB0byBnZXQgdGhlIGxhc3QgY29kZWMgZXJyb3Igd2hlbiB0aGUgc3RpY2t5IGZsYWcgaXMgc2V0LgogICAgICAqIGlmIG5vIHN1Y2ggY29kZWMgZXJyb3IgaXMgZm91bmQsIHJldHVybnMgVU5LTk9XTl9FUlJPUi4KICAgICAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaAppbmRleCBhYzdiMDUzLi5iZjRkYjg3IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oCkBAIC0zMiw2ICszMiw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorZXh0ZXJuIGNvbnN0IGNoYXIgKmtNYXhFbmNvZGVySW5wdXRCdWZmZXJzOworCiBzdHJ1Y3QgQU1lc3NhZ2U7CiAKIHN0cnVjdCBNZWRpYUNvZGVjTGlzdCA6IHB1YmxpYyBCbk1lZGlhQ29kZWNMaXN0IHsKQEAgLTUyLDkgKzU0LDE3IEBACiAgICAgICAgIHJldHVybiBtQ29kZWNJbmZvcy5pdGVtQXQoaW5kZXgpOwogICAgIH0KIAorICAgIHZpcnR1YWwgY29uc3Qgc3A8QU1lc3NhZ2U+IGdldEdsb2JhbFNldHRpbmdzKCkgY29uc3Q7CisKICAgICAvLyB0byBiZSB1c2VkIGJ5IE1lZGlhUGxheWVyU2VydmljZSBhbG9uZQogICAgIHN0YXRpYyBzcDxJTWVkaWFDb2RlY0xpc3Q+IGdldExvY2FsSW5zdGFuY2UoKTsKIAorICAgIC8vIG9ubHkgdG8gYmUgdXNlZCBieSBnZXRMb2NhbEluc3RhbmNlCisgICAgc3RhdGljIHZvaWQgKnByb2ZpbGVyVGhyZWFkV3JhcHBlcih2b2lkICogLyphcmcqLyk7CisKKyAgICAvLyBvbmx5IHRvIGJlIHVzZWQgYnkgTWVkaWFQbGF5ZXJTZXJ2aWNlCisgICAgdm9pZCBwYXJzZVRvcExldmVsWE1MRmlsZShjb25zdCBjaGFyICpwYXRoLCBib29sIGlnbm9yZV9lcnJvcnMgPSBmYWxzZSk7CisKIHByaXZhdGU6CiAgICAgY2xhc3MgQmluZGVyRGVhdGhPYnNlcnZlciA6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CiAgICAgICAgIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmdGhlX2xhdGVfd2hvIF9fdW51c2VkKTsKQEAgLTY0LDYgKzc0LDcgQEAKIAogICAgIGVudW0gU2VjdGlvbiB7CiAgICAgICAgIFNFQ1RJT05fVE9QTEVWRUwsCisgICAgICAgIFNFQ1RJT05fU0VUVElOR1MsCiAgICAgICAgIFNFQ1RJT05fREVDT0RFUlMsCiAgICAgICAgIFNFQ1RJT05fREVDT0RFUiwKICAgICAgICAgU0VDVElPTl9ERUNPREVSX1RZUEUsCkBAIC03OCwxMCArODksMTQgQEAKIAogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAgICAgU2VjdGlvbiBtQ3VycmVudFNlY3Rpb247CisgICAgYm9vbCBtVXBkYXRlOwogICAgIFZlY3RvcjxTZWN0aW9uPiBtUGFzdFNlY3Rpb25zOwogICAgIGludDMyX3QgbURlcHRoOwogICAgIEFTdHJpbmcgbUhyZWZCYXNlOwogCisgICAgc3A8QU1lc3NhZ2U+IG1HbG9iYWxTZXR0aW5nczsKKyAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBDb2RlY1NldHRpbmdzPiBtT3ZlcnJpZGVzOworCiAgICAgVmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPiA+IG1Db2RlY0luZm9zOwogICAgIHNwPE1lZGlhQ29kZWNJbmZvPiBtQ3VycmVudEluZm87CiAgICAgc3A8SU9NWD4gbU9NWDsKQEAgLTkxLDcgKzEwNiw2IEBACiAKICAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKICAgICB2b2lkIHBhcnNlWE1MRmlsZShjb25zdCBjaGFyICpwYXRoKTsKLSAgICB2b2lkIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKGNvbnN0IGNoYXIgKnBhdGgpOwogCiAgICAgc3RhdGljIHZvaWQgU3RhcnRFbGVtZW50SGFuZGxlcldyYXBwZXIoCiAgICAgICAgICAgICB2b2lkICptZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHJzKTsKQEAgLTEwMiw5ICsxMTYsMTIgQEAKICAgICB2b2lkIGVuZEVsZW1lbnRIYW5kbGVyKGNvbnN0IGNoYXIgKm5hbWUpOwogCiAgICAgc3RhdHVzX3QgaW5jbHVkZVhNTEZpbGUoY29uc3QgY2hhciAqKmF0dHJzKTsKKyAgICBzdGF0dXNfdCBhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzKTsKICAgICBzdGF0dXNfdCBhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXMoYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICoqYXR0cnMpOwogICAgIHZvaWQgYWRkTWVkaWFDb2RlYyhib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnR5cGUgPSBOVUxMKTsKIAorICAgIHZvaWQgc2V0Q3VycmVudENvZGVjSW5mbyhib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnR5cGUpOworCiAgICAgc3RhdHVzX3QgYWRkUXVpcmsoY29uc3QgY2hhciAqKmF0dHJzKTsKICAgICBzdGF0dXNfdCBhZGRUeXBlRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzKTsKICAgICBzdGF0dXNfdCBhZGRMaW1pdChjb25zdCBjaGFyICoqYXR0cnMpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaAppbmRleCAwOTcwYjJiLi43MWY1OGE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaApAQCAtMjMsOSArMjMsMTEgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBBTG9vcGVyOworc3RydWN0IEFMb29wZXI7CiBjbGFzcyBBTWVzc2FnZTsKK3N0cnVjdCBBUmVwbHlUb2tlbjsKIGNsYXNzIElHcmFwaGljQnVmZmVyUHJvZHVjZXI7CitjbGFzcyBJR3JhcGhpY0J1ZmZlckNvbnN1bWVyOwogY2xhc3MgTWVkaWFDb2RlYzsKIGNsYXNzIE1ldGFEYXRhOwogCkBAIC00MCw2ICs0Miw3IEBACiAgICAgICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCiAgICAgICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+ICZjb25zdW1lciA9IE5VTEwsCiAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwogCiAgICAgYm9vbCBpc1ZpZGVvKCkgY29uc3QgeyByZXR1cm4gbUlzVmlkZW87IH0KQEAgLTc4LDYgKzgxLDcgQEAKICAgICAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsCiAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCwKICAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLAorICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gJmNvbnN1bWVyLAogICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKIAogICAgIHN0YXR1c190IG9uU3RhcnQoTWV0YURhdGEgKnBhcmFtcyk7CkBAIC05OSwxMyArMTAzLDE3IEBACiAgICAgc3A8UHVsbGVyPiBtUHVsbGVyOwogICAgIHNwPE1lZGlhQ29kZWM+IG1FbmNvZGVyOwogICAgIHVpbnQzMl90IG1GbGFnczsKLSAgICBMaXN0PHVpbnQzMl90PiBtU3RvcFJlcGx5SURRdWV1ZTsKKyAgICBMaXN0PHNwPEFSZXBseVRva2VuPj4gbVN0b3BSZXBseUlEUXVldWU7CiAgICAgYm9vbCBtSXNWaWRlbzsKICAgICBib29sIG1TdGFydGVkOwogICAgIGJvb2wgbVN0b3BwaW5nOwogICAgIGJvb2wgbURvTW9yZVdvcmtQZW5kaW5nOworICAgIGJvb2wgbVNldEVuY29kZXJGb3JtYXQ7CisgICAgaW50IG1FbmNvZGVyRm9ybWF0OworICAgIGludCBtRW5jb2RlckRhdGFTcGFjZTsKICAgICBzcDxBTWVzc2FnZT4gbUVuY29kZXJBY3Rpdml0eU5vdGlmeTsKICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IG1HcmFwaGljQnVmZmVyQ29uc3VtZXI7CiAgICAgTGlzdDxNZWRpYUJ1ZmZlciAqPiBtSW5wdXRCdWZmZXJRdWV1ZTsKICAgICBMaXN0PHNpemVfdD4gbUF2YWlsRW5jb2RlcklucHV0SW5kaWNlczsKICAgICBMaXN0PGludDY0X3Q+IG1EZWNvZGluZ1RpbWVRdWV1ZTsgLy8gZGVjb2RpbmcgdGltZSAodXMpIGZvciB2aWRlbwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmgKaW5kZXggYTAwMzZlMC4uMjFlYjA0YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oCkBAIC02NCw2ICs2NCw3IEBACiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF9TVUJSSVA7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF9WVFQ7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF9DRUFfNjA4OworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0RBVEFfVElNRURfSUQzOwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRmlsdGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBhNTcyYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFGaWx0ZXIuaApAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfRklMVEVSX0hfCisjZGVmaW5lIE1FRElBX0ZJTFRFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFCdWZmZXI7CitzdHJ1Y3QgR3JhcGhpY0J1ZmZlckxpc3RlbmVyOworc3RydWN0IE1lbW9yeURlYWxlcjsKK3N0cnVjdCBTaW1wbGVGaWx0ZXI7CisKK3N0cnVjdCBNZWRpYUZpbHRlciA6IHB1YmxpYyBDb2RlY0Jhc2UgeworICAgIE1lZGlhRmlsdGVyKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Tm90aWZpY2F0aW9uTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVBbGxvY2F0ZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlQ29uZmlndXJlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVDcmVhdGVJbnB1dFN1cmZhY2UoKTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3A8UGVyc2lzdGVudFN1cmZhY2U+ICZzdXJmYWNlKTsKKworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVN0YXJ0KCk7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlU2h1dGRvd24oYm9vbCBrZWVwQ29tcG9uZW50QWxsb2NhdGVkID0gZmFsc2UpOworCisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEZsdXNoKCk7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFJlc3VtZSgpOworCisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFJlcXVlc3RJRFJGcmFtZSgpOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxTZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpOworCisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIHN0cnVjdCBQb3J0RGVzY3JpcHRpb24gOiBwdWJsaWMgQ29kZWNCYXNlOjpQb3J0RGVzY3JpcHRpb24geworICAgICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudEJ1ZmZlcnMoKTsKKyAgICAgICAgdmlydHVhbCBJT01YOjpidWZmZXJfaWQgYnVmZmVySURBdChzaXplX3QgaW5kZXgpIGNvbnN0OworICAgICAgICB2aXJ0dWFsIHNwPEFCdWZmZXI+IGJ1ZmZlckF0KHNpemVfdCBpbmRleCkgY29uc3Q7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIFBvcnREZXNjcmlwdGlvbigpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBNZWRpYUZpbHRlcjsKKworICAgICAgICBWZWN0b3I8SU9NWDo6YnVmZmVyX2lkPiBtQnVmZmVySURzOworICAgICAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBtQnVmZmVyczsKKworICAgICAgICB2b2lkIGFkZEJ1ZmZlcihJT01YOjpidWZmZXJfaWQgaWQsIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworCisgICAgICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFBvcnREZXNjcmlwdGlvbik7CisgICAgfTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1lZGlhRmlsdGVyKCk7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IEJ1ZmZlckluZm8geworICAgICAgICBlbnVtIFN0YXR1cyB7CisgICAgICAgICAgICBPV05FRF9CWV9VUywKKyAgICAgICAgICAgIE9XTkVEX0JZX1VQU1RSRUFNLAorICAgICAgICB9OworCisgICAgICAgIElPTVg6OmJ1ZmZlcl9pZCBtQnVmZmVySUQ7CisgICAgICAgIGludDMyX3QgbUdlbmVyYXRpb247CisgICAgICAgIGludDMyX3QgbU91dHB1dEZsYWdzOworICAgICAgICBTdGF0dXMgbVN0YXR1czsKKworICAgICAgICBzcDxBQnVmZmVyPiBtRGF0YTsKKyAgICB9OworCisgICAgZW51bSBTdGF0ZSB7CisgICAgICBVTklOSVRJQUxJWkVELAorICAgICAgSU5JVElBTElaRUQsCisgICAgICBDT05GSUdVUkVELAorICAgICAgU1RBUlRFRCwKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIGtXaGF0SW5wdXRCdWZmZXJGaWxsZWQgICAgICAgPSAnaW5wRicsCisgICAgICAgIGtXaGF0T3V0cHV0QnVmZmVyRHJhaW5lZCAgICAgPSAnb3V0RCcsCisgICAgICAgIGtXaGF0U2h1dGRvd24gICAgICAgICAgICAgICAgPSAnc2h1dCcsCisgICAgICAgIGtXaGF0Rmx1c2ggICAgICAgICAgICAgICAgICAgPSAnZmx1cycsCisgICAgICAgIGtXaGF0UmVzdW1lICAgICAgICAgICAgICAgICAgPSAncmVzbScsCisgICAgICAgIGtXaGF0QWxsb2NhdGVDb21wb25lbnQgICAgICAgPSAnYWxsbycsCisgICAgICAgIGtXaGF0Q29uZmlndXJlQ29tcG9uZW50ICAgICAgPSAnY29uZicsCisgICAgICAgIGtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlICAgICAgPSAnY2lzZicsCisgICAgICAgIGtXaGF0U2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSAgPSAnZW9pcycsCisgICAgICAgIGtXaGF0U3RhcnQgICAgICAgICAgICAgICAgICAgPSAnc3RhcicsCisgICAgICAgIGtXaGF0U2V0UGFyYW1ldGVycyAgICAgICAgICAgPSAnc2V0UCcsCisgICAgICAgIGtXaGF0UHJvY2Vzc0J1ZmZlcnMgICAgICAgICAgPSAncHJvYycsCisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBrUG9ydEluZGV4SW5wdXQgID0gMCwKKyAgICAgICAga1BvcnRJbmRleE91dHB1dCA9IDEKKyAgICB9OworCisgICAgLy8gbWVtYmVyIHZhcmlhYmxlcworICAgIEFTdHJpbmcgbUNvbXBvbmVudE5hbWU7CisgICAgU3RhdGUgbVN0YXRlOworICAgIHN0YXR1c190IG1JbnB1dEVPU1Jlc3VsdDsKKyAgICBpbnQzMl90IG1XaWR0aCwgbUhlaWdodDsKKyAgICBpbnQzMl90IG1TdHJpZGUsIG1TbGljZUhlaWdodDsKKyAgICBpbnQzMl90IG1Db2xvckZvcm1hdEluLCBtQ29sb3JGb3JtYXRPdXQ7CisgICAgc2l6ZV90IG1NYXhJbnB1dFNpemUsIG1NYXhPdXRwdXRTaXplOworICAgIGludDMyX3QgbUdlbmVyYXRpb247CisgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CisgICAgc3A8QU1lc3NhZ2U+IG1JbnB1dEZvcm1hdDsKKyAgICBzcDxBTWVzc2FnZT4gbU91dHB1dEZvcm1hdDsKKworICAgIHNwPE1lbW9yeURlYWxlcj4gbURlYWxlclsyXTsKKyAgICBWZWN0b3I8QnVmZmVySW5mbz4gbUJ1ZmZlcnNbMl07CisgICAgVmVjdG9yPEJ1ZmZlckluZm8qPiBtQXZhaWxhYmxlSW5wdXRCdWZmZXJzOworICAgIFZlY3RvcjxCdWZmZXJJbmZvKj4gbUF2YWlsYWJsZU91dHB1dEJ1ZmZlcnM7CisgICAgYm9vbCBtUG9ydEVPU1syXTsKKworICAgIHNwPFNpbXBsZUZpbHRlcj4gbUZpbHRlcjsKKyAgICBzcDxHcmFwaGljQnVmZmVyTGlzdGVuZXI+IG1HcmFwaGljQnVmZmVyTGlzdGVuZXI7CisKKyAgICAvLyBoZWxwZXIgZnVuY3Rpb25zCisgICAgdm9pZCBzaWduYWxQcm9jZXNzQnVmZmVycygpOworICAgIHZvaWQgc2lnbmFsRXJyb3Ioc3RhdHVzX3QgZXJyb3IpOworCisgICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXJzT25Qb3J0KE9NWF9VMzIgcG9ydEluZGV4KTsKKyAgICBCdWZmZXJJbmZvICpmaW5kQnVmZmVyQnlJRCgKKyAgICAgICAgICAgIHVpbnQzMl90IHBvcnRJbmRleCwgSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlcklELAorICAgICAgICAgICAgc3NpemVfdCAqaW5kZXggPSBOVUxMKTsKKyAgICB2b2lkIHBvc3RGaWxsVGhpc0J1ZmZlcihCdWZmZXJJbmZvICppbmZvKTsKKyAgICB2b2lkIHBvc3REcmFpblRoaXNCdWZmZXIoQnVmZmVySW5mbyAqaW5mbyk7CisgICAgdm9pZCBwb3N0RU9TKCk7CisgICAgdm9pZCBzZW5kRm9ybWF0Q2hhbmdlKCk7CisgICAgdm9pZCByZXF1ZXN0RmlsbEVtcHR5SW5wdXQoKTsKKyAgICB2b2lkIHByb2Nlc3NCdWZmZXJzKCk7CisKKyAgICB2b2lkIG9uQWxsb2NhdGVDb21wb25lbnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25Db25maWd1cmVDb21wb25lbnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25TdGFydCgpOworICAgIHZvaWQgb25JbnB1dEJ1ZmZlckZpbGxlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvbk91dHB1dEJ1ZmZlckRyYWluZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25TaHV0ZG93bihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvbkZsdXNoKCk7CisgICAgdm9pZCBvblNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25DcmVhdGVJbnB1dFN1cmZhY2UoKTsKKyAgICB2b2lkIG9uSW5wdXRGcmFtZUF2YWlsYWJsZSgpOworICAgIHZvaWQgb25TaWduYWxFbmRPZklucHV0U3RyZWFtKCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZWRpYUZpbHRlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX0ZJTFRFUl9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaAppbmRleCA5ZGE5OGQ5Li5mYTg1NWE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaApAQCAtMjksOSArMjksOSBAQAogc3RydWN0IEFCdWZmZXI7CiBzdHJ1Y3QgQU1lc3NhZ2U7CiBzdHJ1Y3QgTWVkaWFBZGFwdGVyOwotc3RydWN0IE1lZGlhQnVmZmVyOworY2xhc3MgTWVkaWFCdWZmZXI7CiBzdHJ1Y3QgTWVkaWFTb3VyY2U7Ci1zdHJ1Y3QgTWV0YURhdGE7CitjbGFzcyBNZXRhRGF0YTsKIHN0cnVjdCBNZWRpYVdyaXRlcjsKIAogLy8gTWVkaWFNdXhlciBpcyB1c2VkIHRvIG11eCBtdWx0aXBsZSB0cmFja3MgaW50byBhIHZpZGVvLiBDdXJyZW50bHksIHdlIG9ubHkKQEAgLTUwLDkgKzUwLDYgQEAKICAgICAgICAgT1VUUFVUX0ZPUk1BVF9MSVNUX0VORCAvLyBtdXN0IGJlIGxhc3QgLSB1c2VkIHRvIHZhbGlkYXRlIGZvcm1hdCB0eXBlCiAgICAgfTsKIAotICAgIC8vIENvbnN0cnVjdCB0aGUgbXV4ZXIgd2l0aCB0aGUgb3V0cHV0IGZpbGUgcGF0aC4KLSAgICBNZWRpYU11eGVyKGNvbnN0IGNoYXIgKnBhdGgsIE91dHB1dEZvcm1hdCBmb3JtYXQpOwotCiAgICAgLy8gQ29uc3RydWN0IHRoZSBtdXhlciB3aXRoIHRoZSBmaWxlIGRlc2NyaXB0b3IuIE5vdGUgdGhhdCB0aGUgTWVkaWFNdXhlcgogICAgIC8vIHdpbGwgY2xvc2UgdGhpcyBmaWxlIGF0IHN0b3AoKS4KICAgICBNZWRpYU11eGVyKGludCBmZCwgT3V0cHV0Rm9ybWF0IGZvcm1hdCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU3luYy5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVN5bmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjhjYjIzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVN5bmMuaApAQCAtMCwwICsxLDI5MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9TWU5DX0gKKyNkZWZpbmUgTUVESUFfU1lOQ19ICisKKyNpbmNsdWRlIDxndWkvSUNvbnN1bWVyTGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxndWkvSVByb2R1Y2VyTGlzdGVuZXIuaD4KKworI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CisjaW5jbHVkZSA8bWVkaWEvQVZTeW5jU2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQXVkaW9UcmFjazsKK2NsYXNzIEJ1ZmZlckl0ZW07CitjbGFzcyBGZW5jZTsKK2NsYXNzIEdyYXBoaWNCdWZmZXI7CitjbGFzcyBJR3JhcGhpY0J1ZmZlckNvbnN1bWVyOworY2xhc3MgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3N0cnVjdCBNZWRpYUNsb2NrOworc3RydWN0IFZpZGVvRnJhbWVTY2hlZHVsZXI7CisKKy8vIE1lZGlhU3luYyBtYW5hZ2VzIG1lZGlhIHBsYXliYWNrIGFuZCBpdHMgc3luY2hyb25pemF0aW9uIHRvIGEgbWVkaWEgY2xvY2sKKy8vIHNvdXJjZS4gSXQgY2FuIGJlIGFsc28gdXNlZCBmb3IgdmlkZW8tb25seSBwbGF5YmFjay4KKy8vCisvLyBGb3IgdmlkZW8gcGxheWJhY2ssIGl0IHJlcXVpcmVzIGFuIG91dHB1dCBzdXJmYWNlIGFuZCBwcm92aWRlcyBhbiBpbnB1dAorLy8gc3VyZmFjZS4gSXQgdGhlbiBjb250cm9scyB0aGUgcmVuZGVyaW5nIG9mIGlucHV0IGJ1ZmZlcnMgKGJ1ZmZlciBxdWV1ZWQgdG8KKy8vIHRoZSBpbnB1dCBzdXJmYWNlKSBvbiB0aGUgb3V0cHV0IHN1cmZhY2UgdG8gaGFwcGVuIGF0IHRoZSBhcHByb3ByaWF0ZSB0aW1lLgorLy8KKy8vIEZvciBhdWRpbyBwbGF5YmFjaywgaXQgcmVxdWlyZXMgYW4gYXVkaW8gdHJhY2sgYW5kIHRha2VzIHVwZGF0ZXMgb2YKKy8vIGluZm9ybWF0aW9uIG9mIHJlbmRlcmVkIGF1ZGlvIGRhdGEgdG8gbWFpbnRhaW4gbWVkaWEgY2xvY2sgd2hlbiBhdWRpbyB0cmFjaworLy8gc2VydmVzIGFzIG1lZGlhIGNsb2NrIHNvdXJjZS4gKFRPRE86IG1vdmUgYXVkaW8gcmVuZGVyaW5nIGZyb20gSkFWQSB0bworLy8gbmF0aXZlIGNvZGUpLgorLy8KKy8vIEl0IGNhbiB1c2UgdGhlIGF1ZGlvIG9yIHZpZGVvIHRyYWNrIGFzIG1lZGlhIGNsb2NrIHNvdXJjZSwgYXMgd2VsbCBhcyBhbgorLy8gZXh0ZXJuYWwgY2xvY2suIChUT0RPOiBhY3R1YWxseSBzdXBwb3J0IGV4dGVybmFsIGNsb2NrIGFzIG1lZGlhIGNsb2NrCisvLyBzb3VyY2VzOyB1c2UgdmlkZW8gdHJhY2sgYXMgbWVkaWEgY2xvY2sgc291cmNlIGZvciBhdWRpby1hbmQtdmlkZW8gc3RyZWFtKS4KKy8vCisvLyBJbiB2aWRlby1vbmx5IG1vZGUsIE1lZGlhU3luYyB3aWxsIHBsYXliYWNrIGV2ZXJ5IHZpZGVvIGZyYW1lIGV2ZW4gdGhvdWdoCisvLyBhIHZpZGVvIGZyYW1lIGFycml2ZXMgbGF0ZSBiYXNlZCBvbiBpdHMgdGltZXN0YW1wIGFuZCBsYXN0IGZyYW1lJ3MuCisvLworLy8gVGhlIGNsaWVudCBuZWVkcyB0byBjb25maWd1cmUgc3VyZmFjZSAoZm9yIG91dHB1dCB2aWRlbyByZW5kZXJpbmcpIGFuZCBhdWRpbworLy8gdHJhY2sgKGZvciBxdWVyeWluZyBpbmZvcm1hdGlvbiBvZiBhdWRpbyByZW5kZXJpbmcpIGZvciBNZWRpYVN5bmMuCisvLworLy8gVGhlbiB0aGUgY2xpZW50IG5lZWRzIHRvIG9idGFpbiBhIHN1cmZhY2UgZnJvbSBNZWRpYVN5bmMgYW5kIHJlbmRlciB2aWRlbworLy8gZnJhbWVzIG9udG8gdGhhdCBzdXJmYWNlLiBJbnRlcm5hbGx5LCB0aGUgTWVkaWFTeW5jIHdpbGwgcmVjZWl2ZSB0aG9zZSB2aWRlbworLy8gZnJhbWVzIGFuZCByZW5kZXIgdGhlbSBvbnRvIHRoZSBvdXRwdXQgc3VyZmFjZSBhdCB0aGUgYXBwcm9wcmlhdGUgdGltZS4KKy8vCisvLyBUaGUgY2xpZW50IG5lZWRzIHRvIGNhbGwgdXBkYXRlUXVldWVkQXVkaW9EYXRhKCkgaW1tZWRpYXRlbHkgYWZ0ZXIgaXQgd3JpdGVzCisvLyBhdWRpbyBkYXRhIHRvIHRoZSBhdWRpbyB0cmFjay4gU3VjaCBpbmZvcm1hdGlvbiB3aWxsIGJlIHVzZWQgdG8gdXBkYXRlIG1lZGlhCisvLyBjbG9jay4KKy8vCitjbGFzcyBNZWRpYVN5bmMgOiBwdWJsaWMgQUhhbmRsZXIgeworcHVibGljOgorICAgIC8vIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBNZWRpYVN5bmMuCisgICAgc3RhdGljIHNwPE1lZGlhU3luYz4gY3JlYXRlKCk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiBNZWRpYVN5bmMgaXMgdXNlZCB0byByZW5kZXIgdmlkZW8uIEl0IHNob3VsZCBiZSBjYWxsZWQKKyAgICAvLyBiZWZvcmUgY3JlYXRlSW5wdXRTdXJmYWNlKCkuCisgICAgc3RhdHVzX3Qgc2V0U3VyZmFjZShjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmb3V0cHV0KTsKKworICAgIC8vIENhbGxlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIHVzZWQgYXMgbWVkaWEgY2xvY2sgc291cmNlLiBJdCBzaG91bGQgYmUKKyAgICAvLyBjYWxsZWQgYmVmb3JlIHVwZGF0ZVF1ZXVlZEF1ZGlvRGF0YSgpLgorICAgIHN0YXR1c190IHNldEF1ZGlvVHJhY2soY29uc3Qgc3A8QXVkaW9UcmFjaz4gJmF1ZGlvVHJhY2spOworCisgICAgLy8gQ3JlYXRlIGEgc3VyZmFjZSBmb3IgY2xpZW50IHRvIHJlbmRlciB2aWRlbyBmcmFtZXMuIFRoaXMgaXMgdGhlIHN1cmZhY2UKKyAgICAvLyBvbiB3aGljaCB0aGUgY2xpZW50IHNob3VsZCByZW5kZXIgdmlkZW8gZnJhbWVzLiBUaG9zZSB2aWRlbyBmcmFtZXMgd2lsbAorICAgIC8vIGJlIGludGVybmFsbHkgZGlyZWN0ZWQgdG8gb3V0cHV0IHN1cmZhY2UgZm9yIHJlbmRlcmluZyBhdCBhcHByb3ByaWF0ZQorICAgIC8vIHRpbWUuCisgICAgc3RhdHVzX3QgY3JlYXRlSW5wdXRTdXJmYWNlKHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpvdXRCdWZmZXJQcm9kdWNlcik7CisKKyAgICAvLyBVcGRhdGUganVzdC1yZW5kZXJlZCBhdWRpbyBkYXRhIHNpemUgYW5kIHRoZSBwcmVzZW50YXRpb24gdGltZXN0YW1wIG9mCisgICAgLy8gdGhlIGZpcnN0IGZyYW1lIG9mIHRoYXQgYXVkaW8gZGF0YS4gSXQgc2hvdWxkIGJlIGNhbGxlZCBpbW1lZGlhdGVseQorICAgIC8vIGFmdGVyIHRoZSBjbGllbnQgd3JpdGUgYXVkaW8gZGF0YSBpbnRvIEF1ZGlvVHJhY2suCisgICAgLy8gVGhpcyBmdW5jdGlvbiBhc3N1bWVzIGNvbnRpbm91cyBhdWRpbyBzdHJlYW0uCisgICAgLy8gVE9ETzogc3VwcG9ydCBnYXAgb3IgYmFja3dhcmRzIHVwZGF0ZXMuCisgICAgc3RhdHVzX3QgdXBkYXRlUXVldWVkQXVkaW9EYXRhKAorICAgICAgICAgICAgc2l6ZV90IHNpemVJbkJ5dGVzLCBpbnQ2NF90IHByZXNlbnRhdGlvblRpbWVVcyk7CisKKyAgICAvLyBTZXQgdGhlIGNvbnN1bWVyIG5hbWUgb2YgdGhlIGlucHV0IHF1ZXVlLgorICAgIHZvaWQgc2V0TmFtZShjb25zdCBBU3RyaW5nICZuYW1lKTsKKworICAgIC8vIEdldCB0aGUgbWVkaWEgY2xvY2sgdXNlZCBieSB0aGUgTWVkaWFTeW5jIHNvIHRoYXQgdGhlIGNsaWVudCBjYW4gb2J0YWluCisgICAgLy8gY29ycmVzcG9uZGluZyBtZWRpYSB0aW1lIG9yIHJlYWwgdGltZSB2aWEKKyAgICAvLyBNZWRpYUNsb2NrOjpnZXRNZWRpYVRpbWUoKSBhbmQgTWVkaWFDbG9jazo6Z2V0UmVhbFRpbWVGb3IoKS4KKyAgICBzcDxjb25zdCBNZWRpYUNsb2NrPiBnZXRNZWRpYUNsb2NrKCk7CisKKyAgICAvLyBGbHVzaCBtZWRpYXN5bmMKKyAgICB2b2lkIGZsdXNoKCk7CisKKyAgICAvLyBTZXQgdGhlIHZpZGVvIGZyYW1lIHJhdGUgaGludCAtIHRoaXMgaXMgdXNlZCBieSB0aGUgdmlkZW8gRnJhbWVTY2hlZHVsZXIKKyAgICBzdGF0dXNfdCBzZXRWaWRlb0ZyYW1lUmF0ZUhpbnQoZmxvYXQgcmF0ZSk7CisKKyAgICAvLyBHZXQgdGhlIHZpZGVvIGZyYW1lIHJhdGUgbWVhc3VyZW1lbnQgZnJvbSB0aGUgRnJhbWVTY2hlZHVsZXIKKyAgICAvLyByZXR1cm5zIC0xIGlmIHRoZXJlIGlzIG5vIG1lYXN1cmVtZW50CisgICAgZmxvYXQgZ2V0VmlkZW9GcmFtZVJhdGUoKTsKKworICAgIC8vIFNldCB0aGUgc3luYyBzZXR0aW5ncyBwYXJhbWV0ZXJzLgorICAgIHN0YXR1c190IHNldFN5bmNTZXR0aW5ncyhjb25zdCBBVlN5bmNTZXR0aW5ncyAmc3luY1NldHRpbmdzKTsKKworICAgIC8vIEdldHMgdGhlIHN5bmMgc2V0dGluZ3MgcGFyYW1ldGVycy4KKyAgICB2b2lkIGdldFN5bmNTZXR0aW5ncyhBVlN5bmNTZXR0aW5ncyAqc3luY1NldHRpbmdzIC8qIG5vbm51bGwgKi8pOworCisgICAgLy8gU2V0cyB0aGUgcGxheWJhY2sgcmF0ZSB1c2luZyBwbGF5YmFjayBzZXR0aW5ncy4KKyAgICAvLyBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGFueSB0aW1lLgorICAgIHN0YXR1c190IHNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpOworCisgICAgLy8gR2V0cyB0aGUgcGxheWJhY2sgcmF0ZSAocGxheWJhY2sgc2V0dGluZ3MgcGFyYW1ldGVycykuCisgICAgdm9pZCBnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlIC8qIG5vbm51bGwgKi8pOworCisgICAgLy8gR2V0IHRoZSBwbGF5IHRpbWUgZm9yIHBlbmRpbmcgYXVkaW8gZnJhbWVzIGluIGF1ZGlvIHNpbmsuCisgICAgc3RhdHVzX3QgZ2V0UGxheVRpbWVGb3JQZW5kaW5nQXVkaW9GcmFtZXMoaW50NjRfdCAqb3V0VGltZVVzKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0RHJhaW5WaWRlbyA9ICdkVmlkJywKKyAgICB9OworCisgICAgLy8gVGhpcyBpcyBhIHRoaW4gd3JhcHBlciBjbGFzcyB0aGF0IGxldHMgdXMgbGlzdGVuIHRvCisgICAgLy8gSUNvbnN1bWVyTGlzdGVuZXI6Om9uRnJhbWVBdmFpbGFibGUgZnJvbSBtSW5wdXQuCisgICAgY2xhc3MgSW5wdXRMaXN0ZW5lciA6IHB1YmxpYyBCbkNvbnN1bWVyTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CisgICAgcHVibGljOgorICAgICAgICBJbnB1dExpc3RlbmVyKGNvbnN0IHNwPE1lZGlhU3luYz4gJnN5bmMpOworICAgICAgICB2aXJ0dWFsIH5JbnB1dExpc3RlbmVyKCk7CisKKyAgICAgICAgLy8gRnJvbSBJQ29uc3VtZXJMaXN0ZW5lcgorICAgICAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtICZpdGVtKTsKKworICAgICAgICAvLyBGcm9tIElDb25zdW1lckxpc3RlbmVyCisgICAgICAgIC8vIFdlIGRvbid0IGNhcmUgYWJvdXQgcmVsZWFzZWQgYnVmZmVycyBiZWNhdXNlIHdlIGRldGFjaCBlYWNoIGJ1ZmZlciBhcworICAgICAgICAvLyBzb29uIGFzIHdlIGFjcXVpcmUgaXQuIFNlZSB0aGUgY29tbWVudCBmb3Igb25CdWZmZXJSZWxlYXNlZCBiZWxvdyBmb3IKKyAgICAgICAgLy8gc29tZSBjbGFyaWZ5aW5nIG5vdGVzIGFib3V0IHRoZSBuYW1lLgorICAgICAgICB2aXJ0dWFsIHZvaWQgb25CdWZmZXJzUmVsZWFzZWQoKSB7fQorCisgICAgICAgIC8vIEZyb20gSUNvbnN1bWVyTGlzdGVuZXIKKyAgICAgICAgLy8gV2UgZG9uJ3QgY2FyZSBhYm91dCBzaWRlYmFuZCBzdHJlYW1zLCBzaW5jZSB3ZSB3b24ndCByZWxheSB0aGVtLgorICAgICAgICB2aXJ0dWFsIHZvaWQgb25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKTsKKworICAgICAgICAvLyBGcm9tIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50CisgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3A8TWVkaWFTeW5jPiBtU3luYzsKKyAgICB9OworCisgICAgLy8gVGhpcyBpcyBhIHRoaW4gd3JhcHBlciBjbGFzcyB0aGF0IGxldHMgdXMgbGlzdGVuIHRvCisgICAgLy8gSVByb2R1Y2VyTGlzdGVuZXI6Om9uQnVmZmVyUmVsZWFzZWQgZnJvbSBtT3V0cHV0LgorICAgIGNsYXNzIE91dHB1dExpc3RlbmVyIDogcHVibGljIEJuUHJvZHVjZXJMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CisgICAgcHVibGljOgorICAgICAgICBPdXRwdXRMaXN0ZW5lcihjb25zdCBzcDxNZWRpYVN5bmM+ICZzeW5jLCBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmb3V0cHV0KTsKKyAgICAgICAgdmlydHVhbCB+T3V0cHV0TGlzdGVuZXIoKTsKKworICAgICAgICAvLyBGcm9tIElQcm9kdWNlckxpc3RlbmVyCisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlclJlbGVhc2VkKCk7CisKKyAgICAgICAgLy8gRnJvbSBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAorICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmd2hvKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHNwPE1lZGlhU3luYz4gbVN5bmM7CisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1PdXRwdXQ7CisgICAgfTsKKworICAgIC8vIG1Jc0FiYW5kb25lZCBpcyBzZXQgdG8gdHJ1ZSB3aGVuIHRoZSBpbnB1dCBvciBvdXRwdXQgZGllcy4KKyAgICAvLyBPbmNlIHRoZSBNZWRpYVN5bmMgaGFzIGJlZW4gYWJhbmRvbmVkIGJ5IG9uZSBzaWRlLCBpdCB3aWxsIGRpc2Nvbm5lY3QKKyAgICAvLyBmcm9tIHRoZSBvdGhlciBzaWRlIGFuZCBub3QgYXR0ZW1wdCB0byBjb21tdW5pY2F0ZSB3aXRoIGl0IGZ1cnRoZXIuCisgICAgYm9vbCBtSXNBYmFuZG9uZWQ7CisKKyAgICBtdXRhYmxlIE11dGV4IG1NdXRleDsKKyAgICBDb25kaXRpb24gbVJlbGVhc2VDb25kaXRpb247CisgICAgc2l6ZV90IG1OdW1PdXRzdGFuZGluZ0J1ZmZlcnM7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gbUlucHV0OworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1PdXRwdXQ7CisgICAgaW50IG1Vc2FnZUZsYWdzRnJvbU91dHB1dDsKKyAgICB1aW50MzJfdCBtTWF4QWNxdWlyZWRCdWZmZXJDb3VudDsgLy8gbWF4IGFjcXVpcmVkIGJ1ZmZlciBjb3VudAorICAgIGJvb2wgbVJldHVyblBlbmRpbmdJbnB1dEZyYW1lOyAgICAvLyBzZXQgd2hpbGUgd2UgYXJlIHBlbmRpbmcgYmVmb3JlIGFjcXVpcmluZyBhbiBpbnB1dCBmcmFtZQorCisgICAgc3A8QXVkaW9UcmFjaz4gbUF1ZGlvVHJhY2s7CisgICAgdWludDMyX3QgbU5hdGl2ZVNhbXBsZVJhdGVJbkh6OworICAgIGludDY0X3QgbU51bUZyYW1lc1dyaXR0ZW47CisgICAgYm9vbCBtSGFzQXVkaW87CisKKyAgICBpbnQ2NF90IG1OZXh0QnVmZmVySXRlbU1lZGlhVXM7CisgICAgTGlzdDxCdWZmZXJJdGVtPiBtQnVmZmVySXRlbXM7CisgICAgc3A8VmlkZW9GcmFtZVNjaGVkdWxlcj4gbUZyYW1lU2NoZWR1bGVyOworCisgICAgLy8gS2VlcCB0cmFjayBvZiBidWZmZXJzIHJlY2VpdmVkIGZyb20gfG1JbnB1dHwuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UKKyAgICAvLyBpdCdzIHBvc3NpYmxlIHRoZSBjb25zdW1lciBvZiB8bU91dHB1dHwgY291bGQgcmV0dXJuIGEgZGlmZmVyZW50CisgICAgLy8gR3JhcGhpY0J1ZmZlcjo6aGFuZGxlIChlLmcuLCBkdWUgdG8gcGFzc2luZyBidWZmZXJzIHRocm91Z2ggSVBDKSwKKyAgICAvLyBhbmQgdGhhdCBjb3VsZCBjYXVzZSBwcm9ibGVtIGlmIHRoZSBwcm9kdWNlciBvZiB8bUlucHV0fCBvbmx5CisgICAgLy8gc3VwcG9ydHMgcHJlLXJlZ2lzdGVyZWQgYnVmZmVycy4KKyAgICBLZXllZFZlY3Rvcjx1aW50NjRfdCwgc3A8R3JhcGhpY0J1ZmZlcj4gPiBtQnVmZmVyc0Zyb21JbnB1dDsKKworICAgIC8vIEtlZXAgdHJhY2sgb2YgYnVmZmVycyBzZW50IHRvIHxtT3V0cHV0fC4gV2hlbiBhIG5ldyBvdXRwdXQgc3VyZmFjZSBjb21lcworICAgIC8vIGluLCB0aG9zZSBidWZmZXJzIHdpbGwgYmUgcmV0dXJuZWQgdG8gaW5wdXQgYW5kIG9sZCBvdXRwdXQgc3VyZmFjZSB3aWxsCisgICAgLy8gYmUgZGlzY29ubmVjdGVkIGltbWVkaWF0ZWx5LgorICAgIEtleWVkVmVjdG9yPHVpbnQ2NF90LCBzcDxHcmFwaGljQnVmZmVyPiA+IG1CdWZmZXJzU2VudFRvT3V0cHV0OworCisgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKKyAgICBmbG9hdCBtUGxheWJhY2tSYXRlOworCisgICAgQXVkaW9QbGF5YmFja1JhdGUgbVBsYXliYWNrU2V0dGluZ3M7CisgICAgQVZTeW5jU2V0dGluZ3MgbVN5bmNTZXR0aW5nczsKKworICAgIHNwPE1lZGlhQ2xvY2s+IG1NZWRpYUNsb2NrOworCisgICAgTWVkaWFTeW5jKCk7CisKKyAgICAvLyBNdXN0IGJlIGFjY2Vzc2VkIHRocm91Z2ggUmVmQmFzZQorICAgIHZpcnR1YWwgfk1lZGlhU3luYygpOworCisgICAgaW50NjRfdCBnZXRSZWFsVGltZShpbnQ2NF90IG1lZGlhVGltZVVzLCBpbnQ2NF90IG5vd1VzKTsKKyAgICBpbnQ2NF90IGdldER1cmF0aW9uSWZQbGF5ZWRBdE5hdGl2ZVNhbXBsZVJhdGVfbChpbnQ2NF90IG51bUZyYW1lcyk7CisgICAgaW50NjRfdCBnZXRQbGF5ZWRPdXRBdWRpb0R1cmF0aW9uTWVkaWFfbChpbnQ2NF90IG5vd1VzKTsKKworICAgIHZvaWQgb25EcmFpblZpZGVvX2woKTsKKworICAgIC8vIFRoaXMgaW1wbGVtZW50cyB0aGUgb25GcmFtZUF2YWlsYWJsZSBjYWxsYmFjayBmcm9tIElDb25zdW1lckxpc3RlbmVyLgorICAgIC8vIEl0IGdldHMgY2FsbGVkIGZyb20gYW4gSW5wdXRMaXN0ZW5lci4KKyAgICAvLyBEdXJpbmcgdGhpcyBjYWxsYmFjaywgd2UgZGV0YWNoIHRoZSBidWZmZXIgZnJvbSB0aGUgaW5wdXQsIGFuZCBxdWV1ZQorICAgIC8vIGl0IGZvciByZW5kZXJpbmcgb24gdGhlIG91dHB1dC4gVGhpcyBjYWxsIGNhbiBibG9jayBpZiB0aGVyZSBhcmUgdG9vCisgICAgLy8gbWFueSBvdXRzdGFuZGluZyBidWZmZXJzLiBJZiBpdCBibG9ja3MsIGl0IHdpbGwgcmVzdW1lIHdoZW4KKyAgICAvLyBvbkJ1ZmZlclJlbGVhc2VkQnlPdXRwdXQgcmVsZWFzZXMgYSBidWZmZXIgYmFjayB0byB0aGUgaW5wdXQuCisgICAgdm9pZCBvbkZyYW1lQXZhaWxhYmxlRnJvbUlucHV0KCk7CisKKyAgICAvLyBTZW5kIHxidWZmZXJJdGVtfCB0byB0aGUgb3V0cHV0IGZvciByZW5kZXJpbmcuCisgICAgdm9pZCByZW5kZXJPbmVCdWZmZXJJdGVtX2woY29uc3QgQnVmZmVySXRlbSAmYnVmZmVySXRlbSk7CisKKyAgICAvLyBUaGlzIGltcGxlbWVudHMgdGhlIG9uQnVmZmVyUmVsZWFzZWQgY2FsbGJhY2sgZnJvbSBJUHJvZHVjZXJMaXN0ZW5lci4KKyAgICAvLyBJdCBnZXRzIGNhbGxlZCBmcm9tIGFuIE91dHB1dExpc3RlbmVyLgorICAgIC8vIER1cmluZyB0aGlzIGNhbGxiYWNrLCB3ZSBkZXRhY2ggdGhlIGJ1ZmZlciBmcm9tIHRoZSBvdXRwdXQsIGFuZCByZWxlYXNlCisgICAgLy8gaXQgdG8gdGhlIGlucHV0LiBBIGJsb2NrZWQgb25GcmFtZUF2YWlsYWJsZSBjYWxsIHdpbGwgYmUgYWxsb3dlZCB0byBwcm9jZWVkLgorICAgIHZvaWQgb25CdWZmZXJSZWxlYXNlZEJ5T3V0cHV0KHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZvdXRwdXQpOworCisgICAgLy8gUmV0dXJuIHxidWZmZXJ8IGJhY2sgdG8gdGhlIGlucHV0LgorICAgIHZvaWQgcmV0dXJuQnVmZmVyVG9JbnB1dF9sKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+ICZidWZmZXIsIGNvbnN0IHNwPEZlbmNlPiAmZmVuY2UpOworCisgICAgLy8gV2hlbiB0aGlzIGlzIGNhbGxlZCwgdGhlIE1lZGlhU3luYyBkaXNjb25uZWN0cyBmcm9tIChpLmUuLCBhYmFuZG9ucykgaXRzCisgICAgLy8gaW5wdXQgb3Igb3V0cHV0LCBhbmQgc2lnbmFscyBhbnkgd2FpdGluZyBvbkZyYW1lQXZhaWxhYmxlIGNhbGxzIHRvIHdha2UKKyAgICAvLyB1cC4gVGhpcyBtdXN0IGJlIGNhbGxlZCB3aXRoIG1NdXRleCBsb2NrZWQuCisgICAgdm9pZCBvbkFiYW5kb25lZF9sKGJvb2wgaXNJbnB1dCk7CisKKyAgICAvLyBTZXQgdGhlIHBsYXliYWNrIGluIGEgZGVzaXJlZCBzcGVlZC4KKyAgICAvLyBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGFueSB0aW1lLgorICAgIC8vIHxyYXRlfCBpcyB0aGUgcmF0aW8gYmV0d2VlbiBkZXNpcmVkIHNwZWVkIGFuZCB0aGUgbm9ybWFsIG9uZSwgYW5kIHNob3VsZAorICAgIC8vIGJlIG5vbi1uZWdhdGl2ZS4gVGhlIG1lYW5pbmcgb2YgcmF0ZSB2YWx1ZXM6CisgICAgLy8gMS4wIC0tIG5vcm1hbCBwbGF5YmFjaworICAgIC8vIDAuMCAtLSBzdG9wIG9yIHBhdXNlCisgICAgLy8gbGFyZ2VyIHRoYW4gMS4wIC0tIGZhc3RlciB0aGFuIG5vcm1hbCBzcGVlZAorICAgIC8vIGJldHdlZW4gMC4wIGFuZCAxLjAgLS0gc2xvd2VyIHRoYW4gbm9ybWFsIHNwZWVkCisgICAgdm9pZCB1cGRhdGVQbGF5YmFja1JhdGVfbChmbG9hdCByYXRlKTsKKworICAgIC8vIGFwcGx5IG5ldyBzeW5jIHNldHRpbmdzCisgICAgdm9pZCByZXN5bmNfbCgpOworCisgICAgLy8gYXBwbHkgcGxheWJhY2sgc2V0dGluZ3Mgb25seSAtIHdpdGhvdXQgcmVzeW5jaW5nIG9yIHVwZGF0aW5nIHBsYXliYWNrIHJhdGUKKyAgICBzdGF0dXNfdCBzZXRQbGF5YmFja1NldHRpbmdzX2woY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpOworCisgICAgLy8gaGVscGVyLgorICAgIGJvb2wgaXNQbGF5aW5nKCkgeyByZXR1cm4gbVBsYXliYWNrUmF0ZSAhPSAwLjA7IH0KKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lZGlhU3luYyk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVdyaXRlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVdyaXRlci5oCmluZGV4IGUyN2VhMWQuLjhlMDI1MDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmgKQEAgLTI0LDcgKzI0LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IE1lZGlhU291cmNlOwotc3RydWN0IE1ldGFEYXRhOworY2xhc3MgTWV0YURhdGE7CiAKIHN0cnVjdCBNZWRpYVdyaXRlciA6IHB1YmxpYyBSZWZCYXNlIHsKICAgICBNZWRpYVdyaXRlcigpCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKaW5kZXggM2Y0Mjc5MC4uOGQ0ZTE1YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaApAQCAtNzAsMTEgKzcwLDE1IEBACiAgICAga0tleURyaWZ0VGltZSAgICAgICAgID0gJ2RmdFQnLCAgLy8gaW50NjRfdCAodXNlY3MpCiAgICAga0tleUFuY2hvclRpbWUgICAgICAgID0gJ2FuY1QnLCAgLy8gaW50NjRfdCAodXNlY3MpCiAgICAga0tleUR1cmF0aW9uICAgICAgICAgID0gJ2R1cmEnLCAgLy8gaW50NjRfdCAodXNlY3MpCi0gICAga0tleUNvbG9yRm9ybWF0ICAgICAgID0gJ2NvbGYnLAorICAgIGtLZXlQaXhlbEZvcm1hdCAgICAgICA9ICdwaXhmJywgIC8vIGludDMyX3QKKyAgICBrS2V5Q29sb3JGb3JtYXQgICAgICAgPSAnY29sZicsICAvLyBpbnQzMl90CisgICAga0tleUNvbG9yU3BhY2UgICAgICAgID0gJ2NvbHMnLCAgLy8gaW50MzJfdAogICAgIGtLZXlQbGF0Zm9ybVByaXZhdGUgICA9ICdwcml2JywgIC8vIHBvaW50ZXIKICAgICBrS2V5RGVjb2RlckNvbXBvbmVudCAgPSAnZGVjQycsICAvLyBjc3RyaW5nCiAgICAga0tleUJ1ZmZlcklEICAgICAgICAgID0gJ2JmSUQnLAogICAgIGtLZXlNYXhJbnB1dFNpemUgICAgICA9ICdpbnBTJywKKyAgICBrS2V5TWF4V2lkdGggICAgICAgICAgPSAnbWF4VycsCisgICAga0tleU1heEhlaWdodCAgICAgICAgID0gJ21heEgnLAogICAgIGtLZXlUaHVtYm5haWxUaW1lICAgICA9ICd0aGJUJywgIC8vIGludDY0X3QgKHVzZWNzKQogICAgIGtLZXlUcmFja0lEICAgICAgICAgICA9ICd0cklEJywKICAgICBrS2V5SXNEUk0gICAgICAgICAgICAgPSAnaWRybScsICAvLyBpbnQzMl90IChib29sKQpAQCAtOTgsNiArMTAyLDcgQEAKICAgICBrS2V5Q29tcGlsYXRpb24gICAgICAgPSAnY3BpbCcsICAvLyBjc3RyaW5nCiAgICAga0tleUxvY2F0aW9uICAgICAgICAgID0gJ2xvYyAnLCAgLy8gY3N0cmluZwogICAgIGtLZXlUaW1lU2NhbGUgICAgICAgICA9ICd0bXNsJywgIC8vIGludDMyX3QKKyAgICBrS2V5Q2FwdHVyZUZyYW1lcmF0ZSAgPSAnY2FwRicsICAvLyBmbG9hdCAoY2FwdHVyZSBmcHMpCiAKICAgICAvLyB2aWRlbyBwcm9maWxlIGFuZCBsZXZlbAogICAgIGtLZXlWaWRlb1Byb2ZpbGUgICAgICA9ICd2cHJmJywgIC8vIGludDMyX3QKQEAgLTE3Myw2ICsxNzgsOSBAQAogICAgIGtLZXlUcmFja0lzRGVmYXVsdCAgICA9ICdkZmx0JywgLy8gYm9vbCAoaW50MzJfdCkKICAgICAvLyBTaW1pbGFyIHRvIE1lZGlhRm9ybWF0LktFWV9JU19GT1JDRURfU1VCVElUTEUgYnV0IHBlcnRhaW5zIHRvIGF2IHRyYWNrcyBhcyB3ZWxsLgogICAgIGtLZXlUcmFja0lzRm9yY2VkICAgICA9ICdmcmNkJywgLy8gYm9vbCAoaW50MzJfdCkKKworICAgIC8vIEgyNjQgc3VwcGxlbWVudGFsIGVuaGFuY2VtZW50IGluZm9ybWF0aW9uIG9mZnNldHMvc2l6ZXMKKyAgICBrS2V5U0VJICAgICAgICAgICAgICAgPSAnc2VpICcsIC8vIHJhdyBkYXRhCiB9OwogCiBlbnVtIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTmF0aXZlV2luZG93V3JhcHBlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OYXRpdmVXaW5kb3dXcmFwcGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZWVjMjIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OYXRpdmVXaW5kb3dXcmFwcGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBOQVRJVkVfV0lORE9XX1dSQVBQRVJfSF8KLQotI2RlZmluZSBOQVRJVkVfV0lORE9XX1dSQVBQRVJfSF8KLQotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gU3VyZmFjZSBkZXJpdmVzIGZyb20gQU5hdGl2ZVdpbmRvdyB3aGljaCBkZXJpdmVzIGZyb20gbXVsdGlwbGUKLS8vIGJhc2UgY2xhc3NlcywgaW4gb3JkZXIgdG8gY2FycnkgaXQgaW4gQU1lc3NhZ2VzLCB3ZSdsbCB0ZW1wb3JhcmlseSB3cmFwIGl0Ci0vLyBpbnRvIGEgTmF0aXZlV2luZG93V3JhcHBlci4KLQotc3RydWN0IE5hdGl2ZVdpbmRvd1dyYXBwZXIgOiBSZWZCYXNlIHsKLSAgICBOYXRpdmVXaW5kb3dXcmFwcGVyKAotICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2VUZXh0dXJlQ2xpZW50KSA6Ci0gICAgICAgIG1TdXJmYWNlVGV4dHVyZUNsaWVudChzdXJmYWNlVGV4dHVyZUNsaWVudCkgeyB9Ci0KLSAgICBzcDxBTmF0aXZlV2luZG93PiBnZXROYXRpdmVXaW5kb3coKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtU3VyZmFjZVRleHR1cmVDbGllbnQ7Ci0gICAgfQotCi0gICAgc3A8U3VyZmFjZT4gZ2V0U3VyZmFjZVRleHR1cmVDbGllbnQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtU3VyZmFjZVRleHR1cmVDbGllbnQ7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIGNvbnN0IHNwPFN1cmZhY2U+IG1TdXJmYWNlVGV4dHVyZUNsaWVudDsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE5hdGl2ZVdpbmRvd1dyYXBwZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBOQVRJVkVfV0lORE9XX1dSQVBQRVJfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKaW5kZXggNDAyZTdmOC4uZmQ3NDQ1MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKQEAgLTMwLDEyICszMCwxMiBAQAogCiBzdHJ1Y3QgQUJ1ZmZlcjsKIHN0cnVjdCBBTWVzc2FnZTsKLXN0cnVjdCBEYXRhU291cmNlOworY2xhc3MgRGF0YVNvdXJjZTsKIHN0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKLXN0cnVjdCBNZWRpYUJ1ZmZlcjsKK2NsYXNzIE1lZGlhQnVmZmVyOwogc3RydWN0IE1lZGlhRXh0cmFjdG9yOwogc3RydWN0IE1lZGlhU291cmNlOwotc3RydWN0IE1ldGFEYXRhOworY2xhc3MgTWV0YURhdGE7CiAKIHN0cnVjdCBOdU1lZGlhRXh0cmFjdG9yIDogcHVibGljIFJlZkJhc2UgewogICAgIGVudW0gU2FtcGxlRmxhZ3MgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oCmluZGV4IDg0YjFiMWEuLmIwNDA0YWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmgKQEAgLTQwLDEwICs0MCw2IEBACiAgICAgICAgIGtQcmVmZXJTb2Z0d2FyZUNvZGVjcyAgICA9IDEsCiAgICAgICAgIGtJZ25vcmVDb2RlY1NwZWNpZmljRGF0YSA9IDIsCiAKLSAgICAgICAgLy8gVGhlIGNsaWVudCB3YW50cyB0byBhY2Nlc3MgdGhlIG91dHB1dCBidWZmZXIncyB2aWRlbwotICAgICAgICAvLyBkYXRhIGZvciBleGFtcGxlIGZvciB0aHVtYm5haWwgZXh0cmFjdGlvbi4KLSAgICAgICAga0NsaWVudE5lZWRzRnJhbWVidWZmZXIgID0gNCwKLQogICAgICAgICAvLyBSZXF1ZXN0IGZvciBzb2Z0d2FyZSBvciBoYXJkd2FyZSBjb2RlY3MuIElmIHJlcXVlc3QKICAgICAgICAgLy8gY2FuIG5vdCBiZSBmdWxsZmlsbGVkLCBDcmVhdGUoKSByZXR1cm5zIE5VTEwuCiAgICAgICAgIGtTb2Z0d2FyZUNvZGVjc09ubHkgICAgICA9IDgsCkBAIC0yOTgsNyArMjk0LDYgQEAKICAgICBzdGF0dXNfdCBxdWV1ZUJ1ZmZlclRvTmF0aXZlV2luZG93KEJ1ZmZlckluZm8gKmluZm8pOwogICAgIHN0YXR1c190IGNhbmNlbEJ1ZmZlclRvTmF0aXZlV2luZG93KEJ1ZmZlckluZm8gKmluZm8pOwogICAgIEJ1ZmZlckluZm8qIGRlcXVldWVCdWZmZXJGcm9tTmF0aXZlV2luZG93KCk7Ci0gICAgc3RhdHVzX3QgcHVzaEJsYW5rQnVmZmVyc1RvTmF0aXZlV2luZG93KCk7CiAKICAgICBzdGF0dXNfdCBmcmVlQnVmZmVyc09uUG9ydCgKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBib29sIG9ubHlUaG9zZVdlT3duID0gZmFsc2UpOwpAQCAtMzQ3LDcgKzM0Miw2IEBACiAKICAgICBzdGF0dXNfdCBjb25maWd1cmVDb2RlYyhjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEpOwogCi0gICAgc3RhdHVzX3QgYXBwbHlSb3RhdGlvbigpOwogICAgIHN0YXR1c190IHdhaXRGb3JCdWZmZXJGaWxsZWRfbCgpOwogCiAgICAgaW50NjRfdCBnZXREZWNvZGluZ1RpbWVVcygpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9QZXJzaXN0ZW50U3VyZmFjZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9QZXJzaXN0ZW50U3VyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNWI5ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1BlcnNpc3RlbnRTdXJmYWNlLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBQRVJTSVNURU5UX1NVUkZBQ0VfSF8KKworI2RlZmluZSBQRVJTSVNURU5UX1NVUkZBQ0VfSF8KKworI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyQ29uc3VtZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IFBlcnNpc3RlbnRTdXJmYWNlIDogcHVibGljIFJlZkJhc2UgeworICAgIFBlcnNpc3RlbnRTdXJmYWNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJ1ZmZlclByb2R1Y2VyLAorICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4mIGJ1ZmZlckNvbnN1bWVyKSA6CisgICAgICAgIG1CdWZmZXJQcm9kdWNlcihidWZmZXJQcm9kdWNlciksCisgICAgICAgIG1CdWZmZXJDb25zdW1lcihidWZmZXJDb25zdW1lcikgeyB9CisKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnZXRCdWZmZXJQcm9kdWNlcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1CdWZmZXJQcm9kdWNlcjsKKyAgICB9CisKKyAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBnZXRCdWZmZXJDb25zdW1lcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1CdWZmZXJDb25zdW1lcjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbUJ1ZmZlclByb2R1Y2VyOworICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IG1CdWZmZXJDb25zdW1lcjsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFBlcnNpc3RlbnRTdXJmYWNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gUEVSU0lTVEVOVF9TVVJGQUNFX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMwY2RmZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUHJvY2Vzc0luZm8uaApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBQUk9DRVNTX0lORk9fSF8KKworI2RlZmluZSBQUk9DRVNTX0lORk9fSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mb0ludGVyZmFjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBQcm9jZXNzSW5mbyA6IHB1YmxpYyBQcm9jZXNzSW5mb0ludGVyZmFjZSB7CisgICAgUHJvY2Vzc0luZm8oKTsKKworICAgIHZpcnR1YWwgYm9vbCBnZXRQcmlvcml0eShpbnQgcGlkLCBpbnQqIHByaW9yaXR5KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflByb2Nlc3NJbmZvKCk7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUHJvY2Vzc0luZm8pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBQUk9DRVNTX0lORk9fSF8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5RmFjdG9yeS5jcHAgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvSW50ZXJmYWNlLmgKc2ltaWxhcml0eSBpbmRleCA2MCUKY29weSBmcm9tIHNlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5RmFjdG9yeS5jcHAKY29weSB0byBpbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvSW50ZXJmYWNlLmgKaW5kZXggMmFlN2JjMS4uMjIyZjkyZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvSW50ZXJmYWNlLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxOSArMTQsMjAgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJBdWRpb1BvbGljeU1hbmFnZXIuaCIKKyNpZm5kZWYgUFJPQ0VTU19JTkZPX0lOVEVSRkFDRV9IXworI2RlZmluZSBQUk9DRVNTX0lORk9fSU5URVJGQUNFX0hfCisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotZXh0ZXJuICJDIiBBdWRpb1BvbGljeUludGVyZmFjZSogY3JlYXRlQXVkaW9Qb2xpY3lNYW5hZ2VyKAotICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQotewotICAgIHJldHVybiBuZXcgQXVkaW9Qb2xpY3lNYW5hZ2VyKGNsaWVudEludGVyZmFjZSk7Ci19CitzdHJ1Y3QgUHJvY2Vzc0luZm9JbnRlcmZhY2UgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgdmlydHVhbCBib29sIGdldFByaW9yaXR5KGludCBwaWQsIGludCogcHJpb3JpdHkpID0gMDsKIAotZXh0ZXJuICJDIiB2b2lkIGRlc3Ryb3lBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lJbnRlcmZhY2UgKmludGVyZmFjZSkKLXsKLSAgICBkZWxldGUgaW50ZXJmYWNlOwotfQorcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflByb2Nlc3NJbmZvSW50ZXJmYWNlKCkge30KK307CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFBST0NFU1NfSU5GT19JTlRFUkZBQ0VfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVuZGVyU2NyaXB0V3JhcHBlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW5kZXJTY3JpcHRXcmFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQyNjQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVuZGVyU2NyaXB0V3JhcHBlci5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFJFTkRFUlNDUklQVF9XUkFQUEVSX0hfCisjZGVmaW5lIFJFTkRFUlNDUklQVF9XUkFQUEVSX0hfCisKKyNpbmNsdWRlIDxSZW5kZXJTY3JpcHQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgUmVuZGVyU2NyaXB0V3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICBzdHJ1Y3QgUlNGaWx0ZXJDYWxsYmFjayA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8vIGNhbGxlZCBieSBSU0ZpbHRlciB0byBwcm9jZXNzIGVhY2ggaW5wdXQgYnVmZmVyCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc0J1ZmZlcnMoCisgICAgICAgICAgICAgICAgUlNDOjpBbGxvY2F0aW9uKiBpbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICBSU0M6OkFsbG9jYXRpb24qIG91dEJ1ZmZlcikgPSAwOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFuZGxlU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgPSAwOworICAgIH07CisKKyAgICBzcDxSU0ZpbHRlckNhbGxiYWNrPiBtQ2FsbGJhY2s7CisgICAgUlNDOjpzcDxSU0M6OlJTPiBtQ29udGV4dDsKK307CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFJFTkRFUlNDUklQVF9XUkFQUEVSX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWE5YzBhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNVUkZBQ0VfVVRJTFNfSF8KKworI2RlZmluZSBTVVJGQUNFX1VUSUxTX0hfCisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworc3RydWN0IEFOYXRpdmVXaW5kb3c7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdHVzX3Qgc2V0TmF0aXZlV2luZG93U2l6ZUZvcm1hdEFuZFVzYWdlKAorICAgICAgICBBTmF0aXZlV2luZG93ICpuYXRpdmVXaW5kb3cgLyogbm9ubnVsbCAqLywKKyAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0LCBpbnQgcm90YXRpb24sIGludCB1c2FnZSk7CitzdGF0dXNfdCBwdXNoQmxhbmtCdWZmZXJzVG9OYXRpdmVXaW5kb3coQU5hdGl2ZVdpbmRvdyAqbmF0aXZlV2luZG93IC8qIG5vbm51bGwgKi8pOworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gU1VSRkFDRV9VVElMU19IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oCmluZGV4IGE3OTVjODAuLjVlOWQ3ZDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmgKQEAgLTQxLDcgKzQxLDcgQEAKIHVpbnQ2NF90IG50b2g2NCh1aW50NjRfdCB4KTsKIHVpbnQ2NF90IGh0b242NCh1aW50NjRfdCB4KTsKIAotc3RydWN0IE1ldGFEYXRhOworY2xhc3MgTWV0YURhdGE7CiBzdHJ1Y3QgQU1lc3NhZ2U7CiBzdGF0dXNfdCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UoCiAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQpOwpAQCAtNjUsNiArNjUsMjYgQEAKIAogQVN0cmluZyB1cmlEZWJ1Z1N0cmluZyhjb25zdCBBU3RyaW5nICZ1cmksIGJvb2wgaW5jb2duaXRvID0gZmFsc2UpOwogCitzdHJ1Y3QgSExTVGltZSB7CisgICAgaW50MzJfdCBtU2VxOworICAgIGludDY0X3QgbVRpbWVVczsKKyAgICBzcDxBTWVzc2FnZT4gbU1ldGE7CisKKyAgICBITFNUaW1lKGNvbnN0IHNwPEFNZXNzYWdlPiAmbWV0YSA9IE5VTEwpOworICAgIGludDY0X3QgZ2V0U2VnbWVudFRpbWVVcygpIGNvbnN0OworfTsKKworYm9vbCBvcGVyYXRvciA8KGNvbnN0IEhMU1RpbWUgJnQwLCBjb25zdCBITFNUaW1lICZ0MSk7CisKKy8vIHJlYWQgYW5kIHdyaXRlIHZhcmlvdXMgb2JqZWN0IHRvL2Zyb20gQU1lc3NhZ2UKKwordm9pZCB3cml0ZVRvQU1lc3NhZ2Uoc3A8QU1lc3NhZ2U+IG1zZywgY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpOwordm9pZCByZWFkRnJvbUFNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSAvKiBub25udWxsICovKTsKKwordm9pZCB3cml0ZVRvQU1lc3NhZ2Uoc3A8QU1lc3NhZ2U+IG1zZywgY29uc3QgQVZTeW5jU2V0dGluZ3MgJnN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCk7Cit2b2lkIHJlYWRGcm9tQU1lc3NhZ2UoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBBVlN5bmNTZXR0aW5ncyAqc3luYyAvKiBub25udWxsICovLCBmbG9hdCAqdmlkZW9GcHMgLyogbm9ubnVsbCAqLyk7CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gVVRJTFNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9WaWRlb0ZyYW1lU2NoZWR1bGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuaApzaW1pbGFyaXR5IGluZGV4IDkyJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVmlkZW9GcmFtZVNjaGVkdWxlci5oCnJlbmFtZSB0byBpbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuaAppbmRleCA4NGIyN2I0Li45ZDk3ZGZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVmlkZW9GcmFtZVNjaGVkdWxlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oCkBAIC0yNCw3ICsyNCw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IElTdXJmYWNlQ29tcG9zZXI7CitjbGFzcyBJU3VyZmFjZUNvbXBvc2VyOwogCiBzdHJ1Y3QgVmlkZW9GcmFtZVNjaGVkdWxlciA6IHB1YmxpYyBSZWZCYXNlIHsKICAgICBWaWRlb0ZyYW1lU2NoZWR1bGVyKCk7CkBAIC0zOSw2ICszOSw5IEBACiAgICAgLy8gcmV0dXJucyB0aGUgdnN5bmMgcGVyaW9kIGZvciB0aGUgbWFpbiBkaXNwbGF5CiAgICAgbnNlY3NfdCBnZXRWc3luY1BlcmlvZCgpOwogCisgICAgLy8gcmV0dXJucyB0aGUgY3VycmVudCBmcmFtZXMtcGVyLXNlY29uZCwgb3IgMC5mIGlmIG5vdCBwcmltZWQKKyAgICBmbG9hdCBnZXRGcmFtZVJhdGUoKTsKKwogICAgIHZvaWQgcmVsZWFzZSgpOwogCiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrSGlzdG9yeVNpemUgPSA4OwpAQCAtNTQsOCArNTcsOSBAQAogICAgICAgICB2b2lkIHJlc2V0KGZsb2F0IGZwcyA9IC0xKTsKICAgICAgICAgLy8ga2VlcCBjdXJyZW50IGVzdGltYXRlLCBidXQgcmVzdGFydCBwaGFzZQogICAgICAgICB2b2lkIHJlc3RhcnQoKTsKLSAgICAgICAgLy8gcmV0dXJucyBwZXJpb2QKKyAgICAgICAgLy8gcmV0dXJucyBwZXJpb2Qgb3IgMCBpZiBub3QgeWV0IHByaW1lZAogICAgICAgICBuc2Vjc190IGFkZFNhbXBsZShuc2Vjc190IHRpbWUpOworICAgICAgICBuc2Vjc190IGdldFBlcmlvZCgpIGNvbnN0OwogCiAgICAgcHJpdmF0ZToKICAgICAgICAgbnNlY3NfdCBtUGVyaW9kOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaAppbmRleCA3MmUzZDg3Li5lZjFlMDEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaApAQCAtMTgsNyArMTgsOSBAQAogCiAjZGVmaW5lIEFfQkFTRV9IXwogCisjaWZuZGVmIEFSUkFZX1NJWkUKICNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKCooYSkpKQorI2VuZGlmCiAKICNkZWZpbmUgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMobmFtZSkgXAogICAgIG5hbWUoY29uc3QgbmFtZSAmKTsgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oCmluZGV4IDFkMGUyY2IuLjY1ZjQxNWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmgKQEAgLTI0LDYgKzI0LDMxIEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmcoYW5kcm9pZDo6c3RhdHVzX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIE5PX0VSUk9SOiAgICAgICAgICAgICAgcmV0dXJuICJOT19FUlJPUiI7CisgICAgICAgIGNhc2UgVU5LTk9XTl9FUlJPUjogICAgICAgICByZXR1cm4gIlVOS05PV05fRVJST1IiOworICAgICAgICBjYXNlIE5PX01FTU9SWTogICAgICAgICAgICAgcmV0dXJuICJOT19NRU1PUlkiOworICAgICAgICBjYXNlIElOVkFMSURfT1BFUkFUSU9OOiAgICAgcmV0dXJuICJJTlZBTElEX09QRVJBVElPTiI7CisgICAgICAgIGNhc2UgQkFEX1ZBTFVFOiAgICAgICAgICAgICByZXR1cm4gIkJBRF9WQUxVRSI7CisgICAgICAgIGNhc2UgQkFEX1RZUEU6ICAgICAgICAgICAgICByZXR1cm4gIkJBRF9UWVBFIjsKKyAgICAgICAgY2FzZSBOQU1FX05PVF9GT1VORDogICAgICAgIHJldHVybiAiTkFNRV9OT1RfRk9VTkQiOworICAgICAgICBjYXNlIFBFUk1JU1NJT05fREVOSUVEOiAgICAgcmV0dXJuICJQRVJNSVNTSU9OX0RFTklFRCI7CisgICAgICAgIGNhc2UgTk9fSU5JVDogICAgICAgICAgICAgICByZXR1cm4gIk5PX0lOSVQiOworICAgICAgICBjYXNlIEFMUkVBRFlfRVhJU1RTOiAgICAgICAgcmV0dXJuICJBTFJFQURZX0VYSVNUUyI7CisgICAgICAgIGNhc2UgREVBRF9PQkpFQ1Q6ICAgICAgICAgICByZXR1cm4gIkRFQURfT0JKRUNUIjsKKyAgICAgICAgY2FzZSBGQUlMRURfVFJBTlNBQ1RJT046ICAgIHJldHVybiAiRkFJTEVEX1RSQU5TQUNUSU9OIjsKKyAgICAgICAgY2FzZSBCQURfSU5ERVg6ICAgICAgICAgICAgIHJldHVybiAiQkFEX0lOREVYIjsKKyAgICAgICAgY2FzZSBOT1RfRU5PVUdIX0RBVEE6ICAgICAgIHJldHVybiAiTk9UX0VOT1VHSF9EQVRBIjsKKyAgICAgICAgY2FzZSBXT1VMRF9CTE9DSzogICAgICAgICAgIHJldHVybiAiV09VTERfQkxPQ0siOworICAgICAgICBjYXNlIFRJTUVEX09VVDogICAgICAgICAgICAgcmV0dXJuICJUSU1FRF9PVVQiOworICAgICAgICBjYXNlIFVOS05PV05fVFJBTlNBQ1RJT046ICAgcmV0dXJuICJVTktOT1dOX1RSQU5TQUNUSU9OIjsKKyAgICAgICAgY2FzZSBGRFNfTk9UX0FMTE9XRUQ6ICAgICAgIHJldHVybiAiRkRTX05PVF9BTExPV0VEIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKICNkZWZpbmUgTElURVJBTF9UT19TVFJJTkdfSU5URVJOQUwoeCkgICAgI3gKQEAgLTkyLDcgKzExNyw3IEBACiAKICAgICB9OwogCi0gICAgLy8gcGFyc2UgdGhlIHByb3BlcnR5IG9yIHN0cmluZyB0byBnZXQgdGhlIGRlYnVnIGxldmVsIGZvciBhIGNvbXBvbmVudCBuYW1lCisgICAgLy8gcGFyc2UgdGhlIHByb3BlcnR5IG9yIHN0cmluZyB0byBnZXQgYSBsb25nLXR5cGUgbGV2ZWwgZm9yIGEgY29tcG9uZW50IG5hbWUKICAgICAvLyBzdHJpbmcgZm9ybWF0IGlzOgogICAgIC8vIDxsZXZlbD5bOjxnbG9iPl1bLDxsZXZlbD5bOjxnbG9iPl0uLi5dCiAgICAgLy8gLSA8bGV2ZWw+IGlzIDAtNSBjb3JyZXNwb25kaW5nIHRvIEFEZWJ1Zzo6TGV2ZWwKQEAgLTEwMCwxNCArMTI1LDM4IEBACiAgICAgLy8gICBtYXRjaGVzIGFsbCBjb21wb25lbnRzCiAgICAgLy8gLSBzdHJpbmcgaXMgcmVhZCBsZWZ0LXRvLXJpZ2h0LCBhbmQgdGhlIGxhc3QgbWF0Y2hpbmcgbGV2ZWwgaXMgcmV0dXJuZWQsIG9yCiAgICAgLy8gICB0aGUgZGVmIGlmIG5vIHRlcm1zIG1hdGNoZWQKKyAgICBzdGF0aWMgbG9uZyBHZXRMZXZlbEZyb21TZXR0aW5nc1N0cmluZygKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlLCBsb25nIGRlZik7CisgICAgc3RhdGljIGxvbmcgR2V0TGV2ZWxGcm9tUHJvcGVydHkoCisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSwgbG9uZyBkZWYpOworCisgICAgLy8gc2FtZSBmb3IgQURlYnVnOjpMZXZlbCAtIHBlcmZvcm1zIGNsYW1waW5nIHRvIHZhbGlkIGRlYnVnIHJhbmdlcwogICAgIHN0YXRpYyBMZXZlbCBHZXREZWJ1Z0xldmVsRnJvbVByb3BlcnR5KAogICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcHJvcGVydHlOYW1lLCBMZXZlbCBkZWYgPSBrRGVidWdOb25lKTsKLSAgICBzdGF0aWMgTGV2ZWwgR2V0RGVidWdMZXZlbEZyb21TdHJpbmcoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSwgTGV2ZWwgZGVmID0ga0RlYnVnTm9uZSk7CiAKICAgICAvLyByZW1vdmUgcmVkdW5kYW50IHNlZ21lbnRzIG9mIGEgY29kZWMgbmFtZSwgYW5kIHJldHVybiBhIG5ld2x5IGFsbG9jYXRlZAogICAgIC8vIHN0cmluZyBzdWl0YWJsZSBmb3IgZGVidWdnaW5nCiAgICAgc3RhdGljIGNoYXIgKkdldERlYnVnTmFtZShjb25zdCBjaGFyICpuYW1lKTsKKworICAgIGlubGluZSBzdGF0aWMgYm9vbCBpc0V4cGVyaW1lbnRFbmFibGVkKAorICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSBfX3VudXNlZCAvKiBub25udWxsICovLCBib29sIGFsbG93IF9fdW51c2VkID0gdHJ1ZSkgeworI2lmZGVmIEVOQUJMRV9TVEFHRUZSSUdIVF9FWFBFUklNRU5UUworICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAibGVnYWN5LWFkYXB0aXZlIikpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRFeHBlcmltZW50RmxhZyhhbGxvdywgbmFtZSwgMiwgMSk7IC8vIGV2ZXJ5IG90aGVyIGRheQorICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImxlZ2FjeS1zZXRzdXJmYWNlIikpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRFeHBlcmltZW50RmxhZyhhbGxvdywgbmFtZSwgMywgMSk7IC8vIGV2ZXJ5IHRoaXJkIGRheQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoInVua25vd24gZXhwZXJpbWVudCAnJXMnIChkaXNhYmxlZCkiLCBuYW1lKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLy8gcGFzcyBpbiBhbGxvdywgc28gd2UgY2FuIHByaW50IGluIHRoZSBsb2cgaWYgdGhlIGV4cGVyaW1lbnQgaXMgZGlzYWJsZWQKKyAgICBzdGF0aWMgYm9vbCBnZXRFeHBlcmltZW50RmxhZygKKyAgICAgICAgICAgIGJvb2wgYWxsb3csIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQ2NF90IG1vZHVsbywgdWludDY0X3QgbGltaXQsCisgICAgICAgICAgICB1aW50NjRfdCBwbHVzID0gMCwgdWludDY0X3QgdGltZURpdmlzb3IgPSAyNCAqIDYwICogNjAgLyogMSBkYXkgKi8pOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmgKaW5kZXggNDFhZGU3Ny4uZmUwMmE4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmgKQEAgLTI5LDYgKzI5LDcgQEAKIHN0cnVjdCBBSGFuZGxlciA6IHB1YmxpYyBSZWZCYXNlIHsKICAgICBBSGFuZGxlcigpCiAgICAgICAgIDogbUlEKDApLAorICAgICAgICAgIG1WZXJib3NlU3RhdHMoZmFsc2UpLAogICAgICAgICAgIG1NZXNzYWdlQ291bnRlcigwKSB7CiAgICAgfQogCkBAIC0zNiwyMyArMzcsNDAgQEAKICAgICAgICAgcmV0dXJuIG1JRDsKICAgICB9CiAKLSAgICBzcDxBTG9vcGVyPiBsb29wZXIoKTsKKyAgICBzcDxBTG9vcGVyPiBsb29wZXIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTG9vcGVyLnByb21vdGUoKTsKKyAgICB9CisKKyAgICB3cDxBTG9vcGVyPiBnZXRMb29wZXIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTG9vcGVyOworICAgIH0KKworICAgIHdwPEFIYW5kbGVyPiBnZXRIYW5kbGVyKCkgY29uc3QgeworICAgICAgICAvLyBhbGxvdyBnZXR0aW5nIGEgd2VhayByZWZlcmVuY2UgdG8gYSBjb25zdCBoYW5kbGVyCisgICAgICAgIHJldHVybiBjb25zdF9jYXN0PEFIYW5kbGVyICo+KHRoaXMpOworICAgIH0KIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgPSAwOwogCiBwcml2YXRlOgotICAgIGZyaWVuZCBzdHJ1Y3QgQUxvb3BlclJvc3RlcjsKKyAgICBmcmllbmQgc3RydWN0IEFNZXNzYWdlOyAgICAgIC8vIGRlbGl2ZXJNZXNzYWdlKCkKKyAgICBmcmllbmQgc3RydWN0IEFMb29wZXJSb3N0ZXI7IC8vIHNldElEKCkKIAogICAgIEFMb29wZXI6OmhhbmRsZXJfaWQgbUlEOworICAgIHdwPEFMb29wZXI+IG1Mb29wZXI7CiAKLSAgICB2b2lkIHNldElEKEFMb29wZXI6OmhhbmRsZXJfaWQgaWQpIHsKKyAgICBpbmxpbmUgdm9pZCBzZXRJRChBTG9vcGVyOjpoYW5kbGVyX2lkIGlkLCB3cDxBTG9vcGVyPiBsb29wZXIpIHsKICAgICAgICAgbUlEID0gaWQ7CisgICAgICAgIG1Mb29wZXIgPSBsb29wZXI7CiAgICAgfQogCisgICAgYm9vbCBtVmVyYm9zZVN0YXRzOwogICAgIHVpbnQzMl90IG1NZXNzYWdlQ291bnRlcjsKICAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgdWludDMyX3Q+IG1NZXNzYWdlczsKIAorICAgIHZvaWQgZGVsaXZlck1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQUhhbmRsZXIpOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmgKaW5kZXggNzBlMGM1ZS4uMDljNDY5YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oCkBAIC0zMCw2ICszMCw3IEBACiAKIHN0cnVjdCBBSGFuZGxlcjsKIHN0cnVjdCBBTWVzc2FnZTsKK3N0cnVjdCBBUmVwbHlUb2tlbjsKIAogc3RydWN0IEFMb29wZXIgOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgdHlwZWRlZiBpbnQzMl90IGV2ZW50X2lkOwpAQCAtNTMsMTEgKzU0LDE1IEBACiAKICAgICBzdGF0aWMgaW50NjRfdCBHZXROb3dVcygpOwogCisgICAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1OYW1lLmNfc3RyKCk7CisgICAgfQorCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QUxvb3BlcigpOwogCiBwcml2YXRlOgotICAgIGZyaWVuZCBzdHJ1Y3QgQUxvb3BlclJvc3RlcjsKKyAgICBmcmllbmQgc3RydWN0IEFNZXNzYWdlOyAgICAgICAvLyBwb3N0KCkKIAogICAgIHN0cnVjdCBFdmVudCB7CiAgICAgICAgIGludDY0X3QgbVdoZW5VczsKQEAgLTc1LDEyICs4MCwzMiBAQAogICAgIHNwPExvb3BlclRocmVhZD4gbVRocmVhZDsKICAgICBib29sIG1SdW5uaW5nTG9jYWxseTsKIAorICAgIC8vIHVzZSBhIHNlcGFyYXRlIGxvY2sgZm9yIHJlcGx5IGhhbmRsaW5nLCBhcyBpdCBpcyBhbHdheXMgb24gYW5vdGhlciB0aHJlYWQKKyAgICAvLyB1c2UgYSBjZW50cmFsIGxvY2ssIGhvd2V2ZXIsIHRvIGF2b2lkIGNyZWF0aW5nIGEgbXV0ZXggZm9yIGVhY2ggcmVwbHkKKyAgICBNdXRleCBtUmVwbGllc0xvY2s7CisgICAgQ29uZGl0aW9uIG1SZXBsaWVzQ29uZGl0aW9uOworCisgICAgLy8gU1RBUlQgLS0tIG1ldGhvZHMgdXNlZCBvbmx5IGJ5IEFNZXNzYWdlCisKKyAgICAvLyBwb3N0cyBhIG1lc3NhZ2Ugb24gdGhpcyBsb29wZXIgd2l0aCB0aGUgZ2l2ZW4gdGltZW91dAogICAgIHZvaWQgcG9zdChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgaW50NjRfdCBkZWxheVVzKTsKKworICAgIC8vIGNyZWF0ZXMgYSByZXBseSB0b2tlbiB0byBiZSB1c2VkIHdpdGggdGhpcyBsb29wZXIKKyAgICBzcDxBUmVwbHlUb2tlbj4gY3JlYXRlUmVwbHlUb2tlbigpOworICAgIC8vIHdhaXRzIGZvciBhIHJlc3BvbnNlIGZvciB0aGUgcmVwbHkgdG9rZW4uICBJZiBzdGF0dXMgaXMgT0ssIHRoZSByZXNwb25zZQorICAgIC8vIGlzIHN0b3JlZCBpbnRvIHRoZSBzdXBwbGllZCB2YXJpYWJsZS4gIE90aGVyd2lzZSwgaXQgaXMgdW5jaGFuZ2VkLgorICAgIHN0YXR1c190IGF3YWl0UmVzcG9uc2UoY29uc3Qgc3A8QVJlcGx5VG9rZW4+ICZyZXBseVRva2VuLCBzcDxBTWVzc2FnZT4gKnJlc3BvbnNlKTsKKyAgICAvLyBwb3N0cyBhIHJlcGx5IGZvciBhIHJlcGx5IHRva2VuLiAgSWYgdGhlIHJlcGx5IGNvdWxkIGJlIHN1Y2Nlc3NmdWxseSBwb3N0ZWQsCisgICAgLy8gaXQgcmV0dXJucyBPSy4gT3RoZXJ3aXNlLCBpdCByZXR1cm5zIGFuIGVycm9yIHZhbHVlLgorICAgIHN0YXR1c190IHBvc3RSZXBseShjb25zdCBzcDxBUmVwbHlUb2tlbj4gJnJlcGx5VG9rZW4sIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIC8vIEVORCAtLS0gbWV0aG9kcyB1c2VkIG9ubHkgYnkgQU1lc3NhZ2UKKwogICAgIGJvb2wgbG9vcCgpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQUxvb3Blcik7CiB9OwogCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIEFfTE9PUEVSX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuaAppbmRleCBhMGJlOGViLi45OTEyNDU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmgKQEAgLTMzLDE2ICszMyw2IEBACiAgICAgdm9pZCB1bnJlZ2lzdGVySGFuZGxlcihBTG9vcGVyOjpoYW5kbGVyX2lkIGhhbmRsZXJJRCk7CiAgICAgdm9pZCB1bnJlZ2lzdGVyU3RhbGVIYW5kbGVycygpOwogCi0gICAgc3RhdHVzX3QgcG9zdE1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIGludDY0X3QgZGVsYXlVcyA9IDApOwotICAgIHZvaWQgZGVsaXZlck1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotCi0gICAgc3RhdHVzX3QgcG9zdEFuZEF3YWl0UmVzcG9uc2UoCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgc3A8QU1lc3NhZ2U+ICpyZXNwb25zZSk7Ci0KLSAgICB2b2lkIHBvc3RSZXBseSh1aW50MzJfdCByZXBseUlELCBjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KTsKLQotICAgIHNwPEFMb29wZXI+IGZpbmRMb29wZXIoQUxvb3Blcjo6aGFuZGxlcl9pZCBoYW5kbGVySUQpOwotCiAgICAgdm9pZCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKIHByaXZhdGU6CkBAIC01NCwxMCArNDQsNiBAQAogICAgIE11dGV4IG1Mb2NrOwogICAgIEtleWVkVmVjdG9yPEFMb29wZXI6OmhhbmRsZXJfaWQsIEhhbmRsZXJJbmZvPiBtSGFuZGxlcnM7CiAgICAgQUxvb3Blcjo6aGFuZGxlcl9pZCBtTmV4dEhhbmRsZXJJRDsKLSAgICB1aW50MzJfdCBtTmV4dFJlcGx5SUQ7Ci0gICAgQ29uZGl0aW9uIG1SZXBsaWVzQ29uZGl0aW9uOwotCi0gICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIHNwPEFNZXNzYWdlPiA+IG1SZXBsaWVzOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQUxvb3BlclJvc3Rlcik7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaAppbmRleCBhOWUyMzViLi44M2I5NDQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaApAQCAtMjYsMTEgKzI2LDQxIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBQnVmZmVyOworc3RydWN0IEFIYW5kbGVyOwogc3RydWN0IEFTdHJpbmc7Ci1zdHJ1Y3QgUGFyY2VsOworY2xhc3MgUGFyY2VsOworCitzdHJ1Y3QgQVJlcGx5VG9rZW4gOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgQVJlcGx5VG9rZW4oY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlcikKKyAgICAgICAgOiBtTG9vcGVyKGxvb3BlciksCisgICAgICAgICAgbVJlcGxpZWQoZmFsc2UpIHsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBBTWVzc2FnZTsKKyAgICBmcmllbmQgc3RydWN0IEFMb29wZXI7CisgICAgd3A8QUxvb3Blcj4gbUxvb3BlcjsKKyAgICBzcDxBTWVzc2FnZT4gbVJlcGx5OworICAgIGJvb2wgbVJlcGxpZWQ7CisKKyAgICBzcDxBTG9vcGVyPiBnZXRMb29wZXIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTG9vcGVyLnByb21vdGUoKTsKKyAgICB9CisgICAgLy8gaWYgcmVwbHkgaXMgbm90IHNldCwgcmV0dXJucyBmYWxzZTsgb3RoZXJ3aXNlLCBpdCByZXRyaWV2ZXMgdGhlIHJlcGx5IGFuZCByZXR1cm5zIHRydWUKKyAgICBib29sIHJldHJpZXZlUmVwbHkoc3A8QU1lc3NhZ2U+ICpyZXBseSkgeworICAgICAgICBpZiAobVJlcGxpZWQpIHsKKyAgICAgICAgICAgICpyZXBseSA9IG1SZXBseTsKKyAgICAgICAgICAgIG1SZXBseS5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtUmVwbGllZDsKKyAgICB9CisgICAgLy8gc2V0cyB0aGUgcmVwbHkgZm9yIHRoaXMgdG9rZW4uIHJldHVybnMgT0sgb3IgZXJyb3IKKyAgICBzdGF0dXNfdCBzZXRSZXBseShjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KTsKK307CiAKIHN0cnVjdCBBTWVzc2FnZSA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBBTWVzc2FnZSh1aW50MzJfdCB3aGF0ID0gMCwgQUxvb3Blcjo6aGFuZGxlcl9pZCB0YXJnZXQgPSAwKTsKKyAgICBBTWVzc2FnZSgpOworICAgIEFNZXNzYWdlKHVpbnQzMl90IHdoYXQsIGNvbnN0IHNwPGNvbnN0IEFIYW5kbGVyPiAmaGFuZGxlcik7CiAKICAgICBzdGF0aWMgc3A8QU1lc3NhZ2U+IEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpOwogICAgIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Q7CkBAIC0zOCw4ICs2OCw3IEBACiAgICAgdm9pZCBzZXRXaGF0KHVpbnQzMl90IHdoYXQpOwogICAgIHVpbnQzMl90IHdoYXQoKSBjb25zdDsKIAotICAgIHZvaWQgc2V0VGFyZ2V0KEFMb29wZXI6OmhhbmRsZXJfaWQgdGFyZ2V0KTsKLSAgICBBTG9vcGVyOjpoYW5kbGVyX2lkIHRhcmdldCgpIGNvbnN0OworICAgIHZvaWQgc2V0VGFyZ2V0KGNvbnN0IHNwPGNvbnN0IEFIYW5kbGVyPiAmaGFuZGxlcik7CiAKICAgICB2b2lkIGNsZWFyKCk7CiAKQEAgLTc2LDE4ICsxMDUsMjIgQEAKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICBpbnQzMl90ICpsZWZ0LCBpbnQzMl90ICp0b3AsIGludDMyX3QgKnJpZ2h0LCBpbnQzMl90ICpib3R0b20pIGNvbnN0OwogCi0gICAgdm9pZCBwb3N0KGludDY0X3QgZGVsYXlVcyA9IDApOworICAgIHN0YXR1c190IHBvc3QoaW50NjRfdCBkZWxheVVzID0gMCk7CiAKICAgICAvLyBQb3N0cyB0aGUgbWVzc2FnZSB0byBpdHMgdGFyZ2V0IGFuZCB3YWl0cyBmb3IgYSByZXNwb25zZSAob3IgZXJyb3IpCiAgICAgLy8gYmVmb3JlIHJldHVybmluZy4KICAgICBzdGF0dXNfdCBwb3N0QW5kQXdhaXRSZXNwb25zZShzcDxBTWVzc2FnZT4gKnJlc3BvbnNlKTsKIAogICAgIC8vIElmIHRoaXMgcmV0dXJucyB0cnVlLCB0aGUgc2VuZGVyIG9mIHRoaXMgbWVzc2FnZSBpcyBzeW5jaHJvbm91c2x5Ci0gICAgLy8gYXdhaXRpbmcgYSByZXNwb25zZSwgdGhlICJyZXBseUlEIiBjYW4gYmUgdXNlZCB0byBzZW5kIHRoZSByZXNwb25zZQotICAgIC8vIHZpYSAicG9zdFJlcGx5IiBiZWxvdy4KLSAgICBib29sIHNlbmRlckF3YWl0c1Jlc3BvbnNlKHVpbnQzMl90ICpyZXBseUlEKSBjb25zdDsKKyAgICAvLyBhd2FpdGluZyBhIHJlc3BvbnNlIGFuZCB0aGUgcmVwbHkgdG9rZW4gaXMgY29uc3VtZWQgZnJvbSB0aGUgbWVzc2FnZQorICAgIC8vIGFuZCBzdG9yZWQgaW50byByZXBseUlELiBUaGUgcmVwbHkgdG9rZW4gbXVzdCBiZSB1c2VkIHRvIHNlbmQgdGhlIHJlc3BvbnNlCisgICAgLy8gdXNpbmcgInBvc3RSZXBseSIgYmVsb3cuCisgICAgYm9vbCBzZW5kZXJBd2FpdHNSZXNwb25zZShzcDxBUmVwbHlUb2tlbj4gKnJlcGx5SUQpOwogCi0gICAgdm9pZCBwb3N0UmVwbHkodWludDMyX3QgcmVwbHlJRCk7CisgICAgLy8gUG9zdHMgdGhlIG1lc3NhZ2UgYXMgYSByZXNwb25zZSB0byBhIHJlcGx5IHRva2VuLiAgQSByZXBseSB0b2tlbiBjYW4KKyAgICAvLyBvbmx5IGJlIHVzZWQgb25jZS4gUmV0dXJucyBPSyBpZiB0aGUgcmVzcG9uc2UgY291bGQgYmUgcG9zdGVkOyBvdGhlcndpc2UsCisgICAgLy8gYW4gZXJyb3IuCisgICAgc3RhdHVzX3QgcG9zdFJlcGx5KGNvbnN0IHNwPEFSZXBseVRva2VuPiAmcmVwbHlJRCk7CiAKICAgICAvLyBQZXJmb3JtcyBhIGRlZXAtY29weSBvZiAidGhpcyIsIGNvbnRhaW5lZCBtZXNzYWdlcyBhcmUgaW4gdHVybiAiZHVwJ2VkIi4KICAgICAvLyBXYXJuaW5nOiBSZWZCYXNlIGl0ZW1zLCBpLmUuICJvYmplY3RzIiBhcmUgX25vdF8gY29waWVkIGJ1dCBvbmx5IGhhdmUKQEAgLTExNyw5ICsxNTAsMTYgQEAKICAgICB2aXJ0dWFsIH5BTWVzc2FnZSgpOwogCiBwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgQUxvb3BlcjsgLy8gZGVsaXZlcigpCisKICAgICB1aW50MzJfdCBtV2hhdDsKKworICAgIC8vIHVzZWQgb25seSBmb3IgZGVidWdnaW5nCiAgICAgQUxvb3Blcjo6aGFuZGxlcl9pZCBtVGFyZ2V0OwogCisgICAgd3A8QUhhbmRsZXI+IG1IYW5kbGVyOworICAgIHdwPEFMb29wZXI+IG1Mb29wZXI7CisKICAgICBzdHJ1Y3QgUmVjdCB7CiAgICAgICAgIGludDMyX3QgbUxlZnQsIG1Ub3AsIG1SaWdodCwgbUJvdHRvbTsKICAgICB9OwpAQCAtMTU3LDYgKzE5Nyw4IEBACiAKICAgICBzaXplX3QgZmluZEl0ZW1JbmRleChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbGVuKSBjb25zdDsKIAorICAgIHZvaWQgZGVsaXZlcigpOworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU1lc3NhZ2UpOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmgKaW5kZXggODIyZGJiMy4uMmY2ZDUzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oCkBAIC0yNCw3ICsyNCw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIFN0cmluZzg7Ci1zdHJ1Y3QgUGFyY2VsOworY2xhc3MgUGFyY2VsOwogCiBzdHJ1Y3QgQVN0cmluZyB7CiAgICAgQVN0cmluZygpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0RHJpdmVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHREcml2ZXIuaAppbmRleCAzN2VmNjc0Li42ZjdjNjkzIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHREcml2ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHREcml2ZXIuaApAQCAtMjQsNyArMjQsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIEFMb29wZXI7CitzdHJ1Y3QgQUxvb3BlcjsKIHN0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIGNsYXNzIE1lZGlhUGxheWVyQmFzZTsKIGNsYXNzIE1lZGlhU291cmNlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZGsvTmRrTWVkaWFDb2RlYy5oIGIvaW5jbHVkZS9uZGsvTmRrTWVkaWFDb2RlYy5oCmluZGV4IGMwN2Y0YzkuLjRmNmExZWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmRrL05ka01lZGlhQ29kZWMuaAorKysgYi9pbmNsdWRlL25kay9OZGtNZWRpYUNvZGVjLmgKQEAgLTE0Miw3ICsxNDIsOCBAQAogLyoqCiAgKiBHZXQgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGF2YWlsYWJsZSBidWZmZXIgb2YgcHJvY2Vzc2VkIGRhdGEuCiAgKi8KLXNzaXplX3QgQU1lZGlhQ29kZWNfZGVxdWV1ZU91dHB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosIEFNZWRpYUNvZGVjQnVmZmVySW5mbyAqaW5mbywgaW50NjRfdCB0aW1lb3V0VXMpOworc3NpemVfdCBBTWVkaWFDb2RlY19kZXF1ZXVlT3V0cHV0QnVmZmVyKEFNZWRpYUNvZGVjKiwgQU1lZGlhQ29kZWNCdWZmZXJJbmZvICppbmZvLAorICAgICAgICBpbnQ2NF90IHRpbWVvdXRVcyk7CiBBTWVkaWFGb3JtYXQqIEFNZWRpYUNvZGVjX2dldE91dHB1dEZvcm1hdChBTWVkaWFDb2RlYyopOwogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmRrL05ka01lZGlhRXh0cmFjdG9yLmggYi9pbmNsdWRlL25kay9OZGtNZWRpYUV4dHJhY3Rvci5oCmluZGV4IDdhNGU3MDIuLjczMjRkMzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmRrL05ka01lZGlhRXh0cmFjdG9yLmgKKysrIGIvaW5jbHVkZS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuaApAQCAtNTUsMTIgKzU1LDE0IEBACiAvKioKICAqICBTZXQgdGhlIGZpbGUgZGVzY3JpcHRvciBmcm9tIHdoaWNoIHRoZSBleHRyYWN0b3Igd2lsbCByZWFkLgogICovCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUZkKEFNZWRpYUV4dHJhY3RvciosIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoKTsKK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlRmQoQU1lZGlhRXh0cmFjdG9yKiwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwKKyAgICAgICAgb2ZmNjRfdCBsZW5ndGgpOwogCiAvKioKICAqIFNldCB0aGUgVVJJIGZyb20gd2hpY2ggdGhlIGV4dHJhY3RvciB3aWxsIHJlYWQuCiAgKi8KLW1lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlKEFNZWRpYUV4dHJhY3RvciosIGNvbnN0IGNoYXIgKmxvY2F0aW9uKTsgLy8gVE9ETyBzdXBwb3J0IGhlYWRlcnMKK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlKEFNZWRpYUV4dHJhY3RvciosIGNvbnN0IGNoYXIgKmxvY2F0aW9uKTsKKyAgICAgICAgLy8gVE9ETyBzdXBwb3J0IGhlYWRlcnMKIAogLyoqCiAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiB0cmFja3MgaW4gdGhlIHByZXZpb3VzbHkgc3BlY2lmaWVkIG1lZGlhIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmggYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCmluZGV4IDMxZGZmMzYuLjFlNTA2NGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKKysrIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaApAQCAtMjQsOSArMjQsOSBAQAogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJhaW8vcm91bmR1cC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3JvdW5kdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPG1lZGlhL1NpbmdsZVN0YXRlUXVldWUuaD4KLSNpbmNsdWRlIDxwcml2YXRlL21lZGlhL1N0YXRpY0F1ZGlvVHJhY2tTdGF0ZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTU0LDI0ICs1NCw2OCBAQAogc3RydWN0IEF1ZGlvVHJhY2tTaGFyZWRTdHJlYW1pbmcgewogICAgIC8vIHNpbWlsYXIgdG8gTkJBSU8gTW9ub1BpcGUKICAgICAvLyBpbiBjb250aW51b3VzbHkgaW5jcmVtZW50aW5nIGZyYW1lIHVuaXRzLCB0YWtlIG1vZHVsbyBidWZmZXIgc2l6ZSwgd2hpY2ggbXVzdCBiZSBhIHBvd2VyIG9mIDIKLSAgICB2b2xhdGlsZSBpbnQzMl90IG1Gcm9udDsgICAgLy8gcmVhZCBieSBzZXJ2ZXIKLSAgICB2b2xhdGlsZSBpbnQzMl90IG1SZWFyOyAgICAgLy8gd3JpdGUgYnkgY2xpZW50CisgICAgdm9sYXRpbGUgaW50MzJfdCBtRnJvbnQ7ICAgIC8vIHJlYWQgYnkgY29uc3VtZXIgKG91dHB1dDogc2VydmVyLCBpbnB1dDogY2xpZW50KQorICAgIHZvbGF0aWxlIGludDMyX3QgbVJlYXI7ICAgICAvLyB3cml0dGVuIGJ5IHByb2R1Y2VyIChvdXRwdXQ6IGNsaWVudCwgaW5wdXQ6IHNlcnZlcikKICAgICB2b2xhdGlsZSBpbnQzMl90IG1GbHVzaDsgICAgLy8gaW5jcmVtZW50ZWQgYnkgY2xpZW50IHRvIGluZGljYXRlIGEgcmVxdWVzdCB0byBmbHVzaDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VydmVyIG5vdGljZXMgYW5kIGRpc2NhcmRzIGFsbCBkYXRhIGJldHdlZW4gbUZyb250IGFuZCBtUmVhcgogICAgIHZvbGF0aWxlIHVpbnQzMl90IG1VbmRlcnJ1bkZyYW1lczsgIC8vIHNlcnZlciBpbmNyZW1lbnRzIGZvciBlYWNoIHVuYXZhaWxhYmxlIGJ1dCBkZXNpcmVkIGZyYW1lCiB9OwogCisvLyBSZXByZXNlbnRzIGEgc2luZ2xlIHN0YXRlIG9mIGFuIEF1ZGlvVHJhY2sgdGhhdCB3YXMgY3JlYXRlZCBpbiBzdGF0aWMgbW9kZSAoc2hhcmVkIG1lbW9yeSBidWZmZXIKKy8vIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQpLiAgVGhpcyBzdGF0ZSBuZWVkcyB0byBiZSBjb21tdW5pY2F0ZWQgZnJvbSB0aGUgY2xpZW50IHRvIHNlcnZlci4gIEFzIHRoaXMKKy8vIHN0YXRlIGlzIHRvbyBsYXJnZSB0byBiZSB1cGRhdGVkIGF0b21pY2FsbHkgd2l0aG91dCBhIG11dGV4LCBhbmQgbXV0ZXhlcyBhcmVuJ3QgYWxsb3dlZCBoZXJlLCB0aGUKKy8vIHN0YXRlIGlzIHdyYXBwZWQgYnkgYSBTaW5nbGVTdGF0ZVF1ZXVlLgorc3RydWN0IFN0YXRpY0F1ZGlvVHJhY2tTdGF0ZSB7CisgICAgLy8gRG8gbm90IGRlZmluZSBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzLCBvciB2aXJ0dWFsIG1ldGhvZHMgYXMgdGhpcyBpcyBwYXJ0IG9mIGEKKyAgICAvLyB1bmlvbiBpbiBzaGFyZWQgbWVtb3J5IGFuZCB0aGV5IHdpbGwgbm90IGdldCBjYWxsZWQgcHJvcGVybHkuCisKKyAgICAvLyBUaGVzZSBmaWVsZHMgc2hvdWxkIGJvdGggYmUgc2l6ZV90LCBidXQgc2luY2UgdGhleSBhcmUgbG9jYXRlZCBpbiBzaGFyZWQgbWVtb3J5IHdlCisgICAgLy8gZm9yY2UgdG8gMzItYml0LiAgVGhlIGNsaWVudCBhbmQgc2VydmVyIG1heSBoYXZlIGRpZmZlcmVudCB0eXBlZGVmcyBmb3Igc2l6ZV90LgorCisgICAgLy8gVGhlIHN0YXRlIGhhcyBhIHNlcXVlbmNlIGNvdW50ZXIgdG8gaW5kaWNhdGUgd2hldGhlciBjaGFuZ2VzIGFyZSBtYWRlIHRvIGxvb3Agb3IgcG9zaXRpb24uCisgICAgLy8gVGhlIHNlcXVlbmNlIGNvdW50ZXIgYWxzbyBjdXJyZW50bHkgaW5kaWNhdGVzIHdoZXRoZXIgbG9vcCBvciBwb3NpdGlvbiBpcyBmaXJzdCBkZXBlbmRpbmcKKyAgICAvLyBvbiB3aGljaCBpcyBncmVhdGVyOyBpdCBqdW1wcyBieSBtYXgobUxvb3BTZXF1ZW5jZSwgbVBvc2l0aW9uU2VxdWVuY2UpICsgMS4KKworICAgIHVpbnQzMl90ICAgIG1Mb29wU3RhcnQ7CisgICAgdWludDMyX3QgICAgbUxvb3BFbmQ7CisgICAgaW50MzJfdCAgICAgbUxvb3BDb3VudDsKKyAgICB1aW50MzJfdCAgICBtTG9vcFNlcXVlbmNlOyAvLyBhIHNlcXVlbmNlIGNvdW50ZXIgdG8gaW5kaWNhdGUgY2hhbmdlcyB0byBsb29wCisgICAgdWludDMyX3QgICAgbVBvc2l0aW9uOworICAgIHVpbnQzMl90ICAgIG1Qb3NpdGlvblNlcXVlbmNlOyAvLyBhIHNlcXVlbmNlIGNvdW50ZXIgdG8gaW5kaWNhdGUgY2hhbmdlcyB0byBwb3NpdGlvbgorfTsKKwogdHlwZWRlZiBTaW5nbGVTdGF0ZVF1ZXVlPFN0YXRpY0F1ZGlvVHJhY2tTdGF0ZT4gU3RhdGljQXVkaW9UcmFja1NpbmdsZVN0YXRlUXVldWU7CiAKK3N0cnVjdCBTdGF0aWNBdWRpb1RyYWNrUG9zTG9vcCB7CisgICAgLy8gRG8gbm90IGRlZmluZSBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzLCBvciB2aXJ0dWFsIG1ldGhvZHMgYXMgdGhpcyBpcyBwYXJ0IG9mIGEKKyAgICAvLyB1bmlvbiBpbiBzaGFyZWQgbWVtb3J5IGFuZCB3aWxsIG5vdCBnZXQgY2FsbGVkIHByb3Blcmx5LgorCisgICAgLy8gVGhlc2UgZmllbGRzIHNob3VsZCBib3RoIGJlIHNpemVfdCwgYnV0IHNpbmNlIHRoZXkgYXJlIGxvY2F0ZWQgaW4gc2hhcmVkIG1lbW9yeSB3ZQorICAgIC8vIGZvcmNlIHRvIDMyLWJpdC4gIFRoZSBjbGllbnQgYW5kIHNlcnZlciBtYXkgaGF2ZSBkaWZmZXJlbnQgdHlwZWRlZnMgZm9yIHNpemVfdC4KKworICAgIC8vIFRoaXMgc3RydWN0IGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiBhIHNpbmdsZSBzdGF0ZSBxdWV1ZSB0byBjb21tdW5pY2F0ZSB0aGUKKyAgICAvLyBzdGF0aWMgQXVkaW9UcmFjayBzZXJ2ZXIgc3RhdGUgdG8gdGhlIGNsaWVudCB3aGlsZSBkYXRhIGlzIGNvbnN1bWVkLgorICAgIC8vIEl0IGlzIHNtYWxsZXIgdGhhbiBTdGF0aWNBdWRpb1RyYWNrU3RhdGUgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmcm9tCisgICAgLy8gYmVpbmcgc2VudC4KKworICAgIHVpbnQzMl90IG1CdWZmZXJQb3NpdGlvbjsKKyAgICBpbnQzMl90ICBtTG9vcENvdW50OworfTsKKwordHlwZWRlZiBTaW5nbGVTdGF0ZVF1ZXVlPFN0YXRpY0F1ZGlvVHJhY2tQb3NMb29wPiBTdGF0aWNBdWRpb1RyYWNrUG9zTG9vcFF1ZXVlOworCiBzdHJ1Y3QgQXVkaW9UcmFja1NoYXJlZFN0YXRpYyB7CisgICAgLy8gY2xpZW50IHJlcXVlc3RzIHRvIHRoZSBzZXJ2ZXIgZm9yIGxvb3Agb3IgcG9zaXRpb24gY2hhbmdlcy4KICAgICBTdGF0aWNBdWRpb1RyYWNrU2luZ2xlU3RhdGVRdWV1ZTo6U2hhcmVkCiAgICAgICAgICAgICAgICAgICAgIG1TaW5nbGVTdGF0ZVF1ZXVlOwotICAgIC8vIFRoaXMgZmllbGQgc2hvdWxkIGJlIGEgc2l6ZV90LCBidXQgc2luY2UgaXQgaXMgbG9jYXRlZCBpbiBzaGFyZWQgbWVtb3J5IHdlCi0gICAgLy8gZm9yY2UgdG8gMzItYml0LiAgVGhlIGNsaWVudCBhbmQgc2VydmVyIG1heSBoYXZlIGRpZmZlcmVudCB0eXBlZGVmcyBmb3Igc2l6ZV90LgotICAgIHVpbnQzMl90ICAgICAgICBtQnVmZmVyUG9zaXRpb247ICAgIC8vIHVwZGF0ZWQgYXN5bmNocm9ub3VzbHkgYnkgc2VydmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICJmb3IgZW50ZXJ0YWlubWVudCBwdXJwb3NlcyBvbmx5IgorICAgIC8vIHBvc2l0aW9uIGluZm8gdXBkYXRlZCBhc3luY2hyb25vdXNseSBieSBzZXJ2ZXIgYW5kIHJlYWQgYnkgY2xpZW50LAorICAgIC8vICJmb3IgZW50ZXJ0YWlubWVudCBwdXJwb3NlcyBvbmx5IgorICAgIFN0YXRpY0F1ZGlvVHJhY2tQb3NMb29wUXVldWU6OlNoYXJlZAorICAgICAgICAgICAgICAgICAgICBtUG9zTG9vcFF1ZXVlOwogfTsKIAordHlwZWRlZiBTaW5nbGVTdGF0ZVF1ZXVlPEF1ZGlvUGxheWJhY2tSYXRlPiBQbGF5YmFja1JhdGVRdWV1ZTsKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyBJbXBvcnRhbnQ6IGRvIG5vdCBhZGQgYW55IHZpcnR1YWwgbWV0aG9kcywgaW5jbHVkaW5nIH4KQEAgLTk2LDcgKzE0MCw4IEBACiAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgbVNlcnZlcjsgICAgLy8gTnVtYmVyIG9mIGZpbGxlZCBmcmFtZXMgY29uc3VtZWQgYnkgc2VydmVyIChtSXNPdXQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIGZpbGxlZCBmcmFtZXMgcHJvdmlkZWQgYnkgc2VydmVyICghbUlzT3V0KS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCBpcyB1cGRhdGVkIGFzeW5jaHJvbm91c2x5IGJ5IHNlcnZlciB3aXRob3V0IGEgYmFycmllci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdmFsdWUgc2hvdWxkIGJlIHVzZWQgImZvciBlbnRlcnRhaW5tZW50IHB1cnBvc2VzIG9ubHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB2YWx1ZSBzaG91bGQgYmUgdXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICJmb3IgZW50ZXJ0YWlubWVudCBwdXJwb3NlcyBvbmx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBtZWFucyBkb24ndCBtYWtlIGltcG9ydGFudCBkZWNpc2lvbnMgYmFzZWQgb24gaXQuCiAKICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBtUGFkMTsgICAgICAvLyB1bnVzZWQKQEAgLTExNyw2ICsxNjIsOCBAQAogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIG1TYW1wbGVSYXRlOyAgICAvLyBBdWRpb1RyYWNrIG9ubHk6IGNsaWVudCdzIHJlcXVlc3RlZCBzYW1wbGUgcmF0ZSBpbiBIegogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciAwID09IGRlZmF1bHQuIFdyaXRlLW9ubHkgY2xpZW50LCByZWFkLW9ubHkgc2VydmVyLgogCisgICAgICAgICAgICAgICAgUGxheWJhY2tSYXRlUXVldWU6OlNoYXJlZCBtUGxheWJhY2tSYXRlUXVldWU7CisKICAgICAgICAgICAgICAgICAvLyBjbGllbnQgd3JpdGUtb25seSwgc2VydmVyIHJlYWQtb25seQogICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgIG1TZW5kTGV2ZWw7ICAgICAgLy8gRml4ZWQgcG9pbnQgVTQuMTIgc28gMHgxMDAwIG1lYW5zIDEuMAogCkBAIC0yNzEsNyArMzE4LDggQEAKICAgICBBdWRpb1RyYWNrQ2xpZW50UHJveHkoYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrLCB2b2lkICpidWZmZXJzLCBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgIHNpemVfdCBmcmFtZVNpemUsIGJvb2wgY2xpZW50SW5TZXJ2ZXIgPSBmYWxzZSkKICAgICAgICAgOiBDbGllbnRQcm94eShjYmxrLCBidWZmZXJzLCBmcmFtZUNvdW50LCBmcmFtZVNpemUsIHRydWUgLyppc091dCovLAotICAgICAgICAgIGNsaWVudEluU2VydmVyKSB7IH0KKyAgICAgICAgICBjbGllbnRJblNlcnZlciksCisgICAgICAgICAgbVBsYXliYWNrUmF0ZU11dGF0b3IoJmNibGstPm1QbGF5YmFja1JhdGVRdWV1ZSkgeyB9CiAgICAgdmlydHVhbCB+QXVkaW9UcmFja0NsaWVudFByb3h5KCkgeyB9CiAKICAgICAvLyBObyBiYXJyaWVycyBvbiB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbnMsIHNvIHRoZSBvcmRlcmluZyBvZiBsb2Fkcy9zdG9yZXMKQEAgLTI5MSw2ICszMzksMTAgQEAKICAgICAgICAgbUNibGstPm1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKICAgICB9CiAKKyAgICB2b2lkICAgICAgICBzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUmIHBsYXliYWNrUmF0ZSkgeworICAgICAgICBtUGxheWJhY2tSYXRlTXV0YXRvci5wdXNoKHBsYXliYWNrUmF0ZSk7CisgICAgfQorCiAgICAgdmlydHVhbCB2b2lkIGZsdXNoKCk7CiAKICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIGdldFVuZGVycnVuRnJhbWVzKCkgY29uc3QgewpAQCAtMzAyLDYgKzM1NCw5IEBACiAgICAgYm9vbCAgICAgICAgZ2V0U3RyZWFtRW5kRG9uZSgpIGNvbnN0OwogCiAgICAgc3RhdHVzX3QgICAgd2FpdFN0cmVhbUVuZERvbmUoY29uc3Qgc3RydWN0IHRpbWVzcGVjICpyZXF1ZXN0ZWQpOworCitwcml2YXRlOgorICAgIFBsYXliYWNrUmF0ZVF1ZXVlOjpNdXRhdG9yICAgbVBsYXliYWNrUmF0ZU11dGF0b3I7CiB9OwogCiBjbGFzcyBTdGF0aWNBdWRpb1RyYWNrQ2xpZW50UHJveHkgOiBwdWJsaWMgQXVkaW9UcmFja0NsaWVudFByb3h5IHsKQEAgLTMxMyw4ICszNjgsMjggQEAKICAgICB2aXJ0dWFsIHZvaWQgICAgZmx1c2goKTsKIAogI2RlZmluZSBNSU5fTE9PUCAgICAxNiAgLy8gbWluaW11bSBsZW5ndGggb2YgZWFjaCBsb29wIGl0ZXJhdGlvbiBpbiBmcmFtZXMKKworICAgICAgICAgICAgLy8gc2V0TG9vcCgpLCBzZXRCdWZmZXJQb3NpdGlvbigpLCBhbmQgc2V0QnVmZmVyUG9zaXRpb25BbmRMb29wKCkgc2V0IHRoZQorICAgICAgICAgICAgLy8gc3RhdGljIGJ1ZmZlciBwb3NpdGlvbiBhbmQgbG9vcGluZyBwYXJhbWV0ZXJzLiAgVGhlc2UgY29tbWFuZHMgYXJlIG5vdAorICAgICAgICAgICAgLy8gc3luY2hyb25vdXMgKHRoZXkgZG8gbm90IHdhaXQgb3IgYmxvY2spOyBpbnN0ZWFkIHRoZXkgdGFrZSBlZmZlY3QgYXQgdGhlCisgICAgICAgICAgICAvLyBuZXh0IGJ1ZmZlciBkYXRhIHJlYWQgZnJvbSB0aGUgc2VydmVyIHNpZGUuIEhvd2V2ZXIsIHRoZSBjbGllbnQgc2lkZQorICAgICAgICAgICAgLy8gZ2V0dGVycyB3aWxsIHJlYWQgYSBjYWNoZWQgdmVyc2lvbiBvZiB0aGUgcG9zaXRpb24gYW5kIGxvb3AgdmFyaWFibGVzCisgICAgICAgICAgICAvLyB1bnRpbCB0aGUgc2V0dGluZyB0YWtlcyBlZmZlY3QuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gc2V0QnVmZmVyUG9zaXRpb25BbmRMb29wKCkgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nLCBpbiBvcmRlciwgc2V0TG9vcCgpIGFuZAorICAgICAgICAgICAgLy8gc2V0QnVmZmVyUG9zaXRpb24oKS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUaGUgZnVuY3Rpb25zIHNob3VsZCBub3QgYmUgcmVsaWVkIHVwb24gdG8gZG8gcGFyYW1ldGVyIG9yIHN0YXRlIGNoZWNraW5nLgorICAgICAgICAgICAgLy8gVGhhdCBpcyBkb25lIGF0IHRoZSBBdWRpb1RyYWNrIGxldmVsLgorCiAgICAgICAgICAgICB2b2lkICAgIHNldExvb3Aoc2l6ZV90IGxvb3BTdGFydCwgc2l6ZV90IGxvb3BFbmQsIGludCBsb29wQ291bnQpOworICAgICAgICAgICAgdm9pZCAgICBzZXRCdWZmZXJQb3NpdGlvbihzaXplX3QgcG9zaXRpb24pOworICAgICAgICAgICAgdm9pZCAgICBzZXRCdWZmZXJQb3NpdGlvbkFuZExvb3Aoc2l6ZV90IHBvc2l0aW9uLCBzaXplX3QgbG9vcFN0YXJ0LCBzaXplX3QgbG9vcEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb29wQ291bnQpOwogICAgICAgICAgICAgc2l6ZV90ICBnZXRCdWZmZXJQb3NpdGlvbigpOworICAgICAgICAgICAgICAgICAgICAvLyBnZXRCdWZmZXJQb3NpdGlvbkFuZExvb3BDb3VudCgpIHByb3ZpZGVzIHRoZSBwcm9wZXIgc25hcHNob3Qgb2YKKyAgICAgICAgICAgICAgICAgICAgLy8gcG9zaXRpb24gYW5kIGxvb3BDb3VudCB0b2dldGhlci4KKyAgICAgICAgICAgIHZvaWQgICAgZ2V0QnVmZmVyUG9zaXRpb25BbmRMb29wQ291bnQoc2l6ZV90ICpwb3NpdGlvbiwgaW50ICpsb29wQ291bnQpOwogCiAgICAgdmlydHVhbCBzaXplX3QgIGdldE1pc2FsaWdubWVudCgpIHsKICAgICAgICAgcmV0dXJuIDA7CkBAIC0zMjYsNyArNDAxLDkgQEAKIAogcHJpdmF0ZToKICAgICBTdGF0aWNBdWRpb1RyYWNrU2luZ2xlU3RhdGVRdWV1ZTo6TXV0YXRvciAgIG1NdXRhdG9yOwotICAgIHNpemVfdCAgICAgICAgICBtQnVmZmVyUG9zaXRpb247ICAgIC8vIHNvIHRoYXQgZ2V0QnVmZmVyUG9zaXRpb24oKSBhcHBlYXJzIHRvIGJlIHN5bmNocm9ub3VzCisgICAgU3RhdGljQXVkaW9UcmFja1Bvc0xvb3BRdWV1ZTo6T2JzZXJ2ZXIgICAgICBtUG9zTG9vcE9ic2VydmVyOworICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGljQXVkaW9UcmFja1N0YXRlICAgbVN0YXRlOyAgIC8vIGxhc3QgY29tbXVuaWNhdGVkIHN0YXRlIHRvIHNlcnZlcgorICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGljQXVkaW9UcmFja1Bvc0xvb3AgbVBvc0xvb3A7IC8vIHNuYXBzaG90IG9mIHBvc2l0aW9uIGFuZCBsb29wLgogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzk0LDggKzQ3MSwxMCBAQAogcHVibGljOgogICAgIEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eShhdWRpb190cmFja19jYmxrX3QqIGNibGssIHZvaWQgKmJ1ZmZlcnMsIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgc2l6ZV90IGZyYW1lU2l6ZSwgYm9vbCBjbGllbnRJblNlcnZlciA9IGZhbHNlLCB1aW50MzJfdCBzYW1wbGVSYXRlID0gMCkKLSAgICAgICAgOiBTZXJ2ZXJQcm94eShjYmxrLCBidWZmZXJzLCBmcmFtZUNvdW50LCBmcmFtZVNpemUsIHRydWUgLyppc091dCovLCBjbGllbnRJblNlcnZlcikgeworICAgICAgICA6IFNlcnZlclByb3h5KGNibGssIGJ1ZmZlcnMsIGZyYW1lQ291bnQsIGZyYW1lU2l6ZSwgdHJ1ZSAvKmlzT3V0Ki8sIGNsaWVudEluU2VydmVyKSwKKyAgICAgICAgICBtUGxheWJhY2tSYXRlT2JzZXJ2ZXIoJmNibGstPm1QbGF5YmFja1JhdGVRdWV1ZSkgewogICAgICAgICBtQ2Jsay0+bVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworICAgICAgICBtUGxheWJhY2tSYXRlID0gQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUOwogICAgIH0KIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BdWRpb1RyYWNrU2VydmVyUHJveHkoKSB7IH0KQEAgLTQyOSw2ICs1MDgsMTMgQEAKIAogICAgIC8vIFJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGZyYW1lcyB0aGF0IEF1ZGlvRmxpbmdlciBoYXMgb2J0YWluZWQgYW5kIHJlbGVhc2VkCiAgICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZXNSZWxlYXNlZCgpIGNvbnN0IHsgcmV0dXJuIG1DYmxrLT5tU2VydmVyOyB9CisKKyAgICAvLyBSZXR1cm4gdGhlIHBsYXliYWNrIHNwZWVkIGFuZCBwaXRjaCByZWFkIGF0b21pY2FsbHkuIE5vdCBtdWx0aS10aHJlYWQgc2FmZSBvbiBzZXJ2ZXIgc2lkZS4KKyAgICBBdWRpb1BsYXliYWNrUmF0ZSBnZXRQbGF5YmFja1JhdGUoKTsKKworcHJpdmF0ZToKKyAgICBBdWRpb1BsYXliYWNrUmF0ZSAgICAgICAgICAgICBtUGxheWJhY2tSYXRlOyAgLy8gbGFzdCBvYnNlcnZlZCBwbGF5YmFjayByYXRlCisgICAgUGxheWJhY2tSYXRlUXVldWU6Ok9ic2VydmVyICAgbVBsYXliYWNrUmF0ZU9ic2VydmVyOwogfTsKIAogY2xhc3MgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5IDogcHVibGljIEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eSB7CkBAIC00NDcsMTAgKzUzMywxMyBAQAogICAgIHZpcnR1YWwgdWludDMyX3QgICAgZ2V0VW5kZXJydW5GcmFtZXMoKSBjb25zdCB7IHJldHVybiAwOyB9CiAKIHByaXZhdGU6CisgICAgc3RhdHVzX3QgICAgICAgICAgICB1cGRhdGVTdGF0ZVdpdGhMb29wKFN0YXRpY0F1ZGlvVHJhY2tTdGF0ZSAqbG9jYWxTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdGljQXVkaW9UcmFja1N0YXRlICZ1cGRhdGUpIGNvbnN0OworICAgIHN0YXR1c190ICAgICAgICAgICAgdXBkYXRlU3RhdGVXaXRoUG9zaXRpb24oU3RhdGljQXVkaW9UcmFja1N0YXRlICpsb2NhbFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdGljQXVkaW9UcmFja1N0YXRlICZ1cGRhdGUpIGNvbnN0OwogICAgIHNzaXplX3QgICAgICAgICAgICAgcG9sbFBvc2l0aW9uKCk7IC8vIHBvbGwgZm9yIHN0YXRlIHF1ZXVlIHVwZGF0ZSwgYW5kIHJldHVybiBjdXJyZW50IHBvc2l0aW9uCiAgICAgU3RhdGljQXVkaW9UcmFja1NpbmdsZVN0YXRlUXVldWU6Ok9ic2VydmVyICBtT2JzZXJ2ZXI7Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICBtUG9zaXRpb247ICAvLyBzZXJ2ZXIncyBjdXJyZW50IHBsYXkgcG9zaXRpb24gaW4gZnJhbWVzLCByZWxhdGl2ZSB0byAwCi0KKyAgICBTdGF0aWNBdWRpb1RyYWNrUG9zTG9vcFF1ZXVlOjpNdXRhdG9yICAgICAgIG1Qb3NMb29wTXV0YXRvcjsKICAgICBzaXplX3QgICAgICAgICAgICAgIG1GcmFtZXNSZWFkeVNhZmU7IC8vIEFzc3VtaW5nIHNpemVfdCByZWFkL3dyaXRlcyBhcmUgYXRvbWljIG9uIDMyIC8gNjQgYml0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzb3JzLCB0aGlzIGlzIGEgdGhyZWFkLXNhZmUgdmVyc2lvbiBvZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUZyYW1lc1JlYWR5LgpAQCAtNDU5LDcgKzU0OCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4gY2F1c2UgYSB0cmFjayB0byBhcHBlYXIgdG8gaGF2ZSBhIGxhcmdlIG51bWJlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgZnJhbWVzLiBJTlQ2NF9NQVggbWVhbnMgYW4gaW5maW5pdGUgbG9vcC4KICAgICBib29sICAgICAgICAgICAgICAgIG1GcmFtZXNSZWFkeUlzQ2FsbGVkQnlNdWx0aXBsZVRocmVhZHM7Ci0gICAgU3RhdGljQXVkaW9UcmFja1N0YXRlICAgbVN0YXRlOworICAgIFN0YXRpY0F1ZGlvVHJhY2tTdGF0ZSBtU3RhdGU7ICAgICAgICAgLy8gU2VydmVyIHNpZGUgc3RhdGUuIEFueSB1cGRhdGVzIGZyb20gY2xpZW50IG11c3QgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3NlZCBieSB0aGUgbU9ic2VydmVyIFNpbmdsZVN0YXRlUXVldWUuCiB9OwogCiAvLyBQcm94eSB1c2VkIGJ5IEF1ZGlvRmxpbmdlciBmb3Igc2VydmljaW5nIEF1ZGlvUmVjb3JkCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvU3RhdGljQXVkaW9UcmFja1N0YXRlLmggYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvU3RhdGljQXVkaW9UcmFja1N0YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ODMwNjEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL1N0YXRpY0F1ZGlvVHJhY2tTdGF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgU1RBVElDX0FVRElPX1RSQUNLX1NUQVRFX0gKLSNkZWZpbmUgU1RBVElDX0FVRElPX1RSQUNLX1NUQVRFX0gKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBSZXByZXNlbnRzIGEgc2luZ2xlIHN0YXRlIG9mIGFuIEF1ZGlvVHJhY2sgdGhhdCB3YXMgY3JlYXRlZCBpbiBzdGF0aWMgbW9kZSAoc2hhcmVkIG1lbW9yeSBidWZmZXIKLS8vIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQpLiAgVGhpcyBzdGF0ZSBuZWVkcyB0byBiZSBjb21tdW5pY2F0ZWQgZnJvbSB0aGUgY2xpZW50IHRvIHNlcnZlci4gIEFzIHRoaXMKLS8vIHN0YXRlIGlzIHRvbyBsYXJnZSB0byBiZSB1cGRhdGVkIGF0b21pY2FsbHkgd2l0aG91dCBhIG11dGV4LCBhbmQgbXV0ZXhlcyBhcmVuJ3QgYWxsb3dlZCBoZXJlLCB0aGUKLS8vIHN0YXRlIGlzIHdyYXBwZWQgYnkgYSBTaW5nbGVTdGF0ZVF1ZXVlLgotc3RydWN0IFN0YXRpY0F1ZGlvVHJhY2tTdGF0ZSB7Ci0gICAgLy8gZG8gbm90IGRlZmluZSBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzLCBvciB2aXJ0dWFsIG1ldGhvZHMKLQotICAgIC8vIFRoZXNlIGZpZWxkcyBzaG91bGQgYm90aCBiZSBzaXplX3QsIGJ1dCBzaW5jZSB0aGV5IGFyZSBsb2NhdGVkIGluIHNoYXJlZCBtZW1vcnkgd2UKLSAgICAvLyBmb3JjZSB0byAzMi1iaXQuICBUaGUgY2xpZW50IGFuZCBzZXJ2ZXIgbWF5IGhhdmUgZGlmZmVyZW50IHR5cGVkZWZzIGZvciBzaXplX3QuCi0gICAgdWludDMyX3QgICAgbUxvb3BTdGFydDsKLSAgICB1aW50MzJfdCAgICBtTG9vcEVuZDsKLQotICAgIGludCAgICAgICAgIG1Mb29wQ291bnQ7Ci19OwotCi19ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBTVEFUSUNfQVVESU9fVFJBQ0tfU1RBVEVfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yYWRpby9JUmFkaW8uaCBiL2luY2x1ZGUvcmFkaW8vSVJhZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg3N2Y4ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcmFkaW8vSVJhZGlvLmgKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9JUkFESU9fSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0lSQURJT19ICisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJUmFkaW8gOiBwdWJsaWMgSUludGVyZmFjZQoreworcHVibGljOgorCisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShSYWRpbyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDb25maWd1cmF0aW9uKGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldENvbmZpZ3VyYXRpb24oc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TXV0ZShib29sIG11dGUpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TXV0ZShib29sICptdXRlKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHR1bmUodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBzdWJDaGFubmVsKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNhbmNlbCgpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvZ3JhbUluZm9ybWF0aW9uKHN0cnVjdCByYWRpb19wcm9ncmFtX2luZm8gKmluZm8pID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFzQ29udHJvbChib29sICpoYXNDb250cm9sKSA9IDA7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEJuUmFkaW86IHB1YmxpYyBCbkludGVyZmFjZTxJUmFkaW8+Cit7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy9BTkRST0lEX0hBUkRXQVJFX0lSQURJT19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3JhZGlvL0lSYWRpb0NsaWVudC5oIGIvaW5jbHVkZS9yYWRpby9JUmFkaW9DbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDYyYWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9yYWRpby9JUmFkaW9DbGllbnQuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0lSQURJT19DTElFTlRfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0lSQURJT19DTElFTlRfSAorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSVJhZGlvQ2xpZW50IDogcHVibGljIElJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKworICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoUmFkaW9DbGllbnQpOworCisgICAgdmlydHVhbCB2b2lkIG9uRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KSA9IDA7CisKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQm5SYWRpb0NsaWVudCA6IHB1YmxpYyBCbkludGVyZmFjZTxJUmFkaW9DbGllbnQ+Cit7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy9BTkRST0lEX0hBUkRXQVJFX0lSQURJT19DTElFTlRfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yYWRpby9JUmFkaW9TZXJ2aWNlLmggYi9pbmNsdWRlL3JhZGlvL0lSYWRpb1NlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTQ2ZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9yYWRpby9JUmFkaW9TZXJ2aWNlLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9JUkFESU9fU0VSVklDRV9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfSVJBRElPX1NFUlZJQ0VfSAorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPHN5c3RlbS9yYWRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIElSYWRpbzsKK2NsYXNzIElSYWRpb0NsaWVudDsKKworY2xhc3MgSVJhZGlvU2VydmljZSA6IHB1YmxpYyBJSW50ZXJmYWNlCit7CitwdWJsaWM6CisKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKFJhZGlvU2VydmljZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RNb2R1bGVzKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYXR0YWNoKGNvbnN0IHJhZGlvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJUmFkaW9DbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3aXRoQXVkaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVJhZGlvPiYgcmFkaW8pID0gMDsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQm5SYWRpb1NlcnZpY2U6IHB1YmxpYyBCbkludGVyZmFjZTxJUmFkaW9TZXJ2aWNlPgoreworcHVibGljOgorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vQU5EUk9JRF9IQVJEV0FSRV9JUkFESU9fU0VSVklDRV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3JhZGlvL1JhZGlvLmggYi9pbmNsdWRlL3JhZGlvL1JhZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAyYmYxNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcmFkaW8vUmFkaW8uaApAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19ICisKKyNpbmNsdWRlIDxiaW5kZXIvSUJpbmRlci5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDxyYWRpby9SYWRpb0NhbGxiYWNrLmg+CisjaW5jbHVkZSA8cmFkaW8vSVJhZGlvLmg+CisjaW5jbHVkZSA8cmFkaW8vSVJhZGlvU2VydmljZS5oPgorI2luY2x1ZGUgPHJhZGlvL0lSYWRpb0NsaWVudC5oPgorI2luY2x1ZGUgPHN5c3RlbS9yYWRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lbW9yeURlYWxlcjsKKworY2xhc3MgUmFkaW8gOiBwdWJsaWMgQm5SYWRpb0NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAoreworcHVibGljOgorCisgICAgdmlydHVhbCB+UmFkaW8oKTsKKworICAgIHN0YXRpYyAgc3RhdHVzX3QgbGlzdE1vZHVsZXMoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgKnByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcyk7CisgICAgc3RhdGljICBzcDxSYWRpbz4gYXR0YWNoKHJhZGlvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd2l0aEF1ZGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxSYWRpb0NhbGxiYWNrPiYgY2FsbGJhY2spOworCisKKyAgICAgICAgICAgIHZvaWQgZGV0YWNoKCk7CisKKyAgICAgICAgICAgIHN0YXR1c190IHNldENvbmZpZ3VyYXRpb24oY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpOworCisgICAgICAgICAgICBzdGF0dXNfdCBnZXRDb25maWd1cmF0aW9uKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKTsKKworICAgICAgICAgICAgc3RhdHVzX3Qgc2V0TXV0ZShib29sIG11dGUpOworCisgICAgICAgICAgICBzdGF0dXNfdCBnZXRNdXRlKGJvb2wgKm11dGUpOworCisgICAgICAgICAgICBzdGF0dXNfdCBzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViQ2hhbm5lbCk7CisKKyAgICAgICAgICAgIHN0YXR1c190IHNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKTsKKworICAgICAgICAgICAgc3RhdHVzX3QgdHVuZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHN1YkNoYW5uZWwpOworCisgICAgICAgICAgICBzdGF0dXNfdCBjYW5jZWwoKTsKKworICAgICAgICAgICAgc3RhdHVzX3QgZ2V0UHJvZ3JhbUluZm9ybWF0aW9uKHN0cnVjdCByYWRpb19wcm9ncmFtX2luZm8gKmluZm8pOworCisgICAgICAgICAgICBzdGF0dXNfdCBoYXNDb250cm9sKGJvb2wgKmhhc0NvbnRyb2wpOworCisgICAgICAgICAgICAvLyBCcFJhZGlvQ2xpZW50CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgb25FdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpOworCisgICAgICAgICAgICAvL0lCaW5kZXI6OkRlYXRoUmVjaXBpZW50CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKTsKKworcHJpdmF0ZToKKyAgICAgICAgICAgIFJhZGlvKHJhZGlvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxSYWRpb0NhbGxiYWNrPiYpOworICAgICAgICAgICAgc3RhdGljIGNvbnN0IHNwPElSYWRpb1NlcnZpY2U+JiBnZXRSYWRpb1NlcnZpY2UoKTsKKworICAgICAgICAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgbUxvY2s7CisgICAgICAgICAgICBzcDxJUmFkaW8+ICAgICAgICAgICAgICBtSVJhZGlvOworICAgICAgICAgICAgY29uc3QgcmFkaW9faGFuZGxlX3QgICAgbUhhbmRsZTsKKyAgICAgICAgICAgIHNwPFJhZGlvQ2FsbGJhY2s+ICAgICAgIG1DYWxsYmFjazsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfUkFESU9fSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yYWRpby9SYWRpb0NhbGxiYWNrLmggYi9pbmNsdWRlL3JhZGlvL1JhZGlvQ2FsbGJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTdmMWE2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9yYWRpby9SYWRpb0NhbGxiYWNrLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19DQUxMQkFDS19ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfUkFESU9fQ0FMTEJBQ0tfSAorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9yYWRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFJhZGlvQ2FsbGJhY2sgOiBwdWJsaWMgUmVmQmFzZQoreworcHVibGljOgorCisgICAgICAgICAgICBSYWRpb0NhbGxiYWNrKCkge30KKyAgICB2aXJ0dWFsIH5SYWRpb0NhbGxiYWNrKCkge30KKworICAgIHZpcnR1YWwgdm9pZCBvbkV2ZW50KHN0cnVjdCByYWRpb19ldmVudCAqZXZlbnQpID0gMDsKKworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vQU5EUk9JRF9IQVJEV0FSRV9SQURJT19DQUxMQkFDS19ICmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRG5nVXRpbHMuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9EbmdVdGlscy5oCmluZGV4IDQzODliMDIuLjNkY2VkYzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9EbmdVdGlscy5oCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9EbmdVdGlscy5oCkBAIC0zMSw2ICszMSw3IEBACiBuYW1lc3BhY2UgaW1nX3V0aWxzIHsKIAogI2RlZmluZSBORUxFTVMoeCkgKChpbnQpIChzaXplb2YoeCkgLyBzaXplb2YoKHgpWzBdKSkpCisjZGVmaW5lIENMQU1QKHgsIGxvdywgaGlnaCkgKCgoeCkgPiAoaGlnaCkpID8gKGhpZ2gpIDogKCgoeCkgPCAobG93KSkgPyAobG93KSA6ICh4KSkpCiAKIC8qKgogICogVXRpbGl0eSBjbGFzcyBmb3IgYnVpbGRpbmcgdmFsdWVzIGZvciB0aGUgT3Bjb2RlTGlzdCB0YWdzIHNwZWNpZmllZApAQCAtMTA3LDEzICsxMDgsNDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1hcFBsYW5lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBtYXBHYWlucyk7CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBXYXJwUmVjdGlsaW5lYXIgb3Bjb2RlIGZvciB0aGUgZ2l2ZW4gbWV0YWRhdGEgcGFyYW1ldGVycy4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFdhcnBSZWN0aWxpbmVhckZvck1ldGFkYXRhKGNvbnN0IGZsb2F0KiBrQ29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFycmF5V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJyYXlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgb3B0aWNhbENlbnRlclgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgb3B0aWNhbENlbnRlclkpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgYSBXYXJwUmVjdGlsaW5lYXIgb3Bjb2RlLgorICAgICAgICAgKgorICAgICAgICAgKiBudW1QbGFuZXMgLSBOdW1iZXIgb2YgcGxhbmVzIGluY2x1ZGVkIGluIHRoaXMgb3Bjb2RlLgorICAgICAgICAgKiBvcHRpY2FsQ2VudGVyWCwgb3B0aWNhbENlbnRlclkgLSBOb3JtYWxpemVkIHgseSBjb29yZGluYXRlcyBvZiB0aGUgc2Vuc29yIG9wdGljYWwKKyAgICAgICAgICogICAgICAgICAgY2VudGVyIHJlbGF0aXZlIHRvIHRoZSB0b3AsbGVmdCBwaXhlbCBvZiB0aGUgcHJvZHVjZWQgaW1hZ2VzIChlLmcuIFswLjUsIDAuNV0KKyAgICAgICAgICogICAgICAgICAgZ2l2ZXMgYSBzZW5zb3Igb3B0aWNhbCBjZW50ZXIgaW4gdGhlIGltYWdlIGNlbnRlci4KKyAgICAgICAgICoga0NvZWZmcyAtIEEgbGlzdCBvZiBjb2VmZmljaWVudHMgZm9yIHRoZSBwb2x5bm9taWFsIGVxdWF0aW9uIHJlcHJlc2VudGluZyB0aGUgZGlzdG9ydGlvbgorICAgICAgICAgKiAgICAgICAgICBjb3JyZWN0aW9uLiAgRm9yIGVhY2ggcGxhbmUsIDYgY29lZmZpY2llbnRzIG11c3QgYmUgaW5jbHVkZWQ6CisgICAgICAgICAqICAgICAgICAgIHtrX3IwLCBrX3IxLCBrX3IyLCBrX3IzLCBrX3QwLCBrX3QxfS4gIFNlZSB0aGUgRE5HIDEuNCBzcGVjaWZpY2F0aW9uIGZvciBhbgorICAgICAgICAgKiAgICAgICAgICBvdXRsaW5lIG9mIHRoZSBwb2x5bm9taWFsIHVzZWQgaGVyZS4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFdhcnBSZWN0aWxpbmVhcih1aW50MzJfdCBudW1QbGFuZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBvcHRpY2FsQ2VudGVyWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG9wdGljYWxDZW50ZXJZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGtDb2VmZnMpOworCiAgICAgICAgIC8vIFRPRE86IEFkZCBvdGhlciBPcGNvZGUgbWV0aG9kcwogICAgIHByb3RlY3RlZDoKICAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IEZMQUdfT1BUSU9OQUwgPSAweDF1OwogICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgRkxBR19PUFRJT05BTF9GT1JfUFJFVklFVyA9IDB4MnU7CiAKKyAgICAgICAgLy8gT3Bjb2RlIElEcwogICAgICAgICBlbnVtIHsKKyAgICAgICAgICAgIFdBUlBfUkVDVElMSU5FQVJfSUQgPSAxLAogICAgICAgICAgICAgR0FJTl9NQVBfSUQgPSA5LAorICAgICAgICB9OworCisgICAgICAgIC8vIExTTSBtb3NhaWMgaW5kaWNlcworICAgICAgICBlbnVtIHsKICAgICAgICAgICAgIExTTV9SX0lORCA9IDAsCiAgICAgICAgICAgICBMU01fR0VfSU5EID0gMSwKICAgICAgICAgICAgIExTTV9HT19JTkQgPSAyLApkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9EbmdVdGlscy5jcHAgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0RuZ1V0aWxzLmNwcAppbmRleCBkM2I0YTM1Li5iMjEzNDAzIDEwMDY0NAotLS0gYS9tZWRpYS9pbWdfdXRpbHMvc3JjL0RuZ1V0aWxzLmNwcAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0RuZ1V0aWxzLmNwcApAQCAtMTYsNiArMTYsMTAgQEAKIAogI2luY2x1ZGUgPGltZ191dGlscy9EbmdVdGlscy5oPgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPG1hdGguaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGltZ191dGlscyB7CiAKQEAgLTIyOSw3ICsyMzMsNyBAQAogICAgIGVyciA9IG1FbmRpYW5PdXQud3JpdGUodmVyc2lvbiwgMCwgTkVMRU1TKHZlcnNpb24pKTsKICAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOwogCi0gICAgLy8gRG8gbm90IGluY2x1ZGUgb3B0aW9uYWwgZmxhZyBmb3IgcHJldmlldywgYXMgdGhpcyBjYW4gaGF2ZSBhIGxhcmdlIGVmZmVjdCBvbiB0aGUgb3V0cHV0LgorICAgIC8vIEFsbG93IHRoaXMgb3Bjb2RlIHRvIGJlIHNraXBwZWQgaWYgbm90IHN1cHBvcnRlZAogICAgIHVpbnQzMl90IGZsYWdzID0gRkxBR19PUFRJT05BTDsKIAogICAgIGVyciA9IG1FbmRpYW5PdXQud3JpdGUoJmZsYWdzLCAwLCAxKTsKQEAgLTI3OCw1ICsyODIsOTYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IE9wY29kZUxpc3RCdWlsZGVyOjphZGRXYXJwUmVjdGlsaW5lYXJGb3JNZXRhZGF0YShjb25zdCBmbG9hdCoga0NvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcnJheVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFycmF5SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG9wdGljYWxDZW50ZXJYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG9wdGljYWxDZW50ZXJZKSB7CisgICAgaWYgKGFjdGl2ZUFycmF5V2lkdGggPD0gMSB8fCBhY3RpdmVBcnJheUhlaWdodCA8PSAxKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGFkZCBvcGNvZGUgZm9yIGFjdGl2ZSBhcnJheSB3aXRoIGRpbWVuc2lvbnMgdz0lIiBQUkl1MzIgIiwgaD0lIiBQUkl1MzIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBhY3RpdmVBcnJheVdpZHRoLCBhY3RpdmVBcnJheUhlaWdodCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgZG91YmxlIG5vcm1hbGl6ZWRPQ1ggPSBvcHRpY2FsQ2VudGVyWCAvIHN0YXRpY19jYXN0PGRvdWJsZT4oYWN0aXZlQXJyYXlXaWR0aCAtIDEpOworICAgIGRvdWJsZSBub3JtYWxpemVkT0NZID0gb3B0aWNhbENlbnRlclkgLyBzdGF0aWNfY2FzdDxkb3VibGU+KGFjdGl2ZUFycmF5SGVpZ2h0IC0gMSk7CisKKyAgICBub3JtYWxpemVkT0NYID0gQ0xBTVAobm9ybWFsaXplZE9DWCwgMCwgMSk7CisgICAgbm9ybWFsaXplZE9DWSA9IENMQU1QKG5vcm1hbGl6ZWRPQ1ksIDAsIDEpOworCisgICAgLy8gQ29udmVyc2lvbiBmYWN0b3JzIGZyb20gQ2FtZXJhMiBLIGZhY3RvcnMgdG8gRE5HIHNwZWMuIEsgZmFjdG9yczoKKyAgICAvLworICAgIC8vICAgICAgTm90ZTogdGhlc2UgYXJlIG5lY2Vzc2FyeSBiZWNhdXNlIG91ciB1bml0IHN5c3RlbSBhc3N1bWVzIGEKKyAgICAvLyAgICAgIG5vcm1hbGl6ZWQgbWF4IHJhZGl1cyBvZiBzcXJ0KDIpLCB3aGVyZWFzIHRoZSBETkcgc3BlYydzCisgICAgLy8gICAgICBXYXJwUmVjdGlsaW5lYXIgb3Bjb2RlIGFzc3VtZXMgYSBub3JtYWxpemVkIG1heCByYWRpdXMgb2YgMS4KKyAgICAvLyAgICAgIFRodXMsIGVhY2ggSyBjb2VmZmljaWVudCBtdXN0IGluY2x1ZGUgdGhlIGRvbWFpbiBzY2FsaW5nCisgICAgLy8gICAgICBmYWN0b3IgKHRoZSBETkcgZG9tYWluIGlzIHNjYWxlZCBieSBzcXJ0KDIpIHRvIGVtdWxhdGUgdGhlCisgICAgLy8gICAgICBkb21haW4gdXNlZCBieSB0aGUgQ2FtZXJhMiBzcGVjaWZpY2F0aW9uKS4KKworICAgIGNvbnN0IGRvdWJsZSBjXzAgPSBzcXJ0KDIpOworICAgIGNvbnN0IGRvdWJsZSBjXzEgPSAyICogc3FydCgyKTsKKyAgICBjb25zdCBkb3VibGUgY18yID0gNCAqIHNxcnQoMik7CisgICAgY29uc3QgZG91YmxlIGNfMyA9IDggKiBzcXJ0KDIpOworICAgIGNvbnN0IGRvdWJsZSBjXzQgPSAyOworICAgIGNvbnN0IGRvdWJsZSBjXzUgPSAyOworCisgICAgY29uc3QgZG91YmxlIGNvZWZmc1tdID0geyBjXzAgKiBrQ29lZmZzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY18xICoga0NvZWZmc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfMiAqIGtDb2VmZnNbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjXzMgKiBrQ29lZmZzWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY180ICoga0NvZWZmc1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfNSAqIGtDb2VmZnNbNV0gfTsKKworCisgICAgcmV0dXJuIGFkZFdhcnBSZWN0aWxpbmVhcigvKm51bVBsYW5lcyovMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3B0aWNhbENlbnRlclgqL25vcm1hbGl6ZWRPQ1gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9wdGljYWxDZW50ZXJZKi9ub3JtYWxpemVkT0NZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmZzKTsKK30KKworc3RhdHVzX3QgT3Bjb2RlTGlzdEJ1aWxkZXI6OmFkZFdhcnBSZWN0aWxpbmVhcih1aW50MzJfdCBudW1QbGFuZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBvcHRpY2FsQ2VudGVyWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG9wdGljYWxDZW50ZXJZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGtDb2VmZnMpIHsKKworICAgIHVpbnQzMl90IG9wY29kZUlkID0gV0FSUF9SRUNUSUxJTkVBUl9JRDsKKworICAgIHN0YXR1c190IGVyciA9IG1FbmRpYW5PdXQud3JpdGUoJm9wY29kZUlkLCAwLCAxKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgdWludDhfdCB2ZXJzaW9uW10gPSB7MSwgMywgMCwgMH07CisgICAgZXJyID0gbUVuZGlhbk91dC53cml0ZSh2ZXJzaW9uLCAwLCBORUxFTVModmVyc2lvbikpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICAvLyBBbGxvdyB0aGlzIG9wY29kZSB0byBiZSBza2lwcGVkIGlmIG5vdCBzdXBwb3J0ZWQKKyAgICB1aW50MzJfdCBmbGFncyA9IEZMQUdfT1BUSU9OQUw7CisKKyAgICBlcnIgPSBtRW5kaWFuT3V0LndyaXRlKCZmbGFncywgMCwgMSk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGNvbnN0IHVpbnQzMl90IE5VTUJFUl9DRU5URVJfQVJHUyA9IDI7CisgICAgY29uc3QgdWludDMyX3QgTlVNQkVSX0NPRUZGUyA9IG51bVBsYW5lcyAqIDY7CisgICAgdWludDMyX3QgdG90YWxTaXplID0gKE5VTUJFUl9DRU5URVJfQVJHUyArIE5VTUJFUl9DT0VGRlMpICogc2l6ZW9mKGRvdWJsZSkgKyBzaXplb2YodWludDMyX3QpOworCisgICAgZXJyID0gbUVuZGlhbk91dC53cml0ZSgmdG90YWxTaXplLCAwLCAxKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gbUVuZGlhbk91dC53cml0ZSgmbnVtUGxhbmVzLCAwLCAxKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gbUVuZGlhbk91dC53cml0ZShrQ29lZmZzLCAwLCBOVU1CRVJfQ09FRkZTKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gbUVuZGlhbk91dC53cml0ZSgmb3B0aWNhbENlbnRlclgsIDAsIDEpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBtRW5kaWFuT3V0LndyaXRlKCZvcHRpY2FsQ2VudGVyWSwgMCwgMSk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIG1Db3VudCsrOworCisgICAgcmV0dXJuIE9LOworfQorCiB9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCiB9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmMgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYwppbmRleCA2ZDMwZDY0Li5kYjc4NjVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYwpAQCAtMjQsMTAgKzI0LDEyIEBACiAKICNpbmNsdWRlIDxjdXRpbHMvbWlzYy5oPgogI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvYXVkaW9fZWZmZWN0c19jb25mLmg+CiAKIHN0YXRpYyBsaXN0X2VsZW1fdCAqZ0VmZmVjdExpc3Q7IC8vIGxpc3Qgb2YgZWZmZWN0X2VudHJ5X3Q6IGFsbCBjdXJyZW50bHkgY3JlYXRlZCBlZmZlY3RzCiBzdGF0aWMgbGlzdF9lbGVtX3QgKmdMaWJyYXJ5TGlzdDsgLy8gbGlzdCBvZiBsaWJfZW50cnlfdDogYWxsIGN1cnJlbnRseSBsb2FkZWQgbGlicmFyaWVzCitzdGF0aWMgbGlzdF9lbGVtX3QgKmdTa2lwcGVkRWZmZWN0czsgLy8gbGlzdCBvZiBlZmZlY3RzIHNraXBwZWQgYmVjYXVzZSBvZiBkdXBsaWNhdGUgdXVpZAogLy8gbGlzdCBvZiBlZmZlY3RfZGVzY3JpcHRvciBhbmQgbGlzdCBvZiBzdWIgZWZmZWN0cyA6IGFsbCBjdXJyZW50bHkgbG9hZGVkCiAvLyBJdCBkb2VzIG5vdCBjb250YWluIGVmZmVjdHMgd2l0aG91dCBzdWIgZWZmZWN0cy4KIHN0YXRpYyBsaXN0X3N1Yl9lbGVtX3QgKmdTdWJFZmZlY3RMaXN0OwpAQCAtNjMsMTAgKzY1LDEwIEBACiAgICAgICAgICAgICAgICBsaWJfZW50cnlfdCAqKmxpYiwKICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKipkZXNjKTsKIC8vIFRvIHNlYXJjaCBhIHN1YmVmZmVjdCBpbiB0aGUgZ1N1YkVmZmVjdExpc3QKLWludCBmaW5kU3ViRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCitzdGF0aWMgaW50IGZpbmRTdWJFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKICAgICAgICAgICAgICAgIGxpYl9lbnRyeV90ICoqbGliLAogICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKmRlc2MpOwotc3RhdGljIHZvaWQgZHVtcEVmZmVjdERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywgY2hhciAqc3RyLCBzaXplX3QgbGVuKTsKK3N0YXRpYyB2b2lkIGR1bXBFZmZlY3REZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsIGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwgaW50IGluZGVudCk7CiBzdGF0aWMgaW50IHN0cmluZ1RvVXVpZChjb25zdCBjaGFyICpzdHIsIGVmZmVjdF91dWlkX3QgKnV1aWQpOwogc3RhdGljIGludCB1dWlkVG9TdHJpbmcoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwgY2hhciAqc3RyLCBzaXplX3QgbWF4TGVuKTsKIApAQCAtMjM3LDggKzIzOSw4IEBACiAgICAgfQogCiAjaWYgKExPR19OREVCVUcgPT0gMCkKLSAgICBjaGFyIHN0clsyNTZdOwotICAgIGR1bXBFZmZlY3REZXNjcmlwdG9yKHBEZXNjcmlwdG9yLCBzdHIsIDI1Nik7CisgICAgY2hhciBzdHJbNTEyXTsKKyAgICBkdW1wRWZmZWN0RGVzY3JpcHRvcihwRGVzY3JpcHRvciwgc3RyLCBzaXplb2Yoc3RyKSwgMCAvKiBpbmRlbnQgKi8pOwogICAgIEFMT0dWKCJFZmZlY3RRdWVyeUVmZmVjdCgpIGRlc2M6JXMiLCBzdHIpOwogI2VuZGlmCiAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdMaWJMb2NrKTsKQEAgLTQ0NiwxMiArNDQ4LDE5IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAorICAgIC8vIGlnbm9yZSBlZmZlY3RzIG9yIG5vdD8KKyAgICBjb25zdCBib29sIGlnbm9yZUZ4Q29uZkZpbGVzID0gcHJvcGVydHlfZ2V0X2Jvb2woUFJPUEVSVFlfSUdOT1JFX0VGRkVDVFMsIGZhbHNlKTsKKwogICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmZ0xpYkxvY2ssIE5VTEwpOwogCi0gICAgaWYgKGFjY2VzcyhBVURJT19FRkZFQ1RfVkVORE9SX0NPTkZJR19GSUxFLCBSX09LKSA9PSAwKSB7Ci0gICAgICAgIGxvYWRFZmZlY3RDb25maWdGaWxlKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUpOwotICAgIH0gZWxzZSBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFLCBSX09LKSA9PSAwKSB7Ci0gICAgICAgIGxvYWRFZmZlY3RDb25maWdGaWxlKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFKTsKKyAgICBpZiAoaWdub3JlRnhDb25mRmlsZXMpIHsKKyAgICAgICAgQUxPR0koIkF1ZGlvIGVmZmVjdHMgaW4gY29uZmlndXJhdGlvbiBmaWxlcyB3aWxsIGJlIGlnbm9yZWQiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKKyAgICAgICAgICAgIGxvYWRFZmZlY3RDb25maWdGaWxlKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUpOworICAgICAgICB9IGVsc2UgaWYgKGFjY2VzcyhBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgeworICAgICAgICAgICAgbG9hZEVmZmVjdENvbmZpZ0ZpbGUoQVVESU9fRUZGRUNUX0RFRkFVTFRfQ09ORklHX0ZJTEUpOworICAgICAgICB9CiAgICAgfQogCiAgICAgdXBkYXRlTnVtRWZmZWN0cygpOwpAQCAtNTAzLDE1ICs1MTIsMzEgQEAKICAgICBhdWRpb19lZmZlY3RfbGlicmFyeV90ICpkZXNjOwogICAgIGxpc3RfZWxlbV90ICplOwogICAgIGxpYl9lbnRyeV90ICpsOworICAgIGNoYXIgcGF0aFtQQVRIX01BWF07CisgICAgY2hhciAqc3RyOworICAgIHNpemVfdCBsZW47CiAKICAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgUEFUSF9UQUcpOwogICAgIGlmIChub2RlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQorICAgIC8vIGF1ZGlvX2VmZmVjdHMuY29uZiBhbHdheXMgc3BlY2lmaWVzIDMyIGJpdCBsaWIgcGF0aDogY29udmVydCB0byA2NCBiaXQgcGF0aCBpZiBuZWVkZWQKKyAgICBzdHJsY3B5KHBhdGgsIG5vZGUtPnZhbHVlLCBQQVRIX01BWCk7CisjaWZkZWYgX19MUDY0X18KKyAgICBzdHIgPSBzdHJzdHIocGF0aCwgIi9saWIvIik7CisgICAgaWYgKHN0ciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICBsZW4gPSBzdHIgLSBwYXRoOworICAgIHBhdGhbbGVuXSA9ICdcMCc7CisgICAgc3RybGNhdChwYXRoLCAiL2xpYjY0LyIsIFBBVEhfTUFYKTsKKyAgICBzdHJsY2F0KHBhdGgsIG5vZGUtPnZhbHVlICsgbGVuICsgc3RybGVuKCIvbGliLyIpLCBQQVRIX01BWCk7CisjZW5kaWYKKyAgICBpZiAoc3RybGVuKHBhdGgpID49IFBBVEhfTUFYIC0gMSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAKLSAgICBoZGwgPSBkbG9wZW4obm9kZS0+dmFsdWUsIFJUTERfTk9XKTsKKyAgICBoZGwgPSBkbG9wZW4ocGF0aCwgUlRMRF9OT1cpOwogICAgIGlmIChoZGwgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygibG9hZExpYnJhcnkoKSBmYWlsZWQgdG8gb3BlbiAlcyIsIG5vZGUtPnZhbHVlKTsKKyAgICAgICAgQUxPR1coImxvYWRMaWJyYXJ5KCkgZmFpbGVkIHRvIG9wZW4gJXMiLCBwYXRoKTsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKQEAgLTUzNSw3ICs1NjAsNyBAQAogICAgIC8vIGFkZCBlbnRyeSBmb3IgbGlicmFyeSBpbiBnTGlicmFyeUxpc3QKICAgICBsID0gbWFsbG9jKHNpemVvZihsaWJfZW50cnlfdCkpOwogICAgIGwtPm5hbWUgPSBzdHJuZHVwKG5hbWUsIFBBVEhfTUFYKTsKLSAgICBsLT5wYXRoID0gc3RybmR1cChub2RlLT52YWx1ZSwgUEFUSF9NQVgpOworICAgIGwtPnBhdGggPSBzdHJuZHVwKHBhdGgsIFBBVEhfTUFYKTsKICAgICBsLT5oYW5kbGUgPSBoZGw7CiAgICAgbC0+ZGVzYyA9IGRlc2M7CiAgICAgbC0+ZWZmZWN0cyA9IE5VTEw7CkBAIC01NDcsNyArNTcyLDcgQEAKICAgICBlLT5uZXh0ID0gZ0xpYnJhcnlMaXN0OwogICAgIGdMaWJyYXJ5TGlzdCA9IGU7CiAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdMaWJMb2NrKTsKLSAgICBBTE9HVigiZ2V0TGlicmFyeSgpIGxpbmtlZCBsaWJyYXJ5ICVwIGZvciBwYXRoICVzIiwgbCwgbm9kZS0+dmFsdWUpOworICAgIEFMT0dWKCJnZXRMaWJyYXJ5KCkgbGlua2VkIGxpYnJhcnkgJXAgZm9yIHBhdGggJXMiLCBsLCBwYXRoKTsKIAogICAgIHJldHVybiAwOwogCkBAIC01OTUsOCArNjIwLDggQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogI2lmIChMT0dfTkRFQlVHPT0wKQotICAgIGNoYXIgc1syNTZdOwotICAgIGR1bXBFZmZlY3REZXNjcmlwdG9yKGQsIHMsIDI1Nik7CisgICAgY2hhciBzWzUxMl07CisgICAgZHVtcEVmZmVjdERlc2NyaXB0b3IoZCwgcywgc2l6ZW9mKHMpLCAwIC8qIGluZGVudCAqLyk7CiAgICAgQUxPR1YoImFkZFN1YkVmZmVjdCgpIHJlYWQgZGVzY3JpcHRvciAlcDolcyIsZCwgcyk7CiAjZW5kaWYKICAgICBpZiAoRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKGQtPmFwaVZlcnNpb24pICE9CkBAIC02NjAsNiArNjg1LDEzIEBACiAgICAgICAgIEFMT0dXKCJsb2FkRWZmZWN0KCkgaW52YWxpZCB1dWlkICVzIiwgbm9kZS0+dmFsdWUpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CisgICAgbGliX2VudHJ5X3QgKnRtcDsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoZmluZEVmZmVjdChOVUxMLCAmdXVpZCwgJnRtcCwgTlVMTCkgPT0gMCkgeworICAgICAgICBBTE9HVygic2tpcHBpbmcgZHVwbGljYXRlIHV1aWQgJXMgJXMiLCBub2RlLT52YWx1ZSwKKyAgICAgICAgICAgICAgICBub2RlLT5uZXh0ID8gImFuZCBpdHMgc3ViLWVmZmVjdHMiIDogIiIpOworICAgICAgICBza2lwID0gdHJ1ZTsKKyAgICB9CiAKICAgICBkID0gbWFsbG9jKHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CiAgICAgaWYgKGwtPmRlc2MtPmdldF9kZXNjcmlwdG9yKCZ1dWlkLCBkKSAhPSAwKSB7CkBAIC02NzAsOCArNzAyLDggQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogI2lmIChMT0dfTkRFQlVHPT0wKQotICAgIGNoYXIgc1syNTZdOwotICAgIGR1bXBFZmZlY3REZXNjcmlwdG9yKGQsIHMsIDI1Nik7CisgICAgY2hhciBzWzUxMl07CisgICAgZHVtcEVmZmVjdERlc2NyaXB0b3IoZCwgcywgc2l6ZW9mKHMpLCAwIC8qIGluZGVudCAqLyk7CiAgICAgQUxPR1YoImxvYWRFZmZlY3QoKSByZWFkIGRlc2NyaXB0b3IgJXA6JXMiLGQsIHMpOwogI2VuZGlmCiAgICAgaWYgKEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihkLT5hcGlWZXJzaW9uKSAhPQpAQCAtNjgyLDggKzcxNCwxNCBAQAogICAgIH0KICAgICBlID0gbWFsbG9jKHNpemVvZihsaXN0X2VsZW1fdCkpOwogICAgIGUtPm9iamVjdCA9IGQ7Ci0gICAgZS0+bmV4dCA9IGwtPmVmZmVjdHM7Ci0gICAgbC0+ZWZmZWN0cyA9IGU7CisgICAgaWYgKHNraXApIHsKKyAgICAgICAgZS0+bmV4dCA9IGdTa2lwcGVkRWZmZWN0czsKKyAgICAgICAgZ1NraXBwZWRFZmZlY3RzID0gZTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZS0+bmV4dCA9IGwtPmVmZmVjdHM7CisgICAgICAgIGwtPmVmZmVjdHMgPSBlOworICAgIH0KIAogICAgIC8vIEFmdGVyIHRoZSBVVUlEIG5vZGUgaW4gdGhlIGNvbmZpZ190cmVlLCBpZiBub2RlLT5uZXh0IGlzIHZhbGlkLAogICAgIC8vIHRoYXQgd291bGQgYmUgc3ViIGVmZmVjdCBub2RlLgpAQCAtODc2LDIyICs5MTQsMzAgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi12b2lkIGR1bXBFZmZlY3REZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsIGNoYXIgKnN0ciwgc2l6ZV90IGxlbikgewordm9pZCBkdW1wRWZmZWN0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLCBjaGFyICpzdHIsIHNpemVfdCBsZW4sIGludCBpbmRlbnQpIHsKICAgICBjaGFyIHNbMjU2XTsKKyAgICBjaGFyIHNzWzI1Nl07CisgICAgY2hhciBpZHRbaW5kZW50ICsgMV07CiAKLSAgICBzbnByaW50ZihzdHIsIGxlbiwgIlxuRWZmZWN0IERlc2NyaXB0b3IgJXA6XG4iLCBkZXNjKTsKLSAgICBzdHJuY2F0KHN0ciwgIi0gVFlQRTogIiwgbGVuKTsKLSAgICB1dWlkVG9TdHJpbmcoJmRlc2MtPnV1aWQsIHMsIDI1Nik7Ci0gICAgc25wcmludGYoc3RyLCBsZW4sICItIFVVSUQ6ICVzXG4iLCBzKTsKLSAgICB1dWlkVG9TdHJpbmcoJmRlc2MtPnR5cGUsIHMsIDI1Nik7Ci0gICAgc25wcmludGYoc3RyLCBsZW4sICItIFRZUEU6ICVzXG4iLCBzKTsKLSAgICBzcHJpbnRmKHMsICItIGFwaVZlcnNpb246ICUwOFhcbi0gZmxhZ3M6ICUwOFhcbiIsCi0gICAgICAgICAgICBkZXNjLT5hcGlWZXJzaW9uLCBkZXNjLT5mbGFncyk7Ci0gICAgc3RybmNhdChzdHIsIHMsIGxlbik7Ci0gICAgc3ByaW50ZihzLCAiLSBuYW1lOiAlc1xuIiwgZGVzYy0+bmFtZSk7Ci0gICAgc3RybmNhdChzdHIsIHMsIGxlbik7Ci0gICAgc3ByaW50ZihzLCAiLSBpbXBsZW1lbnRvcjogJXNcbiIsIGRlc2MtPmltcGxlbWVudG9yKTsKLSAgICBzdHJuY2F0KHN0ciwgcywgbGVuKTsKKyAgICBtZW1zZXQoaWR0LCAnICcsIGluZGVudCk7CisgICAgaWR0W2luZGVudF0gPSAwOworCisgICAgc3RyWzBdID0gMDsKKworICAgIHNucHJpbnRmKHMsIHNpemVvZihzKSwgIiVzJXMgLyAlc1xuIiwgaWR0LCBkZXNjLT5uYW1lLCBkZXNjLT5pbXBsZW1lbnRvcik7CisgICAgc3RybGNhdChzdHIsIHMsIGxlbik7CisKKyAgICB1dWlkVG9TdHJpbmcoJmRlc2MtPnV1aWQsIHMsIHNpemVvZihzKSk7CisgICAgc25wcmludGYoc3MsIHNpemVvZihzcyksICIlcyAgVVVJRDogJXNcbiIsIGlkdCwgcyk7CisgICAgc3RybGNhdChzdHIsIHNzLCBsZW4pOworCisgICAgdXVpZFRvU3RyaW5nKCZkZXNjLT50eXBlLCBzLCBzaXplb2YocykpOworICAgIHNucHJpbnRmKHNzLCBzaXplb2Yoc3MpLCAiJXMgIFRZUEU6ICVzXG4iLCBpZHQsIHMpOworICAgIHN0cmxjYXQoc3RyLCBzcywgbGVuKTsKKworICAgIHNwcmludGYocywgIiVzICBhcGlWZXJzaW9uOiAlMDhYXG4lcyAgZmxhZ3M6ICUwOFhcbiIsIGlkdCwKKyAgICAgICAgICAgIGRlc2MtPmFwaVZlcnNpb24sIGlkdCwgZGVzYy0+ZmxhZ3MpOworICAgIHN0cmxjYXQoc3RyLCBzLCBsZW4pOwogfQogCiBpbnQgc3RyaW5nVG9VdWlkKGNvbnN0IGNoYXIgKnN0ciwgZWZmZWN0X3V1aWRfdCAqdXVpZCkKQEAgLTkzNCwzICs5ODAsNDAgQEAKICAgICByZXR1cm4gMDsKIH0KIAoraW50IEVmZmVjdER1bXBFZmZlY3RzKGludCBmZCkgeworICAgIGNoYXIgc1s1MTJdOworICAgIGxpc3RfZWxlbV90ICplID0gZ0xpYnJhcnlMaXN0OworICAgIGxpYl9lbnRyeV90ICpsID0gTlVMTDsKKyAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkID0gTlVMTDsKKyAgICBpbnQgZm91bmQgPSAwOworICAgIGludCByZXQgPSAwOworCisgICAgd2hpbGUgKGUpIHsKKyAgICAgICAgbCA9IChsaWJfZW50cnlfdCAqKWUtPm9iamVjdDsKKyAgICAgICAgbGlzdF9lbGVtX3QgKmVmeCA9IGwtPmVmZmVjdHM7CisgICAgICAgIGRwcmludGYoZmQsICJMaWJyYXJ5ICVzXG4iLCBsLT5uYW1lKTsKKyAgICAgICAgaWYgKCFlZngpIHsKKyAgICAgICAgICAgIGRwcmludGYoZmQsICIgIChubyBlZmZlY3RzKVxuIik7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGVmeCkgeworICAgICAgICAgICAgZCA9IChlZmZlY3RfZGVzY3JpcHRvcl90ICopZWZ4LT5vYmplY3Q7CisgICAgICAgICAgICBkdW1wRWZmZWN0RGVzY3JpcHRvcihkLCBzLCBzaXplb2YocyksIDIpOworICAgICAgICAgICAgZHByaW50ZihmZCwgIiVzIiwgcyk7CisgICAgICAgICAgICBlZnggPSBlZngtPm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgZSA9IGUtPm5leHQ7CisgICAgfQorCisgICAgZSA9IGdTa2lwcGVkRWZmZWN0czsKKyAgICBpZiAoZSkgeworICAgICAgICBkcHJpbnRmKGZkLCAiU2tpcHBlZCBlZmZlY3RzXG4iKTsKKyAgICAgICAgd2hpbGUoZSkgeworICAgICAgICAgICAgZCA9IChlZmZlY3RfZGVzY3JpcHRvcl90ICopZS0+b2JqZWN0OworICAgICAgICAgICAgZHVtcEVmZmVjdERlc2NyaXB0b3IoZCwgcywgc2l6ZW9mKHMpLCAyIC8qIGluZGVudCAqLyk7CisgICAgICAgICAgICBkcHJpbnRmKGZkLCAiJXMiLCBzKTsKKyAgICAgICAgICAgIGUgPSBlLT5uZXh0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5oIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmgKaW5kZXggNTYwYjQ4NS4uNTE4ODAwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmgKQEAgLTI2LDYgKzI2LDcgQEAKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKKyNkZWZpbmUgUFJPUEVSVFlfSUdOT1JFX0VGRkVDVFMgInJvLmF1ZGlvLmlnbm9yZV9lZmZlY3RzIgogCiB0eXBlZGVmIHN0cnVjdCBsaXN0X2VsZW1fcyB7CiAgICAgdm9pZCAqb2JqZWN0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKaW5kZXggNDBjN2ZlZi4uMTRhMWE3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCkBAIC0yNyw2ICsyNyw3IEBACiAKICNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CiAjaW5jbHVkZSAiRWZmZWN0QnVuZGxlLmgiCisjaW5jbHVkZSAibWF0aC5oIgogCiAKIC8vIGVmZmVjdF9oYW5kbGVfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIGJhc3MgYm9vc3QKQEAgLTgzMCwzMiArODMxLDY5IEBACiAgICAgaW50IGdhaW5Db3JyZWN0aW9uID0gMDsKICAgICAvL0NvdW50IHRoZSBlbmVyZ3kgY29udHJpYnV0aW9uIHBlciBiYW5kIGZvciBFUSBhbmQgQmFzc0Jvb3N0IG9ubHkgaWYgdGhleSBhcmUgYWN0aXZlLgogICAgIGZsb2F0IGVuZXJneUNvbnRyaWJ1dGlvbiA9IDA7CisgICAgZmxvYXQgZW5lcmd5Q3Jvc3MgPSAwOworICAgIGZsb2F0IGVuZXJneUJhc3NCb29zdCA9IDA7CisgICAgZmxvYXQgY3Jvc3NDb3JyZWN0aW9uID0gMDsKIAogICAgIC8vRVEgY29udHJpYnV0aW9uCiAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJFcXVhbGl6ZXJFbmFibGVkID09IExWTV9UUlVFKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgewotICAgICAgICAgICAgZmxvYXQgYmFuZEVuZXJneSA9IChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2ldICoKLSAgICAgICAgICAgICAgICAgICAgTGltaXRMZXZlbF9iYW5kRW5lcmd5Q29udHJpYnV0aW9uW2ldKS8xNS4wOworICAgICAgICAgICAgZmxvYXQgYmFuZEZhY3RvciA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbaV0vMTUuMDsKKyAgICAgICAgICAgIGZsb2F0IGJhbmRDb2VmZmljaWVudCA9IExpbWl0TGV2ZWxfYmFuZEVuZXJneUNvZWZmaWNpZW50W2ldOworICAgICAgICAgICAgZmxvYXQgYmFuZEVuZXJneSA9IGJhbmRGYWN0b3IgKiBiYW5kQ29lZmZpY2llbnQgKiBiYW5kQ29lZmZpY2llbnQ7CiAgICAgICAgICAgICBpZiAoYmFuZEVuZXJneSA+IDApCiAgICAgICAgICAgICAgICAgZW5lcmd5Q29udHJpYnV0aW9uICs9IGJhbmRFbmVyZ3k7CiAgICAgICAgIH0KKworICAgICAgICAvL2Nyb3NzIEVRIGNvZWZmaWNpZW50cworICAgICAgICBmbG9hdCBiYW5kRmFjdG9yU3VtID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUy0xOyBpKyspIHsKKyAgICAgICAgICAgIGZsb2F0IGJhbmRGYWN0b3IxID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltpXS8xNS4wOworICAgICAgICAgICAgZmxvYXQgYmFuZEZhY3RvcjIgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2krMV0vMTUuMDsKKworICAgICAgICAgICAgaWYgKGJhbmRGYWN0b3IxID4gMCAmJiBiYW5kRmFjdG9yMiA+IDApIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBjcm9zc0VuZXJneSA9IGJhbmRGYWN0b3IxICogYmFuZEZhY3RvcjIgKgorICAgICAgICAgICAgICAgICAgICAgICAgTGltaXRMZXZlbF9iYW5kRW5lcmd5Q3Jvc3NDb2VmZmljaWVudFtpXTsKKyAgICAgICAgICAgICAgICBiYW5kRmFjdG9yU3VtICs9IGJhbmRGYWN0b3IxICogYmFuZEZhY3RvcjI7CisKKyAgICAgICAgICAgICAgICBpZiAoY3Jvc3NFbmVyZ3kgPiAwKQorICAgICAgICAgICAgICAgICAgICBlbmVyZ3lDcm9zcyArPSBjcm9zc0VuZXJneTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBiYW5kRmFjdG9yU3VtIC09IDEuMDsKKyAgICAgICAgaWYgKGJhbmRGYWN0b3JTdW0gPiAwKQorICAgICAgICAgICAgY3Jvc3NDb3JyZWN0aW9uID0gYmFuZEZhY3RvclN1bSAqIDAuNzsKICAgICB9CiAKICAgICAvL0Jhc3NCb29zdCBjb250cmlidXRpb24KICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NFbmFibGVkID09IExWTV9UUlVFKSB7Ci0gICAgICAgIGZsb2F0IGJhbmRFbmVyZ3kgPSAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+QmFzc1N0cmVuZ3RoU2F2ZWQgKgotICAgICAgICAgICAgICAgIExpbWl0TGV2ZWxfYmFzc0Jvb3N0RW5lcmd5Q29udHJpYnV0aW9uKS8xMDAwLjA7Ci0gICAgICAgIGlmIChiYW5kRW5lcmd5ID4gMCkKLSAgICAgICAgICAgIGVuZXJneUNvbnRyaWJ1dGlvbiArPSBiYW5kRW5lcmd5OworICAgICAgICBmbG9hdCBib29zdEZhY3RvciA9IChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5CYXNzU3RyZW5ndGhTYXZlZCkvMTAwMC4wOworICAgICAgICBmbG9hdCBib29zdENvZWZmaWNpZW50ID0gTGltaXRMZXZlbF9iYXNzQm9vc3RFbmVyZ3lDb2VmZmljaWVudDsKKworICAgICAgICBlbmVyZ3lDb250cmlidXRpb24gKz0gYm9vc3RGYWN0b3IgKiBib29zdENvZWZmaWNpZW50ICogYm9vc3RDb2VmZmljaWVudDsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKKyAgICAgICAgICAgIGZsb2F0IGJhbmRGYWN0b3IgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2ldLzE1LjA7CisgICAgICAgICAgICBmbG9hdCBiYW5kQ3Jvc3NDb2VmZmljaWVudCA9IExpbWl0TGV2ZWxfYmFzc0Jvb3N0RW5lcmd5Q3Jvc3NDb2VmZmljaWVudFtpXTsKKyAgICAgICAgICAgIGZsb2F0IGJhbmRFbmVyZ3kgPSBib29zdEZhY3RvciAqIGJhbmRGYWN0b3IgKgorICAgICAgICAgICAgICAgICAgICBiYW5kQ3Jvc3NDb2VmZmljaWVudDsKKyAgICAgICAgICAgIGlmIChiYW5kRW5lcmd5ID4gMCkKKyAgICAgICAgICAgICAgICBlbmVyZ3lCYXNzQm9vc3QgKz0gYmFuZEVuZXJneTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vVmlydHVhbGl6ZXIgY29udHJpYnV0aW9uCiAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUUpIHsKLSAgICAgICAgICAgICAgICAgICBlbmVyZ3lDb250cmlidXRpb24gKz0gTGltaXRMZXZlbF92aXJ0dWFsaXplckNvbnRyaWJ1dGlvbjsKLSAgICAgICAgfQorICAgICAgICBlbmVyZ3lDb250cmlidXRpb24gKz0gTGltaXRMZXZlbF92aXJ0dWFsaXplckNvbnRyaWJ1dGlvbiAqCisgICAgICAgICAgICAgICAgTGltaXRMZXZlbF92aXJ0dWFsaXplckNvbnRyaWJ1dGlvbjsKKyAgICB9CisKKyAgICBkb3VibGUgdG90YWxFbmVyZ3lFc3RpbWF0aW9uID0gc3FydChlbmVyZ3lDb250cmlidXRpb24gKyBlbmVyZ3lDcm9zcyArIGVuZXJneUJhc3NCb29zdCkgLQorICAgICAgICAgICAgY3Jvc3NDb3JyZWN0aW9uOworICAgIEFMT0dWKCIgVE9UQUwgZW5lcmd5IGVzdGltYXRpb246ICUwLjJmIiwgdG90YWxFbmVyZ3lFc3RpbWF0aW9uKTsKIAogICAgIC8vcm91bmRvZmYKLSAgICBpbnQgbWF4TGV2ZWxSb3VuZCA9IChpbnQpKGVuZXJneUNvbnRyaWJ1dGlvbiArIDAuOTkpOworICAgIGludCBtYXhMZXZlbFJvdW5kID0gKGludCkodG90YWxFbmVyZ3lFc3RpbWF0aW9uICsgMC45OSk7CiAgICAgaWYgKG1heExldmVsUm91bmQgKyBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT52b2x1bWUgPiAwKSB7CiAgICAgICAgIGdhaW5Db3JyZWN0aW9uID0gbWF4TGV2ZWxSb3VuZCArIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnZvbHVtZTsKICAgICB9CkBAIC0zMDUzLDcgKzMwOTEsMTAgQEAKICAgICAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0dFVF9QQVJBTSBzdGFydCIpOwogCiAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKXBDbWREYXRhOwotCisgICAgICAgICAgICBpZiAoU0laRV9NQVggLSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpIDwgKHNpemVfdClwLT5wc2l6ZSkgeworICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjYzNDc1MDkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgPCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpIHx8CiAgICAgICAgICAgICAgICAgICAgIGNtZFNpemUgPCAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHAtPnBzaXplKSB8fAogICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKaW5kZXggYjMwNzFmNC4uOTQ1OWI4NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKQEAgLTIwMCwxMCArMjAwLDE2IEBACiAgKiB1cGRhdGVkLgogICovCiAKLXN0YXRpYyBjb25zdCBmbG9hdCBMaW1pdExldmVsX2JhbmRFbmVyZ3lDb250cmlidXRpb25bRklWRUJBTkRfTlVNQkFORFNdID0gewotICAgICAgICA1LjAsIDYuNSwgNi40NSwgNC44LCAxLjcgfTsKK3N0YXRpYyBjb25zdCBmbG9hdCBMaW1pdExldmVsX2JhbmRFbmVyZ3lDb2VmZmljaWVudFtGSVZFQkFORF9OVU1CQU5EU10gPSB7CisgICAgICAgIDcuNTYsIDkuNjksIDkuNTksIDcuMzcsIDIuODh9OwogCi1zdGF0aWMgY29uc3QgZmxvYXQgTGltaXRMZXZlbF9iYXNzQm9vc3RFbmVyZ3lDb250cmlidXRpb24gPSA2Ljc7CitzdGF0aWMgY29uc3QgZmxvYXQgTGltaXRMZXZlbF9iYW5kRW5lcmd5Q3Jvc3NDb2VmZmljaWVudFtGSVZFQkFORF9OVU1CQU5EUy0xXSA9IHsKKyAgICAgICAgMTI2LjAsIDExNS4wLCAxMjUuMCwgMTA0LjAgfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IExpbWl0TGV2ZWxfYmFzc0Jvb3N0RW5lcmd5Q3Jvc3NDb2VmZmljaWVudFtGSVZFQkFORF9OVU1CQU5EU10gPSB7CisgICAgICAgIDIyMS4yMSwgMjA4LjEwLCAyOC4xNiwgMC4wLCAwLjAgfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IExpbWl0TGV2ZWxfYmFzc0Jvb3N0RW5lcmd5Q29lZmZpY2llbnQgPSA3LjEyOwogCiBzdGF0aWMgY29uc3QgZmxvYXQgTGltaXRMZXZlbF92aXJ0dWFsaXplckNvbnRyaWJ1dGlvbiA9IDEuOTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKaW5kZXggYTQ4YTRlMy4uNGRjOGI0NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCkBAIC0xOTU2LDcgKzE5NTYsMTAgQEAKICAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCiAgICAgICAgICAgICAvLyAgICAgICAgIkVGRkVDVF9DTURfR0VUX1BBUkFNIHN0YXJ0Iik7CiAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKXBDbWREYXRhOwotCisgICAgICAgICAgICBpZiAoU0laRV9NQVggLSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpIDwgKHNpemVfdClwLT5wc2l6ZSkgeworICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjYzNDc1MDkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgPCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpIHx8CiAgICAgICAgICAgICAgICAgICAgIGNtZFNpemUgPCAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHAtPnBzaXplKSB8fAogICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQubWsgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLm1rCmluZGV4IDZjNTg1ZmIuLmEzYzNkM2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5tawpAQCAtNyw2ICs3LDkgQEAKIExPQ0FMX01PRFVMRTo9IGxpYm1lZGlhX2hlbHBlcgogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAorTE9DQUxfQ19GTEFHUyArPSAtV2Vycm9yIC1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKKwogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQogCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKQEAgLTE5LDYgKzIyLDcgQEAKICAgICBJQXVkaW9UcmFjay5jcHAgXAogICAgIElBdWRpb1JlY29yZC5jcHAgXAogICAgIElDcnlwdG8uY3BwIFwKKyAgICBJRGF0YVNvdXJjZS5jcHAgXAogICAgIElEcm0uY3BwIFwKICAgICBJRHJtQ2xpZW50LmNwcCBcCiAgICAgSUhEQ1AuY3BwIFwKQEAgLTM2LDYgKzQwLDggQEAKICAgICBJTWVkaWFSZWNvcmRlci5jcHAgXAogICAgIElSZW1vdGVEaXNwbGF5LmNwcCBcCiAgICAgSVJlbW90ZURpc3BsYXlDbGllbnQuY3BwIFwKKyAgICBJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50LmNwcCBcCisgICAgSVJlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwIFwKICAgICBJU3RyZWFtU291cmNlLmNwcCBcCiAgICAgTWVkaWFDb2RlY0luZm8uY3BwIFwKICAgICBNZXRhZGF0YS5jcHAgXApAQCAtNTMsNiArNTksOCBAQAogICAgIENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuY3BwIFwKICAgICBJTWVkaWFEZWF0aE5vdGlmaWVyLmNwcCBcCiAgICAgTWVkaWFQcm9maWxlcy5jcHAgXAorICAgIE1lZGlhUmVzb3VyY2UuY3BwIFwKKyAgICBNZWRpYVJlc291cmNlUG9saWN5LmNwcCBcCiAgICAgSUVmZmVjdC5jcHAgXAogICAgIElFZmZlY3RDbGllbnQuY3BwIFwKICAgICBBdWRpb0VmZmVjdC5jcHAgXApAQCAtNjEsMTUgKzY5LDExIEBACiAgICAgU3RyaW5nQXJyYXkuY3BwIFwKICAgICBBdWRpb1BvbGljeS5jcHAKIAotTE9DQUxfU1JDX0ZJTEVTICs9IC4uL2xpYm5iYWlvL3JvdW5kdXAuYwotCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJ1aSBsaWJsb2cgbGliY3V0aWxzIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzb25pdm94IGxpYmljdXVjIGxpYmljdWkxOG4gbGliZXhwYXQgXAogICAgICAgICBsaWJjYW1lcmFfY2xpZW50IGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAogICAgICAgICBsaWJndWkgbGliZGwgbGliYXVkaW91dGlscyBsaWJuYmFpbwogCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYmluc3RhbnRzc3EKLQogTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJtZWRpYV9oZWxwZXIKIAogTE9DQUxfTU9EVUxFOj0gbGlibWVkaWEKQEAgLTgzLDE0ICs4Nyw4IEBACiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKICAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTICs9IFNpbmdsZVN0YXRlUXVldWUuY3BwCi1MT0NBTF9DRkxBR1MgKz0gLURTSU5HTEVfU1RBVEVfUVVFVUVfSU5TVEFOVElBVElPTlM9JyJTaW5nbGVTdGF0ZVF1ZXVlSW5zdGFudGlhdGlvbnMuY3BwIicKLQotTE9DQUxfTU9EVUxFIDo9IGxpYmluc3RhbnRzc3EKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLWluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvRWZmZWN0LmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvRWZmZWN0LmNwcAppbmRleCBhZjEwM2MxLi5mZjgyNTQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb0VmZmVjdC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9FZmZlY3QuY3BwCkBAIC0zNSwxMyArMzUsMTQgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUF1ZGlvRWZmZWN0OjpBdWRpb0VmZmVjdCgpCi0gICAgOiBtU3RhdHVzKE5PX0lOSVQpCitBdWRpb0VmZmVjdDo6QXVkaW9FZmZlY3QoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpCisgICAgOiBtU3RhdHVzKE5PX0lOSVQpLCBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKQogewogfQogCiAKIEF1ZGlvRWZmZWN0OjpBdWRpb0VmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCiAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKICAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYsCkBAIC00OSwxMiArNTAsMTMgQEAKICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvCiAgICAgICAgICAgICAgICAgKQotICAgIDogbVN0YXR1cyhOT19JTklUKQorICAgIDogbVN0YXR1cyhOT19JTklUKSwgbU9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSkKIHsKICAgICBtU3RhdHVzID0gc2V0KHR5cGUsIHV1aWQsIHByaW9yaXR5LCBjYmYsIHVzZXIsIHNlc3Npb25JZCwgaW8pOwogfQogCiBBdWRpb0VmZmVjdDo6QXVkaW9FZmZlY3QoY29uc3QgY2hhciAqdHlwZVN0ciwKKyAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1dWlkU3RyLAogICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCiAgICAgICAgICAgICAgICAgZWZmZWN0X2NhbGxiYWNrX3QgY2JmLApAQCAtNjIsNyArNjQsNyBAQAogICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8KICAgICAgICAgICAgICAgICApCi0gICAgOiBtU3RhdHVzKE5PX0lOSVQpCisgICAgOiBtU3RhdHVzKE5PX0lOSVQpLCBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKQogewogICAgIGVmZmVjdF91dWlkX3QgdHlwZTsKICAgICBlZmZlY3RfdXVpZF90ICpwVHlwZSA9IE5VTEw7CkBAIC0xMjgsMTYgKzEzMCwxOCBAQAogICAgIG1JRWZmZWN0Q2xpZW50ID0gbmV3IEVmZmVjdENsaWVudCh0aGlzKTsKIAogICAgIGlFZmZlY3QgPSBhdWRpb0ZsaW5nZXItPmNyZWF0ZUVmZmVjdCgoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKSZtRGVzY3JpcHRvciwKLSAgICAgICAgICAgIG1JRWZmZWN0Q2xpZW50LCBwcmlvcml0eSwgaW8sIG1TZXNzaW9uSWQsICZtU3RhdHVzLCAmbUlkLCAmZW5hYmxlZCk7CisgICAgICAgICAgICBtSUVmZmVjdENsaWVudCwgcHJpb3JpdHksIGlvLCBtU2Vzc2lvbklkLCBtT3BQYWNrYWdlTmFtZSwgJm1TdGF0dXMsICZtSWQsICZlbmFibGVkKTsKIAogICAgIGlmIChpRWZmZWN0ID09IDAgfHwgKG1TdGF0dXMgIT0gTk9fRVJST1IgJiYgbVN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykpIHsKICAgICAgICAgQUxPR0UoInNldCgpOiBBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSBlZmZlY3QsIHN0YXR1czogJWQiLCBtU3RhdHVzKTsKKyAgICAgICAgaWYgKGlFZmZlY3QgPT0gMCkgeworICAgICAgICAgICAgbVN0YXR1cyA9IE5PX0lOSVQ7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG1TdGF0dXM7CiAgICAgfQogCiAgICAgbUVuYWJsZWQgPSAodm9sYXRpbGUgaW50MzJfdCllbmFibGVkOwogCi0gICAgbUlFZmZlY3QgPSBpRWZmZWN0OwogICAgIGNibGsgPSBpRWZmZWN0LT5nZXRDYmxrKCk7CiAgICAgaWYgKGNibGsgPT0gMCkgewogICAgICAgICBtU3RhdHVzID0gTk9fSU5JVDsKQEAgLTE0NSw2ICsxNDksNyBAQAogICAgICAgICByZXR1cm4gbVN0YXR1czsKICAgICB9CiAKKyAgICBtSUVmZmVjdCA9IGlFZmZlY3Q7CiAgICAgbUNibGtNZW1vcnkgPSBjYmxrOwogICAgIG1DYmxrID0gc3RhdGljX2Nhc3Q8ZWZmZWN0X3BhcmFtX2NibGtfdCo+KGNibGstPnBvaW50ZXIoKSk7CiAgICAgaW50IGJ1Zk9mZnNldCA9ICgoc2l6ZW9mKGVmZmVjdF9wYXJhbV9jYmxrX3QpIC0gMSkgLyBzaXplb2YoaW50KSArIDEpICogc2l6ZW9mKGludCk7CkBAIC0xNzUsMTEgKzE4MCwxMSBAQAogICAgICAgICAgICAgbUlFZmZlY3QtPmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1JRWZmZWN0KS0+dW5saW5rVG9EZWF0aChtSUVmZmVjdENsaWVudCk7CiAgICAgICAgIH0KKyAgICAgICAgbUlFZmZlY3QuY2xlYXIoKTsKKyAgICAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKKyAgICAgICAgbUlFZmZlY3RDbGllbnQuY2xlYXIoKTsKICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogICAgIH0KLSAgICBtSUVmZmVjdC5jbGVhcigpOwotICAgIG1JRWZmZWN0Q2xpZW50LmNsZWFyKCk7Ci0gICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKIH0KIAogCkBAIC00ODYsNCArNDkxLDQgQEAKIH0KIAogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9QYXJhbWV0ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9QYXJhbWV0ZXIuY3BwCmluZGV4IDMzZGJmMGIuLjhjOGNmNDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvUGFyYW1ldGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1BhcmFtZXRlci5jcHAKQEAgLTE4MCw0ICsxODAsNCBAQAogICAgIH0KIH0KIAotfTsgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1BvbGljeS5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1BvbGljeS5jcHAKaW5kZXggZDJkMDk3MS4uOWQwNzAxMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9Qb2xpY3kuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvUG9saWN5LmNwcApAQCAtNjgsNiArNjgsNyBAQAogICAgIG1Gb3JtYXQuZm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KXBhcmNlbC0+cmVhZEludDMyKCk7CiAgICAgbVJvdXRlRmxhZ3MgPSBwYXJjZWwtPnJlYWRJbnQzMigpOwogICAgIG1SZWdpc3RyYXRpb25JZCA9IHBhcmNlbC0+cmVhZFN0cmluZzgoKTsKKyAgICBtQ2JGbGFncyA9ICh1aW50MzJfdClwYXJjZWwtPnJlYWRJbnQzMigpOwogICAgIHNpemVfdCBzaXplID0gKHNpemVfdClwYXJjZWwtPnJlYWRJbnQzMigpOwogICAgIGlmIChzaXplID4gTUFYX0NSSVRFUklBX1BFUl9NSVgpIHsKICAgICAgICAgc2l6ZSA9IE1BWF9DUklURVJJQV9QRVJfTUlYOwpAQCAtODksNiArOTAsNyBAQAogICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtRm9ybWF0LmZvcm1hdCk7CiAgICAgcGFyY2VsLT53cml0ZUludDMyKG1Sb3V0ZUZsYWdzKTsKICAgICBwYXJjZWwtPndyaXRlU3RyaW5nOChtUmVnaXN0cmF0aW9uSWQpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtQ2JGbGFncyk7CiAgICAgc2l6ZV90IHNpemUgPSBtQ3JpdGVyaWEuc2l6ZSgpOwogICAgIGlmIChzaXplID4gTUFYX0NSSVRFUklBX1BFUl9NSVgpIHsKICAgICAgICAgc2l6ZSA9IE1BWF9DUklURVJJQV9QRVJfTUlYOwpAQCAtMTEyLDQgKzExNCw0IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9SZWNvcmQuY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9SZWNvcmQuY3BwCmluZGV4IDA3Y2ExNGYuLjAxMWIzMWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1JlY29yZC5jcHAKQEAgLTY1LDkgKzY1LDEwIEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1BdWRpb1JlY29yZDo6QXVkaW9SZWNvcmQoKQotICAgIDogbVN0YXR1cyhOT19JTklUKSwgbVNlc3Npb25JZChBVURJT19TRVNTSU9OX0FMTE9DQVRFKSwKLSAgICAgIG1QcmV2aW91c1ByaW9yaXR5KEFORFJPSURfUFJJT1JJVFlfTk9STUFMKSwgbVByZXZpb3VzU2NoZWR1bGluZ0dyb3VwKFNQX0RFRkFVTFQpCitBdWRpb1JlY29yZDo6QXVkaW9SZWNvcmQoY29uc3QgU3RyaW5nMTYgJm9wUGFja2FnZU5hbWUpCisgICAgOiBtU3RhdHVzKE5PX0lOSVQpLCBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKSwgbVNlc3Npb25JZChBVURJT19TRVNTSU9OX0FMTE9DQVRFKSwKKyAgICAgIG1QcmV2aW91c1ByaW9yaXR5KEFORFJPSURfUFJJT1JJVFlfTk9STUFMKSwgbVByZXZpb3VzU2NoZWR1bGluZ0dyb3VwKFNQX0RFRkFVTFQpLAorICAgICAgbVNlbGVjdGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkKIHsKIH0KIApAQCAtNzYsNiArNzcsNyBAQAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgIGNhbGxiYWNrX3QgY2JmLAogICAgICAgICB2b2lkKiB1c2VyLApAQCAtODMsMTUgKzg1LDIwIEBACiAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlLAogICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICBpbnQgdWlkLAorICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMpCi0gICAgOiBtU3RhdHVzKE5PX0lOSVQpLCBtU2Vzc2lvbklkKEFVRElPX1NFU1NJT05fQUxMT0NBVEUpLAorICAgIDogbVN0YXR1cyhOT19JTklUKSwKKyAgICAgIG1PcFBhY2thZ2VOYW1lKG9wUGFja2FnZU5hbWUpLAorICAgICAgbVNlc3Npb25JZChBVURJT19TRVNTSU9OX0FMTE9DQVRFKSwKICAgICAgIG1QcmV2aW91c1ByaW9yaXR5KEFORFJPSURfUFJJT1JJVFlfTk9STUFMKSwKICAgICAgIG1QcmV2aW91c1NjaGVkdWxpbmdHcm91cChTUF9ERUZBVUxUKSwKLSAgICAgIG1Qcm94eShOVUxMKQorICAgICAgbVByb3h5KE5VTEwpLAorICAgICAgbVNlbGVjdGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkKIHsKICAgICBtU3RhdHVzID0gc2V0KGlucHV0U291cmNlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBjYmYsIHVzZXIsCiAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIGZsYWdzLAotICAgICAgICAgICAgcEF0dHJpYnV0ZXMpOworICAgICAgICAgICAgdWlkLCBwaWQsIHBBdHRyaWJ1dGVzKTsKIH0KIAogQXVkaW9SZWNvcmQ6On5BdWRpb1JlY29yZCgpCkBAIC0xMDcsMTIgKzExNCwxOCBAQAogICAgICAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkLT5yZXF1ZXN0RXhpdEFuZFdhaXQoKTsKICAgICAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC5jbGVhcigpOwogICAgICAgICB9CisgICAgICAgIC8vIE5vIGxvY2sgaGVyZTogd29yc3QgY2FzZSB3ZSByZW1vdmUgYSBOVUxMIGNhbGxiYWNrIHdoaWNoIHdpbGwgYmUgYSBub3AKKyAgICAgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwICYmIG1JbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLCBtSW5wdXQpOworICAgICAgICB9CiAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1BdWRpb1JlY29yZCktPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOwogICAgICAgICBtQXVkaW9SZWNvcmQuY2xlYXIoKTsKICAgICAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKICAgICAgICAgbUJ1ZmZlck1lbW9yeS5jbGVhcigpOwogICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgLTEpOworICAgICAgICBBTE9HVigifkF1ZGlvUmVjb3JkLCByZWxlYXNpbmcgc2Vzc2lvbiBpZCAlZCIsCisgICAgICAgICAgICAgICAgbVNlc3Npb25JZCk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgLTEgLypwaWQqLyk7CiAgICAgfQogfQogCkBAIC0xMjksMTIgKzE0MiwxNSBAQAogICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSwKICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgaW50IHVpZCwKKyAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzKQogewogICAgIEFMT0dWKCJzZXQoKTogaW5wdXRTb3VyY2UgJWQsIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCwgZnJhbWVDb3VudCAlenUsICIKLSAgICAgICAgICAibm90aWZpY2F0aW9uRnJhbWVzICV1LCBzZXNzaW9uSWQgJWQsIHRyYW5zZmVyVHlwZSAlZCwgZmxhZ3MgJSN4IiwKKyAgICAgICAgICAibm90aWZpY2F0aW9uRnJhbWVzICV1LCBzZXNzaW9uSWQgJWQsIHRyYW5zZmVyVHlwZSAlZCwgZmxhZ3MgJSN4LCBvcFBhY2thZ2VOYW1lICVzICIKKyAgICAgICAgICAidWlkICVkLCBwaWQgJWQiLAogICAgICAgICAgIGlucHV0U291cmNlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBub3RpZmljYXRpb25GcmFtZXMsCi0gICAgICAgICAgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIGZsYWdzKTsKKyAgICAgICAgICBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgZmxhZ3MsIFN0cmluZzgobU9wUGFja2FnZU5hbWUpLnN0cmluZygpLCB1aWQsIHBpZCk7CiAKICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewogICAgIGNhc2UgVFJBTlNGRVJfREVGQVVMVDoKQEAgLTE1OSw4ICsxNzUsNiBAQAogICAgIH0KICAgICBtVHJhbnNmZXIgPSB0cmFuc2ZlclR5cGU7CiAKLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0KICAgICAvLyBpbnZhcmlhbnQgdGhhdCBtQXVkaW9SZWNvcmQgIT0gMCBpcyB0cnVlIG9ubHkgYWZ0ZXIgc2V0KCkgcmV0dXJucyBzdWNjZXNzZnVsbHkKICAgICBpZiAobUF1ZGlvUmVjb3JkICE9IDApIHsKICAgICAgICAgQUxPR0UoIlRyYWNrIGFscmVhZHkgaW4gdXNlIik7CkBAIC0xODksMTMgKzIwMyw5IEBACiAgICAgfQogCiAgICAgLy8gdmFsaWRhdGUgcGFyYW1ldGVycwotICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkpIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgZm9ybWF0ICUjeCIsIGZvcm1hdCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIC8vIFRlbXBvcmFyeSByZXN0cmljdGlvbjogQXVkaW9GbGluZ2VyIGN1cnJlbnRseSBzdXBwb3J0cyAxNi1iaXQgUENNIG9ubHkKLSAgICBpZiAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7Ci0gICAgICAgIEFMT0dFKCJGb3JtYXQgJSN4IGlzIG5vdCBzdXBwb3J0ZWQiLCBmb3JtYXQpOworICAgIC8vIEF1ZGlvRmxpbmdlciBjYXB0dXJlIG9ubHkgc3VwcG9ydHMgbGluZWFyIFBDTQorICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkgfHwgIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgeworICAgICAgICBBTE9HRSgiRm9ybWF0ICUjeCBpcyBub3QgbGluZWFyIHBjbSIsIGZvcm1hdCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CkBAIC0yMjcsMTYgKzIzNywzMCBAQAogICAgIH0KICAgICBBTE9HVigic2V0KCk6IG1TZXNzaW9uSWQgJWQiLCBtU2Vzc2lvbklkKTsKIAorICAgIGludCBjYWxsaW5ncGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBteXBpZCA9IGdldHBpZCgpOworICAgIGlmICh1aWQgPT0gLTEgfHwgKGNhbGxpbmdwaWQgIT0gbXlwaWQpKSB7CisgICAgICAgIG1DbGllbnRVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUNsaWVudFVpZCA9IHVpZDsKKyAgICB9CisgICAgaWYgKHBpZCA9PSAtMSB8fCAoY2FsbGluZ3BpZCAhPSBteXBpZCkpIHsKKyAgICAgICAgbUNsaWVudFBpZCA9IGNhbGxpbmdwaWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUNsaWVudFBpZCA9IHBpZDsKKyAgICB9CisKICAgICBtRmxhZ3MgPSBmbGFnczsKICAgICBtQ2JmID0gY2JmOwogCiAgICAgaWYgKGNiZiAhPSBOVUxMKSB7CiAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZCA9IG5ldyBBdWRpb1JlY29yZFRocmVhZCgqdGhpcywgdGhyZWFkQ2FuQ2FsbEphdmEpOwogICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQtPnJ1bigiQXVkaW9SZWNvcmQiLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKKyAgICAgICAgLy8gdGhyZWFkIGJlZ2lucyBpbiBwYXVzZWQgc3RhdGUsIGFuZCB3aWxsIG5vdCByZWZlcmVuY2UgdXMgdW50aWwgc3RhcnQoKQogICAgIH0KIAogICAgIC8vIGNyZWF0ZSB0aGUgSUF1ZGlvUmVjb3JkCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gb3BlblJlY29yZF9sKDAgLyplcG9jaCovKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBvcGVuUmVjb3JkX2woMCAvKmVwb2NoKi8sIG1PcFBhY2thZ2VOYW1lKTsKIAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgaWYgKG1BdWRpb1JlY29yZFRocmVhZCAhPSAwKSB7CkBAIC0yODQsOSArMzA4LDEwIEBACiAgICAgbU5ld1Bvc2l0aW9uID0gbVByb3h5LT5nZXRQb3NpdGlvbigpICsgbVVwZGF0ZVBlcmlvZDsKICAgICBpbnQzMl90IGZsYWdzID0gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZtQ2Jsay0+bUZsYWdzKTsKIAorICAgIG1BY3RpdmUgPSB0cnVlOworCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgaWYgKCEoZmxhZ3MgJiBDQkxLX0lOVkFMSUQpKSB7Ci0gICAgICAgIEFMT0dWKCJtQXVkaW9SZWNvcmQtPnN0YXJ0KCkiKTsKICAgICAgICAgc3RhdHVzID0gbUF1ZGlvUmVjb3JkLT5zdGFydChldmVudCwgdHJpZ2dlclNlc3Npb24pOwogICAgICAgICBpZiAoc3RhdHVzID09IERFQURfT0JKRUNUKSB7CiAgICAgICAgICAgICBmbGFncyB8PSBDQkxLX0lOVkFMSUQ7CkBAIC0yOTcsOSArMzIyLDkgQEAKICAgICB9CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIG1BY3RpdmUgPSBmYWxzZTsKICAgICAgICAgQUxPR0UoInN0YXJ0KCkgc3RhdHVzICVkIiwgc3RhdHVzKTsKICAgICB9IGVsc2UgewotICAgICAgICBtQWN0aXZlID0gdHJ1ZTsKICAgICAgICAgc3A8QXVkaW9SZWNvcmRUaHJlYWQ+IHQgPSBtQXVkaW9SZWNvcmRUaHJlYWQ7CiAgICAgICAgIGlmICh0ICE9IDApIHsKICAgICAgICAgICAgIHQtPnJlc3VtZSgpOwpAQCAtMzUyLDYgKzM3NywxMCBAQAogICAgIG1NYXJrZXJQb3NpdGlvbiA9IG1hcmtlcjsKICAgICBtTWFya2VyUmVhY2hlZCA9IGZhbHNlOwogCisgICAgc3A8QXVkaW9SZWNvcmRUaHJlYWQ+IHQgPSBtQXVkaW9SZWNvcmRUaHJlYWQ7CisgICAgaWYgKHQgIT0gMCkgeworICAgICAgICB0LT53YWtlKCk7CisgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtMzc4LDYgKzQwNywxMCBAQAogICAgIG1OZXdQb3NpdGlvbiA9IG1Qcm94eS0+Z2V0UG9zaXRpb24oKSArIHVwZGF0ZVBlcmlvZDsKICAgICBtVXBkYXRlUGVyaW9kID0gdXBkYXRlUGVyaW9kOwogCisgICAgc3A8QXVkaW9SZWNvcmRUaHJlYWQ+IHQgPSBtQXVkaW9SZWNvcmRUaHJlYWQ7CisgICAgaWYgKHQgIT0gMCkgeworICAgICAgICB0LT53YWtlKCk7CisgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtNDA4LDE1ICs0NDEsNDIgQEAKIHVpbnQzMl90IEF1ZGlvUmVjb3JkOjpnZXRJbnB1dEZyYW1lc0xvc3QoKSBjb25zdAogewogICAgIC8vIG5vIG5lZWQgdG8gY2hlY2sgbUFjdGl2ZSwgYmVjYXVzZSBpZiBpbmFjdGl2ZSB0aGlzIHdpbGwgcmV0dXJuIDAsIHdoaWNoIGlzIHdoYXQgd2Ugd2FudAotICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGcmFtZXNMb3N0KGdldElucHV0KCkpOworICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGcmFtZXNMb3N0KGdldElucHV0UHJpdmF0ZSgpKTsKK30KKworLy8gLS0tLSBFeHBsaWNpdCBSb3V0aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OnNldElucHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIHsKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgaWYgKG1TZWxlY3RlZERldmljZUlkICE9IGRldmljZUlkKSB7CisgICAgICAgIG1TZWxlY3RlZERldmljZUlkID0gZGV2aWNlSWQ7CisgICAgICAgIC8vIHN0b3AgY2FwdHVyZSBzbyB0aGF0IGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGRvZXMgbm90IHJlamVjdCB0aGUgbmV3IGluc3RhbmNlIHN0YXJ0IHJlcXVlc3QKKyAgICAgICAgLy8gYXMgb25seSBvbmUgY2FwdHVyZSBjYW4gYmUgYWN0aXZlIGF0IGEgdGltZS4KKyAgICAgICAgaWYgKG1BdWRpb1JlY29yZCAhPSAwICYmIG1BY3RpdmUpIHsKKyAgICAgICAgICAgIG1BdWRpb1JlY29yZC0+c3RvcCgpOworICAgICAgICB9CisgICAgICAgIGFuZHJvaWRfYXRvbWljX29yKENCTEtfSU5WQUxJRCwgJm1DYmxrLT5tRmxhZ3MpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2F1ZGlvX3BvcnRfaGFuZGxlX3QgQXVkaW9SZWNvcmQ6OmdldElucHV0RGV2aWNlKCkgeworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbVNlbGVjdGVkRGV2aWNlSWQ7Cit9CisKK2F1ZGlvX3BvcnRfaGFuZGxlX3QgQXVkaW9SZWNvcmQ6OmdldFJvdXRlZERldmljZUlkKCkgeworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobUlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIH0KKyAgICByZXR1cm4gQXVkaW9TeXN0ZW06OmdldERldmljZUlkRm9ySW8obUlucHV0KTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyBtdXN0IGJlIGNhbGxlZCB3aXRoIG1Mb2NrIGhlbGQKLXN0YXR1c190IEF1ZGlvUmVjb3JkOjpvcGVuUmVjb3JkX2woc2l6ZV90IGVwb2NoKQorc3RhdHVzX3QgQXVkaW9SZWNvcmQ6Om9wZW5SZWNvcmRfbChzaXplX3QgZXBvY2gsIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKQogewotICAgIHN0YXR1c190IHN0YXR1czsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGF1ZGlvRmxpbmdlciA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIpOwpAQCAtNDMxLDEyICs0OTEsMTYgQEAKICAgICB9CiAKICAgICAvLyBDbGllbnQgY2FuIG9ubHkgZXhwcmVzcyBhIHByZWZlcmVuY2UgZm9yIEZBU1QuICBTZXJ2ZXIgd2lsbCBwZXJmb3JtIGFkZGl0aW9uYWwgdGVzdHMuCi0gICAgaWYgKChtRmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0ZBU1QpICYmICEoCi0gICAgICAgICAgICAvLyB1c2UgY2FzZTogY2FsbGJhY2sgdHJhbnNmZXIgbW9kZQotICAgICAgICAgICAgKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9DQUxMQkFDSykgJiYKKyAgICBpZiAoKG1GbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgJiYgISgoCisgICAgICAgICAgICAvLyBlaXRoZXIgb2YgdGhlc2UgdXNlIGNhc2VzOgorICAgICAgICAgICAgLy8gdXNlIGNhc2UgMTogY2FsbGJhY2sgdHJhbnNmZXIgbW9kZQorICAgICAgICAgICAgKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9DQUxMQkFDSykgfHwKKyAgICAgICAgICAgIC8vIHVzZSBjYXNlIDI6IG9idGFpbi9yZWxlYXNlIG1vZGUKKyAgICAgICAgICAgIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfT0JUQUlOKSkgJiYKICAgICAgICAgICAgIC8vIG1hdGNoaW5nIHNhbXBsZSByYXRlCiAgICAgICAgICAgICAobVNhbXBsZVJhdGUgPT0gYWZTYW1wbGVSYXRlKSkpIHsKLSAgICAgICAgQUxPR1coIkFVRElPX0lOUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgY2xpZW50Iik7CisgICAgICAgIEFMT0dXKCJBVURJT19JTlBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IGNsaWVudDsgdHJhbnNmZXIgJWQsIHRyYWNrICV1IEh6LCBwcmltYXJ5ICV1IEh6IiwKKyAgICAgICAgICAgICAgICBtVHJhbnNmZXIsIG1TYW1wbGVSYXRlLCBhZlNhbXBsZVJhdGUpOwogICAgICAgICAvLyBvbmNlIGRlbmllZCwgZG8gbm90IHJlcXVlc3QgYWdhaW4gaWYgSUF1ZGlvUmVjb3JkIGlzIHJlLWNyZWF0ZWQKICAgICAgICAgbUZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIChtRmxhZ3MgJiB+QVVESU9fSU5QVVRfRkxBR19GQVNUKTsKICAgICB9CkBAIC00NTEsOSArNTE1LDE2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDAgJiYgbUlucHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjaywgbUlucHV0KTsKKyAgICB9CisKICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dDsKLSAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGb3JBdHRyKCZtQXR0cmlidXRlcywgJmlucHV0LCAoYXVkaW9fc2Vzc2lvbl90KW1TZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgbUZsYWdzKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGb3JBdHRyKCZtQXR0cmlidXRlcywgJmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19zZXNzaW9uX3QpbVNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MsIG1TZWxlY3RlZERldmljZUlkKTsKIAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYXVkaW8gaW5wdXQgZm9yIHJlY29yZCBzb3VyY2UgJWQsIHNhbXBsZSByYXRlICV1LCBmb3JtYXQgJSN4LCAiCkBAIC00NzYsMTEgKzU0NywxNCBAQAogICAgIHNwPElNZW1vcnk+IGlNZW07ICAgICAgICAgICAvLyBmb3IgY2JsawogICAgIHNwPElNZW1vcnk+IGJ1ZmZlck1lbTsKICAgICBzcDxJQXVkaW9SZWNvcmQ+IHJlY29yZCA9IGF1ZGlvRmxpbmdlci0+b3BlblJlY29yZChpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0ZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50VWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtU2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaU1lbSwKQEAgLTU3Nyw2ICs2NTEsMTAgQEAKICAgICBtRGVhdGhOb3RpZmllciA9IG5ldyBEZWF0aE5vdGlmaWVyKHRoaXMpOwogICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1BdWRpb1JlY29yZCktPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKIAorICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCkgeworICAgICAgICBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2ssIG1JbnB1dCk7CisgICAgfQorCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KIApAQCAtNTg4LDE1ICs2NjYsMjEgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBBdWRpb1JlY29yZDo6b2J0YWluQnVmZmVyKEJ1ZmZlciogYXVkaW9CdWZmZXIsIGludDMyX3Qgd2FpdENvdW50KQorc3RhdHVzX3QgQXVkaW9SZWNvcmQ6Om9idGFpbkJ1ZmZlcihCdWZmZXIqIGF1ZGlvQnVmZmVyLCBpbnQzMl90IHdhaXRDb3VudCwgc2l6ZV90ICpub25Db250aWcpCiB7CiAgICAgaWYgKGF1ZGlvQnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgaWYgKG5vbkNvbnRpZyAhPSBOVUxMKSB7CisgICAgICAgICAgICAqbm9uQ29udGlnID0gMDsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBpZiAobVRyYW5zZmVyICE9IFRSQU5TRkVSX09CVEFJTikgewogICAgICAgICBhdWRpb0J1ZmZlci0+ZnJhbWVDb3VudCA9IDA7CiAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gMDsKICAgICAgICAgYXVkaW9CdWZmZXItPnJhdyA9IE5VTEw7CisgICAgICAgIGlmIChub25Db250aWcgIT0gTlVMTCkgeworICAgICAgICAgICAgKm5vbkNvbnRpZyA9IDA7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApAQCAtNjE1LDcgKzY5OSw3IEBACiAgICAgICAgIEFMT0dFKCIlcyBpbnZhbGlkIHdhaXRDb3VudCAlZCIsIF9fZnVuY19fLCB3YWl0Q291bnQpOwogICAgICAgICByZXF1ZXN0ZWQgPSBOVUxMOwogICAgIH0KLSAgICByZXR1cm4gb2J0YWluQnVmZmVyKGF1ZGlvQnVmZmVyLCByZXF1ZXN0ZWQpOworICAgIHJldHVybiBvYnRhaW5CdWZmZXIoYXVkaW9CdWZmZXIsIHJlcXVlc3RlZCwgTlVMTCAvKmVsYXBzZWQqLywgbm9uQ29udGlnKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6Om9idGFpbkJ1ZmZlcihCdWZmZXIqIGF1ZGlvQnVmZmVyLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnJlcXVlc3RlZCwKQEAgLTY4NCw5ICs3NjgsOSBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgQXVkaW9SZWNvcmQ6OnJlbGVhc2VCdWZmZXIoQnVmZmVyKiBhdWRpb0J1ZmZlcikKK3ZvaWQgQXVkaW9SZWNvcmQ6OnJlbGVhc2VCdWZmZXIoY29uc3QgQnVmZmVyKiBhdWRpb0J1ZmZlcikKIHsKLSAgICAvLyBhbGwgVFJBTlNGRVJfKiBhcmUgdmFsaWQKKyAgICAvLyBGSVhNRSBhZGQgZXJyb3IgY2hlY2tpbmcgb24gbW9kZSwgYnkgYWRkaW5nIGFuIGludGVybmFsIHZlcnNpb24KIAogICAgIHNpemVfdCBzdGVwQ291bnQgPSBhdWRpb0J1ZmZlci0+c2l6ZSAvIG1GcmFtZVNpemU7CiAgICAgaWYgKHN0ZXBDb3VudCA9PSAwKSB7CkBAIC03MDQsNyArNzg4LDcgQEAKICAgICAvLyB0aGUgc2VydmVyIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgZGlzYWJsZSByZWNvcmRlciBvbiBvdmVycnVuLCBzbyBubyBuZWVkIHRvIHJlc3RhcnQKIH0KIAotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9SZWNvcmQ6OmdldElucHV0KCkgY29uc3QKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUmVjb3JkOjpnZXRJbnB1dFByaXZhdGUoKSBjb25zdAogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gbUlucHV0OwpAQCAtNzEyLDcgKzc5Niw3IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotc3NpemVfdCBBdWRpb1JlY29yZDo6cmVhZCh2b2lkKiBidWZmZXIsIHNpemVfdCB1c2VyU2l6ZSkKK3NzaXplX3QgQXVkaW9SZWNvcmQ6OnJlYWQodm9pZCogYnVmZmVyLCBzaXplX3QgdXNlclNpemUsIGJvb2wgYmxvY2tpbmcpCiB7CiAgICAgaWYgKG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9TWU5DKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTczMSw3ICs4MTUsOCBAQAogICAgIHdoaWxlICh1c2VyU2l6ZSA+PSBtRnJhbWVTaXplKSB7CiAgICAgICAgIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPSB1c2VyU2l6ZSAvIG1GcmFtZVNpemU7CiAKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gb2J0YWluQnVmZmVyKCZhdWRpb0J1ZmZlciwgJkNsaWVudFByb3h5OjprRm9yZXZlcik7CisgICAgICAgIHN0YXR1c190IGVyciA9IG9idGFpbkJ1ZmZlcigmYXVkaW9CdWZmZXIsCisgICAgICAgICAgICAgICAgYmxvY2tpbmcgPyAmQ2xpZW50UHJveHk6OmtGb3JldmVyIDogJkNsaWVudFByb3h5OjprTm9uQmxvY2tpbmcpOwogICAgICAgICBpZiAoZXJyIDwgMCkgewogICAgICAgICAgICAgaWYgKHJlYWQgPiAwKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC04NjMsOCArOTQ4LDExIEBACiAgICAgaWYgKCFtYXJrZXJSZWFjaGVkICYmIHBvc2l0aW9uIDwgbWFya2VyUG9zaXRpb24pIHsKICAgICAgICAgbWluRnJhbWVzID0gbWFya2VyUG9zaXRpb24gLSBwb3NpdGlvbjsKICAgICB9Ci0gICAgaWYgKHVwZGF0ZVBlcmlvZCA+IDAgJiYgdXBkYXRlUGVyaW9kIDwgbWluRnJhbWVzKSB7Ci0gICAgICAgIG1pbkZyYW1lcyA9IHVwZGF0ZVBlcmlvZDsKKyAgICBpZiAodXBkYXRlUGVyaW9kID4gMCkgeworICAgICAgICB1aW50MzJfdCByZW1haW5pbmcgPSBuZXdQb3NpdGlvbiAtIHBvc2l0aW9uOworICAgICAgICBpZiAocmVtYWluaW5nIDwgbWluRnJhbWVzKSB7CisgICAgICAgICAgICBtaW5GcmFtZXMgPSByZW1haW5pbmc7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBJZiA+IDAsIHBvbGwgcGVyaW9kaWNhbGx5IHRvIHJlY292ZXIgZnJvbSBhIHN0dWNrIHNlcnZlci4gIEEgZ29vZCB2YWx1ZSBpcyAyLgpAQCAtOTkwLDE0ICsxMDc4LDEzIEBACiB7CiAgICAgQUxPR1coImRlYWQgSUF1ZGlvUmVjb3JkLCBjcmVhdGluZyBhIG5ldyBvbmUgZnJvbSAlcygpIiwgZnJvbSk7CiAgICAgKyttU2VxdWVuY2U7Ci0gICAgc3RhdHVzX3QgcmVzdWx0OwogCiAgICAgLy8gaWYgdGhlIG5ldyBJQXVkaW9SZWNvcmQgaXMgY3JlYXRlZCwgb3BlblJlY29yZF9sKCkgd2lsbCBtb2RpZnkgdGhlCiAgICAgLy8gZm9sbG93aW5nIG1lbWJlciB2YXJpYWJsZXM6IG1BdWRpb1JlY29yZCwgbUNibGtNZW1vcnksIG1DYmxrLCBtQnVmZmVyTWVtb3J5LgogICAgIC8vIEl0IHdpbGwgYWxzbyBkZWxldGUgdGhlIHN0cm9uZyByZWZlcmVuY2VzIG9uIHByZXZpb3VzIElBdWRpb1JlY29yZCBhbmQgSU1lbW9yeQogICAgIHNpemVfdCBwb3NpdGlvbiA9IG1Qcm94eS0+Z2V0UG9zaXRpb24oKTsKICAgICBtTmV3UG9zaXRpb24gPSBwb3NpdGlvbiArIG1VcGRhdGVQZXJpb2Q7Ci0gICAgcmVzdWx0ID0gb3BlblJlY29yZF9sKHBvc2l0aW9uKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBvcGVuUmVjb3JkX2wocG9zaXRpb24sIG1PcFBhY2thZ2VOYW1lKTsKICAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7CiAgICAgICAgIGlmIChtQWN0aXZlKSB7CiAgICAgICAgICAgICAvLyBjYWxsYmFjayB0aHJlYWQgb3Igc3luYyBldmVudCBoYXNuJ3QgY2hhbmdlZApAQCAtMTAxMyw2ICsxMTAwLDQ4IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaykKK3sKKyAgICBpZiAoY2FsbGJhY2sgPT0gMCkgeworICAgICAgICBBTE9HVygiJXMgYWRkaW5nIE5VTEwgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgPT0gY2FsbGJhY2spIHsKKyAgICAgICAgQUxPR1coIiVzIGFkZGluZyBzYW1lIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgaWYgKG1JbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyBjYWxsYmFjayBhbHJlYWR5IHByZXNlbnQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjaywgbUlucHV0KTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjYWxsYmFjaywgbUlucHV0KTsKKyAgICB9CisgICAgbURldmljZUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soCisgICAgICAgIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spCit7CisgICAgaWYgKGNhbGxiYWNrID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzIHJlbW92aW5nIE5VTEwgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gY2FsbGJhY2spIHsKKyAgICAgICAgQUxPR1coIiVzIHJlbW92aW5nIGRpZmZlcmVudCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGlmIChtSW5wdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLCBtSW5wdXQpOworICAgIH0KKyAgICBtRGV2aWNlQ2FsbGJhY2sgPSAwOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiB2b2lkIEF1ZGlvUmVjb3JkOjpEZWF0aE5vdGlmaWVyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpCkBAIC0xMDY5LDggKzExOTgsOCBAQAogICAgIGNhc2UgTlNfTkVWRVI6CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBjYXNlIE5TX1dIRU5FVkVSOgotICAgICAgICAvLyBGSVhNRSBpbmNyZWFzZSBwb2xsIGludGVydmFsLCBvciBtYWtlIGV2ZW50LWRyaXZlbgotICAgICAgICBucyA9IDEwMDAwMDAwMDBMTDsKKyAgICAgICAgLy8gRXZlbnQgZHJpdmVuOiBjYWxsIHdha2UoKSB3aGVuIGNhbGxiYWNrIG5vdGlmaWNhdGlvbnMgY29uZGl0aW9ucyBjaGFuZ2UuCisgICAgICAgIG5zID0gSU5UNjRfTUFYOwogICAgICAgICAvLyBmYWxsIHRocm91Z2gKICAgICBkZWZhdWx0OgogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5zIDwgMCwgInByb2Nlc3NBdWRpb0J1ZmZlcigpIHJldHVybmVkICUiIFBSSWQ2NCwgbnMpOwpAQCAtMTEwMyw2ICsxMjMyLDIxIEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvUmVjb3JkOjpBdWRpb1JlY29yZFRocmVhZDo6d2FrZSgpCit7CisgICAgQXV0b011dGV4IF9sKG1NeUxvY2spOworICAgIGlmICghbVBhdXNlZCkgeworICAgICAgICAvLyB3YWtlKCkgbWlnaHQgYmUgY2FsbGVkIHdoaWxlIHNlcnZpY2luZyBhIGNhbGxiYWNrIC0gaWdub3JlIHRoZSBuZXh0CisgICAgICAgIC8vIHBhdXNlIHRpbWUgYW5kIGNhbGwgcHJvY2Vzc0F1ZGlvQnVmZmVyLgorICAgICAgICBtSWdub3JlTmV4dFBhdXNlZEludCA9IHRydWU7CisgICAgICAgIGlmIChtUGF1c2VkSW50ICYmIG1QYXVzZWROcyA+IDApIHsKKyAgICAgICAgICAgIC8vIGF1ZGlvIHJlY29yZCBpcyBhY3RpdmUgYW5kIGludGVybmFsbHkgcGF1c2VkIHdpdGggdGltZW91dC4KKyAgICAgICAgICAgIG1QYXVzZWRJbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1NeUNvbmQuc2lnbmFsKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHZvaWQgQXVkaW9SZWNvcmQ6OkF1ZGlvUmVjb3JkVGhyZWFkOjpwYXVzZUludGVybmFsKG5zZWNzX3QgbnMpCiB7CiAgICAgQXV0b011dGV4IF9sKG1NeUxvY2spOwpAQCAtMTExMiw0ICsxMjU2LDQgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwCmluZGV4IDljYWUyMWMuLjNiZmIwOWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAKQEAgLTMyLDIzICszMiwxMiBAQAogCiAvLyBjbGllbnQgc2luZ2xldG9uIGZvciBBdWRpb0ZsaW5nZXIgYmluZGVyIGludGVyZmFjZQogTXV0ZXggQXVkaW9TeXN0ZW06OmdMb2NrOwotTXV0ZXggQXVkaW9TeXN0ZW06OmdMb2NrQ2FjaGU7CiBNdXRleCBBdWRpb1N5c3RlbTo6Z0xvY2tBUFM7Ci1NdXRleCBBdWRpb1N5c3RlbTo6Z0xvY2tBUEM7CiBzcDxJQXVkaW9GbGluZ2VyPiBBdWRpb1N5c3RlbTo6Z0F1ZGlvRmxpbmdlcjsKIHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ+IEF1ZGlvU3lzdGVtOjpnQXVkaW9GbGluZ2VyQ2xpZW50OwogYXVkaW9fZXJyb3JfY2FsbGJhY2sgQXVkaW9TeXN0ZW06OmdBdWRpb0Vycm9yQ2FsbGJhY2sgPSBOVUxMOworZHluYW1pY19wb2xpY3lfY2FsbGJhY2sgQXVkaW9TeXN0ZW06OmdEeW5Qb2xpY3lDYWxsYmFjayA9IE5VTEw7CiAKLS8vIENhY2hlZCB2YWx1ZXMgZm9yIG91dHB1dCBoYW5kbGVzCi1EZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIEF1ZGlvU3lzdGVtOjpPdXRwdXREZXNjcmlwdG9yICo+IEF1ZGlvU3lzdGVtOjpnT3V0cHV0cyhOVUxMKTsKLQotLy8gQ2FjaGVkIHZhbHVlcyBmb3IgcmVjb3JkaW5nIHF1ZXJpZXMsIGFsbCBwcm90ZWN0ZWQgYnkgZ0xvY2sKLXVpbnQzMl90IEF1ZGlvU3lzdGVtOjpnUHJldkluU2FtcGxpbmdSYXRlOwotYXVkaW9fZm9ybWF0X3QgQXVkaW9TeXN0ZW06OmdQcmV2SW5Gb3JtYXQ7Ci1hdWRpb19jaGFubmVsX21hc2tfdCBBdWRpb1N5c3RlbTo6Z1ByZXZJbkNoYW5uZWxNYXNrOwotc2l6ZV90IEF1ZGlvU3lzdGVtOjpnSW5CdWZmU2l6ZSA9IDA7ICAgIC8vIHplcm8gaW5kaWNhdGVzIGNhY2hlIGlzIGludmFsaWQKLQotc3A8QXVkaW9TeXN0ZW06OkF1ZGlvUG9ydENhbGxiYWNrPiBBdWRpb1N5c3RlbTo6Z0F1ZGlvUG9ydENhbGxiYWNrOwogCiAvLyBlc3RhYmxpc2ggYmluZGVyIGludGVyZmFjZSB0byBBdWRpb0ZsaW5nZXIgc2VydmljZQogY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCkKQEAgLTg3LDYgKzc2LDI1IEBACiAgICAgcmV0dXJuIGFmOwogfQogCitjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9GbGluZ2VyQ2xpZW50PiBBdWRpb1N5c3RlbTo6Z2V0QXVkaW9GbGluZ2VyQ2xpZW50KCkKK3sKKyAgICAvLyBjYWxsaW5nIGdldF9hdWRpb19mbGluZ2VyKCkgd2lsbCBpbml0aWFsaXplIGdBdWRpb0ZsaW5nZXJDbGllbnQgaWYgbmVlZGVkCisgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHJldHVybiAwOworICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7CisgICAgcmV0dXJuIGdBdWRpb0ZsaW5nZXJDbGllbnQ7Cit9CisKK3NwPEF1ZGlvSW9EZXNjcmlwdG9yPiBBdWRpb1N5c3RlbTo6Z2V0SW9EZXNjcmlwdG9yKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKQoreworICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBkZXNjOworICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlckNsaWVudD4gYWZjID0gZ2V0QXVkaW9GbGluZ2VyQ2xpZW50KCk7CisgICAgaWYgKGFmYyAhPSAwKSB7CisgICAgICAgIGRlc2MgPSBhZmMtPmdldElvRGVzY3JpcHRvcihpb0hhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBkZXNjOworfQorCiAvKiBzdGF0aWMgKi8gc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmNoZWNrQXVkaW9GbGluZ2VyKCkKIHsKICAgICBpZiAoZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmNoZWNrU2VydmljZShTdHJpbmcxNigibWVkaWEuYXVkaW9fZmxpbmdlciIpKSAhPSAwKSB7CkBAIC0yNjAsMTggKzI2OCwxMyBAQAogewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2tDYWNoZSk7Ci0KLSAgICBPdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gQXVkaW9TeXN0ZW06OmdPdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgaWYgKG91dHB1dERlc2MgPT0gTlVMTCkgeworICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gZ2V0SW9EZXNjcmlwdG9yKG91dHB1dCk7CisgICAgaWYgKG91dHB1dERlc2MgPT0gMCkgewogICAgICAgICBBTE9HVigiZ2V0T3V0cHV0U2FtcGxpbmdSYXRlKCkgbm8gb3V0cHV0IGRlc2NyaXB0b3IgZm9yIG91dHB1dCAlZCBpbiBnT3V0cHV0cyIsIG91dHB1dCk7Ci0gICAgICAgIGdMb2NrQ2FjaGUudW5sb2NrKCk7CiAgICAgICAgICpzYW1wbGluZ1JhdGUgPSBhZi0+c2FtcGxlUmF0ZShvdXRwdXQpOwotICAgICAgICBnTG9ja0NhY2hlLmxvY2soKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigiZ2V0T3V0cHV0U2FtcGxpbmdSYXRlKCkgcmVhZGluZyBmcm9tIG91dHB1dCBkZXNjIik7Ci0gICAgICAgICpzYW1wbGluZ1JhdGUgPSBvdXRwdXREZXNjLT5zYW1wbGluZ1JhdGU7CisgICAgICAgICpzYW1wbGluZ1JhdGUgPSBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlOwogICAgIH0KICAgICBpZiAoKnNhbXBsaW5nUmF0ZSA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCJBdWRpb1N5c3RlbTo6Z2V0U2FtcGxpbmdSYXRlIGZhaWxlZCBmb3Igb3V0cHV0ICVkIiwgb3V0cHV0KTsKQEAgLTMwNCwxNiArMzA3LDExIEBACiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9ja0NhY2hlKTsKLQotICAgIE91dHB1dERlc2NyaXB0b3IgKm91dHB1dERlc2MgPSBBdWRpb1N5c3RlbTo6Z091dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICBpZiAob3V0cHV0RGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgIGdMb2NrQ2FjaGUudW5sb2NrKCk7CisgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBnZXRJb0Rlc2NyaXB0b3Iob3V0cHV0KTsKKyAgICBpZiAob3V0cHV0RGVzYyA9PSAwKSB7CiAgICAgICAgICpmcmFtZUNvdW50ID0gYWYtPmZyYW1lQ291bnQob3V0cHV0KTsKLSAgICAgICAgZ0xvY2tDYWNoZS5sb2NrKCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgKmZyYW1lQ291bnQgPSBvdXRwdXREZXNjLT5mcmFtZUNvdW50OworICAgICAgICAqZnJhbWVDb3VudCA9IG91dHB1dERlc2MtPm1GcmFtZUNvdW50OwogICAgIH0KICAgICBpZiAoKmZyYW1lQ291bnQgPT0gMCkgewogICAgICAgICBBTE9HRSgiQXVkaW9TeXN0ZW06OmdldEZyYW1lQ291bnQgZmFpbGVkIGZvciBvdXRwdXQgJWQiLCBvdXRwdXQpOwpAQCAtMzQ2LDE2ICszNDQsMTEgQEAKIHsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrQ2FjaGUpOwotCi0gICAgT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYyA9IEF1ZGlvU3lzdGVtOjpnT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgIGlmIChvdXRwdXREZXNjID09IE5VTEwpIHsKLSAgICAgICAgZ0xvY2tDYWNoZS51bmxvY2soKTsKKyAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IGdldElvRGVzY3JpcHRvcihvdXRwdXQpOworICAgIGlmIChvdXRwdXREZXNjID09IDApIHsKICAgICAgICAgKmxhdGVuY3kgPSBhZi0+bGF0ZW5jeShvdXRwdXQpOwotICAgICAgICBnTG9ja0NhY2hlLmxvY2soKTsKICAgICB9IGVsc2UgewotICAgICAgICAqbGF0ZW5jeSA9IG91dHB1dERlc2MtPmxhdGVuY3k7CisgICAgICAgICpsYXRlbmN5ID0gb3V0cHV0RGVzYy0+bUxhdGVuY3k7CiAgICAgfQogCiAgICAgQUxPR1YoImdldExhdGVuY3koKSBvdXRwdXQgJWQsIGxhdGVuY3kgJWQiLCBvdXRwdXQsICpsYXRlbmN5KTsKQEAgLTM2NiwzNCArMzU5LDExIEBACiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRCdWZmZXJTaXplKHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIHNpemVfdCogYnVmZlNpemUpCiB7Ci0gICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlckNsaWVudD4gYWZjID0gZ2V0QXVkaW9GbGluZ2VyQ2xpZW50KCk7CisgICAgaWYgKGFmYyA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2tDYWNoZSk7Ci0gICAgLy8gRG8gd2UgaGF2ZSBhIHN0YWxlIGdJbkJ1ZmZlclNpemUgb3IgYXJlIHdlIHJlcXVlc3RpbmcgdGhlIGlucHV0IGJ1ZmZlciBzaXplIGZvciBuZXcgdmFsdWVzCi0gICAgc2l6ZV90IGluQnVmZlNpemUgPSBnSW5CdWZmU2l6ZTsKLSAgICBpZiAoKGluQnVmZlNpemUgPT0gMCkgfHwgKHNhbXBsZVJhdGUgIT0gZ1ByZXZJblNhbXBsaW5nUmF0ZSkgfHwgKGZvcm1hdCAhPSBnUHJldkluRm9ybWF0KQotICAgICAgICB8fCAoY2hhbm5lbE1hc2sgIT0gZ1ByZXZJbkNoYW5uZWxNYXNrKSkgewotICAgICAgICBnTG9ja0NhY2hlLnVubG9jaygpOwotICAgICAgICBpbkJ1ZmZTaXplID0gYWYtPmdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKLSAgICAgICAgZ0xvY2tDYWNoZS5sb2NrKCk7Ci0gICAgICAgIGlmIChpbkJ1ZmZTaXplID09IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJBdWRpb1N5c3RlbTo6Z2V0SW5wdXRCdWZmZXJTaXplIGZhaWxlZCBzYW1wbGVSYXRlICVkIGZvcm1hdCAlI3ggY2hhbm5lbE1hc2sgJXgiLAotICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQSBiZW5pZ24gcmFjZSBpcyBwb3NzaWJsZSBoZXJlOiB3ZSBjb3VsZCBvdmVyd3JpdGUgYSBmcmVzaGVyIGNhY2hlIGVudHJ5Ci0gICAgICAgIC8vIHNhdmUgdGhlIHJlcXVlc3QgcGFyYW1zCi0gICAgICAgIGdQcmV2SW5TYW1wbGluZ1JhdGUgPSBzYW1wbGVSYXRlOwotICAgICAgICBnUHJldkluRm9ybWF0ID0gZm9ybWF0OwotICAgICAgICBnUHJldkluQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKLQotICAgICAgICBnSW5CdWZmU2l6ZSA9IGluQnVmZlNpemU7Ci0gICAgfQotICAgICpidWZmU2l6ZSA9IGluQnVmZlNpemU7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgcmV0dXJuIGFmYy0+Z2V0SW5wdXRCdWZmZXJTaXplKHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGJ1ZmZTaXplKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZhbHVlKQpAQCAtNDUzLDggKzQyMywyNiBAQAogICAgIHJldHVybiBhZi0+Z2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uKHNlc3Npb25JZCk7CiB9CiAKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzeXN0ZW1SZWFkeSgpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBhZi0+c3lzdGVtUmVhZHkoKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKKwordm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9GbGluZ2VyQ2xpZW50OjpjbGVhcklvQ2FjaGUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUlvRGVzY3JpcHRvcnMuY2xlYXIoKTsKKyAgICBtSW5CdWZmU2l6ZSA9IDA7CisgICAgbUluU2FtcGxpbmdSYXRlID0gMDsKKyAgICBtSW5Gb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKKyAgICBtSW5DaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKK30KKwogdm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9GbGluZ2VyQ2xpZW50OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpCiB7CiAgICAgYXVkaW9fZXJyb3JfY2FsbGJhY2sgY2IgPSBOVUxMOwpAQCAtNDY0LDExICs0NTIsOCBAQAogICAgICAgICBjYiA9IGdBdWRpb0Vycm9yQ2FsbGJhY2s7CiAgICAgfQogCi0gICAgewotICAgICAgICAvLyBjbGVhciBvdXRwdXQgaGFuZGxlcyBhbmQgc3RyZWFtIHRvIG91dHB1dCBtYXAgY2FjaGVzCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9ja0NhY2hlKTsKLSAgICAgICAgQXVkaW9TeXN0ZW06OmdPdXRwdXRzLmNsZWFyKCk7Ci0gICAgfQorICAgIC8vIGNsZWFyIG91dHB1dCBoYW5kbGVzIGFuZCBzdHJlYW0gdG8gb3V0cHV0IG1hcCBjYWNoZXMKKyAgICBjbGVhcklvQ2FjaGUoKTsKIAogICAgIGlmIChjYikgewogICAgICAgICBjYihERUFEX09CSkVDVCk7CkBAIC00NzYsNzYgKzQ2MSwxOTEgQEAKICAgICBBTE9HVygiQXVkaW9GbGluZ2VyIHNlcnZlciBkaWVkISIpOwogfQogCi12b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ6OmlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAotICAgICAgICBjb25zdCB2b2lkICpwYXJhbTIpIHsKK3ZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvRmxpbmdlckNsaWVudDo6aW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiYgaW9EZXNjKSB7CiAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIGV2ZW50ICVkIiwgZXZlbnQpOwotICAgIGNvbnN0IE91dHB1dERlc2NyaXB0b3IgKmRlc2M7Ci0gICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW07CiAKLSAgICBpZiAoaW9IYW5kbGUgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHJldHVybjsKKyAgICBpZiAoaW9EZXNjID09IDAgfHwgaW9EZXNjLT5tSW9IYW5kbGUgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHJldHVybjsKIAotICAgIE11dGV4OjpBdXRvbG9jayBfbChBdWRpb1N5c3RlbTo6Z0xvY2tDYWNoZSk7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgVmVjdG9yIDwgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gPiBjYWxsYmFja3M7CiAKLSAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBTVFJFQU1fQ09ORklHX0NIQU5HRUQ6Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgT1VUUFVUX09QRU5FRDogewotICAgICAgICBpZiAoZ091dHB1dHMuaW5kZXhPZktleShpb0hhbmRsZSkgPj0gMCkgewotICAgICAgICAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIG9wZW5pbmcgYWxyZWFkeSBleGlzdGluZyBvdXRwdXQhICVkIiwgaW9IYW5kbGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmFtMiA9PSBOVUxMKSBicmVhazsKLSAgICAgICAgZGVzYyA9IChjb25zdCBPdXRwdXREZXNjcmlwdG9yICopcGFyYW0yOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAotICAgICAgICBPdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gIG5ldyBPdXRwdXREZXNjcmlwdG9yKCpkZXNjKTsKLSAgICAgICAgZ091dHB1dHMuYWRkKGlvSGFuZGxlLCBvdXRwdXREZXNjKTsKLSAgICAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIG5ldyBvdXRwdXQgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJSN4IGNoYW5uZWwgbWFzayAlI3ggZnJhbWVDb3VudCAlenUgIgotICAgICAgICAgICAgICAgICJsYXRlbmN5ICVkIiwKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5zYW1wbGluZ1JhdGUsIG91dHB1dERlc2MtPmZvcm1hdCwgb3V0cHV0RGVzYy0+Y2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZnJhbWVDb3VudCwgb3V0cHV0RGVzYy0+bGF0ZW5jeSk7CisgICAgICAgIHN3aXRjaCAoZXZlbnQpIHsKKyAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfT1BFTkVEOgorICAgICAgICBjYXNlIEFVRElPX0lOUFVUX09QRU5FRDogeworICAgICAgICAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IG9sZERlc2MgPSBnZXRJb0Rlc2NyaXB0b3IoaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgaWYgKG9sZERlc2MgPT0gMCkgeworICAgICAgICAgICAgICAgIG1Jb0Rlc2NyaXB0b3JzLmFkZChpb0Rlc2MtPm1Jb0hhbmRsZSwgaW9EZXNjKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGV2aWNlSWQgPSBvbGREZXNjLT5nZXREZXZpY2VJZCgpOworICAgICAgICAgICAgICAgIG1Jb0Rlc2NyaXB0b3JzLnJlcGxhY2VWYWx1ZUZvcihpb0Rlc2MtPm1Jb0hhbmRsZSwgaW9EZXNjKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlvRGVzYy0+Z2V0RGV2aWNlSWQoKSAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlSWQgPSBpb0Rlc2MtPmdldERldmljZUlkKCk7CisgICAgICAgICAgICAgICAgc3NpemVfdCBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmluZGV4T2ZLZXkoaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgIGlmIChpb0luZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLnZhbHVlQXQoaW9JbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIG5ldyAlcyBvcGVuZWQgJWQgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJSN4IGNoYW5uZWwgbWFzayAlI3ggIgorICAgICAgICAgICAgICAgICAgICAiZnJhbWVDb3VudCAlenUgZGV2aWNlSWQgJWQiLCBldmVudCA9PSBBVURJT19PVVRQVVRfT1BFTkVEID8gIm91dHB1dCIgOiAiaW5wdXQiLAorICAgICAgICAgICAgICAgICAgICBpb0Rlc2MtPm1Jb0hhbmRsZSwgaW9EZXNjLT5tU2FtcGxpbmdSYXRlLCBpb0Rlc2MtPm1Gb3JtYXQsIGlvRGVzYy0+bUNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICBpb0Rlc2MtPm1GcmFtZUNvdW50LCBpb0Rlc2MtPmdldERldmljZUlkKCkpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfQ0xPU0VEOgorICAgICAgICBjYXNlIEFVRElPX0lOUFVUX0NMT1NFRDogeworICAgICAgICAgICAgaWYgKGdldElvRGVzY3JpcHRvcihpb0Rlc2MtPm1Jb0hhbmRsZSkgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJpb0NvbmZpZ0NoYW5nZWQoKSBjbG9zaW5nIHVua25vd24gJXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID09IEFVRElPX09VVFBVVF9DTE9TRUQgPyAib3V0cHV0IiA6ICJpbnB1dCIsIGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSAlcyAlZCBjbG9zZWQiLAorICAgICAgICAgICAgICAgICAgZXZlbnQgPT0gQVVESU9fT1VUUFVUX0NMT1NFRCA/ICJvdXRwdXQiIDogImlucHV0IiwgaW9EZXNjLT5tSW9IYW5kbGUpOworCisgICAgICAgICAgICBtSW9EZXNjcmlwdG9ycy5yZW1vdmVJdGVtKGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrcy5yZW1vdmVJdGVtKGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQ6CisgICAgICAgIGNhc2UgQVVESU9fSU5QVVRfQ09ORklHX0NIQU5HRUQ6IHsKKyAgICAgICAgICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBvbGREZXNjID0gZ2V0SW9EZXNjcmlwdG9yKGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChvbGREZXNjID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiaW9Db25maWdDaGFuZ2VkKCkgbW9kaWZ5aW5nIHVua25vd24gb3V0cHV0ISAlZCIsIGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGV2aWNlSWQgPSBvbGREZXNjLT5nZXREZXZpY2VJZCgpOworICAgICAgICAgICAgbUlvRGVzY3JpcHRvcnMucmVwbGFjZVZhbHVlRm9yKGlvRGVzYy0+bUlvSGFuZGxlLCBpb0Rlc2MpOworCisgICAgICAgICAgICBpZiAoZGV2aWNlSWQgIT0gaW9EZXNjLT5nZXREZXZpY2VJZCgpKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlSWQgPSBpb0Rlc2MtPmdldERldmljZUlkKCk7CisgICAgICAgICAgICAgICAgc3NpemVfdCBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmluZGV4T2ZLZXkoaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgIGlmIChpb0luZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLnZhbHVlQXQoaW9JbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIG5ldyBjb25maWcgZm9yICVzICVkIHNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICUjeCAiCisgICAgICAgICAgICAgICAgICAgICJjaGFubmVsIG1hc2sgJSN4IGZyYW1lQ291bnQgJXp1IGRldmljZUlkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQgPT0gQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEID8gIm91dHB1dCIgOiAiaW5wdXQiLAorICAgICAgICAgICAgICAgICAgICBpb0Rlc2MtPm1Jb0hhbmRsZSwgaW9EZXNjLT5tU2FtcGxpbmdSYXRlLCBpb0Rlc2MtPm1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIGlvRGVzYy0+bUNoYW5uZWxNYXNrLCBpb0Rlc2MtPm1GcmFtZUNvdW50LCBpb0Rlc2MtPmdldERldmljZUlkKCkpOworCiAgICAgICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBPVVRQVVRfQ0xPU0VEOiB7Ci0gICAgICAgIGlmIChnT3V0cHV0cy5pbmRleE9mS2V5KGlvSGFuZGxlKSA8IDApIHsKLSAgICAgICAgICAgIEFMT0dXKCJpb0NvbmZpZ0NoYW5nZWQoKSBjbG9zaW5nIHVua25vd24gb3V0cHV0ISAlZCIsIGlvSGFuZGxlKTsKLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBvdXRwdXQgJWQgY2xvc2VkIiwgaW9IYW5kbGUpOwotCi0gICAgICAgIGdPdXRwdXRzLnJlbW92ZUl0ZW0oaW9IYW5kbGUpOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBPVVRQVVRfQ09ORklHX0NIQU5HRUQ6IHsKLSAgICAgICAgaW50IGluZGV4ID0gZ091dHB1dHMuaW5kZXhPZktleShpb0hhbmRsZSk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIEFMT0dXKCJpb0NvbmZpZ0NoYW5nZWQoKSBtb2RpZnlpbmcgdW5rbm93biBvdXRwdXQhICVkIiwgaW9IYW5kbGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmFtMiA9PSBOVUxMKSBicmVhazsKLSAgICAgICAgZGVzYyA9IChjb25zdCBPdXRwdXREZXNjcmlwdG9yICopcGFyYW0yOwotCi0gICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgY29uZmlnIGZvciBvdXRwdXQgJWQgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJSN4IGNoYW5uZWwgbWFzayAlI3ggIgotICAgICAgICAgICAgICAgICJmcmFtZUNvdW50ICV6dSBsYXRlbmN5ICVkIiwKLSAgICAgICAgICAgICAgICBpb0hhbmRsZSwgZGVzYy0+c2FtcGxpbmdSYXRlLCBkZXNjLT5mb3JtYXQsCi0gICAgICAgICAgICAgICAgZGVzYy0+Y2hhbm5lbE1hc2ssIGRlc2MtPmZyYW1lQ291bnQsIGRlc2MtPmxhdGVuY3kpOwotICAgICAgICBPdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gZ091dHB1dHMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgIGRlbGV0ZSBvdXRwdXREZXNjOwotICAgICAgICBvdXRwdXREZXNjID0gIG5ldyBPdXRwdXREZXNjcmlwdG9yKCpkZXNjKTsKLSAgICAgICAgZ091dHB1dHMucmVwbGFjZVZhbHVlRm9yKGlvSGFuZGxlLCBvdXRwdXREZXNjKTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgSU5QVVRfT1BFTkVEOgotICAgIGNhc2UgSU5QVVRfQ0xPU0VEOgotICAgIGNhc2UgSU5QVVRfQ09ORklHX0NIQU5HRUQ6Ci0gICAgICAgIGJyZWFrOwotCisgICAgfQorICAgIC8vIGNhbGxiYWNrcy5zaXplKCkgIT0gMCA9PiAgaW9EZXNjLT5tSW9IYW5kbGUgYW5kIGRldmljZUlkIGFyZSB2YWxpZAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNhbGxiYWNrc1tpXS0+b25BdWRpb0RldmljZVVwZGF0ZShpb0Rlc2MtPm1Jb0hhbmRsZSwgZGV2aWNlSWQpOwogICAgIH0KIH0KIAotdm9pZCBBdWRpb1N5c3RlbTo6c2V0RXJyb3JDYWxsYmFjayhhdWRpb19lcnJvcl9jYWxsYmFjayBjYikKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ6OmdldElucHV0QnVmZmVyU2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBzaXplX3QqIGJ1ZmZTaXplKQoreworICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAvLyBEbyB3ZSBoYXZlIGEgc3RhbGUgbUluQnVmZlNpemUgb3IgYXJlIHdlIHJlcXVlc3RpbmcgdGhlIGlucHV0IGJ1ZmZlciBzaXplIGZvciBuZXcgdmFsdWVzCisgICAgaWYgKChtSW5CdWZmU2l6ZSA9PSAwKSB8fCAoc2FtcGxlUmF0ZSAhPSBtSW5TYW1wbGluZ1JhdGUpIHx8IChmb3JtYXQgIT0gbUluRm9ybWF0KQorICAgICAgICB8fCAoY2hhbm5lbE1hc2sgIT0gbUluQ2hhbm5lbE1hc2spKSB7CisgICAgICAgIHNpemVfdCBpbkJ1ZmZTaXplID0gYWYtPmdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgaWYgKGluQnVmZlNpemUgPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkF1ZGlvU3lzdGVtOjpnZXRJbnB1dEJ1ZmZlclNpemUgZmFpbGVkIHNhbXBsZVJhdGUgJWQgZm9ybWF0ICUjeCBjaGFubmVsTWFzayAleCIsCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2spOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICAvLyBBIGJlbmlnbiByYWNlIGlzIHBvc3NpYmxlIGhlcmU6IHdlIGNvdWxkIG92ZXJ3cml0ZSBhIGZyZXNoZXIgY2FjaGUgZW50cnkKKyAgICAgICAgLy8gc2F2ZSB0aGUgcmVxdWVzdCBwYXJhbXMKKyAgICAgICAgbUluU2FtcGxpbmdSYXRlID0gc2FtcGxlUmF0ZTsKKyAgICAgICAgbUluRm9ybWF0ID0gZm9ybWF0OworICAgICAgICBtSW5DaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOworCisgICAgICAgIG1JbkJ1ZmZTaXplID0gaW5CdWZmU2l6ZTsKKyAgICB9CisKKyAgICAqYnVmZlNpemUgPSBtSW5CdWZmU2l6ZTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ6OmdldElvRGVzY3JpcHRvcihhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkKK3sKKyAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gZGVzYzsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUlvRGVzY3JpcHRvcnMuaW5kZXhPZktleShpb0hhbmRsZSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgZGVzYyA9IG1Jb0Rlc2NyaXB0b3JzLnZhbHVlQXQoaW5kZXgpOworICAgIH0KKyAgICByZXR1cm4gZGVzYzsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OkF1ZGlvRmxpbmdlckNsaWVudDo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjaygKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLCBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgVmVjdG9yIDwgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gPiBjYWxsYmFja3M7CisgICAgc3NpemVfdCBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmluZGV4T2ZLZXkoYXVkaW9Jbyk7CisgICAgaWYgKGlvSW5kZXggPj0gMCkgeworICAgICAgICBjYWxsYmFja3MgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MudmFsdWVBdChpb0luZGV4KTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBjYkluZGV4ID0gMDsgY2JJbmRleCA8IGNhbGxiYWNrcy5zaXplKCk7IGNiSW5kZXgrKykgeworICAgICAgICBpZiAoY2FsbGJhY2tzW2NiSW5kZXhdID09IGNhbGxiYWNrKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CisgICAgY2FsbGJhY2tzLmFkZChjYWxsYmFjayk7CisKKyAgICBtQXVkaW9EZXZpY2VDYWxsYmFja3MucmVwbGFjZVZhbHVlRm9yKGF1ZGlvSW8sIGNhbGxiYWNrcyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6QXVkaW9GbGluZ2VyQ2xpZW50OjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKAorICAgICAgICBjb25zdCBzcDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzc2l6ZV90IGlvSW5kZXggPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MuaW5kZXhPZktleShhdWRpb0lvKTsKKyAgICBpZiAoaW9JbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBWZWN0b3IgPCBzcDxBdWRpb0RldmljZUNhbGxiYWNrPiA+IGNhbGxiYWNrcyA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy52YWx1ZUF0KGlvSW5kZXgpOworCisgICAgc2l6ZV90IGNiSW5kZXg7CisgICAgZm9yIChjYkluZGV4ID0gMDsgY2JJbmRleCA8IGNhbGxiYWNrcy5zaXplKCk7IGNiSW5kZXgrKykgeworICAgICAgICBpZiAoY2FsbGJhY2tzW2NiSW5kZXhdID09IGNhbGxiYWNrKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY2JJbmRleCA9PSBjYWxsYmFja3Muc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgY2FsbGJhY2tzLnJlbW92ZUF0KGNiSW5kZXgpOworICAgIGlmIChjYWxsYmFja3Muc2l6ZSgpICE9IDApIHsKKyAgICAgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLnJlcGxhY2VWYWx1ZUZvcihhdWRpb0lvLCBjYWxsYmFja3MpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrcy5yZW1vdmVJdGVtKGF1ZGlvSW8pOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qIHN0YXRpYyAqLyB2b2lkIEF1ZGlvU3lzdGVtOjpzZXRFcnJvckNhbGxiYWNrKGF1ZGlvX2Vycm9yX2NhbGxiYWNrIGNiKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7CiAgICAgZ0F1ZGlvRXJyb3JDYWxsYmFjayA9IGNiOwogfQogCisvKnN0YXRpYyovIHZvaWQgQXVkaW9TeXN0ZW06OnNldER5blBvbGljeUNhbGxiYWNrKGR5bmFtaWNfcG9saWN5X2NhbGxiYWNrIGNiKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7CisgICAgZ0R5blBvbGljeUNhbGxiYWNrID0gY2I7Cit9CisKIC8vIGNsaWVudCBzaW5nbGV0b24gZm9yIEF1ZGlvUG9saWN5U2VydmljZSBiaW5kZXIgaW50ZXJmYWNlCiAvLyBwcm90ZWN0ZWQgYnkgZ0xvY2tBUFMKIHNwPElBdWRpb1BvbGljeVNlcnZpY2U+IEF1ZGlvU3lzdGVtOjpnQXVkaW9Qb2xpY3lTZXJ2aWNlOwpAQCAtNTkwLDE4ICs2OTAsMjIgQEAKIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBjb25zdCBjaGFyICphZGRyZXNzID0gIiI7CisgICAgY29uc3QgY2hhciAqbmFtZSA9ICIiOwogCiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAKICAgICBpZiAoZGV2aWNlX2FkZHJlc3MgIT0gTlVMTCkgewogICAgICAgICBhZGRyZXNzID0gZGV2aWNlX2FkZHJlc3M7CiAgICAgfQotCi0gICAgcmV0dXJuIGFwcy0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsIGFkZHJlc3MpOworICAgIGlmIChkZXZpY2VfbmFtZSAhPSBOVUxMKSB7CisgICAgICAgIG5hbWUgPSBkZXZpY2VfbmFtZTsKKyAgICB9CisgICAgcmV0dXJuIGFwcy0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsIGFkZHJlc3MsIG5hbWUpOwogfQogCiBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgQXVkaW9TeXN0ZW06OmdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLApAQCAtNjUzLDE3ICs3NTcsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gYXBzLT5nZXRPdXRwdXRGb3JBdHRyKGF0dHIsIG91dHB1dCwgc2Vzc2lvbiwgc3RyZWFtLAorICAgIHJldHVybiBhcHMtPmdldE91dHB1dEZvckF0dHIoYXR0ciwgb3V0cHV0LCBzZXNzaW9uLCBzdHJlYW0sIHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBvZmZsb2FkSW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgb2ZmbG9hZEluZm8pOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LApAQCAtNjk2LDE0ICs4MDIsMTcgQEAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gYXBzLT5nZXRJbnB1dEZvckF0dHIoYXR0ciwgaW5wdXQsIHNlc3Npb24sIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MpOworICAgIHJldHVybiBhcHMtPmdldElucHV0Rm9yQXR0cigKKyAgICAgICAgICAgIGF0dHIsIGlucHV0LCBzZXNzaW9uLCB1aWQsIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKQEAgLTg1OCwxOCArOTY3LDE2IEBACiAgICAgLy8gY2FsbGVkIGJ5IHJlc3RvcmVUcmFja19sKCksIHdoaWNoIG5lZWRzIG5ldyBJQXVkaW9GbGluZ2VyIGFuZCBJQXVkaW9Qb2xpY3lTZXJ2aWNlIGluc3RhbmNlcwogICAgIEFMT0dWKCJjbGVhckF1ZGlvQ29uZmlnQ2FjaGUoKSIpOwogICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrQ2FjaGUpOwotICAgICAgICBnT3V0cHV0cy5jbGVhcigpOwotICAgIH0KLSAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7CisgICAgICAgIGlmIChnQXVkaW9GbGluZ2VyQ2xpZW50ICE9IDApIHsKKyAgICAgICAgICAgIGdBdWRpb0ZsaW5nZXJDbGllbnQtPmNsZWFySW9DYWNoZSgpOworICAgICAgICB9CiAgICAgICAgIGdBdWRpb0ZsaW5nZXIuY2xlYXIoKTsKICAgICB9CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2tBUFMpOwogICAgICAgICBnQXVkaW9Qb2xpY3lTZXJ2aWNlLmNsZWFyKCk7CiAgICAgfQotICAgIC8vIERvIG5vdCBjbGVhciBnQXVkaW9Qb3J0Q2FsbGJhY2sKIH0KIAogYm9vbCBBdWRpb1N5c3RlbTo6aXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBpbmZvKQpAQCAtOTI5LDEwICsxMDM2LDc1IEBACiAgICAgcmV0dXJuIGFwcy0+c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CiB9CiAKLXZvaWQgQXVkaW9TeXN0ZW06OnNldEF1ZGlvUG9ydENhbGxiYWNrKHNwPEF1ZGlvUG9ydENhbGxiYWNrPiBjYWxsQmFjaykKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjphZGRBdWRpb1BvcnRDYWxsYmFjayhjb25zdCBzcDxBdWRpb1BvcnRDYWxsYmFjaz4mIGNhbGxiYWNrKQogewotICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9ja0FQQyk7Ci0gICAgZ0F1ZGlvUG9ydENhbGxiYWNrID0gY2FsbEJhY2s7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9ja0FQUyk7CisgICAgaWYgKGdBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaW50IHJldCA9IGdBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQtPmFkZEF1ZGlvUG9ydENhbGxiYWNrKGNhbGxiYWNrKTsKKyAgICBpZiAocmV0ID09IDEpIHsKKyAgICAgICAgYXBzLT5zZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKHRydWUpOworICAgIH0KKyAgICByZXR1cm4gKHJldCA8IDApID8gSU5WQUxJRF9PUEVSQVRJT04gOiBOT19FUlJPUjsKK30KKworLypzdGF0aWMqLworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvUG9ydENhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvUG9ydENhbGxiYWNrPiYgY2FsbGJhY2spCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9ja0FQUyk7CisgICAgaWYgKGdBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaW50IHJldCA9IGdBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQtPnJlbW92ZUF1ZGlvUG9ydENhbGxiYWNrKGNhbGxiYWNrKTsKKyAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgYXBzLT5zZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGZhbHNlKTsKKyAgICB9CisgICAgcmV0dXJuIChyZXQgPCAwKSA/IElOVkFMSURfT1BFUkFUSU9OIDogTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKAorICAgICAgICBjb25zdCBzcDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pCit7CisgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyQ2xpZW50PiBhZmMgPSBnZXRBdWRpb0ZsaW5nZXJDbGllbnQoKTsKKyAgICBpZiAoYWZjID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHN0YXR1c190IHN0YXR1cyA9IGFmYy0+YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjYWxsYmFjaywgYXVkaW9Jbyk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICAgICAgaWYgKGFmICE9IDApIHsKKyAgICAgICAgICAgIGFmLT5yZWdpc3RlckNsaWVudChhZmMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKAorICAgICAgICBjb25zdCBzcDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pCit7CisgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyQ2xpZW50PiBhZmMgPSBnZXRBdWRpb0ZsaW5nZXJDbGllbnQoKTsKKyAgICBpZiAoYWZjID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBhZmMtPnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soY2FsbGJhY2ssIGF1ZGlvSW8pOworfQorCithdWRpb19wb3J0X2hhbmRsZV90IEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VJZEZvcklvKGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICBjb25zdCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gZGVzYyA9IGdldElvRGVzY3JpcHRvcihhdWRpb0lvKTsKKyAgICBpZiAoZGVzYyA9PSAwKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIH0KKyAgICByZXR1cm4gZGVzYy0+Z2V0RGV2aWNlSWQoKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKQEAgLTk2NSwxNCArMTEzNyw5MiBAQAogICAgIHJldHVybiBhcHMtPnJlZ2lzdGVyUG9saWN5TWl4ZXMobWl4ZXMsIHJlZ2lzdHJhdGlvbik7CiB9CiAKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmhhbmRsZSkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPnN0YXJ0QXVkaW9Tb3VyY2Uoc291cmNlLCBhdHRyaWJ1dGVzLCBoYW5kbGUpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPnN0b3BBdWRpb1NvdXJjZShoYW5kbGUpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAoraW50IEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmFkZEF1ZGlvUG9ydENhbGxiYWNrKAorICAgICAgICBjb25zdCBzcDxBdWRpb1BvcnRDYWxsYmFjaz4mIGNhbGxiYWNrKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Qb3J0Q2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtQXVkaW9Qb3J0Q2FsbGJhY2tzW2ldID09IGNhbGxiYWNrKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgbUF1ZGlvUG9ydENhbGxiYWNrcy5hZGQoY2FsbGJhY2spOworICAgIHJldHVybiBtQXVkaW9Qb3J0Q2FsbGJhY2tzLnNpemUoKTsKK30KKworaW50IEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OnJlbW92ZUF1ZGlvUG9ydENhbGxiYWNrKAorICAgICAgICBjb25zdCBzcDxBdWRpb1BvcnRDYWxsYmFjaz4mIGNhbGxiYWNrKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc2l6ZV90IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG1BdWRpb1BvcnRDYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1BdWRpb1BvcnRDYWxsYmFja3NbaV0gPT0gY2FsbGJhY2spIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpID09IG1BdWRpb1BvcnRDYWxsYmFja3Muc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbUF1ZGlvUG9ydENhbGxiYWNrcy5yZW1vdmVBdChpKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9ydENhbGxiYWNrcy5zaXplKCk7Cit9CisKKwordm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Qb3J0Q2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1BdWRpb1BvcnRDYWxsYmFja3NbaV0tPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgIH0KK30KKwordm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvUG9ydENhbGxiYWNrcy5zaXplKCk7IGkrKykgeworICAgICAgICBtQXVkaW9Qb3J0Q2FsbGJhY2tzW2ldLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKAorICAgICAgICBTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKQoreworICAgIEFMT0dWKCJBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKCVzLCAlZCkiLCByZWdJZC5zdHJpbmcoKSwgc3RhdGUpOworICAgIGR5bmFtaWNfcG9saWN5X2NhbGxiYWNrIGNiID0gTlVMTDsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChBdWRpb1N5c3RlbTo6Z0xvY2spOworICAgICAgICBjYiA9IGdEeW5Qb2xpY3lDYWxsYmFjazsKKyAgICB9CisKKyAgICBpZiAoY2IgIT0gTlVMTCkgeworICAgICAgICBjYihEWU5BTUlDX1BPTElDWV9FVkVOVF9NSVhfU1RBVEVfVVBEQVRFLCByZWdJZCwgc3RhdGUpOworICAgIH0KK30KKwogdm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpCiB7CiAgICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2tBUEMpOwotICAgICAgICBpZiAoZ0F1ZGlvUG9ydENhbGxiYWNrICE9IDApIHsKLSAgICAgICAgICAgIGdBdWRpb1BvcnRDYWxsYmFjay0+b25TZXJ2aWNlRGllZCgpOworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1BvcnRDYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG1BdWRpb1BvcnRDYWxsYmFja3NbaV0tPm9uU2VydmljZURpZWQoKTsKICAgICAgICAgfQogICAgIH0KICAgICB7CkBAIC05ODMsMjAgKzEyMzMsNCBAQAogICAgIEFMT0dXKCJBdWRpb1BvbGljeVNlcnZpY2Ugc2VydmVyIGRpZWQhIik7CiB9CiAKLXZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6b25BdWRpb1BvcnRMaXN0VXBkYXRlKCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2tBUEMpOwotICAgIGlmIChnQXVkaW9Qb3J0Q2FsbGJhY2sgIT0gMCkgewotICAgICAgICBnQXVkaW9Qb3J0Q2FsbGJhY2stPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwotICAgIH0KLX0KLQotdm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2tBUEMpOwotICAgIGlmIChnQXVkaW9Qb3J0Q2FsbGJhY2sgIT0gMCkgewotICAgICAgICBnQXVkaW9Qb3J0Q2FsbGJhY2stPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKLSAgICB9Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwCmluZGV4IDczNWRiNWMuLjQ0NGY0ZDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwCkBAIC0zMywxMSArMzMsMjggQEAKIAogI2RlZmluZSBXQUlUX1BFUklPRF9NUyAgICAgICAgICAgICAgICAgIDEwCiAjZGVmaW5lIFdBSVRfU1RSRUFNX0VORF9USU1FT1VUX1NFQyAgICAgMTIwCi0KK3N0YXRpYyBjb25zdCBpbnQga01heExvb3BDb3VudE5vdGlmaWNhdGlvbnMgPSAzMjsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKKy8vIFRPRE86IE1vdmUgdG8gYSBzZXBhcmF0ZSAuaAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBpbmxpbmUgY29uc3QgVCAmbWluKGNvbnN0IFQgJngsIGNvbnN0IFQgJnkpIHsKKyAgICByZXR1cm4geCA8IHkgPyB4IDogeTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgaW5saW5lIGNvbnN0IFQgJm1heChjb25zdCBUICZ4LCBjb25zdCBUICZ5KSB7CisgICAgcmV0dXJuIHggPiB5ID8geCA6IHk7Cit9CisKK3N0YXRpYyBpbmxpbmUgbnNlY3NfdCBmcmFtZXNUb05hbm9zZWNvbmRzKHNzaXplX3QgZnJhbWVzLCB1aW50MzJfdCBzYW1wbGVSYXRlLCBmbG9hdCBzcGVlZCkKK3sKKyAgICByZXR1cm4gKChkb3VibGUpZnJhbWVzICogMTAwMDAwMDAwMCkgLyAoKGRvdWJsZSlzYW1wbGVSYXRlICogc3BlZWQpOworfQorCiBzdGF0aWMgaW50NjRfdCBjb252ZXJ0VGltZXNwZWNUb1VzKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAmdHYpCiB7CiAgICAgcmV0dXJuIHR2LnR2X3NlYyAqIDEwMDAwMDBsbCArIHR2LnR2X25zZWMgLyAxMDAwOwpAQCAtNTEsNiArNjgsNDIgQEAKICAgICByZXR1cm4gY29udmVydFRpbWVzcGVjVG9Vcyh0dik7CiB9CiAKKy8vIEZJWE1FOiB3ZSBkb24ndCB1c2UgdGhlIHBpdGNoIHNldHRpbmcgaW4gdGhlIHRpbWUgc3RyZXRjaGVyIChub3Qgd29ya2luZyk7CisvLyBpbnN0ZWFkIHdlIGVtdWxhdGUgaXQgdXNpbmcgb3VyIHNhbXBsZSByYXRlIGNvbnZlcnRlci4KK3N0YXRpYyBjb25zdCBib29sIGtGaXhQaXRjaCA9IHRydWU7IC8vIGVuYWJsZSBwaXRjaCBmaXgKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgYWRqdXN0U2FtcGxlUmF0ZSh1aW50MzJfdCBzYW1wbGVSYXRlLCBmbG9hdCBwaXRjaCkKK3sKKyAgICByZXR1cm4ga0ZpeFBpdGNoID8gKHNhbXBsZVJhdGUgKiBwaXRjaCArIDAuNSkgOiBzYW1wbGVSYXRlOworfQorCitzdGF0aWMgaW5saW5lIGZsb2F0IGFkanVzdFNwZWVkKGZsb2F0IHNwZWVkLCBmbG9hdCBwaXRjaCkKK3sKKyAgICByZXR1cm4ga0ZpeFBpdGNoID8gc3BlZWQgLyBtYXgocGl0Y2gsIEFVRElPX1RJTUVTVFJFVENIX1BJVENIX01JTl9ERUxUQSkgOiBzcGVlZDsKK30KKworc3RhdGljIGlubGluZSBmbG9hdCBhZGp1c3RQaXRjaChmbG9hdCBwaXRjaCkKK3sKKyAgICByZXR1cm4ga0ZpeFBpdGNoID8gQVVESU9fVElNRVNUUkVUQ0hfUElUQ0hfTk9STUFMIDogcGl0Y2g7Cit9CisKKy8vIE11c3QgbWF0Y2ggc2ltaWxhciBjb21wdXRhdGlvbiBpbiBjcmVhdGVUcmFja19sIGluIFRocmVhZHMuY3BwLgorLy8gVE9ETzogTW92ZSB0byBhIGNvbW1vbiBsaWJyYXJ5CitzdGF0aWMgc2l6ZV90IGNhbGN1bGF0ZU1pbkZyYW1lQ291bnQoCisgICAgICAgIHVpbnQzMl90IGFmTGF0ZW5jeU1zLCB1aW50MzJfdCBhZkZyYW1lQ291bnQsIHVpbnQzMl90IGFmU2FtcGxlUmF0ZSwKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgZmxvYXQgc3BlZWQpCit7CisgICAgLy8gRW5zdXJlIHRoYXQgYnVmZmVyIGRlcHRoIGNvdmVycyBhdCBsZWFzdCBhdWRpbyBoYXJkd2FyZSBsYXRlbmN5CisgICAgdWludDMyX3QgbWluQnVmQ291bnQgPSBhZkxhdGVuY3lNcyAvICgoMTAwMCAqIGFmRnJhbWVDb3VudCkgLyBhZlNhbXBsZVJhdGUpOworICAgIGlmIChtaW5CdWZDb3VudCA8IDIpIHsKKyAgICAgICAgbWluQnVmQ291bnQgPSAyOworICAgIH0KKyAgICBBTE9HVigiY2FsY3VsYXRlTWluRnJhbWVDb3VudCBhZkxhdGVuY3kgJXUgIGFmRnJhbWVDb3VudCAldSAgYWZTYW1wbGVSYXRlICV1ICAiCisgICAgICAgICAgICAic2FtcGxlUmF0ZSAldSAgc3BlZWQgJWYgIG1pbkJ1ZkNvdW50OiAldSIsCisgICAgICAgICAgICBhZkxhdGVuY3lNcywgYWZGcmFtZUNvdW50LCBhZlNhbXBsZVJhdGUsIHNhbXBsZVJhdGUsIHNwZWVkLCBtaW5CdWZDb3VudCk7CisgICAgcmV0dXJuIG1pbkJ1ZkNvdW50ICogc291cmNlRnJhbWVzTmVlZGVkV2l0aFRpbWVzdHJldGNoKAorICAgICAgICAgICAgc2FtcGxlUmF0ZSwgYWZGcmFtZUNvdW50LCBhZlNhbXBsZVJhdGUsIHNwZWVkKTsKK30KKwogLy8gc3RhdGljCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpnZXRNaW5GcmFtZUNvdW50KAogICAgICAgICBzaXplX3QqIGZyYW1lQ291bnQsCkBAIC02MSwxMiArMTE0LDExIEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgLy8gRklYTUUgbWVyZ2Ugd2l0aCBzaW1pbGFyIGNvZGUgaW4gY3JlYXRlVHJhY2tfbCgpLCBleGNlcHQgd2UncmUgbWlzc2luZwotICAgIC8vICAgICAgIHNvbWUgaW5mb3JtYXRpb24gaGVyZSB0aGF0IGlzIGF2YWlsYWJsZSBpbiBjcmVhdGVUcmFja19sKCk6CisgICAgLy8gRklYTUUgaGFuZGxlIGluIHNlcnZlciwgbGlrZSBjcmVhdGVUcmFja19sKCksIHBvc3NpYmxlIG1pc3NpbmcgaW5mbzoKICAgICAvLyAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQKICAgICAvLyAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQKICAgICAvLyAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzawotICAgIC8vICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzCisgICAgLy8gICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgKEZBU1QpCiAgICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwogICAgIHN0YXR1c190IHN0YXR1czsKICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlKCZhZlNhbXBsZVJhdGUsIHN0cmVhbVR5cGUpOwpAQCAtOTAsMjMgKzE0MiwyMCBAQAogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAotICAgIC8vIEVuc3VyZSB0aGF0IGJ1ZmZlciBkZXB0aCBjb3ZlcnMgYXQgbGVhc3QgYXVkaW8gaGFyZHdhcmUgbGF0ZW5jeQotICAgIHVpbnQzMl90IG1pbkJ1ZkNvdW50ID0gYWZMYXRlbmN5IC8gKCgxMDAwICogYWZGcmFtZUNvdW50KSAvIGFmU2FtcGxlUmF0ZSk7Ci0gICAgaWYgKG1pbkJ1ZkNvdW50IDwgMikgewotICAgICAgICBtaW5CdWZDb3VudCA9IDI7Ci0gICAgfQorICAgIC8vIFdoZW4gY2FsbGVkIGZyb20gY3JlYXRlVHJhY2ssIHNwZWVkIGlzIDEuMGYgKG5vcm1hbCBzcGVlZCkuCisgICAgLy8gVGhpcyBpcyByZWNoZWNrZWQgYWdhaW4gb24gc2V0dGluZyBwbGF5YmFjayByYXRlIChUT0RPOiBvbiBzZXR0aW5nIHNhbXBsZSByYXRlLCB0b28pLgorICAgICpmcmFtZUNvdW50ID0gY2FsY3VsYXRlTWluRnJhbWVDb3VudChhZkxhdGVuY3ksIGFmRnJhbWVDb3VudCwgYWZTYW1wbGVSYXRlLCBzYW1wbGVSYXRlLCAxLjBmKTsKIAotICAgICpmcmFtZUNvdW50ID0gKHNhbXBsZVJhdGUgPT0gMCkgPyBhZkZyYW1lQ291bnQgKiBtaW5CdWZDb3VudCA6Ci0gICAgICAgICAgICBhZkZyYW1lQ291bnQgKiBtaW5CdWZDb3VudCAqIHVpbnQ2NF90KHNhbXBsZVJhdGUpIC8gYWZTYW1wbGVSYXRlOwotICAgIC8vIFRoZSBmb3JtdWxhIGFib3ZlIHNob3VsZCBhbHdheXMgcHJvZHVjZSBhIG5vbi16ZXJvIHZhbHVlLCBidXQgcmV0dXJuIGFuIGVycm9yCi0gICAgLy8gaW4gdGhlIHVubGlrZWx5IGV2ZW50IHRoYXQgaXQgZG9lcyBub3QsIGFzIHRoYXQncyBwYXJ0IG9mIHRoZSBBUEkgY29udHJhY3QuCisgICAgLy8gVGhlIGZvcm11bGEgYWJvdmUgc2hvdWxkIGFsd2F5cyBwcm9kdWNlIGEgbm9uLXplcm8gdmFsdWUgdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXM6CisgICAgLy8gQXVkaW9UcmFjay5TQU1QTEVfUkFURV9IWl9NSU4gPD0gc2FtcGxlUmF0ZSA8PSBBdWRpb1RyYWNrLlNBTVBMRV9SQVRFX0haX01BWC4KKyAgICAvLyBSZXR1cm4gZXJyb3IgaW4gdGhlIHVubGlrZWx5IGV2ZW50IHRoYXQgaXQgZG9lcyBub3QsIGFzIHRoYXQncyBwYXJ0IG9mIHRoZSBBUEkgY29udHJhY3QuCiAgICAgaWYgKCpmcmFtZUNvdW50ID09IDApIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvVHJhY2s6OmdldE1pbkZyYW1lQ291bnQgZmFpbGVkIGZvciBzdHJlYW1UeXBlICVkLCBzYW1wbGVSYXRlICVkIiwKKyAgICAgICAgQUxPR0UoIkF1ZGlvVHJhY2s6OmdldE1pbkZyYW1lQ291bnQgZmFpbGVkIGZvciBzdHJlYW1UeXBlICVkLCBzYW1wbGVSYXRlICV1IiwKICAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgQUxPR1YoImdldE1pbkZyYW1lQ291bnQ9JXp1OiBhZkZyYW1lQ291bnQ9JXp1LCBtaW5CdWZDb3VudD0lZCwgYWZTYW1wbGVSYXRlPSVkLCBhZkxhdGVuY3k9JWQiLAotICAgICAgICAgICAgKmZyYW1lQ291bnQsIGFmRnJhbWVDb3VudCwgbWluQnVmQ291bnQsIGFmU2FtcGxlUmF0ZSwgYWZMYXRlbmN5KTsKKyAgICBBTE9HVigiZ2V0TWluRnJhbWVDb3VudD0lenU6IGFmRnJhbWVDb3VudD0lenUsIGFmU2FtcGxlUmF0ZT0ldSwgYWZMYXRlbmN5PSV1IiwKKyAgICAgICAgICAgICpmcmFtZUNvdW50LCBhZkZyYW1lQ291bnQsIGFmU2FtcGxlUmF0ZSwgYWZMYXRlbmN5KTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTExNyw3ICsxNjYsOCBAQAogICAgICAgbUlzVGltZWQoZmFsc2UpLAogICAgICAgbVByZXZpb3VzUHJpb3JpdHkoQU5EUk9JRF9QUklPUklUWV9OT1JNQUwpLAogICAgICAgbVByZXZpb3VzU2NoZWR1bGluZ0dyb3VwKFNQX0RFRkFVTFQpLAotICAgICAgbVBhdXNlZFBvc2l0aW9uKDApCisgICAgICBtUGF1c2VkUG9zaXRpb24oMCksCisgICAgICBtU2VsZWN0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKQogewogICAgIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOOwogICAgIG1BdHRyaWJ1dGVzLnVzYWdlID0gQVVESU9fVVNBR0VfVU5LTk9XTjsKQEAgLTE0MCwxNyArMTkwLDE5IEBACiAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbywKICAgICAgICAgaW50IHVpZCwKICAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzKQorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzLAorICAgICAgICBib29sIGRvTm90UmVjb25uZWN0KQogICAgIDogbVN0YXR1cyhOT19JTklUKSwKICAgICAgIG1Jc1RpbWVkKGZhbHNlKSwKICAgICAgIG1QcmV2aW91c1ByaW9yaXR5KEFORFJPSURfUFJJT1JJVFlfTk9STUFMKSwKICAgICAgIG1QcmV2aW91c1NjaGVkdWxpbmdHcm91cChTUF9ERUZBVUxUKSwKLSAgICAgIG1QYXVzZWRQb3NpdGlvbigwKQorICAgICAgbVBhdXNlZFBvc2l0aW9uKDApLAorICAgICAgbVNlbGVjdGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkKIHsKICAgICBtU3RhdHVzID0gc2V0KHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBmcmFtZUNvdW50LCBmbGFncywgY2JmLCB1c2VyLCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgICAgICAwIC8qc2hhcmVkQnVmZmVyKi8sIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsCi0gICAgICAgICAgICBvZmZsb2FkSW5mbywgdWlkLCBwaWQsIHBBdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLCB1aWQsIHBpZCwgcEF0dHJpYnV0ZXMsIGRvTm90UmVjb25uZWN0KTsKIH0KIAogQXVkaW9UcmFjazo6QXVkaW9UcmFjaygKQEAgLTE2OCwxNyArMjIwLDE5IEBACiAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbywKICAgICAgICAgaW50IHVpZCwKICAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzKQorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzLAorICAgICAgICBib29sIGRvTm90UmVjb25uZWN0KQogICAgIDogbVN0YXR1cyhOT19JTklUKSwKICAgICAgIG1Jc1RpbWVkKGZhbHNlKSwKICAgICAgIG1QcmV2aW91c1ByaW9yaXR5KEFORFJPSURfUFJJT1JJVFlfTk9STUFMKSwKICAgICAgIG1QcmV2aW91c1NjaGVkdWxpbmdHcm91cChTUF9ERUZBVUxUKSwKLSAgICAgIG1QYXVzZWRQb3NpdGlvbigwKQorICAgICAgbVBhdXNlZFBvc2l0aW9uKDApLAorICAgICAgbVNlbGVjdGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkKIHsKICAgICBtU3RhdHVzID0gc2V0KHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAwIC8qZnJhbWVDb3VudCovLCBmbGFncywgY2JmLCB1c2VyLCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgICAgICBzaGFyZWRCdWZmZXIsIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIG9mZmxvYWRJbmZvLAotICAgICAgICAgICAgdWlkLCBwaWQsIHBBdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgIHVpZCwgcGlkLCBwQXR0cmlidXRlcywgZG9Ob3RSZWNvbm5lY3QpOwogfQogCiBBdWRpb1RyYWNrOjp+QXVkaW9UcmFjaygpCkBAIC0xOTQsMTMgKzI0OCwxNyBAQAogICAgICAgICAgICAgbUF1ZGlvVHJhY2tUaHJlYWQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpOwogICAgICAgICAgICAgbUF1ZGlvVHJhY2tUaHJlYWQuY2xlYXIoKTsKICAgICAgICAgfQorICAgICAgICAvLyBObyBsb2NrIGhlcmU6IHdvcnN0IGNhc2Ugd2UgcmVtb3ZlIGEgTlVMTCBjYWxsYmFjayB3aGljaCB3aWxsIGJlIGEgbm9wCisgICAgICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCAmJiBtT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2ssIG1PdXRwdXQpOworICAgICAgICB9CiAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1BdWRpb1RyYWNrKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CiAgICAgICAgIG1BdWRpb1RyYWNrLmNsZWFyKCk7CiAgICAgICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7CiAgICAgICAgIG1TaGFyZWRCdWZmZXIuY2xlYXIoKTsKICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgICAgICBBTE9HVigifkF1ZGlvVHJhY2ssIHJlbGVhc2luZyBzZXNzaW9uIGlkIGZyb20gJWQgb24gYmVoYWxmIG9mICVkIiwKLSAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOworICAgICAgICBBTE9HVigifkF1ZGlvVHJhY2ssIHJlbGVhc2luZyBzZXNzaW9uIGlkICVkIGZyb20gJWQgb24gYmVoYWxmIG9mICVkIiwKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOwogICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQsIG1DbGllbnRQaWQpOwogICAgIH0KIH0KQEAgLTIyMiwxMiArMjgwLDEzIEBACiAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbywKICAgICAgICAgaW50IHVpZCwKICAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzKQorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzLAorICAgICAgICBib29sIGRvTm90UmVjb25uZWN0KQogewogICAgIEFMT0dWKCJzZXQoKTogc3RyZWFtVHlwZSAlZCwgc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgJSN4LCBmcmFtZUNvdW50ICV6dSwgIgotICAgICAgICAgICJmbGFncyAjJXgsIG5vdGlmaWNhdGlvbkZyYW1lcyAldSwgc2Vzc2lvbklkICVkLCB0cmFuc2ZlclR5cGUgJWQiLAorICAgICAgICAgICJmbGFncyAjJXgsIG5vdGlmaWNhdGlvbkZyYW1lcyAldSwgc2Vzc2lvbklkICVkLCB0cmFuc2ZlclR5cGUgJWQsIHVpZCAlZCwgcGlkICVkIiwKICAgICAgICAgICBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBmbGFncywgbm90aWZpY2F0aW9uRnJhbWVzLAotICAgICAgICAgIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlKTsKKyAgICAgICAgICBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgdWlkLCBwaWQpOwogCiAgICAgc3dpdGNoICh0cmFuc2ZlclR5cGUpIHsKICAgICBjYXNlIFRSQU5TRkVSX0RFRkFVTFQ6CkBAIC0yNjQsMTQgKzMyMywxMyBAQAogICAgIH0KICAgICBtU2hhcmVkQnVmZmVyID0gc2hhcmVkQnVmZmVyOwogICAgIG1UcmFuc2ZlciA9IHRyYW5zZmVyVHlwZTsKKyAgICBtRG9Ob3RSZWNvbm5lY3QgPSBkb05vdFJlY29ubmVjdDsKIAotICAgIEFMT0dWX0lGKHNoYXJlZEJ1ZmZlciAhPSAwLCAic2hhcmVkQnVmZmVyOiAlcCwgc2l6ZTogJWQiLCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwKKyAgICBBTE9HVl9JRihzaGFyZWRCdWZmZXIgIT0gMCwgInNoYXJlZEJ1ZmZlcjogJXAsIHNpemU6ICV6dSIsIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLAogICAgICAgICAgICAgc2hhcmVkQnVmZmVyLT5zaXplKCkpOwogCiAgICAgQUxPR1YoInNldCgpIHN0cmVhbVR5cGUgJWQgZnJhbWVDb3VudCAlenUgZmxhZ3MgJTA0eCIsIHN0cmVhbVR5cGUsIGZyYW1lQ291bnQsIGZsYWdzKTsKIAotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLQogICAgIC8vIGludmFyaWFudCB0aGF0IG1BdWRpb1RyYWNrICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5CiAgICAgaWYgKG1BdWRpb1RyYWNrICE9IDApIHsKICAgICAgICAgQUxPR0UoIlRyYWNrIGFscmVhZHkgaW4gdXNlIik7CkBAIC0yOTUsNiArMzUzLDkgQEAKICAgICAgICAgQUxPR1YoIkJ1aWxkaW5nIEF1ZGlvVHJhY2sgd2l0aCBhdHRyaWJ1dGVzOiB1c2FnZT0lZCBjb250ZW50PSVkIGZsYWdzPTB4JXggdGFncz1bJXNdIiwKICAgICAgICAgICAgICAgICBtQXR0cmlidXRlcy51c2FnZSwgbUF0dHJpYnV0ZXMuY29udGVudF90eXBlLCBtQXR0cmlidXRlcy5mbGFncywgbUF0dHJpYnV0ZXMudGFncyk7CiAgICAgICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7CisgICAgICAgIGlmICgobUF0dHJpYnV0ZXMuZmxhZ3MgJiBBVURJT19GTEFHX0hXX0FWX1NZTkMpICE9IDApIHsKKyAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gdGhlc2UgYmVsb3cgc2hvdWxkIHByb2JhYmx5IGNvbWUgZnJvbSB0aGUgYXVkaW9GbGluZ2VyIHRvby4uLgpAQCAtMzE3LDEyICszNzgsNiBAQAogICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7CiAgICAgbUNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDsKIAotICAgIC8vIEF1ZGlvRmxpbmdlciBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydCA4LWJpdCBkYXRhIGluIHNoYXJlZCBtZW1vcnkKLSAgICBpZiAoZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQgJiYgc2hhcmVkQnVmZmVyICE9IDApIHsKLSAgICAgICAgQUxPR0UoIjgtYml0IGRhdGEgaW4gc2hhcmVkIG1lbW9yeSBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCiAgICAgLy8gZm9yY2UgZGlyZWN0IGZsYWcgaWYgZm9ybWF0IGlzIG5vdCBsaW5lYXIgUENNCiAgICAgLy8gb3Igb2ZmbG9hZCB3YXMgcmVxdWVzdGVkCiAgICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpCkBAIC0zNDYsMTIgKzQwMSw5IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtRnJhbWVTaXplID0gc2l6ZW9mKHVpbnQ4X3QpOwogICAgICAgICB9Ci0gICAgICAgIG1GcmFtZVNpemVBRiA9IG1GcmFtZVNpemU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR19BU1NFUlQoYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKTsKICAgICAgICAgbUZyYW1lU2l6ZSA9IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KTsKLSAgICAgICAgbUZyYW1lU2l6ZUFGID0gY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSgKLSAgICAgICAgICAgICAgICBmb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV84X0JJVCA/IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIDogZm9ybWF0KTsKICAgICAgICAgLy8gY3JlYXRlVHJhY2sgd2lsbCByZXR1cm4gYW4gZXJyb3IgaWYgUENNIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHNlcnZlciwKICAgICAgICAgLy8gc28gbm8gbmVlZCB0byBjaGVjayBmb3Igc3BlY2lmaWMgUENNIGZvcm1hdHMgaGVyZQogICAgIH0KQEAgLTM2MSw2ICs0MTMsOCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgbU9yaWdpbmFsU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgbVBsYXliYWNrUmF0ZSA9IEFVRElPX1BMQVlCQUNLX1JBVEVfREVGQVVMVDsKIAogICAgIC8vIE1ha2UgY29weSBvZiBpbnB1dCBwYXJhbWV0ZXIgb2ZmbG9hZEluZm8gc28gdGhhdCBpbiB0aGUgZnV0dXJlOgogICAgIC8vICAoYSkgY3JlYXRlVHJhY2tfbCBkb2Vzbid0IG5lZWQgaXQgYXMgYW4gaW5wdXQgcGFyYW1ldGVyCkBAIC00MDMsNiArNDU3LDcgQEAKICAgICBpZiAoY2JmICE9IE5VTEwpIHsKICAgICAgICAgbUF1ZGlvVHJhY2tUaHJlYWQgPSBuZXcgQXVkaW9UcmFja1RocmVhZCgqdGhpcywgdGhyZWFkQ2FuQ2FsbEphdmEpOwogICAgICAgICBtQXVkaW9UcmFja1RocmVhZC0+cnVuKCJBdWRpb1RyYWNrIiwgQU5EUk9JRF9QUklPUklUWV9BVURJTywgMCAvKnN0YWNrKi8pOworICAgICAgICAvLyB0aHJlYWQgYmVnaW5zIGluIHBhdXNlZCBzdGF0ZSwgYW5kIHdpbGwgbm90IHJlZmVyZW5jZSB1cyB1bnRpbCBzdGFydCgpCiAgICAgfQogCiAgICAgLy8gY3JlYXRlIHRoZSBJQXVkaW9UcmFjawpAQCAtNDIwLDEyICs0NzUsMTQgQEAKICAgICBtU3RhdHVzID0gTk9fRVJST1I7CiAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKICAgICBtVXNlckRhdGEgPSB1c2VyOwotICAgIG1Mb29wUGVyaW9kID0gMDsKKyAgICBtTG9vcENvdW50ID0gMDsKKyAgICBtTG9vcFN0YXJ0ID0gMDsKKyAgICBtTG9vcEVuZCA9IDA7CisgICAgbUxvb3BDb3VudE5vdGlmaWVkID0gMDsKICAgICBtTWFya2VyUG9zaXRpb24gPSAwOwogICAgIG1NYXJrZXJSZWFjaGVkID0gZmFsc2U7CiAgICAgbU5ld1Bvc2l0aW9uID0gMDsKICAgICBtVXBkYXRlUGVyaW9kID0gMDsKLSAgICBtU2VydmVyID0gMDsKICAgICBtUG9zaXRpb24gPSAwOwogICAgIG1SZWxlYXNlZCA9IDA7CiAgICAgbVN0YXJ0VXMgPSAwOwpAQCAtNDMzLDYgKzQ5MCw5IEBACiAgICAgbVNlcXVlbmNlID0gMTsKICAgICBtT2JzZXJ2ZWRTZXF1ZW5jZSA9IG1TZXF1ZW5jZTsKICAgICBtSW5VbmRlcnJ1biA9IGZhbHNlOworICAgIG1QcmV2aW91c1RpbWVzdGFtcFZhbGlkID0gZmFsc2U7CisgICAgbVRpbWVzdGFtcFN0YXJ0dXBHbGl0Y2hSZXBvcnRlZCA9IGZhbHNlOworICAgIG1SZXRyb2dyYWRlTW90aW9uUmVwb3J0ZWQgPSBmYWxzZTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTQ1OSw2ICs1MTksMTAgQEAKICAgICBpZiAocHJldmlvdXNTdGF0ZSA9PSBTVEFURV9TVE9QUEVEIHx8IHByZXZpb3VzU3RhdGUgPT0gU1RBVEVfRkxVU0hFRCkgewogICAgICAgICAvLyByZXNldCBjdXJyZW50IHBvc2l0aW9uIGFzIHNlZW4gYnkgY2xpZW50IHRvIDAKICAgICAgICAgbVBvc2l0aW9uID0gMDsKKyAgICAgICAgbVByZXZpb3VzVGltZXN0YW1wVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgbVRpbWVzdGFtcFN0YXJ0dXBHbGl0Y2hSZXBvcnRlZCA9IGZhbHNlOworICAgICAgICBtUmV0cm9ncmFkZU1vdGlvblJlcG9ydGVkID0gZmFsc2U7CisKICAgICAgICAgLy8gRm9yIG9mZmxvYWRlZCB0cmFja3MsIHdlIGRvbid0IGtub3cgaWYgdGhlIGhhcmR3YXJlIGNvdW50ZXJzIGFyZSByZWFsbHkgemVybyBoZXJlLAogICAgICAgICAvLyBzaW5jZSB0aGUgZmx1c2ggaXMgYXN5bmNocm9ub3VzIGFuZCBzdG9wIG1heSBub3QgZnVsbHkgZHJhaW4uCiAgICAgICAgIC8vIFdlIHNhdmUgdGhlIHRpbWUgd2hlbiB0aGUgdHJhY2sgaXMgc3RhcnRlZCB0byBsYXRlciB2ZXJpZnkgd2hldGhlcgpAQCAtNTMxLDE0ICs1OTUsMTIgQEAKICAgICAvLyB0aGUgcGxheWJhY2sgaGVhZCBwb3NpdGlvbiB3aWxsIHJlc2V0IHRvIDAsIHNvIGlmIGEgbWFya2VyIGlzIHNldCwgd2UgbmVlZAogICAgIC8vIHRvIGFjdGl2YXRlIGl0IGFnYWluCiAgICAgbU1hcmtlclJlYWNoZWQgPSBmYWxzZTsKLSNpZiAwCi0gICAgLy8gRm9yY2UgZmx1c2ggaWYgYSBzaGFyZWQgYnVmZmVyIGlzIHVzZWQgb3RoZXJ3aXNlIGF1ZGlvZmxpbmdlcgotICAgIC8vIHdpbGwgbm90IHN0b3AgYmVmb3JlIGVuZCBvZiBidWZmZXIgaXMgcmVhY2hlZC4KLSAgICAvLyBJdCBtYXkgYmUgbmVlZGVkIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIHN0b3AgcGxheWJhY2ssIGxpa2VseSBpbiBjYXNlIGxvb3BpbmcgaXMgb24uCisKICAgICBpZiAobVNoYXJlZEJ1ZmZlciAhPSAwKSB7Ci0gICAgICAgIGZsdXNoX2woKTsKKyAgICAgICAgLy8gY2xlYXIgYnVmZmVyIHBvc2l0aW9uIGFuZCBsb29wIGNvdW50LgorICAgICAgICBtU3RhdGljUHJveHktPnNldEJ1ZmZlclBvc2l0aW9uQW5kTG9vcCgwIC8qIHBvc2l0aW9uICovLAorICAgICAgICAgICAgICAgIDAgLyogbG9vcFN0YXJ0ICovLCAwIC8qIGxvb3BFbmQgKi8sIDAgLyogbG9vcENvdW50ICovKTsKICAgICB9Ci0jZW5kaWYKIAogICAgIHNwPEF1ZGlvVHJhY2tUaHJlYWQ+IHQgPSBtQXVkaW9UcmFja1RocmVhZDsKICAgICBpZiAodCAhPSAwKSB7CkBAIC02NjksMjQgKzczMSwzMSBAQAogCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRTYW1wbGVSYXRlKHVpbnQzMl90IHJhdGUpCiB7Ci0gICAgaWYgKG1Jc1RpbWVkIHx8IGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgeworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBpZiAocmF0ZSA9PSBtU2FtcGxlUmF0ZSkgeworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIGlmIChtSXNUaW1lZCB8fCBpc09mZmxvYWRlZE9yRGlyZWN0X2woKSB8fCAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLQotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBpZiAobU91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CisgICAgLy8gTk9URTogaXQgaXMgdGhlb3JldGljYWxseSBwb3NzaWJsZSwgYnV0IGhpZ2hseSB1bmxpa2VseSwgdGhhdCBhIGRldmljZSBjaGFuZ2UKKyAgICAvLyBjb3VsZCBtZWFuIGEgcHJldmlvdXNseSBhbGxvd2VkIHNhbXBsaW5nIHJhdGUgaXMgbm8gbG9uZ2VyIGFsbG93ZWQuCiAgICAgdWludDMyX3QgYWZTYW1wbGluZ1JhdGU7CiAgICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRTYW1wbGluZ1JhdGUobU91dHB1dCwgJmFmU2FtcGxpbmdSYXRlKSAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgaWYgKHJhdGUgPT0gMCB8fCByYXRlID4gYWZTYW1wbGluZ1JhdGUgKiBBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVgpIHsKKyAgICAvLyBwaXRjaCBpcyBlbXVsYXRlZCBieSBhZGp1c3Rpbmcgc3BlZWQgYW5kIHNhbXBsZVJhdGUKKyAgICBjb25zdCB1aW50MzJfdCBlZmZlY3RpdmVTYW1wbGVSYXRlID0gYWRqdXN0U2FtcGxlUmF0ZShyYXRlLCBtUGxheWJhY2tSYXRlLm1QaXRjaCk7CisgICAgaWYgKHJhdGUgPT0gMCB8fCBlZmZlY3RpdmVTYW1wbGVSYXRlID4gYWZTYW1wbGluZ1JhdGUgKiBBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVgpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisgICAgLy8gVE9ETzogU2hvdWxkIHdlIGFsc28gY2hlY2sgaWYgdGhlIGJ1ZmZlciBzaXplIGlzIGNvbXBhdGlibGU/CiAKICAgICBtU2FtcGxlUmF0ZSA9IHJhdGU7Ci0gICAgbVByb3h5LT5zZXRTYW1wbGVSYXRlKHJhdGUpOworICAgIG1Qcm94eS0+c2V0U2FtcGxlUmF0ZShlZmZlY3RpdmVTYW1wbGVSYXRlKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTcxNCw2ICs3ODMsNjkgQEAKICAgICByZXR1cm4gbVNhbXBsZVJhdGU7CiB9CiAKK3VpbnQzMl90IEF1ZGlvVHJhY2s6OmdldE9yaWdpbmFsU2FtcGxlUmF0ZSgpIGNvbnN0Cit7CisgICAgaWYgKG1Jc1RpbWVkKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiBtT3JpZ2luYWxTYW1wbGVSYXRlOworfQorCitzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSkKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgaWYgKGlzQXVkaW9QbGF5YmFja1JhdGVFcXVhbChwbGF5YmFja1JhdGUsIG1QbGF5YmFja1JhdGUpKSB7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgaWYgKG1Jc1RpbWVkIHx8IGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICAvLyBwaXRjaCBpcyBlbXVsYXRlZCBieSBhZGp1c3Rpbmcgc3BlZWQgYW5kIHNhbXBsZVJhdGUKKyAgICBjb25zdCB1aW50MzJfdCBlZmZlY3RpdmVSYXRlID0gYWRqdXN0U2FtcGxlUmF0ZShtU2FtcGxlUmF0ZSwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CisgICAgY29uc3QgZmxvYXQgZWZmZWN0aXZlU3BlZWQgPSBhZGp1c3RTcGVlZChwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICBjb25zdCBmbG9hdCBlZmZlY3RpdmVQaXRjaCA9IGFkanVzdFBpdGNoKHBsYXliYWNrUmF0ZS5tUGl0Y2gpOworICAgIEF1ZGlvUGxheWJhY2tSYXRlIHBsYXliYWNrUmF0ZVRlbXAgPSBwbGF5YmFja1JhdGU7CisgICAgcGxheWJhY2tSYXRlVGVtcC5tU3BlZWQgPSBlZmZlY3RpdmVTcGVlZDsKKyAgICBwbGF5YmFja1JhdGVUZW1wLm1QaXRjaCA9IGVmZmVjdGl2ZVBpdGNoOworCisgICAgaWYgKCFpc0F1ZGlvUGxheWJhY2tSYXRlVmFsaWQocGxheWJhY2tSYXRlVGVtcCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgLy8gQ2hlY2sgaWYgdGhlIGJ1ZmZlciBzaXplIGlzIGNvbXBhdGlibGUuCisgICAgaWYgKCFpc1NhbXBsZVJhdGVTcGVlZEFsbG93ZWRfbChlZmZlY3RpdmVSYXRlLCBlZmZlY3RpdmVTcGVlZCkpIHsKKyAgICAgICAgQUxPR1YoInNldFBsYXliYWNrUmF0ZSglZiwgJWYpIGZhaWxlZCIsIHBsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIENoZWNrIHJlc2FtcGxlciByYXRpb3MgYXJlIHdpdGhpbiBib3VuZHMKKyAgICBpZiAoZWZmZWN0aXZlUmF0ZSA+IG1TYW1wbGVSYXRlICogQVVESU9fUkVTQU1QTEVSX0RPV05fUkFUSU9fTUFYKSB7CisgICAgICAgIEFMT0dWKCJzZXRQbGF5YmFja1JhdGUoJWYsICVmKSBmYWlsZWQuIFJlc2FtcGxlIHJhdGUgZXhjZWVkcyBtYXggYWNjZXB0ZWQgdmFsdWUiLAorICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChlZmZlY3RpdmVSYXRlICogQVVESU9fUkVTQU1QTEVSX1VQX1JBVElPX01BWCA8IG1TYW1wbGVSYXRlKSB7CisgICAgICAgIEFMT0dWKCJzZXRQbGF5YmFja1JhdGUoJWYsICVmKSBmYWlsZWQuIFJlc2FtcGxlIHJhdGUgYmVsb3cgbWluIGFjY2VwdGVkIHZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBtUGxheWJhY2tSYXRlID0gcGxheWJhY2tSYXRlOworICAgIC8vc2V0IGVmZmVjdGl2ZSByYXRlcworICAgIG1Qcm94eS0+c2V0UGxheWJhY2tSYXRlKHBsYXliYWNrUmF0ZVRlbXApOworICAgIG1Qcm94eS0+c2V0U2FtcGxlUmF0ZShlZmZlY3RpdmVSYXRlKTsgLy8gRklYTUU6IG5vdCBxdWl0ZSAiYXRvbWljIiB3aXRoIHNldFBsYXliYWNrUmF0ZQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworY29uc3QgQXVkaW9QbGF5YmFja1JhdGUmIEF1ZGlvVHJhY2s6OmdldFBsYXliYWNrUmF0ZSgpIGNvbnN0Cit7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIHJldHVybiBtUGxheWJhY2tSYXRlOworfQorCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRMb29wKHVpbnQzMl90IGxvb3BTdGFydCwgdWludDMyX3QgbG9vcEVuZCwgaW50IGxvb3BDb3VudCkKIHsKICAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwIHx8IG1Jc1RpbWVkIHx8IGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgewpAQCAtNzQwLDEwICs4NzIsMTUgQEAKIAogdm9pZCBBdWRpb1RyYWNrOjpzZXRMb29wX2wodWludDMyX3QgbG9vcFN0YXJ0LCB1aW50MzJfdCBsb29wRW5kLCBpbnQgbG9vcENvdW50KQogewotICAgIC8vIFNldHRpbmcgdGhlIGxvb3Agd2lsbCByZXNldCBuZXh0IG5vdGlmaWNhdGlvbiB1cGRhdGUgcGVyaW9kIChsaWtlIHNldFBvc2l0aW9uKS4KLSAgICBtTmV3UG9zaXRpb24gPSB1cGRhdGVBbmRHZXRQb3NpdGlvbl9sKCkgKyBtVXBkYXRlUGVyaW9kOwotICAgIG1Mb29wUGVyaW9kID0gbG9vcENvdW50ICE9IDAgPyBsb29wRW5kIC0gbG9vcFN0YXJ0IDogMDsKKyAgICAvLyBXZSBkbyBub3QgdXBkYXRlIHRoZSBwZXJpb2RpYyBub3RpZmljYXRpb24gcG9pbnQuCisgICAgLy8gbU5ld1Bvc2l0aW9uID0gdXBkYXRlQW5kR2V0UG9zaXRpb25fbCgpICsgbVVwZGF0ZVBlcmlvZDsKKyAgICBtTG9vcENvdW50ID0gbG9vcENvdW50OworICAgIG1Mb29wRW5kID0gbG9vcEVuZDsKKyAgICBtTG9vcFN0YXJ0ID0gbG9vcFN0YXJ0OworICAgIG1Mb29wQ291bnROb3RpZmllZCA9IGxvb3BDb3VudDsKICAgICBtU3RhdGljUHJveHktPnNldExvb3AobG9vcFN0YXJ0LCBsb29wRW5kLCBsb29wQ291bnQpOworCisgICAgLy8gV2FraW5nIHRoZSBBdWRpb1RyYWNrVGhyZWFkIGlzIG5vdCBuZWVkZWQgYXMgdGhpcyBjYW5ub3QgYmUgY2FsbGVkIHdoZW4gYWN0aXZlLgogfQogCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRNYXJrZXJQb3NpdGlvbih1aW50MzJfdCBtYXJrZXIpCkBAIC03NTcsNiArODk0LDEwIEBACiAgICAgbU1hcmtlclBvc2l0aW9uID0gbWFya2VyOwogICAgIG1NYXJrZXJSZWFjaGVkID0gZmFsc2U7CiAKKyAgICBzcDxBdWRpb1RyYWNrVGhyZWFkPiB0ID0gbUF1ZGlvVHJhY2tUaHJlYWQ7CisgICAgaWYgKHQgIT0gMCkgeworICAgICAgICB0LT53YWtlKCk7CisgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtNzg2LDYgKzkyNywxMCBAQAogICAgIG1OZXdQb3NpdGlvbiA9IHVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKSArIHVwZGF0ZVBlcmlvZDsKICAgICBtVXBkYXRlUGVyaW9kID0gdXBkYXRlUGVyaW9kOwogCisgICAgc3A8QXVkaW9UcmFja1RocmVhZD4gdCA9IG1BdWRpb1RyYWNrVGhyZWFkOworICAgIGlmICh0ICE9IDApIHsKKyAgICAgICAgdC0+d2FrZSgpOworICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTgyMywxMiArOTY4LDExIEBACiAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9BQ1RJVkUpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KKyAgICAvLyBBZnRlciBzZXR0aW5nIHRoZSBwb3NpdGlvbiwgdXNlIGZ1bGwgdXBkYXRlIHBlcmlvZCBiZWZvcmUgbm90aWZpY2F0aW9uLgogICAgIG1OZXdQb3NpdGlvbiA9IHVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKSArIG1VcGRhdGVQZXJpb2Q7Ci0gICAgbUxvb3BQZXJpb2QgPSAwOwotICAgIC8vIEZJWE1FIENoZWNrIHdoZXRoZXIgbG9vcHMgYW5kIHNldHRpbmcgcG9zaXRpb24gYXJlIGluY29tcGF0aWJsZSBpbiBvbGQgY29kZS4KLSAgICAvLyBJZiB3ZSB1c2Ugc2V0TG9vcCBmb3IgYm90aCBwdXJwb3NlcyB3ZSBsb3NlIHRoZSBjYXBhYmlsaXR5IHRvIHNldCB0aGUgcG9zaXRpb24gd2hpbGUgbG9vcGluZy4KLSAgICBtU3RhdGljUHJveHktPnNldExvb3AocG9zaXRpb24sIG1GcmFtZUNvdW50LCAwKTsKKyAgICBtU3RhdGljUHJveHktPnNldEJ1ZmZlclBvc2l0aW9uKHBvc2l0aW9uKTsKIAorICAgIC8vIFdha2luZyB0aGUgQXVkaW9UcmFja1RocmVhZCBpcyBub3QgbmVlZGVkIGFzIHRoaXMgY2Fubm90IGJlIGNhbGxlZCB3aGVuIGFjdGl2ZS4KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTg0OSwxNSArOTkzLDE4IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAobU91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgdWludDMyX3QgaGFsRnJhbWVzOwotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmdldFJlbmRlclBvc2l0aW9uKG1PdXRwdXQsICZoYWxGcmFtZXMsICZkc3BGcmFtZXMpOworICAgICAgICAgICAgdWludDMyX3QgaGFsRnJhbWVzOyAvLyBhY3R1YWxseSB1bnVzZWQKKyAgICAgICAgICAgICh2b2lkKSBBdWRpb1N5c3RlbTo6Z2V0UmVuZGVyUG9zaXRpb24obU91dHB1dCwgJmhhbEZyYW1lcywgJmRzcEZyYW1lcyk7CisgICAgICAgICAgICAvLyBGSVhNRTogb24gZ2V0UmVuZGVyUG9zaXRpb24oKSBlcnJvciwgd2UgcmV0dXJuIE9LIHdpdGggZnJhbWUgcG9zaXRpb24gMC4KICAgICAgICAgfQogICAgICAgICAvLyBGSVhNRTogZHNwRnJhbWVzIG1heSBub3QgYmUgemVybyBpbiAobVN0YXRlID09IFNUQVRFX1NUT1BQRUQgfHwgbVN0YXRlID09IFNUQVRFX0ZMVVNIRUQpCiAgICAgICAgIC8vIGR1ZSB0byBoYXJkd2FyZSBsYXRlbmN5LiBXZSBsZWF2ZSB0aGlzIGJlaGF2aW9yIGZvciBub3cuCiAgICAgICAgICpwb3NpdGlvbiA9IGRzcEZyYW1lczsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAobUNibGstPm1GbGFncyAmIENCTEtfSU5WQUxJRCkgewotICAgICAgICAgICAgcmVzdG9yZVRyYWNrX2woImdldFBvc2l0aW9uIik7CisgICAgICAgICAgICAodm9pZCkgcmVzdG9yZVRyYWNrX2woImdldFBvc2l0aW9uIik7CisgICAgICAgICAgICAvLyBGSVhNRTogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgSmF2YSBBUEkgd2UgaWdub3JlIHRoZSByZXN0b3JlVHJhY2tfbCgpCisgICAgICAgICAgICAvLyBlcnJvciBoZXJlIChlLmcuIERFQURfT0JKRUNUKSBhbmQgcmV0dXJuIE9LIHdpdGggdGhlIGxhc3QgcmVjb3JkZWQgc2VydmVyIHBvc2l0aW9uLgogICAgICAgICB9CiAKICAgICAgICAgLy8gSUF1ZGlvVHJhY2s6OnN0b3AoKSBpc24ndCBzeW5jaHJvbm91czsgd2UgZG9uJ3Qga25vdyB3aGVuIHByZXNlbnRhdGlvbiBjb21wbGV0ZXMKQEAgLTg5MywxMCArMTA0MCwxOSBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIG1OZXdQb3NpdGlvbiA9IG1VcGRhdGVQZXJpb2Q7Ci0gICAgbUxvb3BQZXJpb2QgPSAwOwotICAgIC8vIEZJWE1FIFRoZSBuZXcgY29kZSBjYW5ub3QgcmVsb2FkIHdoaWxlIGtlZXBpbmcgYSBsb29wIHNwZWNpZmllZC4KLSAgICAvLyBOZWVkIHRvIGNoZWNrIGhvdyB0aGUgb2xkIGNvZGUgaGFuZGxlZCB0aGlzLCBhbmQgd2hldGhlciBpdCdzIGEgc2lnbmlmaWNhbnQgY2hhbmdlLgotICAgIG1TdGF0aWNQcm94eS0+c2V0TG9vcCgwLCBtRnJhbWVDb3VudCwgMCk7CisgICAgKHZvaWQpIHVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKTsKKyAgICBtUG9zaXRpb24gPSAwOworICAgIG1QcmV2aW91c1RpbWVzdGFtcFZhbGlkID0gZmFsc2U7CisjaWYgMAorICAgIC8vIFRoZSBkb2N1bWVudGF0aW9uIGlzIG5vdCBjbGVhciBvbiB0aGUgYmVoYXZpb3Igb2YgcmVsb2FkKCkgYW5kIHRoZSByZXN0b3JhdGlvbgorICAgIC8vIG9mIGxvb3AgY291bnQuIEhpc3RvcmljYWxseSB3ZSBoYXZlIG5vdCByZXN0b3JlZCBsb29wIGNvdW50LCBzdGFydCwgZW5kLAorICAgIC8vIGJ1dCBpdCBtYWtlcyBzZW5zZSBpZiBvbmUgZGVzaXJlcyB0byByZXBlYXQgcGxheWluZyBhIHBhcnRpY3VsYXIgc291bmQuCisgICAgaWYgKG1Mb29wQ291bnQgIT0gMCkgeworICAgICAgICBtTG9vcENvdW50Tm90aWZpZWQgPSBtTG9vcENvdW50OworICAgICAgICBtU3RhdGljUHJveHktPnNldExvb3AobUxvb3BTdGFydCwgbUxvb3BFbmQsIG1Mb29wQ291bnQpOworICAgIH0KKyNlbmRpZgorICAgIG1TdGF0aWNQcm94eS0+c2V0QnVmZmVyUG9zaXRpb24oMCk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC05MDYsNiArMTA2MiwyOCBAQAogICAgIHJldHVybiBtT3V0cHV0OwogfQogCitzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgeworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVNlbGVjdGVkRGV2aWNlSWQgIT0gZGV2aWNlSWQpIHsKKyAgICAgICAgbVNlbGVjdGVkRGV2aWNlSWQgPSBkZXZpY2VJZDsKKyAgICAgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19JTlZBTElELCAmbUNibGstPm1GbGFncyk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYXVkaW9fcG9ydF9oYW5kbGVfdCBBdWRpb1RyYWNrOjpnZXRPdXRwdXREZXZpY2UoKSB7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIHJldHVybiBtU2VsZWN0ZWREZXZpY2VJZDsKK30KKworYXVkaW9fcG9ydF9oYW5kbGVfdCBBdWRpb1RyYWNrOjpnZXRSb3V0ZWREZXZpY2VJZCgpIHsKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgaWYgKG1PdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgfQorICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlSWRGb3JJbyhtT3V0cHV0KTsKK30KKwogc3RhdHVzX3QgQXVkaW9UcmFjazo6YXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CkBAIC05MzUsMTkgKzExMTMsMjMgQEAKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogCisgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwICYmIG1PdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLCBtT3V0cHV0KTsKKyAgICB9CiAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0OwogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IG1TdHJlYW1UeXBlOwogICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciA9IChtU3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgPyAmbUF0dHJpYnV0ZXMgOiBOVUxMOwotICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKGF0dHIsICZvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3Nlc3Npb25fdCltU2Vzc2lvbklkLCAmc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncywgbU9mZmxvYWRJbmZvKTsKIAorICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cihhdHRyLCAmb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19zZXNzaW9uX3QpbVNlc3Npb25JZCwgJnN0cmVhbVR5cGUsIG1DbGllbnRVaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MsIG1TZWxlY3RlZERldmljZUlkLCBtT2ZmbG9hZEluZm8pOwogCiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fCBvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYXVkaW8gb3V0cHV0IGZvciBzdHJlYW0gdHlwZSAlZCwgdXNhZ2UgJWQsIHNhbXBsZSByYXRlICV1LCBmb3JtYXQgJSN4LCIKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYXVkaW8gb3V0cHV0IGZvciBzZXNzaW9uICVkLCBzdHJlYW0gdHlwZSAlZCwgdXNhZ2UgJWQsIHNhbXBsZSByYXRlICV1LCBmb3JtYXQgJSN4LCIKICAgICAgICAgICAgICAgIiBjaGFubmVsIG1hc2sgJSN4LCBmbGFncyAlI3giLAotICAgICAgICAgICAgICBzdHJlYW1UeXBlLCBtQXR0cmlidXRlcy51c2FnZSwgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgbUZsYWdzKTsKKyAgICAgICAgICAgICAgbVNlc3Npb25JZCwgc3RyZWFtVHlwZSwgbUF0dHJpYnV0ZXMudXNhZ2UsIG1TYW1wbGVSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssIG1GbGFncyk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIHsKQEAgLTk1NSwyOSArMTEzNywyNyBAQAogICAgIC8vIHdlIG11c3QgcmVsZWFzZSBpdCBvdXJzZWx2ZXMgaWYgYW55dGhpbmcgZ29lcyB3cm9uZy4KIAogICAgIC8vIE5vdCBhbGwgb2YgdGhlc2UgdmFsdWVzIGFyZSBuZWVkZWQgdW5kZXIgYWxsIGNvbmRpdGlvbnMsIGJ1dCBpdCBpcyBlYXNpZXIgdG8gZ2V0IHRoZW0gYWxsCi0KLSAgICB1aW50MzJfdCBhZkxhdGVuY3k7Ci0gICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldExhdGVuY3kob3V0cHV0LCAmYWZMYXRlbmN5KTsKKyAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0TGF0ZW5jeShvdXRwdXQsICZtQWZMYXRlbmN5KTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dFKCJnZXRMYXRlbmN5KCVkKSBmYWlsZWQgc3RhdHVzICVkIiwgb3V0cHV0LCBzdGF0dXMpOwogICAgICAgICBnb3RvIHJlbGVhc2U7CiAgICAgfQorICAgIEFMT0dWKCJjcmVhdGVUcmFja19sKCkgb3V0cHV0ICVkIGFmTGF0ZW5jeSAldSIsIG91dHB1dCwgbUFmTGF0ZW5jeSk7CiAKLSAgICBzaXplX3QgYWZGcmFtZUNvdW50OwotICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRGcmFtZUNvdW50KG91dHB1dCwgJmFmRnJhbWVDb3VudCk7CisgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldEZyYW1lQ291bnQob3V0cHV0LCAmbUFmRnJhbWVDb3VudCk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiZ2V0RnJhbWVDb3VudChvdXRwdXQ9JWQpIHN0YXR1cyAlZCIsIG91dHB1dCwgc3RhdHVzKTsKICAgICAgICAgZ290byByZWxlYXNlOwogICAgIH0KIAotICAgIHVpbnQzMl90IGFmU2FtcGxlUmF0ZTsKLSAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0U2FtcGxpbmdSYXRlKG91dHB1dCwgJmFmU2FtcGxlUmF0ZSk7CisgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldFNhbXBsaW5nUmF0ZShvdXRwdXQsICZtQWZTYW1wbGVSYXRlKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dFKCJnZXRTYW1wbGluZ1JhdGUob3V0cHV0PSVkKSBzdGF0dXMgJWQiLCBvdXRwdXQsIHN0YXR1cyk7CiAgICAgICAgIGdvdG8gcmVsZWFzZTsKICAgICB9CiAgICAgaWYgKG1TYW1wbGVSYXRlID09IDApIHsKLSAgICAgICAgbVNhbXBsZVJhdGUgPSBhZlNhbXBsZVJhdGU7CisgICAgICAgIG1TYW1wbGVSYXRlID0gbUFmU2FtcGxlUmF0ZTsKKyAgICAgICAgbU9yaWdpbmFsU2FtcGxlUmF0ZSA9IG1BZlNhbXBsZVJhdGU7CiAgICAgfQogICAgIC8vIENsaWVudCBkZWNpZGVzIHdoZXRoZXIgdGhlIHRyYWNrIGlzIFRJTUVEIChzZWUgYmVsb3cpLCBidXQgY2FuIG9ubHkgZXhwcmVzcyBhIHByZWZlcmVuY2UKICAgICAvLyBmb3IgRkFTVC4gIFNlcnZlciB3aWxsIHBlcmZvcm0gYWRkaXRpb25hbCB0ZXN0cy4KQEAgLTk4NiwyMyArMTE2NiwyMyBAQAogICAgICAgICAgICAgLy8gdXNlIGNhc2UgMTogc2hhcmVkIGJ1ZmZlcgogICAgICAgICAgICAgKG1TaGFyZWRCdWZmZXIgIT0gMCkgfHwKICAgICAgICAgICAgIC8vIHVzZSBjYXNlIDI6IGNhbGxiYWNrIHRyYW5zZmVyIG1vZGUKLSAgICAgICAgICAgIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfQ0FMTEJBQ0spKSAmJgorICAgICAgICAgICAgKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9DQUxMQkFDSykgfHwKKyAgICAgICAgICAgIC8vIHVzZSBjYXNlIDM6IG9idGFpbi9yZWxlYXNlIG1vZGUKKyAgICAgICAgICAgIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfT0JUQUlOKSkgJiYKICAgICAgICAgICAgIC8vIG1hdGNoaW5nIHNhbXBsZSByYXRlCi0gICAgICAgICAgICAobVNhbXBsZVJhdGUgPT0gYWZTYW1wbGVSYXRlKSkpIHsKLSAgICAgICAgQUxPR1coIkFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IGNsaWVudCIpOworICAgICAgICAgICAgKG1TYW1wbGVSYXRlID09IG1BZlNhbXBsZVJhdGUpKSkgeworICAgICAgICBBTE9HVygiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgY2xpZW50OyB0cmFuc2ZlciAlZCwgdHJhY2sgJXUgSHosIG91dHB1dCAldSBIeiIsCisgICAgICAgICAgICAgICAgbVRyYW5zZmVyLCBtU2FtcGxlUmF0ZSwgbUFmU2FtcGxlUmF0ZSk7CiAgICAgICAgIC8vIG9uY2UgZGVuaWVkLCBkbyBub3QgcmVxdWVzdCBhZ2FpbiBpZiBJQXVkaW9UcmFjayBpcyByZS1jcmVhdGVkCiAgICAgICAgIG1GbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKG1GbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19GQVNUKTsKICAgICB9Ci0gICAgQUxPR1YoImNyZWF0ZVRyYWNrX2woKSBvdXRwdXQgJWQgYWZMYXRlbmN5ICVkIiwgb3V0cHV0LCBhZkxhdGVuY3kpOwogCiAgICAgLy8gVGhlIGNsaWVudCdzIEF1ZGlvVHJhY2sgYnVmZmVyIGlzIGRpdmlkZWQgaW50byBuIHBhcnRzIGZvciBwdXJwb3NlIG9mIHdha2V1cCBieSBzZXJ2ZXIsIHdoZXJlCiAgICAgLy8gIG4gPSAxICAgZmFzdCB0cmFjayB3aXRoIHNpbmdsZSBidWZmZXJpbmc7IG5CdWZmZXJpbmcgaXMgaWdub3JlZAogICAgIC8vICBuID0gMiAgIGZhc3QgdHJhY2sgd2l0aCBkb3VibGUgYnVmZmVyaW5nCi0gICAgLy8gIG4gPSAyICAgbm9ybWFsIHRyYWNrLCBubyBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uCi0gICAgLy8gIG4gPSAzICAgbm9ybWFsIHRyYWNrLCB3aXRoIHNhbXBsZSByYXRlIGNvbnZlcnNpb24KLSAgICAvLyAgICAgICAgICAocGVzc2ltaXN0aWM7IHNvbWUgbm9uLTE6MSBjb252ZXJzaW9uIHJhdGlvcyBkb24ndCBhY3R1YWxseSBuZWVkIHRyaXBsZS1idWZmZXJpbmcpCi0gICAgLy8gIG4gPiAzICAgdmVyeSBoaWdoIGxhdGVuY3kgb3IgdmVyeSBzbWFsbCBub3RpZmljYXRpb24gaW50ZXJ2YWw7IG5CdWZmZXJpbmcgaXMgaWdub3JlZAotICAgIGNvbnN0IHVpbnQzMl90IG5CdWZmZXJpbmcgPSAobVNhbXBsZVJhdGUgPT0gYWZTYW1wbGVSYXRlKSA/IDIgOiAzOworICAgIC8vICBuID0gMiAgIG5vcm1hbCB0cmFjaywgKGluY2x1ZGluZyB0aG9zZSB3aXRoIHNhbXBsZSByYXRlIGNvbnZlcnNpb24pCisgICAgLy8gIG4gPj0gMyAgdmVyeSBoaWdoIGxhdGVuY3kgb3IgdmVyeSBzbWFsbCBub3RpZmljYXRpb24gaW50ZXJ2YWwgKHVudXNlZCkuCisgICAgY29uc3QgdWludDMyX3QgbkJ1ZmZlcmluZyA9IDI7CiAKICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gbU5vdGlmaWNhdGlvbkZyYW1lc1JlcTsKIApAQCAtMTAxMywxOCArMTE5MywxOCBAQAogICAgICAgICAgICAgLy8gU2FtZSBjb21tZW50IGFzIGJlbG93IGFib3V0IGlnbm9yaW5nIGZyYW1lQ291bnQgcGFyYW1ldGVyIGZvciBzZXQoKQogICAgICAgICAgICAgZnJhbWVDb3VudCA9IG1TaGFyZWRCdWZmZXItPnNpemUoKTsKICAgICAgICAgfSBlbHNlIGlmIChmcmFtZUNvdW50ID09IDApIHsKLSAgICAgICAgICAgIGZyYW1lQ291bnQgPSBhZkZyYW1lQ291bnQ7CisgICAgICAgICAgICBmcmFtZUNvdW50ID0gbUFmRnJhbWVDb3VudDsKICAgICAgICAgfQogICAgICAgICBpZiAobU5vdGlmaWNhdGlvbkZyYW1lc0FjdCAhPSBmcmFtZUNvdW50KSB7CiAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gZnJhbWVDb3VudDsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobVNoYXJlZEJ1ZmZlciAhPSAwKSB7Ci0KLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgYnVmZmVyIGFsaWdubWVudCBtYXRjaGVzIGNoYW5uZWwgY291bnQKLSAgICAgICAgLy8gOC1iaXQgZGF0YSBpbiBzaGFyZWQgbWVtb3J5IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IEF1ZGlvRmxpbmdlcgotICAgICAgICBzaXplX3QgYWxpZ25tZW50ID0gYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSgKLSAgICAgICAgICAgICAgICBtRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQgPyBBVURJT19GT1JNQVRfUENNXzE2X0JJVCA6IG1Gb3JtYXQpOworICAgICAgICAvLyBGSVhNRTogRW5zdXJlIGNsaWVudCBzaWRlIG1lbW9yeSBidWZmZXJzIG5lZWQKKyAgICAgICAgLy8gbm90IGhhdmUgYWRkaXRpb25hbCBhbGlnbm1lbnQgYmV5b25kIHNhbXBsZQorICAgICAgICAvLyAoZS5nLiAxNiBiaXQgc3RlcmVvIGFjY2Vzc2VkIGFzIDMyIGJpdCBmcmFtZSkuCisgICAgICAgIHNpemVfdCBhbGlnbm1lbnQgPSBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1Gb3JtYXQpOwogICAgICAgICBpZiAoYWxpZ25tZW50ICYgMSkgeworICAgICAgICAgICAgLy8gZm9yIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRCAobm90IGV4cG9zZWQgdGhyb3VnaCBKYXZhKS4KICAgICAgICAgICAgIGFsaWdubWVudCA9IDE7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1DaGFubmVsQ291bnQgPiAxKSB7CkBAIC0xMDQyLDQwICsxMjIyLDE5IEBACiAgICAgICAgIC8vIHRoZXJlJ3Mgbm8gZnJhbWVDb3VudCBwYXJhbWV0ZXIuCiAgICAgICAgIC8vIEJ1dCB3aGVuIGluaXRpYWxpemluZyBhIHNoYXJlZCBidWZmZXIgQXVkaW9UcmFjayB2aWEgc2V0KCksCiAgICAgICAgIC8vIHRoZXJlIF9pc18gYSBmcmFtZUNvdW50IHBhcmFtZXRlci4gIFdlIHNpbGVudGx5IGlnbm9yZSBpdC4KLSAgICAgICAgZnJhbWVDb3VudCA9IG1TaGFyZWRCdWZmZXItPnNpemUoKSAvIG1GcmFtZVNpemVBRjsKLQotICAgIH0gZWxzZSBpZiAoIShtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSkgewotCi0gICAgICAgIC8vIEZJWE1FIG1vdmUgdGhlc2UgY2FsY3VsYXRpb25zIGFuZCBhc3NvY2lhdGVkIGNoZWNrcyB0byBzZXJ2ZXIKLQotICAgICAgICAvLyBFbnN1cmUgdGhhdCBidWZmZXIgZGVwdGggY292ZXJzIGF0IGxlYXN0IGF1ZGlvIGhhcmR3YXJlIGxhdGVuY3kKLSAgICAgICAgdWludDMyX3QgbWluQnVmQ291bnQgPSBhZkxhdGVuY3kgLyAoKDEwMDAgKiBhZkZyYW1lQ291bnQpL2FmU2FtcGxlUmF0ZSk7Ci0gICAgICAgIEFMT0dWKCJhZkZyYW1lQ291bnQ9JXp1LCBtaW5CdWZDb3VudD0lZCwgYWZTYW1wbGVSYXRlPSV1LCBhZkxhdGVuY3k9JWQiLAotICAgICAgICAgICAgICAgIGFmRnJhbWVDb3VudCwgbWluQnVmQ291bnQsIGFmU2FtcGxlUmF0ZSwgYWZMYXRlbmN5KTsKLSAgICAgICAgaWYgKG1pbkJ1ZkNvdW50IDw9IG5CdWZmZXJpbmcpIHsKLSAgICAgICAgICAgIG1pbkJ1ZkNvdW50ID0gbkJ1ZmZlcmluZzsKLSAgICAgICAgfQotCi0gICAgICAgIHNpemVfdCBtaW5GcmFtZUNvdW50ID0gYWZGcmFtZUNvdW50ICogbWluQnVmQ291bnQgKiB1aW50NjRfdChtU2FtcGxlUmF0ZSkgLyBhZlNhbXBsZVJhdGU7Ci0gICAgICAgIEFMT0dWKCJtaW5GcmFtZUNvdW50OiAlenUsIGFmRnJhbWVDb3VudD0lenUsIG1pbkJ1ZkNvdW50PSVkLCBzYW1wbGVSYXRlPSV1LCBhZlNhbXBsZVJhdGU9JXUiCi0gICAgICAgICAgICAgICAgIiwgYWZMYXRlbmN5PSVkIiwKLSAgICAgICAgICAgICAgICBtaW5GcmFtZUNvdW50LCBhZkZyYW1lQ291bnQsIG1pbkJ1ZkNvdW50LCBtU2FtcGxlUmF0ZSwgYWZTYW1wbGVSYXRlLCBhZkxhdGVuY3kpOwotCi0gICAgICAgIGlmIChmcmFtZUNvdW50ID09IDApIHsKLSAgICAgICAgICAgIGZyYW1lQ291bnQgPSBtaW5GcmFtZUNvdW50OwotICAgICAgICB9IGVsc2UgaWYgKGZyYW1lQ291bnQgPCBtaW5GcmFtZUNvdW50KSB7Ci0gICAgICAgICAgICAvLyBub3QgQUxPR1cgYmVjYXVzZSBpdCBoYXBwZW5zIGFsbCB0aGUgdGltZSB3aGVuIHBsYXlpbmcga2V5IGNsaWNrcyBvdmVyIEEyRFAKLSAgICAgICAgICAgIEFMT0dWKCJNaW5pbXVtIGJ1ZmZlciBzaXplIGNvcnJlY3RlZCBmcm9tICV6dSB0byAlenUiLAotICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgbWluRnJhbWVDb3VudCk7Ci0gICAgICAgICAgICBmcmFtZUNvdW50ID0gbWluRnJhbWVDb3VudDsKLSAgICAgICAgfQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBhcHBsaWNhdGlvbiBpcyBub3RpZmllZCB3aXRoIHN1ZmZpY2llbnQgbWFyZ2luIGJlZm9yZSB1bmRlcnJ1bgotICAgICAgICBpZiAobU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9PSAwIHx8IG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPiBmcmFtZUNvdW50L25CdWZmZXJpbmcpIHsKLSAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSBmcmFtZUNvdW50L25CdWZmZXJpbmc7Ci0gICAgICAgIH0KLQorICAgICAgICBmcmFtZUNvdW50ID0gbVNoYXJlZEJ1ZmZlci0+c2l6ZSgpIC8gbUZyYW1lU2l6ZTsKICAgICB9IGVsc2UgewotICAgICAgICAvLyBGb3IgZmFzdCB0cmFja3MsIHRoZSBmcmFtZSBjb3VudCBjYWxjdWxhdGlvbnMgYW5kIGNoZWNrcyBhcmUgZG9uZSBieSBzZXJ2ZXIKKyAgICAgICAgLy8gRm9yIGZhc3QgdHJhY2tzIHRoZSBmcmFtZSBjb3VudCBjYWxjdWxhdGlvbnMgYW5kIGNoZWNrcyBhcmUgZG9uZSBieSBzZXJ2ZXIKKworICAgICAgICBpZiAoKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpID09IDApIHsKKyAgICAgICAgICAgIC8vIGZvciBub3JtYWwgdHJhY2tzIHByZWNvbXB1dGUgdGhlIGZyYW1lIGNvdW50IGJhc2VkIG9uIHNwZWVkLgorICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG1pbkZyYW1lQ291bnQgPSBjYWxjdWxhdGVNaW5GcmFtZUNvdW50KAorICAgICAgICAgICAgICAgICAgICBtQWZMYXRlbmN5LCBtQWZGcmFtZUNvdW50LCBtQWZTYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrUmF0ZS5tU3BlZWQpOworICAgICAgICAgICAgaWYgKGZyYW1lQ291bnQgPCBtaW5GcmFtZUNvdW50KSB7CisgICAgICAgICAgICAgICAgZnJhbWVDb3VudCA9IG1pbkZyYW1lQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IHRyYWNrRmxhZ3MgPSBJQXVkaW9GbGluZ2VyOjpUUkFDS19ERUZBVUxUOwpAQCAtMTEwMSwxMiArMTI2MCwxMCBAQAogCiAgICAgc2l6ZV90IHRlbXAgPSBmcmFtZUNvdW50OyAgIC8vIHRlbXAgbWF5IGJlIHJlcGxhY2VkIGJ5IGEgcmV2aXNlZCB2YWx1ZSBvZiBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgd2Ugd2lsbCBzdGlsbCBuZWVkIHRoZSBvcmlnaW5hbCB2YWx1ZSBhbHNvCisgICAgaW50IG9yaWdpbmFsU2Vzc2lvbklkID0gbVNlc3Npb25JZDsKICAgICBzcDxJQXVkaW9UcmFjaz4gdHJhY2sgPSBhdWRpb0ZsaW5nZXItPmNyZWF0ZVRyYWNrKHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvRmxpbmdlciBvbmx5IHNlZXMgMTYtYml0IFBDTQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfQklUICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIShtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgOiBtRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrRmxhZ3MsCkBAIC0xMTE2LDYgKzEyNzMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1TZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50VWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7CisgICAgQUxPR0VfSUYob3JpZ2luYWxTZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSAmJiBtU2Vzc2lvbklkICE9IG9yaWdpbmFsU2Vzc2lvbklkLAorICAgICAgICAgICAgInNlc3Npb24gSUQgY2hhbmdlZCBmcm9tICVkIHRvICVkIiwgb3JpZ2luYWxTZXNzaW9uSWQsIG1TZXNzaW9uSWQpOwogCiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgdHJhY2ssIHN0YXR1czogJWQiLCBzdGF0dXMpOwpAQCAtMTE2MSwyMyArMTMyMCwxMCBAQAogICAgICAgICBpZiAodHJhY2tGbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpIHsKICAgICAgICAgICAgIEFMT0dWKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIHN1Y2Nlc3NmdWw7IGZyYW1lQ291bnQgJXp1IiwgZnJhbWVDb3VudCk7CiAgICAgICAgICAgICBtQXdhaXRCb29zdCA9IHRydWU7Ci0gICAgICAgICAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlb3JldGljYWxseSBkb3VibGUtYnVmZmVyaW5nIGlzIG5vdCByZXF1aXJlZCBmb3IgZmFzdCB0cmFja3MsCi0gICAgICAgICAgICAgICAgLy8gZHVlIHRvIHRpZ2h0ZXIgc2NoZWR1bGluZy4gIEJ1dCBpbiBwcmFjdGljZSwgdG8gYWNjb21tb2RhdGUga2VybmVscyB3aXRoCi0gICAgICAgICAgICAgICAgLy8gc2NoZWR1bGluZyBqaXR0ZXIsIGFuZCBhcHBzIHdpdGggY29tcHV0YXRpb24gaml0dGVyLCB3ZSB1c2UgZG91YmxlLWJ1ZmZlcmluZy4KLSAgICAgICAgICAgICAgICBpZiAobU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9PSAwIHx8IG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPiBmcmFtZUNvdW50L25CdWZmZXJpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9IGZyYW1lQ291bnQvbkJ1ZmZlcmluZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVigiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgc2VydmVyOyBmcmFtZUNvdW50ICV6dSIsIGZyYW1lQ291bnQpOwogICAgICAgICAgICAgLy8gb25jZSBkZW5pZWQsIGRvIG5vdCByZXF1ZXN0IGFnYWluIGlmIElBdWRpb1RyYWNrIGlzIHJlLWNyZWF0ZWQKICAgICAgICAgICAgIG1GbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKG1GbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19GQVNUKTsKLSAgICAgICAgICAgIGlmIChtU2hhcmVkQnVmZmVyID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAobU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9PSAwIHx8IG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPiBmcmFtZUNvdW50L25CdWZmZXJpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9IGZyYW1lQ291bnQvbkJ1ZmZlcmluZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpIHsKQEAgLTEyMDAsNiArMTM0NiwxNiBAQAogICAgICAgICAgICAgLy9yZXR1cm4gTk9fSU5JVDsKICAgICAgICAgfQogICAgIH0KKyAgICAvLyBNYWtlIHN1cmUgdGhhdCBhcHBsaWNhdGlvbiBpcyBub3RpZmllZCB3aXRoIHN1ZmZpY2llbnQgbWFyZ2luIGJlZm9yZSB1bmRlcnJ1bgorICAgIGlmIChtU2hhcmVkQnVmZmVyID09IDAgJiYgYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgeworICAgICAgICAvLyBUaGVvcmV0aWNhbGx5IGRvdWJsZS1idWZmZXJpbmcgaXMgbm90IHJlcXVpcmVkIGZvciBmYXN0IHRyYWNrcywKKyAgICAgICAgLy8gZHVlIHRvIHRpZ2h0ZXIgc2NoZWR1bGluZy4gIEJ1dCBpbiBwcmFjdGljZSwgdG8gYWNjb21tb2RhdGUga2VybmVscyB3aXRoCisgICAgICAgIC8vIHNjaGVkdWxpbmcgaml0dGVyLCBhbmQgYXBwcyB3aXRoIGNvbXB1dGF0aW9uIGppdHRlciwgd2UgdXNlIGRvdWJsZS1idWZmZXJpbmcKKyAgICAgICAgLy8gZm9yIGZhc3QgdHJhY2tzIGp1c3QgbGlrZSBub3JtYWwgc3RyZWFtaW5nIHRyYWNrcy4KKyAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPT0gMCB8fCBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID4gZnJhbWVDb3VudCAvIG5CdWZmZXJpbmcpIHsKKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSBmcmFtZUNvdW50IC8gbkJ1ZmZlcmluZzsKKyAgICAgICAgfQorICAgIH0KIAogICAgIC8vIFdlIHJldGFpbiBhIGNvcHkgb2YgdGhlIEkvTyBoYW5kbGUsIGJ1dCBkb24ndCBvd24gdGhlIHJlZmVyZW5jZQogICAgIG1PdXRwdXQgPSBvdXRwdXQ7CkBAIC0xMjExLDE0ICsxMzY3LDE5IEBACiAgICAgLy8gYWRkcmVzcyBzcGFjZS4gIEF1ZGlvRmxpbmdlcjo6VHJhY2tCYXNlOjptQnVmZmVyIGlzIGZvciB0aGUgc2VydmVyIGFkZHJlc3Mgc3BhY2UuCiAgICAgdm9pZCogYnVmZmVyczsKICAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwKSB7Ci0gICAgICAgIGJ1ZmZlcnMgPSAoY2hhciopY2JsayArIHNpemVvZihhdWRpb190cmFja19jYmxrX3QpOworICAgICAgICBidWZmZXJzID0gY2JsayArIDE7CiAgICAgfSBlbHNlIHsKICAgICAgICAgYnVmZmVycyA9IG1TaGFyZWRCdWZmZXItPnBvaW50ZXIoKTsKKyAgICAgICAgaWYgKGJ1ZmZlcnMgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYnVmZmVyIHBvaW50ZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CiAgICAgfQogCiAgICAgbUF1ZGlvVHJhY2stPmF0dGFjaEF1eEVmZmVjdChtQXV4RWZmZWN0SWQpOworICAgIC8vIEZJWE1FIGRvZXNuJ3QgdGFrZSBpbnRvIGFjY291bnQgc3BlZWQgb3IgZnV0dXJlIHNhbXBsZSByYXRlIGNoYW5nZXMgKHVudGlsIHJlc3RvcmVUcmFjaykKICAgICAvLyBGSVhNRSBkb24ndCBiZWxpZXZlIHRoaXMgbGllCi0gICAgbUxhdGVuY3kgPSBhZkxhdGVuY3kgKyAoMTAwMCpmcmFtZUNvdW50KSAvIG1TYW1wbGVSYXRlOworICAgIG1MYXRlbmN5ID0gbUFmTGF0ZW5jeSArICgxMDAwKmZyYW1lQ291bnQpIC8gbVNhbXBsZVJhdGU7CiAKICAgICBtRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CiAgICAgLy8gSWYgSUF1ZGlvVHJhY2sgaXMgcmUtY3JlYXRlZCwgZG9uJ3QgbGV0IHRoZSByZXF1ZXN0ZWQgZnJhbWVDb3VudApAQCAtMTIyNywxMiArMTM4OCwxNSBAQAogICAgICAgICBtUmVxRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CiAgICAgfQogCisgICAgLy8gcmVzZXQgc2VydmVyIHBvc2l0aW9uIHRvIDAgYXMgd2UgaGF2ZSBuZXcgY2Jsay4KKyAgICBtU2VydmVyID0gMDsKKwogICAgIC8vIHVwZGF0ZSBwcm94eQogICAgIGlmIChtU2hhcmVkQnVmZmVyID09IDApIHsKICAgICAgICAgbVN0YXRpY1Byb3h5LmNsZWFyKCk7Ci0gICAgICAgIG1Qcm94eSA9IG5ldyBBdWRpb1RyYWNrQ2xpZW50UHJveHkoY2JsaywgYnVmZmVycywgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZUFGKTsKKyAgICAgICAgbVByb3h5ID0gbmV3IEF1ZGlvVHJhY2tDbGllbnRQcm94eShjYmxrLCBidWZmZXJzLCBmcmFtZUNvdW50LCBtRnJhbWVTaXplKTsKICAgICB9IGVsc2UgewotICAgICAgICBtU3RhdGljUHJveHkgPSBuZXcgU3RhdGljQXVkaW9UcmFja0NsaWVudFByb3h5KGNibGssIGJ1ZmZlcnMsIGZyYW1lQ291bnQsIG1GcmFtZVNpemVBRik7CisgICAgICAgIG1TdGF0aWNQcm94eSA9IG5ldyBTdGF0aWNBdWRpb1RyYWNrQ2xpZW50UHJveHkoY2JsaywgYnVmZmVycywgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZSk7CiAgICAgICAgIG1Qcm94eSA9IG1TdGF0aWNQcm94eTsKICAgICB9CiAKQEAgLTEyNDEsMTIgKzE0MDUsMjQgQEAKICAgICAgICAgICAgIGdhaW5fZnJvbV9mbG9hdChtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfUklHSFRdKSkpOwogCiAgICAgbVByb3h5LT5zZXRTZW5kTGV2ZWwobVNlbmRMZXZlbCk7Ci0gICAgbVByb3h5LT5zZXRTYW1wbGVSYXRlKG1TYW1wbGVSYXRlKTsKKyAgICBjb25zdCB1aW50MzJfdCBlZmZlY3RpdmVTYW1wbGVSYXRlID0gYWRqdXN0U2FtcGxlUmF0ZShtU2FtcGxlUmF0ZSwgbVBsYXliYWNrUmF0ZS5tUGl0Y2gpOworICAgIGNvbnN0IGZsb2F0IGVmZmVjdGl2ZVNwZWVkID0gYWRqdXN0U3BlZWQobVBsYXliYWNrUmF0ZS5tU3BlZWQsIG1QbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICBjb25zdCBmbG9hdCBlZmZlY3RpdmVQaXRjaCA9IGFkanVzdFBpdGNoKG1QbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICBtUHJveHktPnNldFNhbXBsZVJhdGUoZWZmZWN0aXZlU2FtcGxlUmF0ZSk7CisKKyAgICBBdWRpb1BsYXliYWNrUmF0ZSBwbGF5YmFja1JhdGVUZW1wID0gbVBsYXliYWNrUmF0ZTsKKyAgICBwbGF5YmFja1JhdGVUZW1wLm1TcGVlZCA9IGVmZmVjdGl2ZVNwZWVkOworICAgIHBsYXliYWNrUmF0ZVRlbXAubVBpdGNoID0gZWZmZWN0aXZlUGl0Y2g7CisgICAgbVByb3h5LT5zZXRQbGF5YmFja1JhdGUocGxheWJhY2tSYXRlVGVtcCk7CiAgICAgbVByb3h5LT5zZXRNaW5pbXVtKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QpOwogCiAgICAgbURlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcih0aGlzKTsKICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQXVkaW9UcmFjayktPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKIAorICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCkgeworICAgICAgICBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2ssIG1PdXRwdXQpOworICAgIH0KKwogICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKQEAgLTEyNTgsMTUgKzE0MzQsMjEgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBBdWRpb1RyYWNrOjpvYnRhaW5CdWZmZXIoQnVmZmVyKiBhdWRpb0J1ZmZlciwgaW50MzJfdCB3YWl0Q291bnQpCitzdGF0dXNfdCBBdWRpb1RyYWNrOjpvYnRhaW5CdWZmZXIoQnVmZmVyKiBhdWRpb0J1ZmZlciwgaW50MzJfdCB3YWl0Q291bnQsIHNpemVfdCAqbm9uQ29udGlnKQogewogICAgIGlmIChhdWRpb0J1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIGlmIChub25Db250aWcgIT0gTlVMTCkgeworICAgICAgICAgICAgKm5vbkNvbnRpZyA9IDA7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgaWYgKG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9PQlRBSU4pIHsKICAgICAgICAgYXVkaW9CdWZmZXItPmZyYW1lQ291bnQgPSAwOwogICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IDA7CiAgICAgICAgIGF1ZGlvQnVmZmVyLT5yYXcgPSBOVUxMOworICAgICAgICBpZiAobm9uQ29udGlnICE9IE5VTEwpIHsKKyAgICAgICAgICAgICpub25Db250aWcgPSAwOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKQEAgLTEyODUsNyArMTQ2Nyw3IEBACiAgICAgICAgIEFMT0dFKCIlcyBpbnZhbGlkIHdhaXRDb3VudCAlZCIsIF9fZnVuY19fLCB3YWl0Q291bnQpOwogICAgICAgICByZXF1ZXN0ZWQgPSBOVUxMOwogICAgIH0KLSAgICByZXR1cm4gb2J0YWluQnVmZmVyKGF1ZGlvQnVmZmVyLCByZXF1ZXN0ZWQpOworICAgIHJldHVybiBvYnRhaW5CdWZmZXIoYXVkaW9CdWZmZXIsIHJlcXVlc3RlZCwgTlVMTCAvKmVsYXBzZWQqLywgbm9uQ29udGlnKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6b2J0YWluQnVmZmVyKEJ1ZmZlciogYXVkaW9CdWZmZXIsIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqcmVxdWVzdGVkLApAQCAtMTM1Miw3ICsxNTM0LDcgQEAKICAgICB9IHdoaWxlICgoc3RhdHVzID09IERFQURfT0JKRUNUKSAmJiAodHJ5Q291bnRlci0tID4gMCkpOwogCiAgICAgYXVkaW9CdWZmZXItPmZyYW1lQ291bnQgPSBidWZmZXIubUZyYW1lQ291bnQ7Ci0gICAgYXVkaW9CdWZmZXItPnNpemUgPSBidWZmZXIubUZyYW1lQ291bnQgKiBtRnJhbWVTaXplQUY7CisgICAgYXVkaW9CdWZmZXItPnNpemUgPSBidWZmZXIubUZyYW1lQ291bnQgKiBtRnJhbWVTaXplOwogICAgIGF1ZGlvQnVmZmVyLT5yYXcgPSBidWZmZXIubVJhdzsKICAgICBpZiAobm9uQ29udGlnICE9IE5VTEwpIHsKICAgICAgICAgKm5vbkNvbnRpZyA9IGJ1ZmZlci5tTm9uQ29udGlnOwpAQCAtMTM2MCwxMyArMTU0MiwxNCBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgQXVkaW9UcmFjazo6cmVsZWFzZUJ1ZmZlcihCdWZmZXIqIGF1ZGlvQnVmZmVyKQordm9pZCBBdWRpb1RyYWNrOjpyZWxlYXNlQnVmZmVyKGNvbnN0IEJ1ZmZlciogYXVkaW9CdWZmZXIpCiB7CisgICAgLy8gRklYTUUgYWRkIGVycm9yIGNoZWNraW5nIG9uIG1vZGUsIGJ5IGFkZGluZyBhbiBpbnRlcm5hbCB2ZXJzaW9uCiAgICAgaWYgKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9TSEFSRUQpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHNpemVfdCBzdGVwQ291bnQgPSBhdWRpb0J1ZmZlci0+c2l6ZSAvIG1GcmFtZVNpemVBRjsKKyAgICBzaXplX3Qgc3RlcENvdW50ID0gYXVkaW9CdWZmZXItPnNpemUgLyBtRnJhbWVTaXplOwogICAgIGlmIChzdGVwQ291bnQgPT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTQzMSwxNSArMTYxNCw4IEBACiAgICAgICAgICAgICByZXR1cm4gc3NpemVfdChlcnIpOwogICAgICAgICB9CiAKLSAgICAgICAgc2l6ZV90IHRvV3JpdGU7Ci0gICAgICAgIGlmIChtRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQgJiYgIShtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpKSB7Ci0gICAgICAgICAgICAvLyBEaXZpZGUgY2FwYWNpdHkgYnkgMiB0byB0YWtlIGV4cGFuc2lvbiBpbnRvIGFjY291bnQKLSAgICAgICAgICAgIHRvV3JpdGUgPSBhdWRpb0J1ZmZlci5zaXplID4+IDE7Ci0gICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fdTgoYXVkaW9CdWZmZXIuaTE2LCAoY29uc3QgdWludDhfdCAqKSBidWZmZXIsIHRvV3JpdGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdG9Xcml0ZSA9IGF1ZGlvQnVmZmVyLnNpemU7Ci0gICAgICAgICAgICBtZW1jcHkoYXVkaW9CdWZmZXIuaTgsIGJ1ZmZlciwgdG9Xcml0ZSk7Ci0gICAgICAgIH0KKyAgICAgICAgc2l6ZV90IHRvV3JpdGUgPSBhdWRpb0J1ZmZlci5zaXplOworICAgICAgICBtZW1jcHkoYXVkaW9CdWZmZXIuaTgsIGJ1ZmZlciwgdG9Xcml0ZSk7CiAgICAgICAgIGJ1ZmZlciA9ICgoY29uc3QgY2hhciAqKSBidWZmZXIpICsgdG9Xcml0ZTsKICAgICAgICAgdXNlclNpemUgLT0gdG9Xcml0ZTsKICAgICAgICAgd3JpdHRlbiArPSB0b1dyaXRlOwpAQCAtMTU1OCwxMCArMTczNCwxMCBAQAogICAgICAgICAvLyBBdWRpb1N5c3RlbSBjYWNoZS4gV2Ugc2hvdWxkIG5vdCBleGl0IGhlcmUgYnV0IGFmdGVyIGNhbGxpbmcgdGhlIGNhbGxiYWNrIHNvCiAgICAgICAgIC8vIHRoYXQgdGhlIHVwcGVyIGxheWVycyBjYW4gcmVjcmVhdGUgdGhlIHRyYWNrCiAgICAgICAgIGlmICghaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgfHwgKG1TZXF1ZW5jZSA9PSBtT2JzZXJ2ZWRTZXF1ZW5jZSkpIHsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlc3RvcmVUcmFja19sKCJwcm9jZXNzQXVkaW9CdWZmZXIiKTsKLSAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgLy8gUnVuIGFnYWluIGltbWVkaWF0ZWx5LCBidXQgd2l0aCBhIG5ldyBJQXVkaW9UcmFjawotICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgX191bnVzZWQgPSByZXN0b3JlVHJhY2tfbCgicHJvY2Vzc0F1ZGlvQnVmZmVyIik7CisgICAgICAgICAgICAvLyBGSVhNRSB1bnVzZWQgc3RhdHVzCisgICAgICAgICAgICAvLyBhZnRlciByZXN0b3JhdGlvbiwgY29udGludWUgYmVsb3cgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGxvb3AgYW5kIGJ1ZmZlciBldmVudHMKKyAgICAgICAgICAgIC8vIGFyZSBub3RpZmllZCBiZWNhdXNlIHRoZXkgaGF2ZSBiZWVuIGNsZWFyZWQgZnJvbSBtQ2Jsay0+bUZsYWdzIGFib3ZlLgogICAgICAgICB9CiAgICAgfQogCkBAIC0xNjEwLDkgKzE3ODYsOSBAQAogICAgIH0KIAogICAgIC8vIENhY2hlIG90aGVyIGZpZWxkcyB0aGF0IHdpbGwgYmUgbmVlZGVkIHNvb24KLSAgICB1aW50MzJfdCBsb29wUGVyaW9kID0gbUxvb3BQZXJpb2Q7CiAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOwotICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IG1Ob3RpZmljYXRpb25GcmFtZXNBY3Q7CisgICAgZmxvYXQgc3BlZWQgPSBtUGxheWJhY2tSYXRlLm1TcGVlZDsKKyAgICBjb25zdCB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSBtTm90aWZpY2F0aW9uRnJhbWVzQWN0OwogICAgIGlmIChtUmVmcmVzaFJlbWFpbmluZykgewogICAgICAgICBtUmVmcmVzaFJlbWFpbmluZyA9IGZhbHNlOwogICAgICAgICBtUmVtYWluaW5nRnJhbWVzID0gbm90aWZpY2F0aW9uRnJhbWVzOwpAQCAtMTYyMiwxMyArMTc5OCw0MiBAQAogICAgIHVpbnQzMl90IHNlcXVlbmNlID0gbVNlcXVlbmNlOwogICAgIHNwPEF1ZGlvVHJhY2tDbGllbnRQcm94eT4gcHJveHkgPSBtUHJveHk7CiAKKyAgICAvLyBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBuZXcgbG9vcCBjYWxsYmFjayhzKSB0aGF0IHdpbGwgYmUgbmVlZGVkLCB3aGlsZSBsb2NrZWQuCisgICAgaW50IGxvb3BDb3VudE5vdGlmaWNhdGlvbnMgPSAwOworICAgIHVpbnQzMl90IGxvb3BQZXJpb2QgPSAwOyAvLyB0aW1lIGluIGZyYW1lcyBmb3IgbmV4dCBFVkVOVF9MT09QX0VORCBvciBFVkVOVF9CVUZGRVJfRU5ECisKKyAgICBpZiAobUxvb3BDb3VudCA+IDApIHsKKyAgICAgICAgaW50IGxvb3BDb3VudDsKKyAgICAgICAgc2l6ZV90IGJ1ZmZlclBvc2l0aW9uOworICAgICAgICBtU3RhdGljUHJveHktPmdldEJ1ZmZlclBvc2l0aW9uQW5kTG9vcENvdW50KCZidWZmZXJQb3NpdGlvbiwgJmxvb3BDb3VudCk7CisgICAgICAgIGxvb3BQZXJpb2QgPSAoKGxvb3BDb3VudCA+IDApID8gbUxvb3BFbmQgOiBtRnJhbWVDb3VudCkgLSBidWZmZXJQb3NpdGlvbjsKKyAgICAgICAgbG9vcENvdW50Tm90aWZpY2F0aW9ucyA9IG1pbihtTG9vcENvdW50Tm90aWZpZWQgLSBsb29wQ291bnQsIGtNYXhMb29wQ291bnROb3RpZmljYXRpb25zKTsKKyAgICAgICAgbUxvb3BDb3VudE5vdGlmaWVkID0gbG9vcENvdW50OyAvLyBkaXNjYXJkIGFueSBleGNlc3Mgbm90aWZpY2F0aW9ucworICAgIH0gZWxzZSBpZiAobUxvb3BDb3VudCA8IDApIHsKKyAgICAgICAgLy8gRklYTUU6IFdlJ3JlIG5vdCBhY2N1cmF0ZSB3aXRoIG5vdGlmaWNhdGlvbiBjb3VudCBhbmQgcG9zaXRpb24gd2l0aCBpbmZpbml0ZSBsb29waW5nCisgICAgICAgIC8vIHNpbmNlIGxvb3BDb3VudCBmcm9tIHNlcnZlciBzaWRlIHdpbGwgYWx3YXlzIHJldHVybiAtMSAod2UgY291bGQgZGVjcmVtZW50IGl0KS4KKyAgICAgICAgc2l6ZV90IGJ1ZmZlclBvc2l0aW9uID0gbVN0YXRpY1Byb3h5LT5nZXRCdWZmZXJQb3NpdGlvbigpOworICAgICAgICBsb29wQ291bnROb3RpZmljYXRpb25zID0gaW50KChmbGFncyAmIChDQkxLX0xPT1BfQ1lDTEUgfCBDQkxLX0xPT1BfRklOQUwpKSAhPSAwKTsKKyAgICAgICAgbG9vcFBlcmlvZCA9IG1Mb29wRW5kIC0gYnVmZmVyUG9zaXRpb247CisgICAgfSBlbHNlIGlmICgvKiBtTG9vcENvdW50ID09IDAgJiYgKi8gbVNoYXJlZEJ1ZmZlciAhPSAwKSB7CisgICAgICAgIHNpemVfdCBidWZmZXJQb3NpdGlvbiA9IG1TdGF0aWNQcm94eS0+Z2V0QnVmZmVyUG9zaXRpb24oKTsKKyAgICAgICAgbG9vcFBlcmlvZCA9IG1GcmFtZUNvdW50IC0gYnVmZmVyUG9zaXRpb247CisgICAgfQorCiAgICAgLy8gVGhlc2UgZmllbGRzIGRvbid0IG5lZWQgdG8gYmUgY2FjaGVkLCBiZWNhdXNlIHRoZXkgYXJlIGFzc2lnbmVkIG9ubHkgYnkgc2V0KCk6Ci0gICAgLy8gICAgIG1UcmFuc2ZlciwgbUNiZiwgbVVzZXJEYXRhLCBtRm9ybWF0LCBtRnJhbWVTaXplLCBtRnJhbWVTaXplQUYsIG1GbGFncworICAgIC8vICAgICBtVHJhbnNmZXIsIG1DYmYsIG1Vc2VyRGF0YSwgbUZvcm1hdCwgbUZyYW1lU2l6ZSwgbUZsYWdzCiAgICAgLy8gbUZsYWdzIGlzIGFsc28gYXNzaWduZWQgYnkgY3JlYXRlVHJhY2tfbCgpLCBidXQgbm90IHRoZSBiaXQgd2UgY2FyZSBhYm91dC4KIAogICAgIG1Mb2NrLnVubG9jaygpOwogCisgICAgLy8gZ2V0IGFuY2hvciB0aW1lIHRvIGFjY291bnQgZm9yIGNhbGxiYWNrcy4KKyAgICBjb25zdCBuc2Vjc190IHRpbWVCZWZvcmVDYWxsYmFja3MgPSBzeXN0ZW1UaW1lKCk7CisKICAgICBpZiAod2FpdFN0cmVhbUVuZCkgeworICAgICAgICAvLyBGSVhNRTogIEluc3RlYWQgb2YgYmxvY2tpbmcgaW4gcHJveHktPndhaXRTdHJlYW1FbmREb25lKCksIENhbGxiYWNrIHRocmVhZAorICAgICAgICAvLyBzaG91bGQgd2FpdCBvbiBwcm94eSBmdXRleCBhbmQgaGFuZGxlIENCTEtfU1RSRUFNX0VORF9ET05FIHdpdGhpbiB0aGlzIGZ1bmN0aW9uCisgICAgICAgIC8vIChhbmQgbWFrZSBzdXJlIHdlIGRvbid0IGNhbGxiYWNrIGZvciBtb3JlIGRhdGEgd2hpbGUgd2UncmUgc3RvcHBpbmcpLgorICAgICAgICAvLyBUaGlzIGhlbHBzIHdpdGggcG9zaXRpb24sIG1hcmtlciBub3RpZmljYXRpb25zLCBhbmQgdHJhY2sgaW52YWxpZGF0aW9uLgogICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgdGltZW91dDsKICAgICAgICAgdGltZW91dC50dl9zZWMgPSBXQUlUX1NUUkVBTV9FTkRfVElNRU9VVF9TRUM7CiAgICAgICAgIHRpbWVvdXQudHZfbnNlYyA9IDA7CkBAIC0xNjYyLDEwICsxODY3LDkgQEAKICAgICBpZiAobmV3VW5kZXJydW4pIHsKICAgICAgICAgbUNiZihFVkVOVF9VTkRFUlJVTiwgbVVzZXJEYXRhLCBOVUxMKTsKICAgICB9Ci0gICAgLy8gRklYTUUgd2Ugd2lsbCBtaXNzIGxvb3BzIGlmIGxvb3AgY3ljbGUgd2FzIHNpZ25hbGVkIHNldmVyYWwgdGltZXMgc2luY2UgbGFzdCBjYWxsCi0gICAgLy8gICAgICAgdG8gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkKLSAgICBpZiAoZmxhZ3MgJiAoQ0JMS19MT09QX0NZQ0xFIHwgQ0JMS19MT09QX0ZJTkFMKSkgeworICAgIHdoaWxlIChsb29wQ291bnROb3RpZmljYXRpb25zID4gMCkgewogICAgICAgICBtQ2JmKEVWRU5UX0xPT1BfRU5ELCBtVXNlckRhdGEsIE5VTEwpOworICAgICAgICAtLWxvb3BDb3VudE5vdGlmaWNhdGlvbnM7CiAgICAgfQogICAgIGlmIChmbGFncyAmIENCTEtfQlVGRkVSX0VORCkgewogICAgICAgICBtQ2JmKEVWRU5UX0JVRkZFUl9FTkQsIG1Vc2VyRGF0YSwgTlVMTCk7CkBAIC0xNzAxLDEwICsxOTA1LDExIEBACiAgICAgICAgIG1pbkZyYW1lcyA9IG1hcmtlclBvc2l0aW9uIC0gcG9zaXRpb247CiAgICAgfQogICAgIGlmIChsb29wUGVyaW9kID4gMCAmJiBsb29wUGVyaW9kIDwgbWluRnJhbWVzKSB7CisgICAgICAgIC8vIGxvb3BQZXJpb2QgaXMgYWxyZWFkeSBhZGp1c3RlZCBmb3IgYWN0dWFsIHBvc2l0aW9uLgogICAgICAgICBtaW5GcmFtZXMgPSBsb29wUGVyaW9kOwogICAgIH0KLSAgICBpZiAodXBkYXRlUGVyaW9kID4gMCAmJiB1cGRhdGVQZXJpb2QgPCBtaW5GcmFtZXMpIHsKLSAgICAgICAgbWluRnJhbWVzID0gdXBkYXRlUGVyaW9kOworICAgIGlmICh1cGRhdGVQZXJpb2QgPiAwKSB7CisgICAgICAgIG1pbkZyYW1lcyA9IG1pbihtaW5GcmFtZXMsIHVpbnQzMl90KG5ld1Bvc2l0aW9uIC0gcG9zaXRpb24pKTsKICAgICB9CiAKICAgICAvLyBJZiA+IDAsIHBvbGwgcGVyaW9kaWNhbGx5IHRvIHJlY292ZXIgZnJvbSBhIHN0dWNrIHNlcnZlci4gIEEgZ29vZCB2YWx1ZSBpcyAyLgpAQCAtMTcxMywxMiArMTkxOCwxNyBAQAogICAgICAgICBtaW5GcmFtZXMgPSBrUG9sbCAqIG5vdGlmaWNhdGlvbkZyYW1lczsKICAgICB9CiAKKyAgICAvLyBUaGlzICJmdWRnZSBmYWN0b3IiIGF2b2lkcyBzb2FraW5nIENQVSwgYW5kIGNvbXBlbnNhdGVzIGZvciBsYXRlIHByb2dyZXNzIGJ5IHNlcnZlcgorICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtXYWl0UGVyaW9kTnMgPSBXQUlUX1BFUklPRF9NUyAqIDEwMDAwMDBMTDsKKyAgICBjb25zdCBuc2Vjc190IHRpbWVBZnRlckNhbGxiYWNrcyA9IHN5c3RlbVRpbWUoKTsKKwogICAgIC8vIENvbnZlcnQgZnJhbWUgdW5pdHMgdG8gdGltZSB1bml0cwogICAgIG5zZWNzX3QgbnMgPSBOU19XSEVORVZFUjsKICAgICBpZiAobWluRnJhbWVzICE9ICh1aW50MzJfdCkgfjApIHsKLSAgICAgICAgLy8gVGhpcyAiZnVkZ2UgZmFjdG9yIiBhdm9pZHMgc29ha2luZyBDUFUsIGFuZCBjb21wZW5zYXRlcyBmb3IgbGF0ZSBwcm9ncmVzcyBieSBzZXJ2ZXIKLSAgICAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga0Z1ZGdlTnMgPSAxMDAwMDAwMExMOyAvLyAxMCBtcwotICAgICAgICBucyA9ICgobWluRnJhbWVzICogMTAwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGUpICsga0Z1ZGdlTnM7CisgICAgICAgIG5zID0gZnJhbWVzVG9OYW5vc2Vjb25kcyhtaW5GcmFtZXMsIHNhbXBsZVJhdGUsIHNwZWVkKSArIGtXYWl0UGVyaW9kTnM7CisgICAgICAgIG5zIC09ICh0aW1lQWZ0ZXJDYWxsYmFja3MgLSB0aW1lQmVmb3JlQ2FsbGJhY2tzKTsgIC8vIGFjY291bnQgZm9yIGNhbGxiYWNrIHRpbWUKKyAgICAgICAgLy8gVE9ETzogU2hvdWxkIHdlIHdhcm4gaWYgdGhlIGNhbGxiYWNrIHRpbWUgaXMgdG9vIGxvbmc/CisgICAgICAgIGlmIChucyA8IDApIG5zID0gMDsKICAgICB9CiAKICAgICAvLyBJZiBub3Qgc3VwcGx5aW5nIGRhdGEgYnkgRVZFTlRfTU9SRV9EQVRBLCB0aGVuIHdlJ3JlIGRvbmUKQEAgLTE3MjYsNiArMTkzNiwxMyBAQAogICAgICAgICByZXR1cm4gbnM7CiAgICAgfQogCisgICAgLy8gRVZFTlRfTU9SRV9EQVRBIGNhbGxiYWNrIGhhbmRsaW5nLgorICAgIC8vIFRpbWluZyBmb3IgbGluZWFyIHBjbSBhdWRpbyBkYXRhIGZvcm1hdHMgY2FuIGJlIGRlcml2ZWQgZGlyZWN0bHkgZnJvbSB0aGUKKyAgICAvLyBidWZmZXIgZmlsbCBsZXZlbC4KKyAgICAvLyBUaW1pbmcgZm9yIGNvbXByZXNzZWQgZGF0YSBpcyBub3QgZGlyZWN0bHkgYXZhaWxhYmxlIGZyb20gdGhlIGJ1ZmZlciBmaWxsIGxldmVsLAorICAgIC8vIHJhdGhlciBpbmRpcmVjdGx5IGZyb20gd2FpdGluZyBmb3IgYmxvY2tpbmcgbW9kZSBjYWxsYmFja3Mgb3Igd2FpdGluZyBmb3Igb2J0YWluKCkKKyAgICAvLyB0byByZXR1cm4gYSBjZXJ0YWluIGZpbGwgbGV2ZWwuCisKICAgICBzdHJ1Y3QgdGltZXNwZWMgdGltZW91dDsKICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnJlcXVlc3RlZCA9ICZDbGllbnRQcm94eTo6a0ZvcmV2ZXI7CiAgICAgaWYgKG5zICE9IE5TX1dIRU5FVkVSKSB7CkBAIC0xNzU2LDI0ICsxOTczLDIxIEBACiAgICAgICAgICAgICByZXR1cm4gTlNfTkVWRVI7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobVJldHJ5T25QYXJ0aWFsQnVmZmVyICYmICFpc09mZmxvYWRlZCgpKSB7CisgICAgICAgIGlmIChtUmV0cnlPblBhcnRpYWxCdWZmZXIgJiYgYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgewogICAgICAgICAgICAgbVJldHJ5T25QYXJ0aWFsQnVmZmVyID0gZmFsc2U7CiAgICAgICAgICAgICBpZiAoYXZhaWwgPCBtUmVtYWluaW5nRnJhbWVzKSB7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCBteW5zID0gKChtUmVtYWluaW5nRnJhbWVzIC0gYXZhaWwpICogMTEwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7Ci0gICAgICAgICAgICAgICAgaWYgKG5zIDwgMCB8fCBteW5zIDwgbnMpIHsKKyAgICAgICAgICAgICAgICBpZiAobnMgPiAwKSB7IC8vIGFjY291bnQgZm9yIG9idGFpbiB0aW1lCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5zZWNzX3QgdGltZU5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgbnMgPSBtYXgoKG5zZWNzX3QpMCwgbnMgLSAodGltZU5vdyAtIHRpbWVBZnRlckNhbGxiYWNrcykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuc2Vjc190IG15bnMgPSBmcmFtZXNUb05hbm9zZWNvbmRzKG1SZW1haW5pbmdGcmFtZXMgLSBhdmFpbCwgc2FtcGxlUmF0ZSwgc3BlZWQpOworICAgICAgICAgICAgICAgIGlmIChucyA8IDAgLyogTlNfV0hFTkVWRVIgKi8gfHwgbXlucyA8IG5zKSB7CiAgICAgICAgICAgICAgICAgICAgIG5zID0gbXluczsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIG5zOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8gRGl2aWRlIGJ1ZmZlciBzaXplIGJ5IDIgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIGV4cGFuc2lvbgotICAgICAgICAvLyBkdWUgdG8gOCB0byAxNiBiaXQgY29udmVyc2lvbjogdGhlIGNhbGxiYWNrIG11c3QgZmlsbCBvbmx5IGhhbGYKLSAgICAgICAgLy8gb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICAgICAgICBpZiAobUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfQklUICYmICEobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSkgewotICAgICAgICAgICAgYXVkaW9CdWZmZXIuc2l6ZSA+Pj0gMTsKLSAgICAgICAgfQotCiAgICAgICAgIHNpemVfdCByZXFTaXplID0gYXVkaW9CdWZmZXIuc2l6ZTsKICAgICAgICAgbUNiZihFVkVOVF9NT1JFX0RBVEEsIG1Vc2VyRGF0YSwgJmF1ZGlvQnVmZmVyKTsKICAgICAgICAgc2l6ZV90IHdyaXR0ZW5TaXplID0gYXVkaW9CdWZmZXIuc2l6ZTsKQEAgLTE3OTAsMTYgKzIwMDQsNDUgQEAKICAgICAgICAgICAgIC8vIEtlZXAgdGhpcyB0aHJlYWQgZ29pbmcgdG8gaGFuZGxlIHRpbWVkIGV2ZW50cyBhbmQKICAgICAgICAgICAgIC8vIHN0aWxsIHRyeSB0byBnZXQgbW9yZSBkYXRhIGluIGludGVydmFscyBvZiBXQUlUX1BFUklPRF9NUwogICAgICAgICAgICAgLy8gYnV0IGRvbid0IGp1c3QgbG9vcCBhbmQgYmxvY2sgdGhlIENQVSwgc28gd2FpdAotICAgICAgICAgICAgcmV0dXJuIFdBSVRfUEVSSU9EX01TICogMTAwMDAwMExMOworCisgICAgICAgICAgICAvLyBtQ2JmKEVWRU5UX01PUkVfREFUQSwgLi4uKSBtaWdodCBlaXRoZXIKKyAgICAgICAgICAgIC8vICgxKSBCbG9jayB1bnRpbCBpdCBjYW4gZmlsbCB0aGUgYnVmZmVyLCByZXR1cm5pbmcgMCBzaXplIG9uIEVPUy4KKyAgICAgICAgICAgIC8vICgyKSBCbG9jayB1bnRpbCBpdCBjYW4gZmlsbCB0aGUgYnVmZmVyLCByZXR1cm5pbmcgMCBkYXRhIChzaWxlbmNlKSBvbiBFT1MuCisgICAgICAgICAgICAvLyAoMykgUmV0dXJuIDAgc2l6ZSB3aGVuIG5vIGRhdGEgaXMgYXZhaWxhYmxlLCBkb2VzIG5vdCB3YWl0IGZvciBtb3JlIGRhdGEuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gKDEpIGFuZCAoMikgb2NjdXJzIHdpdGggQXVkaW9QbGF5ZXIvQXdlc29tZVBsYXllcjsgKDMpIG9jY3VycyB3aXRoIE51UGxheWVyLgorICAgICAgICAgICAgLy8gV2UgdHJ5IHRvIGNvbXB1dGUgdGhlIHdhaXQgdGltZSB0byBhdm9pZCBhIHRpZ2h0IHNsZWVwLXdhaXQgY3ljbGUsCisgICAgICAgICAgICAvLyBlc3BlY2lhbGx5IGZvciBjYXNlICgzKS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUaGUgZGVjaXNpb24gdG8gc3VwcG9ydCAoMSkgYW5kICgyKSBhZmZlY3QgdGhlIHNpemluZyBvZiBtUmVtYWluaW5nRnJhbWVzCisgICAgICAgICAgICAvLyBhbmQgdGhpcyBsb29wOyB3aGVyZWFzIGZvciBjYXNlICgzKSB3ZSBjb3VsZCBzaW1wbHkgY2hlY2sgb25jZSB3aXRoIHRoZSBmdWxsCisgICAgICAgICAgICAvLyBidWZmZXIgc2l6ZSBhbmQgc2tpcCB0aGUgbG9vcCBlbnRpcmVseS4KKworICAgICAgICAgICAgbnNlY3NfdCBteW5zOworICAgICAgICAgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICAvLyB0aW1lIHRvIHdhaXQgYmFzZWQgb24gYnVmZmVyIG9jY3VwYW5jeQorICAgICAgICAgICAgICAgIGNvbnN0IG5zZWNzX3QgZGF0YW5zID0gbVJlbWFpbmluZ0ZyYW1lcyA8PSBhdmFpbCA/IDAgOgorICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzVG9OYW5vc2Vjb25kcyhtUmVtYWluaW5nRnJhbWVzIC0gYXZhaWwsIHNhbXBsZVJhdGUsIHNwZWVkKTsKKyAgICAgICAgICAgICAgICAvLyBhdWRpbyBmbGluZ2VyIHRocmVhZCBidWZmZXIgc2l6ZSAoVE9ETzogYWRqdXN0IGZvciBmYXN0IHRyYWNrcykKKyAgICAgICAgICAgICAgICBjb25zdCBuc2Vjc190IGFmbnMgPSBmcmFtZXNUb05hbm9zZWNvbmRzKG1BZkZyYW1lQ291bnQsIG1BZlNhbXBsZVJhdGUsIHNwZWVkKTsKKyAgICAgICAgICAgICAgICAvLyBhZGQgYSBoYWxmIHRoZSBBdWRpb0ZsaW5nZXIgYnVmZmVyIHRpbWUgdG8gYXZvaWQgc29ha2luZyBDUFUgaWYgZGF0YW5zIGlzIDAuCisgICAgICAgICAgICAgICAgbXlucyA9IGRhdGFucyArIChhZm5zIC8gMik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIGNvdWxkIHBpbmcgcXVpdGUgYSBiaXQgaWYgdGhlIGJ1ZmZlciBpc24ndCBmdWxsLgorICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3aGVuIG1TdGF0ZSBpcyBzdG9wcGluZyB3ZSB3YWl0U3RyZWFtRW5kLCBzbyBpdCBuZXZlciBnZXRzIGhlcmUuCisgICAgICAgICAgICAgICAgbXlucyA9IGtXYWl0UGVyaW9kTnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnMgPiAwKSB7IC8vIGFjY291bnQgZm9yIG9idGFpbiBhbmQgY2FsbGJhY2sgdGltZQorICAgICAgICAgICAgICAgIGNvbnN0IG5zZWNzX3QgdGltZU5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgICAgICAgICBucyA9IG1heCgobnNlY3NfdCkwLCBucyAtICh0aW1lTm93IC0gdGltZUFmdGVyQ2FsbGJhY2tzKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnMgPCAwIC8qIE5TX1dIRU5FVkVSICovIHx8IG15bnMgPCBucykgeworICAgICAgICAgICAgICAgIG5zID0gbXluczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuczsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQgJiYgIShtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpKSB7Ci0gICAgICAgICAgICAvLyA4IHRvIDE2IGJpdCBjb252ZXJzaW9uLCBub3RlIHRoYXQgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcmUgdGhlIHNhbWUgYWRkcmVzcwotICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX3U4KGF1ZGlvQnVmZmVyLmkxNiwgKGNvbnN0IHVpbnQ4X3QgKikgYXVkaW9CdWZmZXIuaTgsIHdyaXR0ZW5TaXplKTsKLSAgICAgICAgICAgIGF1ZGlvQnVmZmVyLnNpemUgPDw9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgcmVsZWFzZWRGcmFtZXMgPSBhdWRpb0J1ZmZlci5zaXplIC8gbUZyYW1lU2l6ZUFGOworICAgICAgICBzaXplX3QgcmVsZWFzZWRGcmFtZXMgPSB3cml0dGVuU2l6ZSAvIG1GcmFtZVNpemU7CiAgICAgICAgIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPSByZWxlYXNlZEZyYW1lczsKICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcyAtPSByZWxlYXNlZEZyYW1lczsKICAgICAgICAgaWYgKG1pc2FsaWdubWVudCA+PSByZWxlYXNlZEZyYW1lcykgewpAQCAtMTgyNyw3ICsyMDcwLDcgQEAKICAgICAgICAgLy8gdGhhdCB0b3RhbCB0byBhIHN1bSA9PSBub3RpZmljYXRpb25GcmFtZXMuCiAgICAgICAgIGlmICgwIDwgbWlzYWxpZ25tZW50ICYmIG1pc2FsaWdubWVudCA8PSBtUmVtYWluaW5nRnJhbWVzKSB7CiAgICAgICAgICAgICBtUmVtYWluaW5nRnJhbWVzID0gbWlzYWxpZ25tZW50OwotICAgICAgICAgICAgcmV0dXJuIChtUmVtYWluaW5nRnJhbWVzICogMTEwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7CisgICAgICAgICAgICByZXR1cm4gKChkb3VibGUpbVJlbWFpbmluZ0ZyYW1lcyAqIDExMDAwMDAwMDApIC8gKChkb3VibGUpc2FtcGxlUmF0ZSAqIHNwZWVkKTsKICAgICAgICAgfQogI2VuZGlmCiAKQEAgLTE4NDQsNTEgKzIwODcsNDkgQEAKICAgICBBTE9HVygiZGVhZCBJQXVkaW9UcmFjaywgJXMsIGNyZWF0aW5nIGEgbmV3IG9uZSBmcm9tICVzKCkiLAogICAgICAgICAgIGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpID8gIk9mZmxvYWRlZCBvciBEaXJlY3QiIDogIlBDTSIsIGZyb20pOwogICAgICsrbVNlcXVlbmNlOwotICAgIHN0YXR1c190IHJlc3VsdDsKIAogICAgIC8vIHJlZnJlc2ggdGhlIGF1ZGlvIGNvbmZpZ3VyYXRpb24gY2FjaGUgaW4gdGhpcyBwcm9jZXNzIHRvIG1ha2Ugc3VyZSB3ZSBnZXQgbmV3CiAgICAgLy8gb3V0cHV0IHBhcmFtZXRlcnMgYW5kIG5ldyBJQXVkaW9GbGluZ2VyIGluIGNyZWF0ZVRyYWNrX2woKQogICAgIEF1ZGlvU3lzdGVtOjpjbGVhckF1ZGlvQ29uZmlnQ2FjaGUoKTsKIAotICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0X2woKSkgewotICAgICAgICAvLyBGSVhNRSByZS1jcmVhdGlvbiBvZiBvZmZsb2FkZWQgdHJhY2tzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQKKyAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgfHwgbURvTm90UmVjb25uZWN0KSB7CisgICAgICAgIC8vIEZJWE1FIHJlLWNyZWF0aW9uIG9mIG9mZmxvYWRlZCBhbmQgZGlyZWN0IHRyYWNrcyBpcyBub3QgeWV0IGltcGxlbWVudGVkOworICAgICAgICAvLyByZWNvbnNpZGVyIGVuYWJsaW5nIGZvciBsaW5lYXIgUENNIGVuY29kaW5ncyB3aGVuIHBvc2l0aW9uIGNhbiBiZSBwcmVzZXJ2ZWQuCiAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICB9CiAKICAgICAvLyBzYXZlIHRoZSBvbGQgc3RhdGljIGJ1ZmZlciBwb3NpdGlvbgotICAgIHNpemVfdCBidWZmZXJQb3NpdGlvbiA9IG1TdGF0aWNQcm94eSAhPSBOVUxMID8gbVN0YXRpY1Byb3h5LT5nZXRCdWZmZXJQb3NpdGlvbigpIDogMDsKKyAgICBzaXplX3QgYnVmZmVyUG9zaXRpb24gPSAwOworICAgIGludCBsb29wQ291bnQgPSAwOworICAgIGlmIChtU3RhdGljUHJveHkgIT0gMCkgeworICAgICAgICBtU3RhdGljUHJveHktPmdldEJ1ZmZlclBvc2l0aW9uQW5kTG9vcENvdW50KCZidWZmZXJQb3NpdGlvbiwgJmxvb3BDb3VudCk7CisgICAgfQogCiAgICAgLy8gSWYgYSBuZXcgSUF1ZGlvVHJhY2sgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQsIGNyZWF0ZVRyYWNrX2woKSB3aWxsIG1vZGlmeSB0aGUKICAgICAvLyBmb2xsb3dpbmcgbWVtYmVyIHZhcmlhYmxlczogbUF1ZGlvVHJhY2ssIG1DYmxrTWVtb3J5IGFuZCBtQ2Jsay4KICAgICAvLyBJdCB3aWxsIGFsc28gZGVsZXRlIHRoZSBzdHJvbmcgcmVmZXJlbmNlcyBvbiBwcmV2aW91cyBJQXVkaW9UcmFjayBhbmQgSU1lbW9yeS4KICAgICAvLyBJZiBhIG5ldyBJQXVkaW9UcmFjayBjYW5ub3QgYmUgY3JlYXRlZCwgdGhlIHByZXZpb3VzIChkZWFkKSBpbnN0YW5jZSB3aWxsIGJlIGxlZnQgaW50YWN0LgotICAgIHJlc3VsdCA9IGNyZWF0ZVRyYWNrX2woKTsKLQotICAgIC8vIHRha2UgdGhlIGZyYW1lcyB0aGF0IHdpbGwgYmUgbG9zdCBieSB0cmFjayByZWNyZWF0aW9uIGludG8gYWNjb3VudCBpbiBzYXZlZCBwb3NpdGlvbgotICAgICh2b2lkKSB1cGRhdGVBbmRHZXRQb3NpdGlvbl9sKCk7Ci0gICAgbVBvc2l0aW9uID0gbVJlbGVhc2VkOworICAgIHN0YXR1c190IHJlc3VsdCA9IGNyZWF0ZVRyYWNrX2woKTsKIAogICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgLy8gY29udGludWUgcGxheWJhY2sgZnJvbSBsYXN0IGtub3duIHBvc2l0aW9uLCBidXQKLSAgICAgICAgLy8gZG9uJ3QgYXR0ZW1wdCB0byByZXN0b3JlIGxvb3AgYWZ0ZXIgaW52YWxpZGF0aW9uOyBpdCdzIGRpZmZpY3VsdCBhbmQgbm90IHdvcnRod2hpbGUKLSAgICAgICAgaWYgKG1TdGF0aWNQcm94eSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtTG9vcFBlcmlvZCA9IDA7Ci0gICAgICAgICAgICBtU3RhdGljUHJveHktPnNldExvb3AoYnVmZmVyUG9zaXRpb24sIG1GcmFtZUNvdW50LCAwKTsKKyAgICAgICAgLy8gdGFrZSB0aGUgZnJhbWVzIHRoYXQgd2lsbCBiZSBsb3N0IGJ5IHRyYWNrIHJlY3JlYXRpb24gaW50byBhY2NvdW50IGluIHNhdmVkIHBvc2l0aW9uCisgICAgICAgIC8vIEZvciBzdHJlYW1pbmcgdHJhY2tzLCB0aGlzIGlzIHRoZSBhbW91bnQgd2Ugb2J0YWluZWQgZnJvbSB0aGUgdXNlci9jbGllbnQKKyAgICAgICAgLy8gKG5vdCB0aGUgbnVtYmVyIGFjdHVhbGx5IGNvbnN1bWVkIGF0IHRoZSBzZXJ2ZXIgLSB0aG9zZSBhcmUgYWxyZWFkeSBsb3N0KS4KKyAgICAgICAgaWYgKG1TdGF0aWNQcm94eSA9PSAwKSB7CisgICAgICAgICAgICBtUG9zaXRpb24gPSBtUmVsZWFzZWQ7CiAgICAgICAgIH0KLSAgICAgICAgLy8gRklYTUUgSG93IGRvIHdlIHNpbXVsYXRlIHRoZSBmYWN0IHRoYXQgYWxsIGZyYW1lcyBwcmVzZW50IGluIHRoZSBidWZmZXIgYXQgdGhlIHRpbWUgb2YKLSAgICAgICAgLy8gICAgICAgdHJhY2sgZGVzdHJ1Y3Rpb24gaGF2ZSBiZWVuIHBsYXllZD8gVGhpcyBpcyBjcml0aWNhbCBmb3IgU291bmRQb29sIGltcGxlbWVudGF0aW9uCi0gICAgICAgIC8vICAgICAgIFRoaXMgbXVzdCBiZSBicm9rZW4sIGFuZCBuZWVkcyB0byBiZSB0ZXN0ZWQvZGVidWdnZWQuCi0jaWYgMAotICAgICAgICAvLyByZXN0b3JlIHdyaXRlIGluZGV4IGFuZCBzZXQgb3RoZXIgaW5kZXhlcyB0byByZWZsZWN0IGVtcHR5IGJ1ZmZlciBzdGF0dXMKLSAgICAgICAgaWYgKCFzdHJjbXAoZnJvbSwgInN0YXJ0IikpIHsKLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGEgY2xpZW50IHJlbHlpbmcgb24gY2FsbGJhY2sgZXZlbnRzIGluZGljYXRpbmcgdW5kZXJydW4gb3IKLSAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgYW1vdW50IG9mIGF1ZGlvIGZyYW1lcyBwbGF5ZWQgKGUuZyBTb3VuZFBvb2wpIHJlY2VpdmVzIHRoZW0uCi0gICAgICAgICAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVzdGFydCBwbGF5YmFjayBldmVuIGlmIGJ1ZmZlciBpcyBub3QgY29tcGxldGVseSBmaWxsZWQuCi0gICAgICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19GT1JDRVJFQURZLCAmbUNibGstPm1GbGFncyk7CisgICAgICAgIC8vIENvbnRpbnVlIHBsYXliYWNrIGZyb20gbGFzdCBrbm93biBwb3NpdGlvbiBhbmQgcmVzdG9yZSBsb29wLgorICAgICAgICBpZiAobVN0YXRpY1Byb3h5ICE9IDApIHsKKyAgICAgICAgICAgIGlmIChsb29wQ291bnQgIT0gMCkgeworICAgICAgICAgICAgICAgIG1TdGF0aWNQcm94eS0+c2V0QnVmZmVyUG9zaXRpb25BbmRMb29wKGJ1ZmZlclBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgbUxvb3BTdGFydCwgbUxvb3BFbmQsIGxvb3BDb3VudCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TdGF0aWNQcm94eS0+c2V0QnVmZmVyUG9zaXRpb24oYnVmZmVyUG9zaXRpb24pOworICAgICAgICAgICAgICAgIGlmIChidWZmZXJQb3NpdGlvbiA9PSBtRnJhbWVDb3VudCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgicmVzdG9yaW5nIHRyYWNrIGF0IGVuZCBvZiBzdGF0aWMgYnVmZmVyIik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0jZW5kaWYKICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9BQ1RJVkUpIHsKICAgICAgICAgICAgIHJlc3VsdCA9IG1BdWRpb1RyYWNrLT5zdGFydCgpOwogICAgICAgICB9CkBAIC0xOTIzLDYgKzIxNjQsMTkgQEAKICAgICByZXR1cm4gbVBvc2l0aW9uICs9ICh1aW50MzJfdCkgZGVsdGE7CiB9CiAKK2Jvb2wgQXVkaW9UcmFjazo6aXNTYW1wbGVSYXRlU3BlZWRBbGxvd2VkX2wodWludDMyX3Qgc2FtcGxlUmF0ZSwgZmxvYXQgc3BlZWQpIGNvbnN0Cit7CisgICAgLy8gYXBwbGljYWJsZSBmb3IgbWl4aW5nIHRyYWNrcyBvbmx5IChub3Qgb2ZmbG9hZGVkIG9yIGRpcmVjdCkKKyAgICBpZiAobVN0YXRpY1Byb3h5ICE9IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7IC8vIHN0YXRpYyB0cmFja3MgZG8gbm90IGhhdmUgaXNzdWVzIHdpdGggYnVmZmVyIHNpemluZy4KKyAgICB9CisgICAgY29uc3Qgc2l6ZV90IG1pbkZyYW1lQ291bnQgPQorICAgICAgICAgICAgY2FsY3VsYXRlTWluRnJhbWVDb3VudChtQWZMYXRlbmN5LCBtQWZGcmFtZUNvdW50LCBtQWZTYW1wbGVSYXRlLCBzYW1wbGVSYXRlLCBzcGVlZCk7CisgICAgQUxPR1YoImlzU2FtcGxlUmF0ZVNwZWVkQWxsb3dlZF9sIG1GcmFtZUNvdW50ICV6dSAgbWluRnJhbWVDb3VudCAlenUiLAorICAgICAgICAgICAgbUZyYW1lQ291bnQsIG1pbkZyYW1lQ291bnQpOworICAgIHJldHVybiBtRnJhbWVDb3VudCA+PSBtaW5GcmFtZUNvdW50OworfQorCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwpAQCAtMTkzMiw2ICsyMTg2LDExIEBACiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisKKyAgICBib29sIHByZXZpb3VzVGltZXN0YW1wVmFsaWQgPSBtUHJldmlvdXNUaW1lc3RhbXBWYWxpZDsKKyAgICAvLyBTZXQgZmFsc2UgaGVyZSB0byBjb3ZlciBhbGwgdGhlIGVycm9yIHJldHVybiBjYXNlcy4KKyAgICBtUHJldmlvdXNUaW1lc3RhbXBWYWxpZCA9IGZhbHNlOworCiAgICAgLy8gRklYTUUgbm90IGltcGxlbWVudGVkIGZvciBmYXN0IHRyYWNrczsgc2hvdWxkIHVzZSBwcm94eSBhbmQgU1NRCiAgICAgaWYgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMTk1Niw3ICsyMjE1LDEyIEBACiAgICAgfQogCiAgICAgaWYgKG1DYmxrLT5tRmxhZ3MgJiBDQkxLX0lOVkFMSUQpIHsKLSAgICAgICAgcmVzdG9yZVRyYWNrX2woImdldFRpbWVzdGFtcCIpOworICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSByZXN0b3JlVHJhY2tfbCgiZ2V0VGltZXN0YW1wIik7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIC8vIHBlciBnZXRUaW1lc3RhbXAoKSBBUEkgZG9jIGluIGhlYWRlciwgd2UgcmV0dXJuIERFQURfT0JKRUNUIGhlcmUsCisgICAgICAgICAgICAvLyByZWNvbW1lbmRpbmcgdGhhdCB0aGUgdHJhY2sgYmUgcmVjcmVhdGVkLgorICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gVGhlIHByZXNlbnRlZCBmcmFtZSBjb3VudCBtdXN0IGFsd2F5cyBsYWcgYmVoaW5kIHRoZSBjb25zdW1lZCBmcmFtZSBjb3VudC4KQEAgLTE5NzUsNyArMjIzOSwxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciBhIHBlbmRpbmcgZmx1c2ggb3Igc3RvcCBoYXMgY29tcGxldGVkLCBhcyB0aG9zZSBjb21tYW5kcyBtYXkKLSAgICAgICAgLy8gYmUgYXN5bmNocm9ub3VzIG9yIHJldHVybiBuZWFyIGZpbmlzaC4KKyAgICAgICAgLy8gYmUgYXN5bmNocm9ub3VzIG9yIHJldHVybiBuZWFyIGZpbmlzaCBvciBleGhpYml0IGdsaXRjaHkgYmVoYXZpb3IuCisgICAgICAgIC8vCisgICAgICAgIC8vIE9yaWdpbmFsbHkgdGhpcyBzaG93ZWQgdXAgYXMgdGhlIGZpcnN0IHRpbWVzdGFtcCBiZWluZyBhIGNvbnRpbnVhdGlvbiBvZgorICAgICAgICAvLyB0aGUgcHJldmlvdXMgc29uZyB1bmRlciBnYXBsZXNzIHBsYXliYWNrLgorICAgICAgICAvLyBIb3dldmVyLCB3ZSBzb21ldGltZXMgc2VlIHplcm8gdGltZXN0YW1wcywgdGhlbiBhIGdsaXRjaCBvZgorICAgICAgICAvLyB0aGUgcHJldmlvdXMgc29uZydzIHBvc2l0aW9uLCBhbmQgdGhlbiBjb3JyZWN0IHRpbWVzdGFtcHMgYWZ0ZXJ3YXJkcy4KICAgICAgICAgaWYgKG1TdGFydFVzICE9IDAgJiYgbVNhbXBsZVJhdGUgIT0gMCkgewogICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBrVGltZUppdHRlclVzID0gMTAwMDAwOyAvLyAxMDAgbXMKICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgazFTZWNVcyA9IDEwMDAwMDA7CkBAIC0xOTg4LDIwICsyMjU3LDM0IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsgIC8vIHN0YWxlIHRpbWVzdGFtcCB0aW1lLCBvY2N1cnMgYmVmb3JlIHN0YXJ0LgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGRlbHRhVGltZVVzID0gdGltZXN0YW1wVGltZVVzIC0gbVN0YXJ0VXM7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBkZWx0YVBvc2l0aW9uQnlVcyA9IHRpbWVzdGFtcC5tUG9zaXRpb24gKiAxMDAwMDAwTEwgLyBtU2FtcGxlUmF0ZTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGRlbHRhUG9zaXRpb25CeVVzID0gKGRvdWJsZSl0aW1lc3RhbXAubVBvc2l0aW9uICogMTAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgLyAoKGRvdWJsZSltU2FtcGxlUmF0ZSAqIG1QbGF5YmFja1JhdGUubVNwZWVkKTsKIAogICAgICAgICAgICAgICAgIGlmIChkZWx0YVBvc2l0aW9uQnlVcyA+IGRlbHRhVGltZVVzICsga1RpbWVKaXR0ZXJVcykgewogICAgICAgICAgICAgICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgY291bnRlciBjYW4ndCBjb3VudCBmYXN0ZXIgdGhhbiB0aGUgc2FtcGxlIHJhdGUKLSAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIHN0YXJ0IHRpbWUuICBJZiBncmVhdGVyLCB0aGVuIHRoYXQgbWVhbnMgd2UgaGF2ZSBmYWlsZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIHN0YXJ0IHRpbWUuICBJZiBncmVhdGVyLCB0aGVuIHRoYXQgbWVhbnMgd2UgbWF5IGhhdmUgZmFpbGVkCiAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGNvbXBsZXRlbHkgZmx1c2ggb3Igc3RvcCB0aGUgcHJldmlvdXMgcGxheWluZyB0cmFjay4KLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImluY29tcGxldGUgZmx1c2ggb3Igc3RvcDoiCisgICAgICAgICAgICAgICAgICAgIEFMT0dXX0lGKCFtVGltZXN0YW1wU3RhcnR1cEdsaXRjaFJlcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRUaW1lc3RhbXAgc3RhcnR1cCBnbGl0Y2ggZGV0ZWN0ZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBkZWx0YVRpbWVVcyglbGxkKSBkZWx0YVBvc2l0aW9uVXMoJWxsZCkgdHNtUG9zaXRpb24oJXUpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWRlbHRhVGltZVVzLCAobG9uZyBsb25nKWRlbHRhUG9zaXRpb25CeVVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wU3RhcnR1cEdsaXRjaFJlcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzVGltZXN0YW1wVmFsaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtUHJldmlvdXNUaW1lc3RhbXAubVBvc2l0aW9uID09IDAgLyogc2hvdWxkIGJlIHRydWUgaWYgdmFsaWQgKi8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCA9IG1QcmV2aW91c1RpbWVzdGFtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c1RpbWVzdGFtcFZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChkZWx0YVBvc2l0aW9uQnlVcyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGFydFVzID0gMDsgLy8gZG9uJ3QgY2hlY2sgYWdhaW4sIHdlIGdvdCB2YWxpZCBub256ZXJvIHBvc2l0aW9uLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVN0YXJ0VXMgPSAwOyAvLyBkb24ndCBjaGVjayBhZ2Fpbiwgc3RhcnQgdGltZSBleHBpcmVkLgogICAgICAgICAgICAgfQotICAgICAgICAgICAgbVN0YXJ0VXMgPSAwOyAvLyBubyBuZWVkIHRvIGNoZWNrIGFnYWluLCBzdGFydCB0aW1lc3RhbXAgaGFzIGVpdGhlciBleHBpcmVkIG9yIHVubmVlZGVkLgorICAgICAgICAgICAgbVRpbWVzdGFtcFN0YXJ0dXBHbGl0Y2hSZXBvcnRlZCA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gVXBkYXRlIHRoZSBtYXBwaW5nIGJldHdlZW4gbG9jYWwgY29uc3VtZWQgKG1Qb3NpdGlvbikgYW5kIHNlcnZlciBjb25zdW1lZCAobVNlcnZlcikKQEAgLTIwMjksNiArMjMxMiw0NiBAQAogICAgICAgICAvLyBJQXVkaW9UcmFjay4gIEFuZCB0aW1lc3RhbXAubVBvc2l0aW9uIGlzIGluaXRpYWxseSBpbiBzZXJ2ZXIncwogICAgICAgICAvLyBwb2ludCBvZiB2aWV3LCBzbyB3ZSBuZWVkIHRvIGFwcGx5IHRoZSBzYW1lIGZ1ZGdlIGZhY3RvciB0byBpdC4KICAgICB9CisKKyAgICAvLyBQcmV2ZW50IHJldHJvZ3JhZGUgbW90aW9uIGluIHRpbWVzdGFtcC4KKyAgICAvLyBUaGlzIGlzIHNvbWV0aW1lcyBjYXVzZWQgYnkgZXJyYXRpYyByZXBvcnRzIG9mIHRoZSBhdmFpbGFibGUgc3BhY2UgaW4gdGhlIEFMU0EgZHJpdmVycy4KKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIGlmIChwcmV2aW91c1RpbWVzdGFtcFZhbGlkKSB7CisjZGVmaW5lIFRJTUVfVE9fTkFOT1ModGltZSkgKCh1aW50NjRfdCl0aW1lLnR2X3NlYyAqIDEwMDAwMDAwMDAgKyB0aW1lLnR2X25zZWMpCisgICAgICAgICAgICBjb25zdCB1aW50NjRfdCBwcmV2aW91c1RpbWVOYW5vcyA9IFRJTUVfVE9fTkFOT1MobVByZXZpb3VzVGltZXN0YW1wLm1UaW1lKTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90IGN1cnJlbnRUaW1lTmFub3MgPSBUSU1FX1RPX05BTk9TKHRpbWVzdGFtcC5tVGltZSk7CisjdW5kZWYgVElNRV9UT19OQU5PUworICAgICAgICAgICAgaWYgKGN1cnJlbnRUaW1lTmFub3MgPCBwcmV2aW91c1RpbWVOYW5vcykgeworICAgICAgICAgICAgICAgIEFMT0dXKCJyZXRyb2dyYWRlIHRpbWVzdGFtcCB0aW1lIik7CisgICAgICAgICAgICAgICAgLy8gRklYTUUgQ29uc2lkZXIgYmxvY2tpbmcgdGhpcyBmcm9tIHByb3BhZ2F0aW5nIHVwd2FyZHMuCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIExvb2tpbmcgYXQgc2lnbmVkIGRlbHRhIHdpbGwgd29yayBldmVuIHdoZW4gdGhlIHRpbWVzdGFtcHMKKyAgICAgICAgICAgIC8vIGFyZSB3cmFwcGluZyBhcm91bmQuCisgICAgICAgICAgICBpbnQzMl90IGRlbHRhUG9zaXRpb24gPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0aW1lc3RhbXAubVBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgIC0gbVByZXZpb3VzVGltZXN0YW1wLm1Qb3NpdGlvbik7CisgICAgICAgICAgICAvLyBwb3NpdGlvbiBjYW4gYm9iYmxlIHNsaWdodGx5IGFzIGFuIGFydGlmYWN0OyB0aGlzIGhpZGVzIHRoZSBib2JibGUKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IE1JTklNVU1fUE9TSVRJT05fREVMVEEgPSA4OworICAgICAgICAgICAgaWYgKGRlbHRhUG9zaXRpb24gPCAwKSB7CisgICAgICAgICAgICAgICAgLy8gT25seSByZXBvcnQgb25jZSBwZXIgcG9zaXRpb24gaW5zdGVhZCBvZiBzcGFtbWluZyB0aGUgbG9nLgorICAgICAgICAgICAgICAgIGlmICghbVJldHJvZ3JhZGVNb3Rpb25SZXBvcnRlZCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygicmV0cm9ncmFkZSB0aW1lc3RhbXAgcG9zaXRpb24gY29ycmVjdGVkLCAlZCA9ICV1IC0gJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhUG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNUaW1lc3RhbXAubVBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgbVJldHJvZ3JhZGVNb3Rpb25SZXBvcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtUmV0cm9ncmFkZU1vdGlvblJlcG9ydGVkID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGVsdGFQb3NpdGlvbiA8IE1JTklNVU1fUE9TSVRJT05fREVMVEEpIHsKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXAgPSBtUHJldmlvdXNUaW1lc3RhbXA7ICAvLyBVc2UgbGFzdCB2YWxpZCB0aW1lc3RhbXAuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVByZXZpb3VzVGltZXN0YW1wID0gdGltZXN0YW1wOworICAgICAgICBtUHJldmlvdXNUaW1lc3RhbXBWYWxpZCA9IHRydWU7CisgICAgfQorCiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMjA3NSw3ICsyMzk4LDggQEAKICAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgZm9ybWF0KCVkKSwgY2hhbm5lbCBjb3VudCglZCksIGZyYW1lIGNvdW50KCV6dSlcbiIsIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbENvdW50LCBtRnJhbWVDb3VudCk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiICBzYW1wbGUgcmF0ZSgldSksIHN0YXR1cyglZClcbiIsIG1TYW1wbGVSYXRlLCBtU3RhdHVzKTsKKyAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgc2FtcGxlIHJhdGUoJXUpLCBzcGVlZCglZiksIHN0YXR1cyglZClcbiIsCisgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbVBsYXliYWNrUmF0ZS5tU3BlZWQsIG1TdGF0dXMpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgc3RhdGUoJWQpLCBsYXRlbmN5ICglZClcbiIsIG1TdGF0ZSwgbUxhdGVuY3kpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKQEAgLTIwODksNiArMjQxMyw0OCBAQAogICAgIHJldHVybiBtUHJveHktPmdldFVuZGVycnVuRnJhbWVzKCk7CiB9CiAKK3N0YXR1c190IEF1ZGlvVHJhY2s6OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaykKK3sKKyAgICBpZiAoY2FsbGJhY2sgPT0gMCkgeworICAgICAgICBBTE9HVygiJXMgYWRkaW5nIE5VTEwgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgPT0gY2FsbGJhY2spIHsKKyAgICAgICAgQUxPR1coIiVzIGFkZGluZyBzYW1lIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgaWYgKG1PdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVygiJXMgY2FsbGJhY2sgYWxyZWFkeSBwcmVzZW50ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2ssIG1PdXRwdXQpOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKGNhbGxiYWNrLCBtT3V0cHV0KTsKKyAgICB9CisgICAgbURldmljZUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9UcmFjazo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjaygKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaykKK3sKKyAgICBpZiAoY2FsbGJhY2sgPT0gMCkgeworICAgICAgICBBTE9HVygiJXMgcmVtb3ZpbmcgTlVMTCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSBjYWxsYmFjaykgeworICAgICAgICBBTE9HVygiJXMgcmVtb3ZpbmcgZGlmZmVyZW50IGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKG1PdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLCBtT3V0cHV0KTsKKyAgICB9CisgICAgbURldmljZUNhbGxiYWNrID0gMDsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogdm9pZCBBdWRpb1RyYWNrOjpEZWF0aE5vdGlmaWVyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpCkBAIC0yMTQ4LDggKzI1MTQsOCBAQAogICAgIGNhc2UgTlNfTkVWRVI6CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBjYXNlIE5TX1dIRU5FVkVSOgotICAgICAgICAvLyBGSVhNRSBpbmNyZWFzZSBwb2xsIGludGVydmFsLCBvciBtYWtlIGV2ZW50LWRyaXZlbgotICAgICAgICBucyA9IDEwMDAwMDAwMDBMTDsKKyAgICAgICAgLy8gRXZlbnQgZHJpdmVuOiBjYWxsIHdha2UoKSB3aGVuIGNhbGxiYWNrIG5vdGlmaWNhdGlvbnMgY29uZGl0aW9ucyBjaGFuZ2UuCisgICAgICAgIG5zID0gSU5UNjRfTUFYOwogICAgICAgICAvLyBmYWxsIHRocm91Z2gKICAgICBkZWZhdWx0OgogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5zIDwgMCwgInByb2Nlc3NBdWRpb0J1ZmZlcigpIHJldHVybmVkICUiIFBSSWQ2NCwgbnMpOwpAQCAtMjE4Miw2ICsyNTQ4LDIxIEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvVHJhY2s6OkF1ZGlvVHJhY2tUaHJlYWQ6Ondha2UoKQoreworICAgIEF1dG9NdXRleCBfbChtTXlMb2NrKTsKKyAgICBpZiAoIW1QYXVzZWQpIHsKKyAgICAgICAgLy8gd2FrZSgpIG1pZ2h0IGJlIGNhbGxlZCB3aGlsZSBzZXJ2aWNpbmcgYSBjYWxsYmFjayAtIGlnbm9yZSB0aGUgbmV4dAorICAgICAgICAvLyBwYXVzZSB0aW1lIGFuZCBjYWxsIHByb2Nlc3NBdWRpb0J1ZmZlci4KKyAgICAgICAgbUlnbm9yZU5leHRQYXVzZWRJbnQgPSB0cnVlOworICAgICAgICBpZiAobVBhdXNlZEludCAmJiBtUGF1c2VkTnMgPiAwKSB7CisgICAgICAgICAgICAvLyBhdWRpbyB0cmFjayBpcyBhY3RpdmUgYW5kIGludGVybmFsbHkgcGF1c2VkIHdpdGggdGltZW91dC4KKyAgICAgICAgICAgIG1QYXVzZWRJbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1NeUNvbmQuc2lnbmFsKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHZvaWQgQXVkaW9UcmFjazo6QXVkaW9UcmFja1RocmVhZDo6cGF1c2VJbnRlcm5hbChuc2Vjc190IG5zKQogewogICAgIEF1dG9NdXRleCBfbChtTXlMb2NrKTsKQEAgLTIxODksNCArMjU3MCw0IEBACiAgICAgbVBhdXNlZE5zID0gbnM7CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuY3BwCmluZGV4IGZmMjQ0NzUuLjZhNTFhNzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuY3BwCkBAIC0yOCw3ICsyOCwyMSBAQAogLy8gdXNlZCB0byBjbGFtcCBhIHZhbHVlIHRvIHNpemVfdC4gIFRPRE86IG1vdmUgdG8gYW5vdGhlciBmaWxlLgogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiBzaXplX3QgY2xhbXBUb1NpemUoVCB4KSB7Ci0gICAgcmV0dXJuIHggPiBTSVpFX01BWCA/IFNJWkVfTUFYIDogeCA8IDAgPyAwIDogKHNpemVfdCkgeDsKKyAgICByZXR1cm4gc2l6ZW9mKFQpID4gc2l6ZW9mKHNpemVfdCkgJiYgeCA+IChUKSBTSVpFX01BWCA/IFNJWkVfTUFYIDogeCA8IDAgPyAwIDogKHNpemVfdCkgeDsKK30KKworLy8gaW5jcmVtZW50U2VxdWVuY2UgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG5leHQgc2VxdWVuY2UgdmFsdWUKKy8vIGZvciB0aGUgbG9vcCBhbmQgcG9zaXRpb24gc2VxdWVuY2UgY291bnRlcnMuICBJdCBzaG91bGQgcmV0dXJuCisvLyBhIHZhbHVlIGJldHdlZW4gIm90aGVyIiArIDEgYW5kICJvdGhlciIgKyBJTlQzMl9NQVgsIHRoZSBjaG9pY2Ugb2YKKy8vIHdoaWNoIG5lZWRzIHRvIGJlIHRoZSAibGVhc3QgcmVjZW50bHkgdXNlZCIgc2VxdWVuY2UgdmFsdWUgZm9yICJzZWxmIi4KKy8vIEluIGdlbmVyYWwsIHRoaXMgbWVhbnMgKG5ld19zZWxmKSByZXR1cm5lZCBpcyBtYXgoc2VsZiwgb3RoZXIpICsgMS4KKworc3RhdGljIHVpbnQzMl90IGluY3JlbWVudFNlcXVlbmNlKHVpbnQzMl90IHNlbGYsIHVpbnQzMl90IG90aGVyKSB7CisgICAgaW50MzJfdCBkaWZmID0gc2VsZiAtIG90aGVyOworICAgIGlmIChkaWZmID49IDAgJiYgZGlmZiA8IElOVDMyX01BWCkgeworICAgICAgICByZXR1cm4gc2VsZiArIDE7IC8vIHdlJ3JlIGFscmVhZHkgYWhlYWQgb2Ygb3RoZXIuCisgICAgfQorICAgIHJldHVybiBvdGhlciArIDE7IC8vIHdlJ3JlIGJlaGluZCwgc28gbW92ZSBqdXN0IGFoZWFkIG9mIG90aGVyLgogfQogCiBhdWRpb190cmFja19jYmxrX3Q6OmF1ZGlvX3RyYWNrX2NibGtfdCgpCkBAIC0zNjAsNiArMzc0LDkgQEAKICAgICBzaXplX3QgaW5jcmVtZW50ID0gbUZyYW1lQ291bnRQMiA8PCAxOwogICAgIHNpemVfdCBtYXNrID0gaW5jcmVtZW50IC0gMTsKICAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSBtQ2JsazsKKyAgICAvLyBtRmx1c2ggaXMgMzIgYml0cyBjb25jYXRlbmF0ZWQgYXMgWyBmbHVzaF9jb3VudGVyIF0gWyBuZXdmcm9udF9vZmZzZXQgXQorICAgIC8vIFNob3VsZCBuZXdGbHVzaCA9IGNibGstPnUubVN0cmVhbWluZy5tUmVhcj8gIE9ubHkgcHJvYmxlbSBpcworICAgIC8vIGlmIHlvdSB3YW50IHRvIGZsdXNoIHR3aWNlIHRvIHRoZSBzYW1lIHJlYXIgbG9jYXRpb24gYWZ0ZXIgYSAzMiBiaXQgd3JhcC4KICAgICBpbnQzMl90IG5ld0ZsdXNoID0gKGNibGstPnUubVN0cmVhbWluZy5tUmVhciAmIG1hc2spIHwKICAgICAgICAgICAgICAgICAgICAgICAgICgoY2Jsay0+dS5tU3RyZWFtaW5nLm1GbHVzaCAmIH5tYXNrKSArIGluY3JlbWVudCk7CiAgICAgYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9zdG9yZShuZXdGbHVzaCwgJmNibGstPnUubVN0cmVhbWluZy5tRmx1c2gpOwpAQCAtNDA5LDcgKzQyNiw2IEBACiAgICAgICAgICAgICBnb3RvIGVuZDsKICAgICAgICAgfQogICAgICAgICAvLyBjaGVjayBmb3Igb2J0YWluQnVmZmVyIGludGVycnVwdGVkIGJ5IGNsaWVudAotICAgICAgICAvLyBjaGVjayBmb3Igb2J0YWluQnVmZmVyIGludGVycnVwdGVkIGJ5IGNsaWVudAogICAgICAgICBpZiAoZmxhZ3MgJiBDQkxLX0lOVEVSUlVQVCkgewogICAgICAgICAgICAgQUxPR1YoIndhaXRTdHJlYW1FbmREb25lKCkgaW50ZXJydXB0ZWQgYnkgY2xpZW50Iik7CiAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVFI7CkBAIC00ODUsOCArNTAxLDExIEBACiBTdGF0aWNBdWRpb1RyYWNrQ2xpZW50UHJveHk6OlN0YXRpY0F1ZGlvVHJhY2tDbGllbnRQcm94eShhdWRpb190cmFja19jYmxrX3QqIGNibGssIHZvaWQgKmJ1ZmZlcnMsCiAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LCBzaXplX3QgZnJhbWVTaXplKQogICAgIDogQXVkaW9UcmFja0NsaWVudFByb3h5KGNibGssIGJ1ZmZlcnMsIGZyYW1lQ291bnQsIGZyYW1lU2l6ZSksCi0gICAgICBtTXV0YXRvcigmY2Jsay0+dS5tU3RhdGljLm1TaW5nbGVTdGF0ZVF1ZXVlKSwgbUJ1ZmZlclBvc2l0aW9uKDApCisgICAgICBtTXV0YXRvcigmY2Jsay0+dS5tU3RhdGljLm1TaW5nbGVTdGF0ZVF1ZXVlKSwKKyAgICAgIG1Qb3NMb29wT2JzZXJ2ZXIoJmNibGstPnUubVN0YXRpYy5tUG9zTG9vcFF1ZXVlKQogeworICAgIG1lbXNldCgmbVN0YXRlLCAwLCBzaXplb2YobVN0YXRlKSk7CisgICAgbWVtc2V0KCZtUG9zTG9vcCwgMCwgc2l6ZW9mKG1Qb3NMb29wKSk7CiB9CiAKIHZvaWQgU3RhdGljQXVkaW9UcmFja0NsaWVudFByb3h5OjpmbHVzaCgpCkBAIC01MDEsMzAgKzUyMCw3MiBAQAogICAgICAgICAvLyBGSVhNRSBTaG91bGQgcmV0dXJuIGFuIGVycm9yIHN0YXR1cwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIFN0YXRpY0F1ZGlvVHJhY2tTdGF0ZSBuZXdTdGF0ZTsKLSAgICBuZXdTdGF0ZS5tTG9vcFN0YXJ0ID0gKHVpbnQzMl90KSBsb29wU3RhcnQ7Ci0gICAgbmV3U3RhdGUubUxvb3BFbmQgPSAodWludDMyX3QpIGxvb3BFbmQ7Ci0gICAgbmV3U3RhdGUubUxvb3BDb3VudCA9IGxvb3BDb3VudDsKLSAgICBzaXplX3QgYnVmZmVyUG9zaXRpb247Ci0gICAgaWYgKGxvb3BDb3VudCA9PSAwIHx8IChidWZmZXJQb3NpdGlvbiA9IGdldEJ1ZmZlclBvc2l0aW9uKCkpID49IGxvb3BFbmQpIHsKLSAgICAgICAgYnVmZmVyUG9zaXRpb24gPSBsb29wU3RhcnQ7CisgICAgbVN0YXRlLm1Mb29wU3RhcnQgPSAodWludDMyX3QpIGxvb3BTdGFydDsKKyAgICBtU3RhdGUubUxvb3BFbmQgPSAodWludDMyX3QpIGxvb3BFbmQ7CisgICAgbVN0YXRlLm1Mb29wQ291bnQgPSBsb29wQ291bnQ7CisgICAgbVN0YXRlLm1Mb29wU2VxdWVuY2UgPSBpbmNyZW1lbnRTZXF1ZW5jZShtU3RhdGUubUxvb3BTZXF1ZW5jZSwgbVN0YXRlLm1Qb3NpdGlvblNlcXVlbmNlKTsKKyAgICAvLyBzZXQgcGF0Y2gtdXAgdmFyaWFibGVzIHVudGlsIHRoZSBtU3RhdGUgaXMgYWNrbm93bGVkZ2VkIGJ5IHRoZSBTZXJ2ZXJQcm94eS4KKyAgICAvLyBvYnNlcnZlZCBidWZmZXIgcG9zaXRpb24gYW5kIGxvb3AgY291bnQgd2lsbCBmcmVlemUgdW50aWwgdGhlbiB0byBnaXZlIHRoZQorICAgIC8vIGlsbHVzaW9uIG9mIGEgc3luY2hyb25vdXMgY2hhbmdlLgorICAgIGdldEJ1ZmZlclBvc2l0aW9uQW5kTG9vcENvdW50KE5VTEwsIE5VTEwpOworICAgIC8vIHByZXNlcnZlIGJlaGF2aW9yIHRvIHJlc3RhcnQgYXQgbVN0YXRlLm1Mb29wU3RhcnQgaWYgcG9zaXRpb24gZXhjZWVkcyBtU3RhdGUubUxvb3BFbmQuCisgICAgaWYgKG1TdGF0ZS5tTG9vcENvdW50ICE9IDAgJiYgbVBvc0xvb3AubUJ1ZmZlclBvc2l0aW9uID49IG1TdGF0ZS5tTG9vcEVuZCkgeworICAgICAgICBtUG9zTG9vcC5tQnVmZmVyUG9zaXRpb24gPSBtU3RhdGUubUxvb3BTdGFydDsKICAgICB9Ci0gICAgbUJ1ZmZlclBvc2l0aW9uID0gYnVmZmVyUG9zaXRpb247IC8vIHNuYXBzaG90IGJ1ZmZlciBwb3NpdGlvbiB1bnRpbCBsb29wIGlzIGFja25vd2xlZGdlZC4KLSAgICAodm9pZCkgbU11dGF0b3IucHVzaChuZXdTdGF0ZSk7CisgICAgbVBvc0xvb3AubUxvb3BDb3VudCA9IG1TdGF0ZS5tTG9vcENvdW50OworICAgICh2b2lkKSBtTXV0YXRvci5wdXNoKG1TdGF0ZSk7Cit9CisKK3ZvaWQgU3RhdGljQXVkaW9UcmFja0NsaWVudFByb3h5OjpzZXRCdWZmZXJQb3NpdGlvbihzaXplX3QgcG9zaXRpb24pCit7CisgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gb24gYSA2NC1iaXQgY2xpZW50CisgICAgaWYgKHBvc2l0aW9uID4gVUlOVDMyX01BWCkgeworICAgICAgICAvLyBGSVhNRSBTaG91bGQgcmV0dXJuIGFuIGVycm9yIHN0YXR1cworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1TdGF0ZS5tUG9zaXRpb24gPSAodWludDMyX3QpIHBvc2l0aW9uOworICAgIG1TdGF0ZS5tUG9zaXRpb25TZXF1ZW5jZSA9IGluY3JlbWVudFNlcXVlbmNlKG1TdGF0ZS5tUG9zaXRpb25TZXF1ZW5jZSwgbVN0YXRlLm1Mb29wU2VxdWVuY2UpOworICAgIC8vIHNldCBwYXRjaC11cCB2YXJpYWJsZXMgdW50aWwgdGhlIG1TdGF0ZSBpcyBhY2tub3dsZWRnZWQgYnkgdGhlIFNlcnZlclByb3h5LgorICAgIC8vIG9ic2VydmVkIGJ1ZmZlciBwb3NpdGlvbiBhbmQgbG9vcCBjb3VudCB3aWxsIGZyZWV6ZSB1bnRpbCB0aGVuIHRvIGdpdmUgdGhlCisgICAgLy8gaWxsdXNpb24gb2YgYSBzeW5jaHJvbm91cyBjaGFuZ2UuCisgICAgaWYgKG1TdGF0ZS5tTG9vcENvdW50ID4gMCkgeyAgLy8gb25seSBjaGVjayBpZiBsb29wIGNvdW50IGlzIGNoYW5naW5nCisgICAgICAgIGdldEJ1ZmZlclBvc2l0aW9uQW5kTG9vcENvdW50KE5VTEwsIE5VTEwpOyAvLyBnZXQgbGFzdCBwb3NpdGlvbgorICAgIH0KKyAgICBtUG9zTG9vcC5tQnVmZmVyUG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICBpZiAocG9zaXRpb24gPj0gbVN0YXRlLm1Mb29wRW5kKSB7CisgICAgICAgIC8vIG5vIG9uZ29pbmcgbG9vcCBpcyBwb3NzaWJsZSBpZiBwb3NpdGlvbiBpcyBncmVhdGVyIHRoYW4gbG9vcEVuZC4KKyAgICAgICAgbVBvc0xvb3AubUxvb3BDb3VudCA9IDA7CisgICAgfQorICAgICh2b2lkKSBtTXV0YXRvci5wdXNoKG1TdGF0ZSk7Cit9CisKK3ZvaWQgU3RhdGljQXVkaW9UcmFja0NsaWVudFByb3h5OjpzZXRCdWZmZXJQb3NpdGlvbkFuZExvb3Aoc2l6ZV90IHBvc2l0aW9uLCBzaXplX3QgbG9vcFN0YXJ0LAorICAgICAgICBzaXplX3QgbG9vcEVuZCwgaW50IGxvb3BDb3VudCkKK3sKKyAgICBzZXRMb29wKGxvb3BTdGFydCwgbG9vcEVuZCwgbG9vcENvdW50KTsKKyAgICBzZXRCdWZmZXJQb3NpdGlvbihwb3NpdGlvbik7CiB9CiAKIHNpemVfdCBTdGF0aWNBdWRpb1RyYWNrQ2xpZW50UHJveHk6OmdldEJ1ZmZlclBvc2l0aW9uKCkKIHsKLSAgICBzaXplX3QgYnVmZmVyUG9zaXRpb247Ci0gICAgaWYgKG1NdXRhdG9yLmFjaygpKSB7Ci0gICAgICAgIGJ1ZmZlclBvc2l0aW9uID0gKHNpemVfdCkgbUNibGstPnUubVN0YXRpYy5tQnVmZmVyUG9zaXRpb247Ci0gICAgICAgIGlmIChidWZmZXJQb3NpdGlvbiA+IG1GcmFtZUNvdW50KSB7Ci0gICAgICAgICAgICBidWZmZXJQb3NpdGlvbiA9IG1GcmFtZUNvdW50OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYnVmZmVyUG9zaXRpb24gPSBtQnVmZmVyUG9zaXRpb247CisgICAgZ2V0QnVmZmVyUG9zaXRpb25BbmRMb29wQ291bnQoTlVMTCwgTlVMTCk7CisgICAgcmV0dXJuIG1Qb3NMb29wLm1CdWZmZXJQb3NpdGlvbjsKK30KKwordm9pZCBTdGF0aWNBdWRpb1RyYWNrQ2xpZW50UHJveHk6OmdldEJ1ZmZlclBvc2l0aW9uQW5kTG9vcENvdW50KAorICAgICAgICBzaXplX3QgKnBvc2l0aW9uLCBpbnQgKmxvb3BDb3VudCkKK3sKKyAgICBpZiAobU11dGF0b3IuYWNrKCkgPT0gU3RhdGljQXVkaW9UcmFja1NpbmdsZVN0YXRlUXVldWU6OlNTUV9ET05FKSB7CisgICAgICAgICBpZiAobVBvc0xvb3BPYnNlcnZlci5wb2xsKG1Qb3NMb29wKSkgeworICAgICAgICAgICAgIDsgLy8gYSB2YWxpZCBtUG9zTG9vcCBzaG91bGQgYmUgYXZhaWxhYmxlIGlmIGFja0RvbmUgaXMgdHJ1ZS4KKyAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGJ1ZmZlclBvc2l0aW9uOworICAgIGlmIChwb3NpdGlvbiAhPSBOVUxMKSB7CisgICAgICAgICpwb3NpdGlvbiA9IG1Qb3NMb29wLm1CdWZmZXJQb3NpdGlvbjsKKyAgICB9CisgICAgaWYgKGxvb3BDb3VudCAhPSBOVUxMKSB7CisgICAgICAgICpsb29wQ291bnQgPSBtUG9zTG9vcC5tTG9vcENvdW50OworICAgIH0KIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC01NTUsMTMgKzYxNiwyNCBAQAogICAgICAgICBmcm9udCA9IGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQ7CiAgICAgICAgIGlmIChmbHVzaCAhPSBtRmx1c2gpIHsKICAgICAgICAgICAgIC8vIGVmZmVjdGl2ZWx5IG9idGFpbiB0aGVuIHJlbGVhc2Ugd2hhdGV2ZXIgaXMgaW4gdGhlIGJ1ZmZlcgotICAgICAgICAgICAgc2l6ZV90IG1hc2sgPSAobUZyYW1lQ291bnRQMiA8PCAxKSAtIDE7CisgICAgICAgICAgICBjb25zdCBzaXplX3Qgb3ZlcmZsb3dCaXQgPSBtRnJhbWVDb3VudFAyIDw8IDE7CisgICAgICAgICAgICBjb25zdCBzaXplX3QgbWFzayA9IG92ZXJmbG93Qml0IC0gMTsKICAgICAgICAgICAgIGludDMyX3QgbmV3RnJvbnQgPSAoZnJvbnQgJiB+bWFzaykgfCAoZmx1c2ggJiBtYXNrKTsKICAgICAgICAgICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIG5ld0Zyb250OworICAgICAgICAgICAgaWYgKGZpbGxlZCA+PSAoc3NpemVfdClvdmVyZmxvd0JpdCkgeworICAgICAgICAgICAgICAgIC8vIGZyb250IGFuZCByZWFyIG9mZnNldHMgc3BhbiB0aGUgb3ZlcmZsb3cgYml0IG9mIHRoZSBwMiBtYXNrCisgICAgICAgICAgICAgICAgLy8gc28gcmViYXNpbmcgbmV3RnJvbnQgb24gdGhlIGZyb250IG9mZnNldCBpcyBvZmYgYnkgdGhlIG92ZXJmbG93IGJpdC4KKyAgICAgICAgICAgICAgICAvLyBhZGp1c3QgbmV3RnJvbnQgdG8gbWF0Y2ggcmVhciBvZmZzZXQuCisgICAgICAgICAgICAgICAgQUxPR1YoImZsdXNoIHdyYXA6IGZpbGxlZCAlenggPj0gb3ZlcmZsb3dCaXQgJXp4IiwgZmlsbGVkLCBvdmVyZmxvd0JpdCk7CisgICAgICAgICAgICAgICAgbmV3RnJvbnQgKz0gb3ZlcmZsb3dCaXQ7CisgICAgICAgICAgICAgICAgZmlsbGVkIC09IG92ZXJmbG93Qml0OworICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gUmF0aGVyIHRoYW4gc2h1dHRpbmcgZG93biBvbiBhIGNvcnJ1cHQgZmx1c2gsIGp1c3QgdHJlYXQgaXQgYXMgYSBmdWxsIGZsdXNoCiAgICAgICAgICAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIm1GbHVzaCAlI3ggLT4gJSN4LCBmcm9udCAlI3gsIHJlYXIgJSN4LCBtYXNrICUjeCwgbmV3RnJvbnQgJSN4LCBmaWxsZWQgJWQ9JSN4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaCwgZmx1c2gsIGZyb250LCByZWFyLCBtYXNrLCBuZXdGcm9udCwgZmlsbGVkLCBmaWxsZWQpOworICAgICAgICAgICAgICAgIEFMT0dFKCJtRmx1c2ggJSN4IC0+ICUjeCwgZnJvbnQgJSN4LCByZWFyICUjeCwgbWFzayAlI3gsIG5ld0Zyb250ICUjeCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgImZpbGxlZCAlemQ9JSN4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaCwgZmx1c2gsIGZyb250LCByZWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKW1hc2ssIG5ld0Zyb250LCBmaWxsZWQsICh1bnNpZ25lZClmaWxsZWQpOwogICAgICAgICAgICAgICAgIG5ld0Zyb250ID0gcmVhcjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1GbHVzaCA9IGZsdXNoOwpAQCAtNzM0LDE4ICs4MDYsMjMgQEAKICAgICAodm9pZCkgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19VTkRFUlJVTiwgJmNibGstPm1GbGFncyk7CiB9CiAKK0F1ZGlvUGxheWJhY2tSYXRlIEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6Z2V0UGxheWJhY2tSYXRlKCkKK3sgICAvLyBkbyBub3QgY2FsbCBmcm9tIG11bHRpcGxlIHRocmVhZHMgd2l0aG91dCBob2xkaW5nIGxvY2sKKyAgICBtUGxheWJhY2tSYXRlT2JzZXJ2ZXIucG9sbChtUGxheWJhY2tSYXRlKTsKKyAgICByZXR1cm4gbVBsYXliYWNrUmF0ZTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFN0YXRpY0F1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6U3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5KGF1ZGlvX3RyYWNrX2NibGtfdCogY2Jsaywgdm9pZCAqYnVmZmVycywKICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsIHNpemVfdCBmcmFtZVNpemUpCiAgICAgOiBBdWRpb1RyYWNrU2VydmVyUHJveHkoY2JsaywgYnVmZmVycywgZnJhbWVDb3VudCwgZnJhbWVTaXplKSwKLSAgICAgIG1PYnNlcnZlcigmY2Jsay0+dS5tU3RhdGljLm1TaW5nbGVTdGF0ZVF1ZXVlKSwgbVBvc2l0aW9uKDApLAorICAgICAgbU9ic2VydmVyKCZjYmxrLT51Lm1TdGF0aWMubVNpbmdsZVN0YXRlUXVldWUpLAorICAgICAgbVBvc0xvb3BNdXRhdG9yKCZjYmxrLT51Lm1TdGF0aWMubVBvc0xvb3BRdWV1ZSksCiAgICAgICBtRnJhbWVzUmVhZHlTYWZlKGZyYW1lQ291bnQpLCBtRnJhbWVzUmVhZHkoZnJhbWVDb3VudCksCiAgICAgICBtRnJhbWVzUmVhZHlJc0NhbGxlZEJ5TXVsdGlwbGVUaHJlYWRzKGZhbHNlKQogewotICAgIG1TdGF0ZS5tTG9vcFN0YXJ0ID0gMDsKLSAgICBtU3RhdGUubUxvb3BFbmQgPSAwOwotICAgIG1TdGF0ZS5tTG9vcENvdW50ID0gMDsKKyAgICBtZW1zZXQoJm1TdGF0ZSwgMCwgc2l6ZW9mKG1TdGF0ZSkpOwogfQogCiB2b2lkIFN0YXRpY0F1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6ZnJhbWVzUmVhZHlJc0NhbGxlZEJ5TXVsdGlwbGVUaHJlYWRzKCkKQEAgLTc2Miw1NSArODM5LDk3IEBACiAgICAgcmV0dXJuIG1GcmFtZXNSZWFkeVNhZmU7CiB9CiAKLXNzaXplX3QgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5Ojpwb2xsUG9zaXRpb24oKQorc3RhdHVzX3QgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5Ojp1cGRhdGVTdGF0ZVdpdGhMb29wKAorICAgICAgICBTdGF0aWNBdWRpb1RyYWNrU3RhdGUgKmxvY2FsU3RhdGUsIGNvbnN0IFN0YXRpY0F1ZGlvVHJhY2tTdGF0ZSAmdXBkYXRlKSBjb25zdAogewotICAgIHNpemVfdCBwb3NpdGlvbiA9IG1Qb3NpdGlvbjsKLSAgICBTdGF0aWNBdWRpb1RyYWNrU3RhdGUgc3RhdGU7Ci0gICAgaWYgKG1PYnNlcnZlci5wb2xsKHN0YXRlKSkgeworICAgIGlmIChsb2NhbFN0YXRlLT5tTG9vcFNlcXVlbmNlICE9IHVwZGF0ZS5tTG9vcFNlcXVlbmNlKSB7CiAgICAgICAgIGJvb2wgdmFsaWQgPSBmYWxzZTsKLSAgICAgICAgc2l6ZV90IGxvb3BTdGFydCA9IHN0YXRlLm1Mb29wU3RhcnQ7Ci0gICAgICAgIHNpemVfdCBsb29wRW5kID0gc3RhdGUubUxvb3BFbmQ7Ci0gICAgICAgIGlmIChzdGF0ZS5tTG9vcENvdW50ID09IDApIHsKLSAgICAgICAgICAgIGlmIChsb29wU3RhcnQgPiBtRnJhbWVDb3VudCkgewotICAgICAgICAgICAgICAgIGxvb3BTdGFydCA9IG1GcmFtZUNvdW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gaWdub3JlIGxvb3BFbmQKLSAgICAgICAgICAgIG1Qb3NpdGlvbiA9IHBvc2l0aW9uID0gbG9vcFN0YXJ0OwotICAgICAgICAgICAgbUZyYW1lc1JlYWR5ID0gbUZyYW1lQ291bnQgLSBtUG9zaXRpb247Ci0gICAgICAgICAgICBtU3RhdGUubUxvb3BDb3VudCA9IDA7CisgICAgICAgIGNvbnN0IHNpemVfdCBsb29wU3RhcnQgPSB1cGRhdGUubUxvb3BTdGFydDsKKyAgICAgICAgY29uc3Qgc2l6ZV90IGxvb3BFbmQgPSB1cGRhdGUubUxvb3BFbmQ7CisgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IGxvY2FsU3RhdGUtPm1Qb3NpdGlvbjsKKyAgICAgICAgaWYgKHVwZGF0ZS5tTG9vcENvdW50ID09IDApIHsKICAgICAgICAgICAgIHZhbGlkID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5tTG9vcENvdW50ID49IC0xKSB7CisgICAgICAgIH0gZWxzZSBpZiAodXBkYXRlLm1Mb29wQ291bnQgPj0gLTEpIHsKICAgICAgICAgICAgIGlmIChsb29wU3RhcnQgPCBsb29wRW5kICYmIGxvb3BFbmQgPD0gbUZyYW1lQ291bnQgJiYKICAgICAgICAgICAgICAgICAgICAgbG9vcEVuZCAtIGxvb3BTdGFydCA+PSBNSU5fTE9PUCkgewogICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZW5kIG9mIHRoZSBsb29wCiAgICAgICAgICAgICAgICAgLy8gd2UgIndyYXAiIHRvIHRoZSBsb29wIHN0YXJ0LiBUaGlzIG1pZ2h0IGNhdXNlIGFuIGF1ZGlibGUgcG9wLgogICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA+PSBsb29wRW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3NpdGlvbiA9IHBvc2l0aW9uID0gbG9vcFN0YXJ0OworICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGxvb3BTdGFydDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXRlLm1Mb29wQ291bnQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1JlYWR5ID0gSU5UNjRfTUFYOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIG1GcmFtZXNSZWFkeSBpcyA2NCBiaXRzIHRvIGhhbmRsZSB0aGUgZWZmZWN0aXZlIG51bWJlciBvZiBmcmFtZXMKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCB0aGUgc3RhdGljIGF1ZGlvIHRyYWNrIGNvbnRhaW5zLCBpbmNsdWRpbmcgbG9vcHMuCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IExhdGVyIGNvbnNpZGVyIGZpeGluZyBvdmVyZmxvdywgYnV0IGRvZXMgbm90IHNlZW0gbmVlZGVkIG5vdwotICAgICAgICAgICAgICAgICAgICAvLyBhcyB3aWxsIG5vdCBvdmVyZmxvdyBpZiBsb29wU3RhcnQgYW5kIGxvb3BFbmQgYXJlIEphdmEgImludHMiLgotICAgICAgICAgICAgICAgICAgICBtRnJhbWVzUmVhZHkgPSBpbnQ2NF90KHN0YXRlLm1Mb29wQ291bnQpICogKGxvb3BFbmQgLSBsb29wU3RhcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtRnJhbWVDb3VudCAtIG1Qb3NpdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gc3RhdGU7CiAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmICghdmFsaWQgfHwgbVBvc2l0aW9uID4gbUZyYW1lQ291bnQpIHsKKyAgICAgICAgaWYgKCF2YWxpZCB8fCBwb3NpdGlvbiA+IG1GcmFtZUNvdW50KSB7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgICAgICBsb2NhbFN0YXRlLT5tUG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICAgICAgbG9jYWxTdGF0ZS0+bUxvb3BDb3VudCA9IHVwZGF0ZS5tTG9vcENvdW50OworICAgICAgICBsb2NhbFN0YXRlLT5tTG9vcEVuZCA9IGxvb3BFbmQ7CisgICAgICAgIGxvY2FsU3RhdGUtPm1Mb29wU3RhcnQgPSBsb29wU3RhcnQ7CisgICAgICAgIGxvY2FsU3RhdGUtPm1Mb29wU2VxdWVuY2UgPSB1cGRhdGUubUxvb3BTZXF1ZW5jZTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHk6OnVwZGF0ZVN0YXRlV2l0aFBvc2l0aW9uKAorICAgICAgICBTdGF0aWNBdWRpb1RyYWNrU3RhdGUgKmxvY2FsU3RhdGUsIGNvbnN0IFN0YXRpY0F1ZGlvVHJhY2tTdGF0ZSAmdXBkYXRlKSBjb25zdAoreworICAgIGlmIChsb2NhbFN0YXRlLT5tUG9zaXRpb25TZXF1ZW5jZSAhPSB1cGRhdGUubVBvc2l0aW9uU2VxdWVuY2UpIHsKKyAgICAgICAgaWYgKHVwZGF0ZS5tUG9zaXRpb24gPiBtRnJhbWVDb3VudCkgeworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWxTdGF0ZS0+bUxvb3BDb3VudCAhPSAwICYmIHVwZGF0ZS5tUG9zaXRpb24gPj0gbG9jYWxTdGF0ZS0+bUxvb3BFbmQpIHsKKyAgICAgICAgICAgIGxvY2FsU3RhdGUtPm1Mb29wQ291bnQgPSAwOyAvLyBkaXNhYmxlIGxvb3AgY291bnQgaWYgcG9zaXRpb24gaXMgYmV5b25kIGxvb3AgZW5kLgorICAgICAgICB9CisgICAgICAgIGxvY2FsU3RhdGUtPm1Qb3NpdGlvbiA9IHVwZGF0ZS5tUG9zaXRpb247CisgICAgICAgIGxvY2FsU3RhdGUtPm1Qb3NpdGlvblNlcXVlbmNlID0gdXBkYXRlLm1Qb3NpdGlvblNlcXVlbmNlOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3NzaXplX3QgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5Ojpwb2xsUG9zaXRpb24oKQoreworICAgIFN0YXRpY0F1ZGlvVHJhY2tTdGF0ZSBzdGF0ZTsKKyAgICBpZiAobU9ic2VydmVyLnBvbGwoc3RhdGUpKSB7CisgICAgICAgIFN0YXRpY0F1ZGlvVHJhY2tTdGF0ZSB0cnlzdGF0ZSA9IG1TdGF0ZTsKKyAgICAgICAgYm9vbCByZXN1bHQ7CisgICAgICAgIGNvbnN0IGludDMyX3QgZGlmZlNlcSA9IHN0YXRlLm1Mb29wU2VxdWVuY2UgLSBzdGF0ZS5tUG9zaXRpb25TZXF1ZW5jZTsKKworICAgICAgICBpZiAoZGlmZlNlcSA8IDApIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IHVwZGF0ZVN0YXRlV2l0aExvb3AoJnRyeXN0YXRlLCBzdGF0ZSkgPT0gT0sgJiYKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3RhdGVXaXRoUG9zaXRpb24oJnRyeXN0YXRlLCBzdGF0ZSkgPT0gT0s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQgPSB1cGRhdGVTdGF0ZVdpdGhQb3NpdGlvbigmdHJ5c3RhdGUsIHN0YXRlKSA9PSBPSyAmJgorICAgICAgICAgICAgICAgICAgICB1cGRhdGVTdGF0ZVdpdGhMb29wKCZ0cnlzdGF0ZSwgc3RhdGUpID09IE9LOworICAgICAgICB9CisgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICBtT2JzZXJ2ZXIuZG9uZSgpOworICAgICAgICAgICAgLy8gY2F1dGlvbjogbm8gdXBkYXRlIG9jY3VycyBzbyBzZXJ2ZXIgc3RhdGUgd2lsbCBiZSBpbmNvbnNpc3RlbnQgd2l0aCBjbGllbnQgc3RhdGUuCiAgICAgICAgICAgICBBTE9HRSgiJXMgY2xpZW50IHB1c2hlZCBhbiBpbnZhbGlkIHN0YXRlLCBzaHV0dGluZyBkb3duIiwgX19mdW5jX18pOwogICAgICAgICAgICAgbUlzU2h1dGRvd24gPSB0cnVlOwogICAgICAgICAgICAgcmV0dXJuIChzc2l6ZV90KSBOT19JTklUOwogICAgICAgICB9CisgICAgICAgIG1TdGF0ZSA9IHRyeXN0YXRlOworICAgICAgICBpZiAobVN0YXRlLm1Mb29wQ291bnQgPT0gLTEpIHsKKyAgICAgICAgICAgIG1GcmFtZXNSZWFkeSA9IElOVDY0X01BWDsKKyAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUubUxvb3BDb3VudCA9PSAwKSB7CisgICAgICAgICAgICBtRnJhbWVzUmVhZHkgPSBtRnJhbWVDb3VudCAtIG1TdGF0ZS5tUG9zaXRpb247CisgICAgICAgIH0gZWxzZSBpZiAobVN0YXRlLm1Mb29wQ291bnQgPiAwKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBMYXRlciBjb25zaWRlciBmaXhpbmcgb3ZlcmZsb3csIGJ1dCBkb2VzIG5vdCBzZWVtIG5lZWRlZCBub3cKKyAgICAgICAgICAgIC8vIGFzIHdpbGwgbm90IG92ZXJmbG93IGlmIGxvb3BTdGFydCBhbmQgbG9vcEVuZCBhcmUgSmF2YSAiaW50cyIuCisgICAgICAgICAgICBtRnJhbWVzUmVhZHkgPSBpbnQ2NF90KG1TdGF0ZS5tTG9vcENvdW50KSAqIChtU3RhdGUubUxvb3BFbmQgLSBtU3RhdGUubUxvb3BTdGFydCkKKyAgICAgICAgICAgICAgICAgICAgKyBtRnJhbWVDb3VudCAtIG1TdGF0ZS5tUG9zaXRpb247CisgICAgICAgIH0KICAgICAgICAgbUZyYW1lc1JlYWR5U2FmZSA9IGNsYW1wVG9TaXplKG1GcmFtZXNSZWFkeSk7CiAgICAgICAgIC8vIFRoaXMgbWF5IG92ZXJmbG93LCBidXQgY2xpZW50IGlzIG5vdCBzdXBwb3NlZCB0byByZWx5IG9uIGl0Ci0gICAgICAgIG1DYmxrLT51Lm1TdGF0aWMubUJ1ZmZlclBvc2l0aW9uID0gKHVpbnQzMl90KSBwb3NpdGlvbjsKKyAgICAgICAgU3RhdGljQXVkaW9UcmFja1Bvc0xvb3AgcG9zTG9vcDsKKworICAgICAgICBwb3NMb29wLm1Mb29wQ291bnQgPSAoaW50MzJfdCkgbVN0YXRlLm1Mb29wQ291bnQ7CisgICAgICAgIHBvc0xvb3AubUJ1ZmZlclBvc2l0aW9uID0gKHVpbnQzMl90KSBtU3RhdGUubVBvc2l0aW9uOworICAgICAgICBtUG9zTG9vcE11dGF0b3IucHVzaChwb3NMb29wKTsKKyAgICAgICAgbU9ic2VydmVyLmRvbmUoKTsgLy8gc2FmZSB0byByZWFkIG1TdGF0aWMgdmFyaWFibGVzLgogICAgIH0KLSAgICByZXR1cm4gKHNzaXplX3QpIHBvc2l0aW9uOworICAgIHJldHVybiAoc3NpemVfdCkgbVN0YXRlLm1Qb3NpdGlvbjsKIH0KIAogc3RhdHVzX3QgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5OjpvYnRhaW5CdWZmZXIoQnVmZmVyKiBidWZmZXIsIGJvb2wgYWNrRmx1c2ggX191bnVzZWQpCkBAIC04NDksNyArOTY4LDcgQEAKICAgICB9CiAgICAgLy8gQXMgbUZyYW1lc1JlYWR5IGlzIHRoZSB0b3RhbCByZW1haW5pbmcgZnJhbWVzIGluIHRoZSBzdGF0aWMgYXVkaW8gdHJhY2ssCiAgICAgLy8gaXQgaXMgYWx3YXlzIGxhcmdlciBvciBlcXVhbCB0byBhdmFpbC4KLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1GcmFtZXNSZWFkeSA8IGF2YWlsKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1GcmFtZXNSZWFkeSA8IChpbnQ2NF90KSBhdmFpbCk7CiAgICAgYnVmZmVyLT5tTm9uQ29udGlnID0gbUZyYW1lc1JlYWR5ID09IElOVDY0X01BWCA/IFNJWkVfTUFYIDogY2xhbXBUb1NpemUobUZyYW1lc1JlYWR5IC0gYXZhaWwpOwogICAgIG1VbnJlbGVhc2VkID0gYXZhaWw7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtODU4LDcgKzk3Nyw3IEBACiB2b2lkIFN0YXRpY0F1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6cmVsZWFzZUJ1ZmZlcihCdWZmZXIqIGJ1ZmZlcikKIHsKICAgICBzaXplX3Qgc3RlcENvdW50ID0gYnVmZmVyLT5tRnJhbWVDb3VudDsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCEoc3RlcENvdW50IDw9IG1GcmFtZXNSZWFkeSkpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoISgoaW50NjRfdCkgc3RlcENvdW50IDw9IG1GcmFtZXNSZWFkeSkpOwogICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIShzdGVwQ291bnQgPD0gbVVucmVsZWFzZWQpKTsKICAgICBpZiAoc3RlcENvdW50ID09IDApIHsKICAgICAgICAgLy8gcHJldmVudCBhY2NpZGVudGFsIHJlLXVzZSBvZiBidWZmZXIKQEAgLTg2OCwxMSArOTg3LDEyIEBACiAgICAgfQogICAgIG1VbnJlbGVhc2VkIC09IHN0ZXBDb3VudDsKICAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSBtQ2JsazsKLSAgICBzaXplX3QgcG9zaXRpb24gPSBtUG9zaXRpb247CisgICAgc2l6ZV90IHBvc2l0aW9uID0gbVN0YXRlLm1Qb3NpdGlvbjsKICAgICBzaXplX3QgbmV3UG9zaXRpb24gPSBwb3NpdGlvbiArIHN0ZXBDb3VudDsKICAgICBpbnQzMl90IHNldEZsYWdzID0gMDsKICAgICBpZiAoIShwb3NpdGlvbiA8PSBuZXdQb3NpdGlvbiAmJiBuZXdQb3NpdGlvbiA8PSBtRnJhbWVDb3VudCkpIHsKLSAgICAgICAgQUxPR1coIiVzIG5ld1Bvc2l0aW9uICV6dSBvdXRzaWRlIFslenUsICV6dV0iLCBfX2Z1bmNfXywgbmV3UG9zaXRpb24sIHBvc2l0aW9uLCBtRnJhbWVDb3VudCk7CisgICAgICAgIEFMT0dXKCIlcyBuZXdQb3NpdGlvbiAlenUgb3V0c2lkZSBbJXp1LCAlenVdIiwgX19mdW5jX18sIG5ld1Bvc2l0aW9uLCBwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCk7CiAgICAgICAgIG5ld1Bvc2l0aW9uID0gbUZyYW1lQ291bnQ7CiAgICAgfSBlbHNlIGlmIChtU3RhdGUubUxvb3BDb3VudCAhPSAwICYmIG5ld1Bvc2l0aW9uID09IG1TdGF0ZS5tTG9vcEVuZCkgewogICAgICAgICBuZXdQb3NpdGlvbiA9IG1TdGF0ZS5tTG9vcFN0YXJ0OwpAQCAtODg1LDcgKzEwMDUsNyBAQAogICAgIGlmIChuZXdQb3NpdGlvbiA9PSBtRnJhbWVDb3VudCkgewogICAgICAgICBzZXRGbGFncyB8PSBDQkxLX0JVRkZFUl9FTkQ7CiAgICAgfQotICAgIG1Qb3NpdGlvbiA9IG5ld1Bvc2l0aW9uOworICAgIG1TdGF0ZS5tUG9zaXRpb24gPSBuZXdQb3NpdGlvbjsKICAgICBpZiAobUZyYW1lc1JlYWR5ICE9IElOVDY0X01BWCkgewogICAgICAgICBtRnJhbWVzUmVhZHkgLT0gc3RlcENvdW50OwogICAgIH0KQEAgLTg5Myw3ICsxMDEzLDEwIEBACiAKICAgICBjYmxrLT5tU2VydmVyICs9IHN0ZXBDb3VudDsKICAgICAvLyBUaGlzIG1heSBvdmVyZmxvdywgYnV0IGNsaWVudCBpcyBub3Qgc3VwcG9zZWQgdG8gcmVseSBvbiBpdAotICAgIGNibGstPnUubVN0YXRpYy5tQnVmZmVyUG9zaXRpb24gPSAodWludDMyX3QpIG5ld1Bvc2l0aW9uOworICAgIFN0YXRpY0F1ZGlvVHJhY2tQb3NMb29wIHBvc0xvb3A7CisgICAgcG9zTG9vcC5tQnVmZmVyUG9zaXRpb24gPSBtU3RhdGUubVBvc2l0aW9uOworICAgIHBvc0xvb3AubUxvb3BDb3VudCA9IG1TdGF0ZS5tTG9vcENvdW50OworICAgIG1Qb3NMb29wTXV0YXRvci5wdXNoKHBvc0xvb3ApOwogICAgIGlmIChzZXRGbGFncyAhPSAwKSB7CiAgICAgICAgICh2b2lkKSBhbmRyb2lkX2F0b21pY19vcihzZXRGbGFncywgJmNibGstPm1GbGFncyk7CiAgICAgICAgIC8vIHRoaXMgd291bGQgYmUgYSBnb29kIHBsYWNlIHRvIHdha2UgYSBmdXRleApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5jcHAgYi9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcAppbmRleCA0MTk5NGRjLi4zMDIwMTM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcApAQCAtODksNyArODksNiBAQAogICAgICAgICAvLyB0cnkgY29tYmluZWQgZGV0ZWN0aW9uIG9mIGFydGlzdC9hbGJ1bS90aXRsZSBldGMuCiAgICAgICAgIGNoYXIgYnVmWzEwMjRdOwogICAgICAgICBidWZbMF0gPSAwOwotICAgICAgICBpbnQgaWR4OwogICAgICAgICBib29sIGFsbHByaW50YWJsZSA9IHRydWU7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gbU5hbWVzLmdldEVudHJ5KGkpOwpAQCAtMTY5LDcgKzE2OCw2IEBACiAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gbU5hbWVzLmdldEVudHJ5KGkpOwogICAgICAgICAgICAgdWludDhfdCogc3JjID0gKHVpbnQ4X3QgKiltVmFsdWVzLmdldEVudHJ5KGkpOwogICAgICAgICAgICAgaW50IGxlbiA9IHN0cmxlbigoY2hhciAqKXNyYyk7Ci0gICAgICAgICAgICB1aW50OF90KiBkZXN0ID0gc3JjOwogCiAgICAgICAgICAgICBBTE9HVigiQEBAIGNoZWNraW5nICVzIiwgbmFtZSk7CiAgICAgICAgICAgICBjb25zdCBjaGFyICpzID0gbVZhbHVlcy5nZXRFbnRyeShpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlci5jcHAKaW5kZXggYTk0ZjljZS4uMGJmNTAzYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlci5jcHAKQEAgLTgwLDcgKzgwLDggQEAKICAgICBSRUxFQVNFX0FVRElPX1BBVENILAogICAgIExJU1RfQVVESU9fUEFUQ0hFUywKICAgICBTRVRfQVVESU9fUE9SVF9DT05GSUcsCi0gICAgR0VUX0FVRElPX0hXX1NZTkMKKyAgICBHRVRfQVVESU9fSFdfU1lOQywKKyAgICBTWVNURU1fUkVBRFkKIH07CiAKICNkZWZpbmUgTUFYX0lURU1TX1BFUl9MSVNUIDEwMjQKQEAgLTE3NCw5ICsxNzUsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcEZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRVaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4mIGNibGssCkBAIC0xOTAsMTEgKzE5MywxMyBAQAogICAgICAgICBkYXRhLndyaXRlSW50MzIoc2FtcGxlUmF0ZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmb3JtYXQpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoY2hhbm5lbE1hc2spOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYob3BQYWNrYWdlTmFtZSk7CiAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gcEZyYW1lQ291bnQgIT0gTlVMTCA/ICpwRnJhbWVDb3VudCA6IDA7CiAgICAgICAgIGRhdGEud3JpdGVJbnQ2NChmcmFtZUNvdW50KTsKICAgICAgICAgdHJhY2tfZmxhZ3NfdCBsRmxhZ3MgPSBmbGFncyAhPSBOVUxMID8gKmZsYWdzIDogKHRyYWNrX2ZsYWdzX3QpIFRSQUNLX0RFRkFVTFQ7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihsRmxhZ3MpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHRpZCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgY2xpZW50VWlkKTsKICAgICAgICAgaW50IGxTZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFOwogICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwpIHsKICAgICAgICAgICAgIGxTZXNzaW9uSWQgPSAqc2Vzc2lvbklkOwpAQCAtNzAyLDYgKzcwNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmVuYWJsZWQpCkBAIC03MjIsNiArNzI4LDcgQEAKICAgICAgICAgZGF0YS53cml0ZUludDMyKHByaW9yaXR5KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBvdXRwdXQpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoc2Vzc2lvbklkKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KG9wUGFja2FnZU5hbWUpOwogCiAgICAgICAgIHN0YXR1c190IGxTdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQ1JFQVRFX0VGRkVDVCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKQEAgLTg5Nyw2ICs5MDQsMTIgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gKGF1ZGlvX2h3X3N5bmNfdClyZXBseS5yZWFkSW50MzIoKTsKICAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBzeXN0ZW1SZWFkeSgpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICByZXR1cm4gcmVtb3RlKCktPnRyYW5zYWN0KFNZU1RFTV9SRUFEWSwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CisgICAgfQogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKEF1ZGlvRmxpbmdlciwgImFuZHJvaWQubWVkaWEuSUF1ZGlvRmxpbmdlciIpOwpAQCAtOTUwLDE4ICs5NjMsMTkgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUgPSBkYXRhLnJlYWRTdHJpbmcxNigpOwogICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICAgICAgdHJhY2tfZmxhZ3NfdCBmbGFncyA9ICh0cmFja19mbGFnc190KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgcGlkX3QgdGlkID0gKHBpZF90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50IGNsaWVudFVpZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHNpemVfdCBub3RpZmljYXRpb25GcmFtZXMgPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICAgICAgc3A8SU1lbW9yeT4gY2JsazsKICAgICAgICAgICAgIHNwPElNZW1vcnk+IGJ1ZmZlcnM7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKICAgICAgICAgICAgIHNwPElBdWRpb1JlY29yZD4gcmVjb3JkID0gb3BlblJlY29yZChpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgJmZyYW1lQ291bnQsICZmbGFncywgdGlkLCAmc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAmbm90aWZpY2F0aW9uRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICBjYmxrLCBidWZmZXJzLCAmc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgb3BQYWNrYWdlTmFtZSwgJmZyYW1lQ291bnQsICZmbGFncywgdGlkLAorICAgICAgICAgICAgICAgICAgICBjbGllbnRVaWQsICZzZXNzaW9uSWQsICZub3RpZmljYXRpb25GcmFtZXMsIGNibGssIGJ1ZmZlcnMsICZzdGF0dXMpOwogICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigocmVjb3JkICE9IDApICE9IChzdGF0dXMgPT0gTk9fRVJST1IpKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KGZyYW1lQ291bnQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZmxhZ3MpOwpAQCAtMTI1MywxMiArMTI2NywxMyBAQAogICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSAoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2IG9wUGFja2FnZU5hbWUgPSBkYXRhLnJlYWRTdHJpbmcxNigpOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgICAgICAgICBpbnQgaWQgPSAwOwogICAgICAgICAgICAgaW50IGVuYWJsZWQgPSAwOwogCiAgICAgICAgICAgICBzcDxJRWZmZWN0PiBlZmZlY3QgPSBjcmVhdGVFZmZlY3QoJmRlc2MsIGNsaWVudCwgcHJpb3JpdHksIG91dHB1dCwgc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAmc3RhdHVzLCAmaWQsICZlbmFibGVkKTsKKyAgICAgICAgICAgICAgICAgICAgb3BQYWNrYWdlTmFtZSwgJnN0YXR1cywgJmlkLCAmZW5hYmxlZCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaWQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZW5hYmxlZCk7CkBAIC0xMzk4LDYgKzE0MTMsMTEgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbigoYXVkaW9fc2Vzc2lvbl90KWRhdGEucmVhZEludDMyKCkpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTWVNURU1fUkVBRFk6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzeXN0ZW1SZWFkeSgpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CkBAIC0xNDA1LDQgKzE0MjUsNCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuY3BwCmluZGV4IDFjMjk5ZjcuLjM0MjlkMzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuY3BwCkBAIC0zOSwyNSArMzksMTggQEAKICAgICB7CiAgICAgfQogCi0gICAgdm9pZCBpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3Qgdm9pZCAqcGFyYW0yKQorICAgIHZvaWQgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgY29uc3Qgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+JiBpb0Rlc2MpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZXZlbnQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGlvSGFuZGxlKTsKLSAgICAgICAgaWYgKGV2ZW50ID09IEF1ZGlvU3lzdGVtOjpTVFJFQU1fQ09ORklHX0NIQU5HRUQpIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbSA9ICooY29uc3QgdWludDMyX3QgKilwYXJhbTI7Ci0gICAgICAgICAgICBBTE9HVigiaW9Db25maWdDaGFuZ2VkIHN0cmVhbSAlZCIsIHN0cmVhbSk7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RyZWFtKTsKLSAgICAgICAgfSBlbHNlIGlmIChldmVudCAhPSBBdWRpb1N5c3RlbTo6T1VUUFVUX0NMT1NFRCAmJiBldmVudCAhPSBBdWRpb1N5c3RlbTo6SU5QVVRfQ0xPU0VEKSB7Ci0gICAgICAgICAgICBjb25zdCBBdWRpb1N5c3RlbTo6T3V0cHV0RGVzY3JpcHRvciAqZGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgIChjb25zdCBBdWRpb1N5c3RlbTo6T3V0cHV0RGVzY3JpcHRvciAqKXBhcmFtMjsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihkZXNjLT5zYW1wbGluZ1JhdGUpOwotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGRlc2MtPmZvcm1hdCk7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoZGVzYy0+Y2hhbm5lbE1hc2spOwotICAgICAgICAgICAgZGF0YS53cml0ZUludDY0KGRlc2MtPmZyYW1lQ291bnQpOwotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGRlc2MtPmxhdGVuY3kpOwotICAgICAgICB9CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgIGRhdGEud3JpdGUoJmlvRGVzYy0+bVBhdGNoLCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BhdGNoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihpb0Rlc2MtPm1TYW1wbGluZ1JhdGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaW9EZXNjLT5tRm9ybWF0KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGlvRGVzYy0+bUNoYW5uZWxNYXNrKTsKKyAgICAgICAgZGF0YS53cml0ZUludDY0KGlvRGVzYy0+bUZyYW1lQ291bnQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaW9EZXNjLT5tTGF0ZW5jeSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChJT19DT05GSUdfQ0hBTkdFRCwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CiAgICAgfQogfTsKQEAgLTcyLDI0ICs2NSwxNiBAQAogICAgIHN3aXRjaCAoY29kZSkgewogICAgIGNhc2UgSU9fQ09ORklHX0NIQU5HRUQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyQ2xpZW50LCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQgZXZlbnQgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUgPSAoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBjb25zdCB2b2lkICpwYXJhbTIgPSBOVUxMOwotICAgICAgICAgICAgQXVkaW9TeXN0ZW06Ok91dHB1dERlc2NyaXB0b3IgZGVzYzsKLSAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbTsKLSAgICAgICAgICAgIGlmIChldmVudCA9PSBBdWRpb1N5c3RlbTo6U1RSRUFNX0NPTkZJR19DSEFOR0VEKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICBwYXJhbTIgPSAmc3RyZWFtOwotICAgICAgICAgICAgICAgIEFMT0dWKCJTVFJFQU1fQ09ORklHX0NIQU5HRUQgc3RyZWFtICVkIiwgc3RyZWFtKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgIT0gQXVkaW9TeXN0ZW06Ok9VVFBVVF9DTE9TRUQgJiYgZXZlbnQgIT0gQXVkaW9TeXN0ZW06OklOUFVUX0NMT1NFRCkgewotICAgICAgICAgICAgICAgIGRlc2Muc2FtcGxpbmdSYXRlID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICBkZXNjLmZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICBkZXNjLmNoYW5uZWxNYXNrID0gKGF1ZGlvX2NoYW5uZWxfbWFza190KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgICAgIGRlc2MuZnJhbWVDb3VudCA9IGRhdGEucmVhZEludDY0KCk7Ci0gICAgICAgICAgICAgICAgZGVzYy5sYXRlbmN5ID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICBwYXJhbTIgPSAmZGVzYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChldmVudCwgaW9IYW5kbGUsIHBhcmFtMik7CisgICAgICAgICAgICBhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQgPSAoYXVkaW9faW9fY29uZmlnX2V2ZW50KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gaW9EZXNjID0gbmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCk7CisgICAgICAgICAgICBpb0Rlc2MtPm1Jb0hhbmRsZSA9IChhdWRpb19pb19oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmaW9EZXNjLT5tUGF0Y2gsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcGF0Y2gpKTsKKyAgICAgICAgICAgIGlvRGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBpb0Rlc2MtPm1Gb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBpb0Rlc2MtPm1DaGFubmVsTWFzayA9IChhdWRpb19jaGFubmVsX21hc2tfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGlvRGVzYy0+bUZyYW1lQ291bnQgPSBkYXRhLnJlYWRJbnQ2NCgpOworICAgICAgICAgICAgaW9EZXNjLT5tTGF0ZW5jeSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoZXZlbnQsIGlvRGVzYyk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CkBAIC05OSw0ICs4NCw0IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKaW5kZXggMWI4Y2EyZC4uNzZiNTkyNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTcxLDYgKzcxLDkgQEAKICAgICBSRUxFQVNFX1NPVU5EVFJJR0dFUl9TRVNTSU9OLAogICAgIEdFVF9QSE9ORV9TVEFURSwKICAgICBSRUdJU1RFUl9QT0xJQ1lfTUlYRVMsCisgICAgU1RBUlRfQVVESU9fU09VUkNFLAorICAgIFNUT1BfQVVESU9fU09VUkNFLAorICAgIFNFVF9BVURJT19QT1JUX0NBTExCQUNLX0VOQUJMRUQsCiB9OwogCiAjZGVmaW5lIE1BWF9JVEVNU19QRVJfTElTVCAxMDI0CkBAIC04NiwxMyArODksMTUgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihkZXZpY2UpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhdGUpKTsKICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcoZGV2aWNlX2FkZHJlc3MpOworICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhkZXZpY2VfbmFtZSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfREVWSUNFX0NPTk5FQ1RJT05fU1RBVEUsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQpAQCAtMTY3LDEwICsxNzIsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQogICAgICAgICB7CiAgICAgICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC0yMDIsMTAgKzIwOSwxMiBAQAogICAgICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigxKTsKICAgICAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoKnN0cmVhbSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIodWlkKTsKICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzYW1wbGluZ1JhdGUpOwogICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oZm9ybWF0KSk7CiAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoY2hhbm5lbE1hc2spOwogICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oZmxhZ3MpKTsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzZWxlY3RlZERldmljZUlkKTsKICAgICAgICAgICAgIC8vIGhhc09mZmxvYWRJbmZvCiAgICAgICAgICAgICBpZiAob2ZmbG9hZEluZm8gPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigwKTsKQEAgLTI2OSwxMCArMjc4LDEyIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTI4NiwxMCArMjk3LDEyIEBACiAgICAgICAgIH0KICAgICAgICAgZGF0YS53cml0ZShhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHVpZCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzYW1wbGluZ1JhdGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90Pihmb3JtYXQpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGZsYWdzKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHNlbGVjdGVkRGV2aWNlSWQpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0lOUFVUX0ZPUl9BVFRSLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwpAQCAtNjM0LDYgKzY0NywxNCBAQAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVHSVNURVJfQ0xJRU5ULCBkYXRhLCAmcmVwbHkpOwogICAgIH0KIAorICAgIHZpcnR1YWwgdm9pZCBzZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihlbmFibGVkID8gMSA6IDApOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0FVRElPX1BPUlRfQ0FMTEJBQ0tfRU5BQkxFRCwgZGF0YSwgJnJlcGx5KTsKKyAgICB9CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSkKQEAgLTcxMCw2ICs3MzEsNDIgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaGFuZGxlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgaWYgKHNvdXJjZSA9PSBOVUxMIHx8IGF0dHJpYnV0ZXMgPT0gTlVMTCB8fCBoYW5kbGUgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBkYXRhLndyaXRlKHNvdXJjZSwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZykpOworICAgICAgICBkYXRhLndyaXRlKGF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNUQVJUX0FVRElPX1NPVVJDRSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgKmhhbmRsZSA9IChhdWRpb19pb19oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaGFuZGxlKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNUT1BfQVVESU9fU09VUkNFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQXVkaW9Qb2xpY3lTZXJ2aWNlLCAiYW5kcm9pZC5tZWRpYS5JQXVkaW9Qb2xpY3lTZXJ2aWNlIik7CkBAIC03MjgsOSArNzg1LDExIEBACiAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUgPQogICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90PihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzID0gZGF0YS5yZWFkQ1N0cmluZygpOworICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4gKHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9hZGRyZXNzKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfbmFtZSkpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIApAQCAtODA2LDExICs4NjUsMTMgQEAKICAgICAgICAgICAgIGlmIChoYXNTdHJlYW0pIHsKICAgICAgICAgICAgICAgICBzdHJlYW0gPSAoYXVkaW9fc3RyZWFtX3R5cGVfdClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgdWlkX3QgdWlkID0gKHVpZF90KWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPQogICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGJvb2wgaGFzT2ZmbG9hZEluZm8gPSBkYXRhLnJlYWRJbnQzMigpICE9IDA7CiAgICAgICAgICAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBvZmZsb2FkSW5mbzsKICAgICAgICAgICAgIGlmIChoYXNPZmZsb2FkSW5mbykgewpAQCAtODE4LDkgKzg3OSw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSAwOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0T3V0cHV0Rm9yQXR0cihoYXNBdHRyaWJ1dGVzID8gJmF0dHIgOiBOVUxMLAotICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LCBzZXNzaW9uLCAmc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LCBzZXNzaW9uLCAmc3RyZWFtLCB1aWQsCiAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIGhhc09mZmxvYWRJbmZvID8gJm9mZmxvYWRJbmZvIDogTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBoYXNPZmZsb2FkSW5mbyA/ICZvZmZsb2FkSW5mbyA6IE5VTEwpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG91dHB1dCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdHJlYW0pOwpAQCAtODY1LDE0ICs5MjYsMTYgQEAKICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyOwogICAgICAgICAgICAgZGF0YS5yZWFkKCZhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CiAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHVpZF90IHVpZCA9ICh1aWRfdClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0OwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0SW5wdXRGb3JBdHRyKCZhdHRyLCAmaW5wdXQsIHNlc3Npb24sCisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0ge307CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRJbnB1dEZvckF0dHIoJmF0dHIsICZpbnB1dCwgc2Vzc2lvbiwgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpbnB1dCk7CkBAIC0xMTY5LDYgKzEyMzIsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIAorICAgICAgICBjYXNlIFNFVF9BVURJT19QT1JUX0NBTExCQUNLX0VOQUJMRUQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGRhdGEucmVhZEludDMyKCkgPT0gMSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKICAgICAgICAgY2FzZSBBQ1FVSVJFX1NPVU5EVFJJR0dFUl9TRVNTSU9OOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4gY2xpZW50ID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4oCkBAIC0xMjIxLDYgKzEyOTAsMjcgQEAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIAorICAgICAgICBjYXNlIFNUQVJUX0FVRElPX1NPVVJDRTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBzb3VyY2U7CisgICAgICAgICAgICBkYXRhLnJlYWQoJnNvdXJjZSwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZykpOworICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXM7CisgICAgICAgICAgICBkYXRhLnJlYWQoJmF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSA9IHt9OworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhcnRBdWRpb1NvdXJjZSgmc291cmNlLCAmYXR0cmlidXRlcywgJmhhbmRsZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaGFuZGxlKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIFNUT1BfQVVESU9fU09VUkNFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlID0gKGF1ZGlvX2lvX2hhbmRsZV90KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wQXVkaW9Tb3VyY2UoaGFuZGxlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpAQCAtMTIyOCw0ICsxMzE4LDQgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcAppbmRleCBlODAyMjc3Li42NWNjN2Q2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcApAQCAtMjksNyArMjksOCBAQAogCiBlbnVtIHsKICAgICBQT1JUX0xJU1RfVVBEQVRFID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKLSAgICBQQVRDSF9MSVNUX1VQREFURQorICAgIFBBVENIX0xJU1RfVVBEQVRFLAorICAgIE1JWF9TVEFURV9VUERBVEUKIH07CiAKIGNsYXNzIEJwQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50IDogcHVibGljIEJwSW50ZXJmYWNlPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+CkBAIC01Myw2ICs1NCwxNSBAQAogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFBBVENIX0xJU1RfVVBEQVRFLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKICAgICB9CisKKyAgICB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChyZWdJZCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0ZSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChNSVhfU1RBVEVfVVBEQVRFLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKKyAgICB9CiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LCAiYW5kcm9pZC5tZWRpYS5JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50Iik7CkBAIC03Myw2ICs4MywxMyBAQAogICAgICAgICAgICAgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOworICAgIGNhc2UgTUlYX1NUQVRFX1VQREFURTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIFN0cmluZzggcmVnSWQgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CisgICAgICAgICAgICBpbnQzMl90IHN0YXRlID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKHJlZ0lkLCBzdGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQogICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpAQCAtODAsNCArOTcsNCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9SZWNvcmQuY3BwIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUmVjb3JkLmNwcAppbmRleCA4YTRhMzgzLi45ZDgwNzUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9SZWNvcmQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1JlY29yZC5jcHAKQEAgLTkxLDQgKzkxLDQgQEAKICAgICB9CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9UcmFjay5jcHAKaW5kZXggZGYyMDlmZC4uNjUxY2I2MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1RyYWNrLmNwcApAQCAtMjkyLDQgKzI5Miw0IEBACiAgICAgfQogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUNyeXB0by5jcHAgYi9tZWRpYS9saWJtZWRpYS9JQ3J5cHRvLmNwcAppbmRleCBmNTFhYWEyLi4yMmY4YWY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JQ3J5cHRvLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JQ3J5cHRvLmNwcApAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTM0LDYgKzM1LDcgQEAKICAgICBSRVFVSVJFU19TRUNVUkVfQ09NUE9ORU5ULAogICAgIERFQ1JZUFQsCiAgICAgTk9USUZZX1JFU09MVVRJT04sCisgICAgU0VUX01FRElBRFJNX1NFU1NJT04sCiB9OwogCiBzdHJ1Y3QgQnBDcnlwdG8gOiBwdWJsaWMgQnBJbnRlcmZhY2U8SUNyeXB0bz4gewpAQCAtOTcsNyArOTksNyBAQAogICAgICAgICAgICAgY29uc3QgdWludDhfdCBrZXlbMTZdLAogICAgICAgICAgICAgY29uc3QgdWludDhfdCBpdlsxNl0sCiAgICAgICAgICAgICBDcnlwdG9QbHVnaW46Ok1vZGUgbW9kZSwKLSAgICAgICAgICAgIGNvbnN0IHZvaWQgKnNyY1B0ciwKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZzaGFyZWRCdWZmZXIsIHNpemVfdCBvZmZzZXQsCiAgICAgICAgICAgICBjb25zdCBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSAqc3ViU2FtcGxlcywgc2l6ZV90IG51bVN1YlNhbXBsZXMsCiAgICAgICAgICAgICB2b2lkICpkc3RQdHIsCiAgICAgICAgICAgICBBU3RyaW5nICplcnJvckRldGFpbE1zZykgewpAQCAtMTI2LDcgKzEyOCw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBkYXRhLndyaXRlSW50MzIodG90YWxTaXplKTsKLSAgICAgICAgZGF0YS53cml0ZShzcmNQdHIsIHRvdGFsU2l6ZSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoc2hhcmVkQnVmZmVyKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihvZmZzZXQpOwogCiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihudW1TdWJTYW1wbGVzKTsKICAgICAgICAgZGF0YS53cml0ZShzdWJTYW1wbGVzLCBzaXplb2YoQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUpICogbnVtU3ViU2FtcGxlcyk7CkBAIC0xMzksNyArMTQyLDcgQEAKIAogICAgICAgICBzc2l6ZV90IHJlc3VsdCA9IHJlcGx5LnJlYWRJbnQzMigpOwogCi0gICAgICAgIGlmIChyZXN1bHQgPj0gRVJST1JfRFJNX1ZFTkRPUl9NSU4gJiYgcmVzdWx0IDw9IEVSUk9SX0RSTV9WRU5ET1JfTUFYKSB7CisgICAgICAgIGlmIChpc0NyeXB0b0Vycm9yKHJlc3VsdCkpIHsKICAgICAgICAgICAgIGVycm9yRGV0YWlsTXNnLT5zZXRUbyhyZXBseS5yZWFkQ1N0cmluZygpKTsKICAgICAgICAgfQogCkBAIC0xNTksNyArMTYyLDI4IEBACiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChOT1RJRllfUkVTT0xVVElPTiwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhRHJtU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZCkgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ3J5cHRvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHdyaXRlVmVjdG9yKGRhdGEsIHNlc3Npb25JZCk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfTUVESUFEUk1fU0VTU0lPTiwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCiBwcml2YXRlOgorICAgIHZvaWQgcmVhZFZlY3RvcihQYXJjZWwgJnJlcGx5LCBWZWN0b3I8dWludDhfdD4gJnZlY3RvcikgY29uc3QgeworICAgICAgICB1aW50MzJfdCBzaXplID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHZlY3Rvci5pbnNlcnRBdCgoc2l6ZV90KTAsIHNpemUpOworICAgICAgICByZXBseS5yZWFkKHZlY3Rvci5lZGl0QXJyYXkoKSwgc2l6ZSk7CisgICAgfQorCisgICAgdm9pZCB3cml0ZVZlY3RvcihQYXJjZWwgJmRhdGEsIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmdmVjdG9yKSBjb25zdCB7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMih2ZWN0b3Iuc2l6ZSgpKTsKKyAgICAgICAgZGF0YS53cml0ZSh2ZWN0b3IuYXJyYXkoKSwgdmVjdG9yLnNpemUoKSk7CisgICAgfQorCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQnBDcnlwdG8pOwogfTsKIApAQCAtMTY3LDYgKzE5MSwxNyBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCit2b2lkIEJuQ3J5cHRvOjpyZWFkVmVjdG9yKGNvbnN0IFBhcmNlbCAmZGF0YSwgVmVjdG9yPHVpbnQ4X3Q+ICZ2ZWN0b3IpIGNvbnN0IHsKKyAgICB1aW50MzJfdCBzaXplID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICB2ZWN0b3IuaW5zZXJ0QXQoKHNpemVfdCkwLCBzaXplKTsKKyAgICBkYXRhLnJlYWQodmVjdG9yLmVkaXRBcnJheSgpLCBzaXplKTsKK30KKwordm9pZCBCbkNyeXB0bzo6d3JpdGVWZWN0b3IoUGFyY2VsICpyZXBseSwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZ2ZWN0b3IpIGNvbnN0IHsKKyAgICByZXBseS0+d3JpdGVJbnQzMih2ZWN0b3Iuc2l6ZSgpKTsKKyAgICByZXBseS0+d3JpdGUodmVjdG9yLmFycmF5KCksIHZlY3Rvci5zaXplKCkpOworfQorCiBzdGF0dXNfdCBCbkNyeXB0bzo6b25UcmFuc2FjdCgKICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwgJmRhdGEsIFBhcmNlbCAqcmVwbHksIHVpbnQzMl90IGZsYWdzKSB7CiAgICAgc3dpdGNoIChjb2RlKSB7CkBAIC0yNDUsOSArMjgwLDkgQEAKICAgICAgICAgICAgIGRhdGEucmVhZChpdiwgc2l6ZW9mKGl2KSk7CiAKICAgICAgICAgICAgIHNpemVfdCB0b3RhbFNpemUgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdm9pZCAqc3JjRGF0YSA9IG1hbGxvYyh0b3RhbFNpemUpOwotICAgICAgICAgICAgbWVtc2V0KHNyY0RhdGEsIDAsIHRvdGFsU2l6ZSk7Ci0gICAgICAgICAgICBkYXRhLnJlYWQoc3JjRGF0YSwgdG90YWxTaXplKTsKKyAgICAgICAgICAgIHNwPElNZW1vcnk+IHNoYXJlZEJ1ZmZlciA9CisgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQgPSBkYXRhLnJlYWRJbnQzMigpOwogCiAgICAgICAgICAgICBpbnQzMl90IG51bVN1YlNhbXBsZXMgPSBkYXRhLnJlYWRJbnQzMigpOwogCkBAIC0yNjIsOCArMjk3LDcgQEAKICAgICAgICAgICAgIGlmIChzZWN1cmUpIHsKICAgICAgICAgICAgICAgICBzZWN1cmVCdWZmZXJJZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KGRhdGEucmVhZEludDY0KCkpKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZHN0UHRyID0gbWFsbG9jKHRvdGFsU2l6ZSk7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KGRzdFB0ciwgMCwgdG90YWxTaXplKTsKKyAgICAgICAgICAgICAgICBkc3RQdHIgPSBjYWxsb2MoMSwgdG90YWxTaXplKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQVN0cmluZyBlcnJvckRldGFpbE1zZzsKQEAgLTI4NywxMyArMzIxLDE3IEBACiAKICAgICAgICAgICAgIGlmIChvdmVyZmxvdyB8fCBzdW1TdWJzYW1wbGVTaXplcyAhPSB0b3RhbFNpemUpIHsKICAgICAgICAgICAgICAgICByZXN1bHQgPSAtRUlOVkFMOworICAgICAgICAgICAgfSBlbHNlIGlmICh0b3RhbFNpemUgPiBzaGFyZWRCdWZmZXItPnNpemUoKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IC1FSU5WQUw7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChzaXplX3Qpb2Zmc2V0ID4gc2hhcmVkQnVmZmVyLT5zaXplKCkgLSB0b3RhbFNpemUpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAtRUlOVkFMOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICByZXN1bHQgPSBkZWNyeXB0KAogICAgICAgICAgICAgICAgICAgICBzZWN1cmUsCiAgICAgICAgICAgICAgICAgICAgIGtleSwKICAgICAgICAgICAgICAgICAgICAgaXYsCiAgICAgICAgICAgICAgICAgICAgIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgIHNyY0RhdGEsCisgICAgICAgICAgICAgICAgICAgIHNoYXJlZEJ1ZmZlciwgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLCBudW1TdWJTYW1wbGVzLAogICAgICAgICAgICAgICAgICAgICBzZWN1cmUgPyBzZWN1cmVCdWZmZXJJZCA6IGRzdFB0ciwKICAgICAgICAgICAgICAgICAgICAgJmVycm9yRGV0YWlsTXNnKTsKQEAgLTMwMSw4ICszMzksNyBAQAogCiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwogCi0gICAgICAgICAgICBpZiAocmVzdWx0ID49IEVSUk9SX0RSTV9WRU5ET1JfTUlOCi0gICAgICAgICAgICAgICAgJiYgcmVzdWx0IDw9IEVSUk9SX0RSTV9WRU5ET1JfTUFYKSB7CisgICAgICAgICAgICBpZiAoaXNDcnlwdG9FcnJvcihyZXN1bHQpKSB7CiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlQ1N0cmluZyhlcnJvckRldGFpbE1zZy5jX3N0cigpKTsKICAgICAgICAgICAgIH0KIApAQCAtMzE4LDkgKzM1NSw2IEBACiAgICAgICAgICAgICBkZWxldGVbXSBzdWJTYW1wbGVzOwogICAgICAgICAgICAgc3ViU2FtcGxlcyA9IE5VTEw7CiAKLSAgICAgICAgICAgIGZyZWUoc3JjRGF0YSk7Ci0gICAgICAgICAgICBzcmNEYXRhID0gTlVMTDsKLQogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAKQEAgLTMzNSw2ICszNjksMTUgQEAKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgU0VUX01FRElBRFJNX1NFU1NJT046CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkOworICAgICAgICAgICAgcmVhZFZlY3RvcihkYXRhLCBzZXNzaW9uSWQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0TWVkaWFEcm1TZXNzaW9uKHNlc3Npb25JZCkpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSURhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSURhdGFTb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZDFkNjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9JRGF0YVNvdXJjZS5jcHAKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiSURhdGFTb3VyY2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9JRGF0YVNvdXJjZS5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHsKKyAgICBHRVRfSU1FTU9SWSA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgICAgUkVBRF9BVCwKKyAgICBHRVRfU0laRSwKKyAgICBDTE9TRSwKK307CisKK3N0cnVjdCBCcERhdGFTb3VyY2UgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SURhdGFTb3VyY2U+IHsKKyAgICBCcERhdGFTb3VyY2UoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpIDogQnBJbnRlcmZhY2U8SURhdGFTb3VyY2U+KGltcGwpIHt9CisKKyAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldElNZW1vcnkoKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEYXRhU291cmNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0lNRU1PUlksIGRhdGEsICZyZXBseSk7CisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKTsKKyAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElNZW1vcnk+KGJpbmRlcik7CisgICAgfQorCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURhdGFTb3VyY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQ2NChvZmZzZXQpOworICAgICAgICBkYXRhLndyaXRlSW50NjQoc2l6ZSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUFEX0FULCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDY0KCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QqIHNpemUpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURhdGFTb3VyY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfU0laRSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICpzaXplID0gcmVwbHkucmVhZEludDY0KCk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGNsb3NlKCkgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRGF0YVNvdXJjZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENMT1NFLCBkYXRhLCAmcmVwbHkpOworICAgIH0KK307CisKK0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShEYXRhU291cmNlLCAiYW5kcm9pZC5tZWRpYS5JRGF0YVNvdXJjZSIpOworCitzdGF0dXNfdCBCbkRhdGFTb3VyY2U6Om9uVHJhbnNhY3QoCisgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykgeworICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICBjYXNlIEdFVF9JTUVNT1JZOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURhdGFTb3VyY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihnZXRJTWVtb3J5KCkpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBSRUFEX0FUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURhdGFTb3VyY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0ID0gKG9mZjY0X3QpIGRhdGEucmVhZEludDY0KCk7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IChzaXplX3QpIGRhdGEucmVhZEludDY0KCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NChyZWFkQXQob2Zmc2V0LCBzaXplKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgR0VUX1NJWkU6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRGF0YVNvdXJjZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgb2ZmNjRfdCBzaXplOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZ2V0U2l6ZSgmc2l6ZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnIpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQoc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgQ0xPU0U6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRGF0YVNvdXJjZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSURybS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JRHJtLmNwcAppbmRleCBiMDhmYTgyLi43YzcwOWNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JRHJtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JRHJtLmNwcApAQCAtNjcsNyArNjcsMTAgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0IHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KElOSVRfQ0hFQ0ssIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChJTklUX0NIRUNLLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KQEAgLTc3LDcgKzgwLDExIEBACiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlKHV1aWQsIDE2KTsKICAgICAgICAgZGF0YS53cml0ZVN0cmluZzgobWltZVR5cGUpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoSVNfQ1JZUFRPX1NVUFBPUlRFRCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KElTX0NSWVBUT19TVVBQT1JURUQsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZDogYmluZGVyIGNhbGwgZmFpbGVkOiAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCkgIT0gMDsKICAgICB9CkBAIC04Nyw3ICs5NCwxMCBAQAogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZSh1dWlkLCAxNik7CiAKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENSRUFURV9QTFVHSU4sIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChDUkVBVEVfUExVR0lOLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KQEAgLTk1LDcgKzEwNSwxMCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVzdHJveVBsdWdpbigpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KERFU1RST1lfUExVR0lOLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoREVTVFJPWV9QTFVHSU4sIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQpAQCAtMTA0LDcgKzExNywxMCBAQAogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogCi0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX1NFU1NJT04sIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX1NFU1NJT04sIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KICAgICAgICAgcmVhZFZlY3RvcihyZXBseSwgc2Vzc2lvbklkKTsKIAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CkBAIC0xMTUsNyArMTMxLDEwIEBACiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogCiAgICAgICAgIHdyaXRlVmVjdG9yKGRhdGEsIHNlc3Npb25JZCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChDTE9TRV9TRVNTSU9OLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQ0xPU0VfU0VTU0lPTiwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CkBAIC0xMjUsNyArMTQ0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmluaXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJm1pbWVUeXBlLCBEcm1QbHVnaW46OktleVR5cGUga2V5VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBjb25zdCAmb3B0aW9uYWxQYXJhbWV0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmcmVxdWVzdCwgU3RyaW5nOCAmZGVmYXVsdFVybCkgeworICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmcmVxdWVzdCwgU3RyaW5nOCAmZGVmYXVsdFVybCwKKyAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlICprZXlSZXF1ZXN0VHlwZSkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogCkBAIC0xMzksMTAgKzE1OSwxNSBAQAogICAgICAgICAgICAgZGF0YS53cml0ZVN0cmluZzgob3B0aW9uYWxQYXJhbWV0ZXJzLmtleUF0KGkpKTsKICAgICAgICAgICAgIGRhdGEud3JpdGVTdHJpbmc4KG9wdGlvbmFsUGFyYW1ldGVycy52YWx1ZUF0KGkpKTsKICAgICAgICAgfQotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0tFWV9SRVFVRVNULCBkYXRhLCAmcmVwbHkpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfS0VZX1JFUVVFU1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KIAogICAgICAgICByZWFkVmVjdG9yKHJlcGx5LCByZXF1ZXN0KTsKICAgICAgICAgZGVmYXVsdFVybCA9IHJlcGx5LnJlYWRTdHJpbmc4KCk7CisgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IHN0YXRpY19jYXN0PERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGU+KHJlcGx5LnJlYWRJbnQzMigpKTsKIAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQpAQCAtMTU0LDcgKzE3OSwxMiBAQAogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgd3JpdGVWZWN0b3IoZGF0YSwgc2Vzc2lvbklkKTsKICAgICAgICAgd3JpdGVWZWN0b3IoZGF0YSwgcmVzcG9uc2UpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUFJPVklERV9LRVlfUkVTUE9OU0UsIGRhdGEsICZyZXBseSk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFBST1ZJREVfS0VZX1JFU1BPTlNFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisKICAgICAgICAgcmVhZFZlY3RvcihyZXBseSwga2V5U2V0SWQpOwogCiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKQEAgLTE2NSw3ICsxOTUsMTAgQEAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAKICAgICAgICAgd3JpdGVWZWN0b3IoZGF0YSwga2V5U2V0SWQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVNT1ZFX0tFWVMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfS0VZUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CkBAIC0xNzcsNyArMjEwLDEwIEBACiAKICAgICAgICAgd3JpdGVWZWN0b3IoZGF0YSwgc2Vzc2lvbklkKTsKICAgICAgICAgd3JpdGVWZWN0b3IoZGF0YSwga2V5U2V0SWQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVTVE9SRV9LRVlTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVTVE9SRV9LRVlTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KQEAgLTE4OCw3ICsyMjQsMTAgQEAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAKICAgICAgICAgd3JpdGVWZWN0b3IoZGF0YSwgc2Vzc2lvbklkKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFFVRVJZX0tFWV9TVEFUVVMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChRVUVSWV9LRVlfU1RBVFVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CiAKICAgICAgICAgaW5mb01hcC5jbGVhcigpOwogICAgICAgICBzaXplX3QgY291bnQgPSByZXBseS5yZWFkSW50MzIoKTsKQEAgLTIwOSw3ICsyNDgsMTAgQEAKIAogICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChjZXJ0VHlwZSk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJpbmc4KGNlcnRBdXRob3JpdHkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1BST1ZJU0lPTl9SRVFVRVNULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1BST1ZJU0lPTl9SRVFVRVNULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CiAKICAgICAgICAgcmVhZFZlY3RvcihyZXBseSwgcmVxdWVzdCk7CiAgICAgICAgIGRlZmF1bHRVcmwgPSByZXBseS5yZWFkU3RyaW5nOCgpOwpAQCAtMjI0LDcgKzI2NiwxMCBAQAogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKIAogICAgICAgICB3cml0ZVZlY3RvcihkYXRhLCByZXNwb25zZSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChQUk9WSURFX1BST1ZJU0lPTl9SRVNQT05TRSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFBST1ZJREVfUFJPVklTSU9OX1JFU1BPTlNFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CiAKICAgICAgICAgcmVhZFZlY3RvcihyZXBseSwgY2VydGlmaWNhdGUpOwogICAgICAgICByZWFkVmVjdG9yKHJlcGx5LCB3cmFwcGVkS2V5KTsKQEAgLTIzNiw3ICsyODEsMTAgQEAKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKIAotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoVU5QUk9WSVNJT05fREVWSUNFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoVU5QUk9WSVNJT05fREVWSUNFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KQEAgLTI0NSw3ICsyOTMsMTAgQEAKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKIAotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1NFQ1VSRV9TVE9QUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9TRUNVUkVfU1RPUFMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KIAogICAgICAgICBzZWN1cmVTdG9wcy5jbGVhcigpOwogICAgICAgICB1aW50MzJfdCBjb3VudCA9IHJlcGx5LnJlYWRJbnQzMigpOwpAQCAtMjYyLDcgKzMxMywxMCBAQAogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKIAogICAgICAgICB3cml0ZVZlY3RvcihkYXRhLCBzc2lkKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9TRUNVUkVfU1RPUCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9TRUNVUkVfU1RPUCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQogCiAgICAgICAgIHJlYWRWZWN0b3IocmVwbHksIHNlY3VyZVN0b3ApOwogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CkBAIC0yNzMsNyArMzI3LDEwIEBACiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogCiAgICAgICAgIHdyaXRlVmVjdG9yKGRhdGEsIHNzUmVsZWFzZSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUxFQVNFX1NFQ1VSRV9TVE9QUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFTEVBU0VfU0VDVVJFX1NUT1BTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KQEAgLTI4Miw3ICszMzksMTAgQEAKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKIAotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9BTExfU0VDVVJFX1NUT1BTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9BTExfU0VDVVJFX1NUT1BTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KQEAgLTI5Miw3ICszNTIsMTAgQEAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAKICAgICAgICAgZGF0YS53cml0ZVN0cmluZzgobmFtZSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfUFJPUEVSVFlfU1RSSU5HLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1BST1BFUlRZX1NUUklORywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQogCiAgICAgICAgIHZhbHVlID0gcmVwbHkucmVhZFN0cmluZzgoKTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwpAQCAtMzAzLDcgKzM2NiwxMCBAQAogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKIAogICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChuYW1lKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9QUk9QRVJUWV9CWVRFX0FSUkFZLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1BST1BFUlRZX0JZVEVfQVJSQVksIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KIAogICAgICAgICByZWFkVmVjdG9yKHJlcGx5LCB2YWx1ZSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKQEAgLTMxNSw3ICszODEsMTAgQEAKIAogICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChuYW1lKTsKICAgICAgICAgZGF0YS53cml0ZVN0cmluZzgodmFsdWUpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1BST1BFUlRZX1NUUklORywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9QUk9QRVJUWV9TVFJJTkcsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQpAQCAtMzI3LDcgKzM5NiwxMCBAQAogCiAgICAgICAgIGRhdGEud3JpdGVTdHJpbmc4KG5hbWUpOwogICAgICAgICB3cml0ZVZlY3RvcihkYXRhLCB2YWx1ZSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfUFJPUEVSVFlfQllURV9BUlJBWSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9QUk9QRVJUWV9CWVRFX0FSUkFZLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KQEAgLTM0MCw3ICs0MTIsMTAgQEAKIAogICAgICAgICB3cml0ZVZlY3RvcihkYXRhLCBzZXNzaW9uSWQpOwogICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChhbGdvcml0aG0pOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0NJUEhFUl9BTEdPUklUSE0sIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQ0lQSEVSX0FMR09SSVRITSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCkBAIC0zNTEsNyArNDI2LDEwIEBACiAKICAgICAgICAgd3JpdGVWZWN0b3IoZGF0YSwgc2Vzc2lvbklkKTsKICAgICAgICAgZGF0YS53cml0ZVN0cmluZzgoYWxnb3JpdGhtKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9NQUNfQUxHT1JJVEhNLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX01BQ19BTEdPUklUSE0sIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIApAQCAtMzY4LDcgKzQ0NiwxMCBAQAogICAgICAgICB3cml0ZVZlY3RvcihkYXRhLCBpbnB1dCk7CiAgICAgICAgIHdyaXRlVmVjdG9yKGRhdGEsIGl2KTsKIAotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoRU5DUllQVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEVOQ1JZUFQsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KICAgICAgICAgcmVhZFZlY3RvcihyZXBseSwgb3V0cHV0KTsKIAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CkBAIC0zODcsNyArNDY4LDEwIEBACiAgICAgICAgIHdyaXRlVmVjdG9yKGRhdGEsIGlucHV0KTsKICAgICAgICAgd3JpdGVWZWN0b3IoZGF0YSwgaXYpOwogCi0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChERUNSWVBULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoREVDUllQVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQogICAgICAgICByZWFkVmVjdG9yKHJlcGx5LCBvdXRwdXQpOwogCiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKQEAgLTQwNCw3ICs0ODgsMTAgQEAKICAgICAgICAgd3JpdGVWZWN0b3IoZGF0YSwga2V5SWQpOwogICAgICAgICB3cml0ZVZlY3RvcihkYXRhLCBtZXNzYWdlKTsKIAotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0lHTiwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNJR04sIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KICAgICAgICAgcmVhZFZlY3RvcihyZXBseSwgc2lnbmF0dXJlKTsKIAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CkBAIC00MjMsNyArNTEwLDEwIEBACiAgICAgICAgIHdyaXRlVmVjdG9yKGRhdGEsIG1lc3NhZ2UpOwogICAgICAgICB3cml0ZVZlY3RvcihkYXRhLCBzaWduYXR1cmUpOwogCi0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChWRVJJRlksIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChWRVJJRlksIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KICAgICAgICAgbWF0Y2ggPSAoYm9vbClyZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KQEAgLTQ0MSw3ICs1MzEsMTAgQEAKICAgICAgICAgd3JpdGVWZWN0b3IoZGF0YSwgbWVzc2FnZSk7CiAgICAgICAgIHdyaXRlVmVjdG9yKGRhdGEsIHdyYXBwZWRLZXkpOwogCi0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTSUdOX1JTQSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNJR05fUlNBLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CiAgICAgICAgIHJlYWRWZWN0b3IocmVwbHksIHNpZ25hdHVyZSk7CiAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwpAQCAtNDUxLDcgKzU0NCwxMCBAQAogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfTElTVEVORVIsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfTElTVEVORVIsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIApAQCAtNTYyLDEzICs2NTgsMTUgQEAKIAogICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IHJlcXVlc3Q7CiAgICAgICAgICAgICBTdHJpbmc4IGRlZmF1bHRVcmw7CisgICAgICAgICAgICBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlIGtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfVW5rbm93bjsKIAotICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0S2V5UmVxdWVzdChzZXNzaW9uSWQsIGluaXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZSwga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxQYXJhbWV0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LCBkZWZhdWx0VXJsKTsKKyAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGdldEtleVJlcXVlc3Qoc2Vzc2lvbklkLCBpbml0RGF0YSwgbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgIGtleVR5cGUsIG9wdGlvbmFsUGFyYW1ldGVycywgcmVxdWVzdCwgZGVmYXVsdFVybCwKKyAgICAgICAgICAgICAgICAgICAgJmtleVJlcXVlc3RUeXBlKTsKKwogICAgICAgICAgICAgd3JpdGVWZWN0b3IocmVwbHksIHJlcXVlc3QpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nOChkZWZhdWx0VXJsKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KGtleVJlcXVlc3RUeXBlKSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JRHJtQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhL0lEcm1DbGllbnQuY3BwCmluZGV4IGY1MDcxNWUuLjQ5MGM2ZWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lEcm1DbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lEcm1DbGllbnQuY3BwCkBAIC03OCw0ICs3OCw0IEBACiAgICAgfQogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUVmZmVjdC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JRWZmZWN0LmNwcAppbmRleCAyZjZhOTFlLi5mYWY1Nzk1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JRWZmZWN0LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JRWZmZWN0LmNwcApAQCAtMjE0LDQgKzIxNCw0IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lFZmZlY3RDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWEvSUVmZmVjdENsaWVudC5jcHAKaW5kZXggYWVmNDM3MS4uMTMyMmU3MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUVmZmVjdENsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUVmZmVjdENsaWVudC5jcHAKQEAgLTE0MSw0ICsxNDEsNCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JSERDUC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JSERDUC5jcHAKaW5kZXggNzk5NDRlZS4uZjNhODkwMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUhEQ1AuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lIRENQLmNwcApAQCAtMjg0LDExICsyODQsMTcgQEAKICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtQ1RSID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHZvaWQgKm91dERhdGEgPSBtYWxsb2Moc2l6ZSk7CisgICAgICAgICAgICB2b2lkICpvdXREYXRhID0gTlVMTDsKICAgICAgICAgICAgIHVpbnQ2NF90IGlucHV0Q1RSOwogCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBlbmNyeXB0TmF0aXZlKGdyYXBoaWNCdWZmZXIsIG9mZnNldCwgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtQ1RSLCAmaW5wdXRDVFIsIG91dERhdGEpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gRVJST1JfT1VUX09GX1JBTkdFOworCisgICAgICAgICAgICBvdXREYXRhID0gbWFsbG9jKHNpemUpOworCisgICAgICAgICAgICBpZiAob3V0RGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZXJyID0gZW5jcnlwdE5hdGl2ZShncmFwaGljQnVmZmVyLCBvZmZzZXQsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1DVFIsICZpbnB1dENUUiwgb3V0RGF0YSk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUNvZGVjTGlzdC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFDb2RlY0xpc3QuY3BwCmluZGV4IGJmN2M1Y2EuLmUyZGYxMDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUNvZGVjTGlzdC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhQ29kZWNMaXN0LmNwcApAQCAtMzAsNiArMzAsNyBAQAogICAgIENSRUFURSA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCiAgICAgQ09VTlRfQ09ERUNTLAogICAgIEdFVF9DT0RFQ19JTkZPLAorICAgIEdFVF9HTE9CQUxfU0VUVElOR1MsCiAgICAgRklORF9DT0RFQ19CWV9UWVBFLAogICAgIEZJTkRfQ09ERUNfQllfTkFNRSwKIH07CkBAIC02NCw2ICs2NSwxOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgdmlydHVhbCBjb25zdCBzcDxBTWVzc2FnZT4gZ2V0R2xvYmFsU2V0dGluZ3MoKSBjb25zdAorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhQ29kZWNMaXN0OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0dMT0JBTF9TRVRUSU5HUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBBTWVzc2FnZTo6RnJvbVBhcmNlbChyZXBseSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHZpcnR1YWwgc3NpemVfdCBmaW5kQ29kZWNCeVR5cGUoCiAgICAgICAgICAgICBjb25zdCBjaGFyICp0eXBlLCBib29sIGVuY29kZXIsIHNpemVfdCBzdGFydEluZGV4ID0gMCkgY29uc3QKICAgICB7CkBAIC0xMjUsNiArMTM5LDIwIEBACiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgY2FzZSBHRVRfR0xPQkFMX1NFVFRJTkdTOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhQ29kZWNMaXN0LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gaW5mbyA9IGdldEdsb2JhbFNldHRpbmdzKCk7CisgICAgICAgICAgICBpZiAoaW5mbyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoT0spOworICAgICAgICAgICAgICAgIGluZm8tPndyaXRlVG9QYXJjZWwocmVwbHkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigtRVJBTkdFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKwogICAgICAgICBjYXNlIEZJTkRfQ09ERUNfQllfVFlQRToKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYUNvZGVjTGlzdCwgZGF0YSwgcmVwbHkpOwpAQCAtMTYwLDQgKzE4OCw0IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYURlYXRoTm90aWZpZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRGVhdGhOb3RpZmllci5jcHAKaW5kZXggMzhlOWNhMC4uZDQzNjBlYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhRGVhdGhOb3RpZmllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRGVhdGhOb3RpZmllci5jcHAKQEAgLTEwOCw0ICsxMDgsNCBAQAogICAgIH0KIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmNwcAppbmRleCBhNWEzNzE0Li4wZGRhMGJlOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmNwcApAQCAtNzAsNyArNzAsNyBAQAogICAgICAgICBpbnQzMl90IGV4Y2VwdGlvbkNvZGUgPSByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOwogCiAgICAgICAgIGlmIChleGNlcHRpb25Db2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKTsKQEAgLTEwNyw3ICsxMDcsMTQgQEAKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICB9CiAKLSAgICAgICAgc2l6ZV90IGxlbiA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpbnQzMl90IGxlbk9yRXJyb3JDb2RlID0gcmVwbHkucmVhZEludDMyKCk7CisKKyAgICAgICAgLy8gTmVnYXRpdmUgdmFsdWVzIGFyZSBlcnJvciBjb2RlcworICAgICAgICBpZiAobGVuT3JFcnJvckNvZGUgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gbGVuT3JFcnJvckNvZGU7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgbGVuID0gbGVuT3JFcnJvckNvZGU7CiAKICAgICAgICAgaWYgKGxlbiA+IHNpemUpIHsKICAgICAgICAgICAgIEFMT0dFKCJyZXF1ZXN0ZWQgJXp1LCBnb3QgJXp1Iiwgc2l6ZSwgbGVuKTsKQEAgLTE4Niw1ICsxOTMsNCBAQAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKAogICAgICAgICBNZWRpYUhUVFBDb25uZWN0aW9uLCAiYW5kcm9pZC5tZWRpYS5JTWVkaWFIVFRQQ29ubmVjdGlvbiIpOwogCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5jcHAKaW5kZXggMTI2MDU4Mi4uMGMxNmEyYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmNwcApAQCAtNDQsNiArNDQsNyBAQAogICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIG1ha2UgSFRUUCBjb25uZWN0aW9uIChlcnIgPSAlZCkiLCBlcnIpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIApAQCAtNTQsNSArNTUsNCBAQAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKAogICAgICAgICBNZWRpYUhUVFBTZXJ2aWNlLCAiYW5kcm9pZC5tZWRpYS5JTWVkaWFIVFRQU2VydmljZSIpOwogCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFMb2dTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUxvZ1NlcnZpY2UuY3BwCmluZGV4IGE0YWY3YjcuLjE1MzYzMzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUxvZ1NlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUxvZ1NlcnZpY2UuY3BwCkBAIC00NSw3ICs0NSw3IEBACiAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoc2hhcmVkKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQ2NCgoaW50NjRfdCkgc2l6ZSk7CiAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKG5hbWUpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVHSVNURVJfV1JJVEVSLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgX191bnVzZWQgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVHSVNURVJfV1JJVEVSLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICAvLyBGSVhNRSBpZ25vcmVzIHN0YXR1cwogICAgIH0KIApAQCAtNTMsNyArNTMsNyBAQAogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFMb2dTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKHNoYXJlZCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoVU5SRUdJU1RFUl9XUklURVIsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyBfX3VudXNlZCA9IHJlbW90ZSgpLT50cmFuc2FjdChVTlJFR0lTVEVSX1dSSVRFUiwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgLy8gRklYTUUgaWdub3JlcyBzdGF0dXMKICAgICB9CiAKQEAgLTkxLDQgKzkxLDQgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCmluZGV4IGFhMjY2NWEuLjk3NjVmMGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9JRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CkBAIC02NSw2ICs2Niw3IEBACiAgICAgRElTQ09OTkVDVCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCiAgICAgU0VUX0RBVEFfU09VUkNFX1VSTCwKICAgICBTRVRfREFUQV9TT1VSQ0VfRkQsCisgICAgU0VUX0RBVEFfU09VUkNFX0NBTExCQUNLLAogICAgIEdFVF9GUkFNRV9BVF9USU1FLAogICAgIEVYVFJBQ1RfQUxCVU1fQVJULAogICAgIEVYVFJBQ1RfTUVUQURBVEEsCkBAIC0xMjUsNiArMTI3LDE1IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IHNwPElEYXRhU291cmNlPiYgc291cmNlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoc291cmNlKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfREFUQV9TT1VSQ0VfQ0FMTEJBQ0ssIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKICAgICBzcDxJTWVtb3J5PiBnZXRGcmFtZUF0VGltZShpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbikKICAgICB7CiAgICAgICAgIEFMT0dWKCJnZXRUaW1lQXRUaW1lOiB0aW1lKCUiIFBSSWQ2NCAiIHVzKSBhbmQgb3B0aW9uKCVkKSIsIHRpbWVVcywgb3B0aW9uKTsKQEAgLTIzNSw2ICsyNDYsMTMgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldERhdGFTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgU0VUX0RBVEFfU09VUkNFX0NBTExCQUNLOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNwPElEYXRhU291cmNlPiBzb3VyY2UgPQorICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElEYXRhU291cmNlPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXREYXRhU291cmNlKHNvdXJjZSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEdFVF9GUkFNRV9BVF9USU1FOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGludDY0X3QgdGltZVVzID0gZGF0YS5yZWFkSW50NjQoKTsKQEAgLTI5Nyw0ICszMTUsNCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAppbmRleCBjMWI5MDI1Li45NDJhZWMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKQEAgLTIxLDYgKzIxLDEwIEBACiAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgorI2luY2x1ZGUgPG1lZGlhL0FWU3luY1NldHRpbmdzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9JRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSVN0cmVhbVNvdXJjZS5oPgpAQCAtMzUsMTAgKzM5LDE1IEBACiAgICAgU0VUX0RBVEFfU09VUkNFX1VSTCwKICAgICBTRVRfREFUQV9TT1VSQ0VfRkQsCiAgICAgU0VUX0RBVEFfU09VUkNFX1NUUkVBTSwKKyAgICBTRVRfREFUQV9TT1VSQ0VfQ0FMTEJBQ0ssCiAgICAgUFJFUEFSRV9BU1lOQywKICAgICBTVEFSVCwKICAgICBTVE9QLAogICAgIElTX1BMQVlJTkcsCisgICAgU0VUX1BMQVlCQUNLX1NFVFRJTkdTLAorICAgIEdFVF9QTEFZQkFDS19TRVRUSU5HUywKKyAgICBTRVRfU1lOQ19TRVRUSU5HUywKKyAgICBHRVRfU1lOQ19TRVRUSU5HUywKICAgICBQQVVTRSwKICAgICBTRUVLX1RPLAogICAgIEdFVF9DVVJSRU5UX1BPU0lUSU9OLApAQCAtMTIwLDYgKzEyOSwxNCBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCisgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJRGF0YVNvdXJjZT4gJnNvdXJjZSkgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoc291cmNlKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfREFUQV9TT1VSQ0VfQ0FMTEJBQ0ssIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKICAgICAvLyBwYXNzIHRoZSBidWZmZXJlZCBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIHRvIHRoZSBtZWRpYSBwbGF5ZXIgc2VydmljZQogICAgIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZVRleHR1cmUoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJ1ZmZlclByb2R1Y2VyKQogICAgIHsKQEAgLTE2NCw2ICsxODEsNjMgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAorICAgIHN0YXR1c190IHNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUmIHJhdGUpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVGbG9hdChyYXRlLm1TcGVlZCk7CisgICAgICAgIGRhdGEud3JpdGVGbG9hdChyYXRlLm1QaXRjaCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClyYXRlLm1GYWxsYmFja01vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpcmF0ZS5tU3RyZXRjaE1vZGUpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1BMQVlCQUNLX1NFVFRJTkdTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgc3RhdHVzX3QgZ2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSogcmF0ZSAvKiBub25udWxsICovKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1BMQVlCQUNLX1NFVFRJTkdTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgKnJhdGUgPSBBVURJT19QTEFZQkFDS19SQVRFX0RFRkFVTFQ7CisgICAgICAgICAgICByYXRlLT5tU3BlZWQgPSByZXBseS5yZWFkRmxvYXQoKTsKKyAgICAgICAgICAgIHJhdGUtPm1QaXRjaCA9IHJlcGx5LnJlYWRGbG9hdCgpOworICAgICAgICAgICAgcmF0ZS0+bUZhbGxiYWNrTW9kZSA9IChBdWRpb1RpbWVzdHJldGNoRmFsbGJhY2tNb2RlKXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgcmF0ZS0+bVN0cmV0Y2hNb2RlID0gKEF1ZGlvVGltZXN0cmV0Y2hTdHJldGNoTW9kZSlyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHN0YXR1c190IHNldFN5bmNTZXR0aW5ncyhjb25zdCBBVlN5bmNTZXR0aW5ncyYgc3luYywgZmxvYXQgdmlkZW9GcHNIaW50KQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpc3luYy5tU291cmNlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KXN5bmMubUF1ZGlvQWRqdXN0TW9kZSk7CisgICAgICAgIGRhdGEud3JpdGVGbG9hdChzeW5jLm1Ub2xlcmFuY2UpOworICAgICAgICBkYXRhLndyaXRlRmxvYXQodmlkZW9GcHNIaW50KTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9TWU5DX1NFVFRJTkdTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgc3RhdHVzX3QgZ2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzKiBzeW5jIC8qIG5vbm51bGwgKi8sIGZsb2F0KiB2aWRlb0ZwcyAvKiBub25udWxsICovKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1NZTkNfU0VUVElOR1MsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBBVlN5bmNTZXR0aW5ncyBzZXR0aW5nczsKKyAgICAgICAgICAgIHNldHRpbmdzLm1Tb3VyY2UgPSAoQVZTeW5jU291cmNlKXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgc2V0dGluZ3MubUF1ZGlvQWRqdXN0TW9kZSA9IChBVlN5bmNBdWRpb0FkanVzdE1vZGUpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICBzZXR0aW5ncy5tVG9sZXJhbmNlID0gcmVwbHkucmVhZEZsb2F0KCk7CisgICAgICAgICAgICAqc3luYyA9IHNldHRpbmdzOworICAgICAgICAgICAgKnZpZGVvRnBzID0gcmVwbHkucmVhZEZsb2F0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKICAgICBzdGF0dXNfdCBwYXVzZSgpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC0zOTYsNiArNDcwLDEzIEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXREYXRhU291cmNlKHNvdXJjZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CisgICAgICAgIGNhc2UgU0VUX0RBVEFfU09VUkNFX0NBTExCQUNLOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxJRGF0YVNvdXJjZT4gc291cmNlID0KKyAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJRGF0YVNvdXJjZT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0RGF0YVNvdXJjZShzb3VyY2UpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQogICAgICAgICBjYXNlIFNFVF9WSURFT19TVVJGQUNFVEVYVFVSRTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gYnVmZmVyUHJvZHVjZXIgPQpAQCAtNDI2LDYgKzUwNyw1MyBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmV0KTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTRVRfUExBWUJBQ0tfU0VUVElOR1M6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIHJhdGUgPSBBVURJT19QTEFZQkFDS19SQVRFX0RFRkFVTFQ7CisgICAgICAgICAgICByYXRlLm1TcGVlZCA9IGRhdGEucmVhZEZsb2F0KCk7CisgICAgICAgICAgICByYXRlLm1QaXRjaCA9IGRhdGEucmVhZEZsb2F0KCk7CisgICAgICAgICAgICByYXRlLm1GYWxsYmFja01vZGUgPSAoQXVkaW9UaW1lc3RyZXRjaEZhbGxiYWNrTW9kZSlkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgcmF0ZS5tU3RyZXRjaE1vZGUgPSAoQXVkaW9UaW1lc3RyZXRjaFN0cmV0Y2hNb2RlKWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRQbGF5YmFja1NldHRpbmdzKHJhdGUpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBHRVRfUExBWUJBQ0tfU0VUVElOR1M6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIHJhdGUgPSBBVURJT19QTEFZQkFDS19SQVRFX0RFRkFVTFQ7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBnZXRQbGF5YmFja1NldHRpbmdzKCZyYXRlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlRmxvYXQocmF0ZS5tU3BlZWQpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUZsb2F0KHJhdGUubVBpdGNoKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigoaW50MzJfdClyYXRlLm1GYWxsYmFja01vZGUpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KXJhdGUubVN0cmV0Y2hNb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTRVRfU1lOQ19TRVRUSU5HUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgQVZTeW5jU2V0dGluZ3Mgc3luYzsKKyAgICAgICAgICAgIHN5bmMubVNvdXJjZSA9IChBVlN5bmNTb3VyY2UpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHN5bmMubUF1ZGlvQWRqdXN0TW9kZSA9IChBVlN5bmNBdWRpb0FkanVzdE1vZGUpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHN5bmMubVRvbGVyYW5jZSA9IGRhdGEucmVhZEZsb2F0KCk7CisgICAgICAgICAgICBmbG9hdCB2aWRlb0Zwc0hpbnQgPSBkYXRhLnJlYWRGbG9hdCgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0U3luY1NldHRpbmdzKHN5bmMsIHZpZGVvRnBzSGludCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEdFVF9TWU5DX1NFVFRJTkdTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBBVlN5bmNTZXR0aW5ncyBzeW5jOworICAgICAgICAgICAgZmxvYXQgdmlkZW9GcHM7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBnZXRTeW5jU2V0dGluZ3MoJnN5bmMsICZ2aWRlb0Zwcyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnIpOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KXN5bmMubVNvdXJjZSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3Qpc3luYy5tQXVkaW9BZGp1c3RNb2RlKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVGbG9hdChzeW5jLm1Ub2xlcmFuY2UpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUZsb2F0KHZpZGVvRnBzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBQQVVTRTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocGF1c2UoKSk7CkBAIC01NjEsNCArNjg5LDQgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllckNsaWVudC5jcHAKaW5kZXggYTY3MGM5Ni4uZDYwODM4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJDbGllbnQuY3BwCkBAIC03NSw0ICs3NSw0IEBACiAgICAgfQogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAppbmRleCBmZWVhMjY3Li4wNWY4NjcwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcApAQCAtNzgsMTAgKzc4LDExIEBACiAgICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJTWVkaWFQbGF5ZXI+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzcDxJTWVkaWFSZWNvcmRlcj4gY3JlYXRlTWVkaWFSZWNvcmRlcigpCisgICAgdmlydHVhbCBzcDxJTWVkaWFSZWNvcmRlcj4gY3JlYXRlTWVkaWFSZWNvcmRlcihjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihvcFBhY2thZ2VOYW1lKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENSRUFURV9NRURJQV9SRUNPUkRFUiwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElNZWRpYVJlY29yZGVyPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgIH0KQEAgLTEyOCwxMSArMTI5LDEyIEBACiAgICAgICAgIHJldHVybiByZW1vdGUoKS0+dHJhbnNhY3QoUFVMTF9CQVRURVJZX0RBVEEsIGRhdGEsIHJlcGx5KTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHNwPElSZW1vdGVEaXNwbGF5PiBsaXN0ZW5Gb3JSZW1vdGVEaXNwbGF5KGNvbnN0IHNwPElSZW1vdGVEaXNwbGF5Q2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgaWZhY2UpCisgICAgdmlydHVhbCBzcDxJUmVtb3RlRGlzcGxheT4gbGlzdGVuRm9yUmVtb3RlRGlzcGxheShjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPElSZW1vdGVEaXNwbGF5Q2xpZW50PiYgY2xpZW50LCBjb25zdCBTdHJpbmc4JiBpZmFjZSkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihvcFBhY2thZ2VOYW1lKTsKICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihjbGllbnQpKTsKICAgICAgICAgZGF0YS53cml0ZVN0cmluZzgoaWZhY2UpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoTElTVEVOX0ZPUl9SRU1PVEVfRElTUExBWSwgZGF0YSwgJnJlcGx5KTsKQEAgLTE2Niw3ICsxNjgsOCBAQAogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIENSRUFURV9NRURJQV9SRUNPUkRFUjogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNwPElNZWRpYVJlY29yZGVyPiByZWNvcmRlciA9IGNyZWF0ZU1lZGlhUmVjb3JkZXIoKTsKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2IG9wUGFja2FnZU5hbWUgPSBkYXRhLnJlYWRTdHJpbmcxNigpOworICAgICAgICAgICAgc3A8SU1lZGlhUmVjb3JkZXI+IHJlY29yZGVyID0gY3JlYXRlTWVkaWFSZWNvcmRlcihvcFBhY2thZ2VOYW1lKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihyZWNvcmRlcikpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpAQCAtMjE0LDEwICsyMTcsMTEgQEAKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBMSVNURU5fRk9SX1JFTU9URV9ESVNQTEFZOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyU2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYgb3BQYWNrYWdlTmFtZSA9IGRhdGEucmVhZFN0cmluZzE2KCk7CiAgICAgICAgICAgICBzcDxJUmVtb3RlRGlzcGxheUNsaWVudD4gY2xpZW50KAogICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJUmVtb3RlRGlzcGxheUNsaWVudD4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpKTsKICAgICAgICAgICAgIFN0cmluZzggaWZhY2UoZGF0YS5yZWFkU3RyaW5nOCgpKTsKLSAgICAgICAgICAgIHNwPElSZW1vdGVEaXNwbGF5PiBkaXNwbGF5KGxpc3RlbkZvclJlbW90ZURpc3BsYXkoY2xpZW50LCBpZmFjZSkpOworICAgICAgICAgICAgc3A8SVJlbW90ZURpc3BsYXk+IGRpc3BsYXkobGlzdGVuRm9yUmVtb3RlRGlzcGxheShvcFBhY2thZ2VOYW1lLCBjbGllbnQsIGlmYWNlKSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoZGlzcGxheSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpAQCAtMjM0LDQgKzIzOCw0IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcAppbmRleCBhNzMzYjY4Li5lZTNiNTg0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCkBAIC0zNSw2ICszNSw3IEBACiAgICAgUkVMRUFTRSA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCiAgICAgSU5JVCwKICAgICBDTE9TRSwKKyAgICBTRVRfSU5QVVRfU1VSRkFDRSwKICAgICBRVUVSWV9TVVJGQUNFX01FRElBU09VUkNFLAogICAgIFJFU0VULAogICAgIFNUT1AsCkBAIC00Niw3ICs0Nyw2IEBACiAgICAgU0VUX09VVFBVVF9GT1JNQVQsCiAgICAgU0VUX1ZJREVPX0VOQ09ERVIsCiAgICAgU0VUX0FVRElPX0VOQ09ERVIsCi0gICAgU0VUX09VVFBVVF9GSUxFX1BBVEgsCiAgICAgU0VUX09VVFBVVF9GSUxFX0ZELAogICAgIFNFVF9WSURFT19TSVpFLAogICAgIFNFVF9WSURFT19GUkFNRVJBVEUsCkBAIC03Niw2ICs3NiwxNiBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCisgICAgc3RhdHVzX3Qgc2V0SW5wdXRTdXJmYWNlKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+JiBzdXJmYWNlKQorICAgIHsKKyAgICAgICAgQUxPR1YoInNldElucHV0U3VyZmFjZSglcCkiLCBzdXJmYWNlLmdldCgpKTsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUmVjb3JkZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoc3VyZmFjZSkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0lOUFVUX1NVUkZBQ0UsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBxdWVyeVN1cmZhY2VNZWRpYVNvdXJjZSgpCiAgICAgewogICAgICAgICBBTE9HVigiUXVlcnkgU3VyZmFjZU1lZGlhU291cmNlIik7CkBAIC0xNTgsMTYgKzE2OCw2IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIqIHBhdGgpCi0gICAgewotICAgICAgICBBTE9HVigic2V0T3V0cHV0RmlsZSglcykiLCBwYXRoKTsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUmVjb3JkZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKHBhdGgpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX09VVFBVVF9GSUxFX1BBVEgsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KICAgICBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSB7CiAgICAgICAgIEFMT0dWKCJzZXRPdXRwdXRGaWxlKCVkLCAlIiBQUklkNjQgIiwgJSIgUFJJZDY0ICIpIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtMzAwLDcgKzMwMCw4IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXR1c190IEJuTWVkaWFSZWNvcmRlcjo6b25UcmFuc2FjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncykKIHsKICAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICAgY2FzZSBSRUxFQVNFOiB7CkBAIC0zOTAsMTMgKzM5MSw2IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAKICAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTRVRfT1VUUFVUX0ZJTEVfUEFUSDogewotICAgICAgICAgICAgQUxPR1YoIlNFVF9PVVRQVVRfRklMRV9QQVRIIik7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUmVjb3JkZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhdGggPSBkYXRhLnJlYWRDU3RyaW5nKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRPdXRwdXRGaWxlKHBhdGgpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfT1VUUFVUX0ZJTEVfRkQ6IHsKICAgICAgICAgICAgIEFMT0dWKCJTRVRfT1VUUFVUX0ZJTEVfRkQiKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFSZWNvcmRlciwgZGF0YSwgcmVwbHkpOwpAQCAtNDQ1LDcgKzQzOSw4IEBACiAgICAgICAgIGNhc2UgU0VUX1BSRVZJRVdfU1VSRkFDRTogewogICAgICAgICAgICAgQUxPR1YoIlNFVF9QUkVWSUVXX1NVUkZBQ0UiKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFSZWNvcmRlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gc3VyZmFjZSA9IGludGVyZmFjZV9jYXN0PElHcmFwaGljQnVmZmVyUHJvZHVjZXI+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHN1cmZhY2UgPSBpbnRlcmZhY2VfY2FzdDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPigKKyAgICAgICAgICAgICAgICAgICAgZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0UHJldmlld1N1cmZhY2Uoc3VyZmFjZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpAQCAtNDU4LDYgKzQ1MywxNCBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0Q2FtZXJhKGNhbWVyYSwgcHJveHkpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTRVRfSU5QVVRfU1VSRkFDRTogeworICAgICAgICAgICAgQUxPR1YoIlNFVF9JTlBVVF9TVVJGQUNFIik7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUmVjb3JkZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IHN1cmZhY2UgPSBpbnRlcmZhY2VfY2FzdDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPigKKyAgICAgICAgICAgICAgICAgICAgZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0SW5wdXRTdXJmYWNlKHN1cmZhY2UpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBRVUVSWV9TVVJGQUNFX01FRElBU09VUkNFOiB7CiAgICAgICAgICAgICBBTE9HVigiUVVFUllfU1VSRkFDRV9NRURJQVNPVVJDRSIpOwogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVJlY29yZGVyLCBkYXRhLCByZXBseSk7CkBAIC00NzksNCArNDgyLDQgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXJDbGllbnQuY3BwCmluZGV4IGU3OTA3ZTMuLjY3OTVkMjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKQEAgLTY3LDQgKzY3LDQgQEAKICAgICB9CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JT01YLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwCmluZGV4IDQxYzhhNzUuLmIwODJmZTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwCkBAIC0xOCwxMCArMTgsMTMgQEAKICNkZWZpbmUgTE9HX1RBRyAiSU9NWCIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQxLDYgKzQ0LDggQEAKICAgICBVU0VfQlVGRkVSLAogICAgIFVTRV9HUkFQSElDX0JVRkZFUiwKICAgICBDUkVBVEVfSU5QVVRfU1VSRkFDRSwKKyAgICBDUkVBVEVfUEVSU0lTVEVOVF9JTlBVVF9TVVJGQUNFLAorICAgIFNFVF9JTlBVVF9TVVJGQUNFLAogICAgIFNJR05BTF9FTkRfT0ZfSU5QVVRfU1RSRUFNLAogICAgIFNUT1JFX01FVEFfREFUQV9JTl9CVUZGRVJTLAogICAgIFBSRVBBUkVfRk9SX0FEQVBUSVZFX1BMQVlCQUNLLApAQCAtMjQzLDEyICsyNDgsMTMgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgdXNlQnVmZmVyKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCi0gICAgICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlcikgeworICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIsIE9NWF9VMzIgYWxsb3R0ZWRTaXplKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRfaW5kZXgpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKHBhcmFtcykpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoYWxsb3R0ZWRTaXplKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFVTRV9CVUZGRVIsIGRhdGEsICZyZXBseSk7CiAKICAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVwbHkucmVhZEludDMyKCk7CkBAIC0zMDMsNyArMzA5LDcgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlSW5wdXRTdXJmYWNlKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsCi0gICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqYnVmZmVyUHJvZHVjZXIpIHsKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpidWZmZXJQcm9kdWNlciwgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgc3RhdHVzX3QgZXJyOwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTMxNSw2ICszMjEsMzUgQEAKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KIAorICAgICAgICAvLyByZWFkIHR5cGUgZXZlbiBpZiBjcmVhdGVJbnB1dFN1cmZhY2UgZmFpbGVkCisgICAgICAgIGludCBuZWdvdGlhdGVkVHlwZSA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAodHlwZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAqdHlwZSA9IChNZXRhZGF0YUJ1ZmZlclR5cGUpbmVnb3RpYXRlZFR5cGU7CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgICpidWZmZXJQcm9kdWNlciA9IElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmFzSW50ZXJmYWNlKAorICAgICAgICAgICAgICAgIHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CisKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVBlcnNpc3RlbnRJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqYnVmZmVyUHJvZHVjZXIsCisgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiAqYnVmZmVyQ29uc3VtZXIpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBlcnIgPSByZW1vdGUoKS0+dHJhbnNhY3QoQ1JFQVRFX1BFUlNJU1RFTlRfSU5QVVRfU1VSRkFDRSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coImJpbmRlciB0cmFuc2FjdGlvbiBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKwogICAgICAgICBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTMyMiwxMCArMzU3LDM4IEBACiAKICAgICAgICAgKmJ1ZmZlclByb2R1Y2VyID0gSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6YXNJbnRlcmZhY2UoCiAgICAgICAgICAgICAgICAgcmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgKmJ1ZmZlckNvbnN1bWVyID0gSUdyYXBoaWNCdWZmZXJDb25zdW1lcjo6YXNJbnRlcmZhY2UoCisgICAgICAgICAgICAgICAgcmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKIAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsCisgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiAmYnVmZmVyQ29uc3VtZXIsIE1ldGFkYXRhQnVmZmVyVHlwZSAqdHlwZSkgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRfaW5kZXgpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGJ1ZmZlckNvbnN1bWVyKSk7CisKKyAgICAgICAgZXJyID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9JTlBVVF9TVVJGQUNFLCBkYXRhLCAmcmVwbHkpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJiaW5kZXIgdHJhbnNhY3Rpb24gZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmVhZCB0eXBlIGV2ZW4gaWYgc2V0SW5wdXRTdXJmYWNlIGZhaWxlZAorICAgICAgICBpbnQgbmVnb3RpYXRlZFR5cGUgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKHR5cGUgIT0gTlVMTCkgeworICAgICAgICAgICAgKnR5cGUgPSAoTWV0YWRhdGFCdWZmZXJUeXBlKW5lZ290aWF0ZWRUeXBlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbShub2RlX2lkIG5vZGUpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBzdGF0dXNfdCBlcnI7CkBAIC0zNDEsNyArNDA0LDcgQEAKICAgICB9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMoCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlKSB7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlLCBNZXRhZGF0YUJ1ZmZlclR5cGUgKnR5cGUpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwpAQCAtMzQ5LDggKzQxMiwxMyBAQAogICAgICAgICBkYXRhLndyaXRlSW50MzIoKHVpbnQzMl90KWVuYWJsZSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVE9SRV9NRVRBX0RBVEFfSU5fQlVGRkVSUywgZGF0YSwgJnJlcGx5KTsKIAotICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgLy8gcmVhZCB0eXBlIGV2ZW4gc3RvcmVNZXRhRGF0YUluQnVmZmVycyBmYWlsZWQKKyAgICAgICAgaW50IG5lZ290aWF0ZWRUeXBlID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmICh0eXBlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICp0eXBlID0gKE1ldGFkYXRhQnVmZmVyVHlwZSluZWdvdGlhdGVkVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrKApAQCAtNDEzLDEyICs0ODEsMTMgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXJXaXRoQmFja3VwKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCi0gICAgICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlcikgeworICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIsIE9NWF9VMzIgYWxsb3R0ZWRTaXplKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRfaW5kZXgpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKHBhcmFtcykpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoYWxsb3R0ZWRTaXplKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEFMTE9DX0JVRkZFUl9XSVRIX0JBQ0tVUCwgZGF0YSwgJnJlcGx5KTsKIAogICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKQEAgLTQ0NSwxMSArNTE0LDE1IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGZpbGxCdWZmZXIobm9kZV9pZCBub2RlLCBidWZmZXJfaWQgYnVmZmVyKSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCBmaWxsQnVmZmVyKG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlciwgaW50IGZlbmNlRmQpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpYnVmZmVyKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGZlbmNlRmQgPj0gMCk7CisgICAgICAgIGlmIChmZW5jZUZkID49IDApIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVGaWxlRGVzY3JpcHRvcihmZW5jZUZkLCB0cnVlIC8qIHRha2VPd25lcnNoaXAgKi8pOworICAgICAgICB9CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChGSUxMX0JVRkZFUiwgZGF0YSwgJnJlcGx5KTsKIAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CkBAIC00NTksNyArNTMyLDcgQEAKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwKICAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIsCiAgICAgICAgICAgICBPTVhfVTMyIHJhbmdlX29mZnNldCwgT01YX1UzMiByYW5nZV9sZW5ndGgsCi0gICAgICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wKSB7CisgICAgICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wLCBpbnQgZmVuY2VGZCkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CkBAIC00NjgsNiArNTQxLDEwIEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihyYW5nZV9sZW5ndGgpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZmxhZ3MpOwogICAgICAgICBkYXRhLndyaXRlSW50NjQodGltZXN0YW1wKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGZlbmNlRmQgPj0gMCk7CisgICAgICAgIGlmIChmZW5jZUZkID49IDApIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVGaWxlRGVzY3JpcHRvcihmZW5jZUZkLCB0cnVlIC8qIHRha2VPd25lcnNoaXAgKi8pOworICAgICAgICB9CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChFTVBUWV9CVUZGRVIsIGRhdGEsICZyZXBseSk7CiAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwpAQCAtNjE4LDM4ICs2OTUsNzQgQEAKIAogICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBkYXRhLnJlYWRJbnQ2NCgpOwogCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBOT19NRU1PUlk7Ci0gICAgICAgICAgICB2b2lkICpwYXJhbXMgPSBjYWxsb2Moc2l6ZSwgMSk7Ci0gICAgICAgICAgICBpZiAocGFyYW1zKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gZGF0YS5yZWFkKHBhcmFtcywgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI2OTE0NDc0Iik7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBOT1RfRU5PVUdIX0RBVEE7CisgICAgICAgICAgICB2b2lkICpwYXJhbXMgPSBOVUxMOworICAgICAgICAgICAgc2l6ZV90IHBhZ2VTaXplID0gMDsKKyAgICAgICAgICAgIHNpemVfdCBhbGxvY1NpemUgPSAwOworICAgICAgICAgICAgYm9vbCBpc1VzYWdlQml0cyA9IChpbmRleCA9PSAoT01YX0lOREVYVFlQRSkgT01YX0luZGV4UGFyYW1Db25zdW1lclVzYWdlQml0cyk7CisgICAgICAgICAgICBpZiAoKGlzVXNhZ2VCaXRzICYmIHNpemUgPCA0KSB8fAorICAgICAgICAgICAgICAgICAgICAoIWlzVXNhZ2VCaXRzICYmIGNvZGUgIT0gU0VUX0lOVEVSTkFMX09QVElPTiAmJiBzaXplIDwgOCkpIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBleHBlY3QgdGhlIHN0cnVjdHVyZSB0byBjb250YWluIGF0IGxlYXN0IHRoZSBzaXplIGFuZAorICAgICAgICAgICAgICAgIC8vIHZlcnNpb24sIDggYnl0ZXMgdG90YWwKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8yNzIwNzI3NSAoJXp1KSAoJWQvJWQpIiwgc2l6ZSwgaW50KGluZGV4KSwgaW50KGNvZGUpKTsKKyAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3MjA3Mjc1Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVyciA9IE5PX01FTU9SWTsKKyAgICAgICAgICAgICAgICBwYWdlU2l6ZSA9IChzaXplX3QpIHN5c2NvbmYoX1NDX1BBR0VfU0laRSk7CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPiBTSVpFX01BWCAtIChwYWdlU2l6ZSAqIDIpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJyZXF1ZXN0ZWQgcGFyYW0gc2l6ZSB0b28gYmlnIik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEdFVF9QQVJBTUVURVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZ2V0UGFyYW1ldGVyKG5vZGUsIGluZGV4LCBwYXJhbXMsIHNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTRVRfUEFSQU1FVEVSOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHNldFBhcmFtZXRlcihub2RlLCBpbmRleCwgcGFyYW1zLCBzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgR0VUX0NPTkZJRzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBnZXRDb25maWcobm9kZSwgaW5kZXgsIHBhcmFtcywgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNFVF9DT05GSUc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gc2V0Q29uZmlnKG5vZGUsIGluZGV4LCBwYXJhbXMsIHNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTRVRfSU5URVJOQUxfT1BUSU9OOgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVybmFsT3B0aW9uVHlwZSB0eXBlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEludGVybmFsT3B0aW9uVHlwZSlkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgICAgICAgICBhbGxvY1NpemUgPSAoc2l6ZSArIHBhZ2VTaXplICogMikgJiB+KHBhZ2VTaXplIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IG1tYXAoTlVMTCwgYWxsb2NTaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BUF9QUklWQVRFIHwgTUFQX0FOT05ZTU9VUywgLTEgLyogZmQgKi8sIDAgLyogb2Zmc2V0ICovKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtcyAhPSBNQVBfRkFJTEVEKSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IGRhdGEucmVhZChwYXJhbXMsIHNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI2OTE0NDc0Iik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBOT1RfRU5PVUdIX0RBVEE7CisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVTMyIGRlY2xhcmVkU2l6ZSA9ICooT01YX1UzMiopcGFyYW1zOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgIT0gU0VUX0lOVEVSTkFMX09QVElPTiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCAhPSAoT01YX0lOREVYVFlQRSkgT01YX0luZGV4UGFyYW1Db25zdW1lclVzYWdlQml0cyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZFNpemUgPiBzaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGJ1ZmZlciBzYXlzIGl0J3MgYmlnZ2VyIHRoYW4gaXQgYWN0dWFsbHkgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiYi8yNzIwNzI3NSAoJXUvJXp1KSIsIGRlY2xhcmVkU2l6ZSwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzIwNzI3NSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIHRoZSBsYXN0IHBhZ2UgYXMgaW5hY2Nlc3NpYmxlLCB0byBhdm9pZCBleHBsb2l0YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiBjb2RlY3MgdGhhdCBhY2Nlc3MgcGFzdCB0aGUgZW5kIG9mIHRoZSBhbGxvY2F0aW9uIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGV5IGRpZG4ndCBjaGVjayB0aGUgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wcm90ZWN0KChjaGFyKilwYXJhbXMgKyBhbGxvY1NpemUgLSBwYWdlU2l6ZSwgcGFnZVNpemUsIFBST1RfTk9ORSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgR0VUX1BBUkFNRVRFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGdldFBhcmFtZXRlcihub2RlLCBpbmRleCwgcGFyYW1zLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNFVF9QQVJBTUVURVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBzZXRQYXJhbWV0ZXIobm9kZSwgaW5kZXgsIHBhcmFtcywgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBHRVRfQ09ORklHOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZ2V0Q29uZmlnKG5vZGUsIGluZGV4LCBwYXJhbXMsIHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU0VUX0NPTkZJRzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHNldENvbmZpZyhub2RlLCBpbmRleCwgcGFyYW1zLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNFVF9JTlRFUk5BTF9PUFRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVybmFsT3B0aW9uVHlwZSB0eXBlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSW50ZXJuYWxPcHRpb25UeXBlKWRhdGEucmVhZEludDMyKCk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBzZXRJbnRlcm5hbE9wdGlvbihub2RlLCBpbmRleCwgdHlwZSwgcGFyYW1zLCBzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHNldEludGVybmFsT3B0aW9uKG5vZGUsIGluZGV4LCB0eXBlLCBwYXJhbXMsIHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjb3VsZG4ndCBtYXA6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTY1OSw3ICs3NzIsOSBAQAogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShwYXJhbXMsIHNpemUpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmcmVlKHBhcmFtcyk7CisgICAgICAgICAgICBpZiAocGFyYW1zKSB7CisgICAgICAgICAgICAgICAgbXVubWFwKHBhcmFtcywgYWxsb2NTaXplKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBhcmFtcyA9IE5VTEw7CiAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTcxNiw5ICs4MzEsMTAgQEAKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydF9pbmRleCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBzcDxJTWVtb3J5PiBwYXJhbXMgPQogICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElNZW1vcnk+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIE9NWF9VMzIgYWxsb3R0ZWRTaXplID0gZGF0YS5yZWFkSW50MzIoKTsKIAogICAgICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlcjsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHVzZUJ1ZmZlcihub2RlLCBwb3J0X2luZGV4LCBwYXJhbXMsICZidWZmZXIpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gdXNlQnVmZmVyKG5vZGUsIHBvcnRfaW5kZXgsIHBhcmFtcywgJmJ1ZmZlciwgYWxsb3R0ZWRTaXplKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7CiAKICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKQEAgLTc3NCw5ICs4OTAsMTQgQEAKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydF9pbmRleCA9IGRhdGEucmVhZEludDMyKCk7CiAKICAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGJ1ZmZlclByb2R1Y2VyOwotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gY3JlYXRlSW5wdXRTdXJmYWNlKG5vZGUsIHBvcnRfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICZidWZmZXJQcm9kdWNlcik7CisgICAgICAgICAgICBNZXRhZGF0YUJ1ZmZlclR5cGUgdHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVJbnZhbGlkOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gY3JlYXRlSW5wdXRTdXJmYWNlKG5vZGUsIHBvcnRfaW5kZXgsICZidWZmZXJQcm9kdWNlciwgJnR5cGUpOwogCisgICAgICAgICAgICBpZiAoKGVyciAhPSBPSykgJiYgKHR5cGUgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUludmFsaWQpKSB7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNjMyNDM1OCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMih0eXBlKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7CiAKICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKQEAgLTc4Niw2ICs5MDcsNDcgQEAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgQ1JFQVRFX1BFUlNJU1RFTlRfSU5QVVRfU1VSRkFDRToKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGJ1ZmZlclByb2R1Y2VyOworICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gYnVmZmVyQ29uc3VtZXI7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBjcmVhdGVQZXJzaXN0ZW50SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgICAgICAgICAmYnVmZmVyUHJvZHVjZXIsICZidWZmZXJDb25zdW1lcik7CisKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7CisKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVyUHJvZHVjZXIpKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVyQ29uc3VtZXIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTRVRfSU5QVVRfU1VSRkFDRToKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOworCisgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBidWZmZXJDb25zdW1lciA9CisgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElHcmFwaGljQnVmZmVyQ29uc3VtZXI+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKworICAgICAgICAgICAgTWV0YWRhdGFCdWZmZXJUeXBlIHR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZDsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHNldElucHV0U3VyZmFjZShub2RlLCBwb3J0X2luZGV4LCBidWZmZXJDb25zdW1lciwgJnR5cGUpOworCisgICAgICAgICAgICBpZiAoKGVyciAhPSBPSykgJiYgKHR5cGUgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUludmFsaWQpKSB7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNjMyNDM1OCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMih0eXBlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIFNJR05BTF9FTkRfT0ZfSU5QVVRfU1RSRUFNOgogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKQEAgLTgwNiw3ICs5NjgsMTAgQEAKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydF9pbmRleCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfQk9PTCBlbmFibGUgPSAoT01YX0JPT0wpZGF0YS5yZWFkSW50MzIoKTsKIAotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc3RvcmVNZXRhRGF0YUluQnVmZmVycyhub2RlLCBwb3J0X2luZGV4LCBlbmFibGUpOworICAgICAgICAgICAgTWV0YWRhdGFCdWZmZXJUeXBlIHR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZDsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMobm9kZSwgcG9ydF9pbmRleCwgZW5hYmxlLCAmdHlwZSk7CisKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHR5cGUpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKIAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtODg1LDEwICsxMDUwLDExIEBACiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgc3A8SU1lbW9yeT4gcGFyYW1zID0KICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBPTVhfVTMyIGFsbG90dGVkU2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CiAKICAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXI7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBhbGxvY2F0ZUJ1ZmZlcldpdGhCYWNrdXAoCi0gICAgICAgICAgICAgICAgICAgIG5vZGUsIHBvcnRfaW5kZXgsIHBhcmFtcywgJmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIG5vZGUsIHBvcnRfaW5kZXgsIHBhcmFtcywgJmJ1ZmZlciwgYWxsb3R0ZWRTaXplKTsKIAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKIApAQCAtOTE3LDcgKzEwODMsOSBAQAogCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlciA9IChidWZmZXJfaWQpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGZpbGxCdWZmZXIobm9kZSwgYnVmZmVyKSk7CisgICAgICAgICAgICBib29sIGhhdmVGZW5jZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBpbnQgZmVuY2VGZCA9IGhhdmVGZW5jZSA/IDo6ZHVwKGRhdGEucmVhZEZpbGVEZXNjcmlwdG9yKCkpIDogLTE7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihmaWxsQnVmZmVyKG5vZGUsIGJ1ZmZlciwgZmVuY2VGZCkpOwogCiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KQEAgLTkzMiwxMSArMTEwMCwxMCBAQAogICAgICAgICAgICAgT01YX1UzMiByYW5nZV9sZW5ndGggPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgT01YX1UzMiBmbGFncyA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfVElDS1MgdGltZXN0YW1wID0gZGF0YS5yZWFkSW50NjQoKTsKLQotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoCi0gICAgICAgICAgICAgICAgICAgIGVtcHR5QnVmZmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSwgYnVmZmVyLCByYW5nZV9vZmZzZXQsIHJhbmdlX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCB0aW1lc3RhbXApKTsKKyAgICAgICAgICAgIGJvb2wgaGF2ZUZlbmNlID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludCBmZW5jZUZkID0gaGF2ZUZlbmNlID8gOjpkdXAoZGF0YS5yZWFkRmlsZURlc2NyaXB0b3IoKSkgOiAtMTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVtcHR5QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBub2RlLCBidWZmZXIsIHJhbmdlX29mZnNldCwgcmFuZ2VfbGVuZ3RoLCBmbGFncywgdGltZXN0YW1wLCBmZW5jZUZkKSk7CiAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQpAQCAtOTczLDE0ICsxMTQwLDI5IEBACiAgICAgICAgIDogQnBJbnRlcmZhY2U8SU9NWE9ic2VydmVyPihpbXBsKSB7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZShjb25zdCBvbXhfbWVzc2FnZSAmbXNnKSB7CisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZXMoY29uc3Qgc3RkOjpsaXN0PG9teF9tZXNzYWdlPiAmbWVzc2FnZXMpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWE9ic2VydmVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlKCZtc2csIHNpemVvZihtc2cpKTsKLQotICAgICAgICBBTE9HVigib25NZXNzYWdlIHdyaXRpbmcgbWVzc2FnZSAlZCwgc2l6ZSAlenUiLCBtc2cudHlwZSwgc2l6ZW9mKG1zZykpOwotCi0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChPQlNFUlZFUl9PTl9NU0csIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOworICAgICAgICBzdGQ6Omxpc3Q8b214X21lc3NhZ2U+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1lc3NhZ2VzLmNiZWdpbigpOworICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgd2hpbGUgKGl0ICE9IG1lc3NhZ2VzLmNlbmQoKSkgeworICAgICAgICAgICAgY29uc3Qgb214X21lc3NhZ2UgJm1zZyA9ICppdCsrOworICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVhPYnNlcnZlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIobXNnLm5vZGUpOworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIobXNnLmZlbmNlRmQgPj0gMCk7CisgICAgICAgICAgICBpZiAobXNnLmZlbmNlRmQgPj0gMCkgeworICAgICAgICAgICAgICAgIGRhdGEud3JpdGVGaWxlRGVzY3JpcHRvcihtc2cuZmVuY2VGZCwgdHJ1ZSAvKiB0YWtlT3duZXJzaGlwICovKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihtc2cudHlwZSk7CisgICAgICAgICAgICBkYXRhLndyaXRlKCZtc2cudSwgc2l6ZW9mKG1zZy51KSk7CisgICAgICAgICAgICBBTE9HVigib25NZXNzYWdlIHdyaXRpbmcgbWVzc2FnZSAlZCwgc2l6ZSAlenUiLCBtc2cudHlwZSwgc2l6ZW9mKG1zZykpOworICAgICAgICB9CisgICAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigtMSk7IC8vIG1hcmsgZW5kCisgICAgICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT0JTRVJWRVJfT05fTVNHLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKKyAgICAgICAgfQogICAgIH0KIH07CiAKQEAgLTk5MiwxNiArMTE3NCwyOCBAQAogICAgICAgICBjYXNlIE9CU0VSVkVSX09OX01TRzoKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YT2JzZXJ2ZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIElPTVg6Om5vZGVfaWQgbm9kZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8b214X21lc3NhZ2U+IG1lc3NhZ2VzOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gRkFJTEVEX1RSQU5TQUNUSU9OOyAvLyBtdXN0IHJlY2VpdmUgYXQgbGVhc3Qgb25lIG1lc3NhZ2UKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgaGF2ZUZlbmNlID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgICAgICBpZiAoaGF2ZUZlbmNlIDwgMCkgeyAvLyB3ZSB1c2UgLTEgdG8gbWFyayBlbmQgb2YgbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9teF9tZXNzYWdlIG1zZzsKKyAgICAgICAgICAgICAgICBtc2cubm9kZSA9IG5vZGU7CisgICAgICAgICAgICAgICAgbXNnLmZlbmNlRmQgPSBoYXZlRmVuY2UgPyA6OmR1cChkYXRhLnJlYWRGaWxlRGVzY3JpcHRvcigpKSA6IC0xOworICAgICAgICAgICAgICAgIG1zZy50eXBlID0gKHR5cGVvZihtc2cudHlwZSkpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBkYXRhLnJlYWQoJm1zZy51LCBzaXplb2YobXNnLnUpKTsKKyAgICAgICAgICAgICAgICBBTE9HVigib25UcmFuc2FjdCByZWFkaW5nIG1lc3NhZ2UgJWQsIHNpemUgJXp1IiwgbXNnLnR5cGUsIHNpemVvZihtc2cpKTsKKyAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoX2JhY2sobXNnKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKGVyciA9PSBPSyk7CiAKLSAgICAgICAgICAgIG9teF9tZXNzYWdlIG1zZzsKLSAgICAgICAgICAgIGRhdGEucmVhZCgmbXNnLCBzaXplb2YobXNnKSk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgb25NZXNzYWdlcyhtZXNzYWdlcyk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIEFMT0dWKCJvblRyYW5zYWN0IHJlYWRpbmcgbWVzc2FnZSAlZCwgc2l6ZSAlenUiLCBtc2cudHlwZSwgc2l6ZW9mKG1zZykpOwotCi0gICAgICAgICAgICAvLyBYWFggQ291bGQgdXNlIHJlYWRJbnBsYWNlIG1heWJlPwotICAgICAgICAgICAgb25NZXNzYWdlKG1zZyk7Ci0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KIAogICAgICAgICBkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSVJlbW90ZURpc3BsYXkuY3BwIGIvbWVkaWEvbGlibWVkaWEvSVJlbW90ZURpc3BsYXkuY3BwCmluZGV4IDFlMTU0MzQuLjg2OWQxMWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lSZW1vdGVEaXNwbGF5LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JUmVtb3RlRGlzcGxheS5jcHAKQEAgLTkxLDQgKzkxLDQgQEAKICAgICB9CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JUmVtb3RlRGlzcGxheUNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JUmVtb3RlRGlzcGxheUNsaWVudC5jcHAKaW5kZXggOWQ2M2JjOS4uYmVkZWI2YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSVJlbW90ZURpc3BsYXlDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lSZW1vdGVEaXNwbGF5Q2xpZW50LmNwcApAQCAtMTAxLDQgKzEwMSw0IEBACiAgICAgfQogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSVJlc291cmNlTWFuYWdlckNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JUmVzb3VyY2VNYW5hZ2VyQ2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2Y1NmU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvSVJlc291cmNlTWFuYWdlckNsaWVudC5jcHAKQEAgLTAsMCArMSw5MCBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lSZXNvdXJjZU1hbmFnZXJDbGllbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHsKKyAgICBSRUNMQUlNX1JFU09VUkNFID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICBHRVRfTkFNRSwKK307CisKK2NsYXNzIEJwUmVzb3VyY2VNYW5hZ2VyQ2xpZW50OiBwdWJsaWMgQnBJbnRlcmZhY2U8SVJlc291cmNlTWFuYWdlckNsaWVudD4KK3sKK3B1YmxpYzoKKyAgICBCcFJlc291cmNlTWFuYWdlckNsaWVudChjb25zdCBzcDxJQmluZGVyPiAmaW1wbCkKKyAgICAgICAgOiBCcEludGVyZmFjZTxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PihpbXBsKQorICAgIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcmVjbGFpbVJlc291cmNlKCkgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChSRUNMQUlNX1JFU09VUkNFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXQgPSAoYm9vbClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXROYW1lKCkgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIFN0cmluZzggcmV0OworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX05BTUUsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldCA9IHJlcGx5LnJlYWRTdHJpbmc4KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKK307CisKK0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShSZXNvdXJjZU1hbmFnZXJDbGllbnQsICJhbmRyb2lkLm1lZGlhLklSZXNvdXJjZU1hbmFnZXJDbGllbnQiKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0dXNfdCBCblJlc291cmNlTWFuYWdlckNsaWVudDo6b25UcmFuc2FjdCgKKyAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwgJmRhdGEsIFBhcmNlbCAqcmVwbHksIHVpbnQzMl90IGZsYWdzKQoreworICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICBjYXNlIFJFQ0xBSU1fUkVTT1VSQ0U6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBib29sIHJldCA9IHJlY2xhaW1SZXNvdXJjZSgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmV0KTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBHRVRfTkFNRTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSZXNvdXJjZU1hbmFnZXJDbGllbnQsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIFN0cmluZzggcmV0ID0gZ2V0TmFtZSgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nOChyZXQpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICB9Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU5ODY4NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDE2NiBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJJUmVzb3VyY2VNYW5hZ2VyU2VydmljZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIm1lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgiCisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHsKKyAgICBDT05GSUcgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorICAgIEFERF9SRVNPVVJDRSwKKyAgICBSRU1PVkVfUkVTT1VSQ0UsCisgICAgUkVDTEFJTV9SRVNPVVJDRSwKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgKmRhdGEsIGNvbnN0IFZlY3RvcjxUPiAmaXRlbXMpIHsKKyAgICBzaXplX3Qgc2l6ZSA9IGl0ZW1zLnNpemUoKTsKKyAgICAvLyB0cnVuY2F0ZXMgc2l6ZSwgYnV0IHNob3VsZCBiZSBva2F5IGZvciB0aGlzIHVzZWNhc2UKKyAgICBkYXRhLT53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2l6ZSkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGl0ZW1zW2ldLndyaXRlVG9QYXJjZWwoZGF0YSk7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyB2b2lkIHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmZGF0YSwgVmVjdG9yPFQ+ICppdGVtcykgeworICAgIHNpemVfdCBzaXplID0gKHNpemVfdClkYXRhLnJlYWRVaW50MzIoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUgJiYgZGF0YS5kYXRhQXZhaWwoKSA+IDA7IGkrKykgeworICAgICAgICBUIGl0ZW07CisgICAgICAgIGl0ZW0ucmVhZEZyb21QYXJjZWwoZGF0YSk7CisgICAgICAgIGl0ZW1zLT5hZGQoaXRlbSk7CisgICAgfQorfQorCitjbGFzcyBCcFJlc291cmNlTWFuYWdlclNlcnZpY2UgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SVJlc291cmNlTWFuYWdlclNlcnZpY2U+Cit7CitwdWJsaWM6CisgICAgQnBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlKGNvbnN0IHNwPElCaW5kZXI+ICZpbXBsKQorICAgICAgICA6IEJwSW50ZXJmYWNlPElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPihpbXBsKQorICAgIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgY29uZmlnKGNvbnN0IFZlY3RvcjxNZWRpYVJlc291cmNlUG9saWN5PiAmcG9saWNpZXMpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJlc291cmNlTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHdyaXRlVG9QYXJjZWwoJmRhdGEsIHBvbGljaWVzKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENPTkZJRywgZGF0YSwgJnJlcGx5KTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgYWRkUmVzb3VyY2UoCisgICAgICAgICAgICBpbnQgcGlkLAorICAgICAgICAgICAgaW50NjRfdCBjbGllbnRJZCwKKyAgICAgICAgICAgIGNvbnN0IHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxNZWRpYVJlc291cmNlPiAmcmVzb3VyY2VzKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocGlkKTsKKyAgICAgICAgZGF0YS53cml0ZUludDY0KGNsaWVudElkKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihjbGllbnQpKTsKKyAgICAgICAgd3JpdGVUb1BhcmNlbCgmZGF0YSwgcmVzb3VyY2VzKTsKKworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQUREX1JFU09VUkNFLCBkYXRhLCAmcmVwbHkpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVSZXNvdXJjZShpbnQgcGlkLCBpbnQ2NF90IGNsaWVudElkKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocGlkKTsKKyAgICAgICAgZGF0YS53cml0ZUludDY0KGNsaWVudElkKTsKKworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVNT1ZFX1JFU09VUkNFLCBkYXRhLCAmcmVwbHkpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCByZWNsYWltUmVzb3VyY2UoaW50IGNhbGxpbmdQaWQsIGNvbnN0IFZlY3RvcjxNZWRpYVJlc291cmNlPiAmcmVzb3VyY2VzKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoY2FsbGluZ1BpZCk7CisgICAgICAgIHdyaXRlVG9QYXJjZWwoJmRhdGEsIHJlc291cmNlcyk7CisKKyAgICAgICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFQ0xBSU1fUkVTT1VSQ0UsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldCA9IChib29sKXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorfTsKKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFJlc291cmNlTWFuYWdlclNlcnZpY2UsICJhbmRyb2lkLm1lZGlhLklSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlIik7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitzdGF0dXNfdCBCblJlc291cmNlTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QoCisgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsICZkYXRhLCBQYXJjZWwgKnJlcGx5LCB1aW50MzJfdCBmbGFncykKK3sKKyAgICBzd2l0Y2ggKGNvZGUpIHsKKyAgICAgICAgY2FzZSBDT05GSUc6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmVzb3VyY2VNYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgVmVjdG9yPE1lZGlhUmVzb3VyY2VQb2xpY3k+IHBvbGljaWVzOworICAgICAgICAgICAgcmVhZEZyb21QYXJjZWwoZGF0YSwgJnBvbGljaWVzKTsKKyAgICAgICAgICAgIGNvbmZpZyhwb2xpY2llcyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBBRERfUkVTT1VSQ0U6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmVzb3VyY2VNYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgaW50IHBpZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBpbnQ2NF90IGNsaWVudElkID0gZGF0YS5yZWFkSW50NjQoKTsKKyAgICAgICAgICAgIHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudCgKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SVJlc291cmNlTWFuYWdlckNsaWVudD4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpKTsKKyAgICAgICAgICAgIFZlY3RvcjxNZWRpYVJlc291cmNlPiByZXNvdXJjZXM7CisgICAgICAgICAgICByZWFkRnJvbVBhcmNlbChkYXRhLCAmcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIGFkZFJlc291cmNlKHBpZCwgY2xpZW50SWQsIGNsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIFJFTU9WRV9SRVNPVVJDRTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBpbnQgcGlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludDY0X3QgY2xpZW50SWQgPSBkYXRhLnJlYWRJbnQ2NCgpOworICAgICAgICAgICAgcmVtb3ZlUmVzb3VyY2UocGlkLCBjbGllbnRJZCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBSRUNMQUlNX1JFU09VUkNFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJlc291cmNlTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGludCBjYWxsaW5nUGlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIFZlY3RvcjxNZWRpYVJlc291cmNlPiByZXNvdXJjZXM7CisgICAgICAgICAgICByZWFkRnJvbVBhcmNlbChkYXRhLCAmcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIGJvb2wgcmV0ID0gcmVjbGFpbVJlc291cmNlKGNhbGxpbmdQaWQsIHJlc291cmNlcyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXQpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSVN0cmVhbVNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JU3RyZWFtU291cmNlLmNwcAppbmRleCBkNDgwYWVmLi44NDBlNDUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JU3RyZWFtU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JU3RyZWFtU291cmNlLmNwcApAQCAtMzUsNiArMzUsOSBAQAogLy8gc3RhdGljCiBjb25zdCBjaGFyICpjb25zdCBJU3RyZWFtTGlzdGVuZXI6OmtLZXlNZWRpYVRpbWVVcyA9ICJtZWRpYS10aW1lLXVzIjsKIAorLy8gc3RhdGljCitjb25zdCBjaGFyICpjb25zdCBJU3RyZWFtTGlzdGVuZXI6OmtLZXlSZWNlbnRNZWRpYVRpbWVVcyA9ICJyZWNlbnQtbWVkaWEtdGltZS11cyI7CisKIGVudW0gewogICAgIC8vIElTdHJlYW1Tb3VyY2UKICAgICBTRVRfTElTVEVORVIgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSmV0UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0pldFBsYXllci5jcHAKaW5kZXggNzIxZDhkNy4uMzRkZWI1OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSmV0UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9KZXRQbGF5ZXIuY3BwCkBAIC04NSwxMiArODUsMTggQEAKIAogICAgIC8vIGNyZWF0ZSB0aGUgb3V0cHV0IEF1ZGlvVHJhY2sKICAgICBtQXVkaW9UcmFjayA9IG5ldyBBdWRpb1RyYWNrKCk7Ci0gICAgbUF1ZGlvVHJhY2stPnNldChBVURJT19TVFJFQU1fTVVTSUMsICAvL1RPRE8gcGFyYW1ldGVyaXplIHRoaXMKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9UcmFjay0+c2V0KEFVRElPX1NUUkVBTV9NVVNJQywgIC8vVE9ETyBwYXJhbWV0ZXJpemUgdGhpcwogICAgICAgICAgICAgcExpYkNvbmZpZy0+c2FtcGxlUmF0ZSwKICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KHBMaWJDb25maWctPm51bUNoYW5uZWxzKSwKICAgICAgICAgICAgIChzaXplX3QpIG1UcmFja0J1ZmZlclNpemUsCiAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJKZXRQbGF5ZXI6OmluaXQoKTogRXJyb3IgaW5pdGlhbGl6aW5nIEpFVCBsaWJyYXJ5OyBBdWRpb1RyYWNrIGVycm9yICVkIiwgc3RhdHVzKTsKKyAgICAgICAgbUF1ZGlvVHJhY2suY2xlYXIoKTsKKyAgICAgICAgbVN0YXRlID0gRUFTX1NUQVRFX0VSUk9SOworICAgICAgICByZXR1cm4gRUFTX0ZBSUxVUkU7CisgICAgfQogCiAgICAgLy8gY3JlYXRlIHJlbmRlciBhbmQgcGxheWJhY2sgdGhyZWFkCiAgICAgewpAQCAtNDA4LDcgKzQxNCw4IEBACiAgICAgQUxPR1YoIkpldFBsYXllcjo6cXVldWVTZWdtZW50IHNlZ21lbnROdW09JWQsIGxpYk51bT0lZCwgcmVwZWF0Q291bnQ9JWQsIHRyYW5zcG9zZT0lZCIsCiAgICAgICAgIHNlZ21lbnROdW0sIGxpYk51bSwgcmVwZWF0Q291bnQsIHRyYW5zcG9zZSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICByZXR1cm4gSkVUX1F1ZXVlU2VnbWVudChtRWFzRGF0YSwgc2VnbWVudE51bSwgbGliTnVtLCByZXBlYXRDb3VudCwgdHJhbnNwb3NlLCBtdXRlRmxhZ3MsIHVzZXJJRCk7CisgICAgcmV0dXJuIEpFVF9RdWV1ZVNlZ21lbnQobUVhc0RhdGEsIHNlZ21lbnROdW0sIGxpYk51bSwgcmVwZWF0Q291bnQsIHRyYW5zcG9zZSwgbXV0ZUZsYWdzLAorICAgICAgICAgICAgdXNlcklEKTsKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00NDksNyArNDU2LDggQEAKIHZvaWQgSmV0UGxheWVyOjpkdW1wSmV0U3RhdHVzKFNfSkVUX1NUQVRVUyogcEpldFN0YXR1cykKIHsKICAgICBpZiAocEpldFN0YXR1cyE9TlVMTCkKLSAgICAgICAgQUxPR1YoIj4+IGN1cnJlbnQgSkVUIHBsYXllciBzdGF0dXM6IHVzZXJJRD0lZCBzZWdtZW50UmVwZWF0Q291bnQ9JWQgbnVtUXVldWVkU2VnbWVudHM9JWQgcGF1c2VkPSVkIiwKKyAgICAgICAgQUxPR1YoIj4+IGN1cnJlbnQgSkVUIHBsYXllciBzdGF0dXM6IHVzZXJJRD0lZCBzZWdtZW50UmVwZWF0Q291bnQ9JWQgbnVtUXVldWVkU2VnbWVudHM9JWQgIgorICAgICAgICAgICAgICAgICJwYXVzZWQ9JWQiLAogICAgICAgICAgICAgICAgIHBKZXRTdGF0dXMtPmN1cnJlbnRVc2VySUQsIHBKZXRTdGF0dXMtPnNlZ21lbnRSZXBlYXRDb3VudCwKICAgICAgICAgICAgICAgICBwSmV0U3RhdHVzLT5udW1RdWV1ZWRTZWdtZW50cywgcEpldFN0YXR1cy0+cGF1c2VkKTsKICAgICBlbHNlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjSW5mby5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjSW5mby5jcHAKaW5kZXggN2I0YzRlMi4uOGQzZmE3YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFDb2RlY0luZm8uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhQ29kZWNJbmZvLmNwcApAQCAtMjA2LDYgKzIwNiwxNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgTWVkaWFDb2RlY0luZm86OnVwZGF0ZU1pbWUoY29uc3QgY2hhciAqbWltZSkgeworICAgIHNzaXplX3QgaXggPSBnZXRDYXBhYmlsaXR5SW5kZXgobWltZSk7CisgICAgaWYgKGl4IDwgMCkgeworICAgICAgICBBTE9HRSgidXBkYXRlTWltZSBtaW1lIG5vdCBmb3VuZCAlcyIsIG1pbWUpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBtQ3VycmVudENhcHMgPSBtQ2Fwcy52YWx1ZUF0KGl4KTsKKyAgICByZXR1cm4gT0s7Cit9CisKIHZvaWQgTWVkaWFDb2RlY0luZm86OnJlbW92ZU1pbWUoY29uc3QgY2hhciAqbWltZSkgewogICAgIHNzaXplX3QgaXggPSBnZXRDYXBhYmlsaXR5SW5kZXgobWltZSk7CiAgICAgaWYgKGl4ID49IDApIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKaW5kZXggZTJlNjA0Mi4uYzU3OTBmYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKQEAgLTE1MiwxOCArMTUyLDkgQEAKICAgICBBTE9HVigiY29kZWMgPSAlZCIsIGNhcC5tQ29kZWMpOwogfQogCi0vKnN0YXRpYyovIHZvaWQKLU1lZGlhUHJvZmlsZXM6OmxvZ1ZpZGVvRWRpdG9yQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OlZpZGVvRWRpdG9yQ2FwJiBjYXAgVU5VU0VEKQotewotICAgIEFMT0dWKCJ2aWRlb2VkaXRvciBjYXA6Iik7Ci0gICAgQUxPR1YoIm1NYXhJbnB1dEZyYW1lV2lkdGggPSAlZCIsIGNhcC5tTWF4SW5wdXRGcmFtZVdpZHRoKTsKLSAgICBBTE9HVigibU1heElucHV0RnJhbWVIZWlnaHQgPSAlZCIsIGNhcC5tTWF4SW5wdXRGcmFtZUhlaWdodCk7Ci0gICAgQUxPR1YoIm1NYXhPdXRwdXRGcmFtZVdpZHRoID0gJWQiLCBjYXAubU1heE91dHB1dEZyYW1lV2lkdGgpOwotICAgIEFMT0dWKCJtTWF4T3V0cHV0RnJhbWVIZWlnaHQgPSAlZCIsIGNhcC5tTWF4T3V0cHV0RnJhbWVIZWlnaHQpOwotfQotCiAvKnN0YXRpYyovIGludAotTWVkaWFQcm9maWxlczo6ZmluZFRhZ0Zvck5hbWUoY29uc3QgTWVkaWFQcm9maWxlczo6TmFtZVRvVGFnTWFwICptYXAsIHNpemVfdCBuTWFwcGluZ3MsIGNvbnN0IGNoYXIgKm5hbWUpCitNZWRpYVByb2ZpbGVzOjpmaW5kVGFnRm9yTmFtZShjb25zdCBNZWRpYVByb2ZpbGVzOjpOYW1lVG9UYWdNYXAgKm1hcCwgc2l6ZV90IG5NYXBwaW5ncywKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSkKIHsKICAgICBpbnQgdGFnID0gLTE7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuTWFwcGluZ3M7ICsraSkgewpAQCAtMjk1LDkgKzI4Niw4IEBACiAgICAgQ0hFQ0soY29kZWMgIT0gLTEpOwogCiAgICAgTWVkaWFQcm9maWxlczo6QXVkaW9FbmNvZGVyQ2FwICpjYXAgPQotICAgICAgICBuZXcgTWVkaWFQcm9maWxlczo6QXVkaW9FbmNvZGVyQ2FwKHN0YXRpY19jYXN0PGF1ZGlvX2VuY29kZXI+KGNvZGVjKSwgYXRvaShhdHRzWzVdKSwgYXRvaShhdHRzWzddKSwKLSAgICAgICAgICAgIGF0b2koYXR0c1s5XSksIGF0b2koYXR0c1sxMV0pLCBhdG9pKGF0dHNbMTNdKSwKLSAgICAgICAgICAgIGF0b2koYXR0c1sxNV0pKTsKKyAgICAgICAgbmV3IE1lZGlhUHJvZmlsZXM6OkF1ZGlvRW5jb2RlckNhcChzdGF0aWNfY2FzdDxhdWRpb19lbmNvZGVyPihjb2RlYyksIGF0b2koYXR0c1s1XSksCisgICAgICAgICAgICBhdG9pKGF0dHNbN10pLCBhdG9pKGF0dHNbOV0pLCBhdG9pKGF0dHNbMTFdKSwgYXRvaShhdHRzWzEzXSksIGF0b2koYXR0c1sxNV0pKTsKICAgICBsb2dBdWRpb0VuY29kZXJDYXAoKmNhcCk7CiAgICAgcmV0dXJuIGNhcDsKIH0KQEAgLTMzMCw3ICszMjAsOCBAQAogICAgICAgICAgICFzdHJjbXAoImZpbGVGb3JtYXQiLCBhdHRzWzJdKSAmJgogICAgICAgICAgICFzdHJjbXAoImR1cmF0aW9uIiwgICBhdHRzWzRdKSk7CiAKLSAgICBjb25zdCBzaXplX3QgblByb2ZpbGVNYXBwaW5ncyA9IHNpemVvZihzQ2FtY29yZGVyUXVhbGl0eU5hbWVNYXApL3NpemVvZihzQ2FtY29yZGVyUXVhbGl0eU5hbWVNYXBbMF0pOworICAgIGNvbnN0IHNpemVfdCBuUHJvZmlsZU1hcHBpbmdzID0gc2l6ZW9mKHNDYW1jb3JkZXJRdWFsaXR5TmFtZU1hcCkvCisgICAgICAgICAgICBzaXplb2Yoc0NhbWNvcmRlclF1YWxpdHlOYW1lTWFwWzBdKTsKICAgICBjb25zdCBpbnQgcXVhbGl0eSA9IGZpbmRUYWdGb3JOYW1lKHNDYW1jb3JkZXJRdWFsaXR5TmFtZU1hcCwgblByb2ZpbGVNYXBwaW5ncywgYXR0c1sxXSk7CiAgICAgQ0hFQ0socXVhbGl0eSAhPSAtMSk7CiAKQEAgLTM5Nyw0MiArMzg4LDYgQEAKICAgICBBTE9HVigiJXM6IGNhbWVyYUlkPSVkLCBvZmZzZXQ9JWQgbXMiLCBfX2Z1bmNfXywgY2FtZXJhSWQsIG9mZnNldFRpbWVNcyk7CiAgICAgbVN0YXJ0VGltZU9mZnNldHMucmVwbGFjZVZhbHVlRm9yKGNhbWVyYUlkLCBvZmZzZXRUaW1lTXMpOwogfQotLypzdGF0aWMqLyBNZWRpYVByb2ZpbGVzOjpFeHBvcnRWaWRlb1Byb2ZpbGUqCi1NZWRpYVByb2ZpbGVzOjpjcmVhdGVFeHBvcnRWaWRlb1Byb2ZpbGUoY29uc3QgY2hhciAqKmF0dHMpCi17Ci0gICAgQ0hFQ0soIXN0cmNtcCgibmFtZSIsIGF0dHNbMF0pICYmCi0gICAgICAgICAgIXN0cmNtcCgicHJvZmlsZSIsIGF0dHNbMl0pICYmCi0gICAgICAgICAgIXN0cmNtcCgibGV2ZWwiLCBhdHRzWzRdKSk7Ci0KLSAgICBjb25zdCBzaXplX3Qgbk1hcHBpbmdzID0KLSAgICAgICAgc2l6ZW9mKHNWaWRlb0VuY29kZXJOYW1lTWFwKS9zaXplb2Yoc1ZpZGVvRW5jb2Rlck5hbWVNYXBbMF0pOwotICAgIGNvbnN0IGludCBjb2RlYyA9IGZpbmRUYWdGb3JOYW1lKHNWaWRlb0VuY29kZXJOYW1lTWFwLCBuTWFwcGluZ3MsIGF0dHNbMV0pOwotICAgIENIRUNLKGNvZGVjICE9IC0xKTsKLQotICAgIE1lZGlhUHJvZmlsZXM6OkV4cG9ydFZpZGVvUHJvZmlsZSAqcHJvZmlsZSA9Ci0gICAgICAgIG5ldyBNZWRpYVByb2ZpbGVzOjpFeHBvcnRWaWRlb1Byb2ZpbGUoCi0gICAgICAgICAgICBjb2RlYywgYXRvaShhdHRzWzNdKSwgYXRvaShhdHRzWzVdKSk7Ci0KLSAgICByZXR1cm4gcHJvZmlsZTsKLX0KLS8qc3RhdGljKi8gTWVkaWFQcm9maWxlczo6VmlkZW9FZGl0b3JDYXAqCi1NZWRpYVByb2ZpbGVzOjpjcmVhdGVWaWRlb0VkaXRvckNhcChjb25zdCBjaGFyICoqYXR0cywgTWVkaWFQcm9maWxlcyAqcHJvZmlsZXMpCi17Ci0gICAgQ0hFQ0soIXN0cmNtcCgibWF4SW5wdXRGcmFtZVdpZHRoIiwgYXR0c1swXSkgJiYKLSAgICAgICAgICAhc3RyY21wKCJtYXhJbnB1dEZyYW1lSGVpZ2h0IiwgYXR0c1syXSkgICYmCi0gICAgICAgICAgIXN0cmNtcCgibWF4T3V0cHV0RnJhbWVXaWR0aCIsIGF0dHNbNF0pICYmCi0gICAgICAgICAgIXN0cmNtcCgibWF4T3V0cHV0RnJhbWVIZWlnaHQiLCBhdHRzWzZdKSAmJgotICAgICAgICAgICFzdHJjbXAoIm1heFByZWZldGNoWVVWRnJhbWVzIiwgYXR0c1s4XSkpOwotCi0gICAgTWVkaWFQcm9maWxlczo6VmlkZW9FZGl0b3JDYXAgKnBWaWRlb0VkaXRvckNhcCA9Ci0gICAgICAgIG5ldyBNZWRpYVByb2ZpbGVzOjpWaWRlb0VkaXRvckNhcChhdG9pKGF0dHNbMV0pLCBhdG9pKGF0dHNbM10pLAotICAgICAgICAgICAgICAgIGF0b2koYXR0c1s1XSksIGF0b2koYXR0c1s3XSksIGF0b2koYXR0c1s5XSkpOwotCi0gICAgbG9nVmlkZW9FZGl0b3JDYXAoKnBWaWRlb0VkaXRvckNhcCk7Ci0gICAgcHJvZmlsZXMtPm1WaWRlb0VkaXRvckNhcCA9IHBWaWRlb0VkaXRvckNhcDsKLQotICAgIHJldHVybiBwVmlkZW9FZGl0b3JDYXA7Ci19CiAKIC8qc3RhdGljKi8gdm9pZAogTWVkaWFQcm9maWxlczo6c3RhcnRFbGVtZW50SGFuZGxlcih2b2lkICp1c2VyRGF0YSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHMpCkBAIC00NjQsMTAgKzQxOSw2IEBACiAgICAgICAgICAgICBjcmVhdGVDYW1jb3JkZXJQcm9maWxlKHByb2ZpbGVzLT5tQ3VycmVudENhbWVyYUlkLCBhdHRzLCBwcm9maWxlcy0+bUNhbWVyYUlkcykpOwogICAgIH0gZWxzZSBpZiAoc3RyY21wKCJJbWFnZUVuY29kaW5nIiwgbmFtZSkgPT0gMCkgewogICAgICAgICBwcm9maWxlcy0+YWRkSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbChwcm9maWxlcy0+bUN1cnJlbnRDYW1lcmFJZCwgYXR0cyk7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAoIlZpZGVvRWRpdG9yQ2FwIiwgbmFtZSkgPT0gMCkgewotICAgICAgICBjcmVhdGVWaWRlb0VkaXRvckNhcChhdHRzLCBwcm9maWxlcyk7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAoIkV4cG9ydFZpZGVvUHJvZmlsZSIsIG5hbWUpID09IDApIHsKLSAgICAgICAgcHJvZmlsZXMtPm1WaWRlb0VkaXRvckV4cG9ydFByb2ZpbGVzLmFkZChjcmVhdGVFeHBvcnRWaWRlb1Byb2ZpbGUoYXR0cykpOwogICAgIH0KIH0KIApAQCAtNTMxLDcgKzQ4Miw2IEBACiAgICAgICAgIENIRUNLKHJlZkluZGV4ICE9IC0xKTsKICAgICAgICAgUmVxdWlyZWRQcm9maWxlUmVmSW5mbyAqaW5mbzsKICAgICAgICAgY2FtY29yZGVyX3F1YWxpdHkgcmVmUXVhbGl0eTsKLSAgICAgICAgVmlkZW9Db2RlYyAqY29kZWMgPSBOVUxMOwogCiAgICAgICAgIC8vIENoZWNrIGhpZ2ggYW5kIGxvdyBmcm9tIGVpdGhlciBjYW1jb3JkZXIgcHJvZmlsZSwgdGltZWxhcHNlIHByb2ZpbGUKICAgICAgICAgLy8gb3IgaGlnaCBzcGVlZCBwcm9maWxlLCBidXQgbm90IGFsbCBvZiB0aGVtLiBEZWZhdWx0LCBjaGVjayBjYW1jb3JkZXIgcHJvZmlsZQpAQCAtNzIyLDE2ICs2NzIsMjAgQEAKIE1lZGlhUHJvZmlsZXM6OmNyZWF0ZURlZmF1bHRDYW1jb3JkZXJUaW1lTGFwc2VMb3dQcm9maWxlcygKICAgICAgICAgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSAqKmxvd1RpbWVMYXBzZVByb2ZpbGUsCiAgICAgICAgIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUgKipsb3dTcGVjaWZpY1RpbWVMYXBzZVByb2ZpbGUpIHsKLSAgICAqbG93VGltZUxhcHNlUHJvZmlsZSA9IGNyZWF0ZURlZmF1bHRDYW1jb3JkZXJUaW1lTGFwc2VRY2lmUHJvZmlsZShDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xPVyk7Ci0gICAgKmxvd1NwZWNpZmljVGltZUxhcHNlUHJvZmlsZSA9IGNyZWF0ZURlZmF1bHRDYW1jb3JkZXJUaW1lTGFwc2VRY2lmUHJvZmlsZShDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX1FDSUYpOworICAgICpsb3dUaW1lTGFwc2VQcm9maWxlID0gY3JlYXRlRGVmYXVsdENhbWNvcmRlclRpbWVMYXBzZVFjaWZQcm9maWxlKAorICAgICAgICAgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9MT1cpOworICAgICpsb3dTcGVjaWZpY1RpbWVMYXBzZVByb2ZpbGUgPSBjcmVhdGVEZWZhdWx0Q2FtY29yZGVyVGltZUxhcHNlUWNpZlByb2ZpbGUoCisgICAgICAgICAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX1FDSUYpOwogfQogCiAvKnN0YXRpYyovIHZvaWQKIE1lZGlhUHJvZmlsZXM6OmNyZWF0ZURlZmF1bHRDYW1jb3JkZXJUaW1lTGFwc2VIaWdoUHJvZmlsZXMoCiAgICAgICAgIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUgKipoaWdoVGltZUxhcHNlUHJvZmlsZSwKICAgICAgICAgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSAqKmhpZ2hTcGVjaWZpY1RpbWVMYXBzZVByb2ZpbGUpIHsKLSAgICAqaGlnaFRpbWVMYXBzZVByb2ZpbGUgPSBjcmVhdGVEZWZhdWx0Q2FtY29yZGVyVGltZUxhcHNlNDgwcFByb2ZpbGUoQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9ISUdIKTsKLSAgICAqaGlnaFNwZWNpZmljVGltZUxhcHNlUHJvZmlsZSA9IGNyZWF0ZURlZmF1bHRDYW1jb3JkZXJUaW1lTGFwc2U0ODBwUHJvZmlsZShDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzQ4MFApOworICAgICpoaWdoVGltZUxhcHNlUHJvZmlsZSA9IGNyZWF0ZURlZmF1bHRDYW1jb3JkZXJUaW1lTGFwc2U0ODBwUHJvZmlsZSgKKyAgICAgICAgICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfSElHSCk7CisgICAgKmhpZ2hTcGVjaWZpY1RpbWVMYXBzZVByb2ZpbGUgPSBjcmVhdGVEZWZhdWx0Q2FtY29yZGVyVGltZUxhcHNlNDgwcFByb2ZpbGUoCisgICAgICAgICAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzQ4MFApOwogfQogCiAvKnN0YXRpYyovIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUqCkBAIC04MDksNyArNzYzLDggQEAKIAogICAgIC8vIGhpZ2ggY2FtY29yZGVyIHRpbWUgbGFwc2UgcHJvZmlsZXMuCiAgICAgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSAqaGlnaFRpbWVMYXBzZVByb2ZpbGUsICpoaWdoU3BlY2lmaWNUaW1lTGFwc2VQcm9maWxlOwotICAgIGNyZWF0ZURlZmF1bHRDYW1jb3JkZXJUaW1lTGFwc2VIaWdoUHJvZmlsZXMoJmhpZ2hUaW1lTGFwc2VQcm9maWxlLCAmaGlnaFNwZWNpZmljVGltZUxhcHNlUHJvZmlsZSk7CisgICAgY3JlYXRlRGVmYXVsdENhbWNvcmRlclRpbWVMYXBzZUhpZ2hQcm9maWxlcygmaGlnaFRpbWVMYXBzZVByb2ZpbGUsCisgICAgICAgICAgICAmaGlnaFNwZWNpZmljVGltZUxhcHNlUHJvZmlsZSk7CiAgICAgcHJvZmlsZXMtPm1DYW1jb3JkZXJQcm9maWxlcy5hZGQoaGlnaFRpbWVMYXBzZVByb2ZpbGUpOwogICAgIHByb2ZpbGVzLT5tQ2FtY29yZGVyUHJvZmlsZXMuYWRkKGhpZ2hTcGVjaWZpY1RpbWVMYXBzZVByb2ZpbGUpOwogCkBAIC04NjgsMzIgKzgyMyw2IEBACiAgICAgcHJvZmlsZXMtPm1JbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscy5hZGQobGV2ZWxzKTsKIH0KIAotLypzdGF0aWMqLyB2b2lkCi1NZWRpYVByb2ZpbGVzOjpjcmVhdGVEZWZhdWx0VmlkZW9FZGl0b3JDYXAoTWVkaWFQcm9maWxlcyAqcHJvZmlsZXMpCi17Ci0gICAgcHJvZmlsZXMtPm1WaWRlb0VkaXRvckNhcCA9Ci0gICAgICAgIG5ldyBNZWRpYVByb2ZpbGVzOjpWaWRlb0VkaXRvckNhcCgKLSAgICAgICAgICAgICAgICBWSURFT0VESVRPUl9ERUZBVUxUX01BWF9JTlBVVF9GUkFNRV9XSURUSCwKLSAgICAgICAgICAgICAgICBWSURFT0VESVRPUl9ERUZVQUxUX01BWF9JTlBVVF9GUkFNRV9IRUlHSFQsCi0gICAgICAgICAgICAgICAgVklERU9FRElUT1JfREVGQVVMVF9NQVhfT1VUUFVUX0ZSQU1FX1dJRFRILAotICAgICAgICAgICAgICAgIFZJREVPRURJVE9SX0RFRlVBTFRfTUFYX09VVFBVVF9GUkFNRV9IRUlHSFQsCi0gICAgICAgICAgICAgICAgVklERU9FRElUT1JfREVGQVVMVF9NQVhfUFJFRkVUQ0hfWVVWX0ZSQU1FUyk7Ci19Ci0vKnN0YXRpYyovIHZvaWQKLU1lZGlhUHJvZmlsZXM6OmNyZWF0ZURlZmF1bHRFeHBvcnRWaWRlb1Byb2ZpbGVzKE1lZGlhUHJvZmlsZXMgKnByb2ZpbGVzKQotewotICAgIC8vIENyZWF0ZSBkZWZhdWx0IHZpZGVvIGV4cG9ydCBwcm9maWxlcwotICAgIHByb2ZpbGVzLT5tVmlkZW9FZGl0b3JFeHBvcnRQcm9maWxlcy5hZGQoCi0gICAgICAgIG5ldyBFeHBvcnRWaWRlb1Byb2ZpbGUoVklERU9fRU5DT0RFUl9IMjYzLAotICAgICAgICAgICAgT01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19IMjYzTGV2ZWwxMCkpOwotICAgIHByb2ZpbGVzLT5tVmlkZW9FZGl0b3JFeHBvcnRQcm9maWxlcy5hZGQoCi0gICAgICAgIG5ldyBFeHBvcnRWaWRlb1Byb2ZpbGUoVklERU9fRU5DT0RFUl9NUEVHXzRfU1AsCi0gICAgICAgICAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDEpKTsKLSAgICBwcm9maWxlcy0+bVZpZGVvRWRpdG9yRXhwb3J0UHJvZmlsZXMuYWRkKAotICAgICAgICBuZXcgRXhwb3J0VmlkZW9Qcm9maWxlKFZJREVPX0VOQ09ERVJfSDI2NCwKLSAgICAgICAgICAgIE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDEzKSk7Ci19Ci0KIC8qc3RhdGljKi8gTWVkaWFQcm9maWxlcyoKIE1lZGlhUHJvZmlsZXM6OmNyZWF0ZURlZmF1bHRJbnN0YW5jZSgpCiB7CkBAIC05MDUsOCArODM0LDYgQEAKICAgICBjcmVhdGVEZWZhdWx0QXVkaW9EZWNvZGVycyhwcm9maWxlcyk7CiAgICAgY3JlYXRlRGVmYXVsdEVuY29kZXJPdXRwdXRGaWxlRm9ybWF0cyhwcm9maWxlcyk7CiAgICAgY3JlYXRlRGVmYXVsdEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzKHByb2ZpbGVzKTsKLSAgICBjcmVhdGVEZWZhdWx0VmlkZW9FZGl0b3JDYXAocHJvZmlsZXMpOwotICAgIGNyZWF0ZURlZmF1bHRFeHBvcnRWaWRlb1Byb2ZpbGVzKHByb2ZpbGVzKTsKICAgICByZXR1cm4gcHJvZmlsZXM7CiB9CiAKQEAgLTEwMDQsNTQgKzkzMSw2IEBACiAgICAgQUxPR0UoIlRoZSBnaXZlbiB2aWRlbyBlbmNvZGVyIHBhcmFtIG5hbWUgJXMgaXMgbm90IGZvdW5kIiwgbmFtZSk7CiAgICAgcmV0dXJuIC0xOwogfQotaW50IE1lZGlhUHJvZmlsZXM6OmdldFZpZGVvRWRpdG9yRXhwb3J0UGFyYW1CeU5hbWUoCi0gICAgY29uc3QgY2hhciAqbmFtZSwgaW50IGNvZGVjKSBjb25zdAotewotICAgIEFMT0dWKCJnZXRWaWRlb0VkaXRvckV4cG9ydFBhcmFtQnlOYW1lOiBuYW1lICVzIGNvZGVjICVkIiwgbmFtZSwgY29kZWMpOwotICAgIEV4cG9ydFZpZGVvUHJvZmlsZSAqZXhwb3J0UHJvZmlsZSA9IE5VTEw7Ci0gICAgaW50IGluZGV4ID0gLTE7Ci0gICAgZm9yIChzaXplX3QgaSA9MDsgaSA8IG1WaWRlb0VkaXRvckV4cG9ydFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGV4cG9ydFByb2ZpbGUgPSBtVmlkZW9FZGl0b3JFeHBvcnRQcm9maWxlc1tpXTsKLSAgICAgICAgaWYgKGV4cG9ydFByb2ZpbGUtPm1Db2RlYyA9PSBjb2RlYykgewotICAgICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGluZGV4ID09IC0xKSB7Ci0gICAgICAgIEFMT0dFKCJUaGUgZ2l2ZW4gdmlkZW8gZGVjb2RlciAlZCBpcyBub3QgZm91bmQiLCBjb2RlYyk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKCFzdHJjbXAoInZpZGVvZWRpdG9yLmV4cG9ydC5wcm9maWxlIiwgbmFtZSkpCi0gICAgICAgIHJldHVybiBleHBvcnRQcm9maWxlLT5tUHJvZmlsZTsKLSAgICBpZiAoIXN0cmNtcCgidmlkZW9lZGl0b3IuZXhwb3J0LmxldmVsIiwgbmFtZSkpCi0gICAgICAgIHJldHVybiBleHBvcnRQcm9maWxlLT5tTGV2ZWw7Ci0KLSAgICBBTE9HRSgiVGhlIGdpdmVuIHZpZGVvIGVkaXRvciBleHBvcnQgcGFyYW0gbmFtZSAlcyBpcyBub3QgZm91bmQiLCBuYW1lKTsKLSAgICByZXR1cm4gLTE7Ci19Ci1pbnQgTWVkaWFQcm9maWxlczo6Z2V0VmlkZW9FZGl0b3JDYXBQYXJhbUJ5TmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdAotewotICAgIEFMT0dWKCJnZXRWaWRlb0VkaXRvckNhcFBhcmFtQnlOYW1lOiAlcyIsIG5hbWUpOwotCi0gICAgaWYgKG1WaWRlb0VkaXRvckNhcCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJUaGUgbVZpZGVvRWRpdG9yQ2FwIGlzIG5vdCBjcmVhdGVkLCB0aGVuIGNyZWF0ZSBkZWZhdWx0IGNhcC4iKTsKLSAgICAgICAgY3JlYXRlRGVmYXVsdFZpZGVvRWRpdG9yQ2FwKHNJbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgaWYgKCFzdHJjbXAoInZpZGVvZWRpdG9yLmlucHV0LndpZHRoLm1heCIsIG5hbWUpKQotICAgICAgICByZXR1cm4gbVZpZGVvRWRpdG9yQ2FwLT5tTWF4SW5wdXRGcmFtZVdpZHRoOwotICAgIGlmICghc3RyY21wKCJ2aWRlb2VkaXRvci5pbnB1dC5oZWlnaHQubWF4IiwgbmFtZSkpCi0gICAgICAgIHJldHVybiBtVmlkZW9FZGl0b3JDYXAtPm1NYXhJbnB1dEZyYW1lSGVpZ2h0OwotICAgIGlmICghc3RyY21wKCJ2aWRlb2VkaXRvci5vdXRwdXQud2lkdGgubWF4IiwgbmFtZSkpCi0gICAgICAgIHJldHVybiBtVmlkZW9FZGl0b3JDYXAtPm1NYXhPdXRwdXRGcmFtZVdpZHRoOwotICAgIGlmICghc3RyY21wKCJ2aWRlb2VkaXRvci5vdXRwdXQuaGVpZ2h0Lm1heCIsIG5hbWUpKQotICAgICAgICByZXR1cm4gbVZpZGVvRWRpdG9yQ2FwLT5tTWF4T3V0cHV0RnJhbWVIZWlnaHQ7Ci0gICAgaWYgKCFzdHJjbXAoIm1heFByZWZldGNoWVVWRnJhbWVzIiwgbmFtZSkpCi0gICAgICAgIHJldHVybiBtVmlkZW9FZGl0b3JDYXAtPm1NYXhQcmVmZXRjaFlVVkZyYW1lczsKLQotICAgIEFMT0dFKCJUaGUgZ2l2ZW4gdmlkZW8gZWRpdG9yIHBhcmFtIG5hbWUgJXMgaXMgbm90IGZvdW5kIiwgbmFtZSk7Ci0gICAgcmV0dXJuIC0xOwotfQogCiBWZWN0b3I8YXVkaW9fZW5jb2Rlcj4gTWVkaWFQcm9maWxlczo6Z2V0QXVkaW9FbmNvZGVycygpIGNvbnN0CiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYVJlc291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhUmVzb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZWMwY2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVJlc291cmNlLmNwcApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhUmVzb3VyY2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFSZXNvdXJjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0IGNoYXIga1Jlc291cmNlU2VjdXJlQ29kZWNbXSA9ICJzZWN1cmUtY29kZWMiOworY29uc3QgY2hhciBrUmVzb3VyY2VOb25TZWN1cmVDb2RlY1tdID0gIm5vbi1zZWN1cmUtY29kZWMiOworY29uc3QgY2hhciBrUmVzb3VyY2VBdWRpb0NvZGVjW10gPSAiYXVkaW8tY29kZWMiOworY29uc3QgY2hhciBrUmVzb3VyY2VWaWRlb0NvZGVjW10gPSAidmlkZW8tY29kZWMiOworY29uc3QgY2hhciBrUmVzb3VyY2VHcmFwaGljTWVtb3J5W10gPSAiZ3JhcGhpYy1tZW1vcnkiOworCitNZWRpYVJlc291cmNlOjpNZWRpYVJlc291cmNlKCkgOiBtVmFsdWUoMCkge30KKworTWVkaWFSZXNvdXJjZTo6TWVkaWFSZXNvdXJjZShTdHJpbmc4IHR5cGUsIHVpbnQ2NF90IHZhbHVlKQorICAgICAgICA6IG1UeXBlKHR5cGUpLAorICAgICAgICAgIG1WYWx1ZSh2YWx1ZSkge30KKworTWVkaWFSZXNvdXJjZTo6TWVkaWFSZXNvdXJjZShTdHJpbmc4IHR5cGUsIFN0cmluZzggc3ViVHlwZSwgdWludDY0X3QgdmFsdWUpCisgICAgICAgIDogbVR5cGUodHlwZSksCisgICAgICAgICAgbVN1YlR5cGUoc3ViVHlwZSksCisgICAgICAgICAgbVZhbHVlKHZhbHVlKSB7fQorCit2b2lkIE1lZGlhUmVzb3VyY2U6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7CisgICAgbVR5cGUgPSBwYXJjZWwucmVhZFN0cmluZzgoKTsKKyAgICBtU3ViVHlwZSA9IHBhcmNlbC5yZWFkU3RyaW5nOCgpOworICAgIG1WYWx1ZSA9IHBhcmNlbC5yZWFkVWludDY0KCk7Cit9CisKK3ZvaWQgTWVkaWFSZXNvdXJjZTo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QgeworICAgIHBhcmNlbC0+d3JpdGVTdHJpbmc4KG1UeXBlKTsKKyAgICBwYXJjZWwtPndyaXRlU3RyaW5nOChtU3ViVHlwZSk7CisgICAgcGFyY2VsLT53cml0ZVVpbnQ2NChtVmFsdWUpOworfQorCitTdHJpbmc4IE1lZGlhUmVzb3VyY2U6OnRvU3RyaW5nKCkgY29uc3QgeworICAgIFN0cmluZzggc3RyOworICAgIHN0ci5hcHBlbmRGb3JtYXQoIiVzLyVzOiVsbHUiLCBtVHlwZS5zdHJpbmcoKSwgbVN1YlR5cGUuc3RyaW5nKCksICh1bnNpZ25lZCBsb25nIGxvbmcpbVZhbHVlKTsKKyAgICByZXR1cm4gc3RyOworfQorCitib29sIE1lZGlhUmVzb3VyY2U6Om9wZXJhdG9yPT0oY29uc3QgTWVkaWFSZXNvdXJjZSAmb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gKG90aGVyLm1UeXBlID09IG1UeXBlKSAmJiAob3RoZXIubVN1YlR5cGUgPT0gbVN1YlR5cGUpICYmIChvdGhlci5tVmFsdWUgPT0gbVZhbHVlKTsKK30KKworYm9vbCBNZWRpYVJlc291cmNlOjpvcGVyYXRvciE9KGNvbnN0IE1lZGlhUmVzb3VyY2UgJm90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFSZXNvdXJjZVBvbGljeS5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVJlc291cmNlUG9saWN5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjEwODI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFSZXNvdXJjZVBvbGljeS5jcHAKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYVJlc291cmNlUG9saWN5IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhUmVzb3VyY2VQb2xpY3kuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdCBjaGFyIGtQb2xpY3lTdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzW10gPSAic3VwcG9ydHMtbXVsdGlwbGUtc2VjdXJlLWNvZGVjcyI7Citjb25zdCBjaGFyIGtQb2xpY3lTdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlY1tdID0gInN1cHBvcnRzLXNlY3VyZS13aXRoLW5vbi1zZWN1cmUtY29kZWMiOworCitNZWRpYVJlc291cmNlUG9saWN5OjpNZWRpYVJlc291cmNlUG9saWN5KCkge30KKworTWVkaWFSZXNvdXJjZVBvbGljeTo6TWVkaWFSZXNvdXJjZVBvbGljeShTdHJpbmc4IHR5cGUsIFN0cmluZzggdmFsdWUpCisgICAgICAgIDogbVR5cGUodHlwZSksCisgICAgICAgICAgbVZhbHVlKHZhbHVlKSB7fQorCit2b2lkIE1lZGlhUmVzb3VyY2VQb2xpY3k6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7CisgICAgbVR5cGUgPSBwYXJjZWwucmVhZFN0cmluZzgoKTsKKyAgICBtVmFsdWUgPSBwYXJjZWwucmVhZFN0cmluZzgoKTsKK30KKwordm9pZCBNZWRpYVJlc291cmNlUG9saWN5Ojp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCB7CisgICAgcGFyY2VsLT53cml0ZVN0cmluZzgobVR5cGUpOworICAgIHBhcmNlbC0+d3JpdGVTdHJpbmc4KG1WYWx1ZSk7Cit9CisKK1N0cmluZzggTWVkaWFSZXNvdXJjZVBvbGljeTo6dG9TdHJpbmcoKSBjb25zdCB7CisgICAgU3RyaW5nOCBzdHI7CisgICAgc3RyLmFwcGVuZEZvcm1hdCgiJXM6JXMiLCBtVHlwZS5zdHJpbmcoKSwgbVZhbHVlLnN0cmluZygpKTsKKyAgICByZXR1cm4gc3RyOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmNwcAppbmRleCBkMzFmNzIxLi41NTRkYmFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmNwcApAQCAtMTczLDcgKzE3Myw3IEBACiAKICNlbHNlCiAvLyBEb2VzIG5vdGhpbmcKLXZvaWQgZHVtcE1lbW9yeUFkZHJlc3NlcyhpbnQgZmQpIHt9Cit2b2lkIGR1bXBNZW1vcnlBZGRyZXNzZXMoaW50IGZkIF9fdW51c2VkKSB7fQogCiAjZW5kaWYKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9TaW5nbGVTdGF0ZVF1ZXVlLmNwcCBiL21lZGlhL2xpYm1lZGlhL1NpbmdsZVN0YXRlUXVldWUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjQxMTg0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL1NpbmdsZVN0YXRlUXVldWUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8bmV3PgotI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KLSNpbmNsdWRlIDxtZWRpYS9TaW5nbGVTdGF0ZVF1ZXVlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4gU2luZ2xlU3RhdGVRdWV1ZTxUPjo6TXV0YXRvcjo6TXV0YXRvcihTaGFyZWQgKnNoYXJlZCkKLSAgICA6IG1TZXF1ZW5jZSgwKSwgbVNoYXJlZCgoU2hhcmVkICopIHNoYXJlZCkKLXsKLSAgICAvLyBleGFjdGx5IG9uZSBvZiBNdXRhdG9yIGFuZCBPYnNlcnZlciBtdXN0IGluaXRpYWxpemUsIGN1cnJlbnRseSBpdCBpcyBPYnNlcnZlcgotICAgIC8vc2hhcmVkLT5pbml0KCk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludDMyX3QgU2luZ2xlU3RhdGVRdWV1ZTxUPjo6TXV0YXRvcjo6cHVzaChjb25zdCBUJiB2YWx1ZSkKLXsKLSAgICBTaGFyZWQgKnNoYXJlZCA9IG1TaGFyZWQ7Ci0gICAgaW50MzJfdCBzZXF1ZW5jZSA9IG1TZXF1ZW5jZTsKLSAgICBzZXF1ZW5jZSsrOwotICAgIGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfc3RvcmUoc2VxdWVuY2UsICZzaGFyZWQtPm1TZXF1ZW5jZSk7Ci0gICAgc2hhcmVkLT5tVmFsdWUgPSB2YWx1ZTsKLSAgICBzZXF1ZW5jZSsrOwotICAgIGFuZHJvaWRfYXRvbWljX3JlbGVhc2Vfc3RvcmUoc2VxdWVuY2UsICZzaGFyZWQtPm1TZXF1ZW5jZSk7Ci0gICAgbVNlcXVlbmNlID0gc2VxdWVuY2U7Ci0gICAgLy8gY29uc2lkZXIgc2lnbmFsbGluZyBhIGZ1dGV4IGhlcmUsIGlmIHdlIGtub3cgdGhhdCBvYnNlcnZlciBpcyB3YWl0aW5nCi0gICAgcmV0dXJuIHNlcXVlbmNlOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiBib29sIFNpbmdsZVN0YXRlUXVldWU8VD46Ok11dGF0b3I6OmFjaygpCi17Ci0gICAgcmV0dXJuIG1TaGFyZWQtPm1BY2sgLSBtU2VxdWVuY2UgPT0gMDsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4gYm9vbCBTaW5nbGVTdGF0ZVF1ZXVlPFQ+OjpNdXRhdG9yOjphY2soaW50MzJfdCBzZXF1ZW5jZSkKLXsKLSAgICAvLyB0aGlzIHJlbGllcyBvbiAyJ3MgY29tcGxlbWVudCByb2xsb3ZlciB0byBkZXRlY3QgYW4gYW5jaWVudCBzZXF1ZW5jZSBudW1iZXIKLSAgICByZXR1cm4gbVNoYXJlZC0+bUFjayAtIHNlcXVlbmNlID49IDA7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNpbmdsZVN0YXRlUXVldWU8VD46Ok9ic2VydmVyOjpPYnNlcnZlcihTaGFyZWQgKnNoYXJlZCkKLSAgICA6IG1TZXF1ZW5jZSgwKSwgbVNlZWQoMSksIG1TaGFyZWQoKFNoYXJlZCAqKSBzaGFyZWQpCi17Ci0gICAgLy8gZXhhY3RseSBvbmUgb2YgTXV0YXRvciBhbmQgT2JzZXJ2ZXIgbXVzdCBpbml0aWFsaXplLCBjdXJyZW50bHkgaXQgaXMgT2JzZXJ2ZXIKLSAgICBzaGFyZWQtPmluaXQoKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4gYm9vbCBTaW5nbGVTdGF0ZVF1ZXVlPFQ+OjpPYnNlcnZlcjo6cG9sbChUJiB2YWx1ZSkKLXsKLSAgICBTaGFyZWQgKnNoYXJlZCA9IG1TaGFyZWQ7Ci0gICAgaW50MzJfdCBiZWZvcmUgPSBzaGFyZWQtPm1TZXF1ZW5jZTsKLSAgICBpZiAoYmVmb3JlID09IG1TZXF1ZW5jZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGZvciAoaW50IHRyaWVzID0gMDsgOyApIHsKLSAgICAgICAgY29uc3QgaW50IE1BWF9UUklFUyA9IDU7Ci0gICAgICAgIGlmIChiZWZvcmUgJiAxKSB7Ci0gICAgICAgICAgICBpZiAoKyt0cmllcyA+PSBNQVhfVFJJRVMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiZWZvcmUgPSBzaGFyZWQtPm1TZXF1ZW5jZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFuZHJvaWRfbWVtb3J5X2JhcnJpZXIoKTsKLSAgICAgICAgICAgIFQgdGVtcCA9IHNoYXJlZC0+bVZhbHVlOwotICAgICAgICAgICAgaW50MzJfdCBhZnRlciA9IGFuZHJvaWRfYXRvbWljX3JlbGVhc2VfbG9hZCgmc2hhcmVkLT5tU2VxdWVuY2UpOwotICAgICAgICAgICAgaWYgKGFmdGVyID09IGJlZm9yZSkgewotICAgICAgICAgICAgICAgIHZhbHVlID0gdGVtcDsKLSAgICAgICAgICAgICAgICBzaGFyZWQtPm1BY2sgPSBiZWZvcmU7Ci0gICAgICAgICAgICAgICAgbVNlcXVlbmNlID0gYmVmb3JlOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCsrdHJpZXMgPj0gTUFYX1RSSUVTKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmVmb3JlID0gYWZ0ZXI7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLSNpZiAwCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiBTaW5nbGVTdGF0ZVF1ZXVlPFQ+OjpTaW5nbGVTdGF0ZVF1ZXVlKHZvaWQgLypTaGFyZWQqLyAqc2hhcmVkKQotewotICAgICgoU2hhcmVkICopIHNoYXJlZCktPmluaXQoKTsKLX0KLSNlbmRpZgotCi19ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotLy8gaGFjayBmb3IgZ2NjCi0jaWZkZWYgU0lOR0xFX1NUQVRFX1FVRVVFX0lOU1RBTlRJQVRJT05TCi0jaW5jbHVkZSBTSU5HTEVfU1RBVEVfUVVFVUVfSU5TVEFOVElBVElPTlMKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvU2luZ2xlU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLmNwcCBiL21lZGlhL2xpYm1lZGlhL1NpbmdsZVN0YXRlUXVldWVJbnN0YW50aWF0aW9ucy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNjVjOGMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEvU2luZ2xlU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8bWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5oPgotI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvU3RhdGljQXVkaW9UcmFja1N0YXRlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9UaW1lc3RhbXAuaD4KLQotLy8gRklYTUUgaGFjayBmb3IgZ2NjCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdGVtcGxhdGUgY2xhc3MgU2luZ2xlU3RhdGVRdWV1ZTxTdGF0aWNBdWRpb1RyYWNrU3RhdGU+OyAvLyB0eXBlZGVmIFN0YXRpY0F1ZGlvVHJhY2tTaW5nbGVTdGF0ZVF1ZXVlCi10ZW1wbGF0ZSBjbGFzcyBTaW5nbGVTdGF0ZVF1ZXVlPEF1ZGlvVGltZXN0YW1wPjsgICAgICAgIC8vIHR5cGVkZWYgQXVkaW9UaW1lc3RhbXBTaW5nbGVTdGF0ZVF1ZXVlCi0KLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL1N0cmluZ0FycmF5LmNwcCBiL21lZGlhL2xpYm1lZGlhL1N0cmluZ0FycmF5LmNwcAppbmRleCA1ZjViNTdhLi5iMmU1OTA3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9TdHJpbmdBcnJheS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvU3RyaW5nQXJyYXkuY3BwCkBAIC0xNiw3ICsxNiw3IEBACiAKIC8vCiAvLyBTb3J0YWJsZSBhcnJheSBvZiBzdHJpbmdzLiAgU1RMLWlzaCwgYnV0IFNUTC1mcmVlLgotLy8gIAorLy8KIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtMTEwLDQgKzExMCw0IEBACiB9CiAKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL1RvbmVHZW5lcmF0b3IuY3BwIGIvbWVkaWEvbGlibWVkaWEvVG9uZUdlbmVyYXRvci5jcHAKaW5kZXggMmNjNDY4NS4uNmRhNTM0OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvVG9uZUdlbmVyYXRvci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvVG9uZUdlbmVyYXRvci5jcHAKQEAgLTk4NCw3ICs5ODQsNiBAQAogICAgICAgICAgICAgaWYgKChtU3RhcnRUaW1lLnR2X3NlYyAhPSAwKSAmJiAoY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZzdG9wVGltZSkgPT0gMCkpIHsKICAgICAgICAgICAgICAgICB0aW1lX3Qgc2VjID0gc3RvcFRpbWUudHZfc2VjIC0gbVN0YXJ0VGltZS50dl9zZWM7CiAgICAgICAgICAgICAgICAgbG9uZyBuc2VjID0gc3RvcFRpbWUudHZfbnNlYyAtIG1TdGFydFRpbWUudHZfbnNlYzsKLSAgICAgICAgICAgICAgICBsb25nIGR1cmF0aW9uTXM7CiAgICAgICAgICAgICAgICAgaWYgKG5zZWMgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgIC0tc2VjOwogICAgICAgICAgICAgICAgICAgICBuc2VjICs9IDEwMDAwMDAwMDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9WaXN1YWxpemVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL1Zpc3VhbGl6ZXIuY3BwCmluZGV4IGY5MWUzZTQuLmY1YzFiMWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL1Zpc3VhbGl6ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL1Zpc3VhbGl6ZXIuY3BwCkBAIC0zNCwxMSArMzQsMTIgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVZpc3VhbGl6ZXI6OlZpc3VhbGl6ZXIgKGludDMyX3QgcHJpb3JpdHksCitWaXN1YWxpemVyOjpWaXN1YWxpemVyIChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCiAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYsCiAgICAgICAgICB2b2lkKiB1c2VyLAogICAgICAgICAgaW50IHNlc3Npb25JZCkKLSAgICA6ICAgQXVkaW9FZmZlY3QoU0xfSUlEX1ZJU1VBTElaQVRJT04sIE5VTEwsIHByaW9yaXR5LCBjYmYsIHVzZXIsIHNlc3Npb25JZCksCisgICAgOiAgIEF1ZGlvRWZmZWN0KFNMX0lJRF9WSVNVQUxJWkFUSU9OLCBvcFBhY2thZ2VOYW1lLCBOVUxMLCBwcmlvcml0eSwgY2JmLCB1c2VyLCBzZXNzaW9uSWQpLAogICAgICAgICBtQ2FwdHVyZVJhdGUoQ0FQVFVSRV9SQVRFX0RFRiksCiAgICAgICAgIG1DYXB0dXJlU2l6ZShDQVBUVVJFX1NJWkVfREVGKSwKICAgICAgICAgbVNhbXBsZVJhdGUoNDQxMDAwMDApLApAQCAtNTMsMTIgKzU0LDggQEAKIFZpc3VhbGl6ZXI6On5WaXN1YWxpemVyKCkKIHsKICAgICBBTE9HVigiVmlzdWFsaXplcjo6flZpc3VhbGl6ZXIoKSIpOwotICAgIGlmIChtQ2FwdHVyZVRocmVhZCAhPSBOVUxMKSB7Ci0gICAgICAgIG1DYXB0dXJlVGhyZWFkLT5yZXF1ZXN0RXhpdEFuZFdhaXQoKTsKLSAgICAgICAgbUNhcHR1cmVUaHJlYWQuY2xlYXIoKTsKLSAgICB9Ci0gICAgbUNhcHR1cmVDYWxsQmFjayA9IE5VTEw7Ci0gICAgbUNhcHR1cmVGbGFncyA9IDA7CisgICAgc2V0RW5hYmxlZChmYWxzZSk7CisgICAgc2V0Q2FwdHVyZUNhbGxCYWNrKE5VTEwsIE5VTEwsIDAsIDAsIHRydWUpOwogfQogCiBzdGF0dXNfdCBWaXN1YWxpemVyOjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkKQEAgLTk4LDE0ICs5NSwxNCBAQAogfQogCiBzdGF0dXNfdCBWaXN1YWxpemVyOjpzZXRDYXB0dXJlQ2FsbEJhY2soY2FwdHVyZV9jYmtfdCBjYmssIHZvaWQqIHVzZXIsIHVpbnQzMl90IGZsYWdzLAotICAgICAgICB1aW50MzJfdCByYXRlKQorICAgICAgICB1aW50MzJfdCByYXRlLCBib29sIGZvcmNlKQogewogICAgIGlmIChyYXRlID4gQ0FQVFVSRV9SQVRFX01BWCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhcHR1cmVMb2NrKTsKIAotICAgIGlmIChtRW5hYmxlZCkgeworICAgIGlmIChmb3JjZSB8fCBtRW5hYmxlZCkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC00MjksNCArNDI2LDQgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9kb2NzL01ha2VmaWxlIGIvbWVkaWEvbGlibWVkaWEvZG9jcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGRiYzliCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvZG9jcy9NYWtlZmlsZQpAQCAtMCwwICsxLDIgQEAKK3BhdXNlZC5wbmcgOiBwYXVzZWQuZG90CisJZG90IC1UcG5nIDwgJDwgPiAkQApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvZG9jcy9wYXVzZWQuZG90IGIvbWVkaWEvbGlibWVkaWEvZG9jcy9wYXVzZWQuZG90Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZTE3NzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9kb2NzL3BhdXNlZC5kb3QKQEAgLTAsMCArMSw4NSBAQAorZGlncmFwaCBwYXVzZWQgeworaW5pdGlhbCBbbGFiZWw9IklOSVRJQUxcblwKK21JZ25vcmVOZXh0UGF1c2VkSW50ID0gZmFsc2VcblwKK21QYXVzZWQgPSBmYWxzZVxuXAorbVBhdXNlZEludCA9IGZhbHNlIl07CisKK3Jlc3VtZV9ib2R5IFtsYWJlbD0ibUlnbm9yZU5leHRQYXVzZWRJbnQgPSB0cnVlXG5pZiAobVBhdXNlZCB8fCBtUGF1c2VkSW50KSJdOworcmVzdW1lX3BhdXNlZCBbbGFiZWw9Im1QYXVzZWQgPSBmYWxzZVxubVBhdXNlZEludCA9IGZhbHNlXG5zaWduYWwoKSJdOworcmVzdW1lX3BhdXNlZCAtPiByZXN1bWVfbWVyZ2VkOworcmVzdW1lX21lcmdlZCBbbGFiZWw9InJldHVybiJdOworCitBcHBsaWNhdGlvbiAtPiBBVHN0b3A7CitBVHN0b3AgW2xhYmVsPSJBdWRpb1RyYWNrOjpzdG9wKCkiXTsKK0FUc3RvcCAtPiBwYXVzZTsKK0FwcGxpY2F0aW9uIC0+IEFUcGF1c2U7CitBVHBhdXNlIFtsYWJlbD0iQXVkaW9UcmFjazo6cGF1c2UoKSJdOworQVRwYXVzZSAtPiBwYXVzZTsKK0FUc3RhcnQgLT4gcmVzdW1lOworQVRzdGFydCBbbGFiZWw9IkF1ZGlvVHJhY2s6OnN0YXJ0KCkiXTsKK2Rlc3RydWN0b3IgW2xhYmVsPSJ+QXVkaW9UcmFjaygpIl07CitkZXN0cnVjdG9yIC0+IHJlcXVlc3RFeGl0OworcmVxdWVzdEV4aXQgW2xhYmVsPSJBdWRpb1RyYWNrVGhyZWFkOjpyZXF1ZXN0RXhpdCgpIl07CityZXF1ZXN0RXhpdCAtPiByZXN1bWU7CitBcHBsaWNhdGlvbiAtPiBBVHNldE1hcmtlclBvc2l0aW9uCitBVHNldE1hcmtlclBvc2l0aW9uIFtsYWJlbD0iQXVkaW9UcmFjazo6c2V0TWFya2VyUG9zaXRpb24oKVxuW3NldHMgbWFya2VyIHZhcmlhYmxlc10iXTsKK0FUc2V0TWFya2VyUG9zaXRpb24gLT4gQVRUd2FrZQorQXBwbGljYXRpb24gLT4gQVRzZXRQb3NpdGlvblVwZGF0ZVBlcmlvZAorQVRzZXRQb3NpdGlvblVwZGF0ZVBlcmlvZCBbbGFiZWw9IkF1ZGlvVHJhY2s6OnNldFBvc2l0aW9uVXBkYXRlUGVyaW9kKClcbltzZXRzIHVwZGF0ZSBwZXJpb2QgdmFyaWFibGVzXSJdOworQVRzZXRQb3NpdGlvblVwZGF0ZVBlcmlvZCAtPiBBVFR3YWtlCitBcHBsaWNhdGlvbiAtPiBBVHN0YXJ0OworCityZXN1bWUgW2xhYmVsPSJBdWRpb1RyYWNrVGhyZWFkOjpyZXN1bWUoKSJdOworcmVzdW1lIC0+IHJlc3VtZV9ib2R5OworCityZXN1bWVfYm9keSAtPiByZXN1bWVfcGF1c2VkIFtsYWJlbD0idHJ1ZSJdOworcmVzdW1lX2JvZHkgLT4gcmVzdW1lX21lcmdlZCBbbGFiZWw9ImZhbHNlIl07CisKK0FUVHdha2UgW2xhYmVsPSJBdWRpb1RyYWNrVGhyZWFkOjp3YWtlKClcbmlmICghbVBhdXNlZCAmJiBtUGF1c2VkSW50ICYmIG1QYXVzZWROcyA+IDApIl07CitBVFR3YWtlLT4gQVRUV2FrZV93YWtlYWJsZSBbbGFiZWw9InRydWUiXTsKK0FUVFdha2Vfd2FrZWFibGUgW2xhYmVsPSJtSWdub3JlTmV4dFBhdXNlZEludCA9IHRydWVcbm1QYXVzZWRJbnQgPSBmYWxzZVxuc2lnbmFsKCkiXTsKK0FUVHdha2UtPiBBVFRXYWtlX2Nhbm5vdHdha2UgW2xhYmVsPSJmYWxzZSJdCitBVFRXYWtlX2Nhbm5vdHdha2UgW2xhYmVsPSJpZ25vcmUiXTsKKworcGF1c2UgW2xhYmVsPSJtUGF1c2VkID0gdHJ1ZSJdOworcGF1c2UgLT4gcmV0dXJuOworCit0aHJlYWRMb29wIFtsYWJlbD0iQXVkaW9UcmFja1RocmVhZDo6dGhyZWFkTG9vcCgpXG5FTlRSWSJdOwordGhyZWFkTG9vcCAtPiB0aHJlYWRMb29wXzE7Cit0aHJlYWRMb29wXzEgW2xhYmVsPSJpZiAobVBhdXNlZCkiXTsKK3RocmVhZExvb3BfMSAtPiB0aHJlYWRMb29wXzFfdHJ1ZSBbbGFiZWw9InRydWUiXTsKK3RocmVhZExvb3BfMSAtPiB0aHJlYWRMb29wXzIgW2xhYmVsPSJmYWxzZSJdOwordGhyZWFkTG9vcF8xX3RydWUgW2xhYmVsPSJ3YWl0KClcbnJldHVybiB0cnVlIl07Cit0aHJlYWRMb29wXzIgW2xhYmVsPSJpZiAobUlnbm9yZU5leHRQYXVzZWRJbnQpIl07Cit0aHJlYWRMb29wXzIgLT4gdGhyZWFkTG9vcF8yX3RydWUgW2xhYmVsPSJ0cnVlIl07Cit0aHJlYWRMb29wXzIgLT4gdGhyZWFkTG9vcF8zIFtsYWJlbD0iZmFsc2UiXTsKK3RocmVhZExvb3BfMl90cnVlIFtsYWJlbD0ibUlnbm9yZU5leHRQYXVzZWRJbnQgPSBmYWxzZVxubVBhdXNlZEludCA9IGZhbHNlIl07Cit0aHJlYWRMb29wXzJfdHJ1ZSAtPiB0aHJlYWRMb29wXzM7Cit0aHJlYWRMb29wXzMgW2xhYmVsPSJpZiAobVBhdXNlZEludCkiXTsKK3RocmVhZExvb3BfMyAtPiB0aHJlYWRMb29wXzNfdHJ1ZSBbbGFiZWw9InRydWUiXTsKK3RocmVhZExvb3BfMyAtPiB0aHJlYWRMb29wXzQgW2xhYmVsPSJmYWxzZSJdOwordGhyZWFkTG9vcF8zX3RydWUgW2xhYmVsPSJ3YWl0KClcbm1QYXVzZWRJbnQgPSBmYWxzZVxucmV0dXJuIHRydWUiXTsKK3RocmVhZExvb3BfNCBbbGFiZWw9ImlmIChleGl0UGVuZGluZykiXTsKK3RocmVhZExvb3BfNCAtPiB0aHJlYWRMb29wXzRfdHJ1ZSBbbGFiZWw9InRydWUiXTsKK3RocmVhZExvb3BfNCAtPiB0aHJlYWRMb29wXzUgW2xhYmVsPSJmYWxzZSJdOwordGhyZWFkTG9vcF80X3RydWUgW2xhYmVsPSJyZXR1cm4gZmFsc2UiXTsKK3RocmVhZExvb3BfNSBbbGFiZWw9Im5zID0gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkiXTsKK3RocmVhZExvb3BfNSAtPiB0aHJlYWRMb29wXzY7Cit0aHJlYWRMb29wXzYgW2xhYmVsPSJjYXNlIG5zIl07Cit0aHJlYWRMb29wXzYgLT4gdGhyZWFkTG9vcF82XzAgW2xhYmVsPSIwIl07Cit0aHJlYWRMb29wXzYgLT4gdGhyZWFkTG9vcF82X05TX0lOQUNUSVZFIFtsYWJlbD0iTlNfSU5BQ1RJVkUiXTsKK3RocmVhZExvb3BfNiAtPiB0aHJlYWRMb29wXzZfTlNfTkVWRVIgW2xhYmVsPSJOU19ORVZFUiJdOwordGhyZWFkTG9vcF82IC0+IHRocmVhZExvb3BfNl9OU19XSEVORVZFUiBbbGFiZWw9Ik5TX1dIRU5FVkVSIl07Cit0aHJlYWRMb29wXzYgLT4gdGhyZWFkTG9vcF82X2RlZmF1bHQgW2xhYmVsPSJkZWZhdWx0Il07Cit0aHJlYWRMb29wXzZfZGVmYXVsdCBbbGFiZWw9ImlmIChucyA8IDApIl07Cit0aHJlYWRMb29wXzZfZGVmYXVsdCAtPiB0aHJlYWRMb29wXzZfZGVmYXVsdF90cnVlIFtsYWJlbD0idHJ1ZSJdOwordGhyZWFkTG9vcF82X2RlZmF1bHQgLT4gdGhyZWFkTG9vcF82X2RlZmF1bHRfZmFsc2UgW2xhYmVsPSJmYWxzZSJdOwordGhyZWFkTG9vcF82X2RlZmF1bHRfdHJ1ZSBbbGFiZWw9IkZBVEFMIl07Cit0aHJlYWRMb29wXzZfZGVmYXVsdF9mYWxzZSBbbGFiZWw9InBhdXNlSW50ZXJuYWwobnMpIFt3YWtlKCktYWJsZV1cbm1QYXVzZWRJbnRlcm5hbCA9IHRydWVcbm1QYXVzZWROcyA9IG5zXG5yZXR1cm4gdHJ1ZSJdOwordGhyZWFkTG9vcF82XzAgW2xhYmVsPSJyZXR1cm4gdHJ1ZSJdOwordGhyZWFkTG9vcF82X05TX0lOQUNUSVZFIFtsYWJlbD0icGF1c2VJbnRlcm5hbCgpXG5tUGF1c2VkSW50ZXJuYWwgPSB0cnVlXG5tUGF1c2VkTnMgPSAwXG5yZXR1cm4gdHJ1ZSJdOwordGhyZWFkTG9vcF82X05TX05FVkVSIFtsYWJlbD0icmV0dXJuIGZhbHNlIl07Cit0aHJlYWRMb29wXzZfTlNfV0hFTkVWRVIgW2xhYmVsPSJucyA9IDFzIl07Cit0aHJlYWRMb29wXzZfTlNfV0hFTkVWRVIgLT4gdGhyZWFkTG9vcF82X2RlZmF1bHRfZmFsc2U7CisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5jcHAKaW5kZXggZjZjYWIzOC4uMDhhOWU2YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5jcHAKQEAgLTEyOSw2ICsxMjksMTggQEAKICAgICByZXR1cm4gbVJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShmZCwgb2Zmc2V0LCBsZW5ndGgpOwogfQogCitzdGF0dXNfdCBNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpzZXREYXRhU291cmNlKAorICAgIGNvbnN0IHNwPElEYXRhU291cmNlPiYgZGF0YVNvdXJjZSkKK3sKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZShJRGF0YVNvdXJjZSkiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUmV0cmlldmVyID09IDApIHsKKyAgICAgICAgQUxPR0UoInJldHJpZXZlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICByZXR1cm4gbVJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShkYXRhU291cmNlKTsKK30KKwogc3A8SU1lbW9yeT4gTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6Z2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pCiB7CiAgICAgQUxPR1YoImdldEZyYW1lQXRUaW1lOiB0aW1lKCUiIFBSSWQ2NCAiIHVzKSBvcHRpb24oJWQpIiwgdGltZVVzLCBvcHRpb24pOwpAQCAtMTc2LDQgKzE4OCw0IEBACiAgICAgfQogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCmluZGV4IDA1Yzg5ZWQuLjUwMmFiMmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKQEAgLTMyLDcgKzMyLDEwIEBACiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KIAogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgorI2luY2x1ZGUgPG1lZGlhL0FWU3luY1NldHRpbmdzLmg+CisjaW5jbHVkZSA8bWVkaWEvSURhdGFTb3VyY2UuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+CiAKQEAgLTE5NCw2ICsxOTcsMjIgQEAKICAgICByZXR1cm4gZXJyOwogfQogCitzdGF0dXNfdCBNZWRpYVBsYXllcjo6c2V0RGF0YVNvdXJjZShjb25zdCBzcDxJRGF0YVNvdXJjZT4gJnNvdXJjZSkKK3sKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZShJRGF0YVNvdXJjZSkiKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgIGNvbnN0IHNwPElNZWRpYVBsYXllclNlcnZpY2U+JiBzZXJ2aWNlKGdldE1lZGlhUGxheWVyU2VydmljZSgpKTsKKyAgICBpZiAoc2VydmljZSAhPSAwKSB7CisgICAgICAgIHNwPElNZWRpYVBsYXllcj4gcGxheWVyKHNlcnZpY2UtPmNyZWF0ZSh0aGlzLCBtQXVkaW9TZXNzaW9uSWQpKTsKKyAgICAgICAgaWYgKChOT19FUlJPUiAhPSBkb1NldFJldHJhbnNtaXRFbmRwb2ludChwbGF5ZXIpKSB8fAorICAgICAgICAgICAgKE5PX0VSUk9SICE9IHBsYXllci0+c2V0RGF0YVNvdXJjZShzb3VyY2UpKSkgeworICAgICAgICAgICAgcGxheWVyLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gYXR0YWNoTmV3UGxheWVyKHBsYXllcik7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKIHN0YXR1c190IE1lZGlhUGxheWVyOjppbnZva2UoY29uc3QgUGFyY2VsJiByZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0yNDAsMTAgKzI1OSwxMSBAQAogLy8gbXVzdCBjYWxsIHdpdGggbG9jayBoZWxkCiBzdGF0dXNfdCBNZWRpYVBsYXllcjo6cHJlcGFyZUFzeW5jX2woKQogewotICAgIGlmICggKG1QbGF5ZXIgIT0gMCkgJiYgKCBtQ3VycmVudFN0YXRlICYgKCBNRURJQV9QTEFZRVJfSU5JVElBTElaRUQgfCBNRURJQV9QTEFZRVJfU1RPUFBFRCkgKSApIHsKLSAgICAgICAgbVBsYXllci0+c2V0QXVkaW9TdHJlYW1UeXBlKG1TdHJlYW1UeXBlKTsKKyAgICBpZiAoIChtUGxheWVyICE9IDApICYmICggbUN1cnJlbnRTdGF0ZSAmIChNRURJQV9QTEFZRVJfSU5JVElBTElaRUQgfCBNRURJQV9QTEFZRVJfU1RPUFBFRCkgKSApIHsKICAgICAgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgIT0gTlVMTCkgewogICAgICAgICAgICAgbVBsYXllci0+c2V0UGFyYW1ldGVyKEtFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUywgKm1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBsYXllci0+c2V0QXVkaW9TdHJlYW1UeXBlKG1TdHJlYW1UeXBlKTsKICAgICAgICAgfQogICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSX1BSRVBBUklORzsKICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnByZXBhcmVBc3luYygpOwpAQCAtMzcxLDYgKzM5MSw5IEBACiAgICAgICAgIGlmICgobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUl9TVEFSVEVEKSAmJiAhIHRlbXApIHsKICAgICAgICAgICAgIEFMT0dFKCJpbnRlcm5hbC9leHRlcm5hbCBzdGF0ZSBtaXNtYXRjaCBjb3JyZWN0ZWQiKTsKICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVJfUEFVU0VEOworICAgICAgICB9IGVsc2UgaWYgKChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSX1BBVVNFRCkgJiYgdGVtcCkgeworICAgICAgICAgICAgQUxPR0UoImludGVybmFsL2V4dGVybmFsIHN0YXRlIG1pc21hdGNoIGNvcnJlY3RlZCIpOworICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUl9TVEFSVEVEOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0ZW1wOwogICAgIH0KQEAgLTM3OCw2ICs0MDEsNTIgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK3N0YXR1c190IE1lZGlhUGxheWVyOjpzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlJiByYXRlKQoreworICAgIEFMT0dWKCJzZXRQbGF5YmFja1NldHRpbmdzOiAlZiAlZiAlZCAlZCIsCisgICAgICAgICAgICByYXRlLm1TcGVlZCwgcmF0ZS5tUGl0Y2gsIHJhdGUubUZhbGxiYWNrTW9kZSwgcmF0ZS5tU3RyZXRjaE1vZGUpOworICAgIC8vIE5lZ2F0aXZlIHNwZWVkIGFuZCBwaXRjaCBkb2VzIG5vdCBtYWtlIHNlbnNlLiBGdXJ0aGVyIHZhbGlkYXRpb24gd2lsbAorICAgIC8vIGJlIGRvbmUgYnkgdGhlIHJlc3BlY3RpdmUgbWVkaWFwbGF5ZXJzLgorICAgIGlmIChyYXRlLm1TcGVlZCA8IDAuZiB8fCByYXRlLm1QaXRjaCA8IDAuZikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzdGF0dXNfdCBlcnIgPSBtUGxheWVyLT5zZXRQbGF5YmFja1NldHRpbmdzKHJhdGUpOworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgaWYgKHJhdGUubVNwZWVkID09IDAuZiAmJiBtQ3VycmVudFN0YXRlID09IE1FRElBX1BMQVlFUl9TVEFSVEVEKSB7CisgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSX1BBVVNFRDsKKyAgICAgICAgfSBlbHNlIGlmIChyYXRlLm1TcGVlZCAhPSAwLmYgJiYgbUN1cnJlbnRTdGF0ZSA9PSBNRURJQV9QTEFZRVJfUEFVU0VEKSB7CisgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSX1NUQVJURUQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OmdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUqIHJhdGUgLyogbm9ubnVsbCAqLykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVBsYXllci0+Z2V0UGxheWJhY2tTZXR0aW5ncyhyYXRlKTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OnNldFN5bmNTZXR0aW5ncyhjb25zdCBBVlN5bmNTZXR0aW5ncyYgc3luYywgZmxvYXQgdmlkZW9GcHNIaW50KQoreworICAgIEFMT0dWKCJzZXRTeW5jU2V0dGluZ3M6ICV1ICV1ICVmICVmIiwKKyAgICAgICAgICAgIHN5bmMubVNvdXJjZSwgc3luYy5tQXVkaW9BZGp1c3RNb2RlLCBzeW5jLm1Ub2xlcmFuY2UsIHZpZGVvRnBzSGludCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBsYXllciA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1QbGF5ZXItPnNldFN5bmNTZXR0aW5ncyhzeW5jLCB2aWRlb0Zwc0hpbnQpOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjo6Z2V0U3luY1NldHRpbmdzKAorICAgICAgICBBVlN5bmNTZXR0aW5ncyogc3luYyAvKiBub25udWxsICovLCBmbG9hdCogdmlkZW9GcHMgLyogbm9ubnVsbCAqLykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVBsYXllci0+Z2V0U3luY1NldHRpbmdzKHN5bmMsIHZpZGVvRnBzKTsKK30KKwogc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OmdldFZpZGVvV2lkdGgoaW50ICp3KQogewogICAgIEFMT0dWKCJnZXRWaWRlb1dpZHRoIik7CkBAIC00MTQsNyArNDgzLDggQEAKIHN0YXR1c190IE1lZGlhUGxheWVyOjpnZXREdXJhdGlvbl9sKGludCAqbXNlYykKIHsKICAgICBBTE9HVigiZ2V0RHVyYXRpb25fbCIpOwotICAgIGJvb2wgaXNWYWxpZFN0YXRlID0gKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSX1BSRVBBUkVEIHwgTUVESUFfUExBWUVSX1NUQVJURUQgfCBNRURJQV9QTEFZRVJfUEFVU0VEIHwgTUVESUFfUExBWUVSX1NUT1BQRUQgfCBNRURJQV9QTEFZRVJfUExBWUJBQ0tfQ09NUExFVEUpKTsKKyAgICBib29sIGlzVmFsaWRTdGF0ZSA9IChtQ3VycmVudFN0YXRlICYgKE1FRElBX1BMQVlFUl9QUkVQQVJFRCB8IE1FRElBX1BMQVlFUl9TVEFSVEVEIHwKKyAgICAgICAgICAgIE1FRElBX1BMQVlFUl9QQVVTRUQgfCBNRURJQV9QTEFZRVJfU1RPUFBFRCB8IE1FRElBX1BMQVlFUl9QTEFZQkFDS19DT01QTEVURSkpOwogICAgIGlmIChtUGxheWVyICE9IDAgJiYgaXNWYWxpZFN0YXRlKSB7CiAgICAgICAgIGludCBkdXJhdGlvbk1zOwogICAgICAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5nZXREdXJhdGlvbigmZHVyYXRpb25Ncyk7CkBAIC00NDMsNyArNTEzLDggQEAKIHN0YXR1c190IE1lZGlhUGxheWVyOjpzZWVrVG9fbChpbnQgbXNlYykKIHsKICAgICBBTE9HVigic2Vla1RvICVkIiwgbXNlYyk7Ci0gICAgaWYgKChtUGxheWVyICE9IDApICYmICggbUN1cnJlbnRTdGF0ZSAmICggTUVESUFfUExBWUVSX1NUQVJURUQgfCBNRURJQV9QTEFZRVJfUFJFUEFSRUQgfCBNRURJQV9QTEFZRVJfUEFVU0VEIHwgIE1FRElBX1BMQVlFUl9QTEFZQkFDS19DT01QTEVURSkgKSApIHsKKyAgICBpZiAoKG1QbGF5ZXIgIT0gMCkgJiYgKCBtQ3VycmVudFN0YXRlICYgKCBNRURJQV9QTEFZRVJfU1RBUlRFRCB8IE1FRElBX1BMQVlFUl9QUkVQQVJFRCB8CisgICAgICAgICAgICBNRURJQV9QTEFZRVJfUEFVU0VEIHwgIE1FRElBX1BMQVlFUl9QTEFZQkFDS19DT01QTEVURSkgKSApIHsKICAgICAgICAgaWYgKCBtc2VjIDwgMCApIHsKICAgICAgICAgICAgIEFMT0dXKCJBdHRlbXB0IHRvIHNlZWsgdG8gaW52YWxpZCBwb3NpdGlvbjogJWQiLCBtc2VjKTsKICAgICAgICAgICAgIG1zZWMgPSAwOwpAQCAtNDc3LDcgKzU0OCw4IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KICAgICB9Ci0gICAgQUxPR0UoIkF0dGVtcHQgdG8gcGVyZm9ybSBzZWVrVG8gaW4gd3Jvbmcgc3RhdGU6IG1QbGF5ZXI9JXAsIG1DdXJyZW50U3RhdGU9JXUiLCBtUGxheWVyLmdldCgpLCBtQ3VycmVudFN0YXRlKTsKKyAgICBBTE9HRSgiQXR0ZW1wdCB0byBwZXJmb3JtIHNlZWtUbyBpbiB3cm9uZyBzdGF0ZTogbVBsYXllcj0lcCwgbUN1cnJlbnRTdGF0ZT0ldSIsIG1QbGF5ZXIuZ2V0KCksCisgICAgICAgICAgICBtQ3VycmVudFN0YXRlKTsKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKQEAgLTUwMiw2ICs1NzQsNyBAQAogICAgICAgICAgICAgQUxPR0UoInJlc2V0KCkgZmFpbGVkIHdpdGggcmV0dXJuIGNvZGUgKCVkKSIsIHJldCk7CiAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSX1NUQVRFX0VSUk9SOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBsYXllci0+ZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUl9JRExFOwogICAgICAgICB9CiAgICAgICAgIC8vIHNldERhdGFTb3VyY2UgaGFzIHRvIGJlIGNhbGxlZCBhZ2FpbiB0byBjcmVhdGUgYQpAQCAtNjYzLDI0ICs3MzYsMjggQEAKIHN0YXR1c190IE1lZGlhUGxheWVyOjpzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsJiByZXF1ZXN0KQogewogICAgIEFMT0dWKCJNZWRpYVBsYXllcjo6c2V0UGFyYW1ldGVyKCVkKSIsIGtleSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAoY2hlY2tTdGF0ZUZvcktleVNldF9sKGtleSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBpZiAobVBsYXllciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAgbVBsYXllci0+c2V0UGFyYW1ldGVyKGtleSwgcmVxdWVzdCk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogICAgIHN3aXRjaCAoa2V5KSB7CiAgICAgY2FzZSBLRVlfUEFSQU1FVEVSX0FVRElPX0FUVFJJQlVURVM6Ci0gICAgICAgIC8vIG5vIHBsYXllciwgc2F2ZSB0aGUgbWFyc2hhbGxlZCBhdWRpbyBhdHRyaWJ1dGVzCisgICAgICAgIC8vIHNhdmUgdGhlIG1hcnNoYWxsZWQgYXVkaW8gYXR0cmlidXRlcwogICAgICAgICBpZiAobUF1ZGlvQXR0cmlidXRlc1BhcmNlbCAhPSBOVUxMKSB7IGRlbGV0ZSBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsOyB9OwogICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsID0gbmV3IFBhcmNlbCgpOwogICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsLT5hcHBlbmRGcm9tKCZyZXF1ZXN0LCAwLCByZXF1ZXN0LmRhdGFTaXplKCkpOwotICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIHN0YXR1cyA9IE9LOworICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyOiBubyBhY3RpdmUgcGxheWVyIik7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgQUxPR1ZfSUYobVBsYXllciA9PSBOVUxMLCAic2V0UGFyYW1ldGVyOiBubyBhY3RpdmUgcGxheWVyIik7CisgICAgICAgIGJyZWFrOwogICAgIH0KKworICAgIGlmIChtUGxheWVyICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzID0gbVBsYXllci0+c2V0UGFyYW1ldGVyKGtleSwgcmVxdWVzdCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyOjpnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkKQEAgLTgxOCw2ICs4OTUsOSBAQAogICAgIGNhc2UgTUVESUFfU1VCVElUTEVfREFUQToKICAgICAgICAgQUxPR1YoIlJlY2VpdmVkIHN1YnRpdGxlIGRhdGEgbWVzc2FnZSIpOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBX01FVEFfREFUQToKKyAgICAgICAgQUxPR1YoIlJlY2VpdmVkIHRpbWVkIG1ldGFkYXRhIG1lc3NhZ2UiKTsKKyAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgQUxPR1YoInVucmVjb2duaXplZCBtZXNzYWdlOiAoJWQsICVkLCAlZCkiLCBtc2csIGV4dDEsIGV4dDIpOwogICAgICAgICBicmVhazsKQEAgLTg1NSw0ICs5MzUsNCBAQAogICAgIHJldHVybiBtUGxheWVyLT5zZXROZXh0UGxheWVyKG5leHQgPT0gTlVMTCA/IE5VTEwgOiBuZXh0LT5tUGxheWVyKTsKIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKaW5kZXggMTk1MmI4Ni4uOGJiZDhmMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUmVjb3JkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPiAgLy8gZm9yIE1FRElBX0VSUk9SX1NFUlZFUl9ESUVECisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUGVyc2lzdGVudFN1cmZhY2UuaD4KICNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0yNjQsMzIgKzI2NSw2IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6c2V0T3V0cHV0RmlsZShjb25zdCBjaGFyKiBwYXRoKQotewotICAgIEFMT0dWKCJzZXRPdXRwdXRGaWxlKCVzKSIsIHBhdGgpOwotICAgIGlmIChtTWVkaWFSZWNvcmRlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJtZWRpYSByZWNvcmRlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0Iik7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgaWYgKG1Jc091dHB1dEZpbGVTZXQpIHsKLSAgICAgICAgQUxPR0UoIm91dHB1dCBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gc2V0Iik7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgaWYgKCEobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1JFQ09SREVSX0RBVEFTT1VSQ0VfQ09ORklHVVJFRCkpIHsKLSAgICAgICAgQUxPR0UoInNldE91dHB1dEZpbGUgY2FsbGVkIGluIGFuIGludmFsaWQgc3RhdGUoJWQpIiwgbUN1cnJlbnRTdGF0ZSk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCByZXQgPSBtTWVkaWFSZWNvcmRlci0+c2V0T3V0cHV0RmlsZShwYXRoKTsKLSAgICBpZiAoT0sgIT0gcmV0KSB7Ci0gICAgICAgIEFMT0dWKCJzZXRPdXRwdXRGaWxlIGZhaWxlZDogJWQiLCByZXQpOwotICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUkVDT1JERVJfRVJST1I7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIG1Jc091dHB1dEZpbGVTZXQgPSB0cnVlOwotICAgIHJldHVybiByZXQ7Ci19Ci0KIHN0YXR1c190IE1lZGlhUmVjb3JkZXI6OnNldE91dHB1dEZpbGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCiB7CiAgICAgQUxPR1YoInNldE91dHB1dEZpbGUoJWQsICUiIFBSSWQ2NCAiLCAlIiBQUklkNjQgIikiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOwpAQCAtMzcwLDYgKzM0NSwyNCBAQAogCiAKIAorc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6c2V0SW5wdXRTdXJmYWNlKGNvbnN0IHNwPFBlcnNpc3RlbnRTdXJmYWNlPiYgc3VyZmFjZSkKK3sKKyAgICBBTE9HVigic2V0SW5wdXRTdXJmYWNlIik7CisgICAgaWYgKG1NZWRpYVJlY29yZGVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIm1lZGlhIHJlY29yZGVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBib29sIGlzSW52YWxpZFN0YXRlID0gKG1DdXJyZW50U3RhdGUgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1FRElBX1JFQ09SREVSX1BSRVBBUkVEIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9SRUNPUkRFUl9SRUNPUkRJTkcpKTsKKyAgICBpZiAoaXNJbnZhbGlkU3RhdGUpIHsKKyAgICAgICAgQUxPR0UoInNldElucHV0U3VyZmFjZSBpcyBjYWxsZWQgaW4gYW4gaW52YWxpZCBzdGF0ZTogJWQiLCBtQ3VycmVudFN0YXRlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHJldHVybiBtTWVkaWFSZWNvcmRlci0+c2V0SW5wdXRTdXJmYWNlKHN1cmZhY2UtPmdldEJ1ZmZlckNvbnN1bWVyKCkpOworfQorCiBzdGF0dXNfdCBNZWRpYVJlY29yZGVyOjpzZXRWaWRlb0ZyYW1lUmF0ZShpbnQgZnJhbWVzX3Blcl9zZWNvbmQpCiB7CiAgICAgQUxPR1YoInNldFZpZGVvRnJhbWVSYXRlKCVkKSIsIGZyYW1lc19wZXJfc2Vjb25kKTsKQEAgLTYyMCwxMyArNjEzLDEzIEBACiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogCi1NZWRpYVJlY29yZGVyOjpNZWRpYVJlY29yZGVyKCkgOiBtU3VyZmFjZU1lZGlhU291cmNlKE5VTEwpCitNZWRpYVJlY29yZGVyOjpNZWRpYVJlY29yZGVyKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKSA6IG1TdXJmYWNlTWVkaWFTb3VyY2UoTlVMTCkKIHsKICAgICBBTE9HVigiY29uc3RydWN0b3IiKTsKIAogICAgIGNvbnN0IHNwPElNZWRpYVBsYXllclNlcnZpY2U+JiBzZXJ2aWNlKGdldE1lZGlhUGxheWVyU2VydmljZSgpKTsKICAgICBpZiAoc2VydmljZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1NZWRpYVJlY29yZGVyID0gc2VydmljZS0+Y3JlYXRlTWVkaWFSZWNvcmRlcigpOworICAgICAgICBtTWVkaWFSZWNvcmRlciA9IHNlcnZpY2UtPmNyZWF0ZU1lZGlhUmVjb3JkZXIob3BQYWNrYWdlTmFtZSk7CiAgICAgfQogICAgIGlmIChtTWVkaWFSZWNvcmRlciAhPSBOVUxMKSB7CiAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9SRUNPUkRFUl9JRExFOwpAQCAtNzA2LDQgKzY5OSw0IEBACiAgICAgbm90aWZ5KE1FRElBX1JFQ09SREVSX0VWRU5UX0VSUk9SLCBNRURJQV9FUlJPUl9TRVJWRVJfRElFRCwgMCk7CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5tayBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLm1rCmluZGV4IDlkOGZlNjIuLjRkMWI1ODcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLm1rCkBAIC0xMCw2ICsxMCw3IEBACiAgICAgQWN0aXZpdHlNYW5hZ2VyLmNwcCAgICAgICAgIFwKICAgICBDcnlwdG8uY3BwICAgICAgICAgICAgICAgICAgXAogICAgIERybS5jcHAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRHJtU2Vzc2lvbk1hbmFnZXIuY3BwICAgICAgIFwKICAgICBIRENQLmNwcCAgICAgICAgICAgICAgICAgICAgXAogICAgIE1lZGlhUGxheWVyRmFjdG9yeS5jcHAgICAgICBcCiAgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCAgICAgIFwKQEAgLTIwLDcgKzIxLDYgQEAKICAgICBTdGFnZWZyaWdodFBsYXllci5jcHAgICAgICAgXAogICAgIFN0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwICAgICBcCiAgICAgVGVzdFBsYXllclN0dWIuY3BwICAgICAgICAgIFwKLSAgICBWaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcCAgICAgXAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICAgICAgIFwKICAgICBsaWJiaW5kZXIgICAgICAgICAgICAgICAgICAgXApAQCAtMzIsNiArMzIsNyBAQAogICAgIGxpYmRsICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgbGliZ3VpICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBsaWJtZWRpYSAgICAgICAgICAgICAgICAgICAgXAorICAgIGxpYm1lZGlhdXRpbHMgICAgICAgICAgICAgICBcCiAgICAgbGlic29uaXZveCAgICAgICAgICAgICAgICAgIFwKICAgICBsaWJzdGFnZWZyaWdodCAgICAgICAgICAgICAgXAogICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gICBcCkBAIC01Myw2ICs1NCw5IEBACiAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCAgICAgICAgICAgICAgICAgIFwKICAgICAkKFRPUCkvZXh0ZXJuYWwvdHJlbW9sby9UcmVtb2xvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvciAtV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCisKIExPQ0FMX01PRFVMRTo9IGxpYm1lZGlhcGxheWVyc2VydmljZQogCiBMT0NBTF8zMl9CSVRfT05MWSA6PSB0cnVlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQ3J5cHRvLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9DcnlwdG8uY3BwCmluZGV4IDhlZTdjMGIuLjE0N2QzNWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9DcnlwdG8uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9DcnlwdG8uY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlICJDcnlwdG8uaCIKIAorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvQ3J5cHRvQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KQEAgLTg4LDcgKzg5LDcgQEAKIAogICAgIC8vIGZpcnN0IGNoZWNrIGNhY2hlCiAgICAgVmVjdG9yPHVpbnQ4X3Q+IHV1aWRWZWN0b3I7Ci0gICAgdXVpZFZlY3Rvci5hcHBlbmRBcnJheSh1dWlkLCBzaXplb2YodXVpZCkpOworICAgIHV1aWRWZWN0b3IuYXBwZW5kQXJyYXkodXVpZCwgc2l6ZW9mKHV1aWRbMF0pICogMTYpOwogICAgIHNzaXplX3QgaW5kZXggPSBtVVVJRFRvTGlicmFyeVBhdGhNYXAuaW5kZXhPZktleSh1dWlkVmVjdG9yKTsKICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICBpZiAobG9hZExpYnJhcnlGb3JTY2hlbWUobVVVSURUb0xpYnJhcnlQYXRoTWFwW2luZGV4XSwgdXVpZCkpIHsKQEAgLTIzOCw3ICsyMzksNyBAQAogICAgICAgICBjb25zdCB1aW50OF90IGtleVsxNl0sCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgaXZbMTZdLAogICAgICAgICBDcnlwdG9QbHVnaW46Ok1vZGUgbW9kZSwKLSAgICAgICAgY29uc3Qgdm9pZCAqc3JjUHRyLAorICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmc2hhcmVkQnVmZmVyLCBzaXplX3Qgb2Zmc2V0LAogICAgICAgICBjb25zdCBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSAqc3ViU2FtcGxlcywgc2l6ZV90IG51bVN1YlNhbXBsZXMsCiAgICAgICAgIHZvaWQgKmRzdFB0ciwKICAgICAgICAgQVN0cmluZyAqZXJyb3JEZXRhaWxNc2cpIHsKQEAgLTI1Miw2ICsyNTMsOCBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKKyAgICBjb25zdCB2b2lkICpzcmNQdHIgPSBzdGF0aWNfY2FzdDx1aW50OF90ICo+KHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpKSArIG9mZnNldDsKKwogICAgIHJldHVybiBtUGx1Z2luLT5kZWNyeXB0KAogICAgICAgICAgICAgc2VjdXJlLCBrZXksIGl2LCBtb2RlLCBzcmNQdHIsIHN1YlNhbXBsZXMsIG51bVN1YlNhbXBsZXMsIGRzdFB0ciwKICAgICAgICAgICAgIGVycm9yRGV0YWlsTXNnKTsKQEAgLTI2NSw0ICsyNjgsMTQgQEAKICAgICB9CiB9CiAKK3N0YXR1c190IENyeXB0bzo6c2V0TWVkaWFEcm1TZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIHN0YXR1c190IHJlc3VsdCA9IE5PX0lOSVQ7CisgICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0sgJiYgbVBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgIHJlc3VsdCA9IG1QbHVnaW4tPnNldE1lZGlhRHJtU2Vzc2lvbihzZXNzaW9uSWQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0NyeXB0by5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0NyeXB0by5oCmluZGV4IDAwMzdjMmUuLjk5ZWE5NWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9DcnlwdG8uaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQ3J5cHRvLmgKQEAgLTQ3LDEyICs0NywxNCBAQAogCiAgICAgdmlydHVhbCB2b2lkIG5vdGlmeVJlc29sdXRpb24odWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhRHJtU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZCk7CisKICAgICB2aXJ0dWFsIHNzaXplX3QgZGVjcnlwdCgKICAgICAgICAgICAgIGJvb2wgc2VjdXJlLAogICAgICAgICAgICAgY29uc3QgdWludDhfdCBrZXlbMTZdLAogICAgICAgICAgICAgY29uc3QgdWludDhfdCBpdlsxNl0sCiAgICAgICAgICAgICBDcnlwdG9QbHVnaW46Ok1vZGUgbW9kZSwKLSAgICAgICAgICAgIGNvbnN0IHZvaWQgKnNyY1B0ciwKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZzaGFyZWRCdWZmZXIsIHNpemVfdCBvZmZzZXQsCiAgICAgICAgICAgICBjb25zdCBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSAqc3ViU2FtcGxlcywgc2l6ZV90IG51bVN1YlNhbXBsZXMsCiAgICAgICAgICAgICB2b2lkICpkc3RQdHIsCiAgICAgICAgICAgICBBU3RyaW5nICplcnJvckRldGFpbE1zZyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvRHJtLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Ecm0uY3BwCmluZGV4IDlkNWJhMTUuLmE3ZjZmOGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Ecm0uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Ecm0uY3BwCkBAIC0yMyw2ICsyMyw4IEBACiAKICNpbmNsdWRlICJEcm0uaCIKIAorI2luY2x1ZGUgIkRybVNlc3Npb25DbGllbnRJbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJEcm1TZXNzaW9uTWFuYWdlci5oIgogI2luY2x1ZGUgPG1lZGlhL2RybS9Ecm1BUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgpAQCAtMzMsNiArMzUsMTAgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdGF0aWMgaW5saW5lIGludCBnZXRDYWxsaW5nUGlkKCkgeworICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Cit9CisKIHN0YXRpYyBib29sIGNoZWNrUGVybWlzc2lvbihjb25zdCBjaGFyKiBwZXJtaXNzaW9uU3RyaW5nKSB7CiAjaWZuZGVmIEhBVkVfQU5EUk9JRF9PUwogICAgIHJldHVybiB0cnVlOwpAQCAtNTgsMTQgKzY0LDQxIEBACiAgICAgcmV0dXJuIG1lbWNtcCgodm9pZCAqKWxocy5hcnJheSgpLCAodm9pZCAqKXJocy5hcnJheSgpLCByaHMuc2l6ZSgpKSA8IDA7CiB9CiAKK3N0cnVjdCBEcm1TZXNzaW9uQ2xpZW50IDogcHVibGljIERybVNlc3Npb25DbGllbnRJbnRlcmZhY2UgeworICAgIERybVNlc3Npb25DbGllbnQoRHJtKiBkcm0pIDogbURybShkcm0pIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgcmVjbGFpbVNlc3Npb24oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKKyAgICAgICAgc3A8RHJtPiBkcm0gPSBtRHJtLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGRybSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXNfdCBlcnIgPSBkcm0tPmNsb3NlU2Vzc2lvbihzZXNzaW9uSWQpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZHJtLT5zZW5kRXZlbnQoRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRTZXNzaW9uUmVjbGFpbWVkLCAwLCAmc2Vzc2lvbklkLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+RHJtU2Vzc2lvbkNsaWVudCgpIHt9CisKK3ByaXZhdGU6CisgICAgd3A8RHJtPiBtRHJtOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtU2Vzc2lvbkNsaWVudCk7Cit9OworCiBEcm06OkRybSgpCiAgICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpLAorICAgICAgbURybVNlc3Npb25DbGllbnQobmV3IERybVNlc3Npb25DbGllbnQodGhpcykpLAogICAgICAgbUxpc3RlbmVyKE5VTEwpLAogICAgICAgbUZhY3RvcnkoTlVMTCksCiAgICAgICBtUGx1Z2luKE5VTEwpIHsKIH0KIAogRHJtOjp+RHJtKCkgeworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT5yZW1vdmVEcm0obURybVNlc3Npb25DbGllbnQpOwogICAgIGRlbGV0ZSBtUGx1Z2luOwogICAgIG1QbHVnaW4gPSBOVUxMOwogICAgIGNsb3NlRmFjdG9yeSgpOwpAQCAtMTA0LDI1ICsxMzcsNTcgQEAKIAogICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CiAgICAgICAgIFBhcmNlbCBvYmo7Ci0gICAgICAgIGlmIChzZXNzaW9uSWQgJiYgc2Vzc2lvbklkLT5zaXplKCkpIHsKLSAgICAgICAgICAgIG9iai53cml0ZUludDMyKHNlc3Npb25JZC0+c2l6ZSgpKTsKLSAgICAgICAgICAgIG9iai53cml0ZShzZXNzaW9uSWQtPmFycmF5KCksIHNlc3Npb25JZC0+c2l6ZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9iai53cml0ZUludDMyKDApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS0+c2l6ZSgpKSB7Ci0gICAgICAgICAgICBvYmoud3JpdGVJbnQzMihkYXRhLT5zaXplKCkpOwotICAgICAgICAgICAgb2JqLndyaXRlKGRhdGEtPmFycmF5KCksIGRhdGEtPnNpemUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvYmoud3JpdGVJbnQzMigwKTsKLSAgICAgICAgfQorICAgICAgICB3cml0ZUJ5dGVBcnJheShvYmosIHNlc3Npb25JZCk7CisgICAgICAgIHdyaXRlQnl0ZUFycmF5KG9iaiwgZGF0YSk7CiAKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU5vdGlmeUxvY2spOwogICAgICAgICBsaXN0ZW5lci0+bm90aWZ5KGV2ZW50VHlwZSwgZXh0cmEsICZvYmopOwogICAgIH0KIH0KIAordm9pZCBEcm06OnNlbmRFeHBpcmF0aW9uVXBkYXRlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAqc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZXhwaXJ5VGltZUluTVMpCit7CisgICAgbUV2ZW50TG9jay5sb2NrKCk7CisgICAgc3A8SURybUNsaWVudD4gbGlzdGVuZXIgPSBtTGlzdGVuZXI7CisgICAgbUV2ZW50TG9jay51bmxvY2soKTsKKworICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgIFBhcmNlbCBvYmo7CisgICAgICAgIHdyaXRlQnl0ZUFycmF5KG9iaiwgc2Vzc2lvbklkKTsKKyAgICAgICAgb2JqLndyaXRlSW50NjQoZXhwaXJ5VGltZUluTVMpOworCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Ob3RpZnlMb2NrKTsKKyAgICAgICAgbGlzdGVuZXItPm5vdGlmeShEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudEV4cGlyYXRpb25VcGRhdGUsIDAsICZvYmopOworICAgIH0KK30KKwordm9pZCBEcm06OnNlbmRLZXlzQ2hhbmdlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAqc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvcjxEcm1QbHVnaW46OktleVN0YXR1cz4gY29uc3QgKmtleVN0YXR1c0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNOZXdVc2FibGVLZXkpCit7CisgICAgbUV2ZW50TG9jay5sb2NrKCk7CisgICAgc3A8SURybUNsaWVudD4gbGlzdGVuZXIgPSBtTGlzdGVuZXI7CisgICAgbUV2ZW50TG9jay51bmxvY2soKTsKKworICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgIFBhcmNlbCBvYmo7CisgICAgICAgIHdyaXRlQnl0ZUFycmF5KG9iaiwgc2Vzc2lvbklkKTsKKworICAgICAgICBzaXplX3QgbmtleXMgPSBrZXlTdGF0dXNMaXN0LT5zaXplKCk7CisgICAgICAgIG9iai53cml0ZUludDMyKGtleVN0YXR1c0xpc3QtPnNpemUoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmtleXM7ICsraSkgeworICAgICAgICAgICAgY29uc3QgRHJtUGx1Z2luOjpLZXlTdGF0dXMgKmtleVN0YXR1cyA9ICZrZXlTdGF0dXNMaXN0LT5pdGVtQXQoaSk7CisgICAgICAgICAgICB3cml0ZUJ5dGVBcnJheShvYmosICZrZXlTdGF0dXMtPm1LZXlJZCk7CisgICAgICAgICAgICBvYmoud3JpdGVJbnQzMihrZXlTdGF0dXMtPm1UeXBlKTsKKyAgICAgICAgfQorICAgICAgICBvYmoud3JpdGVJbnQzMihoYXNOZXdVc2FibGVLZXkpOworCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Ob3RpZnlMb2NrKTsKKyAgICAgICAgbGlzdGVuZXItPm5vdGlmeShEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudEtleXNDaGFuZ2UsIDAsICZvYmopOworICAgIH0KK30KKwogLyoKICAqIFNlYXJjaCB0aGUgcGx1Z2lucyBkaXJlY3RvcnkgZm9yIGEgcGx1Z2luIHRoYXQgc3VwcG9ydHMgdGhlIHNjaGVtZQogICogc3BlY2lmaWVkIGJ5IHV1aWQKQEAgLTE0NSw3ICsyMTAsNyBAQAogCiAgICAgLy8gZmlyc3QgY2hlY2sgY2FjaGUKICAgICBWZWN0b3I8dWludDhfdD4gdXVpZFZlY3RvcjsKLSAgICB1dWlkVmVjdG9yLmFwcGVuZEFycmF5KHV1aWQsIHNpemVvZih1dWlkKSk7CisgICAgdXVpZFZlY3Rvci5hcHBlbmRBcnJheSh1dWlkLCBzaXplb2YodXVpZFswXSkgKiAxNik7CiAgICAgc3NpemVfdCBpbmRleCA9IG1VVUlEVG9MaWJyYXJ5UGF0aE1hcC5pbmRleE9mS2V5KHV1aWRWZWN0b3IpOwogICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgIGlmIChsb2FkTGlicmFyeUZvclNjaGVtZShtVVVJRFRvTGlicmFyeVBhdGhNYXBbaW5kZXhdLCB1dWlkKSkgewpAQCAtMjkwLDcgKzM1NSwyOSBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICByZXR1cm4gbVBsdWdpbi0+b3BlblNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtUGx1Z2luLT5vcGVuU2Vzc2lvbihzZXNzaW9uSWQpOworICAgIGlmIChlcnIgPT0gRVJST1JfRFJNX1JFU09VUkNFX0JVU1kpIHsKKyAgICAgICAgYm9vbCByZXRyeSA9IGZhbHNlOworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgLy8gcmVjbGFpbVNlc3Npb24gbWF5IGNhbGwgYmFjayB0byBjbG9zZVNlc3Npb24sIHNpbmNlIG1Mb2NrIGlzIHNoYXJlZCBiZXR3ZWVuIERybQorICAgICAgICAvLyBpbnN0YW5jZXMsIHdlIHNob3VsZCB1bmxvY2sgaGVyZSB0byBhdm9pZCBkZWFkbG9jay4KKyAgICAgICAgcmV0cnkgPSBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+cmVjbGFpbVNlc3Npb24oZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVBsdWdpbiA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0cnkpIHsKKyAgICAgICAgICAgIGVyciA9IG1QbHVnaW4tPm9wZW5TZXNzaW9uKHNlc3Npb25JZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+YWRkU2Vzc2lvbihnZXRDYWxsaW5nUGlkKCksIG1Ecm1TZXNzaW9uQ2xpZW50LCBzZXNzaW9uSWQpOworICAgIH0KKyAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0dXNfdCBEcm06OmNsb3NlU2Vzc2lvbihWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCkgewpAQCAtMzA0LDE0ICszOTEsMTkgQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0gICAgcmV0dXJuIG1QbHVnaW4tPmNsb3NlU2Vzc2lvbihzZXNzaW9uSWQpOworICAgIHN0YXR1c190IGVyciA9IG1QbHVnaW4tPmNsb3NlU2Vzc2lvbihzZXNzaW9uSWQpOworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnJlbW92ZVNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKIH0KIAogc3RhdHVzX3QgRHJtOjpnZXRLZXlSZXF1ZXN0KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5pdERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmbWltZVR5cGUsIERybVBsdWdpbjo6S2V5VHlwZSBrZXlUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGNvbnN0ICZvcHRpb25hbFBhcmFtZXRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZyZXF1ZXN0LCBTdHJpbmc4ICZkZWZhdWx0VXJsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZyZXF1ZXN0LCBTdHJpbmc4ICZkZWZhdWx0VXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUgKmtleVJlcXVlc3RUeXBlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CkBAIC0zMjIsOCArNDE0LDExIEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAorICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKICAgICByZXR1cm4gbVBsdWdpbi0+Z2V0S2V5UmVxdWVzdChzZXNzaW9uSWQsIGluaXREYXRhLCBtaW1lVHlwZSwga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbFBhcmFtZXRlcnMsIHJlcXVlc3QsIGRlZmF1bHRVcmwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsUGFyYW1ldGVycywgcmVxdWVzdCwgZGVmYXVsdFVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlSZXF1ZXN0VHlwZSk7CiB9CiAKIHN0YXR1c190IERybTo6cHJvdmlkZUtleVJlc3BvbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLApAQCAtMzM5LDYgKzQzNCw4IEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAorICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKICAgICByZXR1cm4gbVBsdWdpbi0+cHJvdmlkZUtleVJlc3BvbnNlKHNlc3Npb25JZCwgcmVzcG9uc2UsIGtleVNldElkKTsKIH0KIApAQCAtMzY4LDYgKzQ2NSw4IEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAorICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKICAgICByZXR1cm4gbVBsdWdpbi0+cmVzdG9yZUtleXMoc2Vzc2lvbklkLCBrZXlTZXRJZCk7CiB9CiAKQEAgLTM4Myw2ICs0ODIsOCBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKKyAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOworCiAgICAgcmV0dXJuIG1QbHVnaW4tPnF1ZXJ5S2V5U3RhdHVzKHNlc3Npb25JZCwgaW5mb01hcCk7CiB9CiAKQEAgLTU2Miw2ICs2NjMsOCBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKKyAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOworCiAgICAgcmV0dXJuIG1QbHVnaW4tPnNldENpcGhlckFsZ29yaXRobShzZXNzaW9uSWQsIGFsZ29yaXRobSk7CiB9CiAKQEAgLTU3Nyw2ICs2ODAsOCBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKKyAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOworCiAgICAgcmV0dXJuIG1QbHVnaW4tPnNldE1hY0FsZ29yaXRobShzZXNzaW9uSWQsIGFsZ29yaXRobSk7CiB9CiAKQEAgLTU5NSw2ICs3MDAsOCBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKKyAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOworCiAgICAgcmV0dXJuIG1QbHVnaW4tPmVuY3J5cHQoc2Vzc2lvbklkLCBrZXlJZCwgaW5wdXQsIGl2LCBvdXRwdXQpOwogfQogCkBAIC02MTMsNiArNzIwLDggQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKwogICAgIHJldHVybiBtUGx1Z2luLT5kZWNyeXB0KHNlc3Npb25JZCwga2V5SWQsIGlucHV0LCBpdiwgb3V0cHV0KTsKIH0KIApAQCAtNjMwLDYgKzczOSw4IEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAorICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKICAgICByZXR1cm4gbVBsdWdpbi0+c2lnbihzZXNzaW9uSWQsIGtleUlkLCBtZXNzYWdlLCBzaWduYXR1cmUpOwogfQogCkBAIC02NDgsNiArNzU5LDggQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKwogICAgIHJldHVybiBtUGx1Z2luLT52ZXJpZnkoc2Vzc2lvbklkLCBrZXlJZCwgbWVzc2FnZSwgc2lnbmF0dXJlLCBtYXRjaCk7CiB9CiAKQEAgLTY3MCwxMCArNzgzLDEyIEBACiAgICAgICAgIHJldHVybiAtRVBFUk07CiAgICAgfQogCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKwogICAgIHJldHVybiBtUGx1Z2luLT5zaWduUlNBKHNlc3Npb25JZCwgYWxnb3JpdGhtLCBtZXNzYWdlLCB3cmFwcGVkS2V5LCBzaWduYXR1cmUpOwogfQogCi12b2lkIERybTo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmdGhlX2xhdGVfd2hvKQordm9pZCBEcm06OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJnRoZV9sYXRlX3dobyBfX3VudXNlZCkKIHsKICAgICBtRXZlbnRMb2NrLmxvY2soKTsKICAgICBtTGlzdGVuZXIuY2xlYXIoKTsKQEAgLTY4NSw0ICs4MDAsMTQgQEAKICAgICBjbG9zZUZhY3RvcnkoKTsKIH0KIAordm9pZCBEcm06OndyaXRlQnl0ZUFycmF5KFBhcmNlbCAmb2JqLCBWZWN0b3I8dWludDhfdD4gY29uc3QgKmFycmF5KQoreworICAgIGlmIChhcnJheSAmJiBhcnJheS0+c2l6ZSgpKSB7CisgICAgICAgIG9iai53cml0ZUludDMyKGFycmF5LT5zaXplKCkpOworICAgICAgICBvYmoud3JpdGUoYXJyYXktPmFycmF5KCksIGFycmF5LT5zaXplKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIG9iai53cml0ZUludDMyKDApOworICAgIH0KK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Ecm0uaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Ecm0uaAppbmRleCAyOTk3ZGExLi4wNTY3MjNjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvRHJtLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5oCkBAIC0yNiw4ICsyNiw5IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IERybUZhY3Rvcnk7Ci1zdHJ1Y3QgRHJtUGx1Z2luOworY2xhc3MgRHJtRmFjdG9yeTsKK2NsYXNzIERybVBsdWdpbjsKK3N0cnVjdCBEcm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlOwogCiBzdHJ1Y3QgRHJtIDogcHVibGljIEJuRHJtLAogICAgICAgICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCwKQEAgLTUyLDcgKzUzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmluaXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJm1pbWVUeXBlLCBEcm1QbHVnaW46OktleVR5cGUga2V5VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBjb25zdCAmb3B0aW9uYWxQYXJhbWV0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmcmVxdWVzdCwgU3RyaW5nOCAmZGVmYXVsdFVybCk7CisgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZyZXF1ZXN0LCBTdHJpbmc4ICZkZWZhdWx0VXJsLAorICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUgKmtleVJlcXVlc3RUeXBlKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvdmlkZUtleVJlc3BvbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmcmVzcG9uc2UsCkBAIC0xMzEsNiArMTMzLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgKnNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAqZGF0YSk7CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2VuZEV4cGlyYXRpb25VcGRhdGUoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICpzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZXhwaXJ5VGltZUluTVMpOworCisgICAgdmlydHVhbCB2b2lkIHNlbmRLZXlzQ2hhbmdlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAqc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8RHJtUGx1Z2luOjpLZXlTdGF0dXM+IGNvbnN0ICprZXlTdGF0dXNMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc05ld1VzYWJsZUtleSk7CisKICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmdGhlX2xhdGVfd2hvKTsKIAogcHJpdmF0ZToKQEAgLTEzOCw2ICsxNDcsOCBAQAogCiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKIAorICAgIHNwPERybVNlc3Npb25DbGllbnRJbnRlcmZhY2U+IG1Ecm1TZXNzaW9uQ2xpZW50OworCiAgICAgc3A8SURybUNsaWVudD4gbUxpc3RlbmVyOwogICAgIG11dGFibGUgTXV0ZXggbUV2ZW50TG9jazsKICAgICBtdXRhYmxlIE11dGV4IG1Ob3RpZnlMb2NrOwpAQCAtMTUzLDcgKzE2NCw3IEBACiAgICAgdm9pZCBmaW5kRmFjdG9yeUZvclNjaGVtZShjb25zdCB1aW50OF90IHV1aWRbMTZdKTsKICAgICBib29sIGxvYWRMaWJyYXJ5Rm9yU2NoZW1lKGNvbnN0IFN0cmluZzggJnBhdGgsIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pOwogICAgIHZvaWQgY2xvc2VGYWN0b3J5KCk7Ci0KKyAgICB2b2lkIHdyaXRlQnl0ZUFycmF5KFBhcmNlbCAmb2JqLCBWZWN0b3I8dWludDhfdD4gY29uc3QgKmFycmF5KTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERybSk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybVNlc3Npb25DbGllbnRJbnRlcmZhY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Ecm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdmYWYwOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Ecm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRFJNX1BST1hZX0lOVEVSRkFDRV9IXworI2RlZmluZSBEUk1fUFJPWFlfSU5URVJGQUNFX0hfCisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IERybVNlc3Npb25DbGllbnRJbnRlcmZhY2UgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgdmlydHVhbCBib29sIHJlY2xhaW1TZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5Ecm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlKCkge30KK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gRFJNX1BST1hZX0lOVEVSRkFDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybVNlc3Npb25NYW5hZ2VyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Ecm1TZXNzaW9uTWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQxZjg4MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Ecm1TZXNzaW9uTWFuYWdlci5jcHAKQEAgLTAsMCArMSwyNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkRybVNlc3Npb25NYW5hZ2VyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRHJtU2Vzc2lvbk1hbmFnZXIuaCIKKworI2luY2x1ZGUgIkRybVNlc3Npb25DbGllbnRJbnRlcmZhY2UuaCIKKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVByb2Nlc3NJbmZvU2VydmljZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgU3RyaW5nOCBHZXRTZXNzaW9uSWRTdHJpbmcoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpIHsKKyAgICBTdHJpbmc4IHNlc3Npb25JZFN0cjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNlc3Npb25JZC5zaXplKCk7ICsraSkgeworICAgICAgICBzZXNzaW9uSWRTdHIuYXBwZW5kRm9ybWF0KCIldSAiLCBzZXNzaW9uSWRbaV0pOworICAgIH0KKyAgICByZXR1cm4gc2Vzc2lvbklkU3RyOworfQorCitib29sIGlzRXF1YWxTZXNzaW9uSWQoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQxLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZDIpIHsKKyAgICBpZiAoc2Vzc2lvbklkMS5zaXplKCkgIT0gc2Vzc2lvbklkMi5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNlc3Npb25JZDEuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKHNlc3Npb25JZDFbaV0gIT0gc2Vzc2lvbklkMltpXSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzcDxEcm1TZXNzaW9uTWFuYWdlcj4gRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCkgeworICAgIHN0YXRpYyBzcDxEcm1TZXNzaW9uTWFuYWdlcj4gZHJtU2Vzc2lvbk1hbmFnZXIgPSBuZXcgRHJtU2Vzc2lvbk1hbmFnZXIoKTsKKyAgICByZXR1cm4gZHJtU2Vzc2lvbk1hbmFnZXI7Cit9CisKK0RybVNlc3Npb25NYW5hZ2VyOjpEcm1TZXNzaW9uTWFuYWdlcigpCisgICAgOiBtUHJvY2Vzc0luZm8obmV3IFByb2Nlc3NJbmZvKCkpLAorICAgICAgbVRpbWUoMCkge30KKworRHJtU2Vzc2lvbk1hbmFnZXI6OkRybVNlc3Npb25NYW5hZ2VyKHNwPFByb2Nlc3NJbmZvSW50ZXJmYWNlPiBwcm9jZXNzSW5mbykKKyAgICA6IG1Qcm9jZXNzSW5mbyhwcm9jZXNzSW5mbyksCisgICAgICBtVGltZSgwKSB7fQorCitEcm1TZXNzaW9uTWFuYWdlcjo6fkRybVNlc3Npb25NYW5hZ2VyKCkge30KKwordm9pZCBEcm1TZXNzaW9uTWFuYWdlcjo6YWRkU2Vzc2lvbigKKyAgICAgICAgaW50IHBpZCwgc3A8RHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZT4gZHJtLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZCkgeworICAgIEFMT0dWKCJhZGRTZXNzaW9uKHBpZCAlZCwgZHJtICVwLCBzZXNzaW9uSWQgJXMpIiwgcGlkLCBkcm0uZ2V0KCksCisgICAgICAgICAgICBHZXRTZXNzaW9uSWRTdHJpbmcoc2Vzc2lvbklkKS5zdHJpbmcoKSk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgU2Vzc2lvbkluZm8gaW5mbzsKKyAgICBpbmZvLmRybSA9IGRybTsKKyAgICBpbmZvLnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICBpbmZvLnRpbWVTdGFtcCA9IGdldFRpbWVfbCgpOworICAgIHNzaXplX3QgaW5kZXggPSBtU2Vzc2lvbk1hcC5pbmRleE9mS2V5KHBpZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAvLyBuZXcgcGlkCisgICAgICAgIFNlc3Npb25JbmZvcyBpbmZvc0ZvclBpZDsKKyAgICAgICAgaW5mb3NGb3JQaWQucHVzaF9iYWNrKGluZm8pOworICAgICAgICBtU2Vzc2lvbk1hcC5hZGQocGlkLCBpbmZvc0ZvclBpZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNlc3Npb25NYXAuZWRpdFZhbHVlQXQoaW5kZXgpLnB1c2hfYmFjayhpbmZvKTsKKyAgICB9Cit9CisKK3ZvaWQgRHJtU2Vzc2lvbk1hbmFnZXI6OnVzZVNlc3Npb24oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpIHsKKyAgICBBTE9HVigidXNlU2Vzc2lvbiglcykiLCBHZXRTZXNzaW9uSWRTdHJpbmcoc2Vzc2lvbklkKS5zdHJpbmcoKSk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2Vzc2lvbk1hcC5zaXplKCk7ICsraSkgeworICAgICAgICBTZXNzaW9uSW5mb3MmIGluZm9zID0gbVNlc3Npb25NYXAuZWRpdFZhbHVlQXQoaSk7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaW5mb3Muc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgIFNlc3Npb25JbmZvJiBpbmZvID0gaW5mb3MuZWRpdEl0ZW1BdChqKTsKKyAgICAgICAgICAgIGlmIChpc0VxdWFsU2Vzc2lvbklkKHNlc3Npb25JZCwgaW5mby5zZXNzaW9uSWQpKSB7CisgICAgICAgICAgICAgICAgaW5mby50aW1lU3RhbXAgPSBnZXRUaW1lX2woKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRHJtU2Vzc2lvbk1hbmFnZXI6OnJlbW92ZVNlc3Npb24oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpIHsKKyAgICBBTE9HVigicmVtb3ZlU2Vzc2lvbiglcykiLCBHZXRTZXNzaW9uSWRTdHJpbmcoc2Vzc2lvbklkKS5zdHJpbmcoKSk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2Vzc2lvbk1hcC5zaXplKCk7ICsraSkgeworICAgICAgICBTZXNzaW9uSW5mb3MmIGluZm9zID0gbVNlc3Npb25NYXAuZWRpdFZhbHVlQXQoaSk7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaW5mb3Muc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgIGlmIChpc0VxdWFsU2Vzc2lvbklkKHNlc3Npb25JZCwgaW5mb3Nbal0uc2Vzc2lvbklkKSkgeworICAgICAgICAgICAgICAgIGluZm9zLnJlbW92ZUF0KGopOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBEcm1TZXNzaW9uTWFuYWdlcjo6cmVtb3ZlRHJtKHNwPERybVNlc3Npb25DbGllbnRJbnRlcmZhY2U+IGRybSkgeworICAgIEFMT0dWKCJyZW1vdmVEcm0oJXApIiwgZHJtLmdldCgpKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2Vzc2lvbk1hcC5zaXplKCk7ICsraSkgeworICAgICAgICBTZXNzaW9uSW5mb3MmIGluZm9zID0gbVNlc3Npb25NYXAuZWRpdFZhbHVlQXQoaSk7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaW5mb3Muc2l6ZSgpOykgeworICAgICAgICAgICAgaWYgKGluZm9zW2pdLmRybSA9PSBkcm0pIHsKKyAgICAgICAgICAgICAgICBBTE9HVigicmVtb3ZlZCBzZXNzaW9uICglcykiLCBHZXRTZXNzaW9uSWRTdHJpbmcoaW5mb3Nbal0uc2Vzc2lvbklkKS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgaiA9IGluZm9zLnJlbW92ZUF0KGopOworICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKytqOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChmb3VuZCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgRHJtU2Vzc2lvbk1hbmFnZXI6OnJlY2xhaW1TZXNzaW9uKGludCBjYWxsaW5nUGlkKSB7CisgICAgQUxPR1YoInJlY2xhaW1TZXNzaW9uKCVkKSIsIGNhbGxpbmdQaWQpOworCisgICAgc3A8RHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZT4gZHJtOworICAgIFZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQ7CisgICAgaW50IGxvd2VzdFByaW9yaXR5UGlkOworICAgIGludCBsb3dlc3RQcmlvcml0eTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICAgICAgaW50IGNhbGxpbmdQcmlvcml0eTsKKyAgICAgICAgaWYgKCFtUHJvY2Vzc0luZm8tPmdldFByaW9yaXR5KGNhbGxpbmdQaWQsICZjYWxsaW5nUHJpb3JpdHkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFnZXRMb3dlc3RQcmlvcml0eV9sKCZsb3dlc3RQcmlvcml0eVBpZCwgJmxvd2VzdFByaW9yaXR5KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChsb3dlc3RQcmlvcml0eSA8PSBjYWxsaW5nUHJpb3JpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZ2V0TGVhc3RVc2VkU2Vzc2lvbl9sKGxvd2VzdFByaW9yaXR5UGlkLCAmZHJtLCAmc2Vzc2lvbklkKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGRybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBTE9HVigicmVjbGFpbSBzZXNzaW9uKCVzKSBvcGVuZWQgYnkgcGlkICVkIiwKKyAgICAgICAgICAgIEdldFNlc3Npb25JZFN0cmluZyhzZXNzaW9uSWQpLnN0cmluZygpLCBsb3dlc3RQcmlvcml0eVBpZCk7CisKKyAgICByZXR1cm4gZHJtLT5yZWNsYWltU2Vzc2lvbihzZXNzaW9uSWQpOworfQorCitpbnQ2NF90IERybVNlc3Npb25NYW5hZ2VyOjpnZXRUaW1lX2woKSB7CisgICAgcmV0dXJuIG1UaW1lKys7Cit9CisKK2Jvb2wgRHJtU2Vzc2lvbk1hbmFnZXI6OmdldExvd2VzdFByaW9yaXR5X2woaW50KiBsb3dlc3RQcmlvcml0eVBpZCwgaW50KiBsb3dlc3RQcmlvcml0eSkgeworICAgIGludCBwaWQgPSAtMTsKKyAgICBpbnQgcHJpb3JpdHkgPSAtMTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TZXNzaW9uTWFwLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChtU2Vzc2lvbk1hcC52YWx1ZUF0KGkpLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBubyBvcGVuZWQgc2Vzc2lvbiBieSB0aGlzIHByb2Nlc3MuCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbnQgdGVtcFBpZCA9IG1TZXNzaW9uTWFwLmtleUF0KGkpOworICAgICAgICBpbnQgdGVtcFByaW9yaXR5OworICAgICAgICBpZiAoIW1Qcm9jZXNzSW5mby0+Z2V0UHJpb3JpdHkodGVtcFBpZCwgJnRlbXBQcmlvcml0eSkpIHsKKyAgICAgICAgICAgIC8vIHNob3VsZG4ndCBoYXBwZW4uCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBpZCA9PSAtMSkgeworICAgICAgICAgICAgcGlkID0gdGVtcFBpZDsKKyAgICAgICAgICAgIHByaW9yaXR5ID0gdGVtcFByaW9yaXR5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHRlbXBQcmlvcml0eSA+IHByaW9yaXR5KSB7CisgICAgICAgICAgICAgICAgcGlkID0gdGVtcFBpZDsKKyAgICAgICAgICAgICAgICBwcmlvcml0eSA9IHRlbXBQcmlvcml0eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocGlkICE9IC0xKSB7CisgICAgICAgICpsb3dlc3RQcmlvcml0eVBpZCA9IHBpZDsKKyAgICAgICAgKmxvd2VzdFByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgfQorICAgIHJldHVybiAocGlkICE9IC0xKTsKK30KKworYm9vbCBEcm1TZXNzaW9uTWFuYWdlcjo6Z2V0TGVhc3RVc2VkU2Vzc2lvbl9sKAorICAgICAgICBpbnQgcGlkLCBzcDxEcm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlPiogZHJtLCBWZWN0b3I8dWludDhfdD4qIHNlc3Npb25JZCkgeworICAgIHNzaXplX3QgaW5kZXggPSBtU2Vzc2lvbk1hcC5pbmRleE9mS2V5KHBpZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50IGxlYXN0VXNlZEluZGV4ID0gLTE7CisgICAgaW50NjRfdCBtaW5UcyA9IExMT05HX01BWDsKKyAgICBjb25zdCBTZXNzaW9uSW5mb3MmIGluZm9zID0gbVNlc3Npb25NYXAudmFsdWVBdChpbmRleCk7CisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBpbmZvcy5zaXplKCk7ICsraikgeworICAgICAgICBpZiAobGVhc3RVc2VkSW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgIGxlYXN0VXNlZEluZGV4ID0gajsKKyAgICAgICAgICAgIG1pblRzID0gaW5mb3Nbal0udGltZVN0YW1wOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGluZm9zW2pdLnRpbWVTdGFtcCA8IG1pblRzKSB7CisgICAgICAgICAgICAgICAgbGVhc3RVc2VkSW5kZXggPSBqOworICAgICAgICAgICAgICAgIG1pblRzID0gaW5mb3Nbal0udGltZVN0YW1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChsZWFzdFVzZWRJbmRleCAhPSAtMSkgeworICAgICAgICAqZHJtID0gaW5mb3NbbGVhc3RVc2VkSW5kZXhdLmRybTsKKyAgICAgICAgKnNlc3Npb25JZCA9IGluZm9zW2xlYXN0VXNlZEluZGV4XS5zZXNzaW9uSWQ7CisgICAgfQorICAgIHJldHVybiAobGVhc3RVc2VkSW5kZXggIT0gLTEpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybVNlc3Npb25NYW5hZ2VyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvRHJtU2Vzc2lvbk1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTVjMjY4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybVNlc3Npb25NYW5hZ2VyLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRFJNX1NFU1NJT05fTUFOQUdFUl9IXworCisjZGVmaW5lIERSTV9TRVNTSU9OX01BTkFHRVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRHJtU2Vzc2lvbk1hbmFnZXJUZXN0Oworc3RydWN0IERybVNlc3Npb25DbGllbnRJbnRlcmZhY2U7CitzdHJ1Y3QgUHJvY2Vzc0luZm9JbnRlcmZhY2U7CisKK2Jvb2wgaXNFcXVhbFNlc3Npb25JZChjb25zdCBWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZDEsIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkMik7CisKK3N0cnVjdCBTZXNzaW9uSW5mbyB7CisgICAgc3A8RHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZT4gZHJtOworICAgIFZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQ7CisgICAgaW50NjRfdCB0aW1lU3RhbXA7Cit9OworCit0eXBlZGVmIFZlY3RvcjxTZXNzaW9uSW5mbyA+IFNlc3Npb25JbmZvczsKK3R5cGVkZWYgS2V5ZWRWZWN0b3I8aW50LCBTZXNzaW9uSW5mb3MgPiBQaWRTZXNzaW9uSW5mb3NNYXA7CisKK3N0cnVjdCBEcm1TZXNzaW9uTWFuYWdlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBzdGF0aWMgc3A8RHJtU2Vzc2lvbk1hbmFnZXI+IEluc3RhbmNlKCk7CisKKyAgICBEcm1TZXNzaW9uTWFuYWdlcigpOworICAgIERybVNlc3Npb25NYW5hZ2VyKHNwPFByb2Nlc3NJbmZvSW50ZXJmYWNlPiBwcm9jZXNzSW5mbyk7CisKKyAgICB2b2lkIGFkZFNlc3Npb24oaW50IHBpZCwgc3A8RHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZT4gZHJtLCBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCk7CisgICAgdm9pZCB1c2VTZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKTsKKyAgICB2b2lkIHJlbW92ZVNlc3Npb24oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworICAgIHZvaWQgcmVtb3ZlRHJtKHNwPERybVNlc3Npb25DbGllbnRJbnRlcmZhY2U+IGRybSk7CisgICAgYm9vbCByZWNsYWltU2Vzc2lvbihpbnQgY2FsbGluZ1BpZCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5Ecm1TZXNzaW9uTWFuYWdlcigpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBEcm1TZXNzaW9uTWFuYWdlclRlc3Q7CisKKyAgICBpbnQ2NF90IGdldFRpbWVfbCgpOworICAgIGJvb2wgZ2V0TG93ZXN0UHJpb3JpdHlfbChpbnQqIGxvd2VzdFByaW9yaXR5UGlkLCBpbnQqIGxvd2VzdFByaW9yaXR5KTsKKyAgICBib29sIGdldExlYXN0VXNlZFNlc3Npb25fbCgKKyAgICAgICAgICAgIGludCBwaWQsIHNwPERybVNlc3Npb25DbGllbnRJbnRlcmZhY2U+KiBkcm0sIFZlY3Rvcjx1aW50OF90Piogc2Vzc2lvbklkKTsKKworICAgIHNwPFByb2Nlc3NJbmZvSW50ZXJmYWNlPiBtUHJvY2Vzc0luZm87CisgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKKyAgICBQaWRTZXNzaW9uSW5mb3NNYXAgbVNlc3Npb25NYXA7CisgICAgaW50NjRfdCBtVGltZTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERybVNlc3Npb25NYW5hZ2VyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gRFJNX1NFU1NJT05fTUFOQUdFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcAppbmRleCA0ODg4NGI5Li5kNWQxMmY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcApAQCAtNzAsMTIgKzcwLDYgQEAKICAgICAgICAgcmV0dXJuIFNUQUdFRlJJR0hUX1BMQVlFUjsKICAgICB9CiAKLSAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBFWFBFUklNRU5UQUwgZGV2ZWxvcGVyIHNldHRpbmdzIHByb3BlcnR5Ci0gICAgaWYgKHByb3BlcnR5X2dldCgicGVyc2lzdC5zeXMubWVkaWEudXNlLWF3ZXNvbWUiLCB2YWx1ZSwgTlVMTCkKLSAgICAgICAgICAgICYmICFzdHJjYXNlY21wKCJ0cnVlIiwgdmFsdWUpKSB7Ci0gICAgICAgIHJldHVybiBTVEFHRUZSSUdIVF9QTEFZRVI7Ci0gICAgfQotCiAgICAgcmV0dXJuIE5VX1BMQVlFUjsKIH0KIApAQCAtMTMxLDEyICsxMjUsMTggQEAKICAgICBHRVRfUExBWUVSX1RZUEVfSU1QTChjbGllbnQsIHNvdXJjZSk7CiB9CiAKK3BsYXllcl90eXBlIE1lZGlhUGxheWVyRmFjdG9yeTo6Z2V0UGxheWVyVHlwZShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkgeworICAgIEdFVF9QTEFZRVJfVFlQRV9JTVBMKGNsaWVudCwgc291cmNlKTsKK30KKwogI3VuZGVmIEdFVF9QTEFZRVJfVFlQRV9JTVBMCiAKIHNwPE1lZGlhUGxheWVyQmFzZT4gTWVkaWFQbGF5ZXJGYWN0b3J5OjpjcmVhdGVQbGF5ZXIoCiAgICAgICAgIHBsYXllcl90eXBlIHBsYXllclR5cGUsCiAgICAgICAgIHZvaWQqIGNvb2tpZSwKLSAgICAgICAgbm90aWZ5X2NhbGxiYWNrX2Ygbm90aWZ5RnVuYykgeworICAgICAgICBub3RpZnlfY2FsbGJhY2tfZiBub3RpZnlGdW5jLAorICAgICAgICBwaWRfdCBwaWQpIHsKICAgICBzcDxNZWRpYVBsYXllckJhc2U+IHA7CiAgICAgSUZhY3RvcnkqIGZhY3Rvcnk7CiAgICAgc3RhdHVzX3QgaW5pdF9yZXN1bHQ7CkBAIC0xNTAsNyArMTUwLDcgQEAKIAogICAgIGZhY3RvcnkgPSBzRmFjdG9yeU1hcC52YWx1ZUZvcihwbGF5ZXJUeXBlKTsKICAgICBDSEVDSyhOVUxMICE9IGZhY3RvcnkpOwotICAgIHAgPSBmYWN0b3J5LT5jcmVhdGVQbGF5ZXIoKTsKKyAgICBwID0gZmFjdG9yeS0+Y3JlYXRlUGxheWVyKHBpZCk7CiAKICAgICBpZiAocCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIHBsYXllciBvYmplY3Qgb2YgdHlwZSAlZCwgY3JlYXRlIGZhaWxlZCIsCkBAIC0yMTgsNyArMjE4LDcgQEAKICAgICAgICAgcmV0dXJuIDAuMDsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHNwPE1lZGlhUGxheWVyQmFzZT4gY3JlYXRlUGxheWVyKCkgeworICAgIHZpcnR1YWwgc3A8TWVkaWFQbGF5ZXJCYXNlPiBjcmVhdGVQbGF5ZXIocGlkX3QgLyogcGlkICovKSB7CiAgICAgICAgIEFMT0dWKCIgY3JlYXRlIFN0YWdlZnJpZ2h0UGxheWVyIik7CiAgICAgICAgIHJldHVybiBuZXcgU3RhZ2VmcmlnaHRQbGF5ZXIoKTsKICAgICB9CkBAIC0yNzMsOSArMjczLDE2IEBACiAgICAgICAgIHJldHVybiAxLjA7CiAgICAgfQogCi0gICAgdmlydHVhbCBzcDxNZWRpYVBsYXllckJhc2U+IGNyZWF0ZVBsYXllcigpIHsKKyAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiAvKmNsaWVudCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+JiAvKnNvdXJjZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IC8qY3VyU2NvcmUqLykgeworICAgICAgICAvLyBPbmx5IE51UGxheWVyIHN1cHBvcnRzIHNldHRpbmcgYSBEYXRhU291cmNlIHNvdXJjZSBkaXJlY3RseS4KKyAgICAgICAgcmV0dXJuIDEuMDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNwPE1lZGlhUGxheWVyQmFzZT4gY3JlYXRlUGxheWVyKHBpZF90IHBpZCkgewogICAgICAgICBBTE9HVigiIGNyZWF0ZSBOdVBsYXllciIpOwotICAgICAgICByZXR1cm4gbmV3IE51UGxheWVyRHJpdmVyOworICAgICAgICByZXR1cm4gbmV3IE51UGxheWVyRHJpdmVyKHBpZCk7CiAgICAgfQogfTsKIApAQCAtMjkxLDcgKzI5OCw3IEBACiAgICAgICAgIHJldHVybiAwLjA7CiAgICAgfQogCi0gICAgdmlydHVhbCBzcDxNZWRpYVBsYXllckJhc2U+IGNyZWF0ZVBsYXllcigpIHsKKyAgICB2aXJ0dWFsIHNwPE1lZGlhUGxheWVyQmFzZT4gY3JlYXRlUGxheWVyKHBpZF90IC8qIHBpZCAqLykgewogICAgICAgICBBTE9HVigiQ3JlYXRlIFRlc3QgUGxheWVyIHN0dWIiKTsKICAgICAgICAgcmV0dXJuIG5ldyBUZXN0UGxheWVyU3R1YigpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuaAppbmRleCA1NWZmOTE4Li5lMjJhNTZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5oCkBAIC00Myw3ICs0MywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmLypzb3VyY2UqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgLypjdXJTY29yZSovKSB7IHJldHVybiAwLjA7IH0KIAotICAgICAgICB2aXJ0dWFsIHNwPE1lZGlhUGxheWVyQmFzZT4gY3JlYXRlUGxheWVyKCkgPSAwOworICAgICAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiAvKmNsaWVudCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmLypzb3VyY2UqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgLypjdXJTY29yZSovKSB7IHJldHVybiAwLjA7IH0KKworICAgICAgICB2aXJ0dWFsIHNwPE1lZGlhUGxheWVyQmFzZT4gY3JlYXRlUGxheWVyKHBpZF90IHBpZCkgPSAwOwogICAgIH07CiAKICAgICBzdGF0aWMgc3RhdHVzX3QgcmVnaXN0ZXJGYWN0b3J5KElGYWN0b3J5KiBmYWN0b3J5LApAQCAtNTcsMTAgKzYxLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBsZW5ndGgpOwogICAgIHN0YXRpYyBwbGF5ZXJfdHlwZSBnZXRQbGF5ZXJUeXBlKGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlKTsKKyAgICBzdGF0aWMgcGxheWVyX3R5cGUgZ2V0UGxheWVyVHlwZShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSk7CiAKICAgICBzdGF0aWMgc3A8TWVkaWFQbGF5ZXJCYXNlPiBjcmVhdGVQbGF5ZXIocGxheWVyX3R5cGUgcGxheWVyVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29va2llLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlfY2FsbGJhY2tfZiBub3RpZnlGdW5jKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5X2NhbGxiYWNrX2Ygbm90aWZ5RnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkKTsKIAogICAgIHN0YXRpYyB2b2lkIHJlZ2lzdGVyQnVpbHRpbkZhY3RvcmllcygpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCmluZGV4IDY5NGYxYTQuLjU2NTIxYTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCkBAIC0zNCw3ICszNCw2IEBACiAKICNpbmNsdWRlIDx1dGlscy9taXNjLmg+CiAKLSNpbmNsdWRlIDxiaW5kZXIvSUJhdHRlcnlTdGF0cy5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KQEAgLTQ2LDYgKzQ1LDcgQEAKICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JUmVtb3RlRGlzcGxheS5oPgogI2luY2x1ZGUgPG1lZGlhL0lSZW1vdGVEaXNwbGF5Q2xpZW50Lmg+CkBAIC02MCw2ICs2MCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvQmF0dGVyeU5vdGlmaWVyLmg+CiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIApAQCAtMjg3LDE2ICsyODgsOSBAQAogICAgIC8vIHJlc2V0IGJhdHRlcnkgc3RhdHMKICAgICAvLyBpZiB0aGUgbWVkaWFzZXJ2ZXIgaGFzIGNyYXNoZWQsIGJhdHRlcnkgc3RhdHMgY291bGQgYmUgbGVmdAogICAgIC8vIGluIGJhZCBzdGF0ZSwgcmVzZXQgdGhlIHN0YXRlIHVwb24gc2VydmljZSBzdGFydC4KLSAgICBjb25zdCBzcDxJU2VydmljZU1hbmFnZXI+IHNtKGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpKTsKLSAgICBpZiAoc20gIT0gTlVMTCkgewotICAgICAgICBjb25zdCBTdHJpbmcxNiBuYW1lKCJiYXR0ZXJ5c3RhdHMiKTsKLSAgICAgICAgc3A8SUJhdHRlcnlTdGF0cz4gYmF0dGVyeVN0YXRzID0KLSAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJQmF0dGVyeVN0YXRzPihzbS0+Z2V0U2VydmljZShuYW1lKSk7Ci0gICAgICAgIGlmIChiYXR0ZXJ5U3RhdHMgIT0gTlVMTCkgewotICAgICAgICAgICAgYmF0dGVyeVN0YXRzLT5ub3RlUmVzZXRWaWRlbygpOwotICAgICAgICAgICAgYmF0dGVyeVN0YXRzLT5ub3RlUmVzZXRBdWRpbygpOwotICAgICAgICB9Ci0gICAgfQorICAgIEJhdHRlcnlOb3RpZmllciYgbm90aWZpZXIoQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpKTsKKyAgICBub3RpZmllci5ub3RlUmVzZXRWaWRlbygpOworICAgIG5vdGlmaWVyLm5vdGVSZXNldEF1ZGlvKCk7CiAKICAgICBNZWRpYVBsYXllckZhY3Rvcnk6OnJlZ2lzdGVyQnVpbHRpbkZhY3RvcmllcygpOwogfQpAQCAtMzA2LDEwICszMDAsMTAgQEAKICAgICBBTE9HVigiTWVkaWFQbGF5ZXJTZXJ2aWNlIGRlc3Ryb3llZCIpOwogfQogCi1zcDxJTWVkaWFSZWNvcmRlcj4gTWVkaWFQbGF5ZXJTZXJ2aWNlOjpjcmVhdGVNZWRpYVJlY29yZGVyKCkKK3NwPElNZWRpYVJlY29yZGVyPiBNZWRpYVBsYXllclNlcnZpY2U6OmNyZWF0ZU1lZGlhUmVjb3JkZXIoY29uc3QgU3RyaW5nMTYgJm9wUGFja2FnZU5hbWUpCiB7CiAgICAgcGlkX3QgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgIHNwPE1lZGlhUmVjb3JkZXJDbGllbnQ+IHJlY29yZGVyID0gbmV3IE1lZGlhUmVjb3JkZXJDbGllbnQodGhpcywgcGlkKTsKKyAgICBzcDxNZWRpYVJlY29yZGVyQ2xpZW50PiByZWNvcmRlciA9IG5ldyBNZWRpYVJlY29yZGVyQ2xpZW50KHRoaXMsIHBpZCwgb3BQYWNrYWdlTmFtZSk7CiAgICAgd3A8TWVkaWFSZWNvcmRlckNsaWVudD4gdyA9IHJlY29yZGVyOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBtTWVkaWFSZWNvcmRlckNsaWVudHMuYWRkKHcpOwpAQCAtMzgwLDEyICszNzQsMTMgQEAKIH0KIAogc3A8SVJlbW90ZURpc3BsYXk+IE1lZGlhUGxheWVyU2VydmljZTo6bGlzdGVuRm9yUmVtb3RlRGlzcGxheSgKKyAgICAgICAgY29uc3QgU3RyaW5nMTYgJm9wUGFja2FnZU5hbWUsCiAgICAgICAgIGNvbnN0IHNwPElSZW1vdGVEaXNwbGF5Q2xpZW50PiYgY2xpZW50LCBjb25zdCBTdHJpbmc4JiBpZmFjZSkgewogICAgIGlmICghY2hlY2tQZXJtaXNzaW9uKCJhbmRyb2lkLnBlcm1pc3Npb24uQ09OVFJPTF9XSUZJX0RJU1BMQVkiKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICByZXR1cm4gbmV3IFJlbW90ZURpc3BsYXkoY2xpZW50LCBpZmFjZS5zdHJpbmcoKSk7CisgICAgcmV0dXJuIG5ldyBSZW1vdGVEaXNwbGF5KG9wUGFja2FnZU5hbWUsIGNsaWVudCwgaWZhY2Uuc3RyaW5nKCkpOwogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QKQEAgLTQxMiw3ICs0MDcsNyBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdAorc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwpAQCAtNDQxLDYgKzQzNiw5IEBACiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgU29ydGVkVmVjdG9yPCBzcDxDbGllbnQ+ID4gY2xpZW50czsgLy90byBzZXJpYWxpc2UgdGhlIG11dGV4IHVubG9jayAmIGNsaWVudCBkZXN0cnVjdGlvbi4KKyAgICBTb3J0ZWRWZWN0b3I8IHNwPE1lZGlhUmVjb3JkZXJDbGllbnQ+ID4gbWVkaWFSZWNvcmRlckNsaWVudHM7CisKICAgICBpZiAoY2hlY2tDYWxsaW5nUGVybWlzc2lvbihTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKSkgPT0gZmFsc2UpIHsKICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUGVybWlzc2lvbiBEZW5pYWw6ICIKICAgICAgICAgICAgICAgICAiY2FuJ3QgZHVtcCBNZWRpYVBsYXllclNlcnZpY2UgZnJvbSBwaWQ9JWQsIHVpZD0lZFxuIiwKQEAgLTQ1Miw2ICs0NTAsNyBAQAogICAgICAgICBmb3IgKGludCBpID0gMCwgbiA9IG1DbGllbnRzLnNpemUoKTsgaSA8IG47ICsraSkgewogICAgICAgICAgICAgc3A8Q2xpZW50PiBjID0gbUNsaWVudHNbaV0ucHJvbW90ZSgpOwogICAgICAgICAgICAgaWYgKGMgIT0gMCkgYy0+ZHVtcChmZCwgYXJncyk7CisgICAgICAgICAgICBjbGllbnRzLmFkZChjKTsKICAgICAgICAgfQogICAgICAgICBpZiAobU1lZGlhUmVjb3JkZXJDbGllbnRzLnNpemUoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIE5vIG1lZGlhIHJlY29yZGVyIGNsaWVudFxuXG4iKTsKQEAgLTQ2NCw2ICs0NjMsNyBAQAogICAgICAgICAgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gIlxuIjsKICAgICAgICAgICAgICAgICAgICAgYy0+ZHVtcChmZCwgYXJncyk7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhUmVjb3JkZXJDbGllbnRzLmFkZChjKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTYzMyw3ICs2MzMsNyBAQAogICAgICAgICBwLmNsZWFyKCk7CiAgICAgfQogICAgIGlmIChwID09IE5VTEwpIHsKLSAgICAgICAgcCA9IE1lZGlhUGxheWVyRmFjdG9yeTo6Y3JlYXRlUGxheWVyKHBsYXllclR5cGUsIHRoaXMsIG5vdGlmeSk7CisgICAgICAgIHAgPSBNZWRpYVBsYXllckZhY3Rvcnk6OmNyZWF0ZVBsYXllcihwbGF5ZXJUeXBlLCB0aGlzLCBub3RpZnksIG1QaWQpOwogICAgIH0KIAogICAgIGlmIChwICE9IE5VTEwpIHsKQEAgLTY1NSw2ICs2NTUsNyBAQAogICAgIH0KIAogICAgIGlmICghcC0+aGFyZHdhcmVPdXRwdXQoKSkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgICAgIG1BdWRpb091dHB1dCA9IG5ldyBBdWRpb091dHB1dChtQXVkaW9TZXNzaW9uSWQsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSwKICAgICAgICAgICAgICAgICBtUGlkLCBtQXVkaW9BdHRyaWJ1dGVzKTsKICAgICAgICAgc3RhdGljX2Nhc3Q8TWVkaWFQbGF5ZXJJbnRlcmZhY2UqPihwLmdldCgpKS0+c2V0QXVkaW9TaW5rKG1BdWRpb091dHB1dCk7CkBAIC03NDAsNyArNzQxLDcgQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCi0gICAgQUxPR1YoInN0X2RldiAgPSAlbGx1Iiwgc2Iuc3RfZGV2KTsKKyAgICBBTE9HVigic3RfZGV2ICA9ICVsbHUiLCBzdGF0aWNfY2FzdDx1aW50NjRfdD4oc2Iuc3RfZGV2KSk7CiAgICAgQUxPR1YoInN0X21vZGUgPSAldSIsIHNiLnN0X21vZGUpOwogICAgIEFMT0dWKCJzdF91aWQgID0gJWx1Iiwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oc2Iuc3RfdWlkKSk7CiAgICAgQUxPR1YoInN0X2dpZCAgPSAlbHUiLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihzYi5zdF9naWQpKTsKQEAgLTc4NCw2ICs3ODUsMTkgQEAKICAgICByZXR1cm4gbVN0YXR1czsKIH0KIAorc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OnNldERhdGFTb3VyY2UoCisgICAgICAgIGNvbnN0IHNwPElEYXRhU291cmNlPiAmc291cmNlKSB7CisgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9IERhdGFTb3VyY2U6OkNyZWF0ZUZyb21JRGF0YVNvdXJjZShzb3VyY2UpOworICAgIHBsYXllcl90eXBlIHBsYXllclR5cGUgPSBNZWRpYVBsYXllckZhY3Rvcnk6OmdldFBsYXllclR5cGUodGhpcywgZGF0YVNvdXJjZSk7CisgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBwID0gc2V0RGF0YVNvdXJjZV9wcmUocGxheWVyVHlwZSk7CisgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgLy8gbm93IHNldCBkYXRhIHNvdXJjZQorICAgIHNldERhdGFTb3VyY2VfcG9zdChwLCBwLT5zZXREYXRhU291cmNlKGRhdGFTb3VyY2UpKTsKKyAgICByZXR1cm4gbVN0YXR1czsKK30KKwogdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6ZGlzY29ubmVjdE5hdGl2ZVdpbmRvdygpIHsKICAgICBpZiAobUNvbm5lY3RlZFdpbmRvdyAhPSBOVUxMKSB7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3QobUNvbm5lY3RlZFdpbmRvdy5nZXQoKSwKQEAgLTk2MSw2ICs5NzUsNTQgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3N0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlJiByYXRlKQoreworICAgIEFMT0dWKCJbJWRdIHNldFBsYXliYWNrU2V0dGluZ3MoJWYsICVmLCAlZCwgJWQpIiwKKyAgICAgICAgICAgIG1Db25uSWQsIHJhdGUubVNwZWVkLCByYXRlLm1QaXRjaCwgcmF0ZS5tRmFsbGJhY2tNb2RlLCByYXRlLm1TdHJldGNoTW9kZSk7CisgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBwID0gZ2V0UGxheWVyKCk7CisgICAgaWYgKHAgPT0gMCkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgcmV0dXJuIHAtPnNldFBsYXliYWNrU2V0dGluZ3MocmF0ZSk7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlKiByYXRlIC8qIG5vbm51bGwgKi8pCit7CisgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBwID0gZ2V0UGxheWVyKCk7CisgICAgaWYgKHAgPT0gMCkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgc3RhdHVzX3QgcmV0ID0gcC0+Z2V0UGxheWJhY2tTZXR0aW5ncyhyYXRlKTsKKyAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dWKCJbJWRdIGdldFBsYXliYWNrU2V0dGluZ3MoJWYsICVmLCAlZCwgJWQpIiwKKyAgICAgICAgICAgICAgICBtQ29ubklkLCByYXRlLT5tU3BlZWQsIHJhdGUtPm1QaXRjaCwgcmF0ZS0+bUZhbGxiYWNrTW9kZSwgcmF0ZS0+bVN0cmV0Y2hNb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiWyVkXSBnZXRQbGF5YmFja1NldHRpbmdzIHJldHVybmVkICVkIiwgbUNvbm5JZCwgcmV0KTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OnNldFN5bmNTZXR0aW5ncygKKyAgICAgICAgY29uc3QgQVZTeW5jU2V0dGluZ3MmIHN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCkKK3sKKyAgICBBTE9HVigiWyVkXSBzZXRTeW5jU2V0dGluZ3MoJXUsICV1LCAlZiwgJWYpIiwKKyAgICAgICAgICAgIG1Db25uSWQsIHN5bmMubVNvdXJjZSwgc3luYy5tQXVkaW9BZGp1c3RNb2RlLCBzeW5jLm1Ub2xlcmFuY2UsIHZpZGVvRnBzSGludCk7CisgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBwID0gZ2V0UGxheWVyKCk7CisgICAgaWYgKHAgPT0gMCkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgcmV0dXJuIHAtPnNldFN5bmNTZXR0aW5ncyhzeW5jLCB2aWRlb0Zwc0hpbnQpOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6Z2V0U3luY1NldHRpbmdzKAorICAgICAgICBBVlN5bmNTZXR0aW5ncyogc3luYyAvKiBub25udWxsICovLCBmbG9hdCogdmlkZW9GcHMgLyogbm9ubnVsbCAqLykKK3sKKyAgICBzcDxNZWRpYVBsYXllckJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKKyAgICBpZiAocCA9PSAwKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICBzdGF0dXNfdCByZXQgPSBwLT5nZXRTeW5jU2V0dGluZ3Moc3luYywgdmlkZW9GcHMpOworICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1YoIlslZF0gZ2V0U3luY1NldHRpbmdzKCV1LCAldSwgJWYsICVmKSIsCisgICAgICAgICAgICAgICAgbUNvbm5JZCwgc3luYy0+bVNvdXJjZSwgc3luYy0+bUF1ZGlvQWRqdXN0TW9kZSwgc3luYy0+bVRvbGVyYW5jZSwgKnZpZGVvRnBzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiWyVkXSBnZXRTeW5jU2V0dGluZ3MgcmV0dXJuZWQgJWQiLCBtQ29ubklkLCByZXQpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6Z2V0Q3VycmVudFBvc2l0aW9uKGludCAqbXNlYykKIHsKICAgICBBTE9HVigiZ2V0Q3VycmVudFBvc2l0aW9uIik7CkBAIC0xMDQwLDYgKzExMDIsOSBAQAogewogICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzICE9IE5VTEwpIHsgZnJlZShtQXVkaW9BdHRyaWJ1dGVzKTsgfQogICAgIG1BdWRpb0F0dHJpYnV0ZXMgPSAoYXVkaW9fYXR0cmlidXRlc190ICopIGNhbGxvYygxLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KICAgICB1bm1hcnNoYWxsQXVkaW9BdHRyaWJ1dGVzKHBhcmNlbCwgbUF1ZGlvQXR0cmlidXRlcyk7CiAKICAgICBBTE9HVigic2V0QXVkaW9BdHRyaWJ1dGVzX2woKSB1c2FnZT0lZCBjb250ZW50PSVkIGZsYWdzPTB4JXggdGFncz0lcyIsCkBAIC0xMjc1LDI5ICsxMzQwLDQyIEBACiAgICAgICBtQ2FsbGJhY2tDb29raWUoTlVMTCksCiAgICAgICBtQ2FsbGJhY2tEYXRhKE5VTEwpLAogICAgICAgbUJ5dGVzV3JpdHRlbigwKSwKKyAgICAgIG1TdHJlYW1UeXBlKEFVRElPX1NUUkVBTV9NVVNJQyksCisgICAgICBtTGVmdFZvbHVtZSgxLjApLAorICAgICAgbVJpZ2h0Vm9sdW1lKDEuMCksCisgICAgICBtUGxheWJhY2tSYXRlKEFVRElPX1BMQVlCQUNLX1JBVEVfREVGQVVMVCksCisgICAgICBtU2FtcGxlUmF0ZUh6KDApLAorICAgICAgbU1zZWNzUGVyRnJhbWUoMCksCisgICAgICBtRnJhbWVTaXplKDApLAogICAgICAgbVNlc3Npb25JZChzZXNzaW9uSWQpLAogICAgICAgbVVpZCh1aWQpLAogICAgICAgbVBpZChwaWQpLAotICAgICAgbUZsYWdzKEFVRElPX09VVFBVVF9GTEFHX05PTkUpIHsKKyAgICAgIG1TZW5kTGV2ZWwoMC4wKSwKKyAgICAgIG1BdXhFZmZlY3RJZCgwKSwKKyAgICAgIG1GbGFncyhBVURJT19PVVRQVVRfRkxBR19OT05FKQorewogICAgIEFMT0dWKCJBdWRpb091dHB1dCglZCkiLCBzZXNzaW9uSWQpOwotICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOwotICAgIG1MZWZ0Vm9sdW1lID0gMS4wOwotICAgIG1SaWdodFZvbHVtZSA9IDEuMDsKLSAgICBtUGxheWJhY2tSYXRlUGVybWlsbGUgPSAxMDAwOwotICAgIG1TYW1wbGVSYXRlSHogPSAwOwotICAgIG1Nc2Vjc1BlckZyYW1lID0gMDsKLSAgICBtQXV4RWZmZWN0SWQgPSAwOwotICAgIG1TZW5kTGV2ZWwgPSAwLjA7CisgICAgaWYgKGF0dHIgIT0gTlVMTCkgeworICAgICAgICBtQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgaWYgKG1BdHRyaWJ1dGVzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1lbWNweShtQXR0cmlidXRlcywgYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICAgICAgbVN0cmVhbVR5cGUgPSBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKGF0dHIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUF0dHJpYnV0ZXMgPSBOVUxMOworICAgIH0KKwogICAgIHNldE1pbkJ1ZmZlckNvdW50KCk7Ci0gICAgbUF0dHJpYnV0ZXMgPSBhdHRyOwogfQogCiBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0Ojp+QXVkaW9PdXRwdXQoKQogewogICAgIGNsb3NlKCk7CisgICAgZnJlZShtQXR0cmlidXRlcyk7CiAgICAgZGVsZXRlIG1DYWxsYmFja0RhdGE7CiB9CiAKKy8vc3RhdGljCiB2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OnNldE1pbkJ1ZmZlckNvdW50KCkKIHsKICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CkBAIC0xMzA3LDkyICsxMzg1LDEyMyBAQAogICAgIH0KIH0KIAorLy8gc3RhdGljCiBib29sIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmlzT25FbXVsYXRvcigpCiB7Ci0gICAgc2V0TWluQnVmZmVyQ291bnQoKTsKKyAgICBzZXRNaW5CdWZmZXJDb3VudCgpOyAvLyBiZW5pZ24gcmFjZSB3cnQgb3RoZXIgdGhyZWFkcwogICAgIHJldHVybiBtSXNPbkVtdWxhdG9yOwogfQogCisvLyBzdGF0aWMKIGludCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpnZXRNaW5CdWZmZXJDb3VudCgpCiB7Ci0gICAgc2V0TWluQnVmZmVyQ291bnQoKTsKKyAgICBzZXRNaW5CdWZmZXJDb3VudCgpOyAvLyBiZW5pZ24gcmFjZSB3cnQgb3RoZXIgdGhyZWFkcwogICAgIHJldHVybiBtTWluQnVmZmVyQ291bnQ7CiB9CiAKIHNzaXplX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6YnVmZmVyU2l6ZSgpIGNvbnN0CiB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIG1UcmFjay0+ZnJhbWVDb3VudCgpICogZnJhbWVTaXplKCk7CisgICAgcmV0dXJuIG1UcmFjay0+ZnJhbWVDb3VudCgpICogbUZyYW1lU2l6ZTsKIH0KIAogc3NpemVfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpmcmFtZUNvdW50KCkgY29uc3QKIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKG1UcmFjayA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gbVRyYWNrLT5mcmFtZUNvdW50KCk7CiB9CiAKIHNzaXplX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6Y2hhbm5lbENvdW50KCkgY29uc3QKIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKG1UcmFjayA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gbVRyYWNrLT5jaGFubmVsQ291bnQoKTsKIH0KIAogc3NpemVfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpmcmFtZVNpemUoKSBjb25zdAogeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBpZiAobVRyYWNrID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBtVHJhY2stPmZyYW1lU2l6ZSgpOworICAgIHJldHVybiBtRnJhbWVTaXplOwogfQogCiB1aW50MzJfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpsYXRlbmN5ICgpIGNvbnN0CiB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIDA7CiAgICAgcmV0dXJuIG1UcmFjay0+bGF0ZW5jeSgpOwogfQogCiBmbG9hdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0Ojptc2Vjc1BlckZyYW1lKCkgY29uc3QKIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgcmV0dXJuIG1Nc2Vjc1BlckZyYW1lOwogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpnZXRQb3NpdGlvbih1aW50MzJfdCAqcG9zaXRpb24pIGNvbnN0CiB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIG1UcmFjay0+Z2V0UG9zaXRpb24ocG9zaXRpb24pOwogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAgJnRzKSBjb25zdAogeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBpZiAobVRyYWNrID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBtVHJhY2stPmdldFRpbWVzdGFtcCh0cyk7CiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKmZyYW1lc3dyaXR0ZW4pIGNvbnN0CiB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgKmZyYW1lc3dyaXR0ZW4gPSBtQnl0ZXNXcml0dGVuIC8gZnJhbWVTaXplKCk7CisgICAgKmZyYW1lc3dyaXR0ZW4gPSBtQnl0ZXNXcml0dGVuIC8gbUZyYW1lU2l6ZTsKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykKIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKG1UcmFjayA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gbVRyYWNrLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOwogfQogCiBTdHJpbmc4ICBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpCiB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIFN0cmluZzg6OmVtcHR5KCk7CiAgICAgcmV0dXJuIG1UcmFjay0+Z2V0UGFyYW1ldGVycyhrZXlzKTsKIH0KIAogdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpzZXRBdWRpb0F0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICogYXR0cmlidXRlcykgewotICAgIG1BdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKGF0dHJpYnV0ZXMgPT0gTlVMTCkgeworICAgICAgICBmcmVlKG1BdHRyaWJ1dGVzKTsKKyAgICAgICAgbUF0dHJpYnV0ZXMgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtQXR0cmlidXRlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICBtQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkobUF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgbVN0cmVhbVR5cGUgPSBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKGF0dHJpYnV0ZXMpOworICAgIH0KIH0KIAotdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpkZWxldGVSZWN5Y2xlZFRyYWNrKCkKK3ZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6c2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkKIHsKLSAgICBBTE9HVigiZGVsZXRlUmVjeWNsZWRUcmFjayIpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICAvLyBkbyBub3QgYWxsb3cgZGlyZWN0IHN0cmVhbSB0eXBlIG1vZGlmaWNhdGlvbiBpZiBhdHRyaWJ1dGVzIGhhdmUgYmVlbiBzZXQKKyAgICBpZiAobUF0dHJpYnV0ZXMgPT0gTlVMTCkgeworICAgICAgICBtU3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7CisgICAgfQorfQogCit2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmRlbGV0ZVJlY3ljbGVkVHJhY2tfbCgpCit7CisgICAgQUxPR1YoImRlbGV0ZVJlY3ljbGVkVHJhY2tfbCIpOwogICAgIGlmIChtUmVjeWNsZWRUcmFjayAhPSAwKSB7CiAKICAgICAgICAgaWYgKG1DYWxsYmFja0RhdGEgIT0gTlVMTCkgewpAQCAtMTQxMCwzMyArMTUxOSwyOCBAQAogICAgICAgICAvLyBBdWRpb0ZsaW5nZXIgdG8gZHJhaW4gdGhlIHRyYWNrLgogCiAgICAgICAgIG1SZWN5Y2xlZFRyYWNrLmNsZWFyKCk7CisgICAgICAgIGNsb3NlX2woKTsKICAgICAgICAgZGVsZXRlIG1DYWxsYmFja0RhdGE7CiAgICAgICAgIG1DYWxsYmFja0RhdGEgPSBOVUxMOwotICAgICAgICBjbG9zZSgpOwogICAgIH0KIH0KIAordm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpjbG9zZV9sKCkKK3sKKyAgICBtVHJhY2suY2xlYXIoKTsKK30KKwogc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6b3BlbigKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IGJ1ZmZlckNvdW50LAogICAgICAgICBBdWRpb0NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUsCiAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCisgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbywKKyAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCwKKyAgICAgICAgdWludDMyX3Qgc3VnZ2VzdGVkRnJhbWVDb3VudCkKIHsKLSAgICBtQ2FsbGJhY2sgPSBjYjsKLSAgICBtQ2FsbGJhY2tDb29raWUgPSBjb29raWU7Ci0KLSAgICAvLyBDaGVjayBhcmd1bWVudCAiYnVmZmVyQ291bnQiIGFnYWluc3QgdGhlIG1pbmludW0gYnVmZmVyIGNvdW50Ci0gICAgaWYgKGJ1ZmZlckNvdW50IDwgbU1pbkJ1ZmZlckNvdW50KSB7Ci0gICAgICAgIEFMT0dEKCJidWZmZXJDb3VudCAoJWQpIGlzIHRvbyBzbWFsbCBhbmQgaW5jcmVhc2VkIHRvICVkIiwgYnVmZmVyQ291bnQsIG1NaW5CdWZmZXJDb3VudCk7Ci0gICAgICAgIGJ1ZmZlckNvdW50ID0gbU1pbkJ1ZmZlckNvdW50OwotCi0gICAgfQogICAgIEFMT0dWKCJvcGVuKCV1LCAlZCwgMHgleCwgMHgleCwgJWQsICVkIDB4JXgpIiwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50LCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICBmb3JtYXQsIGJ1ZmZlckNvdW50LCBtU2Vzc2lvbklkLCBmbGFncyk7Ci0gICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwotICAgIHNpemVfdCBhZkZyYW1lQ291bnQ7Ci0gICAgc2l6ZV90IGZyYW1lQ291bnQ7CiAKICAgICAvLyBvZmZsb2FkaW5nIGlzIG9ubHkgc3VwcG9ydGVkIGluIGNhbGxiYWNrIG1vZGUgZm9yIG5vdy4KICAgICAvLyBvZmZsb2FkSW5mbyBtdXN0IGJlIHByZXNlbnQgaWYgb2ZmbG9hZCBmbGFnIGlzIHNldApAQCAtMTQ0NSwyMCArMTU0OSwzNiBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAorICAgIC8vIGNvbXB1dGUgZnJhbWUgY291bnQgZm9yIHRoZSBBdWRpb1RyYWNrIGludGVybmFsIGJ1ZmZlcgorICAgIHNpemVfdCBmcmFtZUNvdW50OwogICAgIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSB7CiAgICAgICAgIGZyYW1lQ291bnQgPSAwOyAvLyBBdWRpb1RyYWNrIHdpbGwgZ2V0IGZyYW1lIGNvdW50IGZyb20gQXVkaW9GbGluZ2VyCiAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gdHJ5IHRvIGVzdGltYXRlIHRoZSBidWZmZXIgcHJvY2Vzc2luZyBmZXRjaCBzaXplIGZyb20gQXVkaW9GbGluZ2VyLgorICAgICAgICAvLyBmcmFtZXNQZXJCdWZmZXIgaXMgYXBwcm94aW1hdGUgYW5kIGdlbmVyYWxseSBjb3JyZWN0LCBleGNlcHQgd2hlbiBpdCdzIG5vdCA6LSkuCiAgICAgICAgIHVpbnQzMl90IGFmU2FtcGxlUmF0ZTsKICAgICAgICAgc2l6ZV90IGFmRnJhbWVDb3VudDsKLQogICAgICAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dEZyYW1lQ291bnQoJmFmRnJhbWVDb3VudCwgbVN0cmVhbVR5cGUpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICAgICAgfQogICAgICAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZSgmYWZTYW1wbGVSYXRlLCBtU3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgICAgICB9CisgICAgICAgIGNvbnN0IHNpemVfdCBmcmFtZXNQZXJCdWZmZXIgPQorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2FtcGxlUmF0ZSAqIGFmRnJhbWVDb3VudCAvIGFmU2FtcGxlUmF0ZTsKIAotICAgICAgICBmcmFtZUNvdW50ID0gKHNhbXBsZVJhdGUqYWZGcmFtZUNvdW50KmJ1ZmZlckNvdW50KS9hZlNhbXBsZVJhdGU7CisgICAgICAgIGlmIChidWZmZXJDb3VudCA9PSAwKSB7CisgICAgICAgICAgICAvLyB1c2Ugc3VnZ2VzdGVkRnJhbWVDb3VudAorICAgICAgICAgICAgYnVmZmVyQ291bnQgPSAoc3VnZ2VzdGVkRnJhbWVDb3VudCArIGZyYW1lc1BlckJ1ZmZlciAtIDEpIC8gZnJhbWVzUGVyQnVmZmVyOworICAgICAgICB9CisgICAgICAgIC8vIENoZWNrIGFyZ3VtZW50IGJ1ZmZlckNvdW50IGFnYWluc3QgdGhlIG1pbmludW0gYnVmZmVyIGNvdW50CisgICAgICAgIGlmIChidWZmZXJDb3VudCAhPSAwICYmIGJ1ZmZlckNvdW50IDwgbU1pbkJ1ZmZlckNvdW50KSB7CisgICAgICAgICAgICBBTE9HVigiYnVmZmVyQ291bnQgKCVkKSBpbmNyZWFzZWQgdG8gJWQiLCBidWZmZXJDb3VudCwgbU1pbkJ1ZmZlckNvdW50KTsKKyAgICAgICAgICAgIGJ1ZmZlckNvdW50ID0gbU1pbkJ1ZmZlckNvdW50OworICAgICAgICB9CisgICAgICAgIC8vIGlmIGZyYW1lQ291bnQgaXMgMCwgdGhlbiBBdWRpb1RyYWNrIHdpbGwgZ2V0IGZyYW1lIGNvdW50IGZyb20gQXVkaW9GbGluZ2VyCisgICAgICAgIC8vIHdoaWNoIHdpbGwgYmUgdGhlIG1pbmltdW0gc2l6ZSBwZXJtaXR0ZWQuCisgICAgICAgIGZyYW1lQ291bnQgPSBidWZmZXJDb3VudCAqIGZyYW1lc1BlckJ1ZmZlcjsKICAgICB9CiAKICAgICBpZiAoY2hhbm5lbE1hc2sgPT0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSKSB7CkBAIC0xNDY5LDYgKzE1ODksMTAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBtQ2FsbGJhY2sgPSBjYjsKKyAgICBtQ2FsbGJhY2tDb29raWUgPSBjb29raWU7CisKICAgICAvLyBDaGVjayB3aGV0aGVyIHdlIGNhbiByZWN5Y2xlIHRoZSB0cmFjawogICAgIGJvb2wgcmV1c2UgPSBmYWxzZTsKICAgICBib29sIGJvdGhPZmZsb2FkZWQgPSBmYWxzZTsKQEAgLTE1MDgsNyArMTYzMiw3IEBACiAgICAgLy8gd2UgbXVzdCBjbG9zZSB0aGUgcHJldmlvdXMgb3V0cHV0IGJlZm9yZSBvcGVuaW5nIGEgbmV3IG9uZQogICAgIGlmIChib3RoT2ZmbG9hZGVkICYmICFyZXVzZSkgewogICAgICAgICBBTE9HVigiYm90aCBvZmZsb2FkZWQgYW5kIG5vdCByZWN5Y2xpbmciKTsKLSAgICAgICAgZGVsZXRlUmVjeWNsZWRUcmFjaygpOworICAgICAgICBkZWxldGVSZWN5Y2xlZFRyYWNrX2woKTsKICAgICB9CiAKICAgICBzcDxBdWRpb1RyYWNrPiB0OwpAQCAtMTUzOSw3ICsxNjYzLDggQEAKICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8sCiAgICAgICAgICAgICAgICAgICAgIG1VaWQsCiAgICAgICAgICAgICAgICAgICAgIG1QaWQsCi0gICAgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgIGRvTm90UmVjb25uZWN0KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHQgPSBuZXcgQXVkaW9UcmFjaygKICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUsCkBAIC0xNTU2LDEyICsxNjgxLDE0IEBACiAgICAgICAgICAgICAgICAgICAgIE5VTEwsIC8vIG9mZmxvYWQgaW5mbwogICAgICAgICAgICAgICAgICAgICBtVWlkLAogICAgICAgICAgICAgICAgICAgICBtUGlkLAotICAgICAgICAgICAgICAgICAgICBtQXR0cmlidXRlcyk7CisgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICBkb05vdFJlY29ubmVjdCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoKHQgPT0gMCkgfHwgKHQtPmluaXRDaGVjaygpICE9IE5PX0VSUk9SKSkgewogICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBjcmVhdGUgYXVkaW8gdHJhY2siKTsKICAgICAgICAgICAgIGRlbGV0ZSBuZXdjYmQ7CisgICAgICAgICAgICAvLyB0IGdvZXMgb3V0IG9mIHNjb3BlLCBzbyByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gemVybwogICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBzdWNjZXNzZnVsIEF1ZGlvVHJhY2sgaW5pdGlhbGl6YXRpb24gaW1wbGllcyBhIGxlZ2FjeSBzdHJlYW0gdHlwZSB3YXMgZ2VuZXJhdGVkCkBAIC0xNTgzLDcgKzE3MTAsNyBAQAogCiAgICAgICAgIGlmIChyZXVzZSkgewogICAgICAgICAgICAgQUxPR1YoImNoYWluaW5nIHRvIG5leHQgb3V0cHV0IGFuZCByZWN5Y2xpbmcgdHJhY2siKTsKLSAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICBjbG9zZV9sKCk7CiAgICAgICAgICAgICBtVHJhY2sgPSBtUmVjeWNsZWRUcmFjazsKICAgICAgICAgICAgIG1SZWN5Y2xlZFRyYWNrLmNsZWFyKCk7CiAgICAgICAgICAgICBpZiAobUNhbGxiYWNrRGF0YSAhPSBOVUxMKSB7CkBAIC0xNTk3LDcgKzE3MjQsNyBAQAogICAgIC8vIHdlJ3JlIG5vdCBnb2luZyB0byByZXVzZSB0aGUgdHJhY2ssIHVuYmxvY2sgYW5kIGZsdXNoIGl0CiAgICAgLy8gdGhpcyB3YXMgZG9uZSBlYXJsaWVyIGlmIGJvdGggdHJhY2tzIGFyZSBvZmZsb2FkZWQKICAgICBpZiAoIWJvdGhPZmZsb2FkZWQpIHsKLSAgICAgICAgZGVsZXRlUmVjeWNsZWRUcmFjaygpOworICAgICAgICBkZWxldGVSZWN5Y2xlZFRyYWNrX2woKTsKICAgICB9CiAKICAgICBDSEVDSygodCAhPSBOVUxMKSAmJiAoKG1DYWxsYmFjayA9PSBOVUxMKSB8fCAobmV3Y2JkICE9IE5VTEwpKSk7CkBAIC0xNjA3LDE3ICsxNzM0LDIwIEBACiAgICAgdC0+c2V0Vm9sdW1lKG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOwogCiAgICAgbVNhbXBsZVJhdGVIeiA9IHNhbXBsZVJhdGU7Ci0gICAgbUZsYWdzID0gZmxhZ3M7Ci0gICAgbU1zZWNzUGVyRnJhbWUgPSBtUGxheWJhY2tSYXRlUGVybWlsbGUgLyAoZmxvYXQpIHNhbXBsZVJhdGU7CisgICAgbUZsYWdzID0gdC0+Z2V0RmxhZ3MoKTsgLy8gd2Ugc3VnZ2VzdCB0aGUgZmxhZ3MgYWJvdmUsIGJ1dCBuZXcgQXVkaW9UcmFjaygpIG1heSBub3QgZ3JhbnQgaXQuCisgICAgbU1zZWNzUGVyRnJhbWUgPSAxRTNmIC8gKG1QbGF5YmFja1JhdGUubVNwZWVkICogc2FtcGxlUmF0ZSk7CisgICAgbUZyYW1lU2l6ZSA9IHQtPmZyYW1lU2l6ZSgpOwogICAgIHVpbnQzMl90IHBvczsKICAgICBpZiAodC0+Z2V0UG9zaXRpb24oJnBvcykgPT0gT0spIHsKLSAgICAgICAgbUJ5dGVzV3JpdHRlbiA9IHVpbnQ2NF90KHBvcykgKiB0LT5mcmFtZVNpemUoKTsKKyAgICAgICAgbUJ5dGVzV3JpdHRlbiA9IHVpbnQ2NF90KHBvcykgKiBtRnJhbWVTaXplOwogICAgIH0KICAgICBtVHJhY2sgPSB0OwogCiAgICAgc3RhdHVzX3QgcmVzID0gTk9fRVJST1I7Ci0gICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpID09IDApIHsKLSAgICAgICAgcmVzID0gdC0+c2V0U2FtcGxlUmF0ZShtUGxheWJhY2tSYXRlUGVybWlsbGUgKiBtU2FtcGxlUmF0ZUh6IC8gMTAwMCk7CisgICAgLy8gTm90ZSBzb21lIG91dHB1dCBkZXZpY2VzIG1heSBnaXZlIHVzIGEgZGlyZWN0IHRyYWNrIGV2ZW4gdGhvdWdoIHdlIGRvbid0IHNwZWNpZnkgaXQuCisgICAgLy8gRXhhbXBsZTogTGluZSBhcHBsaWNhdGlvbiBiLzE3NDU5OTgyLgorICAgIGlmICgobUZsYWdzICYgKEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpKSA9PSAwKSB7CisgICAgICAgIHJlcyA9IHQtPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tSYXRlKTsKICAgICAgICAgaWYgKHJlcyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgdC0+c2V0QXV4RWZmZWN0U2VuZExldmVsKG1TZW5kTGV2ZWwpOwogICAgICAgICAgICAgcmVzID0gdC0+YXR0YWNoQXV4RWZmZWN0KG1BdXhFZmZlY3RJZCk7CkBAIC0xNjMwLDYgKzE3NjAsNyBAQAogc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6c3RhcnQoKQogewogICAgIEFMT0dWKCJzdGFydCIpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBpZiAobUNhbGxiYWNrRGF0YSAhPSBOVUxMKSB7CiAgICAgICAgIG1DYWxsYmFja0RhdGEtPmVuZFRyYWNrU3dpdGNoKCk7CiAgICAgfQpAQCAtMTY0MiwzNSArMTc3Myw5MyBAQAogfQogCiB2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OnNldE5leHRPdXRwdXQoY29uc3Qgc3A8QXVkaW9PdXRwdXQ+JiBuZXh0T3V0cHV0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIG1OZXh0T3V0cHV0ID0gbmV4dE91dHB1dDsKIH0KIAotCiB2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OnN3aXRjaFRvTmV4dE91dHB1dCgpIHsKICAgICBBTE9HVigic3dpdGNoVG9OZXh0T3V0cHV0Iik7Ci0gICAgaWYgKG1OZXh0T3V0cHV0ICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKG1DYWxsYmFja0RhdGEgIT0gTlVMTCkgewotICAgICAgICAgICAgbUNhbGxiYWNrRGF0YS0+YmVnaW5UcmFja1N3aXRjaCgpOworCisgICAgLy8gVHJ5IHRvIGFjcXVpcmUgdGhlIGNhbGxiYWNrIGxvY2sgYmVmb3JlIG1vdmluZyB0cmFjayAod2l0aG91dCBpbmN1cnJpbmcgZGVhZGxvY2spLgorICAgIGNvbnN0IHVuc2lnbmVkIGtNYXhTd2l0Y2hUcmllcyA9IDEwMDsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgZm9yICh1bnNpZ25lZCB0cmllcyA9IDA7OykgeworICAgICAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBkZWxldGUgbU5leHRPdXRwdXQtPm1DYWxsYmFja0RhdGE7Ci0gICAgICAgIG1OZXh0T3V0cHV0LT5tQ2FsbGJhY2tEYXRhID0gbUNhbGxiYWNrRGF0YTsKLSAgICAgICAgbUNhbGxiYWNrRGF0YSA9IE5VTEw7Ci0gICAgICAgIG1OZXh0T3V0cHV0LT5tUmVjeWNsZWRUcmFjayA9IG1UcmFjazsKLSAgICAgICAgbVRyYWNrLmNsZWFyKCk7Ci0gICAgICAgIG1OZXh0T3V0cHV0LT5tU2FtcGxlUmF0ZUh6ID0gbVNhbXBsZVJhdGVIejsKLSAgICAgICAgbU5leHRPdXRwdXQtPm1Nc2Vjc1BlckZyYW1lID0gbU1zZWNzUGVyRnJhbWU7Ci0gICAgICAgIG1OZXh0T3V0cHV0LT5tQnl0ZXNXcml0dGVuID0gbUJ5dGVzV3JpdHRlbjsKLSAgICAgICAgbU5leHRPdXRwdXQtPm1GbGFncyA9IG1GbGFnczsKKyAgICAgICAgaWYgKG1OZXh0T3V0cHV0ICE9IE5VTEwgJiYgbU5leHRPdXRwdXQgIT0gdGhpcykgeworICAgICAgICAgICAgaWYgKG1DYWxsYmFja0RhdGEgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIC8vIHR3byBhbHRlcm5hdGl2ZSBhcHByb2FjaGVzCisjaWYgMQorICAgICAgICAgICAgICAgIENhbGxiYWNrRGF0YSAqY2FsbGJhY2tEYXRhID0gbUNhbGxiYWNrRGF0YTsKKyAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAvLyBwcm9wZXIgYWNxdWlzaXRpb24gc2VxdWVuY2UKKyAgICAgICAgICAgICAgICBjYWxsYmFja0RhdGEtPmxvY2soKTsKKyAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgLy8gQ2F1dGlvbjogaXQgaXMgdW5saWtlbHkgdGhhdCBzb21lb25lIGRlbGV0ZWQgb3VyIGNhbGxiYWNrIG9yIGNoYW5nZWQgb3VyIHRhcmdldAorICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja0RhdGEgIT0gbUNhbGxiYWNrRGF0YSB8fCBtTmV4dE91dHB1dCA9PSBOVUxMIHx8IG1OZXh0T3V0cHV0ID09IHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZmF0YWwgaWYgd2UgYXJlIHN0YXJ2ZWQgb3V0LgorICAgICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCsrdHJpZXMgPiBrTWF4U3dpdGNoVHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN3aXRjaFRvTmV4dE91dHB1dCgpIGNhbm5vdCBvYnRhaW4gY29ycmVjdCBsb2NrIHNlcXVlbmNlIik7CisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrRGF0YS0+dW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYWxsYmFja0RhdGEtPm1Td2l0Y2hpbmcgPSB0cnVlOyAvLyBiZWdpbiB0cmFjayBzd2l0Y2gKKyNlbHNlCisgICAgICAgICAgICAgICAgLy8gdHJ5QmVnaW5UcmFja1N3aXRjaCgpIHJldHVybnMgZmFsc2UgaWYgdGhlIGNhbGxiYWNrIGhhcyB0aGUgbG9jay4KKyAgICAgICAgICAgICAgICBpZiAoIW1DYWxsYmFja0RhdGEtPnRyeUJlZ2luVHJhY2tTd2l0Y2goKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBmYXRhbCBpZiB3ZSBhcmUgc3RhcnZlZCBvdXQuCisgICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKyt0cmllcyA+IGtNYXhTd2l0Y2hUcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3dpdGNoVG9OZXh0T3V0cHV0KCkgY2Fubm90IG9idGFpbiBjYWxsYmFjayBsb2NrIik7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICB1c2xlZXAoNSAqIDEwMDAgLyogdXNlYyAqLyk7IC8vIGFsbG93IGNhbGxiYWNrIHRvIHVzZSBBdWRpb091dHB1dAorICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbmV4dExvY2sobU5leHRPdXRwdXQtPm1Mb2NrKTsKKworICAgICAgICAgICAgLy8gSWYgdGhlIG5leHQgb3V0cHV0IHRyYWNrIGlzIG5vdCBOVUxMLCB0aGVuIGl0IGhhcyBiZWVuCisgICAgICAgICAgICAvLyBvcGVuZWQgYWxyZWFkeSBmb3IgcGxheWJhY2suCisgICAgICAgICAgICAvLyBUaGlzIGlzIHBvc3NpYmxlIGV2ZW4gd2l0aG91dCB0aGUgbmV4dCBwbGF5ZXIgYmVpbmcgc3RhcnRlZCwKKyAgICAgICAgICAgIC8vIGZvciBleGFtcGxlLCB0aGUgbmV4dCBwbGF5ZXIgY291bGQgYmUgcHJlcGFyZWQgYW5kIHNlZWtlZC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBQcmVzdW1pbmcgaXQgaXNuJ3QgYWR2aXNhYmxlIHRvIGZvcmNlIHRoZSB0cmFjayBvdmVyLgorICAgICAgICAgICAgIGlmIChtTmV4dE91dHB1dC0+bVRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiUmVjeWNsaW5nIHRyYWNrIGZvciBnYXBsZXNzIHBsYXliYWNrIik7CisgICAgICAgICAgICAgICAgZGVsZXRlIG1OZXh0T3V0cHV0LT5tQ2FsbGJhY2tEYXRhOworICAgICAgICAgICAgICAgIG1OZXh0T3V0cHV0LT5tQ2FsbGJhY2tEYXRhID0gbUNhbGxiYWNrRGF0YTsKKyAgICAgICAgICAgICAgICBtTmV4dE91dHB1dC0+bVJlY3ljbGVkVHJhY2sgPSBtVHJhY2s7CisgICAgICAgICAgICAgICAgbU5leHRPdXRwdXQtPm1TYW1wbGVSYXRlSHogPSBtU2FtcGxlUmF0ZUh6OworICAgICAgICAgICAgICAgIG1OZXh0T3V0cHV0LT5tTXNlY3NQZXJGcmFtZSA9IG1Nc2Vjc1BlckZyYW1lOworICAgICAgICAgICAgICAgIG1OZXh0T3V0cHV0LT5tQnl0ZXNXcml0dGVuID0gbUJ5dGVzV3JpdHRlbjsKKyAgICAgICAgICAgICAgICBtTmV4dE91dHB1dC0+bUZsYWdzID0gbUZsYWdzOworICAgICAgICAgICAgICAgIG1OZXh0T3V0cHV0LT5tRnJhbWVTaXplID0gbUZyYW1lU2l6ZTsKKyAgICAgICAgICAgICAgICBjbG9zZV9sKCk7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrRGF0YSA9IE5VTEw7ICAvLyBkZXN0cnVjdGlvbiBoYW5kbGVkIGJ5IG1OZXh0T3V0cHV0CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJJZ25vcmluZyBnYXBsZXNzIHBsYXliYWNrIGJlY2F1c2UgbmV4dCBwbGF5ZXIgaGFzIGFscmVhZHkgc3RhcnRlZCIpOworICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0cmFjayBpbiBjYXNlIHJlc291cmNlIG5lZWRlZCBmb3IgZnV0dXJlIHBsYXllcnMuCisgICAgICAgICAgICAgICAgaWYgKG1DYWxsYmFja0RhdGEgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tEYXRhLT5lbmRUcmFja1N3aXRjaCgpOyAgLy8gcmVsZWFzZSBsb2NrIGZvciBjYWxsYmFja3MgYmVmb3JlIGNsb3NlLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbG9zZV9sKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAgICAgfQogfQogCi1zc2l6ZV90IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OndyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCitzc2l6ZV90IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OndyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYmxvY2tpbmcpCiB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUNhbGxiYWNrICE9IE5VTEwsICJEb24ndCBjYWxsIHdyaXRlIGlmIHN1cHBseWluZyBhIGNhbGxiYWNrLiIpOwogCiAgICAgLy9BTE9HVigid3JpdGUoJXAsICV1KSIsIGJ1ZmZlciwgc2l6ZSk7CiAgICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIHNzaXplX3QgcmV0ID0gbVRyYWNrLT53cml0ZShidWZmZXIsIHNpemUpOworICAgICAgICBzc2l6ZV90IHJldCA9IG1UcmFjay0+d3JpdGUoYnVmZmVyLCBzaXplLCBibG9ja2luZyk7CiAgICAgICAgIGlmIChyZXQgPj0gMCkgewogICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiArPSByZXQ7CiAgICAgICAgIH0KQEAgLTE2ODIsMzAgKzE4NzEsMzcgQEAKIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6c3RvcCgpCiB7CiAgICAgQUxPR1YoInN0b3AiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgbUJ5dGVzV3JpdHRlbiA9IDA7CiAgICAgaWYgKG1UcmFjayAhPSAwKSBtVHJhY2stPnN0b3AoKTsKIH0KIAogdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpmbHVzaCgpCiB7CiAgICAgQUxPR1YoImZsdXNoIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIG1CeXRlc1dyaXR0ZW4gPSAwOwogICAgIGlmIChtVHJhY2sgIT0gMCkgbVRyYWNrLT5mbHVzaCgpOwogfQogCiB2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OnBhdXNlKCkKIHsKICAgICBBTE9HVigicGF1c2UiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKG1UcmFjayAhPSAwKSBtVHJhY2stPnBhdXNlKCk7CiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6Y2xvc2UoKQogewogICAgIEFMT0dWKCJjbG9zZSIpOwotICAgIG1UcmFjay5jbGVhcigpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBjbG9zZV9sKCk7CiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KQogewogICAgIEFMT0dWKCJzZXRWb2x1bWUoJWYsICVmKSIsIGxlZnQsIHJpZ2h0KTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgbUxlZnRWb2x1bWUgPSBsZWZ0OwogICAgIG1SaWdodFZvbHVtZSA9IHJpZ2h0OwogICAgIGlmIChtVHJhY2sgIT0gMCkgewpAQCAtMTcxMywyNSArMTkwOSw0NCBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6c2V0UGxheWJhY2tSYXRlUGVybWlsbGUoaW50MzJfdCByYXRlUGVybWlsbGUpCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpCiB7Ci0gICAgQUxPR1YoInNldFBsYXliYWNrUmF0ZVBlcm1pbGxlKCVkKSIsIHJhdGVQZXJtaWxsZSk7Ci0gICAgc3RhdHVzX3QgcmVzID0gTk9fRVJST1I7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIHJlcyA9IG1UcmFjay0+c2V0U2FtcGxlUmF0ZShyYXRlUGVybWlsbGUgKiBtU2FtcGxlUmF0ZUh6IC8gMTAwMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVzID0gTk9fSU5JVDsKKyAgICBBTE9HVigic2V0UGxheWJhY2tSYXRlKCVmICVmICVkICVkKSIsCisgICAgICAgICAgICAgICAgcmF0ZS5tU3BlZWQsIHJhdGUubVBpdGNoLCByYXRlLm1GYWxsYmFja01vZGUsIHJhdGUubVN0cmV0Y2hNb2RlKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgICAgIC8vIHJlbWVtYmVyIHJhdGUgc28gdGhhdCB3ZSBjYW4gc2V0IGl0IHdoZW4gdGhlIHRyYWNrIGlzIG9wZW5lZAorICAgICAgICBtUGxheWJhY2tSYXRlID0gcmF0ZTsKKyAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KLSAgICBtUGxheWJhY2tSYXRlUGVybWlsbGUgPSByYXRlUGVybWlsbGU7CisgICAgc3RhdHVzX3QgcmVzID0gbVRyYWNrLT5zZXRQbGF5YmFja1JhdGUocmF0ZSk7CisgICAgaWYgKHJlcyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICAvLyByYXRlLm1TcGVlZCBpcyBhbHdheXMgZ3JlYXRlciB0aGFuIDAgaWYgc2V0UGxheWJhY2tSYXRlIHN1Y2NlZWRlZAorICAgIENIRUNLX0dUKHJhdGUubVNwZWVkLCAwLmYpOworICAgIG1QbGF5YmFja1JhdGUgPSByYXRlOwogICAgIGlmIChtU2FtcGxlUmF0ZUh6ICE9IDApIHsKLSAgICAgICAgbU1zZWNzUGVyRnJhbWUgPSBtUGxheWJhY2tSYXRlUGVybWlsbGUgLyAoZmxvYXQpIG1TYW1wbGVSYXRlSHo7CisgICAgICAgIG1Nc2Vjc1BlckZyYW1lID0gMUUzZiAvIChyYXRlLm1TcGVlZCAqIG1TYW1wbGVSYXRlSHopOwogICAgIH0KICAgICByZXR1cm4gcmVzOwogfQogCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpnZXRQbGF5YmFja1JhdGUoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUpCit7CisgICAgQUxPR1YoInNldFBsYXliYWNrUmF0ZSIpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgICpyYXRlID0gbVRyYWNrLT5nZXRQbGF5YmFja1JhdGUoKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OnNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCkKIHsKICAgICBBTE9HVigic2V0QXV4RWZmZWN0U2VuZExldmVsKCVmKSIsIGxldmVsKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgbVNlbmRMZXZlbCA9IGxldmVsOwogICAgIGlmIChtVHJhY2sgIT0gMCkgewogICAgICAgICByZXR1cm4gbVRyYWNrLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobGV2ZWwpOwpAQCAtMTc0Miw2ICsxOTU3LDcgQEAKIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpCiB7CiAgICAgQUxPR1YoImF0dGFjaEF1eEVmZmVjdCglZCkiLCBlZmZlY3RJZCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIG1BdXhFZmZlY3RJZCA9IGVmZmVjdElkOwogICAgIGlmIChtVHJhY2sgIT0gMCkgewogICAgICAgICByZXR1cm4gbVRyYWNrLT5hdHRhY2hBdXhFZmZlY3QoZWZmZWN0SWQpOwpAQCAtMTc1NCw2ICsxOTcwLDcgQEAKICAgICAgICAgaW50IGV2ZW50LCB2b2lkICpjb29raWUsIHZvaWQgKmluZm8pIHsKICAgICAvL0FMT0dWKCJjYWxsYmFja3dyYXBwZXIiKTsKICAgICBDYWxsYmFja0RhdGEgKmRhdGEgPSAoQ2FsbGJhY2tEYXRhKiljb29raWU7CisgICAgLy8gbG9jayB0byBlbnN1cmUgd2UgYXJlbid0IGNhdWdodCBpbiB0aGUgbWlkZGxlIG9mIGEgdHJhY2sgc3dpdGNoLgogICAgIGRhdGEtPmxvY2soKTsKICAgICBBdWRpb091dHB1dCAqbWUgPSBkYXRhLT5nZXRPdXRwdXQoKTsKICAgICBBdWRpb1RyYWNrOjpCdWZmZXIgKmJ1ZmZlciA9IChBdWRpb1RyYWNrOjpCdWZmZXIgKilpbmZvOwpAQCAtMTc3MywyMCArMTk5MCwyMyBAQAogICAgICAgICAgICAgICAgIG1lLCBidWZmZXItPnJhdywgYnVmZmVyLT5zaXplLCBtZS0+bUNhbGxiYWNrQ29va2llLAogICAgICAgICAgICAgICAgIENCX0VWRU5UX0ZJTExfQlVGRkVSKTsKIAotICAgICAgICBpZiAoKG1lLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSA9PSAwICYmCi0gICAgICAgICAgICBhY3R1YWxTaXplID09IDAgJiYgYnVmZmVyLT5zaXplID4gMCAmJiBtZS0+bU5leHRPdXRwdXQgPT0gTlVMTCkgewotICAgICAgICAgICAgLy8gV2UndmUgcmVhY2hlZCBFT1MgYnV0IHRoZSBhdWRpbyB0cmFjayBpcyBub3Qgc3RvcHBlZCB5ZXQsCi0gICAgICAgICAgICAvLyBrZWVwIHBsYXlpbmcgc2lsZW5jZS4KKyAgICAgICAgLy8gTG9nIHdoZW4gbm8gZGF0YSBpcyByZXR1cm5lZCBmcm9tIHRoZSBjYWxsYmFjay4KKyAgICAgICAgLy8gKDEpIFdlIG1heSBoYXZlIG5vIGRhdGEgKGVzcGVjaWFsbHkgd2l0aCBuZXR3b3JrIHN0cmVhbWluZyBzb3VyY2VzKS4KKyAgICAgICAgLy8gKDIpIFdlIG1heSBoYXZlIHJlYWNoZWQgdGhlIEVPUyBhbmQgdGhlIGF1ZGlvIHRyYWNrIGlzIG5vdCBzdG9wcGVkIHlldC4KKyAgICAgICAgLy8gTm90ZSB0aGF0IEF3ZXNvbWVQbGF5ZXIvQXVkaW9QbGF5ZXIgd2lsbCBvbmx5IHJldHVybiB6ZXJvIHNpemUgd2hlbiBpdCByZWFjaGVzIHRoZSBFT1MuCisgICAgICAgIC8vIE51UGxheWVyUmVuZGVyZXIgd2lsbCByZXR1cm4gemVybyB3aGVuIGl0IGRvZXNuJ3QgaGF2ZSBkYXRhIChpdCBkb2Vzbid0IGJsb2NrIHRvIGZpbGwpLgorICAgICAgICAvLworICAgICAgICAvLyBUaGlzIGlzIGEgYmVuaWduIGJ1c3ktd2FpdCwgd2l0aCB0aGUgbmV4dCBkYXRhIHJlcXVlc3QgZ2VuZXJhdGVkIDEwIG1zIG9yIG1vcmUgbGF0ZXI7CisgICAgICAgIC8vIG5ldmVydGhlbGVzcyBmb3IgcG93ZXIgcmVhc29ucywgd2UgZG9uJ3Qgd2FudCB0byBzZWUgdG9vIG1hbnkgb2YgdGhlc2UuCiAKLSAgICAgICAgICAgIG1lbXNldChidWZmZXItPnJhdywgMCwgYnVmZmVyLT5zaXplKTsKLSAgICAgICAgICAgIGFjdHVhbFNpemUgPSBidWZmZXItPnNpemU7Ci0gICAgICAgIH0KKyAgICAgICAgQUxPR1ZfSUYoYWN0dWFsU2l6ZSA9PSAwICYmIGJ1ZmZlci0+c2l6ZSA+IDAsICJjYWxsYmFja3dyYXBwZXI6IGVtcHR5IGJ1ZmZlciByZXR1cm5lZCIpOwogCisgICAgICAgIG1lLT5tQnl0ZXNXcml0dGVuICs9IGFjdHVhbFNpemU7ICAvLyBiZW5pZ24gcmFjZSB3aXRoIHJlYWRlci4KICAgICAgICAgYnVmZmVyLT5zaXplID0gYWN0dWFsU2l6ZTsKICAgICAgICAgfSBicmVhazsKIAotCiAgICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9TVFJFQU1fRU5EOgorICAgICAgICAvLyBjdXJyZW50bHkgb25seSBvY2N1cnMgZm9yIG9mZmxvYWRlZCBjYWxsYmFja3MKICAgICAgICAgQUxPR1YoImNhbGxiYWNrd3JhcHBlcjogZGVsaXZlciBFVkVOVF9TVFJFQU1fRU5EIik7CiAgICAgICAgICgqbWUtPm1DYWxsYmFjaykobWUsIE5VTEwgLyogYnVmZmVyICovLCAwIC8qIHNpemUgKi8sCiAgICAgICAgICAgICAgICAgbWUtPm1DYWxsYmFja0Nvb2tpZSwgQ0JfRVZFTlRfU1RSRUFNX0VORCk7CkBAIC0xNzk4LDYgKzIwMTgsMTkgQEAKICAgICAgICAgICAgICAgICBtZS0+bUNhbGxiYWNrQ29va2llLCBDQl9FVkVOVF9URUFSX0RPV04pOwogICAgICAgICBicmVhazsKIAorICAgIGNhc2UgQXVkaW9UcmFjazo6RVZFTlRfVU5ERVJSVU46CisgICAgICAgIC8vIFRoaXMgb2NjdXJzIHdoZW4gdGhlcmUgaXMgbm8gZGF0YSBhdmFpbGFibGUsIHR5cGljYWxseQorICAgICAgICAvLyB3aGVuIHRoZXJlIGlzIGEgZmFpbHVyZSB0byBzdXBwbHkgZGF0YSB0byB0aGUgQXVkaW9UcmFjay4gIEl0IGNhbiBhbHNvCisgICAgICAgIC8vIG9jY3VyIGluIG5vbi1vZmZsb2FkZWQgbW9kZSB3aGVuIHRoZSBhdWRpbyBkZXZpY2UgY29tZXMgb3V0IG9mIHN0YW5kYnkuCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIGFuIEF1ZGlvVHJhY2sgdW5kZXJydW5zIGl0IG91dHB1dHMgc2lsZW5jZS4gU2luY2UgdGhpcyBoYXBwZW5zIHN1ZGRlbmx5CisgICAgICAgIC8vIGl0IG1heSBzb3VuZCBsaWtlIGFuIGF1ZGlibGUgcG9wIG9yIGdsaXRjaC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIHVuZGVycnVuIGV2ZW50IGlzIHNlbnQgb25jZSBwZXIgdHJhY2sgdW5kZXJydW47IHRoZSBjb25kaXRpb24gaXMgcmVzZXQKKyAgICAgICAgLy8gd2hlbiBtb3JlIGRhdGEgaXMgc2VudCB0byB0aGUgQXVkaW9UcmFjay4KKyAgICAgICAgQUxPR0koImNhbGxiYWNrd3JhcHBlcjogRVZFTlRfVU5ERVJSVU4gKGRpc2NhcmRlZCkiKTsKKyAgICAgICAgYnJlYWs7CisKICAgICBkZWZhdWx0OgogICAgICAgICBBTE9HRSgicmVjZWl2ZWQgdW5rbm93biBldmVudCB0eXBlOiAlZCBpbnNpZGUgQ2FsbGJhY2tXcmFwcGVyICEiLCBldmVudCk7CiAgICAgfQpAQCAtMTgwNywxMSArMjA0MCwxMyBAQAogCiBpbnQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6Z2V0U2Vzc2lvbklkKCkgY29uc3QKIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgcmV0dXJuIG1TZXNzaW9uSWQ7CiB9CiAKIHVpbnQzMl90IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmdldFNhbXBsZVJhdGUoKSBjb25zdAogeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBpZiAobVRyYWNrID09IDApIHJldHVybiAwOwogICAgIHJldHVybiBtVHJhY2stPmdldFNhbXBsZVJhdGUoKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaAppbmRleCBmYWQzNDQ3Li42MGQ0NjE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCkBAIC0zNCw3ICszNCwxMCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0cnVjdCBBdWRpb1BsYXliYWNrUmF0ZTsKIGNsYXNzIEF1ZGlvVHJhY2s7CitzdHJ1Y3QgQVZTeW5jU2V0dGluZ3M7CitjbGFzcyBJRGF0YVNvdXJjZTsKIGNsYXNzIElNZWRpYVJlY29yZGVyOwogY2xhc3MgSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI7CiBjbGFzcyBJT01YOwpAQCAtOTQsMjEgKzk3LDI0IEBACiAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgYnVmZmVyQ291bnQsCiAgICAgICAgICAgICAgICAgQXVkaW9DYWxsYmFjayBjYiwgdm9pZCAqY29va2llLAogICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMKTsKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAorICAgICAgICAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzdWdnZXN0ZWRGcmFtZUNvdW50ID0gMCk7CiAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc3RhcnQoKTsKLSAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgd3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisgICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgICAgIHdyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYmxvY2tpbmcgPSB0cnVlKTsKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgc3RvcCgpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBmbHVzaCgpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBwYXVzZSgpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBjbG9zZSgpOwotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7IH0KKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgc2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSk7CiAgICAgICAgIHZpcnR1YWwgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRBdWRpb1N0cmVhbVR5cGUoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtVHlwZTsgfQogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRBdWRpb0F0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICogYXR0cmlidXRlcyk7CiAKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UGxheWJhY2tSYXRlUGVybWlsbGUoaW50MzJfdCByYXRlUGVybWlsbGUpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUmIHJhdGUpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRQbGF5YmFja1JhdGUoQXVkaW9QbGF5YmFja1JhdGUqIHJhdGUgLyogbm9ubnVsbCAqLyk7CisKICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0QXV4RWZmZWN0U2VuZExldmVsKGZsb2F0IGxldmVsKTsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgYXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKQEAgLTEyNSw3ICsxMzEsOCBAQAogICAgICAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICBzZXRNaW5CdWZmZXJDb3VudCgpOwogICAgICAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICBDYWxsYmFja1dyYXBwZXIoCiAgICAgICAgICAgICAgICAgaW50IGV2ZW50LCB2b2lkICptZSwgdm9pZCAqaW5mbyk7Ci0gICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgIGRlbGV0ZVJlY3ljbGVkVHJhY2soKTsKKyAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgZGVsZXRlUmVjeWNsZWRUcmFja19sKCk7CisgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgIGNsb3NlX2woKTsKIAogICAgICAgICBzcDxBdWRpb1RyYWNrPiAgICAgICAgICBtVHJhY2s7CiAgICAgICAgIHNwPEF1ZGlvVHJhY2s+ICAgICAgICAgIG1SZWN5Y2xlZFRyYWNrOwpAQCAtMTM1LDM4ICsxNDIsNTMgQEAKICAgICAgICAgQ2FsbGJhY2tEYXRhICogICAgICAgICAgbUNhbGxiYWNrRGF0YTsKICAgICAgICAgdWludDY0X3QgICAgICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbjsKICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAgICAgbVN0cmVhbVR5cGU7Ci0gICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqbUF0dHJpYnV0ZXM7CisgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAqICAgIG1BdHRyaWJ1dGVzOwogICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtTGVmdFZvbHVtZTsKICAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbVJpZ2h0Vm9sdW1lOwotICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtUGxheWJhY2tSYXRlUGVybWlsbGU7CisgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlICAgICAgIG1QbGF5YmFja1JhdGU7CiAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlSHo7IC8vIHNhbXBsZSByYXRlIG9mIHRoZSBjb250ZW50LCBhcyBzZXQgaW4gb3BlbigpCiAgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1Nc2Vjc1BlckZyYW1lOworICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtRnJhbWVTaXplOwogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkOwogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtVWlkOwogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtUGlkOwogICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtU2VuZExldmVsOwogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtQXV4RWZmZWN0SWQ7CisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICAgIG1GbGFnczsKKyAgICAgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgbUxvY2s7CisKKyAgICAgICAgLy8gc3RhdGljIHZhcmlhYmxlcyBiZWxvdyBub3QgcHJvdGVjdGVkIGJ5IG11dGV4CiAgICAgICAgIHN0YXRpYyBib29sICAgICAgICAgICAgIG1Jc09uRW11bGF0b3I7CiAgICAgICAgIHN0YXRpYyBpbnQgICAgICAgICAgICAgIG1NaW5CdWZmZXJDb3VudDsgIC8vIDEyIGZvciBlbXVsYXRvcjsgb3RoZXJ3aXNlIDQKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgICAgbUZsYWdzOwogCiAgICAgICAgIC8vIENhbGxiYWNrRGF0YSBpcyB3aGF0IGlzIHBhc3NlZCB0byB0aGUgQXVkaW9UcmFjayBhcyB0aGUgInVzZXIiIGRhdGEuCiAgICAgICAgIC8vIFdlIG5lZWQgdG8gYmUgYWJsZSB0byB0YXJnZXQgdGhpcyB0byBhIGRpZmZlcmVudCBPdXRwdXQgb24gdGhlIGZseSwKICAgICAgICAgLy8gc28gd2UgY2FuJ3QgdXNlIHRoZSBPdXRwdXQgaXRzZWxmIGZvciB0aGlzLgogICAgICAgICBjbGFzcyBDYWxsYmFja0RhdGEgeworICAgICAgICAgICAgZnJpZW5kIEF1ZGlvT3V0cHV0OwogICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICBDYWxsYmFja0RhdGEoQXVkaW9PdXRwdXQgKmNvb2tpZSkgewogICAgICAgICAgICAgICAgIG1EYXRhID0gY29va2llOwogICAgICAgICAgICAgICAgIG1Td2l0Y2hpbmcgPSBmYWxzZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEF1ZGlvT3V0cHV0ICogICBnZXRPdXRwdXQoKSB7IHJldHVybiBtRGF0YTt9CisgICAgICAgICAgICBBdWRpb091dHB1dCAqICAgZ2V0T3V0cHV0KCkgY29uc3QgeyByZXR1cm4gbURhdGE7IH0KICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRPdXRwdXQoQXVkaW9PdXRwdXQqIG5ld2Nvb2tpZSkgeyBtRGF0YSA9IG5ld2Nvb2tpZTsgfQogICAgICAgICAgICAgLy8gbG9jay91bmxvY2sgYXJlIHVzZWQgYnkgdGhlIGNhbGxiYWNrIGJlZm9yZSBhY2Nlc3NpbmcgdGhlIHBheWxvYWQgb2YgdGhpcyBvYmplY3QKLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBsb2NrKCkgeyBtTG9jay5sb2NrKCk7IH0KLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICB1bmxvY2soKSB7IG1Mb2NrLnVubG9jaygpOyB9Ci0gICAgICAgICAgICAvLyBiZWdpblRyYWNrU3dpdGNoL2VuZFRyYWNrU3dpdGNoIGFyZSB1c2VkIHdoZW4gdGhpcyBvYmplY3QgaXMgYmVpbmcgaGFuZGVkIG92ZXIKKyAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBsb2NrKCkgY29uc3QgeyBtTG9jay5sb2NrKCk7IH0KKyAgICAgICAgICAgIHZvaWQgICAgICAgICAgICB1bmxvY2soKSBjb25zdCB7IG1Mb2NrLnVubG9jaygpOyB9CisKKyAgICAgICAgICAgIC8vIHRyeUJlZ2luVHJhY2tTd2l0Y2gvZW5kVHJhY2tTd2l0Y2ggYXJlIHVzZWQgd2hlbiB0aGUgQ2FsbGJhY2tEYXRhIGlzIGhhbmRlZCBvdmVyCiAgICAgICAgICAgICAvLyB0byB0aGUgbmV4dCBzaW5rLgotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGJlZ2luVHJhY2tTd2l0Y2goKSB7IG1Mb2NrLmxvY2soKTsgbVN3aXRjaGluZyA9IHRydWU7IH0KKworICAgICAgICAgICAgLy8gdHJ5QmVnaW5UcmFja1N3aXRjaCgpIHJldHVybnMgdHJ1ZSBvbmx5IGlmIGl0IG9idGFpbnMgdGhlIGxvY2suCisgICAgICAgICAgICBib29sICAgICAgICAgICAgdHJ5QmVnaW5UcmFja1N3aXRjaCgpIHsKKyAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1Td2l0Y2hpbmcsICJ0cnlCZWdpblRyYWNrU3dpdGNoKCkgYWxyZWFkeSBjYWxsZWQiKTsKKyAgICAgICAgICAgICAgICBpZiAobUxvY2sudHJ5TG9jaygpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVN3aXRjaGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgZW5kVHJhY2tTd2l0Y2goKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1Td2l0Y2hpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CkBAIC0xNzUsNyArMTk3LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgcHJpdmF0ZToKICAgICAgICAgICAgIEF1ZGlvT3V0cHV0ICogICBtRGF0YTsKLSAgICAgICAgICAgIG11dGFibGUgTXV0ZXggICBtTG9jazsKKyAgICAgICAgICAgIG11dGFibGUgTXV0ZXggICBtTG9jazsgLy8gYSByZWN1cnNpdmUgbXV0ZXggbWlnaHQgbWFrZSB0aGlzIHVubmVjZXNzYXJ5LgogICAgICAgICAgICAgYm9vbCAgICAgICAgICAgIG1Td2l0Y2hpbmc7CiAgICAgICAgICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDYWxsYmFja0RhdGEpOwogICAgICAgICB9OwpAQCAtMTg3LDcgKzIwOSw3IEBACiAgICAgc3RhdGljICB2b2lkICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlKCk7CiAKICAgICAvLyBJTWVkaWFQbGF5ZXJTZXJ2aWNlIGludGVyZmFjZQotICAgIHZpcnR1YWwgc3A8SU1lZGlhUmVjb3JkZXI+ICBjcmVhdGVNZWRpYVJlY29yZGVyKCk7CisgICAgdmlydHVhbCBzcDxJTWVkaWFSZWNvcmRlcj4gIGNyZWF0ZU1lZGlhUmVjb3JkZXIoY29uc3QgU3RyaW5nMTYgJm9wUGFja2FnZU5hbWUpOwogICAgIHZvaWQgICAgcmVtb3ZlTWVkaWFSZWNvcmRlckNsaWVudCh3cDxNZWRpYVJlY29yZGVyQ2xpZW50PiBjbGllbnQpOwogICAgIHZpcnR1YWwgc3A8SU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI+IGNyZWF0ZU1ldGFkYXRhUmV0cmlldmVyKCk7CiAKQEAgLTE5OSw4ICsyMjEsOCBAQAogICAgIHZpcnR1YWwgc3A8SURybT4gICAgICAgICAgICBtYWtlRHJtKCk7CiAgICAgdmlydHVhbCBzcDxJSERDUD4gICAgICAgICAgIG1ha2VIRENQKGJvb2wgY3JlYXRlRW5jcnlwdGlvbk1vZHVsZSk7CiAKLSAgICB2aXJ0dWFsIHNwPElSZW1vdGVEaXNwbGF5PiBsaXN0ZW5Gb3JSZW1vdGVEaXNwbGF5KGNvbnN0IHNwPElSZW1vdGVEaXNwbGF5Q2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgaWZhY2UpOworICAgIHZpcnR1YWwgc3A8SVJlbW90ZURpc3BsYXk+IGxpc3RlbkZvclJlbW90ZURpc3BsYXkoY29uc3QgU3RyaW5nMTYgJm9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICBjb25zdCBzcDxJUmVtb3RlRGlzcGxheUNsaWVudD4mIGNsaWVudCwgY29uc3QgU3RyaW5nOCYgaWZhY2UpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgcmVtb3ZlQ2xpZW50KHdwPENsaWVudD4gY2xpZW50KTsKQEAgLTI2MSw2ICsyODMsMTEgQEAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc3RvcCgpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBwYXVzZSgpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBpc1BsYXlpbmcoYm9vbCogc3RhdGUpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlJiByYXRlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSogcmF0ZSAvKiBub25udWxsICovKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzJiByYXRlLCBmbG9hdCB2aWRlb0Zwc0hpbnQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRTeW5jU2V0dGluZ3MoQVZTeW5jU2V0dGluZ3MqIHJhdGUgLyogbm9ubnVsbCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB2aWRlb0ZwcyAvKiBub25udWxsICovKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2Vla1RvKGludCBtc2VjKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0Q3VycmVudFBvc2l0aW9uKGludCogbXNlYyk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldER1cmF0aW9uKGludCogbXNlYyk7CkBAIC0yOTEsNiArMzE4LDggQEAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJRGF0YVNvdXJjZT4gJnNvdXJjZSk7CisKIAogICAgICAgICBzcDxNZWRpYVBsYXllckJhc2U+ICAgICBzZXREYXRhU291cmNlX3ByZShwbGF5ZXJfdHlwZSBwbGF5ZXJUeXBlKTsKICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgc2V0RGF0YVNvdXJjZV9wb3N0KGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZT4mIHAsCkBAIC0zMDAsNyArMzI5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopOwogCiAgICAgICAgICAgICAgICAgcGlkX3QgICAgICAgICAgIHBpZCgpIGNvbnN0IHsgcmV0dXJuIG1QaWQ7IH0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgZ2V0QXVkaW9TZXNzaW9uSWQoKSB7IHJldHVybiBtQXVkaW9TZXNzaW9uSWQ7IH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCmluZGV4IDE5NGFiYmIuLmY3NjFkZWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKQEAgLTU1LDYgKzU1LDE2IEBACiAgICAgcmV0dXJuIG9rOwogfQogCitzdGF0dXNfdCBNZWRpYVJlY29yZGVyQ2xpZW50OjpzZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4mIHN1cmZhY2UpCit7CisgICAgQUxPR1YoInNldElucHV0U3VyZmFjZSIpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVJlY29yZGVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoInJlY29yZGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1SZWNvcmRlci0+c2V0SW5wdXRTdXJmYWNlKHN1cmZhY2UpOworfQogCiBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBNZWRpYVJlY29yZGVyQ2xpZW50OjpxdWVyeVN1cmZhY2VNZWRpYVNvdXJjZSgpCiB7CkBAIC0xNTQsMTcgKzE2NCw2IEBACiAgICAgcmV0dXJuIG1SZWNvcmRlci0+c2V0QXVkaW9FbmNvZGVyKChhdWRpb19lbmNvZGVyKWFlKTsKIH0KIAotc3RhdHVzX3QgTWVkaWFSZWNvcmRlckNsaWVudDo6c2V0T3V0cHV0RmlsZShjb25zdCBjaGFyKiBwYXRoKQotewotICAgIEFMT0dWKCJzZXRPdXRwdXRGaWxlKCVzKSIsIHBhdGgpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVJlY29yZGVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoInJlY29yZGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1SZWNvcmRlci0+c2V0T3V0cHV0RmlsZShwYXRoKTsKLX0KLQogc3RhdHVzX3QgTWVkaWFSZWNvcmRlckNsaWVudDo6c2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkKIHsKICAgICBBTE9HVigic2V0T3V0cHV0RmlsZSglZCwgJWxsZCwgJWxsZCkiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOwpAQCAtMzAxLDExICszMDAsMTIgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLU1lZGlhUmVjb3JkZXJDbGllbnQ6Ok1lZGlhUmVjb3JkZXJDbGllbnQoY29uc3Qgc3A8TWVkaWFQbGF5ZXJTZXJ2aWNlPiYgc2VydmljZSwgcGlkX3QgcGlkKQorTWVkaWFSZWNvcmRlckNsaWVudDo6TWVkaWFSZWNvcmRlckNsaWVudChjb25zdCBzcDxNZWRpYVBsYXllclNlcnZpY2U+JiBzZXJ2aWNlLCBwaWRfdCBwaWQsCisgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKQogewogICAgIEFMT0dWKCJDbGllbnQgY29uc3RydWN0b3IiKTsKICAgICBtUGlkID0gcGlkOwotICAgIG1SZWNvcmRlciA9IG5ldyBTdGFnZWZyaWdodFJlY29yZGVyOworICAgIG1SZWNvcmRlciA9IG5ldyBTdGFnZWZyaWdodFJlY29yZGVyKG9wUGFja2FnZU5hbWUpOwogICAgIG1NZWRpYVBsYXllclNlcnZpY2UgPSBzZXJ2aWNlOwogfQogCkBAIC0zMzYsNyArMzM2LDcgQEAKICAgICByZXR1cm4gbVJlY29yZGVyLT5zZXRDbGllbnROYW1lKGNsaWVudE5hbWUpOwogfQogCi1zdGF0dXNfdCBNZWRpYVJlY29yZGVyQ2xpZW50OjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Qgeworc3RhdHVzX3QgTWVkaWFSZWNvcmRlckNsaWVudDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKICAgICBpZiAobVJlY29yZGVyICE9IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIG1SZWNvcmRlci0+ZHVtcChmZCwgYXJncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmgKaW5kZXggYTY1ZWM5Zi4uMDUxMzBkNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oCkBAIC0zOCw3ICszOCw2IEBACiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBzZXRPdXRwdXRGb3JtYXQoaW50IG9mKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIHNldFZpZGVvRW5jb2RlcihpbnQgdmUpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgc2V0QXVkaW9FbmNvZGVyKGludCBhZSk7Ci0gICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIqIHBhdGgpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgc2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGxlbmd0aCk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBzZXRWaWRlb1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKQEAgLTU1LDcgKzU0LDggQEAKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIGluaXQoKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIGNsb3NlKCk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICByZWxlYXNlKCk7Ci0gICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBzZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4mIHN1cmZhY2UpOwogICAgIHZpcnR1YWwgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHF1ZXJ5U3VyZmFjZU1lZGlhU291cmNlKCk7CiAKIHByaXZhdGU6CkBAIC02Myw3ICs2Myw4IEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVjb3JkZXJDbGllbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyU2VydmljZT4mIHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgfk1lZGlhUmVjb3JkZXJDbGllbnQoKTsKIAogICAgIHBpZF90ICAgICAgICAgICAgICAgICAgbVBpZDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwCmluZGV4IDcxNWNjMGMuLmE1YTFmYTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcApAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oPgogI2luY2x1ZGUgIk1ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmgiCiAjaW5jbHVkZSAiU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oIgpAQCAtNTYsNyArNTcsNyBAQAogICAgIGRpc2Nvbm5lY3QoKTsKIH0KIAotc3RhdHVzX3QgTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQ6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiAvKmFyZ3MqLykgY29uc3QKK3N0YXR1c190IE1ldGFkYXRhUmV0cmlldmVyQ2xpZW50OjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgLyphcmdzKi8pCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07CkBAIC0xNDAsNyArMTQxLDcgQEAKICAgICAgICAgQUxPR0UoImZzdGF0KCVkKSBmYWlsZWQ6ICVkLCAlcyIsIGZkLCByZXQsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIEFMT0dWKCJzdF9kZXYgID0gJWxsdSIsIHNiLnN0X2Rldik7CisgICAgQUxPR1YoInN0X2RldiAgPSAlbGx1Iiwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHNiLnN0X2RldikpOwogICAgIEFMT0dWKCJzdF9tb2RlID0gJXUiLCBzYi5zdF9tb2RlKTsKICAgICBBTE9HVigic3RfdWlkICA9ICVsdSIsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KHNiLnN0X3VpZCkpOwogICAgIEFMT0dWKCJzdF9naWQgID0gJWx1Iiwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oc2Iuc3RfZ2lkKSk7CkBAIC0xNzMsMTAgKzE3NCwzMCBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXR1c190IE1ldGFkYXRhUmV0cmlldmVyQ2xpZW50OjpzZXREYXRhU291cmNlKAorICAgICAgICBjb25zdCBzcDxJRGF0YVNvdXJjZT4mIHNvdXJjZSkKK3sKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZShJRGF0YVNvdXJjZSkiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisKKyAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbUlEYXRhU291cmNlKHNvdXJjZSk7CisgICAgcGxheWVyX3R5cGUgcGxheWVyVHlwZSA9CisgICAgICAgIE1lZGlhUGxheWVyRmFjdG9yeTo6Z2V0UGxheWVyVHlwZShOVUxMIC8qIGNsaWVudCAqLywgZGF0YVNvdXJjZSk7CisgICAgQUxPR1YoInBsYXllciB0eXBlID0gJWQiLCBwbGF5ZXJUeXBlKTsKKyAgICBzcDxNZWRpYU1ldGFkYXRhUmV0cmlldmVyQmFzZT4gcCA9IGNyZWF0ZVJldHJpZXZlcihwbGF5ZXJUeXBlKTsKKyAgICBpZiAocCA9PSBOVUxMKSByZXR1cm4gTk9fSU5JVDsKKyAgICBzdGF0dXNfdCByZXQgPSBwLT5zZXREYXRhU291cmNlKGRhdGFTb3VyY2UpOworICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIG1SZXRyaWV2ZXIgPSBwOworICAgIHJldHVybiByZXQ7Cit9CisKK011dGV4IE1ldGFkYXRhUmV0cmlldmVyQ2xpZW50OjpzTG9jazsKKwogc3A8SU1lbW9yeT4gTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQ6OmdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uKQogewogICAgIEFMT0dWKCJnZXRGcmFtZUF0VGltZTogdGltZSglbGxkIHVzKSBvcHRpb24oJWQpIiwgdGltZVVzLCBvcHRpb24pOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgZ2xvY2soc0xvY2spOwogICAgIG1UaHVtYm5haWwuY2xlYXIoKTsKICAgICBpZiAobVJldHJpZXZlciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJyZXRyaWV2ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5oCmluZGV4IDlkM2ZiZTkuLmZlNzU0N2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5oCkBAIC00OSwxMSArNDksMTIgQEAKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICAgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICBzZXREYXRhU291cmNlKGNvbnN0IHNwPElEYXRhU291cmNlPiYgc291cmNlKTsKICAgICB2aXJ0dWFsIHNwPElNZW1vcnk+ICAgICAgICAgICAgIGdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uKTsKICAgICB2aXJ0dWFsIHNwPElNZW1vcnk+ICAgICAgICAgICAgIGV4dHJhY3RBbGJ1bUFydCgpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciogICAgICAgICAgICAgZXh0cmFjdE1ldGFkYXRhKGludCBrZXlDb2RlKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBNZWRpYVBsYXllclNlcnZpY2U7CkBAIC02Miw2ICs2Myw3IEBACiAgICAgdmlydHVhbCB+TWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQoKTsKIAogICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOworICAgIHN0YXRpYyAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgIHNMb2NrOwogICAgIHNwPE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXJCYXNlPiAgICAgICAgIG1SZXRyaWV2ZXI7CiAgICAgcGlkX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBpZDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1JlbW90ZURpc3BsYXkuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1JlbW90ZURpc3BsYXkuY3BwCmluZGV4IGViOTU5YjQuLjBlYjRiNWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9SZW1vdGVEaXNwbGF5LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvUmVtb3RlRGlzcGxheS5jcHAKQEAgLTI2LDEzICsyNiwxNCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBSZW1vdGVEaXNwbGF5OjpSZW1vdGVEaXNwbGF5KAorICAgICAgICBjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSwKICAgICAgICAgY29uc3Qgc3A8SVJlbW90ZURpc3BsYXlDbGllbnQ+ICZjbGllbnQsCiAgICAgICAgIGNvbnN0IGNoYXIgKmlmYWNlKQogICAgIDogbUxvb3BlcihuZXcgQUxvb3BlciksCiAgICAgICBtTmV0U2Vzc2lvbihuZXcgQU5ldHdvcmtTZXNzaW9uKSB7CiAgICAgbUxvb3Blci0+c2V0TmFtZSgid2ZkX2xvb3BlciIpOwogCi0gICAgbVNvdXJjZSA9IG5ldyBXaWZpRGlzcGxheVNvdXJjZShtTmV0U2Vzc2lvbiwgY2xpZW50KTsKKyAgICBtU291cmNlID0gbmV3IFdpZmlEaXNwbGF5U291cmNlKG9wUGFja2FnZU5hbWUsIG1OZXRTZXNzaW9uLCBjbGllbnQpOwogICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtU291cmNlKTsKIAogICAgIG1OZXRTZXNzaW9uLT5zdGFydCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1JlbW90ZURpc3BsYXkuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9SZW1vdGVEaXNwbGF5LmgKaW5kZXggODJhMDExNi4uZDQ1NzNlOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1JlbW90ZURpc3BsYXkuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvUmVtb3RlRGlzcGxheS5oCkBAIC0yOCwxMSArMjgsMTIgQEAKIAogc3RydWN0IEFMb29wZXI7CiBzdHJ1Y3QgQU5ldHdvcmtTZXNzaW9uOwotc3RydWN0IElSZW1vdGVEaXNwbGF5Q2xpZW50OworY2xhc3MgSVJlbW90ZURpc3BsYXlDbGllbnQ7CiBzdHJ1Y3QgV2lmaURpc3BsYXlTb3VyY2U7CiAKIHN0cnVjdCBSZW1vdGVEaXNwbGF5IDogcHVibGljIEJuUmVtb3RlRGlzcGxheSB7CiAgICAgUmVtb3RlRGlzcGxheSgKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2ICZvcFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgY29uc3Qgc3A8SVJlbW90ZURpc3BsYXlDbGllbnQ+ICZjbGllbnQsCiAgICAgICAgICAgICBjb25zdCBjaGFyICppZmFjZSk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwCmluZGV4IGIzN2FlZTMuLjNmZWRkOWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcApAQCAtMTg4LDYgKzE4OCwxNCBAQAogICAgIHJldHVybiBtUGxheWVyLT5nZXRQYXJhbWV0ZXIoa2V5LCByZXBseSk7CiB9CiAKK3N0YXR1c190IFN0YWdlZnJpZ2h0UGxheWVyOjpzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKSB7CisgICAgcmV0dXJuIG1QbGF5ZXItPnNldFBsYXliYWNrU2V0dGluZ3MocmF0ZSk7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UGxheWVyOjpnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlIC8qIG5vbm51bGwgKi8pIHsKKyAgICByZXR1cm4gbVBsYXllci0+Z2V0UGxheWJhY2tTZXR0aW5ncyhyYXRlKTsKK30KKwogc3RhdHVzX3QgU3RhZ2VmcmlnaHRQbGF5ZXI6OmdldE1ldGFkYXRhKAogICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgLyogaWRzICovLCBQYXJjZWwgKnJlY29yZHMpIHsKICAgICB1c2luZyBtZWRpYTo6TWV0YWRhdGE7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oCmluZGV4IGU2YzMwZmYuLjk2MDEzZGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oCkBAIC02MCw2ICs2MCw4IEBACiAgICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvU2luayhjb25zdCBzcDxBdWRpb1Npbms+ICZhdWRpb1NpbmspOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUgLyogbm9ubnVsbCAqLyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFkYXRhKAogICAgICAgICAgICAgY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXImIGlkcywgUGFyY2VsICpyZWNvcmRzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcAppbmRleCA4NjYzOWNiLi5lNTIxZmFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCkBAIC02OSwxMiArNjksMTIgQEAKIH0KIAogCi1TdGFnZWZyaWdodFJlY29yZGVyOjpTdGFnZWZyaWdodFJlY29yZGVyKCkKLSAgICA6IG1Xcml0ZXIoTlVMTCksCitTdGFnZWZyaWdodFJlY29yZGVyOjpTdGFnZWZyaWdodFJlY29yZGVyKGNvbnN0IFN0cmluZzE2ICZvcFBhY2thZ2VOYW1lKQorICAgIDogTWVkaWFSZWNvcmRlckJhc2Uob3BQYWNrYWdlTmFtZSksCisgICAgICBtV3JpdGVyKE5VTEwpLAogICAgICAgbU91dHB1dEZkKC0xKSwKICAgICAgIG1BdWRpb1NvdXJjZShBVURJT19TT1VSQ0VfQ05UKSwKICAgICAgIG1WaWRlb1NvdXJjZShWSURFT19TT1VSQ0VfTElTVF9FTkQpLAotICAgICAgbUNhcHR1cmVUaW1lTGFwc2UoZmFsc2UpLAogICAgICAgbVN0YXJ0ZWQoZmFsc2UpIHsKIAogICAgIEFMT0dWKCJDb25zdHJ1Y3RvciIpOwpAQCAtMjA2LDcgKzIwNiw3IEBACiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRWaWRlb0ZyYW1lUmF0ZShpbnQgZnJhbWVzX3Blcl9zZWNvbmQpIHsKICAgICBBTE9HVigic2V0VmlkZW9GcmFtZVJhdGU6ICVkIiwgZnJhbWVzX3Blcl9zZWNvbmQpOwogICAgIGlmICgoZnJhbWVzX3Blcl9zZWNvbmQgPD0gMCAmJiBmcmFtZXNfcGVyX3NlY29uZCAhPSAtMSkgfHwKLSAgICAgICAgZnJhbWVzX3Blcl9zZWNvbmQgPiAxMjApIHsKKyAgICAgICAgZnJhbWVzX3Blcl9zZWNvbmQgPiBrTWF4SGlnaFNwZWVkRnBzKSB7CiAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHZpZGVvIGZyYW1lIHJhdGU6ICVkIiwgZnJhbWVzX3Blcl9zZWNvbmQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KQEAgLTI0MSwxMiArMjQxLDExIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIgKiAvKiBwYXRoICovKSB7Ci0gICAgQUxPR0UoInNldE91dHB1dEZpbGUoY29uc3QgY2hhciopIG11c3Qgbm90IGJlIGNhbGxlZCIpOwotICAgIC8vIFdlIGRvbid0IGFjdHVhbGx5IHN1cHBvcnQgdGhpcyBhdCBhbGwsIGFzIHRoZSBtZWRpYV9zZXJ2ZXIgcHJvY2VzcwotICAgIC8vIG5vIGxvbmdlciBoYXMgcGVybWlzc2lvbnMgdG8gY3JlYXRlIGZpbGVzLgorc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0SW5wdXRTdXJmYWNlKAorICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiYgc3VyZmFjZSkgeworICAgIG1QZXJzaXN0ZW50U3VyZmFjZSA9IHN1cmZhY2U7CiAKLSAgICByZXR1cm4gLUVQRVJNOworICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgewpAQCAtMjcxLDYgKzI3MCwzMSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorLy8gQXR0ZW1wdCB0byBwYXJzZSBhbiBmbG9hdCBsaXRlcmFsIG9wdGlvbmFsbHkgc3Vycm91bmRlZCBieSB3aGl0ZXNwYWNlLAorLy8gcmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KK3N0YXRpYyBib29sIHNhZmVfc3RydG9mKGNvbnN0IGNoYXIgKnMsIGZsb2F0ICp2YWwpIHsKKyAgICBjaGFyICplbmQ7CisKKyAgICAvLyBJdCBpcyBsYW1lLCBidXQgYWNjb3JkaW5nIHRvIG1hbiBwYWdlLCB3ZSBoYXZlIHRvIHNldCBlcnJubyB0byAwCisgICAgLy8gYmVmb3JlIGNhbGxpbmcgc3RydG9mKCkuCisgICAgZXJybm8gPSAwOworICAgICp2YWwgPSBzdHJ0b2YocywgJmVuZCk7CisKKyAgICBpZiAoZW5kID09IHMgfHwgZXJybm8gPT0gRVJBTkdFKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBTa2lwIHRyYWlsaW5nIHdoaXRlc3BhY2UKKyAgICB3aGlsZSAoaXNzcGFjZSgqZW5kKSkgeworICAgICAgICArK2VuZDsKKyAgICB9CisKKyAgICAvLyBGb3IgYSBzdWNjZXNzZnVsIHJldHVybiwgdGhlIHN0cmluZyBtdXN0IGNvbnRhaW4gbm90aGluZyBidXQgYSB2YWxpZAorICAgIC8vIGZsb2F0IGxpdGVyYWwgb3B0aW9uYWxseSBzdXJyb3VuZGVkIGJ5IHdoaXRlc3BhY2UuCisKKyAgICByZXR1cm4gKmVuZCA9PSAnXDAnOworfQorCiAvLyBBdHRlbXB0IHRvIHBhcnNlIGFuIGludDY0IGxpdGVyYWwgb3B0aW9uYWxseSBzdXJyb3VuZGVkIGJ5IHdoaXRlc3BhY2UsCiAvLyByZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgogc3RhdGljIGJvb2wgc2FmZV9zdHJ0b2k2NChjb25zdCBjaGFyICpzLCBpbnQ2NF90ICp2YWwpIHsKQEAgLTU0MSwyOSArNTY1LDMyIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbVRpbWVMYXBzZUVuYWJsZShpbnQzMl90IHRpbWVMYXBzZUVuYWJsZSkgewotICAgIEFMT0dWKCJzZXRQYXJhbVRpbWVMYXBzZUVuYWJsZTogJWQiLCB0aW1lTGFwc2VFbmFibGUpOworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1DYXB0dXJlRnBzRW5hYmxlKGludDMyX3QgY2FwdHVyZUZwc0VuYWJsZSkgeworICAgIEFMT0dWKCJzZXRQYXJhbUNhcHR1cmVGcHNFbmFibGU6ICVkIiwgY2FwdHVyZUZwc0VuYWJsZSk7CiAKLSAgICBpZih0aW1lTGFwc2VFbmFibGUgPT0gMCkgewotICAgICAgICBtQ2FwdHVyZVRpbWVMYXBzZSA9IGZhbHNlOwotICAgIH0gZWxzZSBpZiAodGltZUxhcHNlRW5hYmxlID09IDEpIHsKLSAgICAgICAgbUNhcHR1cmVUaW1lTGFwc2UgPSB0cnVlOworICAgIGlmKGNhcHR1cmVGcHNFbmFibGUgPT0gMCkgeworICAgICAgICBtQ2FwdHVyZUZwc0VuYWJsZSA9IGZhbHNlOworICAgIH0gZWxzZSBpZiAoY2FwdHVyZUZwc0VuYWJsZSA9PSAxKSB7CisgICAgICAgIG1DYXB0dXJlRnBzRW5hYmxlID0gdHJ1ZTsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmUoaW50NjRfdCB0aW1lVXMpIHsKLSAgICBBTE9HVigic2V0UGFyYW1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZTogJWxsZCB1cyIsIHRpbWVVcyk7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbUNhcHR1cmVGcHMoZmxvYXQgZnBzKSB7CisgICAgQUxPR1YoInNldFBhcmFtQ2FwdHVyZUZwczogJS4yZiIsIGZwcyk7CisKKyAgICBpbnQ2NF90IHRpbWVVcyA9IChpbnQ2NF90KSAoMTAwMDAwMC4wIC8gZnBzICsgMC41Zik7CiAKICAgICAvLyBOb3QgYWxsb3dpbmcgdGltZSBtb3JlIHRoYW4gYSBkYXkKICAgICBpZiAodGltZVVzIDw9IDAgfHwgdGltZVVzID4gODY0MDAqMUU2KSB7Ci0gICAgICAgIEFMT0dFKCJUaW1lIGJldHdlZW4gdGltZSBsYXBzZSBmcmFtZSBjYXB0dXJlICglbGxkKSBpcyBvdXQgb2YgcmFuZ2UgWzAsIDEgRGF5XSIsIHRpbWVVcyk7CisgICAgICAgIEFMT0dFKCJUaW1lIGJldHdlZW4gZnJhbWUgY2FwdHVyZSAoJWxsZCkgaXMgb3V0IG9mIHJhbmdlIFswLCAxIERheV0iLCB0aW1lVXMpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzID0gdGltZVVzOworICAgIG1DYXB0dXJlRnBzID0gZnBzOworICAgIG1UaW1lQmV0d2VlbkNhcHR1cmVVcyA9IHRpbWVVczsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTY4NiwxNSArNzEzLDE0IEBACiAgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1WaWRlb1RpbWVTY2FsZSh0aW1lU2NhbGUpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChrZXkgPT0gInRpbWUtbGFwc2UtZW5hYmxlIikgewotICAgICAgICBpbnQzMl90IHRpbWVMYXBzZUVuYWJsZTsKLSAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZ0aW1lTGFwc2VFbmFibGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1UaW1lTGFwc2VFbmFibGUodGltZUxhcHNlRW5hYmxlKTsKKyAgICAgICAgaW50MzJfdCBjYXB0dXJlRnBzRW5hYmxlOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJmNhcHR1cmVGcHNFbmFibGUpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1DYXB0dXJlRnBzRW5hYmxlKGNhcHR1cmVGcHNFbmFibGUpOwogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChrZXkgPT0gInRpbWUtYmV0d2Vlbi10aW1lLWxhcHNlLWZyYW1lLWNhcHR1cmUiKSB7Ci0gICAgICAgIGludDY0X3QgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVczsKLSAgICAgICAgaWYgKHNhZmVfc3RydG9pNjQodmFsdWUuc3RyaW5nKCksICZ0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKSkgewotICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmUoCi0gICAgICAgICAgICAgICAgICAgIHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpOworICAgIH0gZWxzZSBpZiAoa2V5ID09ICJ0aW1lLWxhcHNlLWZwcyIpIHsKKyAgICAgICAgZmxvYXQgZnBzOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2YodmFsdWUuc3RyaW5nKCksICZmcHMpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1DYXB0dXJlRnBzKGZwcyk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBBTE9HRSgic2V0UGFyYW1ldGVyOiBmYWlsZWQgdG8gZmluZCBrZXkgJXMiLCBrZXkuc3RyaW5nKCkpOwpAQCAtODgyLDExICs5MDgsMzIgQEAKIH0KIAogc3A8TWVkaWFTb3VyY2U+IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OmNyZWF0ZUF1ZGlvU291cmNlKCkgeworICAgIGludDMyX3Qgc291cmNlU2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOworCisgICAgaWYgKG1DYXB0dXJlRnBzRW5hYmxlICYmIG1DYXB0dXJlRnBzID49IG1GcmFtZVJhdGUpIHsKKyAgICAgICAgLy8gVXBzY2FsZSB0aGUgc2FtcGxlIHJhdGUgZm9yIHNsb3cgbW90aW9uIHJlY29yZGluZy4KKyAgICAgICAgLy8gRmFpbCBhdWRpbyBzb3VyY2UgY3JlYXRpb24gaWYgc291cmNlIHNhbXBsZSByYXRlIGlzIHRvbyBoaWdoLCBhcyBpdCBjb3VsZAorICAgICAgICAvLyBjYXVzZSBvdXQtb2YtbWVtb3J5IGR1ZSB0byBsYXJnZSBpbnB1dCBidWZmZXIgc2l6ZS4gQW5kIGF1ZGlvIHJlY29yZGluZworICAgICAgICAvLyBwcm9iYWJseSBkb2Vzbid0IG1ha2Ugc2Vuc2UgaW4gdGhlIHNjZW5hcmlvLCBzaW5jZSB0aGUgc2xvdy1kb3duIGZhY3RvcgorICAgICAgICAvLyBpcyBwcm9iYWJseSBodWdlIChlZy4gbVNhbXBsZVJhdGU9NDhLLCBtQ2FwdHVyZUZwcz0yNDAsIG1GcmFtZVJhdGU9MSkuCisgICAgICAgIGNvbnN0IHN0YXRpYyBpbnQzMl90IFNBTVBMRV9SQVRFX0haX01BWCA9IDE5MjAwMDsKKyAgICAgICAgc291cmNlU2FtcGxlUmF0ZSA9CisgICAgICAgICAgICAgICAgKG1TYW1wbGVSYXRlICogbUNhcHR1cmVGcHMgKyBtRnJhbWVSYXRlIC8gMikgLyBtRnJhbWVSYXRlOworICAgICAgICBpZiAoc291cmNlU2FtcGxlUmF0ZSA8IG1TYW1wbGVSYXRlIHx8IHNvdXJjZVNhbXBsZVJhdGUgPiBTQU1QTEVfUkFURV9IWl9NQVgpIHsKKyAgICAgICAgICAgIEFMT0dFKCJzb3VyY2Ugc2FtcGxlIHJhdGUgb3V0IG9mIHJhbmdlISAiCisgICAgICAgICAgICAgICAgICAgICIobVNhbXBsZVJhdGUgJWQsIG1DYXB0dXJlRnBzICUuMmYsIG1GcmFtZVJhdGUgJWQiLAorICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbUNhcHR1cmVGcHMsIG1GcmFtZVJhdGUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKICAgICBzcDxBdWRpb1NvdXJjZT4gYXVkaW9Tb3VyY2UgPQogICAgICAgICBuZXcgQXVkaW9Tb3VyY2UoCiAgICAgICAgICAgICAgICAgbUF1ZGlvU291cmNlLAotICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgIG1BdWRpb0NoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBtT3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICBzb3VyY2VTYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgIG1BdWRpb0NoYW5uZWxzLAorICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlKTsKIAogICAgIHN0YXR1c190IGVyciA9IGF1ZGlvU291cmNlLT5pbml0Q2hlY2soKTsKIApAQCAtODk2LDcgKzk0Myw2IEBACiAgICAgfQogCiAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZTsKLSAgICBjb25zdCBjaGFyICptaW1lOwogICAgIHN3aXRjaCAobUF1ZGlvRW5jb2RlcikgewogICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfQU1SX05COgogICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfREVGQVVMVDoKQEAgLTkzNCw2ICs5ODAsNyBAQAogICAgIGlmIChtQXVkaW9UaW1lU2NhbGUgPiAwKSB7CiAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInRpbWUtc2NhbGUiLCBtQXVkaW9UaW1lU2NhbGUpOwogICAgIH0KKyAgICBmb3JtYXQtPnNldEludDMyKCJwcmlvcml0eSIsIDAgLyogcmVhbHRpbWUgKi8pOwogCiAgICAgc3A8TWVkaWFTb3VyY2U+IGF1ZGlvRW5jb2RlciA9CiAgICAgICAgICAgICBNZWRpYUNvZGVjU291cmNlOjpDcmVhdGUobUxvb3BlciwgZm9ybWF0LCBhdWRpb1NvdXJjZSk7CkBAIC0xMTY1LDggKzEyMTIsNyBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6Y2hlY2tWaWRlb0VuY29kZXJDYXBhYmlsaXRpZXMoCi0gICAgICAgIGJvb2wgKnN1cHBvcnRzQ2FtZXJhU291cmNlTWV0YURhdGFNb2RlKSB7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpjaGVja1ZpZGVvRW5jb2RlckNhcGFiaWxpdGllcygpIHsKICAgICAvKiBoYXJkd2FyZSBjb2RlY3MgbXVzdCBzdXBwb3J0IGNhbWVyYSBzb3VyY2UgbWV0YSBkYXRhIG1vZGUgKi8KICAgICBWZWN0b3I8Q29kZWNDYXBhYmlsaXRpZXM+IGNvZGVjczsKICAgICBPTVhDbGllbnQgY2xpZW50OwpAQCAtMTE3OCwxMSArMTIyNCw4IEBACiAgICAgICAgICAgICAgbVZpZGVvRW5jb2RlciA9PSBWSURFT19FTkNPREVSX1ZQOCA/IE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCA6CiAgICAgICAgICAgICAgbVZpZGVvRW5jb2RlciA9PSBWSURFT19FTkNPREVSX0gyNjQgPyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMgOiAiIiksCiAgICAgICAgICAgICBmYWxzZSAvKiBkZWNvZGVyICovLCB0cnVlIC8qIGh3Q29kZWMgKi8sICZjb2RlY3MpOwotICAgICpzdXBwb3J0c0NhbWVyYVNvdXJjZU1ldGFEYXRhTW9kZSA9IGNvZGVjcy5zaXplKCkgPiAwOwotICAgIEFMT0dWKCJlbmNvZGVyICVzIGNhbWVyYSBzb3VyY2UgbWV0YS1kYXRhIG1vZGUiLAotICAgICAgICAgICAgKnN1cHBvcnRzQ2FtZXJhU291cmNlTWV0YURhdGFNb2RlID8gInN1cHBvcnRzIiA6ICJET0VTIE5PVCBTVVBQT1JUIik7CiAKLSAgICBpZiAoIW1DYXB0dXJlVGltZUxhcHNlKSB7CisgICAgaWYgKCFtQ2FwdHVyZUZwc0VuYWJsZSkgewogICAgICAgICAvLyBEb250IGNsaXAgZm9yIHRpbWUgbGFwc2UgY2FwdHVyZSBhcyBlbmNvZGVyIHdpbGwgaGF2ZSBlbm91Z2gKICAgICAgICAgLy8gdGltZSB0byBlbmNvZGUgYmVjYXVzZSBvZiBzbG93IGNhcHR1cmUgcmF0ZSBvZiB0aW1lIGxhcHNlLgogICAgICAgICBjbGlwVmlkZW9CaXRSYXRlKCk7CkBAIC0xMzg5LDMyICsxNDMyLDI5IEBACiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cENhbWVyYVNvdXJjZSgKICAgICAgICAgc3A8Q2FtZXJhU291cmNlPiAqY2FtZXJhU291cmNlKSB7CiAgICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgYm9vbCBlbmNvZGVyU3VwcG9ydHNDYW1lcmFTb3VyY2VNZXRhRGF0YU1vZGU7Ci0gICAgaWYgKChlcnIgPSBjaGVja1ZpZGVvRW5jb2RlckNhcGFiaWxpdGllcygKLSAgICAgICAgICAgICAgICAmZW5jb2RlclN1cHBvcnRzQ2FtZXJhU291cmNlTWV0YURhdGFNb2RlKSkgIT0gT0spIHsKKyAgICBpZiAoKGVyciA9IGNoZWNrVmlkZW9FbmNvZGVyQ2FwYWJpbGl0aWVzKCkpICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogICAgIFNpemUgdmlkZW9TaXplOwogICAgIHZpZGVvU2l6ZS53aWR0aCA9IG1WaWRlb1dpZHRoOwogICAgIHZpZGVvU2l6ZS5oZWlnaHQgPSBtVmlkZW9IZWlnaHQ7Ci0gICAgaWYgKG1DYXB0dXJlVGltZUxhcHNlKSB7Ci0gICAgICAgIGlmIChtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyA8IDApIHsKKyAgICBpZiAobUNhcHR1cmVGcHNFbmFibGUpIHsKKyAgICAgICAgaWYgKG1UaW1lQmV0d2VlbkNhcHR1cmVVcyA8IDApIHsKICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzIHZhbHVlOiAlbGxkIiwKLSAgICAgICAgICAgICAgICBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyk7CisgICAgICAgICAgICAgICAgbVRpbWVCZXR3ZWVuQ2FwdHVyZVVzKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KIAogICAgICAgICBtQ2FtZXJhU291cmNlVGltZUxhcHNlID0gQ2FtZXJhU291cmNlVGltZUxhcHNlOjpDcmVhdGVGcm9tQ2FtZXJhKAogICAgICAgICAgICAgICAgIG1DYW1lcmEsIG1DYW1lcmFQcm94eSwgbUNhbWVyYUlkLCBtQ2xpZW50TmFtZSwgbUNsaWVudFVpZCwKICAgICAgICAgICAgICAgICB2aWRlb1NpemUsIG1GcmFtZVJhdGUsIG1QcmV2aWV3U3VyZmFjZSwKLSAgICAgICAgICAgICAgICBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcywKLSAgICAgICAgICAgICAgICBlbmNvZGVyU3VwcG9ydHNDYW1lcmFTb3VyY2VNZXRhRGF0YU1vZGUpOworICAgICAgICAgICAgICAgIG1UaW1lQmV0d2VlbkNhcHR1cmVVcyk7CiAgICAgICAgICpjYW1lcmFTb3VyY2UgPSBtQ2FtZXJhU291cmNlVGltZUxhcHNlOwogICAgIH0gZWxzZSB7CiAgICAgICAgICpjYW1lcmFTb3VyY2UgPSBDYW1lcmFTb3VyY2U6OkNyZWF0ZUZyb21DYW1lcmEoCiAgICAgICAgICAgICAgICAgbUNhbWVyYSwgbUNhbWVyYVByb3h5LCBtQ2FtZXJhSWQsIG1DbGllbnROYW1lLCBtQ2xpZW50VWlkLAogICAgICAgICAgICAgICAgIHZpZGVvU2l6ZSwgbUZyYW1lUmF0ZSwKLSAgICAgICAgICAgICAgICBtUHJldmlld1N1cmZhY2UsIGVuY29kZXJTdXBwb3J0c0NhbWVyYVNvdXJjZU1ldGFEYXRhTW9kZSk7CisgICAgICAgICAgICAgICAgbVByZXZpZXdTdXJmYWNlKTsKICAgICB9CiAgICAgbUNhbWVyYS5jbGVhcigpOwogICAgIG1DYW1lcmFQcm94eS5jbGVhcigpOwpAQCAtMTQ5OSwxNCArMTUzOSwxMyBAQAogICAgICAgICBmb3JtYXQtPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZE9wYXF1ZSk7CiAKICAgICAgICAgLy8gc2V0IHVwIHRpbWUgbGFwc2Uvc2xvdyBtb3Rpb24gZm9yIHN1cmZhY2Ugc291cmNlCi0gICAgICAgIGlmIChtQ2FwdHVyZVRpbWVMYXBzZSkgewotICAgICAgICAgICAgaWYgKG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzIDw9IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyB2YWx1ZTogJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKTsKKyAgICAgICAgaWYgKG1DYXB0dXJlRnBzRW5hYmxlKSB7CisgICAgICAgICAgICBpZiAobVRpbWVCZXR3ZWVuQ2FwdHVyZVVzIDw9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBtVGltZUJldHdlZW5DYXB0dXJlVXMgdmFsdWU6ICVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVCZXR3ZWVuQ2FwdHVyZVVzKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQ2NCgidGltZS1sYXBzZSIsCi0gICAgICAgICAgICAgICAgICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50NjQoInRpbWUtbGFwc2UiLCBtVGltZUJldHdlZW5DYXB0dXJlVXMpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNTI0LDYgKzE1NjMsMTEgQEAKICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigibGV2ZWwiLCBtVmlkZW9FbmNvZGVyTGV2ZWwpOwogICAgIH0KIAorICAgIGZvcm1hdC0+c2V0SW50MzIoInByaW9yaXR5IiwgMCAvKiByZWFsdGltZSAqLyk7CisgICAgaWYgKG1DYXB0dXJlRnBzRW5hYmxlKSB7CisgICAgICAgIGZvcm1hdC0+c2V0RmxvYXQoIm9wZXJhdGluZy1yYXRlIiwgbUNhcHR1cmVGcHMpOworICAgIH0KKwogICAgIHVpbnQzMl90IGZsYWdzID0gMDsKICAgICBpZiAobUlzTWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycykgewogICAgICAgICBmbGFncyB8PSBNZWRpYUNvZGVjU291cmNlOjpGTEFHX1VTRV9NRVRBREFUQV9JTlBVVDsKQEAgLTE1MzMsOCArMTU3Nyw4IEBACiAgICAgICAgIGZsYWdzIHw9IE1lZGlhQ29kZWNTb3VyY2U6OkZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQ7CiAgICAgfQogCi0gICAgc3A8TWVkaWFDb2RlY1NvdXJjZT4gZW5jb2RlciA9Ci0gICAgICAgICAgICBNZWRpYUNvZGVjU291cmNlOjpDcmVhdGUobUxvb3BlciwgZm9ybWF0LCBjYW1lcmFTb3VyY2UsIGZsYWdzKTsKKyAgICBzcDxNZWRpYUNvZGVjU291cmNlPiBlbmNvZGVyID0gTWVkaWFDb2RlY1NvdXJjZTo6Q3JlYXRlKAorICAgICAgICAgICAgbUxvb3BlciwgZm9ybWF0LCBjYW1lcmFTb3VyY2UsIG1QZXJzaXN0ZW50U3VyZmFjZSwgZmxhZ3MpOwogICAgIGlmIChlbmNvZGVyID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgdmlkZW8gZW5jb2RlciIpOwogICAgICAgICAvLyBXaGVuIHRoZSBlbmNvZGVyIGZhaWxzIHRvIGJlIGNyZWF0ZWQsIHdlIG5lZWQKQEAgLTE1ODksMTAgKzE2MzMsMTEgQEAKIAogICAgIHN0YXR1c190IGVyciA9IE9LOwogICAgIHNwPE1lZGlhV3JpdGVyPiB3cml0ZXI7CisgICAgc3A8TVBFRzRXcml0ZXI+IG1wNHdyaXRlcjsKICAgICBpZiAobU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX1dFQk0pIHsKICAgICAgICAgd3JpdGVyID0gbmV3IFdlYm1Xcml0ZXIobU91dHB1dEZkKTsKICAgICB9IGVsc2UgewotICAgICAgICB3cml0ZXIgPSBuZXcgTVBFRzRXcml0ZXIobU91dHB1dEZkKTsKKyAgICAgICAgd3JpdGVyID0gbXA0d3JpdGVyID0gbmV3IE1QRUc0V3JpdGVyKG1PdXRwdXRGZCk7CiAgICAgfQogCiAgICAgaWYgKG1WaWRlb1NvdXJjZSA8IFZJREVPX1NPVVJDRV9MSVNUX0VORCkgewpAQCAtMTYxOSwxOSArMTY2NCwyMyBAQAogICAgICAgICAvLyBUaGlzIGhlbHAgbWFrZSBzdXJlIHRoYXQgdGhlICJyZWNvZGluZyIgc291bmQgaXMgc3VwcHJlc3NlZCBmb3IKICAgICAgICAgLy8gY2FtY29yZGVyIGFwcGxpY2F0aW9ucyBpbiB0aGUgcmVjb3JkZWQgZmlsZXMuCiAgICAgICAgIC8vIFRPRE8gQXVkaW8gc291cmNlIGlzIGN1cnJlbnRseSB1bnN1cHBvcnRlZCBmb3Igd2VibSBvdXRwdXQ7IHZvcmJpcyBlbmNvZGVyIG5lZWRlZC4KLSAgICAgICAgaWYgKCFtQ2FwdHVyZVRpbWVMYXBzZSAmJiAobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQpKSB7CisgICAgICAgIC8vIGRpc2FibGUgYXVkaW8gZm9yIHRpbWUgbGFwc2UgcmVjb3JkaW5nCisgICAgICAgIGJvb2wgZGlzYWJsZUF1ZGlvID0gbUNhcHR1cmVGcHNFbmFibGUgJiYgbUNhcHR1cmVGcHMgPCBtRnJhbWVSYXRlOworICAgICAgICBpZiAoIWRpc2FibGVBdWRpbyAmJiBtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0NOVCkgewogICAgICAgICAgICAgZXJyID0gc2V0dXBBdWRpb0VuY29kZXIod3JpdGVyKTsKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CiAgICAgICAgICAgICBtVG90YWxCaXRSYXRlICs9IG1BdWRpb0JpdFJhdGU7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobUNhcHR1cmVGcHNFbmFibGUpIHsKKyAgICAgICAgICAgIG1wNHdyaXRlci0+c2V0Q2FwdHVyZVJhdGUobUNhcHR1cmVGcHMpOworICAgICAgICB9CisKICAgICAgICAgaWYgKG1JbnRlcmxlYXZlRHVyYXRpb25VcyA+IDApIHsKLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TVBFRzRXcml0ZXIgKj4od3JpdGVyLmdldCgpKS0+Ci0gICAgICAgICAgICAgICAgc2V0SW50ZXJsZWF2ZUR1cmF0aW9uKG1JbnRlcmxlYXZlRHVyYXRpb25Vcyk7CisgICAgICAgICAgICBtcDR3cml0ZXItPnNldEludGVybGVhdmVEdXJhdGlvbihtSW50ZXJsZWF2ZUR1cmF0aW9uVXMpOwogICAgICAgICB9CiAgICAgICAgIGlmIChtTG9uZ2l0dWRleDEwMDAwID4gLTM2MDAwMDAgJiYgbUxhdGl0dWRleDEwMDAwID4gLTM2MDAwMDApIHsKLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TVBFRzRXcml0ZXIgKj4od3JpdGVyLmdldCgpKS0+Ci0gICAgICAgICAgICAgICAgc2V0R2VvRGF0YShtTGF0aXR1ZGV4MTAwMDAsIG1Mb25naXR1ZGV4MTAwMDApOworICAgICAgICAgICAgbXA0d3JpdGVyLT5zZXRHZW9EYXRhKG1MYXRpdHVkZXgxMDAwMCwgbUxvbmdpdHVkZXgxMDAwMCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKG1NYXhGaWxlRHVyYXRpb25VcyAhPSAwKSB7CkBAIC0xNzA0LDcgKzE3NTMsNyBAQAogICAgIEFMT0dWKCJzdG9wIik7CiAgICAgc3RhdHVzX3QgZXJyID0gT0s7CiAKLSAgICBpZiAobUNhcHR1cmVUaW1lTGFwc2UgJiYgbUNhbWVyYVNvdXJjZVRpbWVMYXBzZSAhPSBOVUxMKSB7CisgICAgaWYgKG1DYXB0dXJlRnBzRW5hYmxlICYmIG1DYW1lcmFTb3VyY2VUaW1lTGFwc2UgIT0gTlVMTCkgewogICAgICAgICBtQ2FtZXJhU291cmNlVGltZUxhcHNlLT5zdGFydFF1aWNrUmVhZFJldHVybnMoKTsKICAgICAgICAgbUNhbWVyYVNvdXJjZVRpbWVMYXBzZSA9IE5VTEw7CiAgICAgfQpAQCAtMTcxNSw2ICsxNzY0LDcgQEAKICAgICB9CiAKICAgICBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmNsZWFyKCk7CisgICAgbVBlcnNpc3RlbnRTdXJmYWNlLmNsZWFyKCk7CiAKICAgICBpZiAobU91dHB1dEZkID49IDApIHsKICAgICAgICAgOjpjbG9zZShtT3V0cHV0RmQpOwpAQCAtMTc3OCw4ICsxODI4LDkgQEAKICAgICBtTWF4RmlsZUR1cmF0aW9uVXMgPSAwOwogICAgIG1NYXhGaWxlU2l6ZUJ5dGVzID0gMDsKICAgICBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzID0gMDsKLSAgICBtQ2FwdHVyZVRpbWVMYXBzZSA9IGZhbHNlOwotICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzID0gLTE7CisgICAgbUNhcHR1cmVGcHNFbmFibGUgPSBmYWxzZTsKKyAgICBtQ2FwdHVyZUZwcyA9IDAuMGY7CisgICAgbVRpbWVCZXR3ZWVuQ2FwdHVyZVVzID0gLTE7CiAgICAgbUNhbWVyYVNvdXJjZVRpbWVMYXBzZSA9IE5VTEw7CiAgICAgbUlzTWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycyA9IGZhbHNlOwogICAgIG1FbmNvZGVyUHJvZmlsZXMgPSBNZWRpYVByb2ZpbGVzOjpnZXRJbnN0YW5jZSgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKaW5kZXggNTRjMzhkMy4uZGEwMGJjNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCkBAIC0zNSwxMiArMzUsMTMgQEAKIGNsYXNzIE1ldGFEYXRhOwogc3RydWN0IEF1ZGlvU291cmNlOwogY2xhc3MgTWVkaWFQcm9maWxlczsKK2NsYXNzIElHcmFwaGljQnVmZmVyQ29uc3VtZXI7CiBjbGFzcyBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwogY2xhc3MgU3VyZmFjZU1lZGlhU291cmNlOwotY2xhc3MgQUxvb3BlcjsKK3N0cnVjdCBBTG9vcGVyOwogCiBzdHJ1Y3QgU3RhZ2VmcmlnaHRSZWNvcmRlciA6IHB1YmxpYyBNZWRpYVJlY29yZGVyQmFzZSB7Ci0gICAgU3RhZ2VmcmlnaHRSZWNvcmRlcigpOworICAgIFN0YWdlZnJpZ2h0UmVjb3JkZXIoY29uc3QgU3RyaW5nMTYgJm9wUGFja2FnZU5hbWUpOwogICAgIHZpcnR1YWwgflN0YWdlZnJpZ2h0UmVjb3JkZXIoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdCgpOwpAQCAtNTMsNyArNTQsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9GcmFtZVJhdGUoaW50IGZyYW1lc19wZXJfc2Vjb25kKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhLCBjb25zdCBzcDxJQ2FtZXJhUmVjb3JkaW5nUHJveHk+JiBwcm94eSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgc3VyZmFjZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIgKnBhdGgpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SW5wdXRTdXJmYWNlKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+JiBzdXJmYWNlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dEZpbGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TGlzdGVuZXIoY29uc3Qgc3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+JiBsaXN0ZW5lcik7CkBAIC03Myw2ICs3NCw3IEBACiAgICAgc3A8SUNhbWVyYT4gbUNhbWVyYTsKICAgICBzcDxJQ2FtZXJhUmVjb3JkaW5nUHJveHk+IG1DYW1lcmFQcm94eTsKICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJldmlld1N1cmZhY2U7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gbVBlcnNpc3RlbnRTdXJmYWNlOwogICAgIHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiBtTGlzdGVuZXI7CiAgICAgU3RyaW5nMTYgbUNsaWVudE5hbWU7CiAgICAgdWlkX3QgbUNsaWVudFVpZDsKQEAgLTEwOSwxMSArMTExLDExIEBACiAgICAgaW50MzJfdCBtU3RhcnRUaW1lT2Zmc2V0TXM7CiAgICAgaW50MzJfdCBtVG90YWxCaXRSYXRlOwogCi0gICAgYm9vbCBtQ2FwdHVyZVRpbWVMYXBzZTsKLSAgICBpbnQ2NF90IG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzOworICAgIGJvb2wgbUNhcHR1cmVGcHNFbmFibGU7CisgICAgZmxvYXQgbUNhcHR1cmVGcHM7CisgICAgaW50NjRfdCBtVGltZUJldHdlZW5DYXB0dXJlVXM7CiAgICAgc3A8Q2FtZXJhU291cmNlVGltZUxhcHNlPiBtQ2FtZXJhU291cmNlVGltZUxhcHNlOwogCi0KICAgICBTdHJpbmc4IG1QYXJhbXM7CiAKICAgICBib29sIG1Jc01ldGFEYXRhU3RvcmVkSW5WaWRlb0J1ZmZlcnM7CkBAIC0xMjcsNiArMTI5LDggQEAKICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwogICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CiAKKyAgICBzdGF0aWMgY29uc3QgaW50IGtNYXhIaWdoU3BlZWRGcHMgPSAxMDAwOworCiAgICAgc3RhdHVzX3QgcHJlcGFyZUludGVybmFsKCk7CiAgICAgc3RhdHVzX3Qgc2V0dXBNUEVHNG9yV0VCTVJlY29yZGluZygpOwogICAgIHZvaWQgc2V0dXBNUEVHNG9yV0VCTU1ldGFEYXRhKHNwPE1ldGFEYXRhPiAqbWV0YSk7CkBAIC0xMzYsOCArMTQwLDcgQEAKICAgICBzdGF0dXNfdCBzZXR1cFJUUFJlY29yZGluZygpOwogICAgIHN0YXR1c190IHNldHVwTVBFRzJUU1JlY29yZGluZygpOwogICAgIHNwPE1lZGlhU291cmNlPiBjcmVhdGVBdWRpb1NvdXJjZSgpOwotICAgIHN0YXR1c190IGNoZWNrVmlkZW9FbmNvZGVyQ2FwYWJpbGl0aWVzKAotICAgICAgICAgICAgYm9vbCAqc3VwcG9ydHNDYW1lcmFTb3VyY2VNZXRhRGF0YU1vZGUpOworICAgIHN0YXR1c190IGNoZWNrVmlkZW9FbmNvZGVyQ2FwYWJpbGl0aWVzKCk7CiAgICAgc3RhdHVzX3QgY2hlY2tBdWRpb0VuY29kZXJDYXBhYmlsaXRpZXMoKTsKICAgICAvLyBHZW5lcmljIE1lZGlhU291cmNlIHNldC11cC4gUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUKICAgICAvLyBzb3VyY2UgKENhbWVyYVNvdXJjZSBvciBTdXJmYWNlTWVkaWFTb3VyY2UpCkBAIC0xNTMsOCArMTU2LDggQEAKICAgICBzdGF0dXNfdCBzZXRQYXJhbUF1ZGlvTnVtYmVyT2ZDaGFubmVscyhpbnQzMl90IGNoYW5ubGVzKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbUF1ZGlvU2FtcGxpbmdSYXRlKGludDMyX3Qgc2FtcGxlUmF0ZSk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1BdWRpb1RpbWVTY2FsZShpbnQzMl90IHRpbWVTY2FsZSk7Ci0gICAgc3RhdHVzX3Qgc2V0UGFyYW1UaW1lTGFwc2VFbmFibGUoaW50MzJfdCB0aW1lTGFwc2VFbmFibGUpOwotICAgIHN0YXR1c190IHNldFBhcmFtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmUoaW50NjRfdCB0aW1lVXMpOworICAgIHN0YXR1c190IHNldFBhcmFtQ2FwdHVyZUZwc0VuYWJsZShpbnQzMl90IHRpbWVMYXBzZUVuYWJsZSk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1DYXB0dXJlRnBzKGZsb2F0IGZwcyk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1WaWRlb0VuY29kaW5nQml0UmF0ZShpbnQzMl90IGJpdFJhdGUpOwogICAgIHN0YXR1c190IHNldFBhcmFtVmlkZW9JRnJhbWVzSW50ZXJ2YWwoaW50MzJfdCBzZWNvbmRzKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbVZpZGVvRW5jb2RlclByb2ZpbGUoaW50MzJfdCBwcm9maWxlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLm1rIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQubWsKaW5kZXggNjYwOTg3NC4uY2QyMDgzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQubWsKQEAgLTE2LDYgKzE2LDcgQEAKICAgICAgICAgU3RyZWFtaW5nU291cmNlLmNwcCAgICAgICAgICAgICBcCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAorCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0ICAgICAgICAgICAgICAgICAgICAgXAogCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlICAgICAgICAgICAgXAogCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgICAgICAgICAgICAgXAogCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMgICAgICAgICAgICAgXApAQCAtMjQsNiArMjUsMTUgQEAKIAkkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UgICAgICAgICAgICAgIFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCisKKyMgZW5hYmxlIGV4cGVyaW1lbnRzIG9ubHkgaW4gdXNlcmRlYnVnIGFuZCBlbmcgYnVpbGRzCitpZm5lcSAoLCQoZmlsdGVyIHVzZXJkZWJ1ZyBlbmcsJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpKQorTE9DQUxfQ0ZMQUdTICs9IC1ERU5BQkxFX1NUQUdFRlJJR0hUX0VYUEVSSU1FTlRTCitlbmRpZgorCitMT0NBTF9DTEFORyA6PSB0cnVlCisKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X251cGxheWVyCiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IGVuZwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwCmluZGV4IDdjMzhlZGIuLjQ1ZGEyMTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAKQEAgLTU2LDcgKzU2LDcgQEAKICAgICAgIG1WaWRlb0xhc3REZXF1ZXVlVGltZVVzKDApLAogICAgICAgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbigwKSwKICAgICAgIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uKDApLAotICAgICAgbUR1cmF0aW9uVXMoMGxsKSwKKyAgICAgIG1EdXJhdGlvblVzKC0xbGwpLAogICAgICAgbUF1ZGlvSXNWb3JiaXMoZmFsc2UpLAogICAgICAgbUlzV2lkZXZpbmUoZmFsc2UpLAogICAgICAgbUlzU2VjdXJlKGZhbHNlKSwKQEAgLTY1LDEyICs2NSwxMiBAQAogICAgICAgbVVJRCh1aWQpLAogICAgICAgbUZkKC0xKSwKICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50KE5VTEwpLAotICAgICAgbU1ldGFEYXRhU2l6ZSgtMWxsKSwKICAgICAgIG1CaXRyYXRlKC0xbGwpLAogICAgICAgbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uKDApLAogICAgICAgbVBlbmRpbmdSZWFkQnVmZmVyVHlwZXMoMCksCiAgICAgICBtQnVmZmVyaW5nKGZhbHNlKSwKLSAgICAgIG1QcmVwYXJlQnVmZmVyaW5nKGZhbHNlKSB7CisgICAgICBtUHJlcGFyZUJ1ZmZlcmluZyhmYWxzZSksCisgICAgICBtUHJldkJ1ZmZlclBlcmNlbnRhZ2UoLTEpIHsKICAgICByZXNldERhdGFTb3VyY2UoKTsKICAgICBEYXRhU291cmNlOjpSZWdpc3RlckRlZmF1bHRTbmlmZmVycygpOwogfQpAQCAtMTI0LDYgKzEyNCwxMiBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4mIHNvdXJjZSkgeworICAgIHJlc2V0RGF0YVNvdXJjZSgpOworICAgIG1EYXRhU291cmNlID0gc291cmNlOworICAgIHJldHVybiBPSzsKK30KKwogc3A8TWV0YURhdGE+IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpnZXRGaWxlRm9ybWF0TWV0YSgpIGNvbnN0IHsKICAgICByZXR1cm4gbUZpbGVNZXRhOwogfQpAQCAtMTQ3LDE0ICsxNTMsMTEgQEAKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtSXNTdHJlYW1pbmcpIHsKLSAgICAgICAgaWYgKG1TbmlmZmVkTUlNRS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5zbmlmZigmbWltZVR5cGUsICZjb25maWRlbmNlLCAmZHVtbXkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU25pZmZlZE1JTUUgPSBtaW1lVHlwZS5zdHJpbmcoKTsKKyAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+c25pZmYoJm1pbWVUeXBlLCAmY29uZmlkZW5jZSwgJmR1bW15KSkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgIH0KICAgICAgICAgaXNXaWRldmluZVN0cmVhbWluZyA9ICFzdHJjYXNlY21wKAotICAgICAgICAgICAgICAgIG1TbmlmZmVkTUlNRS5jX3N0cigpLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfV1ZNKTsKKyAgICAgICAgICAgICAgICBtaW1lVHlwZS5zdHJpbmcoKSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dWTSk7CiAgICAgfQogCiAgICAgaWYgKGlzV2lkZXZpbmVTdHJlYW1pbmcpIHsKQEAgLTE2OSw3ICsxNzIsNyBAQAogICAgICAgICBleHRyYWN0b3IgPSBtV1ZNRXh0cmFjdG9yOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUobURhdGFTb3VyY2UsCi0gICAgICAgICAgICAgICAgbVNuaWZmZWRNSU1FLmVtcHR5KCkgPyBOVUxMOiBtU25pZmZlZE1JTUUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgbWltZVR5cGUuaXNFbXB0eSgpID8gTlVMTCA6IG1pbWVUeXBlLnN0cmluZygpKTsKICAgICB9CiAKICAgICBpZiAoZXh0cmFjdG9yID09IE5VTEwpIHsKQEAgLTMyMSw2ICszMjQsMTAgQEAKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKK2Jvb2wgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmlzU3RyZWFtaW5nKCkgY29uc3QgeworICAgIHJldHVybiBtSXNTdHJlYW1pbmc7Cit9CisKIE51UGxheWVyOjpHZW5lcmljU291cmNlOjp+R2VuZXJpY1NvdXJjZSgpIHsKICAgICBpZiAobUxvb3BlciAhPSBOVUxMKSB7CiAgICAgICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKGlkKCkpOwpAQCAtMzM4LDcgKzM0NSw3IEBACiAgICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKICAgICB9CiAKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UHJlcGFyZUFzeW5jLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UHJlcGFyZUFzeW5jLCB0aGlzKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KIApAQCAtMzUxLDYgKzM1OCw3IEBACiAKICAgICAgICAgaWYgKCFtVXJpLmVtcHR5KCkpIHsKICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVyaSA9IG1VcmkuY19zdHIoKTsKKyAgICAgICAgICAgIFN0cmluZzggY29udGVudFR5cGU7CiAgICAgICAgICAgICBtSXNXaWRldmluZSA9ICFzdHJuY2FzZWNtcCh1cmksICJ3aWRldmluZTovLyIsIDExKTsKIAogICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgiaHR0cDovLyIsIHVyaSwgNykKQEAgLTM2NSw3ICszNzMsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtRGF0YVNvdXJjZSA9IERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoCi0gICAgICAgICAgICAgICAgICAgbUhUVFBTZXJ2aWNlLCB1cmksICZtVXJpSGVhZGVycywgJm1Db250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICBtSFRUUFNlcnZpY2UsIHVyaSwgJm1VcmlIZWFkZXJzLCAmY29udGVudFR5cGUsCiAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4obUh0dHBTb3VyY2UuZ2V0KCkpKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1Jc1dpZGV2aW5lID0gZmFsc2U7CkBAIC0zNzksMzQgKzM4NywyMiBAQAogICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKFVOS05PV05fRVJST1IpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1EYXRhU291cmNlLT5mbGFncygpICYgRGF0YVNvdXJjZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpIHsKLSAgICAgICAgICAgIG1DYWNoZWRTb3VyY2UgPSBzdGF0aWNfY2FzdDxOdUNhY2hlZFNvdXJjZTIgKj4obURhdGFTb3VyY2UuZ2V0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRm9yIHdpZGV2aW5lIG9yIG90aGVyIGNhY2hlZCBzdHJlYW1pbmcgY2FzZXMsIHdlIG5lZWQgdG8gd2FpdCBmb3IKLSAgICAgICAgLy8gZW5vdWdoIGJ1ZmZlcmluZyBiZWZvcmUgcmVwb3J0aW5nIHByZXBhcmVkLgotICAgICAgICAvLyBOb3RlIHRoYXQgZXZlbiB3aGVuIFVSTCBkb2Vzbid0IHN0YXJ0IHdpdGggd2lkZXZpbmU6Ly8sIG1Jc1dpZGV2aW5lCi0gICAgICAgIC8vIGNvdWxkIHN0aWxsIGJlIHNldCB0byB0cnVlIGxhdGVyLCBpZiB0aGUgc3RyZWFtaW5nIG9yIGZpbGUgc291cmNlCi0gICAgICAgIC8vIGlzIHNuaWZmZWQgdG8gYmUgd2lkZXZpbmUuIFdlIGRvbid0IHdhbnQgdG8gYnVmZmVyIGZvciBmaWxlIHNvdXJjZQotICAgICAgICAvLyBpbiB0aGF0IGNhc2UsIHNvIG11c3QgY2hlY2sgdGhlIGZsYWcgbm93LgotICAgICAgICBtSXNTdHJlYW1pbmcgPSAobUlzV2lkZXZpbmUgfHwgbUNhY2hlZFNvdXJjZSAhPSBOVUxMKTsKICAgICB9CiAKLSAgICAvLyBjaGVjayBpbml0aWFsIGNhY2hpbmcgc3RhdHVzCi0gICAgc3RhdHVzX3QgZXJyID0gcHJlZmlsbENhY2hlSWZOZWNlc3NhcnkoKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIGlmIChlcnIgPT0gLUVBR0FJTikgewotICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFByZXBhcmVBc3luYywgaWQoKSkpLT5wb3N0KDIwMDAwMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHByZWZpbGwgZGF0YSBjYWNoZSEiKTsKLSAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChVTktOT1dOX0VSUk9SKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47CisgICAgaWYgKG1EYXRhU291cmNlLT5mbGFncygpICYgRGF0YVNvdXJjZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpIHsKKyAgICAgICAgbUNhY2hlZFNvdXJjZSA9IHN0YXRpY19jYXN0PE51Q2FjaGVkU291cmNlMiAqPihtRGF0YVNvdXJjZS5nZXQoKSk7CiAgICAgfQogCi0gICAgLy8gaW5pdCBleHRyYXRvciBmcm9tIGRhdGEgc291cmNlCi0gICAgZXJyID0gaW5pdEZyb21EYXRhU291cmNlKCk7CisgICAgLy8gRm9yIHdpZGV2aW5lIG9yIG90aGVyIGNhY2hlZCBzdHJlYW1pbmcgY2FzZXMsIHdlIG5lZWQgdG8gd2FpdCBmb3IKKyAgICAvLyBlbm91Z2ggYnVmZmVyaW5nIGJlZm9yZSByZXBvcnRpbmcgcHJlcGFyZWQuCisgICAgLy8gTm90ZSB0aGF0IGV2ZW4gd2hlbiBVUkwgZG9lc24ndCBzdGFydCB3aXRoIHdpZGV2aW5lOi8vLCBtSXNXaWRldmluZQorICAgIC8vIGNvdWxkIHN0aWxsIGJlIHNldCB0byB0cnVlIGxhdGVyLCBpZiB0aGUgc3RyZWFtaW5nIG9yIGZpbGUgc291cmNlCisgICAgLy8gaXMgc25pZmZlZCB0byBiZSB3aWRldmluZS4gV2UgZG9uJ3Qgd2FudCB0byBidWZmZXIgZm9yIGZpbGUgc291cmNlCisgICAgLy8gaW4gdGhhdCBjYXNlLCBzbyBtdXN0IGNoZWNrIHRoZSBmbGFnIG5vdy4KKyAgICBtSXNTdHJlYW1pbmcgPSAobUlzV2lkZXZpbmUgfHwgbUNhY2hlZFNvdXJjZSAhPSBOVUxMKTsKKworICAgIC8vIGluaXQgZXh0cmFjdG9yIGZyb20gZGF0YSBzb3VyY2UKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RnJvbURhdGFTb3VyY2UoKTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0IGZyb20gZGF0YSBzb3VyY2UhIik7CkBAIC00MzUsNyArNDMxLDcgQEAKIAogICAgIGlmIChtSXNTZWN1cmUpIHsKICAgICAgICAgLy8gc2VjdXJlIGRlY29kZXJzIG11c3QgYmUgaW5zdGFudGlhdGVkIGJlZm9yZSBzdGFydGluZyB3aWRldmluZSBzb3VyY2UKLSAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VjdXJlRGVjb2RlcnNJbnN0YW50aWF0ZWQsIGlkKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWN1cmVEZWNvZGVyc0luc3RhbnRpYXRlZCwgdGhpcyk7CiAgICAgICAgIG5vdGlmeUluc3RhbnRpYXRlU2VjdXJlRGVjb2RlcnMocmVwbHkpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGZpbmlzaFByZXBhcmVBc3luYygpOwpAQCAtNDcxLDkgKzQ2Nyw2IEBACiAKIHZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChzdGF0dXNfdCBlcnIpIHsKICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIG1NZXRhRGF0YVNpemUgPSAtMWxsOwotICAgICAgICBtQ29udGVudFR5cGUgPSAiIjsKLSAgICAgICAgbVNuaWZmZWRNSU1FID0gIiI7CiAgICAgICAgIHsKICAgICAgICAgICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBtRGF0YVNvdXJjZTsKICAgICAgICAgICAgIHNwPE51Q2FjaGVkU291cmNlMj4gY2FjaGVkU291cmNlID0gbUNhY2hlZFNvdXJjZTsKQEAgLTQ5NCw3NiArNDg3LDYgQEAKICAgICBub3RpZnlQcmVwYXJlZChlcnIpOwogfQogCi1zdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6cHJlZmlsbENhY2hlSWZOZWNlc3NhcnkoKSB7Ci0gICAgQ0hFQ0sobURhdGFTb3VyY2UgIT0gTlVMTCk7Ci0KLSAgICBpZiAobUNhY2hlZFNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIG5vIHByZWZpbGwgaWYgdGhlIGRhdGEgc291cmNlIGlzIG5vdCBjYWNoZWQKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIC8vIFdlJ3JlIG5vdCBkb2luZyB0aGlzIGZvciBzdHJlYW1zIHRoYXQgYXBwZWFyIHRvIGJlIGF1ZGlvLW9ubHkKLSAgICAvLyBzdHJlYW1zIHRvIGVuc3VyZSB0aGF0IGV2ZW4gbG93IGJhbmR3aWR0aCBzdHJlYW1zIHN0YXJ0Ci0gICAgLy8gcGxheWluZyBiYWNrIGZhaXJseSBpbnN0YW50bHkuCi0gICAgaWYgKCFzdHJuY2FzZWNtcChtQ29udGVudFR5cGUuc3RyaW5nKCksICJhdWRpby8iLCA2KSkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgLy8gV2UncmUgZ29pbmcgdG8gcHJlZmlsbCB0aGUgY2FjaGUgYmVmb3JlIHRyeWluZyB0byBpbnN0YW50aWF0ZQotICAgIC8vIHRoZSBleHRyYWN0b3IgYmVsb3csIGFzIHRoZSBsYXR0ZXIgaXMgYW4gb3BlcmF0aW9uIHRoYXQgb3RoZXJ3aXNlCi0gICAgLy8gY291bGQgYmxvY2sgb24gdGhlIGRhdGFzb3VyY2UgZm9yIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mIHRpbWUuCi0gICAgLy8gRHVyaW5nIHRoYXQgdGltZSB3ZSdkIGJlIHVuYWJsZSB0byBhYm9ydCB0aGUgcHJlcGFyYXRpb24gcGhhc2UKLSAgICAvLyB3aXRob3V0IHRoaXMgcHJlZmlsbC4KLQotICAgIC8vIEluaXRpYWxseSBtYWtlIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCAxOTIgS0IgZm9yIHRoZSBzbmlmZgotICAgIC8vIHRvIGNvbXBsZXRlIHdpdGhvdXQgYmxvY2tpbmcuCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWluQnl0ZXNGb3JTbmlmZmluZyA9IDE5MiAqIDEwMjQ7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrRGVmYXVsdE1ldGFTaXplID0gMjAwMDAwOwotCi0gICAgc3RhdHVzX3QgZmluYWxTdGF0dXM7Ci0KLSAgICBzaXplX3QgY2FjaGVkRGF0YVJlbWFpbmluZyA9Ci0gICAgICAgICAgICBtQ2FjaGVkU291cmNlLT5hcHByb3hEYXRhUmVtYWluaW5nKCZmaW5hbFN0YXR1cyk7Ci0KLSAgICBpZiAoZmluYWxTdGF0dXMgIT0gT0sgfHwgKG1NZXRhRGF0YVNpemUgPj0gMAotICAgICAgICAgICAgJiYgKG9mZjY0X3QpY2FjaGVkRGF0YVJlbWFpbmluZyA+PSBtTWV0YURhdGFTaXplKSkgewotICAgICAgICBBTE9HVigic3RvcCBjYWNoaW5nLCBzdGF0dXMgJWQsICIKLSAgICAgICAgICAgICAgICAibWV0YURhdGFTaXplICVsbGQsIGNhY2hlZERhdGFSZW1haW5pbmcgJXp1IiwKLSAgICAgICAgICAgICAgICBmaW5hbFN0YXR1cywgbU1ldGFEYXRhU2l6ZSwgY2FjaGVkRGF0YVJlbWFpbmluZyk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBBTE9HVigibm93IGNhY2hlZCAlenUgYnl0ZXMgb2YgZGF0YSIsIGNhY2hlZERhdGFSZW1haW5pbmcpOwotCi0gICAgaWYgKG1NZXRhRGF0YVNpemUgPCAwCi0gICAgICAgICAgICAmJiBjYWNoZWREYXRhUmVtYWluaW5nID49IGtNaW5CeXRlc0ZvclNuaWZmaW5nKSB7Ci0gICAgICAgIFN0cmluZzggdG1wOwotICAgICAgICBmbG9hdCBjb25maWRlbmNlOwotICAgICAgICBzcDxBTWVzc2FnZT4gbWV0YTsKLSAgICAgICAgaWYgKCFtQ2FjaGVkU291cmNlLT5zbmlmZigmdG1wLCAmY29uZmlkZW5jZSwgJm1ldGEpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIHN1Y2Nlc3NmdWxseSBpZGVudGlmaWVkIHRoZSBmaWxlJ3MgZXh0cmFjdG9yIHRvCi0gICAgICAgIC8vIGJlLCByZW1lbWJlciB0aGlzIG1pbWUgdHlwZSBzbyB3ZSBkb24ndCBoYXZlIHRvCi0gICAgICAgIC8vIHNuaWZmIGl0IGFnYWluIHdoZW4gd2UgY2FsbCBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKCkKLSAgICAgICAgbVNuaWZmZWRNSU1FID0gdG1wLnN0cmluZygpOwotCi0gICAgICAgIGlmIChtZXRhID09IE5VTEwKLSAgICAgICAgICAgICAgICB8fCAhbWV0YS0+ZmluZEludDY0KCJtZXRhLWRhdGEtc2l6ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGludDY0X3QqPigmbU1ldGFEYXRhU2l6ZSkpKSB7Ci0gICAgICAgICAgICBtTWV0YURhdGFTaXplID0ga0RlZmF1bHRNZXRhU2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTWV0YURhdGFTaXplIDwgMGxsKSB7Ci0gICAgICAgICAgICBBTE9HRSgiaW52YWxpZCBtZXRhRGF0YVNpemUgPSAlbGxkIGJ5dGVzIiwgbU1ldGFEYXRhU2l6ZSk7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAtRUFHQUlOOwotfQotCiB2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpzdGFydCgpIHsKICAgICBBTE9HSSgic3RhcnQiKTsKIApAQCAtNTc5LDcgKzUwMiw3IEBACiAgICAgc2V0RHJtUGxheWJhY2tTdGF0dXNJZk5lZWRlZChQbGF5YmFjazo6U1RBUlQsIGdldExhc3RSZWFkUG9zaXRpb24oKSAvIDEwMDApOwogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgaWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCB0aGlzKSktPnBvc3QoKTsKIH0KIAogdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c3RvcCgpIHsKQEAgLTU4OCw3ICs1MTEsNyBAQAogICAgIG1TdGFydGVkID0gZmFsc2U7CiAgICAgaWYgKG1Jc1dpZGV2aW5lIHx8IG1Jc1NlY3VyZSkgewogICAgICAgICAvLyBGb3Igd2lkZXZpbmUgb3Igc2VjdXJlIHNvdXJjZXMgd2UgbmVlZCB0byBwcmV2ZW50IGFueSBmdXJ0aGVyIHJlYWRzLgotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RvcFdpZGV2aW5lLCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0b3BXaWRldmluZSwgdGhpcyk7CiAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKICAgICAgICAgKHZvaWQpIG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKICAgICB9CkBAIC02MDUsNyArNTI4LDcgQEAKICAgICBzZXREcm1QbGF5YmFja1N0YXR1c0lmTmVlZGVkKFBsYXliYWNrOjpTVEFSVCwgZ2V0TGFzdFJlYWRQb3NpdGlvbigpIC8gMTAwMCk7CiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogCi0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlc3VtZSwgaWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlc3VtZSwgdGhpcykpLT5wb3N0KCk7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmRpc2Nvbm5lY3QoKSB7CkBAIC02MzksNyArNTYyLDcgQEAKIH0KIAogdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2NoZWR1bGVQb2xsQnVmZmVyaW5nKCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQb2xsQnVmZmVyaW5nLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UG9sbEJ1ZmZlcmluZywgdGhpcyk7CiAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbik7CiAgICAgbXNnLT5wb3N0KDEwMDAwMDBsbCk7CiB9CkBAIC02NDcsNiArNTcwLDcgQEAKIHZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmNhbmNlbFBvbGxCdWZmZXJpbmcoKSB7CiAgICAgbUJ1ZmZlcmluZyA9IGZhbHNlOwogICAgICsrbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uOworICAgIG1QcmV2QnVmZmVyUGVyY2VudGFnZSA9IC0xOwogfQogCiB2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpyZXN0YXJ0UG9sbEJ1ZmZlcmluZygpIHsKQEAgLTY1Niw3ICs1ODAsMTkgQEAKICAgICB9CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZShpbnQgcGVyY2VudGFnZSkgewordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6bm90aWZ5QnVmZmVyaW5nVXBkYXRlKGludDMyX3QgcGVyY2VudGFnZSkgeworICAgIC8vIEJ1ZmZlcmluZyBwZXJjZW50IGNvdWxkIGdvIGJhY2t3YXJkIGFzIGl0J3MgZXN0aW1hdGVkIGZyb20gcmVtYWluaW5nCisgICAgLy8gZGF0YSBhbmQgbGFzdCBhY2Nlc3MgdGltZS4gVGhpcyBjb3VsZCBjYXVzZSB0aGUgYnVmZmVyaW5nIHBvc2l0aW9uCisgICAgLy8gZHJhd24gb24gbWVkaWEgY29udHJvbCB0byBqaXR0ZXIgc2xpZ2h0bHkuIFJlbWVtYmVyIHByZXZpb3VzbHkgcmVwb3J0ZWQKKyAgICAvLyBwZXJjZW50YWdlIGFuZCBkb24ndCBhbGxvdyBpdCB0byBnbyBiYWNrd2FyZC4KKyAgICBpZiAocGVyY2VudGFnZSA8IG1QcmV2QnVmZmVyUGVyY2VudGFnZSkgeworICAgICAgICBwZXJjZW50YWdlID0gbVByZXZCdWZmZXJQZXJjZW50YWdlOworICAgIH0gZWxzZSBpZiAocGVyY2VudGFnZSA+IDEwMCkgeworICAgICAgICBwZXJjZW50YWdlID0gMTAwOworICAgIH0KKworICAgIG1QcmV2QnVmZmVyUGVyY2VudGFnZSA9IHBlcmNlbnRhZ2U7CisKICAgICBBTE9HVigibm90aWZ5QnVmZmVyaW5nVXBkYXRlOiBidWZmZXJpbmcgJWQlJSIsIHBlcmNlbnRhZ2UpOwogCiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IGR1cE5vdGlmeSgpOwpAQCAtNzg4LDcgKzcyNCw3IEBACiAgICAgICAgICAgICBzdG9wQnVmZmVyaW5nSWZOZWNlc3NhcnkoKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoY2FjaGVkRGF0YVJlbWFpbmluZyA+PSAwKSB7Ci0gICAgICAgIEFMT0dWKCJvblBvbGxCdWZmZXJpbmc6IGNhY2hlZERhdGFSZW1haW5pbmcgJWQgYnl0ZXMiLAorICAgICAgICBBTE9HVigib25Qb2xsQnVmZmVyaW5nOiBjYWNoZWREYXRhUmVtYWluaW5nICV6ZCBieXRlcyIsCiAgICAgICAgICAgICAgICAgY2FjaGVkRGF0YVJlbWFpbmluZyk7CiAKICAgICAgICAgaWYgKGNhY2hlZERhdGFSZW1haW5pbmcgPCBrTG93V2F0ZXJNYXJrQnl0ZXMpIHsKQEAgLTg3NSw3ICs4MTEsNyBAQAogICAgICAgICAgIH0KICAgICAgICAgICByZWFkQnVmZmVyKHRyYWNrVHlwZSwgdGltZVVzLCAmYWN0dWFsVGltZVVzLCBmb3JtYXRDaGFuZ2UpOwogICAgICAgICAgIHJlYWRCdWZmZXIoY291bnRlcnBhcnRUeXBlLCAtMSwgTlVMTCwgZm9ybWF0Q2hhbmdlKTsKLSAgICAgICAgICBBTE9HVigidGltZVVzICVsbGQgYWN0dWFsVGltZVVzICVsbGQiLCB0aW1lVXMsIGFjdHVhbFRpbWVVcyk7CisgICAgICAgICAgQUxPR1YoInRpbWVVcyAlbGxkIGFjdHVhbFRpbWVVcyAlbGxkIiwgKGxvbmcgbG9uZyl0aW1lVXMsIChsb25nIGxvbmcpYWN0dWFsVGltZVVzKTsKIAogICAgICAgICAgIGJyZWFrOwogICAgICAgfQpAQCAtOTQ0LDcgKzg4MCw3IEBACiAgICAgICAgICAgICAgIG1WaWRlb1RyYWNrLm1QYWNrZXRzLT5jbGVhcigpOwogICAgICAgICAgIH0KICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKICAgICAgICAgICBicmVhazsKQEAgLTk4NCw3ICs5MjAsNyBAQAogICAgICAgICBjb25zdCBpbnQ2NF90IG9uZVNlY1VzID0gMTAwMDAwMGxsOwogICAgICAgICBkZWxheVVzIC09IG9uZVNlY1VzOwogICAgIH0KLSAgICBzcDxBTWVzc2FnZT4gbXNnMiA9IG5ldyBBTWVzc2FnZShzZW5kV2hhdCwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZzIgPSBuZXcgQU1lc3NhZ2Uoc2VuZFdoYXQsIHRoaXMpOwogICAgIG1zZzItPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbXNnR2VuZXJhdGlvbik7CiAgICAgbXNnMi0+cG9zdChkZWxheVVzIDwgMCA/IDAgOiBkZWxheVVzKTsKIH0KQEAgLTEwMjQsNyArOTYwLDcgQEAKIH0KIAogc3A8TWV0YURhdGE+IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpnZXRGb3JtYXRNZXRhKGJvb2wgYXVkaW8pIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0Rm9ybWF0LCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0Rm9ybWF0LCB0aGlzKTsKICAgICBtc2ctPnNldEludDMyKCJhdWRpbyIsIGF1ZGlvKTsKIAogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKQEAgLTEwNDYsNyArOTgyLDcgQEAKICAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gZG9HZXRGb3JtYXRNZXRhKGF1ZGlvKTsKICAgICByZXNwb25zZS0+c2V0UG9pbnRlcigiZm9ybWF0IiwgZm9ybWF0LmdldCgpKTsKIAotICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CiAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CiB9CkBAIC0xMDg2LDcgKzEwMjIsOSBAQAogCiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gdHJhY2stPm1QYWNrZXRzLT5kZXF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKIAotICAgIGlmICghdHJhY2stPm1QYWNrZXRzLT5oYXNCdWZmZXJBdmFpbGFibGUoJmZpbmFsUmVzdWx0KSkgeworICAgIC8vIHN0YXJ0IHB1bGxpbmcgaW4gbW9yZSBidWZmZXJzIGlmIHdlIG9ubHkgaGF2ZSBvbmUgKG9yIG5vKSBidWZmZXIgbGVmdAorICAgIC8vIHNvIHRoYXQgZGVjb2RlciBoYXMgbGVzcyBjaGFuY2Ugb2YgYmVpbmcgc3RhcnZlZAorICAgIGlmICh0cmFjay0+bVBhY2tldHMtPmdldEF2YWlsYWJsZUJ1ZmZlckNvdW50KCZmaW5hbFJlc3VsdCkgPCAyKSB7CiAgICAgICAgIHBvc3RSZWFkQnVmZmVyKGF1ZGlvPyBNRURJQV9UUkFDS19UWVBFX0FVRElPIDogTUVESUFfVFJBQ0tfVFlQRV9WSURFTyk7CiAgICAgfQogCkBAIC0xMTEzLDcgKzEwNTEsNyBAQAogCiAgICAgaWYgKG1TdWJ0aXRsZVRyYWNrLm1Tb3VyY2UgIT0gTlVMTAogICAgICAgICAgICAgJiYgIW1TdWJ0aXRsZVRyYWNrLm1QYWNrZXRzLT5oYXNCdWZmZXJBdmFpbGFibGUoJmVvc1Jlc3VsdCkpIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEZldGNoU3VidGl0bGVEYXRhLCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEZldGNoU3VidGl0bGVEYXRhLCB0aGlzKTsKICAgICAgICAgbXNnLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKICAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24pOwogICAgICAgICBtc2ctPnBvc3QoKTsKQEAgLTExMjEsNyArMTA1OSw3IEBACiAKICAgICBpZiAobVRpbWVkVGV4dFRyYWNrLm1Tb3VyY2UgIT0gTlVMTAogICAgICAgICAgICAgJiYgIW1UaW1lZFRleHRUcmFjay5tUGFja2V0cy0+aGFzQnVmZmVyQXZhaWxhYmxlKCZlb3NSZXN1bHQpKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRGZXRjaFRpbWVkVGV4dERhdGEsIGlkKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hUaW1lZFRleHREYXRhLCB0aGlzKTsKICAgICAgICAgbXNnLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKICAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uKTsKICAgICAgICAgbXNnLT5wb3N0KCk7CkBAIC0xMTUwLDYgKzEwODgsNyBAQAogCiAgICAgY29uc3QgY2hhciAqbWltZTsKICAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBtaW1lKTsKIAogICAgIGludDMyX3QgdHJhY2tUeXBlOwogICAgIGlmICghc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpKSB7CkBAIC0xMTcwLDggKzExMDksNiBAQAogICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJsYW5ndWFnZSIsIGxhbmcpOwogCiAgICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKSB7Ci0gICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgbWltZSk7Ci0KICAgICAgICAgaW50MzJfdCBpc0F1dG9zZWxlY3QgPSAxLCBpc0RlZmF1bHQgPSAwLCBpc0ZvcmNlZCA9IDA7CiAgICAgICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5VHJhY2tJc0F1dG9zZWxlY3QsICZpc0F1dG9zZWxlY3QpOwogICAgICAgICBtZXRhLT5maW5kSW50MzIoa0tleVRyYWNrSXNEZWZhdWx0LCAmaXNEZWZhdWx0KTsKQEAgLTExODYsNyArMTEyMyw3IEBACiB9CiAKIHNzaXplX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmdldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdCB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldFNlbGVjdGVkVHJhY2ssIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRTZWxlY3RlZFRyYWNrLCB0aGlzKTsKICAgICBtc2ctPnNldEludDMyKCJ0eXBlIiwgdHlwZSk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CkBAIC0xMjA5LDcgKzExNDYsNyBAQAogICAgIHNzaXplX3QgaW5kZXggPSBkb0dldFNlbGVjdGVkVHJhY2sodHlwZSk7CiAgICAgcmVzcG9uc2UtPnNldEludDMyKCJpbmRleCIsIGluZGV4KTsKIAotICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CiAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CiB9CkBAIC0xMjQyLDcgKzExNzksNyBAQAogCiBzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0LCBpbnQ2NF90IHRpbWVVcykgewogICAgIEFMT0dWKCIlcyB0cmFjazogJXp1Iiwgc2VsZWN0ID8gInNlbGVjdCIgOiAiZGVzZWxlY3QiLCB0cmFja0luZGV4KTsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VsZWN0VHJhY2ssIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWxlY3RUcmFjaywgdGhpcyk7CiAgICAgbXNnLT5zZXRJbnQzMigidHJhY2tJbmRleCIsIHRyYWNrSW5kZXgpOwogICAgIG1zZy0+c2V0SW50MzIoInNlbGVjdCIsIHNlbGVjdCk7CiAgICAgbXNnLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKQEAgLTEyNjcsNyArMTIwNCw3IEBACiAgICAgc3RhdHVzX3QgZXJyID0gZG9TZWxlY3RUcmFjayh0cmFja0luZGV4LCBzZWxlY3QsIHRpbWVVcyk7CiAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwogCi0gICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKIH0KQEAgLTEzMjgsNyArMTI2NSw3IEBACiAgICAgICAgIHN0YXR1c190IGVvc1Jlc3VsdDsgLy8gaWdub3JlZAogICAgICAgICBpZiAobVN1YnRpdGxlVHJhY2subVNvdXJjZSAhPSBOVUxMCiAgICAgICAgICAgICAgICAgJiYgIW1TdWJ0aXRsZVRyYWNrLm1QYWNrZXRzLT5oYXNCdWZmZXJBdmFpbGFibGUoJmVvc1Jlc3VsdCkpIHsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRGZXRjaFN1YnRpdGxlRGF0YSwgaWQoKSk7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGEsIHRoaXMpOwogICAgICAgICAgICAgbXNnLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uKTsKICAgICAgICAgICAgIG1zZy0+cG9zdCgpOwpAQCAtMTMzNiw3ICsxMjczLDcgQEAKIAogICAgICAgICBpZiAobVRpbWVkVGV4dFRyYWNrLm1Tb3VyY2UgIT0gTlVMTAogICAgICAgICAgICAgICAgICYmICFtVGltZWRUZXh0VHJhY2subVBhY2tldHMtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZW9zUmVzdWx0KSkgewotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEZldGNoVGltZWRUZXh0RGF0YSwgaWQoKSk7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hUaW1lZFRleHREYXRhLCB0aGlzKTsKICAgICAgICAgICAgIG1zZy0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CiAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24pOwogICAgICAgICAgICAgbXNnLT5wb3N0KCk7CkBAIC0xMzUwLDcgKzEyODcsNyBAQAogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENoYW5nZUFWU291cmNlLCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENoYW5nZUFWU291cmNlLCB0aGlzKTsKICAgICAgICAgbXNnLT5zZXRJbnQzMigidHJhY2tJbmRleCIsIHRyYWNrSW5kZXgpOwogICAgICAgICBtc2ctPnBvc3QoKTsKICAgICAgICAgcmV0dXJuIE9LOwpAQCAtMTM2MCw3ICsxMjk3LDcgQEAKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnNlZWtUbyhpbnQ2NF90IHNlZWtUaW1lVXMpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VlaywgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlZWssIHRoaXMpOwogICAgIG1zZy0+c2V0SW50NjQoInNlZWtUaW1lVXMiLCBzZWVrVGltZVVzKTsKIAogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKQEAgLTEzODAsNyArMTMxNyw3IEBACiAgICAgc3RhdHVzX3QgZXJyID0gZG9TZWVrKHNlZWtUaW1lVXMpOwogICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKIAotICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CiAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CiB9CkBAIC0xNDg1LDYgKzE0MjIsMTQgQEAKICAgICAgICAgbWV0YS0+c2V0SW50MzIoInRyYWNrSW5kZXgiLCBtU3VidGl0bGVUcmFjay5tSW5kZXgpOwogICAgIH0KIAorICAgIHVpbnQzMl90IGRhdGFUeXBlOyAvLyB1bnVzZWQKKyAgICBjb25zdCB2b2lkICpzZWlEYXRhOworICAgIHNpemVfdCBzZWlMZW5ndGg7CisgICAgaWYgKG1iLT5tZXRhX2RhdGEoKS0+ZmluZERhdGEoa0tleVNFSSwgJmRhdGFUeXBlLCAmc2VpRGF0YSwgJnNlaUxlbmd0aCkpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gc2VpID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KHNlaURhdGEsIHNlaUxlbmd0aCk7OworICAgICAgICBtZXRhLT5zZXRCdWZmZXIoInNlaSIsIHNlaSk7CisgICAgfQorCiAgICAgaWYgKGFjdHVhbFRpbWVVcykgewogICAgICAgICAqYWN0dWFsVGltZVVzID0gdGltZVVzOwogICAgIH0KQEAgLTE1MDAsNyArMTQ0NSw3IEBACiAKICAgICBpZiAoKG1QZW5kaW5nUmVhZEJ1ZmZlclR5cGVzICYgKDEgPDwgdHJhY2tUeXBlKSkgPT0gMCkgewogICAgICAgICBtUGVuZGluZ1JlYWRCdWZmZXJUeXBlcyB8PSAoMSA8PCB0cmFja1R5cGUpOwotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVhZEJ1ZmZlciwgaWQoKSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWFkQnVmZmVyLCB0aGlzKTsKICAgICAgICAgbXNnLT5zZXRJbnQzMigidHJhY2tUeXBlIiwgdHJhY2tUeXBlKTsKICAgICAgICAgbXNnLT5wb3N0KCk7CiAgICAgfQpAQCAtMTUzMiw2ICsxNDc3LDggQEAKICAgICAgICAgICAgIHRyYWNrID0gJm1WaWRlb1RyYWNrOwogICAgICAgICAgICAgaWYgKG1Jc1dpZGV2aW5lKSB7CiAgICAgICAgICAgICAgICAgbWF4QnVmZmVycyA9IDI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1heEJ1ZmZlcnMgPSA0OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9BVURJTzoKQEAgLTE1ODgsMTcgKzE1MzUsNyBAQAogICAgICAgICAgICAgICAgIG1WaWRlb1RpbWVVcyA9IHRpbWVVczsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gZm9ybWF0Q2hhbmdlICYmIHNlZWtpbmc6IHRyYWNrIHdob3NlIHNvdXJjZSBpcyBjaGFuZ2VkIGR1cmluZyBzZWxlY3Rpb24KLSAgICAgICAgICAgIC8vIGZvcm1hdENoYW5nZSAmJiAhc2Vla2luZzogdHJhY2sgd2hvc2Ugc291cmNlIGlzIG5vdCBjaGFuZ2VkIGR1cmluZyBzZWxlY3Rpb24KLSAgICAgICAgICAgIC8vICFmb3JtYXRDaGFuZ2U6IG5vcm1hbCBzZWVrCi0gICAgICAgICAgICBpZiAoKHNlZWtpbmcgfHwgZm9ybWF0Q2hhbmdlKQotICAgICAgICAgICAgICAgICAgICAmJiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfQVVESU8KLSAgICAgICAgICAgICAgICAgICAgfHwgdHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfVklERU8pKSB7Ci0gICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpEaXNjb250aW51aXR5VHlwZSB0eXBlID0gKGZvcm1hdENoYW5nZSAmJiBzZWVraW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgPyBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfRk9STUFUQ0hBTkdFCi0gICAgICAgICAgICAgICAgICAgICAgICA6IEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9OT05FOwotICAgICAgICAgICAgICAgIHRyYWNrLT5tUGFja2V0cy0+cXVldWVEaXNjb250aW51aXR5KCB0eXBlLCBOVUxMLCB0cnVlIC8qIGRpc2NhcmQgKi8pOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgcXVldWVEaXNjb250aW51aXR5SWZOZWVkZWQoc2Vla2luZywgZm9ybWF0Q2hhbmdlLCB0cmFja1R5cGUsIHRyYWNrKTsKIAogICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbWVkaWFCdWZmZXJUb0FCdWZmZXIoCiAgICAgICAgICAgICAgICAgICAgIG1idWYsIHRyYWNrVHlwZSwgc2Vla1RpbWVVcywgYWN0dWFsVGltZVVzKTsKQEAgLTE2MTYsMTAgKzE1NTMsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogZGlzY2FyZCAqLyk7CiAjZW5kaWYKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHF1ZXVlRGlzY29udGludWl0eUlmTmVlZGVkKHNlZWtpbmcsIGZvcm1hdENoYW5nZSwgdHJhY2tUeXBlLCB0cmFjayk7CiAgICAgICAgICAgICB0cmFjay0+bVBhY2tldHMtPnNpZ25hbEVPUyhlcnIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnF1ZXVlRGlzY29udGludWl0eUlmTmVlZGVkKAorICAgICAgICBib29sIHNlZWtpbmcsIGJvb2wgZm9ybWF0Q2hhbmdlLCBtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSwgVHJhY2sgKnRyYWNrKSB7CisgICAgLy8gZm9ybWF0Q2hhbmdlICYmIHNlZWtpbmc6IHRyYWNrIHdob3NlIHNvdXJjZSBpcyBjaGFuZ2VkIGR1cmluZyBzZWxlY3Rpb24KKyAgICAvLyBmb3JtYXRDaGFuZ2UgJiYgIXNlZWtpbmc6IHRyYWNrIHdob3NlIHNvdXJjZSBpcyBub3QgY2hhbmdlZCBkdXJpbmcgc2VsZWN0aW9uCisgICAgLy8gIWZvcm1hdENoYW5nZTogbm9ybWFsIHNlZWsKKyAgICBpZiAoKHNlZWtpbmcgfHwgZm9ybWF0Q2hhbmdlKQorICAgICAgICAgICAgJiYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX0FVRElPCisgICAgICAgICAgICB8fCB0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9WSURFTykpIHsKKyAgICAgICAgQVRTUGFyc2VyOjpEaXNjb250aW51aXR5VHlwZSB0eXBlID0gKGZvcm1hdENoYW5nZSAmJiBzZWVraW5nKQorICAgICAgICAgICAgICAgID8gQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0ZPUk1BVENIQU5HRQorICAgICAgICAgICAgICAgIDogQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX05PTkU7CisgICAgICAgIHRyYWNrLT5tUGFja2V0cy0+cXVldWVEaXNjb250aW51aXR5KHR5cGUsIE5VTEwgLyogZXh0cmEgKi8sIHRydWUgLyogZGlzY2FyZCAqLyk7CisgICAgfQorfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmgKaW5kZXggNTUyNzQ0OC4uYWM5ODBlZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5oCkBAIC0zMSwxMiArMzEsMTMgQEAKIGNsYXNzIERybU1hbmFnZXJDbGllbnQ7CiBzdHJ1Y3QgQW5vdGhlclBhY2tldFNvdXJjZTsKIHN0cnVjdCBBUlRTUENvbnRyb2xsZXI7Ci1zdHJ1Y3QgRGF0YVNvdXJjZTsKK2NsYXNzIERhdGFTb3VyY2U7CitjbGFzcyBJRGF0YVNvdXJjZTsKIHN0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKIGNsYXNzIE1lZGlhQnVmZmVyOwogc3RydWN0IE51Q2FjaGVkU291cmNlMjsKLXN0cnVjdCBXVk1FeHRyYWN0b3I7CitjbGFzcyBXVk1FeHRyYWN0b3I7CiAKIHN0cnVjdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZSA6IHB1YmxpYyBOdVBsYXllcjo6U291cmNlIHsKICAgICBHZW5lcmljU291cmNlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBib29sIHVpZFZhbGlkLCB1aWRfdCB1aWQpOwpAQCAtNDgsNiArNDksOCBAQAogCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAKKyAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+JiBkYXRhU291cmNlKTsKKwogICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoKTsKIAogICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpOwpAQCAtNzIsNiArNzUsOCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJzKGJvb2wgYXVkaW8sIFZlY3RvcjxNZWRpYUJ1ZmZlciAqPiAmYnVmZmVycyk7CiAKKyAgICB2aXJ0dWFsIGJvb2wgaXNTdHJlYW1pbmcoKSBjb25zdDsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkdlbmVyaWNTb3VyY2UoKTsKIApAQCAtMTQwLDE0ICsxNDUsMTMgQEAKICAgICBzcDxEZWNyeXB0SGFuZGxlPiBtRGVjcnlwdEhhbmRsZTsKICAgICBib29sIG1TdGFydGVkOwogICAgIGJvb2wgbVN0b3BSZWFkOwotICAgIFN0cmluZzggbUNvbnRlbnRUeXBlOwotICAgIEFTdHJpbmcgbVNuaWZmZWRNSU1FOwotICAgIG9mZjY0X3QgbU1ldGFEYXRhU2l6ZTsKICAgICBpbnQ2NF90IG1CaXRyYXRlOwogICAgIGludDMyX3QgbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uOwogICAgIHVpbnQzMl90IG1QZW5kaW5nUmVhZEJ1ZmZlclR5cGVzOwogICAgIGJvb2wgbUJ1ZmZlcmluZzsKICAgICBib29sIG1QcmVwYXJlQnVmZmVyaW5nOworICAgIGludDMyX3QgbVByZXZCdWZmZXJQZXJjZW50YWdlOworCiAgICAgbXV0YWJsZSBNdXRleCBtUmVhZEJ1ZmZlckxvY2s7CiAgICAgbXV0YWJsZSBNdXRleCBtRGlzY29ubmVjdExvY2s7CiAKQEAgLTE2MCw4ICsxNjQsNiBAQAogICAgIGludDY0X3QgZ2V0TGFzdFJlYWRQb3NpdGlvbigpOwogICAgIHZvaWQgc2V0RHJtUGxheWJhY2tTdGF0dXNJZk5lZWRlZChpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOwogCi0gICAgc3RhdHVzX3QgcHJlZmlsbENhY2hlSWZOZWNlc3NhcnkoKTsKLQogICAgIHZvaWQgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKHN0YXR1c190IGVycik7CiAgICAgdm9pZCBvblNlY3VyZURlY29kZXJzSW5zdGFudGlhdGVkKHN0YXR1c190IGVycik7CiAgICAgdm9pZCBmaW5pc2hQcmVwYXJlQXN5bmMoKTsKQEAgLTIwMSwxMSArMjAzLDE0IEBACiAgICAgICAgICAgICBtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSwKICAgICAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVcyA9IC0xbGwsIGludDY0X3QgKmFjdHVhbFRpbWVVcyA9IE5VTEwsIGJvb2wgZm9ybWF0Q2hhbmdlID0gZmFsc2UpOwogCisgICAgdm9pZCBxdWV1ZURpc2NvbnRpbnVpdHlJZk5lZWRlZCgKKyAgICAgICAgICAgIGJvb2wgc2Vla2luZywgYm9vbCBmb3JtYXRDaGFuZ2UsIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlLCBUcmFjayAqdHJhY2spOworCiAgICAgdm9pZCBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKICAgICB2b2lkIGNhbmNlbFBvbGxCdWZmZXJpbmcoKTsKICAgICB2b2lkIHJlc3RhcnRQb2xsQnVmZmVyaW5nKCk7CiAgICAgdm9pZCBvblBvbGxCdWZmZXJpbmcoKTsKLSAgICB2b2lkIG5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZShpbnQgcGVyY2VudGFnZSk7CisgICAgdm9pZCBub3RpZnlCdWZmZXJpbmdVcGRhdGUoaW50MzJfdCBwZXJjZW50YWdlKTsKICAgICB2b2lkIHN0YXJ0QnVmZmVyaW5nSWZOZWNlc3NhcnkoKTsKICAgICB2b2lkIHN0b3BCdWZmZXJpbmdJZk5lY2Vzc2FyeSgpOwogICAgIHZvaWQgc2VuZENhY2hlU3RhdHMoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuY3BwCmluZGV4IGEyNmVmOWUuLjEyNjYyNWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmNwcApAQCAtMjIsNyArMjIsNiBAQAogCiAjaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgogI2luY2x1ZGUgIkxpdmVEYXRhU291cmNlLmgiCi0jaW5jbHVkZSAiTGl2ZVNlc3Npb24uaCIKIAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CkBAIC0zMCw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00NCw3ICs0NCwxMCBAQAogICAgICAgbUZsYWdzKDApLAogICAgICAgbUZpbmFsUmVzdWx0KE9LKSwKICAgICAgIG1PZmZzZXQoMCksCi0gICAgICBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uKDApIHsKKyAgICAgIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24oMCksCisgICAgICBtRmV0Y2hNZXRhRGF0YUdlbmVyYXRpb24oMCksCisgICAgICBtSGFzTWV0YWRhdGEoZmFsc2UpLAorICAgICAgbU1ldGFkYXRhU2VsZWN0ZWQoZmFsc2UpIHsKICAgICBpZiAoaGVhZGVycykgewogICAgICAgICBtRXh0cmFIZWFkZXJzID0gKmhlYWRlcnM7CiAKQEAgLTgxLDcgKzg0LDcgQEAKICAgICAgICAgbUxpdmVMb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKICAgICB9CiAKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vzc2lvbk5vdGlmeSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNlc3Npb25Ob3RpZnksIHRoaXMpOwogCiAgICAgbUxpdmVTZXNzaW9uID0gbmV3IExpdmVTZXNzaW9uKAogICAgICAgICAgICAgbm90aWZ5LApAQCAtMTQyLDE5ICsxNDUsNDcgQEAKIHNzaXplX3QgTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlOjpnZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3QgewogICAgIGlmIChtTGl2ZVNlc3Npb24gPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIGlmICh0eXBlID09IE1FRElBX1RSQUNLX1RZUEVfTUVUQURBVEEpIHsKKyAgICAgICAgLy8gTUVESUFfVFJBQ0tfVFlQRV9NRVRBREFUQSBpcyBhbHdheXMgbGFzdCB0cmFjaworICAgICAgICAvLyBtTWV0YWRhdGFTZWxlY3RlZCBjYW4gb25seSBiZSB0cnVlIHdoZW4gbUhhc01ldGFkYXRhIGlzIHRydWUKKyAgICAgICAgcmV0dXJuIG1NZXRhZGF0YVNlbGVjdGVkID8gKG1MaXZlU2Vzc2lvbi0+Z2V0VHJhY2tDb3VudCgpIC0gMSkgOiAtMTsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gbUxpdmVTZXNzaW9uLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOwogICAgIH0KIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlOjpzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QsIGludDY0X3QgLyp0aW1lVXMqLykgewotICAgIHN0YXR1c190IGVyciA9IG1MaXZlU2Vzc2lvbi0+c2VsZWN0VHJhY2sodHJhY2tJbmRleCwgc2VsZWN0KTsKKyAgICBpZiAobUxpdmVTZXNzaW9uID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IElOVkFMSURfT1BFUkFUSU9OOworICAgIGJvb2wgcG9zdEZldGNoTXNnID0gZmFsc2UsIGlzU3ViID0gZmFsc2U7CisgICAgaWYgKCFtSGFzTWV0YWRhdGEgfHwgdHJhY2tJbmRleCAhPSBtTGl2ZVNlc3Npb24tPmdldFRyYWNrQ291bnQoKSAtIDEpIHsKKyAgICAgICAgZXJyID0gbUxpdmVTZXNzaW9uLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCBzZWxlY3QpOworICAgICAgICBwb3N0RmV0Y2hNc2cgPSBzZWxlY3Q7CisgICAgICAgIGlzU3ViID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBtZXRhZGF0YSB0cmFjazsgaS5lLiAobUhhc01ldGFkYXRhICYmIHRyYWNrSW5kZXggPT0gbUxpdmVTZXNzaW9uLT5nZXRUcmFja0NvdW50KCkgLSAxKQorICAgICAgICBpZiAobU1ldGFkYXRhU2VsZWN0ZWQgJiYgIXNlbGVjdCkgeworICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgIH0gZWxzZSBpZiAoIW1NZXRhZGF0YVNlbGVjdGVkICYmIHNlbGVjdCkgeworICAgICAgICAgICAgcG9zdEZldGNoTXNnID0gdHJ1ZTsKKyAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXJyID0gQkFEX1ZBTFVFOyAvLyBiZWhhdmUgYXMgTGl2ZVNlc3Npb246OnNlbGVjdFRyYWNrCisgICAgICAgIH0KKworICAgICAgICBtTWV0YWRhdGFTZWxlY3RlZCA9IHNlbGVjdDsKKyAgICB9CiAKICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24rKzsKLSAgICAgICAgaWYgKHNlbGVjdCkgewotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEZldGNoU3VidGl0bGVEYXRhLCBpZCgpKTsKLSAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uKTsKKyAgICAgICAgaW50MzJfdCAmZ2VuZXJhdGlvbiA9IGlzU3ViID8gbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbiA6IG1GZXRjaE1ldGFEYXRhR2VuZXJhdGlvbjsKKyAgICAgICAgZ2VuZXJhdGlvbisrOworICAgICAgICBpZiAocG9zdEZldGNoTXNnKSB7CisgICAgICAgICAgICBpbnQzMl90IHdoYXQgPSBpc1N1YiA/IGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGEgOiBrV2hhdEZldGNoTWV0YURhdGE7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKHdoYXQsIHRoaXMpOworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIGdlbmVyYXRpb24pOwogICAgICAgICAgICAgbXNnLT5wb3N0KCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNjksNiArMjAwLDQ5IEBACiAgICAgcmV0dXJuIG1MaXZlU2Vzc2lvbi0+c2Vla1RvKHNlZWtUaW1lVXMpOwogfQogCit2b2lkIE51UGxheWVyOjpIVFRQTGl2ZVNvdXJjZTo6cG9sbEZvclJhd0RhdGEoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBpbnQzMl90IGN1cnJlbnRHZW5lcmF0aW9uLAorICAgICAgICBMaXZlU2Vzc2lvbjo6U3RyZWFtVHlwZSBmZXRjaFR5cGUsIGludDMyX3QgcHVzaFdoYXQpIHsKKworICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisKKyAgICBpZiAoZ2VuZXJhdGlvbiAhPSBjdXJyZW50R2VuZXJhdGlvbikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgIHdoaWxlIChtTGl2ZVNlc3Npb24tPmRlcXVldWVBY2Nlc3NVbml0KGZldGNoVHlwZSwgJmJ1ZmZlcikgPT0gT0spIHsKKworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBwdXNoV2hhdCk7CisgICAgICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJidWZmZXIiLCBidWZmZXIpOworCisgICAgICAgIGludDY0X3QgdGltZVVzLCBiYXNlVXMsIGRlbGF5VXM7CisgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoImJhc2VVcyIsICZiYXNlVXMpKTsKKyAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworICAgICAgICBkZWxheVVzID0gYmFzZVVzICsgdGltZVVzIC0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKworICAgICAgICBpZiAoZmV0Y2hUeXBlID09IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1NVQlRJVExFUykgeworICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICBtc2ctPnBvc3QoZGVsYXlVcyA+IDBsbCA/IGRlbGF5VXMgOiAwbGwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKGZldGNoVHlwZSA9PSBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9NRVRBREFUQSkgeworICAgICAgICAgICAgaWYgKGRlbGF5VXMgPCAtMTAwMDAwMGxsKSB7IC8vIDEgc2Vjb25kCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgIC8vIHB1c2ggYWxsIGN1cnJlbnRseSBhdmFpbGFibGUgbWV0YWRhdGEgYnVmZmVycyBpbiBlYWNoIGludm9jYXRpb24gb2YgcG9sbEZvclJhd0RhdGEKKyAgICAgICAgICAgIC8vIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHRyeSBhZ2FpbiBpbiAxIHNlY29uZAorICAgIG1zZy0+cG9zdCgxMDAwMDAwbGwpOworfQorCiB2b2lkIE51UGxheWVyOjpIVFRQTGl2ZVNvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICAgIGNhc2Uga1doYXRTZXNzaW9uTm90aWZ5OgpAQCAtMTc5LDMzICsyNTMsMjQgQEAKIAogICAgICAgICBjYXNlIGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGE6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgICAgIHBvbGxGb3JSYXdEYXRhKAorICAgICAgICAgICAgICAgICAgICBtc2csIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgIC8qIGZldGNoICovIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1NVQlRJVExFUywKKyAgICAgICAgICAgICAgICAgICAgLyogcHVzaCAqLyBrV2hhdFN1YnRpdGxlRGF0YSk7CiAKLSAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAvLyBzdGFsZQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0RmV0Y2hNZXRhRGF0YToKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFtTWV0YWRhdGFTZWxlY3RlZCkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7Ci0gICAgICAgICAgICBpZiAobUxpdmVTZXNzaW9uLT5kZXF1ZXVlQWNjZXNzVW5pdCgKLSAgICAgICAgICAgICAgICAgICAgTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfU1VCVElUTEVTLCAmYnVmZmVyKSA9PSBPSykgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRTdWJ0aXRsZURhdGEpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJidWZmZXIiLCBidWZmZXIpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotCi0gICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsIGJhc2VVcywgZHVyYXRpb25VcywgZGVsYXlVczsKLSAgICAgICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJiYXNlVXMiLCAmYmFzZVVzKSk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwotICAgICAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmZHVyYXRpb25VcykpOwotICAgICAgICAgICAgICAgIGRlbGF5VXMgPSBiYXNlVXMgKyB0aW1lVXMgLSBBTG9vcGVyOjpHZXROb3dVcygpOwotCi0gICAgICAgICAgICAgICAgbXNnLT5wb3N0KGRlbGF5VXMgPiAwbGwgPyBkZWxheVVzIDogMGxsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gdHJ5IGFnYWluIGluIDEgc2Vjb25kCi0gICAgICAgICAgICAgICAgbXNnLT5wb3N0KDEwMDAwMDBsbCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBwb2xsRm9yUmF3RGF0YSgKKyAgICAgICAgICAgICAgICAgICAgbXNnLCBtRmV0Y2hNZXRhRGF0YUdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgIC8qIGZldGNoICovIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX01FVEFEQVRBLAorICAgICAgICAgICAgICAgICAgICAvKiBwdXNoICovIGtXaGF0VGltZWRNZXRhRGF0YSk7CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yODEsNiArMzQ2LDQ3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgTGl2ZVNlc3Npb246OmtXaGF0QnVmZmVyaW5nU3RhcnQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFBhdXNlT25CdWZmZXJpbmdTdGFydCk7CisgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBMaXZlU2Vzc2lvbjo6a1doYXRCdWZmZXJpbmdFbmQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFJlc3VtZU9uQnVmZmVyaW5nRW5kKTsKKyAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworCisgICAgICAgIGNhc2UgTGl2ZVNlc3Npb246OmtXaGF0QnVmZmVyaW5nVXBkYXRlOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CisgICAgICAgICAgICBpbnQzMl90IHBlcmNlbnRhZ2U7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicGVyY2VudGFnZSIsICZwZXJjZW50YWdlKSk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRCdWZmZXJpbmdVcGRhdGUpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigicGVyY2VudGFnZSIsIHBlcmNlbnRhZ2UpOworICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTGl2ZVNlc3Npb246OmtXaGF0TWV0YWRhdGFEZXRlY3RlZDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFtSGFzTWV0YWRhdGEpIHsKKyAgICAgICAgICAgICAgICBtSGFzTWV0YWRhdGEgPSB0cnVlOworCisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICAgICAgICAgIC8vIG5vdGlmaWNhdGlvbiB3aXRob3V0IGJ1ZmZlciB0cmlnZ2VycyBNRURJQV9JTkZPX01FVEFEQVRBX1VQREFURQorICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFRpbWVkTWV0YURhdGEpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIExpdmVTZXNzaW9uOjprV2hhdEVycm9yOgogICAgICAgICB7CiAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmgKaW5kZXggYmJiODk4MS4uOWUwZWMyZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmgKQEAgLTIxLDYgKzIxLDggQEAKICNpbmNsdWRlICJOdVBsYXllci5oIgogI2luY2x1ZGUgIk51UGxheWVyU291cmNlLmgiCiAKKyNpbmNsdWRlICJMaXZlU2Vzc2lvbi5oIgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBMaXZlU2Vzc2lvbjsKQEAgLTYwLDYgKzYyLDcgQEAKICAgICBlbnVtIHsKICAgICAgICAga1doYXRTZXNzaW9uTm90aWZ5LAogICAgICAgICBrV2hhdEZldGNoU3VidGl0bGVEYXRhLAorICAgICAgICBrV2hhdEZldGNoTWV0YURhdGEsCiAgICAgfTsKIAogICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBtSFRUUFNlcnZpY2U7CkBAIC03MSw4ICs3NCwxNCBAQAogICAgIHNwPEFMb29wZXI+IG1MaXZlTG9vcGVyOwogICAgIHNwPExpdmVTZXNzaW9uPiBtTGl2ZVNlc3Npb247CiAgICAgaW50MzJfdCBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uOworICAgIGludDMyX3QgbUZldGNoTWV0YURhdGFHZW5lcmF0aW9uOworICAgIGJvb2wgbUhhc01ldGFkYXRhOworICAgIGJvb2wgbU1ldGFkYXRhU2VsZWN0ZWQ7CiAKICAgICB2b2lkIG9uU2Vzc2lvbk5vdGlmeShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBwb2xsRm9yUmF3RGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBpbnQzMl90IGN1cnJlbnRHZW5lcmF0aW9uLAorICAgICAgICAgICAgTGl2ZVNlc3Npb246OlN0cmVhbVR5cGUgZmV0Y2hUeXBlLCBpbnQzMl90IHB1c2hXaGF0KTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEhUVFBMaXZlU291cmNlKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcAppbmRleCBhZWVhMjA0Li5jMDE0NmQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKQEAgLTM3LDYgKzM3LDkgQEAKIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgorI2luY2x1ZGUgPG1lZGlhL0FWU3luY1NldHRpbmdzLmg+CisKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtNDUsNyArNDgsOSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKwogI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KIAogI2luY2x1ZGUgImF2Y191dGlscy5oIgogCkBAIC02NCwxOCArNjksMTYgQEAKIH07CiAKIHN0cnVjdCBOdVBsYXllcjo6U2Vla0FjdGlvbiA6IHB1YmxpYyBBY3Rpb24gewotICAgIFNlZWtBY3Rpb24oaW50NjRfdCBzZWVrVGltZVVzLCBib29sIG5lZWROb3RpZnkpCi0gICAgICAgIDogbVNlZWtUaW1lVXMoc2Vla1RpbWVVcyksCi0gICAgICAgICAgbU5lZWROb3RpZnkobmVlZE5vdGlmeSkgeworICAgIFNlZWtBY3Rpb24oaW50NjRfdCBzZWVrVGltZVVzKQorICAgICAgICA6IG1TZWVrVGltZVVzKHNlZWtUaW1lVXMpIHsKICAgICB9CiAKICAgICB2aXJ0dWFsIHZvaWQgZXhlY3V0ZShOdVBsYXllciAqcGxheWVyKSB7Ci0gICAgICAgIHBsYXllci0+cGVyZm9ybVNlZWsobVNlZWtUaW1lVXMsIG1OZWVkTm90aWZ5KTsKKyAgICAgICAgcGxheWVyLT5wZXJmb3JtU2VlayhtU2Vla1RpbWVVcyk7CiAgICAgfQogCiBwcml2YXRlOgogICAgIGludDY0X3QgbVNlZWtUaW1lVXM7Ci0gICAgYm9vbCBtTmVlZE5vdGlmeTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNlZWtBY3Rpb24pOwogfTsKQEAgLTk2LDE2ICs5OSwxNiBAQAogfTsKIAogc3RydWN0IE51UGxheWVyOjpTZXRTdXJmYWNlQWN0aW9uIDogcHVibGljIEFjdGlvbiB7Ci0gICAgU2V0U3VyZmFjZUFjdGlvbihjb25zdCBzcDxOYXRpdmVXaW5kb3dXcmFwcGVyPiAmd3JhcHBlcikKLSAgICAgICAgOiBtV3JhcHBlcih3cmFwcGVyKSB7CisgICAgU2V0U3VyZmFjZUFjdGlvbihjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkKKyAgICAgICAgOiBtU3VyZmFjZShzdXJmYWNlKSB7CiAgICAgfQogCiAgICAgdmlydHVhbCB2b2lkIGV4ZWN1dGUoTnVQbGF5ZXIgKnBsYXllcikgewotICAgICAgICBwbGF5ZXItPnBlcmZvcm1TZXRTdXJmYWNlKG1XcmFwcGVyKTsKKyAgICAgICAgcGxheWVyLT5wZXJmb3JtU2V0U3VyZmFjZShtU3VyZmFjZSk7CiAgICAgfQogCiBwcml2YXRlOgotICAgIHNwPE5hdGl2ZVdpbmRvd1dyYXBwZXI+IG1XcmFwcGVyOworICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2V0U3VyZmFjZUFjdGlvbik7CiB9OwpAQCAtMTYzLDEzICsxNjYsMTUgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotTnVQbGF5ZXI6Ok51UGxheWVyKCkKK051UGxheWVyOjpOdVBsYXllcihwaWRfdCBwaWQpCiAgICAgOiBtVUlEVmFsaWQoZmFsc2UpLAorICAgICAgbVBJRChwaWQpLAogICAgICAgbVNvdXJjZUZsYWdzKDApLAogICAgICAgbU9mZmxvYWRBdWRpbyhmYWxzZSksCiAgICAgICBtQXVkaW9EZWNvZGVyR2VuZXJhdGlvbigwKSwKICAgICAgIG1WaWRlb0RlY29kZXJHZW5lcmF0aW9uKDApLAogICAgICAgbVJlbmRlcmVyR2VuZXJhdGlvbigwKSwKKyAgICAgIG1QcmV2aW91c1NlZWtUaW1lVXMoMCksCiAgICAgICBtQXVkaW9FT1MoZmFsc2UpLAogICAgICAgbVZpZGVvRU9TKGZhbHNlKSwKICAgICAgIG1TY2FuU291cmNlc1BlbmRpbmcoZmFsc2UpLApAQCAtMTgwLDkgKzE4NSwxMyBAQAogICAgICAgbUZsdXNoaW5nVmlkZW8oTk9ORSksCiAgICAgICBtUmVzdW1lUGVuZGluZyhmYWxzZSksCiAgICAgICBtVmlkZW9TY2FsaW5nTW9kZShOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19XSU5ET1cpLAorICAgICAgbVBsYXliYWNrU2V0dGluZ3MoQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUKSwKKyAgICAgIG1WaWRlb0Zwc0hpbnQoLTEuZiksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtU291cmNlU3RhcnRlZChmYWxzZSksCiAgICAgICBtUGF1c2VkKGZhbHNlKSwKLSAgICAgIG1QYXVzZWRCeUNsaWVudChmYWxzZSkgeworICAgICAgbVBhdXNlZEJ5Q2xpZW50KGZhbHNlKSwKKyAgICAgIG1QYXVzZWRGb3JCdWZmZXJpbmcoZmFsc2UpIHsKICAgICBjbGVhckZsdXNoQ29tcGxldGUoKTsKIH0KIApAQCAtMTk5LDkgKzIwOCw5IEBACiB9CiAKIHZvaWQgTnVQbGF5ZXI6OnNldERhdGFTb3VyY2VBc3luYyhjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldERhdGFTb3VyY2UsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXREYXRhU291cmNlLCB0aGlzKTsKIAotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTb3VyY2VOb3RpZnksIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTb3VyY2VOb3RpZnksIHRoaXMpOwogCiAgICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIG5ldyBTdHJlYW1pbmdTb3VyY2Uobm90aWZ5LCBzb3VyY2UpKTsKICAgICBtc2ctPnBvc3QoKTsKQEAgLTIyOSwxMCArMjM4LDEwIEBACiAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKIAotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXREYXRhU291cmNlLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0RGF0YVNvdXJjZSwgdGhpcyk7CiAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbih1cmwpOwogCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNvdXJjZU5vdGlmeSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNvdXJjZU5vdGlmeSwgdGhpcyk7CiAKICAgICBzcDxTb3VyY2U+IHNvdXJjZTsKICAgICBpZiAoSXNIVFRQTGl2ZVVSTCh1cmwpKSB7CkBAIC0yNjYsOSArMjc1LDkgQEAKIH0KIAogdm9pZCBOdVBsYXllcjo6c2V0RGF0YVNvdXJjZUFzeW5jKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldERhdGFTb3VyY2UsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXREYXRhU291cmNlLCB0aGlzKTsKIAotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTb3VyY2VOb3RpZnksIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTb3VyY2VOb3RpZnksIHRoaXMpOwogCiAgICAgc3A8R2VuZXJpY1NvdXJjZT4gc291cmNlID0KICAgICAgICAgICAgIG5ldyBHZW5lcmljU291cmNlKG5vdGlmeSwgbVVJRFZhbGlkLCBtVUlEKTsKQEAgLTI4NCwzOCArMjkzLDEwOCBAQAogICAgIG1zZy0+cG9zdCgpOwogfQogCit2b2lkIE51UGxheWVyOjpzZXREYXRhU291cmNlQXN5bmMoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0RGF0YVNvdXJjZSwgdGhpcyk7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNvdXJjZU5vdGlmeSwgdGhpcyk7CisKKyAgICBzcDxHZW5lcmljU291cmNlPiBzb3VyY2UgPSBuZXcgR2VuZXJpY1NvdXJjZShub3RpZnksIG1VSURWYWxpZCwgbVVJRCk7CisgICAgc3RhdHVzX3QgZXJyID0gc291cmNlLT5zZXREYXRhU291cmNlKGRhdGFTb3VyY2UpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBkYXRhIHNvdXJjZSEiKTsKKyAgICAgICAgc291cmNlID0gTlVMTDsKKyAgICB9CisKKyAgICBtc2ctPnNldE9iamVjdCgic291cmNlIiwgc291cmNlKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwogdm9pZCBOdVBsYXllcjo6cHJlcGFyZUFzeW5jKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQcmVwYXJlLCBpZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UHJlcGFyZSwgdGhpcykpLT5wb3N0KCk7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OnNldFZpZGVvU3VyZmFjZVRleHR1cmVBc3luYygKICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJmJ1ZmZlclByb2R1Y2VyKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldFZpZGVvTmF0aXZlV2luZG93LCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0VmlkZW9TdXJmYWNlLCB0aGlzKTsKIAogICAgIGlmIChidWZmZXJQcm9kdWNlciA9PSBOVUxMKSB7Ci0gICAgICAgIG1zZy0+c2V0T2JqZWN0KCJuYXRpdmUtd2luZG93IiwgTlVMTCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KCJzdXJmYWNlIiwgTlVMTCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbXNnLT5zZXRPYmplY3QoCi0gICAgICAgICAgICAgICAgIm5hdGl2ZS13aW5kb3ciLAotICAgICAgICAgICAgICAgIG5ldyBOYXRpdmVXaW5kb3dXcmFwcGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgU3VyZmFjZShidWZmZXJQcm9kdWNlciwgdHJ1ZSAvKiBjb250cm9sbGVkQnlBcHAgKi8pKSk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KCJzdXJmYWNlIiwgbmV3IFN1cmZhY2UoYnVmZmVyUHJvZHVjZXIsIHRydWUgLyogY29udHJvbGxlZEJ5QXBwICovKSk7CiAgICAgfQogCiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OnNldEF1ZGlvU2luayhjb25zdCBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gJnNpbmspIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0QXVkaW9TaW5rLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0QXVkaW9TaW5rLCB0aGlzKTsKICAgICBtc2ctPnNldE9iamVjdCgic2luayIsIHNpbmspOwogICAgIG1zZy0+cG9zdCgpOwogfQogCiB2b2lkIE51UGxheWVyOjpzdGFydCgpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIGlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgdGhpcykpLT5wb3N0KCk7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKSB7CisgICAgLy8gZG8gc29tZSBjdXJzb3J5IHZhbGlkYXRpb24gb2YgdGhlIHNldHRpbmdzIGhlcmUuIGF1ZGlvIG1vZGVzIGFyZQorICAgIC8vIG9ubHkgdmFsaWRhdGVkIHdoZW4gc2V0IG9uIHRoZSBhdWRpb3NpbmsuCisgICAgIGlmICgocmF0ZS5tU3BlZWQgIT0gMC5mICYmIHJhdGUubVNwZWVkIDwgQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUlOKQorICAgICAgICAgICAgfHwgcmF0ZS5tU3BlZWQgPiBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NQVgKKyAgICAgICAgICAgIHx8IHJhdGUubVBpdGNoIDwgQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUlOCisgICAgICAgICAgICB8fCByYXRlLm1QaXRjaCA+IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01BWCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29uZmlnUGxheWJhY2ssIHRoaXMpOworICAgIHdyaXRlVG9BTWVzc2FnZShtc2csIHJhdGUpOworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OmdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUgLyogbm9ubnVsbCAqLykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRQbGF5YmFja1NldHRpbmdzLCB0aGlzKTsKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIHJlYWRGcm9tQU1lc3NhZ2UocmVzcG9uc2UsIHJhdGUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MgJnN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb25maWdTeW5jLCB0aGlzKTsKKyAgICB3cml0ZVRvQU1lc3NhZ2UobXNnLCBzeW5jLCB2aWRlb0Zwc0hpbnQpOworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OmdldFN5bmNTZXR0aW5ncygKKyAgICAgICAgQVZTeW5jU2V0dGluZ3MgKnN5bmMgLyogbm9ubnVsbCAqLywgZmxvYXQgKnZpZGVvRnBzIC8qIG5vbm51bGwgKi8pIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0U3luY1NldHRpbmdzLCB0aGlzKTsKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIHJlYWRGcm9tQU1lc3NhZ2UocmVzcG9uc2UsIHN5bmMsIHZpZGVvRnBzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOwogfQogCiB2b2lkIE51UGxheWVyOjpwYXVzZSgpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UGF1c2UsIGlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgdGhpcykpLT5wb3N0KCk7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OnJlc2V0QXN5bmMoKSB7CkBAIC0zMjksMTEgKzQwOCwxMSBAQAogICAgICAgICBtU291cmNlLT5kaXNjb25uZWN0KCk7CiAgICAgfQogCi0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlc2V0LCBpZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzZXQsIHRoaXMpKS0+cG9zdCgpOwogfQogCiB2b2lkIE51UGxheWVyOjpzZWVrVG9Bc3luYyhpbnQ2NF90IHNlZWtUaW1lVXMsIGJvb2wgbmVlZE5vdGlmeSkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWVrLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VlaywgdGhpcyk7CiAgICAgbXNnLT5zZXRJbnQ2NCgic2Vla1RpbWVVcyIsIHNlZWtUaW1lVXMpOwogICAgIG1zZy0+c2V0SW50MzIoIm5lZWROb3RpZnkiLCBuZWVkTm90aWZ5KTsKICAgICBtc2ctPnBvc3QoKTsKQEAgLTM0NSwyMyArNDI0LDM1IEBACiAgICAgaW50MzJfdCB0cmFja1R5cGU7CiAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInR5cGUiLCAmdHJhY2tUeXBlKSk7CiAKKyAgICBBU3RyaW5nIG1pbWU7CisgICAgaWYgKCFmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpIHsKKyAgICAgICAgLy8gSmF2YSBNZWRpYVBsYXllciBvbmx5IHVzZXMgbWltZXR5cGUgZm9yIHN1YnRpdGxlIGFuZCB0aW1lZHRleHQgdHJhY2tzLgorICAgICAgICAvLyBJZiB3ZSBjYW4ndCBmaW5kIHRoZSBtaW1ldHlwZSBoZXJlIGl0IG1lYW5zIHRoYXQgd2Ugd291bGRuJ3QgYmUgbmVlZGluZworICAgICAgICAvLyB0aGUgbWltZXR5cGUgb24gdGhlIEphdmEgZW5kLiBXZSBzdGlsbCB3cml0ZSBhIHBsYWNlaG9sZGVyIG1pbWUgdG8ga2VlcCB0aGUKKyAgICAgICAgLy8gKGRlKXNlcmlhbGl6YXRpb24gbG9naWMgc2ltcGxlLgorICAgICAgICBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIG1pbWUgPSAiYXVkaW8vIjsKKyAgICAgICAgfSBlbHNlIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9WSURFTykgeworICAgICAgICAgICAgbWltZSA9ICJ2aWRlby8iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIEFTdHJpbmcgbGFuZzsKICAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoImxhbmd1YWdlIiwgJmxhbmcpKTsKIAogICAgIHJlcGx5LT53cml0ZUludDMyKDIpOyAvLyB3cml0ZSBzb21ldGhpbmcgbm9uLXplcm8KICAgICByZXBseS0+d3JpdGVJbnQzMih0cmFja1R5cGUpOworICAgIHJlcGx5LT53cml0ZVN0cmluZzE2KFN0cmluZzE2KG1pbWUuY19zdHIoKSkpOwogICAgIHJlcGx5LT53cml0ZVN0cmluZzE2KFN0cmluZzE2KGxhbmcuY19zdHIoKSkpOwogCiAgICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKSB7Ci0gICAgICAgIEFTdHJpbmcgbWltZTsKLSAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKLQogICAgICAgICBpbnQzMl90IGlzQXV0bywgaXNEZWZhdWx0LCBpc0ZvcmNlZDsKICAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoImF1dG8iLCAmaXNBdXRvKSk7CiAgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJkZWZhdWx0IiwgJmlzRGVmYXVsdCkpOwogICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiZm9yY2VkIiwgJmlzRm9yY2VkKSk7CiAKLSAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nMTYoU3RyaW5nMTYobWltZS5jX3N0cigpKSk7CiAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlzQXV0byk7CiAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlzRGVmYXVsdCk7CiAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlzRm9yY2VkKTsKQEAgLTQwMSw3ICs0OTIsNyBAQAogCiAgICAgICAgIGNhc2Uga1doYXRHZXRUcmFja0luZm86CiAgICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgUGFyY2VsKiByZXBseTsKQEAgLTQ1NCw3ICs1NDUsNyBAQAogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwogCi0gICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC00NjIsNyArNTUzLDcgQEAKIAogICAgICAgICBjYXNlIGtXaGF0U2VsZWN0VHJhY2s6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXg7CkBAIC01MzIsMTUgKzYyMywyNSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIGtXaGF0U2V0VmlkZW9OYXRpdmVXaW5kb3c6CisgICAgICAgIGNhc2Uga1doYXRTZXRWaWRlb1N1cmZhY2U6CiAgICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWKCJrV2hhdFNldFZpZGVvTmF0aXZlV2luZG93Iik7CiAKICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgibmF0aXZlLXdpbmRvdyIsICZvYmopKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgic3VyZmFjZSIsICZvYmopKTsKKyAgICAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UgPSBzdGF0aWNfY2FzdDxTdXJmYWNlICo+KG9iai5nZXQoKSk7CiAKLSAgICAgICAgICAgIGlmIChtU291cmNlID09IE5VTEwgfHwgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcGVyZm9ybVNldFN1cmZhY2Uoc3RhdGljX2Nhc3Q8TmF0aXZlV2luZG93V3JhcHBlciAqPihvYmouZ2V0KCkpKTsKKyAgICAgICAgICAgIEFMT0dEKCJvblNldFZpZGVvU3VyZmFjZSglcCwgJXMgdmlkZW8gZGVjb2RlcikiLAorICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAobVNvdXJjZSAhPSBOVUxMICYmIG1TdGFydGVkICYmIG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgIT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1WaWRlb0RlY29kZXIgIT0gTlVMTCkgPyAiaGF2ZSIgOiAibm8iKTsKKworICAgICAgICAgICAgLy8gTmVlZCB0byBjaGVjayBtU3RhcnRlZCBiZWZvcmUgY2FsbGluZyBtU291cmNlLT5nZXRGb3JtYXQgYmVjYXVzZSBOdVBsYXllciBtaWdodAorICAgICAgICAgICAgLy8gYmUgaW4gcHJlcGFyaW5nIHN0YXRlIGFuZCBpdCBjb3VsZCB0YWtlIGxvbmcgdGltZS4KKyAgICAgICAgICAgIC8vIFdoZW4gbVN0YXJ0ZWQgaXMgdHJ1ZSwgbVNvdXJjZSBtdXN0IGhhdmUgYmVlbiBzZXQuCisgICAgICAgICAgICBpZiAobVNvdXJjZSA9PSBOVUxMIHx8ICFtU3RhcnRlZCB8fCBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pID09IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogbVZpZGVvRGVjb2RlcidzIG1TdXJmYWNlIGlzIGFsd2F5cyBub24tbnVsbAorICAgICAgICAgICAgICAgICAgICB8fCAobVZpZGVvRGVjb2RlciAhPSBOVUxMICYmIG1WaWRlb0RlY29kZXItPnNldFZpZGVvU3VyZmFjZShzdXJmYWNlKSA9PSBPSykpIHsKKyAgICAgICAgICAgICAgICBwZXJmb3JtU2V0U3VyZmFjZShzdXJmYWNlKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtNTQ4LDExICs2NDksOSBAQAogICAgICAgICAgICAgICAgICAgICBuZXcgRmx1c2hEZWNvZGVyQWN0aW9uKEZMVVNIX0NNRF9GTFVTSCAvKiBhdWRpbyAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTFVTSF9DTURfU0hVVERPV04gLyogdmlkZW8gKi8pKTsKIAotICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgICAgIG5ldyBTZXRTdXJmYWNlQWN0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TmF0aXZlV2luZG93V3JhcHBlciAqPihvYmouZ2V0KCkpKSk7CisgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjayhuZXcgU2V0U3VyZmFjZUFjdGlvbihzdXJmYWNlKSk7CiAKLSAgICAgICAgICAgIGlmIChvYmogIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKG9iaiAhPSBOVUxMIHx8IG1BdWRpb0RlY29kZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGlmIChtU3RhcnRlZCkgewogICAgICAgICAgICAgICAgICAgICAvLyBJc3N1ZSBhIHNlZWsgdG8gcmVmcmVzaCB0aGUgdmlkZW8gc2NyZWVuIG9ubHkgaWYgc3RhcnRlZCBvdGhlcndpc2UKICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGV4dHJhY3RvciBtYXkgbm90IHlldCBiZSBzdGFydGVkIGFuZCB3aWxsIGFzc2VydC4KQEAgLTU2MSw3ICs2NjAsNyBAQAogICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGN1cnJlbnRQb3NpdGlvblVzID0gMDsKICAgICAgICAgICAgICAgICAgICAgaWYgKGdldEN1cnJlbnRQb3NpdGlvbigmY3VycmVudFBvc2l0aW9uVXMpID09IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlZWtBY3Rpb24oY3VycmVudFBvc2l0aW9uVXMsIGZhbHNlIC8qIG5lZWROb3RpZnkgKi8pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlZWtBY3Rpb24oY3VycmVudFBvc2l0aW9uVXMpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIApAQCAtNTk2LDcgKzY5NSwxMCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBBTE9HVigia1doYXRTdGFydCIpOwogICAgICAgICAgICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgICAgICAgICAgb25SZXN1bWUoKTsKKyAgICAgICAgICAgICAgICAvLyBkbyBub3QgcmVzdW1lIHlldCBpZiB0aGUgc291cmNlIGlzIHN0aWxsIGJ1ZmZlcmluZworICAgICAgICAgICAgICAgIGlmICghbVBhdXNlZEZvckJ1ZmZlcmluZykgeworICAgICAgICAgICAgICAgICAgICBvblJlc3VtZSgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgb25TdGFydCgpOwogICAgICAgICAgICAgfQpAQCAtNjA0LDYgKzcwNiwxMTcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdENvbmZpZ1BsYXliYWNrOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIHJhdGUgLyogc2FuaXRpemVkICovOworICAgICAgICAgICAgcmVhZEZyb21BTWVzc2FnZShtc2csICZyYXRlKTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworICAgICAgICAgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbVJlbmRlcmVyLT5zZXRQbGF5YmFja1NldHRpbmdzKHJhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIGlmIChyYXRlLm1TcGVlZCA9PSAwLmYpIHsKKyAgICAgICAgICAgICAgICAgICAgb25QYXVzZSgpOworICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIGFsbCBvdGhlciBzZXR0aW5ncyAodXNpbmcgbm9uLXBhdXNlZCBzcGVlZCkKKyAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UgY2FuIHJlc3RvcmUgdGhlbSBvbiBzdGFydAorICAgICAgICAgICAgICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSBuZXdSYXRlID0gcmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgbmV3UmF0ZS5tU3BlZWQgPSBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQ7CisgICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gbmV3UmF0ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvKiByYXRlLm1TcGVlZCAhPSAwLmYgKi8KKyAgICAgICAgICAgICAgICAgICAgb25SZXN1bWUoKTsKKyAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSByYXRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1WaWRlb0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGZsb2F0IHJhdGUgPSBnZXRGcmFtZVJhdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAocmF0ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IG5ldyBBTWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJvcGVyYXRpbmctcmF0ZSIsIHJhdGUgKiBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQpOworICAgICAgICAgICAgICAgICAgICBtVmlkZW9EZWNvZGVyLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0R2V0UGxheWJhY2tTZXR0aW5nczoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSByYXRlID0gbVBsYXliYWNrU2V0dGluZ3M7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICAgICAgICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGVyciA9IG1SZW5kZXJlci0+Z2V0UGxheWJhY2tTZXR0aW5ncygmcmF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgLy8gZ2V0IHBsYXliYWNrIHNldHRpbmdzIHVzZWQgYnkgcmVuZGVyZXIsIGFzIGl0IG1heSBiZQorICAgICAgICAgICAgICAgIC8vIHNsaWdodGx5IG9mZiBkdWUgdG8gYXVkaW9zaW5rIG5vdCB0YWtpbmcgc21hbGwgY2hhbmdlcy4KKyAgICAgICAgICAgICAgICBtUGxheWJhY2tTZXR0aW5ncyA9IHJhdGU7CisgICAgICAgICAgICAgICAgaWYgKG1QYXVzZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmF0ZS5tU3BlZWQgPSAwLmY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHdyaXRlVG9BTWVzc2FnZShyZXNwb25zZSwgcmF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0Q29uZmlnU3luYzoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKKyAgICAgICAgICAgIEFMT0dWKCJrV2hhdENvbmZpZ1N5bmMiKTsKKyAgICAgICAgICAgIEFWU3luY1NldHRpbmdzIHN5bmM7CisgICAgICAgICAgICBmbG9hdCB2aWRlb0Zwc0hpbnQ7CisgICAgICAgICAgICByZWFkRnJvbUFNZXNzYWdlKG1zZywgJnN5bmMsICZ2aWRlb0Zwc0hpbnQpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtUmVuZGVyZXItPnNldFN5bmNTZXR0aW5ncyhzeW5jLCB2aWRlb0Zwc0hpbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIG1TeW5jU2V0dGluZ3MgPSBzeW5jOworICAgICAgICAgICAgICAgIG1WaWRlb0Zwc0hpbnQgPSB2aWRlb0Zwc0hpbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0R2V0U3luY1NldHRpbmdzOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICAgICAgICAgIEFWU3luY1NldHRpbmdzIHN5bmMgPSBtU3luY1NldHRpbmdzOworICAgICAgICAgICAgZmxvYXQgdmlkZW9GcHMgPSBtVmlkZW9GcHNIaW50OworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtUmVuZGVyZXItPmdldFN5bmNTZXR0aW5ncygmc3luYywgJnZpZGVvRnBzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIG1TeW5jU2V0dGluZ3MgPSBzeW5jOworICAgICAgICAgICAgICAgICAgICBtVmlkZW9GcHNIaW50ID0gdmlkZW9GcHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHdyaXRlVG9BTWVzc2FnZShyZXNwb25zZSwgc3luYywgdmlkZW9GcHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBrV2hhdFNjYW5Tb3VyY2VzOgogICAgICAgICB7CiAgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CkBAIC02MjMsMjYgKzgzNiwxMiBAQAogCiAgICAgICAgICAgICAvLyBpbml0aWFsaXplIHZpZGVvIGJlZm9yZSBhdWRpbyBiZWNhdXNlIHN1Y2Nlc3NmdWwgaW5pdGlhbGl6YXRpb24gb2YKICAgICAgICAgICAgIC8vIHZpZGVvIG1heSBjaGFuZ2UgZGVlcCBidWZmZXIgbW9kZSBvZiBhdWRpby4KLSAgICAgICAgICAgIGlmIChtTmF0aXZlV2luZG93ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChtU3VyZmFjZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGVEZWNvZGVyKGZhbHNlLCAmbVZpZGVvRGVjb2Rlcik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIERvbid0IHRyeSB0byByZS1vcGVuIGF1ZGlvIHNpbmsgaWYgdGhlcmUncyBhbiBleGlzdGluZyBkZWNvZGVyLgogICAgICAgICAgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCAmJiBtQXVkaW9EZWNvZGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gYXVkaW9NZXRhID0gbVNvdXJjZS0+Z2V0Rm9ybWF0TWV0YSh0cnVlIC8qIGF1ZGlvICovKTsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gdmlkZW9Gb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pOwotICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IG1BdWRpb1NpbmstPmdldEF1ZGlvU3RyZWFtVHlwZSgpOwotICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgaGFzVmlkZW8gPSAodmlkZW9Gb3JtYXQgIT0gTlVMTCk7Ci0gICAgICAgICAgICAgICAgY29uc3QgYm9vbCBjYW5PZmZsb2FkID0gY2FuT2ZmbG9hZFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvTWV0YSwgaGFzVmlkZW8sIHRydWUgLyogaXNfc3RyZWFtaW5nICovLCBzdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICBpZiAoY2FuT2ZmbG9hZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIW1PZmZsb2FkQXVkaW8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZW5kZXJlci0+c2lnbmFsRW5hYmxlT2ZmbG9hZEF1ZGlvKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gb3BlbiBhdWRpbyBzaW5rIGVhcmx5IHVuZGVyIG9mZmxvYWQgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdCh0cnVlIC8qYXVkaW8qLyk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeU9wZW5BdWRpb1NpbmtGb3JPZmZsb2FkKGZvcm1hdCwgaGFzVmlkZW8pOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZURlY29kZXIodHJ1ZSwgJm1BdWRpb0RlY29kZXIpOwogICAgICAgICAgICAgfQogCkBAIC02NzEsNyArODcwLDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKChtQXVkaW9EZWNvZGVyID09IE5VTEwgJiYgbUF1ZGlvU2luayAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICB8fCAobVZpZGVvRGVjb2RlciA9PSBOVUxMICYmIG1OYXRpdmVXaW5kb3cgIT0gTlVMTCkpIHsKKyAgICAgICAgICAgICAgICAgICAgfHwgKG1WaWRlb0RlY29kZXIgPT0gTlVMTCAmJiBtU3VyZmFjZSAhPSBOVUxMKSkgewogICAgICAgICAgICAgICAgIG1zZy0+cG9zdCgxMDAwMDBsbCk7CiAgICAgICAgICAgICAgICAgbVNjYW5Tb3VyY2VzUGVuZGluZyA9IHRydWU7CiAgICAgICAgICAgICB9CkBAIC04MTAsNiArMTAwOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaWRldmluZSBzb3VyY2UgcmVhZHMgbXVzdCBzdG9wIGJlZm9yZSByZWxlYXNpbmcgdGhlIHZpZGVvIGRlY29kZXIuCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF1ZGlvICYmIG1Tb3VyY2UgIT0gTlVMTCAmJiBtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfU0VDVVJFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Tb3VyY2VTdGFydGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZWNvZGVyKGF1ZGlvKS0+aW5pdGlhdGVTaHV0ZG93bigpOyAvLyBJbiB0aGUgbWlkZGxlIG9mIGEgc2Vlay4KICAgICAgICAgICAgICAgICAgICAgICAgICpmbHVzaGluZyA9IFNIVVRUSU5HX0RPV05fREVDT0RFUjsgICAgIC8vIFNodXQgZG93bi4KQEAgLTg3Niw2ICsxMDc2LDExIEBACiAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImF1ZGlvIiwgJmF1ZGlvKSk7CiAKICAgICAgICAgICAgICAgICBBTE9HVigicmVuZGVyZXIgJXMgZmx1c2ggY29tcGxldGVkLiIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgICAgICAgICAgICAgIGlmIChhdWRpbyAmJiAobUZsdXNoaW5nQXVkaW8gPT0gTk9ORSB8fCBtRmx1c2hpbmdBdWRpbyA9PSBGTFVTSEVECisgICAgICAgICAgICAgICAgICAgICAgICB8fCBtRmx1c2hpbmdBdWRpbyA9PSBTSFVUX0RPV04pKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZsdXNoIGhhcyBiZWVuIGhhbmRsZWQgYnkgdGVhciBkb3duLgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaGFuZGxlRmx1c2hDb21wbGV0ZShhdWRpbywgZmFsc2UgLyogaXNEZWNvZGVyICovKTsKICAgICAgICAgICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRWaWRlb1JlbmRlcmluZ1N0YXJ0KSB7CkBAIC04ODMsMTUgKzEwODgsMjggQEAKICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRNZWRpYVJlbmRlcmluZ1N0YXJ0KSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIm1lZGlhIHJlbmRlcmluZyBzdGFydGVkIik7CiAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfU1RBUlRFRCwgMCwgMCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUmVuZGVyZXI6OmtXaGF0QXVkaW9PZmZsb2FkVGVhckRvd24pIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiVGVhciBkb3duIGF1ZGlvIG9mZmxvYWQsIGZhbGwgYmFjayB0byBzL3cgcGF0aCBpZiBkdWUgdG8gZXJyb3IuIik7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvblVzOwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJwb3NpdGlvblVzIiwgJnBvc2l0aW9uVXMpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRBdWRpb1RlYXJEb3duKSB7CiAgICAgICAgICAgICAgICAgaW50MzJfdCByZWFzb247CiAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlYXNvbiIsICZyZWFzb24pKTsKLSAgICAgICAgICAgICAgICBjbG9zZUF1ZGlvU2luaygpOworICAgICAgICAgICAgICAgIEFMT0dWKCJUZWFyIGRvd24gYXVkaW8gd2l0aCByZWFzb24gJWQuIiwgcmVhc29uKTsKICAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgKyttQXVkaW9EZWNvZGVyR2VuZXJhdGlvbjsKKyAgICAgICAgICAgICAgICBib29sIG5lZWRzVG9DcmVhdGVBdWRpb0RlY29kZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChtRmx1c2hpbmdBdWRpbyA9PSBGTFVTSElOR19ERUNPREVSKSB7CisgICAgICAgICAgICAgICAgICAgIG1GbHVzaENvbXBsZXRlWzEgLyogYXVkaW8gKi9dWzEgLyogaXNEZWNvZGVyICovXSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG1GbHVzaGluZ0F1ZGlvID0gRkxVU0hFRDsKKyAgICAgICAgICAgICAgICAgICAgZmluaXNoRmx1c2hJZlBvc3NpYmxlKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtRmx1c2hpbmdBdWRpbyA9PSBGTFVTSElOR19ERUNPREVSX1NIVVRET1dOCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBtRmx1c2hpbmdBdWRpbyA9PSBTSFVUVElOR19ET1dOX0RFQ09ERVIpIHsKKyAgICAgICAgICAgICAgICAgICAgbUZsdXNoQ29tcGxldGVbMSAvKiBhdWRpbyAqL11bMSAvKiBpc0RlY29kZXIgKi9dID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSBTSFVUX0RPV047CisgICAgICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOworICAgICAgICAgICAgICAgICAgICBuZWVkc1RvQ3JlYXRlQXVkaW9EZWNvZGVyID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtUmVuZGVyZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2xvc2VBdWRpb1NpbmsoKTsKICAgICAgICAgICAgICAgICBtUmVuZGVyZXItPmZsdXNoKAogICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBhdWRpbyAqLywgZmFsc2UgLyogbm90aWZ5Q29tcGxldGUgKi8pOwogICAgICAgICAgICAgICAgIGlmIChtVmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKQEAgLTg5OSwxMCArMTExNywxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGF1ZGlvICovLCBmYWxzZSAvKiBub3RpZnlDb21wbGV0ZSAqLyk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgcGVyZm9ybVNlZWsocG9zaXRpb25VcywgZmFsc2UgLyogbmVlZE5vdGlmeSAqLyk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYXNvbiA9PSBSZW5kZXJlcjo6a0R1ZVRvRXJyb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5zaWduYWxEaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1PZmZsb2FkQXVkaW8gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uVXM7CisgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQ2NCgicG9zaXRpb25VcyIsICZwb3NpdGlvblVzKSkgeworICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblVzID0gbVByZXZpb3VzU2Vla1RpbWVVczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGVyZm9ybVNlZWsocG9zaXRpb25Vcyk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVhc29uID09IFJlbmRlcmVyOjprRHVlVG9FcnJvciAmJiBuZWVkc1RvQ3JlYXRlQXVkaW9EZWNvZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlRGVjb2Rlcih0cnVlIC8qIGF1ZGlvICovLCAmbUF1ZGlvRGVjb2Rlcik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtOTM4LDE0ICsxMTU5LDMxIEBACiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigibmVlZE5vdGlmeSIsICZuZWVkTm90aWZ5KSk7CiAKICAgICAgICAgICAgIEFMT0dWKCJrV2hhdFNlZWsgc2Vla1RpbWVVcz0lbGxkIHVzLCBuZWVkTm90aWZ5PSVkIiwKLSAgICAgICAgICAgICAgICAgICAgc2Vla1RpbWVVcywgbmVlZE5vdGlmeSk7CisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc2Vla1RpbWVVcywgbmVlZE5vdGlmeSk7CisKKyAgICAgICAgICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBTZWVrIGJlZm9yZSB0aGUgcGxheWVyIGlzIHN0YXJ0ZWQuIEluIG9yZGVyIHRvIHByZXZpZXcgdmlkZW8sCisgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBzdGFydCB0aGUgcGxheWVyIGFuZCBwYXVzZSBpdC4gVGhpcyBicmFuY2ggaXMgY2FsbGVkCisgICAgICAgICAgICAgICAgLy8gb25seSBvbmNlIGlmIG5lZWRlZC4gQWZ0ZXIgdGhlIHBsYXllciBpcyBzdGFydGVkLCBhbnkgc2VlaworICAgICAgICAgICAgICAgIC8vIG9wZXJhdGlvbiB3aWxsIGdvIHRocm91Z2ggbm9ybWFsIHBhdGguCisgICAgICAgICAgICAgICAgLy8gQXVkaW8tb25seSBjYXNlcyBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgorICAgICAgICAgICAgICAgIG9uU3RhcnQoc2Vla1RpbWVVcyk7CisgICAgICAgICAgICAgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgICAgICAgICAgICAgIG9uUGF1c2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbVBhdXNlZEJ5Q2xpZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5lZWROb3RpZnkpIHsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5RHJpdmVyU2Vla0NvbXBsZXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKICAgICAgICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbihGTFVTSF9DTURfRkxVU0ggLyogYXVkaW8gKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxVU0hfQ01EX0ZMVVNIIC8qIHZpZGVvICovKSk7CiAKICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgICAgICBuZXcgU2Vla0FjdGlvbihzZWVrVGltZVVzLCBuZWVkTm90aWZ5KSk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBTZWVrQWN0aW9uKHNlZWtUaW1lVXMpKTsKIAogICAgICAgICAgICAgLy8gQWZ0ZXIgYSBmbHVzaCB3aXRob3V0IHNodXRkb3duLCBkZWNvZGVyIGlzIHBhdXNlZC4KICAgICAgICAgICAgIC8vIERvbid0IHJlc3VtZSBpdCB1bnRpbCBzb3VyY2Ugc2VlayBpcyBkb25lLCBvdGhlcndpc2UgaXQgY291bGQKQEAgLTEwMTcsNyArMTI1NSw3IEBACiAKICAgICAvLyBUUklDS1k6IFdlIHJlbHkgb24gbVJlbmRlcmVyIGJlaW5nIG51bGwsIHNvIHRoYXQgZGVjb2RlciBkb2VzIG5vdCBzdGFydCByZXF1ZXN0aW5nCiAgICAgLy8gZGF0YSBvbiBpbnN0YW50aWF0aW9uLgotICAgIGlmIChtTmF0aXZlV2luZG93ICE9IE5VTEwpIHsKKyAgICBpZiAobVN1cmZhY2UgIT0gTlVMTCkgewogICAgICAgICBlcnIgPSBpbnN0YW50aWF0ZURlY29kZXIoZmFsc2UsICZtVmlkZW9EZWNvZGVyKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTEwMzMsMTQgKzEyNzEsMjMgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgTnVQbGF5ZXI6Om9uU3RhcnQoKSB7Cit2b2lkIE51UGxheWVyOjpvblN0YXJ0KGludDY0X3Qgc3RhcnRQb3NpdGlvblVzKSB7CisgICAgaWYgKCFtU291cmNlU3RhcnRlZCkgeworICAgICAgICBtU291cmNlU3RhcnRlZCA9IHRydWU7CisgICAgICAgIG1Tb3VyY2UtPnN0YXJ0KCk7CisgICAgfQorICAgIGlmIChzdGFydFBvc2l0aW9uVXMgPiAwKSB7CisgICAgICAgIHBlcmZvcm1TZWVrKHN0YXJ0UG9zaXRpb25Vcyk7CisgICAgICAgIGlmIChtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKwogICAgIG1PZmZsb2FkQXVkaW8gPSBmYWxzZTsKICAgICBtQXVkaW9FT1MgPSBmYWxzZTsKICAgICBtVmlkZW9FT1MgPSBmYWxzZTsKICAgICBtU3RhcnRlZCA9IHRydWU7CiAKLSAgICBtU291cmNlLT5zdGFydCgpOwotCiAgICAgdWludDMyX3QgZmxhZ3MgPSAwOwogCiAgICAgaWYgKG1Tb3VyY2UtPmlzUmVhbFRpbWUoKSkgewpAQCAtMTA1NiwyNiArMTMwMywzMCBAQAogICAgIHNwPEFNZXNzYWdlPiB2aWRlb0Zvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLyk7CiAKICAgICBtT2ZmbG9hZEF1ZGlvID0KLSAgICAgICAgY2FuT2ZmbG9hZFN0cmVhbShhdWRpb01ldGEsICh2aWRlb0Zvcm1hdCAhPSBOVUxMKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGlzX3N0cmVhbWluZyAqLywgc3RyZWFtVHlwZSk7CisgICAgICAgIGNhbk9mZmxvYWRTdHJlYW0oYXVkaW9NZXRhLCAodmlkZW9Gb3JtYXQgIT0gTlVMTCksIG1Tb3VyY2UtPmlzU3RyZWFtaW5nKCksIHN0cmVhbVR5cGUpOwogICAgIGlmIChtT2ZmbG9hZEF1ZGlvKSB7CiAgICAgICAgIGZsYWdzIHw9IFJlbmRlcmVyOjpGTEFHX09GRkxPQURfQVVESU87CiAgICAgfQogCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbmRlcmVyTm90aWZ5LCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVuZGVyZXJOb3RpZnksIHRoaXMpOwogICAgICsrbVJlbmRlcmVyR2VuZXJhdGlvbjsKICAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVJlbmRlcmVyR2VuZXJhdGlvbik7CiAgICAgbVJlbmRlcmVyID0gbmV3IFJlbmRlcmVyKG1BdWRpb1NpbmssIG5vdGlmeSwgZmxhZ3MpOwotCiAgICAgbVJlbmRlcmVyTG9vcGVyID0gbmV3IEFMb29wZXI7CiAgICAgbVJlbmRlcmVyTG9vcGVyLT5zZXROYW1lKCJOdVBsYXllclJlbmRlcmVyIik7CiAgICAgbVJlbmRlcmVyTG9vcGVyLT5zdGFydChmYWxzZSwgZmFsc2UsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwogICAgIG1SZW5kZXJlckxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1SZW5kZXJlcik7CiAKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IGdldEZpbGVNZXRhKCk7Ci0gICAgaW50MzJfdCByYXRlOwotICAgIGlmIChtZXRhICE9IE5VTEwKLSAgICAgICAgICAgICYmIG1ldGEtPmZpbmRJbnQzMihrS2V5RnJhbWVSYXRlLCAmcmF0ZSkgJiYgcmF0ZSA+IDApIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBtUmVuZGVyZXItPnNldFBsYXliYWNrU2V0dGluZ3MobVBsYXliYWNrU2V0dGluZ3MpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworICAgICAgICBtU291cmNlU3RhcnRlZCA9IGZhbHNlOworICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZsb2F0IHJhdGUgPSBnZXRGcmFtZVJhdGUoKTsKKyAgICBpZiAocmF0ZSA+IDApIHsKICAgICAgICAgbVJlbmRlcmVyLT5zZXRWaWRlb0ZyYW1lUmF0ZShyYXRlKTsKICAgICB9CiAKQEAgLTExMzcsNiArMTM4OCw3IEBACiAgICAgICAgICAgICAgICAgLy8gV2lkZXZpbmUgc291cmNlIHJlYWRzIG11c3Qgc3RvcCBiZWZvcmUgcmVsZWFzaW5nIHRoZSB2aWRlbyBkZWNvZGVyLgogICAgICAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwgJiYgbVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1NFQ1VSRSkgewogICAgICAgICAgICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7CisgICAgICAgICAgICAgICAgICAgIG1Tb3VyY2VTdGFydGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZ2V0RGVjb2RlcihhdWRpbyktPmluaXRpYXRlU2h1dGRvd24oKTsKQEAgLTExNzYsNyArMTQyOCw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2NhblNvdXJjZXMsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTY2FuU291cmNlcywgdGhpcyk7CiAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1TY2FuU291cmNlc0dlbmVyYXRpb24pOwogICAgIG1zZy0+cG9zdCgpOwogCkBAIC0xMjAzLDggKzE0NTUsNDIgQEAKICAgICBtUmVuZGVyZXItPmNsb3NlQXVkaW9TaW5rKCk7CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OmRldGVybWluZUF1ZGlvTW9kZUNoYW5nZSgpIHsKKyAgICBpZiAobVNvdXJjZSA9PSBOVUxMIHx8IG1BdWRpb1NpbmsgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1SZW5kZXJlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJObyByZW5kZXJlciBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgYXVkaW8gbW9kZS4gVXNlIG5vbi1vZmZsb2FkIGZvciBzYWZldHkuIik7CisgICAgICAgIG1PZmZsb2FkQXVkaW8gPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPE1ldGFEYXRhPiBhdWRpb01ldGEgPSBtU291cmNlLT5nZXRGb3JtYXRNZXRhKHRydWUgLyogYXVkaW8gKi8pOworICAgIHNwPEFNZXNzYWdlPiB2aWRlb0Zvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLyk7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlID0gbUF1ZGlvU2luay0+Z2V0QXVkaW9TdHJlYW1UeXBlKCk7CisgICAgY29uc3QgYm9vbCBoYXNWaWRlbyA9ICh2aWRlb0Zvcm1hdCAhPSBOVUxMKTsKKyAgICBjb25zdCBib29sIGNhbk9mZmxvYWQgPSBjYW5PZmZsb2FkU3RyZWFtKAorICAgICAgICAgICAgYXVkaW9NZXRhLCBoYXNWaWRlbywgbVNvdXJjZS0+aXNTdHJlYW1pbmcoKSwgc3RyZWFtVHlwZSk7CisgICAgaWYgKGNhbk9mZmxvYWQpIHsKKyAgICAgICAgaWYgKCFtT2ZmbG9hZEF1ZGlvKSB7CisgICAgICAgICAgICBtUmVuZGVyZXItPnNpZ25hbEVuYWJsZU9mZmxvYWRBdWRpbygpOworICAgICAgICB9CisgICAgICAgIC8vIG9wZW4gYXVkaW8gc2luayBlYXJseSB1bmRlciBvZmZsb2FkIG1vZGUuCisgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQodHJ1ZSAvKmF1ZGlvKi8pOworICAgICAgICB0cnlPcGVuQXVkaW9TaW5rRm9yT2ZmbG9hZChmb3JtYXQsIGhhc1ZpZGVvKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobU9mZmxvYWRBdWRpbykgeworICAgICAgICAgICAgbVJlbmRlcmVyLT5zaWduYWxEaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7CisgICAgICAgICAgICBtT2ZmbG9hZEF1ZGlvID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHN0YXR1c190IE51UGxheWVyOjppbnN0YW50aWF0ZURlY29kZXIoYm9vbCBhdWRpbywgc3A8RGVjb2RlckJhc2U+ICpkZWNvZGVyKSB7Ci0gICAgaWYgKCpkZWNvZGVyICE9IE5VTEwpIHsKKyAgICAvLyBUaGUgYXVkaW8gZGVjb2RlciBjb3VsZCBiZSBjbGVhcmVkIGJ5IHRlYXIgZG93bi4gSWYgc3RpbGwgaW4gc2h1dCBkb3duCisgICAgLy8gcHJvY2Vzcywgbm8gbmVlZCB0byBjcmVhdGUgYSBuZXcgYXVkaW8gZGVjb2Rlci4KKyAgICBpZiAoKmRlY29kZXIgIT0gTlVMTCB8fCAoYXVkaW8gJiYgbUZsdXNoaW5nQXVkaW8gPT0gU0hVVF9ET1dOKSkgewogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCkBAIC0xMjE0LDExICsxNTAwLDEzIEBACiAgICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7CiAgICAgfQogCisgICAgZm9ybWF0LT5zZXRJbnQzMigicHJpb3JpdHkiLCAwIC8qIHJlYWx0aW1lICovKTsKKwogICAgIGlmICghYXVkaW8pIHsKICAgICAgICAgQVN0cmluZyBtaW1lOwogICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwogCi0gICAgICAgIHNwPEFNZXNzYWdlPiBjY05vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdENsb3NlZENhcHRpb25Ob3RpZnksIGlkKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gY2NOb3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDbG9zZWRDYXB0aW9uTm90aWZ5LCB0aGlzKTsKICAgICAgICAgaWYgKG1DQ0RlY29kZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgbUNDRGVjb2RlciA9IG5ldyBDQ0RlY29kZXIoY2NOb3RpZnkpOwogICAgICAgICB9CkBAIC0xMjMwLDI4ICsxNTE4LDM2IEBACiAgICAgICAgIGlmIChtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfUFJPVEVDVEVEKSB7CiAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJwcm90ZWN0ZWQiLCB0cnVlKTsKICAgICAgICAgfQorCisgICAgICAgIGZsb2F0IHJhdGUgPSBnZXRGcmFtZVJhdGUoKTsKKyAgICAgICAgaWYgKHJhdGUgPiAwKSB7CisgICAgICAgICAgICBmb3JtYXQtPnNldEZsb2F0KCJvcGVyYXRpbmctcmF0ZSIsIHJhdGUgKiBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBdWRpb05vdGlmeSwgaWQoKSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBdWRpb05vdGlmeSwgdGhpcyk7CiAgICAgICAgICsrbUF1ZGlvRGVjb2RlckdlbmVyYXRpb247CiAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQXVkaW9EZWNvZGVyR2VuZXJhdGlvbik7CiAKKyAgICAgICAgZGV0ZXJtaW5lQXVkaW9Nb2RlQ2hhbmdlKCk7CiAgICAgICAgIGlmIChtT2ZmbG9hZEF1ZGlvKSB7CisgICAgICAgICAgICBjb25zdCBib29sIGhhc1ZpZGVvID0gKG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKmF1ZGlvICovKSAhPSBOVUxMKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImhhcy12aWRlbyIsIGhhc1ZpZGVvKTsKICAgICAgICAgICAgICpkZWNvZGVyID0gbmV3IERlY29kZXJQYXNzVGhyb3VnaChub3RpZnksIG1Tb3VyY2UsIG1SZW5kZXJlcik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqZGVjb2RlciA9IG5ldyBEZWNvZGVyKG5vdGlmeSwgbVNvdXJjZSwgbVJlbmRlcmVyKTsKKyAgICAgICAgICAgICpkZWNvZGVyID0gbmV3IERlY29kZXIobm90aWZ5LCBtU291cmNlLCBtUElELCBtUmVuZGVyZXIpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFZpZGVvTm90aWZ5LCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFZpZGVvTm90aWZ5LCB0aGlzKTsKICAgICAgICAgKyttVmlkZW9EZWNvZGVyR2VuZXJhdGlvbjsKICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1WaWRlb0RlY29kZXJHZW5lcmF0aW9uKTsKIAogICAgICAgICAqZGVjb2RlciA9IG5ldyBEZWNvZGVyKAotICAgICAgICAgICAgICAgIG5vdGlmeSwgbVNvdXJjZSwgbVJlbmRlcmVyLCBtTmF0aXZlV2luZG93LCBtQ0NEZWNvZGVyKTsKKyAgICAgICAgICAgICAgICBub3RpZnksIG1Tb3VyY2UsIG1QSUQsIG1SZW5kZXJlciwgbVN1cmZhY2UsIG1DQ0RlY29kZXIpOwogCiAgICAgICAgIC8vIGVuYWJsZSBGUkMgaWYgaGlnaC1xdWFsaXR5IEFWIHN5bmMgaXMgcmVxdWVzdGVkLCBldmVuIGlmIG5vdAotICAgICAgICAvLyBxdWV1aW5nIHRvIG5hdGl2ZSB3aW5kb3csIGFzIHRoaXMgd2lsbCBldmVuIGltcHJvdmUgdGV4dHVyZXZpZXcKKyAgICAgICAgLy8gZGlyZWN0bHkgcXVldWluZyB0byBkaXNwbGF5LCBhcyB0aGlzIHdpbGwgZXZlbiBpbXByb3ZlIHRleHR1cmV2aWV3CiAgICAgICAgIC8vIHBsYXliYWNrLgogICAgICAgICB7CiAgICAgICAgICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CkBAIC0xMjk5LDggKzE1OTUsNiBAQAogICAgIH0KIAogICAgIGludDMyX3QgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0OwotICAgIGludDMyX3QgY3JvcExlZnQsIGNyb3BUb3AsIGNyb3BSaWdodCwgY3JvcEJvdHRvbTsKLQogICAgIGlmIChvdXRwdXRGb3JtYXQgIT0gTlVMTCkgewogICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CiAgICAgICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkpOwpAQCAtMTM4Miw3ICsxNjc2LDExIEBACiAKICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgY29udGludWUgdG8gc2NhbiBzb3VyY2VzIHVudGlsIHdlIGZpbmlzaCBmbHVzaGluZy4KICAgICArK21TY2FuU291cmNlc0dlbmVyYXRpb247Ci0gICAgbVNjYW5Tb3VyY2VzUGVuZGluZyA9IGZhbHNlOworICAgIGlmIChtU2NhblNvdXJjZXNQZW5kaW5nKSB7CisgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVBY3Rpb24oJk51UGxheWVyOjpwZXJmb3JtU2NhblNvdXJjZXMpKTsKKyAgICAgICAgbVNjYW5Tb3VyY2VzUGVuZGluZyA9IGZhbHNlOworICAgIH0KIAogICAgIGRlY29kZXItPnNpZ25hbEZsdXNoKCk7CiAKQEAgLTE0MjEsOSArMTcxOSw4IEBACiAKIHN0YXR1c190IE51UGxheWVyOjpzZXRWaWRlb1NjYWxpbmdNb2RlKGludDMyX3QgbW9kZSkgewogICAgIG1WaWRlb1NjYWxpbmdNb2RlID0gbW9kZTsKLSAgICBpZiAobU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7Ci0gICAgICAgIHN0YXR1c190IHJldCA9IG5hdGl2ZV93aW5kb3dfc2V0X3NjYWxpbmdfbW9kZSgKLSAgICAgICAgICAgICAgICBtTmF0aXZlV2luZG93LT5nZXROYXRpdmVXaW5kb3coKS5nZXQoKSwgbVZpZGVvU2NhbGluZ01vZGUpOworICAgIGlmIChtU3VyZmFjZSAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1c190IHJldCA9IG5hdGl2ZV93aW5kb3dfc2V0X3NjYWxpbmdfbW9kZShtU3VyZmFjZS5nZXQoKSwgbVZpZGVvU2NhbGluZ01vZGUpOwogICAgICAgICBpZiAocmV0ICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBzY2FsaW5nIG1vZGUgKCVkKTogJXMiLAogICAgICAgICAgICAgICAgIC1yZXQsIHN0cmVycm9yKC1yZXQpKTsKQEAgLTE0MzQsNyArMTczMSw3IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyOjpnZXRUcmFja0luZm8oUGFyY2VsKiByZXBseSkgY29uc3QgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRUcmFja0luZm8sIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRUcmFja0luZm8sIHRoaXMpOwogICAgIG1zZy0+c2V0UG9pbnRlcigicmVwbHkiLCByZXBseSk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CkBAIC0xNDQzLDcgKzE3NDAsNyBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllcjo6Z2V0U2VsZWN0ZWRUcmFjayhpbnQzMl90IHR5cGUsIFBhcmNlbCogcmVwbHkpIGNvbnN0IHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0U2VsZWN0ZWRUcmFjaywgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldFNlbGVjdGVkVHJhY2ssIHRoaXMpOwogICAgIG1zZy0+c2V0UG9pbnRlcigicmVwbHkiLCByZXBseSk7CiAgICAgbXNnLT5zZXRJbnQzMigidHlwZSIsIHR5cGUpOwogCkBAIC0xNDU2LDcgKzE3NTMsNyBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllcjo6c2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0LCBpbnQ2NF90IHRpbWVVcykgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWxlY3RUcmFjaywgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbGVjdFRyYWNrLCB0aGlzKTsKICAgICBtc2ctPnNldFNpemUoInRyYWNrSW5kZXgiLCB0cmFja0luZGV4KTsKICAgICBtc2ctPnNldEludDMyKCJzZWxlY3QiLCBzZWxlY3QpOwogICAgIG1zZy0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CkBAIC0xNDg0LDEzICsxNzgxLDE1IEBACiAgICAgcmV0dXJuIHJlbmRlcmVyLT5nZXRDdXJyZW50UG9zaXRpb24obWVkaWFVcyk7CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OmdldFN0YXRzKGludDY0X3QgKm51bUZyYW1lc1RvdGFsLCBpbnQ2NF90ICpudW1GcmFtZXNEcm9wcGVkKSB7Ci0gICAgc3A8RGVjb2RlckJhc2U+IGRlY29kZXIgPSBnZXREZWNvZGVyKGZhbHNlIC8qIGF1ZGlvICovKTsKLSAgICBpZiAoZGVjb2RlciAhPSBOVUxMKSB7Ci0gICAgICAgIGRlY29kZXItPmdldFN0YXRzKG51bUZyYW1lc1RvdGFsLCBudW1GcmFtZXNEcm9wcGVkKTsKLSAgICB9IGVsc2UgewotICAgICAgICAqbnVtRnJhbWVzVG90YWwgPSAwOwotICAgICAgICAqbnVtRnJhbWVzRHJvcHBlZCA9IDA7Cit2b2lkIE51UGxheWVyOjpnZXRTdGF0cyhWZWN0b3I8c3A8QU1lc3NhZ2U+ID4gKm1UcmFja1N0YXRzKSB7CisgICAgQ0hFQ0sobVRyYWNrU3RhdHMgIT0gTlVMTCk7CisKKyAgICBtVHJhY2tTdGF0cy0+Y2xlYXIoKTsKKyAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgIG1UcmFja1N0YXRzLT5wdXNoX2JhY2sobVZpZGVvRGVjb2Rlci0+Z2V0U3RhdHMoKSk7CisgICAgfQorICAgIGlmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgbVRyYWNrU3RhdHMtPnB1c2hfYmFjayhtQXVkaW9EZWNvZGVyLT5nZXRTdGF0cygpKTsKICAgICB9CiB9CiAKQEAgLTE0OTgsOCArMTc5NywzMCBAQAogICAgIHJldHVybiBtU291cmNlLT5nZXRGaWxlRm9ybWF0TWV0YSgpOwogfQogCitmbG9hdCBOdVBsYXllcjo6Z2V0RnJhbWVSYXRlKCkgeworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVNvdXJjZS0+Z2V0Rm9ybWF0TWV0YShmYWxzZSAvKiBhdWRpbyAqLyk7CisgICAgaWYgKG1ldGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50MzJfdCByYXRlOworICAgIGlmICghbWV0YS0+ZmluZEludDMyKGtLZXlGcmFtZVJhdGUsICZyYXRlKSkgeworICAgICAgICAvLyBmYWxsIGJhY2sgdG8gdHJ5IGZpbGUgbWV0YQorICAgICAgICBzcDxNZXRhRGF0YT4gZmlsZU1ldGEgPSBnZXRGaWxlTWV0YSgpOworICAgICAgICBpZiAoZmlsZU1ldGEgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR1coInNvdXJjZSBoYXMgdmlkZW8gbWV0YSBidXQgbm90IGZpbGUgbWV0YSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGludDMyX3QgZmlsZU1ldGFSYXRlOworICAgICAgICBpZiAoIWZpbGVNZXRhLT5maW5kSW50MzIoa0tleUZyYW1lUmF0ZSwgJmZpbGVNZXRhUmF0ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmlsZU1ldGFSYXRlOworICAgIH0KKyAgICByZXR1cm4gcmF0ZTsKK30KKwogdm9pZCBOdVBsYXllcjo6c2NoZWR1bGVQb2xsRHVyYXRpb24oKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBvbGxEdXJhdGlvbiwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBvbGxEdXJhdGlvbiwgdGhpcyk7CiAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1Qb2xsRHVyYXRpb25HZW5lcmF0aW9uKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KQEAgLTE1MzEsMTEgKzE4NTIsMTAgQEAKICAgICB9CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OnBlcmZvcm1TZWVrKGludDY0X3Qgc2Vla1RpbWVVcywgYm9vbCBuZWVkTm90aWZ5KSB7Ci0gICAgQUxPR1YoInBlcmZvcm1TZWVrIHNlZWtUaW1lVXM9JWxsZCB1cyAoJS4yZiBzZWNzKSwgbmVlZE5vdGlmeSglZCkiLAotICAgICAgICAgIHNlZWtUaW1lVXMsCi0gICAgICAgICAgc2Vla1RpbWVVcyAvIDFFNiwKLSAgICAgICAgICBuZWVkTm90aWZ5KTsKK3ZvaWQgTnVQbGF5ZXI6OnBlcmZvcm1TZWVrKGludDY0X3Qgc2Vla1RpbWVVcykgeworICAgIEFMT0dWKCJwZXJmb3JtU2VlayBzZWVrVGltZVVzPSVsbGQgdXMgKCUuMmYgc2VjcykiLAorICAgICAgICAgIChsb25nIGxvbmcpc2Vla1RpbWVVcywKKyAgICAgICAgICBzZWVrVGltZVVzIC8gMUU2KTsKIAogICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKICAgICAgICAgLy8gVGhpcyBoYXBwZW5zIHdoZW4gcmVzZXQgb2NjdXJzIHJpZ2h0IGJlZm9yZSB0aGUgbG9vcCBtb2RlCkBAIC0xNTQ1LDYgKzE4NjUsNyBAQAogICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXIuZ2V0KCksIG1WaWRlb0RlY29kZXIuZ2V0KCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQorICAgIG1QcmV2aW91c1NlZWtUaW1lVXMgPSBzZWVrVGltZVVzOwogICAgIG1Tb3VyY2UtPnNlZWtUbyhzZWVrVGltZVVzKTsKICAgICArK21UaW1lZFRleHRHZW5lcmF0aW9uOwogCkBAIC0xNjAzLDYgKzE5MjQsNyBAQAogICAgIH0KIAogICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgbVNvdXJjZVN0YXJ0ZWQgPSBmYWxzZTsKIH0KIAogdm9pZCBOdVBsYXllcjo6cGVyZm9ybVNjYW5Tb3VyY2VzKCkgewpAQCAtMTYxNywxMCArMTkzOSwxMCBAQAogICAgIH0KIH0KIAotdm9pZCBOdVBsYXllcjo6cGVyZm9ybVNldFN1cmZhY2UoY29uc3Qgc3A8TmF0aXZlV2luZG93V3JhcHBlcj4gJndyYXBwZXIpIHsKK3ZvaWQgTnVQbGF5ZXI6OnBlcmZvcm1TZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7CiAgICAgQUxPR1YoInBlcmZvcm1TZXRTdXJmYWNlIik7CiAKLSAgICBtTmF0aXZlV2luZG93ID0gd3JhcHBlcjsKKyAgICBtU3VyZmFjZSA9IHN1cmZhY2U7CiAKICAgICAvLyBYWFggLSBpZ25vcmUgZXJyb3IgZnJvbSBzZXRWaWRlb1NjYWxpbmdNb2RlIGZvciBub3cKICAgICBzZXRWaWRlb1NjYWxpbmdNb2RlKG1WaWRlb1NjYWxpbmdNb2RlKTsKQEAgLTE2NjAsMTEgKzE5ODIsMTUgQEAKIHZvaWQgTnVQbGF5ZXI6OmZpbmlzaFJlc3VtZSgpIHsKICAgICBpZiAobVJlc3VtZVBlbmRpbmcpIHsKICAgICAgICAgbVJlc3VtZVBlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgc3A8TnVQbGF5ZXJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwotICAgICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlTZWVrQ29tcGxldGUoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgbm90aWZ5RHJpdmVyU2Vla0NvbXBsZXRlKCk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpub3RpZnlEcml2ZXJTZWVrQ29tcGxldGUoKSB7CisgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCkgeworICAgICAgICBzcDxOdVBsYXllckRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlTZWVrQ29tcGxldGUoKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTE3NzMsOSArMjA5OSwxMCBAQAogICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRQYXVzZU9uQnVmZmVyaW5nU3RhcnQ6CiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIGlnbm9yZSBpZiBub3QgcGxheWluZwotICAgICAgICAgICAgaWYgKG1TdGFydGVkICYmICFtUGF1c2VkQnlDbGllbnQpIHsKKyAgICAgICAgICAgIGlmIChtU3RhcnRlZCkgewogICAgICAgICAgICAgICAgIEFMT0dJKCJidWZmZXIgbG93LCBwYXVzaW5nLi4uIik7CiAKKyAgICAgICAgICAgICAgICBtUGF1c2VkRm9yQnVmZmVyaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBvblBhdXNlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBmYWxsLXRocnUKQEAgLTE3OTAsMTAgKzIxMTcsMTUgQEAKICAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0UmVzdW1lT25CdWZmZXJpbmdFbmQ6CiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIGlnbm9yZSBpZiBub3QgcGxheWluZwotICAgICAgICAgICAgaWYgKG1TdGFydGVkICYmICFtUGF1c2VkQnlDbGllbnQpIHsKKyAgICAgICAgICAgIGlmIChtU3RhcnRlZCkgewogICAgICAgICAgICAgICAgIEFMT0dJKCJidWZmZXIgcmVhZHksIHJlc3VtaW5nLi4uIik7CiAKLSAgICAgICAgICAgICAgICBvblJlc3VtZSgpOworICAgICAgICAgICAgICAgIG1QYXVzZWRGb3JCdWZmZXJpbmcgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIC8vIGRvIG5vdCByZXN1bWUgeWV0IGlmIGNsaWVudCBkaWRuJ3QgdW5wYXVzZQorICAgICAgICAgICAgICAgIGlmICghbVBhdXNlZEJ5Q2xpZW50KSB7CisgICAgICAgICAgICAgICAgICAgIG9uUmVzdW1lKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gZmFsbC10aHJ1CiAgICAgICAgIH0KQEAgLTE4MjIsNiArMjE1NCwxNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRUaW1lZE1ldGFEYXRhOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEJ1ZmZlcigiYnVmZmVyIiwgJmJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9JTkZPLCBNRURJQV9JTkZPX01FVEFEQVRBX1VQREFURSwgMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlbmRUaW1lZE1ldGFEYXRhKGJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgU291cmNlOjprV2hhdFRpbWVkVGV4dERhdGE6CiAgICAgICAgIHsKICAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKQEAgLTE5MzAsNiArMjI3MywxOSBAQAogICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1NVQlRJVExFX0RBVEEsIDAsIDAsICZpbik7CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OnNlbmRUaW1lZE1ldGFEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisKKyAgICBQYXJjZWwgaW47CisgICAgaW4ud3JpdGVJbnQ2NCh0aW1lVXMpOworICAgIGluLndyaXRlSW50MzIoYnVmZmVyLT5zaXplKCkpOworICAgIGluLndyaXRlSW50MzIoYnVmZmVyLT5zaXplKCkpOworICAgIGluLndyaXRlKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisKKyAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9NRVRBX0RBVEEsIDAsIDAsICZpbik7Cit9CisKIHZvaWQgTnVQbGF5ZXI6OnNlbmRUaW1lZFRleHREYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKICAgICBjb25zdCB2b2lkICpkYXRhOwogICAgIHNpemVfdCBzaXplID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmgKaW5kZXggMzBlZGUxYS4uYzlmMGJiZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmgKQEAgLTE4LDE5ICsxOCwyMiBAQAogCiAjZGVmaW5lIE5VX1BMQVlFUl9IXwogCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9OYXRpdmVXaW5kb3dXcmFwcGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFCdWZmZXI7CiBzdHJ1Y3QgQU1lc3NhZ2U7CitzdHJ1Y3QgQXVkaW9QbGF5YmFja1JhdGU7CitzdHJ1Y3QgQVZTeW5jU2V0dGluZ3M7CitjbGFzcyBJRGF0YVNvdXJjZTsKIGNsYXNzIE1ldGFEYXRhOwogc3RydWN0IE51UGxheWVyRHJpdmVyOwogCiBzdHJ1Y3QgTnVQbGF5ZXIgOiBwdWJsaWMgQUhhbmRsZXIgewotICAgIE51UGxheWVyKCk7CisgICAgTnVQbGF5ZXIocGlkX3QgcGlkKTsKIAogICAgIHZvaWQgc2V0VUlEKHVpZF90IHVpZCk7CiAKQEAgLTQ1LDEyICs0OCwxOSBAQAogCiAgICAgdm9pZCBzZXREYXRhU291cmNlQXN5bmMoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogCisgICAgdm9pZCBzZXREYXRhU291cmNlQXN5bmMoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSk7CisKICAgICB2b2lkIHByZXBhcmVBc3luYygpOwogCiAgICAgdm9pZCBzZXRWaWRlb1N1cmZhY2VUZXh0dXJlQXN5bmMoCiAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmYnVmZmVyUHJvZHVjZXIpOwogCiAgICAgdm9pZCBzZXRBdWRpb1NpbmsoY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+ICZzaW5rKTsKKyAgICBzdGF0dXNfdCBzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKTsKKyAgICBzdGF0dXNfdCBnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlIC8qIG5vbm51bGwgKi8pOworICAgIHN0YXR1c190IHNldFN5bmNTZXR0aW5ncyhjb25zdCBBVlN5bmNTZXR0aW5ncyAmc3luYywgZmxvYXQgdmlkZW9GcHNIaW50KTsKKyAgICBzdGF0dXNfdCBnZXRTeW5jU2V0dGluZ3MoQVZTeW5jU2V0dGluZ3MgKnN5bmMgLyogbm9ubnVsbCAqLywgZmxvYXQgKnZpZGVvRnBzIC8qIG5vbm51bGwgKi8pOworCiAgICAgdm9pZCBzdGFydCgpOwogCiAgICAgdm9pZCBwYXVzZSgpOwpAQCAtNjcsOSArNzcsMTAgQEAKICAgICBzdGF0dXNfdCBnZXRTZWxlY3RlZFRyYWNrKGludDMyX3QgdHlwZSwgUGFyY2VsKiByZXBseSkgY29uc3Q7CiAgICAgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0LCBpbnQ2NF90IHRpbWVVcyk7CiAgICAgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uKGludDY0X3QgKm1lZGlhVXMpOwotICAgIHZvaWQgZ2V0U3RhdHMoaW50NjRfdCAqbU51bUZyYW1lc1RvdGFsLCBpbnQ2NF90ICptTnVtRnJhbWVzRHJvcHBlZCk7CisgICAgdm9pZCBnZXRTdGF0cyhWZWN0b3I8c3A8QU1lc3NhZ2U+ID4gKm1UcmFja1N0YXRzKTsKIAogICAgIHNwPE1ldGFEYXRhPiBnZXRGaWxlTWV0YSgpOworICAgIGZsb2F0IGdldEZyYW1lUmF0ZSgpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TnVQbGF5ZXIoKTsKQEAgLTEwMSw5ICsxMTIsMTMgQEAKICAgICBlbnVtIHsKICAgICAgICAga1doYXRTZXREYXRhU291cmNlICAgICAgICAgICAgICA9ICc9RGFTJywKICAgICAgICAga1doYXRQcmVwYXJlICAgICAgICAgICAgICAgICAgICA9ICdwcmVwJywKLSAgICAgICAga1doYXRTZXRWaWRlb05hdGl2ZVdpbmRvdyAgICAgICA9ICc9TmFXJywKKyAgICAgICAga1doYXRTZXRWaWRlb1N1cmZhY2UgICAgICAgICAgICA9ICc9VlN1JywKICAgICAgICAga1doYXRTZXRBdWRpb1NpbmsgICAgICAgICAgICAgICA9ICc9QXVTJywKICAgICAgICAga1doYXRNb3JlRGF0YVF1ZXVlZCAgICAgICAgICAgICA9ICdtb3JlJywKKyAgICAgICAga1doYXRDb25maWdQbGF5YmFjayAgICAgICAgICAgICA9ICdjZlBCJywKKyAgICAgICAga1doYXRDb25maWdTeW5jICAgICAgICAgICAgICAgICA9ICdjZlN5JywKKyAgICAgICAga1doYXRHZXRQbGF5YmFja1NldHRpbmdzICAgICAgICA9ICdnUGJTJywKKyAgICAgICAga1doYXRHZXRTeW5jU2V0dGluZ3MgICAgICAgICAgICA9ICdnU3lTJywKICAgICAgICAga1doYXRTdGFydCAgICAgICAgICAgICAgICAgICAgICA9ICdzdHJ0JywKICAgICAgICAga1doYXRTY2FuU291cmNlcyAgICAgICAgICAgICAgICA9ICdzY2FuJywKICAgICAgICAga1doYXRWaWRlb05vdGlmeSAgICAgICAgICAgICAgICA9ICd2aWROJywKQEAgLTEyNCw5ICsxMzksMTAgQEAKICAgICB3cDxOdVBsYXllckRyaXZlcj4gbURyaXZlcjsKICAgICBib29sIG1VSURWYWxpZDsKICAgICB1aWRfdCBtVUlEOworICAgIHBpZF90IG1QSUQ7CiAgICAgc3A8U291cmNlPiBtU291cmNlOwogICAgIHVpbnQzMl90IG1Tb3VyY2VGbGFnczsKLSAgICBzcDxOYXRpdmVXaW5kb3dXcmFwcGVyPiBtTmF0aXZlV2luZG93OworICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlOwogICAgIHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiBtQXVkaW9TaW5rOwogICAgIHNwPERlY29kZXJCYXNlPiBtVmlkZW9EZWNvZGVyOwogICAgIGJvb2wgbU9mZmxvYWRBdWRpbzsKQEAgLTEzOCw2ICsxNTQsOCBAQAogICAgIGludDMyX3QgbVZpZGVvRGVjb2RlckdlbmVyYXRpb247CiAgICAgaW50MzJfdCBtUmVuZGVyZXJHZW5lcmF0aW9uOwogCisgICAgaW50NjRfdCBtUHJldmlvdXNTZWVrVGltZVVzOworCiAgICAgTGlzdDxzcDxBY3Rpb24+ID4gbURlZmVycmVkQWN0aW9uczsKIAogICAgIGJvb2wgbUF1ZGlvRU9TOwpAQCAtMTc1LDcgKzE5MywxMSBAQAogCiAgICAgaW50MzJfdCBtVmlkZW9TY2FsaW5nTW9kZTsKIAorICAgIEF1ZGlvUGxheWJhY2tSYXRlIG1QbGF5YmFja1NldHRpbmdzOworICAgIEFWU3luY1NldHRpbmdzIG1TeW5jU2V0dGluZ3M7CisgICAgZmxvYXQgbVZpZGVvRnBzSGludDsKICAgICBib29sIG1TdGFydGVkOworICAgIGJvb2wgbVNvdXJjZVN0YXJ0ZWQ7CiAKICAgICAvLyBBY3R1YWwgcGF1c2Ugc3RhdGUsIGVpdGhlciBhcyByZXF1ZXN0ZWQgYnkgY2xpZW50IG9yIGR1ZSB0byBidWZmZXJpbmcuCiAgICAgYm9vbCBtUGF1c2VkOwpAQCAtMTg1LDYgKzIwNyw5IEBACiAgICAgLy8gc3RpbGwgYmVjb21lIHRydWUsIHdoZW4gd2UgcGF1c2UgaW50ZXJuYWxseSBkdWUgdG8gYnVmZmVyaW5nLgogICAgIGJvb2wgbVBhdXNlZEJ5Q2xpZW50OwogCisgICAgLy8gUGF1c2Ugc3RhdGUgYXMgcmVxdWVzdGVkIGJ5IHNvdXJjZSAoaW50ZXJuYWxseSkgZHVlIHRvIGJ1ZmZlcmluZworICAgIGJvb2wgbVBhdXNlZEZvckJ1ZmZlcmluZzsKKwogICAgIGlubGluZSBjb25zdCBzcDxEZWNvZGVyQmFzZT4gJmdldERlY29kZXIoYm9vbCBhdWRpbykgewogICAgICAgICByZXR1cm4gYXVkaW8gPyBtQXVkaW9EZWNvZGVyIDogbVZpZGVvRGVjb2RlcjsKICAgICB9CkBAIC0xOTgsNiArMjIzLDcgQEAKIAogICAgIHZvaWQgdHJ5T3BlbkF1ZGlvU2lua0Zvck9mZmxvYWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGJvb2wgaGFzVmlkZW8pOwogICAgIHZvaWQgY2xvc2VBdWRpb1NpbmsoKTsKKyAgICB2b2lkIGRldGVybWluZUF1ZGlvTW9kZUNoYW5nZSgpOwogCiAgICAgc3RhdHVzX3QgaW5zdGFudGlhdGVEZWNvZGVyKGJvb2wgYXVkaW8sIHNwPERlY29kZXJCYXNlPiAqZGVjb2Rlcik7CiAKQEAgLTIxMiw3ICsyMzgsNyBAQAogICAgIHZvaWQgaGFuZGxlRmx1c2hDb21wbGV0ZShib29sIGF1ZGlvLCBib29sIGlzRGVjb2Rlcik7CiAgICAgdm9pZCBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKIAotICAgIHZvaWQgb25TdGFydCgpOworICAgIHZvaWQgb25TdGFydChpbnQ2NF90IHN0YXJ0UG9zaXRpb25VcyA9IC0xKTsKICAgICB2b2lkIG9uUmVzdW1lKCk7CiAgICAgdm9pZCBvblBhdXNlKCk7CiAKQEAgLTIyMSw2ICsyNDcsNyBAQAogICAgIHZvaWQgZmx1c2hEZWNvZGVyKGJvb2wgYXVkaW8sIGJvb2wgbmVlZFNodXRkb3duKTsKIAogICAgIHZvaWQgZmluaXNoUmVzdW1lKCk7CisgICAgdm9pZCBub3RpZnlEcml2ZXJTZWVrQ29tcGxldGUoKTsKIAogICAgIHZvaWQgcG9zdFNjYW5Tb3VyY2VzKCk7CiAKQEAgLTIyOSwxMSArMjU2LDExIEBACiAKICAgICB2b2lkIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKIAotICAgIHZvaWQgcGVyZm9ybVNlZWsoaW50NjRfdCBzZWVrVGltZVVzLCBib29sIG5lZWROb3RpZnkpOworICAgIHZvaWQgcGVyZm9ybVNlZWsoaW50NjRfdCBzZWVrVGltZVVzKTsKICAgICB2b2lkIHBlcmZvcm1EZWNvZGVyRmx1c2goRmx1c2hDb21tYW5kIGF1ZGlvLCBGbHVzaENvbW1hbmQgdmlkZW8pOwogICAgIHZvaWQgcGVyZm9ybVJlc2V0KCk7CiAgICAgdm9pZCBwZXJmb3JtU2NhblNvdXJjZXMoKTsKLSAgICB2b2lkIHBlcmZvcm1TZXRTdXJmYWNlKGNvbnN0IHNwPE5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZ3cmFwcGVyKTsKKyAgICB2b2lkIHBlcmZvcm1TZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZ3cmFwcGVyKTsKICAgICB2b2lkIHBlcmZvcm1SZXN1bWVEZWNvZGVycyhib29sIG5lZWROb3RpZnkpOwogCiAgICAgdm9pZCBvblNvdXJjZU5vdGlmeShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CkBAIC0yNDMsNiArMjcwLDcgQEAKICAgICAgICAgICAgIGJvb2wgYXVkaW8sIGJvb2wgdmlkZW8sIGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpOwogCiAgICAgdm9pZCBzZW5kU3VidGl0bGVEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsIGludDMyX3QgYmFzZUluZGV4KTsKKyAgICB2b2lkIHNlbmRUaW1lZE1ldGFEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogICAgIHZvaWQgc2VuZFRpbWVkVGV4dERhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAKICAgICB2b2lkIHdyaXRlVHJhY2tJbmZvKFBhcmNlbCogcmVwbHksIGNvbnN0IHNwPEFNZXNzYWdlPiBmb3JtYXQpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5jcHAKaW5kZXggOTIyOTcwNC4uYWMzYzZiNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAorI2luY2x1ZGUgImF2Y191dGlscy5oIgogI2luY2x1ZGUgIk51UGxheWVyQ0NEZWNvZGVyLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KQEAgLTUwLDYgKzUxLDcgQEAKICAgICByZXR1cm4gY2MtPm1EYXRhMSA8IDB4MTAgJiYgY2MtPm1EYXRhMiA8IDB4MTA7CiB9CiAKK3N0YXRpYyB2b2lkIGR1bXBCeXRlUGFpcihjb25zdCBzcDxBQnVmZmVyPiAmY2NCdWYpIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKIHN0YXRpYyB2b2lkIGR1bXBCeXRlUGFpcihjb25zdCBzcDxBQnVmZmVyPiAmY2NCdWYpIHsKICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKICAgICBBU3RyaW5nIG91dDsKQEAgLTE4NSwxNyArMTg3LDM4IEBACiAKIC8vIHJldHVybnMgdHJ1ZSBpZiBhIG5ldyBDQyB0cmFjayBpcyBmb3VuZAogYm9vbCBOdVBsYXllcjo6Q0NEZWNvZGVyOjpleHRyYWN0RnJvbVNFSShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCkgewotICAgIGludDY0X3QgdGltZVVzOwotICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7Ci0KICAgICBzcDxBQnVmZmVyPiBzZWk7CiAgICAgaWYgKCFhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRCdWZmZXIoInNlaSIsICZzZWkpIHx8IHNlaSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworCiAgICAgYm9vbCB0cmFja0FkZGVkID0gZmFsc2U7CiAKLSAgICBOQUxCaXRSZWFkZXIgYnIoc2VpLT5kYXRhKCkgKyAxLCBzZWktPnNpemUoKSAtIDEpOworICAgIGNvbnN0IE5BTFBvc2l0aW9uICpuYWwgPSAoTkFMUG9zaXRpb24gKikgc2VpLT5kYXRhKCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNlaS0+c2l6ZSgpIC8gc2l6ZW9mKE5BTFBvc2l0aW9uKTsgKytpLCArK25hbCkgeworICAgICAgICB0cmFja0FkZGVkIHw9IHBhcnNlU0VJTmFsVW5pdCgKKyAgICAgICAgICAgICAgICB0aW1lVXMsIGFjY2Vzc1VuaXQtPmRhdGEoKSArIG5hbC0+bmFsT2Zmc2V0LCBuYWwtPm5hbFNpemUpOworICAgIH0KKworICAgIHJldHVybiB0cmFja0FkZGVkOworfQorCisvLyByZXR1cm5zIHRydWUgaWYgYSBuZXcgQ0MgdHJhY2sgaXMgZm91bmQKK2Jvb2wgTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6cGFyc2VTRUlOYWxVbml0KAorICAgICAgICBpbnQ2NF90IHRpbWVVcywgY29uc3QgdWludDhfdCAqbmFsU3RhcnQsIHNpemVfdCBuYWxTaXplKSB7CisgICAgdW5zaWduZWQgbmFsVHlwZSA9IG5hbFN0YXJ0WzBdICYgMHgxZjsKKworICAgIC8vIHRoZSBidWZmZXIgc2hvdWxkIG9ubHkgaGF2ZSBTRUkgaW4gaXQKKyAgICBpZiAobmFsVHlwZSAhPSA2KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIHRyYWNrQWRkZWQgPSBmYWxzZTsKKyAgICBOQUxCaXRSZWFkZXIgYnIobmFsU3RhcnQgKyAxLCBuYWxTaXplIC0gMSk7CiAgICAgLy8gc2VpX21lc3NhZ2UoKQogICAgIHdoaWxlIChici5hdExlYXN0TnVtQml0c0xlZnQoMTYpKSB7IC8vIGF0IGxlYXN0IDE2LWJpdCBmb3Igc2VpX21lc3NhZ2UoKQogICAgICAgICB1aW50MzJfdCBwYXlsb2FkX3R5cGUgPSAwOwpAQCAtMjE0LDIwICsyMzcsMjUgQEAKIAogICAgICAgICAvLyBzZWlfcGF5bG9hZCgpCiAgICAgICAgIGlmIChwYXlsb2FkX3R5cGUgPT0gNCkgewotICAgICAgICAgICAgLy8gdXNlcl9kYXRhX3JlZ2lzdGVyZWRfaXR1X3RfdDM1KCkKKyAgICAgICAgICAgIGJvb2wgaXNDQyA9IGZhbHNlOworICAgICAgICAgICAgaWYgKHBheWxvYWRfc2l6ZSA+IDEgKyAyICsgNCArIDEpIHsKKyAgICAgICAgICAgICAgICAvLyB1c2VyX2RhdGFfcmVnaXN0ZXJlZF9pdHVfdF90MzUoKQogCi0gICAgICAgICAgICAvLyBBVFNDIEEvNzI6IDYuNC4yCi0gICAgICAgICAgICB1aW50OF90IGl0dV90X3QzNV9jb3VudHJ5X2NvZGUgPSBici5nZXRCaXRzKDgpOwotICAgICAgICAgICAgdWludDE2X3QgaXR1X3RfdDM1X3Byb3ZpZGVyX2NvZGUgPSBici5nZXRCaXRzKDE2KTsKLSAgICAgICAgICAgIHVpbnQzMl90IHVzZXJfaWRlbnRpZmllciA9IGJyLmdldEJpdHMoMzIpOwotICAgICAgICAgICAgdWludDhfdCB1c2VyX2RhdGFfdHlwZV9jb2RlID0gYnIuZ2V0Qml0cyg4KTsKKyAgICAgICAgICAgICAgICAvLyBBVFNDIEEvNzI6IDYuNC4yCisgICAgICAgICAgICAgICAgdWludDhfdCBpdHVfdF90MzVfY291bnRyeV9jb2RlID0gYnIuZ2V0Qml0cyg4KTsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpdHVfdF90MzVfcHJvdmlkZXJfY29kZSA9IGJyLmdldEJpdHMoMTYpOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHVzZXJfaWRlbnRpZmllciA9IGJyLmdldEJpdHMoMzIpOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdXNlcl9kYXRhX3R5cGVfY29kZSA9IGJyLmdldEJpdHMoOCk7CiAKLSAgICAgICAgICAgIHBheWxvYWRfc2l6ZSAtPSAxICsgMiArIDQgKyAxOworICAgICAgICAgICAgICAgIHBheWxvYWRfc2l6ZSAtPSAxICsgMiArIDQgKyAxOwogCi0gICAgICAgICAgICBpZiAoaXR1X3RfdDM1X2NvdW50cnlfY29kZSA9PSAweEI1Ci0gICAgICAgICAgICAgICAgICAgICYmIGl0dV90X3QzNV9wcm92aWRlcl9jb2RlID09IDB4MDAzMQotICAgICAgICAgICAgICAgICAgICAmJiB1c2VyX2lkZW50aWZpZXIgPT0gJ0dBOTQnCi0gICAgICAgICAgICAgICAgICAgICYmIHVzZXJfZGF0YV90eXBlX2NvZGUgPT0gMHgzKSB7CisgICAgICAgICAgICAgICAgaXNDQyA9IGl0dV90X3QzNV9jb3VudHJ5X2NvZGUgPT0gMHhCNQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgaXR1X3RfdDM1X3Byb3ZpZGVyX2NvZGUgPT0gMHgwMDMxCisgICAgICAgICAgICAgICAgICAgICAgICAmJiB1c2VyX2lkZW50aWZpZXIgPT0gJ0dBOTQnCisgICAgICAgICAgICAgICAgICAgICAgICAmJiB1c2VyX2RhdGFfdHlwZV9jb2RlID09IDB4MzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlzQ0MgJiYgcGF5bG9hZF9zaXplID4gMikgewogICAgICAgICAgICAgICAgIC8vIE1QRUdfY2NfZGF0YSgpCiAgICAgICAgICAgICAgICAgLy8gQVRTQyBBLzUzIFBhcnQgNDogNi4yLjMuMQogICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDEpOyAvL3Byb2Nlc3NfZW1fZGF0YV9mbGFnCkBAIC0yNDMsNyArMjcxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gY2NCdWYgPSBuZXcgQUJ1ZmZlcihjY19jb3VudCAqIHNpemVvZihDQ0RhdGEpKTsKICAgICAgICAgICAgICAgICAgICAgY2NCdWYtPnNldFJhbmdlKDAsIDApOwogCi0gICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2NfY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNjX2NvdW50ICYmIHBheWxvYWRfc2l6ZSA+PSAzOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWFya2VyID0gYnIuZ2V0Qml0cyg1KTsKICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1hcmtlciwgMHgxZik7CiAKQEAgLTI1Myw2ICsyODEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjY19kYXRhXzEgPSBici5nZXRCaXRzKDgpICYgMHg3ZjsKICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2NfZGF0YV8yID0gYnIuZ2V0Qml0cyg4KSAmIDB4N2Y7CiAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfc2l6ZSAtPSAzOworCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2NfdmFsaWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNjX3R5cGUgPT0gMCB8fCBjY190eXBlID09IDEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NEYXRhIGNjKGNjX3R5cGUsIGNjX2RhdGFfMSwgY2NfZGF0YV8yKTsKQEAgLTI2OSw3ICsyOTksNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3NpemUgLT0gY2NfY291bnQgKiAzOwogCiAgICAgICAgICAgICAgICAgICAgIG1DQ01hcC5hZGQodGltZVVzLCBjY0J1Zik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuaAppbmRleCA1ZTA2ZjRlLi43N2ZiMGZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuaApAQCAtNDksNiArNDksNyBAQAogICAgIGJvb2wgaXNUcmFja1ZhbGlkKHNpemVfdCBpbmRleCkgY29uc3Q7CiAgICAgaW50MzJfdCBnZXRUcmFja0luZGV4KHNpemVfdCBjaGFubmVsKSBjb25zdDsKICAgICBib29sIGV4dHJhY3RGcm9tU0VJKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KTsKKyAgICBib29sIHBhcnNlU0VJTmFsVW5pdChpbnQ2NF90IHRpbWVVcywgY29uc3QgdWludDhfdCAqbmFsU3RhcnQsIHNpemVfdCBuYWxTaXplKTsKICAgICBzcDxBQnVmZmVyPiBmaWx0ZXJDQ0J1Zihjb25zdCBzcDxBQnVmZmVyPiAmY2NCdWYsIHNpemVfdCBpbmRleCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDQ0RlY29kZXIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcAppbmRleCA1ZDk4ZDk4Li4zNjQ2ODI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgIk51UGxheWVyUmVuZGVyZXIuaCIKICNpbmNsdWRlICJOdVBsYXllclNvdXJjZS5oIgogCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTMzLDI5ICszNCw0MSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAKKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorCiAjaW5jbHVkZSAiYXZjX3V0aWxzLmgiCiAjaW5jbHVkZSAiQVRTUGFyc2VyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RhdGljIGlubGluZSBib29sIGdldEF1ZGlvRGVlcEJ1ZmZlclNldHRpbmcoKSB7CisgICAgcmV0dXJuIHByb3BlcnR5X2dldF9ib29sKCJtZWRpYS5zdGFnZWZyaWdodC5hdWRpby5kZWVwIiwgZmFsc2UgLyogZGVmYXVsdF92YWx1ZSAqLyk7Cit9CisKIE51UGxheWVyOjpEZWNvZGVyOjpEZWNvZGVyKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKICAgICAgICAgY29uc3Qgc3A8U291cmNlPiAmc291cmNlLAorICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgIGNvbnN0IHNwPFJlbmRlcmVyPiAmcmVuZGVyZXIsCi0gICAgICAgIGNvbnN0IHNwPE5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZuYXRpdmVXaW5kb3csCisgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLAogICAgICAgICBjb25zdCBzcDxDQ0RlY29kZXI+ICZjY0RlY29kZXIpCiAgICAgOiBEZWNvZGVyQmFzZShub3RpZnkpLAotICAgICAgbU5hdGl2ZVdpbmRvdyhuYXRpdmVXaW5kb3cpLAorICAgICAgbVN1cmZhY2Uoc3VyZmFjZSksCiAgICAgICBtU291cmNlKHNvdXJjZSksCiAgICAgICBtUmVuZGVyZXIocmVuZGVyZXIpLAogICAgICAgbUNDRGVjb2RlcihjY0RlY29kZXIpLAorICAgICAgbVBpZChwaWQpLAogICAgICAgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzKC0xbGwpLAogICAgICAgbU51bUZyYW1lc1RvdGFsKDBsbCksCi0gICAgICBtTnVtRnJhbWVzRHJvcHBlZCgwbGwpLAorICAgICAgbU51bUlucHV0RnJhbWVzRHJvcHBlZCgwbGwpLAorICAgICAgbU51bU91dHB1dEZyYW1lc0Ryb3BwZWQoMGxsKSwKKyAgICAgIG1WaWRlb1dpZHRoKDApLAorICAgICAgbVZpZGVvSGVpZ2h0KDApLAogICAgICAgbUlzQXVkaW8odHJ1ZSksCiAgICAgICBtSXNWaWRlb0FWQyhmYWxzZSksCiAgICAgICBtSXNTZWN1cmUoZmFsc2UpLAogICAgICAgbUZvcm1hdENoYW5nZVBlbmRpbmcoZmFsc2UpLAorICAgICAgbVRpbWVDaGFuZ2VQZW5kaW5nKGZhbHNlKSwKICAgICAgIG1QYXVzZWQodHJ1ZSksCiAgICAgICBtUmVzdW1lUGVuZGluZyhmYWxzZSksCiAgICAgICBtQ29tcG9uZW50TmFtZSgiZGVjb2RlciIpIHsKQEAgLTY1LDE0ICs3OCwzMSBAQAogfQogCiBOdVBsYXllcjo6RGVjb2Rlcjo6fkRlY29kZXIoKSB7CisgICAgbUNvZGVjLT5yZWxlYXNlKCk7CiAgICAgcmVsZWFzZUFuZFJlc2V0TWVkaWFCdWZmZXJzKCk7CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OmdldFN0YXRzKAotICAgICAgICBpbnQ2NF90ICpudW1GcmFtZXNUb3RhbCwKLSAgICAgICAgaW50NjRfdCAqbnVtRnJhbWVzRHJvcHBlZCkgY29uc3QgewotICAgICpudW1GcmFtZXNUb3RhbCA9IG1OdW1GcmFtZXNUb3RhbDsKLSAgICAqbnVtRnJhbWVzRHJvcHBlZCA9IG1OdW1GcmFtZXNEcm9wcGVkOworc3A8QU1lc3NhZ2U+IE51UGxheWVyOjpEZWNvZGVyOjpnZXRTdGF0cygpIGNvbnN0IHsKKyAgICBtU3RhdHMtPnNldEludDY0KCJmcmFtZXMtdG90YWwiLCBtTnVtRnJhbWVzVG90YWwpOworICAgIG1TdGF0cy0+c2V0SW50NjQoImZyYW1lcy1kcm9wcGVkLWlucHV0IiwgbU51bUlucHV0RnJhbWVzRHJvcHBlZCk7CisgICAgbVN0YXRzLT5zZXRJbnQ2NCgiZnJhbWVzLWRyb3BwZWQtb3V0cHV0IiwgbU51bU91dHB1dEZyYW1lc0Ryb3BwZWQpOworICAgIHJldHVybiBtU3RhdHM7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpEZWNvZGVyOjpzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICBpZiAoc3VyZmFjZSA9PSBOVUxMIHx8IEFEZWJ1Zzo6aXNFeHBlcmltZW50RW5hYmxlZCgibGVnYWN5LXNldHN1cmZhY2UiKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRWaWRlb1N1cmZhY2UsIHRoaXMpOworCisgICAgbXNnLT5zZXRPYmplY3QoInN1cmZhY2UiLCBzdXJmYWNlKTsKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgfQorICAgIHJldHVybiBlcnI7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CkBAIC04MSwyNSArMTExLDcxIEBACiAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgewogICAgICAgICBjYXNlIGtXaGF0Q29kZWNOb3RpZnk6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICghaXNTdGFsZVJlcGx5KG1zZykpIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IG51bUlucHV0LCBudW1PdXRwdXQ7CisgICAgICAgICAgICBpbnQzMl90IGNiSUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiY2FsbGJhY2tJRCIsICZjYklEKSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJpbnB1dC1idWZmZXJzIiwgJm51bUlucHV0KSkgewotICAgICAgICAgICAgICAgICAgICBudW1JbnB1dCA9IElOVDMyX01BWDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiWyVzXSBrV2hhdENvZGVjTm90aWZ5OiBjYklEID0gJWQsIHBhdXNlZCA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUlzQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIiwgY2JJRCwgbVBhdXNlZCk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJvdXRwdXQtYnVmZmVycyIsICZudW1PdXRwdXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG51bU91dHB1dCA9IElOVDMyX01BWDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIW1QYXVzZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG51bUlucHV0LS0gPiAwICYmIGhhbmRsZUFuSW5wdXRCdWZmZXIoKSkge30KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAobnVtT3V0cHV0LS0gPiAwICYmIGhhbmRsZUFuT3V0cHV0QnVmZmVyKCkpIHt9CisgICAgICAgICAgICBpZiAobVBhdXNlZCkgeworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICByZXF1ZXN0Q29kZWNOb3RpZmljYXRpb24oKTsKKyAgICAgICAgICAgIHN3aXRjaCAoY2JJRCkgeworICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb2RlYzo6Q0JfSU5QVVRfQVZBSUxBQkxFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbmRleDsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImluZGV4IiwgJmluZGV4KSk7CisKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlQW5JbnB1dEJ1ZmZlcihpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb2RlYzo6Q0JfT1VUUFVUX0FWQUlMQUJMRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXg7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmbGFnczsKKworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiaW5kZXgiLCAmaW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgib2Zmc2V0IiwgJm9mZnNldCkpOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJzaXplIiwgJnNpemUpKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImZsYWdzIiwgJmZsYWdzKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlQW5PdXRwdXRCdWZmZXIoaW5kZXgsIG9mZnNldCwgc2l6ZSwgdGltZVVzLCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb2RlYzo6Q0JfT1VUUFVUX0ZPUk1BVF9DSEFOR0VEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpOworCisgICAgICAgICAgICAgICAgICAgIGhhbmRsZU91dHB1dEZvcm1hdENoYW5nZShmb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29kZWM6OkNCX0VSUk9SOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRGVjb2RlciAoJXMpIHJlcG9ydGVkIGVycm9yIDogMHgleCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlzQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIiwgZXJyKTsKKworICAgICAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihlcnIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xMTEsNiArMTg3LDQ2IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRTZXRWaWRlb1N1cmZhY2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCisgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInN1cmZhY2UiLCAmb2JqKSk7CisgICAgICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlID0gc3RhdGljX2Nhc3Q8U3VyZmFjZSAqPihvYmouZ2V0KCkpOyAvLyBub24tbnVsbAorICAgICAgICAgICAgaW50MzJfdCBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIC8vIE5PVEU6IGluIHByYWN0aWNlIG1TdXJmYWNlIGlzIGFsd2F5cyBub24tbnVsbCwgYnV0IGNoZWNraW5nIGhlcmUgZm9yIGNvbXBsZXRlbmVzcworICAgICAgICAgICAgaWYgKG1Db2RlYyAhPSBOVUxMICYmIG1TdXJmYWNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBvbmNlIEF3ZXNvbWVQbGF5ZXIgaXMgcmVtb3ZlZCwgcmVtb3ZlIHRoaXMgYXV0b21hdGljIGNvbm5lY3RpbmcKKyAgICAgICAgICAgICAgICAvLyB0byB0aGUgc3VyZmFjZSBieSBNZWRpYVBsYXllclNlcnZpY2UuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBhdCB0aGlzIHBvaW50IE1lZGlhUGxheWVyU2VydmljZTo6Y2xpZW50IGhhcyBhbHJlYWR5IGNvbm5lY3RlZCB0byB0aGUKKyAgICAgICAgICAgICAgICAvLyBzdXJmYWNlLCB3aGljaCBNZWRpYUNvZGVjIGRvZXMgbm90IGV4cGVjdAorICAgICAgICAgICAgICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3Qoc3VyZmFjZS5nZXQoKSwgTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbUNvZGVjLT5zZXRTdXJmYWNlKHN1cmZhY2UpOworICAgICAgICAgICAgICAgICAgICBBTE9HSV9JRihlcnIsICJjb2RlYyBzZXRTdXJmYWNlIHJldHVybmVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY29ubmVjdCB0byB0aGUgb2xkIHN1cmZhY2UgYXMgTVBTOjpDbGllbnQgd2lsbCBleHBlY3QgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlIGFibGUgdG8gZGlzY29ubmVjdCBmcm9tIGl0LgorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpbmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdChtU3VyZmFjZS5nZXQoKSwgTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOworICAgICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2UgPSBzdXJmYWNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVjb25uZWN0IHRvIHRoZSBuZXcgc3VyZmFjZSBvbiBlcnJvciBhcyBNUFM6OkNsaWVudCB3aWxsIGV4cGVjdCB0bworICAgICAgICAgICAgICAgICAgICAvLyBiZSBhYmxlIHRvIGRpc2Nvbm5lY3QgZnJvbSBpdC4KKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpbmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdChzdXJmYWNlLmdldCgpLCBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgRGVjb2RlckJhc2U6Om9uTWVzc2FnZVJlY2VpdmVkKG1zZyk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTEyMSw2ICsyMzcsNyBAQAogICAgIENIRUNLKG1Db2RlYyA9PSBOVUxMKTsKIAogICAgIG1Gb3JtYXRDaGFuZ2VQZW5kaW5nID0gZmFsc2U7CisgICAgbVRpbWVDaGFuZ2VQZW5kaW5nID0gZmFsc2U7CiAKICAgICArK21CdWZmZXJHZW5lcmF0aW9uOwogCkBAIC0xMzAsMTYgKzI0NywxMiBAQAogICAgIG1Jc0F1ZGlvID0gIXN0cm5jYXNlY21wKCJhdWRpby8iLCBtaW1lLmNfc3RyKCksIDYpOwogICAgIG1Jc1ZpZGVvQVZDID0gIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCBtaW1lLmNfc3RyKCkpOwogCi0gICAgc3A8U3VyZmFjZT4gc3VyZmFjZSA9IE5VTEw7Ci0gICAgaWYgKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCkgewotICAgICAgICBzdXJmYWNlID0gbU5hdGl2ZVdpbmRvdy0+Z2V0U3VyZmFjZVRleHR1cmVDbGllbnQoKTsKLSAgICB9Ci0KICAgICBtQ29tcG9uZW50TmFtZSA9IG1pbWU7CiAgICAgbUNvbXBvbmVudE5hbWUuYXBwZW5kKCIgZGVjb2RlciIpOwotICAgIEFMT0dWKCJbJXNdIG9uQ29uZmlndXJlIChzdXJmYWNlPSVwKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIHN1cmZhY2UuZ2V0KCkpOworICAgIEFMT0dWKCJbJXNdIG9uQ29uZmlndXJlIChzdXJmYWNlPSVwKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIG1TdXJmYWNlLmdldCgpKTsKIAotICAgIG1Db2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5VHlwZShtQ29kZWNMb29wZXIsIG1pbWUuY19zdHIoKSwgZmFsc2UgLyogZW5jb2RlciAqLyk7CisgICAgbUNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlUeXBlKAorICAgICAgICAgICAgbUNvZGVjTG9vcGVyLCBtaW1lLmNfc3RyKCksIGZhbHNlIC8qIGVuY29kZXIgKi8sIE5VTEwgLyogZXJyICovLCBtUGlkKTsKICAgICBpbnQzMl90IHNlY3VyZSA9IDA7CiAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCJzZWN1cmUiLCAmc2VjdXJlKSAmJiBzZWN1cmUgIT0gMCkgewogICAgICAgICBpZiAobUNvZGVjICE9IE5VTEwpIHsKQEAgLTE0OCw3ICsyNjEsNyBAQAogICAgICAgICAgICAgbUNvZGVjLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBBTE9HSSgiWyVzXSBjcmVhdGluZyIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOwogICAgICAgICAgICAgbUNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKAotICAgICAgICAgICAgICAgICAgICBtQ29kZWNMb29wZXIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBtQ29kZWNMb29wZXIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIE5VTEwgLyogZXJyICovLCBtUGlkKTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAobUNvZGVjID09IE5VTEwpIHsKQEAgLTE2MiwxNyArMjc1LDE3IEBACiAgICAgbUNvZGVjLT5nZXROYW1lKCZtQ29tcG9uZW50TmFtZSk7CiAKICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgaWYgKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCkgeworICAgIGlmIChtU3VyZmFjZSAhPSBOVUxMKSB7CiAgICAgICAgIC8vIGRpc2Nvbm5lY3QgZnJvbSBzdXJmYWNlIGFzIE1lZGlhQ29kZWMgd2lsbCByZWNvbm5lY3QKICAgICAgICAgZXJyID0gbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdCgKLSAgICAgICAgICAgICAgICBzdXJmYWNlLmdldCgpLCBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7CisgICAgICAgICAgICAgICAgbVN1cmZhY2UuZ2V0KCksIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKICAgICAgICAgLy8gV2UgdHJlYXQgdGhpcyBhcyBhIHdhcm5pbmcsIGFzIHRoaXMgaXMgYSBwcmVwYXJhdG9yeSBzdGVwLgogICAgICAgICAvLyBDb2RlYyB3aWxsIHRyeSB0byBjb25uZWN0IHRvIHRoZSBzdXJmYWNlLCB3aGljaCBpcyB3aGVyZQogICAgICAgICAvLyBhbnkgZXJyb3Igc2lnbmFsaW5nIHdpbGwgb2NjdXIuCiAgICAgICAgIEFMT0dXX0lGKGVyciAhPSBPSywgImZhaWxlZCB0byBkaXNjb25uZWN0IGZyb20gc3VyZmFjZTogJWQiLCBlcnIpOwogICAgIH0KICAgICBlcnIgPSBtQ29kZWMtPmNvbmZpZ3VyZSgKLSAgICAgICAgICAgIGZvcm1hdCwgc3VyZmFjZSwgTlVMTCAvKiBjcnlwdG8gKi8sIDAgLyogZmxhZ3MgKi8pOworICAgICAgICAgICAgZm9ybWF0LCBtU3VyZmFjZSwgTlVMTCAvKiBjcnlwdG8gKi8sIDAgLyogZmxhZ3MgKi8pOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjb25maWd1cmUgJXMgZGVjb2RlciAoZXJyPSVkKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CiAgICAgICAgIG1Db2RlYy0+cmVsZWFzZSgpOwpAQCAtMTg2LDYgKzI5OSwyMSBAQAogICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgbUNvZGVjLT5nZXRPdXRwdXRGb3JtYXQoJm1PdXRwdXRGb3JtYXQpKTsKICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIG1Db2RlYy0+Z2V0SW5wdXRGb3JtYXQoJm1JbnB1dEZvcm1hdCkpOwogCisgICAgbVN0YXRzLT5zZXRTdHJpbmcoIm1pbWUiLCBtaW1lLmNfc3RyKCkpOworICAgIG1TdGF0cy0+c2V0U3RyaW5nKCJjb21wb25lbnQtbmFtZSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworCisgICAgaWYgKCFtSXNBdWRpbykgeworICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIGlmIChtT3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKQorICAgICAgICAgICAgICAgICYmIG1PdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKKyAgICAgICAgICAgIG1TdGF0cy0+c2V0SW50MzIoIndpZHRoIiwgd2lkdGgpOworICAgICAgICAgICAgbVN0YXRzLT5zZXRJbnQzMigiaGVpZ2h0IiwgaGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZShrV2hhdENvZGVjTm90aWZ5LCB0aGlzKTsKKyAgICBtQ29kZWMtPnNldENhbGxiYWNrKHJlcGx5KTsKKwogICAgIGVyciA9IG1Db2RlYy0+c3RhcnQoKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc3RhcnQgJXMgZGVjb2RlciAoZXJyPSVkKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CkBAIC0xOTUsMzYgKzMyMywzMiBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgLy8gdGhlIGZvbGxvd2luZyBzaG91bGQgd29yayBhZnRlciBzdGFydAotICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgbUNvZGVjLT5nZXRJbnB1dEJ1ZmZlcnMoJm1JbnB1dEJ1ZmZlcnMpKTsKICAgICByZWxlYXNlQW5kUmVzZXRNZWRpYUJ1ZmZlcnMoKTsKLSAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIG1Db2RlYy0+Z2V0T3V0cHV0QnVmZmVycygmbU91dHB1dEJ1ZmZlcnMpKTsKLSAgICBBTE9HVigiWyVzXSBnb3QgJXp1IGlucHV0IGFuZCAlenUgb3V0cHV0IGJ1ZmZlcnMiLAotICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwKLSAgICAgICAgICAgIG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpLAotICAgICAgICAgICAgbU91dHB1dEJ1ZmZlcnMuc2l6ZSgpKTsKIAotICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgewotICAgICAgICByZXF1ZXN0Q29kZWNOb3RpZmljYXRpb24oKTsKLSAgICB9CiAgICAgbVBhdXNlZCA9IGZhbHNlOwogICAgIG1SZXN1bWVQZW5kaW5nID0gZmFsc2U7CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6Om9uU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcykgeworICAgIGlmIChtQ29kZWMgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygib25TZXRQYXJhbWV0ZXJzIGNhbGxlZCBiZWZvcmUgY29kZWMgaXMgY3JlYXRlZC4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQ29kZWMtPnNldFBhcmFtZXRlcnMocGFyYW1zKTsKK30KKwogdm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6b25TZXRSZW5kZXJlcihjb25zdCBzcDxSZW5kZXJlcj4gJnJlbmRlcmVyKSB7CiAgICAgYm9vbCBoYWROb1JlbmRlcmVyID0gKG1SZW5kZXJlciA9PSBOVUxMKTsKICAgICBtUmVuZGVyZXIgPSByZW5kZXJlcjsKICAgICBpZiAoaGFkTm9SZW5kZXJlciAmJiBtUmVuZGVyZXIgIT0gTlVMTCkgewotICAgICAgICByZXF1ZXN0Q29kZWNOb3RpZmljYXRpb24oKTsKKyAgICAgICAgLy8gdGhpcyBtZWFucyB0aGF0IHRoZSB3aWRldmluZSBsZWdhY3kgc291cmNlIGlzIHJlYWR5CisgICAgICAgIG9uUmVxdWVzdElucHV0QnVmZmVycygpOwogICAgIH0KIH0KIAogdm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6b25HZXRJbnB1dEJ1ZmZlcnMoCiAgICAgICAgIFZlY3RvcjxzcDxBQnVmZmVyPiA+ICpkc3RCdWZmZXJzKSB7Ci0gICAgZHN0QnVmZmVycy0+Y2xlYXIoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgZHN0QnVmZmVycy0+cHVzaChtSW5wdXRCdWZmZXJzW2ldKTsKLSAgICB9CisgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBtQ29kZWMtPmdldFdpZGV2aW5lTGVnYWN5QnVmZmVycyhkc3RCdWZmZXJzKSk7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6Om9uUmVzdW1lKGJvb2wgbm90aWZ5Q29tcGxldGUpIHsKQEAgLTIzMyw5ICszNTcsMTAgQEAKICAgICBpZiAobm90aWZ5Q29tcGxldGUpIHsKICAgICAgICAgbVJlc3VtZVBlbmRpbmcgPSB0cnVlOwogICAgIH0KKyAgICBtQ29kZWMtPnN0YXJ0KCk7CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6Om9uRmx1c2goYm9vbCBub3RpZnlDb21wbGV0ZSkgewordm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6ZG9GbHVzaChib29sIG5vdGlmeUNvbXBsZXRlKSB7CiAgICAgaWYgKG1DQ0RlY29kZXIgIT0gTlVMTCkgewogICAgICAgICBtQ0NEZWNvZGVyLT5mbHVzaCgpOwogICAgIH0KQEAgLTI1OSwxMyArMzg0LDIzIEBACiAgICAgICAgIC8vIHdlIGF0dGVtcHQgdG8gcmVsZWFzZSB0aGUgYnVmZmVycyBldmVuIGlmIGZsdXNoIGZhaWxzLgogICAgIH0KICAgICByZWxlYXNlQW5kUmVzZXRNZWRpYUJ1ZmZlcnMoKTsKKyAgICBtUGF1c2VkID0gdHJ1ZTsKK30KIAotICAgIGlmIChub3RpZnlDb21wbGV0ZSkgewotICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEZsdXNoQ29tcGxldGVkKTsKLSAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgICAgIG1QYXVzZWQgPSB0cnVlOworCit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpvbkZsdXNoKCkgeworICAgIGRvRmx1c2godHJ1ZSk7CisKKyAgICBpZiAoaXNEaXNjb250aW51aXR5UGVuZGluZygpKSB7CisgICAgICAgIC8vIFRoaXMgY291bGQgaGFwcGVuIGlmIHRoZSBjbGllbnQgc3RhcnRzIHNlZWtpbmcvc2h1dGRvd24KKyAgICAgICAgLy8gYWZ0ZXIgd2UgcXVldWVkIGFuIEVPUyBmb3IgZGlzY29udGludWl0aWVzLgorICAgICAgICAvLyBXZSBjYW4gY29uc2lkZXIgZGlzY29udGludWl0eSBoYW5kbGVkLgorICAgICAgICBmaW5pc2hIYW5kbGVEaXNjb250aW51aXR5KGZhbHNlIC8qIGZsdXNoT25UaW1lQ2hhbmdlICovKTsKICAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0Rmx1c2hDb21wbGV0ZWQpOworICAgIG5vdGlmeS0+cG9zdCgpOwogfQogCiB2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpvblNodXRkb3duKGJvb2wgbm90aWZ5Q29tcGxldGUpIHsKQEAgLTI3OSwxMiArNDE0LDEwIEBACiAgICAgICAgIG1Db2RlYyA9IE5VTEw7CiAgICAgICAgICsrbUJ1ZmZlckdlbmVyYXRpb247CiAKLSAgICAgICAgaWYgKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCkgeworICAgICAgICBpZiAobVN1cmZhY2UgIT0gTlVMTCkgewogICAgICAgICAgICAgLy8gcmVjb25uZWN0IHRvIHN1cmZhY2UgYXMgTWVkaWFDb2RlYyBkaXNjb25uZWN0ZWQgZnJvbSBpdAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyb3IgPQotICAgICAgICAgICAgICAgICAgICBuYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3ctPmdldE5hdGl2ZVdpbmRvdygpLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdChtU3VyZmFjZS5nZXQoKSwgTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOwogICAgICAgICAgICAgQUxPR1dfSUYoZXJyb3IgIT0gTk9fRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICJbJXNdIGZhaWxlZCB0byBjb25uZWN0IHRvIG5hdGl2ZSB3aW5kb3csIGVycm9yPSVkIiwKICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyb3IpOwpAQCAtMzA4LDE3ICs0NDEsMjMgQEAKICAgICB9CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OmRvUmVxdWVzdEJ1ZmZlcnMoKSB7Ci0gICAgaWYgKG1Gb3JtYXRDaGFuZ2VQZW5kaW5nKSB7Ci0gICAgICAgIHJldHVybjsKKy8qCisgKiByZXR1cm5zIHRydWUgaWYgd2Ugc2hvdWxkIHJlcXVlc3QgbW9yZSBkYXRhCisgKi8KK2Jvb2wgTnVQbGF5ZXI6OkRlY29kZXI6OmRvUmVxdWVzdEJ1ZmZlcnMoKSB7CisgICAgLy8gbVJlbmRlcmVyIGlzIG9ubHkgTlVMTCBpZiB3ZSBoYXZlIGEgbGVnYWN5IHdpZGV2aW5lIHNvdXJjZSB0aGF0CisgICAgLy8gaXMgbm90IHlldCByZWFkeS4gSW4gdGhpcyBjYXNlIHdlIG11c3Qgbm90IGZldGNoIGlucHV0LgorICAgIGlmIChpc0Rpc2NvbnRpbnVpdHlQZW5kaW5nKCkgfHwgbVJlbmRlcmVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICB3aGlsZSAoIW1EZXF1ZXVlZElucHV0QnVmZmVycy5lbXB0eSgpKSB7CisgICAgd2hpbGUgKGVyciA9PSBPSyAmJiAhbURlcXVldWVkSW5wdXRCdWZmZXJzLmVtcHR5KCkpIHsKICAgICAgICAgc2l6ZV90IGJ1ZmZlckl4ID0gKm1EZXF1ZXVlZElucHV0QnVmZmVycy5iZWdpbigpOwogICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7CiAgICAgICAgIG1zZy0+c2V0U2l6ZSgiYnVmZmVyLWl4IiwgYnVmZmVySXgpOwogICAgICAgICBlcnIgPSBmZXRjaElucHV0RGF0YShtc2cpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIGlmIChlcnIgIT0gT0sgJiYgZXJyICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIC8vIGlmIEVPUywgbmVlZCB0byBxdWV1ZSBFT1MgYnVmZmVyCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBtRGVxdWV1ZWRJbnB1dEJ1ZmZlcnMuZXJhc2UobURlcXVldWVkSW5wdXRCdWZmZXJzLmJlZ2luKCkpOwpAQCAtMzI5LDQwICs0NjgsNTkgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChlcnIgPT0gLUVXT1VMREJMT0NLCi0gICAgICAgICAgICAmJiBtU291cmNlLT5mZWVkTW9yZVRTRGF0YSgpID09IE9LKSB7Ci0gICAgICAgIHNjaGVkdWxlUmVxdWVzdEJ1ZmZlcnMoKTsKLSAgICB9CisgICAgcmV0dXJuIGVyciA9PSAtRVdPVUxEQkxPQ0sKKyAgICAgICAgICAgICYmIG1Tb3VyY2UtPmZlZWRNb3JlVFNEYXRhKCkgPT0gT0s7CiB9CiAKLWJvb2wgTnVQbGF5ZXI6OkRlY29kZXI6OmhhbmRsZUFuSW5wdXRCdWZmZXIoKSB7Ci0gICAgaWYgKG1Gb3JtYXRDaGFuZ2VQZW5kaW5nKSB7Cit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpoYW5kbGVFcnJvcihpbnQzMl90IGVycikKK3sKKyAgICAvLyBXZSBjYW5ub3QgaW1tZWRpYXRlbHkgcmVsZWFzZSB0aGUgY29kZWMgZHVlIHRvIGJ1ZmZlcnMgc3RpbGwgb3V0c3RhbmRpbmcKKyAgICAvLyBpbiB0aGUgcmVuZGVyZXIuICBXZSBzaWduYWwgdG8gdGhlIHBsYXllciB0aGUgZXJyb3Igc28gaXQgY2FuIHNodXRkb3duL3JlbGVhc2UgdGhlCisgICAgLy8gZGVjb2RlciBhZnRlciBmbHVzaGluZyBhbmQgaW5jcmVtZW50IHRoZSBnZW5lcmF0aW9uIHRvIGRpc2NhcmQgdW5uZWNlc3NhcnkgbWVzc2FnZXMuCisKKyAgICArK21CdWZmZXJHZW5lcmF0aW9uOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEVycm9yKTsKKyAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCitib29sIE51UGxheWVyOjpEZWNvZGVyOjpoYW5kbGVBbklucHV0QnVmZmVyKHNpemVfdCBpbmRleCkgeworICAgIGlmIChpc0Rpc2NvbnRpbnVpdHlQZW5kaW5nKCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBzaXplX3QgYnVmZmVySXggPSAtMTsKLSAgICBzdGF0dXNfdCByZXMgPSBtQ29kZWMtPmRlcXVldWVJbnB1dEJ1ZmZlcigmYnVmZmVySXgpOwotICAgIEFMT0dWKCJbJXNdIGRlcXVldWVkIGlucHV0OiAlZCIsCi0gICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCByZXMgPT0gT0sgPyAoaW50KWJ1ZmZlckl4IDogcmVzKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIGlmIChyZXMgIT0gLUVBR0FJTikgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBkZXF1ZXVlIGlucHV0IGJ1ZmZlciBmb3IgJXMgKGVycj0lZCkiLAotICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCByZXMpOwotICAgICAgICAgICAgaGFuZGxlRXJyb3IocmVzKTsKKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICBtQ29kZWMtPmdldElucHV0QnVmZmVyKGluZGV4LCAmYnVmZmVyKTsKKworICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICBoYW5kbGVFcnJvcihVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChpbmRleCA+PSBtSW5wdXRCdWZmZXJzLnNpemUoKSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gbUlucHV0QnVmZmVycy5zaXplKCk7IGkgPD0gaW5kZXg7ICsraSkgeworICAgICAgICAgICAgbUlucHV0QnVmZmVycy5hZGQoKTsKKyAgICAgICAgICAgIG1NZWRpYUJ1ZmZlcnMuYWRkKCk7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXJJc0RlcXVldWVkLmFkZCgpOworICAgICAgICAgICAgbU1lZGlhQnVmZmVycy5lZGl0SXRlbUF0KGkpID0gTlVMTDsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuZWRpdEl0ZW1BdChpKSA9IGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CisgICAgbUlucHV0QnVmZmVycy5lZGl0SXRlbUF0KGluZGV4KSA9IGJ1ZmZlcjsKIAotICAgIENIRUNLX0xUKGJ1ZmZlckl4LCBtSW5wdXRCdWZmZXJzLnNpemUoKSk7CisgICAgLy9DSEVDS19MVChidWZmZXJJeCwgbUlucHV0QnVmZmVycy5zaXplKCkpOwogCi0gICAgaWYgKG1NZWRpYUJ1ZmZlcnNbYnVmZmVySXhdICE9IE5VTEwpIHsKLSAgICAgICAgbU1lZGlhQnVmZmVyc1tidWZmZXJJeF0tPnJlbGVhc2UoKTsKLSAgICAgICAgbU1lZGlhQnVmZmVycy5lZGl0SXRlbUF0KGJ1ZmZlckl4KSA9IE5VTEw7CisgICAgaWYgKG1NZWRpYUJ1ZmZlcnNbaW5kZXhdICE9IE5VTEwpIHsKKyAgICAgICAgbU1lZGlhQnVmZmVyc1tpbmRleF0tPnJlbGVhc2UoKTsKKyAgICAgICAgbU1lZGlhQnVmZmVycy5lZGl0SXRlbUF0KGluZGV4KSA9IE5VTEw7CiAgICAgfQotICAgIG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuZWRpdEl0ZW1BdChidWZmZXJJeCkgPSB0cnVlOworICAgIG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuZWRpdEl0ZW1BdChpbmRleCkgPSB0cnVlOwogCiAgICAgaWYgKCFtQ1NEc1RvU3VibWl0LmlzRW1wdHkoKSkgewogICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7Ci0gICAgICAgIG1zZy0+c2V0U2l6ZSgiYnVmZmVyLWl4IiwgYnVmZmVySXgpOworICAgICAgICBtc2ctPnNldFNpemUoImJ1ZmZlci1peCIsIGluZGV4KTsKIAogICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBtQ1NEc1RvU3VibWl0Lml0ZW1BdCgwKTsKICAgICAgICAgQUxPR0koIlslc10gcmVzdWJtaXR0aW5nIENTRCIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOwpAQCAtMzgwLDExMSArNTM4LDUxIEBACiAgICAgICAgIG1QZW5kaW5nSW5wdXRNZXNzYWdlcy5lcmFzZShtUGVuZGluZ0lucHV0TWVzc2FnZXMuYmVnaW4oKSk7CiAgICAgfQogCi0gICAgaWYgKCFtSW5wdXRCdWZmZXJJc0RlcXVldWVkLmVkaXRJdGVtQXQoYnVmZmVySXgpKSB7CisgICAgaWYgKCFtSW5wdXRCdWZmZXJJc0RlcXVldWVkLmVkaXRJdGVtQXQoaW5kZXgpKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIG1EZXF1ZXVlZElucHV0QnVmZmVycy5wdXNoX2JhY2soYnVmZmVySXgpOworICAgIG1EZXF1ZXVlZElucHV0QnVmZmVycy5wdXNoX2JhY2soaW5kZXgpOwogCiAgICAgb25SZXF1ZXN0SW5wdXRCdWZmZXJzKCk7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgTnVQbGF5ZXI6OkRlY29kZXI6OmhhbmRsZUFuT3V0cHV0QnVmZmVyKCkgewotICAgIGlmIChtRm9ybWF0Q2hhbmdlUGVuZGluZykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHNpemVfdCBidWZmZXJJeCA9IC0xOwotICAgIHNpemVfdCBvZmZzZXQ7Ci0gICAgc2l6ZV90IHNpemU7Ci0gICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgdWludDMyX3QgZmxhZ3M7Ci0gICAgc3RhdHVzX3QgcmVzID0gbUNvZGVjLT5kZXF1ZXVlT3V0cHV0QnVmZmVyKAotICAgICAgICAgICAgJmJ1ZmZlckl4LCAmb2Zmc2V0LCAmc2l6ZSwgJnRpbWVVcywgJmZsYWdzKTsKK2Jvb2wgTnVQbGF5ZXI6OkRlY29kZXI6OmhhbmRsZUFuT3V0cHV0QnVmZmVyKAorICAgICAgICBzaXplX3QgaW5kZXgsCisgICAgICAgIHNpemVfdCBvZmZzZXQsCisgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICBpbnQ2NF90IHRpbWVVcywKKyAgICAgICAgaW50MzJfdCBmbGFncykgeworLy8gICAgQ0hFQ0tfTFQoYnVmZmVySXgsIG1PdXRwdXRCdWZmZXJzLnNpemUoKSk7CisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgIG1Db2RlYy0+Z2V0T3V0cHV0QnVmZmVyKGluZGV4LCAmYnVmZmVyKTsKIAotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgQUxPR1YoIlslc10gZGVxdWV1ZWQgb3V0cHV0OiAlZCIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIHJlcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlslc10gZGVxdWV1ZWQgb3V0cHV0OiAlZCAodGltZT0lbGxkIGZsYWdzPSUiIFBSSXUzMiAiKSIsCi0gICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgKGludClidWZmZXJJeCwgdGltZVVzLCBmbGFncyk7CisgICAgaWYgKGluZGV4ID49IG1PdXRwdXRCdWZmZXJzLnNpemUoKSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gbU91dHB1dEJ1ZmZlcnMuc2l6ZSgpOyBpIDw9IGluZGV4OyArK2kpIHsKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJzLmFkZCgpOworICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKHJlcyA9PSBJTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQpIHsKLSAgICAgICAgcmVzID0gbUNvZGVjLT5nZXRPdXRwdXRCdWZmZXJzKCZtT3V0cHV0QnVmZmVycyk7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IG91dHB1dCBidWZmZXJzIGZvciAlcyBhZnRlciBJTkZPIGV2ZW50IChlcnI9JWQpIiwKLSAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgcmVzKTsKLSAgICAgICAgICAgIGhhbmRsZUVycm9yKHJlcyk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTnVQbGF5ZXIgaWdub3JlcyB0aGlzCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSBpZiAocmVzID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOwotICAgICAgICByZXMgPSBtQ29kZWMtPmdldE91dHB1dEZvcm1hdCgmZm9ybWF0KTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgb3V0cHV0IGZvcm1hdCBmb3IgJXMgYWZ0ZXIgSU5GTyBldmVudCAoZXJyPSVkKSIsCi0gICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIHJlcyk7Ci0gICAgICAgICAgICBoYW5kbGVFcnJvcihyZXMpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9CisgICAgbU91dHB1dEJ1ZmZlcnMuZWRpdEl0ZW1BdChpbmRleCkgPSBidWZmZXI7CiAKLSAgICAgICAgaWYgKCFtSXNBdWRpbykgewotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0VmlkZW9TaXplQ2hhbmdlZCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldE1lc3NhZ2UoImZvcm1hdCIsIGZvcm1hdCk7Ci0gICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLSAgICAgICAgfSBlbHNlIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgdWludDMyX3QgZmxhZ3M7Ci0gICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgICAgICAgICBib29sIGhhc1ZpZGVvID0gKG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgIT0gTlVMTCk7Ci0gICAgICAgICAgICBpZiAoIWhhc1ZpZGVvICYmCi0gICAgICAgICAgICAgICAgICAgIG1Tb3VyY2UtPmdldER1cmF0aW9uKCZkdXJhdGlvblVzKSA9PSBPSyAmJgotICAgICAgICAgICAgICAgICAgICBkdXJhdGlvblVzCi0gICAgICAgICAgICAgICAgICAgICAgICA+IEFVRElPX1NJTktfTUlOX0RFRVBfQlVGRkVSX0RVUkFUSU9OX1VTKSB7Ci0gICAgICAgICAgICAgICAgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXMgPSBtUmVuZGVyZXItPm9wZW5BdWRpb1NpbmsoCi0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgZmFsc2UgLyogb2ZmbG9hZE9ubHkgKi8sIGhhc1ZpZGVvLCBmbGFncywgTlVMTCAvKiBpc09mZmxvYWRlZCAqLyk7Ci0gICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvcGVuIEF1ZGlvU2luayBvbiBmb3JtYXQgY2hhbmdlIGZvciAlcyAoZXJyPSVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCByZXMpOwotICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKHJlcyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSBpZiAocmVzID09IElORk9fRElTQ09OVElOVUlUWSkgewotICAgICAgICAvLyBub3RoaW5nIHRvIGRvCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIGlmIChyZXMgIT0gLUVBR0FJTikgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBkZXF1ZXVlIG91dHB1dCBidWZmZXIgZm9yICVzIChlcnI9JWQpIiwKLSAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgcmVzKTsKLSAgICAgICAgICAgIGhhbmRsZUVycm9yKHJlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIENIRUNLX0xUKGJ1ZmZlckl4LCBtT3V0cHV0QnVmZmVycy5zaXplKCkpOwotICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG1PdXRwdXRCdWZmZXJzW2J1ZmZlckl4XTsKICAgICBidWZmZXItPnNldFJhbmdlKG9mZnNldCwgc2l6ZSk7CiAgICAgYnVmZmVyLT5tZXRhKCktPmNsZWFyKCk7CiAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwotICAgIGlmIChmbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUykgewotICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImVvcyIsIHRydWUpOwotICAgICAgICBub3RpZnlSZXN1bWVDb21wbGV0ZUlmTmVjZXNzYXJ5KCk7Ci0gICAgfQorCisgICAgYm9vbCBlb3MgPSBmbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUzsKICAgICAvLyB3ZSBkbyBub3QgZXhwZWN0IENPREVDQ09ORklHIG9yIFNZTkNGUkFNRSBmb3IgZGVjb2RlcgogCi0gICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVuZGVyQnVmZmVyLCBpZCgpKTsKLSAgICByZXBseS0+c2V0U2l6ZSgiYnVmZmVyLWl4IiwgYnVmZmVySXgpOworICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbmRlckJ1ZmZlciwgdGhpcyk7CisgICAgcmVwbHktPnNldFNpemUoImJ1ZmZlci1peCIsIGluZGV4KTsKICAgICByZXBseS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQnVmZmVyR2VuZXJhdGlvbik7CiAKLSAgICBpZiAobVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzID49IDApIHsKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIEFMT0dJKCJbJXNdIHNhdyBvdXRwdXQgRU9TIiwgbUlzQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJlb3MiLCB0cnVlKTsKKyAgICAgICAgcmVwbHktPnNldEludDMyKCJlb3MiLCB0cnVlKTsKKyAgICB9IGVsc2UgaWYgKG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcyA+PSAwKSB7CiAgICAgICAgIGlmICh0aW1lVXMgPCBtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMpIHsKICAgICAgICAgICAgIEFMT0dWKCJbJXNdIGRyb3BwaW5nIGJ1ZmZlciBhdCB0aW1lICVsbGQgYXMgcmVxdWVzdGVkLiIsCiAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCAobG9uZyBsb25nKXRpbWVVcyk7CkBAIC00OTYsMTMgKzU5NCwxNSBAQAogICAgICAgICBtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMgPSAtMTsKICAgICB9CiAKKyAgICBtTnVtRnJhbWVzVG90YWwgKz0gIW1Jc0F1ZGlvOworCiAgICAgLy8gd2FpdCB1bnRpbCAxc3QgZnJhbWUgY29tZXMgb3V0IHRvIHNpZ25hbCByZXN1bWUgY29tcGxldGUKICAgICBub3RpZnlSZXN1bWVDb21wbGV0ZUlmTmVjZXNzYXJ5KCk7CiAKICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKICAgICAgICAgLy8gc2VuZCB0aGUgYnVmZmVyIHRvIHJlbmRlcmVyLgogICAgICAgICBtUmVuZGVyZXItPnF1ZXVlQnVmZmVyKG1Jc0F1ZGlvLCBidWZmZXIsIHJlcGx5KTsKLSAgICAgICAgaWYgKGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TKSB7CisgICAgICAgIGlmIChlb3MgJiYgIWlzRGlzY29udGludWl0eVBlbmRpbmcoKSkgewogICAgICAgICAgICAgbVJlbmRlcmVyLT5xdWV1ZUVPUyhtSXNBdWRpbywgRVJST1JfRU5EX09GX1NUUkVBTSk7CiAgICAgICAgIH0KICAgICB9CkBAIC01MTAsNiArNjEwLDM2IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OmhhbmRsZU91dHB1dEZvcm1hdENoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIGlmICghbUlzQXVkaW8pIHsKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKQorICAgICAgICAgICAgICAgICYmIGZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgeworICAgICAgICAgICAgbVN0YXRzLT5zZXRJbnQzMigid2lkdGgiLCB3aWR0aCk7CisgICAgICAgICAgICBtU3RhdHMtPnNldEludDMyKCJoZWlnaHQiLCBoZWlnaHQpOworICAgICAgICB9CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0VmlkZW9TaXplQ2hhbmdlZCk7CisgICAgICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKKyAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgfSBlbHNlIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgeworICAgICAgICB1aW50MzJfdCBmbGFnczsKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgICAgICBib29sIGhhc1ZpZGVvID0gKG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgIT0gTlVMTCk7CisgICAgICAgIGlmIChnZXRBdWRpb0RlZXBCdWZmZXJTZXR0aW5nKCkgLy8gb3ZlcnJpZGUgcmVnYXJkbGVzcyBvZiBzb3VyY2UgZHVyYXRpb24KKyAgICAgICAgICAgICAgICB8fCAoIWhhc1ZpZGVvCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBtU291cmNlLT5nZXREdXJhdGlvbigmZHVyYXRpb25VcykgPT0gT0sKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGR1cmF0aW9uVXMgPiBBVURJT19TSU5LX01JTl9ERUVQX0JVRkZFUl9EVVJBVElPTl9VUykpIHsKKyAgICAgICAgICAgIGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CisgICAgICAgIH0KKworICAgICAgICBtUmVuZGVyZXItPm9wZW5BdWRpb1NpbmsoCisgICAgICAgICAgICAgICAgZm9ybWF0LCBmYWxzZSAvKiBvZmZsb2FkT25seSAqLywgaGFzVmlkZW8sIGZsYWdzLCBOVUxMIC8qIGlzT2ZmbG9hZWQgKi8pOworICAgIH0KK30KKwogdm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6cmVsZWFzZUFuZFJlc2V0TWVkaWFCdWZmZXJzKCkgewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1lZGlhQnVmZmVycy5zaXplKCk7IGkrKykgewogICAgICAgICBpZiAobU1lZGlhQnVmZmVyc1tpXSAhPSBOVUxMKSB7CkBAIC01MzMsMTEgKzY2Myw4IEBACiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OnJlcXVlc3RDb2RlY05vdGlmaWNhdGlvbigpIHsKLSAgICBpZiAobUZvcm1hdENoYW5nZVBlbmRpbmcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KICAgICBpZiAobUNvZGVjICE9IE5VTEwpIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29kZWNOb3RpZnksIGlkKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb2RlY05vdGlmeSwgdGhpcyk7CiAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1CdWZmZXJHZW5lcmF0aW9uKTsKICAgICAgICAgbUNvZGVjLT5yZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb24ocmVwbHkpOwogICAgIH0KQEAgLTU4Miw0MyArNzA5LDMxIEBACiAgICAgICAgICAgICAgICAgICAgIGZvcm1hdENoYW5nZSA9ICFzZWFtbGVzc0Zvcm1hdENoYW5nZTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoZm9ybWF0Q2hhbmdlIHx8IHRpbWVDaGFuZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJ3aGF0Iiwga1doYXRJbnB1dERpc2NvbnRpbnVpdHkpOwotICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJmb3JtYXRDaGFuZ2UiLCBmb3JtYXRDaGFuZ2UpOwotICAgICAgICAgICAgICAgICAgICBtc2ctPnBvc3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgICAgICAvLyBGb3IgZm9ybWF0IG9yIHRpbWUgY2hhbmdlLCByZXR1cm4gRU9TIHRvIHF1ZXVlIEVPUyBpbnB1dCwKKyAgICAgICAgICAgICAgICAvLyB0aGVuIHdhaXQgZm9yIEVPUyBvbiBvdXRwdXQuCiAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdENoYW5nZSAvKiBub3Qgc2VhbWxlc3MgKi8pIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBjaGFuZ2UgZGVjb2RlcgotICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gRU9TIGFuZCB3YWl0IHRvIGJlIGtpbGxlZAogICAgICAgICAgICAgICAgICAgICBtRm9ybWF0Q2hhbmdlUGVuZGluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZUNoYW5nZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGZsdXNoCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IElkZWFsbHkgd2Ugc2hvdWxkbid0IG5lZWQgYSBmbHVzaCB1cG9uIHRpbWUKLSAgICAgICAgICAgICAgICAgICAgLy8gZGlzY29udGludWl0eSwgZmx1c2hpbmcgd2lsbCBjYXVzZSBsb3NzIG9mIGZyYW1lcy4KLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgcHJvYmFibHkgc2hvdWxkIHF1ZXVlIGEgdGltZSBjaGFuZ2UgbWFya2VyIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBvdXRwdXQgcXVldWUsIGFuZCBoYW5kbGVzIGl0IGluIHJlbmRlcmVyIGluc3RlYWQuCiAgICAgICAgICAgICAgICAgICAgIHJlbWVtYmVyQ29kZWNTcGVjaWZpY0RhdGEobmV3Rm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgb25GbHVzaChmYWxzZSAvKiBub3RpZnlDb21wbGV0ZSAqLyk7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgICAgICAgICBtVGltZUNoYW5nZVBlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VhbWxlc3NGb3JtYXRDaGFuZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gcmV1c2UgZXhpc3RpbmcgZGVjb2RlciBhbmQgZG9uJ3QgZmx1c2gKICAgICAgICAgICAgICAgICAgICAgcmVtZW1iZXJDb2RlY1NwZWNpZmljRGF0YShuZXdGb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzdHJlYW0gaXMgdW5hZmZlY3RlZCBieSB0aGUgZGlzY29udGludWl0eQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcmVwbHktPnNldEludDMyKCJlcnIiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9CisgICAgICAgICAgICAvLyByZXBseSBzaG91bGQgb25seSBiZSByZXR1cm5lZCB3aXRob3V0IGEgYnVmZmVyIHNldAorICAgICAgICAgICAgLy8gd2hlbiB0aGVyZSBpcyBhbiBlcnJvciAoaW5jbHVkaW5nIEVPUykKKyAgICAgICAgICAgIENIRUNLKGVyciAhPSBPSyk7CiAKLSAgICAgICAgaWYgKCFtSXNBdWRpbykgewotICAgICAgICAgICAgKyttTnVtRnJhbWVzVG90YWw7CisgICAgICAgICAgICByZXBseS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgfQogCiAgICAgICAgIGRyb3BBY2Nlc3NVbml0ID0gZmFsc2U7CkBAIC02MjgsNyArNzQzLDcgQEAKICAgICAgICAgICAgICAgICAmJiBtSXNWaWRlb0FWQwogICAgICAgICAgICAgICAgICYmICFJc0FWQ1JlZmVyZW5jZUZyYW1lKGFjY2Vzc1VuaXQpKSB7CiAgICAgICAgICAgICBkcm9wQWNjZXNzVW5pdCA9IHRydWU7Ci0gICAgICAgICAgICArK21OdW1GcmFtZXNEcm9wcGVkOworICAgICAgICAgICAgKyttTnVtSW5wdXRGcmFtZXNEcm9wcGVkOwogICAgICAgICB9CiAgICAgfSB3aGlsZSAoZHJvcEFjY2Vzc1VuaXQpOwogCkBAIC02MzYsNyArNzUxLDcgQEAKICNpZiAwCiAgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKICAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7Ci0gICAgQUxPR1YoImZlZWRpbmcgJXMgaW5wdXQgYnVmZmVyIGF0IG1lZGlhIHRpbWUgJS4yZiBzZWNzIiwKKyAgICBBTE9HVigiWyVzXSBmZWVkaW5nIGlucHV0IGJ1ZmZlciBhdCBtZWRpYSB0aW1lICUuM2YiLAogICAgICAgICAgbUlzQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIiwKICAgICAgICAgIG1lZGlhVGltZVVzIC8gMUU2KTsKICNlbmRpZgpAQCAtNjk2LDEwICs4MTEsNyBAQAogICAgICAgICBpbnQzMl90IHN0cmVhbUVyciA9IEVSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmc3RyZWFtRXJyKSB8fCAhaGFzQnVmZmVyKTsKIAotICAgICAgICBpZiAoc3RyZWFtRXJyID09IE9LKSB7Ci0gICAgICAgICAgICAvKiBidWZmZXJzIGFyZSByZXR1cm5lZCB0byBob2xkIG9uIHRvICovCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQorICAgICAgICBDSEVDSyhzdHJlYW1FcnIgIT0gT0spOwogCiAgICAgICAgIC8vIGF0dGVtcHQgdG8gcXVldWUgRU9TCiAgICAgICAgIHN0YXR1c190IGVyciA9IG1Db2RlYy0+cXVldWVJbnB1dEJ1ZmZlcigKQEAgLTc4MSw2ICs4OTMsNyBAQAogICAgIHN0YXR1c190IGVycjsKICAgICBpbnQzMl90IHJlbmRlcjsKICAgICBzaXplX3QgYnVmZmVySXg7CisgICAgaW50MzJfdCBlb3M7CiAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgiYnVmZmVyLWl4IiwgJmJ1ZmZlckl4KSk7CiAKICAgICBpZiAoIW1Jc0F1ZGlvKSB7CkBAIC03OTgsNiArOTExLDcgQEAKICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVzdGFtcE5zIiwgJnRpbWVzdGFtcE5zKSk7CiAgICAgICAgIGVyciA9IG1Db2RlYy0+cmVuZGVyT3V0cHV0QnVmZmVyQW5kUmVsZWFzZShidWZmZXJJeCwgdGltZXN0YW1wTnMpOwogICAgIH0gZWxzZSB7CisgICAgICAgIG1OdW1PdXRwdXRGcmFtZXNEcm9wcGVkICs9ICFtSXNBdWRpbzsKICAgICAgICAgZXJyID0gbUNvZGVjLT5yZWxlYXNlT3V0cHV0QnVmZmVyKGJ1ZmZlckl4KTsKICAgICB9CiAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtODA1LDYgKzkxOSw0MCBAQAogICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CiAgICAgICAgIGhhbmRsZUVycm9yKGVycik7CiAgICAgfQorICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZW9zIiwgJmVvcykgJiYgZW9zCisgICAgICAgICAgICAmJiBpc0Rpc2NvbnRpbnVpdHlQZW5kaW5nKCkpIHsKKyAgICAgICAgZmluaXNoSGFuZGxlRGlzY29udGludWl0eSh0cnVlIC8qIGZsdXNoT25UaW1lQ2hhbmdlICovKTsKKyAgICB9Cit9CisKK2Jvb2wgTnVQbGF5ZXI6OkRlY29kZXI6OmlzRGlzY29udGludWl0eVBlbmRpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Gb3JtYXRDaGFuZ2VQZW5kaW5nIHx8IG1UaW1lQ2hhbmdlUGVuZGluZzsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6ZmluaXNoSGFuZGxlRGlzY29udGludWl0eShib29sIGZsdXNoT25UaW1lQ2hhbmdlKSB7CisgICAgQUxPR1YoImZpbmlzaEhhbmRsZURpc2NvbnRpbnVpdHk6IGZvcm1hdCAlZCwgdGltZSAlZCwgZmx1c2ggJWQiLAorICAgICAgICAgICAgbUZvcm1hdENoYW5nZVBlbmRpbmcsIG1UaW1lQ2hhbmdlUGVuZGluZywgZmx1c2hPblRpbWVDaGFuZ2UpOworCisgICAgLy8gSWYgd2UgaGF2ZSBmb3JtYXQgY2hhbmdlLCBwYXVzZSBhbmQgd2FpdCB0byBiZSBraWxsZWQ7CisgICAgLy8gSWYgd2UgaGF2ZSB0aW1lIGNoYW5nZSBvbmx5LCBmbHVzaCBhbmQgcmVzdGFydCBmZXRjaGluZy4KKworICAgIGlmIChtRm9ybWF0Q2hhbmdlUGVuZGluZykgeworICAgICAgICBtUGF1c2VkID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG1UaW1lQ2hhbmdlUGVuZGluZykgeworICAgICAgICBpZiAoZmx1c2hPblRpbWVDaGFuZ2UpIHsKKyAgICAgICAgICAgIGRvRmx1c2goZmFsc2UgLyogbm90aWZ5Q29tcGxldGUgKi8pOworICAgICAgICAgICAgc2lnbmFsUmVzdW1lKGZhbHNlIC8qIG5vdGlmeUNvbXBsZXRlICovKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE5vdGlmeSBOdVBsYXllciB0byBlaXRoZXIgc2h1dGRvd24gZGVjb2Rlciwgb3IgcmVzY2FuIHNvdXJjZXMKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbXNnLT5zZXRJbnQzMigid2hhdCIsIGtXaGF0SW5wdXREaXNjb250aW51aXR5KTsKKyAgICBtc2ctPnNldEludDMyKCJmb3JtYXRDaGFuZ2UiLCBtRm9ybWF0Q2hhbmdlUGVuZGluZyk7CisgICAgbXNnLT5wb3N0KCk7CisKKyAgICBtRm9ybWF0Q2hhbmdlUGVuZGluZyA9IGZhbHNlOworICAgIG1UaW1lQ2hhbmdlUGVuZGluZyA9IGZhbHNlOwogfQogCiBib29sIE51UGxheWVyOjpEZWNvZGVyOjpzdXBwb3J0c1NlYW1sZXNzQXVkaW9Gb3JtYXRDaGFuZ2UoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmgKaW5kZXggMWJmYTk0Zi4uZWViNGFmNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuaApAQCAtMjYsMTMgKzI2LDE1IEBACiBzdHJ1Y3QgTnVQbGF5ZXI6OkRlY29kZXIgOiBwdWJsaWMgRGVjb2RlckJhc2UgewogICAgIERlY29kZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCiAgICAgICAgICAgICBjb25zdCBzcDxTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICBjb25zdCBzcDxSZW5kZXJlcj4gJnJlbmRlcmVyID0gTlVMTCwKLSAgICAgICAgICAgIGNvbnN0IHNwPE5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZuYXRpdmVXaW5kb3cgPSBOVUxMLAorICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UgPSBOVUxMLAogICAgICAgICAgICAgY29uc3Qgc3A8Q0NEZWNvZGVyPiAmY2NEZWNvZGVyID0gTlVMTCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgZ2V0U3RhdHMoCi0gICAgICAgICAgICBpbnQ2NF90ICptTnVtRnJhbWVzVG90YWwsCi0gICAgICAgICAgICBpbnQ2NF90ICptTnVtRnJhbWVzRHJvcHBlZCkgY29uc3Q7CisgICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gZ2V0U3RhdHMoKSBjb25zdDsKKworICAgIC8vIHNldHMgdGhlIG91dHB1dCBzdXJmYWNlIG9mIHZpZGVvIGRlY29kZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkRlY29kZXIoKTsKQEAgLTQwLDIwICs0MiwyMiBAQAogICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKICAgICB2aXJ0dWFsIHZvaWQgb25Db25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOworICAgIHZpcnR1YWwgdm9pZCBvblNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXMpOwogICAgIHZpcnR1YWwgdm9pZCBvblNldFJlbmRlcmVyKGNvbnN0IHNwPFJlbmRlcmVyPiAmcmVuZGVyZXIpOwogICAgIHZpcnR1YWwgdm9pZCBvbkdldElucHV0QnVmZmVycyhWZWN0b3I8c3A8QUJ1ZmZlcj4gPiAqZHN0QnVmZmVycyk7CiAgICAgdmlydHVhbCB2b2lkIG9uUmVzdW1lKGJvb2wgbm90aWZ5Q29tcGxldGUpOwotICAgIHZpcnR1YWwgdm9pZCBvbkZsdXNoKGJvb2wgbm90aWZ5Q29tcGxldGUpOworICAgIHZpcnR1YWwgdm9pZCBvbkZsdXNoKCk7CiAgICAgdmlydHVhbCB2b2lkIG9uU2h1dGRvd24oYm9vbCBub3RpZnlDb21wbGV0ZSk7Ci0gICAgdmlydHVhbCB2b2lkIGRvUmVxdWVzdEJ1ZmZlcnMoKTsKKyAgICB2aXJ0dWFsIGJvb2wgZG9SZXF1ZXN0QnVmZmVycygpOwogCiBwcml2YXRlOgogICAgIGVudW0gewogICAgICAgICBrV2hhdENvZGVjTm90aWZ5ICAgICAgICAgPSAnY2RjTicsCiAgICAgICAgIGtXaGF0UmVuZGVyQnVmZmVyICAgICAgICA9ICdybmRyJywKKyAgICAgICAga1doYXRTZXRWaWRlb1N1cmZhY2UgICAgID0gJ3NTdXInCiAgICAgfTsKIAotICAgIHNwPE5hdGl2ZVdpbmRvd1dyYXBwZXI+IG1OYXRpdmVXaW5kb3c7CisgICAgc3A8U3VyZmFjZT4gbVN1cmZhY2U7CiAKICAgICBzcDxTb3VyY2U+IG1Tb3VyY2U7CiAgICAgc3A8UmVuZGVyZXI+IG1SZW5kZXJlcjsKQEAgLTc0LDI1ICs3OCwzOCBAQAogICAgIFZlY3RvcjxNZWRpYUJ1ZmZlciAqPiBtTWVkaWFCdWZmZXJzOwogICAgIFZlY3RvcjxzaXplX3Q+IG1EZXF1ZXVlZElucHV0QnVmZmVyczsKIAorICAgIGNvbnN0IHBpZF90IG1QaWQ7CiAgICAgaW50NjRfdCBtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXM7CiAgICAgaW50NjRfdCBtTnVtRnJhbWVzVG90YWw7Ci0gICAgaW50NjRfdCBtTnVtRnJhbWVzRHJvcHBlZDsKKyAgICBpbnQ2NF90IG1OdW1JbnB1dEZyYW1lc0Ryb3BwZWQ7CisgICAgaW50NjRfdCBtTnVtT3V0cHV0RnJhbWVzRHJvcHBlZDsKKyAgICBpbnQzMl90IG1WaWRlb1dpZHRoOworICAgIGludDMyX3QgbVZpZGVvSGVpZ2h0OwogICAgIGJvb2wgbUlzQXVkaW87CiAgICAgYm9vbCBtSXNWaWRlb0FWQzsKICAgICBib29sIG1Jc1NlY3VyZTsKICAgICBib29sIG1Gb3JtYXRDaGFuZ2VQZW5kaW5nOworICAgIGJvb2wgbVRpbWVDaGFuZ2VQZW5kaW5nOwogCiAgICAgYm9vbCBtUGF1c2VkOwogICAgIGJvb2wgbVJlc3VtZVBlbmRpbmc7CiAgICAgQVN0cmluZyBtQ29tcG9uZW50TmFtZTsKIAotICAgIGJvb2wgaGFuZGxlQW5JbnB1dEJ1ZmZlcigpOwotICAgIGJvb2wgaGFuZGxlQW5PdXRwdXRCdWZmZXIoKTsKKyAgICB2b2lkIGhhbmRsZUVycm9yKGludDMyX3QgZXJyKTsKKyAgICBib29sIGhhbmRsZUFuSW5wdXRCdWZmZXIoc2l6ZV90IGluZGV4KTsKKyAgICBib29sIGhhbmRsZUFuT3V0cHV0QnVmZmVyKAorICAgICAgICAgICAgc2l6ZV90IGluZGV4LAorICAgICAgICAgICAgc2l6ZV90IG9mZnNldCwKKyAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsCisgICAgICAgICAgICBpbnQzMl90IGZsYWdzKTsKKyAgICB2b2lkIGhhbmRsZU91dHB1dEZvcm1hdENoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CiAKICAgICB2b2lkIHJlbGVhc2VBbmRSZXNldE1lZGlhQnVmZmVycygpOwogICAgIHZvaWQgcmVxdWVzdENvZGVjTm90aWZpY2F0aW9uKCk7CiAgICAgYm9vbCBpc1N0YWxlUmVwbHkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCisgICAgdm9pZCBkb0ZsdXNoKGJvb2wgbm90aWZ5Q29tcGxldGUpOwogICAgIHN0YXR1c190IGZldGNoSW5wdXREYXRhKHNwPEFNZXNzYWdlPiAmcmVwbHkpOwogICAgIGJvb2wgb25JbnB1dEJ1ZmZlckZldGNoZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHZvaWQgb25SZW5kZXJCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwpAQCAtMTAwLDYgKzExNyw4IEBACiAgICAgYm9vbCBzdXBwb3J0c1NlYW1sZXNzRm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmdG8pIGNvbnN0OwogICAgIGJvb2wgc3VwcG9ydHNTZWFtbGVzc0F1ZGlvRm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmdGFyZ2V0Rm9ybWF0KSBjb25zdDsKICAgICB2b2lkIHJlbWVtYmVyQ29kZWNTcGVjaWZpY0RhdGEoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOworICAgIGJvb2wgaXNEaXNjb250aW51aXR5UGVuZGluZygpIGNvbnN0OworICAgIHZvaWQgZmluaXNoSGFuZGxlRGlzY29udGludWl0eShib29sIGZsdXNoT25UaW1lQ2hhbmdlKTsKIAogICAgIHZvaWQgbm90aWZ5UmVzdW1lQ29tcGxldGVJZk5lY2Vzc2FyeSgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyQmFzZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyQmFzZS5jcHAKaW5kZXggZDU2ZmM0ZC4uN2U3Njg0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlckJhc2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJCYXNlLmNwcApAQCAtMzEsNiArMzEsNyBAQAogTnVQbGF5ZXI6OkRlY29kZXJCYXNlOjpEZWNvZGVyQmFzZShjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkKICAgICA6ICBtTm90aWZ5KG5vdGlmeSksCiAgICAgICAgbUJ1ZmZlckdlbmVyYXRpb24oMCksCisgICAgICAgbVN0YXRzKG5ldyBBTWVzc2FnZSksCiAgICAgICAgbVJlcXVlc3RJbnB1dEJ1ZmZlcnNQZW5kaW5nKGZhbHNlKSB7CiAgICAgLy8gRXZlcnkgZGVjb2RlciBoYXMgaXRzIG93biBsb29wZXIgYmVjYXVzZSBNZWRpYUNvZGVjIG9wZXJhdGlvbnMKICAgICAvLyBhcmUgYmxvY2tpbmcsIGJ1dCBOdVBsYXllciBuZWVkcyBhc3luY2hyb25vdXMgb3BlcmF0aW9ucy4KQEAgLTYxLDcgKzYyLDcgQEAKIH0KIAogdm9pZCBOdVBsYXllcjo6RGVjb2RlckJhc2U6OmNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb25maWd1cmUsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb25maWd1cmUsIHRoaXMpOwogICAgIG1zZy0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKICAgICBtc2ctPnBvc3QoKTsKIH0KQEAgLTcwLDE0ICs3MSwyMCBAQAogICAgIG1EZWNvZGVyTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpcyk7CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXJCYXNlOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldFBhcmFtZXRlcnMsIHRoaXMpOworICAgIG1zZy0+c2V0TWVzc2FnZSgicGFyYW1zIiwgcGFyYW1zKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwogdm9pZCBOdVBsYXllcjo6RGVjb2RlckJhc2U6OnNldFJlbmRlcmVyKGNvbnN0IHNwPFJlbmRlcmVyPiAmcmVuZGVyZXIpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0UmVuZGVyZXIsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRSZW5kZXJlciwgdGhpcyk7CiAgICAgbXNnLT5zZXRPYmplY3QoInJlbmRlcmVyIiwgcmVuZGVyZXIpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCiBzdGF0dXNfdCBOdVBsYXllcjo6RGVjb2RlckJhc2U6OmdldElucHV0QnVmZmVycyhWZWN0b3I8c3A8QUJ1ZmZlcj4gPiAqYnVmZmVycykgY29uc3QgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRJbnB1dEJ1ZmZlcnMsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRJbnB1dEJ1ZmZlcnMsIHRoaXMpOwogICAgIG1zZy0+c2V0UG9pbnRlcigiYnVmZmVycyIsIGJ1ZmZlcnMpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwpAQCAtODUsMTcgKzkyLDE3IEBACiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkRlY29kZXJCYXNlOjpzaWduYWxGbHVzaCgpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0Rmx1c2gsIGlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRGbHVzaCwgdGhpcykpLT5wb3N0KCk7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkRlY29kZXJCYXNlOjpzaWduYWxSZXN1bWUoYm9vbCBub3RpZnlDb21wbGV0ZSkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZXN1bWUsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZXN1bWUsIHRoaXMpOwogICAgIG1zZy0+c2V0SW50MzIoIm5vdGlmeUNvbXBsZXRlIiwgbm90aWZ5Q29tcGxldGUpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCiB2b2lkIE51UGxheWVyOjpEZWNvZGVyQmFzZTo6aW5pdGlhdGVTaHV0ZG93bigpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0U2h1dGRvd24sIGlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTaHV0ZG93biwgdGhpcykpLT5wb3N0KCk7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkRlY29kZXJCYXNlOjpvblJlcXVlc3RJbnB1dEJ1ZmZlcnMoKSB7CkBAIC0xMDMsMTYgKzExMCwxMyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgZG9SZXF1ZXN0QnVmZmVycygpOwotfQorICAgIC8vIGRvUmVxdWVzdEJ1ZmZlcnMoKSByZXR1cm4gdHJ1ZSBpZiB3ZSBzaG91bGQgcmVxdWVzdCBtb3JlIGRhdGEKKyAgICBpZiAoZG9SZXF1ZXN0QnVmZmVycygpKSB7CisgICAgICAgIG1SZXF1ZXN0SW5wdXRCdWZmZXJzUGVuZGluZyA9IHRydWU7CiAKLXZvaWQgTnVQbGF5ZXI6OkRlY29kZXJCYXNlOjpzY2hlZHVsZVJlcXVlc3RCdWZmZXJzKCkgewotICAgIGlmIChtUmVxdWVzdElucHV0QnVmZmVyc1BlbmRpbmcpIHsKLSAgICAgICAgcmV0dXJuOworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVxdWVzdElucHV0QnVmZmVycywgdGhpcyk7CisgICAgICAgIG1zZy0+cG9zdCgxMCAqIDEwMDBsbCk7CiAgICAgfQotICAgIG1SZXF1ZXN0SW5wdXRCdWZmZXJzUGVuZGluZyA9IHRydWU7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlcXVlc3RJbnB1dEJ1ZmZlcnMsIGlkKCkpOwotICAgIG1zZy0+cG9zdCgxMCAqIDEwMDBsbCk7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkRlY29kZXJCYXNlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewpAQCAtMTI2LDYgKzEzMCwxNCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0U2V0UGFyYW1ldGVyczoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtczsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoInBhcmFtcyIsICZwYXJhbXMpKTsKKyAgICAgICAgICAgIG9uU2V0UGFyYW1ldGVycyhwYXJhbXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIGtXaGF0U2V0UmVuZGVyZXI6CiAgICAgICAgIHsKICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKQEAgLTEzNiw3ICsxNDgsNyBAQAogCiAgICAgICAgIGNhc2Uga1doYXRHZXRJbnB1dEJ1ZmZlcnM6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gKmRzdEJ1ZmZlcnM7CkBAIC0xNTcsNyArMTY5LDcgQEAKIAogICAgICAgICBjYXNlIGtXaGF0Rmx1c2g6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG9uRmx1c2godHJ1ZSk7CisgICAgICAgICAgICBvbkZsdXNoKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyQmFzZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlckJhc2UuaAppbmRleCA2NzMyZmY0Li5iMGRjMDFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyQmFzZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJCYXNlLmgKQEAgLTI2LDI0ICsyNiwyNyBAQAogCiBzdHJ1Y3QgQUJ1ZmZlcjsKIHN0cnVjdCBNZWRpYUNvZGVjOwotc3RydWN0IE1lZGlhQnVmZmVyOworY2xhc3MgTWVkaWFCdWZmZXI7CitjbGFzcyBTdXJmYWNlOwogCiBzdHJ1Y3QgTnVQbGF5ZXI6OkRlY29kZXJCYXNlIDogcHVibGljIEFIYW5kbGVyIHsKICAgICBEZWNvZGVyQmFzZShjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7CiAKICAgICB2b2lkIGNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CiAgICAgdm9pZCBpbml0KCk7CisgICAgdm9pZCBzZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKTsKIAogICAgIHZvaWQgc2V0UmVuZGVyZXIoY29uc3Qgc3A8UmVuZGVyZXI+ICZyZW5kZXJlcik7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJikgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH0KIAogICAgIHN0YXR1c190IGdldElucHV0QnVmZmVycyhWZWN0b3I8c3A8QUJ1ZmZlcj4gPiAqZHN0QnVmZmVycykgY29uc3Q7CiAgICAgdm9pZCBzaWduYWxGbHVzaCgpOwogICAgIHZvaWQgc2lnbmFsUmVzdW1lKGJvb2wgbm90aWZ5Q29tcGxldGUpOwogICAgIHZvaWQgaW5pdGlhdGVTaHV0ZG93bigpOwogCi0gICAgdmlydHVhbCB2b2lkIGdldFN0YXRzKAotICAgICAgICAgICAgaW50NjRfdCAqbU51bUZyYW1lc1RvdGFsLAotICAgICAgICAgICAgaW50NjRfdCAqbU51bUZyYW1lc0Ryb3BwZWQpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHNwPEFNZXNzYWdlPiBnZXRTdGF0cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TdGF0czsKKyAgICB9CiAKICAgICBlbnVtIHsKICAgICAgICAga1doYXRJbnB1dERpc2NvbnRpbnVpdHkgID0gJ2luRGknLApAQCAtNjIsMjMgKzY1LDI1IEBACiAgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKIAogICAgIHZpcnR1YWwgdm9pZCBvbkNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBvblNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXMpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgb25TZXRSZW5kZXJlcihjb25zdCBzcDxSZW5kZXJlcj4gJnJlbmRlcmVyKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIG9uR2V0SW5wdXRCdWZmZXJzKFZlY3RvcjxzcDxBQnVmZmVyPiA+ICpkc3RCdWZmZXJzKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIG9uUmVzdW1lKGJvb2wgbm90aWZ5Q29tcGxldGUpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgb25GbHVzaChib29sIG5vdGlmeUNvbXBsZXRlKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG9uRmx1c2goKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIG9uU2h1dGRvd24oYm9vbCBub3RpZnlDb21wbGV0ZSkgPSAwOwogCiAgICAgdm9pZCBvblJlcXVlc3RJbnB1dEJ1ZmZlcnMoKTsKLSAgICB2b2lkIHNjaGVkdWxlUmVxdWVzdEJ1ZmZlcnMoKTsKLSAgICB2aXJ0dWFsIHZvaWQgZG9SZXF1ZXN0QnVmZmVycygpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgZG9SZXF1ZXN0QnVmZmVycygpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlRXJyb3IoaW50MzJfdCBlcnIpOwogCiAgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CiAgICAgaW50MzJfdCBtQnVmZmVyR2VuZXJhdGlvbjsKKyAgICBzcDxBTWVzc2FnZT4gbVN0YXRzOwogCiBwcml2YXRlOgogICAgIGVudW0gewogICAgICAgICBrV2hhdENvbmZpZ3VyZSAgICAgICAgICAgPSAnY29uZicsCisgICAgICAgIGtXaGF0U2V0UGFyYW1ldGVycyAgICAgICA9ICdzZXRQJywKICAgICAgICAga1doYXRTZXRSZW5kZXJlciAgICAgICAgID0gJ3NldFInLAogICAgICAgICBrV2hhdEdldElucHV0QnVmZmVycyAgICAgPSAnZ0luQicsCiAgICAgICAgIGtXaGF0UmVxdWVzdElucHV0QnVmZmVycyA9ICdyZXFCJywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guY3BwCmluZGV4IDlmN2YwOWEuLjMwMTQ2YzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmNwcApAQCAtNTksMTIgKzU5LDYgQEAKIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6On5EZWNvZGVyUGFzc1Rocm91Z2goKSB7CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6Z2V0U3RhdHMoCi0gICAgICAgIGludDY0X3QgKm51bUZyYW1lc1RvdGFsLCBpbnQ2NF90ICpudW1GcmFtZXNEcm9wcGVkKSBjb25zdCB7Ci0gICAgKm51bUZyYW1lc1RvdGFsID0gMDsKLSAgICAqbnVtRnJhbWVzRHJvcHBlZCA9IDA7Ci19Ci0KIHZvaWQgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6b25Db25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKICAgICBBTE9HVigiWyVzXSBvbkNvbmZpZ3VyZSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOwogICAgIG1DYWNoZWRCeXRlcyA9IDA7CkBAIC03NCwxNyArNjgsMjQgQEAKIAogICAgIG9uUmVxdWVzdElucHV0QnVmZmVycygpOwogCisgICAgaW50MzJfdCBoYXNWaWRlbyA9IDA7CisgICAgZm9ybWF0LT5maW5kSW50MzIoImhhcy12aWRlbyIsICZoYXNWaWRlbyk7CisKICAgICAvLyBUaGUgYXVkaW8gc2luayBpcyBhbHJlYWR5IG9wZW5lZCBiZWZvcmUgdGhlIFBhc3NUaHJvdWdoIGRlY29kZXIgaXMgY3JlYXRlZC4KICAgICAvLyBPcGVuaW5nIGFnYWluIG1pZ2h0IGJlIHJlbGV2YW50IGlmIGRlY29kZXIgaXMgaW5zdGFudGlhdGVkIGFmdGVyIHNodXRkb3duIGFuZAogICAgIC8vIGZvcm1hdCBpcyBkaWZmZXJlbnQuCiAgICAgc3RhdHVzX3QgZXJyID0gbVJlbmRlcmVyLT5vcGVuQXVkaW9TaW5rKAotICAgICAgICAgICAgZm9ybWF0LCB0cnVlIC8qIG9mZmxvYWRPbmx5ICovLCBmYWxzZSAvKiBoYXNWaWRlbyAqLywKKyAgICAgICAgICAgIGZvcm1hdCwgdHJ1ZSAvKiBvZmZsb2FkT25seSAqLywgaGFzVmlkZW8sCiAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FIC8qIGZsYWdzICovLCBOVUxMIC8qIGlzT2ZmbG9hZGVkICovKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIGhhbmRsZUVycm9yKGVycik7CiAgICAgfQogfQogCit2b2lkIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6Om9uU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJi8qcGFyYW1zKi8pIHsKKyAgICBBTE9HVygib25TZXRQYXJhbWV0ZXJzKCkgY2FsbGVkIHVuZXhwZWN0ZWRseSIpOworfQorCiB2b2lkIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6Om9uU2V0UmVuZGVyZXIoCiAgICAgICAgIGNvbnN0IHNwPFJlbmRlcmVyPiAmcmVuZGVyZXIpIHsKICAgICAvLyByZW5kZXJlciBjYW4ndCBiZSBjaGFuZ2VkIGR1cmluZyBvZmZsb2FkaW5nCkBAIC0xMTAsNyArMTExLDEwIEBACiAgICAgcmV0dXJuIG1DYWNoZWRCeXRlcyA+PSBrTWF4Q2FjaGVkQnl0ZXMgfHwgbVJlYWNoZWRFT1MgfHwgbVBhdXNlZDsKIH0KIAotdm9pZCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpkb1JlcXVlc3RCdWZmZXJzKCkgeworLyoKKyAqIHJldHVybnMgdHJ1ZSBpZiB3ZSBzaG91bGQgcmVxdWVzdCBtb3JlIGRhdGEKKyAqLworYm9vbCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpkb1JlcXVlc3RCdWZmZXJzKCkgewogICAgIHN0YXR1c190IGVyciA9IE9LOwogICAgIHdoaWxlICghaXNEb25lRmV0Y2hpbmcoKSkgewogICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7CkBAIC0xMjMsMTAgKzEyNyw4IEBACiAgICAgICAgIG9uSW5wdXRCdWZmZXJGZXRjaGVkKG1zZyk7CiAgICAgfQogCi0gICAgaWYgKGVyciA9PSAtRVdPVUxEQkxPQ0sKLSAgICAgICAgICAgICYmIG1Tb3VyY2UtPmZlZWRNb3JlVFNEYXRhKCkgPT0gT0spIHsKLSAgICAgICAgc2NoZWR1bGVSZXF1ZXN0QnVmZmVycygpOwotICAgIH0KKyAgICByZXR1cm4gZXJyID09IC1FV09VTERCTE9DSworICAgICAgICAgICAgJiYgbVNvdXJjZS0+ZmVlZE1vcmVUU0RhdGEoKSA9PSBPSzsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6ZGVxdWV1ZUFjY2Vzc1VuaXQoc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpIHsKQEAgLTI0Nyw3ICsyNDksNyBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmICh0aW1lQ2hhbmdlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uRmx1c2goZmFsc2UgLyogbm90aWZ5Q29tcGxldGUgKi8pOworICAgICAgICAgICAgICAgICAgICBkb0ZsdXNoKGZhbHNlIC8qIG5vdGlmeUNvbXBsZXRlICovKTsKICAgICAgICAgICAgICAgICAgICAgZXJyID0gT0s7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXRDaGFuZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gZG8gc2VhbWxlc3MgZm9ybWF0IGNoYW5nZQpAQCAtMzMzLDcgKzMzNSw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRCdWZmZXJDb25zdW1lZCwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKGtXaGF0QnVmZmVyQ29uc3VtZWQsIHRoaXMpOwogICAgIHJlcGx5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1CdWZmZXJHZW5lcmF0aW9uKTsKICAgICByZXBseS0+c2V0SW50MzIoInNpemUiLCBidWZmZXJTaXplKTsKIApAQCAtMzY0LDcgKzM2Niw3IEBACiAgICAgfQogfQogCi12b2lkIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6Om9uRmx1c2goYm9vbCBub3RpZnlDb21wbGV0ZSkgewordm9pZCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpkb0ZsdXNoKGJvb2wgbm90aWZ5Q29tcGxldGUpIHsKICAgICArK21CdWZmZXJHZW5lcmF0aW9uOwogICAgIG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcyA9IC0xOwogICAgIG1QZW5kaW5nQXVkaW9BY2Nlc3NVbml0LmNsZWFyKCk7CkBAIC0zNzYsMTggKzM3OCwyMSBAQAogICAgICAgICBtUmVuZGVyZXItPnNpZ25hbFRpbWVEaXNjb250aW51aXR5KCk7CiAgICAgfQogCi0gICAgaWYgKG5vdGlmeUNvbXBsZXRlKSB7Ci0gICAgICAgIG1QYXVzZWQgPSB0cnVlOwotICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEZsdXNoQ29tcGxldGVkKTsKLSAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgfQotCiAgICAgbVBlbmRpbmdCdWZmZXJzVG9EcmFpbiA9IDA7CiAgICAgbUNhY2hlZEJ5dGVzID0gMDsKICAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOwogfQogCit2b2lkIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6Om9uRmx1c2goKSB7CisgICAgZG9GbHVzaCh0cnVlIC8qIG5vdGlmeUNvbXBsZXRlICovKTsKKworICAgIG1QYXVzZWQgPSB0cnVlOworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRGbHVzaENvbXBsZXRlZCk7CisgICAgbm90aWZ5LT5wb3N0KCk7CisKK30KKwogdm9pZCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpvblNodXRkb3duKGJvb2wgbm90aWZ5Q29tcGxldGUpIHsKICAgICArK21CdWZmZXJHZW5lcmF0aW9uOwogICAgIG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcyA9IC0xOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guaAppbmRleCBhNmUxZmFmLi5kYjMzZTg3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guaApAQCAtMjksMTAgKzI5LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U291cmNlPiAmc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxSZW5kZXJlcj4gJnJlbmRlcmVyKTsKIAotICAgIHZpcnR1YWwgdm9pZCBnZXRTdGF0cygKLSAgICAgICAgICAgIGludDY0X3QgKm1OdW1GcmFtZXNUb3RhbCwKLSAgICAgICAgICAgIGludDY0X3QgKm1OdW1GcmFtZXNEcm9wcGVkKSBjb25zdDsKLQogcHJvdGVjdGVkOgogCiAgICAgdmlydHVhbCB+RGVjb2RlclBhc3NUaHJvdWdoKCk7CkBAIC00MCwxMiArMzYsMTMgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCiAgICAgdmlydHVhbCB2b2lkIG9uQ29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25TZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKTsKICAgICB2aXJ0dWFsIHZvaWQgb25TZXRSZW5kZXJlcihjb25zdCBzcDxSZW5kZXJlcj4gJnJlbmRlcmVyKTsKICAgICB2aXJ0dWFsIHZvaWQgb25HZXRJbnB1dEJ1ZmZlcnMoVmVjdG9yPHNwPEFCdWZmZXI+ID4gKmRzdEJ1ZmZlcnMpOwogICAgIHZpcnR1YWwgdm9pZCBvblJlc3VtZShib29sIG5vdGlmeUNvbXBsZXRlKTsKLSAgICB2aXJ0dWFsIHZvaWQgb25GbHVzaChib29sIG5vdGlmeUNvbXBsZXRlKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25GbHVzaCgpOwogICAgIHZpcnR1YWwgdm9pZCBvblNodXRkb3duKGJvb2wgbm90aWZ5Q29tcGxldGUpOwotICAgIHZpcnR1YWwgdm9pZCBkb1JlcXVlc3RCdWZmZXJzKCk7CisgICAgdmlydHVhbCBib29sIGRvUmVxdWVzdEJ1ZmZlcnMoKTsKIAogcHJpdmF0ZToKICAgICBlbnVtIHsKQEAgLTc3LDYgKzc0LDcgQEAKICAgICBzdGF0dXNfdCBkZXF1ZXVlQWNjZXNzVW5pdChzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCk7CiAgICAgc3A8QUJ1ZmZlcj4gYWdncmVnYXRlQnVmZmVyKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KTsKICAgICBzdGF0dXNfdCBmZXRjaElucHV0RGF0YShzcDxBTWVzc2FnZT4gJnJlcGx5KTsKKyAgICB2b2lkIGRvRmx1c2goYm9vbCBub3RpZnlDb21wbGV0ZSk7CiAKICAgICB2b2lkIG9uSW5wdXRCdWZmZXJGZXRjaGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICB2b2lkIG9uQnVmZmVyQ29uc3VtZWQoaW50MzJfdCBzaXplKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCmluZGV4IGJjNzlmZGIuLjczNzAyMjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBMT0dfVEFHICJOdVBsYXllckRyaXZlciIKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKICNpbmNsdWRlICJOdVBsYXllckRyaXZlci5oIgogCkBAIC0zMiw3ICszMyw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotTnVQbGF5ZXJEcml2ZXI6Ok51UGxheWVyRHJpdmVyKCkKK051UGxheWVyRHJpdmVyOjpOdVBsYXllckRyaXZlcihwaWRfdCBwaWQpCiAgICAgOiBtU3RhdGUoU1RBVEVfSURMRSksCiAgICAgICBtSXNBc3luY1ByZXBhcmUoZmFsc2UpLAogICAgICAgbUFzeW5jUmVzdWx0KFVOS05PV05fRVJST1IpLApAQCAtNTQsNyArNTUsNyBAQAogICAgICAgICAgICAgdHJ1ZSwgIC8qIGNhbkNhbGxKYXZhICovCiAgICAgICAgICAgICBQUklPUklUWV9BVURJTyk7CiAKLSAgICBtUGxheWVyID0gbmV3IE51UGxheWVyOworICAgIG1QbGF5ZXIgPSBuZXcgTnVQbGF5ZXIocGlkKTsKICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVBsYXllcik7CiAKICAgICBtUGxheWVyLT5zZXREcml2ZXIodGhpcyk7CkBAIC0xMzUsNiArMTM2LDI1IEBACiAgICAgcmV0dXJuIG1Bc3luY1Jlc3VsdDsKIH0KIAorc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkgeworICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVwKSBjYWxsYmFjayBzb3VyY2UiLCB0aGlzKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9JRExFKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBtU3RhdGUgPSBTVEFURV9TRVRfREFUQVNPVVJDRV9QRU5ESU5HOworCisgICAgbVBsYXllci0+c2V0RGF0YVNvdXJjZUFzeW5jKHNvdXJjZSk7CisKKyAgICB3aGlsZSAobVN0YXRlID09IFNUQVRFX1NFVF9EQVRBU09VUkNFX1BFTkRJTkcpIHsKKyAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKKyAgICB9CisKKyAgICByZXR1cm4gbUFzeW5jUmVzdWx0OworfQorCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0VmlkZW9TdXJmYWNlVGV4dHVyZSgKICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJmJ1ZmZlclByb2R1Y2VyKSB7CiAgICAgQUxPR1YoInNldFZpZGVvU3VyZmFjZVRleHR1cmUoJXApIiwgdGhpcyk7CkBAIC0yMjIsNyArMjQyLDcgQEAKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnN0YXJ0KCkgewotICAgIEFMT0dEKCJzdGFydCglcCkiLCB0aGlzKTsKKyAgICBBTE9HRCgic3RhcnQoJXApLCBzdGF0ZSBpcyAlZCwgZW9zIGlzICVkIiwgdGhpcywgbVN0YXRlLCBtQXRFT1MpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBzd2l0Y2ggKG1TdGF0ZSkgewpAQCAtMzQxLDYgKzM2MSwzNCBAQAogICAgIHJldHVybiBtU3RhdGUgPT0gU1RBVEVfUlVOTklORyAmJiAhbUF0RU9TOwogfQogCitzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgc3RhdHVzX3QgZXJyID0gbVBsYXllci0+c2V0UGxheWJhY2tTZXR0aW5ncyhyYXRlKTsKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIGlmIChyYXRlLm1TcGVlZCA9PSAwLmYgJiYgbVN0YXRlID09IFNUQVRFX1JVTk5JTkcpIHsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BBVVNFRDsKKyAgICAgICAgICAgIC8vIHRyeSB0byB1cGRhdGUgcG9zaXRpb24KKyAgICAgICAgICAgICh2b2lkKW1QbGF5ZXItPmdldEN1cnJlbnRQb3NpdGlvbigmbVBvc2l0aW9uVXMpOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9QQVVTRUQpOworICAgICAgICB9IGVsc2UgaWYgKHJhdGUubVNwZWVkICE9IDAuZiAmJiBtU3RhdGUgPT0gU1RBVEVfUEFVU0VEKSB7CisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9SVU5OSU5HOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE51UGxheWVyRHJpdmVyOjpnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlKSB7CisgICAgcmV0dXJuIG1QbGF5ZXItPmdldFBsYXliYWNrU2V0dGluZ3MocmF0ZSk7Cit9CisKK3N0YXR1c190IE51UGxheWVyRHJpdmVyOjpzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MgJnN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCkgeworICAgIHJldHVybiBtUGxheWVyLT5zZXRTeW5jU2V0dGluZ3Moc3luYywgdmlkZW9GcHNIaW50KTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OmdldFN5bmNTZXR0aW5ncyhBVlN5bmNTZXR0aW5ncyAqc3luYywgZmxvYXQgKnZpZGVvRnBzKSB7CisgICAgcmV0dXJuIG1QbGF5ZXItPmdldFN5bmNTZXR0aW5ncyhzeW5jLCB2aWRlb0Zwcyk7Cit9CisKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpzZWVrVG8oaW50IG1zZWMpIHsKICAgICBBTE9HRCgic2Vla1RvKCVwKSAlZCBtcyIsIHRoaXMsIG1zZWMpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CkBAIC0zNTAsMTcgKzM5OCwxMCBAQAogICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6CiAgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1TdGFydHVwU2Vla1RpbWVVcyA9IHNlZWtUaW1lVXM7Ci0gICAgICAgICAgICAvLyBwcmV0ZW5kIHRoYXQgdGhlIHNlZWsgY29tcGxldGVkLiBJdCB3aWxsIGFjdHVhbGx5IGhhcHBlbiB3aGVuIHN0YXJ0aW5nIHBsYXliYWNrLgotICAgICAgICAgICAgLy8gVE9ETzogYWN0dWFsbHkgcGVyZm9ybSB0aGUgc2VlayBoZXJlLCBzbyB0aGUgcGxheWVyIGlzIHJlYWR5IHRvIGdvIGF0IHRoZSBuZXcKLSAgICAgICAgICAgIC8vIGxvY2F0aW9uCi0gICAgICAgICAgICBub3RpZnlTZWVrQ29tcGxldGVfbCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6CiAgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgorICAgICAgICAgICAgbVN0YXJ0dXBTZWVrVGltZVVzID0gc2Vla1RpbWVVczsKKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaC4KKyAgICAgICAgY2FzZSBTVEFURV9SVU5OSU5HOgogICAgICAgICB7CiAgICAgICAgICAgICBtQXRFT1MgPSBmYWxzZTsKICAgICAgICAgICAgIG1TZWVrSW5Qcm9ncmVzcyA9IHRydWU7CkBAIC00NDQsNiArNDg1LDEzIEBACiAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfU1RPUFBFRCk7CiAgICAgfQogCisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoInBlcnNpc3QuZGVidWcuc2Yuc3RhdHMiLCB2YWx1ZSwgTlVMTCkgJiYKKyAgICAgICAgICAgICghc3RyY21wKCIxIiwgdmFsdWUpIHx8ICFzdHJjYXNlY21wKCJ0cnVlIiwgdmFsdWUpKSkgeworICAgICAgICBWZWN0b3I8U3RyaW5nMTY+IGFyZ3M7CisgICAgICAgIGR1bXAoLTEsIGFyZ3MpOworICAgIH0KKwogICAgIG1TdGF0ZSA9IFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTOwogICAgIG1QbGF5ZXItPnJlc2V0QXN5bmMoKTsKIApAQCAtNjEyLDIyICs2NjAsNTkgQEAKIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OmR1bXAoCiAgICAgICAgIGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmIC8qIGFyZ3MgKi8pIGNvbnN0IHsKLSAgICBpbnQ2NF90IG51bUZyYW1lc1RvdGFsOwotICAgIGludDY0X3QgbnVtRnJhbWVzRHJvcHBlZDsKLSAgICBtUGxheWVyLT5nZXRTdGF0cygmbnVtRnJhbWVzVG90YWwsICZudW1GcmFtZXNEcm9wcGVkKTsKIAotICAgIEZJTEUgKm91dCA9IGZkb3BlbihkdXAoZmQpLCAidyIpOworICAgIFZlY3RvcjxzcDxBTWVzc2FnZT4gPiB0cmFja1N0YXRzOworICAgIG1QbGF5ZXItPmdldFN0YXRzKCZ0cmFja1N0YXRzKTsKIAotICAgIGZwcmludGYob3V0LCAiIE51UGxheWVyXG4iKTsKLSAgICBmcHJpbnRmKG91dCwgIiAgbnVtRnJhbWVzVG90YWwoJSIgUFJJZDY0ICIpLCBudW1GcmFtZXNEcm9wcGVkKCUiIFBSSWQ2NCAiKSwgIgotICAgICAgICAgICAgICAgICAicGVyY2VudGFnZURyb3BwZWQoJS4yZilcbiIsCi0gICAgICAgICAgICAgICAgIG51bUZyYW1lc1RvdGFsLAotICAgICAgICAgICAgICAgICBudW1GcmFtZXNEcm9wcGVkLAotICAgICAgICAgICAgICAgICBudW1GcmFtZXNUb3RhbCA9PSAwCi0gICAgICAgICAgICAgICAgICAgID8gMC4wIDogKGRvdWJsZSludW1GcmFtZXNEcm9wcGVkIC8gbnVtRnJhbWVzVG90YWwpOworICAgIEFTdHJpbmcgbG9nU3RyaW5nKCIgTnVQbGF5ZXJcbiIpOworICAgIGNoYXIgYnVmWzI1Nl0gPSB7MH07CiAKLSAgICBmY2xvc2Uob3V0KTsKLSAgICBvdXQgPSBOVUxMOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdHJhY2tTdGF0cy5zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJnN0YXRzID0gdHJhY2tTdGF0cy5pdGVtQXQoaSk7CisKKyAgICAgICAgQVN0cmluZyBtaW1lOworICAgICAgICBpZiAoc3RhdHMtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIgIG1pbWUoJXMpXG4iLCBtaW1lLmNfc3RyKCkpOworICAgICAgICAgICAgbG9nU3RyaW5nLmFwcGVuZChidWYpOworICAgICAgICB9CisKKyAgICAgICAgQVN0cmluZyBuYW1lOworICAgICAgICBpZiAoc3RhdHMtPmZpbmRTdHJpbmcoImNvbXBvbmVudC1uYW1lIiwgJm5hbWUpKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiICAgIGRlY29kZXIoJXMpXG4iLCBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgbG9nU3RyaW5nLmFwcGVuZChidWYpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1pbWUuc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgICAgIGlmIChzdGF0cy0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkKKyAgICAgICAgICAgICAgICAgICAgJiYgc3RhdHMtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiICAgIHJlc29sdXRpb24oJWQgeCAlZClcbiIsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgIGxvZ1N0cmluZy5hcHBlbmQoYnVmKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50NjRfdCBudW1GcmFtZXNUb3RhbCA9IDA7CisgICAgICAgICAgICBpbnQ2NF90IG51bUZyYW1lc0Ryb3BwZWQgPSAwOworCisgICAgICAgICAgICBzdGF0cy0+ZmluZEludDY0KCJmcmFtZXMtdG90YWwiLCAmbnVtRnJhbWVzVG90YWwpOworICAgICAgICAgICAgc3RhdHMtPmZpbmRJbnQ2NCgiZnJhbWVzLWRyb3BwZWQtb3V0cHV0IiwgJm51bUZyYW1lc0Ryb3BwZWQpOworICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiAgICBudW1GcmFtZXNUb3RhbCglbGxkKSwgbnVtRnJhbWVzRHJvcHBlZCglbGxkKSwgIgorICAgICAgICAgICAgICAgICAgICAgInBlcmNlbnRhZ2VEcm9wcGVkKCUuMmYlJSlcbiIsCisgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW51bUZyYW1lc1RvdGFsLAorICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyludW1GcmFtZXNEcm9wcGVkLAorICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzVG90YWwgPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMC4wIDogKGRvdWJsZSkobnVtRnJhbWVzRHJvcHBlZCAqIDEwMCkgLyBudW1GcmFtZXNUb3RhbCk7CisgICAgICAgICAgICBsb2dTdHJpbmcuYXBwZW5kKGJ1Zik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HSSgiJXMiLCBsb2dTdHJpbmcuY19zdHIoKSk7CisKKyAgICBpZiAoZmQgPj0gMCkgeworICAgICAgICBGSUxFICpvdXQgPSBmZG9wZW4oZHVwKGZkKSwgInciKTsKKyAgICAgICAgZnByaW50ZihvdXQsICIlcyIsIGxvZ1N0cmluZy5jX3N0cigpKTsKKyAgICAgICAgZmNsb3NlKG91dCk7CisgICAgICAgIG91dCA9IE5VTEw7CisgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtNjQwLDYgKzcyNSw3IEBACiAKIHZvaWQgTnVQbGF5ZXJEcml2ZXI6Om5vdGlmeUxpc3RlbmVyX2woCiAgICAgICAgIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICppbikgeworICAgIEFMT0dEKCJub3RpZnlMaXN0ZW5lcl9sKCVwKSwgKCVkLCAlZCwgJWQpIiwgdGhpcywgbXNnLCBleHQxLCBleHQyKTsKICAgICBzd2l0Y2ggKG1zZykgewogICAgICAgICBjYXNlIE1FRElBX1BMQVlCQUNLX0NPTVBMRVRFOgogICAgICAgICB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oCmluZGV4IDVjYmE3ZDkuLmQwMDlmZDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oCkBAIC0yNCw3ICsyNCw3IEBACiBzdHJ1Y3QgTnVQbGF5ZXI7CiAKIHN0cnVjdCBOdVBsYXllckRyaXZlciA6IHB1YmxpYyBNZWRpYVBsYXllckludGVyZmFjZSB7Ci0gICAgTnVQbGF5ZXJEcml2ZXIoKTsKKyAgICBOdVBsYXllckRyaXZlcihwaWRfdCBwaWQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKIApAQCAtMzksNiArMzksOCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+JiBkYXRhU291cmNlKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TdXJmYWNlVGV4dHVyZSgKICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZidWZmZXJQcm9kdWNlcik7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlKCk7CkBAIC00Nyw2ICs0OSwxMCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKICAgICB2aXJ0dWFsIGJvb2wgaXNQbGF5aW5nKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzICpzeW5jLCBmbG9hdCAqdmlkZW9GcHMpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2Vla1RvKGludCBtc2VjKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEN1cnJlbnRQb3NpdGlvbihpbnQgKm1zZWMpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RHVyYXRpb24oaW50ICptc2VjKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcAppbmRleCAyNTIyNWE4Li4wNGE0NmY0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCkBAIC0xOSwyMiArMTksNTIgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgIk51UGxheWVyUmVuZGVyZXIuaCIKLQorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FXYWtlTG9jay5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ2xvY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLQotI2luY2x1ZGUgPFZpZGVvRnJhbWVTY2hlZHVsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmg+CiAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKKy8qCisgKiBFeGFtcGxlIG9mIGNvbW1vbiBjb25maWd1cmF0aW9uIHNldHRpbmdzIGluIHNoZWxsIHNjcmlwdCBmb3JtCisKKyAgICNUdXJuIG9mZmxvYWQgYXVkaW8gb2ZmICh1c2UgUENNIGZvciBQbGF5IE11c2ljKSAtLSBBdWRpb1BvbGljeU1hbmFnZXIKKyAgIGFkYiBzaGVsbCBzZXRwcm9wIGF1ZGlvLm9mZmxvYWQuZGlzYWJsZSAxCisKKyAgICNBbGxvdyBvZmZsb2FkIGF1ZGlvIHdpdGggdmlkZW8gKHJlcXVpcmVzIG9mZmxvYWRpbmcgdG8gYmUgZW5hYmxlZCkgLS0gQXVkaW9Qb2xpY3lNYW5hZ2VyCisgICBhZGIgc2hlbGwgc2V0cHJvcCBhdWRpby5vZmZsb2FkLnZpZGVvIDEKKworICAgI1VzZSBhdWRpbyBjYWxsYmFja3MgZm9yIFBDTSBkYXRhCisgICBhZGIgc2hlbGwgc2V0cHJvcCBtZWRpYS5zdGFnZWZyaWdodC5hdWRpby5jYmsgMQorCisgICAjVXNlIGRlZXAgYnVmZmVyIGZvciBQQ00gZGF0YSB3aXRoIHZpZGVvIChpdCBpcyBnZW5lcmFsbHkgZW5hYmxlZCBmb3IgYXVkaW8tb25seSkKKyAgIGFkYiBzaGVsbCBzZXRwcm9wIG1lZGlhLnN0YWdlZnJpZ2h0LmF1ZGlvLmRlZXAgMQorCisgICAjU2V0IHNpemUgb2YgYnVmZmVycyBmb3IgcGNtIGF1ZGlvIHNpbmsgaW4gbXNlYyAoZXhhbXBsZTogMTAwMCBtc2VjKQorICAgYWRiIHNoZWxsIHNldHByb3AgbWVkaWEuc3RhZ2VmcmlnaHQuYXVkaW8uc2luayAxMDAwCisKKyAqIFRoZXNlIGNvbmZpZ3VyYXRpb25zIHRha2UgZWZmZWN0IGZvciB0aGUgbmV4dCB0cmFjayBwbGF5ZWQgKG5vdCB0aGUgY3VycmVudCB0cmFjaykuCisgKi8KKworc3RhdGljIGlubGluZSBib29sIGdldFVzZUF1ZGlvQ2FsbGJhY2tTZXR0aW5nKCkgeworICAgIHJldHVybiBwcm9wZXJ0eV9nZXRfYm9vbCgibWVkaWEuc3RhZ2VmcmlnaHQuYXVkaW8uY2JrIiwgZmFsc2UgLyogZGVmYXVsdF92YWx1ZSAqLyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50MzJfdCBnZXRBdWRpb1NpbmtQY21Nc1NldHRpbmcoKSB7CisgICAgcmV0dXJuIHByb3BlcnR5X2dldF9pbnQzMigKKyAgICAgICAgICAgICJtZWRpYS5zdGFnZWZyaWdodC5hdWRpby5zaW5rIiwgNTAwIC8qIGRlZmF1bHRfdmFsdWUgKi8pOworfQorCiAvLyBNYXhpbXVtIHRpbWUgaW4gcGF1c2VkIHN0YXRlIHdoZW4gb2ZmbG9hZGluZyBhdWRpbyBkZWNvbXByZXNzaW9uLiBXaGVuIGVsYXBzZWQsIHRoZSBBdWRpb1NpbmsKIC8vIGlzIGNsb3NlZCB0byBhbGxvdyB0aGUgYXVkaW8gRFNQIHRvIHBvd2VyIGRvd24uCiBzdGF0aWMgY29uc3QgaW50NjRfdCBrT2ZmbG9hZFBhdXNlTWF4VXMgPSAxMDAwMDAwMGxsOwpAQCAtNjMsMzQgKzkzLDM0IEBACiAgICAgICBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyhmYWxzZSksCiAgICAgICBtQXVkaW9RdWV1ZUdlbmVyYXRpb24oMCksCiAgICAgICBtVmlkZW9RdWV1ZUdlbmVyYXRpb24oMCksCisgICAgICBtQXVkaW9EcmFpbkdlbmVyYXRpb24oMCksCisgICAgICBtVmlkZW9EcmFpbkdlbmVyYXRpb24oMCksCisgICAgICBtUGxheWJhY2tTZXR0aW5ncyhBVURJT19QTEFZQkFDS19SQVRFX0RFRkFVTFQpLAogICAgICAgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcygtMSksCiAgICAgICBtQW5jaG9yVGltZU1lZGlhVXMoLTEpLAotICAgICAgbUFuY2hvclRpbWVSZWFsVXMoLTEpLAogICAgICAgbUFuY2hvck51bUZyYW1lc1dyaXR0ZW4oLTEpLAotICAgICAgbUFuY2hvck1heE1lZGlhVXMoLTEpLAogICAgICAgbVZpZGVvTGF0ZUJ5VXMoMGxsKSwKICAgICAgIG1IYXNBdWRpbyhmYWxzZSksCiAgICAgICBtSGFzVmlkZW8oZmFsc2UpLAotICAgICAgbVBhdXNlU3RhcnRlZFRpbWVSZWFsVXMoLTEpLAotICAgICAgbUZsdXNoaW5nQXVkaW8oZmFsc2UpLAotICAgICAgbUZsdXNoaW5nVmlkZW8oZmFsc2UpLAogICAgICAgbU5vdGlmeUNvbXBsZXRlQXVkaW8oZmFsc2UpLAogICAgICAgbU5vdGlmeUNvbXBsZXRlVmlkZW8oZmFsc2UpLAogICAgICAgbVN5bmNRdWV1ZXMoZmFsc2UpLAogICAgICAgbVBhdXNlZChmYWxzZSksCi0gICAgICBtUGF1c2VQb3NpdGlvbk1lZGlhVGltZVVzKC0xKSwKICAgICAgIG1WaWRlb1NhbXBsZVJlY2VpdmVkKGZhbHNlKSwKICAgICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQoZmFsc2UpLAogICAgICAgbVZpZGVvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uKDApLAogICAgICAgbUF1ZGlvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uKDApLAogICAgICAgbUF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dEdlbmVyYXRpb24oMCksCi0gICAgICBtQXVkaW9PZmZsb2FkVG9ybkRvd24oZmFsc2UpLAorICAgICAgbUF1ZGlvVG9ybkRvd24oZmFsc2UpLAogICAgICAgbUN1cnJlbnRPZmZsb2FkSW5mbyhBVURJT19JTkZPX0lOSVRJQUxJWkVSKSwKICAgICAgIG1DdXJyZW50UGNtSW5mbyhBVURJT19QQ01JTkZPX0lOSVRJQUxJWkVSKSwKICAgICAgIG1Ub3RhbEJ1ZmZlcnNRdWV1ZWQoMCksCiAgICAgICBtTGFzdEF1ZGlvQnVmZmVyRHJhaW5lZCgwKSwKKyAgICAgIG1Vc2VBdWRpb0NhbGxiYWNrKGZhbHNlKSwKICAgICAgIG1XYWtlTG9jayhuZXcgQVdha2VMb2NrKCkpIHsKLQorICAgIG1NZWRpYUNsb2NrID0gbmV3IE1lZGlhQ2xvY2s7CisgICAgbVBsYXliYWNrUmF0ZSA9IG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZDsKKyAgICBtTWVkaWFDbG9jay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1JhdGUpOwogfQogCiBOdVBsYXllcjo6UmVuZGVyZXI6On5SZW5kZXJlcigpIHsKQEAgLTEwNSw3ICsxMzUsOCBAQAogICAgICAgICBib29sIGF1ZGlvLAogICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyLAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeUNvbnN1bWVkKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFF1ZXVlQnVmZmVyLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UXVldWVCdWZmZXIsIHRoaXMpOworICAgIG1zZy0+c2V0SW50MzIoInF1ZXVlR2VuZXJhdGlvbiIsIGdldFF1ZXVlR2VuZXJhdGlvbihhdWRpbykpOwogICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvIiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oYXVkaW8pKTsKICAgICBtc2ctPnNldEJ1ZmZlcigiYnVmZmVyIiwgYnVmZmVyKTsKICAgICBtc2ctPnNldE1lc3NhZ2UoIm5vdGlmeUNvbnN1bWVkIiwgbm90aWZ5Q29uc3VtZWQpOwpAQCAtMTE1LDE5OSArMTQ2LDIwOSBAQAogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnF1ZXVlRU9TKGJvb2wgYXVkaW8sIHN0YXR1c190IGZpbmFsUmVzdWx0KSB7CiAgICAgQ0hFQ0tfTkUoZmluYWxSZXN1bHQsIChzdGF0dXNfdClPSyk7CiAKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UXVldWVFT1MsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRRdWV1ZUVPUywgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQzMigicXVldWVHZW5lcmF0aW9uIiwgZ2V0UXVldWVHZW5lcmF0aW9uKGF1ZGlvKSk7CiAgICAgbXNnLT5zZXRJbnQzMigiYXVkaW8iLCBzdGF0aWNfY2FzdDxpbnQzMl90PihhdWRpbykpOwogICAgIG1zZy0+c2V0SW50MzIoImZpbmFsUmVzdWx0IiwgZmluYWxSZXN1bHQpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCi12b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6Zmx1c2goYm9vbCBhdWRpbywgYm9vbCBub3RpZnlDb21wbGV0ZSkgewotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1GbHVzaExvY2spOwotICAgICAgICBpZiAoYXVkaW8pIHsKLSAgICAgICAgICAgIG1Ob3RpZnlDb21wbGV0ZUF1ZGlvIHw9IG5vdGlmeUNvbXBsZXRlOwotICAgICAgICAgICAgaWYgKG1GbHVzaGluZ0F1ZGlvKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU5vdGlmeUNvbXBsZXRlVmlkZW8gfD0gbm90aWZ5Q29tcGxldGU7Ci0gICAgICAgICAgICBpZiAobUZsdXNoaW5nVmlkZW8pIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRmx1c2hpbmdWaWRlbyA9IHRydWU7Ci0gICAgICAgIH0KK3N0YXR1c190IE51UGxheWVyOjpSZW5kZXJlcjo6c2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb25maWdQbGF5YmFjaywgdGhpcyk7CisgICAgd3JpdGVUb0FNZXNzYWdlKG1zZywgcmF0ZSk7CisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uQ29uZmlnUGxheWJhY2soY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUgLyogc2FuaXRpemVkICovKSB7CisgICAgaWYgKHJhdGUubVNwZWVkID09IDAuZikgeworICAgICAgICBvblBhdXNlKCk7CisgICAgICAgIC8vIGRvbid0IGNhbGwgYXVkaW9zaW5rJ3Mgc2V0UGxheWJhY2tSYXRlIGlmIHBhdXNpbmcsIGFzIHBpdGNoIGRvZXMgbm90CisgICAgICAgIC8vIGhhdmUgdG8gY29ycmVzcG9uZCB0byB0aGUgYW55IG5vbi0wIHNwZWVkIChlLmcgb2xkIHNwZWVkKS4gS2VlcAorICAgICAgICAvLyBzZXR0aW5ncyBub25ldGhlbGVzcywgdXNpbmcgdGhlIG9sZCBzcGVlZCwgaW4gY2FzZSBhdWRpb3NpbmsgY2hhbmdlcy4KKyAgICAgICAgQXVkaW9QbGF5YmFja1JhdGUgbmV3UmF0ZSA9IHJhdGU7CisgICAgICAgIG5ld1JhdGUubVNwZWVkID0gbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkOworICAgICAgICBtUGxheWJhY2tTZXR0aW5ncyA9IG5ld1JhdGU7CisgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Rmx1c2gsIGlkKCkpOworICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwgJiYgbUF1ZGlvU2luay0+cmVhZHkoKSkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQXVkaW9TaW5rLT5zZXRQbGF5YmFja1JhdGUocmF0ZSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisgICAgbVBsYXliYWNrU2V0dGluZ3MgPSByYXRlOworICAgIG1QbGF5YmFja1JhdGUgPSByYXRlLm1TcGVlZDsKKyAgICBtTWVkaWFDbG9jay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1JhdGUpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlIC8qIG5vbm51bGwgKi8pIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0UGxheWJhY2tTZXR0aW5ncywgdGhpcyk7CisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICByZWFkRnJvbUFNZXNzYWdlKHJlc3BvbnNlLCByYXRlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uR2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSAvKiBub25udWxsICovKSB7CisgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCAmJiBtQXVkaW9TaW5rLT5yZWFkeSgpKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1NpbmstPmdldFBsYXliYWNrUmF0ZShyYXRlKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgaWYgKCFpc0F1ZGlvUGxheWJhY2tSYXRlRXF1YWwoKnJhdGUsIG1QbGF5YmFja1NldHRpbmdzKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjb3JyZWN0aW5nIG1pc21hdGNoIGluIGludGVybmFsL2V4dGVybmFsIHBsYXliYWNrIHJhdGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGdldCBwbGF5YmFjayBzZXR0aW5ncyB1c2VkIGJ5IGF1ZGlvc2luaywgYXMgaXQgbWF5IGJlCisgICAgICAgICAgICAvLyBzbGlnaHRseSBvZmYgZHVlIHRvIGF1ZGlvc2luayBub3QgdGFraW5nIHNtYWxsIGNoYW5nZXMuCisgICAgICAgICAgICBtUGxheWJhY2tTZXR0aW5ncyA9ICpyYXRlOworICAgICAgICAgICAgaWYgKG1QYXVzZWQpIHsKKyAgICAgICAgICAgICAgICByYXRlLT5tU3BlZWQgPSAwLmY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgKnJhdGUgPSBtUGxheWJhY2tTZXR0aW5nczsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpSZW5kZXJlcjo6c2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29uZmlnU3luYywgdGhpcyk7CisgICAgd3JpdGVUb0FNZXNzYWdlKG1zZywgc3luYywgdmlkZW9GcHNIaW50KTsKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpSZW5kZXJlcjo6b25Db25maWdTeW5jKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQgX191bnVzZWQpIHsKKyAgICBpZiAoc3luYy5tU291cmNlICE9IEFWU1lOQ19TT1VSQ0VfREVGQVVMVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICAvLyBUT0RPOiBzdXBwb3J0IHN5bmMgc291cmNlcworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpnZXRTeW5jU2V0dGluZ3MoQVZTeW5jU2V0dGluZ3MgKnN5bmMsIGZsb2F0ICp2aWRlb0ZwcykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRTeW5jU2V0dGluZ3MsIHRoaXMpOworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgcmVhZEZyb21BTWVzc2FnZShyZXNwb25zZSwgc3luYywgdmlkZW9GcHMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpSZW5kZXJlcjo6b25HZXRTeW5jU2V0dGluZ3MoCisgICAgICAgIEFWU3luY1NldHRpbmdzICpzeW5jIC8qIG5vbm51bGwgKi8sIGZsb2F0ICp2aWRlb0ZwcyAvKiBub25udWxsICovKSB7CisgICAgKnN5bmMgPSBtU3luY1NldHRpbmdzOworICAgICp2aWRlb0ZwcyA9IC0xLmY7CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6Zmx1c2goYm9vbCBhdWRpbywgYm9vbCBub3RpZnlDb21wbGV0ZSkgeworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgICAgICBtTm90aWZ5Q29tcGxldGVBdWRpbyB8PSBub3RpZnlDb21wbGV0ZTsKKyAgICAgICAgICAgIGNsZWFyQXVkaW9GaXJzdEFuY2hvclRpbWVfbCgpOworICAgICAgICAgICAgKyttQXVkaW9RdWV1ZUdlbmVyYXRpb247CisgICAgICAgICAgICArK21BdWRpb0RyYWluR2VuZXJhdGlvbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Ob3RpZnlDb21wbGV0ZVZpZGVvIHw9IG5vdGlmeUNvbXBsZXRlOworICAgICAgICAgICAgKyttVmlkZW9RdWV1ZUdlbmVyYXRpb247CisgICAgICAgICAgICArK21WaWRlb0RyYWluR2VuZXJhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIGNsZWFyQW5jaG9yVGltZV9sKCk7CisgICAgICAgIG1WaWRlb0xhdGVCeVVzID0gMDsKKyAgICAgICAgbVN5bmNRdWV1ZXMgPSBmYWxzZTsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Rmx1c2gsIHRoaXMpOwogICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvIiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oYXVkaW8pKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KIAogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnNpZ25hbFRpbWVEaXNjb250aW51aXR5KCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgLy8gQ0hFQ0sobUF1ZGlvUXVldWUuZW1wdHkoKSk7Ci0gICAgLy8gQ0hFQ0sobVZpZGVvUXVldWUuZW1wdHkoKSk7Ci0gICAgc2V0QXVkaW9GaXJzdEFuY2hvclRpbWUoLTEpOwotICAgIHNldEFuY2hvclRpbWUoLTEsIC0xKTsKLSAgICBzZXRWaWRlb0xhdGVCeVVzKDApOwotICAgIG1TeW5jUXVldWVzID0gZmFsc2U7Ci19Ci0KLXZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzaWduYWxBdWRpb1NpbmtDaGFuZ2VkKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRBdWRpb1NpbmtDaGFuZ2VkLCBpZCgpKSktPnBvc3QoKTsKIH0KIAogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnNpZ25hbERpc2FibGVPZmZsb2FkQXVkaW8oKSB7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdERpc2FibGVPZmZsb2FkQXVkaW8sIGlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXREaXNhYmxlT2ZmbG9hZEF1ZGlvLCB0aGlzKSktPnBvc3QoKTsKIH0KIAogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnNpZ25hbEVuYWJsZU9mZmxvYWRBdWRpbygpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0RW5hYmxlT2ZmbG9hZEF1ZGlvLCBpZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0RW5hYmxlT2ZmbG9hZEF1ZGlvLCB0aGlzKSktPnBvc3QoKTsKIH0KIAogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnBhdXNlKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgaWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFBhdXNlLCB0aGlzKSktPnBvc3QoKTsKIH0KIAogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnJlc3VtZSgpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCBpZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCB0aGlzKSktPnBvc3QoKTsKIH0KIAogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnNldFZpZGVvRnJhbWVSYXRlKGZsb2F0IGZwcykgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRWaWRlb0ZyYW1lUmF0ZSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldFZpZGVvRnJhbWVSYXRlLCB0aGlzKTsKICAgICBtc2ctPnNldEZsb2F0KCJmcmFtZS1yYXRlIiwgZnBzKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KIAotLy8gQ2FsbGVkIG9uIGFueSB0aHJlYWRzLCBleGNlcHQgcmVuZGVyZXIncyB0aHJlYWQuCi1zdGF0dXNfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptZWRpYVVzKSB7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICAgICBpbnQ2NF90IGN1cnJlbnRQb3NpdGlvblVzOwotICAgICAgICBpZiAoZ2V0Q3VycmVudFBvc2l0aW9uSWZQYXVzZWRfbCgmY3VycmVudFBvc2l0aW9uVXMpKSB7Ci0gICAgICAgICAgICAqbWVkaWFVcyA9IGN1cnJlbnRQb3NpdGlvblVzOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBnZXRDdXJyZW50UG9zaXRpb25Gcm9tQW5jaG9yKG1lZGlhVXMsIEFMb29wZXI6OkdldE5vd1VzKCkpOwotfQotCi0vLyBDYWxsZWQgb24gb25seSByZW5kZXJlcidzIHRocmVhZC4KLXN0YXR1c190IE51UGxheWVyOjpSZW5kZXJlcjo6Z2V0Q3VycmVudFBvc2l0aW9uT25Mb29wZXIoaW50NjRfdCAqbWVkaWFVcykgewotICAgIHJldHVybiBnZXRDdXJyZW50UG9zaXRpb25Pbkxvb3BlcihtZWRpYVVzLCBBTG9vcGVyOjpHZXROb3dVcygpKTsKLX0KLQotLy8gQ2FsbGVkIG9uIG9ubHkgcmVuZGVyZXIncyB0aHJlYWQuCi0vLyBTaW5jZSBtUGF1c2VkIGFuZCBtUGF1c2VQb3NpdGlvbk1lZGlhVGltZVVzIGFyZSBjaGFuZ2VkIG9ubHkgb24gcmVuZGVyZXIncwotLy8gdGhyZWFkLCBubyBuZWVkIHRvIGFjcXVpcmUgbUxvY2suCi1zdGF0dXNfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmdldEN1cnJlbnRQb3NpdGlvbk9uTG9vcGVyKAotICAgICAgICBpbnQ2NF90ICptZWRpYVVzLCBpbnQ2NF90IG5vd1VzLCBib29sIGFsbG93UGFzdFF1ZXVlZFZpZGVvKSB7Ci0gICAgaW50NjRfdCBjdXJyZW50UG9zaXRpb25VczsKLSAgICBpZiAoZ2V0Q3VycmVudFBvc2l0aW9uSWZQYXVzZWRfbCgmY3VycmVudFBvc2l0aW9uVXMpKSB7Ci0gICAgICAgICptZWRpYVVzID0gY3VycmVudFBvc2l0aW9uVXM7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgcmV0dXJuIGdldEN1cnJlbnRQb3NpdGlvbkZyb21BbmNob3IobWVkaWFVcywgbm93VXMsIGFsbG93UGFzdFF1ZXVlZFZpZGVvKTsKLX0KLQotLy8gQ2FsbGVkIGVpdGhlciB3aXRoIG1Mb2NrIGFjcXVpcmVkIG9yIG9uIHJlbmRlcmVyJ3MgdGhyZWFkLgotYm9vbCBOdVBsYXllcjo6UmVuZGVyZXI6OmdldEN1cnJlbnRQb3NpdGlvbklmUGF1c2VkX2woaW50NjRfdCAqbWVkaWFVcykgewotICAgIGlmICghbVBhdXNlZCB8fCBtUGF1c2VQb3NpdGlvbk1lZGlhVGltZVVzIDwgMGxsKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgKm1lZGlhVXMgPSBtUGF1c2VQb3NpdGlvbk1lZGlhVGltZVVzOwotICAgIHJldHVybiB0cnVlOwotfQotCiAvLyBDYWxsZWQgb24gYW55IHRocmVhZHMuCi1zdGF0dXNfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmdldEN1cnJlbnRQb3NpdGlvbkZyb21BbmNob3IoCi0gICAgICAgIGludDY0X3QgKm1lZGlhVXMsIGludDY0X3Qgbm93VXMsIGJvb2wgYWxsb3dQYXN0UXVldWVkVmlkZW8pIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVRpbWVMb2NrKTsKLSAgICBpZiAoIW1IYXNBdWRpbyAmJiAhbUhhc1ZpZGVvKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgIGlmIChtQW5jaG9yVGltZU1lZGlhVXMgPCAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgIGludDY0X3QgcG9zaXRpb25VcyA9IChub3dVcyAtIG1BbmNob3JUaW1lUmVhbFVzKSArIG1BbmNob3JUaW1lTWVkaWFVczsKLQotICAgIGlmIChtUGF1c2VTdGFydGVkVGltZVJlYWxVcyAhPSAtMSkgewotICAgICAgICBwb3NpdGlvblVzIC09IChub3dVcyAtIG1QYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzKTsKLSAgICB9Ci0KLSAgICAvLyBsaW1pdCBwb3NpdGlvbiB0byB0aGUgbGFzdCBxdWV1ZWQgbWVkaWEgdGltZSAoZm9yIHZpZGVvIG9ubHkgc3RyZWFtCi0gICAgLy8gcG9zaXRpb24gd2lsbCBiZSBkaXNjcmV0ZSBhcyB3ZSBkb24ndCBrbm93IGhvdyBsb25nIGVhY2ggZnJhbWUgbGFzdHMpCi0gICAgaWYgKG1BbmNob3JNYXhNZWRpYVVzID49IDAgJiYgIWFsbG93UGFzdFF1ZXVlZFZpZGVvKSB7Ci0gICAgICAgIGlmIChwb3NpdGlvblVzID4gbUFuY2hvck1heE1lZGlhVXMpIHsKLSAgICAgICAgICAgIHBvc2l0aW9uVXMgPSBtQW5jaG9yTWF4TWVkaWFVczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChwb3NpdGlvblVzIDwgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcykgewotICAgICAgICBwb3NpdGlvblVzID0gbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVczsKLSAgICB9Ci0KLSAgICAqbWVkaWFVcyA9IChwb3NpdGlvblVzIDw9IDApID8gMCA6IHBvc2l0aW9uVXM7Ci0gICAgcmV0dXJuIE9LOworc3RhdHVzX3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbWVkaWFVcykgeworICAgIHJldHVybiBtTWVkaWFDbG9jay0+Z2V0TWVkaWFUaW1lKEFMb29wZXI6OkdldE5vd1VzKCksIG1lZGlhVXMpOwogfQogCi12b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2V0SGFzTWVkaWEoYm9vbCBhdWRpbykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtVGltZUxvY2spOwotICAgIGlmIChhdWRpbykgewotICAgICAgICBtSGFzQXVkaW8gPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1IYXNWaWRlbyA9IHRydWU7Ci0gICAgfQordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OmNsZWFyQXVkaW9GaXJzdEFuY2hvclRpbWVfbCgpIHsKKyAgICBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzID0gLTE7CisgICAgbU1lZGlhQ2xvY2stPnNldFN0YXJ0aW5nVGltZU1lZGlhKC0xKTsKIH0KIAotdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnNldEF1ZGlvRmlyc3RBbmNob3JUaW1lKGludDY0X3QgbWVkaWFVcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtVGltZUxvY2spOwotICAgIG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMgPSBtZWRpYVVzOwotfQotCi12b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2V0QXVkaW9GaXJzdEFuY2hvclRpbWVJZk5lZWRlZChpbnQ2NF90IG1lZGlhVXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVRpbWVMb2NrKTsKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzZXRBdWRpb0ZpcnN0QW5jaG9yVGltZUlmTmVlZGVkX2woaW50NjRfdCBtZWRpYVVzKSB7CiAgICAgaWYgKG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMgPT0gLTEpIHsKICAgICAgICAgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyA9IG1lZGlhVXM7CisgICAgICAgIG1NZWRpYUNsb2NrLT5zZXRTdGFydGluZ1RpbWVNZWRpYShtZWRpYVVzKTsKICAgICB9CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzZXRBbmNob3JUaW1lKAotICAgICAgICBpbnQ2NF90IG1lZGlhVXMsIGludDY0X3QgcmVhbFVzLCBpbnQ2NF90IG51bUZyYW1lc1dyaXR0ZW4sIGJvb2wgcmVzdW1lKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1UaW1lTG9jayk7Ci0gICAgbUFuY2hvclRpbWVNZWRpYVVzID0gbWVkaWFVczsKLSAgICBtQW5jaG9yVGltZVJlYWxVcyA9IHJlYWxVczsKLSAgICBtQW5jaG9yTnVtRnJhbWVzV3JpdHRlbiA9IG51bUZyYW1lc1dyaXR0ZW47Ci0gICAgaWYgKHJlc3VtZSkgewotICAgICAgICBtUGF1c2VTdGFydGVkVGltZVJlYWxVcyA9IC0xOwotICAgIH0KK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpjbGVhckFuY2hvclRpbWVfbCgpIHsKKyAgICBtTWVkaWFDbG9jay0+Y2xlYXJBbmNob3IoKTsKKyAgICBtQW5jaG9yVGltZU1lZGlhVXMgPSAtMTsKKyAgICBtQW5jaG9yTnVtRnJhbWVzV3JpdHRlbiA9IC0xOwogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2V0VmlkZW9MYXRlQnlVcyhpbnQ2NF90IGxhdGVVcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtVGltZUxvY2spOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgbVZpZGVvTGF0ZUJ5VXMgPSBsYXRlVXM7CiB9CiAKIGludDY0X3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpnZXRWaWRlb0xhdGVCeVVzKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtVGltZUxvY2spOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgcmV0dXJuIG1WaWRlb0xhdGVCeVVzOwogfQogCi12b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2V0UGF1c2VTdGFydGVkVGltZVJlYWxVcyhpbnQ2NF90IHJlYWxVcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtVGltZUxvY2spOwotICAgIG1QYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzID0gcmVhbFVzOwotfQotCiBzdGF0dXNfdCBOdVBsYXllcjo6UmVuZGVyZXI6Om9wZW5BdWRpb1NpbmsoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAogICAgICAgICBib29sIG9mZmxvYWRPbmx5LAogICAgICAgICBib29sIGhhc1ZpZGVvLAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgYm9vbCAqaXNPZmZsb2FkZWQpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0T3BlbkF1ZGlvU2luaywgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdE9wZW5BdWRpb1NpbmssIHRoaXMpOwogICAgIG1zZy0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKICAgICBtc2ctPnNldEludDMyKCJvZmZsb2FkLW9ubHkiLCBvZmZsb2FkT25seSk7CiAgICAgbXNnLT5zZXRJbnQzMigiaGFzLXZpZGVvIiwgaGFzVmlkZW8pOwpAQCAtMzI4LDcgKzM2OSw3IEBACiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpjbG9zZUF1ZGlvU2luaygpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2xvc2VBdWRpb1NpbmssIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDbG9zZUF1ZGlvU2luaywgdGhpcyk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CiAgICAgbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwpAQCAtMzU2LDcgKzM5Nyw3IEBACiAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CiAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoIm9mZmxvYWQiLCBvZmZsb2FkaW5nQXVkaW8oKSk7CiAKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CiAKQEAgLTM2NSw3ICs0MDYsNyBAQAogCiAgICAgICAgIGNhc2Uga1doYXRDbG9zZUF1ZGlvU2luazoKICAgICAgICAgewotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICBvbkNsb3NlQXVkaW9TaW5rKCk7CkBAIC0zODMsMTQgKzQyNCwxNCBAQAogCiAgICAgICAgIGNhc2Uga1doYXREcmFpbkF1ZGlvUXVldWU6CiAgICAgICAgIHsKKyAgICAgICAgICAgIG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nID0gZmFsc2U7CisKICAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKLSAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IG1BdWRpb1F1ZXVlR2VuZXJhdGlvbikgeworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImRyYWluR2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBnZXREcmFpbkdlbmVyYXRpb24odHJ1ZSAvKiBhdWRpbyAqLykpIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbURyYWluQXVkaW9RdWV1ZVBlbmRpbmcgPSBmYWxzZTsKLQogICAgICAgICAgICAgaWYgKG9uRHJhaW5BdWRpb1F1ZXVlKCkpIHsKICAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1GcmFtZXNQbGF5ZWQ7CiAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobUF1ZGlvU2luay0+Z2V0UG9zaXRpb24oJm51bUZyYW1lc1BsYXllZCksCkBAIC00MDQsMTIgKzQ0NSwxMyBAQAogICAgICAgICAgICAgICAgIGludDY0X3QgZGVsYXlVcyA9CiAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1NpbmstPm1zZWNzUGVyRnJhbWUoKQogICAgICAgICAgICAgICAgICAgICAgICAgKiBudW1GcmFtZXNQZW5kaW5nUGxheW91dCAqIDEwMDBsbDsKKyAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrUmF0ZSA+IDEuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsYXlVcyAvPSBtUGxheWJhY2tSYXRlOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIExldCdzIGdpdmUgaXQgbW9yZSBkYXRhIGFmdGVyIGFib3V0IGhhbGYgdGhhdCB0aW1lCiAgICAgICAgICAgICAgICAgLy8gaGFzIGVsYXBzZWQuCi0gICAgICAgICAgICAgICAgLy8ga1doYXREcmFpbkF1ZGlvUXVldWUgaXMgdXNlZCBmb3Igbm9uLW9mZmxvYWRpbmcgbW9kZSwKLSAgICAgICAgICAgICAgICAvLyBhbmQgbUxvY2sgaXMgdXNlZCBvbmx5IGZvciBvZmZsb2FkaW5nIG1vZGUuIFRoZXJlZm9yZSwKLSAgICAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIGFjcXVpcmUgbUxvY2sgaGVyZS4KKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgICAgICAgICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWVfbChkZWxheVVzIC8gMik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTQxOCw4ICs0NjAsOCBAQAogICAgICAgICBjYXNlIGtXaGF0RHJhaW5WaWRlb1F1ZXVlOgogICAgICAgICB7CiAgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7Ci0gICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtVmlkZW9RdWV1ZUdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJkcmFpbkdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT0gZ2V0RHJhaW5HZW5lcmF0aW9uKGZhbHNlIC8qIGF1ZGlvICovKSkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC00MjcsMjIgKzQ2OSwyMCBAQAogCiAgICAgICAgICAgICBvbkRyYWluVmlkZW9RdWV1ZSgpOwogCi0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICAgICAgICAgcG9zdERyYWluVmlkZW9RdWV1ZV9sKCk7CisgICAgICAgICAgICBwb3N0RHJhaW5WaWRlb1F1ZXVlKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2Uga1doYXRQb3N0RHJhaW5WaWRlb1F1ZXVlOgogICAgICAgICB7CiAgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7Ci0gICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtVmlkZW9RdWV1ZUdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJkcmFpbkdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT0gZ2V0RHJhaW5HZW5lcmF0aW9uKGZhbHNlIC8qIGF1ZGlvICovKSkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyA9IGZhbHNlOwotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgICAgIHBvc3REcmFpblZpZGVvUXVldWVfbCgpOworICAgICAgICAgICAgcG9zdERyYWluVmlkZW9RdWV1ZSgpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtNDU4LDE1ICs0OTgsNjkgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBrV2hhdEZsdXNoOgorICAgICAgICBjYXNlIGtXaGF0Q29uZmlnUGxheWJhY2s6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG9uRmx1c2gobXNnKTsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgICAgICAgICAgQXVkaW9QbGF5YmFja1JhdGUgcmF0ZTsKKyAgICAgICAgICAgIHJlYWRGcm9tQU1lc3NhZ2UobXNnLCAmcmF0ZSk7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBvbkNvbmZpZ1BsYXliYWNrKHJhdGUpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBrV2hhdEF1ZGlvU2lua0NoYW5nZWQ6CisgICAgICAgIGNhc2Uga1doYXRHZXRQbGF5YmFja1NldHRpbmdzOgogICAgICAgICB7Ci0gICAgICAgICAgICBvbkF1ZGlvU2lua0NoYW5nZWQoKTsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgICAgICAgICAgQXVkaW9QbGF5YmFja1JhdGUgcmF0ZSA9IEFVRElPX1BMQVlCQUNLX1JBVEVfREVGQVVMVDsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG9uR2V0UGxheWJhY2tTZXR0aW5ncygmcmF0ZSk7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgd3JpdGVUb0FNZXNzYWdlKHJlc3BvbnNlLCByYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRDb25maWdTeW5jOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICAgICAgICAgIEFWU3luY1NldHRpbmdzIHN5bmM7CisgICAgICAgICAgICBmbG9hdCB2aWRlb0Zwc0hpbnQ7CisgICAgICAgICAgICByZWFkRnJvbUFNZXNzYWdlKG1zZywgJnN5bmMsICZ2aWRlb0Zwc0hpbnQpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gb25Db25maWdTeW5jKHN5bmMsIHZpZGVvRnBzSGludCk7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0R2V0U3luY1NldHRpbmdzOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKworICAgICAgICAgICAgQUxPR1YoImtXaGF0R2V0U3luY1NldHRpbmdzIik7CisgICAgICAgICAgICBBVlN5bmNTZXR0aW5ncyBzeW5jOworICAgICAgICAgICAgZmxvYXQgdmlkZW9GcHMgPSAtMS5mOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gb25HZXRTeW5jU2V0dGluZ3MoJnN5bmMsICZ2aWRlb0Zwcyk7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgd3JpdGVUb0FNZXNzYWdlKHJlc3BvbnNlLCBzeW5jLCB2aWRlb0Zwcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0Rmx1c2g6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uRmx1c2gobXNnKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTUwMiwyMSArNTk2LDIxIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2Uga1doYXRBdWRpb09mZmxvYWRUZWFyRG93bjoKKyAgICAgICAgY2FzZSBrV2hhdEF1ZGlvVGVhckRvd246CiAgICAgICAgIHsKLSAgICAgICAgICAgIG9uQXVkaW9PZmZsb2FkVGVhckRvd24oa0R1ZVRvRXJyb3IpOworICAgICAgICAgICAgb25BdWRpb1RlYXJEb3duKGtEdWVUb0Vycm9yKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBrV2hhdEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dDoKICAgICAgICAgewogICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImRyYWluR2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CiAgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0R2VuZXJhdGlvbikgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoIkF1ZGlvIE9mZmxvYWQgdGVhciBkb3duIGR1ZSB0byBwYXVzZSB0aW1lb3V0LiIpOwotICAgICAgICAgICAgb25BdWRpb09mZmxvYWRUZWFyRG93bihrRHVlVG9UaW1lb3V0KTsKKyAgICAgICAgICAgIG9uQXVkaW9UZWFyRG93bihrRHVlVG9UaW1lb3V0KTsKICAgICAgICAgICAgIG1XYWtlTG9jay0+cmVsZWFzZSgpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTUyOCw4ICs2MjIsNyBAQAogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6cG9zdERyYWluQXVkaW9RdWV1ZV9sKGludDY0X3QgZGVsYXlVcykgewotICAgIGlmIChtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyB8fCBtU3luY1F1ZXVlcyB8fCBtUGF1c2VkCi0gICAgICAgICAgICB8fCBvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgIGlmIChtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyB8fCBtU3luY1F1ZXVlcyB8fCBtVXNlQXVkaW9DYWxsYmFjaykgewogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC01MzgsMTkgKzYzMSwxOSBAQAogICAgIH0KIAogICAgIG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nID0gdHJ1ZTsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RHJhaW5BdWRpb1F1ZXVlLCBpZCgpKTsKLSAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUF1ZGlvUXVldWVHZW5lcmF0aW9uKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RHJhaW5BdWRpb1F1ZXVlLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDMyKCJkcmFpbkdlbmVyYXRpb24iLCBtQXVkaW9EcmFpbkdlbmVyYXRpb24pOwogICAgIG1zZy0+cG9zdChkZWxheVVzKTsKIH0KIAotdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnByZXBhcmVGb3JNZWRpYVJlbmRlcmluZ1N0YXJ0KCkgewotICAgIG1BdWRpb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbiA9IG1BdWRpb1F1ZXVlR2VuZXJhdGlvbjsKLSAgICBtVmlkZW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24gPSBtVmlkZW9RdWV1ZUdlbmVyYXRpb247Cit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6cHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnRfbCgpIHsKKyAgICBtQXVkaW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24gPSBtQXVkaW9EcmFpbkdlbmVyYXRpb247CisgICAgbVZpZGVvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uID0gbVZpZGVvRHJhaW5HZW5lcmF0aW9uOwogfQogCi12b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6bm90aWZ5SWZNZWRpYVJlbmRlcmluZ1N0YXJ0ZWQoKSB7Ci0gICAgaWYgKG1WaWRlb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbiA9PSBtVmlkZW9RdWV1ZUdlbmVyYXRpb24gJiYKLSAgICAgICAgbUF1ZGlvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uID09IG1BdWRpb1F1ZXVlR2VuZXJhdGlvbikgewordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om5vdGlmeUlmTWVkaWFSZW5kZXJpbmdTdGFydGVkX2woKSB7CisgICAgaWYgKG1WaWRlb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbiA9PSBtVmlkZW9EcmFpbkdlbmVyYXRpb24gJiYKKyAgICAgICAgbUF1ZGlvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uID09IG1BdWRpb0RyYWluR2VuZXJhdGlvbikgewogICAgICAgICBtVmlkZW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24gPSAtMTsKICAgICAgICAgbUF1ZGlvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uID0gLTE7CiAKQEAgLTU3OCwxMyArNjcxLDE1IEBACiAKICAgICAgICAgY2FzZSBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luazo6Q0JfRVZFTlRfU1RSRUFNX0VORDoKICAgICAgICAgeworICAgICAgICAgICAgQUxPR1YoIkF1ZGlvU2luazo6Q0JfRVZFTlRfU1RSRUFNX0VORCIpOwogICAgICAgICAgICAgbWUtPm5vdGlmeUVPUyh0cnVlIC8qIGF1ZGlvICovLCBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luazo6Q0JfRVZFTlRfVEVBUl9ET1dOOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZS0+bm90aWZ5QXVkaW9PZmZsb2FkVGVhckRvd24oKTsKKyAgICAgICAgICAgIEFMT0dWKCJBdWRpb1Npbms6OkNCX0VWRU5UX1RFQVJfRE9XTiIpOworICAgICAgICAgICAgbWUtPm5vdGlmeUF1ZGlvVGVhckRvd24oKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpAQCAtNTk1LDcgKzY5MCw3IEBACiBzaXplX3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpmaWxsQXVkaW9CdWZmZXIodm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICBpZiAoIW9mZmxvYWRpbmdBdWRpbygpIHx8IG1QYXVzZWQpIHsKKyAgICBpZiAoIW1Vc2VBdWRpb0NhbGxiYWNrKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIApAQCAtNjAzLDEzICs2OTgsMTMgQEAKIAogICAgIHNpemVfdCBzaXplQ29waWVkID0gMDsKICAgICBib29sIGZpcnN0RW50cnkgPSB0cnVlOworICAgIFF1ZXVlRW50cnkgKmVudHJ5OyAgLy8gd2lsbCBiZSB2YWxpZCBhZnRlciB3aGlsZSBsb29wIGlmIGhhc0VPUyBpcyBzZXQuCiAgICAgd2hpbGUgKHNpemVDb3BpZWQgPCBzaXplICYmICFtQXVkaW9RdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIFF1ZXVlRW50cnkgKmVudHJ5ID0gJiptQXVkaW9RdWV1ZS5iZWdpbigpOworICAgICAgICBlbnRyeSA9ICYqbUF1ZGlvUXVldWUuYmVnaW4oKTsKIAogICAgICAgICBpZiAoZW50cnktPm1CdWZmZXIgPT0gTlVMTCkgeyAvLyBFT1MKICAgICAgICAgICAgIGhhc0VPUyA9IHRydWU7CiAgICAgICAgICAgICBtQXVkaW9RdWV1ZS5lcmFzZShtQXVkaW9RdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgICAgIGVudHJ5ID0gTlVMTDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTYxNyw4ICs3MTIsOCBAQAogICAgICAgICAgICAgZmlyc3RFbnRyeSA9IGZhbHNlOwogICAgICAgICAgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKICAgICAgICAgICAgIENIRUNLKGVudHJ5LT5tQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7Ci0gICAgICAgICAgICBBTE9HVigicmVuZGVyaW5nIGF1ZGlvIGF0IG1lZGlhIHRpbWUgJS4yZiBzZWNzIiwgbWVkaWFUaW1lVXMgLyAxRTYpOwotICAgICAgICAgICAgc2V0QXVkaW9GaXJzdEFuY2hvclRpbWVJZk5lZWRlZChtZWRpYVRpbWVVcyk7CisgICAgICAgICAgICBBTE9HVigiZmlsbEF1ZGlvQnVmZmVyOiByZW5kZXJpbmcgYXVkaW8gYXQgbWVkaWEgdGltZSAlLjJmIHNlY3MiLCBtZWRpYVRpbWVVcyAvIDFFNik7CisgICAgICAgICAgICBzZXRBdWRpb0ZpcnN0QW5jaG9yVGltZUlmTmVlZGVkX2wobWVkaWFUaW1lVXMpOwogICAgICAgICB9CiAKICAgICAgICAgc2l6ZV90IGNvcHkgPSBlbnRyeS0+bUJ1ZmZlci0+c2l6ZSgpIC0gZW50cnktPm1PZmZzZXQ7CkBAIC02MzgsMzQgKzczMyw5NyBAQAogICAgICAgICAgICAgZW50cnkgPSBOVUxMOwogICAgICAgICB9CiAgICAgICAgIHNpemVDb3BpZWQgKz0gY29weTsKLSAgICAgICAgbm90aWZ5SWZNZWRpYVJlbmRlcmluZ1N0YXJ0ZWQoKTsKKworICAgICAgICBub3RpZnlJZk1lZGlhUmVuZGVyaW5nU3RhcnRlZF9sKCk7CiAgICAgfQogCiAgICAgaWYgKG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMgPj0gMCkgewogICAgICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICAgICAgc2V0QW5jaG9yVGltZShtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzLCBub3dVcyAtIGdldFBsYXllZE91dEF1ZGlvRHVyYXRpb25Vcyhub3dVcykpOworICAgICAgICBpbnQ2NF90IG5vd01lZGlhVXMgPQorICAgICAgICAgICAgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyArIGdldFBsYXllZE91dEF1ZGlvRHVyYXRpb25Vcyhub3dVcyk7CisgICAgICAgIC8vIHdlIGRvbid0IGtub3cgaG93IG11Y2ggZGF0YSB3ZSBhcmUgcXVldWVpbmcgZm9yIG9mZmxvYWRlZCB0cmFja3MuCisgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVBbmNob3Iobm93TWVkaWFVcywgbm93VXMsIElOVDY0X01BWCk7CiAgICAgfQogCi0gICAgLy8gd2UgZG9uJ3Qga25vdyBob3cgbXVjaCBkYXRhIHdlIGFyZSBxdWV1ZWluZyBmb3Igb2ZmbG9hZGVkIHRyYWNrcwotICAgIG1BbmNob3JNYXhNZWRpYVVzID0gLTE7CisgICAgLy8gZm9yIG5vbi1vZmZsb2FkZWQgYXVkaW8sIHdlIG5lZWQgdG8gY29tcHV0ZSB0aGUgZnJhbWVzIHdyaXR0ZW4gYmVjYXVzZQorICAgIC8vIHRoZXJlIGlzIG5vIEVWRU5UX1NUUkVBTV9FTkQgbm90aWZpY2F0aW9uLiBUaGUgZnJhbWVzIHdyaXR0ZW4gZ2l2ZXMKKyAgICAvLyBhbiBlc3RpbWF0ZSBvbiB0aGUgcGVuZGluZyBwbGF5ZWQgb3V0IGR1cmF0aW9uLgorICAgIGlmICghb2ZmbG9hZGluZ0F1ZGlvKCkpIHsKKyAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4gKz0gc2l6ZUNvcGllZCAvIG1BdWRpb1NpbmstPmZyYW1lU2l6ZSgpOworICAgIH0KIAogICAgIGlmIChoYXNFT1MpIHsKLSAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0b3BBdWRpb1NpbmssIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RvcEF1ZGlvU2luaywgdGhpcykpLT5wb3N0KCk7CisgICAgICAgIC8vIEFzIHRoZXJlIGlzIGN1cnJlbnRseSBubyBFVkVOVF9TVFJFQU1fRU5EIGNhbGxiYWNrIG5vdGlmaWNhdGlvbiBmb3IKKyAgICAgICAgLy8gbm9uLW9mZmxvYWRlZCBhdWRpbyB0cmFja3MsIHdlIG5lZWQgdG8gcG9zdCB0aGUgRU9TIG91cnNlbHZlcy4KKyAgICAgICAgaWYgKCFvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICAgICAgaW50NjRfdCBwb3N0RU9TRGVsYXlVcyA9IDA7CisgICAgICAgICAgICBpZiAobUF1ZGlvU2luay0+bmVlZHNUcmFpbGluZ1BhZGRpbmcoKSkgeworICAgICAgICAgICAgICAgIHBvc3RFT1NEZWxheVVzID0gZ2V0UGVuZGluZ0F1ZGlvUGxheW91dER1cmF0aW9uVXMoQUxvb3Blcjo6R2V0Tm93VXMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiZmlsbEF1ZGlvQnVmZmVyOiBub3RpZnlFT1MgIgorICAgICAgICAgICAgICAgICAgICAibU51bUZyYW1lc1dyaXR0ZW46JXUgIGZpbmFsUmVzdWx0OiVkICBwb3N0RU9TRGVsYXk6JWxsZCIsCisgICAgICAgICAgICAgICAgICAgIG1OdW1GcmFtZXNXcml0dGVuLCBlbnRyeS0+bUZpbmFsUmVzdWx0LCAobG9uZyBsb25nKXBvc3RFT1NEZWxheVVzKTsKKyAgICAgICAgICAgIG5vdGlmeUVPUyh0cnVlIC8qIGF1ZGlvICovLCBlbnRyeS0+bUZpbmFsUmVzdWx0LCBwb3N0RU9TRGVsYXlVcyk7CisgICAgICAgIH0KICAgICB9Ci0KICAgICByZXR1cm4gc2l6ZUNvcGllZDsKIH0KIAordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OmRyYWluQXVkaW9RdWV1ZVVudGlsTGFzdEVPUygpIHsKKyAgICBMaXN0PFF1ZXVlRW50cnk+OjppdGVyYXRvciBpdCA9IG1BdWRpb1F1ZXVlLmJlZ2luKCksIGl0RU9TID0gaXQ7CisgICAgYm9vbCBmb3VuZEVPUyA9IGZhbHNlOworICAgIHdoaWxlIChpdCAhPSBtQXVkaW9RdWV1ZS5lbmQoKSkgeworICAgICAgICBpbnQzMl90IGVvczsKKyAgICAgICAgUXVldWVFbnRyeSAqZW50cnkgPSAmKml0Kys7CisgICAgICAgIGlmIChlbnRyeS0+bUJ1ZmZlciA9PSBOVUxMCisgICAgICAgICAgICAgICAgfHwgKGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQtPmZpbmRJbnQzMigiZW9zIiwgJmVvcykgJiYgZW9zICE9IDApKSB7CisgICAgICAgICAgICBpdEVPUyA9IGl0OworICAgICAgICAgICAgZm91bmRFT1MgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZvdW5kRU9TKSB7CisgICAgICAgIC8vIHBvc3QgYWxsIHJlcGxpZXMgYmVmb3JlIEVPUyBhbmQgZHJvcCB0aGUgc2FtcGxlcworICAgICAgICBmb3IgKGl0ID0gbUF1ZGlvUXVldWUuYmVnaW4oKTsgaXQgIT0gaXRFT1M7IGl0KyspIHsKKyAgICAgICAgICAgIGlmIChpdC0+bUJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLy8gZGVsYXkgZG9lc24ndCBtYXR0ZXIgYXMgd2UgZG9uJ3QgZXZlbiBoYXZlIGFuIEF1ZGlvVHJhY2sKKyAgICAgICAgICAgICAgICBub3RpZnlFT1ModHJ1ZSAvKiBhdWRpbyAqLywgaXQtPm1GaW5hbFJlc3VsdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGl0LT5tTm90aWZ5Q29uc3VtZWQtPnBvc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQXVkaW9RdWV1ZS5lcmFzZShtQXVkaW9RdWV1ZS5iZWdpbigpLCBpdEVPUyk7CisgICAgfQorfQorCiBib29sIE51UGxheWVyOjpSZW5kZXJlcjo6b25EcmFpbkF1ZGlvUXVldWUoKSB7CisgICAgLy8gVE9ETzogVGhpcyBjYWxsIHRvIGdldFBvc2l0aW9uIGNoZWNrcyBpZiBBdWRpb1RyYWNrIGhhcyBiZWVuIGNyZWF0ZWQKKyAgICAvLyBpbiBBdWRpb1NpbmsgYmVmb3JlIGRyYWluaW5nIGF1ZGlvLiBJZiBBdWRpb1RyYWNrIGRvZXNuJ3QgZXhpc3QsIHRoZW4KKyAgICAvLyBDSEVDS3Mgb24gZ2V0UG9zaXRpb24gd2lsbCBmYWlsLgorICAgIC8vIFdlIHN0aWxsIG5lZWQgdG8gZmlndXJlIG91dCB3aHkgQXVkaW9UcmFjayBpcyBub3QgY3JlYXRlZCB3aGVuCisgICAgLy8gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuIE9uZSBwb3NzaWJsZSByZWFzb24gY291bGQgYmUgbGVmdG92ZXIKKyAgICAvLyBhdWRpby4gQW5vdGhlciBwb3NzaWJsZSBwbGFjZSBpcyB0byBjaGVjayB3aGV0aGVyIGRlY29kZXIKKyAgICAvLyBoYXMgcmVjZWl2ZWQgSU5GT19GT1JNQVRfQ0hBTkdFRCBhcyB0aGUgZmlyc3QgYnVmZmVyIHNpbmNlCisgICAgLy8gQXVkaW9TaW5rIGlzIG9wZW5lZCB0aGVyZSwgYW5kIHBvc3NpYmxlIGludGVyYWN0aW9ucyB3aXRoIGZsdXNoCisgICAgLy8gaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnQuIEludmVzdGlnYXRlIGVycm9yIG1lc3NhZ2UKKyAgICAvLyAidm9yYmlzX2RzcF9zeW50aGVzaXMgcmV0dXJuZWQgLTEzNSIsIGFsb25nIHdpdGggUlRTUC4KICAgICB1aW50MzJfdCBudW1GcmFtZXNQbGF5ZWQ7CiAgICAgaWYgKG1BdWRpb1NpbmstPmdldFBvc2l0aW9uKCZudW1GcmFtZXNQbGF5ZWQpICE9IE9LKSB7CisgICAgICAgIC8vIFdoZW4gZ2V0UG9zaXRpb24gZmFpbHMsIHJlbmRlcmVyIHdpbGwgbm90IHJlc2NoZWR1bGUgdGhlIGRyYWluaW5nCisgICAgICAgIC8vIHVubGVzcyBuZXcgc2FtcGxlcyBhcmUgcXVldWVkLgorICAgICAgICAvLyBJZiB3ZSBoYXZlIHBlbmRpbmcgRU9TIChvciAiZW9zIiBtYXJrZXIgZm9yIGRpc2NvbnRpbnVpdGllcyksIHdlIG5lZWQKKyAgICAgICAgLy8gdG8gcG9zdCB0aGVzZSBub3cgYXMgTnVQbGF5ZXJEZWNvZGVyIG1pZ2h0IGJlIHdhaXRpbmcgZm9yIGl0LgorICAgICAgICBkcmFpbkF1ZGlvUXVldWVVbnRpbExhc3RFT1MoKTsKKworICAgICAgICBBTE9HVygib25EcmFpbkF1ZGlvUXVldWUoKTogYXVkaW8gc2luayBpcyBub3QgcmVhZHkiKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorI2lmIDAKICAgICBzc2l6ZV90IG51bUZyYW1lc0F2YWlsYWJsZVRvV3JpdGUgPQogICAgICAgICBtQXVkaW9TaW5rLT5mcmFtZUNvdW50KCkgLSAobU51bUZyYW1lc1dyaXR0ZW4gLSBudW1GcmFtZXNQbGF5ZWQpOwogCi0jaWYgMAogICAgIGlmIChudW1GcmFtZXNBdmFpbGFibGVUb1dyaXRlID09IG1BdWRpb1NpbmstPmZyYW1lQ291bnQoKSkgewogICAgICAgICBBTE9HSSgiYXVkaW8gc2luayB1bmRlcnJ1biIpOwogICAgIH0gZWxzZSB7CkBAIC02NzQsMTAgKzgzMiw4IEBACiAgICAgfQogI2VuZGlmCiAKLSAgICBzaXplX3QgbnVtQnl0ZXNBdmFpbGFibGVUb1dyaXRlID0KLSAgICAgICAgbnVtRnJhbWVzQXZhaWxhYmxlVG9Xcml0ZSAqIG1BdWRpb1NpbmstPmZyYW1lU2l6ZSgpOwotCi0gICAgd2hpbGUgKG51bUJ5dGVzQXZhaWxhYmxlVG9Xcml0ZSA+IDAgJiYgIW1BdWRpb1F1ZXVlLmVtcHR5KCkpIHsKKyAgICB1aW50MzJfdCBwcmV2RnJhbWVzV3JpdHRlbiA9IG1OdW1GcmFtZXNXcml0dGVuOworICAgIHdoaWxlICghbUF1ZGlvUXVldWUuZW1wdHkoKSkgewogICAgICAgICBRdWV1ZUVudHJ5ICplbnRyeSA9ICYqbUF1ZGlvUXVldWUuYmVnaW4oKTsKIAogICAgICAgICBtTGFzdEF1ZGlvQnVmZmVyRHJhaW5lZCA9IGVudHJ5LT5tQnVmZmVyT3JkaW5hbDsKQEAgLTcwMiwyMiArODU4LDI3IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoZW50cnktPm1PZmZzZXQgPT0gMCkgeworICAgICAgICAvLyBpZ25vcmUgMC1zaXplZCBidWZmZXIgd2hpY2ggY291bGQgYmUgRU9TIG1hcmtlciB3aXRoIG5vIGRhdGEKKyAgICAgICAgaWYgKGVudHJ5LT5tT2Zmc2V0ID09IDAgJiYgZW50cnktPm1CdWZmZXItPnNpemUoKSA+IDApIHsKICAgICAgICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXM7CiAgICAgICAgICAgICBDSEVDSyhlbnRyeS0+bUJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcykpOwotICAgICAgICAgICAgQUxPR1YoInJlbmRlcmluZyBhdWRpbyBhdCBtZWRpYSB0aW1lICUuMmYgc2VjcyIsIG1lZGlhVGltZVVzIC8gMUU2KTsKKyAgICAgICAgICAgIEFMT0dWKCJvbkRyYWluQXVkaW9RdWV1ZTogcmVuZGVyaW5nIGF1ZGlvIGF0IG1lZGlhIHRpbWUgJS4yZiBzZWNzIiwKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFUaW1lVXMgLyAxRTYpOwogICAgICAgICAgICAgb25OZXdBdWRpb01lZGlhVGltZShtZWRpYVRpbWVVcyk7CiAgICAgICAgIH0KIAogICAgICAgICBzaXplX3QgY29weSA9IGVudHJ5LT5tQnVmZmVyLT5zaXplKCkgLSBlbnRyeS0+bU9mZnNldDsKLSAgICAgICAgaWYgKGNvcHkgPiBudW1CeXRlc0F2YWlsYWJsZVRvV3JpdGUpIHsKLSAgICAgICAgICAgIGNvcHkgPSBudW1CeXRlc0F2YWlsYWJsZVRvV3JpdGU7Ci0gICAgICAgIH0KIAotICAgICAgICBzc2l6ZV90IHdyaXR0ZW4gPSBtQXVkaW9TaW5rLT53cml0ZShlbnRyeS0+bUJ1ZmZlci0+ZGF0YSgpICsgZW50cnktPm1PZmZzZXQsIGNvcHkpOworICAgICAgICBzc2l6ZV90IHdyaXR0ZW4gPSBtQXVkaW9TaW5rLT53cml0ZShlbnRyeS0+bUJ1ZmZlci0+ZGF0YSgpICsgZW50cnktPm1PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHksIGZhbHNlIC8qIGJsb2NraW5nICovKTsKICAgICAgICAgaWYgKHdyaXR0ZW4gPCAwKSB7CiAgICAgICAgICAgICAvLyBBbiBlcnJvciBpbiBBdWRpb1Npbmsgd3JpdGUuIFBlcmhhcHMgdGhlIEF1ZGlvU2luayB3YXMgbm90IHByb3Blcmx5IG9wZW5lZC4KLSAgICAgICAgICAgIEFMT0dFKCJBdWRpb1Npbmsgd3JpdGUgZXJyb3IoJXpkKSB3aGVuIHdyaXRpbmcgJXp1IGJ5dGVzIiwgd3JpdHRlbiwgY29weSk7CisgICAgICAgICAgICBpZiAod3JpdHRlbiA9PSBXT1VMRF9CTE9DSykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb1Npbmsgd3JpdGUgd291bGQgYmxvY2sgd2hlbiB3cml0aW5nICV6dSBieXRlcyIsIGNvcHkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQXVkaW9TaW5rIHdyaXRlIGVycm9yKCV6ZCkgd2hlbiB3cml0aW5nICV6dSBieXRlcyIsIHdyaXR0ZW4sIGNvcHkpOworICAgICAgICAgICAgICAgIG5vdGlmeUF1ZGlvVGVhckRvd24oKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTcyOSw3MyArODkwLDk4IEBACiAgICAgICAgICAgICBlbnRyeSA9IE5VTEw7CiAgICAgICAgIH0KIAotICAgICAgICBudW1CeXRlc0F2YWlsYWJsZVRvV3JpdGUgLT0gd3JpdHRlbjsKICAgICAgICAgc2l6ZV90IGNvcGllZEZyYW1lcyA9IHdyaXR0ZW4gLyBtQXVkaW9TaW5rLT5mcmFtZVNpemUoKTsKICAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4gKz0gY29waWVkRnJhbWVzOwogCi0gICAgICAgIG5vdGlmeUlmTWVkaWFSZW5kZXJpbmdTdGFydGVkKCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgICAgICBub3RpZnlJZk1lZGlhUmVuZGVyaW5nU3RhcnRlZF9sKCk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAod3JpdHRlbiAhPSAoc3NpemVfdCljb3B5KSB7CiAgICAgICAgICAgICAvLyBBIHNob3J0IGNvdW50IHdhcyByZWNlaXZlZCBmcm9tIEF1ZGlvU2luazo6d3JpdGUoKQogICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEF1ZGlvU2luayB3cml0ZSBzaG91bGQgYmxvY2sgdW50aWwgZXhhY3RseSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFyZSBkZWxpdmVyZWQuCi0gICAgICAgICAgICAvLyBCdXQgaXQgbWF5IHJldHVybiB3aXRoIGEgc2hvcnQgY291bnQgKHdpdGhvdXQgYW4gZXJyb3IpIHdoZW46CisgICAgICAgICAgICAvLyBBdWRpb1Npbmsgd3JpdGUgaXMgY2FsbGVkIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAgICAgICAgICAgLy8gSXQgbWF5IHJldHVybiB3aXRoIGEgc2hvcnQgY291bnQgd2hlbjoKICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAvLyAxKSBTaXplIHRvIGJlIGNvcGllZCBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgZnJhbWUgc2l6ZS4gV2UgY29uc2lkZXIgdGhpcyBmYXRhbC4KLSAgICAgICAgICAgIC8vIDIpIEF1ZGlvU2luayBpcyBhbiBBdWRpb0NhY2hlIGZvciBkYXRhIHJldHJpZXZhbCwgYW5kIHRoZSBBdWRpb0NhY2hlIGlzIGV4Y2VlZGVkLgorICAgICAgICAgICAgLy8gMikgVGhlIGRhdGEgdG8gYmUgY29waWVkIGV4Y2VlZHMgdGhlIGF2YWlsYWJsZSBidWZmZXIgaW4gQXVkaW9TaW5rLgorICAgICAgICAgICAgLy8gMykgQW4gZXJyb3Igb2NjdXJzIGFuZCBkYXRhIGhhcyBiZWVuIHBhcnRpYWxseSBjb3BpZWQgdG8gdGhlIGJ1ZmZlciBpbiBBdWRpb1NpbmsuCisgICAgICAgICAgICAvLyA0KSBBdWRpb1NpbmsgaXMgYW4gQXVkaW9DYWNoZSBmb3IgZGF0YSByZXRyaWV2YWwsIGFuZCB0aGUgQXVkaW9DYWNoZSBpcyBleGNlZWRlZC4KIAogICAgICAgICAgICAgLy8gKENhc2UgMSkKICAgICAgICAgICAgIC8vIE11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgZnJhbWUgc2l6ZS4gIElmIGl0IGlzIG5vdCBhIG11bHRpcGxlIG9mIGEgZnJhbWUgc2l6ZSwgaXQKICAgICAgICAgICAgIC8vIG5lZWRzIHRvIGZhaWwsIGFzIHdlIHNob3VsZCBub3QgY2Fycnkgb3ZlciBmcmFjdGlvbmFsIGZyYW1lcyBiZXR3ZWVuIGNhbGxzLgogICAgICAgICAgICAgQ0hFQ0tfRVEoY29weSAlIG1BdWRpb1NpbmstPmZyYW1lU2l6ZSgpLCAwKTsKIAotICAgICAgICAgICAgLy8gKENhc2UgMikKKyAgICAgICAgICAgIC8vIChDYXNlIDIsIDMsIDQpCiAgICAgICAgICAgICAvLyBSZXR1cm4gZWFybHkgdG8gdGhlIGNhbGxlci4KICAgICAgICAgICAgIC8vIEJld2FyZSBvZiBjYWxsaW5nIGltbWVkaWF0ZWx5IGFnYWluIGFzIHRoaXMgbWF5IGJ1c3ktbG9vcCBpZiB5b3UgYXJlIG5vdCBjYXJlZnVsLgotICAgICAgICAgICAgQUxPR1coIkF1ZGlvU2luayB3cml0ZSBzaG9ydCBmcmFtZSBjb3VudCAlemQgPCAlenUiLCB3cml0dGVuLCBjb3B5KTsKKyAgICAgICAgICAgIEFMT0dWKCJBdWRpb1Npbmsgd3JpdGUgc2hvcnQgZnJhbWUgY291bnQgJXpkIDwgJXp1Iiwgd3JpdHRlbiwgY29weSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KLSAgICBtQW5jaG9yTWF4TWVkaWFVcyA9Ci0gICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcyArCi0gICAgICAgICAgICAgICAgKGludDY0X3QpKG1heCgobG9uZyBsb25nKW1OdW1GcmFtZXNXcml0dGVuIC0gbUFuY2hvck51bUZyYW1lc1dyaXR0ZW4sIDBMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogMTAwMExMICogbUF1ZGlvU2luay0+bXNlY3NQZXJGcmFtZSgpKTsKKyAgICBpbnQ2NF90IG1heFRpbWVNZWRpYTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgIG1heFRpbWVNZWRpYSA9CisgICAgICAgICAgICBtQW5jaG9yVGltZU1lZGlhVXMgKworICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkobWF4KChsb25nIGxvbmcpbU51bUZyYW1lc1dyaXR0ZW4gLSBtQW5jaG9yTnVtRnJhbWVzV3JpdHRlbiwgMExMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMTAwMExMICogbUF1ZGlvU2luay0+bXNlY3NQZXJGcmFtZSgpKTsKKyAgICB9CisgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZU1heFRpbWVNZWRpYShtYXhUaW1lTWVkaWEpOwogCi0gICAgcmV0dXJuICFtQXVkaW9RdWV1ZS5lbXB0eSgpOworICAgIC8vIGNhbGN1bGF0ZSB3aGV0aGVyIHdlIG5lZWQgdG8gcmVzY2hlZHVsZSBhbm90aGVyIHdyaXRlLgorICAgIGJvb2wgcmVzY2hlZHVsZSA9ICFtQXVkaW9RdWV1ZS5lbXB0eSgpCisgICAgICAgICAgICAmJiAoIW1QYXVzZWQKKyAgICAgICAgICAgICAgICB8fCBwcmV2RnJhbWVzV3JpdHRlbiAhPSBtTnVtRnJhbWVzV3JpdHRlbik7IC8vIHBlcm1pdCBwYXVzZSB0byBmaWxsIGJ1ZmZlcnMKKyAgICAvL0FMT0dEKCJyZXNjaGVkdWxlOiVkICBlbXB0eTolZCAgbVBhdXNlZDolZCAgcHJldkZyYW1lc1dyaXR0ZW46JXUgIG1OdW1GcmFtZXNXcml0dGVuOiV1IiwKKyAgICAvLyAgICAgICAgcmVzY2hlZHVsZSwgbUF1ZGlvUXVldWUuZW1wdHkoKSwgbVBhdXNlZCwgcHJldkZyYW1lc1dyaXR0ZW4sIG1OdW1GcmFtZXNXcml0dGVuKTsKKyAgICByZXR1cm4gcmVzY2hlZHVsZTsKIH0KIAoraW50NjRfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmdldER1cmF0aW9uVXNJZlBsYXllZEF0U2FtcGxlUmF0ZSh1aW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSBvZmZsb2FkaW5nQXVkaW8oKSA/CisgICAgICAgICAgICBtQ3VycmVudE9mZmxvYWRJbmZvLnNhbXBsZV9yYXRlIDogbUN1cnJlbnRQY21JbmZvLm1TYW1wbGVSYXRlOworICAgIC8vIFRPRE86IHJlbW92ZSB0aGUgKGludDMyX3QpIGNhc3RpbmcgYmVsb3cgYXMgaXQgbWF5IG92ZXJmbG93IGF0IDEyLjQgaG91cnMuCisgICAgcmV0dXJuIChpbnQ2NF90KSgoaW50MzJfdCludW1GcmFtZXMgKiAxMDAwMDAwTEwgLyBzYW1wbGVSYXRlKTsKK30KKworLy8gQ2FsY3VsYXRlIGR1cmF0aW9uIG9mIHBlbmRpbmcgc2FtcGxlcyBpZiBwbGF5ZWQgYXQgbm9ybWFsIHJhdGUgKGkuZS4sIDEuMCkuCiBpbnQ2NF90IE51UGxheWVyOjpSZW5kZXJlcjo6Z2V0UGVuZGluZ0F1ZGlvUGxheW91dER1cmF0aW9uVXMoaW50NjRfdCBub3dVcykgewotICAgIGludDY0X3Qgd3JpdHRlbkF1ZGlvRHVyYXRpb25VcyA9Ci0gICAgICAgIG1OdW1GcmFtZXNXcml0dGVuICogMTAwMExMICogbUF1ZGlvU2luay0+bXNlY3NQZXJGcmFtZSgpOworICAgIGludDY0X3Qgd3JpdHRlbkF1ZGlvRHVyYXRpb25VcyA9IGdldER1cmF0aW9uVXNJZlBsYXllZEF0U2FtcGxlUmF0ZShtTnVtRnJhbWVzV3JpdHRlbik7CiAgICAgcmV0dXJuIHdyaXR0ZW5BdWRpb0R1cmF0aW9uVXMgLSBnZXRQbGF5ZWRPdXRBdWRpb0R1cmF0aW9uVXMobm93VXMpOwogfQogCiBpbnQ2NF90IE51UGxheWVyOjpSZW5kZXJlcjo6Z2V0UmVhbFRpbWVVcyhpbnQ2NF90IG1lZGlhVGltZVVzLCBpbnQ2NF90IG5vd1VzKSB7Ci0gICAgaW50NjRfdCBjdXJyZW50UG9zaXRpb25VczsKLSAgICBpZiAobVBhdXNlZCB8fCBnZXRDdXJyZW50UG9zaXRpb25Pbkxvb3BlcigKLSAgICAgICAgICAgICZjdXJyZW50UG9zaXRpb25Vcywgbm93VXMsIHRydWUgLyogYWxsb3dQYXN0UXVldWVkVmlkZW8gKi8pICE9IE9LKSB7Ci0gICAgICAgIC8vIElmIGZhaWxlZCB0byBnZXQgY3VycmVudCBwb3NpdGlvbiwgZS5nLiBkdWUgdG8gYXVkaW8gY2xvY2sgaXMgbm90IHJlYWR5LCB0aGVuIGp1c3QKLSAgICAgICAgLy8gcGxheSBvdXQgdmlkZW8gaW1tZWRpYXRlbHkgd2l0aG91dCBkZWxheS4KKyAgICBpbnQ2NF90IHJlYWxVczsKKyAgICBpZiAobU1lZGlhQ2xvY2stPmdldFJlYWxUaW1lRm9yKG1lZGlhVGltZVVzLCAmcmVhbFVzKSAhPSBPSykgeworICAgICAgICAvLyBJZiBmYWlsZWQgdG8gZ2V0IGN1cnJlbnQgcG9zaXRpb24sIGUuZy4gZHVlIHRvIGF1ZGlvIGNsb2NrIGlzCisgICAgICAgIC8vIG5vdCByZWFkeSwgdGhlbiBqdXN0IHBsYXkgb3V0IHZpZGVvIGltbWVkaWF0ZWx5IHdpdGhvdXQgZGVsYXkuCiAgICAgICAgIHJldHVybiBub3dVczsKICAgICB9Ci0gICAgcmV0dXJuIChtZWRpYVRpbWVVcyAtIGN1cnJlbnRQb3NpdGlvblVzKSArIG5vd1VzOworICAgIHJldHVybiByZWFsVXM7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvbk5ld0F1ZGlvTWVkaWFUaW1lKGludDY0X3QgbWVkaWFUaW1lVXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIC8vIFRSSUNLWTogdm9yYmlzIGRlY29kZXIgZ2VuZXJhdGVzIG11bHRpcGxlIGZyYW1lcyB3aXRoIHRoZSBzYW1lCiAgICAgLy8gdGltZXN0YW1wLCBzbyBvbmx5IHVwZGF0ZSBvbiB0aGUgZmlyc3QgZnJhbWUgd2l0aCBhIGdpdmVuIHRpbWVzdGFtcAogICAgIGlmIChtZWRpYVRpbWVVcyA9PSBtQW5jaG9yVGltZU1lZGlhVXMpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBzZXRBdWRpb0ZpcnN0QW5jaG9yVGltZUlmTmVlZGVkKG1lZGlhVGltZVVzKTsKKyAgICBzZXRBdWRpb0ZpcnN0QW5jaG9yVGltZUlmTmVlZGVkX2wobWVkaWFUaW1lVXMpOwogICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotICAgIHNldEFuY2hvclRpbWUoCi0gICAgICAgICAgICBtZWRpYVRpbWVVcywgbm93VXMgKyBnZXRQZW5kaW5nQXVkaW9QbGF5b3V0RHVyYXRpb25Vcyhub3dVcyksIG1OdW1GcmFtZXNXcml0dGVuKTsKKyAgICBpbnQ2NF90IG5vd01lZGlhVXMgPSBtZWRpYVRpbWVVcyAtIGdldFBlbmRpbmdBdWRpb1BsYXlvdXREdXJhdGlvblVzKG5vd1VzKTsKKyAgICBtTWVkaWFDbG9jay0+dXBkYXRlQW5jaG9yKG5vd01lZGlhVXMsIG5vd1VzLCBtZWRpYVRpbWVVcyk7CisgICAgbUFuY2hvck51bUZyYW1lc1dyaXR0ZW4gPSBtTnVtRnJhbWVzV3JpdHRlbjsKKyAgICBtQW5jaG9yVGltZU1lZGlhVXMgPSBtZWRpYVRpbWVVczsKIH0KIAotdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnBvc3REcmFpblZpZGVvUXVldWVfbCgpIHsKKy8vIENhbGxlZCB3aXRob3V0IG1Mb2NrIGFjcXVpcmVkLgordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnBvc3REcmFpblZpZGVvUXVldWUoKSB7CiAgICAgaWYgKG1EcmFpblZpZGVvUXVldWVQZW5kaW5nCi0gICAgICAgICAgICB8fCBtU3luY1F1ZXVlcworICAgICAgICAgICAgfHwgZ2V0U3luY1F1ZXVlcygpCiAgICAgICAgICAgICB8fCAobVBhdXNlZCAmJiBtVmlkZW9TYW1wbGVSZWNlaXZlZCkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTgwNiw4ICs5OTIsOCBAQAogCiAgICAgUXVldWVFbnRyeSAmZW50cnkgPSAqbVZpZGVvUXVldWUuYmVnaW4oKTsKIAotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREcmFpblZpZGVvUXVldWUsIGlkKCkpOwotICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtVmlkZW9RdWV1ZUdlbmVyYXRpb24pOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREcmFpblZpZGVvUXVldWUsIHRoaXMpOworICAgIG1zZy0+c2V0SW50MzIoImRyYWluR2VuZXJhdGlvbiIsIGdldERyYWluR2VuZXJhdGlvbihmYWxzZSAvKiBhdWRpbyAqLykpOwogCiAgICAgaWYgKGVudHJ5Lm1CdWZmZXIgPT0gTlVMTCkgewogICAgICAgICAvLyBFT1MgZG9lc24ndCBjYXJyeSBhIHRpbWVzdGFtcC4KQEAgLTgyNywxNiArMTAxMywxOSBAQAogICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzOwogICAgICAgICBDSEVDSyhlbnRyeS5tQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7CiAKLSAgICAgICAgaWYgKG1BbmNob3JUaW1lTWVkaWFVcyA8IDApIHsKLSAgICAgICAgICAgIHNldEFuY2hvclRpbWUobWVkaWFUaW1lVXMsIG5vd1VzKTsKLSAgICAgICAgICAgIG1QYXVzZVBvc2l0aW9uTWVkaWFUaW1lVXMgPSBtZWRpYVRpbWVVczsKLSAgICAgICAgICAgIG1BbmNob3JNYXhNZWRpYVVzID0gbWVkaWFUaW1lVXM7Ci0gICAgICAgICAgICByZWFsVGltZVVzID0gbm93VXM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZWFsVGltZVVzID0gZ2V0UmVhbFRpbWVVcyhtZWRpYVRpbWVVcywgbm93VXMpOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICAgICAgaWYgKG1BbmNob3JUaW1lTWVkaWFVcyA8IDApIHsKKyAgICAgICAgICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlQW5jaG9yKG1lZGlhVGltZVVzLCBub3dVcywgbWVkaWFUaW1lVXMpOworICAgICAgICAgICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IG1lZGlhVGltZVVzOworICAgICAgICAgICAgICAgIHJlYWxUaW1lVXMgPSBub3dVczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVhbFRpbWVVcyA9IGdldFJlYWxUaW1lVXMobWVkaWFUaW1lVXMsIG5vd1VzKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoIW1IYXNBdWRpbykgewotICAgICAgICAgICAgbUFuY2hvck1heE1lZGlhVXMgPSBtZWRpYVRpbWVVcyArIDEwMDAwMDsgLy8gc21vb3RoIG91dCB2aWRlb3MgPj0gMTBmcHMKKyAgICAgICAgICAgIC8vIHNtb290aCBvdXQgdmlkZW9zID49IDEwZnBzCisgICAgICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlTWF4VGltZU1lZGlhKG1lZGlhVGltZVVzICsgMTAwMDAwKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIEhldXJpc3RpY3MgdG8gaGFuZGxlIHNpdHVhdGlvbiB3aGVuIG1lZGlhIHRpbWUgY2hhbmdlZCB3aXRob3V0IGEKQEAgLTkxMywxOCArMTEwMiwyMSBAQAogCiAgICAgICAgIGlmICh0b29MYXRlKSB7CiAgICAgICAgICAgICBBTE9HVigidmlkZW8gbGF0ZSBieSAlbGxkIHVzICglLjJmIHNlY3MpIiwKLSAgICAgICAgICAgICAgICAgbVZpZGVvTGF0ZUJ5VXMsIG1WaWRlb0xhdGVCeVVzIC8gMUU2KTsKKyAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltVmlkZW9MYXRlQnlVcywgbVZpZGVvTGF0ZUJ5VXMgLyAxRTYpOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50NjRfdCBtZWRpYVVzID0gMDsKKyAgICAgICAgICAgIG1NZWRpYUNsb2NrLT5nZXRNZWRpYVRpbWUocmVhbFRpbWVVcywgJm1lZGlhVXMpOwogICAgICAgICAgICAgQUxPR1YoInJlbmRlcmluZyB2aWRlbyBhdCBtZWRpYSB0aW1lICUuMmYgc2VjcyIsCiAgICAgICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBGTEFHX1JFQUxfVElNRSA/IHJlYWxUaW1lVXMgOgotICAgICAgICAgICAgICAgICAgICAocmVhbFRpbWVVcyArIG1BbmNob3JUaW1lTWVkaWFVcyAtIG1BbmNob3JUaW1lUmVhbFVzKSkgLyAxRTYpOworICAgICAgICAgICAgICAgICAgICBtZWRpYVVzKSAvIDFFNik7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBzZXRWaWRlb0xhdGVCeVVzKDApOwogICAgICAgICBpZiAoIW1WaWRlb1NhbXBsZVJlY2VpdmVkICYmICFtSGFzQXVkaW8pIHsKICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUgZmlyc3QgZnJhbWUgYWZ0ZXIgYSBmbHVzaCB3b24ndCBiZSB1c2VkIGFzIGFuY2hvcgogICAgICAgICAgICAgLy8gd2hlbiByZW5kZXJlciBpcyBpbiBwYXVzZWQgc3RhdGUsIGJlY2F1c2UgcmVzdW1lIGNhbiBoYXBwZW4gYW55IHRpbWUgYWZ0ZXIgc2Vlay4KLSAgICAgICAgICAgIHNldEFuY2hvclRpbWUoLTEsIC0xKTsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgICAgICBjbGVhckFuY2hvclRpbWVfbCgpOwogICAgICAgICB9CiAgICAgfQogCkBAIC05NDEsNyArMTEzMyw4IEBACiAgICAgICAgICAgICBtVmlkZW9SZW5kZXJpbmdTdGFydGVkID0gdHJ1ZTsKICAgICAgICAgICAgIG5vdGlmeVZpZGVvUmVuZGVyaW5nU3RhcnQoKTsKICAgICAgICAgfQotICAgICAgICBub3RpZnlJZk1lZGlhUmVuZGVyaW5nU3RhcnRlZCgpOworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICBub3RpZnlJZk1lZGlhUmVuZGVyaW5nU3RhcnRlZF9sKCk7CiAgICAgfQogfQogCkBAIC05NTksMTUgKzExNTIsMjMgQEAKICAgICBub3RpZnktPnBvc3QoZGVsYXlVcyk7CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpub3RpZnlBdWRpb09mZmxvYWRUZWFyRG93bigpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0QXVkaW9PZmZsb2FkVGVhckRvd24sIGlkKCkpKS0+cG9zdCgpOwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om5vdGlmeUF1ZGlvVGVhckRvd24oKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdEF1ZGlvVGVhckRvd24sIHRoaXMpKS0+cG9zdCgpOwogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6b25RdWV1ZUJ1ZmZlcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIGludDMyX3QgYXVkaW87CiAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImF1ZGlvIiwgJmF1ZGlvKSk7CiAKLSAgICBzZXRIYXNNZWRpYShhdWRpbyk7CisgICAgaWYgKGRyb3BCdWZmZXJJZlN0YWxlKGF1ZGlvLCBtc2cpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgbUhhc0F1ZGlvID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSGFzVmlkZW8gPSB0cnVlOworICAgIH0KIAogICAgIGlmIChtSGFzVmlkZW8pIHsKICAgICAgICAgaWYgKG1WaWRlb1NjaGVkdWxlciA9PSBOVUxMKSB7CkBAIC05NzYsMTAgKzExNzcsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGRyb3BCdWZmZXJXaGlsZUZsdXNoaW5nKGF1ZGlvLCBtc2cpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KICAgICBzcDxBQnVmZmVyPiBidWZmZXI7CiAgICAgQ0hFQ0sobXNnLT5maW5kQnVmZmVyKCJidWZmZXIiLCAmYnVmZmVyKSk7CiAKQEAgLTk5MywxNSArMTE5MCwxNiBAQAogICAgIGVudHJ5Lm1GaW5hbFJlc3VsdCA9IE9LOwogICAgIGVudHJ5Lm1CdWZmZXJPcmRpbmFsID0gKyttVG90YWxCdWZmZXJzUXVldWVkOwogCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICAgICAgbUF1ZGlvUXVldWUucHVzaF9iYWNrKGVudHJ5KTsKICAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZV9sKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbVZpZGVvUXVldWUucHVzaF9iYWNrKGVudHJ5KTsKLSAgICAgICAgcG9zdERyYWluVmlkZW9RdWV1ZV9sKCk7CisgICAgICAgIHBvc3REcmFpblZpZGVvUXVldWUoKTsKICAgICB9CiAKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIGlmICghbVN5bmNRdWV1ZXMgfHwgbUF1ZGlvUXVldWUuZW1wdHkoKSB8fCBtVmlkZW9RdWV1ZS5lbXB0eSgpKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xMDUwLDcgKzEyNDgsOSBAQAogICAgIH0KIAogICAgIGlmICghbVZpZGVvUXVldWUuZW1wdHkoKSkgewotICAgICAgICBwb3N0RHJhaW5WaWRlb1F1ZXVlX2woKTsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIHBvc3REcmFpblZpZGVvUXVldWUoKTsKKyAgICAgICAgbUxvY2subG9jaygpOwogICAgIH0KIH0KIApAQCAtMTA1OCw3ICsxMjU4LDcgQEAKICAgICBpbnQzMl90IGF1ZGlvOwogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpbyIsICZhdWRpbykpOwogCi0gICAgaWYgKGRyb3BCdWZmZXJXaGlsZUZsdXNoaW5nKGF1ZGlvLCBtc2cpKSB7CisgICAgaWYgKGRyb3BCdWZmZXJJZlN0YWxlKGF1ZGlvLCBtc2cpKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTEwNjksMTkgKzEyNjksMjAgQEAKICAgICBlbnRyeS5tT2Zmc2V0ID0gMDsKICAgICBlbnRyeS5tRmluYWxSZXN1bHQgPSBmaW5hbFJlc3VsdDsKIAotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgICAgIGlmIChtQXVkaW9RdWV1ZS5lbXB0eSgpICYmIG1TeW5jUXVldWVzKSB7CiAgICAgICAgICAgICBzeW5jUXVldWVzRG9uZV9sKCk7CiAgICAgICAgIH0KICAgICAgICAgbUF1ZGlvUXVldWUucHVzaF9iYWNrKGVudHJ5KTsKICAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZV9sKCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1WaWRlb1F1ZXVlLmVtcHR5KCkgJiYgbVN5bmNRdWV1ZXMpIHsKKyAgICAgICAgaWYgKG1WaWRlb1F1ZXVlLmVtcHR5KCkgJiYgZ2V0U3luY1F1ZXVlcygpKSB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgICAgICAgICAgc3luY1F1ZXVlc0RvbmVfbCgpOwogICAgICAgICB9CiAgICAgICAgIG1WaWRlb1F1ZXVlLnB1c2hfYmFjayhlbnRyeSk7Ci0gICAgICAgIHBvc3REcmFpblZpZGVvUXVldWVfbCgpOworICAgICAgICBwb3N0RHJhaW5WaWRlb1F1ZXVlKCk7CiAgICAgfQogfQogCkBAIC0xMDkwLDMxICsxMjkxLDI1IEBACiAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImF1ZGlvIiwgJmF1ZGlvKSk7CiAKICAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRmx1c2hMb2NrKTsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICAgICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgICAgICBtRmx1c2hpbmdBdWRpbyA9IGZhbHNlOwogICAgICAgICAgICAgbm90aWZ5Q29tcGxldGUgPSBtTm90aWZ5Q29tcGxldGVBdWRpbzsKICAgICAgICAgICAgIG1Ob3RpZnlDb21wbGV0ZUF1ZGlvID0gZmFsc2U7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRmx1c2hpbmdWaWRlbyA9IGZhbHNlOwogICAgICAgICAgICAgbm90aWZ5Q29tcGxldGUgPSBtTm90aWZ5Q29tcGxldGVWaWRlbzsKICAgICAgICAgICAgIG1Ob3RpZnlDb21wbGV0ZVZpZGVvID0gZmFsc2U7CiAgICAgICAgIH0KLSAgICB9CiAKLSAgICAvLyBJZiB3ZSdyZSBjdXJyZW50bHkgc3luY2luZyB0aGUgcXVldWVzLCBpLmUuIGRyb3BwaW5nIGF1ZGlvIHdoaWxlCi0gICAgLy8gYWxpZ25pbmcgdGhlIGZpcnN0IGF1ZGlvL3ZpZGVvIGJ1ZmZlciB0aW1lcyBhbmQgb25seSBvbmUgb2YgdGhlCi0gICAgLy8gdHdvIHF1ZXVlcyBoYXMgZGF0YSwgd2UgbWF5IHN0YXJ2ZSB0aGF0IHF1ZXVlIGJ5IG5vdCByZXF1ZXN0aW5nCi0gICAgLy8gbW9yZSBidWZmZXJzIGZyb20gdGhlIGRlY29kZXIuIElmIHRoZSBvdGhlciBzb3VyY2UgdGhlbiBlbmNvdW50ZXJzCi0gICAgLy8gYSBkaXNjb250aW51aXR5IHRoYXQgbGVhZHMgdG8gZmx1c2hpbmcsIHdlJ2xsIG5ldmVyIGZpbmQgdGhlCi0gICAgLy8gY29ycmVzcG9uZGluZyBkaXNjb250aW51aXR5IG9uIHRoZSBvdGhlciBxdWV1ZS4KLSAgICAvLyBUaGVyZWZvcmUgd2UnbGwgc3RvcCBzeW5jaW5nIHRoZSBxdWV1ZXMgaWYgYXQgbGVhc3Qgb25lIG9mIHRoZW0KLSAgICAvLyBpcyBmbHVzaGVkLgotICAgIHsKLSAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgICBzeW5jUXVldWVzRG9uZV9sKCk7Ci0gICAgICAgICBzZXRQYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzKC0xKTsKLSAgICAgICAgIHNldEFuY2hvclRpbWUoLTEsIC0xKTsKKyAgICAgICAgLy8gSWYgd2UncmUgY3VycmVudGx5IHN5bmNpbmcgdGhlIHF1ZXVlcywgaS5lLiBkcm9wcGluZyBhdWRpbyB3aGlsZQorICAgICAgICAvLyBhbGlnbmluZyB0aGUgZmlyc3QgYXVkaW8vdmlkZW8gYnVmZmVyIHRpbWVzIGFuZCBvbmx5IG9uZSBvZiB0aGUKKyAgICAgICAgLy8gdHdvIHF1ZXVlcyBoYXMgZGF0YSwgd2UgbWF5IHN0YXJ2ZSB0aGF0IHF1ZXVlIGJ5IG5vdCByZXF1ZXN0aW5nCisgICAgICAgIC8vIG1vcmUgYnVmZmVycyBmcm9tIHRoZSBkZWNvZGVyLiBJZiB0aGUgb3RoZXIgc291cmNlIHRoZW4gZW5jb3VudGVycworICAgICAgICAvLyBhIGRpc2NvbnRpbnVpdHkgdGhhdCBsZWFkcyB0byBmbHVzaGluZywgd2UnbGwgbmV2ZXIgZmluZCB0aGUKKyAgICAgICAgLy8gY29ycmVzcG9uZGluZyBkaXNjb250aW51aXR5IG9uIHRoZSBvdGhlciBxdWV1ZS4KKyAgICAgICAgLy8gVGhlcmVmb3JlIHdlJ2xsIHN0b3Agc3luY2luZyB0aGUgcXVldWVzIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGVtCisgICAgICAgIC8vIGlzIGZsdXNoZWQuCisgICAgICAgIHN5bmNRdWV1ZXNEb25lX2woKTsKKyAgICAgICAgY2xlYXJBbmNob3JUaW1lX2woKTsKICAgICB9CiAKICAgICBBTE9HVigiZmx1c2hpbmcgJXMiLCBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKQEAgLTExMjMsMTIgKzEzMTgsMTEgQEAKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgICAgICAgICBmbHVzaFF1ZXVlKCZtQXVkaW9RdWV1ZSk7CiAKLSAgICAgICAgICAgICsrbUF1ZGlvUXVldWVHZW5lcmF0aW9uOwotICAgICAgICAgICAgcHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnQoKTsKKyAgICAgICAgICAgICsrbUF1ZGlvRHJhaW5HZW5lcmF0aW9uOworICAgICAgICAgICAgcHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnRfbCgpOwogCi0gICAgICAgICAgICBpZiAob2ZmbG9hZGluZ0F1ZGlvKCkpIHsKLSAgICAgICAgICAgICAgICBzZXRBdWRpb0ZpcnN0QW5jaG9yVGltZSgtMSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB0aGUgZnJhbWUgY291bnQgd2lsbCBiZSByZXNldCBhZnRlciBmbHVzaC4KKyAgICAgICAgICAgIGNsZWFyQXVkaW9GaXJzdEFuY2hvclRpbWVfbCgpOwogICAgICAgICB9CiAKICAgICAgICAgbURyYWluQXVkaW9RdWV1ZVBlbmRpbmcgPSBmYWxzZTsKQEAgLTExMzYsMTkgKzEzMzAsMzIgQEAKICAgICAgICAgaWYgKG9mZmxvYWRpbmdBdWRpbygpKSB7CiAgICAgICAgICAgICBtQXVkaW9TaW5rLT5wYXVzZSgpOwogICAgICAgICAgICAgbUF1ZGlvU2luay0+Zmx1c2goKTsKLSAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7CisgICAgICAgICAgICBpZiAoIW1QYXVzZWQpIHsKKyAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUF1ZGlvU2luay0+cGF1c2UoKTsKKyAgICAgICAgICAgIG1BdWRpb1NpbmstPmZsdXNoKCk7CisgICAgICAgICAgICAvLyBDYWxsIHN0b3AoKSB0byBzaWduYWwgdG8gdGhlIEF1ZGlvU2luayB0byBjb21wbGV0ZWx5IGZpbGwgdGhlCisgICAgICAgICAgICAvLyBpbnRlcm5hbCBidWZmZXIgYmVmb3JlIHJlc3VtaW5nIHBsYXliYWNrLgorICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RvcCgpOworICAgICAgICAgICAgaWYgKCFtUGF1c2VkKSB7CisgICAgICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1OdW1GcmFtZXNXcml0dGVuID0gMDsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGZsdXNoUXVldWUoJm1WaWRlb1F1ZXVlKTsKIAogICAgICAgICBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyA9IGZhbHNlOwotICAgICAgICArK21WaWRlb1F1ZXVlR2VuZXJhdGlvbjsKIAogICAgICAgICBpZiAobVZpZGVvU2NoZWR1bGVyICE9IE5VTEwpIHsKICAgICAgICAgICAgIG1WaWRlb1NjaGVkdWxlci0+cmVzdGFydCgpOwogICAgICAgICB9CiAKLSAgICAgICAgcHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnQoKTsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgKyttVmlkZW9EcmFpbkdlbmVyYXRpb247CisgICAgICAgIHByZXBhcmVGb3JNZWRpYVJlbmRlcmluZ1N0YXJ0X2woKTsKICAgICB9CiAKICAgICBtVmlkZW9TYW1wbGVSZWNlaXZlZCA9IGZhbHNlOwpAQCAtMTE3OCwyMCArMTM4NSwxMiBAQAogICAgIG5vdGlmeS0+cG9zdCgpOwogfQogCi1ib29sIE51UGxheWVyOjpSZW5kZXJlcjo6ZHJvcEJ1ZmZlcldoaWxlRmx1c2hpbmcoCitib29sIE51UGxheWVyOjpSZW5kZXJlcjo6ZHJvcEJ1ZmZlcklmU3RhbGUoCiAgICAgICAgIGJvb2wgYXVkaW8sIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgYm9vbCBmbHVzaGluZyA9IGZhbHNlOworICAgIGludDMyX3QgcXVldWVHZW5lcmF0aW9uOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJxdWV1ZUdlbmVyYXRpb24iLCAmcXVldWVHZW5lcmF0aW9uKSk7CiAKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRmx1c2hMb2NrKTsKLSAgICAgICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgICAgICBmbHVzaGluZyA9IG1GbHVzaGluZ0F1ZGlvOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmx1c2hpbmcgPSBtRmx1c2hpbmdWaWRlbzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghZmx1c2hpbmcpIHsKKyAgICBpZiAocXVldWVHZW5lcmF0aW9uID09IGdldFF1ZXVlR2VuZXJhdGlvbihhdWRpbykpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtMTIwOSw3ICsxNDA4LDEwIEBACiAgICAgfQogICAgIENIRUNLKCFtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyk7CiAgICAgbU51bUZyYW1lc1dyaXR0ZW4gPSAwOwotICAgIG1BbmNob3JOdW1GcmFtZXNXcml0dGVuID0gLTE7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICBtQW5jaG9yTnVtRnJhbWVzV3JpdHRlbiA9IC0xOworICAgIH0KICAgICB1aW50MzJfdCB3cml0dGVuOwogICAgIGlmIChtQXVkaW9TaW5rLT5nZXRGcmFtZXNXcml0dGVuKCZ3cml0dGVuKSA9PSBPSykgewogICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiA9IHdyaXR0ZW47CkBAIC0xMjE5LDQwICsxNDIxLDMzIEBACiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6b25EaXNhYmxlT2ZmbG9hZEF1ZGlvKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgbUZsYWdzICY9IH5GTEFHX09GRkxPQURfQVVESU87Ci0gICAgKyttQXVkaW9RdWV1ZUdlbmVyYXRpb247CisgICAgKyttQXVkaW9EcmFpbkdlbmVyYXRpb247CisgICAgaWYgKG1BdWRpb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbiAhPSAtMSkgeworICAgICAgICBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydF9sKCk7CisgICAgfQogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6b25FbmFibGVPZmZsb2FkQXVkaW8oKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBtRmxhZ3MgfD0gRkxBR19PRkZMT0FEX0FVRElPOwotICAgICsrbUF1ZGlvUXVldWVHZW5lcmF0aW9uOworICAgICsrbUF1ZGlvRHJhaW5HZW5lcmF0aW9uOworICAgIGlmIChtQXVkaW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24gIT0gLTEpIHsKKyAgICAgICAgcHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnRfbCgpOworICAgIH0KIH0KIAogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uUGF1c2UoKSB7CiAgICAgaWYgKG1QYXVzZWQpIHsKLSAgICAgICAgQUxPR1coIlJlbmRlcmVyOjpvblBhdXNlKCkgY2FsbGVkIHdoaWxlIGFscmVhZHkgcGF1c2VkISIpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGludDY0X3QgY3VycmVudFBvc2l0aW9uVXM7Ci0gICAgaW50NjRfdCBwYXVzZVBvc2l0aW9uTWVkaWFUaW1lVXM7Ci0gICAgaWYgKGdldEN1cnJlbnRQb3NpdGlvbkZyb21BbmNob3IoCi0gICAgICAgICAgICAmY3VycmVudFBvc2l0aW9uVXMsIEFMb29wZXI6OkdldE5vd1VzKCkpID09IE9LKSB7Ci0gICAgICAgIHBhdXNlUG9zaXRpb25NZWRpYVRpbWVVcyA9IGN1cnJlbnRQb3NpdGlvblVzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFNldCBwYXVzZWQgcG9zaXRpb24gdG8gLTEgKHVuYXZhaWxhYmUpIGlmIHdlIGRvbid0IGhhdmUgYW5jaG9yIHRpbWUKLSAgICAgICAgLy8gVGhpcyBjb3VsZCBoYXBwZW4gaWYgY2xpZW50IGRvZXMgYSBzZWVrVG8oKSBpbW1lZGlhdGVseSBmb2xsb3dlZCBieQotICAgICAgICAvLyBwYXVzZSgpLiBSZW5kZXJlciB3aWxsIGJlIGZsdXNoZWQgd2l0aCBhbmNob3IgdGltZSBjbGVhcmVkLiBXZSBkb24ndAotICAgICAgICAvLyB3YW50IHRvIGxlYXZlIHN0YWxlIHZhbHVlIGluIG1QYXVzZVBvc2l0aW9uTWVkaWFUaW1lVXMuCi0gICAgICAgIHBhdXNlUG9zaXRpb25NZWRpYVRpbWVVcyA9IC0xOwotICAgIH0KKwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgbVBhdXNlUG9zaXRpb25NZWRpYVRpbWVVcyA9IHBhdXNlUG9zaXRpb25NZWRpYVRpbWVVczsKLSAgICAgICAgKyttQXVkaW9RdWV1ZUdlbmVyYXRpb247Ci0gICAgICAgICsrbVZpZGVvUXVldWVHZW5lcmF0aW9uOwotICAgICAgICBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydCgpOworICAgICAgICAvLyB3ZSBkbyBub3QgaW5jcmVtZW50IGF1ZGlvIGRyYWluIGdlbmVyYXRpb24gc28gdGhhdCB3ZSBmaWxsIGF1ZGlvIGJ1ZmZlciBkdXJpbmcgcGF1c2UuCisgICAgICAgICsrbVZpZGVvRHJhaW5HZW5lcmF0aW9uOworICAgICAgICBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydF9sKCk7CiAgICAgICAgIG1QYXVzZWQgPSB0cnVlOwotICAgICAgICBzZXRQYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzKEFMb29wZXI6OkdldE5vd1VzKCkpOworICAgICAgICBtTWVkaWFDbG9jay0+c2V0UGxheWJhY2tSYXRlKDAuMCk7CiAgICAgfQogCiAgICAgbURyYWluQXVkaW9RdWV1ZVBlbmRpbmcgPSBmYWxzZTsKQEAgLTEyNjMsNyArMTQ1OCw3IEBACiAgICAgICAgIHN0YXJ0QXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0KCk7CiAgICAgfQogCi0gICAgQUxPR1YoIm5vdyBwYXVzZWQgYXVkaW8gcXVldWUgaGFzICVkIGVudHJpZXMsIHZpZGVvIGhhcyAlZCBlbnRyaWVzIiwKKyAgICBBTE9HVigibm93IHBhdXNlZCBhdWRpbyBxdWV1ZSBoYXMgJXp1IGVudHJpZXMsIHZpZGVvIGhhcyAlenUgZW50cmllcyIsCiAgICAgICAgICAgbUF1ZGlvUXVldWUuc2l6ZSgpLCBtVmlkZW9RdWV1ZS5zaXplKCkpOwogfQogCkBAIC0xMjc0LDI0ICsxNDY5LDMwIEBACiAKICAgICBpZiAobUhhc0F1ZGlvKSB7CiAgICAgICAgIGNhbmNlbEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCgpOwotICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQXVkaW9TaW5rLT5zdGFydCgpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBub3RpZnlBdWRpb1RlYXJEb3duKCk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIG1QYXVzZWQgPSBmYWxzZTsKLSAgICBpZiAobVBhdXNlU3RhcnRlZFRpbWVSZWFsVXMgIT0gLTEpIHsKLSAgICAgICAgaW50NjRfdCBuZXdBbmNob3JSZWFsVXMgPQotICAgICAgICAgICAgbUFuY2hvclRpbWVSZWFsVXMgKyBBTG9vcGVyOjpHZXROb3dVcygpIC0gbVBhdXNlU3RhcnRlZFRpbWVSZWFsVXM7Ci0gICAgICAgIHNldEFuY2hvclRpbWUoCi0gICAgICAgICAgICAgICAgbUFuY2hvclRpbWVNZWRpYVVzLCBuZXdBbmNob3JSZWFsVXMsIG1BbmNob3JOdW1GcmFtZXNXcml0dGVuLCB0cnVlIC8qIHJlc3VtZSAqLyk7Ci0gICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgbVBhdXNlZCA9IGZhbHNlOwogCi0gICAgaWYgKCFtQXVkaW9RdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWVfbCgpOworICAgICAgICAvLyBjb25maWd1cmUgYXVkaW9zaW5rIGFzIHdlIGRpZCBub3QgZG8gaXQgd2hlbiBwYXVzaW5nCisgICAgICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwgJiYgbUF1ZGlvU2luay0+cmVhZHkoKSkgeworICAgICAgICAgICAgbUF1ZGlvU2luay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1NldHRpbmdzKTsKKyAgICAgICAgfQorCisgICAgICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrUmF0ZSk7CisKKyAgICAgICAgaWYgKCFtQXVkaW9RdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICBwb3N0RHJhaW5BdWRpb1F1ZXVlX2woKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmICghbVZpZGVvUXVldWUuZW1wdHkoKSkgewotICAgICAgICBwb3N0RHJhaW5WaWRlb1F1ZXVlX2woKTsKKyAgICAgICAgcG9zdERyYWluVmlkZW9RdWV1ZSgpOwogICAgIH0KIH0KIApAQCAtMTMwMiw2ICsxNTAzLDIxIEBACiAgICAgbVZpZGVvU2NoZWR1bGVyLT5pbml0KGZwcyk7CiB9CiAKK2ludDMyX3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpnZXRRdWV1ZUdlbmVyYXRpb24oYm9vbCBhdWRpbykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIChhdWRpbyA/IG1BdWRpb1F1ZXVlR2VuZXJhdGlvbiA6IG1WaWRlb1F1ZXVlR2VuZXJhdGlvbik7Cit9CisKK2ludDMyX3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpnZXREcmFpbkdlbmVyYXRpb24oYm9vbCBhdWRpbykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIChhdWRpbyA/IG1BdWRpb0RyYWluR2VuZXJhdGlvbiA6IG1WaWRlb0RyYWluR2VuZXJhdGlvbik7Cit9CisKK2Jvb2wgTnVQbGF5ZXI6OlJlbmRlcmVyOjpnZXRTeW5jUXVldWVzKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1TeW5jUXVldWVzOworfQorCiAvLyBUT0RPOiBSZW1vdmUgdW5uZWNlc3NhcnkgY2FsbHMgdG8gZ2V0UGxheWVkT3V0QXVkaW9EdXJhdGlvblVzKCkKIC8vIGFzIGl0IGFjcXVpcmVzIGxvY2tzIGFuZCBtYXkgcXVlcnkgdGhlIGF1ZGlvIGRyaXZlci4KIC8vCkBAIC0xMzA5LDYgKzE1MjUsNyBAQAogLy8gYWNjZXNzaW5nIGdldFRpbWVzdGFtcCgpIG9yIGdldFBvc2l0aW9uKCkgZXZlcnkgdGltZSBhIGRhdGEgYnVmZmVyIHdpdGgKIC8vIGEgbWVkaWEgdGltZSBpcyByZWNlaXZlZC4KIC8vCisvLyBDYWxjdWxhdGUgZHVyYXRpb24gb2YgcGxheWVkIHNhbXBsZXMgaWYgcGxheWVkIGF0IG5vcm1hbCByYXRlIChpLmUuLCAxLjApLgogaW50NjRfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmdldFBsYXllZE91dEF1ZGlvRHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKSB7CiAgICAgdWludDMyX3QgbnVtRnJhbWVzUGxheWVkOwogICAgIGludDY0X3QgbnVtRnJhbWVzUGxheWVkQXQ7CkBAIC0xMzQzLDEyICsxNTYwLDExIEBACiAgICAgICAgIENIRUNLX0VRKHJlcywgKHN0YXR1c190KU9LKTsKICAgICAgICAgbnVtRnJhbWVzUGxheWVkQXQgPSBub3dVczsKICAgICAgICAgbnVtRnJhbWVzUGxheWVkQXQgKz0gMTAwMExMICogbUF1ZGlvU2luay0+bGF0ZW5jeSgpIC8gMjsgLyogWFhYICovCi0gICAgICAgIC8vQUxPR0QoImdldFBvc2l0aW9uOiAlZCAlbGxkIiwgbnVtRnJhbWVzUGxheWVkLCBudW1GcmFtZXNQbGF5ZWRBdCk7CisgICAgICAgIC8vQUxPR0QoImdldFBvc2l0aW9uOiAldSAlbGxkIiwgbnVtRnJhbWVzUGxheWVkLCAobG9uZyBsb25nKW51bUZyYW1lc1BsYXllZEF0KTsKICAgICB9CiAKLSAgICAvLyBUT0RPOiByZW1vdmUgdGhlIChpbnQzMl90KSBjYXN0aW5nIGJlbG93IGFzIGl0IG1heSBvdmVyZmxvdyBhdCAxMi40IGhvdXJzLgogICAgIC8vQ0hFQ0tfRVEobnVtRnJhbWVzUGxheWVkICYgKDEgPDwgMzEpLCAwKTsgIC8vIGNhbid0IGJlIG5lZ2F0aXZlIHVudGlsIDEyLjQgaHJzLCB0ZXN0Ci0gICAgaW50NjRfdCBkdXJhdGlvblVzID0gKGludDY0X3QpKChpbnQzMl90KW51bUZyYW1lc1BsYXllZCAqIDEwMDBMTCAqIG1BdWRpb1NpbmstPm1zZWNzUGVyRnJhbWUoKSkKKyAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSBnZXREdXJhdGlvblVzSWZQbGF5ZWRBdFNhbXBsZVJhdGUobnVtRnJhbWVzUGxheWVkKQogICAgICAgICAgICAgKyBub3dVcyAtIG51bUZyYW1lc1BsYXllZEF0OwogICAgIGlmIChkdXJhdGlvblVzIDwgMCkgewogICAgICAgICAvLyBPY2N1cnMgd2hlbiBudW1GcmFtZXNQbGF5ZWQgcG9zaXRpb24gaXMgdmVyeSBzbWFsbCBhbmQgdGhlIGZvbGxvd2luZzoKQEAgLTEzNjYsMjMgKzE1ODIsMjIgQEAKICAgICByZXR1cm4gZHVyYXRpb25VczsKIH0KIAotdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uQXVkaW9PZmZsb2FkVGVhckRvd24oQXVkaW9PZmZsb2FkVGVhckRvd25SZWFzb24gcmVhc29uKSB7Ci0gICAgaWYgKG1BdWRpb09mZmxvYWRUb3JuRG93bikgewordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uQXVkaW9UZWFyRG93bihBdWRpb1RlYXJEb3duUmVhc29uIHJlYXNvbikgeworICAgIGlmIChtQXVkaW9Ub3JuRG93bikgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIG1BdWRpb09mZmxvYWRUb3JuRG93biA9IHRydWU7CisgICAgbUF1ZGlvVG9ybkRvd24gPSB0cnVlOwogCiAgICAgaW50NjRfdCBjdXJyZW50UG9zaXRpb25VczsKLSAgICBpZiAoZ2V0Q3VycmVudFBvc2l0aW9uT25Mb29wZXIoJmN1cnJlbnRQb3NpdGlvblVzKSAhPSBPSykgewotICAgICAgICBjdXJyZW50UG9zaXRpb25VcyA9IDA7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIGlmIChnZXRDdXJyZW50UG9zaXRpb24oJmN1cnJlbnRQb3NpdGlvblVzKSA9PSBPSykgeworICAgICAgICBub3RpZnktPnNldEludDY0KCJwb3NpdGlvblVzIiwgY3VycmVudFBvc2l0aW9uVXMpOwogICAgIH0KIAogICAgIG1BdWRpb1NpbmstPnN0b3AoKTsKICAgICBtQXVkaW9TaW5rLT5mbHVzaCgpOwogCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEF1ZGlvT2ZmbG9hZFRlYXJEb3duKTsKLSAgICBub3RpZnktPnNldEludDY0KCJwb3NpdGlvblVzIiwgY3VycmVudFBvc2l0aW9uVXMpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEF1ZGlvVGVhckRvd24pOwogICAgIG5vdGlmeS0+c2V0SW50MzIoInJlYXNvbiIsIHJlYXNvbik7CiAgICAgbm90aWZ5LT5wb3N0KCk7CiB9CkBAIC0xMzkwLDggKzE2MDUsOCBAQAogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnN0YXJ0QXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0KCkgewogICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgewogICAgICAgICBtV2FrZUxvY2stPmFjcXVpcmUoKTsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCwgaWQoKSk7Ci0gICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0R2VuZXJhdGlvbik7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQsIHRoaXMpOworICAgICAgICBtc2ctPnNldEludDMyKCJkcmFpbkdlbmVyYXRpb24iLCBtQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0R2VuZXJhdGlvbik7CiAgICAgICAgIG1zZy0+cG9zdChrT2ZmbG9hZFBhdXNlTWF4VXMpOwogICAgIH0KIH0KQEAgLTE0NzUsMTggKzE2OTAsMjMgQEAKICAgICAgICAgICAgIG9mZmxvYWRGbGFncyAmPSB+QVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVI7CiAgICAgICAgICAgICBhdWRpb1NpbmtDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgIG1BdWRpb1NpbmstPmNsb3NlKCk7CisKICAgICAgICAgICAgIGVyciA9IG1BdWRpb1NpbmstPm9wZW4oCiAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICA4IC8qIGJ1ZmZlckNvdW50ICovLAorICAgICAgICAgICAgICAgICAgICAwIC8qIGJ1ZmZlckNvdW50IC0gdW51c2VkICovLAogICAgICAgICAgICAgICAgICAgICAmTnVQbGF5ZXI6OlJlbmRlcmVyOjpBdWRpb1NpbmtDYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgdGhpcywKICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KW9mZmxvYWRGbGFncywKICAgICAgICAgICAgICAgICAgICAgJm9mZmxvYWRJbmZvKTsKIAogICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIGVyciA9IG1BdWRpb1NpbmstPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tTZXR0aW5ncyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcGxheWJhY2sgaXMgb2ZmbG9hZGVkIHRvIGgvdywgd2UgcGFzcwogICAgICAgICAgICAgICAgIC8vIHRoZSBIQUwgc29tZSBtZXRhZGF0YSBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIGRvIHRoaXMgZm9yIFBDTSBiZWNhdXNlIGl0CkBAIC0xNDk0LDcgKzE3MTQsOSBAQAogICAgICAgICAgICAgICAgIC8vIGJlZm9yZSByZWFjaGluZyB0aGUgaGFyZHdhcmUuCiAgICAgICAgICAgICAgICAgLy8gVE9ETwogICAgICAgICAgICAgICAgIG1DdXJyZW50T2ZmbG9hZEluZm8gPSBvZmZsb2FkSW5mbzsKLSAgICAgICAgICAgICAgICBlcnIgPSBtQXVkaW9TaW5rLT5zdGFydCgpOworICAgICAgICAgICAgICAgIGlmICghbVBhdXNlZCkgeyAvLyBmb3IgcHJldmlldyBtb2RlLCBkb24ndCBzdGFydCBpZiBwYXVzZWQKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbUF1ZGlvU2luay0+c3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR1ZfSUYoZXJyID09IE9LLCAib3BlbkF1ZGlvU2luazogb2ZmbG9hZCBzdWNjZWVkZWQiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTE1MDMsNiArMTcyNSw5IEBACiAgICAgICAgICAgICAgICAgb25EaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7CiAgICAgICAgICAgICAgICAgbUN1cnJlbnRPZmZsb2FkSW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CiAgICAgICAgICAgICAgICAgQUxPR1YoIm9wZW5BdWRpb1Npbms6IG9mZmxvYWQgZmFpbGVkIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Vc2VBdWRpb0NhbGxiYWNrID0gdHJ1ZTsgIC8vIG9mZmxvYWQgbW9kZSB0cmFuc2ZlcnMgZGF0YSB0aHJvdWdoIGNhbGxiYWNrCisgICAgICAgICAgICAgICAgKyttQXVkaW9EcmFpbkdlbmVyYXRpb247ICAvLyBkaXNjYXJkIHBlbmRpbmcga1doYXREcmFpbkF1ZGlvUXVldWUgbWVzc2FnZS4KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTE1MjcsMjkgKzE3NTIsNDcgQEAKICAgICAgICAgYXVkaW9TaW5rQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgIG1BdWRpb1NpbmstPmNsb3NlKCk7CiAgICAgICAgIG1DdXJyZW50T2ZmbG9hZEluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOworICAgICAgICAvLyBOb3RlOiBJdCBpcyBwb3NzaWJsZSB0byBzZXQgdXAgdGhlIGNhbGxiYWNrLCBidXQgbm90IHVzZSBpdCB0byBzZW5kIGF1ZGlvIGRhdGEuCisgICAgICAgIC8vIFRoaXMgcmVxdWlyZXMgYSBmaXggaW4gQXVkaW9TaW5rIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgdHJhbnNmZXIgbW9kZS4KKyAgICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2sgPSBnZXRVc2VBdWRpb0NhbGxiYWNrU2V0dGluZygpOworICAgICAgICBpZiAobVVzZUF1ZGlvQ2FsbGJhY2spIHsKKyAgICAgICAgICAgICsrbUF1ZGlvRHJhaW5HZW5lcmF0aW9uOyAgLy8gZGlzY2FyZCBwZW5kaW5nIGtXaGF0RHJhaW5BdWRpb1F1ZXVlIG1lc3NhZ2UuCisgICAgICAgIH0KKworICAgICAgICAvLyBDb21wdXRlIHRoZSBkZXNpcmVkIGJ1ZmZlciBzaXplLgorICAgICAgICAvLyBGb3IgY2FsbGJhY2sgbW9kZSwgdGhlIGFtb3VudCBvZiB0aW1lIGJlZm9yZSB3YWtldXAgaXMgYWJvdXQgaGFsZiB0aGUgYnVmZmVyIHNpemUuCisgICAgICAgIGNvbnN0IHVpbnQzMl90IGZyYW1lQ291bnQgPQorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2FtcGxlUmF0ZSAqIGdldEF1ZGlvU2lua1BjbU1zU2V0dGluZygpIC8gMTAwMDsKKwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQXVkaW9TaW5rLT5vcGVuKAogICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KWNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKLSAgICAgICAgICAgICAgICAgICAgOCAvKiBidWZmZXJDb3VudCAqLywKKyAgICAgICAgICAgICAgICAgICAgMCAvKiBidWZmZXJDb3VudCAtIHVudXNlZCAqLywKKyAgICAgICAgICAgICAgICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2sgPyAmTnVQbGF5ZXI6OlJlbmRlcmVyOjpBdWRpb1NpbmtDYWxsYmFjayA6IE5VTEwsCisgICAgICAgICAgICAgICAgICAgIG1Vc2VBdWRpb0NhbGxiYWNrID8gdGhpcyA6IE5VTEwsCisgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdClwY21GbGFncywKICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KXBjbUZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBkb05vdFJlY29ubmVjdCAqLywKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIGVyciA9IG1BdWRpb1NpbmstPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tTZXR0aW5ncyk7CisgICAgICAgIH0KICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgQUxPR1coIm9wZW5BdWRpb1Npbms6IG5vbiBvZmZsb2FkZWQgb3BlbiBmYWlsZWQgc3RhdHVzOiAlZCIsIGVycik7CiAgICAgICAgICAgICBtQ3VycmVudFBjbUluZm8gPSBBVURJT19QQ01JTkZPX0lOSVRJQUxJWkVSOwogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgICAgICBtQ3VycmVudFBjbUluZm8gPSBpbmZvOwotICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOworICAgICAgICBpZiAoIW1QYXVzZWQpIHsgLy8gZm9yIHByZXZpZXcgbW9kZSwgZG9uJ3Qgc3RhcnQgaWYgcGF1c2VkCisgICAgICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOworICAgICAgICB9CiAgICAgfQogICAgIGlmIChhdWRpb1NpbmtDaGFuZ2VkKSB7CiAgICAgICAgIG9uQXVkaW9TaW5rQ2hhbmdlZCgpOwogICAgIH0KLSAgICBpZiAob2ZmbG9hZGluZ0F1ZGlvKCkpIHsKLSAgICAgICAgbUF1ZGlvT2ZmbG9hZFRvcm5Eb3duID0gZmFsc2U7Ci0gICAgfQorICAgIG1BdWRpb1Rvcm5Eb3duID0gZmFsc2U7CiAgICAgcmV0dXJuIE9LOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaAppbmRleCAwMDNkMWQwLi4zZTY1NjQ5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKQEAgLTE4LDEyICsxOCwxNiBAQAogCiAjZGVmaW5lIE5VUExBWUVSX1JFTkRFUkVSX0hfCiAKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgorI2luY2x1ZGUgPG1lZGlhL0FWU3luY1NldHRpbmdzLmg+CisKICNpbmNsdWRlICJOdVBsYXllci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBQnVmZmVyOwogY2xhc3MgIEFXYWtlTG9jazsKK3N0cnVjdCBNZWRpYUNsb2NrOwogc3RydWN0IFZpZGVvRnJhbWVTY2hlZHVsZXI7CiAKIHN0cnVjdCBOdVBsYXllcjo6UmVuZGVyZXIgOiBwdWJsaWMgQUhhbmRsZXIgewpAQCAtNDcsNiArNTEsMTEgQEAKIAogICAgIHZvaWQgcXVldWVFT1MoYm9vbCBhdWRpbywgc3RhdHVzX3QgZmluYWxSZXN1bHQpOwogCisgICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSAvKiBzYW5pdGl6ZWQgKi8pOworICAgIHN0YXR1c190IGdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUgLyogbm9ubnVsbCAqLyk7CisgICAgc3RhdHVzX3Qgc2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpOworICAgIHN0YXR1c190IGdldFN5bmNTZXR0aW5ncyhBVlN5bmNTZXR0aW5ncyAqc3luYyAvKiBub25udWxsICovLCBmbG9hdCAqdmlkZW9GcHMgLyogbm9ubnVsbCAqLyk7CisKICAgICB2b2lkIGZsdXNoKGJvb2wgYXVkaW8sIGJvb2wgbm90aWZ5Q29tcGxldGUpOwogCiAgICAgdm9pZCBzaWduYWxUaW1lRGlzY29udGludWl0eSgpOwpAQCAtNjEsMTYgKzcwLDggQEAKIAogICAgIHZvaWQgc2V0VmlkZW9GcmFtZVJhdGUoZmxvYXQgZnBzKTsKIAotICAgIC8vIEZvbGxvd2luZyBzZXR0ZXJzIGFuZCBnZXR0ZXJzIGFyZSBwcm90ZWN0ZWQgYnkgbVRpbWVMb2NrLgogICAgIHN0YXR1c190IGdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptZWRpYVVzKTsKLSAgICB2b2lkIHNldEhhc01lZGlhKGJvb2wgYXVkaW8pOwotICAgIHZvaWQgc2V0QXVkaW9GaXJzdEFuY2hvclRpbWUoaW50NjRfdCBtZWRpYVVzKTsKLSAgICB2b2lkIHNldEF1ZGlvRmlyc3RBbmNob3JUaW1lSWZOZWVkZWQoaW50NjRfdCBtZWRpYVVzKTsKLSAgICB2b2lkIHNldEFuY2hvclRpbWUoCi0gICAgICAgICAgICBpbnQ2NF90IG1lZGlhVXMsIGludDY0X3QgcmVhbFVzLCBpbnQ2NF90IG51bUZyYW1lc1dyaXR0ZW4gPSAtMSwgYm9vbCByZXN1bWUgPSBmYWxzZSk7Ci0gICAgdm9pZCBzZXRWaWRlb0xhdGVCeVVzKGludDY0X3QgbGF0ZVVzKTsKICAgICBpbnQ2NF90IGdldFZpZGVvTGF0ZUJ5VXMoKTsKLSAgICB2b2lkIHNldFBhdXNlU3RhcnRlZFRpbWVSZWFsVXMoaW50NjRfdCByZWFsVXMpOwogCiAgICAgc3RhdHVzX3Qgb3BlbkF1ZGlvU2luaygKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LApAQCAtODEsMTYgKzgyLDE2IEBACiAgICAgdm9pZCBjbG9zZUF1ZGlvU2luaygpOwogCiAgICAgZW51bSB7Ci0gICAgICAgIGtXaGF0RU9TICAgICAgICAgICAgICAgICA9ICdlb3MgJywKLSAgICAgICAga1doYXRGbHVzaENvbXBsZXRlICAgICAgID0gJ2ZsdUMnLAotICAgICAgICBrV2hhdFBvc2l0aW9uICAgICAgICAgICAgPSAncG9zaScsCi0gICAgICAgIGtXaGF0VmlkZW9SZW5kZXJpbmdTdGFydCA9ICd2ZHJkJywKLSAgICAgICAga1doYXRNZWRpYVJlbmRlcmluZ1N0YXJ0ID0gJ21kcmQnLAotICAgICAgICBrV2hhdEF1ZGlvT2ZmbG9hZFRlYXJEb3duID0gJ2FPVEQnLAorICAgICAgICBrV2hhdEVPUyAgICAgICAgICAgICAgICAgICAgICA9ICdlb3MgJywKKyAgICAgICAga1doYXRGbHVzaENvbXBsZXRlICAgICAgICAgICAgPSAnZmx1QycsCisgICAgICAgIGtXaGF0UG9zaXRpb24gICAgICAgICAgICAgICAgID0gJ3Bvc2knLAorICAgICAgICBrV2hhdFZpZGVvUmVuZGVyaW5nU3RhcnQgICAgICA9ICd2ZHJkJywKKyAgICAgICAga1doYXRNZWRpYVJlbmRlcmluZ1N0YXJ0ICAgICAgPSAnbWRyZCcsCisgICAgICAgIGtXaGF0QXVkaW9UZWFyRG93biAgICAgICAgICAgID0gJ2FkVEQnLAogICAgICAgICBrV2hhdEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCA9ICdhT1BUJywKICAgICB9OwogCi0gICAgZW51bSBBdWRpb09mZmxvYWRUZWFyRG93blJlYXNvbiB7CisgICAgZW51bSBBdWRpb1RlYXJEb3duUmVhc29uIHsKICAgICAgICAga0R1ZVRvRXJyb3IgPSAwLAogICAgICAgICBrRHVlVG9UaW1lb3V0LAogICAgIH07CkBAIC0xMDcsOCArMTA4LDExIEBACiAgICAgICAgIGtXaGF0UG9zdERyYWluVmlkZW9RdWV1ZSA9ICdwRFZRJywKICAgICAgICAga1doYXRRdWV1ZUJ1ZmZlciAgICAgICAgID0gJ3F1ZUInLAogICAgICAgICBrV2hhdFF1ZXVlRU9TICAgICAgICAgICAgPSAncUVPUycsCisgICAgICAgIGtXaGF0Q29uZmlnUGxheWJhY2sgICAgICA9ICdjZlBCJywKKyAgICAgICAga1doYXRDb25maWdTeW5jICAgICAgICAgID0gJ2NmU3knLAorICAgICAgICBrV2hhdEdldFBsYXliYWNrU2V0dGluZ3MgPSAnZ1BiUycsCisgICAgICAgIGtXaGF0R2V0U3luY1NldHRpbmdzICAgICA9ICdnU3lTJywKICAgICAgICAga1doYXRGbHVzaCAgICAgICAgICAgICAgID0gJ2ZsdXMnLAotICAgICAgICBrV2hhdEF1ZGlvU2lua0NoYW5nZWQgICAgPSAnYXVTQycsCiAgICAgICAgIGtXaGF0UGF1c2UgICAgICAgICAgICAgICA9ICdwYXVzJywKICAgICAgICAga1doYXRSZXN1bWUgICAgICAgICAgICAgID0gJ3Jlc20nLAogICAgICAgICBrV2hhdE9wZW5BdWRpb1NpbmsgICAgICAgPSAnb3BuQScsCkBAIC0xNDIsMjYgKzE0NiwyMyBAQAogICAgIGJvb2wgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmc7CiAgICAgaW50MzJfdCBtQXVkaW9RdWV1ZUdlbmVyYXRpb247CiAgICAgaW50MzJfdCBtVmlkZW9RdWV1ZUdlbmVyYXRpb247CisgICAgaW50MzJfdCBtQXVkaW9EcmFpbkdlbmVyYXRpb247CisgICAgaW50MzJfdCBtVmlkZW9EcmFpbkdlbmVyYXRpb247CiAKLSAgICBNdXRleCBtVGltZUxvY2s7Ci0gICAgLy8gfG1UaW1lTG9ja3wgcHJvdGVjdHMgdGhlIGZvbGxvd2luZyA3IG1lbWJlciB2YXJzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGltZS4KLSAgICAvLyBOb3RlOiB0aG9zZSBtZW1iZXJzIGFyZSBvbmx5IHdyaXR0ZW4gb24gUmVuZGVyZXIgdGhyZWFkLCBzbyByZWFkaW5nIG9uIFJlbmRlcmVyIHRocmVhZAotICAgIC8vIGRvZXNuJ3QgbmVlZCB0byBiZSBwcm90ZWN0ZWQuIE90aGVyd2lzZSBhY2Nlc3NpbmcgdGhvc2UgbWVtYmVycyBtdXN0IGJlIHByb3RlY3RlZCBieQotICAgIC8vIHxtVGltZUxvY2t8LgotICAgIC8vIFRPRE86IG1vdmUgdGhvc2UgbWVtYmVycyB0byBhIHNlcGVyYXRlZCBtZWRpYSBjbG9jayBjbGFzcy4KKyAgICBzcDxNZWRpYUNsb2NrPiBtTWVkaWFDbG9jazsKKyAgICBmbG9hdCBtUGxheWJhY2tSYXRlOyAvLyBhdWRpbyB0cmFjayByYXRlCisKKyAgICBBdWRpb1BsYXliYWNrUmF0ZSBtUGxheWJhY2tTZXR0aW5nczsKKyAgICBBVlN5bmNTZXR0aW5ncyBtU3luY1NldHRpbmdzOworICAgIGZsb2F0IG1WaWRlb0Zwc0hpbnQ7CisKICAgICBpbnQ2NF90IG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXM7CiAgICAgaW50NjRfdCBtQW5jaG9yVGltZU1lZGlhVXM7Ci0gICAgaW50NjRfdCBtQW5jaG9yVGltZVJlYWxVczsKICAgICBpbnQ2NF90IG1BbmNob3JOdW1GcmFtZXNXcml0dGVuOwotICAgIGludDY0X3QgbUFuY2hvck1heE1lZGlhVXM7CiAgICAgaW50NjRfdCBtVmlkZW9MYXRlQnlVczsKICAgICBib29sIG1IYXNBdWRpbzsKICAgICBib29sIG1IYXNWaWRlbzsKLSAgICBpbnQ2NF90IG1QYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzOwogCi0gICAgTXV0ZXggbUZsdXNoTG9jazsgIC8vIHByb3RlY3RzIHRoZSBmb2xsb3dpbmcgMiBtZW1iZXIgdmFycy4KLSAgICBib29sIG1GbHVzaGluZ0F1ZGlvOwotICAgIGJvb2wgbUZsdXNoaW5nVmlkZW87CiAgICAgYm9vbCBtTm90aWZ5Q29tcGxldGVBdWRpbzsKICAgICBib29sIG1Ob3RpZnlDb21wbGV0ZVZpZGVvOwogCkBAIC0xNjksNyArMTcwLDYgQEAKIAogICAgIC8vIG1vZGlmaWVkIG9uIG9ubHkgcmVuZGVyZXIncyB0aHJlYWQuCiAgICAgYm9vbCBtUGF1c2VkOwotICAgIGludDY0X3QgbVBhdXNlUG9zaXRpb25NZWRpYVRpbWVVczsKIAogICAgIGJvb2wgbVZpZGVvU2FtcGxlUmVjZWl2ZWQ7CiAgICAgYm9vbCBtVmlkZW9SZW5kZXJpbmdTdGFydGVkOwpAQCAtMTc5LDcgKzE3OSw3IEBACiAgICAgaW50NjRfdCBtTGFzdFBvc2l0aW9uVXBkYXRlVXM7CiAKICAgICBpbnQzMl90IG1BdWRpb09mZmxvYWRQYXVzZVRpbWVvdXRHZW5lcmF0aW9uOwotICAgIGJvb2wgbUF1ZGlvT2ZmbG9hZFRvcm5Eb3duOworICAgIGJvb2wgbUF1ZGlvVG9ybkRvd247CiAgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgbUN1cnJlbnRPZmZsb2FkSW5mbzsKIAogICAgIHN0cnVjdCBQY21JbmZvIHsKQEAgLTE5NCw2ICsxOTQsNyBAQAogCiAgICAgaW50MzJfdCBtVG90YWxCdWZmZXJzUXVldWVkOwogICAgIGludDMyX3QgbUxhc3RBdWRpb0J1ZmZlckRyYWluZWQ7CisgICAgYm9vbCBtVXNlQXVkaW9DYWxsYmFjazsKIAogICAgIHNwPEFXYWtlTG9jaz4gbVdha2VMb2NrOwogCkBAIC0yMDcsMTggKzIwOCwyNCBAQAogICAgIHNpemVfdCBmaWxsQXVkaW9CdWZmZXIodm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CiAKICAgICBib29sIG9uRHJhaW5BdWRpb1F1ZXVlKCk7CisgICAgdm9pZCBkcmFpbkF1ZGlvUXVldWVVbnRpbExhc3RFT1MoKTsKICAgICBpbnQ2NF90IGdldFBlbmRpbmdBdWRpb1BsYXlvdXREdXJhdGlvblVzKGludDY0X3Qgbm93VXMpOwogICAgIGludDY0X3QgZ2V0UGxheWVkT3V0QXVkaW9EdXJhdGlvblVzKGludDY0X3Qgbm93VXMpOwogICAgIHZvaWQgcG9zdERyYWluQXVkaW9RdWV1ZV9sKGludDY0X3QgZGVsYXlVcyA9IDApOwogCisgICAgdm9pZCBjbGVhckFuY2hvclRpbWVfbCgpOworICAgIHZvaWQgY2xlYXJBdWRpb0ZpcnN0QW5jaG9yVGltZV9sKCk7CisgICAgdm9pZCBzZXRBdWRpb0ZpcnN0QW5jaG9yVGltZUlmTmVlZGVkX2woaW50NjRfdCBtZWRpYVVzKTsKKyAgICB2b2lkIHNldFZpZGVvTGF0ZUJ5VXMoaW50NjRfdCBsYXRlVXMpOworCiAgICAgdm9pZCBvbk5ld0F1ZGlvTWVkaWFUaW1lKGludDY0X3QgbWVkaWFUaW1lVXMpOwogICAgIGludDY0X3QgZ2V0UmVhbFRpbWVVcyhpbnQ2NF90IG1lZGlhVGltZVVzLCBpbnQ2NF90IG5vd1VzKTsKIAogICAgIHZvaWQgb25EcmFpblZpZGVvUXVldWUoKTsKLSAgICB2b2lkIHBvc3REcmFpblZpZGVvUXVldWVfbCgpOworICAgIHZvaWQgcG9zdERyYWluVmlkZW9RdWV1ZSgpOwogCi0gICAgdm9pZCBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydCgpOwotICAgIHZvaWQgbm90aWZ5SWZNZWRpYVJlbmRlcmluZ1N0YXJ0ZWQoKTsKKyAgICB2b2lkIHByZXBhcmVGb3JNZWRpYVJlbmRlcmluZ1N0YXJ0X2woKTsKKyAgICB2b2lkIG5vdGlmeUlmTWVkaWFSZW5kZXJpbmdTdGFydGVkX2woKTsKIAogICAgIHZvaWQgb25RdWV1ZUJ1ZmZlcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgdm9pZCBvblF1ZXVlRU9TKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKQEAgLTIyNiwxMCArMjMzLDE4IEBACiAgICAgdm9pZCBvbkF1ZGlvU2lua0NoYW5nZWQoKTsKICAgICB2b2lkIG9uRGlzYWJsZU9mZmxvYWRBdWRpbygpOwogICAgIHZvaWQgb25FbmFibGVPZmZsb2FkQXVkaW8oKTsKKyAgICBzdGF0dXNfdCBvbkNvbmZpZ1BsYXliYWNrKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlIC8qIHNhbml0aXplZCAqLyk7CisgICAgc3RhdHVzX3Qgb25HZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlIC8qIG5vbm51bGwgKi8pOworICAgIHN0YXR1c190IG9uQ29uZmlnU3luYyhjb25zdCBBVlN5bmNTZXR0aW5ncyAmc3luYywgZmxvYXQgdmlkZW9GcHNIaW50KTsKKyAgICBzdGF0dXNfdCBvbkdldFN5bmNTZXR0aW5ncyhBVlN5bmNTZXR0aW5ncyAqc3luYyAvKiBub25udWxsICovLCBmbG9hdCAqdmlkZW9GcHMgLyogbm9ubnVsbCAqLyk7CisKICAgICB2b2lkIG9uUGF1c2UoKTsKICAgICB2b2lkIG9uUmVzdW1lKCk7CiAgICAgdm9pZCBvblNldFZpZGVvRnJhbWVSYXRlKGZsb2F0IGZwcyk7Ci0gICAgdm9pZCBvbkF1ZGlvT2ZmbG9hZFRlYXJEb3duKEF1ZGlvT2ZmbG9hZFRlYXJEb3duUmVhc29uIHJlYXNvbik7CisgICAgaW50MzJfdCBnZXRRdWV1ZUdlbmVyYXRpb24oYm9vbCBhdWRpbyk7CisgICAgaW50MzJfdCBnZXREcmFpbkdlbmVyYXRpb24oYm9vbCBhdWRpbyk7CisgICAgYm9vbCBnZXRTeW5jUXVldWVzKCk7CisgICAgdm9pZCBvbkF1ZGlvVGVhckRvd24oQXVkaW9UZWFyRG93blJlYXNvbiByZWFzb24pOwogICAgIHN0YXR1c190IG9uT3BlbkF1ZGlvU2luaygKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAogICAgICAgICAgICAgYm9vbCBvZmZsb2FkT25seSwKQEAgLTI0MiwxMCArMjU3LDEwIEBACiAgICAgdm9pZCBub3RpZnlQb3NpdGlvbigpOwogICAgIHZvaWQgbm90aWZ5VmlkZW9MYXRlQnkoaW50NjRfdCBsYXRlQnlVcyk7CiAgICAgdm9pZCBub3RpZnlWaWRlb1JlbmRlcmluZ1N0YXJ0KCk7Ci0gICAgdm9pZCBub3RpZnlBdWRpb09mZmxvYWRUZWFyRG93bigpOworICAgIHZvaWQgbm90aWZ5QXVkaW9UZWFyRG93bigpOwogCiAgICAgdm9pZCBmbHVzaFF1ZXVlKExpc3Q8UXVldWVFbnRyeT4gKnF1ZXVlKTsKLSAgICBib29sIGRyb3BCdWZmZXJXaGlsZUZsdXNoaW5nKGJvb2wgYXVkaW8sIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICBib29sIGRyb3BCdWZmZXJJZlN0YWxlKGJvb2wgYXVkaW8sIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICB2b2lkIHN5bmNRdWV1ZXNEb25lX2woKTsKIAogICAgIGJvb2wgb2ZmbG9hZGluZ0F1ZGlvKCkgY29uc3QgeyByZXR1cm4gKG1GbGFncyAmIEZMQUdfT0ZGTE9BRF9BVURJTykgIT0gMDsgfQpAQCAtMjUzLDkgKzI2OCwxMSBAQAogICAgIHZvaWQgc3RhcnRBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQoKTsKICAgICB2b2lkIGNhbmNlbEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCgpOwogCisgICAgaW50NjRfdCBnZXREdXJhdGlvblVzSWZQbGF5ZWRBdFNhbXBsZVJhdGUodWludDMyX3QgbnVtRnJhbWVzKTsKKwogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlbmRlcmVyKTsKIH07CiAKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gTlVQTEFZRVJfUkVOREVSRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU291cmNlLmgKaW5kZXggZDlmMTRhMi4uMTFhNmE5ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU291cmNlLmgKQEAgLTI4LDcgKzI4LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFCdWZmZXI7Ci1zdHJ1Y3QgTWVkaWFCdWZmZXI7CitjbGFzcyBNZWRpYUJ1ZmZlcjsKIAogc3RydWN0IE51UGxheWVyOjpTb3VyY2UgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIGVudW0gRmxhZ3MgewpAQCAtNTMsNiArNTMsNyBAQAogICAgICAgICBrV2hhdENhY2hlU3RhdHMsCiAgICAgICAgIGtXaGF0U3VidGl0bGVEYXRhLAogICAgICAgICBrV2hhdFRpbWVkVGV4dERhdGEsCisgICAgICAgIGtXaGF0VGltZWRNZXRhRGF0YSwKICAgICAgICAga1doYXRRdWV1ZURlY29kZXJTaHV0ZG93biwKICAgICAgICAga1doYXREcm1Ob0xpY2Vuc2UsCiAgICAgICAgIGtXaGF0SW5zdGFudGlhdGVTZWN1cmVEZWNvZGVycywKQEAgLTExNyw2ICsxMTgsMTAgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbWluZygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+U291cmNlKCkge30KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU3RyZWFtTGlzdGVuZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU3RyZWFtTGlzdGVuZXIuY3BwCmluZGV4IDdmNzY3OTEuLmVlNzAzMDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclN0cmVhbUxpc3RlbmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTdHJlYW1MaXN0ZW5lci5jcHAKQEAgLTI5LDkgKzI5LDkgQEAKIAogTnVQbGF5ZXI6Ok51UGxheWVyU3RyZWFtTGlzdGVuZXI6Ok51UGxheWVyU3RyZWFtTGlzdGVuZXIoCiAgICAgICAgIGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UsCi0gICAgICAgIEFMb29wZXI6OmhhbmRsZXJfaWQgaWQpCisgICAgICAgIGNvbnN0IHNwPEFIYW5kbGVyPiAmdGFyZ2V0SGFuZGxlcikKICAgICA6IG1Tb3VyY2Uoc291cmNlKSwKLSAgICAgIG1UYXJnZXRJRChpZCksCisgICAgICBtVGFyZ2V0SGFuZGxlcih0YXJnZXRIYW5kbGVyKSwKICAgICAgIG1FT1MoZmFsc2UpLAogICAgICAgbVNlbmREYXRhTm90aWZpY2F0aW9uKHRydWUpIHsKICAgICBtU291cmNlLT5zZXRMaXN0ZW5lcih0aGlzKTsKQEAgLTY1LDggKzY1LDggQEAKICAgICBpZiAobVNlbmREYXRhTm90aWZpY2F0aW9uKSB7CiAgICAgICAgIG1TZW5kRGF0YU5vdGlmaWNhdGlvbiA9IGZhbHNlOwogCi0gICAgICAgIGlmIChtVGFyZ2V0SUQgIT0gMCkgewotICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdE1vcmVEYXRhUXVldWVkLCBtVGFyZ2V0SUQpKS0+cG9zdCgpOworICAgICAgICBpZiAobVRhcmdldEhhbmRsZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdE1vcmVEYXRhUXVldWVkLCBtVGFyZ2V0SGFuZGxlcikpLT5wb3N0KCk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC04Niw4ICs4Niw4IEBACiAgICAgaWYgKG1TZW5kRGF0YU5vdGlmaWNhdGlvbikgewogICAgICAgICBtU2VuZERhdGFOb3RpZmljYXRpb24gPSBmYWxzZTsKIAotICAgICAgICBpZiAobVRhcmdldElEICE9IDApIHsKLSAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRNb3JlRGF0YVF1ZXVlZCwgbVRhcmdldElEKSktPnBvc3QoKTsKKyAgICAgICAgaWYgKG1UYXJnZXRIYW5kbGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRNb3JlRGF0YVF1ZXVlZCwgbVRhcmdldEhhbmRsZXIpKS0+cG9zdCgpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU3RyZWFtTGlzdGVuZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclN0cmVhbUxpc3RlbmVyLmgKaW5kZXggMTg3NGQ4MC4uMmRlODI5YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU3RyZWFtTGlzdGVuZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTdHJlYW1MaXN0ZW5lci5oCkBAIC0yOSw3ICsyOSw3IEBACiBzdHJ1Y3QgTnVQbGF5ZXI6Ok51UGxheWVyU3RyZWFtTGlzdGVuZXIgOiBwdWJsaWMgQm5TdHJlYW1MaXN0ZW5lciB7CiAgICAgTnVQbGF5ZXJTdHJlYW1MaXN0ZW5lcigKICAgICAgICAgICAgIGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UsCi0gICAgICAgICAgICBBTG9vcGVyOjpoYW5kbGVyX2lkIHRhcmdldElEKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPEFIYW5kbGVyPiAmdGFyZ2V0SGFuZGxlcik7CiAKICAgICB2aXJ0dWFsIHZvaWQgcXVldWVCdWZmZXIoc2l6ZV90IGluZGV4LCBzaXplX3Qgc2l6ZSk7CiAKQEAgLTU5LDcgKzU5LDcgQEAKICAgICBNdXRleCBtTG9jazsKIAogICAgIHNwPElTdHJlYW1Tb3VyY2U+IG1Tb3VyY2U7Ci0gICAgQUxvb3Blcjo6aGFuZGxlcl9pZCBtVGFyZ2V0SUQ7CisgICAgc3A8QUhhbmRsZXI+IG1UYXJnZXRIYW5kbGVyOwogICAgIHNwPE1lbW9yeURlYWxlcj4gbU1lbW9yeURlYWxlcjsKICAgICBWZWN0b3I8c3A8SU1lbW9yeT4gPiBtQnVmZmVyczsKICAgICBMaXN0PFF1ZXVlRW50cnk+IG1RdWV1ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmNwcAppbmRleCAwMjgyYTlmLi41OGZmMTEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuY3BwCkBAIC04Nyw3ICs4Nyw3IEBACiAgICAgQ0hFQ0sobUhhbmRsZXIgPT0gTlVMTCk7CiAgICAgQ0hFQ0sobVNEUExvYWRlciA9PSBOVUxMKTsKIAotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXROb3RpZnksIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXROb3RpZnksIHRoaXMpOwogCiAgICAgQ0hFQ0tfRVEobVN0YXRlLCAoaW50KURJU0NPTk5FQ1RFRCk7CiAgICAgbVN0YXRlID0gQ09OTkVDVElORzsKQEAgLTExNiw3ICsxMTYsNyBAQAogICAgIGlmIChtTG9vcGVyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RGlzY29ubmVjdCwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdERpc2Nvbm5lY3QsIHRoaXMpOwogCiAgICAgc3A8QU1lc3NhZ2U+IGR1bW15OwogICAgIG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJmR1bW15KTsKQEAgLTEzOCw3ICsxMzgsOSBAQAogfQogCiB2b2lkIE51UGxheWVyOjpSVFNQU291cmNlOjpyZXN1bWUoKSB7Ci0gICAgbUhhbmRsZXItPnJlc3VtZSgpOworICAgIGlmIChtSGFuZGxlciAhPSBOVUxMKSB7CisgICAgICAgIG1IYW5kbGVyLT5yZXN1bWUoKTsKKyAgICB9CiB9CiAKIHN0YXR1c190IE51UGxheWVyOjpSVFNQU291cmNlOjpmZWVkTW9yZVRTRGF0YSgpIHsKQEAgLTI5MiwxNiArMjk0LDIyIEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyOjpSVFNQU291cmNlOjpzZWVrVG8oaW50NjRfdCBzZWVrVGltZVVzKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBlcmZvcm1TZWVrLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UGVyZm9ybVNlZWssIHRoaXMpOwogICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCArK21TZWVrR2VuZXJhdGlvbik7CiAgICAgbXNnLT5zZXRJbnQ2NCgidGltZVVzIiwgc2Vla1RpbWVVcyk7Ci0gICAgbXNnLT5wb3N0KDIwMDAwMGxsKTsKIAotICAgIHJldHVybiBPSzsKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKIH0KIAogdm9pZCBOdVBsYXllcjo6UlRTUFNvdXJjZTo6cGVyZm9ybVNlZWsoaW50NjRfdCBzZWVrVGltZVVzKSB7CiAgICAgaWYgKG1TdGF0ZSAhPSBDT05ORUNURUQpIHsKKyAgICAgICAgZmluaXNoU2VlayhJTlZBTElEX09QRVJBVElPTik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTMxMSw3ICszMTksNyBAQAogCiB2b2lkIE51UGxheWVyOjpSVFNQU291cmNlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIGlmIChtc2ctPndoYXQoKSA9PSBrV2hhdERpc2Nvbm5lY3QpIHsKLSAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CiAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICBtRGlzY29ubmVjdFJlcGx5SUQgPSByZXBseUlEOwpAQCAtMzIwLDkgKzMyOCwxMSBAQAogICAgIH0gZWxzZSBpZiAobXNnLT53aGF0KCkgPT0ga1doYXRQZXJmb3JtU2VlaykgewogICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CiAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmbVNlZWtSZXBseUlEKSk7CiAKICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT0gbVNlZWtHZW5lcmF0aW9uKSB7CiAgICAgICAgICAgICAvLyBvYnNvbGV0ZS4KKyAgICAgICAgICAgIGZpbmlzaFNlZWsoT0spOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTM2OCw2ICszNzgsMzcgQEAKICAgICAgICAgY2FzZSBNeUhhbmRsZXI6OmtXaGF0U2Vla0RvbmU6CiAgICAgICAgIHsKICAgICAgICAgICAgIG1TdGF0ZSA9IENPTk5FQ1RFRDsKKyAgICAgICAgICAgIGlmIChtU2Vla1JlcGx5SUQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIC8vIFVuYmxvY2sgc2Vla1RvIGhlcmUgaW4gY2FzZSB3ZSBhdHRlbXB0ZWQgdG8gc2VlayBpbiBhIGxpdmUgc3RyZWFtCisgICAgICAgICAgICAgICAgZmluaXNoU2VlayhPSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTXlIYW5kbGVyOjprV2hhdFNlZWtQYXVzZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9IGdldFNvdXJjZSh0cnVlIC8qIGF1ZGlvICovKTsKKyAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHNvdXJjZS0+cXVldWVEaXNjb250aW51aXR5KEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0cmEgKi8gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2NhcmQgKi8gdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzb3VyY2UgPSBnZXRTb3VyY2UoZmFsc2UgLyogdmlkZW8gKi8pOworICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc291cmNlLT5xdWV1ZURpc2NvbnRpbnVpdHkoQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBleHRyYSAqLyBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY2FyZCAqLyB0cnVlKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpOworICAgICAgICAgICAgZmluaXNoU2VlayhlcnIpOworCisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWUiLCAmdGltZVVzKSk7CisgICAgICAgICAgICAgICAgbUhhbmRsZXItPmNvbnRpbnVlU2Vla0FmdGVyUGF1c2UodGltZVVzKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTYwMCw3ICs2NDEsNyBAQAogICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBmaW5kIHVybCBpbiBTRFAiKTsKICAgICAgICAgICAgIGVyciA9IFVOS05PV05fRVJST1I7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Tm90aWZ5LCBpZCgpKTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXROb3RpZnksIHRoaXMpOwogCiAgICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBNeUhhbmRsZXIocnRzcFVyaS5jX3N0cigpLCBub3RpZnksIG1VSURWYWxpZCwgbVVJRCk7CiAgICAgICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXIpOwpAQCAtNzAwLDUgKzc0MSwxMiBAQAogICAgIHJldHVybiB0cnVlOwogfQogCit2b2lkIE51UGxheWVyOjpSVFNQU291cmNlOjpmaW5pc2hTZWVrKHN0YXR1c190IGVycikgeworICAgIENIRUNLKG1TZWVrUmVwbHlJRCAhPSBOVUxMKTsKKyAgICBzcDxBTWVzc2FnZT4gc2Vla1JlcGx5ID0gbmV3IEFNZXNzYWdlOworICAgIHNlZWtSZXBseS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgc2Vla1JlcGx5LT5wb3N0UmVwbHkobVNlZWtSZXBseUlEKTsKKyAgICBtU2Vla1JlcGx5SUQgPSBOVUxMOworfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmgKaW5kZXggYWMzMjk5YS4uNjQzOGExZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5oCkBAIC0yNSw2ICsyNSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBTG9vcGVyOworc3RydWN0IEFSZXBseVRva2VuOwogc3RydWN0IEFub3RoZXJQYWNrZXRTb3VyY2U7CiBzdHJ1Y3QgTXlIYW5kbGVyOwogc3RydWN0IFNEUExvYWRlcjsKQEAgLTk2LDcgKzk3LDcgQEAKICAgICBib29sIG1Jc1NEUDsKICAgICBTdGF0ZSBtU3RhdGU7CiAgICAgc3RhdHVzX3QgbUZpbmFsUmVzdWx0OwotICAgIHVpbnQzMl90IG1EaXNjb25uZWN0UmVwbHlJRDsKKyAgICBzcDxBUmVwbHlUb2tlbj4gbURpc2Nvbm5lY3RSZXBseUlEOwogICAgIE11dGV4IG1CdWZmZXJpbmdMb2NrOwogICAgIGJvb2wgbUJ1ZmZlcmluZzsKIApAQCAtMTE1LDYgKzExNiw4IEBACiAgICAgaW50NjRfdCBtRU9TVGltZW91dEF1ZGlvOwogICAgIGludDY0X3QgbUVPU1RpbWVvdXRWaWRlbzsKIAorICAgIHNwPEFSZXBseVRva2VuPiBtU2Vla1JlcGx5SUQ7CisKICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBnZXRTb3VyY2UoYm9vbCBhdWRpbyk7CiAKICAgICB2b2lkIG9uQ29ubmVjdGVkKCk7CkBAIC0xMzAsNiArMTMzLDcgQEAKICAgICB2b2lkIHNldEVycm9yKHN0YXR1c190IGVycik7CiAgICAgdm9pZCBzdGFydEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5KCk7CiAgICAgYm9vbCBzdG9wQnVmZmVyaW5nSWZOZWNlc3NhcnkoKTsKKyAgICB2b2lkIGZpbmlzaFNlZWsoc3RhdHVzX3QgZXJyKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJUU1BTb3VyY2UpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1N0cmVhbWluZ1NvdXJjZS5jcHAKaW5kZXggYjNmMjI0ZC4uMDI0NmI1OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1N0cmVhbWluZ1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1N0cmVhbWluZ1NvdXJjZS5jcHAKQEAgLTYzLDcgKzYzLDcgQEAKIH0KIAogdm9pZCBOdVBsYXllcjo6U3RyZWFtaW5nU291cmNlOjpzdGFydCgpIHsKLSAgICBtU3RyZWFtTGlzdGVuZXIgPSBuZXcgTnVQbGF5ZXJTdHJlYW1MaXN0ZW5lcihtU291cmNlLCAwKTsKKyAgICBtU3RyZWFtTGlzdGVuZXIgPSBuZXcgTnVQbGF5ZXJTdHJlYW1MaXN0ZW5lcihtU291cmNlLCBOVUxMKTsKIAogICAgIHVpbnQzMl90IHNvdXJjZUZsYWdzID0gbVNvdXJjZS0+ZmxhZ3MoKTsKIApAQCAtMTYzLDcgKzE2Myw3IEBACiAgICAgICAgIG1CdWZmZXJpbmcgPSB0cnVlOwogICAgIH0KIAotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZWFkQnVmZmVyLCBpZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVhZEJ1ZmZlciwgdGhpcykpLT5wb3N0KCk7CiAgICAgcmV0dXJuIE9LOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5tayBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYmY3ODIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDI3IEBACisjIEJ1aWxkIHRoZSB1bml0IHRlc3RzLgorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IERybVNlc3Npb25NYW5hZ2VyX3Rlc3QKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKwlEcm1TZXNzaW9uTWFuYWdlcl90ZXN0LmNwcCBcCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYmxvZyBcCisJbGlibWVkaWFwbGF5ZXJzZXJ2aWNlIFwKKwlsaWJ1dGlscyBcCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorCWZyYW1ld29ya3MvYXYvaW5jbHVkZSBcCisJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UgXAorCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvciAtV2FsbAorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQorCitMT0NBTF8zMl9CSVRfT05MWSA6PSB0cnVlCisKK2luY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0RybVNlc3Npb25NYW5hZ2VyX3Rlc3QuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0RybVNlc3Npb25NYW5hZ2VyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMzUwYTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvRHJtU2Vzc2lvbk1hbmFnZXJfdGVzdC5jcHAKQEAgLTAsMCArMSwyNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkRybVNlc3Npb25NYW5hZ2VyX3Rlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAiRHJtLmgiCisjaW5jbHVkZSAiRHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZS5oIgorI2luY2x1ZGUgIkRybVNlc3Npb25NYW5hZ2VyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mb0ludGVyZmFjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBGYWtlUHJvY2Vzc0luZm8gOiBwdWJsaWMgUHJvY2Vzc0luZm9JbnRlcmZhY2UgeworICAgIEZha2VQcm9jZXNzSW5mbygpIHt9CisgICAgdmlydHVhbCB+RmFrZVByb2Nlc3NJbmZvKCkge30KKworICAgIHZpcnR1YWwgYm9vbCBnZXRQcmlvcml0eShpbnQgcGlkLCBpbnQqIHByaW9yaXR5KSB7CisgICAgICAgIC8vIEZvciB0ZXN0aW5nLCB1c2UgcGlkIGFzIHByaW9yaXR5LgorICAgICAgICAvLyBMb3dlciB0aGUgdmFsdWUgaGlnaGVyIHRoZSBwcmlvcml0eS4KKyAgICAgICAgKnByaW9yaXR5ID0gcGlkOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRmFrZVByb2Nlc3NJbmZvKTsKK307CisKK3N0cnVjdCBGYWtlRHJtIDogcHVibGljIERybVNlc3Npb25DbGllbnRJbnRlcmZhY2UgeworICAgIEZha2VEcm0oKSB7fQorICAgIHZpcnR1YWwgfkZha2VEcm0oKSB7fQorCisgICAgdmlydHVhbCBib29sIHJlY2xhaW1TZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgICAgIG1SZWNsYWltZWRTZXNzaW9ucy5wdXNoX2JhY2soc2Vzc2lvbklkKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgY29uc3QgVmVjdG9yPFZlY3Rvcjx1aW50OF90PiA+JiByZWNsYWltZWRTZXNzaW9ucygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1SZWNsYWltZWRTZXNzaW9uczsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgVmVjdG9yPFZlY3Rvcjx1aW50OF90PiA+IG1SZWNsYWltZWRTZXNzaW9uczsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZha2VEcm0pOworfTsKKworc3RhdGljIGNvbnN0IGludCBrVGVzdFBpZDEgPSAzMDsKK3N0YXRpYyBjb25zdCBpbnQga1Rlc3RQaWQyID0gMjA7CitzdGF0aWMgY29uc3QgdWludDhfdCBrVGVzdFNlc3Npb25JZDFbXSA9IHsxLCAyLCAzfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtUZXN0U2Vzc2lvbklkMltdID0gezQsIDUsIDYsIDcsIDh9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1Rlc3RTZXNzaW9uSWQzW10gPSB7OSwgMH07CisKK2NsYXNzIERybVNlc3Npb25NYW5hZ2VyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIERybVNlc3Npb25NYW5hZ2VyVGVzdCgpCisgICAgICAgIDogbURybVNlc3Npb25NYW5hZ2VyKG5ldyBEcm1TZXNzaW9uTWFuYWdlcihuZXcgRmFrZVByb2Nlc3NJbmZvKCkpKSwKKyAgICAgICAgICBtVGVzdERybTEobmV3IEZha2VEcm0oKSksCisgICAgICAgICAgbVRlc3REcm0yKG5ldyBGYWtlRHJtKCkpIHsKKyAgICAgICAgR2V0U2Vzc2lvbklkKGtUZXN0U2Vzc2lvbklkMSwgQVJSQVlfU0laRShrVGVzdFNlc3Npb25JZDEpLCAmbVNlc3Npb25JZDEpOworICAgICAgICBHZXRTZXNzaW9uSWQoa1Rlc3RTZXNzaW9uSWQyLCBBUlJBWV9TSVpFKGtUZXN0U2Vzc2lvbklkMiksICZtU2Vzc2lvbklkMik7CisgICAgICAgIEdldFNlc3Npb25JZChrVGVzdFNlc3Npb25JZDMsIEFSUkFZX1NJWkUoa1Rlc3RTZXNzaW9uSWQzKSwgJm1TZXNzaW9uSWQzKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBzdGF0aWMgdm9pZCBHZXRTZXNzaW9uSWQoY29uc3QgdWludDhfdCogaWRzLCBzaXplX3QgbnVtLCBWZWN0b3I8dWludDhfdD4qIHNlc3Npb25JZCkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bTsgKytpKSB7CisgICAgICAgICAgICBzZXNzaW9uSWQtPnB1c2hfYmFjayhpZHNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgRXhwZWN0RXFTZXNzaW9uSW5mbyhjb25zdCBTZXNzaW9uSW5mbyYgaW5mbywgc3A8RHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZT4gZHJtLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsIGludDY0X3QgdGltZVN0YW1wKSB7CisgICAgICAgIEVYUEVDVF9FUShkcm0sIGluZm8uZHJtKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaXNFcXVhbFNlc3Npb25JZChzZXNzaW9uSWQsIGluZm8uc2Vzc2lvbklkKSk7CisgICAgICAgIEVYUEVDVF9FUSh0aW1lU3RhbXAsIGluZm8udGltZVN0YW1wKTsKKyAgICB9CisKKyAgICB2b2lkIGFkZFNlc3Npb24oKSB7CisgICAgICAgIG1Ecm1TZXNzaW9uTWFuYWdlci0+YWRkU2Vzc2lvbihrVGVzdFBpZDEsIG1UZXN0RHJtMSwgbVNlc3Npb25JZDEpOworICAgICAgICBtRHJtU2Vzc2lvbk1hbmFnZXItPmFkZFNlc3Npb24oa1Rlc3RQaWQyLCBtVGVzdERybTIsIG1TZXNzaW9uSWQyKTsKKyAgICAgICAgbURybVNlc3Npb25NYW5hZ2VyLT5hZGRTZXNzaW9uKGtUZXN0UGlkMiwgbVRlc3REcm0yLCBtU2Vzc2lvbklkMyk7CisgICAgICAgIGNvbnN0IFBpZFNlc3Npb25JbmZvc01hcCYgbWFwID0gc2Vzc2lvbk1hcCgpOworICAgICAgICBFWFBFQ1RfRVEoMnUsIG1hcC5zaXplKCkpOworICAgICAgICBzc2l6ZV90IGluZGV4MSA9IG1hcC5pbmRleE9mS2V5KGtUZXN0UGlkMSk7CisgICAgICAgIEFTU0VSVF9HRShpbmRleDEsIDApOworICAgICAgICBjb25zdCBTZXNzaW9uSW5mb3MmIGluZm9zMSA9IG1hcFtpbmRleDFdOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGluZm9zMS5zaXplKCkpOworICAgICAgICBFeHBlY3RFcVNlc3Npb25JbmZvKGluZm9zMVswXSwgbVRlc3REcm0xLCBtU2Vzc2lvbklkMSwgMCk7CisKKyAgICAgICAgc3NpemVfdCBpbmRleDIgPSBtYXAuaW5kZXhPZktleShrVGVzdFBpZDIpOworICAgICAgICBBU1NFUlRfR0UoaW5kZXgyLCAwKTsKKyAgICAgICAgY29uc3QgU2Vzc2lvbkluZm9zJiBpbmZvczIgPSBtYXBbaW5kZXgyXTsKKyAgICAgICAgRVhQRUNUX0VRKDJ1LCBpbmZvczIuc2l6ZSgpKTsKKyAgICAgICAgRXhwZWN0RXFTZXNzaW9uSW5mbyhpbmZvczJbMF0sIG1UZXN0RHJtMiwgbVNlc3Npb25JZDIsIDEpOworICAgICAgICBFeHBlY3RFcVNlc3Npb25JbmZvKGluZm9zMlsxXSwgbVRlc3REcm0yLCBtU2Vzc2lvbklkMywgMik7CisgICAgfQorCisgICAgY29uc3QgUGlkU2Vzc2lvbkluZm9zTWFwJiBzZXNzaW9uTWFwKCkgeworICAgICAgICByZXR1cm4gbURybVNlc3Npb25NYW5hZ2VyLT5tU2Vzc2lvbk1hcDsKKyAgICB9CisKKyAgICB2b2lkIHRlc3RHZXRMb3dlc3RQcmlvcml0eSgpIHsKKyAgICAgICAgaW50IHBpZDsKKyAgICAgICAgaW50IHByaW9yaXR5OworICAgICAgICBFWFBFQ1RfRkFMU0UobURybVNlc3Npb25NYW5hZ2VyLT5nZXRMb3dlc3RQcmlvcml0eV9sKCZwaWQsICZwcmlvcml0eSkpOworCisgICAgICAgIGFkZFNlc3Npb24oKTsKKyAgICAgICAgRVhQRUNUX1RSVUUobURybVNlc3Npb25NYW5hZ2VyLT5nZXRMb3dlc3RQcmlvcml0eV9sKCZwaWQsICZwcmlvcml0eSkpOworCisgICAgICAgIEVYUEVDVF9FUShrVGVzdFBpZDEsIHBpZCk7CisgICAgICAgIEZha2VQcm9jZXNzSW5mbyBwcm9jZXNzSW5mbzsKKyAgICAgICAgaW50IHByaW9yaXR5MTsKKyAgICAgICAgcHJvY2Vzc0luZm8uZ2V0UHJpb3JpdHkoa1Rlc3RQaWQxLCAmcHJpb3JpdHkxKTsKKyAgICAgICAgRVhQRUNUX0VRKHByaW9yaXR5MSwgcHJpb3JpdHkpOworICAgIH0KKworICAgIHZvaWQgdGVzdEdldExlYXN0VXNlZFNlc3Npb24oKSB7CisgICAgICAgIHNwPERybVNlc3Npb25DbGllbnRJbnRlcmZhY2U+IGRybTsKKyAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZDsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG1Ecm1TZXNzaW9uTWFuYWdlci0+Z2V0TGVhc3RVc2VkU2Vzc2lvbl9sKGtUZXN0UGlkMSwgJmRybSwgJnNlc3Npb25JZCkpOworCisgICAgICAgIGFkZFNlc3Npb24oKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShtRHJtU2Vzc2lvbk1hbmFnZXItPmdldExlYXN0VXNlZFNlc3Npb25fbChrVGVzdFBpZDEsICZkcm0sICZzZXNzaW9uSWQpKTsKKyAgICAgICAgRVhQRUNUX0VRKG1UZXN0RHJtMSwgZHJtKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaXNFcXVhbFNlc3Npb25JZChtU2Vzc2lvbklkMSwgc2Vzc2lvbklkKSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUobURybVNlc3Npb25NYW5hZ2VyLT5nZXRMZWFzdFVzZWRTZXNzaW9uX2woa1Rlc3RQaWQyLCAmZHJtLCAmc2Vzc2lvbklkKSk7CisgICAgICAgIEVYUEVDVF9FUShtVGVzdERybTIsIGRybSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGlzRXF1YWxTZXNzaW9uSWQobVNlc3Npb25JZDIsIHNlc3Npb25JZCkpOworCisgICAgICAgIC8vIG1TZXNzaW9uSWQyIGlzIG5vIGxvbmdlciB0aGUgbGVhc3QgdXNlZCBzZXNzaW9uLgorICAgICAgICBtRHJtU2Vzc2lvbk1hbmFnZXItPnVzZVNlc3Npb24obVNlc3Npb25JZDIpOworICAgICAgICBFWFBFQ1RfVFJVRShtRHJtU2Vzc2lvbk1hbmFnZXItPmdldExlYXN0VXNlZFNlc3Npb25fbChrVGVzdFBpZDIsICZkcm0sICZzZXNzaW9uSWQpKTsKKyAgICAgICAgRVhQRUNUX0VRKG1UZXN0RHJtMiwgZHJtKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaXNFcXVhbFNlc3Npb25JZChtU2Vzc2lvbklkMywgc2Vzc2lvbklkKSk7CisgICAgfQorCisgICAgc3A8RHJtU2Vzc2lvbk1hbmFnZXI+IG1Ecm1TZXNzaW9uTWFuYWdlcjsKKyAgICBzcDxGYWtlRHJtPiBtVGVzdERybTE7CisgICAgc3A8RmFrZURybT4gbVRlc3REcm0yOworICAgIFZlY3Rvcjx1aW50OF90PiBtU2Vzc2lvbklkMTsKKyAgICBWZWN0b3I8dWludDhfdD4gbVNlc3Npb25JZDI7CisgICAgVmVjdG9yPHVpbnQ4X3Q+IG1TZXNzaW9uSWQzOworfTsKKworVEVTVF9GKERybVNlc3Npb25NYW5hZ2VyVGVzdCwgYWRkU2Vzc2lvbikgeworICAgIGFkZFNlc3Npb24oKTsKK30KKworVEVTVF9GKERybVNlc3Npb25NYW5hZ2VyVGVzdCwgdXNlU2Vzc2lvbikgeworICAgIGFkZFNlc3Npb24oKTsKKworICAgIG1Ecm1TZXNzaW9uTWFuYWdlci0+dXNlU2Vzc2lvbihtU2Vzc2lvbklkMSk7CisgICAgbURybVNlc3Npb25NYW5hZ2VyLT51c2VTZXNzaW9uKG1TZXNzaW9uSWQzKTsKKworICAgIGNvbnN0IFBpZFNlc3Npb25JbmZvc01hcCYgbWFwID0gc2Vzc2lvbk1hcCgpOworICAgIGNvbnN0IFNlc3Npb25JbmZvcyYgaW5mb3MxID0gbWFwLnZhbHVlRm9yKGtUZXN0UGlkMSk7CisgICAgY29uc3QgU2Vzc2lvbkluZm9zJiBpbmZvczIgPSBtYXAudmFsdWVGb3Ioa1Rlc3RQaWQyKTsKKyAgICBFeHBlY3RFcVNlc3Npb25JbmZvKGluZm9zMVswXSwgbVRlc3REcm0xLCBtU2Vzc2lvbklkMSwgMyk7CisgICAgRXhwZWN0RXFTZXNzaW9uSW5mbyhpbmZvczJbMV0sIG1UZXN0RHJtMiwgbVNlc3Npb25JZDMsIDQpOworfQorCitURVNUX0YoRHJtU2Vzc2lvbk1hbmFnZXJUZXN0LCByZW1vdmVTZXNzaW9uKSB7CisgICAgYWRkU2Vzc2lvbigpOworCisgICAgbURybVNlc3Npb25NYW5hZ2VyLT5yZW1vdmVTZXNzaW9uKG1TZXNzaW9uSWQyKTsKKworICAgIGNvbnN0IFBpZFNlc3Npb25JbmZvc01hcCYgbWFwID0gc2Vzc2lvbk1hcCgpOworICAgIEVYUEVDVF9FUSgydSwgbWFwLnNpemUoKSk7CisgICAgY29uc3QgU2Vzc2lvbkluZm9zJiBpbmZvczEgPSBtYXAudmFsdWVGb3Ioa1Rlc3RQaWQxKTsKKyAgICBjb25zdCBTZXNzaW9uSW5mb3MmIGluZm9zMiA9IG1hcC52YWx1ZUZvcihrVGVzdFBpZDIpOworICAgIEVYUEVDVF9FUSgxdSwgaW5mb3MxLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKDF1LCBpbmZvczIuc2l6ZSgpKTsKKyAgICAvLyBtU2Vzc2lvbklkMiBoYXMgYmVlbiByZW1vdmVkLgorICAgIEV4cGVjdEVxU2Vzc2lvbkluZm8oaW5mb3MyWzBdLCBtVGVzdERybTIsIG1TZXNzaW9uSWQzLCAyKTsKK30KKworVEVTVF9GKERybVNlc3Npb25NYW5hZ2VyVGVzdCwgcmVtb3ZlRHJtKSB7CisgICAgYWRkU2Vzc2lvbigpOworCisgICAgc3A8RmFrZURybT4gZHJtID0gbmV3IEZha2VEcm07CisgICAgY29uc3QgdWludDhfdCBpZHNbXSA9IHsxMjN9OworICAgIFZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQ7CisgICAgR2V0U2Vzc2lvbklkKGlkcywgQVJSQVlfU0laRShpZHMpLCAmc2Vzc2lvbklkKTsKKyAgICBtRHJtU2Vzc2lvbk1hbmFnZXItPmFkZFNlc3Npb24oa1Rlc3RQaWQyLCBkcm0sIHNlc3Npb25JZCk7CisKKyAgICBtRHJtU2Vzc2lvbk1hbmFnZXItPnJlbW92ZURybShtVGVzdERybTIpOworCisgICAgY29uc3QgUGlkU2Vzc2lvbkluZm9zTWFwJiBtYXAgPSBzZXNzaW9uTWFwKCk7CisgICAgY29uc3QgU2Vzc2lvbkluZm9zJiBpbmZvczIgPSBtYXAudmFsdWVGb3Ioa1Rlc3RQaWQyKTsKKyAgICBFWFBFQ1RfRVEoMXUsIGluZm9zMi5zaXplKCkpOworICAgIC8vIG1UZXN0RHJtMiBoYXMgYmVlbiByZW1vdmVkLgorICAgIEV4cGVjdEVxU2Vzc2lvbkluZm8oaW5mb3MyWzBdLCBkcm0sIHNlc3Npb25JZCwgMyk7Cit9CisKK1RFU1RfRihEcm1TZXNzaW9uTWFuYWdlclRlc3QsIHJlY2xhaW1TZXNzaW9uKSB7CisgICAgRVhQRUNUX0ZBTFNFKG1Ecm1TZXNzaW9uTWFuYWdlci0+cmVjbGFpbVNlc3Npb24oa1Rlc3RQaWQxKSk7CisgICAgYWRkU2Vzc2lvbigpOworCisgICAgLy8gY2FsbGluZyBwaWQgcHJpb3JpdHkgaXMgdG9vIGxvdworICAgIEVYUEVDVF9GQUxTRShtRHJtU2Vzc2lvbk1hbmFnZXItPnJlY2xhaW1TZXNzaW9uKDUwKSk7CisKKyAgICBFWFBFQ1RfVFJVRShtRHJtU2Vzc2lvbk1hbmFnZXItPnJlY2xhaW1TZXNzaW9uKDEwKSk7CisgICAgRVhQRUNUX0VRKDF1LCBtVGVzdERybTEtPnJlY2xhaW1lZFNlc3Npb25zKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShpc0VxdWFsU2Vzc2lvbklkKG1TZXNzaW9uSWQxLCBtVGVzdERybTEtPnJlY2xhaW1lZFNlc3Npb25zKClbMF0pKTsKKworICAgIG1Ecm1TZXNzaW9uTWFuYWdlci0+cmVtb3ZlU2Vzc2lvbihtU2Vzc2lvbklkMSk7CisKKyAgICAvLyBhZGQgYSBzZXNzaW9uIGZyb20gYSBoaWdoZXIgcHJpb3JpdHkgcHJvY2Vzcy4KKyAgICBzcDxGYWtlRHJtPiBkcm0gPSBuZXcgRmFrZURybTsKKyAgICBjb25zdCB1aW50OF90IGlkc1tdID0gezEsIDMsIDV9OworICAgIFZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQ7CisgICAgR2V0U2Vzc2lvbklkKGlkcywgQVJSQVlfU0laRShpZHMpLCAmc2Vzc2lvbklkKTsKKyAgICBtRHJtU2Vzc2lvbk1hbmFnZXItPmFkZFNlc3Npb24oMTUsIGRybSwgc2Vzc2lvbklkKTsKKworICAgIEVYUEVDVF9UUlVFKG1Ecm1TZXNzaW9uTWFuYWdlci0+cmVjbGFpbVNlc3Npb24oMTgpKTsKKyAgICBFWFBFQ1RfRVEoMXUsIG1UZXN0RHJtMi0+cmVjbGFpbWVkU2Vzc2lvbnMoKS5zaXplKCkpOworICAgIC8vIG1TZXNzaW9uSWQyIGlzIHJlY2xhaW1lZC4KKyAgICBFWFBFQ1RfVFJVRShpc0VxdWFsU2Vzc2lvbklkKG1TZXNzaW9uSWQyLCBtVGVzdERybTItPnJlY2xhaW1lZFNlc3Npb25zKClbMF0pKTsKK30KKworVEVTVF9GKERybVNlc3Npb25NYW5hZ2VyVGVzdCwgZ2V0TG93ZXN0UHJpb3JpdHkpIHsKKyAgICB0ZXN0R2V0TG93ZXN0UHJpb3JpdHkoKTsKK30KKworVEVTVF9GKERybVNlc3Npb25NYW5hZ2VyVGVzdCwgZ2V0TGVhc3RVc2VkU2Vzc2lvbl9sKSB7CisgICAgdGVzdEdldExlYXN0VXNlZFNlc3Npb24oKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vQW5kcm9pZC5tayBiL21lZGlhL2xpYm5iYWlvL0FuZHJvaWQubWsKaW5kZXggOTcwN2M0YS4uMTM1M2YyOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJuYmFpby9BbmRyb2lkLm1rCkBAIC0xMSw3ICsxMSw2IEBACiAgICAgTW9ub1BpcGVSZWFkZXIuY3BwICAgICAgICAgICAgICBcCiAgICAgUGlwZS5jcHAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgUGlwZVJlYWRlci5jcHAgICAgICAgICAgICAgICAgICBcCi0gICAgcm91bmR1cC5jICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5jcHAKIAogTE9DQUxfU1JDX0ZJTEVTICs9IE5CTG9nLmNwcApAQCAtMjcsMTIgKzI2LDEzIEBACiBMT0NBTF9NT0RVTEUgOj0gbGlibmJhaW8KIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW91dGlscyBcCiAgICAgbGliYmluZGVyIFwKICAgICBsaWJjb21tb25fdGltZV9jbGllbnQgXAogICAgIGxpYmN1dGlscyBcCiAgICAgbGlidXRpbHMgXAogICAgIGxpYmxvZwogCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYmluc3RhbnRzc3EKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9Nb25vUGlwZS5jcHAgYi9tZWRpYS9saWJuYmFpby9Nb25vUGlwZS5jcHAKaW5kZXggMGI2NTg2MS4uMTI5ZTllZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vTW9ub1BpcGUuY3BwCisrKyBiL21lZGlhL2xpYm5iYWlvL01vbm9QaXBlLmNwcApAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL01vbm9QaXBlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJhaW8vcm91bmR1cC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3JvdW5kdXAuaD4KIAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9Nb25vUGlwZVJlYWRlci5jcHAgYi9tZWRpYS9saWJuYmFpby9Nb25vUGlwZVJlYWRlci5jcHAKaW5kZXggZGU4MjIyOS4uZTRkM2VkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vTW9ub1BpcGVSZWFkZXIuY3BwCisrKyBiL21lZGlhL2xpYm5iYWlvL01vbm9QaXBlUmVhZGVyLmNwcApAQCAtMzksNyArMzksNyBAQAogICAgICAgICByZXR1cm4gTkVHT1RJQVRFOwogICAgIH0KICAgICBzc2l6ZV90IHJldCA9IGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmbVBpcGUtPm1SZWFyKSAtIG1QaXBlLT5tRnJvbnQ7Ci0gICAgQUxPR19BU1NFUlQoKDAgPD0gcmV0KSAmJiAocmV0IDw9IG1NYXhGcmFtZXMpKTsKKyAgICBBTE9HX0FTU0VSVCgoMCA8PSByZXQpICYmICgoc2l6ZV90KSByZXQgPD0gbVBpcGUtPm1NYXhGcmFtZXMpKTsKICAgICByZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9QaXBlLmNwcCBiL21lZGlhL2xpYm5iYWlvL1BpcGUuY3BwCmluZGV4IDZlMGVjOGMuLjEzZjIxMWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL1BpcGUuY3BwCisrKyBiL21lZGlhL2xpYm5iYWlvL1BpcGUuY3BwCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUGlwZS5oPgotI2luY2x1ZGUgPG1lZGlhL25iYWlvL3JvdW5kdXAuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9yb3VuZHVwLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vcm91bmR1cC5jIGIvbWVkaWEvbGlibmJhaW8vcm91bmR1cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDU1MmQxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm5iYWlvL3JvdW5kdXAuYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8bWVkaWEvbmJhaW8vcm91bmR1cC5oPgotCi11bnNpZ25lZCByb3VuZHVwKHVuc2lnbmVkIHYpCi17Ci0gICAgLy8gX19idWlsdGluX2NseiBpcyB1bmRlZmluZWQgZm9yIHplcm8gaW5wdXQKLSAgICBpZiAodiA9PSAwKSB7Ci0gICAgICAgIHYgPSAxOwotICAgIH0KLSAgICBpbnQgbHogPSBfX2J1aWx0aW5fY2x6KChpbnQpIHYpOwotICAgIHVuc2lnbmVkIHJvdW5kZWQgPSAoKHVuc2lnbmVkKSAweDgwMDAwMDAwKSA+PiBsejsKLSAgICAvLyAweDgwMDAwMDAwMSBhbmQgaGlnaGVyIGFyZSBhY3R1YWxseSByb3VuZGVkIF9kb3duXyB0byBwcmV2ZW50IG92ZXJmbG93Ci0gICAgaWYgKHYgPiByb3VuZGVkICYmIGx6ID4gMCkgewotICAgICAgICByb3VuZGVkIDw8PSAxOwotICAgIH0KLSAgICByZXR1cm4gcm91bmRlZDsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNFeHRyYWN0b3IuY3BwCmluZGV4IDE5NmY2ZWUuLjQ1ZThhMzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDRXh0cmFjdG9yLmNwcApAQCAtMzYwLDcgKzM2MCw3IEBACiAgICAgICAgIHBvcyArPSBsZW47CiAKICAgICAgICAgQUxPR1YoInNraXBwZWQgSUQzIHRhZywgbmV3IHN0YXJ0aW5nIG9mZnNldCBpcyAlbGxkICgweCUwMTZsbHgpIiwKLSAgICAgICAgICAgICBwb3MsIHBvcyk7CisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylwb3MsIChsb25nIGxvbmcpcG9zKTsKICAgICB9CiAKICAgICB1aW50OF90IGhlYWRlclsyXTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ1dyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNXcml0ZXIuY3BwCmluZGV4IDJlNDFkODAuLjlkOTBkYmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ1dyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcApAQCAtMzYsMzMgKzM2LDE5IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotQUFDV3JpdGVyOjpBQUNXcml0ZXIoY29uc3QgY2hhciAqZmlsZW5hbWUpCi0gICAgOiBtRmQoLTEpLAotICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKSwKLSAgICAgIG1QYXVzZWQoZmFsc2UpLAotICAgICAgbVJlc3VtZWQoZmFsc2UpLAotICAgICAgbUNoYW5uZWxDb3VudCgtMSksCi0gICAgICBtU2FtcGxlUmF0ZSgtMSksCi0gICAgICBtQUFDUHJvZmlsZShPTVhfQVVESU9fQUFDT2JqZWN0TEMpIHsKLQotICAgIEFMT0dWKCJBQUNXcml0ZXIgQ29uc3RydWN0b3IiKTsKLQotICAgIG1GZCA9IG9wZW4oZmlsZW5hbWUsIE9fQ1JFQVQgfCBPX0xBUkdFRklMRSB8IE9fVFJVTkMgfCBPX1JEV1IsIFNfSVJVU1IgfCBTX0lXVVNSKTsKLSAgICBpZiAobUZkID49IDApIHsKLSAgICAgICAgbUluaXRDaGVjayA9IE9LOwotICAgIH0KLX0KLQogQUFDV3JpdGVyOjpBQUNXcml0ZXIoaW50IGZkKQogICAgIDogbUZkKGR1cChmZCkpLAogICAgICAgbUluaXRDaGVjayhtRmQgPCAwPyBOT19JTklUOiBPSyksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCiAgICAgICBtUGF1c2VkKGZhbHNlKSwKICAgICAgIG1SZXN1bWVkKGZhbHNlKSwKKyAgICAgIG1UaHJlYWQoMCksCisgICAgICBtRXN0aW1hdGVkU2l6ZUJ5dGVzKDApLAorICAgICAgbUVzdGltYXRlZER1cmF0aW9uVXMoMCksCiAgICAgICBtQ2hhbm5lbENvdW50KC0xKSwKICAgICAgIG1TYW1wbGVSYXRlKC0xKSwKLSAgICAgIG1BQUNQcm9maWxlKE9NWF9BVURJT19BQUNPYmplY3RMQykgeworICAgICAgbUFBQ1Byb2ZpbGUoT01YX0FVRElPX0FBQ09iamVjdExDKSwKKyAgICAgIG1GcmFtZUR1cmF0aW9uVXMoMCkgewogfQogCiBBQUNXcml0ZXI6On5BQUNXcml0ZXIoKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAppbmRleCA2ZDliNDEyLi42Mzk5Yjc5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKQEAgLTI0LDYgKzI0LDggQEAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CkBAIC0zNSwxOCArMzcsMjAgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQnVmZmVyUHJvZHVjZXJXcmFwcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTmF0aXZlV2luZG93V3JhcHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+Ci0KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9QZXJzaXN0ZW50U3VyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CiAKICNpbmNsdWRlIDxPTVhfQXVkaW9FeHQuaD4KICNpbmNsdWRlIDxPTVhfVmlkZW9FeHQuaD4KICNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CisjaW5jbHVkZSA8T01YX0FzU3RyaW5nLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgogCkBAIC0xMDMsNiArMTA3LDE4IEBACiAgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5TdGVwID0gMDsKIH0KIAorc3RydWN0IE1lc3NhZ2VMaXN0IDogcHVibGljIFJlZkJhc2UgeworICAgIE1lc3NhZ2VMaXN0KCkgeworICAgIH0KKyAgICB2aXJ0dWFsIH5NZXNzYWdlTGlzdCgpIHsKKyAgICB9CisgICAgc3RkOjpsaXN0PHNwPEFNZXNzYWdlPiA+ICZnZXRMaXN0KCkgeyByZXR1cm4gbUxpc3Q7IH0KK3ByaXZhdGU6CisgICAgc3RkOjpsaXN0PHNwPEFNZXNzYWdlPiA+IG1MaXN0OworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVzc2FnZUxpc3QpOworfTsKKwogc3RydWN0IENvZGVjT2JzZXJ2ZXIgOiBwdWJsaWMgQm5PTVhPYnNlcnZlciB7CiAgICAgQ29kZWNPYnNlcnZlcigpIHt9CiAKQEAgLTExMSw1MiArMTI3LDc4IEBACiAgICAgfQogCiAgICAgLy8gZnJvbSBJT01YT2JzZXJ2ZXIKLSAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlKGNvbnN0IG9teF9tZXNzYWdlICZvbXhfbXNnKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKLQotICAgICAgICBtc2ctPnNldEludDMyKCJ0eXBlIiwgb214X21zZy50eXBlKTsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigibm9kZSIsIG9teF9tc2cubm9kZSk7Ci0KLSAgICAgICAgc3dpdGNoIChvbXhfbXNnLnR5cGUpIHsKLSAgICAgICAgICAgIGNhc2Ugb214X21lc3NhZ2U6OkVWRU5UOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImV2ZW50Iiwgb214X21zZy51LmV2ZW50X2RhdGEuZXZlbnQpOwotICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImRhdGExIiwgb214X21zZy51LmV2ZW50X2RhdGEuZGF0YTEpOwotICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImRhdGEyIiwgb214X21zZy51LmV2ZW50X2RhdGEuZGF0YTIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIG9teF9tZXNzYWdlOjpFTVBUWV9CVUZGRVJfRE9ORToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJidWZmZXIiLCBvbXhfbXNnLnUuYnVmZmVyX2RhdGEuYnVmZmVyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBvbXhfbWVzc2FnZTo6RklMTF9CVUZGRVJfRE9ORToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKAotICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciIsIG9teF9tc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5idWZmZXIpOwotICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAicmFuZ2Vfb2Zmc2V0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9teF9tc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5yYW5nZV9vZmZzZXQpOwotICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAicmFuZ2VfbGVuZ3RoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9teF9tc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5yYW5nZV9sZW5ndGgpOwotICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAiZmxhZ3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgb214X21zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmZsYWdzKTsKLSAgICAgICAgICAgICAgICBtc2ctPnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVzdGFtcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBvbXhfbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEudGltZXN0YW1wKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBUUkVTUEFTUygpOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VzKGNvbnN0IHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT4gJm1lc3NhZ2VzKSB7CisgICAgICAgIGlmIChtZXNzYWdlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgc3A8TWVzc2FnZUxpc3Q+IG1zZ0xpc3QgPSBuZXcgTWVzc2FnZUxpc3QoKTsKKyAgICAgICAgZm9yIChzdGQ6Omxpc3Q8b214X21lc3NhZ2U+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1lc3NhZ2VzLmNiZWdpbigpOworICAgICAgICAgICAgICBpdCAhPSBtZXNzYWdlcy5jZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGNvbnN0IG9teF9tZXNzYWdlICZvbXhfbXNnID0gKml0OworICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigibm9kZSIsIG9teF9tc2cubm9kZSk7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoInR5cGUiLCBvbXhfbXNnLnR5cGUpOworICAgICAgICAgICAgc3dpdGNoIChvbXhfbXNnLnR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIG9teF9tZXNzYWdlOjpFVkVOVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImV2ZW50Iiwgb214X21zZy51LmV2ZW50X2RhdGEuZXZlbnQpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJkYXRhMSIsIG9teF9tc2cudS5ldmVudF9kYXRhLmRhdGExKTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiZGF0YTIiLCBvbXhfbXNnLnUuZXZlbnRfZGF0YS5kYXRhMik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2Ugb214X21lc3NhZ2U6OkVNUFRZX0JVRkZFUl9ET05FOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiYnVmZmVyIiwgb214X21zZy51LmJ1ZmZlcl9kYXRhLmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImZlbmNlX2ZkIiwgb214X21zZy5mZW5jZUZkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBvbXhfbWVzc2FnZTo6RklMTF9CVUZGRVJfRE9ORToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciIsIG9teF9tc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5idWZmZXIpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyYW5nZV9vZmZzZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9teF9tc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5yYW5nZV9vZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyYW5nZV9sZW5ndGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9teF9tc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5yYW5nZV9sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbGFncyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb214X21zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZXN0YW1wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXhfbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEudGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVuY2VfZmQiLCBvbXhfbXNnLmZlbmNlRmQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIG9teF9tZXNzYWdlOjpGUkFNRV9SRU5ERVJFRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lZGlhX3RpbWVfdXMiLCBvbXhfbXNnLnUucmVuZGVyX2RhdGEudGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3lzdGVtX25hbm8iLCBvbXhfbXNnLnUucmVuZGVyX2RhdGEubmFub1RpbWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVW5yZWNvZ25pemVkIG1lc3NhZ2UgdHlwZTogJWQiLCBvbXhfbXNnLnR5cGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZ0xpc3QtPmdldExpc3QoKS5wdXNoX2JhY2sobXNnKTsKKyAgICAgICAgfQorICAgICAgICBub3RpZnktPnNldE9iamVjdCgibWVzc2FnZXMiLCBtc2dMaXN0KTsKKyAgICAgICAgbm90aWZ5LT5wb3N0KCk7CiAgICAgfQogCiBwcm90ZWN0ZWQ6CkBAIC0xOTQsMTUgKzIzNiwyNSBAQAogICAgIHZvaWQgcG9zdEZpbGxUaGlzQnVmZmVyKEJ1ZmZlckluZm8gKmluZm8pOwogCiBwcml2YXRlOgorICAgIC8vIEhhbmRsZXMgYW4gT01YIG1lc3NhZ2UuIFJldHVybnMgdHJ1ZSBpZmYgbWVzc2FnZSB3YXMgaGFuZGxlZC4KICAgICBib29sIG9uT01YTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKLSAgICBib29sIG9uT01YRW1wdHlCdWZmZXJEb25lKElPTVg6OmJ1ZmZlcl9pZCBidWZmZXJJRCk7CisgICAgLy8gSGFuZGxlcyBhIGxpc3Qgb2YgbWVzc2FnZXMuIFJldHVybnMgdHJ1ZSBpZmYgbWVzc2FnZXMgd2VyZSBoYW5kbGVkLgorICAgIGJvb2wgb25PTVhNZXNzYWdlTGlzdChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICAvLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgbWVzc2FnZSBpcyBmb3IgdGhpcyBjb21wb25lbnQgYW5kIHRoZSBjb21wb25lbnQgaXMgYWxpdmUKKyAgICBib29sIGNoZWNrT01YTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICBib29sIG9uT01YRW1wdHlCdWZmZXJEb25lKElPTVg6OmJ1ZmZlcl9pZCBidWZmZXJJRCwgaW50IGZlbmNlRmQpOwogCiAgICAgYm9vbCBvbk9NWEZpbGxCdWZmZXJEb25lKAogICAgICAgICAgICAgSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlcklELAogICAgICAgICAgICAgc2l6ZV90IHJhbmdlT2Zmc2V0LCBzaXplX3QgcmFuZ2VMZW5ndGgsCiAgICAgICAgICAgICBPTVhfVTMyIGZsYWdzLAotICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMpOworICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsCisgICAgICAgICAgICBpbnQgZmVuY2VGZCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgb25PTVhGcmFtZVJlbmRlcmVkKGludDY0X3QgbWVkaWFUaW1lVXMsIG5zZWNzX3Qgc3lzdGVtTmFubyk7CiAKICAgICB2b2lkIGdldE1vcmVJbnB1dERhdGFJZlBvc3NpYmxlKCk7CiAKQEAgLTI1OSw5ICszMTEsMTIgQEAKIAogICAgIGJvb2wgb25Db25maWd1cmVDb21wb25lbnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHZvaWQgb25DcmVhdGVJbnB1dFN1cmZhY2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25TZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHZvaWQgb25TdGFydCgpOwogICAgIHZvaWQgb25TaHV0ZG93bihib29sIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQpOwogCisgICAgc3RhdHVzX3Qgc2V0dXBJbnB1dFN1cmZhY2UoKTsKKwogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKExvYWRlZFN0YXRlKTsKIH07CiAKQEAgLTMxNyw2ICszNzIsNyBAQAogICAgIHZpcnR1YWwgdm9pZCBzdGF0ZUVudGVyZWQoKTsKIAogICAgIHZpcnR1YWwgYm9vbCBvbk9NWEV2ZW50KE9NWF9FVkVOVFRZUEUgZXZlbnQsIE9NWF9VMzIgZGF0YTEsIE9NWF9VMzIgZGF0YTIpOworICAgIHZpcnR1YWwgYm9vbCBvbk9NWEZyYW1lUmVuZGVyZWQoaW50NjRfdCBtZWRpYVRpbWVVcywgbnNlY3NfdCBzeXN0ZW1OYW5vKTsKIAogcHJpdmF0ZToKICAgICBib29sIG1BY3RpdmU7CkBAIC0zMzUsNiArMzkxLDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgc3RhdGVFbnRlcmVkKCk7CiAKICAgICB2aXJ0dWFsIGJvb2wgb25PTVhFdmVudChPTVhfRVZFTlRUWVBFIGV2ZW50LCBPTVhfVTMyIGRhdGExLCBPTVhfVTMyIGRhdGEyKTsKKyAgICB2aXJ0dWFsIGJvb2wgb25PTVhGcmFtZVJlbmRlcmVkKGludDY0X3QgbWVkaWFUaW1lVXMsIG5zZWNzX3Qgc3lzdGVtTmFubyk7CiAKIHByaXZhdGU6CiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlZFN0YXRlKTsKQEAgLTQwMSwxMiArNDU4LDQ1IEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKK3ZvaWQgQUNvZGVjOjpCdWZmZXJJbmZvOjpzZXRXcml0ZUZlbmNlKGludCBmZW5jZUZkLCBjb25zdCBjaGFyICpkYmcpIHsKKyAgICBpZiAobUZlbmNlRmQgPj0gMCkgeworICAgICAgICBBTE9HVygiT1ZFUldSSVRFIE9GICVzIGZlbmNlICVkIGJ5IHdyaXRlIGZlbmNlICVkIGluICVzIiwKKyAgICAgICAgICAgICAgICBtSXNSZWFkRmVuY2UgPyAicmVhZCIgOiAid3JpdGUiLCBtRmVuY2VGZCwgZmVuY2VGZCwgZGJnKTsKKyAgICB9CisgICAgbUZlbmNlRmQgPSBmZW5jZUZkOworICAgIG1Jc1JlYWRGZW5jZSA9IGZhbHNlOworfQorCit2b2lkIEFDb2RlYzo6QnVmZmVySW5mbzo6c2V0UmVhZEZlbmNlKGludCBmZW5jZUZkLCBjb25zdCBjaGFyICpkYmcpIHsKKyAgICBpZiAobUZlbmNlRmQgPj0gMCkgeworICAgICAgICBBTE9HVygiT1ZFUldSSVRFIE9GICVzIGZlbmNlICVkIGJ5IHJlYWQgZmVuY2UgJWQgaW4gJXMiLAorICAgICAgICAgICAgICAgIG1Jc1JlYWRGZW5jZSA/ICJyZWFkIiA6ICJ3cml0ZSIsIG1GZW5jZUZkLCBmZW5jZUZkLCBkYmcpOworICAgIH0KKyAgICBtRmVuY2VGZCA9IGZlbmNlRmQ7CisgICAgbUlzUmVhZEZlbmNlID0gdHJ1ZTsKK30KKwordm9pZCBBQ29kZWM6OkJ1ZmZlckluZm86OmNoZWNrV3JpdGVGZW5jZShjb25zdCBjaGFyICpkYmcpIHsKKyAgICBpZiAobUZlbmNlRmQgPj0gMCAmJiBtSXNSZWFkRmVuY2UpIHsKKyAgICAgICAgQUxPR0QoIlJFVVNJTkcgcmVhZCBmZW5jZSAlZCBhcyB3cml0ZSBmZW5jZSBpbiAlcyIsIG1GZW5jZUZkLCBkYmcpOworICAgIH0KK30KKwordm9pZCBBQ29kZWM6OkJ1ZmZlckluZm86OmNoZWNrUmVhZEZlbmNlKGNvbnN0IGNoYXIgKmRiZykgeworICAgIGlmIChtRmVuY2VGZCA+PSAwICYmICFtSXNSZWFkRmVuY2UpIHsKKyAgICAgICAgQUxPR0QoIlJFVVNJTkcgd3JpdGUgZmVuY2UgJWQgYXMgcmVhZCBmZW5jZSBpbiAlcyIsIG1GZW5jZUZkLCBkYmcpOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwogQUNvZGVjOjpBQ29kZWMoKQogICAgIDogbVF1aXJrcygwKSwKICAgICAgIG1Ob2RlKDApLAorICAgICAgbU5hdGl2ZVdpbmRvd1VzYWdlQml0cygwKSwKICAgICAgIG1TZW50Rm9ybWF0KGZhbHNlKSwKKyAgICAgIG1Jc1ZpZGVvKGZhbHNlKSwKICAgICAgIG1Jc0VuY29kZXIoZmFsc2UpLAotICAgICAgbVVzZU1ldGFkYXRhT25FbmNvZGVyT3V0cHV0KGZhbHNlKSwKICAgICAgIG1GYXRhbEVycm9yKGZhbHNlKSwKICAgICAgIG1TaHV0ZG93bkluUHJvZ3Jlc3MoZmFsc2UpLAogICAgICAgbUV4cGxpY2l0U2h1dGRvd24oZmFsc2UpLApAQCAtNDE2LDEwICs1MDYsMTMgQEAKICAgICAgIG1DaGFubmVsTWFza1ByZXNlbnQoZmFsc2UpLAogICAgICAgbUNoYW5uZWxNYXNrKDApLAogICAgICAgbURlcXVldWVDb3VudGVyKDApLAotICAgICAgbVN0b3JlTWV0YURhdGFJbk91dHB1dEJ1ZmZlcnMoZmFsc2UpLAotICAgICAgbU1ldGFEYXRhQnVmZmVyc1RvU3VibWl0KDApLAorICAgICAgbUlucHV0TWV0YWRhdGFUeXBlKGtNZXRhZGF0YUJ1ZmZlclR5cGVJbnZhbGlkKSwKKyAgICAgIG1PdXRwdXRNZXRhZGF0YVR5cGUoa01ldGFkYXRhQnVmZmVyVHlwZUludmFsaWQpLAorICAgICAgbUxlZ2FjeUFkYXB0aXZlRXhwZXJpbWVudChmYWxzZSksCisgICAgICBtTWV0YWRhdGFCdWZmZXJzVG9TdWJtaXQoMCksCiAgICAgICBtUmVwZWF0RnJhbWVEZWxheVVzKC0xbGwpLAogICAgICAgbU1heFB0c0dhcFVzKC0xbGwpLAorICAgICAgbU1heEZwcygtMSksCiAgICAgICBtVGltZVBlckZyYW1lVXMoLTFsbCksCiAgICAgICBtVGltZVBlckNhcHR1cmVVcygtMWxsKSwKICAgICAgIG1DcmVhdGVJbnB1dEJ1ZmZlcnNTdXNwZW5kZWQoZmFsc2UpLApAQCAtNDUyLDYxICs1NDUsODEgQEAKIAogdm9pZCBBQ29kZWM6OmluaXRpYXRlU2V0dXAoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBtc2ctPnNldFdoYXQoa1doYXRTZXR1cCk7Ci0gICAgbXNnLT5zZXRUYXJnZXQoaWQoKSk7CisgICAgbXNnLT5zZXRUYXJnZXQodGhpcyk7CiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKIHZvaWQgQUNvZGVjOjpzaWduYWxTZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldFBhcmFtZXRlcnMsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRQYXJhbWV0ZXJzLCB0aGlzKTsKICAgICBtc2ctPnNldE1lc3NhZ2UoInBhcmFtcyIsIHBhcmFtcyk7CiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKIHZvaWQgQUNvZGVjOjppbml0aWF0ZUFsbG9jYXRlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgbXNnLT5zZXRXaGF0KGtXaGF0QWxsb2NhdGVDb21wb25lbnQpOwotICAgIG1zZy0+c2V0VGFyZ2V0KGlkKCkpOworICAgIG1zZy0+c2V0VGFyZ2V0KHRoaXMpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCiB2b2lkIEFDb2RlYzo6aW5pdGlhdGVDb25maWd1cmVDb21wb25lbnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBtc2ctPnNldFdoYXQoa1doYXRDb25maWd1cmVDb21wb25lbnQpOwotICAgIG1zZy0+c2V0VGFyZ2V0KGlkKCkpOworICAgIG1zZy0+c2V0VGFyZ2V0KHRoaXMpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCitzdGF0dXNfdCBBQ29kZWM6OnNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0U3VyZmFjZSwgdGhpcyk7CisgICAgbXNnLT5zZXRPYmplY3QoInN1cmZhY2UiLCBzdXJmYWNlKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICh2b2lkKXJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCiB2b2lkIEFDb2RlYzo6aW5pdGlhdGVDcmVhdGVJbnB1dFN1cmZhY2UoKSB7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdENyZWF0ZUlucHV0U3VyZmFjZSwgaWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdENyZWF0ZUlucHV0U3VyZmFjZSwgdGhpcykpLT5wb3N0KCk7Cit9CisKK3ZvaWQgQUNvZGVjOjppbml0aWF0ZVNldElucHV0U3VyZmFjZSgKKyAgICAgICAgY29uc3Qgc3A8UGVyc2lzdGVudFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldElucHV0U3VyZmFjZSwgdGhpcyk7CisgICAgbXNnLT5zZXRPYmplY3QoImlucHV0LXN1cmZhY2UiLCBzdXJmYWNlKTsKKyAgICBtc2ctPnBvc3QoKTsKIH0KIAogdm9pZCBBQ29kZWM6OnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSB7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFNpZ25hbEVuZE9mSW5wdXRTdHJlYW0sIGlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTaWduYWxFbmRPZklucHV0U3RyZWFtLCB0aGlzKSktPnBvc3QoKTsKIH0KIAogdm9pZCBBQ29kZWM6OmluaXRpYXRlU3RhcnQoKSB7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCBpZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIHRoaXMpKS0+cG9zdCgpOwogfQogCiB2b2lkIEFDb2RlYzo6c2lnbmFsRmx1c2goKSB7CiAgICAgQUxPR1YoIlslc10gc2lnbmFsRmx1c2giLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0Rmx1c2gsIGlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRGbHVzaCwgdGhpcykpLT5wb3N0KCk7CiB9CiAKIHZvaWQgQUNvZGVjOjpzaWduYWxSZXN1bWUoKSB7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlc3VtZSwgaWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlc3VtZSwgdGhpcykpLT5wb3N0KCk7CiB9CiAKIHZvaWQgQUNvZGVjOjppbml0aWF0ZVNodXRkb3duKGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTaHV0ZG93biwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNodXRkb3duLCB0aGlzKTsKICAgICBtc2ctPnNldEludDMyKCJrZWVwQ29tcG9uZW50QWxsb2NhdGVkIiwga2VlcENvbXBvbmVudEFsbG9jYXRlZCk7CiAgICAgbXNnLT5wb3N0KCk7CiAgICAgaWYgKCFrZWVwQ29tcG9uZW50QWxsb2NhdGVkKSB7CiAgICAgICAgIC8vIGVuc3VyZSBzaHV0ZG93biBjb21wbGV0ZXMgaW4gMyBzZWNvbmRzCi0gICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZWxlYXNlQ29kZWNJbnN0YW5jZSwgaWQoKSkpLT5wb3N0KDMwMDAwMDApOworICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVsZWFzZUNvZGVjSW5zdGFuY2UsIHRoaXMpKS0+cG9zdCgzMDAwMDAwKTsKICAgICB9CiB9CiAKIHZvaWQgQUNvZGVjOjpzaWduYWxSZXF1ZXN0SURSRnJhbWUoKSB7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlcXVlc3RJRFJGcmFtZSwgaWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlcXVlc3RJRFJGcmFtZSwgdGhpcykpLT5wb3N0KCk7CiB9CiAKIC8vICoqKiBOT1RFOiBUSEUgRk9MTE9XSU5HIFdPUktBUk9VTkQgV0lMTCBCRSBSRU1PVkVEICoqKgpAQCAtNTE0LDEzICs2MjcsMTQwIEBACiAvLyBUaGlzIGNhdXNlcyBhIGhhbHQgaWYgd2UgYWxyZWFkeSBzaWduYWxlZCBhbiBFT1Mgb24gdGhlIGlucHV0CiAvLyBwb3J0LiAgRm9yIG5vdyBrZWVwIHN1Ym1pdHRpbmcgYW4gb3V0cHV0IGJ1ZmZlciBpZiB0aGVyZSB3YXMgYW4KIC8vIEVPUyBvbiB0aGUgaW5wdXQgcG9ydCwgYnV0IG5vdCB5ZXQgb24gdGhlIG91dHB1dCBwb3J0Lgotdm9pZCBBQ29kZWM6OnNpZ25hbFN1Ym1pdE91dHB1dE1ldGFEYXRhQnVmZmVySWZFT1Nfd29ya2Fyb3VuZCgpIHsKK3ZvaWQgQUNvZGVjOjpzaWduYWxTdWJtaXRPdXRwdXRNZXRhZGF0YUJ1ZmZlcklmRU9TX3dvcmthcm91bmQoKSB7CiAgICAgaWYgKG1Qb3J0RU9TW2tQb3J0SW5kZXhJbnB1dF0gJiYgIW1Qb3J0RU9TW2tQb3J0SW5kZXhPdXRwdXRdICYmCi0gICAgICAgICAgICBtTWV0YURhdGFCdWZmZXJzVG9TdWJtaXQgPiAwKSB7Ci0gICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdWJtaXRPdXRwdXRNZXRhRGF0YUJ1ZmZlcklmRU9TLCBpZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgIG1NZXRhZGF0YUJ1ZmZlcnNUb1N1Ym1pdCA+IDApIHsKKyAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN1Ym1pdE91dHB1dE1ldGFkYXRhQnVmZmVySWZFT1MsIHRoaXMpKS0+cG9zdCgpOwogICAgIH0KIH0KIAorc3RhdHVzX3QgQUNvZGVjOjpoYW5kbGVTZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgLy8gYWxsb3cga2VlcGluZyB1bnNldCBzdXJmYWNlCisgICAgaWYgKHN1cmZhY2UgPT0gTlVMTCkgeworICAgICAgICBpZiAobU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HVygiY2Fubm90IHVuc2V0IGEgc3VyZmFjZSIpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICAvLyBjYW5ub3Qgc3dpdGNoIGZyb20gYnl0ZWJ1ZmZlcnMgdG8gc3VyZmFjZQorICAgIGlmIChtTmF0aXZlV2luZG93ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coImNvbXBvbmVudCB3YXMgbm90IGNvbmZpZ3VyZWQgd2l0aCBhIHN1cmZhY2UiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIEFOYXRpdmVXaW5kb3cgKm5hdGl2ZVdpbmRvdyA9IHN1cmZhY2UuZ2V0KCk7CisgICAgLy8gaWYgd2UgaGF2ZSBub3QgeWV0IHN0YXJ0ZWQgdGhlIGNvZGVjLCB3ZSBjYW4gc2ltcGx5IHNldCB0aGUgbmF0aXZlIHdpbmRvdworICAgIGlmIChtQnVmZmVyc1trUG9ydEluZGV4SW5wdXRdLnNpemUoKSA9PSAwKSB7CisgICAgICAgIG1OYXRpdmVXaW5kb3cgPSBzdXJmYWNlOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgLy8gd2UgZG8gbm90IHN1cHBvcnQgY2hhbmdpbmcgYSB0dW5uZWxlZCBzdXJmYWNlIGFmdGVyIHN0YXJ0CisgICAgaWYgKG1UdW5uZWxlZCkgeworICAgICAgICBBTE9HVygiY2Fubm90IGNoYW5nZSB0dW5uZWxlZCBzdXJmYWNlIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpbnQgdXNhZ2VCaXRzID0gMDsKKyAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cE5hdGl2ZVdpbmRvd1NpemVGb3JtYXRBbmRVc2FnZShuYXRpdmVXaW5kb3csICZ1c2FnZUJpdHMpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQgaWdub3JlZEZsYWdzID0ga1ZpZGVvR3JhbGxvY1VzYWdlOworICAgIC8vIE5ldyBvdXRwdXQgc3VyZmFjZSBpcyBub3QgYWxsb3dlZCB0byBhZGQgbmV3IHVzYWdlIGZsYWcgZXhjZXB0IGlnbm9yZWQgb25lcy4KKyAgICBpZiAoKHVzYWdlQml0cyAmIH4obU5hdGl2ZVdpbmRvd1VzYWdlQml0cyB8IGlnbm9yZWRGbGFncykpICE9IDApIHsKKyAgICAgICAgQUxPR1coImNhbm5vdCBjaGFuZ2UgdXNhZ2UgZnJvbSAlI3ggdG8gJSN4IiwgbU5hdGl2ZVdpbmRvd1VzYWdlQml0cywgdXNhZ2VCaXRzKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBnZXQgbWluIHVuZGVxdWV1ZWQgY291bnQuIFdlIGNhbm5vdCBzd2l0Y2ggdG8gYSBzdXJmYWNlIHRoYXQgaGFzIGEgaGlnaGVyCisgICAgLy8gdW5kZXF1ZXVlZCBjb3VudCB0aGFuIHdlIGFsbG9jYXRlZC4KKyAgICBpbnQgbWluVW5kZXF1ZXVlZEJ1ZmZlcnMgPSAwOworICAgIGVyciA9IG5hdGl2ZVdpbmRvdy0+cXVlcnkoCisgICAgICAgICAgICBuYXRpdmVXaW5kb3csIE5BVElWRV9XSU5ET1dfTUlOX1VOREVRVUVVRURfQlVGRkVSUywKKyAgICAgICAgICAgICZtaW5VbmRlcXVldWVkQnVmZmVycyk7CisgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMgcXVlcnkgZmFpbGVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGlmIChtaW5VbmRlcXVldWVkQnVmZmVycyA+IChpbnQpbU51bVVuZGVxdWV1ZWRCdWZmZXJzKSB7CisgICAgICAgIEFMT0dFKCJuZXcgc3VyZmFjZSBob2xkcyBvbnRvIG1vcmUgYnVmZmVycyAoJWQpIHRoYW4gcGxhbm5lZCBmb3IgKCV6dSkiLAorICAgICAgICAgICAgICAgIG1pblVuZGVxdWV1ZWRCdWZmZXJzLCBtTnVtVW5kZXF1ZXVlZEJ1ZmZlcnMpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIHdlIGNhbm5vdCBjaGFuZ2UgdGhlIG51bWJlciBvZiBvdXRwdXQgYnVmZmVycyB3aGlsZSBPTVggaXMgcnVubmluZworICAgIC8vIHNldCB1cCBzdXJmYWNlIHRvIHRoZSBzYW1lIGNvdW50CisgICAgVmVjdG9yPEJ1ZmZlckluZm8+ICZidWZmZXJzID0gbUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF07CisgICAgQUxPR1YoInNldHRpbmcgdXAgc3VyZmFjZSBmb3IgJXp1IGJ1ZmZlcnMiLCBidWZmZXJzLnNpemUoKSk7CisKKyAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQobmF0aXZlV2luZG93LCBidWZmZXJzLnNpemUoKSk7CisgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQgZmFpbGVkOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksCisgICAgICAgICAgICAgICAgLWVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgLy8gbmVlZCB0byBlbmFibGUgYWxsb2NhdGlvbiB3aGVuIGF0dGFjaGluZworICAgIHN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKS0+YWxsb3dBbGxvY2F0aW9uKHRydWUpOworCisgICAgLy8gZm9yIG1ldGEgZGF0YSBtb2RlLCB3ZSBtb3ZlIGRlcXVldWQgYnVmZmVycyB0byB0aGUgbmV3IHN1cmZhY2UuCisgICAgLy8gZm9yIG5vbi1tZXRhIG1vZGUsIHdlIG11c3QgbW92ZSBhbGwgcmVnaXN0ZXJlZCBidWZmZXJzCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBidWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IEJ1ZmZlckluZm8gJmluZm8gPSBidWZmZXJzW2ldOworICAgICAgICAvLyBza2lwIHVuZGVxdWV1ZWQgYnVmZmVycyBmb3IgbWV0YSBkYXRhIG1vZGUKKyAgICAgICAgaWYgKHN0b3JpbmdNZXRhZGF0YUluRGVjb2RlZEJ1ZmZlcnMoKQorICAgICAgICAgICAgICAgICYmICFtTGVnYWN5QWRhcHRpdmVFeHBlcmltZW50CisgICAgICAgICAgICAgICAgJiYgaW5mby5tU3RhdHVzID09IEJ1ZmZlckluZm86Ok9XTkVEX0JZX05BVElWRV9XSU5ET1cpIHsKKyAgICAgICAgICAgIEFMT0dWKCJza2lwcGluZyBidWZmZXIgJXAiLCBpbmZvLm1HcmFwaGljQnVmZmVyLT5nZXROYXRpdmVCdWZmZXIoKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiYXR0YWNoaW5nIGJ1ZmZlciAlcCIsIGluZm8ubUdyYXBoaWNCdWZmZXItPmdldE5hdGl2ZUJ1ZmZlcigpKTsKKworICAgICAgICBlcnIgPSBzdXJmYWNlLT5hdHRhY2hCdWZmZXIoaW5mby5tR3JhcGhpY0J1ZmZlci0+Z2V0TmF0aXZlQnVmZmVyKCkpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGF0dGFjaCBidWZmZXIgJXAgdG8gdGhlIG5ldyBzdXJmYWNlOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgaW5mby5tR3JhcGhpY0J1ZmZlci0+Z2V0TmF0aXZlQnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjYW5jZWwgdW5kZXF1ZXVlZCBidWZmZXJzIHRvIG5ldyBzdXJmYWNlCisgICAgaWYgKCFzdG9yaW5nTWV0YWRhdGFJbkRlY29kZWRCdWZmZXJzKCkgfHwgbUxlZ2FjeUFkYXB0aXZlRXhwZXJpbWVudCkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIEJ1ZmZlckluZm8gJmluZm8gPSBidWZmZXJzLmVkaXRJdGVtQXQoaSk7CisgICAgICAgICAgICBpZiAoaW5mby5tU3RhdHVzID09IEJ1ZmZlckluZm86Ok9XTkVEX0JZX05BVElWRV9XSU5ET1cpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY2FuY2VsaW5nIGJ1ZmZlciAlcCIsIGluZm8ubUdyYXBoaWNCdWZmZXItPmdldE5hdGl2ZUJ1ZmZlcigpKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBuYXRpdmVXaW5kb3ctPmNhbmNlbEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVdpbmRvdywgaW5mby5tR3JhcGhpY0J1ZmZlci0+Z2V0TmF0aXZlQnVmZmVyKCksIGluZm8ubUZlbmNlRmQpOworICAgICAgICAgICAgICAgIGluZm8ubUZlbmNlRmQgPSAtMTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gY2FuY2VsIGJ1ZmZlciAlcCB0byB0aGUgbmV3IHN1cmZhY2U6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ubUdyYXBoaWNCdWZmZXItPmdldE5hdGl2ZUJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gZGlzYWxsb3cgZnVydGhlciBhbGxvY2F0aW9uCisgICAgICAgICh2b2lkKXN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKS0+YWxsb3dBbGxvY2F0aW9uKGZhbHNlKTsKKyAgICB9CisKKyAgICAvLyBwdXNoIGJsYW5rIGJ1ZmZlcnMgdG8gcHJldmlvdXMgd2luZG93IGlmIHJlcXVlc3RlZAorICAgIGlmIChtRmxhZ3MgJiBrRmxhZ1B1c2hCbGFua0J1ZmZlcnNUb05hdGl2ZVdpbmRvd09uU2h1dGRvd24pIHsKKyAgICAgICAgcHVzaEJsYW5rQnVmZmVyc1RvTmF0aXZlV2luZG93KG1OYXRpdmVXaW5kb3cuZ2V0KCkpOworICAgIH0KKworICAgIG1OYXRpdmVXaW5kb3cgPSBuYXRpdmVXaW5kb3c7CisgICAgbU5hdGl2ZVdpbmRvd1VzYWdlQml0cyA9IHVzYWdlQml0czsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IEFDb2RlYzo6YWxsb2NhdGVCdWZmZXJzT25Qb3J0KE9NWF9VMzIgcG9ydEluZGV4KSB7CiAgICAgQ0hFQ0socG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCB8fCBwb3J0SW5kZXggPT0ga1BvcnRJbmRleE91dHB1dCk7CiAKQEAgLTUyOSw4ICs3NjksOCBAQAogCiAgICAgc3RhdHVzX3QgZXJyOwogICAgIGlmIChtTmF0aXZlV2luZG93ICE9IE5VTEwgJiYgcG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQpIHsKLSAgICAgICAgaWYgKG1TdG9yZU1ldGFEYXRhSW5PdXRwdXRCdWZmZXJzKSB7Ci0gICAgICAgICAgICBlcnIgPSBhbGxvY2F0ZU91dHB1dE1ldGFEYXRhQnVmZmVycygpOworICAgICAgICBpZiAoc3RvcmluZ01ldGFkYXRhSW5EZWNvZGVkQnVmZmVycygpKSB7CisgICAgICAgICAgICBlcnIgPSBhbGxvY2F0ZU91dHB1dE1ldGFkYXRhQnVmZmVycygpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZXJyID0gYWxsb2NhdGVPdXRwdXRCdWZmZXJzRnJvbU5hdGl2ZVdpbmRvdygpOwogICAgICAgICB9CkBAIC01NDMsMjIgKzc4Myw0NCBAQAogICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLCAmZGVmLCBzaXplb2YoZGVmKSk7CiAKICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgQUxPR1YoIlslc10gQWxsb2NhdGluZyAldSBidWZmZXJzIG9mIHNpemUgJXUgb24gJXMgcG9ydCIsCisgICAgICAgICAgICBNZXRhZGF0YUJ1ZmZlclR5cGUgdHlwZSA9CisgICAgICAgICAgICAgICAgcG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQgPyBtT3V0cHV0TWV0YWRhdGFUeXBlIDogbUlucHV0TWV0YWRhdGFUeXBlOworICAgICAgICAgICAgaW50MzJfdCBidWZTaXplID0gZGVmLm5CdWZmZXJTaXplOworICAgICAgICAgICAgaWYgKHR5cGUgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UpIHsKKyAgICAgICAgICAgICAgICBidWZTaXplID0gc2l6ZW9mKFZpZGVvR3JhbGxvY01ldGFkYXRhKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgYnVmU2l6ZSA9IHNpemVvZihWaWRlb05hdGl2ZU1ldGFkYXRhKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgdXNpbmcgZ3JhbGxvYyBvciBuYXRpdmUgc291cmNlIGlucHV0IG1ldGFkYXRhIGJ1ZmZlcnMsIGFsbG9jYXRlIGxhcmdlc3QKKyAgICAgICAgICAgIC8vIG1ldGFkYXRhIHNpemUgYXMgd2UgcHJlZmVyIHRvIGdlbmVyYXRlIG5hdGl2ZSBzb3VyY2UgbWV0YWRhdGEsIGJ1dCBjb21wb25lbnQKKyAgICAgICAgICAgIC8vIG1heSByZXF1aXJlIGdyYWxsb2Mgc291cmNlLiBGb3IgY2FtZXJhIHNvdXJjZSwgYWxsb2NhdGUgYXQgbGVhc3QgZW5vdWdoCisgICAgICAgICAgICAvLyBzaXplIGZvciBuYXRpdmUgbWV0YWRhdGEgYnVmZmVycy4KKyAgICAgICAgICAgIGludDMyX3QgYWxsb3R0ZWRTaXplID0gYnVmU2l6ZTsKKyAgICAgICAgICAgIGlmIChwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0ICYmIHR5cGUgPj0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UpIHsKKyAgICAgICAgICAgICAgICBidWZTaXplID0gbWF4KHNpemVvZihWaWRlb0dyYWxsb2NNZXRhZGF0YSksIHNpemVvZihWaWRlb05hdGl2ZU1ldGFkYXRhKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQgJiYgdHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlQ2FtZXJhU291cmNlKSB7CisgICAgICAgICAgICAgICAgYnVmU2l6ZSA9IG1heChidWZTaXplLCAoaW50MzJfdClzaXplb2YoVmlkZW9OYXRpdmVNZXRhZGF0YSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTE9HVigiWyVzXSBBbGxvY2F0aW5nICV1IGJ1ZmZlcnMgb2Ygc2l6ZSAlZC8lZCAoZnJvbSAldSB1c2luZyAlcykgb24gJXMgcG9ydCIsCiAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwsIGRlZi5uQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCwgYnVmU2l6ZSwgYWxsb3R0ZWRTaXplLCBkZWYubkJ1ZmZlclNpemUsIGFzU3RyaW5nKHR5cGUpLAogICAgICAgICAgICAgICAgICAgICBwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0ID8gImlucHV0IiA6ICJvdXRwdXQiKTsKIAotICAgICAgICAgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgKiBkZWYubkJ1ZmZlclNpemU7CisgICAgICAgICAgICBzaXplX3QgdG90YWxTaXplID0gZGVmLm5CdWZmZXJDb3VudEFjdHVhbCAqIGJ1ZlNpemU7CiAgICAgICAgICAgICBtRGVhbGVyW3BvcnRJbmRleF0gPSBuZXcgTWVtb3J5RGVhbGVyKHRvdGFsU2l6ZSwgIkFDb2RlYyIpOwogCi0gICAgICAgICAgICBmb3IgKE9NWF9VMzIgaSA9IDA7IGkgPCBkZWYubkJ1ZmZlckNvdW50QWN0dWFsOyArK2kpIHsKLSAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiBtZW0gPSBtRGVhbGVyW3BvcnRJbmRleF0tPmFsbG9jYXRlKGRlZi5uQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBmb3IgKE9NWF9VMzIgaSA9IDA7IGkgPCBkZWYubkJ1ZmZlckNvdW50QWN0dWFsICYmIGVyciA9PSBPSzsgKytpKSB7CisgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4gbWVtID0gbURlYWxlcltwb3J0SW5kZXhdLT5hbGxvY2F0ZShidWZTaXplKTsKICAgICAgICAgICAgICAgICBpZiAobWVtID09IE5VTEwgfHwgbWVtLT5wb2ludGVyKCkgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIEJ1ZmZlckluZm8gaW5mbzsKICAgICAgICAgICAgICAgICBpbmZvLm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUzsKKyAgICAgICAgICAgICAgICBpbmZvLm1GZW5jZUZkID0gLTE7CisgICAgICAgICAgICAgICAgaW5mby5tUmVuZGVySW5mbyA9IE5VTEw7CiAKICAgICAgICAgICAgICAgICB1aW50MzJfdCByZXF1aXJlc0FsbG9jYXRlQnVmZmVyQml0ID0KICAgICAgICAgICAgICAgICAgICAgKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQpCkBAIC01NjYsMjcgKzgyOCwyNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgOiBPTVhDb2RlYzo6a1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbk91dHB1dFBvcnRzOwogCiAgICAgICAgICAgICAgICAgaWYgKChwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0ICYmIChtRmxhZ3MgJiBrRmxhZ0lzU2VjdXJlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1Vc2VNZXRhZGF0YU9uRW5jb2Rlck91dHB1dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0ICYmIHVzaW5nTWV0YWRhdGFPbkVuY29kZXJPdXRwdXQoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgbWVtLmNsZWFyKCk7CiAKICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcHRyOwogICAgICAgICAgICAgICAgICAgICBlcnIgPSBtT01YLT5hbGxvY2F0ZUJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgcG9ydEluZGV4LCBkZWYubkJ1ZmZlclNpemUsICZpbmZvLm1CdWZmZXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgcG9ydEluZGV4LCBidWZTaXplLCAmaW5mby5tQnVmZmVySUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB0cik7CiAKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBidWZTaXplID0gbVVzZU1ldGFkYXRhT25FbmNvZGVyT3V0cHV0ID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNCArIHNpemVvZihidWZmZXJfaGFuZGxlX3QpKSA6IGRlZi5uQnVmZmVyU2l6ZTsKLQogICAgICAgICAgICAgICAgICAgICBpbmZvLm1EYXRhID0gbmV3IEFCdWZmZXIocHRyLCBidWZTaXplKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1RdWlya3MgJiByZXF1aXJlc0FsbG9jYXRlQnVmZmVyQml0KSB7CiAgICAgICAgICAgICAgICAgICAgIGVyciA9IG1PTVgtPmFsbG9jYXRlQnVmZmVyV2l0aEJhY2t1cCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgcG9ydEluZGV4LCBtZW0sICZpbmZvLm1CdWZmZXJJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIHBvcnRJbmRleCwgbWVtLCAmaW5mby5tQnVmZmVySUQsIGFsbG90dGVkU2l6ZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gbU9NWC0+dXNlQnVmZmVyKG1Ob2RlLCBwb3J0SW5kZXgsIG1lbSwgJmluZm8ubUJ1ZmZlcklEKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbU9NWC0+dXNlQnVmZmVyKG1Ob2RlLCBwb3J0SW5kZXgsIG1lbSwgJmluZm8ubUJ1ZmZlcklELCBhbGxvdHRlZFNpemUpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChtZW0gIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBpbmZvLm1EYXRhID0gbmV3IEFCdWZmZXIobWVtLT5wb2ludGVyKCksIGRlZi5uQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGluZm8ubURhdGEgPSBuZXcgQUJ1ZmZlcihtZW0tPnBvaW50ZXIoKSwgYnVmU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoVmlkZW9OYXRpdmVNZXRhZGF0YSAqKW1lbS0+cG9pbnRlcigpKS0+bkZlbmNlRmQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIG1CdWZmZXJzW3BvcnRJbmRleF0ucHVzaChpbmZvKTsKQEAgLTYxNyw5ICs4NzksOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQUNvZGVjOjpjb25maWd1cmVPdXRwdXRCdWZmZXJzRnJvbU5hdGl2ZVdpbmRvdygKLSAgICAgICAgT01YX1UzMiAqYnVmZmVyQ291bnQsIE9NWF9VMzIgKmJ1ZmZlclNpemUsCi0gICAgICAgIE9NWF9VMzIgKm1pblVuZGVxdWV1ZWRCdWZmZXJzKSB7CitzdGF0dXNfdCBBQ29kZWM6OnNldHVwTmF0aXZlV2luZG93U2l6ZUZvcm1hdEFuZFVzYWdlKAorICAgICAgICBBTmF0aXZlV2luZG93ICpuYXRpdmVXaW5kb3cgLyogbm9ubnVsbCAqLywgaW50ICpmaW5hbFVzYWdlIC8qIG5vbm51bGwgKi8pIHsKICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsKICAgICBJbml0T01YUGFyYW1zKCZkZWYpOwogICAgIGRlZi5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKQEAgLTYzMSw0MCArODkyLDYgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KAotICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwKLSAgICAgICAgICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsCi0gICAgICAgICAgICBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCwKLSAgICAgICAgICAgIGRlZi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0KTsKLQotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICBBTE9HRSgibmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeSBmYWlsZWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAobVJvdGF0aW9uRGVncmVlcyAhPSAwKSB7Ci0gICAgICAgIHVpbnQzMl90IHRyYW5zZm9ybSA9IDA7Ci0gICAgICAgIHN3aXRjaCAobVJvdGF0aW9uRGVncmVlcykgewotICAgICAgICAgICAgY2FzZSAwOiB0cmFuc2Zvcm0gPSAwOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgOTA6IHRyYW5zZm9ybSA9IEhBTF9UUkFOU0ZPUk1fUk9UXzkwOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTgwOiB0cmFuc2Zvcm0gPSBIQUxfVFJBTlNGT1JNX1JPVF8xODA7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyNzA6IHRyYW5zZm9ybSA9IEhBTF9UUkFOU0ZPUk1fUk9UXzI3MDsgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OiB0cmFuc2Zvcm0gPSAwOyBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0cmFuc2Zvcm0gPiAwKSB7Ci0gICAgICAgICAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RyYW5zZm9ybSgKLSAgICAgICAgICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgdHJhbnNmb3JtKTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RyYW5zZm9ybSBmYWlsZWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBTZXQgdXAgdGhlIG5hdGl2ZSB3aW5kb3cuCiAgICAgT01YX1UzMiB1c2FnZSA9IDA7CiAgICAgZXJyID0gbU9NWC0+Z2V0R3JhcGhpY0J1ZmZlclVzYWdlKG1Ob2RlLCBrUG9ydEluZGV4T3V0cHV0LCAmdXNhZ2UpOwogICAgIGlmIChlcnIgIT0gMCkgewpAQCAtNjc4LDQzICs5MDUsMzQgQEAKICAgICAgICAgdXNhZ2UgfD0gR1JBTExPQ19VU0FHRV9QUk9URUNURUQ7CiAgICAgfQogCi0gICAgLy8gTWFrZSBzdXJlIHRvIGNoZWNrIHdoZXRoZXIgZWl0aGVyIFN0YWdlZnJpZ2h0IG9yIHRoZSB2aWRlbyBkZWNvZGVyCi0gICAgLy8gcmVxdWVzdGVkIHByb3RlY3RlZCBidWZmZXJzLgotICAgIGlmICh1c2FnZSAmIEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVEKSB7Ci0gICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBBTmF0aXZlV2luZG93IHNlbmRzIGltYWdlcyBkaXJlY3RseSB0bwotICAgICAgICAvLyBTdXJmYWNlRmxpbmdlci4KLSAgICAgICAgaW50IHF1ZXVlc1RvTmF0aXZlV2luZG93ID0gMDsKLSAgICAgICAgZXJyID0gbU5hdGl2ZVdpbmRvdy0+cXVlcnkoCi0gICAgICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgTkFUSVZFX1dJTkRPV19RVUVVRVNfVE9fV0lORE9XX0NPTVBPU0VSLAotICAgICAgICAgICAgICAgICZxdWV1ZXNUb05hdGl2ZVdpbmRvdyk7Ci0gICAgICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICAgICAgQUxPR0UoImVycm9yIGF1dGhlbnRpY2F0aW5nIG5hdGl2ZSB3aW5kb3c6ICVkIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHF1ZXVlc1RvTmF0aXZlV2luZG93ICE9IDEpIHsKLSAgICAgICAgICAgIEFMT0dFKCJuYXRpdmUgd2luZG93IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgICAgIH0KKyAgICB1c2FnZSB8PSBrVmlkZW9HcmFsbG9jVXNhZ2U7CisgICAgKmZpbmFsVXNhZ2UgPSB1c2FnZTsKKworICAgIEFMT0dWKCJncmFsbG9jIHVzYWdlOiAlI3goT01YKSA9PiAlI3goQUNvZGVjKSIsIG9teFVzYWdlLCB1c2FnZSk7CisgICAgcmV0dXJuIHNldE5hdGl2ZVdpbmRvd1NpemVGb3JtYXRBbmRVc2FnZSgKKyAgICAgICAgICAgIG5hdGl2ZVdpbmRvdywKKyAgICAgICAgICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsCisgICAgICAgICAgICBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCwKKyAgICAgICAgICAgIGRlZi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0LAorICAgICAgICAgICAgbVJvdGF0aW9uRGVncmVlcywKKyAgICAgICAgICAgIHVzYWdlKTsKK30KKworc3RhdHVzX3QgQUNvZGVjOjpjb25maWd1cmVPdXRwdXRCdWZmZXJzRnJvbU5hdGl2ZVdpbmRvdygKKyAgICAgICAgT01YX1UzMiAqYnVmZmVyQ291bnQsIE9NWF9VMzIgKmJ1ZmZlclNpemUsCisgICAgICAgIE9NWF9VMzIgKm1pblVuZGVxdWV1ZWRCdWZmZXJzKSB7CisgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBkZWY7CisgICAgSW5pdE9NWFBhcmFtcygmZGVmKTsKKyAgICBkZWYublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtT01YLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwgJmRlZiwgc2l6ZW9mKGRlZikpOworCisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBlcnIgPSBzZXR1cE5hdGl2ZVdpbmRvd1NpemVGb3JtYXRBbmRVc2FnZShtTmF0aXZlV2luZG93LmdldCgpLCAmbU5hdGl2ZVdpbmRvd1VzYWdlQml0cyk7CiAgICAgfQotCi0gICAgaW50IGNvbnN1bWVyVXNhZ2UgPSAwOwotICAgIGVyciA9IG1OYXRpdmVXaW5kb3ctPnF1ZXJ5KAotICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgTkFUSVZFX1dJTkRPV19DT05TVU1FUl9VU0FHRV9CSVRTLAotICAgICAgICAgICAgJmNvbnN1bWVyVXNhZ2UpOwotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICBBTE9HVygiZmFpbGVkIHRvIGdldCBjb25zdW1lciB1c2FnZSBiaXRzLiBpZ25vcmluZyIpOwotICAgICAgICBlcnIgPSAwOwotICAgIH0KLQotICAgIEFMT0dWKCJncmFsbG9jIHVzYWdlOiAlI3goT01YKSA9PiAlI3goQUNvZGVjKSArICUjeChDb25zdW1lcikgPSAlI3giLAotICAgICAgICAgICAgb214VXNhZ2UsIHVzYWdlLCBjb25zdW1lclVzYWdlLCB1c2FnZSB8IGNvbnN1bWVyVXNhZ2UpOwotICAgIHVzYWdlIHw9IGNvbnN1bWVyVXNhZ2U7Ci0gICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UoCi0gICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLAotICAgICAgICAgICAgdXNhZ2UgfCBHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUgfCBHUkFMTE9DX1VTQUdFX0VYVEVSTkFMX0RJU1ApOwotCi0gICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJuYXRpdmVfd2luZG93X3NldF91c2FnZSBmYWlsZWQ6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwgLWVycik7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBtTmF0aXZlV2luZG93VXNhZ2VCaXRzID0gMDsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKQEAgLTc5OCw2ICsxMDE2LDExIEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgbU51bVVuZGVxdWV1ZWRCdWZmZXJzID0gbWluVW5kZXF1ZXVlZEJ1ZmZlcnM7CiAKKyAgICBpZiAoIXN0b3JpbmdNZXRhZGF0YUluRGVjb2RlZEJ1ZmZlcnMoKSkgeworICAgICAgICBzdGF0aWNfY2FzdDxTdXJmYWNlKj4obU5hdGl2ZVdpbmRvdy5nZXQoKSkKKyAgICAgICAgICAgICAgICAtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKS0+YWxsb3dBbGxvY2F0aW9uKHRydWUpOworICAgIH0KKwogICAgIEFMT0dWKCJbJXNdIEFsbG9jYXRpbmcgJXUgYnVmZmVycyBmcm9tIGEgbmF0aXZlIHdpbmRvdyBvZiBzaXplICV1IG9uICIKICAgICAgICAgICJvdXRwdXQgcG9ydCIsCiAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBidWZmZXJDb3VudCwgYnVmZmVyU2l6ZSk7CkBAIC04MDUsNyArMTAyOCw4IEBACiAgICAgLy8gRGVxdWV1ZSBidWZmZXJzIGFuZCBzZW5kIHRoZW0gdG8gT01YCiAgICAgZm9yIChPTVhfVTMyIGkgPSAwOyBpIDwgYnVmZmVyQ291bnQ7IGkrKykgewogICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyICpidWY7Ci0gICAgICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfZGVxdWV1ZV9idWZmZXJfYW5kX3dhaXQobU5hdGl2ZVdpbmRvdy5nZXQoKSwgJmJ1Zik7CisgICAgICAgIGludCBmZW5jZUZkOworICAgICAgICBlcnIgPSBtTmF0aXZlV2luZG93LT5kZXF1ZXVlQnVmZmVyKG1OYXRpdmVXaW5kb3cuZ2V0KCksICZidWYsICZmZW5jZUZkKTsKICAgICAgICAgaWYgKGVyciAhPSAwKSB7CiAgICAgICAgICAgICBBTE9HRSgiZGVxdWV1ZUJ1ZmZlciBmYWlsZWQ6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwgLWVycik7CiAgICAgICAgICAgICBicmVhazsKQEAgLTgxNCw2ICsxMDM4LDkgQEAKICAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlcihuZXcgR3JhcGhpY0J1ZmZlcihidWYsIGZhbHNlKSk7CiAgICAgICAgIEJ1ZmZlckluZm8gaW5mbzsKICAgICAgICAgaW5mby5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfVVM7CisgICAgICAgIGluZm8ubUZlbmNlRmQgPSBmZW5jZUZkOworICAgICAgICBpbmZvLm1Jc1JlYWRGZW5jZSA9IGZhbHNlOworICAgICAgICBpbmZvLm1SZW5kZXJJbmZvID0gTlVMTDsKICAgICAgICAgaW5mby5tRGF0YSA9IG5ldyBBQnVmZmVyKE5VTEwgLyogZGF0YSAqLywgYnVmZmVyU2l6ZSAvKiBjYXBhY2l0eSAqLyk7CiAgICAgICAgIGluZm8ubUdyYXBoaWNCdWZmZXIgPSBncmFwaGljQnVmZmVyOwogICAgICAgICBtQnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XS5wdXNoKGluZm8pOwpAQCAtODUwLDE2ICsxMDc3LDIzIEBACiAKICAgICBmb3IgKE9NWF9VMzIgaSA9IGNhbmNlbFN0YXJ0OyBpIDwgY2FuY2VsRW5kOyBpKyspIHsKICAgICAgICAgQnVmZmVySW5mbyAqaW5mbyA9ICZtQnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XS5lZGl0SXRlbUF0KGkpOwotICAgICAgICBzdGF0dXNfdCBlcnJvciA9IGNhbmNlbEJ1ZmZlclRvTmF0aXZlV2luZG93KGluZm8pOwotICAgICAgICBpZiAoZXJyID09IDApIHsKLSAgICAgICAgICAgIGVyciA9IGVycm9yOworICAgICAgICBpZiAoaW5mby0+bVN0YXR1cyA9PSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUykgeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyb3IgPSBjYW5jZWxCdWZmZXJUb05hdGl2ZVdpbmRvdyhpbmZvKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gMCkgeworICAgICAgICAgICAgICAgIGVyciA9IGVycm9yOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKCFzdG9yaW5nTWV0YWRhdGFJbkRlY29kZWRCdWZmZXJzKCkpIHsKKyAgICAgICAgc3RhdGljX2Nhc3Q8U3VyZmFjZSo+KG1OYXRpdmVXaW5kb3cuZ2V0KCkpCisgICAgICAgICAgICAgICAgLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCktPmFsbG93QWxsb2NhdGlvbihmYWxzZSk7CisgICAgfQorCiAgICAgcmV0dXJuIGVycjsKIH0KIAotc3RhdHVzX3QgQUNvZGVjOjphbGxvY2F0ZU91dHB1dE1ldGFEYXRhQnVmZmVycygpIHsKK3N0YXR1c190IEFDb2RlYzo6YWxsb2NhdGVPdXRwdXRNZXRhZGF0YUJ1ZmZlcnMoKSB7CiAgICAgT01YX1UzMiBidWZmZXJDb3VudCwgYnVmZmVyU2l6ZSwgbWluVW5kZXF1ZXVlZEJ1ZmZlcnM7CiAgICAgc3RhdHVzX3QgZXJyID0gY29uZmlndXJlT3V0cHV0QnVmZmVyc0Zyb21OYXRpdmVXaW5kb3coCiAgICAgICAgICAgICAmYnVmZmVyQ291bnQsICZidWZmZXJTaXplLCAmbWluVW5kZXF1ZXVlZEJ1ZmZlcnMpOwpAQCAtODcwLDI2ICsxMTA0LDMyIEBACiAgICAgQUxPR1YoIlslc10gQWxsb2NhdGluZyAldSBtZXRhIGJ1ZmZlcnMgb24gb3V0cHV0IHBvcnQiLAogICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgYnVmZmVyQ291bnQpOwogCi0gICAgc2l6ZV90IHRvdGFsU2l6ZSA9IGJ1ZmZlckNvdW50ICogODsKKyAgICBzaXplX3QgYnVmU2l6ZSA9IG1PdXRwdXRNZXRhZGF0YVR5cGUgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUFOV0J1ZmZlciA/CisgICAgICAgICAgICBzaXplb2Yoc3RydWN0IFZpZGVvTmF0aXZlTWV0YWRhdGEpIDogc2l6ZW9mKHN0cnVjdCBWaWRlb0dyYWxsb2NNZXRhZGF0YSk7CisgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IGJ1ZmZlckNvdW50ICogYnVmU2l6ZTsKICAgICBtRGVhbGVyW2tQb3J0SW5kZXhPdXRwdXRdID0gbmV3IE1lbW9yeURlYWxlcih0b3RhbFNpemUsICJBQ29kZWMiKTsKIAogICAgIC8vIERlcXVldWUgYnVmZmVycyBhbmQgc2VuZCB0aGVtIHRvIE9NWAogICAgIGZvciAoT01YX1UzMiBpID0gMDsgaSA8IGJ1ZmZlckNvdW50OyBpKyspIHsKICAgICAgICAgQnVmZmVySW5mbyBpbmZvOwogICAgICAgICBpbmZvLm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9OQVRJVkVfV0lORE9XOworICAgICAgICBpbmZvLm1GZW5jZUZkID0gLTE7CisgICAgICAgIGluZm8ubVJlbmRlckluZm8gPSBOVUxMOwogICAgICAgICBpbmZvLm1HcmFwaGljQnVmZmVyID0gTlVMTDsKICAgICAgICAgaW5mby5tRGVxdWV1ZWRBdCA9IG1EZXF1ZXVlQ291bnRlcjsKIAotICAgICAgICBzcDxJTWVtb3J5PiBtZW0gPSBtRGVhbGVyW2tQb3J0SW5kZXhPdXRwdXRdLT5hbGxvY2F0ZSgKLSAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IFZpZGVvRGVjb2Rlck91dHB1dE1ldGFEYXRhKSk7CisgICAgICAgIHNwPElNZW1vcnk+IG1lbSA9IG1EZWFsZXJba1BvcnRJbmRleE91dHB1dF0tPmFsbG9jYXRlKGJ1ZlNpemUpOwogICAgICAgICBpZiAobWVtID09IE5VTEwgfHwgbWVtLT5wb2ludGVyKCkgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgfQorICAgICAgICBpZiAobU91dHB1dE1ldGFkYXRhVHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyKSB7CisgICAgICAgICAgICAoKFZpZGVvTmF0aXZlTWV0YWRhdGEgKiltZW0tPnBvaW50ZXIoKSktPm5GZW5jZUZkID0gLTE7CisgICAgICAgIH0KICAgICAgICAgaW5mby5tRGF0YSA9IG5ldyBBQnVmZmVyKG1lbS0+cG9pbnRlcigpLCBtZW0tPnNpemUoKSk7CiAKICAgICAgICAgLy8gd2UgdXNlIHVzZUJ1ZmZlciBmb3IgbWV0YWRhdGEgcmVnYXJkbGVzcyBvZiBxdWlya3MKICAgICAgICAgZXJyID0gbU9NWC0+dXNlQnVmZmVyKAotICAgICAgICAgICAgICAgIG1Ob2RlLCBrUG9ydEluZGV4T3V0cHV0LCBtZW0sICZpbmZvLm1CdWZmZXJJRCk7CisgICAgICAgICAgICAgICAgbU5vZGUsIGtQb3J0SW5kZXhPdXRwdXQsIG1lbSwgJmluZm8ubUJ1ZmZlcklELCBtZW0tPnNpemUoKSk7CiAKICAgICAgICAgbUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0ucHVzaChpbmZvKTsKIApAQCAtODk3LDI4ICsxMTM3LDExMSBAQAogICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGluZm8ubUJ1ZmZlcklELCBtZW0tPnBvaW50ZXIoKSk7CiAgICAgfQogCi0gICAgbU1ldGFEYXRhQnVmZmVyc1RvU3VibWl0ID0gYnVmZmVyQ291bnQgLSBtaW5VbmRlcXVldWVkQnVmZmVyczsKKyAgICBpZiAobUxlZ2FjeUFkYXB0aXZlRXhwZXJpbWVudCkgeworICAgICAgICAvLyBwcmVhbGxvY2F0ZSBhbmQgcHJlcmVnaXN0ZXIgYnVmZmVycworICAgICAgICBzdGF0aWNfY2FzdDxTdXJmYWNlICo+KG1OYXRpdmVXaW5kb3cuZ2V0KCkpCisgICAgICAgICAgICAgICAgLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCktPmFsbG93QWxsb2NhdGlvbih0cnVlKTsKKworICAgICAgICBBTE9HVigiWyVzXSBBbGxvY2F0aW5nICV1IGJ1ZmZlcnMgZnJvbSBhIG5hdGl2ZSB3aW5kb3cgb2Ygc2l6ZSAldSBvbiAiCisgICAgICAgICAgICAgIm91dHB1dCBwb3J0IiwKKyAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBidWZmZXJDb3VudCwgYnVmZmVyU2l6ZSk7CisKKyAgICAgICAgLy8gRGVxdWV1ZSBidWZmZXJzIHRoZW4gY2FuY2VsIHRoZW0gYWxsCisgICAgICAgIGZvciAoT01YX1UzMiBpID0gMDsgaSA8IGJ1ZmZlckNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIEJ1ZmZlckluZm8gKmluZm8gPSAmbUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uZWRpdEl0ZW1BdChpKTsKKworICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciAqYnVmOworICAgICAgICAgICAgaW50IGZlbmNlRmQ7CisgICAgICAgICAgICBlcnIgPSBtTmF0aXZlV2luZG93LT5kZXF1ZXVlQnVmZmVyKG1OYXRpdmVXaW5kb3cuZ2V0KCksICZidWYsICZmZW5jZUZkKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJkZXF1ZXVlQnVmZmVyIGZhaWxlZDogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlcihuZXcgR3JhcGhpY0J1ZmZlcihidWYsIGZhbHNlKSk7CisgICAgICAgICAgICBtT01YLT51cGRhdGVHcmFwaGljQnVmZmVySW5NZXRhKAorICAgICAgICAgICAgICAgICAgICBtTm9kZSwga1BvcnRJbmRleE91dHB1dCwgZ3JhcGhpY0J1ZmZlciwgaW5mby0+bUJ1ZmZlcklEKTsKKyAgICAgICAgICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUzsKKyAgICAgICAgICAgIGluZm8tPnNldFdyaXRlRmVuY2UoZmVuY2VGZCwgImFsbG9jYXRlT3V0cHV0TWV0YWRhdGFCdWZmZXJzIGZvciBsZWdhY3kiKTsKKyAgICAgICAgICAgIGluZm8tPm1HcmFwaGljQnVmZmVyID0gZ3JhcGhpY0J1ZmZlcjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoT01YX1UzMiBpID0gMDsgaSA8IG1CdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBCdWZmZXJJbmZvICppbmZvID0gJm1CdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLmVkaXRJdGVtQXQoaSk7CisgICAgICAgICAgICBpZiAoaW5mby0+bVN0YXR1cyA9PSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUykgeworICAgICAgICAgICAgICAgIHN0YXR1c190IGVycm9yID0gY2FuY2VsQnVmZmVyVG9OYXRpdmVXaW5kb3coaW5mbyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWNfY2FzdDxTdXJmYWNlKj4obU5hdGl2ZVdpbmRvdy5nZXQoKSkKKyAgICAgICAgICAgICAgICAtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKS0+YWxsb3dBbGxvY2F0aW9uKGZhbHNlKTsKKyAgICB9CisKKyAgICBtTWV0YWRhdGFCdWZmZXJzVG9TdWJtaXQgPSBidWZmZXJDb3VudCAtIG1pblVuZGVxdWV1ZWRCdWZmZXJzOwogICAgIHJldHVybiBlcnI7CiB9CiAKLXN0YXR1c190IEFDb2RlYzo6c3VibWl0T3V0cHV0TWV0YURhdGFCdWZmZXIoKSB7Ci0gICAgQ0hFQ0sobVN0b3JlTWV0YURhdGFJbk91dHB1dEJ1ZmZlcnMpOwotICAgIGlmIChtTWV0YURhdGFCdWZmZXJzVG9TdWJtaXQgPT0gMCkKK3N0YXR1c190IEFDb2RlYzo6c3VibWl0T3V0cHV0TWV0YWRhdGFCdWZmZXIoKSB7CisgICAgQ0hFQ0soc3RvcmluZ01ldGFkYXRhSW5EZWNvZGVkQnVmZmVycygpKTsKKyAgICBpZiAobU1ldGFkYXRhQnVmZmVyc1RvU3VibWl0ID09IDApCiAgICAgICAgIHJldHVybiBPSzsKIAogICAgIEJ1ZmZlckluZm8gKmluZm8gPSBkZXF1ZXVlQnVmZmVyRnJvbU5hdGl2ZVdpbmRvdygpOwotICAgIGlmIChpbmZvID09IE5VTEwpCisgICAgaWYgKGluZm8gPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQogCiAgICAgQUxPR1YoIlslc10gc3VibWl0dGluZyBvdXRwdXQgbWV0YSBidWZmZXIgSUQgJXUgZm9yIGdyYXBoaWMgYnVmZmVyICVwIiwKICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBpbmZvLT5tQnVmZmVySUQsIGluZm8tPm1HcmFwaGljQnVmZmVyLmdldCgpKTsKIAotICAgIC0tbU1ldGFEYXRhQnVmZmVyc1RvU3VibWl0OwotICAgIENIRUNLX0VRKG1PTVgtPmZpbGxCdWZmZXIobU5vZGUsIGluZm8tPm1CdWZmZXJJRCksCi0gICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKKyAgICAtLW1NZXRhZGF0YUJ1ZmZlcnNUb1N1Ym1pdDsKKyAgICBpbmZvLT5jaGVja1dyaXRlRmVuY2UoInN1Ym1pdE91dHB1dE1ldGFkYXRhQnVmZmVyIik7CisgICAgc3RhdHVzX3QgZXJyID0gbU9NWC0+ZmlsbEJ1ZmZlcihtTm9kZSwgaW5mby0+bUJ1ZmZlcklELCBpbmZvLT5tRmVuY2VGZCk7CisgICAgaW5mby0+bUZlbmNlRmQgPSAtMTsKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9DT01QT05FTlQ7CisgICAgfQogCi0gICAgaW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX0NPTVBPTkVOVDsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgQUNvZGVjOjp3YWl0Rm9yRmVuY2UoaW50IGZkLCBjb25zdCBjaGFyICpkYmcgKSB7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgaWYgKGZkID49IDApIHsKKyAgICAgICAgc3A8RmVuY2U+IGZlbmNlID0gbmV3IEZlbmNlKGZkKTsKKyAgICAgICAgcmVzID0gZmVuY2UtPndhaXQoSU9NWDo6a0ZlbmNlVGltZW91dE1zKTsKKyAgICAgICAgQUxPR1dfSUYocmVzICE9IE9LLCAiRkVOQ0UgVElNRU9VVCBmb3IgJWQgaW4gJXMiLCBmZCwgZGJnKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gc3RhdGljCitjb25zdCBjaGFyICpBQ29kZWM6Ol9hc1N0cmluZyhCdWZmZXJJbmZvOjpTdGF0dXMgcykgeworICAgIHN3aXRjaCAocykgeworICAgICAgICBjYXNlIEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTOiAgICAgICAgICAgIHJldHVybiAiT1VSIjsKKyAgICAgICAgY2FzZSBCdWZmZXJJbmZvOjpPV05FRF9CWV9DT01QT05FTlQ6ICAgICByZXR1cm4gIkNPTVBPTkVOVCI7CisgICAgICAgIGNhc2UgQnVmZmVySW5mbzo6T1dORURfQllfVVBTVFJFQU06ICAgICAgcmV0dXJuICJVUFNUUkVBTSI7CisgICAgICAgIGNhc2UgQnVmZmVySW5mbzo6T1dORURfQllfRE9XTlNUUkVBTTogICAgcmV0dXJuICJET1dOU1RSRUFNIjsKKyAgICAgICAgY2FzZSBCdWZmZXJJbmZvOjpPV05FRF9CWV9OQVRJVkVfV0lORE9XOiByZXR1cm4gIlNVUkZBQ0UiOworICAgICAgICBjYXNlIEJ1ZmZlckluZm86OlVOUkVDT0dOSVpFRDogICAgICAgICAgIHJldHVybiAiVU5SRUNPR05JWkVEIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIj8iOworICAgIH0KK30KKwordm9pZCBBQ29kZWM6OmR1bXBCdWZmZXJzKE9NWF9VMzIgcG9ydEluZGV4KSB7CisgICAgQ0hFQ0socG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCB8fCBwb3J0SW5kZXggPT0ga1BvcnRJbmRleE91dHB1dCk7CisgICAgQUxPR0koIlslc10gJXMgcG9ydCBoYXMgJXp1IGJ1ZmZlcnM6IiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgIHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQgPyAiaW5wdXQiIDogIm91dHB1dCIsIG1CdWZmZXJzW3BvcnRJbmRleF0uc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CdWZmZXJzW3BvcnRJbmRleF0uc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgQnVmZmVySW5mbyAmaW5mbyA9IG1CdWZmZXJzW3BvcnRJbmRleF1baV07CisgICAgICAgIEFMT0dJKCIgIHNsb3QgJTJ6dTogIyU4dSAlcC8lcCAlcyglZCkgZGVxdWV1ZWQ6JXUiLAorICAgICAgICAgICAgICAgIGksIGluZm8ubUJ1ZmZlcklELCBpbmZvLm1HcmFwaGljQnVmZmVyLmdldCgpLAorICAgICAgICAgICAgICAgIGluZm8ubUdyYXBoaWNCdWZmZXIgPT0gTlVMTCA/IE5VTEwgOiBpbmZvLm1HcmFwaGljQnVmZmVyLT5nZXROYXRpdmVCdWZmZXIoKSwKKyAgICAgICAgICAgICAgICBfYXNTdHJpbmcoaW5mby5tU3RhdHVzKSwgaW5mby5tU3RhdHVzLCBpbmZvLm1EZXF1ZXVlZEF0KTsKKyAgICB9CiB9CiAKIHN0YXR1c190IEFDb2RlYzo6Y2FuY2VsQnVmZmVyVG9OYXRpdmVXaW5kb3coQnVmZmVySW5mbyAqaW5mbykgewpAQCAtOTI3LDE3ICsxMjUwLDU5IEBACiAgICAgQUxPR1YoIlslc10gQ2FsbGluZyBjYW5jZWxCdWZmZXIgb24gYnVmZmVyICV1IiwKICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGluZm8tPm1CdWZmZXJJRCk7CiAKKyAgICBpbmZvLT5jaGVja1dyaXRlRmVuY2UoImNhbmNlbEJ1ZmZlclRvTmF0aXZlV2luZG93Iik7CiAgICAgaW50IGVyciA9IG1OYXRpdmVXaW5kb3ctPmNhbmNlbEJ1ZmZlcigKLSAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgaW5mby0+bUdyYXBoaWNCdWZmZXIuZ2V0KCksIC0xKTsKKyAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgaW5mby0+bUdyYXBoaWNCdWZmZXIuZ2V0KCksIGluZm8tPm1GZW5jZUZkKTsKKyAgICBpbmZvLT5tRmVuY2VGZCA9IC0xOwogCiAgICAgQUxPR1dfSUYoZXJyICE9IDAsICJbJXNdIGNhbiBub3QgcmV0dXJuIGJ1ZmZlciAldSB0byBuYXRpdmUgd2luZG93IiwKICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGluZm8tPm1CdWZmZXJJRCk7Ci0KKyAgICAvLyBjaGFuZ2Ugb3duZXJzaGlwIGV2ZW4gaWYgY2FuY2VsQnVmZmVyIGZhaWxzCiAgICAgaW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX05BVElWRV9XSU5ET1c7CiAKICAgICByZXR1cm4gZXJyOwogfQogCit2b2lkIEFDb2RlYzo6dXBkYXRlUmVuZGVySW5mb0ZvckRlcXVldWVkQnVmZmVyKAorICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyICpidWYsIGludCBmZW5jZUZkLCBCdWZmZXJJbmZvICppbmZvKSB7CisKKyAgICBpbmZvLT5tUmVuZGVySW5mbyA9CisgICAgICAgIG1SZW5kZXJUcmFja2VyLnVwZGF0ZUluZm9Gb3JEZXF1ZXVlZEJ1ZmZlcigKKyAgICAgICAgICAgICAgICBidWYsIGZlbmNlRmQsIGluZm8gLSAmbUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF1bMF0pOworCisgICAgLy8gY2hlY2sgZm9yIGFueSBmZW5jZXMgYWxyZWFkeSBzaWduYWxlZAorICAgIG5vdGlmeU9mUmVuZGVyZWRGcmFtZXMoZmFsc2UgLyogZHJvcEluY29tcGxldGUgKi8sIGluZm8tPm1SZW5kZXJJbmZvKTsKK30KKwordm9pZCBBQ29kZWM6Om9uRnJhbWVSZW5kZXJlZChpbnQ2NF90IG1lZGlhVGltZVVzLCBuc2Vjc190IHN5c3RlbU5hbm8pIHsKKyAgICBpZiAobVJlbmRlclRyYWNrZXIub25GcmFtZVJlbmRlcmVkKG1lZGlhVGltZVVzLCBzeXN0ZW1OYW5vKSAhPSBPSykgeworICAgICAgICBtUmVuZGVyVHJhY2tlci5kdW1wUmVuZGVyUXVldWUoKTsKKyAgICB9Cit9CisKK3ZvaWQgQUNvZGVjOjpub3RpZnlPZlJlbmRlcmVkRnJhbWVzKGJvb2wgZHJvcEluY29tcGxldGUsIEZyYW1lUmVuZGVyVHJhY2tlcjo6SW5mbyAqdW50aWwpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbXNnLT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRPdXRwdXRGcmFtZXNSZW5kZXJlZCk7CisgICAgc3RkOjpsaXN0PEZyYW1lUmVuZGVyVHJhY2tlcjo6SW5mbz4gZG9uZSA9CisgICAgICAgIG1SZW5kZXJUcmFja2VyLmNoZWNrRmVuY2VzQW5kR2V0UmVuZGVyZWRGcmFtZXModW50aWwsIGRyb3BJbmNvbXBsZXRlKTsKKworICAgIC8vIHVubGluayB1bnRyYWNrZWQgZnJhbWVzCisgICAgZm9yIChzdGQ6Omxpc3Q8RnJhbWVSZW5kZXJUcmFja2VyOjpJbmZvPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBkb25lLmNiZWdpbigpOworICAgICAgICAgICAgaXQgIT0gZG9uZS5jZW5kKCk7ICsraXQpIHsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IGl0LT5nZXRJbmRleCgpOworICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiAoc2l6ZV90KWluZGV4IDwgbUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uc2l6ZSgpKSB7CisgICAgICAgICAgICBtQnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XS5lZGl0SXRlbUF0KGluZGV4KS5tUmVuZGVySW5mbyA9IE5VTEw7CisgICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgLy8gVEhJUyBTSE9VTEQgTkVWRVIgSEFQUEVOCisgICAgICAgICAgICBBTE9HRSgiaW52YWxpZCBpbmRleCAlemQgaW4gJXp1IiwgaW5kZXgsIG1CdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLnNpemUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoTWVkaWFDb2RlYzo6Q3JlYXRlRnJhbWVzUmVuZGVyZWRNZXNzYWdlKGRvbmUsIG1zZykpIHsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQorfQorCiBBQ29kZWM6OkJ1ZmZlckluZm8gKkFDb2RlYzo6ZGVxdWV1ZUJ1ZmZlckZyb21OYXRpdmVXaW5kb3coKSB7CiAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciAqYnVmOwogICAgIENIRUNLKG1OYXRpdmVXaW5kb3cuZ2V0KCkgIT0gTlVMTCk7CkBAIC05NTMsMjYgKzEzMTgsNjEgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgaWYgKG5hdGl2ZV93aW5kb3dfZGVxdWV1ZV9idWZmZXJfYW5kX3dhaXQobU5hdGl2ZVdpbmRvdy5nZXQoKSwgJmJ1ZikgIT0gMCkgewotICAgICAgICBBTE9HRSgiZGVxdWV1ZUJ1ZmZlciBmYWlsZWQuIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KKyAgICBpbnQgZmVuY2VGZCA9IC0xOworICAgIGRvIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbU5hdGl2ZVdpbmRvdy0+ZGVxdWV1ZUJ1ZmZlcihtTmF0aXZlV2luZG93LmdldCgpLCAmYnVmLCAmZmVuY2VGZCk7CisgICAgICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoImRlcXVldWVCdWZmZXIgZmFpbGVkOiAlcyglZCkuIiwgYXNTdHJpbmcoZXJyKSwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKKyAgICAgICAgYm9vbCBzdGFsZSA9IGZhbHNlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gbUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uc2l6ZSgpOyBpLS0gPiAwOykgeworICAgICAgICAgICAgQnVmZmVySW5mbyAqaW5mbyA9ICZtQnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XS5lZGl0SXRlbUF0KGkpOworCisgICAgICAgICAgICBpZiAoaW5mby0+bUdyYXBoaWNCdWZmZXIgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICBpbmZvLT5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlID09IGJ1Zi0+aGFuZGxlKSB7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgY29uc3VtZXJzIGNhbiBhdHRhY2ggYnVmZmVycyB0byBCdWZmZXJRdWV1ZXMsIGl0IGlzIHBvc3NpYmxlCisgICAgICAgICAgICAgICAgLy8gdGhhdCBhIGtub3duIHlldCBzdGFsZSBidWZmZXIgY2FuIHJldHVybiBmcm9tIGEgc3VyZmFjZSB0aGF0IHdlCisgICAgICAgICAgICAgICAgLy8gb25jZSB1c2VkLiAgV2UgY2FuIHNpbXBseSBpZ25vcmUgdGhpcyBhcyB3ZSBoYXZlIGFscmVhZHkgZGVxdWV1ZWQKKyAgICAgICAgICAgICAgICAvLyB0aGlzIGJ1ZmZlciBwcm9wZXJseS4gIE5PVEU6IHRoaXMgZG9lcyBub3QgZWxpbWluYXRlIGFsbCBjYXNlcywKKyAgICAgICAgICAgICAgICAvLyBlLmcuIGl0IGlzIHBvc3NpYmxlIHRoYXQgd2UgaGF2ZSBxdWV1ZWQgdGhlIHZhbGlkIGJ1ZmZlciB0byB0aGUKKyAgICAgICAgICAgICAgICAvLyBOVywgYW5kIGEgc3RhbGUgY29weSBvZiB0aGUgc2FtZSBidWZmZXIgZ2V0cyBkZXF1ZXVlZCAtIHdoaWNoIHdpbGwKKyAgICAgICAgICAgICAgICAvLyBiZSB0cmVhdGVkIGFzIHRoZSB2YWxpZCBidWZmZXIgYnkgQUNvZGVjLgorICAgICAgICAgICAgICAgIGlmIChpbmZvLT5tU3RhdHVzICE9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX05BVElWRV9XSU5ET1cpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koImRlcXVldWVkIHN0YWxlIGJ1ZmZlciAlcC4gZGlzY2FyZGluZyIsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIHN0YWxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQUxPR1YoImRlcXVldWVkIGJ1ZmZlciAlcCIsIGluZm8tPm1HcmFwaGljQnVmZmVyLT5nZXROYXRpdmVCdWZmZXIoKSk7CisgICAgICAgICAgICAgICAgaW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTOworICAgICAgICAgICAgICAgIGluZm8tPnNldFdyaXRlRmVuY2UoZmVuY2VGZCwgImRlcXVldWVCdWZmZXJGcm9tTmF0aXZlV2luZG93Iik7CisgICAgICAgICAgICAgICAgdXBkYXRlUmVuZGVySW5mb0ZvckRlcXVldWVkQnVmZmVyKGJ1ZiwgZmVuY2VGZCwgaW5mbyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGluZm87CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHJlY2VpdmUgYSBwcmV2aW91c2x5IHVucmVnaXN0ZXJlZCBidWZmZXIKKyAgICAgICAgLy8gaW4gbm9uLW1ldGEgbW9kZS4gVGhlc2Ugc2hvdWxkIGJlIHRyZWF0ZWQgYXMgc3RhbGUgYnVmZmVycy4gVGhlCisgICAgICAgIC8vIHNhbWUgaXMgcG9zc2libGUgaW4gbWV0YSBtb2RlLCBpbiB3aGljaCBjYXNlLCBpdCB3aWxsIGJlIHRyZWF0ZWQKKyAgICAgICAgLy8gYXMgYSBub3JtYWwgYnVmZmVyLCB3aGljaCBpcyBub3QgZGVzaXJhYmxlLgorICAgICAgICAvLyBUT0RPOiBmaXggdGhpcy4KKyAgICAgICAgaWYgKCFzdGFsZSAmJiAoIXN0b3JpbmdNZXRhZGF0YUluRGVjb2RlZEJ1ZmZlcnMoKSB8fCBtTGVnYWN5QWRhcHRpdmVFeHBlcmltZW50KSkgeworICAgICAgICAgICAgQUxPR0koImRlcXVldWVkIHVucmVjb2duaXplZCAoc3RhbGUpIGJ1ZmZlciAlcC4gZGlzY2FyZGluZyIsIGJ1Zik7CisgICAgICAgICAgICBzdGFsZSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YWxlKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBkZXRhY2ggc3RhbGUgYnVmZmVyLCBidXQgdGhlcmUgaXMgbm8gQVBJIHlldCB0byBkbyBpdC4KKyAgICAgICAgICAgIGJ1ZiA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChidWYgPT0gTlVMTCk7CisKKyAgICAvLyBnZXQgb2xkZXN0IHVuZGVxdWV1ZWQgYnVmZmVyCiAgICAgQnVmZmVySW5mbyAqb2xkZXN0ID0gTlVMTDsKICAgICBmb3IgKHNpemVfdCBpID0gbUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uc2l6ZSgpOyBpLS0gPiAwOykgewogICAgICAgICBCdWZmZXJJbmZvICppbmZvID0KICAgICAgICAgICAgICZtQnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XS5lZGl0SXRlbUF0KGkpOwotCi0gICAgICAgIGlmIChpbmZvLT5tR3JhcGhpY0J1ZmZlciAhPSBOVUxMICYmCi0gICAgICAgICAgICBpbmZvLT5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlID09IGJ1Zi0+aGFuZGxlKSB7Ci0gICAgICAgICAgICBDSEVDS19FUSgoaW50KWluZm8tPm1TdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAoaW50KUJ1ZmZlckluZm86Ok9XTkVEX0JZX05BVElWRV9XSU5ET1cpOwotCi0gICAgICAgICAgICBpbmZvLT5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfVVM7Ci0KLSAgICAgICAgICAgIHJldHVybiBpbmZvOwotICAgICAgICB9Ci0KICAgICAgICAgaWYgKGluZm8tPm1TdGF0dXMgPT0gQnVmZmVySW5mbzo6T1dORURfQllfTkFUSVZFX1dJTkRPVyAmJgogICAgICAgICAgICAgKG9sZGVzdCA9PSBOVUxMIHx8CiAgICAgICAgICAgICAgLy8gYXZvaWQgcG90ZW50aWFsIGlzc3VlcyBmcm9tIGNvdW50ZXIgcm9sbGluZyBvdmVyCkBAIC05ODIsNDggKzEzODIsNjQgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChvbGRlc3QpIHsKLSAgICAgICAgQ0hFQ0sobVN0b3JlTWV0YURhdGFJbk91dHB1dEJ1ZmZlcnMpOworICAgIC8vIGl0IGlzIGltcG9zc2libGUgZGVxdWV1ZSBhIGJ1ZmZlciB3aGVuIHRoZXJlIGFyZSBubyBidWZmZXJzIHdpdGggQU5XCisgICAgQ0hFQ0sob2xkZXN0ICE9IE5VTEwpOworICAgIC8vIGl0IGlzIGltcG9zc2libGUgdG8gZGVxdWV1ZSBhbiB1bmtub3duIGJ1ZmZlciBpbiBub24tbWV0YSBtb2RlLCBhcyB0aGUKKyAgICAvLyB3aGlsZSBsb29wIGFib3ZlIGRvZXMgbm90IGNvbXBsZXRlCisgICAgQ0hFQ0soc3RvcmluZ01ldGFkYXRhSW5EZWNvZGVkQnVmZmVycygpKTsKIAotICAgICAgICAvLyBkaXNjYXJkIGJ1ZmZlciBpbiBMUlUgaW5mbyBhbmQgcmVwbGFjZSB3aXRoIG5ldyBidWZmZXIKLSAgICAgICAgb2xkZXN0LT5tR3JhcGhpY0J1ZmZlciA9IG5ldyBHcmFwaGljQnVmZmVyKGJ1ZiwgZmFsc2UpOwotICAgICAgICBvbGRlc3QtPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUzsKKyAgICAvLyBkaXNjYXJkIGJ1ZmZlciBpbiBMUlUgaW5mbyBhbmQgcmVwbGFjZSB3aXRoIG5ldyBidWZmZXIKKyAgICBvbGRlc3QtPm1HcmFwaGljQnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoYnVmLCBmYWxzZSk7CisgICAgb2xkZXN0LT5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfVVM7CisgICAgb2xkZXN0LT5zZXRXcml0ZUZlbmNlKGZlbmNlRmQsICJkZXF1ZXVlQnVmZmVyRnJvbU5hdGl2ZVdpbmRvdyBmb3Igb2xkZXN0Iik7CisgICAgbVJlbmRlclRyYWNrZXIudW50cmFja0ZyYW1lKG9sZGVzdC0+bVJlbmRlckluZm8pOworICAgIG9sZGVzdC0+bVJlbmRlckluZm8gPSBOVUxMOwogCi0gICAgICAgIG1PTVgtPnVwZGF0ZUdyYXBoaWNCdWZmZXJJbk1ldGEoCi0gICAgICAgICAgICAgICAgbU5vZGUsIGtQb3J0SW5kZXhPdXRwdXQsIG9sZGVzdC0+bUdyYXBoaWNCdWZmZXIsCi0gICAgICAgICAgICAgICAgb2xkZXN0LT5tQnVmZmVySUQpOworICAgIG1PTVgtPnVwZGF0ZUdyYXBoaWNCdWZmZXJJbk1ldGEoCisgICAgICAgICAgICBtTm9kZSwga1BvcnRJbmRleE91dHB1dCwgb2xkZXN0LT5tR3JhcGhpY0J1ZmZlciwKKyAgICAgICAgICAgIG9sZGVzdC0+bUJ1ZmZlcklEKTsKIAotICAgICAgICBWaWRlb0RlY29kZXJPdXRwdXRNZXRhRGF0YSAqbWV0YURhdGEgPQotICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxWaWRlb0RlY29kZXJPdXRwdXRNZXRhRGF0YSAqPigKLSAgICAgICAgICAgICAgICAgICAgb2xkZXN0LT5tRGF0YS0+YmFzZSgpKTsKLSAgICAgICAgQ0hFQ0tfRVEobWV0YURhdGEtPmVUeXBlLCBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSk7Ci0KKyAgICBpZiAobU91dHB1dE1ldGFkYXRhVHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkgeworICAgICAgICBWaWRlb0dyYWxsb2NNZXRhZGF0YSAqZ3JhbGxvY01ldGEgPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxWaWRlb0dyYWxsb2NNZXRhZGF0YSAqPihvbGRlc3QtPm1EYXRhLT5iYXNlKCkpOwogICAgICAgICBBTE9HVigicmVwbGFjZWQgb2xkZXN0IGJ1ZmZlciAjJXUgd2l0aCBhZ2UgJXUgKCVwLyVwIHN0b3JlZCBpbiAlcCkiLAotICAgICAgICAgICAgICAgIG9sZGVzdCAtICZtQnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XVswXSwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQpKG9sZGVzdCAtICZtQnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XVswXSksCiAgICAgICAgICAgICAgICAgbURlcXVldWVDb3VudGVyIC0gb2xkZXN0LT5tRGVxdWV1ZWRBdCwKLSAgICAgICAgICAgICAgICBtZXRhRGF0YS0+cEhhbmRsZSwKKyAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZ3JhbGxvY01ldGEtPnBIYW5kbGUsCiAgICAgICAgICAgICAgICAgb2xkZXN0LT5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlLCBvbGRlc3QtPm1EYXRhLT5iYXNlKCkpOwotCi0gICAgICAgIHJldHVybiBvbGRlc3Q7CisgICAgfSBlbHNlIGlmIChtT3V0cHV0TWV0YWRhdGFUeXBlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXIpIHsKKyAgICAgICAgVmlkZW9OYXRpdmVNZXRhZGF0YSAqbmF0aXZlTWV0YSA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFZpZGVvTmF0aXZlTWV0YWRhdGEgKj4ob2xkZXN0LT5tRGF0YS0+YmFzZSgpKTsKKyAgICAgICAgQUxPR1YoInJlcGxhY2VkIG9sZGVzdCBidWZmZXIgIyV1IHdpdGggYWdlICV1ICglcC8lcCBzdG9yZWQgaW4gJXApIiwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQpKG9sZGVzdCAtICZtQnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XVswXSksCisgICAgICAgICAgICAgICAgbURlcXVldWVDb3VudGVyIC0gb2xkZXN0LT5tRGVxdWV1ZWRBdCwKKyAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpbmF0aXZlTWV0YS0+cEJ1ZmZlciwKKyAgICAgICAgICAgICAgICBvbGRlc3QtPm1HcmFwaGljQnVmZmVyLT5nZXROYXRpdmVCdWZmZXIoKSwgb2xkZXN0LT5tRGF0YS0+YmFzZSgpKTsKICAgICB9CiAKLSAgICBUUkVTUEFTUygpOwotCi0gICAgcmV0dXJuIE5VTEw7CisgICAgdXBkYXRlUmVuZGVySW5mb0ZvckRlcXVldWVkQnVmZmVyKGJ1ZiwgZmVuY2VGZCwgb2xkZXN0KTsKKyAgICByZXR1cm4gb2xkZXN0OwogfQogCiBzdGF0dXNfdCBBQ29kZWM6OmZyZWVCdWZmZXJzT25Qb3J0KE9NWF9VMzIgcG9ydEluZGV4KSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IG1CdWZmZXJzW3BvcnRJbmRleF0uc2l6ZSgpOyBpLS0gPiAwOykgewotICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIGZyZWVCdWZmZXIocG9ydEluZGV4LCBpKSk7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgZm9yIChzaXplX3QgaSA9IG1CdWZmZXJzW3BvcnRJbmRleF0uc2l6ZSgpOyBpID4gMDspIHsKKyAgICAgICAgaS0tOworICAgICAgICBzdGF0dXNfdCBlcnIyID0gZnJlZUJ1ZmZlcihwb3J0SW5kZXgsIGkpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBlcnIgPSBlcnIyOworICAgICAgICB9CiAgICAgfQogCisgICAgLy8gY2xlYXIgbURlYWxlciBldmVuIG9uIGFuIGVycm9yCiAgICAgbURlYWxlcltwb3J0SW5kZXhdLmNsZWFyKCk7Ci0KLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIGVycjsKIH0KIAogc3RhdHVzX3QgQUNvZGVjOjpmcmVlT3V0cHV0QnVmZmVyc05vdE93bmVkQnlDb21wb25lbnQoKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IG1CdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLnNpemUoKTsgaS0tID4gMDspIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBmb3IgKHNpemVfdCBpID0gbUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uc2l6ZSgpOyBpID4gMDspIHsKKyAgICAgICAgaS0tOwogICAgICAgICBCdWZmZXJJbmZvICppbmZvID0KICAgICAgICAgICAgICZtQnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XS5lZGl0SXRlbUF0KGkpOwogCkBAIC0xMDMxLDM2ICsxNDQ3LDY1IEBACiAgICAgICAgIC8vIG9yIGJlaW5nIGRyYWluZWQuCiAgICAgICAgIGlmIChpbmZvLT5tU3RhdHVzICE9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX0NPTVBPTkVOVCAmJgogICAgICAgICAgICAgaW5mby0+bVN0YXR1cyAhPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9ET1dOU1RSRUFNKSB7Ci0gICAgICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIGZyZWVCdWZmZXIoa1BvcnRJbmRleE91dHB1dCwgaSkpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyMiA9IGZyZWVCdWZmZXIoa1BvcnRJbmRleE91dHB1dCwgaSk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgZXJyID0gZXJyMjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0dXNfdCBBQ29kZWM6OmZyZWVCdWZmZXIoT01YX1UzMiBwb3J0SW5kZXgsIHNpemVfdCBpKSB7CiAgICAgQnVmZmVySW5mbyAqaW5mbyA9ICZtQnVmZmVyc1twb3J0SW5kZXhdLmVkaXRJdGVtQXQoaSk7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CiAKLSAgICBDSEVDSyhpbmZvLT5tU3RhdHVzID09IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTCi0gICAgICAgICAgICB8fCBpbmZvLT5tU3RhdHVzID09IEJ1ZmZlckluZm86Ok9XTkVEX0JZX05BVElWRV9XSU5ET1cpOwotCi0gICAgaWYgKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0ICYmIG1OYXRpdmVXaW5kb3cgIT0gTlVMTAotICAgICAgICAgICAgJiYgaW5mby0+bVN0YXR1cyA9PSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUykgewotICAgICAgICBjYW5jZWxCdWZmZXJUb05hdGl2ZVdpbmRvdyhpbmZvKTsKKyAgICAvLyB0aGVyZSBzaG91bGQgbm90IGJlIGFueSBmZW5jZXMgaW4gdGhlIG1ldGFkYXRhCisgICAgTWV0YWRhdGFCdWZmZXJUeXBlIHR5cGUgPQorICAgICAgICBwb3J0SW5kZXggPT0ga1BvcnRJbmRleE91dHB1dCA/IG1PdXRwdXRNZXRhZGF0YVR5cGUgOiBtSW5wdXRNZXRhZGF0YVR5cGU7CisgICAgaWYgKHR5cGUgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUFOV0J1ZmZlciAmJiBpbmZvLT5tRGF0YSAhPSBOVUxMCisgICAgICAgICAgICAmJiBpbmZvLT5tRGF0YS0+c2l6ZSgpID49IHNpemVvZihWaWRlb05hdGl2ZU1ldGFkYXRhKSkgeworICAgICAgICBpbnQgZmVuY2VGZCA9ICgoVmlkZW9OYXRpdmVNZXRhZGF0YSAqKWluZm8tPm1EYXRhLT5kYXRhKCkpLT5uRmVuY2VGZDsKKyAgICAgICAgaWYgKGZlbmNlRmQgPj0gMCkgeworICAgICAgICAgICAgQUxPR1coInVucmVsZWFzZWQgZmVuY2UgKCVkKSBpbiAlcyBtZXRhZGF0YSBidWZmZXIgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgZmVuY2VGZCwgcG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCA/ICJpbnB1dCIgOiAib3V0cHV0IiwgaSk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBDSEVDS19FUShtT01YLT5mcmVlQnVmZmVyKAotICAgICAgICAgICAgICAgIG1Ob2RlLCBwb3J0SW5kZXgsIGluZm8tPm1CdWZmZXJJRCksCi0gICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKKyAgICBzd2l0Y2ggKGluZm8tPm1TdGF0dXMpIHsKKyAgICAgICAgY2FzZSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUzoKKyAgICAgICAgICAgIGlmIChwb3J0SW5kZXggPT0ga1BvcnRJbmRleE91dHB1dCAmJiBtTmF0aXZlV2luZG93ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAodm9pZCljYW5jZWxCdWZmZXJUb05hdGl2ZVdpbmRvdyhpbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAogCisgICAgICAgIGNhc2UgQnVmZmVySW5mbzo6T1dORURfQllfTkFUSVZFX1dJTkRPVzoKKyAgICAgICAgICAgIGVyciA9IG1PTVgtPmZyZWVCdWZmZXIobU5vZGUsIHBvcnRJbmRleCwgaW5mby0+bUJ1ZmZlcklEKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgidHJ5aW5nIHRvIGZyZWUgYnVmZmVyIG5vdCBvd25lZCBieSB1cyBvciBBTlcgKCVkKSIsIGluZm8tPm1TdGF0dXMpOworICAgICAgICAgICAgZXJyID0gRkFJTEVEX1RSQU5TQUNUSU9OOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGluZm8tPm1GZW5jZUZkID49IDApIHsKKyAgICAgICAgOjpjbG9zZShpbmZvLT5tRmVuY2VGZCk7CisgICAgfQorCisgICAgaWYgKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0KSB7CisgICAgICAgIG1SZW5kZXJUcmFja2VyLnVudHJhY2tGcmFtZShpbmZvLT5tUmVuZGVySW5mbywgaSk7CisgICAgICAgIGluZm8tPm1SZW5kZXJJbmZvID0gTlVMTDsKKyAgICB9CisKKyAgICAvLyByZW1vdmUgYnVmZmVyIGV2ZW4gaWYgbU9NWC0+ZnJlZUJ1ZmZlciBmYWlscwogICAgIG1CdWZmZXJzW3BvcnRJbmRleF0ucmVtb3ZlQXQoaSk7Ci0KLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIGVycjsKIH0KIAogQUNvZGVjOjpCdWZmZXJJbmZvICpBQ29kZWM6OmZpbmRCdWZmZXJCeUlEKAotICAgICAgICB1aW50MzJfdCBwb3J0SW5kZXgsIElPTVg6OmJ1ZmZlcl9pZCBidWZmZXJJRCwKLSAgICAgICAgc3NpemVfdCAqaW5kZXgpIHsKKyAgICAgICAgdWludDMyX3QgcG9ydEluZGV4LCBJT01YOjpidWZmZXJfaWQgYnVmZmVySUQsIHNzaXplX3QgKmluZGV4KSB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVyc1twb3J0SW5kZXhdLnNpemUoKTsgKytpKSB7CiAgICAgICAgIEJ1ZmZlckluZm8gKmluZm8gPSAmbUJ1ZmZlcnNbcG9ydEluZGV4XS5lZGl0SXRlbUF0KGkpOwogCkBAIC0xMDcyLDggKzE1MTcsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgVFJFU1BBU1MoKTsKLQorICAgIEFMT0dFKCJDb3VsZCBub3QgZmluZCBidWZmZXIgd2l0aCBJRCAldSIsIGJ1ZmZlcklEKTsKICAgICByZXR1cm4gTlVMTDsKIH0KIApAQCAtMTE4Niw2ICsxNjMwLDkgQEAKIAogICAgIG1Jc0VuY29kZXIgPSBlbmNvZGVyOwogCisgICAgbUlucHV0TWV0YWRhdGFUeXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZUludmFsaWQ7CisgICAgbU91dHB1dE1ldGFkYXRhVHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVJbnZhbGlkOworCiAgICAgc3RhdHVzX3QgZXJyID0gc2V0Q29tcG9uZW50Um9sZShlbmNvZGVyIC8qIGlzRW5jb2RlciAqLywgbWltZSk7CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0xMjAzLDE1ICsxNjUwLDI3IEBACiAgICAgaWYgKGVuY29kZXIKICAgICAgICAgICAgICYmIG1zZy0+ZmluZEludDMyKCJzdG9yZS1tZXRhZGF0YS1pbi1idWZmZXJzIiwgJnN0b3JlTWV0YSkKICAgICAgICAgICAgICYmIHN0b3JlTWV0YSAhPSAwKSB7Ci0gICAgICAgIGVyciA9IG1PTVgtPnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMobU5vZGUsIGtQb3J0SW5kZXhJbnB1dCwgT01YX1RSVUUpOwotCisgICAgICAgIGVyciA9IG1PTVgtPnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMobU5vZGUsIGtQb3J0SW5kZXhJbnB1dCwgT01YX1RSVUUsICZtSW5wdXRNZXRhZGF0YVR5cGUpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgIEFMT0dFKCJbJXNdIHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMgKGlucHV0KSBmYWlsZWQgdy8gZXJyICVkIiwKKyAgICAgICAgICAgIEFMT0dFKCJbJXNdIHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMgKGlucHV0KSBmYWlsZWQgdy8gZXJyICVkIiwKICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKIAotICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgIH0KLSAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgLy8gRm9yIHRoaXMgc3BlY2lmaWMgY2FzZSB3ZSBjb3VsZCBiZSB1c2luZyBjYW1lcmEgc291cmNlIGV2ZW4gaWYgc3RvcmVNZXRhRGF0YUluQnVmZmVycworICAgICAgICAvLyByZXR1cm5zIEdyYWxsb2Mgc291cmNlLiBQcmV0ZW5kIHRoYXQgd2UgYXJlOyB0aGlzIHdpbGwgZm9yY2UgdXMgdG8gdXNlIG5CdWZmZXJTaXplLgorICAgICAgICBpZiAobUlucHV0TWV0YWRhdGFUeXBlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKSB7CisgICAgICAgICAgICBtSW5wdXRNZXRhZGF0YVR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlQ2FtZXJhU291cmNlOworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgdXNhZ2VCaXRzOworICAgICAgICBpZiAobU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIG1Ob2RlLCAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUNvbnN1bWVyVXNhZ2VCaXRzLAorICAgICAgICAgICAgICAgICZ1c2FnZUJpdHMsIHNpemVvZih1c2FnZUJpdHMpKSA9PSBPSykgeworICAgICAgICAgICAgaW5wdXRGb3JtYXQtPnNldEludDMyKAorICAgICAgICAgICAgICAgICAgICAidXNpbmctc3ctcmVhZC1vZnRlbiIsICEhKHVzYWdlQml0cyAmIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTikpOworICAgICAgICB9CisgICAgfQogCiAgICAgaW50MzJfdCBwcmVwZW5kU1BTUFBTID0gMDsKICAgICBpZiAoZW5jb2RlcgpAQCAtMTI0NCwxOSArMTcwMywxNiBAQAogICAgIC8vIHNwcy9wcHMgdG8gaWRyIGZyYW1lcywgc2luY2UgaW4gbWV0YWRhdGEgbW9kZSB0aGUgYml0c3RyZWFtIGlzIGluIGFuCiAgICAgLy8gb3BhcXVlIGhhbmRsZSwgdG8gd2hpY2ggd2UgZG9uJ3QgaGF2ZSBhY2Nlc3MuCiAgICAgaW50MzJfdCB2aWRlbyA9ICFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNik7CisgICAgbUlzVmlkZW8gPSB2aWRlbzsKICAgICBpZiAoZW5jb2RlciAmJiB2aWRlbykgewogICAgICAgICBPTVhfQk9PTCBlbmFibGUgPSAoT01YX0JPT0wpIChwcmVwZW5kU1BTUFBTCiAgICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMigic3RvcmUtbWV0YWRhdGEtaW4tYnVmZmVycy1vdXRwdXQiLCAmc3RvcmVNZXRhKQogICAgICAgICAgICAgJiYgc3RvcmVNZXRhICE9IDApOwogCi0gICAgICAgIGVyciA9IG1PTVgtPnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMobU5vZGUsIGtQb3J0SW5kZXhPdXRwdXQsIGVuYWJsZSk7Ci0KKyAgICAgICAgZXJyID0gbU9NWC0+c3RvcmVNZXRhRGF0YUluQnVmZmVycyhtTm9kZSwga1BvcnRJbmRleE91dHB1dCwgZW5hYmxlLCAmbU91dHB1dE1ldGFkYXRhVHlwZSk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCJbJXNdIHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMgKG91dHB1dCkgZmFpbGVkIHcvIGVyciAlZCIsCiAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKLSAgICAgICAgICAgIG1Vc2VNZXRhZGF0YU9uRW5jb2Rlck91dHB1dCA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtVXNlTWV0YWRhdGFPbkVuY29kZXJPdXRwdXQgPSBlbmFibGU7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIW1zZy0+ZmluZEludDY0KApAQCAtMTI2OSw2ICsxNzI1LDEwIEBACiAgICAgICAgICAgICBtTWF4UHRzR2FwVXMgPSAtMWxsOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRGbG9hdCgibWF4LWZwcy10by1lbmNvZGVyIiwgJm1NYXhGcHMpKSB7CisgICAgICAgICAgICBtTWF4RnBzID0gLTE7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoIW1zZy0+ZmluZEludDY0KCJ0aW1lLWxhcHNlIiwgJm1UaW1lUGVyQ2FwdHVyZVVzKSkgewogICAgICAgICAgICAgbVRpbWVQZXJDYXB0dXJlVXMgPSAtMWxsOwogICAgICAgICB9CkBAIC0xMjg0LDcgKzE3NDQsNyBAQAogICAgIHNwPFJlZkJhc2U+IG9iajsKICAgICBib29sIGhhdmVOYXRpdmVXaW5kb3cgPSBtc2ctPmZpbmRPYmplY3QoIm5hdGl2ZS13aW5kb3ciLCAmb2JqKQogICAgICAgICAgICAgJiYgb2JqICE9IE5VTEwgJiYgdmlkZW8gJiYgIWVuY29kZXI7Ci0gICAgbVN0b3JlTWV0YURhdGFJbk91dHB1dEJ1ZmZlcnMgPSBmYWxzZTsKKyAgICBtTGVnYWN5QWRhcHRpdmVFeHBlcmltZW50ID0gZmFsc2U7CiAgICAgaWYgKHZpZGVvICYmICFlbmNvZGVyKSB7CiAgICAgICAgIGlucHV0Rm9ybWF0LT5zZXRJbnQzMigiYWRhcHRpdmUtcGxheWJhY2siLCBmYWxzZSk7CiAKQEAgLTEyOTksOSArMTc1OSw4IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKGhhdmVOYXRpdmVXaW5kb3cpIHsKLSAgICAgICAgc3A8TmF0aXZlV2luZG93V3JhcHBlcj4gd2luZG93V3JhcHBlcigKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxOYXRpdmVXaW5kb3dXcmFwcGVyICo+KG9iai5nZXQoKSkpOwotICAgICAgICBzcDxBTmF0aXZlV2luZG93PiBuYXRpdmVXaW5kb3cgPSB3aW5kb3dXcmFwcGVyLT5nZXROYXRpdmVXaW5kb3coKTsKKyAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gbmF0aXZlV2luZG93ID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3cgKj4oc3RhdGljX2Nhc3Q8U3VyZmFjZSAqPihvYmouZ2V0KCkpKTsKIAogICAgICAgICAvLyBTVEFSVCBvZiB0ZW1wb3Jhcnkgc3VwcG9ydCBmb3IgYXV0b21hdGljIEZSQyAtIFRISVMgV0lMTCBCRSBSRU1PVkVECiAgICAgICAgIGludDMyX3QgYXV0b0ZyYzsKQEAgLTEzNzAsNyArMTgyOSw3IEBACiAKICAgICAgICAgICAgIC8vIEFsd2F5cyB0cnkgdG8gZW5hYmxlIGR5bmFtaWMgb3V0cHV0IGJ1ZmZlcnMgb24gbmF0aXZlIHN1cmZhY2UKICAgICAgICAgICAgIGVyciA9IG1PTVgtPnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMoCi0gICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBrUG9ydEluZGV4T3V0cHV0LCBPTVhfVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBrUG9ydEluZGV4T3V0cHV0LCBPTVhfVFJVRSwgJm1PdXRwdXRNZXRhZGF0YVR5cGUpOwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIEFMT0dFKCJbJXNdIHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMgZmFpbGVkIHcvIGVyciAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOwpAQCAtMTQyMiw3ICsxODgxLDEwIEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMgc3VjY2VlZGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIG1TdG9yZU1ldGFEYXRhSW5PdXRwdXRCdWZmZXJzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBDSEVDSyhzdG9yaW5nTWV0YWRhdGFJbkRlY29kZWRCdWZmZXJzKCkpOworICAgICAgICAgICAgICAgIG1MZWdhY3lBZGFwdGl2ZUV4cGVyaW1lbnQgPSBBRGVidWc6OmlzRXhwZXJpbWVudEVuYWJsZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAibGVnYWN5LWFkYXB0aXZlIiwgIW1zZy0+Y29udGFpbnMoIm5vLWV4cGVyaW1lbnRzIikpOworCiAgICAgICAgICAgICAgICAgaW5wdXRGb3JtYXQtPnNldEludDMyKCJhZGFwdGl2ZS1wbGF5YmFjayIsIHRydWUpOwogICAgICAgICAgICAgfQogCkBAIC0xNDYwLDI4ICsxOTIyLDMxIEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaGF2ZU5hdGl2ZVdpbmRvdykgewotICAgICAgICAgICAgc3A8TmF0aXZlV2luZG93V3JhcHBlcj4gbmF0aXZlV2luZG93KAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxOYXRpdmVXaW5kb3dXcmFwcGVyICo+KG9iai5nZXQoKSkpOwotICAgICAgICAgICAgQ0hFQ0sobmF0aXZlV2luZG93ICE9IE5VTEwpOwotICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdyA9IG5hdGl2ZVdpbmRvdy0+Z2V0TmF0aXZlV2luZG93KCk7Ci0KLSAgICAgICAgICAgIG5hdGl2ZV93aW5kb3dfc2V0X3NjYWxpbmdfbW9kZSgKLSAgICAgICAgICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgTkFUSVZFX1dJTkRPV19TQ0FMSU5HX01PREVfU0NBTEVfVE9fV0lORE9XKTsKKyAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cgPSBzdGF0aWNfY2FzdDxTdXJmYWNlICo+KG9iai5nZXQoKSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBpbml0aWFsaXplIG5hdGl2ZSB3aW5kb3cgbm93IHRvIGdldCBhY3R1YWwgb3V0cHV0IGZvcm1hdAogICAgICAgICAvLyBUT0RPOiB0aGlzIGlzIG5lZWRlZCBmb3Igc29tZSBlbmNvZGVycyBldmVuIHRob3VnaCB0aGV5IGRvbid0IHVzZSBuYXRpdmUgd2luZG93Ci0gICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgaW5pdE5hdGl2ZVdpbmRvdygpKTsKKyAgICAgICAgZXJyID0gaW5pdE5hdGl2ZVdpbmRvdygpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CiAKICAgICAgICAgLy8gZmFsbGJhY2sgZm9yIGRldmljZXMgdGhhdCBkbyBub3QgaGFuZGxlIGZsZXgtWVVWIGZvciBuYXRpdmUgYnVmZmVycwogICAgICAgICBpZiAoaGF2ZU5hdGl2ZVdpbmRvdykgewogICAgICAgICAgICAgaW50MzJfdCByZXF1ZXN0ZWRDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQ7CiAgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZyZXF1ZXN0ZWRDb2xvckZvcm1hdCkgJiYKICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlKSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEoZ2V0UG9ydEZvcm1hdChrUG9ydEluZGV4T3V0cHV0LCBvdXRwdXRGb3JtYXQpLCAoc3RhdHVzX3QpT0spOworICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGdldFBvcnRGb3JtYXQoa1BvcnRJbmRleE91dHB1dCwgb3V0cHV0Rm9ybWF0KTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGludDMyX3QgY29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0VW51c2VkOwogICAgICAgICAgICAgICAgIE9NWF9VMzIgZmxleGlibGVFcXVpdmFsZW50ID0gT01YX0NPTE9SX0Zvcm1hdFVudXNlZDsKLSAgICAgICAgICAgICAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KSk7CisgICAgICAgICAgICAgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgib3VwdHV0IHBvcnQgZGlkIG5vdCBoYXZlIGEgY29sb3IgZm9ybWF0ICh3cm9uZyBkb21haW4/KSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBSZXF1ZXN0ZWQgb3V0cHV0IGZvcm1hdCAlI3ggYW5kIGdvdCAlI3guIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIHJlcXVlc3RlZENvbG9yRm9ybWF0LCBjb2xvckZvcm1hdCk7CiAgICAgICAgICAgICAgICAgaWYgKCFpc0ZsZXhpYmxlQ29sb3JGb3JtYXQoCkBAIC0xNDkxLDExICsxOTU2LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIC8vIHRvIFNXIHJlbmRlcmVyCiAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJbJXNdIEZhbGxpbmcgYmFjayB0byBzb2Z0d2FyZSByZW5kZXJlciIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICBtTmF0aXZlV2luZG93LmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3dVc2FnZUJpdHMgPSAwOwogICAgICAgICAgICAgICAgICAgICBoYXZlTmF0aXZlV2luZG93ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIHVzaW5nU3dSZW5kZXJlciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU3RvcmVNZXRhRGF0YUluT3V0cHV0QnVmZmVycykgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gbU9NWC0+c3RvcmVNZXRhRGF0YUluQnVmZmVycyhtTm9kZSwga1BvcnRJbmRleE91dHB1dCwgT01YX0ZBTFNFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdG9yZU1ldGFEYXRhSW5PdXRwdXRCdWZmZXJzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdG9yaW5nTWV0YWRhdGFJbkRlY29kZWRCdWZmZXJzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IG1PTVgtPnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBrUG9ydEluZGV4T3V0cHV0LCBPTVhfRkFMU0UsICZtT3V0cHV0TWV0YWRhdGFUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRNZXRhZGF0YVR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZDsgLy8ganVzdCBpbiBjYXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgYWRhcHRpdmUtcGxheWJhY2sgc3VwcG9ydCBmb3IgYnl0ZWJ1ZmZlciBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBkb25lIGJ5IFNXIGNvZGVjcywgYnV0IG1vc3QgSFcgY29kZWNzIGRvbid0IHN1cHBvcnQgaXQuCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEZvcm1hdC0+c2V0SW50MzIoImFkYXB0aXZlLXBsYXliYWNrIiwgZmFsc2UpOwpAQCAtMTYwMyw3ICsyMDcwLDcgQEAKICAgICAgICAgICAgIGVyciA9IHNldHVwRzcxMUNvZGVjKGVuY29kZXIsIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQykpIHsKLSAgICAgICAgaW50MzJfdCBudW1DaGFubmVscywgc2FtcGxlUmF0ZSwgY29tcHJlc3Npb25MZXZlbCA9IC0xOworICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzID0gMCwgc2FtcGxlUmF0ZSA9IDAsIGNvbXByZXNzaW9uTGV2ZWwgPSAtMTsKICAgICAgICAgaWYgKGVuY29kZXIgJiYKICAgICAgICAgICAgICAgICAoIW1zZy0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKQogICAgICAgICAgICAgICAgICAgICAgICAgfHwgIW1zZy0+ZmluZEludDMyKCJzYW1wbGUtcmF0ZSIsICZzYW1wbGVSYXRlKSkpIHsKQEAgLTE2ODUsMTYgKzIxNTIsNzggQEAKICAgICAgICAgZXJyID0gc2V0TWluQnVmZmVyU2l6ZShrUG9ydEluZGV4SW5wdXQsIDgxOTIpOyAgLy8gWFhYCiAgICAgfQogCisgICAgaW50MzJfdCBwcmlvcml0eTsKKyAgICBpZiAobXNnLT5maW5kSW50MzIoInByaW9yaXR5IiwgJnByaW9yaXR5KSkgeworICAgICAgICBlcnIgPSBzZXRQcmlvcml0eShwcmlvcml0eSk7CisgICAgfQorCisgICAgaW50MzJfdCByYXRlSW50ID0gLTE7CisgICAgZmxvYXQgcmF0ZUZsb2F0ID0gLTE7CisgICAgaWYgKCFtc2ctPmZpbmRGbG9hdCgib3BlcmF0aW5nLXJhdGUiLCAmcmF0ZUZsb2F0KSkgeworICAgICAgICBtc2ctPmZpbmRJbnQzMigib3BlcmF0aW5nLXJhdGUiLCAmcmF0ZUludCk7CisgICAgICAgIHJhdGVGbG9hdCA9IChmbG9hdClyYXRlSW50OyAgLy8gMTZNSHogKEZMSU5UTUFYKSBpcyBPSyBmb3IgdXBwZXIgYm91bmQuCisgICAgfQorICAgIGlmIChyYXRlRmxvYXQgPiAwKSB7CisgICAgICAgIGVyciA9IHNldE9wZXJhdGluZ1JhdGUocmF0ZUZsb2F0LCB2aWRlbyk7CisgICAgfQorCiAgICAgbUJhc2VPdXRwdXRGb3JtYXQgPSBvdXRwdXRGb3JtYXQ7CiAKLSAgICBDSEVDS19FUShnZXRQb3J0Rm9ybWF0KGtQb3J0SW5kZXhJbnB1dCwgaW5wdXRGb3JtYXQpLCAoc3RhdHVzX3QpT0spOwotICAgIENIRUNLX0VRKGdldFBvcnRGb3JtYXQoa1BvcnRJbmRleE91dHB1dCwgb3V0cHV0Rm9ybWF0KSwgKHN0YXR1c190KU9LKTsKLSAgICBtSW5wdXRGb3JtYXQgPSBpbnB1dEZvcm1hdDsKLSAgICBtT3V0cHV0Rm9ybWF0ID0gb3V0cHV0Rm9ybWF0OwotCisgICAgZXJyID0gZ2V0UG9ydEZvcm1hdChrUG9ydEluZGV4SW5wdXQsIGlucHV0Rm9ybWF0KTsKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIGVyciA9IGdldFBvcnRGb3JtYXQoa1BvcnRJbmRleE91dHB1dCwgb3V0cHV0Rm9ybWF0KTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgbUlucHV0Rm9ybWF0ID0gaW5wdXRGb3JtYXQ7CisgICAgICAgICAgICBtT3V0cHV0Rm9ybWF0ID0gb3V0cHV0Rm9ybWF0OworICAgICAgICB9CisgICAgfQogICAgIHJldHVybiBlcnI7CiB9CiAKK3N0YXR1c190IEFDb2RlYzo6c2V0UHJpb3JpdHkoaW50MzJfdCBwcmlvcml0eSkgeworICAgIGlmIChwcmlvcml0eSA8IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgT01YX1BBUkFNX1UzMlRZUEUgY29uZmlnOworICAgIEluaXRPTVhQYXJhbXMoJmNvbmZpZyk7CisgICAgY29uZmlnLm5VMzIgPSAoT01YX1UzMilwcmlvcml0eTsKKyAgICBzdGF0dXNfdCB0ZW1wID0gbU9NWC0+c2V0Q29uZmlnKAorICAgICAgICAgICAgbU5vZGUsIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleENvbmZpZ1ByaW9yaXR5LAorICAgICAgICAgICAgJmNvbmZpZywgc2l6ZW9mKGNvbmZpZykpOworICAgIGlmICh0ZW1wICE9IE9LKSB7CisgICAgICAgIEFMT0dJKCJjb2RlYyBkb2VzIG5vdCBzdXBwb3J0IGNvbmZpZyBwcmlvcml0eSAoZXJyICVkKSIsIHRlbXApOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFDb2RlYzo6c2V0T3BlcmF0aW5nUmF0ZShmbG9hdCByYXRlRmxvYXQsIGJvb2wgaXNWaWRlbykgeworICAgIGlmIChyYXRlRmxvYXQgPCAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIE9NWF9VMzIgcmF0ZTsKKyAgICBpZiAoaXNWaWRlbykgeworICAgICAgICBpZiAocmF0ZUZsb2F0ID4gNjU1MzUpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgcmF0ZSA9IChPTVhfVTMyKShyYXRlRmxvYXQgKiA2NTUzNi4wZiArIDAuNWYpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChyYXRlRmxvYXQgPiBVSU5UX01BWCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICByYXRlID0gKE9NWF9VMzIpKHJhdGVGbG9hdCk7CisgICAgfQorICAgIE9NWF9QQVJBTV9VMzJUWVBFIGNvbmZpZzsKKyAgICBJbml0T01YUGFyYW1zKCZjb25maWcpOworICAgIGNvbmZpZy5uVTMyID0gcmF0ZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtT01YLT5zZXRDb25maWcoCisgICAgICAgICAgICBtTm9kZSwgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4Q29uZmlnT3BlcmF0aW5nUmF0ZSwKKyAgICAgICAgICAgICZjb25maWcsIHNpemVvZihjb25maWcpKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dJKCJjb2RlYyBkb2VzIG5vdCBzdXBwb3J0IGNvbmZpZyBvcGVyYXRpbmcgcmF0ZSAoZXJyICVkKSIsIGVycik7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgQUNvZGVjOjpzZXRNaW5CdWZmZXJTaXplKE9NWF9VMzIgcG9ydEluZGV4LCBzaXplX3Qgc2l6ZSkgewogICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgZGVmOwogICAgIEluaXRPTVhQYXJhbXMoJmRlZik7CkBAIC0xNzI3LDcgKzIyNTYsMTAgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICBDSEVDSyhkZWYubkJ1ZmZlclNpemUgPj0gc2l6ZSk7CisgICAgaWYgKGRlZi5uQnVmZmVyU2l6ZSA8IHNpemUpIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBzZXQgbWluIGJ1ZmZlciBzaXplIHRvICV6dSAoaXMgc3RpbGwgJXUpIiwgc2l6ZSwgZGVmLm5CdWZmZXJTaXplKTsKKyAgICAgICAgcmV0dXJuIEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0yMDU2LDcgKzI1ODgsOSBAQAogfQogCiBzdGF0dXNfdCBBQ29kZWM6OnNldHVwRzcxMUNvZGVjKGJvb2wgZW5jb2RlciwgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IG51bUNoYW5uZWxzKSB7Ci0gICAgQ0hFQ0soIWVuY29kZXIpOyAgLy8gWFhYIFRPRE8KKyAgICBpZiAoZW5jb2RlcikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQogCiAgICAgcmV0dXJuIHNldHVwUmF3QXVkaW9Gb3JtYXQoCiAgICAgICAgICAgICBrUG9ydEluZGV4SW5wdXQsIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKTsKQEAgLTI1NjcsNyArMzEwMSw5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBBTE9HSSgic2V0dXBWaWRlb0VuY29kZXIgc3VjY2VlZGVkIik7CisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBBTE9HSSgic2V0dXBWaWRlb0VuY29kZXIgc3VjY2VlZGVkIik7CisgICAgfQogCiAgICAgcmV0dXJuIGVycjsKIH0KQEAgLTMxNjUsOCArMzcwMSw5IEBACiAKICAgICBzdGF0dXNfdCBlcnIgPSBtT01YLT5nZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwgJmRlZiwgc2l6ZW9mKGRlZikpOwotCi0gICAgQ0hFQ0tfRVEoZXJyLCAoc3RhdHVzX3QpT0spOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CiAKICAgICBpZiAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCkgewogICAgICAgICAvLyBYWFggTmVlZCBhIChtdWNoKSBiZXR0ZXIgaGV1cmlzdGljIHRvIGNvbXB1dGUgaW5wdXQgYnVmZmVyIHNpemVzLgpAQCAtMzE3Niw3ICszNzEzLDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBDSEVDS19FUSgoaW50KWRlZi5lRG9tYWluLCAoaW50KU9NWF9Qb3J0RG9tYWluVmlkZW8pOworICAgIGlmIChkZWYuZURvbWFpbiAhPSBPTVhfUG9ydERvbWFpblZpZGVvKSB7CisgICAgICAgIEFMT0dFKCJleHBlY3RlZCB2aWRlbyBwb3J0LCBnb3QgJXMoJWQpIiwgYXNTdHJpbmcoZGVmLmVEb21haW4pLCBkZWYuZURvbWFpbik7CisgICAgICAgIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfQogCiAgICAgdmlkZW9fZGVmLT5uRnJhbWVXaWR0aCA9IHdpZHRoOwogICAgIHZpZGVvX2RlZi0+bkZyYW1lSGVpZ2h0ID0gaGVpZ2h0OwpAQCAtMzI0MCw4ICszNzgwLDggQEAKICAgICB3aGlsZSAoY291bnRCdWZmZXJzT3duZWRCeU5hdGl2ZVdpbmRvdygpID4gbU51bVVuZGVxdWV1ZWRCdWZmZXJzCiAgICAgICAgICAgICAmJiBkZXF1ZXVlQnVmZmVyRnJvbU5hdGl2ZVdpbmRvdygpICE9IE5VTEwpIHsKICAgICAgICAgLy8gdGhlc2UgYnVmZmVycyB3aWxsIGJlIHN1Ym1pdHRlZCBhcyByZWd1bGFyIGJ1ZmZlcnM7IGFjY291bnQgZm9yIHRoaXMKLSAgICAgICAgaWYgKG1TdG9yZU1ldGFEYXRhSW5PdXRwdXRCdWZmZXJzICYmIG1NZXRhRGF0YUJ1ZmZlcnNUb1N1Ym1pdCA+IDApIHsKLSAgICAgICAgICAgIC0tbU1ldGFEYXRhQnVmZmVyc1RvU3VibWl0OworICAgICAgICBpZiAoc3RvcmluZ01ldGFkYXRhSW5EZWNvZGVkQnVmZmVycygpICYmIG1NZXRhZGF0YUJ1ZmZlcnNUb1N1Ym1pdCA+IDApIHsKKyAgICAgICAgICAgIC0tbU1ldGFkYXRhQnVmZmVyc1RvU3VibWl0OwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMzQ1MywxNyArMzk5MywyMCBAQAogfQogCiBzdGF0dXNfdCBBQ29kZWM6OmdldFBvcnRGb3JtYXQoT01YX1UzMiBwb3J0SW5kZXgsIHNwPEFNZXNzYWdlPiAmbm90aWZ5KSB7Ci0gICAgLy8gVE9ETzogY2F0Y2ggZXJyb3JzIGFuIHJldHVybiB0aGVtIGluc3RlYWQgb2YgdXNpbmcgQ0hFQ0sKKyAgICBjb25zdCBjaGFyICpuaWNlSW5kZXggPSBwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0ID8gImlucHV0IiA6ICJvdXRwdXQiOwogICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgZGVmOwogICAgIEluaXRPTVhQYXJhbXMoJmRlZik7CiAgICAgZGVmLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CiAKLSAgICBDSEVDS19FUShtT01YLT5nZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICZkZWYsIHNpemVvZihkZWYpKSwKLSAgICAgICAgICAgICAoc3RhdHVzX3QpT0spOworICAgIHN0YXR1c190IGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcihtTm9kZSwgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwgJmRlZiwgc2l6ZW9mKGRlZikpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CiAKLSAgICBDSEVDS19FUSgoaW50KWRlZi5lRGlyLAotICAgICAgICAgICAgKGludCkocG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQgPyBPTVhfRGlyT3V0cHV0IDogT01YX0RpcklucHV0KSk7CisgICAgaWYgKGRlZi5lRGlyICE9IChwb3J0SW5kZXggPT0ga1BvcnRJbmRleE91dHB1dCA/IE9NWF9EaXJPdXRwdXQgOiBPTVhfRGlySW5wdXQpKSB7CisgICAgICAgIEFMT0dFKCJ1bmV4cGVjdGVkIGRpcjogJXMoJWQpIG9uICVzIHBvcnQiLCBhc1N0cmluZyhkZWYuZURpciksIGRlZi5lRGlyLCBuaWNlSW5kZXgpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KIAogICAgIHN3aXRjaCAoZGVmLmVEb21haW4pIHsKICAgICAgICAgY2FzZSBPTVhfUG9ydERvbWFpblZpZGVvOgpAQCAtMzQ5Nyw3ICs0MDQwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRlc2NyaWJlUGFyYW1zLnNNZWRpYUltYWdlKSkpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFJbWFnZSAqaW1nID0gJmRlc2NyaWJlUGFyYW1zLnNNZWRpYUltYWdlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIE1lZGlhSW1hZ2UgeyBGKCV6dXglenUpIEAlenUrJXp1KyV6dSBAJXp1KyV6dSslenUgQCV6dSslenUrJXp1IH0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIE1lZGlhSW1hZ2UgeyBGKCV1eCV1KSBAJXUrJXUrJXUgQCV1KyV1KyV1IEAldSsldSsldSB9IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGltZy0+bVdpZHRoLCBpbWctPm1IZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWctPm1QbGFuZVswXS5tT2Zmc2V0LCBpbWctPm1QbGFuZVswXS5tQ29sSW5jLCBpbWctPm1QbGFuZVswXS5tUm93SW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLT5tUGxhbmVbMV0ubU9mZnNldCwgaW1nLT5tUGxhbmVbMV0ubUNvbEluYywgaW1nLT5tUGxhbmVbMV0ubVJvd0luYywKQEAgLTM1MjYsMTIgKzQwNjksMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubkhlaWdodCA9IHZpZGVvRGVmLT5uRnJhbWVIZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBDSEVDS19HRShyZWN0Lm5MZWZ0LCAwKTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfR0UocmVjdC5uVG9wLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfR0UocmVjdC5uV2lkdGgsIDB1KTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfR0UocmVjdC5uSGVpZ2h0LCAwdSk7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLX0xFKHJlY3QubkxlZnQgKyByZWN0Lm5XaWR0aCAtIDEsIHZpZGVvRGVmLT5uRnJhbWVXaWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLX0xFKHJlY3QublRvcCArIHJlY3QubkhlaWdodCAtIDEsIHZpZGVvRGVmLT5uRnJhbWVIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVjdC5uTGVmdCA8IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCA8IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubkxlZnQgKyByZWN0Lm5XaWR0aCA+IHZpZGVvRGVmLT5uRnJhbWVXaWR0aCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uVG9wICsgcmVjdC5uSGVpZ2h0ID4gdmlkZW9EZWYtPm5GcmFtZUhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIldyb25nIGNyb3BwZWQgcmVjdCAoJWQsICVkKSAtICgldSwgJXUpIHZzLiBmcmFtZSAoJXUsICV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubkxlZnQsIHJlY3QublRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uTGVmdCArIHJlY3QubldpZHRoLCByZWN0Lm5Ub3AgKyByZWN0Lm5IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRGVmLT5uRnJhbWVXaWR0aCwgdmlkZW9EZWYtPm5GcmFtZUhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRSZWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm9wIiwKQEAgLTM1ODgsNyArNDEzNSwxMyBAQAogCiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKG1Jc0VuY29kZXIgXiAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCkpOworICAgICAgICAgICAgICAgICAgICBpZiAobUlzRW5jb2RlciBeIChwb3J0SW5kZXggPT0ga1BvcnRJbmRleE91dHB1dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSBDb2RpbmdVbnVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJSYXcgcG9ydCB2aWRlbyBjb21wcmVzc2lvbiBmb3JtYXQgaXMgJXMoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcodmlkZW9EZWYtPmVDb21wcmVzc2lvbkZvcm1hdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRGVmLT5lQ29tcHJlc3Npb25Gb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIG1pbWU7CiAgICAgICAgICAgICAgICAgICAgIGlmIChHZXRNaW1lVHlwZUZvclZpZGVvQ29kaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9EZWYtPmVDb21wcmVzc2lvbkZvcm1hdCwgJm1pbWUpICE9IE9LKSB7CkBAIC0zNjE5LDIwICs0MTcyLDI1IEBACiAgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OwogCi0gICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1PTVgtPmdldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9QY20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtLCAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBDSEVDS19HVChwYXJhbXMubkNoYW5uZWxzLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0socGFyYW1zLm5DaGFubmVscyA9PSAxIHx8IHBhcmFtcy5iSW50ZXJsZWF2ZWQpOwotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShwYXJhbXMubkJpdFBlclNhbXBsZSwgMTZ1KTsKLQotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUSgoaW50KXBhcmFtcy5lTnVtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKGludClwYXJhbXMuZVBDTU1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpT01YX0FVRElPX1BDTU1vZGVMaW5lYXIpOworICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLm5DaGFubmVscyA8PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBhcmFtcy5uQ2hhbm5lbHMgIT0gMSAmJiAhcGFyYW1zLmJJbnRlcmxlYXZlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBwYXJhbXMubkJpdFBlclNhbXBsZSAhPSAxNnUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBwYXJhbXMuZU51bURhdGEgIT0gT01YX051bWVyaWNhbERhdGFTaWduZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBwYXJhbXMuZVBDTU1vZGUgIT0gT01YX0FVRElPX1BDTU1vZGVMaW5lYXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJ1bnN1cHBvcnRlZCBQQ00gcG9ydDogJXUgY2hhbm5lbHMlcywgJXUtYml0LCAlcyglZCksICVzKCVkKSBtb2RlICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5iSW50ZXJsZWF2ZWQgPyAiIGludGVybGVhdmVkIiA6ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMubkJpdFBlclNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcocGFyYW1zLmVOdW1EYXRhKSwgcGFyYW1zLmVOdW1EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc1N0cmluZyhwYXJhbXMuZVBDTU1vZGUpLCBwYXJhbXMuZVBDTU1vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIHBhcmFtcy5uQ2hhbm5lbHMpOwpAQCAtMzY1MCwxMCArNDIwOCwxMSBAQAogICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKIAotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtT01YLT5nZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvQWFjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0dXNfdClPSyk7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb0FhYywgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOwogICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgcGFyYW1zLm5DaGFubmVscyk7CkBAIC0zNjY3LDIxICs0MjI2LDE4IEBACiAgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OwogCi0gICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1PTVgtPmdldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9BbXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvQW1yLCAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgMSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuZUFNUkJhbmRNb2RlID49IE9NWF9BVURJT19BTVJCYW5kTW9kZVdCMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCKTsKLQorICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IpOwogICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCAxNjAwMCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIpOwotCisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQik7CiAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIDgwMDApOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzY5MywxMCArNDI0OSwxMSBAQAogICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKIAotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtT01YLT5nZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvRmxhYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdHVzX3QpT0spOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBtT01YLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9GbGFjLCAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpOwogICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgcGFyYW1zLm5DaGFubmVscyk7CkBAIC0zNzEwLDEwICs0MjY3LDExIEBACiAgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OwogCi0gICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1PTVgtPmdldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9NcDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvTXAzLCAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOwogICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgcGFyYW1zLm5DaGFubmVscyk7CkBAIC0zNzI3LDEwICs0Mjg1LDExIEBACiAgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OwogCi0gICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1PTVgtPmdldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9Wb3JiaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvVm9yYmlzLCAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUyk7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBwYXJhbXMubkNoYW5uZWxzKTsKQEAgLTM3NDQsMTEgKzQzMDMsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CiAKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBtT01YLT5nZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRBYzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocGFyYW1zKSkpOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBtT01YLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWMzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMsIHNpemVvZihwYXJhbXMpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzKTsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIHBhcmFtcy5uQ2hhbm5lbHMpOwpAQCAtMzc2MiwxMSArNDMyMiwxMiBAQAogICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKIAotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIG1PTVgtPmdldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEVhYzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocGFyYW1zKSkpOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBtT01YLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkRWFjMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzMpOwogICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgcGFyYW1zLm5DaGFubmVscyk7CkBAIC0zNzgwLDExICs0MzQxLDEyIEBACiAgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OwogCi0gICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgbU9NWC0+Z2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkT3B1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwYXJhbXMpKSk7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRPcHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMsIHNpemVvZihwYXJhbXMpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUyk7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBwYXJhbXMubkNoYW5uZWxzKTsKQEAgLTM3OTgsMTEgKzQzNjAsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CiAKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBtT01YLT5nZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BdWRpb1BjbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwYXJhbXMpKSk7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BdWRpb1BjbSwgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZSA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuZVBDTU1vZGUgPT0gT01YX0FVRElPX1BDTU1vZGVNVUxhdykgewpAQCAtMzgyMCwzMCArNDM4MiwzMyBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBPTVhfQVVESU9fQ29kaW5nR1NNRlI6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fTVAzVFlQRSBwYXJhbXM7CisgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSBwYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OwogCi0gICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1PTVgtPmdldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9QY20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb1BjbSwgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19NU0dTTSk7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBwYXJhbXMubkNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBwYXJhbXMublNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHBhcmFtcy5uU2FtcGxpbmdSYXRlKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlVOS05PV04gQVVESU8gQ09ESU5HOiAlZFxuIiwgYXVkaW9EZWYtPmVFbmNvZGluZyk7Ci0gICAgICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBhdWRpbyBjb2Rpbmc6ICVzKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc1N0cmluZyhhdWRpb0RlZi0+ZUVuY29kaW5nKSwgYXVkaW9EZWYtPmVFbmNvZGluZyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVFlQRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgZG9tYWluOiAlcyglZCkiLCBhc1N0cmluZyhkZWYuZURvbWFpbiksIGRlZi5lRG9tYWluKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVFlQRTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CkBAIC0zODUzLDcgKzQ0MTgsMTAgQEAKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUJhc2VPdXRwdXRGb3JtYXQtPmR1cCgpOwogICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdE91dHB1dEZvcm1hdENoYW5nZWQpOwogCi0gICAgQ0hFQ0tfRVEoZ2V0UG9ydEZvcm1hdChrUG9ydEluZGV4T3V0cHV0LCBub3RpZnkpLCAoc3RhdHVzX3QpT0spOworICAgIGlmIChnZXRQb3J0Rm9ybWF0KGtQb3J0SW5kZXhPdXRwdXQsIG5vdGlmeSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIlslc10gRmFpbGVkIHRvIGdldCBwb3J0IGZvcm1hdCB0byBzZW5kIGZvcm1hdCBjaGFuZ2UiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAogICAgIEFTdHJpbmcgbWltZTsKICAgICBDSEVDSyhub3RpZnktPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwpAQCAtMzg3Myw5ICs0NDQxLDcgQEAKICAgICAgICAgaWYgKG1Ta2lwQ3V0QnVmZmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgIHNpemVfdCBwcmV2YnVmc2l6ZSA9IG1Ta2lwQ3V0QnVmZmVyLT5zaXplKCk7CiAgICAgICAgICAgICBpZiAocHJldmJ1ZnNpemUgIT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJSZXBsYWNpbmcgU2tpcEN1dEJ1ZmZlciBob2xkaW5nICVkICIKLSAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXMiLAotICAgICAgICAgICAgICAgICAgICAgIHByZXZidWZzaXplKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiUmVwbGFjaW5nIFNraXBDdXRCdWZmZXIgaG9sZGluZyAlenUgYnl0ZXMiLCBwcmV2YnVmc2l6ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbVNraXBDdXRCdWZmZXIgPSBuZXcgU2tpcEN1dEJ1ZmZlcigKQEAgLTM5MDksMTUwICs0NDc1LDYgQEAKICAgICBub3RpZnktPnBvc3QoKTsKIH0KIAotc3RhdHVzX3QgQUNvZGVjOjpwdXNoQmxhbmtCdWZmZXJzVG9OYXRpdmVXaW5kb3coKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gTk9fRVJST1I7Ci0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iID0gTlVMTDsKLSAgICBpbnQgbnVtQnVmcyA9IDA7Ci0gICAgaW50IG1pblVuZGVxdWV1ZWRCdWZzID0gMDsKLQotICAgIC8vIFdlIG5lZWQgdG8gcmVjb25uZWN0IHRvIHRoZSBBTmF0aXZlV2luZG93IGFzIGEgQ1BVIGNsaWVudCB0byBlbnN1cmUgdGhhdAotICAgIC8vIG5vIGZyYW1lcyBnZXQgZHJvcHBlZCBieSBTdXJmYWNlRmxpbmdlciBhc3N1bWluZyB0aGF0IHRoZXNlIGFyZSB2aWRlbwotICAgIC8vIGZyYW1lcy4KLSAgICBlcnIgPSBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KG1OYXRpdmVXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IGFwaV9kaXNjb25uZWN0IGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3QobU5hdGl2ZVdpbmRvdy5nZXQoKSwKLSAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQVBJX0NQVSk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IGFwaV9jb25uZWN0IGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobU5hdGl2ZVdpbmRvdy5nZXQoKSwgMSwgMSwKLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfUkdCWF84ODg4KTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogc2V0X2J1ZmZlcnNfZ2VvbWV0cnkgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfc2NhbGluZ19tb2RlKG1OYXRpdmVXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19TQ0FMSU5HX01PREVfU0NBTEVfVE9fV0lORE9XKTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rX2ZyYW1lczogc2V0X3NjYWxpbmdfbW9kZSBmYWlsZWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UobU5hdGl2ZVdpbmRvdy5nZXQoKSwKLSAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4pOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoImVycm9yIHB1c2hpbmcgYmxhbmsgZnJhbWVzOiBzZXRfdXNhZ2UgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgZXJyID0gbU5hdGl2ZVdpbmRvdy0+cXVlcnkobU5hdGl2ZVdpbmRvdy5nZXQoKSwKLSAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfTUlOX1VOREVRVUVVRURfQlVGRkVSUywgJm1pblVuZGVxdWV1ZWRCdWZzKTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogTUlOX1VOREVRVUVVRURfQlVGRkVSUyBxdWVyeSAiCi0gICAgICAgICAgICAgICAgImZhaWxlZDogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBudW1CdWZzID0gbWluVW5kZXF1ZXVlZEJ1ZnMgKyAxOwotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChtTmF0aXZlV2luZG93LmdldCgpLCBudW1CdWZzKTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogc2V0X2J1ZmZlcl9jb3VudCBmYWlsZWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICAvLyBXZSAgcHVzaCBudW1CdWZzICsgMSBidWZmZXJzIHRvIGVuc3VyZSB0aGF0IHdlJ3ZlIGRyYXduIGludG8gdGhlIHNhbWUKLSAgICAvLyBidWZmZXIgdHdpY2UuICBUaGlzIHNob3VsZCBndWFyYW50ZWUgdGhhdCB0aGUgYnVmZmVyIGhhcyBiZWVuIGRpc3BsYXllZAotICAgIC8vIG9uIHRoZSBzY3JlZW4gYW5kIHRoZW4gYmVlbiByZXBsYWNlZCwgc28gYW4gcHJldmlvdXMgdmlkZW8gZnJhbWVzIGFyZQotICAgIC8vIGd1YXJhbnRlZWQgTk9UIHRvIGJlIGN1cnJlbnRseSBkaXNwbGF5ZWQuCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CdWZzICsgMTsgaSsrKSB7Ci0gICAgICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfZGVxdWV1ZV9idWZmZXJfYW5kX3dhaXQobU5hdGl2ZVdpbmRvdy5nZXQoKSwgJmFuYik7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogZGVxdWV1ZUJ1ZmZlciBmYWlsZWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0KLSAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmKG5ldyBHcmFwaGljQnVmZmVyKGFuYiwgZmFsc2UpKTsKLQotICAgICAgICAvLyBGaWxsIHRoZSBidWZmZXIgd2l0aCB0aGUgYSAxeDEgY2hlY2tlcmJvYXJkIHBhdHRlcm4gOykKLSAgICAgICAgdWludDMyX3QqIGltZyA9IE5VTEw7Ci0gICAgICAgIGVyciA9IGJ1Zi0+bG9jayhHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLCAodm9pZCoqKSgmaW1nKSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogbG9jayBmYWlsZWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0KLSAgICAgICAgKmltZyA9IDA7Ci0KLSAgICAgICAgZXJyID0gYnVmLT51bmxvY2soKTsKLSAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR0UoImVycm9yIHB1c2hpbmcgYmxhbmsgZnJhbWVzOiB1bmxvY2sgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IG1OYXRpdmVXaW5kb3ctPnF1ZXVlQnVmZmVyKG1OYXRpdmVXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICAgICAgYnVmLT5nZXROYXRpdmVCdWZmZXIoKSwgLTEpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IHF1ZXVlQnVmZmVyIGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBhbmIgPSBOVUxMOwotICAgIH0KLQotZXJyb3I6Ci0KLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIC8vIENsZWFuIHVwIGFmdGVyIGFuIGVycm9yLgotICAgICAgICBpZiAoYW5iICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1OYXRpdmVXaW5kb3ctPmNhbmNlbEJ1ZmZlcihtTmF0aXZlV2luZG93LmdldCgpLCBhbmIsIC0xKTsKLSAgICAgICAgfQotCi0gICAgICAgIG5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3QobU5hdGl2ZVdpbmRvdy5nZXQoKSwKLSAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX0FQSV9DUFUpOwotICAgICAgICBuYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KG1OYXRpdmVXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOwotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQ2xlYW4gdXAgYWZ0ZXIgc3VjY2Vzcy4KLSAgICAgICAgZXJyID0gbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdChtTmF0aXZlV2luZG93LmdldCgpLAotICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQVBJX0NQVSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogYXBpX2Rpc2Nvbm5lY3QgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3QobU5hdGl2ZVdpbmRvdy5nZXQoKSwKLSAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogYXBpX2Nvbm5lY3QgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci19Ci0KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIEFDb2RlYzo6UG9ydERlc2NyaXB0aW9uOjpQb3J0RGVzY3JpcHRpb24oKSB7CkBAIC00MTIwLDEyICs0NTQyLDQwIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdE9NWE1lc3NhZ2U6CisgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdE9NWE1lc3NhZ2VMaXN0OgogICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY2hlY2tPTVhNZXNzYWdlKG1zZykgPyBvbk9NWE1lc3NhZ2VMaXN0KG1zZykgOiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0T01YTWVzc2FnZUl0ZW06CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gY2hlY2sgYXMgd2UgYWxyZWFkeSBkaWQgaXQgZm9yIGtXaGF0T01YTWVzc2FnZUxpc3QKICAgICAgICAgICAgIHJldHVybiBvbk9NWE1lc3NhZ2UobXNnKTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdE9NWE1lc3NhZ2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjaGVja09NWE1lc3NhZ2UobXNnKSA/IG9uT01YTWVzc2FnZShtc2cpIDogdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdFNldFN1cmZhY2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCisgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInN1cmZhY2UiLCAmb2JqKSk7CisKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1Db2RlYy0+aGFuZGxlU2V0U3VyZmFjZShzdGF0aWNfY2FzdDxTdXJmYWNlICo+KG9iai5nZXQoKSkpOworCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRDcmVhdGVJbnB1dFN1cmZhY2U6CisgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdFNldElucHV0U3VyZmFjZToKICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0U2lnbmFsRW5kT2ZJbnB1dFN0cmVhbToKICAgICAgICAgewogICAgICAgICAgICAgLy8gVGhpcyBtYXkgcmVzdWx0IGluIGFuIGFwcCBpbGxlZ2FsIHN0YXRlIGV4Y2VwdGlvbi4KQEAgLTQxNjIsMjEgKzQ2MTIsNTEgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBBQ29kZWM6OkJhc2VTdGF0ZTo6b25PTVhNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgaW50MzJfdCB0eXBlOwotICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0eXBlIiwgJnR5cGUpKTsKLQorYm9vbCBBQ29kZWM6OkJhc2VTdGF0ZTo6Y2hlY2tPTVhNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgLy8gdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IHRoaXMgaXMgYW4gb3V0c3RhbmRpbmcgbWVzc2FnZSBmb3IgYQogICAgIC8vIGNvZGVjIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IGRlc3Ryb3llZAotICAgIGlmIChtQ29kZWMtPm1Ob2RlID09IE5VTEwpIHsKKyAgICBpZiAobUNvZGVjLT5tTm9kZSA9PSAwKSB7CiAgICAgICAgIEFMT0dJKCJpZ25vcmluZyBtZXNzYWdlIGFzIGFscmVhZHkgZnJlZWQgY29tcG9uZW50OiAlcyIsCiAgICAgICAgICAgICAgICAgbXNnLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIElPTVg6Om5vZGVfaWQgbm9kZUlEOwogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJub2RlIiwgKGludDMyX3QqKSZub2RlSUQpKTsKLSAgICBDSEVDS19FUShub2RlSUQsIG1Db2RlYy0+bU5vZGUpOworICAgIGlmIChub2RlSUQgIT0gbUNvZGVjLT5tTm9kZSkgeworICAgICAgICBBTE9HRSgiVW5leHBlY3RlZCBtZXNzYWdlIGZvciBub2RlSUQ6ICV1LCBzaG91bGQgaGF2ZSBiZWVuICV1Iiwgbm9kZUlELCBtQ29kZWMtPm1Ob2RlKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBQ29kZWM6OkJhc2VTdGF0ZTo6b25PTVhNZXNzYWdlTGlzdChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoIm1lc3NhZ2VzIiwgJm9iaikpOworICAgIHNwPE1lc3NhZ2VMaXN0PiBtc2dMaXN0ID0gc3RhdGljX2Nhc3Q8TWVzc2FnZUxpc3QgKj4ob2JqLmdldCgpKTsKKworICAgIGJvb2wgcmVjZWl2ZWRSZW5kZXJlZEV2ZW50cyA9IGZhbHNlOworICAgIGZvciAoc3RkOjpsaXN0PHNwPEFNZXNzYWdlPj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbXNnTGlzdC0+Z2V0TGlzdCgpLmNiZWdpbigpOworICAgICAgICAgIGl0ICE9IG1zZ0xpc3QtPmdldExpc3QoKS5jZW5kKCk7ICsraXQpIHsKKyAgICAgICAgKCppdCktPnNldFdoYXQoQUNvZGVjOjprV2hhdE9NWE1lc3NhZ2VJdGVtKTsKKyAgICAgICAgbUNvZGVjLT5oYW5kbGVNZXNzYWdlKCppdCk7CisgICAgICAgIGludDMyX3QgdHlwZTsKKyAgICAgICAgQ0hFQ0soKCppdCktPmZpbmRJbnQzMigidHlwZSIsICZ0eXBlKSk7CisgICAgICAgIGlmICh0eXBlID09IG9teF9tZXNzYWdlOjpGUkFNRV9SRU5ERVJFRCkgeworICAgICAgICAgICAgcmVjZWl2ZWRSZW5kZXJlZEV2ZW50cyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmVjZWl2ZWRSZW5kZXJlZEV2ZW50cykgeworICAgICAgICAvLyBOT1RFOiBhbGwgYnVmZmVycyBhcmUgcmVuZGVyZWQgaW4gdGhpcyBjYXNlCisgICAgICAgIG1Db2RlYy0+bm90aWZ5T2ZSZW5kZXJlZEZyYW1lcygpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBQ29kZWM6OkJhc2VTdGF0ZTo6b25PTVhNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaW50MzJfdCB0eXBlOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0eXBlIiwgJnR5cGUpKTsKIAogICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICBjYXNlIG9teF9tZXNzYWdlOjpFVkVOVDoKQEAgLTQyMDYsOSArNDY4NiwxMiBAQAogICAgICAgICBjYXNlIG9teF9tZXNzYWdlOjpFTVBUWV9CVUZGRVJfRE9ORToKICAgICAgICAgewogICAgICAgICAgICAgSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlcklEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImJ1ZmZlciIsIChpbnQzMl90KikmYnVmZmVySUQpKTsKKyAgICAgICAgICAgIGludDMyX3QgZmVuY2VGZDsKIAotICAgICAgICAgICAgcmV0dXJuIG9uT01YRW1wdHlCdWZmZXJEb25lKGJ1ZmZlcklEKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJidWZmZXIiLCAoaW50MzJfdCopJmJ1ZmZlcklEKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZmVuY2VfZmQiLCAmZmVuY2VGZCkpOworCisgICAgICAgICAgICByZXR1cm4gb25PTVhFbXB0eUJ1ZmZlckRvbmUoYnVmZmVySUQsIGZlbmNlRmQpOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBvbXhfbWVzc2FnZTo6RklMTF9CVUZGRVJfRE9ORToKQEAgLTQyMTYsMzcgKzQ2OTksNTYgQEAKICAgICAgICAgICAgIElPTVg6OmJ1ZmZlcl9pZCBidWZmZXJJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJidWZmZXIiLCAoaW50MzJfdCopJmJ1ZmZlcklEKSk7CiAKLSAgICAgICAgICAgIGludDMyX3QgcmFuZ2VPZmZzZXQsIHJhbmdlTGVuZ3RoLCBmbGFnczsKKyAgICAgICAgICAgIGludDMyX3QgcmFuZ2VPZmZzZXQsIHJhbmdlTGVuZ3RoLCBmbGFncywgZmVuY2VGZDsKICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOwogCiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmFuZ2Vfb2Zmc2V0IiwgJnJhbmdlT2Zmc2V0KSk7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmFuZ2VfbGVuZ3RoIiwgJnJhbmdlTGVuZ3RoKSk7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZmxhZ3MiLCAmZmxhZ3MpKTsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lc3RhbXAiLCAmdGltZVVzKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZmVuY2VfZmQiLCAmZmVuY2VGZCkpOwogCiAgICAgICAgICAgICByZXR1cm4gb25PTVhGaWxsQnVmZmVyRG9uZSgKICAgICAgICAgICAgICAgICAgICAgYnVmZmVySUQsCiAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpcmFuZ2VPZmZzZXQsIChzaXplX3QpcmFuZ2VMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgIChPTVhfVTMyKWZsYWdzLAotICAgICAgICAgICAgICAgICAgICB0aW1lVXMpOworICAgICAgICAgICAgICAgICAgICB0aW1lVXMsCisgICAgICAgICAgICAgICAgICAgIGZlbmNlRmQpOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBvbXhfbWVzc2FnZTo6RlJBTUVfUkVOREVSRUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXMsIHN5c3RlbU5hbm87CisKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJtZWRpYV90aW1lX3VzIiwgJm1lZGlhVGltZVVzKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3lzdGVtX25hbm8iLCAmc3lzdGVtTmFubykpOworCisgICAgICAgICAgICByZXR1cm4gb25PTVhGcmFtZVJlbmRlcmVkKAorICAgICAgICAgICAgICAgICAgICBtZWRpYVRpbWVVcywgc3lzdGVtTmFubyk7CiAgICAgICAgIH0KIAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVFJFU1BBU1MoKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgQUxPR0UoIlVuZXhwZWN0ZWQgbWVzc2FnZSB0eXBlOiAlZCIsIHR5cGUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIH0KIAorYm9vbCBBQ29kZWM6OkJhc2VTdGF0ZTo6b25PTVhGcmFtZVJlbmRlcmVkKAorICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzIF9fdW51c2VkLCBuc2Vjc190IHN5c3RlbU5hbm8gX191bnVzZWQpIHsKKyAgICAvLyBpZ25vcmUgb3V0c2lkZSBvZiBFeGVjdXRpbmcgYW5kIFBvcnRTZXR0aW5nc0NoYW5nZWQgc3RhdGVzCisgICAgcmV0dXJuIHRydWU7Cit9CisKIGJvb2wgQUNvZGVjOjpCYXNlU3RhdGU6Om9uT01YRXZlbnQoCiAgICAgICAgIE9NWF9FVkVOVFRZUEUgZXZlbnQsIE9NWF9VMzIgZGF0YTEsIE9NWF9VMzIgZGF0YTIpIHsKICAgICBpZiAoZXZlbnQgIT0gT01YX0V2ZW50RXJyb3IpIHsKLSAgICAgICAgQUxPR1YoIlslc10gRVZFTlQoJWQsIDB4JTA4bHgsIDB4JTA4bHgpIiwKKyAgICAgICAgQUxPR1YoIlslc10gRVZFTlQoJWQsIDB4JTA4eCwgMHglMDh4KSIsCiAgICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLCBldmVudCwgZGF0YTEsIGRhdGEyKTsKIAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgQUxPR0UoIlslc10gRVJST1IoMHglMDhseCkiLCBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksIGRhdGExKTsKKyAgICBBTE9HRSgiWyVzXSBFUlJPUigweCUwOHgpIiwgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLCBkYXRhMSk7CiAKICAgICAvLyB2ZXJpZnkgT01YIGNvbXBvbmVudCBzZW5kcyBiYWNrIGFuIGVycm9yIHdlIGV4cGVjdC4KICAgICBPTVhfRVJST1JUWVBFIG9teEVycm9yID0gKE9NWF9FUlJPUlRZUEUpZGF0YTE7CkBAIC00MjU5LDE2ICs0NzYxLDI5IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQUNvZGVjOjpCYXNlU3RhdGU6Om9uT01YRW1wdHlCdWZmZXJEb25lKElPTVg6OmJ1ZmZlcl9pZCBidWZmZXJJRCkgewotICAgIEFMT0dWKCJbJXNdIG9uT01YRW1wdHlCdWZmZXJEb25lICVwIiwKK2Jvb2wgQUNvZGVjOjpCYXNlU3RhdGU6Om9uT01YRW1wdHlCdWZmZXJEb25lKElPTVg6OmJ1ZmZlcl9pZCBidWZmZXJJRCwgaW50IGZlbmNlRmQpIHsKKyAgICBBTE9HVigiWyVzXSBvbk9NWEVtcHR5QnVmZmVyRG9uZSAldSIsCiAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksIGJ1ZmZlcklEKTsKIAotICAgIEJ1ZmZlckluZm8gKmluZm8gPQotICAgICAgICBtQ29kZWMtPmZpbmRCdWZmZXJCeUlEKGtQb3J0SW5kZXhJbnB1dCwgYnVmZmVySUQpOwotCi0gICAgQ0hFQ0tfRVEoKGludClpbmZvLT5tU3RhdHVzLCAoaW50KUJ1ZmZlckluZm86Ok9XTkVEX0JZX0NPTVBPTkVOVCk7CisgICAgQnVmZmVySW5mbyAqaW5mbyA9IG1Db2RlYy0+ZmluZEJ1ZmZlckJ5SUQoa1BvcnRJbmRleElucHV0LCBidWZmZXJJRCk7CisgICAgQnVmZmVySW5mbzo6U3RhdHVzIHN0YXR1cyA9IEJ1ZmZlckluZm86OmdldFNhZmVTdGF0dXMoaW5mbyk7CisgICAgaWYgKHN0YXR1cyAhPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9DT01QT05FTlQpIHsKKyAgICAgICAgQUxPR0UoIldyb25nIG93bmVyc2hpcCBpbiBFQkQ6ICVzKCVkKSBidWZmZXIgIyV1IiwgX2FzU3RyaW5nKHN0YXR1cyksIHN0YXR1cywgYnVmZmVySUQpOworICAgICAgICBtQ29kZWMtPmR1bXBCdWZmZXJzKGtQb3J0SW5kZXhJbnB1dCk7CisgICAgICAgIGlmIChmZW5jZUZkID49IDApIHsKKyAgICAgICAgICAgIDo6Y2xvc2UoZmVuY2VGZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICBpbmZvLT5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfVVM7CiAKKyAgICAvLyBpbnB1dCBidWZmZXJzIGNhbm5vdCB0YWtlIGZlbmNlcywgc28gd2FpdCBmb3IgYW55IGZlbmNlIG5vdworICAgICh2b2lkKW1Db2RlYy0+d2FpdEZvckZlbmNlKGZlbmNlRmQsICJvbk9NWEVtcHR5QnVmZmVyRG9uZSIpOworICAgIGZlbmNlRmQgPSAtMTsKKworICAgIC8vIHN0aWxsIHNhdmUgZmVuY2UgZm9yIGNvbXBsZXRlbmVzcworICAgIGluZm8tPnNldFdyaXRlRmVuY2UoZmVuY2VGZCwgIm9uT01YRW1wdHlCdWZmZXJEb25lIik7CisKICAgICAvLyBXZSdyZSBpbiAic3RvcmUtbWV0YWRhdGEtaW4tYnVmZmVycyIgbW9kZSwgdGhlIHVuZGVybHlpbmcKICAgICAvLyBPTVggY29tcG9uZW50IGhhZCBhY2Nlc3MgdG8gZGF0YSB0aGF0J3MgaW1wbGljaXRseSByZWZjb3VudGVkCiAgICAgLy8gYnkgdGhpcyAiTWVkaWFCdWZmZXIiIG9iamVjdC4gTm93IHRoYXQgdGhlIE9NWCBjb21wb25lbnQgaGFzCkBAIC00Mjg2LDEyICs0ODAxLDEwIEBACiAgICAgICAgICAgICBwb3N0RmlsbFRoaXNCdWZmZXIoaW5mbyk7CiAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICBjYXNlIEZSRUVfQlVGRkVSUzoKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltb2RlLCAoaW50KUZSRUVfQlVGRkVSUyk7Ci0gICAgICAgICAgICBUUkVTUEFTUygpOyAgLy8gTm90IGN1cnJlbnRseSB1c2VkCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorICAgICAgICAgICAgQUxPR0UoIlNIT1VMRCBOT1QgUkVBQ0ggSEVSRTogY2Fubm90IGZyZWUgZW1wdHkgb3V0cHV0IGJ1ZmZlcnMiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTQzMTEsNyArNDgyNCw3IEBACiAgICAgaW5mby0+bURhdGEtPm1ldGEoKS0+Y2xlYXIoKTsKICAgICBub3RpZnktPnNldEJ1ZmZlcigiYnVmZmVyIiwgaW5mby0+bURhdGEpOwogCi0gICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKGtXaGF0SW5wdXRCdWZmZXJGaWxsZWQsIG1Db2RlYy0+aWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKGtXaGF0SW5wdXRCdWZmZXJGaWxsZWQsIG1Db2RlYyk7CiAgICAgcmVwbHktPnNldEludDMyKCJidWZmZXItaWQiLCBpbmZvLT5tQnVmZmVySUQpOwogCiAgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJyZXBseSIsIHJlcGx5KTsKQEAgLTQzNTIsNyArNDg2NSwxMyBAQAogICAgIH0KIAogICAgIEJ1ZmZlckluZm8gKmluZm8gPSBtQ29kZWMtPmZpbmRCdWZmZXJCeUlEKGtQb3J0SW5kZXhJbnB1dCwgYnVmZmVySUQpOwotICAgIENIRUNLX0VRKChpbnQpaW5mby0+bVN0YXR1cywgKGludClCdWZmZXJJbmZvOjpPV05FRF9CWV9VUFNUUkVBTSk7CisgICAgQnVmZmVySW5mbzo6U3RhdHVzIHN0YXR1cyA9IEJ1ZmZlckluZm86OmdldFNhZmVTdGF0dXMoaW5mbyk7CisgICAgaWYgKHN0YXR1cyAhPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUFNUUkVBTSkgeworICAgICAgICBBTE9HRSgiV3Jvbmcgb3duZXJzaGlwIGluIElCRjogJXMoJWQpIGJ1ZmZlciAjJXUiLCBfYXNTdHJpbmcoc3RhdHVzKSwgc3RhdHVzLCBidWZmZXJJRCk7CisgICAgICAgIG1Db2RlYy0+ZHVtcEJ1ZmZlcnMoa1BvcnRJbmRleElucHV0KTsKKyAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIEZBSUxFRF9UUkFOU0FDVElPTik7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICBpbmZvLT5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfVVM7CiAKQEAgLTQzNzEsNiArNDg5MCwxMiBAQAogICAgICAgICBjYXNlIFJFU1VCTUlUX0JVRkZFUlM6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCAmJiAhbUNvZGVjLT5tUG9ydEVPU1trUG9ydEluZGV4SW5wdXRdKSB7CisgICAgICAgICAgICAgICAgLy8gRG8gbm90IHNlbmQgZW1wdHkgaW5wdXQgYnVmZmVyIHcvbyBFT1MgdG8gdGhlIGNvbXBvbmVudC4KKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLT5zaXplKCkgPT0gMCAmJiAhZW9zKSB7CisgICAgICAgICAgICAgICAgICAgIHBvc3RGaWxsVGhpc0J1ZmZlcihpbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CiAgICAgICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwogCkBAIC00Mzg2LDI4ICs0OTExLDM0IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBpbmZvLT5tRGF0YSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBOZWVkcyB0byBjb3B5IGlucHV0IGRhdGEgZm9yIGJ1ZmZlciAlcC4gKCVwICE9ICVwKSIsCisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIE5lZWRzIHRvIGNvcHkgaW5wdXQgZGF0YSBmb3IgYnVmZmVyICV1LiAoJXAgIT0gJXApIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmdldCgpLCBpbmZvLT5tRGF0YS5nZXQoKSk7CiAKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfTEUoYnVmZmVyLT5zaXplKCksIGluZm8tPm1EYXRhLT5jYXBhY2l0eSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpID4gaW5mby0+bURhdGEtPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJkYXRhIHNpemUgKCV6dSkgaXMgZ3JlYXRlZCB0aGFuIGJ1ZmZlciBjYXBhY2l0eSAoJXp1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2l6ZSgpLCAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgZGF0YSByZWNlaXZlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5tRGF0YS0+Y2FwYWNpdHkoKSk7IC8vIHRoaXMgaXMgb3V0IGJ1ZmZlciBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgRkFJTEVEX1RSQU5TQUNUSU9OKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtZW1jcHkoaW5mby0+bURhdGEtPmRhdGEoKSwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBjYWxsaW5nIGVtcHR5QnVmZmVyICVwIHcvIGNvZGVjIHNwZWNpZmljIGRhdGEiLAorICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBjYWxsaW5nIGVtcHR5QnVmZmVyICV1IHcvIGNvZGVjIHNwZWNpZmljIGRhdGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgYnVmZmVySUQpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gY2FsbGluZyBlbXB0eUJ1ZmZlciAlcCB3LyBFT1MiLAorICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBjYWxsaW5nIGVtcHR5QnVmZmVyICV1IHcvIEVPUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLCBidWZmZXJJRCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICNpZiBUUkFDS19CVUZGRVJfVElNSU5HCi0gICAgICAgICAgICAgICAgICAgIEFMT0dJKCJbJXNdIGNhbGxpbmcgZW1wdHlCdWZmZXIgJXAgdy8gdGltZSAlbGxkIHVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksIGJ1ZmZlcklELCB0aW1lVXMpOworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiWyVzXSBjYWxsaW5nIGVtcHR5QnVmZmVyICV1IHcvIHRpbWUgJWxsZCB1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLCBidWZmZXJJRCwgKGxvbmcgbG9uZyl0aW1lVXMpOwogI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gY2FsbGluZyBlbXB0eUJ1ZmZlciAlcCB3LyB0aW1lICVsbGQgdXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgYnVmZmVySUQsIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIGNhbGxpbmcgZW1wdHlCdWZmZXIgJXUgdy8gdGltZSAlbGxkIHVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksIGJ1ZmZlcklELCAobG9uZyBsb25nKXRpbWVVcyk7CiAjZW5kaWYKICAgICAgICAgICAgICAgICB9CiAKQEAgLTQ0MTgsNjEgKzQ5NDksNjkgQEAKICAgICAgICAgICAgICAgICBtQ29kZWMtPm1CdWZmZXJTdGF0cy5hZGQodGltZVVzLCBzdGF0cyk7CiAjZW5kaWYKIAotICAgICAgICAgICAgICAgIGlmIChtQ29kZWMtPm1TdG9yZU1ldGFEYXRhSW5PdXRwdXRCdWZmZXJzKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Db2RlYy0+c3RvcmluZ01ldGFkYXRhSW5EZWNvZGVkQnVmZmVycygpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHRyeSB0byBzdWJtaXQgYW4gb3V0cHV0IGJ1ZmZlciBmb3IgZWFjaCBpbnB1dCBidWZmZXIKICAgICAgICAgICAgICAgICAgICAgUG9ydE1vZGUgb3V0cHV0TW9kZSA9IGdldFBvcnRNb2RlKGtQb3J0SW5kZXhPdXRwdXQpOwogCi0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJNZXRhRGF0YUJ1ZmZlcnNUb1N1Ym1pdD0ldSBwb3J0TW9kZT0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tTWV0YURhdGFCdWZmZXJzVG9TdWJtaXQsCisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJNZXRhZGF0YUJ1ZmZlcnNUb1N1Ym1pdD0ldSBwb3J0TW9kZT0lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tTWV0YWRhdGFCdWZmZXJzVG9TdWJtaXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHB1dE1vZGUgPT0gRlJFRV9CVUZGRVJTID8gIkZSRUUiIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0TW9kZSA9PSBLRUVQX0JVRkZFUlMgPyAiS0VFUCIgOiAiUkVTVUJNSVQiKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRNb2RlID09IFJFU1VCTUlUX0JVRkZFUlMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+c3VibWl0T3V0cHV0TWV0YURhdGFCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+c3VibWl0T3V0cHV0TWV0YWRhdGFCdWZmZXIoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIENIRUNLX0VRKG1Db2RlYy0+bU9NWC0+ZW1wdHlCdWZmZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVVcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKLQorICAgICAgICAgICAgICAgIGluZm8tPmNoZWNrUmVhZEZlbmNlKCJvbklucHV0QnVmZmVyRmlsbGVkIik7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyMiA9IG1Db2RlYy0+bU9NWC0+ZW1wdHlCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcklELAorICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICBidWZmZXItPnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIHRpbWVVcywKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+bUZlbmNlRmQpOworICAgICAgICAgICAgICAgIGluZm8tPm1GZW5jZUZkID0gLTE7CisgICAgICAgICAgICAgICAgaWYgKGVycjIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIG1ha2VOb1NpZGVFZmZlY3RTdGF0dXMoZXJyMikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9DT01QT05FTlQ7CiAKLSAgICAgICAgICAgICAgICBpZiAoIWVvcykgeworICAgICAgICAgICAgICAgIGlmICghZW9zICYmIGVyciA9PSBPSykgewogICAgICAgICAgICAgICAgICAgICBnZXRNb3JlSW5wdXREYXRhSWZQb3NzaWJsZSgpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIFNpZ25hbGxlZCBFT1Mgb24gdGhlIGlucHV0IHBvcnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIFNpZ25hbGxlZCBFT1MgKCVkKSBvbiB0aGUgaW5wdXQgcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOwogCiAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bVBvcnRFT1Nba1BvcnRJbmRleElucHV0XSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUlucHV0RU9TUmVzdWx0ID0gZXJyOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1Db2RlYy0+bVBvcnRFT1Nba1BvcnRJbmRleElucHV0XSkgewotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBTaWduYWxsaW5nIEVPUyBvbiB0aGUgaW5wdXQgcG9ydCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgImR1ZSB0byBlcnJvciAlZCIsCisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSyAmJiBlcnIgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBTaWduYWxsaW5nIEVPUyBvbiB0aGUgaW5wdXQgcG9ydCBkdWUgdG8gZXJyb3IgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBTaWduYWxsaW5nIEVPUyBvbiB0aGUgaW5wdXQgcG9ydCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBjYWxsaW5nIGVtcHR5QnVmZmVyICVwIHNpZ25hbGxpbmcgRU9TIiwKKyAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBjYWxsaW5nIGVtcHR5QnVmZmVyICV1IHNpZ25hbGxpbmcgRU9TIiwKICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgYnVmZmVySUQpOwogCi0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEobUNvZGVjLT5tT01YLT5lbXB0eUJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Ob2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQlVGRkVSRkxBR19FT1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKLQorICAgICAgICAgICAgICAgIGluZm8tPmNoZWNrUmVhZEZlbmNlKCJvbklucHV0QnVmZmVyRmlsbGVkIik7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyMiA9IG1Db2RlYy0+bU9NWC0+ZW1wdHlCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Ob2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJGTEFHX0VPUywKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5tRmVuY2VGZCk7CisgICAgICAgICAgICAgICAgaW5mby0+bUZlbmNlRmQgPSAtMTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyMiAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgbWFrZU5vU2lkZUVmZmVjdFN0YXR1cyhlcnIyKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX0NPTVBPTkVOVDsKIAogICAgICAgICAgICAgICAgIG1Db2RlYy0+bVBvcnRFT1Nba1BvcnRJbmRleElucHV0XSA9IHRydWU7CkBAIC00NDgxLDggKzUwMjAsMTEgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBGUkVFX0JVRkZFUlM6CisgICAgICAgICAgICBicmVhazsKKwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltb2RlLCAoaW50KUZSRUVfQlVGRkVSUyk7CisgICAgICAgICAgICBBTE9HRSgiaW52YWxpZCBwb3J0IG1vZGU6ICVkIiwgbW9kZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiB9CkBAIC00NTIwLDExICs1MDYyLDEzIEBACiAgICAgICAgIElPTVg6OmJ1ZmZlcl9pZCBidWZmZXJJRCwKICAgICAgICAgc2l6ZV90IHJhbmdlT2Zmc2V0LCBzaXplX3QgcmFuZ2VMZW5ndGgsCiAgICAgICAgIE9NWF9VMzIgZmxhZ3MsCi0gICAgICAgIGludDY0X3QgdGltZVVzKSB7CisgICAgICAgIGludDY0X3QgdGltZVVzLAorICAgICAgICBpbnQgZmVuY2VGZCkgewogICAgIEFMT0dWKCJbJXNdIG9uT01YRmlsbEJ1ZmZlckRvbmUgJXUgdGltZSAlIiBQUklkNjQgIiB1cywgZmxhZ3MgPSAweCUwOHgiLAogICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLCBidWZmZXJJRCwgdGltZVVzLCBmbGFncyk7CiAKICAgICBzc2l6ZV90IGluZGV4OworICAgIHN0YXR1c190IGVycj0gT0s7CiAKICNpZiBUUkFDS19CVUZGRVJfVElNSU5HCiAgICAgaW5kZXggPSBtQ29kZWMtPm1CdWZmZXJTdGF0cy5pbmRleE9mS2V5KHRpbWVVcyk7CkBAIC00NTQzLDEyICs1MDg3LDM2IEBACiAKICAgICBCdWZmZXJJbmZvICppbmZvID0KICAgICAgICAgbUNvZGVjLT5maW5kQnVmZmVyQnlJRChrUG9ydEluZGV4T3V0cHV0LCBidWZmZXJJRCwgJmluZGV4KTsKLQotICAgIENIRUNLX0VRKChpbnQpaW5mby0+bVN0YXR1cywgKGludClCdWZmZXJJbmZvOjpPV05FRF9CWV9DT01QT05FTlQpOworICAgIEJ1ZmZlckluZm86OlN0YXR1cyBzdGF0dXMgPSBCdWZmZXJJbmZvOjpnZXRTYWZlU3RhdHVzKGluZm8pOworICAgIGlmIChzdGF0dXMgIT0gQnVmZmVySW5mbzo6T1dORURfQllfQ09NUE9ORU5UKSB7CisgICAgICAgIEFMT0dFKCJXcm9uZyBvd25lcnNoaXAgaW4gRkJEOiAlcyglZCkgYnVmZmVyICMldSIsIF9hc1N0cmluZyhzdGF0dXMpLCBzdGF0dXMsIGJ1ZmZlcklEKTsKKyAgICAgICAgbUNvZGVjLT5kdW1wQnVmZmVycyhrUG9ydEluZGV4T3V0cHV0KTsKKyAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIEZBSUxFRF9UUkFOU0FDVElPTik7CisgICAgICAgIGlmIChmZW5jZUZkID49IDApIHsKKyAgICAgICAgICAgIDo6Y2xvc2UoZmVuY2VGZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogCiAgICAgaW5mby0+bURlcXVldWVkQXQgPSArK21Db2RlYy0+bURlcXVldWVDb3VudGVyOwogICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUzsKIAorICAgIGlmIChpbmZvLT5tUmVuZGVySW5mbyAhPSBOVUxMKSB7CisgICAgICAgIC8vIFRoZSBmZW5jZSBmb3IgYW4gZW1wdGllZCBidWZmZXIgbXVzdCBoYXZlIHNpZ25hbGVkLCBidXQgdGhlcmUgc3RpbGwgY291bGQgYmUgcXVldWVkCisgICAgICAgIC8vIG9yIG91dC1vZi1vcmRlciBkZXF1ZXVlZCBidWZmZXJzIGluIHRoZSByZW5kZXIgcXVldWUgcHJpb3IgdG8gdGhpcyBidWZmZXIuIERyb3AgdGhlc2UsCisgICAgICAgIC8vIGFzIHdlIHdpbGwgc29vbiByZXF1ZXVlIHRoaXMgYnVmZmVyIHRvIHRoZSBzdXJmYWNlLiBXaGlsZSBpbiB0aGVvcnkgd2UgY291bGQgc3RpbGwga2VlcAorICAgICAgICAvLyB0cmFjayBvZiBidWZmZXJzIHRoYXQgYXJlIHJlcXVldWVkIHRvIHRoZSBzdXJmYWNlLCBpdCBpcyBiZXR0ZXIgdG8gYWRkIHN1cHBvcnQgdG8gdGhlCisgICAgICAgIC8vIGJ1ZmZlci1xdWV1ZSB0byBub3RpZnkgdXMgb2YgcmVsZWFzZWQgYnVmZmVycyBhbmQgdGhlaXIgZmVuY2VzIChpbiB0aGUgZnV0dXJlKS4KKyAgICAgICAgbUNvZGVjLT5ub3RpZnlPZlJlbmRlcmVkRnJhbWVzKHRydWUgLyogZHJvcEluY29tcGxldGUgKi8pOworICAgIH0KKworICAgIC8vIGJ5dGUgYnVmZmVycyBjYW5ub3QgdGFrZSBmZW5jZXMsIHNvIHdhaXQgZm9yIGFueSBmZW5jZSBub3cKKyAgICBpZiAobUNvZGVjLT5tTmF0aXZlV2luZG93ID09IE5VTEwpIHsKKyAgICAgICAgKHZvaWQpbUNvZGVjLT53YWl0Rm9yRmVuY2UoZmVuY2VGZCwgIm9uT01YRmlsbEJ1ZmZlckRvbmUiKTsKKyAgICAgICAgZmVuY2VGZCA9IC0xOworICAgIH0KKyAgICBpbmZvLT5zZXRSZWFkRmVuY2UoZmVuY2VGZCwgIm9uT01YRmlsbEJ1ZmZlckRvbmUiKTsKKwogICAgIFBvcnRNb2RlIG1vZGUgPSBnZXRQb3J0TW9kZShrUG9ydEluZGV4T3V0cHV0KTsKIAogICAgIHN3aXRjaCAobW9kZSkgewpAQCAtNDU2MiwyNCArNTEzMCwzOSBAQAogICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIGNhbGxpbmcgZmlsbEJ1ZmZlciAldSIsCiAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksIGluZm8tPm1CdWZmZXJJRCk7CiAKLSAgICAgICAgICAgICAgICBDSEVDS19FUShtQ29kZWMtPm1PTVgtPmZpbGxCdWZmZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tTm9kZSwgaW5mby0+bUJ1ZmZlcklEKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdHVzX3QpT0spOworICAgICAgICAgICAgICAgIGVyciA9IG1Db2RlYy0+bU9NWC0+ZmlsbEJ1ZmZlcihtQ29kZWMtPm1Ob2RlLCBpbmZvLT5tQnVmZmVySUQsIGluZm8tPm1GZW5jZUZkKTsKKyAgICAgICAgICAgICAgICBpbmZvLT5tRmVuY2VGZCA9IC0xOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIG1ha2VOb1NpZGVFZmZlY3RTdGF0dXMoZXJyKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9DT01QT05FTlQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9Ci0gICAgICAgICAgICAgICAgbmV3IEFNZXNzYWdlKGtXaGF0T3V0cHV0QnVmZmVyRHJhaW5lZCwgbUNvZGVjLT5pZCgpKTsKKyAgICAgICAgICAgICAgICBuZXcgQU1lc3NhZ2Uoa1doYXRPdXRwdXRCdWZmZXJEcmFpbmVkLCBtQ29kZWMpOwogCiAgICAgICAgICAgICBpZiAoIW1Db2RlYy0+bVNlbnRGb3JtYXQgJiYgcmFuZ2VMZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgbUNvZGVjLT5zZW5kRm9ybWF0Q2hhbmdlKHJlcGx5KTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Db2RlYy0+bVVzZU1ldGFkYXRhT25FbmNvZGVyT3V0cHV0KSB7Ci0gICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgKihuYXRpdmVfaGFuZGxlX3QqKikoaW5mby0+bURhdGEtPmRhdGEoKSArIDQpOworICAgICAgICAgICAgaWYgKG1Db2RlYy0+dXNpbmdNZXRhZGF0YU9uRW5jb2Rlck91dHB1dCgpKSB7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBOVUxMOworICAgICAgICAgICAgICAgIFZpZGVvR3JhbGxvY01ldGFkYXRhICZncmFsbG9jTWV0YSA9ICooVmlkZW9HcmFsbG9jTWV0YWRhdGEgKilpbmZvLT5tRGF0YS0+ZGF0YSgpOworICAgICAgICAgICAgICAgIFZpZGVvTmF0aXZlTWV0YWRhdGEgJm5hdGl2ZU1ldGEgPSAqKFZpZGVvTmF0aXZlTWV0YWRhdGEgKilpbmZvLT5tRGF0YS0+ZGF0YSgpOworICAgICAgICAgICAgICAgIGlmIChpbmZvLT5tRGF0YS0+c2l6ZSgpID49IHNpemVvZihncmFsbG9jTWV0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGdyYWxsb2NNZXRhLmVUeXBlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKSB7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZSA9IChuYXRpdmVfaGFuZGxlX3QgKikodWludHB0cl90KWdyYWxsb2NNZXRhLnBIYW5kbGU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmZvLT5tRGF0YS0+c2l6ZSgpID49IHNpemVvZihuYXRpdmVNZXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgbmF0aXZlTWV0YS5lVHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyKSB7CisjaWZkZWYgT01YX0FORFJPSURfQ09NUElMRV9BU18zMkJJVF9PTl82NEJJVF9QTEFURk9STVMKKyAgICAgICAgICAgICAgICAgICAgLy8gQU5hdGl2ZVdpbmRvd0J1ZmZlciBpcyBvbmx5IHZhbGlkIG9uIDMyLWJpdC9tZWRpYXNlcnZlciBwcm9jZXNzCisgICAgICAgICAgICAgICAgICAgIGhhbmRsZSA9IE5VTEw7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICBoYW5kbGUgPSAobmF0aXZlX2hhbmRsZV90ICopbmF0aXZlTWV0YS5wQnVmZmVyLT5oYW5kbGU7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW5mby0+bURhdGEtPm1ldGEoKS0+c2V0UG9pbnRlcigiaGFuZGxlIiwgaGFuZGxlKTsKICAgICAgICAgICAgICAgICBpbmZvLT5tRGF0YS0+bWV0YSgpLT5zZXRJbnQzMigicmFuZ2VPZmZzZXQiLCByYW5nZU9mZnNldCk7CiAgICAgICAgICAgICAgICAgaW5mby0+bURhdGEtPm1ldGEoKS0+c2V0SW50MzIoInJhbmdlTGVuZ3RoIiwgcmFuZ2VMZW5ndGgpOwpAQCAtNDYyNiwxNCArNTIwOSwxNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICBDSEVDS19FUSgoaW50KW1vZGUsIChpbnQpRlJFRV9CVUZGRVJTKTsKLQotICAgICAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLAotICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5mcmVlQnVmZmVyKGtQb3J0SW5kZXhPdXRwdXQsIGluZGV4KSk7CisgICAgICAgIGNhc2UgRlJFRV9CVUZGRVJTOgorICAgICAgICAgICAgZXJyID0gbUNvZGVjLT5mcmVlQnVmZmVyKGtQb3J0SW5kZXhPdXRwdXQsIGluZGV4KTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgbWFrZU5vU2lkZUVmZmVjdFN0YXR1cyhlcnIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHBvcnQgbW9kZTogJWQiLCBtb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTQ2NDMsMTUgKzUyMjksMTkgQEAKICAgICBJT01YOjpidWZmZXJfaWQgYnVmZmVySUQ7CiAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImJ1ZmZlci1pZCIsIChpbnQzMl90KikmYnVmZmVySUQpKTsKICAgICBzc2l6ZV90IGluZGV4OwotICAgIEJ1ZmZlckluZm8gKmluZm8gPQotICAgICAgICBtQ29kZWMtPmZpbmRCdWZmZXJCeUlEKGtQb3J0SW5kZXhPdXRwdXQsIGJ1ZmZlcklELCAmaW5kZXgpOwotICAgIENIRUNLX0VRKChpbnQpaW5mby0+bVN0YXR1cywgKGludClCdWZmZXJJbmZvOjpPV05FRF9CWV9ET1dOU1RSRUFNKTsKKyAgICBCdWZmZXJJbmZvICppbmZvID0gbUNvZGVjLT5maW5kQnVmZmVyQnlJRChrUG9ydEluZGV4T3V0cHV0LCBidWZmZXJJRCwgJmluZGV4KTsKKyAgICBCdWZmZXJJbmZvOjpTdGF0dXMgc3RhdHVzID0gQnVmZmVySW5mbzo6Z2V0U2FmZVN0YXR1cyhpbmZvKTsKKyAgICBpZiAoc3RhdHVzICE9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX0RPV05TVFJFQU0pIHsKKyAgICAgICAgQUxPR0UoIldyb25nIG93bmVyc2hpcCBpbiBPQkQ6ICVzKCVkKSBidWZmZXIgIyV1IiwgX2FzU3RyaW5nKHN0YXR1cyksIHN0YXR1cywgYnVmZmVySUQpOworICAgICAgICBtQ29kZWMtPmR1bXBCdWZmZXJzKGtQb3J0SW5kZXhPdXRwdXQpOworICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgRkFJTEVEX1RSQU5TQUNUSU9OKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAogICAgIGFuZHJvaWRfbmF0aXZlX3JlY3RfdCBjcm9wOwotICAgIGlmIChtc2ctPmZpbmRSZWN0KCJjcm9wIiwKLSAgICAgICAgICAgICZjcm9wLmxlZnQsICZjcm9wLnRvcCwgJmNyb3AucmlnaHQsICZjcm9wLmJvdHRvbSkpIHsKLSAgICAgICAgQ0hFQ0tfRVEoMCwgbmF0aXZlX3dpbmRvd19zZXRfY3JvcCgKLSAgICAgICAgICAgICAgICBtQ29kZWMtPm1OYXRpdmVXaW5kb3cuZ2V0KCksICZjcm9wKSk7CisgICAgaWYgKG1zZy0+ZmluZFJlY3QoImNyb3AiLCAmY3JvcC5sZWZ0LCAmY3JvcC50b3AsICZjcm9wLnJpZ2h0LCAmY3JvcC5ib3R0b20pKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2Nyb3AobUNvZGVjLT5tTmF0aXZlV2luZG93LmdldCgpLCAmY3JvcCk7CisgICAgICAgIEFMT0dXX0lGKGVyciAhPSBOT19FUlJPUiwgImZhaWxlZCB0byBzZXQgY3JvcDogJWQiLCBlcnIpOwogICAgIH0KIAogICAgIGludDMyX3QgcmVuZGVyOwpAQCAtNDY2MSwzNyArNTI1MSw0NSBAQAogICAgICAgICBBVFJBQ0VfTkFNRSgicmVuZGVyIik7CiAgICAgICAgIC8vIFRoZSBjbGllbnQgd2FudHMgdGhpcyBidWZmZXIgdG8gYmUgcmVuZGVyZWQuCiAKKyAgICAgICAgLy8gc2F2ZSBidWZmZXJzIHNlbnQgdG8gdGhlIHN1cmZhY2Ugc28gd2UgY2FuIGdldCByZW5kZXIgdGltZSB3aGVuIHRoZXkgcmV0dXJuCisgICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXMgPSAtMTsKKyAgICAgICAgaW5mby0+bURhdGEtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpOworICAgICAgICBpZiAobWVkaWFUaW1lVXMgPj0gMCkgeworICAgICAgICAgICAgbUNvZGVjLT5tUmVuZGVyVHJhY2tlci5vbkZyYW1lUXVldWVkKAorICAgICAgICAgICAgICAgICAgICBtZWRpYVRpbWVVcywgaW5mby0+bUdyYXBoaWNCdWZmZXIsIG5ldyBGZW5jZSg6OmR1cChpbmZvLT5tRmVuY2VGZCkpKTsKKyAgICAgICAgfQorCiAgICAgICAgIGludDY0X3QgdGltZXN0YW1wTnMgPSAwOwogICAgICAgICBpZiAoIW1zZy0+ZmluZEludDY0KCJ0aW1lc3RhbXBOcyIsICZ0aW1lc3RhbXBOcykpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IGl0IHNlZW1zIGxpa2Ugd2Ugc2hvdWxkIHVzZSB0aGUgdGltZXN0YW1wCi0gICAgICAgICAgICAvLyBpbiB0aGUgKG1lZGlhKWJ1ZmZlciBhcyBpdCBwb3RlbnRpYWxseSBjYW1lIGZyb20KLSAgICAgICAgICAgIC8vIGFuIGlucHV0IHN1cmZhY2UsIGJ1dCB3ZSBkaWQgbm90IHByb3BhZ2F0ZSBpdCBwcmlvciB0bwotICAgICAgICAgICAgLy8gQVBJIDIwLiAgUGVyaGFwcyBjaGVjayBmb3IgdGFyZ2V0IFNESyB2ZXJzaW9uLgotI2lmIDAKKyAgICAgICAgICAgIC8vIHVzZSBtZWRpYSB0aW1lc3RhbXAgaWYgY2xpZW50IGRpZCBub3QgcmVxdWVzdCBhIHNwZWNpZmljIHJlbmRlciB0aW1lc3RhbXAKICAgICAgICAgICAgIGlmIChpbmZvLT5tRGF0YS0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lc3RhbXBOcykpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigidXNpbmcgYnVmZmVyIFBUUyBvZiAlIiBQUklkNjQsIHRpbWVzdGFtcE5zKTsKKyAgICAgICAgICAgICAgICBBTE9HVigidXNpbmcgYnVmZmVyIFBUUyBvZiAlbGxkIiwgKGxvbmcgbG9uZyl0aW1lc3RhbXBOcyk7CiAgICAgICAgICAgICAgICAgdGltZXN0YW1wTnMgKj0gMTAwMDsKICAgICAgICAgICAgIH0KLSNlbmRpZgogICAgICAgICB9CiAKICAgICAgICAgc3RhdHVzX3QgZXJyOwogICAgICAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RpbWVzdGFtcChtQ29kZWMtPm1OYXRpdmVXaW5kb3cuZ2V0KCksIHRpbWVzdGFtcE5zKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR1coImZhaWxlZCB0byBzZXQgYnVmZmVyIHRpbWVzdGFtcDogJWQiLCBlcnIpOwotICAgICAgICB9CisgICAgICAgIEFMT0dXX0lGKGVyciAhPSBOT19FUlJPUiwgImZhaWxlZCB0byBzZXQgYnVmZmVyIHRpbWVzdGFtcDogJWQiLCBlcnIpOwogCi0gICAgICAgIGlmICgoZXJyID0gbUNvZGVjLT5tTmF0aXZlV2luZG93LT5xdWV1ZUJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tTmF0aXZlV2luZG93LmdldCgpLAotICAgICAgICAgICAgICAgICAgICBpbmZvLT5tR3JhcGhpY0J1ZmZlci5nZXQoKSwgLTEpKSA9PSBPSykgeworICAgICAgICBpbmZvLT5jaGVja1JlYWRGZW5jZSgib25PdXRwdXRCdWZmZXJEcmFpbmVkIGJlZm9yZSBxdWV1ZUJ1ZmZlciIpOworICAgICAgICBlcnIgPSBtQ29kZWMtPm1OYXRpdmVXaW5kb3ctPnF1ZXVlQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1OYXRpdmVXaW5kb3cuZ2V0KCksIGluZm8tPm1HcmFwaGljQnVmZmVyLmdldCgpLCBpbmZvLT5tRmVuY2VGZCk7CisgICAgICAgIGluZm8tPm1GZW5jZUZkID0gLTE7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9OQVRJVkVfV0lORE9XOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoInF1ZXVlQnVmZmVyIGZhaWxlZCBpbiBvbk91dHB1dEJ1ZmZlckRyYWluZWQ6ICVkIiwgZXJyKTsKICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBtYWtlTm9TaWRlRWZmZWN0U3RhdHVzKGVycikpOwogICAgICAgICAgICAgaW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTOworICAgICAgICAgICAgLy8ga2VlcGluZyByZWFkIGZlbmNlIGFzIHdyaXRlIGZlbmNlIHRvIGF2b2lkIGNsb2JiZXJpbmcKKyAgICAgICAgICAgIGluZm8tPm1Jc1JlYWRGZW5jZSA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKG1Db2RlYy0+bU5hdGl2ZVdpbmRvdyAhPSBOVUxMICYmCiAgICAgICAgICAgICAoaW5mby0+bURhdGEgPT0gTlVMTCB8fCBpbmZvLT5tRGF0YS0+c2l6ZSgpICE9IDApKSB7CisgICAgICAgICAgICAvLyBtb3ZlIHJlYWQgZmVuY2UgaW50byB3cml0ZSBmZW5jZSB0byBhdm9pZCBjbG9iYmVyaW5nCisgICAgICAgICAgICBpbmZvLT5tSXNSZWFkRmVuY2UgPSBmYWxzZTsKICAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJmcmFtZS1kcm9wIik7CiAgICAgICAgIH0KICAgICAgICAgaW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTOwpAQCAtNDcyNiwyNCArNTMyNCwzMiBAQAogICAgICAgICAgICAgICAgIGlmIChpbmZvICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gY2FsbGluZyBmaWxsQnVmZmVyICV1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksIGluZm8tPm1CdWZmZXJJRCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobUNvZGVjLT5tT01YLT5maWxsQnVmZmVyKG1Db2RlYy0+bU5vZGUsIGluZm8tPm1CdWZmZXJJRCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0dXNfdClPSyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX0NPTVBPTkVOVDsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+Y2hlY2tXcml0ZUZlbmNlKCJvbk91dHB1dEJ1ZmZlckRyYWluZWQ6OlJFU1VCTUlUX0JVRkZFUlMiKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvZGVjLT5tT01YLT5maWxsQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsIGluZm8tPm1CdWZmZXJJRCwgaW5mby0+bUZlbmNlRmQpOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5tRmVuY2VGZCA9IC0xOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfQ09NUE9ORU5UOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIG1ha2VOb1NpZGVFZmZlY3RTdGF0dXMoZXJyKSk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhc2UgRlJFRV9CVUZGRVJTOgogICAgICAgICB7Ci0gICAgICAgICAgICBDSEVDS19FUSgoaW50KW1vZGUsIChpbnQpRlJFRV9CVUZGRVJTKTsKLQotICAgICAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLAotICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5mcmVlQnVmZmVyKGtQb3J0SW5kZXhPdXRwdXQsIGluZGV4KSk7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29kZWMtPmZyZWVCdWZmZXIoa1BvcnRJbmRleE91dHB1dCwgaW5kZXgpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBtYWtlTm9TaWRlRWZmZWN0U3RhdHVzKGVycikpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgcG9ydCBtb2RlOiAlZCIsIG1vZGUpOworICAgICAgICAgICAgcmV0dXJuOwogICAgIH0KIH0KIApAQCAtNDc2MiwxMSArNTM2OCwxMyBAQAogICAgIH0KIAogICAgIG1Db2RlYy0+bU5hdGl2ZVdpbmRvdy5jbGVhcigpOwotICAgIG1Db2RlYy0+bU5vZGUgPSBOVUxMOworICAgIG1Db2RlYy0+bU5hdGl2ZVdpbmRvd1VzYWdlQml0cyA9IDA7CisgICAgbUNvZGVjLT5tTm9kZSA9IDA7CiAgICAgbUNvZGVjLT5tT01YLmNsZWFyKCk7CiAgICAgbUNvZGVjLT5tUXVpcmtzID0gMDsKICAgICBtQ29kZWMtPm1GbGFncyA9IDA7Ci0gICAgbUNvZGVjLT5tVXNlTWV0YWRhdGFPbkVuY29kZXJPdXRwdXQgPSAwOworICAgIG1Db2RlYy0+bUlucHV0TWV0YWRhdGFUeXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZUludmFsaWQ7CisgICAgbUNvZGVjLT5tT3V0cHV0TWV0YWRhdGFUeXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZUludmFsaWQ7CiAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jbGVhcigpOwogfQogCkBAIC00ODQwLDE0ICs1NDQ4LDE3IEBACiBib29sIEFDb2RlYzo6VW5pbml0aWFsaXplZFN0YXRlOjpvbkFsbG9jYXRlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgQUxPR1YoIm9uQWxsb2NhdGVDb21wb25lbnQiKTsKIAotICAgIENIRUNLKG1Db2RlYy0+bU5vZGUgPT0gTlVMTCk7CisgICAgQ0hFQ0sobUNvZGVjLT5tTm9kZSA9PSAwKTsKIAogICAgIE9NWENsaWVudCBjbGllbnQ7Ci0gICAgQ0hFQ0tfRVEoY2xpZW50LmNvbm5lY3QoKSwgKHN0YXR1c190KU9LKTsKKyAgICBpZiAoY2xpZW50LmNvbm5lY3QoKSAhPSBPSykgeworICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgTk9fSU5JVCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKICAgICBzcDxJT01YPiBvbXggPSBjbGllbnQuaW50ZXJmYWNlKCk7CiAKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0T01YRGllZCwgbUNvZGVjLT5pZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0T01YRGllZCwgbUNvZGVjKTsKIAogICAgIG1EZWF0aE5vdGlmaWVyID0gbmV3IERlYXRoTm90aWZpZXIobm90aWZ5KTsKICAgICBpZiAoSUludGVyZmFjZTo6YXNCaW5kZXIob214KS0+bGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIpICE9IE9LKSB7CkBAIC00ODg4LDggKzU0OTksOSBAQAogICAgIH0KIAogICAgIHNwPENvZGVjT2JzZXJ2ZXI+IG9ic2VydmVyID0gbmV3IENvZGVjT2JzZXJ2ZXI7Ci0gICAgSU9NWDo6bm9kZV9pZCBub2RlID0gTlVMTDsKKyAgICBJT01YOjpub2RlX2lkIG5vZGUgPSAwOwogCisgICAgc3RhdHVzX3QgZXJyID0gTkFNRV9OT1RfRk9VTkQ7CiAgICAgZm9yIChzaXplX3QgbWF0Y2hJbmRleCA9IDA7IG1hdGNoSW5kZXggPCBtYXRjaGluZ0NvZGVjcy5zaXplKCk7CiAgICAgICAgICAgICArK21hdGNoSW5kZXgpIHsKICAgICAgICAgY29tcG9uZW50TmFtZSA9IG1hdGNoaW5nQ29kZWNzLml0ZW1BdChtYXRjaEluZGV4KS5tTmFtZS5zdHJpbmcoKTsKQEAgLTQ4OTgsNyArNTUxMCw3IEBACiAgICAgICAgIHBpZF90IHRpZCA9IGdldHRpZCgpOwogICAgICAgICBpbnQgcHJldlByaW9yaXR5ID0gYW5kcm9pZEdldFRocmVhZFByaW9yaXR5KHRpZCk7CiAgICAgICAgIGFuZHJvaWRTZXRUaHJlYWRQcmlvcml0eSh0aWQsIEFORFJPSURfUFJJT1JJVFlfRk9SRUdST1VORCk7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG9teC0+YWxsb2NhdGVOb2RlKGNvbXBvbmVudE5hbWUuY19zdHIoKSwgb2JzZXJ2ZXIsICZub2RlKTsKKyAgICAgICAgZXJyID0gb214LT5hbGxvY2F0ZU5vZGUoY29tcG9uZW50TmFtZS5jX3N0cigpLCBvYnNlcnZlciwgJm5vZGUpOwogICAgICAgICBhbmRyb2lkU2V0VGhyZWFkUHJpb3JpdHkodGlkLCBwcmV2UHJpb3JpdHkpOwogCiAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKQEAgLTQ5MDcsMjUgKzU1MTksMjYgQEAKICAgICAgICAgICAgIEFMT0dXKCJBbGxvY2F0aW5nIGNvbXBvbmVudCAnJXMnIGZhaWxlZCwgdHJ5IG5leHQgb25lLiIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAgICAgICAgIH0KIAotICAgICAgICBub2RlID0gTlVMTDsKKyAgICAgICAgbm9kZSA9IDA7CiAgICAgfQogCi0gICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgIGlmIChub2RlID09IDApIHsKICAgICAgICAgaWYgKCFtaW1lLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgYSAlc2NvZGVyIGZvciB0eXBlICclcycuIiwKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlciA/ICJlbiIgOiAiZGUiLCBtaW1lLmNfc3RyKCkpOworICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBpbnN0YW50aWF0ZSBhICVzY29kZXIgZm9yIHR5cGUgJyVzJyB3aXRoIGVyciAlI3guIiwKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlciA/ICJlbiIgOiAiZGUiLCBtaW1lLmNfc3RyKCksIGVycik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGluc3RhbnRpYXRlIGNvZGVjICclcycuIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgY29kZWMgJyVzJyB3aXRoIGVyciAlI3guIiwgY29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOwogICAgICAgICB9CiAKLSAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JDb21wb25lbnROb3RGb3VuZCk7CisgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoKE9NWF9FUlJPUlRZUEUpZXJyLCBtYWtlTm9TaWRlRWZmZWN0U3RhdHVzKGVycikpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0T01YTWVzc2FnZSwgbUNvZGVjLT5pZCgpKTsKKyAgICBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPTVhNZXNzYWdlTGlzdCwgbUNvZGVjKTsKICAgICBvYnNlcnZlci0+c2V0Tm90aWZpY2F0aW9uTWVzc2FnZShub3RpZnkpOwogCiAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWU7CisgICAgbUNvZGVjLT5tUmVuZGVyVHJhY2tlci5zZXRDb21wb25lbnROYW1lKGNvbXBvbmVudE5hbWUpOwogICAgIG1Db2RlYy0+bUZsYWdzID0gMDsKIAogICAgIGlmIChjb21wb25lbnROYW1lLmVuZHNXaXRoKCIuc2VjdXJlIikpIHsKQEAgLTQ5NjUsNyArNTU3OCw3IEBACiAgICAgbUNvZGVjLT5tSW5wdXRFT1NSZXN1bHQgPSBPSzsKIAogICAgIG1Db2RlYy0+bURlcXVldWVDb3VudGVyID0gMDsKLSAgICBtQ29kZWMtPm1NZXRhRGF0YUJ1ZmZlcnNUb1N1Ym1pdCA9IDA7CisgICAgbUNvZGVjLT5tTWV0YWRhdGFCdWZmZXJzVG9TdWJtaXQgPSAwOwogICAgIG1Db2RlYy0+bVJlcGVhdEZyYW1lRGVsYXlVcyA9IC0xbGw7CiAgICAgbUNvZGVjLT5tSW5wdXRGb3JtYXQuY2xlYXIoKTsKICAgICBtQ29kZWMtPm1PdXRwdXRGb3JtYXQuY2xlYXIoKTsKQEAgLTQ5ODYsNyArNTU5OSw3IEBACiAKIHZvaWQgQUNvZGVjOjpMb2FkZWRTdGF0ZTo6b25TaHV0ZG93bihib29sIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQpIHsKICAgICBpZiAoIWtlZXBDb21wb25lbnRBbGxvY2F0ZWQpIHsKLSAgICAgICAgQ0hFQ0tfRVEobUNvZGVjLT5tT01YLT5mcmVlTm9kZShtQ29kZWMtPm1Ob2RlKSwgKHN0YXR1c190KU9LKTsKKyAgICAgICAgKHZvaWQpbUNvZGVjLT5tT01YLT5mcmVlTm9kZShtQ29kZWMtPm1Ob2RlKTsKIAogICAgICAgICBtQ29kZWMtPmNoYW5nZVN0YXRlKG1Db2RlYy0+bVVuaW5pdGlhbGl6ZWRTdGF0ZSk7CiAgICAgfQpAQCAtNTAxNyw2ICs1NjMwLDEzIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdFNldElucHV0U3VyZmFjZToKKyAgICAgICAgeworICAgICAgICAgICAgb25TZXRJbnB1dFN1cmZhY2UobXNnKTsKKyAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRTdGFydDoKICAgICAgICAgewogICAgICAgICAgICAgb25TdGFydCgpOwpAQCAtNTA1OCwxMyArNTY3OCwxNSBAQAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIEFMT0dWKCJvbkNvbmZpZ3VyZUNvbXBvbmVudCIpOwogCi0gICAgQ0hFQ0sobUNvZGVjLT5tTm9kZSAhPSBOVUxMKTsKKyAgICBDSEVDSyhtQ29kZWMtPm1Ob2RlICE9IDApOwogCisgICAgc3RhdHVzX3QgZXJyID0gT0s7CiAgICAgQVN0cmluZyBtaW1lOwotICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtQ29kZWMtPmNvbmZpZ3VyZUNvZGVjKG1pbWUuY19zdHIoKSwgbXNnKTsKLQorICAgIGlmICghbXNnLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKSB7CisgICAgICAgIGVyciA9IEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgeworICAgICAgICBlcnIgPSBtQ29kZWMtPmNvbmZpZ3VyZUNvZGVjKG1pbWUuY19zdHIoKSwgbXNnKTsKKyAgICB9CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBBTE9HRSgiWyVzXSBjb25maWd1cmVDb2RlYyByZXR1cm5pbmcgZXJyb3IgJWQiLAogICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CkBAIC01MDg0LDIwICs1NzA2LDEwIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgQUNvZGVjOjpMb2FkZWRTdGF0ZTo6b25DcmVhdGVJbnB1dFN1cmZhY2UoCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmIC8qIG1zZyAqLykgewotICAgIEFMT0dWKCJvbkNyZWF0ZUlucHV0U3VyZmFjZSIpOworc3RhdHVzX3QgQUNvZGVjOjpMb2FkZWRTdGF0ZTo6c2V0dXBJbnB1dFN1cmZhY2UoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CiAKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdElucHV0U3VyZmFjZUNyZWF0ZWQpOwotCi0gICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gYnVmZmVyUHJvZHVjZXI7Ci0gICAgc3RhdHVzX3QgZXJyOwotCi0gICAgZXJyID0gbUNvZGVjLT5tT01YLT5jcmVhdGVJbnB1dFN1cmZhY2UobUNvZGVjLT5tTm9kZSwga1BvcnRJbmRleElucHV0LAotICAgICAgICAgICAgJmJ1ZmZlclByb2R1Y2VyKTsKLQotICAgIGlmIChlcnIgPT0gT0sgJiYgbUNvZGVjLT5tUmVwZWF0RnJhbWVEZWxheVVzID4gMGxsKSB7CisgICAgaWYgKG1Db2RlYy0+bVJlcGVhdEZyYW1lRGVsYXlVcyA+IDBsbCkgewogICAgICAgICBlcnIgPSBtQ29kZWMtPm1PTVgtPnNldEludGVybmFsT3B0aW9uKAogICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsCiAgICAgICAgICAgICAgICAga1BvcnRJbmRleElucHV0LApAQCAtNTExMCwxMCArNTcyMiwxMSBAQAogICAgICAgICAgICAgICAgICAgImZyYW1lcyAoZXJyICVkKSIsCiAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChlcnIgPT0gT0sgJiYgbUNvZGVjLT5tTWF4UHRzR2FwVXMgPiAwbGwpIHsKKyAgICBpZiAobUNvZGVjLT5tTWF4UHRzR2FwVXMgPiAwbGwpIHsKICAgICAgICAgZXJyID0gbUNvZGVjLT5tT01YLT5zZXRJbnRlcm5hbE9wdGlvbigKICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Ob2RlLAogICAgICAgICAgICAgICAgIGtQb3J0SW5kZXhJbnB1dCwKQEAgLTUxMjUsMTAgKzU3MzgsMjcgQEAKICAgICAgICAgICAgIEFMT0dFKCJbJXNdIFVuYWJsZSB0byBjb25maWd1cmUgbWF4IHRpbWVzdGFtcCBnYXAgKGVyciAlZCkiLAogICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGVyciA9PSBPSyAmJiBtQ29kZWMtPm1UaW1lUGVyQ2FwdHVyZVVzID4gMGxsCisgICAgaWYgKG1Db2RlYy0+bU1heEZwcyA+IDApIHsKKyAgICAgICAgZXJyID0gbUNvZGVjLT5tT01YLT5zZXRJbnRlcm5hbE9wdGlvbigKKyAgICAgICAgICAgICAgICBtQ29kZWMtPm1Ob2RlLAorICAgICAgICAgICAgICAgIGtQb3J0SW5kZXhJbnB1dCwKKyAgICAgICAgICAgICAgICBJT01YOjpJTlRFUk5BTF9PUFRJT05fTUFYX0ZQUywKKyAgICAgICAgICAgICAgICAmbUNvZGVjLT5tTWF4RnBzLAorICAgICAgICAgICAgICAgIHNpemVvZihtQ29kZWMtPm1NYXhGcHMpKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiWyVzXSBVbmFibGUgdG8gY29uZmlndXJlIG1heCBmcHMgKGVyciAlZCkiLAorICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1Db2RlYy0+bVRpbWVQZXJDYXB0dXJlVXMgPiAwbGwKICAgICAgICAgICAgICYmIG1Db2RlYy0+bVRpbWVQZXJGcmFtZVVzID4gMGxsKSB7CiAgICAgICAgIGludDY0X3QgdGltZUxhcHNlWzJdOwogICAgICAgICB0aW1lTGFwc2VbMF0gPSBtQ29kZWMtPm1UaW1lUGVyRnJhbWVVczsKQEAgLTUxNDQsMTAgKzU3NzQsMTEgQEAKICAgICAgICAgICAgIEFMT0dFKCJbJXNdIFVuYWJsZSB0byBjb25maWd1cmUgdGltZSBsYXBzZSAoZXJyICVkKSIsCiAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoZXJyID09IE9LICYmIG1Db2RlYy0+bUNyZWF0ZUlucHV0QnVmZmVyc1N1c3BlbmRlZCkgeworICAgIGlmIChtQ29kZWMtPm1DcmVhdGVJbnB1dEJ1ZmZlcnNTdXNwZW5kZWQpIHsKICAgICAgICAgYm9vbCBzdXNwZW5kID0gdHJ1ZTsKICAgICAgICAgZXJyID0gbUNvZGVjLT5tT01YLT5zZXRJbnRlcm5hbE9wdGlvbigKICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Ob2RlLApAQCAtNTE2MCw5ICs1NzkxLDM2IEBACiAgICAgICAgICAgICBBTE9HRSgiWyVzXSBVbmFibGUgdG8gY29uZmlndXJlIG9wdGlvbiB0byBzdXNwZW5kIChlcnIgJWQpIiwKICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgfQogCisgICAgdWludDMyX3QgdXNhZ2VCaXRzOworICAgIGlmIChtQ29kZWMtPm1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQ29uc3VtZXJVc2FnZUJpdHMsCisgICAgICAgICAgICAmdXNhZ2VCaXRzLCBzaXplb2YodXNhZ2VCaXRzKSkgPT0gT0spIHsKKyAgICAgICAgbUNvZGVjLT5tSW5wdXRGb3JtYXQtPnNldEludDMyKAorICAgICAgICAgICAgICAgICJ1c2luZy1zdy1yZWFkLW9mdGVuIiwgISEodXNhZ2VCaXRzICYgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOKSk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEFDb2RlYzo6TG9hZGVkU3RhdGU6Om9uQ3JlYXRlSW5wdXRTdXJmYWNlKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJiAvKiBtc2cgKi8pIHsKKyAgICBBTE9HVigib25DcmVhdGVJbnB1dFN1cmZhY2UiKTsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtQ29kZWMtPm1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0SW5wdXRTdXJmYWNlQ3JlYXRlZCk7CisKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBidWZmZXJQcm9kdWNlcjsKKyAgICBzdGF0dXNfdCBlcnIgPSBtQ29kZWMtPm1PTVgtPmNyZWF0ZUlucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsIGtQb3J0SW5kZXhJbnB1dCwgJmJ1ZmZlclByb2R1Y2VyLCAmbUNvZGVjLT5tSW5wdXRNZXRhZGF0YVR5cGUpOworCisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBlcnIgPSBzZXR1cElucHV0U3VyZmFjZSgpOworICAgIH0KKwogICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgbm90aWZ5LT5zZXRPYmplY3QoImlucHV0LXN1cmZhY2UiLAogICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJQcm9kdWNlcldyYXBwZXIoYnVmZmVyUHJvZHVjZXIpKTsKQEAgLTUxNzcsMTQgKzU4MzUsNDUgQEAKICAgICBub3RpZnktPnBvc3QoKTsKIH0KIAordm9pZCBBQ29kZWM6OkxvYWRlZFN0YXRlOjpvblNldElucHV0U3VyZmFjZSgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBBTE9HVigib25TZXRJbnB1dFN1cmZhY2UiKTsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtQ29kZWMtPm1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0SW5wdXRTdXJmYWNlQWNjZXB0ZWQpOworCisgICAgc3A8UmVmQmFzZT4gb2JqOworICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgiaW5wdXQtc3VyZmFjZSIsICZvYmopKTsKKyAgICBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gc3VyZmFjZSA9IHN0YXRpY19jYXN0PFBlcnNpc3RlbnRTdXJmYWNlICo+KG9iai5nZXQoKSk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtQ29kZWMtPm1PTVgtPnNldElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsIGtQb3J0SW5kZXhJbnB1dCwgc3VyZmFjZS0+Z2V0QnVmZmVyQ29uc3VtZXIoKSwKKyAgICAgICAgICAgICZtQ29kZWMtPm1JbnB1dE1ldGFkYXRhVHlwZSk7CisKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIGVyciA9IHNldHVwSW5wdXRTdXJmYWNlKCk7CisgICAgfQorCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAvLyBDYW4ndCB1c2UgbUNvZGVjLT5zaWduYWxFcnJvcigpIGhlcmUgLS0gTWVkaWFDb2RlYyB3b24ndCBmb3J3YXJkCisgICAgICAgIC8vIHRoZSBlcnJvciB0aHJvdWdoIGJlY2F1c2UgaXQncyBpbiB0aGUgImNvbmZpZ3VyZWQiIHN0YXRlLiAgV2UKKyAgICAgICAgLy8gc2VuZCBhIGtXaGF0SW5wdXRTdXJmYWNlQWNjZXB0ZWQgd2l0aCBhbiBlcnJvciB2YWx1ZSBpbnN0ZWFkLgorICAgICAgICBBTE9HRSgiWyVzXSBvblNldElucHV0U3VyZmFjZSByZXR1cm5pbmcgZXJyb3IgJWQiLAorICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICB9CisgICAgbm90aWZ5LT5wb3N0KCk7Cit9CisKIHZvaWQgQUNvZGVjOjpMb2FkZWRTdGF0ZTo6b25TdGFydCgpIHsKICAgICBBTE9HVigib25TdGFydCIpOwogCi0gICAgQ0hFQ0tfRVEobUNvZGVjLT5tT01YLT5zZW5kQ29tbWFuZCgKLSAgICAgICAgICAgICAgICBtQ29kZWMtPm1Ob2RlLCBPTVhfQ29tbWFuZFN0YXRlU2V0LCBPTVhfU3RhdGVJZGxlKSwKLSAgICAgICAgICAgICAoc3RhdHVzX3QpT0spOwotCi0gICAgbUNvZGVjLT5jaGFuZ2VTdGF0ZShtQ29kZWMtPm1Mb2FkZWRUb0lkbGVTdGF0ZSk7CisgICAgc3RhdHVzX3QgZXJyID0gbUNvZGVjLT5tT01YLT5zZW5kQ29tbWFuZChtQ29kZWMtPm1Ob2RlLCBPTVhfQ29tbWFuZFN0YXRlU2V0LCBPTVhfU3RhdGVJZGxlKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBtYWtlTm9TaWRlRWZmZWN0U3RhdHVzKGVycikpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Db2RlYy0+Y2hhbmdlU3RhdGUobUNvZGVjLT5tTG9hZGVkVG9JZGxlU3RhdGUpOworICAgIH0KIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTUyNTgsMTQgKzU5NDcsMjUgQEAKICAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgICAgIGNhc2UgT01YX0V2ZW50Q21kQ29tcGxldGU6CiAgICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLX0VRKGRhdGExLCAoT01YX1UzMilPTVhfQ29tbWFuZFN0YXRlU2V0KTsKLSAgICAgICAgICAgIENIRUNLX0VRKGRhdGEyLCAoT01YX1UzMilPTVhfU3RhdGVJZGxlKTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworICAgICAgICAgICAgaWYgKGRhdGExICE9IChPTVhfVTMyKU9NWF9Db21tYW5kU3RhdGVTZXQKKyAgICAgICAgICAgICAgICAgICAgfHwgZGF0YTIgIT0gKE9NWF9VMzIpT01YX1N0YXRlSWRsZSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJVbmV4cGVjdGVkIGNvbW1hbmQgY29tcGxldGlvbiBpbiBMb2FkZWRUb0lkbGVTdGF0ZTogJXMoJXUpICVzKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICBhc1N0cmluZygoT01YX0NPTU1BTkRUWVBFKWRhdGExKSwgZGF0YTEsCisgICAgICAgICAgICAgICAgICAgICAgICBhc1N0cmluZygoT01YX1NUQVRFVFlQRSlkYXRhMiksIGRhdGEyKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIENIRUNLX0VRKG1Db2RlYy0+bU9NWC0+c2VuZENvbW1hbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Ob2RlLCBPTVhfQ29tbWFuZFN0YXRlU2V0LCBPTVhfU3RhdGVFeGVjdXRpbmcpLAotICAgICAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtQ29kZWMtPm1PTVgtPnNlbmRDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Ob2RlLCBPTVhfQ29tbWFuZFN0YXRlU2V0LCBPTVhfU3RhdGVFeGVjdXRpbmcpOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtQ29kZWMtPmNoYW5nZVN0YXRlKG1Db2RlYy0+bUlkbGVUb0V4ZWN1dGluZ1N0YXRlKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgbWFrZU5vU2lkZUVmZmVjdFN0YXR1cyhlcnIpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5jaGFuZ2VTdGF0ZShtQ29kZWMtPm1JZGxlVG9FeGVjdXRpbmdTdGF0ZSk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CkBAIC01MzI2LDggKzYwMjYsMTQgQEAKICAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgICAgIGNhc2UgT01YX0V2ZW50Q21kQ29tcGxldGU6CiAgICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLX0VRKGRhdGExLCAoT01YX1UzMilPTVhfQ29tbWFuZFN0YXRlU2V0KTsKLSAgICAgICAgICAgIENIRUNLX0VRKGRhdGEyLCAoT01YX1UzMilPTVhfU3RhdGVFeGVjdXRpbmcpOworICAgICAgICAgICAgaWYgKGRhdGExICE9IChPTVhfVTMyKU9NWF9Db21tYW5kU3RhdGVTZXQKKyAgICAgICAgICAgICAgICAgICAgfHwgZGF0YTIgIT0gKE9NWF9VMzIpT01YX1N0YXRlRXhlY3V0aW5nKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlVuZXhwZWN0ZWQgY29tbWFuZCBjb21wbGV0aW9uIGluIElkbGVUb0V4ZWN1dGluZ1N0YXRlOiAlcygldSkgJXMoJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKChPTVhfQ09NTUFORFRZUEUpZGF0YTEpLCBkYXRhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKChPTVhfU1RBVEVUWVBFKWRhdGEyKSwgZGF0YTIpOworICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBGQUlMRURfVFJBTlNBQ1RJT04pOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtQ29kZWMtPm1FeGVjdXRpbmdTdGF0ZS0+cmVzdW1lKCk7CiAgICAgICAgICAgICBtQ29kZWMtPmNoYW5nZVN0YXRlKG1Db2RlYy0+bUV4ZWN1dGluZ1N0YXRlKTsKQEAgLTUzNTksNTkgKzYwNjUsNzcgQEAKICAgICAgICAgQnVmZmVySW5mbyAqaW5mbyA9ICZtQ29kZWMtPm1CdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF0uZWRpdEl0ZW1BdChpKTsKIAogICAgICAgICBpZiAoaW5mby0+bVN0YXR1cyA9PSBCdWZmZXJJbmZvOjpPV05FRF9CWV9DT01QT05FTlQpIHsKLSAgICAgICAgICAgIGlmIChtQ29kZWMtPnN1Ym1pdE91dHB1dE1ldGFEYXRhQnVmZmVyKCkgIT0gT0spCisgICAgICAgICAgICBpZiAobUNvZGVjLT5zdWJtaXRPdXRwdXRNZXRhZGF0YUJ1ZmZlcigpICE9IE9LKQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gKioqIE5PVEU6IFRIRSBGT0xMT1dJTkcgV09SS0FST1VORCBXSUxMIEJFIFJFTU9WRUQgKioqCi0gICAgbUNvZGVjLT5zaWduYWxTdWJtaXRPdXRwdXRNZXRhRGF0YUJ1ZmZlcklmRU9TX3dvcmthcm91bmQoKTsKKyAgICBtQ29kZWMtPnNpZ25hbFN1Ym1pdE91dHB1dE1ldGFkYXRhQnVmZmVySWZFT1Nfd29ya2Fyb3VuZCgpOwogfQogCiB2b2lkIEFDb2RlYzo6RXhlY3V0aW5nU3RhdGU6OnN1Ym1pdFJlZ3VsYXJPdXRwdXRCdWZmZXJzKCkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29kZWMtPm1CdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLnNpemUoKTsgKytpKSB7CiAgICAgICAgIEJ1ZmZlckluZm8gKmluZm8gPSAmbUNvZGVjLT5tQnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XS5lZGl0SXRlbUF0KGkpOwogCiAgICAgICAgIGlmIChtQ29kZWMtPm1OYXRpdmVXaW5kb3cgIT0gTlVMTCkgewotICAgICAgICAgICAgQ0hFQ0soaW5mby0+bVN0YXR1cyA9PSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUwotICAgICAgICAgICAgICAgICAgICB8fCBpbmZvLT5tU3RhdHVzID09IEJ1ZmZlckluZm86Ok9XTkVEX0JZX05BVElWRV9XSU5ET1cpOworICAgICAgICAgICAgaWYgKGluZm8tPm1TdGF0dXMgIT0gQnVmZmVySW5mbzo6T1dORURfQllfVVMKKyAgICAgICAgICAgICAgICAgICAgJiYgaW5mby0+bVN0YXR1cyAhPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9OQVRJVkVfV0lORE9XKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImJ1ZmZlcnMgc2hvdWxkIGJlIG93bmVkIGJ5IHVzIG9yIHRoZSBzdXJmYWNlIik7CisgICAgICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGluZm8tPm1TdGF0dXMgPT0gQnVmZmVySW5mbzo6T1dORURfQllfTkFUSVZFX1dJTkRPVykgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ0hFQ0tfRVEoKGludClpbmZvLT5tU3RhdHVzLCAoaW50KUJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTKTsKKyAgICAgICAgICAgIGlmIChpbmZvLT5tU3RhdHVzICE9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImJ1ZmZlcnMgc2hvdWxkIGJlIG93bmVkIGJ5IHVzIik7CisgICAgICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIEFMT0dWKCJbJXNdIGNhbGxpbmcgZmlsbEJ1ZmZlciAlcCIsCi0gICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLCBpbmZvLT5tQnVmZmVySUQpOworICAgICAgICBBTE9HVigiWyVzXSBjYWxsaW5nIGZpbGxCdWZmZXIgJXUiLCBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksIGluZm8tPm1CdWZmZXJJRCk7CiAKLSAgICAgICAgQ0hFQ0tfRVEobUNvZGVjLT5tT01YLT5maWxsQnVmZmVyKG1Db2RlYy0+bU5vZGUsIGluZm8tPm1CdWZmZXJJRCksCi0gICAgICAgICAgICAgICAgIChzdGF0dXNfdClPSyk7CisgICAgICAgIGluZm8tPmNoZWNrV3JpdGVGZW5jZSgic3VibWl0UmVndWxhck91dHB1dEJ1ZmZlcnMiKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvZGVjLT5tT01YLT5maWxsQnVmZmVyKG1Db2RlYy0+bU5vZGUsIGluZm8tPm1CdWZmZXJJRCwgaW5mby0+bUZlbmNlRmQpOworICAgICAgICBpbmZvLT5tRmVuY2VGZCA9IC0xOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAogICAgICAgICBpbmZvLT5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfQ09NUE9ORU5UOwogICAgIH0KKworICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIEZBSUxFRF9UUkFOU0FDVElPTik7CisgICAgfQogfQogCiB2b2lkIEFDb2RlYzo6RXhlY3V0aW5nU3RhdGU6OnN1Ym1pdE91dHB1dEJ1ZmZlcnMoKSB7CiAgICAgc3VibWl0UmVndWxhck91dHB1dEJ1ZmZlcnMoKTsKLSAgICBpZiAobUNvZGVjLT5tU3RvcmVNZXRhRGF0YUluT3V0cHV0QnVmZmVycykgeworICAgIGlmIChtQ29kZWMtPnN0b3JpbmdNZXRhZGF0YUluRGVjb2RlZEJ1ZmZlcnMoKSkgewogICAgICAgICBzdWJtaXRPdXRwdXRNZXRhQnVmZmVycygpOwogICAgIH0KIH0KIAogdm9pZCBBQ29kZWM6OkV4ZWN1dGluZ1N0YXRlOjpyZXN1bWUoKSB7CiAgICAgaWYgKG1BY3RpdmUpIHsKLSAgICAgICAgQUxPR1YoIlslc10gV2UncmUgYWxyZWFkeSBhY3RpdmUsIG5vIG5lZWQgdG8gcmVzdW1lLiIsCi0gICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKLQorICAgICAgICBBTE9HVigiWyVzXSBXZSdyZSBhbHJlYWR5IGFjdGl2ZSwgbm8gbmVlZCB0byByZXN1bWUuIiwgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIHN1Ym1pdE91dHB1dEJ1ZmZlcnMoKTsKIAogICAgIC8vIFBvc3QgYWxsIGF2YWlsYWJsZSBpbnB1dCBidWZmZXJzCi0gICAgQ0hFQ0tfR1QobUNvZGVjLT5tQnVmZmVyc1trUG9ydEluZGV4SW5wdXRdLnNpemUoKSwgMHUpOworICAgIGlmIChtQ29kZWMtPm1CdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF0uc2l6ZSgpID09IDB1KSB7CisgICAgICAgIEFMT0dXKCJbJXNdIHdlIGRvbid0IGhhdmUgYW55IGlucHV0IGJ1ZmZlcnMgdG8gcmVzdW1lIiwgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICB9CisKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db2RlYy0+bUJ1ZmZlcnNba1BvcnRJbmRleElucHV0XS5zaXplKCk7IGkrKykgewogICAgICAgICBCdWZmZXJJbmZvICppbmZvID0gJm1Db2RlYy0+bUJ1ZmZlcnNba1BvcnRJbmRleElucHV0XS5lZGl0SXRlbUF0KGkpOwogICAgICAgICBpZiAoaW5mby0+bVN0YXR1cyA9PSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUykgewpAQCAtNTQyNSw2ICs2MTQ5LDcgQEAKIHZvaWQgQUNvZGVjOjpFeGVjdXRpbmdTdGF0ZTo6c3RhdGVFbnRlcmVkKCkgewogICAgIEFMT0dWKCJbJXNdIE5vdyBFeGVjdXRpbmciLCBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOwogCisgICAgbUNvZGVjLT5tUmVuZGVyVHJhY2tlci5jbGVhcihzeXN0ZW1UaW1lKENMT0NLX01PTk9UT05JQykpOwogICAgIG1Db2RlYy0+cHJvY2Vzc0RlZmVycmVkTWVzc2FnZXMoKTsKIH0KIApAQCAtNTQ0NCwxMSArNjE2OSwxNiBAQAogCiAgICAgICAgICAgICBtQWN0aXZlID0gZmFsc2U7CiAKLSAgICAgICAgICAgIENIRUNLX0VRKG1Db2RlYy0+bU9NWC0+c2VuZENvbW1hbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Ob2RlLCBPTVhfQ29tbWFuZFN0YXRlU2V0LCBPTVhfU3RhdGVJZGxlKSwKLSAgICAgICAgICAgICAgICAgICAgIChzdGF0dXNfdClPSyk7Ci0KLSAgICAgICAgICAgIG1Db2RlYy0+Y2hhbmdlU3RhdGUobUNvZGVjLT5tRXhlY3V0aW5nVG9JZGxlU3RhdGUpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvZGVjLT5tT01YLT5zZW5kQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tTm9kZSwgT01YX0NvbW1hbmRTdGF0ZVNldCwgT01YX1N0YXRlSWRsZSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgaWYgKGtlZXBDb21wb25lbnRBbGxvY2F0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIEZBSUxFRF9UUkFOU0FDVElPTik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFRPRE86IGRvIHNvbWUgcmVjb3ZlcnkgaGVyZS4KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5jaGFuZ2VTdGF0ZShtQ29kZWMtPm1FeGVjdXRpbmdUb0lkbGVTdGF0ZSk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CkBAIC01NDU3LDcgKzYxODcsNyBAQAogICAgICAgICBjYXNlIGtXaGF0Rmx1c2g6CiAgICAgICAgIHsKICAgICAgICAgICAgIEFMT0dWKCJbJXNdIEV4ZWN1dGluZ1N0YXRlIGZsdXNoaW5nIG5vdyAiCi0gICAgICAgICAgICAgICAgICIoY29kZWMgb3ducyAlZC8lZCBpbnB1dCwgJWQvJWQgb3V0cHV0KS4iLAorICAgICAgICAgICAgICAgICAiKGNvZGVjIG93bnMgJXp1LyV6dSBpbnB1dCwgJXp1LyV6dSBvdXRwdXQpLiIsCiAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5jb3VudEJ1ZmZlcnNPd25lZEJ5Q29tcG9uZW50KGtQb3J0SW5kZXhJbnB1dCksCiAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUJ1ZmZlcnNba1BvcnRJbmRleElucHV0XS5zaXplKCksCkBAIC01NDY2LDExICs2MTk2LDEzIEBACiAKICAgICAgICAgICAgIG1BY3RpdmUgPSBmYWxzZTsKIAotICAgICAgICAgICAgQ0hFQ0tfRVEobUNvZGVjLT5tT01YLT5zZW5kQ29tbWFuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsIE9NWF9Db21tYW5kRmx1c2gsIE9NWF9BTEwpLAotICAgICAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1Db2RlYy0+bU9NWC0+c2VuZENvbW1hbmQobUNvZGVjLT5tTm9kZSwgT01YX0NvbW1hbmRGbHVzaCwgT01YX0FMTCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIEZBSUxFRF9UUkFOU0FDVElPTik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Db2RlYy0+Y2hhbmdlU3RhdGUobUNvZGVjLT5tRmx1c2hpbmdTdGF0ZSk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1Db2RlYy0+Y2hhbmdlU3RhdGUobUNvZGVjLT5tRmx1c2hpbmdTdGF0ZSk7CiAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC01NTE5LDEzICs2MjUxLDEzIEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyAqKiogTk9URTogVEhFIEZPTExPV0lORyBXT1JLQVJPVU5EIFdJTEwgQkUgUkVNT1ZFRCAqKioKLSAgICAgICAgY2FzZSBrV2hhdFN1Ym1pdE91dHB1dE1ldGFEYXRhQnVmZmVySWZFT1M6CisgICAgICAgIGNhc2Uga1doYXRTdWJtaXRPdXRwdXRNZXRhZGF0YUJ1ZmZlcklmRU9TOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAobUNvZGVjLT5tUG9ydEVPU1trUG9ydEluZGV4SW5wdXRdICYmCiAgICAgICAgICAgICAgICAgICAgICFtQ29kZWMtPm1Qb3J0RU9TW2tQb3J0SW5kZXhPdXRwdXRdKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvZGVjLT5zdWJtaXRPdXRwdXRNZXRhRGF0YUJ1ZmZlcigpOworICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1Db2RlYy0+c3VibWl0T3V0cHV0TWV0YWRhdGFCdWZmZXIoKTsKICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsU3VibWl0T3V0cHV0TWV0YURhdGFCdWZmZXJJZkVPU193b3JrYXJvdW5kKCk7CisgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsU3VibWl0T3V0cHV0TWV0YWRhdGFCdWZmZXJJZkVPU193b3JrYXJvdW5kKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC01NjA1LDYgKzYzMzcsMTUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGZsb2F0IHJhdGU7CisgICAgaWYgKHBhcmFtcy0+ZmluZEZsb2F0KCJvcGVyYXRpbmctcmF0ZSIsICZyYXRlKSAmJiByYXRlID4gMCkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXRPcGVyYXRpbmdSYXRlKHJhdGUsIG1Jc1ZpZGVvKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgcGFyYW1ldGVyICdvcGVyYXRpbmctcmF0ZScgKGVyciAlZCkiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtNTYxOSw2ICs2MzYwLDExIEBACiAgICAgbm90aWZ5LT5wb3N0KCk7CiB9CiAKK2Jvb2wgQUNvZGVjOjpFeGVjdXRpbmdTdGF0ZTo6b25PTVhGcmFtZVJlbmRlcmVkKGludDY0X3QgbWVkaWFUaW1lVXMsIG5zZWNzX3Qgc3lzdGVtTmFubykgeworICAgIG1Db2RlYy0+b25GcmFtZVJlbmRlcmVkKG1lZGlhVGltZVVzLCBzeXN0ZW1OYW5vKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogYm9vbCBBQ29kZWM6OkV4ZWN1dGluZ1N0YXRlOjpvbk9NWEV2ZW50KAogICAgICAgICBPTVhfRVZFTlRUWVBFIGV2ZW50LCBPTVhfVTMyIGRhdGExLCBPTVhfVTMyIGRhdGEyKSB7CiAgICAgc3dpdGNoIChldmVudCkgewpAQCAtNTYyNyw3ICs2MzczLDcgQEAKICAgICAgICAgICAgIENIRUNLX0VRKGRhdGExLCAoT01YX1UzMilrUG9ydEluZGV4T3V0cHV0KTsKIAogICAgICAgICAgICAgaWYgKGRhdGEyID09IDAgfHwgZGF0YTIgPT0gT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbikgewotICAgICAgICAgICAgICAgIG1Db2RlYy0+bU1ldGFEYXRhQnVmZmVyc1RvU3VibWl0ID0gMDsKKyAgICAgICAgICAgICAgICBtQ29kZWMtPm1NZXRhZGF0YUJ1ZmZlcnNUb1N1Ym1pdCA9IDA7CiAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobUNvZGVjLT5tT01YLT5zZW5kQ29tbWFuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Ob2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9Db21tYW5kUG9ydERpc2FibGUsIGtQb3J0SW5kZXhPdXRwdXQpLApAQCAtNTYzOCw4ICs2Mzg0LDEzIEBACiAgICAgICAgICAgICAgICAgbUNvZGVjLT5jaGFuZ2VTdGF0ZShtQ29kZWMtPm1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2VkU3RhdGUpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhMiA9PSBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRDcm9wKSB7CiAgICAgICAgICAgICAgICAgbUNvZGVjLT5tU2VudEZvcm1hdCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgaWYgKG1Db2RlYy0+bVR1bm5lbGVkKSB7CisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBkdW1teSA9IG5ldyBBTWVzc2FnZShrV2hhdE91dHB1dEJ1ZmZlckRyYWluZWQsIG1Db2RlYyk7CisgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+c2VuZEZvcm1hdENoYW5nZShkdW1teSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkIDB4JTA4bHgiLAorICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQgMHglMDh4IiwKICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZGF0YTIpOwogICAgICAgICAgICAgfQogCkBAIC01NzA2LDMxICs2NDU3LDQ2IEBACiAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOwogfQogCitib29sIEFDb2RlYzo6T3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlZFN0YXRlOjpvbk9NWEZyYW1lUmVuZGVyZWQoCisgICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXMsIG5zZWNzX3Qgc3lzdGVtTmFubykgeworICAgIG1Db2RlYy0+b25GcmFtZVJlbmRlcmVkKG1lZGlhVGltZVVzLCBzeXN0ZW1OYW5vKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogYm9vbCBBQ29kZWM6Ok91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZWRTdGF0ZTo6b25PTVhFdmVudCgKICAgICAgICAgT01YX0VWRU5UVFlQRSBldmVudCwgT01YX1UzMiBkYXRhMSwgT01YX1UzMiBkYXRhMikgewogICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICAgICAgY2FzZSBPTVhfRXZlbnRDbWRDb21wbGV0ZToKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGRhdGExID09IChPTVhfVTMyKU9NWF9Db21tYW5kUG9ydERpc2FibGUpIHsKLSAgICAgICAgICAgICAgICBDSEVDS19FUShkYXRhMiwgKE9NWF9VMzIpa1BvcnRJbmRleE91dHB1dCk7CisgICAgICAgICAgICAgICAgaWYgKGRhdGEyICE9IChPTVhfVTMyKWtQb3J0SW5kZXhPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nIEV2ZW50Q21kQ29tcGxldGUgQ29tbWFuZFBvcnREaXNhYmxlIGZvciBwb3J0ICV1IiwgZGF0YTIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgQUxPR1YoIlslc10gT3V0cHV0IHBvcnQgbm93IGRpc2FibGVkLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIE91dHB1dCBwb3J0IG5vdyBkaXNhYmxlZC4iLCBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOwogCi0gICAgICAgICAgICAgICAgQ0hFQ0sobUNvZGVjLT5tQnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XS5pc0VtcHR5KCkpOwotICAgICAgICAgICAgICAgIG1Db2RlYy0+bURlYWxlcltrUG9ydEluZGV4T3V0cHV0XS5jbGVhcigpOworICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworICAgICAgICAgICAgICAgIGlmICghbUNvZGVjLT5tQnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImRpc2FibGVkIHBvcnQgc2hvdWxkIGJlIGVtcHR5LCBidXQgaGFzICV6dSBidWZmZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1CdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1EZWFsZXJba1BvcnRJbmRleE91dHB1dF0uY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBDSEVDS19FUShtQ29kZWMtPm1PTVgtPnNlbmRDb21tYW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsIE9NWF9Db21tYW5kUG9ydEVuYWJsZSwga1BvcnRJbmRleE91dHB1dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1Db2RlYy0+bU9NWC0+c2VuZENvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tTm9kZSwgT01YX0NvbW1hbmRQb3J0RW5hYmxlLCBrUG9ydEluZGV4T3V0cHV0KTsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgICAgICAgICAgaWYgKChlcnIgPSBtQ29kZWMtPmFsbG9jYXRlQnVmZmVyc09uUG9ydCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1BvcnRJbmRleE91dHB1dCkpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgb3V0cHV0IHBvcnQgYnVmZmVycyBhZnRlciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQgcmVjb25maWd1cmF0aW9uIChlcnJvciAweCUwOHgpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbUNvZGVjLT5hbGxvY2F0ZUJ1ZmZlcnNPblBvcnQoa1BvcnRJbmRleE91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFX0lGKGVyciAhPSBPSywgIkZhaWxlZCB0byBhbGxvY2F0ZSBvdXRwdXQgcG9ydCBidWZmZXJzIGFmdGVyIHBvcnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWNvbmZpZ3VyYXRpb246ICglZCkiLCBlcnIpOworICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIG1ha2VOb1NpZGVFZmZlY3RTdGF0dXMoZXJyKSk7CiAKICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0ZWNobmljYWxseSBub3QgY29ycmVjdCwgYnV0IGFwcGVhcnMgdG8gYmUKQEAgLTU3NDUsMTIgKzY1MTEsMTkgQEAKIAogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhMSA9PSAoT01YX1UzMilPTVhfQ29tbWFuZFBvcnRFbmFibGUpIHsKLSAgICAgICAgICAgICAgICBDSEVDS19FUShkYXRhMiwgKE9NWF9VMzIpa1BvcnRJbmRleE91dHB1dCk7CisgICAgICAgICAgICAgICAgaWYgKGRhdGEyICE9IChPTVhfVTMyKWtQb3J0SW5kZXhPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nIEV2ZW50Q21kQ29tcGxldGUgT01YX0NvbW1hbmRQb3J0RW5hYmxlIGZvciBwb3J0ICV1IiwgZGF0YTIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgbUNvZGVjLT5tU2VudEZvcm1hdCA9IGZhbHNlOwogCi0gICAgICAgICAgICAgICAgQUxPR1YoIlslc10gT3V0cHV0IHBvcnQgbm93IHJlZW5hYmxlZC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBpZiAobUNvZGVjLT5tVHVubmVsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGR1bW15ID0gbmV3IEFNZXNzYWdlKGtXaGF0T3V0cHV0QnVmZmVyRHJhaW5lZCwgbUNvZGVjKTsKKyAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5zZW5kRm9ybWF0Q2hhbmdlKGR1bW15KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBPdXRwdXQgcG9ydCBub3cgcmVlbmFibGVkLiIsIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAKICAgICAgICAgICAgICAgICBpZiAobUNvZGVjLT5tRXhlY3V0aW5nU3RhdGUtPmFjdGl2ZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUV4ZWN1dGluZ1N0YXRlLT5zdWJtaXRPdXRwdXRCdWZmZXJzKCk7CkBAIC01Nzg0LDcgKzY1NTcsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICAvLyBEb24ndCBzZW5kIG1lIGEgZmx1c2ggcmVxdWVzdCBpZiB5b3UgcHJldmlvdXNseSB3YW50ZWQgbWUKICAgICAgICAgICAgIC8vIHRvIHNodXRkb3duLgotICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgIEFMT0dXKCJJZ25vcmluZyBmbHVzaCByZXF1ZXN0IGluIEV4ZWN1dGluZ1RvSWRsZVN0YXRlIik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC01ODE2LDggKzY1ODksMTQgQEAKICAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgICAgIGNhc2UgT01YX0V2ZW50Q21kQ29tcGxldGU6CiAgICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLX0VRKGRhdGExLCAoT01YX1UzMilPTVhfQ29tbWFuZFN0YXRlU2V0KTsKLSAgICAgICAgICAgIENIRUNLX0VRKGRhdGEyLCAoT01YX1UzMilPTVhfU3RhdGVJZGxlKTsKKyAgICAgICAgICAgIGlmIChkYXRhMSAhPSAoT01YX1UzMilPTVhfQ29tbWFuZFN0YXRlU2V0CisgICAgICAgICAgICAgICAgICAgIHx8IGRhdGEyICE9IChPTVhfVTMyKU9NWF9TdGF0ZUlkbGUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiVW5leHBlY3RlZCBjb21tYW5kIGNvbXBsZXRpb24gaW4gRXhlY3V0aW5nVG9JZGxlU3RhdGU6ICVzKCV1KSAlcygldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoKE9NWF9DT01NQU5EVFlQRSlkYXRhMSksIGRhdGExLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoKE9NWF9TVEFURVRZUEUpZGF0YTIpLCBkYXRhMik7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIEZBSUxFRF9UUkFOU0FDVElPTik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1Db21wb25lbnROb3dJZGxlID0gdHJ1ZTsKIApAQCAtNTg0MCwxMiArNjYxOSwxNSBAQAogCiB2b2lkIEFDb2RlYzo6RXhlY3V0aW5nVG9JZGxlU3RhdGU6OmNoYW5nZVN0YXRlSWZXZU93bkFsbEJ1ZmZlcnMoKSB7CiAgICAgaWYgKG1Db21wb25lbnROb3dJZGxlICYmIG1Db2RlYy0+YWxsWW91ckJ1ZmZlcnNBcmVCZWxvbmdUb1VzKCkpIHsKLSAgICAgICAgQ0hFQ0tfRVEobUNvZGVjLT5tT01YLT5zZW5kQ29tbWFuZCgKLSAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tTm9kZSwgT01YX0NvbW1hbmRTdGF0ZVNldCwgT01YX1N0YXRlTG9hZGVkKSwKLSAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKLQotICAgICAgICBDSEVDS19FUShtQ29kZWMtPmZyZWVCdWZmZXJzT25Qb3J0KGtQb3J0SW5kZXhJbnB1dCksIChzdGF0dXNfdClPSyk7Ci0gICAgICAgIENIRUNLX0VRKG1Db2RlYy0+ZnJlZUJ1ZmZlcnNPblBvcnQoa1BvcnRJbmRleE91dHB1dCksIChzdGF0dXNfdClPSyk7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1Db2RlYy0+bU9NWC0+c2VuZENvbW1hbmQoCisgICAgICAgICAgICAgICAgbUNvZGVjLT5tTm9kZSwgT01YX0NvbW1hbmRTdGF0ZVNldCwgT01YX1N0YXRlTG9hZGVkKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgZXJyID0gbUNvZGVjLT5mcmVlQnVmZmVyc09uUG9ydChrUG9ydEluZGV4SW5wdXQpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyMiA9IG1Db2RlYy0+ZnJlZUJ1ZmZlcnNPblBvcnQoa1BvcnRJbmRleE91dHB1dCk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgZXJyID0gZXJyMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgIGlmICgobUNvZGVjLT5tRmxhZ3MgJiBrRmxhZ1B1c2hCbGFua0J1ZmZlcnNUb05hdGl2ZVdpbmRvd09uU2h1dGRvd24pCiAgICAgICAgICAgICAgICAgJiYgbUNvZGVjLT5tTmF0aXZlV2luZG93ICE9IE5VTEwpIHsKQEAgLTU4NTMsNyArNjYzNSwxMiBAQAogICAgICAgICAgICAgLy8gdGhlbSBoYXMgbWFkZSBpdCB0byB0aGUgZGlzcGxheS4gIFRoaXMgYWxsb3dzIHRoZSBPTVgKICAgICAgICAgICAgIC8vIGNvbXBvbmVudCB0ZWFyZG93biB0byB6ZXJvIG91dCBhbnkgcHJvdGVjdGVkIGJ1ZmZlcnMKICAgICAgICAgICAgIC8vIHdpdGhvdXQgdGhlIHJpc2sgb2Ygc2Nhbm5pbmcgb3V0IG9uZSBvZiB0aG9zZSBidWZmZXJzLgotICAgICAgICAgICAgbUNvZGVjLT5wdXNoQmxhbmtCdWZmZXJzVG9OYXRpdmVXaW5kb3coKTsKKyAgICAgICAgICAgIHB1c2hCbGFua0J1ZmZlcnNUb05hdGl2ZVdpbmRvdyhtQ29kZWMtPm1OYXRpdmVXaW5kb3cuZ2V0KCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIEZBSUxFRF9UUkFOU0FDVElPTik7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAogICAgICAgICBtQ29kZWMtPmNoYW5nZVN0YXRlKG1Db2RlYy0+bUlkbGVUb0xvYWRlZFN0YXRlKTsKQEAgLTU4OTYsNyArNjY4Myw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIERvbid0IHNlbmQgbWUgYSBmbHVzaCByZXF1ZXN0IGlmIHlvdSBwcmV2aW91c2x5IHdhbnRlZCBtZQogICAgICAgICAgICAgLy8gdG8gc2h1dGRvd24uCi0gICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgQUxPR0UoIkdvdCBmbHVzaCByZXF1ZXN0IGluIElkbGVUb0xvYWRlZFN0YXRlIik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC01OTE3LDggKzY3MDQsMTQgQEAKICAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgICAgIGNhc2UgT01YX0V2ZW50Q21kQ29tcGxldGU6CiAgICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLX0VRKGRhdGExLCAoT01YX1UzMilPTVhfQ29tbWFuZFN0YXRlU2V0KTsKLSAgICAgICAgICAgIENIRUNLX0VRKGRhdGEyLCAoT01YX1UzMilPTVhfU3RhdGVMb2FkZWQpOworICAgICAgICAgICAgaWYgKGRhdGExICE9IChPTVhfVTMyKU9NWF9Db21tYW5kU3RhdGVTZXQKKyAgICAgICAgICAgICAgICAgICAgfHwgZGF0YTIgIT0gKE9NWF9VMzIpT01YX1N0YXRlTG9hZGVkKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlVuZXhwZWN0ZWQgY29tbWFuZCBjb21wbGV0aW9uIGluIElkbGVUb0xvYWRlZFN0YXRlOiAlcygldSkgJXMoJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKChPTVhfQ09NTUFORFRZUEUpZGF0YTEpLCBkYXRhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKChPTVhfU1RBVEVUWVBFKWRhdGEyKSwgZGF0YTIpOworICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBGQUlMRURfVFJBTlNBQ1RJT04pOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtQ29kZWMtPmNoYW5nZVN0YXRlKG1Db2RlYy0+bUxvYWRlZFN0YXRlKTsKIApAQCAtNTk2OSwyOCArNjc2Miw0MSBAQAogCiBib29sIEFDb2RlYzo6Rmx1c2hpbmdTdGF0ZTo6b25PTVhFdmVudCgKICAgICAgICAgT01YX0VWRU5UVFlQRSBldmVudCwgT01YX1UzMiBkYXRhMSwgT01YX1UzMiBkYXRhMikgewotICAgIEFMT0dWKCJbJXNdIEZsdXNoaW5nU3RhdGUgb25PTVhFdmVudCglZCwlbGQpIiwKLSAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXZlbnQsIGRhdGExKTsKKyAgICBBTE9HVigiWyVzXSBGbHVzaGluZ1N0YXRlIG9uT01YRXZlbnQoJXUsJWQpIiwKKyAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXZlbnQsIChPTVhfUzMyKWRhdGExKTsKIAogICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICAgICAgY2FzZSBPTVhfRXZlbnRDbWRDb21wbGV0ZToKICAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0tfRVEoZGF0YTEsIChPTVhfVTMyKU9NWF9Db21tYW5kRmx1c2gpOworICAgICAgICAgICAgaWYgKGRhdGExICE9IChPTVhfVTMyKU9NWF9Db21tYW5kRmx1c2gpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgidW5leHBlY3RlZCBFdmVudENtZENvbXBsZXRlICVzKCVkKSBkYXRhMjolZCBpbiBGbHVzaGluZ1N0YXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKChPTVhfQ09NTUFORFRZUEUpZGF0YTEpLCBkYXRhMSwgZGF0YTIpOworICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBGQUlMRURfVFJBTlNBQ1RJT04pOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoZGF0YTIgPT0ga1BvcnRJbmRleElucHV0IHx8IGRhdGEyID09IGtQb3J0SW5kZXhPdXRwdXQpIHsKLSAgICAgICAgICAgICAgICBDSEVDSyghbUZsdXNoQ29tcGxldGVbZGF0YTJdKTsKKyAgICAgICAgICAgICAgICBpZiAobUZsdXNoQ29tcGxldGVbZGF0YTJdKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJGbHVzaCBhbHJlYWR5IGNvbXBsZXRlZCBmb3IgJXMgcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTIgPT0ga1BvcnRJbmRleElucHV0ID8gImlucHV0IiA6ICJvdXRwdXQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1GbHVzaENvbXBsZXRlW2RhdGEyXSA9IHRydWU7CiAKLSAgICAgICAgICAgICAgICBpZiAobUZsdXNoQ29tcGxldGVba1BvcnRJbmRleElucHV0XQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUZsdXNoQ29tcGxldGVba1BvcnRJbmRleE91dHB1dF0pIHsKKyAgICAgICAgICAgICAgICBpZiAobUZsdXNoQ29tcGxldGVba1BvcnRJbmRleElucHV0XSAmJiBtRmx1c2hDb21wbGV0ZVtrUG9ydEluZGV4T3V0cHV0XSkgewogICAgICAgICAgICAgICAgICAgICBjaGFuZ2VTdGF0ZUlmV2VPd25BbGxCdWZmZXJzKCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDSEVDS19FUShkYXRhMiwgT01YX0FMTCk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobUZsdXNoQ29tcGxldGVba1BvcnRJbmRleElucHV0XSk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobUZsdXNoQ29tcGxldGVba1BvcnRJbmRleE91dHB1dF0pOworICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhMiA9PSBPTVhfQUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtRmx1c2hDb21wbGV0ZVtrUG9ydEluZGV4SW5wdXRdIHx8ICFtRmx1c2hDb21wbGV0ZVtrUG9ydEluZGV4T3V0cHV0XSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygicmVjZWl2ZWQgZmx1c2ggY29tcGxldGUgZXZlbnQgZm9yIE9NWF9BTEwgYmVmb3JlIHBvcnRzIGhhdmUgYmVlbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmx1c2hlZCAoJWQvJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hDb21wbGV0ZVtrUG9ydEluZGV4SW5wdXRdLCBtRmx1c2hDb21wbGV0ZVtrUG9ydEluZGV4T3V0cHV0XSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBjaGFuZ2VTdGF0ZUlmV2VPd25BbGxCdWZmZXJzKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJkYXRhMiBub3QgT01YX0FMTCBidXQgJXUgaW4gRXZlbnRDbWRDb21wbGV0ZSBDb21tYW5kRmx1c2giLCBkYXRhMik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtNTk5OCw3ICs2ODA0LDcgQEAKIAogICAgICAgICBjYXNlIE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPTVhNZXNzYWdlLCBtQ29kZWMtPmlkKCkpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdE9NWE1lc3NhZ2UsIG1Db2RlYyk7CiAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJ0eXBlIiwgb214X21lc3NhZ2U6OkVWRU5UKTsKICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoIm5vZGUiLCBtQ29kZWMtPm1Ob2RlKTsKICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImV2ZW50IiwgZXZlbnQpOwpAQCAtNjA0MCw2ICs2ODQ2LDggQEAKICAgICAgICAgLy8gdGhlIG5hdGl2ZSB3aW5kb3cgZm9yIHJlbmRlcmluZy4gTGV0J3MgZ2V0IHRob3NlIGJhY2sgYXMgd2VsbC4KICAgICAgICAgbUNvZGVjLT53YWl0VW50aWxBbGxQb3NzaWJsZU5hdGl2ZVdpbmRvd0J1ZmZlcnNBcmVSZXR1cm5lZFRvVXMoKTsKIAorICAgICAgICBtQ29kZWMtPm1SZW5kZXJUcmFja2VyLmNsZWFyKHN5c3RlbVRpbWUoQ0xPQ0tfTU9OT1RPTklDKSk7CisKICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7CiAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpOwogICAgICAgICBub3RpZnktPnBvc3QoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUldyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwCmluZGV4IDlhYTdkOTUuLmY1M2Q3ZjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUldyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmNwcApAQCAtMzEsMTkgKzMxLDYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1BTVJXcml0ZXI6OkFNUldyaXRlcihjb25zdCBjaGFyICpmaWxlbmFtZSkKLSAgICA6IG1GZCgtMSksCi0gICAgICBtSW5pdENoZWNrKE5PX0lOSVQpLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbVBhdXNlZChmYWxzZSksCi0gICAgICBtUmVzdW1lZChmYWxzZSkgewotCi0gICAgbUZkID0gb3BlbihmaWxlbmFtZSwgT19DUkVBVCB8IE9fTEFSR0VGSUxFIHwgT19UUlVOQyB8IE9fUkRXUiwgU19JUlVTUiB8IFNfSVdVU1IpOwotICAgIGlmIChtRmQgPj0gMCkgewotICAgICAgICBtSW5pdENoZWNrID0gT0s7Ci0gICAgfQotfQotCiBBTVJXcml0ZXI6OkFNUldyaXRlcihpbnQgZmQpCiAgICAgOiBtRmQoZHVwKGZkKSksCiAgICAgICBtSW5pdENoZWNrKG1GZCA8IDA/IE5PX0lOSVQ6IE9LKSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCmluZGV4IDI2MjlhZmMuLjI1MjlhYTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tawpAQCAtMTIsNiArMTIsNyBAQAogICAgICAgICBBdWRpb1BsYXllci5jcHAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBBdWRpb1NvdXJjZS5jcHAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBBd2Vzb21lUGxheWVyLmNwcCAgICAgICAgICAgICAgICAgXAorICAgICAgICBDYWxsYmFja0RhdGFTb3VyY2UuY3BwICAgICAgICAgICAgXAogICAgICAgICBDYW1lcmFTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgXAogICAgICAgICBDYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwICAgICAgICAgXAogICAgICAgICBDbG9ja0VzdGltYXRvci5jcHAgICAgICAgICAgICAgICAgXApAQCAtMjIsNiArMjMsNyBAQAogICAgICAgICBFU0RTLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBGaWxlU291cmNlLmNwcCAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBGTEFDRXh0cmFjdG9yLmNwcCAgICAgICAgICAgICAgICAgXAorICAgICAgICBGcmFtZVJlbmRlclRyYWNrZXIuY3BwICAgICAgICAgICAgXAogICAgICAgICBIVFRQQmFzZS5jcHAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBKUEVHU291cmNlLmNwcCAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBNUDNFeHRyYWN0b3IuY3BwICAgICAgICAgICAgICAgICAgXApAQCAtMzEsMTEgKzMzLDE0IEBACiAgICAgICAgIE1lZGlhQWRhcHRlci5jcHAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE1lZGlhQnVmZmVyLmNwcCAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE1lZGlhQnVmZmVyR3JvdXAuY3BwICAgICAgICAgICAgICBcCisgICAgICAgIE1lZGlhQ2xvY2suY3BwICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE1lZGlhQ29kZWMuY3BwICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE1lZGlhQ29kZWNMaXN0LmNwcCAgICAgICAgICAgICAgICBcCisgICAgICAgIE1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcCAgICAgICBcCiAgICAgICAgIE1lZGlhQ29kZWNTb3VyY2UuY3BwICAgICAgICAgICAgICBcCiAgICAgICAgIE1lZGlhRGVmcy5jcHAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE1lZGlhRXh0cmFjdG9yLmNwcCAgICAgICAgICAgICAgICBcCisgICAgICAgIE1lZGlhU3luYy5jcHAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE1pZGlFeHRyYWN0b3IuY3BwICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGh0dHAvTWVkaWFIVFRQLmNwcCAgICAgICAgICAgICAgICBcCiAgICAgICAgIE1lZGlhTXV4ZXIuY3BwICAgICAgICAgICAgICAgICAgICBcCkBAIC00NiwxNyArNTEsMjAgQEAKICAgICAgICAgT01YQ2xpZW50LmNwcCAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgT01YQ29kZWMuY3BwICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgT2dnRXh0cmFjdG9yLmNwcCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUHJvY2Vzc0luZm8uY3BwICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgU2FtcGxlSXRlcmF0b3IuY3BwICAgICAgICAgICAgICAgIFwKICAgICAgICAgU2FtcGxlVGFibGUuY3BwICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgU2tpcEN1dEJ1ZmZlci5jcHAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwICAgICAgIFwKICAgICAgICAgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAgIFwKICAgICAgICAgU3VyZmFjZU1lZGlhU291cmNlLmNwcCAgICAgICAgICAgIFwKKyAgICAgICAgU3VyZmFjZVV0aWxzLmNwcCAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgVGhyb3R0bGVkU291cmNlLmNwcCAgICAgICAgICAgICAgIFwKICAgICAgICAgVGltZVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgVGltZWRFdmVudFF1ZXVlLmNwcCAgICAgICAgICAgICAgIFwKICAgICAgICAgVXRpbHMuY3BwICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgVkJSSVNlZWtlci5jcHAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAgICAgICAgICAgIFwKICAgICAgICAgV0FWRXh0cmFjdG9yLmNwcCAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgV1ZNRXh0cmFjdG9yLmNwcCAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgWElOR1NlZWtlci5jcHAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTg0LDYgKzkyLDcgQEAKICAgICAgICAgbGliaWN1dWMgXAogICAgICAgICBsaWJsb2cgXAogICAgICAgICBsaWJtZWRpYSBcCisgICAgICAgIGxpYm1lZGlhdXRpbHMgXAogICAgICAgICBsaWJuZXRkX2NsaWVudCBcCiAgICAgICAgIGxpYm9wdXMgXAogICAgICAgICBsaWJzb25pdm94IFwKQEAgLTEwMSw2ICsxMTAsNyBAQAogICAgICAgICBsaWJzdGFnZWZyaWdodF9jb2xvcl9jb252ZXJzaW9uIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfYWFjZW5jIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfbWF0cm9za2EgXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9tZWRpYWZpbHRlciBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X3dlYm0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF90aW1lZHRleHQgXAogICAgICAgICBsaWJ2cHggXApAQCAtMTA4LDE1ICsxMTgsMjMgQEAKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfbXBlZzJ0cyBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2lkMyBcCiAgICAgICAgIGxpYkZMQUMgXAotICAgICAgICBsaWJtZWRpYV9oZWxwZXIKKyAgICAgICAgbGlibWVkaWFfaGVscGVyIFwKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2VuY19jb21tb24gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9hdmNfY29tbW9uIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCi0gICAgICAgIGxpYmRsCisgICAgICAgIGxpYmRsIFwKKyAgICAgICAgbGliUlNjcHAgXAogCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yIC1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMgLVdhbGwKKworIyBlbmFibGUgZXhwZXJpbWVudHMgb25seSBpbiB1c2VyZGVidWcgYW5kIGVuZyBidWlsZHMKK2lmbmVxICgsJChmaWx0ZXIgdXNlcmRlYnVnIGVuZywkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSkpCitMT0NBTF9DRkxBR1MgKz0gLURFTkFCTEVfU1RBR0VGUklHSFRfRVhQRVJJTUVOVFMKK2VuZGlmCisKK0xPQ0FMX0NMQU5HIDo9IHRydWUKIAogTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCmluZGV4IGUyNDgyNGIuLmRkOWQzOTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAKQEAgLTQwOCwxMSArNDA4LDIyIEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBBdWRpb1BsYXllcjo6c2V0UGxheWJhY2tSYXRlUGVybWlsbGUoaW50MzJfdCByYXRlUGVybWlsbGUpIHsKK3N0YXR1c190IEF1ZGlvUGxheWVyOjpzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpIHsKICAgICBpZiAobUF1ZGlvU2luay5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBtQXVkaW9TaW5rLT5zZXRQbGF5YmFja1JhdGVQZXJtaWxsZShyYXRlUGVybWlsbGUpOworICAgICAgICByZXR1cm4gbUF1ZGlvU2luay0+c2V0UGxheWJhY2tSYXRlKHJhdGUpOwogICAgIH0gZWxzZSBpZiAobUF1ZGlvVHJhY2sgIT0gMCl7Ci0gICAgICAgIHJldHVybiBtQXVkaW9UcmFjay0+c2V0U2FtcGxlUmF0ZShyYXRlUGVybWlsbGUgKiBtU2FtcGxlUmF0ZSAvIDEwMDApOworICAgICAgICByZXR1cm4gbUF1ZGlvVHJhY2stPnNldFBsYXliYWNrUmF0ZShyYXRlKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUGxheWVyOjpnZXRQbGF5YmFja1JhdGUoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUgLyogbm9ubnVsbCAqLykgeworICAgIGlmIChtQXVkaW9TaW5rLmdldCgpICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb1NpbmstPmdldFBsYXliYWNrUmF0ZShyYXRlKTsKKyAgICB9IGVsc2UgaWYgKG1BdWRpb1RyYWNrICE9IDApIHsKKyAgICAgICAgKnJhdGUgPSBtQXVkaW9UcmFjay0+Z2V0UGxheWJhY2tSYXRlKCk7CisgICAgICAgIHJldHVybiBPSzsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAKaW5kZXggODA1ZjEyZS4uZDI1NDgwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcApAQCAtNTAsMTggKzUwLDIzIEBACiB9CiAKIEF1ZGlvU291cmNlOjpBdWRpb1NvdXJjZSgKLSAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsIHVpbnQzMl90IHNhbXBsZVJhdGUsIHVpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsIGNvbnN0IFN0cmluZzE2ICZvcFBhY2thZ2VOYW1lLAorICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCB1aW50MzJfdCBjaGFubmVsQ291bnQsIHVpbnQzMl90IG91dFNhbXBsZVJhdGUpCiAgICAgOiBtU3RhcnRlZChmYWxzZSksCiAgICAgICBtU2FtcGxlUmF0ZShzYW1wbGVSYXRlKSwKKyAgICAgIG1PdXRTYW1wbGVSYXRlKG91dFNhbXBsZVJhdGUgPiAwID8gb3V0U2FtcGxlUmF0ZSA6IHNhbXBsZVJhdGUpLAogICAgICAgbVRyYWNrTWF4QW1wbGl0dWRlKGZhbHNlKSwKICAgICAgIG1TdGFydFRpbWVVcygwKSwKICAgICAgIG1NYXhBbXBsaXR1ZGUoMCksCiAgICAgICBtUHJldlNhbXBsZVRpbWVVcygwKSwKKyAgICAgIG1GaXJzdFNhbXBsZVRpbWVVcygtMWxsKSwKICAgICAgIG1Jbml0aWFsUmVhZFRpbWVVcygwKSwKICAgICAgIG1OdW1GcmFtZXNSZWNlaXZlZCgwKSwKICAgICAgIG1OdW1DbGllbnRPd25lZEJ1ZmZlcnMoMCkgewotICAgIEFMT0dWKCJzYW1wbGVSYXRlOiAlZCwgY2hhbm5lbENvdW50OiAlZCIsIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCk7CisgICAgQUxPR1YoInNhbXBsZVJhdGU6ICV1LCBvdXRTYW1wbGVSYXRlOiAldSwgY2hhbm5lbENvdW50OiAldSIsCisgICAgICAgICAgICBzYW1wbGVSYXRlLCBvdXRTYW1wbGVSYXRlLCBjaGFubmVsQ291bnQpOwogICAgIENIRUNLKGNoYW5uZWxDb3VudCA9PSAxIHx8IGNoYW5uZWxDb3VudCA9PSAyKTsKKyAgICBDSEVDSyhzYW1wbGVSYXRlID4gMCk7CiAKICAgICBzaXplX3QgbWluRnJhbWVDb3VudDsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBBdWRpb1JlY29yZDo6Z2V0TWluRnJhbWVDb3VudCgmbWluRnJhbWVDb3VudCwKQEAgLTgyLDExICs4NywxNSBAQAogICAgICAgICBtUmVjb3JkID0gbmV3IEF1ZGlvUmVjb3JkKAogICAgICAgICAgICAgICAgICAgICBpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCksCisgICAgICAgICAgICAgICAgICAgIG9wUGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpIChidWZDb3VudCAqIGZyYW1lQ291bnQpLAogICAgICAgICAgICAgICAgICAgICBBdWRpb1JlY29yZENhbGxiYWNrRnVuY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQgLypub3RpZmljYXRpb25GcmFtZXMqLyk7CiAgICAgICAgIG1Jbml0Q2hlY2sgPSBtUmVjb3JkLT5pbml0Q2hlY2soKTsKKyAgICAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgICAgIG1SZWNvcmQuY2xlYXIoKTsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIG1Jbml0Q2hlY2sgPSBzdGF0dXM7CiAgICAgfQpAQCAtMjYwLDYgKzI2OSwxNSBAQAogICAgICAgICAgICAgKGludDE2X3QgKikgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPj4gMSk7CiAgICAgfQogCisgICAgaWYgKG1TYW1wbGVSYXRlICE9IG1PdXRTYW1wbGVSYXRlKSB7CisgICAgICAgIGlmIChtRmlyc3RTYW1wbGVUaW1lVXMgPCAwKSB7CisgICAgICAgICAgICBtRmlyc3RTYW1wbGVUaW1lVXMgPSB0aW1lVXM7CisgICAgICAgIH0KKyAgICAgICAgdGltZVVzID0gbUZpcnN0U2FtcGxlVGltZVVzICsgKHRpbWVVcyAtIG1GaXJzdFNhbXBsZVRpbWVVcykKKyAgICAgICAgICAgICAgICAqIChpbnQ2NF90KW1TYW1wbGVSYXRlIC8gKGludDY0X3QpbU91dFNhbXBsZVJhdGU7CisgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgIH0KKwogICAgICpvdXQgPSBidWZmZXI7CiAgICAgcmV0dXJuIE9LOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcAppbmRleCA4ODIxOWFmLi4zY2QwYjBlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcApAQCAtMTEzLDExICsxMTMsMTEgQEAKICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CiAKICAgICAgICAgcmVuZGVyKChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSwgdGltZVVzICogMTAwMCk7CisgICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpLCB0aW1lVXMsIHRpbWVVcyAqIDEwMDApOwogICAgIH0KIAotICAgIHZvaWQgcmVuZGVyKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBpbnQ2NF90IHRpbWVzdGFtcE5zKSB7Ci0gICAgICAgIG1UYXJnZXQtPnJlbmRlcihkYXRhLCBzaXplLCB0aW1lc3RhbXBOcywgTlVMTCwgbUZvcm1hdCk7CisgICAgdm9pZCByZW5kZXIoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIGludDY0X3QgbWVkaWFUaW1lVXMsIG5zZWNzX3QgcmVuZGVyVGltZU5zKSB7CisgICAgICAgICh2b2lkKW1UYXJnZXQtPnJlbmRlcihkYXRhLCBzaXplLCBtZWRpYVRpbWVVcywgcmVuZGVyVGltZU5zLCBOVUxMLCBtRm9ybWF0KTsKICAgICB9CiAKIHByb3RlY3RlZDoKQEAgLTI0MSw2ICsyNDEsOCBAQAogCiAgICAgbUNsb2NrRXN0aW1hdG9yID0gbmV3IFdpbmRvd2VkTGluZWFyRml0RXN0aW1hdG9yKCk7CiAKKyAgICBtUGxheWJhY2tTZXR0aW5ncyA9IEFVRElPX1BMQVlCQUNLX1JBVEVfREVGQVVMVDsKKwogICAgIHJlc2V0KCk7CiB9CiAKQEAgLTM2MCw3ICszNjIsNyBAQAogICAgIHJldHVybiBzZXREYXRhU291cmNlX2woZGF0YVNvdXJjZSk7CiB9CiAKLXN0YXR1c190IEF3ZXNvbWVQbGF5ZXI6OnNldERhdGFTb3VyY2UoY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSkgeworc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6c2V0RGF0YVNvdXJjZShjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlIF9fdW51c2VkKSB7CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogCkBAIC00MjIsNyArNDI0LDcgQEAKIAogICAgIG1CaXRyYXRlID0gdG90YWxCaXRSYXRlOwogCi0gICAgQUxPR1YoIm1CaXRyYXRlID0gJWxsZCBiaXRzL3NlYyIsIG1CaXRyYXRlKTsKKyAgICBBTE9HVigibUJpdHJhdGUgPSAlbGxkIGJpdHMvc2VjIiwgKGxvbmcgbG9uZyltQml0cmF0ZSk7CiAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdHNMb2NrKTsKQEAgLTEwMDksNiArMTAxMSwxMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBpZiAobUF1ZGlvUGxheWVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1BdWRpb1BsYXllci0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1NldHRpbmdzKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChtVGltZVNvdXJjZSA9PSBOVUxMICYmIG1BdWRpb1BsYXllciA9PSBOVUxMKSB7CkBAIC0xMTMxLDYgKzExMzcsMTAgQEAKICAgICB9CiAKICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIGVyciA9IG1BdWRpb1BsYXllci0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1NldHRpbmdzKTsKKyAgICB9CisKKyAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgIG1vZGlmeUZsYWdzKEFVRElPX1JVTk5JTkcsIFNFVCk7CiAKICAgICAgICAgbVdhdGNoRm9yQXVkaW9FT1MgPSB0cnVlOwpAQCAtMTcyMiw3ICsxNzMyLDcgQEAKICAgICAvLyB3ZSBhcmUgbm93IHJlc3VtaW5nLiAgU2lnbmFsIG5ldyBwb3NpdGlvbiB0byBtZWRpYSB0aW1lIHByb3ZpZGVyLgogICAgIC8vIENhbm5vdCBzaWduYWwgYW5vdGhlciBTRUVLX0NPTVBMRVRFLCBhcyBleGlzdGluZyBjbGllbnRzIG1heSBub3QgZXhwZWN0CiAgICAgLy8gbXVsdGlwbGUgU0VFS19DT01QTEVURSByZXNwb25zZXMgdG8gYSBzaW5nbGUgc2VlaygpIHJlcXVlc3QuCi0gICAgaWYgKG1TZWVrTm90aWZpY2F0aW9uU2VudCAmJiBhYnMobVNlZWtUaW1lVXMgLSB2aWRlb1RpbWVVcykgPiAxMDAwMCkgeworICAgIGlmIChtU2Vla05vdGlmaWNhdGlvblNlbnQgJiYgbGxhYnMoKGxvbmcgbG9uZykobVNlZWtUaW1lVXMgLSB2aWRlb1RpbWVVcykpID4gMTAwMDApIHsKICAgICAgICAgLy8gbm90aWZ5IGlmIHdlIGFyZSByZXN1bWluZyBtb3JlIHRoYW4gMTBtcyBhd2F5IGZyb20gZGVzaXJlZCBzZWVrIHRpbWUKICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9TS0lQUEVEKTsKICAgICB9CkBAIC0yMzU4LDcgKzIzNjgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19HRShtZXRhRGF0YVNpemUsIDBsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigibWV0YURhdGFTaXplID0gJWxsZCBieXRlcyIsIG1ldGFEYXRhU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigibWV0YURhdGFTaXplID0gJWxsZCBieXRlcyIsIChsb25nIGxvbmcpbWV0YURhdGFTaXplKTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIHVzbGVlcCgyMDAwMDApOwpAQCAtMjU1MywxNCArMjU2Myw2IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBzZXRDYWNoZVN0YXRDb2xsZWN0RnJlcShyZXF1ZXN0KTsKICAgICAgICAgfQotICAgICAgICBjYXNlIEtFWV9QQVJBTUVURVJfUExBWUJBQ0tfUkFURV9QRVJNSUxMRToKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1BdWRpb1BsYXllciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1BdWRpb1BsYXllci0+c2V0UGxheWJhY2tSYXRlUGVybWlsbGUocmVxdWVzdC5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICAgICAgfQotICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKQEAgLTI1OTcsNiArMjU5OSw1OCBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6c2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgLy8gY3Vyc29yeSBzYW5pdHkgY2hlY2sgZm9yIG5vbi1hdWRpbyBhbmQgcGF1c2VkIGNhc2VzCisgICAgaWYgKChyYXRlLm1TcGVlZCAhPSAwLmYgJiYgcmF0ZS5tU3BlZWQgPCBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NSU4pCisgICAgICAgIHx8IHJhdGUubVNwZWVkID4gQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUFYCisgICAgICAgIHx8IHJhdGUubVBpdGNoIDwgQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUlOCisgICAgICAgIHx8IHJhdGUubVBpdGNoID4gQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUFYKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgaWYgKHJhdGUubVNwZWVkID09IDAuZikgeworICAgICAgICBpZiAobUZsYWdzICYgUExBWUlORykgeworICAgICAgICAgICAgbW9kaWZ5RmxhZ3MoQ0FDSEVfVU5ERVJSVU4sIENMRUFSKTsgLy8gc2FtZSBhcyBwYXVzZQorICAgICAgICAgICAgZXJyID0gcGF1c2VfbCgpOworICAgICAgICB9CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIC8vIHNhdmUgc2V0dGluZ3MgKHVzaW5nIG9sZCBzcGVlZCkgaW4gY2FzZSBwbGF5ZXIgaXMgcmVzdW1lZAorICAgICAgICAgICAgQXVkaW9QbGF5YmFja1JhdGUgbmV3UmF0ZSA9IHJhdGU7CisgICAgICAgICAgICBuZXdSYXRlLm1TcGVlZCA9IG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZDsKKyAgICAgICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gbmV3UmF0ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBpZiAobUF1ZGlvUGxheWVyICE9IE5VTEwpIHsKKyAgICAgICAgZXJyID0gbUF1ZGlvUGxheWVyLT5zZXRQbGF5YmFja1JhdGUocmF0ZSk7CisgICAgfQorICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSByYXRlOworICAgICAgICBpZiAoIShtRmxhZ3MgJiBQTEFZSU5HKSkgeworICAgICAgICAgICAgcGxheV9sKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6Z2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSAvKiBub25udWxsICovKSB7CisgICAgaWYgKG1BdWRpb1BsYXllciAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1BsYXllci0+Z2V0UGxheWJhY2tSYXRlKHJhdGUpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBtUGxheWJhY2tTZXR0aW5ncyA9ICpyYXRlOworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgIGlmICghKG1GbGFncyAmIFBMQVlJTkcpKSB7CisgICAgICAgICAgICAgICAgcmF0ZS0+bVNwZWVkID0gMC5mOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgICpyYXRlID0gbVBsYXliYWNrU2V0dGluZ3M7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpnZXRUcmFja0luZm8oUGFyY2VsICpyZXBseSkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgc2l6ZV90IHRyYWNrQ291bnQgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FsbGJhY2tEYXRhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbGxiYWNrRGF0YVNvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE3ZmRmOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbGxiYWNrRGF0YVNvdXJjZS5jcHAKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2FsbGJhY2tEYXRhU291cmNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiaW5jbHVkZS9DYWxsYmFja0RhdGFTb3VyY2UuaCIKKworI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvSURhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0NhbGxiYWNrRGF0YVNvdXJjZTo6Q2FsbGJhY2tEYXRhU291cmNlKAorICAgIGNvbnN0IHNwPElEYXRhU291cmNlPiYgYmluZGVyRGF0YVNvdXJjZSkKKyAgICA6IG1JRGF0YVNvdXJjZShiaW5kZXJEYXRhU291cmNlKSB7CisgICAgLy8gU2V0IHVwIHRoZSBidWZmZXIgdG8gcmVhZCBpbnRvLgorICAgIG1NZW1vcnkgPSBtSURhdGFTb3VyY2UtPmdldElNZW1vcnkoKTsKK30KKworQ2FsbGJhY2tEYXRhU291cmNlOjp+Q2FsbGJhY2tEYXRhU291cmNlKCkgeworICAgIEFMT0dWKCJ+Q2FsbGJhY2tEYXRhU291cmNlIik7CisgICAgbUlEYXRhU291cmNlLT5jbG9zZSgpOworfQorCitzdGF0dXNfdCBDYWxsYmFja0RhdGFTb3VyY2U6OmluaXRDaGVjaygpIGNvbnN0IHsKKyAgICBpZiAobU1lbW9yeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3NzaXplX3QgQ2FsbGJhY2tEYXRhU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1NZW1vcnkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8gSURhdGFTb3VyY2UgY2FuIG9ubHkgcmVhZCB1cCB0byBtTWVtb3J5LT5zaXplKCkgYnl0ZXMgYXQgYSB0aW1lLCBidXQgdGhpcworICAgIC8vIG1ldGhvZCBzaG91bGQgYmUgYWJsZSB0byByZWFkIGFueSBudW1iZXIgb2YgYnl0ZXMsIHNvIHJlYWQgaW4gYSBsb29wLgorICAgIHNpemVfdCB0b3RhbE51bVJlYWQgPSAwOworICAgIHNpemVfdCBudW1MZWZ0ID0gc2l6ZTsKKyAgICBjb25zdCBzaXplX3QgYnVmZmVyU2l6ZSA9IG1NZW1vcnktPnNpemUoKTsKKworICAgIHdoaWxlIChudW1MZWZ0ID4gMCkgeworICAgICAgICBzaXplX3QgbnVtVG9SZWFkID0gc3RkOjptaW4obnVtTGVmdCwgYnVmZmVyU2l6ZSk7CisgICAgICAgIHNzaXplX3QgbnVtUmVhZCA9CisgICAgICAgICAgICBtSURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQgKyB0b3RhbE51bVJlYWQsIG51bVRvUmVhZCk7CisgICAgICAgIC8vIEEgbmVnYXRpdmUgcmV0dXJuIHZhbHVlIHJlcHJlc2VudHMgYW4gZXJyb3IuIFBhc3MgaXQgb24uCisgICAgICAgIGlmIChudW1SZWFkIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIG51bVJlYWQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gQSB6ZXJvIHJldHVybiB2YWx1ZSBzaWduYWxzIEVPUy4gUmV0dXJuIHRoZSBieXRlcyByZWFkIHNvIGZhci4KKyAgICAgICAgaWYgKG51bVJlYWQgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHRvdGFsTnVtUmVhZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHNpemVfdCludW1SZWFkID4gbnVtVG9SZWFkKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgICAgICB9CisgICAgICAgIENIRUNLKG51bVJlYWQgPj0gMCAmJiAoc2l6ZV90KW51bVJlYWQgPD0gYnVmZmVyU2l6ZSk7CisgICAgICAgIG1lbWNweSgoKHVpbnQ4X3QqKWRhdGEpICsgdG90YWxOdW1SZWFkLCBtTWVtb3J5LT5wb2ludGVyKCksIG51bVJlYWQpOworICAgICAgICBudW1MZWZ0IC09IG51bVJlYWQ7CisgICAgICAgIHRvdGFsTnVtUmVhZCArPSBudW1SZWFkOworICAgIH0KKworICAgIHJldHVybiB0b3RhbE51bVJlYWQ7Cit9CisKK3N0YXR1c190IENhbGxiYWNrRGF0YVNvdXJjZTo6Z2V0U2l6ZShvZmY2NF90ICpzaXplKSB7CisgICAgc3RhdHVzX3QgZXJyID0gbUlEYXRhU291cmNlLT5nZXRTaXplKHNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgaWYgKCpzaXplIDwgMCkgeworICAgICAgICAvLyBJRGF0YVNvdXJjZSB3aWxsIHNldCBzaXplIHRvIC0xIHRvIGluZGljYXRlIHVua25vd24gc2l6ZSwgYnV0CisgICAgICAgIC8vIERhdGFTb3VyY2UgcmV0dXJucyBFUlJPUl9VTlNVUFBPUlRFRCBmb3IgdGhhdC4KKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK1RpbnlDYWNoZVNvdXJjZTo6VGlueUNhY2hlU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+JiBzb3VyY2UpCisgICAgOiBtU291cmNlKHNvdXJjZSksIG1DYWNoZWRPZmZzZXQoMCksIG1DYWNoZWRTaXplKDApIHsKK30KKworc3RhdHVzX3QgVGlueUNhY2hlU291cmNlOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1Tb3VyY2UtPmluaXRDaGVjaygpOworfQorCitzc2l6ZV90IFRpbnlDYWNoZVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChzaXplID49IGtDYWNoZVNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPnJlYWRBdChvZmZzZXQsIGRhdGEsIHNpemUpOworICAgIH0KKworICAgIC8vIENoZWNrIGlmIHRoZSBjYWNoZSBzYXRpc2ZpZXMgdGhlIHJlYWQuCisgICAgaWYgKG1DYWNoZWRPZmZzZXQgPD0gb2Zmc2V0CisgICAgICAgICAgICAmJiBvZmZzZXQgPCAob2ZmNjRfdCkgKG1DYWNoZWRPZmZzZXQgKyBtQ2FjaGVkU2l6ZSkpIHsKKyAgICAgICAgaWYgKG9mZnNldCArIHNpemUgPD0gbUNhY2hlZE9mZnNldCArIG1DYWNoZWRTaXplKSB7CisgICAgICAgICAgICBtZW1jcHkoZGF0YSwgJm1DYWNoZVtvZmZzZXQgLSBtQ2FjaGVkT2Zmc2V0XSwgc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBjYWNoZSBoaXRzIG9ubHkgcGFydGlhbGx5LCBmbHVzaCB0aGUgY2FjaGUgYW5kIHJlYWQgdGhlCisgICAgICAgICAgICAvLyByZW1haW5kZXIuCisKKyAgICAgICAgICAgIC8vIFRoaXMgdmFsdWUgaXMgZ3VhcmFudGVlZCB0byBiZSBncmVhdGVyIHRoYW4gMCBiZWNhdXNlIG9mIHRoZQorICAgICAgICAgICAgLy8gZW5jbG9zaW5nIGlmIHN0YXRlbWVudC4KKyAgICAgICAgICAgIGNvbnN0IHNzaXplX3QgcmVtYWluaW5nID0gbUNhY2hlZE9mZnNldCArIG1DYWNoZWRTaXplIC0gb2Zmc2V0OworICAgICAgICAgICAgbWVtY3B5KGRhdGEsICZtQ2FjaGVbb2Zmc2V0IC0gbUNhY2hlZE9mZnNldF0sIHJlbWFpbmluZyk7CisgICAgICAgICAgICBjb25zdCBzc2l6ZV90IHJlYWRNb3JlID0gcmVhZEF0KG9mZnNldCArIHJlbWFpbmluZywKKyAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKWRhdGEgKyByZW1haW5pbmcsIHNpemUgLSByZW1haW5pbmcpOworICAgICAgICAgICAgaWYgKHJlYWRNb3JlIDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZWFkTW9yZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZW1haW5pbmcgKyByZWFkTW9yZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEZpbGwgdGhlIGNhY2hlIGFuZCBjb3B5IHRvIHRoZSBjYWxsZXIuCisgICAgY29uc3Qgc3NpemVfdCBudW1SZWFkID0gbVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgbUNhY2hlLCBrQ2FjaGVTaXplKTsKKyAgICBpZiAobnVtUmVhZCA8PSAwKSB7CisgICAgICAgIHJldHVybiBudW1SZWFkOworICAgIH0KKyAgICBpZiAoKHNpemVfdCludW1SZWFkID4ga0NhY2hlU2l6ZSkgeworICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgIH0KKworICAgIG1DYWNoZWRTaXplID0gbnVtUmVhZDsKKyAgICBtQ2FjaGVkT2Zmc2V0ID0gb2Zmc2V0OworICAgIENIRUNLKG1DYWNoZWRTaXplIDw9IGtDYWNoZVNpemUgJiYgbUNhY2hlZE9mZnNldCA+PSAwKTsKKyAgICBjb25zdCBzaXplX3QgbnVtVG9SZXR1cm4gPSBzdGQ6Om1pbihzaXplLCAoc2l6ZV90KW51bVJlYWQpOworICAgIG1lbWNweShkYXRhLCBtQ2FjaGUsIG51bVRvUmV0dXJuKTsKKworICAgIHJldHVybiBudW1Ub1JldHVybjsKK30KKworc3RhdHVzX3QgVGlueUNhY2hlU291cmNlOjpnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICByZXR1cm4gbVNvdXJjZS0+Z2V0U2l6ZShzaXplKTsKK30KKwordWludDMyX3QgVGlueUNhY2hlU291cmNlOjpmbGFncygpIHsKKyAgICByZXR1cm4gbVNvdXJjZS0+ZmxhZ3MoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKaW5kZXggYWQxMmJkZC4uNjYyODBkYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCkBAIC02MDgsNiArNjA4LDE2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBlcnIgPSBtQ2FtZXJhLT5zZW5kQ29tbWFuZCgKKyAgICAgICAgQ0FNRVJBX0NNRF9TRVRfVklERU9fRk9STUFULCBtRW5jb2RlckZvcm1hdCwgbUVuY29kZXJEYXRhU3BhY2UpOworCisgICAgLy8gVGhpcyBjb3VsZCBoYXBwZW4gZm9yIENhbWVyYUhBTDEgY2xpZW50czsgdGh1cyB0aGUgZmFpbHVyZSBpcworICAgIC8vIG5vdCBhIGZhdGFsIGVycm9yCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHNldCB2aWRlbyBlbmNvZGVyIGZvcm1hdC9kYXRhc3BhY2UgdG8gJWQsICVkIGR1ZSB0byAlZCIsCisgICAgICAgICAgICAgICAgbUVuY29kZXJGb3JtYXQsIG1FbmNvZGVyRGF0YVNwYWNlLCBlcnIpOworICAgIH0KKwogICAgIGVyciA9IE9LOwogICAgIGlmIChtQ2FtZXJhRmxhZ3MgJiBGTEFHU19IT1RfQ0FNRVJBKSB7CiAgICAgICAgIG1DYW1lcmEtPnVubG9jaygpOwpAQCAtNjQ1LDYgKzY1NSw5IEBACiAKICAgICBtU3RhcnRUaW1lVXMgPSAwOwogICAgIG1OdW1JbnB1dEJ1ZmZlcnMgPSAwOworICAgIG1FbmNvZGVyRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOworICAgIG1FbmNvZGVyRGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9CVDcwOTsKKwogICAgIGlmIChtZXRhKSB7CiAgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXM7CiAgICAgICAgIGlmIChtZXRhLT5maW5kSW50NjQoa0tleVRpbWUsICZzdGFydFRpbWVVcykpIHsKQEAgLTY1Niw2ICs2NjksMTQgQEAKICAgICAgICAgICAgIENIRUNLX0dUKG5CdWZmZXJzLCAwKTsKICAgICAgICAgICAgIG1OdW1JbnB1dEJ1ZmZlcnMgPSBuQnVmZmVyczsKICAgICAgICAgfQorCisgICAgICAgIC8vIGFwcGx5IGVuY29kZXIgY29sb3IgZm9ybWF0IGlmIHNwZWNpZmllZAorICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlQaXhlbEZvcm1hdCwgJm1FbmNvZGVyRm9ybWF0KSkgeworICAgICAgICAgICAgQUxPR1YoIlVzaW5nIGVuY29kZXIgZm9ybWF0OiAlI3giLCBtRW5jb2RlckZvcm1hdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JTcGFjZSwgJm1FbmNvZGVyRGF0YVNwYWNlKSkgeworICAgICAgICAgICAgQUxPR1YoIlVzaW5nIGVuY29kZXIgZGF0YSBzcGFjZTogJSN4IiwgbUVuY29kZXJEYXRhU3BhY2UpOworICAgICAgICB9CiAgICAgfQogCiAgICAgc3RhdHVzX3QgZXJyOwpAQCAtODUxLDIyICs4NzIsMTUgQEAKIH0KIAogdm9pZCBDYW1lcmFTb3VyY2U6OmRhdGFDYWxsYmFja1RpbWVzdGFtcChpbnQ2NF90IHRpbWVzdGFtcFVzLAotICAgICAgICBpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKSB7Ci0gICAgQUxPR1YoImRhdGFDYWxsYmFja1RpbWVzdGFtcDogdGltZXN0YW1wICUiIFBSSWQ2NCAiIHVzIiwgdGltZXN0YW1wVXMpOworICAgICAgICBpbnQzMl90IG1zZ1R5cGUgX191bnVzZWQsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKSB7CisgICAgQUxPR1YoImRhdGFDYWxsYmFja1RpbWVzdGFtcDogdGltZXN0YW1wICVsbGQgdXMiLCAobG9uZyBsb25nKXRpbWVzdGFtcFVzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIGlmICghbVN0YXJ0ZWQgfHwgKG1OdW1GcmFtZXNSZWNlaXZlZCA9PSAwICYmIHRpbWVzdGFtcFVzIDwgbVN0YXJ0VGltZVVzKSkgewotICAgICAgICBBTE9HVigiRHJvcCBmcmFtZSBhdCAlIiBQUklkNjQgIi8lIiBQUklkNjQgIiB1cyIsIHRpbWVzdGFtcFVzLCBtU3RhcnRUaW1lVXMpOworICAgICAgICBBTE9HVigiRHJvcCBmcmFtZSBhdCAlbGxkLyVsbGQgdXMiLCAobG9uZyBsb25nKXRpbWVzdGFtcFVzLCAobG9uZyBsb25nKW1TdGFydFRpbWVVcyk7CiAgICAgICAgIHJlbGVhc2VPbmVSZWNvcmRpbmdGcmFtZShkYXRhKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmIChtTnVtRnJhbWVzUmVjZWl2ZWQgPiAwKSB7Ci0gICAgICAgIENIRUNLKHRpbWVzdGFtcFVzID4gbUxhc3RGcmFtZVRpbWVzdGFtcFVzKTsKLSAgICAgICAgaWYgKHRpbWVzdGFtcFVzIC0gbUxhc3RGcmFtZVRpbWVzdGFtcFVzID4gbUdsaXRjaER1cmF0aW9uVGhyZXNob2xkVXMpIHsKLSAgICAgICAgICAgICsrbU51bUdsaXRjaGVzOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLy8gTWF5IG5lZWQgdG8gc2tpcCBmcmFtZSBvciBtb2RpZnkgdGltZXN0YW1wLiBDdXJyZW50bHkgaW1wbGVtZW50ZWQKICAgICAvLyBieSB0aGUgc3ViY2xhc3MgQ2FtZXJhU291cmNlVGltZUxhcHNlLgogICAgIGlmIChza2lwQ3VycmVudEZyYW1lKHRpbWVzdGFtcFVzKSkgewpAQCAtODc0LDYgKzg4OCwxOCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgaWYgKG1OdW1GcmFtZXNSZWNlaXZlZCA+IDApIHsKKyAgICAgICAgaWYgKHRpbWVzdGFtcFVzIDw9IG1MYXN0RnJhbWVUaW1lc3RhbXBVcykgeworICAgICAgICAgICAgQUxPR1coIkRyb3BwaW5nIGZyYW1lIHdpdGggYmFja3dhcmQgdGltZXN0YW1wICVsbGQgKGxhc3QgJWxsZCkiLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVzdGFtcFVzLCAobG9uZyBsb25nKW1MYXN0RnJhbWVUaW1lc3RhbXBVcyk7CisgICAgICAgICAgICByZWxlYXNlT25lUmVjb3JkaW5nRnJhbWUoZGF0YSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRpbWVzdGFtcFVzIC0gbUxhc3RGcmFtZVRpbWVzdGFtcFVzID4gbUdsaXRjaER1cmF0aW9uVGhyZXNob2xkVXMpIHsKKyAgICAgICAgICAgICsrbU51bUdsaXRjaGVzOworICAgICAgICB9CisgICAgfQorCiAgICAgbUxhc3RGcmFtZVRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CiAgICAgaWYgKG1OdW1GcmFtZXNSZWNlaXZlZCA9PSAwKSB7CiAgICAgICAgIG1GaXJzdEZyYW1lVGltZVVzID0gdGltZXN0YW1wVXM7CkBAIC05MTMsNyArOTM5LDcgQEAKICAgICBtU291cmNlLT5kYXRhQ2FsbGJhY2tUaW1lc3RhbXAodGltZXN0YW1wIC8gMTAwMCwgbXNnVHlwZSwgZGF0YVB0cik7CiB9CiAKLXZvaWQgQ2FtZXJhU291cmNlOjpEZWF0aE5vdGlmaWVyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pIHsKK3ZvaWQgQ2FtZXJhU291cmNlOjpEZWF0aE5vdGlmaWVyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpIHsKICAgICBBTE9HSSgiQ2FtZXJhIHJlY29yZGluZyBwcm94eSBkaWVkIik7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKaW5kZXggZGMzYjM5My4uNTAyMGM2YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlICJpbmNsdWRlL0FNUkV4dHJhY3Rvci5oIgogCiAjaW5jbHVkZSAiaW5jbHVkZS9BQUNFeHRyYWN0b3IuaCIKKyNpbmNsdWRlICJpbmNsdWRlL0NhbGxiYWNrRGF0YVNvdXJjZS5oIgogI2luY2x1ZGUgImluY2x1ZGUvRFJNRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9GTEFDRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9IVFRQQmFzZS5oIgpAQCAtMjgxLDYgKzI4MiwxMCBAQAogICAgIH0KIH0KIAorc3A8RGF0YVNvdXJjZT4gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbUlEYXRhU291cmNlKGNvbnN0IHNwPElEYXRhU291cmNlPiAmc291cmNlKSB7CisgICAgcmV0dXJuIG5ldyBUaW55Q2FjaGVTb3VyY2UobmV3IENhbGxiYWNrRGF0YVNvdXJjZShzb3VyY2UpKTsKK30KKwogU3RyaW5nOCBEYXRhU291cmNlOjpnZXRNSU1FVHlwZSgpIGNvbnN0IHsKICAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GTEFDRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZMQUNFeHRyYWN0b3IuY3BwCmluZGV4IGZhNzI1MWMuLjg5YTkxZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZMQUNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZMQUNFeHRyYWN0b3IuY3BwCkBAIC02NTEsMTAgKzY1MSwxMCBAQAogICAgIGlmIChkb1NlZWspIHsKICAgICAgICAgLy8gV2UgaW1wbGVtZW50IHRoZSBzZWVrIGNhbGxiYWNrLCBzbyB0aGlzIHdvcmtzIHdpdGhvdXQgZXhwbGljaXQgZmx1c2gKICAgICAgICAgaWYgKCFGTEFDX19zdHJlYW1fZGVjb2Rlcl9zZWVrX2Fic29sdXRlKG1EZWNvZGVyLCBzYW1wbGUpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRkxBQ1BhcnNlcjo6cmVhZEJ1ZmZlciBzZWVrIHRvIHNhbXBsZSAlbGx1IGZhaWxlZCIsIHNhbXBsZSk7CisgICAgICAgICAgICBBTE9HRSgiRkxBQ1BhcnNlcjo6cmVhZEJ1ZmZlciBzZWVrIHRvIHNhbXBsZSAlbGxkIGZhaWxlZCIsIChsb25nIGxvbmcpc2FtcGxlKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJGTEFDUGFyc2VyOjpyZWFkQnVmZmVyIHNlZWsgdG8gc2FtcGxlICVsbHUgc3VjY2VlZGVkIiwgc2FtcGxlKTsKKyAgICAgICAgQUxPR1YoIkZMQUNQYXJzZXI6OnJlYWRCdWZmZXIgc2VlayB0byBzYW1wbGUgJWxsZCBzdWNjZWVkZWQiLCAobG9uZyBsb25nKXNhbXBsZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKCFGTEFDX19zdHJlYW1fZGVjb2Rlcl9wcm9jZXNzX3NpbmdsZShtRGVjb2RlcikpIHsKICAgICAgICAgICAgIEFMT0dFKCJGTEFDUGFyc2VyOjpyZWFkQnVmZmVyIHByb2Nlc3Nfc2luZ2xlIGZhaWxlZCIpOwpAQCAtNjc0LDcgKzY3NCwxMCBAQAogICAgIGlmIChtV3JpdGVIZWFkZXIuc2FtcGxlX3JhdGUgIT0gZ2V0U2FtcGxlUmF0ZSgpIHx8CiAgICAgICAgIG1Xcml0ZUhlYWRlci5jaGFubmVscyAhPSBnZXRDaGFubmVscygpIHx8CiAgICAgICAgIG1Xcml0ZUhlYWRlci5iaXRzX3Blcl9zYW1wbGUgIT0gZ2V0Qml0c1BlclNhbXBsZSgpKSB7Ci0gICAgICAgIEFMT0dFKCJGTEFDUGFyc2VyOjpyZWFkQnVmZmVyIHdyaXRlIGNoYW5nZWQgcGFyYW1ldGVycyBtaWQtc3RyZWFtIik7CisgICAgICAgIEFMT0dFKCJGTEFDUGFyc2VyOjpyZWFkQnVmZmVyIHdyaXRlIGNoYW5nZWQgcGFyYW1ldGVycyBtaWQtc3RyZWFtOiAlZC8lZC8lZCAtPiAlZC8lZC8lZCIsCisgICAgICAgICAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpLCBnZXRDaGFubmVscygpLCBnZXRCaXRzUGVyU2FtcGxlKCksCisgICAgICAgICAgICAgICAgbVdyaXRlSGVhZGVyLnNhbXBsZV9yYXRlLCBtV3JpdGVIZWFkZXIuY2hhbm5lbHMsIG1Xcml0ZUhlYWRlci5iaXRzX3Blcl9zYW1wbGUpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgLy8gYWNxdWlyZSBhIG1lZGlhIGJ1ZmZlcgogICAgIENIRUNLKG1Hcm91cCAhPSBOVUxMKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAKaW5kZXggYTdjYTNkYS4uNTY1ZjE1NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAKQEAgLTE0LDYgKzE0LDEwIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkZpbGVTb3VyY2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KQEAgLTEwNyw3ICsxMTEsNyBAQAogICAgfSBlbHNlIHsKICAgICAgICAgb2ZmNjRfdCByZXN1bHQgPSBsc2VlazY0KG1GZCwgb2Zmc2V0ICsgbU9mZnNldCwgU0VFS19TRVQpOwogICAgICAgICBpZiAocmVzdWx0ID09IC0xKSB7Ci0gICAgICAgICAgICBBTE9HRSgic2VlayB0byAlbGxkIGZhaWxlZCIsIG9mZnNldCArIG1PZmZzZXQpOworICAgICAgICAgICAgQUxPR0UoInNlZWsgdG8gJWxsZCBmYWlsZWQiLCAobG9uZyBsb25nKShvZmZzZXQgKyBtT2Zmc2V0KSk7CiAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZVJlbmRlclRyYWNrZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTc4NzBmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmNwcApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJGcmFtZVJlbmRlclRyYWNrZXIiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZyYW1lUmVuZGVyVHJhY2tlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0ZyYW1lUmVuZGVyVHJhY2tlcjo6RnJhbWVSZW5kZXJUcmFja2VyKCkKKyAgICA6IG1MYXN0UmVuZGVyVGltZU5zKC0xKSwKKyAgICAgIG1Db21wb25lbnROYW1lKCJ1bmtub3duIGNvbXBvbmVudCIpIHsKK30KKworRnJhbWVSZW5kZXJUcmFja2VyOjp+RnJhbWVSZW5kZXJUcmFja2VyKCkgeworfQorCit2b2lkIEZyYW1lUmVuZGVyVHJhY2tlcjo6c2V0Q29tcG9uZW50TmFtZShjb25zdCBBU3RyaW5nICZjb21wb25lbnROYW1lKSB7CisgICAgbUNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lOworfQorCit2b2lkIEZyYW1lUmVuZGVyVHJhY2tlcjo6Y2xlYXIobnNlY3NfdCBsYXN0UmVuZGVyVGltZU5zKSB7CisgICAgbVJlbmRlclF1ZXVlLmNsZWFyKCk7CisgICAgbUxhc3RSZW5kZXJUaW1lTnMgPSBsYXN0UmVuZGVyVGltZU5zOworfQorCit2b2lkIEZyYW1lUmVuZGVyVHJhY2tlcjo6b25GcmFtZVF1ZXVlZCgKKyAgICAgICAgaW50NjRfdCBtZWRpYVRpbWVVcywgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIsIGNvbnN0IHNwPEZlbmNlPiAmZmVuY2UpIHsKKyAgICBtUmVuZGVyUXVldWUuZW1wbGFjZV9iYWNrKG1lZGlhVGltZVVzLCBncmFwaGljQnVmZmVyLCBmZW5jZSk7Cit9CisKK0ZyYW1lUmVuZGVyVHJhY2tlcjo6SW5mbyAqRnJhbWVSZW5kZXJUcmFja2VyOjp1cGRhdGVJbmZvRm9yRGVxdWV1ZWRCdWZmZXIoCisgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIgKmJ1ZiwgaW50IGZlbmNlRmQsIGludCBpbmRleCkgeworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLy8gc2VlIGlmIHRoaXMgaXMgYSBidWZmZXIgdGhhdCB3YXMgdG8gYmUgcmVuZGVyZWQKKyAgICBzdGQ6Omxpc3Q8SW5mbz46Oml0ZXJhdG9yIHJlbmRlckluZm8gPSBtUmVuZGVyUXVldWUuZW5kKCk7CisgICAgZm9yIChzdGQ6Omxpc3Q8SW5mbz46Oml0ZXJhdG9yIGl0ID0gbVJlbmRlclF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICBpdCAhPSBtUmVuZGVyUXVldWUuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKGl0LT5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlID09IGJ1Zi0+aGFuZGxlKSB7CisgICAgICAgICAgICByZW5kZXJJbmZvID0gaXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocmVuZGVySW5mbyA9PSBtUmVuZGVyUXVldWUuZW5kKCkpIHsKKyAgICAgICAgLy8gY291bGQgaGF2ZSBiZWVuIGNhbmNlbGVkIGFmdGVyIGZlbmNlIGhhcyBzaWduYWxlZAorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAocmVuZGVySW5mby0+bUluZGV4ID49IDApIHsKKyAgICAgICAgLy8gYnVmZmVyIGhhcyBiZWVuIGRlcXVldWVkIGJlZm9yZSwgc28gdGhlcmUgaXMgbm90aGluZyB0byBkbworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyB3YXMgdGhpcyBmcmFtZSBkcm9wcGVkICh3ZSBjb3VsZCBhbHNvIGluZmVyIHRoaXMgaWYgdGhlIGZlbmNlIGlzIGludmFsaWQgb3IgYSBkdXAgb2YKKyAgICAvLyB0aGUgcXVldWVkIGZlbmNlOyBob3dldmVyLCB0aGVyZSBpcyBubyB3YXkgdG8gZmlndXJlIHRoYXQgb3V0LikKKyAgICBpZiAoZmVuY2VGZCA8IDApIHsKKyAgICAgICAgLy8gZnJhbWUgaXMgbmV3IG9yIHdhcyBkcm9wcGVkCisgICAgICAgIG1SZW5kZXJRdWV1ZS5lcmFzZShyZW5kZXJJbmZvKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLy8gc3RvcmUgZGVxdWV1ZSBmZW5jZSBhbmQgYnVmZmVyIGluZGV4CisgICAgcmVuZGVySW5mby0+bUZlbmNlID0gbmV3IEZlbmNlKDo6ZHVwKGZlbmNlRmQpKTsKKyAgICByZW5kZXJJbmZvLT5tSW5kZXggPSBpbmRleDsKKyAgICByZXR1cm4gJipyZW5kZXJJbmZvOworfQorCitzdGF0dXNfdCBGcmFtZVJlbmRlclRyYWNrZXI6Om9uRnJhbWVSZW5kZXJlZChpbnQ2NF90IG1lZGlhVGltZVVzLCBuc2Vjc190IHN5c3RlbU5hbm8pIHsKKyAgICAvLyBlbnN1cmUgbW9ub3RvbmljIHRpbWVzdGFtcHMKKyAgICBpZiAobUxhc3RSZW5kZXJUaW1lTnMgPj0gc3lzdGVtTmFubykgeworICAgICAgICBBTE9HVygiWyVzXSBJZ25vcmluZyBvdXQgb2Ygb3JkZXIvc3RhbGUgc3lzdGVtIG5hbm8gJWxsZCBmb3IgbWVkaWEgdGltZSAlbGxkIGZyb20gY29kZWMuIiwKKyAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCAobG9uZyBsb25nKXN5c3RlbU5hbm8sIChsb25nIGxvbmcpbWVkaWFUaW1lVXMpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworICAgIGlmIChzeXN0ZW1OYW5vID4gbm93KSB7CisgICAgICAgIEFMT0dXKCJbJXNdIElnbm9yaW5nIHN5c3RlbSBuYW5vICVsbGQgaW4gdGhlIGZ1dHVyZSBmb3IgbWVkaWEgdGltZSAlbGxkIGZyb20gY29kZWMuIiwKKyAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCAobG9uZyBsb25nKXN5c3RlbU5hbm8sIChsb25nIGxvbmcpbWVkaWFUaW1lVXMpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgbVJlbmRlclF1ZXVlLmVtcGxhY2VfYmFjayhtZWRpYVRpbWVVcywgc3lzdGVtTmFubyk7CisgICAgbUxhc3RSZW5kZXJUaW1lTnMgPSBzeXN0ZW1OYW5vOworICAgIHJldHVybiBPSzsKK30KKworc3RkOjpsaXN0PEZyYW1lUmVuZGVyVHJhY2tlcjo6SW5mbz4gRnJhbWVSZW5kZXJUcmFja2VyOjpjaGVja0ZlbmNlc0FuZEdldFJlbmRlcmVkRnJhbWVzKAorICAgICAgICBjb25zdCBGcmFtZVJlbmRlclRyYWNrZXI6OkluZm8gKnVudGlsLCBib29sIGRyb3BJbmNvbXBsZXRlKSB7CisgICAgc3RkOjpsaXN0PEluZm8+IGRvbmU7CisKKyAgICAvLyBjb21wbGV0ZSBhbnkgZnJhbWVzIHF1ZXVlZCBwcmlvciB0byB0aGlzIGFuZCBkcm9wIGFueSBpbmNvbXBsZXRlIG9uZXMgaWYgcmVxdWVzdGVkCisgICAgZm9yIChzdGQ6Omxpc3Q8SW5mbz46Oml0ZXJhdG9yIGl0ID0gbVJlbmRlclF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICBpdCAhPSBtUmVuZGVyUXVldWUuZW5kKCk7ICkgeworICAgICAgICBib29sIGRyb3AgPSBmYWxzZTsgLy8gd2hldGhlciB0byBkcm9wIGVhY2ggZnJhbWUKKyAgICAgICAgaWYgKGl0LT5tSW5kZXggPCAwKSB7CisgICAgICAgICAgICAvLyBmcmFtZSBub3QgeWV0IGRlcXVldWVkIChvciBhbHJlYWR5IHJlbmRlcmVkIG9uIGEgdHVubmVsZWQgc3VyZmFjZSkKKyAgICAgICAgICAgIGRyb3AgPSBkcm9wSW5jb21wbGV0ZTsKKyAgICAgICAgfSBlbHNlIGlmIChpdC0+bUZlbmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIGNoZWNrIGlmIGZlbmNlIHNpZ25hbGVkCisgICAgICAgICAgICBuc2Vjc190IHNpZ25hbFRpbWUgPSBpdC0+bUZlbmNlLT5nZXRTaWduYWxUaW1lKCk7CisgICAgICAgICAgICBpZiAoc2lnbmFsVGltZSA8IDApIHsgLy8gaW52YWxpZCBmZW5jZQorICAgICAgICAgICAgICAgIGRyb3AgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChzaWduYWxUaW1lID09IElOVDY0X01BWCkgeyAvLyB1bnNpZ25hbGVkIGZlbmNlCisgICAgICAgICAgICAgICAgZHJvcCA9IGRyb3BJbmNvbXBsZXRlOworICAgICAgICAgICAgfSBlbHNlIHsgLy8gc2lnbmFsZWQKKyAgICAgICAgICAgICAgICAvLyBzYXZlIHJlbmRlciB0aW1lCisgICAgICAgICAgICAgICAgaXQtPm1GZW5jZS5jbGVhcigpOworICAgICAgICAgICAgICAgIGl0LT5tUmVuZGVyVGltZU5zID0gc2lnbmFsVGltZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBib29sIGZvdW5kRnJhbWUgPSAoSW5mbyAqKSYqaXQgPT0gdW50aWw7CisKKyAgICAgICAgLy8gUmV0dXJuIGZyYW1lcyB3aXRoIHNpZ25hbGVkIGZlbmNlcyBhdCB0aGUgc3RhcnQgb2YgdGhlIHF1ZXVlLCBhcyB0aGV5IGFyZQorICAgICAgICAvLyBpbiBzdWJtaXQgb3JkZXIsIGFuZCB3ZSBkb24ndCBoYXZlIHRvIHdhaXQgZm9yIGFueSBpbi1iZXR3ZWVuIGZyYW1lcy4KKyAgICAgICAgLy8gQWxzbyByZXR1cm4gYW55IGRyb3BwZWQgZnJhbWVzLgorICAgICAgICBpZiAoZHJvcCB8fCAoaXQtPm1GZW5jZSA9PSBOVUxMICYmIGl0ID09IG1SZW5kZXJRdWV1ZS5iZWdpbigpKSkgeworICAgICAgICAgICAgLy8gKHVucmVuZGVyZWQpIGRyb3BwZWQgZnJhbWVzIGhhdmUgdGhlaXIgbVJlbmRlclRpbWVOcyBzdGlsbCBzZXQgdG8gLTEKKyAgICAgICAgICAgIGRvbmUuc3BsaWNlKGRvbmUuZW5kKCksIG1SZW5kZXJRdWV1ZSwgaXQrKyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgICAgIGlmIChmb3VuZEZyYW1lKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBkb25lOworfQorCit2b2lkIEZyYW1lUmVuZGVyVHJhY2tlcjo6dW50cmFja0ZyYW1lKGNvbnN0IEZyYW1lUmVuZGVyVHJhY2tlcjo6SW5mbyAqaW5mbywgc3NpemVfdCBpbmRleCkgeworICAgIGlmIChpbmZvID09IE5VTEwgJiYgaW5kZXggPT0gU1NJWkVfTUFYKSB7CisgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoc3RkOjpsaXN0PEluZm8+OjppdGVyYXRvciBpdCA9IG1SZW5kZXJRdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgaXQgIT0gbVJlbmRlclF1ZXVlLmVuZCgpOyApIHsKKyAgICAgICAgaWYgKCYqaXQgPT0gaW5mbykgeworICAgICAgICAgICAgbVJlbmRlclF1ZXVlLmVyYXNlKGl0KyspOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGl0LT5tSW5kZXggPiBpbmRleCkgeworICAgICAgICAgICAgICAgIC0tKGl0LT5tSW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBGcmFtZVJlbmRlclRyYWNrZXI6OmR1bXBSZW5kZXJRdWV1ZSgpIGNvbnN0IHsKKyAgICBBTE9HSSgiWyVzXSBSZW5kZXIgUXVldWU6IChsYXN0IHJlbmRlciB0aW1lOiAlbGxkbnMpIiwKKyAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIChsb25nIGxvbmcpbUxhc3RSZW5kZXJUaW1lTnMpOworICAgIGZvciAoc3RkOjpsaXN0PEluZm8+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1SZW5kZXJRdWV1ZS5jYmVnaW4oKTsKKyAgICAgICAgICAgIGl0ICE9IG1SZW5kZXJRdWV1ZS5jZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKGl0LT5tRmVuY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0koIiAgUkVOREVSRUQ6IGhhbmRsZTogJXAsIG1lZGlhIHRpbWU6ICVsbGR1cywgaW5kZXg6ICV6ZCwgcmVuZGVyIHRpbWU6ICVsbGRucyIsCisgICAgICAgICAgICAgICAgICAgIGl0LT5tR3JhcGhpY0J1ZmZlciA9PSBOVUxMID8gTlVMTCA6IGl0LT5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWl0LT5tTWVkaWFUaW1lVXMsIGl0LT5tSW5kZXgsIChsb25nIGxvbmcpaXQtPm1SZW5kZXJUaW1lTnMpOworICAgICAgICB9IGVsc2UgaWYgKGl0LT5tSW5kZXggPCAwKSB7CisgICAgICAgICAgICBBTE9HSSgiICAgIFFVRVVFRDogaGFuZGxlOiAlcCwgbWVkaWEgdGltZTogJWxsZHVzLCBmZW5jZTogJXMiLAorICAgICAgICAgICAgICAgICAgICBpdC0+bUdyYXBoaWNCdWZmZXItPmhhbmRsZSwgKGxvbmcgbG9uZylpdC0+bU1lZGlhVGltZVVzLAorICAgICAgICAgICAgICAgICAgICBpdC0+bUZlbmNlLT5pc1ZhbGlkKCkgPyAiWUVTIiA6ICJOTyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0koIiAgREVRVUVVRUQ6IGhhbmRsZTogJXAsIG1lZGlhIHRpbWU6ICVsbGR1cywgaW5kZXg6ICV6ZCIsCisgICAgICAgICAgICAgICAgICAgIGl0LT5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlLCAobG9uZyBsb25nKWl0LT5tTWVkaWFUaW1lVXMsIGl0LT5tSW5kZXgpOworICAgICAgICB9CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwCmluZGV4IDBjMmZmMTUuLjA2OGE3N2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAKQEAgLTM0LDEwICszNCwxMCBAQAogICAgIDogbU51bUJhbmR3aWR0aEhpc3RvcnlJdGVtcygwKSwKICAgICAgIG1Ub3RhbFRyYW5zZmVyVGltZVVzKDApLAogICAgICAgbVRvdGFsVHJhbnNmZXJCeXRlcygwKSwKKyAgICAgIG1NYXhCYW5kd2lkdGhIaXN0b3J5SXRlbXMoMTAwKSwKICAgICAgIG1QcmV2QmFuZHdpZHRoTWVhc3VyZVRpbWVVcygwKSwKICAgICAgIG1QcmV2RXN0aW1hdGVkQmFuZFdpZHRoS2JwcygwKSwKLSAgICAgIG1CYW5kV2lkdGhDb2xsZWN0RnJlcU1zKDUwMDApLAotICAgICAgbU1heEJhbmR3aWR0aEhpc3RvcnlJdGVtcygxMDApIHsKKyAgICAgIG1CYW5kV2lkdGhDb2xsZWN0RnJlcU1zKDUwMDApIHsKIH0KIAogdm9pZCBIVFRQQmFzZTo6YWRkQmFuZHdpZHRoTWVhc3VyZW1lbnQoCkBAIC03NSw3ICs3NSwxMSBAQAogYm9vbCBIVFRQQmFzZTo6ZXN0aW1hdGVCYW5kd2lkdGgoaW50MzJfdCAqYmFuZHdpZHRoX2JwcykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICBpZiAobU51bUJhbmR3aWR0aEhpc3RvcnlJdGVtcyA8IDIpIHsKKyAgICAvLyBEbyBub3QgZG8gYmFuZHdpZHRoIGVzdGltYXRpb24gaWYgd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggc2FtcGxlcywgb3IKKyAgICAvLyB0b3RhbCBieXRlcyBkb3dubG9hZCBhcmUgdG9vIHNtYWxsICg8NjRLKS4KKyAgICAvLyBCYW5kd2lkdGggZXN0aW1hdGlvbiBmcm9tIHRoZXNlIHNhbXBsZXMgY2FuIG9mdGVuIHNob290IHVwIGFuZCBjYXVzZQorICAgIC8vIHVud2FudGVkIGJ3IGFkYXB0aW9uIGJlaGF2aW9ycy4KKyAgICBpZiAobU51bUJhbmR3aWR0aEhpc3RvcnlJdGVtcyA8IDIgfHwgbVRvdGFsVHJhbnNmZXJCeXRlcyA8IDY1NTM2KSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QM0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUDNFeHRyYWN0b3IuY3BwCmluZGV4IDRhNjMxNTIuLjJlNTRlOGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QM0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVAzRXh0cmFjdG9yLmNwcApAQCAtODIsNyArODIsNyBAQAogICAgICAgICAgICAgKmlub3V0X3BvcyArPSBsZW47CiAKICAgICAgICAgICAgIEFMT0dWKCJza2lwcGVkIElEMyB0YWcsIG5ldyBzdGFydGluZyBvZmZzZXQgaXMgJWxsZCAoMHglMDE2bGx4KSIsCi0gICAgICAgICAgICAgICAgICppbm91dF9wb3MsICppbm91dF9wb3MpOworICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSppbm91dF9wb3MsIChsb25nIGxvbmcpKmlub3V0X3Bvcyk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAocG9zdF9pZDNfcG9zICE9IE5VTEwpIHsKQEAgLTEwMyw5ICsxMDMsOSBAQAogICAgIHVpbnQ4X3QgKnRtcCA9IGJ1ZjsKIAogICAgIGRvIHsKLSAgICAgICAgaWYgKHBvcyA+PSAqaW5vdXRfcG9zICsga01heEJ5dGVzQ2hlY2tlZCkgeworICAgICAgICBpZiAocG9zID49IChvZmY2NF90KSgqaW5vdXRfcG9zICsga01heEJ5dGVzQ2hlY2tlZCkpIHsKICAgICAgICAgICAgIC8vIERvbid0IHNjYW4gZm9yZXZlci4KLSAgICAgICAgICAgIEFMT0dWKCJnaXZpbmcgdXAgYXQgb2Zmc2V0ICVsbGQiLCBwb3MpOworICAgICAgICAgICAgQUxPR1YoImdpdmluZyB1cCBhdCBvZmZzZXQgJWxsZCIsIChsb25nIGxvbmcpcG9zKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE1NSw3ICsxNTUsNyBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBBTE9HVigiZm91bmQgcG9zc2libGUgMXN0IGZyYW1lIGF0ICVsbGQgKGhlYWRlciA9IDB4JTA4eCkiLCBwb3MsIGhlYWRlcik7CisgICAgICAgIEFMT0dWKCJmb3VuZCBwb3NzaWJsZSAxc3QgZnJhbWUgYXQgJWxsZCAoaGVhZGVyID0gMHglMDh4KSIsIChsb25nIGxvbmcpcG9zLCBoZWFkZXIpOwogCiAgICAgICAgIC8vIFdlIGZvdW5kIHdoYXQgbG9va3MgbGlrZSBhIHZhbGlkIGZyYW1lLAogICAgICAgICAvLyBub3cgZmluZCBpdHMgc3VjY2Vzc29ycy4KQEAgLTE4Niw3ICsxODYsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBBTE9HVigiZm91bmQgc3Vic2VxdWVudCBmcmFtZSAjJWQgYXQgJWxsZCIsIGogKyAyLCB0ZXN0X3Bvcyk7CisgICAgICAgICAgICBBTE9HVigiZm91bmQgc3Vic2VxdWVudCBmcmFtZSAjJWQgYXQgJWxsZCIsIGogKyAyLCAobG9uZyBsb25nKXRlc3RfcG9zKTsKIAogICAgICAgICAgICAgdGVzdF9wb3MgKz0gdGVzdF9mcmFtZV9zaXplOwogICAgICAgICB9CkBAIC0yODIsNiArMjgyLDQxIEBACiAKICAgICBtRmlyc3RGcmFtZVBvcyA9IHBvczsKICAgICBtRml4ZWRIZWFkZXIgPSBoZWFkZXI7CisgICAgbU1ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgc3A8WElOR1NlZWtlcj4gc2Vla2VyID0gWElOR1NlZWtlcjo6Q3JlYXRlRnJvbVNvdXJjZShtRGF0YVNvdXJjZSwgbUZpcnN0RnJhbWVQb3MpOworCisgICAgaWYgKHNlZWtlciA9PSBOVUxMKSB7CisgICAgICAgIG1TZWVrZXIgPSBWQlJJU2Vla2VyOjpDcmVhdGVGcm9tU291cmNlKG1EYXRhU291cmNlLCBwb3N0X2lkM19wb3MpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TZWVrZXIgPSBzZWVrZXI7CisgICAgICAgIGludCBlbmNkID0gc2Vla2VyLT5nZXRFbmNvZGVyRGVsYXkoKTsKKyAgICAgICAgaW50IGVuY3AgPSBzZWVrZXItPmdldEVuY29kZXJQYWRkaW5nKCk7CisgICAgICAgIGlmIChlbmNkICE9IDAgfHwgZW5jcCAhPSAwKSB7CisgICAgICAgICAgICBtTWV0YS0+c2V0SW50MzIoa0tleUVuY29kZXJEZWxheSwgZW5jZCk7CisgICAgICAgICAgICBtTWV0YS0+c2V0SW50MzIoa0tleUVuY29kZXJQYWRkaW5nLCBlbmNwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtU2Vla2VyICE9IE5VTEwpIHsKKyAgICAgICAgLy8gV2hpbGUgaXQgaXMgc2FmZSB0byBzZW5kIHRoZSBYSU5HL1ZCUkkgZnJhbWUgdG8gdGhlIGRlY29kZXIsIHRoaXMgd2lsbAorICAgICAgICAvLyByZXN1bHQgaW4gYW4gZXh0cmEgMTE1MiBzYW1wbGVzIGJlaW5nIG91dHB1dC4gSW4gYWRkaXRpb24sIHRoZSBiaXRyYXRlCisgICAgICAgIC8vIG9mIHRoZSBYaW5nIGhlYWRlciBtaWdodCBub3QgbWF0Y2ggdGhlIHJlc3Qgb2YgdGhlIGZpbGUsIHdoaWNoIGNvdWxkCisgICAgICAgIC8vIGxlYWQgdG8gcHJvYmxlbXMgd2hlbiBzZWVraW5nLiBUaGUgcmVhbCBmaXJzdCBmcmFtZSB0byBkZWNvZGUgaXMgYWZ0ZXIKKyAgICAgICAgLy8gdGhlIFhJTkcvVkJSSSBmcmFtZSwgc28gc2tpcCB0aGVyZS4KKyAgICAgICAgc2l6ZV90IGZyYW1lX3NpemU7CisgICAgICAgIGludCBzYW1wbGVfcmF0ZTsKKyAgICAgICAgaW50IG51bV9jaGFubmVsczsKKyAgICAgICAgaW50IGJpdHJhdGU7CisgICAgICAgIEdldE1QRUdBdWRpb0ZyYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICBoZWFkZXIsICZmcmFtZV9zaXplLCAmc2FtcGxlX3JhdGUsICZudW1fY2hhbm5lbHMsICZiaXRyYXRlKTsKKyAgICAgICAgcG9zICs9IGZyYW1lX3NpemU7CisgICAgICAgIGlmICghUmVzeW5jKG1EYXRhU291cmNlLCAwLCAmcG9zLCAmcG9zdF9pZDNfcG9zLCAmaGVhZGVyKSkgeworICAgICAgICAgICAgLy8gbUluaXRDaGVjayB3aWxsIHJlbWFpbiBOT19JTklUCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUZpcnN0RnJhbWVQb3MgPSBwb3M7CisgICAgICAgIG1GaXhlZEhlYWRlciA9IGhlYWRlcjsKKyAgICB9CiAKICAgICBzaXplX3QgZnJhbWVfc2l6ZTsKICAgICBpbnQgc2FtcGxlX3JhdGU7CkBAIC0yOTIsOCArMzI3LDYgQEAKIAogICAgIHVuc2lnbmVkIGxheWVyID0gNCAtICgoaGVhZGVyID4+IDE3KSAmIDMpOwogCi0gICAgbU1ldGEgPSBuZXcgTWV0YURhdGE7Ci0KICAgICBzd2l0Y2ggKGxheWVyKSB7CiAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgIG1NZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JKTsKQEAgLTMxMiwyNyArMzQ1LDYgQEAKICAgICBtTWV0YS0+c2V0SW50MzIoa0tleUJpdFJhdGUsIGJpdHJhdGUgKiAxMDAwKTsKICAgICBtTWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtX2NoYW5uZWxzKTsKIAotICAgIHNwPFhJTkdTZWVrZXI+IHNlZWtlciA9IFhJTkdTZWVrZXI6OkNyZWF0ZUZyb21Tb3VyY2UobURhdGFTb3VyY2UsIG1GaXJzdEZyYW1lUG9zKTsKLQotICAgIGlmIChzZWVrZXIgPT0gTlVMTCkgewotICAgICAgICBtU2Vla2VyID0gVkJSSVNlZWtlcjo6Q3JlYXRlRnJvbVNvdXJjZShtRGF0YVNvdXJjZSwgcG9zdF9pZDNfcG9zKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtU2Vla2VyID0gc2Vla2VyOwotICAgICAgICBpbnQgZW5jZCA9IHNlZWtlci0+Z2V0RW5jb2RlckRlbGF5KCk7Ci0gICAgICAgIGludCBlbmNwID0gc2Vla2VyLT5nZXRFbmNvZGVyUGFkZGluZygpOwotICAgICAgICBpZiAoZW5jZCAhPSAwIHx8IGVuY3AgIT0gMCkgewotICAgICAgICAgICAgbU1ldGEtPnNldEludDMyKGtLZXlFbmNvZGVyRGVsYXksIGVuY2QpOwotICAgICAgICAgICAgbU1ldGEtPnNldEludDMyKGtLZXlFbmNvZGVyUGFkZGluZywgZW5jcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobVNlZWtlciAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIFdoaWxlIGl0IGlzIHNhZmUgdG8gc2VuZCB0aGUgWElORy9WQlJJIGZyYW1lIHRvIHRoZSBkZWNvZGVyLCB0aGlzIHdpbGwKLSAgICAgICAgLy8gcmVzdWx0IGluIGFuIGV4dHJhIDExNTIgc2FtcGxlcyBiZWluZyBvdXRwdXQuIFRoZSByZWFsIGZpcnN0IGZyYW1lIHRvCi0gICAgICAgIC8vIGRlY29kZSBpcyBhZnRlciB0aGUgWElORy9WQlJJIGZyYW1lLCBzbyBza2lwIHRoZXJlLgotICAgICAgICBtRmlyc3RGcmFtZVBvcyArPSBmcmFtZV9zaXplOwotICAgIH0KLQogICAgIGludDY0X3QgZHVyYXRpb25VczsKIAogICAgIGlmIChtU2Vla2VyID09IE5VTEwgfHwgIW1TZWVrZXItPmdldER1cmF0aW9uKCZkdXJhdGlvblVzKSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmNwcAppbmRleCA5ODU2ZjkyLi5lZjA3YWEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmNwcApAQCAtMTM1LDcgKzEzNSw3IEBACiAKICAgICBtTm90aWZ5ID0gbm90aWZ5OwogCi0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCBpZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIHRoaXMpKS0+cG9zdCgpOwogfQogCiB2b2lkIE1QRUcyVFNXcml0ZXI6OlNvdXJjZUluZm86OnN0b3AoKSB7CkBAIC0zNjEsNyArMzYxLDcgQEAKIH0KIAogdm9pZCBNUEVHMlRTV3JpdGVyOjpTb3VyY2VJbmZvOjpyZWFkTW9yZSgpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVhZCwgaWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlYWQsIHRoaXMpKS0+cG9zdCgpOwogfQogCiB2b2lkIE1QRUcyVFNXcml0ZXI6OlNvdXJjZUluZm86Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CkBAIC00ODAsMTkgKzQ4MCw2IEBACiAgICAgaW5pdCgpOwogfQogCi1NUEVHMlRTV3JpdGVyOjpNUEVHMlRTV3JpdGVyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotICAgIDogbUZpbGUoZm9wZW4oZmlsZW5hbWUsICJ3YiIpKSwKLSAgICAgIG1Xcml0ZUNvb2tpZShOVUxMKSwKLSAgICAgIG1Xcml0ZUZ1bmMoTlVMTCksCi0gICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtTnVtU291cmNlc0RvbmUoMCksCi0gICAgICBtTnVtVFNQYWNrZXRzV3JpdHRlbigwKSwKLSAgICAgIG1OdW1UU1BhY2tldHNCZWZvcmVNZXRhKDApLAotICAgICAgbVBBVENvbnRpbnVpdHlDb3VudGVyKDApLAotICAgICAgbVBNVENvbnRpbnVpdHlDb3VudGVyKDApIHsKLSAgICBpbml0KCk7Ci19Ci0KIE1QRUcyVFNXcml0ZXI6Ok1QRUcyVFNXcml0ZXIoCiAgICAgICAgIHZvaWQgKmNvb2tpZSwKICAgICAgICAgc3NpemVfdCAoKndyaXRlKSh2b2lkICpjb29raWUsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSkKQEAgLTU2NSw3ICs1NTIsNyBAQAogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU291cmNlcy5zaXplKCk7ICsraSkgewogICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0KLSAgICAgICAgICAgIG5ldyBBTWVzc2FnZShrV2hhdFNvdXJjZU5vdGlmeSwgbVJlZmxlY3Rvci0+aWQoKSk7CisgICAgICAgICAgICBuZXcgQU1lc3NhZ2Uoa1doYXRTb3VyY2VOb3RpZnksIG1SZWZsZWN0b3IpOwogCiAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNvdXJjZS1pbmRleCIsIGkpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA3MGY2ODRiLi5hNWEwMGVmCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKQEAgLTM1OCw2ICszNTgsOCBAQAogCiBNUEVHNEV4dHJhY3Rvcjo6TVBFRzRFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkKICAgICA6IG1Nb29mT2Zmc2V0KDApLAorICAgICAgbU1vb2ZGb3VuZChmYWxzZSksCisgICAgICBtTWRhdEZvdW5kKGZhbHNlKSwKICAgICAgIG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtSW5pdENoZWNrKE5PX0lOSVQpLAogICAgICAgbUhhc1ZpZGVvKGZhbHNlKSwKQEAgLTQ5NCw3ICs0OTYsOSBAQAogCiAgICAgb2ZmNjRfdCBvZmZzZXQgPSAwOwogICAgIHN0YXR1c190IGVycjsKLSAgICB3aGlsZSAodHJ1ZSkgeworICAgIGJvb2wgc2F3TW9vdk9yU2lkeCA9IGZhbHNlOworCisgICAgd2hpbGUgKCEoc2F3TW9vdk9yU2lkeCAmJiAobU1kYXRGb3VuZCB8fCBtTW9vZkZvdW5kKSkpIHsKICAgICAgICAgb2ZmNjRfdCBvcmlnX29mZnNldCA9IG9mZnNldDsKICAgICAgICAgZXJyID0gcGFyc2VDaHVuaygmb2Zmc2V0LCAwKTsKIApAQCAtNTAzLDI2ICs1MDcsMTIgQEAKICAgICAgICAgfSBlbHNlIGlmIChvZmZzZXQgPD0gb3JpZ19vZmZzZXQpIHsKICAgICAgICAgICAgIC8vIG9ubHkgY29udGludWUgcGFyc2luZyBpZiB0aGUgb2Zmc2V0IHdhcyBhZHZhbmNlZCwKICAgICAgICAgICAgIC8vIG90aGVyd2lzZSB3ZSBtaWdodCBlbmQgdXAgaW4gYW4gaW5maW5pdGUgbG9vcAotICAgICAgICAgICAgQUxPR0UoImRpZCBub3QgYWR2YW5jZTogMHglbGxkLT4weCVsbGQiLCBvcmlnX29mZnNldCwgb2Zmc2V0KTsKKyAgICAgICAgICAgIEFMT0dFKCJkaWQgbm90IGFkdmFuY2U6ICVsbGQtPiVsbGQiLCAobG9uZyBsb25nKW9yaWdfb2Zmc2V0LCAobG9uZyBsb25nKW9mZnNldCk7CiAgICAgICAgICAgICBlcnIgPSBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBVTktOT1dOX0VSUk9SKSB7CisgICAgICAgICAgICBzYXdNb292T3JTaWR4ID0gdHJ1ZTsKICAgICAgICAgfQotCi0gICAgICAgIHVpbnQzMl90IGhkclsyXTsKLSAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBoZHIsIDgpIDwgOCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDMyX3QgY2h1bmtfdHlwZSA9IG50b2hsKGhkclsxXSk7Ci0gICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAnZicpKSB7Ci0gICAgICAgICAgICAvLyBzdG9yZSB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBzZWdtZW50Ci0gICAgICAgICAgICBtTW9vZk9mZnNldCA9IG9mZnNldDsKLSAgICAgICAgfSBlbHNlIGlmIChjaHVua190eXBlICE9IEZPVVJDQygnbScsICdkJywgJ2EnLCAndCcpKSB7Ci0gICAgICAgICAgICAvLyBrZWVwIHBhcnNpbmcgdW50aWwgd2UgZ2V0IHRvIHRoZSBkYXRhCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKICAgICB9CiAKICAgICBpZiAobUluaXRDaGVjayA9PSBPSykgewpAQCAtNTM5LDExICs1MjksMTEgQEAKICAgICBDSEVDS19ORShlcnIsIChzdGF0dXNfdClOT19JTklUKTsKIAogICAgIC8vIGNvcHkgcHNzaCBkYXRhIGludG8gZmlsZSBtZXRhZGF0YQotICAgIGludCBwc3Noc2l6ZSA9IDA7CisgICAgdWludDY0X3QgcHNzaHNpemUgPSAwOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBzc2guc2l6ZSgpOyBpKyspIHsKICAgICAgICAgcHNzaHNpemUgKz0gMjAgKyBtUHNzaFtpXS5kYXRhbGVuOwogICAgIH0KLSAgICBpZiAocHNzaHNpemUpIHsKKyAgICBpZiAocHNzaHNpemUgPiAwICYmIHBzc2hzaXplIDw9IFVJTlQzMl9NQVgpIHsKICAgICAgICAgY2hhciAqYnVmID0gKGNoYXIqKW1hbGxvYyhwc3Noc2l6ZSk7CiAgICAgICAgIGNoYXIgKnB0ciA9IGJ1ZjsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUHNzaC5zaXplKCk7IGkrKykgewpAQCAtNzUzLDYgKzc0MywxNyBAQAogICAgICAgICAmJiBwYXRoWzNdID09IEZPVVJDQygnaScsICdsJywgJ3MnLCAndCcpOwogfQogCitzdGF0aWMgYm9vbCB1bmRlclFUTWV0YVBhdGgoY29uc3QgVmVjdG9yPHVpbnQzMl90PiAmcGF0aCwgaW50MzJfdCBkZXB0aCkgeworICAgIHJldHVybiBwYXRoLnNpemUoKSA+PSAyCisgICAgICAgICAgICAmJiBwYXRoWzBdID09IEZPVVJDQygnbScsICdvJywgJ28nLCAndicpCisgICAgICAgICAgICAmJiBwYXRoWzFdID09IEZPVVJDQygnbScsICdlJywgJ3QnLCAnYScpCisgICAgICAgICAgICAmJiAoZGVwdGggPT0gMgorICAgICAgICAgICAgfHwgKGRlcHRoID09IDMKKyAgICAgICAgICAgICAgICAgICAgJiYgKHBhdGhbMl0gPT0gRk9VUkNDKCdoJywgJ2QnLCAnbCcsICdyJykKKyAgICAgICAgICAgICAgICAgICAgfHwgIHBhdGhbMl0gPT0gRk9VUkNDKCdpJywgJ2wnLCAncycsICd0JykKKyAgICAgICAgICAgICAgICAgICAgfHwgIHBhdGhbMl0gPT0gRk9VUkNDKCdrJywgJ2UnLCAneScsICdzJykpKSk7Cit9CisKIC8vIEdpdmVuIGEgdGltZSBpbiBzZWNvbmRzIHNpbmNlIEphbiAxIDE5MDQsIHByb2R1Y2UgYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcuCiBzdGF0aWMgdm9pZCBjb252ZXJ0VGltZVRvRGF0ZShpbnQ2NF90IHRpbWVfMTkwNCwgU3RyaW5nOCAqcykgewogICAgIHRpbWVfdCB0aW1lXzE5NzAgPSB0aW1lXzE5MDQgLSAoKCg2NiAqIDM2NSArIDE3KSAqIDI0KSAqIDM2MDApOwpAQCAtNzY0LDcgKzc2NSw3IEBACiB9CiAKIHN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCwgaW50IGRlcHRoKSB7Ci0gICAgQUxPR1YoImVudGVyaW5nIHBhcnNlQ2h1bmsgJWxsZC8lZCIsICpvZmZzZXQsIGRlcHRoKTsKKyAgICBBTE9HVigiZW50ZXJpbmcgcGFyc2VDaHVuayAlbGxkLyVkIiwgKGxvbmcgbG9uZykqb2Zmc2V0LCBkZXB0aCk7CiAgICAgdWludDMyX3QgaGRyWzJdOwogICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KCpvZmZzZXQsIGhkciwgOCkgPCA4KSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKQEAgLTgwOCw3ICs4MDksNyBAQAogCiAgICAgY2hhciBjaHVua1s1XTsKICAgICBNYWtlRm91ckNDU3RyaW5nKGNodW5rX3R5cGUsIGNodW5rKTsKLSAgICBBTE9HVigiY2h1bms6ICVzIEAgJWxsZCwgJWQiLCBjaHVuaywgKm9mZnNldCwgZGVwdGgpOworICAgIEFMT0dWKCJjaHVuazogJXMgQCAlbGxkLCAlZCIsIGNodW5rLCAobG9uZyBsb25nKSpvZmZzZXQsIGRlcHRoKTsKIAogICAgIGlmIChrVXNlSGV4RHVtcCkgewogICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBrV2hpdGVzcGFjZVtdID0gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOwpAQCAtODY4LDYgKzg2OSwxMiBAQAogICAgICAgICBjYXNlIEZPVVJDQygncycsICdjJywgJ2gnLCAnaScpOgogICAgICAgICBjYXNlIEZPVVJDQygnZScsICdkJywgJ3QnLCAncycpOgogICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKSAmJiAhbU1vb2ZGb3VuZCkgeworICAgICAgICAgICAgICAgIC8vIHN0b3JlIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IHNlZ21lbnQKKyAgICAgICAgICAgICAgICBtTW9vZkZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtTW9vZk9mZnNldCA9ICpvZmZzZXQ7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygncycsICd0JywgJ2InLCAnbCcpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNhbXBsZVRhYmxlIGNodW5rIGlzICUiIFBSSXU2NCAiIGJ5dGVzIGxvbmcuIiwgY2h1bmtfc2l6ZSk7CiAKQEAgLTg4Miw2ICs4ODksOSBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKwogICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID0gbmV3IFNhbXBsZVRhYmxlKG1EYXRhU291cmNlKTsKICAgICAgICAgICAgIH0KIApAQCAtMTAzNiw2ICsxMDQ2LDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBvcmlnaW5hbF9mb3VyY2MgPSBudG9obChvcmlnaW5hbF9mb3VyY2MpOwogICAgICAgICAgICAgQUxPR1YoInJlYWQgb3JpZ2luYWwgZm9ybWF0OiAlZCIsIG9yaWdpbmFsX2ZvdXJjYyk7CisKKyAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKwogICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIEZvdXJDQzJNSU1FKG9yaWdpbmFsX2ZvdXJjYykpOwogICAgICAgICAgICAgdWludDMyX3QgbnVtX2NoYW5uZWxzID0gMDsKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZV9yYXRlID0gMDsKQEAgLTEwOTEsNiArMTEwNSw5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlDcnlwdG9Nb2RlLCBkZWZhdWx0QWxnb3JpdGhtSWQpOwogICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsIGRlZmF1bHRJVlNpemUpOwogICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAndGVuYycsIGRlZmF1bHRLZXlJZCwgMTYpOwpAQCAtMTEyNSw3ICsxMTQyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBzc2guZGF0YWxlbiA9IG50b2hsKHBzc2hkYXRhbGVuKTsKICAgICAgICAgICAgIEFMT0dWKCJwc3NoIGRhdGEgc2l6ZTogJWQiLCBwc3NoLmRhdGFsZW4pOwotICAgICAgICAgICAgaWYgKHBzc2guZGF0YWxlbiArIDIwID4gY2h1bmtfc2l6ZSkgeworICAgICAgICAgICAgaWYgKGNodW5rX3NpemUgPCAyMCB8fCBwc3NoLmRhdGFsZW4gPiBjaHVua19zaXplIC0gMjApIHsKICAgICAgICAgICAgICAgICAvLyBwc3NoIGRhdGEgbGVuZ3RoIGV4Y2VlZHMgc2l6ZSBvZiBjb250YWluaW5nIGJveAogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CkBAIC0xMjA2LDcgKzEyMjMsNyBAQAogICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IG50b2hsKGR1cmF0aW9uMzIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkdXJhdGlvbiAhPSAwKSB7CisgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCAmJiBtTGFzdFRyYWNrLT50aW1lc2NhbGUgIT0gMCkgewogICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDY0KAogICAgICAgICAgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1MYXN0VHJhY2stPnRpbWVzY2FsZSk7CiAgICAgICAgICAgICB9CkBAIC0xMjcwLDYgKzEyODcsMTAgQEAKICAgICAgICAgICAgICAgICAvLyBkaXNwbGF5IHRoZSB0aW1lZCB0ZXh0LgogICAgICAgICAgICAgICAgIC8vIEZvciBlbmNyeXB0ZWQgZmlsZXMsIHRoZXJlIG1heSBhbHNvIGJlIG1vcmUgdGhhbiBvbmUgZW50cnkuCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKworICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKICAgICAgICAgICAgICAgICBDSEVDSyhtTGFzdFRyYWNrLT5tZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CiAgICAgICAgICAgICAgICAgaWYgKHN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgc3RyY2FzZWNtcChtaW1lLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIikpIHsKQEAgLTEzMTYsNiArMTMzNyw5IEBACiAgICAgICAgICAgICB1aW50MTZfdCBzYW1wbGVfc2l6ZSA9IFUxNl9BVCgmYnVmZmVyWzE4XSk7CiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVfcmF0ZSA9IFUzMl9BVCgmYnVmZmVyWzI0XSkgPj4gMTY7CiAKKyAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKwogICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgIT0gRk9VUkNDKCdlJywgJ24nLCAnYycsICdhJykpIHsKICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY2h1bmsgdHlwZSBpcyBlbmNhLCB3ZSdsbCBnZXQgdGhlIHR5cGUgZnJvbSB0aGUgc2luZi9mcm1hIGJveCBsYXRlcgogICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBGb3VyQ0MyTUlNRShjaHVua190eXBlKSk7CkBAIC0xMzc3LDYgKzE0MDEsOSBAQAogICAgICAgICAgICAgLy8gcHJpbnRmKCIqKiogY29kaW5nPSclcycgd2lkdGg9JWQgaGVpZ2h0PSVkXG4iLAogICAgICAgICAgICAgLy8gICAgICAgIGNodW5rLCB3aWR0aCwgaGVpZ2h0KTsKIAorICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCiAgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSAhPSBGT1VSQ0MoJ2UnLCAnbicsICdjJywgJ3YnKSkgewogICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBjaHVuayB0eXBlIGlzIGVuY3YsIHdlJ2xsIGdldCB0aGUgdHlwZSBmcm9tIHRoZSBzaW5mL2ZybWEgYm94IGxhdGVyCiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIEZvdXJDQzJNSU1FKGNodW5rX3R5cGUpKTsKQEAgLTE0MDIsNiArMTQyOSw5IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAnYycsICdvJyk6CiAgICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ28nLCAnNicsICc0Jyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgobUxhc3RUcmFjayA9PSBOVUxMKSB8fCAobUxhc3RUcmFjay0+c2FtcGxlVGFibGUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0Q2h1bmtPZmZzZXRQYXJhbXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua190eXBlLCBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKQEAgLTE0MTcsNiArMTQ0Nyw5IEBACiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAndCcsICdzJywgJ2MnKToKICAgICAgICAgeworICAgICAgICAgICAgaWYgKChtTGFzdFRyYWNrID09IE5VTEwpIHx8IChtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPQogICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5zZXRTYW1wbGVUb0NodW5rUGFyYW1zKAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CkBAIC0xNDMzLDYgKzE0NjYsOSBAQAogICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3MnLCAneicpOgogICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3onLCAnMicpOgogICAgICAgICB7CisgICAgICAgICAgICBpZiAoKG1MYXN0VHJhY2sgPT0gTlVMTCkgfHwgKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9CiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldFNhbXBsZVNpemVQYXJhbXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua190eXBlLCBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKQEAgLTE1MTQsNiArMTU1MCw5IEBACiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAndCcsICd0JywgJ3MnKToKICAgICAgICAgeworICAgICAgICAgICAgaWYgKChtTGFzdFRyYWNrID09IE5VTEwpIHx8IChtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9CkBAIC0xNTI5LDYgKzE1NjgsOSBAQAogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ3QnLCAndCcsICdzJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgobUxhc3RUcmFjayA9PSBOVUxMKSB8fCAobUxhc3RUcmFjay0+c2FtcGxlVGFibGUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKwogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPQpAQCAtMTU0NCw2ICsxNTg2LDkgQEAKIAogICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3MnLCAncycpOgogICAgICAgICB7CisgICAgICAgICAgICBpZiAoKG1MYXN0VHJhY2sgPT0gTlVMTCkgfHwgKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKIAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KQEAgLTE1NTcsMTMgKzE2MDIsMTMgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gqXh5egorICAgICAgICAvLyBceEE5eHl6CiAgICAgICAgIGNhc2UgRk9VUkNDKDB4QTksICd4JywgJ3knLCAneicpOgogICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAKLSAgICAgICAgICAgIC8vIEJlc3QgY2FzZSB0aGUgdG90YWwgZGF0YSBsZW5ndGggaW5zaWRlICKpeHl6IiBib3gKLSAgICAgICAgICAgIC8vIHdvdWxkIGJlIDgsIGZvciBpbnN0YW5jZSAiqXh5eiIgKyAiXHgwMFx4MDRceDE1XHhjNyIgKyAiMCswLyIsCisgICAgICAgICAgICAvLyBCZXN0IGNhc2UgdGhlIHRvdGFsIGRhdGEgbGVuZ3RoIGluc2lkZSAiXHhBOXh5eiIgYm94CisgICAgICAgICAgICAvLyB3b3VsZCBiZSA4LCBmb3IgaW5zdGFuY2UgIlx4QTl4eXoiICsgIlx4MDBceDA0XHgxNVx4YzciICsgIjArMC8iLAogICAgICAgICAgICAgLy8gd2hlcmUgIlx4MDBceDA0IiBpcyB0aGUgdGV4dCBzdHJpbmcgbGVuZ3RoIHdpdGggdmFsdWUgPSA0LAogICAgICAgICAgICAgLy8gIlwweDE1XHhjNyIgaXMgdGhlIGxhbmd1YWdlIGNvZGUgPSBlbiwgYW5kICIwKzAiIGlzIGEKICAgICAgICAgICAgIC8vIGxvY2F0aW9uIChzdHJpbmcpIHZhbHVlIHdpdGggbG9uZ2l0dWRlID0gMCBhbmQgbGF0aXR1ZGUgPSAwLgpAQCAtMTYxNiw2ICsxNjYxLDkgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldERhdGEoCiAgICAgICAgICAgICAgICAgICAgIGtLZXlFU0RTLCBrVHlwZUVTRFMsICZidWZmZXJbNF0sIGNodW5rX2RhdGFfc2l6ZSAtIDQpOwogCkBAIC0xNjMzLDcgKzE2ODEsMTggQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVBhdGguc2l6ZSgpID49IDIKKyAgICAgICAgICAgICAgICAgICAgJiYgbVBhdGhbbVBhdGguc2l6ZSgpIC0gMl0gPT0gRk9VUkNDKCdtJywgJ3AnLCAnNCcsICd2JykpIHsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmlkZW8gaXMgTVBFRzIKKyAgICAgICAgICAgICAgICBFU0RTIGVzZHMoJmJ1ZmZlcls0XSwgY2h1bmtfZGF0YV9zaXplIC0gNCk7CiAKKyAgICAgICAgICAgICAgICB1aW50OF90IG9iamVjdFR5cGVJbmRpY2F0aW9uOworICAgICAgICAgICAgICAgIGlmIChlc2RzLmdldE9iamVjdFR5cGVJbmRpY2F0aW9uKCZvYmplY3RUeXBlSW5kaWNhdGlvbikgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdFR5cGVJbmRpY2F0aW9uID49IDB4NjAgJiYgb2JqZWN0VHlwZUluZGljYXRpb24gPD0gMHg2NSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE2NDgsNiArMTcwNyw5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldERhdGEoCiAgICAgICAgICAgICAgICAgICAgIGtLZXlBVkNDLCBrVHlwZUFWQ0MsIGJ1ZmZlci0+ZGF0YSgpLCBjaHVua19kYXRhX3NpemUpOwogCkBAIC0xNjYyLDYgKzE3MjQsOSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXREYXRhKAogICAgICAgICAgICAgICAgICAgICBrS2V5SFZDQywga1R5cGVIVkNDLCBidWZmZXItPmRhdGEoKSwgY2h1bmtfZGF0YV9zaXplKTsKIApAQCAtMTY4Niw3ICsxNzUxLDcgQEAKICAgICAgICAgICAgIGNoYXIgYnVmZmVyWzIzXTsKICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgIT0gNyAmJgogICAgICAgICAgICAgICAgIGNodW5rX2RhdGFfc2l6ZSAhPSAyMykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJJbmNvcnJlY3QgRDI2MyBib3ggc2l6ZSAlbGxkIiwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSW5jb3JyZWN0IEQyNjMgYm94IHNpemUgJWxsZCIsIChsb25nIGxvbmcpY2h1bmtfZGF0YV9zaXplKTsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCkBAIC0xNjk1LDYgKzE3NjAsOSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXREYXRhKGtLZXlEMjYzLCBrVHlwZUQyNjMsIGJ1ZmZlciwgY2h1bmtfZGF0YV9zaXplKTsKIAogICAgICAgICAgICAgYnJlYWs7CkBAIC0xNzAyLDMxICsxNzcwLDM1IEBACiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZScsICd0JywgJ2EnKToKICAgICAgICAgewotICAgICAgICAgICAgdWludDhfdCBidWZmZXJbNF07Ci0gICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgKG9mZjY0X3Qpc2l6ZW9mKGJ1ZmZlcikpIHsKLSAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgYnVmZmVyLCA0KSA8IDQpIHsKLSAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoVTMyX0FUKGJ1ZmZlcikgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIFNob3VsZCBiZSB2ZXJzaW9uIDAsIGZsYWdzIDAuCi0KLSAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIG5vdCwgbGV0J3MgYXNzdW1lIHRoaXMgaXMgb25lIG9mIHRob3NlCi0gICAgICAgICAgICAgICAgLy8gYXBwYXJlbnRseSBtYWxmb3JtZWQgY2h1bmtzIHRoYXQgZG9uJ3QgaGF2ZSBmbGFncwotICAgICAgICAgICAgICAgIC8vIGFuZCBjb21wbGV0ZWx5IGRpZmZlcmVudCBzZW1hbnRpY3MgdGhhbiB3aGF0J3MKLSAgICAgICAgICAgICAgICAvLyBpbiB0aGUgTVBFRzQgc3BlY3MgYW5kIHNraXAgaXQuCi0gICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgb2ZmNjRfdCBzdG9wX29mZnNldCA9ICpvZmZzZXQgKyBjaHVua19zaXplOwotICAgICAgICAgICAgKm9mZnNldCA9IGRhdGFfb2Zmc2V0ICsgc2l6ZW9mKGJ1ZmZlcik7CisgICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CisgICAgICAgICAgICBib29sIGlzUGFyc2luZ01ldGFLZXlzID0gdW5kZXJRVE1ldGFQYXRoKG1QYXRoLCAyKTsKKyAgICAgICAgICAgIGlmICghaXNQYXJzaW5nTWV0YUtleXMpIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGJ1ZmZlcls0XTsKKyAgICAgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgKG9mZjY0X3Qpc2l6ZW9mKGJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXIsIDQpIDwgNCkgeworICAgICAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoVTMyX0FUKGJ1ZmZlcikgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgdmVyc2lvbiAwLCBmbGFncyAwLgorCisgICAgICAgICAgICAgICAgICAgIC8vIElmIGl0J3Mgbm90LCBsZXQncyBhc3N1bWUgdGhpcyBpcyBvbmUgb2YgdGhvc2UKKyAgICAgICAgICAgICAgICAgICAgLy8gYXBwYXJlbnRseSBtYWxmb3JtZWQgY2h1bmtzIHRoYXQgZG9uJ3QgaGF2ZSBmbGFncworICAgICAgICAgICAgICAgICAgICAvLyBhbmQgY29tcGxldGVseSBkaWZmZXJlbnQgc2VtYW50aWNzIHRoYW4gd2hhdCdzCisgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBNUEVHNCBzcGVjcyBhbmQgc2tpcCBpdC4KKyAgICAgICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpvZmZzZXQgKz0gIHNpemVvZihidWZmZXIpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICB3aGlsZSAoKm9mZnNldCA8IHN0b3Bfb2Zmc2V0KSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuayhvZmZzZXQsIGRlcHRoICsgMSk7CiAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtMTc5Miw3ICsxODY0LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBkMzI7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCkgeworICAgICAgICAgICAgaWYgKGR1cmF0aW9uICE9IDAgJiYgbUhlYWRlclRpbWVzY2FsZSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvbiAqIDEwMDAwMDAgLyBtSGVhZGVyVGltZXNjYWxlKTsKICAgICAgICAgICAgIH0KIApAQCAtMTg0MSw3ICsxOTEzLDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCkgeworICAgICAgICAgICAgaWYgKGR1cmF0aW9uICE9IDAgJiYgbUhlYWRlclRpbWVzY2FsZSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvbiAqIDEwMDAwMDAgLyBtSGVhZGVyVGltZXNjYWxlKTsKICAgICAgICAgICAgIH0KIApAQCAtMTg1MSw2ICsxOTIzLDkgQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZCcsICdhJywgJ3QnKToKICAgICAgICAgewogICAgICAgICAgICAgQUxPR1YoIm1kYXQgY2h1bmssIGRybTogJWQiLCBtSXNEcm0pOworCisgICAgICAgICAgICBtTWRhdEZvdW5kID0gdHJ1ZTsKKwogICAgICAgICAgICAgaWYgKCFtSXNEcm0pIHsKICAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xODY3LDYgKzE5NDIsMTAgQEAKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCisgICAgICAgICAgICBpZiAodW5kZXJRVE1ldGFQYXRoKG1QYXRoLCAzKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICB1aW50MzJfdCBidWZmZXI7CiAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICsgOCwgJmJ1ZmZlciwgNCkgPCA0KSB7CkBAIC0xODg2LDYgKzE5NjUsMTYgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2snLCAnZScsICd5JywgJ3MnKToKKyAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICBpZiAodW5kZXJRVE1ldGFQYXRoKG1QYXRoLCAzKSkgeworICAgICAgICAgICAgICAgIHBhcnNlUVRNZXRhS2V5KGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIEZPVVJDQygndCcsICdyJywgJ2UnLCAneCcpOgogICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CkBAIC0xOTA3LDYgKzE5OTYsOSBAQAogCiAgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ3gnLCAnMycsICdnJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKwogICAgICAgICAgICAgdWludDMyX3QgdHlwZTsKICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CiAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IDA7CkBAIC0xOTUyLDggKzIwNDQsOCBAQAogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCiAgICAgICAgICAgICBpZiAobUZpbGVNZXRhRGF0YSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNodW5rX2RhdGFfc2l6ZSA9ICVsbGQgYW5kIGRhdGFfb2Zmc2V0ID0gJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaHVua19kYXRhX3NpemUsIGRhdGFfb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBBTE9HVigiY2h1bmtfZGF0YV9zaXplID0gJSIgUFJJZDY0ICIgYW5kIGRhdGFfb2Zmc2V0ID0gJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgICAgICAgIGNodW5rX2RhdGFfc2l6ZSwgZGF0YV9vZmZzZXQpOwogCiAgICAgICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDAgfHwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGNodW5rX2RhdGFfc2l6ZSkgPj0gU0laRV9NQVggLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CkBAIC0yMDI1LDYgKzIxMTcsMTIgQEAKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICB7CisgICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSdyZSBwYXJzaW5nICdpbHN0JyBmb3IgbWV0YSBrZXlzCisgICAgICAgICAgICAvLyBpZiBzbywgdHJlYXQgdHlwZSBhcyBhIG51bWJlciAoa2V5LWlkKS4KKyAgICAgICAgICAgIGlmICh1bmRlclFUTWV0YVBhdGgobVBhdGgsIDMpKSB7CisgICAgICAgICAgICAgICAgcGFyc2VRVE1ldGFWYWwoY2h1bmtfdHlwZSwgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yMDYwLDYgKzIxNTgsOCBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KICAgICBBTE9HVigic2lkeCByZWZpZC90aW1lc2NhbGU6ICVkLyVkIiwgcmVmZXJlbmNlSWQsIHRpbWVTY2FsZSk7CisgICAgaWYgKHRpbWVTY2FsZSA9PSAwKQorICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCiAgICAgdWludDY0X3QgZWFybGllc3RQcmVzZW50YXRpb25UaW1lOwogICAgIHVpbnQ2NF90IGZpcnN0T2Zmc2V0OwpAQCAtMjE0Myw2ICsyMjQzLDkgQEAKIAogICAgIHVpbnQ2NF90IHNpZHhEdXJhdGlvbiA9IHRvdGFsX2R1cmF0aW9uICogMTAwMDAwMCAvIHRpbWVTY2FsZTsKIAorICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKICAgICBpbnQ2NF90IG1ldGFEdXJhdGlvbjsKICAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZtZXRhRHVyYXRpb24pIHx8IG1ldGFEdXJhdGlvbiA9PSAwKSB7CiAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgc2lkeER1cmF0aW9uKTsKQEAgLTIxNTAsNyArMjI1MywxMDggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZVFUTWV0YUtleShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA8IDgpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CiAKKyAgICB1aW50MzJfdCBjb3VudDsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0ICsgNCwgJmNvdW50KSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGlmIChtTWV0YUtleU1hcC5zaXplKCkgPiAwKSB7CisgICAgICAgIEFMT0dXKCIna2V5cycgYXRvbSBzZWVuIGFnYWluLCBkaXNjYXJkaW5nIGV4aXN0aW5nIGVudHJpZXMiKTsKKyAgICAgICAgbU1ldGFLZXlNYXAuY2xlYXIoKTsKKyAgICB9CisKKyAgICBvZmY2NF90IGtleU9mZnNldCA9IG9mZnNldCArIDg7CisgICAgb2ZmNjRfdCBzdG9wT2Zmc2V0ID0gb2Zmc2V0ICsgc2l6ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8PSBjb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChrZXlPZmZzZXQgKyA4ID4gc3RvcE9mZnNldCkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IGtleVNpemU7CisgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihrZXlPZmZzZXQsICZrZXlTaXplKQorICAgICAgICAgICAgICAgIHx8IGtleVNpemUgPCA4CisgICAgICAgICAgICAgICAgfHwga2V5T2Zmc2V0ICsga2V5U2l6ZSA+IHN0b3BPZmZzZXQpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIoa2V5T2Zmc2V0ICsgNCwgJnR5cGUpCisgICAgICAgICAgICAgICAgfHwgdHlwZSAhPSBGT1VSQ0MoJ20nLCAnZCcsICd0JywgJ2EnKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIGtleVNpemUgLT0gODsKKyAgICAgICAga2V5T2Zmc2V0ICs9IDg7CisKKyAgICAgICAgc3A8QUJ1ZmZlcj4ga2V5RGF0YSA9IG5ldyBBQnVmZmVyKGtleVNpemUpOworICAgICAgICBpZiAoa2V5RGF0YS0+ZGF0YSgpID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAga2V5T2Zmc2V0LCBrZXlEYXRhLT5kYXRhKCksIGtleVNpemUpIDwgKHNzaXplX3QpIGtleVNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBBU3RyaW5nIGtleSgoY29uc3QgY2hhciAqKWtleURhdGEtPmRhdGEoKSwga2V5U2l6ZSk7CisgICAgICAgIG1NZXRhS2V5TWFwLmFkZChpLCBrZXkpOworCisgICAgICAgIGtleU9mZnNldCArPSBrZXlTaXplOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZVFUTWV0YVZhbCgKKyAgICAgICAgaW50MzJfdCBrZXlJZCwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgc3NpemVfdCBpbmRleCA9IG1NZXRhS2V5TWFwLmluZGV4T2ZLZXkoa2V5SWQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgLy8gY29ycmVzcG9uZGluZyBrZXkgaXMgbm90IHByZXNlbnQsIGlnbm9yZQorICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGlmIChzaXplIDw9IDE2KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIHVpbnQzMl90IGRhdGFTaXplOworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZkYXRhU2l6ZSkKKyAgICAgICAgICAgIHx8IGRhdGFTaXplID4gc2l6ZSB8fCBkYXRhU2l6ZSA8PSAxNikgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICB1aW50MzJfdCBhdG9tRm91ckNDOworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQgKyA0LCAmYXRvbUZvdXJDQykKKyAgICAgICAgICAgIHx8IGF0b21Gb3VyQ0MgIT0gRk9VUkNDKCdkJywgJ2EnLCAndCcsICdhJykpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgdWludDMyX3QgZGF0YVR5cGU7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCArIDgsICZkYXRhVHlwZSkKKyAgICAgICAgICAgIHx8ICgoZGF0YVR5cGUgJiAweGZmMDAwMDAwKSAhPSAwKSkgeworICAgICAgICAvLyBub3Qgd2VsbC1rbm93biB0eXBlCisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgZGF0YVNpemUgLT0gMTY7CisgICAgb2Zmc2V0ICs9IDE2OworCisgICAgaWYgKGRhdGFUeXBlID09IDIzICYmIGRhdGFTaXplID49IDQpIHsKKyAgICAgICAgLy8gQkUgRmxvYXQzMgorICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZ2YWwpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIGlmICghc3RyY2FzZWNtcChtTWV0YUtleU1hcFtpbmRleF0uY19zdHIoKSwgImNvbS5hbmRyb2lkLmNhcHR1cmUuZnBzIikpIHsKKyAgICAgICAgICAgIG1GaWxlTWV0YURhdGEtPnNldEZsb2F0KGtLZXlDYXB0dXJlRnJhbWVyYXRlLCAqKGZsb2F0ICopJnZhbCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBhZGQgbW9yZSBrZXlzIGlmIG5lZWRlZAorICAgICAgICBBTE9HVigiaWdub3Jpbmcga2V5OiB0eXBlICVkLCBzaXplICVkIiwgZGF0YVR5cGUsIGRhdGFTaXplKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CiAKIHN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZVRyYWNrSGVhZGVyKAogICAgICAgICBvZmY2NF90IGRhdGFfb2Zmc2V0LCBvZmY2NF90IGRhdGFfc2l6ZSkgewpAQCAtMjE5Myw2ICsyMzk3LDkgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KIAorICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5VHJhY2tJRCwgaWQpOwogCiAgICAgc2l6ZV90IG1hdHJpeE9mZnNldCA9IGR5blNpemUgKyAxNjsKQEAgLTIyNjQsNyArMjQ3MSw3IEBACiAgICAgdWludDMyX3QgbWV0YWRhdGFLZXkgPSAwOwogICAgIGNoYXIgY2h1bmtbNV07CiAgICAgTWFrZUZvdXJDQ1N0cmluZyhtUGF0aFs0XSwgY2h1bmspOwotICAgIEFMT0dWKCJtZXRhOiAlcyBAICVsbGQiLCBjaHVuaywgb2Zmc2V0KTsKKyAgICBBTE9HVigibWV0YTogJXMgQCAlbGxkIiwgY2h1bmssIChsb25nIGxvbmcpb2Zmc2V0KTsKICAgICBzd2l0Y2ggKChpbnQzMl90KW1QYXRoWzRdKSB7CiAgICAgICAgIGNhc2UgRk9VUkNDKDB4YTksICdhJywgJ2wnLCAnYicpOgogICAgICAgICB7CkBAIC0yMzgxLDYgKzI1ODgsOSBAQAogICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlbGF5LCBwYWRkaW5nOwogICAgICAgICAgICAgICAgICAgICBpZiAoc3NjYW5mKG1MYXN0Q29tbWVudERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAlKnggJXggJXggJSp4IiwgJmRlbGF5LCAmcGFkZGluZykgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCiAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBkZWxheSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5RW5jb2RlclBhZGRpbmcsIHBhZGRpbmcpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0yNjY5LDYgKzI4NzksNyBAQAogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpCisgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMikKICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKICAgICAgICAgaWYgKCF0cmFjay0+bWV0YS0+ZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpCiAgICAgICAgICAgICAgICAgfHwgdHlwZSAhPSBrVHlwZUVTRFMpIHsKQEAgLTI3NTMsNiArMjk2NCw5IEBACiAKICAgICBpZiAob2JqZWN0VHlwZUluZGljYXRpb24gPT0gMHhlMSkgewogICAgICAgICAvLyBUaGlzIGlzbid0IE1QRUc0IGF1ZGlvIGF0IGFsbCwgaXQncyBRQ0VMUCAxNGsuLi4KKyAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1FDRUxQKTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KQEAgLTI3NzMsNyArMjk4Nyw3IEBACiAgICAgfQogCiAgICAgaWYgKGtVc2VIZXhEdW1wKSB7Ci0gICAgICAgIHByaW50ZigiRVNEIG9mIHNpemUgJWRcbiIsIGNzZF9zaXplKTsKKyAgICAgICAgcHJpbnRmKCJFU0Qgb2Ygc2l6ZSAlenVcbiIsIGNzZF9zaXplKTsKICAgICAgICAgaGV4ZHVtcChjc2QsIGNzZF9zaXplKTsKICAgICB9CiAKQEAgLTI4MDEsNiArMzAxNSw5IEBACiAgICAgICAgIG9iamVjdFR5cGUgPSAzMiArIGJyLmdldEJpdHMoNik7CiAgICAgfQogCisgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKwogICAgIC8va2VlcCBBT1QgdHlwZQogICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlBQUNBT1QsIG9iamVjdFR5cGUpOwogCkBAIC0yODA5LDEyICszMDI2LDExIEBACiAgICAgaW50MzJfdCBzYW1wbGVSYXRlID0gMDsKICAgICBpbnQzMl90IG51bUNoYW5uZWxzID0gMDsKICAgICBpZiAoZnJlcUluZGV4ID09IDE1KSB7Ci0gICAgICAgIGlmIChjc2Rfc2l6ZSA8IDUpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAyOCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgc2FtcGxlUmF0ZSA9IGJyLmdldEJpdHMoMjQpOwogICAgICAgICBudW1DaGFubmVscyA9IGJyLmdldEJpdHMoNCk7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICBudW1DaGFubmVscyA9IGJyLmdldEJpdHMoNCk7CiAKICAgICAgICAgaWYgKGZyZXFJbmRleCA9PSAxMyB8fCBmcmVxSW5kZXggPT0gMTQpIHsKQEAgLTI4MjUsMTIgKzMwNDEsMTQgQEAKICAgICB9CiAKICAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfU0JSIHx8IG9iamVjdFR5cGUgPT0gQU9UX1BTKSB7Ly9TQlIgc3BlY2lmaWMgY29uZmlnIHBlciAxNDQ5Ni0zIHRhYmxlIDEuMTMKKyAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB1aW50MzJfdCBleHRGcmVxSW5kZXggPSBici5nZXRCaXRzKDQpOwogICAgICAgICBpbnQzMl90IGV4dFNhbXBsZVJhdGUgX191bnVzZWQ7CiAgICAgICAgIGlmIChleHRGcmVxSW5kZXggPT0gMTUpIHsKICAgICAgICAgICAgIGlmIChjc2Rfc2l6ZSA8IDgpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAyNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIGV4dFNhbXBsZVJhdGUgPSBici5nZXRCaXRzKDI0KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChleHRGcmVxSW5kZXggPT0gMTMgfHwgZXh0RnJlcUluZGV4ID09IDE0KSB7CkBAIC0yODY3LDIwICszMDg1LDI0IEBACiAKICAgICB7CiAgICAgICAgIGlmIChvYmplY3RUeXBlID09IEFPVF9TQlIgfHwgb2JqZWN0VHlwZSA9PSBBT1RfUFMpIHsKKyAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNSkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIG9iamVjdFR5cGUgPSBici5nZXRCaXRzKDUpOwogCiAgICAgICAgICAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfRVNDQVBFKSB7CisgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA2KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPSAzMiArIGJyLmdldEJpdHMoNik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKG9iamVjdFR5cGUgPT0gQU9UX0FBQ19MQyB8fCBvYmplY3RUeXBlID09IEFPVF9FUl9BQUNfTEMgfHwKICAgICAgICAgICAgICAgICBvYmplY3RUeXBlID09IEFPVF9FUl9BQUNfTEQgfHwgb2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX1NDQUwgfHwKICAgICAgICAgICAgICAgICBvYmplY3RUeXBlID09IEFPVF9FUl9CU0FDKSB7CisgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDIpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGZyYW1lTGVuZ3RoRmxhZyBfX3VudXNlZCA9IGJyLmdldEJpdHMoMSk7CiAKICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZGVwZW5kc09uQ29yZUNvZGVyID0gYnIuZ2V0Qml0cygxKTsKIAogICAgICAgICAgICAgaWYgKGRlcGVuZHNPbkNvcmVDb2RlciApIHsKKyAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDE0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgY29yZUNvZGVyRGVsYXkgX191bnVzZWQgPSBici5nZXRCaXRzKDE0KTsKICAgICAgICAgICAgIH0KIApAQCAtMjkwMCw3ICszMTIyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uRmxhZyA9IDE7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBTE9HVygiY3NkIG1pc3NpbmcgZXh0ZW5zaW9uIGZsYWc7IGFzc3VtaW5nICVkIGZvciBvYmplY3QgdHlwZSAldS4iLApAQCAtMjkxMCw2ICszMTMyLDkgQEAKICAgICAgICAgICAgIGlmIChudW1DaGFubmVscyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsc0VmZmVjdGl2ZU51bSA9IDA7CiAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsc051bSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAzMikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEVsZW1lbnRJbnN0YW5jZVRhZyBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBQcm9maWxlIF9fdW51c2VkID0gYnIuZ2V0Qml0cygyKTsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFNhbXBsaW5nRnJlcXVlbmN5SW5kZXggX191bnVzZWQgPSBici5nZXRCaXRzKDQpOwpAQCAtMjkyMSwzNSArMzE0Niw0NCBAQAogICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtVmFsaWRDY0VsZW1lbnRzIF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKIAogICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTW9ub01peGRvd25QcmVzZW50ID0gYnIuZ2V0Qml0cygxKTsKKwogICAgICAgICAgICAgICAgIGlmIChNb25vTWl4ZG93blByZXNlbnQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTW9ub01peGRvd25FbGVtZW50TnVtYmVyIF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDEpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTdGVyZW9NaXhkb3duUHJlc2VudCA9IGJyLmdldEJpdHMoMSk7CiAgICAgICAgICAgICAgICAgaWYgKFN0ZXJlb01peGRvd25QcmVzZW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFN0ZXJlb01peGRvd25FbGVtZW50TnVtYmVyIF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDEpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNYXRyaXhNaXhkb3duSW5kZXhQcmVzZW50ID0gYnIuZ2V0Qml0cygxKTsKICAgICAgICAgICAgICAgICBpZiAoTWF0cml4TWl4ZG93bkluZGV4UHJlc2VudCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMykgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNYXRyaXhNaXhkb3duSW5kZXggX191bnVzZWQgPSBici5nZXRCaXRzKDIpOwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFBzZXVkb1N1cnJvdW5kRW5hYmxlIF9fdW51c2VkID0gYnIuZ2V0Qml0cygxKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpbnQgaTsKICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bUZyb250Q2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA1KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEZyb250RWxlbWVudElzQ3BlID0gYnIuZ2V0Qml0cygxKTsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBGcm9udEVsZW1lbnRUYWdTZWxlY3QgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOwogICAgICAgICAgICAgICAgICAgICBjaGFubmVsc051bSArPSBGcm9udEVsZW1lbnRJc0NwZSA/IDIgOiAxOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgTnVtU2lkZUNoYW5uZWxFbGVtZW50czsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNSkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTaWRlRWxlbWVudElzQ3BlID0gYnIuZ2V0Qml0cygxKTsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTaWRlRWxlbWVudFRhZ1NlbGVjdCBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IFNpZGVFbGVtZW50SXNDcGUgPyAyIDogMTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bUJhY2tDaGFubmVsRWxlbWVudHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDUpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgQmFja0VsZW1lbnRJc0NwZSA9IGJyLmdldEJpdHMoMSk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgQmFja0VsZW1lbnRUYWdTZWxlY3QgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOwogICAgICAgICAgICAgICAgICAgICBjaGFubmVsc051bSArPSBCYWNrRWxlbWVudElzQ3BlID8gMiA6IDE7CkBAIC0yOTU3LDYgKzMxOTEsNyBAQAogICAgICAgICAgICAgICAgIGNoYW5uZWxzRWZmZWN0aXZlTnVtID0gY2hhbm5lbHNOdW07CiAKICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bUxmZUNoYW5uZWxFbGVtZW50czsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBMZmVFbGVtZW50VGFnU2VsZWN0IF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gMTsKICAgICAgICAgICAgICAgICB9CkBAIC0yOTcxLDYgKzMyMDYsOSBAQAogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCisgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKwogICAgIGludDMyX3QgcHJldlNhbXBsZVJhdGU7CiAgICAgQ0hFQ0sobUxhc3RUcmFjay0+bWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmcHJldlNhbXBsZVJhdGUpKTsKIApAQCAtMzE4Miw3ICszNDIwLDcgQEAKIAogICAgIGNoYXIgY2h1bmtbNV07CiAgICAgTWFrZUZvdXJDQ1N0cmluZyhjaHVua190eXBlLCBjaHVuayk7Ci0gICAgQUxPR1YoIk1QRUc0U291cmNlIGNodW5rICVzIEAgJWxseCIsIGNodW5rLCAqb2Zmc2V0KTsKKyAgICBBTE9HVigiTVBFRzRTb3VyY2UgY2h1bmsgJXMgQCAlI2xseCIsIGNodW5rLCAobG9uZyBsb25nKSpvZmZzZXQpOwogCiAgICAgb2ZmNjRfdCBjaHVua19kYXRhX3NpemUgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZSAtIGRhdGFfb2Zmc2V0OwogCkBAIC0zNjYyLDcgKzM5MDAsNyBAQAogICAgICAgICBzYW1wbGVDdHNPZmZzZXQgPSAwOwogICAgIH0KIAotICAgIGlmIChzaXplIDwgKG9mZjY0X3Qpc2FtcGxlQ291bnQgKiBieXRlc1BlclNhbXBsZSkgeworICAgIGlmIChzaXplIDwgKG9mZjY0X3QpKHNhbXBsZUNvdW50ICogYnl0ZXNQZXJTYW1wbGUpKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIApAQCAtNDQ3Nyw3ICs0NzE1LDcgQEAKIAogICAgICAgICBjaGFyIGNodW5rc3RyaW5nWzVdOwogICAgICAgICBNYWtlRm91ckNDU3RyaW5nKGNodW5rVHlwZSwgY2h1bmtzdHJpbmcpOwotICAgICAgICBBTE9HVigic2F3IGNodW5rIHR5cGUgJXMsIHNpemUgJSIgUFJJdTY0ICIgQCAlbGxkIiwgY2h1bmtzdHJpbmcsIGNodW5rU2l6ZSwgb2Zmc2V0KTsKKyAgICAgICAgQUxPR1YoInNhdyBjaHVuayB0eXBlICVzLCBzaXplICUiIFBSSXU2NCAiIEAgJWxsZCIsIGNodW5rc3RyaW5nLCBjaHVua1NpemUsIChsb25nIGxvbmcpb2Zmc2V0KTsKICAgICAgICAgc3dpdGNoIChjaHVua1R5cGUpIHsKICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdmJywgJ3QnLCAneScsICdwJyk6CiAgICAgICAgICAgICB7CkBAIC00NTQwLDcgKzQ3NzgsNyBAQAogICAgICAgICAqbWV0YSA9IG5ldyBBTWVzc2FnZTsKICAgICAgICAgKCptZXRhKS0+c2V0SW50NjQoIm1ldGEtZGF0YS1zaXplIiwgbW9vdkF0b21FbmRPZmZzZXQpOwogCi0gICAgICAgIEFMT0dWKCJmb3VuZCBtZXRhZGF0YSBzaXplOiAlbGxkIiwgbW9vdkF0b21FbmRPZmZzZXQpOworICAgICAgICBBTE9HVigiZm91bmQgbWV0YWRhdGEgc2l6ZTogJWxsZCIsIChsb25nIGxvbmcpbW9vdkF0b21FbmRPZmZzZXQpOwogICAgIH0KIAogICAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCmluZGV4IDg0NGEwMTkuLjQ3ZjExNGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgpAQCAtNjIsNiArNjMsMTYgQEAKIHN0YXRpYyBjb25zdCB1aW50OF90IGtOYWxVbml0VHlwZVBpY1BhcmFtU2V0ID0gMHgwODsKIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtJbml0aWFsRGVsYXlUaW1lVXMgICAgID0gNzAwMDAwTEw7CiAKK3N0YXRpYyBjb25zdCBjaGFyIGtNZXRhS2V5X1ZlcnNpb25bXSAgICA9ICJjb20uYW5kcm9pZC52ZXJzaW9uIjsKKyNpZmRlZiBTSE9XX01PREVMX0JVSUxECitzdGF0aWMgY29uc3QgY2hhciBrTWV0YUtleV9Nb2RlbFtdICAgICAgPSAiY29tLmFuZHJvaWQubW9kZWwiOworc3RhdGljIGNvbnN0IGNoYXIga01ldGFLZXlfQnVpbGRbXSAgICAgID0gImNvbS5hbmRyb2lkLmJ1aWxkIjsKKyNlbmRpZgorc3RhdGljIGNvbnN0IGNoYXIga01ldGFLZXlfQ2FwdHVyZUZwc1tdID0gImNvbS5hbmRyb2lkLmNhcHR1cmUuZnBzIjsKKworLyogdW5jb21tZW50IHRvIGluY2x1ZGUgbW9kZWwgYW5kIGJ1aWxkIGluIG1ldGEgKi8KKy8vI2RlZmluZSBTSE9XX01PREVMX0JVSUxEIDEKKwogY2xhc3MgTVBFRzRXcml0ZXI6OlRyYWNrIHsKIHB1YmxpYzoKICAgICBUcmFjayhNUEVHNFdyaXRlciAqb3duZXIsIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLCBzaXplX3QgdHJhY2tJZCk7CkBAIC04Myw2ICs5NCw3IEBACiAgICAgdm9pZCBhZGRDaHVua09mZnNldChvZmY2NF90IG9mZnNldCk7CiAgICAgaW50MzJfdCBnZXRUcmFja0lkKCkgY29uc3QgeyByZXR1cm4gbVRyYWNrSWQ7IH0KICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldEZvdXJDQ0Zvck1pbWUoY29uc3QgY2hhciAqbWltZSk7CiAKIHByaXZhdGU6CiAgICAgZW51bSB7CkBAIC0xMDEsNiArMTEzLDggQEAKICAgICAgICAgICAgIG1DdXJyVGFibGVFbnRyaWVzRWxlbWVudChOVUxMKSB7CiAgICAgICAgICAgICBDSEVDS19HVChtRWxlbWVudENhcGFjaXR5LCAwKTsKICAgICAgICAgICAgIENIRUNLX0dUKG1FbnRyeUNhcGFjaXR5LCAwKTsKKyAgICAgICAgICAgIC8vIEVuc3VyZSBubyBpbnRlZ2VyIG92ZXJmbG93IG9uIGFsbG9jYXRpb24gaW4gYWRkKCkuCisgICAgICAgICAgICBDSEVDS19MVChtRW50cnlDYXBhY2l0eSwgVUlOVDMyX01BWCAvIG1FbGVtZW50Q2FwYWNpdHkpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gRnJlZSB0aGUgYWxsb2NhdGVkIG1lbW9yeS4KQEAgLTM0NSwzMSArMzU5LDYgQEAKICAgICBUcmFjayAmb3BlcmF0b3I9KGNvbnN0IFRyYWNrICYpOwogfTsKIAotTVBFRzRXcml0ZXI6Ok1QRUc0V3JpdGVyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotICAgIDogbUZkKC0xKSwKLSAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCi0gICAgICBtSXNSZWFsVGltZVJlY29yZGluZyh0cnVlKSwKLSAgICAgIG1Vc2U0Qnl0ZU5hbExlbmd0aCh0cnVlKSwKLSAgICAgIG1Vc2UzMkJpdE9mZnNldCh0cnVlKSwKLSAgICAgIG1Jc0ZpbGVTaXplTGltaXRFeHBsaWNpdGx5UmVxdWVzdGVkKGZhbHNlKSwKLSAgICAgIG1QYXVzZWQoZmFsc2UpLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbVdyaXRlclRocmVhZFN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbU9mZnNldCgwKSwKLSAgICAgIG1NZGF0T2Zmc2V0KDApLAotICAgICAgbUVzdGltYXRlZE1vb3ZCb3hTaXplKDApLAotICAgICAgbUludGVybGVhdmVEdXJhdGlvblVzKDEwMDAwMDApLAotICAgICAgbUxhdGl0dWRleDEwMDAwKDApLAotICAgICAgbUxvbmdpdHVkZXgxMDAwMCgwKSwKLSAgICAgIG1BcmVHZW9UYWdzQXZhaWxhYmxlKGZhbHNlKSwKLSAgICAgIG1TdGFydFRpbWVPZmZzZXRNcygtMSkgewotCi0gICAgbUZkID0gb3BlbihmaWxlbmFtZSwgT19DUkVBVCB8IE9fTEFSR0VGSUxFIHwgT19UUlVOQyB8IE9fUkRXUiwgU19JUlVTUiB8IFNfSVdVU1IpOwotICAgIGlmIChtRmQgPj0gMCkgewotICAgICAgICBtSW5pdENoZWNrID0gT0s7Ci0gICAgfQotfQotCiBNUEVHNFdyaXRlcjo6TVBFRzRXcml0ZXIoaW50IGZkKQogICAgIDogbUZkKGR1cChmZCkpLAogICAgICAgbUluaXRDaGVjayhtRmQgPCAwPyBOT19JTklUOiBPSyksCkBAIC0zODIsMTIgKzM3MSwyOSBAQAogICAgICAgbVdyaXRlclRocmVhZFN0YXJ0ZWQoZmFsc2UpLAogICAgICAgbU9mZnNldCgwKSwKICAgICAgIG1NZGF0T2Zmc2V0KDApLAorICAgICAgbU1vb3ZCb3hCdWZmZXIoTlVMTCksCisgICAgICBtTW9vdkJveEJ1ZmZlck9mZnNldCgwKSwKKyAgICAgIG1Xcml0ZU1vb3ZCb3hUb01lbW9yeShmYWxzZSksCisgICAgICBtRnJlZUJveE9mZnNldCgwKSwKKyAgICAgIG1TdHJlYW1hYmxlRmlsZShmYWxzZSksCiAgICAgICBtRXN0aW1hdGVkTW9vdkJveFNpemUoMCksCisgICAgICBtTW9vdkV4dHJhU2l6ZSgwKSwKICAgICAgIG1JbnRlcmxlYXZlRHVyYXRpb25VcygxMDAwMDAwKSwKKyAgICAgIG1UaW1lU2NhbGUoLTEpLAorICAgICAgbVN0YXJ0VGltZXN0YW1wVXMoLTFsbCksCiAgICAgICBtTGF0aXR1ZGV4MTAwMDAoMCksCiAgICAgICBtTG9uZ2l0dWRleDEwMDAwKDApLAogICAgICAgbUFyZUdlb1RhZ3NBdmFpbGFibGUoZmFsc2UpLAotICAgICAgbVN0YXJ0VGltZU9mZnNldE1zKC0xKSB7CisgICAgICBtU3RhcnRUaW1lT2Zmc2V0TXMoLTEpLAorICAgICAgbU1ldGFLZXlzKG5ldyBBTWVzc2FnZSgpKSB7CisgICAgYWRkRGV2aWNlTWV0YSgpOworCisgICAgLy8gVmVyaWZ5IG1GZCBpcyBzZWVrYWJsZQorICAgIG9mZjY0X3Qgb2ZmID0gbHNlZWs2NChtRmQsIDAsIFNFRUtfU0VUKTsKKyAgICBpZiAob2ZmIDwgMCkgeworICAgICAgICBBTE9HRSgiY2Fubm90IHNlZWsgbUZkOiAlcyAoJWQpIiwgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7CisgICAgICAgIHJlbGVhc2UoKTsKKyAgICB9CiB9CiAKIE1QRUc0V3JpdGVyOjp+TVBFRzRXcml0ZXIoKSB7CkBAIC00MzcsNiArNDQzLDMzIEBACiAgICAgcmV0dXJuIE9LOwogfQogCisvLyBzdGF0aWMKK2NvbnN0IGNoYXIgKk1QRUc0V3JpdGVyOjpUcmFjazo6Z2V0Rm91ckNDRm9yTWltZShjb25zdCBjaGFyICptaW1lKSB7CisgICAgaWYgKG1pbWUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKKyAgICAgICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgbWltZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAic2FtciI7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLCBtaW1lKSkgeworICAgICAgICAgICAgcmV0dXJuICJzYXdiIjsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsIG1pbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gIm1wNGEiOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpKSB7CisgICAgICAgIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgbWltZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAibXA0diI7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgbWltZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiczI2MyI7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCBtaW1lKSkgeworICAgICAgICAgICAgcmV0dXJuICJhdmMxIjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJUcmFjayAoJXMpIG90aGVyIHRoYW4gdmlkZW8gb3IgYXVkaW8gaXMgbm90IHN1cHBvcnRlZCIsIG1pbWUpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwogc3RhdHVzX3QgTVBFRzRXcml0ZXI6OmFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICBpZiAobVN0YXJ0ZWQpIHsKQEAgLTQ1MiwxNCArNDg1LDExIEBACiAKICAgICBDSEVDSyhzb3VyY2UuZ2V0KCkgIT0gTlVMTCk7CiAKLSAgICAvLyBBIHRyYWNrIG9mIHR5cGUgb3RoZXIgdGhhbiB2aWRlbyBvciBhdWRpbyBpcyBub3Qgc3VwcG9ydGVkLgogICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgc291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CiAgICAgYm9vbCBpc0F1ZGlvID0gIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KTsKLSAgICBib29sIGlzVmlkZW8gPSAhc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpOwotICAgIGlmICghaXNBdWRpbyAmJiAhaXNWaWRlbykgewotICAgICAgICBBTE9HRSgiVHJhY2sgKCVzKSBvdGhlciB0aGFuIHZpZGVvIG9yIGF1ZGlvIGlzIG5vdCBzdXBwb3J0ZWQiLAotICAgICAgICAgICAgbWltZSk7CisgICAgaWYgKFRyYWNrOjpnZXRGb3VyQ0NGb3JNaW1lKG1pbWUpID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIG1pbWUgJyVzJyIsIG1pbWUpOwogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCkBAIC01MDcsNiArNTM3LDM0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIE1QRUc0V3JpdGVyOjphZGREZXZpY2VNZXRhKCkgeworICAgIC8vIGFkZCBkZXZpY2UgaW5mbyBhbmQgZXN0aW1hdGUgc3BhY2UgaW4gJ21vb3YnCisgICAgY2hhciB2YWxbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBzaXplX3QgbjsKKyAgICAvLyBtZXRhIHNpemUgaXMgZXN0aW1hdGVkIGJ5IGFkZGluZyB1cCB0aGUgZm9sbG93aW5nOgorICAgIC8vIC0gbWV0YSBoZWFkZXIgc3RydWN0dXJlcywgd2hpY2ggb2NjdXIgb25seSBvbmNlICh0b3RhbCA2NiBieXRlcykKKyAgICAvLyAtIHNpemUgZm9yIGVhY2gga2V5LCB3aGljaCBjb25zaXN0cyBvZiBhIGZpeGVkIGhlYWRlciAoMzIgYnl0ZXMpLAorICAgIC8vICAgcGx1cyBrZXkgbGVuZ3RoIGFuZCBkYXRhIGxlbmd0aC4KKyAgICBtTW9vdkV4dHJhU2l6ZSArPSA2NjsKKyAgICBpZiAocHJvcGVydHlfZ2V0KCJyby5idWlsZC52ZXJzaW9uLnJlbGVhc2UiLCB2YWwsIE5VTEwpCisgICAgICAgICAgICAmJiAobiA9IHN0cmxlbih2YWwpKSA+IDApIHsKKyAgICAgICAgbU1ldGFLZXlzLT5zZXRTdHJpbmcoa01ldGFLZXlfVmVyc2lvbiwgdmFsLCBuICsgMSk7CisgICAgICAgIG1Nb292RXh0cmFTaXplICs9IHNpemVvZihrTWV0YUtleV9WZXJzaW9uKSArIG4gKyAzMjsKKyAgICB9CisjaWZkZWYgU0hPV19NT0RFTF9CVUlMRAorICAgIGlmIChwcm9wZXJ0eV9nZXQoInJvLnByb2R1Y3QubW9kZWwiLCB2YWwsIE5VTEwpCisgICAgICAgICAgICAmJiAobiA9IHN0cmxlbih2YWwpKSA+IDApIHsKKyAgICAgICAgbU1ldGFLZXlzLT5zZXRTdHJpbmcoa01ldGFLZXlfTW9kZWwsIHZhbCwgbiArIDEpOworICAgICAgICBtTW9vdkV4dHJhU2l6ZSArPSBzaXplb2Yoa01ldGFLZXlfTW9kZWwpICsgbiArIDMyOworICAgIH0KKyAgICBpZiAocHJvcGVydHlfZ2V0KCJyby5idWlsZC5kaXNwbGF5LmlkIiwgdmFsLCBOVUxMKQorICAgICAgICAgICAgJiYgKG4gPSBzdHJsZW4odmFsKSkgPiAwKSB7CisgICAgICAgIG1NZXRhS2V5cy0+c2V0U3RyaW5nKGtNZXRhS2V5X0J1aWxkLCB2YWwsIG4gKyAxKTsKKyAgICAgICAgbU1vb3ZFeHRyYVNpemUgKz0gc2l6ZW9mKGtNZXRhS2V5X0J1aWxkKSArIG4gKyAzMjsKKyAgICB9CisjZW5kaWYKK30KKwogaW50NjRfdCBNUEVHNFdyaXRlcjo6ZXN0aW1hdGVNb292Qm94U2l6ZShpbnQzMl90IGJpdFJhdGUpIHsKICAgICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGhpZ2hseSBleHBlcmltZW50YWwvaGV1cmlzaXRpYy4KICAgICAvLwpAQCAtNTYwLDYgKzYxOCw5IEBACiAgICAgICAgIHNpemUgPSBNQVhfTU9PVl9CT1hfU0laRTsKICAgICB9CiAKKyAgICAvLyBBY2NvdW50IGZvciB0aGUgZXh0cmEgc3R1ZmYgKEdlbywgbWV0YSBrZXlzLCBldGMuKQorICAgIHNpemUgKz0gbU1vb3ZFeHRyYVNpemU7CisKICAgICBBTE9HSSgibGltaXRzOiAlIiBQUklkNjQgIi8lIiBQUklkNjQgIiBieXRlcy91cywgYml0IHJhdGU6ICVkIGJwcyBhbmQgdGhlIgogICAgICAgICAgIiBlc3RpbWF0ZWQgbW9vdiBzaXplICUiIFBSSWQ2NCAiIGJ5dGVzIiwKICAgICAgICAgIG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMsIG1NYXhGaWxlRHVyYXRpb25MaW1pdFVzLCBiaXRSYXRlLCBzaXplKTsKQEAgLTk3Myw2ICsxMDM0LDcgQEAKICAgICBpZiAobUFyZUdlb1RhZ3NBdmFpbGFibGUpIHsKICAgICAgICAgd3JpdGVVZHRhQm94KCk7CiAgICAgfQorICAgIHdyaXRlTWV0YUJveCgpOwogICAgIGludDMyX3QgaWQgPSAxOwogICAgIGZvciAoTGlzdDxUcmFjayAqPjo6aXRlcmF0b3IgaXQgPSBtVHJhY2tzLmJlZ2luKCk7CiAgICAgICAgIGl0ICE9IG1UcmFja3MuZW5kKCk7ICsraXQsICsraWQpIHsKQEAgLTExNDIsNiArMTIwNCwxNCBAQAogICAgIHJldHVybiBieXRlczsKIH0KIAordm9pZCBNUEVHNFdyaXRlcjo6YmVnaW5Cb3godWludDMyX3QgaWQpIHsKKyAgICBtQm94ZXMucHVzaF9iYWNrKG1Xcml0ZU1vb3ZCb3hUb01lbW9yeT8KKyAgICAgICAgICAgIG1Nb292Qm94QnVmZmVyT2Zmc2V0OiBtT2Zmc2V0KTsKKworICAgIHdyaXRlSW50MzIoMCk7CisgICAgd3JpdGVJbnQzMihpZCk7Cit9CisKIHZvaWQgTVBFRzRXcml0ZXI6OmJlZ2luQm94KGNvbnN0IGNoYXIgKmZvdXJjYykgewogICAgIENIRUNLX0VRKHN0cmxlbihmb3VyY2MpLCA0KTsKIApAQCAtMTI2Niw2ICsxMzM2LDE4IEBACiAgICAgbUxhdGl0dWRleDEwMDAwID0gbGF0aXR1ZGV4MTAwMDA7CiAgICAgbUxvbmdpdHVkZXgxMDAwMCA9IGxvbmdpdHVkZXgxMDAwMDsKICAgICBtQXJlR2VvVGFnc0F2YWlsYWJsZSA9IHRydWU7CisgICAgbU1vb3ZFeHRyYVNpemUgKz0gMzA7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHNFdyaXRlcjo6c2V0Q2FwdHVyZVJhdGUoZmxvYXQgY2FwdHVyZUZwcykgeworICAgIGlmIChjYXB0dXJlRnBzIDw9IDAuMGYpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtTWV0YUtleXMtPnNldEZsb2F0KGtNZXRhS2V5X0NhcHR1cmVGcHMsIGNhcHR1cmVGcHMpOworICAgIG1Nb292RXh0cmFTaXplICs9IHNpemVvZihrTWV0YUtleV9DYXB0dXJlRnBzKSArIDQgKyAzMjsKKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjY4OSwxNyArMjc3MSwxMyBAQAogICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgYm9vbCBzdWNjZXNzID0gbU1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOwogICAgIENIRUNLKHN1Y2Nlc3MpOwotICAgIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgbWltZSkpIHsKLSAgICAgICAgbU93bmVyLT5iZWdpbkJveCgibXA0diIpOwotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgbWltZSkpIHsKLSAgICAgICAgbU93bmVyLT5iZWdpbkJveCgiczI2MyIpOwotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCBtaW1lKSkgewotICAgICAgICBtT3duZXItPmJlZ2luQm94KCJhdmMxIik7Ci0gICAgfSBlbHNlIHsKKyAgICBjb25zdCBjaGFyICpmb3VyY2MgPSBnZXRGb3VyQ0NGb3JNaW1lKG1pbWUpOworICAgIGlmIChmb3VyY2MgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiVW5rbm93biBtaW1lIHR5cGUgJyVzJy4iLCBtaW1lKTsKICAgICAgICAgQ0hFQ0soISJzaG91bGQgbm90IGJlIGhlcmUsIHVua25vd24gbWltZSB0eXBlLiIpOwogICAgIH0KIAorICAgIG1Pd25lci0+YmVnaW5Cb3goZm91cmNjKTsgICAgICAgIC8vIHZpZGVvIGZvcm1hdAogICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgIC8vIHJlc2VydmVkCiAgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgLy8gcmVzZXJ2ZWQKICAgICBtT3duZXItPndyaXRlSW50MTYoMSk7ICAgICAgICAgICAvLyBkYXRhIHJlZiBpbmRleApAQCAtMjc0MywxNCArMjgyMSw4IEBACiAgICAgY29uc3QgY2hhciAqbWltZTsKICAgICBib29sIHN1Y2Nlc3MgPSBtTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CiAgICAgQ0hFQ0soc3VjY2Vzcyk7Ci0gICAgY29uc3QgY2hhciAqZm91cmNjID0gTlVMTDsKLSAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLCBtaW1lKSkgewotICAgICAgICBmb3VyY2MgPSAic2FtciI7Ci0gICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsIG1pbWUpKSB7Ci0gICAgICAgIGZvdXJjYyA9ICJzYXdiIjsKLSAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgbWltZSkpIHsKLSAgICAgICAgZm91cmNjID0gIm1wNGEiOwotICAgIH0gZWxzZSB7CisgICAgY29uc3QgY2hhciAqZm91cmNjID0gZ2V0Rm91ckNDRm9yTWltZShtaW1lKTsKKyAgICBpZiAoZm91cmNjID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIlVua25vd24gbWltZSB0eXBlICclcycuIiwgbWltZSk7CiAgICAgICAgIENIRUNLKCEic2hvdWxkIG5vdCBiZSBoZXJlLCB1bmtub3duIG1pbWUgdHlwZS4iKTsKICAgICB9CkBAIC0zMDk5LDYgKzMxNzEsMTAzIEBACiAgICAgZW5kQm94KCk7CiB9CiAKK3ZvaWQgTVBFRzRXcml0ZXI6OndyaXRlSGRscigpIHsKKyAgICBiZWdpbkJveCgiaGRsciIpOworICAgIHdyaXRlSW50MzIoMCk7IC8vIFZlcnNpb24sIEZsYWdzCisgICAgd3JpdGVJbnQzMigwKTsgLy8gUHJlZGVmaW5lZAorICAgIHdyaXRlRm91cmNjKCJtZHRhIik7CisgICAgd3JpdGVJbnQzMigwKTsgLy8gUmVzZXJ2ZWRbMF0KKyAgICB3cml0ZUludDMyKDApOyAvLyBSZXNlcnZlZFsxXQorICAgIHdyaXRlSW50MzIoMCk7IC8vIFJlc2VydmVkWzJdCisgICAgd3JpdGVJbnQ4KDApOyAgLy8gTmFtZSAoZW1wdHkpCisgICAgZW5kQm94KCk7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OndyaXRlS2V5cygpIHsKKyAgICBzaXplX3QgY291bnQgPSBtTWV0YUtleXMtPmNvdW50RW50cmllcygpOworCisgICAgYmVnaW5Cb3goImtleXMiKTsKKyAgICB3cml0ZUludDMyKDApOyAgICAgLy8gVmVyc2lvbiwgRmxhZ3MKKyAgICB3cml0ZUludDMyKGNvdW50KTsgLy8gRW50cnlfY291bnQKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgQU1lc3NhZ2U6OlR5cGUgdHlwZTsKKyAgICAgICAgY29uc3QgY2hhciAqa2V5ID0gbU1ldGFLZXlzLT5nZXRFbnRyeU5hbWVBdChpLCAmdHlwZSk7CisgICAgICAgIHNpemVfdCBuID0gc3RybGVuKGtleSk7CisgICAgICAgIHdyaXRlSW50MzIobiArIDgpOworICAgICAgICB3cml0ZUZvdXJjYygibWR0YSIpOworICAgICAgICB3cml0ZShrZXksIG4pOyAvLyB3cml0ZSB3aXRob3V0IHRoZSBcMAorICAgIH0KKyAgICBlbmRCb3goKTsKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVJbHN0KCkgeworICAgIHNpemVfdCBjb3VudCA9IG1NZXRhS2V5cy0+Y291bnRFbnRyaWVzKCk7CisKKyAgICBiZWdpbkJveCgiaWxzdCIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBiZWdpbkJveChpICsgMSk7IC8vIGtleSBpZCAoMS1iYXNlZCkKKyAgICAgICAgYmVnaW5Cb3goImRhdGEiKTsKKyAgICAgICAgQU1lc3NhZ2U6OlR5cGUgdHlwZTsKKyAgICAgICAgY29uc3QgY2hhciAqa2V5ID0gbU1ldGFLZXlzLT5nZXRFbnRyeU5hbWVBdChpLCAmdHlwZSk7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVTdHJpbmc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVN0cmluZyB2YWw7CisgICAgICAgICAgICAgICAgQ0hFQ0sobU1ldGFLZXlzLT5maW5kU3RyaW5nKGtleSwgJnZhbCkpOworICAgICAgICAgICAgICAgIHdyaXRlSW50MzIoMSk7IC8vIHR5cGUgPSBVVEY4CisgICAgICAgICAgICAgICAgd3JpdGVJbnQzMigwKTsgLy8gZGVmYXVsdCBjb3VudHJ5L2xhbmd1YWdlCisgICAgICAgICAgICAgICAgd3JpdGUodmFsLmNfc3RyKCksIHN0cmxlbih2YWwuY19zdHIoKSkpOyAvLyB3cml0ZSB3aXRob3V0IFwwCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlRmxvYXQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxvYXQgdmFsOworICAgICAgICAgICAgICAgIENIRUNLKG1NZXRhS2V5cy0+ZmluZEZsb2F0KGtleSwgJnZhbCkpOworICAgICAgICAgICAgICAgIHdyaXRlSW50MzIoMjMpOyAvLyB0eXBlID0gZmxvYXQzMgorICAgICAgICAgICAgICAgIHdyaXRlSW50MzIoMCk7ICAvLyBkZWZhdWx0IGNvdW50cnkvbGFuZ3VhZ2UKKyAgICAgICAgICAgICAgICB3cml0ZUludDMyKCpyZWludGVycHJldF9jYXN0PGludDMyX3QgKj4oJnZhbCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUludDMyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludDMyX3QgdmFsOworICAgICAgICAgICAgICAgIENIRUNLKG1NZXRhS2V5cy0+ZmluZEludDMyKGtleSwgJnZhbCkpOworICAgICAgICAgICAgICAgIHdyaXRlSW50MzIoNjcpOyAvLyB0eXBlID0gc2lnbmVkIGludDMyCisgICAgICAgICAgICAgICAgd3JpdGVJbnQzMigwKTsgIC8vIGRlZmF1bHQgY291bnRyeS9sYW5ndWFnZQorICAgICAgICAgICAgICAgIHdyaXRlSW50MzIodmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiVW5zdXBwb3J0ZWQga2V5IHR5cGUsIHdyaXRpbmcgMCBpbnN0ZWFkIik7CisgICAgICAgICAgICAgICAgd3JpdGVJbnQzMig3Nyk7IC8vIHR5cGUgPSB1bnNpZ25lZCBpbnQzMgorICAgICAgICAgICAgICAgIHdyaXRlSW50MzIoMCk7ICAvLyBkZWZhdWx0IGNvdW50cnkvbGFuZ3VhZ2UKKyAgICAgICAgICAgICAgICB3cml0ZUludDMyKDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVuZEJveCgpOyAvLyBkYXRhCisgICAgICAgIGVuZEJveCgpOyAvLyBrZXkgaWQKKyAgICB9CisgICAgZW5kQm94KCk7IC8vIGlsc3QKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVNZXRhQm94KCkgeworICAgIHNpemVfdCBjb3VudCA9IG1NZXRhS2V5cy0+Y291bnRFbnRyaWVzKCk7CisgICAgaWYgKGNvdW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJlZ2luQm94KCJtZXRhIik7CisgICAgd3JpdGVIZGxyKCk7CisgICAgd3JpdGVLZXlzKCk7CisgICAgd3JpdGVJbHN0KCk7CisgICAgZW5kQm94KCk7Cit9CisKIC8qCiAgKiBHZW9kYXRhIGlzIHN0b3JlZCBhY2NvcmRpbmcgdG8gSVNPLTY3MDkgc3RhbmRhcmQuCiAgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ2xvY2suY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY0MWU0ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ2xvY2suY3BwCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYUNsb2NrIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNZWRpYUNsb2NrOjpNZWRpYUNsb2NrKCkKKyAgICA6IG1BbmNob3JUaW1lTWVkaWFVcygtMSksCisgICAgICBtQW5jaG9yVGltZVJlYWxVcygtMSksCisgICAgICBtTWF4VGltZU1lZGlhVXMoSU5UNjRfTUFYKSwKKyAgICAgIG1TdGFydGluZ1RpbWVNZWRpYVVzKC0xKSwKKyAgICAgIG1QbGF5YmFja1JhdGUoMS4wKSB7Cit9CisKK01lZGlhQ2xvY2s6On5NZWRpYUNsb2NrKCkgeworfQorCit2b2lkIE1lZGlhQ2xvY2s6OnNldFN0YXJ0aW5nVGltZU1lZGlhKGludDY0X3Qgc3RhcnRpbmdUaW1lTWVkaWFVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbVN0YXJ0aW5nVGltZU1lZGlhVXMgPSBzdGFydGluZ1RpbWVNZWRpYVVzOworfQorCit2b2lkIE1lZGlhQ2xvY2s6OmNsZWFyQW5jaG9yKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbUFuY2hvclRpbWVNZWRpYVVzID0gLTE7CisgICAgbUFuY2hvclRpbWVSZWFsVXMgPSAtMTsKK30KKwordm9pZCBNZWRpYUNsb2NrOjp1cGRhdGVBbmNob3IoCisgICAgICAgIGludDY0X3QgYW5jaG9yVGltZU1lZGlhVXMsCisgICAgICAgIGludDY0X3QgYW5jaG9yVGltZVJlYWxVcywKKyAgICAgICAgaW50NjRfdCBtYXhUaW1lTWVkaWFVcykgeworICAgIGlmIChhbmNob3JUaW1lTWVkaWFVcyA8IDAgfHwgYW5jaG9yVGltZVJlYWxVcyA8IDApIHsKKyAgICAgICAgQUxPR1coInJlamVjdCBhbmNob3IgdGltZSBzaW5jZSBpdCBpcyBuZWdhdGl2ZS4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgaW50NjRfdCBub3dNZWRpYVVzID0KKyAgICAgICAgYW5jaG9yVGltZU1lZGlhVXMgKyAobm93VXMgLSBhbmNob3JUaW1lUmVhbFVzKSAqIChkb3VibGUpbVBsYXliYWNrUmF0ZTsKKyAgICBpZiAobm93TWVkaWFVcyA8IDApIHsKKyAgICAgICAgQUxPR1coInJlamVjdCBhbmNob3IgdGltZSBzaW5jZSBpdCBsZWFkcyB0byBuZWdhdGl2ZSBtZWRpYSB0aW1lLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1BbmNob3JUaW1lUmVhbFVzID0gbm93VXM7CisgICAgbUFuY2hvclRpbWVNZWRpYVVzID0gbm93TWVkaWFVczsKKyAgICBtTWF4VGltZU1lZGlhVXMgPSBtYXhUaW1lTWVkaWFVczsKK30KKwordm9pZCBNZWRpYUNsb2NrOjp1cGRhdGVNYXhUaW1lTWVkaWEoaW50NjRfdCBtYXhUaW1lTWVkaWFVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbU1heFRpbWVNZWRpYVVzID0gbWF4VGltZU1lZGlhVXM7Cit9CisKK3ZvaWQgTWVkaWFDbG9jazo6c2V0UGxheWJhY2tSYXRlKGZsb2F0IHJhdGUpIHsKKyAgICBDSEVDS19HRShyYXRlLCAwLjApOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1BbmNob3JUaW1lUmVhbFVzID09IC0xKSB7CisgICAgICAgIG1QbGF5YmFja1JhdGUgPSByYXRlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgbUFuY2hvclRpbWVNZWRpYVVzICs9IChub3dVcyAtIG1BbmNob3JUaW1lUmVhbFVzKSAqIChkb3VibGUpbVBsYXliYWNrUmF0ZTsKKyAgICBpZiAobUFuY2hvclRpbWVNZWRpYVVzIDwgMCkgeworICAgICAgICBBTE9HVygic2V0UmF0ZTogYW5jaG9yIHRpbWUgc2hvdWxkIG5vdCBiZSBuZWdhdGl2ZSwgc2V0IHRvIDAuIik7CisgICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IDA7CisgICAgfQorICAgIG1BbmNob3JUaW1lUmVhbFVzID0gbm93VXM7CisgICAgbVBsYXliYWNrUmF0ZSA9IHJhdGU7Cit9CisKK2Zsb2F0IE1lZGlhQ2xvY2s6OmdldFBsYXliYWNrUmF0ZSgpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBtUGxheWJhY2tSYXRlOworfQorCitzdGF0dXNfdCBNZWRpYUNsb2NrOjpnZXRNZWRpYVRpbWUoCisgICAgICAgIGludDY0X3QgcmVhbFVzLCBpbnQ2NF90ICpvdXRNZWRpYVVzLCBib29sIGFsbG93UGFzdE1heFRpbWUpIGNvbnN0IHsKKyAgICBpZiAob3V0TWVkaWFVcyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gZ2V0TWVkaWFUaW1lX2wocmVhbFVzLCBvdXRNZWRpYVVzLCBhbGxvd1Bhc3RNYXhUaW1lKTsKK30KKworc3RhdHVzX3QgTWVkaWFDbG9jazo6Z2V0TWVkaWFUaW1lX2woCisgICAgICAgIGludDY0X3QgcmVhbFVzLCBpbnQ2NF90ICpvdXRNZWRpYVVzLCBib29sIGFsbG93UGFzdE1heFRpbWUpIGNvbnN0IHsKKyAgICBpZiAobUFuY2hvclRpbWVSZWFsVXMgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgaW50NjRfdCBtZWRpYVVzID0gbUFuY2hvclRpbWVNZWRpYVVzCisgICAgICAgICAgICArIChyZWFsVXMgLSBtQW5jaG9yVGltZVJlYWxVcykgKiAoZG91YmxlKW1QbGF5YmFja1JhdGU7CisgICAgaWYgKG1lZGlhVXMgPiBtTWF4VGltZU1lZGlhVXMgJiYgIWFsbG93UGFzdE1heFRpbWUpIHsKKyAgICAgICAgbWVkaWFVcyA9IG1NYXhUaW1lTWVkaWFVczsKKyAgICB9CisgICAgaWYgKG1lZGlhVXMgPCBtU3RhcnRpbmdUaW1lTWVkaWFVcykgeworICAgICAgICBtZWRpYVVzID0gbVN0YXJ0aW5nVGltZU1lZGlhVXM7CisgICAgfQorICAgIGlmIChtZWRpYVVzIDwgMCkgeworICAgICAgICBtZWRpYVVzID0gMDsKKyAgICB9CisgICAgKm91dE1lZGlhVXMgPSBtZWRpYVVzOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWVkaWFDbG9jazo6Z2V0UmVhbFRpbWVGb3IoCisgICAgICAgIGludDY0X3QgdGFyZ2V0TWVkaWFVcywgaW50NjRfdCAqb3V0UmVhbFVzKSBjb25zdCB7CisgICAgaWYgKG91dFJlYWxVcyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobVBsYXliYWNrUmF0ZSA9PSAwLjApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgaW50NjRfdCBub3dNZWRpYVVzOworICAgIHN0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBnZXRNZWRpYVRpbWVfbChub3dVcywgJm5vd01lZGlhVXMsIHRydWUgLyogYWxsb3dQYXN0TWF4VGltZSAqLyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICAqb3V0UmVhbFVzID0gKHRhcmdldE1lZGlhVXMgLSBub3dNZWRpYVVzKSAvIChkb3VibGUpbVBsYXliYWNrUmF0ZSArIG5vd1VzOworICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKaW5kZXggNmNhMTIzYS4uY2Q1OTcwOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKQEAgLTIxLDEwICsyMSwxNSBAQAogI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmgiCiAKLSNpbmNsdWRlIDxiaW5kZXIvSUJhdHRlcnlTdGF0cy5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDxndWkvQnVmZmVyUXVldWUuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CisjaW5jbHVkZSA8bWVkaWEvSVJlc291cmNlTWFuYWdlclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KQEAgLTM2LDg1ICs0MSwxMzEgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFGaWx0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L05hdGl2ZVdpbmRvd1dyYXBwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1BlcnNpc3RlbnRTdXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9CYXR0ZXJ5Tm90aWZpZXIuaD4KICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TaW5nbGV0b24uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgTWVkaWFDb2RlYzo6QmF0dGVyeU5vdGlmaWVyIDogcHVibGljIFNpbmdsZXRvbjxCYXR0ZXJ5Tm90aWZpZXI+IHsKLSAgICBCYXR0ZXJ5Tm90aWZpZXIoKTsKK3N0YXRpYyBpbnQ2NF90IGdldElkKHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudCkgeworICAgIHJldHVybiAoaW50NjRfdCkgY2xpZW50LmdldCgpOworfQogCi0gICAgdm9pZCBub3RlU3RhcnRWaWRlbygpOwotICAgIHZvaWQgbm90ZVN0b3BWaWRlbygpOwotICAgIHZvaWQgbm90ZVN0YXJ0QXVkaW8oKTsKLSAgICB2b2lkIG5vdGVTdG9wQXVkaW8oKTsKK3N0YXRpYyBib29sIGlzUmVzb3VyY2VFcnJvcihzdGF0dXNfdCBlcnIpIHsKKyAgICByZXR1cm4gKGVyciA9PSBOT19NRU1PUlkpOworfQorCitzdGF0aWMgY29uc3QgaW50IGtNYXhSZXRyeSA9IDI7CisKK3N0cnVjdCBSZXNvdXJjZU1hbmFnZXJDbGllbnQgOiBwdWJsaWMgQm5SZXNvdXJjZU1hbmFnZXJDbGllbnQgeworICAgIFJlc291cmNlTWFuYWdlckNsaWVudChNZWRpYUNvZGVjKiBjb2RlYykgOiBtTWVkaWFDb2RlYyhjb2RlYykge30KKworICAgIHZpcnR1YWwgYm9vbCByZWNsYWltUmVzb3VyY2UoKSB7CisgICAgICAgIHNwPE1lZGlhQ29kZWM+IGNvZGVjID0gbU1lZGlhQ29kZWMucHJvbW90ZSgpOworICAgICAgICBpZiAoY29kZWMgPT0gTlVMTCkgeworICAgICAgICAgICAgLy8gY29kZWMgaXMgYWxyZWFkeSBnb25lLgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3QgZXJyID0gY29kZWMtPnJlY2xhaW0oKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coIlJlc291cmNlTWFuYWdlckNsaWVudCBmYWlsZWQgdG8gcmVsZWFzZSBjb2RlYyB3aXRoIGVyciAlZCIsIGVycik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChlcnIgPT0gT0spOworICAgIH0KKworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXROYW1lKCkgeworICAgICAgICBTdHJpbmc4IHJldDsKKyAgICAgICAgc3A8TWVkaWFDb2RlYz4gY29kZWMgPSBtTWVkaWFDb2RlYy5wcm9tb3RlKCk7CisgICAgICAgIGlmIChjb2RlYyA9PSBOVUxMKSB7CisgICAgICAgICAgICAvLyBjb2RlYyBpcyBhbHJlYWR5IGdvbmUuCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgQVN0cmluZyBuYW1lOworICAgICAgICBpZiAoY29kZWMtPmdldE5hbWUoJm5hbWUpID09IE9LKSB7CisgICAgICAgICAgICByZXQuc2V0VG8obmFtZS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflJlc291cmNlTWFuYWdlckNsaWVudCgpIHt9CiAKIHByaXZhdGU6Ci0gICAgaW50MzJfdCBtVmlkZW9SZWZDb3VudDsKLSAgICBpbnQzMl90IG1BdWRpb1JlZkNvdW50OwotICAgIHNwPElCYXR0ZXJ5U3RhdHM+IG1CYXR0ZXJ5U3RhdFNlcnZpY2U7CisgICAgd3A8TWVkaWFDb2RlYz4gbU1lZGlhQ29kZWM7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZXNvdXJjZU1hbmFnZXJDbGllbnQpOwogfTsKIAotQU5EUk9JRF9TSU5HTEVUT05fU1RBVElDX0lOU1RBTkNFKE1lZGlhQ29kZWM6OkJhdHRlcnlOb3RpZmllcikKLQotTWVkaWFDb2RlYzo6QmF0dGVyeU5vdGlmaWVyOjpCYXR0ZXJ5Tm90aWZpZXIoKSA6Ci0gICAgbVZpZGVvUmVmQ291bnQoMCksCi0gICAgbUF1ZGlvUmVmQ291bnQoMCkgewotICAgIC8vIGdldCBiYXR0ZXJ5IHNlcnZpY2UKLSAgICBjb25zdCBzcDxJU2VydmljZU1hbmFnZXI+IHNtKGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpKTsKLSAgICBpZiAoc20gIT0gTlVMTCkgewotICAgICAgICBjb25zdCBTdHJpbmcxNiBuYW1lKCJiYXR0ZXJ5c3RhdHMiKTsKLSAgICAgICAgbUJhdHRlcnlTdGF0U2VydmljZSA9IGludGVyZmFjZV9jYXN0PElCYXR0ZXJ5U3RhdHM+KHNtLT5nZXRTZXJ2aWNlKG5hbWUpKTsKLSAgICAgICAgaWYgKG1CYXR0ZXJ5U3RhdFNlcnZpY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoImJhdHRlcnlzdGF0cyBzZXJ2aWNlIHVuYXZhaWxhYmxlISIpOwotICAgICAgICB9CitNZWRpYUNvZGVjOjpSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJveHk6OlJlc291cmNlTWFuYWdlclNlcnZpY2VQcm94eShwaWRfdCBwaWQpCisgICAgICAgIDogbVBpZChwaWQpIHsKKyAgICBpZiAobVBpZCA9PSBNZWRpYUNvZGVjOjprTm9QaWQpIHsKKyAgICAgICAgbVBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICB9CiB9CiAKLXZvaWQgTWVkaWFDb2RlYzo6QmF0dGVyeU5vdGlmaWVyOjpub3RlU3RhcnRWaWRlbygpIHsKLSAgICBpZiAobVZpZGVvUmVmQ291bnQgPT0gMCAmJiBtQmF0dGVyeVN0YXRTZXJ2aWNlICE9IE5VTEwpIHsKLSAgICAgICAgbUJhdHRlcnlTdGF0U2VydmljZS0+bm90ZVN0YXJ0VmlkZW8oQUlEX01FRElBKTsKK01lZGlhQ29kZWM6OlJlc291cmNlTWFuYWdlclNlcnZpY2VQcm94eTo6flJlc291cmNlTWFuYWdlclNlcnZpY2VQcm94eSgpIHsKKyAgICBpZiAobVNlcnZpY2UgIT0gTlVMTCkgeworICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtU2VydmljZSktPnVubGlua1RvRGVhdGgodGhpcyk7CiAgICAgfQotICAgIG1WaWRlb1JlZkNvdW50Kys7CiB9CiAKLXZvaWQgTWVkaWFDb2RlYzo6QmF0dGVyeU5vdGlmaWVyOjpub3RlU3RvcFZpZGVvKCkgewotICAgIGlmIChtVmlkZW9SZWZDb3VudCA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJCYXR0ZXJ5Tm90aWZpZXI6Om5vdGVTdG9wKCk6IHZpZGVvIHJlZmNvdW50IGlzIGJyb2tlbiEiKTsKK3ZvaWQgTWVkaWFDb2RlYzo6UmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3h5Ojppbml0KCkgeworICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBzbS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEucmVzb3VyY2VfbWFuYWdlciIpKTsKKyAgICBtU2VydmljZSA9IGludGVyZmFjZV9jYXN0PElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPihiaW5kZXIpOworICAgIGlmIChtU2VydmljZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IFJlc291cmNlTWFuYWdlclNlcnZpY2UiKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLQotICAgIG1WaWRlb1JlZkNvdW50LS07Ci0gICAgaWYgKG1WaWRlb1JlZkNvdW50ID09IDAgJiYgbUJhdHRlcnlTdGF0U2VydmljZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1CYXR0ZXJ5U3RhdFNlcnZpY2UtPm5vdGVTdG9wVmlkZW8oQUlEX01FRElBKTsKLSAgICB9CisgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobVNlcnZpY2UpLT5saW5rVG9EZWF0aCh0aGlzKTsKIH0KIAotdm9pZCBNZWRpYUNvZGVjOjpCYXR0ZXJ5Tm90aWZpZXI6Om5vdGVTdGFydEF1ZGlvKCkgewotICAgIGlmIChtQXVkaW9SZWZDb3VudCA9PSAwICYmIG1CYXR0ZXJ5U3RhdFNlcnZpY2UgIT0gTlVMTCkgewotICAgICAgICBtQmF0dGVyeVN0YXRTZXJ2aWNlLT5ub3RlU3RhcnRBdWRpbyhBSURfTUVESUEpOwotICAgIH0KLSAgICBtQXVkaW9SZWZDb3VudCsrOwordm9pZCBNZWRpYUNvZGVjOjpSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJveHk6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIC8qd2hvKi8pIHsKKyAgICBBTE9HVygiUmVzb3VyY2VNYW5hZ2VyU2VydmljZSBkaWVkLiIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbVNlcnZpY2UuY2xlYXIoKTsKIH0KIAotdm9pZCBNZWRpYUNvZGVjOjpCYXR0ZXJ5Tm90aWZpZXI6Om5vdGVTdG9wQXVkaW8oKSB7Ci0gICAgaWYgKG1BdWRpb1JlZkNvdW50ID09IDApIHsKLSAgICAgICAgQUxPR1coIkJhdHRlcnlOb3RpZmllcjo6bm90ZVN0b3AoKTogYXVkaW8gcmVmY291bnQgaXMgYnJva2VuISIpOwordm9pZCBNZWRpYUNvZGVjOjpSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJveHk6OmFkZFJlc291cmNlKAorICAgICAgICBpbnQ2NF90IGNsaWVudElkLAorICAgICAgICBjb25zdCBzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBjbGllbnQsCisgICAgICAgIGNvbnN0IFZlY3RvcjxNZWRpYVJlc291cmNlPiAmcmVzb3VyY2VzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVNlcnZpY2UgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQotCi0gICAgbUF1ZGlvUmVmQ291bnQtLTsKLSAgICBpZiAobUF1ZGlvUmVmQ291bnQgPT0gMCAmJiBtQmF0dGVyeVN0YXRTZXJ2aWNlICE9IE5VTEwpIHsKLSAgICAgICAgbUJhdHRlcnlTdGF0U2VydmljZS0+bm90ZVN0b3BBdWRpbyhBSURfTUVESUEpOwotICAgIH0KKyAgICBtU2VydmljZS0+YWRkUmVzb3VyY2UobVBpZCwgY2xpZW50SWQsIGNsaWVudCwgcmVzb3VyY2VzKTsKIH0KKwordm9pZCBNZWRpYUNvZGVjOjpSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJveHk6OnJlbW92ZVJlc291cmNlKGludDY0X3QgY2xpZW50SWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtU2VydmljZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVNlcnZpY2UtPnJlbW92ZVJlc291cmNlKG1QaWQsIGNsaWVudElkKTsKK30KKworYm9vbCBNZWRpYUNvZGVjOjpSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJveHk6OnJlY2xhaW1SZXNvdXJjZSgKKyAgICAgICAgY29uc3QgVmVjdG9yPE1lZGlhUmVzb3VyY2U+ICZyZXNvdXJjZXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtU2VydmljZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2UobVBpZCwgcmVzb3VyY2VzKTsKK30KKwogLy8gc3RhdGljCiBzcDxNZWRpYUNvZGVjPiBNZWRpYUNvZGVjOjpDcmVhdGVCeVR5cGUoCi0gICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IGNoYXIgKm1pbWUsIGJvb2wgZW5jb2Rlciwgc3RhdHVzX3QgKmVycikgewotICAgIHNwPE1lZGlhQ29kZWM+IGNvZGVjID0gbmV3IE1lZGlhQ29kZWMobG9vcGVyKTsKKyAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwgY29uc3QgY2hhciAqbWltZSwgYm9vbCBlbmNvZGVyLCBzdGF0dXNfdCAqZXJyLCBwaWRfdCBwaWQpIHsKKyAgICBzcDxNZWRpYUNvZGVjPiBjb2RlYyA9IG5ldyBNZWRpYUNvZGVjKGxvb3BlciwgcGlkKTsKIAogICAgIGNvbnN0IHN0YXR1c190IHJldCA9IGNvZGVjLT5pbml0KG1pbWUsIHRydWUgLyogbmFtZUlzVHlwZSAqLywgZW5jb2Rlcik7CiAgICAgaWYgKGVyciAhPSBOVUxMKSB7CkBAIC0xMjUsOCArMTc2LDggQEAKIAogLy8gc3RhdGljCiBzcDxNZWRpYUNvZGVjPiBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUoCi0gICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IGNoYXIgKm5hbWUsIHN0YXR1c190ICplcnIpIHsKLSAgICBzcDxNZWRpYUNvZGVjPiBjb2RlYyA9IG5ldyBNZWRpYUNvZGVjKGxvb3Blcik7CisgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IGNoYXIgKm5hbWUsIHN0YXR1c190ICplcnIsIHBpZF90IHBpZCkgeworICAgIHNwPE1lZGlhQ29kZWM+IGNvZGVjID0gbmV3IE1lZGlhQ29kZWMobG9vcGVyLCBwaWQpOwogCiAgICAgY29uc3Qgc3RhdHVzX3QgcmV0ID0gY29kZWMtPmluaXQobmFtZSwgZmFsc2UgLyogbmFtZUlzVHlwZSAqLywgZmFsc2UgLyogZW5jb2RlciAqLyk7CiAgICAgaWYgKGVyciAhPSBOVUxMKSB7CkBAIC0xMzUsMjUgKzE4Niw4MiBAQAogICAgIHJldHVybiByZXQgPT0gT0sgPyBjb2RlYyA6IE5VTEw7IC8vIE5VTEwgZGVhbGxvY2F0ZXMgY29kZWMuCiB9CiAKLU1lZGlhQ29kZWM6Ok1lZGlhQ29kZWMoY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlcikKKy8vIHN0YXRpYworc3A8UGVyc2lzdGVudFN1cmZhY2U+IE1lZGlhQ29kZWM6OkNyZWF0ZVBlcnNpc3RlbnRJbnB1dFN1cmZhY2UoKSB7CisgICAgT01YQ2xpZW50IGNsaWVudDsKKyAgICBDSEVDS19FUShjbGllbnQuY29ubmVjdCgpLCAoc3RhdHVzX3QpT0spOworICAgIHNwPElPTVg+IG9teCA9IGNsaWVudC5pbnRlcmZhY2UoKTsKKworICAgIGNvbnN0IHNwPElNZWRpYUNvZGVjTGlzdD4gbWVkaWFDb2RlY0xpc3QgPSBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKTsKKyAgICBpZiAobWVkaWFDb2RlY0xpc3QgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9idGFpbiBNZWRpYUNvZGVjTGlzdCEiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8vIGlmIGNhbGxlZCBmcm9tIEphdmEgc2hvdWxkIHJhaXNlIElPRXhjZXB0aW9uCisgICAgfQorCisgICAgQVN0cmluZyB0bXA7CisgICAgc3A8QU1lc3NhZ2U+IGdsb2JhbFNldHRpbmdzID0gbWVkaWFDb2RlY0xpc3QtPmdldEdsb2JhbFNldHRpbmdzKCk7CisgICAgaWYgKGdsb2JhbFNldHRpbmdzID09IE5VTEwgfHwgIWdsb2JhbFNldHRpbmdzLT5maW5kU3RyaW5nKAorICAgICAgICAgICAga01heEVuY29kZXJJbnB1dEJ1ZmZlcnMsICZ0bXApKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGVuY29kZXIgaW5wdXQgYnVmZmVyIGNvdW50ISIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpbnQzMl90IGJ1ZmZlckNvdW50ID0gc3RydG9sKHRtcC5jX3N0cigpLCBOVUxMLCAxMCk7CisgICAgaWYgKGJ1ZmZlckNvdW50IDw9IDAKKyAgICAgICAgICAgIHx8IGJ1ZmZlckNvdW50ID4gQnVmZmVyUXVldWU6Ok1BWF9NQVhfQUNRVUlSRURfQlVGRkVSUykgeworICAgICAgICBBTE9HRSgiRW5jb2RlciBpbnB1dCBidWZmZXIgY291bnQgaXMgaW52YWxpZCEiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gYnVmZmVyUHJvZHVjZXI7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gYnVmZmVyQ29uc3VtZXI7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBvbXgtPmNyZWF0ZVBlcnNpc3RlbnRJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICAmYnVmZmVyUHJvZHVjZXIsICZidWZmZXJDb25zdW1lcik7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIHBlcnNpc3RlbnQgaW5wdXQgc3VyZmFjZS4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZXJyID0gYnVmZmVyQ29uc3VtZXItPnNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQoYnVmZmVyQ291bnQpOworCisgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBCUSBtYXggYWNxdWlyZWQgYnVmZmVyIGNvdW50IHRvICV1OiAlZCIsCisgICAgICAgICAgICAgICAgYnVmZmVyQ291bnQsIGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBuZXcgUGVyc2lzdGVudFN1cmZhY2UoYnVmZmVyUHJvZHVjZXIsIGJ1ZmZlckNvbnN1bWVyKTsKK30KKworTWVkaWFDb2RlYzo6TWVkaWFDb2RlYyhjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLCBwaWRfdCBwaWQpCiAgICAgOiBtU3RhdGUoVU5JTklUSUFMSVpFRCksCisgICAgICBtUmVsZWFzZWRCeVJlc291cmNlTWFuYWdlcihmYWxzZSksCiAgICAgICBtTG9vcGVyKGxvb3BlciksCiAgICAgICBtQ29kZWMoTlVMTCksCiAgICAgICBtUmVwbHlJRCgwKSwKICAgICAgIG1GbGFncygwKSwKICAgICAgIG1TdGlja3lFcnJvcihPSyksCiAgICAgICBtU29mdFJlbmRlcmVyKE5VTEwpLAorICAgICAgbVJlc291cmNlTWFuYWdlckNsaWVudChuZXcgUmVzb3VyY2VNYW5hZ2VyQ2xpZW50KHRoaXMpKSwKKyAgICAgIG1SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlKG5ldyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJveHkocGlkKSksCiAgICAgICBtQmF0dGVyeVN0YXROb3RpZmllZChmYWxzZSksCiAgICAgICBtSXNWaWRlbyhmYWxzZSksCisgICAgICBtVmlkZW9XaWR0aCgwKSwKKyAgICAgIG1WaWRlb0hlaWdodCgwKSwKKyAgICAgIG1Sb3RhdGlvbkRlZ3JlZXMoMCksCiAgICAgICBtRGVxdWV1ZUlucHV0VGltZW91dEdlbmVyYXRpb24oMCksCiAgICAgICBtRGVxdWV1ZUlucHV0UmVwbHlJRCgwKSwKICAgICAgIG1EZXF1ZXVlT3V0cHV0VGltZW91dEdlbmVyYXRpb24oMCksCiAgICAgICBtRGVxdWV1ZU91dHB1dFJlcGx5SUQoMCksCi0gICAgICBtSGF2ZUlucHV0U3VyZmFjZShmYWxzZSkgeworICAgICAgbUhhdmVJbnB1dFN1cmZhY2UoZmFsc2UpLAorICAgICAgbUhhdmVQZW5kaW5nSW5wdXRCdWZmZXJzKGZhbHNlKSB7CiB9CiAKIE1lZGlhQ29kZWM6On5NZWRpYUNvZGVjKCkgewogICAgIENIRUNLX0VRKG1TdGF0ZSwgVU5JTklUSUFMSVpFRCk7CisgICAgbVJlc291cmNlTWFuYWdlclNlcnZpY2UtPnJlbW92ZVJlc291cmNlKGdldElkKG1SZXNvdXJjZU1hbmFnZXJDbGllbnQpKTsKIH0KIAogLy8gc3RhdGljCkBAIC0xNzIsMTQgKzI4MCwyMSBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKLS8vIHN0YXRpYwotdm9pZCBNZWRpYUNvZGVjOjpQb3N0UmVwbHlXaXRoRXJyb3IoaW50MzJfdCByZXBseUlELCBpbnQzMl90IGVycikgewordm9pZCBNZWRpYUNvZGVjOjpQb3N0UmVwbHlXaXRoRXJyb3IoY29uc3Qgc3A8QVJlcGx5VG9rZW4+ICZyZXBseUlELCBpbnQzMl90IGVycikgeworICAgIGludDMyX3QgZmluYWxFcnIgPSBlcnI7CisgICAgaWYgKG1SZWxlYXNlZEJ5UmVzb3VyY2VNYW5hZ2VyKSB7CisgICAgICAgIC8vIG92ZXJyaWRlIHRoZSBlcnIgY29kZSBpZiBNZWRpYUNvZGVjIGhhcyBiZWVuIHJlbGVhc2VkIGJ5IFJlc291cmNlTWFuYWdlci4KKyAgICAgICAgZmluYWxFcnIgPSBERUFEX09CSkVDVDsKKyAgICB9CisKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZmluYWxFcnIpOwogICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CiB9CiAKIHN0YXR1c190IE1lZGlhQ29kZWM6OmluaXQoY29uc3QgQVN0cmluZyAmbmFtZSwgYm9vbCBuYW1lSXNUeXBlLCBib29sIGVuY29kZXIpIHsKKyAgICBtUmVzb3VyY2VNYW5hZ2VyU2VydmljZS0+aW5pdCgpOworCiAgICAgLy8gc2F2ZSBpbml0IHBhcmFtZXRlcnMgZm9yIHJlc2V0CiAgICAgbUluaXROYW1lID0gbmFtZTsKICAgICBtSW5pdE5hbWVJc1R5cGUgPSBuYW1lSXNUeXBlOwpAQCAtMTg5LDE2ICszMDQsMzAgQEAKICAgICAvLyBxdWlja2x5LCB2aW9sYXRpbmcgdGhlIE9wZW5NQVggc3BlY3MsIHVudGlsIHRoYXQgaXMgcmVtZWRpZWQKICAgICAvLyB3ZSBuZWVkIHRvIGludmVzdCBpbiBhbiBleHRyYSBsb29wZXIgdG8gZnJlZSB0aGUgbWFpbiBldmVudAogICAgIC8vIHF1ZXVlLgotICAgIG1Db2RlYyA9IG5ldyBBQ29kZWM7Ci0gICAgYm9vbCBuZWVkRGVkaWNhdGVkTG9vcGVyID0gZmFsc2U7CisKKyAgICBpZiAobmFtZUlzVHlwZSB8fCAhc3RybmNhc2VjbXAobmFtZS5jX3N0cigpLCAib214LiIsIDQpKSB7CisgICAgICAgIG1Db2RlYyA9IG5ldyBBQ29kZWM7CisgICAgfSBlbHNlIGlmICghbmFtZUlzVHlwZQorICAgICAgICAgICAgJiYgIXN0cm5jYXNlY21wKG5hbWUuY19zdHIoKSwgImFuZHJvaWQuZmlsdGVyLiIsIDE1KSkgeworICAgICAgICBtQ29kZWMgPSBuZXcgTWVkaWFGaWx0ZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIH0KKworICAgIGJvb2wgc2VjdXJlQ29kZWMgPSBmYWxzZTsKICAgICBpZiAobmFtZUlzVHlwZSAmJiAhc3RybmNhc2VjbXAobmFtZS5jX3N0cigpLCAidmlkZW8vIiwgNikpIHsKLSAgICAgICAgbmVlZERlZGljYXRlZExvb3BlciA9IHRydWU7CisgICAgICAgIG1Jc1ZpZGVvID0gdHJ1ZTsKICAgICB9IGVsc2UgewogICAgICAgICBBU3RyaW5nIHRtcCA9IG5hbWU7CiAgICAgICAgIGlmICh0bXAuZW5kc1dpdGgoIi5zZWN1cmUiKSkgeworICAgICAgICAgICAgc2VjdXJlQ29kZWMgPSB0cnVlOwogICAgICAgICAgICAgdG1wLmVyYXNlKHRtcC5zaXplKCkgLSA3LCA3KTsKICAgICAgICAgfQogICAgICAgICBjb25zdCBzcDxJTWVkaWFDb2RlY0xpc3Q+IG1jbCA9IE1lZGlhQ29kZWNMaXN0OjpnZXRJbnN0YW5jZSgpOworICAgICAgICBpZiAobWNsID09IE5VTEwpIHsKKyAgICAgICAgICAgIG1Db2RlYyA9IE5VTEw7ICAvLyByZW1vdmUgdGhlIGNvZGVjLgorICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7IC8vIGlmIGNhbGxlZCBmcm9tIEphdmEgc2hvdWxkIHJhaXNlIElPRXhjZXB0aW9uCisgICAgICAgIH0KICAgICAgICAgc3NpemVfdCBjb2RlY0lkeCA9IG1jbC0+ZmluZENvZGVjQnlOYW1lKHRtcC5jX3N0cigpKTsKICAgICAgICAgaWYgKGNvZGVjSWR4ID49IDApIHsKICAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gbWNsLT5nZXRDb2RlY0luZm8oY29kZWNJZHgpOwpAQCAtMjA2LDE0ICszMzUsMTUgQEAKICAgICAgICAgICAgIGluZm8tPmdldFN1cHBvcnRlZE1pbWVzKCZtaW1lcyk7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1pbWVzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1pbWVzW2ldLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5lZWREZWRpY2F0ZWRMb29wZXIgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtSXNWaWRlbyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChuZWVkRGVkaWNhdGVkTG9vcGVyKSB7CisgICAgaWYgKG1Jc1ZpZGVvKSB7CisgICAgICAgIC8vIHZpZGVvIGNvZGVjIG5lZWRzIGRlZGljYXRlZCBsb29wZXIKICAgICAgICAgaWYgKG1Db2RlY0xvb3BlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICBtQ29kZWNMb29wZXIgPSBuZXcgQUxvb3BlcjsKICAgICAgICAgICAgIG1Db2RlY0xvb3Blci0+c2V0TmFtZSgiQ29kZWNMb29wZXIiKTsKQEAgLTIyNyw5ICszNTcsOSBAQAogCiAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOwogCi0gICAgbUNvZGVjLT5zZXROb3RpZmljYXRpb25NZXNzYWdlKG5ldyBBTWVzc2FnZShrV2hhdENvZGVjTm90aWZ5LCBpZCgpKSk7CisgICAgbUNvZGVjLT5zZXROb3RpZmljYXRpb25NZXNzYWdlKG5ldyBBTWVzc2FnZShrV2hhdENvZGVjTm90aWZ5LCB0aGlzKSk7CiAKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0SW5pdCwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEluaXQsIHRoaXMpOwogICAgIG1zZy0+c2V0U3RyaW5nKCJuYW1lIiwgbmFtZSk7CiAgICAgbXNnLT5zZXRJbnQzMigibmFtZUlzVHlwZSIsIG5hbWVJc1R5cGUpOwogCkBAIC0yMzcsNTggKzM2NywxMjQgQEAKICAgICAgICAgbXNnLT5zZXRJbnQzMigiZW5jb2RlciIsIGVuY29kZXIpOwogICAgIH0KIAotICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKLSAgICByZXR1cm4gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOworICAgIHN0YXR1c190IGVycjsKKyAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gcmVzb3VyY2VzOworICAgIGNvbnN0IGNoYXIgKnR5cGUgPSBzZWN1cmVDb2RlYyA/IGtSZXNvdXJjZVNlY3VyZUNvZGVjIDoga1Jlc291cmNlTm9uU2VjdXJlQ29kZWM7CisgICAgY29uc3QgY2hhciAqc3VidHlwZSA9IG1Jc1ZpZGVvID8ga1Jlc291cmNlVmlkZW9Db2RlYyA6IGtSZXNvdXJjZUF1ZGlvQ29kZWM7CisgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKFN0cmluZzgodHlwZSksIFN0cmluZzgoc3VidHlwZSksIDEpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8PSBrTWF4UmV0cnk7ICsraSkgeworICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgIC8vIERvbid0IHRyeSB0byByZWNsYWltIHJlc291cmNlIGZvciB0aGUgZmlyc3QgdGltZS4KKyAgICAgICAgICAgIGlmICghbVJlc291cmNlTWFuYWdlclNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShyZXNvdXJjZXMpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgICAgIGVyciA9IFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKKyAgICAgICAgaWYgKCFpc1Jlc291cmNlRXJyb3IoZXJyKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlYzo6c2V0Q2FsbGJhY2soY29uc3Qgc3A8QU1lc3NhZ2U+ICZjYWxsYmFjaykgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRDYWxsYmFjaywgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldENhbGxiYWNrLCB0aGlzKTsKICAgICBtc2ctPnNldE1lc3NhZ2UoImNhbGxiYWNrIiwgY2FsbGJhY2spOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwogICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7CiB9CiAKK3N0YXR1c190IE1lZGlhQ29kZWM6OnNldE9uRnJhbWVSZW5kZXJlZE5vdGlmaWNhdGlvbihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXROb3RpZmljYXRpb24sIHRoaXMpOworICAgIG1zZy0+c2V0TWVzc2FnZSgib24tZnJhbWUtcmVuZGVyZWQiLCBub3RpZnkpOworICAgIHJldHVybiBtc2ctPnBvc3QoKTsKK30KKwogc3RhdHVzX3QgTWVkaWFDb2RlYzo6Y29uZmlndXJlKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKLSAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJm5hdGl2ZVdpbmRvdywKKyAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsCiAgICAgICAgIGNvbnN0IHNwPElDcnlwdG8+ICZjcnlwdG8sCiAgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbmZpZ3VyZSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbmZpZ3VyZSwgdGhpcyk7CisKKyAgICBpZiAobUlzVmlkZW8pIHsKKyAgICAgICAgZm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJm1WaWRlb1dpZHRoKTsKKyAgICAgICAgZm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZtVmlkZW9IZWlnaHQpOworICAgICAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKCJyb3RhdGlvbi1kZWdyZWVzIiwgJm1Sb3RhdGlvbkRlZ3JlZXMpKSB7CisgICAgICAgICAgICBtUm90YXRpb25EZWdyZWVzID0gMDsKKyAgICAgICAgfQorICAgIH0KIAogICAgIG1zZy0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKICAgICBtc2ctPnNldEludDMyKCJmbGFncyIsIGZsYWdzKTsKLQotICAgIGlmIChuYXRpdmVXaW5kb3cgIT0gTlVMTCkgewotICAgICAgICBtc2ctPnNldE9iamVjdCgKLSAgICAgICAgICAgICAgICAibmF0aXZlLXdpbmRvdyIsCi0gICAgICAgICAgICAgICAgbmV3IE5hdGl2ZVdpbmRvd1dyYXBwZXIobmF0aXZlV2luZG93KSk7Ci0gICAgfQorICAgIG1zZy0+c2V0T2JqZWN0KCJzdXJmYWNlIiwgc3VyZmFjZSk7CiAKICAgICBpZiAoY3J5cHRvICE9IE5VTEwpIHsKICAgICAgICAgbXNnLT5zZXRQb2ludGVyKCJjcnlwdG8iLCBjcnlwdG8uZ2V0KCkpOwogICAgIH0KIAotICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKLSAgICBzdGF0dXNfdCBlcnIgPSBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7CisgICAgLy8gc2F2ZSBtc2cgZm9yIHJlc2V0CisgICAgbUNvbmZpZ3VyZU1zZyA9IG1zZzsKIAotICAgIGlmIChlcnIgIT0gT0sgJiYgZXJyICE9IElOVkFMSURfT1BFUkFUSU9OKSB7Ci0gICAgICAgIC8vIE1lZGlhQ29kZWMgbm93IHNldCBzdGF0ZSB0byBVTklOSVRJQUxJWkVEIHVwb24gYW55IGZhdGFsIGVycm9yLgotICAgICAgICAvLyBUbyBtYWludGFpbiBiYWNrd2FyZC1jb21wYXRpYmlsaXR5LCBkbyBhIHJlc2V0KCkgdG8gcHV0IGNvZGVjCi0gICAgICAgIC8vIGJhY2sgaW50byBJTklUSUFMSVpFRCBzdGF0ZS4KLSAgICAgICAgLy8gQnV0IGRvbid0IHJlc2V0IGlmIHRoZSBlcnIgaXMgSU5WQUxJRF9PUEVSQVRJT04sIHdoaWNoIG1lYW5zCi0gICAgICAgIC8vIHRoZSBjb25maWd1cmUgZmFpbHVyZSBpcyBkdWUgdG8gd3Jvbmcgc3RhdGUuCisgICAgc3RhdHVzX3QgZXJyOworICAgIFZlY3RvcjxNZWRpYVJlc291cmNlPiByZXNvdXJjZXM7CisgICAgY29uc3QgY2hhciAqdHlwZSA9IChtRmxhZ3MgJiBrRmxhZ0lzU2VjdXJlKSA/CisgICAgICAgICAgICBrUmVzb3VyY2VTZWN1cmVDb2RlYyA6IGtSZXNvdXJjZU5vblNlY3VyZUNvZGVjOworICAgIGNvbnN0IGNoYXIgKnN1YnR5cGUgPSBtSXNWaWRlbyA/IGtSZXNvdXJjZVZpZGVvQ29kZWMgOiBrUmVzb3VyY2VBdWRpb0NvZGVjOworICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShTdHJpbmc4KHR5cGUpLCBTdHJpbmc4KHN1YnR5cGUpLCAxKSk7CisgICAgLy8gRG9uJ3Qga25vdyB0aGUgYnVmZmVyIHNpemUgYXQgdGhpcyBwb2ludCwgYnV0IGl0J3MgZmluZSB0byB1c2UgMSBiZWNhdXNlCisgICAgLy8gdGhlIHJlY2xhaW1SZXNvdXJjZSBjYWxsIGRvZXNuJ3QgY29uc2lkZXIgdGhlIHJlcXVlc3RlcidzIGJ1ZmZlciBzaXplIGZvciBub3cuCisgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKFN0cmluZzgoa1Jlc291cmNlR3JhcGhpY01lbW9yeSksIDEpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8PSBrTWF4UmV0cnk7ICsraSkgeworICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgIC8vIERvbid0IHRyeSB0byByZWNsYWltIHJlc291cmNlIGZvciB0aGUgZmlyc3QgdGltZS4KKyAgICAgICAgICAgIGlmICghbVJlc291cmNlTWFuYWdlclNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShyZXNvdXJjZXMpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotICAgICAgICBBTE9HRSgiY29uZmlndXJlIGZhaWxlZCB3aXRoIGVyciAweCUwOHgsIHJlc2V0dGluZy4uLiIsIGVycik7Ci0gICAgICAgIHJlc2V0KCk7CisgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICAgICAgZXJyID0gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOworICAgICAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSBJTlZBTElEX09QRVJBVElPTikgeworICAgICAgICAgICAgLy8gTWVkaWFDb2RlYyBub3cgc2V0IHN0YXRlIHRvIFVOSU5JVElBTElaRUQgdXBvbiBhbnkgZmF0YWwgZXJyb3IuCisgICAgICAgICAgICAvLyBUbyBtYWludGFpbiBiYWNrd2FyZC1jb21wYXRpYmlsaXR5LCBkbyBhIHJlc2V0KCkgdG8gcHV0IGNvZGVjCisgICAgICAgICAgICAvLyBiYWNrIGludG8gSU5JVElBTElaRUQgc3RhdGUuCisgICAgICAgICAgICAvLyBCdXQgZG9uJ3QgcmVzZXQgaWYgdGhlIGVyciBpcyBJTlZBTElEX09QRVJBVElPTiwgd2hpY2ggbWVhbnMKKyAgICAgICAgICAgIC8vIHRoZSBjb25maWd1cmUgZmFpbHVyZSBpcyBkdWUgdG8gd3Jvbmcgc3RhdGUuCisKKyAgICAgICAgICAgIEFMT0dFKCJjb25maWd1cmUgZmFpbGVkIHdpdGggZXJyIDB4JTA4eCwgcmVzZXR0aW5nLi4uIiwgZXJyKTsKKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpc1Jlc291cmNlRXJyb3IoZXJyKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICB9Ci0KICAgICByZXR1cm4gZXJyOwogfQogCitzdGF0dXNfdCBNZWRpYUNvZGVjOjpzZXRJbnB1dFN1cmZhY2UoCisgICAgICAgIGNvbnN0IHNwPFBlcnNpc3RlbnRTdXJmYWNlPiAmc3VyZmFjZSkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRJbnB1dFN1cmZhY2UsIHRoaXMpOworICAgIG1zZy0+c2V0T2JqZWN0KCJpbnB1dC1zdXJmYWNlIiwgc3VyZmFjZS5nZXQoKSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgcmV0dXJuIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlYzo6c2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRTdXJmYWNlLCB0aGlzKTsKKyAgICBtc2ctPnNldE9iamVjdCgic3VyZmFjZSIsIHN1cmZhY2UpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7Cit9CisKIHN0YXR1c190IE1lZGlhQ29kZWM6OmNyZWF0ZUlucHV0U3VyZmFjZSgKICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4qIGJ1ZmZlclByb2R1Y2VyKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENyZWF0ZUlucHV0U3VyZmFjZSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENyZWF0ZUlucHV0U3VyZmFjZSwgdGhpcyk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CiAgICAgc3RhdHVzX3QgZXJyID0gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOwpAQCAtMzA2LDIyICs1MDIsODUgQEAKICAgICByZXR1cm4gZXJyOwogfQogCit1aW50NjRfdCBNZWRpYUNvZGVjOjpnZXRHcmFwaGljQnVmZmVyU2l6ZSgpIHsKKyAgICBpZiAoIW1Jc1ZpZGVvKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHVpbnQ2NF90IHNpemUgPSAwOworICAgIHNpemVfdCBwb3J0TnVtID0gc2l6ZW9mKG1Qb3J0QnVmZmVycykgLyBzaXplb2YoKG1Qb3J0QnVmZmVycylbMF0pOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcG9ydE51bTsgKytpKSB7CisgICAgICAgIC8vIFRPRE86IHRoaXMgaXMganVzdCBhbiBlc3RpbWF0aW9uLCB3ZSBzaG91bGQgZ2V0IHRoZSByZWFsIGJ1ZmZlciBzaXplIGZyb20gQUNvZGVjLgorICAgICAgICBzaXplICs9IG1Qb3J0QnVmZmVyc1tpXS5zaXplKCkgKiBtVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCAqIDMgLyAyOworICAgIH0KKyAgICByZXR1cm4gc2l6ZTsKK30KKwordm9pZCBNZWRpYUNvZGVjOjphZGRSZXNvdXJjZShjb25zdCBTdHJpbmc4ICZ0eXBlLCBjb25zdCBTdHJpbmc4ICZzdWJ0eXBlLCB1aW50NjRfdCB2YWx1ZSkgeworICAgIFZlY3RvcjxNZWRpYVJlc291cmNlPiByZXNvdXJjZXM7CisgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKHR5cGUsIHN1YnR5cGUsIHZhbHVlKSk7CisgICAgbVJlc291cmNlTWFuYWdlclNlcnZpY2UtPmFkZFJlc291cmNlKAorICAgICAgICAgICAgZ2V0SWQobVJlc291cmNlTWFuYWdlckNsaWVudCksIG1SZXNvdXJjZU1hbmFnZXJDbGllbnQsIHJlc291cmNlcyk7Cit9CisKIHN0YXR1c190IE1lZGlhQ29kZWM6OnN0YXJ0KCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCB0aGlzKTsKKworICAgIHN0YXR1c190IGVycjsKKyAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gcmVzb3VyY2VzOworICAgIGNvbnN0IGNoYXIgKnR5cGUgPSAobUZsYWdzICYga0ZsYWdJc1NlY3VyZSkgPworICAgICAgICAgICAga1Jlc291cmNlU2VjdXJlQ29kZWMgOiBrUmVzb3VyY2VOb25TZWN1cmVDb2RlYzsKKyAgICBjb25zdCBjaGFyICpzdWJ0eXBlID0gbUlzVmlkZW8gPyBrUmVzb3VyY2VWaWRlb0NvZGVjIDoga1Jlc291cmNlQXVkaW9Db2RlYzsKKyAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoU3RyaW5nOCh0eXBlKSwgU3RyaW5nOChzdWJ0eXBlKSwgMSkpOworICAgIC8vIERvbid0IGtub3cgdGhlIGJ1ZmZlciBzaXplIGF0IHRoaXMgcG9pbnQsIGJ1dCBpdCdzIGZpbmUgdG8gdXNlIDEgYmVjYXVzZQorICAgIC8vIHRoZSByZWNsYWltUmVzb3VyY2UgY2FsbCBkb2Vzbid0IGNvbnNpZGVyIHRoZSByZXF1ZXN0ZXIncyBidWZmZXIgc2l6ZSBmb3Igbm93LgorICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShTdHJpbmc4KGtSZXNvdXJjZUdyYXBoaWNNZW1vcnkpLCAxKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0ga01heFJldHJ5OyArK2kpIHsKKyAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICAvLyBEb24ndCB0cnkgdG8gcmVjbGFpbSByZXNvdXJjZSBmb3IgdGhlIGZpcnN0IHRpbWUuCisgICAgICAgICAgICBpZiAoIW1SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2UocmVzb3VyY2VzKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUmVjb3ZlciBjb2RlYyBmcm9tIHByZXZpb3VzIGVycm9yIGJlZm9yZSByZXRyeSBzdGFydC4KKyAgICAgICAgICAgIGVyciA9IHJlc2V0KCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoInJldHJ5aW5nIHN0YXJ0OiBmYWlsZWQgdG8gcmVzZXQgY29kZWMiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICAgICAgICAgIGVyciA9IFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1Db25maWd1cmVNc2csICZyZXNwb25zZSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoInJldHJ5aW5nIHN0YXJ0OiBmYWlsZWQgdG8gY29uZmlndXJlIGNvZGVjIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgICAgIGVyciA9IFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKKyAgICAgICAgaWYgKCFpc1Jlc291cmNlRXJyb3IoZXJyKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlYzo6c3RvcCgpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgdGhpcyk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CiAgICAgcmV0dXJuIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKIH0KIAotc3RhdHVzX3QgTWVkaWFDb2RlYzo6c3RvcCgpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgaWQoKSk7CitzdGF0dXNfdCBNZWRpYUNvZGVjOjpyZWNsYWltKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWxlYXNlLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDMyKCJyZWNsYWltZWQiLCAxKTsKIAogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKICAgICByZXR1cm4gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOwogfQogCiBzdGF0dXNfdCBNZWRpYUNvZGVjOjpyZWxlYXNlKCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWxlYXNlLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVsZWFzZSwgdGhpcyk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CiAgICAgcmV0dXJuIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKQEAgLTM3Myw3ICs2MzIsNyBAQAogICAgICAgICBlcnJvckRldGFpbE1zZy0+Y2xlYXIoKTsKICAgICB9CiAKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UXVldWVJbnB1dEJ1ZmZlciwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFF1ZXVlSW5wdXRCdWZmZXIsIHRoaXMpOwogICAgIG1zZy0+c2V0U2l6ZSgiaW5kZXgiLCBpbmRleCk7CiAgICAgbXNnLT5zZXRTaXplKCJvZmZzZXQiLCBvZmZzZXQpOwogICAgIG1zZy0+c2V0U2l6ZSgic2l6ZSIsIHNpemUpOwpAQCAtNDAwLDcgKzY1OSw3IEBACiAgICAgICAgIGVycm9yRGV0YWlsTXNnLT5jbGVhcigpOwogICAgIH0KIAotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRRdWV1ZUlucHV0QnVmZmVyLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UXVldWVJbnB1dEJ1ZmZlciwgdGhpcyk7CiAgICAgbXNnLT5zZXRTaXplKCJpbmRleCIsIGluZGV4KTsKICAgICBtc2ctPnNldFNpemUoIm9mZnNldCIsIG9mZnNldCk7CiAgICAgbXNnLT5zZXRQb2ludGVyKCJzdWJTYW1wbGVzIiwgKHZvaWQgKilzdWJTYW1wbGVzKTsKQEAgLTQxOSw3ICs2NzgsNyBAQAogfQogCiBzdGF0dXNfdCBNZWRpYUNvZGVjOjpkZXF1ZXVlSW5wdXRCdWZmZXIoc2l6ZV90ICppbmRleCwgaW50NjRfdCB0aW1lb3V0VXMpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RGVxdWV1ZUlucHV0QnVmZmVyLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RGVxdWV1ZUlucHV0QnVmZmVyLCB0aGlzKTsKICAgICBtc2ctPnNldEludDY0KCJ0aW1lb3V0VXMiLCB0aW1lb3V0VXMpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwpAQCAtNDQwLDcgKzY5OSw3IEBACiAgICAgICAgIGludDY0X3QgKnByZXNlbnRhdGlvblRpbWVVcywKICAgICAgICAgdWludDMyX3QgKmZsYWdzLAogICAgICAgICBpbnQ2NF90IHRpbWVvdXRVcykgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREZXF1ZXVlT3V0cHV0QnVmZmVyLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RGVxdWV1ZU91dHB1dEJ1ZmZlciwgdGhpcyk7CiAgICAgbXNnLT5zZXRJbnQ2NCgidGltZW91dFVzIiwgdGltZW91dFVzKTsKIAogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKQEAgLTQ1OSw3ICs3MTgsNyBAQAogfQogCiBzdGF0dXNfdCBNZWRpYUNvZGVjOjpyZW5kZXJPdXRwdXRCdWZmZXJBbmRSZWxlYXNlKHNpemVfdCBpbmRleCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWxlYXNlT3V0cHV0QnVmZmVyLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVsZWFzZU91dHB1dEJ1ZmZlciwgdGhpcyk7CiAgICAgbXNnLT5zZXRTaXplKCJpbmRleCIsIGluZGV4KTsKICAgICBtc2ctPnNldEludDMyKCJyZW5kZXIiLCB0cnVlKTsKIApAQCAtNDY4LDcgKzcyNyw3IEBACiB9CiAKIHN0YXR1c190IE1lZGlhQ29kZWM6OnJlbmRlck91dHB1dEJ1ZmZlckFuZFJlbGVhc2Uoc2l6ZV90IGluZGV4LCBpbnQ2NF90IHRpbWVzdGFtcE5zKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbGVhc2VPdXRwdXRCdWZmZXIsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWxlYXNlT3V0cHV0QnVmZmVyLCB0aGlzKTsKICAgICBtc2ctPnNldFNpemUoImluZGV4IiwgaW5kZXgpOwogICAgIG1zZy0+c2V0SW50MzIoInJlbmRlciIsIHRydWUpOwogICAgIG1zZy0+c2V0SW50NjQoInRpbWVzdGFtcE5zIiwgdGltZXN0YW1wTnMpOwpAQCAtNDc4LDcgKzczNyw3IEBACiB9CiAKIHN0YXR1c190IE1lZGlhQ29kZWM6OnJlbGVhc2VPdXRwdXRCdWZmZXIoc2l6ZV90IGluZGV4KSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbGVhc2VPdXRwdXRCdWZmZXIsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWxlYXNlT3V0cHV0QnVmZmVyLCB0aGlzKTsKICAgICBtc2ctPnNldFNpemUoImluZGV4IiwgaW5kZXgpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwpAQCAtNDg2LDE0ICs3NDUsMTQgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlYzo6c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNpZ25hbEVuZE9mSW5wdXRTdHJlYW0sIHRoaXMpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwogICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7CiB9CiAKIHN0YXR1c190IE1lZGlhQ29kZWM6OmdldE91dHB1dEZvcm1hdChzcDxBTWVzc2FnZT4gKmZvcm1hdCkgY29uc3QgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRPdXRwdXRGb3JtYXQsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRPdXRwdXRGb3JtYXQsIHRoaXMpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwogICAgIHN0YXR1c190IGVycjsKQEAgLTUwNyw3ICs3NjYsNyBAQAogfQogCiBzdGF0dXNfdCBNZWRpYUNvZGVjOjpnZXRJbnB1dEZvcm1hdChzcDxBTWVzc2FnZT4gKmZvcm1hdCkgY29uc3QgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRJbnB1dEZvcm1hdCwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldElucHV0Rm9ybWF0LCB0aGlzKTsKIAogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKICAgICBzdGF0dXNfdCBlcnI7CkBAIC01MjEsNyArNzgwLDcgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlYzo6Z2V0TmFtZShBU3RyaW5nICpuYW1lKSBjb25zdCB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldE5hbWUsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXROYW1lLCB0aGlzKTsKIAogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKICAgICBzdGF0dXNfdCBlcnI7CkBAIC01MzQsOCArNzkzLDE4IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBNZWRpYUNvZGVjOjpnZXRXaWRldmluZUxlZ2FjeUJ1ZmZlcnMoVmVjdG9yPHNwPEFCdWZmZXI+ID4gKmJ1ZmZlcnMpIGNvbnN0IHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0QnVmZmVycywgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQzMigicG9ydEluZGV4Iiwga1BvcnRJbmRleElucHV0KTsKKyAgICBtc2ctPnNldFBvaW50ZXIoImJ1ZmZlcnMiLCBidWZmZXJzKTsKKyAgICBtc2ctPnNldEludDMyKCJ3aWRldmluZSIsIHRydWUpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7Cit9CisKIHN0YXR1c190IE1lZGlhQ29kZWM6OmdldElucHV0QnVmZmVycyhWZWN0b3I8c3A8QUJ1ZmZlcj4gPiAqYnVmZmVycykgY29uc3QgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRCdWZmZXJzLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0QnVmZmVycywgdGhpcyk7CiAgICAgbXNnLT5zZXRJbnQzMigicG9ydEluZGV4Iiwga1BvcnRJbmRleElucHV0KTsKICAgICBtc2ctPnNldFBvaW50ZXIoImJ1ZmZlcnMiLCBidWZmZXJzKTsKIApAQCAtNTQ0LDcgKzgxMyw3IEBACiB9CiAKIHN0YXR1c190IE1lZGlhQ29kZWM6OmdldE91dHB1dEJ1ZmZlcnMoVmVjdG9yPHNwPEFCdWZmZXI+ID4gKmJ1ZmZlcnMpIGNvbnN0IHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0QnVmZmVycywgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldEJ1ZmZlcnMsIHRoaXMpOwogICAgIG1zZy0+c2V0SW50MzIoInBvcnRJbmRleCIsIGtQb3J0SW5kZXhPdXRwdXQpOwogICAgIG1zZy0+c2V0UG9pbnRlcigiYnVmZmVycyIsIGJ1ZmZlcnMpOwogCkBAIC01NzYsNiArODQ1LDEwIEBACiAgICAgICAgIHNwPEFCdWZmZXI+ICpidWZmZXIsIHNwPEFNZXNzYWdlPiAqZm9ybWF0KSB7CiAgICAgLy8gdXNlIG11dGV4IGluc3RlYWQgb2YgYSBjb250ZXh0IHN3aXRjaAogCisgICAgaWYgKG1SZWxlYXNlZEJ5UmVzb3VyY2VNYW5hZ2VyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKICAgICBidWZmZXItPmNsZWFyKCk7CiAgICAgZm9ybWF0LT5jbGVhcigpOwogICAgIGlmICghaXNFeGVjdXRpbmcoKSkgewpAQCAtNjAyLDIwICs4NzUsMjAgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlYzo6Zmx1c2goKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEZsdXNoLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Rmx1c2gsIHRoaXMpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwogICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7CiB9CiAKIHN0YXR1c190IE1lZGlhQ29kZWM6OnJlcXVlc3RJRFJGcmFtZSgpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVxdWVzdElEUkZyYW1lLCBpZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVxdWVzdElEUkZyYW1lLCB0aGlzKSktPnBvc3QoKTsKIAogICAgIHJldHVybiBPSzsKIH0KIAogdm9pZCBNZWRpYUNvZGVjOjpyZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb24oY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVxdWVzdEFjdGl2aXR5Tm90aWZpY2F0aW9uLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVxdWVzdEFjdGl2aXR5Tm90aWZpY2F0aW9uLCB0aGlzKTsKICAgICBtc2ctPnNldE1lc3NhZ2UoIm5vdGlmeSIsIG5vdGlmeSk7CiAgICAgbXNnLT5wb3N0KCk7CiB9CkBAIC02NDAsNyArOTEzLDcgQEAKICAgICB9CiB9CiAKLWJvb2wgTWVkaWFDb2RlYzo6aGFuZGxlRGVxdWV1ZUlucHV0QnVmZmVyKHVpbnQzMl90IHJlcGx5SUQsIGJvb2wgbmV3UmVxdWVzdCkgeworYm9vbCBNZWRpYUNvZGVjOjpoYW5kbGVEZXF1ZXVlSW5wdXRCdWZmZXIoY29uc3Qgc3A8QVJlcGx5VG9rZW4+ICZyZXBseUlELCBib29sIG5ld1JlcXVlc3QpIHsKICAgICBpZiAoIWlzRXhlY3V0aW5nKCkgfHwgKG1GbGFncyAmIGtGbGFnSXNBc3luYykKICAgICAgICAgICAgIHx8IChuZXdSZXF1ZXN0ICYmIChtRmxhZ3MgJiBrRmxhZ0RlcXVldWVJbnB1dFBlbmRpbmcpKSkgewogICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOwpAQCAtNjY0LDIxICs5MzcsMjAgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBNZWRpYUNvZGVjOjpoYW5kbGVEZXF1ZXVlT3V0cHV0QnVmZmVyKHVpbnQzMl90IHJlcGx5SUQsIGJvb2wgbmV3UmVxdWVzdCkgewotICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLQorYm9vbCBNZWRpYUNvZGVjOjpoYW5kbGVEZXF1ZXVlT3V0cHV0QnVmZmVyKGNvbnN0IHNwPEFSZXBseVRva2VuPiAmcmVwbHlJRCwgYm9vbCBuZXdSZXF1ZXN0KSB7CiAgICAgaWYgKCFpc0V4ZWN1dGluZygpIHx8IChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpCiAgICAgICAgICAgICB8fCAobmV3UmVxdWVzdCAmJiAobUZsYWdzICYga0ZsYWdEZXF1ZXVlT3V0cHV0UGVuZGluZykpKSB7Ci0gICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikgewotICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGdldFN0aWNreUVycm9yKCkpOworICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgZ2V0U3RpY2t5RXJyb3IoKSk7CiAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ091dHB1dEJ1ZmZlcnNDaGFuZ2VkKSB7Ci0gICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEKTsKKyAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElORk9fT1VUUFVUX0JVRkZFUlNfQ0hBTkdFRCk7CiAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdPdXRwdXRCdWZmZXJzQ2hhbmdlZDsKICAgICB9IGVsc2UgaWYgKG1GbGFncyAmIGtGbGFnT3V0cHV0Rm9ybWF0Q2hhbmdlZCkgewotICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElORk9fRk9STUFUX0NIQU5HRUQpOworICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5GT19GT1JNQVRfQ0hBTkdFRCk7CiAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdPdXRwdXRGb3JtYXRDaGFuZ2VkOwogICAgIH0gZWxzZSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKICAgICAgICAgc3NpemVfdCBpbmRleCA9IGRlcXVldWVQb3J0QnVmZmVyKGtQb3J0SW5kZXhPdXRwdXQpOwogCiAgICAgICAgIGlmIChpbmRleCA8IDApIHsKQEAgLTcxMywxMCArOTg1LDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZmxhZ3MiLCBmbGFncyk7CisgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CiAgICAgfQogCi0gICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKLQogICAgIHJldHVybiB0cnVlOwogfQogCkBAIC04NzQsMTggKzExNDUsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdVc2VzU29mdHdhcmVSZW5kZXJlcjsKICAgICAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgICAgIFN0cmluZzggcmVzb3VyY2VUeXBlOwogICAgICAgICAgICAgICAgICAgICBpZiAobUNvbXBvbmVudE5hbWUuZW5kc1dpdGgoIi5zZWN1cmUiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnSXNTZWN1cmU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZVR5cGUgPSBTdHJpbmc4KGtSZXNvdXJjZVNlY3VyZUNvZGVjKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdJc1NlY3VyZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlVHlwZSA9IFN0cmluZzgoa1Jlc291cmNlTm9uU2VjdXJlQ29kZWMpOwogICAgICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3VidHlwZSA9IG1Jc1ZpZGVvID8ga1Jlc291cmNlVmlkZW9Db2RlYyA6IGtSZXNvdXJjZUF1ZGlvQ29kZWM7CisgICAgICAgICAgICAgICAgICAgIGFkZFJlc291cmNlKHJlc291cmNlVHlwZSwgU3RyaW5nOChzdWJ0eXBlKSwgMSk7CisKICAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShtUmVwbHlJRCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGNhc2UgQ29kZWNCYXNlOjprV2hhdENvbXBvbmVudENvbmZpZ3VyZWQ6CiAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFVOSU5JVElBTElaRUQgfHwgbVN0YXRlID09IElOSVRJQUxJWkVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIGEga1doYXRFcnJvciBtZXNzYWdlIGNhbWUgaW4gYW5kIHJlcGxpZWQgd2l0aCBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGxvZyBhIHdhcm5pbmcgYW5kIGlnbm9yZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjb25maWd1cmUgaW50ZXJydXB0ZWQgYnkgZXJyb3IsIGN1cnJlbnQgc3RhdGUgJWQiLCBtU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVN0YXRlLCBDT05GSUdVUklORyk7CiAKICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgaW5wdXQgc3VyZmFjZSBmbGFnCkBAIC05MDgsNyArMTE5MSw3IEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAvLyByZXNwb25zZSB0byBpbml0aWF0ZUNyZWF0ZUlucHV0U3VyZmFjZSgpCiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOwogICAgICAgICAgICAgICAgICAgICAgICAgbXNnLT5maW5kT2JqZWN0KCJpbnB1dC1zdXJmYWNlIiwgJm9iaik7CkBAIC05MjIsMTAgKzEyMDUsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgY2FzZSBDb2RlY0Jhc2U6OmtXaGF0SW5wdXRTdXJmYWNlQWNjZXB0ZWQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyByZXNwb25zZSB0byBpbml0aWF0ZVNldElucHV0U3VyZmFjZSgpCisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE5PX0VSUk9SOworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1IYXZlSW5wdXRTdXJmYWNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgY2FzZSBDb2RlY0Jhc2U6OmtXaGF0U2lnbmFsZWRJbnB1dEVPUzoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIHRvIHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKQotICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKQEAgLTk1OSw2ICsxMjU2LDE3IEBACiAKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bUJ1ZmZlcnMgPSBwb3J0RGVzYy0+Y291bnRCdWZmZXJzKCk7CiAKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtQnVmZmVyczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCAmJiBtQ3J5cHRvICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFNpemUgKz0gcG9ydERlc2MtPmJ1ZmZlckF0KGkpLT5jYXBhY2l0eSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRvdGFsU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbURlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIodG90YWxTaXplLCAiTWVkaWFDb2RlYyIpOworICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1CdWZmZXJzOyArK2kpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckluZm8gaW5mbzsKICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ubUJ1ZmZlcklEID0gcG9ydERlc2MtPmJ1ZmZlcklEQXQoaSk7CkBAIC05NjYsOCArMTI3NCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5tRGF0YSA9IHBvcnREZXNjLT5idWZmZXJBdChpKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQgJiYgbUNyeXB0byAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4gbWVtID0gbURlYWxlci0+YWxsb2NhdGUoaW5mby5tRGF0YS0+Y2FwYWNpdHkoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5tRW5jcnlwdGVkRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBQnVmZmVyKGluZm8ubURhdGEtPmNhcGFjaXR5KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQUJ1ZmZlcihtZW0tPnBvaW50ZXIoKSwgaW5mby5tRGF0YS0+Y2FwYWNpdHkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5tU2hhcmVkRW5jcnlwdGVkQnVmZmVyID0gbWVtOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzLT5wdXNoX2JhY2soaW5mbyk7CkBAIC05NzgsNiArMTI4OCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGFsd2F5cyBhbGxvY2F0aW5nIG91dHB1dCBidWZmZXJzIGFmdGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGluZyBpbnB1dCBidWZmZXJzLCBzbyB0aGlzIGlzIGEgZ29vZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRpb24gdGhhdCBub3cgYWxsIGJ1ZmZlcnMgYXJlIGFsbG9jYXRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUlzVmlkZW8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBzdWJ0eXBlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGtSZXNvdXJjZUdyYXBoaWNNZW1vcnkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0R3JhcGhpY0J1ZmZlclNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKFNUQVJURUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UpLT5wb3N0UmVwbHkobVJlcGx5SUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTk5MywxMyArMTMxMCwxMyBAQAogICAgICAgICAgICAgICAgICAgICBBTE9HVigiY29kZWMgb3V0cHV0IGZvcm1hdCBjaGFuZ2VkIik7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKG1Tb2Z0UmVuZGVyZXIgPT0gTlVMTCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlICE9IE5VTEwgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobUZsYWdzICYga0ZsYWdVc2VzU29mdHdhcmVSZW5kZXJlcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgbWltZTsKICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaW1lLnN0YXJ0c1dpdGhJZ25vcmVDYXNlKCJ2aWRlby8iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Tb2Z0UmVuZGVyZXIgPSBuZXcgU29mdHdhcmVSZW5kZXJlcihtTmF0aXZlV2luZG93KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU29mdFJlbmRlcmVyID0gbmV3IFNvZnR3YXJlUmVuZGVyZXIobVN1cmZhY2UsIG1Sb3RhdGlvbkRlZ3JlZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTEwMzEsNiArMTM0OCwxOCBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBjYXNlIENvZGVjQmFzZTo6a1doYXRPdXRwdXRGcmFtZXNSZW5kZXJlZDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGVzZSBpbiBhbGwgc3RhdGVzIGV4Y2VwdCBydW5uaW5nLCBhbmQgY2hlY2sgdGhhdCB3ZSBoYXZlIGEKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZpY2F0aW9uIHNldAorICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVJURUQgJiYgbU9uRnJhbWVSZW5kZXJlZE5vdGlmaWNhdGlvbiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU9uRnJhbWVSZW5kZXJlZE5vdGlmaWNhdGlvbi0+ZHVwKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldE1lc3NhZ2UoImRhdGEiLCBtc2cpOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgY2FzZSBDb2RlY0Jhc2U6OmtXaGF0RmlsbFRoaXNCdWZmZXI6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAvKiBzaXplX3QgaW5kZXggPSAqL3VwZGF0ZUJ1ZmZlcnMoa1BvcnRJbmRleElucHV0LCBtc2cpOwpAQCAtMTA2OCw3ICsxMzk3LDExIEBACiAKICAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnSXNBc3luYykgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtSGF2ZUlucHV0U3VyZmFjZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uSW5wdXRCdWZmZXJBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IEZMVVNIRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhhdmVQZW5kaW5nSW5wdXRCdWZmZXJzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbklucHV0QnVmZmVyQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1GbGFncyAmIGtGbGFnRGVxdWV1ZUlucHV0UGVuZGluZykgewogICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaGFuZGxlRGVxdWV1ZUlucHV0QnVmZmVyKG1EZXF1ZXVlSW5wdXRSZXBseUlEKSk7CkBAIC0xMTU3LDYgKzE0OTAsOCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdJc0NvbXBvbmVudEFsbG9jYXRlZDsKIAorICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VNYW5hZ2VyU2VydmljZS0+cmVtb3ZlUmVzb3VyY2UoZ2V0SWQobVJlc291cmNlTWFuYWdlckNsaWVudCkpOworCiAgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UpLT5wb3N0UmVwbHkobVJlcGx5SUQpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC0xMTg4LDcgKzE1MjMsNyBAQAogCiAgICAgICAgIGNhc2Uga1doYXRJbml0OgogICAgICAgICB7Ci0gICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gVU5JTklUSUFMSVpFRCkgewpAQCAtMTIyMiw5ICsxNTU3LDE4IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRTZXROb3RpZmljYXRpb246CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnk7CisgICAgICAgICAgICBpZiAobXNnLT5maW5kTWVzc2FnZSgib24tZnJhbWUtcmVuZGVyZWQiLCAmbm90aWZ5KSkgeworICAgICAgICAgICAgICAgIG1PbkZyYW1lUmVuZGVyZWROb3RpZmljYXRpb24gPSBub3RpZnk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2Uga1doYXRTZXRDYWxsYmFjazoKICAgICAgICAgewotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICBpZiAobVN0YXRlID09IFVOSU5JVElBTElaRUQKQEAgLTEyNTYsNyArMTYwMCw3IEBACiAKICAgICAgICAgY2FzZSBrV2hhdENvbmZpZ3VyZToKICAgICAgICAgewotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICBpZiAobVN0YXRlICE9IElOSVRJQUxJWkVEKSB7CkBAIC0xMjY1LDI2ICsxNjA5LDI1IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKLSAgICAgICAgICAgIGlmICghbXNnLT5maW5kT2JqZWN0KCJuYXRpdmUtd2luZG93IiwgJm9iaikpIHsKLSAgICAgICAgICAgICAgICBvYmouY2xlYXIoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgic3VyZmFjZSIsICZvYmopKTsKIAogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKTsKIAorICAgICAgICAgICAgaW50MzJfdCBwdXNoOworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJwdXNoLWJsYW5rLWJ1ZmZlcnMtb24tc2h1dGRvd24iLCAmcHVzaCkgJiYgcHVzaCAhPSAwKSB7CisgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnUHVzaEJsYW5rQnVmZmVyc09uU2h1dGRvd247CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChvYmogIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGZvcm1hdC0+c2V0T2JqZWN0KCJuYXRpdmUtd2luZG93Iiwgb2JqKTsKLQotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHNldE5hdGl2ZVdpbmRvdygKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TmF0aXZlV2luZG93V3JhcHBlciAqPihvYmouZ2V0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAtPmdldFN1cmZhY2VUZXh0dXJlQ2xpZW50KCkpOwotCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gaGFuZGxlU2V0U3VyZmFjZShzdGF0aWNfY2FzdDxTdXJmYWNlICo+KG9iai5nZXQoKSkpOwogICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIGVycik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0TmF0aXZlV2luZG93KE5VTEwpOworICAgICAgICAgICAgICAgIGhhbmRsZVNldFN1cmZhY2UoTlVMTCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1SZXBseUlEID0gcmVwbHlJRDsKQEAgLTEzMTEsOSArMTY1NCw2OSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIGtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlOgorICAgICAgICBjYXNlIGtXaGF0U2V0U3VyZmFjZToKICAgICAgICAgewotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2U7CisKKyAgICAgICAgICAgIHN3aXRjaCAobVN0YXRlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBDT05GSUdVUkVEOgorICAgICAgICAgICAgICAgIGNhc2UgU1RBUlRFRDoKKyAgICAgICAgICAgICAgICBjYXNlIEZMVVNIRUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKW1zZy0+ZmluZE9iamVjdCgic3VyZmFjZSIsICZvYmopOworICAgICAgICAgICAgICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlID0gc3RhdGljX2Nhc3Q8U3VyZmFjZSAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICBpZiAobVN1cmZhY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90IHN1cHBvcnQgc2V0dGluZyBzdXJmYWNlIGlmIGl0IHdhcyBub3Qgc2V0CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvYmogPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90IHN1cHBvcnQgdW5zZXR0aW5nIHN1cmZhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGNvbm5lY3RUb1N1cmZhY2Uoc3VyZmFjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IEJBRF9WQUxVRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtaW5nIHJlY29ubmVjdGluZyB0byBzYW1lIHN1cmZhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBjaGVjayBpZiBpdCBpcyB0aGUgc2FtZSBzdXJmYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnVXNlc1NvZnR3YXJlUmVuZGVyZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU29mdFJlbmRlcmVyICE9IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1GbGFncyAmIGtGbGFnUHVzaEJsYW5rQnVmZmVyc09uU2h1dGRvd24pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaEJsYW5rQnVmZmVyc1RvTmF0aXZlV2luZG93KG1TdXJmYWNlLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Tb2Z0UmVuZGVyZXIgPSBuZXcgU29mdHdhcmVSZW5kZXJlcihzdXJmYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGNoZWNrIGlmIHRoaXMgd2FzIHN1Y2Nlc3NmdWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IG1Db2RlYy0+c2V0U3VyZmFjZShzdXJmYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKWRpc2Nvbm5lY3RGcm9tU3VyZmFjZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VyZmFjZSA9IHN1cmZhY2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGVyciA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIGVycik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRDcmVhdGVJbnB1dFN1cmZhY2U6CisgICAgICAgIGNhc2Uga1doYXRTZXRJbnB1dFN1cmZhY2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICAvLyBNdXN0IGJlIGNvbmZpZ3VyZWQsIGJ1dCBjYW4ndCBoYXZlIGJlZW4gc3RhcnRlZCB5ZXQuCkBAIC0xMzIzLDE3ICsxNzI2LDI4IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1SZXBseUlEID0gcmVwbHlJRDsKLSAgICAgICAgICAgIG1Db2RlYy0+aW5pdGlhdGVDcmVhdGVJbnB1dFN1cmZhY2UoKTsKKyAgICAgICAgICAgIGlmIChtc2ctPndoYXQoKSA9PSBrV2hhdENyZWF0ZUlucHV0U3VyZmFjZSkgeworICAgICAgICAgICAgICAgIG1Db2RlYy0+aW5pdGlhdGVDcmVhdGVJbnB1dFN1cmZhY2UoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgiaW5wdXQtc3VyZmFjZSIsICZvYmopKTsKKworICAgICAgICAgICAgICAgIG1Db2RlYy0+aW5pdGlhdGVTZXRJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxQZXJzaXN0ZW50U3VyZmFjZSAqPihvYmouZ2V0KCkpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0KICAgICAgICAgY2FzZSBrV2hhdFN0YXJ0OgogICAgICAgICB7Ci0gICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gRkxVU0hFRCkgewogICAgICAgICAgICAgICAgIHNldFN0YXRlKFNUQVJURUQpOworICAgICAgICAgICAgICAgIGlmIChtSGF2ZVBlbmRpbmdJbnB1dEJ1ZmZlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgb25JbnB1dEJ1ZmZlckF2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgICAgICBtSGF2ZVBlbmRpbmdJbnB1dEJ1ZmZlcnMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxSZXN1bWUoKTsKICAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgT0spOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTM1NSw5ICsxNzY5LDIzIEBACiAgICAgICAgICAgICBTdGF0ZSB0YXJnZXRTdGF0ZSA9CiAgICAgICAgICAgICAgICAgKG1zZy0+d2hhdCgpID09IGtXaGF0U3RvcCkgPyBJTklUSUFMSVpFRCA6IFVOSU5JVElBTElaRUQ7CiAKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAorICAgICAgICAgICAgLy8gYWxyZWFkeSBzdG9wcGVkL3JlbGVhc2VkCisgICAgICAgICAgICBpZiAobVN0YXRlID09IFVOSU5JVElBTElaRUQgJiYgbVJlbGVhc2VkQnlSZXNvdXJjZU1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBPSyk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50MzJfdCByZWNsYWltZWQgPSAwOworICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoInJlY2xhaW1lZCIsICZyZWNsYWltZWQpOworICAgICAgICAgICAgaWYgKHJlY2xhaW1lZCkgeworICAgICAgICAgICAgICAgIG1SZWxlYXNlZEJ5UmVzb3VyY2VNYW5hZ2VyID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKCEoKG1GbGFncyAmIGtGbGFnSXNDb21wb25lbnRBbGxvY2F0ZWQpICYmIHRhcmdldFN0YXRlID09IFVOSU5JVElBTElaRUQpIC8vIFNlZSAxCiAgICAgICAgICAgICAgICAgICAgICYmIG1TdGF0ZSAhPSBJTklUSUFMSVpFRAogICAgICAgICAgICAgICAgICAgICAmJiBtU3RhdGUgIT0gQ09ORklHVVJFRCAmJiAhaXNFeGVjdXRpbmcoKSkgewpAQCAtMTM3MSw2ICsxNzk5LDggQEAKICAgICAgICAgICAgICAgICAvLyBhbmQgaXQgc2hvdWxkIGJlIGluIHRoaXMgY2FzZSwgbm8gaGFybSB0byBhbGxvdyBhIHJlbGVhc2UoKQogICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGFscmVhZHkgdW5pbml0aWFsaXplZC4KICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogd2Ugc2hvdWxkbid0IHRocm93IGFuIGV4Y2VwdGlvbiBmb3Igc3RvcC9yZWxlYXNlLiBDaGFuZ2UgdGhpcyB0byB3YWl0IHVudGlsCisgICAgICAgICAgICAgICAgLy8gdGhlIHByZXZpb3VzIHN0b3AvcmVsZWFzZSBjb21wbGV0ZXMgYW5kIHRoZW4gcmVwbHkgd2l0aCBPSy4KICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU3RhdGUgPT0gdGFyZ2V0U3RhdGUgPyBPSyA6IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LICYmIHRhcmdldFN0YXRlID09IFVOSU5JVElBTElaRUQpIHsKQEAgLTEzOTgsMTIgKzE4MjgsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgbXNnLT53aGF0KCkgPT0ga1doYXRTdG9wIC8qIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQgKi8pOwogCiAgICAgICAgICAgICByZXR1cm5CdWZmZXJzVG9Db2RlYygpOworCisgICAgICAgICAgICBpZiAobVNvZnRSZW5kZXJlciAhPSBOVUxMICYmIChtRmxhZ3MgJiBrRmxhZ1B1c2hCbGFua0J1ZmZlcnNPblNodXRkb3duKSkgeworICAgICAgICAgICAgICAgIHB1c2hCbGFua0J1ZmZlcnNUb05hdGl2ZVdpbmRvdyhtU3VyZmFjZS5nZXQoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2Uga1doYXREZXF1ZXVlSW5wdXRCdWZmZXI6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnSXNBc3luYykgewpAQCAtMTQzNSw3ICsxODY5LDcgQEAKIAogICAgICAgICAgICAgaWYgKHRpbWVvdXRVcyA+IDBsbCkgewogICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiB0aW1lb3V0TXNnID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEFNZXNzYWdlKGtXaGF0RGVxdWV1ZUlucHV0VGltZWRPdXQsIGlkKCkpOworICAgICAgICAgICAgICAgICAgICBuZXcgQU1lc3NhZ2Uoa1doYXREZXF1ZXVlSW5wdXRUaW1lZE91dCwgdGhpcyk7CiAgICAgICAgICAgICAgICAgdGltZW91dE1zZy0+c2V0SW50MzIoCiAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdGlvbiIsICsrbURlcXVldWVJbnB1dFRpbWVvdXRHZW5lcmF0aW9uKTsKICAgICAgICAgICAgICAgICB0aW1lb3V0TXNnLT5wb3N0KHRpbWVvdXRVcyk7CkBAIC0xNDY0LDcgKzE4OTgsNyBAQAogCiAgICAgICAgIGNhc2Uga1doYXRRdWV1ZUlucHV0QnVmZmVyOgogICAgICAgICB7Ci0gICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKICAgICAgICAgICAgIGlmICghaXNFeGVjdXRpbmcoKSkgewpAQCAtMTQ4Myw3ICsxOTE3LDcgQEAKIAogICAgICAgICBjYXNlIGtXaGF0RGVxdWV1ZU91dHB1dEJ1ZmZlcjoKICAgICAgICAgewotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7CkBAIC0xNTA5LDcgKzE5NDMsNyBAQAogCiAgICAgICAgICAgICBpZiAodGltZW91dFVzID4gMGxsKSB7CiAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHRpbWVvdXRNc2cgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQU1lc3NhZ2Uoa1doYXREZXF1ZXVlT3V0cHV0VGltZWRPdXQsIGlkKCkpOworICAgICAgICAgICAgICAgICAgICBuZXcgQU1lc3NhZ2Uoa1doYXREZXF1ZXVlT3V0cHV0VGltZWRPdXQsIHRoaXMpOwogICAgICAgICAgICAgICAgIHRpbWVvdXRNc2ctPnNldEludDMyKAogICAgICAgICAgICAgICAgICAgICAgICAgImdlbmVyYXRpb24iLCArK21EZXF1ZXVlT3V0cHV0VGltZW91dEdlbmVyYXRpb24pOwogICAgICAgICAgICAgICAgIHRpbWVvdXRNc2ctPnBvc3QodGltZW91dFVzKTsKQEAgLTE1MzgsNyArMTk3Miw3IEBACiAKICAgICAgICAgY2FzZSBrV2hhdFJlbGVhc2VPdXRwdXRCdWZmZXI6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgaWYgKCFpc0V4ZWN1dGluZygpKSB7CkBAIC0xNTU3LDcgKzE5OTEsNyBAQAogCiAgICAgICAgIGNhc2Uga1doYXRTaWduYWxFbmRPZklucHV0U3RyZWFtOgogICAgICAgICB7Ci0gICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKICAgICAgICAgICAgIGlmICghaXNFeGVjdXRpbmcoKSkgewpAQCAtMTU3NSwxMCArMjAwOSwxNCBAQAogCiAgICAgICAgIGNhc2Uga1doYXRHZXRCdWZmZXJzOgogICAgICAgICB7Ci0gICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5IHdpZGV2aW5lIGxlZ2FjeSBzb3VyY2UgcmVxdWlyZXMga25vd2luZyBhbGwgb2YgdGhlCisgICAgICAgICAgICAvLyBjb2RlYyBpbnB1dCBidWZmZXJzLCBzbyB3ZSBoYXZlIHRvIHByb3ZpZGUgdGhlbSBldmVuIGluIGFzeW5jIG1vZGUuCisgICAgICAgICAgICBpbnQzMl90IHdpZGV2aW5lID0gMDsKKyAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKCJ3aWRldmluZSIsICZ3aWRldmluZSk7CiAKLSAgICAgICAgICAgIGlmICghaXNFeGVjdXRpbmcoKSB8fCAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSkgeworICAgICAgICAgICAgaWYgKCFpc0V4ZWN1dGluZygpIHx8ICgobUZsYWdzICYga0ZsYWdJc0FzeW5jKSAmJiAhd2lkZXZpbmUpKSB7CiAgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikgewpAQCAtMTYwOSw3ICsyMDQ3LDcgQEAKIAogICAgICAgICBjYXNlIGtXaGF0Rmx1c2g6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgaWYgKCFpc0V4ZWN1dGluZygpKSB7CkBAIC0xNjM1LDcgKzIwNzMsNyBAQAogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9CiAgICAgICAgICAgICAgICAgKG1zZy0+d2hhdCgpID09IGtXaGF0R2V0T3V0cHV0Rm9ybWF0ID8gbU91dHB1dEZvcm1hdCA6IG1JbnB1dEZvcm1hdCk7CiAKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgaWYgKChtU3RhdGUgIT0gQ09ORklHVVJFRCAmJiBtU3RhdGUgIT0gU1RBUlRJTkcgJiYKQEAgLTE2NzIsNyArMjExMCw3IEBACiAKICAgICAgICAgY2FzZSBrV2hhdEdldE5hbWU6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgaWYgKG1Db21wb25lbnROYW1lLmVtcHR5KCkpIHsKQEAgLTE2ODgsNyArMjEyNiw3IEBACiAKICAgICAgICAgY2FzZSBrV2hhdFNldFBhcmFtZXRlcnM6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtczsKQEAgLTE3NDIsNyArMjE4MCw3IEBACiAKICAgICBBU3RyaW5nIGVycm9yRGV0YWlsTXNnOwogCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFF1ZXVlSW5wdXRCdWZmZXIsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRRdWV1ZUlucHV0QnVmZmVyLCB0aGlzKTsKICAgICBtc2ctPnNldFNpemUoImluZGV4IiwgYnVmZmVySW5kZXgpOwogICAgIG1zZy0+c2V0U2l6ZSgib2Zmc2V0IiwgMCk7CiAgICAgbXNnLT5zZXRTaXplKCJzaXplIiwgY3NkLT5zaXplKCkpOwpAQCAtMTc1OSw3ICsyMTk3LDcgQEAKICAgICAgICAgbVNvZnRSZW5kZXJlciA9IE5VTEw7CiAKICAgICAgICAgbUNyeXB0by5jbGVhcigpOwotICAgICAgICBzZXROYXRpdmVXaW5kb3coTlVMTCk7CisgICAgICAgIGhhbmRsZVNldFN1cmZhY2UoTlVMTCk7CiAKICAgICAgICAgbUlucHV0Rm9ybWF0LmNsZWFyKCk7CiAgICAgICAgIG1PdXRwdXRGb3JtYXQuY2xlYXIoKTsKQEAgLTE5NDMsNyArMjM4MSw4IEBACiAgICAgICAgICAgICAgICAga2V5LAogICAgICAgICAgICAgICAgIGl2LAogICAgICAgICAgICAgICAgIG1vZGUsCi0gICAgICAgICAgICAgICAgaW5mby0+bUVuY3J5cHRlZERhdGEtPmJhc2UoKSArIG9mZnNldCwKKyAgICAgICAgICAgICAgICBpbmZvLT5tU2hhcmVkRW5jcnlwdGVkQnVmZmVyLAorICAgICAgICAgICAgICAgIG9mZnNldCwKICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLAogICAgICAgICAgICAgICAgIG51bVN1YlNhbXBsZXMsCiAgICAgICAgICAgICAgICAgaW5mby0+bURhdGEtPmJhc2UoKSwKQEAgLTE5NjksNiArMjQwOCwyMyBAQAogICAgIHJldHVybiBPSzsKIH0KIAorLy9zdGF0aWMKK3NpemVfdCBNZWRpYUNvZGVjOjpDcmVhdGVGcmFtZXNSZW5kZXJlZE1lc3NhZ2UoCisgICAgICAgIHN0ZDo6bGlzdDxGcmFtZVJlbmRlclRyYWNrZXI6OkluZm8+IGRvbmUsIHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc2l6ZV90IGluZGV4ID0gMDsKKworICAgIGZvciAoc3RkOjpsaXN0PEZyYW1lUmVuZGVyVHJhY2tlcjo6SW5mbz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZG9uZS5jYmVnaW4oKTsKKyAgICAgICAgICAgIGl0ICE9IGRvbmUuY2VuZCgpOyArK2l0KSB7CisgICAgICAgIGlmIChpdC0+Z2V0UmVuZGVyVGltZU5zKCkgPCAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsgLy8gZHJvcHBlZCBmcmFtZSBmcm9tIHRyYWNraW5nCisgICAgICAgIH0KKyAgICAgICAgbXNnLT5zZXRJbnQ2NChBU3RyaW5nUHJpbnRmKCIlenUtbWVkaWEtdGltZS11cyIsIGluZGV4KS5jX3N0cigpLCBpdC0+Z2V0TWVkaWFUaW1lVXMoKSk7CisgICAgICAgIG1zZy0+c2V0SW50NjQoQVN0cmluZ1ByaW50ZigiJXp1LXN5c3RlbS1uYW5vIiwgaW5kZXgpLmNfc3RyKCksIGl0LT5nZXRSZW5kZXJUaW1lTnMoKSk7CisgICAgICAgICsraW5kZXg7CisgICAgfQorICAgIHJldHVybiBpbmRleDsKK30KKwogc3RhdHVzX3QgTWVkaWFDb2RlYzo6b25SZWxlYXNlT3V0cHV0QnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgc2l6ZV90IGluZGV4OwogICAgIENIRUNLKG1zZy0+ZmluZFNpemUoImluZGV4IiwgJmluZGV4KSk7CkBAIC0yMDAxLDI2ICsyNDU3LDMxIEBACiAgICAgaWYgKHJlbmRlciAmJiBpbmZvLT5tRGF0YSAhPSBOVUxMICYmIGluZm8tPm1EYXRhLT5zaXplKCkgIT0gMCkgewogICAgICAgICBpbmZvLT5tTm90aWZ5LT5zZXRJbnQzMigicmVuZGVyIiwgdHJ1ZSk7CiAKLSAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBOcyA9IDA7Ci0gICAgICAgIGlmIChtc2ctPmZpbmRJbnQ2NCgidGltZXN0YW1wTnMiLCAmdGltZXN0YW1wTnMpKSB7Ci0gICAgICAgICAgICBpbmZvLT5tTm90aWZ5LT5zZXRJbnQ2NCgidGltZXN0YW1wTnMiLCB0aW1lc3RhbXBOcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBpdCBzZWVtcyBsaWtlIHdlIHNob3VsZCB1c2UgdGhlIHRpbWVzdGFtcAotICAgICAgICAgICAgLy8gaW4gdGhlIChtZWRpYSlidWZmZXIgYXMgaXQgcG90ZW50aWFsbHkgY2FtZSBmcm9tCi0gICAgICAgICAgICAvLyBhbiBpbnB1dCBzdXJmYWNlLCBidXQgd2UgZGlkIG5vdCBwcm9wYWdhdGUgaXQgcHJpb3IgdG8KLSAgICAgICAgICAgIC8vIEFQSSAyMC4gIFBlcmhhcHMgY2hlY2sgZm9yIHRhcmdldCBTREsgdmVyc2lvbi4KLSNpZiAwCi0gICAgICAgICAgICBpZiAoaW5mby0+bURhdGEtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZXN0YW1wTnMpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInVzaW5nIGJ1ZmZlciBQVFMgb2YgJSIgUFJJZDY0LCB0aW1lc3RhbXBOcyk7Ci0gICAgICAgICAgICAgICAgdGltZXN0YW1wTnMgKj0gMTAwMDsKLSAgICAgICAgICAgIH0KLSNlbmRpZgorICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzID0gLTE7CisgICAgICAgIGluZm8tPm1EYXRhLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKTsKKworICAgICAgICBpbnQ2NF90IHJlbmRlclRpbWVOcyA9IDA7CisgICAgICAgIGlmICghbXNnLT5maW5kSW50NjQoInRpbWVzdGFtcE5zIiwgJnJlbmRlclRpbWVOcykpIHsKKyAgICAgICAgICAgIC8vIHVzZSBtZWRpYSB0aW1lc3RhbXAgaWYgY2xpZW50IGRpZCBub3QgcmVxdWVzdCBhIHNwZWNpZmljIHJlbmRlciB0aW1lc3RhbXAKKyAgICAgICAgICAgIEFMT0dWKCJ1c2luZyBidWZmZXIgUFRTIG9mICVsbGQiLCAobG9uZyBsb25nKW1lZGlhVGltZVVzKTsKKyAgICAgICAgICAgIHJlbmRlclRpbWVOcyA9IG1lZGlhVGltZVVzICogMTAwMDsKICAgICAgICAgfQorICAgICAgICBpbmZvLT5tTm90aWZ5LT5zZXRJbnQ2NCgidGltZXN0YW1wTnMiLCByZW5kZXJUaW1lTnMpOwogCiAgICAgICAgIGlmIChtU29mdFJlbmRlcmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1Tb2Z0UmVuZGVyZXItPnJlbmRlcigKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxGcmFtZVJlbmRlclRyYWNrZXI6OkluZm8+IGRvbmVGcmFtZXMgPSBtU29mdFJlbmRlcmVyLT5yZW5kZXIoCiAgICAgICAgICAgICAgICAgICAgIGluZm8tPm1EYXRhLT5kYXRhKCksIGluZm8tPm1EYXRhLT5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcE5zLCBOVUxMLCBpbmZvLT5tRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFUaW1lVXMsIHJlbmRlclRpbWVOcywgTlVMTCwgaW5mby0+bUZvcm1hdCk7CisKKyAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBydW5uaW5nLCBub3RpZnkgcmVuZGVyZWQgZnJhbWVzCisgICAgICAgICAgICBpZiAoIWRvbmVGcmFtZXMuZW1wdHkoKSAmJiBtU3RhdGUgPT0gU1RBUlRFRCAmJiBtT25GcmFtZVJlbmRlcmVkTm90aWZpY2F0aW9uICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU9uRnJhbWVSZW5kZXJlZE5vdGlmaWNhdGlvbi0+ZHVwKCk7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGRhdGEgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICAgICAgaWYgKENyZWF0ZUZyYW1lc1JlbmRlcmVkTWVzc2FnZShkb25lRnJhbWVzLCBkYXRhKSkgeworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldE1lc3NhZ2UoImRhdGEiLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0yMDY0LDM3ICsyNTI1LDY1IEBACiAgICAgcmV0dXJuIGluZGV4OwogfQogCi1zdGF0dXNfdCBNZWRpYUNvZGVjOjpzZXROYXRpdmVXaW5kb3coCi0gICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlVGV4dHVyZUNsaWVudCkgewotICAgIHN0YXR1c190IGVycjsKLQotICAgIGlmIChtTmF0aXZlV2luZG93ICE9IE5VTEwpIHsKLSAgICAgICAgZXJyID0gbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdCgKLSAgICAgICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLCBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR1coIm5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3QgcmV0dXJuZWQgYW4gZXJyb3I6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgZXJyKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1OYXRpdmVXaW5kb3cuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBpZiAoc3VyZmFjZVRleHR1cmVDbGllbnQgIT0gTlVMTCkgewotICAgICAgICBlcnIgPSBuYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KAotICAgICAgICAgICAgICAgIHN1cmZhY2VUZXh0dXJlQ2xpZW50LmdldCgpLCBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIm5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3QgcmV0dXJuZWQgYW4gZXJyb3I6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgZXJyKTsKLQorc3RhdHVzX3QgTWVkaWFDb2RlYzo6Y29ubmVjdFRvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgeworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIGlmIChzdXJmYWNlICE9IE5VTEwpIHsKKyAgICAgICAgZXJyID0gbmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdChzdXJmYWNlLmdldCgpLCBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7CisgICAgICAgIGlmIChlcnIgPT0gQkFEX1ZBTFVFKSB7CisgICAgICAgICAgICBBTE9HSSgibmF0aXZlIHdpbmRvdyBhbHJlYWR5IGNvbm5lY3RlZC4gQXNzdW1pbmcgbm8gY2hhbmdlIG9mIHN1cmZhY2UiKTsKICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAvLyBSZXF1aXJlIGEgZnJlc2ggc2V0IG9mIGJ1ZmZlcnMgYWZ0ZXIgZWFjaCBjb25uZWN0IGJ5IHVzaW5nIGEgdW5pcXVlIGdlbmVyYXRpb24KKyAgICAgICAgICAgIC8vIG51bWJlci4gUmVseSBvbiB0aGUgZmFjdCB0aGF0IG1heCBzdXBwb3J0ZWQgcHJvY2VzcyBpZCBieSBMaW51eCBpcyAyXjIyLgorICAgICAgICAgICAgLy8gUElEIGlzIG5ldmVyIDAgc28gd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSB0aGF0IHdlIHVzZSB0aGUgZGVmYXVsdCBnZW5lcmF0aW9uIG9mIDAuCisgICAgICAgICAgICAvLyBUT0RPOiBjb21lIHVwIHdpdGggYSB1bmlxdWUgc2NoZW1lIGlmIG90aGVyIHByb2R1Y2VycyBhbHNvIHNldCB0aGUgZ2VuZXJhdGlvbiBudW1iZXIuCisgICAgICAgICAgICBzdGF0aWMgdWludDMyX3QgbVN1cmZhY2VHZW5lcmF0aW9uID0gMDsKKyAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24gPSAoZ2V0cGlkKCkgPDwgMTApIHwgKCsrbVN1cmZhY2VHZW5lcmF0aW9uICYgKCgxIDw8IDEwKSAtIDEpKTsKKyAgICAgICAgICAgIHN1cmZhY2UtPnNldEdlbmVyYXRpb25OdW1iZXIoZ2VuZXJhdGlvbik7CisgICAgICAgICAgICBBTE9HSSgiWyVzXSBzZXR0aW5nIHN1cmZhY2UgZ2VuZXJhdGlvbiB0byAldSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGdlbmVyYXRpb24pOworCisgICAgICAgICAgICAvLyBIQUNLOiBjbGVhciBhbnkgZnJlZSBidWZmZXJzLiBSZW1vdmUgd2hlbiBjb25uZWN0IHdpbGwgYXV0b21hdGljYWxseSBkbyB0aGlzLgorICAgICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgYXMgdGhlIGNvbnN1bWVyIG1heSBiZSBob2xkaW5nIG9udG8gc3RhbGUgZnJhbWVzIHRoYXQgaXQgY2FuIHJlYXR0YWNoCisgICAgICAgICAgICAvLyB0byB0aGlzIHN1cmZhY2UgYWZ0ZXIgZGlzY29ubmVjdC9jb25uZWN0LCBhbmQgdGhvc2UgZnJlZSBmcmFtZXMgd291bGQgaW5oZXJpdCB0aGUgbmV3CisgICAgICAgICAgICAvLyBnZW5lcmF0aW9uIG51bWJlci4gRGlzY29ubmVjdGluZyBhZnRlciBzZXR0aW5nIGEgdW5pcXVlIGdlbmVyYXRpb24gcHJldmVudHMgdGhpcy4KKyAgICAgICAgICAgIG5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3Qoc3VyZmFjZS5nZXQoKSwgTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOworICAgICAgICAgICAgZXJyID0gbmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdChzdXJmYWNlLmdldCgpLCBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7CiAgICAgICAgIH0KIAotICAgICAgICBtTmF0aXZlV2luZG93ID0gc3VyZmFjZVRleHR1cmVDbGllbnQ7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJuYXRpdmVfd2luZG93X2FwaV9jb25uZWN0IHJldHVybmVkIGFuIGVycm9yOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgIH0KICAgICB9CisgICAgcmV0dXJuIGVycjsKK30KIAotICAgIHJldHVybiBPSzsKK3N0YXR1c190IE1lZGlhQ29kZWM6OmRpc2Nvbm5lY3RGcm9tU3VyZmFjZSgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBpZiAobVN1cmZhY2UgIT0gTlVMTCkgeworICAgICAgICAvLyBSZXNldHRpbmcgZ2VuZXJhdGlvbiBpcyBub3QgdGVjaG5pY2FsbHkgbmVlZGVkLCBidXQgdGhlcmUgaXMgbm8gbmVlZCB0byBrZWVwIGl0IGVpdGhlcgorICAgICAgICBtU3VyZmFjZS0+c2V0R2VuZXJhdGlvbk51bWJlcigwKTsKKyAgICAgICAgZXJyID0gbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdChtU3VyZmFjZS5nZXQoKSwgTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygibmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdCByZXR1cm5lZCBhbiBlcnJvcjogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICB9CisgICAgICAgIC8vIGFzc3VtZSBkaXNjb25uZWN0ZWQgZXZlbiBvbiBlcnJvcgorICAgICAgICBtU3VyZmFjZS5jbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjOjpoYW5kbGVTZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgaWYgKG1TdXJmYWNlICE9IE5VTEwpIHsKKyAgICAgICAgKHZvaWQpZGlzY29ubmVjdEZyb21TdXJmYWNlKCk7CisgICAgfQorICAgIGlmIChzdXJmYWNlICE9IE5VTEwpIHsKKyAgICAgICAgZXJyID0gY29ubmVjdFRvU3VyZmFjZShzdXJmYWNlKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgbVN1cmZhY2UgPSBzdXJmYWNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlcnI7CiB9CiAKIHZvaWQgTWVkaWFDb2RlYzo6b25JbnB1dEJ1ZmZlckF2YWlsYWJsZSgpIHsKQEAgLTIxOTcsNyArMjY4Niw3IEBACiB9CiAKIHN0YXR1c190IE1lZGlhQ29kZWM6OnNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXMpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0UGFyYW1ldGVycywgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldFBhcmFtZXRlcnMsIHRoaXMpOwogICAgIG1zZy0+c2V0TWVzc2FnZSgicGFyYW1zIiwgcGFyYW1zKTsKIAogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKQEAgLTIyNTMsMTIgKzI3NDIsNiBAQAogCiB2b2lkIE1lZGlhQ29kZWM6OnVwZGF0ZUJhdHRlcnlTdGF0KCkgewogICAgIGlmIChtU3RhdGUgPT0gQ09ORklHVVJFRCAmJiAhbUJhdHRlcnlTdGF0Tm90aWZpZWQpIHsKLSAgICAgICAgQVN0cmluZyBtaW1lOwotICAgICAgICBDSEVDSyhtT3V0cHV0Rm9ybWF0ICE9IE5VTEwgJiYKLSAgICAgICAgICAgICAgICBtT3V0cHV0Rm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKLQotICAgICAgICBtSXNWaWRlbyA9IG1pbWUuc3RhcnRzV2l0aElnbm9yZUNhc2UoInZpZGVvLyIpOwotCiAgICAgICAgIEJhdHRlcnlOb3RpZmllciYgbm90aWZpZXIoQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpKTsKIAogICAgICAgICBpZiAobUlzVmlkZW8pIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcAppbmRleCBjZjZlOTM3Li41ZWRjMDRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwCkBAIC0xOCwxMSArMTgsMTUgQEAKICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDb2RlY0xpc3QiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlICJNZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5oIgorCiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0luZm8uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVJlc291cmNlUG9saWN5Lmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KQEAgLTMxLDI3ICszNSwxMDAgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgogCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGxpYmV4cGF0L2V4cGF0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY29uc3QgY2hhciAqa01heEVuY29kZXJJbnB1dEJ1ZmZlcnMgPSAibWF4LXZpZGVvLWVuY29kZXItaW5wdXQtYnVmZmVycyI7CisKIHN0YXRpYyBNdXRleCBzSW5pdE11dGV4OwogCi1zdGF0aWMgTWVkaWFDb2RlY0xpc3QgKmdDb2RlY0xpc3QgPSBOVUxMOworc3RhdGljIGJvb2wgcGFyc2VCb29sZWFuKGNvbnN0IGNoYXIgKnMpIHsKKyAgICBpZiAoIXN0cmNhc2VjbXAocywgInRydWUiKSB8fCAhc3RyY2FzZWNtcChzLCAieWVzIikgfHwgIXN0cmNhc2VjbXAocywgInkiKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2hhciAqZW5kOworICAgIHVuc2lnbmVkIGxvbmcgcmVzID0gc3RydG91bChzLCAmZW5kLCAxMCk7CisgICAgcmV0dXJuICpzICE9ICdcMCcgJiYgKmVuZCA9PSAnXDAnICYmIHJlcyA+IDA7Cit9CisKK3N0YXRpYyBib29sIGlzUHJvZmlsaW5nTmVlZGVkKCkgeworICAgIGludDhfdCB2YWx1ZSA9IHByb3BlcnR5X2dldF9ib29sKCJkZWJ1Zy5zdGFnZWZyaWdodC5wcm9maWxlY29kZWMiLCAwKTsKKyAgICBpZiAodmFsdWUgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBwcm9maWxpbmdOZWVkZWQgPSB0cnVlOworICAgIEZJTEUgKnJlc3VsdHNGaWxlID0gZm9wZW4oa1Byb2ZpbGluZ1Jlc3VsdHMsICJyIik7CisgICAgaWYgKHJlc3VsdHNGaWxlKSB7CisgICAgICAgIEFTdHJpbmcgY3VycmVudFZlcnNpb24gPSBnZXRQcm9maWxpbmdWZXJzaW9uU3RyaW5nKCk7CisgICAgICAgIHNpemVfdCBjdXJyZW50VmVyc2lvblNpemUgPSBjdXJyZW50VmVyc2lvbi5zaXplKCk7CisgICAgICAgIGNoYXIgKnZlcnNpb25TdHJpbmcgPSBuZXcgY2hhcltjdXJyZW50VmVyc2lvblNpemUgKyAxXTsKKyAgICAgICAgZmdldHModmVyc2lvblN0cmluZywgY3VycmVudFZlcnNpb25TaXplICsgMSwgcmVzdWx0c0ZpbGUpOworICAgICAgICBpZiAoc3RyY21wKHZlcnNpb25TdHJpbmcsIGN1cnJlbnRWZXJzaW9uLmNfc3RyKCkpID09IDApIHsKKyAgICAgICAgICAgIC8vIHByb2ZpbGluZyByZXN1bHQgdXAgdG8gZGF0ZQorICAgICAgICAgICAgcHJvZmlsaW5nTmVlZGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmNsb3NlKHJlc3VsdHNGaWxlKTsKKyAgICAgICAgZGVsZXRlW10gdmVyc2lvblN0cmluZzsKKyAgICB9CisgICAgcmV0dXJuIHByb2ZpbGluZ05lZWRlZDsKK30KIAogLy8gc3RhdGljCiBzcDxJTWVkaWFDb2RlY0xpc3Q+IE1lZGlhQ29kZWNMaXN0OjpzQ29kZWNMaXN0OwogCiAvLyBzdGF0aWMKK3ZvaWQgKk1lZGlhQ29kZWNMaXN0Ojpwcm9maWxlclRocmVhZFdyYXBwZXIodm9pZCAqIC8qYXJnKi8pIHsKKyAgICBBTE9HVigiRW50ZXIgcHJvZmlsZXJUaHJlYWRXcmFwcGVyLiIpOworICAgIHJlbW92ZShrUHJvZmlsaW5nUmVzdWx0cyk7ICAvLyByZW1vdmUgcHJldmlvdXMgcmVzdWx0IHNvIHRoYXQgaXQgd29uJ3QgYmUgbG9hZGVkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBuZXcgTWVkaWFDb2RlY0xpc3QKKyAgICBNZWRpYUNvZGVjTGlzdCAqY29kZWNMaXN0ID0gbmV3IE1lZGlhQ29kZWNMaXN0KCk7CisgICAgaWYgKGNvZGVjTGlzdC0+aW5pdENoZWNrKCkgIT0gT0spIHsKKyAgICAgICAgQUxPR1coIkZhaWxlZCB0byBjcmVhdGUgYSBuZXcgTWVkaWFDb2RlY0xpc3QsIHNraXBwaW5nIGNvZGVjIHByb2ZpbGluZy4iKTsKKyAgICAgICAgZGVsZXRlIGNvZGVjTGlzdDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgVmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPj4gaW5mb3M7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb2RlY0xpc3QtPmNvdW50Q29kZWNzKCk7ICsraSkgeworICAgICAgICBpbmZvcy5wdXNoX2JhY2soY29kZWNMaXN0LT5nZXRDb2RlY0luZm8oaSkpOworICAgIH0KKyAgICBBTE9HVigiQ29kZWMgcHJvZmlsaW5nIHN0YXJ0ZWQuIik7CisgICAgcHJvZmlsZUNvZGVjcyhpbmZvcyk7CisgICAgQUxPR1YoIkNvZGVjIHByb2ZpbGluZyBjb21wbGV0ZWQuIik7CisgICAgY29kZWNMaXN0LT5wYXJzZVRvcExldmVsWE1MRmlsZShrUHJvZmlsaW5nUmVzdWx0cywgdHJ1ZSAvKiBpZ25vcmVfZXJyb3JzICovKTsKKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKHNJbml0TXV0ZXgpOworICAgICAgICBzQ29kZWNMaXN0ID0gY29kZWNMaXN0OworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLy8gc3RhdGljCiBzcDxJTWVkaWFDb2RlY0xpc3Q+IE1lZGlhQ29kZWNMaXN0OjpnZXRMb2NhbEluc3RhbmNlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhzSW5pdE11dGV4KTsKIAotICAgIGlmIChnQ29kZWNMaXN0ID09IE5VTEwpIHsKLSAgICAgICAgZ0NvZGVjTGlzdCA9IG5ldyBNZWRpYUNvZGVjTGlzdDsKLSAgICAgICAgaWYgKGdDb2RlY0xpc3QtPmluaXRDaGVjaygpID09IE9LKSB7Ci0gICAgICAgICAgICBzQ29kZWNMaXN0ID0gZ0NvZGVjTGlzdDsKKyAgICBpZiAoc0NvZGVjTGlzdCA9PSBOVUxMKSB7CisgICAgICAgIE1lZGlhQ29kZWNMaXN0ICpjb2RlY0xpc3QgPSBuZXcgTWVkaWFDb2RlY0xpc3Q7CisgICAgICAgIGlmIChjb2RlY0xpc3QtPmluaXRDaGVjaygpID09IE9LKSB7CisgICAgICAgICAgICBzQ29kZWNMaXN0ID0gY29kZWNMaXN0OworCisgICAgICAgICAgICBpZiAoaXNQcm9maWxpbmdOZWVkZWQoKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJDb2RlYyBwcm9maWxpbmcgbmVlZGVkLCB3aWxsIGJlIHJ1biBpbiBzZXBhcmF0ZWQgdGhyZWFkLiIpOworICAgICAgICAgICAgICAgIHB0aHJlYWRfdCBwcm9maWxlcjsKKyAgICAgICAgICAgICAgICBpZiAocHRocmVhZF9jcmVhdGUoJnByb2ZpbGVyLCBOVUxMLCBwcm9maWxlclRocmVhZFdyYXBwZXIsIE5VTEwpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBjcmVhdGUgdGhyZWFkIGZvciBjb2RlYyBwcm9maWxpbmcuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gZmFpbHVyZSB0byBpbml0aWFsaXplIG1heSBiZSB0ZW1wb3JhcnkuIHJldHJ5IG9uIG5leHQgY2FsbC4KKyAgICAgICAgICAgIGRlbGV0ZSBjb2RlY0xpc3Q7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTk0LDExICsxNzEsMTUgQEAKIH0KIAogTWVkaWFDb2RlY0xpc3Q6Ok1lZGlhQ29kZWNMaXN0KCkKLSAgICA6IG1Jbml0Q2hlY2soTk9fSU5JVCkgeworICAgIDogbUluaXRDaGVjayhOT19JTklUKSwKKyAgICAgIG1VcGRhdGUoZmFsc2UpLAorICAgICAgbUdsb2JhbFNldHRpbmdzKG5ldyBBTWVzc2FnZSgpKSB7CiAgICAgcGFyc2VUb3BMZXZlbFhNTEZpbGUoIi9ldGMvbWVkaWFfY29kZWNzLnhtbCIpOworICAgIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKCIvZXRjL21lZGlhX2NvZGVjc19wZXJmb3JtYW5jZS54bWwiLCB0cnVlLyogaWdub3JlX2Vycm9ycyAqLyk7CisgICAgcGFyc2VUb3BMZXZlbFhNTEZpbGUoa1Byb2ZpbGluZ1Jlc3VsdHMsIHRydWUvKiBpZ25vcmVfZXJyb3JzICovKTsKIH0KIAotdm9pZCBNZWRpYUNvZGVjTGlzdDo6cGFyc2VUb3BMZXZlbFhNTEZpbGUoY29uc3QgY2hhciAqY29kZWNzX3htbCkgewordm9pZCBNZWRpYUNvZGVjTGlzdDo6cGFyc2VUb3BMZXZlbFhNTEZpbGUoY29uc3QgY2hhciAqY29kZWNzX3htbCwgYm9vbCBpZ25vcmVfZXJyb3JzKSB7CiAgICAgLy8gZ2V0IGhyZWZfYmFzZQogICAgIGNoYXIgKmhyZWZfYmFzZV9lbmQgPSBzdHJyY2hyKGNvZGVjc194bWwsICcvJyk7CiAgICAgaWYgKGhyZWZfYmFzZV9lbmQgIT0gTlVMTCkgewpAQCAtMTEyLDIwICsxOTMsNDkgQEAKICAgICBPTVhDbGllbnQgY2xpZW50OwogICAgIG1Jbml0Q2hlY2sgPSBjbGllbnQuY29ubmVjdCgpOwogICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICAgICAgcmV0dXJuOyAgLy8gdGhpcyBtYXkgZmFpbCBpZiBJTWVkaWFQbGF5ZXJTZXJ2aWNlIGlzIG5vdCBhdmFpbGFibGUuCiAgICAgfQogICAgIG1PTVggPSBjbGllbnQuaW50ZXJmYWNlKCk7CiAgICAgcGFyc2VYTUxGaWxlKGNvZGVjc194bWwpOwogICAgIG1PTVguY2xlYXIoKTsKIAogICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIGlmIChpZ25vcmVfZXJyb3JzKSB7CisgICAgICAgICAgICBtSW5pdENoZWNrID0gT0s7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgbUNvZGVjSW5mb3MuY2xlYXIoKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGZvciAoc2l6ZV90IGkgPSBtQ29kZWNJbmZvcy5zaXplKCk7IGktLSA+IDA7KSB7Ci0gICAgICAgIGNvbnN0IE1lZGlhQ29kZWNJbmZvICZpbmZvID0gKm1Db2RlY0luZm9zLml0ZW1BdChpKS5nZXQoKTsKKyAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZVBvbGljeT4gcG9saWNpZXM7CisgICAgQVN0cmluZyB2YWx1ZTsKKyAgICBpZiAobUdsb2JhbFNldHRpbmdzLT5maW5kU3RyaW5nKGtQb2xpY3lTdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzLCAmdmFsdWUpKSB7CisgICAgICAgIHBvbGljaWVzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlUG9saWN5KAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChrUG9saWN5U3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjcyksCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KHZhbHVlLmNfc3RyKCkpKSk7CisgICAgfQorICAgIGlmIChtR2xvYmFsU2V0dGluZ3MtPmZpbmRTdHJpbmcoa1BvbGljeVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjLCAmdmFsdWUpKSB7CisgICAgICAgIHBvbGljaWVzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlUG9saWN5KAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChrUG9saWN5U3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMpLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCh2YWx1ZS5jX3N0cigpKSkpOworICAgIH0KKyAgICBpZiAocG9saWNpZXMuc2l6ZSgpID4gMCkgeworICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5yZXNvdXJjZV9tYW5hZ2VyIikpOworICAgICAgICBzcDxJUmVzb3VyY2VNYW5hZ2VyU2VydmljZT4gc2VydmljZSA9IGludGVyZmFjZV9jYXN0PElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPihiaW5kZXIpOworICAgICAgICBpZiAoc2VydmljZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiTWVkaWFDb2RlY0xpc3Q6IGZhaWxlZCB0byBnZXQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VydmljZS0+Y29uZmlnKHBvbGljaWVzKTsKKyAgICAgICAgfQorICAgIH0KIAorICAgIGZvciAoc2l6ZV90IGkgPSBtQ29kZWNJbmZvcy5zaXplKCk7IGkgPiAwOykgeworICAgICAgICBpLS07CisgICAgICAgIGNvbnN0IE1lZGlhQ29kZWNJbmZvICZpbmZvID0gKm1Db2RlY0luZm9zLml0ZW1BdChpKS5nZXQoKTsKICAgICAgICAgaWYgKGluZm8ubUNhcHMuc2l6ZSgpID09IDApIHsKICAgICAgICAgICAgIC8vIE5vIHR5cGVzIHN1cHBvcnRlZCBieSB0aGlzIGNvbXBvbmVudD8/PwogICAgICAgICAgICAgQUxPR1coIkNvbXBvbmVudCAlcyBkb2VzIG5vdCBzdXBwb3J0IGFueSB0eXBlIG9mIG1lZGlhPyIsCkBAIC0xNjksNiArMjc5LDE2IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiAgICBsZXZlbHM9WyVzXSIsIG5pY2UuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBxdWlya3M7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBpbmZvLm1RdWlya3Muc2l6ZSgpOyBpeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVpcmtzLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHF1aXJrcy5hcHBlbmQoaW5mby5tUXVpcmtzW2l4XSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiAgICBxdWlya3M9WyVzXSIsIHF1aXJrcy5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAjZW5kaWYKICAgICAgICAgfQpAQCAtMzI4LDYgKzQ0OCwxNiBAQAogICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fREVDT0RFUlM7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIkVuY29kZXJzIikpIHsKICAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0VOQ09ERVJTOworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJTZXR0aW5ncyIpKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9TRVRUSU5HUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTRUNUSU9OX1NFVFRJTkdTOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiU2V0dGluZyIpKSB7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IGFkZFNldHRpbmdGcm9tQXR0cmlidXRlcyhhdHRycyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMzk3LDYgKzUyNywxNCBAQAogICAgIH0KIAogICAgIHN3aXRjaCAobUN1cnJlbnRTZWN0aW9uKSB7CisgICAgICAgIGNhc2UgU0VDVElPTl9TRVRUSU5HUzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIlNldHRpbmdzIikpIHsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX1RPUExFVkVMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUlM6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJEZWNvZGVycyIpKSB7CkBAIC00NjIsMTAgKzYwMCw4MSBAQAogICAgIC0tbURlcHRoOwogfQogCitzdGF0dXNfdCBNZWRpYUNvZGVjTGlzdDo6YWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzKGNvbnN0IGNoYXIgKiphdHRycykgeworICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworICAgIGNvbnN0IGNoYXIgKnZhbHVlID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICp1cGRhdGUgPSBOVUxMOworCisgICAgc2l6ZV90IGkgPSAwOworICAgIHdoaWxlIChhdHRyc1tpXSAhPSBOVUxMKSB7CisgICAgICAgIGlmICghc3RyY21wKGF0dHJzW2ldLCAibmFtZSIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpICsgMV07CisgICAgICAgICAgICArK2k7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyc1tpXSwgInZhbHVlIikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsdWUgPSBhdHRyc1tpICsgMV07CisgICAgICAgICAgICArK2k7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyc1tpXSwgInVwZGF0ZSIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZGF0ZSA9IGF0dHJzW2kgKyAxXTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAgICAgKytpOworICAgIH0KKworICAgIGlmIChuYW1lID09IE5VTEwgfHwgdmFsdWUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBtVXBkYXRlID0gKHVwZGF0ZSAhPSBOVUxMKSAmJiBwYXJzZUJvb2xlYW4odXBkYXRlKTsKKyAgICBpZiAobVVwZGF0ZSAhPSBtR2xvYmFsU2V0dGluZ3MtPmNvbnRhaW5zKG5hbWUpKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIG1HbG9iYWxTZXR0aW5ncy0+c2V0U3RyaW5nKG5hbWUsIHZhbHVlKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY0xpc3Q6OnNldEN1cnJlbnRDb2RlY0luZm8oYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp0eXBlKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29kZWNJbmZvcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoQVN0cmluZyhuYW1lKSA9PSBtQ29kZWNJbmZvc1tpXS0+Z2V0Q29kZWNOYW1lKCkpIHsKKyAgICAgICAgICAgIGlmIChtQ29kZWNJbmZvc1tpXS0+Z2V0Q2FwYWJpbGl0aWVzRm9yKHR5cGUpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiT3ZlcnJpZGVzIHdpdGggYW4gdW5leHBlY3RlZCBtaW1lICVzIiwgdHlwZSk7CisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IE1lZGlhQ29kZWNJbmZvIChidXQgZG9uJ3QgYWRkIGl0IHRvIG1Db2RlY0luZm9zKSB0byBob2xkIHRoZQorICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRlcyB3ZSBkb24ndCB3YW50LgorICAgICAgICAgICAgICAgIG1DdXJyZW50SW5mbyA9IG5ldyBNZWRpYUNvZGVjSW5mbyhuYW1lLCBlbmNvZGVyLCB0eXBlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRJbmZvID0gbUNvZGVjSW5mb3MuZWRpdEl0ZW1BdChpKTsKKyAgICAgICAgICAgICAgICBtQ3VycmVudEluZm8tPnVwZGF0ZU1pbWUodHlwZSk7ICAvLyB0byBzZXQgdGhlIGN1cnJlbnQgY2FwCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgbUN1cnJlbnRJbmZvID0gbmV3IE1lZGlhQ29kZWNJbmZvKG5hbWUsIGVuY29kZXIsIHR5cGUpOworICAgIC8vIFRoZSBuZXh0IHN0ZXAgaW52b2x2ZXMgdHJ5aW5nIHRvIGxvYWQgdGhlIGNvZGVjLCB3aGljaCBtYXkKKyAgICAvLyBmYWlsLiAgT25seSBsaXN0IHRoZSBjb2RlYyBpZiB0aGlzIHN1Y2NlZWRzLgorICAgIC8vIEhvd2V2ZXIsIGtlZXAgbUN1cnJlbnRJbmZvIG9iamVjdCBhcm91bmQgdW50aWwgcGFyc2luZworICAgIC8vIG9mIGZ1bGwgY29kZWMgaW5mbyBpcyBjb21wbGV0ZWQuCisgICAgaWYgKGluaXRpYWxpemVDYXBhYmlsaXRpZXModHlwZSkgPT0gT0spIHsKKyAgICAgICAgbUNvZGVjSW5mb3MucHVzaF9iYWNrKG1DdXJyZW50SW5mbyk7CisgICAgfQorfQorCiBzdGF0dXNfdCBNZWRpYUNvZGVjTGlzdDo6YWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzKAogICAgICAgICBib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKiphdHRycykgewogICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwogICAgIGNvbnN0IGNoYXIgKnR5cGUgPSBOVUxMOworICAgIGNvbnN0IGNoYXIgKnVwZGF0ZSA9IE5VTEw7CiAKICAgICBzaXplX3QgaSA9IDA7CiAgICAgd2hpbGUgKGF0dHJzW2ldICE9IE5VTEwpIHsKQEAgLTQ4MSw2ICs2OTAsMTIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHR5cGUgPSBhdHRyc1tpICsgMV07CiAgICAgICAgICAgICArK2k7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyc1tpXSwgInVwZGF0ZSIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZGF0ZSA9IGF0dHJzW2kgKyAxXTsKKyAgICAgICAgICAgICsraTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICB9CkBAIC00OTIsMTQgKzcwNywzOSBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICBtQ3VycmVudEluZm8gPSBuZXcgTWVkaWFDb2RlY0luZm8obmFtZSwgZW5jb2RlciwgdHlwZSk7Ci0gICAgLy8gVGhlIG5leHQgc3RlcCBpbnZvbHZlcyB0cnlpbmcgdG8gbG9hZCB0aGUgY29kZWMsIHdoaWNoIG1heQotICAgIC8vIGZhaWwuICBPbmx5IGxpc3QgdGhlIGNvZGVjIGlmIHRoaXMgc3VjY2VlZHMuCi0gICAgLy8gSG93ZXZlciwga2VlcCBtQ3VycmVudEluZm8gb2JqZWN0IGFyb3VuZCB1bnRpbCBwYXJzaW5nCi0gICAgLy8gb2YgZnVsbCBjb2RlYyBpbmZvIGlzIGNvbXBsZXRlZC4KLSAgICBpZiAoaW5pdGlhbGl6ZUNhcGFiaWxpdGllcyh0eXBlKSA9PSBPSykgewotICAgICAgICBtQ29kZWNJbmZvcy5wdXNoX2JhY2sobUN1cnJlbnRJbmZvKTsKKyAgICBtVXBkYXRlID0gKHVwZGF0ZSAhPSBOVUxMKSAmJiBwYXJzZUJvb2xlYW4odXBkYXRlKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gLTE7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29kZWNJbmZvcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoQVN0cmluZyhuYW1lKSA9PSBtQ29kZWNJbmZvc1tpXS0+Z2V0Q29kZWNOYW1lKCkpIHsKKyAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgfQogICAgIH0KKyAgICBpZiAobVVwZGF0ZSAhPSAoaW5kZXggPj0gMCkpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgLy8gZXhpc3RpbmcgY29kZWMKKyAgICAgICAgbUN1cnJlbnRJbmZvID0gbUNvZGVjSW5mb3MuZWRpdEl0ZW1BdChpbmRleCk7CisgICAgICAgIGlmICh0eXBlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIGV4aXN0aW5nIHR5cGUKKyAgICAgICAgICAgIGlmIChtQ29kZWNJbmZvc1tpbmRleF0tPmdldENhcGFiaWxpdGllc0Zvcih0eXBlKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ3VycmVudEluZm8tPnVwZGF0ZU1pbWUodHlwZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBuZXcgY29kZWMKKyAgICAgICAgbUN1cnJlbnRJbmZvID0gbmV3IE1lZGlhQ29kZWNJbmZvKG5hbWUsIGVuY29kZXIsIHR5cGUpOworICAgICAgICAvLyBUaGUgbmV4dCBzdGVwIGludm9sdmVzIHRyeWluZyB0byBsb2FkIHRoZSBjb2RlYywgd2hpY2ggbWF5CisgICAgICAgIC8vIGZhaWwuICBPbmx5IGxpc3QgdGhlIGNvZGVjIGlmIHRoaXMgc3VjY2VlZHMuCisgICAgICAgIC8vIEhvd2V2ZXIsIGtlZXAgbUN1cnJlbnRJbmZvIG9iamVjdCBhcm91bmQgdW50aWwgcGFyc2luZworICAgICAgICAvLyBvZiBmdWxsIGNvZGVjIGluZm8gaXMgY29tcGxldGVkLgorICAgICAgICBpZiAoaW5pdGlhbGl6ZUNhcGFiaWxpdGllcyh0eXBlKSA9PSBPSykgeworICAgICAgICAgICAgbUNvZGVjSW5mb3MucHVzaF9iYWNrKG1DdXJyZW50SW5mbyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTU1Myw2ICs3OTMsNyBAQAogCiBzdGF0dXNfdCBNZWRpYUNvZGVjTGlzdDo6YWRkVHlwZUZyb21BdHRyaWJ1dGVzKGNvbnN0IGNoYXIgKiphdHRycykgewogICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworICAgIGNvbnN0IGNoYXIgKnVwZGF0ZSA9IE5VTEw7CiAKICAgICBzaXplX3QgaSA9IDA7CiAgICAgd2hpbGUgKGF0dHJzW2ldICE9IE5VTEwpIHsKQEAgLTU2Miw2ICs4MDMsMTIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpICsgMV07CiAgICAgICAgICAgICArK2k7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyc1tpXSwgInVwZGF0ZSIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZGF0ZSA9IGF0dHJzW2kgKyAxXTsKKyAgICAgICAgICAgICsraTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICB9CkBAIC01NzMsMTQgKzgyMCwyNSBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICBzdGF0dXNfdCByZXQgPSBtQ3VycmVudEluZm8tPmFkZE1pbWUobmFtZSk7CisgICAgYm9vbCBpc0V4aXN0aW5nVHlwZSA9IChtQ3VycmVudEluZm8tPmdldENhcGFiaWxpdGllc0ZvcihuYW1lKSAhPSBOVUxMKTsKKyAgICBpZiAobVVwZGF0ZSAhPSBpc0V4aXN0aW5nVHlwZSkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXQ7CisgICAgaWYgKG1VcGRhdGUpIHsKKyAgICAgICAgcmV0ID0gbUN1cnJlbnRJbmZvLT51cGRhdGVNaW1lKG5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IG1DdXJyZW50SW5mby0+YWRkTWltZShuYW1lKTsKKyAgICB9CisKICAgICBpZiAocmV0ICE9IE9LKSB7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCiAgICAgLy8gVGhlIG5leHQgc3RlcCBpbnZvbHZlcyB0cnlpbmcgdG8gbG9hZCB0aGUgY29kZWMsIHdoaWNoIG1heQogICAgIC8vIGZhaWwuICBIYW5kbGUgdGhpcyBncmFjZWZ1bGx5IChieSBub3QgcmVwb3J0aW5nIHN1Y2ggbWltZSkuCi0gICAgaWYgKGluaXRpYWxpemVDYXBhYmlsaXRpZXMobmFtZSkgIT0gT0spIHsKKyAgICBpZiAoIW1VcGRhdGUgJiYgaW5pdGlhbGl6ZUNhcGFiaWxpdGllcyhuYW1lKSAhPSBPSykgewogICAgICAgICBtQ3VycmVudEluZm8tPnJlbW92ZU1pbWUobmFtZSk7CiAgICAgfQogICAgIHJldHVybiBPSzsKQEAgLTY3NSwxNCArOTMzLDE2IEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIC8vIHNpemUsIGJsb2NrcywgYml0cmF0ZSwgZnJhbWUtcmF0ZSwgYmxvY2tzLXBlci1zZWNvbmQsIGFzcGVjdC1yYXRpbzogcmFuZ2UKKyAgICAvLyBzaXplLCBibG9ja3MsIGJpdHJhdGUsIGZyYW1lLXJhdGUsIGJsb2Nrcy1wZXItc2Vjb25kLCBhc3BlY3QtcmF0aW8sCisgICAgLy8gbWVhc3VyZWQtZnJhbWUtcmF0ZSwgbWVhc3VyZWQtYmxvY2tzLXBlci1zZWNvbmQ6IHJhbmdlCiAgICAgLy8gcXVhbGl0eTogcmFuZ2UgKyBkZWZhdWx0ICsgW3NjYWxlXQogICAgIC8vIGNvbXBsZXhpdHk6IHJhbmdlICsgZGVmYXVsdAogICAgIGJvb2wgZm91bmQ7CiAKICAgICBpZiAobmFtZSA9PSAiYXNwZWN0LXJhdGlvIiB8fCBuYW1lID09ICJiaXRyYXRlIiB8fCBuYW1lID09ICJibG9jay1jb3VudCIKICAgICAgICAgICAgIHx8IG5hbWUgPT0gImJsb2Nrcy1wZXItc2Vjb25kIiB8fCBuYW1lID09ICJjb21wbGV4aXR5IgotICAgICAgICAgICAgfHwgbmFtZSA9PSAiZnJhbWUtcmF0ZSIgfHwgbmFtZSA9PSAicXVhbGl0eSIgfHwgbmFtZSA9PSAic2l6ZSIpIHsKKyAgICAgICAgICAgIHx8IG5hbWUgPT0gImZyYW1lLXJhdGUiIHx8IG5hbWUgPT0gInF1YWxpdHkiIHx8IG5hbWUgPT0gInNpemUiCisgICAgICAgICAgICB8fCBuYW1lID09ICJtZWFzdXJlZC1ibG9ja3MtcGVyLXNlY29uZCIgfHwgbmFtZS5zdGFydHNXaXRoKCJtZWFzdXJlZC1mcmFtZS1yYXRlLSIpKSB7CiAgICAgICAgIEFTdHJpbmcgbWluLCBtYXg7CiAgICAgICAgIGlmIChtc2ctPmZpbmRTdHJpbmcoIm1pbiIsICZtaW4pICYmIG1zZy0+ZmluZFN0cmluZygibWF4IiwgJm1heCkpIHsKICAgICAgICAgICAgIG1pbi5hcHBlbmQoIi0iKTsKQEAgLTc0Niw3ICsxMDA2LDcgQEAKICAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgImRlZmF1bHQiKTsKICAgICAgICAgfSBlbHNlIGlmIChtc2ctPmNvbnRhaW5zKCJpbiIpKSB7CiAgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJpbiIpOwotICAgICAgICB9IGVsc2UgaWYgKChuYW1lID09ICJjaGFubmVsLWNvdW50IikgXgorICAgICAgICB9IGVsc2UgaWYgKChuYW1lID09ICJjaGFubmVsLWNvdW50IiB8fCBuYW1lID09ICJjb25jdXJyZW50LWluc3RhbmNlcyIpIF4KICAgICAgICAgICAgICAgICAoZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoIm1heCIsICZtYXgpKSkgewogICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAibWF4IiwgZm91bmQpOwogICAgICAgICB9IGVsc2UgaWYgKG1zZy0+Y29udGFpbnMoIm1pbiIpKSB7CkBAIC03ODAsMTUgKzEwNDAsNiBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdGljIGJvb2wgcGFyc2VCb29sZWFuKGNvbnN0IGNoYXIgKnMpIHsKLSAgICBpZiAoIXN0cmNhc2VjbXAocywgInRydWUiKSB8fCAhc3RyY2FzZWNtcChzLCAieWVzIikgfHwgIXN0cmNhc2VjbXAocywgInkiKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2hhciAqZW5kOwotICAgIHVuc2lnbmVkIGxvbmcgcmVzID0gc3RydG91bChzLCAmZW5kLCAxMCk7Ci0gICAgcmV0dXJuICpzICE9ICdcMCcgJiYgKmVuZCA9PSAnXDAnICYmIHJlcyA+IDA7Ci19Ci0KIHN0YXR1c190IE1lZGlhQ29kZWNMaXN0OjphZGRGZWF0dXJlKGNvbnN0IGNoYXIgKiphdHRycykgewogICAgIHNpemVfdCBpID0gMDsKICAgICBjb25zdCBjaGFyICpuYW1lID0gTlVMTDsKQEAgLTg2MCw0ICsxMTExLDggQEAKICAgICByZXR1cm4gbUNvZGVjSW5mb3Muc2l6ZSgpOwogfQogCitjb25zdCBzcDxBTWVzc2FnZT4gTWVkaWFDb2RlY0xpc3Q6OmdldEdsb2JhbFNldHRpbmdzKCkgY29uc3QgeworICAgIHJldHVybiBtR2xvYmFsU2V0dGluZ3M7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVjMzZiNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcApAQCAtMCwwICsxLDQyMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYUNvZGVjTGlzdE92ZXJyaWRlcyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIk1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmgiCisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUNvZGVjTGlzdC5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNJbmZvLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFSZXNvdXJjZVBvbGljeS5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0lWQ29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0IGNoYXIgKmtQcm9maWxpbmdSZXN1bHRzID0gIi9kYXRhL21pc2MvbWVkaWEvbWVkaWFfY29kZWNzX3Byb2ZpbGluZ19yZXN1bHRzLnhtbCI7CisKK0FTdHJpbmcgZ2V0UHJvZmlsaW5nVmVyc2lvblN0cmluZygpIHsKKyAgICBjaGFyIHZhbFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoInJvLmJ1aWxkLmRpc3BsYXkuaWQiLCB2YWwsIE5VTEwpICYmIChzdHJsZW4odmFsKSA+IDApKSB7CisgICAgICAgIHJldHVybiBBU3RyaW5nUHJpbnRmKCI8IS0tIFByb2ZpbGVkLXdpdGg6ICVzIC0tPiIsIHZhbCk7CisgICAgfQorCisgICAgcmV0dXJuICI8IS0tIFByb2ZpbGVkLXdpdGg6IFVOS05PV05fQlVJTERfSUQgLS0+IjsKK30KKworLy8gYSBsaW1pdCB0byBhdm9pZCBhbGxvY2F0aW5nIHVucmVhc29uYWJsZSBudW1iZXIgb2YgY29kZWMgaW5zdGFuY2VzIGluIHRoZSBtZWFzdXJlbWVudC4KKy8vIHRoaXMgc2hvdWxkIGJlIGluIHN5bmMgd2l0aCB0aGUgTUFYX1NVUFBPUlRFRF9JTlNUQU5DRVMgZGVmaW5lZCBpbiBNZWRpYUNvZGVjSW5mby5qYXZhLgorc3RhdGljIGNvbnN0IGludCBrTWF4SW5zdGFuY2VzID0gMzI7CisKKy8vIFRPRE86IG1vdmUgTWVkaWFDb2RlY0luZm8gdG8gQysrLiBVbnRpbCB0aGVuLCBzb21lIHRlbXAgbWV0aG9kcyB0byBwYXJzZSBvdXQgaW5mby4KK3N0YXRpYyBib29sIGdldE1lYXN1cmVTaXplKHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+IGNhcHMsIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpIHsKKyAgICBBU3RyaW5nIHNpemVSYW5nZTsKKyAgICBpZiAoIWNhcHMtPmdldERldGFpbHMoKS0+ZmluZFN0cmluZygic2l6ZS1yYW5nZSIsICZzaXplUmFuZ2UpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQVN0cmluZyBtaW5TaXplOworICAgIEFTdHJpbmcgbWF4U2l6ZTsKKyAgICBpZiAoIXNwbGl0U3RyaW5nKHNpemVSYW5nZSwgIi0iLCAmbWluU2l6ZSwgJm1heFNpemUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQVN0cmluZyBzV2lkdGg7CisgICAgQVN0cmluZyBzSGVpZ2h0OworICAgIGlmICghc3BsaXRTdHJpbmcobWluU2l6ZSwgIngiLCAmc1dpZHRoLCAmc0hlaWdodCkpIHsKKyAgICAgICAgaWYgKCFzcGxpdFN0cmluZyhtaW5TaXplLCAiKiIsICZzV2lkdGgsICZzSGVpZ2h0KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgKndpZHRoID0gc3RydG9sKHNXaWR0aC5jX3N0cigpLCBOVUxMLCAxMCk7CisgICAgKmhlaWdodCA9IHN0cnRvbChzSGVpZ2h0LmNfc3RyKCksIE5VTEwsIDEwKTsKKyAgICByZXR1cm4gKCp3aWR0aCA+IDApICYmICgqaGVpZ2h0ID4gMCk7Cit9CisKK3N0YXRpYyB2b2lkIGdldE1lYXN1cmVCaXRyYXRlKHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+IGNhcHMsIGludDMyX3QgKmJpdHJhdGUpIHsKKyAgICAvLyBVbnRpbCBoYXZlIG5hdGl2ZSBNZWRpYUNvZGVjSW5mbywgd2UgY2Fubm90IGdldCBiaXRyYXRlcyBiYXNlZCBvbiBwcm9maWxlL2xldmVscy4KKyAgICAvLyBXZSB1c2UgMjAwMDAwIGFzIGRlZmF1bHQgdmFsdWUgZm9yIG91ciBtZWFzdXJlbWVudC4KKyAgICAqYml0cmF0ZSA9IDIwMDAwMDsKKyAgICBBU3RyaW5nIGJpdHJhdGVSYW5nZTsKKyAgICBpZiAoIWNhcHMtPmdldERldGFpbHMoKS0+ZmluZFN0cmluZygiYml0cmF0ZS1yYW5nZSIsICZiaXRyYXRlUmFuZ2UpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVN0cmluZyBtaW5CaXRyYXRlOworICAgIEFTdHJpbmcgbWF4Qml0cmF0ZTsKKyAgICBpZiAoIXNwbGl0U3RyaW5nKGJpdHJhdGVSYW5nZSwgIi0iLCAmbWluQml0cmF0ZSwgJm1heEJpdHJhdGUpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAqYml0cmF0ZSA9IHN0cnRvbChtaW5CaXRyYXRlLmNfc3RyKCksIE5VTEwsIDEwKTsKK30KKworc3RhdGljIHNwPEFNZXNzYWdlPiBnZXRNZWFzdXJlRm9ybWF0KAorICAgICAgICBib29sIGlzRW5jb2RlciwgQVN0cmluZyBtaW1lLCBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPiBjYXBzKSB7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgbWltZSk7CisKKyAgICBpZiAoaXNFbmNvZGVyKSB7CisgICAgICAgIGludDMyX3QgYml0cmF0ZSA9IDA7CisgICAgICAgIGdldE1lYXN1cmVCaXRyYXRlKGNhcHMsICZiaXRyYXRlKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiYml0cmF0ZSIsIGJpdHJhdGUpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJlbmNvZGVyIiwgMSk7CisgICAgfQorCisgICAgaWYgKG1pbWUuc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKKyAgICAgICAgaW50MzJfdCB3aWR0aCA9IDA7CisgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gMDsKKyAgICAgICAgaWYgKCFnZXRNZWFzdXJlU2l6ZShjYXBzLCAmd2lkdGgsICZoZWlnaHQpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBmb3JtYXQtPnNldEludDMyKCJ3aWR0aCIsIHdpZHRoKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiaGVpZ2h0IiwgaGVpZ2h0KTsKKworICAgICAgICBWZWN0b3I8dWludDMyX3Q+IGNvbG9yRm9ybWF0czsKKyAgICAgICAgY2Fwcy0+Z2V0U3VwcG9ydGVkQ29sb3JGb3JtYXRzKCZjb2xvckZvcm1hdHMpOworICAgICAgICBpZiAoY29sb3JGb3JtYXRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBmb3JtYXQtPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBjb2xvckZvcm1hdHNbMF0pOworCisgICAgICAgIGZvcm1hdC0+c2V0RmxvYXQoImZyYW1lLXJhdGUiLCAxMC4wKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiaS1mcmFtZS1pbnRlcnZhbCIsIDEwKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBUT0RPOiBwcm9maWxlIGh3IGF1ZGlvCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBmb3JtYXQ7Cit9CisKK3N0YXRpYyBzaXplX3QgZG9Qcm9maWxlRW5jb2RlcklucHV0QnVmZmVycygKKyAgICAgICAgQVN0cmluZyBuYW1lLCBBU3RyaW5nIG1pbWUsIHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+IGNhcHMpIHsKKyAgICBBTE9HVigiZG9Qcm9maWxlRW5jb2RlcklucHV0QnVmZmVyczogbmFtZSAlcywgbWltZSAlcyIsIG5hbWUuY19zdHIoKSwgbWltZS5jX3N0cigpKTsKKworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBnZXRNZWFzdXJlRm9ybWF0KHRydWUgLyogaXNFbmNvZGVyICovLCBtaW1lLCBjYXBzKTsKKyAgICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZm9ybWF0LT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWUpOworICAgIEFMT0dWKCJkb1Byb2ZpbGVFbmNvZGVySW5wdXRCdWZmZXJzOiBmb3JtYXQgJXMiLCBmb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBzcDxBTG9vcGVyPiBsb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBsb29wZXItPnNldE5hbWUoIk1lZGlhQ29kZWNfbG9vcGVyIik7CisgICAgbG9vcGVyLT5zdGFydCgKKyAgICAgICAgICAgIGZhbHNlIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLywgZmFsc2UgLyogY2FuQ2FsbEphdmEgKi8sIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworCisgICAgc3A8TWVkaWFDb2RlYz4gY29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUobG9vcGVyLCBuYW1lLmNfc3RyKCksICZlcnIpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgY29kZWM6ICVzIiwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZXJyID0gY29kZWMtPmNvbmZpZ3VyZShmb3JtYXQsIE5VTEwsIE5VTEwsIE1lZGlhQ29kZWM6OkNPTkZJR1VSRV9GTEFHX0VOQ09ERSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNvbmZpZ3VyZSBjb2RlYzogJXMgd2l0aCBtaW1lOiAlcyIsIG5hbWUuY19zdHIoKSwgbWltZS5jX3N0cigpKTsKKyAgICAgICAgY29kZWMtPnJlbGVhc2UoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gYnVmZmVyUHJvZHVjZXI7CisgICAgZXJyID0gY29kZWMtPmNyZWF0ZUlucHV0U3VyZmFjZSgmYnVmZmVyUHJvZHVjZXIpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgc3VyZmFjZTogJXMgd2l0aCBtaW1lOiAlcyIsIG5hbWUuY19zdHIoKSwgbWltZS5jX3N0cigpKTsKKyAgICAgICAgY29kZWMtPnJlbGVhc2UoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaW50IG1pblVuZGVxdWV1ZWQgPSAwOworICAgIGVyciA9IGJ1ZmZlclByb2R1Y2VyLT5xdWVyeSgKKyAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfTUlOX1VOREVRVUVVRURfQlVGRkVSUywgJm1pblVuZGVxdWV1ZWQpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBxdWVyeSBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMiKTsKKyAgICAgICAgbWluVW5kZXF1ZXVlZCA9IDA7CisgICAgfQorCisgICAgZXJyID0gY29kZWMtPnJlbGVhc2UoKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcmVsZWFzZSBjb2RlYzogJXMgd2l0aCBtaW1lOiAlcyIsIG5hbWUuY19zdHIoKSwgbWltZS5jX3N0cigpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbWluVW5kZXF1ZXVlZDsKK30KKworc3RhdGljIHNpemVfdCBkb1Byb2ZpbGVDb2RlY3MoCisgICAgICAgIGJvb2wgaXNFbmNvZGVyLCBBU3RyaW5nIG5hbWUsIEFTdHJpbmcgbWltZSwgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gY2FwcykgeworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBnZXRNZWFzdXJlRm9ybWF0KGlzRW5jb2RlciwgbWltZSwgY2Fwcyk7CisgICAgaWYgKGZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBBTE9HVigiZG9Qcm9maWxlQ29kZWNzICVzICVzICVzICVzIiwKKyAgICAgICAgICAgIG5hbWUuY19zdHIoKSwgbWltZS5jX3N0cigpLCBpc0VuY29kZXIgPyAiZW5jb2RlciIgOiAiZGVjb2RlciIsCisgICAgICAgICAgICBmb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBWZWN0b3I8c3A8TWVkaWFDb2RlYz4+IGNvZGVjczsKKyAgICB3aGlsZSAoZXJyID09IE9LICYmIGNvZGVjcy5zaXplKCkgPCBrTWF4SW5zdGFuY2VzKSB7CisgICAgICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgICAgICBsb29wZXItPnNldE5hbWUoIk1lZGlhQ29kZWNfbG9vcGVyIik7CisgICAgICAgIEFMT0dWKCJkb1Byb2ZpbGVDb2RlY3MgZm9yIGNvZGVjICMlenUiLCBjb2RlY3Muc2l6ZSgpKTsKKyAgICAgICAgQUxPR1YoImRvUHJvZmlsZUNvZGVjcyBzdGFydCBsb29wZXIiKTsKKyAgICAgICAgbG9vcGVyLT5zdGFydCgKKyAgICAgICAgICAgICAgICBmYWxzZSAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8sIGZhbHNlIC8qIGNhbkNhbGxKYXZhICovLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKKyAgICAgICAgQUxPR1YoImRvUHJvZmlsZUNvZGVjcyBDcmVhdGVCeUNvbXBvbmVudE5hbWUiKTsKKyAgICAgICAgc3A8TWVkaWFDb2RlYz4gY29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUobG9vcGVyLCBuYW1lLmNfc3RyKCksICZlcnIpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVigiRmFpbGVkIHRvIGNyZWF0ZSBjb2RlYzogJXMiLCBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gbmF0aXZlV2luZG93OworICAgICAgICBjb25zdCBzcDxJQ3J5cHRvPiBjcnlwdG87CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gaXNFbmNvZGVyID8gTWVkaWFDb2RlYzo6Q09ORklHVVJFX0ZMQUdfRU5DT0RFIDogMDsKKyAgICAgICAgQUxPR1YoImRvUHJvZmlsZUNvZGVjcyBjb25maWd1cmUiKTsKKyAgICAgICAgZXJyID0gY29kZWMtPmNvbmZpZ3VyZShmb3JtYXQsIG5hdGl2ZVdpbmRvdywgY3J5cHRvLCBmbGFncyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dWKCJGYWlsZWQgdG8gY29uZmlndXJlIGNvZGVjOiAlcyB3aXRoIG1pbWU6ICVzIiwgbmFtZS5jX3N0cigpLCBtaW1lLmNfc3RyKCkpOworICAgICAgICAgICAgY29kZWMtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJkb1Byb2ZpbGVDb2RlY3Mgc3RhcnQiKTsKKyAgICAgICAgZXJyID0gY29kZWMtPnN0YXJ0KCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dWKCJGYWlsZWQgdG8gc3RhcnQgY29kZWM6ICVzIHdpdGggbWltZTogJXMiLCBuYW1lLmNfc3RyKCksIG1pbWUuY19zdHIoKSk7CisgICAgICAgICAgICBjb2RlYy0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29kZWNzLnB1c2hfYmFjayhjb2RlYyk7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb2RlY3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgQUxPR1YoImRvUHJvZmlsZUNvZGVjcyByZWxlYXNlICVzIiwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgZXJyID0gY29kZWNzW2ldLT5yZWxlYXNlKCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVsZWFzZSBjb2RlYzogJXMgd2l0aCBtaW1lOiAlcyIsIG5hbWUuY19zdHIoKSwgbWltZS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjb2RlY3Muc2l6ZSgpOworfQorCitib29sIHNwbGl0U3RyaW5nKGNvbnN0IEFTdHJpbmcgJnMsIGNvbnN0IEFTdHJpbmcgJmRlbGltaXRlciwgQVN0cmluZyAqczEsIEFTdHJpbmcgKnMyKSB7CisgICAgc3NpemVfdCBwb3MgPSBzLmZpbmQoZGVsaW1pdGVyLmNfc3RyKCkpOworICAgIGlmIChwb3MgPCAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgKnMxID0gQVN0cmluZyhzLCAwLCBwb3MpOworICAgICpzMiA9IEFTdHJpbmcocywgcG9zICsgMSwgcy5zaXplKCkgLSBwb3MgLSAxKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBzcGxpdFN0cmluZygKKyAgICAgICAgY29uc3QgQVN0cmluZyAmcywgY29uc3QgQVN0cmluZyAmZGVsaW1pdGVyLCBBU3RyaW5nICpzMSwgQVN0cmluZyAqczIsIEFTdHJpbmcgKnMzKSB7CisgICAgQVN0cmluZyB0ZW1wOworICAgIGlmICghc3BsaXRTdHJpbmcocywgZGVsaW1pdGVyLCBzMSwgJnRlbXApKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFzcGxpdFN0cmluZyh0ZW1wLCBkZWxpbWl0ZXIsIHMyLCBzMykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBwcm9maWxlQ29kZWNzKGNvbnN0IFZlY3RvcjxzcDxNZWRpYUNvZGVjSW5mbz4+ICZpbmZvcykgeworICAgIENvZGVjU2V0dGluZ3MgZ2xvYmFsX3Jlc3VsdHM7CisgICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgQ29kZWNTZXR0aW5ncz4gZW5jb2Rlcl9yZXN1bHRzOworICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIENvZGVjU2V0dGluZ3M+IGRlY29kZXJfcmVzdWx0czsKKyAgICBwcm9maWxlQ29kZWNzKGluZm9zLCAmZ2xvYmFsX3Jlc3VsdHMsICZlbmNvZGVyX3Jlc3VsdHMsICZkZWNvZGVyX3Jlc3VsdHMpOworICAgIGV4cG9ydFJlc3VsdHNUb1hNTChrUHJvZmlsaW5nUmVzdWx0cywgZ2xvYmFsX3Jlc3VsdHMsIGVuY29kZXJfcmVzdWx0cywgZGVjb2Rlcl9yZXN1bHRzKTsKK30KKwordm9pZCBwcm9maWxlQ29kZWNzKAorICAgICAgICBjb25zdCBWZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PiAmaW5mb3MsCisgICAgICAgIENvZGVjU2V0dGluZ3MgKmdsb2JhbF9yZXN1bHRzLAorICAgICAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBDb2RlY1NldHRpbmdzPiAqZW5jb2Rlcl9yZXN1bHRzLAorICAgICAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBDb2RlY1NldHRpbmdzPiAqZGVjb2Rlcl9yZXN1bHRzLAorICAgICAgICBib29sIGZvcmNlVG9NZWFzdXJlKSB7CisgICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4+IGNvZGVjc05lZWRNZWFzdXJlOworICAgIEFTdHJpbmcgc3VwcG9ydE11bHRpcGxlU2VjdXJlQ29kZWNzID0gInRydWUiOworICAgIHNpemVfdCBtYXhFbmNvZGVySW5wdXRCdWZmZXJzID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluZm9zLnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gaW5mb3NbaV07CisgICAgICAgIEFTdHJpbmcgbmFtZSA9IGluZm8tPmdldENvZGVjTmFtZSgpOworICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJPTVguZ29vZ2xlLiIpIHx8CisgICAgICAgICAgICAgICAgLy8gVE9ETzogcmVlbmFibGUgYmVsb3cgY29kZWNzIG9uY2UgZml4ZWQKKyAgICAgICAgICAgICAgICBuYW1lID09ICJPTVguSW50ZWwuVmlkZW9EZWNvZGVyLlZQOS5oeWJyaWQiKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIFZlY3RvcjxBU3RyaW5nPiBtaW1lczsKKyAgICAgICAgaW5mby0+Z2V0U3VwcG9ydGVkTWltZXMoJm1pbWVzKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtaW1lcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gJmNhcHMgPQorICAgICAgICAgICAgICAgICAgICBpbmZvLT5nZXRDYXBhYmlsaXRpZXNGb3IobWltZXNbaV0uY19zdHIoKSk7CisgICAgICAgICAgICBpZiAoIWZvcmNlVG9NZWFzdXJlICYmCisgICAgICAgICAgICAgICAgKGNhcHMtPmdldERldGFpbHMoKS0+Y29udGFpbnMoIm1heC1zdXBwb3J0ZWQtaW5zdGFuY2VzIikgfHwKKyAgICAgICAgICAgICAgICAgY2Fwcy0+Z2V0RGV0YWlscygpLT5jb250YWlucygibWF4LWNvbmN1cnJlbnQtaW5zdGFuY2VzIikpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNpemVfdCBtYXggPSBkb1Byb2ZpbGVDb2RlY3MoaW5mby0+aXNFbmNvZGVyKCksIG5hbWUsIG1pbWVzW2ldLCBjYXBzKTsKKyAgICAgICAgICAgIGlmIChtYXggPiAwKSB7CisgICAgICAgICAgICAgICAgQ29kZWNTZXR0aW5ncyBzZXR0aW5nczsKKyAgICAgICAgICAgICAgICBjaGFyIG1heFN0clszMl07CisgICAgICAgICAgICAgICAgc3ByaW50ZihtYXhTdHIsICIlenUiLCBtYXgpOworICAgICAgICAgICAgICAgIHNldHRpbmdzLmFkZCgibWF4LXN1cHBvcnRlZC1pbnN0YW5jZXMiLCBtYXhTdHIpOworCisgICAgICAgICAgICAgICAgQVN0cmluZyBrZXkgPSBuYW1lOworICAgICAgICAgICAgICAgIGtleS5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgICAgICBrZXkuYXBwZW5kKG1pbWVzW2ldKTsKKworICAgICAgICAgICAgICAgIGlmIChpbmZvLT5pc0VuY29kZXIoKSkgeworICAgICAgICAgICAgICAgICAgICBlbmNvZGVyX3Jlc3VsdHMtPmFkZChrZXksIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkZWNvZGVyX3Jlc3VsdHMtPmFkZChrZXksIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobmFtZS5lbmRzV2l0aCgiLnNlY3VyZSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYXggPD0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydE11bHRpcGxlU2VjdXJlQ29kZWNzID0gImZhbHNlIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaW5mby0+aXNFbmNvZGVyKCkgJiYgbWltZXNbaV0uc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGVuY29kZXJJbnB1dEJ1ZmZlcnMgPQorICAgICAgICAgICAgICAgICAgICAgICAgZG9Qcm9maWxlRW5jb2RlcklucHV0QnVmZmVycyhuYW1lLCBtaW1lc1tpXSwgY2Fwcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGVySW5wdXRCdWZmZXJzID4gbWF4RW5jb2RlcklucHV0QnVmZmVycykgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4RW5jb2RlcklucHV0QnVmZmVycyA9IGVuY29kZXJJbnB1dEJ1ZmZlcnM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1heEVuY29kZXJJbnB1dEJ1ZmZlcnMgPiAwKSB7CisgICAgICAgIGNoYXIgdG1wWzMyXTsKKyAgICAgICAgc3ByaW50Zih0bXAsICIlenUiLCBtYXhFbmNvZGVySW5wdXRCdWZmZXJzKTsKKyAgICAgICAgZ2xvYmFsX3Jlc3VsdHMtPmFkZChrTWF4RW5jb2RlcklucHV0QnVmZmVycywgdG1wKTsKKyAgICB9CisgICAgZ2xvYmFsX3Jlc3VsdHMtPmFkZChrUG9saWN5U3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjcywgc3VwcG9ydE11bHRpcGxlU2VjdXJlQ29kZWNzKTsKK30KKworc3RhdGljIEFTdHJpbmcgZ2xvYmFsUmVzdWx0c1RvWG1sKGNvbnN0IENvZGVjU2V0dGluZ3MmIHJlc3VsdHMpIHsKKyAgICBBU3RyaW5nIHJldDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc3VsdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgQVN0cmluZyBzZXR0aW5nID0gQVN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAiICAgICAgICA8U2V0dGluZyBuYW1lPVwiJXNcIiB2YWx1ZT1cIiVzXCIgLz5cbiIsCisgICAgICAgICAgICAgICAgcmVzdWx0cy5rZXlBdChpKS5jX3N0cigpLAorICAgICAgICAgICAgICAgIHJlc3VsdHMudmFsdWVBdChpKS5jX3N0cigpKTsKKyAgICAgICAgcmV0LmFwcGVuZChzZXR0aW5nKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEFTdHJpbmcgY29kZWNSZXN1bHRzVG9YbWwoY29uc3QgS2V5ZWRWZWN0b3I8QVN0cmluZywgQ29kZWNTZXR0aW5ncz4mIHJlc3VsdHMpIHsKKyAgICBBU3RyaW5nIHJldDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc3VsdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgQVN0cmluZyBuYW1lOworICAgICAgICBBU3RyaW5nIG1pbWU7CisgICAgICAgIGlmICghc3BsaXRTdHJpbmcocmVzdWx0cy5rZXlBdChpKSwgIiAiLCAmbmFtZSwgJm1pbWUpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBBU3RyaW5nIGNvZGVjID0KKyAgICAgICAgICAgICAgICBBU3RyaW5nUHJpbnRmKCIgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9XCIlc1wiIHR5cGU9XCIlc1wiIHVwZGF0ZT1cInRydWVcIiA+XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWltZS5jX3N0cigpKTsKKyAgICAgICAgcmV0LmFwcGVuZChjb2RlYyk7CisgICAgICAgIENvZGVjU2V0dGluZ3Mgc2V0dGluZ3MgPSByZXN1bHRzLnZhbHVlQXQoaSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2V0dGluZ3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIC8vIFdBUk5JTkc6IHdlIGFzc3VtZSBhbGwgdGhlIHNldHRpbmdzIGFyZSAiTGltaXQiLiBDdXJyZW50bHkgd2UgaGF2ZSBvbmx5IG9uZSB0eXBlCisgICAgICAgICAgICAvLyBvZiBzZXR0aW5nIGluIHRoaXMgY2FzZSwgd2hpY2ggaXMgIm1heC1zdXBwb3J0ZWQtaW5zdGFuY2VzIi4KKyAgICAgICAgICAgIEFTdHJpbmcgc2V0dGluZyA9IEFTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICA8TGltaXQgbmFtZT1cIiVzXCIgdmFsdWU9XCIlc1wiIC8+XG4iLAorICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5rZXlBdChpKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy52YWx1ZUF0KGkpLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0LmFwcGVuZChzZXR0aW5nKTsKKyAgICAgICAgfQorICAgICAgICByZXQuYXBwZW5kKCIgICAgICAgIDwvTWVkaWFDb2RlYz5cbiIpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIGV4cG9ydFJlc3VsdHNUb1hNTCgKKyAgICAgICAgY29uc3QgY2hhciAqZmlsZU5hbWUsCisgICAgICAgIGNvbnN0IENvZGVjU2V0dGluZ3MmIGdsb2JhbF9yZXN1bHRzLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxBU3RyaW5nLCBDb2RlY1NldHRpbmdzPiYgZW5jb2Rlcl9yZXN1bHRzLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxBU3RyaW5nLCBDb2RlY1NldHRpbmdzPiYgZGVjb2Rlcl9yZXN1bHRzKSB7CisgICAgaWYgKGdsb2JhbF9yZXN1bHRzLnNpemUoKSA9PSAwICYmIGVuY29kZXJfcmVzdWx0cy5zaXplKCkgPT0gMCAmJiBkZWNvZGVyX3Jlc3VsdHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTdHJpbmcgb3ZlcnJpZGVzOworICAgIG92ZXJyaWRlcy5hcHBlbmQoZ2V0UHJvZmlsaW5nVmVyc2lvblN0cmluZygpKTsKKyAgICBvdmVycmlkZXMuYXBwZW5kKCJcbiIpOworICAgIG92ZXJyaWRlcy5hcHBlbmQoIjxNZWRpYUNvZGVjcz5cbiIpOworICAgIGlmIChnbG9iYWxfcmVzdWx0cy5zaXplKCkgPiAwKSB7CisgICAgICAgIG92ZXJyaWRlcy5hcHBlbmQoIiAgICA8U2V0dGluZ3M+XG4iKTsKKyAgICAgICAgb3ZlcnJpZGVzLmFwcGVuZChnbG9iYWxSZXN1bHRzVG9YbWwoZ2xvYmFsX3Jlc3VsdHMpKTsKKyAgICAgICAgb3ZlcnJpZGVzLmFwcGVuZCgiICAgIDwvU2V0dGluZ3M+XG4iKTsKKyAgICB9CisgICAgaWYgKGVuY29kZXJfcmVzdWx0cy5zaXplKCkgPiAwKSB7CisgICAgICAgIG92ZXJyaWRlcy5hcHBlbmQoIiAgICA8RW5jb2RlcnM+XG4iKTsKKyAgICAgICAgb3ZlcnJpZGVzLmFwcGVuZChjb2RlY1Jlc3VsdHNUb1htbChlbmNvZGVyX3Jlc3VsdHMpKTsKKyAgICAgICAgb3ZlcnJpZGVzLmFwcGVuZCgiICAgIDwvRW5jb2RlcnM+XG4iKTsKKyAgICB9CisgICAgaWYgKGRlY29kZXJfcmVzdWx0cy5zaXplKCkgPiAwKSB7CisgICAgICAgIG92ZXJyaWRlcy5hcHBlbmQoIiAgICA8RGVjb2RlcnM+XG4iKTsKKyAgICAgICAgb3ZlcnJpZGVzLmFwcGVuZChjb2RlY1Jlc3VsdHNUb1htbChkZWNvZGVyX3Jlc3VsdHMpKTsKKyAgICAgICAgb3ZlcnJpZGVzLmFwcGVuZCgiICAgIDwvRGVjb2RlcnM+XG4iKTsKKyAgICB9CisgICAgb3ZlcnJpZGVzLmFwcGVuZCgiPC9NZWRpYUNvZGVjcz5cbiIpOworCisgICAgRklMRSAqZiA9IGZvcGVuKGZpbGVOYW1lLCAid2IiKTsKKyAgICBpZiAoZiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiAlcyBmb3Igd3JpdGluZy4iLCBmaWxlTmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGZ3cml0ZShvdmVycmlkZXMuY19zdHIoKSwgMSwgb3ZlcnJpZGVzLnNpemUoKSwgZikgIT0gb3ZlcnJpZGVzLnNpemUoKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHdyaXRlIHRvICVzLiIsIGZpbGVOYW1lKTsKKyAgICB9CisgICAgZmNsb3NlKGYpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRiYjIyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9DT0RFQ19MSVNUX09WRVJSSURFU19IXworCisjZGVmaW5lIE1FRElBX0NPREVDX0xJU1RfT1ZFUlJJREVTX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorCisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKmtQcm9maWxpbmdWZXJzaW9uU3RyaW5nOworZXh0ZXJuIGNvbnN0IGNoYXIgKmtQcm9maWxpbmdSZXN1bHRzOworCitzdHJ1Y3QgTWVkaWFDb2RlY0luZm87CisKK0FTdHJpbmcgZ2V0UHJvZmlsaW5nVmVyc2lvblN0cmluZygpOworCitib29sIHNwbGl0U3RyaW5nKGNvbnN0IEFTdHJpbmcgJnMsIGNvbnN0IEFTdHJpbmcgJmRlbGltaXRlciwgQVN0cmluZyAqczEsIEFTdHJpbmcgKnMyKTsKKworLy8gcHJvZmlsZSBjb2RlY3MgYW5kIHNhdmUgdGhlIHJlc3VsdCB0byB4bWwgZmlsZSBuYW1lZCBrUHJvZmlsaW5nUmVzdWx0cy4KK3ZvaWQgcHJvZmlsZUNvZGVjcyhjb25zdCBWZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PiAmaW5mb3MpOworCisvLyBwcm9maWxlIGNvZGVjcyBhbmQgc2F2ZSB0aGUgcmVzdWx0IHRvIGdsb2JhbF9yZXN1bHRzLCBlbmNvZGVyX3Jlc3VsdHMgYW5kIGRlY29kZXJfcmVzdWx0cy4KK3ZvaWQgcHJvZmlsZUNvZGVjcygKKyAgICAgICAgY29uc3QgVmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPj4gJmluZm9zLAorICAgICAgICBDb2RlY1NldHRpbmdzICpnbG9iYWxfcmVzdWx0cywKKyAgICAgICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgQ29kZWNTZXR0aW5ncz4gKmVuY29kZXJfcmVzdWx0cywKKyAgICAgICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgQ29kZWNTZXR0aW5ncz4gKmRlY29kZXJfcmVzdWx0cywKKyAgICAgICAgYm9vbCBmb3JjZVRvTWVhc3VyZSA9IGZhbHNlKTsKKwordm9pZCBleHBvcnRSZXN1bHRzVG9YTUwoCisgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVOYW1lLAorICAgICAgICBjb25zdCBDb2RlY1NldHRpbmdzJiBnbG9iYWxfcmVzdWx0cywKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8QVN0cmluZywgQ29kZWNTZXR0aW5ncz4mIGVuY29kZXJfcmVzdWx0cywKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8QVN0cmluZywgQ29kZWNTZXR0aW5ncz4mIGRlY29kZXJfcmVzdWx0cyk7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfQ09ERUNfTElTVF9PVkVSUklERVNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKaW5kZXggYzI2ZTkwOS4uN2Y5ZjgyNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKKyNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJDb25zdW1lci5oPgogI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CkBAIC0yOSwxNCArMzAsMTggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1BlcnNpc3RlbnRTdXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitjb25zdCBpbnQga0RlZmF1bHRTd1ZpZGVvRW5jb2RlckZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwXzg4ODsKK2NvbnN0IGludCBrRGVmYXVsdFN3VmlkZW9FbmNvZGVyRGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9CVDcwOTsKKwogc3RydWN0IE1lZGlhQ29kZWNTb3VyY2U6OlB1bGxlciA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgUHVsbGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKTsKIApAQCAtMTIxLDcgKzEyNiw3IEBACiAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOwogICAgIG1Ob3RpZnkgPSBub3RpZnk7CiAKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgdGhpcyk7CiAgICAgbXNnLT5zZXRPYmplY3QoIm1ldGEiLCBtZXRhKTsKICAgICByZXR1cm4gcG9zdFN5bmNocm9ub3VzbHlBbmRSZXR1cm5FcnJvcihtc2cpOwogfQpAQCAtMTM3LDE5ICsxNDIsMTkgQEAKICAgICBtU291cmNlLT5zdG9wKCk7CiAgICAgQUxPR1YoInNvdXJjZSAoJXMpIHN0b3BwZWQiLCBtSXNBdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKIAotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCBpZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgdGhpcykpLT5wb3N0KCk7CiB9CiAKIHZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyOjpwYXVzZSgpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UGF1c2UsIGlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgdGhpcykpLT5wb3N0KCk7CiB9CiAKIHZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyOjpyZXN1bWUoKSB7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlc3VtZSwgaWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlc3VtZSwgdGhpcykpLT5wb3N0KCk7CiB9CiAKIHZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyOjpzY2hlZHVsZVB1bGwoKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFB1bGwsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQdWxsLCB0aGlzKTsKICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVB1bGxHZW5lcmF0aW9uKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KQEAgLTE4Miw3ICsxODcsNyBAQAogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwogCi0gICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0yNTgsOSArMjYzLDEwIEBACiAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAogICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gJmNvbnN1bWVyLAogICAgICAgICB1aW50MzJfdCBmbGFncykgewogICAgIHNwPE1lZGlhQ29kZWNTb3VyY2U+IG1lZGlhU291cmNlID0KLSAgICAgICAgICAgIG5ldyBNZWRpYUNvZGVjU291cmNlKGxvb3BlciwgZm9ybWF0LCBzb3VyY2UsIGZsYWdzKTsKKyAgICAgICAgICAgIG5ldyBNZWRpYUNvZGVjU291cmNlKGxvb3BlciwgZm9ybWF0LCBzb3VyY2UsIGNvbnN1bWVyLCBmbGFncyk7CiAKICAgICBpZiAobWVkaWFTb3VyY2UtPmluaXQoKSA9PSBPSykgewogICAgICAgICByZXR1cm4gbWVkaWFTb3VyY2U7CkBAIC0yNjksMTMgKzI3NSwxMyBAQAogfQogCiBzdGF0dXNfdCBNZWRpYUNvZGVjU291cmNlOjpzdGFydChNZXRhRGF0YSogcGFyYW1zKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCBtUmVmbGVjdG9yLT5pZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIG1SZWZsZWN0b3IpOwogICAgIG1zZy0+c2V0T2JqZWN0KCJtZXRhIiwgcGFyYW1zKTsKICAgICByZXR1cm4gcG9zdFN5bmNocm9ub3VzbHlBbmRSZXR1cm5FcnJvcihtc2cpOwogfQogCiBzdGF0dXNfdCBNZWRpYUNvZGVjU291cmNlOjpzdG9wKCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCBtUmVmbGVjdG9yLT5pZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgbVJlZmxlY3Rvcik7CiAgICAgc3RhdHVzX3QgZXJyID0gcG9zdFN5bmNocm9ub3VzbHlBbmRSZXR1cm5FcnJvcihtc2cpOwogCiAgICAgLy8gbVB1bGxlci0+c3RvcCgpIG5lZWRzIHRvIGJlIGRvbmUgb3V0c2lkZSBNZWRpYUNvZGVjU291cmNlJ3MgbG9vcGVyLApAQCAtMjk0LDcgKzMwMCw3IEBACiB9CiAKIHN0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OnBhdXNlKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgbVJlZmxlY3Rvci0+aWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFBhdXNlLCBtUmVmbGVjdG9yKSktPnBvc3QoKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTMyOCw2ICszMzQsNyBAQAogICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCwKICAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+ICZjb25zdW1lciwKICAgICAgICAgdWludDMyX3QgZmxhZ3MpCiAgICAgOiBtTG9vcGVyKGxvb3BlciksCiAgICAgICBtT3V0cHV0Rm9ybWF0KG91dHB1dEZvcm1hdCksCkBAIC0zMzcsNiArMzQ0LDEwIEBACiAgICAgICBtU3RhcnRlZChmYWxzZSksCiAgICAgICBtU3RvcHBpbmcoZmFsc2UpLAogICAgICAgbURvTW9yZVdvcmtQZW5kaW5nKGZhbHNlKSwKKyAgICAgIG1TZXRFbmNvZGVyRm9ybWF0KGZhbHNlKSwKKyAgICAgIG1FbmNvZGVyRm9ybWF0KDApLAorICAgICAgbUVuY29kZXJEYXRhU3BhY2UoMCksCisgICAgICBtR3JhcGhpY0J1ZmZlckNvbnN1bWVyKGNvbnN1bWVyKSwKICAgICAgIG1GaXJzdFNhbXBsZVRpbWVVcygtMWxsKSwKICAgICAgIG1FbmNvZGVyUmVhY2hlZEVPUyhmYWxzZSksCiAgICAgICBtRXJyb3JDb2RlKE9LKSB7CkBAIC0zOTksNiArNDEwLDkgQEAKIAogICAgIEFMT0dWKCJvdXRwdXQgZm9ybWF0IGlzICclcyciLCBtT3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygwKS5jX3N0cigpKTsKIAorICAgIG1FbmNvZGVyQWN0aXZpdHlOb3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRFbmNvZGVyQWN0aXZpdHksIG1SZWZsZWN0b3IpOworICAgIG1FbmNvZGVyLT5zZXRDYWxsYmFjayhtRW5jb2RlckFjdGl2aXR5Tm90aWZ5KTsKKwogICAgIHN0YXR1c190IGVyciA9IG1FbmNvZGVyLT5jb25maWd1cmUoCiAgICAgICAgICAgICAgICAgbU91dHB1dEZvcm1hdCwKICAgICAgICAgICAgICAgICBOVUxMIC8qIG5hdGl2ZVdpbmRvdyAqLywKQEAgLTQxNSwxNiArNDI5LDMyIEBACiAgICAgaWYgKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKICAgICAgICAgQ0hFQ0sobUlzVmlkZW8pOwogCi0gICAgICAgIGVyciA9IG1FbmNvZGVyLT5jcmVhdGVJbnB1dFN1cmZhY2UoJm1HcmFwaGljQnVmZmVyUHJvZHVjZXIpOworICAgICAgICBpZiAobUdyYXBoaWNCdWZmZXJDb25zdW1lciAhPSBOVUxMKSB7CisgICAgICAgICAgICAvLyBXaGVuIHVzaW5nIHBlcnNpc3RlbnQgc3VyZmFjZSwgd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUKKyAgICAgICAgICAgIC8vIGNvbnN1bWVyLCBidXQgaGF2ZSB0byB1c2UgUGVyc2lzdGVudFN1cmZhY2UgYXMgYSB3cmFwcGVyIHRvCisgICAgICAgICAgICAvLyBwYXNzIGNvbnN1bWVyIG92ZXIgbWVzc2FnZXMgKHNpbWlsYXIgdG8gQnVmZmVyUHJvZHVjZXJXcmFwcGVyKQorICAgICAgICAgICAgZXJyID0gbUVuY29kZXItPnNldElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IFBlcnNpc3RlbnRTdXJmYWNlKE5VTEwsIG1HcmFwaGljQnVmZmVyQ29uc3VtZXIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVyciA9IG1FbmNvZGVyLT5jcmVhdGVJbnB1dFN1cmZhY2UoJm1HcmFwaGljQnVmZmVyUHJvZHVjZXIpOworICAgICAgICB9CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgIH0KIAotICAgIG1FbmNvZGVyQWN0aXZpdHlOb3RpZnkgPSBuZXcgQU1lc3NhZ2UoCi0gICAgICAgICAgICBrV2hhdEVuY29kZXJBY3Rpdml0eSwgbVJlZmxlY3Rvci0+aWQoKSk7Ci0gICAgbUVuY29kZXItPnNldENhbGxiYWNrKG1FbmNvZGVyQWN0aXZpdHlOb3RpZnkpOworICAgIHNwPEFNZXNzYWdlPiBpbnB1dEZvcm1hdDsKKyAgICBpbnQzMl90IHVzaW5nU3dSZWFkT2Z0ZW47CisgICAgbVNldEVuY29kZXJGb3JtYXQgPSBmYWxzZTsKKyAgICBpZiAobUVuY29kZXItPmdldElucHV0Rm9ybWF0KCZpbnB1dEZvcm1hdCkgPT0gT0sKKyAgICAgICAgICAgICYmIGlucHV0Rm9ybWF0LT5maW5kSW50MzIoInVzaW5nLXN3LXJlYWQtb2Z0ZW4iLCAmdXNpbmdTd1JlYWRPZnRlbikKKyAgICAgICAgICAgICYmIHVzaW5nU3dSZWFkT2Z0ZW4pIHsKKyAgICAgICAgLy8gdGhpcyBpcyBhIFNXIGVuY29kZXI7IHNpZ25hbCBzb3VyY2UgdG8gYWxsb2NhdGUgU1cgcmVhZGFibGUgYnVmZmVycworICAgICAgICBtU2V0RW5jb2RlckZvcm1hdCA9IHRydWU7CisgICAgICAgIG1FbmNvZGVyRm9ybWF0ID0ga0RlZmF1bHRTd1ZpZGVvRW5jb2RlckZvcm1hdDsKKyAgICAgICAgbUVuY29kZXJEYXRhU3BhY2UgPSBrRGVmYXVsdFN3VmlkZW9FbmNvZGVyRGF0YVNwYWNlOworICAgIH0KIAogICAgIGVyciA9IG1FbmNvZGVyLT5zdGFydCgpOwogCkBAIC00OTIsNyArNTIyLDcgQEAKICAgICBpZiAobVN0b3BwaW5nICYmIG1FbmNvZGVyUmVhY2hlZEVPUykgewogICAgICAgICBBTE9HSSgiZW5jb2RlciAoJXMpIHN0b3BwZWQiLCBtSXNWaWRlbyA/ICJ2aWRlbyIgOiAiYXVkaW8iKTsKICAgICAgICAgLy8gcG9zdGluZyByZXBseSB0byBldmVyeW9uZSB0aGF0J3Mgd2FpdGluZwotICAgICAgICBMaXN0PHVpbnQzMl90Pjo6aXRlcmF0b3IgaXQ7CisgICAgICAgIExpc3Q8c3A8QVJlcGx5VG9rZW4+Pjo6aXRlcmF0b3IgaXQ7CiAgICAgICAgIGZvciAoaXQgPSBtU3RvcFJlcGx5SURRdWV1ZS5iZWdpbigpOwogICAgICAgICAgICAgICAgIGl0ICE9IG1TdG9wUmVwbHlJRFF1ZXVlLmVuZCgpOyBpdCsrKSB7CiAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KCppdCk7CkBAIC02MjAsOSArNjUwLDE3IEBACiAgICAgICAgIHJlc3VtZShzdGFydFRpbWVVcyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQ0hFQ0sobVB1bGxlciAhPSBOVUxMKTsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZSgKLSAgICAgICAgICAgICAgICBrV2hhdFB1bGxlck5vdGlmeSwgbVJlZmxlY3Rvci0+aWQoKSk7Ci0gICAgICAgIGVyciA9IG1QdWxsZXItPnN0YXJ0KHBhcmFtcywgbm90aWZ5KTsKKyAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBwYXJhbXM7CisgICAgICAgIGlmIChtU2V0RW5jb2RlckZvcm1hdCkgeworICAgICAgICAgICAgaWYgKG1ldGEgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5UGl4ZWxGb3JtYXQsIG1FbmNvZGVyRm9ybWF0KTsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlDb2xvclNwYWNlLCBtRW5jb2RlckRhdGFTcGFjZSk7CisgICAgICAgIH0KKworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0UHVsbGVyTm90aWZ5LCBtUmVmbGVjdG9yKTsKKyAgICAgICAgZXJyID0gbVB1bGxlci0+c3RhcnQobWV0YS5nZXQoKSwgbm90aWZ5KTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQpAQCAtNjg0LDcgKzcyMiw2IEBACiAgICAgICAgICAgICBzaXplX3Qgc2l6ZTsKICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOwogICAgICAgICAgICAgaW50MzJfdCBmbGFnczsKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gTlVMTDsKIAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImluZGV4IiwgJmluZGV4KSk7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJvZmZzZXQiLCAmb2Zmc2V0KSk7CkBAIC03NjgsNyArODA1LDcgQEAKICAgICB9CiAgICAgY2FzZSBrV2hhdFN0YXJ0OgogICAgIHsKLSAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CiAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CkBAIC03ODQsNyArODIxLDcgQEAKICAgICB7CiAgICAgICAgIEFMT0dJKCJlbmNvZGVyICglcykgc3RvcHBpbmciLCBtSXNWaWRlbyA/ICJ2aWRlbyIgOiAiYXVkaW8iKTsKIAotICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgIGlmIChtRW5jb2RlclJlYWNoZWRFT1MpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRGVmcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYURlZnMuY3BwCmluZGV4IGM0OGE1YWUuLjJhNTA2OTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRGVmcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmNwcApAQCAtNjIsNSArNjIsNiBAQAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF9TVUJSSVAgPSAiYXBwbGljYXRpb24veC1zdWJyaXAiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF9WVFQgPSAidGV4dC92dHQiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF9DRUFfNjA4ID0gInRleHQvY2VhLTYwOCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9EQVRBX1RJTUVEX0lEMyA9ICJhcHBsaWNhdGlvbi94LWlkM3Y0IjsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAKaW5kZXggYzdjNmYzNC4uYjEzODc3ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAKQEAgLTM4LDIxICszOCw2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotTWVkaWFNdXhlcjo6TWVkaWFNdXhlcihjb25zdCBjaGFyICpwYXRoLCBPdXRwdXRGb3JtYXQgZm9ybWF0KQotICAgIDogbUZvcm1hdChmb3JtYXQpLAotICAgICAgbVN0YXRlKFVOSU5JVElBTElaRUQpIHsKLSAgICBpZiAoZm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfTVBFR180KSB7Ci0gICAgICAgIG1Xcml0ZXIgPSBuZXcgTVBFRzRXcml0ZXIocGF0aCk7Ci0gICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9XRUJNKSB7Ci0gICAgICAgIG1Xcml0ZXIgPSBuZXcgV2VibVdyaXRlcihwYXRoKTsKLSAgICB9Ci0KLSAgICBpZiAobVdyaXRlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1GaWxlTWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICAgICAgbVN0YXRlID0gSU5JVElBTElaRUQ7Ci0gICAgfQotfQotCiBNZWRpYU11eGVyOjpNZWRpYU11eGVyKGludCBmZCwgT3V0cHV0Rm9ybWF0IGZvcm1hdCkKICAgICA6IG1Gb3JtYXQoZm9ybWF0KSwKICAgICAgIG1TdGF0ZShVTklOSVRJQUxJWkVEKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVN5bmMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFTeW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTQ1ZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFTeW5jLmNwcApAQCAtMCwwICsxLDg2MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYVN5bmMiCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPGd1aS9CdWZmZXJRdWV1ZS5oPgorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlckNvbnN1bWVyLmg+CisjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKworI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNsb2NrLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTeW5jLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCisjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgorCisvLyBNYXhpbXVtIGxhdGUgdGltZSBhbGxvd2VkIGZvciBhIHZpZGVvIGZyYW1lIHRvIGJlIHJlbmRlcmVkLiBXaGVuIGEgdmlkZW8KKy8vIGZyYW1lIGFycml2ZXMgbGF0ZXIgdGhhbiB0aGlzIG51bWJlciwgaXQgd2lsbCBiZSBkaXNjYXJkZWQgd2l0aG91dCByZW5kZXJpbmcuCitzdGF0aWMgY29uc3QgaW50NjRfdCBrTWF4QWxsb3dlZFZpZGVvTGF0ZVRpbWVVcyA9IDQwMDAwbGw7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gc3RhdGljCitzcDxNZWRpYVN5bmM+IE1lZGlhU3luYzo6Y3JlYXRlKCkgeworICAgIHNwPE1lZGlhU3luYz4gc3luYyA9IG5ldyBNZWRpYVN5bmMoKTsKKyAgICBzeW5jLT5tTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIoc3luYyk7CisgICAgcmV0dXJuIHN5bmM7Cit9CisKK01lZGlhU3luYzo6TWVkaWFTeW5jKCkKKyAgICAgIDogbUlzQWJhbmRvbmVkKGZhbHNlKSwKKyAgICAgICAgbU11dGV4KCksCisgICAgICAgIG1SZWxlYXNlQ29uZGl0aW9uKCksCisgICAgICAgIG1OdW1PdXRzdGFuZGluZ0J1ZmZlcnMoMCksCisgICAgICAgIG1Vc2FnZUZsYWdzRnJvbU91dHB1dCgwKSwKKyAgICAgICAgbU1heEFjcXVpcmVkQnVmZmVyQ291bnQoMSksCisgICAgICAgIG1SZXR1cm5QZW5kaW5nSW5wdXRGcmFtZShmYWxzZSksCisgICAgICAgIG1OYXRpdmVTYW1wbGVSYXRlSW5IeigwKSwKKyAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4oMCksCisgICAgICAgIG1IYXNBdWRpbyhmYWxzZSksCisgICAgICAgIG1OZXh0QnVmZmVySXRlbU1lZGlhVXMoLTEpLAorICAgICAgICBtUGxheWJhY2tSYXRlKDAuMCkgeworICAgIG1NZWRpYUNsb2NrID0gbmV3IE1lZGlhQ2xvY2s7CisKKyAgICAvLyBpbml0aWFsaXplIHNldHRpbmdzCisgICAgbVBsYXliYWNrU2V0dGluZ3MgPSBBVURJT19QTEFZQkFDS19SQVRFX0RFRkFVTFQ7CisgICAgbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkID0gbVBsYXliYWNrUmF0ZTsKKworICAgIG1Mb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBtTG9vcGVyLT5zZXROYW1lKCJNZWRpYVN5bmMiKTsKKyAgICBtTG9vcGVyLT5zdGFydChmYWxzZSwgZmFsc2UsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworfQorCitNZWRpYVN5bmM6On5NZWRpYVN5bmMoKSB7CisgICAgaWYgKG1JbnB1dCAhPSBOVUxMKSB7CisgICAgICAgIG1JbnB1dC0+Y29uc3VtZXJEaXNjb25uZWN0KCk7CisgICAgfQorICAgIGlmIChtT3V0cHV0ICE9IE5VTEwpIHsKKyAgICAgICAgbU91dHB1dC0+ZGlzY29ubmVjdChOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7CisgICAgfQorCisgICAgaWYgKG1Mb29wZXIgIT0gTlVMTCkgeworICAgICAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihpZCgpKTsKKyAgICAgICAgbUxvb3Blci0+c3RvcCgpOworICAgIH0KK30KKworc3RhdHVzX3QgTWVkaWFTeW5jOjpzZXRTdXJmYWNlKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZvdXRwdXQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworCisgICAgaWYgKG91dHB1dCA9PSBtT3V0cHV0KSB7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsgIC8vIHNhbWUgb3V0cHV0IHN1cmZhY2UuCisgICAgfQorCisgICAgaWYgKG91dHB1dCA9PSBOVUxMICYmIG1TeW5jU2V0dGluZ3MubVNvdXJjZSA9PSBBVlNZTkNfU09VUkNFX1ZTWU5DKSB7CisgICAgICAgIEFMT0dFKCJzZXRTdXJmYWNlOiBvdXRwdXQgc3VyZmFjZSBpcyB1c2VkIGFzIHN5bmMgc291cmNlIGFuZCBjYW5ub3QgYmUgcmVtb3ZlZC4iKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChvdXRwdXQgIT0gTlVMTCkgeworICAgICAgICBpbnQgbmV3VXNhZ2UgPSAwOworICAgICAgICBvdXRwdXQtPnF1ZXJ5KE5BVElWRV9XSU5ET1dfQ09OU1VNRVJfVVNBR0VfQklUUywgJm5ld1VzYWdlKTsKKworICAgICAgICAvLyBDaGVjayB1c2FnZSBmbGFncyBvbmx5IHdoZW4gY3VycmVudCBvdXRwdXQgc3VyZmFjZSBoYXMgYmVlbiB1c2VkIHRvIGNyZWF0ZSBpbnB1dCBzdXJmYWNlLgorICAgICAgICBpZiAobU91dHB1dCAhPSBOVUxMICYmIG1JbnB1dCAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbnQgaWdub3JlZEZsYWdzID0gKEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSB8IEdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVIKKyAgICAgICAgICAgICAgICAgICAgfCBHUkFMTE9DX1VTQUdFX0VYVEVSTkFMX0RJU1ApOworICAgICAgICAgICAgLy8gTmV3IG91dHB1dCBzdXJmYWNlIGlzIG5vdCBhbGxvd2VkIHRvIGFkZCBuZXcgdXNhZ2UgZmxhZyBleGNlcHQgaWdub3JlZCBvbmVzLgorICAgICAgICAgICAgaWYgKChuZXdVc2FnZSAmIH4obVVzYWdlRmxhZ3NGcm9tT3V0cHV0IHwgaWdub3JlZEZsYWdzKSkgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJzZXRTdXJmYWNlOiBuZXcgb3V0cHV0IHN1cmZhY2UgaGFzIG5ldyB1c2FnZSBmbGFnIG5vdCB1c2VkIGJ5IGN1cnJlbnQgb25lLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUcnkgdG8gY29ubmVjdCB0byBuZXcgb3V0cHV0IHN1cmZhY2UuIElmIGZhaWxlZCwgY3VycmVudCBvdXRwdXQgc3VyZmFjZSB3aWxsIG5vdAorICAgICAgICAvLyBiZSBjaGFuZ2VkLgorICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCBxdWV1ZUJ1ZmZlck91dHB1dDsKKyAgICAgICAgc3A8T3V0cHV0TGlzdGVuZXI+IGxpc3RlbmVyKG5ldyBPdXRwdXRMaXN0ZW5lcih0aGlzLCBvdXRwdXQpKTsKKyAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIob3V0cHV0KS0+bGlua1RvRGVhdGgobGlzdGVuZXIpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgb3V0cHV0LT5jb25uZWN0KGxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQVBJX01FRElBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogcHJvZHVjZXJDb250cm9sbGVkQnlBcHAgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1ZXVlQnVmZmVyT3V0cHV0KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoInNldFN1cmZhY2U6IGZhaWxlZCB0byBjb25uZWN0ICglZCkiLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRnJhbWVTY2hlZHVsZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgbUZyYW1lU2NoZWR1bGVyID0gbmV3IFZpZGVvRnJhbWVTY2hlZHVsZXIoKTsKKyAgICAgICAgICAgIG1GcmFtZVNjaGVkdWxlci0+aW5pdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1PdXRwdXQgIT0gTlVMTCkgeworICAgICAgICBtT3V0cHV0LT5kaXNjb25uZWN0KE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKKyAgICAgICAgd2hpbGUgKCFtQnVmZmVyc1NlbnRUb091dHB1dC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybkJ1ZmZlclRvSW5wdXRfbChtQnVmZmVyc1NlbnRUb091dHB1dC52YWx1ZUF0KDApLCBGZW5jZTo6Tk9fRkVOQ0UpOworICAgICAgICAgICAgbUJ1ZmZlcnNTZW50VG9PdXRwdXQucmVtb3ZlSXRlbXNBdCgwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1PdXRwdXQgPSBvdXRwdXQ7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8vIHxhdWRpb1RyYWNrfCBpcyB1c2VkIG9ubHkgZm9yIHF1ZXJ5aW5nIGluZm9ybWF0aW9uLgorc3RhdHVzX3QgTWVkaWFTeW5jOjpzZXRBdWRpb1RyYWNrKGNvbnN0IHNwPEF1ZGlvVHJhY2s+ICZhdWRpb1RyYWNrKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKworICAgIC8vIFRPRE86IHN1cHBvcnQgYXVkaW8gdHJhY2sgY2hhbmdlLgorICAgIGlmIChtQXVkaW9UcmFjayAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJzZXRBdWRpb1RyYWNrOiBhdWRpb1RyYWNrIGhhcyBhbHJlYWR5IGJlZW4gY29uZmlndXJlZC4iKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChhdWRpb1RyYWNrID09IE5VTEwgJiYgbVN5bmNTZXR0aW5ncy5tU291cmNlID09IEFWU1lOQ19TT1VSQ0VfQVVESU8pIHsKKyAgICAgICAgQUxPR0UoInNldEF1ZGlvVHJhY2s6IGF1ZGlvVHJhY2sgaXMgdXNlZCBhcyBzeW5jIHNvdXJjZSBhbmQgY2Fubm90IGJlIHJlbW92ZWQuIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAoYXVkaW9UcmFjayAhPSBOVUxMKSB7CisgICAgICAgIC8vIGNoZWNrIGlmIGF1ZGlvIHRyYWNrIHN1cHBvcnRzIHRoZSBwbGF5YmFjayBzZXR0aW5ncworICAgICAgICBpZiAobVBsYXliYWNrU2V0dGluZ3MubVNwZWVkICE9IDAuZgorICAgICAgICAgICAgICAgICYmIGF1ZGlvVHJhY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tTZXR0aW5ncykgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJwbGF5YmFjayBzZXR0aW5ncyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgYXVkaW8gdHJhY2siKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCBuYXRpdmVTYW1wbGVSYXRlSW5IeiA9IGF1ZGlvVHJhY2stPmdldE9yaWdpbmFsU2FtcGxlUmF0ZSgpOworICAgICAgICBpZiAobmF0aXZlU2FtcGxlUmF0ZUluSHogPD0gMCkgeworICAgICAgICAgICAgQUxPR0UoInNldEF1ZGlvVHJhY2s6IG5hdGl2ZSBzYW1wbGUgcmF0ZSBzaG91bGQgYmUgcG9zaXRpdmUuIik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIG1BdWRpb1RyYWNrID0gYXVkaW9UcmFjazsKKyAgICAgICAgbU5hdGl2ZVNhbXBsZVJhdGVJbkh6ID0gbmF0aXZlU2FtcGxlUmF0ZUluSHo7CisgICAgICAgICh2b2lkKXNldFBsYXliYWNrU2V0dGluZ3NfbChtUGxheWJhY2tTZXR0aW5ncyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBtQXVkaW9UcmFjayA9IE5VTEw7CisgICAgICAgIG1OYXRpdmVTYW1wbGVSYXRlSW5IeiA9IDA7CisgICAgfQorCisgICAgLy8gcG90ZW50aWFsbHkgcmVzeW5jIHRvIG5ldyBzb3VyY2UKKyAgICByZXN5bmNfbCgpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWVkaWFTeW5jOjpjcmVhdGVJbnB1dFN1cmZhY2UoCisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpvdXRCdWZmZXJQcm9kdWNlcikgeworICAgIGlmIChvdXRCdWZmZXJQcm9kdWNlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKworICAgIGlmIChtT3V0cHV0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgaWYgKG1JbnB1dCAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBidWZmZXJQcm9kdWNlcjsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBidWZmZXJDb25zdW1lcjsKKyAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJmJ1ZmZlclByb2R1Y2VyLCAmYnVmZmVyQ29uc3VtZXIpOworCisgICAgc3A8SW5wdXRMaXN0ZW5lcj4gbGlzdGVuZXIobmV3IElucHV0TGlzdGVuZXIodGhpcykpOworICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGJ1ZmZlckNvbnN1bWVyKS0+bGlua1RvRGVhdGgobGlzdGVuZXIpOworICAgIHN0YXR1c190IHN0YXR1cyA9CisgICAgICAgIGJ1ZmZlckNvbnN1bWVyLT5jb25zdW1lckNvbm5lY3QobGlzdGVuZXIsIGZhbHNlIC8qIGNvbnRyb2xsZWRCeUFwcCAqLyk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBidWZmZXJDb25zdW1lci0+c2V0Q29uc3VtZXJOYW1lKFN0cmluZzgoIk1lZGlhU3luYyIpKTsKKyAgICAgICAgLy8gcHJvcGFnYXRlIHVzYWdlIGJpdHMgZnJvbSBvdXRwdXQgc3VyZmFjZQorICAgICAgICBtVXNhZ2VGbGFnc0Zyb21PdXRwdXQgPSAwOworICAgICAgICBtT3V0cHV0LT5xdWVyeShOQVRJVkVfV0lORE9XX0NPTlNVTUVSX1VTQUdFX0JJVFMsICZtVXNhZ2VGbGFnc0Zyb21PdXRwdXQpOworICAgICAgICBidWZmZXJDb25zdW1lci0+c2V0Q29uc3VtZXJVc2FnZUJpdHMobVVzYWdlRmxhZ3NGcm9tT3V0cHV0KTsKKyAgICAgICAgKm91dEJ1ZmZlclByb2R1Y2VyID0gYnVmZmVyUHJvZHVjZXI7CisgICAgICAgIG1JbnB1dCA9IGJ1ZmZlckNvbnN1bWVyOworCisgICAgICAgIC8vIHNldCB1bmRlcXVldWVkIGJ1ZmZlciBjb3VudAorICAgICAgICBpbnQgbWluVW5kZXF1ZXVlZEJ1ZmZlcnM7CisgICAgICAgIG1PdXRwdXQtPnF1ZXJ5KE5BVElWRV9XSU5ET1dfTUlOX1VOREVRVUVVRURfQlVGRkVSUywgJm1pblVuZGVxdWV1ZWRCdWZmZXJzKTsKKyAgICAgICAgbU1heEFjcXVpcmVkQnVmZmVyQ291bnQgPSBtaW5VbmRlcXVldWVkQnVmZmVyczsKKyAgICAgICAgYnVmZmVyQ29uc3VtZXItPnNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQobU1heEFjcXVpcmVkQnVmZmVyQ291bnQpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIE1lZGlhU3luYzo6cmVzeW5jX2woKSB7CisgICAgQVZTeW5jU291cmNlIHNyYyA9IG1TeW5jU2V0dGluZ3MubVNvdXJjZTsKKyAgICBpZiAoc3JjID09IEFWU1lOQ19TT1VSQ0VfREVGQVVMVCkgeworICAgICAgICBpZiAobUF1ZGlvVHJhY2sgIT0gTlVMTCkgeworICAgICAgICAgICAgc3JjID0gQVZTWU5DX1NPVVJDRV9BVURJTzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNyYyA9IEFWU1lOQ19TT1VSQ0VfU1lTVEVNX0NMT0NLOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVE9ETzogcmVzeW5jIG91cnNlbHZlcyB0byB0aGUgY3VycmVudCBjbG9jayAoZS5nLiBvbiBzeW5jIHNvdXJjZSBjaGFuZ2UpCisgICAgdXBkYXRlUGxheWJhY2tSYXRlX2wobVBsYXliYWNrUmF0ZSk7Cit9CisKK3ZvaWQgTWVkaWFTeW5jOjp1cGRhdGVQbGF5YmFja1JhdGVfbChmbG9hdCByYXRlKSB7CisgICAgaWYgKHJhdGUgPiBtUGxheWJhY2tSYXRlKSB7CisgICAgICAgIG1OZXh0QnVmZmVySXRlbU1lZGlhVXMgPSAtMTsKKyAgICB9CisgICAgbVBsYXliYWNrUmF0ZSA9IHJhdGU7CisgICAgLy8gVE9ETzogdXBkYXRlIGZyYW1lIHNjaGVkdWxlciB3aXRoIHRoaXMgaW5mbworICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUocmF0ZSk7CisgICAgb25EcmFpblZpZGVvX2woKTsKK30KKworc3A8Y29uc3QgTWVkaWFDbG9jaz4gTWVkaWFTeW5jOjpnZXRNZWRpYUNsb2NrKCkgeworICAgIHJldHVybiBtTWVkaWFDbG9jazsKK30KKworc3RhdHVzX3QgTWVkaWFTeW5jOjpnZXRQbGF5VGltZUZvclBlbmRpbmdBdWRpb0ZyYW1lcyhpbnQ2NF90ICpvdXRUaW1lVXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworICAgIC8vIFVzZXIgc2hvdWxkIGNoZWNrIHRoZSBwbGF5YmFjayByYXRlIGlmIGl0IGRvZXNuJ3Qgd2FudCB0byByZWNlaXZlIGEKKyAgICAvLyBodWdlIG51bWJlciBmb3IgcGxheSB0aW1lLgorICAgIGlmIChtUGxheWJhY2tSYXRlID09IDAuMGYpIHsKKyAgICAgICAgKm91dFRpbWVVcyA9IElOVDY0X01BWDsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHVpbnQzMl90IG51bUZyYW1lc1BsYXllZCA9IDA7CisgICAgaWYgKG1BdWRpb1RyYWNrICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gbUF1ZGlvVHJhY2stPmdldFBvc2l0aW9uKCZudW1GcmFtZXNQbGF5ZWQpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgaW50NjRfdCBudW1QZW5kaW5nRnJhbWVzID0gbU51bUZyYW1lc1dyaXR0ZW4gLSBudW1GcmFtZXNQbGF5ZWQ7CisgICAgaWYgKG51bVBlbmRpbmdGcmFtZXMgPCAwKSB7CisgICAgICAgIG51bVBlbmRpbmdGcmFtZXMgPSAwOworICAgICAgICBBTE9HVygiZ2V0UGxheVRpbWVGb3JQZW5kaW5nQXVkaW9GcmFtZXM6IHBlbmRpbmcgZnJhbWUgY291bnQgaXMgbmVnYXRpdmUuIik7CisgICAgfQorICAgIGRvdWJsZSB0aW1lVXMgPSBudW1QZW5kaW5nRnJhbWVzICogMTAwMDAwMC4wCisgICAgICAgICAgICAvIChtTmF0aXZlU2FtcGxlUmF0ZUluSHogKiAoZG91YmxlKW1QbGF5YmFja1JhdGUpOworICAgIGlmICh0aW1lVXMgPiAoZG91YmxlKUlOVDY0X01BWCkgeworICAgICAgICAvLyBPdmVyZmxvdy4KKyAgICAgICAgKm91dFRpbWVVcyA9IElOVDY0X01BWDsKKyAgICAgICAgQUxPR1coImdldFBsYXlUaW1lRm9yUGVuZGluZ0F1ZGlvRnJhbWVzOiBwbGF5IHRpbWUgZm9yIHBlbmRpbmcgYXVkaW8gZnJhbWVzICIKKyAgICAgICAgICAgICAgImlzIHRvbyBoaWdoLCBwb3NzaWJseSBkdWUgdG8gc3VwZXIgbG93IHBsYXliYWNrIHJhdGUoJWYpIiwgbVBsYXliYWNrUmF0ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKm91dFRpbWVVcyA9IChpbnQ2NF90KXRpbWVVczsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1lZGlhU3luYzo6dXBkYXRlUXVldWVkQXVkaW9EYXRhKAorICAgICAgICBzaXplX3Qgc2l6ZUluQnl0ZXMsIGludDY0X3QgcHJlc2VudGF0aW9uVGltZVVzKSB7CisgICAgaWYgKHNpemVJbkJ5dGVzID09IDApIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CisKKyAgICBpZiAobUF1ZGlvVHJhY2sgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygidXBkYXRlUXVldWVkQXVkaW9EYXRhOiBhdWRpb1RyYWNrIGhhcyBOT1QgYmVlbiBjb25maWd1cmVkLiIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaW50NjRfdCBudW1GcmFtZXMgPSBzaXplSW5CeXRlcyAvIG1BdWRpb1RyYWNrLT5mcmFtZVNpemUoKTsKKyAgICBpbnQ2NF90IG1heE1lZGlhVGltZVVzID0gcHJlc2VudGF0aW9uVGltZVVzCisgICAgICAgICAgICArIGdldER1cmF0aW9uSWZQbGF5ZWRBdE5hdGl2ZVNhbXBsZVJhdGVfbChudW1GcmFtZXMpOworCisgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgaW50NjRfdCBub3dNZWRpYVVzID0gcHJlc2VudGF0aW9uVGltZVVzCisgICAgICAgICAgICAtIGdldER1cmF0aW9uSWZQbGF5ZWRBdE5hdGl2ZVNhbXBsZVJhdGVfbChtTnVtRnJhbWVzV3JpdHRlbikKKyAgICAgICAgICAgICsgZ2V0UGxheWVkT3V0QXVkaW9EdXJhdGlvbk1lZGlhX2wobm93VXMpOworCisgICAgbU51bUZyYW1lc1dyaXR0ZW4gKz0gbnVtRnJhbWVzOworCisgICAgaW50NjRfdCBvbGRSZWFsVGltZSA9IC0xOworICAgIGlmIChtTmV4dEJ1ZmZlckl0ZW1NZWRpYVVzICE9IC0xKSB7CisgICAgICAgIG9sZFJlYWxUaW1lID0gZ2V0UmVhbFRpbWUobU5leHRCdWZmZXJJdGVtTWVkaWFVcywgbm93VXMpOworICAgIH0KKworICAgIG1NZWRpYUNsb2NrLT51cGRhdGVBbmNob3Iobm93TWVkaWFVcywgbm93VXMsIG1heE1lZGlhVGltZVVzKTsKKyAgICBtSGFzQXVkaW8gPSB0cnVlOworCisgICAgaWYgKG9sZFJlYWxUaW1lICE9IC0xKSB7CisgICAgICAgIGludDY0X3QgbmV3UmVhbFRpbWUgPSBnZXRSZWFsVGltZShtTmV4dEJ1ZmZlckl0ZW1NZWRpYVVzLCBub3dVcyk7CisgICAgICAgIGlmIChuZXdSZWFsVGltZSA+PSBvbGRSZWFsVGltZSkgeworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgfQorCisgICAgbU5leHRCdWZmZXJJdGVtTWVkaWFVcyA9IC0xOworICAgIG9uRHJhaW5WaWRlb19sKCk7CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE1lZGlhU3luYzo6c2V0TmFtZShjb25zdCBBU3RyaW5nICZuYW1lKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKyAgICBtSW5wdXQtPnNldENvbnN1bWVyTmFtZShTdHJpbmc4KG5hbWUuY19zdHIoKSkpOworfQorCit2b2lkIE1lZGlhU3luYzo6Zmx1c2goKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKyAgICBpZiAobUZyYW1lU2NoZWR1bGVyICE9IE5VTEwpIHsKKyAgICAgICAgbUZyYW1lU2NoZWR1bGVyLT5yZXN0YXJ0KCk7CisgICAgfQorICAgIHdoaWxlICghbUJ1ZmZlckl0ZW1zLmVtcHR5KCkpIHsKKyAgICAgICAgQnVmZmVySXRlbSAqYnVmZmVySXRlbSA9ICYqbUJ1ZmZlckl0ZW1zLmJlZ2luKCk7CisgICAgICAgIHJldHVybkJ1ZmZlclRvSW5wdXRfbChidWZmZXJJdGVtLT5tR3JhcGhpY0J1ZmZlciwgYnVmZmVySXRlbS0+bUZlbmNlKTsKKyAgICAgICAgbUJ1ZmZlckl0ZW1zLmVyYXNlKG1CdWZmZXJJdGVtcy5iZWdpbigpKTsKKyAgICB9CisgICAgbU5leHRCdWZmZXJJdGVtTWVkaWFVcyA9IC0xOworICAgIG1OdW1GcmFtZXNXcml0dGVuID0gMDsKKyAgICBtUmV0dXJuUGVuZGluZ0lucHV0RnJhbWUgPSB0cnVlOworICAgIG1SZWxlYXNlQ29uZGl0aW9uLnNpZ25hbCgpOworICAgIG1NZWRpYUNsb2NrLT5jbGVhckFuY2hvcigpOworfQorCitzdGF0dXNfdCBNZWRpYVN5bmM6OnNldFZpZGVvRnJhbWVSYXRlSGludChmbG9hdCByYXRlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKyAgICBpZiAocmF0ZSA8IDAuZikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAobUZyYW1lU2NoZWR1bGVyICE9IE5VTEwpIHsKKyAgICAgICAgbUZyYW1lU2NoZWR1bGVyLT5pbml0KHJhdGUpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK2Zsb2F0IE1lZGlhU3luYzo6Z2V0VmlkZW9GcmFtZVJhdGUoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKyAgICBpZiAobUZyYW1lU2NoZWR1bGVyICE9IE5VTEwpIHsKKyAgICAgICAgZmxvYXQgZnBzID0gbUZyYW1lU2NoZWR1bGVyLT5nZXRGcmFtZVJhdGUoKTsKKyAgICAgICAgaWYgKGZwcyA+IDAuZikgeworICAgICAgICAgICAgcmV0dXJuIGZwczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHdlIGRvbid0IGhhdmUgb3Iga25vdyB0aGUgZnJhbWUgcmF0ZQorICAgIHJldHVybiAtMS5mOworfQorCitzdGF0dXNfdCBNZWRpYVN5bmM6OnNldFN5bmNTZXR0aW5ncyhjb25zdCBBVlN5bmNTZXR0aW5ncyAmc3luY1NldHRpbmdzKSB7CisgICAgLy8gdmFsaWRhdGUgc2V0dGluZ3MKKyAgICBpZiAoc3luY1NldHRpbmdzLm1Tb3VyY2UgPj0gQVZTWU5DX1NPVVJDRV9NQVgKKyAgICAgICAgICAgIHx8IHN5bmNTZXR0aW5ncy5tQXVkaW9BZGp1c3RNb2RlID49IEFWU1lOQ19BVURJT19BREpVU1RfTU9ERV9NQVgKKyAgICAgICAgICAgIHx8IHN5bmNTZXR0aW5ncy5tVG9sZXJhbmNlIDwgMC5mCisgICAgICAgICAgICB8fCBzeW5jU2V0dGluZ3MubVRvbGVyYW5jZSA+PSBBVlNZTkNfVE9MRVJBTkNFX01BWCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CisKKyAgICAvLyB2ZXJpZnkgdGhhdCB3ZSBoYXZlIHRoZSBzeW5jIHNvdXJjZQorICAgIHN3aXRjaCAoc3luY1NldHRpbmdzLm1Tb3VyY2UpIHsKKyAgICAgICAgY2FzZSBBVlNZTkNfU09VUkNFX0FVRElPOgorICAgICAgICAgICAgaWYgKG1BdWRpb1RyYWNrID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgic2V0U3luY1NldHRpbmdzOiBhdWRpbyBzeW5jIHNvdXJjZSByZXF1aXJlcyBhbiBhdWRpbyB0cmFjayIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVlNZTkNfU09VUkNFX1ZTWU5DOgorICAgICAgICAgICAgaWYgKG1PdXRwdXQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJzZXRTeW5jU2V0dGluZ3M6IHZzeW5jIHN5bmMgc291cmNlIHJlcXVpcmVzIGFuIG91dHB1dCBzdXJmYWNlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgbVN5bmNTZXR0aW5ncyA9IHN5bmNTZXR0aW5nczsKKyAgICByZXN5bmNfbCgpOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBNZWRpYVN5bmM6OmdldFN5bmNTZXR0aW5ncyhBVlN5bmNTZXR0aW5ncyAqc3luY1NldHRpbmdzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKyAgICAqc3luY1NldHRpbmdzID0gbVN5bmNTZXR0aW5nczsKK30KKworc3RhdHVzX3QgTWVkaWFTeW5jOjpzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKworICAgIHN0YXR1c190IGVyciA9IHNldFBsYXliYWNrU2V0dGluZ3NfbChyYXRlKTsKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIC8vIFRPRE86IGFkanVzdCByYXRlIGlmIHVzaW5nIFZTWU5DIGFzIHNvdXJjZQorICAgICAgICB1cGRhdGVQbGF5YmFja1JhdGVfbChyYXRlLm1TcGVlZCk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE1lZGlhU3luYzo6c2V0UGxheWJhY2tTZXR0aW5nc19sKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKSB7CisgICAgaWYgKHJhdGUubVNwZWVkIDwgMC5mIHx8IHJhdGUubVBpdGNoIDwgMC5mKSB7CisgICAgICAgIC8vIFdlIGRvbid0IHZhbGlkYXRlIG90aGVyIGF1ZGlvIHNldHRpbmdzLgorICAgICAgICAvLyBUaGV5IHdpbGwgYmUgdmFsaWRhdGVkIHdoZW4vaWYgYXVkaW90cmFjayBpcyBzZXQuCisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKG1BdWRpb1RyYWNrICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHJhdGUubVNwZWVkID09IDAuZikgeworICAgICAgICAgICAgbUF1ZGlvVHJhY2stPnBhdXNlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQXVkaW9UcmFjay0+c2V0UGxheWJhY2tSYXRlKHJhdGUpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnMKKyAgICAgICAgICAgICh2b2lkKW1BdWRpb1RyYWNrLT5zdGFydCgpOworICAgICAgICB9CisgICAgfQorICAgIG1QbGF5YmFja1NldHRpbmdzID0gcmF0ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTWVkaWFTeW5jOjpnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKyAgICAqcmF0ZSA9IG1QbGF5YmFja1NldHRpbmdzOworfQorCitpbnQ2NF90IE1lZGlhU3luYzo6Z2V0UmVhbFRpbWUoaW50NjRfdCBtZWRpYVRpbWVVcywgaW50NjRfdCBub3dVcykgeworICAgIGludDY0X3QgcmVhbFVzOworICAgIGlmIChtTWVkaWFDbG9jay0+Z2V0UmVhbFRpbWVGb3IobWVkaWFUaW1lVXMsICZyZWFsVXMpICE9IE9LKSB7CisgICAgICAgIC8vIElmIGZhaWxlZCB0byBnZXQgY3VycmVudCBwb3NpdGlvbiwgZS5nLiBkdWUgdG8gYXVkaW8gY2xvY2sgaXMKKyAgICAgICAgLy8gbm90IHJlYWR5LCB0aGVuIGp1c3QgcGxheSBvdXQgdmlkZW8gaW1tZWRpYXRlbHkgd2l0aG91dCBkZWxheS4KKyAgICAgICAgcmV0dXJuIG5vd1VzOworICAgIH0KKyAgICByZXR1cm4gcmVhbFVzOworfQorCitpbnQ2NF90IE1lZGlhU3luYzo6Z2V0RHVyYXRpb25JZlBsYXllZEF0TmF0aXZlU2FtcGxlUmF0ZV9sKGludDY0X3QgbnVtRnJhbWVzKSB7CisgICAgcmV0dXJuIChudW1GcmFtZXMgKiAxMDAwMDAwTEwgLyBtTmF0aXZlU2FtcGxlUmF0ZUluSHopOworfQorCitpbnQ2NF90IE1lZGlhU3luYzo6Z2V0UGxheWVkT3V0QXVkaW9EdXJhdGlvbk1lZGlhX2woaW50NjRfdCBub3dVcykgeworICAgIENIRUNLKG1BdWRpb1RyYWNrICE9IE5VTEwpOworCisgICAgdWludDMyX3QgbnVtRnJhbWVzUGxheWVkOworICAgIGludDY0X3QgbnVtRnJhbWVzUGxheWVkQXQ7CisgICAgQXVkaW9UaW1lc3RhbXAgdHM7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1N0YWxlVGltZXN0YW1wMTAwbXMgPSAxMDAwMDA7CisKKyAgICBzdGF0dXNfdCByZXMgPSBtQXVkaW9UcmFjay0+Z2V0VGltZXN0YW1wKHRzKTsKKyAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgIC8vIGNhc2UgMTogbWl4aW5nIGF1ZGlvIHRyYWNrcy4KKyAgICAgICAgbnVtRnJhbWVzUGxheWVkID0gdHMubVBvc2l0aW9uOworICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdCA9CisgICAgICAgICAgICB0cy5tVGltZS50dl9zZWMgKiAxMDAwMDAwTEwgKyB0cy5tVGltZS50dl9uc2VjIC8gMTAwMDsKKyAgICAgICAgY29uc3QgaW50NjRfdCB0aW1lc3RhbXBBZ2UgPSBub3dVcyAtIG51bUZyYW1lc1BsYXllZEF0OworICAgICAgICBpZiAodGltZXN0YW1wQWdlID4ga1N0YWxlVGltZXN0YW1wMTAwbXMpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gYXVkaW8gRklYTUUuCisgICAgICAgICAgICAvLyBnZXRUaW1lc3RhbXAgcmV0dXJucyBhIHRpbWVzdGFtcCB3aGljaCBtYXkgY29tZSBmcm9tIGF1ZGlvCisgICAgICAgICAgICAvLyBtaXhpbmcgdGhyZWFkcy4gQWZ0ZXIgcGF1c2luZywgdGhlIE1peGVyVGhyZWFkIG1heSBnbyBpZGxlLAorICAgICAgICAgICAgLy8gdGh1cyB0aGUgbVRpbWUgZXN0aW1hdGUgbWF5IGJlY29tZSBzdGFsZS4gQXNzdW1pbmcgdGhhdCB0aGUKKyAgICAgICAgICAgIC8vIE1peGVyVGhyZWFkIHJ1bnMgMjBtcywgd2l0aCBGYXN0TWl4ZXIgYXQgNW1zLCB0aGUgbWF4IGxhdGVuY3kKKyAgICAgICAgICAgIC8vIHNob3VsZCBiZSBhYm91dCAyNW1zIHdpdGggYW4gYXZlcmFnZSBhcm91bmQgMTJtcyAodG8gYmUKKyAgICAgICAgICAgIC8vIHZlcmlmaWVkKS4gRm9yIHNhZmV0eSB3ZSB1c2UgMTAwbXMuCisgICAgICAgICAgICBBTE9HVigiZ2V0VGltZXN0YW1wOiByZXR1cm5lZCBzdGFsZSB0aW1lc3RhbXAgbm93VXMoJWxsZCkgIgorICAgICAgICAgICAgICAgICAgIm51bUZyYW1lc1BsYXllZEF0KCVsbGQpIiwKKyAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbm93VXMsIChsb25nIGxvbmcpbnVtRnJhbWVzUGxheWVkQXQpOworICAgICAgICAgICAgbnVtRnJhbWVzUGxheWVkQXQgPSBub3dVcyAtIGtTdGFsZVRpbWVzdGFtcDEwMG1zOworICAgICAgICB9CisgICAgICAgIC8vQUxPR0QoImdldFRpbWVzdGFtcDogT0sgJWQgJWxsZCIsCisgICAgICAgIC8vICAgICAgbnVtRnJhbWVzUGxheWVkLCAobG9uZyBsb25nKW51bUZyYW1lc1BsYXllZEF0KTsKKyAgICB9IGVsc2UgaWYgKHJlcyA9PSBXT1VMRF9CTE9DSykgeworICAgICAgICAvLyBjYXNlIDI6IHRyYW5zaXRvcnkgc3RhdGUgb24gc3RhcnQgb2YgYSBuZXcgdHJhY2sKKyAgICAgICAgbnVtRnJhbWVzUGxheWVkID0gMDsKKyAgICAgICAgbnVtRnJhbWVzUGxheWVkQXQgPSBub3dVczsKKyAgICAgICAgLy9BTE9HRCgiZ2V0VGltZXN0YW1wOiBXT1VMRF9CTE9DSyAlZCAlbGxkIiwKKyAgICAgICAgLy8gICAgICBudW1GcmFtZXNQbGF5ZWQsIChsb25nIGxvbmcpbnVtRnJhbWVzUGxheWVkQXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGNhc2UgMzogdHJhbnNpdG9yeSBhdCBuZXcgdHJhY2sgb3IgYXVkaW8gZmFzdCB0cmFja3MuCisgICAgICAgIHJlcyA9IG1BdWRpb1RyYWNrLT5nZXRQb3NpdGlvbigmbnVtRnJhbWVzUGxheWVkKTsKKyAgICAgICAgQ0hFQ0tfRVEocmVzLCAoc3RhdHVzX3QpT0spOworICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdCA9IG5vd1VzOworICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdCArPSAxMDAwTEwgKiBtQXVkaW9UcmFjay0+bGF0ZW5jeSgpIC8gMjsgLyogWFhYICovCisgICAgICAgIC8vQUxPR0QoImdldFBvc2l0aW9uOiAlZCAlbGxkIiwgbnVtRnJhbWVzUGxheWVkLCAobG9uZyBsb25nKW51bUZyYW1lc1BsYXllZEF0KTsKKyAgICB9CisKKyAgICAvL2Nhbid0IGJlIG5lZ2F0aXZlIHVudGlsIDEyLjQgaHJzLCB0ZXN0LgorICAgIC8vQ0hFQ0tfRVEobnVtRnJhbWVzUGxheWVkICYgKDEgPDwgMzEpLCAwKTsKKyAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPQorICAgICAgICBnZXREdXJhdGlvbklmUGxheWVkQXROYXRpdmVTYW1wbGVSYXRlX2wobnVtRnJhbWVzUGxheWVkKQorICAgICAgICAgICAgKyBub3dVcyAtIG51bUZyYW1lc1BsYXllZEF0OworICAgIGlmIChkdXJhdGlvblVzIDwgMCkgeworICAgICAgICAvLyBPY2N1cnMgd2hlbiBudW1GcmFtZXNQbGF5ZWQgcG9zaXRpb24gaXMgdmVyeSBzbWFsbCBhbmQgdGhlIGZvbGxvd2luZzoKKyAgICAgICAgLy8gKDEpIEluIGNhc2UgMSwgdGhlIHRpbWUgbm93VXMgaXMgY29tcHV0ZWQgYmVmb3JlIGdldFRpbWVzdGFtcCgpIGlzCisgICAgICAgIC8vICAgICBjYWxsZWQgYW5kIG51bUZyYW1lc1BsYXllZEF0IGlzIGdyZWF0ZXIgdGhhbiBub3dVcyBieSB0aW1lIG1vcmUKKyAgICAgICAgLy8gICAgIHRoYW4gbnVtRnJhbWVzUGxheWVkLgorICAgICAgICAvLyAoMikgSW4gY2FzZSAzLCB1c2luZyBnZXRQb3NpdGlvbiBhbmQgYWRkaW5nIG1BdWRpb1RyYWNrLT5sYXRlbmN5KCkKKyAgICAgICAgLy8gICAgIHRvIG51bUZyYW1lc1BsYXllZEF0LCBieSBhIHRpbWUgYW1vdW50IGdyZWF0ZXIgdGhhbgorICAgICAgICAvLyAgICAgbnVtRnJhbWVzUGxheWVkLgorICAgICAgICAvLworICAgICAgICAvLyBCb3RoIG9mIHRoZXNlIGFyZSB0cmFuc2l0b3J5IGNvbmRpdGlvbnMuCisgICAgICAgIEFMT0dWKCJnZXRQbGF5ZWRPdXRBdWRpb0R1cmF0aW9uTWVkaWFfbDogbmVnYXRpdmUgZHVyYXRpb24gJWxsZCAiCisgICAgICAgICAgICAgICJzZXQgdG8gemVybyIsIChsb25nIGxvbmcpZHVyYXRpb25Vcyk7CisgICAgICAgIGR1cmF0aW9uVXMgPSAwOworICAgIH0KKyAgICBBTE9HVigiZ2V0UGxheWVkT3V0QXVkaW9EdXJhdGlvbk1lZGlhX2woJWxsZCkgbm93VXMoJWxsZCkgZnJhbWVzKCV1KSAiCisgICAgICAgICAgImZyYW1lc0F0KCVsbGQpIiwKKyAgICAgICAgICAobG9uZyBsb25nKWR1cmF0aW9uVXMsIChsb25nIGxvbmcpbm93VXMsIG51bUZyYW1lc1BsYXllZCwKKyAgICAgICAgICAobG9uZyBsb25nKW51bUZyYW1lc1BsYXllZEF0KTsKKyAgICByZXR1cm4gZHVyYXRpb25VczsKK30KKwordm9pZCBNZWRpYVN5bmM6Om9uRHJhaW5WaWRlb19sKCkgeworICAgIGlmICghaXNQbGF5aW5nKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlICghbUJ1ZmZlckl0ZW1zLmVtcHR5KCkpIHsKKyAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgICAgIEJ1ZmZlckl0ZW0gKmJ1ZmZlckl0ZW0gPSAmKm1CdWZmZXJJdGVtcy5iZWdpbigpOworICAgICAgICBpbnQ2NF90IGl0ZW1NZWRpYVVzID0gYnVmZmVySXRlbS0+bVRpbWVzdGFtcCAvIDEwMDA7CisgICAgICAgIGludDY0X3QgaXRlbVJlYWxVcyA9IGdldFJlYWxUaW1lKGl0ZW1NZWRpYVVzLCBub3dVcyk7CisKKyAgICAgICAgLy8gYWRqdXN0IHZpZGVvIGZyYW1lIFBUUyBiYXNlZCBvbiB2c3luYworICAgICAgICBpdGVtUmVhbFVzID0gbUZyYW1lU2NoZWR1bGVyLT5zY2hlZHVsZShpdGVtUmVhbFVzICogMTAwMCkgLyAxMDAwOworICAgICAgICBpbnQ2NF90IHR3b1ZzeW5jc1VzID0gMiAqIChtRnJhbWVTY2hlZHVsZXItPmdldFZzeW5jUGVyaW9kKCkgLyAxMDAwKTsKKworICAgICAgICAvLyBwb3N0IDIgZGlzcGxheSByZWZyZXNoZXMgYmVmb3JlIHJlbmRlcmluZyBpcyBkdWUKKyAgICAgICAgaWYgKGl0ZW1SZWFsVXMgPD0gbm93VXMgKyB0d29Wc3luY3NVcykgeworICAgICAgICAgICAgQUxPR1YoImFkanVzdGluZyBQVFMgZnJvbSAlbGxkIHRvICVsbGQiLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWJ1ZmZlckl0ZW0tPm1UaW1lc3RhbXAgLyAxMDAwLCAobG9uZyBsb25nKWl0ZW1SZWFsVXMpOworICAgICAgICAgICAgYnVmZmVySXRlbS0+bVRpbWVzdGFtcCA9IGl0ZW1SZWFsVXMgKiAxMDAwOworICAgICAgICAgICAgYnVmZmVySXRlbS0+bUlzQXV0b1RpbWVzdGFtcCA9IGZhbHNlOworCisgICAgICAgICAgICBpZiAobUhhc0F1ZGlvKSB7CisgICAgICAgICAgICAgICAgaWYgKG5vd1VzIC0gaXRlbVJlYWxVcyA8PSBrTWF4QWxsb3dlZFZpZGVvTGF0ZVRpbWVVcykgeworICAgICAgICAgICAgICAgICAgICByZW5kZXJPbmVCdWZmZXJJdGVtX2woKmJ1ZmZlckl0ZW0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRvbyBsYXRlLgorICAgICAgICAgICAgICAgICAgICByZXR1cm5CdWZmZXJUb0lucHV0X2woCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySXRlbS0+bUdyYXBoaWNCdWZmZXIsIGJ1ZmZlckl0ZW0tPm1GZW5jZSk7CisgICAgICAgICAgICAgICAgICAgIG1GcmFtZVNjaGVkdWxlci0+cmVzdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gYWx3YXlzIHJlbmRlciB2aWRlbyBidWZmZXIgaW4gdmlkZW8tb25seSBtb2RlLgorICAgICAgICAgICAgICAgIHJlbmRlck9uZUJ1ZmZlckl0ZW1fbCgqYnVmZmVySXRlbSk7CisKKyAgICAgICAgICAgICAgICAvLyBzbW9vdGggb3V0IHZpZGVvcyA+PSAxMGZwcworICAgICAgICAgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVBbmNob3IoCisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtTWVkaWFVcywgbm93VXMsIGl0ZW1NZWRpYVVzICsgMTAwMDAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUJ1ZmZlckl0ZW1zLmVyYXNlKG1CdWZmZXJJdGVtcy5iZWdpbigpKTsKKyAgICAgICAgICAgIG1OZXh0QnVmZmVySXRlbU1lZGlhVXMgPSAtMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtTmV4dEJ1ZmZlckl0ZW1NZWRpYVVzID09IC0xCisgICAgICAgICAgICAgICAgICAgIHx8IG1OZXh0QnVmZmVySXRlbU1lZGlhVXMgPiBpdGVtTWVkaWFVcykgeworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREcmFpblZpZGVvLCB0aGlzKTsKKyAgICAgICAgICAgICAgICBtc2ctPnBvc3QoaXRlbVJlYWxVcyAtIG5vd1VzIC0gdHdvVnN5bmNzVXMpOworICAgICAgICAgICAgICAgIG1OZXh0QnVmZmVySXRlbU1lZGlhVXMgPSBpdGVtTWVkaWFVczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE1lZGlhU3luYzo6b25GcmFtZUF2YWlsYWJsZUZyb21JbnB1dCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworCisgICAgY29uc3Qgc3RhdGljIG5zZWNzX3Qga0FjcXVpcmVXYWl0VGltZW91dCA9IDIwMDAwMDAwMDA7IC8vIDIgc2Vjb25kcworCisgICAgbVJldHVyblBlbmRpbmdJbnB1dEZyYW1lID0gZmFsc2U7CisKKyAgICAvLyBJZiB0aGVyZSBhcmUgdG9vIG1hbnkgb3V0c3RhbmRpbmcgYnVmZmVycywgd2FpdCB1bnRpbCBhIGJ1ZmZlciBpcworICAgIC8vIHJlbGVhc2VkIGJhY2sgdG8gdGhlIGlucHV0IGluIG9uQnVmZmVyUmVsZWFzZWQuCisgICAgLy8gTk9URTogQnVmZmVyUXVldWUgYWxsb3dzIGRlcXVldWluZyBtYXhBY3F1aXJlZEJ1ZmZlckNvdW50ICsgMSBidWZmZXJzCisgICAgd2hpbGUgKG1OdW1PdXRzdGFuZGluZ0J1ZmZlcnMgPiBtTWF4QWNxdWlyZWRCdWZmZXJDb3VudAorICAgICAgICAgICAgJiYgIW1Jc0FiYW5kb25lZCAmJiAhbVJldHVyblBlbmRpbmdJbnB1dEZyYW1lKSB7CisgICAgICAgIGlmIChtUmVsZWFzZUNvbmRpdGlvbi53YWl0UmVsYXRpdmUobU11dGV4LCBrQWNxdWlyZVdhaXRUaW1lb3V0KSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0lfSUYobVBsYXliYWNrUmF0ZSAhPSAwLmYsICJzdGlsbCB3YWl0aW5nIHRvIHJlbGVhc2UgYSBidWZmZXIgYmVmb3JlIGFjcXVpcmUiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZSBzeW5jIGlzIGFiYW5kb25lZCB3aGlsZSB3ZSBhcmUgd2FpdGluZywgdGhlIHJlbGVhc2UKKyAgICAgICAgLy8gY29uZGl0aW9uIHZhcmlhYmxlIHdpbGwgYmUgYnJvYWRjYXN0LCBhbmQgd2Ugc2hvdWxkIGp1c3QgcmV0dXJuCisgICAgICAgIC8vIHdpdGhvdXQgYXR0ZW1wdGluZyB0byBkbyBhbnl0aGluZyBtb3JlIChzaW5jZSB0aGUgaW5wdXQgcXVldWUgd2lsbAorICAgICAgICAvLyBhbHNvIGJlIGFiYW5kb25lZCkuCisgICAgICAgIGlmIChtSXNBYmFuZG9uZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEFjcXVpcmUgYW5kIGRldGFjaCB0aGUgYnVmZmVyIGZyb20gdGhlIGlucHV0LgorICAgIEJ1ZmZlckl0ZW0gYnVmZmVySXRlbTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtSW5wdXQtPmFjcXVpcmVCdWZmZXIoJmJ1ZmZlckl0ZW0sIDAgLyogcHJlc2VudFdoZW4gKi8pOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoImFjcXVpcmluZyBidWZmZXIgZnJvbSBpbnB1dCBmYWlsZWQgKCVkKSIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgKyttTnVtT3V0c3RhbmRpbmdCdWZmZXJzOworCisgICAgQUxPR1YoImFjcXVpcmVkIGJ1ZmZlciAlI2xseCBmcm9tIGlucHV0IiwgKGxvbmcgbG9uZylidWZmZXJJdGVtLm1HcmFwaGljQnVmZmVyLT5nZXRJZCgpKTsKKworICAgIHN0YXR1cyA9IG1JbnB1dC0+ZGV0YWNoQnVmZmVyKGJ1ZmZlckl0ZW0ubUJ1Zik7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiZGV0YWNoaW5nIGJ1ZmZlciBmcm9tIGlucHV0IGZhaWxlZCAoJWQpIiwgc3RhdHVzKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19JTklUKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgaW5wdXQgaGFzIGJlZW4gYWJhbmRvbmVkLCBtb3ZlIG9uLgorICAgICAgICAgICAgb25BYmFuZG9uZWRfbCh0cnVlIC8qIGlzSW5wdXQgKi8pOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUJ1ZmZlcnNGcm9tSW5wdXQuaW5kZXhPZktleShidWZmZXJJdGVtLm1HcmFwaGljQnVmZmVyLT5nZXRJZCgpKSA+PSAwKSB7CisgICAgICAgIC8vIFNvbWV0aGluZyBpcyB3cm9uZyBzaW5jZSB0aGlzIGJ1ZmZlciBzaG91bGQgYmUgYXQgb3VyIGhhbmRzLCBiYWlsLgorICAgICAgICBBTE9HRSgicmVjZWl2ZWQgYnVmZmVyIG11bHRpcGxlIHRpbWVzIGZyb20gaW5wdXQiKTsKKyAgICAgICAgbUlucHV0LT5jb25zdW1lckRpc2Nvbm5lY3QoKTsKKyAgICAgICAgb25BYmFuZG9uZWRfbCh0cnVlIC8qIGlzSW5wdXQgKi8pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1CdWZmZXJzRnJvbUlucHV0LmFkZChidWZmZXJJdGVtLm1HcmFwaGljQnVmZmVyLT5nZXRJZCgpLCBidWZmZXJJdGVtLm1HcmFwaGljQnVmZmVyKTsKKworICAgIC8vIElmIGZsdXNoIGhhcHBlbmVkIHdoaWxlIHdhaXRpbmcgZm9yIGEgYnVmZmVyIHRvIGJlIHJlbGVhc2VkLCBzaW1wbHkgcmV0dXJuIGl0CisgICAgLy8gVFJJQ0tZOiBkbyBpdCBoZXJlIGFmdGVyIGl0IGlzIGRldGFjaGVkIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjYWNoZSBtR3JhcGhpY0J1ZmZlci4KKyAgICBpZiAobVJldHVyblBlbmRpbmdJbnB1dEZyYW1lKSB7CisgICAgICAgIG1SZXR1cm5QZW5kaW5nSW5wdXRGcmFtZSA9IGZhbHNlOworICAgICAgICByZXR1cm5CdWZmZXJUb0lucHV0X2woYnVmZmVySXRlbS5tR3JhcGhpY0J1ZmZlciwgYnVmZmVySXRlbS5tRmVuY2UpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUJ1ZmZlckl0ZW1zLnB1c2hfYmFjayhidWZmZXJJdGVtKTsKKworICAgIGlmIChtQnVmZmVySXRlbXMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgb25EcmFpblZpZGVvX2woKTsKKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFTeW5jOjpyZW5kZXJPbmVCdWZmZXJJdGVtX2woY29uc3QgQnVmZmVySXRlbSAmYnVmZmVySXRlbSkgeworICAgIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgcXVldWVJbnB1dCgKKyAgICAgICAgICAgIGJ1ZmZlckl0ZW0ubVRpbWVzdGFtcCwKKyAgICAgICAgICAgIGJ1ZmZlckl0ZW0ubUlzQXV0b1RpbWVzdGFtcCwKKyAgICAgICAgICAgIGJ1ZmZlckl0ZW0ubURhdGFTcGFjZSwKKyAgICAgICAgICAgIGJ1ZmZlckl0ZW0ubUNyb3AsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihidWZmZXJJdGVtLm1TY2FsaW5nTW9kZSksCisgICAgICAgICAgICBidWZmZXJJdGVtLm1UcmFuc2Zvcm0sCisgICAgICAgICAgICBidWZmZXJJdGVtLm1Jc0Ryb3BwYWJsZSwKKyAgICAgICAgICAgIGJ1ZmZlckl0ZW0ubUZlbmNlKTsKKworICAgIC8vIEF0dGFjaCBhbmQgcXVldWUgdGhlIGJ1ZmZlciB0byB0aGUgb3V0cHV0LgorICAgIGludCBzbG90OworICAgIG1PdXRwdXQtPnNldEdlbmVyYXRpb25OdW1iZXIoYnVmZmVySXRlbS5tR3JhcGhpY0J1ZmZlci0+Z2V0R2VuZXJhdGlvbk51bWJlcigpKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT3V0cHV0LT5hdHRhY2hCdWZmZXIoJnNsb3QsIGJ1ZmZlckl0ZW0ubUdyYXBoaWNCdWZmZXIpOworICAgIEFMT0dFX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgImF0dGFjaGluZyBidWZmZXIgdG8gb3V0cHV0IGZhaWxlZCAoJWQpIiwgc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IHF1ZXVlT3V0cHV0OworICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5xdWV1ZUJ1ZmZlcihzbG90LCBxdWV1ZUlucHV0LCAmcXVldWVPdXRwdXQpOworICAgICAgICBBTE9HRV9JRihzdGF0dXMgIT0gTk9fRVJST1IsICJxdWV1ZWluZyBidWZmZXIgdG8gb3V0cHV0IGZhaWxlZCAoJWQpIiwgc3RhdHVzKTsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybkJ1ZmZlclRvSW5wdXRfbChidWZmZXJJdGVtLm1HcmFwaGljQnVmZmVyLCBidWZmZXJJdGVtLm1GZW5jZSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fSU5JVCkgeworICAgICAgICAgICAgLy8gSWYgdGhlIG91dHB1dCBoYXMgYmVlbiBhYmFuZG9uZWQsIG1vdmUgb24uCisgICAgICAgICAgICBvbkFiYW5kb25lZF9sKGZhbHNlIC8qIGlzSW5wdXQgKi8pOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUJ1ZmZlcnNTZW50VG9PdXRwdXQuaW5kZXhPZktleShidWZmZXJJdGVtLm1HcmFwaGljQnVmZmVyLT5nZXRJZCgpKSA+PSAwKSB7CisgICAgICAgIC8vIFNvbWV0aGluZyBpcyB3cm9uZyBzaW5jZSB0aGlzIGJ1ZmZlciBzaG91bGQgYmUgaGVsZCBieSBvdXRwdXQgbm93LCBiYWlsLgorICAgICAgICBtSW5wdXQtPmNvbnN1bWVyRGlzY29ubmVjdCgpOworICAgICAgICBvbkFiYW5kb25lZF9sKHRydWUgLyogaXNJbnB1dCAqLyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUJ1ZmZlcnNTZW50VG9PdXRwdXQuYWRkKGJ1ZmZlckl0ZW0ubUdyYXBoaWNCdWZmZXItPmdldElkKCksIGJ1ZmZlckl0ZW0ubUdyYXBoaWNCdWZmZXIpOworCisgICAgQUxPR1YoInF1ZXVlZCBidWZmZXIgJSNsbHggdG8gb3V0cHV0IiwgKGxvbmcgbG9uZylidWZmZXJJdGVtLm1HcmFwaGljQnVmZmVyLT5nZXRJZCgpKTsKK30KKwordm9pZCBNZWRpYVN5bmM6Om9uQnVmZmVyUmVsZWFzZWRCeU91dHB1dChzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmb3V0cHV0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKworICAgIGlmIChvdXRwdXQgIT0gbU91dHB1dCkgeworICAgICAgICByZXR1cm47ICAvLyBUaGlzIGlzIG5vdCB0aGUgY3VycmVudCBvdXRwdXQsIGlnbm9yZS4KKyAgICB9CisKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBidWZmZXI7CisgICAgc3A8RmVuY2U+IGZlbmNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1PdXRwdXQtPmRldGFjaE5leHRCdWZmZXIoJmJ1ZmZlciwgJmZlbmNlKTsKKyAgICBBTE9HRV9JRihzdGF0dXMgIT0gTk9fRVJST1IsICJkZXRhY2hpbmcgYnVmZmVyIGZyb20gb3V0cHV0IGZhaWxlZCAoJWQpIiwgc3RhdHVzKTsKKworICAgIGlmIChzdGF0dXMgPT0gTk9fSU5JVCkgeworICAgICAgICAvLyBJZiB0aGUgb3V0cHV0IGhhcyBiZWVuIGFiYW5kb25lZCwgd2UgY2FuJ3QgZG8gYW55dGhpbmcgZWxzZSwKKyAgICAgICAgLy8gc2luY2UgYnVmZmVyIGlzIGludmFsaWQuCisgICAgICAgIG9uQWJhbmRvbmVkX2woZmFsc2UgLyogaXNJbnB1dCAqLyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVigiZGV0YWNoZWQgYnVmZmVyICUjbGx4IGZyb20gb3V0cHV0IiwgKGxvbmcgbG9uZylidWZmZXItPmdldElkKCkpOworCisgICAgLy8gSWYgd2UndmUgYmVlbiBhYmFuZG9uZWQsIHdlIGNhbid0IHJldHVybiB0aGUgYnVmZmVyIHRvIHRoZSBpbnB1dCwgc28ganVzdAorICAgIC8vIG1vdmUgb24uCisgICAgaWYgKG1Jc0FiYW5kb25lZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3NpemVfdCBpeCA9IG1CdWZmZXJzU2VudFRvT3V0cHV0LmluZGV4T2ZLZXkoYnVmZmVyLT5nZXRJZCgpKTsKKyAgICBpZiAoaXggPCAwKSB7CisgICAgICAgIC8vIFRoZSBidWZmZXIgaXMgdW5rbm93biwgbWF5YmUgbGVmdG92ZXIsIGlnbm9yZS4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQnVmZmVyc1NlbnRUb091dHB1dC5yZW1vdmVJdGVtc0F0KGl4KTsKKworICAgIHJldHVybkJ1ZmZlclRvSW5wdXRfbChidWZmZXIsIGZlbmNlKTsKK30KKwordm9pZCBNZWRpYVN5bmM6OnJldHVybkJ1ZmZlclRvSW5wdXRfbCgKKyAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmJ1ZmZlciwgY29uc3Qgc3A8RmVuY2U+ICZmZW5jZSkgeworICAgIHNzaXplX3QgaXggPSBtQnVmZmVyc0Zyb21JbnB1dC5pbmRleE9mS2V5KGJ1ZmZlci0+Z2V0SWQoKSk7CisgICAgaWYgKGl4IDwgMCkgeworICAgICAgICAvLyBUaGUgYnVmZmVyIGlzIHVua25vd24sIHNvbWV0aGluZyBpcyB3cm9uZywgYmFpbC4KKyAgICAgICAgQUxPR0UoIm91dHB1dCByZXR1cm5lZCB1bmtub3duIGJ1ZmZlciIpOworICAgICAgICBtT3V0cHV0LT5kaXNjb25uZWN0KE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKKyAgICAgICAgb25BYmFuZG9uZWRfbChmYWxzZSAvKiBpc0lucHV0ICovKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxHcmFwaGljQnVmZmVyPiBvbGRCdWZmZXIgPSBtQnVmZmVyc0Zyb21JbnB1dC52YWx1ZUF0KGl4KTsKKyAgICBtQnVmZmVyc0Zyb21JbnB1dC5yZW1vdmVJdGVtc0F0KGl4KTsKKworICAgIC8vIEF0dGFjaCBhbmQgcmVsZWFzZSB0aGUgYnVmZmVyIGJhY2sgdG8gdGhlIGlucHV0LgorICAgIGludCBjb25zdW1lclNsb3Q7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUlucHV0LT5hdHRhY2hCdWZmZXIoJmNvbnN1bWVyU2xvdCwgb2xkQnVmZmVyKTsKKyAgICBBTE9HRV9JRihzdGF0dXMgIT0gTk9fRVJST1IsICJhdHRhY2hpbmcgYnVmZmVyIHRvIGlucHV0IGZhaWxlZCAoJWQpIiwgc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIHN0YXR1cyA9IG1JbnB1dC0+cmVsZWFzZUJ1ZmZlcihjb25zdW1lclNsb3QsIDAgLyogZnJhbWVOdW1iZXIgKi8sCisgICAgICAgICAgICAgICAgRUdMX05PX0RJU1BMQVksIEVHTF9OT19TWU5DX0tIUiwgZmVuY2UpOworICAgICAgICBBTE9HRV9JRihzdGF0dXMgIT0gTk9fRVJST1IsICJyZWxlYXNpbmcgYnVmZmVyIHRvIGlucHV0IGZhaWxlZCAoJWQpIiwgc3RhdHVzKTsKKyAgICB9CisKKyAgICAvLyBOb3RpZnkgYW55IHdhaXRpbmcgb25GcmFtZUF2YWlsYWJsZSBjYWxscy4KKyAgICAtLW1OdW1PdXRzdGFuZGluZ0J1ZmZlcnM7CisgICAgbVJlbGVhc2VDb25kaXRpb24uc2lnbmFsKCk7CisKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dWKCJyZWxlYXNlZCBidWZmZXIgJSNsbHggdG8gaW5wdXQiLCAobG9uZyBsb25nKW9sZEJ1ZmZlci0+Z2V0SWQoKSk7CisgICAgfQorfQorCit2b2lkIE1lZGlhU3luYzo6b25BYmFuZG9uZWRfbChib29sIGlzSW5wdXQpIHsKKyAgICBBTE9HRSgidGhlICVzIGhhcyBhYmFuZG9uZWQgbWUiLCAoaXNJbnB1dCA/ICJpbnB1dCIgOiAib3V0cHV0IikpOworICAgIGlmICghbUlzQWJhbmRvbmVkKSB7CisgICAgICAgIGlmIChpc0lucHV0KSB7CisgICAgICAgICAgICBtT3V0cHV0LT5kaXNjb25uZWN0KE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JbnB1dC0+Y29uc3VtZXJEaXNjb25uZWN0KCk7CisgICAgICAgIH0KKyAgICAgICAgbUlzQWJhbmRvbmVkID0gdHJ1ZTsKKyAgICB9CisgICAgbVJlbGVhc2VDb25kaXRpb24uYnJvYWRjYXN0KCk7Cit9CisKK3ZvaWQgTWVkaWFTeW5jOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdERyYWluVmlkZW86CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CisgICAgICAgICAgICBpZiAobU5leHRCdWZmZXJJdGVtTWVkaWFVcyAhPSAtMSkgeworICAgICAgICAgICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgICAgICAgICAgICAgIGludDY0X3QgaXRlbVJlYWxVcyA9IGdldFJlYWxUaW1lKG1OZXh0QnVmZmVySXRlbU1lZGlhVXMsIG5vd1VzKTsKKworICAgICAgICAgICAgICAgIC8vIFRoZSBtZXNzYWdlIGNvdWxkIGFycml2ZSBlYXJsaWVyIHRoYW4gZXhwZWN0ZWQgZHVlIHRvCisgICAgICAgICAgICAgICAgLy8gdmFyaW91cyByZWFzb25zLCBlLmcuLCBtZWRpYSBjbG9jayBoYXMgYmVlbiBjaGFuZ2VkIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAvLyBvZiBuZXcgYW5jaG9yIHRpbWUgb3IgcGxheWJhY2sgcmF0ZS4gSW4gc3VjaCBjYXNlcywgdGhlCisgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBuZWVkcyB0byBiZSByZS1wb3N0ZWQuCisgICAgICAgICAgICAgICAgaWYgKGl0ZW1SZWFsVXMgPiBub3dVcykgeworICAgICAgICAgICAgICAgICAgICBtc2ctPnBvc3QoaXRlbVJlYWxVcyAtIG5vd1VzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvbkRyYWluVmlkZW9fbCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworTWVkaWFTeW5jOjpJbnB1dExpc3RlbmVyOjpJbnB1dExpc3RlbmVyKGNvbnN0IHNwPE1lZGlhU3luYz4gJnN5bmMpCisgICAgICA6IG1TeW5jKHN5bmMpIHt9CisKK01lZGlhU3luYzo6SW5wdXRMaXN0ZW5lcjo6fklucHV0TGlzdGVuZXIoKSB7fQorCit2b2lkIE1lZGlhU3luYzo6SW5wdXRMaXN0ZW5lcjo6b25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtICYvKiBpdGVtICovKSB7CisgICAgbVN5bmMtPm9uRnJhbWVBdmFpbGFibGVGcm9tSW5wdXQoKTsKK30KKworLy8gV2UgZG9uJ3QgY2FyZSBhYm91dCBzaWRlYmFuZCBzdHJlYW1zLCBzaW5jZSB3ZSB3b24ndCByZWxheSB0aGVtLgordm9pZCBNZWRpYVN5bmM6OklucHV0TGlzdGVuZXI6Om9uU2lkZWJhbmRTdHJlYW1DaGFuZ2VkKCkgeworICAgIEFMT0dFKCJvblNpZGViYW5kU3RyZWFtQ2hhbmdlZDogZ290IHNpZGViYW5kIHN0cmVhbSB1bmV4cGVjdGVkbHkuIik7Cit9CisKKwordm9pZCBNZWRpYVN5bmM6OklucHV0TGlzdGVuZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJi8qIHdobyAqLykgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TeW5jLT5tTXV0ZXgpOworICAgIG1TeW5jLT5vbkFiYW5kb25lZF9sKHRydWUgLyogaXNJbnB1dCAqLyk7Cit9CisKK01lZGlhU3luYzo6T3V0cHV0TGlzdGVuZXI6Ok91dHB1dExpc3RlbmVyKGNvbnN0IHNwPE1lZGlhU3luYz4gJnN5bmMsCisgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZvdXRwdXQpCisgICAgICA6IG1TeW5jKHN5bmMpLAorICAgICAgICBtT3V0cHV0KG91dHB1dCkge30KKworTWVkaWFTeW5jOjpPdXRwdXRMaXN0ZW5lcjo6fk91dHB1dExpc3RlbmVyKCkge30KKwordm9pZCBNZWRpYVN5bmM6Ok91dHB1dExpc3RlbmVyOjpvbkJ1ZmZlclJlbGVhc2VkKCkgeworICAgIG1TeW5jLT5vbkJ1ZmZlclJlbGVhc2VkQnlPdXRwdXQobU91dHB1dCk7Cit9CisKK3ZvaWQgTWVkaWFTeW5jOjpPdXRwdXRMaXN0ZW5lcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmLyogd2hvICovKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN5bmMtPm1NdXRleCk7CisgICAgbVN5bmMtPm9uQWJhbmRvbmVkX2woZmFsc2UgLyogaXNJbnB1dCAqLyk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01pZGlFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWlkaUV4dHJhY3Rvci5jcHAKaW5kZXggNjZmYWI3Ny4uZjZiOGM4NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWlkaUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWlkaUV4dHJhY3Rvci5jcHAKQEAgLTIxNyw3ICsyMTcsNyBAQAogfQogCiBzdGF0dXNfdCBNaWRpRW5naW5lOjpzZWVrVG8oaW50NjRfdCBwb3NpdGlvblVzKSB7Ci0gICAgQUxPR1YoInNlZWtUbyAlbGxkIiwgcG9zaXRpb25Vcyk7CisgICAgQUxPR1YoInNlZWtUbyAlbGxkIiwgKGxvbmcgbG9uZylwb3NpdGlvblVzKTsKICAgICBFQVNfUkVTVUxUIHJlc3VsdCA9IEVBU19Mb2NhdGUobUVhc0RhdGEsIG1FYXNIYW5kbGUsIHBvc2l0aW9uVXMgLyAxMDAwLCBmYWxzZSk7CiAgICAgcmV0dXJuIHJlc3VsdCA9PSBFQVNfU1VDQ0VTUyA/IE9LIDogVU5LTk9XTl9FUlJPUjsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwCmluZGV4IDY0YmNkOGMuLmQ2MjU1ZDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcApAQCAtMjQyLDcgKzI0Miw3IEBACiAgICAgc3A8TnVDYWNoZWRTb3VyY2UyPiBpbnN0YW5jZSA9IG5ldyBOdUNhY2hlZFNvdXJjZTIoCiAgICAgICAgICAgICBzb3VyY2UsIGNhY2hlQ29uZmlnLCBkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soaW5zdGFuY2UtPm1Mb2NrKTsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hNb3JlLCBpbnN0YW5jZS0+bVJlZmxlY3Rvci0+aWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdEZldGNoTW9yZSwgaW5zdGFuY2UtPm1SZWZsZWN0b3IpKS0+cG9zdCgpOwogICAgIHJldHVybiBpbnN0YW5jZTsKIH0KIApAQCAtNDQyLDcgKzQ0Miw3IEBACiAgICAgICAgIGRlbGF5VXMgPSAxMDAwMDBsbDsKICAgICB9CiAKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hNb3JlLCBtUmVmbGVjdG9yLT5pZCgpKSktPnBvc3QoZGVsYXlVcyk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdEZldGNoTW9yZSwgbVJlZmxlY3RvcikpLT5wb3N0KGRlbGF5VXMpOwogfQogCiB2b2lkIE51Q2FjaGVkU291cmNlMjo6b25SZWFkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CkBAIC01MTIsNyArNTEyLDcgQEAKIHNzaXplX3QgTnVDYWNoZWRTb3VyY2UyOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9TZXJpYWxpemVyKG1TZXJpYWxpemVyKTsKIAotICAgIEFMT0dWKCJyZWFkQXQgb2Zmc2V0ICVsbGQsIHNpemUgJXp1Iiwgb2Zmc2V0LCBzaXplKTsKKyAgICBBTE9HVigicmVhZEF0IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgaWYgKG1EaXNjb25uZWN0aW5nKSB7CkBAIC01MzEsNyArNTMxLDcgQEAKICAgICAgICAgcmV0dXJuIHNpemU7CiAgICAgfQogCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlYWQsIG1SZWZsZWN0b3ItPmlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWFkLCBtUmVmbGVjdG9yKTsKICAgICBtc2ctPnNldEludDY0KCJvZmZzZXQiLCBvZmZzZXQpOwogICAgIG1zZy0+c2V0UG9pbnRlcigiZGF0YSIsIGRhdGEpOwogICAgIG1zZy0+c2V0U2l6ZSgic2l6ZSIsIHNpemUpOwpAQCAtNTg4LDEwICs1ODgsMTcgQEAKIHNzaXplX3QgTnVDYWNoZWRTb3VyY2UyOjpyZWFkSW50ZXJuYWwob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgQ0hFQ0tfTEUoc2l6ZSwgKHNpemVfdCltSGlnaHdhdGVyVGhyZXNob2xkQnl0ZXMpOwogCi0gICAgQUxPR1YoInJlYWRJbnRlcm5hbCBvZmZzZXQgJWxsZCBzaXplICV6dSIsIG9mZnNldCwgc2l6ZSk7CisgICAgQUxPR1YoInJlYWRJbnRlcm5hbCBvZmZzZXQgJWxsZCBzaXplICV6dSIsIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKKyAgICAvLyBJZiB3ZSdyZSBkaXNjb25uZWN0aW5nLCByZXR1cm4gRU9TIGFuZCBkb24ndCBhY2Nlc3MgKmRhdGEgcG9pbnRlci4KKyAgICAvLyBkYXRhIGNvdWxkIGJlIG9uIHRoZSBzdGFjayBvZiB0aGUgY2FsbGVyIHRvIE51Q2FjaGVkU291cmNlMjo6cmVhZEF0KCksCisgICAgLy8gd2hpY2ggbWF5IGhhdmUgZXhpdGVkIGFscmVhZHkuCisgICAgaWYgKG1EaXNjb25uZWN0aW5nKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0KKwogICAgIGlmICghbUZldGNoaW5nKSB7CiAgICAgICAgIG1MYXN0QWNjZXNzUG9zID0gb2Zmc2V0OwogICAgICAgICByZXN0YXJ0UHJlZmV0Y2hlcklmTmVjZXNzYXJ5X2woCkBAIC02NDksNyArNjU2LDcgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAotICAgIEFMT0dJKCJuZXcgcmFuZ2U6IG9mZnNldD0gJWxsZCIsIG9mZnNldCk7CisgICAgQUxPR0koIm5ldyByYW5nZTogb2Zmc2V0PSAlbGxkIiwgKGxvbmcgbG9uZylvZmZzZXQpOwogCiAgICAgbUNhY2hlT2Zmc2V0ID0gb2Zmc2V0OwogCkBAIC03MjgsMTAgKzczNSwxMCBAQAogICAgICAgICBtS2VlcEFsaXZlSW50ZXJ2YWxVcyA9IGtEZWZhdWx0S2VlcEFsaXZlSW50ZXJ2YWxVczsKICAgICB9CiAKLSAgICBBTE9HVigibG93d2F0ZXIgPSAlenUgYnl0ZXMsIGhpZ2h3YXRlciA9ICV6dSBieXRlcywga2VlcGFsaXZlID0gJSIgUFJJZDY0ICIgdXMiLAorICAgIEFMT0dWKCJsb3d3YXRlciA9ICV6dSBieXRlcywgaGlnaHdhdGVyID0gJXp1IGJ5dGVzLCBrZWVwYWxpdmUgPSAlbGxkIHVzIiwKICAgICAgICAgIG1Mb3d3YXRlclRocmVzaG9sZEJ5dGVzLAogICAgICAgICAgbUhpZ2h3YXRlclRocmVzaG9sZEJ5dGVzLAotICAgICAgICAgbUtlZXBBbGl2ZUludGVydmFsVXMpOworICAgICAgICAgKGxvbmcgbG9uZyltS2VlcEFsaXZlSW50ZXJ2YWxVcyk7CiB9CiAKIC8vIHN0YXRpYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ2xpZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENsaWVudC5jcHAKaW5kZXggMjMwYzFmNy4uZTY5ODkwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDbGllbnQuY3BwCkBAIC03Miw3ICs3Miw3IEBACiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9TVEFURVRZUEUqIHN0YXRlKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcmVNZXRhRGF0YUluQnVmZmVycygKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfQk9PTCBlbmFibGUpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9CT09MIGVuYWJsZSwgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2soCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlLApAQCAtOTAsNyArOTAsNyBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCB1c2VCdWZmZXIoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKLSAgICAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyKTsKKyAgICAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyLCBPTVhfVTMyIGFsbG90dGVkU2l6ZSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHVzZUdyYXBoaWNCdWZmZXIoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwKQEAgLTEwMiw3ICsxMDIsMTUgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlSW5wdXRTdXJmYWNlKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsCi0gICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqYnVmZmVyUHJvZHVjZXIpOworICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKmJ1ZmZlclByb2R1Y2VyLCBNZXRhZGF0YUJ1ZmZlclR5cGUgKnR5cGUpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQZXJzaXN0ZW50SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKmJ1ZmZlclByb2R1Y2VyLAorICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gKmJ1ZmZlckNvbnN1bWVyKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsCisgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiAmYnVmZmVyQ29uc3VtZXIsIE1ldGFkYXRhQnVmZmVyVHlwZSAqdHlwZSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0obm9kZV9pZCBub2RlKTsKIApAQCAtMTEyLDE4ICsxMjAsMTggQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXJXaXRoQmFja3VwKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCi0gICAgICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlcik7CisgICAgICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlciwgT01YX1UzMiBhbGxvdHRlZFNpemUpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBmcmVlQnVmZmVyKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIGJ1ZmZlcl9pZCBidWZmZXIpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmaWxsQnVmZmVyKG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlcik7CisgICAgdmlydHVhbCBzdGF0dXNfdCBmaWxsQnVmZmVyKG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlciwgaW50IGZlbmNlRmQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBlbXB0eUJ1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwKICAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIsCiAgICAgICAgICAgICBPTVhfVTMyIHJhbmdlX29mZnNldCwgT01YX1UzMiByYW5nZV9sZW5ndGgsCi0gICAgICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXAsIGludCBmZW5jZUZkKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RXh0ZW5zaW9uSW5kZXgoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsCkBAIC0yODQsOCArMjkyLDggQEAKIH0KIAogc3RhdHVzX3QgTXV4T01YOjpzdG9yZU1ldGFEYXRhSW5CdWZmZXJzKAotICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlKSB7Ci0gICAgcmV0dXJuIGdldE9NWChub2RlKS0+c3RvcmVNZXRhRGF0YUluQnVmZmVycyhub2RlLCBwb3J0X2luZGV4LCBlbmFibGUpOworICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlLCBNZXRhZGF0YUJ1ZmZlclR5cGUgKnR5cGUpIHsKKyAgICByZXR1cm4gZ2V0T01YKG5vZGUpLT5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzKG5vZGUsIHBvcnRfaW5kZXgsIGVuYWJsZSwgdHlwZSk7CiB9CiAKIHN0YXR1c190IE11eE9NWDo6cHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2soCkBAIC0zMTQsOCArMzIyLDggQEAKIAogc3RhdHVzX3QgTXV4T01YOjp1c2VCdWZmZXIoCiAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAotICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlcikgewotICAgIHJldHVybiBnZXRPTVgobm9kZSktPnVzZUJ1ZmZlcihub2RlLCBwb3J0X2luZGV4LCBwYXJhbXMsIGJ1ZmZlcik7CisgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyLCBPTVhfVTMyIGFsbG90dGVkU2l6ZSkgeworICAgIHJldHVybiBnZXRPTVgobm9kZSktPnVzZUJ1ZmZlcihub2RlLCBwb3J0X2luZGV4LCBwYXJhbXMsIGJ1ZmZlciwgYWxsb3R0ZWRTaXplKTsKIH0KIAogc3RhdHVzX3QgTXV4T01YOjp1c2VHcmFwaGljQnVmZmVyKApAQCAtMzM0LDEyICszNDIsMjYgQEAKIAogc3RhdHVzX3QgTXV4T01YOjpjcmVhdGVJbnB1dFN1cmZhY2UoCiAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LAotICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqYnVmZmVyUHJvZHVjZXIpIHsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKmJ1ZmZlclByb2R1Y2VyLCBNZXRhZGF0YUJ1ZmZlclR5cGUgKnR5cGUpIHsKICAgICBzdGF0dXNfdCBlcnIgPSBnZXRPTVgobm9kZSktPmNyZWF0ZUlucHV0U3VyZmFjZSgKLSAgICAgICAgICAgIG5vZGUsIHBvcnRfaW5kZXgsIGJ1ZmZlclByb2R1Y2VyKTsKKyAgICAgICAgICAgIG5vZGUsIHBvcnRfaW5kZXgsIGJ1ZmZlclByb2R1Y2VyLCB0eXBlKTsKICAgICByZXR1cm4gZXJyOwogfQogCitzdGF0dXNfdCBNdXhPTVg6OmNyZWF0ZVBlcnNpc3RlbnRJbnB1dFN1cmZhY2UoCisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpidWZmZXJQcm9kdWNlciwKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gKmJ1ZmZlckNvbnN1bWVyKSB7CisgICAgLy8gVE9ETzogbG9jYWwgb3IgcmVtb3RlPyBBbHdheXMgdXNlIHJlbW90ZSBmb3Igbm93CisgICAgcmV0dXJuIG1SZW1vdGVPTVgtPmNyZWF0ZVBlcnNpc3RlbnRJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBidWZmZXJQcm9kdWNlciwgYnVmZmVyQ29uc3VtZXIpOworfQorCitzdGF0dXNfdCBNdXhPTVg6OnNldElucHV0U3VyZmFjZSgKKyAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsCisgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+ICZidWZmZXJDb25zdW1lciwgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKSB7CisgICAgcmV0dXJuIGdldE9NWChub2RlKS0+c2V0SW5wdXRTdXJmYWNlKG5vZGUsIHBvcnRfaW5kZXgsIGJ1ZmZlckNvbnN1bWVyLCB0eXBlKTsKK30KKwogc3RhdHVzX3QgTXV4T01YOjpzaWduYWxFbmRPZklucHV0U3RyZWFtKG5vZGVfaWQgbm9kZSkgewogICAgIHJldHVybiBnZXRPTVgobm9kZSktPnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0obm9kZSk7CiB9CkBAIC0zNTMsOSArMzc1LDkgQEAKIAogc3RhdHVzX3QgTXV4T01YOjphbGxvY2F0ZUJ1ZmZlcldpdGhCYWNrdXAoCiAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAotICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlcikgeworICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlciwgT01YX1UzMiBhbGxvdHRlZFNpemUpIHsKICAgICByZXR1cm4gZ2V0T01YKG5vZGUpLT5hbGxvY2F0ZUJ1ZmZlcldpdGhCYWNrdXAoCi0gICAgICAgICAgICBub2RlLCBwb3J0X2luZGV4LCBwYXJhbXMsIGJ1ZmZlcik7CisgICAgICAgICAgICBub2RlLCBwb3J0X2luZGV4LCBwYXJhbXMsIGJ1ZmZlciwgYWxsb3R0ZWRTaXplKTsKIH0KIAogc3RhdHVzX3QgTXV4T01YOjpmcmVlQnVmZmVyKApAQCAtMzYzLDE3ICszODUsMTcgQEAKICAgICByZXR1cm4gZ2V0T01YKG5vZGUpLT5mcmVlQnVmZmVyKG5vZGUsIHBvcnRfaW5kZXgsIGJ1ZmZlcik7CiB9CiAKLXN0YXR1c190IE11eE9NWDo6ZmlsbEJ1ZmZlcihub2RlX2lkIG5vZGUsIGJ1ZmZlcl9pZCBidWZmZXIpIHsKLSAgICByZXR1cm4gZ2V0T01YKG5vZGUpLT5maWxsQnVmZmVyKG5vZGUsIGJ1ZmZlcik7CitzdGF0dXNfdCBNdXhPTVg6OmZpbGxCdWZmZXIobm9kZV9pZCBub2RlLCBidWZmZXJfaWQgYnVmZmVyLCBpbnQgZmVuY2VGZCkgeworICAgIHJldHVybiBnZXRPTVgobm9kZSktPmZpbGxCdWZmZXIobm9kZSwgYnVmZmVyLCBmZW5jZUZkKTsKIH0KIAogc3RhdHVzX3QgTXV4T01YOjplbXB0eUJ1ZmZlcigKICAgICAgICAgbm9kZV9pZCBub2RlLAogICAgICAgICBidWZmZXJfaWQgYnVmZmVyLAogICAgICAgICBPTVhfVTMyIHJhbmdlX29mZnNldCwgT01YX1UzMiByYW5nZV9sZW5ndGgsCi0gICAgICAgIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXApIHsKKyAgICAgICAgT01YX1UzMiBmbGFncywgT01YX1RJQ0tTIHRpbWVzdGFtcCwgaW50IGZlbmNlRmQpIHsKICAgICByZXR1cm4gZ2V0T01YKG5vZGUpLT5lbXB0eUJ1ZmZlcigKLSAgICAgICAgICAgIG5vZGUsIGJ1ZmZlciwgcmFuZ2Vfb2Zmc2V0LCByYW5nZV9sZW5ndGgsIGZsYWdzLCB0aW1lc3RhbXApOworICAgICAgICAgICAgbm9kZSwgYnVmZmVyLCByYW5nZV9vZmZzZXQsIHJhbmdlX2xlbmd0aCwgZmxhZ3MsIHRpbWVzdGFtcCwgZmVuY2VGZCk7CiB9CiAKIHN0YXR1c190IE11eE9NWDo6Z2V0RXh0ZW5zaW9uSW5kZXgoCkBAIC00MDAsMTAgKzQyMiwxNiBAQAogICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5wbGF5ZXIiKSk7CiAgICAgc3A8SU1lZGlhUGxheWVyU2VydmljZT4gc2VydmljZSA9IGludGVyZmFjZV9jYXN0PElNZWRpYVBsYXllclNlcnZpY2U+KGJpbmRlcik7CiAKLSAgICBDSEVDSyhzZXJ2aWNlLmdldCgpICE9IE5VTEwpOworICAgIGlmIChzZXJ2aWNlLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBvYnRhaW4gSU1lZGlhUGxheWVyU2VydmljZSIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CiAKICAgICBtT01YID0gc2VydmljZS0+Z2V0T01YKCk7Ci0gICAgQ0hFQ0sobU9NWC5nZXQoKSAhPSBOVUxMKTsKKyAgICBpZiAobU9NWC5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJDYW5ub3Qgb2J0YWluIElPTVgiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQogCiAgICAgaWYgKCFtT01YLT5saXZlc0xvY2FsbHkoMCAvKiBub2RlICovLCBnZXRwaWQoKSkpIHsKICAgICAgICAgQUxPR0koIlVzaW5nIGNsaWVudC1zaWRlIE9NWCBtdXguIik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKaW5kZXggZjQxYmJjMi4uNDYxOGUyMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcApAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU2tpcEN1dEJ1ZmZlci5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgpAQCAtMTE1LDEyICsxMTYsMTUgQEAKICAgICB9CiAKICAgICAvLyBmcm9tIElPTVhPYnNlcnZlcgotICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2UoY29uc3Qgb214X21lc3NhZ2UgJm1zZykgeworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VzKGNvbnN0IHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT4gJm1lc3NhZ2VzKSB7CiAgICAgICAgIHNwPE9NWENvZGVjPiBjb2RlYyA9IG1UYXJnZXQucHJvbW90ZSgpOwogCiAgICAgICAgIGlmIChjb2RlYy5nZXQoKSAhPSBOVUxMKSB7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soY29kZWMtPm1Mb2NrKTsKLSAgICAgICAgICAgIGNvZGVjLT5vbl9tZXNzYWdlKG1zZyk7CisgICAgICAgICAgICBmb3IgKHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWVzc2FnZXMuY2JlZ2luKCk7CisgICAgICAgICAgICAgICAgICBpdCAhPSBtZXNzYWdlcy5jZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICBjb2RlYy0+b25fbWVzc2FnZSgqaXQpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgY29kZWMuY2xlYXIoKTsKICAgICAgICAgfQogICAgIH0KQEAgLTM0NSwyMSArMzQ5LDYgQEAKIAogICAgICAgICBBTE9HVigiQXR0ZW1wdGluZyB0byBhbGxvY2F0ZSBPTVggbm9kZSAnJXMnIiwgY29tcG9uZW50TmFtZSk7CiAKLSAgICAgICAgaWYgKCFjcmVhdGVFbmNvZGVyCi0gICAgICAgICAgICAgICAgJiYgKHF1aXJrcyAmIGtPdXRwdXRCdWZmZXJzQXJlVW5yZWFkYWJsZSkKLSAgICAgICAgICAgICAgICAmJiAoZmxhZ3MgJiBrQ2xpZW50TmVlZHNGcmFtZWJ1ZmZlcikpIHsKLSAgICAgICAgICAgIGlmIChzdHJuY21wKGNvbXBvbmVudE5hbWUsICJPTVguU0VDLiIsIDgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gRm9yIE9NWC5TRUMuKiBkZWNvZGVycyB3ZSBjYW4gZW5hYmxlIGEgc3BlY2lhbCBtb2RlIHRoYXQKLSAgICAgICAgICAgICAgICAvLyBnaXZlcyB0aGUgY2xpZW50IGFjY2VzcyB0byB0aGUgZnJhbWVidWZmZXIgY29udGVudHMuCi0KLSAgICAgICAgICAgICAgICBBTE9HVygiQ29tcG9uZW50ICclcycgZG9lcyBub3QgZ2l2ZSB0aGUgY2xpZW50IGFjY2VzcyB0byAiCi0gICAgICAgICAgICAgICAgICAgICAidGhlIGZyYW1lYnVmZmVyIGNvbnRlbnRzLiBTa2lwcGluZy4iLAotICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZSk7Ci0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHN0YXR1c190IGVyciA9IG9teC0+YWxsb2NhdGVOb2RlKGNvbXBvbmVudE5hbWUsIG9ic2VydmVyLCAmbm9kZSk7CiAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgICAgIEFMT0dWKCJTdWNjZXNzZnVsbHkgYWxsb2NhdGVkIE9NWCBub2RlICclcyciLCBjb21wb25lbnROYW1lKTsKQEAgLTY2OCwzNSArNjU3LDYgQEAKIAogICAgIGluaXRPdXRwdXRGb3JtYXQobWV0YSk7CiAKLSAgICBpZiAoKG1GbGFncyAmIGtDbGllbnROZWVkc0ZyYW1lYnVmZmVyKQotICAgICAgICAgICAgJiYgIXN0cm5jbXAobUNvbXBvbmVudE5hbWUsICJPTVguU0VDLiIsIDgpKSB7Ci0gICAgICAgIC8vIFRoaXMgYXBwZWFycyB0byBubyBsb25nZXIgYmUgbmVlZGVkPz8/Ci0KLSAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleDsKLQotICAgICAgICBzdGF0dXNfdCBlcnIgPQotICAgICAgICAgICAgbU9NWC0+Z2V0RXh0ZW5zaW9uSW5kZXgoCi0gICAgICAgICAgICAgICAgICAgIG1Ob2RlLAotICAgICAgICAgICAgICAgICAgICAiT01YLlNFQy5pbmRleC5UaHVtYm5haWxNb2RlIiwKLSAgICAgICAgICAgICAgICAgICAgJmluZGV4KTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgT01YX0JPT0wgZW5hYmxlID0gT01YX1RSVUU7Ci0gICAgICAgIGVyciA9IG1PTVgtPnNldENvbmZpZyhtTm9kZSwgaW5kZXgsICZlbmFibGUsIHNpemVvZihlbmFibGUpKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBDT0RFQ19MT0dFKCJzZXRDb25maWcoJ09NWC5TRUMuaW5kZXguVGh1bWJuYWlsTW9kZScpICIKLSAgICAgICAgICAgICAgICAgICAgICAgInJldHVybmVkIGVycm9yIDB4JTA4eCIsIGVycik7Ci0KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBtUXVpcmtzICY9IH5rT3V0cHV0QnVmZmVyc0FyZVVucmVhZGFibGU7Ci0gICAgfQotCiAgICAgaWYgKG1OYXRpdmVXaW5kb3cgIT0gTlVMTAogICAgICAgICAmJiAhbUlzRW5jb2RlcgogICAgICAgICAmJiAhc3RybmNhc2VjbXAobU1JTUUsICJ2aWRlby8iLCA2KQpAQCAtMTA1Nyw3ICsxMDE3LDcgQEAKICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLAogICAgICAgICBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCYgZGVmYXVsdFByb2ZpbGVMZXZlbCwKICAgICAgICAgQ29kZWNQcm9maWxlTGV2ZWwgJnByb2ZpbGVMZXZlbCkgewotICAgIENPREVDX0xPR1YoIkRlZmF1bHQgcHJvZmlsZTogJWxkLCBsZXZlbCAlbGQiLAorICAgIENPREVDX0xPR1YoIkRlZmF1bHQgcHJvZmlsZTogJXUsIGxldmVsICN4JXgiLAogICAgICAgICAgICAgZGVmYXVsdFByb2ZpbGVMZXZlbC5tUHJvZmlsZSwgZGVmYXVsdFByb2ZpbGVMZXZlbC5tTGV2ZWwpOwogCiAgICAgLy8gQXJlIHRoZSBkZWZhdWx0IHByb2ZpbGUgYW5kIGxldmVsIG92ZXJ3cml0ZW4/CkBAIC0xMjgzLDcgKzEyNDMsNyBAQAogICAgIHN1Y2Nlc3MgPSBzdWNjZXNzICYmIG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KTsKICAgICBDSEVDSyhzdWNjZXNzKTsKIAotICAgIENPREVDX0xPR1YoInNldFZpZGVvT3V0cHV0Rm9ybWF0IHdpZHRoPSVsZCwgaGVpZ2h0PSVsZCIsIHdpZHRoLCBoZWlnaHQpOworICAgIENPREVDX0xPR1YoInNldFZpZGVvT3V0cHV0Rm9ybWF0IHdpZHRoPSVkLCBoZWlnaHQ9JWQiLCB3aWR0aCwgaGVpZ2h0KTsKIAogICAgIE9NWF9WSURFT19DT0RJTkdUWVBFIGNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKICAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCBtaW1lKSkgewpAQCAtMTY1MCw3ICsxNjEwLDcgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICBDT0RFQ19MT0dWKCJhbGxvY2F0aW5nICVsdSBidWZmZXJzIG9mIHNpemUgJWx1IG9uICVzIHBvcnQiLAorICAgIENPREVDX0xPR1YoImFsbG9jYXRpbmcgJXUgYnVmZmVycyBvZiBzaXplICV1IG9uICVzIHBvcnQiLAogICAgICAgICAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCwgZGVmLm5CdWZmZXJTaXplLAogICAgICAgICAgICAgcG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCA/ICJpbnB1dCIgOiAib3V0cHV0Iik7CiAKQEAgLTE2ODAsNyArMTY0MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mby5tRGF0YSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGVyciA9IG1PTVgtPmFsbG9jYXRlQnVmZmVyV2l0aEJhY2t1cCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBwb3J0SW5kZXgsIG1lbSwgJmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgcG9ydEluZGV4LCBtZW0sICZidWZmZXIsIG1lbS0+c2l6ZSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChwb3J0SW5kZXggPT0ga1BvcnRJbmRleE91dHB1dAogICAgICAgICAgICAgICAgICYmIChtUXVpcmtzICYga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbk91dHB1dFBvcnRzKSkgewpAQCAtMTY5MiwxMCArMTY1MiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8ubURhdGEpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBlcnIgPSBtT01YLT5hbGxvY2F0ZUJ1ZmZlcldpdGhCYWNrdXAoCi0gICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgcG9ydEluZGV4LCBtZW0sICZidWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIHBvcnRJbmRleCwgbWVtLCAmYnVmZmVyLCBtZW0tPnNpemUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlcnIgPSBtT01YLT51c2VCdWZmZXIobU5vZGUsIHBvcnRJbmRleCwgbWVtLCAmYnVmZmVyKTsKKyAgICAgICAgICAgIGVyciA9IG1PTVgtPnVzZUJ1ZmZlcihtTm9kZSwgcG9ydEluZGV4LCBtZW0sICZidWZmZXIsIG1lbS0+c2l6ZSgpKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTE3MjYsNyArMTY4Niw3IEBACiAKICAgICAgICAgbVBvcnRCdWZmZXJzW3BvcnRJbmRleF0ucHVzaChpbmZvKTsKIAotICAgICAgICBDT0RFQ19MT0dWKCJhbGxvY2F0ZWQgYnVmZmVyICVwIG9uICVzIHBvcnQiLCBidWZmZXIsCisgICAgICAgIENPREVDX0xPR1YoImFsbG9jYXRlZCBidWZmZXIgJXUgb24gJXMgcG9ydCIsIGJ1ZmZlciwKICAgICAgICAgICAgICBwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0ID8gImlucHV0IiA6ICJvdXRwdXQiKTsKICAgICB9CiAKQEAgLTE3NDgsNyArMTcwOCw3IEBACiAgICAgICAgICAgICAgICAgaWYgKG1Ta2lwQ3V0QnVmZmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHByZXZidWZmZXJzaXplID0gbVNraXBDdXRCdWZmZXItPnNpemUoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZidWZmZXJzaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJSZXBsYWNpbmcgU2tpcEN1dEJ1ZmZlciBob2xkaW5nICVkIGJ5dGVzIiwgcHJldmJ1ZmZlcnNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIlJlcGxhY2luZyBTa2lwQ3V0QnVmZmVyIGhvbGRpbmcgJXp1IGJ5dGVzIiwgcHJldmJ1ZmZlcnNpemUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1Ta2lwQ3V0QnVmZmVyID0gbmV3IFNraXBDdXRCdWZmZXIoZGVsYXkgKiBmcmFtZVNpemUsIHBhZGRpbmcgKiBmcmFtZVNpemUpOwpAQCAtMTc4NiwzNSArMTc0Niw2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBPTVhDb2RlYzo6YXBwbHlSb3RhdGlvbigpIHsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwotCi0gICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXM7Ci0gICAgaWYgKCFtZXRhLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmcm90YXRpb25EZWdyZWVzKSkgewotICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSAwOwotICAgIH0KLQotICAgIHVpbnQzMl90IHRyYW5zZm9ybTsKLSAgICBzd2l0Y2ggKHJvdGF0aW9uRGVncmVlcykgewotICAgICAgICBjYXNlIDA6IHRyYW5zZm9ybSA9IDA7IGJyZWFrOwotICAgICAgICBjYXNlIDkwOiB0cmFuc2Zvcm0gPSBIQUxfVFJBTlNGT1JNX1JPVF85MDsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTgwOiB0cmFuc2Zvcm0gPSBIQUxfVFJBTlNGT1JNX1JPVF8xODA7IGJyZWFrOwotICAgICAgICBjYXNlIDI3MDogdHJhbnNmb3JtID0gSEFMX1RSQU5TRk9STV9ST1RfMjcwOyBicmVhazsKLSAgICAgICAgZGVmYXVsdDogdHJhbnNmb3JtID0gMDsgYnJlYWs7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0KLSAgICBpZiAodHJhbnNmb3JtKSB7Ci0gICAgICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdHJhbnNmb3JtKAotICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksIHRyYW5zZm9ybSk7Ci0gICAgICAgIEFMT0dFKCJuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RyYW5zZm9ybSBmYWlsZWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCiBzdGF0dXNfdCBPTVhDb2RlYzo6YWxsb2NhdGVPdXRwdXRCdWZmZXJzRnJvbU5hdGl2ZVdpbmRvdygpIHsKICAgICAvLyBHZXQgdGhlIG51bWJlciBvZiBidWZmZXJzIG5lZWRlZC4KICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsKQEAgLTE4MjgsMjEgKzE3NTksMTEgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KAotICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwKLSAgICAgICAgICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsCi0gICAgICAgICAgICBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCwKLSAgICAgICAgICAgIGRlZi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0KTsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwogCi0gICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5IGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IGFwcGx5Um90YXRpb24oKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7CisgICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXM7CisgICAgaWYgKCFtZXRhLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmcm90YXRpb25EZWdyZWVzKSkgeworICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSAwOwogICAgIH0KIAogICAgIC8vIFNldCB1cCB0aGUgbmF0aXZlIHdpbmRvdy4KQEAgLTE4NTMsMzQgKzE3NzQsMTkgQEAKICAgICAgICAgLy8gWFhYOiBDdXJyZW50bHkgdGhpcyBlcnJvciBpcyBsb2dnZWQsIGJ1dCBub3QgZmF0YWwuCiAgICAgICAgIHVzYWdlID0gMDsKICAgICB9CisKICAgICBpZiAobUZsYWdzICYga0VuYWJsZUdyYWxsb2NVc2FnZVByb3RlY3RlZCkgewogICAgICAgICB1c2FnZSB8PSBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRDsKICAgICB9CiAKLSAgICAvLyBNYWtlIHN1cmUgdG8gY2hlY2sgd2hldGhlciBlaXRoZXIgU3RhZ2VmcmlnaHQgb3IgdGhlIHZpZGVvIGRlY29kZXIKLSAgICAvLyByZXF1ZXN0ZWQgcHJvdGVjdGVkIGJ1ZmZlcnMuCi0gICAgaWYgKHVzYWdlICYgR1JBTExPQ19VU0FHRV9QUk9URUNURUQpIHsKLSAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIEFOYXRpdmVXaW5kb3cgc2VuZHMgaW1hZ2VzIGRpcmVjdGx5IHRvCi0gICAgICAgIC8vIFN1cmZhY2VGbGluZ2VyLgotICAgICAgICBpbnQgcXVldWVzVG9OYXRpdmVXaW5kb3cgPSAwOwotICAgICAgICBlcnIgPSBtTmF0aXZlV2luZG93LT5xdWVyeSgKLSAgICAgICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLCBOQVRJVkVfV0lORE9XX1FVRVVFU19UT19XSU5ET1dfQ09NUE9TRVIsCi0gICAgICAgICAgICAgICAgJnF1ZXVlc1RvTmF0aXZlV2luZG93KTsKLSAgICAgICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3IgYXV0aGVudGljYXRpbmcgbmF0aXZlIHdpbmRvdzogJWQiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBpZiAocXVldWVzVG9OYXRpdmVXaW5kb3cgIT0gMSkgewotICAgICAgICAgICAgQUxPR0UoIm5hdGl2ZSB3aW5kb3cgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEFMT0dWKCJuYXRpdmVfd2luZG93X3NldF91c2FnZSB1c2FnZT0weCVseCIsIHVzYWdlKTsKLSAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF91c2FnZSgKLSAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksIHVzYWdlIHwgR1JBTExPQ19VU0FHRV9IV19URVhUVVJFIHwgR1JBTExPQ19VU0FHRV9FWFRFUk5BTF9ESVNQKTsKKyAgICBlcnIgPSBzZXROYXRpdmVXaW5kb3dTaXplRm9ybWF0QW5kVXNhZ2UoCisgICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLAorICAgICAgICAgICAgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCwKKyAgICAgICAgICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0LAorICAgICAgICAgICAgZGVmLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQsCisgICAgICAgICAgICByb3RhdGlvbkRlZ3JlZXMsCisgICAgICAgICAgICB1c2FnZSB8IEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSB8IEdSQUxMT0NfVVNBR0VfRVhURVJOQUxfRElTUCk7CiAgICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJuYXRpdmVfd2luZG93X3NldF91c2FnZSBmYWlsZWQ6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwgLWVycik7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCkBAIC0yMDQ3LDE1MCArMTk1Myw2IEBACiAgICAgcmV0dXJuIGJ1ZkluZm87CiB9CiAKLXN0YXR1c190IE9NWENvZGVjOjpwdXNoQmxhbmtCdWZmZXJzVG9OYXRpdmVXaW5kb3coKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gTk9fRVJST1I7Ci0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iID0gTlVMTDsKLSAgICBpbnQgbnVtQnVmcyA9IDA7Ci0gICAgaW50IG1pblVuZGVxdWV1ZWRCdWZzID0gMDsKLQotICAgIC8vIFdlIG5lZWQgdG8gcmVjb25uZWN0IHRvIHRoZSBBTmF0aXZlV2luZG93IGFzIGEgQ1BVIGNsaWVudCB0byBlbnN1cmUgdGhhdAotICAgIC8vIG5vIGZyYW1lcyBnZXQgZHJvcHBlZCBieSBTdXJmYWNlRmxpbmdlciBhc3N1bWluZyB0aGF0IHRoZXNlIGFyZSB2aWRlbwotICAgIC8vIGZyYW1lcy4KLSAgICBlcnIgPSBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KG1OYXRpdmVXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IGFwaV9kaXNjb25uZWN0IGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3QobU5hdGl2ZVdpbmRvdy5nZXQoKSwKLSAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQVBJX0NQVSk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IGFwaV9jb25uZWN0IGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobU5hdGl2ZVdpbmRvdy5nZXQoKSwgMSwgMSwKLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfUkdCWF84ODg4KTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogc2V0X2J1ZmZlcnNfZ2VvbWV0cnkgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UobU5hdGl2ZVdpbmRvdy5nZXQoKSwKLSAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4pOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoImVycm9yIHB1c2hpbmcgYmxhbmsgZnJhbWVzOiBzZXRfdXNhZ2UgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfc2NhbGluZ19tb2RlKG1OYXRpdmVXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICBOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19XSU5ET1cpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoImVycm9yIHB1c2hpbmcgYmxhbmsgZnJhbWVzOiBzZXRfc2NhbGluZ19tb2RlIGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIGVyciA9IG1OYXRpdmVXaW5kb3ctPnF1ZXJ5KG1OYXRpdmVXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMsICZtaW5VbmRlcXVldWVkQnVmcyk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IE1JTl9VTkRFUVVFVUVEX0JVRkZFUlMgcXVlcnkgIgotICAgICAgICAgICAgICAgICJmYWlsZWQ6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgbnVtQnVmcyA9IG1pblVuZGVxdWV1ZWRCdWZzICsgMTsKLSAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQobU5hdGl2ZVdpbmRvdy5nZXQoKSwgbnVtQnVmcyk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IHNldF9idWZmZXJfY291bnQgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgLy8gV2UgIHB1c2ggbnVtQnVmcyArIDEgYnVmZmVycyB0byBlbnN1cmUgdGhhdCB3ZSd2ZSBkcmF3biBpbnRvIHRoZSBzYW1lCi0gICAgLy8gYnVmZmVyIHR3aWNlLiAgVGhpcyBzaG91bGQgZ3VhcmFudGVlIHRoYXQgdGhlIGJ1ZmZlciBoYXMgYmVlbiBkaXNwbGF5ZWQKLSAgICAvLyBvbiB0aGUgc2NyZWVuIGFuZCB0aGVuIGJlZW4gcmVwbGFjZWQsIHNvIGFuIHByZXZpb3VzIHZpZGVvIGZyYW1lcyBhcmUKLSAgICAvLyBndWFyYW50ZWVkIE5PVCB0byBiZSBjdXJyZW50bHkgZGlzcGxheWVkLgotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQnVmcyArIDE7IGkrKykgewotICAgICAgICBlcnIgPSBuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0KG1OYXRpdmVXaW5kb3cuZ2V0KCksICZhbmIpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IGRlcXVldWVCdWZmZXIgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotCi0gICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZihuZXcgR3JhcGhpY0J1ZmZlcihhbmIsIGZhbHNlKSk7Ci0KLSAgICAgICAgLy8gRmlsbCB0aGUgYnVmZmVyIHdpdGggdGhlIGEgMXgxIGNoZWNrZXJib2FyZCBwYXR0ZXJuIDspCi0gICAgICAgIHVpbnQzMl90KiBpbWcgPSBOVUxMOwotICAgICAgICBlcnIgPSBidWYtPmxvY2soR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgKHZvaWQqKikoJmltZykpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IGxvY2sgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotCi0gICAgICAgICppbWcgPSAwOwotCi0gICAgICAgIGVyciA9IGJ1Zi0+dW5sb2NrKCk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogdW5sb2NrIGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBtTmF0aXZlV2luZG93LT5xdWV1ZUJ1ZmZlcihtTmF0aXZlV2luZG93LmdldCgpLAotICAgICAgICAgICAgICAgIGJ1Zi0+Z2V0TmF0aXZlQnVmZmVyKCksIC0xKTsKLSAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR0UoImVycm9yIHB1c2hpbmcgYmxhbmsgZnJhbWVzOiBxdWV1ZUJ1ZmZlciBmYWlsZWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0KLSAgICAgICAgYW5iID0gTlVMTDsKLSAgICB9Ci0KLWVycm9yOgotCi0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAvLyBDbGVhbiB1cCBhZnRlciBhbiBlcnJvci4KLSAgICAgICAgaWYgKGFuYiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtTmF0aXZlV2luZG93LT5jYW5jZWxCdWZmZXIobU5hdGl2ZVdpbmRvdy5nZXQoKSwgYW5iLCAtMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KG1OYXRpdmVXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19BUElfQ1BVKTsKLSAgICAgICAgbmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdChtTmF0aXZlV2luZG93LmdldCgpLAotICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIENsZWFuIHVwIGFmdGVyIHN1Y2Nlc3MuCi0gICAgICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3QobU5hdGl2ZVdpbmRvdy5nZXQoKSwKLSAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX0FQSV9DUFUpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IGFwaV9kaXNjb25uZWN0IGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBuYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KG1OYXRpdmVXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IGFwaV9jb25uZWN0IGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotfQotCiBpbnQ2NF90IE9NWENvZGVjOjpnZXREZWNvZGluZ1RpbWVVcygpIHsKICAgICBDSEVDSyhtSXNFbmNvZGVyICYmIG1Jc1ZpZGVvKTsKIApAQCAtMjcxMSw3ICsyNDczLDcgQEAKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICB7Ci0gICAgICAgICAgICBDT0RFQ19MT0dWKCJDTURfQ09NUExFVEUoJWQsICVsZCkiLCBjbWQsIGRhdGEpOworICAgICAgICAgICAgQ09ERUNfTE9HVigiQ01EX0NPTVBMRVRFKCVkLCAldSkiLCBjbWQsIGRhdGEpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC0yNzM3LDcgKzI0OTksNyBAQAogICAgICAgICAgICAgICAgIGlmIChjb3VudEJ1ZmZlcnNXZU93bihtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleElucHV0XSkgIT0KICAgICAgICAgICAgICAgICAgICAgbVBvcnRCdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF0uc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb2RlYyBkaWQgbm90IHJldHVybiBhbGwgaW5wdXQgYnVmZmVycyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIocmVjZWl2ZWQgJWQgLyAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKHJlY2VpdmVkICV6dSAvICV6dSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyc1dlT3duKG1Qb3J0QnVmZmVyc1trUG9ydEluZGV4SW5wdXRdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleElucHV0XS5zaXplKCkpOwogICAgICAgICAgICAgICAgICAgICBUUkVTUEFTUygpOwpAQCAtMjc0Niw3ICsyNTA4LDcgQEAKICAgICAgICAgICAgICAgICBpZiAoY291bnRCdWZmZXJzV2VPd24obVBvcnRCdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdKSAhPQogICAgICAgICAgICAgICAgICAgICBtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb2RlYyBkaWQgbm90IHJldHVybiBhbGwgb3V0cHV0IGJ1ZmZlcnMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiKHJlY2VpdmVkICVkIC8gJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIihyZWNlaXZlZCAlenUgLyAlenUpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlcnNXZU93bihtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb3J0QnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XS5zaXplKCkpOwogICAgICAgICAgICAgICAgICAgICBUUkVTUEFTUygpOwpAQCAtMjc3Miw3ICsyNTM0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbSBoYXMgbWFkZSBpdCB0byB0aGUgZGlzcGxheS4gIFRoaXMgYWxsb3dzIHRoZSBPTVgKICAgICAgICAgICAgICAgICAgICAgLy8gY29tcG9uZW50IHRlYXJkb3duIHRvIHplcm8gb3V0IGFueSBwcm90ZWN0ZWQgYnVmZmVycwogICAgICAgICAgICAgICAgICAgICAvLyB3aXRob3V0IHRoZSByaXNrIG9mIHNjYW5uaW5nIG91dCBvbmUgb2YgdGhvc2UgYnVmZmVycy4KLSAgICAgICAgICAgICAgICAgICAgcHVzaEJsYW5rQnVmZmVyc1RvTmF0aXZlV2luZG93KCk7CisgICAgICAgICAgICAgICAgICAgIHB1c2hCbGFua0J1ZmZlcnNUb05hdGl2ZVdpbmRvdyhtTmF0aXZlV2luZG93LmdldCgpKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBzZXRTdGF0ZShJRExFX1RPX0xPQURFRCk7CkBAIC0yODUwLDcgKzI2MTIsNyBAQAogICAgICAgICBDSEVDSyhpbmZvLT5tU3RhdHVzID09IE9XTkVEX0JZX1VTCiAgICAgICAgICAgICAgICAgfHwgaW5mby0+bVN0YXR1cyA9PSBPV05FRF9CWV9OQVRJVkVfV0lORE9XKTsKIAotICAgICAgICBDT0RFQ19MT0dWKCJmcmVlaW5nIGJ1ZmZlciAlcCBvbiBwb3J0ICVsZCIsIGluZm8tPm1CdWZmZXIsIHBvcnRJbmRleCk7CisgICAgICAgIENPREVDX0xPR1YoImZyZWVpbmcgYnVmZmVyICV1IG9uIHBvcnQgJXUiLCBpbmZvLT5tQnVmZmVyLCBwb3J0SW5kZXgpOwogCiAgICAgICAgIHN0YXR1c190IGVyciA9IGZyZWVCdWZmZXIocG9ydEluZGV4LCBpKTsKIApAQCAtMjg5Nyw3ICsyNjU5LDcgQEAKIH0KIAogdm9pZCBPTVhDb2RlYzo6b25Qb3J0U2V0dGluZ3NDaGFuZ2VkKE9NWF9VMzIgcG9ydEluZGV4KSB7Ci0gICAgQ09ERUNfTE9HVigiUE9SVF9TRVRUSU5HU19DSEFOR0VEKCVsZCkiLCBwb3J0SW5kZXgpOworICAgIENPREVDX0xPR1YoIlBPUlRfU0VUVElOR1NfQ0hBTkdFRCgldSkiLCBwb3J0SW5kZXgpOwogCiAgICAgQ0hFQ0sobVN0YXRlID09IEVYRUNVVElORyB8fCBtU3RhdGUgPT0gRVhFQ1VUSU5HX1RPX0lETEUpOwogICAgIENIRUNLX0VRKHBvcnRJbmRleCwgKE9NWF9VMzIpa1BvcnRJbmRleE91dHB1dCk7CkBAIC0yOTI0LDcgKzI2ODYsNyBAQAogICAgIENIRUNLKG1TdGF0ZSA9PSBFWEVDVVRJTkcgfHwgbVN0YXRlID09IFJFQ09ORklHVVJJTkcKICAgICAgICAgICAgIHx8IG1TdGF0ZSA9PSBFWEVDVVRJTkdfVE9fSURMRSk7CiAKLSAgICBDT0RFQ19MT0dWKCJmbHVzaFBvcnRBc3luYyglbGQpOiB3ZSBvd24gJWQgb3V0IG9mICVkIGJ1ZmZlcnMgYWxyZWFkeS4iLAorICAgIENPREVDX0xPR1YoImZsdXNoUG9ydEFzeW5jKCV1KTogd2Ugb3duICV6dSBvdXQgb2YgJXp1IGJ1ZmZlcnMgYWxyZWFkeS4iLAogICAgICAgICAgcG9ydEluZGV4LCBjb3VudEJ1ZmZlcnNXZU93bihtUG9ydEJ1ZmZlcnNbcG9ydEluZGV4XSksCiAgICAgICAgICBtUG9ydEJ1ZmZlcnNbcG9ydEluZGV4XS5zaXplKCkpOwogCkBAIC0yOTUzLDcgKzI3MTUsNyBAQAogICAgIENIRUNLX0VRKChpbnQpbVBvcnRTdGF0dXNbcG9ydEluZGV4XSwgKGludClFTkFCTEVEKTsKICAgICBtUG9ydFN0YXR1c1twb3J0SW5kZXhdID0gRElTQUJMSU5HOwogCi0gICAgQ09ERUNfTE9HVigic2VuZGluZyBPTVhfQ29tbWFuZFBvcnREaXNhYmxlKCVsZCkiLCBwb3J0SW5kZXgpOworICAgIENPREVDX0xPR1YoInNlbmRpbmcgT01YX0NvbW1hbmRQb3J0RGlzYWJsZSgldSkiLCBwb3J0SW5kZXgpOwogICAgIHN0YXR1c190IGVyciA9CiAgICAgICAgIG1PTVgtPnNlbmRDb21tYW5kKG1Ob2RlLCBPTVhfQ29tbWFuZFBvcnREaXNhYmxlLCBwb3J0SW5kZXgpOwogICAgIENIRUNLX0VRKGVyciwgKHN0YXR1c190KU9LKTsKQEAgLTI5NjcsNyArMjcyOSw3IEBACiAgICAgQ0hFQ0tfRVEoKGludCltUG9ydFN0YXR1c1twb3J0SW5kZXhdLCAoaW50KURJU0FCTEVEKTsKICAgICBtUG9ydFN0YXR1c1twb3J0SW5kZXhdID0gRU5BQkxJTkc7CiAKLSAgICBDT0RFQ19MT0dWKCJzZW5kaW5nIE9NWF9Db21tYW5kUG9ydEVuYWJsZSglbGQpIiwgcG9ydEluZGV4KTsKKyAgICBDT0RFQ19MT0dWKCJzZW5kaW5nIE9NWF9Db21tYW5kUG9ydEVuYWJsZSgldSkiLCBwb3J0SW5kZXgpOwogICAgIHJldHVybiBtT01YLT5zZW5kQ29tbWFuZChtTm9kZSwgT01YX0NvbW1hbmRQb3J0RW5hYmxlLCBwb3J0SW5kZXgpOwogfQogCkBAIC0zMDQwLDcgKzI4MDIsNyBAQAogCiAgICAgICAgIGlmIChpbmZvLT5tRGF0YSA9PSBwdHIpIHsKICAgICAgICAgICAgIENPREVDX0xPR1YoCi0gICAgICAgICAgICAgICAgICAgICJpbnB1dCBidWZmZXIgZGF0YSBwdHIgPSAlcCwgYnVmZmVyX2lkID0gJXAiLAorICAgICAgICAgICAgICAgICAgICAiaW5wdXQgYnVmZmVyIGRhdGEgcHRyID0gJXAsIGJ1ZmZlcl9pZCA9ICV1IiwKICAgICAgICAgICAgICAgICAgICAgcHRyLAogICAgICAgICAgICAgICAgICAgICBpbmZvLT5tQnVmZmVyKTsKIApAQCAtMzE1MCw3ICsyOTEyLDcgQEAKICAgICAgICAgICAgICAgICBpZiAoc3JjQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCAmdGFyZ2V0VGltZVVzKQogICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGFyZ2V0VGltZVVzID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQ09ERUNfTE9HVigidGFyZ2V0VGltZVVzID0gJWxsZCB1cyIsIHRhcmdldFRpbWVVcyk7CisgICAgICAgICAgICAgICAgICAgIENPREVDX0xPR1YoInRhcmdldFRpbWVVcyA9ICVsbGQgdXMiLCAobG9uZyBsb25nKXRhcmdldFRpbWVVcyk7CiAgICAgICAgICAgICAgICAgICAgIG1UYXJnZXRUaW1lVXMgPSB0YXJnZXRUaW1lVXM7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgbVRhcmdldFRpbWVVcyA9IC0xOwpAQCAtMzE4NCw3ICsyOTQ2LDcgQEAKICAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gMCkgewogICAgICAgICAgICAgICAgIENPREVDX0xPR0UoCiAgICAgICAgICAgICAgICAgICAgICAiQ29kZWMncyBpbnB1dCBidWZmZXJzIGFyZSB0b28gc21hbGwgdG8gYWNjb21vZGF0ZSAiCi0gICAgICAgICAgICAgICAgICAgICAiYnVmZmVyIHJlYWQgZnJvbSBzb3VyY2UgKGluZm8tPm1TaXplID0gJWQsIHNyY0xlbmd0aCA9ICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyIHJlYWQgZnJvbSBzb3VyY2UgKGluZm8tPm1TaXplID0gJXp1LCBzcmNMZW5ndGggPSAlenUpIiwKICAgICAgICAgICAgICAgICAgICAgIGluZm8tPm1TaXplLCBzcmNCdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKIAogICAgICAgICAgICAgICAgIHNyY0J1ZmZlci0+cmVsZWFzZSgpOwpAQCAtMzI5MCwxMCArMzA1MiwxMCBAQAogICAgICAgICBpbmZvID0gZmluZEVtcHR5SW5wdXRCdWZmZXIoKTsKICAgICB9CiAKLSAgICBDT0RFQ19MT0dWKCJDYWxsaW5nIGVtcHR5QnVmZmVyIG9uIGJ1ZmZlciAlcCAobGVuZ3RoICVkKSwgIgorICAgIENPREVDX0xPR1YoIkNhbGxpbmcgZW1wdHlCdWZmZXIgb24gYnVmZmVyICV1IChsZW5ndGggJXp1KSwgIgogICAgICAgICAgICAgICAgInRpbWVzdGFtcCAlbGxkIHVzICglLjJmIHNlY3MpIiwKICAgICAgICAgICAgICAgIGluZm8tPm1CdWZmZXIsIG9mZnNldCwKLSAgICAgICAgICAgICAgIHRpbWVzdGFtcFVzLCB0aW1lc3RhbXBVcyAvIDFFNik7CisgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVzdGFtcFVzLCB0aW1lc3RhbXBVcyAvIDFFNik7CiAKICAgICBlcnIgPSBtT01YLT5lbXB0eUJ1ZmZlcigKICAgICAgICAgICAgIG1Ob2RlLCBpbmZvLT5tQnVmZmVyLCAwLCBvZmZzZXQsCkBAIC0zMzE4LDcgKzMwODAsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgQ09ERUNfTE9HVigiQ2FsbGluZyBmaWxsQnVmZmVyIG9uIGJ1ZmZlciAlcCIsIGluZm8tPm1CdWZmZXIpOworICAgIENPREVDX0xPR1YoIkNhbGxpbmcgZmlsbEJ1ZmZlciBvbiBidWZmZXIgJXUiLCBpbmZvLT5tQnVmZmVyKTsKICAgICBzdGF0dXNfdCBlcnIgPSBtT01YLT5maWxsQnVmZmVyKG1Ob2RlLCBpbmZvLT5tQnVmZmVyKTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTMzNzUsNyArMzEzNyw3IEBACiAgICAgfQogICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJGaWxsZWQud2FpdFJlbGF0aXZlKG1Mb2NrLCBrQnVmZmVyRmlsbGVkRXZlbnRUaW1lT3V0TnMpOwogICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQ09ERUNfTE9HRSgiVGltZWQgb3V0IHdhaXRpbmcgZm9yIG91dHB1dCBidWZmZXJzOiAlZC8lZCIsCisgICAgICAgIENPREVDX0xPR0UoIlRpbWVkIG91dCB3YWl0aW5nIGZvciBvdXRwdXQgYnVmZmVyczogJXp1LyV6dSIsCiAgICAgICAgICAgICBjb3VudEJ1ZmZlcnNXZU93bihtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleElucHV0XSksCiAgICAgICAgICAgICBjb3VudEJ1ZmZlcnNXZU93bihtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0pKTsKICAgICB9CkBAIC0zNjMwLDcgKzMzOTIsNyBAQAogCiB2b2lkIE9NWENvZGVjOjpzZXRJbWFnZU91dHB1dEZvcm1hdCgKICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZm9ybWF0LCBPTVhfVTMyIHdpZHRoLCBPTVhfVTMyIGhlaWdodCkgewotICAgIENPREVDX0xPR1YoInNldEltYWdlT3V0cHV0Rm9ybWF0KCVsZCwgJWxkKSIsIHdpZHRoLCBoZWlnaHQpOworICAgIENPREVDX0xPR1YoInNldEltYWdlT3V0cHV0Rm9ybWF0KCV1LCAldSkiLCB3aWR0aCwgaGVpZ2h0KTsKIAogI2lmIDAKICAgICBPTVhfSU5ERVhUWVBFIGluZGV4OwpAQCAtNDI4NCwxNCArNDA0NiwxNCBAQAogICAgICAgICAgICAgICAgIGlmICgoT01YX1UzMiludW1DaGFubmVscyAhPSBwYXJhbXMubkNoYW5uZWxzKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJDb2RlYyBvdXRwdXRzIGEgZGlmZmVyZW50IG51bWJlciBvZiBjaGFubmVscyB0aGFuICIKICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIGlucHV0IHN0cmVhbSBjb250YWlucyAoY29udGFpbnMgJWQgY2hhbm5lbHMsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiY29kZWMgb3V0cHV0cyAlbGQgY2hhbm5lbHMpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImNvZGVjIG91dHB1dHMgJXUgY2hhbm5lbHMpLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsIHBhcmFtcy5uQ2hhbm5lbHMpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChzYW1wbGVSYXRlICE9IChpbnQzMl90KXBhcmFtcy5uU2FtcGxpbmdSYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJDb2RlYyBvdXRwdXRzIGF0IGRpZmZlcmVudCBzYW1wbGluZyByYXRlIHRoYW4gIgogICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGF0IHRoZSBpbnB1dCBzdHJlYW0gY29udGFpbnMgKGNvbnRhaW5zIGRhdGEgYXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICIlZCBIeiwgY29kZWMgb3V0cHV0cyAlbHUgSHopIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJWQgSHosIGNvZGVjIG91dHB1dHMgJXUgSHopIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBwYXJhbXMublNhbXBsaW5nUmF0ZSk7CiAgICAgICAgICAgICAgICAgfQogCkBAIC00MzkzLDggKzQxNTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRDcm9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN0LCBzaXplb2YocmVjdCkpOwogCi0gICAgICAgICAgICAgICAgQ09ERUNfTE9HSSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlbyBkaW1lbnNpb25zIGFyZSAlbGQgeCAlbGQiLAorICAgICAgICAgICAgICAgIENPREVDX0xPR0koInZpZGVvIGRpbWVuc2lvbnMgYXJlICV1IHggJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9fZGVmLT5uRnJhbWVXaWR0aCwgdmlkZW9fZGVmLT5uRnJhbWVIZWlnaHQpOwogCiAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewpAQCAtNDQxMiw4ICs0MTczLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5MZWZ0ICsgcmVjdC5uV2lkdGggLSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCArIHJlY3QubkhlaWdodCAtIDEpOwogCi0gICAgICAgICAgICAgICAgICAgIENPREVDX0xPR0koCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyb3AgcmVjdCBpcyAlbGQgeCAlbGQgQCAoJWxkLCAlbGQpIiwKKyAgICAgICAgICAgICAgICAgICAgQ09ERUNfTE9HSSgiQ3JvcCByZWN0IGlzICV1IHggJXUgQCAoJWQsICVkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uV2lkdGgsIHJlY3QubkhlaWdodCwgcmVjdC5uTGVmdCwgcmVjdC5uVG9wKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBtT3V0cHV0Rm9ybWF0LT5zZXRSZWN0KApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ0V4dHJhY3Rvci5jcHAKaW5kZXggYmNhMjZiOS4uNTc4MTcxZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dFeHRyYWN0b3IuY3BwCkBAIC02NywyNCArNjcsMjggQEAKICAgICBPZ2dTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBPZ2dTb3VyY2UgJik7CiB9OwogCi1zdHJ1Y3QgTXlWb3JiaXNFeHRyYWN0b3IgewotICAgIE15Vm9yYmlzRXh0cmFjdG9yKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpOwotICAgIHZpcnR1YWwgfk15Vm9yYmlzRXh0cmFjdG9yKCk7CitzdHJ1Y3QgTXlPZ2dFeHRyYWN0b3IgeworICAgIE15T2dnRXh0cmFjdG9yKAorICAgICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWVUeXBlLAorICAgICAgICAgICAgc2l6ZV90IG51bUhlYWRlcnMsCisgICAgICAgICAgICBpbnQ2NF90IHNlZWtQcmVSb2xsVXMpOworICAgIHZpcnR1YWwgfk15T2dnRXh0cmFjdG9yKCk7CiAKICAgICBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCkgY29uc3Q7CiAKICAgICAvLyBSZXR1cm5zIGFuIGFwcHJveGltYXRlIGJpdHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kLgotICAgIHVpbnQ2NF90IGFwcHJveEJpdHJhdGUoKTsKKyAgICB2aXJ0dWFsIHVpbnQ2NF90IGFwcHJveEJpdHJhdGUoKSBjb25zdCA9IDA7CiAKICAgICBzdGF0dXNfdCBzZWVrVG9UaW1lKGludDY0X3QgdGltZVVzKTsKICAgICBzdGF0dXNfdCBzZWVrVG9PZmZzZXQob2ZmNjRfdCBvZmZzZXQpOwotICAgIHN0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyICoqYnVmZmVyLCBib29sIGNvbmYpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXIgKipidWZmZXIpID0gMDsKIAogICAgIHN0YXR1c190IGluaXQoKTsKIAogICAgIHNwPE1ldGFEYXRhPiBnZXRGaWxlTWV0YURhdGEoKSB7IHJldHVybiBtRmlsZU1ldGE7IH0KIAotcHJpdmF0ZToKK3Byb3RlY3RlZDoKICAgICBzdHJ1Y3QgUGFnZSB7CiAgICAgICAgIHVpbnQ2NF90IG1HcmFudWxlUG9zaXRpb247CiAgICAgICAgIGludDMyX3QgbVByZXZQYWNrZXRTaXplOwpAQCAtMTA0LDEyICsxMDgsMTcgQEAKICAgICBzcDxEYXRhU291cmNlPiBtU291cmNlOwogICAgIG9mZjY0X3QgbU9mZnNldDsKICAgICBQYWdlIG1DdXJyZW50UGFnZTsKKyAgICB1aW50NjRfdCBtQ3VyR3JhbnVsZVBvc2l0aW9uOwogICAgIHVpbnQ2NF90IG1QcmV2R3JhbnVsZVBvc2l0aW9uOwogICAgIHNpemVfdCBtQ3VycmVudFBhZ2VTaXplOwogICAgIGJvb2wgbUZpcnN0UGFja2V0SW5QYWdlOwogICAgIHVpbnQ2NF90IG1DdXJyZW50UGFnZVNhbXBsZXM7CiAgICAgc2l6ZV90IG1OZXh0TGFjZUluZGV4OwogCisgICAgY29uc3QgY2hhciAqbU1pbWVUeXBlOworICAgIHNpemVfdCBtTnVtSGVhZGVyczsKKyAgICBpbnQ2NF90IG1TZWVrUHJlUm9sbFVzOworCiAgICAgb2ZmNjRfdCBtRmlyc3REYXRhT2Zmc2V0OwogCiAgICAgdm9yYmlzX2luZm8gbVZpOwpAQCAtMTIzLDEwICsxMzIsMjYgQEAKICAgICBzc2l6ZV90IHJlYWRQYWdlKG9mZjY0X3Qgb2Zmc2V0LCBQYWdlICpwYWdlKTsKICAgICBzdGF0dXNfdCBmaW5kTmV4dFBhZ2Uob2ZmNjRfdCBzdGFydE9mZnNldCwgb2ZmNjRfdCAqcGFnZU9mZnNldCk7CiAKLSAgICBzdGF0dXNfdCB2ZXJpZnlIZWFkZXIoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpOworICAgIHZpcnR1YWwgaW50NjRfdCBnZXRUaW1lVXNPZkdyYW51bGUodWludDY0X3QgZ3JhbnVsZVBvcykgY29uc3QgPSAwOwogCi0gICAgaW50MzJfdCBwYWNrZXRCbG9ja1NpemUoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CisgICAgLy8gRXh0cmFjdCBjb2RlYyBmb3JtYXQsIG1ldGFkYXRhIHRhZ3MsIGFuZCB2YXJpb3VzIGNvZGVjIHNwZWNpZmljIGRhdGE7CisgICAgLy8gdGhlIGZvcm1hdCBhbmQgQ1NEJ3MgYXJlIHJlcXVpcmVkIHRvIHNldHVwIHRoZSBkZWNvZGVycyBmb3IgdGhlIGVuY2xvc2VkIG1lZGlhIGNvbnRlbnQuCisgICAgLy8KKyAgICAvLyBWYWxpZCB2YWx1ZXMgZm9yIGB0eXBlYCBhcmU6CisgICAgLy8gMSAtIGJpdHN0cmVhbSBpZGVudGlmaWNhdGlvbiBoZWFkZXIKKyAgICAvLyAzIC0gY29tbWVudCBoZWFkZXIKKyAgICAvLyA1IC0gY29kZWMgc2V0dXAgaGVhZGVyIChWb3JiaXMgb25seSkKKyAgICB2aXJ0dWFsIHN0YXR1c190IHZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpID0gMDsKKworICAgIC8vIFJlYWQgdGhlIG5leHQgb2dnIHBhY2tldCBmcm9tIHRoZSB1bmRlcmx5aW5nIGRhdGEgc291cmNlOyBvcHRpb25hbGx5CisgICAgLy8gY2FsY3VsYXRlIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSBvdXRwdXQgcGFja2V0IHdoaWxzdCBwcmV0ZW5kaW5nCisgICAgLy8gdGhhdCB3ZSBhcmUgcGFyc2luZyBhbiBPZ2cgVm9yYmlzIHN0cmVhbS4KKyAgICAvLworICAgIC8vICpidWZmZXIgaXMgTlVMTCdlZCBvdXQgaW1tZWRpYXRlbHkgdXBvbiBlbnRyeSwgYW5kIGlmIHN1Y2Nlc3NmdWwgYSBuZXcgYnVmZmVyIGlzIGFsbG9jYXRlZDsKKyAgICAvLyBjbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3IgcmVsZWFzaW5nIHRoZSBvcmlnaW5hbCBidWZmZXIuCisgICAgc3RhdHVzX3QgX3JlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyICoqYnVmZmVyLCBib29sIGNhbGNWb3JiaXNUaW1lc3RhbXApOworCisgICAgaW50MzJfdCBnZXRQYWNrZXRCbG9ja1NpemUoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CiAKICAgICB2b2lkIHBhcnNlRmlsZU1ldGFEYXRhKCk7CiAKQEAgLTEzNCw4ICsxNTksNjEgQEAKIAogICAgIHZvaWQgYnVpbGRUYWJsZU9mQ29udGVudHMoKTsKIAotICAgIE15Vm9yYmlzRXh0cmFjdG9yKGNvbnN0IE15Vm9yYmlzRXh0cmFjdG9yICYpOwotICAgIE15Vm9yYmlzRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgTXlWb3JiaXNFeHRyYWN0b3IgJik7CisgICAgTXlPZ2dFeHRyYWN0b3IoY29uc3QgTXlPZ2dFeHRyYWN0b3IgJik7CisgICAgTXlPZ2dFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBNeU9nZ0V4dHJhY3RvciAmKTsKK307CisKK3N0cnVjdCBNeVZvcmJpc0V4dHJhY3RvciA6IHB1YmxpYyBNeU9nZ0V4dHJhY3RvciB7CisgICAgTXlWb3JiaXNFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkKKyAgICAgICAgOiBNeU9nZ0V4dHJhY3Rvcihzb3VyY2UsCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLAorICAgICAgICAgICAgICAgIC8qIG51bUhlYWRlcnMgKi8gMywKKyAgICAgICAgICAgICAgICAvKiBzZWVrUHJlUm9sbFVzICovIDApIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHVpbnQ2NF90IGFwcHJveEJpdHJhdGUoKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXIgKipidWZmZXIpIHsKKyAgICAgICAgcmV0dXJuIF9yZWFkTmV4dFBhY2tldChidWZmZXIsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqLyB0cnVlKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIGludDY0X3QgZ2V0VGltZVVzT2ZHcmFudWxlKHVpbnQ2NF90IGdyYW51bGVQb3MpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGdyYW51bGVQb3MgKiAxMDAwMDAwbGwgLyBtVmkucmF0ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpOworfTsKKworc3RydWN0IE15T3B1c0V4dHJhY3RvciA6IHB1YmxpYyBNeU9nZ0V4dHJhY3RvciB7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga09wdXNTYW1wbGVSYXRlID0gNDgwMDA7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga09wdXNTZWVrUHJlUm9sbFVzID0gODAwMDA7IC8vIDgwIG1zCisKKyAgICBNeU9wdXNFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkKKyAgICAgICAgOiBNeU9nZ0V4dHJhY3Rvcihzb3VyY2UsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMsIC8qbnVtSGVhZGVycyovIDIsIGtPcHVzU2Vla1ByZVJvbGxVcyksCisgICAgICAgICAgbUNoYW5uZWxDb3VudCgwKSwKKyAgICAgICAgICBtQ29kZWNEZWxheSgwKSwKKyAgICAgICAgICBtU3RhcnRHcmFudWxlUG9zaXRpb24oLTEpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHVpbnQ2NF90IGFwcHJveEJpdHJhdGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXIgKipidWZmZXIpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCBpbnQ2NF90IGdldFRpbWVVc09mR3JhbnVsZSh1aW50NjRfdCBncmFudWxlUG9zKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpOworCitwcml2YXRlOgorICAgIHN0YXR1c190IHZlcmlmeU9wdXNIZWFkZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CisgICAgc3RhdHVzX3QgdmVyaWZ5T3B1c0NvbW1lbnRzKE1lZGlhQnVmZmVyICpidWZmZXIpOworICAgIHVpbnQzMl90IGdldE51bVNhbXBsZXNJblBhY2tldChNZWRpYUJ1ZmZlciAqYnVmZmVyKSBjb25zdDsKKworICAgIHVpbnQ4X3QgbUNoYW5uZWxDb3VudDsKKyAgICB1aW50MTZfdCBtQ29kZWNEZWxheTsKKyAgICBpbnQ2NF90IG1TdGFydEdyYW51bGVQb3NpdGlvbjsKIH07CiAKIHN0YXRpYyB2b2lkIGV4dHJhY3RBbGJ1bUFydCgKQEAgLTE4MSwxMyArMjU5LDE0IEBACiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwogICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwogICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7Ci0gICAgICAgIGlmIChtRXh0cmFjdG9yLT5tSW1wbC0+c2Vla1RvVGltZShzZWVrVGltZVVzKSAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPm1JbXBsLT5zZWVrVG9UaW1lKHNlZWtUaW1lVXMpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgfQogCiAgICAgTWVkaWFCdWZmZXIgKnBhY2tldDsKLSAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5tSW1wbC0+cmVhZE5leHRQYWNrZXQoJnBhY2tldCwgLyogY29uZiA9ICovIGZhbHNlKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5tSW1wbC0+cmVhZE5leHRQYWNrZXQoJnBhY2tldCk7CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBlcnI7CkBAIC0yMTEsMTQgKzI5MCwyMiBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1NeVZvcmJpc0V4dHJhY3Rvcjo6TXlWb3JiaXNFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkKK015T2dnRXh0cmFjdG9yOjpNeU9nZ0V4dHJhY3RvcigKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgY29uc3QgY2hhciAqbWltZVR5cGUsCisgICAgICAgIHNpemVfdCBudW1IZWFkZXJzLAorICAgICAgICBpbnQ2NF90IHNlZWtQcmVSb2xsVXMpCiAgICAgOiBtU291cmNlKHNvdXJjZSksCiAgICAgICBtT2Zmc2V0KDApLAorICAgICAgbUN1ckdyYW51bGVQb3NpdGlvbigwKSwKICAgICAgIG1QcmV2R3JhbnVsZVBvc2l0aW9uKDApLAogICAgICAgbUN1cnJlbnRQYWdlU2l6ZSgwKSwKICAgICAgIG1GaXJzdFBhY2tldEluUGFnZSh0cnVlKSwKICAgICAgIG1DdXJyZW50UGFnZVNhbXBsZXMoMCksCiAgICAgICBtTmV4dExhY2VJbmRleCgwKSwKKyAgICAgIG1NaW1lVHlwZShtaW1lVHlwZSksCisgICAgICBtTnVtSGVhZGVycyhudW1IZWFkZXJzKSwKKyAgICAgIG1TZWVrUHJlUm9sbFVzKHNlZWtQcmVSb2xsVXMpLAogICAgICAgbUZpcnN0RGF0YU9mZnNldCgtMSkgewogICAgIG1DdXJyZW50UGFnZS5tTnVtU2VnbWVudHMgPSAwOwogCkBAIC0yMjYsMTYgKzMxMywxNiBAQAogICAgIHZvcmJpc19jb21tZW50X2luaXQoJm1WYyk7CiB9CiAKLU15Vm9yYmlzRXh0cmFjdG9yOjp+TXlWb3JiaXNFeHRyYWN0b3IoKSB7CitNeU9nZ0V4dHJhY3Rvcjo6fk15T2dnRXh0cmFjdG9yKCkgewogICAgIHZvcmJpc19jb21tZW50X2NsZWFyKCZtVmMpOwogICAgIHZvcmJpc19pbmZvX2NsZWFyKCZtVmkpOwogfQogCi1zcDxNZXRhRGF0YT4gTXlWb3JiaXNFeHRyYWN0b3I6OmdldEZvcm1hdCgpIGNvbnN0IHsKK3NwPE1ldGFEYXRhPiBNeU9nZ0V4dHJhY3Rvcjo6Z2V0Rm9ybWF0KCkgY29uc3QgewogICAgIHJldHVybiBtTWV0YTsKIH0KIAotc3RhdHVzX3QgTXlWb3JiaXNFeHRyYWN0b3I6OmZpbmROZXh0UGFnZSgKK3N0YXR1c190IE15T2dnRXh0cmFjdG9yOjpmaW5kTmV4dFBhZ2UoCiAgICAgICAgIG9mZjY0X3Qgc3RhcnRPZmZzZXQsIG9mZjY0X3QgKnBhZ2VPZmZzZXQpIHsKICAgICAqcGFnZU9mZnNldCA9IHN0YXJ0T2Zmc2V0OwogCkBAIC0yNTIsNyArMzM5LDcgQEAKICAgICAgICAgaWYgKCFtZW1jbXAoc2lnbmF0dXJlLCAiT2dnUyIsIDQpKSB7CiAgICAgICAgICAgICBpZiAoKnBhZ2VPZmZzZXQgPiBzdGFydE9mZnNldCkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJza2lwcGVkICVsbGQgYnl0ZXMgb2YganVuayB0byByZWFjaCBuZXh0IGZyYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICpwYWdlT2Zmc2V0IC0gc3RhcnRPZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykoKnBhZ2VPZmZzZXQgLSBzdGFydE9mZnNldCkpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gT0s7CkBAIC0yNjYsNyArMzUzLDcgQEAKIC8vIGl0IChpZiBhbnkpIGFuZCByZXR1cm4gaXRzIGdyYW51bGUgcG9zaXRpb24uCiAvLyBUbyBkbyB0aGlzIHdlIGJhY2sgdXAgZnJvbSB0aGUgImN1cnJlbnQiIHBhZ2UncyBvZmZzZXQgdW50aWwgd2UgZmluZCBhbnkKIC8vIHBhZ2UgcHJlY2VkaW5nIGl0IGFuZCB0aGVuIHNjYW4gZm9yd2FyZCB0byBqdXN0IGJlZm9yZSB0aGUgY3VycmVudCBwYWdlLgotc3RhdHVzX3QgTXlWb3JiaXNFeHRyYWN0b3I6OmZpbmRQcmV2R3JhbnVsZVBvc2l0aW9uKAorc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6OmZpbmRQcmV2R3JhbnVsZVBvc2l0aW9uKAogICAgICAgICBvZmY2NF90IHBhZ2VPZmZzZXQsIHVpbnQ2NF90ICpncmFudWxlUG9zKSB7CiAgICAgKmdyYW51bGVQb3MgPSAwOwogCkBAIC0yNzksMTAgKzM2NiwxNCBAQAogICAgICAgICAgICAgcHJldkd1ZXNzID0gMDsKICAgICAgICAgfQogCi0gICAgICAgIEFMT0dWKCJiYWNraW5nIHVwICVsbGQgYnl0ZXMiLCBwYWdlT2Zmc2V0IC0gcHJldkd1ZXNzKTsKKyAgICAgICAgQUxPR1YoImJhY2tpbmcgdXAgJWxsZCBieXRlcyIsIChsb25nIGxvbmcpKHBhZ2VPZmZzZXQgLSBwcmV2R3Vlc3MpKTsKIAogICAgICAgICBzdGF0dXNfdCBlcnIgPSBmaW5kTmV4dFBhZ2UocHJldkd1ZXNzLCAmcHJldlBhZ2VPZmZzZXQpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgLy8gV2UgYXJlIGF0IHRoZSBsYXN0IHBhZ2UgYW5kIGRpZG4ndCBiYWNrIG9mZiBlbm91Z2g7CisgICAgICAgICAgICAvLyBiYWNrIG9mZiA1MDAwIGJ5dGVzIG1vcmUgYW5kIHRyeSBhZ2Fpbi4KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogCkBAIC0yOTcsNyArMzg4LDcgQEAKICAgICB9CiAKICAgICBBTE9HVigicHJldlBhZ2VPZmZzZXQgYXQgJWxsZCwgcGFnZU9mZnNldCBhdCAlbGxkIiwKLSAgICAgICAgIHByZXZQYWdlT2Zmc2V0LCBwYWdlT2Zmc2V0KTsKKyAgICAgICAgICAgIChsb25nIGxvbmcpcHJldlBhZ2VPZmZzZXQsIChsb25nIGxvbmcpcGFnZU9mZnNldCk7CiAKICAgICBmb3IgKDs7KSB7CiAgICAgICAgIFBhZ2UgcHJldlBhZ2U7CkBAIC0zMTYsMTMgKzQwNywyMiBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgTXlWb3JiaXNFeHRyYWN0b3I6OnNlZWtUb1RpbWUoaW50NjRfdCB0aW1lVXMpIHsKK3N0YXR1c190IE15T2dnRXh0cmFjdG9yOjpzZWVrVG9UaW1lKGludDY0X3QgdGltZVVzKSB7CisgICAgdGltZVVzIC09IG1TZWVrUHJlUm9sbFVzOworICAgIGlmICh0aW1lVXMgPCAwKSB7CisgICAgICAgIHRpbWVVcyA9IDA7CisgICAgfQorCiAgICAgaWYgKG1UYWJsZU9mQ29udGVudHMuaXNFbXB0eSgpKSB7CiAgICAgICAgIC8vIFBlcmZvcm0gYXBwcm94aW1hdGUgc2Vla2luZyBiYXNlZCBvbiBhdmcuIGJpdHJhdGUuCisgICAgICAgIHVpbnQ2NF90IGJwcyA9IGFwcHJveEJpdHJhdGUoKTsKKyAgICAgICAgaWYgKGJwcyA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KIAotICAgICAgICBvZmY2NF90IHBvcyA9IHRpbWVVcyAqIGFwcHJveEJpdHJhdGUoKSAvIDgwMDAwMDBsbDsKKyAgICAgICAgb2ZmNjRfdCBwb3MgPSB0aW1lVXMgKiBicHMgLyA4MDAwMDAwbGw7CiAKLSAgICAgICAgQUxPR1YoInNlZWtpbmcgdG8gb2Zmc2V0ICVsbGQiLCBwb3MpOworICAgICAgICBBTE9HVigic2Vla2luZyB0byBvZmZzZXQgJWxsZCIsIChsb25nIGxvbmcpcG9zKTsKICAgICAgICAgcmV0dXJuIHNlZWtUb09mZnNldChwb3MpOwogICAgIH0KIApAQCAtMzUwLDEyICs0NTAsMTIgQEAKICAgICBjb25zdCBUT0NFbnRyeSAmZW50cnkgPSBtVGFibGVPZkNvbnRlbnRzLml0ZW1BdChsZWZ0KTsKIAogICAgIEFMT0dWKCJzZWVraW5nIHRvIGVudHJ5ICV6dSAvICV6dSBhdCBvZmZzZXQgJWxsZCIsCi0gICAgICAgICBsZWZ0LCBtVGFibGVPZkNvbnRlbnRzLnNpemUoKSwgZW50cnkubVBhZ2VPZmZzZXQpOworICAgICAgICAgbGVmdCwgbVRhYmxlT2ZDb250ZW50cy5zaXplKCksIChsb25nIGxvbmcpZW50cnkubVBhZ2VPZmZzZXQpOwogCiAgICAgcmV0dXJuIHNlZWtUb09mZnNldChlbnRyeS5tUGFnZU9mZnNldCk7CiB9CiAKLXN0YXR1c190IE15Vm9yYmlzRXh0cmFjdG9yOjpzZWVrVG9PZmZzZXQob2ZmNjRfdCBvZmZzZXQpIHsKK3N0YXR1c190IE15T2dnRXh0cmFjdG9yOjpzZWVrVG9PZmZzZXQob2ZmNjRfdCBvZmZzZXQpIHsKICAgICBpZiAobUZpcnN0RGF0YU9mZnNldCA+PSAwICYmIG9mZnNldCA8IG1GaXJzdERhdGFPZmZzZXQpIHsKICAgICAgICAgLy8gT25jZSB3ZSBrbm93IHdoZXJlIHRoZSBhY3R1YWwgYXVkaW8gZGF0YSBzdGFydHMgKHBhc3QgdGhlIGhlYWRlcnMpCiAgICAgICAgIC8vIGRvbid0IGV2ZXIgc2VlayB0byBhbnl3aGVyZSBiZWZvcmUgdGhhdC4KQEAgLTM4OCwxMyArNDg4LDEzIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zc2l6ZV90IE15Vm9yYmlzRXh0cmFjdG9yOjpyZWFkUGFnZShvZmY2NF90IG9mZnNldCwgUGFnZSAqcGFnZSkgeworc3NpemVfdCBNeU9nZ0V4dHJhY3Rvcjo6cmVhZFBhZ2Uob2ZmNjRfdCBvZmZzZXQsIFBhZ2UgKnBhZ2UpIHsKICAgICB1aW50OF90IGhlYWRlclsyN107CiAgICAgc3NpemVfdCBuOwogICAgIGlmICgobiA9IG1Tb3VyY2UtPnJlYWRBdChvZmZzZXQsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpKQogICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgewotICAgICAgICBBTE9HVigiZmFpbGVkIHRvIHJlYWQgJXp1IGJ5dGVzIGF0IG9mZnNldCAweCUwMTZsbHgsIGdvdCAlemQgYnl0ZXMiLAotICAgICAgICAgICAgIHNpemVvZihoZWFkZXIpLCBvZmZzZXQsIG4pOworICAgICAgICBBTE9HVigiZmFpbGVkIHRvIHJlYWQgJXp1IGJ5dGVzIGF0IG9mZnNldCAlIzAxNmxseCwgZ290ICV6ZCBieXRlcyIsCisgICAgICAgICAgICAgICAgc2l6ZW9mKGhlYWRlciksIChsb25nIGxvbmcpb2Zmc2V0LCBuKTsKIAogICAgICAgICBpZiAobiA8IDApIHsKICAgICAgICAgICAgIHJldHVybiBuOwpAQCAtNDU5LDcgKzU1OSwxMTAgQEAKICAgICByZXR1cm4gc2l6ZW9mKGhlYWRlcikgKyBwYWdlLT5tTnVtU2VnbWVudHMgKyB0b3RhbFNpemU7CiB9CiAKLXN0YXR1c190IE15Vm9yYmlzRXh0cmFjdG9yOjpyZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlciAqKm91dCwgYm9vbCBjb25mKSB7CitzdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyICoqb3V0KSB7CisgICAgaWYgKG1PZmZzZXQgPD0gbUZpcnN0RGF0YU9mZnNldCAmJiBtU3RhcnRHcmFudWxlUG9zaXRpb24gPCAwKSB7CisgICAgICAgIC8vIFRoZSBmaXJzdCBzYW1wbGUgbWlnaHQgbm90IHN0YXJ0IGF0IHRpbWUgMDsgZmluZCBvdXQgd2hlcmUgYnkgc3VidHJhY3RpbmcKKyAgICAgICAgLy8gdGhlIG51bWJlciBvZiBzYW1wbGVzIG9uIHRoZSBmaXJzdCBwYWdlIGZyb20gdGhlIGdyYW51bGUgcG9zaXRpb24KKyAgICAgICAgLy8gKHBvc2l0aW9uIG9mIGxhc3QgY29tcGxldGUgc2FtcGxlKSBvZiB0aGUgZmlyc3QgcGFnZS4gVGhpcyBoYXBwZW5zCisgICAgICAgIC8vIHRoZSBmaXJzdCB0aW1lIGJlZm9yZSB3ZSBhdHRlbXB0IHRvIHJlYWQgYSBwYWNrZXQgZnJvbSB0aGUgZmlyc3QgcGFnZS4KKyAgICAgICAgTWVkaWFCdWZmZXIgKm1CdWY7CisgICAgICAgIHVpbnQzMl90IG51bVNhbXBsZXMgPSAwOworICAgICAgICB1aW50NjRfdCBjdXJHcmFudWxlUG9zaXRpb24gPSAwOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gX3JlYWROZXh0UGFja2V0KCZtQnVmLCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi9mYWxzZSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEZpcnN0IHR3byBwYWdlcyBhcmUgaGVhZGVyIHBhZ2VzLgorICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNIHx8IG1DdXJyZW50UGFnZS5tUGFnZU5vID4gMikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VyR3JhbnVsZVBvc2l0aW9uID0gbUN1cnJlbnRQYWdlLm1HcmFudWxlUG9zaXRpb247CisgICAgICAgICAgICBudW1TYW1wbGVzICs9IGdldE51bVNhbXBsZXNJblBhY2tldChtQnVmKTsKKyAgICAgICAgICAgIG1CdWYtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1CdWYgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGN1ckdyYW51bGVQb3NpdGlvbiA+IG51bVNhbXBsZXMpIHsKKyAgICAgICAgICAgIG1TdGFydEdyYW51bGVQb3NpdGlvbiA9IGN1ckdyYW51bGVQb3NpdGlvbiAtIG51bVNhbXBsZXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU3RhcnRHcmFudWxlUG9zaXRpb24gPSAwOworICAgICAgICB9CisgICAgICAgIHNlZWtUb09mZnNldCgwKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBfcmVhZE5leHRQYWNrZXQob3V0LCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi9mYWxzZSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludDMyX3QgY3VycmVudFBhZ2VTYW1wbGVzOworICAgIC8vIENhbGN1bGF0ZSB0aW1lc3RhbXBzIGJ5IGFjY3VtdWxhdGluZyBkdXJhdGlvbnMgc3RhcnRpbmcgZnJvbSB0aGUgZmlyc3Qgc2FtcGxlIG9mIGEgcGFnZTsKKyAgICAvLyBXZSBhc3N1bWUgdGhhdCB3ZSBvbmx5IHNlZWsgdG8gcGFnZSBib3VuZGFyaWVzLgorICAgIGlmICgoKm91dCktPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleVZhbGlkU2FtcGxlcywgJmN1cnJlbnRQYWdlU2FtcGxlcykpIHsKKyAgICAgICAgLy8gZmlyc3QgcGFja2V0IGluIHBhZ2UKKyAgICAgICAgaWYgKG1PZmZzZXQgPT0gbUZpcnN0RGF0YU9mZnNldCkgeworICAgICAgICAgICAgY3VycmVudFBhZ2VTYW1wbGVzIC09IG1TdGFydEdyYW51bGVQb3NpdGlvbjsKKyAgICAgICAgICAgICgqb3V0KS0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlWYWxpZFNhbXBsZXMsIGN1cnJlbnRQYWdlU2FtcGxlcyk7CisgICAgICAgIH0KKyAgICAgICAgbUN1ckdyYW51bGVQb3NpdGlvbiA9IG1DdXJyZW50UGFnZS5tR3JhbnVsZVBvc2l0aW9uIC0gY3VycmVudFBhZ2VTYW1wbGVzOworICAgIH0KKworICAgIGludDY0X3QgdGltZVVzID0gZ2V0VGltZVVzT2ZHcmFudWxlKG1DdXJHcmFudWxlUG9zaXRpb24pOworICAgICgqb3V0KS0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworCisgICAgdWludDMyX3QgZnJhbWVzID0gZ2V0TnVtU2FtcGxlc0luUGFja2V0KCpvdXQpOworICAgIG1DdXJHcmFudWxlUG9zaXRpb24gKz0gZnJhbWVzOworICAgIHJldHVybiBPSzsKK30KKwordWludDMyX3QgTXlPcHVzRXh0cmFjdG9yOjpnZXROdW1TYW1wbGVzSW5QYWNrZXQoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgY29uc3QgeworICAgIGlmIChidWZmZXIgPT0gTlVMTCB8fCBidWZmZXItPnJhbmdlX2xlbmd0aCgpIDwgMSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB1aW50OF90ICpkYXRhID0gKHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CisgICAgdWludDhfdCB0b2MgPSBkYXRhWzBdOworICAgIHVpbnQ4X3QgY29uZmlnID0gKHRvYyA+PiAzKSAmIDB4MWY7CisgICAgdWludDMyX3QgZnJhbWVTaXplc1VzW10gPSB7CisgICAgICAgIDEwMDAwLCAyMDAwMCwgNDAwMDAsIDYwMDAwLCAvLyAwLi4uMworICAgICAgICAxMDAwMCwgMjAwMDAsIDQwMDAwLCA2MDAwMCwgLy8gNC4uLjcKKyAgICAgICAgMTAwMDAsIDIwMDAwLCA0MDAwMCwgNjAwMDAsIC8vIDguLi4xMQorICAgICAgICAxMDAwMCwgMjAwMDAsICAgICAgICAgICAgICAgLy8gMTIuLi4xMworICAgICAgICAxMDAwMCwgMjAwMDAsICAgICAgICAgICAgICAgLy8gMTQuLi4xNQorICAgICAgICAyNTAwLCA1MDAwLCAxMDAwMCwgMjAwMDAsICAgLy8gMTYuLi4xOQorICAgICAgICAyNTAwLCA1MDAwLCAxMDAwMCwgMjAwMDAsICAgLy8gMjAuLi4yMworICAgICAgICAyNTAwLCA1MDAwLCAxMDAwMCwgMjAwMDAsICAgLy8gMjQuLi4yNworICAgICAgICAyNTAwLCA1MDAwLCAxMDAwMCwgMjAwMDAgICAgLy8gMjguLi4zMQorICAgIH07CisgICAgdWludDMyX3QgZnJhbWVTaXplVXMgPSBmcmFtZVNpemVzVXNbY29uZmlnXTsKKworICAgIHVpbnQzMl90IG51bUZyYW1lczsKKyAgICB1aW50OF90IGMgPSB0b2MgJiAzOworICAgIHN3aXRjaCAoYykgeworICAgIGNhc2UgMDoKKyAgICAgICAgbnVtRnJhbWVzID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgIGNhc2UgMjoKKyAgICAgICAgbnVtRnJhbWVzID0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBpZiAoYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA8IDMpIHsKKyAgICAgICAgICAgIG51bUZyYW1lcyA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBudW1GcmFtZXMgPSBkYXRhWzJdICYgMHgzZjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBUUkVTUEFTUygpOworICAgIH0KKworICAgIHVpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZVNpemVVcyAqIG51bUZyYW1lcyAqIGtPcHVzU2FtcGxlUmF0ZSAvIDEwMDAwMDA7CisgICAgcmV0dXJuIG51bVNhbXBsZXM7Cit9CisKK3N0YXR1c190IE15T2dnRXh0cmFjdG9yOjpfcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXIgKipvdXQsIGJvb2wgY2FsY1ZvcmJpc1RpbWVzdGFtcCkgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IE5VTEw7CkBAIC01MDcsOCArNzEwLDggQEAKICAgICAgICAgICAgICAgICAgICAgcGFja2V0U2l6ZSk7CiAKICAgICAgICAgICAgIGlmIChuIDwgKHNzaXplX3QpcGFja2V0U2l6ZSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJmYWlsZWQgdG8gcmVhZCAlenUgYnl0ZXMgYXQgMHglMDE2bGx4LCBnb3QgJXpkIGJ5dGVzIiwKLSAgICAgICAgICAgICAgICAgICAgIHBhY2tldFNpemUsIGRhdGFPZmZzZXQsIG4pOworICAgICAgICAgICAgICAgIEFMT0dWKCJmYWlsZWQgdG8gcmVhZCAlenUgYnl0ZXMgYXQgJSMwMTZsbHgsIGdvdCAlemQgYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0U2l6ZSwgKGxvbmcgbG9uZylkYXRhT2Zmc2V0LCBuKTsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKQEAgLTUyNSw5ICs3MjgsOCBAQAogICAgICAgICAgICAgICAgICAgICBtRmlyc3RQYWNrZXRJblBhZ2UgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGltZXN0YW1wIGZvciBjb25maWd1cmF0aW9uIHBhY2tldHMKLSAgICAgICAgICAgICAgICBpZiAoIWNvbmYpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjdXJCbG9ja1NpemUgPSBwYWNrZXRCbG9ja1NpemUoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoY2FsY1ZvcmJpc1RpbWVzdGFtcCkgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGN1ckJsb2NrU2l6ZSA9IGdldFBhY2tldEJsb2NrU2l6ZShidWZmZXIpOwogICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRQYWdlLm1QcmV2UGFja2V0U2l6ZSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50UGFnZS5tUHJldlBhY2tldFNpemUgPSBjdXJCbG9ja1NpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFBhZ2UubVByZXZQYWNrZXRQb3MgPQpAQCAtNTk5LDQzICs4MDEsMjQgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IE15Vm9yYmlzRXh0cmFjdG9yOjppbml0KCkgeworc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6OmluaXQoKSB7CiAgICAgbU1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbU1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpOworICAgIG1NZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbU1pbWVUeXBlKTsKIAotICAgIE1lZGlhQnVmZmVyICpwYWNrZXQ7CiAgICAgc3RhdHVzX3QgZXJyOwotICAgIGlmICgoZXJyID0gcmVhZE5leHRQYWNrZXQoJnBhY2tldCwgLyogY29uZiA9ICovIHRydWUpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBBTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlenVcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgIGVyciA9IHZlcmlmeUhlYWRlcihwYWNrZXQsIDEpOwotICAgIHBhY2tldC0+cmVsZWFzZSgpOwotICAgIHBhY2tldCA9IE5VTEw7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmICgoZXJyID0gcmVhZE5leHRQYWNrZXQoJnBhY2tldCwgLyogY29uZiA9ICovIHRydWUpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBBTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlenVcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgIGVyciA9IHZlcmlmeUhlYWRlcihwYWNrZXQsIDMpOwotICAgIHBhY2tldC0+cmVsZWFzZSgpOwotICAgIHBhY2tldCA9IE5VTEw7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmICgoZXJyID0gcmVhZE5leHRQYWNrZXQoJnBhY2tldCwgLyogY29uZiA9ICovIHRydWUpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBBTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlenVcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgIGVyciA9IHZlcmlmeUhlYWRlcihwYWNrZXQsIDUpOwotICAgIHBhY2tldC0+cmVsZWFzZSgpOwotICAgIHBhY2tldCA9IE5VTEw7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOworICAgIE1lZGlhQnVmZmVyICpwYWNrZXQ7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtSGVhZGVyczsgKytpKSB7CisgICAgICAgIC8vIGlnbm9yZSB0aW1lc3RhbXAgZm9yIGNvbmZpZ3VyYXRpb24gcGFja2V0cworICAgICAgICBpZiAoKGVyciA9IF9yZWFkTmV4dFBhY2tldCgmcGFja2V0LCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi8gZmFsc2UpKSAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlenVcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICBlcnIgPSB2ZXJpZnlIZWFkZXIocGFja2V0LCAvKiB0eXBlID0gKi8gaSAqIDIgKyAxKTsKKyAgICAgICAgcGFja2V0LT5yZWxlYXNlKCk7CisgICAgICAgIHBhY2tldCA9IE5VTEw7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KICAgICB9CiAKICAgICBtRmlyc3REYXRhT2Zmc2V0ID0gbU9mZnNldCArIG1DdXJyZW50UGFnZVNpemU7CkBAIC02NTEsNyArODM0LDcgQEAKICAgICAgICAgLy8gd2UgY2FuIG9ubHkgYXBwcm94aW1hdGUgdXNpbmcgYXZnLiBiaXRyYXRlIGlmIHNlZWtpbmcgdG8KICAgICAgICAgLy8gdGhlIGVuZCBpcyB0b28gZXhwZW5zaXZlIG9yIGltcG9zc2libGUgKGxpdmUgc3RyZWFtaW5nKS4KIAotICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSBsYXN0R3JhbnVsZVBvc2l0aW9uICogMTAwMDAwMGxsIC8gbVZpLnJhdGU7CisgICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9IGdldFRpbWVVc09mR3JhbnVsZShsYXN0R3JhbnVsZVBvc2l0aW9uKTsKIAogICAgICAgICBtTWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKIApAQCAtNjYxLDcgKzg0NCw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIE15Vm9yYmlzRXh0cmFjdG9yOjpidWlsZFRhYmxlT2ZDb250ZW50cygpIHsKK3ZvaWQgTXlPZ2dFeHRyYWN0b3I6OmJ1aWxkVGFibGVPZkNvbnRlbnRzKCkgewogICAgIG9mZjY0X3Qgb2Zmc2V0ID0gbUZpcnN0RGF0YU9mZnNldDsKICAgICBQYWdlIHBhZ2U7CiAgICAgc3NpemVfdCBwYWdlU2l6ZTsKQEAgLTY3Miw3ICs4NTUsNyBAQAogICAgICAgICAgICAgbVRhYmxlT2ZDb250ZW50cy5lZGl0SXRlbUF0KG1UYWJsZU9mQ29udGVudHMuc2l6ZSgpIC0gMSk7CiAKICAgICAgICAgZW50cnkubVBhZ2VPZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgIGVudHJ5Lm1UaW1lVXMgPSBwYWdlLm1HcmFudWxlUG9zaXRpb24gKiAxMDAwMDAwbGwgLyBtVmkucmF0ZTsKKyAgICAgICAgZW50cnkubVRpbWVVcyA9IGdldFRpbWVVc09mR3JhbnVsZShwYWdlLm1HcmFudWxlUG9zaXRpb24pOwogCiAgICAgICAgIG9mZnNldCArPSAoc2l6ZV90KXBhZ2VTaXplOwogICAgIH0KQEAgLTcwMCw3ICs4ODMsNyBAQAogICAgIH0KIH0KIAotaW50MzJfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6cGFja2V0QmxvY2tTaXplKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKK2ludDMyX3QgTXlPZ2dFeHRyYWN0b3I6OmdldFBhY2tldEJsb2NrU2l6ZShNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7CiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9CiAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOwogCkBAIC03MjksNiArOTEyLDE0NCBAQAogICAgIHJldHVybiB2b3JiaXNfcGFja2V0X2Jsb2Nrc2l6ZSgmbVZpLCAmcGFjayk7CiB9CiAKK2ludDY0X3QgTXlPcHVzRXh0cmFjdG9yOjpnZXRUaW1lVXNPZkdyYW51bGUodWludDY0X3QgZ3JhbnVsZVBvcykgY29uc3QgeworICAgIHVpbnQ2NF90IHBjbVNhbXBsZVBvc2l0aW9uID0gMDsKKyAgICBpZiAoZ3JhbnVsZVBvcyA+IG1Db2RlY0RlbGF5KSB7CisgICAgICAgIHBjbVNhbXBsZVBvc2l0aW9uID0gZ3JhbnVsZVBvcyAtIG1Db2RlY0RlbGF5OworICAgIH0KKyAgICByZXR1cm4gcGNtU2FtcGxlUG9zaXRpb24gKiAxMDAwMDAwbGwgLyBrT3B1c1NhbXBsZVJhdGU7Cit9CisKK3N0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6dmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAvLyB0aGVyZSBhcmUgYWN0dWFsbHkgbm8gaGVhZGVyIHR5cGVzIGRlZmluZWQgaW4gdGhlIE9wdXMgc3BlYzsgd2UgY2hvb3NlIDEgYW5kIDMgdG8gbWVhbgorICAgICAgICAvLyBoZWFkZXIgYW5kIGNvbW1lbnRzIHN1Y2ggdGhhdCB3ZSBjYW4gc2hhcmUgY29kZSB3aXRoIE15Vm9yYmlzRXh0cmFjdG9yLgorICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICByZXR1cm4gdmVyaWZ5T3B1c0hlYWRlcihidWZmZXIpOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICByZXR1cm4gdmVyaWZ5T3B1c0NvbW1lbnRzKGJ1ZmZlcik7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorfQorCitzdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeU9wdXNIZWFkZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgeworICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlclNpemUgPSAxOTsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0KKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CisKKyAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisKKyAgICBpZiAoc2l6ZSA8IGtPcHVzSGVhZGVyU2l6ZQorICAgICAgICAgICAgfHwgbWVtY21wKGRhdGEsICJPcHVzSGVhZCIsIDgpCisgICAgICAgICAgICB8fCAvKiB2ZXJzaW9uID0gKi8gZGF0YVs4XSAhPSAxKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgbUNoYW5uZWxDb3VudCA9IGRhdGFbOV07CisgICAgbUNvZGVjRGVsYXkgPSBVMTZMRV9BVCgmZGF0YVsxMF0pOworCisgICAgbU1ldGEtPnNldERhdGEoa0tleU9wdXNIZWFkZXIsIDAsIGRhdGEsIHNpemUpOworICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwga09wdXNTYW1wbGVSYXRlKTsKKyAgICBtTWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbUNoYW5uZWxDb3VudCk7CisgICAgbU1ldGEtPnNldEludDY0KGtLZXlPcHVzU2Vla1ByZVJvbGwgLyogbnMgKi8sIGtPcHVzU2Vla1ByZVJvbGxVcyAqIDEwMDAgLyogPSA4MCBtcyovKTsKKyAgICBtTWV0YS0+c2V0SW50NjQoa0tleU9wdXNDb2RlY0RlbGF5IC8qIG5zICovLAorICAgICAgICAgICAgbUNvZGVjRGVsYXkgLyogc2FtcGxlL3MgKi8gKiAxMDAwMDAwMDAwIC8ga09wdXNTYW1wbGVSYXRlKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjp2ZXJpZnlPcHVzQ29tbWVudHMoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgeworICAgIC8vIGFkZCBhcnRpZmljaWFsIGZyYW1pbmcgYml0IHNvIHdlIGNhbiByZXVzZSBfdm9yYmlzX3VucGFja19jb21tZW50CisgICAgaW50MzJfdCBjb21tZW50U2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgKyAxOworICAgIHNwPEFCdWZmZXI+IGFCdWYgPSBuZXcgQUJ1ZmZlcihjb21tZW50U2l6ZSk7CisgICAgaWYgKGFCdWYtPmNhcGFjaXR5KCkgPD0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQ4X3QqIGNvbW1lbnREYXRhID0gYUJ1Zi0+ZGF0YSgpOworICAgIG1lbWNweShjb21tZW50RGF0YSwKKyAgICAgICAgICAgICh1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAorICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisKKyAgICBvZ2dfYnVmZmVyIGJ1ZjsKKyAgICBidWYuZGF0YSA9IGNvbW1lbnREYXRhOworICAgIGJ1Zi5zaXplID0gY29tbWVudFNpemU7CisgICAgYnVmLnJlZmNvdW50ID0gMTsKKyAgICBidWYucHRyLm93bmVyID0gTlVMTDsKKworICAgIG9nZ19yZWZlcmVuY2UgcmVmOworICAgIHJlZi5idWZmZXIgPSAmYnVmOworICAgIHJlZi5iZWdpbiA9IDA7CisgICAgcmVmLmxlbmd0aCA9IGNvbW1lbnRTaXplOworICAgIHJlZi5uZXh0ID0gTlVMTDsKKworICAgIG9nZ3BhY2tfYnVmZmVyIGJpdHM7CisgICAgb2dncGFja19yZWFkaW5pdCgmYml0cywgJnJlZik7CisKKyAgICAvLyBza2lwICdPcHVzVGFncycKKyAgICBjb25zdCBjaGFyICpPcHVzVGFncyA9ICJPcHVzVGFncyI7CisgICAgY29uc3QgaW50MzJfdCBoZWFkZXJMZW4gPSBzdHJsZW4oT3B1c1RhZ3MpOworICAgIGludDMyX3QgZnJhbWluZ0JpdE9mZnNldCA9IGhlYWRlckxlbjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlckxlbjsgKytpKSB7CisgICAgICAgIGNoYXIgY2hyID0gb2dncGFja19yZWFkKCZiaXRzLCA4KTsKKyAgICAgICAgaWYgKGNociAhPSBPcHVzVGFnc1tpXSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludDMyX3QgdmVuZG9yTGVuID0gb2dncGFja19yZWFkKCZiaXRzLCAzMik7CisgICAgZnJhbWluZ0JpdE9mZnNldCArPSA0OworICAgIGlmICh2ZW5kb3JMZW4gPCAwIHx8IHZlbmRvckxlbiA+IGNvbW1lbnRTaXplIC0gOCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICAvLyBza2lwIHZlbmRvciBzdHJpbmcKKyAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IHZlbmRvckxlbjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlbmRvckxlbjsgKytpKSB7CisgICAgICAgIG9nZ3BhY2tfcmVhZCgmYml0cywgOCk7CisgICAgfQorCisgICAgaW50MzJfdCBuID0gb2dncGFja19yZWFkKCZiaXRzLCAzMik7CisgICAgZnJhbWluZ0JpdE9mZnNldCArPSA0OworICAgIGlmIChuIDwgMCB8fCBuID4gKChjb21tZW50U2l6ZSAtIG9nZ3BhY2tfYnl0ZXMoJmJpdHMpKSA+PiAyKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBpbnQzMl90IGxlbiA9IG9nZ3BhY2tfcmVhZCgmYml0cywgMzIpOworICAgICAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IDQ7CisgICAgICAgIGlmIChsZW4gIDwgMCB8fCBsZW4gID4gKGNvbW1lbnRTaXplIC0gb2dncGFja19ieXRlcygmYml0cykpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIGZyYW1pbmdCaXRPZmZzZXQgKz0gbGVuOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbjsgKytqKSB7CisgICAgICAgICAgICBvZ2dwYWNrX3JlYWQoJmJpdHMsIDgpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChmcmFtaW5nQml0T2Zmc2V0IDwgMCB8fCBmcmFtaW5nQml0T2Zmc2V0ID49IGNvbW1lbnRTaXplKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGNvbW1lbnREYXRhW2ZyYW1pbmdCaXRPZmZzZXRdID0gMTsKKworICAgIGJ1Zi5kYXRhID0gY29tbWVudERhdGEgKyBoZWFkZXJMZW47CisgICAgYnVmLnNpemUgPSBjb21tZW50U2l6ZSAtIGhlYWRlckxlbjsKKyAgICBidWYucmVmY291bnQgPSAxOworICAgIGJ1Zi5wdHIub3duZXIgPSBOVUxMOworCisgICAgcmVmLmJ1ZmZlciA9ICZidWY7CisgICAgcmVmLmJlZ2luID0gMDsKKyAgICByZWYubGVuZ3RoID0gY29tbWVudFNpemUgLSBoZWFkZXJMZW47CisgICAgcmVmLm5leHQgPSBOVUxMOworCisgICAgb2dncGFja19yZWFkaW5pdCgmYml0cywgJnJlZik7CisgICAgaW50IGVyciA9IF92b3JiaXNfdW5wYWNrX2NvbW1lbnQoJm1WYywgJmJpdHMpOworICAgIGlmICgwICE9IGVycikgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHBhcnNlRmlsZU1ldGFEYXRhKCk7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6dmVyaWZ5SGVhZGVyKAogICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpIHsKICAgICBjb25zdCB1aW50OF90ICpkYXRhID0KQEAgLTc1NSw3ICsxMDc2LDkgQEAKICAgICBvZ2dwYWNrX2J1ZmZlciBiaXRzOwogICAgIG9nZ3BhY2tfcmVhZGluaXQoJmJpdHMsICZyZWYpOwogCi0gICAgQ0hFQ0tfRVEob2dncGFja19yZWFkKCZiaXRzLCA4KSwgdHlwZSk7CisgICAgaWYgKG9nZ3BhY2tfcmVhZCgmYml0cywgOCkgIT0gdHlwZSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDY7ICsraSkgewogICAgICAgICBvZ2dwYWNrX3JlYWQoJmJpdHMsIDgpOyAgLy8gc2tpcCAndm9yYmlzJwogICAgIH0KQEAgLTc2Myw3ICsxMDg2LDkgQEAKICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgY2FzZSAxOgogICAgICAgICB7Ci0gICAgICAgICAgICBDSEVDS19FUSgwLCBfdm9yYmlzX3VucGFja19pbmZvKCZtVmksICZiaXRzKSk7CisgICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19pbmZvKCZtVmksICZiaXRzKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1NZXRhLT5zZXREYXRhKGtLZXlWb3JiaXNJbmZvLCAwLCBkYXRhLCBzaXplKTsKICAgICAgICAgICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbVZpLnJhdGUpOwpAQCAtODEyLDcgKzExMzcsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdWludDY0X3QgTXlWb3JiaXNFeHRyYWN0b3I6OmFwcHJveEJpdHJhdGUoKSB7Cit1aW50NjRfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6YXBwcm94Qml0cmF0ZSgpIGNvbnN0IHsKICAgICBpZiAobVZpLmJpdHJhdGVfbm9taW5hbCAhPSAwKSB7CiAgICAgICAgIHJldHVybiBtVmkuYml0cmF0ZV9ub21pbmFsOwogICAgIH0KQEAgLTgyMCw3ICsxMTQ1LDcgQEAKICAgICByZXR1cm4gKG1WaS5iaXRyYXRlX2xvd2VyICsgbVZpLmJpdHJhdGVfdXBwZXIpIC8gMjsKIH0KIAotdm9pZCBNeVZvcmJpc0V4dHJhY3Rvcjo6cGFyc2VGaWxlTWV0YURhdGEoKSB7Cit2b2lkIE15T2dnRXh0cmFjdG9yOjpwYXJzZUZpbGVNZXRhRGF0YSgpIHsKICAgICBtRmlsZU1ldGEgPSBuZXcgTWV0YURhdGE7CiAgICAgbUZpbGVNZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRyk7CiAKQEAgLTk2MCwxMSArMTI4NSwyMyBAQAogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCiAgICAgICBtSW1wbChOVUxMKSB7Ci0gICAgbUltcGwgPSBuZXcgTXlWb3JiaXNFeHRyYWN0b3IobURhdGFTb3VyY2UpOwotICAgIG1Jbml0Q2hlY2sgPSBtSW1wbC0+c2Vla1RvT2Zmc2V0KDApOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICAgIGlmIChtSW1wbCAhPSBOVUxMKSB7CisgICAgICAgICAgICBkZWxldGUgbUltcGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgbUltcGwgPSBuZXcgTXlWb3JiaXNFeHRyYWN0b3IobURhdGFTb3VyY2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUltcGwgPSBuZXcgTXlPcHVzRXh0cmFjdG9yKG1EYXRhU291cmNlKTsKKyAgICAgICAgfQorICAgICAgICBtSW5pdENoZWNrID0gbUltcGwtPnNlZWtUb09mZnNldCgwKTsKIAotICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7Ci0gICAgICAgIG1Jbml0Q2hlY2sgPSBtSW1wbC0+aW5pdCgpOworICAgICAgICBpZiAobUluaXRDaGVjayA9PSBPSykgeworICAgICAgICAgICAgbUluaXRDaGVjayA9IG1JbXBsLT5pbml0KCk7CisgICAgICAgICAgICBpZiAobUluaXRDaGVjayA9PSBPSykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Qcm9jZXNzSW5mby5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Qcm9jZXNzSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQxNzJiMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvLmNwcApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJQcm9jZXNzSW5mbyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSVByb2Nlc3NJbmZvU2VydmljZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitQcm9jZXNzSW5mbzo6UHJvY2Vzc0luZm8oKSB7fQorCitib29sIFByb2Nlc3NJbmZvOjpnZXRQcmlvcml0eShpbnQgcGlkLCBpbnQqIHByaW9yaXR5KSB7CisgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmdldFNlcnZpY2UoU3RyaW5nMTYoInByb2Nlc3NpbmZvIikpOworICAgIHNwPElQcm9jZXNzSW5mb1NlcnZpY2U+IHNlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJUHJvY2Vzc0luZm9TZXJ2aWNlPihiaW5kZXIpOworCisgICAgc2l6ZV90IGxlbmd0aCA9IDE7CisgICAgaW50MzJfdCBzdGF0ZXM7CisgICAgc3RhdHVzX3QgZXJyID0gc2VydmljZS0+Z2V0UHJvY2Vzc1N0YXRlc0Zyb21QaWRzKGxlbmd0aCwgJnBpZCwgJnN0YXRlcyk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiZ2V0UHJvY2Vzc1N0YXRlc0Zyb21QaWRzIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEFMT0dWKCJwaWQgJWQgc3RhdGVzICVkIiwgcGlkLCBzdGF0ZXMpOworICAgIGlmIChzdGF0ZXMgPCAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBVc2UgcHJvY2VzcyBzdGF0ZSBhcyB0aGUgcHJpb3JpdHkuIExvd2VyIHRoZSB2YWx1ZSwgaGlnaGVyIHRoZSBwcmlvcml0eS4KKyAgICAqcHJpb3JpdHkgPSBzdGF0ZXM7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK1Byb2Nlc3NJbmZvOjp+UHJvY2Vzc0luZm8oKSB7fQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlVGFibGUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlVGFibGUuY3BwCmluZGV4IGI4OTFkNTguLjk0ZWQyYmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZVRhYmxlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVUYWJsZS5jcHAKQEAgLTIzMywxMSArMjMzLDEzIEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCi0gICAgaWYgKFNJWkVfTUFYIC8gc2l6ZW9mKFNhbXBsZVRvQ2h1bmtFbnRyeSkgPD0gbU51bVNhbXBsZVRvQ2h1bmtPZmZzZXRzKQorICAgIGlmIChTSVpFX01BWCAvIHNpemVvZihTYW1wbGVUb0NodW5rRW50cnkpIDw9IChzaXplX3QpbU51bVNhbXBsZVRvQ2h1bmtPZmZzZXRzKQogICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwogCiAgICAgbVNhbXBsZVRvQ2h1bmtFbnRyaWVzID0KLSAgICAgICAgbmV3IFNhbXBsZVRvQ2h1bmtFbnRyeVttTnVtU2FtcGxlVG9DaHVua09mZnNldHNdOworICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgU2FtcGxlVG9DaHVua0VudHJ5W21OdW1TYW1wbGVUb0NodW5rT2Zmc2V0c107CisgICAgaWYgKCFtU2FtcGxlVG9DaHVua0VudHJpZXMpCisgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CiAKICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbU51bVNhbXBsZVRvQ2h1bmtPZmZzZXRzOyArK2kpIHsKICAgICAgICAgdWludDhfdCBidWZmZXJbMTJdOwpAQCAtMzk2LDExICszOTgsMTMgQEAKIAogICAgIG1OdW1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXMgPSBudW1FbnRyaWVzOwogICAgIHVpbnQ2NF90IGFsbG9jU2l6ZSA9ICh1aW50NjRfdCludW1FbnRyaWVzICogMiAqIHNpemVvZih1aW50MzJfdCk7Ci0gICAgaWYgKGFsbG9jU2l6ZSA+IFNJWkVfTUFYKSB7CisgICAgaWYgKGFsbG9jU2l6ZSA+IFVJTlQzMl9NQVgpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKICAgICB9CiAKLSAgICBtQ29tcG9zaXRpb25UaW1lRGVsdGFFbnRyaWVzID0gbmV3IHVpbnQzMl90WzIgKiBudW1FbnRyaWVzXTsKKyAgICBtQ29tcG9zaXRpb25UaW1lRGVsdGFFbnRyaWVzID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQzMl90WzIgKiBudW1FbnRyaWVzXTsKKyAgICBpZiAoIW1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXMpCisgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CiAKICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCArIDgsIG1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXMsIG51bUVudHJpZXMgKiA4KQpAQCAtNDUwLDcgKzQ1NCwxMCBAQAogICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwogICAgIH0KIAotICAgIG1TeW5jU2FtcGxlcyA9IG5ldyB1aW50MzJfdFttTnVtU3luY1NhbXBsZXNdOworICAgIG1TeW5jU2FtcGxlcyA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50MzJfdFttTnVtU3luY1NhbXBsZXNdOworICAgIGlmICghbVN5bmNTYW1wbGVzKQorICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworCiAgICAgc2l6ZV90IHNpemUgPSBtTnVtU3luY1NhbXBsZXMgKiBzaXplb2YodWludDMyX3QpOwogICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KG1TeW5jU2FtcGxlT2Zmc2V0ICsgOCwgbVN5bmNTYW1wbGVzLCBzaXplKQogICAgICAgICAgICAgIT0gKHNzaXplX3Qpc2l6ZSkgewpAQCAtNTIxLDcgKzUyOCw5IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBtU2FtcGxlVGltZUVudHJpZXMgPSBuZXcgU2FtcGxlVGltZUVudHJ5W21OdW1TYW1wbGVTaXplc107CisgICAgbVNhbXBsZVRpbWVFbnRyaWVzID0gbmV3IChzdGQ6Om5vdGhyb3cpIFNhbXBsZVRpbWVFbnRyeVttTnVtU2FtcGxlU2l6ZXNdOworICAgIGlmICghbVNhbXBsZVRpbWVFbnRyaWVzKQorICAgICAgICByZXR1cm47CiAKICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCA9IDA7CiAgICAgdWludDMyX3Qgc2FtcGxlVGltZSA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCmluZGV4IDEwMWZjOGEuLmUzN2U5MDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCkBAIC0yMCwyMiArMjAsMzUgQEAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oIgogCisjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorCiAjaW5jbHVkZSA8Q2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtCdWZmZXJUaW1lT3V0VXMgPSAzMDAwMGxsOyAvLyAzMCBtc2VjCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtSZXRyeUNvdW50ID0gMjA7IC8vIG11c3QgYmUgPjAKKwogU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6U3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcigpCiAgICAgOiBtUGFyc2VkTWV0YURhdGEoZmFsc2UpLAogICAgICAgbUFsYnVtQXJ0KE5VTEwpIHsKQEAgLTQ3LDEwICs2MCw3IEBACiAKIFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI6On5TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyKCkgewogICAgIEFMT0dWKCJ+U3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcigpIik7Ci0KLSAgICBkZWxldGUgbUFsYnVtQXJ0OwotICAgIG1BbGJ1bUFydCA9IE5VTEw7Ci0KKyAgICBjbGVhck1ldGFkYXRhKCk7CiAgICAgbUNsaWVudC5kaXNjb25uZWN0KCk7CiB9CiAKQEAgLTYwLDExICs3MCw3IEBACiAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CiAgICAgQUxPR1YoInNldERhdGFTb3VyY2UoJXMpIiwgdXJpKTsKIAotICAgIG1QYXJzZWRNZXRhRGF0YSA9IGZhbHNlOwotICAgIG1NZXRhRGF0YS5jbGVhcigpOwotICAgIGRlbGV0ZSBtQWxidW1BcnQ7Ci0gICAgbUFsYnVtQXJ0ID0gTlVMTDsKLQorICAgIGNsZWFyTWV0YWRhdGEoKTsKICAgICBtU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShodHRwU2VydmljZSwgdXJpLCBoZWFkZXJzKTsKIAogICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKQEAgLTkyLDExICs5OCw3IEBACiAKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglZCwgJSIgUFJJZDY0ICIsICUiIFBSSWQ2NCAiKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CiAKLSAgICBtUGFyc2VkTWV0YURhdGEgPSBmYWxzZTsKLSAgICBtTWV0YURhdGEuY2xlYXIoKTsKLSAgICBkZWxldGUgbUFsYnVtQXJ0OwotICAgIG1BbGJ1bUFydCA9IE5VTEw7Ci0KKyAgICBjbGVhck1ldGFkYXRhKCk7CiAgICAgbVNvdXJjZSA9IG5ldyBGaWxlU291cmNlKGZkLCBvZmZzZXQsIGxlbmd0aCk7CiAKICAgICBzdGF0dXNfdCBlcnI7CkBAIC0xMTcsNzMgKzExOSw3MiBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdGljIGJvb2wgaXNZVVY0MjBQbGFuYXJTdXBwb3J0ZWQoCi0gICAgICAgICAgICBPTVhDbGllbnQgKmNsaWVudCwKLSAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmdHJhY2tNZXRhKSB7CitzdGF0dXNfdCBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpzZXREYXRhU291cmNlKAorICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiYgc291cmNlKSB7CisgICAgQUxPR1YoInNldERhdGFTb3VyY2UoRGF0YVNvdXJjZSkiKTsKIAotICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgQ0hFQ0sodHJhY2tNZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgY2xlYXJNZXRhZGF0YSgpOworICAgIG1Tb3VyY2UgPSBzb3VyY2U7CisgICAgbUV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUobVNvdXJjZSk7CiAKLSAgICBWZWN0b3I8Q29kZWNDYXBhYmlsaXRpZXM+IGNhcHM7Ci0gICAgaWYgKFF1ZXJ5Q29kZWNzKGNsaWVudC0+aW50ZXJmYWNlKCksIG1pbWUsCi0gICAgICAgICAgICAgICAgICAgIHRydWUsIC8qIHF1ZXJ5RGVjb2RlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgLyogaHdDb2RlY09ubHkgKi8KLSAgICAgICAgICAgICAgICAgICAgJmNhcHMpID09IE9LKSB7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBjYXBzLnNpemUoKTsgKytqKSB7Ci0gICAgICAgICAgICBDb2RlY0NhcGFiaWxpdGllcyBjYXAgPSBjYXBzW2pdOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXAubUNvbG9yRm9ybWF0cy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgICAgIGlmIChjYXAubUNvbG9yRm9ybWF0c1tpXSA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIGlmIChtRXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbnN0YW50aWF0ZSBhIE1lZGlhRXh0cmFjdG9yLiIpOworICAgICAgICBtU291cmNlLmNsZWFyKCk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXRpYyBWaWRlb0ZyYW1lICpleHRyYWN0VmlkZW9GcmFtZVdpdGhDb2RlY0ZsYWdzKAotICAgICAgICBPTVhDbGllbnQgKmNsaWVudCwKK3N0YXRpYyBWaWRlb0ZyYW1lICpleHRyYWN0VmlkZW9GcmFtZSgKKyAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwKICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGEsCiAgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLAotICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgaW50NjRfdCBmcmFtZVRpbWVVcywKICAgICAgICAgaW50IHNlZWtNb2RlKSB7CiAKICAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gc291cmNlLT5nZXRGb3JtYXQoKTsKIAotICAgIC8vIFhYWDoKLSAgICAvLyBPbmNlIGFsbCB2ZW5kb3JzIHN1cHBvcnQgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciwgd2UgY2FuCi0gICAgLy8gcmVtb3ZlIHRoaXMgY2hlY2sgYW5kIGFsd2F5cyBzZXQgdGhlIGRlY29kZXIgb3V0cHV0IGNvbG9yIGZvcm1hdAotICAgIGlmIChpc1lVVjQyMFBsYW5hclN1cHBvcnRlZChjbGllbnQsIHRyYWNrTWV0YSkpIHsKLSAgICAgICAgZm9ybWF0LT5zZXRJbnQzMihrS2V5Q29sb3JGb3JtYXQsIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpOwotICAgIH0KLQotICAgIHNwPE1lZGlhU291cmNlPiBkZWNvZGVyID0KLSAgICAgICAgT01YQ29kZWM6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgICBjbGllbnQtPmludGVyZmFjZSgpLCBmb3JtYXQsIGZhbHNlLCBzb3VyY2UsCi0gICAgICAgICAgICAgICAgTlVMTCwgZmxhZ3MgfCBPTVhDb2RlYzo6a0NsaWVudE5lZWRzRnJhbWVidWZmZXIpOwotCi0gICAgaWYgKGRlY29kZXIuZ2V0KCkgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigidW5hYmxlIHRvIGluc3RhbnRpYXRlIHZpZGVvIGRlY29kZXIuIik7Ci0KKyAgICBzcDxBTWVzc2FnZT4gdmlkZW9Gb3JtYXQ7CisgICAgaWYgKGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZSh0cmFja01ldGEsICZ2aWRlb0Zvcm1hdCkgIT0gT0spIHsKKyAgICAgICAgQUxPR1coIkZhaWxlZCB0byBjb252ZXJ0IG1ldGEgZGF0YSB0byBtZXNzYWdlIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIHN0YXR1c190IGVyciA9IGRlY29kZXItPnN0YXJ0KCk7CisgICAgLy8gVE9ETzogVXNlIEZsZXhpYmxlIGNvbG9yIGluc3RlYWQKKyAgICB2aWRlb0Zvcm1hdC0+c2V0SW50MzIoImNvbG9yLWZvcm1hdCIsIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpOworCisgICAgc3RhdHVzX3QgZXJyOworICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIGxvb3Blci0+c3RhcnQoKTsKKyAgICBzcDxNZWRpYUNvZGVjPiBkZWNvZGVyID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKAorICAgICAgICAgICAgbG9vcGVyLCBjb21wb25lbnROYW1lLCAmZXJyKTsKKworICAgIGlmIChkZWNvZGVyLmdldCgpID09IE5VTEwgfHwgZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gaW5zdGFudGlhdGUgZGVjb2RlciBbJXNdIiwgY29tcG9uZW50TmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGVyciA9IGRlY29kZXItPmNvbmZpZ3VyZSh2aWRlb0Zvcm1hdCwgTlVMTCAvKiBzdXJmYWNlICovLCBOVUxMIC8qIGNyeXB0byAqLywgMCAvKiBmbGFncyAqLyk7CiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HVygiT01YQ29kZWM6OnN0YXJ0IHJldHVybmVkIGVycm9yICVkICgweCUwOHgpXG4iLCBlcnIsIGVycik7CisgICAgICAgIEFMT0dXKCJjb25maWd1cmUgcmV0dXJuZWQgZXJyb3IgJWQgKCVzKSIsIGVyciwgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgIGRlY29kZXItPnJlbGVhc2UoKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgLy8gUmVhZCBvbmUgb3V0cHV0IGJ1ZmZlciwgaWdub3JlIGZvcm1hdCBjaGFuZ2Ugbm90aWZpY2F0aW9ucwotICAgIC8vIGFuZCBzcHVyaW91cyBlbXB0eSBidWZmZXJzLgorICAgIGVyciA9IGRlY29kZXItPnN0YXJ0KCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HVygic3RhcnQgcmV0dXJuZWQgZXJyb3IgJWQgKCVzKSIsIGVyciwgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgIGRlY29kZXItPnJlbGVhc2UoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCiAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7CiAgICAgaWYgKHNlZWtNb2RlIDwgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMgfHwKICAgICAgICAgc2Vla01vZGUgPiBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVCkgewogCiAgICAgICAgIEFMT0dFKCJVbmtub3duIHNlZWsgbW9kZTogJWQiLCBzZWVrTW9kZSk7CisgICAgICAgIGRlY29kZXItPnJlbGVhc2UoKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC0yMDIsNjQgKzIwMywxNTUgQEAKICAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8oZnJhbWVUaW1lVXMsIG1vZGUpOwogICAgIH0KIAotICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBOVUxMOwotICAgIGRvIHsKLSAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZXJyID0gZGVjb2Rlci0+cmVhZCgmYnVmZmVyLCAmb3B0aW9ucyk7Ci0gICAgICAgIG9wdGlvbnMuY2xlYXJTZWVrVG8oKTsKLSAgICB9IHdoaWxlIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRAotICAgICAgICAgICAgIHx8IChidWZmZXIgIT0gTlVMTCAmJiBidWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApKTsKLQorICAgIGVyciA9IHNvdXJjZS0+c3RhcnQoKTsKICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIENIRUNLKGJ1ZmZlciA9PSBOVUxMKTsKKyAgICAgICAgQUxPR1coInNvdXJjZSBmYWlsZWQgdG8gc3RhcnQ6ICVkICglcykiLCBlcnIsIGFzU3RyaW5nKGVycikpOworICAgICAgICBkZWNvZGVyLT5yZWxlYXNlKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotICAgICAgICBBTE9HVigiZGVjb2RpbmcgZnJhbWUgZmFpbGVkLiIpOworICAgIFZlY3RvcjxzcDxBQnVmZmVyPiA+IGlucHV0QnVmZmVyczsKKyAgICBlcnIgPSBkZWNvZGVyLT5nZXRJbnB1dEJ1ZmZlcnMoJmlucHV0QnVmZmVycyk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HVygiZmFpbGVkIHRvIGdldCBpbnB1dCBidWZmZXJzOiAlZCAoJXMpIiwgZXJyLCBhc1N0cmluZyhlcnIpKTsKKyAgICAgICAgZGVjb2Rlci0+cmVsZWFzZSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBvdXRwdXRCdWZmZXJzOworICAgIGVyciA9IGRlY29kZXItPmdldE91dHB1dEJ1ZmZlcnMoJm91dHB1dEJ1ZmZlcnMpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR1coImZhaWxlZCB0byBnZXQgb3V0cHV0IGJ1ZmZlcnM6ICVkICglcykiLCBlcnIsIGFzU3RyaW5nKGVycikpOworICAgICAgICBkZWNvZGVyLT5yZWxlYXNlKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBvdXRwdXRGb3JtYXQgPSBOVUxMOworICAgIGJvb2wgaGF2ZU1vcmVJbnB1dHMgPSB0cnVlOworICAgIHNpemVfdCBpbmRleCwgb2Zmc2V0LCBzaXplOworICAgIGludDY0X3QgdGltZVVzOworICAgIHNpemVfdCByZXRyaWVzTGVmdCA9IGtSZXRyeUNvdW50OworICAgIGJvb2wgZG9uZSA9IGZhbHNlOworCisgICAgZG8geworICAgICAgICBzaXplX3QgaW5wdXRJbmRleCA9IC0xOworICAgICAgICBpbnQ2NF90IHB0c1VzID0gMGxsOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIHNwPEFCdWZmZXI+IGNvZGVjQnVmZmVyID0gTlVMTDsKKworICAgICAgICB3aGlsZSAoaGF2ZU1vcmVJbnB1dHMpIHsKKyAgICAgICAgICAgIGVyciA9IGRlY29kZXItPmRlcXVldWVJbnB1dEJ1ZmZlcigmaW5wdXRJbmRleCwga0J1ZmZlclRpbWVPdXRVcyk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIlRpbWVkIG91dCB3YWl0aW5nIGZvciBpbnB1dCIpOworICAgICAgICAgICAgICAgIGlmIChyZXRyaWVzTGVmdCkgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2RlY0J1ZmZlciA9IGlucHV0QnVmZmVyc1tpbnB1dEluZGV4XTsKKworICAgICAgICAgICAgTWVkaWFCdWZmZXIgKm1lZGlhQnVmZmVyID0gTlVMTDsKKworICAgICAgICAgICAgZXJyID0gc291cmNlLT5yZWFkKCZtZWRpYUJ1ZmZlciwgJm9wdGlvbnMpOworICAgICAgICAgICAgb3B0aW9ucy5jbGVhclNlZWtUbygpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dXKCJJbnB1dCBFcnJvciBvciBFT1MiKTsKKyAgICAgICAgICAgICAgICBoYXZlTW9yZUlucHV0cyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpID4gY29kZWNCdWZmZXItPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYnVmZmVyIHNpemUgKCV6dSkgdG9vIGxhcmdlIGZvciBjb2RlYyBpbnB1dCBzaXplICglenUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSwgY29kZWNCdWZmZXItPmNhcGFjaXR5KCkpOworICAgICAgICAgICAgICAgIGVyciA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPnNldFJhbmdlKDAsIG1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisKKyAgICAgICAgICAgICAgICBDSEVDSyhtZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnB0c1VzKSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KGNvZGVjQnVmZmVyLT5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopbWVkaWFCdWZmZXItPmRhdGEoKSArIG1lZGlhQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1lZGlhQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlcnIgPT0gT0sgJiYgaW5wdXRJbmRleCA8IGlucHV0QnVmZmVycy5zaXplKCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJRdWV1ZUlucHV0OiBzaXplPSV6dSB0cz0lIiBQUklkNjQgIiB1cyBmbGFncz0leCIsCisgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5zaXplKCksIHB0c1VzLCBmbGFncyk7CisgICAgICAgICAgICBlcnIgPSBkZWNvZGVyLT5xdWV1ZUlucHV0QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBpbnB1dEluZGV4LAorICAgICAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+b2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5zaXplKCksCisgICAgICAgICAgICAgICAgICAgIHB0c1VzLAorICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisKKyAgICAgICAgICAgIC8vIHdlIGRvbid0IGV4cGVjdCBhbiBvdXRwdXQgZnJvbSBjb2RlYyBjb25maWcgYnVmZmVyCisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19DT0RFQ0NPTkZJRykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKGVyciA9PSBPSykgeworICAgICAgICAgICAgLy8gd2FpdCBmb3IgYSBkZWNvZGVkIGJ1ZmZlcgorICAgICAgICAgICAgZXJyID0gZGVjb2Rlci0+ZGVxdWV1ZU91dHB1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgJnRpbWVVcywKKyAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICBrQnVmZmVyVGltZU91dFVzKTsKKworICAgICAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlJlY2VpdmVkIGZvcm1hdCBjaGFuZ2UiKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBkZWNvZGVyLT5nZXRPdXRwdXRGb3JtYXQoJm91dHB1dEZvcm1hdCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBJTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiT3V0cHV0IGJ1ZmZlcnMgY2hhbmdlZCIpOworICAgICAgICAgICAgICAgIGVyciA9IGRlY29kZXItPmdldE91dHB1dEJ1ZmZlcnMoJm91dHB1dEJ1ZmZlcnMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IC1FQUdBSU4gLyogSU5GT19UUllfQUdBSU5fTEFURVIgKi8gJiYgLS1yZXRyaWVzTGVmdCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRpbWVkLW91dCB3YWl0aW5nIGZvciBvdXRwdXQuLiByZXRyaWVzIGxlZnQgPSAlenUiLCByZXRyaWVzTGVmdCk7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJSZWNlaXZlZCBhbiBvdXRwdXQgYnVmZmVyIik7CisgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJSZWNlaXZlZCBlcnJvciAlZCAoJXMpIGluc3RlYWQgb2Ygb3V0cHV0IiwgZXJyLCBhc1N0cmluZyhlcnIpKTsKKyAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZSAoZXJyID09IE9LICYmICFkb25lKTsKKworICAgIGlmIChlcnIgIT0gT0sgfHwgc2l6ZSA8PSAwIHx8IG91dHB1dEZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZGVjb2RlIHRodW1ibmFpbCBmcmFtZSIpOworICAgICAgICBzb3VyY2UtPnN0b3AoKTsKICAgICAgICAgZGVjb2Rlci0+c3RvcCgpOwotCisgICAgICAgIGRlY29kZXItPnJlbGVhc2UoKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgQUxPR1YoInN1Y2Nlc3NmdWxseSBkZWNvZGVkIHZpZGVvIGZyYW1lLiIpOworICAgIHNwPEFCdWZmZXI+IHZpZGVvRnJhbWVCdWZmZXIgPSBvdXRwdXRCdWZmZXJzLml0ZW1BdChpbmRleCk7CiAKLSAgICBpbnQzMl90IHVucmVhZGFibGU7Ci0gICAgaWYgKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5SXNVbnJlYWRhYmxlLCAmdW5yZWFkYWJsZSkKLSAgICAgICAgICAgICYmIHVucmVhZGFibGUgIT0gMCkgewotICAgICAgICBBTE9HVigidmlkZW8gZnJhbWUgaXMgdW5yZWFkYWJsZSwgZGVjb2RlciBkb2VzIG5vdCBnaXZlIHVzIGFjY2VzcyAiCi0gICAgICAgICAgICAgInRvIHRoZSB2aWRlbyBkYXRhLiIpOwotCi0gICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBidWZmZXIgPSBOVUxMOwotCi0gICAgICAgIGRlY29kZXItPnN0b3AoKTsKLQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKICAgICBpZiAodGh1bWJOYWlsVGltZSA+PSAwKSB7CiAgICAgICAgIGlmICh0aW1lVXMgIT0gdGh1bWJOYWlsVGltZSkgewotICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgICAgIENIRUNLKHRyYWNrTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICAgICAgQVN0cmluZyBtaW1lOworICAgICAgICAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKIAotICAgICAgICAgICAgQUxPR1YoInRodW1iTmFpbFRpbWUgPSAlIiBQUklkNjQgIiB1cywgdGltZVVzID0gJSIgUFJJZDY0ICIgdXMsIG1pbWUgPSAlcyIsCi0gICAgICAgICAgICAgICAgIHRodW1iTmFpbFRpbWUsIHRpbWVVcywgbWltZSk7CisgICAgICAgICAgICBBTE9HVigidGh1bWJOYWlsVGltZSA9ICVsbGQgdXMsIHRpbWVVcyA9ICVsbGQgdXMsIG1pbWUgPSAlcyIsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGh1bWJOYWlsVGltZSwgKGxvbmcgbG9uZyl0aW1lVXMsIG1pbWUuY19zdHIoKSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IGRlY29kZXItPmdldEZvcm1hdCgpOwotCiAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCkpOwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KSk7CisgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSk7CisgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKTsKIAogICAgIGludDMyX3QgY3JvcF9sZWZ0LCBjcm9wX3RvcCwgY3JvcF9yaWdodCwgY3JvcF9ib3R0b207Ci0gICAgaWYgKCFtZXRhLT5maW5kUmVjdCgKLSAgICAgICAgICAgICAgICBrS2V5Q3JvcFJlY3QsCi0gICAgICAgICAgICAgICAgJmNyb3BfbGVmdCwgJmNyb3BfdG9wLCAmY3JvcF9yaWdodCwgJmNyb3BfYm90dG9tKSkgeworICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kUmVjdCgiY3JvcCIsICZjcm9wX2xlZnQsICZjcm9wX3RvcCwgJmNyb3BfcmlnaHQsICZjcm9wX2JvdHRvbSkpIHsKICAgICAgICAgY3JvcF9sZWZ0ID0gY3JvcF90b3AgPSAwOwogICAgICAgICBjcm9wX3JpZ2h0ID0gd2lkdGggLSAxOwogICAgICAgICBjcm9wX2JvdHRvbSA9IGhlaWdodCAtIDE7CkBAIC0yNzksMjMgKzM3MSwyMSBAQAogICAgIGZyYW1lLT5tRGF0YSA9IG5ldyB1aW50OF90W2ZyYW1lLT5tU2l6ZV07CiAgICAgZnJhbWUtPm1Sb3RhdGlvbkFuZ2xlID0gcm90YXRpb25BbmdsZTsKIAotICAgIGludDMyX3QgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0OwotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleURpc3BsYXlXaWR0aCwgJmRpc3BsYXlXaWR0aCkpIHsKLSAgICAgICAgZnJhbWUtPm1EaXNwbGF5V2lkdGggPSBkaXNwbGF5V2lkdGg7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleURpc3BsYXlIZWlnaHQsICZkaXNwbGF5SGVpZ2h0KSkgewotICAgICAgICBmcmFtZS0+bURpc3BsYXlIZWlnaHQgPSBkaXNwbGF5SGVpZ2h0OworICAgIGludDMyX3Qgc2FyV2lkdGgsIHNhckhlaWdodDsKKyAgICBpZiAodHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVNBUldpZHRoLCAmc2FyV2lkdGgpCisgICAgICAgICAgICAmJiB0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5U0FSSGVpZ2h0LCAmc2FySGVpZ2h0KQorICAgICAgICAgICAgJiYgc2FySGVpZ2h0ICE9IDApIHsKKyAgICAgICAgZnJhbWUtPm1EaXNwbGF5V2lkdGggPSAoZnJhbWUtPm1EaXNwbGF5V2lkdGggKiBzYXJXaWR0aCkgLyBzYXJIZWlnaHQ7CiAgICAgfQogCiAgICAgaW50MzJfdCBzcmNGb3JtYXQ7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlDb2xvckZvcm1hdCwgJnNyY0Zvcm1hdCkpOworICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmc3JjRm9ybWF0KSk7CiAKLSAgICBDb2xvckNvbnZlcnRlciBjb252ZXJ0ZXIoCi0gICAgICAgICAgICAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpc3JjRm9ybWF0LCBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUpOworICAgIENvbG9yQ29udmVydGVyIGNvbnZlcnRlcigoT01YX0NPTE9SX0ZPUk1BVFRZUEUpc3JjRm9ybWF0LCBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUpOwogCiAgICAgaWYgKGNvbnZlcnRlci5pc1ZhbGlkKCkpIHsKICAgICAgICAgZXJyID0gY29udmVydGVyLmNvbnZlcnQoCi0gICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKil2aWRlb0ZyYW1lQnVmZmVyLT5kYXRhKCksCiAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICBjcm9wX2xlZnQsIGNyb3BfdG9wLCBjcm9wX3JpZ2h0LCBjcm9wX2JvdHRvbSwKICAgICAgICAgICAgICAgICBmcmFtZS0+bURhdGEsCkBAIC0zMDMsMTcgKzM5MywxNiBAQAogICAgICAgICAgICAgICAgIGZyYW1lLT5tSGVpZ2h0LAogICAgICAgICAgICAgICAgIDAsIDAsIGZyYW1lLT5tV2lkdGggLSAxLCBmcmFtZS0+bUhlaWdodCAtIDEpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgY29sb3IgY29udmVyc2lvbiBmcm9tIGZvcm1hdCAweCUwOHggdG8gIgotICAgICAgICAgICAgICAiUkdCNTY1IiwKLSAgICAgICAgICAgICAgc3JjRm9ybWF0KTsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBjb252ZXJ0IGZyb20gZm9ybWF0IDB4JTA4eCB0byBSR0I1NjUiLCBzcmNGb3JtYXQpOwogCiAgICAgICAgIGVyciA9IEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KIAotICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwotICAgIGJ1ZmZlciA9IE5VTEw7Ci0KKyAgICB2aWRlb0ZyYW1lQnVmZmVyLmNsZWFyKCk7CisgICAgc291cmNlLT5zdG9wKCk7CisgICAgZGVjb2Rlci0+cmVsZWFzZU91dHB1dEJ1ZmZlcihpbmRleCk7CiAgICAgZGVjb2Rlci0+c3RvcCgpOworICAgIGRlY29kZXItPnJlbGVhc2UoKTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIkNvbG9yY29udmVydGVyIGZhaWxlZCB0byBjb252ZXJ0IGZyYW1lLiIpOwpAQCAtMzg0LDIwICs0NzMsMjkgQEAKICAgICAgICAgbUFsYnVtQXJ0ID0gTWVkaWFBbGJ1bUFydDo6ZnJvbURhdGEoZGF0YVNpemUsIGRhdGEpOwogICAgIH0KIAotICAgIFZpZGVvRnJhbWUgKmZyYW1lID0KLSAgICAgICAgZXh0cmFjdFZpZGVvRnJhbWVXaXRoQ29kZWNGbGFncygKLSAgICAgICAgICAgICAgICAmbUNsaWVudCwgdHJhY2tNZXRhLCBzb3VyY2UsIE9NWENvZGVjOjprUHJlZmVyU29mdHdhcmVDb2RlY3MsCi0gICAgICAgICAgICAgICAgdGltZVVzLCBvcHRpb24pOworICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgQ0hFQ0sodHJhY2tNZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CiAKLSAgICBpZiAoZnJhbWUgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigiU29mdHdhcmUgZGVjb2RlciBmYWlsZWQgdG8gZXh0cmFjdCB0aHVtYm5haWwsICIKLSAgICAgICAgICAgICAidHJ5aW5nIGhhcmR3YXJlIGRlY29kZXIuIik7CisgICAgVmVjdG9yPE9NWENvZGVjOjpDb2RlY05hbWVBbmRRdWlya3M+IG1hdGNoaW5nQ29kZWNzOworICAgIE9NWENvZGVjOjpmaW5kTWF0Y2hpbmdDb2RlY3MoCisgICAgICAgICAgICBtaW1lLAorICAgICAgICAgICAgZmFsc2UsIC8qIGVuY29kZXIgKi8KKyAgICAgICAgICAgIE5VTEwsIC8qIG1hdGNoQ29tcG9uZW50TmFtZSAqLworICAgICAgICAgICAgT01YQ29kZWM6OmtQcmVmZXJTb2Z0d2FyZUNvZGVjcywKKyAgICAgICAgICAgICZtYXRjaGluZ0NvZGVjcyk7CiAKLSAgICAgICAgZnJhbWUgPSBleHRyYWN0VmlkZW9GcmFtZVdpdGhDb2RlY0ZsYWdzKCZtQ2xpZW50LCB0cmFja01ldGEsIHNvdXJjZSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVVcywgb3B0aW9uKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hdGNoaW5nQ29kZWNzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUgPSBtYXRjaGluZ0NvZGVjc1tpXS5tTmFtZS5zdHJpbmcoKTsKKyAgICAgICAgVmlkZW9GcmFtZSAqZnJhbWUgPQorICAgICAgICAgICAgZXh0cmFjdFZpZGVvRnJhbWUoY29tcG9uZW50TmFtZSwgdHJhY2tNZXRhLCBzb3VyY2UsIHRpbWVVcywgb3B0aW9uKTsKKworICAgICAgICBpZiAoZnJhbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIGZyYW1lOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCIlcyBmYWlsZWQgdG8gZXh0cmFjdCB0aHVtYm5haWwsIHRyeWluZyBuZXh0IGRlY29kZXIuIiwgY29tcG9uZW50TmFtZSk7CiAgICAgfQogCi0gICAgcmV0dXJuIGZyYW1lOworICAgIHJldHVybiBOVUxMOwogfQogCiBNZWRpYUFsYnVtQXJ0ICpTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpleHRyYWN0QWxidW1BcnQoKSB7CkBAIC01MTksNiArNjE3LDEyIEBACiAKICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9OVU1fVFJBQ0tTLCBTdHJpbmc4KHRtcCkpOwogCisgICAgZmxvYXQgY2FwdHVyZUZwczsKKyAgICBpZiAobWV0YS0+ZmluZEZsb2F0KGtLZXlDYXB0dXJlRnJhbWVyYXRlLCAmY2FwdHVyZUZwcykpIHsKKyAgICAgICAgc3ByaW50Zih0bXAsICIlZiIsIGNhcHR1cmVGcHMpOworICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9DQVBUVVJFX0ZSQU1FUkFURSwgU3RyaW5nOCh0bXApKTsKKyAgICB9CisKICAgICBib29sIGhhc0F1ZGlvID0gZmFsc2U7CiAgICAgYm9vbCBoYXNWaWRlbyA9IGZhbHNlOwogICAgIGludDMyX3QgdmlkZW9XaWR0aCA9IC0xOwpAQCAtNjI5LDQgKzczMywxMSBAQAogICAgIH0KIH0KIAordm9pZCBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpjbGVhck1ldGFkYXRhKCkgeworICAgIG1QYXJzZWRNZXRhRGF0YSA9IGZhbHNlOworICAgIG1NZXRhRGF0YS5jbGVhcigpOworICAgIGRlbGV0ZSBtQWxidW1BcnQ7CisgICAgbUFsYnVtQXJ0ID0gTlVMTDsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNjJlNDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuY3BwCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlN1cmZhY2VVdGlscyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oPgorCisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0dXNfdCBzZXROYXRpdmVXaW5kb3dTaXplRm9ybWF0QW5kVXNhZ2UoCisgICAgICAgIEFOYXRpdmVXaW5kb3cgKm5hdGl2ZVdpbmRvdyAvKiBub25udWxsICovLAorICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQsIGludCByb3RhdGlvbiwgaW50IHVzYWdlKSB7CisgICAgc3RhdHVzX3QgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zKG5hdGl2ZVdpbmRvdywgd2lkdGgsIGhlaWdodCk7CisgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgibmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zIGZhaWxlZDogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdChuYXRpdmVXaW5kb3csIGZvcm1hdCk7CisgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgibmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19mb3JtYXQgZmFpbGVkOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksIC1lcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludCB0cmFuc2Zvcm0gPSAwOworICAgIGlmICgocm90YXRpb24gJSA5MCkgPT0gMCkgeworICAgICAgICBzd2l0Y2ggKChyb3RhdGlvbiAvIDkwKSAmIDMpIHsKKyAgICAgICAgICAgIGNhc2UgMTogIHRyYW5zZm9ybSA9IEhBTF9UUkFOU0ZPUk1fUk9UXzkwOyAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6ICB0cmFuc2Zvcm0gPSBIQUxfVFJBTlNGT1JNX1JPVF8xODA7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOiAgdHJhbnNmb3JtID0gSEFMX1RSQU5TRk9STV9ST1RfMjcwOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IHRyYW5zZm9ybSA9IDA7ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RyYW5zZm9ybShuYXRpdmVXaW5kb3csIHRyYW5zZm9ybSk7CisgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgibmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190cmFuc2Zvcm0gZmFpbGVkOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksIC1lcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8vIE1ha2Ugc3VyZSB0byBjaGVjayB3aGV0aGVyIGVpdGhlciBTdGFnZWZyaWdodCBvciB0aGUgdmlkZW8gZGVjb2RlcgorICAgIC8vIHJlcXVlc3RlZCBwcm90ZWN0ZWQgYnVmZmVycy4KKyAgICBpZiAodXNhZ2UgJiBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRCkgeworICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgQU5hdGl2ZVdpbmRvdyBzZW5kcyBpbWFnZXMgZGlyZWN0bHkgdG8KKyAgICAgICAgLy8gU3VyZmFjZUZsaW5nZXIuCisgICAgICAgIGludCBxdWV1ZXNUb05hdGl2ZVdpbmRvdyA9IDA7CisgICAgICAgIGVyciA9IG5hdGl2ZVdpbmRvdy0+cXVlcnkoCisgICAgICAgICAgICAgICAgbmF0aXZlV2luZG93LCBOQVRJVkVfV0lORE9XX1FVRVVFU19UT19XSU5ET1dfQ09NUE9TRVIsICZxdWV1ZXNUb05hdGl2ZVdpbmRvdyk7CisgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJlcnJvciBhdXRoZW50aWNhdGluZyBuYXRpdmUgd2luZG93OiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksIC1lcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBpZiAocXVldWVzVG9OYXRpdmVXaW5kb3cgIT0gMSkgeworICAgICAgICAgICAgQUxPR0UoIm5hdGl2ZSB3aW5kb3cgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludCBjb25zdW1lclVzYWdlID0gMDsKKyAgICBlcnIgPSBuYXRpdmVXaW5kb3ctPnF1ZXJ5KG5hdGl2ZVdpbmRvdywgTkFUSVZFX1dJTkRPV19DT05TVU1FUl9VU0FHRV9CSVRTLCAmY29uc3VtZXJVc2FnZSk7CisgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HVygiZmFpbGVkIHRvIGdldCBjb25zdW1lciB1c2FnZSBiaXRzLiBpZ25vcmluZyIpOworICAgICAgICBlcnIgPSBOT19FUlJPUjsKKyAgICB9CisKKyAgICBpbnQgZmluYWxVc2FnZSA9IHVzYWdlIHwgY29uc3VtZXJVc2FnZTsKKyAgICBBTE9HVigiZ3JhbGxvYyB1c2FnZTogJSN4KHByb2R1Y2VyKSArICUjeChjb25zdW1lcikgPSAlI3giLCB1c2FnZSwgY29uc3VtZXJVc2FnZSwgZmluYWxVc2FnZSk7CisgICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UobmF0aXZlV2luZG93LCBmaW5hbFVzYWdlKTsKKyAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJuYXRpdmVfd2luZG93X3NldF91c2FnZSBmYWlsZWQ6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwgLWVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfc2NhbGluZ19tb2RlKAorICAgICAgICAgICAgbmF0aXZlV2luZG93LCBOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19XSU5ET1cpOworICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIm5hdGl2ZV93aW5kb3dfc2V0X3NjYWxpbmdfbW9kZSBmYWlsZWQ6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwgLWVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgQUxPR0QoInNldCB1cCBuYXRpdmVXaW5kb3cgJXAgZm9yICVkeCVkLCBjb2xvciAlI3gsIHJvdGF0aW9uICVkLCB1c2FnZSAlI3giLAorICAgICAgICAgICAgbmF0aXZlV2luZG93LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHJvdGF0aW9uLCBmaW5hbFVzYWdlKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IHB1c2hCbGFua0J1ZmZlcnNUb05hdGl2ZVdpbmRvdyhBTmF0aXZlV2luZG93ICpuYXRpdmVXaW5kb3cgLyogbm9ubnVsbCAqLykgeworICAgIHN0YXR1c190IGVyciA9IE5PX0VSUk9SOworICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYiA9IE5VTEw7CisgICAgaW50IG51bUJ1ZnMgPSAwOworICAgIGludCBtaW5VbmRlcXVldWVkQnVmcyA9IDA7CisKKyAgICAvLyBXZSBuZWVkIHRvIHJlY29ubmVjdCB0byB0aGUgQU5hdGl2ZVdpbmRvdyBhcyBhIENQVSBjbGllbnQgdG8gZW5zdXJlIHRoYXQKKyAgICAvLyBubyBmcmFtZXMgZ2V0IGRyb3BwZWQgYnkgU3VyZmFjZUZsaW5nZXIgYXNzdW1pbmcgdGhhdCB0aGVzZSBhcmUgdmlkZW8KKyAgICAvLyBmcmFtZXMuCisgICAgZXJyID0gbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdChuYXRpdmVXaW5kb3csIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKKyAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogYXBpX2Rpc2Nvbm5lY3QgZmFpbGVkOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksIC1lcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3QobmF0aXZlV2luZG93LCBOQVRJVkVfV0lORE9XX0FQSV9DUFUpOworICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIHB1c2hpbmcgYmxhbmsgZnJhbWVzOiBhcGlfY29ubmVjdCBmYWlsZWQ6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwgLWVycik7CisgICAgICAgICh2b2lkKW5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3QobmF0aXZlV2luZG93LCBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgZXJyID0gc2V0TmF0aXZlV2luZG93U2l6ZUZvcm1hdEFuZFVzYWdlKAorICAgICAgICAgICAgbmF0aXZlV2luZG93LCAxLCAxLCBIQUxfUElYRUxfRk9STUFUX1JHQlhfODg4OCwgMCwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTik7CisgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHN0YXRpY19jYXN0PFN1cmZhY2UqPihuYXRpdmVXaW5kb3cpLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCktPmFsbG93QWxsb2NhdGlvbih0cnVlKTsKKworICAgIGVyciA9IG5hdGl2ZVdpbmRvdy0+cXVlcnkobmF0aXZlV2luZG93LAorICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTLCAmbWluVW5kZXF1ZXVlZEJ1ZnMpOworICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIHB1c2hpbmcgYmxhbmsgZnJhbWVzOiBNSU5fVU5ERVFVRVVFRF9CVUZGRVJTIHF1ZXJ5ICIKKyAgICAgICAgICAgICAgICAiZmFpbGVkOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksIC1lcnIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIG51bUJ1ZnMgPSBtaW5VbmRlcXVldWVkQnVmcyArIDE7CisgICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KG5hdGl2ZVdpbmRvdywgbnVtQnVmcyk7CisgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IHNldF9idWZmZXJfY291bnQgZmFpbGVkOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksIC1lcnIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8vIFdlIHB1c2ggbnVtQnVmcyArIDEgYnVmZmVycyB0byBlbnN1cmUgdGhhdCB3ZSd2ZSBkcmF3biBpbnRvIHRoZSBzYW1lCisgICAgLy8gYnVmZmVyIHR3aWNlLiAgVGhpcyBzaG91bGQgZ3VhcmFudGVlIHRoYXQgdGhlIGJ1ZmZlciBoYXMgYmVlbiBkaXNwbGF5ZWQKKyAgICAvLyBvbiB0aGUgc2NyZWVuIGFuZCB0aGVuIGJlZW4gcmVwbGFjZWQsIHNvIGFuIHByZXZpb3VzIHZpZGVvIGZyYW1lcyBhcmUKKyAgICAvLyBndWFyYW50ZWVkIE5PVCB0byBiZSBjdXJyZW50bHkgZGlzcGxheWVkLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQnVmcyArIDE7IGkrKykgeworICAgICAgICBlcnIgPSBuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0KG5hdGl2ZVdpbmRvdywgJmFuYik7CisgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogZGVxdWV1ZUJ1ZmZlciBmYWlsZWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZihuZXcgR3JhcGhpY0J1ZmZlcihhbmIsIGZhbHNlKSk7CisKKyAgICAgICAgLy8gRmlsbCB0aGUgYnVmZmVyIHdpdGggdGhlIGEgMXgxIGNoZWNrZXJib2FyZCBwYXR0ZXJuIDspCisgICAgICAgIHVpbnQzMl90ICppbWcgPSBOVUxMOworICAgICAgICBlcnIgPSBidWYtPmxvY2soR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgKHZvaWQqKikoJmltZykpOworICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IGxvY2sgZmFpbGVkOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksIC1lcnIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAqaW1nID0gMDsKKworICAgICAgICBlcnIgPSBidWYtPnVubG9jaygpOworICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IHVubG9jayBmYWlsZWQ6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwgLWVycik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IG5hdGl2ZVdpbmRvdy0+cXVldWVCdWZmZXIobmF0aXZlV2luZG93LCBidWYtPmdldE5hdGl2ZUJ1ZmZlcigpLCAtMSk7CisgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogcXVldWVCdWZmZXIgZmFpbGVkOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksIC1lcnIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBhbmIgPSBOVUxMOworICAgIH0KKworZXJyb3I6CisKKyAgICBpZiAoYW5iICE9IE5VTEwpIHsKKyAgICAgICAgbmF0aXZlV2luZG93LT5jYW5jZWxCdWZmZXIobmF0aXZlV2luZG93LCBhbmIsIC0xKTsKKyAgICAgICAgYW5iID0gTlVMTDsKKyAgICB9CisKKyAgICAvLyBDbGVhbiB1cCBhZnRlciBzdWNjZXNzIG9yIGVycm9yLgorICAgIHN0YXR1c190IGVycjIgPSBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KG5hdGl2ZVdpbmRvdywgTkFUSVZFX1dJTkRPV19BUElfQ1BVKTsKKyAgICBpZiAoZXJyMiAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IGFwaV9kaXNjb25uZWN0IGZhaWxlZDogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIyKSwgLWVycjIpOworICAgICAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBlcnIgPSBlcnIyOworICAgICAgICB9CisgICAgfQorCisgICAgZXJyMiA9IG5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3QobmF0aXZlV2luZG93LCBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7CisgICAgaWYgKGVycjIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIHB1c2hpbmcgYmxhbmsgZnJhbWVzOiBhcGlfY29ubmVjdCBmYWlsZWQ6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwgLWVycik7CisgICAgICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGVyciA9IGVycjI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKaW5kZXggOTg3ZjEyZC4uN2M4ZDQ0MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcApAQCAtMTgzLDExICsxODMsMjYgQEAKICAgICAgICAgbXNnLT5zZXRJbnQzMigibWF4LWlucHV0LXNpemUiLCBtYXhJbnB1dFNpemUpOwogICAgIH0KIAorICAgIGludDMyX3QgbWF4V2lkdGg7CisgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5TWF4V2lkdGgsICZtYXhXaWR0aCkpIHsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigibWF4LXdpZHRoIiwgbWF4V2lkdGgpOworICAgIH0KKworICAgIGludDMyX3QgbWF4SGVpZ2h0OworICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleU1heEhlaWdodCwgJm1heEhlaWdodCkpIHsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigibWF4LWhlaWdodCIsIG1heEhlaWdodCk7CisgICAgfQorCiAgICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXM7CiAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Um90YXRpb24sICZyb3RhdGlvbkRlZ3JlZXMpKSB7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoInJvdGF0aW9uLWRlZ3JlZXMiLCByb3RhdGlvbkRlZ3JlZXMpOwogICAgIH0KIAorICAgIGludDMyX3QgZnBzOworICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUZyYW1lUmF0ZSwgJmZwcykpIHsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigiZnJhbWUtcmF0ZSIsIGZwcyk7CisgICAgfQorCiAgICAgdWludDMyX3QgdHlwZTsKICAgICBjb25zdCB2b2lkICpkYXRhOwogICAgIHNpemVfdCBzaXplOwpAQCAtNDA4LDYgKzQyMywzNCBAQAogICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImNzZCIsIHRydWUpOwogICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOwogICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3NkLTAiLCBidWZmZXIpOworCisgICAgICAgIGlmICghbWV0YS0+ZmluZERhdGEoa0tleU9wdXNDb2RlY0RlbGF5LCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKworICAgICAgICBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihzaXplKTsKKyAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMIHx8IGJ1ZmZlci0+YmFzZSgpID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBkYXRhLCBzaXplKTsKKworICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImNzZCIsIHRydWUpOworICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOworICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3NkLTEiLCBidWZmZXIpOworCisgICAgICAgIGlmICghbWV0YS0+ZmluZERhdGEoa0tleU9wdXNTZWVrUHJlUm9sbCwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAgICAgYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIEFCdWZmZXIoc2l6ZSk7CisgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKKyAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNzZC0yIiwgYnVmZmVyKTsKICAgICB9CiAKICAgICAqZm9ybWF0ID0gbXNnOwpAQCAtNjEwLDE5ICs2NTMsMzYgQEAKICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgbWF4SW5wdXRTaXplKTsKICAgICB9CiAKKyAgICBpbnQzMl90IG1heFdpZHRoOworICAgIGlmIChtc2ctPmZpbmRJbnQzMigibWF4LXdpZHRoIiwgJm1heFdpZHRoKSkgeworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5TWF4V2lkdGgsIG1heFdpZHRoKTsKKyAgICB9CisKKyAgICBpbnQzMl90IG1heEhlaWdodDsKKyAgICBpZiAobXNnLT5maW5kSW50MzIoIm1heC1oZWlnaHQiLCAmbWF4SGVpZ2h0KSkgeworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5TWF4SGVpZ2h0LCBtYXhIZWlnaHQpOworICAgIH0KKworICAgIGludDMyX3QgZnBzOworICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZnJhbWUtcmF0ZSIsICZmcHMpKSB7CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlGcmFtZVJhdGUsIGZwcyk7CisgICAgfQorCiAgICAgLy8gcmVhc3NlbWJsZSB0aGUgY3NkIGRhdGEgaW50byBpdHMgb3JpZ2luYWwgZm9ybQogICAgIHNwPEFCdWZmZXI+IGNzZDA7CiAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiY3NkLTAiLCAmY3NkMCkpIHsKLSAgICAgICAgaWYgKG1pbWUuc3RhcnRzV2l0aCgidmlkZW8vIikpIHsgLy8gZG8gd2UgbmVlZCB0byBiZSBzdHJpY3RlciB0aGFuIHRoaXM/CisgICAgICAgIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykgewogICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gY3NkMTsKICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoImNzZC0xIiwgJmNzZDEpKSB7CiAgICAgICAgICAgICAgICAgY2hhciBhdmNjWzEwMjRdOyAvLyB0aGF0IG91Z2h0YSBiZSBlbm91Z2gsIHJpZ2h0PwogICAgICAgICAgICAgICAgIHNpemVfdCBvdXRzaXplID0gcmVhc3NlbWJsZUFWQ0MoY3NkMCwgY3NkMSwgYXZjYyk7CiAgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVZDQywga0tleUFWQ0MsIGF2Y2MsIG91dHNpemUpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1pbWUuc3RhcnRzV2l0aCgiYXVkaW8vIikpIHsKKyAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyB8fCBtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KSB7CiAgICAgICAgICAgICBpbnQgY3NkMHNpemUgPSBjc2QwLT5zaXplKCk7CiAgICAgICAgICAgICBjaGFyIGVzZHNbY3NkMHNpemUgKyAzMV07CisgICAgICAgICAgICAvLyBUaGUgd3JpdHRlbiBFU0RTIGlzIGFjdHVhbGx5IGZvciBhbiBhdWRpbyBzdHJlYW0sIGJ1dCBpdCdzIGVub3VnaAorICAgICAgICAgICAgLy8gZm9yIHRyYW5zcG9ydGluZyB0aGUgQ1NEIHRvIG11eGVycy4KICAgICAgICAgICAgIHJlYXNzZW1ibGVFU0RTKGNzZDAsIGVzZHMpOwogICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5RVNEUywga0tleUVTRFMsIGVzZHMsIHNpemVvZihlc2RzKSk7CiAgICAgICAgIH0KQEAgLTg2NCw1ICs5MjQsODggQEAKICAgICByZXR1cm4gQVN0cmluZygiPG5vLXNjaGVtZSBVUkkgc3VwcHJlc3NlZD4iKTsKIH0KIAorSExTVGltZTo6SExTVGltZShjb25zdCBzcDxBTWVzc2FnZT4mIG1ldGEpIDoKKyAgICBtU2VxKC0xKSwKKyAgICBtVGltZVVzKC0xbGwpLAorICAgIG1NZXRhKG1ldGEpIHsKKyAgICBpZiAobWV0YSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMigiZGlzY29udGludWl0eVNlcSIsICZtU2VxKSk7CisgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1UaW1lVXMpKTsKKyAgICB9Cit9CisKK2ludDY0X3QgSExTVGltZTo6Z2V0U2VnbWVudFRpbWVVcygpIGNvbnN0IHsKKyAgICBpbnQ2NF90IHNlZ21lbnRTdGFydFRpbWVVcyA9IC0xbGw7CisgICAgaWYgKG1NZXRhICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0sobU1ldGEtPmZpbmRJbnQ2NCgic2VnbWVudFN0YXJ0VGltZVVzIiwgJnNlZ21lbnRTdGFydFRpbWVVcykpOworCisgICAgICAgIGludDY0X3Qgc2VnbWVudEZpcnN0VGltZVVzOworICAgICAgICBpZiAobU1ldGEtPmZpbmRJbnQ2NCgic2VnbWVudEZpcnN0VGltZVVzIiwgJnNlZ21lbnRGaXJzdFRpbWVVcykpIHsKKyAgICAgICAgICAgIHNlZ21lbnRTdGFydFRpbWVVcyArPSBtVGltZVVzIC0gc2VnbWVudEZpcnN0VGltZVVzOworICAgICAgICB9CisKKyAgICAgICAgLy8gYWRqdXN0IHNlZ21lbnQgdGltZSBieSBwbGF5bGlzdCBhZ2UgKGZvciBsaXZlIHN0cmVhbWluZykKKyAgICAgICAgaW50NjRfdCBwbGF5bGlzdFRpbWVVczsKKyAgICAgICAgaWYgKG1NZXRhLT5maW5kSW50NjQoInBsYXlsaXN0VGltZVVzIiwgJnBsYXlsaXN0VGltZVVzKSkgeworICAgICAgICAgICAgaW50NjRfdCBwbGF5bGlzdEFnZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHBsYXlsaXN0VGltZVVzOworCisgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgICAgICAgICBDSEVDSyhtTWV0YS0+ZmluZEludDY0KCJzZWdtZW50RHVyYXRpb25VcyIsICZkdXJhdGlvblVzKSk7CisKKyAgICAgICAgICAgIC8vIHJvdW5kIHRvIG5lYXJlc3Qgd2hvbGUgc2VnbWVudAorICAgICAgICAgICAgcGxheWxpc3RBZ2VVcyA9IChwbGF5bGlzdEFnZVVzICsgZHVyYXRpb25VcyAvIDIpCisgICAgICAgICAgICAgICAgICAgIC8gZHVyYXRpb25VcyAqIGR1cmF0aW9uVXM7CisKKyAgICAgICAgICAgIHNlZ21lbnRTdGFydFRpbWVVcyAtPSBwbGF5bGlzdEFnZVVzOworICAgICAgICAgICAgaWYgKHNlZ21lbnRTdGFydFRpbWVVcyA8IDApIHsKKyAgICAgICAgICAgICAgICBzZWdtZW50U3RhcnRUaW1lVXMgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzZWdtZW50U3RhcnRUaW1lVXM7Cit9CisKK2Jvb2wgb3BlcmF0b3IgPChjb25zdCBITFNUaW1lICZ0MCwgY29uc3QgSExTVGltZSAmdDEpIHsKKyAgICAvLyB3ZSBjYW4gb25seSBjb21wYXJlIGRpc2NvbnRpbnVpdHkgc2VxdWVuY2UgYW5kIHRpbWVzdGFtcC4KKyAgICAvLyAobVNlZ21lbnRUaW1lVXMgaXMgbm90IHJlbGlhYmxlIGluIGxpdmUgc3RyZWFtaW5nIGNhc2UsIGl0J3MgdGhlCisgICAgLy8gdGltZSBzdGFydGluZyBmcm9tIGJlZ2lubmluZyBvZiBwbGF5bGlzdCBidXQgcGxheWxpc3QgY291bGQgY2hhbmdlLikKKyAgICByZXR1cm4gdDAubVNlcSA8IHQxLm1TZXEKKyAgICAgICAgICAgIHx8ICh0MC5tU2VxID09IHQxLm1TZXEgJiYgdDAubVRpbWVVcyA8IHQxLm1UaW1lVXMpOworfQorCit2b2lkIHdyaXRlVG9BTWVzc2FnZShzcDxBTWVzc2FnZT4gbXNnLCBjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSkgeworICAgIG1zZy0+c2V0RmxvYXQoInNwZWVkIiwgcmF0ZS5tU3BlZWQpOworICAgIG1zZy0+c2V0RmxvYXQoInBpdGNoIiwgcmF0ZS5tUGl0Y2gpOworICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvLWZhbGxiYWNrLW1vZGUiLCByYXRlLm1GYWxsYmFja01vZGUpOworICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvLXN0cmV0Y2gtbW9kZSIsIHJhdGUubVN0cmV0Y2hNb2RlKTsKK30KKwordm9pZCByZWFkRnJvbUFNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSAvKiBub25udWxsICovKSB7CisgICAgKnJhdGUgPSBBVURJT19QTEFZQkFDS19SQVRFX0RFRkFVTFQ7CisgICAgQ0hFQ0sobXNnLT5maW5kRmxvYXQoInNwZWVkIiwgJnJhdGUtPm1TcGVlZCkpOworICAgIENIRUNLKG1zZy0+ZmluZEZsb2F0KCJwaXRjaCIsICZyYXRlLT5tUGl0Y2gpKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8tZmFsbGJhY2stbW9kZSIsIChpbnQzMl90ICopJnJhdGUtPm1GYWxsYmFja01vZGUpKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8tc3RyZXRjaC1tb2RlIiwgKGludDMyX3QgKikmcmF0ZS0+bVN0cmV0Y2hNb2RlKSk7Cit9CisKK3ZvaWQgd3JpdGVUb0FNZXNzYWdlKHNwPEFNZXNzYWdlPiBtc2csIGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpIHsKKyAgICBtc2ctPnNldEludDMyKCJzeW5jLXNvdXJjZSIsIHN5bmMubVNvdXJjZSk7CisgICAgbXNnLT5zZXRJbnQzMigiYXVkaW8tYWRqdXN0LW1vZGUiLCBzeW5jLm1BdWRpb0FkanVzdE1vZGUpOworICAgIG1zZy0+c2V0RmxvYXQoInRvbGVyYW5jZSIsIHN5bmMubVRvbGVyYW5jZSk7CisgICAgbXNnLT5zZXRGbG9hdCgidmlkZW8tZnBzIiwgdmlkZW9GcHNIaW50KTsKK30KKwordm9pZCByZWFkRnJvbUFNZXNzYWdlKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywKKyAgICAgICAgQVZTeW5jU2V0dGluZ3MgKnN5bmMgLyogbm9ubnVsbCAqLywKKyAgICAgICAgZmxvYXQgKnZpZGVvRnBzIC8qIG5vbm51bGwgKi8pIHsKKyAgICBBVlN5bmNTZXR0aW5ncyBzZXR0aW5nczsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic3luYy1zb3VyY2UiLCAoaW50MzJfdCAqKSZzZXR0aW5ncy5tU291cmNlKSk7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImF1ZGlvLWFkanVzdC1tb2RlIiwgKGludDMyX3QgKikmc2V0dGluZ3MubUF1ZGlvQWRqdXN0TW9kZSkpOworICAgIENIRUNLKG1zZy0+ZmluZEZsb2F0KCJ0b2xlcmFuY2UiLCAmc2V0dGluZ3MubVRvbGVyYW5jZSkpOworICAgIENIRUNLKG1zZy0+ZmluZEZsb2F0KCJ2aWRlby1mcHMiLCB2aWRlb0ZwcykpOworICAgICpzeW5jID0gc2V0dGluZ3M7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZCUklTZWVrZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVkJSSVNlZWtlci5jcHAKaW5kZXggZTk4OGY2ZC4uOGEwZmNhYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVkJSSVNlZWtlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVkJSSVNlZWtlci5jcHAKQEAgLTEyMiw3ICsxMjIsNyBAQAogCiAgICAgICAgIHNlZWtlci0+bVNlZ21lbnRzLnB1c2gobnVtQnl0ZXMpOwogCi0gICAgICAgIEFMT0dWKCJlbnRyeSAjJXp1OiAldSBvZmZzZXQgMHglMDE2bGx4IiwgaSwgbnVtQnl0ZXMsIG9mZnNldCk7CisgICAgICAgIEFMT0dWKCJlbnRyeSAjJXp1OiAldSBvZmZzZXQgJSMwMTZsbHgiLCBpLCBudW1CeXRlcywgKGxvbmcgbG9uZylvZmZzZXQpOwogICAgICAgICBvZmZzZXQgKz0gbnVtQnl0ZXM7CiAgICAgfQogCkBAIC0xNjMsNyArMTYzLDcgQEAKICAgICAgICAgKnBvcyArPSBtU2VnbWVudHMuaXRlbUF0KHNlZ21lbnRJbmRleCsrKTsKICAgICB9CiAKLSAgICBBTE9HVigiZ2V0T2Zmc2V0Rm9yVGltZSAlIiBQUklkNjQgIiB1cyA9PiAweCUwMTZsbHgiLCAqdGltZVVzLCAqcG9zKTsKKyAgICBBTE9HVigiZ2V0T2Zmc2V0Rm9yVGltZSAlbGxkIHVzID0+IDB4JTAxNmxseCIsIChsb25nIGxvbmcpKnRpbWVVcywgKGxvbmcgbG9uZykqcG9zKTsKIAogICAgICp0aW1lVXMgPSBub3dVczsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1ZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1ZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcAppbmRleCBjZTVmNWZlLi41ZmU5YmY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAKQEAgLTI4LDggKzI4LDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KLQotI2luY2x1ZGUgIlZpZGVvRnJhbWVTY2hlZHVsZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNTYsNyArNTUsNyBAQAogc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4U2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QgPSBWaWRlb0ZyYW1lU2NoZWR1bGVyOjprSGlzdG9yeVNpemU7CiAKIHN0YXRpYyBjb25zdCBzaXplX3Qga1ByZWNpc2lvbiA9IDEyOwotc3RhdGljIGNvbnN0IHNpemVfdCBrRXJyb3JUaHJlc2hvbGQgPSAoMSA8PCAoa1ByZWNpc2lvbiAqIDIpKSAvIDEwOworc3RhdGljIGNvbnN0IGludDY0X3Qga0Vycm9yVGhyZXNob2xkID0gKDEgPDwgKGtQcmVjaXNpb24gKiAyKSkgLyAxMDsKIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNdWx0aXBsZXNUaHJlc2hvbGREaXYgPSA0OyAgICAgICAgICAgIC8vIDI1JQogc3RhdGljIGNvbnN0IGludDY0X3Qga1JlRml0VGhyZXNob2xkRGl2ID0gMTAwOyAgICAgICAgICAgICAgLy8gMSUKIHN0YXRpYyBjb25zdCBuc2Vjc190IGtNYXhBbGxvd2VkRnJhbWVTa2lwID0ga05hbm9zSW4xczsgICAgIC8vIDEgc2VjCkBAIC0yNTgsNyArMjU3LDggQEAKICAgICAgICAgICAgIG1QaGFzZSA9IGZpcnN0VGltZTsKICAgICAgICAgfQogICAgIH0KLSAgICBBTE9HVigicHJpbWluZ1slenVdIHBoYXNlOiVsbGQgcGVyaW9kOiVsbGQiLCBudW1TYW1wbGVzVG9Vc2UsIG1QaGFzZSwgbVBlcmlvZCk7CisgICAgQUxPR1YoInByaW1pbmdbJXp1XSBwaGFzZTolbGxkIHBlcmlvZDolbGxkIiwKKyAgICAgICAgICAgIG51bVNhbXBsZXNUb1VzZSwgKGxvbmcgbG9uZyltUGhhc2UsIChsb25nIGxvbmcpbVBlcmlvZCk7CiB9CiAKIG5zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjphZGRTYW1wbGUobnNlY3NfdCB0aW1lKSB7CkBAIC0zMTYsNiArMzE2LDEwIEBACiAgICAgcmV0dXJuIG1QZXJpb2Q7CiB9CiAKK25zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpnZXRQZXJpb2QoKSBjb25zdCB7CisgICAgcmV0dXJuIG1QcmltZWQgPyBtUGVyaW9kIDogMDsKK30KKwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZSBTY2hlZHVsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpAQCAtMzgyLDYgKzM4NiwxNCBAQAogICAgIHJldHVybiBrRGVmYXVsdFZzeW5jUGVyaW9kOwogfQogCitmbG9hdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpnZXRGcmFtZVJhdGUoKSB7CisgICAgbnNlY3NfdCB2aWRlb1BlcmlvZCA9IG1QbGwuZ2V0UGVyaW9kKCk7CisgICAgaWYgKHZpZGVvUGVyaW9kID4gMCkgeworICAgICAgICByZXR1cm4gMWU5IC8gdmlkZW9QZXJpb2Q7CisgICAgfQorICAgIHJldHVybiAwLmY7Cit9CisKIG5zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlcjo6c2NoZWR1bGUobnNlY3NfdCByZW5kZXJUaW1lKSB7CiAgICAgbnNlY3NfdCBvcmlnUmVuZGVyVGltZSA9IHJlbmRlclRpbWU7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2F2Y191dGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9hdmNfdXRpbHMuY3BwCmluZGV4IDVlYzM0MzguLjhlZjJkY2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2F2Y191dGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYXZjX3V0aWxzLmNwcApAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMTg2LDE3ICsxODcsMzEgQEAKICAgICAgICAgICAgIGlmIChhc3BlY3RfcmF0aW9faWRjID09IDI1NSAvKiBleHRlbmRlZFNBUiAqLykgewogICAgICAgICAgICAgICAgIHNhcl93aWR0aCA9IGJyLmdldEJpdHMoMTYpOwogICAgICAgICAgICAgICAgIHNhcl9oZWlnaHQgPSBici5nZXRCaXRzKDE2KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXNwZWN0X3JhdGlvX2lkYyA+IDAgJiYgYXNwZWN0X3JhdGlvX2lkYyA8IDE0KSB7Ci0gICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0ZpeGVkU0FSV2lkdGhbXSA9IHsKLSAgICAgICAgICAgICAgICAgICAgMSwgMTIsIDEwLCAxNiwgNDAsIDI0LCAyMCwgMzIsIDgwLCAxOCwgMTUsIDY0LCAxNjAKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7IHVuc2lnbmVkIHdpZHRoLCBoZWlnaHQ7IH0ga0ZpeGVkU0FSc1tdID0geworICAgICAgICAgICAgICAgICAgICAgICAgeyAgIDAsICAwIH0sIC8vIEludmFsaWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgMTIsIDExIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7ICAxMCwgMTEgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgIDE2LCAxMSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgNDAsIDMzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7ICAyNCwgMTEgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgIDIwLCAxMSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgMzIsIDExIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7ICA4MCwgMzMgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgIDE4LCAxMSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgMTUsIDExIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7ICA2NCwgMzMgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgMTYwLCA5OSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgIDQsICAzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7ICAgMywgIDIgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgICAyLCAgMSB9LAogICAgICAgICAgICAgICAgIH07CiAKLSAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrRml4ZWRTQVJIZWlnaHRbXSA9IHsKLSAgICAgICAgICAgICAgICAgICAgMSwgMTEsIDExLCAxMSwgMzMsIDExLCAxMSwgMTEsIDMzLCAxMSwgMTEsIDMzLCA5OQotICAgICAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgICAgICBzYXJfd2lkdGggPSBrRml4ZWRTQVJXaWR0aFthc3BlY3RfcmF0aW9faWRjIC0gMV07Ci0gICAgICAgICAgICAgICAgc2FyX2hlaWdodCA9IGtGaXhlZFNBUkhlaWdodFthc3BlY3RfcmF0aW9faWRjIC0gMV07CisgICAgICAgICAgICAgICAgaWYgKGFzcGVjdF9yYXRpb19pZGMgPiAwICYmIGFzcGVjdF9yYXRpb19pZGMgPCBORUxFTShrRml4ZWRTQVJzKSkgeworICAgICAgICAgICAgICAgICAgICBzYXJfd2lkdGggPSBrRml4ZWRTQVJzW2FzcGVjdF9yYXRpb19pZGNdLndpZHRoOworICAgICAgICAgICAgICAgICAgICBzYXJfaGVpZ2h0ID0ga0ZpeGVkU0FSc1thc3BlY3RfcmF0aW9faWRjXS5oZWlnaHQ7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAKaW5kZXggNDk1YmFkMC4uNTIwZWNiNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAKQEAgLTc1LDcgKzc1LDcgQEAKIAogU29mdEFBQzI6On5Tb2Z0QUFDMigpIHsKICAgICBhYWNEZWNvZGVyX0Nsb3NlKG1BQUNEZWNvZGVyKTsKLSAgICBkZWxldGUgbU91dHB1dERlbGF5UmluZ0J1ZmZlcjsKKyAgICBkZWxldGVbXSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyOwogfQogCiB2b2lkIFNvZnRBQUMyOjppbml0UG9ydHMoKSB7CkBAIC0yMDksNiArMjA5LDEwIEBACiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgKmFhY1BhcmFtcyA9CiAgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSAqKXBhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oYWFjUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChhYWNQYXJhbXMtPm5Qb3J0SW5kZXggIT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CkBAIC0yNDQsNiArMjQ4LDEwIEBACiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CiAgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqKXBhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0ocGNtUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPm5Qb3J0SW5kZXggIT0gMSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CkBAIC0yODQsNiArMjkyLDEwIEBACiAgICAgICAgICAgICBjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnJvbGVQYXJhbXMgPQogICAgICAgICAgICAgICAgIChjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKHJvbGVQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHN0cm5jbXAoKGNvbnN0IGNoYXIgKilyb2xlUGFyYW1zLT5jUm9sZSwKICAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLmFhYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSAtIDEpKSB7CkBAIC0yOTgsNiArMzEwLDEwIEBACiAgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgKmFhY1BhcmFtcyA9CiAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSAqKXBhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oYWFjUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChhYWNQYXJhbXMtPm5Qb3J0SW5kZXggIT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CkBAIC0zMTgsNiArMzM0LDExIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9BTkRST0lEX0FBQ1BSRVNFTlRBVElPTlRZUEUgKmFhY1ByZXNQYXJhbXMgPQogICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX0FORFJPSURfQUFDUFJFU0VOVEFUSU9OVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oYWFjUHJlc1BhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvLyBmb3IgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIG9mIHRoZSBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgc3RydWN0dXJlLAogICAgICAgICAgICAgLy8gYSB2YWx1ZSBvZiAtMSBpbXBsaWVzIHRoZSBwYXJhbWV0ZXIgaXMgbm90IHNldCBieSB0aGUgYXBwbGljYXRpb246CiAgICAgICAgICAgICAvLyAgIG5NYXhPdXRwdXRDaGFubmVscyAgICAgdXNlcyBkZWZhdWx0IHBsYXRmb3JtIHByb3BlcnRpZXMsIHNlZSBjb25maWd1cmVEb3dubWl4KCkKQEAgLTM4NCw2ICs0MDUsMTAgQEAKICAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KICAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShwY21QYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KQEAgLTYyMyw3ICs2NDgsNyBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY3VycmVudFRpbWUgPSBtQnVmZmVyVGltZXN0YW1wcy50b3AoKTsKICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRpbWUgKz0gbVN0cmVhbUluZm8tPmFhY1NhbXBsZXNQZXJGcmFtZSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMGxsIC8gbVN0cmVhbUluZm8tPnNhbXBsZVJhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMGxsIC8gbVN0cmVhbUluZm8tPmFhY1NhbXBsZVJhdGU7CiAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJUaW1lc3RhbXBzLmFkZChjdXJyZW50VGltZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTg3NCw3ICs4OTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRqdXN0L2ludGVycG9sYXRlIG5leHQgdGltZSBzdGFtcAogICAgICAgICAgICAgICAgICAgICAgICAgKmN1cnJlbnRCdWZMZWZ0IC09IGRlY29kZWRTaXplOwogICAgICAgICAgICAgICAgICAgICAgICAgKm5leHRUaW1lU3RhbXAgKz0gbVN0cmVhbUluZm8tPmFhY1NhbXBsZXNQZXJGcmFtZSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDBsbCAvIG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwbGwgLyBtU3RyZWFtSW5mby0+YWFjU2FtcGxlUmF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJhZGp1c3RlZCBuZXh0VGltZVN0YW1wL3NpemUgdG8gJWxsZC8lZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpICpuZXh0VGltZVN0YW1wLCAqY3VycmVudEJ1ZkxlZnQpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtOTc1LDYgKzEwMDAsNyBAQAogICAgICAgICBtQnVmZmVyU2l6ZXMuY2xlYXIoKTsKICAgICAgICAgbURlY29kZWRTaXplcy5jbGVhcigpOwogICAgICAgICBtTGFzdEluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgbUVuZE9mSW5wdXQgPSBmYWxzZTsKICAgICB9IGVsc2UgewogICAgICAgICBpbnQgYXZhaWw7CiAgICAgICAgIHdoaWxlICgoYXZhaWwgPSBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkpID4gMCkgewpAQCAtOTg5LDYgKzEwMTUsNyBAQAogICAgICAgICAgICAgbU91dHB1dEJ1ZmZlckNvdW50Kys7CiAgICAgICAgIH0KICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3M7CisgICAgICAgIG1FbmRPZk91dHB1dCA9IGZhbHNlOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyLmNwcAppbmRleCBjNjcyNGMyLi5hYjBhMjI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyLmNwcApAQCAtMTU0LDYgKzE1NCwxMCBAQAogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQogICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CkBAIC0xNzQsNiArMTc4LDEwIEBACiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgKmFhY1BhcmFtcyA9CiAgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSAqKXBhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oYWFjUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChhYWNQYXJhbXMtPm5Qb3J0SW5kZXggIT0gMSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CkBAIC0xOTgsNiArMjA2LDEwIEBACiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CiAgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqKXBhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0ocGNtUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPm5Qb3J0SW5kZXggIT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CkBAIC0yMjksNiArMjQxLDEwIEBACiAgICAgICAgICAgICBjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnJvbGVQYXJhbXMgPQogICAgICAgICAgICAgICAgIChjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKHJvbGVQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHN0cm5jbXAoKGNvbnN0IGNoYXIgKilyb2xlUGFyYW1zLT5jUm9sZSwKICAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpb19lbmNvZGVyLmFhYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSAtIDEpKSB7CkBAIC0yNDMsNiArMjU5LDEwIEBACiAgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CiAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KQEAgLTI2Niw2ICsyODYsMTAgQEAKICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSAqYWFjUGFyYW1zID0KICAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShhYWNQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGFhY1BhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KQEAgLTI4Niw2ICszMTAsMTAgQEAKICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KICAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShwY21QYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmNwcAppbmRleCAzNWFhODgzLi5lOGRhYmVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyMi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2RlcjIuY3BwCkBAIC0xMjMsNiArMTIzLDEwIEBACiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CiAgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KQEAgLTE0Myw2ICsxNDcsMTAgQEAKICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSAqYWFjUGFyYW1zID0KICAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShhYWNQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGFhY1BhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KQEAgLTIwMiw2ICsyMTAsMTAgQEAKICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KICAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShwY21QYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KQEAgLTIzMyw2ICsyNDUsMTAgQEAKICAgICAgICAgICAgIGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcm9sZVBhcmFtcyA9CiAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqKXBhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0ocm9sZVBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoc3RybmNtcCgoY29uc3QgY2hhciAqKXJvbGVQYXJhbXMtPmNSb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvX2VuY29kZXIuYWFjIiwKICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFIC0gMSkpIHsKQEAgLTI0Nyw2ICsyNjMsMTAgQEAKICAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KICAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQpAQCAtMjcwLDYgKzI5MCwxMCBAQAogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFICphYWNQYXJhbXMgPQogICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGFhY1BhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoYWFjUGFyYW1zLT5uUG9ydEluZGV4ICE9IDEpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQpAQCAtMzEwLDYgKzMzNCwxMCBAQAogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQogICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKHBjbVBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uUG9ydEluZGV4ICE9IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAKaW5kZXggZjM1YzUxZi4uZWRmNjQ4ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuY3BwCkBAIC0xNDgsNiArMTQ4LDEwIEBACiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQU1SVFlQRSAqYW1yUGFyYW1zID0KICAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX0FNUlRZUEUgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGFtclBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoYW1yUGFyYW1zLT5uUG9ydEluZGV4ICE9IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQpAQCAtMTc0LDYgKzE3OCwxMCBAQAogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQogICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKHBjbVBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uUG9ydEluZGV4ICE9IDEpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQpAQCAtMjA3LDYgKzIxNSwxMCBAQAogICAgICAgICAgICAgY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpyb2xlUGFyYW1zID0KICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShyb2xlUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX05BUlJPVykgewogICAgICAgICAgICAgICAgIGlmIChzdHJuY21wKChjb25zdCBjaGFyICopcm9sZVBhcmFtcy0+Y1JvbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuYW1ybmIiLApAQCAtMjI5LDYgKzI0MSwxMCBAQAogICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX0FNUlRZUEUgKmFhY1BhcmFtcyA9CiAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9BTVJUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShhYWNQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGFhY1BhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KQEAgLTI0MSw2ICsyNTcsMTAgQEAKICAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KICAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShwY21QYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KQEAgLTQ2OSw3ICs0ODksMTUgQEAKICAgICB9CiB9CiAKLXZvaWQgU29mdEFNUjo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKK3ZvaWQgU29mdEFNUjo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICBBTE9HVigib25Qb3J0Rmx1c2hDb21wbGV0ZWQgcG9ydGluZGV4ICVkLCByZXNldHRpbmcgZnJhbWUgIiwgcG9ydEluZGV4KTsKKyAgICBpZiAocG9ydEluZGV4ID09IDApIHsKKyAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfTkFSUk9XKSB7CisgICAgICAgICAgIFNwZWVjaF9EZWNvZGVfRnJhbWVfcmVzZXQobVN0YXRlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgcHZEZWNvZGVyX0FtcldiX1Jlc2V0KG1TdGF0ZSwgMCAvKiByZXNldF9hbGwgKi8pOworICAgICAgICB9CisgICAgfQogfQogCiB2b2lkIFNvZnRBTVI6Om9uUG9ydEVuYWJsZUNvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBlbmFibGVkKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL1NvZnRBTVJOQkVuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9Tb2Z0QU1STkJFbmNvZGVyLmNwcAppbmRleCA5NDg5NDU3Li5hYWE2NzMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL1NvZnRBTVJOQkVuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvU29mdEFNUk5CRW5jb2Rlci5jcHAKQEAgLTEyMCw2ICsxMjAsMTAgQEAKICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KICAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQpAQCAtMTQwLDYgKzE0NCwxMCBAQAogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FNUlRZUEUgKmFtclBhcmFtcyA9CiAgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9BTVJUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShhbXJQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGFtclBhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KQEAgLTE1OCw2ICsxNjYsMTAgQEAKICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KICAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShwY21QYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KQEAgLTE4OCw2ICsyMDAsMTAgQEAKICAgICAgICAgICAgIGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcm9sZVBhcmFtcyA9CiAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqKXBhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0ocm9sZVBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoc3RybmNtcCgoY29uc3QgY2hhciAqKXJvbGVQYXJhbXMtPmNSb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvX2VuY29kZXIuYW1ybmIiLAogICAgICAgICAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUgLSAxKSkgewpAQCAtMjAyLDYgKzIxOCwxMCBAQAogICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQogICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CkBAIC0yMjUsNiArMjQ1LDEwIEBACiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQU1SVFlQRSAqYW1yUGFyYW1zID0KICAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX0FNUlRZUEUgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGFtclBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoYW1yUGFyYW1zLT5uUG9ydEluZGV4ICE9IDEpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQpAQCAtMjUyLDYgKzI3NiwxMCBAQAogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQogICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKHBjbVBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uUG9ydEluZGV4ICE9IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NvZnRBTVJXQkVuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NvZnRBTVJXQkVuY29kZXIuY3BwCmluZGV4IDkxYTUxMmQuLjlkNTBjNGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9Tb2Z0QU1SV0JFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU29mdEFNUldCRW5jb2Rlci5jcHAKQEAgLTE1NSw2ICsxNTUsMTAgQEAKICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KICAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQpAQCAtMTc1LDYgKzE3OSwxMCBAQAogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FNUlRZUEUgKmFtclBhcmFtcyA9CiAgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9BTVJUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShhbXJQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGFtclBhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KQEAgLTE5Niw2ICsyMDQsMTAgQEAKICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KICAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShwY21QYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KQEAgLTIyNiw2ICsyMzgsMTAgQEAKICAgICAgICAgICAgIGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcm9sZVBhcmFtcyA9CiAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqKXBhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0ocm9sZVBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoc3RybmNtcCgoY29uc3QgY2hhciAqKXJvbGVQYXJhbXMtPmNSb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvX2VuY29kZXIuYW1yd2IiLAogICAgICAgICAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUgLSAxKSkgewpAQCAtMjQwLDYgKzI1NiwxMCBAQAogICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQogICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CkBAIC0yNjMsNiArMjgzLDEwIEBACiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQU1SVFlQRSAqYW1yUGFyYW1zID0KICAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX0FNUlRZUEUgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGFtclBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoYW1yUGFyYW1zLT5uUG9ydEluZGV4ICE9IDEpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQpAQCAtMjk5LDYgKzMyMywxMCBAQAogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQogICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKHBjbVBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uUG9ydEluZGV4ICE9IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvU29mdEFWQ0VuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvU29mdEFWQ0VuY29kZXIuY3BwCmluZGV4IGZhNmVjNDAuLmNjZTZkMTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL1NvZnRBVkNFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9Tb2Z0QVZDRW5jb2Rlci5jcHAKQEAgLTM3MCw2ICszNzAsMTAgQEAKICAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSAqYml0UmF0ZSA9CiAgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSAqKSBwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGJpdFJhdGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGJpdFJhdGUtPm5Qb3J0SW5kZXggIT0gMSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CkBAIC0zODQsNiArMzg4LDEwIEBACiAgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSAqYXZjUGFyYW1zID0KICAgICAgICAgICAgICAgICAoT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEUgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGF2Y1BhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoYXZjUGFyYW1zLT5uUG9ydEluZGV4ICE9IDEpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQpAQCAtNDI3LDYgKzQzNSwxMCBAQAogICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFICpiaXRSYXRlID0KICAgICAgICAgICAgICAgICAoT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFICopIHBhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oYml0UmF0ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoYml0UmF0ZS0+blBvcnRJbmRleCAhPSAxIHx8CiAgICAgICAgICAgICAgICAgYml0UmF0ZS0+ZUNvbnRyb2xSYXRlICE9IE9NWF9WaWRlb19Db250cm9sUmF0ZVZhcmlhYmxlKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKQEAgLTQ0MSw2ICs0NTMsMTAgQEAKICAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9BVkNUWVBFICphdmNUeXBlID0KICAgICAgICAgICAgICAgICAoT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEUgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGF2Y1R5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGF2Y1R5cGUtPm5Qb3J0SW5kZXggIT0gMSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmNwcAppbmRleCA4Mzg4NDcyLi4zYzFlMWE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5jcHAKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlICJpaDI2NF90eXBlZGVmcy5oIgogI2luY2x1ZGUgIml2LmgiCiAjaW5jbHVkZSAiaXZkLmgiCi0jaW5jbHVkZSAiaXRocmVhZC5oIgogI2luY2x1ZGUgImloMjY0ZC5oIgogI2luY2x1ZGUgIlNvZnRBVkNEZWMuaCIKIApAQCAtMTE1LDEzICsxMTQsMTYgQEAKICAgICAgICAgICAgIGtQcm9maWxlTGV2ZWxzLCBBUlJBWV9TSVpFKGtQcm9maWxlTGV2ZWxzKSwKICAgICAgICAgICAgIDMyMCAvKiB3aWR0aCAqLywgMjQwIC8qIGhlaWdodCAqLywgY2FsbGJhY2tzLAogICAgICAgICAgICAgYXBwRGF0YSwgY29tcG9uZW50KSwKKyAgICAgIG1Db2RlY0N0eChOVUxMKSwKICAgICAgIG1NZW1SZWNvcmRzKE5VTEwpLAogICAgICAgbUZsdXNoT3V0QnVmZmVyKE5VTEwpLAogICAgICAgbU9teENvbG9yRm9ybWF0KE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpLAogICAgICAgbUl2Q29sb3JGb3JtYXQoSVZfWVVWXzQyMFApLAogICAgICAgbU5ld1dpZHRoKG1XaWR0aCksCiAgICAgICBtTmV3SGVpZ2h0KG1IZWlnaHQpLAotICAgICAgbUNoYW5naW5nUmVzb2x1dGlvbihmYWxzZSkgeworICAgICAgbU5ld0xldmVsKDApLAorICAgICAgbUNoYW5naW5nUmVzb2x1dGlvbihmYWxzZSksCisgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpIHsKICAgICBpbml0UG9ydHMoCiAgICAgICAgICAgICBrTnVtQnVmZmVycywgSU5QVVRfQlVGX1NJWkUsIGtOdW1CdWZmZXJzLCBDT0RFQ19NSU1FX1RZUEUpOwogCkBAIC0xMzEsNyArMTMzLDcgQEAKICAgICBHRU5FUkFURV9GSUxFX05BTUVTKCk7CiAgICAgQ1JFQVRFX0RVTVBfRklMRShtSW5GaWxlKTsKIAotICAgIENIRUNLX0VRKGluaXREZWNvZGVyKCksIChzdGF0dXNfdClPSyk7CisgICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIobVdpZHRoLCBtSGVpZ2h0KSwgKHN0YXR1c190KU9LKTsKIH0KIAogU29mdEFWQzo6flNvZnRBVkMoKSB7CkBAIC0xOTEsNyArMTkzLDcgQEAKICAgICBzX2N0bF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90KTsKICAgICBzX2N0bF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90KTsKIAotICAgIEFMT0dWKCJTZXQgdGhlIHJ1bi10aW1lIChkeW5hbWljKSBwYXJhbWV0ZXJzIHN0cmlkZSA9ICV1Iiwgc3RyaWRlKTsKKyAgICBBTE9HVigiU2V0IHRoZSBydW4tdGltZSAoZHluYW1pYykgcGFyYW1ldGVycyBzdHJpZGUgPSAlenUiLCBzdHJpZGUpOwogICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfY3RsX2lwLCAodm9pZCAqKSZzX2N0bF9vcCk7CiAKICAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKQEAgLTIzMSw2ICsyMzMsNyBAQAogICAgICAgICBBTE9HRSgiRXJyb3IgaW4gcmVzZXQ6IDB4JXgiLCBzX2N0bF9vcC51NF9lcnJvcl9jb2RlKTsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQorICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOwogCiAgICAgLyogU2V0IHRoZSBydW4tdGltZSAoZHluYW1pYykgcGFyYW1ldGVycyAqLwogICAgIHNldFBhcmFtcyhvdXRwdXRCdWZmZXJXaWR0aCgpKTsKQEAgLTI4NCw3ICsyODcsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgU29mdEFWQzo6aW5pdERlY29kZXIoKSB7CitzdGF0dXNfdCBTb2Z0QVZDOjppbml0RGVjb2Rlcih1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CiAgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOwogCiAgICAgVVdPUkQzMiB1NF9udW1fcmVvcmRlcl9mcmFtZXM7CkBAIC0yOTMsMjggKzI5NiwzMyBAQAogICAgIFdPUkQzMiBpNF9sZXZlbDsKIAogICAgIG1OdW1Db3JlcyA9IEdldENQVUNvcmVDb3VudCgpOworICAgIG1Db2RlY0N0eCA9IE5VTEw7CiAKICAgICAvKiBJbml0aWFsaXplIG51bWJlciBvZiByZWYgYW5kIHJlb3JkZXIgbW9kZXMgKGZvciBIMjY0KSAqLwogICAgIHU0X251bV9yZW9yZGVyX2ZyYW1lcyA9IDE2OwogICAgIHU0X251bV9yZWZfZnJhbWVzID0gMTY7CiAgICAgdTRfc2hhcmVfZGlzcF9idWYgPSAwOwogCi0gICAgdWludDMyX3QgZGlzcGxheVN0cmlkZSA9IG91dHB1dEJ1ZmZlcldpZHRoKCk7Ci0gICAgdWludDMyX3QgZGlzcGxheUhlaWdodCA9IG91dHB1dEJ1ZmZlckhlaWdodCgpOworICAgIHVpbnQzMl90IGRpc3BsYXlTdHJpZGUgPSBtSXNBZGFwdGl2ZSA/IG1BZGFwdGl2ZU1heFdpZHRoIDogd2lkdGg7CisgICAgdWludDMyX3QgZGlzcGxheUhlaWdodCA9IG1Jc0FkYXB0aXZlID8gbUFkYXB0aXZlTWF4SGVpZ2h0IDogaGVpZ2h0OwogICAgIHVpbnQzMl90IGRpc3BsYXlTaXplWSA9IGRpc3BsYXlTdHJpZGUgKiBkaXNwbGF5SGVpZ2h0OwogCi0gICAgaWYgKGRpc3BsYXlTaXplWSA+ICgxOTIwICogMTA4OCkpIHsKLSAgICAgICAgaTRfbGV2ZWwgPSA1MDsKLSAgICB9IGVsc2UgaWYgKGRpc3BsYXlTaXplWSA+ICgxMjgwICogNzIwKSkgewotICAgICAgICBpNF9sZXZlbCA9IDQwOwotICAgIH0gZWxzZSBpZiAoZGlzcGxheVNpemVZID4gKDcyMCAqIDU3NikpIHsKLSAgICAgICAgaTRfbGV2ZWwgPSAzMTsKLSAgICB9IGVsc2UgaWYgKGRpc3BsYXlTaXplWSA+ICg2MjQgKiAzMjApKSB7Ci0gICAgICAgIGk0X2xldmVsID0gMzA7Ci0gICAgfSBlbHNlIGlmIChkaXNwbGF5U2l6ZVkgPiAoMzUyICogMjg4KSkgewotICAgICAgICBpNF9sZXZlbCA9IDIxOworICAgIGlmKG1OZXdMZXZlbCA9PSAwKXsKKyAgICAgICAgaWYgKGRpc3BsYXlTaXplWSA+ICgxOTIwICogMTA4OCkpIHsKKyAgICAgICAgICAgIGk0X2xldmVsID0gNTA7CisgICAgICAgIH0gZWxzZSBpZiAoZGlzcGxheVNpemVZID4gKDEyODAgKiA3MjApKSB7CisgICAgICAgICAgICBpNF9sZXZlbCA9IDQwOworICAgICAgICB9IGVsc2UgaWYgKGRpc3BsYXlTaXplWSA+ICg3MjAgKiA1NzYpKSB7CisgICAgICAgICAgICBpNF9sZXZlbCA9IDMxOworICAgICAgICB9IGVsc2UgaWYgKGRpc3BsYXlTaXplWSA+ICg2MjQgKiAzMjApKSB7CisgICAgICAgICAgICBpNF9sZXZlbCA9IDMwOworICAgICAgICB9IGVsc2UgaWYgKGRpc3BsYXlTaXplWSA+ICgzNTIgKiAyODgpKSB7CisgICAgICAgICAgICBpNF9sZXZlbCA9IDIxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaTRfbGV2ZWwgPSAyMDsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGk0X2xldmVsID0gMjA7CisgICAgICAgIGk0X2xldmVsID0gbU5ld0xldmVsOwogICAgIH0KIAogICAgIHsKQEAgLTQzMCw2ICs0MzgsNyBAQAogCiAgICAgICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfaW5pdF9pcCwgKHZvaWQgKikmc19pbml0X29wKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgICAgICBtQ29kZWNDdHggPSBOVUxMOwogICAgICAgICAgICAgQUxPR0UoIkVycm9yIGluIGluaXQ6IDB4JXgiLAogICAgICAgICAgICAgICAgICAgICBzX2luaXRfb3Auc19pdmRfaW5pdF9vcF90LnU0X2Vycm9yX2NvZGUpOwogICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CkBAIC00NTIsNyArNDYxLDcgQEAKICAgICB1aW50MzJfdCBidWZmZXJTaXplID0gZGlzcGxheVNpemVZICogMyAvIDI7CiAgICAgbUZsdXNoT3V0QnVmZmVyID0gKHVpbnQ4X3QgKilpdmRfYWxpZ25lZF9tYWxsb2MoMTI4LCBidWZmZXJTaXplKTsKICAgICBpZiAoTlVMTCA9PSBtRmx1c2hPdXRCdWZmZXIpIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBhbGxvY2F0ZSBmbHVzaE91dHB1dEJ1ZmZlciBvZiBzaXplICV6dSIsIGJ1ZmZlclNpemUpOworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGFsbG9jYXRlIGZsdXNoT3V0cHV0QnVmZmVyIG9mIHNpemUgJXUiLCBidWZmZXJTaXplKTsKICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICB9CiAKQEAgLTQ4OSwxMiArNDk4LDEyIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBTb2Z0QVZDOjpyZUluaXREZWNvZGVyKCkgeworc3RhdHVzX3QgU29mdEFWQzo6cmVJbml0RGVjb2Rlcih1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CiAgICAgc3RhdHVzX3QgcmV0OwogCiAgICAgZGVJbml0RGVjb2RlcigpOwogCi0gICAgcmV0ID0gaW5pdERlY29kZXIoKTsKKyAgICByZXQgPSBpbml0RGVjb2Rlcih3aWR0aCwgaGVpZ2h0KTsKICAgICBpZiAoT0sgIT0gcmV0KSB7CiAgICAgICAgIEFMT0dFKCJDcmVhdGUgZmFpbHVyZSIpOwogICAgICAgICBkZUluaXREZWNvZGVyKCk7CkBAIC01MDYsNiArNTE1LDcgQEAKIHZvaWQgU29mdEFWQzo6b25SZXNldCgpIHsKICAgICBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpvblJlc2V0KCk7CiAKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKICAgICByZXNldERlY29kZXIoKTsKICAgICByZXNldFBsdWdpbigpOwogfQpAQCAtNTE1LDEyICs1MjUsMTkgQEAKICAgICBjb25zdCB1aW50MzJfdCBvbGRIZWlnaHQgPSBtSGVpZ2h0OwogICAgIE9NWF9FUlJPUlRZUEUgcmV0ID0gU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CiAgICAgaWYgKG1XaWR0aCAhPSBvbGRXaWR0aCB8fCBtSGVpZ2h0ICE9IG9sZEhlaWdodCkgewotICAgICAgICByZUluaXREZWNvZGVyKCk7CisgICAgICAgIG1OZXdXaWR0aCA9IG1XaWR0aDsKKyAgICAgICAgbU5ld0hlaWdodCA9IG1IZWlnaHQ7CisgICAgICAgIHN0YXR1c190IGVyciA9IHJlSW5pdERlY29kZXIobU5ld1dpZHRoLCBtTmV3SGVpZ2h0KTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmcsIGVyciwgTlVMTCk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKKyAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gcmV0OwogfQogCi12b2lkIFNvZnRBVkM6OnNldERlY29kZUFyZ3MoCitib29sIFNvZnRBVkM6OnNldERlY29kZUFyZ3MoCiAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjX2lwLAogICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY19vcCwKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyLApAQCAtNTI4LDcgKzU0NSw2IEBACiAgICAgICAgIHNpemVfdCB0aW1lU3RhbXBJeCkgewogICAgIHNpemVfdCBzaXplWSA9IG91dHB1dEJ1ZmZlcldpZHRoKCkgKiBvdXRwdXRCdWZmZXJIZWlnaHQoKTsKICAgICBzaXplX3Qgc2l6ZVVWOwotICAgIHVpbnQ4X3QgKnBCdWY7CiAKICAgICBwc19kZWNfaXAtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9pcF90KTsKICAgICBwc19kZWNfb3AtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9vcF90KTsKQEAgLTU0OCwyMiArNTY0LDI4IEBACiAgICAgICAgIHBzX2RlY19pcC0+dTRfbnVtX0J5dGVzID0gMDsKICAgICB9CiAKLSAgICBpZiAob3V0SGVhZGVyKSB7Ci0gICAgICAgIHBCdWYgPSBvdXRIZWFkZXItPnBCdWZmZXI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcEJ1ZiA9IG1GbHVzaE91dEJ1ZmZlcjsKLSAgICB9Ci0KICAgICBzaXplVVYgPSBzaXplWSAvIDQ7CiAgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVswXSA9IHNpemVZOwogICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMV0gPSBzaXplVVY7CiAgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsyXSA9IHNpemVVVjsKIAorICAgIHVpbnQ4X3QgKnBCdWY7CisgICAgaWYgKG91dEhlYWRlcikgeworICAgICAgICBpZiAob3V0SGVhZGVyLT5uQWxsb2NMZW4gPCBzaXplWSArIChzaXplVVYgKiAyKSkgeworICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzgzMzYxNiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHBCdWYgPSBvdXRIZWFkZXItPnBCdWZmZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbUZsdXNoT3V0QnVmZmVyIGFsd2F5cyBoYXMgdGhlIHJpZ2h0IHNpemUuCisgICAgICAgIHBCdWYgPSBtRmx1c2hPdXRCdWZmZXI7CisgICAgfQorCiAgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMF0gPSBwQnVmOwogICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzFdID0gcEJ1ZiArIHNpemVZOwogICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzJdID0gcEJ1ZiArIHNpemVZICsgc2l6ZVVWOwogICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnU0X251bV9idWZzID0gMzsKLSAgICByZXR1cm47CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIFNvZnRBVkM6Om9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7CiAgICAgLyogT25jZSB0aGUgb3V0cHV0IGJ1ZmZlcnMgYXJlIGZsdXNoZWQsIGlnbm9yZSBhbnkgYnVmZmVycyB0aGF0IGFyZSBoZWxkIGluIGRlY29kZXIgKi8KQEAgLTU5MCw2ICs2MTIsOSBAQAogdm9pZCBTb2Z0QVZDOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7CiAgICAgVU5VU0VEKHBvcnRJbmRleCk7CiAKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgaWYgKG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgIT0gTk9ORSkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNjIyLDYgKzY0NywxMSBAQAogICAgICAgICAgICAgaWYgKCFpblF1ZXVlLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBpbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOwogICAgICAgICAgICAgICAgIGluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOworICAgICAgICAgICAgICAgIGlmIChpbkhlYWRlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC02MzMsMTQgKzY2MywyMSBAQAogICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSAwOwogICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOwogCi0gICAgICAgIGlmIChpbkhlYWRlciAhPSBOVUxMICYmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSkgewotICAgICAgICAgICAgbVJlY2VpdmVkRU9TID0gdHJ1ZTsKKyAgICAgICAgaWYgKGluSGVhZGVyICE9IE5VTEwpIHsKICAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7CiAgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwogICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisKKyAgICAgICAgICAgICAgICBpZiAoIShpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtUmVjZWl2ZWRFT1MgPSB0cnVlOwogICAgICAgICAgICAgICAgIGluSGVhZGVyID0gTlVMTDsKICAgICAgICAgICAgICAgICBzZXRGbHVzaE1vZGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgICAgIG1SZWNlaXZlZEVPUyA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNjQ4LDkgKzY4NSwxNSBAQAogICAgICAgICAvLyB1cGRhdGUgb3V0cHV0IHBvcnQncyBkZWZpbml0aW9uIGFuZCByZWluaXRpYWxpemUgZGVjb2Rlci4KICAgICAgICAgaWYgKG1Jbml0TmVlZGVkICYmICFtSXNJbkZsdXNoKSB7CiAgICAgICAgICAgICBib29sIHBvcnRXaWxsUmVzZXQgPSBmYWxzZTsKLSAgICAgICAgICAgIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgmcG9ydFdpbGxSZXNldCwgbU5ld1dpZHRoLCBtTmV3SGVpZ2h0KTsKIAotICAgICAgICAgICAgQ0hFQ0tfRVEocmVJbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVJbml0RGVjb2RlcihtTmV3V2lkdGgsIG1OZXdIZWlnaHQpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nLCBlcnIsIE5VTEwpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoJnBvcnRXaWxsUmVzZXQsIG1OZXdXaWR0aCwgbU5ld0hlaWdodCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNjc2LDcgKzcxOSwxMiBAQAogICAgICAgICAgICAgV09SRDMyIHRpbWVEZWxheSwgdGltZVRha2VuOwogICAgICAgICAgICAgc2l6ZV90IHNpemVZLCBzaXplVVY7CiAKLSAgICAgICAgICAgIHNldERlY29kZUFyZ3MoJnNfZGVjX2lwLCAmc19kZWNfb3AsIGluSGVhZGVyLCBvdXRIZWFkZXIsIHRpbWVTdGFtcEl4KTsKKyAgICAgICAgICAgIGlmICghc2V0RGVjb2RlQXJncygmc19kZWNfaXAsICZzX2RlY19vcCwgaW5IZWFkZXIsIG91dEhlYWRlciwgdGltZVN0YW1wSXgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkRlY29kZXIgYXJnIHNldHVwIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIElmIGlucHV0IGR1bXAgaXMgZW5hYmxlZCwgdGhlbiB3cml0ZSB0byBmaWxlCiAgICAgICAgICAgICBEVU1QX1RPX0ZJTEUobUluRmlsZSwgc19kZWNfaXAucHZfc3RyZWFtX2J1ZmZlciwgc19kZWNfaXAudTRfbnVtX0J5dGVzKTsKIApAQCAtNjkxLDYgKzczOSw3IEBACiAgICAgICAgICAgICBib29sIHVuc3VwcG9ydGVkRGltZW5zaW9ucyA9CiAgICAgICAgICAgICAgICAgKElWRF9TVFJFQU1fV0lEVEhfSEVJR0hUX05PVF9TVVBQT1JURUQgPT0gKHNfZGVjX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSk7CiAgICAgICAgICAgICBib29sIHJlc0NoYW5nZWQgPSAoSVZEX1JFU19DSEFOR0VEID09IChzX2RlY19vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpOworICAgICAgICAgICAgYm9vbCB1bnN1cHBvcnRlZExldmVsID0gKElIMjY0RF9VTlNVUFBPUlRFRF9MRVZFTCA9PSAoc19kZWNfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKTsKIAogICAgICAgICAgICAgR0VUVElNRSgmbVRpbWVFbmQsIE5VTEwpOwogICAgICAgICAgICAgLyogQ29tcHV0ZSB0aW1lIHRha2VuIGZvciBkZWNvZGUoKSAqLwpAQCAtNzA4LDEzICs3NTcsMzkgQEAKICAgICAgICAgICAgICAgICBtVGltZVN0YW1wc1ZhbGlkW3RpbWVTdGFtcEl4XSA9IGZhbHNlOwogICAgICAgICAgICAgfQogCisKICAgICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIGhhbmRsZSBDVFMgRGVjb2RlclRlc3QgdGVzdENvZGVjUmVzZXRzSDI2NFdpdGhvdXRTdXJmYWNlLAogICAgICAgICAgICAgLy8gd2hpY2ggaXMgbm90IHNlbmRpbmcgU1BTL1BQUyBhZnRlciBwb3J0IHJlY29uZmlndXJhdGlvbiBhbmQgZmx1c2ggdG8gdGhlIGNvZGVjLgogICAgICAgICAgICAgaWYgKHVuc3VwcG9ydGVkRGltZW5zaW9ucyAmJiAhbUZsdXNoTmVlZGVkKSB7CiAgICAgICAgICAgICAgICAgYm9vbCBwb3J0V2lsbFJlc2V0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKCZwb3J0V2lsbFJlc2V0LCBzX2RlY19vcC51NF9waWNfd2QsIHNfZGVjX29wLnU0X3BpY19odCk7CisgICAgICAgICAgICAgICAgbU5ld1dpZHRoID0gc19kZWNfb3AudTRfcGljX3dkOworICAgICAgICAgICAgICAgIG1OZXdIZWlnaHQgPSBzX2RlY19vcC51NF9waWNfaHQ7CiAKLSAgICAgICAgICAgICAgICBDSEVDS19FUShyZUluaXREZWNvZGVyKCksIChzdGF0dXNfdClPSyk7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVJbml0RGVjb2RlcihtTmV3V2lkdGgsIG1OZXdIZWlnaHQpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmcsIGVyciwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoJnBvcnRXaWxsUmVzZXQsIG1OZXdXaWR0aCwgbU5ld0hlaWdodCk7CisKKyAgICAgICAgICAgICAgICBzZXREZWNvZGVBcmdzKCZzX2RlY19pcCwgJnNfZGVjX29wLCBpbkhlYWRlciwgb3V0SGVhZGVyLCB0aW1lU3RhbXBJeCk7CisKKyAgICAgICAgICAgICAgICBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2RlY19pcCwgKHZvaWQgKikmc19kZWNfb3ApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHVuc3VwcG9ydGVkTGV2ZWwgJiYgIW1GbHVzaE5lZWRlZCkgeworCisgICAgICAgICAgICAgICAgbU5ld0xldmVsID0gNTE7CisKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSByZUluaXREZWNvZGVyKG1OZXdXaWR0aCwgbU5ld0hlaWdodCk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZywgZXJyLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIHNldERlY29kZUFyZ3MoJnNfZGVjX2lwLCAmc19kZWNfb3AsIGluSGVhZGVyLCBvdXRIZWFkZXIsIHRpbWVTdGFtcEl4KTsKIApAQCAtNzQ1LDYgKzgyMCwxNyBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAodW5zdXBwb3J0ZWRMZXZlbCkgeworCisgICAgICAgICAgICAgICAgaWYgKG1GbHVzaE5lZWRlZCkgeworICAgICAgICAgICAgICAgICAgICBzZXRGbHVzaE1vZGUoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtTmV3TGV2ZWwgPSA1MTsKKyAgICAgICAgICAgICAgICBtSW5pdE5lZWRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmICgoMCA8IHNfZGVjX29wLnU0X3BpY193ZCkgJiYgKDAgPCBzX2RlY19vcC51NF9waWNfaHQpKSB7CiAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGggPSBzX2RlY19vcC51NF9waWNfd2Q7CiAgICAgICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0ID0gc19kZWNfb3AudTRfcGljX2h0OwpAQCAtNzU4LDcgKzg0NCw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChzX2RlY19vcC51NF9vdXRwdXRfcHJlc2VudCkgewotICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IChtV2lkdGggKiBtSGVpZ2h0ICogMykgLyAyOworICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IChvdXRwdXRCdWZmZXJXaWR0aCgpICogb3V0cHV0QnVmZmVySGVpZ2h0KCkgKiAzKSAvIDI7CiAKICAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBtVGltZVN0YW1wc1tzX2RlY19vcC51NF90c107CiAgICAgICAgICAgICAgICAgbVRpbWVTdGFtcHNWYWxpZFtzX2RlY19vcC51NF90c10gPSBmYWxzZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmgKaW5kZXggMTkxYTcxZC4uZThjNmFiMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmgKQEAgLTEwMCwxMiArMTAwLDE0IEBACiAgICAgYm9vbCBtSW5pdE5lZWRlZDsKICAgICB1aW50MzJfdCBtTmV3V2lkdGg7CiAgICAgdWludDMyX3QgbU5ld0hlaWdodDsKKyAgICB1aW50MzJfdCBtTmV3TGV2ZWw7CiAgICAgLy8gVGhlIGlucHV0IHN0cmVhbSBoYXMgY2hhbmdlZCB0byBhIGRpZmZlcmVudCByZXNvbHV0aW9uLCB3aGljaCBpcyBzdGlsbCBzdXBwb3J0ZWQgYnkgdGhlCiAgICAgLy8gY29kZWMuIFNvIHRoZSBjb2RlYyBpcyBzd2l0Y2hpbmcgdG8gZGVjb2RlIHRoZSBuZXcgcmVzb2x1dGlvbi4KICAgICBib29sIG1DaGFuZ2luZ1Jlc29sdXRpb247CiAgICAgYm9vbCBtRmx1c2hOZWVkZWQ7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CiAKLSAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIHN0YXR1c190IGluaXREZWNvZGVyKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOwogICAgIHN0YXR1c190IGRlSW5pdERlY29kZXIoKTsKICAgICBzdGF0dXNfdCBzZXRGbHVzaE1vZGUoKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSk7CkBAIC0xMTMsOSArMTE1LDkgQEAKICAgICBzdGF0dXNfdCBzZXROdW1Db3JlcygpOwogICAgIHN0YXR1c190IHJlc2V0RGVjb2RlcigpOwogICAgIHN0YXR1c190IHJlc2V0UGx1Z2luKCk7Ci0gICAgc3RhdHVzX3QgcmVJbml0RGVjb2RlcigpOworICAgIHN0YXR1c190IHJlSW5pdERlY29kZXIodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCk7CiAKLSAgICB2b2lkIHNldERlY29kZUFyZ3MoCisgICAgYm9vbCBzZXREZWNvZGVBcmdzKAogICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNfaXAsCiAgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY19vcCwKICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwCmluZGV4IGJmNWUzNTMuLmIzZjUyMDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcApAQCAtNDksMTAgKzQ5LDEwIEBACiAgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5TdGVwID0gMDsKIH0KIAotdHlwZWRlZiBzdHJ1Y3QgTGV2ZWxDb252ZXJzaW9uIHsKK3N0cnVjdCBMZXZlbENvbnZlcnNpb24gewogICAgIE9NWF9WSURFT19BVkNMRVZFTFRZUEUgb214TGV2ZWw7CiAgICAgV09SRDMyIGF2Y0xldmVsOwotfSBMZXZlbENvbmNlcnNpb247Cit9OwogCiBzdGF0aWMgTGV2ZWxDb252ZXJzaW9uIENvbnZlcnNpb25UYWJsZVtdID0gewogICAgIHsgT01YX1ZJREVPX0FWQ0xldmVsMSwgIDEwIH0sCkBAIC04Nyw4ICs4NywyMSBAQAogICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMzIgfSwKICAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDQgIH0sCiAgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWw0MSB9LAotfTsKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMSAgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMWIgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMTEgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMTIgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMTMgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMiAgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMjEgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMjIgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMyAgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMzEgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMzIgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsNCAgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsNDEgfSwKIAorfTsKIAogc3RhdGljIHNpemVfdCBHZXRDUFVDb3JlQ291bnQoKSB7CiAgICAgbG9uZyBjcHVDb3JlQ291bnQgPSAxOwpAQCAtOTksNyArMTEyLDcgQEAKICAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ19PTkxOKTsKICNlbmRpZgogICAgIENIRUNLKGNwdUNvcmVDb3VudCA+PSAxKTsKLSAgICBBTE9HRCgiTnVtYmVyIG9mIENQVSBjb3JlczogJWxkIiwgY3B1Q29yZUNvdW50KTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIENQVSBjb3JlczogJWxkIiwgY3B1Q29yZUNvdW50KTsKICAgICByZXR1cm4gKHNpemVfdCljcHVDb3JlQ291bnQ7CiB9CiAKQEAgLTE0NCwxNSArMTU3LDE1IEBACiAgICAgICAgICAgICBrUHJvZmlsZUxldmVscywgTkVMRU0oa1Byb2ZpbGVMZXZlbHMpLAogICAgICAgICAgICAgMTc2IC8qIHdpZHRoICovLCAxNDQgLyogaGVpZ2h0ICovLAogICAgICAgICAgICAgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAorICAgICAgbUJpdHJhdGVVcGRhdGVkKGZhbHNlKSwKKyAgICAgIG1LZXlGcmFtZVJlcXVlc3RlZChmYWxzZSksCiAgICAgICBtSXZWaWRlb0NvbG9yRm9ybWF0KElWX1lVVl80MjBQKSwKLSAgICAgIG1JRFJGcmFtZVJlZnJlc2hJbnRlcnZhbEluU2VjKDEpLAogICAgICAgbUFWQ0VuY1Byb2ZpbGUoSVZfUFJPRklMRV9CQVNFKSwKLSAgICAgIG1BVkNFbmNMZXZlbCgzMSksCi0gICAgICBtUHJldlRpbWVzdGFtcFVzKC0xKSwKKyAgICAgIG1BVkNFbmNMZXZlbCg0MSksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCiAgICAgICBtU2F3SW5wdXRFT1MoZmFsc2UpLAorICAgICAgbVNhd091dHB1dEVPUyhmYWxzZSksCiAgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpLAotICAgICAgbUNvbnZlcnNpb25CdWZmZXIoTlVMTCksCiAgICAgICBtQ29kZWNDdHgoTlVMTCkgewogCiAgICAgaW5pdFBvcnRzKGtOdW1CdWZmZXJzLCBrTnVtQnVmZmVycywgKChtV2lkdGggKiBtSGVpZ2h0ICogMykgPj4gMSksCkBAIC0xNjIsNiArMTc1LDEwIEBACiAgICAgR0VORVJBVEVfRklMRV9OQU1FUygpOwogICAgIENSRUFURV9EVU1QX0ZJTEUobUluRmlsZSk7CiAgICAgQ1JFQVRFX0RVTVBfRklMRShtT3V0RmlsZSk7CisgICAgbWVtc2V0KG1Db252ZXJzaW9uQnVmZmVycywgMCwgc2l6ZW9mKG1Db252ZXJzaW9uQnVmZmVycykpOworICAgIG1lbXNldChtSW5wdXRCdWZmZXJJbmZvLCAwLCBzaXplb2YobUlucHV0QnVmZmVySW5mbykpOworCisgICAgaW5pdEVuY1BhcmFtcygpOwogCiB9CiAKQEAgLTE3Myw3ICsxOTAsNyBAQAogICAgIENIRUNLKGluUXVldWUuZW1wdHkoKSk7CiB9CiAKLU9NWF9FUlJPUlRZUEUgU29mdEFWQzo6aW5pdEVuY1BhcmFtcygpIHsKK3ZvaWQgIFNvZnRBVkM6OmluaXRFbmNQYXJhbXMoKSB7CiAgICAgbUNvZGVjQ3R4ID0gTlVMTDsKICAgICBtTWVtUmVjb3JkcyA9IE5VTEw7CiAgICAgbU51bU1lbVJlY29yZHMgPSBERUZBVUxUX01FTV9SRUNfQ05UOwpAQCAtMTg2LDcgKzIwMyw2IEBACiAgICAgbUlJbnRlcnZhbCA9IERFRkFVTFRfSV9JTlRFUlZBTDsKICAgICBtSURSSW50ZXJ2YWwgPSBERUZBVUxUX0lEUl9JTlRFUlZBTDsKICAgICBtRGlzYWJsZURlYmxrTGV2ZWwgPSBERUZBVUxUX0RJU0FCTEVfREVCTEtfTEVWRUw7Ci0gICAgbUZyYW1lUmF0ZSA9IERFRkFVTFRfU1JDX0ZSQU1FX1JBVEU7CiAgICAgbUVuYWJsZUZhc3RTYWQgPSBERUZBVUxUX0VOQUJMRV9GQVNUX1NBRDsKICAgICBtRW5hYmxlQWx0UmVmID0gREVGQVVMVF9FTkFCTEVfQUxUX1JFRjsKICAgICBtRW5jU3BlZWQgPSBERUZBVUxUX0VOQ19TUEVFRDsKQEAgLTE5NSwxMSArMjExLDEyIEBACiAgICAgbUFJUlJlZnJlc2hQZXJpb2QgPSBERUZBVUxUX0FJUl9SRUZSRVNIX1BFUklPRDsKICAgICBtUFNOUkVuYWJsZSA9IERFRkFVTFRfUFNOUl9FTkFCTEU7CiAgICAgbVJlY29uRW5hYmxlID0gREVGQVVMVF9SRUNPTl9FTkFCTEU7CisgICAgbUVudHJvcHlNb2RlID0gREVGQVVMVF9FTlRST1BZX01PREU7CisgICAgbUJmcmFtZXMgPSBERUZBVUxUX0JfRlJBTUVTOwogCiAgICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBOVUxMKTsKICAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBOVUxMKTsKIAotICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogfQogCiAKQEAgLTIxMiw3ICsyMjksNiBAQAogICAgIHNfZGltZW5zaW9uc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfRElNRU5TSU9OUzsKICAgICBzX2RpbWVuc2lvbnNfaXAudTRfaHQgPSBtSGVpZ2h0OwogICAgIHNfZGltZW5zaW9uc19pcC51NF93ZCA9IG1XaWR0aDsKLSAgICBzX2RpbWVuc2lvbnNfaXAudTRfc3RyZCA9IG1TdHJpZGU7CiAKICAgICBzX2RpbWVuc2lvbnNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKICAgICBzX2RpbWVuc2lvbnNfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOwpAQCAtMjYwLDggKzI3Niw4IEBACiAgICAgc19mcmFtZV9yYXRlX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CiAgICAgc19mcmFtZV9yYXRlX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9GUkFNRVJBVEU7CiAKLSAgICBzX2ZyYW1lX3JhdGVfaXAudTRfc3JjX2ZyYW1lX3JhdGUgPSBtRnJhbWVSYXRlOwotICAgIHNfZnJhbWVfcmF0ZV9pcC51NF90Z3RfZnJhbWVfcmF0ZSA9IG1GcmFtZVJhdGU7CisgICAgc19mcmFtZV9yYXRlX2lwLnU0X3NyY19mcmFtZV9yYXRlID0gbUZyYW1lcmF0ZSA+PiAxNjsKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfdGd0X2ZyYW1lX3JhdGUgPSBtRnJhbWVyYXRlID4+IDE2OwogCiAgICAgc19mcmFtZV9yYXRlX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CiAgICAgc19mcmFtZV9yYXRlX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKQEAgLTMzMiw3ICszNDgsNiBAQAogICAgIGl2ZV9jdGxfc2V0X2ZyYW1lX3R5cGVfaXBfdCBzX2ZyYW1lX3R5cGVfaXA7CiAgICAgaXZlX2N0bF9zZXRfZnJhbWVfdHlwZV9vcF90IHNfZnJhbWVfdHlwZV9vcDsKICAgICBJVl9TVEFUVVNfVCBzdGF0dXM7Ci0KICAgICBzX2ZyYW1lX3R5cGVfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKICAgICBzX2ZyYW1lX3R5cGVfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0ZSQU1FVFlQRTsKIApAQCAtNTAzLDcgKzUxOCw2IEBACiAKICAgICBzX2dvcF9wYXJhbXNfaXAudTRfaV9mcm1faW50ZXJ2YWwgPSBtSUludGVydmFsOwogICAgIHNfZ29wX3BhcmFtc19pcC51NF9pZHJfZnJtX2ludGVydmFsID0gbUlEUkludGVydmFsOwotICAgIHNfZ29wX3BhcmFtc19pcC51NF9udW1fYl9mcmFtZXMgPSBERUZBVUxUX0JfRlJBTUVTOwogCiAgICAgc19nb3BfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CiAgICAgc19nb3BfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKQEAgLTUyOSw3ICs1NDMsNyBAQAogICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX1BST0ZJTEVfUEFSQU1TOwogCiAgICAgc19wcm9maWxlX3BhcmFtc19pcC5lX3Byb2ZpbGUgPSBERUZBVUxUX0VQUk9GSUxFOwotCisgICAgc19wcm9maWxlX3BhcmFtc19pcC51NF9lbnRyb3B5X2NvZGluZ19tb2RlID0gbUVudHJvcHlNb2RlOwogICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKICAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKIApAQCAtNTk1LDcgKzYwOSw2IEBACiAKIE9NWF9FUlJPUlRZUEUgU29mdEFWQzo6aW5pdEVuY29kZXIoKSB7CiAgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOwotICAgIHNpemVfdCBpOwogICAgIFdPUkQzMiBsZXZlbDsKICAgICB1aW50MzJfdCBkaXNwbGF5U2l6ZVk7CiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKQEAgLTYxOCwyNyArNjMxLDI2IEBACiAgICAgfQogICAgIG1BVkNFbmNMZXZlbCA9IE1BWChsZXZlbCwgbUFWQ0VuY0xldmVsKTsKIAotICAgIGlmIChPTVhfRXJyb3JOb25lICE9IChlcnJUeXBlID0gaW5pdEVuY1BhcmFtcygpKSkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgZW5jb2RlciBwYXJhbXMiKTsKLSAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKLSAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIDApOwotICAgICAgICByZXR1cm4gZXJyVHlwZTsKLSAgICB9Ci0KLSAgICBtU3RyaWRlID0gQUxJR04xNihtV2lkdGgpOworICAgIG1TdHJpZGUgPSBtV2lkdGg7CiAKICAgICBpZiAobUlucHV0RGF0YUlzTWV0YSkgewotICAgICAgICBpZiAobUNvbnZlcnNpb25CdWZmZXIpIHsKLSAgICAgICAgICAgIGZyZWUobUNvbnZlcnNpb25CdWZmZXIpOwotICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXIgPSBOVUxMOwotICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTUFYX0NPTlZFUlNJT05fQlVGRkVSUzsgaSsrKSB7CisgICAgICAgICAgICBpZiAobUNvbnZlcnNpb25CdWZmZXJzW2ldICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBmcmVlKG1Db252ZXJzaW9uQnVmZmVyc1tpXSk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1Db252ZXJzaW9uQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyID0gKHVpbnQ4X3QgKiltYWxsb2MobVN0cmlkZSAqIG1IZWlnaHQgKiAzIC8gMik7Ci0gICAgICAgICAgICBpZiAobUNvbnZlcnNpb25CdWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCgodWludDY0X3QpbVN0cmlkZSAqIG1IZWlnaHQpID4gKCh1aW50NjRfdClJTlQzMl9NQVggLyAzKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJCdWZmZXIgc2l6ZSBpcyB0b28gYmlnLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnNbaV0gPSAodWludDhfdCAqKW1hbGxvYyhtU3RyaWRlICogbUhlaWdodCAqIDMgLyAyKTsKKworICAgICAgICAgICAgaWYgKG1Db252ZXJzaW9uQnVmZmVyc1tpXSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIkFsbG9jYXRpbmcgY29udmVyc2lvbiBidWZmZXIgZmFpbGVkLiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyc0ZyZWVbaV0gPSAxOwogICAgICAgICB9CiAgICAgfQogCkBAIC02NTQsNyArNjY2LDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIEFMT0dWKCJQYXJhbXMgd2lkdGggJWQgaGVpZ2h0ICVkIGxldmVsICVkIGNvbG9yRm9ybWF0ICVkIiwgbVdpZHRoLAorICAgIEFMT0dEKCJQYXJhbXMgd2lkdGggJWQgaGVpZ2h0ICVkIGxldmVsICVkIGNvbG9yRm9ybWF0ICVkIiwgbVdpZHRoLAogICAgICAgICAgICAgbUhlaWdodCwgbUFWQ0VuY0xldmVsLCBtSXZWaWRlb0NvbG9yRm9ybWF0KTsKIAogICAgIC8qIEdldHRpbmcgTnVtYmVyIG9mIE1lbVJlY29yZHMgKi8KQEAgLTY3OSw5ICs2OTEsMTMgQEAKICAgICB9CiAKICAgICAvKiBBbGxvY2F0ZSBhcnJheSB0byBob2xkIG1lbW9yeSByZWNvcmRzICovCisgICAgaWYgKG1OdW1NZW1SZWNvcmRzID4gU0laRV9NQVggLyBzaXplb2YoaXZfbWVtX3JlY190KSkgeworICAgICAgICBBTE9HRSgicmVxdWVzdGVkIG1lbW9yeSBzaXplIGlzIHRvbyBiaWcuIik7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgfQogICAgIG1NZW1SZWNvcmRzID0gKGl2X21lbV9yZWNfdCAqKW1hbGxvYyhtTnVtTWVtUmVjb3JkcyAqIHNpemVvZihpdl9tZW1fcmVjX3QpKTsKICAgICBpZiAoTlVMTCA9PSBtTWVtUmVjb3JkcykgewotICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgaG9sZCBtZW1vcnkgcmVjb3JkczogU2l6ZSAlZCIsCisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBob2xkIG1lbW9yeSByZWNvcmRzOiBTaXplICV6dSIsCiAgICAgICAgICAgICAgICAgbU51bU1lbVJlY29yZHMgKiBzaXplb2YoaXZfbWVtX3JlY190KSk7CiAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCAwKTsKQEAgLTY5MSw3ICs3MDcsNyBAQAogICAgIHsKICAgICAgICAgaXZfbWVtX3JlY190ICpwc19tZW1fcmVjOwogICAgICAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykgewogICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfc2l6ZSA9IHNpemVvZihpdl9tZW1fcmVjX3QpOwogICAgICAgICAgICAgcHNfbWVtX3JlYy0+cHZfYmFzZSA9IE5VTEw7CiAgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZSA9IDA7CkBAIC03MzgsMTMgKzc1NCwxMyBAQAogICAgICAgICBXT1JEMzIgdG90YWxfc2l6ZTsKICAgICAgICAgaXZfbWVtX3JlY190ICpwc19tZW1fcmVjOwogICAgICAgICB0b3RhbF9zaXplID0gMDsKLQogICAgICAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrKSB7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrKSB7CiAgICAgICAgICAgICBwc19tZW1fcmVjLT5wdl9iYXNlID0gaXZlX2FsaWduZWRfbWFsbG9jKAogICAgICAgICAgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9tZW1fYWxpZ25tZW50LCBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZSk7CiAgICAgICAgICAgICBpZiAocHNfbWVtX3JlYy0+cHZfYmFzZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkFsbG9jYXRpb24gZmFpbHVyZSBmb3IgbWVtIHJlY29yZCBpZCAlZCBzaXplICVkXG4iLCBpLAorICAgICAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUgZm9yIG1lbSByZWNvcmQgaWQgJXp1IHNpemUgJXVcbiIsIGksCiAgICAgICAgICAgICAgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZSk7CiAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgMCk7CkBAIC03NTUsNyArNzcxLDYgQEAKIAogICAgICAgICAgICAgcHNfbWVtX3JlYysrOwogICAgICAgICB9Ci0gICAgICAgIHByaW50ZigiXG5Ub3RhbCBtZW1vcnkgZm9yIGNvZGVjICVkXG4iLCB0b3RhbF9zaXplKTsKICAgICB9CiAKICAgICAvKiBDb2RlYyBJbnN0YW5jZSBDcmVhdGlvbiAqLwpAQCAtNzg5LDcgKzgwNCw3IEBACiAgICAgICAgIHNfaW5pdF9pcC5lX3JjX21vZGUgPSBERUZBVUxUX1JDX01PREU7CiAgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfZnJhbWVyYXRlID0gREVGQVVMVF9NQVhfRlJBTUVSQVRFOwogICAgICAgICBzX2luaXRfaXAudTRfbWF4X2JpdHJhdGUgPSBERUZBVUxUX01BWF9CSVRSQVRFOwotICAgICAgICBzX2luaXRfaXAudTRfbWF4X251bV9iZnJhbWVzID0gREVGQVVMVF9CX0ZSQU1FUzsKKyAgICAgICAgc19pbml0X2lwLnU0X251bV9iZnJhbWVzID0gbUJmcmFtZXM7CiAgICAgICAgIHNfaW5pdF9pcC5lX2NvbnRlbnRfdHlwZSA9IElWX1BST0dSRVNTSVZFOwogICAgICAgICBzX2luaXRfaXAudTRfbWF4X3NyY2hfcm5nX3ggPSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1g7CiAgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfc3JjaF9ybmdfeSA9IERFRkFVTFRfTUFYX1NSQ0hfUkFOR0VfWTsKQEAgLTg2NCw3ICs4NzksNiBAQAogICAgIGl2X3JldHJpZXZlX21lbV9yZWNfaXBfdCBzX3JldHJpZXZlX21lbV9pcDsKICAgICBpdl9yZXRyaWV2ZV9tZW1fcmVjX29wX3Qgc19yZXRyaWV2ZV9tZW1fb3A7CiAgICAgaXZfbWVtX3JlY190ICpwc19tZW1fcmVjOwotICAgIFVXT1JEMzIgaTsKIAogICAgIGlmICghbVN0YXJ0ZWQpIHsKICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CkBAIC04ODUsMTYgKzg5OSwxOCBAQAogCiAgICAgLyogRnJlZSBtZW1vcnkgcmVjb3JkcyAqLwogICAgIHBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKLSAgICBmb3IgKGkgPSAwOyBpIDwgc19yZXRyaWV2ZV9tZW1fb3AudTRfbnVtX21lbV9yZWNfZmlsbGVkOyBpKyspIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNfcmV0cmlldmVfbWVtX29wLnU0X251bV9tZW1fcmVjX2ZpbGxlZDsgaSsrKSB7CiAgICAgICAgIGl2ZV9hbGlnbmVkX2ZyZWUocHNfbWVtX3JlYy0+cHZfYmFzZSk7CiAgICAgICAgIHBzX21lbV9yZWMrKzsKICAgICB9CiAKICAgICBmcmVlKG1NZW1SZWNvcmRzKTsKIAotICAgIGlmIChtQ29udmVyc2lvbkJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUobUNvbnZlcnNpb25CdWZmZXIpOwotICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlciA9IE5VTEw7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBNQVhfQ09OVkVSU0lPTl9CVUZGRVJTOyBpKyspIHsKKyAgICAgICAgaWYgKG1Db252ZXJzaW9uQnVmZmVyc1tpXSkgeworICAgICAgICAgICAgZnJlZShtQ29udmVyc2lvbkJ1ZmZlcnNbaV0pOworICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzW2ldID0gTlVMTDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIG1TdGFydGVkID0gZmFsc2U7CkBAIC05MDksNiArOTI1LDEwIEBACiAgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUgKmJpdFJhdGUgPQogICAgICAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGJpdFJhdGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGJpdFJhdGUtPm5Qb3J0SW5kZXggIT0gMSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CkBAIC05MjIsMjcgKzk0MiwyOSBAQAogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSAqYXZjUGFyYW1zID0gKE9NWF9WSURFT19QQVJBTV9BVkNUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShhdmNQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGF2Y1BhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYXZjUGFyYW1zLT5lUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmU7Ci0gICAgICAgICAgICBPTVhfVklERU9fQVZDTEVWRUxUWVBFIG9teExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMzE7CisgICAgICAgICAgICBPTVhfVklERU9fQVZDTEVWRUxUWVBFIG9teExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsNDE7CiAgICAgICAgICAgICBpZiAoT01YX0Vycm9yTm9uZQogICAgICAgICAgICAgICAgICAgICAhPSBDb252ZXJ0QXZjU3BlY0xldmVsVG9PbXhBdmNMZXZlbChtQVZDRW5jTGV2ZWwsICZvbXhMZXZlbCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBhdmNQYXJhbXMtPmVQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZTsKICAgICAgICAgICAgIGF2Y1BhcmFtcy0+ZUxldmVsID0gb214TGV2ZWw7CiAgICAgICAgICAgICBhdmNQYXJhbXMtPm5SZWZGcmFtZXMgPSAxOwotICAgICAgICAgICAgYXZjUGFyYW1zLT5uQkZyYW1lcyA9IDA7CiAgICAgICAgICAgICBhdmNQYXJhbXMtPmJVc2VIYWRhbWFyZCA9IE9NWF9UUlVFOwogICAgICAgICAgICAgYXZjUGFyYW1zLT5uQWxsb3dlZFBpY3R1cmVUeXBlcyA9IChPTVhfVklERU9fUGljdHVyZVR5cGVJCi0gICAgICAgICAgICAgICAgICAgIHwgT01YX1ZJREVPX1BpY3R1cmVUeXBlUCk7CisgICAgICAgICAgICAgICAgICAgIHwgT01YX1ZJREVPX1BpY3R1cmVUeXBlUCB8IE9NWF9WSURFT19QaWN0dXJlVHlwZUIpOwogICAgICAgICAgICAgYXZjUGFyYW1zLT5uUmVmSWR4MTBBY3RpdmVNaW51czEgPSAwOwogICAgICAgICAgICAgYXZjUGFyYW1zLT5uUmVmSWR4MTFBY3RpdmVNaW51czEgPSAwOwogICAgICAgICAgICAgYXZjUGFyYW1zLT5iV2VpZ2h0ZWRQUHJlZGljdGlvbiA9IE9NWF9GQUxTRTsKLSAgICAgICAgICAgIGF2Y1BhcmFtcy0+YkVudHJvcHlDb2RpbmdDQUJBQyA9IE9NWF9GQUxTRTsKICAgICAgICAgICAgIGF2Y1BhcmFtcy0+YmNvbnN0SXByZWQgPSBPTVhfRkFMU0U7CiAgICAgICAgICAgICBhdmNQYXJhbXMtPmJEaXJlY3Q4eDhJbmZlcmVuY2UgPSBPTVhfRkFMU0U7CiAgICAgICAgICAgICBhdmNQYXJhbXMtPmJEaXJlY3RTcGF0aWFsVGVtcG9yYWwgPSBPTVhfRkFMU0U7CkBAIC05NjEsMjYgKzk4Myw0OCBAQAogICAgIHN3aXRjaCAoaW5kZXhGdWxsKSB7CiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0JpdHJhdGU6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbFNldEJpdHJhdGVQYXJhbXMoCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUgKilwYXJhbXMpOworICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFICpiaXRSYXRlID0KKyAgICAgICAgICAgICAgICAoT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShiaXRSYXRlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbFNldEJpdHJhdGVQYXJhbXMoYml0UmF0ZSk7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9BdmM6CiAgICAgICAgIHsKICAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9BVkNUWVBFICphdmNUeXBlID0gKE9NWF9WSURFT19QQVJBTV9BVkNUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShhdmNUeXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChhdmNUeXBlLT5uUG9ydEluZGV4ICE9IDEpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoYXZjVHlwZS0+ZVByb2ZpbGUgIT0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZQotICAgICAgICAgICAgICAgICAgICB8fCBhdmNUeXBlLT5uUmVmRnJhbWVzICE9IDEgfHwgYXZjVHlwZS0+bkJGcmFtZXMgIT0gMAorICAgICAgICAgICAgbUVudHJvcHlNb2RlID0gMDsKKworICAgICAgICAgICAgaWYgKE9NWF9UUlVFID09IGF2Y1R5cGUtPmJFbnRyb3B5Q29kaW5nQ0FCQUMpCisgICAgICAgICAgICAgICAgbUVudHJvcHlNb2RlID0gMTsKKworICAgICAgICAgICAgaWYgKChhdmNUeXBlLT5uQWxsb3dlZFBpY3R1cmVUeXBlcyAmIE9NWF9WSURFT19QaWN0dXJlVHlwZUIpICYmCisgICAgICAgICAgICAgICAgICAgIGF2Y1R5cGUtPm5QRnJhbWVzKSB7CisgICAgICAgICAgICAgICAgbUJmcmFtZXMgPSBhdmNUeXBlLT5uQkZyYW1lcyAvIGF2Y1R5cGUtPm5QRnJhbWVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtSUludGVydmFsID0gYXZjVHlwZS0+blBGcmFtZXMgKyBhdmNUeXBlLT5uQkZyYW1lczsKKworICAgICAgICAgICAgaWYgKE9NWF9WSURFT19BVkNMb29wRmlsdGVyRGlzYWJsZSA9PSBhdmNUeXBlLT5lTG9vcEZpbHRlck1vZGUpCisgICAgICAgICAgICAgICAgbURpc2FibGVEZWJsa0xldmVsID0gNDsKKworICAgICAgICAgICAgaWYgKGF2Y1R5cGUtPm5SZWZGcmFtZXMgIT0gMQogICAgICAgICAgICAgICAgICAgICB8fCBhdmNUeXBlLT5iVXNlSGFkYW1hcmQgIT0gT01YX1RSVUUKLSAgICAgICAgICAgICAgICAgICAgfHwgKGF2Y1R5cGUtPm5BbGxvd2VkUGljdHVyZVR5cGVzICYgT01YX1ZJREVPX1BpY3R1cmVUeXBlQikgIT0gMAogICAgICAgICAgICAgICAgICAgICB8fCBhdmNUeXBlLT5uUmVmSWR4MTBBY3RpdmVNaW51czEgIT0gMAogICAgICAgICAgICAgICAgICAgICB8fCBhdmNUeXBlLT5uUmVmSWR4MTFBY3RpdmVNaW51czEgIT0gMAogICAgICAgICAgICAgICAgICAgICB8fCBhdmNUeXBlLT5iV2VpZ2h0ZWRQUHJlZGljdGlvbiAhPSBPTVhfRkFMU0UKLSAgICAgICAgICAgICAgICAgICAgfHwgYXZjVHlwZS0+YkVudHJvcHlDb2RpbmdDQUJBQyAhPSBPTVhfRkFMU0UKICAgICAgICAgICAgICAgICAgICAgfHwgYXZjVHlwZS0+YmNvbnN0SXByZWQgIT0gT01YX0ZBTFNFCiAgICAgICAgICAgICAgICAgICAgIHx8IGF2Y1R5cGUtPmJEaXJlY3Q4eDhJbmZlcmVuY2UgIT0gT01YX0ZBTFNFCiAgICAgICAgICAgICAgICAgICAgIHx8IGF2Y1R5cGUtPmJEaXJlY3RTcGF0aWFsVGVtcG9yYWwgIT0gT01YX0ZBTFNFCkBAIC0xMDA4LDYgKzEwNTIsMTAgQEAKICAgICAgICAgICAgIE9NWF9DT05GSUdfSU5UUkFSRUZSRVNIVk9QVFlQRSAqcGFyYW1zID0KICAgICAgICAgICAgICAgICAoT01YX0NPTkZJR19JTlRSQVJFRlJFU0hWT1BUWVBFICopX3BhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0ocGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChwYXJhbXMtPm5Qb3J0SW5kZXggIT0ga091dHB1dFBvcnRJbmRleCkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CiAgICAgICAgICAgICB9CkBAIC0xMDIxLDYgKzEwNjksMTAgQEAKICAgICAgICAgICAgIE9NWF9WSURFT19DT05GSUdfQklUUkFURVRZUEUgKnBhcmFtcyA9CiAgICAgICAgICAgICAgICAgKE9NWF9WSURFT19DT05GSUdfQklUUkFURVRZUEUgKilfcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShwYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHBhcmFtcy0+blBvcnRJbmRleCAhPSBrT3V0cHV0UG9ydEluZGV4KSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBvcnRJbmRleDsKICAgICAgICAgICAgIH0KQEAgLTEwNzUsMTQgKzExMjcsMjcgQEAKIAogICAgIC8qIEluaXRpYWxpemUgY29sb3IgZm9ybWF0cyAqLwogICAgIHBzX2lucF9yYXdfYnVmLT5lX2NvbG9yX2ZtdCA9IG1JdlZpZGVvQ29sb3JGb3JtYXQ7Ci0KICAgICBzb3VyY2UgPSBOVUxMOwotICAgIGlmIChpbnB1dEJ1ZmZlckhlYWRlcikgeworICAgIGlmICgoaW5wdXRCdWZmZXJIZWFkZXIgIT0gTlVMTCkgJiYgaW5wdXRCdWZmZXJIZWFkZXItPm5GaWxsZWRMZW4pIHsKICAgICAgICAgc291cmNlID0gaW5wdXRCdWZmZXJIZWFkZXItPnBCdWZmZXIgKyBpbnB1dEJ1ZmZlckhlYWRlci0+bk9mZnNldDsKIAogICAgICAgICBpZiAobUlucHV0RGF0YUlzTWV0YSkgeworICAgICAgICAgICAgdWludDhfdCAqY29udmVyc2lvbkJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1BWF9DT05WRVJTSU9OX0JVRkZFUlM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtQ29udmVyc2lvbkJ1ZmZlcnNGcmVlW2ldKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyc0ZyZWVbaV0gPSAwOworICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uQnVmZmVyID0gbUNvbnZlcnNpb25CdWZmZXJzW2ldOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChOVUxMID09IGNvbnZlcnNpb25CdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiTm8gZnJlZSBidWZmZXJzIHRvIGhvbGQgY29udmVyc2lvbiBkYXRhIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgc291cmNlID0gZXh0cmFjdEdyYXBoaWNCdWZmZXIoCi0gICAgICAgICAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyLCAobVdpZHRoICogbUhlaWdodCAqIDMgLyAyKSwgc291cmNlLAorICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uQnVmZmVyLCAobVdpZHRoICogbUhlaWdodCAqIDMgLyAyKSwgc291cmNlLAogICAgICAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbiwgbVdpZHRoLCBtSGVpZ2h0KTsKIAogICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CkBAIC0xMDkxLDYgKzExNTYsMTggQEAKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIHBzX2VuY29kZV9pcC0+dTRfaXNfbGFzdCA9IDA7CisgICAgICAgIHBzX2VuY29kZV9pcC0+dTRfdGltZXN0YW1wX2hpZ2ggPSAoaW5wdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXApID4+IDMyOworICAgICAgICBwc19lbmNvZGVfaXAtPnU0X3RpbWVzdGFtcF9sb3cgPSAoaW5wdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXApICYgMHhGRkZGRkZGRjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChtU2F3SW5wdXRFT1MpeworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT51NF9pc19sYXN0ID0gMTsKKyAgICAgICAgfQorICAgICAgICBtZW1zZXQocHNfaW5wX3Jhd19idWYsIDAsIHNpemVvZihpdl9yYXdfYnVmX3QpKTsKKyAgICAgICAgcHNfaW5wX3Jhd19idWYtPmVfY29sb3JfZm10ID0gbUl2VmlkZW9Db2xvckZvcm1hdDsKKyAgICAgICAgcHNfaW5wX3Jhd19idWYtPnU0X3NpemUgPSBzaXplb2YoaXZfcmF3X2J1Zl90KTsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgfQogCiAgICAgcHUxX2J1ZiA9IChVV09SRDggKilzb3VyY2U7CkBAIC0xMTQ1LDE0ICsxMjIyLDYgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQotCi0gICAgcHNfZW5jb2RlX2lwLT51NF9pc19sYXN0ID0gMDsKLQotICAgIGlmIChpbnB1dEJ1ZmZlckhlYWRlcikgewotICAgICAgICBwc19lbmNvZGVfaXAtPnU0X3RpbWVzdGFtcF9oaWdoID0gKGlucHV0QnVmZmVySGVhZGVyLT5uVGltZVN0YW1wKSA+PiAzMjsKLSAgICAgICAgcHNfZW5jb2RlX2lwLT51NF90aW1lc3RhbXBfbG93ID0gKGlucHV0QnVmZmVySGVhZGVyLT5uVGltZVN0YW1wKSAmIDB4RkZGRkZGRkY7Ci0gICAgfQotCiAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiB9CiAKQEAgLTExNzAsMzUgKzEyMzksMzEgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TYXdJbnB1dEVPUykgeworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZSgwKTsKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDEpOwogCi0gICAgd2hpbGUgKCFtU2F3SW5wdXRFT1MgJiYgIWluUXVldWUuZW1wdHkoKSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgeworICAgIHdoaWxlICghbVNhd091dHB1dEVPUyAmJiAhb3V0UXVldWUuZW1wdHkoKSkgeworCiAgICAgICAgIE9NWF9FUlJPUlRZUEUgZXJyb3I7CiAgICAgICAgIGl2ZV92aWRlb19lbmNvZGVfaXBfdCBzX2VuY29kZV9pcDsKICAgICAgICAgaXZlX3ZpZGVvX2VuY29kZV9vcF90IHNfZW5jb2RlX29wOwotCi0gICAgICAgIEJ1ZmZlckluZm8gKmlucHV0QnVmZmVySW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbnB1dEJ1ZmZlckhlYWRlciA9IGlucHV0QnVmZmVySW5mby0+bUhlYWRlcjsKLQogICAgICAgICBCdWZmZXJJbmZvICpvdXRwdXRCdWZmZXJJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRwdXRCdWZmZXJIZWFkZXIgPSBvdXRwdXRCdWZmZXJJbmZvLT5tSGVhZGVyOwogCi0gICAgICAgIGlmIChpbnB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7Ci0gICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICBpbnB1dEJ1ZmZlckluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbnB1dEJ1ZmZlckhlYWRlcik7CisgICAgICAgIEJ1ZmZlckluZm8gKmlucHV0QnVmZmVySW5mbzsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmlucHV0QnVmZmVySGVhZGVyOwogCi0gICAgICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5GaWxsZWRMZW4gPSAwOwotICAgICAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7Ci0KLSAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgb3V0cHV0QnVmZmVySW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0cHV0QnVmZmVySGVhZGVyKTsKKyAgICAgICAgaWYgKG1TYXdJbnB1dEVPUykgeworICAgICAgICAgICAgaW5wdXRCdWZmZXJIZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgaW5wdXRCdWZmZXJJbmZvID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIGlmICghaW5RdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICBpbnB1dEJ1ZmZlckluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgaW5wdXRCdWZmZXJIZWFkZXIgPSBpbnB1dEJ1ZmZlckluZm8tPm1IZWFkZXI7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtMTIwOCw2ICsxMjczLDEwIEBACiAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbiA9IDA7CiAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+bk9mZnNldCA9IDA7CiAKKyAgICAgICAgaWYgKGlucHV0QnVmZmVySGVhZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzID0gaW5wdXRCdWZmZXJIZWFkZXItPm5GbGFnczsKKyAgICAgICAgfQorCiAgICAgICAgIHVpbnQ4X3QgKm91dFB0ciA9ICh1aW50OF90ICopb3V0cHV0QnVmZmVySGVhZGVyLT5wQnVmZmVyOwogCiAgICAgICAgIGlmICghbVNwc1Bwc0hlYWRlclJlY2VpdmVkKSB7CkBAIC0xMjMxLDEwICsxMzAwLDEzIEBACiAKICAgICAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUc7CiAgICAgICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5GaWxsZWRMZW4gPSBzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXM7Ci0gICAgICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXAgPSBpbnB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcDsKKyAgICAgICAgICAgIGlmIChpbnB1dEJ1ZmZlckhlYWRlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uVGltZVN0YW1wID0gaW5wdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXA7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOwogICAgICAgICAgICAgb3V0cHV0QnVmZmVySW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworCiAgICAgICAgICAgICBEVU1QX1RPX0ZJTEUoCiAgICAgICAgICAgICAgICAgICAgIG1PdXRGaWxlLCBvdXRwdXRCdWZmZXJIZWFkZXItPnBCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbik7CkBAIC0xMjUyLDE0ICsxMzI0LDI0IEBACiAgICAgICAgICAgICBzZXRGcmFtZVR5cGUoSVZfSURSX0ZSQU1FKTsKICAgICAgICAgfQogCi0gICAgICAgIG1QcmV2VGltZXN0YW1wVXMgPSBpbnB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcDsKLQotICAgICAgICBpZiAoaW5wdXRCdWZmZXJIZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICBpZiAoKGlucHV0QnVmZmVySGVhZGVyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgJiYgKGlucHV0QnVmZmVySGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpKSB7CiAgICAgICAgICAgICBtU2F3SW5wdXRFT1MgPSB0cnVlOwogICAgICAgICB9CiAKKyAgICAgICAgLyogSW4gbm9ybWFsIG1vZGUsIHN0b3JlIGlucHV0QnVmZmVySW5mbyBhbmQgdGhpcyB3aWxsIGJlIHJldHVybmVkCisgICAgICAgICAgIHdoZW4gZW5jb2RlciBjb25zdW1lcyB0aGlzIGlucHV0ICovCisgICAgICAgIGlmICghbUlucHV0RGF0YUlzTWV0YSAmJiAoaW5wdXRCdWZmZXJJbmZvICE9IE5VTEwpKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1BWF9JTlBVVF9CVUZGRVJfSEVBREVSUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKE5VTEwgPT0gbUlucHV0QnVmZmVySW5mb1tpXSkgeworICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXJJbmZvW2ldID0gaW5wdXRCdWZmZXJJbmZvOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgZXJyb3IgPSBzZXRFbmNvZGVBcmdzKAogICAgICAgICAgICAgICAgICZzX2VuY29kZV9pcCwgJnNfZW5jb2RlX29wLCBpbnB1dEJ1ZmZlckhlYWRlciwgb3V0cHV0QnVmZmVySGVhZGVyKTsKKwogICAgICAgICBpZiAoZXJyb3IgIT0gT01YX0Vycm9yTm9uZSkgewogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCAwKTsKQEAgLTEyNjksMTQgKzEzNTEsMTEgQEAKICAgICAgICAgRFVNUF9UT19GSUxFKAogICAgICAgICAgICAgICAgIG1JbkZpbGUsIHNfZW5jb2RlX2lwLnNfaW5wX2J1Zi5hcHZfYnVmc1swXSwKICAgICAgICAgICAgICAgICAobUhlaWdodCAqIG1TdHJpZGUgKiAzIC8gMikpOwotICAgICAgICAvL0RVTVBfVE9fRklMRShtSW5GaWxlLCBpbnB1dEJ1ZmZlckhlYWRlci0+cEJ1ZmZlciArIGlucHV0QnVmZmVySGVhZGVyLT5uT2Zmc2V0LAotICAgICAgICAvLyAgICBpbnB1dEJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbik7CiAKICAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7CiAgICAgICAgIC8qIENvbXB1dGUgdGltZSBlbGFwc2VkIGJldHdlZW4gZW5kIG9mIHByZXZpb3VzIGRlY29kZSgpCiAgICAgICAgICAqIHRvIHN0YXJ0IG9mIGN1cnJlbnQgZGVjb2RlKCkgKi8KICAgICAgICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCB0aW1lRGVsYXkpOwotCiAgICAgICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19lbmNvZGVfaXAsICZzX2VuY29kZV9vcCk7CiAKICAgICAgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CkBAIC0xMjk0LDM4ICsxMzczLDc3IEBACiAgICAgICAgIEFMT0dWKCJ0aW1lVGFrZW49JTZkIGRlbGF5PSU2ZCBudW1CeXRlcz0lNmQiLCB0aW1lVGFrZW4sIHRpbWVEZWxheSwKICAgICAgICAgICAgICAgICBzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXMpOwogCisgICAgICAgIC8qIEluIGVuY29kZXIgZnJlZXMgdXAgYW4gaW5wdXQgYnVmZmVyLCBtYXJrIGl0IGFzIGZyZWUgKi8KKyAgICAgICAgaWYgKHNfZW5jb2RlX29wLnNfaW5wX2J1Zi5hcHZfYnVmc1swXSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAobUlucHV0RGF0YUlzTWV0YSkgeworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTUFYX0NPTlZFUlNJT05fQlVGRkVSUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQ29udmVyc2lvbkJ1ZmZlcnNbaV0gPT0gc19lbmNvZGVfb3Auc19pbnBfYnVmLmFwdl9idWZzWzBdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnNGcmVlW2ldID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBJbiBub3JtYWwgbW9kZSwgY2FsbCBFQkQgb24gaW5CdWZmZUhlYWRlciB0aGF0IGlzIGZyZWVkIGJ5IHRoZSBjb2RlYyAqLworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTUFYX0lOUFVUX0JVRkZFUl9IRUFERVJTOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYnVmID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZkhkciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXJJbmZvW2ldICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZkhkciA9IG1JbnB1dEJ1ZmZlckluZm9baV0tPm1IZWFkZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYgPSBidWZIZHItPnBCdWZmZXIgKyBidWZIZHItPm5PZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHNfZW5jb2RlX29wLnNfaW5wX2J1Zi5hcHZfYnVmc1swXSA9PSBidWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlckluZm9baV0tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShidWZIZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVySW5mb1tpXSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0gICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzID0gaW5wdXRCdWZmZXJIZWFkZXItPm5GbGFnczsKICAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuID0gc19lbmNvZGVfb3Auc19vdXRfYnVmLnU0X2J5dGVzOwotICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXAgPSBpbnB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcDsKIAotICAgICAgICBpZiAoSVZfSURSX0ZSQU1FCi0gICAgICAgICAgICAgICAgPT0gc19lbmNvZGVfb3AudTRfZW5jb2RlZF9mcmFtZV90eXBlKSB7CisgICAgICAgIGlmIChJVl9JRFJfRlJBTUUgPT0gc19lbmNvZGVfb3AudTRfZW5jb2RlZF9mcmFtZV90eXBlKSB7CiAgICAgICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19TWU5DRlJBTUU7CiAgICAgICAgIH0KIAotICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgIGlucHV0QnVmZmVySW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICBpZiAoaW5wdXRCdWZmZXJIZWFkZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwogCi0gICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbnB1dEJ1ZmZlckhlYWRlcik7Ci0KLSAgICAgICAgaWYgKG1TYXdJbnB1dEVPUykgewotICAgICAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgLyogSWYgaW4gbWV0YSBkYXRhLCBjYWxsIEVCRCBvbiBpbnB1dCAqLworICAgICAgICAgICAgLyogSW4gY2FzZSBvZiBub3JtYWwgbW9kZSwgRUJEIHdpbGwgYmUgZG9uZSBvbmNlIGVuY29kZXIKKyAgICAgICAgICAgIHJlbGVhc2VzIHRoZSBpbnB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgIGlmIChtSW5wdXREYXRhSXNNZXRhKSB7CisgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXJJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGlucHV0QnVmZmVySGVhZGVyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIG91dHB1dEJ1ZmZlckluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgICAgIGlmIChzX2VuY29kZV9vcC51NF9pc19sYXN0KSB7CisgICAgICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICBtU2F3T3V0cHV0RU9TID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzICY9IH5PTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgIH0KIAotICAgICAgICBEVU1QX1RPX0ZJTEUoCi0gICAgICAgICAgICAgICAgbU91dEZpbGUsIG91dHB1dEJ1ZmZlckhlYWRlci0+cEJ1ZmZlciwKLSAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5GaWxsZWRMZW4pOwotICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRwdXRCdWZmZXJIZWFkZXIpOworICAgICAgICBpZiAob3V0cHV0QnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuIHx8IHNfZW5jb2RlX29wLnU0X2lzX2xhc3QpIHsKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcCA9IHNfZW5jb2RlX29wLnU0X3RpbWVzdGFtcF9oaWdoOworICAgICAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uVGltZVN0YW1wIDw8PSAzMjsKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcCB8PSBzX2VuY29kZV9vcC51NF90aW1lc3RhbXBfbG93OworICAgICAgICAgICAgb3V0cHV0QnVmZmVySW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBEVU1QX1RPX0ZJTEUobU91dEZpbGUsIG91dHB1dEJ1ZmZlckhlYWRlci0+cEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuKTsKKyAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dHB1dEJ1ZmZlckhlYWRlcik7CisgICAgICAgIH0KIAorICAgICAgICBpZiAoc19lbmNvZGVfb3AudTRfaXNfbGFzdCA9PSAxKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuOwogfQogCi0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKIGFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5oCmluZGV4IGM0ZTI2YTkuLjQ0MThhN2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5oCkBAIC0xNyw3ICsxNyw3IEBACiAjaWZuZGVmIF9fU09GVF9BVkNfRU5DX0hfXwogI2RlZmluZSBfX1NPRlRfQVZDX0VOQ19IX18KIAotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKQEAgLTI1LDE0ICsyNSwxNCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBNZWRpYUJ1ZmZlcjsKLQorI2RlZmluZSBNQVhfSU5QVVRfQlVGRkVSX0hFQURFUlMgNAorI2RlZmluZSBNQVhfQ09OVkVSU0lPTl9CVUZGRVJTICAgNAogI2RlZmluZSBDT0RFQ19NQVhfQ09SRVMgICAgICAgICAgNAogI2RlZmluZSBMRU5fU1RBVFVTX0JVRkZFUiAgICAgICAgKDEwICAqIDEwMjQpCiAjZGVmaW5lIE1BWF9WQlZfQlVGRl9TSVpFICAgICAgICAoMTIwICogMTYzODQpCiAjZGVmaW5lIE1BWF9OVU1fSU9fQlVGUyAgICAgICAgICAgMwogCi0jZGVmaW5lIERFRkFVTFRfTUFYX1JFRl9GUk0gICAgICAgICAxCisjZGVmaW5lIERFRkFVTFRfTUFYX1JFRl9GUk0gICAgICAgICAyCiAjZGVmaW5lIERFRkFVTFRfTUFYX1JFT1JERVJfRlJNICAgICAwCiAjZGVmaW5lIERFRkFVTFRfUVBfTUlOICAgICAgICAgICAgICAxMAogI2RlZmluZSBERUZBVUxUX1FQX01BWCAgICAgICAgICAgICAgNDAKQEAgLTU3LDcgKzU3LDcgQEAKICNkZWZpbmUgREVGQVVMVF9UR1RfRlJBTUVfUkFURSAgICAgIDMwCiAjZGVmaW5lIERFRkFVTFRfTUFYX1dEICAgICAgICAgICAgICAxOTIwCiAjZGVmaW5lIERFRkFVTFRfTUFYX0hUICAgICAgICAgICAgICAxOTIwCi0jZGVmaW5lIERFRkFVTFRfTUFYX0xFVkVMICAgICAgICAgICA0MAorI2RlZmluZSBERUZBVUxUX01BWF9MRVZFTCAgICAgICAgICAgNDEKICNkZWZpbmUgREVGQVVMVF9TVFJJREUgICAgICAgICAgICAgIDAKICNkZWZpbmUgREVGQVVMVF9XRCAgICAgICAgICAgICAgICAgIDEyODAKICNkZWZpbmUgREVGQVVMVF9IVCAgICAgICAgICAgICAgICAgIDcyMApAQCAtODgsNiArODgsNyBAQAogI2RlZmluZSBERUZBVUxUX1FQRUwgICAgICAgICAgICAgICAgMQogI2RlZmluZSBERUZBVUxUX0k0ICAgICAgICAgICAgICAgICAgMQogI2RlZmluZSBERUZBVUxUX0VQUk9GSUxFICAgICAgICAgICAgSVZfUFJPRklMRV9CQVNFCisjZGVmaW5lIERFRkFVTFRfRU5UUk9QWV9NT0RFICAgICAgICAwCiAjZGVmaW5lIERFRkFVTFRfU0xJQ0VfTU9ERSAgICAgICAgICBJVkVfU0xJQ0VfTU9ERV9OT05FCiAjZGVmaW5lIERFRkFVTFRfU0xJQ0VfUEFSQU0gICAgICAgICAyNTYKICNkZWZpbmUgREVGQVVMVF9BUkNIICAgICAgICAgICAgICAgIEFSQ0hfQVJNX0E5UQpAQCAtMTQ5LDggKzE1MCw2IEBACiAKICAgICBpbnQzMl90ICBtU3RyaWRlOwogCi0gICAgdWludDMyX3QgbUZyYW1lUmF0ZTsKLQogICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7ICAgLy8gVGltZSBhdCB0aGUgc3RhcnQgb2YgZGVjb2RlKCkKICAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZUVuZDsgICAgIC8vIFRpbWUgYXQgdGhlIGVuZCBvZiBkZWNvZGUoKQogCkBAIC0xNjcsMzIgKzE2NiwzMiBAQAogCiAgICAgSVZfQ09MT1JfRk9STUFUX1QgbUl2VmlkZW9Db2xvckZvcm1hdDsKIAotICAgIGludDMyX3QgIG1JRFJGcmFtZVJlZnJlc2hJbnRlcnZhbEluU2VjOwogICAgIElWX1BST0ZJTEVfVCBtQVZDRW5jUHJvZmlsZTsKICAgICBXT1JEMzIgICBtQVZDRW5jTGV2ZWw7Ci0gICAgaW50NjRfdCAgbU51bUlucHV0RnJhbWVzOwotICAgIGludDY0X3QgIG1QcmV2VGltZXN0YW1wVXM7CiAgICAgYm9vbCAgICAgbVN0YXJ0ZWQ7CiAgICAgYm9vbCAgICAgbVNwc1Bwc0hlYWRlclJlY2VpdmVkOwogCiAgICAgYm9vbCAgICAgbVNhd0lucHV0RU9TOworICAgIGJvb2wgICAgIG1TYXdPdXRwdXRFT1M7CiAgICAgYm9vbCAgICAgbVNpZ25hbGxlZEVycm9yOwogICAgIGJvb2wgICAgIG1JbnRyYTR4NDsKICAgICBib29sICAgICBtRW5hYmxlRmFzdFNhZDsKICAgICBib29sICAgICBtRW5hYmxlQWx0UmVmOwotICAgIGJvb2wgICAgbVJlY29uRW5hYmxlOwotICAgIGJvb2wgICAgbVBTTlJFbmFibGU7CisgICAgYm9vbCAgICAgbVJlY29uRW5hYmxlOworICAgIGJvb2wgICAgIG1QU05SRW5hYmxlOworICAgIGJvb2wgICAgIG1FbnRyb3B5TW9kZTsKICAgICBJVkVfU1BFRURfQ09ORklHICAgICBtRW5jU3BlZWQ7CiAKLSAgICB1aW50OF90ICptQ29udmVyc2lvbkJ1ZmZlcjsKLQorICAgIHVpbnQ4X3QgKm1Db252ZXJzaW9uQnVmZmVyc1tNQVhfQ09OVkVSU0lPTl9CVUZGRVJTXTsKKyAgICBib29sICAgICBtQ29udmVyc2lvbkJ1ZmZlcnNGcmVlW01BWF9DT05WRVJTSU9OX0JVRkZFUlNdOworICAgIEJ1ZmZlckluZm8gKm1JbnB1dEJ1ZmZlckluZm9bTUFYX0lOUFVUX0JVRkZFUl9IRUFERVJTXTsKICAgICBpdl9vYmpfdCAqbUNvZGVjQ3R4OyAgICAgICAgIC8vIENvZGVjIGNvbnRleHQKICAgICBpdl9tZW1fcmVjX3QgKm1NZW1SZWNvcmRzOyAgIC8vIE1lbW9yeSByZWNvcmRzIHJlcXVlc3RlZCBieSB0aGUgY29kZWMKICAgICBzaXplX3QgbU51bU1lbVJlY29yZHM7ICAgICAgIC8vIE51bWJlciBvZiBtZW1vcnkgcmVjb3JkcyByZXF1ZXN0ZWQgYnkgY29kZWMKICAgICBzaXplX3QgbU51bUNvcmVzOyAgICAgICAgICAgIC8vIE51bWJlciBvZiBjb3JlcyB1c2VkIGJ5IHRoZSBjb2RlYwogCiAgICAgVVdPUkQzMiBtSGVhZGVyR2VuZXJhdGVkOwotCisgICAgVVdPUkQzMiBtQmZyYW1lczsKICAgICBJVl9BUkNIX1QgbUFyY2g7CiAgICAgSVZFX1NMSUNFX01PREVfVCBtU2xpY2VNb2RlOwogICAgIFVXT1JEMzIgbVNsaWNlUGFyYW07CkBAIC0yMDMsNyArMjAyLDcgQEAKICAgICBJVkVfQUlSX01PREVfVCBtQUlSTW9kZTsKICAgICBVV09SRDMyIG1BSVJSZWZyZXNoUGVyaW9kOwogCi0gICAgT01YX0VSUk9SVFlQRSBpbml0RW5jUGFyYW1zKCk7CisgICAgdm9pZCBpbml0RW5jUGFyYW1zKCk7CiAgICAgT01YX0VSUk9SVFlQRSBpbml0RW5jb2RlcigpOwogICAgIE9NWF9FUlJPUlRZUEUgcmVsZWFzZUVuY29kZXIoKTsKIApAQCAtMjkyLDYgKzI5MSw4IEBACiAgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBBTE9HRCgiQ291bGQgbm90IHdyaXRlIHRvIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTtcCisgICAgICAgIGlmIChmcCAhPSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9CiAjZWxzZSAvKiBGSUxFX0RVTVBfRU5BQkxFICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCmluZGV4IDllZGZmZDIuLmNhY2VkYTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCkBAIC0xNTksNiArMTU5LDEwIEBACiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CiAgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqKXBhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0ocGNtUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KQEAgLTE4MCw2ICsxODQsMTEgQEAKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvRmxhYzoKICAgICAgICAgewogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0ZMQUNUWVBFICpmbGFjUGFyYW1zID0gKE9NWF9BVURJT19QQVJBTV9GTEFDVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZmxhY1BhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBmbGFjUGFyYW1zLT5uQ29tcHJlc3Npb25MZXZlbCA9IG1Db21wcmVzc2lvbkxldmVsOwogICAgICAgICAgICAgZmxhY1BhcmFtcy0+bkNoYW5uZWxzID0gbU51bUNoYW5uZWxzOwogICAgICAgICAgICAgZmxhY1BhcmFtcy0+blNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKQEAgLTE5OSw2ICsyMDgsMTAgQEAKICAgICAgICAgICAgIEFMT0dWKCJTb2Z0RmxhY0VuY29kZXI6OmludGVybmFsU2V0UGFyYW1ldGVyKE9NWF9JbmRleFBhcmFtQXVkaW9QY20pIik7CiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9IChPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKHBjbVBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uUG9ydEluZGV4ICE9IDAgJiYgcGNtUGFyYW1zLT5uUG9ydEluZGV4ICE9IDEpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiU29mdEZsYWNFbmNvZGVyOjppbnRlcm5hbFNldFBhcmFtZXRlcigpIEVycm9yICMxIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKQEAgLTIyMSw2ICsyMzQsMTAgQEAKICAgICAgICAgICAgIGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcm9sZVBhcmFtcyA9CiAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqKXBhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0ocm9sZVBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoc3RybmNtcCgoY29uc3QgY2hhciAqKXJvbGVQYXJhbXMtPmNSb2xlLAogICAgICAgICAgICAgICAgICAgICAiYXVkaW9fZW5jb2Rlci5mbGFjIiwKICAgICAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUgLSAxKSkgewpAQCAtMjM2LDYgKzI1MywxMSBAQAogICAgICAgICB7CiAgICAgICAgICAgICAvLyB1c2VkIG9ubHkgZm9yIHNldHRpbmcgdGhlIGNvbXByZXNzaW9uIGxldmVsCiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fRkxBQ1RZUEUgKmZsYWNQYXJhbXMgPSAoT01YX0FVRElPX1BBUkFNX0ZMQUNUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmbGFjUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIG1Db21wcmVzc2lvbkxldmVsID0gZmxhY1BhcmFtcy0+bkNvbXByZXNzaW9uTGV2ZWw7IC8vIHJhbmdlIGNsYW1waW5nIGRvbmUgaW5zaWRlIGVuY29kZXIKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CkBAIC0yNDUsNiArMjY3LDEwIEBACiAgICAgICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpkZWZQYXJhbXMgPQogICAgICAgICAgICAgICAgIChPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShkZWZQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGRlZlBhcmFtcy0+blBvcnRJbmRleCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgaWYgKGRlZlBhcmFtcy0+bkJ1ZmZlclNpemUgPiBrTWF4SW5wdXRCdWZmZXJTaXplKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJJbnB1dCBidWZmZXIgc2l6ZSBtdXN0IGJlIGF0IG1vc3QgJWQgYnl0ZXMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAKaW5kZXggMDE1NTE1ZS4uYzgyNzdkZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCkBAIC0xMTAsNiArMTEwLDEwIEBACiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CiAgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqKXBhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0ocGNtUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KQEAgLTE0OCw2ICsxNTIsMTAgQEAKICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KICAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShwY21QYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCAhPSAwICYmIHBjbVBhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KQEAgLTE3MCw2ICsxNzgsMTAgQEAKICAgICAgICAgICAgIGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcm9sZVBhcmFtcyA9CiAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqKXBhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0ocm9sZVBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAobUlzTUxhdykgewogICAgICAgICAgICAgICAgIGlmIChzdHJuY21wKChjb25zdCBjaGFyICopcm9sZVBhcmFtcy0+Y1JvbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuZzcxMW1sYXciLApAQCAtMjI4LDYgKzI0MCwxNSBAQAogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiAqIHNpemVvZihpbnQxNl90KSA+IG91dEhlYWRlci0+bkFsbG9jTGVuKSB7CisgICAgICAgICAgICBBTE9HRSgib3V0cHV0IGJ1ZmZlciB0b28gc21hbGwgKCVkKS4iLCBvdXRIZWFkZXItPm5BbGxvY0xlbik7CisgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3NzkzMTYzIik7CisKKyAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwogICAgICAgICBjb25zdCB1aW50OF90ICppbnB1dHB0ciA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CiAKICAgICAgICAgaWYgKG1Jc01MYXcpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5jcHAKaW5kZXggYmQwMWExYS4uMDRkNWEzMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5jcHAKQEAgLTExMCw2ICsxMTAsMTAgQEAKICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KICAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShwY21QYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQpAQCAtMTQxLDYgKzE0NSwxMCBAQAogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQogICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKHBjbVBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uUG9ydEluZGV4ICE9IDAgJiYgcGNtUGFyYW1zLT5uUG9ydEluZGV4ICE9IDEpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQpAQCAtMTYxLDYgKzE2OSwxMCBAQAogICAgICAgICAgICAgY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpyb2xlUGFyYW1zID0KICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShyb2xlUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChzdHJuY21wKChjb25zdCBjaGFyICopcm9sZVBhcmFtcy0+Y1JvbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5nc20iLAogICAgICAgICAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUgLSAxKSkgewpAQCAtMjE2LDYgKzIyOCwxNCBAQAogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChvdXRIZWFkZXItPm5BbGxvY0xlbiA8IChpbkhlYWRlci0+bkZpbGxlZExlbiAvIGtNU0dTTUZyYW1lU2l6ZSkgKiAzMjApIHsKKyAgICAgICAgICAgIEFMT0dFKCJvdXRwdXQgYnVmZmVyIGlzIG5vdCBsYXJnZSBlbm91Z2ggKCVkKS4iLCBvdXRIZWFkZXItPm5BbGxvY0xlbik7CisgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3NzkzMzY3Iik7CisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKICAgICAgICAgdWludDhfdCAqaW5wdXRwdHIgPSBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OwogCiAgICAgICAgIGludCBuID0gbVNpZ25hbGxlZEVycm9yID8gMCA6IERlY29kZUdTTShtR3NtLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuY3BwCmluZGV4IGNkZGQxNzYuLmU3ZjlkZjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5jcHAKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlICJpaGV2Y190eXBlZGVmcy5oIgogI2luY2x1ZGUgIml2LmgiCiAjaW5jbHVkZSAiaXZkLmgiCi0jaW5jbHVkZSAiaXRocmVhZC5oIgogI2luY2x1ZGUgImloZXZjZF9jeGEuaCIKICNpbmNsdWRlICJTb2Z0SEVWQy5oIgogCkBAIC04Miw3ICs4MSwxMCBAQAogICAgIGluaXRQb3J0cygKICAgICAgICAgICAgIGtOdW1CdWZmZXJzLCBtYXgoa01heE91dHB1dEJ1ZmZlclNpemUgLyBrTWluQ29tcHJlc3Npb25SYXRpbywgKHNpemVfdClJTlBVVF9CVUZfU0laRSksCiAgICAgICAgICAgICBrTnVtQnVmZmVycywgQ09ERUNfTUlNRV9UWVBFLCBrTWluQ29tcHJlc3Npb25SYXRpbyk7Ci0gICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKK30KKworc3RhdHVzX3QgU29mdEhFVkM6OmluaXQoKSB7CisgICAgcmV0dXJuIGluaXREZWNvZGVyKCk7CiB9CiAKIFNvZnRIRVZDOjp+U29mdEhFVkMoKSB7CkBAIC0xNDMsNyArMTQ1LDcgQEAKICAgICBzX2N0bF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90KTsKICAgICBzX2N0bF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90KTsKIAotICAgIEFMT0dWKCJTZXQgdGhlIHJ1bi10aW1lIChkeW5hbWljKSBwYXJhbWV0ZXJzIHN0cmlkZSA9ICV1Iiwgc3RyaWRlKTsKKyAgICBBTE9HVigiU2V0IHRoZSBydW4tdGltZSAoZHluYW1pYykgcGFyYW1ldGVycyBzdHJpZGUgPSAlenUiLCBzdHJpZGUpOwogICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfY3RsX2lwLAogICAgICAgICAgICAgKHZvaWQgKikmc19jdGxfb3ApOwogCkBAIC00MDgsNyArNDEwLDcgQEAKICAgICB1aW50MzJfdCBidWZmZXJTaXplID0gZGlzcGxheVNpemVZICogMyAvIDI7CiAgICAgbUZsdXNoT3V0QnVmZmVyID0gKHVpbnQ4X3QgKilpdmRfYWxpZ25lZF9tYWxsb2MoMTI4LCBidWZmZXJTaXplKTsKICAgICBpZiAoTlVMTCA9PSBtRmx1c2hPdXRCdWZmZXIpIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBhbGxvY2F0ZSBmbHVzaE91dHB1dEJ1ZmZlciBvZiBzaXplICV6dSIsIGJ1ZmZlclNpemUpOworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGFsbG9jYXRlIGZsdXNoT3V0cHV0QnVmZmVyIG9mIHNpemUgJXUiLCBidWZmZXJTaXplKTsKICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICB9CiAKQEAgLTQ3OCwxNCArNDgwLDEzIEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotdm9pZCBTb2Z0SEVWQzo6c2V0RGVjb2RlQXJncyhpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY19pcCwKK2Jvb2wgU29mdEhFVkM6OnNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNfaXAsCiAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjX29wLAogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIsCiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIsCiAgICAgICAgIHNpemVfdCB0aW1lU3RhbXBJeCkgewogICAgIHNpemVfdCBzaXplWSA9IG91dHB1dEJ1ZmZlcldpZHRoKCkgKiBvdXRwdXRCdWZmZXJIZWlnaHQoKTsKICAgICBzaXplX3Qgc2l6ZVVWOwotICAgIHVpbnQ4X3QgKnBCdWY7CiAKICAgICBwc19kZWNfaXAtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9pcF90KTsKICAgICBwc19kZWNfb3AtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9vcF90KTsKQEAgLTUwNSwyMiArNTA2LDI4IEBACiAgICAgICAgIHBzX2RlY19pcC0+dTRfbnVtX0J5dGVzID0gMDsKICAgICB9CiAKLSAgICBpZiAob3V0SGVhZGVyKSB7Ci0gICAgICAgIHBCdWYgPSBvdXRIZWFkZXItPnBCdWZmZXI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcEJ1ZiA9IG1GbHVzaE91dEJ1ZmZlcjsKLSAgICB9Ci0KICAgICBzaXplVVYgPSBzaXplWSAvIDQ7CiAgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVswXSA9IHNpemVZOwogICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMV0gPSBzaXplVVY7CiAgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsyXSA9IHNpemVVVjsKIAorICAgIHVpbnQ4X3QgKnBCdWY7CisgICAgaWYgKG91dEhlYWRlcikgeworICAgICAgICBpZiAob3V0SGVhZGVyLT5uQWxsb2NMZW4gPCBzaXplWSArIChzaXplVVYgKiAyKSkgeworICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzgzMzYxNiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHBCdWYgPSBvdXRIZWFkZXItPnBCdWZmZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbUZsdXNoT3V0QnVmZmVyIGFsd2F5cyBoYXMgdGhlIHJpZ2h0IHNpemUuCisgICAgICAgIHBCdWYgPSBtRmx1c2hPdXRCdWZmZXI7CisgICAgfQorCiAgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMF0gPSBwQnVmOwogICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzFdID0gcEJ1ZiArIHNpemVZOwogICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzJdID0gcEJ1ZiArIHNpemVZICsgc2l6ZVVWOwogICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnU0X251bV9idWZzID0gMzsKLSAgICByZXR1cm47CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIFNvZnRIRVZDOjpvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCkgewogICAgIC8qIE9uY2UgdGhlIG91dHB1dCBidWZmZXJzIGFyZSBmbHVzaGVkLCBpZ25vcmUgYW55IGJ1ZmZlcnMgdGhhdCBhcmUgaGVsZCBpbiBkZWNvZGVyICovCkBAIC02MzUsNyArNjQyLDExIEBACiAgICAgICAgICAgICBXT1JEMzIgdGltZURlbGF5LCB0aW1lVGFrZW47CiAgICAgICAgICAgICBzaXplX3Qgc2l6ZVksIHNpemVVVjsKIAotICAgICAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNfaXAsICZzX2RlY19vcCwgaW5IZWFkZXIsIG91dEhlYWRlciwgdGltZVN0YW1wSXgpOworICAgICAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY19pcCwgJnNfZGVjX29wLCBpbkhlYWRlciwgb3V0SGVhZGVyLCB0aW1lU3RhbXBJeCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRGVjb2RlciBhcmcgc2V0dXAgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7CiAgICAgICAgICAgICAvKiBDb21wdXRlIHRpbWUgZWxhcHNlZCBiZXR3ZWVuIGVuZCBvZiBwcmV2aW91cyBkZWNvZGUoKQpAQCAtNzY2LDUgKzc3NywxMCBAQAogYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudChjb25zdCBjaGFyICpuYW1lLAogICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsIE9NWF9QVFIgYXBwRGF0YSwKICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKLSAgICByZXR1cm4gbmV3IGFuZHJvaWQ6OlNvZnRIRVZDKG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KTsKKyAgICBhbmRyb2lkOjpTb2Z0SEVWQyAqY29kZWMgPSBuZXcgYW5kcm9pZDo6U29mdEhFVkMobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpOworICAgIGlmIChjb2RlYy0+aW5pdCgpICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQ+IHJlbGVhc2UgPSBjb2RlYzsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBjb2RlYzsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5oCmluZGV4IGE5MWY1MjguLmRmY2NhOWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuaApAQCAtNTYsNiArNTYsOCBAQAogICAgIFNvZnRIRVZDKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKICAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpOwogCisgICAgc3RhdHVzX3QgaW5pdCgpOworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+U29mdEhFVkMoKTsKIApAQCAtMTExLDcgKzExMyw3IEBACiAgICAgc3RhdHVzX3QgcmVzZXRQbHVnaW4oKTsKICAgICBzdGF0dXNfdCByZUluaXREZWNvZGVyKCk7CiAKLSAgICB2b2lkIHNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNfaXAsCisgICAgYm9vbCBzZXREZWNvZGVBcmdzKGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjX2lwLAogICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY19vcCwKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyLAogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwCmluZGV4IGMxMGM4ZjEuLmJiNTlhZTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5jcHAKQEAgLTEwMywzNCArMTAzLDQxIEBACiAgICAgd2hpbGUgKCFpblF1ZXVlLmVtcHR5KCkgJiYgb3V0UXVldWUuc2l6ZSgpID09IGtOdW1PdXRwdXRCdWZmZXJzKSB7CiAgICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKKyAgICAgICAgaWYgKGluSGVhZGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAogICAgICAgICBQb3J0SW5mbyAqcG9ydCA9IGVkaXRQb3J0SW5mbygxKTsKIAogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0KICAgICAgICAgICAgIHBvcnQtPm1CdWZmZXJzLmVkaXRJdGVtQXQobU51bVNhbXBsZXNPdXRwdXQgJiAxKS5tSGVhZGVyOwogCi0gICAgICAgIGlmICgoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgJiYgaW5IZWFkZXItPm5GaWxsZWRMZW4gPT0gMCkgeworICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPT0gMCkgewogICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwogICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CiAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOwogCiAgICAgICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OwogCi0gICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOwotICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CiAKLSAgICAgICAgICAgIExpc3Q8QnVmZmVySW5mbyAqPjo6aXRlcmF0b3IgaXQgPSBvdXRRdWV1ZS5iZWdpbigpOwotICAgICAgICAgICAgd2hpbGUgKCgqaXQpLT5tSGVhZGVyICE9IG91dEhlYWRlcikgewotICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgTGlzdDxCdWZmZXJJbmZvICo+OjppdGVyYXRvciBpdCA9IG91dFF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKCgqaXQpLT5tSGVhZGVyICE9IG91dEhlYWRlcikgeworICAgICAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqaXQ7CisgICAgICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBvdXRJbmZvID0gTlVMTDsKKworICAgICAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgICAgICAgICAgb3V0SGVhZGVyID0gTlVMTDsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICppdDsKLSAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKGl0KTsKLSAgICAgICAgICAgIG91dEluZm8gPSBOVUxMOwotCi0gICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOwotICAgICAgICAgICAgb3V0SGVhZGVyID0gTlVMTDsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcAppbmRleCBmMmE0ZTY1Li43NjM4YmI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5jcHAKQEAgLTIzMiw2ICsyMzIsMTAgQEAKICAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSAqYml0UmF0ZSA9CiAgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSAqKSBwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGJpdFJhdGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGJpdFJhdGUtPm5Qb3J0SW5kZXggIT0gMSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CkBAIC0yNDYsNiArMjUwLDEwIEBACiAgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUgKmgyNjN0eXBlID0KICAgICAgICAgICAgICAgICAoT01YX1ZJREVPX1BBUkFNX0gyNjNUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShoMjYzdHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoaDI2M3R5cGUtPm5Qb3J0SW5kZXggIT0gMSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CkBAIC0yNjcsNiArMjc1LDEwIEBACiAgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFICptcGVnNHR5cGUgPQogICAgICAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShtcGVnNHR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKG1wZWc0dHlwZS0+blBvcnRJbmRleCAhPSAxKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KQEAgLTMwMSw2ICszMTMsMTAgQEAKICAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSAqYml0UmF0ZSA9CiAgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSAqKSBwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGJpdFJhdGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGJpdFJhdGUtPm5Qb3J0SW5kZXggIT0gMSB8fAogICAgICAgICAgICAgICAgIGJpdFJhdGUtPmVDb250cm9sUmF0ZSAhPSBPTVhfVmlkZW9fQ29udHJvbFJhdGVWYXJpYWJsZSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CkBAIC0zMTUsNiArMzMxLDEwIEBACiAgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUgKmgyNjN0eXBlID0KICAgICAgICAgICAgICAgICAoT01YX1ZJREVPX1BBUkFNX0gyNjNUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShoMjYzdHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoaDI2M3R5cGUtPm5Qb3J0SW5kZXggIT0gMSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CkBAIC0zMzcsNiArMzU3LDEwIEBACiAgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFICptcGVnNHR5cGUgPQogICAgICAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShtcGVnNHR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKG1wZWc0dHlwZS0+blBvcnRJbmRleCAhPSAxKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCmluZGV4IDJmYWIzOTEuLmFhOTQ2ZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcApAQCAtMTI4LDYgKzEyOCwxMCBAQAogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQogICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKHBjbVBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CkBAIC0xNTEsNiArMTU1LDEwIEBACiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fTVAzVFlQRSAqbXAzUGFyYW1zID0KICAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX01QM1RZUEUgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKG1wM1BhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAobXAzUGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CkBAIC0xNzYsNiArMTg0LDEwIEBACiAgICAgICAgICAgICBjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnJvbGVQYXJhbXMgPQogICAgICAgICAgICAgICAgIChjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKHJvbGVQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHN0cm5jbXAoKGNvbnN0IGNoYXIgKilyb2xlUGFyYW1zLT5jUm9sZSwKICAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLm1wMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSAtIDEpKSB7CkBAIC0xOTAsNiArMjAyLDEwIEBACiAgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CiAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqKXBhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0ocGNtUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPm5Qb3J0SW5kZXggIT0gMSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CkBAIC0yOTEsNiArMzA3LDExIEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgcmVjb3ZlcmFibGUsIGp1c3QgaWdub3JlIHRoZSBjdXJyZW50IGZyYW1lIGFuZAogICAgICAgICAgICAgICAgIC8vIHBsYXkgc2lsZW5jZSBpbnN0ZWFkLgorCisgICAgICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIHNraXAgc2lsZW5jZSAoYW5kIGNvbnN1bWUgaW5wdXQgZGF0YSkKKyAgICAgICAgICAgICAgICAvLyBpZiBtSXNGaXJzdCBpcyB0cnVlIGFzIHdlIG1heSBub3QgaGF2ZSBhIHZhbGlkCisgICAgICAgICAgICAgICAgLy8gbUNvbmZpZy0+c2FtcGxpbmdSYXRlIGFuZCBtQ29uZmlnLT5udW1fY2hhbm5lbHM/CisgICAgICAgICAgICAgICAgQUxPR1ZfSUYobUlzRmlyc3QsICJpbnN1ZmZpY2llbnQgZGF0YSBmb3IgZmlyc3QgZnJhbWUsIHNlbmRpbmcgc2lsZW5jZSIpOwogICAgICAgICAgICAgICAgIG1lbXNldChvdXRIZWFkZXItPnBCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KSk7CkBAIC0zMjUsOCArMzQ2LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9Ci0gICAgICAgICAgICBtQW5jaG9yVGltZVVzCi0gICAgICAgICAgICAgICAgKyAobU51bUZyYW1lc091dHB1dCAqIDEwMDAwMDBsbCkgLyBtQ29uZmlnLT5zYW1wbGluZ1JhdGU7CisgICAgICAgICAgICBtQW5jaG9yVGltZVVzICsgKG1OdW1GcmFtZXNPdXRwdXQgKiAxMDAwMDAwbGwpIC8gbVNhbXBsaW5nUmF0ZTsKIAogICAgICAgICBpZiAoaW5IZWFkZXIpIHsKICAgICAgICAgICAgIENIRUNLX0dFKGluSGVhZGVyLT5uRmlsbGVkTGVuLCBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL1NvZnRNUEVHMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmNwcAppbmRleCA3ZTk4OTI4Li4yOWI2MmZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmNwcApAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgIml2X2RhdGF0eXBlZGVmLmgiCiAjaW5jbHVkZSAiaXYuaCIKICNpbmNsdWRlICJpdmQuaCIKLSNpbmNsdWRlICJpdGhyZWFkLmgiCiAjaW5jbHVkZSAiaW1wZWcyZC5oIgogI2luY2x1ZGUgIlNvZnRNUEVHMi5oIgogCkBAIC0xNTYsNyArMTU1LDcgQEAKICAgICBzX2N0bF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90KTsKICAgICBzX2N0bF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90KTsKIAotICAgIEFMT0dWKCJTZXQgdGhlIHJ1bi10aW1lIChkeW5hbWljKSBwYXJhbWV0ZXJzIHN0cmlkZSA9ICV1Iiwgc3RyaWRlKTsKKyAgICBBTE9HVigiU2V0IHRoZSBydW4tdGltZSAoZHluYW1pYykgcGFyYW1ldGVycyBzdHJpZGUgPSAlenUiLCBzdHJpZGUpOwogICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfY3RsX2lwLCAodm9pZCAqKSZzX2N0bF9vcCk7CiAKICAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKQEAgLTM5Niw3ICszOTUsNyBAQAogICAgIHVpbnQzMl90IGJ1ZmZlclNpemUgPSBkaXNwbGF5U2l6ZVkgKiAzIC8gMjsKICAgICBtRmx1c2hPdXRCdWZmZXIgPSAodWludDhfdCAqKWl2ZF9hbGlnbmVkX21hbGxvYygxMjgsIGJ1ZmZlclNpemUpOwogICAgIGlmIChOVUxMID09IG1GbHVzaE91dEJ1ZmZlcikgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IGFsbG9jYXRlIGZsdXNoT3V0cHV0QnVmZmVyIG9mIHNpemUgJXp1IiwgYnVmZmVyU2l6ZSk7CisgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgYWxsb2NhdGUgZmx1c2hPdXRwdXRCdWZmZXIgb2Ygc2l6ZSAldSIsIGJ1ZmZlclNpemUpOwogICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgIH0KIApAQCAtNDY2LDcgKzQ2NSw3IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotdm9pZCBTb2Z0TVBFRzI6OnNldERlY29kZUFyZ3MoCitib29sIFNvZnRNUEVHMjo6c2V0RGVjb2RlQXJncygKICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNfaXAsCiAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjX29wLAogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIsCkBAIC00NzQsNyArNDczLDYgQEAKICAgICAgICAgc2l6ZV90IHRpbWVTdGFtcEl4KSB7CiAgICAgc2l6ZV90IHNpemVZID0gb3V0cHV0QnVmZmVyV2lkdGgoKSAqIG91dHB1dEJ1ZmZlckhlaWdodCgpOwogICAgIHNpemVfdCBzaXplVVY7Ci0gICAgdWludDhfdCAqcEJ1ZjsKIAogICAgIHBzX2RlY19pcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX2lwX3QpOwogICAgIHBzX2RlY19vcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX29wX3QpOwpAQCAtNDk0LDIyICs0OTIsMjggQEAKICAgICAgICAgcHNfZGVjX2lwLT51NF9udW1fQnl0ZXMgPSAwOwogICAgIH0KIAotICAgIGlmIChvdXRIZWFkZXIpIHsKLSAgICAgICAgcEJ1ZiA9IG91dEhlYWRlci0+cEJ1ZmZlcjsKLSAgICB9IGVsc2UgewotICAgICAgICBwQnVmID0gbUZsdXNoT3V0QnVmZmVyOwotICAgIH0KLQogICAgIHNpemVVViA9IHNpemVZIC8gNDsKICAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzBdID0gc2l6ZVk7CiAgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsxXSA9IHNpemVVVjsKICAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzJdID0gc2l6ZVVWOwogCisgICAgdWludDhfdCAqcEJ1ZjsKKyAgICBpZiAob3V0SGVhZGVyKSB7CisgICAgICAgIGlmIChvdXRIZWFkZXItPm5BbGxvY0xlbiA8IHNpemVZICsgKHNpemVVViAqIDIpKSB7CisgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3ODMzNjE2Iik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcEJ1ZiA9IG91dEhlYWRlci0+cEJ1ZmZlcjsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBtRmx1c2hPdXRCdWZmZXIgYWx3YXlzIGhhcyB0aGUgcmlnaHQgc2l6ZS4KKyAgICAgICAgcEJ1ZiA9IG1GbHVzaE91dEJ1ZmZlcjsKKyAgICB9CisKICAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IHBCdWY7CiAgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBwQnVmICsgc2l6ZVk7CiAgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBwQnVmICsgc2l6ZVkgKyBzaXplVVY7CiAgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIudTRfbnVtX2J1ZnMgPSAzOwotICAgIHJldHVybjsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHZvaWQgU29mdE1QRUcyOjpvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCkgewogICAgIC8qIE9uY2UgdGhlIG91dHB1dCBidWZmZXJzIGFyZSBmbHVzaGVkLCBpZ25vcmUgYW55IGJ1ZmZlcnMgdGhhdCBhcmUgaGVsZCBpbiBkZWNvZGVyICovCkBAIC02MjIsNyArNjI2LDExIEBACiAgICAgICAgICAgICBXT1JEMzIgdGltZURlbGF5LCB0aW1lVGFrZW47CiAgICAgICAgICAgICBzaXplX3Qgc2l6ZVksIHNpemVVVjsKIAotICAgICAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNfaXAsICZzX2RlY19vcCwgaW5IZWFkZXIsIG91dEhlYWRlciwgdGltZVN0YW1wSXgpOworICAgICAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY19pcCwgJnNfZGVjX29wLCBpbkhlYWRlciwgb3V0SGVhZGVyLCB0aW1lU3RhbXBJeCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRGVjb2RlciBhcmcgc2V0dXAgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIElmIGlucHV0IGR1bXAgaXMgZW5hYmxlZCwgdGhlbiB3cml0ZSB0byBmaWxlCiAgICAgICAgICAgICBEVU1QX1RPX0ZJTEUobUluRmlsZSwgc19kZWNfaXAucHZfc3RyZWFtX2J1ZmZlciwgc19kZWNfaXAudTRfbnVtX0J5dGVzKTsKIApAQCAtNjY1LDkgKzY3Myw5IEBACiAKICAgICAgICAgICAgICAgICBDSEVDS19FUShyZUluaXREZWNvZGVyKCksIChzdGF0dXNfdClPSyk7CiAKLSAgICAgICAgICAgICAgICBzZXREZWNvZGVBcmdzKCZzX2RlY19pcCwgJnNfZGVjX29wLCBpbkhlYWRlciwgb3V0SGVhZGVyLCB0aW1lU3RhbXBJeCk7Ci0KLSAgICAgICAgICAgICAgICBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2RlY19pcCwgKHZvaWQgKikmc19kZWNfb3ApOworICAgICAgICAgICAgICAgIGlmIChzZXREZWNvZGVBcmdzKCZzX2RlY19pcCwgJnNfZGVjX29wLCBpbkhlYWRlciwgb3V0SGVhZGVyLCB0aW1lU3RhbXBJeCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19kZWNfaXAsICh2b2lkICopJnNfZGVjX29wKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmgKaW5kZXggYTYyNWUwOC4uZjQ4YjcwYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL1NvZnRNUEVHMi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9Tb2Z0TVBFRzIuaApAQCAtMTE3LDcgKzExNyw3IEBACiAgICAgc3RhdHVzX3QgcmVzZXRQbHVnaW4oKTsKICAgICBzdGF0dXNfdCByZUluaXREZWNvZGVyKCk7CiAKLSAgICB2b2lkIHNldERlY29kZUFyZ3MoCisgICAgYm9vbCBzZXREZWNvZGVBcmdzKAogICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNfaXAsCiAgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY19vcCwKICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAKaW5kZXggMjU4NjYwNi4uMDJlODVhMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAKQEAgLTM4LDcgKzM4LDEwIEBACiAgICAgICAgICAgICBOVUxMIC8qIHByb2ZpbGVMZXZlbHMgKi8sIDAgLyogbnVtUHJvZmlsZUxldmVscyAqLywKICAgICAgICAgICAgIDMyMCAvKiB3aWR0aCAqLywgMjQwIC8qIGhlaWdodCAqLywgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAogICAgICAgbU1vZGUoY29kaW5nVHlwZSA9PSBPTVhfVklERU9fQ29kaW5nVlA4ID8gTU9ERV9WUDggOiBNT0RFX1ZQOSksCisgICAgICBtRU9TU3RhdHVzKElOUFVUX0RBVEFfQVZBSUxBQkxFKSwKICAgICAgIG1DdHgoTlVMTCksCisgICAgICBtRnJhbWVQYXJhbGxlbE1vZGUoZmFsc2UpLAorICAgICAgbVRpbWVTdGFtcElkeCgwKSwKICAgICAgIG1JbWcoTlVMTCkgewogICAgIC8vIGFyYml0cmFyeSBmcm9tIGF2Yy9oZXZjIGFzIHZweCBkb2VzIG5vdCBzcGVjaWZ5IGEgbWluIGNvbXByZXNzaW9uIHJhdGlvCiAgICAgY29uc3Qgc2l6ZV90IGtNaW5Db21wcmVzc2lvblJhdGlvID0gbU1vZGUgPT0gTU9ERV9WUDggPyAyIDogNDsKQEAgLTUxLDkgKzU0LDcgQEAKIH0KIAogU29mdFZQWDo6flNvZnRWUFgoKSB7Ci0gICAgdnB4X2NvZGVjX2Rlc3Ryb3koKHZweF9jb2RlY19jdHhfdCAqKW1DdHgpOwotICAgIGRlbGV0ZSAodnB4X2NvZGVjX2N0eF90ICopbUN0eDsKLSAgICBtQ3R4ID0gTlVMTDsKKyAgICBkZXN0cm95RGVjb2RlcigpOwogfQogCiBzdGF0aWMgaW50IEdldENQVUNvcmVDb3VudCgpIHsKQEAgLTczLDEyICs3NCwxOSBAQAogICAgIG1DdHggPSBuZXcgdnB4X2NvZGVjX2N0eF90OwogICAgIHZweF9jb2RlY19lcnJfdCB2cHhfZXJyOwogICAgIHZweF9jb2RlY19kZWNfY2ZnX3QgY2ZnOworICAgIHZweF9jb2RlY19mbGFnc190IGZsYWdzOwogICAgIG1lbXNldCgmY2ZnLCAwLCBzaXplb2YodnB4X2NvZGVjX2RlY19jZmdfdCkpOworICAgIG1lbXNldCgmZmxhZ3MsIDAsIHNpemVvZih2cHhfY29kZWNfZmxhZ3NfdCkpOwogICAgIGNmZy50aHJlYWRzID0gR2V0Q1BVQ29yZUNvdW50KCk7CisKKyAgICBpZiAobUZyYW1lUGFyYWxsZWxNb2RlKSB7CisgICAgICAgIGZsYWdzIHw9IFZQWF9DT0RFQ19VU0VfRlJBTUVfVEhSRUFESU5HOworICAgIH0KKwogICAgIGlmICgodnB4X2VyciA9IHZweF9jb2RlY19kZWNfaW5pdCgKICAgICAgICAgICAgICAgICAodnB4X2NvZGVjX2N0eF90ICopbUN0eCwKICAgICAgICAgICAgICAgICAgbU1vZGUgPT0gTU9ERV9WUDggPyAmdnB4X2NvZGVjX3ZwOF9keF9hbGdvIDogJnZweF9jb2RlY192cDlfZHhfYWxnbywKLSAgICAgICAgICAgICAgICAgJmNmZywgMCkpKSB7CisgICAgICAgICAgICAgICAgICZjZmcsIGZsYWdzKSkpIHsKICAgICAgICAgQUxPR0UoIm9uMiBkZWNvZGVyIGZhaWxlZCB0byBpbml0aWFsaXplLiAoJWQpIiwgdnB4X2Vycik7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KQEAgLTg2LDkxICs5NCwxNjAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IFNvZnRWUFg6OmRlc3Ryb3lEZWNvZGVyKCkgeworICAgIHZweF9jb2RlY19kZXN0cm95KCh2cHhfY29kZWNfY3R4X3QgKiltQ3R4KTsKKyAgICBkZWxldGUgKHZweF9jb2RlY19jdHhfdCAqKW1DdHg7CisgICAgbUN0eCA9IE5VTEw7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIFNvZnRWUFg6Om91dHB1dEJ1ZmZlcnMoYm9vbCBmbHVzaERlY29kZXIsIGJvb2wgZGlzcGxheSwgYm9vbCBlb3MsIGJvb2wgKnBvcnRXaWxsUmVzZXQpIHsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoMCk7CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZSgxKTsKKyAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gTlVMTDsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gTlVMTDsKKyAgICB2cHhfY29kZWNfaXRlcl90IGl0ZXIgPSBOVUxMOworCisgICAgaWYgKGZsdXNoRGVjb2RlciAmJiBtRnJhbWVQYXJhbGxlbE1vZGUpIHsKKyAgICAgICAgLy8gRmx1c2ggZGVjb2RlciBieSBwYXNzaW5nIE5VTEwgZGF0YSBwdHIgYW5kIDAgc2l6ZS4KKyAgICAgICAgLy8gSWRlYWxseSwgdGhpcyBzaG91bGQgbmV2ZXIgZmFpbC4KKyAgICAgICAgaWYgKHZweF9jb2RlY19kZWNvZGUoKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsIE5VTEwsIDAsIE5VTEwsIDApKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGZsdXNoIG9uMiBkZWNvZGVyLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFkaXNwbGF5KSB7CisgICAgICAgIGlmICghZmx1c2hEZWNvZGVyKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBvcGVyYXRpb24uIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gRHJvcCBhbGwgdGhlIGRlY29kZWQgZnJhbWVzIGluIGRlY29kZXIuCisgICAgICAgIHdoaWxlICgobUltZyA9IHZweF9jb2RlY19nZXRfZnJhbWUoKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsICZpdGVyKSkpIHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB3aGlsZSAoIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgaWYgKG1JbWcgPT0gTlVMTCkgeworICAgICAgICAgICAgbUltZyA9IHZweF9jb2RlY19nZXRfZnJhbWUoKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsICZpdGVyKTsKKyAgICAgICAgICAgIGlmIChtSW1nID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCB3aWR0aCA9IG1JbWctPmRfdzsKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0ID0gbUltZy0+ZF9oOworICAgICAgICBvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CisgICAgICAgIG91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CisgICAgICAgIENIRUNLX0VRKG1JbWctPmZtdCwgVlBYX0lNR19GTVRfSTQyMCk7CisgICAgICAgIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZShwb3J0V2lsbFJlc2V0LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgaWYgKCpwb3J0V2lsbFJlc2V0KSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIG91dEhlYWRlci0+bk9mZnNldCA9IDA7CisgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gMDsKKyAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gKG91dHB1dEJ1ZmZlcldpZHRoKCkgKiBvdXRwdXRCdWZmZXJIZWlnaHQoKSAqIDMpIC8gMjsKKyAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gKihPTVhfVElDS1MgKiltSW1nLT51c2VyX3ByaXY7CisgICAgICAgIGlmIChvdXRIZWFkZXItPm5BbGxvY0xlbiA+PSBvdXRIZWFkZXItPm5GaWxsZWRMZW4pIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IG91dEhlYWRlci0+cEJ1ZmZlcjsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKW1JbWctPnBsYW5lc1tWUFhfUExBTkVfWV07CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNVID0gKGNvbnN0IHVpbnQ4X3QgKiltSW1nLT5wbGFuZXNbVlBYX1BMQU5FX1VdOworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjViA9IChjb25zdCB1aW50OF90ICopbUltZy0+cGxhbmVzW1ZQWF9QTEFORV9WXTsKKyAgICAgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlID0gbUltZy0+c3RyaWRlW1ZQWF9QTEFORV9ZXTsKKyAgICAgICAgICAgIHNpemVfdCBzcmNVU3RyaWRlID0gbUltZy0+c3RyaWRlW1ZQWF9QTEFORV9VXTsKKyAgICAgICAgICAgIHNpemVfdCBzcmNWU3RyaWRlID0gbUltZy0+c3RyaWRlW1ZQWF9QTEFORV9WXTsKKyAgICAgICAgICAgIGNvcHlZVjEyRnJhbWVUb091dHB1dEJ1ZmZlcihkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoImIvMjc1OTcxMDMsIGJ1ZmZlciB0b28gc21hbGwiKTsKKyAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjc1OTcxMDMiKTsKKyAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgIH0KKworICAgICAgICBtSW1nID0gTlVMTDsKKyAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgb3V0SW5mbyA9IE5VTEw7CisgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKCFlb3MpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKCFvdXRRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIG91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKKyAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgICAgIG91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CisgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IDA7CisgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgIG1FT1NTdGF0dXMgPSBPVVRQVVRfRlJBTUVTX0ZMVVNIRUQ7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCiB2b2lkIFNvZnRWUFg6Om9uUXVldWVGaWxsZWQoT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKLSAgICBpZiAobU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSAhPSBOT05FKSB7CisgICAgaWYgKG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgIT0gTk9ORSB8fCBtRU9TU3RhdHVzID09IE9VVFBVVF9GUkFNRVNfRkxVU0hFRCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOwogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CiAgICAgYm9vbCBFT1NzZWVuID0gZmFsc2U7CisgICAgdnB4X2NvZGVjX2Vycl90IGVycjsKKyAgICBib29sIHBvcnRXaWxsUmVzZXQgPSBmYWxzZTsKIAotICAgIHdoaWxlICghaW5RdWV1ZS5lbXB0eSgpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKLQotICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOwotCi0gICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7Ci0gICAgICAgICAgICBFT1NzZWVuID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7Ci0KLSAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOwotICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOwotCi0gICAgICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1JbWcgPT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKHZweF9jb2RlY19kZWNvZGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAodnB4X2NvZGVjX2N0eF90ICopbUN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAwKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJvbjIgZGVjb2RlciBmYWlsZWQgdG8gZGVjb2RlIGZyYW1lLiIpOwotCisgICAgd2hpbGUgKChtRU9TU3RhdHVzID09IElOUFVUX0VPU19TRUVOIHx8ICFpblF1ZXVlLmVtcHR5KCkpCisgICAgICAgICAgICAmJiAhb3V0UXVldWUuZW1wdHkoKSkgeworICAgICAgICAvLyBPdXRwdXQgdGhlIHBlbmRpbmcgZnJhbWVzIHRoYXQgbGVmdCBmcm9tIGxhc3QgcG9ydCByZXNldCBvciBkZWNvZGVyIGZsdXNoLgorICAgICAgICBpZiAobUVPU1N0YXR1cyA9PSBJTlBVVF9FT1NfU0VFTiB8fCBtSW1nICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICghb3V0cHV0QnVmZmVycygKKyAgICAgICAgICAgICAgICAgICAgIG1FT1NTdGF0dXMgPT0gSU5QVVRfRU9TX1NFRU4sIHRydWUgLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgICAgICAgIG1FT1NTdGF0dXMgPT0gSU5QVVRfRU9TX1NFRU4sICZwb3J0V2lsbFJlc2V0KSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJvbjIgZGVjb2RlciBmYWlsZWQgdG8gb3V0cHV0IGZyYW1lLiIpOwogICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB2cHhfY29kZWNfaXRlcl90IGl0ZXIgPSBOVUxMOwotICAgICAgICAgICAgbUltZyA9IHZweF9jb2RlY19nZXRfZnJhbWUoKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsICZpdGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSW1nICE9IE5VTEwpIHsKLSAgICAgICAgICAgIENIRUNLX0VRKG1JbWctPmZtdCwgSU1HX0ZNVF9JNDIwKTsKLQotICAgICAgICAgICAgdWludDMyX3Qgd2lkdGggPSBtSW1nLT5kX3c7Ci0gICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQgPSBtSW1nLT5kX2g7Ci0gICAgICAgICAgICBib29sIHBvcnRXaWxsUmVzZXQgPSBmYWxzZTsKLSAgICAgICAgICAgIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgmcG9ydFdpbGxSZXNldCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICBpZiAocG9ydFdpbGxSZXNldCkgeworICAgICAgICAgICAgaWYgKHBvcnRXaWxsUmVzZXQgfHwgbUVPU1N0YXR1cyA9PSBPVVRQVVRfRlJBTUVTX0ZMVVNIRUQgfHwKKyAgICAgICAgICAgICAgICAgICAgbUVPU1N0YXR1cyA9PSBJTlBVVF9FT1NfU0VFTikgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0gICAgICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOwotICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gKG91dHB1dEJ1ZmZlcldpZHRoKCkgKiBvdXRwdXRCdWZmZXJIZWlnaHQoKSAqIDMpIC8gMjsKLSAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gRU9Tc2VlbiA/IE9NWF9CVUZGRVJGTEFHX0VPUyA6IDA7Ci0gICAgICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKLSAgICAgICAgICAgIGlmIChvdXRIZWFkZXItPm5BbGxvY0xlbiA+PSBvdXRIZWFkZXItPm5GaWxsZWRMZW4pIHsKLSAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QgPSBvdXRIZWFkZXItPnBCdWZmZXI7Ci0gICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopbUltZy0+cGxhbmVzW1ZQWF9QTEFORV9ZXTsKLSAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNVID0gKGNvbnN0IHVpbnQ4X3QgKiltSW1nLT5wbGFuZXNbVlBYX1BMQU5FX1VdOwotICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSAoY29uc3QgdWludDhfdCAqKW1JbWctPnBsYW5lc1tWUFhfUExBTkVfVl07Ci0gICAgICAgICAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUgPSBtSW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ldOwotICAgICAgICAgICAgICAgIHNpemVfdCBzcmNVU3RyaWRlID0gbUltZy0+c3RyaWRlW1ZQWF9QTEFORV9VXTsKLSAgICAgICAgICAgICAgICBzaXplX3Qgc3JjVlN0cmlkZSA9IG1JbWctPnN0cmlkZVtWUFhfUExBTkVfVl07Ci0gICAgICAgICAgICAgICAgY29weVlWMTJGcmFtZVRvT3V0cHV0QnVmZmVyKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI3NTk3MTAzLCBidWZmZXIgdG9vIHNtYWxsIik7Ci0gICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzU5NzEwMyIpOwotICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7Ci0gICAgICAgICAgICB9CisgICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKKyAgICAgICAgbVRpbWVTdGFtcHNbbVRpbWVTdGFtcElkeF0gPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKIAotICAgICAgICAgICAgbUltZyA9IE5VTEw7Ci0gICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgICAgIG91dEluZm8gPSBOVUxMOwotICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKLSAgICAgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CisgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CisgICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICBtRU9TU3RhdHVzID0gSU5QVVRfRU9TX1NFRU47CisgICAgICAgICAgICBFT1NzZWVuID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA+IDAgJiYKKyAgICAgICAgICAgIHZweF9jb2RlY19kZWNvZGUoKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVRpbWVTdGFtcHNbbVRpbWVTdGFtcElkeF0sIDApKSB7CisgICAgICAgICAgICBBTE9HRSgib24yIGRlY29kZXIgZmFpbGVkIHRvIGRlY29kZSBmcmFtZS4iKTsKKyAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtVGltZVN0YW1wSWR4ID0gKG1UaW1lU3RhbXBJZHggKyAxKSAlIGtOdW1CdWZmZXJzOworCisgICAgICAgIGlmICghb3V0cHV0QnVmZmVycygKKyAgICAgICAgICAgICAgICAgRU9Tc2VlbiAvKiBmbHVzaERlY29kZXIgKi8sIHRydWUgLyogZGlzcGxheSAqLywgRU9Tc2VlbiwgJnBvcnRXaWxsUmVzZXQpKSB7CisgICAgICAgICAgICBBTE9HRSgib24yIGRlY29kZXIgZmFpbGVkIHRvIG91dHB1dCBmcmFtZS4iKTsKKyAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAocG9ydFdpbGxSZXNldCkgeworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CkBAIC0xODEsNiArMjU4LDMwIEBACiAgICAgfQogfQogCit2b2lkIFNvZnRWUFg6Om9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7CisgICAgaWYgKHBvcnRJbmRleCA9PSBrSW5wdXRQb3J0SW5kZXgpIHsKKyAgICAgICAgYm9vbCBwb3J0V2lsbFJlc2V0ID0gZmFsc2U7CisgICAgICAgIGlmICghb3V0cHV0QnVmZmVycygKKyAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBmbHVzaERlY29kZXIgKi8sIGZhbHNlIC8qIGRpc3BsYXkgKi8sIGZhbHNlIC8qIGVvcyAqLywgJnBvcnRXaWxsUmVzZXQpKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGZsdXNoIGRlY29kZXIuIik7CisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUVPU1N0YXR1cyA9IElOUFVUX0RBVEFfQVZBSUxBQkxFOworICAgIH0KK30KKwordm9pZCBTb2Z0VlBYOjpvblJlc2V0KCkgeworICAgIGJvb2wgcG9ydFdpbGxSZXNldCA9IGZhbHNlOworICAgIGlmICghb3V0cHV0QnVmZmVycygKKyAgICAgICAgICAgICB0cnVlIC8qIGZsdXNoRGVjb2RlciAqLywgZmFsc2UgLyogZGlzcGxheSAqLywgZmFsc2UgLyogZW9zICovLCAmcG9ydFdpbGxSZXNldCkpIHsKKyAgICAgICAgQUxPR1coIkZhaWxlZCB0byBmbHVzaCBkZWNvZGVyLiBUcnkgdG8gaGFyZCByZXNldCBkZWNvZGVyIik7CisgICAgICAgIGRlc3Ryb3lEZWNvZGVyKCk7CisgICAgICAgIGluaXREZWNvZGVyKCk7CisgICAgfQorICAgIG1FT1NTdGF0dXMgPSBJTlBVVF9EQVRBX0FWQUlMQUJMRTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaAppbmRleCA4ZjY4NjkzLi44Y2NiYWUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oCkBAIC0zOCw2ICszOCw4IEBACiAgICAgdmlydHVhbCB+U29mdFZQWCgpOwogCiAgICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUmVzZXQoKTsKIAogcHJpdmF0ZToKICAgICBlbnVtIHsKQEAgLTQ5LDExICs1MSwyMSBAQAogICAgICAgICBNT0RFX1ZQOQogICAgIH0gbU1vZGU7CiAKLSAgICB2b2lkICptQ3R4OworICAgIGVudW0geworICAgICAgICBJTlBVVF9EQVRBX0FWQUlMQUJMRSwgIC8vIFZQWCBjb21wb25lbnQgaXMgcmVhZHkgdG8gZGVjb2RlIGRhdGEuCisgICAgICAgIElOUFVUX0VPU19TRUVOLCAgICAgICAgLy8gVlBYIGNvbXBvbmVudCBzYXcgRU9TIGFuZCBpcyBmbHVzaGluZyBPbjIgZGVjb2Rlci4KKyAgICAgICAgT1VUUFVUX0ZSQU1FU19GTFVTSEVEICAvLyBWUFggY29tcG9uZW50IGZpbmlzaGVkIGZsdXNoaW5nIE9uMiBkZWNvZGVyLgorICAgIH0gbUVPU1N0YXR1czsKIAorICAgIHZvaWQgKm1DdHg7CisgICAgYm9vbCBtRnJhbWVQYXJhbGxlbE1vZGU7ICAvLyBGcmFtZSBwYXJhbGxlbCBpcyBvbmx5IHN1cHBvcnRlZCBieSBWUDkgZGVjb2Rlci4KKyAgICBPTVhfVElDS1MgbVRpbWVTdGFtcHNba051bUJ1ZmZlcnNdOworICAgIHVpbnQ4X3QgbVRpbWVTdGFtcElkeDsKICAgICB2cHhfaW1hZ2VfdCAqbUltZzsKIAogICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgc3RhdHVzX3QgZGVzdHJveURlY29kZXIoKTsKKyAgICBib29sIG91dHB1dEJ1ZmZlcnMoYm9vbCBmbHVzaERlY29kZXIsIGJvb2wgZGlzcGxheSwgYm9vbCBlb3MsIGJvb2wgKnBvcnRXaWxsUmVzZXQpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdFZQWCk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwCmluZGV4IDE3NWVmMDYuLjVjOTUwYzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAKQEAgLTM2OCwyMCArMzY4LDI0IEBACiAgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUgKmJpdHJhdGUgPQogICAgICAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUgKilwYXJhbTsKIAotICAgICAgICAgICAgICAgIGlmIChiaXRyYXRlLT5uUG9ydEluZGV4ICE9IGtPdXRwdXRQb3J0SW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oYml0cmF0ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgYml0cmF0ZS0+blRhcmdldEJpdHJhdGUgPSBtQml0cmF0ZTsKKyAgICAgICAgICAgIGlmIChiaXRyYXRlLT5uUG9ydEluZGV4ICE9IGtPdXRwdXRQb3J0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtQml0cmF0ZUNvbnRyb2xNb2RlID09IFZQWF9WQlIpIHsKLSAgICAgICAgICAgICAgICAgICAgYml0cmF0ZS0+ZUNvbnRyb2xSYXRlID0gT01YX1ZpZGVvX0NvbnRyb2xSYXRlVmFyaWFibGU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtQml0cmF0ZUNvbnRyb2xNb2RlID09IFZQWF9DQlIpIHsKLSAgICAgICAgICAgICAgICAgICAgYml0cmF0ZS0+ZUNvbnRyb2xSYXRlID0gT01YX1ZpZGVvX0NvbnRyb2xSYXRlQ29uc3RhbnQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgICAgICBiaXRyYXRlLT5uVGFyZ2V0Qml0cmF0ZSA9IG1CaXRyYXRlOworCisgICAgICAgICAgICBpZiAobUJpdHJhdGVDb250cm9sTW9kZSA9PSBWUFhfVkJSKSB7CisgICAgICAgICAgICAgICAgYml0cmF0ZS0+ZUNvbnRyb2xSYXRlID0gT01YX1ZpZGVvX0NvbnRyb2xSYXRlVmFyaWFibGU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1CaXRyYXRlQ29udHJvbE1vZGUgPT0gVlBYX0NCUikgeworICAgICAgICAgICAgICAgIGJpdHJhdGUtPmVDb250cm9sUmF0ZSA9IE9NWF9WaWRlb19Db250cm9sUmF0ZUNvbnN0YW50OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBWUDggc3BlY2lmaWMgcGFyYW1ldGVycyB0aGF0IHVzZSBleHRlbnNpb24gaGVhZGVycwpAQCAtMzg5LDMzICszOTMsNDEgQEAKICAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9WUDhUWVBFICp2cDhQYXJhbXMgPQogICAgICAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fVlA4VFlQRSAqKXBhcmFtOwogCi0gICAgICAgICAgICAgICAgaWYgKHZwOFBhcmFtcy0+blBvcnRJbmRleCAhPSBrT3V0cHV0UG9ydEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKHZwOFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgdnA4UGFyYW1zLT5lUHJvZmlsZSA9IE9NWF9WSURFT19WUDhQcm9maWxlTWFpbjsKLSAgICAgICAgICAgICAgICB2cDhQYXJhbXMtPmVMZXZlbCA9IG1MZXZlbDsKLSAgICAgICAgICAgICAgICB2cDhQYXJhbXMtPm5EQ1RQYXJ0aXRpb25zID0gbURDVFBhcnRpdGlvbnM7Ci0gICAgICAgICAgICAgICAgdnA4UGFyYW1zLT5iRXJyb3JSZXNpbGllbnRNb2RlID0gbUVycm9yUmVzaWxpZW5jZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgIGlmICh2cDhQYXJhbXMtPm5Qb3J0SW5kZXggIT0ga091dHB1dFBvcnRJbmRleCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2cDhQYXJhbXMtPmVQcm9maWxlID0gT01YX1ZJREVPX1ZQOFByb2ZpbGVNYWluOworICAgICAgICAgICAgdnA4UGFyYW1zLT5lTGV2ZWwgPSBtTGV2ZWw7CisgICAgICAgICAgICB2cDhQYXJhbXMtPm5EQ1RQYXJ0aXRpb25zID0gbURDVFBhcnRpdGlvbnM7CisgICAgICAgICAgICB2cDhQYXJhbXMtPmJFcnJvclJlc2lsaWVudE1vZGUgPSBtRXJyb3JSZXNpbGllbmNlOworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9BbmRyb2lkVnA4RW5jb2RlcjogewogICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX0FORFJPSURfVlA4RU5DT0RFUlRZUEUgKnZwOEFuZHJvaWRQYXJhbXMgPQogICAgICAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9WUDhFTkNPREVSVFlQRSAqKXBhcmFtOwogCi0gICAgICAgICAgICAgICAgaWYgKHZwOEFuZHJvaWRQYXJhbXMtPm5Qb3J0SW5kZXggIT0ga091dHB1dFBvcnRJbmRleCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbSh2cDhBbmRyb2lkUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICB2cDhBbmRyb2lkUGFyYW1zLT5uS2V5RnJhbWVJbnRlcnZhbCA9IG1LZXlGcmFtZUludGVydmFsOwotICAgICAgICAgICAgICAgIHZwOEFuZHJvaWRQYXJhbXMtPmVUZW1wb3JhbFBhdHRlcm4gPSBtVGVtcG9yYWxQYXR0ZXJuVHlwZTsKLSAgICAgICAgICAgICAgICB2cDhBbmRyb2lkUGFyYW1zLT5uVGVtcG9yYWxMYXllckNvdW50ID0gbVRlbXBvcmFsTGF5ZXJzOwotICAgICAgICAgICAgICAgIHZwOEFuZHJvaWRQYXJhbXMtPm5NaW5RdWFudGl6ZXIgPSBtTWluUXVhbnRpemVyOwotICAgICAgICAgICAgICAgIHZwOEFuZHJvaWRQYXJhbXMtPm5NYXhRdWFudGl6ZXIgPSBtTWF4UXVhbnRpemVyOwotICAgICAgICAgICAgICAgIG1lbWNweSh2cDhBbmRyb2lkUGFyYW1zLT5uVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW8sIHNpemVvZihtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpbykpOwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgaWYgKHZwOEFuZHJvaWRQYXJhbXMtPm5Qb3J0SW5kZXggIT0ga091dHB1dFBvcnRJbmRleCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2cDhBbmRyb2lkUGFyYW1zLT5uS2V5RnJhbWVJbnRlcnZhbCA9IG1LZXlGcmFtZUludGVydmFsOworICAgICAgICAgICAgdnA4QW5kcm9pZFBhcmFtcy0+ZVRlbXBvcmFsUGF0dGVybiA9IG1UZW1wb3JhbFBhdHRlcm5UeXBlOworICAgICAgICAgICAgdnA4QW5kcm9pZFBhcmFtcy0+blRlbXBvcmFsTGF5ZXJDb3VudCA9IG1UZW1wb3JhbExheWVyczsKKyAgICAgICAgICAgIHZwOEFuZHJvaWRQYXJhbXMtPm5NaW5RdWFudGl6ZXIgPSBtTWluUXVhbnRpemVyOworICAgICAgICAgICAgdnA4QW5kcm9pZFBhcmFtcy0+bk1heFF1YW50aXplciA9IG1NYXhRdWFudGl6ZXI7CisgICAgICAgICAgICBtZW1jcHkodnA4QW5kcm9pZFBhcmFtcy0+blRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW8sCisgICAgICAgICAgICAgICAgICAgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW8sIHNpemVvZihtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpbykpOworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAogICAgICAgICBkZWZhdWx0OgpAQCAtNDMwLDE3ICs0NDIsMzggQEAKICAgICBjb25zdCBpbnQzMl90IGluZGV4RnVsbCA9IGluZGV4OwogCiAgICAgc3dpdGNoIChpbmRleEZ1bGwpIHsKLSAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvQml0cmF0ZToKLSAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbFNldEJpdHJhdGVQYXJhbXMoCi0gICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSAqKXBhcmFtKTsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvQml0cmF0ZTogeworICAgICAgICAgICAgY29uc3QgT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFICpiaXRSYXRlID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFKikgcGFyYW07CiAKLSAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvVnA4OgotICAgICAgICAgICAgcmV0dXJuIGludGVybmFsU2V0VnA4UGFyYW1zKAotICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVklERU9fUEFSQU1fVlA4VFlQRSAqKXBhcmFtKTsKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGJpdFJhdGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KIAotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9BbmRyb2lkVnA4RW5jb2RlcjoKLSAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbFNldEFuZHJvaWRWcDhQYXJhbXMoCi0gICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9WSURFT19QQVJBTV9BTkRST0lEX1ZQOEVOQ09ERVJUWVBFICopcGFyYW0pOworICAgICAgICAgICAgcmV0dXJuIGludGVybmFsU2V0Qml0cmF0ZVBhcmFtcyhiaXRSYXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1ZwODogeworICAgICAgICAgICAgY29uc3QgT01YX1ZJREVPX1BBUkFNX1ZQOFRZUEUgKnZwOFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9WSURFT19QQVJBTV9WUDhUWVBFKikgcGFyYW07CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKHZwOFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxTZXRWcDhQYXJhbXModnA4UGFyYW1zKTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0FuZHJvaWRWcDhFbmNvZGVyOiB7CisgICAgICAgICAgICBjb25zdCBPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9WUDhFTkNPREVSVFlQRSAqdnA4QW5kcm9pZFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9WSURFT19QQVJBTV9BTkRST0lEX1ZQOEVOQ09ERVJUWVBFKikgcGFyYW07CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKHZwOEFuZHJvaWRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGludGVybmFsU2V0QW5kcm9pZFZwOFBhcmFtcyh2cDhBbmRyb2lkUGFyYW1zKTsKKyAgICAgICAgfQogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtKTsKQEAgLTQ1NSw2ICs0ODgsMTAgQEAKICAgICAgICAgICAgIE9NWF9DT05GSUdfSU5UUkFSRUZSRVNIVk9QVFlQRSAqcGFyYW1zID0KICAgICAgICAgICAgICAgICAoT01YX0NPTkZJR19JTlRSQVJFRlJFU0hWT1BUWVBFICopX3BhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0ocGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChwYXJhbXMtPm5Qb3J0SW5kZXggIT0ga091dHB1dFBvcnRJbmRleCkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CiAgICAgICAgICAgICB9CkBAIC00NjgsNiArNTA1LDEwIEBACiAgICAgICAgICAgICBPTVhfVklERU9fQ09ORklHX0JJVFJBVEVUWVBFICpwYXJhbXMgPQogICAgICAgICAgICAgICAgIChPTVhfVklERU9fQ09ORklHX0JJVFJBVEVUWVBFICopX3BhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0ocGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChwYXJhbXMtPm5Qb3J0SW5kZXggIT0ga091dHB1dFBvcnRJbmRleCkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CiAgICAgICAgICAgICB9CkBAIC02NzAsNyArNzExLDggQEAKICAgICAgICAgQnVmZmVySW5mbyAqb3V0cHV0QnVmZmVySW5mbyA9ICpvdXRwdXRCdWZmZXJJbmZvUXVldWUuYmVnaW4oKTsKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dHB1dEJ1ZmZlckhlYWRlciA9IG91dHB1dEJ1ZmZlckluZm8tPm1IZWFkZXI7CiAKLSAgICAgICAgaWYgKGlucHV0QnVmZmVySGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgaWYgKChpbnB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSAmJgorICAgICAgICAgICAgICAgIGlucHV0QnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuID09IDApIHsKICAgICAgICAgICAgIGlucHV0QnVmZmVySW5mb1F1ZXVlLmVyYXNlKGlucHV0QnVmZmVySW5mb1F1ZXVlLmJlZ2luKCkpOwogICAgICAgICAgICAgaW5wdXRCdWZmZXJJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CiAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5wdXRCdWZmZXJIZWFkZXIpOwpAQCAtNzg3LDYgKzgyOSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRfcGFja2V0LT5kYXRhLmZyYW1lLnN6KTsKICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVySW5mb1F1ZXVlLmVyYXNlKG91dHB1dEJ1ZmZlckluZm9RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXRCdWZmZXJIZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dHB1dEJ1ZmZlckhlYWRlcik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCmluZGV4IGVkNTJhMzcuLjJlNDRlZDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcApAQCAtMTM0LDYgKzEzNCwxMCBAQAogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfT1BVU1RZUEUgKm9wdXNQYXJhbXMgPQogICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9PUFVTVFlQRSAqKXBhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0ob3B1c1BhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAob3B1c1BhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KQEAgLTE1Niw2ICsxNjAsMTAgQEAKICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KICAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShwY21QYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KQEAgLTE5MSw2ICsxOTksMTAgQEAKICAgICAgICAgICAgIGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcm9sZVBhcmFtcyA9CiAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqKXBhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0ocm9sZVBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoc3RybmNtcCgoY29uc3QgY2hhciAqKXJvbGVQYXJhbXMtPmNSb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIub3B1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSAtIDEpKSB7CkBAIC0yMDUsNiArMjE3LDEwIEBACiAgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9PUFVTVFlQRSAqb3B1c1BhcmFtcyA9CiAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9BTkRST0lEX09QVVNUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShvcHVzUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChvcHVzUGFyYW1zLT5uUG9ydEluZGV4ICE9IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQpAQCAtMzQ1LDkgKzM2MSwxNSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB1aW50OF90IGNoYW5uZWxfbWFwcGluZ1trTWF4Q2hhbm5lbHNdID0gezB9OwotICAgICAgICAgICAgbWVtY3B5KCZjaGFubmVsX21hcHBpbmcsCi0gICAgICAgICAgICAgICAgICAga0RlZmF1bHRPcHVzQ2hhbm5lbExheW91dCwKLSAgICAgICAgICAgICAgICAgICBrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dCk7CisgICAgICAgICAgICBpZiAobUhlYWRlci0+Y2hhbm5lbHMgPD0ga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJmNoYW5uZWxfbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAga0RlZmF1bHRPcHVzQ2hhbm5lbExheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJmNoYW5uZWxfbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+c3RyZWFtX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+Y2hhbm5lbHMpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQgc3RhdHVzID0gT1BVU19JTlZBTElEX1NUQVRFOwogICAgICAgICAgICAgbURlY29kZXIgPSBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlKGtSYXRlLApAQCAtMzk3LDYgKzQxOSwxNCBAQAogICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOwogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CiAKKyAgICAgICAgLy8gSWdub3JlIENTRCByZS1zdWJtaXNzaW9ucy4KKyAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykgeworICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKICAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOwogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKIApAQCAtNDI4LDEyICs0NTgsMTcgQEAKIAogICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOworICAgICAgICBzaXplX3QgZnJhbWVTaXplID0ga01heE9wdXNPdXRwdXRQYWNrZXRTaXplU2FtcGxlczsKKyAgICAgICAgaWYgKGZyYW1lU2l6ZSA+IG91dEhlYWRlci0+bkFsbG9jTGVuIC8gc2l6ZW9mKGludDE2X3QpIC8gbUhlYWRlci0+Y2hhbm5lbHMpIHsKKyAgICAgICAgICAgIGZyYW1lU2l6ZSA9IG91dEhlYWRlci0+bkFsbG9jTGVuIC8gc2l6ZW9mKGludDE2X3QpIC8gbUhlYWRlci0+Y2hhbm5lbHM7CisgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3ODMzNjE2Iik7CisgICAgICAgIH0KIAogICAgICAgICBpbnQgbnVtRnJhbWVzID0gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGUobURlY29kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopb3V0SGVhZGVyLT5wQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga01heE9wdXNPdXRwdXRQYWNrZXRTaXplU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwogICAgICAgICBpZiAobnVtRnJhbWVzIDwgMCkgewogICAgICAgICAgICAgQUxPR0UoIm9wdXNfbXVsdGlzdHJlYW1fZGVjb2RlIHJldHVybmVkICVkIiwgbnVtRnJhbWVzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvU29mdFJhdy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuY3BwCmluZGV4IDlkNTE0YTYuLjRmN2FlOTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvU29mdFJhdy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9Tb2Z0UmF3LmNwcApAQCAtMTAzLDYgKzEwMywxMCBAQAogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQogICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKHBjbVBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uUG9ydEluZGV4ICE9IDAgJiYgcGNtUGFyYW1zLT5uUG9ydEluZGV4ICE9IDEpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQpAQCAtMTM0LDYgKzEzOCwxMCBAQAogICAgICAgICAgICAgY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpyb2xlUGFyYW1zID0KICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShyb2xlUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChzdHJuY21wKChjb25zdCBjaGFyICopcm9sZVBhcmFtcy0+Y1JvbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5yYXciLAogICAgICAgICAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUgLSAxKSkgewpAQCAtMTQ4LDYgKzE1NiwxMCBAQAogICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQogICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKHBjbVBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uUG9ydEluZGV4ICE9IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmNwcAppbmRleCBjNTU5NjgyLi41ZjRlMzQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmNwcApAQCAtMTMwLDYgKzEzMCwxMCBAQAogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1ZPUkJJU1RZUEUgKnZvcmJpc1BhcmFtcyA9CiAgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9WT1JCSVNUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbSh2b3JiaXNQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHZvcmJpc1BhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KQEAgLTE2MSw2ICsxNjUsMTAgQEAKICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KICAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShwY21QYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KQEAgLTE5Nyw2ICsyMDUsMTAgQEAKICAgICAgICAgICAgIGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcm9sZVBhcmFtcyA9CiAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqKXBhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0ocm9sZVBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoc3RybmNtcCgoY29uc3QgY2hhciAqKXJvbGVQYXJhbXMtPmNSb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIudm9yYmlzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFIC0gMSkpIHsKQEAgLTIxMSw2ICsyMjMsMTAgQEAKICAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9WT1JCSVNUWVBFICp2b3JiaXNQYXJhbXMgPQogICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fVk9SQklTVFlQRSAqKXBhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0odm9yYmlzUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmICh2b3JiaXNQYXJhbXMtPm5Qb3J0SW5kZXggIT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CkBAIC0yNTcsNiArMjczLDEyIEBACiAKICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGhlYWRlci0+cEJ1ZmZlciArIGhlYWRlci0+bk9mZnNldDsKICAgICAgICAgc2l6ZV90IHNpemUgPSBoZWFkZXItPm5GaWxsZWRMZW47CisgICAgICAgIGlmIChzaXplIDwgNykgeworICAgICAgICAgICAgQUxPR0UoIlRvbyBzbWFsbCBpbnB1dCBidWZmZXI6ICV6dSBieXRlcyIsIHNpemUpOworICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzgzMzYxNiIpOworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKICAgICAgICAgb2dnX2J1ZmZlciBidWY7CiAgICAgICAgIG9nZ19yZWZlcmVuY2UgcmVmOwpAQCAtMzYyLDkgKzM4NCwxNCBAQAogICAgICAgICAgICAgQUxPR1coInZvcmJpc19kc3Bfc3ludGhlc2lzIHJldHVybmVkICVkIiwgZXJyKTsKICNlbmRpZgogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2l6ZV90IG51bVNhbXBsZXNQZXJCdWZmZXIgPSBrTWF4TnVtU2FtcGxlc1BlckJ1ZmZlcjsKKyAgICAgICAgICAgIGlmIChudW1TYW1wbGVzUGVyQnVmZmVyID4gb3V0SGVhZGVyLT5uQWxsb2NMZW4gLyBzaXplb2YoaW50MTZfdCkpIHsKKyAgICAgICAgICAgICAgICBudW1TYW1wbGVzUGVyQnVmZmVyID0gb3V0SGVhZGVyLT5uQWxsb2NMZW4gLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzgzMzYxNiIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbnVtRnJhbWVzID0gdm9yYmlzX2RzcF9wY21vdXQoCiAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSwgKGludDE2X3QgKilvdXRIZWFkZXItPnBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIChrTWF4TnVtU2FtcGxlc1BlckJ1ZmZlciAvIG1WaS0+Y2hhbm5lbHMpKTsKKyAgICAgICAgICAgICAgICAgICAgKG51bVNhbXBsZXNQZXJCdWZmZXIgLyBtVmktPmNoYW5uZWxzKSk7CiAKICAgICAgICAgICAgIGlmIChudW1GcmFtZXMgPCAwKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoInZvcmJpc19kc3BfcGNtb3V0IHJldHVybmVkICVkIiwgbnVtRnJhbWVzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsKaW5kZXggNTlhNjRiYS4uNGY3YzQ4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsKQEAgLTksNiArOSw5IEBACiAgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogICAgICAgICAkKFRPUCkvaGFyZHdhcmUvbXNtN2sKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKK0xPQ0FMX0NMQU5HIDo9IHRydWUKKwogTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfY29sb3JfY29udmVyc2lvbgogCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKaW5kZXggMDQ0NjdiOS4uZTkyYzE5MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcApAQCAtMzgsNyArMzgsOCBAQAogICAgIHJldHVybiAoeCArIHkgLSAxKSAmIH4oeSAtIDEpOwogfQogCi1Tb2Z0d2FyZVJlbmRlcmVyOjpTb2Z0d2FyZVJlbmRlcmVyKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3cpCitTb2Z0d2FyZVJlbmRlcmVyOjpTb2Z0d2FyZVJlbmRlcmVyKAorICAgICAgICBjb25zdCBzcDxBTmF0aXZlV2luZG93PiAmbmF0aXZlV2luZG93LCBpbnQzMl90IHJvdGF0aW9uKQogICAgIDogbUNvbG9yRm9ybWF0KE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQpLAogICAgICAgbUNvbnZlcnRlcihOVUxMKSwKICAgICAgIG1ZVVZNb2RlKE5vbmUpLApAQCAtNTAsNyArNTEsOCBAQAogICAgICAgbUNyb3BSaWdodCgwKSwKICAgICAgIG1Dcm9wQm90dG9tKDApLAogICAgICAgbUNyb3BXaWR0aCgwKSwKLSAgICAgIG1Dcm9wSGVpZ2h0KDApIHsKKyAgICAgIG1Dcm9wSGVpZ2h0KDApLAorICAgICAgbVJvdGF0aW9uRGVncmVlcyhyb3RhdGlvbikgewogfQogCiBTb2Z0d2FyZVJlbmRlcmVyOjp+U29mdHdhcmVSZW5kZXJlcigpIHsKQEAgLTk4LDMzICsxMDAsNDkgQEAKICAgICBtQ3JvcFdpZHRoID0gbUNyb3BSaWdodCAtIG1Dcm9wTGVmdCArIDE7CiAgICAgbUNyb3BIZWlnaHQgPSBtQ3JvcEJvdHRvbSAtIG1Dcm9wVG9wICsgMTsKIAotICAgIGludCBoYWxGb3JtYXQ7Ci0gICAgc2l6ZV90IGJ1ZldpZHRoLCBidWZIZWlnaHQ7CisgICAgLy8gYnkgZGVmYXVsdCBjb252ZXJ0IGV2ZXJ5dGhpbmcgdG8gUkdCNTY1CisgICAgaW50IGhhbEZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCXzU2NTsKKyAgICBzaXplX3QgYnVmV2lkdGggPSBtQ3JvcFdpZHRoOworICAgIHNpemVfdCBidWZIZWlnaHQgPSBtQ3JvcEhlaWdodDsKIAotICAgIHN3aXRjaCAobUNvbG9yRm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKLSAgICAgICAgY2FzZSBPTVhfVElfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKLSAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFydW5uaW5nSW5FbXVsYXRvcigpKSB7CisgICAgLy8gaGFyZHdhcmUgaGFzIFlVVjEyIGFuZCBSR0JBODg4OCBzdXBwb3J0LCBzbyBjb252ZXJ0IGtub3duIGZvcm1hdHMKKyAgICBpZiAoIXJ1bm5pbmdJbkVtdWxhdG9yKCkpIHsKKyAgICAgICAgc3dpdGNoIChtQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyAgICAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICBjYXNlIE9NWF9USV9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgorICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGhhbEZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKICAgICAgICAgICAgICAgICBidWZXaWR0aCA9IChtQ3JvcFdpZHRoICsgMSkgJiB+MTsKICAgICAgICAgICAgICAgICBidWZIZWlnaHQgPSAobUNyb3BIZWlnaHQgKyAxKSAmIH4xOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBmYWxsIHRocm91Z2guCisgICAgICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQyNGJpdFJHQjg4ODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoYWxGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQl84ODg7CisgICAgICAgICAgICAgICAgYnVmV2lkdGggPSAobUNyb3BXaWR0aCArIDEpICYgfjE7CisgICAgICAgICAgICAgICAgYnVmSGVpZ2h0ID0gKG1Dcm9wSGVpZ2h0ICsgMSkgJiB+MTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDMyYml0QVJHQjg4ODg6CisgICAgICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhhbEZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OworICAgICAgICAgICAgICAgIGJ1ZldpZHRoID0gKG1Dcm9wV2lkdGggKyAxKSAmIH4xOworICAgICAgICAgICAgICAgIGJ1ZkhlaWdodCA9IChtQ3JvcEhlaWdodCArIDEpICYgfjE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgfQogCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBoYWxGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjU7Ci0gICAgICAgICAgICBidWZXaWR0aCA9IG1Dcm9wV2lkdGg7Ci0gICAgICAgICAgICBidWZIZWlnaHQgPSBtQ3JvcEhlaWdodDsKLQotICAgICAgICAgICAgbUNvbnZlcnRlciA9IG5ldyBDb2xvckNvbnZlcnRlcigKLSAgICAgICAgICAgICAgICAgICAgbUNvbG9yRm9ybWF0LCBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUpOwotICAgICAgICAgICAgQ0hFQ0sobUNvbnZlcnRlci0+aXNWYWxpZCgpKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChoYWxGb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1KSB7CisgICAgICAgIG1Db252ZXJ0ZXIgPSBuZXcgQ29sb3JDb252ZXJ0ZXIoCisgICAgICAgICAgICAgICAgbUNvbG9yRm9ybWF0LCBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUpOworICAgICAgICBDSEVDSyhtQ29udmVydGVyLT5pc1ZhbGlkKCkpOwogICAgIH0KIAogICAgIENIRUNLKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCk7CkBAIC0xNjUsNyArMTgzLDcgQEAKIAogICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzOwogICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoInJvdGF0aW9uLWRlZ3JlZXMiLCAmcm90YXRpb25EZWdyZWVzKSkgewotICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSAwOworICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSBtUm90YXRpb25EZWdyZWVzOwogICAgIH0KICAgICB1aW50MzJfdCB0cmFuc2Zvcm07CiAgICAgc3dpdGNoIChyb3RhdGlvbkRlZ3JlZXMpIHsKQEAgLTE4MCwxNyArMTk4LDI5IEBACiAgICAgICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgdHJhbnNmb3JtKSk7CiB9CiAKLXZvaWQgU29mdHdhcmVSZW5kZXJlcjo6cmVuZGVyKAotICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50NjRfdCB0aW1lc3RhbXBOcywKK3ZvaWQgU29mdHdhcmVSZW5kZXJlcjo6Y2xlYXJUcmFja2VyKCkgeworICAgIG1SZW5kZXJUcmFja2VyLmNsZWFyKC0xIC8qIGxhc3RSZW5kZXJUaW1lTnMgKi8pOworfQorCitzdGQ6Omxpc3Q8RnJhbWVSZW5kZXJUcmFja2VyOjpJbmZvPiBTb2Z0d2FyZVJlbmRlcmVyOjpyZW5kZXIoCisgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBpbnQ2NF90IG1lZGlhVGltZVVzLCBuc2Vjc190IHJlbmRlclRpbWVOcywKICAgICAgICAgdm9pZCogLypwbGF0Zm9ybVByaXZhdGUqLywgY29uc3Qgc3A8QU1lc3NhZ2U+JiBmb3JtYXQpIHsKICAgICByZXNldEZvcm1hdElmQ2hhbmdlZChmb3JtYXQpOworICAgIEZyYW1lUmVuZGVyVHJhY2tlcjo6SW5mbyAqaW5mbyA9IE5VTEw7CiAKICAgICBBTmF0aXZlV2luZG93QnVmZmVyICpidWY7Ci0gICAgaW50IGVycjsKLSAgICBpZiAoKGVyciA9IG5hdGl2ZV93aW5kb3dfZGVxdWV1ZV9idWZmZXJfYW5kX3dhaXQobU5hdGl2ZVdpbmRvdy5nZXQoKSwKLSAgICAgICAgICAgICZidWYpKSAhPSAwKSB7CisgICAgaW50IGZlbmNlRmQgPSAtMTsKKyAgICBpbnQgZXJyID0gbU5hdGl2ZVdpbmRvdy0+ZGVxdWV1ZUJ1ZmZlcihtTmF0aXZlV2luZG93LmdldCgpLCAmYnVmLCAmZmVuY2VGZCk7CisgICAgaWYgKGVyciA9PSAwICYmIGZlbmNlRmQgPj0gMCkgeworICAgICAgICBpbmZvID0gbVJlbmRlclRyYWNrZXIudXBkYXRlSW5mb0ZvckRlcXVldWVkQnVmZmVyKGJ1ZiwgZmVuY2VGZCwgMCk7CisgICAgICAgIHNwPEZlbmNlPiBmZW5jZSA9IG5ldyBGZW5jZShmZW5jZUZkKTsKKyAgICAgICAgZXJyID0gZmVuY2UtPndhaXRGb3JldmVyKCJTb2Z0d2FyZVJlbmRlcmVyOjpyZW5kZXIiKTsKKyAgICB9CisgICAgaWYgKGVyciAhPSAwKSB7CiAgICAgICAgIEFMT0dXKCJTdXJmYWNlOjpkZXF1ZXVlQnVmZmVyIHJldHVybmVkIGVycm9yICVkIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuOworICAgICAgICAvLyBjb21wbGV0ZSAoZHJvcCkgZGVxdWV1ZWQgZnJhbWUgaWYgZmVuY2Ugd2FpdCBmYWlsZWQ7IG90aGVyd2lzZSwKKyAgICAgICAgLy8gdGhpcyByZXR1cm5zIGFuIGVtcHR5IGxpc3QgYXMgbm8gZnJhbWVzIHNob3VsZCBoYXZlIHJlbmRlcmVkIGFuZCBub3QgeWV0IHJldHVybmVkLgorICAgICAgICByZXR1cm4gbVJlbmRlclRyYWNrZXIuY2hlY2tGZW5jZXNBbmRHZXRSZW5kZXJlZEZyYW1lcyhpbmZvLCBmYWxzZSAvKiBkcm9wSW5jb21wbGV0ZSAqLyk7CiAgICAgfQogCiAgICAgR3JhcGhpY0J1ZmZlck1hcHBlciAmbWFwcGVyID0gR3JhcGhpY0J1ZmZlck1hcHBlcjo6Z2V0KCk7CkBAIC0yMDEsNiArMjMxLDggQEAKICAgICBDSEVDS19FUSgwLCBtYXBwZXIubG9jaygKICAgICAgICAgICAgICAgICBidWYtPmhhbmRsZSwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgYm91bmRzLCAmZHN0KSk7CiAKKyAgICAvLyBUT0RPIG1vdmUgdGhlIG90aGVyIGNvbnZlcnNpb25zIGFsc28gaW50byBDb2xvckNvbnZlcnRlciwgYW5kCisgICAgLy8gZml4IGNyb3BwaW5nIGlzc3VlcyAod2hlbiBtQ3JvcExlZnQvVG9wICE9IDAgb3IgbVdpZHRoICE9IG1Dcm9wV2lkdGgpCiAgICAgaWYgKG1Db252ZXJ0ZXIpIHsKICAgICAgICAgbUNvbnZlcnRlci0+Y29udmVydCgKICAgICAgICAgICAgICAgICBkYXRhLApAQCAtMjE0LDcgKzI0Niw4IEBACiAgICAgICAgICAgICBnb3RvIHNraXBfY29weWluZzsKICAgICAgICAgfQogICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9IChjb25zdCB1aW50OF90ICopZGF0YTsKLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPSAoY29uc3QgdWludDhfdCAqKWRhdGEgKyBtV2lkdGggKiBtSGVpZ2h0OworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfdSA9CisgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgbVdpZHRoICogbUhlaWdodDsKICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3YgPSBzcmNfdSArIChtV2lkdGggLyAyICogbUhlaWdodCAvIDIpOwogCiAgICAgICAgIHVpbnQ4X3QgKmRzdF95ID0gKHVpbnQ4X3QgKilkc3Q7CkBAIC0yNDUsMTIgKzI3OCw5IEBACiAgICAgICAgIGlmICgoc2l6ZV90KW1XaWR0aCAqIG1IZWlnaHQgKiAzIC8gMiA+IHNpemUpIHsKICAgICAgICAgICAgIGdvdG8gc2tpcF9jb3B5aW5nOwogICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3kgPQotICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilkYXRhOwotCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY191diA9Ci0gICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWRhdGEgKyBtV2lkdGggKiAobUhlaWdodCAtIG1Dcm9wVG9wIC8gMik7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfdXYgPSAoY29uc3QgdWludDhfdCAqKWRhdGEKKyAgICAgICAgICAgICAgICArIG1XaWR0aCAqIChtSGVpZ2h0IC0gbUNyb3BUb3AgLyAyKTsKIAogICAgICAgICB1aW50OF90ICpkc3RfeSA9ICh1aW50OF90ICopZHN0OwogCkBAIC0yNzgsNiArMzA4LDQ3IEBACiAgICAgICAgICAgICBkc3RfdSArPSBkc3RfY19zdHJpZGU7CiAgICAgICAgICAgICBkc3RfdiArPSBkc3RfY19zdHJpZGU7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1Db2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MjRiaXRSR0I4ODgpIHsKKyAgICAgICAgaWYgKChzaXplX3QpbVdpZHRoICogbUhlaWdodCAqIDMgPiBzaXplKSB7CisgICAgICAgICAgICBnb3RvIHNraXBfY29weWluZzsKKyAgICAgICAgfQorICAgICAgICB1aW50OF90KiBzcmNQdHIgPSAodWludDhfdCopZGF0YTsKKyAgICAgICAgdWludDhfdCogZHN0UHRyID0gKHVpbnQ4X3QqKWRzdDsKKworICAgICAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IChzaXplX3QpbUNyb3BIZWlnaHQ7ICsreSkgeworICAgICAgICAgICAgbWVtY3B5KGRzdFB0ciwgc3JjUHRyLCBtQ3JvcFdpZHRoICogMyk7CisgICAgICAgICAgICBzcmNQdHIgKz0gbVdpZHRoICogMzsKKyAgICAgICAgICAgIGRzdFB0ciArPSBidWYtPnN0cmlkZSAqIDM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1Db2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRBUkdCODg4OCkgeworICAgICAgICBpZiAoKHNpemVfdCltV2lkdGggKiBtSGVpZ2h0ICogNCA+IHNpemUpIHsKKyAgICAgICAgICAgIGdvdG8gc2tpcF9jb3B5aW5nOworICAgICAgICB9CisgICAgICAgIHVpbnQ4X3QgKnNyY1B0ciwgKmRzdFB0cjsKKworICAgICAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IChzaXplX3QpbUNyb3BIZWlnaHQ7ICsreSkgeworICAgICAgICAgICAgc3JjUHRyID0gKHVpbnQ4X3QqKWRhdGEgKyBtV2lkdGggKiA0ICogeTsKKyAgICAgICAgICAgIGRzdFB0ciA9ICh1aW50OF90Kilkc3QgKyBidWYtPnN0cmlkZSAqIDQgKiB5OworICAgICAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCAoc2l6ZV90KW1Dcm9wV2lkdGg7ICsreCkgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgYSA9ICpzcmNQdHIrKzsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDM7ICsraSkgeyAgIC8vIGNvcHkgUkdCCisgICAgICAgICAgICAgICAgICAgICpkc3RQdHIrKyA9ICpzcmNQdHIrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKmRzdFB0cisrID0gYTsgIC8vIGFscGhhIGxhc3QgKEFSR0IgdG8gUkdCQSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4KSB7CisgICAgICAgIGlmICgoc2l6ZV90KW1XaWR0aCAqIG1IZWlnaHQgKiA0ID4gc2l6ZSkgeworICAgICAgICAgICAgZ290byBza2lwX2NvcHlpbmc7CisgICAgICAgIH0KKyAgICAgICAgdWludDhfdCogc3JjUHRyID0gKHVpbnQ4X3QqKWRhdGE7CisgICAgICAgIHVpbnQ4X3QqIGRzdFB0ciA9ICh1aW50OF90Kilkc3Q7CisKKyAgICAgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCAoc2l6ZV90KW1Dcm9wSGVpZ2h0OyArK3kpIHsKKyAgICAgICAgICAgIG1lbWNweShkc3RQdHIsIHNyY1B0ciwgbUNyb3BXaWR0aCAqIDQpOworICAgICAgICAgICAgc3JjUHRyICs9IG1XaWR0aCAqIDQ7CisgICAgICAgICAgICBkc3RQdHIgKz0gYnVmLT5zdHJpZGUgKiA0OworICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIGNvbG9yIGZvcm1hdCAlI3giLCBtQ29sb3JGb3JtYXQpOwogICAgIH0KQEAgLTI4NSwxNiArMzU2LDIxIEBACiBza2lwX2NvcHlpbmc6CiAgICAgQ0hFQ0tfRVEoMCwgbWFwcGVyLnVubG9jayhidWYtPmhhbmRsZSkpOwogCi0gICAgaWYgKChlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RpbWVzdGFtcChtTmF0aXZlV2luZG93LmdldCgpLAotICAgICAgICAgICAgdGltZXN0YW1wTnMpKSAhPSAwKSB7Ci0gICAgICAgIEFMT0dXKCJTdXJmYWNlOjpzZXRfYnVmZmVyc190aW1lc3RhbXAgcmV0dXJuZWQgZXJyb3IgJWQiLCBlcnIpOworICAgIGlmIChyZW5kZXJUaW1lTnMgPj0gMCkgeworICAgICAgICBpZiAoKGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdGltZXN0YW1wKG1OYXRpdmVXaW5kb3cuZ2V0KCksCisgICAgICAgICAgICAgICAgcmVuZGVyVGltZU5zKSkgIT0gMCkgeworICAgICAgICAgICAgQUxPR1coIlN1cmZhY2U6OnNldF9idWZmZXJzX3RpbWVzdGFtcCByZXR1cm5lZCBlcnJvciAlZCIsIGVycik7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoKGVyciA9IG1OYXRpdmVXaW5kb3ctPnF1ZXVlQnVmZmVyKG1OYXRpdmVXaW5kb3cuZ2V0KCksIGJ1ZiwKLSAgICAgICAgICAgIC0xKSkgIT0gMCkgeworICAgIGlmICgoZXJyID0gbU5hdGl2ZVdpbmRvdy0+cXVldWVCdWZmZXIobU5hdGl2ZVdpbmRvdy5nZXQoKSwgYnVmLCAtMSkpICE9IDApIHsKICAgICAgICAgQUxPR1coIlN1cmZhY2U6OnF1ZXVlQnVmZmVyIHJldHVybmVkIGVycm9yICVkIiwgZXJyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtUmVuZGVyVHJhY2tlci5vbkZyYW1lUXVldWVkKG1lZGlhVGltZVVzLCAoR3JhcGhpY0J1ZmZlciAqKWJ1ZiwgRmVuY2U6Ok5PX0ZFTkNFKTsKICAgICB9CisKICAgICBidWYgPSBOVUxMOworICAgIHJldHVybiBtUmVuZGVyVHJhY2tlci5jaGVja0ZlbmNlc0FuZEdldFJlbmRlcmVkRnJhbWVzKGluZm8sIGluZm8gIT0gTlVMTCAvKiBkcm9wSW5jb21wbGV0ZSAqLyk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5ZjA1NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDI4IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICAgICBDb2xvckNvbnZlcnQuY3BwICAgICAgICAgIFwKKyAgICAgICAgR3JhcGhpY0J1ZmZlckxpc3RlbmVyLmNwcCBcCisgICAgICAgIEludHJpbnNpY0JsdXJGaWx0ZXIuY3BwICAgXAorICAgICAgICBNZWRpYUZpbHRlci5jcHAgICAgICAgICAgIFwKKyAgICAgICAgUlNGaWx0ZXIuY3BwICAgICAgICAgICAgICBcCisgICAgICAgIFNhdHVyYXRpb25GaWx0ZXIuY3BwICAgICAgXAorICAgICAgICBzYXR1cmF0aW9uQVJHQi5ycyAgICAgICAgIFwKKyAgICAgICAgU2ltcGxlRmlsdGVyLmNwcCAgICAgICAgICBcCisgICAgICAgIFplcm9GaWx0ZXIuY3BwCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKKyAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvcnMvY3BwIFwKKyAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvcnMgXAorCitpbnRlcm1lZGlhdGVzIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsU1RBVElDX0xJQlJBUklFUyxsaWJSUyxUQVJHRVQsKQorTE9DQUxfQ19JTkNMVURFUyArPSAkKGludGVybWVkaWF0ZXMpCisKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCisKK0xPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X21lZGlhZmlsdGVyCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvQ29sb3JDb252ZXJ0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvQ29sb3JDb252ZXJ0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGQ1ZGQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9Db2xvckNvbnZlcnQuY3BwCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkNvbG9yQ29udmVydC5oIgorCisjaWZuZGVmIG1heAorI2RlZmluZSBtYXgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQorI2VuZGlmCisjaWZuZGVmIG1pbgorI2RlZmluZSBtaW4oYSxiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQorI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordm9pZCBZVVZUb1JHQigKKyAgICAgICAgaW50MzJfdCB5LCBpbnQzMl90IHUsIGludDMyX3QgdiwKKyAgICAgICAgaW50MzJfdCogciwgaW50MzJfdCogZywgaW50MzJfdCogYikgeworICAgIHkgLT0gMTY7CisgICAgdSAtPSAxMjg7CisgICAgdiAtPSAxMjg7CisKKyAgICAqYiA9IDExOTIgKiB5ICsgMjA2NiAqIHU7CisgICAgKmcgPSAxMTkyICogeSAtIDgzMyAqIHYgLSA0MDAgKiB1OworICAgICpyID0gMTE5MiAqIHkgKyAxNjM0ICogdjsKKworICAgICpyID0gbWluKDI2MjE0MywgbWF4KDAsICpyKSk7CisgICAgKmcgPSBtaW4oMjYyMTQzLCBtYXgoMCwgKmcpKTsKKyAgICAqYiA9IG1pbigyNjIxNDMsIG1heCgwLCAqYikpOworCisgICAgKnIgPj49IDEwOworICAgICpnID4+PSAxMDsKKyAgICAqYiA+Pj0gMTA7Cit9CisKK3ZvaWQgY29udmVydFlVVjQyMHNwVG9BUkdCKAorICAgICAgICB1aW50OF90ICpwWSwgdWludDhfdCAqcFVWLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgdWludDhfdCAqZGVzdCkgeworICAgIGNvbnN0IGludDMyX3QgYnl0ZXNfcGVyX3BpeGVsID0gMjsKKworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgICAgIGludDMyX3QgeSA9ICoocFkgKyBpICogd2lkdGggKyBqKTsKKyAgICAgICAgICAgIGludDMyX3QgdSA9ICoocFVWICsgKGkvMikgKiB3aWR0aCArIGJ5dGVzX3Blcl9waXhlbCAqIChqLzIpKTsKKyAgICAgICAgICAgIGludDMyX3QgdiA9ICoocFVWICsgKGkvMikgKiB3aWR0aCArIGJ5dGVzX3Blcl9waXhlbCAqIChqLzIpICsgMSk7CisKKyAgICAgICAgICAgIGludDMyX3QgciwgZywgYjsKKyAgICAgICAgICAgIFlVVlRvUkdCKHksIHUsIHYsICZyLCAmZywgJmIpOworCisgICAgICAgICAgICAqZGVzdCsrID0gMHhGRjsKKyAgICAgICAgICAgICpkZXN0KysgPSByOworICAgICAgICAgICAgKmRlc3QrKyA9IGc7CisgICAgICAgICAgICAqZGVzdCsrID0gYjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBjb252ZXJ0WVVWNDIwc3BUb1JHQjg4OCgKKyAgICAgICAgdWludDhfdCAqcFksIHVpbnQ4X3QgKnBVViwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCisgICAgICAgIHVpbnQ4X3QgKmRlc3QpIHsKKyAgICBjb25zdCBpbnQzMl90IGJ5dGVzX3Blcl9waXhlbCA9IDI7CisKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICAgICAgICBpbnQzMl90IHkgPSAqKHBZICsgaSAqIHdpZHRoICsgaik7CisgICAgICAgICAgICBpbnQzMl90IHUgPSAqKHBVViArIChpLzIpICogd2lkdGggKyBieXRlc19wZXJfcGl4ZWwgKiAoai8yKSk7CisgICAgICAgICAgICBpbnQzMl90IHYgPSAqKHBVViArIChpLzIpICogd2lkdGggKyBieXRlc19wZXJfcGl4ZWwgKiAoai8yKSArIDEpOworCisgICAgICAgICAgICBpbnQzMl90IHIsIGcsIGI7CisgICAgICAgICAgICBZVVZUb1JHQih5LCB1LCB2LCAmciwgJmcsICZiKTsKKworICAgICAgICAgICAgKmRlc3QrKyA9IHI7CisgICAgICAgICAgICAqZGVzdCsrID0gZzsKKyAgICAgICAgICAgICpkZXN0KysgPSBiOworICAgICAgICB9CisgICAgfQorfQorCisvLyBIQUNLIC0gbm90IGV2ZW4gc2xpZ2h0bHkgb3B0aW1pemVkCisvLyBUT0RPOiByZW1vdmUgd2hlbiBSR0JBIHN1cHBvcnQgaXMgYWRkZWQgdG8gU29mdHdhcmVSZW5kZXJlcgordm9pZCBjb252ZXJ0UkdCQVRvQVJHQigKKyAgICAgICAgdWludDhfdCAqc3JjLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgdWludDMyX3Qgc3RyaWRlLAorICAgICAgICB1aW50OF90ICpkZXN0KSB7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKKyAgICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgd2lkdGg7ICsraikgeworICAgICAgICAgICAgdWludDhfdCByID0gKnNyYysrOworICAgICAgICAgICAgdWludDhfdCBnID0gKnNyYysrOworICAgICAgICAgICAgdWludDhfdCBiID0gKnNyYysrOworICAgICAgICAgICAgdWludDhfdCBhID0gKnNyYysrOworICAgICAgICAgICAgKmRlc3QrKyA9IGE7CisgICAgICAgICAgICAqZGVzdCsrID0gcjsKKyAgICAgICAgICAgICpkZXN0KysgPSBnOworICAgICAgICAgICAgKmRlc3QrKyA9IGI7CisgICAgICAgIH0KKyAgICAgICAgc3JjICs9IChzdHJpZGUgLSB3aWR0aCkgKiA0OworICAgIH0KK30KKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0NvbG9yQ29udmVydC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9Db2xvckNvbnZlcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2ZhYTAyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9Db2xvckNvbnZlcnQuaApAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0xPUl9DT05WRVJUX0hfCisjZGVmaW5lIENPTE9SX0NPTlZFUlRfSF8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordm9pZCBZVVZUb1JHQigKKyAgICAgICAgaW50MzJfdCB5LCBpbnQzMl90IHUsIGludDMyX3QgdiwKKyAgICAgICAgaW50MzJfdCogciwgaW50MzJfdCogZywgaW50MzJfdCogYik7CisKK3ZvaWQgY29udmVydFlVVjQyMHNwVG9BUkdCKAorICAgICAgICB1aW50OF90ICpwWSwgdWludDhfdCAqcFVWLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgdWludDhfdCAqZGVzdCk7CisKK3ZvaWQgY29udmVydFlVVjQyMHNwVG9SR0I4ODgoCisgICAgICAgIHVpbnQ4X3QgKnBZLCB1aW50OF90ICpwVVYsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorICAgICAgICB1aW50OF90ICpkZXN0KTsKKworLy8gVE9ETzogcmVtb3ZlIHdoZW4gUkdCQSBzdXBwb3J0IGlzIGFkZGVkIHRvIFNvZnR3YXJlUmVuZGVyZXIKK3ZvaWQgY29udmVydFJHQkFUb0FSR0IoCisgICAgICAgIHVpbnQ4X3QgKnNyYywgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IHN0cmlkZSwKKyAgICAgICAgdWludDhfdCAqZGVzdCk7CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPTE9SX0NPTlZFUlRfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvR3JhcGhpY0J1ZmZlckxpc3RlbmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvR3JhcGhpY0J1ZmZlckxpc3RlbmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjA2MzE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9HcmFwaGljQnVmZmVyTGlzdGVuZXIuY3BwCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJHcmFwaGljQnVmZmVyTGlzdGVuZXIiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorCisjaW5jbHVkZSA8Z3VpL0J1ZmZlckl0ZW0uaD4KKworI2luY2x1ZGUgIkdyYXBoaWNCdWZmZXJMaXN0ZW5lci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXR1c190IEdyYXBoaWNCdWZmZXJMaXN0ZW5lcjo6aW5pdCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgIHNpemVfdCBidWZmZXJXaWR0aCwgc2l6ZV90IGJ1ZmZlckhlaWdodCwgc2l6ZV90IGJ1ZmZlckNvdW50KSB7CisgICAgbU5vdGlmeSA9IG5vdGlmeTsKKworICAgIFN0cmluZzggbmFtZSgiR3JhcGhpY0J1ZmZlckxpc3RlbmVyIik7CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZtUHJvZHVjZXIsICZtQ29uc3VtZXIpOworICAgIG1Db25zdW1lci0+c2V0Q29uc3VtZXJOYW1lKG5hbWUpOworICAgIG1Db25zdW1lci0+c2V0RGVmYXVsdEJ1ZmZlclNpemUoYnVmZmVyV2lkdGgsIGJ1ZmZlckhlaWdodCk7CisgICAgbUNvbnN1bWVyLT5zZXRDb25zdW1lclVzYWdlQml0cyhHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4pOworCisgICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5zZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KGJ1ZmZlckNvdW50KTsKKyAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IEJRIG1heCBhY3F1aXJlZCBidWZmZXIgY291bnQgdG8gJXp1OiAlZCIsCisgICAgICAgICAgICAgICAgYnVmZmVyQ291bnQsIGVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgd3A8QnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXI+IGxpc3RlbmVyID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8QnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXIqPih0aGlzKTsKKyAgICBzcDxCdWZmZXJRdWV1ZTo6UHJveHlDb25zdW1lckxpc3RlbmVyPiBwcm94eSA9CisgICAgICAgIG5ldyBCdWZmZXJRdWV1ZTo6UHJveHlDb25zdW1lckxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIGVyciA9IG1Db25zdW1lci0+Y29uc3VtZXJDb25uZWN0KHByb3h5LCBmYWxzZSk7CisgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiRXJyb3IgY29ubmVjdGluZyB0byBCdWZmZXJRdWV1ZTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgQUxPR1YoImluaXQoKSBzdWNjZXNzZnVsLiIpOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEdyYXBoaWNCdWZmZXJMaXN0ZW5lcjo6b25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiAvKiBpdGVtICovKSB7CisgICAgQUxPR1YoIm9uRnJhbWVBdmFpbGFibGUoKSBjYWxsZWQiKTsKKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisgICAgICAgIG1OdW1GcmFtZXNBdmFpbGFibGUrKzsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbU5vdGlmeS0+c2V0V2hhdChrV2hhdEZyYW1lQXZhaWxhYmxlKTsKKyAgICBtTm90aWZ5LT5wb3N0KCk7Cit9CisKK3ZvaWQgR3JhcGhpY0J1ZmZlckxpc3RlbmVyOjpvbkJ1ZmZlcnNSZWxlYXNlZCgpIHsKKyAgICBBTE9HVigib25CdWZmZXJzUmVsZWFzZWQoKSBjYWxsZWQiKTsKKyAgICAvLyBub3RoaW5nIHRvIGRvCit9CisKK3ZvaWQgR3JhcGhpY0J1ZmZlckxpc3RlbmVyOjpvblNpZGViYW5kU3RyZWFtQ2hhbmdlZCgpIHsKKyAgICBBTE9HVygiR3JhcGhpY0J1ZmZlckxpc3RlbmVyIGNhbm5vdCBjb25zdW1lIHNpZGViYW5kIHN0cmVhbXMuIik7CisgICAgLy8gbm90aGluZyB0byBkbworfQorCitCdWZmZXJJdGVtIEdyYXBoaWNCdWZmZXJMaXN0ZW5lcjo6Z2V0QnVmZmVySXRlbSgpIHsKKyAgICBCdWZmZXJJdGVtIGl0ZW07CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworICAgICAgICBpZiAobU51bUZyYW1lc0F2YWlsYWJsZSA8PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiZ2V0QnVmZmVyKCkgY2FsbGVkIHdpdGggbm8gZnJhbWVzIGF2YWlsYWJsZSIpOworICAgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgIH0KKyAgICAgICAgbU51bUZyYW1lc0F2YWlsYWJsZS0tOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IG1Db25zdW1lci0+YWNxdWlyZUJ1ZmZlcigmaXRlbSwgMCk7CisgICAgaWYgKGVyciA9PSBCdWZmZXJRdWV1ZTo6Tk9fQlVGRkVSX0FWQUlMQUJMRSkgeworICAgICAgICAvLyBzaG91bGRuJ3QgaGFwcGVuLCBzaW5jZSB3ZSB0cmFjayBudW0gZnJhbWVzIGF2YWlsYWJsZQorICAgICAgICBBTE9HRSgiZnJhbWUgd2FzIG5vdCBhdmFpbGFibGUiKTsKKyAgICAgICAgaXRlbS5tQnVmID0gLTE7CisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJhY3F1aXJlQnVmZmVyIHJldHVybmVkIGVycj0lZCIsIGVycik7CisgICAgICAgIGl0ZW0ubUJ1ZiA9IC0xOworICAgICAgICByZXR1cm4gaXRlbTsKKyAgICB9CisKKyAgICAvLyBXYWl0IGZvciBpdCB0byBiZWNvbWUgYXZhaWxhYmxlLgorICAgIGVyciA9IGl0ZW0ubUZlbmNlLT53YWl0Rm9yZXZlcigiR3JhcGhpY0J1ZmZlckxpc3RlbmVyOjpnZXRCdWZmZXJJdGVtIik7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHdhaXQgZm9yIGJ1ZmZlciBmZW5jZTogJWQiLCBlcnIpOworICAgICAgICAvLyBrZWVwIGdvaW5nCisgICAgfQorCisgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSdyZSBzZWVpbmcgdGhpcyBidWZmZXIsIGFkZCBpdCB0byBvdXIKKyAgICAvLyBzbG90IHRhYmxlLgorICAgIGlmIChpdGVtLm1HcmFwaGljQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoInNldHRpbmcgbUJ1ZmZlclNsb3QgJWQiLCBpdGVtLm1CdWYpOworICAgICAgICBtQnVmZmVyU2xvdFtpdGVtLm1CdWZdID0gaXRlbS5tR3JhcGhpY0J1ZmZlcjsKKyAgICB9CisKKyAgICByZXR1cm4gaXRlbTsKK30KKworc3A8R3JhcGhpY0J1ZmZlcj4gR3JhcGhpY0J1ZmZlckxpc3RlbmVyOjpnZXRCdWZmZXIoQnVmZmVySXRlbSBpdGVtKSB7CisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmOworICAgIGlmIChpdGVtLm1CdWYgPCAwIHx8IGl0ZW0ubUJ1ZiA+PSBCdWZmZXJRdWV1ZTo6TlVNX0JVRkZFUl9TTE9UUykgeworICAgICAgICBBTE9HRSgiZ2V0QnVmZmVyKCkgcmVjZWl2ZWQgaW52YWxpZCBCdWZmZXJJdGVtOiBtQnVmPT0lZCIsIGl0ZW0ubUJ1Zik7CisgICAgICAgIHJldHVybiBidWY7CisgICAgfQorCisgICAgYnVmID0gbUJ1ZmZlclNsb3RbaXRlbS5tQnVmXTsKKyAgICBDSEVDSyhidWYuZ2V0KCkgIT0gTlVMTCk7CisKKyAgICByZXR1cm4gYnVmOworfQorCitzdGF0dXNfdCBHcmFwaGljQnVmZmVyTGlzdGVuZXI6OnJlbGVhc2VCdWZmZXIoQnVmZmVySXRlbSBpdGVtKSB7CisgICAgaWYgKGl0ZW0ubUJ1ZiA8IDAgfHwgaXRlbS5tQnVmID49IEJ1ZmZlclF1ZXVlOjpOVU1fQlVGRkVSX1NMT1RTKSB7CisgICAgICAgIEFMT0dFKCJnZXRCdWZmZXIoKSByZWNlaXZlZCBpbnZhbGlkIEJ1ZmZlckl0ZW06IG1CdWY9PSVkIiwgaXRlbS5tQnVmKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICB9CisKKyAgICBtQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoaXRlbS5tQnVmLCBpdGVtLm1GcmFtZU51bWJlciwKKyAgICAgICAgICAgIEVHTF9OT19ESVNQTEFZLCBFR0xfTk9fU1lOQ19LSFIsIEZlbmNlOjpOT19GRU5DRSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9HcmFwaGljQnVmZmVyTGlzdGVuZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvR3JhcGhpY0J1ZmZlckxpc3RlbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2YmY2NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvR3JhcGhpY0J1ZmZlckxpc3RlbmVyLmgKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgR1JBUEhJQ19CVUZGRVJfTElTVEVORVJfSF8KKyNkZWZpbmUgR1JBUEhJQ19CVUZGRVJfTElTVEVORVJfSF8KKworI2luY2x1ZGUgPGd1aS9CdWZmZXJRdWV1ZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTWVzc2FnZTsKKworc3RydWN0IEdyYXBoaWNCdWZmZXJMaXN0ZW5lciA6IHB1YmxpYyBCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lciB7CitwdWJsaWM6CisgICAgR3JhcGhpY0J1ZmZlckxpc3RlbmVyKCkge307CisKKyAgICBzdGF0dXNfdCBpbml0KAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgICAgICBzaXplX3QgYnVmZmVyV2lkdGgsIHNpemVfdCBidWZmZXJIZWlnaHQsIHNpemVfdCBidWZmZXJDb3VudCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiBpdGVtKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25CdWZmZXJzUmVsZWFzZWQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKTsKKworICAgIC8vIFJldHVybnMgdGhlIGhhbmRsZSB0byB0aGUgcHJvZHVjZXIgc2lkZSBvZiB0aGUgQnVmZmVyUXVldWUuICBCdWZmZXJzCisgICAgLy8gcXVldWVkIG9uIHRoaXMgd2lsbCBiZSByZWNlaXZlZCBieSBHcmFwaGljQnVmZmVyTGlzdGVuZXIuCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Qcm9kdWNlcjsKKyAgICB9CisKKyAgICBCdWZmZXJJdGVtIGdldEJ1ZmZlckl0ZW0oKTsKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBnZXRCdWZmZXIoQnVmZmVySXRlbSBpdGVtKTsKKyAgICBzdGF0dXNfdCByZWxlYXNlQnVmZmVyKEJ1ZmZlckl0ZW0gaXRlbSk7CisKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRGcmFtZUF2YWlsYWJsZSA9ICdmcmF2JywKKyAgICB9OworCitwcml2YXRlOgorICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OworICAgIHNpemVfdCBtTnVtRnJhbWVzQXZhaWxhYmxlOworCisgICAgbXV0YWJsZSBNdXRleCBtTXV0ZXg7CisKKyAgICAvLyBPdXIgQnVmZmVyUXVldWUgaW50ZXJmYWNlcy4gbVByb2R1Y2VyIGlzIHBhc3NlZCB0byB0aGUgcHJvZHVjZXIgdGhyb3VnaAorICAgIC8vIGdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIsIGFuZCBtQ29uc3VtZXIgaXMgdXNlZCBpbnRlcm5hbGx5IHRvIHJldHJpZXZlCisgICAgLy8gdGhlIGJ1ZmZlcnMgcXVldWVkIGJ5IHRoZSBwcm9kdWNlci4KKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJvZHVjZXI7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gbUNvbnN1bWVyOworCisgICAgLy8gQ2FjaGUgb2YgR3JhcGhpY0J1ZmZlcnMgZnJvbSB0aGUgYnVmZmVyIHF1ZXVlLgorICAgIHNwPEdyYXBoaWNCdWZmZXI+IG1CdWZmZXJTbG90W0J1ZmZlclF1ZXVlOjpOVU1fQlVGRkVSX1NMT1RTXTsKK307CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEdSQVBISUNfQlVGRkVSX0xJU1RFTkVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvSW50cmluc2ljQmx1ckZpbHRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0ludHJpbnNpY0JsdXJGaWx0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiY2Y2OTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0ludHJpbnNpY0JsdXJGaWx0ZXIuY3BwCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkludHJpbnNpY0JsdXJGaWx0ZXIiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCisjaW5jbHVkZSAiSW50cmluc2ljQmx1ckZpbHRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXR1c190IEludHJpbnNpY0JsdXJGaWx0ZXI6OmNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN0YXR1c190IGVyciA9IFNpbXBsZUZpbHRlcjo6Y29uZmlndXJlKG1zZyk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICghbXNnLT5maW5kU3RyaW5nKCJjYWNoZURpciIsICZtQ2FjaGVEaXIpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmluZCBjYWNoZSBkaXJlY3RvcnkgaW4gY29uZmlnIG1lc3NhZ2UuIik7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEludHJpbnNpY0JsdXJGaWx0ZXI6OnN0YXJ0KCkgeworICAgIC8vIFRPRE86IHVzZSBhIHNpbmdsZSBSUyBjb250ZXh0IG9iamVjdCBmb3IgZW50aXJlIGFwcGxpY2F0aW9uCisgICAgbVJTID0gbmV3IFJTQzo6UlMoKTsKKworICAgIGlmICghbVJTLT5pbml0KG1DYWNoZURpci5jX3N0cigpKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgUmVuZGVyU2NyaXB0IGNvbnRleHQuIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIC8vIDMyLWJpdCBlbGVtZW50cyBmb3IgQVJHQjg4ODgKKyAgICBSU0M6OnNwPGNvbnN0IFJTQzo6RWxlbWVudD4gZSA9IFJTQzo6RWxlbWVudDo6VThfNChtUlMpOworCisgICAgUlNDOjpUeXBlOjpCdWlsZGVyIHRiKG1SUywgZSk7CisgICAgdGIuc2V0WChtV2lkdGgpOworICAgIHRiLnNldFkobUhlaWdodCk7CisgICAgUlNDOjpzcDxjb25zdCBSU0M6OlR5cGU+IHQgPSB0Yi5jcmVhdGUoKTsKKworICAgIG1BbGxvY0luID0gUlNDOjpBbGxvY2F0aW9uOjpjcmVhdGVUeXBlZChtUlMsIHQpOworICAgIG1BbGxvY091dCA9IFJTQzo6QWxsb2NhdGlvbjo6Y3JlYXRlVHlwZWQobVJTLCB0KTsKKworICAgIG1CbHVyID0gUlNDOjpTY3JpcHRJbnRyaW5zaWNCbHVyOjpjcmVhdGUobVJTLCBlKTsKKyAgICBtQmx1ci0+c2V0UmFkaXVzKG1CbHVyUmFkaXVzKTsKKyAgICBtQmx1ci0+c2V0SW5wdXQobUFsbG9jSW4pOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEludHJpbnNpY0JsdXJGaWx0ZXI6OnJlc2V0KCkgeworICAgIG1CbHVyLmNsZWFyKCk7CisgICAgbUFsbG9jT3V0LmNsZWFyKCk7CisgICAgbUFsbG9jSW4uY2xlYXIoKTsKKyAgICBtUlMuY2xlYXIoKTsKK30KKworc3RhdHVzX3QgSW50cmluc2ljQmx1ckZpbHRlcjo6c2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHNwPEFNZXNzYWdlPiBwYXJhbXM7CisgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgicGFyYW1zIiwgJnBhcmFtcykpOworCisgICAgZmxvYXQgYmx1clJhZGl1czsKKyAgICBpZiAocGFyYW1zLT5maW5kRmxvYXQoImJsdXItcmFkaXVzIiwgJmJsdXJSYWRpdXMpKSB7CisgICAgICAgIG1CbHVyUmFkaXVzID0gYmx1clJhZGl1czsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEludHJpbnNpY0JsdXJGaWx0ZXI6OnByb2Nlc3NCdWZmZXJzKAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmc3JjQnVmZmVyLCBjb25zdCBzcDxBQnVmZmVyPiAmb3V0QnVmZmVyKSB7CisgICAgbUFsbG9jSW4tPmNvcHkxRFJhbmdlRnJvbSgwLCBtV2lkdGggKiBtSGVpZ2h0LCBzcmNCdWZmZXItPmRhdGEoKSk7CisgICAgbUJsdXItPmZvckVhY2gobUFsbG9jT3V0KTsKKyAgICBtQWxsb2NPdXQtPmNvcHkxRFJhbmdlVG8oMCwgbVdpZHRoICogbUhlaWdodCwgb3V0QnVmZmVyLT5kYXRhKCkpOworCisgICAgcmV0dXJuIE9LOworfQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvSW50cmluc2ljQmx1ckZpbHRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9JbnRyaW5zaWNCbHVyRmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcwN2FiNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvSW50cmluc2ljQmx1ckZpbHRlci5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOVFJJTlNJQ19CTFVSX0ZJTFRFUl9IXworI2RlZmluZSBJTlRSSU5TSUNfQkxVUl9GSUxURVJfSF8KKworI2luY2x1ZGUgIlJlbmRlclNjcmlwdC5oIgorI2luY2x1ZGUgIlNpbXBsZUZpbHRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBJbnRyaW5zaWNCbHVyRmlsdGVyIDogcHVibGljIFNpbXBsZUZpbHRlciB7CitwdWJsaWM6CisgICAgSW50cmluc2ljQmx1ckZpbHRlcigpIDogbUJsdXJSYWRpdXMoMS5mKSB7fTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3NCdWZmZXJzKAorICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJnNyY0J1ZmZlciwgY29uc3Qgc3A8QUJ1ZmZlcj4gJm91dEJ1ZmZlcik7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5JbnRyaW5zaWNCbHVyRmlsdGVyKCkge307CisKK3ByaXZhdGU6CisgICAgQVN0cmluZyBtQ2FjaGVEaXI7CisgICAgUlNDOjpzcDxSU0M6OlJTPiBtUlM7CisgICAgUlNDOjpzcDxSU0M6OkFsbG9jYXRpb24+IG1BbGxvY0luOworICAgIFJTQzo6c3A8UlNDOjpBbGxvY2F0aW9uPiBtQWxsb2NPdXQ7CisgICAgUlNDOjpzcDxSU0M6OlNjcmlwdEludHJpbnNpY0JsdXI+IG1CbHVyOworICAgIGZsb2F0IG1CbHVyUmFkaXVzOworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gSU5UUklOU0lDX0JMVVJfRklMVEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL01lZGlhRmlsdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvTWVkaWFGaWx0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZjZiMDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL01lZGlhRmlsdGVyLmNwcApAQCAtMCwwICsxLDgyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFGaWx0ZXIiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9CdWZmZXJQcm9kdWNlcldyYXBwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFGaWx0ZXIuaD4KKworI2luY2x1ZGUgPGd1aS9CdWZmZXJJdGVtLmg+CisKKyNpbmNsdWRlICJDb2xvckNvbnZlcnQuaCIKKyNpbmNsdWRlICJHcmFwaGljQnVmZmVyTGlzdGVuZXIuaCIKKyNpbmNsdWRlICJJbnRyaW5zaWNCbHVyRmlsdGVyLmgiCisjaW5jbHVkZSAiUlNGaWx0ZXIuaCIKKyNpbmNsdWRlICJTYXR1cmF0aW9uRmlsdGVyLmgiCisjaW5jbHVkZSAiWmVyb0ZpbHRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHBhcmFtZXRlcjogbnVtYmVyIG9mIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycworc3RhdGljIGNvbnN0IHNpemVfdCBrQnVmZmVyQ291bnRBY3R1YWwgPSA0OworCitNZWRpYUZpbHRlcjo6TWVkaWFGaWx0ZXIoKQorICAgIDogbVN0YXRlKFVOSU5JVElBTElaRUQpLAorICAgICAgbUdlbmVyYXRpb24oMCksCisgICAgICBtR3JhcGhpY0J1ZmZlckxpc3RlbmVyKE5VTEwpIHsKK30KKworTWVkaWFGaWx0ZXI6On5NZWRpYUZpbHRlcigpIHsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8gUFVCTElDIEZVTkNUSU9OUyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBNZWRpYUZpbHRlcjo6c2V0Tm90aWZpY2F0aW9uTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIG1Ob3RpZnkgPSBtc2c7Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6OmluaXRpYXRlQWxsb2NhdGVDb21wb25lbnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBtc2ctPnNldFdoYXQoa1doYXRBbGxvY2F0ZUNvbXBvbmVudCk7CisgICAgbXNnLT5zZXRUYXJnZXQodGhpcyk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6OmluaXRpYXRlQ29uZmlndXJlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgbXNnLT5zZXRXaGF0KGtXaGF0Q29uZmlndXJlQ29tcG9uZW50KTsKKyAgICBtc2ctPnNldFRhcmdldCh0aGlzKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6aW5pdGlhdGVDcmVhdGVJbnB1dFN1cmZhY2UoKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdENyZWF0ZUlucHV0U3VyZmFjZSwgdGhpcykpLT5wb3N0KCk7Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6OmluaXRpYXRlU2V0SW5wdXRTdXJmYWNlKAorICAgICAgICBjb25zdCBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gJiAvKiBzdXJmYWNlICovKSB7CisgICAgQUxPR1coImluaXRpYXRlU2V0SW5wdXRTdXJmYWNlKCkgdW5zdXBwb3J0ZWQiKTsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6aW5pdGlhdGVTdGFydCgpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIHRoaXMpKS0+cG9zdCgpOworfQorCit2b2lkIE1lZGlhRmlsdGVyOjppbml0aWF0ZVNodXRkb3duKGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTaHV0ZG93biwgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQzMigia2VlcENvbXBvbmVudEFsbG9jYXRlZCIsIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE1lZGlhRmlsdGVyOjpzaWduYWxGbHVzaCgpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0Rmx1c2gsIHRoaXMpKS0+cG9zdCgpOworfQorCit2b2lkIE1lZGlhRmlsdGVyOjpzaWduYWxSZXN1bWUoKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlc3VtZSwgdGhpcykpLT5wb3N0KCk7Cit9CisKKy8vIG5vdGhpbmcgdG8gZG8KK3ZvaWQgTWVkaWFGaWx0ZXI6OnNpZ25hbFJlcXVlc3RJRFJGcmFtZSgpIHsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6OnNpZ25hbFNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXMpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0UGFyYW1ldGVycywgdGhpcyk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJwYXJhbXMiLCBwYXJhbXMpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE1lZGlhRmlsdGVyOjpzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTaWduYWxFbmRPZklucHV0U3RyZWFtLCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRBbGxvY2F0ZUNvbXBvbmVudDoKKyAgICAgICAgeworICAgICAgICAgICAgb25BbGxvY2F0ZUNvbXBvbmVudChtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdENvbmZpZ3VyZUNvbXBvbmVudDoKKyAgICAgICAgeworICAgICAgICAgICAgb25Db25maWd1cmVDb21wb25lbnQobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTdGFydDoKKyAgICAgICAgeworICAgICAgICAgICAgb25TdGFydCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFByb2Nlc3NCdWZmZXJzOgorICAgICAgICB7CisgICAgICAgICAgICBwcm9jZXNzQnVmZmVycygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdElucHV0QnVmZmVyRmlsbGVkOgorICAgICAgICB7CisgICAgICAgICAgICBvbklucHV0QnVmZmVyRmlsbGVkKG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0T3V0cHV0QnVmZmVyRHJhaW5lZDoKKyAgICAgICAgeworICAgICAgICAgICAgb25PdXRwdXRCdWZmZXJEcmFpbmVkKG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0U2h1dGRvd246CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uU2h1dGRvd24obXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRGbHVzaDoKKyAgICAgICAgeworICAgICAgICAgICAgb25GbHVzaCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFJlc3VtZToKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFNldFBhcmFtZXRlcnM6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uU2V0UGFyYW1ldGVycyhtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdENyZWF0ZUlucHV0U3VyZmFjZToKKyAgICAgICAgeworICAgICAgICAgICAgb25DcmVhdGVJbnB1dFN1cmZhY2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgR3JhcGhpY0J1ZmZlckxpc3RlbmVyOjprV2hhdEZyYW1lQXZhaWxhYmxlOgorICAgICAgICB7CisgICAgICAgICAgICBvbklucHV0RnJhbWVBdmFpbGFibGUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTaWduYWxFbmRPZklucHV0U3RyZWFtOgorICAgICAgICB7CisgICAgICAgICAgICBvblNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dFKCJNZXNzYWdlIG5vdCBoYW5kbGVkOlxuJXMiLCBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8gUE9SVCBERVNDUklQVElPTiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworTWVkaWFGaWx0ZXI6OlBvcnREZXNjcmlwdGlvbjo6UG9ydERlc2NyaXB0aW9uKCkgeworfQorCit2b2lkIE1lZGlhRmlsdGVyOjpQb3J0RGVzY3JpcHRpb246OmFkZEJ1ZmZlcigKKyAgICAgICAgSU9NWDo6YnVmZmVyX2lkIGlkLCBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgbUJ1ZmZlcklEcy5wdXNoX2JhY2soaWQpOworICAgIG1CdWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworfQorCitzaXplX3QgTWVkaWFGaWx0ZXI6OlBvcnREZXNjcmlwdGlvbjo6Y291bnRCdWZmZXJzKCkgeworICAgIHJldHVybiBtQnVmZmVySURzLnNpemUoKTsKK30KKworSU9NWDo6YnVmZmVyX2lkIE1lZGlhRmlsdGVyOjpQb3J0RGVzY3JpcHRpb246OmJ1ZmZlcklEQXQoc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIG1CdWZmZXJJRHMuaXRlbUF0KGluZGV4KTsKK30KKworc3A8QUJ1ZmZlcj4gTWVkaWFGaWx0ZXI6OlBvcnREZXNjcmlwdGlvbjo6YnVmZmVyQXQoc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIG1CdWZmZXJzLml0ZW1BdChpbmRleCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vIEhFTFBFUiBGVU5DVElPTlMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgTWVkaWFGaWx0ZXI6OnNpZ25hbFByb2Nlc3NCdWZmZXJzKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQcm9jZXNzQnVmZmVycywgdGhpcykpLT5wb3N0KCk7Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6OnNpZ25hbEVycm9yKHN0YXR1c190IGVycm9yKSB7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0RXJyb3IpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIGVycm9yKTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKworc3RhdHVzX3QgTWVkaWFGaWx0ZXI6OmFsbG9jYXRlQnVmZmVyc09uUG9ydChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIENIRUNLKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQgfHwgcG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQpOworICAgIGNvbnN0IGJvb2wgaXNJbnB1dCA9IHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQ7CisgICAgY29uc3Qgc2l6ZV90IGJ1ZmZlclNpemUgPSBpc0lucHV0ID8gbU1heElucHV0U2l6ZSA6IG1NYXhPdXRwdXRTaXplOworCisgICAgQ0hFQ0sobURlYWxlcltwb3J0SW5kZXhdID09IE5VTEwpOworICAgIENIRUNLKG1CdWZmZXJzW3BvcnRJbmRleF0uaXNFbXB0eSgpKTsKKworICAgIEFMT0dWKCJBbGxvY2F0aW5nICV6dSBidWZmZXJzIG9mIHNpemUgJXp1IG9uICVzIHBvcnQiLAorICAgICAgICAgICAga0J1ZmZlckNvdW50QWN0dWFsLCBidWZmZXJTaXplLAorICAgICAgICAgICAgaXNJbnB1dCA/ICJpbnB1dCIgOiAib3V0cHV0Iik7CisKKyAgICBzaXplX3QgdG90YWxTaXplID0ga0J1ZmZlckNvdW50QWN0dWFsICogYnVmZmVyU2l6ZTsKKworICAgIG1EZWFsZXJbcG9ydEluZGV4XSA9IG5ldyBNZW1vcnlEZWFsZXIodG90YWxTaXplLCAiTWVkaWFGaWx0ZXIiKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga0J1ZmZlckNvdW50QWN0dWFsOyArK2kpIHsKKyAgICAgICAgc3A8SU1lbW9yeT4gbWVtID0gbURlYWxlcltwb3J0SW5kZXhdLT5hbGxvY2F0ZShidWZmZXJTaXplKTsKKyAgICAgICAgQ0hFQ0sobWVtLmdldCgpICE9IE5VTEwpOworCisgICAgICAgIEJ1ZmZlckluZm8gaW5mbzsKKyAgICAgICAgaW5mby5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfVVM7CisgICAgICAgIGluZm8ubUJ1ZmZlcklEID0gaTsKKyAgICAgICAgaW5mby5tR2VuZXJhdGlvbiA9IG1HZW5lcmF0aW9uOworICAgICAgICBpbmZvLm1PdXRwdXRGbGFncyA9IDA7CisgICAgICAgIGluZm8ubURhdGEgPSBuZXcgQUJ1ZmZlcihtZW0tPnBvaW50ZXIoKSwgYnVmZmVyU2l6ZSk7CisgICAgICAgIGluZm8ubURhdGEtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOworCisgICAgICAgIG1CdWZmZXJzW3BvcnRJbmRleF0ucHVzaF9iYWNrKGluZm8pOworCisgICAgICAgIGlmICghaXNJbnB1dCkgeworICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dEJ1ZmZlcnMucHVzaCgKKyAgICAgICAgICAgICAgICAgICAgJm1CdWZmZXJzW3BvcnRJbmRleF0uZWRpdEl0ZW1BdChpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRCdWZmZXJzQWxsb2NhdGVkKTsKKworICAgIG5vdGlmeS0+c2V0SW50MzIoInBvcnRJbmRleCIsIHBvcnRJbmRleCk7CisKKyAgICBzcDxQb3J0RGVzY3JpcHRpb24+IGRlc2MgPSBuZXcgUG9ydERlc2NyaXB0aW9uOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVyc1twb3J0SW5kZXhdLnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IEJ1ZmZlckluZm8gJmluZm8gPSBtQnVmZmVyc1twb3J0SW5kZXhdW2ldOworCisgICAgICAgIGRlc2MtPmFkZEJ1ZmZlcihpbmZvLm1CdWZmZXJJRCwgaW5mby5tRGF0YSk7CisgICAgfQorCisgICAgbm90aWZ5LT5zZXRPYmplY3QoInBvcnREZXNjIiwgZGVzYyk7CisgICAgbm90aWZ5LT5wb3N0KCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK01lZGlhRmlsdGVyOjpCdWZmZXJJbmZvKiBNZWRpYUZpbHRlcjo6ZmluZEJ1ZmZlckJ5SUQoCisgICAgICAgIHVpbnQzMl90IHBvcnRJbmRleCwgSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlcklELAorICAgICAgICBzc2l6ZV90ICppbmRleCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1ZmZlcnNbcG9ydEluZGV4XS5zaXplKCk7ICsraSkgeworICAgICAgICBCdWZmZXJJbmZvICppbmZvID0gJm1CdWZmZXJzW3BvcnRJbmRleF0uZWRpdEl0ZW1BdChpKTsKKworICAgICAgICBpZiAoaW5mby0+bUJ1ZmZlcklEID09IGJ1ZmZlcklEKSB7CisgICAgICAgICAgICBpZiAoaW5kZXggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICppbmRleCA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaW5mbzsKKyAgICAgICAgfQorICAgIH0KKworICAgIFRSRVNQQVNTKCk7CisKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6cG9zdEZpbGxUaGlzQnVmZmVyKEJ1ZmZlckluZm8gKmluZm8pIHsKKyAgICBBTE9HVigicG9zdEZpbGxUaGlzQnVmZmVyIG9uIGJ1ZmZlciAlZCIsIGluZm8tPm1CdWZmZXJJRCk7CisgICAgaWYgKG1Qb3J0RU9TW2tQb3J0SW5kZXhJbnB1dF0pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENIRUNLX0VRKChpbnQpaW5mby0+bVN0YXR1cywgKGludClCdWZmZXJJbmZvOjpPV05FRF9CWV9VUyk7CisKKyAgICBpbmZvLT5tR2VuZXJhdGlvbiA9IG1HZW5lcmF0aW9uOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0RmlsbFRoaXNCdWZmZXIpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImJ1ZmZlci1pZCIsIGluZm8tPm1CdWZmZXJJRCk7CisKKyAgICBpbmZvLT5tRGF0YS0+bWV0YSgpLT5jbGVhcigpOworICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJidWZmZXIiLCBpbmZvLT5tRGF0YSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRJbnB1dEJ1ZmZlckZpbGxlZCwgdGhpcyk7CisgICAgcmVwbHktPnNldEludDMyKCJidWZmZXItaWQiLCBpbmZvLT5tQnVmZmVySUQpOworCisgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJyZXBseSIsIHJlcGx5KTsKKworICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUFNUUkVBTTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6cG9zdERyYWluVGhpc0J1ZmZlcihCdWZmZXJJbmZvICppbmZvKSB7CisgICAgQ0hFQ0tfRVEoKGludClpbmZvLT5tU3RhdHVzLCAoaW50KUJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTKTsKKworICAgIGluZm8tPm1HZW5lcmF0aW9uID0gbUdlbmVyYXRpb247CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXREcmFpblRoaXNCdWZmZXIpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImJ1ZmZlci1pZCIsIGluZm8tPm1CdWZmZXJJRCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiZmxhZ3MiLCBpbmZvLT5tT3V0cHV0RmxhZ3MpOworICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJidWZmZXIiLCBpbmZvLT5tRGF0YSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPdXRwdXRCdWZmZXJEcmFpbmVkLCB0aGlzKTsKKyAgICByZXBseS0+c2V0SW50MzIoImJ1ZmZlci1pZCIsIGluZm8tPm1CdWZmZXJJRCk7CisKKyAgICBub3RpZnktPnNldE1lc3NhZ2UoInJlcGx5IiwgcmVwbHkpOworCisgICAgbm90aWZ5LT5wb3N0KCk7CisKKyAgICBpbmZvLT5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfVVBTVFJFQU07Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6OnBvc3RFT1MoKSB7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0RU9TKTsKKyAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICBub3RpZnktPnBvc3QoKTsKKworICAgIEFMT0dWKCJTZW50IGtXaGF0RU9TLiIpOworfQorCit2b2lkIE1lZGlhRmlsdGVyOjpzZW5kRm9ybWF0Q2hhbmdlKCkgeworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdE91dHB1dEZvcm1hdENoYW5nZWQpOworCisgICAgQVN0cmluZyBtaW1lOworICAgIENIRUNLKG1PdXRwdXRGb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOworICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgbWltZS5jX3N0cigpKTsKKworICAgIG5vdGlmeS0+c2V0SW50MzIoInN0cmlkZSIsIG1TdHJpZGUpOworICAgIG5vdGlmeS0+c2V0SW50MzIoInNsaWNlLWhlaWdodCIsIG1TbGljZUhlaWdodCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgbUNvbG9yRm9ybWF0T3V0KTsKKyAgICBub3RpZnktPnNldFJlY3QoImNyb3AiLCAwLCAwLCBtU3RyaWRlIC0gMSwgbVNsaWNlSGVpZ2h0IC0gMSk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2lkdGgiLCBtV2lkdGgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImhlaWdodCIsIG1IZWlnaHQpOworCisgICAgbm90aWZ5LT5wb3N0KCk7Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6OnJlcXVlc3RGaWxsRW1wdHlJbnB1dCgpIHsKKyAgICBpZiAobVBvcnRFT1Nba1BvcnRJbmRleElucHV0XSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVyc1trUG9ydEluZGV4SW5wdXRdLnNpemUoKTsgKytpKSB7CisgICAgICAgIEJ1ZmZlckluZm8gKmluZm8gPSAmbUJ1ZmZlcnNba1BvcnRJbmRleElucHV0XS5lZGl0SXRlbUF0KGkpOworCisgICAgICAgIGlmIChpbmZvLT5tU3RhdHVzID09IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTKSB7CisgICAgICAgICAgICBwb3N0RmlsbFRoaXNCdWZmZXIoaW5mbyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6OnByb2Nlc3NCdWZmZXJzKCkgeworICAgIGlmIChtQXZhaWxhYmxlSW5wdXRCdWZmZXJzLmVtcHR5KCkgfHwgbUF2YWlsYWJsZU91dHB1dEJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBBTE9HVigiU2tpcHBpbmcgcHJvY2VzcyAoYnVmZmVycyB1bmF2YWlsYWJsZSkiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtUG9ydEVPU1trUG9ydEluZGV4T3V0cHV0XSkgeworICAgICAgICAvLyBUT0RPIG5vdGlmeSBjYWxsZXIgb2YgcXVldWVJbnB1dCBlcnJvciB3aGVuIGl0IGlzIHN1cHBvcnRlZAorICAgICAgICAvLyBpbiBNZWRpYUNvZGVjCisgICAgICAgIEFMT0dXKCJUcmllZCB0byBwcm9jZXNzIGEgYnVmZmVyIGFmdGVyIEVPUy4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEJ1ZmZlckluZm8gKmlucHV0SW5mbyA9IG1BdmFpbGFibGVJbnB1dEJ1ZmZlcnNbMF07CisgICAgbUF2YWlsYWJsZUlucHV0QnVmZmVycy5yZW1vdmVBdCgwKTsKKyAgICBCdWZmZXJJbmZvICpvdXRwdXRJbmZvID0gbUF2YWlsYWJsZU91dHB1dEJ1ZmZlcnNbMF07CisgICAgbUF2YWlsYWJsZU91dHB1dEJ1ZmZlcnMucmVtb3ZlQXQoMCk7CisKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgZXJyID0gbUZpbHRlci0+cHJvY2Vzc0J1ZmZlcnMoaW5wdXRJbmZvLT5tRGF0YSwgb3V0cHV0SW5mby0+bURhdGEpOworICAgIGlmIChlcnIgIT0gKHN0YXR1c190KU9LKSB7CisgICAgICAgIG91dHB1dEluZm8tPm1EYXRhLT5tZXRhKCktPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgIH0KKworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKGlucHV0SW5mby0+bURhdGEtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisgICAgb3V0cHV0SW5mby0+bURhdGEtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgb3V0cHV0SW5mby0+bU91dHB1dEZsYWdzID0gMDsKKyAgICBpbnQzMl90IGVvcyA9IDA7CisgICAgaWYgKGlucHV0SW5mby0+bURhdGEtPm1ldGEoKS0+ZmluZEludDMyKCJlb3MiLCAmZW9zKSAmJiBlb3MgIT0gMCkgeworICAgICAgICBvdXRwdXRJbmZvLT5tT3V0cHV0RmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICBtUG9ydEVPU1trUG9ydEluZGV4T3V0cHV0XSA9IHRydWU7CisgICAgICAgIG91dHB1dEluZm8tPm1EYXRhLT5tZXRhKCktPnNldEludDMyKCJlb3MiLCBlb3MpOworICAgICAgICBwb3N0RU9TKCk7CisgICAgICAgIEFMT0dWKCJPdXRwdXQgc3RyZWFtIHNhdyBFT1MuIik7CisgICAgfQorCisgICAgQUxPR1YoIlByb2Nlc3NlZCBpbnB1dCBidWZmZXIgJXUgWyV6dV0sIG91dHB1dCBidWZmZXIgJXUgWyV6dV0iLAorICAgICAgICAgICAgICAgIGlucHV0SW5mby0+bUJ1ZmZlcklELCBpbnB1dEluZm8tPm1EYXRhLT5zaXplKCksCisgICAgICAgICAgICAgICAgb3V0cHV0SW5mby0+bUJ1ZmZlcklELCBvdXRwdXRJbmZvLT5tRGF0YS0+c2l6ZSgpKTsKKworICAgIGlmIChtR3JhcGhpY0J1ZmZlckxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIGlucHV0SW5mbzsKKyAgICB9IGVsc2UgeworICAgICAgICBwb3N0RmlsbFRoaXNCdWZmZXIoaW5wdXRJbmZvKTsKKyAgICB9CisgICAgcG9zdERyYWluVGhpc0J1ZmZlcihvdXRwdXRJbmZvKTsKKworICAgIC8vIHByZXZlbnQgYW55IGNvcm5lciBjYXNlIHdoZXJlIGJ1ZmZlcnMgY291bGQgZ2V0IHN0dWNrIGluIHF1ZXVlCisgICAgc2lnbmFsUHJvY2Vzc0J1ZmZlcnMoKTsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6b25BbGxvY2F0ZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIENIRUNLX0VRKG1TdGF0ZSwgVU5JTklUSUFMSVpFRCk7CisKKyAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoImNvbXBvbmVudE5hbWUiLCAmbUNvbXBvbmVudE5hbWUpKTsKKyAgICBjb25zdCBjaGFyKiBuYW1lID0gbUNvbXBvbmVudE5hbWUuY19zdHIoKTsKKyAgICBpZiAoIXN0cmNhc2VjbXAobmFtZSwgImFuZHJvaWQuZmlsdGVyLnplcm9maWx0ZXIiKSkgeworICAgICAgICBtRmlsdGVyID0gbmV3IFplcm9GaWx0ZXI7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChuYW1lLCAiYW5kcm9pZC5maWx0ZXIuc2F0dXJhdGlvbiIpKSB7CisgICAgICAgIG1GaWx0ZXIgPSBuZXcgU2F0dXJhdGlvbkZpbHRlcjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG5hbWUsICJhbmRyb2lkLmZpbHRlci5pbnRyaW5zaWNibHVyIikpIHsKKyAgICAgICAgbUZpbHRlciA9IG5ldyBJbnRyaW5zaWNCbHVyRmlsdGVyOworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobmFtZSwgImFuZHJvaWQuZmlsdGVyLlJlbmRlclNjcmlwdCIpKSB7CisgICAgICAgIG1GaWx0ZXIgPSBuZXcgUlNGaWx0ZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIlVucmVjb2duaXplZCBmaWx0ZXIgbmFtZTogJXMiLCBuYW1lKTsKKyAgICAgICAgc2lnbmFsRXJyb3IoTkFNRV9OT1RfRk9VTkQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdENvbXBvbmVudEFsbG9jYXRlZCk7CisgICAgLy8gSEFDSyAtIG5lZWQgIk9NWC5nb29nbGUiIHRvIHVzZSBNZWRpYUNvZGVjJ3Mgc29mdHdhcmUgcmVuZGVyZXIKKyAgICBub3RpZnktPnNldFN0cmluZygiY29tcG9uZW50TmFtZSIsICJPTVguZ29vZ2xlLk1lZGlhRmlsdGVyIik7CisgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgbVN0YXRlID0gSU5JVElBTElaRUQ7CisgICAgQUxPR1YoIkhhbmRsZWQga1doYXRBbGxvY2F0ZUNvbXBvbmVudC4iKTsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6b25Db25maWd1cmVDb21wb25lbnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICAvLyBUT0RPOiBnZW5lcmFsaXplIHRvIGFsbG93IGF1ZGlvIGZpbHRlcnMgYXMgd2VsbCBhcyB2aWRlbworCisgICAgQ0hFQ0tfRVEobVN0YXRlLCBJTklUSUFMSVpFRCk7CisKKyAgICAvLyBnZXQgcGFyYW1zIC0gYXQgbGVhc3QgbWltZSwgd2lkdGggJiBoZWlnaHQKKyAgICBBU3RyaW5nIG1pbWU7CisgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKKyAgICBpZiAoc3RyY2FzZWNtcChtaW1lLmNfc3RyKCksIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVykpIHsKKyAgICAgICAgQUxPR0UoIkJhZCBtaW1lOiAlcyIsIG1pbWUuY19zdHIoKSk7CisgICAgICAgIHNpZ25hbEVycm9yKEJBRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2lkdGgiLCAmbVdpZHRoKSk7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImhlaWdodCIsICZtSGVpZ2h0KSk7CisgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigic3RyaWRlIiwgJm1TdHJpZGUpKSB7CisgICAgICAgIG1TdHJpZGUgPSBtV2lkdGg7CisgICAgfQorICAgIGlmICghbXNnLT5maW5kSW50MzIoInNsaWNlLWhlaWdodCIsICZtU2xpY2VIZWlnaHQpKSB7CisgICAgICAgIG1TbGljZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgfQorCisgICAgbU1heElucHV0U2l6ZSA9IG1XaWR0aCAqIG1IZWlnaHQgKiA0OyAgIC8vIHJvb20gZm9yIEFSR0I4ODg4CisgICAgaW50MzJfdCBtYXhJbnB1dFNpemU7CisgICAgaWYgKG1zZy0+ZmluZEludDMyKCJtYXgtaW5wdXQtc2l6ZSIsICZtYXhJbnB1dFNpemUpCisgICAgICAgICAgICAmJiAoc2l6ZV90KW1heElucHV0U2l6ZSA+IG1NYXhJbnB1dFNpemUpIHsKKyAgICAgICAgbU1heElucHV0U2l6ZSA9IG1heElucHV0U2l6ZTsKKyAgICB9CisKKyAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmbUNvbG9yRm9ybWF0SW4pKSB7CisgICAgICAgIC8vIGRlZmF1bHQgdG8gT01YX0NPTE9SX0Zvcm1hdDMyYml0QVJHQjg4ODgKKyAgICAgICAgbUNvbG9yRm9ybWF0SW4gPSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRBUkdCODg4ODsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgbUNvbG9yRm9ybWF0SW4pOworICAgIH0KKyAgICBtQ29sb3JGb3JtYXRPdXQgPSBtQ29sb3JGb3JtYXRJbjsKKworICAgIG1NYXhPdXRwdXRTaXplID0gbVdpZHRoICogbUhlaWdodCAqIDQ7ICAvLyByb29tIGZvciBBUkdCODg4OAorCisgICAgQVN0cmluZyBjYWNoZURpcjsKKyAgICBpZiAoIW1zZy0+ZmluZFN0cmluZygiY2FjaGVEaXIiLCAmY2FjaGVEaXIpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmluZCBjYWNoZSBkaXJlY3RvcnkgaW4gY29uZmlnIG1lc3NhZ2UuIik7CisgICAgICAgIHNpZ25hbEVycm9yKE5BTUVfTk9UX0ZPVU5EKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1c190IGVycjsKKyAgICBlcnIgPSBtRmlsdGVyLT5jb25maWd1cmUobXNnKTsKKyAgICBpZiAoZXJyICE9IChzdGF0dXNfdClPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNvbmZpZ3VyZSBmaWx0ZXIgY29tcG9uZW50LCBlcnIgJWQiLCBlcnIpOworICAgICAgICBzaWduYWxFcnJvcihlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUlucHV0Rm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisgICAgbUlucHV0Rm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBtaW1lLmNfc3RyKCkpOworICAgIG1JbnB1dEZvcm1hdC0+c2V0SW50MzIoInN0cmlkZSIsIG1TdHJpZGUpOworICAgIG1JbnB1dEZvcm1hdC0+c2V0SW50MzIoInNsaWNlLWhlaWdodCIsIG1TbGljZUhlaWdodCk7CisgICAgbUlucHV0Rm9ybWF0LT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgbUNvbG9yRm9ybWF0SW4pOworICAgIG1JbnB1dEZvcm1hdC0+c2V0UmVjdCgiY3JvcCIsIDAsIDAsIG1TdHJpZGUsIG1TbGljZUhlaWdodCk7CisgICAgbUlucHV0Rm9ybWF0LT5zZXRJbnQzMigid2lkdGgiLCBtV2lkdGgpOworICAgIG1JbnB1dEZvcm1hdC0+c2V0SW50MzIoImhlaWdodCIsIG1IZWlnaHQpOworCisgICAgbU91dHB1dEZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworICAgIG1PdXRwdXRGb3JtYXQtPnNldFN0cmluZygibWltZSIsIG1pbWUuY19zdHIoKSk7CisgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoInN0cmlkZSIsIG1TdHJpZGUpOworICAgIG1PdXRwdXRGb3JtYXQtPnNldEludDMyKCJzbGljZS1oZWlnaHQiLCBtU2xpY2VIZWlnaHQpOworICAgIG1PdXRwdXRGb3JtYXQtPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBtQ29sb3JGb3JtYXRPdXQpOworICAgIG1PdXRwdXRGb3JtYXQtPnNldFJlY3QoImNyb3AiLCAwLCAwLCBtU3RyaWRlLCBtU2xpY2VIZWlnaHQpOworICAgIG1PdXRwdXRGb3JtYXQtPnNldEludDMyKCJ3aWR0aCIsIG1XaWR0aCk7CisgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoImhlaWdodCIsIG1IZWlnaHQpOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdENvbXBvbmVudENvbmZpZ3VyZWQpOworICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJjb21wb25lbnROYW1lIiwgIk1lZGlhRmlsdGVyIik7CisgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJpbnB1dC1mb3JtYXQiLCBtSW5wdXRGb3JtYXQpOworICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgib3V0cHV0LWZvcm1hdCIsIG1PdXRwdXRGb3JtYXQpOworICAgIG5vdGlmeS0+cG9zdCgpOworICAgIG1TdGF0ZSA9IENPTkZJR1VSRUQ7CisgICAgQUxPR1YoIkhhbmRsZWQga1doYXRDb25maWd1cmVDb21wb25lbnQuIik7CisKKyAgICBzZW5kRm9ybWF0Q2hhbmdlKCk7Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6Om9uU3RhcnQoKSB7CisgICAgQ0hFQ0tfRVEobVN0YXRlLCBDT05GSUdVUkVEKTsKKworICAgIGFsbG9jYXRlQnVmZmVyc09uUG9ydChrUG9ydEluZGV4SW5wdXQpOworCisgICAgYWxsb2NhdGVCdWZmZXJzT25Qb3J0KGtQb3J0SW5kZXhPdXRwdXQpOworCisgICAgc3RhdHVzX3QgZXJyID0gbUZpbHRlci0+c3RhcnQoKTsKKyAgICBpZiAoZXJyICE9IChzdGF0dXNfdClPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHN0YXJ0IGZpbHRlciBjb21wb25lbnQsIGVyciAlZCIsIGVycik7CisgICAgICAgIHNpZ25hbEVycm9yKGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtUG9ydEVPU1trUG9ydEluZGV4SW5wdXRdID0gZmFsc2U7CisgICAgbVBvcnRFT1Nba1BvcnRJbmRleE91dHB1dF0gPSBmYWxzZTsKKyAgICBtSW5wdXRFT1NSZXN1bHQgPSBPSzsKKyAgICBtU3RhdGUgPSBTVEFSVEVEOworCisgICAgcmVxdWVzdEZpbGxFbXB0eUlucHV0KCk7CisgICAgQUxPR1YoIkhhbmRsZWQga1doYXRTdGFydC4iKTsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6b25JbnB1dEJ1ZmZlckZpbGxlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIElPTVg6OmJ1ZmZlcl9pZCBidWZmZXJJRDsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYnVmZmVyLWlkIiwgKGludDMyX3QqKSZidWZmZXJJRCkpOworICAgIEJ1ZmZlckluZm8gKmluZm8gPSBmaW5kQnVmZmVyQnlJRChrUG9ydEluZGV4SW5wdXQsIGJ1ZmZlcklEKTsKKworICAgIGlmIChtU3RhdGUgIT0gU1RBUlRFRCkgeworICAgICAgICAvLyB3ZSdyZSBub3QgcnVubmluZywgc28gd2UnbGwganVzdCBrZWVwIHRoYXQgYnVmZmVyLi4uCisgICAgICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChpbmZvLT5tR2VuZXJhdGlvbiAhPSBtR2VuZXJhdGlvbikgeworICAgICAgICBBTE9HVigiQ2F1Z2h0IGEgc3RhbGUgaW5wdXQgYnVmZmVyIFtJRCAlZF0iLCBidWZmZXJJRCk7CisgICAgICAgIC8vIGJ1ZmZlciBpcyBzdGFsZSAodGFrZW4gYmVmb3JlIGEgZmx1c2gvc2h1dGRvd24pIC0gcmVwb3N0IGl0CisgICAgICAgIENIRUNLX0VRKGluZm8tPm1TdGF0dXMsIEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTKTsKKyAgICAgICAgcG9zdEZpbGxUaGlzQnVmZmVyKGluZm8pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ0hFQ0tfRVEoaW5mby0+bVN0YXR1cywgQnVmZmVySW5mbzo6T1dORURfQllfVVBTVFJFQU0pOworICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUzsKKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICBpbnQzMl90IGVyciA9IE9LOworICAgIGJvb2wgZW9zID0gZmFsc2U7CisKKyAgICBpZiAoIW1zZy0+ZmluZEJ1ZmZlcigiYnVmZmVyIiwgJmJ1ZmZlcikpIHsKKyAgICAgICAgLy8gdGhlc2UgYXJlIHVuZmlsbGVkIGJ1ZmZlcnMgcmV0dXJuZWQgYnkgY2xpZW50CisgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgLy8gYnVmZmVycyB3aXRoIG5vIGVycm9ycyBhcmUgcmV0dXJuZWQgb24gTWVkaWFDb2RlYy5mbHVzaAorICAgICAgICAgICAgQUxPR1YoInNhdyB1bmZpbGxlZCBidWZmZXIgKE1lZGlhQ29kZWMuZmx1c2gpIik7CisgICAgICAgICAgICBwb3N0RmlsbFRoaXNCdWZmZXIoaW5mbyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigic2F3IGVycm9yICVkIGluc3RlYWQgb2YgYW4gaW5wdXQgYnVmZmVyIiwgZXJyKTsKKyAgICAgICAgICAgIGVvcyA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBidWZmZXIuY2xlYXIoKTsKKyAgICB9CisKKyAgICBpbnQzMl90IGlzQ1NEOworICAgIGlmIChidWZmZXIgIT0gTlVMTCAmJiBidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJjc2QiLCAmaXNDU0QpCisgICAgICAgICAgICAmJiBpc0NTRCAhPSAwKSB7CisgICAgICAgIC8vIGlnbm9yZSBjb2RlYy1zcGVjaWZpYyBkYXRhIGJ1ZmZlcnMKKyAgICAgICAgQUxPR1coIk1lZGlhRmlsdGVyIHJlY2VpdmVkIGEgY29kZWMtc3BlY2lmaWMgZGF0YSBidWZmZXIiKTsKKyAgICAgICAgcG9zdEZpbGxUaGlzQnVmZmVyKGluZm8pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCB0bXA7CisgICAgaWYgKGJ1ZmZlciAhPSBOVUxMICYmIGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImVvcyIsICZ0bXApICYmIHRtcCkgeworICAgICAgICBlb3MgPSB0cnVlOworICAgICAgICBlcnIgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0KKworICAgIG1BdmFpbGFibGVJbnB1dEJ1ZmZlcnMucHVzaF9iYWNrKGluZm8pOworICAgIHByb2Nlc3NCdWZmZXJzKCk7CisKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1Qb3J0RU9TW2tQb3J0SW5kZXhJbnB1dF0gPSB0cnVlOworICAgICAgICBtSW5wdXRFT1NSZXN1bHQgPSBlcnI7CisgICAgfQorCisgICAgQUxPR1YoIkhhbmRsZWQga1doYXRJbnB1dEJ1ZmZlckZpbGxlZC4gW0lEICV1XSIsIGJ1ZmZlcklEKTsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6b25PdXRwdXRCdWZmZXJEcmFpbmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlcklEOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJidWZmZXItaWQiLCAoaW50MzJfdCopJmJ1ZmZlcklEKSk7CisgICAgQnVmZmVySW5mbyAqaW5mbyA9IGZpbmRCdWZmZXJCeUlEKGtQb3J0SW5kZXhPdXRwdXQsIGJ1ZmZlcklEKTsKKworICAgIGlmIChtU3RhdGUgIT0gU1RBUlRFRCkgeworICAgICAgICAvLyB3ZSdyZSBub3QgcnVubmluZywgc28gd2UnbGwganVzdCBrZWVwIHRoYXQgYnVmZmVyLi4uCisgICAgICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChpbmZvLT5tR2VuZXJhdGlvbiAhPSBtR2VuZXJhdGlvbikgeworICAgICAgICBBTE9HVigiQ2F1Z2h0IGEgc3RhbGUgb3V0cHV0IGJ1ZmZlciBbSUQgJWRdIiwgYnVmZmVySUQpOworICAgICAgICAvLyBidWZmZXIgaXMgc3RhbGUgKHRha2VuIGJlZm9yZSBhIGZsdXNoL3NodXRkb3duKSAtIGtlZXAgaXQKKyAgICAgICAgQ0hFQ0tfRVEoaW5mby0+bVN0YXR1cywgQnVmZmVySW5mbzo6T1dORURfQllfVVMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ0hFQ0tfRVEoaW5mby0+bVN0YXR1cywgQnVmZmVySW5mbzo6T1dORURfQllfVVBTVFJFQU0pOworICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUzsKKworICAgIG1BdmFpbGFibGVPdXRwdXRCdWZmZXJzLnB1c2hfYmFjayhpbmZvKTsKKworICAgIHByb2Nlc3NCdWZmZXJzKCk7CisKKyAgICBBTE9HVigiSGFuZGxlZCBrV2hhdE91dHB1dEJ1ZmZlckRyYWluZWQuIFtJRCAldV0iLAorICAgICAgICAgICAgYnVmZmVySUQpOworfQorCit2b2lkIE1lZGlhRmlsdGVyOjpvblNodXRkb3duKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgbUdlbmVyYXRpb24rKzsKKworICAgIGlmIChtU3RhdGUgIT0gVU5JTklUSUFMSVpFRCkgeworICAgICAgICBtRmlsdGVyLT5yZXNldCgpOworICAgIH0KKworICAgIGludDMyX3Qga2VlcENvbXBvbmVudEFsbG9jYXRlZDsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigia2VlcENvbXBvbmVudEFsbG9jYXRlZCIsICZrZWVwQ29tcG9uZW50QWxsb2NhdGVkKSk7CisgICAgaWYgKCFrZWVwQ29tcG9uZW50QWxsb2NhdGVkIHx8IG1TdGF0ZSA9PSBVTklOSVRJQUxJWkVEKSB7CisgICAgICAgIG1TdGF0ZSA9IFVOSU5JVElBTElaRUQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVN0YXRlID0gSU5JVElBTElaRUQ7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0U2h1dGRvd25Db21wbGV0ZWQpOworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCit2b2lkIE1lZGlhRmlsdGVyOjpvbkZsdXNoKCkgeworICAgIG1HZW5lcmF0aW9uKys7CisKKyAgICBtQXZhaWxhYmxlSW5wdXRCdWZmZXJzLmNsZWFyKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVyc1trUG9ydEluZGV4SW5wdXRdLnNpemUoKTsgKytpKSB7CisgICAgICAgIEJ1ZmZlckluZm8gKmluZm8gPSAmbUJ1ZmZlcnNba1BvcnRJbmRleElucHV0XS5lZGl0SXRlbUF0KGkpOworICAgICAgICBpbmZvLT5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfVVM7CisgICAgfQorICAgIG1BdmFpbGFibGVPdXRwdXRCdWZmZXJzLmNsZWFyKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XS5zaXplKCk7ICsraSkgeworICAgICAgICBCdWZmZXJJbmZvICppbmZvID0gJm1CdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLmVkaXRJdGVtQXQoaSk7CisgICAgICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUzsKKyAgICAgICAgbUF2YWlsYWJsZU91dHB1dEJ1ZmZlcnMucHVzaF9iYWNrKGluZm8pOworICAgIH0KKworICAgIG1Qb3J0RU9TW2tQb3J0SW5kZXhJbnB1dF0gPSBmYWxzZTsKKyAgICBtUG9ydEVPU1trUG9ydEluZGV4T3V0cHV0XSA9IGZhbHNlOworICAgIG1JbnB1dEVPU1Jlc3VsdCA9IE9LOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpOworICAgIG5vdGlmeS0+cG9zdCgpOworICAgIEFMT0dWKCJQb3N0ZWQga1doYXRGbHVzaENvbXBsZXRlZCIpOworCisgICAgLy8gTWVkaWFDb2RlYyByZXR1cm5zIGFsbCBpbnB1dCBidWZmZXJzIGFmdGVyIGZsdXNoLCBzbyBpbgorICAgIC8vIG9uSW5wdXRCdWZmZXJGaWxsZWQgd2UgY2FsbCBwb3N0RmlsbFRoaXNCdWZmZXIgb24gdGhlbQorfQorCit2b2lkIE1lZGlhRmlsdGVyOjpvblNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBDSEVDSyhtU3RhdGUgIT0gU1RBUlRFRCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtRmlsdGVyLT5zZXRQYXJhbWV0ZXJzKG1zZyk7CisgICAgaWYgKGVyciAhPSAoc3RhdHVzX3QpT0spIHsKKyAgICAgICAgQUxPR0UoInNldFBhcmFtZXRlcnMgcmV0dXJuZWQgZXJyICVkIiwgZXJyKTsKKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6Om9uQ3JlYXRlSW5wdXRTdXJmYWNlKCkgeworICAgIENIRUNLKG1TdGF0ZSA9PSBDT05GSUdVUkVEKTsKKworICAgIG1HcmFwaGljQnVmZmVyTGlzdGVuZXIgPSBuZXcgR3JhcGhpY0J1ZmZlckxpc3RlbmVyOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZSgpOworICAgIG5vdGlmeS0+c2V0VGFyZ2V0KHRoaXMpOworICAgIHN0YXR1c190IGVyciA9IG1HcmFwaGljQnVmZmVyTGlzdGVuZXItPmluaXQoCisgICAgICAgICAgICBub3RpZnksIG1TdHJpZGUsIG1TbGljZUhlaWdodCwga0J1ZmZlckNvdW50QWN0dWFsKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0IG1HcmFwaGljQnVmZmVyTGlzdGVuZXI6ICVkIiwgZXJyKTsKKyAgICAgICAgc2lnbmFsRXJyb3IoZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG1Ob3RpZnktPmR1cCgpOworICAgIHJlcGx5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRJbnB1dFN1cmZhY2VDcmVhdGVkKTsKKyAgICByZXBseS0+c2V0T2JqZWN0KAorICAgICAgICAgICAgImlucHV0LXN1cmZhY2UiLAorICAgICAgICAgICAgbmV3IEJ1ZmZlclByb2R1Y2VyV3JhcHBlcigKKyAgICAgICAgICAgICAgICAgICAgbUdyYXBoaWNCdWZmZXJMaXN0ZW5lci0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpKSk7CisgICAgcmVwbHktPnBvc3QoKTsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6b25JbnB1dEZyYW1lQXZhaWxhYmxlKCkgeworICAgIEJ1ZmZlckl0ZW0gaXRlbSA9IG1HcmFwaGljQnVmZmVyTGlzdGVuZXItPmdldEJ1ZmZlckl0ZW0oKTsKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBidWYgPSBtR3JhcGhpY0J1ZmZlckxpc3RlbmVyLT5nZXRCdWZmZXIoaXRlbSk7CisKKyAgICAvLyBnZXQgcG9pbnRlciB0byBncmFwaGljIGJ1ZmZlcgorICAgIHZvaWQqIGJ1ZlB0cjsKKyAgICBidWYtPmxvY2soR3JhcGhpY0J1ZmZlcjo6VVNBR0VfU1dfUkVBRF9PRlRFTiwgJmJ1ZlB0cik7CisKKyAgICAvLyBIQUNLIC0gdGhlcmUgaXMgbm8gT01YX0NPTE9SX0ZPUk1BVFRZUEUgdmFsdWUgZm9yIFJHQkEsIHNvIHRoZSBmb3JtYXQKKyAgICAvLyBjb252ZXJzaW9uIGlzIGhhcmRjb2RlZCB1bnRpbCB3ZSBhZGQgdGhpcy4KKyAgICAvLyBUT0RPOiBjaGVjayBpbnB1dCBmb3JtYXQgYW5kIGNvbnZlcnQgb25seSBpZiBuZWNlc3NhcnkKKyAgICAvLyBjb3B5IFJHQkEgZ3JhcGhpYyBidWZmZXIgaW50byB0ZW1wb3JhcnkgQVJHQiBpbnB1dCBidWZmZXIKKyAgICBCdWZmZXJJbmZvICppbnB1dEluZm8gPSBuZXcgQnVmZmVySW5mbzsKKyAgICBpbnB1dEluZm8tPm1EYXRhID0gbmV3IEFCdWZmZXIoYnVmLT5nZXRXaWR0aCgpICogYnVmLT5nZXRIZWlnaHQoKSAqIDQpOworICAgIEFMT0dWKCJDb3B5aW5nIHN1cmZhY2UgZGF0YSBpbnRvIHRlbXAgYnVmZmVyLiIpOworICAgIGNvbnZlcnRSR0JBVG9BUkdCKAorICAgICAgICAgICAgKHVpbnQ4X3QqKWJ1ZlB0ciwgYnVmLT5nZXRXaWR0aCgpLCBidWYtPmdldEhlaWdodCgpLAorICAgICAgICAgICAgYnVmLT5nZXRTdHJpZGUoKSwgaW5wdXRJbmZvLT5tRGF0YS0+ZGF0YSgpKTsKKyAgICBpbnB1dEluZm8tPm1CdWZmZXJJRCA9IGl0ZW0ubUJ1ZjsKKyAgICBpbnB1dEluZm8tPm1HZW5lcmF0aW9uID0gbUdlbmVyYXRpb247CisgICAgaW5wdXRJbmZvLT5tT3V0cHV0RmxhZ3MgPSAwOworICAgIGlucHV0SW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTOworICAgIGlucHV0SW5mby0+bURhdGEtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIGl0ZW0ubVRpbWVzdGFtcCAvIDEwMDApOworCisgICAgbUF2YWlsYWJsZUlucHV0QnVmZmVycy5wdXNoX2JhY2soaW5wdXRJbmZvKTsKKworICAgIG1HcmFwaGljQnVmZmVyTGlzdGVuZXItPnJlbGVhc2VCdWZmZXIoaXRlbSk7CisKKyAgICBzaWduYWxQcm9jZXNzQnVmZmVycygpOworfQorCit2b2lkIE1lZGlhRmlsdGVyOjpvblNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSB7CisgICAgLy8gaWYgdXNpbmcgaW5wdXQgc3VyZmFjZSwgbmVlZCB0byBzZW5kIGFuIEVPUyBvdXRwdXQgYnVmZmVyCisgICAgaWYgKG1HcmFwaGljQnVmZmVyTGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBWZWN0b3I8QnVmZmVySW5mbz4gKm91dHB1dEJ1ZnMgPSAmbUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF07CisgICAgICAgIEJ1ZmZlckluZm8qIGVvc0J1ZjsKKyAgICAgICAgYm9vbCBmb3VuZEJ1ZiA9IGZhbHNlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtCdWZmZXJDb3VudEFjdHVhbDsgaSsrKSB7CisgICAgICAgICAgICBlb3NCdWYgPSAmb3V0cHV0QnVmcy0+ZWRpdEl0ZW1BdChpKTsKKyAgICAgICAgICAgIGlmIChlb3NCdWYtPm1TdGF0dXMgPT0gQnVmZmVySW5mbzo6T1dORURfQllfVVMpIHsKKyAgICAgICAgICAgICAgICBmb3VuZEJ1ZiA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWZvdW5kQnVmKSB7CisgICAgICAgICAgICBBTE9HRSgib25TaWduYWxFbmRPZklucHV0U3RyZWFtIGZhaWxlZCB0byBmaW5kIGFuIG91dHB1dCBidWZmZXIiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGVvc0J1Zi0+bU91dHB1dEZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICBlb3NCdWYtPm1HZW5lcmF0aW9uID0gbUdlbmVyYXRpb247CisgICAgICAgIGVvc0J1Zi0+bURhdGEtPnNldFJhbmdlKDAsIDApOworICAgICAgICBwb3N0RHJhaW5UaGlzQnVmZmVyKGVvc0J1Zik7CisgICAgICAgIEFMT0dWKCJQb3N0ZWQgRU9TIG9uIG91dHB1dCBidWZmZXIgJXUiLCBlb3NCdWYtPm1CdWZmZXJJRCk7CisgICAgfQorCisgICAgbVBvcnRFT1Nba1BvcnRJbmRleE91dHB1dF0gPSB0cnVlOworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdFNpZ25hbGVkSW5wdXRFT1MpOworICAgIG5vdGlmeS0+cG9zdCgpOworCisgICAgQUxPR1YoIk91dHB1dCBzdHJlYW0gc2F3IEVPUy4iKTsKK30KKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1JTRmlsdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvUlNGaWx0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Njk5NDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1JTRmlsdGVyLmNwcApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJSU0ZpbHRlciIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKKyNpbmNsdWRlICJSU0ZpbHRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1JTRmlsdGVyOjpSU0ZpbHRlcigpIHsKKworfQorCitSU0ZpbHRlcjo6flJTRmlsdGVyKCkgeworCit9CisKK3N0YXR1c190IFJTRmlsdGVyOjpjb25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBTaW1wbGVGaWx0ZXI6OmNvbmZpZ3VyZShtc2cpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoIW1zZy0+ZmluZFN0cmluZygiY2FjaGVEaXIiLCAmbUNhY2hlRGlyKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGZpbmQgY2FjaGUgZGlyZWN0b3J5IGluIGNvbmZpZyBtZXNzYWdlLiIpOworICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgc3A8UmVuZGVyU2NyaXB0V3JhcHBlcj4gd3JhcHBlcjsKKyAgICBpZiAoIW1zZy0+ZmluZE9iamVjdCgicnMtd3JhcHBlciIsIChzcDxSZWZCYXNlPiopJndyYXBwZXIpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmluZCBSZW5kZXJTY3JpcHRXcmFwcGVyIGluIGNvbmZpZyBtZXNzYWdlLiIpOworICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgbVJTID0gd3JhcHBlci0+bUNvbnRleHQ7CisgICAgbUNhbGxiYWNrID0gd3JhcHBlci0+bUNhbGxiYWNrOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBSU0ZpbHRlcjo6c3RhcnQoKSB7CisgICAgLy8gMzItYml0IGVsZW1lbnRzIGZvciBBUkdCODg4OAorICAgIFJTQzo6c3A8Y29uc3QgUlNDOjpFbGVtZW50PiBlID0gUlNDOjpFbGVtZW50OjpVOF80KG1SUyk7CisKKyAgICBSU0M6OlR5cGU6OkJ1aWxkZXIgdGIobVJTLCBlKTsKKyAgICB0Yi5zZXRYKG1XaWR0aCk7CisgICAgdGIuc2V0WShtSGVpZ2h0KTsKKyAgICBSU0M6OnNwPGNvbnN0IFJTQzo6VHlwZT4gdCA9IHRiLmNyZWF0ZSgpOworCisgICAgbUFsbG9jSW4gPSBSU0M6OkFsbG9jYXRpb246OmNyZWF0ZVR5cGVkKG1SUywgdCk7CisgICAgbUFsbG9jT3V0ID0gUlNDOjpBbGxvY2F0aW9uOjpjcmVhdGVUeXBlZChtUlMsIHQpOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIFJTRmlsdGVyOjpyZXNldCgpIHsKKyAgICBtQ2FsbGJhY2suY2xlYXIoKTsKKyAgICBtQWxsb2NPdXQuY2xlYXIoKTsKKyAgICBtQWxsb2NJbi5jbGVhcigpOworICAgIG1SUy5jbGVhcigpOworfQorCitzdGF0dXNfdCBSU0ZpbHRlcjo6c2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHJldHVybiBtQ2FsbGJhY2stPmhhbmRsZVNldFBhcmFtZXRlcnMobXNnKTsKK30KKworc3RhdHVzX3QgUlNGaWx0ZXI6OnByb2Nlc3NCdWZmZXJzKAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmc3JjQnVmZmVyLCBjb25zdCBzcDxBQnVmZmVyPiAmb3V0QnVmZmVyKSB7CisgICAgbUFsbG9jSW4tPmNvcHkxRFJhbmdlRnJvbSgwLCBtV2lkdGggKiBtSGVpZ2h0LCBzcmNCdWZmZXItPmRhdGEoKSk7CisgICAgbUNhbGxiYWNrLT5wcm9jZXNzQnVmZmVycyhtQWxsb2NJbi5nZXQoKSwgbUFsbG9jT3V0LmdldCgpKTsKKyAgICBtQWxsb2NPdXQtPmNvcHkxRFJhbmdlVG8oMCwgbVdpZHRoICogbUhlaWdodCwgb3V0QnVmZmVyLT5kYXRhKCkpOworCisgICAgcmV0dXJuIE9LOworfQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvUlNGaWx0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvUlNGaWx0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWI1MDc0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9SU0ZpbHRlci5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFJTX0ZJTFRFUl9IXworI2RlZmluZSBSU19GSUxURVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1JlbmRlclNjcmlwdFdyYXBwZXIuaD4KKyNpbmNsdWRlIDxSZW5kZXJTY3JpcHQuaD4KKworI2luY2x1ZGUgIlNpbXBsZUZpbHRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBU3RyaW5nOworCitzdHJ1Y3QgUlNGaWx0ZXIgOiBwdWJsaWMgU2ltcGxlRmlsdGVyIHsKK3B1YmxpYzoKKyAgICBSU0ZpbHRlcigpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc0J1ZmZlcnMoCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmc3JjQnVmZmVyLCBjb25zdCBzcDxBQnVmZmVyPiAmb3V0QnVmZmVyKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflJTRmlsdGVyKCk7CisKK3ByaXZhdGU6CisgICAgQVN0cmluZyBtQ2FjaGVEaXI7CisgICAgc3A8UmVuZGVyU2NyaXB0V3JhcHBlcjo6UlNGaWx0ZXJDYWxsYmFjaz4gbUNhbGxiYWNrOworICAgIFJTQzo6c3A8UlNDOjpSUz4gbVJTOworICAgIFJTQzo6c3A8UlNDOjpBbGxvY2F0aW9uPiBtQWxsb2NJbjsKKyAgICBSU0M6OnNwPFJTQzo6QWxsb2NhdGlvbj4gbUFsbG9jT3V0OworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gUlNfRklMVEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1NhdHVyYXRpb25GaWx0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9TYXR1cmF0aW9uRmlsdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTVmNzVhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9TYXR1cmF0aW9uRmlsdGVyLmNwcApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTYXR1cmF0aW9uRmlsdGVyIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworI2luY2x1ZGUgIlNhdHVyYXRpb25GaWx0ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0dXNfdCBTYXR1cmF0aW9uRmlsdGVyOjpjb25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBTaW1wbGVGaWx0ZXI6OmNvbmZpZ3VyZShtc2cpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoIW1zZy0+ZmluZFN0cmluZygiY2FjaGVEaXIiLCAmbUNhY2hlRGlyKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGZpbmQgY2FjaGUgZGlyZWN0b3J5IGluIGNvbmZpZyBtZXNzYWdlLiIpOworICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTYXR1cmF0aW9uRmlsdGVyOjpzdGFydCgpIHsKKyAgICAvLyBUT0RPOiB1c2UgYSBzaW5nbGUgUlMgY29udGV4dCBvYmplY3QgZm9yIGVudGlyZSBhcHBsaWNhdGlvbgorICAgIG1SUyA9IG5ldyBSU0M6OlJTKCk7CisKKyAgICBpZiAoIW1SUy0+aW5pdChtQ2FjaGVEaXIuY19zdHIoKSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIFJlbmRlclNjcmlwdCBjb250ZXh0LiIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICAvLyAzMi1iaXQgZWxlbWVudHMgZm9yIEFSR0I4ODg4CisgICAgUlNDOjpzcDxjb25zdCBSU0M6OkVsZW1lbnQ+IGUgPSBSU0M6OkVsZW1lbnQ6OlU4XzQobVJTKTsKKworICAgIFJTQzo6VHlwZTo6QnVpbGRlciB0YihtUlMsIGUpOworICAgIHRiLnNldFgobVdpZHRoKTsKKyAgICB0Yi5zZXRZKG1IZWlnaHQpOworICAgIFJTQzo6c3A8Y29uc3QgUlNDOjpUeXBlPiB0ID0gdGIuY3JlYXRlKCk7CisKKyAgICBtQWxsb2NJbiA9IFJTQzo6QWxsb2NhdGlvbjo6Y3JlYXRlVHlwZWQobVJTLCB0KTsKKyAgICBtQWxsb2NPdXQgPSBSU0M6OkFsbG9jYXRpb246OmNyZWF0ZVR5cGVkKG1SUywgdCk7CisKKyAgICBtU2NyaXB0ID0gbmV3IFNjcmlwdENfc2F0dXJhdGlvbkFSR0IobVJTKTsKKworICAgIG1TY3JpcHQtPnNldF9nU2F0dXJhdGlvbihtU2F0dXJhdGlvbik7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgU2F0dXJhdGlvbkZpbHRlcjo6cmVzZXQoKSB7CisgICAgbVNjcmlwdC5jbGVhcigpOworICAgIG1BbGxvY091dC5jbGVhcigpOworICAgIG1BbGxvY0luLmNsZWFyKCk7CisgICAgbVJTLmNsZWFyKCk7Cit9CisKK3N0YXR1c190IFNhdHVyYXRpb25GaWx0ZXI6OnNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzcDxBTWVzc2FnZT4gcGFyYW1zOworICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoInBhcmFtcyIsICZwYXJhbXMpKTsKKworICAgIGZsb2F0IHNhdHVyYXRpb247CisgICAgaWYgKHBhcmFtcy0+ZmluZEZsb2F0KCJzYXR1cmF0aW9uIiwgJnNhdHVyYXRpb24pKSB7CisgICAgICAgIG1TYXR1cmF0aW9uID0gc2F0dXJhdGlvbjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNhdHVyYXRpb25GaWx0ZXI6OnByb2Nlc3NCdWZmZXJzKAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmc3JjQnVmZmVyLCBjb25zdCBzcDxBQnVmZmVyPiAmb3V0QnVmZmVyKSB7CisgICAgbUFsbG9jSW4tPmNvcHkxRFJhbmdlRnJvbSgwLCBtV2lkdGggKiBtSGVpZ2h0LCBzcmNCdWZmZXItPmRhdGEoKSk7CisgICAgbVNjcmlwdC0+Zm9yRWFjaF9yb290KG1BbGxvY0luLCBtQWxsb2NPdXQpOworICAgIG1BbGxvY091dC0+Y29weTFEUmFuZ2VUbygwLCBtV2lkdGggKiBtSGVpZ2h0LCBvdXRCdWZmZXItPmRhdGEoKSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9TYXR1cmF0aW9uRmlsdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1NhdHVyYXRpb25GaWx0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTQ1MDIxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9TYXR1cmF0aW9uRmlsdGVyLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0FUVVJBVElPTl9GSUxURVJfSF8KKyNkZWZpbmUgU0FUVVJBVElPTl9GSUxURVJfSF8KKworI2luY2x1ZGUgPFJlbmRlclNjcmlwdC5oPgorCisjaW5jbHVkZSAiU2NyaXB0Q19zYXR1cmF0aW9uQVJHQi5oIgorI2luY2x1ZGUgIlNpbXBsZUZpbHRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBTYXR1cmF0aW9uRmlsdGVyIDogcHVibGljIFNpbXBsZUZpbHRlciB7CitwdWJsaWM6CisgICAgU2F0dXJhdGlvbkZpbHRlcigpIDogbVNhdHVyYXRpb24oMS5mKSB7fTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3NCdWZmZXJzKAorICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJnNyY0J1ZmZlciwgY29uc3Qgc3A8QUJ1ZmZlcj4gJm91dEJ1ZmZlcik7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5TYXR1cmF0aW9uRmlsdGVyKCkge307CisKK3ByaXZhdGU6CisgICAgQVN0cmluZyBtQ2FjaGVEaXI7CisgICAgUlNDOjpzcDxSU0M6OlJTPiBtUlM7CisgICAgUlNDOjpzcDxSU0M6OkFsbG9jYXRpb24+IG1BbGxvY0luOworICAgIFJTQzo6c3A8UlNDOjpBbGxvY2F0aW9uPiBtQWxsb2NPdXQ7CisgICAgUlNDOjpzcDxTY3JpcHRDX3NhdHVyYXRpb25BUkdCPiBtU2NyaXB0OworICAgIGZsb2F0IG1TYXR1cmF0aW9uOworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gU0FUVVJBVElPTl9GSUxURVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvU2ltcGxlRmlsdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvU2ltcGxlRmlsdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzFjYTJjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9TaW1wbGVGaWx0ZXIuY3BwCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKKyNpbmNsdWRlICJTaW1wbGVGaWx0ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0dXNfdCBTaW1wbGVGaWx0ZXI6OmNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aWR0aCIsICZtV2lkdGgpKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiaGVpZ2h0IiwgJm1IZWlnaHQpKTsKKyAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJzdHJpZGUiLCAmbVN0cmlkZSkpIHsKKyAgICAgICAgbVN0cmlkZSA9IG1XaWR0aDsKKyAgICB9CisgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigic2xpY2UtaGVpZ2h0IiwgJm1TbGljZUhlaWdodCkpIHsKKyAgICAgICAgbVNsaWNlSGVpZ2h0ID0gbUhlaWdodDsKKyAgICB9CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZtQ29sb3JGb3JtYXRJbikpOworICAgIG1Db2xvckZvcm1hdE91dCA9IG1Db2xvckZvcm1hdEluOworCisgICAgcmV0dXJuIE9LOworfQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvU2ltcGxlRmlsdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1NpbXBsZUZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZDM3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1NpbXBsZUZpbHRlci5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNJTVBMRV9GSUxURVJfSF8KKyNkZWZpbmUgU0lNUExFX0ZJTFRFUl9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCitzdHJ1Y3QgQUJ1ZmZlcjsKK3N0cnVjdCBBTWVzc2FnZTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgU2ltcGxlRmlsdGVyIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIFNpbXBsZUZpbHRlcigpIDogbVdpZHRoKDApLCBtSGVpZ2h0KDApLCBtU3RyaWRlKDApLCBtU2xpY2VIZWlnaHQoMCksCisgICAgICAgICAgICBtQ29sb3JGb3JtYXRJbigwKSwgbUNvbG9yRm9ybWF0T3V0KDApIHt9OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBwcm9jZXNzQnVmZmVycygKKyAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZzcmNCdWZmZXIsIGNvbnN0IHNwPEFCdWZmZXI+ICZvdXRCdWZmZXIpID0gMDsKKworcHJvdGVjdGVkOgorICAgIGludDMyX3QgbVdpZHRoLCBtSGVpZ2h0OworICAgIGludDMyX3QgbVN0cmlkZSwgbVNsaWNlSGVpZ2h0OworICAgIGludDMyX3QgbUNvbG9yRm9ybWF0SW4sIG1Db2xvckZvcm1hdE91dDsKKworICAgIHZpcnR1YWwgflNpbXBsZUZpbHRlcigpIHt9OworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gU0lNUExFX0ZJTFRFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9aZXJvRmlsdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvWmVyb0ZpbHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YxMjQzYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvWmVyb0ZpbHRlci5jcHAKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiWmVyb0ZpbHRlciIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCisjaW5jbHVkZSAiWmVyb0ZpbHRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXR1c190IFplcm9GaWx0ZXI6OnNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzcDxBTWVzc2FnZT4gcGFyYW1zOworICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoInBhcmFtcyIsICZwYXJhbXMpKTsKKworICAgIGludDMyX3QgaW52ZXJ0OworICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMigiaW52ZXJ0IiwgJmludmVydCkpIHsKKyAgICAgICAgbUludmVydERhdGEgPSAoaW52ZXJ0ICE9IDApOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgWmVyb0ZpbHRlcjo6cHJvY2Vzc0J1ZmZlcnMoCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZzcmNCdWZmZXIsIGNvbnN0IHNwPEFCdWZmZXI+ICZvdXRCdWZmZXIpIHsKKyAgICAvLyBhc3N1bWluZyBpZGVudGljYWwgaW5wdXQgJiBvdXRwdXQgYnVmZmVycywgc2luY2Ugd2UncmUgYSBjb3B5IGZpbHRlcgorICAgIGlmIChtSW52ZXJ0RGF0YSkgeworICAgICAgICB1aW50MzJfdCogc3JjID0gKHVpbnQzMl90KilzcmNCdWZmZXItPmRhdGEoKTsKKyAgICAgICAgdWludDMyX3QqIGRlc3QgPSAodWludDMyX3QqKW91dEJ1ZmZlci0+ZGF0YSgpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNyY0J1ZmZlci0+c2l6ZSgpIC8gNDsgKytpKSB7CisgICAgICAgICAgICAqKGRlc3QrKykgPSAqKHNyYysrKSBeIDB4RkZGRkZGRkY7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtZW1jcHkob3V0QnVmZmVyLT5kYXRhKCksIHNyY0J1ZmZlci0+ZGF0YSgpLCBzcmNCdWZmZXItPnNpemUoKSk7CisgICAgfQorICAgIG91dEJ1ZmZlci0+c2V0UmFuZ2UoMCwgc3JjQnVmZmVyLT5zaXplKCkpOworCisgICAgcmV0dXJuIE9LOworfQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvWmVyb0ZpbHRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9aZXJvRmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQzNGRmYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvWmVyb0ZpbHRlci5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFpFUk9fRklMVEVSX0hfCisjZGVmaW5lIFpFUk9fRklMVEVSX0hfCisKKyNpbmNsdWRlICJTaW1wbGVGaWx0ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgWmVyb0ZpbHRlciA6IHB1YmxpYyBTaW1wbGVGaWx0ZXIgeworcHVibGljOgorICAgIFplcm9GaWx0ZXIoKSA6IG1JbnZlcnREYXRhKGZhbHNlKSB7fTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSB7IHJldHVybiBPSzsgfTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKSB7fTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc0J1ZmZlcnMoCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmc3JjQnVmZmVyLCBjb25zdCBzcDxBQnVmZmVyPiAmb3V0QnVmZmVyKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflplcm9GaWx0ZXIoKSB7fTsKKworcHJpdmF0ZToKKyAgICBib29sIG1JbnZlcnREYXRhOworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gWkVST19GSUxURVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvc2F0dXJhdGlvbi5ycyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvc2F0dXJhdGlvbi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzg2N2FjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9zYXR1cmF0aW9uLnJzCkBAIC0wLDAgKzEsNDAgQEAKKy8vIFNhbXBsZSBzY3JpcHQgZm9yIFJHQjg4OCBzdXBwb3J0IChjb21wYXJlIHRvIHNhdHVyYXRpb25BUkdCLnJzKQorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgdmVyc2lvbigxKQorI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5ycy5jcHBiYXNpYykKKyNwcmFnbWEgcnNfZnBfcmVsYXhlZAorCitjb25zdCBzdGF0aWMgZmxvYXQzIGdNb25vTXVsdCA9IHswLjI5OWYsIDAuNTg3ZiwgMC4xMTRmfTsKKworLy8gZ2xvYmFsIHZhcmlhYmxlcyAocGFyYW1ldGVycyBhY2Nlc3NpYmxlIHRvIGFwcGxpY2F0aW9uIGNvZGUpCitmbG9hdCBnU2F0dXJhdGlvbiA9IDEuMGY7CisKK3ZvaWQgcm9vdChjb25zdCB1Y2hhcjMgKnZfaW4sIHVjaGFyMyAqdl9vdXQpIHsKKyAgICAvLyBzY2FsZSAwLTI1NSB1Y2hhciB0byAwLTEuMCBmbG9hdAorICAgIGZsb2F0MyBpbiA9IHt2X2luLT5yICogMC4wMDM5MjE1NjlmLCB2X2luLT5nICogMC4wMDM5MjE1NjlmLAorICAgICAgICAgICAgdl9pbi0+YiAqIDAuMDAzOTIxNTY5Zn07CisKKyAgICAvLyBhcHBseSBzYXR1cmF0aW9uIGZpbHRlcgorICAgIGZsb2F0MyByZXN1bHQgPSBkb3QoaW4sIGdNb25vTXVsdCk7CisgICAgcmVzdWx0ID0gbWl4KHJlc3VsdCwgaW4sIGdTYXR1cmF0aW9uKTsKKworICAgIC8vIGNvbnZlcnQgdG8gdWNoYXIsIGNvcGllZCBmcm9tIHJzUGFja0NvbG9yVG84ODg4CisgICAgdl9vdXQtPnggPSAodWNoYXIpY2xhbXAoKHJlc3VsdC5yICogMjU1LmYgKyAwLjVmKSwgMC5mLCAyNTUuZik7CisgICAgdl9vdXQtPnkgPSAodWNoYXIpY2xhbXAoKHJlc3VsdC5nICogMjU1LmYgKyAwLjVmKSwgMC5mLCAyNTUuZik7CisgICAgdl9vdXQtPnogPSAodWNoYXIpY2xhbXAoKHJlc3VsdC5iICogMjU1LmYgKyAwLjVmKSwgMC5mLCAyNTUuZik7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL3NhdHVyYXRpb25BUkdCLnJzIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9zYXR1cmF0aW9uQVJHQi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGU5ZGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9zYXR1cmF0aW9uQVJHQi5ycwpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSB2ZXJzaW9uKDEpCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLnJzLmNwcGJhc2ljKQorI3ByYWdtYSByc19mcF9yZWxheGVkCisKK2NvbnN0IHN0YXRpYyBmbG9hdDMgZ01vbm9NdWx0ID0gezAuMjk5ZiwgMC41ODdmLCAwLjExNGZ9OworCisvLyBnbG9iYWwgdmFyaWFibGVzIChwYXJhbWV0ZXJzIGFjY2Vzc2libGUgdG8gYXBwbGljYXRpb24gY29kZSkKK2Zsb2F0IGdTYXR1cmF0aW9uID0gMS4wZjsKKwordm9pZCByb290KGNvbnN0IHVjaGFyNCAqdl9pbiwgdWNoYXI0ICp2X291dCkgeworICAgIHZfb3V0LT54ID0gdl9pbi0+eDsgLy8gZG9uJ3QgbW9kaWZ5IEEKKworICAgIC8vIGdldCBSR0IsIHNjYWxlIDAtMjU1IHVjaGFyIHRvIDAtMS4wIGZsb2F0CisgICAgZmxvYXQzIHJnYiA9IHt2X2luLT55ICogMC4wMDM5MjE1NjlmLCB2X2luLT56ICogMC4wMDM5MjE1NjlmLAorICAgICAgICAgICAgdl9pbi0+dyAqIDAuMDAzOTIxNTY5Zn07CisKKyAgICAvLyBhcHBseSBzYXR1cmF0aW9uIGZpbHRlcgorICAgIGZsb2F0MyByZXN1bHQgPSBkb3QocmdiLCBnTW9ub011bHQpOworICAgIHJlc3VsdCA9IG1peChyZXN1bHQsIHJnYiwgZ1NhdHVyYXRpb24pOworCisgICAgdl9vdXQtPnkgPSAodWNoYXIpY2xhbXAoKHJlc3VsdC5yICogMjU1LmYgKyAwLjVmKSwgMC5mLCAyNTUuZik7CisgICAgdl9vdXQtPnogPSAodWNoYXIpY2xhbXAoKHJlc3VsdC5nICogMjU1LmYgKyAwLjVmKSwgMC5mLCAyNTUuZik7CisgICAgdl9vdXQtPncgPSAodWNoYXIpY2xhbXAoKHJlc3VsdC5iICogMjU1LmYgKyAwLjVmKSwgMC5mLCAyNTUuZik7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmNwcAppbmRleCA0OTEzZmQ0Li5hNWI4MWE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5jcHAKQEAgLTUyLDYgKzUyLDkgQEAKIHNwPEFCdWZmZXI+IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgY2FwYWNpdHkpCiB7CiAgICAgc3A8QUJ1ZmZlcj4gcmVzID0gbmV3IEFCdWZmZXIoY2FwYWNpdHkpOworICAgIGlmIChyZXMtPmJhc2UoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICAgICBtZW1jcHkocmVzLT5kYXRhKCksIGRhdGEsIGNhcGFjaXR5KTsKICAgICByZXR1cm4gcmVzOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuY3BwCmluZGV4IGVjNGE5NjAuLjJjNWY1NDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxjdHlwZS5oPgogCiAjZGVmaW5lIExPR19UQUcgIkFEZWJ1ZyIKKyNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgogCkBAIC0yOCwxNCArMjksMTUgQEAKICNpbmNsdWRlIDxBU3RyaW5nVXRpbHMuaD4KICNpbmNsdWRlIDxBVXRpbHMuaD4KIAorI2RlZmluZSBVTlVTRUQoeCkgKCh2b2lkKSh4KSkKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvL3N0YXRpYwotQURlYnVnOjpMZXZlbCBBRGVidWc6OkdldERlYnVnTGV2ZWxGcm9tU3RyaW5nKAotICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSwgQURlYnVnOjpMZXZlbCBkZWYpIHsKK2xvbmcgQURlYnVnOjpHZXRMZXZlbEZyb21TZXR0aW5nc1N0cmluZygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIGxvbmcgZGVmKSB7CiAgICAgLy8gc3BsaXQgb24gLAogICAgIGNvbnN0IGNoYXIgKm5leHQgPSB2YWx1ZSwgKmN1cnJlbnQ7Ci0gICAgY29uc3QgdW5zaWduZWQgbG9uZyBtYXhMZXZlbCA9ICh1bnNpZ25lZCBsb25nKWtEZWJ1Z01heDsKICAgICB3aGlsZSAobmV4dCAhPSBOVUxMKSB7CiAgICAgICAgIGN1cnJlbnQgPSBuZXh0OwogICAgICAgICBuZXh0ID0gc3RyY2hyKGN1cnJlbnQsICcsJyk7CkBAIC01MSw4ICs1Myw4IEBACiAKICAgICAgICAgLy8gZ2V0IGxldmVsCiAgICAgICAgIGNoYXIgKmVuZDsKLSAgICAgICAgZXJybm8gPSAwOyAgLy8gc3RydG91bCBkb2VzIG5vdCBjbGVhciBlcnJubywgYnV0IGl0IGNhbiBiZSBzZXQgZm9yIGFueSByZXR1cm4gdmFsdWUKLSAgICAgICAgdW5zaWduZWQgbG9uZyBsZXZlbCA9IHN0cnRvdWwoY3VycmVudCwgJmVuZCwgMTApOworICAgICAgICBlcnJubyA9IDA7ICAvLyBzdHJ0b2wgZG9lcyBub3QgY2xlYXIgZXJybm8sIGJ1dCBpdCBjYW4gYmUgc2V0IGZvciBhbnkgcmV0dXJuIHZhbHVlCisgICAgICAgIGxvbmcgbGV2ZWwgPSBzdHJ0b2woY3VycmVudCwgJmVuZCwgMTApOwogICAgICAgICB3aGlsZSAoaXNzcGFjZSgqZW5kKSkgewogICAgICAgICAgICAgKytlbmQ7CiAgICAgICAgIH0KQEAgLTc2LDggKzc4LDE4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLyB1cGRhdGUgZGVidWcgbGV2ZWwKLSAgICAgICAgZGVmID0gKExldmVsKW1pbihsZXZlbCwgbWF4TGV2ZWwpOworICAgICAgICAvLyB1cGRhdGUgdmFsdWUKKyAgICAgICAgZGVmID0gbGV2ZWw7CisgICAgfQorICAgIHJldHVybiBkZWY7Cit9CisKKy8vc3RhdGljCitsb25nIEFEZWJ1Zzo6R2V0TGV2ZWxGcm9tUHJvcGVydHkoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnByb3BlcnR5TmFtZSwgbG9uZyBkZWYpIHsKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldChwcm9wZXJ0eU5hbWUsIHZhbHVlLCBOVUxMKSkgeworICAgICAgICBkZWYgPSBHZXRMZXZlbEZyb21TZXR0aW5nc1N0cmluZyhuYW1lLCB2YWx1ZSwgZGVmKTsKICAgICB9CiAgICAgcmV0dXJuIGRlZjsKIH0KQEAgLTg1LDExICs5Nyw4IEBACiAvL3N0YXRpYwogQURlYnVnOjpMZXZlbCBBRGVidWc6OkdldERlYnVnTGV2ZWxGcm9tUHJvcGVydHkoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnByb3BlcnR5TmFtZSwgQURlYnVnOjpMZXZlbCBkZWYpIHsKLSAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgaWYgKHByb3BlcnR5X2dldChwcm9wZXJ0eU5hbWUsIHZhbHVlLCBOVUxMKSkgewotICAgICAgICByZXR1cm4gR2V0RGVidWdMZXZlbEZyb21TdHJpbmcobmFtZSwgdmFsdWUsIGRlZik7Ci0gICAgfQotICAgIHJldHVybiBkZWY7CisgICAgbG9uZyBsZXZlbCA9IEdldExldmVsRnJvbVByb3BlcnR5KG5hbWUsIHByb3BlcnR5TmFtZSwgKGxvbmcpZGVmKTsKKyAgICByZXR1cm4gKExldmVsKW1pbihtYXgobGV2ZWwsIChsb25nKWtEZWJ1Z05vbmUpLCAobG9uZylrRGVidWdNYXgpOwogfQogCiAvL3N0YXRpYwpAQCAtMTEzLDUgKzEyMiw2OSBAQAogICAgIHJldHVybiBkZWJ1Z05hbWU7CiB9CiAKKy8vc3RhdGljCitib29sIEFEZWJ1Zzo6Z2V0RXhwZXJpbWVudEZsYWcoCisgICAgICAgIGJvb2wgYWxsb3csIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQ2NF90IG1vZHVsbywKKyAgICAgICAgdWludDY0X3QgbGltaXQsIHVpbnQ2NF90IHBsdXMsIHVpbnQ2NF90IHRpbWVEaXZpc29yKSB7CisgICAgLy8gc2VlIGlmIHRoaXMgZXhwZXJpbWVudCBzaG91bGQgYmUgZGlzYWJsZWQvZW5hYmxlZCBiYXNlZCBvbiBwcm9wZXJ0aWVzLgorICAgIC8vIGRlZmF1bHQgdG8gMiB0byBhbGxvdyAwLzEgc3BlY2lmaWNhdGlvbgorICAgIGNvbnN0IGludCB1bmRlZmluZWQgPSAyOworICAgIGxvbmcgbGV2ZWwgPSBHZXRMZXZlbEZyb21Qcm9wZXJ0eShuYW1lLCAiZGVidWcuc3RhZ2VmcmlnaHQuZXhwZXJpbWVudHMiLCB1bmRlZmluZWQpOworICAgIGlmIChsZXZlbCAhPSB1bmRlZmluZWQpIHsKKyAgICAgICAgQUxPR0koImV4cGVyaW1lbnQgJyVzJzogJXMgZnJvbSBwcm9wZXJ0eSIsIG5hbWUsIGxldmVsID8gIkVOQUJMRUQiIDogImRpc2FibGVkIik7CisgICAgICAgIHJldHVybiBhbGxvdyAmJiAobGV2ZWwgIT0gMCk7CisgICAgfQorCisjaWZuZGVmIEVOQUJMRV9TVEFHRUZSSUdIVF9BVVRPX0VYUEVSSU1FTlRTCisgICAgVU5VU0VEKG1vZHVsbyk7CisgICAgVU5VU0VEKGxpbWl0KTsKKyAgICBVTlVTRUQocGx1cyk7CisgICAgVU5VU0VEKHRpbWVEaXZpc29yKTsKKyAgICByZXR1cm4gZmFsc2U7CisjZWxzZQorICAgIC8vIERpc2FibGUgYXV0b21hdGljIGV4cGVyaW1lbnRzIGluICJub24tZXhwZXJpbWVudGFsIiBidWlsZHMgKHRoYXQgaXMsIF9hbGxfIGJ1aWxkcworICAgIC8vIGFzIHRoZXJlIGlzIG5vICJleHBlcmltZW50YWwiIGJ1aWxkKS4KKyAgICAvLyBUT0RPOiBjaGFuZ2UgYnVpbGQgdHlwZSB0byBlbmFibGUgYXV0b21hdGljIGV4cGVyaW1lbnRzIGluIHRoZSBmdXR1cmUgZm9yIHNvbWUgYnVpbGRzCisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoInJvLmJ1aWxkLnR5cGUiLCB2YWx1ZSwgTlVMTCkpIHsKKyAgICAgICAgaWYgKHN0cmNtcCh2YWx1ZSwgImV4cGVyaW1lbnRhbCIpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdm9sYXRpbGUgaW50MzJfdCBoYXZlU2VyaWFsID0gMDsKKyAgICBzdGF0aWMgdWludDY0X3Qgc2VyaWFsTnVtOworICAgIGlmICghYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZoYXZlU2VyaWFsKSkgeworICAgICAgICAvLyBjYWxjdWxhdGUgaW5pdGlhbCBjb3VudGVyIHZhbHVlIGJhc2VkIG9uIHNlcmlhbCBudW1iZXIKKyAgICAgICAgc3RhdGljIGNoYXIgc2VyaWFsW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgICAgIHByb3BlcnR5X2dldCgicm8uc2VyaWFsbm8iLCBzZXJpYWwsICIwIik7CisgICAgICAgIHVpbnQ2NF90IG51bSA9IDA7IC8vIGl0IGlzIG9rYXkgZm9yIHRoaXMgbnVtYmVyIHRvIG92ZXJmbG93CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTkVMRU0oc2VyaWFsKSAmJiBzZXJpYWxbaV0gIT0gJ1wwJzsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICZjID0gc2VyaWFsW2ldOworICAgICAgICAgICAgLy8gdHJ5IHRvIHVzZSBtb3N0IGxldHRlcnMgb2Ygc2VyaWFsbm8KKyAgICAgICAgICAgIGlmIChpc2RpZ2l0KGMpKSB7CisgICAgICAgICAgICAgICAgbnVtID0gbnVtICogMTAgKyAoYyAtICcwJyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlzbG93ZXIoYykpIHsKKyAgICAgICAgICAgICAgICBudW0gPSBudW0gKiAyNiArIChjIC0gJ2EnKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXN1cHBlcihjKSkgeworICAgICAgICAgICAgICAgIG51bSA9IG51bSAqIDI2ICsgKGMgLSAnQScpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBudW0gPSBudW0gKiAyNTYgKyBjOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNlcmlhbE51bSA9IG51bTsKKyAgICAgICAgYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9zdG9yZSgxLCAmaGF2ZVNlcmlhbCk7CisgICAgfQorICAgIEFMT0dEKCJzZXJpYWw6ICVsbHUsIHRpbWU6ICVsbGQiLCAobG9uZyBsb25nIHVuc2lnbmVkKXNlcmlhbE51bSwgKGxvbmcgbG9uZyl0aW1lKE5VTEwpKTsKKyAgICAvLyBNSU5PUjogdXNlIG1vZHVsbyBmb3IgY291bnRlciBhbmQgdGltZSwgc28gdGhhdCB0aGVpciBzdW0gZG9lcyBub3QKKyAgICAvLyByb2xsIG92ZXIsIGFuZCBtZXNzIHVwIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHJlbGF0ZWQgZXhwZXJpbWVudHMuCisgICAgLy8gZS5nLiBrZWVwIChhIG1vZCAyTikgPSAwIGltcGwgKGEgbW9kIE4pID0gMAorICAgIHRpbWVfdCBjb3VudGVyID0gKHRpbWUoTlVMTCkgLyB0aW1lRGl2aXNvcikgJSBtb2R1bG8gKyBwbHVzICsgc2VyaWFsTnVtICUgbW9kdWxvOworICAgIGJvb2wgZW5hYmxlID0gYWxsb3cgJiYgKGNvdW50ZXIgJSBtb2R1bG8gPCBsaW1pdCk7CisgICAgQUxPR0koImV4cGVyaW1lbnQgJyVzJzogJXMiLCBuYW1lLCBlbmFibGUgPyAiRU5BQkxFRCIgOiAiZGlzYWJsZWQiKTsKKyAgICByZXR1cm4gZW5hYmxlOworI2VuZGlmCit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5jcHAKaW5kZXggYmQ1ZjdlOS4uN2RiYmU1NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5jcHAKQEAgLTE5LDE1ICsxOSwyMyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXNwPEFMb29wZXI+IEFIYW5kbGVyOjpsb29wZXIoKSB7Ci0gICAgZXh0ZXJuIEFMb29wZXJSb3N0ZXIgZ0xvb3BlclJvc3RlcjsKK3ZvaWQgQUhhbmRsZXI6OmRlbGl2ZXJNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgb25NZXNzYWdlUmVjZWl2ZWQobXNnKTsKKyAgICBtTWVzc2FnZUNvdW50ZXIrKzsKIAotICAgIHJldHVybiBnTG9vcGVyUm9zdGVyLmZpbmRMb29wZXIoaWQoKSk7CisgICAgaWYgKG1WZXJib3NlU3RhdHMpIHsKKyAgICAgICAgdWludDMyX3Qgd2hhdCA9IG1zZy0+d2hhdCgpOworICAgICAgICBzc2l6ZV90IGlkeCA9IG1NZXNzYWdlcy5pbmRleE9mS2V5KHdoYXQpOworICAgICAgICBpZiAoaWR4IDwgMCkgeworICAgICAgICAgICAgbU1lc3NhZ2VzLmFkZCh3aGF0LCAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1NZXNzYWdlcy5lZGl0VmFsdWVBdChpZHgpKys7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcAppbmRleCA1ZjdjNzBkLi5iODM3ZjY2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAKQEAgLTEwOSw3ICsxMDksOCBAQAogICAgICAgICBBLmVkaXRJdGVtQXQoaSktPnN0YXRlRXhpdGVkKCk7CiAgICAgfQogCi0gICAgZm9yIChzaXplX3QgaSA9IEIuc2l6ZSgpOyBpLS0gPiAwOykgeworICAgIGZvciAoc2l6ZV90IGkgPSBCLnNpemUoKTsgaSA+IDA7KSB7CisgICAgICAgIGktLTsKICAgICAgICAgQi5lZGl0SXRlbUF0KGkpLT5zdGF0ZUVudGVyZWQoKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmNwcAppbmRleCA4OGIxYzkyLi45MGI1ZjY4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAKQEAgLTE2LDYgKzE2LDkgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJBTG9vcGVyIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KQEAgLTIxMCw3ICsyMTMsNyBAQAogICAgICAgICBtRXZlbnRRdWV1ZS5lcmFzZShtRXZlbnRRdWV1ZS5iZWdpbigpKTsKICAgICB9CiAKLSAgICBnTG9vcGVyUm9zdGVyLmRlbGl2ZXJNZXNzYWdlKGV2ZW50Lm1NZXNzYWdlKTsKKyAgICBldmVudC5tTWVzc2FnZS0+ZGVsaXZlcigpOwogCiAgICAgLy8gTk9URTogSXQncyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IGF0IHRoaXMgcG9pbnQgb3VyICJBTG9vcGVyIiBvYmplY3QKICAgICAvLyBtYXkgbm8gbG9uZ2VyIGV4aXN0IChpdHMgZmluYWwgcmVmZXJlbmNlIG1heSBoYXZlIGdvbmUgYXdheSB3aGlsZQpAQCAtMjIwLDQgKzIyMywyOSBAQAogICAgIHJldHVybiB0cnVlOwogfQogCisvLyB0byBiZSBjYWxsZWQgYnkgQU1lc3NhZ2U6OnBvc3RBbmRBd2FpdFJlc3BvbnNlIG9ubHkKK3NwPEFSZXBseVRva2VuPiBBTG9vcGVyOjpjcmVhdGVSZXBseVRva2VuKCkgeworICAgIHJldHVybiBuZXcgQVJlcGx5VG9rZW4odGhpcyk7Cit9CisKKy8vIHRvIGJlIGNhbGxlZCBieSBBTWVzc2FnZTo6cG9zdEFuZEF3YWl0UmVzcG9uc2Ugb25seQorc3RhdHVzX3QgQUxvb3Blcjo6YXdhaXRSZXNwb25zZShjb25zdCBzcDxBUmVwbHlUb2tlbj4gJnJlcGx5VG9rZW4sIHNwPEFNZXNzYWdlPiAqcmVzcG9uc2UpIHsKKyAgICAvLyByZXR1cm4gc3RhdHVzIGluIGNhc2Ugd2Ugd2FudCB0byBoYW5kbGUgYW4gaW50ZXJydXB0ZWQgd2FpdAorICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUmVwbGllc0xvY2spOworICAgIENIRUNLKHJlcGx5VG9rZW4gIT0gTlVMTCk7CisgICAgd2hpbGUgKCFyZXBseVRva2VuLT5yZXRyaWV2ZVJlcGx5KHJlc3BvbnNlKSkgeworICAgICAgICBtUmVwbGllc0NvbmRpdGlvbi53YWl0KG1SZXBsaWVzTG9jayk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQUxvb3Blcjo6cG9zdFJlcGx5KGNvbnN0IHNwPEFSZXBseVRva2VuPiAmcmVwbHlUb2tlbiwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUmVwbGllc0xvY2spOworICAgIHN0YXR1c190IGVyciA9IHJlcGx5VG9rZW4tPnNldFJlcGx5KHJlcGx5KTsKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIG1SZXBsaWVzQ29uZGl0aW9uLmJyb2FkY2FzdCgpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5jcHAKaW5kZXggMmQ1N2FlZS4uOWVkNTNlNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuY3BwCkBAIC0zMCw4ICszMCw3IEBACiBzdGF0aWMgYm9vbCB2ZXJib3NlU3RhdHMgPSBmYWxzZTsKIAogQUxvb3BlclJvc3Rlcjo6QUxvb3BlclJvc3RlcigpCi0gICAgOiBtTmV4dEhhbmRsZXJJRCgxKSwKLSAgICAgIG1OZXh0UmVwbHlJRCgxKSB7CisgICAgOiBtTmV4dEhhbmRsZXJJRCgxKSB7CiB9CiAKIEFMb29wZXI6OmhhbmRsZXJfaWQgQUxvb3BlclJvc3Rlcjo6cmVnaXN0ZXJIYW5kbGVyKApAQCAtNDksNyArNDgsNyBAQAogICAgIEFMb29wZXI6OmhhbmRsZXJfaWQgaGFuZGxlcklEID0gbU5leHRIYW5kbGVySUQrKzsKICAgICBtSGFuZGxlcnMuYWRkKGhhbmRsZXJJRCwgaW5mbyk7CiAKLSAgICBoYW5kbGVyLT5zZXRJRChoYW5kbGVySUQpOworICAgIGhhbmRsZXItPnNldElEKGhhbmRsZXJJRCwgbG9vcGVyKTsKIAogICAgIHJldHVybiBoYW5kbGVySUQ7CiB9CkBAIC02OCw3ICs2Nyw3IEBACiAgICAgc3A8QUhhbmRsZXI+IGhhbmRsZXIgPSBpbmZvLm1IYW5kbGVyLnByb21vdGUoKTsKIAogICAgIGlmIChoYW5kbGVyICE9IE5VTEwpIHsKLSAgICAgICAgaGFuZGxlci0+c2V0SUQoMCk7CisgICAgICAgIGhhbmRsZXItPnNldElEKDAsIE5VTEwpOwogICAgIH0KIAogICAgIG1IYW5kbGVycy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKQEAgLTgwLDcgKzc5LDggQEAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IG1IYW5kbGVycy5zaXplKCk7IGktLSA+IDA7KSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSBtSGFuZGxlcnMuc2l6ZSgpOyBpID4gMDspIHsKKyAgICAgICAgICAgIGktLTsKICAgICAgICAgICAgIGNvbnN0IEhhbmRsZXJJbmZvICZpbmZvID0gbUhhbmRsZXJzLnZhbHVlQXQoaSk7CiAKICAgICAgICAgICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IGluZm8ubUxvb3Blci5wcm9tb3RlKCk7CkBAIC0xMDAsMTE2ICsxMDAsNiBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgQUxvb3BlclJvc3Rlcjo6cG9zdE1lc3NhZ2UoCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBpbnQ2NF90IGRlbGF5VXMpIHsKLQotICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IGZpbmRMb29wZXIobXNnLT50YXJnZXQoKSk7Ci0KLSAgICBpZiAobG9vcGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9FTlQ7Ci0gICAgfQotICAgIGxvb3Blci0+cG9zdChtc2csIGRlbGF5VXMpOwotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBBTG9vcGVyUm9zdGVyOjpkZWxpdmVyTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIHNwPEFIYW5kbGVyPiBoYW5kbGVyOwotCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgICAgIHNzaXplX3QgaW5kZXggPSBtSGFuZGxlcnMuaW5kZXhPZktleShtc2ctPnRhcmdldCgpKTsKLQotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiZmFpbGVkIHRvIGRlbGl2ZXIgbWVzc2FnZS4gVGFyZ2V0IGhhbmRsZXIgbm90IHJlZ2lzdGVyZWQuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBIYW5kbGVySW5mbyAmaW5mbyA9IG1IYW5kbGVycy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgaGFuZGxlciA9IGluZm8ubUhhbmRsZXIucHJvbW90ZSgpOwotCi0gICAgICAgIGlmIChoYW5kbGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gZGVsaXZlciBtZXNzYWdlLiAiCi0gICAgICAgICAgICAgICAgICJUYXJnZXQgaGFuZGxlciAlZCByZWdpc3RlcmVkLCBidXQgb2JqZWN0IGdvbmUuIiwKLSAgICAgICAgICAgICAgICAgbXNnLT50YXJnZXQoKSk7Ci0KLSAgICAgICAgICAgIG1IYW5kbGVycy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGhhbmRsZXItPm9uTWVzc2FnZVJlY2VpdmVkKG1zZyk7Ci0gICAgaGFuZGxlci0+bU1lc3NhZ2VDb3VudGVyKys7Ci0KLSAgICBpZiAodmVyYm9zZVN0YXRzKSB7Ci0gICAgICAgIHVpbnQzMl90IHdoYXQgPSBtc2ctPndoYXQoKTsKLSAgICAgICAgc3NpemVfdCBpZHggPSBoYW5kbGVyLT5tTWVzc2FnZXMuaW5kZXhPZktleSh3aGF0KTsKLSAgICAgICAgaWYgKGlkeCA8IDApIHsKLSAgICAgICAgICAgIGhhbmRsZXItPm1NZXNzYWdlcy5hZGQod2hhdCwgMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBoYW5kbGVyLT5tTWVzc2FnZXMuZWRpdFZhbHVlQXQoaWR4KSsrOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zcDxBTG9vcGVyPiBBTG9vcGVyUm9zdGVyOjpmaW5kTG9vcGVyKEFMb29wZXI6OmhhbmRsZXJfaWQgaGFuZGxlcklEKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtSGFuZGxlcnMuaW5kZXhPZktleShoYW5kbGVySUQpOwotCi0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBzcDxBTG9vcGVyPiBsb29wZXIgPSBtSGFuZGxlcnMudmFsdWVBdChpbmRleCkubUxvb3Blci5wcm9tb3RlKCk7Ci0KLSAgICBpZiAobG9vcGVyID09IE5VTEwpIHsKLSAgICAgICAgbUhhbmRsZXJzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbG9vcGVyOwotfQotCi1zdGF0dXNfdCBBTG9vcGVyUm9zdGVyOjpwb3N0QW5kQXdhaXRSZXNwb25zZSgKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIHNwPEFNZXNzYWdlPiAqcmVzcG9uc2UpIHsKLSAgICBzcDxBTG9vcGVyPiBsb29wZXIgPSBmaW5kTG9vcGVyKG1zZy0+dGFyZ2V0KCkpOwotCi0gICAgaWYgKGxvb3BlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gcG9zdCBtZXNzYWdlLiAiCi0gICAgICAgICAgICAgICAgIlRhcmdldCBoYW5kbGVyICVkIHN0aWxsIHJlZ2lzdGVyZWQsIGJ1dCBvYmplY3QgZ29uZS4iLAotICAgICAgICAgICAgICAgIG1zZy0+dGFyZ2V0KCkpOwotICAgICAgICByZXNwb25zZS0+Y2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIC1FTk9FTlQ7Ci0gICAgfQotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHVpbnQzMl90IHJlcGx5SUQgPSBtTmV4dFJlcGx5SUQrKzsKLQotICAgIG1zZy0+c2V0SW50MzIoInJlcGx5SUQiLCByZXBseUlEKTsKLQotICAgIGxvb3Blci0+cG9zdChtc2csIDAgLyogZGVsYXlVcyAqLyk7Ci0KLSAgICBzc2l6ZV90IGluZGV4OwotICAgIHdoaWxlICgoaW5kZXggPSBtUmVwbGllcy5pbmRleE9mS2V5KHJlcGx5SUQpKSA8IDApIHsKLSAgICAgICAgbVJlcGxpZXNDb25kaXRpb24ud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgKnJlc3BvbnNlID0gbVJlcGxpZXMudmFsdWVBdChpbmRleCk7Ci0gICAgbVJlcGxpZXMucmVtb3ZlSXRlbXNBdChpbmRleCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgQUxvb3BlclJvc3Rlcjo6cG9zdFJlcGx5KHVpbnQzMl90IHJlcGx5SUQsIGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgQ0hFQ0sobVJlcGxpZXMuaW5kZXhPZktleShyZXBseUlEKSA8IDApOwotICAgIG1SZXBsaWVzLmFkZChyZXBseUlELCByZXBseSk7Ci0gICAgbVJlcGxpZXNDb25kaXRpb24uYnJvYWRjYXN0KCk7Ci19Ci0KIHN0YXRpYyB2b2lkIG1ha2VGb3VyQ0ModWludDMyX3QgZm91cmNjLCBjaGFyICpzKSB7CiAgICAgc1swXSA9IChmb3VyY2MgPj4gMjQpICYgMHhmZjsKICAgICBpZiAoc1swXSkgewpAQCAtMjI1LDcgKzExNSw3IEBACiB2b2lkIEFMb29wZXJSb3N0ZXI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CiAgICAgYm9vbCBjbGVhciA9IGZhbHNlOwogICAgIGJvb2wgb2xkVmVyYm9zZSA9IHZlcmJvc2VTdGF0czsKLSAgICBmb3IgKHNpemVfdCBpID0gMDtpIDwgYXJncy5zaXplKCk7IGkrKykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJncy5zaXplKCk7IGkrKykgewogICAgICAgICBpZiAoYXJnc1tpXSA9PSBTdHJpbmcxNigiLWMiKSkgewogICAgICAgICAgICAgY2xlYXIgPSB0cnVlOwogICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0gPT0gU3RyaW5nMTYoIi12b24iKSkgewpAQCAtMjQxLDIyICsxMzEsMjMgQEAKIAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgc2l6ZV90IG4gPSBtSGFuZGxlcnMuc2l6ZSgpOwotICAgIHMuYXBwZW5kRm9ybWF0KCIgJXpkIHJlZ2lzdGVyZWQgaGFuZGxlcnM6XG4iLCBuKTsKKyAgICBzLmFwcGVuZEZvcm1hdCgiICV6dSByZWdpc3RlcmVkIGhhbmRsZXJzOlxuIiwgbik7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICBzLmFwcGVuZEZvcm1hdCgiICAlemQ6ICIsIGkpOworICAgICAgICBzLmFwcGVuZEZvcm1hdCgiICAlZDogIiwgbUhhbmRsZXJzLmtleUF0KGkpKTsKICAgICAgICAgSGFuZGxlckluZm8gJmluZm8gPSBtSGFuZGxlcnMuZWRpdFZhbHVlQXQoaSk7CiAgICAgICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IGluZm8ubUxvb3Blci5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChsb29wZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgcy5hcHBlbmQobG9vcGVyLT5tTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHMuYXBwZW5kKGxvb3Blci0+Z2V0TmFtZSgpKTsKICAgICAgICAgICAgIHNwPEFIYW5kbGVyPiBoYW5kbGVyID0gaW5mby5tSGFuZGxlci5wcm9tb3RlKCk7CiAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlci0+bVZlcmJvc2VTdGF0cyA9IHZlcmJvc2VTdGF0czsKICAgICAgICAgICAgICAgICBzLmFwcGVuZEZvcm1hdCgiOiAldSBtZXNzYWdlcyBwcm9jZXNzZWQiLCBoYW5kbGVyLT5tTWVzc2FnZUNvdW50ZXIpOwogICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlU3RhdHMpIHsKICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBoYW5kbGVyLT5tTWVzc2FnZXMuc2l6ZSgpOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZm91cmNjWzE1XTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VGb3VyQ0MoaGFuZGxlci0+bU1lc3NhZ2VzLmtleUF0KGopLCBmb3VyY2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgcy5hcHBlbmRGb3JtYXQoIlxuICAgICVzOiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBzLmFwcGVuZEZvcm1hdCgiXG4gICAgJXM6ICV1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91cmNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLT5tTWVzc2FnZXMudmFsdWVBdChqKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5jcHAKaW5kZXggNDk0MmJhNy4uNzI1YTU3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5jcHAKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlICJBQnVmZmVyLmgiCiAjaW5jbHVkZSAiQURlYnVnLmgiCiAjaW5jbHVkZSAiQUxvb3BlclJvc3Rlci5oIgorI2luY2x1ZGUgIkFIYW5kbGVyLmgiCiAjaW5jbHVkZSAiQVN0cmluZy5oIgogCiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgpAQCAtMzYsMTIgKzM3LDI5IEBACiAKIGV4dGVybiBBTG9vcGVyUm9zdGVyIGdMb29wZXJSb3N0ZXI7CiAKLUFNZXNzYWdlOjpBTWVzc2FnZSh1aW50MzJfdCB3aGF0LCBBTG9vcGVyOjpoYW5kbGVyX2lkIHRhcmdldCkKLSAgICA6IG1XaGF0KHdoYXQpLAotICAgICAgbVRhcmdldCh0YXJnZXQpLAorc3RhdHVzX3QgQVJlcGx5VG9rZW46OnNldFJlcGx5KGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpIHsKKyAgICBpZiAobVJlcGxpZWQpIHsKKyAgICAgICAgQUxPR0UoInRyeWluZyB0byBwb3N0IGEgZHVwbGljYXRlIHJlcGx5Iik7CisgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgfQorICAgIENIRUNLKG1SZXBseSA9PSBOVUxMKTsKKyAgICBtUmVwbHkgPSByZXBseTsKKyAgICBtUmVwbGllZCA9IHRydWU7CisgICAgcmV0dXJuIE9LOworfQorCitBTWVzc2FnZTo6QU1lc3NhZ2Uodm9pZCkKKyAgICA6IG1XaGF0KDApLAorICAgICAgbVRhcmdldCgwKSwKICAgICAgIG1OdW1JdGVtcygwKSB7CiB9CiAKK0FNZXNzYWdlOjpBTWVzc2FnZSh1aW50MzJfdCB3aGF0LCBjb25zdCBzcDxjb25zdCBBSGFuZGxlcj4gJmhhbmRsZXIpCisgICAgOiBtV2hhdCh3aGF0KSwKKyAgICAgIG1OdW1JdGVtcygwKSB7CisgICAgc2V0VGFyZ2V0KGhhbmRsZXIpOworfQorCiBBTWVzc2FnZTo6fkFNZXNzYWdlKCkgewogICAgIGNsZWFyKCk7CiB9CkBAIC01NCwxMiArNzIsMTYgQEAKICAgICByZXR1cm4gbVdoYXQ7CiB9CiAKLXZvaWQgQU1lc3NhZ2U6OnNldFRhcmdldChBTG9vcGVyOjpoYW5kbGVyX2lkIGhhbmRsZXJJRCkgewotICAgIG1UYXJnZXQgPSBoYW5kbGVySUQ7Ci19Ci0KLUFMb29wZXI6OmhhbmRsZXJfaWQgQU1lc3NhZ2U6OnRhcmdldCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVRhcmdldDsKK3ZvaWQgQU1lc3NhZ2U6OnNldFRhcmdldChjb25zdCBzcDxjb25zdCBBSGFuZGxlcj4gJmhhbmRsZXIpIHsKKyAgICBpZiAoaGFuZGxlciA9PSBOVUxMKSB7CisgICAgICAgIG1UYXJnZXQgPSAwOworICAgICAgICBtSGFuZGxlci5jbGVhcigpOworICAgICAgICBtTG9vcGVyLmNsZWFyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVRhcmdldCA9IGhhbmRsZXItPmlkKCk7CisgICAgICAgIG1IYW5kbGVyID0gaGFuZGxlci0+Z2V0SGFuZGxlcigpOworICAgICAgICBtTG9vcGVyID0gaGFuZGxlci0+Z2V0TG9vcGVyKCk7CisgICAgfQogfQogCiB2b2lkIEFNZXNzYWdlOjpjbGVhcigpIHsKQEAgLTMyMiwzMyArMzQ0LDc2IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgQU1lc3NhZ2U6OnBvc3QoaW50NjRfdCBkZWxheVVzKSB7Ci0gICAgZ0xvb3BlclJvc3Rlci5wb3N0TWVzc2FnZSh0aGlzLCBkZWxheVVzKTsKK3ZvaWQgQU1lc3NhZ2U6OmRlbGl2ZXIoKSB7CisgICAgc3A8QUhhbmRsZXI+IGhhbmRsZXIgPSBtSGFuZGxlci5wcm9tb3RlKCk7CisgICAgaWYgKGhhbmRsZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiZmFpbGVkIHRvIGRlbGl2ZXIgbWVzc2FnZSBhcyB0YXJnZXQgaGFuZGxlciAlZCBpcyBnb25lLiIsIG1UYXJnZXQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaGFuZGxlci0+ZGVsaXZlck1lc3NhZ2UodGhpcyk7Cit9CisKK3N0YXR1c190IEFNZXNzYWdlOjpwb3N0KGludDY0X3QgZGVsYXlVcykgeworICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IG1Mb29wZXIucHJvbW90ZSgpOworICAgIGlmIChsb29wZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHBvc3QgbWVzc2FnZSBhcyB0YXJnZXQgbG9vcGVyIGZvciBoYW5kbGVyICVkIGlzIGdvbmUuIiwgbVRhcmdldCk7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKworICAgIGxvb3Blci0+cG9zdCh0aGlzLCBkZWxheVVzKTsKKyAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IEFNZXNzYWdlOjpwb3N0QW5kQXdhaXRSZXNwb25zZShzcDxBTWVzc2FnZT4gKnJlc3BvbnNlKSB7Ci0gICAgcmV0dXJuIGdMb29wZXJSb3N0ZXIucG9zdEFuZEF3YWl0UmVzcG9uc2UodGhpcywgcmVzcG9uc2UpOworICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IG1Mb29wZXIucHJvbW90ZSgpOworICAgIGlmIChsb29wZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHBvc3QgbWVzc2FnZSBhcyB0YXJnZXQgbG9vcGVyIGZvciBoYW5kbGVyICVkIGlzIGdvbmUuIiwgbVRhcmdldCk7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKworICAgIHNwPEFSZXBseVRva2VuPiB0b2tlbiA9IGxvb3Blci0+Y3JlYXRlUmVwbHlUb2tlbigpOworICAgIGlmICh0b2tlbiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gY3JlYXRlIHJlcGx5IHRva2VuIik7CisgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgIH0KKyAgICBzZXRPYmplY3QoInJlcGx5SUQiLCB0b2tlbik7CisKKyAgICBsb29wZXItPnBvc3QodGhpcywgMCAvKiBkZWxheVVzICovKTsKKyAgICByZXR1cm4gbG9vcGVyLT5hd2FpdFJlc3BvbnNlKHRva2VuLCByZXNwb25zZSk7CiB9CiAKLXZvaWQgQU1lc3NhZ2U6OnBvc3RSZXBseSh1aW50MzJfdCByZXBseUlEKSB7Ci0gICAgZ0xvb3BlclJvc3Rlci5wb3N0UmVwbHkocmVwbHlJRCwgdGhpcyk7CitzdGF0dXNfdCBBTWVzc2FnZTo6cG9zdFJlcGx5KGNvbnN0IHNwPEFSZXBseVRva2VuPiAmcmVwbHlUb2tlbikgeworICAgIGlmIChyZXBseVRva2VuID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coImZhaWxlZCB0byBwb3N0IHJlcGx5IHRvIGEgTlVMTCB0b2tlbiIpOworICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICB9CisgICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gcmVwbHlUb2tlbi0+Z2V0TG9vcGVyKCk7CisgICAgaWYgKGxvb3BlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gcG9zdCByZXBseSBhcyB0YXJnZXQgbG9vcGVyIGlzIGdvbmUuIik7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKyAgICByZXR1cm4gbG9vcGVyLT5wb3N0UmVwbHkocmVwbHlUb2tlbiwgdGhpcyk7CiB9CiAKLWJvb2wgQU1lc3NhZ2U6OnNlbmRlckF3YWl0c1Jlc3BvbnNlKHVpbnQzMl90ICpyZXBseUlEKSBjb25zdCB7Ci0gICAgaW50MzJfdCB0bXA7Ci0gICAgYm9vbCBmb3VuZCA9IGZpbmRJbnQzMigicmVwbHlJRCIsICZ0bXApOworYm9vbCBBTWVzc2FnZTo6c2VuZGVyQXdhaXRzUmVzcG9uc2Uoc3A8QVJlcGx5VG9rZW4+ICpyZXBseVRva2VuKSB7CisgICAgc3A8UmVmQmFzZT4gdG1wOworICAgIGJvb2wgZm91bmQgPSBmaW5kT2JqZWN0KCJyZXBseUlEIiwgJnRtcCk7CiAKICAgICBpZiAoIWZvdW5kKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICAqcmVwbHlJRCA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0bXApOworICAgICpyZXBseVRva2VuID0gc3RhdGljX2Nhc3Q8QVJlcGx5VG9rZW4gKj4odG1wLmdldCgpKTsKKyAgICB0bXAuY2xlYXIoKTsKKyAgICBzZXRPYmplY3QoInJlcGx5SUQiLCB0bXApOworICAgIC8vIFRPRE86IGRlbGV0ZSBPYmplY3QgaW5zdGVhZCBvZiBzZXR0aW5nIGl0IHRvIE5VTEwKIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiAqcmVwbHlUb2tlbiAhPSBOVUxMOwogfQogCiBzcDxBTWVzc2FnZT4gQU1lc3NhZ2U6OmR1cCgpIGNvbnN0IHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKG1XaGF0LCBtVGFyZ2V0KTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKG1XaGF0LCBtSGFuZGxlci5wcm9tb3RlKCkpOwogICAgIG1zZy0+bU51bUl0ZW1zID0gbU51bUl0ZW1zOwogCiAjaWZkZWYgRFVNUF9TVEFUUwpAQCAtNTMyLDcgKzU5Nyw4IEBACiAvLyBzdGF0aWMKIHNwPEFNZXNzYWdlPiBBTWVzc2FnZTo6RnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCkgewogICAgIGludDMyX3Qgd2hhdCA9IHBhcmNlbC5yZWFkSW50MzIoKTsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKHdoYXQpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICBtc2ctPnNldFdoYXQod2hhdCk7CiAKICAgICBtc2ctPm1OdW1JdGVtcyA9IHN0YXRpY19jYXN0PHNpemVfdD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKICAgICBpZiAobXNnLT5tTnVtSXRlbXMgPiBrTWF4TnVtSXRlbXMpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5tawppbmRleCAwODM1NWM3Li5jNjgyNjRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLm1rCkBAIC0yOSw3ICsyOSw4IEBACiAgICAgICAgIGxpYmxvZyAgICAgICAgICAgIFwKICAgICAgICAgbGlicG93ZXJtYW5hZ2VyCiAKLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yCitMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgLVdlcnJvciAtV2FsbAorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQogCiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQW5kcm9pZC5tawppbmRleCA3ZjMzMDdkLi41ZmI1MWMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9BbmRyb2lkLm1rCkBAIC0yMSw3ICsyMSw4IEBACiAKIExPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgogCi1MT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAKaW5kZXggYmI4OTU2Ny4uODAxZmYyNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcApAQCAtMzAsMTIgKzMwLDExIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIE1lZGlhSFRUUDo6TWVkaWFIVFRQKGNvbnN0IHNwPElNZWRpYUhUVFBDb25uZWN0aW9uPiAmY29ubikKLSAgICA6IG1Jbml0Q2hlY2soTk9fSU5JVCksCisgICAgOiBtSW5pdENoZWNrKChjb25uICE9IE5VTEwpID8gT0sgOiBOT19JTklUKSwKICAgICAgIG1IVFRQQ29ubmVjdGlvbihjb25uKSwKICAgICAgIG1DYWNoZWRTaXplVmFsaWQoZmFsc2UpLAogICAgICAgbUNhY2hlZFNpemUoMGxsKSwKICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50KE5VTEwpIHsKLSAgICBtSW5pdENoZWNrID0gT0s7CiB9CiAKIE1lZGlhSFRUUDo6fk1lZGlhSFRUUCgpIHsKQEAgLTU0LDcgKzUzLDEwIEBACiAgICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgewogICAgICAgICBleHRIZWFkZXJzID0gKmhlYWRlcnM7CiAgICAgfQotICAgIGV4dEhlYWRlcnMuYWRkKFN0cmluZzgoIlVzZXItQWdlbnQiKSwgU3RyaW5nOChNYWtlVXNlckFnZW50KCkuY19zdHIoKSkpOworCisgICAgaWYgKGV4dEhlYWRlcnMuaW5kZXhPZktleShTdHJpbmc4KCJVc2VyLUFnZW50IikpIDwgMCkgeworICAgICAgICBleHRIZWFkZXJzLmFkZChTdHJpbmc4KCJVc2VyLUFnZW50IiksIFN0cmluZzgoTWFrZVVzZXJBZ2VudCgpLmNfc3RyKCkpKTsKKyAgICB9CiAKICAgICBib29sIHN1Y2Nlc3MgPSBtSFRUUENvbm5lY3Rpb24tPmNvbm5lY3QodXJpLCAmZXh0SGVhZGVycyk7CiAKQEAgLTE3MSw2ICsxNzMsMTAgQEAKIH0KIAogU3RyaW5nOCBNZWRpYUhUVFA6OmdldFVyaSgpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gU3RyaW5nODo6ZW1wdHkoKTsKKyAgICB9CisKICAgICBTdHJpbmc4IHVyaTsKICAgICBpZiAoT0sgPT0gbUhUVFBDb25uZWN0aW9uLT5nZXRVcmkoJnVyaSkpIHsKICAgICAgICAgcmV0dXJuIHVyaTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLm1rCmluZGV4IDkzYjc5MzUuLmZjODU4MzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5tawpAQCAtMyw2ICszLDcgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgIFwKKyAgICAgICAgSFRUUERvd25sb2FkZXIuY3BwICAgICAgXAogICAgICAgICBMaXZlRGF0YVNvdXJjZS5jcHAgICAgICBcCiAgICAgICAgIExpdmVTZXNzaW9uLmNwcCAgICAgICAgIFwKICAgICAgICAgTTNVUGFyc2VyLmNwcCAgICAgICAgICAgXApAQCAtMTIsNyArMTMsOCBAQAogCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKLUxPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvciAtV2FsbAorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGliYmluZGVyIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjQ0YmFlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuY3BwCkBAIC0wLDAgKzEsMjczIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkhUVFBEb3dubG9hZGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiSFRUUERvd25sb2FkZXIuaCIKKyNpbmNsdWRlICJNM1VQYXJzZXIuaCIKKworI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworSFRUUERvd25sb2FkZXI6OkhUVFBEb3dubG9hZGVyKAorICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAmaGVhZGVycykgOgorICAgIG1IVFRQRGF0YVNvdXJjZShuZXcgTWVkaWFIVFRQKGh0dHBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKSkpLAorICAgIG1FeHRyYUhlYWRlcnMoaGVhZGVycyksCisgICAgbURpc2Nvbm5lY3RpbmcoZmFsc2UpIHsKK30KKwordm9pZCBIVFRQRG93bmxvYWRlcjo6cmVjb25uZWN0KCkgeworICAgIEF1dG9NdXRleCBfbChtTG9jayk7CisgICAgbURpc2Nvbm5lY3RpbmcgPSBmYWxzZTsKK30KKwordm9pZCBIVFRQRG93bmxvYWRlcjo6ZGlzY29ubmVjdCgpIHsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBfbChtTG9jayk7CisgICAgICAgIG1EaXNjb25uZWN0aW5nID0gdHJ1ZTsKKyAgICB9CisgICAgbUhUVFBEYXRhU291cmNlLT5kaXNjb25uZWN0KCk7Cit9CisKK2Jvb2wgSFRUUERvd25sb2FkZXI6OmlzRGlzY29ubmVjdGluZygpIHsKKyAgICBBdXRvTXV0ZXggX2wobUxvY2spOworICAgIHJldHVybiBtRGlzY29ubmVjdGluZzsKK30KKworLyoKKyAqIElsbHVzdHJhdGlvbiBvZiBwYXJhbWV0ZXJzOgorICoKKyAqIDAgICAgICBgcmFuZ2Vfb2Zmc2V0YAorICogKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tKy0tKworICogfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG5leHQgYmxvY2sgdG8gZmV0Y2ggfCAgfCAgfAorICogfCAgICAgICAgICAgIHwgYHNvdXJjZWAgaGFuZGxlID0+IGBvdXRgIGJ1ZmZlciB8ICAgICAgICAgICAgICAgICAgICAgfCAgfCAgfAorICogfCBgdXJsYCBmaWxlIHw8LS0tLS0tLS0tIGJ1ZmZlciBzaXplIC0tLS0tLS0tLT58PC0tLSBgYmxvY2tfc2l6ZWAgLS0+fCAgfCAgfAorICogfCAgICAgICAgICAgIHw8LS0tLS0tLS0tLS0gYHJhbmdlX2xlbmd0aGAgLyBidWZmZXIgY2FwYWNpdHkgLS0tLS0tLS0tLS0+fCAgfAorICogfDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZmlsZV9zaXplIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+fAorICoKKyAqIFNwZWNpYWwgcGFyYW1ldGVyIHZhbHVlczoKKyAqIC0gcmFuZ2VfbGVuZ3RoID09IC0xIG1lYW5zIGVudGlyZSBmaWxlCisgKiAtIGJsb2NrX3NpemUgPT0gMCBtZWFucyBlbnRpcmUgcmFuZ2UKKyAqCisgKi8KK3NzaXplX3QgSFRUUERvd25sb2FkZXI6OmZldGNoQmxvY2soCisgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgc3A8QUJ1ZmZlcj4gKm91dCwKKyAgICAgICAgaW50NjRfdCByYW5nZV9vZmZzZXQsIGludDY0X3QgcmFuZ2VfbGVuZ3RoLAorICAgICAgICB1aW50MzJfdCBibG9ja19zaXplLCAvKiBkb3dubG9hZCBibG9jayBzaXplICovCisgICAgICAgIFN0cmluZzggKmFjdHVhbFVybCwKKyAgICAgICAgYm9vbCByZWNvbm5lY3QgLyogZm9yY2UgY29ubmVjdCBIVFRQIHdoZW4gcmVzdWluZyBzb3VyY2UgKi8pIHsKKyAgICBpZiAoaXNEaXNjb25uZWN0aW5nKCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX05PVF9DT05ORUNURUQ7CisgICAgfQorCisgICAgb2ZmNjRfdCBzaXplOworCisgICAgaWYgKHJlY29ubmVjdCkgeworICAgICAgICBpZiAoIXN0cm5jYXNlY21wKHVybCwgImZpbGU6Ly8iLCA3KSkgeworICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBuZXcgRmlsZVNvdXJjZSh1cmwgKyA3KTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJuY2FzZWNtcCh1cmwsICJodHRwOi8vIiwgNykKKyAgICAgICAgICAgICAgICAmJiBzdHJuY2FzZWNtcCh1cmwsICJodHRwczovLyIsIDgpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBoZWFkZXJzID0gbUV4dHJhSGVhZGVyczsKKyAgICAgICAgICAgIGlmIChyYW5nZV9vZmZzZXQgPiAwIHx8IHJhbmdlX2xlbmd0aCA+PSAwKSB7CisgICAgICAgICAgICAgICAgaGVhZGVycy5hZGQoCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCJSYW5nZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXM9JWxsZC0lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VfbGVuZ3RoIDwgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiIiA6IEFTdHJpbmdQcmludGYoIiVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV9vZmZzZXQgKyByYW5nZV9sZW5ndGggLSAxKS5jX3N0cigpKS5jX3N0cigpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1IVFRQRGF0YVNvdXJjZS0+Y29ubmVjdCh1cmwsICZoZWFkZXJzKTsKKworICAgICAgICAgICAgaWYgKGlzRGlzY29ubmVjdGluZygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX05PVF9DT05ORUNURUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtRGF0YVNvdXJjZSA9IG1IVFRQRGF0YVNvdXJjZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXR1c190IGdldFNpemVFcnIgPSBtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSk7CisKKyAgICBpZiAoaXNEaXNjb25uZWN0aW5nKCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX05PVF9DT05ORUNURUQ7CisgICAgfQorCisgICAgaWYgKGdldFNpemVFcnIgIT0gT0spIHsKKyAgICAgICAgc2l6ZSA9IDY1NTM2OworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICpvdXQgIT0gTlVMTCA/ICpvdXQgOiBuZXcgQUJ1ZmZlcihzaXplKTsKKyAgICBpZiAoKm91dCA9PSBOVUxMKSB7CisgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CisgICAgfQorCisgICAgc3NpemVfdCBieXRlc1JlYWQgPSAwOworICAgIC8vIGFkanVzdCByYW5nZV9sZW5ndGggaWYgb25seSByZWFkaW5nIHBhcnRpYWwgYmxvY2sKKyAgICBpZiAoYmxvY2tfc2l6ZSA+IDAgJiYgKHJhbmdlX2xlbmd0aCA9PSAtMSB8fCAoaW50NjRfdCkoYnVmZmVyLT5zaXplKCkgKyBibG9ja19zaXplKSA8IHJhbmdlX2xlbmd0aCkpIHsKKyAgICAgICAgcmFuZ2VfbGVuZ3RoID0gYnVmZmVyLT5zaXplKCkgKyBibG9ja19zaXplOworICAgIH0KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8vIE9ubHkgcmVzaXplIHdoZW4gd2UgZG9uJ3Qga25vdyB0aGUgc2l6ZS4KKyAgICAgICAgc2l6ZV90IGJ1ZmZlclJlbWFpbmluZyA9IGJ1ZmZlci0+Y2FwYWNpdHkoKSAtIGJ1ZmZlci0+c2l6ZSgpOworICAgICAgICBpZiAoYnVmZmVyUmVtYWluaW5nID09IDAgJiYgZ2V0U2l6ZUVyciAhPSBPSykgeworICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckluY3JlbWVudCA9IGJ1ZmZlci0+c2l6ZSgpIC8gMjsKKyAgICAgICAgICAgIGlmIChidWZmZXJJbmNyZW1lbnQgPCAzMjc2OCkgeworICAgICAgICAgICAgICAgIGJ1ZmZlckluY3JlbWVudCA9IDMyNzY4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVyUmVtYWluaW5nID0gYnVmZmVySW5jcmVtZW50OworCisgICAgICAgICAgICBBTE9HVigiaW5jcmVhc2luZyBkb3dubG9hZCBidWZmZXIgdG8gJXp1IGJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgYnVmZmVyLT5zaXplKCkgKyBidWZmZXJSZW1haW5pbmcpOworCisgICAgICAgICAgICBzcDxBQnVmZmVyPiBjb3B5ID0gbmV3IEFCdWZmZXIoYnVmZmVyLT5zaXplKCkgKyBidWZmZXJSZW1haW5pbmcpOworICAgICAgICAgICAgbWVtY3B5KGNvcHktPmRhdGEoKSwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgIGNvcHktPnNldFJhbmdlKDAsIGJ1ZmZlci0+c2l6ZSgpKTsKKworICAgICAgICAgICAgYnVmZmVyID0gY29weTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBtYXhCeXRlc1RvUmVhZCA9IGJ1ZmZlclJlbWFpbmluZzsKKyAgICAgICAgaWYgKHJhbmdlX2xlbmd0aCA+PSAwKSB7CisgICAgICAgICAgICBpbnQ2NF90IGJ5dGVzTGVmdEluUmFuZ2UgPSByYW5nZV9sZW5ndGggLSBidWZmZXItPnNpemUoKTsKKyAgICAgICAgICAgIGlmIChieXRlc0xlZnRJblJhbmdlIDwgKGludDY0X3QpbWF4Qnl0ZXNUb1JlYWQpIHsKKyAgICAgICAgICAgICAgICBtYXhCeXRlc1RvUmVhZCA9IGJ5dGVzTGVmdEluUmFuZ2U7CisKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZXNMZWZ0SW5SYW5nZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZSBEYXRhU291cmNlIGlzIHJlc3BvbnNpYmxlIGZvciBpbmZvcm1pbmcgdXMgb2YgZXJyb3IgKG4gPCAwKSBvciBlb2YgKG4gPT0gMCkKKyAgICAgICAgLy8gdG8gaGVscCB1cyBicmVhayBvdXQgb2YgdGhlIGxvb3AuCisgICAgICAgIHNzaXplX3QgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgYnVmZmVyLT5zaXplKCksIGJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5zaXplKCksCisgICAgICAgICAgICAgICAgbWF4Qnl0ZXNUb1JlYWQpOworCisgICAgICAgIGlmIChpc0Rpc2Nvbm5lY3RpbmcoKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX05PVF9DT05ORUNURUQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG4gPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIGJ1ZmZlci0+c2l6ZSgpICsgKHNpemVfdCluKTsKKyAgICAgICAgYnl0ZXNSZWFkICs9IG47CisgICAgfQorCisgICAgKm91dCA9IGJ1ZmZlcjsKKyAgICBpZiAoYWN0dWFsVXJsICE9IE5VTEwpIHsKKyAgICAgICAgKmFjdHVhbFVybCA9IG1EYXRhU291cmNlLT5nZXRVcmkoKTsKKyAgICAgICAgaWYgKGFjdHVhbFVybC0+aXNFbXB0eSgpKSB7CisgICAgICAgICAgICAqYWN0dWFsVXJsID0gdXJsOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGJ5dGVzUmVhZDsKK30KKworc3NpemVfdCBIVFRQRG93bmxvYWRlcjo6ZmV0Y2hGaWxlKAorICAgICAgICBjb25zdCBjaGFyICp1cmwsIHNwPEFCdWZmZXI+ICpvdXQsIFN0cmluZzggKmFjdHVhbFVybCkgeworICAgIHNzaXplX3QgZXJyID0gZmV0Y2hCbG9jayh1cmwsIG91dCwgMCwgLTEsIDAsIGFjdHVhbFVybCwgdHJ1ZSAvKiByZWNvbm5lY3QgKi8pOworCisgICAgLy8gY2xvc2Ugb2ZmIHRoZSBjb25uZWN0aW9uIGFmdGVyIHVzZQorICAgIG1IVFRQRGF0YVNvdXJjZS0+ZGlzY29ubmVjdCgpOworCisgICAgcmV0dXJuIGVycjsKK30KKworc3A8TTNVUGFyc2VyPiBIVFRQRG93bmxvYWRlcjo6ZmV0Y2hQbGF5bGlzdCgKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLCB1aW50OF90ICpjdXJQbGF5bGlzdEhhc2gsIGJvb2wgKnVuY2hhbmdlZCkgeworICAgIEFMT0dWKCJmZXRjaFBsYXlsaXN0ICclcyciLCB1cmwpOworCisgICAgKnVuY2hhbmdlZCA9IGZhbHNlOworCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgIFN0cmluZzggYWN0dWFsVXJsOworICAgIHNzaXplX3QgZXJyID0gZmV0Y2hGaWxlKHVybCwgJmJ1ZmZlciwgJmFjdHVhbFVybCk7CisKKyAgICAvLyBjbG9zZSBvZmYgdGhlIGNvbm5lY3Rpb24gYWZ0ZXIgdXNlCisgICAgbUhUVFBEYXRhU291cmNlLT5kaXNjb25uZWN0KCk7CisKKyAgICBpZiAoZXJyIDw9IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLy8gTUQ1IGZ1bmN0aW9uYWxpdHkgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgc2ltdWxhdG9yLCB0cmVhdCBhbGwKKyAgICAvLyBwbGF5bGlzdHMgYXMgY2hhbmdlZC4KKworI2lmIGRlZmluZWQoSEFWRV9BTkRST0lEX09TKQorICAgIHVpbnQ4X3QgaGFzaFsxNl07CisKKyAgICBNRDVfQ1RYIG07CisgICAgTUQ1X0luaXQoJm0pOworICAgIE1ENV9VcGRhdGUoJm0sIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisKKyAgICBNRDVfRmluYWwoaGFzaCwgJm0pOworCisgICAgaWYgKGN1clBsYXlsaXN0SGFzaCAhPSBOVUxMICYmICFtZW1jbXAoaGFzaCwgY3VyUGxheWxpc3RIYXNoLCAxNikpIHsKKyAgICAgICAgLy8gcGxheWxpc3QgdW5jaGFuZ2VkCisgICAgICAgICp1bmNoYW5nZWQgPSB0cnVlOworCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChjdXJQbGF5bGlzdEhhc2ggIT0gTlVMTCkgeworICAgICAgICBtZW1jcHkoY3VyUGxheWxpc3RIYXNoLCBoYXNoLCBzaXplb2YoaGFzaCkpOworICAgIH0KKyNlbmRpZgorCisgICAgc3A8TTNVUGFyc2VyPiBwbGF5bGlzdCA9CisgICAgICAgIG5ldyBNM1VQYXJzZXIoYWN0dWFsVXJsLnN0cmluZygpLCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworCisgICAgaWYgKHBsYXlsaXN0LT5pbml0Q2hlY2soKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHBhcnNlIC5tM3U4IHBsYXlsaXN0Iik7CisKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHBsYXlsaXN0OworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRiNGE0OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBIVFRQX0RPV05MT0FERVJfSF8KKworI2RlZmluZSBIVFRQX0RPV05MT0FERVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUJ1ZmZlcjsKK2NsYXNzIERhdGFTb3VyY2U7CitzdHJ1Y3QgSFRUUEJhc2U7CitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CitzdHJ1Y3QgTTNVUGFyc2VyOworCitzdHJ1Y3QgSFRUUERvd25sb2FkZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgSFRUUERvd25sb2FkZXIoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gJmhlYWRlcnMpOworCisgICAgdm9pZCByZWNvbm5lY3QoKTsKKyAgICB2b2lkIGRpc2Nvbm5lY3QoKTsKKyAgICBib29sIGlzRGlzY29ubmVjdGluZygpOworICAgIC8vIElmIGdpdmVuIGEgbm9uLXplcm8gYmxvY2tfc2l6ZSAoZGVmYXVsdCAwKSwgaXQgaXMgdXNlZCB0byBjYXAgdGhlIG51bWJlciBvZgorICAgIC8vIGJ5dGVzIHJlYWQgaW4gZnJvbSB0aGUgRGF0YVNvdXJjZS4gSWYgZ2l2ZW4gYSBub24tTlVMTCBidWZmZXIsIG5ldyBjb250ZW50CisgICAgLy8gaXMgcmVhZCBpbnRvIHRoZSBlbmQuCisgICAgLy8KKyAgICAvLyBUaGUgRGF0YVNvdXJjZSB3ZSByZWFkIGZyb20gaXMgcmVzcG9uc2libGUgZm9yIHNpZ25hbGluZyBlcnJvciBvciBFT0YgdG8gaGVscCB1cworICAgIC8vIGJyZWFrIG91dCBvZiB0aGUgcmVhZCBsb29wLiBUaGUgRGF0YVNvdXJjZSBjYW4gYmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciwgc28KKyAgICAvLyB0aGF0IHRoZSBjYWxsZXIgY2FuIHJldXNlIGl0IGZvciBzdWJzZXF1ZW50IGZldGNoZXMgKHdpdGhpbiB0aGUgaW5pdGlhbGx5CisgICAgLy8gcmVxdWVzdGVkIHJhbmdlKS4KKyAgICAvLworICAgIC8vIEZvciByZXVzZWQgSFRUUCBzb3VyY2VzLCB0aGUgY2FsbGVyIG11c3QgZG93bmxvYWQgYSBmaWxlIHNlcXVlbnRpYWxseSB3aXRob3V0CisgICAgLy8gYW55IG92ZXJsYXBzIG9yIGdhcHMgdG8gcHJldmVudCByZWNvbm5lY3Rpb24uCisgICAgc3NpemVfdCBmZXRjaEJsb2NrKAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gKm91dCwKKyAgICAgICAgICAgIGludDY0X3QgcmFuZ2Vfb2Zmc2V0LCAvKiBvcGVuIGZpbGUgYXQgcmFuZ2Vfb2Zmc2V0ICovCisgICAgICAgICAgICBpbnQ2NF90IHJhbmdlX2xlbmd0aCwgLyogb3BlbiBmaWxlIGZvciByYW5nZV9sZW5ndGggKC0xOiBlbnRpcmUgZmlsZSkgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGJsb2NrX3NpemUsICAvKiBkb3dubG9hZCBibG9jayBzaXplICgwOiBlbnRpcmUgcmFuZ2UpICovCisgICAgICAgICAgICBTdHJpbmc4ICphY3R1YWxVcmwsICAgLyogcmV0dXJucyBhY3R1YWwgVVJMICovCisgICAgICAgICAgICBib29sIHJlY29ubmVjdCAgICAgICAgLyogZm9yY2UgY29ubmVjdCBodHRwICovCisgICAgICAgICAgICApOworCisgICAgLy8gc2ltcGxpZmllZCB2ZXJzaW9uIHRvIGZldGNoIGEgc2luZ2xlIGZpbGUKKyAgICBzc2l6ZV90IGZldGNoRmlsZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+ICpvdXQsCisgICAgICAgICAgICBTdHJpbmc4ICphY3R1YWxVcmwgPSBOVUxMKTsKKworICAgIC8vIGZldGNoIGEgcGxheWxpc3QgZmlsZQorICAgIHNwPE0zVVBhcnNlcj4gZmV0Y2hQbGF5bGlzdCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgdWludDhfdCAqY3VyUGxheWxpc3RIYXNoLCBib29sICp1bmNoYW5nZWQpOworCitwcml2YXRlOgorICAgIHNwPEhUVFBCYXNlPiBtSFRUUERhdGFTb3VyY2U7CisgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUV4dHJhSGVhZGVyczsKKworICAgIE11dGV4IG1Mb2NrOworICAgIGJvb2wgbURpc2Nvbm5lY3Rpbmc7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhIVFRQRG93bmxvYWRlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEhUVFBfRE9XTkxPQURFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwCmluZGV4IGQwZjNiYzIuLjE1NTc0MDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAKQEAgLTE5LDI0ICsxOSwxOSBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiTGl2ZVNlc3Npb24uaCIKLQorI2luY2x1ZGUgIkhUVFBEb3dubG9hZGVyLmgiCiAjaW5jbHVkZSAiTTNVUGFyc2VyLmgiCiAjaW5jbHVkZSAiUGxheWxpc3RGZXRjaGVyLmgiCiAKLSNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCiAjaW5jbHVkZSAibXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgiCiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAKQEAgLTQ0LDEzICszOSwyMzkgQEAKIAogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgotI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotLy8gTnVtYmVyIG9mIHJlY2VudGx5LXJlYWQgYnl0ZXMgdG8gdXNlIGZvciBiYW5kd2lkdGggZXN0aW1hdGlvbgotY29uc3Qgc2l6ZV90IExpdmVTZXNzaW9uOjprQmFuZHdpZHRoSGlzdG9yeUJ5dGVzID0gMjAwICogMTAyNDsKKy8vIHN0YXRpYworLy8gQmFuZHdpZHRoIFN3aXRjaCBNYXJrIERlZmF1bHRzCitjb25zdCBpbnQ2NF90IExpdmVTZXNzaW9uOjprVXBTd2l0Y2hNYXJrVXMgPSAxNTAwMDAwMGxsOworY29uc3QgaW50NjRfdCBMaXZlU2Vzc2lvbjo6a0Rvd25Td2l0Y2hNYXJrVXMgPSAyMDAwMDAwMGxsOworY29uc3QgaW50NjRfdCBMaXZlU2Vzc2lvbjo6a1VwU3dpdGNoTWFyZ2luVXMgPSA1MDAwMDAwbGw7Citjb25zdCBpbnQ2NF90IExpdmVTZXNzaW9uOjprUmVzdW1lVGhyZXNob2xkVXMgPSAxMDAwMDBsbDsKKworLy8gQnVmZmVyIFByZXBhcmUvUmVhZHkvVW5kZXJmbG93IE1hcmtzCitjb25zdCBpbnQ2NF90IExpdmVTZXNzaW9uOjprUmVhZHlNYXJrVXMgPSA1MDAwMDAwbGw7Citjb25zdCBpbnQ2NF90IExpdmVTZXNzaW9uOjprUHJlcGFyZU1hcmtVcyA9IDE1MDAwMDBsbDsKK2NvbnN0IGludDY0X3QgTGl2ZVNlc3Npb246OmtVbmRlcmZsb3dNYXJrVXMgPSAxMDAwMDAwbGw7CisKK3N0cnVjdCBMaXZlU2Vzc2lvbjo6QmFuZHdpZHRoRXN0aW1hdG9yIDogcHVibGljIFJlZkJhc2UgeworICAgIEJhbmR3aWR0aEVzdGltYXRvcigpOworCisgICAgdm9pZCBhZGRCYW5kd2lkdGhNZWFzdXJlbWVudChzaXplX3QgbnVtQnl0ZXMsIGludDY0X3QgZGVsYXlVcyk7CisgICAgYm9vbCBlc3RpbWF0ZUJhbmR3aWR0aCgKKyAgICAgICAgICAgIGludDMyX3QgKmJhbmR3aWR0aCwKKyAgICAgICAgICAgIGJvb2wgKmlzU3RhYmxlID0gTlVMTCwKKyAgICAgICAgICAgIGludDMyX3QgKnNob3J0VGVybUJwcyA9IE5VTEwpOworCitwcml2YXRlOgorICAgIC8vIEJhbmR3aWR0aCBlc3RpbWF0aW9uIHBhcmFtZXRlcnMKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrU2hvcnRUZXJtQmFuZHdpZHRoSXRlbXMgPSAzOworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtNaW5CYW5kd2lkdGhIaXN0b3J5SXRlbXMgPSAyMDsKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWluQmFuZHdpZHRoSGlzdG9yeVdpbmRvd1VzID0gNTAwMDAwMGxsOyAvLyA1IHNlYworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhCYW5kd2lkdGhIaXN0b3J5V2luZG93VXMgPSAzMDAwMDAwMGxsOyAvLyAzMCBzZWMKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWF4QmFuZHdpZHRoSGlzdG9yeUFnZVVzID0gNjAwMDAwMDBsbDsgLy8gNjAgc2VjCisKKyAgICBzdHJ1Y3QgQmFuZHdpZHRoRW50cnkgeworICAgICAgICBpbnQ2NF90IG1UaW1lc3RhbXBVczsKKyAgICAgICAgaW50NjRfdCBtRGVsYXlVczsKKyAgICAgICAgc2l6ZV90IG1OdW1CeXRlczsKKyAgICB9OworCisgICAgTXV0ZXggbUxvY2s7CisgICAgTGlzdDxCYW5kd2lkdGhFbnRyeT4gbUJhbmR3aWR0aEhpc3Rvcnk7CisgICAgTGlzdDxpbnQzMl90PiBtUHJldkVzdGltYXRlczsKKyAgICBpbnQzMl90IG1TaG9ydFRlcm1Fc3RpbWF0ZTsKKyAgICBib29sIG1IYXNOZXdTYW1wbGU7CisgICAgYm9vbCBtSXNTdGFibGU7CisgICAgaW50NjRfdCBtVG90YWxUcmFuc2ZlclRpbWVVczsKKyAgICBzaXplX3QgbVRvdGFsVHJhbnNmZXJCeXRlczsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEJhbmR3aWR0aEVzdGltYXRvcik7Cit9OworCitMaXZlU2Vzc2lvbjo6QmFuZHdpZHRoRXN0aW1hdG9yOjpCYW5kd2lkdGhFc3RpbWF0b3IoKSA6CisgICAgbVNob3J0VGVybUVzdGltYXRlKDApLAorICAgIG1IYXNOZXdTYW1wbGUoZmFsc2UpLAorICAgIG1Jc1N0YWJsZSh0cnVlKSwKKyAgICBtVG90YWxUcmFuc2ZlclRpbWVVcygwKSwKKyAgICBtVG90YWxUcmFuc2ZlckJ5dGVzKDApIHsKK30KKwordm9pZCBMaXZlU2Vzc2lvbjo6QmFuZHdpZHRoRXN0aW1hdG9yOjphZGRCYW5kd2lkdGhNZWFzdXJlbWVudCgKKyAgICAgICAgc2l6ZV90IG51bUJ5dGVzLCBpbnQ2NF90IGRlbGF5VXMpIHsKKyAgICBBdXRvTXV0ZXggYXV0b0xvY2sobUxvY2spOworCisgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgQmFuZHdpZHRoRW50cnkgZW50cnk7CisgICAgZW50cnkubVRpbWVzdGFtcFVzID0gbm93VXM7CisgICAgZW50cnkubURlbGF5VXMgPSBkZWxheVVzOworICAgIGVudHJ5Lm1OdW1CeXRlcyA9IG51bUJ5dGVzOworICAgIG1Ub3RhbFRyYW5zZmVyVGltZVVzICs9IGRlbGF5VXM7CisgICAgbVRvdGFsVHJhbnNmZXJCeXRlcyArPSBudW1CeXRlczsKKyAgICBtQmFuZHdpZHRoSGlzdG9yeS5wdXNoX2JhY2soZW50cnkpOworICAgIG1IYXNOZXdTYW1wbGUgPSB0cnVlOworCisgICAgLy8gUmVtb3ZlIG5vIG1vcmUgdGhhbiAxMCUgb2YgdG90YWwgdHJhbnNmZXIgdGltZSBhdCBhIHRpbWUKKyAgICAvLyB0byBhdm9pZCBzdWRkZW4ganVtcCBvbiBiYW5kd2lkdGggZXN0aW1hdGlvbi4gVGhlcmUgbWlnaHQKKyAgICAvLyBiZSBsb25nIGJsb2NraW5nIHJlYWRzIHRoYXQgdGFrZXMgdXAgc2lnbmlmaWNhdGlvbiB0aW1lLAorICAgIC8vIHdlIGhhdmUgdG8ga2VlcCBhIGxvbmdlciB3aW5kb3cgaW4gdGhhdCBjYXNlLgorICAgIGludDY0X3QgYmFuZHdpZHRoSGlzdG9yeVdpbmRvd1VzID0gbVRvdGFsVHJhbnNmZXJUaW1lVXMgKiA5IC8gMTA7CisgICAgaWYgKGJhbmR3aWR0aEhpc3RvcnlXaW5kb3dVcyA8IGtNaW5CYW5kd2lkdGhIaXN0b3J5V2luZG93VXMpIHsKKyAgICAgICAgYmFuZHdpZHRoSGlzdG9yeVdpbmRvd1VzID0ga01pbkJhbmR3aWR0aEhpc3RvcnlXaW5kb3dVczsKKyAgICB9IGVsc2UgaWYgKGJhbmR3aWR0aEhpc3RvcnlXaW5kb3dVcyA+IGtNYXhCYW5kd2lkdGhIaXN0b3J5V2luZG93VXMpIHsKKyAgICAgICAgYmFuZHdpZHRoSGlzdG9yeVdpbmRvd1VzID0ga01heEJhbmR3aWR0aEhpc3RvcnlXaW5kb3dVczsKKyAgICB9CisgICAgLy8gdHJpbSBvbGQgc2FtcGxlcywga2VlcGluZyBhdCBsZWFzdCBrTWF4QmFuZHdpZHRoSGlzdG9yeUl0ZW1zIHNhbXBsZXMsCisgICAgLy8gYW5kIHRvdGFsIHRyYW5zZmVyIHRpbWUgYXQgbGVhc3Qga01heEJhbmR3aWR0aEhpc3RvcnlXaW5kb3dVcy4KKyAgICB3aGlsZSAobUJhbmR3aWR0aEhpc3Rvcnkuc2l6ZSgpID4ga01pbkJhbmR3aWR0aEhpc3RvcnlJdGVtcykgeworICAgICAgICBMaXN0PEJhbmR3aWR0aEVudHJ5Pjo6aXRlcmF0b3IgaXQgPSBtQmFuZHdpZHRoSGlzdG9yeS5iZWdpbigpOworICAgICAgICAvLyByZW1vdmUgc2FtcGxlIGlmIGVpdGhlciBhYnNvbHV0ZSBhZ2Ugb3IgdG90YWwgdHJhbnNmZXIgdGltZSBpcworICAgICAgICAvLyBvdmVyIGtNYXhCYW5kd2lkdGhIaXN0b3J5V2luZG93VXMKKyAgICAgICAgaWYgKG5vd1VzIC0gaXQtPm1UaW1lc3RhbXBVcyA8IGtNYXhCYW5kd2lkdGhIaXN0b3J5QWdlVXMgJiYKKyAgICAgICAgICAgICAgICBtVG90YWxUcmFuc2ZlclRpbWVVcyAtIGl0LT5tRGVsYXlVcyA8IGJhbmR3aWR0aEhpc3RvcnlXaW5kb3dVcykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbVRvdGFsVHJhbnNmZXJUaW1lVXMgLT0gaXQtPm1EZWxheVVzOworICAgICAgICBtVG90YWxUcmFuc2ZlckJ5dGVzIC09IGl0LT5tTnVtQnl0ZXM7CisgICAgICAgIG1CYW5kd2lkdGhIaXN0b3J5LmVyYXNlKG1CYW5kd2lkdGhIaXN0b3J5LmJlZ2luKCkpOworICAgIH0KK30KKworYm9vbCBMaXZlU2Vzc2lvbjo6QmFuZHdpZHRoRXN0aW1hdG9yOjplc3RpbWF0ZUJhbmR3aWR0aCgKKyAgICAgICAgaW50MzJfdCAqYmFuZHdpZHRoQnBzLCBib29sICppc1N0YWJsZSwgaW50MzJfdCAqc2hvcnRUZXJtQnBzKSB7CisgICAgQXV0b011dGV4IGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtQmFuZHdpZHRoSGlzdG9yeS5zaXplKCkgPCAyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIW1IYXNOZXdTYW1wbGUpIHsKKyAgICAgICAgKmJhbmR3aWR0aEJwcyA9ICooLS1tUHJldkVzdGltYXRlcy5lbmQoKSk7CisgICAgICAgIGlmIChpc1N0YWJsZSkgeworICAgICAgICAgICAgKmlzU3RhYmxlID0gbUlzU3RhYmxlOworICAgICAgICB9CisgICAgICAgIGlmIChzaG9ydFRlcm1CcHMpIHsKKyAgICAgICAgICAgICpzaG9ydFRlcm1CcHMgPSBtU2hvcnRUZXJtRXN0aW1hdGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgKmJhbmR3aWR0aEJwcyA9ICgoZG91YmxlKW1Ub3RhbFRyYW5zZmVyQnl0ZXMgKiA4RTYgLyBtVG90YWxUcmFuc2ZlclRpbWVVcyk7CisgICAgbVByZXZFc3RpbWF0ZXMucHVzaF9iYWNrKCpiYW5kd2lkdGhCcHMpOworICAgIHdoaWxlIChtUHJldkVzdGltYXRlcy5zaXplKCkgPiAzKSB7CisgICAgICAgIG1QcmV2RXN0aW1hdGVzLmVyYXNlKG1QcmV2RXN0aW1hdGVzLmJlZ2luKCkpOworICAgIH0KKyAgICBtSGFzTmV3U2FtcGxlID0gZmFsc2U7CisKKyAgICBpbnQ2NF90IHRvdGFsVGltZVVzID0gMDsKKyAgICBzaXplX3QgdG90YWxCeXRlcyA9IDA7CisgICAgaWYgKG1CYW5kd2lkdGhIaXN0b3J5LnNpemUoKSA+PSBrU2hvcnRUZXJtQmFuZHdpZHRoSXRlbXMpIHsKKyAgICAgICAgTGlzdDxCYW5kd2lkdGhFbnRyeT46Oml0ZXJhdG9yIGl0ID0gLS1tQmFuZHdpZHRoSGlzdG9yeS5lbmQoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrU2hvcnRUZXJtQmFuZHdpZHRoSXRlbXM7IGkrKywgaXQtLSkgeworICAgICAgICAgICAgdG90YWxUaW1lVXMgKz0gaXQtPm1EZWxheVVzOworICAgICAgICAgICAgdG90YWxCeXRlcyArPSBpdC0+bU51bUJ5dGVzOworICAgICAgICB9CisgICAgfQorICAgIG1TaG9ydFRlcm1Fc3RpbWF0ZSA9IHRvdGFsVGltZVVzID4gMCA/CisgICAgICAgICAgICAodG90YWxCeXRlcyAqIDhFNiAvIHRvdGFsVGltZVVzKSA6ICpiYW5kd2lkdGhCcHM7CisgICAgaWYgKHNob3J0VGVybUJwcykgeworICAgICAgICAqc2hvcnRUZXJtQnBzID0gbVNob3J0VGVybUVzdGltYXRlOworICAgIH0KKworICAgIGludDMyX3QgbWluRXN0aW1hdGUgPSAtMSwgbWF4RXN0aW1hdGUgPSAtMTsKKyAgICBMaXN0PGludDMyX3Q+OjppdGVyYXRvciBpdDsKKyAgICBmb3IgKGl0ID0gbVByZXZFc3RpbWF0ZXMuYmVnaW4oKTsgaXQgIT0gbVByZXZFc3RpbWF0ZXMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgaW50MzJfdCBlc3RpbWF0ZSA9ICppdDsKKyAgICAgICAgaWYgKG1pbkVzdGltYXRlIDwgMCB8fCBtaW5Fc3RpbWF0ZSA+IGVzdGltYXRlKSB7CisgICAgICAgICAgICBtaW5Fc3RpbWF0ZSA9IGVzdGltYXRlOworICAgICAgICB9CisgICAgICAgIGlmIChtYXhFc3RpbWF0ZSA8IDAgfHwgbWF4RXN0aW1hdGUgPCBlc3RpbWF0ZSkgeworICAgICAgICAgICAgbWF4RXN0aW1hdGUgPSBlc3RpbWF0ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBjb25zaWRlciBpdCBzdGFibGUgaWYgbG9uZy10ZXJtIGF2ZXJhZ2UgaXMgbm90IGp1bXBpbmcgYSBsb3QKKyAgICAvLyBhbmQgc2hvcnQtdGVybSBhdmVyYWdlIGlzIG5vdCBtdWNoIGxvd2VyIHRoYW4gbG9uZy10ZXJtIGF2ZXJhZ2UKKyAgICBtSXNTdGFibGUgPSAobWF4RXN0aW1hdGUgPD0gbWluRXN0aW1hdGUgKiA0IC8gMykKKyAgICAgICAgICAgICYmIG1TaG9ydFRlcm1Fc3RpbWF0ZSA+IG1pbkVzdGltYXRlICogNyAvIDEwOworICAgIGlmIChpc1N0YWJsZSkgeworICAgICAgICAqaXNTdGFibGUgPSBtSXNTdGFibGU7CisgICAgfQorCisjaWYgMAorICAgIHsKKyAgICAgICAgY2hhciBkdW1wU3RyWzEwMjRdID0gezB9OworICAgICAgICBzaXplX3QgaXRlbUlkeCA9IDA7CisgICAgICAgIHNpemVfdCBoaXN0U2l6ZSA9IG1CYW5kd2lkdGhIaXN0b3J5LnNpemUoKTsKKyAgICAgICAgc3ByaW50ZihkdW1wU3RyLCAiZXN0aW1hdGUgYnBzPSVkIHN0YWJsZT0lZCBoaXN0b3J5IChuPSVkKTogeyIsCisgICAgICAgICAgICAqYmFuZHdpZHRoQnBzLCBtSXNTdGFibGUsIGhpc3RTaXplKTsKKyAgICAgICAgTGlzdDxCYW5kd2lkdGhFbnRyeT46Oml0ZXJhdG9yIGl0ID0gbUJhbmR3aWR0aEhpc3RvcnkuYmVnaW4oKTsKKyAgICAgICAgZm9yICg7IGl0ICE9IG1CYW5kd2lkdGhIaXN0b3J5LmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBpZiAoaXRlbUlkeCA+IDUwKSB7CisgICAgICAgICAgICAgICAgc3ByaW50ZihkdW1wU3RyICsgc3RybGVuKGR1bXBTdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIi4uLiglemQgbW9yZSBpdGVtcykuLi4gfSIsIGhpc3RTaXplIC0gaXRlbUlkeCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcHJpbnRmKGR1bXBTdHIgKyBzdHJsZW4oZHVtcFN0ciksICIlZGsvJS4zZnMlcyIsCisgICAgICAgICAgICAgICAgaXQtPm1OdW1CeXRlcyAvIDEwMjQsCisgICAgICAgICAgICAgICAgKGRvdWJsZSlpdC0+bURlbGF5VXMgKiAxLjBlLTYsCisgICAgICAgICAgICAgICAgKGl0ID09ICgtLW1CYW5kd2lkdGhIaXN0b3J5LmVuZCgpKSkgPyAifSIgOiAiLCAiKTsKKyAgICAgICAgICAgIGl0ZW1JZHgrKzsKKyAgICAgICAgfQorICAgICAgICBBTE9HRShkdW1wU3RyKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy9zdGF0aWMKK2NvbnN0IGNoYXIgKkxpdmVTZXNzaW9uOjpnZXRLZXlGb3JTdHJlYW0oU3RyZWFtVHlwZSB0eXBlKSB7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9WSURFTzoKKyAgICAgICAgICAgIHJldHVybiAidGltZVVzVmlkZW8iOworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfQVVESU86CisgICAgICAgICAgICByZXR1cm4gInRpbWVVc0F1ZGlvIjsKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX1NVQlRJVExFUzoKKyAgICAgICAgICAgIHJldHVybiAidGltZVVzU3VidGl0bGUiOworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfTUVUQURBVEE6CisgICAgICAgICAgICByZXR1cm4gInRpbWVVc01ldGFkYXRhIjsgLy8gdW51c2VkCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLy9zdGF0aWMKK2NvbnN0IGNoYXIgKkxpdmVTZXNzaW9uOjpnZXROYW1lRm9yU3RyZWFtKFN0cmVhbVR5cGUgdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfVklERU86CisgICAgICAgICAgICByZXR1cm4gInZpZGVvIjsKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0FVRElPOgorICAgICAgICAgICAgcmV0dXJuICJhdWRpbyI7CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9TVUJUSVRMRVM6CisgICAgICAgICAgICByZXR1cm4gInN1YnMiOworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfTUVUQURBVEE6CisgICAgICAgICAgICByZXR1cm4gIm1ldGFkYXRhIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gInVua25vd24iOworfQorCisvL3N0YXRpYworQVRTUGFyc2VyOjpTb3VyY2VUeXBlIExpdmVTZXNzaW9uOjpnZXRTb3VyY2VUeXBlRm9yU3RyZWFtKFN0cmVhbVR5cGUgdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfVklERU86CisgICAgICAgICAgICByZXR1cm4gQVRTUGFyc2VyOjpWSURFTzsKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0FVRElPOgorICAgICAgICAgICAgcmV0dXJuIEFUU1BhcnNlcjo6QVVESU87CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9NRVRBREFUQToKKyAgICAgICAgICAgIHJldHVybiBBVFNQYXJzZXI6Ok1FVEE7CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9TVUJUSVRMRVM6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgIH0KKyAgICByZXR1cm4gQVRTUGFyc2VyOjpOVU1fU09VUkNFX1RZUEVTOyAvLyBzaG91bGQgbm90IHJlYWNoIGhlcmUKK30KIAogTGl2ZVNlc3Npb246OkxpdmVTZXNzaW9uKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgdWludDMyX3QgZmxhZ3MsCkBAIC01OCwxNjkgKzI3OSw5NSBAQAogICAgIDogbU5vdGlmeShub3RpZnkpLAogICAgICAgbUZsYWdzKGZsYWdzKSwKICAgICAgIG1IVFRQU2VydmljZShodHRwU2VydmljZSksCisgICAgICBtQnVmZmVyaW5nKGZhbHNlKSwKICAgICAgIG1JblByZXBhcmF0aW9uUGhhc2UodHJ1ZSksCi0gICAgICBtSFRUUERhdGFTb3VyY2UobmV3IE1lZGlhSFRUUChtSFRUUFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpKSksCisgICAgICBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb24oMCksCisgICAgICBtUHJldkJ1ZmZlclBlcmNlbnRhZ2UoLTEpLAogICAgICAgbUN1ckJhbmR3aWR0aEluZGV4KC0xKSwKKyAgICAgIG1PcmlnQmFuZHdpZHRoSW5kZXgoLTEpLAorICAgICAgbUxhc3RCYW5kd2lkdGhCcHMoLTFsbCksCisgICAgICBtTGFzdEJhbmR3aWR0aFN0YWJsZShmYWxzZSksCisgICAgICBtQmFuZHdpZHRoRXN0aW1hdG9yKG5ldyBCYW5kd2lkdGhFc3RpbWF0b3IoKSksCisgICAgICBtTWF4V2lkdGgoNzIwKSwKKyAgICAgIG1NYXhIZWlnaHQoNDgwKSwKICAgICAgIG1TdHJlYW1NYXNrKDApLAogICAgICAgbU5ld1N0cmVhbU1hc2soMCksCiAgICAgICBtU3dhcE1hc2soMCksCi0gICAgICBtQ2hlY2tCYW5kd2lkdGhHZW5lcmF0aW9uKDApLAogICAgICAgbVN3aXRjaEdlbmVyYXRpb24oMCksCiAgICAgICBtU3VidGl0bGVHZW5lcmF0aW9uKDApLAogICAgICAgbUxhc3REZXF1ZXVlZFRpbWVVcygwbGwpLAogICAgICAgbVJlYWxUaW1lQmFzZVVzKDBsbCksCiAgICAgICBtUmVjb25maWd1cmF0aW9uSW5Qcm9ncmVzcyhmYWxzZSksCiAgICAgICBtU3dpdGNoSW5Qcm9ncmVzcyhmYWxzZSksCi0gICAgICBtRGlzY29ubmVjdFJlcGx5SUQoMCksCi0gICAgICBtU2Vla1JlcGx5SUQoMCksCisgICAgICBtVXBTd2l0Y2hNYXJrKGtVcFN3aXRjaE1hcmtVcyksCisgICAgICBtRG93blN3aXRjaE1hcmsoa0Rvd25Td2l0Y2hNYXJrVXMpLAorICAgICAgbVVwU3dpdGNoTWFyZ2luKGtVcFN3aXRjaE1hcmdpblVzKSwKICAgICAgIG1GaXJzdFRpbWVVc1ZhbGlkKGZhbHNlKSwKICAgICAgIG1GaXJzdFRpbWVVcygwKSwKLSAgICAgIG1MYXN0U2Vla1RpbWVVcygwKSB7Ci0KKyAgICAgIG1MYXN0U2Vla1RpbWVVcygwKSwKKyAgICAgIG1IYXNNZXRhZGF0YShmYWxzZSkgewogICAgIG1TdHJlYW1zW2tBdWRpb0luZGV4XSA9IFN0cmVhbUl0ZW0oImF1ZGlvIik7CiAgICAgbVN0cmVhbXNba1ZpZGVvSW5kZXhdID0gU3RyZWFtSXRlbSgidmlkZW8iKTsKICAgICBtU3RyZWFtc1trU3VidGl0bGVJbmRleF0gPSBTdHJlYW1JdGVtKCJzdWJ0aXRsZXMiKTsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgewotICAgICAgICBtRGlzY29udGludWl0aWVzLmFkZChpbmRleFRvVHlwZShpKSwgbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UoTlVMTCAvKiBtZXRhICovKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtU291cmNlczsgKytpKSB7CiAgICAgICAgIG1QYWNrZXRTb3VyY2VzLmFkZChpbmRleFRvVHlwZShpKSwgbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UoTlVMTCAvKiBtZXRhICovKSk7CiAgICAgICAgIG1QYWNrZXRTb3VyY2VzMi5hZGQoaW5kZXhUb1R5cGUoaSksIG5ldyBBbm90aGVyUGFja2V0U291cmNlKE5VTEwgLyogbWV0YSAqLykpOwotICAgICAgICBtQnVmZmVyaW5nW2ldID0gZmFsc2U7CiAgICAgfQotCi0gICAgc2l6ZV90IG51bUhpc3RvcnlJdGVtcyA9IGtCYW5kd2lkdGhIaXN0b3J5Qnl0ZXMgLwotICAgICAgICAgICAgUGxheWxpc3RGZXRjaGVyOjprRG93bmxvYWRCbG9ja1NpemUgKyAxOwotICAgIGlmIChudW1IaXN0b3J5SXRlbXMgPCA1KSB7Ci0gICAgICAgIG51bUhpc3RvcnlJdGVtcyA9IDU7Ci0gICAgfQotICAgIG1IVFRQRGF0YVNvdXJjZS0+c2V0QmFuZHdpZHRoSGlzdG9yeVNpemUobnVtSGlzdG9yeUl0ZW1zKTsKIH0KIAogTGl2ZVNlc3Npb246On5MaXZlU2Vzc2lvbigpIHsKKyAgICBpZiAobUZldGNoZXJMb29wZXIgIT0gTlVMTCkgeworICAgICAgICBtRmV0Y2hlckxvb3Blci0+c3RvcCgpOworICAgIH0KIH0KIAotc3A8QUJ1ZmZlcj4gTGl2ZVNlc3Npb246OmNyZWF0ZUZvcm1hdENoYW5nZUJ1ZmZlcihib29sIHN3YXApIHsKLSAgICBBQnVmZmVyICpkaXNjb250aW51aXR5ID0gbmV3IEFCdWZmZXIoMCk7Ci0gICAgZGlzY29udGludWl0eS0+bWV0YSgpLT5zZXRJbnQzMigiZGlzY29udGludWl0eSIsIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9GT1JNQVRDSEFOR0UpOwotICAgIGRpc2NvbnRpbnVpdHktPm1ldGEoKS0+c2V0SW50MzIoInN3YXBQYWNrZXRTb3VyY2UiLCBzd2FwKTsKLSAgICBkaXNjb250aW51aXR5LT5tZXRhKCktPnNldEludDMyKCJzd2l0Y2hHZW5lcmF0aW9uIiwgbVN3aXRjaEdlbmVyYXRpb24pOwotICAgIGRpc2NvbnRpbnVpdHktPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIC0xKTsKLSAgICByZXR1cm4gZGlzY29udGludWl0eTsKLX0KLQotdm9pZCBMaXZlU2Vzc2lvbjo6c3dhcFBhY2tldFNvdXJjZShTdHJlYW1UeXBlIHN0cmVhbSkgewotICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZhcHMgPSBtUGFja2V0U291cmNlcy5lZGl0VmFsdWVGb3Ioc3RyZWFtKTsKLSAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmYXBzMiA9IG1QYWNrZXRTb3VyY2VzMi5lZGl0VmFsdWVGb3Ioc3RyZWFtKTsKLSAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiB0bXAgPSBhcHM7Ci0gICAgYXBzID0gYXBzMjsKLSAgICBhcHMyID0gdG1wOwotICAgIGFwczItPmNsZWFyKCk7CitpbnQ2NF90IExpdmVTZXNzaW9uOjpjYWxjdWxhdGVNZWRpYVRpbWVVcygKKyAgICAgICAgaW50NjRfdCBmaXJzdFRpbWVVcywgaW50NjRfdCB0aW1lVXMsIGludDMyX3QgZGlzY29udGludWl0eVNlcSkgeworICAgIGlmICh0aW1lVXMgPj0gZmlyc3RUaW1lVXMpIHsKKyAgICAgICAgdGltZVVzIC09IGZpcnN0VGltZVVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHRpbWVVcyA9IDA7CisgICAgfQorICAgIHRpbWVVcyArPSBtTGFzdFNlZWtUaW1lVXM7CisgICAgaWYgKG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVcy5pbmRleE9mS2V5KGRpc2NvbnRpbnVpdHlTZXEpID49IDApIHsKKyAgICAgICAgdGltZVVzICs9IG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVcy52YWx1ZUZvcihkaXNjb250aW51aXR5U2VxKTsKKyAgICB9CisgICAgcmV0dXJuIHRpbWVVczsKIH0KIAogc3RhdHVzX3QgTGl2ZVNlc3Npb246OmRlcXVldWVBY2Nlc3NVbml0KAogICAgICAgICBTdHJlYW1UeXBlIHN0cmVhbSwgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpIHsKLSAgICBpZiAoIShtU3RyZWFtTWFzayAmIHN0cmVhbSkpIHsKLSAgICAgICAgLy8gcmV0dXJuIC1FV09VTERCTE9DSyB0byBhdm9pZCBoYWx0aW5nIHRoZSBkZWNvZGVyCi0gICAgICAgIC8vIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gYXVkaW8vdmlkZW8gYW5kIGF1ZGlvIG9ubHkuCi0gICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7Ci0gICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gZGlzY29udGludWl0eVF1ZXVlICA9IG1EaXNjb250aW51aXRpZXMudmFsdWVGb3Ioc3RyZWFtKTsKLSAgICBpZiAoZGlzY29udGludWl0eVF1ZXVlLT5oYXNCdWZmZXJBdmFpbGFibGUoJmZpbmFsUmVzdWx0KSkgewotICAgICAgICBkaXNjb250aW51aXR5UXVldWUtPmRlcXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOwotICAgICAgICAvLyBzZWVraW5nLCB0cmFjayBzd2l0Y2hpbmcKLSAgICAgICAgc3A8QU1lc3NhZ2U+IGV4dHJhOwotICAgICAgICBpbnQ2NF90IHRpbWVVczsKLSAgICAgICAgaWYgKCgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZE1lc3NhZ2UoImV4dHJhIiwgJmV4dHJhKQotICAgICAgICAgICAgICAgICYmIGV4dHJhICE9IE5VTEwKLSAgICAgICAgICAgICAgICAmJiBleHRyYS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSkgewotICAgICAgICAgICAgLy8gc2Vla2luZyBvbmx5Ci0gICAgICAgICAgICBtTGFzdFNlZWtUaW1lVXMgPSB0aW1lVXM7Ci0gICAgICAgICAgICBtRGlzY29udGludWl0eU9mZnNldFRpbWVzVXMuY2xlYXIoKTsKLSAgICAgICAgICAgIG1EaXNjb250aW51aXR5QWJzU3RhcnRUaW1lc1VzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIElORk9fRElTQ09OVElOVUlUWTsKLSAgICB9Ci0KKyAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdCA9IE9LOwogICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHBhY2tldFNvdXJjZSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKHN0cmVhbSk7CiAKLSAgICBzc2l6ZV90IGlkeCA9IHR5cGVUb0luZGV4KHN0cmVhbSk7Ci0gICAgaWYgKCFwYWNrZXRTb3VyY2UtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7CisgICAgc3NpemVfdCBzdHJlYW1JZHggPSB0eXBlVG9JbmRleChzdHJlYW0pOworICAgIGlmIChzdHJlYW1JZHggPCAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGNvbnN0IGNoYXIgKnN0cmVhbVN0ciA9IGdldE5hbWVGb3JTdHJlYW0oc3RyZWFtKTsKKyAgICAvLyBEbyBub3QgbGV0IGNsaWVudCBwdWxsIGRhdGEgaWYgd2UgZG9uJ3QgaGF2ZSBkYXRhIHBhY2tldHMgeWV0LgorICAgIC8vIFdlIG1pZ2h0IG9ubHkgaGF2ZSBhIGZvcm1hdCBkaXNjb250aW51aXR5IHF1ZXVlZCB3aXRob3V0IGRhdGEuCisgICAgLy8gV2hlbiBOdVBsYXllckRlY29kZXIgZGVxdWV1ZXMgdGhlIGZvcm1hdCBkaXNjb250aW51aXR5LCBpdCB3aWxsCisgICAgLy8gaW1tZWRpYXRlbHkgdHJ5IHRvIGdldEZvcm1hdC4gSWYgd2UgcmV0dXJuIE5VTEwsIE51UGxheWVyRGVjb2RlcgorICAgIC8vIHRoaW5rcyBpdCBjYW4gZG8gc2VhbWxlc3MgY2hhbmdlLCBzbyB3aWxsIG5vdCBzaHV0ZG93biBkZWNvZGVyLgorICAgIC8vIFdoZW4gdGhlIGFjdHVhbCBmb3JtYXQgYXJyaXZlcywgaXQgY2FuJ3QgaGFuZGxlIGl0IGFuZCBnZXQgc3R1Y2suCisgICAgaWYgKCFwYWNrZXRTb3VyY2UtPmhhc0RhdGFCdWZmZXJBdmFpbGFibGUoJmZpbmFsUmVzdWx0KSkgeworICAgICAgICBBTE9HVigiWyVzXSBkZXF1ZXVlQWNjZXNzVW5pdDogbm8gYnVmZmVyIGF2YWlsYWJsZSAoZmluYWxSZXN1bHQ9JWQpIiwKKyAgICAgICAgICAgICAgICBzdHJlYW1TdHIsIGZpbmFsUmVzdWx0KTsKKwogICAgICAgICBpZiAoZmluYWxSZXN1bHQgPT0gT0spIHsKLSAgICAgICAgICAgIG1CdWZmZXJpbmdbaWR4XSA9IHRydWU7CiAgICAgICAgICAgICByZXR1cm4gLUVBR0FJTjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiBmaW5hbFJlc3VsdDsKICAgICAgICAgfQogICAgIH0KIAotICAgIGludDMyX3QgdGFyZ2V0RHVyYXRpb24gPSAwOwotICAgIHNwPEFNZXNzYWdlPiBtZXRhID0gcGFja2V0U291cmNlLT5nZXRMYXRlc3RFbnF1ZXVlZE1ldGEoKTsKLSAgICBpZiAobWV0YSAhPSBOVUxMKSB7Ci0gICAgICAgIG1ldGEtPmZpbmRJbnQzMigidGFyZ2V0RHVyYXRpb24iLCAmdGFyZ2V0RHVyYXRpb24pOwotICAgIH0KLQotICAgIGludDY0X3QgdGFyZ2V0RHVyYXRpb25VcyA9IHRhcmdldER1cmF0aW9uICogMTAwMDAwMGxsOwotICAgIGlmICh0YXJnZXREdXJhdGlvblVzID09IDAgfHwKLSAgICAgICAgICAgIHRhcmdldER1cmF0aW9uVXMgPiBQbGF5bGlzdEZldGNoZXI6OmtNaW5CdWZmZXJlZER1cmF0aW9uVXMpIHsKLSAgICAgICAgLy8gRmV0Y2hlcnMgbGltaXQgYnVmZmVyaW5nIHRvCi0gICAgICAgIC8vIG1pbigzICogdGFyZ2V0RHVyYXRpb24sIGtNaW5CdWZmZXJlZER1cmF0aW9uVXMpCi0gICAgICAgIHRhcmdldER1cmF0aW9uVXMgPSBQbGF5bGlzdEZldGNoZXI6OmtNaW5CdWZmZXJlZER1cmF0aW9uVXM7Ci0gICAgfQotCi0gICAgaWYgKG1CdWZmZXJpbmdbaWR4XSkgewotICAgICAgICBpZiAobVN3aXRjaEluUHJvZ3Jlc3MKLSAgICAgICAgICAgICAgICB8fCBwYWNrZXRTb3VyY2UtPmlzRmluaXNoZWQoMCkKLSAgICAgICAgICAgICAgICB8fCBwYWNrZXRTb3VyY2UtPmdldEVzdGltYXRlZER1cmF0aW9uVXMoKSA+IHRhcmdldER1cmF0aW9uVXMpIHsKLSAgICAgICAgICAgIG1CdWZmZXJpbmdbaWR4XSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1CdWZmZXJpbmdbaWR4XSkgewotICAgICAgICByZXR1cm4gLUVBR0FJTjsKLSAgICB9Ci0KLSAgICAvLyB3YWl0IGZvciBjb3VudGVycGFydAotICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IG90aGVyU291cmNlOwotICAgIHVpbnQzMl90IG1hc2sgPSBtTmV3U3RyZWFtTWFzayAmIG1TdHJlYW1NYXNrOwotICAgIHVpbnQzMl90IGZldGNoZXJzTWFzayAgPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZldGNoZXJJbmZvcy5zaXplKCk7ICsraSkgewotICAgICAgICB1aW50MzJfdCBmZXRjaGVyTWFzayA9IG1GZXRjaGVySW5mb3MudmFsdWVBdChpKS5tRmV0Y2hlci0+Z2V0U3RyZWFtVHlwZU1hc2soKTsKLSAgICAgICAgZmV0Y2hlcnNNYXNrIHw9IGZldGNoZXJNYXNrOwotICAgIH0KLSAgICBtYXNrICY9IGZldGNoZXJzTWFzazsKLSAgICBpZiAoc3RyZWFtID09IFNUUkVBTVRZUEVfQVVESU8gJiYgKG1hc2sgJiBTVFJFQU1UWVBFX1ZJREVPKSkgewotICAgICAgICBvdGhlclNvdXJjZSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKFNUUkVBTVRZUEVfVklERU8pOwotICAgIH0gZWxzZSBpZiAoc3RyZWFtID09IFNUUkVBTVRZUEVfVklERU8gJiYgKG1hc2sgJiBTVFJFQU1UWVBFX0FVRElPKSkgewotICAgICAgICBvdGhlclNvdXJjZSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKFNUUkVBTVRZUEVfQVVESU8pOwotICAgIH0KLSAgICBpZiAob3RoZXJTb3VyY2UgIT0gTlVMTCAmJiAhb3RoZXJTb3VyY2UtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7Ci0gICAgICAgIHJldHVybiBmaW5hbFJlc3VsdCA9PSBPSyA/IC1FQUdBSU4gOiBmaW5hbFJlc3VsdDsKLSAgICB9CisgICAgLy8gTGV0IHRoZSBjbGllbnQgZGVxdWV1ZSBhcyBsb25nIGFzIHdlIGhhdmUgYnVmZmVycyBhdmFpbGFibGUKKyAgICAvLyBEbyBub3QgbWFrZSBwYXVzZS9yZXN1bWUgZGVjaXNpb25zIGhlcmUuCiAKICAgICBzdGF0dXNfdCBlcnIgPSBwYWNrZXRTb3VyY2UtPmRlcXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOwogCi0gICAgc2l6ZV90IHN0cmVhbUlkeDsKLSAgICBjb25zdCBjaGFyICpzdHJlYW1TdHI7Ci0gICAgc3dpdGNoIChzdHJlYW0pIHsKLSAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0FVRElPOgotICAgICAgICAgICAgc3RyZWFtSWR4ID0ga0F1ZGlvSW5kZXg7Ci0gICAgICAgICAgICBzdHJlYW1TdHIgPSAiYXVkaW8iOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RSRUFNVFlQRV9WSURFTzoKLSAgICAgICAgICAgIHN0cmVhbUlkeCA9IGtWaWRlb0luZGV4OwotICAgICAgICAgICAgc3RyZWFtU3RyID0gInZpZGVvIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUUkVBTVRZUEVfU1VCVElUTEVTOgotICAgICAgICAgICAgc3RyZWFtSWR4ID0ga1N1YnRpdGxlSW5kZXg7Ci0gICAgICAgICAgICBzdHJlYW1TdHIgPSAic3VicyI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgfQotCi0gICAgU3RyZWFtSXRlbSYgc3RybSA9IG1TdHJlYW1zW3N0cmVhbUlkeF07CiAgICAgaWYgKGVyciA9PSBJTkZPX0RJU0NPTlRJTlVJVFkpIHsKICAgICAgICAgLy8gYWRhcHRpdmUgc3RyZWFtaW5nLCBkaXNjb250aW51aXRpZXMgaW4gdGhlIHBsYXlsaXN0CiAgICAgICAgIGludDMyX3QgdHlwZTsKQEAgLTIzNSw1MCArMzgyLDM2IEBACiAgICAgICAgICAgICAgIHN0cmVhbVN0ciwKICAgICAgICAgICAgICAgdHlwZSwKICAgICAgICAgICAgICAgZXh0cmEgPT0gTlVMTCA/ICJOVUxMIiA6IGV4dHJhLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOwotCi0gICAgICAgIGludDMyX3Qgc3dhcDsKLSAgICAgICAgaWYgKCgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZEludDMyKCJzd2FwUGFja2V0U291cmNlIiwgJnN3YXApICYmIHN3YXApIHsKLSAgICAgICAgICAgIGludDMyX3Qgc3dpdGNoR2VuZXJhdGlvbjsKLSAgICAgICAgICAgIENIRUNLKCgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZEludDMyKCJzd2l0Y2hHZW5lcmF0aW9uIiwgJnN3aXRjaEdlbmVyYXRpb24pKTsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU3dhcE11dGV4KTsKLSAgICAgICAgICAgICAgICBpZiAoc3dpdGNoR2VuZXJhdGlvbiA9PSBtU3dpdGNoR2VuZXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBzd2FwUGFja2V0U291cmNlKHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTd2FwcGVkLCBpZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigic3RyZWFtIiwgc3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigic3dpdGNoR2VuZXJhdGlvbiIsIHN3aXRjaEdlbmVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBtc2ctPnBvc3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzaXplX3Qgc2VxID0gc3RybS5tQ3VyRGlzY29udGludWl0eVNlcTsKLSAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0VGltZVVzOwotICAgICAgICAgICAgaWYgKG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVcy5pbmRleE9mS2V5KHNlcSkgPj0gMCkgewotICAgICAgICAgICAgICAgIG9mZnNldFRpbWVVcyA9IG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVcy52YWx1ZUZvcihzZXEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvZmZzZXRUaW1lVXMgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXEgKz0gMTsKLSAgICAgICAgICAgIGlmIChtRGlzY29udGludWl0eUFic1N0YXJ0VGltZXNVcy5pbmRleE9mS2V5KHN0cm0ubUN1ckRpc2NvbnRpbnVpdHlTZXEpID49IDApIHsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IGZpcnN0VGltZVVzOwotICAgICAgICAgICAgICAgIGZpcnN0VGltZVVzID0gbURpc2NvbnRpbnVpdHlBYnNTdGFydFRpbWVzVXMudmFsdWVGb3Ioc3RybS5tQ3VyRGlzY29udGludWl0eVNlcSk7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0VGltZVVzICs9IHN0cm0ubUxhc3REZXF1ZXVlZFRpbWVVcyAtIGZpcnN0VGltZVVzOwotICAgICAgICAgICAgICAgIG9mZnNldFRpbWVVcyArPSBzdHJtLm1MYXN0U2FtcGxlRHVyYXRpb25VczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0VGltZVVzICs9IHN0cm0ubUxhc3RTYW1wbGVEdXJhdGlvblVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtRGlzY29udGludWl0eU9mZnNldFRpbWVzVXMuYWRkKHNlcSwgb2Zmc2V0VGltZVVzKTsKLSAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoZXJyID09IE9LKSB7CiAKICAgICAgICAgaWYgKHN0cmVhbSA9PSBTVFJFQU1UWVBFX0FVRElPIHx8IHN0cmVhbSA9PSBTVFJFQU1UWVBFX1ZJREVPKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzLCBvcmlnaW5hbFRpbWVVczsKICAgICAgICAgICAgIGludDMyX3QgZGlzY29udGludWl0eVNlcSA9IDA7CisgICAgICAgICAgICBTdHJlYW1JdGVtJiBzdHJtID0gbVN0cmVhbXNbc3RyZWFtSWR4XTsKICAgICAgICAgICAgIENIRUNLKCgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAgJnRpbWVVcykpOworICAgICAgICAgICAgb3JpZ2luYWxUaW1lVXMgPSB0aW1lVXM7CiAgICAgICAgICAgICAoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPmZpbmRJbnQzMigiZGlzY29udGludWl0eVNlcSIsICZkaXNjb250aW51aXR5U2VxKTsKLSAgICAgICAgICAgIHN0cm0ubUN1ckRpc2NvbnRpbnVpdHlTZXEgPSBkaXNjb250aW51aXR5U2VxOworICAgICAgICAgICAgaWYgKGRpc2NvbnRpbnVpdHlTZXEgPiAoaW50MzJfdCkgc3RybS5tQ3VyRGlzY29udGludWl0eVNlcSkgeworICAgICAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0VGltZVVzOworICAgICAgICAgICAgICAgIGlmIChtRGlzY29udGludWl0eU9mZnNldFRpbWVzVXMuaW5kZXhPZktleShzdHJtLm1DdXJEaXNjb250aW51aXR5U2VxKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldFRpbWVVcyA9IG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVcy52YWx1ZUZvcihzdHJtLm1DdXJEaXNjb250aW51aXR5U2VxKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvZmZzZXRUaW1lVXMgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtRGlzY29udGludWl0eUFic1N0YXJ0VGltZXNVcy5pbmRleE9mS2V5KHN0cm0ubUN1ckRpc2NvbnRpbnVpdHlTZXEpID49IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHN0cm0ubUxhc3REZXF1ZXVlZFRpbWVVcyA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZmlyc3RUaW1lVXM7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0VGltZVVzID0gbURpc2NvbnRpbnVpdHlBYnNTdGFydFRpbWVzVXMudmFsdWVGb3Ioc3RybS5tQ3VyRGlzY29udGludWl0eVNlcSk7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldFRpbWVVcyArPSBzdHJtLm1MYXN0RGVxdWV1ZWRUaW1lVXMgLSBmaXJzdFRpbWVVczsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0VGltZVVzICs9IHN0cm0ubUxhc3RTYW1wbGVEdXJhdGlvblVzOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldFRpbWVVcyArPSBzdHJtLm1MYXN0U2FtcGxlRHVyYXRpb25VczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtRGlzY29udGludWl0eU9mZnNldFRpbWVzVXMuYWRkKGRpc2NvbnRpbnVpdHlTZXEsIG9mZnNldFRpbWVVcyk7CisgICAgICAgICAgICAgICAgc3RybS5tQ3VyRGlzY29udGludWl0eVNlcSA9IGRpc2NvbnRpbnVpdHlTZXE7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludDMyX3QgZGlzY2FyZCA9IDA7CiAgICAgICAgICAgICBpbnQ2NF90IGZpcnN0VGltZVVzOwpAQCAtMjk5LDE3ICs0MzIsMTAgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3RybS5tTGFzdERlcXVldWVkVGltZVVzID0gdGltZVVzOwotICAgICAgICAgICAgaWYgKHRpbWVVcyA+PSBmaXJzdFRpbWVVcykgewotICAgICAgICAgICAgICAgIHRpbWVVcyAtPSBmaXJzdFRpbWVVczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGltZVVzID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRpbWVVcyArPSBtTGFzdFNlZWtUaW1lVXM7Ci0gICAgICAgICAgICBpZiAobURpc2NvbnRpbnVpdHlPZmZzZXRUaW1lc1VzLmluZGV4T2ZLZXkoZGlzY29udGludWl0eVNlcSkgPj0gMCkgewotICAgICAgICAgICAgICAgIHRpbWVVcyArPSBtRGlzY29udGludWl0eU9mZnNldFRpbWVzVXMudmFsdWVGb3IoZGlzY29udGludWl0eVNlcSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB0aW1lVXMgPSBjYWxjdWxhdGVNZWRpYVRpbWVVcyhmaXJzdFRpbWVVcywgdGltZVVzLCBkaXNjb250aW51aXR5U2VxKTsKIAotICAgICAgICAgICAgQUxPR1YoIlslc10gcmVhZCBidWZmZXIgYXQgdGltZSAlIiBQUklkNjQgIiB1cyIsIHN0cmVhbVN0ciwgdGltZVVzKTsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIGRlcXVldWVBY2Nlc3NVbml0OiB0aW1lICVsbGQgdXMsIG9yaWdpbmFsICVsbGQgdXMiLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW1TdHIsIChsb25nIGxvbmcpdGltZVVzLCAobG9uZyBsb25nKW9yaWdpbmFsVGltZVVzKTsKICAgICAgICAgICAgICgqYWNjZXNzVW5pdCktPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsICB0aW1lVXMpOwogICAgICAgICAgICAgbUxhc3REZXF1ZXVlZFRpbWVVcyA9IHRpbWVVczsKICAgICAgICAgICAgIG1SZWFsVGltZUJhc2VVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSB0aW1lVXM7CkBAIC0zMjIsNiArNDQ4LDE3IEBACiAgICAgICAgICAgICAoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPnNldEludDMyKAogICAgICAgICAgICAgICAgICAgICAidHJhY2tJbmRleCIsIG1QbGF5bGlzdC0+Z2V0U2VsZWN0ZWRJbmRleCgpKTsKICAgICAgICAgICAgICgqYWNjZXNzVW5pdCktPm1ldGEoKS0+c2V0SW50NjQoImJhc2VVcyIsIG1SZWFsVGltZUJhc2VVcyk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtID09IFNUUkVBTVRZUEVfTUVUQURBVEEpIHsKKyAgICAgICAgICAgIEhMU1RpbWUgbWRUaW1lKCgqYWNjZXNzVW5pdCktPm1ldGEoKSk7CisgICAgICAgICAgICBpZiAobURpc2NvbnRpbnVpdHlBYnNTdGFydFRpbWVzVXMuaW5kZXhPZktleShtZFRpbWUubVNlcSkgPCAwKSB7CisgICAgICAgICAgICAgICAgcGFja2V0U291cmNlLT5yZXF1ZXVlQWNjZXNzVW5pdCgoKmFjY2Vzc1VuaXQpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBmaXJzdFRpbWVVcyA9IG1EaXNjb250aW51aXR5QWJzU3RhcnRUaW1lc1VzLnZhbHVlRm9yKG1kVGltZS5tU2VxKTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IGNhbGN1bGF0ZU1lZGlhVGltZVVzKGZpcnN0VGltZVVzLCBtZFRpbWUubVRpbWVVcywgbWRUaW1lLm1TZXEpOworICAgICAgICAgICAgICAgICgqYWNjZXNzVW5pdCktPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsICB0aW1lVXMpOworICAgICAgICAgICAgICAgICgqYWNjZXNzVW5pdCktPm1ldGEoKS0+c2V0SW50NjQoImJhc2VVcyIsIG1SZWFsVGltZUJhc2VVcyk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBBTE9HSSgiWyVzXSBlbmNvdW50ZXJlZCBlcnJvciAlZCIsIHN0cmVhbVN0ciwgZXJyKTsKQEAgLTMzMSw3ICs0NjgsNiBAQAogfQogCiBzdGF0dXNfdCBMaXZlU2Vzc2lvbjo6Z2V0U3RyZWFtRm9ybWF0KFN0cmVhbVR5cGUgc3RyZWFtLCBzcDxBTWVzc2FnZT4gKmZvcm1hdCkgewotICAgIC8vIE5vIHN3YXBQYWNrZXRTb3VyY2UgcmFjZSBjb25kaXRpb247IGNhbGxlZCBmcm9tIHRoZSBzYW1lIHRocmVhZCBhcyBkZXF1ZXVlQWNjZXNzVW5pdC4KICAgICBpZiAoIShtU3RyZWFtTWFzayAmIHN0cmVhbSkpIHsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQpAQCAtMzQ0LDEyICs0ODAsMjQgQEAKICAgICAgICAgcmV0dXJuIC1FQUdBSU47CiAgICAgfQogCisgICAgaWYgKHN0cmVhbSA9PSBTVFJFQU1UWVBFX0FVRElPKSB7CisgICAgICAgIC8vIHNldCBBQUMgaW5wdXQgYnVmZmVyIHNpemUgdG8gMzJLIGJ5dGVzICgyNTZrYnBzIHggMXNlYykKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgMzIgKiAxMDI0KTsKKyAgICB9IGVsc2UgaWYgKHN0cmVhbSA9PSBTVFJFQU1UWVBFX1ZJREVPKSB7CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlNYXhXaWR0aCwgbU1heFdpZHRoKTsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleU1heEhlaWdodCwgbU1heEhlaWdodCk7CisgICAgfQorCiAgICAgcmV0dXJuIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShtZXRhLCBmb3JtYXQpOwogfQogCitzcDxIVFRQRG93bmxvYWRlcj4gTGl2ZVNlc3Npb246OmdldEhUVFBEb3dubG9hZGVyKCkgeworICAgIHJldHVybiBuZXcgSFRUUERvd25sb2FkZXIobUhUVFBTZXJ2aWNlLCBtRXh0cmFIZWFkZXJzKTsKK30KKwogdm9pZCBMaXZlU2Vzc2lvbjo6Y29ubmVjdEFzeW5jKAogICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbm5lY3QsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb25uZWN0LCB0aGlzKTsKICAgICBtc2ctPnNldFN0cmluZygidXJsIiwgdXJsKTsKIAogICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKQEAgLTM2Miw3ICs1MTAsNyBAQAogfQogCiBzdGF0dXNfdCBMaXZlU2Vzc2lvbjo6ZGlzY29ubmVjdCgpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RGlzY29ubmVjdCwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdERpc2Nvbm5lY3QsIHRoaXMpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwogICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKQEAgLTM3MSw3ICs1MTksNyBAQAogfQogCiBzdGF0dXNfdCBMaXZlU2Vzc2lvbjo6c2Vla1RvKGludDY0X3QgdGltZVVzKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlZWssIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWVrLCB0aGlzKTsKICAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwpAQCAtMzgwLDYgKzUyOCw5NSBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK2Jvb2wgTGl2ZVNlc3Npb246OmNoZWNrU3dpdGNoUHJvZ3Jlc3MoCisgICAgICAgIHNwPEFNZXNzYWdlPiAmc3RvcFBhcmFtcywgaW50NjRfdCBkZWxheVVzLCBib29sICpuZWVkUmVzdW1lVW50aWwpIHsKKyAgICBBU3RyaW5nIG5ld1VyaTsKKyAgICBDSEVDSyhzdG9wUGFyYW1zLT5maW5kU3RyaW5nKCJ1cmkiLCAmbmV3VXJpKSk7CisKKyAgICAqbmVlZFJlc3VtZVVudGlsID0gZmFsc2U7CisgICAgc3A8QU1lc3NhZ2U+IGZpcnN0TmV3TWV0YVtrTWF4U3RyZWFtc107CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7CisgICAgICAgIFN0cmVhbVR5cGUgc3RyZWFtID0gaW5kZXhUb1R5cGUoaSk7CisgICAgICAgIGlmICghKG1Td2FwTWFzayAmIG1OZXdTdHJlYW1NYXNrICYgc3RyZWFtKQorICAgICAgICAgICAgfHwgKG1TdHJlYW1zW2ldLm1OZXdVcmkgIT0gbmV3VXJpKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmVhbSA9PSBTVFJFQU1UWVBFX1NVQlRJVExFUykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJnNvdXJjZSA9IG1QYWNrZXRTb3VyY2VzLmVkaXRWYWx1ZUF0KGkpOworCisgICAgICAgIC8vIEZpcnN0LCBnZXQgbGF0ZXN0IGRlcXVldWVkIG1ldGEsIHdoaWNoIGlzIHdoZXJlIHRoZSBkZWNvZGVyIGlzIGF0LgorICAgICAgICAvLyAod2hlbiB1cHN3aXRjaGluZywgd2UgdGFrZSB0aGUgbWV0YSBhZnRlciBhIGNlcnRhaW4gZGVsYXksIHNvIHRoYXQKKyAgICAgICAgLy8gdGhlIGRlY29kZXIgaXMgbGVmdCB3aXRoIHNvbWUgY3VzaGlvbikKKyAgICAgICAgc3A8QU1lc3NhZ2U+IGxhc3REZXF1ZXVlTWV0YSwgbGFzdEVucXVldWVNZXRhOworICAgICAgICBpZiAoZGVsYXlVcyA+IDApIHsKKyAgICAgICAgICAgIGxhc3REZXF1ZXVlTWV0YSA9IHNvdXJjZS0+Z2V0TWV0YUFmdGVyTGFzdERlcXVldWVkKGRlbGF5VXMpOworICAgICAgICAgICAgaWYgKGxhc3REZXF1ZXVlTWV0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyBtZWFucyB3ZSBkb24ndCBoYXZlIGVub3VnaCBjdXNoaW9uLCB0cnkgYWdhaW4gbGF0ZXIKKyAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSB1cCBzd2l0Y2hpbmcgZmFpbGVkIGR1ZSB0byBpbnN1ZmZpY2llbnQgYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldE5hbWVGb3JTdHJlYW0oc3RyZWFtKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSXQncyBva2F5IGZvciBsYXN0RGVxdWV1ZU1ldGEgdG8gYmUgTlVMTCBoZXJlLCBpdCBtZWFucyB0aGUKKyAgICAgICAgICAgIC8vIGRlY29kZXIgaGFzbid0IGV2ZW4gc3RhcnRlZCBkZXF1ZXVlaW5nCisgICAgICAgICAgICBsYXN0RGVxdWV1ZU1ldGEgPSBzb3VyY2UtPmdldExhdGVzdERlcXVldWVkTWV0YSgpOworICAgICAgICB9CisgICAgICAgIC8vIFRoZW4sIHRyaW0gb2ZmIHBhY2tldHMgYXQgYmVnaW5uaW5nIG9mIG1QYWNrZXRTb3VyY2VzMiB0aGF0J3MgYmVmb3JlCisgICAgICAgIC8vIHRoZSBsYXRlc3QgZGVxdWV1ZWQgdGltZS4gVGhlc2Ugc2FtcGxlcyBhcmUgZGVmaW5pdGVseSB0b28gbGF0ZS4KKyAgICAgICAgZmlyc3ROZXdNZXRhW2ldID0gbVBhY2tldFNvdXJjZXMyLmVkaXRWYWx1ZUF0KGkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT50cmltQnVmZmVyc0JlZm9yZU1ldGEobGFzdERlcXVldWVNZXRhKTsKKworICAgICAgICAvLyBOb3cgZmlyc3ROZXdNZXRhW2ldIGlzIHRoZSBmaXJzdCBzYW1wbGUgYWZ0ZXIgdGhlIHRyaW0uCisgICAgICAgIC8vIElmIGl0J3MgTlVMTCwgd2UgZmFpbGVkIGJlY2F1c2UgZGVxdWV1ZSBhbHJlYWR5IHBhc3QgYWxsIHNhbXBsZXMKKyAgICAgICAgLy8gaW4gbVBhY2tldFNvdXJjZTIsIHdlIGhhdmUgdG8gdHJ5IGFnYWluLgorICAgICAgICBpZiAoZmlyc3ROZXdNZXRhW2ldID09IE5VTEwpIHsKKyAgICAgICAgICAgIEhMU1RpbWUgZGVxdWV1ZVRpbWUobGFzdERlcXVldWVNZXRhKTsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIGRlcXVldWUgdGltZSAoJWQsICVsbGQpIHBhc3Qgc3RhcnQgdGltZSIsCisgICAgICAgICAgICAgICAgICAgIGdldE5hbWVGb3JTdHJlYW0oc3RyZWFtKSwKKyAgICAgICAgICAgICAgICAgICAgZGVxdWV1ZVRpbWUubVNlcSwgKGxvbmcgbG9uZykgZGVxdWV1ZVRpbWUubVRpbWVVcyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGNoZWNrIGlmIG1QYWNrZXRTb3VyY2VzMiBvdmVybGFwcyB3aXRoIHdoYXQgb2xkIGZldGNoZXIKKyAgICAgICAgLy8gYWxyZWFkeSBmZXRjaGVkLCBhbmQgc2VlIGlmIHdlIG5lZWQgdG8gcmVzdW1lVW50aWwKKyAgICAgICAgbGFzdEVucXVldWVNZXRhID0gc291cmNlLT5nZXRMYXRlc3RFbnF1ZXVlZE1ldGEoKTsKKyAgICAgICAgLy8gbGFzdEVucXVldWVNZXRhID09IE5VTEwgbWVhbnMgb2xkIGZldGNoZXIgc3RvcHBlZCBhdCBhIGRpc2NvbnRpbnVpdHkKKyAgICAgICAgLy8gYm91bmRhcnksIG5vIG5lZWQgdG8gcmVzdW1lIGFzIHRoZSBjb250ZW50IHdpbGwgbG9vayBkaWZmZXJlbnQgYW55d2F5cworICAgICAgICBpZiAobGFzdEVucXVldWVNZXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEhMU1RpbWUgbGFzdFRpbWUobGFzdEVucXVldWVNZXRhKSwgc3RhcnRUaW1lKGZpcnN0TmV3TWV0YVtpXSk7CisKKyAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gcmVzdW1lIG9sZCBmZXRjaGVyIGlmIG5ldyBmZXRjaGVyIHN0YXJ0ZWQgaW4gZGlmZmVyZW50CisgICAgICAgICAgICAvLyBkaXNjb250aW51aXR5IHNlcXVlbmNlLCBhcyB0aGUgY29udGVudCB3aWxsIGxvb2sgZGlmZmVyZW50LgorICAgICAgICAgICAgKm5lZWRSZXN1bWVVbnRpbCB8PSAoc3RhcnRUaW1lLm1TZXEgPT0gbGFzdFRpbWUubVNlcQorICAgICAgICAgICAgICAgICAgICAmJiBzdGFydFRpbWUubVRpbWVVcyAtIGxhc3RUaW1lLm1UaW1lVXMgPiBrUmVzdW1lVGhyZXNob2xkVXMpOworCisgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHN0b3BUaW1lIGZvciByZXN1bWVVbnRpbAorICAgICAgICAgICAgc3RvcFBhcmFtcy0+c2V0SW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCBzdGFydFRpbWUubVNlcSk7CisgICAgICAgICAgICBzdG9wUGFyYW1zLT5zZXRJbnQ2NChnZXRLZXlGb3JTdHJlYW0oc3RyZWFtKSwgc3RhcnRUaW1lLm1UaW1lVXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaWYgd2UncmUgaGVyZSwgaXQgbWVhbnMgZGVxdWV1ZSBwcm9ncmVzcyBoYXNuJ3QgcGFzc2VkIHNvbWUgc2FtcGxlcyBpbgorICAgIC8vIG1QYWNrZXRTb3VyY2UyLCB3ZSBjYW4gdHJpbSBvZmYgdGhlIGV4Y2VzcyBpbiBtUGFja2V0U291cmNlLgorICAgIC8vIChvbGQgZmV0Y2hlciBtaWdodCBzdGlsbCBuZWVkIHRvIHJlc3VtZVVudGlsIHRoZSBzdGFydCB0aW1lIG9mIG5ldyBmZXRjaGVyKQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgeworICAgICAgICBTdHJlYW1UeXBlIHN0cmVhbSA9IGluZGV4VG9UeXBlKGkpOworICAgICAgICBpZiAoIShtU3dhcE1hc2sgJiBtTmV3U3RyZWFtTWFzayAmIHN0cmVhbSkKKyAgICAgICAgICAgIHx8IChuZXdVcmkgIT0gbVN0cmVhbXNbaV0ubU5ld1VyaSkKKyAgICAgICAgICAgIHx8IHN0cmVhbSA9PSBTVFJFQU1UWVBFX1NVQlRJVExFUykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbVBhY2tldFNvdXJjZXMudmFsdWVGb3Ioc3RyZWFtKS0+dHJpbUJ1ZmZlcnNBZnRlck1ldGEoZmlyc3ROZXdNZXRhW2ldKTsKKyAgICB9CisKKyAgICAvLyBubyByZXN1bWVVbnRpbCBpZiBhbHJlYWR5IHVuZGVyZmxvdworICAgICpuZWVkUmVzdW1lVW50aWwgJj0gIW1CdWZmZXJpbmc7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogdm9pZCBMaXZlU2Vzc2lvbjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICAgIGNhc2Uga1doYXRDb25uZWN0OgpAQCAtNDAyLDE2ICs2MzksMTUgQEAKIAogICAgICAgICBjYXNlIGtXaGF0U2VlazoKICAgICAgICAgewotICAgICAgICAgICAgdWludDMyX3Qgc2Vla1JlcGx5SUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZzZWVrUmVwbHlJRCkpOwotICAgICAgICAgICAgbVNlZWtSZXBseUlEID0gc2Vla1JlcGx5SUQ7CisgICAgICAgICAgICBpZiAobVJlY29uZmlndXJhdGlvbkluUHJvZ3Jlc3MpIHsKKyAgICAgICAgICAgICAgICBtc2ctPnBvc3QoNTAwMDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZtU2Vla1JlcGx5SUQpKTsKICAgICAgICAgICAgIG1TZWVrUmVwbHkgPSBuZXcgQU1lc3NhZ2U7CiAKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG9uU2Vlayhtc2cpOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgbXNnLT5wb3N0KDUwMDAwKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9uU2Vlayhtc2cpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtNDI2LDE2ICs2NjIsMzAgQEAKICAgICAgICAgICAgICAgICBjYXNlIFBsYXlsaXN0RmV0Y2hlcjo6a1doYXRQYXVzZWQ6CiAgICAgICAgICAgICAgICAgY2FzZSBQbGF5bGlzdEZldGNoZXI6OmtXaGF0U3RvcHBlZDoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IFBsYXlsaXN0RmV0Y2hlcjo6a1doYXRTdG9wcGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIHVyaTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygidXJpIiwgJnVyaSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1GZXRjaGVySW5mb3MucmVtb3ZlSXRlbSh1cmkpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBkdXBsaWNhdGVkIGtXaGF0U3RvcHBlZCBtZXNzYWdlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQVN0cmluZyB1cmk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygidXJpIiwgJnVyaSkpOworICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUZldGNoZXJJbmZvcy5pbmRleE9mS2V5KHVyaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBtc2dzIGZyb20gZmV0Y2hlcnMgdGhhdCdzIGFscmVhZHkgZ29uZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Td2l0Y2hJblByb2dyZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5VG9GaW5pc2hCYW5kd2lkdGhTd2l0Y2goKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImZldGNoZXItJWQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GZXRjaGVySW5mb3NbaW5kZXhdLm1GZXRjaGVyLT5nZXRGZXRjaGVySUQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGF0ID09IFBsYXlsaXN0RmV0Y2hlcjo6a1doYXRQYXVzZWQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhdXNlZCIgOiAic3RvcHBlZCIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IFBsYXlsaXN0RmV0Y2hlcjo6a1doYXRTdG9wcGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRmV0Y2hlckxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GZXRjaGVySW5mb3NbaW5kZXhdLm1GZXRjaGVyLT5pZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1GZXRjaGVySW5mb3MucmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBQbGF5bGlzdEZldGNoZXI6OmtXaGF0UGF1c2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlZWtNb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInNlZWtNb2RlIiwgJnNlZWtNb2RlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVN0cmVhbXNbaV0ubVVyaSA9PSB1cmkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbXNbaV0ubVNlZWtNb2RlID0gKFNlZWtNb2RlKSBzZWVrTW9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtNDQzLDE1ICs2OTMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfR1QobUNvbnRpbnVhdGlvbkNvdW50ZXIsIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0tbUNvbnRpbnVhdGlvbkNvdW50ZXIgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250aW51YXRpb24tPnBvc3QoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2Vla1JlcGx5SUQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtU2Vla1JlcGx5ICE9IE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vla1JlcGx5LT5zZXRJbnQzMigiZXJyIiwgT0spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vla1JlcGx5LT5wb3N0UmVwbHkobVNlZWtSZXBseUlEKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlZWtSZXBseUlEID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlZWtSZXBseS5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlenUgZmV0Y2hlcihzKSBsZWZ0IiwgbUNvbnRpbnVhdGlvbkNvdW50ZXIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KQEAgLTQ2NCw4ICs3MDcsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOwogICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgiZHVyYXRpb25VcyIsICZkdXJhdGlvblVzKSk7CiAKLSAgICAgICAgICAgICAgICAgICAgRmV0Y2hlckluZm8gKmluZm8gPSAmbUZldGNoZXJJbmZvcy5lZGl0VmFsdWVGb3IodXJpKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+bUR1cmF0aW9uVXMgPSBkdXJhdGlvblVzOworICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUZldGNoZXJJbmZvcy5pbmRleE9mS2V5KHVyaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBGZXRjaGVySW5mbyAqaW5mbyA9ICZtRmV0Y2hlckluZm9zLmVkaXRWYWx1ZUZvcih1cmkpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+bUR1cmF0aW9uVXMgPSBkdXJhdGlvblVzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgUGxheWxpc3RGZXRjaGVyOjprV2hhdFRhcmdldER1cmF0aW9uVXBkYXRlOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0YXJnZXREdXJhdGlvblVzOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGFyZ2V0RHVyYXRpb25VcyIsICZ0YXJnZXREdXJhdGlvblVzKSk7CisgICAgICAgICAgICAgICAgICAgIG1VcFN3aXRjaE1hcmsgPSBtaW4oa1VwU3dpdGNoTWFya1VzLCB0YXJnZXREdXJhdGlvblVzICogNyAvIDQpOworICAgICAgICAgICAgICAgICAgICBtRG93blN3aXRjaE1hcmsgPSBtaW4oa0Rvd25Td2l0Y2hNYXJrVXMsIHRhcmdldER1cmF0aW9uVXMgKiA5IC8gNCk7CisgICAgICAgICAgICAgICAgICAgIG1VcFN3aXRjaE1hcmdpbiA9IG1pbihrVXBTd2l0Y2hNYXJnaW5VcywgdGFyZ2V0RHVyYXRpb25Vcyk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIApAQCAtNDkzLDYgKzc0OSwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVtZW1iZXIgdGhlIGZhaWx1cmUgaW5kZXggKGFzIG1DdXJCYW5kd2lkdGhJbmRleCB3aWxsIGJlIHJlc3RvcmVkCisgICAgICAgICAgICAgICAgICAgIC8vIGFmdGVyIGNhbmNlbEJhbmR3aWR0aFN3aXRjaCgpKSwgYW5kIHJlY29yZCBsYXN0IGZhaWwgdGltZQorICAgICAgICAgICAgICAgICAgICBzaXplX3QgZmFpbHVyZUluZGV4ID0gbUN1ckJhbmR3aWR0aEluZGV4OworICAgICAgICAgICAgICAgICAgICBtQmFuZHdpZHRoSXRlbXMuZWRpdEl0ZW1BdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlSW5kZXgpLm1MYXN0RmFpbHVyZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobVN3aXRjaEluUHJvZ3Jlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGVycm9yIGhhcHBlbmVkIHdoZW4gd2Ugc3dpdGNoIHRvIGEgdmFyaWFudCwgdHJ5IGZhbGxiYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBvdGhlciB2YXJpYW50IHRvIHNhdmUgdGhlIHNlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cnlCYW5kd2lkdGhGYWxsYmFjaygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICBpZiAobUluUHJlcGFyYXRpb25QaGFzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFByZXBhcmVkKGVycik7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTUwNiwzOCArNzc2LDIzIEBACiAgICAgICAgICAgICAgICAgICAgIG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUUkVBTVRZUEVfU1VCVElUTEVTKS0+c2lnbmFsRU9TKGVycik7CiAKLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRFcnJvcik7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICBwb3N0RXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2FzZSBQbGF5bGlzdEZldGNoZXI6OmtXaGF0VGVtcG9yYXJpbHlEb25lRmV0Y2hpbmc6CisgICAgICAgICAgICAgICAgY2FzZSBQbGF5bGlzdEZldGNoZXI6OmtXaGF0U3RvcFJlYWNoZWQ6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIHVyaTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJ1cmkiLCAmdXJpKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJrV2hhdFN0b3BSZWFjaGVkIik7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GZXRjaGVySW5mb3MuaW5kZXhPZktleSh1cmkpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImNvdWxkbid0IGZpbmQgdXJpIik7CisgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgb2xkVXJpOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoInVyaSIsICZvbGRVcmkpKTsKKworICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUZldGNoZXJJbmZvcy5pbmRleE9mS2V5KG9sZFVyaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEZldGNoZXJJbmZvICppbmZvID0gJm1GZXRjaGVySW5mb3MuZWRpdFZhbHVlRm9yKHVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPm1Jc1ByZXBhcmVkID0gdHJ1ZTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAobUluUHJlcGFyYXRpb25QaGFzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxGZXRjaGVyc1ByZXBhcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZldGNoZXJJbmZvcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUZldGNoZXJJbmZvcy52YWx1ZUF0KGkpLm1Jc1ByZXBhcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbEZldGNoZXJzUHJlcGFyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsRmV0Y2hlcnNQcmVwYXJlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RQcmVwYXJlZChPSyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdHJ5VG9GaW5pc2hCYW5kd2lkdGhTd2l0Y2gob2xkVXJpKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCkBAIC01NDYsMTkgKzgwMSw5NyBAQAogICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN3aXRjaEdlbmVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzd2l0Y2hHZW5lcmF0aW9uIiwgJnN3aXRjaEdlbmVyYXRpb24pKTsKIAorICAgICAgICAgICAgICAgICAgICBBTE9HVigia1doYXRTdGFydGVkQXQ6IHN3aXRjaEdlbj0lZCwgbVN3aXRjaEdlbj0lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoR2VuZXJhdGlvbiwgbVN3aXRjaEdlbmVyYXRpb24pOworCiAgICAgICAgICAgICAgICAgICAgIGlmIChzd2l0Y2hHZW5lcmF0aW9uICE9IG1Td2l0Y2hHZW5lcmF0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIC8vIFJlc3VtZSBmZXRjaGVyIGZvciB0aGUgb3JpZ2luYWwgdmFyaWFudDsgdGhlIHJlc3VtZWQgZmV0Y2hlciBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWUgdW50aWwgdGhlIHRpbWVzdGFtcHMgZm91bmQgaW4gbXNnLCB3aGljaCBpcyBzdG9yZWQgYnkgdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIG5ldyBmZXRjaGVyIHRvIGluZGljYXRlIHdoZXJlIHRoZSBuZXcgdmFyaWFudCBoYXMgc3RhcnRlZCBidWZmZXJpbmcuCi0gICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZldGNoZXJJbmZvcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmV0Y2hlckluZm8gaW5mbyA9IG1GZXRjaGVySW5mb3MudmFsdWVBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLm1Ub0JlUmVtb3ZlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ubUZldGNoZXItPnJlc3VtZVVudGlsQXN5bmMobXNnKTsKKyAgICAgICAgICAgICAgICAgICAgQVN0cmluZyB1cmk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygidXJpIiwgJnVyaSkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgbmV3IGZldGNoZXIgbVRvQmVSZXN1bWVkCisgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtRmV0Y2hlckluZm9zLmluZGV4T2ZLZXkodXJpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1GZXRjaGVySW5mb3MuZWRpdFZhbHVlQXQoaW5kZXgpLm1Ub0JlUmVzdW1lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyB0ZW1wb3JhcmlseSBkaXNhYmxlIHBhY2tldCBzb3VyY2VzIHRvIGJlIHN3YXBwZWQgdG8gcHJldmVudAorICAgICAgICAgICAgICAgICAgICAvLyBOdVBsYXllckRlY29kZXIgZnJvbSBkZXF1ZXVpbmcgd2hpbGUgd2UgY2hlY2sgcHJvZ3Jlc3MKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGFja2V0U291cmNlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtU3dhcE1hc2sgJiBtUGFja2V0U291cmNlcy5rZXlBdChpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdXJpID09IG1TdHJlYW1zW2ldLm1OZXdVcmkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFja2V0U291cmNlcy5lZGl0VmFsdWVBdChpKS0+ZW5hYmxlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBib29sIHN3aXRjaFVwID0gKG1DdXJCYW5kd2lkdGhJbmRleCA+IG1PcmlnQmFuZHdpZHRoSW5kZXgpOworICAgICAgICAgICAgICAgICAgICAvLyBJZiBzd2l0Y2hpbmcgdXAsIHJlcXVpcmUgYSBjdXNoaW9uIGJpZ2dlciB0aGFuIGtVbmRlcmZsb3dNYXJrCisgICAgICAgICAgICAgICAgICAgIC8vIHRvIGF2b2lkIGJ1ZmZlcmluZyBpbW1lZGlhdGVseSBhZnRlciB0aGUgc3dpdGNoLgorICAgICAgICAgICAgICAgICAgICAvLyAoSWYgd2UgZG9uJ3QgaGF2ZSB0aGF0IGN1c2hpb24gd2UnZCByYXRoZXIgY2FuY2VsIGFuZCB0cnkgYWdhaW4uKQorICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPSBzd2l0Y2hVcCA/IChrVW5kZXJmbG93TWFya1VzICsgMTAwMDAwMGxsKSA6IDA7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZFJlc3VtZVVudGlsID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBzdG9wUGFyYW1zID0gbXNnOworICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tTd2l0Y2hQcm9ncmVzcyhzdG9wUGFyYW1zLCBkZWxheVVzLCAmbmVlZFJlc3VtZVVudGlsKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgdGltZSBoYXNuJ3QgcGFzc2VkIHN0YXJ0QXQgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuZWVkUmVzdW1lVW50aWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiZmluaXNoIHN3aXRjaCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1Td2FwTWFzayAmIGluZGV4VG9UeXBlKGkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHVyaSA9PSBtU3RyZWFtc1tpXS5tTmV3VXJpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYXZlIHRvIG1ha2UgYSBjb3B5IG9mIG1TdHJlYW1zW2ldLm1VcmkgYmVjYXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ5VG9GaW5pc2hCYW5kd2lkdGhTd2l0Y2ggaXMgbW9kaWZ5aW5nIG1TdHJlYW1zW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgb2xkVVJJID0gbVN0cmVhbXNbaV0ubVVyaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeVRvRmluaXNoQmFuZHdpZHRoU3dpdGNoKG9sZFVSSSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRBdCB0aW1lIGlzIGFmdGVyIGxhc3QgZW5xdWV1ZSB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdW1lIGZldGNoZXIgZm9yIHRoZSBvcmlnaW5hbCB2YXJpYW50OyB0aGUgcmVzdW1lZCBmZXRjaGVyIHNob3VsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHVudGlsIHRoZSB0aW1lc3RhbXBzIGZvdW5kIGluIG1zZywgd2hpY2ggaXMgc3RvcmVkIGJ5IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBmZXRjaGVyIHRvIGluZGljYXRlIHdoZXJlIHRoZSBuZXcgdmFyaWFudCBoYXMgc3RhcnRlZCBidWZmZXJpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImZpbmlzaCBzd2l0Y2ggd2l0aCByZXN1bWVVbnRpbEFzeW5jIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmV0Y2hlckluZm9zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZldGNoZXJJbmZvICZpbmZvID0gbUZldGNoZXJJbmZvcy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5tVG9CZVJlbW92ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ubUZldGNoZXItPnJlc3VtZVVudGlsQXN5bmMoc3RvcFBhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayB0aW1lIHBhc3NlZCBzdGFydEF0IHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzd2l0Y2hVcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHN3aXRjaGluZyB1cCwgY2FuY2VsIGFuZCByZXRyeSBpZiBjb25kaXRpb24gc2F0aXNmaWVzIGFnYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNhbmNlbCB1cCBzd2l0Y2ggYmVjYXVzZSB3ZSdyZSB0b28gbGF0ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbEJhbmR3aWR0aFN3aXRjaCh0cnVlIC8qIHJlc3VtZSAqLyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZXRyeSBkb3duIHN3aXRjaCBhdCBuZXh0IHNhbXBsZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZUZldGNoZXIodXJpLCBtU3dhcE1hc2ssIC0xLCB0cnVlIC8qIG5ld1VyaSAqLyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gcmUtZW5hYmxlIGFsbCBwYWNrZXQgc291cmNlcworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYWNrZXRTb3VyY2VzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGFja2V0U291cmNlcy5lZGl0VmFsdWVBdChpKS0+ZW5hYmxlKHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBQbGF5bGlzdEZldGNoZXI6OmtXaGF0UGxheWxpc3RGZXRjaGVkOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb25NYXN0ZXJQbGF5bGlzdEZldGNoZWQobXNnKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBQbGF5bGlzdEZldGNoZXI6OmtXaGF0TWV0YWRhdGFEZXRlY3RlZDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghbUhhc01ldGFkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtSGFzTWV0YWRhdGEgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0TWV0YWRhdGFEZXRlY3RlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTU2OSwxOSArOTAyLDYgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBrV2hhdENoZWNrQmFuZHdpZHRoOgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IG1DaGVja0JhbmR3aWR0aEdlbmVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb25DaGVja0JhbmR3aWR0aChtc2cpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQogICAgICAgICBjYXNlIGtXaGF0Q2hhbmdlQ29uZmlndXJhdGlvbjoKICAgICAgICAgewogICAgICAgICAgICAgb25DaGFuZ2VDb25maWd1cmF0aW9uKG1zZyk7CkBAIC02MDAsMjcgKzkyMCwxMyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIGtXaGF0RmluaXNoRGlzY29ubmVjdDI6CisgICAgICAgIGNhc2Uga1doYXRQb2xsQnVmZmVyaW5nOgogICAgICAgICB7Ci0gICAgICAgICAgICBvbkZpbmlzaERpc2Nvbm5lY3QyKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRTd2FwcGVkOgotICAgICAgICB7Ci0gICAgICAgICAgICBvblN3YXBwZWQobXNnKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdENoZWNrU3dpdGNoRG93bjoKLSAgICAgICAgewotICAgICAgICAgICAgb25DaGVja1N3aXRjaERvd24oKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFN3aXRjaERvd246Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG9uU3dpdGNoRG93bigpOworICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gPT0gbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgb25Qb2xsQnVmZmVyaW5nKCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC02MzEsNiArOTM3LDEzIEBACiB9CiAKIC8vIHN0YXRpYworYm9vbCBMaXZlU2Vzc2lvbjo6aXNCYW5kd2lkdGhWYWxpZChjb25zdCBCYW5kd2lkdGhJdGVtICZpdGVtKSB7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga0JsYWNrbGlzdFdpbmRvd1VzID0gMzAwICogMTAwMDAwMGxsOworICAgIHJldHVybiBpdGVtLm1MYXN0RmFpbHVyZVVzIDwgMAorICAgICAgICAgICAgfHwgQUxvb3Blcjo6R2V0Tm93VXMoKSAtIGl0ZW0ubUxhc3RGYWlsdXJlVXMgPiBrQmxhY2tsaXN0V2luZG93VXM7Cit9CisKKy8vIHN0YXRpYwogaW50IExpdmVTZXNzaW9uOjpTb3J0QnlCYW5kd2lkdGgoY29uc3QgQmFuZHdpZHRoSXRlbSAqYSwgY29uc3QgQmFuZHdpZHRoSXRlbSAqYikgewogICAgIGlmIChhLT5tQmFuZHdpZHRoIDwgYi0+bUJhbmR3aWR0aCkgewogICAgICAgICByZXR1cm4gLTE7CkBAIC02NDMsNyArOTU2LDcgQEAKIAogLy8gc3RhdGljCiBMaXZlU2Vzc2lvbjo6U3RyZWFtVHlwZSBMaXZlU2Vzc2lvbjo6aW5kZXhUb1R5cGUoaW50IGlkeCkgewotICAgIENIRUNLKGlkeCA+PSAwICYmIGlkeCA8IGtNYXhTdHJlYW1zKTsKKyAgICBDSEVDSyhpZHggPj0gMCAmJiBpZHggPCBrTnVtU291cmNlcyk7CiAgICAgcmV0dXJuIChTdHJlYW1UeXBlKSgxIDw8IGlkeCk7CiB9CiAKQEAgLTY1Niw2ICs5NjksOCBAQAogICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9TVUJUSVRMRVM6CiAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX01FVEFEQVRBOgorICAgICAgICAgICAgcmV0dXJuIDM7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgfTsKQEAgLTY2Myw4ICs5NzgsMTAgQEAKIH0KIAogdm9pZCBMaXZlU2Vzc2lvbjo6b25Db25uZWN0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgQVN0cmluZyB1cmw7Ci0gICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJ1cmwiLCAmdXJsKSk7CisgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJ1cmwiLCAmbU1hc3RlclVSTCkpOworCisgICAgLy8gVE9ETyBjdXJyZW50bHkgd2UgZG9uJ3Qga25vdyBpZiB3ZSBhcmUgY29taW5nIGhlcmUgZnJvbSBpbmNvZ25pdG8gbW9kZQorICAgIEFMT0dJKCJvbkNvbm5lY3QgJXMiLCB1cmlEZWJ1Z1N0cmluZyhtTWFzdGVyVVJMKS5jX3N0cigpKTsKIAogICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTDsKICAgICBpZiAoIW1zZy0+ZmluZFBvaW50ZXIoImhlYWRlcnMiLCAodm9pZCAqKikmaGVhZGVycykpIHsKQEAgLTY3NiwyMSArOTkzLDM5IEBACiAgICAgICAgIGhlYWRlcnMgPSBOVUxMOwogICAgIH0KIAotICAgIC8vIFRPRE8gY3VycmVudGx5IHdlIGRvbid0IGtub3cgaWYgd2UgYXJlIGNvbWluZyBoZXJlIGZyb20gaW5jb2duaXRvIG1vZGUKLSAgICBBTE9HSSgib25Db25uZWN0ICVzIiwgdXJpRGVidWdTdHJpbmcodXJsKS5jX3N0cigpKTsKKyAgICAvLyBjcmVhdGUgbG9vcGVyIGZvciBmZXRjaGVycworICAgIGlmIChtRmV0Y2hlckxvb3BlciA9PSBOVUxMKSB7CisgICAgICAgIG1GZXRjaGVyTG9vcGVyID0gbmV3IEFMb29wZXIoKTsKIAotICAgIG1NYXN0ZXJVUkwgPSB1cmw7CisgICAgICAgIG1GZXRjaGVyTG9vcGVyLT5zZXROYW1lKCJGZXRjaGVyIik7CisgICAgICAgIG1GZXRjaGVyTG9vcGVyLT5zdGFydChmYWxzZSwgZmFsc2UpOworICAgIH0KIAotICAgIGJvb2wgZHVtbXk7Ci0gICAgbVBsYXlsaXN0ID0gZmV0Y2hQbGF5bGlzdCh1cmwuY19zdHIoKSwgTlVMTCAvKiBjdXJQbGF5bGlzdEhhc2ggKi8sICZkdW1teSk7CisgICAgLy8gY3JlYXRlIGZldGNoZXIgdG8gZmV0Y2ggdGhlIG1hc3RlciBwbGF5bGlzdAorICAgIGFkZEZldGNoZXIobU1hc3RlclVSTC5jX3N0cigpKS0+ZmV0Y2hQbGF5bGlzdEFzeW5jKCk7Cit9CiAKK3ZvaWQgTGl2ZVNlc3Npb246Om9uTWFzdGVyUGxheWxpc3RGZXRjaGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgQVN0cmluZyB1cmk7CisgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJ1cmkiLCAmdXJpKSk7CisgICAgc3NpemVfdCBpbmRleCA9IG1GZXRjaGVySW5mb3MuaW5kZXhPZktleSh1cmkpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coImZldGNoZXIgZm9yIG1hc3RlciBwbGF5bGlzdCBpcyBnb25lLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gbm8gbG9uZ2VyIHVzZWZ1bCwgcmVtb3ZlCisgICAgbUZldGNoZXJMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1GZXRjaGVySW5mb3NbaW5kZXhdLm1GZXRjaGVyLT5pZCgpKTsKKyAgICBtRmV0Y2hlckluZm9zLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworCisgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJwbGF5bGlzdCIsIChzcDxSZWZCYXNlPiAqKSZtUGxheWxpc3QpKTsKICAgICBpZiAobVBsYXlsaXN0ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoInVuYWJsZSB0byBmZXRjaCBtYXN0ZXIgcGxheWxpc3QgJXMuIiwgdXJpRGVidWdTdHJpbmcodXJsKS5jX3N0cigpKTsKKyAgICAgICAgQUxPR0UoInVuYWJsZSB0byBmZXRjaCBtYXN0ZXIgcGxheWxpc3QgJXMuIiwKKyAgICAgICAgICAgICAgICB1cmlEZWJ1Z1N0cmluZyhtTWFzdGVyVVJMKS5jX3N0cigpKTsKIAogICAgICAgICBwb3N0UHJlcGFyZWQoRVJST1JfSU8pOwogICAgICAgICByZXR1cm47CiAgICAgfQotCiAgICAgLy8gV2UgdHJ1c3QgdGhlIGNvbnRlbnQgcHJvdmlkZXIgdG8gbWFrZSBhIHJlYXNvbmFibGUgY2hvaWNlIG9mIHByZWZlcnJlZAogICAgIC8vIGluaXRpYWwgYmFuZHdpZHRoIGJ5IGxpc3RpbmcgaXQgZmlyc3QgaW4gdGhlIHZhcmlhbnQgcGxheWxpc3QuCiAgICAgLy8gQXQgc3RhcnR1cCB3ZSByZWFsbHkgZG9uJ3QgaGF2ZSBhIGdvb2QgZXN0aW1hdGUgb24gdGhlIGF2YWlsYWJsZQpAQCAtNjk5LDExICsxMDM0LDE2IEBACiAgICAgc2l6ZV90IGluaXRpYWxCYW5kd2lkdGggPSAwOwogICAgIHNpemVfdCBpbml0aWFsQmFuZHdpZHRoSW5kZXggPSAwOwogCisgICAgaW50MzJfdCBtYXhXaWR0aCA9IDA7CisgICAgaW50MzJfdCBtYXhIZWlnaHQgPSAwOworCiAgICAgaWYgKG1QbGF5bGlzdC0+aXNWYXJpYW50UGxheWxpc3QoKSkgeworICAgICAgICBWZWN0b3I8QmFuZHdpZHRoSXRlbT4gaXRlbXNXaXRoVmlkZW87CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXlsaXN0LT5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgQmFuZHdpZHRoSXRlbSBpdGVtOwogCiAgICAgICAgICAgICBpdGVtLm1QbGF5bGlzdEluZGV4ID0gaTsKKyAgICAgICAgICAgIGl0ZW0ubUxhc3RGYWlsdXJlVXMgPSAtMWxsOwogCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbWV0YTsKICAgICAgICAgICAgIEFTdHJpbmcgdXJpOwpAQCAtNzExLDE0ICsxMDUxLDMwIEBACiAKICAgICAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMigiYmFuZHdpZHRoIiwgKGludDMyX3QgKikmaXRlbS5tQmFuZHdpZHRoKSk7CiAKLSAgICAgICAgICAgIGlmIChpbml0aWFsQmFuZHdpZHRoID09IDApIHsKLSAgICAgICAgICAgICAgICBpbml0aWFsQmFuZHdpZHRoID0gaXRlbS5tQmFuZHdpZHRoOworICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgICAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpKSB7CisgICAgICAgICAgICAgICAgbWF4V2lkdGggPSBtYXgobWF4V2lkdGgsIHdpZHRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgbWF4SGVpZ2h0ID0gbWF4KG1heEhlaWdodCwgaGVpZ2h0KTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbUJhbmR3aWR0aEl0ZW1zLnB1c2goaXRlbSk7CisgICAgICAgICAgICBpZiAobVBsYXlsaXN0LT5oYXNUeXBlKGksICJ2aWRlbyIpKSB7CisgICAgICAgICAgICAgICAgaXRlbXNXaXRoVmlkZW8ucHVzaChpdGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyByZW1vdmUgdGhlIGF1ZGlvLW9ubHkgdmFyaWFudHMgaWYgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgd2l0aCB2aWRlbworICAgICAgICBpZiAoIWl0ZW1zV2l0aFZpZGVvLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAmJiBpdGVtc1dpdGhWaWRlby5zaXplKCkgPCBtQmFuZHdpZHRoSXRlbXMuc2l6ZSgpKSB7CisgICAgICAgICAgICBtQmFuZHdpZHRoSXRlbXMuY2xlYXIoKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaXRlbXNXaXRoVmlkZW8uc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBtQmFuZHdpZHRoSXRlbXMucHVzaChpdGVtc1dpdGhWaWRlb1tpXSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBDSEVDS19HVChtQmFuZHdpZHRoSXRlbXMuc2l6ZSgpLCAwdSk7CisgICAgICAgIGluaXRpYWxCYW5kd2lkdGggPSBtQmFuZHdpZHRoSXRlbXNbMF0ubUJhbmR3aWR0aDsKIAogICAgICAgICBtQmFuZHdpZHRoSXRlbXMuc29ydChTb3J0QnlCYW5kd2lkdGgpOwogCkBAIC03MzYsMzkgKzEwOTIsNDQgQEAKICAgICAgICAgbUJhbmR3aWR0aEl0ZW1zLnB1c2goaXRlbSk7CiAgICAgfQogCisgICAgbU1heFdpZHRoID0gbWF4V2lkdGggPiAwID8gbWF4V2lkdGggOiBtTWF4V2lkdGg7CisgICAgbU1heEhlaWdodCA9IG1heEhlaWdodCA+IDAgPyBtYXhIZWlnaHQgOiBtTWF4SGVpZ2h0OworCiAgICAgbVBsYXlsaXN0LT5waWNrUmFuZG9tTWVkaWFJdGVtcygpOwogICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24oCiAgICAgICAgICAgICAwbGwgLyogdGltZVVzICovLCBpbml0aWFsQmFuZHdpZHRoSW5kZXgsIGZhbHNlIC8qIHBpY2tUcmFjayAqLyk7CiB9CiAKIHZvaWQgTGl2ZVNlc3Npb246OmZpbmlzaERpc2Nvbm5lY3QoKSB7CisgICAgQUxPR1YoImZpbmlzaERpc2Nvbm5lY3QiKTsKKwogICAgIC8vIE5vIHJlY29uZmlndXJhdGlvbiBpcyBjdXJyZW50bHkgcGVuZGluZywgbWFrZSBzdXJlIG5vbmUgd2lsbCB0cmlnZ2VyCiAgICAgLy8gZHVyaW5nIGRpc2Nvbm5lY3Rpb24gZWl0aGVyLgotICAgIGNhbmNlbENoZWNrQmFuZHdpZHRoRXZlbnQoKTsKLQotICAgIC8vIFByb3RlY3QgbVBhY2tldFNvdXJjZXMgZnJvbSBhIHN3YXBQYWNrZXRTb3VyY2UgcmFjZSBjb25kaXRpb24gdGhyb3VnaCBkaXNjb25uZWN0LgotICAgIC8vIChmaW5pc2hEaXNjb25uZWN0LCBvbkZpbmlzaERpc2Nvbm5lY3QyKQogICAgIGNhbmNlbEJhbmR3aWR0aFN3aXRjaCgpOwogCi0gICAgLy8gY2FuY2VsIHN3aXRjaCBkb3duIG1vbml0b3IKLSAgICBtU3dpdGNoRG93bk1vbml0b3IuY2xlYXIoKTsKKyAgICAvLyBjYW5jZWwgYnVmZmVyIHBvbGxpbmcKKyAgICBjYW5jZWxQb2xsQnVmZmVyaW5nKCk7CiAKKyAgICAvLyBUUklDS1k6IGRvbid0IHdhaXQgZm9yIGFsbCBmZXRjaGVyIHRvIGJlIHN0b3BwZWQgd2hlbiBkaXNjb25uZWN0aW5nCisgICAgLy8KKyAgICAvLyBTb21lIGZldGNoZXJzIG1pZ2h0IGJlIHN0dWNrIGluIGNvbm5lY3QvZ2V0U2l6ZSBhdCB0aGlzIHBvaW50LiBUaGVzZQorICAgIC8vIG9wZXJhdGlvbnMgd2lsbCBldmVudHVhbGx5IHRpbWVvdXQgKGFzIHdlIGhhdmUgYSB0aW1lb3V0IHNldCBpbgorICAgIC8vIE1lZGlhSFRUUENvbm5lY3Rpb24pLCBidXQgd2UgZG9uJ3Qgd2FudCB0byBibG9jayB0aGUgbWFpbiBVSSB0aHJlYWQKKyAgICAvLyB1bnRpbCB0aGVuLiBIZXJlIHdlIGp1c3QgbmVlZCB0byBtYWtlIHN1cmUgd2UgY2xlYXIgYWxsIHJlZmVyZW5jZXMKKyAgICAvLyB0byB0aGUgZmV0Y2hlcnMsIHNvIHRoYXQgd2hlbiB0aGV5IGZpbmFsbHkgZXhpdCBmcm9tIHRoZSBibG9ja2luZworICAgIC8vIG9wZXJhdGlvbiwgdGhleSBjYW4gYmUgZGVzdHJ1Y3RlZC4KKyAgICAvLworICAgIC8vIFRoZXJlIGlzIG9uZSB2ZXJ5IHRyaWNreSBwb2ludCB0aG91Z2guIEZvciB0aGlzIHNjaGVtZSB0byB3b3JrLCB0aGUKKyAgICAvLyBmZWN0aGVyIG11c3QgaG9sZCBhIHJlZmVyZW5jZSB0byBMaXZlU2Vzc2lvbiwgc28gdGhhdCBMaXZlU2Vzc2lvbiBpcworICAgIC8vIGRlc3Ryb3llZCBhZnRlciBmZXRjaGVyLiBPdGhlcndpc2UgTGl2ZVNlc3Npb24gd291bGQgZ2V0IHN0dWNrIGluIGl0cworICAgIC8vIG93biBkZXN0cnVjdG9yIHdoZW4gaXQgd2FpdHMgZm9yIG1GZXRjaGVyTG9vcGVyIHRvIHN0b3AsIHdoaWNoIHN0aWxsCisgICAgLy8gYmxvY2tzIG1haW4gVUkgdGhyZWFkLgogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZldGNoZXJJbmZvcy5zaXplKCk7ICsraSkgewogICAgICAgICBtRmV0Y2hlckluZm9zLnZhbHVlQXQoaSkubUZldGNoZXItPnN0b3BBc3luYygpOworICAgICAgICBtRmV0Y2hlckxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoCisgICAgICAgICAgICAgICAgbUZldGNoZXJJbmZvcy52YWx1ZUF0KGkpLm1GZXRjaGVyLT5pZCgpKTsKICAgICB9Ci0KLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RmluaXNoRGlzY29ubmVjdDIsIGlkKCkpOwotCi0gICAgbUNvbnRpbnVhdGlvbkNvdW50ZXIgPSBtRmV0Y2hlckluZm9zLnNpemUoKTsKLSAgICBtQ29udGludWF0aW9uID0gbXNnOwotCi0gICAgaWYgKG1Db250aW51YXRpb25Db3VudGVyID09IDApIHsKLSAgICAgICAgbXNnLT5wb3N0KCk7Ci0gICAgfQotfQotCi12b2lkIExpdmVTZXNzaW9uOjpvbkZpbmlzaERpc2Nvbm5lY3QyKCkgewotICAgIG1Db250aW51YXRpb24uY2xlYXIoKTsKKyAgICBtRmV0Y2hlckluZm9zLmNsZWFyKCk7CiAKICAgICBtUGFja2V0U291cmNlcy52YWx1ZUZvcihTVFJFQU1UWVBFX0FVRElPKS0+c2lnbmFsRU9TKEVSUk9SX0VORF9PRl9TVFJFQU0pOwogICAgIG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKFNUUkVBTVRZUEVfVklERU8pLT5zaWduYWxFT1MoRVJST1JfRU5EX09GX1NUUkVBTSk7CkBAIC03ODAsNyArMTE0MSw3IEBACiAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBPSyk7CiAKICAgICByZXNwb25zZS0+cG9zdFJlcGx5KG1EaXNjb25uZWN0UmVwbHlJRCk7Ci0gICAgbURpc2Nvbm5lY3RSZXBseUlEID0gMDsKKyAgICBtRGlzY29ubmVjdFJlcGx5SUQuY2xlYXIoKTsKIH0KIAogc3A8UGxheWxpc3RGZXRjaGVyPiBMaXZlU2Vzc2lvbjo6YWRkRmV0Y2hlcihjb25zdCBjaGFyICp1cmkpIHsKQEAgLTc5MCwyMTMgKzExNTEsMTg1IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRGZXRjaGVyTm90aWZ5LCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hlck5vdGlmeSwgdGhpcyk7CiAgICAgbm90aWZ5LT5zZXRTdHJpbmcoInVyaSIsIHVyaSk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigic3dpdGNoR2VuZXJhdGlvbiIsIG1Td2l0Y2hHZW5lcmF0aW9uKTsKIAogICAgIEZldGNoZXJJbmZvIGluZm87Ci0gICAgaW5mby5tRmV0Y2hlciA9IG5ldyBQbGF5bGlzdEZldGNoZXIobm90aWZ5LCB0aGlzLCB1cmksIG1TdWJ0aXRsZUdlbmVyYXRpb24pOworICAgIGluZm8ubUZldGNoZXIgPSBuZXcgUGxheWxpc3RGZXRjaGVyKAorICAgICAgICAgICAgbm90aWZ5LCB0aGlzLCB1cmksIG1DdXJCYW5kd2lkdGhJbmRleCwgbVN1YnRpdGxlR2VuZXJhdGlvbik7CiAgICAgaW5mby5tRHVyYXRpb25VcyA9IC0xbGw7Ci0gICAgaW5mby5tSXNQcmVwYXJlZCA9IGZhbHNlOwogICAgIGluZm8ubVRvQmVSZW1vdmVkID0gZmFsc2U7Ci0gICAgbG9vcGVyKCktPnJlZ2lzdGVySGFuZGxlcihpbmZvLm1GZXRjaGVyKTsKKyAgICBpbmZvLm1Ub0JlUmVzdW1lZCA9IGZhbHNlOworICAgIG1GZXRjaGVyTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIoaW5mby5tRmV0Y2hlcik7CiAKICAgICBtRmV0Y2hlckluZm9zLmFkZCh1cmksIGluZm8pOwogCiAgICAgcmV0dXJuIGluZm8ubUZldGNoZXI7CiB9CiAKLS8qCi0gKiBJbGx1c3RyYXRpb24gb2YgcGFyYW1ldGVyczoKLSAqCi0gKiAwICAgICAgYHJhbmdlX29mZnNldGAKLSAqICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLSstLSsKLSAqIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBuZXh0IGJsb2NrIHRvIGZldGNoIHwgIHwgIHwKLSAqIHwgICAgICAgICAgICB8IGBzb3VyY2VgIGhhbmRsZSA9PiBgb3V0YCBidWZmZXIgfCAgICAgICAgICAgICAgICAgICAgIHwgIHwgIHwKLSAqIHwgYHVybGAgZmlsZSB8PC0tLS0tLS0tLSBidWZmZXIgc2l6ZSAtLS0tLS0tLS0+fDwtLS0gYGJsb2NrX3NpemVgIC0tPnwgIHwgIHwKLSAqIHwgICAgICAgICAgICB8PC0tLS0tLS0tLS0tIGByYW5nZV9sZW5ndGhgIC8gYnVmZmVyIGNhcGFjaXR5IC0tLS0tLS0tLS0tPnwgIHwKLSAqIHw8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGZpbGVfc2l6ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPnwKLSAqCi0gKiBTcGVjaWFsIHBhcmFtZXRlciB2YWx1ZXM6Ci0gKiAtIHJhbmdlX2xlbmd0aCA9PSAtMSBtZWFucyBlbnRpcmUgZmlsZQotICogLSBibG9ja19zaXplID09IDAgbWVhbnMgZW50aXJlIHJhbmdlCi0gKgotICovCi1zc2l6ZV90IExpdmVTZXNzaW9uOjpmZXRjaEZpbGUoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVybCwgc3A8QUJ1ZmZlcj4gKm91dCwKLSAgICAgICAgaW50NjRfdCByYW5nZV9vZmZzZXQsIGludDY0X3QgcmFuZ2VfbGVuZ3RoLAotICAgICAgICB1aW50MzJfdCBibG9ja19zaXplLCAvKiBkb3dubG9hZCBibG9jayBzaXplICovCi0gICAgICAgIHNwPERhdGFTb3VyY2U+ICpzb3VyY2UsIC8qIHRvIHJldHVybiBhbmQgcmV1c2Ugc291cmNlICovCi0gICAgICAgIFN0cmluZzggKmFjdHVhbFVybCkgewotICAgIG9mZjY0X3Qgc2l6ZTsKLSAgICBzcDxEYXRhU291cmNlPiB0ZW1wX3NvdXJjZTsKLSAgICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgICAgICAgc291cmNlID0gJnRlbXBfc291cmNlOwotICAgIH0KLQotICAgIGlmICgqc291cmNlID09IE5VTEwpIHsKLSAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCh1cmwsICJmaWxlOi8vIiwgNykpIHsKLSAgICAgICAgICAgICpzb3VyY2UgPSBuZXcgRmlsZVNvdXJjZSh1cmwgKyA3KTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJuY2FzZWNtcCh1cmwsICJodHRwOi8vIiwgNykKLSAgICAgICAgICAgICAgICAmJiBzdHJuY2FzZWNtcCh1cmwsICJodHRwczovLyIsIDgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBoZWFkZXJzID0gbUV4dHJhSGVhZGVyczsKLSAgICAgICAgICAgIGlmIChyYW5nZV9vZmZzZXQgPiAwIHx8IHJhbmdlX2xlbmd0aCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgaGVhZGVycy5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCJSYW5nZSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXM9JWxsZC0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VfbGVuZ3RoIDwgMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiIiA6IEFTdHJpbmdQcmludGYoIiVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV9vZmZzZXQgKyByYW5nZV9sZW5ndGggLSAxKS5jX3N0cigpKS5jX3N0cigpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtSFRUUERhdGFTb3VyY2UtPmNvbm5lY3QodXJsLCAmaGVhZGVycyk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAqc291cmNlID0gbUhUVFBEYXRhU291cmNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZ2V0U2l6ZUVyciA9ICgqc291cmNlKS0+Z2V0U2l6ZSgmc2l6ZSk7Ci0gICAgaWYgKGdldFNpemVFcnIgIT0gT0spIHsKLSAgICAgICAgc2l6ZSA9IDY1NTM2OwotICAgIH0KLQotICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICpvdXQgIT0gTlVMTCA/ICpvdXQgOiBuZXcgQUJ1ZmZlcihzaXplKTsKLSAgICBpZiAoKm91dCA9PSBOVUxMKSB7Ci0gICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7Ci0gICAgfQotCi0gICAgc3NpemVfdCBieXRlc1JlYWQgPSAwOwotICAgIC8vIGFkanVzdCByYW5nZV9sZW5ndGggaWYgb25seSByZWFkaW5nIHBhcnRpYWwgYmxvY2sKLSAgICBpZiAoYmxvY2tfc2l6ZSA+IDAgJiYgKHJhbmdlX2xlbmd0aCA9PSAtMSB8fCAoaW50NjRfdCkoYnVmZmVyLT5zaXplKCkgKyBibG9ja19zaXplKSA8IHJhbmdlX2xlbmd0aCkpIHsKLSAgICAgICAgcmFuZ2VfbGVuZ3RoID0gYnVmZmVyLT5zaXplKCkgKyBibG9ja19zaXplOwotICAgIH0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIC8vIE9ubHkgcmVzaXplIHdoZW4gd2UgZG9uJ3Qga25vdyB0aGUgc2l6ZS4KLSAgICAgICAgc2l6ZV90IGJ1ZmZlclJlbWFpbmluZyA9IGJ1ZmZlci0+Y2FwYWNpdHkoKSAtIGJ1ZmZlci0+c2l6ZSgpOwotICAgICAgICBpZiAoYnVmZmVyUmVtYWluaW5nID09IDAgJiYgZ2V0U2l6ZUVyciAhPSBPSykgewotICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckluY3JlbWVudCA9IGJ1ZmZlci0+c2l6ZSgpIC8gMjsKLSAgICAgICAgICAgIGlmIChidWZmZXJJbmNyZW1lbnQgPCAzMjc2OCkgewotICAgICAgICAgICAgICAgIGJ1ZmZlckluY3JlbWVudCA9IDMyNzY4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmZmVyUmVtYWluaW5nID0gYnVmZmVySW5jcmVtZW50OwotCi0gICAgICAgICAgICBBTE9HVigiaW5jcmVhc2luZyBkb3dubG9hZCBidWZmZXIgdG8gJXp1IGJ5dGVzIiwKLSAgICAgICAgICAgICAgICAgYnVmZmVyLT5zaXplKCkgKyBidWZmZXJSZW1haW5pbmcpOwotCi0gICAgICAgICAgICBzcDxBQnVmZmVyPiBjb3B5ID0gbmV3IEFCdWZmZXIoYnVmZmVyLT5zaXplKCkgKyBidWZmZXJSZW1haW5pbmcpOwotICAgICAgICAgICAgbWVtY3B5KGNvcHktPmRhdGEoKSwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgICAgIGNvcHktPnNldFJhbmdlKDAsIGJ1ZmZlci0+c2l6ZSgpKTsKLQotICAgICAgICAgICAgYnVmZmVyID0gY29weTsKLSAgICAgICAgfQotCi0gICAgICAgIHNpemVfdCBtYXhCeXRlc1RvUmVhZCA9IGJ1ZmZlclJlbWFpbmluZzsKLSAgICAgICAgaWYgKHJhbmdlX2xlbmd0aCA+PSAwKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IGJ5dGVzTGVmdEluUmFuZ2UgPSByYW5nZV9sZW5ndGggLSBidWZmZXItPnNpemUoKTsKLSAgICAgICAgICAgIGlmIChieXRlc0xlZnRJblJhbmdlIDwgKGludDY0X3QpbWF4Qnl0ZXNUb1JlYWQpIHsKLSAgICAgICAgICAgICAgICBtYXhCeXRlc1RvUmVhZCA9IGJ5dGVzTGVmdEluUmFuZ2U7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYnl0ZXNMZWZ0SW5SYW5nZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoZSBEYXRhU291cmNlIGlzIHJlc3BvbnNpYmxlIGZvciBpbmZvcm1pbmcgdXMgb2YgZXJyb3IgKG4gPCAwKSBvciBlb2YgKG4gPT0gMCkKLSAgICAgICAgLy8gdG8gaGVscCB1cyBicmVhayBvdXQgb2YgdGhlIGxvb3AuCi0gICAgICAgIHNzaXplX3QgbiA9ICgqc291cmNlKS0+cmVhZEF0KAotICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2l6ZSgpLCBidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+c2l6ZSgpLAotICAgICAgICAgICAgICAgIG1heEJ5dGVzVG9SZWFkKTsKLQotICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIGJ1ZmZlci0+c2l6ZSgpICsgKHNpemVfdCluKTsKLSAgICAgICAgYnl0ZXNSZWFkICs9IG47Ci0gICAgfQotCi0gICAgKm91dCA9IGJ1ZmZlcjsKLSAgICBpZiAoYWN0dWFsVXJsICE9IE5VTEwpIHsKLSAgICAgICAgKmFjdHVhbFVybCA9ICgqc291cmNlKS0+Z2V0VXJpKCk7Ci0gICAgICAgIGlmIChhY3R1YWxVcmwtPmlzRW1wdHkoKSkgewotICAgICAgICAgICAgKmFjdHVhbFVybCA9IHVybDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBieXRlc1JlYWQ7Ci19Ci0KLXNwPE0zVVBhcnNlcj4gTGl2ZVNlc3Npb246OmZldGNoUGxheWxpc3QoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVybCwgdWludDhfdCAqY3VyUGxheWxpc3RIYXNoLCBib29sICp1bmNoYW5nZWQpIHsKLSAgICBBTE9HVigiZmV0Y2hQbGF5bGlzdCAnJXMnIiwgdXJsKTsKLQotICAgICp1bmNoYW5nZWQgPSBmYWxzZTsKLQotICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKLSAgICBTdHJpbmc4IGFjdHVhbFVybDsKLSAgICBzc2l6ZV90ICBlcnIgPSBmZXRjaEZpbGUodXJsLCAmYnVmZmVyLCAwLCAtMSwgMCwgTlVMTCwgJmFjdHVhbFVybCk7Ci0KLSAgICBpZiAoZXJyIDw9IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgLy8gTUQ1IGZ1bmN0aW9uYWxpdHkgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgc2ltdWxhdG9yLCB0cmVhdCBhbGwKLSAgICAvLyBwbGF5bGlzdHMgYXMgY2hhbmdlZC4KLQotI2lmIGRlZmluZWQoSEFWRV9BTkRST0lEX09TKQotICAgIHVpbnQ4X3QgaGFzaFsxNl07Ci0KLSAgICBNRDVfQ1RYIG07Ci0gICAgTUQ1X0luaXQoJm0pOwotICAgIE1ENV9VcGRhdGUoJm0sIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7Ci0KLSAgICBNRDVfRmluYWwoaGFzaCwgJm0pOwotCi0gICAgaWYgKGN1clBsYXlsaXN0SGFzaCAhPSBOVUxMICYmICFtZW1jbXAoaGFzaCwgY3VyUGxheWxpc3RIYXNoLCAxNikpIHsKLSAgICAgICAgLy8gcGxheWxpc3QgdW5jaGFuZ2VkCi0gICAgICAgICp1bmNoYW5nZWQgPSB0cnVlOwotCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmIChjdXJQbGF5bGlzdEhhc2ggIT0gTlVMTCkgewotICAgICAgICBtZW1jcHkoY3VyUGxheWxpc3RIYXNoLCBoYXNoLCBzaXplb2YoaGFzaCkpOwotICAgIH0KLSNlbmRpZgotCi0gICAgc3A8TTNVUGFyc2VyPiBwbGF5bGlzdCA9Ci0gICAgICAgIG5ldyBNM1VQYXJzZXIoYWN0dWFsVXJsLnN0cmluZygpLCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwotCi0gICAgaWYgKHBsYXlsaXN0LT5pbml0Q2hlY2soKSAhPSBPSykgewotICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHBhcnNlIC5tM3U4IHBsYXlsaXN0Iik7Ci0KLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIHBsYXlsaXN0OwotfQotCiAjaWYgMAogc3RhdGljIGRvdWJsZSB1bmlmb3JtUmFuZCgpIHsKICAgICByZXR1cm4gKGRvdWJsZSlyYW5kKCkgLyBSQU5EX01BWDsKIH0KICNlbmRpZgogCi1zaXplX3QgTGl2ZVNlc3Npb246OmdldEJhbmR3aWR0aEluZGV4KCkgewotICAgIGlmIChtQmFuZHdpZHRoSXRlbXMuc2l6ZSgpID09IDApIHsKK2Jvb2wgTGl2ZVNlc3Npb246OlVyaUlzU2FtZUFzSW5kZXgoY29uc3QgQVN0cmluZyAmdXJpLCBpbnQzMl90IGksIGJvb2wgbmV3VXJpKSB7CisgICAgQUxPR0koIlt0aW1lZF9pZDNdIGkgJWQgVXJpSXNTYW1lQXNJbmRleCBuZXdVcmkgJXMsICVzIiwgaSwKKyAgICAgICAgICAgIG5ld1VyaSA/ICJ0cnVlIiA6ICJmYWxzZSIsCisgICAgICAgICAgICBuZXdVcmkgPyBtU3RyZWFtc1tpXS5tTmV3VXJpLmNfc3RyKCkgOiBtU3RyZWFtc1tpXS5tVXJpLmNfc3RyKCkpOworICAgIHJldHVybiBpID49IDAKKyAgICAgICAgICAgICYmICgoIW5ld1VyaSAmJiB1cmkgPT0gbVN0cmVhbXNbaV0ubVVyaSkKKyAgICAgICAgICAgIHx8IChuZXdVcmkgJiYgdXJpID09IG1TdHJlYW1zW2ldLm1OZXdVcmkpKTsKK30KKworc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gTGl2ZVNlc3Npb246OmdldFBhY2tldFNvdXJjZUZvclN0cmVhbUluZGV4KAorICAgICAgICBzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBuZXdVcmkpIHsKKyAgICBTdHJlYW1UeXBlIHR5cGUgPSBpbmRleFRvVHlwZSh0cmFja0luZGV4KTsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPSBOVUxMOworICAgIGlmIChuZXdVcmkpIHsKKyAgICAgICAgc291cmNlID0gbVBhY2tldFNvdXJjZXMyLnZhbHVlRm9yKHR5cGUpOworICAgICAgICBzb3VyY2UtPmNsZWFyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc291cmNlID0gbVBhY2tldFNvdXJjZXMudmFsdWVGb3IodHlwZSk7CisgICAgfTsKKyAgICByZXR1cm4gc291cmNlOworfQorCitzcDxBbm90aGVyUGFja2V0U291cmNlPiBMaXZlU2Vzc2lvbjo6Z2V0TWV0YWRhdGFTb3VyY2UoCisgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZXNba051bVNvdXJjZXNdLCB1aW50MzJfdCBzdHJlYW1NYXNrLCBib29sIG5ld1VyaSkgeworICAgIC8vIHRvZG86IE9uZSBjYXNlIHdoZXJlIHRoZSBmb2xsb3dpbmcgc3RyYXRlZ3kgY2FuIGZhaWwgaXMgd2hlbiBhdWRpbyBhbmQgdmlkZW8KKyAgICAvLyBhcmUgaW4gc2VwYXJhdGUgcGxheWxpc3RzLCBib3RoIGFyZSB0cmFuc3BvcnQgc3RyZWFtcywgYW5kIHRoZSBtZXRhZGF0YQorICAgIC8vIGlzIGFjdHVhbGx5IGNvbnRhaW5lZCBpbiB0aGUgYXVkaW8gc3RyZWFtLgorICAgIEFMT0dWKCJbdGltZWRfaWQzXSBnZXRNZXRhZGF0YVNvdXJjZUZvclVyaSBzdHJlYW1NYXNrICV4IG5ld1VyaSAlcyIsCisgICAgICAgICAgICBzdHJlYW1NYXNrLCBuZXdVcmkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKworICAgIGlmICgoc291cmNlc1trVmlkZW9JbmRleF0gIT0gTlVMTCkgLy8gdmlkZW8gZmV0Y2hlcjsgb3IgLi4uCisgICAgICAgICAgICB8fCAoIShzdHJlYW1NYXNrICYgU1RSRUFNVFlQRV9WSURFTykgJiYgc291cmNlc1trQXVkaW9JbmRleF0gIT0gTlVMTCkpIHsKKyAgICAgICAgICAgIC8vIC4uLiBhdWRpbyBmZXRjaGVyIGZvciBhdWRpbyBvbmx5IHZhcmlhbnQKKyAgICAgICAgcmV0dXJuIGdldFBhY2tldFNvdXJjZUZvclN0cmVhbUluZGV4KGtNZXRhRGF0YUluZGV4LCBuZXdVcmkpOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitib29sIExpdmVTZXNzaW9uOjpyZXN1bWVGZXRjaGVyKAorICAgICAgICBjb25zdCBBU3RyaW5nICZ1cmksIHVpbnQzMl90IHN0cmVhbU1hc2ssIGludDY0X3QgdGltZVVzLCBib29sIG5ld1VyaSkgeworICAgIHNzaXplX3QgaW5kZXggPSBtRmV0Y2hlckluZm9zLmluZGV4T2ZLZXkodXJpKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dFKCJkaWQgbm90IGZpbmQgZmV0Y2hlciBmb3IgdXJpOiAlcyIsIHVyaS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgcmVzdW1lID0gZmFsc2U7CisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlc1trTnVtU291cmNlc107CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7CisgICAgICAgIGlmICgoc3RyZWFtTWFzayAmIGluZGV4VG9UeXBlKGkpKSAmJiBVcmlJc1NhbWVBc0luZGV4KHVyaSwgaSwgbmV3VXJpKSkgeworICAgICAgICAgICAgcmVzdW1lID0gdHJ1ZTsKKyAgICAgICAgICAgIHNvdXJjZXNbaV0gPSBnZXRQYWNrZXRTb3VyY2VGb3JTdHJlYW1JbmRleChpLCBuZXdVcmkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJlc3VtZSkgeworICAgICAgICBzcDxQbGF5bGlzdEZldGNoZXI+ICZmZXRjaGVyID0gbUZldGNoZXJJbmZvcy5lZGl0VmFsdWVBdChpbmRleCkubUZldGNoZXI7CisgICAgICAgIFNlZWtNb2RlIHNlZWtNb2RlID0gbmV3VXJpID8ga1NlZWtNb2RlTmV4dFNhbXBsZSA6IGtTZWVrTW9kZUV4YWN0UG9zaXRpb247CisKKyAgICAgICAgQUxPR1YoInJlc3VtaW5nIGZldGNoZXItJWQsIHRpbWVVcz0lbGxkLCBzZWVrTW9kZT0lZCIsCisgICAgICAgICAgICAgICAgZmV0Y2hlci0+Z2V0RmV0Y2hlcklEKCksIChsb25nIGxvbmcpdGltZVVzLCBzZWVrTW9kZSk7CisKKyAgICAgICAgZmV0Y2hlci0+c3RhcnRBc3luYygKKyAgICAgICAgICAgICAgICBzb3VyY2VzW2tBdWRpb0luZGV4XSwKKyAgICAgICAgICAgICAgICBzb3VyY2VzW2tWaWRlb0luZGV4XSwKKyAgICAgICAgICAgICAgICBzb3VyY2VzW2tTdWJ0aXRsZUluZGV4XSwKKyAgICAgICAgICAgICAgICBnZXRNZXRhZGF0YVNvdXJjZShzb3VyY2VzLCBzdHJlYW1NYXNrLCBuZXdVcmkpLAorICAgICAgICAgICAgICAgIHRpbWVVcywgLTEsIC0xLCBzZWVrTW9kZSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VtZTsKK30KKworZmxvYXQgTGl2ZVNlc3Npb246OmdldEFib3J0VGhyZXNob2xkKAorICAgICAgICBzc2l6ZV90IGN1cnJlbnRCV0luZGV4LCBzc2l6ZV90IHRhcmdldEJXSW5kZXgpIGNvbnN0IHsKKyAgICBmbG9hdCBhYm9ydFRocmVzaG9sZCA9IC0xLjBmOworICAgIGlmIChjdXJyZW50QldJbmRleCA+IDAgJiYgdGFyZ2V0QldJbmRleCA8IGN1cnJlbnRCV0luZGV4KSB7CisgICAgICAgIC8qCisgICAgICAgICAgIElmIHdlJ3JlIHN3aXRjaGluZyBkb3duLCB3ZSBuZWVkIHRvIGRlY2lkZSB3aGV0aGVyIHRvCisKKyAgICAgICAgICAgMSkgZmluaXNoIGxhc3Qgc2VnbWVudCBvZiBoaWdoLWJhbmR3aWR0aCB2YXJpYW50LCBvcgorICAgICAgICAgICAyKSBhYm9ydCBsYXN0IHNlZ21lbnQgb2YgaGlnaC1iYW5kd2lkdGggdmFyaWFudCwgYW5kIGZldGNoIGFuCisgICAgICAgICAgICAgIG92ZXJsYXBwaW5nIHBvcnRpb24gZnJvbSBsb3ctYmFuZHdpZHRoIHZhcmlhbnQuCisKKyAgICAgICAgICAgSGVyZSB3ZSB0cnkgdG8gbWF4aW1pemUgdGhlIGFtb3VudCBvZiBidWZmZXIgbGVmdCB3aGVuIHRoZQorICAgICAgICAgICBzd2l0Y2ggcG9pbnQgaXMgbWV0LiBHaXZlbiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisKKyAgICAgICAgICAgQjogb3VyIGN1cnJlbnQgYnVmZmVyaW5nIGxldmVsIGluIHNlY29uZHMKKyAgICAgICAgICAgVDogdGFyZ2V0IGR1cmF0aW9uIGluIHNlY29uZHMKKyAgICAgICAgICAgWDogc2FtcGxlIGR1cmF0aW9uIGluIHNlY29uZHMgcmVtYWluIHRvIGZldGNoIGluIGxhc3Qgc2VnbWVudAorICAgICAgICAgICBidzA6IGJhbmR3aWR0aCBvZiBvbGQgdmFyaWFudCAoYXMgc3BlY2lmaWVkIGluIHBsYXlsaXN0KQorICAgICAgICAgICBidzE6IGJhbmR3aWR0aCBvZiBuZXcgdmFyaWFudCAoYXMgc3BlY2lmaWVkIGluIHBsYXlsaXN0KQorICAgICAgICAgICBidzogbWVhc3VyZWQgYmFuZHdpZHRoIGF2YWlsYWJsZQorCisgICAgICAgICAgIElmIHdlIGNob29zZSAxKSwgd2hlbiBzd2l0Y2ggaGFwcGVucyBhdCB0aGUgZW5kIG9mIGN1cnJlbnQKKyAgICAgICAgICAgc2VnbWVudCwgb3VyIGJ1ZmZlcmluZyB3aWxsIGJlCisgICAgICAgICAgICAgICAgICBCICsgWCAtIFggKiBidzAgLyBidworCisgICAgICAgICAgIElmIHdlIGNob29zZSAyKSwgd2hlbiBzd2l0Y2ggaGFwcGVucyB3aGVyZSB3ZSBhYm9ydGVkIGN1cnJlbnQKKyAgICAgICAgICAgc2VnbWVudCwgb3VyIGJ1ZmZlcmluZyB3aWxsIGJlCisgICAgICAgICAgICAgICAgICBCIC0gKFQgLSBYKSAqIGJ3MSAvIGJ3CisKKyAgICAgICAgICAgV2Ugc2hvdWxkIG9ubHkgY2hvb3NlIDEpIGlmCisgICAgICAgICAgICAgICAgICBYL1QgPCBidzEgLyAoYncxICsgYncwIC0gYncpCisgICAgICAgICovCisKKyAgICAgICAgLy8gYWJvcnQgb2xkIGJhbmR3aWR0aCBpbW1lZGlhdGVseSBpZiBiYW5kd2lkdGggaXMgZmx1Y3R1YXRpbmcgYSBsb3QuCisgICAgICAgIC8vIG91ciBlc3RpbWF0ZSBjb3VsZCBiZSBmYXIgb2ZmLCBhbmQgZmV0Y2hpbmcgb2xkIGJhbmR3aWR0aCBjb3VsZAorICAgICAgICAvLyB0YWtlIHRvbyBsb25nLgorICAgICAgICBpZiAoIW1MYXN0QmFuZHdpZHRoU3RhYmxlKSB7CisgICAgICAgICAgICByZXR1cm4gMC4wZjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRha2luZyB0aGUgbWVhc3VyZWQgY3VycmVudCBiYW5kd2lkdGggYXQgNTAlIGZhY2UgdmFsdWUgb25seSwKKyAgICAgICAgLy8gYXMgb3VyIGJhbmR3aWR0aCBlc3RpbWF0aW9uIGlzIGEgbGFnZ2luZyBpbmRpY2F0b3IuIEJlaW5nCisgICAgICAgIC8vIGNvbnNlcnZhdGl2ZSBvbiB0aGlzLCB3ZSBwcmVmZXIgc3dpdGNoaW5nIHRvIGxvd2VyIGJhbmR3aWR0aAorICAgICAgICAvLyB1bmxlc3Mgd2UncmUgcmVhbGx5IGNvbmZpZGVudCBmaW5pc2hpbmcgdXAgdGhlIGxhc3Qgc2VnbWVudAorICAgICAgICAvLyBvZiBoaWdoZXIgYmFuZHdpZHRoIHdpbGwgYmUgZmFzdC4KKyAgICAgICAgQ0hFQ0sobUxhc3RCYW5kd2lkdGhCcHMgPj0gMCk7CisgICAgICAgIGFib3J0VGhyZXNob2xkID0KKyAgICAgICAgICAgICAgICAoZmxvYXQpbUJhbmR3aWR0aEl0ZW1zLml0ZW1BdCh0YXJnZXRCV0luZGV4KS5tQmFuZHdpZHRoCisgICAgICAgICAgICAgLyAoKGZsb2F0KW1CYW5kd2lkdGhJdGVtcy5pdGVtQXQodGFyZ2V0QldJbmRleCkubUJhbmR3aWR0aAorICAgICAgICAgICAgICArIChmbG9hdCltQmFuZHdpZHRoSXRlbXMuaXRlbUF0KGN1cnJlbnRCV0luZGV4KS5tQmFuZHdpZHRoCisgICAgICAgICAgICAgIC0gKGZsb2F0KW1MYXN0QmFuZHdpZHRoQnBzICogMC41Zik7CisgICAgICAgIGlmIChhYm9ydFRocmVzaG9sZCA8IDAuMGYpIHsKKyAgICAgICAgICAgIGFib3J0VGhyZXNob2xkID0gLTEuMGY7IC8vIGRvIG5vdCBhYm9ydAorICAgICAgICB9CisgICAgICAgIEFMT0dWKCJTd2l0Y2hpbmcgRG93bjogYnBzICVsZCA9PiAlbGQsIG1lYXN1cmVkICVkLCBhYm9ydCByYXRpbyAlLjJmIiwKKyAgICAgICAgICAgICAgICBtQmFuZHdpZHRoSXRlbXMuaXRlbUF0KGN1cnJlbnRCV0luZGV4KS5tQmFuZHdpZHRoLAorICAgICAgICAgICAgICAgIG1CYW5kd2lkdGhJdGVtcy5pdGVtQXQodGFyZ2V0QldJbmRleCkubUJhbmR3aWR0aCwKKyAgICAgICAgICAgICAgICBtTGFzdEJhbmR3aWR0aEJwcywKKyAgICAgICAgICAgICAgICBhYm9ydFRocmVzaG9sZCk7CisgICAgfQorICAgIHJldHVybiBhYm9ydFRocmVzaG9sZDsKK30KKwordm9pZCBMaXZlU2Vzc2lvbjo6YWRkQmFuZHdpZHRoTWVhc3VyZW1lbnQoc2l6ZV90IG51bUJ5dGVzLCBpbnQ2NF90IGRlbGF5VXMpIHsKKyAgICBtQmFuZHdpZHRoRXN0aW1hdG9yLT5hZGRCYW5kd2lkdGhNZWFzdXJlbWVudChudW1CeXRlcywgZGVsYXlVcyk7Cit9CisKK3NzaXplX3QgTGl2ZVNlc3Npb246OmdldExvd2VzdFZhbGlkQmFuZHdpZHRoSW5kZXgoKSBjb25zdCB7CisgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IG1CYW5kd2lkdGhJdGVtcy5zaXplKCk7IGluZGV4KyspIHsKKyAgICAgICAgaWYgKGlzQmFuZHdpZHRoVmFsaWQobUJhbmR3aWR0aEl0ZW1zW2luZGV4XSkpIHsKKyAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBpZiBwbGF5bGlzdHMgYXJlIGFsbCBibGFja2xpc3RlZCwgcmV0dXJuIDAgYW5kIGhvcGUgaXQncyBhbGl2ZQorICAgIHJldHVybiAwOworfQorCitzaXplX3QgTGl2ZVNlc3Npb246OmdldEJhbmR3aWR0aEluZGV4KGludDMyX3QgYmFuZHdpZHRoQnBzKSB7CisgICAgaWYgKG1CYW5kd2lkdGhJdGVtcy5zaXplKCkgPCAyKSB7CisgICAgICAgIC8vIHNob3VsZG4ndCBiZSBoZXJlIGlmIHdlIG9ubHkgaGF2ZSAxIGJhbmR3aWR0aCwgY2hlY2sKKyAgICAgICAgLy8gbG9naWMgdG8gZ2V0IHJpZCBvZiByZWR1bmRhbnQgYmFuZHdpZHRoIHBvbGxpbmcKKyAgICAgICAgQUxPR1coImdldEJhbmR3aWR0aEluZGV4KCkgY2FsbGVkIGZvciBzaW5nbGUgYmFuZHdpZHRoIHBsYXlsaXN0ISIpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKQEAgLTEwMTQsMTUgKzEzNDcsNiBAQAogICAgIH0KIAogICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgaW50MzJfdCBiYW5kd2lkdGhCcHM7Ci0gICAgICAgIGlmIChtSFRUUERhdGFTb3VyY2UgIT0gTlVMTAotICAgICAgICAgICAgICAgICYmIG1IVFRQRGF0YVNvdXJjZS0+ZXN0aW1hdGVCYW5kd2lkdGgoJmJhbmR3aWR0aEJwcykpIHsKLSAgICAgICAgICAgIEFMT0dWKCJiYW5kd2lkdGggZXN0aW1hdGVkIGF0ICUuMmYga2JwcyIsIGJhbmR3aWR0aEJwcyAvIDEwMjQuMGYpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1YoIm5vIGJhbmR3aWR0aCBlc3RpbWF0ZS4iKTsKLSAgICAgICAgICAgIHJldHVybiAwOyAgLy8gUGljayB0aGUgbG93ZXN0IGJhbmR3aWR0aCBzdHJlYW0gYnkgZGVmYXVsdC4KLSAgICAgICAgfQotCiAgICAgICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKICAgICAgICAgaWYgKHByb3BlcnR5X2dldCgibWVkaWEuaHR0cGxpdmUubWF4LWJ3IiwgdmFsdWUsIE5VTEwpKSB7CiAgICAgICAgICAgICBjaGFyICplbmQ7CkBAIC0xMDM1LDIwICsxMzU5LDE4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLyBQaWNrIHRoZSBoaWdoZXN0IGJhbmR3aWR0aCBzdHJlYW0gYmVsb3cgb3IgZXF1YWwgdG8gZXN0aW1hdGVkIGJhbmR3aWR0aC4KKyAgICAgICAgLy8gUGljayB0aGUgaGlnaGVzdCBiYW5kd2lkdGggc3RyZWFtIHRoYXQncyBub3QgY3VycmVudGx5IGJsYWNrbGlzdGVkCisgICAgICAgIC8vIGJlbG93IG9yIGVxdWFsIHRvIGVzdGltYXRlZCBiYW5kd2lkdGguCiAKICAgICAgICAgaW5kZXggPSBtQmFuZHdpZHRoSXRlbXMuc2l6ZSgpIC0gMTsKLSAgICAgICAgd2hpbGUgKGluZGV4ID4gMCkgewotICAgICAgICAgICAgLy8gY29uc2lkZXIgb25seSA4MCUgb2YgdGhlIGF2YWlsYWJsZSBiYW5kd2lkdGgsIGJ1dCBpZiB3ZSBhcmUgc3dpdGNoaW5nIHVwLAotICAgICAgICAgICAgLy8gYmUgZXZlbiBtb3JlIGNvbnNlcnZhdGl2ZSAoNzAlKSB0byBhdm9pZCBvdmVyZXN0aW1hdGluZyBhbmQgaW1tZWRpYXRlbHkKLSAgICAgICAgICAgIC8vIHN3aXRjaGluZyBiYWNrLgotICAgICAgICAgICAgc2l6ZV90IGFkanVzdGVkQmFuZHdpZHRoQnBzID0gYmFuZHdpZHRoQnBzOwotICAgICAgICAgICAgaWYgKGluZGV4ID4gbUN1ckJhbmR3aWR0aEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgYWRqdXN0ZWRCYW5kd2lkdGhCcHMgPSBhZGp1c3RlZEJhbmR3aWR0aEJwcyAqIDcgLyAxMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWRqdXN0ZWRCYW5kd2lkdGhCcHMgPSBhZGp1c3RlZEJhbmR3aWR0aEJwcyAqIDggLyAxMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQmFuZHdpZHRoSXRlbXMuaXRlbUF0KGluZGV4KS5tQmFuZHdpZHRoIDw9IGFkanVzdGVkQmFuZHdpZHRoQnBzKSB7CisgICAgICAgIHNzaXplX3QgbG93ZXN0QmFuZHdpZHRoID0gZ2V0TG93ZXN0VmFsaWRCYW5kd2lkdGhJbmRleCgpOworICAgICAgICB3aGlsZSAoaW5kZXggPiBsb3dlc3RCYW5kd2lkdGgpIHsKKyAgICAgICAgICAgIC8vIGJlIGNvbnNlcnZhdGl2ZSAoNzAlKSB0byBhdm9pZCBvdmVyZXN0aW1hdGluZyBhbmQgaW1tZWRpYXRlbHkKKyAgICAgICAgICAgIC8vIHN3aXRjaGluZyBkb3duIGFnYWluLgorICAgICAgICAgICAgc2l6ZV90IGFkanVzdGVkQmFuZHdpZHRoQnBzID0gYmFuZHdpZHRoQnBzICogNyAvIDEwOworICAgICAgICAgICAgY29uc3QgQmFuZHdpZHRoSXRlbSAmaXRlbSA9IG1CYW5kd2lkdGhJdGVtc1tpbmRleF07CisgICAgICAgICAgICBpZiAoaXRlbS5tQmFuZHdpZHRoIDw9IGFkanVzdGVkQmFuZHdpZHRoQnBzCisgICAgICAgICAgICAgICAgICAgICYmIGlzQmFuZHdpZHRoVmFsaWQoaXRlbSkpIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC0taW5kZXg7CkBAIC0xMTA3LDM0ICsxNDI5LDIwIEBACiAgICAgcmV0dXJuIGluZGV4OwogfQogCi1pbnQ2NF90IExpdmVTZXNzaW9uOjpsYXRlc3RNZWRpYVNlZ21lbnRTdGFydFRpbWVVcygpIHsKLSAgICBzcDxBTWVzc2FnZT4gYXVkaW9NZXRhID0gbVBhY2tldFNvdXJjZXMudmFsdWVGb3IoU1RSRUFNVFlQRV9BVURJTyktPmdldExhdGVzdERlcXVldWVkTWV0YSgpOwotICAgIGludDY0X3QgbWluU2VnbWVudFN0YXJ0VGltZVVzID0gLTEsIHZpZGVvU2VnbWVudFN0YXJ0VGltZVVzID0gLTE7Ci0gICAgaWYgKGF1ZGlvTWV0YSAhPSBOVUxMKSB7Ci0gICAgICAgIGF1ZGlvTWV0YS0+ZmluZEludDY0KCJzZWdtZW50U3RhcnRUaW1lVXMiLCAmbWluU2VnbWVudFN0YXJ0VGltZVVzKTsKLSAgICB9CitITFNUaW1lIExpdmVTZXNzaW9uOjpsYXRlc3RNZWRpYVNlZ21lbnRTdGFydFRpbWUoKSBjb25zdCB7CisgICAgSExTVGltZSBhdWRpb1RpbWUobVBhY2tldFNvdXJjZXMudmFsdWVGb3IoCisgICAgICAgICAgICAgICAgICAgIFNUUkVBTVRZUEVfQVVESU8pLT5nZXRMYXRlc3REZXF1ZXVlZE1ldGEoKSk7CiAKLSAgICBzcDxBTWVzc2FnZT4gdmlkZW9NZXRhID0gbVBhY2tldFNvdXJjZXMudmFsdWVGb3IoU1RSRUFNVFlQRV9WSURFTyktPmdldExhdGVzdERlcXVldWVkTWV0YSgpOwotICAgIGlmICh2aWRlb01ldGEgIT0gTlVMTAotICAgICAgICAgICAgJiYgdmlkZW9NZXRhLT5maW5kSW50NjQoInNlZ21lbnRTdGFydFRpbWVVcyIsICZ2aWRlb1NlZ21lbnRTdGFydFRpbWVVcykpIHsKLSAgICAgICAgaWYgKG1pblNlZ21lbnRTdGFydFRpbWVVcyA8IDAgfHwgdmlkZW9TZWdtZW50U3RhcnRUaW1lVXMgPCBtaW5TZWdtZW50U3RhcnRUaW1lVXMpIHsKLSAgICAgICAgICAgIG1pblNlZ21lbnRTdGFydFRpbWVVcyA9IHZpZGVvU2VnbWVudFN0YXJ0VGltZVVzOwotICAgICAgICB9CisgICAgSExTVGltZSB2aWRlb1RpbWUobVBhY2tldFNvdXJjZXMudmFsdWVGb3IoCisgICAgICAgICAgICAgICAgICAgIFNUUkVBTVRZUEVfVklERU8pLT5nZXRMYXRlc3REZXF1ZXVlZE1ldGEoKSk7CiAKLSAgICB9Ci0gICAgcmV0dXJuIG1pblNlZ21lbnRTdGFydFRpbWVVczsKKyAgICByZXR1cm4gYXVkaW9UaW1lIDwgdmlkZW9UaW1lID8gdmlkZW9UaW1lIDogYXVkaW9UaW1lOwogfQogCi1zdGF0dXNfdCBMaXZlU2Vzc2lvbjo6b25TZWVrKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Cit2b2lkIExpdmVTZXNzaW9uOjpvblNlZWsoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBpbnQ2NF90IHRpbWVVczsKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwotCi0gICAgaWYgKCFtUmVjb25maWd1cmF0aW9uSW5Qcm9ncmVzcykgewotICAgICAgICBjaGFuZ2VDb25maWd1cmF0aW9uKHRpbWVVcywgbUN1ckJhbmR3aWR0aEluZGV4KTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7Ci0gICAgfQorICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24odGltZVVzKTsKIH0KIAogc3RhdHVzX3QgTGl2ZVNlc3Npb246OmdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpIGNvbnN0IHsKQEAgLTExNjUsNyArMTQ3Myw3IEBACiAgICAgaWYgKG1QbGF5bGlzdCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtUGxheWxpc3QtPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgcmV0dXJuIG1QbGF5bGlzdC0+Z2V0VHJhY2tDb3VudCgpICsgKG1IYXNNZXRhZGF0YSA/IDEgOiAwKTsKICAgICB9CiB9CiAKQEAgLTExNzMsNiArMTQ4MSwxMyBAQAogICAgIGlmIChtUGxheWxpc3QgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9IGVsc2UgeworICAgICAgICBpZiAodHJhY2tJbmRleCA9PSBtUGxheWxpc3QtPmdldFRyYWNrQ291bnQoKSAmJiBtSGFzTWV0YWRhdGEpIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInR5cGUiLCBNRURJQV9UUkFDS19UWVBFX01FVEFEQVRBKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJsYW5ndWFnZSIsICJ1bmQiKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfREFUQV9USU1FRF9JRDMpOworICAgICAgICAgICAgcmV0dXJuIGZvcm1hdDsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gbVBsYXlsaXN0LT5nZXRUcmFja0luZm8odHJhY2tJbmRleCk7CiAgICAgfQogfQpAQCAtMTE4MiwxMSArMTQ5NywxMyBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCisgICAgQUxPR1YoInNlbGVjdFRyYWNrOiBpbmRleD0lenUsIHNlbGVjdD0lZCwgbVN1YnRpdGxlR2VuPSVkKysiLAorICAgICAgICAgICAgaW5kZXgsIHNlbGVjdCwgbVN1YnRpdGxlR2VuZXJhdGlvbik7CisKICAgICArK21TdWJ0aXRsZUdlbmVyYXRpb247CiAgICAgc3RhdHVzX3QgZXJyID0gbVBsYXlsaXN0LT5zZWxlY3RUcmFjayhpbmRleCwgc2VsZWN0KTsKICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDaGFuZ2VDb25maWd1cmF0aW9uLCBpZCgpKTsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigiYmFuZHdpZHRoSW5kZXgiLCBtQ3VyQmFuZHdpZHRoSW5kZXgpOworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2hhbmdlQ29uZmlndXJhdGlvbiwgdGhpcyk7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoInBpY2tUcmFjayIsIHNlbGVjdCk7CiAgICAgICAgIG1zZy0+cG9zdCgpOwogICAgIH0KQEAgLTEyMDEsMzUgKzE1MTgsMjUgQEAKICAgICB9CiB9CiAKLWJvb2wgTGl2ZVNlc3Npb246OmNhblN3aXRjaFVwKCkgewotICAgIC8vIEFsbG93IHVwd2FyZHMgYmFuZHdpZHRoIHN3aXRjaCB3aGVuIGEgc3RyZWFtIGhhcyBidWZmZXJlZCBhdCBsZWFzdCAxMCBzZWNvbmRzLgotICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBhY2tldFNvdXJjZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlID0gbVBhY2tldFNvdXJjZXMudmFsdWVBdChpKTsKLSAgICAgICAgaW50NjRfdCBkdXIgPSBzb3VyY2UtPmdldEJ1ZmZlcmVkRHVyYXRpb25VcygmZXJyKTsKLSAgICAgICAgaWYgKGVyciA9PSBPSyAmJiBkdXIgPiAxMDAwMDAwMCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCiB2b2lkIExpdmVTZXNzaW9uOjpjaGFuZ2VDb25maWd1cmF0aW9uKAotICAgICAgICBpbnQ2NF90IHRpbWVVcywgc2l6ZV90IGJhbmR3aWR0aEluZGV4LCBib29sIHBpY2tUcmFjaykgewotICAgIC8vIFByb3RlY3QgbVBhY2tldFNvdXJjZXMgZnJvbSBhIHN3YXBQYWNrZXRTb3VyY2UgcmFjZSBjb25kaXRpb24gdGhyb3VnaCByZWNvbmZpZ3VyYXRpb24uCi0gICAgLy8gKGNoYW5nZUNvbmZpZ3VyYXRpb24sIG9uQ2hhbmdlQ29uZmlndXJhdGlvbjIsIG9uQ2hhbmdlQ29uZmlndXJhdGlvbjMpLgorICAgICAgICBpbnQ2NF90IHRpbWVVcywgc3NpemVfdCBiYW5kd2lkdGhJbmRleCwgYm9vbCBwaWNrVHJhY2spIHsKKyAgICBBTE9HVigiY2hhbmdlQ29uZmlndXJhdGlvbjogdGltZVVzPSVsbGQgdXMsIGJ3SW5kZXg9JXpkLCBwaWNrVHJhY2s9JWQiLAorICAgICAgICAgIChsb25nIGxvbmcpdGltZVVzLCBiYW5kd2lkdGhJbmRleCwgcGlja1RyYWNrKTsKKwogICAgIGNhbmNlbEJhbmR3aWR0aFN3aXRjaCgpOwogCiAgICAgQ0hFQ0soIW1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzKTsKICAgICBtUmVjb25maWd1cmF0aW9uSW5Qcm9ncmVzcyA9IHRydWU7Ci0KLSAgICBtQ3VyQmFuZHdpZHRoSW5kZXggPSBiYW5kd2lkdGhJbmRleDsKLQotICAgIEFMT0dWKCJjaGFuZ2VDb25maWd1cmF0aW9uID0+IHRpbWVVczolIiBQUklkNjQgIiB1cywgYndJbmRleDolenUsIHBpY2tUcmFjazolZCIsCi0gICAgICAgICAgdGltZVVzLCBiYW5kd2lkdGhJbmRleCwgcGlja1RyYWNrKTsKLQotICAgIENIRUNLX0xUKGJhbmR3aWR0aEluZGV4LCBtQmFuZHdpZHRoSXRlbXMuc2l6ZSgpKTsKLSAgICBjb25zdCBCYW5kd2lkdGhJdGVtICZpdGVtID0gbUJhbmR3aWR0aEl0ZW1zLml0ZW1BdChiYW5kd2lkdGhJbmRleCk7CisgICAgaWYgKGJhbmR3aWR0aEluZGV4ID49IDApIHsKKyAgICAgICAgbU9yaWdCYW5kd2lkdGhJbmRleCA9IG1DdXJCYW5kd2lkdGhJbmRleDsKKyAgICAgICAgbUN1ckJhbmR3aWR0aEluZGV4ID0gYmFuZHdpZHRoSW5kZXg7CisgICAgICAgIGlmIChtT3JpZ0JhbmR3aWR0aEluZGV4ICE9IG1DdXJCYW5kd2lkdGhJbmRleCkgeworICAgICAgICAgICAgQUxPR0koIiMjIyMgU3RhcnRpbmcgQmFuZHdpZHRoIFN3aXRjaDogJXpkID0+ICV6ZCIsCisgICAgICAgICAgICAgICAgICAgIG1PcmlnQmFuZHdpZHRoSW5kZXgsIG1DdXJCYW5kd2lkdGhJbmRleCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQ0hFQ0tfTFQobUN1ckJhbmR3aWR0aEluZGV4LCBtQmFuZHdpZHRoSXRlbXMuc2l6ZSgpKTsKKyAgICBjb25zdCBCYW5kd2lkdGhJdGVtICZpdGVtID0gbUJhbmR3aWR0aEl0ZW1zLml0ZW1BdChtQ3VyQmFuZHdpZHRoSW5kZXgpOwogCiAgICAgdWludDMyX3Qgc3RyZWFtTWFzayA9IDA7IC8vIHN0cmVhbXMgdGhhdCBzaG91bGQgYmUgZmV0Y2hlZCBieSB0aGUgbmV3IGZldGNoZXIKICAgICB1aW50MzJfdCByZXN1bWVNYXNrID0gMDsgLy8gc3RyZWFtcyB0aGF0IHNob3VsZCBiZSBmZXRjaGVkIGJ5IHRoZSBvcmlnaW5hbCBmZXRjaGVyCkBAIC0xMjQ0LDM4ICsxNTUxLDYwIEBACiAgICAgLy8gU3RlcCAxLCBzdG9wIGFuZCBkaXNjYXJkIGZldGNoZXJzIHRoYXQgYXJlIG5vIGxvbmdlciBuZWVkZWQuCiAgICAgLy8gUGF1c2UgdGhvc2UgdGhhdCB3ZSdsbCByZXVzZS4KICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GZXRjaGVySW5mb3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgLy8gc2tpcCBmZXRjaGVycyB0aGF0IGFyZSBtYXJrZWQgbVRvQmVSZW1vdmVkLAorICAgICAgICAvLyB0aGVzZSBhcmUgZG9uZSBhbmQgY2FuJ3QgYmUgcmV1c2VkCisgICAgICAgIGlmIChtRmV0Y2hlckluZm9zW2ldLm1Ub0JlUmVtb3ZlZCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKwogICAgICAgICBjb25zdCBBU3RyaW5nICZ1cmkgPSBtRmV0Y2hlckluZm9zLmtleUF0KGkpOworICAgICAgICBzcDxQbGF5bGlzdEZldGNoZXI+ICZmZXRjaGVyID0gbUZldGNoZXJJbmZvcy5lZGl0VmFsdWVBdChpKS5tRmV0Y2hlcjsKIAotICAgICAgICBib29sIGRpc2NhcmRGZXRjaGVyID0gdHJ1ZTsKLQotICAgICAgICAvLyBJZiB3ZSdyZSBzZWVraW5nIGFsbCBjdXJyZW50IGZldGNoZXJzIGFyZSBkaXNjYXJkZWQuCi0gICAgICAgIGlmICh0aW1lVXMgPCAwbGwpIHsKLSAgICAgICAgICAgIC8vIGRlbGF5IGZldGNoZXIgcmVtb3ZhbCBpZiBub3QgcGlja2luZyB0cmFja3MKLSAgICAgICAgICAgIGRpc2NhcmRGZXRjaGVyID0gcGlja1RyYWNrOwotCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGtNYXhTdHJlYW1zOyArK2opIHsKLSAgICAgICAgICAgICAgICBTdHJlYW1UeXBlIHR5cGUgPSBpbmRleFRvVHlwZShqKTsKLSAgICAgICAgICAgICAgICBpZiAoKHN0cmVhbU1hc2sgJiB0eXBlKSAmJiB1cmkgPT0gVVJJc1tqXSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bWVNYXNrIHw9IHR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbU1hc2sgJj0gfnR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIGRpc2NhcmRGZXRjaGVyID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBib29sIGRpc2NhcmRGZXRjaGVyID0gdHJ1ZSwgZGVsYXlSZW1vdmFsID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwga01heFN0cmVhbXM7ICsraikgeworICAgICAgICAgICAgU3RyZWFtVHlwZSB0eXBlID0gaW5kZXhUb1R5cGUoaik7CisgICAgICAgICAgICBpZiAoKHN0cmVhbU1hc2sgJiB0eXBlKSAmJiB1cmkgPT0gVVJJc1tqXSkgeworICAgICAgICAgICAgICAgIHJlc3VtZU1hc2sgfD0gdHlwZTsKKyAgICAgICAgICAgICAgICBzdHJlYW1NYXNrICY9IH50eXBlOworICAgICAgICAgICAgICAgIGRpc2NhcmRGZXRjaGVyID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgLy8gRGVsYXkgZmV0Y2hlciByZW1vdmFsIGlmIG5vdCBwaWNraW5nIHRyYWNrcywgQU5EIG9sZCBmZXRjaGVyCisgICAgICAgIC8vIGhhcyBzdHJlYW0gbWFzayB0aGF0IG92ZXJsYXBzIG5ldyB2YXJpYW50LiAoT2theSB0byBkaXNjYXJkCisgICAgICAgIC8vIG9sZCBmZXRjaGVyIG5vdywgaWYgY29tcGxldGVseSBubyBvdmVybGFwLikKKyAgICAgICAgaWYgKGRpc2NhcmRGZXRjaGVyICYmIHRpbWVVcyA8IDBsbCAmJiAhcGlja1RyYWNrCisgICAgICAgICAgICAgICAgJiYgKGZldGNoZXItPmdldFN0cmVhbVR5cGVNYXNrKCkgJiBzdHJlYW1NYXNrKSkgeworICAgICAgICAgICAgZGlzY2FyZEZldGNoZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIGRlbGF5UmVtb3ZhbCA9IHRydWU7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoZGlzY2FyZEZldGNoZXIpIHsKLSAgICAgICAgICAgIG1GZXRjaGVySW5mb3MudmFsdWVBdChpKS5tRmV0Y2hlci0+c3RvcEFzeW5jKCk7CisgICAgICAgICAgICBBTE9HVigiZGlzY2FyZGluZyBmZXRjaGVyLSVkIiwgZmV0Y2hlci0+Z2V0RmV0Y2hlcklEKCkpOworICAgICAgICAgICAgZmV0Y2hlci0+c3RvcEFzeW5jKCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRmV0Y2hlckluZm9zLnZhbHVlQXQoaSkubUZldGNoZXItPnBhdXNlQXN5bmMoKTsKKyAgICAgICAgICAgIGZsb2F0IHRocmVzaG9sZCA9IDAuMGY7IC8vIGRlZmF1bHQgdG8gcGF1c2UgYWZ0ZXIgY3VycmVudCBibG9jayAoNDdLYnl0ZXMpCisgICAgICAgICAgICBib29sIGRpc2Nvbm5lY3QgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmICh0aW1lVXMgPj0gMGxsKSB7CisgICAgICAgICAgICAgICAgLy8gc2Vla2luZywgbm8gbmVlZCB0byBmaW5pc2ggZmV0Y2hpbmcKKyAgICAgICAgICAgICAgICBkaXNjb25uZWN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVsYXlSZW1vdmFsKSB7CisgICAgICAgICAgICAgICAgLy8gYWRhcHRpbmcsIGFib3J0IGlmIHJlbWFpbmluZyBvZiBjdXJyZW50IHNlZ21lbnQgaXMgb3ZlciB0aHJlc2hvbGQKKyAgICAgICAgICAgICAgICB0aHJlc2hvbGQgPSBnZXRBYm9ydFRocmVzaG9sZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PcmlnQmFuZHdpZHRoSW5kZXgsIG1DdXJCYW5kd2lkdGhJbmRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dWKCJwYXVzaW5nIGZldGNoZXItJWQsIHRocmVzaG9sZD0lLjJmIiwKKyAgICAgICAgICAgICAgICAgICAgZmV0Y2hlci0+Z2V0RmV0Y2hlcklEKCksIHRocmVzaG9sZCk7CisgICAgICAgICAgICBmZXRjaGVyLT5wYXVzZUFzeW5jKHRocmVzaG9sZCwgZGlzY29ubmVjdCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBzcDxBTWVzc2FnZT4gbXNnOwogICAgIGlmICh0aW1lVXMgPCAwbGwpIHsKICAgICAgICAgLy8gc2tpcCBvbkNoYW5nZUNvbmZpZ3VyYXRpb24yIChkZWNvZGVyIGRlc3RydWN0aW9uKSBpZiBub3Qgc2Vla2luZy4KLSAgICAgICAgbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2hhbmdlQ29uZmlndXJhdGlvbjMsIGlkKCkpOworICAgICAgICBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDaGFuZ2VDb25maWd1cmF0aW9uMywgdGhpcyk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2hhbmdlQ29uZmlndXJhdGlvbjIsIGlkKCkpOworICAgICAgICBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDaGFuZ2VDb25maWd1cmF0aW9uMiwgdGhpcyk7CiAgICAgfQogICAgIG1zZy0+c2V0SW50MzIoInN0cmVhbU1hc2siLCBzdHJlYW1NYXNrKTsKICAgICBtc2ctPnNldEludDMyKCJyZXN1bWVNYXNrIiwgcmVzdW1lTWFzayk7CkBAIC0xMjk2LDQwICsxNjI1LDc0IEBACiAKICAgICBpZiAobUNvbnRpbnVhdGlvbkNvdW50ZXIgPT0gMCkgewogICAgICAgICBtc2ctPnBvc3QoKTsKLQotICAgICAgICBpZiAobVNlZWtSZXBseUlEICE9IDApIHsKLSAgICAgICAgICAgIENIRUNLKG1TZWVrUmVwbHkgIT0gTlVMTCk7Ci0gICAgICAgICAgICBtU2Vla1JlcGx5LT5zZXRJbnQzMigiZXJyIiwgT0spOwotICAgICAgICAgICAgbVNlZWtSZXBseS0+cG9zdFJlcGx5KG1TZWVrUmVwbHlJRCk7Ci0gICAgICAgICAgICBtU2Vla1JlcGx5SUQgPSAwOwotICAgICAgICAgICAgbVNlZWtSZXBseS5jbGVhcigpOwotICAgICAgICB9CiAgICAgfQogfQogCiB2b2lkIExpdmVTZXNzaW9uOjpvbkNoYW5nZUNvbmZpZ3VyYXRpb24oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBBTE9HVigib25DaGFuZ2VDb25maWd1cmF0aW9uIik7CisKICAgICBpZiAoIW1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzKSB7Ci0gICAgICAgIGludDMyX3QgcGlja1RyYWNrID0gMCwgYmFuZHdpZHRoSW5kZXggPSBtQ3VyQmFuZHdpZHRoSW5kZXg7CisgICAgICAgIGludDMyX3QgcGlja1RyYWNrID0gMDsKICAgICAgICAgbXNnLT5maW5kSW50MzIoInBpY2tUcmFjayIsICZwaWNrVHJhY2spOwotICAgICAgICBtc2ctPmZpbmRJbnQzMigiYmFuZHdpZHRoSW5kZXgiLCAmYmFuZHdpZHRoSW5kZXgpOwotICAgICAgICBjaGFuZ2VDb25maWd1cmF0aW9uKC0xbGwgLyogdGltZVVzICovLCBiYW5kd2lkdGhJbmRleCwgcGlja1RyYWNrKTsKKyAgICAgICAgY2hhbmdlQ29uZmlndXJhdGlvbigtMWxsIC8qIHRpbWVVcyAqLywgLTEsIHBpY2tUcmFjayk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbXNnLT5wb3N0KDEwMDAwMDBsbCk7IC8vIHJldHJ5IGluIDEgc2VjCiAgICAgfQogfQogCiB2b2lkIExpdmVTZXNzaW9uOjpvbkNoYW5nZUNvbmZpZ3VyYXRpb24yKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgQUxPR1YoIm9uQ2hhbmdlQ29uZmlndXJhdGlvbjIiKTsKKwogICAgIG1Db250aW51YXRpb24uY2xlYXIoKTsKIAogICAgIC8vIEFsbCBmZXRjaGVycyBhcmUgZWl0aGVyIHN1c3BlbmRlZCBvciBoYXZlIGJlZW4gcmVtb3ZlZCBub3cuCiAKKyAgICAvLyBJZiB3ZSdyZSBzZWVraW5nLCBjbGVhciBhbGwgcGFja2V0IHNvdXJjZXMgYmVmb3JlIHdlIHJlcG9ydAorICAgIC8vIHNlZWsgY29tcGxldGUsIHRvIHByZXZlbnQgZGVjb2RlciBmcm9tIHB1bGxpbmcgc3RhbGUgZGF0YS4KKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworCisgICAgaWYgKHRpbWVVcyA+PSAwKSB7CisgICAgICAgIG1MYXN0U2Vla1RpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgbUxhc3REZXF1ZXVlZFRpbWVVcyA9IHRpbWVVczsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYWNrZXRTb3VyY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBwYWNrZXRTb3VyY2UgPSBtUGFja2V0U291cmNlcy5lZGl0VmFsdWVBdChpKTsKKyAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBwYWNrZXRTb3VyY2UtPmdldEZvcm1hdCgpOworICAgICAgICAgICAgcGFja2V0U291cmNlLT5jbGVhcigpOworICAgICAgICAgICAgLy8gU2V0IGEgdGVudGF0aXZlIGZvcm1hdCBoZXJlIHN1Y2ggdGhhdCBIVFRQTGl2ZVNvdXJjZSB3aWxsIGFsd2F5cyBoYXZlCisgICAgICAgICAgICAvLyBhIGZvcm1hdCBhdmFpbGFibGUgd2hlbiBOdVBsYXllciBxdWVyaWVzLiBXaXRob3V0IGFuIGF2YWlsYWJsZSB2aWRlbworICAgICAgICAgICAgLy8gZm9ybWF0IHdoZW4gc2V0dGluZyBhIHN1cmZhY2UgTnVQbGF5ZXIgbWlnaHQgZGlzYWJsZSB2aWRlbyBkZWNvZGluZworICAgICAgICAgICAgLy8gYWx0b2dldGhlci4gVGhlIHRlbnRhdGl2ZSBmb3JtYXQgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSB0aGUKKyAgICAgICAgICAgIC8vIGF1dGhvcml0YXRpdmUgKGFuZCBwb3NzaWJseSBzYW1lKSBmb3JtYXQgb25jZSBjb250ZW50IGZyb20gdGhlIG5ldworICAgICAgICAgICAgLy8gcG9zaXRpb24gaXMgZGVxdWV1ZWQuCisgICAgICAgICAgICBwYWNrZXRTb3VyY2UtPnNldEZvcm1hdChmb3JtYXQpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7CisgICAgICAgICAgICBtU3RyZWFtc1tpXS5yZXNldCgpOworICAgICAgICB9CisKKyAgICAgICAgbURpc2NvbnRpbnVpdHlPZmZzZXRUaW1lc1VzLmNsZWFyKCk7CisgICAgICAgIG1EaXNjb250aW51aXR5QWJzU3RhcnRUaW1lc1VzLmNsZWFyKCk7CisKKyAgICAgICAgaWYgKG1TZWVrUmVwbHlJRCAhPSBOVUxMKSB7CisgICAgICAgICAgICBDSEVDSyhtU2Vla1JlcGx5ICE9IE5VTEwpOworICAgICAgICAgICAgbVNlZWtSZXBseS0+c2V0SW50MzIoImVyciIsIE9LKTsKKyAgICAgICAgICAgIG1TZWVrUmVwbHktPnBvc3RSZXBseShtU2Vla1JlcGx5SUQpOworICAgICAgICAgICAgbVNlZWtSZXBseUlELmNsZWFyKCk7CisgICAgICAgICAgICBtU2Vla1JlcGx5LmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyByZXN0YXJ0IGJ1ZmZlciBwb2xsaW5nIGFmdGVyIHNlZWsgYmVjYXVlc2UgcHJldmlvdXMKKyAgICAgICAgLy8gYnVmZmVyaW5nIHBvc2l0aW9uIGlzIG5vIGxvbmdlciB2YWxpZC4KKyAgICAgICAgcmVzdGFydFBvbGxCdWZmZXJpbmcoKTsKKyAgICB9CisKICAgICB1aW50MzJfdCBzdHJlYW1NYXNrLCByZXN1bWVNYXNrOwogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzdHJlYW1NYXNrIiwgKGludDMyX3QgKikmc3RyZWFtTWFzaykpOwogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bWVNYXNrIiwgKGludDMyX3QgKikmcmVzdW1lTWFzaykpOwogCi0gICAgLy8gY3VycmVudGx5IG9uQ2hhbmdlQ29uZmlndXJhdGlvbjIgaXMgb25seSBjYWxsZWQgZm9yIHNlZWtpbmc7Ci0gICAgLy8gcmVtb3ZlIHRoZSBmb2xsb3dpbmcgQ0hFQ0sgaWYgdXNpbmcgaXQgZWxzZSB3aGVyZS4KLSAgICBDSEVDS19FUShyZXN1bWVNYXNrLCAwKTsKICAgICBzdHJlYW1NYXNrIHw9IHJlc3VtZU1hc2s7CiAKICAgICBBU3RyaW5nIFVSSXNba01heFN0cmVhbXNdOwpAQCAtMTM0MSwxNyArMTcwNCwyNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGRlY29kZXJzIHRvIHNodXRkb3duIG9uIHRoZSBwbGF5ZXIgc2lkZSwKLSAgICAvLyBhIGRlY29kZXIgaGFzIHRvIGJlIHNodXRkb3duIGlmIGVpdGhlcgotICAgIC8vIDEpIGl0cyBzdHJlYW10eXBlIHdhcyBhY3RpdmUgYmVmb3JlIGJ1dCBub3cgbG9uZ2VyIGlzbid0LgotICAgIC8vIG9yCi0gICAgLy8gMikgaXRzIHN0cmVhbXR5cGUgd2FzIGFscmVhZHkgYWN0aXZlIGFuZCBzdGlsbCBpcyBidXQgdGhlIFVSSQotICAgIC8vICAgIGhhcyBjaGFuZ2VkLgogICAgIHVpbnQzMl90IGNoYW5nZWRNYXNrID0gMDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zICYmIGkgIT0ga1N1YnRpdGxlSW5kZXg7ICsraSkgewotICAgICAgICBpZiAoKChtU3RyZWFtTWFzayAmIHN0cmVhbU1hc2sgJiBpbmRleFRvVHlwZShpKSkKLSAgICAgICAgICAgICAgICAmJiAhKFVSSXNbaV0gPT0gbVN0cmVhbXNbaV0ubVVyaSkpCi0gICAgICAgICAgICAgICAgfHwgKG1TdHJlYW1NYXNrICYgfnN0cmVhbU1hc2sgJiBpbmRleFRvVHlwZShpKSkpIHsKKyAgICAgICAgLy8gc3RyZWFtIFVSSSBjb3VsZCBjaGFuZ2UgZXZlbiBpZiBvbkNoYW5nZUNvbmZpZ3VyYXRpb24yIGlzIG9ubHkKKyAgICAgICAgLy8gdXNlZCBmb3Igc2Vlay4gU2VlayBjb3VsZCBoYXBwZW4gZHVyaW5nIGEgYncgc3dpdGNoLCBpbiB0aGlzCisgICAgICAgIC8vIGNhc2UgYncgc3dpdGNoIHdpbGwgYmUgY2FuY2VsbGVkLCBidXQgdGhlIHNlZWtUbyBwb3NpdGlvbiB3aWxsCisgICAgICAgIC8vIGZldGNoIGZyb20gdGhlIG5ldyBVUkkuCisgICAgICAgIGlmICgobVN0cmVhbU1hc2sgJiBzdHJlYW1NYXNrICYgaW5kZXhUb1R5cGUoaSkpCisgICAgICAgICAgICAgICAgJiYgIW1TdHJlYW1zW2ldLm1VcmkuZW1wdHkoKQorICAgICAgICAgICAgICAgICYmICEoVVJJc1tpXSA9PSBtU3RyZWFtc1tpXS5tVXJpKSkgeworICAgICAgICAgICAgQUxPR1YoInN0cmVhbSAlenUgY2hhbmdlZDogb2xkVVJJICVzLCBuZXdVUkkgJXMiLCBpLAorICAgICAgICAgICAgICAgICAgICBtU3RyZWFtc1tpXS5tVXJpLmNfc3RyKCksIFVSSXNbaV0uY19zdHIoKSk7CisgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPSBtUGFja2V0U291cmNlcy52YWx1ZUZvcihpbmRleFRvVHlwZShpKSk7CisgICAgICAgICAgICBpZiAoc291cmNlLT5nZXRMYXRlc3REZXF1ZXVlZE1ldGEoKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc291cmNlLT5xdWV1ZURpc2NvbnRpbnVpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfRk9STUFUQ0hBTkdFLCBOVUxMLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggZGVjb2RlcnMgdG8gc2h1dGRvd24gb24gdGhlIHBsYXllciBzaWRlLAorICAgICAgICAvLyBhIGRlY29kZXIgaGFzIHRvIGJlIHNodXRkb3duIGlmIGl0cyBzdHJlYW10eXBlIHdhcyBhY3RpdmUKKyAgICAgICAgLy8gYmVmb3JlIGJ1dCBub3cgbG9uZ2VyIGlzbid0LgorICAgICAgICBpZiAoKG1TdHJlYW1NYXNrICYgfnN0cmVhbU1hc2sgJiBpbmRleFRvVHlwZShpKSkpIHsKICAgICAgICAgICAgIGNoYW5nZWRNYXNrIHw9IGluZGV4VG9UeXBlKGkpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTM3Miw3ICsxNzQ1LDcgQEAKICAgICBub3RpZnktPnNldEludDMyKCJjaGFuZ2VkTWFzayIsIGNoYW5nZWRNYXNrKTsKIAogICAgIG1zZy0+c2V0V2hhdChrV2hhdENoYW5nZUNvbmZpZ3VyYXRpb24zKTsKLSAgICBtc2ctPnNldFRhcmdldChpZCgpKTsKKyAgICBtc2ctPnNldFRhcmdldCh0aGlzKTsKIAogICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgicmVwbHkiLCBtc2cpOwogICAgIG5vdGlmeS0+cG9zdCgpOwpAQCAtMTM4Nyw2ICsxNzYwLDggQEAKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic3RyZWFtTWFzayIsIChpbnQzMl90ICopJnN0cmVhbU1hc2spKTsKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVzdW1lTWFzayIsIChpbnQzMl90ICopJnJlc3VtZU1hc2spKTsKIAorICAgIG1OZXdTdHJlYW1NYXNrID0gc3RyZWFtTWFzayB8IHJlc3VtZU1hc2s7CisKICAgICBpbnQ2NF90IHRpbWVVczsKICAgICBpbnQzMl90IHBpY2tUcmFjazsKICAgICBib29sIHN3aXRjaGluZyA9IGZhbHNlOwpAQCAtMTM5NSwxMyArMTc3MCwyNiBAQAogCiAgICAgaWYgKHRpbWVVcyA8IDBsbCkgewogICAgICAgICBpZiAoIXBpY2tUcmFjaykgewotICAgICAgICAgICAgc3dpdGNoaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIG1Td2FwTWFzayBjb250YWlucyBzdHJlYW1zIHRoYXQgYXJlIGluIGJvdGggb2xkIGFuZCBuZXcgdmFyaWFudCwKKyAgICAgICAgICAgIC8vIChpbiBtTmV3U3RyZWFtTWFzayAmIG1TdHJlYW1NYXNrKSBidXQgd2l0aCBkaWZmZXJlbnQgVVJJcworICAgICAgICAgICAgLy8gKG5vdCBpbiByZXN1bWVNYXNrKS4KKyAgICAgICAgICAgIC8vIEZvciBleGFtcGxlLCBvbGQgdmFyaWFudCBoYXMgdmlkZW8gYW5kIGF1ZGlvIGluIHR3byBzZXBhcmF0ZQorICAgICAgICAgICAgLy8gVVJJcywgYW5kIG5ldyB2YXJpYW50IGhhcyBvbmx5IGF1ZGlvIHdpdGggdW5jaGFuZ2VkIFVSSS4gbVN3YXBNYXNrCisgICAgICAgICAgICAvLyBzaG91bGQgYmUgMCBhcyB0aGVyZSBpcyBub3RoaW5nIHRvIHN3YXAuIFdlIG9ubHkgbmVlZCB0byBzdG9wIHZpZGVvLAorICAgICAgICAgICAgLy8gYW5kIHJlc3VtZSBhdWRpby4KKyAgICAgICAgICAgIG1Td2FwTWFzayA9ICBtTmV3U3RyZWFtTWFzayAmIG1TdHJlYW1NYXNrICYgfnJlc3VtZU1hc2s7CisgICAgICAgICAgICBzd2l0Y2hpbmcgPSAobVN3YXBNYXNrICE9IDApOwogICAgICAgICB9CiAgICAgICAgIG1SZWFsVGltZUJhc2VVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBtTGFzdERlcXVldWVkVGltZVVzOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1SZWFsVGltZUJhc2VVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSB0aW1lVXM7CiAgICAgfQogCisgICAgQUxPR1YoIm9uQ2hhbmdlQ29uZmlndXJhdGlvbjM6IHRpbWVVcz0lbGxkLCBzd2l0Y2hpbmc9JWQsIHBpY2tUcmFjaz0lZCwgIgorICAgICAgICAgICAgIm1TdHJlYW1NYXNrPTB4JXgsIG1OZXdTdHJlYW1NYXNrPTB4JXgsIG1Td2FwTWFzaz0weCV4IiwKKyAgICAgICAgICAgIChsb25nIGxvbmcpdGltZVVzLCBzd2l0Y2hpbmcsIHBpY2tUcmFjaywKKyAgICAgICAgICAgIG1TdHJlYW1NYXNrLCBtTmV3U3RyZWFtTWFzaywgbVN3YXBNYXNrKTsKKwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgewogICAgICAgICBpZiAoc3RyZWFtTWFzayAmIGluZGV4VG9UeXBlKGkpKSB7CiAgICAgICAgICAgICBpZiAoc3dpdGNoaW5nKSB7CkBAIC0xNDEyLDQ3ICsxODAwLDIxIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtTmV3U3RyZWFtTWFzayA9IHN0cmVhbU1hc2sgfCByZXN1bWVNYXNrOwotICAgIGlmIChzd2l0Y2hpbmcpIHsKLSAgICAgICAgbVN3YXBNYXNrID0gbVN0cmVhbU1hc2sgJiB+cmVzdW1lTWFzazsKLSAgICB9Ci0KICAgICAvLyBPZiBhbGwgZXhpc3RpbmcgZmV0Y2hlcnM6CiAgICAgLy8gKiBSZXN1bWUgZmV0Y2hlcnMgdGhhdCBhcmUgc3RpbGwgbmVlZGVkIGFuZCBhc3NpZ24gdGhlbSBvcmlnaW5hbCBwYWNrZXQgc291cmNlcy4KICAgICAvLyAqIE1hcmsgb3RoZXJ3aXNlIHVubmVlZGVkIGZldGNoZXJzIGZvciByZW1vdmFsLgogICAgIEFMT0dWKCJyZXN1bWluZyBmZXRjaGVycyBmb3IgbWFzayAweCUwOHgiLCByZXN1bWVNYXNrKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GZXRjaGVySW5mb3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgY29uc3QgQVN0cmluZyAmdXJpID0gbUZldGNoZXJJbmZvcy5rZXlBdChpKTsKKyAgICAgICAgaWYgKCFyZXN1bWVGZXRjaGVyKHVyaSwgcmVzdW1lTWFzaywgdGltZVVzKSkgeworICAgICAgICAgICAgQUxPR1YoIm1hcmtpbmcgZmV0Y2hlci0lZCB0byBiZSByZW1vdmVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUZldGNoZXJJbmZvc1tpXS5tRmV0Y2hlci0+Z2V0RmV0Y2hlcklEKCkpOwogCi0gICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZXNba01heFN0cmVhbXNdOwotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGtNYXhTdHJlYW1zOyArK2opIHsKLSAgICAgICAgICAgIGlmICgocmVzdW1lTWFzayAmIGluZGV4VG9UeXBlKGopKSAmJiB1cmkgPT0gbVN0cmVhbXNbal0ubVVyaSkgewotICAgICAgICAgICAgICAgIHNvdXJjZXNbal0gPSBtUGFja2V0U291cmNlcy52YWx1ZUZvcihpbmRleFRvVHlwZShqKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaiAhPSBrU3VidGl0bGVJbmRleCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigicXVldWVpbmcgZHVtbXkgZGlzY29udGludWl0eSBmb3Igc3RyZWFtIHR5cGUgJWQiLCBpbmRleFRvVHlwZShqKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGRpc2NvbnRpbnVpdHlRdWV1ZTsKLSAgICAgICAgICAgICAgICAgICAgZGlzY29udGludWl0eVF1ZXVlID0gbURpc2NvbnRpbnVpdGllcy52YWx1ZUZvcihpbmRleFRvVHlwZShqKSk7Ci0gICAgICAgICAgICAgICAgICAgIGRpc2NvbnRpbnVpdHlRdWV1ZS0+cXVldWVEaXNjb250aW51aXR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgRmV0Y2hlckluZm8gJmluZm8gPSBtRmV0Y2hlckluZm9zLmVkaXRWYWx1ZUF0KGkpOwotICAgICAgICBpZiAoc291cmNlc1trQXVkaW9JbmRleF0gIT0gTlVMTCB8fCBzb3VyY2VzW2tWaWRlb0luZGV4XSAhPSBOVUxMCi0gICAgICAgICAgICAgICAgfHwgc291cmNlc1trU3VidGl0bGVJbmRleF0gIT0gTlVMTCkgewotICAgICAgICAgICAgaW5mby5tRmV0Y2hlci0+c3RhcnRBc3luYygKLSAgICAgICAgICAgICAgICAgICAgc291cmNlc1trQXVkaW9JbmRleF0sIHNvdXJjZXNba1ZpZGVvSW5kZXhdLCBzb3VyY2VzW2tTdWJ0aXRsZUluZGV4XSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbmZvLm1Ub0JlUmVtb3ZlZCA9IHRydWU7CisgICAgICAgICAgICBtRmV0Y2hlckluZm9zLmVkaXRWYWx1ZUF0KGkpLm1Ub0JlUmVtb3ZlZCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBzdHJlYW1NYXNrIG5vdyBvbmx5IGNvbnRhaW5zIHRoZSB0eXBlcyB0aGF0IG5lZWQgYSBuZXcgZmV0Y2hlciBjcmVhdGVkLgotCiAgICAgaWYgKHN0cmVhbU1hc2sgIT0gMCkgewogICAgICAgICBBTE9HVigiY3JlYXRpbmcgbmV3IGZldGNoZXJzIGZvciBtYXNrIDB4JTA4eCIsIHN0cmVhbU1hc2spOwogICAgIH0KQEAgLTE0NzAsMTMgKzE4MzIsMTIgQEAKICAgICAgICAgc3A8UGxheWxpc3RGZXRjaGVyPiBmZXRjaGVyID0gYWRkRmV0Y2hlcih1cmkuY19zdHIoKSk7CiAgICAgICAgIENIRUNLKGZldGNoZXIgIT0gTlVMTCk7CiAKLSAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IC0xOwotICAgICAgICBpbnQ2NF90IHNlZ21lbnRTdGFydFRpbWVVcyA9IC0xbGw7Ci0gICAgICAgIGludDMyX3QgZGlzY29udGludWl0eVNlcSA9IC0xOwotICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2VzW2tNYXhTdHJlYW1zXTsKKyAgICAgICAgSExTVGltZSBzdGFydFRpbWU7CisgICAgICAgIFNlZWtNb2RlIHNlZWtNb2RlID0ga1NlZWtNb2RlRXhhY3RQb3NpdGlvbjsKKyAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlc1trTnVtU291cmNlc107CiAKLSAgICAgICAgaWYgKGkgPT0ga1N1YnRpdGxlSW5kZXgpIHsKLSAgICAgICAgICAgIHNlZ21lbnRTdGFydFRpbWVVcyA9IGxhdGVzdE1lZGlhU2VnbWVudFN0YXJ0VGltZVVzKCk7CisgICAgICAgIGlmIChpID09IGtTdWJ0aXRsZUluZGV4IHx8ICghcGlja1RyYWNrICYmICFzd2l0Y2hpbmcpKSB7CisgICAgICAgICAgICBzdGFydFRpbWUgPSBsYXRlc3RNZWRpYVNlZ21lbnRTdGFydFRpbWUoKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIFRSSUNLWTogbG9vcGluZyBmcm9tIGkgYXMgZWFybGllciBzdHJlYW1zIGFyZSBhbHJlYWR5IHJlbW92ZWQgZnJvbSBzdHJlYW1NYXNrCkBAIC0xNDg2LDYzICsxODQ3LDUwIEBACiAgICAgICAgICAgICAgICAgc291cmNlc1tqXSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKGluZGV4VG9UeXBlKGopKTsKIAogICAgICAgICAgICAgICAgIGlmICh0aW1lVXMgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBzb3VyY2VzW2pdLT5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWVVcyA9IHRpbWVVczsKLQotICAgICAgICAgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBkaXNjb250aW51aXR5UXVldWU7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBleHRyYSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICAgICAgZXh0cmEtPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwotICAgICAgICAgICAgICAgICAgICBkaXNjb250aW51aXR5UXVldWUgPSBtRGlzY29udGludWl0aWVzLnZhbHVlRm9yKGluZGV4VG9UeXBlKGopKTsKLSAgICAgICAgICAgICAgICAgICAgZGlzY29udGludWl0eVF1ZXVlLT5xdWV1ZURpc2NvbnRpbnVpdHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1RJTUUsIGV4dHJhLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLm1UaW1lVXMgPSB0aW1lVXM7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0eXBlOwogICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbWV0YTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBpY2tUcmFjaykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VsZWN0aW5nCisgICAgICAgICAgICAgICAgICAgIGlmICghc3dpdGNoaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWxlY3RpbmcsIG9yIGFkYXB0aW5nIGJ1dCBubyBzd2FwIHJlcXVpcmVkCiAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhID0gc291cmNlc1tqXS0+Z2V0TGF0ZXN0RGVxdWV1ZWRNZXRhKCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGFwdGluZworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRhcHRpbmcgYW5kIHN3YXAgcmVxdWlyZWQKICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEgPSBzb3VyY2VzW2pdLT5nZXRMYXRlc3RFbnF1ZXVlZE1ldGEoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtZXRhICE9IE5VTEwgJiYgIW1ldGEtPmZpbmRJbnQzMigiZGlzY29udGludWl0eSIsICZ0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0bXBVczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdG1wU2VnbWVudFVzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50NjQoInRpbWVVcyIsICZ0bXBVcykpOwotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDY0KCJzZWdtZW50U3RhcnRUaW1lVXMiLCAmdG1wU2VnbWVudFVzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRUaW1lVXMgPCAwIHx8IHRtcFNlZ21lbnRVcyA8IHNlZ21lbnRTdGFydFRpbWVVcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZVVzID0gdG1wVXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudFN0YXJ0VGltZVVzID0gdG1wU2VnbWVudFVzOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0bXBTZWdtZW50VXMgPT0gc2VnbWVudFN0YXJ0VGltZVVzICYmIHRtcFVzIDwgc3RhcnRUaW1lVXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWVVcyA9IHRtcFVzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlcTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMigiZGlzY29udGludWl0eVNlcSIsICZzZXEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXNjb250aW51aXR5U2VxIDwgMCB8fCBzZXEgPCBkaXNjb250aW51aXR5U2VxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY29udGludWl0eVNlcSA9IHNlcTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhICE9IE5VTEwgJiYgbUN1ckJhbmR3aWR0aEluZGV4ID4gbU9yaWdCYW5kd2lkdGhJbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN3aXRjaGluZyB1cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEgPSBzb3VyY2VzW2pdLT5nZXRNZXRhQWZ0ZXJMYXN0RGVxdWV1ZWQobVVwU3dpdGNoTWFyZ2luKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmIChwaWNrVHJhY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbGVjdGluZyB0cmFjaywgcXVldWUgZGlzY29udGludWl0aWVzIGJlZm9yZSBjb250ZW50CisgICAgICAgICAgICAgICAgICAgIGlmICgoaiA9PSBrQXVkaW9JbmRleCB8fCBqID09IGtWaWRlb0luZGV4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1ldGEgIT0gTlVMTCAmJiAhbWV0YS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJnR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBITFNUaW1lIHRtcFRpbWUobWV0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRUaW1lIDwgdG1wVGltZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSA9IHRtcFRpbWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoIXN3aXRjaGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VsZWN0aW5nLCBvciBhZGFwdGluZyBidXQgbm8gc3dhcCByZXF1aXJlZAogICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlc1tqXS0+Y2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqID09IGtTdWJ0aXRsZUluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBkaXNjb250aW51aXR5UXVldWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb250aW51aXR5UXVldWUgPSBtRGlzY29udGludWl0aWVzLnZhbHVlRm9yKGluZGV4VG9UeXBlKGopKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvbnRpbnVpdHlRdWV1ZS0+cXVldWVEaXNjb250aW51aXR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfRk9STUFUQ0hBTkdFLCBOVUxMLCB0cnVlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInN0cmVhbVslenVdOiBxdWV1ZSBmb3JtYXQgY2hhbmdlIiwgaik7CisgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzW2pdLT5xdWV1ZURpc2NvbnRpbnVpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9GT1JNQVRfT05MWSwgTlVMTCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGFwdGluZywgcXVldWUgZGlzY29udGludWl0aWVzIGFmdGVyIHJlc3VtZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3dpdGNoaW5nLCBxdWV1ZSBkaXNjb250aW51aXRpZXMgYWZ0ZXIgcmVzdW1lCiAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzW2pdID0gbVBhY2tldFNvdXJjZXMyLnZhbHVlRm9yKGluZGV4VG9UeXBlKGopKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXNbal0tPmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBleHRyYVN0cmVhbXMgPSBtTmV3U3RyZWFtTWFzayAmICh+bVN0cmVhbU1hc2spOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhU3RyZWFtcyAmIGluZGV4VG9UeXBlKGopKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlc1tqXS0+cXVldWVBY2Nlc3NVbml0KGNyZWF0ZUZvcm1hdENoYW5nZUJ1ZmZlcigvKnN3YXAqLyBmYWxzZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5ldyBmZXRjaGVyIG1pZ2h0IGJlIHByb3ZpZGluZyBzdHJlYW1zIHRoYXQgdXNlZCB0byBiZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvdmlkZWQgYnkgdHdvIGRpZmZlcmVudCBmZXRjaGVycywgIGlmIG9uZSBvZiB0aGUgZmV0Y2hlcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGF1c2VkIGluIHRoZSBtaWRkbGUgd2hpbGUgdGhlIG90aGVyIHNvbWVob3cgcGF1c2VkIGluIG5leHQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZywgd2UgaGF2ZSB0byBzdGFydCBmcm9tIG5leHQgc2VnLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZWtNb2RlIDwgbVN0cmVhbXNbal0ubVNlZWtNb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vla01vZGUgPSBtU3RyZWFtc1tqXS5tU2Vla01vZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0xNTUxLDU0ICsxODk5LDEwNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgQUxPR1YoIltmZXRjaGVyLSVkXSBzdGFydEFzeW5jOiBzdGFydFRpbWVVcyAlbGxkIG1MYXN0U2Vla1RpbWVVcyAlbGxkICIKKyAgICAgICAgICAgICAgICAic2VnbWVudFN0YXJ0VGltZVVzICVsbGQgc2Vla01vZGUgJWQiLAorICAgICAgICAgICAgICAgIGZldGNoZXItPmdldEZldGNoZXJJRCgpLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc3RhcnRUaW1lLm1UaW1lVXMsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltTGFzdFNlZWtUaW1lVXMsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzdGFydFRpbWUuZ2V0U2VnbWVudFRpbWVVcygpLAorICAgICAgICAgICAgICAgIHNlZWtNb2RlKTsKKworICAgICAgICAvLyBTZXQgdGhlIHRhcmdldCBzZWdtZW50IHN0YXJ0IHRpbWUgdG8gdGhlIG1pZGRsZSBwb2ludCBvZiB0aGUKKyAgICAgICAgLy8gc2VnbWVudCB3aGVyZSB0aGUgbGFzdCBzYW1wbGUgd2FzLgorICAgICAgICAvLyBUaGlzIGdpdmVzIGEgYmV0dGVyIGd1ZXNzIGlmIHNlZ21lbnRzIG9mIHRoZSB0d28gdmFyaWFudHMgYXJlIG5vdAorICAgICAgICAvLyBwZXJmZWN0bHkgYWxpZ25lZC4gKElmIHRoZSBjb3JyZXNwb25kaW5nIHNlZ21lbnQgaW4gbmV3IHZhcmlhbnQKKyAgICAgICAgLy8gc3RhcnRzIHNsaWdodGx5IGxhdGVyIHRoYW4gdGhhdCBpbiB0aGUgb2xkIHZhcmlhbnQsIHdlIHN0aWxsIHdhbnQKKyAgICAgICAgLy8gdG8gcGljayB0aGF0IHNlZ21lbnQsIG5vdCB0aGUgb25lIGJlZm9yZSkKICAgICAgICAgZmV0Y2hlci0+c3RhcnRBc3luYygKICAgICAgICAgICAgICAgICBzb3VyY2VzW2tBdWRpb0luZGV4XSwKICAgICAgICAgICAgICAgICBzb3VyY2VzW2tWaWRlb0luZGV4XSwKICAgICAgICAgICAgICAgICBzb3VyY2VzW2tTdWJ0aXRsZUluZGV4XSwKLSAgICAgICAgICAgICAgICBzdGFydFRpbWVVcyA8IDAgPyBtTGFzdFNlZWtUaW1lVXMgOiBzdGFydFRpbWVVcywKLSAgICAgICAgICAgICAgICBzZWdtZW50U3RhcnRUaW1lVXMsCi0gICAgICAgICAgICAgICAgZGlzY29udGludWl0eVNlcSwKLSAgICAgICAgICAgICAgICBzd2l0Y2hpbmcpOworICAgICAgICAgICAgICAgIGdldE1ldGFkYXRhU291cmNlKHNvdXJjZXMsIG1OZXdTdHJlYW1NYXNrLCBzd2l0Y2hpbmcpLAorICAgICAgICAgICAgICAgIHN0YXJ0VGltZS5tVGltZVVzIDwgMCA/IG1MYXN0U2Vla1RpbWVVcyA6IHN0YXJ0VGltZS5tVGltZVVzLAorICAgICAgICAgICAgICAgIHN0YXJ0VGltZS5nZXRTZWdtZW50VGltZVVzKCksCisgICAgICAgICAgICAgICAgc3RhcnRUaW1lLm1TZXEsCisgICAgICAgICAgICAgICAgc2Vla01vZGUpOwogICAgIH0KIAogICAgIC8vIEFsbCBmZXRjaGVycyBoYXZlIG5vdyBiZWVuIHN0YXJ0ZWQsIHRoZSBjb25maWd1cmF0aW9uIGNoYW5nZQogICAgIC8vIGhhcyBjb21wbGV0ZWQuCiAKLSAgICBjYW5jZWxDaGVja0JhbmR3aWR0aEV2ZW50KCk7Ci0gICAgc2NoZWR1bGVDaGVja0JhbmR3aWR0aEV2ZW50KCk7Ci0KLSAgICBBTE9HVigiWFhYIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGNvbXBsZXRlZC4iKTsKICAgICBtUmVjb25maWd1cmF0aW9uSW5Qcm9ncmVzcyA9IGZhbHNlOwogICAgIGlmIChzd2l0Y2hpbmcpIHsKICAgICAgICAgbVN3aXRjaEluUHJvZ3Jlc3MgPSB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1TdHJlYW1NYXNrID0gbU5ld1N0cmVhbU1hc2s7CisgICAgICAgIGlmIChtT3JpZ0JhbmR3aWR0aEluZGV4ICE9IG1DdXJCYW5kd2lkdGhJbmRleCkgeworICAgICAgICAgICAgQUxPR1YoIiMjIyMgRmluaXNoZWQgQmFuZHdpZHRoIFN3aXRjaCBFYXJseTogJXpkID0+ICV6ZCIsCisgICAgICAgICAgICAgICAgICAgIG1PcmlnQmFuZHdpZHRoSW5kZXgsIG1DdXJCYW5kd2lkdGhJbmRleCk7CisgICAgICAgICAgICBtT3JpZ0JhbmR3aWR0aEluZGV4ID0gbUN1ckJhbmR3aWR0aEluZGV4OworICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKG1EaXNjb25uZWN0UmVwbHlJRCAhPSAwKSB7CisgICAgQUxPR1YoIm9uQ2hhbmdlQ29uZmlndXJhdGlvbjM6IG1Td2l0Y2hJblByb2dyZXNzICVkLCBtU3RyZWFtTWFzayAweCV4IiwKKyAgICAgICAgICAgIG1Td2l0Y2hJblByb2dyZXNzLCBtU3RyZWFtTWFzayk7CisKKyAgICBpZiAobURpc2Nvbm5lY3RSZXBseUlEICE9IE5VTEwpIHsKICAgICAgICAgZmluaXNoRGlzY29ubmVjdCgpOwogICAgIH0KIH0KIAotdm9pZCBMaXZlU2Vzc2lvbjo6b25Td2FwcGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgaW50MzJfdCBzd2l0Y2hHZW5lcmF0aW9uOwotICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzd2l0Y2hHZW5lcmF0aW9uIiwgJnN3aXRjaEdlbmVyYXRpb24pKTsKLSAgICBpZiAoc3dpdGNoR2VuZXJhdGlvbiAhPSBtU3dpdGNoR2VuZXJhdGlvbikgewordm9pZCBMaXZlU2Vzc2lvbjo6c3dhcFBhY2tldFNvdXJjZShTdHJlYW1UeXBlIHN0cmVhbSkgeworICAgIEFMT0dWKCJbJXNdIHN3YXBQYWNrZXRTb3VyY2UiLCBnZXROYW1lRm9yU3RyZWFtKHN0cmVhbSkpOworCisgICAgLy8gdHJhbnNmZXIgcGFja2V0cyBmcm9tIHNvdXJjZTIgdG8gc291cmNlCisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmFwcyA9IG1QYWNrZXRTb3VyY2VzLmVkaXRWYWx1ZUZvcihzdHJlYW0pOworICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZhcHMyID0gbVBhY2tldFNvdXJjZXMyLmVkaXRWYWx1ZUZvcihzdHJlYW0pOworCisgICAgLy8gcXVldWUgZGlzY29udGludWl0eSBpbiBtUGFja2V0U291cmNlCisgICAgYXBzLT5xdWV1ZURpc2NvbnRpbnVpdHkoQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0ZPUk1BVF9PTkxZLCBOVUxMLCBmYWxzZSk7CisKKyAgICAvLyBxdWV1ZSBwYWNrZXRzIGluIG1QYWNrZXRTb3VyY2UyIHRvIG1QYWNrZXRTb3VyY2UKKyAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdCA9IE9LOworICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQ7CisgICAgd2hpbGUgKGFwczItPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpICYmIGZpbmFsUmVzdWx0ID09IE9LICYmCisgICAgICAgICAgT0sgPT0gYXBzMi0+ZGVxdWV1ZUFjY2Vzc1VuaXQoJmFjY2Vzc1VuaXQpKSB7CisgICAgICAgIGFwcy0+cXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOworICAgIH0KKyAgICBhcHMyLT5jbGVhcigpOworfQorCit2b2lkIExpdmVTZXNzaW9uOjp0cnlUb0ZpbmlzaEJhbmR3aWR0aFN3aXRjaChjb25zdCBBU3RyaW5nICZvbGRVcmkpIHsKKyAgICBpZiAoIW1Td2l0Y2hJblByb2dyZXNzKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpbnQzMl90IHN0cmVhbTsKLSAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic3RyZWFtIiwgJnN0cmVhbSkpOwotCi0gICAgc3NpemVfdCBpZHggPSB0eXBlVG9JbmRleChzdHJlYW0pOwotICAgIENIRUNLKGlkeCA+PSAwKTsKLSAgICBpZiAoKG1OZXdTdHJlYW1NYXNrICYgc3RyZWFtKSAmJiBtU3RyZWFtc1tpZHhdLm1OZXdVcmkuZW1wdHkoKSkgewotICAgICAgICBBTE9HVygic3dhcHBpbmcgc3RyZWFtIHR5cGUgJWQgJXMgdG8gZW1wdHkgc3RyZWFtIiwgc3RyZWFtLCBtU3RyZWFtc1tpZHhdLm1VcmkuY19zdHIoKSk7CisgICAgc3NpemVfdCBpbmRleCA9IG1GZXRjaGVySW5mb3MuaW5kZXhPZktleShvbGRVcmkpOworICAgIGlmIChpbmRleCA8IDAgfHwgIW1GZXRjaGVySW5mb3NbaW5kZXhdLm1Ub0JlUmVtb3ZlZCkgeworICAgICAgICByZXR1cm47CiAgICAgfQotICAgIG1TdHJlYW1zW2lkeF0ubVVyaSA9IG1TdHJlYW1zW2lkeF0ubU5ld1VyaTsKLSAgICBtU3RyZWFtc1tpZHhdLm1OZXdVcmkuY2xlYXIoKTsKIAotICAgIG1Td2FwTWFzayAmPSB+c3RyZWFtOworICAgIC8vIFN3YXAgcGFja2V0IHNvdXJjZSBvZiBzdHJlYW1zIHByb3ZpZGVkIGJ5IG9sZCB2YXJpYW50CisgICAgZm9yIChzaXplX3QgaWR4ID0gMDsgaWR4IDwga01heFN0cmVhbXM7IGlkeCsrKSB7CisgICAgICAgIFN0cmVhbVR5cGUgc3RyZWFtID0gaW5kZXhUb1R5cGUoaWR4KTsKKyAgICAgICAgaWYgKChtU3dhcE1hc2sgJiBzdHJlYW0pICYmIChvbGRVcmkgPT0gbVN0cmVhbXNbaWR4XS5tVXJpKSkgeworICAgICAgICAgICAgc3dhcFBhY2tldFNvdXJjZShzdHJlYW0pOworCisgICAgICAgICAgICBpZiAoKG1OZXdTdHJlYW1NYXNrICYgc3RyZWFtKSAmJiBtU3RyZWFtc1tpZHhdLm1OZXdVcmkuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJzd2FwcGluZyBzdHJlYW0gdHlwZSAlZCAlcyB0byBlbXB0eSBzdHJlYW0iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCBtU3RyZWFtc1tpZHhdLm1VcmkuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3RyZWFtc1tpZHhdLm1VcmkgPSBtU3RyZWFtc1tpZHhdLm1OZXdVcmk7CisgICAgICAgICAgICBtU3RyZWFtc1tpZHhdLm1OZXdVcmkuY2xlYXIoKTsKKworICAgICAgICAgICAgbVN3YXBNYXNrICY9IH5zdHJlYW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtRmV0Y2hlckluZm9zLmVkaXRWYWx1ZUF0KGluZGV4KS5tRmV0Y2hlci0+c3RvcEFzeW5jKGZhbHNlIC8qIGNsZWFyICovKTsKKworICAgIEFMT0dWKCJ0cnlUb0ZpbmlzaEJhbmR3aWR0aFN3aXRjaDogbVN3YXBNYXNrPTB4JXgiLCBtU3dhcE1hc2spOwogICAgIGlmIChtU3dhcE1hc2sgIT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTYwNiwxNTcgKzIwMDQsMzcyIEBACiAgICAgLy8gQ2hlY2sgaWYgbmV3IHZhcmlhbnQgY29udGFpbnMgZXh0cmEgc3RyZWFtcy4KICAgICB1aW50MzJfdCBleHRyYVN0cmVhbXMgPSBtTmV3U3RyZWFtTWFzayAmICh+bVN0cmVhbU1hc2spOwogICAgIHdoaWxlIChleHRyYVN0cmVhbXMpIHsKLSAgICAgICAgU3RyZWFtVHlwZSBleHRyYVN0cmVhbSA9IChTdHJlYW1UeXBlKSAoZXh0cmFTdHJlYW1zICYgfihleHRyYVN0cmVhbXMgLSAxKSk7Ci0gICAgICAgIHN3YXBQYWNrZXRTb3VyY2UoZXh0cmFTdHJlYW0pOwotICAgICAgICBleHRyYVN0cmVhbXMgJj0gfmV4dHJhU3RyZWFtOworICAgICAgICBTdHJlYW1UeXBlIHN0cmVhbSA9IChTdHJlYW1UeXBlKSAoZXh0cmFTdHJlYW1zICYgfihleHRyYVN0cmVhbXMgLSAxKSk7CisgICAgICAgIGV4dHJhU3RyZWFtcyAmPSB+c3RyZWFtOwogCi0gICAgICAgIGlkeCA9IHR5cGVUb0luZGV4KGV4dHJhU3RyZWFtKTsKKyAgICAgICAgc3dhcFBhY2tldFNvdXJjZShzdHJlYW0pOworCisgICAgICAgIHNzaXplX3QgaWR4ID0gdHlwZVRvSW5kZXgoc3RyZWFtKTsKICAgICAgICAgQ0hFQ0soaWR4ID49IDApOwogICAgICAgICBpZiAobVN0cmVhbXNbaWR4XS5tTmV3VXJpLmVtcHR5KCkpIHsKICAgICAgICAgICAgIEFMT0dXKCJzd2FwcGluZyBleHRyYSBzdHJlYW0gdHlwZSAlZCAlcyB0byBlbXB0eSBzdHJlYW0iLAotICAgICAgICAgICAgICAgICAgICBleHRyYVN0cmVhbSwgbVN0cmVhbXNbaWR4XS5tVXJpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIG1TdHJlYW1zW2lkeF0ubVVyaS5jX3N0cigpKTsKICAgICAgICAgfQogICAgICAgICBtU3RyZWFtc1tpZHhdLm1VcmkgPSBtU3RyZWFtc1tpZHhdLm1OZXdVcmk7CiAgICAgICAgIG1TdHJlYW1zW2lkeF0ubU5ld1VyaS5jbGVhcigpOwogICAgIH0KIAotICAgIHRyeVRvRmluaXNoQmFuZHdpZHRoU3dpdGNoKCk7Ci19Ci0KLXZvaWQgTGl2ZVNlc3Npb246Om9uQ2hlY2tTd2l0Y2hEb3duKCkgewotICAgIGlmIChtU3dpdGNoRG93bk1vbml0b3IgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1Td2l0Y2hJblByb2dyZXNzIHx8IG1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzKSB7Ci0gICAgICAgIEFMT0dWKCJTd2l0Y2gvUmVjb25maWcgaW4gcHJvZ3Jlc3MsIGRlZmVyIHN3aXRjaCBkb3duIik7Ci0gICAgICAgIG1Td2l0Y2hEb3duTW9uaXRvci0+cG9zdCgxMDAwMDAwbGwpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7Ci0gICAgICAgIGludDMyX3QgdGFyZ2V0RHVyYXRpb247Ci0gICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHBhY2tldFNvdXJjZSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKGluZGV4VG9UeXBlKGkpKTsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1ldGEgPSBwYWNrZXRTb3VyY2UtPmdldExhdGVzdERlcXVldWVkTWV0YSgpOwotCi0gICAgICAgIGlmIChtZXRhICE9IE5VTEwgJiYgbWV0YS0+ZmluZEludDMyKCJ0YXJnZXREdXJhdGlvbiIsICZ0YXJnZXREdXJhdGlvbikgKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IGJ1ZmZlcmVkRHVyYXRpb25VcyA9IHBhY2tldFNvdXJjZS0+Z2V0RXN0aW1hdGVkRHVyYXRpb25VcygpOwotICAgICAgICAgICAgaW50NjRfdCB0YXJnZXREdXJhdGlvblVzID0gdGFyZ2V0RHVyYXRpb24gKiAxMDAwMDAwbGw7Ci0KLSAgICAgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPCB0YXJnZXREdXJhdGlvblVzIC8gMykgewotICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTd2l0Y2hEb3duLCBpZCgpKSktPnBvc3QoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KKyAgICAvLyBSZXN0YXJ0IG5ldyBmZXRjaGVyIChpdCB3YXMgcGF1c2VkIGFmdGVyIHRoZSBmaXJzdCA0N2sgYmxvY2spCisgICAgLy8gYW5kIGxldCBpdCBmZXRjaCBpbnRvIG1QYWNrZXRTb3VyY2VzIChub3QgbVBhY2tldFNvdXJjZXMyKQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZldGNoZXJJbmZvcy5zaXplKCk7ICsraSkgeworICAgICAgICBGZXRjaGVySW5mbyAmaW5mbyA9IG1GZXRjaGVySW5mb3MuZWRpdFZhbHVlQXQoaSk7CisgICAgICAgIGlmIChpbmZvLm1Ub0JlUmVzdW1lZCkgeworICAgICAgICAgICAgcmVzdW1lRmV0Y2hlcihtRmV0Y2hlckluZm9zLmtleUF0KGkpLCBtTmV3U3RyZWFtTWFzayk7CisgICAgICAgICAgICBpbmZvLm1Ub0JlUmVzdW1lZCA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfQogCi0gICAgbVN3aXRjaERvd25Nb25pdG9yLT5wb3N0KDEwMDAwMDBsbCk7CisgICAgQUxPR0koIiMjIyMgRmluaXNoZWQgQmFuZHdpZHRoIFN3aXRjaDogJXpkID0+ICV6ZCIsCisgICAgICAgICAgICBtT3JpZ0JhbmR3aWR0aEluZGV4LCBtQ3VyQmFuZHdpZHRoSW5kZXgpOworCisgICAgbVN0cmVhbU1hc2sgPSBtTmV3U3RyZWFtTWFzazsKKyAgICBtU3dpdGNoSW5Qcm9ncmVzcyA9IGZhbHNlOworICAgIG1PcmlnQmFuZHdpZHRoSW5kZXggPSBtQ3VyQmFuZHdpZHRoSW5kZXg7CisKKyAgICByZXN0YXJ0UG9sbEJ1ZmZlcmluZygpOwogfQogCi12b2lkIExpdmVTZXNzaW9uOjpvblN3aXRjaERvd24oKSB7Ci0gICAgaWYgKG1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzIHx8IG1Td2l0Y2hJblByb2dyZXNzIHx8IG1DdXJCYW5kd2lkdGhJbmRleCA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzc2l6ZV90IGJhbmR3aWR0aEluZGV4ID0gZ2V0QmFuZHdpZHRoSW5kZXgoKTsKLSAgICBpZiAoYmFuZHdpZHRoSW5kZXggPCBtQ3VyQmFuZHdpZHRoSW5kZXgpIHsKLSAgICAgICAgY2hhbmdlQ29uZmlndXJhdGlvbigtMSwgYmFuZHdpZHRoSW5kZXgsIGZhbHNlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQordm9pZCBMaXZlU2Vzc2lvbjo6c2NoZWR1bGVQb2xsQnVmZmVyaW5nKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQb2xsQnVmZmVyaW5nLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uKTsKKyAgICBtc2ctPnBvc3QoMTAwMDAwMGxsKTsKIH0KIAotLy8gTWFyayBzd2l0Y2ggZG9uZSB3aGVuOgotLy8gICAxLiBhbGwgb2xkIGJ1ZmZlcnMgYXJlIHN3YXBwZWQgb3V0Ci12b2lkIExpdmVTZXNzaW9uOjp0cnlUb0ZpbmlzaEJhbmR3aWR0aFN3aXRjaCgpIHsKK3ZvaWQgTGl2ZVNlc3Npb246OmNhbmNlbFBvbGxCdWZmZXJpbmcoKSB7CisgICAgKyttUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb247CisgICAgbVByZXZCdWZmZXJQZXJjZW50YWdlID0gLTE7Cit9CisKK3ZvaWQgTGl2ZVNlc3Npb246OnJlc3RhcnRQb2xsQnVmZmVyaW5nKCkgeworICAgIGNhbmNlbFBvbGxCdWZmZXJpbmcoKTsKKyAgICBvblBvbGxCdWZmZXJpbmcoKTsKK30KKwordm9pZCBMaXZlU2Vzc2lvbjo6b25Qb2xsQnVmZmVyaW5nKCkgeworICAgIEFMT0dWKCJvblBvbGxCdWZmZXJpbmc6IG1Td2l0Y2hJblByb2dyZXNzICVkLCBtUmVjb25maWd1cmF0aW9uSW5Qcm9ncmVzcyAlZCwgIgorICAgICAgICAgICAgIm1JblByZXBhcmF0aW9uUGhhc2UgJWQsIG1DdXJCYW5kd2lkdGhJbmRleCAlemQsIG1TdHJlYW1NYXNrIDB4JXgiLAorICAgICAgICBtU3dpdGNoSW5Qcm9ncmVzcywgbVJlY29uZmlndXJhdGlvbkluUHJvZ3Jlc3MsCisgICAgICAgIG1JblByZXBhcmF0aW9uUGhhc2UsIG1DdXJCYW5kd2lkdGhJbmRleCwgbVN0cmVhbU1hc2spOworCisgICAgYm9vbCB1bmRlcmZsb3csIHJlYWR5LCBkb3duLCB1cDsKKyAgICBpZiAoY2hlY2tCdWZmZXJpbmcodW5kZXJmbG93LCByZWFkeSwgZG93biwgdXApKSB7CisgICAgICAgIGlmIChtSW5QcmVwYXJhdGlvblBoYXNlKSB7CisgICAgICAgICAgICAvLyBBbGxvdyBkb3duIHN3aXRjaCBldmVuIGlmIHdlJ3JlIHN0aWxsIHByZXBhcmluZy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBTb21lIHN0cmVhbXMgaGF2ZSBhIGhpZ2ggYmFuZHdpZHRoIGluZGV4IGFzIGRlZmF1bHQsCisgICAgICAgICAgICAvLyB3aGVuIGJhbmR3aWR0aCBpcyBsb3csIGl0IHRha2VzIGEgbG9uZyB0aW1lIHRvIGJ1ZmZlcgorICAgICAgICAgICAgLy8gdG8gcmVhZHkgbWFyaywgdGhlbiBpdCBpbW1lZGlhdGVseSBwYXVzZXMgYWZ0ZXIgc3RhcnQKKyAgICAgICAgICAgIC8vIGFzIHdlIGhhdmUgdG8gZG8gYSBkb3duIHN3aXRjaC4gSXQncyBiZXR0ZXIgZXhwZXJpZW5jZQorICAgICAgICAgICAgLy8gdG8gcmVzdGFydCBmcm9tIGEgbG93ZXIgaW5kZXgsIGlmIHdlIGRldGVjdCBsb3cgYncuCisgICAgICAgICAgICBpZiAoIXN3aXRjaEJhbmR3aWR0aElmTmVlZGVkKGZhbHNlIC8qIHVwICovLCBkb3duKSAmJiByZWFkeSkgeworICAgICAgICAgICAgICAgIHBvc3RQcmVwYXJlZChPSyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1JblByZXBhcmF0aW9uUGhhc2UpIHsKKyAgICAgICAgICAgIGlmIChyZWFkeSkgeworICAgICAgICAgICAgICAgIHN0b3BCdWZmZXJpbmdJZk5lY2Vzc2FyeSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICh1bmRlcmZsb3cpIHsKKyAgICAgICAgICAgICAgICBzdGFydEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2hCYW5kd2lkdGhJZk5lZWRlZCh1cCwgZG93bik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKK30KKwordm9pZCBMaXZlU2Vzc2lvbjo6Y2FuY2VsQmFuZHdpZHRoU3dpdGNoKGJvb2wgcmVzdW1lKSB7CisgICAgQUxPR1YoImNhbmNlbEJhbmR3aWR0aFN3aXRjaDogbVN3aXRjaEdlbiglZCkrKywgb3JpZyAlemQsIGN1ciAlemQiLAorICAgICAgICAgICAgbVN3aXRjaEdlbmVyYXRpb24sIG1PcmlnQmFuZHdpZHRoSW5kZXgsIG1DdXJCYW5kd2lkdGhJbmRleCk7CiAgICAgaWYgKCFtU3dpdGNoSW5Qcm9ncmVzcykgewogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgYm9vbCBuZWVkVG9SZW1vdmVGZXRjaGVycyA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZldGNoZXJJbmZvcy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAobUZldGNoZXJJbmZvcy52YWx1ZUF0KGkpLm1Ub0JlUmVtb3ZlZCkgewotICAgICAgICAgICAgbmVlZFRvUmVtb3ZlRmV0Y2hlcnMgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIW5lZWRUb1JlbW92ZUZldGNoZXJzICYmIG1Td2FwTWFzayA9PSAwKSB7Ci0gICAgICAgIEFMT0dJKCJtU3dpdGNoSW5Qcm9ncmVzcyA9IGZhbHNlIik7Ci0gICAgICAgIG1TdHJlYW1NYXNrID0gbU5ld1N0cmVhbU1hc2s7Ci0gICAgICAgIG1Td2l0Y2hJblByb2dyZXNzID0gZmFsc2U7Ci0gICAgfQotfQotCi12b2lkIExpdmVTZXNzaW9uOjpzY2hlZHVsZUNoZWNrQmFuZHdpZHRoRXZlbnQoKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENoZWNrQmFuZHdpZHRoLCBpZCgpKTsKLSAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUNoZWNrQmFuZHdpZHRoR2VuZXJhdGlvbik7Ci0gICAgbXNnLT5wb3N0KDEwMDAwMDAwbGwpOwotfQotCi12b2lkIExpdmVTZXNzaW9uOjpjYW5jZWxDaGVja0JhbmR3aWR0aEV2ZW50KCkgewotICAgICsrbUNoZWNrQmFuZHdpZHRoR2VuZXJhdGlvbjsKLX0KLQotdm9pZCBMaXZlU2Vzc2lvbjo6Y2FuY2VsQmFuZHdpZHRoU3dpdGNoKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Td2FwTXV0ZXgpOwotICAgIG1Td2l0Y2hHZW5lcmF0aW9uKys7Ci0gICAgbVN3aXRjaEluUHJvZ3Jlc3MgPSBmYWxzZTsKLSAgICBtU3dhcE1hc2sgPSAwOwotCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmV0Y2hlckluZm9zLnNpemUoKTsgKytpKSB7CiAgICAgICAgIEZldGNoZXJJbmZvJiBpbmZvID0gbUZldGNoZXJJbmZvcy5lZGl0VmFsdWVBdChpKTsKICAgICAgICAgaWYgKGluZm8ubVRvQmVSZW1vdmVkKSB7CiAgICAgICAgICAgICBpbmZvLm1Ub0JlUmVtb3ZlZCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKHJlc3VtZSkgeworICAgICAgICAgICAgICAgIHJlc3VtZUZldGNoZXIobUZldGNoZXJJbmZvcy5rZXlBdChpKSwgbVN3YXBNYXNrKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgewotICAgICAgICBpZiAoIW1TdHJlYW1zW2ldLm1OZXdVcmkuZW1wdHkoKSkgewotICAgICAgICAgICAgc3NpemVfdCBqID0gbUZldGNoZXJJbmZvcy5pbmRleE9mS2V5KG1TdHJlYW1zW2ldLm1OZXdVcmkpOwotICAgICAgICAgICAgaWYgKGogPCAwKSB7Ci0gICAgICAgICAgICAgICAgbVN0cmVhbXNbaV0ubU5ld1VyaS5jbGVhcigpOworICAgICAgICBBU3RyaW5nIG5ld1VyaSA9IG1TdHJlYW1zW2ldLm1OZXdVcmk7CisgICAgICAgIGlmICghbmV3VXJpLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIGNsZWFyIGFsbCBtTmV3VXJpIG1hdGNoaW5nIHRoaXMgbmV3VXJpCisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gaTsgaiA8IGtNYXhTdHJlYW1zOyArK2opIHsKKyAgICAgICAgICAgICAgICBpZiAobVN0cmVhbXNbal0ubU5ld1VyaSA9PSBuZXdVcmkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0cmVhbXNbal0ubU5ld1VyaS5jbGVhcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJzdG9wcGluZyBuZXdVcmkgPSAlcyIsIG5ld1VyaS5jX3N0cigpKTsKKyAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtRmV0Y2hlckluZm9zLmluZGV4T2ZLZXkobmV3VXJpKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZGlkIG5vdCBmaW5kIGZldGNoZXIgZm9yIG5ld1VyaTogJXMiLCBuZXdVcmkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNvbnN0IEZldGNoZXJJbmZvICZpbmZvID0gbUZldGNoZXJJbmZvcy52YWx1ZUF0KGopOworICAgICAgICAgICAgRmV0Y2hlckluZm8gJmluZm8gPSBtRmV0Y2hlckluZm9zLmVkaXRWYWx1ZUF0KGluZGV4KTsKKyAgICAgICAgICAgIGluZm8ubVRvQmVSZW1vdmVkID0gdHJ1ZTsKICAgICAgICAgICAgIGluZm8ubUZldGNoZXItPnN0b3BBc3luYygpOwotICAgICAgICAgICAgbUZldGNoZXJJbmZvcy5yZW1vdmVJdGVtc0F0KGopOwotICAgICAgICAgICAgbVN0cmVhbXNbaV0ubU5ld1VyaS5jbGVhcigpOwogICAgICAgICB9CiAgICAgfQorCisgICAgQUxPR0koIiMjIyMgQ2FuY2VsZWQgQmFuZHdpZHRoIFN3aXRjaDogJXpkID0+ICV6ZCIsCisgICAgICAgICAgICBtT3JpZ0JhbmR3aWR0aEluZGV4LCBtQ3VyQmFuZHdpZHRoSW5kZXgpOworCisgICAgbVN3aXRjaEdlbmVyYXRpb24rKzsKKyAgICBtU3dpdGNoSW5Qcm9ncmVzcyA9IGZhbHNlOworICAgIG1DdXJCYW5kd2lkdGhJbmRleCA9IG1PcmlnQmFuZHdpZHRoSW5kZXg7CisgICAgbVN3YXBNYXNrID0gMDsKIH0KIAotYm9vbCBMaXZlU2Vzc2lvbjo6Y2FuU3dpdGNoQmFuZHdpZHRoVG8oc2l6ZV90IGJhbmR3aWR0aEluZGV4KSB7Ci0gICAgaWYgKG1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzIHx8IG1Td2l0Y2hJblByb2dyZXNzKSB7Citib29sIExpdmVTZXNzaW9uOjpjaGVja0J1ZmZlcmluZygKKyAgICAgICAgYm9vbCAmdW5kZXJmbG93LCBib29sICZyZWFkeSwgYm9vbCAmZG93biwgYm9vbCAmdXApIHsKKyAgICB1bmRlcmZsb3cgPSByZWFkeSA9IGRvd24gPSB1cCA9IGZhbHNlOworCisgICAgaWYgKG1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzKSB7CisgICAgICAgIEFMT0dWKCJTd2l0Y2gvUmVjb25maWcgaW4gcHJvZ3Jlc3MsIGRlZmVyIGJ1ZmZlciBwb2xsaW5nIik7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAobUN1ckJhbmR3aWR0aEluZGV4IDwgMCkgeworICAgIHNpemVfdCBhY3RpdmVDb3VudCwgdW5kZXJmbG93Q291bnQsIHJlYWR5Q291bnQsIGRvd25Db3VudCwgdXBDb3VudDsKKyAgICBhY3RpdmVDb3VudCA9IHVuZGVyZmxvd0NvdW50ID0gcmVhZHlDb3VudCA9IGRvd25Db3VudCA9IHVwQ291bnQgPTA7CisgICAgaW50MzJfdCBtaW5CdWZmZXJQZXJjZW50ID0gLTE7CisgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgIGlmIChnZXREdXJhdGlvbigmZHVyYXRpb25VcykgIT0gT0spIHsKKyAgICAgICAgZHVyYXRpb25VcyA9IC0xOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYWNrZXRTb3VyY2VzLnNpemUoKTsgKytpKSB7CisgICAgICAgIC8vIHdlIGRvbid0IGNoZWNrIHN1YnRpdGxlcyBmb3IgYnVmZmVyaW5nIGxldmVsCisgICAgICAgIGlmICghKG1TdHJlYW1NYXNrICYgbVBhY2tldFNvdXJjZXMua2V5QXQoaSkKKyAgICAgICAgICAgICAgICAmIChTVFJFQU1UWVBFX0FVRElPIHwgU1RSRUFNVFlQRV9WSURFTykpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBpZ25vcmUgc3RyZWFtcyB0aGF0IG5ldmVyIGhhZCBhbnkgcGFja2V0IHF1ZXVlZC4KKyAgICAgICAgLy8gKGl0J3MgcG9zc2libGUgdGhhdCB0aGUgdmFyaWFudCBvbmx5IGhhcyBhdWRpbyBvciB2aWRlbykKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1ldGEgPSBtUGFja2V0U291cmNlc1tpXS0+Z2V0TGF0ZXN0RW5xdWV1ZWRNZXRhKCk7CisgICAgICAgIGlmIChtZXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7CisgICAgICAgIGludDY0X3QgYnVmZmVyZWREdXJhdGlvblVzID0KKyAgICAgICAgICAgICAgICBtUGFja2V0U291cmNlc1tpXS0+Z2V0QnVmZmVyZWREdXJhdGlvblVzKCZmaW5hbFJlc3VsdCk7CisgICAgICAgIEFMT0dWKCJbJXNdIGJ1ZmZlcmVkICVsbGQgdXMiLAorICAgICAgICAgICAgICAgIGdldE5hbWVGb3JTdHJlYW0obVBhY2tldFNvdXJjZXMua2V5QXQoaSkpLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpYnVmZmVyZWREdXJhdGlvblVzKTsKKyAgICAgICAgaWYgKGR1cmF0aW9uVXMgPj0gMCkgeworICAgICAgICAgICAgaW50MzJfdCBwZXJjZW50OworICAgICAgICAgICAgaWYgKG1QYWNrZXRTb3VyY2VzW2ldLT5pc0ZpbmlzaGVkKDAgLyogZHVyYXRpb24gKi8pKSB7CisgICAgICAgICAgICAgICAgcGVyY2VudCA9IDEwMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGVyY2VudCA9IChpbnQzMl90KSgxMDAuMCAqCisgICAgICAgICAgICAgICAgICAgICAgICAobUxhc3REZXF1ZXVlZFRpbWVVcyArIGJ1ZmZlcmVkRHVyYXRpb25VcykgLyBkdXJhdGlvblVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtaW5CdWZmZXJQZXJjZW50IDwgMCB8fCBwZXJjZW50IDwgbWluQnVmZmVyUGVyY2VudCkgeworICAgICAgICAgICAgICAgIG1pbkJ1ZmZlclBlcmNlbnQgPSBwZXJjZW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKythY3RpdmVDb3VudDsKKyAgICAgICAgaW50NjRfdCByZWFkeU1hcmsgPSBtSW5QcmVwYXJhdGlvblBoYXNlID8ga1ByZXBhcmVNYXJrVXMgOiBrUmVhZHlNYXJrVXM7CisgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPiByZWFkeU1hcmsKKyAgICAgICAgICAgICAgICB8fCBtUGFja2V0U291cmNlc1tpXS0+aXNGaW5pc2hlZCgwKSkgeworICAgICAgICAgICAgKytyZWFkeUNvdW50OworICAgICAgICB9CisgICAgICAgIGlmICghbVBhY2tldFNvdXJjZXNbaV0tPmlzRmluaXNoZWQoMCkpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPCBrVW5kZXJmbG93TWFya1VzKSB7CisgICAgICAgICAgICAgICAgKyt1bmRlcmZsb3dDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPiBtVXBTd2l0Y2hNYXJrKSB7CisgICAgICAgICAgICAgICAgKyt1cENvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkRHVyYXRpb25VcyA8IG1Eb3duU3dpdGNoTWFyaykgeworICAgICAgICAgICAgICAgICsrZG93bkNvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1pbkJ1ZmZlclBlcmNlbnQgPj0gMCkgeworICAgICAgICBub3RpZnlCdWZmZXJpbmdVcGRhdGUobWluQnVmZmVyUGVyY2VudCk7CisgICAgfQorCisgICAgaWYgKGFjdGl2ZUNvdW50ID4gMCkgeworICAgICAgICB1cCAgICAgICAgPSAodXBDb3VudCA9PSBhY3RpdmVDb3VudCk7CisgICAgICAgIGRvd24gICAgICA9IChkb3duQ291bnQgPiAwKTsKKyAgICAgICAgcmVhZHkgICAgID0gKHJlYWR5Q291bnQgPT0gYWN0aXZlQ291bnQpOworICAgICAgICB1bmRlcmZsb3cgPSAodW5kZXJmbG93Q291bnQgPiAwKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgaWYgKGJhbmR3aWR0aEluZGV4ID09IChzaXplX3QpbUN1ckJhbmR3aWR0aEluZGV4KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKGJhbmR3aWR0aEluZGV4ID4gKHNpemVfdCltQ3VyQmFuZHdpZHRoSW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIGNhblN3aXRjaFVwKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIExpdmVTZXNzaW9uOjpzdGFydEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5KCkgeworICAgIEFMT0dWKCJzdGFydEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5OiBtSW5QcmVwYXJhdGlvblBoYXNlPSVkLCBtQnVmZmVyaW5nPSVkIiwKKyAgICAgICAgICAgIG1JblByZXBhcmF0aW9uUGhhc2UsIG1CdWZmZXJpbmcpOworICAgIGlmICghbUJ1ZmZlcmluZykgeworICAgICAgICBtQnVmZmVyaW5nID0gdHJ1ZTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEJ1ZmZlcmluZ1N0YXJ0KTsKKyAgICAgICAgbm90aWZ5LT5wb3N0KCk7CiAgICAgfQogfQogCi12b2lkIExpdmVTZXNzaW9uOjpvbkNoZWNrQmFuZHdpZHRoKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgc2l6ZV90IGJhbmR3aWR0aEluZGV4ID0gZ2V0QmFuZHdpZHRoSW5kZXgoKTsKLSAgICBpZiAoY2FuU3dpdGNoQmFuZHdpZHRoVG8oYmFuZHdpZHRoSW5kZXgpKSB7Ci0gICAgICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24oLTFsbCAvKiB0aW1lVXMgKi8sIGJhbmR3aWR0aEluZGV4KTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBDb21lIGJhY2sgYW5kIGNoZWNrIGFnYWluIDEwIHNlY29uZHMgbGF0ZXIgaW4gY2FzZSB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIG5vdy4KLSAgICAgICAgLy8gSWYgd2UgRE8gY2hhbmdlIGNvbmZpZ3VyYXRpb24sIG9uY2UgdGhhdCBjb21wbGV0ZXMgaXQnbGwgc2NoZWR1bGUgYSBuZXcKLSAgICAgICAgLy8gY2hlY2sgYmFuZHdpZHRoIGV2ZW50IHdpdGggYW4gaW5jcmVtZW50ZWQgbUNoZWNrQmFuZHdpZHRoR2VuZXJhdGlvbi4KLSAgICAgICAgbXNnLT5wb3N0KDEwMDAwMDAwbGwpOwordm9pZCBMaXZlU2Vzc2lvbjo6c3RvcEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5KCkgeworICAgIEFMT0dWKCJzdG9wQnVmZmVyaW5nSWZOZWNlc3Nhcnk6IG1JblByZXBhcmF0aW9uUGhhc2U9JWQsIG1CdWZmZXJpbmc9JWQiLAorICAgICAgICAgICAgbUluUHJlcGFyYXRpb25QaGFzZSwgbUJ1ZmZlcmluZyk7CisKKyAgICBpZiAobUJ1ZmZlcmluZykgeworICAgICAgICBtQnVmZmVyaW5nID0gZmFsc2U7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRCdWZmZXJpbmdFbmQpOworICAgICAgICBub3RpZnktPnBvc3QoKTsKICAgICB9CiB9CiAKK3ZvaWQgTGl2ZVNlc3Npb246Om5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZShpbnQzMl90IHBlcmNlbnRhZ2UpIHsKKyAgICBpZiAocGVyY2VudGFnZSA8IG1QcmV2QnVmZmVyUGVyY2VudGFnZSkgeworICAgICAgICBwZXJjZW50YWdlID0gbVByZXZCdWZmZXJQZXJjZW50YWdlOworICAgIH0gZWxzZSBpZiAocGVyY2VudGFnZSA+IDEwMCkgeworICAgICAgICBwZXJjZW50YWdlID0gMTAwOworICAgIH0KKworICAgIG1QcmV2QnVmZmVyUGVyY2VudGFnZSA9IHBlcmNlbnRhZ2U7CisKKyAgICBBTE9HVigibm90aWZ5QnVmZmVyaW5nVXBkYXRlOiBwZXJjZW50YWdlPSVkJSUiLCBwZXJjZW50YWdlKTsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRCdWZmZXJpbmdVcGRhdGUpOworICAgIG5vdGlmeS0+c2V0SW50MzIoInBlcmNlbnRhZ2UiLCBwZXJjZW50YWdlKTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKworYm9vbCBMaXZlU2Vzc2lvbjo6dHJ5QmFuZHdpZHRoRmFsbGJhY2soKSB7CisgICAgaWYgKG1JblByZXBhcmF0aW9uUGhhc2UgfHwgbVJlY29uZmlndXJhdGlvbkluUHJvZ3Jlc3MpIHsKKyAgICAgICAgLy8gRG9uJ3QgdHJ5IGZhbGxiYWNrIGR1cmluZyBwcmVwYXJlIG9yIHJlY29uZmlnLgorICAgICAgICAvLyBJZiBlcnJvciBoYXBwZW5zIHRoZXJlLCBpdCdzIGxpa2VseSB1bnJlY292ZXJhYmxlLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChtQ3VyQmFuZHdpZHRoSW5kZXggPiBtT3JpZ0JhbmR3aWR0aEluZGV4KSB7CisgICAgICAgIC8vIGlmIHdlJ3JlIHN3aXRjaGluZyB1cCwgc2ltcGx5IGNhbmNlbCBhbmQgcmVzdW1lIG9sZCB2YXJpYW50CisgICAgICAgIGNhbmNlbEJhbmR3aWR0aFN3aXRjaCh0cnVlIC8qIHJlc3VtZSAqLyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGlmIHdlJ3JlIHN3aXRjaGluZyBkb3duLCB3ZSdyZSBsaWtlbHkgYWJvdXQgdG8gdW5kZXJmbG93IChpZgorICAgICAgICAvLyBub3QgYWxyZWFkeSB1bmRlcmZsb3dpbmcpLiB0cnkgdGhlIGxvd2VzdCB2aWFibGUgYmFuZHdpZHRoIGlmCisgICAgICAgIC8vIG5vdCBvbiB0aGF0IHZhcmlhbnQgYWxyZWFkeS4KKyAgICAgICAgc3NpemVfdCBsb3dlc3RWYWxpZCA9IGdldExvd2VzdFZhbGlkQmFuZHdpZHRoSW5kZXgoKTsKKyAgICAgICAgaWYgKG1DdXJCYW5kd2lkdGhJbmRleCA+IGxvd2VzdFZhbGlkKSB7CisgICAgICAgICAgICBjYW5jZWxCYW5kd2lkdGhTd2l0Y2goKTsKKyAgICAgICAgICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24oLTFsbCwgbG93ZXN0VmFsaWQpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gcmV0dXJuIGZhbHNlIGlmIHdlIGNvdWxkbid0IGZpbmQgYW55IGZhbGxiYWNrCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKgorICogcmV0dXJucyB0cnVlIGlmIGEgYmFuZHdpZHRoIHN3aXRjaCBpcyBhY3R1YWxseSBuZWVkZWQgKGFuZCBzdGFydGVkKSwKKyAqIHJldHVybnMgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KK2Jvb2wgTGl2ZVNlc3Npb246OnN3aXRjaEJhbmR3aWR0aElmTmVlZGVkKGJvb2wgYnVmZmVySGlnaCwgYm9vbCBidWZmZXJMb3cpIHsKKyAgICAvLyBubyBuZWVkIHRvIGNoZWNrIGJhbmR3aWR0aCBpZiB3ZSBvbmx5IGhhdmUgMSBiYW5kd2lkdGggc2V0dGluZ3MKKyAgICBpZiAobUJhbmR3aWR0aEl0ZW1zLnNpemUoKSA8IDIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChtU3dpdGNoSW5Qcm9ncmVzcykgeworICAgICAgICBpZiAobUJ1ZmZlcmluZykgeworICAgICAgICAgICAgdHJ5QmFuZHdpZHRoRmFsbGJhY2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50MzJfdCBiYW5kd2lkdGhCcHMsIHNob3J0VGVybUJwczsKKyAgICBib29sIGlzU3RhYmxlOworICAgIGlmIChtQmFuZHdpZHRoRXN0aW1hdG9yLT5lc3RpbWF0ZUJhbmR3aWR0aCgKKyAgICAgICAgICAgICZiYW5kd2lkdGhCcHMsICZpc1N0YWJsZSwgJnNob3J0VGVybUJwcykpIHsKKyAgICAgICAgQUxPR1YoImJhbmR3aWR0aCBlc3RpbWF0ZWQgYXQgJS4yZiBrYnBzLCAiCisgICAgICAgICAgICAgICAgInN0YWJsZSAlZCwgc2hvcnRUZXJtQnBzICUuMmYga2JwcyIsCisgICAgICAgICAgICAgICAgYmFuZHdpZHRoQnBzIC8gMTAyNC4wZiwgaXNTdGFibGUsIHNob3J0VGVybUJwcyAvIDEwMjQuMGYpOworICAgICAgICBtTGFzdEJhbmR3aWR0aEJwcyA9IGJhbmR3aWR0aEJwczsKKyAgICAgICAgbUxhc3RCYW5kd2lkdGhTdGFibGUgPSBpc1N0YWJsZTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigibm8gYmFuZHdpZHRoIGVzdGltYXRlLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50MzJfdCBjdXJCYW5kd2lkdGggPSBtQmFuZHdpZHRoSXRlbXMuaXRlbUF0KG1DdXJCYW5kd2lkdGhJbmRleCkubUJhbmR3aWR0aDsKKyAgICAvLyBjYW5Td2l0aERvd24gYW5kIGNhblN3aXRjaFVwIGNhbid0IGJvdGggYmUgdHJ1ZS4KKyAgICAvLyB3ZSBvbmx5IHdhbnQgdG8gc3dpdGNoIHVwIHdoZW4gbWVhc3VyZWQgYncgaXMgMTIwJSBoaWdoZXIgdGhhbiBjdXJyZW50IHZhcmlhbnQsCisgICAgLy8gYW5kIHdlIG9ubHkgd2FudCB0byBzd2l0Y2ggZG93biB3aGVuIG1lYXN1cmVkIGJ3IGlzIGJlbG93IGN1cnJlbnQgdmFyaWFudC4KKyAgICBib29sIGNhblN3aXRjaERvd24gPSBidWZmZXJMb3cKKyAgICAgICAgICAgICYmIChiYW5kd2lkdGhCcHMgPCAoaW50MzJfdCljdXJCYW5kd2lkdGgpOworICAgIGJvb2wgY2FuU3dpdGNoVXAgPSBidWZmZXJIaWdoCisgICAgICAgICAgICAmJiAoYmFuZHdpZHRoQnBzID4gKGludDMyX3QpY3VyQmFuZHdpZHRoICogMTIgLyAxMCk7CisKKyAgICBpZiAoY2FuU3dpdGNoRG93biB8fCBjYW5Td2l0Y2hVcCkgeworICAgICAgICAvLyBiYW5kd2lkdGggZXN0aW1hdGluZyBoYXMgc29tZSBkZWxheSwgaWYgd2UgaGF2ZSB0byBkb3duc3dpdGNoIHdoZW4KKyAgICAgICAgLy8gaXQgaGFzbid0IHN0YWJpbGl6ZWQsIHVzZSB0aGUgc2hvcnQgdGVybSB0byBndWVzcyByZWFsIGJhbmR3aWR0aCwKKyAgICAgICAgLy8gc2luY2UgaXQgbWF5IGJlIGRyb3BwaW5nIHRvbyBmYXN0LgorICAgICAgICAvLyAobm90ZSB0aGlzIGRvZXNuJ3QgYXBwbHkgdG8gdXBzd2l0Y2gsIGFsd2F5cyB1c2UgbG9uZ2VyIGF2ZXJhZ2UgdGhlcmUpCisgICAgICAgIGlmICghaXNTdGFibGUgJiYgY2FuU3dpdGNoRG93bikgeworICAgICAgICAgICAgaWYgKHNob3J0VGVybUJwcyA8IGJhbmR3aWR0aEJwcykgeworICAgICAgICAgICAgICAgIGJhbmR3aWR0aEJwcyA9IHNob3J0VGVybUJwczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNzaXplX3QgYmFuZHdpZHRoSW5kZXggPSBnZXRCYW5kd2lkdGhJbmRleChiYW5kd2lkdGhCcHMpOworCisgICAgICAgIC8vIGl0J3MgcG9zc2libGUgdGhhdCB3ZSdyZSBjaGVja2luZyBmb3IgY2FuU3dpdGNoVXAgY2FzZSwgYnV0IHRoZSByZXR1cm5lZAorICAgICAgICAvLyBiYW5kd2lkdGhJbmRleCBpcyA8IG1DdXJCYW5kd2lkdGhJbmRleCwgYXMgZ2V0QmFuZHdpZHRoSW5kZXgoKSBvbmx5IHVzZXMgNzAlCisgICAgICAgIC8vIG9mIG1lYXN1cmVkIGJ3LiBJbiB0aGF0IGNhc2Ugd2UgZG9uJ3Qgd2FudCB0byBkbyBhbnl0aGluZywgc2luY2Ugd2UgaGF2ZQorICAgICAgICAvLyBib3RoIGVub3VnaCBidWZmZXIgYW5kIGVub3VnaCBidy4KKyAgICAgICAgaWYgKChjYW5Td2l0Y2hVcCAmJiBiYW5kd2lkdGhJbmRleCA+IG1DdXJCYW5kd2lkdGhJbmRleCkKKyAgICAgICAgIHx8IChjYW5Td2l0Y2hEb3duICYmIGJhbmR3aWR0aEluZGV4IDwgbUN1ckJhbmR3aWR0aEluZGV4KSkgeworICAgICAgICAgICAgLy8gaWYgbm90IHlldCBwcmVwYXJlZCwganVzdCByZXN0YXJ0IGFnYWluIHdpdGggbmV3IGJ3IGluZGV4LgorICAgICAgICAgICAgLy8gdGhpcyBpcyBmYXN0ZXIgYW5kIHBsYXliYWNrIGV4cGVyaWVuY2UgaXMgY2xlYW5lci4KKyAgICAgICAgICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24oCisgICAgICAgICAgICAgICAgICAgIG1JblByZXBhcmF0aW9uUGhhc2UgPyAwIDogLTFsbCwgYmFuZHdpZHRoSW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIExpdmVTZXNzaW9uOjpwb3N0RXJyb3Ioc3RhdHVzX3QgZXJyKSB7CisgICAgLy8gaWYgd2UgcmVhY2hlZCBFT1MsIG5vdGlmeSBidWZmZXJpbmcgb2YgMTAwJQorICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBub3RpZnlCdWZmZXJpbmdVcGRhdGUoMTAwKTsKKyAgICB9CisgICAgLy8gd2UnbGwgc3RvcCBidWZmZXIgcG9sbGluZyBub3csIGJlZm9yZSB0aGF0IG5vdGlmeQorICAgIC8vIHN0b3AgYnVmZmVyaW5nIHRvIHN0b3AgdGhlIHNwaW5uaW5nIGljb24KKyAgICBzdG9wQnVmZmVyaW5nSWZOZWNlc3NhcnkoKTsKKyAgICBjYW5jZWxQb2xsQnVmZmVyaW5nKCk7CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RXJyb3IpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgbm90aWZ5LT5wb3N0KCk7Cit9CisKIHZvaWQgTGl2ZVNlc3Npb246OnBvc3RQcmVwYXJlZChzdGF0dXNfdCBlcnIpIHsKICAgICBDSEVDSyhtSW5QcmVwYXJhdGlvblBoYXNlKTsKIApAQCAtMTc2NCw2ICsyMzc3LDggQEAKICAgICBpZiAoZXJyID09IE9LIHx8IGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CiAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFByZXBhcmVkKTsKICAgICB9IGVsc2UgeworICAgICAgICBjYW5jZWxQb2xsQnVmZmVyaW5nKCk7CisKICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UHJlcGFyYXRpb25GYWlsZWQpOwogICAgICAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBlcnIpOwogICAgIH0KQEAgLTE3NzEsMTAgKzIzODYsOCBAQAogICAgIG5vdGlmeS0+cG9zdCgpOwogCiAgICAgbUluUHJlcGFyYXRpb25QaGFzZSA9IGZhbHNlOwotCi0gICAgbVN3aXRjaERvd25Nb25pdG9yID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2hlY2tTd2l0Y2hEb3duLCBpZCgpKTsKLSAgICBtU3dpdGNoRG93bk1vbml0b3ItPnBvc3QoKTsKIH0KIAorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uaAppbmRleCAyZDNhMjVhLi45MGQ1NmQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmgKQEAgLTIzLDQzICsyMyw2MiBAQAogCiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCisjaW5jbHVkZSAibXBlZzJ0cy9BVFNQYXJzZXIuaCIKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUJ1ZmZlcjsKK3N0cnVjdCBBUmVwbHlUb2tlbjsKIHN0cnVjdCBBbm90aGVyUGFja2V0U291cmNlOwotc3RydWN0IERhdGFTb3VyY2U7CitjbGFzcyBEYXRhU291cmNlOwogc3RydWN0IEhUVFBCYXNlOwogc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOwogc3RydWN0IExpdmVEYXRhU291cmNlOwogc3RydWN0IE0zVVBhcnNlcjsKIHN0cnVjdCBQbGF5bGlzdEZldGNoZXI7CitzdHJ1Y3QgSExTVGltZTsKK3N0cnVjdCBIVFRQRG93bmxvYWRlcjsKIAogc3RydWN0IExpdmVTZXNzaW9uIDogcHVibGljIEFIYW5kbGVyIHsKICAgICBlbnVtIEZsYWdzIHsKICAgICAgICAgLy8gRG9uJ3QgbG9nIGFueSBVUkxzLgogICAgICAgICBrRmxhZ0luY29nbml0byA9IDEsCiAgICAgfTsKLSAgICBMaXZlU2Vzc2lvbigKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCi0gICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKTsKIAogICAgIGVudW0gU3RyZWFtSW5kZXggewogICAgICAgICBrQXVkaW9JbmRleCAgICA9IDAsCiAgICAgICAgIGtWaWRlb0luZGV4ICAgID0gMSwKICAgICAgICAga1N1YnRpdGxlSW5kZXggPSAyLAogICAgICAgICBrTWF4U3RyZWFtcyAgICA9IDMsCisgICAgICAgIGtNZXRhRGF0YUluZGV4ID0gMywKKyAgICAgICAga051bVNvdXJjZXMgICAgPSA0LAogICAgIH07CiAKICAgICBlbnVtIFN0cmVhbVR5cGUgewogICAgICAgICBTVFJFQU1UWVBFX0FVRElPICAgICAgICA9IDEgPDwga0F1ZGlvSW5kZXgsCiAgICAgICAgIFNUUkVBTVRZUEVfVklERU8gICAgICAgID0gMSA8PCBrVmlkZW9JbmRleCwKICAgICAgICAgU1RSRUFNVFlQRV9TVUJUSVRMRVMgICAgPSAxIDw8IGtTdWJ0aXRsZUluZGV4LAorICAgICAgICBTVFJFQU1UWVBFX01FVEFEQVRBICAgICA9IDEgPDwga01ldGFEYXRhSW5kZXgsCiAgICAgfTsKKworICAgIGVudW0gU2Vla01vZGUgeworICAgICAgICBrU2Vla01vZGVFeGFjdFBvc2l0aW9uID0gMCwgLy8gdXNlZCBmb3Igc2Vla2luZworICAgICAgICBrU2Vla01vZGVOZXh0U2FtcGxlICAgID0gMSwgLy8gdXNlZCBmb3Igc2VhbWxlc3Mgc3dpdGNoaW5nCisgICAgICAgIGtTZWVrTW9kZU5leHRTZWdtZW50ICAgPSAyLCAvLyB1c2VkIGZvciBzZWFtbGVzcyBzd2l0Y2hpbmcKKyAgICB9OworCisgICAgTGl2ZVNlc3Npb24oCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSk7CisKKyAgICBpbnQ2NF90IGNhbGN1bGF0ZU1lZGlhVGltZVVzKGludDY0X3QgZmlyc3RUaW1lVXMsIGludDY0X3QgdGltZVVzLCBpbnQzMl90IGRpc2NvbnRpbnVpdHlTZXEpOwogICAgIHN0YXR1c190IGRlcXVldWVBY2Nlc3NVbml0KFN0cmVhbVR5cGUgc3RyZWFtLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCk7CiAKICAgICBzdGF0dXNfdCBnZXRTdHJlYW1Gb3JtYXQoU3RyZWFtVHlwZSBzdHJlYW0sIHNwPEFNZXNzYWdlPiAqZm9ybWF0KTsKIAorICAgIHNwPEhUVFBEb3dubG9hZGVyPiBnZXRIVFRQRG93bmxvYWRlcigpOworCiAgICAgdm9pZCBjb25uZWN0QXN5bmMoCiAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpOwpAQCAtNzgsMTggKzk3LDIxIEBACiAgICAgYm9vbCBpc1NlZWthYmxlKCkgY29uc3Q7CiAgICAgYm9vbCBoYXNEeW5hbWljRHVyYXRpb24oKSBjb25zdDsKIAorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRLZXlGb3JTdHJlYW0oU3RyZWFtVHlwZSB0eXBlKTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0TmFtZUZvclN0cmVhbShTdHJlYW1UeXBlIHR5cGUpOworICAgIHN0YXRpYyBBVFNQYXJzZXI6OlNvdXJjZVR5cGUgZ2V0U291cmNlVHlwZUZvclN0cmVhbShTdHJlYW1UeXBlIHR5cGUpOworCiAgICAgZW51bSB7CiAgICAgICAgIGtXaGF0U3RyZWFtc0NoYW5nZWQsCiAgICAgICAgIGtXaGF0RXJyb3IsCiAgICAgICAgIGtXaGF0UHJlcGFyZWQsCiAgICAgICAgIGtXaGF0UHJlcGFyYXRpb25GYWlsZWQsCisgICAgICAgIGtXaGF0QnVmZmVyaW5nU3RhcnQsCisgICAgICAgIGtXaGF0QnVmZmVyaW5nRW5kLAorICAgICAgICBrV2hhdEJ1ZmZlcmluZ1VwZGF0ZSwKKyAgICAgICAga1doYXRNZXRhZGF0YURldGVjdGVkLAogICAgIH07CiAKLSAgICAvLyBjcmVhdGUgYSBmb3JtYXQtY2hhbmdlIGRpc2NvbnRpbnVpdHkKLSAgICAvLwotICAgIC8vIHN3YXA6Ci0gICAgLy8gICB3aGV0aGVyIGlzIGZvcm1hdC1jaGFuZ2UgZGlzY29udGludWl0eSBzaG91bGQgdHJpZ2dlciBhIGJ1ZmZlciBzd2FwCi0gICAgc3A8QUJ1ZmZlcj4gY3JlYXRlRm9ybWF0Q2hhbmdlQnVmZmVyKGJvb2wgc3dhcCA9IHRydWUpOwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkxpdmVTZXNzaW9uKCk7CiAKQEAgLTEwMyw0NiArMTI1LDU2IEBACiAgICAgICAgIGtXaGF0RGlzY29ubmVjdCAgICAgICAgICAgICAgICAgPSAnZGlzYycsCiAgICAgICAgIGtXaGF0U2VlayAgICAgICAgICAgICAgICAgICAgICAgPSAnc2VlaycsCiAgICAgICAgIGtXaGF0RmV0Y2hlck5vdGlmeSAgICAgICAgICAgICAgPSAnbm90ZicsCi0gICAgICAgIGtXaGF0Q2hlY2tCYW5kd2lkdGggICAgICAgICAgICAgPSAnYm5kdycsCiAgICAgICAgIGtXaGF0Q2hhbmdlQ29uZmlndXJhdGlvbiAgICAgICAgPSAnY2hDMCcsCiAgICAgICAgIGtXaGF0Q2hhbmdlQ29uZmlndXJhdGlvbjIgICAgICAgPSAnY2hDMicsCiAgICAgICAgIGtXaGF0Q2hhbmdlQ29uZmlndXJhdGlvbjMgICAgICAgPSAnY2hDMycsCi0gICAgICAgIGtXaGF0RmluaXNoRGlzY29ubmVjdDIgICAgICAgICAgPSAnZmluMicsCi0gICAgICAgIGtXaGF0U3dhcHBlZCAgICAgICAgICAgICAgICAgICAgPSAnc3dhcCcsCi0gICAgICAgIGtXaGF0Q2hlY2tTd2l0Y2hEb3duICAgICAgICAgICAgPSAnY2tTRCcsCi0gICAgICAgIGtXaGF0U3dpdGNoRG93biAgICAgICAgICAgICAgICAgPSAnc0R3bicsCisgICAgICAgIGtXaGF0UG9sbEJ1ZmZlcmluZyAgICAgICAgICAgICAgPSAncG9sbCcsCiAgICAgfTsKIAotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0JhbmR3aWR0aEhpc3RvcnlCeXRlczsKKyAgICAvLyBCYW5kd2lkdGggU3dpdGNoIE1hcmsgRGVmYXVsdHMKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrVXBTd2l0Y2hNYXJrVXM7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga0Rvd25Td2l0Y2hNYXJrVXM7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1VwU3dpdGNoTWFyZ2luVXM7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1Jlc3VtZVRocmVzaG9sZFVzOwogCisgICAgLy8gQnVmZmVyIFByZXBhcmUvUmVhZHkvVW5kZXJmbG93IE1hcmtzCisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1JlYWR5TWFya1VzOworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtQcmVwYXJlTWFya1VzOworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtVbmRlcmZsb3dNYXJrVXM7CisKKyAgICBzdHJ1Y3QgQmFuZHdpZHRoRXN0aW1hdG9yOwogICAgIHN0cnVjdCBCYW5kd2lkdGhJdGVtIHsKICAgICAgICAgc2l6ZV90IG1QbGF5bGlzdEluZGV4OwogICAgICAgICB1bnNpZ25lZCBsb25nIG1CYW5kd2lkdGg7CisgICAgICAgIGludDY0X3QgbUxhc3RGYWlsdXJlVXM7CiAgICAgfTsKIAogICAgIHN0cnVjdCBGZXRjaGVySW5mbyB7CiAgICAgICAgIHNwPFBsYXlsaXN0RmV0Y2hlcj4gbUZldGNoZXI7CiAgICAgICAgIGludDY0X3QgbUR1cmF0aW9uVXM7Ci0gICAgICAgIGJvb2wgbUlzUHJlcGFyZWQ7CiAgICAgICAgIGJvb2wgbVRvQmVSZW1vdmVkOworICAgICAgICBib29sIG1Ub0JlUmVzdW1lZDsKICAgICB9OwogCiAgICAgc3RydWN0IFN0cmVhbUl0ZW0gewogICAgICAgICBjb25zdCBjaGFyICptVHlwZTsKICAgICAgICAgQVN0cmluZyBtVXJpLCBtTmV3VXJpOworICAgICAgICBTZWVrTW9kZSBtU2Vla01vZGU7CiAgICAgICAgIHNpemVfdCBtQ3VyRGlzY29udGludWl0eVNlcTsKICAgICAgICAgaW50NjRfdCBtTGFzdERlcXVldWVkVGltZVVzOwogICAgICAgICBpbnQ2NF90IG1MYXN0U2FtcGxlRHVyYXRpb25VczsKICAgICAgICAgU3RyZWFtSXRlbSgpCi0gICAgICAgICAgICA6IG1UeXBlKCIiKSwKLSAgICAgICAgICAgICAgbUN1ckRpc2NvbnRpbnVpdHlTZXEoMCksCi0gICAgICAgICAgICAgIG1MYXN0RGVxdWV1ZWRUaW1lVXMoMCksCi0gICAgICAgICAgICAgIG1MYXN0U2FtcGxlRHVyYXRpb25VcygwKSB7fQorICAgICAgICAgICAgOiBTdHJlYW1JdGVtKCIiKSB7fQogICAgICAgICBTdHJlYW1JdGVtKGNvbnN0IGNoYXIgKnR5cGUpCiAgICAgICAgICAgICA6IG1UeXBlKHR5cGUpLAotICAgICAgICAgICAgICBtQ3VyRGlzY29udGludWl0eVNlcSgwKSwKLSAgICAgICAgICAgICAgbUxhc3REZXF1ZXVlZFRpbWVVcygwKSwKLSAgICAgICAgICAgICAgbUxhc3RTYW1wbGVEdXJhdGlvblVzKDApIHt9CisgICAgICAgICAgICAgIG1TZWVrTW9kZShrU2Vla01vZGVFeGFjdFBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgICByZXNldCgpOworICAgICAgICAgICAgICB9CisgICAgICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBtQ3VyRGlzY29udGludWl0eVNlcSA9IDA7CisgICAgICAgICAgICBtTGFzdERlcXVldWVkVGltZVVzID0gLTFsbDsKKyAgICAgICAgICAgIG1MYXN0U2FtcGxlRHVyYXRpb25VcyA9IDBsbDsKKyAgICAgICAgfQogICAgICAgICBBU3RyaW5nIHVyaUtleSgpIHsKICAgICAgICAgICAgIEFTdHJpbmcga2V5KG1UeXBlKTsKICAgICAgICAgICAgIGtleS5hcHBlbmQoIlVSSSIpOwpAQCAtMTU1LDE5ICsxODcsMjcgQEAKICAgICB1aW50MzJfdCBtRmxhZ3M7CiAgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IG1IVFRQU2VydmljZTsKIAorICAgIGJvb2wgbUJ1ZmZlcmluZzsKICAgICBib29sIG1JblByZXBhcmF0aW9uUGhhc2U7Ci0gICAgYm9vbCBtQnVmZmVyaW5nW2tNYXhTdHJlYW1zXTsKKyAgICBpbnQzMl90IG1Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbjsKKyAgICBpbnQzMl90IG1QcmV2QnVmZmVyUGVyY2VudGFnZTsKIAotICAgIHNwPEhUVFBCYXNlPiBtSFRUUERhdGFTb3VyY2U7CiAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUV4dHJhSGVhZGVyczsKIAogICAgIEFTdHJpbmcgbU1hc3RlclVSTDsKIAogICAgIFZlY3RvcjxCYW5kd2lkdGhJdGVtPiBtQmFuZHdpZHRoSXRlbXM7CiAgICAgc3NpemVfdCBtQ3VyQmFuZHdpZHRoSW5kZXg7CisgICAgc3NpemVfdCBtT3JpZ0JhbmR3aWR0aEluZGV4OworICAgIGludDMyX3QgbUxhc3RCYW5kd2lkdGhCcHM7CisgICAgYm9vbCBtTGFzdEJhbmR3aWR0aFN0YWJsZTsKKyAgICBzcDxCYW5kd2lkdGhFc3RpbWF0b3I+IG1CYW5kd2lkdGhFc3RpbWF0b3I7CiAKICAgICBzcDxNM1VQYXJzZXI+IG1QbGF5bGlzdDsKKyAgICBpbnQzMl90IG1NYXhXaWR0aDsKKyAgICBpbnQzMl90IG1NYXhIZWlnaHQ7CiAKKyAgICBzcDxBTG9vcGVyPiBtRmV0Y2hlckxvb3BlcjsKICAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBGZXRjaGVySW5mbz4gbUZldGNoZXJJbmZvczsKICAgICB1aW50MzJfdCBtU3RyZWFtTWFzazsKIApAQCAtMTgwLDE3ICsyMjAsMTAgQEAKICAgICAvLyB3ZSB1c2UgdGhpcyB0byB0cmFjayByZWNvbmZpZ3VyYXRpb24gcHJvZ3Jlc3MuCiAgICAgdWludDMyX3QgbVN3YXBNYXNrOwogCi0gICAgS2V5ZWRWZWN0b3I8U3RyZWFtVHlwZSwgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gPiBtRGlzY29udGludWl0aWVzOwogICAgIEtleWVkVmVjdG9yPFN0cmVhbVR5cGUsIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ID4gbVBhY2tldFNvdXJjZXM7CiAgICAgLy8gQSBzZWNvbmQgc2V0IG9mIHBhY2tldCBzb3VyY2VzIHRoYXQgYnVmZmVyIGNvbnRlbnQgZm9yIHRoZSB2YXJpYW50IHdlJ3JlIHN3aXRjaGluZyB0by4KICAgICBLZXllZFZlY3RvcjxTdHJlYW1UeXBlLCBzcDxBbm90aGVyUGFja2V0U291cmNlPiA+IG1QYWNrZXRTb3VyY2VzMjsKIAotICAgIC8vIEEgbXV0ZXggdXNlZCB0byBzZXJpYWxpemUgdHdvIHNldHMgb2YgZXZlbnRzOgotICAgIC8vICogdGhlIHN3YXBwaW5nIG9mIHBhY2tldCBzb3VyY2VzIGluIGRlcXVldWVBY2Nlc3NVbml0IG9uIHRoZSBwbGF5ZXIgdGhyZWFkLCBBTkQKLSAgICAvLyAqIGEgZm9yY2VkIGJhbmR3aWR0aCBzd2l0Y2ggdGVybWluYXRpb24gaW4gY2FuY2VsU3dpdGNoIG9uIHRoZSBsaXZlIGxvb3Blci4KLSAgICBNdXRleCBtU3dhcE11dGV4OwotCi0gICAgaW50MzJfdCBtQ2hlY2tCYW5kd2lkdGhHZW5lcmF0aW9uOwogICAgIGludDMyX3QgbVN3aXRjaEdlbmVyYXRpb247CiAgICAgaW50MzJfdCBtU3VidGl0bGVHZW5lcmF0aW9uOwogCkBAIC0yMDMsODAgKzIzNiw3NiBAQAogCiAgICAgYm9vbCBtUmVjb25maWd1cmF0aW9uSW5Qcm9ncmVzczsKICAgICBib29sIG1Td2l0Y2hJblByb2dyZXNzOwotICAgIHVpbnQzMl90IG1EaXNjb25uZWN0UmVwbHlJRDsKLSAgICB1aW50MzJfdCBtU2Vla1JlcGx5SUQ7CisgICAgaW50NjRfdCBtVXBTd2l0Y2hNYXJrOworICAgIGludDY0X3QgbURvd25Td2l0Y2hNYXJrOworICAgIGludDY0X3QgbVVwU3dpdGNoTWFyZ2luOworCisgICAgc3A8QVJlcGx5VG9rZW4+IG1EaXNjb25uZWN0UmVwbHlJRDsKKyAgICBzcDxBUmVwbHlUb2tlbj4gbVNlZWtSZXBseUlEOwogCiAgICAgYm9vbCBtRmlyc3RUaW1lVXNWYWxpZDsKICAgICBpbnQ2NF90IG1GaXJzdFRpbWVVczsKICAgICBpbnQ2NF90IG1MYXN0U2Vla1RpbWVVczsKLSAgICBzcDxBTWVzc2FnZT4gbVN3aXRjaERvd25Nb25pdG9yOworICAgIGJvb2wgbUhhc01ldGFkYXRhOworCiAgICAgS2V5ZWRWZWN0b3I8c2l6ZV90LCBpbnQ2NF90PiBtRGlzY29udGludWl0eUFic1N0YXJ0VGltZXNVczsKICAgICBLZXllZFZlY3RvcjxzaXplX3QsIGludDY0X3Q+IG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVczsKIAogICAgIHNwPFBsYXlsaXN0RmV0Y2hlcj4gYWRkRmV0Y2hlcihjb25zdCBjaGFyICp1cmkpOwogCiAgICAgdm9pZCBvbkNvbm5lY3QoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotICAgIHN0YXR1c190IG9uU2Vlayhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0gICAgdm9pZCBvbkZpbmlzaERpc2Nvbm5lY3QyKCk7CisgICAgdm9pZCBvbk1hc3RlclBsYXlsaXN0RmV0Y2hlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvblNlZWsoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCi0gICAgLy8gSWYgZ2l2ZW4gYSBub24temVybyBibG9ja19zaXplIChkZWZhdWx0IDApLCBpdCBpcyB1c2VkIHRvIGNhcCB0aGUgbnVtYmVyIG9mCi0gICAgLy8gYnl0ZXMgcmVhZCBpbiBmcm9tIHRoZSBEYXRhU291cmNlLiBJZiBnaXZlbiBhIG5vbi1OVUxMIGJ1ZmZlciwgbmV3IGNvbnRlbnQKLSAgICAvLyBpcyByZWFkIGludG8gdGhlIGVuZC4KLSAgICAvLwotICAgIC8vIFRoZSBEYXRhU291cmNlIHdlIHJlYWQgZnJvbSBpcyByZXNwb25zaWJsZSBmb3Igc2lnbmFsaW5nIGVycm9yIG9yIEVPRiB0byBoZWxwIHVzCi0gICAgLy8gYnJlYWsgb3V0IG9mIHRoZSByZWFkIGxvb3AuIFRoZSBEYXRhU291cmNlIGNhbiBiZSByZXR1cm5lZCB0byB0aGUgY2FsbGVyLCBzbwotICAgIC8vIHRoYXQgdGhlIGNhbGxlciBjYW4gcmV1c2UgaXQgZm9yIHN1YnNlcXVlbnQgZmV0Y2hlcyAod2l0aGluIHRoZSBpbml0aWFsbHkKLSAgICAvLyByZXF1ZXN0ZWQgcmFuZ2UpLgotICAgIC8vCi0gICAgLy8gRm9yIHJldXNlZCBIVFRQIHNvdXJjZXMsIHRoZSBjYWxsZXIgbXVzdCBkb3dubG9hZCBhIGZpbGUgc2VxdWVudGlhbGx5IHdpdGhvdXQKLSAgICAvLyBhbnkgb3ZlcmxhcHMgb3IgZ2FwcyB0byBwcmV2ZW50IHJlY29ubmVjdGlvbi4KLSAgICBzc2l6ZV90IGZldGNoRmlsZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgc3A8QUJ1ZmZlcj4gKm91dCwKLSAgICAgICAgICAgIC8qIHJlcXVlc3Qvb3BlbiBhIGZpbGUgc3RhcnRpbmcgYXQgcmFuZ2Vfb2Zmc2V0IGZvciByYW5nZV9sZW5ndGggYnl0ZXMgKi8KLSAgICAgICAgICAgIGludDY0X3QgcmFuZ2Vfb2Zmc2V0ID0gMCwgaW50NjRfdCByYW5nZV9sZW5ndGggPSAtMSwKLSAgICAgICAgICAgIC8qIGRvd25sb2FkIGJsb2NrIHNpemUgKi8KLSAgICAgICAgICAgIHVpbnQzMl90IGJsb2NrX3NpemUgPSAwLAotICAgICAgICAgICAgLyogcmV1c2UgRGF0YVNvdXJjZSBpZiBkb2luZyBwYXJ0aWFsIGZldGNoICovCi0gICAgICAgICAgICBzcDxEYXRhU291cmNlPiAqc291cmNlID0gTlVMTCwKLSAgICAgICAgICAgIFN0cmluZzggKmFjdHVhbFVybCA9IE5VTEwpOworICAgIGJvb2wgVXJpSXNTYW1lQXNJbmRleCggY29uc3QgQVN0cmluZyAmdXJpLCBpbnQzMl90IGluZGV4LCBib29sIG5ld1VyaSk7CisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gZ2V0UGFja2V0U291cmNlRm9yU3RyZWFtSW5kZXgoc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgbmV3VXJpKTsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBnZXRNZXRhZGF0YVNvdXJjZSgKKyAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZXNba051bVNvdXJjZXNdLCB1aW50MzJfdCBzdHJlYW1NYXNrLCBib29sIG5ld1VyaSk7CiAKLSAgICBzcDxNM1VQYXJzZXI+IGZldGNoUGxheWxpc3QoCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIHVpbnQ4X3QgKmN1clBsYXlsaXN0SGFzaCwgYm9vbCAqdW5jaGFuZ2VkKTsKKyAgICBib29sIHJlc3VtZUZldGNoZXIoCisgICAgICAgICAgICBjb25zdCBBU3RyaW5nICZ1cmksIHVpbnQzMl90IHN0cmVhbU1hc2ssCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IC0xbGwsIGJvb2wgbmV3VXJpID0gZmFsc2UpOwogCi0gICAgc2l6ZV90IGdldEJhbmR3aWR0aEluZGV4KCk7Ci0gICAgaW50NjRfdCBsYXRlc3RNZWRpYVNlZ21lbnRTdGFydFRpbWVVcygpOworICAgIGZsb2F0IGdldEFib3J0VGhyZXNob2xkKAorICAgICAgICAgICAgc3NpemVfdCBjdXJyZW50QldJbmRleCwgc3NpemVfdCB0YXJnZXRCV0luZGV4KSBjb25zdDsKKyAgICB2b2lkIGFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KHNpemVfdCBudW1CeXRlcywgaW50NjRfdCBkZWxheVVzKTsKKyAgICBzaXplX3QgZ2V0QmFuZHdpZHRoSW5kZXgoaW50MzJfdCBiYW5kd2lkdGhCcHMpOworICAgIHNzaXplX3QgZ2V0TG93ZXN0VmFsaWRCYW5kd2lkdGhJbmRleCgpIGNvbnN0OworICAgIEhMU1RpbWUgbGF0ZXN0TWVkaWFTZWdtZW50U3RhcnRUaW1lKCkgY29uc3Q7CiAKKyAgICBzdGF0aWMgYm9vbCBpc0JhbmR3aWR0aFZhbGlkKGNvbnN0IEJhbmR3aWR0aEl0ZW0gJml0ZW0pOwogICAgIHN0YXRpYyBpbnQgU29ydEJ5QmFuZHdpZHRoKGNvbnN0IEJhbmR3aWR0aEl0ZW0gKiwgY29uc3QgQmFuZHdpZHRoSXRlbSAqKTsKICAgICBzdGF0aWMgU3RyZWFtVHlwZSBpbmRleFRvVHlwZShpbnQgaWR4KTsKICAgICBzdGF0aWMgc3NpemVfdCB0eXBlVG9JbmRleChpbnQzMl90IHR5cGUpOwogCiAgICAgdm9pZCBjaGFuZ2VDb25maWd1cmF0aW9uKAotICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsIHNpemVfdCBiYW5kd2lkdGhJbmRleCwgYm9vbCBwaWNrVHJhY2sgPSBmYWxzZSk7CisgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgc3NpemVfdCBid0luZGV4ID0gLTEsIGJvb2wgcGlja1RyYWNrID0gZmFsc2UpOwogICAgIHZvaWQgb25DaGFuZ2VDb25maWd1cmF0aW9uKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICB2b2lkIG9uQ2hhbmdlQ29uZmlndXJhdGlvbjIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHZvaWQgb25DaGFuZ2VDb25maWd1cmF0aW9uMyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0gICAgdm9pZCBvblN3YXBwZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotICAgIHZvaWQgb25DaGVja1N3aXRjaERvd24oKTsKLSAgICB2b2lkIG9uU3dpdGNoRG93bigpOwotICAgIHZvaWQgdHJ5VG9GaW5pc2hCYW5kd2lkdGhTd2l0Y2goKTsKIAotICAgIHZvaWQgc2NoZWR1bGVDaGVja0JhbmR3aWR0aEV2ZW50KCk7Ci0gICAgdm9pZCBjYW5jZWxDaGVja0JhbmR3aWR0aEV2ZW50KCk7CisgICAgdm9pZCBzd2FwUGFja2V0U291cmNlKFN0cmVhbVR5cGUgc3RyZWFtKTsKKyAgICB2b2lkIHRyeVRvRmluaXNoQmFuZHdpZHRoU3dpdGNoKGNvbnN0IEFTdHJpbmcgJm9sZFVyaSk7CisgICAgdm9pZCBjYW5jZWxCYW5kd2lkdGhTd2l0Y2goYm9vbCByZXN1bWUgPSBmYWxzZSk7CisgICAgYm9vbCBjaGVja1N3aXRjaFByb2dyZXNzKAorICAgICAgICAgICAgc3A8QU1lc3NhZ2U+ICZtc2csIGludDY0X3QgZGVsYXlVcywgYm9vbCAqbmVlZFJlc3VtZVVudGlsKTsKIAotICAgIC8vIGNhbmNlbEJhbmR3aWR0aFN3aXRjaCBpcyBhdG9taWMgd3J0IHN3YXBQYWNrZXRTb3VyY2U7IGNhbGwgaXQgdG8gcHJldmVudCBwYWNrZXQgc291cmNlcwotICAgIC8vIGZyb20gYmVpbmcgc3dhcHBlZCBvdXQgb24gc3RhbGUgZGlzY29udGludWl0aWVzIHdoaWxlIG1hbmlwdWxhdGluZwotICAgIC8vIG1QYWNrZXRTb3VyY2VzL21QYWNrZXRTb3VyY2VzMi4KLSAgICB2b2lkIGNhbmNlbEJhbmR3aWR0aFN3aXRjaCgpOworICAgIGJvb2wgc3dpdGNoQmFuZHdpZHRoSWZOZWVkZWQoYm9vbCBidWZmZXJIaWdoLCBib29sIGJ1ZmZlckxvdyk7CisgICAgYm9vbCB0cnlCYW5kd2lkdGhGYWxsYmFjaygpOwogCi0gICAgYm9vbCBjYW5Td2l0Y2hCYW5kd2lkdGhUbyhzaXplX3QgYmFuZHdpZHRoSW5kZXgpOwotICAgIHZvaWQgb25DaGVja0JhbmR3aWR0aChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKKyAgICB2b2lkIGNhbmNlbFBvbGxCdWZmZXJpbmcoKTsKKyAgICB2b2lkIHJlc3RhcnRQb2xsQnVmZmVyaW5nKCk7CisgICAgdm9pZCBvblBvbGxCdWZmZXJpbmcoKTsKKyAgICBib29sIGNoZWNrQnVmZmVyaW5nKGJvb2wgJnVuZGVyZmxvdywgYm9vbCAmcmVhZHksIGJvb2wgJmRvd24sIGJvb2wgJnVwKTsKKyAgICB2b2lkIHN0YXJ0QnVmZmVyaW5nSWZOZWNlc3NhcnkoKTsKKyAgICB2b2lkIHN0b3BCdWZmZXJpbmdJZk5lY2Vzc2FyeSgpOworICAgIHZvaWQgbm90aWZ5QnVmZmVyaW5nVXBkYXRlKGludDMyX3QgcGVyY2VudGFnZSk7CiAKICAgICB2b2lkIGZpbmlzaERpc2Nvbm5lY3QoKTsKIAogICAgIHZvaWQgcG9zdFByZXBhcmVkKHN0YXR1c190IGVycik7Ci0KLSAgICB2b2lkIHN3YXBQYWNrZXRTb3VyY2UoU3RyZWFtVHlwZSBzdHJlYW0pOwotICAgIGJvb2wgY2FuU3dpdGNoVXAoKTsKKyAgICB2b2lkIHBvc3RFcnJvcihzdGF0dXNfdCBlcnIpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTGl2ZVNlc3Npb24pOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCmluZGV4IDk5N2I2OTQuLmZmMmJiMjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcApAQCAtMjUwLDcgKzI1MCwxMSBAQAogICAgICAgbUlzVmFyaWFudFBsYXlsaXN0KGZhbHNlKSwKICAgICAgIG1Jc0NvbXBsZXRlKGZhbHNlKSwKICAgICAgIG1Jc0V2ZW50KGZhbHNlKSwKKyAgICAgIG1GaXJzdFNlcU51bWJlcigtMSksCisgICAgICBtTGFzdFNlcU51bWJlcigtMSksCisgICAgICBtVGFyZ2V0RHVyYXRpb25VcygtMWxsKSwKICAgICAgIG1EaXNjb250aW51aXR5U2VxKDApLAorICAgICAgbURpc2NvbnRpbnVpdHlDb3VudCgwKSwKICAgICAgIG1TZWxlY3RlZEluZGV4KC0xKSB7CiAgICAgbUluaXRDaGVjayA9IHBhcnNlKGRhdGEsIHNpemUpOwogfQpAQCAtMjgyLDYgKzI4NiwxOSBAQAogICAgIHJldHVybiBtRGlzY29udGludWl0eVNlcTsKIH0KIAoraW50NjRfdCBNM1VQYXJzZXI6OmdldFRhcmdldER1cmF0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBtVGFyZ2V0RHVyYXRpb25VczsKK30KKworaW50MzJfdCBNM1VQYXJzZXI6OmdldEZpcnN0U2VxTnVtYmVyKCkgY29uc3QgeworICAgIHJldHVybiBtRmlyc3RTZXFOdW1iZXI7Cit9CisKK3ZvaWQgTTNVUGFyc2VyOjpnZXRTZXFOdW1iZXJSYW5nZShpbnQzMl90ICpmaXJzdFNlcSwgaW50MzJfdCAqbGFzdFNlcSkgY29uc3QgeworICAgICpmaXJzdFNlcSA9IG1GaXJzdFNlcU51bWJlcjsKKyAgICAqbGFzdFNlcSA9IG1MYXN0U2VxTnVtYmVyOworfQorCiBzcDxBTWVzc2FnZT4gTTNVUGFyc2VyOjptZXRhKCkgewogICAgIHJldHVybiBtTWV0YTsKIH0KQEAgLTM5NCw3ICs0MTEsOSBAQAogCiBib29sIE0zVVBhcnNlcjo6Z2V0VHlwZVVSSShzaXplX3QgaW5kZXgsIGNvbnN0IGNoYXIgKmtleSwgQVN0cmluZyAqdXJpKSBjb25zdCB7CiAgICAgaWYgKCFtSXNWYXJpYW50UGxheWxpc3QpIHsKLSAgICAgICAgKnVyaSA9IG1CYXNlVVJJOworICAgICAgICBpZiAodXJpICE9IE5VTEwpIHsKKyAgICAgICAgICAgICp1cmkgPSBtQmFzZVVSSTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIEFzc3VtZSBtZWRpYSB3aXRob3V0IGFueSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZSBjb250YWlucwogICAgICAgICAvLyBhdWRpbyBhbmQgdmlkZW8sIGJ1dCBubyBzdWJ0aXRsZXMuCkBAIC00MDcsNyArNDI2LDkgQEAKIAogICAgIEFTdHJpbmcgZ3JvdXBJRDsKICAgICBpZiAoIW1ldGEtPmZpbmRTdHJpbmcoa2V5LCAmZ3JvdXBJRCkpIHsKLSAgICAgICAgKnVyaSA9IG1JdGVtcy5pdGVtQXQoaW5kZXgpLm1VUkk7CisgICAgICAgIGlmICh1cmkgIT0gTlVMTCkgeworICAgICAgICAgICAgKnVyaSA9IG1JdGVtcy5pdGVtQXQoaW5kZXgpLm1VUkk7CisgICAgICAgIH0KIAogICAgICAgICBBU3RyaW5nIGNvZGVjczsKICAgICAgICAgaWYgKCFtZXRhLT5maW5kU3RyaW5nKCJjb2RlY3MiLCAmY29kZWNzKSkgewpAQCAtNDMzLDE4ICs0NTQsMjYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHNwPE1lZGlhR3JvdXA+IGdyb3VwID0gbU1lZGlhR3JvdXBzLnZhbHVlRm9yKGdyb3VwSUQpOwotICAgIGlmICghZ3JvdXAtPmdldEFjdGl2ZVVSSSh1cmkpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CisgICAgLy8gaWYgdXJpID09IE5VTEwsIHdlJ3JlIG9ubHkgY2hlY2tpbmcgaWYgdGhlIHR5cGUgaXMgcHJlc2VudCwKKyAgICAvLyBkb24ndCBjYXJlIGFib3V0IHRoZSBhY3RpdmUgVVJJIChvciBpZiB0aGVyZSBpcyBhbiBhY3RpdmUgb25lKQorICAgIGlmICh1cmkgIT0gTlVMTCkgeworICAgICAgICBzcDxNZWRpYUdyb3VwPiBncm91cCA9IG1NZWRpYUdyb3Vwcy52YWx1ZUZvcihncm91cElEKTsKKyAgICAgICAgaWYgKCFncm91cC0+Z2V0QWN0aXZlVVJJKHVyaSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogCi0gICAgaWYgKCgqdXJpKS5lbXB0eSgpKSB7Ci0gICAgICAgICp1cmkgPSBtSXRlbXMuaXRlbUF0KGluZGV4KS5tVVJJOworICAgICAgICBpZiAoKCp1cmkpLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICp1cmkgPSBtSXRlbXMuaXRlbUF0KGluZGV4KS5tVVJJOworICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgTTNVUGFyc2VyOjpoYXNUeXBlKHNpemVfdCBpbmRleCwgY29uc3QgY2hhciAqa2V5KSBjb25zdCB7CisgICAgcmV0dXJuIGdldFR5cGVVUkkoaW5kZXgsIGtleSwgTlVMTCAvKiB1cmkgKi8pOworfQorCiBzdGF0aWMgYm9vbCBNYWtlVVJMKGNvbnN0IGNoYXIgKmJhc2VVUkwsIGNvbnN0IGNoYXIgKnVybCwgQVN0cmluZyAqb3V0KSB7CiAgICAgb3V0LT5jbGVhcigpOwogCkBAIC01ODIsNiArNjExLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaXRlbU1ldGEgPSBuZXcgQU1lc3NhZ2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGl0ZW1NZXRhLT5zZXRJbnQzMigiZGlzY29udGludWl0eSIsIHRydWUpOworICAgICAgICAgICAgICAgICsrbURpc2NvbnRpbnVpdHlDb3VudDsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCIjRVhULVgtU1RSRUFNLUlORiIpKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1NZXRhICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKQEAgLTYwOSw2ICs2MzksOSBAQAogICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIiNFWFQtWC1NRURJQSIpKSB7CiAgICAgICAgICAgICAgICAgZXJyID0gcGFyc2VNZWRpYShsaW5lKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCIjRVhULVgtRElTQ09OVElOVUlUWS1TRVFVRU5DRSIpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Jc1ZhcmlhbnRQbGF5bGlzdCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBzaXplX3Qgc2VxOwogICAgICAgICAgICAgICAgIGVyciA9IHBhcnNlRGlzY29udGludWl0eVNlcXVlbmNlKGxpbmUsICZzZXEpOwogICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKQEAgLTYyOCw2ICs2NjEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfHwgIWl0ZW1NZXRhLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmZHVyYXRpb25VcykpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXRlbU1ldGEtPnNldEludDMyKCJkaXNjb250aW51aXR5LXNlcXVlbmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EaXNjb250aW51aXR5U2VxICsgbURpc2NvbnRpbnVpdHlDb3VudCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1JdGVtcy5wdXNoKCk7CkBAIC02NDQsNiArNjc5LDI1IEBACiAgICAgICAgICsrbGluZU5vOwogICAgIH0KIAorICAgIC8vIGVycm9yIGNoZWNraW5nIG9mIGFsbCBmaWVsZHMgdGhhdCdzIHJlcXVpcmVkIHRvIGFwcGVhciBvbmNlCisgICAgLy8gKGN1cnJlbnRseSBvbmx5IGNoZWNraW5nICJ0YXJnZXQtZHVyYXRpb24iKSwgYW5kCisgICAgLy8gaW5pdGlhbGl6YXRpb24gb2YgcGxheWxpc3QgcHJvcGVydGllcyAoZWcuIG1UYXJnZXREdXJhdGlvblVzKQorICAgIGlmICghbUlzVmFyaWFudFBsYXlsaXN0KSB7CisgICAgICAgIGludDMyX3QgdGFyZ2V0RHVyYXRpb25TZWNzOworICAgICAgICBpZiAobU1ldGEgPT0gTlVMTCB8fCAhbU1ldGEtPmZpbmRJbnQzMigKKyAgICAgICAgICAgICAgICAidGFyZ2V0LWR1cmF0aW9uIiwgJnRhcmdldER1cmF0aW9uU2VjcykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJNZWRpYSBwbGF5bGlzdCBtaXNzaW5nICNFWFQtWC1UQVJHRVREVVJBVElPTiIpOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICBtVGFyZ2V0RHVyYXRpb25VcyA9IHRhcmdldER1cmF0aW9uU2VjcyAqIDEwMDAwMDBsbDsKKworICAgICAgICBtRmlyc3RTZXFOdW1iZXIgPSAwOworICAgICAgICBpZiAobU1ldGEgIT0gTlVMTCkgeworICAgICAgICAgICAgbU1ldGEtPmZpbmRJbnQzMigibWVkaWEtc2VxdWVuY2UiLCAmbUZpcnN0U2VxTnVtYmVyKTsKKyAgICAgICAgfQorICAgICAgICBtTGFzdFNlcU51bWJlciA9IG1GaXJzdFNlcU51bWJlciArIG1JdGVtcy5zaXplKCkgLSAxOworICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtNzgxLDYgKzgzNSwyOSBAQAogICAgICAgICAgICAgICAgICptZXRhID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgKCptZXRhKS0+c2V0U3RyaW5nKGtleS5jX3N0cigpLCBjb2RlY3MuY19zdHIoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoInJlc29sdXRpb24iLCBrZXkuY19zdHIoKSkpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMgPSB2YWwuY19zdHIoKTsKKyAgICAgICAgICAgIGNoYXIgKmVuZDsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgd2lkdGggPSBzdHJ0b3VsKHMsICZlbmQsIDEwKTsKKworICAgICAgICAgICAgaWYgKGVuZCA9PSBzIHx8ICplbmQgIT0gJ3gnKSB7CisgICAgICAgICAgICAgICAgLy8gbWFsZm9ybWVkCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHMgPSBlbmQgKyAxOworICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBoZWlnaHQgPSBzdHJ0b3VsKHMsICZlbmQsIDEwKTsKKworICAgICAgICAgICAgaWYgKGVuZCA9PSBzIHx8ICplbmQgIT0gJ1wwJykgeworICAgICAgICAgICAgICAgIC8vIG1hbGZvcm1lZAorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobWV0YS0+Z2V0KCkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICptZXRhID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCptZXRhKS0+c2V0SW50MzIoIndpZHRoIiwgd2lkdGgpOworICAgICAgICAgICAgKCptZXRhKS0+c2V0SW50MzIoImhlaWdodCIsIGhlaWdodCk7CiAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoImF1ZGlvIiwga2V5LmNfc3RyKCkpCiAgICAgICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAoInZpZGVvIiwga2V5LmNfc3RyKCkpCiAgICAgICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAoInN1YnRpdGxlcyIsIGtleS5jX3N0cigpKSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuaAppbmRleCAxY2FkMDYwLi5mYTY0OGVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuaApAQCAtMzYsNiArMzYsOSBAQAogICAgIGJvb2wgaXNDb21wbGV0ZSgpIGNvbnN0OwogICAgIGJvb2wgaXNFdmVudCgpIGNvbnN0OwogICAgIHNpemVfdCBnZXREaXNjb250aW51aXR5U2VxKCkgY29uc3Q7CisgICAgaW50NjRfdCBnZXRUYXJnZXREdXJhdGlvbigpIGNvbnN0OworICAgIGludDMyX3QgZ2V0Rmlyc3RTZXFOdW1iZXIoKSBjb25zdDsKKyAgICB2b2lkIGdldFNlcU51bWJlclJhbmdlKGludDMyX3QgKmZpcnN0U2VxLCBpbnQzMl90ICpsYXN0U2VxKSBjb25zdDsKIAogICAgIHNwPEFNZXNzYWdlPiBtZXRhKCk7CiAKQEAgLTUwLDYgKzUzLDcgQEAKICAgICBzc2l6ZV90IGdldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSAvKiB0eXBlICovKSBjb25zdDsKIAogICAgIGJvb2wgZ2V0VHlwZVVSSShzaXplX3QgaW5kZXgsIGNvbnN0IGNoYXIgKmtleSwgQVN0cmluZyAqdXJpKSBjb25zdDsKKyAgICBib29sIGhhc1R5cGUoc2l6ZV90IGluZGV4LCBjb25zdCBjaGFyICprZXkpIGNvbnN0OwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TTNVUGFyc2VyKCk7CkBAIC02OSw3ICs3MywxMSBAQAogICAgIGJvb2wgbUlzVmFyaWFudFBsYXlsaXN0OwogICAgIGJvb2wgbUlzQ29tcGxldGU7CiAgICAgYm9vbCBtSXNFdmVudDsKKyAgICBpbnQzMl90IG1GaXJzdFNlcU51bWJlcjsKKyAgICBpbnQzMl90IG1MYXN0U2VxTnVtYmVyOworICAgIGludDY0X3QgbVRhcmdldER1cmF0aW9uVXM7CiAgICAgc2l6ZV90IG1EaXNjb250aW51aXR5U2VxOworICAgIGludDMyX3QgbURpc2NvbnRpbnVpdHlDb3VudDsKIAogICAgIHNwPEFNZXNzYWdlPiBtTWV0YTsKICAgICBWZWN0b3I8SXRlbT4gbUl0ZW1zOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAKaW5kZXggMTIyNzYwMC4uNzJkODMyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwCkBAIC0xNywyNCArMTcsMTkgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiUGxheWxpc3RGZXRjaGVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KIAogI2luY2x1ZGUgIlBsYXlsaXN0RmV0Y2hlci5oIgotCi0jaW5jbHVkZSAiTGl2ZURhdGFTb3VyY2UuaCIKKyNpbmNsdWRlICJIVFRQRG93bmxvYWRlci5oIgogI2luY2x1ZGUgIkxpdmVTZXNzaW9uLmgiCiAjaW5jbHVkZSAiTTNVUGFyc2VyLmgiCi0KICNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgotI2luY2x1ZGUgImluY2x1ZGUvSFRUUEJhc2UuaCIKICNpbmNsdWRlICJpbmNsdWRlL0lEMy5oIgogI2luY2x1ZGUgIm1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oIgogCi0jaW5jbHVkZSA8bWVkaWEvSVN0cmVhbVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KQEAgLTQyLDYzICszNywxNTYgQEAKICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgorCisjZGVmaW5lIEZMT0dWKGZtdCwgLi4uKSBBTE9HVigiW2ZldGNoZXItJWRdICIgZm10LCBtRmV0Y2hlcklELCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBGU0xPR1Yoc3RyZWFtLCBmbXQsIC4uLikgQUxPR1YoIltmZXRjaGVyLSVkXSBbJXNdICIgZm10LCBtRmV0Y2hlcklELCBcCisgICAgICAgICBMaXZlU2Vzc2lvbjo6Z2V0TmFtZUZvclN0cmVhbShzdHJlYW0pLCAjI19fVkFfQVJHU19fKQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIHN0YXRpYwotY29uc3QgaW50NjRfdCBQbGF5bGlzdEZldGNoZXI6OmtNaW5CdWZmZXJlZER1cmF0aW9uVXMgPSAxMDAwMDAwMGxsOworY29uc3QgaW50NjRfdCBQbGF5bGlzdEZldGNoZXI6OmtNaW5CdWZmZXJlZER1cmF0aW9uVXMgPSAzMDAwMDAwMGxsOwogY29uc3QgaW50NjRfdCBQbGF5bGlzdEZldGNoZXI6OmtNYXhNb25pdG9yRGVsYXlVcyA9IDMwMDAwMDBsbDsKIC8vIExDTSBvZiAxODggKHNpemUgb2YgYSBUUyBwYWNrZXQpICYgMWsgd29ya3Mgd2VsbAogY29uc3QgaW50MzJfdCBQbGF5bGlzdEZldGNoZXI6OmtEb3dubG9hZEJsb2NrU2l6ZSA9IDQ3ICogMTAyNDsKLWNvbnN0IGludDMyX3QgUGxheWxpc3RGZXRjaGVyOjprTnVtU2tpcEZyYW1lcyA9IDU7CisKK3N0cnVjdCBQbGF5bGlzdEZldGNoZXI6OkRvd25sb2FkU3RhdGUgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgRG93bmxvYWRTdGF0ZSgpOworICAgIHZvaWQgcmVzZXRTdGF0ZSgpOworICAgIGJvb2wgaGFzU2F2ZWRTdGF0ZSgpIGNvbnN0OworICAgIHZvaWQgcmVzdG9yZVN0YXRlKAorICAgICAgICAgICAgQVN0cmluZyAmdXJpLAorICAgICAgICAgICAgc3A8QU1lc3NhZ2U+ICZpdGVtTWV0YSwKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzcDxBQnVmZmVyPiAmdHNCdWZmZXIsCisgICAgICAgICAgICBpbnQzMl90ICZmaXJzdFNlcU51bWJlckluUGxheWxpc3QsCisgICAgICAgICAgICBpbnQzMl90ICZsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCk7CisgICAgdm9pZCBzYXZlU3RhdGUoCisgICAgICAgICAgICBBU3RyaW5nICZ1cmksCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gJml0ZW1NZXRhLAorICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+ICZ0c0J1ZmZlciwKKyAgICAgICAgICAgIGludDMyX3QgJmZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKKyAgICAgICAgICAgIGludDMyX3QgJmxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KTsKKworcHJpdmF0ZToKKyAgICBib29sIG1IYXNTYXZlZFN0YXRlOworICAgIEFTdHJpbmcgbVVyaTsKKyAgICBzcDxBTWVzc2FnZT4gbUl0ZW1NZXRhOworICAgIHNwPEFCdWZmZXI+IG1CdWZmZXI7CisgICAgc3A8QUJ1ZmZlcj4gbVRzQnVmZmVyOworICAgIGludDMyX3QgbUZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdDsKKyAgICBpbnQzMl90IG1MYXN0U2VxTnVtYmVySW5QbGF5bGlzdDsKK307CisKK1BsYXlsaXN0RmV0Y2hlcjo6RG93bmxvYWRTdGF0ZTo6RG93bmxvYWRTdGF0ZSgpIHsKKyAgICByZXNldFN0YXRlKCk7Cit9CisKK2Jvb2wgUGxheWxpc3RGZXRjaGVyOjpEb3dubG9hZFN0YXRlOjpoYXNTYXZlZFN0YXRlKCkgY29uc3QgeworICAgIHJldHVybiBtSGFzU2F2ZWRTdGF0ZTsKK30KKwordm9pZCBQbGF5bGlzdEZldGNoZXI6OkRvd25sb2FkU3RhdGU6OnJlc2V0U3RhdGUoKSB7CisgICAgbUhhc1NhdmVkU3RhdGUgPSBmYWxzZTsKKworICAgIG1VcmkuY2xlYXIoKTsKKyAgICBtSXRlbU1ldGEgPSBOVUxMOworICAgIG1CdWZmZXIgPSBOVUxMOworICAgIG1Uc0J1ZmZlciA9IE5VTEw7CisgICAgbUZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IDA7CisgICAgbUxhc3RTZXFOdW1iZXJJblBsYXlsaXN0ID0gMDsKK30KKwordm9pZCBQbGF5bGlzdEZldGNoZXI6OkRvd25sb2FkU3RhdGU6OnJlc3RvcmVTdGF0ZSgKKyAgICAgICAgQVN0cmluZyAmdXJpLAorICAgICAgICBzcDxBTWVzc2FnZT4gJml0ZW1NZXRhLAorICAgICAgICBzcDxBQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICBzcDxBQnVmZmVyPiAmdHNCdWZmZXIsCisgICAgICAgIGludDMyX3QgJmZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKKyAgICAgICAgaW50MzJfdCAmbGFzdFNlcU51bWJlckluUGxheWxpc3QpIHsKKyAgICBpZiAoIW1IYXNTYXZlZFN0YXRlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1cmkgPSBtVXJpOworICAgIGl0ZW1NZXRhID0gbUl0ZW1NZXRhOworICAgIGJ1ZmZlciA9IG1CdWZmZXI7CisgICAgdHNCdWZmZXIgPSBtVHNCdWZmZXI7CisgICAgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ID0gbUZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdDsKKyAgICBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IG1MYXN0U2VxTnVtYmVySW5QbGF5bGlzdDsKKworICAgIHJlc2V0U3RhdGUoKTsKK30KKwordm9pZCBQbGF5bGlzdEZldGNoZXI6OkRvd25sb2FkU3RhdGU6OnNhdmVTdGF0ZSgKKyAgICAgICAgQVN0cmluZyAmdXJpLAorICAgICAgICBzcDxBTWVzc2FnZT4gJml0ZW1NZXRhLAorICAgICAgICBzcDxBQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICBzcDxBQnVmZmVyPiAmdHNCdWZmZXIsCisgICAgICAgIGludDMyX3QgJmZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKKyAgICAgICAgaW50MzJfdCAmbGFzdFNlcU51bWJlckluUGxheWxpc3QpIHsKKyAgICBtSGFzU2F2ZWRTdGF0ZSA9IHRydWU7CisKKyAgICBtVXJpID0gdXJpOworICAgIG1JdGVtTWV0YSA9IGl0ZW1NZXRhOworICAgIG1CdWZmZXIgPSBidWZmZXI7CisgICAgbVRzQnVmZmVyID0gdHNCdWZmZXI7CisgICAgbUZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdDsKKyAgICBtTGFzdFNlcU51bWJlckluUGxheWxpc3QgPSBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdDsKK30KIAogUGxheWxpc3RGZXRjaGVyOjpQbGF5bGlzdEZldGNoZXIoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAogICAgICAgICBjb25zdCBzcDxMaXZlU2Vzc2lvbj4gJnNlc3Npb24sCiAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgaW50MzJfdCBpZCwKICAgICAgICAgaW50MzJfdCBzdWJ0aXRsZUdlbmVyYXRpb24pCiAgICAgOiBtTm90aWZ5KG5vdGlmeSksCi0gICAgICBtU3RhcnRUaW1lVXNOb3RpZnkobm90aWZ5LT5kdXAoKSksCiAgICAgICBtU2Vzc2lvbihzZXNzaW9uKSwKICAgICAgIG1VUkkodXJpKSwKKyAgICAgIG1GZXRjaGVySUQoaWQpLAogICAgICAgbVN0cmVhbVR5cGVNYXNrKDApLAogICAgICAgbVN0YXJ0VGltZVVzKC0xbGwpLAogICAgICAgbVNlZ21lbnRTdGFydFRpbWVVcygtMWxsKSwKICAgICAgIG1EaXNjb250aW51aXR5U2VxKC0xbGwpLAogICAgICAgbVN0YXJ0VGltZVVzUmVsYXRpdmUoZmFsc2UpLAogICAgICAgbUxhc3RQbGF5bGlzdEZldGNoVGltZVVzKC0xbGwpLAorICAgICAgbVBsYXlsaXN0VGltZVVzKC0xbGwpLAogICAgICAgbVNlcU51bWJlcigtMSksCiAgICAgICBtTnVtUmV0cmllcygwKSwKICAgICAgIG1TdGFydHVwKHRydWUpLAotICAgICAgbUFkYXB0aXZlKGZhbHNlKSwKLSAgICAgIG1QcmVwYXJlZChmYWxzZSksCisgICAgICBtSURSRm91bmQoZmFsc2UpLAorICAgICAgbVNlZWtNb2RlKExpdmVTZXNzaW9uOjprU2Vla01vZGVFeGFjdFBvc2l0aW9uKSwKKyAgICAgIG1UaW1lQ2hhbmdlU2lnbmFsZWQoZmFsc2UpLAogICAgICAgbU5leHRQVFNUaW1lVXMoLTFsbCksCiAgICAgICBtTW9uaXRvclF1ZXVlR2VuZXJhdGlvbigwKSwKICAgICAgIG1TdWJ0aXRsZUdlbmVyYXRpb24oc3VidGl0bGVHZW5lcmF0aW9uKSwKKyAgICAgIG1MYXN0RGlzY29udGludWl0eVNlcSgtMWxsKSwKICAgICAgIG1SZWZyZXNoU3RhdGUoSU5JVElBTF9NSU5JTVVNX1JFTE9BRF9ERUxBWSksCiAgICAgICBtRmlyc3RQVFNWYWxpZChmYWxzZSksCi0gICAgICBtQWJzb2x1dGVUaW1lQW5jaG9yVXMoMGxsKSwKLSAgICAgIG1WaWRlb0J1ZmZlcihuZXcgQW5vdGhlclBhY2tldFNvdXJjZShOVUxMKSkgeworICAgICAgbUZpcnN0VGltZVVzKC0xbGwpLAorICAgICAgbVZpZGVvQnVmZmVyKG5ldyBBbm90aGVyUGFja2V0U291cmNlKE5VTEwpKSwKKyAgICAgIG1UaHJlc2hvbGRSYXRpbygtMS4wZiksCisgICAgICBtRG93bmxvYWRTdGF0ZShuZXcgRG93bmxvYWRTdGF0ZSgpKSwKKyAgICAgIG1IYXNNZXRhZGF0YShmYWxzZSkgewogICAgIG1lbXNldChtUGxheWxpc3RIYXNoLCAwLCBzaXplb2YobVBsYXlsaXN0SGFzaCkpOwotICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFN0YXJ0ZWRBdCk7Ci0gICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQzMigic3RyZWFtTWFzayIsIDApOworICAgIG1IVFRQRG93bmxvYWRlciA9IG1TZXNzaW9uLT5nZXRIVFRQRG93bmxvYWRlcigpOwogfQogCiBQbGF5bGlzdEZldGNoZXI6On5QbGF5bGlzdEZldGNoZXIoKSB7CiB9CiAKK2ludDMyX3QgUGxheWxpc3RGZXRjaGVyOjpnZXRGZXRjaGVySUQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1GZXRjaGVySUQ7Cit9CisKIGludDY0X3QgUGxheWxpc3RGZXRjaGVyOjpnZXRTZWdtZW50U3RhcnRUaW1lVXMoaW50MzJfdCBzZXFOdW1iZXIpIGNvbnN0IHsKICAgICBDSEVDSyhtUGxheWxpc3QgIT0gTlVMTCk7CiAKLSAgICBpbnQzMl90IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdDsKLSAgICBpZiAobVBsYXlsaXN0LT5tZXRhKCkgPT0gTlVMTCB8fCAhbVBsYXlsaXN0LT5tZXRhKCktPmZpbmRJbnQzMigKLSAgICAgICAgICAgICAgICAibWVkaWEtc2VxdWVuY2UiLCAmZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0KSkgewotICAgICAgICBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgPSAwOwotICAgIH0KLQotICAgIGludDMyX3QgbGFzdFNlcU51bWJlckluUGxheWxpc3QgPQotICAgICAgICBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgKyAoaW50MzJfdCltUGxheWxpc3QtPnNpemUoKSAtIDE7CisgICAgaW50MzJfdCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0OworICAgIG1QbGF5bGlzdC0+Z2V0U2VxTnVtYmVyUmFuZ2UoCisgICAgICAgICAgICAmZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LCAmbGFzdFNlcU51bWJlckluUGxheWxpc3QpOwogCiAgICAgQ0hFQ0tfR0Uoc2VxTnVtYmVyLCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QpOwogICAgIENIRUNLX0xFKHNlcU51bWJlciwgbGFzdFNlcU51bWJlckluUGxheWxpc3QpOwpAQCAtMTE5LDYgKzIwNywyNyBAQAogICAgIHJldHVybiBzZWdtZW50U3RhcnRVczsKIH0KIAoraW50NjRfdCBQbGF5bGlzdEZldGNoZXI6OmdldFNlZ21lbnREdXJhdGlvblVzKGludDMyX3Qgc2VxTnVtYmVyKSBjb25zdCB7CisgICAgQ0hFQ0sobVBsYXlsaXN0ICE9IE5VTEwpOworCisgICAgaW50MzJfdCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0OworICAgIG1QbGF5bGlzdC0+Z2V0U2VxTnVtYmVyUmFuZ2UoCisgICAgICAgICAgICAmZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LCAmbGFzdFNlcU51bWJlckluUGxheWxpc3QpOworCisgICAgQ0hFQ0tfR0Uoc2VxTnVtYmVyLCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QpOworICAgIENIRUNLX0xFKHNlcU51bWJlciwgbGFzdFNlcU51bWJlckluUGxheWxpc3QpOworCisgICAgaW50MzJfdCBpbmRleCA9IHNlcU51bWJlciAtIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdDsKKyAgICBzcDxBTWVzc2FnZT4gaXRlbU1ldGE7CisgICAgQ0hFQ0sobVBsYXlsaXN0LT5pdGVtQXQoCisgICAgICAgICAgICAgICAgaW5kZXgsIE5VTEwgLyogdXJpICovLCAmaXRlbU1ldGEpKTsKKworICAgIGludDY0X3QgaXRlbUR1cmF0aW9uVXM7CisgICAgQ0hFQ0soaXRlbU1ldGEtPmZpbmRJbnQ2NCgiZHVyYXRpb25VcyIsICZpdGVtRHVyYXRpb25VcykpOworCisgICAgcmV0dXJuIGl0ZW1EdXJhdGlvblVzOworfQorCiBpbnQ2NF90IFBsYXlsaXN0RmV0Y2hlcjo6ZGVsYXlVc1RvUmVmcmVzaFBsYXlsaXN0KCkgY29uc3QgewogICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwogCkBAIC0xMzEsMTAgKzI0MCw3IEBACiAgICAgICAgIHJldHVybiAofjBsbHUgPj4gMSk7CiAgICAgfQogCi0gICAgaW50MzJfdCB0YXJnZXREdXJhdGlvblNlY3M7Ci0gICAgQ0hFQ0sobVBsYXlsaXN0LT5tZXRhKCktPmZpbmRJbnQzMigidGFyZ2V0LWR1cmF0aW9uIiwgJnRhcmdldER1cmF0aW9uU2VjcykpOwotCi0gICAgaW50NjRfdCB0YXJnZXREdXJhdGlvblVzID0gdGFyZ2V0RHVyYXRpb25TZWNzICogMTAwMDAwMGxsOworICAgIGludDY0X3QgdGFyZ2V0RHVyYXRpb25VcyA9IG1QbGF5bGlzdC0+Z2V0VGFyZ2V0RHVyYXRpb24oKTsKIAogICAgIGludDY0X3QgbWluUGxheWxpc3RBZ2VVczsKIApAQCAtMjI0LDkgKzMzMCwxMSBAQAogICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgIGtleSA9IG1BRVNLZXlGb3JVUkkudmFsdWVBdChpbmRleCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3NpemVfdCBlcnIgPSBtU2Vzc2lvbi0+ZmV0Y2hGaWxlKGtleVVSSS5jX3N0cigpLCAma2V5KTsKKyAgICAgICAgc3NpemVfdCBlcnIgPSBtSFRUUERvd25sb2FkZXItPmZldGNoRmlsZShrZXlVUkkuY19zdHIoKSwgJmtleSk7CiAKLSAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9OT1RfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTk9UX0NPTk5FQ1RFRDsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgPCAwKSB7CiAgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGZldGNoIGNpcGhlciBrZXkgZnJvbSAnJXMnLiIsIGtleVVSSS5jX3N0cigpKTsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICAgICAgfSBlbHNlIGlmIChrZXktPnNpemUoKSAhPSAxNikgewpAQCAtMzIyLDEwICs0MzAsMTAgQEAKICAgICAgICAgbWF4RGVsYXlVcyA9IG1pbkRlbGF5VXM7CiAgICAgfQogICAgIGlmIChkZWxheVVzID4gbWF4RGVsYXlVcykgewotICAgICAgICBBTE9HVigiTmVlZCB0byByZWZyZXNoIHBsYXlsaXN0IGluICUiIFBSSWQ2NCAsIG1heERlbGF5VXMpOworICAgICAgICBGTE9HVigiTmVlZCB0byByZWZyZXNoIHBsYXlsaXN0IGluICVsbGQiLCAobG9uZyBsb25nKW1heERlbGF5VXMpOwogICAgICAgICBkZWxheVVzID0gbWF4RGVsYXlVczsKICAgICB9Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdE1vbml0b3JRdWV1ZSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdE1vbml0b3JRdWV1ZSwgdGhpcyk7CiAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1Nb25pdG9yUXVldWVHZW5lcmF0aW9uKTsKICAgICBtc2ctPnBvc3QoZGVsYXlVcyk7CiB9CkBAIC0zMzQsMTUgKzQ0Miw0NCBAQAogICAgICsrbU1vbml0b3JRdWV1ZUdlbmVyYXRpb247CiB9CiAKK3ZvaWQgUGxheWxpc3RGZXRjaGVyOjpzZXRTdG9wcGluZ1RocmVzaG9sZChmbG9hdCB0aHJlc2hvbGRSYXRpbywgYm9vbCBkaXNjb25uZWN0KSB7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggX2wobVRocmVzaG9sZExvY2spOworICAgICAgICBtVGhyZXNob2xkUmF0aW8gPSB0aHJlc2hvbGRSYXRpbzsKKyAgICB9CisgICAgaWYgKGRpc2Nvbm5lY3QpIHsKKyAgICAgICAgbUhUVFBEb3dubG9hZGVyLT5kaXNjb25uZWN0KCk7CisgICAgfQorfQorCit2b2lkIFBsYXlsaXN0RmV0Y2hlcjo6cmVzZXRTdG9wcGluZ1RocmVzaG9sZChib29sIGRpc2Nvbm5lY3QpIHsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBfbChtVGhyZXNob2xkTG9jayk7CisgICAgICAgIG1UaHJlc2hvbGRSYXRpbyA9IC0xLjBmOworICAgIH0KKyAgICBpZiAoZGlzY29ubmVjdCkgeworICAgICAgICBtSFRUUERvd25sb2FkZXItPmRpc2Nvbm5lY3QoKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBhbGxvdyByZWNvbm5lY3QKKyAgICAgICAgbUhUVFBEb3dubG9hZGVyLT5yZWNvbm5lY3QoKTsKKyAgICB9Cit9CisKK2Zsb2F0IFBsYXlsaXN0RmV0Y2hlcjo6Z2V0U3RvcHBpbmdUaHJlc2hvbGQoKSB7CisgICAgQXV0b011dGV4IF9sKG1UaHJlc2hvbGRMb2NrKTsKKyAgICByZXR1cm4gbVRocmVzaG9sZFJhdGlvOworfQorCiB2b2lkIFBsYXlsaXN0RmV0Y2hlcjo6c3RhcnRBc3luYygKICAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmF1ZGlvU291cmNlLAogICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmdmlkZW9Tb3VyY2UsCiAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZzdWJ0aXRsZVNvdXJjZSwKKyAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJm1ldGFkYXRhU291cmNlLAogICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzLAogICAgICAgICBpbnQ2NF90IHNlZ21lbnRTdGFydFRpbWVVcywKICAgICAgICAgaW50MzJfdCBzdGFydERpc2NvbnRpbnVpdHlTZXEsCi0gICAgICAgIGJvb2wgYWRhcHRpdmUpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIGlkKCkpOworICAgICAgICBMaXZlU2Vzc2lvbjo6U2Vla01vZGUgc2Vla01vZGUpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIHRoaXMpOwogCiAgICAgdWludDMyX3Qgc3RyZWFtVHlwZU1hc2sgPSAwdWw7CiAKQEAgLTM2MSwzMCArNDk4LDUzIEBACiAgICAgICAgIHN0cmVhbVR5cGVNYXNrIHw9IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1NVQlRJVExFUzsKICAgICB9CiAKKyAgICBpZiAobWV0YWRhdGFTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBtc2ctPnNldFBvaW50ZXIoIm1ldGFkYXRhU291cmNlIiwgbWV0YWRhdGFTb3VyY2UuZ2V0KCkpOworICAgICAgICAvLyBtZXRhZGF0YVNvdXJjZSBkb2VzIG5vdCBhZmZlY3Qgc3RyZWFtVHlwZU1hc2suCisgICAgfQorCiAgICAgbXNnLT5zZXRJbnQzMigic3RyZWFtVHlwZU1hc2siLCBzdHJlYW1UeXBlTWFzayk7CiAgICAgbXNnLT5zZXRJbnQ2NCgic3RhcnRUaW1lVXMiLCBzdGFydFRpbWVVcyk7CiAgICAgbXNnLT5zZXRJbnQ2NCgic2VnbWVudFN0YXJ0VGltZVVzIiwgc2VnbWVudFN0YXJ0VGltZVVzKTsKICAgICBtc2ctPnNldEludDMyKCJzdGFydERpc2NvbnRpbnVpdHlTZXEiLCBzdGFydERpc2NvbnRpbnVpdHlTZXEpOwotICAgIG1zZy0+c2V0SW50MzIoImFkYXB0aXZlIiwgYWRhcHRpdmUpOworICAgIG1zZy0+c2V0SW50MzIoInNlZWtNb2RlIiwgc2Vla01vZGUpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCi12b2lkIFBsYXlsaXN0RmV0Y2hlcjo6cGF1c2VBc3luYygpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UGF1c2UsIGlkKCkpKS0+cG9zdCgpOworLyoKKyAqIHBhdXNlQXN5bmMKKyAqCisgKiB0aHJlc2hvbGQ6IDAuMGYgLSBwYXVzZSBhZnRlciBjdXJyZW50IGZldGNoIGJsb2NrIChkZWZhdWx0IDQ3S2J5dGVzKQorICogICAgICAgICAgIC0xLjBmIC0gcGF1c2UgYWZ0ZXIgZmluaXNoaW5nIGN1cnJlbnQgc2VnbWVudAorICogICAgICAgIDAuMH4xLjBmIC0gcGF1c2UgaWYgcmVtYWluaW5nIG9mIGN1cnJlbnQgc2VnbWVudCBleGNlZWRzIHRocmVzaG9sZAorICovCit2b2lkIFBsYXlsaXN0RmV0Y2hlcjo6cGF1c2VBc3luYygKKyAgICAgICAgZmxvYXQgdGhyZXNob2xkUmF0aW8sIGJvb2wgZGlzY29ubmVjdCkgeworICAgIHNldFN0b3BwaW5nVGhyZXNob2xkKHRocmVzaG9sZFJhdGlvLCBkaXNjb25uZWN0KTsKKworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgdGhpcykpLT5wb3N0KCk7CiB9CiAKIHZvaWQgUGxheWxpc3RGZXRjaGVyOjpzdG9wQXN5bmMoYm9vbCBjbGVhcikgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCBpZCgpKTsKKyAgICBzZXRTdG9wcGluZ1RocmVzaG9sZCgwLjBmLCB0cnVlIC8qIGRpc2Nvbm5jZWN0ICovKTsKKworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCB0aGlzKTsKICAgICBtc2ctPnNldEludDMyKCJjbGVhciIsIGNsZWFyKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KIAogdm9pZCBQbGF5bGlzdEZldGNoZXI6OnJlc3VtZVVudGlsQXN5bmMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXMpIHsKLSAgICBBTWVzc2FnZSogbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lVW50aWwsIGlkKCkpOworICAgIEZMT0dWKCJyZXN1bWVVbnRpbEFzeW5jOiBwYXJhbXM9JXMiLCBwYXJhbXMtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisKKyAgICBBTWVzc2FnZSogbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lVW50aWwsIHRoaXMpOwogICAgIG1zZy0+c2V0TWVzc2FnZSgicGFyYW1zIiwgcGFyYW1zKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KIAordm9pZCBQbGF5bGlzdEZldGNoZXI6OmZldGNoUGxheWxpc3RBc3luYygpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hQbGF5bGlzdCwgdGhpcykpLT5wb3N0KCk7Cit9CisKIHZvaWQgUGxheWxpc3RGZXRjaGVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKICAgICAgICAgY2FzZSBrV2hhdFN0YXJ0OgpAQCAtNDA0LDYgKzU2NCwxMCBAQAogCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CiAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRQYXVzZWQpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2Vla01vZGUiLAorICAgICAgICAgICAgICAgICAgICBtRG93bmxvYWRTdGF0ZS0+aGFzU2F2ZWRTdGF0ZSgpCisgICAgICAgICAgICAgICAgICAgID8gTGl2ZVNlc3Npb246OmtTZWVrTW9kZU5leHRTYW1wbGUKKyAgICAgICAgICAgICAgICAgICAgOiBMaXZlU2Vzc2lvbjo6a1NlZWtNb2RlTmV4dFNlZ21lbnQpOwogICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtNDE4LDYgKzU4MiwxOSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0RmV0Y2hQbGF5bGlzdDoKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCB1bmNoYW5nZWQ7CisgICAgICAgICAgICBzcDxNM1VQYXJzZXI+IHBsYXlsaXN0ID0gbUhUVFBEb3dubG9hZGVyLT5mZXRjaFBsYXlsaXN0KAorICAgICAgICAgICAgICAgICAgICBtVVJJLmNfc3RyKCksIE5VTEwgLyogY3VyUGxheWxpc3RIYXNoICovLCAmdW5jaGFuZ2VkKTsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UGxheWxpc3RGZXRjaGVkKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0T2JqZWN0KCJwbGF5bGlzdCIsIHBsYXlsaXN0KTsKKyAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIGtXaGF0TW9uaXRvclF1ZXVlOgogICAgICAgICBjYXNlIGtXaGF0RG93bmxvYWROZXh0OgogICAgICAgICB7CkBAIC00NTAsNiArNjI3LDEwIEBACiAKIHN0YXR1c190IFBsYXlsaXN0RmV0Y2hlcjo6b25TdGFydChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIG1QYWNrZXRTb3VyY2VzLmNsZWFyKCk7CisgICAgbVN0b3BQYXJhbXMuY2xlYXIoKTsKKyAgICBtU3RhcnRUaW1lVXNOb3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRTdGFydGVkQXQpOworICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0U3RyaW5nKCJ1cmkiLCBtVVJJKTsKIAogICAgIHVpbnQzMl90IHN0cmVhbVR5cGVNYXNrOwogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzdHJlYW1UeXBlTWFzayIsIChpbnQzMl90ICopJnN0cmVhbVR5cGVNYXNrKSk7CkBAIC00NTcsMTEgKzYzOCwxMSBAQAogICAgIGludDY0X3Qgc3RhcnRUaW1lVXM7CiAgICAgaW50NjRfdCBzZWdtZW50U3RhcnRUaW1lVXM7CiAgICAgaW50MzJfdCBzdGFydERpc2NvbnRpbnVpdHlTZXE7Ci0gICAgaW50MzJfdCBhZGFwdGl2ZTsKKyAgICBpbnQzMl90IHNlZWtNb2RlOwogICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzdGFydFRpbWVVcyIsICZzdGFydFRpbWVVcykpOwogICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzZWdtZW50U3RhcnRUaW1lVXMiLCAmc2VnbWVudFN0YXJ0VGltZVVzKSk7CiAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInN0YXJ0RGlzY29udGludWl0eVNlcSIsICZzdGFydERpc2NvbnRpbnVpdHlTZXEpKTsKLSAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYWRhcHRpdmUiLCAmYWRhcHRpdmUpKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic2Vla01vZGUiLCAmc2Vla01vZGUpKTsKIAogICAgIGlmIChzdHJlYW1UeXBlTWFzayAmIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX0FVRElPKSB7CiAgICAgICAgIHZvaWQgKnB0cjsKQEAgLTQ5MCwxNyArNjcxLDM4IEBACiAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QW5vdGhlclBhY2tldFNvdXJjZSAqPihwdHIpKTsKICAgICB9CiAKKyAgICB2b2lkICpwdHI7CisgICAgLy8gbWV0YWRhdGFTb3VyY2UgaXMgbm90IHBhcnQgb2Ygc3RyZWFtVHlwZU1hc2sKKyAgICBpZiAoKHN0cmVhbVR5cGVNYXNrICYgKExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX0FVRElPIHwgTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfVklERU8pKQorICAgICAgICAgICAgJiYgbXNnLT5maW5kUG9pbnRlcigibWV0YWRhdGFTb3VyY2UiLCAmcHRyKSkgeworICAgICAgICBtUGFja2V0U291cmNlcy5hZGQoCisgICAgICAgICAgICAgICAgTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfTUVUQURBVEEsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QW5vdGhlclBhY2tldFNvdXJjZSAqPihwdHIpKTsKKyAgICB9CisKICAgICBtU3RyZWFtVHlwZU1hc2sgPSBzdHJlYW1UeXBlTWFzazsKIAogICAgIG1TZWdtZW50U3RhcnRUaW1lVXMgPSBzZWdtZW50U3RhcnRUaW1lVXM7Ci0gICAgbURpc2NvbnRpbnVpdHlTZXEgPSBzdGFydERpc2NvbnRpbnVpdHlTZXE7CisKKyAgICBpZiAoc3RhcnREaXNjb250aW51aXR5U2VxID49IDApIHsKKyAgICAgICAgbURpc2NvbnRpbnVpdHlTZXEgPSBzdGFydERpc2NvbnRpbnVpdHlTZXE7CisgICAgfQorCisgICAgbVJlZnJlc2hTdGF0ZSA9IElOSVRJQUxfTUlOSU1VTV9SRUxPQURfREVMQVk7CisgICAgbVNlZWtNb2RlID0gKExpdmVTZXNzaW9uOjpTZWVrTW9kZSkgc2Vla01vZGU7CisKKyAgICBpZiAoc3RhcnRUaW1lVXMgPj0gMCB8fCBtU2Vla01vZGUgPT0gTGl2ZVNlc3Npb246OmtTZWVrTW9kZU5leHRTYW1wbGUpIHsKKyAgICAgICAgbVN0YXJ0dXAgPSB0cnVlOworICAgICAgICBtSURSRm91bmQgPSBmYWxzZTsKKyAgICAgICAgbVZpZGVvQnVmZmVyLT5jbGVhcigpOworICAgIH0KIAogICAgIGlmIChzdGFydFRpbWVVcyA+PSAwKSB7CiAgICAgICAgIG1TdGFydFRpbWVVcyA9IHN0YXJ0VGltZVVzOworICAgICAgICBtRmlyc3RQVFNWYWxpZCA9IGZhbHNlOwogICAgICAgICBtU2VxTnVtYmVyID0gLTE7Ci0gICAgICAgIG1TdGFydHVwID0gdHJ1ZTsKLSAgICAgICAgbVByZXBhcmVkID0gZmFsc2U7Ci0gICAgICAgIG1BZGFwdGl2ZSA9IGFkYXB0aXZlOworICAgICAgICBtVGltZUNoYW5nZVNpZ25hbGVkID0gZmFsc2U7CisgICAgICAgIG1Eb3dubG9hZFN0YXRlLT5yZXNldFN0YXRlKCk7CiAgICAgfQogCiAgICAgcG9zdE1vbml0b3JRdWV1ZSgpOwpAQCAtNTEwLDYgKzcxMiw5IEBACiAKIHZvaWQgUGxheWxpc3RGZXRjaGVyOjpvblBhdXNlKCkgewogICAgIGNhbmNlbE1vbml0b3JRdWV1ZSgpOworICAgIG1MYXN0RGlzY29udGludWl0eVNlcSA9IG1EaXNjb250aW51aXR5U2VxOworCisgICAgcmVzZXRTdG9wcGluZ1RocmVzaG9sZChmYWxzZSAvKiBkaXNjb25uZWN0ICovKTsKIH0KIAogdm9pZCBQbGF5bGlzdEZldGNoZXI6Om9uU3RvcChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewpAQCAtNTI0LDggKzcyOSwxMSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgbURvd25sb2FkU3RhdGUtPnJlc2V0U3RhdGUoKTsKICAgICBtUGFja2V0U291cmNlcy5jbGVhcigpOwogICAgIG1TdHJlYW1UeXBlTWFzayA9IDA7CisKKyAgICByZXNldFN0b3BwaW5nVGhyZXNob2xkKHRydWUgLyogZGlzY29ubmVjdCAqLyk7CiB9CiAKIC8vIFJlc3VtZSB1bnRpbCB3ZSBoYXZlIHJlYWNoZWQgdGhlIGJvdW5kYXJ5IHRpbWVzdGFtcHMgbGlzdGVkIGluIGBtc2dgOyB3aGVuCkBAIC01MzUsNTcgKzc0MywxOCBAQAogICAgIHNwPEFNZXNzYWdlPiBwYXJhbXM7CiAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgicGFyYW1zIiwgJnBhcmFtcykpOwogCi0gICAgYm9vbCBzdG9wID0gZmFsc2U7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGFja2V0U291cmNlcy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBwYWNrZXRTb3VyY2UgPSBtUGFja2V0U291cmNlcy52YWx1ZUF0KGkpOwotCi0gICAgICAgIGNvbnN0IGNoYXIgKnN0b3BLZXk7Ci0gICAgICAgIGludCBzdHJlYW1UeXBlID0gbVBhY2tldFNvdXJjZXMua2V5QXQoaSk7Ci0gICAgICAgIHN3aXRjaCAoc3RyZWFtVHlwZSkgewotICAgICAgICBjYXNlIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1ZJREVPOgotICAgICAgICAgICAgc3RvcEtleSA9ICJ0aW1lVXNWaWRlbyI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX0FVRElPOgotICAgICAgICAgICAgc3RvcEtleSA9ICJ0aW1lVXNBdWRpbyI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1NVQlRJVExFUzoKLSAgICAgICAgICAgIHN0b3BLZXkgPSAidGltZVVzU3VidGl0bGUiOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEb24ndCByZXN1bWUgaWYgd2Ugd291bGQgc3RvcCB3aXRoaW4gYSByZXN1bWUgdGhyZXNob2xkLgotICAgICAgICBpbnQzMl90IGRpc2NvbnRpbnVpdHlTZXE7Ci0gICAgICAgIGludDY0X3QgbGF0ZXN0VGltZVVzID0gMCwgc3RvcFRpbWVVcyA9IDA7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBsYXRlc3RNZXRhID0gcGFja2V0U291cmNlLT5nZXRMYXRlc3RFbnF1ZXVlZE1ldGEoKTsKLSAgICAgICAgaWYgKGxhdGVzdE1ldGEgIT0gTlVMTAotICAgICAgICAgICAgICAgICYmIGxhdGVzdE1ldGEtPmZpbmRJbnQzMigiZGlzY29udGludWl0eVNlcSIsICZkaXNjb250aW51aXR5U2VxKQotICAgICAgICAgICAgICAgICYmIGRpc2NvbnRpbnVpdHlTZXEgPT0gbURpc2NvbnRpbnVpdHlTZXEKLSAgICAgICAgICAgICAgICAmJiBsYXRlc3RNZXRhLT5maW5kSW50NjQoInRpbWVVcyIsICZsYXRlc3RUaW1lVXMpCi0gICAgICAgICAgICAgICAgJiYgcGFyYW1zLT5maW5kSW50NjQoc3RvcEtleSwgJnN0b3BUaW1lVXMpCi0gICAgICAgICAgICAgICAgJiYgc3RvcFRpbWVVcyAtIGxhdGVzdFRpbWVVcyA8IHJlc3VtZVRocmVzaG9sZChsYXRlc3RNZXRhKSkgewotICAgICAgICAgICAgc3RvcCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoc3RvcCkgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYWNrZXRTb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBtUGFja2V0U291cmNlcy52YWx1ZUF0KGkpLT5xdWV1ZUFjY2Vzc1VuaXQobVNlc3Npb24tPmNyZWF0ZUZvcm1hdENoYW5nZUJ1ZmZlcigpKTsKLSAgICAgICAgfQotICAgICAgICBzdG9wQXN5bmMoLyogY2xlYXIgPSAqLyBmYWxzZSk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KICAgICBtU3RvcFBhcmFtcyA9IHBhcmFtczsKLSAgICBwb3N0TW9uaXRvclF1ZXVlKCk7CisgICAgb25Eb3dubG9hZE5leHQoKTsKIAogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBQbGF5bGlzdEZldGNoZXI6Om5vdGlmeVN0b3BSZWFjaGVkKCkgeworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRTdG9wUmVhY2hlZCk7CisgICAgbm90aWZ5LT5wb3N0KCk7Cit9CisKIHZvaWQgUGxheWxpc3RGZXRjaGVyOjpub3RpZnlFcnJvcihzdGF0dXNfdCBlcnIpIHsKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RXJyb3IpOwpAQCAtNjA0LDk2ICs3NzMsODQgQEAKIH0KIAogdm9pZCBQbGF5bGlzdEZldGNoZXI6Om9uTW9uaXRvclF1ZXVlKCkgewotICAgIGJvb2wgZG93bmxvYWRNb3JlID0gZmFsc2U7Ci0gICAgcmVmcmVzaFBsYXlsaXN0KCk7Ci0KLSAgICBpbnQzMl90IHRhcmdldER1cmF0aW9uU2VjczsKLSAgICBpbnQ2NF90IHRhcmdldER1cmF0aW9uVXMgPSBrTWluQnVmZmVyZWREdXJhdGlvblVzOwotICAgIGlmIChtUGxheWxpc3QgIT0gTlVMTCkgewotICAgICAgICBpZiAobVBsYXlsaXN0LT5tZXRhKCkgPT0gTlVMTCB8fCAhbVBsYXlsaXN0LT5tZXRhKCktPmZpbmRJbnQzMigKLSAgICAgICAgICAgICAgICAidGFyZ2V0LWR1cmF0aW9uIiwgJnRhcmdldER1cmF0aW9uU2VjcykpIHsKLSAgICAgICAgICAgIEFMT0dFKCJQbGF5bGlzdCBpcyBtaXNzaW5nIHJlcXVpcmVkIEVYVC1YLVRBUkdFVERVUkFUSU9OIHRhZyIpOwotICAgICAgICAgICAgbm90aWZ5RXJyb3IoRVJST1JfTUFMRk9STUVEKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0YXJnZXREdXJhdGlvblVzID0gdGFyZ2V0RHVyYXRpb25TZWNzICogMTAwMDAwMGxsOworICAgIC8vIGluIHRoZSBtaWRkbGUgb2YgYW4gdW5maW5pc2hlZCBkb3dubG9hZCwgZGVsYXkKKyAgICAvLyBwbGF5bGlzdCByZWZyZXNoIGFzIGl0J2xsIGNoYW5nZSBzZXEgbnVtYmVycworICAgIGlmICghbURvd25sb2FkU3RhdGUtPmhhc1NhdmVkU3RhdGUoKSkgeworICAgICAgICByZWZyZXNoUGxheWxpc3QoKTsKICAgICB9CiAKLSAgICAvLyBidWZmZXIgYXQgbGVhc3QgMyB0aW1lcyB0aGUgdGFyZ2V0IGR1cmF0aW9uLCBvciB1cCB0byAxMCBzZWNvbmRzCi0gICAgaW50NjRfdCBkdXJhdGlvblRvQnVmZmVyVXMgPSB0YXJnZXREdXJhdGlvblVzICogMzsKLSAgICBpZiAoZHVyYXRpb25Ub0J1ZmZlclVzID4ga01pbkJ1ZmZlcmVkRHVyYXRpb25VcykgIHsKLSAgICAgICAgZHVyYXRpb25Ub0J1ZmZlclVzID0ga01pbkJ1ZmZlcmVkRHVyYXRpb25VczsKKyAgICBpbnQ2NF90IHRhcmdldER1cmF0aW9uVXMgPSBrTWluQnVmZmVyZWREdXJhdGlvblVzOworICAgIGlmIChtUGxheWxpc3QgIT0gTlVMTCkgeworICAgICAgICB0YXJnZXREdXJhdGlvblVzID0gbVBsYXlsaXN0LT5nZXRUYXJnZXREdXJhdGlvbigpOwogICAgIH0KIAogICAgIGludDY0X3QgYnVmZmVyZWREdXJhdGlvblVzID0gMGxsOwotICAgIHN0YXR1c190IGZpbmFsUmVzdWx0ID0gTk9UX0VOT1VHSF9EQVRBOworICAgIHN0YXR1c190IGZpbmFsUmVzdWx0ID0gT0s7CiAgICAgaWYgKG1TdHJlYW1UeXBlTWFzayA9PSBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9TVUJUSVRMRVMpIHsKICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gcGFja2V0U291cmNlID0KICAgICAgICAgICAgIG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1NVQlRJVExFUyk7CiAKICAgICAgICAgYnVmZmVyZWREdXJhdGlvblVzID0KICAgICAgICAgICAgICAgICBwYWNrZXRTb3VyY2UtPmdldEJ1ZmZlcmVkRHVyYXRpb25VcygmZmluYWxSZXN1bHQpOwotICAgICAgICBmaW5hbFJlc3VsdCA9IE9LOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFVzZSBtYXggc3RyZWFtIGR1cmF0aW9uIHRvIHByZXZlbnQgdXMgZnJvbSB3YWl0aW5nIG9uIGEgbm9uLWV4aXN0ZW50IHN0cmVhbTsKLSAgICAgICAgLy8gd2hlbiB3ZSBjYW5ub3QgbWFrZSBvdXQgZnJvbSB0aGUgbWFuaWZlc3Qgd2hhdCBzdHJlYW1zIGFyZSBpbmNsdWRlZCBpbiBhIHBsYXlsaXN0Ci0gICAgICAgIC8vIHdlIG1pZ2h0IGFzc3VtZSBleHRyYSBzdHJlYW1zLgorICAgICAgICAvLyBVc2UgbWluIHN0cmVhbSBkdXJhdGlvbiwgYnV0IGlnbm9yZSBzdHJlYW1zIHRoYXQgbmV2ZXIgaGF2ZSBhbnkgcGFja2V0CisgICAgICAgIC8vIGVucXVldWVkIHRvIHByZXZlbnQgdXMgZnJvbSB3YWl0aW5nIG9uIGEgbm9uLWV4aXN0ZW50IHN0cmVhbTsKKyAgICAgICAgLy8gd2hlbiB3ZSBjYW5ub3QgbWFrZSBvdXQgZnJvbSB0aGUgbWFuaWZlc3Qgd2hhdCBzdHJlYW1zIGFyZSBpbmNsdWRlZCBpbgorICAgICAgICAvLyBhIHBsYXlsaXN0IHdlIG1pZ2h0IGFzc3VtZSBleHRyYSBzdHJlYW1zLgorICAgICAgICBidWZmZXJlZER1cmF0aW9uVXMgPSAtMWxsOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYWNrZXRTb3VyY2VzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoKG1TdHJlYW1UeXBlTWFzayAmIG1QYWNrZXRTb3VyY2VzLmtleUF0KGkpKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoKG1TdHJlYW1UeXBlTWFzayAmIG1QYWNrZXRTb3VyY2VzLmtleUF0KGkpKSA9PSAwCisgICAgICAgICAgICAgICAgICAgIHx8IG1QYWNrZXRTb3VyY2VzW2ldLT5nZXRMYXRlc3RFbnF1ZXVlZE1ldGEoKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludDY0X3QgYnVmZmVyZWRTdHJlYW1EdXJhdGlvblVzID0KICAgICAgICAgICAgICAgICBtUGFja2V0U291cmNlcy52YWx1ZUF0KGkpLT5nZXRCdWZmZXJlZER1cmF0aW9uVXMoJmZpbmFsUmVzdWx0KTsKLSAgICAgICAgICAgIEFMT0dWKCJidWZmZXJlZCAlIiBQUklkNjQgIiBmb3Igc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyZWRTdHJlYW1EdXJhdGlvblVzLCBtUGFja2V0U291cmNlcy5rZXlBdChpKSk7Ci0gICAgICAgICAgICBpZiAoYnVmZmVyZWRTdHJlYW1EdXJhdGlvblVzID4gYnVmZmVyZWREdXJhdGlvblVzKSB7CisKKyAgICAgICAgICAgIEZTTE9HVihtUGFja2V0U291cmNlcy5rZXlBdChpKSwgImJ1ZmZlcmVkICVsbGQiLCAobG9uZyBsb25nKWJ1ZmZlcmVkU3RyZWFtRHVyYXRpb25Vcyk7CisKKyAgICAgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPT0gLTFsbAorICAgICAgICAgICAgICAgICB8fCBidWZmZXJlZFN0cmVhbUR1cmF0aW9uVXMgPCBidWZmZXJlZER1cmF0aW9uVXMpIHsKICAgICAgICAgICAgICAgICBidWZmZXJlZER1cmF0aW9uVXMgPSBidWZmZXJlZFN0cmVhbUR1cmF0aW9uVXM7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9Ci0gICAgZG93bmxvYWRNb3JlID0gKGJ1ZmZlcmVkRHVyYXRpb25VcyA8IGR1cmF0aW9uVG9CdWZmZXJVcyk7Ci0KLSAgICAvLyBzaWduYWwgc3RhcnQgaWYgYnVmZmVyZWQgdXAgYXQgbGVhc3QgdGhlIHRhcmdldCBzaXplCi0gICAgaWYgKCFtUHJlcGFyZWQgJiYgYnVmZmVyZWREdXJhdGlvblVzID4gdGFyZ2V0RHVyYXRpb25VcyAmJiBkb3dubG9hZE1vcmUpIHsKLSAgICAgICAgbVByZXBhcmVkID0gdHJ1ZTsKLQotICAgICAgICBBTE9HVigicHJlcGFyZWQsIGJ1ZmZlcmVkPSUiIFBSSWQ2NCAiID4gJSIgUFJJZDY0ICIiLAotICAgICAgICAgICAgICAgIGJ1ZmZlcmVkRHVyYXRpb25VcywgdGFyZ2V0RHVyYXRpb25Vcyk7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigid2hhdCIsIGtXaGF0VGVtcG9yYXJpbHlEb25lRmV0Y2hpbmcpOwotICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgaWYgKGJ1ZmZlcmVkRHVyYXRpb25VcyA9PSAtMWxsKSB7CisgICAgICAgICAgICBidWZmZXJlZER1cmF0aW9uVXMgPSAwbGw7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoZmluYWxSZXN1bHQgPT0gT0sgJiYgZG93bmxvYWRNb3JlKSB7Ci0gICAgICAgIEFMT0dWKCJtb25pdG9yaW5nLCBidWZmZXJlZD0lIiBQUklkNjQgIiA8ICUiIFBSSWQ2NCAiIiwKLSAgICAgICAgICAgICAgICBidWZmZXJlZER1cmF0aW9uVXMsIGR1cmF0aW9uVG9CdWZmZXJVcyk7CisgICAgaWYgKGZpbmFsUmVzdWx0ID09IE9LICYmIGJ1ZmZlcmVkRHVyYXRpb25VcyA8IGtNaW5CdWZmZXJlZER1cmF0aW9uVXMpIHsKKyAgICAgICAgRkxPR1YoIm1vbml0b3JpbmcsIGJ1ZmZlcmVkPSVsbGQgPCAlbGxkIiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKWJ1ZmZlcmVkRHVyYXRpb25VcywgKGxvbmcgbG9uZylrTWluQnVmZmVyZWREdXJhdGlvblVzKTsKKwogICAgICAgICAvLyBkZWxheSB0aGUgbmV4dCBkb3dubG9hZCBzbGlnaHRseTsgaG9wZWZ1bGx5IHRoaXMgZ2l2ZXMgb3RoZXIgY29uY3VycmVudCBmZXRjaGVycwogICAgICAgICAvLyBhIGJldHRlciBjaGFuY2UgdG8gcnVuLgogICAgICAgICAvLyBvbkRvd25sb2FkTmV4dCgpOwotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RG93bmxvYWROZXh0LCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdERvd25sb2FkTmV4dCwgdGhpcyk7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtTW9uaXRvclF1ZXVlR2VuZXJhdGlvbik7CiAgICAgICAgIG1zZy0+cG9zdCgxMDAwbCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gTm90aGluZyB0byBkbyB5ZXQsIHRyeSBhZ2FpbiBpbiBhIHNlY29uZC4KKyAgICAgICAgLy8gV2UnZCBsaWtlIHRvIG1haW50YWluIGJ1ZmZlcmluZyBhYm92ZSBkdXJhdGlvblRvQnVmZmVyVXMsIHNvIHRyeQorICAgICAgICAvLyBhZ2FpbiB3aGVuIGJ1ZmZlciBqdXN0IGFib3V0IHRvIGdvIGJlbG93IGR1cmF0aW9uVG9CdWZmZXJVcworICAgICAgICAvLyAob3IgYWZ0ZXIgdGFyZ2V0RHVyYXRpb25VcyAvIDIsIHdoaWNoZXZlciBpcyBzbWFsbGVyKS4KKyAgICAgICAgaW50NjRfdCBkZWxheVVzID0gYnVmZmVyZWREdXJhdGlvblVzIC0ga01pbkJ1ZmZlcmVkRHVyYXRpb25VcyArIDEwMDAwMDBsbDsKKyAgICAgICAgaWYgKGRlbGF5VXMgPiB0YXJnZXREdXJhdGlvblVzIC8gMikgeworICAgICAgICAgICAgZGVsYXlVcyA9IHRhcmdldER1cmF0aW9uVXMgLyAyOworICAgICAgICB9CiAKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICBtc2ctPnNldEludDMyKCJ3aGF0Iiwga1doYXRUZW1wb3JhcmlseURvbmVGZXRjaGluZyk7Ci0gICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICBGTE9HVigicGF1c2luZyBmb3IgJWxsZCwgYnVmZmVyZWQ9JWxsZCA+ICVsbGQiLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZGVsYXlVcywKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKWJ1ZmZlcmVkRHVyYXRpb25VcywKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKWtNaW5CdWZmZXJlZER1cmF0aW9uVXMpOwogCi0gICAgICAgIGludDY0X3QgZGVsYXlVcyA9IG1QcmVwYXJlZCA/IGtNYXhNb25pdG9yRGVsYXlVcyA6IHRhcmdldER1cmF0aW9uVXMgLyAyOwotICAgICAgICBBTE9HVigicGF1c2luZyBmb3IgJSIgUFJJZDY0ICIsIGJ1ZmZlcmVkPSUiIFBSSWQ2NCAiID4gJSIgUFJJZDY0ICIiLAotICAgICAgICAgICAgICAgIGRlbGF5VXMsIGJ1ZmZlcmVkRHVyYXRpb25VcywgZHVyYXRpb25Ub0J1ZmZlclVzKTsKLSAgICAgICAgLy8gOlRSSUNLWTogbmVlZCB0byBlbmZvcmNlIG1pbmltdW0gZGVsYXkgYmVjYXVzZSB0aGUgZGVsYXkgdG8KLSAgICAgICAgLy8gcmVmcmVzaCB0aGUgcGxheWxpc3Qgd2lsbCBiZWNvbWUgMAotICAgICAgICBwb3N0TW9uaXRvclF1ZXVlKGRlbGF5VXMsIG1QcmVwYXJlZCA/IHRhcmdldER1cmF0aW9uVXMgKiAyIDogMCk7CisgICAgICAgIHBvc3RNb25pdG9yUXVldWUoZGVsYXlVcyk7CiAgICAgfQogfQogCiBzdGF0dXNfdCBQbGF5bGlzdEZldGNoZXI6OnJlZnJlc2hQbGF5bGlzdCgpIHsKICAgICBpZiAoZGVsYXlVc1RvUmVmcmVzaFBsYXlsaXN0KCkgPD0gMCkgewogICAgICAgICBib29sIHVuY2hhbmdlZDsKLSAgICAgICAgc3A8TTNVUGFyc2VyPiBwbGF5bGlzdCA9IG1TZXNzaW9uLT5mZXRjaFBsYXlsaXN0KAorICAgICAgICBzcDxNM1VQYXJzZXI+IHBsYXlsaXN0ID0gbUhUVFBEb3dubG9hZGVyLT5mZXRjaFBsYXlsaXN0KAogICAgICAgICAgICAgICAgIG1VUkkuY19zdHIoKSwgbVBsYXlsaXN0SGFzaCwgJnVuY2hhbmdlZCk7CiAKICAgICAgICAgaWYgKHBsYXlsaXN0ID09IE5VTEwpIHsKQEAgLTcxNSw2ICs4NzIsMTQgQEAKICAgICAgICAgICAgIGlmIChtUGxheWxpc3QtPmlzQ29tcGxldGUoKSB8fCBtUGxheWxpc3QtPmlzRXZlbnQoKSkgewogICAgICAgICAgICAgICAgIHVwZGF0ZUR1cmF0aW9uKCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBOb3RpZnkgTGl2ZVNlc3Npb24gdG8gdXNlIHRhcmdldC1kdXJhdGlvbiBiYXNlZCBidWZmZXJpbmcgbGV2ZWwKKyAgICAgICAgICAgIC8vIGZvciB1cC9kb3duIHN3aXRjaC4gRGVmYXVsdCBMaXZlU2Vzc2lvbjo6a1VwU3dpdGNoTWFyayBtYXkgbm90CisgICAgICAgICAgICAvLyBiZSByZWFjaGFibGUgZm9yIGxpdmUgc3RyZWFtcywgYXMgb3VyIG1heCBidWZmZXJpbmcgYW1vdW50IGlzCisgICAgICAgICAgICAvLyBsaW1pdGVkIHRvIDMgc2VnbWVudHMuCisgICAgICAgICAgICBpZiAoIW1QbGF5bGlzdC0+aXNDb21wbGV0ZSgpKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlVGFyZ2V0RHVyYXRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QbGF5bGlzdFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CiAgICAgICAgIH0KIAogICAgICAgICBtTGFzdFBsYXlsaXN0RmV0Y2hUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwpAQCAtNzI3LDI1ICs4OTIsODMgQEAKICAgICByZXR1cm4gYnVmZmVyLT5zaXplKCkgPiAwICYmIGJ1ZmZlci0+ZGF0YSgpWzBdID09IDB4NDc7CiB9CiAKLXZvaWQgUGxheWxpc3RGZXRjaGVyOjpvbkRvd25sb2FkTmV4dCgpIHsKK2Jvb2wgUGxheWxpc3RGZXRjaGVyOjpzaG91bGRQYXVzZURvd25sb2FkKCkgeworICAgIGlmIChtU3RyZWFtVHlwZU1hc2sgPT0gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfU1VCVElUTEVTKSB7CisgICAgICAgIC8vIGRvZXNuJ3QgYXBwbHkgdG8gc3VidGl0bGVzCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDYWxjdWxhdGUgdGhyZXNob2xkIHRvIGFib3J0IGN1cnJlbnQgZG93bmxvYWQKKyAgICBmbG9hdCB0aHJlc2hvbGRSYXRpbyA9IGdldFN0b3BwaW5nVGhyZXNob2xkKCk7CisKKyAgICBpZiAodGhyZXNob2xkUmF0aW8gPCAwLjBmKSB7CisgICAgICAgIC8vIG5ldmVyIGFib3J0CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKHRocmVzaG9sZFJhdGlvID09IDAuMGYpIHsKKyAgICAgICAgLy8gaW1tZWRpYXRlbHkgYWJvcnQKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gbm93IHdlIGhhdmUgYSBwb3NpdGl2ZSB0aHJlc2hvbGRVcywgYWJvcnQgaWYgcmVtYWluaW5nCisgICAgLy8gcG9ydGlvbiB0byBkb3dubG9hZCBpcyBvdmVyIHRoYXQgdGhyZXNob2xkLgorICAgIGlmIChtU2VnbWVudEZpcnN0UFRTIDwgMCkgeworICAgICAgICAvLyB0aGlzIG1lYW5zIHdlIGhhdmVuJ3QgZXZlbiBmaW5kIHRoZSBmaXJzdCBhY2Nlc3MgdW5pdCwKKyAgICAgICAgLy8gYWJvcnQgbm93IGFzIHdlIG11c3QgYmUgdmVyeSBmYXIgYXdheSBmcm9tIHRoZSBlbmQuCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpbnQ2NF90IGxhc3RFbnF1ZXVlVXMgPSBtU2VnbWVudEZpcnN0UFRTOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBhY2tldFNvdXJjZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKChtU3RyZWFtVHlwZU1hc2sgJiBtUGFja2V0U291cmNlcy5rZXlBdChpKSkgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1ldGEgPSBtUGFja2V0U291cmNlc1tpXS0+Z2V0TGF0ZXN0RW5xdWV1ZWRNZXRhKCk7CisgICAgICAgIGludDMyX3QgdHlwZTsKKyAgICAgICAgaWYgKG1ldGEgPT0gTlVMTCB8fCBtZXRhLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHkiLCAmdHlwZSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGludDY0X3QgdG1wVXM7CisgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRtcFVzKSk7CisgICAgICAgIGlmICh0bXBVcyA+IGxhc3RFbnF1ZXVlVXMpIHsKKyAgICAgICAgICAgIGxhc3RFbnF1ZXVlVXMgPSB0bXBVczsKKyAgICAgICAgfQorICAgIH0KKyAgICBsYXN0RW5xdWV1ZVVzIC09IG1TZWdtZW50Rmlyc3RQVFM7CisKKyAgICBpbnQ2NF90IHRhcmdldER1cmF0aW9uVXMgPSBtUGxheWxpc3QtPmdldFRhcmdldER1cmF0aW9uKCk7CisgICAgaW50NjRfdCB0aHJlc2hvbGRVcyA9IHRocmVzaG9sZFJhdGlvICogdGFyZ2V0RHVyYXRpb25VczsKKworICAgIEZMT0dWKCIlc3BhdXNpbmcgbm93LCB0aHJlc2hvbGRVcyAlbGxkLCByZW1haW5pbmcgJWxsZCIsCisgICAgICAgICAgICB0YXJnZXREdXJhdGlvblVzIC0gbGFzdEVucXVldWVVcyA+IHRocmVzaG9sZFVzID8gIiIgOiAibm90ICIsCisgICAgICAgICAgICAobG9uZyBsb25nKXRocmVzaG9sZFVzLAorICAgICAgICAgICAgKGxvbmcgbG9uZykodGFyZ2V0RHVyYXRpb25VcyAtIGxhc3RFbnF1ZXVlVXMpKTsKKworICAgIGlmICh0YXJnZXREdXJhdGlvblVzIC0gbGFzdEVucXVldWVVcyA+IHRocmVzaG9sZFVzKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUGxheWxpc3RGZXRjaGVyOjppbml0RG93bmxvYWRTdGF0ZSgKKyAgICAgICAgQVN0cmluZyAmdXJpLAorICAgICAgICBzcDxBTWVzc2FnZT4gJml0ZW1NZXRhLAorICAgICAgICBpbnQzMl90ICZmaXJzdFNlcU51bWJlckluUGxheWxpc3QsCisgICAgICAgIGludDMyX3QgJmxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KSB7CiAgICAgc3RhdHVzX3QgZXJyID0gcmVmcmVzaFBsYXlsaXN0KCk7Ci0gICAgaW50MzJfdCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgPSAwOwotICAgIGludDMyX3QgbGFzdFNlcU51bWJlckluUGxheWxpc3QgPSAwOworICAgIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IDA7CisgICAgbGFzdFNlcU51bWJlckluUGxheWxpc3QgPSAwOwogICAgIGJvb2wgZGlzY29udGludWl0eSA9IGZhbHNlOwogCiAgICAgaWYgKG1QbGF5bGlzdCAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChtUGxheWxpc3QtPm1ldGEoKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtUGxheWxpc3QtPm1ldGEoKS0+ZmluZEludDMyKCJtZWRpYS1zZXF1ZW5jZSIsICZmaXJzdFNlcU51bWJlckluUGxheWxpc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgbGFzdFNlcU51bWJlckluUGxheWxpc3QgPQotICAgICAgICAgICAgICAgIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCArIChpbnQzMl90KW1QbGF5bGlzdC0+c2l6ZSgpIC0gMTsKKyAgICAgICAgbVBsYXlsaXN0LT5nZXRTZXFOdW1iZXJSYW5nZSgKKyAgICAgICAgICAgICAgICAmZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LCAmbGFzdFNlcU51bWJlckluUGxheWxpc3QpOwogCiAgICAgICAgIGlmIChtRGlzY29udGludWl0eVNlcSA8IDApIHsKICAgICAgICAgICAgIG1EaXNjb250aW51aXR5U2VxID0gbVBsYXlsaXN0LT5nZXREaXNjb250aW51aXR5U2VxKCk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBtU2VnbWVudEZpcnN0UFRTID0gLTFsbDsKKwogICAgIGlmIChtUGxheWxpc3QgIT0gTlVMTCAmJiBtU2VxTnVtYmVyIDwgMCkgewogICAgICAgICBDSEVDS19HRShtU3RhcnRUaW1lVXMsIDBsbCk7CiAKQEAgLTc2NCwxOCArOTg3LDI2IEBACiAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzIC09IGdldFNlZ21lbnRTdGFydFRpbWVVcyhtU2VxTnVtYmVyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1TdGFydFRpbWVVc1JlbGF0aXZlID0gdHJ1ZTsKLSAgICAgICAgICAgIEFMT0dWKCJJbml0aWFsIHNlcXVlbmNlIG51bWJlciBmb3IgdGltZSAlIiBQUklkNjQgIiBpcyAlZCBmcm9tICglZCAuLiAlZCkiLAotICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXMsIG1TZXFOdW1iZXIsIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKKyAgICAgICAgICAgIEZMT0dWKCJJbml0aWFsIHNlcXVlbmNlIG51bWJlciBmb3IgdGltZSAlbGxkIGlzICVkIGZyb20gKCVkIC4uICVkKSIsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbVN0YXJ0VGltZVVzLCBtU2VxTnVtYmVyLCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsCiAgICAgICAgICAgICAgICAgICAgIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFdoZW4gYWRhcHRpbmcgb3IgdHJhY2sgc3dpdGNoaW5nLCBtU2VnbWVudFN0YXJ0VGltZVVzIChyZWxhdGl2ZQogICAgICAgICAgICAgLy8gdG8gbWVkaWEgdGltZSAwKSBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgc3RhcnQgc2VnbWVudDsgbVN0YXJ0VGltZVVzIChhYnNvbHV0ZQogICAgICAgICAgICAgLy8gdGltZXN0YW1wcyBjb21pbmcgZnJvbSB0aGUgbWVkaWEgY29udGFpbmVyKSBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgcG9zaXRpb24KICAgICAgICAgICAgIC8vIGluc2lkZSBhIHNlZ21lbnRzLgotICAgICAgICAgICAgbVNlcU51bWJlciA9IGdldFNlcU51bWJlckZvclRpbWUobVNlZ21lbnRTdGFydFRpbWVVcyk7Ci0gICAgICAgICAgICBpZiAobUFkYXB0aXZlKSB7CisgICAgICAgICAgICBpZiAobVN0cmVhbVR5cGVNYXNrICE9IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1NVQlRJVExFUworICAgICAgICAgICAgICAgICAgICAmJiBtU2Vla01vZGUgIT0gTGl2ZVNlc3Npb246OmtTZWVrTW9kZU5leHRTYW1wbGUpIHsKICAgICAgICAgICAgICAgICAvLyBhdm9pZCBkb3VibGUgZmV0Y2gvZGVjb2RlCi0gICAgICAgICAgICAgICAgbVNlcU51bWJlciArPSAxOworICAgICAgICAgICAgICAgIC8vIFVzZSAobVNlZ21lbnRTdGFydFRpbWVVcyArIDEvMiAqIHRhcmdldER1cmF0aW9uVXMpIHRvIHNlYXJjaAorICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgc3RhcnRpbmcgc2VnbWVudCBpbiBuZXcgdmFyaWFudC4KKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdHdvIHZhcmlhbnRzJyBzZWdtZW50cyBhcmUgYWxpZ25lZCwgdGhpcyBnaXZlcyB0aGUKKyAgICAgICAgICAgICAgICAvLyBuZXh0IHNlZ21lbnQuIElmIHRoZXkncmUgbm90IGFsaWduZWQsIHRoaXMgZ2l2ZXMgdGhlIHNlZ21lbnQKKyAgICAgICAgICAgICAgICAvLyB0aGF0IG92ZXJsYXBzIG5vIG1vcmUgdGhhbiAxLzIgKiB0YXJnZXREdXJhdGlvblVzLgorICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBnZXRTZXFOdW1iZXJGb3JUaW1lKG1TZWdtZW50U3RhcnRUaW1lVXMKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbVBsYXlsaXN0LT5nZXRUYXJnZXREdXJhdGlvbigpIC8gMik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBnZXRTZXFOdW1iZXJGb3JUaW1lKG1TZWdtZW50U3RhcnRUaW1lVXMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3NpemVfdCBtaW5TZXEgPSBnZXRTZXFOdW1iZXJGb3JEaXNjb250aW51aXR5KG1EaXNjb250aW51aXR5U2VxKTsKICAgICAgICAgICAgIGlmIChtU2VxTnVtYmVyIDwgbWluU2VxKSB7CkBAIC03ODksNyArMTAyMCw3IEBACiAgICAgICAgICAgICBpZiAobVNlcU51bWJlciA+IGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KSB7CiAgICAgICAgICAgICAgICAgbVNlcU51bWJlciA9IGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoIkluaXRpYWwgc2VxdWVuY2UgbnVtYmVyIGZvciBsaXZlIGV2ZW50ICVkIGZyb20gKCVkIC4uICVkKSIsCisgICAgICAgICAgICBGTE9HVigiSW5pdGlhbCBzZXF1ZW5jZSBudW1iZXIgaXMgJWQgZnJvbSAoJWQgLi4gJWQpIiwKICAgICAgICAgICAgICAgICAgICAgbVNlcU51bWJlciwgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LAogICAgICAgICAgICAgICAgICAgICBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCk7CiAgICAgICAgIH0KQEAgLTgwOSwyNiArMTA0MCwyNCBAQAogICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggaW4gaW5jcmVhc2luZyBmcmFjdGlvbiAoMS8yLCAxLzMsIC4uLikgb2YgdGhlCiAgICAgICAgICAgICAgICAgLy8gcGxheWxpc3QncyB0YXJnZXQgZHVyYXRpb24gb3IgMyBzZWNvbmRzLCB3aGljaGV2ZXIgaXMgbGVzcwogICAgICAgICAgICAgICAgIGludDY0X3QgZGVsYXlVcyA9IGtNYXhNb25pdG9yRGVsYXlVczsKLSAgICAgICAgICAgICAgICBpZiAobVBsYXlsaXN0ICE9IE5VTEwgJiYgbVBsYXlsaXN0LT5tZXRhKCkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRhcmdldER1cmF0aW9uU2VjczsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobVBsYXlsaXN0LT5tZXRhKCktPmZpbmRJbnQzMigidGFyZ2V0LWR1cmF0aW9uIiwgJnRhcmdldER1cmF0aW9uU2VjcykpOwotICAgICAgICAgICAgICAgICAgICBkZWxheVVzID0gbVBsYXlsaXN0LT5zaXplKCkgKiB0YXJnZXREdXJhdGlvblNlY3MgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDBsbCAvICgxICsgbU51bVJldHJpZXMpOworICAgICAgICAgICAgICAgIGlmIChtUGxheWxpc3QgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBkZWxheVVzID0gbVBsYXlsaXN0LT5zaXplKCkgKiBtUGxheWxpc3QtPmdldFRhcmdldER1cmF0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICgxICsgbU51bVJldHJpZXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoZGVsYXlVcyA+IGtNYXhNb25pdG9yRGVsYXlVcykgewogICAgICAgICAgICAgICAgICAgICBkZWxheVVzID0ga01heE1vbml0b3JEZWxheVVzOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HVigic2VxdWVuY2UgbnVtYmVyIGhpZ2g6ICVkIGZyb20gKCVkIC4uICVkKSwgIgotICAgICAgICAgICAgICAgICAgICAgICJtb25pdG9yIGluICUiIFBSSWQ2NCAiIChyZXRyeT0lZCkiLAorICAgICAgICAgICAgICAgIEZMT0dWKCJzZXF1ZW5jZSBudW1iZXIgaGlnaDogJWQgZnJvbSAoJWQgLi4gJWQpLCAiCisgICAgICAgICAgICAgICAgICAgICAgIm1vbml0b3IgaW4gJWxsZCAocmV0cnk9JWQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIsIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0LCBkZWxheVVzLCBtTnVtUmV0cmllcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCwgKGxvbmcgbG9uZylkZWxheVVzLCBtTnVtUmV0cmllcyk7CiAgICAgICAgICAgICAgICAgcG9zdE1vbml0b3JRdWV1ZShkZWxheVVzKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyB3ZSd2ZSBtaXNzZWQgdGhlIGJvYXQsIGxldCdzIHN0YXJ0IDMgc2VnbWVudHMgcHJpb3IgdG8gdGhlIGxhdGVzdCBzZXF1ZW5jZQpAQCAtODQzLDEyICsxMDcyLDggQEAKICAgICAgICAgICAgICAgICAvLyBidXQgc2luY2UgdGhlIHNlZ21lbnRzIHdlIGFyZSBzdXBwb3NlZCB0byBmZXRjaCBoYXZlIGFscmVhZHkgcm9sbGVkIG9mZgogICAgICAgICAgICAgICAgIC8vIHRoZSBwbGF5bGlzdCwgaS5lLiB3ZSBoYXZlIGFscmVhZHkgbWlzc2VkIHRoZSBib2F0LCB3ZSBpbmV2aXRhYmx5IGhhdmUgdG8KICAgICAgICAgICAgICAgICAvLyBza2lwLgotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBhY2tldFNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gZm9ybWF0Q2hhbmdlID0gbVNlc3Npb24tPmNyZWF0ZUZvcm1hdENoYW5nZUJ1ZmZlcigpOwotICAgICAgICAgICAgICAgICAgICBtUGFja2V0U291cmNlcy52YWx1ZUF0KGkpLT5xdWV1ZUFjY2Vzc1VuaXQoZm9ybWF0Q2hhbmdlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RvcEFzeW5jKC8qIGNsZWFyID0gKi8gZmFsc2UpOwotICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICBub3RpZnlTdG9wUmVhY2hlZCgpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCAtIDM7CiAgICAgICAgICAgICBpZiAobVNlcU51bWJlciA8IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCkgewpAQCAtODU4LDI5ICsxMDgzLDE1NiBAQAogCiAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgZmluZCBzZXF1ZW5jZSBudW1iZXIgJWQgaW4gcGxheWxpc3QgIgotICAgICAgICAgICAgICAgICAiKGNvbnRhaW5zICVkIC0gJWQpIiwKLSAgICAgICAgICAgICAgICAgbVNlcU51bWJlciwgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LAotICAgICAgICAgICAgICAgICAgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ICsgKGludDMyX3QpbVBsYXlsaXN0LT5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgIGlmIChtUGxheWxpc3QgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgZmluZCBzZXF1ZW5jZSBudW1iZXIgJWQgaW4gcGxheWxpc3QgIgorICAgICAgICAgICAgICAgICAgICAgIihjb250YWlucyAlZCAtICVkKSIsCisgICAgICAgICAgICAgICAgICAgICBtU2VxTnVtYmVyLCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ICsgKGludDMyX3QpbVBsYXlsaXN0LT5zaXplKCkgLSAxKTsKIAotICAgICAgICAgICAgbm90aWZ5RXJyb3IoRVJST1JfRU5EX09GX1NUUkVBTSk7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgaWYgKG1UU1BhcnNlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIG1UU1BhcnNlci0+c2lnbmFsRU9TKEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgICAgICAgICAgICAgICAgICAvLyBVc2UgYW4gZW1wdHkgYnVmZmVyOyB3ZSBkb24ndCBoYXZlIGFueSBuZXcgZGF0YSwganVzdCB3YW50IHRvIGV4dHJhY3QKKyAgICAgICAgICAgICAgICAgICAgLy8gcG90ZW50aWFsIG5ldyBhY2Nlc3MgdW5pdHMgYWZ0ZXIgZmx1c2guICBSZXNldCBtU2VxTnVtYmVyIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0IHN1Y2ggdGhhdCB3ZSBzZXQgdGhlIGNvcnJlY3QgYWNjZXNzIHVuaXQKKyAgICAgICAgICAgICAgICAgICAgLy8gcHJvcGVydGllcyBpbiBleHRyYWN0QW5kUXVldWVBY2Nlc3NVbml0c0Zyb21Ucy4KKyAgICAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoMCk7CisgICAgICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdDsKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEFuZFF1ZXVlQWNjZXNzVW5pdHNGcm9tVHMoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3ZSB3ZXJlIG5ldmVyIGFibGUgdG8gZG93bmxvYWQgdGhlIHBsYXlsaXN0LgorICAgICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBzaG91bGQgbm90aWZ5IGVycm9yLCBpbnN0ZWFkIG9mIEVPUywgYXMgRU9TIGR1cmluZworICAgICAgICAgICAgICAgIC8vIHByZXBhcmUgbWVhbnMgd2Ugc3VjY2VlZGVkIGluIGRvd25sb2FkaW5nIGV2ZXJ5dGhpbmcuCisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBkb3dubG9hZCBwbGF5bGlzdCEiKTsKKyAgICAgICAgICAgICAgICBub3RpZnlFcnJvcihFUlJPUl9JTyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KIAogICAgIG1OdW1SZXRyaWVzID0gMDsKIAotICAgIEFTdHJpbmcgdXJpOwotICAgIHNwPEFNZXNzYWdlPiBpdGVtTWV0YTsKICAgICBDSEVDSyhtUGxheWxpc3QtPml0ZW1BdCgKICAgICAgICAgICAgICAgICBtU2VxTnVtYmVyIC0gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LAogICAgICAgICAgICAgICAgICZ1cmksCiAgICAgICAgICAgICAgICAgJml0ZW1NZXRhKSk7CiAKKyAgICBDSEVDSyhpdGVtTWV0YS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5LXNlcXVlbmNlIiwgJm1EaXNjb250aW51aXR5U2VxKSk7CisKICAgICBpbnQzMl90IHZhbDsKICAgICBpZiAoaXRlbU1ldGEtPmZpbmRJbnQzMigiZGlzY29udGludWl0eSIsICZ2YWwpICYmIHZhbCAhPSAwKSB7Ci0gICAgICAgIG1EaXNjb250aW51aXR5U2VxKys7CiAgICAgICAgIGRpc2NvbnRpbnVpdHkgPSB0cnVlOworICAgIH0gZWxzZSBpZiAobUxhc3REaXNjb250aW51aXR5U2VxID49IDAKKyAgICAgICAgICAgICYmIG1EaXNjb250aW51aXR5U2VxICE9IG1MYXN0RGlzY29udGludWl0eVNlcSkgeworICAgICAgICAvLyBTZWVrIGp1bXBlZCB0byBhIG5ldyBkaXNjb250aW51aXR5IHNlcXVlbmNlLiBXZSBuZWVkIHRvIHNpZ25hbAorICAgICAgICAvLyBhIGZvcm1hdCBjaGFuZ2UgdG8gZGVjb2Rlci4gRGVjb2RlciBuZWVkcyB0byBzaHV0ZG93biBhbmQgYmUKKyAgICAgICAgLy8gY3JlYXRlZCBhZ2FpbiBpZiBzZWFtbGVzcyBmb3JtYXQgY2hhbmdlIGlzIHVuc3VwcG9ydGVkLgorICAgICAgICBGTE9HVigic2F3IGRpc2NvbnRpbnVpdHk6IG1TdGFydHVwICVkLCBtTGFzdERpc2NvbnRpbnVpdHlTZXEgJWQsICIKKyAgICAgICAgICAgICAgICAibURpc2NvbnRpbnVpdHlTZXEgJWQsIG1TdGFydFRpbWVVcyAlbGxkIiwKKyAgICAgICAgICAgICAgICBtU3RhcnR1cCwgbUxhc3REaXNjb250aW51aXR5U2VxLCBtRGlzY29udGludWl0eVNlcSwgKGxvbmcgbG9uZyltU3RhcnRUaW1lVXMpOworICAgICAgICBkaXNjb250aW51aXR5ID0gdHJ1ZTsKKyAgICB9CisgICAgbUxhc3REaXNjb250aW51aXR5U2VxID0gLTE7CisKKyAgICAvLyBkZWNyeXB0IGEganVuayBidWZmZXIgdG8gcHJlZmV0Y2gga2V5OyBzaW5jZSBhIHNlc3Npb24gdXNlcyBvbmx5IG9uZSBodHRwIGNvbm5lY3Rpb24sCisgICAgLy8gdGhpcyBhdm9pZHMgaW50ZXJsZWF2ZWQgY29ubmVjdGlvbnMgdG8gdGhlIGtleSBhbmQgc2VnbWVudCBmaWxlLgorICAgIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4ganVuayA9IG5ldyBBQnVmZmVyKDE2KTsKKyAgICAgICAganVuay0+c2V0UmFuZ2UoMCwgMTYpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBkZWNyeXB0QnVmZmVyKG1TZXFOdW1iZXIgLSBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsIGp1bmssCisgICAgICAgICAgICAgICAgdHJ1ZSAvKiBmaXJzdCAqLyk7CisgICAgICAgIGlmIChlcnIgPT0gRVJST1JfTk9UX0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgbm90aWZ5RXJyb3IoZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgobVN0YXJ0dXAgJiYgIW1UaW1lQ2hhbmdlU2lnbmFsZWQpIHx8IGRpc2NvbnRpbnVpdHkpIHsKKyAgICAgICAgLy8gV2UgbmVlZCB0byBzaWduYWwgYSB0aW1lIGRpc2NvbnRpbnVpdHkgdG8gQVRTUGFyc2VyIG9uIHRoZQorICAgICAgICAvLyBmaXJzdCBzZWdtZW50IGFmdGVyIHN0YXJ0LCBvciBvbiBhIGRpc2NvbnRpbnVpdHkgc2VnbWVudC4KKyAgICAgICAgLy8gU2V0dGluZyBtTmV4dFBUU1RpbWVVcyBpbmZvcm1zIGV4dHJhY3RBbmRRdWV1ZUFjY2Vzc1VuaXRzWFgoKQorICAgICAgICAvLyB0byBzZW5kIHRoZSB0aW1lIGRpc2NvbnRpbnVpdHkuCisgICAgICAgIGlmIChtUGxheWxpc3QtPmlzQ29tcGxldGUoKSB8fCBtUGxheWxpc3QtPmlzRXZlbnQoKSkgeworICAgICAgICAgICAgLy8gSWYgdGhpcyB3YXMgYSBsaXZlIGV2ZW50IHRoaXMgbWFkZSBubyBzZW5zZSBzaW5jZQorICAgICAgICAgICAgLy8gd2UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gYWxsIHRoZSBzZWdtZW50IGJlZm9yZSB0aGUgY3VycmVudAorICAgICAgICAgICAgLy8gb25lLgorICAgICAgICAgICAgbU5leHRQVFNUaW1lVXMgPSBnZXRTZWdtZW50U3RhcnRUaW1lVXMobVNlcU51bWJlcik7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXR0aW5nIG1UaW1lQ2hhbmdlU2lnbmFsZWQgdG8gdHJ1ZSwgc28gdGhhdCBpZiBzdGFydCB0aW1lCisgICAgICAgIC8vIHNlYXJjaGluZyBnb2VzIGludG8gMm5kIHNlZ21lbnQgKHdpdGhvdXQgYSBkaXNjb250aW51aXR5KSwKKyAgICAgICAgLy8gd2UgZG9uJ3QgcmVzZXQgdGltZSBhZ2Fpbi4gSXQgY2F1c2VzIGNvcnJ1cHRpb24gd2hlbiBwZW5kaW5nCisgICAgICAgIC8vIGRhdGEgaW4gQVRTUGFyc2VyIGlzIGNsZWFyZWQuCisgICAgICAgIG1UaW1lQ2hhbmdlU2lnbmFsZWQgPSB0cnVlOworICAgIH0KKworICAgIGlmIChkaXNjb250aW51aXR5KSB7CisgICAgICAgIEFMT0dJKCJxdWV1ZWluZyBkaXNjb250aW51aXR5IChleHBsaWNpdD0lZCkiLCBkaXNjb250aW51aXR5KTsKKworICAgICAgICAvLyBTaWduYWwgYSBmb3JtYXQgZGlzY29udGludWl0eSB0byBBVFNQYXJzZXIgdG8gY2xlYXIgcGFydGlhbCBkYXRhCisgICAgICAgIC8vIGZyb20gcHJldmlvdXMgc3RyZWFtcy4gTm90IGRvaW5nIHRoaXMgY2F1c2VzIGJpdHN0cmVhbSBjb3JydXB0aW9uLgorICAgICAgICBpZiAobVRTUGFyc2VyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1UU1BhcnNlci0+c2lnbmFsRGlzY29udGludWl0eSgKKyAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0ZPUk1BVENIQU5HRSwgTlVMTCAvKiBleHRyYSAqLyk7CisgICAgICAgIH0KKworICAgICAgICBxdWV1ZURpc2NvbnRpbnVpdHkoCisgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0ZPUk1BVF9PTkxZLAorICAgICAgICAgICAgICAgIE5VTEwgLyogZXh0cmEgKi8pOworCisgICAgICAgIGlmIChtU3RhcnR1cCAmJiBtU3RhcnRUaW1lVXNSZWxhdGl2ZSAmJiBtRmlyc3RQVFNWYWxpZCkgeworICAgICAgICAgICAgLy8gVGhpcyBtZWFucyB3ZSBndWVzc2VkIG1TdGFydFRpbWVVcyB0byBiZSBpbiB0aGUgcHJldmlvdXMKKyAgICAgICAgICAgIC8vIHNlZ21lbnQgKGxpa2VseSB2ZXJ5IGNsb3NlIHRvIHRoZSBlbmQpLCBidXQgZWl0aGVyIHZpZGVvIG9yCisgICAgICAgICAgICAvLyBhdWRpbyBoYXMgbm90IGZvdW5kIHN0YXJ0IGJ5IHRoZSBlbmQgb2YgdGhhdCBzZWdtZW50LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElmIHRoaXMgbmV3IHNlZ21lbnQgaXMgbm90IGEgZGlzY29udGludWl0eSwga2VlcCBzZWFyY2hpbmcuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgdGhpcyBuZXcgc2VnbWVudCBldmVuIGdvdCBhIGRpc2NvbnRpbnVpdHkgbWFya2VyLCBqdXN0CisgICAgICAgICAgICAvLyBzZXQgbVN0YXJ0VGltZVVzPTAsIGFuZCB0YWtlIGFsbCBzYW1wbGVzIGZyb20gbm93IG9uLgorICAgICAgICAgICAgbVN0YXJ0VGltZVVzID0gMDsKKyAgICAgICAgICAgIG1GaXJzdFBUU1ZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICBtSURSRm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+Y2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEZMT0dWKCJmZXRjaGluZyBzZWdtZW50ICVkIGZyb20gKCVkIC4uICVkKSIsCisgICAgICAgICAgICBtU2VxTnVtYmVyLCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBQbGF5bGlzdEZldGNoZXI6Om9uRG93bmxvYWROZXh0KCkgeworICAgIEFTdHJpbmcgdXJpOworICAgIHNwPEFNZXNzYWdlPiBpdGVtTWV0YTsKKyAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgc3A8QUJ1ZmZlcj4gdHNCdWZmZXI7CisgICAgaW50MzJfdCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgPSAwOworICAgIGludDMyX3QgbGFzdFNlcU51bWJlckluUGxheWxpc3QgPSAwOworICAgIGJvb2wgY29ubmVjdEhUVFAgPSB0cnVlOworCisgICAgaWYgKG1Eb3dubG9hZFN0YXRlLT5oYXNTYXZlZFN0YXRlKCkpIHsKKyAgICAgICAgbURvd25sb2FkU3RhdGUtPnJlc3RvcmVTdGF0ZSgKKyAgICAgICAgICAgICAgICB1cmksCisgICAgICAgICAgICAgICAgaXRlbU1ldGEsCisgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgIHRzQnVmZmVyLAorICAgICAgICAgICAgICAgIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKKyAgICAgICAgICAgICAgICBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCk7CisgICAgICAgIGNvbm5lY3RIVFRQID0gZmFsc2U7CisgICAgICAgIEZMT0dWKCJyZXN1bWluZzogJyVzJyIsIHVyaS5jX3N0cigpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIWluaXREb3dubG9hZFN0YXRlKAorICAgICAgICAgICAgICAgIHVyaSwKKyAgICAgICAgICAgICAgICBpdGVtTWV0YSwKKyAgICAgICAgICAgICAgICBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsCisgICAgICAgICAgICAgICAgbGFzdFNlcU51bWJlckluUGxheWxpc3QpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgRkxPR1YoImZldGNoaW5nOiAnJXMnIiwgdXJpLmNfc3RyKCkpOwogICAgIH0KIAogICAgIGludDY0X3QgcmFuZ2Vfb2Zmc2V0LCByYW5nZV9sZW5ndGg7CkBAIC04OTAsMzMgKzEyNDIsMTkgQEAKICAgICAgICAgcmFuZ2VfbGVuZ3RoID0gLTE7CiAgICAgfQogCi0gICAgQUxPR1YoImZldGNoaW5nIHNlZ21lbnQgJWQgZnJvbSAoJWQgLi4gJWQpIiwKLSAgICAgICAgICBtU2VxTnVtYmVyLCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KTsKLQotICAgIEFMT0dWKCJmZXRjaGluZyAnJXMnIiwgdXJpLmNfc3RyKCkpOwotCi0gICAgc3A8RGF0YVNvdXJjZT4gc291cmNlOwotICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciwgdHNCdWZmZXI7Ci0gICAgLy8gZGVjcnlwdCBhIGp1bmsgYnVmZmVyIHRvIHByZWZldGNoIGtleTsgc2luY2UgYSBzZXNzaW9uIHVzZXMgb25seSBvbmUgaHR0cCBjb25uZWN0aW9uLAotICAgIC8vIHRoaXMgYXZvaWRzIGludGVybGVhdmVkIGNvbm5lY3Rpb25zIHRvIHRoZSBrZXkgYW5kIHNlZ21lbnQgZmlsZS4KLSAgICB7Ci0gICAgICAgIHNwPEFCdWZmZXI+IGp1bmsgPSBuZXcgQUJ1ZmZlcigxNik7Ci0gICAgICAgIGp1bmstPnNldFJhbmdlKDAsIDE2KTsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gZGVjcnlwdEJ1ZmZlcihtU2VxTnVtYmVyIC0gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LCBqdW5rLAotICAgICAgICAgICAgICAgIHRydWUgLyogZmlyc3QgKi8pOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBub3RpZnlFcnJvcihlcnIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLy8gYmxvY2std2lzZSBkb3dubG9hZAotICAgIGJvb2wgc3RhcnR1cCA9IG1TdGFydHVwOworICAgIGJvb2wgc2hvdWxkUGF1c2UgPSBmYWxzZTsKICAgICBzc2l6ZV90IGJ5dGVzUmVhZDsKICAgICBkbyB7Ci0gICAgICAgIGJ5dGVzUmVhZCA9IG1TZXNzaW9uLT5mZXRjaEZpbGUoCi0gICAgICAgICAgICAgICAgdXJpLmNfc3RyKCksICZidWZmZXIsIHJhbmdlX29mZnNldCwgcmFuZ2VfbGVuZ3RoLCBrRG93bmxvYWRCbG9ja1NpemUsICZzb3VyY2UpOworICAgICAgICBpbnQ2NF90IHN0YXJ0VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgICAgICBieXRlc1JlYWQgPSBtSFRUUERvd25sb2FkZXItPmZldGNoQmxvY2soCisgICAgICAgICAgICAgICAgdXJpLmNfc3RyKCksICZidWZmZXIsIHJhbmdlX29mZnNldCwgcmFuZ2VfbGVuZ3RoLCBrRG93bmxvYWRCbG9ja1NpemUsCisgICAgICAgICAgICAgICAgTlVMTCAvKiBhY3R1YWxVUkwgKi8sIGNvbm5lY3RIVFRQKTsKKyAgICAgICAgaW50NjRfdCBkZWxheVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VXM7CiAKKyAgICAgICAgaWYgKGJ5dGVzUmVhZCA9PSBFUlJPUl9OT1RfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgaWYgKGJ5dGVzUmVhZCA8IDApIHsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGJ5dGVzUmVhZDsKICAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZmV0Y2ggLnRzIHNlZ21lbnQgYXQgdXJsICclcyciLCB1cmkuY19zdHIoKSk7CkBAIC05MjQsNiArMTI2MiwyMiBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gYWRkIHNhbXBsZSBmb3IgYmFuZHdpZHRoIGVzdGltYXRpb24sIGV4Y2x1ZGluZyBzYW1wbGVzIGZyb20gc3VidGl0bGVzIChhcworICAgICAgICAvLyBpdHMgdG9vIHNtYWxsKSwgb3IgZHVyaW5nIHN0YXJ0dXAvcmVzdW1lVW50aWwgKHdoZW4gd2UgY291bGQgaGF2ZSBtb3JlIHRoYW4KKyAgICAgICAgLy8gb25lIGNvbm5lY3Rpb24gb3BlbiB3aGljaCBhZmZlY3RzIGJhbmR3aWR0aCkKKyAgICAgICAgaWYgKCFtU3RhcnR1cCAmJiBtU3RvcFBhcmFtcyA9PSBOVUxMICYmIGJ5dGVzUmVhZCA+IDAKKyAgICAgICAgICAgICAgICAmJiAobVN0cmVhbVR5cGVNYXNrCisgICAgICAgICAgICAgICAgICAgICAgICAmIChMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9BVURJTworICAgICAgICAgICAgICAgICAgICAgICAgfCBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9WSURFTykpKSB7CisgICAgICAgICAgICBtU2Vzc2lvbi0+YWRkQmFuZHdpZHRoTWVhc3VyZW1lbnQoYnl0ZXNSZWFkLCBkZWxheVVzKTsKKyAgICAgICAgICAgIGlmIChkZWxheVVzID4gMjAwMDAwMGxsKSB7CisgICAgICAgICAgICAgICAgRkxPR1YoImJ5dGVzUmVhZCAlemQgdG9vayAlLjJmIHNlY29uZHMgLSBhYm5vcm1hbCBiYW5kd2lkdGggZGlwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzUmVhZCwgKGRvdWJsZSlkZWxheVVzIC8gMS4wZTYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY29ubmVjdEhUVFAgPSBmYWxzZTsKKwogICAgICAgICBDSEVDSyhidWZmZXIgIT0gTlVMTCk7CiAKICAgICAgICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnNpemUoKTsKQEAgLTk0MSwyOCArMTI5NSw3IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoc3RhcnR1cCB8fCBkaXNjb250aW51aXR5KSB7Ci0gICAgICAgICAgICAvLyBTaWduYWwgZGlzY29udGludWl0eS4KLQotICAgICAgICAgICAgaWYgKG1QbGF5bGlzdC0+aXNDb21wbGV0ZSgpIHx8IG1QbGF5bGlzdC0+aXNFdmVudCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyB3YXMgYSBsaXZlIGV2ZW50IHRoaXMgbWFkZSBubyBzZW5zZSBzaW5jZQotICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIGFsbCB0aGUgc2VnbWVudCBiZWZvcmUgdGhlIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAvLyBvbmUuCi0gICAgICAgICAgICAgICAgbU5leHRQVFNUaW1lVXMgPSBnZXRTZWdtZW50U3RhcnRUaW1lVXMobVNlcU51bWJlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChkaXNjb250aW51aXR5KSB7Ci0gICAgICAgICAgICAgICAgQUxPR0koInF1ZXVlaW5nIGRpc2NvbnRpbnVpdHkgKGV4cGxpY2l0PSVkKSIsIGRpc2NvbnRpbnVpdHkpOwotCi0gICAgICAgICAgICAgICAgcXVldWVEaXNjb250aW51aXR5KAotICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0ZPUk1BVENIQU5HRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogZXh0cmEgKi8pOwotCi0gICAgICAgICAgICAgICAgZGlzY29udGludWl0eSA9IGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGFydHVwID0gZmFsc2U7Ci0gICAgICAgIH0KKyAgICAgICAgYm9vbCBzdGFydFVwID0gbVN0YXJ0dXA7IC8vIHNhdmUgY3VycmVudCBzdGFydCB1cCBzdGF0ZQogCiAgICAgICAgIGVyciA9IE9LOwogICAgICAgICBpZiAoYnVmZmVyU3RhcnRzV2l0aFRzU3luY0J5dGUoYnVmZmVyKSkgewpAQCAtOTc2LDcgKzEzMDksNiBAQAogICAgICAgICAgICAgICAgIHRzQnVmZmVyLT5zZXRSYW5nZSh0c09mZiwgdHNTaXplKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRzQnVmZmVyLT5zZXRSYW5nZSh0c0J1ZmZlci0+b2Zmc2V0KCksIHRzQnVmZmVyLT5zaXplKCkgKyBieXRlc1JlYWQpOwotCiAgICAgICAgICAgICBlcnIgPSBleHRyYWN0QW5kUXVldWVBY2Nlc3NVbml0c0Zyb21Ucyh0c0J1ZmZlcik7CiAgICAgICAgIH0KIApAQCAtOTkxLDIzICsxMzIzLDQ1IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX09VVF9PRl9SQU5HRSkgewogICAgICAgICAgICAgLy8gcmVhY2hlZCBzdG9wcGluZyBwb2ludAotICAgICAgICAgICAgc3RvcEFzeW5jKC8qIGNsZWFyID0gKi8gZmFsc2UpOworICAgICAgICAgICAgbm90aWZ5U3RvcFJlYWNoZWQoKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIG5vdGlmeUVycm9yKGVycik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLQorICAgICAgICAvLyBJZiB3ZSdyZSBzd2l0Y2hpbmcsIHBvc3Qgc3RhcnQgbm90aWZpY2F0aW9uCisgICAgICAgIC8vIHRoaXMgc2hvdWxkIG9ubHkgYmUgcG9zdGVkIHdoZW4gdGhlIGxhc3QgY2h1bmsgaXMgZnVsbCBwcm9jZXNzZWQgYnkgVFNQYXJzZXIKKyAgICAgICAgaWYgKG1TZWVrTW9kZSAhPSBMaXZlU2Vzc2lvbjo6a1NlZWtNb2RlRXhhY3RQb3NpdGlvbiAmJiBzdGFydFVwICE9IG1TdGFydHVwKSB7CisgICAgICAgICAgICBDSEVDSyhtU3RhcnRUaW1lVXNOb3RpZnkgIT0gTlVMTCk7CisgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS5jbGVhcigpOworICAgICAgICAgICAgc2hvdWxkUGF1c2UgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChzaG91bGRQYXVzZSB8fCBzaG91bGRQYXVzZURvd25sb2FkKCkpIHsKKyAgICAgICAgICAgIC8vIHNhdmUgc3RhdGUgYW5kIHJldHVybiBpZiB0aGlzIGlzIG5vdCB0aGUgbGFzdCBjaHVuaywKKyAgICAgICAgICAgIC8vIGxlYXZpbmcgdGhlIGZldGNoZXIgaW4gcGF1c2VkIHN0YXRlLgorICAgICAgICAgICAgaWYgKGJ5dGVzUmVhZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgbURvd25sb2FkU3RhdGUtPnNhdmVTdGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1NZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgdHNCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2hvdWxkUGF1c2UgPSB0cnVlOworICAgICAgICB9CiAgICAgfSB3aGlsZSAoYnl0ZXNSZWFkICE9IDApOwogCiAgICAgaWYgKGJ1ZmZlclN0YXJ0c1dpdGhUc1N5bmNCeXRlKGJ1ZmZlcikpIHsKICAgICAgICAgLy8gSWYgd2UgZG9uJ3Qgc2VlIGEgc3RyZWFtIGluIHRoZSBwcm9ncmFtIHRhYmxlIGFmdGVyIGZldGNoaW5nIGEgZnVsbCB0cyBzZWdtZW50CiAgICAgICAgIC8vIG1hcmsgaXQgYXMgbm9uZXhpc3RlbnQuCi0gICAgICAgIGNvbnN0IHNpemVfdCBrTnVtVHlwZXMgPSBBVFNQYXJzZXI6Ok5VTV9TT1VSQ0VfVFlQRVM7Ci0gICAgICAgIEFUU1BhcnNlcjo6U291cmNlVHlwZSBzcmNUeXBlc1trTnVtVHlwZXNdID0KKyAgICAgICAgQVRTUGFyc2VyOjpTb3VyY2VUeXBlIHNyY1R5cGVzW10gPQogICAgICAgICAgICAgICAgIHsgQVRTUGFyc2VyOjpWSURFTywgQVRTUGFyc2VyOjpBVURJTyB9OwotICAgICAgICBMaXZlU2Vzc2lvbjo6U3RyZWFtVHlwZSBzdHJlYW1UeXBlc1trTnVtVHlwZXNdID0KKyAgICAgICAgTGl2ZVNlc3Npb246OlN0cmVhbVR5cGUgc3RyZWFtVHlwZXNbXSA9CiAgICAgICAgICAgICAgICAgeyBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9WSURFTywgTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfQVVESU8gfTsKKyAgICAgICAgY29uc3Qgc2l6ZV90IGtOdW1UeXBlcyA9IE5FTEVNKHNyY1R5cGVzKTsKIAogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1UeXBlczsgaSsrKSB7CiAgICAgICAgICAgICBBVFNQYXJzZXI6OlNvdXJjZVR5cGUgc3JjVHlwZSA9IHNyY1R5cGVzW2ldOwpAQCAtMTAzNCw3ICsxMzg4LDYgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGVyciA9IE9LOwogICAgIGlmICh0c0J1ZmZlciAhPSBOVUxMKSB7CiAgICAgICAgIEFTdHJpbmcgbWV0aG9kOwogICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZFN0cmluZygiY2lwaGVyLW1ldGhvZCIsICZtZXRob2QpKTsKQEAgLTEwNDgsODEgKzE0MDEsMTE3IEBACiAgICAgfQogCiAgICAgLy8gYnVsayBleHRyYWN0IG5vbi10cyBmaWxlcworICAgIGJvb2wgc3RhcnRVcCA9IG1TdGFydHVwOwogICAgIGlmICh0c0J1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIGVyciA9IGV4dHJhY3RBbmRRdWV1ZUFjY2Vzc1VuaXRzKGJ1ZmZlciwgaXRlbU1ldGEpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBleHRyYWN0QW5kUXVldWVBY2Nlc3NVbml0cyhidWZmZXIsIGl0ZW1NZXRhKTsKICAgICAgICAgaWYgKGVyciA9PSAtRUFHQUlOKSB7CiAgICAgICAgICAgICAvLyBzdGFydGluZyBzZXF1ZW5jZSBudW1iZXIgdG9vIGxvdy9oaWdoCiAgICAgICAgICAgICBwb3N0TW9uaXRvclF1ZXVlKCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX09VVF9PRl9SQU5HRSkgewogICAgICAgICAgICAgLy8gcmVhY2hlZCBzdG9wcGluZyBwb2ludAotICAgICAgICAgICAgc3RvcEFzeW5jKC8qIGNsZWFyID0gKi9mYWxzZSk7CisgICAgICAgICAgICBub3RpZnlTdG9wUmVhY2hlZCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgbm90aWZ5RXJyb3IoZXJyKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgbm90aWZ5RXJyb3IoZXJyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQogICAgICsrbVNlcU51bWJlcjsKIAotICAgIHBvc3RNb25pdG9yUXVldWUoKTsKKyAgICAvLyBpZiBhZGFwdGluZywgcGF1c2UgYWZ0ZXIgZm91bmQgdGhlIG5leHQgc3RhcnRpbmcgcG9pbnQKKyAgICBpZiAobVNlZWtNb2RlICE9IExpdmVTZXNzaW9uOjprU2Vla01vZGVFeGFjdFBvc2l0aW9uICYmIHN0YXJ0VXAgIT0gbVN0YXJ0dXApIHsKKyAgICAgICAgQ0hFQ0sobVN0YXJ0VGltZVVzTm90aWZ5ICE9IE5VTEwpOworICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnBvc3QoKTsKKyAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LmNsZWFyKCk7CisgICAgICAgIHNob3VsZFBhdXNlID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIXNob3VsZFBhdXNlKSB7CisgICAgICAgIHBvc3RNb25pdG9yUXVldWUoKTsKKyAgICB9CiB9CiAKLWludDMyX3QgUGxheWxpc3RGZXRjaGVyOjpnZXRTZXFOdW1iZXJXaXRoQW5jaG9yVGltZShpbnQ2NF90IGFuY2hvclRpbWVVcykgY29uc3QgewotICAgIGludDMyX3QgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LCBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdDsKLSAgICBpZiAobVBsYXlsaXN0LT5tZXRhKCkgPT0gTlVMTAotICAgICAgICAgICAgfHwgIW1QbGF5bGlzdC0+bWV0YSgpLT5maW5kSW50MzIoIm1lZGlhLXNlcXVlbmNlIiwgJmZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCkpIHsKLSAgICAgICAgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ID0gMDsKLSAgICB9Ci0gICAgbGFzdFNlcU51bWJlckluUGxheWxpc3QgPSBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgKyBtUGxheWxpc3QtPnNpemUoKSAtIDE7CisvKgorICogcmV0dXJucyB0cnVlIGlmIHdlIG5lZWQgdG8gYWRqdXN0IG1TZXFOdW1iZXIKKyAqLworYm9vbCBQbGF5bGlzdEZldGNoZXI6OmFkanVzdFNlcU51bWJlcldpdGhBbmNob3JUaW1lKGludDY0X3QgYW5jaG9yVGltZVVzKSB7CisgICAgaW50MzJfdCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgPSBtUGxheWxpc3QtPmdldEZpcnN0U2VxTnVtYmVyKCk7CiAKLSAgICBpbnQzMl90IGluZGV4ID0gbVNlcU51bWJlciAtIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCAtIDE7Ci0gICAgd2hpbGUgKGluZGV4ID49IDAgJiYgYW5jaG9yVGltZVVzID4gbVN0YXJ0VGltZVVzKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBpdGVtTWV0YTsKLSAgICAgICAgQ0hFQ0sobVBsYXlsaXN0LT5pdGVtQXQoaW5kZXgsIE5VTEwgLyogdXJpICovLCAmaXRlbU1ldGEpKTsKLQotICAgICAgICBpbnQ2NF90IGl0ZW1EdXJhdGlvblVzOwotICAgICAgICBDSEVDSyhpdGVtTWV0YS0+ZmluZEludDY0KCJkdXJhdGlvblVzIiwgJml0ZW1EdXJhdGlvblVzKSk7Ci0KLSAgICAgICAgYW5jaG9yVGltZVVzIC09IGl0ZW1EdXJhdGlvblVzOwotICAgICAgICAtLWluZGV4OwotICAgIH0KLQotICAgIGludDMyX3QgbmV3U2VxTnVtYmVyID0gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ICsgaW5kZXggKyAxOwotICAgIGlmIChuZXdTZXFOdW1iZXIgPD0gbGFzdFNlcU51bWJlckluUGxheWxpc3QpIHsKLSAgICAgICAgcmV0dXJuIG5ld1NlcU51bWJlcjsKKyAgICBpbnQ2NF90IG1pbkRpZmZVcywgbWF4RGlmZlVzOworICAgIGlmIChtU2Vla01vZGUgPT0gTGl2ZVNlc3Npb246OmtTZWVrTW9kZU5leHRTYW1wbGUpIHsKKyAgICAgICAgLy8gaWYgdGhlIHByZXZpb3VzIGZldGNoZXIgcGF1c2VkIGluIHRoZSBtaWRkbGUgb2YgYSBzZWdtZW50LCB3ZQorICAgICAgICAvLyB3YW50IHRvIHN0YXJ0IGF0IGEgc2VnbWVudCB0aGF0IG92ZXJsYXBzIHRoZSBsYXN0IHNhbXBsZQorICAgICAgICBtaW5EaWZmVXMgPSAtbVBsYXlsaXN0LT5nZXRUYXJnZXREdXJhdGlvbigpOworICAgICAgICBtYXhEaWZmVXMgPSAwbGw7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0OworICAgICAgICAvLyBpZiB0aGUgcHJldmlvdXMgZmV0Y2hlciBwYXVzZWQgYXQgdGhlIGVuZCBvZiBhIHNlZ21lbnQsIGlkZWFsbHkKKyAgICAgICAgLy8gd2Ugd2FudCB0byBzdGFydCBhdCB0aGUgc2VnbWVudCB0aGF0J3Mgcm91Z2hseSBhbGlnbmVkIHdpdGggaXRzCisgICAgICAgIC8vIG5leHQgc2VnbWVudCwgYnV0IGlmIHRoZSB0d28gdmFyaWFudHMgYXJlIG5vdCB3ZWxsIGFsaWduZWQgd2UKKyAgICAgICAgLy8gYWRqdXN0IHRoZSBkaWZmIHRvIHdpdGhpbiAoLVQvMiwgVC8yKQorICAgICAgICBtaW5EaWZmVXMgPSAtbVBsYXlsaXN0LT5nZXRUYXJnZXREdXJhdGlvbigpIC8gMjsKKyAgICAgICAgbWF4RGlmZlVzID0gbVBsYXlsaXN0LT5nZXRUYXJnZXREdXJhdGlvbigpIC8gMjsKICAgICB9CisKKyAgICBpbnQzMl90IG9sZFNlcU51bWJlciA9IG1TZXFOdW1iZXI7CisgICAgc3NpemVfdCBpbmRleCA9IG1TZXFOdW1iZXIgLSBmaXJzdFNlcU51bWJlckluUGxheWxpc3Q7CisKKyAgICAvLyBhZGp1c3QgYW5jaG9yVGltZVVzIHRvIHdpdGhpbiAobWluRGlmZlVzLCBtYXhEaWZmVXMpIGZyb20gbVN0YXJ0VGltZVVzCisgICAgaW50NjRfdCBkaWZmVXMgPSBhbmNob3JUaW1lVXMgLSBtU3RhcnRUaW1lVXM7CisgICAgaWYgKGRpZmZVcyA+IG1heERpZmZVcykgeworICAgICAgICB3aGlsZSAoaW5kZXggPiAwICYmIGRpZmZVcyA+IG1heERpZmZVcykgeworICAgICAgICAgICAgLS1pbmRleDsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGl0ZW1NZXRhOworICAgICAgICAgICAgQ0hFQ0sobVBsYXlsaXN0LT5pdGVtQXQoaW5kZXgsIE5VTEwgLyogdXJpICovLCAmaXRlbU1ldGEpKTsKKworICAgICAgICAgICAgaW50NjRfdCBpdGVtRHVyYXRpb25VczsKKyAgICAgICAgICAgIENIRUNLKGl0ZW1NZXRhLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmaXRlbUR1cmF0aW9uVXMpKTsKKworICAgICAgICAgICAgZGlmZlVzIC09IGl0ZW1EdXJhdGlvblVzOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChkaWZmVXMgPCBtaW5EaWZmVXMpIHsKKyAgICAgICAgd2hpbGUgKGluZGV4ICsgMSA8IChzc2l6ZV90KSBtUGxheWxpc3QtPnNpemUoKQorICAgICAgICAgICAgICAgICYmIGRpZmZVcyA8IG1pbkRpZmZVcykgeworICAgICAgICAgICAgKytpbmRleDsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGl0ZW1NZXRhOworICAgICAgICAgICAgQ0hFQ0sobVBsYXlsaXN0LT5pdGVtQXQoaW5kZXgsIE5VTEwgLyogdXJpICovLCAmaXRlbU1ldGEpKTsKKworICAgICAgICAgICAgaW50NjRfdCBpdGVtRHVyYXRpb25VczsKKyAgICAgICAgICAgIENIRUNLKGl0ZW1NZXRhLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmaXRlbUR1cmF0aW9uVXMpKTsKKworICAgICAgICAgICAgZGlmZlVzICs9IGl0ZW1EdXJhdGlvblVzOworICAgICAgICB9CisgICAgfQorCisgICAgbVNlcU51bWJlciA9IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCArIGluZGV4OworCisgICAgaWYgKG1TZXFOdW1iZXIgIT0gb2xkU2VxTnVtYmVyKSB7CisgICAgICAgIEZMT0dWKCJndWVzc2VkIHdyb25nIHNlZyBudW1iZXI6IGRpZmYgJWxsZCBvdXQgb2YgWyVsbGQsICVsbGRdIiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBhbmNob3JUaW1lVXMgLSBtU3RhcnRUaW1lVXMsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgbWluRGlmZlVzLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIG1heERpZmZVcyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIGludDMyX3QgUGxheWxpc3RGZXRjaGVyOjpnZXRTZXFOdW1iZXJGb3JEaXNjb250aW51aXR5KHNpemVfdCBkaXNjb250aW51aXR5U2VxKSBjb25zdCB7Ci0gICAgaW50MzJfdCBmaXJzdFNlcU51bWJlckluUGxheWxpc3Q7Ci0gICAgaWYgKG1QbGF5bGlzdC0+bWV0YSgpID09IE5VTEwKLSAgICAgICAgICAgIHx8ICFtUGxheWxpc3QtPm1ldGEoKS0+ZmluZEludDMyKCJtZWRpYS1zZXF1ZW5jZSIsICZmaXJzdFNlcU51bWJlckluUGxheWxpc3QpKSB7Ci0gICAgICAgIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IDA7Ci0gICAgfQotCi0gICAgc2l6ZV90IGN1ckRpc2NvbnRpbnVpdHlTZXEgPSBtUGxheWxpc3QtPmdldERpc2NvbnRpbnVpdHlTZXEoKTsKLSAgICBpZiAoZGlzY29udGludWl0eVNlcSA8IGN1ckRpc2NvbnRpbnVpdHlTZXEpIHsKLSAgICAgICAgcmV0dXJuIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCA8PSAwID8gMCA6IChmaXJzdFNlcU51bWJlckluUGxheWxpc3QgLSAxKTsKLSAgICB9CisgICAgaW50MzJfdCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgPSBtUGxheWxpc3QtPmdldEZpcnN0U2VxTnVtYmVyKCk7CiAKICAgICBzaXplX3QgaW5kZXggPSAwOwogICAgIHdoaWxlIChpbmRleCA8IG1QbGF5bGlzdC0+c2l6ZSgpKSB7CiAgICAgICAgIHNwPEFNZXNzYWdlPiBpdGVtTWV0YTsKICAgICAgICAgQ0hFQ0sobVBsYXlsaXN0LT5pdGVtQXQoIGluZGV4LCBOVUxMIC8qIHVyaSAqLywgJml0ZW1NZXRhKSk7Ci0KLSAgICAgICAgaW50NjRfdCBkaXNjb250aW51aXR5OwotICAgICAgICBpZiAoaXRlbU1ldGEtPmZpbmRJbnQ2NCgiZGlzY29udGludWl0eSIsICZkaXNjb250aW51aXR5KSkgewotICAgICAgICAgICAgY3VyRGlzY29udGludWl0eVNlcSsrOwotICAgICAgICB9Ci0KKyAgICAgICAgc2l6ZV90IGN1ckRpc2NvbnRpbnVpdHlTZXE7CisgICAgICAgIENIRUNLKGl0ZW1NZXRhLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHktc2VxdWVuY2UiLCAoaW50MzJfdCAqKSZjdXJEaXNjb250aW51aXR5U2VxKSk7CisgICAgICAgIGludDMyX3Qgc2VxTnVtYmVyID0gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ICsgaW5kZXg7CiAgICAgICAgIGlmIChjdXJEaXNjb250aW51aXR5U2VxID09IGRpc2NvbnRpbnVpdHlTZXEpIHsKLSAgICAgICAgICAgIHJldHVybiBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgKyBpbmRleDsKKyAgICAgICAgICAgIHJldHVybiBzZXFOdW1iZXI7CisgICAgICAgIH0gZWxzZSBpZiAoY3VyRGlzY29udGludWl0eVNlcSA+IGRpc2NvbnRpbnVpdHlTZXEpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXFOdW1iZXIgPD0gMCA/IDAgOiBzZXFOdW1iZXIgLSAxOwogICAgICAgICB9CiAKICAgICAgICAgKytpbmRleDsKQEAgLTExMzIsMTIgKzE1MjEsNiBAQAogfQogCiBpbnQzMl90IFBsYXlsaXN0RmV0Y2hlcjo6Z2V0U2VxTnVtYmVyRm9yVGltZShpbnQ2NF90IHRpbWVVcykgY29uc3QgewotICAgIGludDMyX3QgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0OwotICAgIGlmIChtUGxheWxpc3QtPm1ldGEoKSA9PSBOVUxMIHx8ICFtUGxheWxpc3QtPm1ldGEoKS0+ZmluZEludDMyKAotICAgICAgICAgICAgICAgICJtZWRpYS1zZXF1ZW5jZSIsICZmaXJzdFNlcU51bWJlckluUGxheWxpc3QpKSB7Ci0gICAgICAgIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IDA7Ci0gICAgfQotCiAgICAgc2l6ZV90IGluZGV4ID0gMDsKICAgICBpbnQ2NF90IHNlZ21lbnRTdGFydFVzID0gMDsKICAgICB3aGlsZSAoaW5kZXggPCBtUGxheWxpc3QtPnNpemUoKSkgewpAQCAtMTE2MCw3ICsxNTQzLDcgQEAKICAgICAgICAgaW5kZXggPSBtUGxheWxpc3QtPnNpemUoKSAtIDE7CiAgICAgfQogCi0gICAgcmV0dXJuIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCArIGluZGV4OworICAgIHJldHVybiBtUGxheWxpc3QtPmdldEZpcnN0U2VxTnVtYmVyKCkgKyBpbmRleDsKIH0KIAogY29uc3Qgc3A8QUJ1ZmZlcj4gJlBsYXlsaXN0RmV0Y2hlcjo6c2V0QWNjZXNzVW5pdFByb3BlcnRpZXMoCkBAIC0xMTc1LDE2ICsxNTU4LDM3IEBACiAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoImRpc2NhcmQiLCBkaXNjYXJkKTsKICAgICB9CiAKLSAgICBpbnQzMl90IHRhcmdldER1cmF0aW9uU2VjczsKLSAgICBpZiAobVBsYXlsaXN0LT5tZXRhKCktPmZpbmRJbnQzMigidGFyZ2V0LWR1cmF0aW9uIiwgJnRhcmdldER1cmF0aW9uU2VjcykpIHsKLSAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigidGFyZ2V0RHVyYXRpb24iLCB0YXJnZXREdXJhdGlvblNlY3MpOwotICAgIH0KLQogICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCBtRGlzY29udGludWl0eVNlcSk7CiAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgic2VnbWVudFN0YXJ0VGltZVVzIiwgZ2V0U2VnbWVudFN0YXJ0VGltZVVzKG1TZXFOdW1iZXIpKTsKKyAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJzZWdtZW50Rmlyc3RUaW1lVXMiLCBtU2VnbWVudEZpcnN0UFRTKTsKKyAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJzZWdtZW50RHVyYXRpb25VcyIsIGdldFNlZ21lbnREdXJhdGlvblVzKG1TZXFOdW1iZXIpKTsKKyAgICBpZiAoIW1QbGF5bGlzdC0+aXNDb21wbGV0ZSgpICYmICFtUGxheWxpc3QtPmlzRXZlbnQoKSkgeworICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJwbGF5bGlzdFRpbWVVcyIsIG1QbGF5bGlzdFRpbWVVcyk7CisgICAgfQogICAgIHJldHVybiBhY2Nlc3NVbml0OwogfQogCitib29sIFBsYXlsaXN0RmV0Y2hlcjo6aXNTdGFydFRpbWVSZWFjaGVkKGludDY0X3QgdGltZVVzKSB7CisgICAgaWYgKCFtRmlyc3RQVFNWYWxpZCkgeworICAgICAgICBtRmlyc3RUaW1lVXMgPSB0aW1lVXM7CisgICAgICAgIG1GaXJzdFBUU1ZhbGlkID0gdHJ1ZTsKKyAgICB9CisgICAgYm9vbCBzdGFydFRpbWVSZWFjaGVkID0gdHJ1ZTsKKyAgICBpZiAobVN0YXJ0VGltZVVzUmVsYXRpdmUpIHsKKyAgICAgICAgRkxPR1YoInN0YXJ0VGltZVVzUmVsYXRpdmUsIHRpbWVVcyAoJWxsZCkgLSAlbGxkID0gJWxsZCIsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lVXMsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltRmlyc3RUaW1lVXMsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykodGltZVVzIC0gbUZpcnN0VGltZVVzKSk7CisgICAgICAgIHRpbWVVcyAtPSBtRmlyc3RUaW1lVXM7CisgICAgICAgIGlmICh0aW1lVXMgPCAwKSB7CisgICAgICAgICAgICBGTE9HVigiY2xhbXAgbmVnYXRpdmUgdGltZVVzIHRvIDAiKTsKKyAgICAgICAgICAgIHRpbWVVcyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgc3RhcnRUaW1lUmVhY2hlZCA9ICh0aW1lVXMgPj0gbVN0YXJ0VGltZVVzKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXJ0VGltZVJlYWNoZWQ7Cit9CisKIHN0YXR1c190IFBsYXlsaXN0RmV0Y2hlcjo6ZXh0cmFjdEFuZFF1ZXVlQWNjZXNzVW5pdHNGcm9tVHMoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewogICAgIGlmIChtVFNQYXJzZXIgPT0gTlVMTCkgewogICAgICAgICAvLyBVc2UgVFNfVElNRVNUQU1QU19BUkVfQUJTT0xVVEUgc28gcHRzIGNhcnJ5IG92ZXIgYmV0d2VlbiBmZXRjaGVycy4KQEAgLTExOTcsMTIgKzE2MDEsMTYgQEAKICAgICAgICAgLy8gQVRTUGFyc2VyIGZyb20gc2tld2luZyB0aGUgdGltZXN0YW1wcyBvZiBhY2Nlc3MgdW5pdHMuCiAgICAgICAgIGV4dHJhLT5zZXRJbnQ2NChJU3RyZWFtTGlzdGVuZXI6OmtLZXlNZWRpYVRpbWVVcywgMCk7CiAKKyAgICAgICAgLy8gV2hlbiBhZGFwdGluZywgc2lnbmFsIGEgcmVjZW50IG1lZGlhIHRpbWUgdG8gdGhlIHBhcnNlciwKKyAgICAgICAgLy8gc28gdGhhdCBQVFMgd3JhcCBhcm91bmQgaXMgaGFuZGxlZCBmb3IgdGhlIG5ldyB2YXJpYW50LgorICAgICAgICBpZiAobVN0YXJ0VGltZVVzID49IDAgJiYgIW1TdGFydFRpbWVVc1JlbGF0aXZlKSB7CisgICAgICAgICAgICBleHRyYS0+c2V0SW50NjQoSVN0cmVhbUxpc3RlbmVyOjprS2V5UmVjZW50TWVkaWFUaW1lVXMsIG1TdGFydFRpbWVVcyk7CisgICAgICAgIH0KKwogICAgICAgICBtVFNQYXJzZXItPnNpZ25hbERpc2NvbnRpbnVpdHkoCiAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1RJTUUsIGV4dHJhKTsKIAotICAgICAgICBtQWJzb2x1dGVUaW1lQW5jaG9yVXMgPSBtTmV4dFBUU1RpbWVVczsKICAgICAgICAgbU5leHRQVFNUaW1lVXMgPSAtMWxsOwotICAgICAgICBtRmlyc3RQVFNWYWxpZCA9IGZhbHNlOwogICAgIH0KIAogICAgIHNpemVfdCBvZmZzZXQgPSAwOwpAQCAtMTIxOCwzNSArMTYyNiw3NSBAQAogICAgIC8vIHNldFJhbmdlIHRvIGluZGljYXRlIGNvbnN1bWVkIGJ5dGVzLgogICAgIGJ1ZmZlci0+c2V0UmFuZ2UoYnVmZmVyLT5vZmZzZXQoKSArIG9mZnNldCwgYnVmZmVyLT5zaXplKCkgLSBvZmZzZXQpOwogCisgICAgaWYgKG1TZWdtZW50Rmlyc3RQVFMgPCAwbGwpIHsKKyAgICAgICAgLy8gZ2V0IHRoZSBzbWFsbGVzdCBmaXJzdCBQVFMgZnJvbSBhbGwgc3RyZWFtcyBwcmVzZW50IGluIHRoaXMgcGFyc2VyCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSBtUGFja2V0U291cmNlcy5zaXplKCk7IGktLSA+IDA7KSB7CisgICAgICAgICAgICBjb25zdCBMaXZlU2Vzc2lvbjo6U3RyZWFtVHlwZSBzdHJlYW0gPSBtUGFja2V0U291cmNlcy5rZXlBdChpKTsKKyAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfU1VCVElUTEVTKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIk1QRUcyIFRyYW5zcG9ydCBzdHJlYW1zIGRvIG5vdCBjb250YWluIHN1YnRpdGxlcy4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9NRVRBREFUQSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQVRTUGFyc2VyOjpTb3VyY2VUeXBlIHR5cGUgPUxpdmVTZXNzaW9uOjpnZXRTb3VyY2VUeXBlRm9yU3RyZWFtKHN0cmVhbSk7CisgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFub3RoZXJQYWNrZXRTb3VyY2UgKj4oCisgICAgICAgICAgICAgICAgICAgICAgICBtVFNQYXJzZXItPmdldFNvdXJjZSh0eXBlKS5nZXQoKSk7CisKKyAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1ldGEgPSBzb3VyY2UtPmdldE1ldGFBZnRlckxhc3REZXF1ZXVlZCgwKTsKKyAgICAgICAgICAgIGlmIChtZXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKyAgICAgICAgICAgICAgICBpZiAobVNlZ21lbnRGaXJzdFBUUyA8IDBsbCB8fCB0aW1lVXMgPCBtU2VnbWVudEZpcnN0UFRTKSB7CisgICAgICAgICAgICAgICAgICAgIG1TZWdtZW50Rmlyc3RQVFMgPSB0aW1lVXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtU2VnbWVudEZpcnN0UFRTIDwgMGxsKSB7CisgICAgICAgICAgICAvLyBkaWRuJ3QgZmluZCBhbnkgVFMgcGFja2V0LCBjYW4gcmV0dXJuIGVhcmx5CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtU3RhcnRUaW1lVXNSZWxhdGl2ZSkgeworICAgICAgICAgICAgLy8gbVN0YXJ0dXAKKyAgICAgICAgICAgIC8vICAgbVN0YXJ0dXAgaXMgdHJ1ZSB1bnRpbCB3ZSBoYXZlIHF1ZXVlZCBhIHBhY2tldCBmb3IgYWxsIHRoZSBzdHJlYW1zCisgICAgICAgICAgICAvLyAgIHdlIGFyZSBmZXRjaGluZy4gV2UgcXVldWUgcGFja2V0cyB3aG9zZSB0aW1lc3RhbXBzIGFyZSBncmVhdGVyIHRoYW4KKyAgICAgICAgICAgIC8vICAgbVN0YXJ0VGltZVVzLgorICAgICAgICAgICAgLy8gbVNlZ21lbnRTdGFydFRpbWVVcyA+PSAwCisgICAgICAgICAgICAvLyAgIG1TZWdtZW50U3RhcnRUaW1lVXMgaXMgbm9uLW5lZ2F0aXZlIHdoZW4gYWRhcHRpbmcgb3Igc3dpdGNoaW5nIHRyYWNrcworICAgICAgICAgICAgLy8gYWRqdXN0U2VxTnVtYmVyV2l0aEFuY2hvclRpbWUodGltZVVzKSA9PSB0cnVlCisgICAgICAgICAgICAvLyAgIHdlIGd1ZXNzZWQgYSBzZXEgbnVtYmVyIHRoYXQncyBlaXRoZXIgdG9vIGxhcmdlIG9yIHRvbyBzbWFsbC4KKyAgICAgICAgICAgIC8vIElmIHRoaXMgaGFwcGVucywgd2UnbGwgYWRqdXN0IG1TZXFOdW1iZXIgYW5kIHJlc3RhcnQgZmV0Y2hpbmcgZnJvbSBuZXcKKyAgICAgICAgICAgIC8vIGxvY2F0aW9uLiBOb3RlIHRoYXQgd2Ugb25seSB3YW50IHRvIGFkanVzdCBvbmNlLCBzbyBzZXQgbVNlZ21lbnRTdGFydFRpbWVVcworICAgICAgICAgICAgLy8gdG8gLTEgc28gdGhhdCB3ZSBkb24ndCBlbnRlciB0aGlzIGNodW5rIG5leHQgdGltZS4KKyAgICAgICAgICAgIGlmIChtU3RhcnR1cCAmJiBtU2VnbWVudFN0YXJ0VGltZVVzID49IDAKKyAgICAgICAgICAgICAgICAgICAgJiYgYWRqdXN0U2VxTnVtYmVyV2l0aEFuY2hvclRpbWUobVNlZ21lbnRGaXJzdFBUUykpIHsKKyAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRTdGFydGVkQXQpOworICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0U3RyaW5nKCJ1cmkiLCBtVVJJKTsKKyAgICAgICAgICAgICAgICBtSURSRm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtU2VnbWVudFN0YXJ0VGltZVVzID0gLTE7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKICAgICBmb3IgKHNpemVfdCBpID0gbVBhY2tldFNvdXJjZXMuc2l6ZSgpOyBpLS0gPiAwOykgewogICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBwYWNrZXRTb3VyY2UgPSBtUGFja2V0U291cmNlcy52YWx1ZUF0KGkpOwogCi0gICAgICAgIGNvbnN0IGNoYXIgKmtleTsKLSAgICAgICAgQVRTUGFyc2VyOjpTb3VyY2VUeXBlIHR5cGU7CiAgICAgICAgIGNvbnN0IExpdmVTZXNzaW9uOjpTdHJlYW1UeXBlIHN0cmVhbSA9IG1QYWNrZXRTb3VyY2VzLmtleUF0KGkpOwotICAgICAgICBzd2l0Y2ggKHN0cmVhbSkgewotICAgICAgICAgICAgY2FzZSBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9WSURFTzoKLSAgICAgICAgICAgICAgICB0eXBlID0gQVRTUGFyc2VyOjpWSURFTzsKLSAgICAgICAgICAgICAgICBrZXkgPSAidGltZVVzVmlkZW8iOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX0FVRElPOgotICAgICAgICAgICAgICAgIHR5cGUgPSBBVFNQYXJzZXI6OkFVRElPOwotICAgICAgICAgICAgICAgIGtleSA9ICJ0aW1lVXNBdWRpbyI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfU1VCVElUTEVTOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFMT0dFKCJNUEVHMiBUcmFuc3BvcnQgc3RyZWFtcyBkbyBub3QgY29udGFpbiBzdWJ0aXRsZXMuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICBpZiAoc3RyZWFtID09IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1NVQlRJVExFUykgeworICAgICAgICAgICAgQUxPR0UoIk1QRUcyIFRyYW5zcG9ydCBzdHJlYW1zIGRvIG5vdCBjb250YWluIHN1YnRpdGxlcy4iKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KIAorICAgICAgICBjb25zdCBjaGFyICprZXkgPSBMaXZlU2Vzc2lvbjo6Z2V0S2V5Rm9yU3RyZWFtKHN0cmVhbSk7CisgICAgICAgIEFUU1BhcnNlcjo6U291cmNlVHlwZSB0eXBlID1MaXZlU2Vzc2lvbjo6Z2V0U291cmNlVHlwZUZvclN0cmVhbShzdHJlYW0pOworCiAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9CiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBbm90aGVyUGFja2V0U291cmNlICo+KAogICAgICAgICAgICAgICAgICAgICBtVFNQYXJzZXItPmdldFNvdXJjZSh0eXBlKS5nZXQoKSk7CkBAIC0xMjU1LDExNiArMTcwMyw2NSBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgc3A8TWV0YURhdGE+IGZvcm1hdCAgPSBzb3VyY2UtPmdldEZvcm1hdCgpOworICAgICAgICBib29sIGlzQXZjID0gZm9ybWF0ICE9IE5VTEwgJiYgZm9ybWF0LT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKQorICAgICAgICAgICAgICAgICYmICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisKICAgICAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdDsKICAgICAgICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7CiAgICAgICAgIHdoaWxlIChzb3VyY2UtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpCiAgICAgICAgICAgICAgICAgJiYgc291cmNlLT5kZXF1ZXVlQWNjZXNzVW5pdCgmYWNjZXNzVW5pdCkgPT0gT0spIHsKIAorICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CiAgICAgICAgICAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwogCiAgICAgICAgICAgICBpZiAobVN0YXJ0dXApIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1GaXJzdFBUU1ZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GaXJzdFRpbWVVcyA9IHRpbWVVczsKLSAgICAgICAgICAgICAgICAgICAgbUZpcnN0UFRTVmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVN0YXJ0VGltZVVzUmVsYXRpdmUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGltZVVzIC09IG1GaXJzdFRpbWVVczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVVcyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVVcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYm9vbCBzdGFydFRpbWVSZWFjaGVkID0gaXNTdGFydFRpbWVSZWFjaGVkKHRpbWVVcyk7CiAKLSAgICAgICAgICAgICAgICBpZiAodGltZVVzIDwgbVN0YXJ0VGltZVVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlciB1cCB0byB0aGUgY2xvc2VzdCBwcmVjZWRpbmcgSURSIGZyYW1lCi0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJ0aW1lVXMgJSIgUFJJZDY0ICIgdXMgPCBtU3RhcnRUaW1lVXMgJSIgUFJJZDY0ICIgdXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVVcywgbVN0YXJ0VGltZVVzKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgICAgICAgICAgICAgc3A8TWV0YURhdGE+IGZvcm1hdCAgPSBzb3VyY2UtPmdldEZvcm1hdCgpOwotICAgICAgICAgICAgICAgICAgICBib29sIGlzQXZjID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gTlVMTCAmJiBmb3JtYXQtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNBdmMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc0F2YyAmJiBJc0lEUihhY2Nlc3NVbml0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFzdGFydFRpbWVSZWFjaGVkIHx8IChpc0F2YyAmJiAhbUlEUkZvdW5kKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXIgdXAgdG8gdGhlIGNsb3Nlc3QgcHJlY2VkaW5nIElEUiBmcmFtZSBpbiB0aGUgbmV4dCBzZWdlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgLy8gb3IgdGhlIGNsb3Nlc3Qgc3VjY2VlZGluZyBJRFIgZnJhbWUgYWZ0ZXIgdGhlIGV4YWN0IHBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgIEZTTE9HVihzdHJlYW0sICJ0aW1lVXMoJWxsZCktbVN0YXJ0VGltZVVzKCVsbGQpPSVsbGQsIG1JRFJGb3VuZD0lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltU3RhcnRUaW1lVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lVXMgLSBtU3RhcnRUaW1lVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlEUkZvdW5kKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXZjKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJc0lEUihhY2Nlc3NVbml0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+Y2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU0xPR1Yoc3RyZWFtLCAiZm91bmQgSURSLCBjbGVhciBtVmlkZW9CdWZmZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSURSRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1JRFJGb3VuZCAmJiBtU3RhcnRUaW1lVXNSZWxhdGl2ZSAmJiAhc3RhcnRUaW1lUmVhY2hlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+cXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTTE9HVihzdHJlYW0sICJzYXZpbmcgQVZDIHZpZGVvIEFjY2Vzc1VuaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0VGltZVJlYWNoZWQgfHwgKGlzQXZjICYmICFtSURSRm91bmQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKLSAgICAgICAgICAgIGlmIChtU3RhcnRUaW1lVXNOb3RpZnkgIT0gTlVMTCAmJiB0aW1lVXMgPiBtU3RhcnRUaW1lVXMpIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdDsKLSAgICAgICAgICAgICAgICBpZiAobVBsYXlsaXN0LT5tZXRhKCkgPT0gTlVMTCB8fCAhbVBsYXlsaXN0LT5tZXRhKCktPmZpbmRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVkaWEtc2VxdWVuY2UiLCAmZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0KSkgewotICAgICAgICAgICAgICAgICAgICBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgPSAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludDMyX3QgdGFyZ2V0RHVyYXRpb25TZWNzOwotICAgICAgICAgICAgICAgIENIRUNLKG1QbGF5bGlzdC0+bWV0YSgpLT5maW5kSW50MzIoInRhcmdldC1kdXJhdGlvbiIsICZ0YXJnZXREdXJhdGlvblNlY3MpKTsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IHRhcmdldER1cmF0aW9uVXMgPSB0YXJnZXREdXJhdGlvblNlY3MgKiAxMDAwMDAwbGw7Ci0gICAgICAgICAgICAgICAgLy8gbVN0YXJ0dXAKLSAgICAgICAgICAgICAgICAvLyAgIG1TdGFydHVwIGlzIHRydWUgdW50aWwgd2UgaGF2ZSBxdWV1ZWQgYSBwYWNrZXQgZm9yIGFsbCB0aGUgc3RyZWFtcwotICAgICAgICAgICAgICAgIC8vICAgd2UgYXJlIGZldGNoaW5nLiBXZSBxdWV1ZSBwYWNrZXRzIHdob3NlIHRpbWVzdGFtcHMgYXJlIGdyZWF0ZXIgdGhhbgotICAgICAgICAgICAgICAgIC8vICAgbVN0YXJ0VGltZVVzLgotICAgICAgICAgICAgICAgIC8vIG1TZWdtZW50U3RhcnRUaW1lVXMgPj0gMAotICAgICAgICAgICAgICAgIC8vICAgbVNlZ21lbnRTdGFydFRpbWVVcyBpcyBub24tbmVnYXRpdmUgd2hlbiBhZGFwdGluZyBvciBzd2l0Y2hpbmcgdHJhY2tzCi0gICAgICAgICAgICAgICAgLy8gbVNlcU51bWJlciA+IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdAotICAgICAgICAgICAgICAgIC8vICAgZG9uJ3QgZGVjcmVtZW50IG1TZXFOdW1iZXIgaWYgaXQgYWxyZWFkeSBwb2ludHMgdG8gdGhlIDFzdCBzZWdtZW50Ci0gICAgICAgICAgICAgICAgLy8gdGltZVVzIC0gbVN0YXJ0VGltZVVzID4gdGFyZ2V0RHVyYXRpb25VczoKLSAgICAgICAgICAgICAgICAvLyAgIFRoaXMgYW5kIHRoZSAyIGFib3ZlIGNvbmRpdGlvbnMgc2hvdWxkIG9ubHkgaGFwcGVuIHdoZW4gYWRhcHRpbmcgaW4gYSBsaXZlCi0gICAgICAgICAgICAgICAgLy8gICBzdHJlYW07IHRoZSBvbGQgZmV0Y2hlciBoYXMgYWxyZWFkeSBmZXRjaGVkIHRvIG1TdGFydFRpbWVVczsgdGhlIG5ldyBmZXRjaGVyCi0gICAgICAgICAgICAgICAgLy8gICB3b3VsZCBzdGFydCBmZXRjaGluZyBhZnRlciB0aW1lVXMsIHdoaWNoIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gbVN0YXJ0VGltZVVzOwotICAgICAgICAgICAgICAgIC8vICAgdGhlIG9sZCBmZXRjaGVyIHdvdWxkIHRoZW4gY29udGludWUgZmV0Y2hpbmcgZGF0YSB1bnRpbCB0aW1lVXMuIFdlIGRvbid0IHdhbnQKLSAgICAgICAgICAgICAgICAvLyAgIHRpbWVVcyB0byBiZSB0b28gZmFyIGFoZWFkIG9mIG1TdGFydFRpbWVVcyBiZWNhdXNlIHdlIHdhbnQgdGhlIG9sZCBmZXRjaGVyIHRvCi0gICAgICAgICAgICAgICAgLy8gICBzdG9wIGFzIGVhcmx5IGFzIHBvc3NpYmxlLiBUaGUgZGVmaW5pdGlvbiBvZiBiZWluZyAidG9vIGZhciBhaGVhZCIgaXMKLSAgICAgICAgICAgICAgICAvLyAgIGFyYml0cmFyeTsgaGVyZSB3ZSB1c2UgdGFyZ2V0RHVyYXRpb25VcyBhcyB0aHJlc2hvbGQuCi0gICAgICAgICAgICAgICAgaWYgKG1TdGFydHVwICYmIG1TZWdtZW50U3RhcnRUaW1lVXMgPj0gMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVNlcU51bWJlciA+IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGltZVVzIC0gbVN0YXJ0VGltZVVzID4gdGFyZ2V0RHVyYXRpb25VcykgewotICAgICAgICAgICAgICAgICAgICAvLyB3ZSBqdXN0IGd1ZXNzZWQgYSBzdGFydGluZyB0aW1lc3RhbXAgdGhhdCBpcyB0b28gaGlnaCB3aGVuIGFkYXB0aW5nIGluIGEKLSAgICAgICAgICAgICAgICAgICAgLy8gbGl2ZSBzdHJlYW07IHJlLWFkanVzdCBiYXNlZCBvbiB0aGUgYWN0dWFsIHRpbWVzdGFtcCBleHRyYWN0ZWQgZnJvbSB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gbWVkaWEgc2VnbWVudDsgaWYgd2UgZGlkbid0IG1vdmUgYmFja3dhcmQgYWZ0ZXIgdGhlIHJlLWFkanVzdG1lbnQKLSAgICAgICAgICAgICAgICAgICAgLy8gKG5ld1NlcU51bWJlciksIHN0YXJ0IGF0IGxlYXN0IDEgc2VnbWVudCBwcmlvci4KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuZXdTZXFOdW1iZXIgPSBnZXRTZXFOdW1iZXJXaXRoQW5jaG9yVGltZSh0aW1lVXMpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV3U2VxTnVtYmVyID49IG1TZXFOdW1iZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC0tbVNlcU51bWJlcjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBuZXdTZXFOdW1iZXI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFN0YXJ0ZWRBdCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludDMyX3Qgc2VxOwotICAgICAgICAgICAgICAgIGlmICghbVN0YXJ0VGltZVVzTm90aWZ5LT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCAmc2VxKSkgewotICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnNldEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgbURpc2NvbnRpbnVpdHlTZXEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzOwotICAgICAgICAgICAgICAgIGlmICghbVN0YXJ0VGltZVVzTm90aWZ5LT5maW5kSW50NjQoa2V5LCAmc3RhcnRUaW1lVXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50NjQoa2V5LCB0aW1lVXMpOwotCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbU1hc2sgPSAwOwotICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPmZpbmRJbnQzMigic3RyZWFtTWFzayIsIChpbnQzMl90ICopICZzdHJlYW1NYXNrKTsKKyAgICAgICAgICAgIGlmIChtU3RhcnRUaW1lVXNOb3RpZnkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbU1hc2sgPSAwOworICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+ZmluZEludDMyKCJzdHJlYW1NYXNrIiwgKGludDMyX3QgKikgJnN0cmVhbU1hc2spOworICAgICAgICAgICAgICAgIGlmICgobVN0cmVhbVR5cGVNYXNrICYgbVBhY2tldFNvdXJjZXMua2V5QXQoaSkpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhKHN0cmVhbU1hc2sgJiBtUGFja2V0U291cmNlcy5rZXlBdChpKSkpIHsKICAgICAgICAgICAgICAgICAgICAgc3RyZWFtTWFzayB8PSBtUGFja2V0U291cmNlcy5rZXlBdChpKTsKICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQzMigic3RyZWFtTWFzayIsIHN0cmVhbU1hc2spOworICAgICAgICAgICAgICAgICAgICBGU0xPR1Yoc3RyZWFtLCAiZm91bmQgc3RhcnQgcG9pbnQsIHRpbWVVcz0lbGxkLCBzdHJlYW1NYXNrIGJlY29tZXMgJXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZVVzLCBzdHJlYW1NYXNrKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtTWFzayA9PSBtU3RyZWFtVHlwZU1hc2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZMT0dWKCJmb3VuZCBzdGFydCBwb2ludCBmb3IgYWxsIHN0cmVhbXMiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydHVwID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnBvc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobVN0b3BQYXJhbXMgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIC8vIFF1ZXVlIGRpc2NvbnRpbnVpdHkgaW4gb3JpZ2luYWwgc3RyZWFtLgogICAgICAgICAgICAgICAgIGludDMyX3QgZGlzY29udGludWl0eVNlcTsKICAgICAgICAgICAgICAgICBpbnQ2NF90IHN0b3BUaW1lVXM7CiAgICAgICAgICAgICAgICAgaWYgKCFtU3RvcFBhcmFtcy0+ZmluZEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgJmRpc2NvbnRpbnVpdHlTZXEpCkBAIC0xMzcyLDE0ICsxNzY5LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhbVN0b3BQYXJhbXMtPmZpbmRJbnQ2NChrZXksICZzdG9wVGltZVVzKQogICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGRpc2NvbnRpbnVpdHlTZXEgPT0gbURpc2NvbnRpbnVpdHlTZXEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGltZVVzID49IHN0b3BUaW1lVXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhY2tldFNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KG1TZXNzaW9uLT5jcmVhdGVGb3JtYXRDaGFuZ2VCdWZmZXIoKSk7CisgICAgICAgICAgICAgICAgICAgIEZTTE9HVihzdHJlYW0sICJyZWFjaGVkIHN0b3AgcG9pbnQsIHRpbWVVcz0lbGxkIiwgKGxvbmcgbG9uZyl0aW1lVXMpOwogICAgICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZU1hc2sgJj0gfnN0cmVhbTsKICAgICAgICAgICAgICAgICAgICAgbVBhY2tldFNvdXJjZXMucmVtb3ZlSXRlbXNBdChpKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgZG8gTk9UIGRlcXVldWUgYW55IGRpc2NvbnRpbnVpdGllcyBleGNlcHQgZm9yIGZvcm1hdCBjaGFuZ2UuCiAgICAgICAgICAgICBpZiAoc3RyZWFtID09IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1ZJREVPKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBkaXNjYXJkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CkBAIC0xMzg4LDExICsxNzg0LDIxIEBACiAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+ZGVxdWV1ZUFjY2Vzc1VuaXQoJnZpZGVvQnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgc2V0QWNjZXNzVW5pdFByb3BlcnRpZXModmlkZW9CdWZmZXIsIHNvdXJjZSwgZGlzY2FyZCk7CiAgICAgICAgICAgICAgICAgICAgIHBhY2tldFNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KHZpZGVvQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBidWZmZXJUaW1lVXM7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKHZpZGVvQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJmJ1ZmZlclRpbWVVcykpOworICAgICAgICAgICAgICAgICAgICBGU0xPR1Yoc3RyZWFtLCAicXVldWVBY2Nlc3NVbml0IChzYXZlZCksIHRpbWVVcz0lbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWJ1ZmZlclRpbWVVcyk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0gPT0gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfTUVUQURBVEEgJiYgIW1IYXNNZXRhZGF0YSkgeworICAgICAgICAgICAgICAgIG1IYXNNZXRhZGF0YSA9IHRydWU7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdE1ldGFkYXRhRGV0ZWN0ZWQpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzZXRBY2Nlc3NVbml0UHJvcGVydGllcyhhY2Nlc3NVbml0LCBzb3VyY2UpOwogICAgICAgICAgICAgcGFja2V0U291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICBGU0xPR1Yoc3RyZWFtLCAicXVldWVBY2Nlc3NVbml0LCB0aW1lVXM9JWxsZCIsIChsb25nIGxvbmcpdGltZVVzKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTE0MTAsNyArMTgxNiw3IEBACiAKICAgICBpZiAoIW1TdHJlYW1UeXBlTWFzaykgewogICAgICAgICAvLyBTaWduYWwgZ2FwIGlzIGZpbGxlZCBiZXR3ZWVuIG9yaWdpbmFsIGFuZCBuZXcgc3RyZWFtLgotICAgICAgICBBTE9HVigiRVJST1IgT1VUIE9GIFJBTkdFIik7CisgICAgICAgIEZMT0dWKCJyZWFjaGVkIHN0b3AgcG9pbnQgZm9yIGFsbCBzdHJlYW1zIik7CiAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQogCkBAIC0xNDYxLDE0ICsxODY3LDExIEBACiAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgic2VnbWVudFN0YXJ0VGltZVVzIiwgZ2V0U2VnbWVudFN0YXJ0VGltZVVzKG1TZXFOdW1iZXIpKTsKICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgbURpc2NvbnRpbnVpdHlTZXEpOwogICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoInN1YnRpdGxlR2VuZXJhdGlvbiIsIG1TdWJ0aXRsZUdlbmVyYXRpb24pOwotCiAgICAgICAgIHBhY2tldFNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KGJ1ZmZlcik7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKICAgICBpZiAobU5leHRQVFNUaW1lVXMgPj0gMGxsKSB7Ci0gICAgICAgIG1GaXJzdFBUU1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIG1BYnNvbHV0ZVRpbWVBbmNob3JVcyA9IG1OZXh0UFRTVGltZVVzOwogICAgICAgICBtTmV4dFBUU1RpbWVVcyA9IC0xbGw7CiAgICAgfQogCkBAIC0xNTY5LDExICsxOTcyLDIzIEBACiAgICAgQ0hFQ0socGFja2V0U291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOwogCiAgICAgaW50NjRfdCB0aW1lVXMgPSAoUFRTICogMTAwbGwpIC8gOWxsOwotICAgIGlmICghbUZpcnN0UFRTVmFsaWQpIHsKKyAgICBpZiAobVN0YXJ0dXAgJiYgIW1GaXJzdFBUU1ZhbGlkKSB7CiAgICAgICAgIG1GaXJzdFBUU1ZhbGlkID0gdHJ1ZTsKICAgICAgICAgbUZpcnN0VGltZVVzID0gdGltZVVzOwogICAgIH0KIAorICAgIGlmIChtU2VnbWVudEZpcnN0UFRTIDwgMGxsKSB7CisgICAgICAgIG1TZWdtZW50Rmlyc3RQVFMgPSB0aW1lVXM7CisgICAgICAgIGlmICghbVN0YXJ0VGltZVVzUmVsYXRpdmUpIHsKKyAgICAgICAgICAgIC8vIER1cGxpY2F0ZWQgbG9naWMgZnJvbSBob3cgd2UgaGFuZGxlIC50cyBwbGF5bGlzdHMuCisgICAgICAgICAgICBpZiAobVN0YXJ0dXAgJiYgbVNlZ21lbnRTdGFydFRpbWVVcyA+PSAwCisgICAgICAgICAgICAgICAgICAgICYmIGFkanVzdFNlcU51bWJlcldpdGhBbmNob3JUaW1lKHRpbWVVcykpIHsKKyAgICAgICAgICAgICAgICBtU2VnbWVudFN0YXJ0VGltZVVzID0gLTE7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKICAgICB3aGlsZSAob2Zmc2V0IDwgYnVmZmVyLT5zaXplKCkpIHsKICAgICAgICAgY29uc3QgdWludDhfdCAqYWR0c0hlYWRlciA9IGJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0OwpAQCAtMTYxNyw0MCArMjAzMiwxOCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobVN0YXJ0VGltZVVzTm90aWZ5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHRhcmdldER1cmF0aW9uU2VjczsKLSAgICAgICAgICAgICAgICBDSEVDSyhtUGxheWxpc3QtPm1ldGEoKS0+ZmluZEludDMyKCJ0YXJnZXQtZHVyYXRpb24iLCAmdGFyZ2V0RHVyYXRpb25TZWNzKSk7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCB0YXJnZXREdXJhdGlvblVzID0gdGFyZ2V0RHVyYXRpb25TZWNzICogMTAwMDAwMGxsOwotCi0gICAgICAgICAgICAgICAgLy8gRHVwbGljYXRlZCBsb2dpYyBmcm9tIGhvdyB3ZSBoYW5kbGUgLnRzIHBsYXlsaXN0cy4KLSAgICAgICAgICAgICAgICBpZiAobVN0YXJ0dXAgJiYgbVNlZ21lbnRTdGFydFRpbWVVcyA+PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiB0aW1lVXMgLSBtU3RhcnRUaW1lVXMgPiB0YXJnZXREdXJhdGlvblVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgbmV3U2VxTnVtYmVyID0gZ2V0U2VxTnVtYmVyV2l0aEFuY2hvclRpbWUodGltZVVzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1NlcU51bWJlciA+PSBtU2VxTnVtYmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAtLW1TZXFOdW1iZXI7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VxTnVtYmVyID0gbmV3U2VxTnVtYmVyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50NjQoInRpbWVVc0F1ZGlvIiwgdGltZVVzKTsKLSAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnNldEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgbURpc2NvbnRpbnVpdHlTZXEpOwogICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50MzIoInN0cmVhbU1hc2siLCBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9BVURJTyk7Ci0gICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5wb3N0KCk7Ci0gICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgbVN0YXJ0dXAgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmIChtU3RvcFBhcmFtcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyBRdWV1ZSBkaXNjb250aW51aXR5IGluIG9yaWdpbmFsIHN0cmVhbS4KICAgICAgICAgICAgIGludDMyX3QgZGlzY29udGludWl0eVNlcTsKICAgICAgICAgICAgIGludDY0X3Qgc3RvcFRpbWVVczsKICAgICAgICAgICAgIGlmICghbVN0b3BQYXJhbXMtPmZpbmRJbnQzMigiZGlzY29udGludWl0eVNlcSIsICZkaXNjb250aW51aXR5U2VxKQogICAgICAgICAgICAgICAgICAgICB8fCBkaXNjb250aW51aXR5U2VxID4gbURpc2NvbnRpbnVpdHlTZXEKICAgICAgICAgICAgICAgICAgICAgfHwgIW1TdG9wUGFyYW1zLT5maW5kSW50NjQoInRpbWVVc0F1ZGlvIiwgJnN0b3BUaW1lVXMpCiAgICAgICAgICAgICAgICAgICAgIHx8IChkaXNjb250aW51aXR5U2VxID09IG1EaXNjb250aW51aXR5U2VxICYmIHVuaXRUaW1lVXMgPj0gc3RvcFRpbWVVcykpIHsKLSAgICAgICAgICAgICAgICBwYWNrZXRTb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChtU2Vzc2lvbi0+Y3JlYXRlRm9ybWF0Q2hhbmdlQnVmZmVyKCkpOwogICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlTWFzayA9IDA7CiAgICAgICAgICAgICAgICAgbVBhY2tldFNvdXJjZXMuY2xlYXIoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwpAQCAtMTY4NywzMyArMjA4MCwxMSBAQAogICAgIG1zZy0+cG9zdCgpOwogfQogCi1pbnQ2NF90IFBsYXlsaXN0RmV0Y2hlcjo6cmVzdW1lVGhyZXNob2xkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgIGlmIChtc2ctPmZpbmRJbnQ2NCgiZHVyYXRpb25VcyIsICZkdXJhdGlvblVzKSAmJiBkdXJhdGlvblVzID4gMCkgewotICAgICAgICByZXR1cm4ga051bVNraXBGcmFtZXMgKiBkdXJhdGlvblVzOwotICAgIH0KLQotICAgIHNwPFJlZkJhc2U+IG9iajsKLSAgICBtc2ctPmZpbmRPYmplY3QoImZvcm1hdCIsICZvYmopOwotICAgIE1ldGFEYXRhICpmb3JtYXQgPSBzdGF0aWNfY2FzdDxNZXRhRGF0YSAqPihvYmouZ2V0KCkpOwotCi0gICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBDSEVDSyhmb3JtYXQtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKLSAgICBib29sIGF1ZGlvID0gIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KTsKLSAgICBpZiAoYXVkaW8pIHsKLSAgICAgICAgLy8gQXNzdW1lcyAxMDAwIHNhbXBsZXMgcGVyIGZyYW1lLgotICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGU7Ci0gICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOwotICAgICAgICByZXR1cm4ga051bVNraXBGcmFtZXMgIC8qIGZyYW1lcyAqLyAqIDEwMDAgLyogc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgICogKDEwMDAwMDAgLyBzYW1wbGVSYXRlKSAvKiBzYW1wbGUgZHVyYXRpb24gKHVzKSAqLzsKLSAgICB9IGVsc2UgewotICAgICAgICBpbnQzMl90IGZyYW1lUmF0ZTsKLSAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKGtLZXlGcmFtZVJhdGUsICZmcmFtZVJhdGUpICYmIGZyYW1lUmF0ZSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBrTnVtU2tpcEZyYW1lcyAqICgxMDAwMDAwIC8gZnJhbWVSYXRlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiA1MDAwMDBsbDsKK3ZvaWQgUGxheWxpc3RGZXRjaGVyOjp1cGRhdGVUYXJnZXREdXJhdGlvbigpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbXNnLT5zZXRJbnQzMigid2hhdCIsIGtXaGF0VGFyZ2V0RHVyYXRpb25VcGRhdGUpOworICAgIG1zZy0+c2V0SW50NjQoInRhcmdldER1cmF0aW9uVXMiLCBtUGxheWxpc3QtPmdldFRhcmdldER1cmF0aW9uKCkpOworICAgIG1zZy0+cG9zdCgpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaAppbmRleCA0ZTE1Zjg1Li5jOGNhNDU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaApAQCAtMjcsNyArMjcsNyBAQAogCiBzdHJ1Y3QgQUJ1ZmZlcjsKIHN0cnVjdCBBbm90aGVyUGFja2V0U291cmNlOwotc3RydWN0IERhdGFTb3VyY2U7CitjbGFzcyBEYXRhU291cmNlOwogc3RydWN0IEhUVFBCYXNlOwogc3RydWN0IExpdmVEYXRhU291cmNlOwogc3RydWN0IE0zVVBhcnNlcjsKQEAgLTM2LDYgKzM2LDcgQEAKIHN0cnVjdCBQbGF5bGlzdEZldGNoZXIgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNaW5CdWZmZXJlZER1cmF0aW9uVXM7CiAgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0Rvd25sb2FkQmxvY2tTaXplOworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtGZXRjaGVyUmVzdW1lVGhyZXNob2xkOwogCiAgICAgZW51bSB7CiAgICAgICAgIGtXaGF0U3RhcnRlZCwKQEAgLTQzLDM2ICs0NCw0MyBAQAogICAgICAgICBrV2hhdFN0b3BwZWQsCiAgICAgICAgIGtXaGF0RXJyb3IsCiAgICAgICAgIGtXaGF0RHVyYXRpb25VcGRhdGUsCi0gICAgICAgIGtXaGF0VGVtcG9yYXJpbHlEb25lRmV0Y2hpbmcsCisgICAgICAgIGtXaGF0VGFyZ2V0RHVyYXRpb25VcGRhdGUsCiAgICAgICAgIGtXaGF0UHJlcGFyZWQsCiAgICAgICAgIGtXaGF0UHJlcGFyYXRpb25GYWlsZWQsCiAgICAgICAgIGtXaGF0U3RhcnRlZEF0LAorICAgICAgICBrV2hhdFN0b3BSZWFjaGVkLAorICAgICAgICBrV2hhdFBsYXlsaXN0RmV0Y2hlZCwKKyAgICAgICAga1doYXRNZXRhZGF0YURldGVjdGVkLAogICAgIH07CiAKICAgICBQbGF5bGlzdEZldGNoZXIoCiAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKICAgICAgICAgICAgIGNvbnN0IHNwPExpdmVTZXNzaW9uPiAmc2Vzc2lvbiwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgICAgIGludDMyX3QgaWQsCiAgICAgICAgICAgICBpbnQzMl90IHN1YnRpdGxlR2VuZXJhdGlvbik7CiAKLSAgICBzcDxEYXRhU291cmNlPiBnZXREYXRhU291cmNlKCk7CisgICAgaW50MzJfdCBnZXRGZXRjaGVySUQoKSBjb25zdDsKIAogICAgIHZvaWQgc3RhcnRBc3luYygKICAgICAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZhdWRpb1NvdXJjZSwKICAgICAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZ2aWRlb1NvdXJjZSwKICAgICAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZzdWJ0aXRsZVNvdXJjZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZtZXRhZGF0YVNvdXJjZSwKICAgICAgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSAtMWxsLCAgICAgICAgIC8vIHN0YXJ0aW5nIHRpbWVzdGFtcHMKICAgICAgICAgICAgIGludDY0X3Qgc2VnbWVudFN0YXJ0VGltZVVzID0gLTFsbCwgLy8gc3RhcnRpbmcgcG9zaXRpb24gd2l0aGluIHBsYXlsaXN0CiAgICAgICAgICAgICAvLyBzdGFydFRpbWVVcyE9c2VnbWVudFN0YXJ0VGltZVVzIG9ubHkgd2hlbiBwbGF5bGlzdCBpcyBsaXZlCi0gICAgICAgICAgICBpbnQzMl90IHN0YXJ0RGlzY29udGludWl0eVNlcSA9IDAsCi0gICAgICAgICAgICBib29sIGFkYXB0aXZlID0gZmFsc2UpOworICAgICAgICAgICAgaW50MzJfdCBzdGFydERpc2NvbnRpbnVpdHlTZXEgPSAtMSwKKyAgICAgICAgICAgIExpdmVTZXNzaW9uOjpTZWVrTW9kZSBzZWVrTW9kZSA9IExpdmVTZXNzaW9uOjprU2Vla01vZGVFeGFjdFBvc2l0aW9uKTsKIAotICAgIHZvaWQgcGF1c2VBc3luYygpOworICAgIHZvaWQgcGF1c2VBc3luYyhmbG9hdCB0aHJlc2hvbGRSYXRpbywgYm9vbCBkaXNjb25uZWN0KTsKIAogICAgIHZvaWQgc3RvcEFzeW5jKGJvb2wgY2xlYXIgPSB0cnVlKTsKIAogICAgIHZvaWQgcmVzdW1lVW50aWxBc3luYyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcyk7CiAKKyAgICB2b2lkIGZldGNoUGxheWxpc3RBc3luYygpOworCiAgICAgdWludDMyX3QgZ2V0U3RyZWFtVHlwZU1hc2soKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtU3RyZWFtVHlwZU1hc2s7CiAgICAgfQpAQCAtOTMsOCArMTAxLDExIEBACiAgICAgICAgIGtXaGF0TW9uaXRvclF1ZXVlICAgPSAnbW9uaScsCiAgICAgICAgIGtXaGF0UmVzdW1lVW50aWwgICAgPSAncnNtZScsCiAgICAgICAgIGtXaGF0RG93bmxvYWROZXh0ICAgPSAnZGxueCcsCisgICAgICAgIGtXaGF0RmV0Y2hQbGF5bGlzdCAgPSAnZmxzdCcKICAgICB9OwogCisgICAgc3RydWN0IERvd25sb2FkU3RhdGU7CisKICAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWF4TW9uaXRvckRlbGF5VXM7CiAgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga051bVNraXBGcmFtZXM7CiAKQEAgLTEwNSw5ICsxMTYsMTIgQEAKICAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKICAgICBzcDxBTWVzc2FnZT4gbVN0YXJ0VGltZVVzTm90aWZ5OwogCisgICAgc3A8SFRUUERvd25sb2FkZXI+IG1IVFRQRG93bmxvYWRlcjsKICAgICBzcDxMaXZlU2Vzc2lvbj4gbVNlc3Npb247CiAgICAgQVN0cmluZyBtVVJJOwogCisgICAgaW50MzJfdCBtRmV0Y2hlcklEOworCiAgICAgdWludDMyX3QgbVN0cmVhbVR5cGVNYXNrOwogICAgIGludDY0X3QgbVN0YXJ0VGltZVVzOwogCkBAIC0xMTYsNyArMTMwLDcgQEAKICAgICAvLyBhZGFwdGluZyBvciBzd2l0Y2hpbmcgdHJhY2tzLgogICAgIGludDY0X3QgbVNlZ21lbnRTdGFydFRpbWVVczsKIAotICAgIHNzaXplX3QgbURpc2NvbnRpbnVpdHlTZXE7CisgICAgaW50MzJfdCBtRGlzY29udGludWl0eVNlcTsKICAgICBib29sIG1TdGFydFRpbWVVc1JlbGF0aXZlOwogICAgIHNwPEFNZXNzYWdlPiBtU3RvcFBhcmFtczsgLy8gbWVzc2FnZSBjb250YWluaW5nIHRoZSBsYXRlc3QgdGltZXN0YW1wcyB3ZSBzaG91bGQgZmV0Y2guCiAKQEAgLTEyNiwxNyArMTQwLDIxIEBACiAgICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgc3A8QUJ1ZmZlcj4gPiBtQUVTS2V5Rm9yVVJJOwogCiAgICAgaW50NjRfdCBtTGFzdFBsYXlsaXN0RmV0Y2hUaW1lVXM7CisgICAgaW50NjRfdCBtUGxheWxpc3RUaW1lVXM7CiAgICAgc3A8TTNVUGFyc2VyPiBtUGxheWxpc3Q7CiAgICAgaW50MzJfdCBtU2VxTnVtYmVyOwogICAgIGludDMyX3QgbU51bVJldHJpZXM7CiAgICAgYm9vbCBtU3RhcnR1cDsKLSAgICBib29sIG1BZGFwdGl2ZTsKLSAgICBib29sIG1QcmVwYXJlZDsKKyAgICBib29sIG1JRFJGb3VuZDsKKyAgICBpbnQzMl90IG1TZWVrTW9kZTsKKyAgICBib29sIG1UaW1lQ2hhbmdlU2lnbmFsZWQ7CiAgICAgaW50NjRfdCBtTmV4dFBUU1RpbWVVczsKIAogICAgIGludDMyX3QgbU1vbml0b3JRdWV1ZUdlbmVyYXRpb247CiAgICAgY29uc3QgaW50MzJfdCBtU3VidGl0bGVHZW5lcmF0aW9uOwogCisgICAgaW50MzJfdCBtTGFzdERpc2NvbnRpbnVpdHlTZXE7CisKICAgICBlbnVtIFJlZnJlc2hTdGF0ZSB7CiAgICAgICAgIElOSVRJQUxfTUlOSU1VTV9SRUxPQURfREVMQVksCiAgICAgICAgIEZJUlNUX1VOQ0hBTkdFRF9SRUxPQURfQVRURU1QVCwKQEAgLTE1MCw5ICsxNjgsOCBAQAogICAgIHNwPEFUU1BhcnNlcj4gbVRTUGFyc2VyOwogCiAgICAgYm9vbCBtRmlyc3RQVFNWYWxpZDsKLSAgICB1aW50NjRfdCBtRmlyc3RQVFM7CiAgICAgaW50NjRfdCBtRmlyc3RUaW1lVXM7Ci0gICAgaW50NjRfdCBtQWJzb2x1dGVUaW1lQW5jaG9yVXM7CisgICAgaW50NjRfdCBtU2VnbWVudEZpcnN0UFRTOwogICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IG1WaWRlb0J1ZmZlcjsKIAogICAgIC8vIFN0b3JlcyB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIHRvIGRlY3J5cHQgdGhlIG5leHQgYmxvY2sgb2YgY2lwaGVyIHRleHQsIHdoaWNoIGNhbgpAQCAtMTYwLDYgKzE3NywxMyBAQAogICAgIC8vIHRoZSBsYXN0IGJsb2NrIG9mIGNpcGhlciB0ZXh0IChjaXBoZXItYmxvY2sgY2hhaW5pbmcpLgogICAgIHVuc2lnbmVkIGNoYXIgbUFFU0luaXRWZWNbMTZdOwogCisgICAgTXV0ZXggbVRocmVzaG9sZExvY2s7CisgICAgZmxvYXQgbVRocmVzaG9sZFJhdGlvOworCisgICAgc3A8RG93bmxvYWRTdGF0ZT4gbURvd25sb2FkU3RhdGU7CisKKyAgICBib29sIG1IYXNNZXRhZGF0YTsKKwogICAgIC8vIFNldCBmaXJzdCB0byB0cnVlIGlmIGRlY3J5cHRpbmcgdGhlIGZpcnN0IHNlZ21lbnQgb2YgYSBwbGF5bGlzdCBzZWdtZW50LiBXaGVuCiAgICAgLy8gZmlyc3QgaXMgdHJ1ZSwgcmVzZXQgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciBiYXNlZCBvbiB0aGUgYXZhaWxhYmxlCiAgICAgLy8gaW5mb3JtYXRpb24gaW4gdGhlIG1hbmlmZXN0OyBvdGhlcndpc2UsIHVzZSB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGFzCkBAIC0xNzUsNiArMTk5LDEwIEBACiAKICAgICB2b2lkIHBvc3RNb25pdG9yUXVldWUoaW50NjRfdCBkZWxheVVzID0gMCwgaW50NjRfdCBtaW5EZWxheVVzID0gMCk7CiAgICAgdm9pZCBjYW5jZWxNb25pdG9yUXVldWUoKTsKKyAgICB2b2lkIHNldFN0b3BwaW5nVGhyZXNob2xkKGZsb2F0IHRocmVzaG9sZFJhdGlvLCBib29sIGRpc2Nvbm5lY3QpOworICAgIHZvaWQgcmVzZXRTdG9wcGluZ1RocmVzaG9sZChib29sIGRpc2Nvbm5lY3QpOworICAgIGZsb2F0IGdldFN0b3BwaW5nVGhyZXNob2xkKCk7CisgICAgYm9vbCBzaG91bGRQYXVzZURvd25sb2FkKCk7CiAKICAgICBpbnQ2NF90IGRlbGF5VXNUb1JlZnJlc2hQbGF5bGlzdCgpIGNvbnN0OwogICAgIHN0YXR1c190IHJlZnJlc2hQbGF5bGlzdCgpOwpAQCAtMTgyLDEyICsyMTAsMTkgQEAKICAgICAvLyBSZXR1cm5zIHRoZSBtZWRpYSB0aW1lIGluIHVzIG9mIHRoZSBzZWdtZW50IHNwZWNpZmllZCBieSBzZXFOdW1iZXIuCiAgICAgLy8gVGhpcyBpcyBjb21wdXRlZCBieSBzdW1taW5nIHRoZSBkdXJhdGlvbnMgb2YgYWxsIHNlZ21lbnRzIGJlZm9yZSBpdC4KICAgICBpbnQ2NF90IGdldFNlZ21lbnRTdGFydFRpbWVVcyhpbnQzMl90IHNlcU51bWJlcikgY29uc3Q7CisgICAgLy8gUmV0dXJucyB0aGUgZHVyYXRpb24gdGltZSBpbiB1cyBvZiB0aGUgc2VnbWVudCBzcGVjaWZpZWQuCisgICAgaW50NjRfdCBnZXRTZWdtZW50RHVyYXRpb25VcyhpbnQzMl90IHNlcU51bWJlcikgY29uc3Q7CiAKICAgICBzdGF0dXNfdCBvblN0YXJ0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICB2b2lkIG9uUGF1c2UoKTsKICAgICB2b2lkIG9uU3RvcChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgdm9pZCBvbk1vbml0b3JRdWV1ZSgpOwogICAgIHZvaWQgb25Eb3dubG9hZE5leHQoKTsKKyAgICBib29sIGluaXREb3dubG9hZFN0YXRlKAorICAgICAgICAgICAgQVN0cmluZyAmdXJpLAorICAgICAgICAgICAgc3A8QU1lc3NhZ2U+ICZpdGVtTWV0YSwKKyAgICAgICAgICAgIGludDMyX3QgJmZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKKyAgICAgICAgICAgIGludDMyX3QgJmxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KTsKIAogICAgIC8vIFJlc3VtZSBhIGZldGNoZXIgdG8gY29udGludWUgdW50aWwgdGhlIHN0b3BwaW5nIHBvaW50IHN0b3JlZCBpbiBtc2cuCiAgICAgc3RhdHVzX3Qgb25SZXN1bWVVbnRpbChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CkBAIC0xOTYsMjUgKzIzMSwyNCBAQAogICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQsCiAgICAgICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmc291cmNlLAogICAgICAgICAgICAgYm9vbCBkaXNjYXJkID0gZmFsc2UpOworICAgIGJvb2wgaXNTdGFydFRpbWVSZWFjaGVkKGludDY0X3QgdGltZVVzKTsKICAgICBzdGF0dXNfdCBleHRyYWN0QW5kUXVldWVBY2Nlc3NVbml0c0Zyb21Ucyhjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKIAogICAgIHN0YXR1c190IGV4dHJhY3RBbmRRdWV1ZUFjY2Vzc1VuaXRzKAogICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZpdGVtTWV0YSk7CiAKKyAgICB2b2lkIG5vdGlmeVN0b3BSZWFjaGVkKCk7CiAgICAgdm9pZCBub3RpZnlFcnJvcihzdGF0dXNfdCBlcnIpOwogCiAgICAgdm9pZCBxdWV1ZURpc2NvbnRpbnVpdHkoCiAgICAgICAgICAgICBBVFNQYXJzZXI6OkRpc2NvbnRpbnVpdHlUeXBlIHR5cGUsIGNvbnN0IHNwPEFNZXNzYWdlPiAmZXh0cmEpOwogCi0gICAgaW50MzJfdCBnZXRTZXFOdW1iZXJXaXRoQW5jaG9yVGltZShpbnQ2NF90IGFuY2hvclRpbWVVcykgY29uc3Q7CisgICAgYm9vbCBhZGp1c3RTZXFOdW1iZXJXaXRoQW5jaG9yVGltZShpbnQ2NF90IGFuY2hvclRpbWVVcyk7CiAgICAgaW50MzJfdCBnZXRTZXFOdW1iZXJGb3JEaXNjb250aW51aXR5KHNpemVfdCBkaXNjb250aW51aXR5U2VxKSBjb25zdDsKICAgICBpbnQzMl90IGdldFNlcU51bWJlckZvclRpbWUoaW50NjRfdCB0aW1lVXMpIGNvbnN0OwogCiAgICAgdm9pZCB1cGRhdGVEdXJhdGlvbigpOwotCi0gICAgLy8gQmVmb3JlIHJlc3VtaW5nIGEgZmV0Y2hlciBpbiBvblJlc3VtZSwgY2hlY2sgdGhlIHJlbWFpbmluZyBkdXJhdGlvbiBpcyBsb25nZXIgdGhhbiB0aGF0Ci0gICAgLy8gcmV0dXJuZWQgYnkgcmVzdW1lVGhyZXNob2xkLgotICAgIGludDY0X3QgcmVzdW1lVGhyZXNob2xkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIHVwZGF0ZVRhcmdldER1cmF0aW9uKCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQbGF5bGlzdEZldGNoZXIpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQubWsKaW5kZXggMjE5NGMzOC4uNjhiZDAxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQubWsKQEAgLTQsNyArNCw4IEBACiBMT0NBTF9TUkNfRklMRVMgOj0gXAogCUlEMy5jcHAKIAotTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCiAKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9pZDMKIApAQCAtMTcsNyArMTgsOCBAQAogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKIAl0ZXN0aWQzLmNwcAogCi1MT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAJbGlic3RhZ2VmcmlnaHQgbGlidXRpbHMgbGlibG9nIGxpYmJpbmRlciBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCmluZGV4IDc3ZDY1ZTAuLjc1OGIyYzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSAiSFRUUEJhc2UuaCIKICNpbmNsdWRlICJUaW1lZEV2ZW50UXVldWUuaCIKIAorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+CkBAIC0zMSwyMCArMzIsMjAgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgQXVkaW9QbGF5ZXI7CitjbGFzcyBBdWRpb1BsYXllcjsKIHN0cnVjdCBDbG9ja0VzdGltYXRvcjsKLXN0cnVjdCBEYXRhU291cmNlOwotc3RydWN0IE1lZGlhQnVmZmVyOworY2xhc3MgSURhdGFTb3VyY2U7CitjbGFzcyBNZWRpYUJ1ZmZlcjsKIHN0cnVjdCBNZWRpYUV4dHJhY3RvcjsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKIHN0cnVjdCBOdUNhY2hlZFNvdXJjZTI7Ci1zdHJ1Y3QgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK2NsYXNzIElHcmFwaGljQnVmZmVyUHJvZHVjZXI7CiAKIGNsYXNzIERybU1hbmFnZXJDbGluZXQ7CiBjbGFzcyBEZWNyeXB0SGFuZGxlOwogCiBjbGFzcyBUaW1lZFRleHREcml2ZXI7Ci1zdHJ1Y3QgV1ZNRXh0cmFjdG9yOworY2xhc3MgV1ZNRXh0cmFjdG9yOwogCiBzdHJ1Y3QgQXdlc29tZVJlbmRlcmVyIDogcHVibGljIFJlZkJhc2UgewogICAgIEF3ZXNvbWVSZW5kZXJlcigpIHt9CkBAIC05Myw2ICs5NCw4IEBACiAKICAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KTsKICAgICBzdGF0dXNfdCBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSk7CisgICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSk7CisgICAgc3RhdHVzX3QgZ2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSAvKiBub25udWxsICovKTsKICAgICBzdGF0dXNfdCBpbnZva2UoY29uc3QgUGFyY2VsICZyZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KTsKICAgICBzdGF0dXNfdCBzZXRDYWNoZVN0YXRDb2xsZWN0RnJlcShjb25zdCBQYXJjZWwgJnJlcXVlc3QpOwogCkBAIC0xODAsNiArMTgzLDcgQEAKICAgICBzcDxNZWRpYVNvdXJjZT4gbU9teFNvdXJjZTsKICAgICBzcDxNZWRpYVNvdXJjZT4gbUF1ZGlvU291cmNlOwogICAgIEF1ZGlvUGxheWVyICptQXVkaW9QbGF5ZXI7CisgICAgQXVkaW9QbGF5YmFja1JhdGUgbVBsYXliYWNrU2V0dGluZ3M7CiAgICAgaW50NjRfdCBtRHVyYXRpb25VczsKIAogICAgIGludDMyX3QgbURpc3BsYXlXaWR0aDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQ2FsbGJhY2tEYXRhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0NhbGxiYWNrRGF0YVNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMjFkZDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0NhbGxiYWNrRGF0YVNvdXJjZS5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DQUxMQkFDS0RBVEFTT1VSQ0VfSAorI2RlZmluZSBBTkRST0lEX0NBTExCQUNLREFUQVNPVVJDRV9ICisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJRGF0YVNvdXJjZTsKK2NsYXNzIElNZW1vcnk7CisKKy8vIEEgc3RhZ2VmcmlnaHQgRGF0YVNvdXJjZSB0aGF0IHdyYXBzIGEgYmluZGVyIElEYXRhU291cmNlLiBJdCdzIGEgIkNhbGxiYWNrIgorLy8gRGF0YVNvdXJjZSBiZWNhdXNlIGl0IGNhbGxzIGJhY2sgdG8gdGhlIElEYXRhU291cmNlIGZvciBkYXRhLgorY2xhc3MgQ2FsbGJhY2tEYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgeworcHVibGljOgorICAgIENhbGxiYWNrRGF0YVNvdXJjZShjb25zdCBzcDxJRGF0YVNvdXJjZT4mIGlEYXRhU291cmNlKTsKKyAgICB2aXJ0dWFsIH5DYWxsYmFja0RhdGFTb3VyY2UoKTsKKworICAgIC8vIERhdGFTb3VyY2UgaW1wbGVtZW50YXRpb24uCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOworCitwcml2YXRlOgorICAgIHNwPElEYXRhU291cmNlPiBtSURhdGFTb3VyY2U7CisgICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENhbGxiYWNrRGF0YVNvdXJjZSk7Cit9OworCisKKy8vIEEgY2FjaGluZyBEYXRhU291cmNlIHRoYXQgd3JhcHMgYSBDYWxsYmFja0RhdGFTb3VyY2UuIEZvciByZWFkcyBzbWFsbGVyCisvLyB0aGFuIGtDYWNoZVNpemUgaXQgd2lsbCByZWFkIHVwIHRvIGtDYWNoZVNpemUgYWhlYWQgYW5kIGNhY2hlIGl0LgorLy8gVGhpcyByZWR1Y2VzIHRoZSBudW1iZXIgb2YgYmluZGVyIHJvdW5kIHRyaXBzIHRvIHRoZSBJRGF0YVNvdXJjZSBhbmQgaGFzIGEgc2lnbmlmaWNhbnQKKy8vIGltcGFjdCBvbiB0aW1lIHRha2VuIGZvciBmaWxldHlwZSBzbmlmZmluZyBhbmQgbWV0YWRhdGEgZXh0cmFjdGlvbi4KK2NsYXNzIFRpbnlDYWNoZVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlIHsKK3B1YmxpYzoKKyAgICBUaW55Q2FjaGVTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4mIHNvdXJjZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCogc2l6ZSk7CisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOworCitwcml2YXRlOgorICAgIC8vIDJrYiBjb21lcyBmcm9tIGV4cGVyaW1lbnRpbmcgd2l0aCB0aGUgdGltZS10by1maXJzdC1mcmFtZSBmcm9tIGEgTWVkaWFQbGF5ZXIKKyAgICAvLyB3aXRoIGFuIGluLW1lbW9yeSBNZWRpYURhdGFTb3VyY2Ugc291cmNlIG9uIGEgTmV4dXMgNS4gQmV5b25kIDJrYiB0aGVyZSB3YXMKKyAgICAvLyBubyBpbXByb3ZlbWVudC4KKyAgICBlbnVtIHsKKyAgICAgICAga0NhY2hlU2l6ZSA9IDIwNDgsCisgICAgfTsKKworICAgIHNwPERhdGFTb3VyY2U+IG1Tb3VyY2U7CisgICAgdWludDhfdCBtQ2FjaGVba0NhY2hlU2l6ZV07CisgICAgb2ZmNjRfdCBtQ2FjaGVkT2Zmc2V0OworICAgIHNpemVfdCBtQ2FjaGVkU2l6ZTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRpbnlDYWNoZVNvdXJjZSk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9DQUxMQkFDS0RBVEFTT1VSQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHMlBTRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyUFNFeHRyYWN0b3IuaAppbmRleCBmYjc2NTY0Li4yMmNiMDJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyUFNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyUFNFeHRyYWN0b3IuaApAQCAtMjgsNyArMjgsNyBAQAogc3RydWN0IEFCdWZmZXI7CiBzdHJ1Y3QgQU1lc3NhZ2U7CiBzdHJ1Y3QgVHJhY2s7Ci1zdHJ1Y3QgU3RyaW5nODsKK2NsYXNzIFN0cmluZzg7CiAKIHN0cnVjdCBNUEVHMlBTRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKICAgICBNUEVHMlBTRXh0cmFjdG9yKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHMlRTRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaAppbmRleCBkYjExODdkLi44ZWI4ZjZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaApAQCAtMjAsNyArMjAsOSBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMzAsNyArMzIsNyBAQAogc3RydWN0IEFUU1BhcnNlcjsKIGNsYXNzIERhdGFTb3VyY2U7CiBzdHJ1Y3QgTVBFRzJUU1NvdXJjZTsKLXN0cnVjdCBTdHJpbmc4OworY2xhc3MgU3RyaW5nODsKIAogc3RydWN0IE1QRUcyVFNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewogICAgIE1QRUcyVFNFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSk7CkBAIC01NCwxMCArNTYsMjEgQEAKIAogICAgIFZlY3RvcjxzcDxBbm90aGVyUGFja2V0U291cmNlPiA+IG1Tb3VyY2VJbXBsczsKIAorICAgIFZlY3RvcjxLZXllZFZlY3RvcjxpbnQ2NF90LCBvZmY2NF90PiA+IG1TeW5jUG9pbnRzOworICAgIC8vIFN5bmMgcG9pbnRzIHVzZWQgZm9yIHNlZWtpbmcgLS0tIG5vcm1hbGx5IG9uZSBmb3IgdmlkZW8gdHJhY2sgaXMgdXNlZC4KKyAgICAvLyBJZiBubyB2aWRlbyB0cmFjayBpcyBwcmVzZW50LCBhdWRpbyB0cmFjayB3aWxsIGJlIHVzZWQgaW5zdGVhZC4KKyAgICBLZXllZFZlY3RvcjxpbnQ2NF90LCBvZmY2NF90PiAqbVNlZWtTeW5jUG9pbnRzOworCiAgICAgb2ZmNjRfdCBtT2Zmc2V0OwogCiAgICAgdm9pZCBpbml0KCk7CiAgICAgc3RhdHVzX3QgZmVlZE1vcmUoKTsKKyAgICBzdGF0dXNfdCBzZWVrKGludDY0X3Qgc2Vla1RpbWVVcywKKyAgICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUmIHNlZWtNb2RlKTsKKyAgICBzdGF0dXNfdCBxdWV1ZURpc2NvbnRpbnVpdHlGb3JTZWVrKGludDY0X3QgYWN0dWFsU2Vla1RpbWVVcyk7CisgICAgc3RhdHVzX3Qgc2Vla0JleW9uZChpbnQ2NF90IHNlZWtUaW1lVXMpOworCisgICAgc3RhdHVzX3QgZmVlZFVudGlsQnVmZmVyQXZhaWxhYmxlKGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1QRUcyVFNFeHRyYWN0b3IpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaAppbmRleCAxZmU2ZmNmLi4zMDY3YzNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oCkBAIC04Myw2ICs4Myw4IEBACiAKICAgICBWZWN0b3I8U2lkeEVudHJ5PiBtU2lkeEVudHJpZXM7CiAgICAgb2ZmNjRfdCBtTW9vZk9mZnNldDsKKyAgICBib29sIG1Nb29mRm91bmQ7CisgICAgYm9vbCBtTWRhdEZvdW5kOwogCiAgICAgVmVjdG9yPFBzc2hJbmZvPiBtUHNzaDsKIApAQCAtMTAyLDExICsxMDQsMTUgQEAKICAgICBTdHJpbmc4IG1MYXN0Q29tbWVudE5hbWU7CiAgICAgU3RyaW5nOCBtTGFzdENvbW1lbnREYXRhOwogCisgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEFTdHJpbmc+IG1NZXRhS2V5TWFwOworCiAgICAgc3RhdHVzX3QgcmVhZE1ldGFEYXRhKCk7CiAgICAgc3RhdHVzX3QgcGFyc2VDaHVuayhvZmY2NF90ICpvZmZzZXQsIGludCBkZXB0aCk7CiAgICAgc3RhdHVzX3QgcGFyc2VJVHVuZXNNZXRhRGF0YShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwogICAgIHN0YXR1c190IHBhcnNlM0dQUE1ldGFEYXRhKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgaW50IGRlcHRoKTsKICAgICB2b2lkIHBhcnNlSUQzdjJNZXRhRGF0YShvZmY2NF90IG9mZnNldCk7CisgICAgc3RhdHVzX3QgcGFyc2VRVE1ldGFLZXkob2ZmNjRfdCBkYXRhX29mZnNldCwgc2l6ZV90IGRhdGFfc2l6ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VRVE1ldGFWYWwoaW50MzJfdCBrZXlJZCwgb2ZmNjRfdCBkYXRhX29mZnNldCwgc2l6ZV90IGRhdGFfc2l6ZSk7CiAKICAgICBzdGF0dXNfdCB1cGRhdGVBdWRpb1RyYWNrSW5mb0Zyb21FU0RTX01QRUc0QXVkaW8oCiAgICAgICAgICAgICBjb25zdCB2b2lkICplc2RzX2RhdGEsIHNpemVfdCBlc2RzX3NpemUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YLmgKaW5kZXggMmRhNWM2Yy4uZTdjNGY2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVguaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWC5oCkBAIC0yNCw3ICsyNCw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBPTVhNYXN0ZXI7Ci1jbGFzcyBPTVhOb2RlSW5zdGFuY2U7CitzdHJ1Y3QgT01YTm9kZUluc3RhbmNlOwogCiBjbGFzcyBPTVggOiBwdWJsaWMgQm5PTVgsCiAgICAgICAgICAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgewpAQCAtNjksNyArNjksNyBAQAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9VMzIqIHVzYWdlKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcmVNZXRhRGF0YUluQnVmZmVycygKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfQk9PTCBlbmFibGUpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9CT09MIGVuYWJsZSwgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2soCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCBlbmFibGUsCkBAIC04MSw3ICs4MSw3IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHVzZUJ1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAotICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIpOworICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIsIE9NWF9VMzIgYWxsb3R0ZWRTaXplKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgdXNlR3JhcGhpY0J1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LApAQCAtOTMsNyArOTMsMTcgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlSW5wdXRTdXJmYWNlKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsCi0gICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqYnVmZmVyUHJvZHVjZXIpOworICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKmJ1ZmZlclByb2R1Y2VyLAorICAgICAgICAgICAgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlUGVyc2lzdGVudElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpidWZmZXJQcm9kdWNlciwKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+ICpidWZmZXJDb25zdW1lcik7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LAorICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gJmJ1ZmZlckNvbnN1bWVyLAorICAgICAgICAgICAgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbShub2RlX2lkIG5vZGUpOwogCkBAIC0xMDMsMTggKzExMywxOCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcldpdGhCYWNrdXAoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKLSAgICAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyKTsKKyAgICAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyLCBPTVhfVTMyIGFsbG90dGVkU2l6ZSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGZyZWVCdWZmZXIoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgYnVmZmVyX2lkIGJ1ZmZlcik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGZpbGxCdWZmZXIobm9kZV9pZCBub2RlLCBidWZmZXJfaWQgYnVmZmVyKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGZpbGxCdWZmZXIobm9kZV9pZCBub2RlLCBidWZmZXJfaWQgYnVmZmVyLCBpbnQgZmVuY2VGZCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGVtcHR5QnVmZmVyKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLAogICAgICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlciwKICAgICAgICAgICAgIE9NWF9VMzIgcmFuZ2Vfb2Zmc2V0LCBPTVhfVTMyIHJhbmdlX2xlbmd0aCwKLSAgICAgICAgICAgIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXApOworICAgICAgICAgICAgT01YX1UzMiBmbGFncywgT01YX1RJQ0tTIHRpbWVzdGFtcCwgaW50IGZlbmNlRmQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFeHRlbnNpb25JbmRleCgKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwKQEAgLTE0MCwxMCArMTUwLDEwIEBACiAgICAgICAgICAgICBPTVhfSU4gT01YX1BUUiBwRXZlbnREYXRhKTsKIAogICAgIE9NWF9FUlJPUlRZUEUgT25FbXB0eUJ1ZmZlckRvbmUoCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUsIGJ1ZmZlcl9pZCBidWZmZXIsIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcEJ1ZmZlcik7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUsIGJ1ZmZlcl9pZCBidWZmZXIsIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcEJ1ZmZlciwgaW50IGZlbmNlRmQpOwogCiAgICAgT01YX0VSUk9SVFlQRSBPbkZpbGxCdWZmZXJEb25lKAotICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBidWZmZXJfaWQgYnVmZmVyLCBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUgKnBCdWZmZXIpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBidWZmZXJfaWQgYnVmZmVyLCBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUgKnBCdWZmZXIsIGludCBmZW5jZUZkKTsKIAogICAgIHZvaWQgaW52YWxpZGF0ZU5vZGVJRChub2RlX2lkIG5vZGUpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVhOb2RlSW5zdGFuY2UuaAppbmRleCA0NTg2YWEyLi5lNWZiNDViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmgKQEAgLTI3LDcgKzI3LDkgQEAKIAogY2xhc3MgSU9NWE9ic2VydmVyOwogc3RydWN0IE9NWE1hc3RlcjsKLXN0cnVjdCBHcmFwaGljQnVmZmVyU291cmNlOworY2xhc3MgR3JhcGhpY0J1ZmZlclNvdXJjZTsKKworc3RhdHVzX3QgU3RhdHVzRnJvbU9NWEVycm9yKE9NWF9FUlJPUlRZUEUgZXJyKTsKIAogc3RydWN0IE9NWE5vZGVJbnN0YW5jZSB7CiAgICAgT01YTm9kZUluc3RhbmNlKApAQCAtNTYsNyArNTgsOCBAQAogCiAgICAgc3RhdHVzX3QgZ2V0R3JhcGhpY0J1ZmZlclVzYWdlKE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfVTMyKiB1c2FnZSk7CiAKLSAgICBzdGF0dXNfdCBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzKE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCBlbmFibGUpOworICAgIHN0YXR1c190IHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLCBNZXRhZGF0YUJ1ZmZlclR5cGUgKnR5cGUpOwogCiAgICAgc3RhdHVzX3QgcHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2soCiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLApAQCAtNjgsNyArNzEsNyBAQAogCiAgICAgc3RhdHVzX3QgdXNlQnVmZmVyKAogICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCi0gICAgICAgICAgICBPTVg6OmJ1ZmZlcl9pZCAqYnVmZmVyKTsKKyAgICAgICAgICAgIE9NWDo6YnVmZmVyX2lkICpidWZmZXIsIE9NWF9VMzIgYWxsb3R0ZWRTaXplKTsKIAogICAgIHN0YXR1c190IHVzZUdyYXBoaWNCdWZmZXIoCiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIsCkBAIC03OSw3ICs4MiwxNiBAQAogICAgICAgICAgICAgT01YOjpidWZmZXJfaWQgYnVmZmVyKTsKIAogICAgIHN0YXR1c190IGNyZWF0ZUlucHV0U3VyZmFjZSgKLSAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqYnVmZmVyUHJvZHVjZXIpOworICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpidWZmZXJQcm9kdWNlciwKKyAgICAgICAgICAgIE1ldGFkYXRhQnVmZmVyVHlwZSAqdHlwZSk7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgY3JlYXRlUGVyc2lzdGVudElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpidWZmZXJQcm9kdWNlciwKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+ICpidWZmZXJDb25zdW1lcik7CisKKyAgICBzdGF0dXNfdCBzZXRJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gJmJ1ZmZlckNvbnN1bWVyLAorICAgICAgICAgICAgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKTsKIAogICAgIHN0YXR1c190IHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKTsKIApAQCAtODksMjEgKzEwMSwyMCBAQAogCiAgICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXJXaXRoQmFja3VwKAogICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCi0gICAgICAgICAgICBPTVg6OmJ1ZmZlcl9pZCAqYnVmZmVyKTsKKyAgICAgICAgICAgIE9NWDo6YnVmZmVyX2lkICpidWZmZXIsIE9NWF9VMzIgYWxsb3R0ZWRTaXplKTsKIAogICAgIHN0YXR1c190IGZyZWVCdWZmZXIoT01YX1UzMiBwb3J0SW5kZXgsIE9NWDo6YnVmZmVyX2lkIGJ1ZmZlcik7CiAKLSAgICBzdGF0dXNfdCBmaWxsQnVmZmVyKE9NWDo6YnVmZmVyX2lkIGJ1ZmZlcik7CisgICAgc3RhdHVzX3QgZmlsbEJ1ZmZlcihPTVg6OmJ1ZmZlcl9pZCBidWZmZXIsIGludCBmZW5jZUZkKTsKIAogICAgIHN0YXR1c190IGVtcHR5QnVmZmVyKAogICAgICAgICAgICAgT01YOjpidWZmZXJfaWQgYnVmZmVyLAogICAgICAgICAgICAgT01YX1UzMiByYW5nZU9mZnNldCwgT01YX1UzMiByYW5nZUxlbmd0aCwKLSAgICAgICAgICAgIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXApOworICAgICAgICAgICAgT01YX1UzMiBmbGFncywgT01YX1RJQ0tTIHRpbWVzdGFtcCwgaW50IGZlbmNlRmQpOwogCi0gICAgc3RhdHVzX3QgZW1wdHlEaXJlY3RCdWZmZXIoCi0gICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyLAotICAgICAgICAgICAgT01YX1UzMiByYW5nZU9mZnNldCwgT01YX1UzMiByYW5nZUxlbmd0aCwKLSAgICAgICAgICAgIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXApOworICAgIHN0YXR1c190IGVtcHR5R3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIsIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wLCBpbnQgZmVuY2VGZCk7CiAKICAgICBzdGF0dXNfdCBnZXRFeHRlbnNpb25JbmRleCgKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhcmFtZXRlck5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KTsKQEAgLTExOCw2ICsxMjksOCBAQAogICAgICAgICByZXR1cm4gbUlzU2VjdXJlOwogICAgIH0KIAorICAgIC8vIGhhbmRsZXMgbWVzc2FnZXMgYW5kIHJlbW92ZXMgdGhlbSBmcm9tIHRoZSBsaXN0CisgICAgdm9pZCBvbk1lc3NhZ2VzKHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT4gJm1lc3NhZ2VzKTsKICAgICB2b2lkIG9uTWVzc2FnZShjb25zdCBvbXhfbWVzc2FnZSAmbXNnKTsKICAgICB2b2lkIG9uT2JzZXJ2ZXJEaWVkKE9NWE1hc3RlciAqbWFzdGVyKTsKICAgICB2b2lkIG9uR2V0SGFuZGxlRmFpbGVkKCk7CkBAIC0xNTIsNiArMTY1LDcgQEAKICAgICB1aW50MzJfdCBtQnVmZmVySURDb3VudDsKICAgICBLZXllZFZlY3RvcjxPTVg6OmJ1ZmZlcl9pZCwgT01YX0JVRkZFUkhFQURFUlRZUEUgKj4gbUJ1ZmZlcklEVG9CdWZmZXJIZWFkZXI7CiAgICAgS2V5ZWRWZWN0b3I8T01YX0JVRkZFUkhFQURFUlRZUEUgKiwgT01YOjpidWZmZXJfaWQ+IG1CdWZmZXJIZWFkZXJUb0J1ZmZlcklEOworICAgIE1ldGFkYXRhQnVmZmVyVHlwZSBtTWV0YWRhdGFUeXBlWzJdOwogCiAgICAgLy8gRm9yIGRlYnVnIHN1cHBvcnQKICAgICBjaGFyICptTmFtZTsKQEAgLTE5OSwxNiArMjEzLDM1IEBACiAgICAgICAgICAgICBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUgKnBCdWZmZXIpOwogCiAgICAgc3RhdHVzX3Qgc3RvcmVNZXRhRGF0YUluQnVmZmVyc19sKAotICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSwKLSAgICAgICAgICAgIE9NWF9CT09MIHVzZUdyYXBoaWNCdWZmZXIsIE9NWF9CT09MICp1c2luZ0dyYXBoaWNCdWZmZXJJbk1ldGEpOworICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSwgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKTsKKworICAgIC8vIFN0b3JlcyBmZW5jZSBpbnRvIGJ1ZmZlciBpZiBpdCBpcyBBTldCdWZmZXIgdHlwZSBhbmQgaGFzIGVub3VnaCBzcGFjZS4KKyAgICAvLyBvdGhlcndpc2UsIHdhaXRzIGZvciB0aGUgZmVuY2UgdG8gc2lnbmFsLiAgVGFrZXMgb3duZXJzaGlwIG9mIHxmZW5jZUZkfC4KKyAgICBzdGF0dXNfdCBzdG9yZUZlbmNlSW5NZXRhX2woCisgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyLCBpbnQgZmVuY2VGZCwgT01YX1UzMiBwb3J0SW5kZXgpOworCisgICAgLy8gUmV0cmlldmVzIHRoZSBmZW5jZSBmcm9tIGJ1ZmZlciBpZiBBTldCdWZmZXIgdHlwZSBhbmQgaGFzIGVub3VnaCBzcGFjZS4gT3RoZXJ3aXNlLCByZXR1cm5zIC0xCisgICAgaW50IHJldHJpZXZlRmVuY2VGcm9tTWV0YV9sKAorICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciwgT01YX1UzMiBwb3J0SW5kZXgpOwogCiAgICAgc3RhdHVzX3QgZW1wdHlCdWZmZXJfbCgKICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIsCi0gICAgICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wLCBpbnRwdHJfdCBkZWJ1Z0FkZHIpOworICAgICAgICAgICAgT01YX1UzMiBmbGFncywgT01YX1RJQ0tTIHRpbWVzdGFtcCwgaW50cHRyX3QgZGVidWdBZGRyLCBpbnQgZmVuY2VGZCk7CiAKKyAgICBzdGF0dXNfdCB1cGRhdGVHcmFwaGljQnVmZmVySW5NZXRhX2woCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIsCisgICAgICAgICAgICBPTVg6OmJ1ZmZlcl9pZCBidWZmZXIsIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIpOworCisgICAgc3RhdHVzX3QgY3JlYXRlR3JhcGhpY0J1ZmZlclNvdXJjZSgKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lciAvKiBudWxsYWJsZSAqLywKKyAgICAgICAgICAgIE1ldGFkYXRhQnVmZmVyVHlwZSAqdHlwZSk7CiAgICAgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gZ2V0R3JhcGhpY0J1ZmZlclNvdXJjZSgpOwogICAgIHZvaWQgc2V0R3JhcGhpY0J1ZmZlclNvdXJjZShjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgYnVmZmVyU291cmNlKTsKIAorICAgIC8vIEhhbmRsZXMgfG1zZ3wsIGFuZCBtYXkgbW9kaWZ5IGl0LiBSZXR1cm5zIHRydWUgaWZmIGNvbXBsZXRlbHkgaGFuZGxlZCBpdCBhbmQKKyAgICAvLyB8bXNnfCBkb2VzIG5vdCBuZWVkIHRvIGJlIHNlbnQgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLgorICAgIGJvb2wgaGFuZGxlTWVzc2FnZShvbXhfbWVzc2FnZSAmbXNnKTsKKwogICAgIE9NWE5vZGVJbnN0YW5jZShjb25zdCBPTVhOb2RlSW5zdGFuY2UgJik7CiAgICAgT01YTm9kZUluc3RhbmNlICZvcGVyYXRvcj0oY29uc3QgT01YTm9kZUluc3RhbmNlICYpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT2dnRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09nZ0V4dHJhY3Rvci5oCmluZGV4IGU5N2M4Y2QuLmM2NDdjYmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT2dnRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PZ2dFeHRyYWN0b3IuaApAQCAtMjcsNyArMjcsNyBAQAogY2xhc3MgRGF0YVNvdXJjZTsKIGNsYXNzIFN0cmluZzg7CiAKLXN0cnVjdCBNeVZvcmJpc0V4dHJhY3RvcjsKK3N0cnVjdCBNeU9nZ0V4dHJhY3RvcjsKIHN0cnVjdCBPZ2dTb3VyY2U7CiAKIHN0cnVjdCBPZ2dFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewpAQCAtNDgsNyArNDgsNyBAQAogICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAKLSAgICBNeVZvcmJpc0V4dHJhY3RvciAqbUltcGw7CisgICAgTXlPZ2dFeHRyYWN0b3IgKm1JbXBsOwogCiAgICAgT2dnRXh0cmFjdG9yKGNvbnN0IE9nZ0V4dHJhY3RvciAmKTsKICAgICBPZ2dFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBPZ2dFeHRyYWN0b3IgJik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NhbXBsZUl0ZXJhdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NhbXBsZUl0ZXJhdG9yLmgKaW5kZXggNjBjOWU3ZS4uNzA1MzI0NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TYW1wbGVJdGVyYXRvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlSXRlcmF0b3IuaApAQCAtMTgsNyArMTgsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBTYW1wbGVUYWJsZTsKK2NsYXNzIFNhbXBsZVRhYmxlOwogCiBzdHJ1Y3QgU2FtcGxlSXRlcmF0b3IgewogICAgIFNhbXBsZUl0ZXJhdG9yKFNhbXBsZVRhYmxlICp0YWJsZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnRPTVhDb21wb25lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdE9NWENvbXBvbmVudC5oCmluZGV4IGE4MDg2MTEuLjNhYjZmODggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdE9NWENvbXBvbmVudC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdE9NWENvbXBvbmVudC5oCkBAIC0xNjgsNiArMTY4LDIyIEBACiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdE9NWENvbXBvbmVudCk7CiB9OwogCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorYm9vbCBpc1ZhbGlkT01YUGFyYW0oVCAqYSkgeworICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKHR5cGVvZigqYSksIG5TaXplKSA9PSAwLCAiblNpemUgbm90IGF0IG9mZnNldCAwIik7CisgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPCBkZWNsdHlwZShhLT5uU2l6ZSksIE9NWF9VMzI+Ojp2YWx1ZSwgIm5TaXplIGhhcyB3cm9uZyB0eXBlIik7CisgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YodHlwZW9mKCphKSwgblZlcnNpb24pID09IDQsICJuVmVyc2lvbiBub3QgYXQgb2Zmc2V0IDQiKTsKKyAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8IGRlY2x0eXBlKGEtPm5WZXJzaW9uKSwgT01YX1ZFUlNJT05UWVBFPjo6dmFsdWUsCisgICAgICAgICAgIm5WZXJzaW9uIGhhcyB3cm9uZyB0eXBlIik7CisKKyAgaWYgKGEtPm5TaXplIDwgc2l6ZW9mKCphKSkgeworICAgICAgQUxPR0UoImIvMjcyMDcyNzU6IG5lZWQgJXp1LCBnb3QgJXUiLCBzaXplb2YoKmEpLCBhLT5uU2l6ZSk7CisgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3MjA3Mjc1Iik7CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gU09GVF9PTVhfQ09NUE9ORU5UX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCmluZGV4IGZhM2VhODkuLjc1N2IzMDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCkBAIC0xOSwyMiArMTksMjcgQEAKICNkZWZpbmUgU09GVFdBUkVfUkVOREVSRVJfSF8KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KIAorI2luY2x1ZGUgPGxpc3Q+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFNZXNzYWdlOwogCiBjbGFzcyBTb2Z0d2FyZVJlbmRlcmVyIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBTb2Z0d2FyZVJlbmRlcmVyKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3cpOworICAgIGV4cGxpY2l0IFNvZnR3YXJlUmVuZGVyZXIoCisgICAgICAgICAgICBjb25zdCBzcDxBTmF0aXZlV2luZG93PiAmbmF0aXZlV2luZG93LCBpbnQzMl90IHJvdGF0aW9uID0gMCk7CiAKICAgICB+U29mdHdhcmVSZW5kZXJlcigpOwogCi0gICAgdm9pZCByZW5kZXIoCi0gICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50NjRfdCB0aW1lc3RhbXBOcywKKyAgICBzdGQ6Omxpc3Q8RnJhbWVSZW5kZXJUcmFja2VyOjpJbmZvPiByZW5kZXIoCisgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50NjRfdCBtZWRpYVRpbWVVcywgbnNlY3NfdCByZW5kZXJUaW1lTnMsCiAgICAgICAgICAgICB2b2lkICpwbGF0Zm9ybVByaXZhdGUsIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKKyAgICB2b2lkIGNsZWFyVHJhY2tlcigpOwogCiBwcml2YXRlOgogICAgIGVudW0gWVVWTW9kZSB7CkBAIC00OCw2ICs1Myw4IEBACiAgICAgaW50MzJfdCBtV2lkdGgsIG1IZWlnaHQ7CiAgICAgaW50MzJfdCBtQ3JvcExlZnQsIG1Dcm9wVG9wLCBtQ3JvcFJpZ2h0LCBtQ3JvcEJvdHRvbTsKICAgICBpbnQzMl90IG1Dcm9wV2lkdGgsIG1Dcm9wSGVpZ2h0OworICAgIGludDMyX3QgbVJvdGF0aW9uRGVncmVlczsKKyAgICBGcmFtZVJlbmRlclRyYWNrZXIgbVJlbmRlclRyYWNrZXI7CiAKICAgICBTb2Z0d2FyZVJlbmRlcmVyKGNvbnN0IFNvZnR3YXJlUmVuZGVyZXIgJik7CiAgICAgU29mdHdhcmVSZW5kZXJlciAmb3BlcmF0b3I9KGNvbnN0IFNvZnR3YXJlUmVuZGVyZXIgJik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCmluZGV4IDY2MzJjMjcuLmZkNzM5ZDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCkBAIC0yNSw3ICsyNSw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IERhdGFTb3VyY2U7CitjbGFzcyBEYXRhU291cmNlOwogY2xhc3MgTWVkaWFFeHRyYWN0b3I7CiAKIHN0cnVjdCBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyIDogcHVibGljIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UgewpAQCAtMzgsNiArMzgsNyBAQAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4mIHNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIFZpZGVvRnJhbWUgKmdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uKTsKICAgICB2aXJ0dWFsIE1lZGlhQWxidW1BcnQgKmV4dHJhY3RBbGJ1bUFydCgpOwpAQCAtNTMsNiArNTQsOCBAQAogICAgIE1lZGlhQWxidW1BcnQgKm1BbGJ1bUFydDsKIAogICAgIHZvaWQgcGFyc2VNZXRhRGF0YSgpOworICAgIC8vIERlbGV0ZSBhbGJ1bSBhcnQgYW5kIGNsZWFyIG1ldGFkYXRhLgorICAgIHZvaWQgY2xlYXJNZXRhZGF0YSgpOwogCiAgICAgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcihjb25zdCBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyICYpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1RpbWVkRXZlbnRRdWV1ZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9UaW1lZEV2ZW50UXVldWUuaAppbmRleCAyOTYzMTUwLi44OTBmN2U4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1RpbWVkRXZlbnRRdWV1ZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVGltZWRFdmVudFF1ZXVlLmgKQEAgLTQ2LDcgKzQ2LDcgQEAKICAgICAgICAgdmlydHVhbCB2b2lkIGZpcmUoVGltZWRFdmVudFF1ZXVlICpxdWV1ZSwgaW50NjRfdCBub3dfdXMpID0gMDsKIAogICAgIHByaXZhdGU6Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBUaW1lZEV2ZW50UXVldWU7CisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgVGltZWRFdmVudFF1ZXVlOwogCiAgICAgICAgIGV2ZW50X2lkIG1FdmVudElEOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1ZCUklTZWVrZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVkJSSVNlZWtlci5oCmluZGV4IDFhMmJmOWYuLmM1N2Q1NzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVkJSSVNlZWtlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVkJSSVNlZWtlci5oCkBAIC0yNCw3ICsyNCw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IERhdGFTb3VyY2U7CitjbGFzcyBEYXRhU291cmNlOwogCiBzdHJ1Y3QgVkJSSVNlZWtlciA6IHB1YmxpYyBNUDNTZWVrZXIgewogICAgIHN0YXRpYyBzcDxWQlJJU2Vla2VyPiBDcmVhdGVGcm9tU291cmNlKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9YSU5HU2Vla2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1hJTkdTZWVrZXIuaAppbmRleCBjNDA4NTc2Li5jY2UwNGYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1hJTkdTZWVrZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1hJTkdTZWVrZXIuaApAQCAtMjIsNyArMjIsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBEYXRhU291cmNlOworY2xhc3MgRGF0YVNvdXJjZTsKIAogc3RydWN0IFhJTkdTZWVrZXIgOiBwdWJsaWMgTVAzU2Vla2VyIHsKICAgICBzdGF0aWMgc3A8WElOR1NlZWtlcj4gQ3JlYXRlRnJvbVNvdXJjZSgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvYXZjX3V0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL2F2Y191dGlscy5oCmluZGV4IGMyNzBiYzEuLmRhZmEwN2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvYXZjX3V0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9hdmNfdXRpbHMuaApAQCAtMzYsNiArMzYsMTEgQEAKICAgICBrQVZDUHJvZmlsZUNBVkxDNDQ0SW50cmEgPSAweDJjCiB9OwogCitzdHJ1Y3QgTkFMUG9zaXRpb24geworICAgIHNpemVfdCBuYWxPZmZzZXQ7CisgICAgc2l6ZV90IG5hbFNpemU7Cit9OworCiAvLyBPcHRpb25hbGx5IHJldHVybnMgc2FtcGxlIGFzcGVjdCByYXRpbyBhcyB3ZWxsLgogdm9pZCBGaW5kQVZDRGltZW5zaW9ucygKICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJnNlcVBhcmFtU2V0LApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL0FuZHJvaWQubWsKaW5kZXggNDQ2ZmY4Yy4uMWU4YzJiMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9BbmRyb2lkLm1rCkBAIC04LDcgKzgsOCBAQAogICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvbGlidnB4L2xpYndlYm0gXAogICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKIAotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCiAKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X21hdHJvc2thCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmNwcAppbmRleCBjMzBlODA3Li5lY2MyNTczIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuY3BwCkBAIC05NDQsNiArOTQ0LDExIEBACiAgICAgICAgIEFMT0dWKCJjb2RlYyBpZCA9ICVzIiwgY29kZWNJRCk7CiAgICAgICAgIEFMT0dWKCJjb2RlYyBuYW1lID0gJXMiLCB0cmFjay0+R2V0Q29kZWNOYW1lQXNVVEY4KCkpOwogCisgICAgICAgIGlmIChjb2RlY0lEID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dXKCJ1bmtub3duIGNvZGVjSUQgaXMgbm90IHN1cHBvcnRlZC4iKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKICAgICAgICAgc2l6ZV90IGNvZGVjUHJpdmF0ZVNpemU7CiAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvZGVjUHJpdmF0ZSA9CiAgICAgICAgICAgICB0cmFjay0+R2V0Q29kZWNQcml2YXRlKGNvZGVjUHJpdmF0ZVNpemUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCmluZGV4IDFlYWU2Y2YuLmUzYzNlODAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL0lTdHJlYW1Tb3VyY2UuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KIApAQCAtNDcsMTUgKzQ4LDE5IEBACiBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUU1BhY2tldFNpemUgPSAxODg7CiAKIHN0cnVjdCBBVFNQYXJzZXI6OlByb2dyYW0gOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgUHJvZ3JhbShBVFNQYXJzZXIgKnBhcnNlciwgdW5zaWduZWQgcHJvZ3JhbU51bWJlciwgdW5zaWduZWQgcHJvZ3JhbU1hcFBJRCk7CisgICAgUHJvZ3JhbShBVFNQYXJzZXIgKnBhcnNlciwgdW5zaWduZWQgcHJvZ3JhbU51bWJlciwgdW5zaWduZWQgcHJvZ3JhbU1hcFBJRCwKKyAgICAgICAgICAgIGludDY0X3QgbGFzdFJlY292ZXJlZFBUUyk7CiAKICAgICBib29sIHBhcnNlUFNJU2VjdGlvbigKICAgICAgICAgICAgIHVuc2lnbmVkIHBpZCwgQUJpdFJlYWRlciAqYnIsIHN0YXR1c190ICplcnIpOwogCisgICAgLy8gUGFzcyB0byBhcHByb3ByaWF0ZSBzdHJlYW0gYWNjb3JkaW5nIHRvIHBpZCwgYW5kIHNldCBldmVudCBpZiBpdCdzIGEgUEVTCisgICAgLy8gd2l0aCBhIHN5bmMgZnJhbWUuCisgICAgLy8gTm90ZSB0aGF0IHRoZSBtZXRob2QgaXRzZWxmIGRvZXMgbm90IHRvdWNoIGV2ZW50LgogICAgIGJvb2wgcGFyc2VQSUQoCiAgICAgICAgICAgICB1bnNpZ25lZCBwaWQsIHVuc2lnbmVkIGNvbnRpbnVpdHlfY291bnRlciwKICAgICAgICAgICAgIHVuc2lnbmVkIHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IsCi0gICAgICAgICAgICBBQml0UmVhZGVyICpiciwgc3RhdHVzX3QgKmVycik7CisgICAgICAgICAgICBBQml0UmVhZGVyICpiciwgc3RhdHVzX3QgKmVyciwgU3luY0V2ZW50ICpldmVudCk7CiAKICAgICB2b2lkIHNpZ25hbERpc2NvbnRpbnVpdHkoCiAgICAgICAgICAgICBEaXNjb250aW51aXR5VHlwZSB0eXBlLCBjb25zdCBzcDxBTWVzc2FnZT4gJmV4dHJhKTsKQEAgLTg2LDE0ICs5MSwyMiBAQAogICAgIH0KIAogcHJpdmF0ZToKKyAgICBzdHJ1Y3QgU3RyZWFtSW5mbyB7CisgICAgICAgIHVuc2lnbmVkIG1UeXBlOworICAgICAgICB1bnNpZ25lZCBtUElEOworICAgIH07CisKICAgICBBVFNQYXJzZXIgKm1QYXJzZXI7CiAgICAgdW5zaWduZWQgbVByb2dyYW1OdW1iZXI7CiAgICAgdW5zaWduZWQgbVByb2dyYW1NYXBQSUQ7CiAgICAgS2V5ZWRWZWN0b3I8dW5zaWduZWQsIHNwPFN0cmVhbT4gPiBtU3RyZWFtczsKICAgICBib29sIG1GaXJzdFBUU1ZhbGlkOwogICAgIHVpbnQ2NF90IG1GaXJzdFBUUzsKKyAgICBpbnQ2NF90IG1MYXN0UmVjb3ZlcmVkUFRTOwogCiAgICAgc3RhdHVzX3QgcGFyc2VQcm9ncmFtTWFwKEFCaXRSZWFkZXIgKmJyKTsKKyAgICBpbnQ2NF90IHJlY292ZXJQVFModWludDY0X3QgUFRTXzMzYml0KTsKKyAgICBib29sIHN3aXRjaFBJRHMoY29uc3QgVmVjdG9yPFN0cmVhbUluZm8+ICZpbmZvcyk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQcm9ncmFtKTsKIH07CkBAIC0xMDgsMTAgKzEyMSwxNCBAQAogICAgIHVuc2lnbmVkIHBpZCgpIGNvbnN0IHsgcmV0dXJuIG1FbGVtZW50YXJ5UElEOyB9CiAgICAgdm9pZCBzZXRQSUQodW5zaWduZWQgcGlkKSB7IG1FbGVtZW50YXJ5UElEID0gcGlkOyB9CiAKKyAgICAvLyBQYXJzZSB0aGUgcGF5bG9hZCBhbmQgc2V0IGV2ZW50IHdoZW4gUEVTIHdpdGggYSBzeW5jIGZyYW1lIGlzIGRldGVjdGVkLgorICAgIC8vIFRoaXMgbWV0aG9kIGtub3dzIHdoZW4gYSBQRVMgc3RhcnRzOyBzbyByZWNvcmQgbVBlc1N0YXJ0T2Zmc2V0IGluIHRoYXQKKyAgICAvLyBjYXNlLgogICAgIHN0YXR1c190IHBhcnNlKAogICAgICAgICAgICAgdW5zaWduZWQgY29udGludWl0eV9jb3VudGVyLAogICAgICAgICAgICAgdW5zaWduZWQgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciwKLSAgICAgICAgICAgIEFCaXRSZWFkZXIgKmJyKTsKKyAgICAgICAgICAgIEFCaXRSZWFkZXIgKmJyLAorICAgICAgICAgICAgU3luY0V2ZW50ICpldmVudCk7CiAKICAgICB2b2lkIHNpZ25hbERpc2NvbnRpbnVpdHkoCiAgICAgICAgICAgICBEaXNjb250aW51aXR5VHlwZSB0eXBlLCBjb25zdCBzcDxBTWVzc2FnZT4gJmV4dHJhKTsKQEAgLTEyMiw2ICsxMzksNyBAQAogCiAgICAgYm9vbCBpc0F1ZGlvKCkgY29uc3Q7CiAgICAgYm9vbCBpc1ZpZGVvKCkgY29uc3Q7CisgICAgYm9vbCBpc01ldGEoKSBjb25zdDsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgflN0cmVhbSgpOwpAQCAtMTM5LDE3ICsxNTcsMjQgQEAKICAgICBib29sIG1FT1NSZWFjaGVkOwogCiAgICAgdWludDY0X3QgbVByZXZQVFM7CisgICAgb2ZmNjRfdCBtUGVzU3RhcnRPZmZzZXQ7CiAKICAgICBFbGVtZW50YXJ5U3RyZWFtUXVldWUgKm1RdWV1ZTsKIAotICAgIHN0YXR1c190IGZsdXNoKCk7Ci0gICAgc3RhdHVzX3QgcGFyc2VQRVMoQUJpdFJlYWRlciAqYnIpOworICAgIC8vIEZsdXNoIGFjY3VtdWxhdGVkIHBheWxvYWQgaWYgbmVjZXNzYXJ5IC0tLSBpLmUuIGF0IEVPUyBvciBhdCB0aGUgc3RhcnQgb2YKKyAgICAvLyBhbm90aGVyIHBheWxvYWQuIGV2ZW50IGlzIHNldCBpZiB0aGUgZmx1c2hlZCBwYXlsb2FkIGlzIFBFUyB3aXRoIGEgc3luYworICAgIC8vIGZyYW1lLgorICAgIHN0YXR1c190IGZsdXNoKFN5bmNFdmVudCAqZXZlbnQpOworICAgIC8vIFN0cmlwIGFuZCBwYXJzZSBQRVMgaGVhZGVycyBhbmQgcGFzcyByZW1haW5pbmcgcGF5bG9hZCBpbnRvIG9uUGF5bG9hZAorICAgIC8vIHdpdGggcGFyc2VkIG1ldGFkYXRhLiBldmVudCBpcyBzZXQgaWYgdGhlIFBFUyBjb250YWlucyBhIHN5bmMgZnJhbWUuCisgICAgc3RhdHVzX3QgcGFyc2VQRVMoQUJpdFJlYWRlciAqYnIsIFN5bmNFdmVudCAqZXZlbnQpOwogCisgICAgLy8gRmVlZCB0aGUgcGF5bG9hZCBpbnRvIG1RdWV1ZSBhbmQgaWYgYSBwYWNrZXQgaXMgaWRlbnRpZmllZCwgcXVldWUgaXQKKyAgICAvLyBpbnRvIG1Tb3VyY2UuIElmIHRoZSBwYWNrZXQgaXMgYSBzeW5jIGZyYW1lLiBzZXQgZXZlbnQgd2l0aCBzdGFydCBvZmZzZXQKKyAgICAvLyBhbmQgdGltZXN0YW1wIG9mIHRoZSBwYWNrZXQuCiAgICAgdm9pZCBvblBheWxvYWREYXRhKAogICAgICAgICAgICAgdW5zaWduZWQgUFRTX0RUU19mbGFncywgdWludDY0X3QgUFRTLCB1aW50NjRfdCBEVFMsCi0gICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2b2lkIGV4dHJhY3RBQUNGcmFtZXMoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSwgU3luY0V2ZW50ICpldmVudCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTdHJlYW0pOwogfTsKQEAgLTE1OCwxMCArMTgzLDEyIEBACiAgICAgUFNJU2VjdGlvbigpOwogCiAgICAgc3RhdHVzX3QgYXBwZW5kKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2b2lkIHNldFNraXBCeXRlcyh1aW50OF90IHNraXApOwogICAgIHZvaWQgY2xlYXIoKTsKIAogICAgIGJvb2wgaXNDb21wbGV0ZSgpIGNvbnN0OwogICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0OworICAgIGJvb2wgaXNDUkNPa2F5KCkgY29uc3Q7CiAKICAgICBjb25zdCB1aW50OF90ICpkYXRhKCkgY29uc3Q7CiAgICAgc2l6ZV90IHNpemUoKSBjb25zdDsKQEAgLTE3MSwxOSArMTk4LDM0IEBACiAKIHByaXZhdGU6CiAgICAgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKKyAgICB1aW50OF90IG1Ta2lwQnl0ZXM7CisgICAgc3RhdGljIHVpbnQzMl90IENSQ19UQUJMRVtdOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUFNJU2VjdGlvbik7CiB9OwogCitBVFNQYXJzZXI6OlN5bmNFdmVudDo6U3luY0V2ZW50KG9mZjY0X3Qgb2Zmc2V0KQorICAgIDogbUluaXQoZmFsc2UpLCBtT2Zmc2V0KG9mZnNldCksIG1UaW1lVXMoMCkge30KKwordm9pZCBBVFNQYXJzZXI6OlN5bmNFdmVudDo6aW5pdChvZmY2NF90IG9mZnNldCwgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgIGludDY0X3QgdGltZVVzKSB7CisgICAgbUluaXQgPSB0cnVlOworICAgIG1PZmZzZXQgPSBvZmZzZXQ7CisgICAgbU1lZGlhU291cmNlID0gc291cmNlOworICAgIG1UaW1lVXMgPSB0aW1lVXM7Cit9CisKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIEFUU1BhcnNlcjo6UHJvZ3JhbTo6UHJvZ3JhbSgKLSAgICAgICAgQVRTUGFyc2VyICpwYXJzZXIsIHVuc2lnbmVkIHByb2dyYW1OdW1iZXIsIHVuc2lnbmVkIHByb2dyYW1NYXBQSUQpCisgICAgICAgIEFUU1BhcnNlciAqcGFyc2VyLCB1bnNpZ25lZCBwcm9ncmFtTnVtYmVyLCB1bnNpZ25lZCBwcm9ncmFtTWFwUElELAorICAgICAgICBpbnQ2NF90IGxhc3RSZWNvdmVyZWRQVFMpCiAgICAgOiBtUGFyc2VyKHBhcnNlciksCiAgICAgICBtUHJvZ3JhbU51bWJlcihwcm9ncmFtTnVtYmVyKSwKICAgICAgIG1Qcm9ncmFtTWFwUElEKHByb2dyYW1NYXBQSUQpLAogICAgICAgbUZpcnN0UFRTVmFsaWQoZmFsc2UpLAotICAgICAgbUZpcnN0UFRTKDApIHsKKyAgICAgIG1GaXJzdFBUUygwKSwKKyAgICAgIG1MYXN0UmVjb3ZlcmVkUFRTKGxhc3RSZWNvdmVyZWRQVFMpIHsKICAgICBBTE9HVigibmV3IHByb2dyYW0gbnVtYmVyICV1IiwgcHJvZ3JhbU51bWJlcik7CiB9CiAKQEAgLTIwMyw3ICsyNDUsNyBAQAogYm9vbCBBVFNQYXJzZXI6OlByb2dyYW06OnBhcnNlUElEKAogICAgICAgICB1bnNpZ25lZCBwaWQsIHVuc2lnbmVkIGNvbnRpbnVpdHlfY291bnRlciwKICAgICAgICAgdW5zaWduZWQgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciwKLSAgICAgICAgQUJpdFJlYWRlciAqYnIsIHN0YXR1c190ICplcnIpIHsKKyAgICAgICAgQUJpdFJlYWRlciAqYnIsIHN0YXR1c190ICplcnIsIFN5bmNFdmVudCAqZXZlbnQpIHsKICAgICAqZXJyID0gT0s7CiAKICAgICBzc2l6ZV90IGluZGV4ID0gbVN0cmVhbXMuaW5kZXhPZktleShwaWQpOwpAQCAtMjEyLDcgKzI1NCw3IEBACiAgICAgfQogCiAgICAgKmVyciA9IG1TdHJlYW1zLmVkaXRWYWx1ZUF0KGluZGV4KS0+cGFyc2UoCi0gICAgICAgICAgICBjb250aW51aXR5X2NvdW50ZXIsIHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IsIGJyKTsKKyAgICAgICAgICAgIGNvbnRpbnVpdHlfY291bnRlciwgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciwgYnIsIGV2ZW50KTsKIAogICAgIHJldHVybiB0cnVlOwogfQpAQCAtMjM4LDEwICsyODAsNzUgQEAKICAgICB9CiB9CiAKLXN0cnVjdCBTdHJlYW1JbmZvIHsKLSAgICB1bnNpZ25lZCBtVHlwZTsKLSAgICB1bnNpZ25lZCBtUElEOwotfTsKK2Jvb2wgQVRTUGFyc2VyOjpQcm9ncmFtOjpzd2l0Y2hQSURzKGNvbnN0IFZlY3RvcjxTdHJlYW1JbmZvPiAmaW5mb3MpIHsKKyAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKworICAgIGlmIChtU3RyZWFtcy5zaXplKCkgPT0gaW5mb3Muc2l6ZSgpKSB7CisgICAgICAgIC8vIGJ1aWxkIHR5cGUtPlBJRHMgbWFwIGZvciBvbGQgYW5kIG5ldyBtYXBwaW5nCisgICAgICAgIHNpemVfdCBpOworICAgICAgICBLZXllZFZlY3RvcjxpbnQzMl90LCBWZWN0b3I8aW50MzJfdD4gPiBvbGRUeXBlMlBJRHMsIG5ld1R5cGUyUElEczsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1TdHJlYW1zLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gb2xkVHlwZTJQSURzLmluZGV4T2ZLZXkobVN0cmVhbXNbaV0tPnR5cGUoKSk7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgb2xkVHlwZTJQSURzLmFkZChtU3RyZWFtc1tpXS0+dHlwZSgpLCBWZWN0b3I8aW50MzJfdD4oKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvbGRUeXBlMlBJRHMuZWRpdFZhbHVlRm9yKG1TdHJlYW1zW2ldLT50eXBlKCkpLnB1c2hfYmFjayhtU3RyZWFtc1tpXS0+cGlkKCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmZvcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG5ld1R5cGUyUElEcy5pbmRleE9mS2V5KGluZm9zW2ldLm1UeXBlKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICBuZXdUeXBlMlBJRHMuYWRkKGluZm9zW2ldLm1UeXBlLCBWZWN0b3I8aW50MzJfdD4oKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXdUeXBlMlBJRHMuZWRpdFZhbHVlRm9yKGluZm9zW2ldLm1UeXBlKS5wdXNoX2JhY2soaW5mb3NbaV0ubVBJRCk7CisgICAgICAgIH0KKworICAgICAgICAvLyB3ZSBjYW4gcmVjb3ZlciBpZiB0aGUgbnVtYmVyIG9mIHN0cmVhbXMgZm9yIGVhY2ggdHlwZSBoYXNuJ3QgY2hhbmdlZAorICAgICAgICBpZiAob2xkVHlwZTJQSURzLnNpemUoKSA9PSBuZXdUeXBlMlBJRHMuc2l6ZSgpKSB7CisgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvbGRUeXBlMlBJRHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAvLyBLZXllZFZlY3RvciBpcyBzb3J0ZWQsIHdlIGp1c3QgY29tcGFyZSBrZXkgYW5kIHNpemUgb2YgZWFjaCBpbmRleAorICAgICAgICAgICAgICAgIGlmIChvbGRUeXBlMlBJRHMua2V5QXQoaSkgIT0gbmV3VHlwZTJQSURzLmtleUF0KGkpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBvbGRUeXBlMlBJRHNbaV0uc2l6ZSgpICE9IG5ld1R5cGUyUElEc1tpXS5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAvLyBzYXZlIGN1cnJlbnQgc3RyZWFtcyB0byB0ZW1wCisgICAgICAgICAgICBLZXllZFZlY3RvcjxpbnQzMl90LCBzcDxTdHJlYW0+ID4gdGVtcDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtU3RyZWFtcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgICB0ZW1wLmFkZChtU3RyZWFtcy5rZXlBdChpKSwgbVN0cmVhbXMuZWRpdFZhbHVlQXQoaSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtU3RyZWFtcy5jbGVhcigpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRlbXAuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgdHdvIGNoZWNrcyBiZWxvdyBzaG91bGRuJ3QgaGFwcGVuLAorICAgICAgICAgICAgICAgIC8vIHdlIGFscmVhZHkgY2hlY2tlZCBhYm92ZSB0aGUgc3RyZWFtIGNvdW50IG1hdGNoZXMKKyAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbmV3VHlwZTJQSURzLmluZGV4T2ZLZXkodGVtcFtpXS0+dHlwZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgVmVjdG9yPGludDMyX3Q+ICZuZXdQSURzID0gbmV3VHlwZTJQSURzLmVkaXRWYWx1ZUF0KGluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAobmV3UElEcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbmV4dCBQSUQgZm9yIHRlbXBbaV0tPnR5cGUoKSBpbiB0aGUgbmV3IFBJRCBtYXAKKyAgICAgICAgICAgICAgICBWZWN0b3I8aW50MzJfdD46Oml0ZXJhdG9yIGl0ID0gbmV3UElEcy5iZWdpbigpOworCisgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBQSUQgb2YgdGhlIHN0cmVhbSwgYW5kIGFkZCBpdCBiYWNrCisgICAgICAgICAgICAgICAgdGVtcC5lZGl0VmFsdWVBdChpKS0+c2V0UElEKCppdCk7CisgICAgICAgICAgICAgICAgbVN0cmVhbXMuYWRkKHRlbXBbaV0tPnBpZCgpLCB0ZW1wLmVkaXRWYWx1ZUF0KGkpKTsKKworICAgICAgICAgICAgICAgIC8vIHJlbW92ZWQgdGhlIHVzZWQgUElECisgICAgICAgICAgICAgICAgbmV3UElEcy5lcmFzZShpdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CiAKIHN0YXR1c190IEFUU1BhcnNlcjo6UHJvZ3JhbTo6cGFyc2VQcm9ncmFtTWFwKEFCaXRSZWFkZXIgKmJyKSB7CiAgICAgdW5zaWduZWQgdGFibGVfaWQgPSBici0+Z2V0Qml0cyg4KTsKQEAgLTI1NywxMyArMzY0LDExIEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCi0gICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDB1KTsKKyAgICBici0+c2tpcEJpdHMoMSk7ICAvLyAnMCcKICAgICBNWV9MT0dWKCIgIHJlc2VydmVkID0gJXUiLCBici0+Z2V0Qml0cygyKSk7CiAKICAgICB1bnNpZ25lZCBzZWN0aW9uX2xlbmd0aCA9IGJyLT5nZXRCaXRzKDEyKTsKICAgICBBTE9HVigiICBzZWN0aW9uX2xlbmd0aCA9ICV1Iiwgc2VjdGlvbl9sZW5ndGgpOwotICAgIENIRUNLX0VRKHNlY3Rpb25fbGVuZ3RoICYgMHhjMDAsIDB1KTsKLSAgICBDSEVDS19MRShzZWN0aW9uX2xlbmd0aCwgMTAyMXUpOwogCiAgICAgTVlfTE9HVigiICBwcm9ncmFtX251bWJlciA9ICV1IiwgYnItPmdldEJpdHMoMTYpKTsKICAgICBNWV9MT0dWKCIgIHJlc2VydmVkID0gJXUiLCBici0+Z2V0Qml0cygyKSk7CkBAIC0yODAsNyArMzg1LDYgQEAKIAogICAgIHVuc2lnbmVkIHByb2dyYW1faW5mb19sZW5ndGggPSBici0+Z2V0Qml0cygxMik7CiAgICAgQUxPR1YoIiAgcHJvZ3JhbV9pbmZvX2xlbmd0aCA9ICV1IiwgcHJvZ3JhbV9pbmZvX2xlbmd0aCk7Ci0gICAgQ0hFQ0tfRVEocHJvZ3JhbV9pbmZvX2xlbmd0aCAmIDB4YzAwLCAwdSk7CiAKICAgICBici0+c2tpcEJpdHMocHJvZ3JhbV9pbmZvX2xlbmd0aCAqIDgpOyAgLy8gc2tpcCBkZXNjcmlwdG9ycwogCkBAIC0yOTEsOCArMzk1LDcgQEAKICAgICAvLyBmaW5hbCBDUkMuCiAgICAgc2l6ZV90IGluZm9CeXRlc1JlbWFpbmluZyA9IHNlY3Rpb25fbGVuZ3RoIC0gOSAtIHByb2dyYW1faW5mb19sZW5ndGggLSA0OwogCi0gICAgd2hpbGUgKGluZm9CeXRlc1JlbWFpbmluZyA+IDApIHsKLSAgICAgICAgQ0hFQ0tfR0UoaW5mb0J5dGVzUmVtYWluaW5nLCA1dSk7CisgICAgd2hpbGUgKGluZm9CeXRlc1JlbWFpbmluZyA+PSA1KSB7CiAKICAgICAgICAgdW5zaWduZWQgc3RyZWFtVHlwZSA9IGJyLT5nZXRCaXRzKDgpOwogICAgICAgICBBTE9HVigiICAgIHN0cmVhbV90eXBlID0gMHglMDJ4Iiwgc3RyZWFtVHlwZSk7CkBAIC0zMDYsOSArNDA5LDYgQEAKIAogICAgICAgICB1bnNpZ25lZCBFU19pbmZvX2xlbmd0aCA9IGJyLT5nZXRCaXRzKDEyKTsKICAgICAgICAgQUxPR1YoIiAgICBFU19pbmZvX2xlbmd0aCA9ICV1IiwgRVNfaW5mb19sZW5ndGgpOwotICAgICAgICBDSEVDS19FUShFU19pbmZvX2xlbmd0aCAmIDB4YzAwLCAwdSk7Ci0KLSAgICAgICAgQ0hFQ0tfR0UoaW5mb0J5dGVzUmVtYWluaW5nIC0gNSwgRVNfaW5mb19sZW5ndGgpOwogCiAjaWYgMAogICAgICAgICBici0+c2tpcEJpdHMoRVNfaW5mb19sZW5ndGggKiA4KTsgIC8vIHNraXAgZGVzY3JpcHRvcnMKQEAgLTMyMCwxMyArNDIwLDEzIEBACiAgICAgICAgICAgICB1bnNpZ25lZCBkZXNjTGVuZ3RoID0gYnItPmdldEJpdHMoOCk7CiAgICAgICAgICAgICBBTE9HVigiICAgICAgbGVuID0gJXUiLCBkZXNjTGVuZ3RoKTsKIAotICAgICAgICAgICAgQ0hFQ0tfR0UoaW5mb19ieXRlc19yZW1haW5pbmcsIDIgKyBkZXNjTGVuZ3RoKTsKLQorICAgICAgICAgICAgaWYgKGluZm9fYnl0ZXNfcmVtYWluaW5nIDwgZGVzY0xlbmd0aCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBici0+c2tpcEJpdHMoZGVzY0xlbmd0aCAqIDgpOwogCiAgICAgICAgICAgICBpbmZvX2J5dGVzX3JlbWFpbmluZyAtPSBkZXNjTGVuZ3RoICsgMjsKICAgICAgICAgfQotICAgICAgICBDSEVDS19FUShpbmZvX2J5dGVzX3JlbWFpbmluZywgMHUpOwogI2VuZGlmCiAKICAgICAgICAgU3RyZWFtSW5mbyBpbmZvOwpAQCAtMzM3LDcgKzQzNyw5IEBACiAgICAgICAgIGluZm9CeXRlc1JlbWFpbmluZyAtPSA1ICsgRVNfaW5mb19sZW5ndGg7CiAgICAgfQogCi0gICAgQ0hFQ0tfRVEoaW5mb0J5dGVzUmVtYWluaW5nLCAwdSk7CisgICAgaWYgKGluZm9CeXRlc1JlbWFpbmluZyAhPSAwKSB7CisgICAgICAgIEFMT0dXKCJTZWN0aW9uIGRhdGEgcmVtYWlucyB1bmNvbnN1bWVkIik7CisgICAgfQogICAgIE1ZX0xPR1YoIiAgQ1JDID0gMHglMDh4IiwgYnItPmdldEJpdHMoMzIpKTsKIAogICAgIGJvb2wgUElEc0NoYW5nZWQgPSBmYWxzZTsKQEAgLTM3MCwzOSArNDcyLDggQEAKICAgICAgICAgfQogI2VuZGlmCiAKLSAgICAgICAgLy8gVGhlIG9ubHkgY2FzZSB3ZSBjYW4gcmVjb3ZlciBmcm9tIGlzIGlmIHdlIGhhdmUgdHdvIHN0cmVhbXMKLSAgICAgICAgLy8gYW5kIHRoZXkgc3dpdGNoZWQgUElEcy4KLQotICAgICAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKLQotICAgICAgICBpZiAobVN0cmVhbXMuc2l6ZSgpID09IDIgJiYgaW5mb3Muc2l6ZSgpID09IDIpIHsKLSAgICAgICAgICAgIGNvbnN0IFN0cmVhbUluZm8gJmluZm8xID0gaW5mb3MuaXRlbUF0KDApOwotICAgICAgICAgICAgY29uc3QgU3RyZWFtSW5mbyAmaW5mbzIgPSBpbmZvcy5pdGVtQXQoMSk7Ci0KLSAgICAgICAgICAgIHNwPFN0cmVhbT4gczEgPSBtU3RyZWFtcy5lZGl0VmFsdWVBdCgwKTsKLSAgICAgICAgICAgIHNwPFN0cmVhbT4gczIgPSBtU3RyZWFtcy5lZGl0VmFsdWVBdCgxKTsKLQotICAgICAgICAgICAgYm9vbCBjYXNlQSA9Ci0gICAgICAgICAgICAgICAgaW5mbzEubVBJRCA9PSBzMS0+cGlkKCkgJiYgaW5mbzEubVR5cGUgPT0gczItPnR5cGUoKQotICAgICAgICAgICAgICAgICAgICAmJiBpbmZvMi5tUElEID09IHMyLT5waWQoKSAmJiBpbmZvMi5tVHlwZSA9PSBzMS0+dHlwZSgpOwotCi0gICAgICAgICAgICBib29sIGNhc2VCID0KLSAgICAgICAgICAgICAgICBpbmZvMS5tUElEID09IHMyLT5waWQoKSAmJiBpbmZvMS5tVHlwZSA9PSBzMS0+dHlwZSgpCi0gICAgICAgICAgICAgICAgICAgICYmIGluZm8yLm1QSUQgPT0gczEtPnBpZCgpICYmIGluZm8yLm1UeXBlID09IHMyLT50eXBlKCk7Ci0KLSAgICAgICAgICAgIGlmIChjYXNlQSB8fCBjYXNlQikgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIHBpZDEgPSBzMS0+cGlkKCk7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgcGlkMiA9IHMyLT5waWQoKTsKLSAgICAgICAgICAgICAgICBzMS0+c2V0UElEKHBpZDIpOwotICAgICAgICAgICAgICAgIHMyLT5zZXRQSUQocGlkMSk7Ci0KLSAgICAgICAgICAgICAgICBtU3RyZWFtcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIG1TdHJlYW1zLmFkZChzMS0+cGlkKCksIHMxKTsKLSAgICAgICAgICAgICAgICBtU3RyZWFtcy5hZGQoczItPnBpZCgpLCBzMik7Ci0KLSAgICAgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICAvLyB3ZSBjYW4gcmVjb3ZlciBpZiBudW1iZXIgb2Ygc3RyZWFtcyBmb3IgZWFjaCB0eXBlIHJlbWFpbiB0aGUgc2FtZQorICAgICAgICBib29sIHN1Y2Nlc3MgPSBzd2l0Y2hQSURzKGluZm9zKTsKIAogICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKICAgICAgICAgICAgIEFMT0dJKCJTdHJlYW0gUElEcyBjaGFuZ2VkIGFuZCB3ZSBjYW5ub3QgcmVjb3Zlci4iKTsKQEAgLTQyNiw2ICs0OTcsMzIgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK2ludDY0X3QgQVRTUGFyc2VyOjpQcm9ncmFtOjpyZWNvdmVyUFRTKHVpbnQ2NF90IFBUU18zM2JpdCkgeworICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgbG93ZXIgMzMtYml0IG9mIHRoZSBQVFMuIEl0IGNvdWxkIG92ZXJmbG93IHdpdGhpbiBhCisgICAgLy8gcmVhc29uYWJsZSBhbW91bnQgb2YgdGltZS4gVG8gaGFuZGxlIHRoZSB3cmFwLWFyb3VuZCwgdXNlIGZhbmN5IG1hdGgKKyAgICAvLyB0byBnZXQgYW4gZXh0ZW5kZWQgUFRTIHRoYXQgaXMgd2l0aGluIFstMHhmZmZmZmZmZiwgMHhmZmZmZmZmZl0KKyAgICAvLyBvZiB0aGUgbGF0ZXN0IHJlY292ZXJlZCBQVFMuCisgICAgaWYgKG1MYXN0UmVjb3ZlcmVkUFRTIDwgMGxsKSB7CisgICAgICAgIC8vIFVzZSB0aGUgb3JpZ2luYWwgMzNiaXQgbnVtYmVyIGZvciAxc3QgZnJhbWUsIHRoZSByZWFzb24gaXMgdGhhdAorICAgICAgICAvLyBpZiAxc3QgZnJhbWUgd3JhcHMgdG8gbmVnYXRpdmUgdGhhdCdzIGZhciBhd2F5IGZyb20gMCwgd2UgY291bGQKKyAgICAgICAgLy8gbmV2ZXIgc3RhcnQuIE9ubHkgc3RhcnQgd3JhcHBpbmcgYXJvdW5kIGZyb20gMm5kIGZyYW1lLgorICAgICAgICBtTGFzdFJlY292ZXJlZFBUUyA9IHN0YXRpY19jYXN0PGludDY0X3Q+KFBUU18zM2JpdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUxhc3RSZWNvdmVyZWRQVFMgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PigKKyAgICAgICAgICAgICAgICAoKG1MYXN0UmVjb3ZlcmVkUFRTIC0gUFRTXzMzYml0ICsgMHgxMDAwMDAwMDBsbCkKKyAgICAgICAgICAgICAgICAmIDB4ZmZmZmZmZmUwMDAwMDAwMHVsbCkgfCBQVFNfMzNiaXQpOworICAgICAgICAvLyBXZSBzdGFydCBmcm9tIDAsIGJ1dCByZWNvdmVyZWQgUFRTIGNvdWxkIGJlIHNsaWdodGx5IGJlbG93IDAuCisgICAgICAgIC8vIENsYW1wIGl0IHRvIDAgYXMgcmVzdCBvZiB0aGUgcGlwZWxpbmUgZG9lc24ndCB0YWtlIG5lZ2F0aXZlIHB0cy4KKyAgICAgICAgLy8gKGVnLiB2aWRlbyBpcyByZWFkIGZpcnN0IGFuZCBzdGFydHMgYXQgMCwgYnV0IGF1ZGlvIHN0YXJ0cyBhdCAweGZmZmZmZmYwKQorICAgICAgICBpZiAobUxhc3RSZWNvdmVyZWRQVFMgPCAwbGwpIHsKKyAgICAgICAgICAgIEFMT0dJKCJDbGFtcGluZyBuZWdhdGl2ZSByZWNvdmVyZWQgUFRTICglIiBQUklkNjQgIikgdG8gMCIsIG1MYXN0UmVjb3ZlcmVkUFRTKTsKKyAgICAgICAgICAgIG1MYXN0UmVjb3ZlcmVkUFRTID0gMGxsOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1MYXN0UmVjb3ZlcmVkUFRTOworfQorCiBzcDxNZWRpYVNvdXJjZT4gQVRTUGFyc2VyOjpQcm9ncmFtOjpnZXRTb3VyY2UoU291cmNlVHlwZSB0eXBlKSB7CiAgICAgc2l6ZV90IGluZGV4ID0gKHR5cGUgPT0gQVVESU8pID8gMCA6IDA7CiAKQEAgLTQ1Niw2ICs1NTMsOCBAQAogfQogCiBpbnQ2NF90IEFUU1BhcnNlcjo6UHJvZ3JhbTo6Y29udmVydFBUU1RvVGltZXN0YW1wKHVpbnQ2NF90IFBUUykgeworICAgIFBUUyA9IHJlY292ZXJQVFMoUFRTKTsKKwogICAgIGlmICghKG1QYXJzZXItPm1GbGFncyAmIFRTX1RJTUVTVEFNUFNfQVJFX0FCU09MVVRFKSkgewogICAgICAgICBpZiAoIW1GaXJzdFBUU1ZhbGlkKSB7CiAgICAgICAgICAgICBtRmlyc3RQVFNWYWxpZCA9IHRydWU7CkBAIC01MzAsNiArNjI5LDExIEBACiAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6QUMzKTsKICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9NRVRBREFUQToKKyAgICAgICAgICAgIG1RdWV1ZSA9IG5ldyBFbGVtZW50YXJ5U3RyZWFtUXVldWUoCisgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6TUVUQURBVEEpOworICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTU0OSw3ICs2NTMsOCBAQAogCiBzdGF0dXNfdCBBVFNQYXJzZXI6OlN0cmVhbTo6cGFyc2UoCiAgICAgICAgIHVuc2lnbmVkIGNvbnRpbnVpdHlfY291bnRlciwKLSAgICAgICAgdW5zaWduZWQgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciwgQUJpdFJlYWRlciAqYnIpIHsKKyAgICAgICAgdW5zaWduZWQgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciwgQUJpdFJlYWRlciAqYnIsCisgICAgICAgIFN5bmNFdmVudCAqZXZlbnQpIHsKICAgICBpZiAobVF1ZXVlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KQEAgLTU4MCwxOSArNjg1LDIyIEBACiAgICAgbUV4cGVjdGVkQ29udGludWl0eUNvdW50ZXIgPSAoY29udGludWl0eV9jb3VudGVyICsgMSkgJiAweDBmOwogCiAgICAgaWYgKHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IpIHsKKyAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSAoZXZlbnQgIT0gTlVMTCkgPyBldmVudC0+Z2V0T2Zmc2V0KCkgOiAwOwogICAgICAgICBpZiAobVBheWxvYWRTdGFydGVkKSB7CiAgICAgICAgICAgICAvLyBPdGhlcndpc2Ugd2UgcnVuIHRoZSBkYW5nZXIgb2YgcmVjZWl2aW5nIHRoZSB0cmFpbGluZyBieXRlcwogICAgICAgICAgICAgLy8gb2YgYSBQRVMgcGFja2V0IHRoYXQgd2UgbmV2ZXIgc2F3IHRoZSBzdGFydCBvZiBhbmQgYXNzdW1pbmcKICAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBhIGNvbXBsZXRlIFBFUyBwYWNrZXQuCiAKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGZsdXNoKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBmbHVzaChldmVudCk7CiAKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIEFMT0dXKCJFcnJvciAoJTA4eCkgaGFwcGVuZWQgd2hpbGUgZmx1c2hpbmc7IHdlIHNpbXBseSBkaXNjYXJkICIKKyAgICAgICAgICAgICAgICAgICAgICAidGhlIFBFUyBwYWNrZXQgYW5kIGNvbnRpbnVlLiIsIGVycik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBtUGF5bG9hZFN0YXJ0ZWQgPSB0cnVlOworICAgICAgICBtUGVzU3RhcnRPZmZzZXQgPSBvZmZzZXQ7CiAgICAgfQogCiAgICAgaWYgKCFtUGF5bG9hZFN0YXJ0ZWQpIHsKQEAgLTYwMCw3ICs3MDgsMTAgQEAKICAgICB9CiAKICAgICBzaXplX3QgcGF5bG9hZFNpemVCaXRzID0gYnItPm51bUJpdHNMZWZ0KCk7Ci0gICAgQ0hFQ0tfRVEocGF5bG9hZFNpemVCaXRzICUgOCwgMHUpOworICAgIGlmIChwYXlsb2FkU2l6ZUJpdHMgJSA4ICE9IDB1KSB7CisgICAgICAgIEFMT0dFKCJXcm9uZyB2YWx1ZSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KIAogICAgIHNpemVfdCBuZWVkZWRTaXplID0gbUJ1ZmZlci0+c2l6ZSgpICsgcGF5bG9hZFNpemVCaXRzIC8gODsKICAgICBpZiAobUJ1ZmZlci0+Y2FwYWNpdHkoKSA8IG5lZWRlZFNpemUpIHsKQEAgLTY0OCw2ICs3NTksMTMgQEAKICAgICB9CiB9CiAKK2Jvb2wgQVRTUGFyc2VyOjpTdHJlYW06OmlzTWV0YSgpIGNvbnN0IHsKKyAgICBpZiAobVN0cmVhbVR5cGUgPT0gU1RSRUFNVFlQRV9NRVRBREFUQSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCiB2b2lkIEFUU1BhcnNlcjo6U3RyZWFtOjpzaWduYWxEaXNjb250aW51aXR5KAogICAgICAgICBEaXNjb250aW51aXR5VHlwZSB0eXBlLCBjb25zdCBzcDxBTWVzc2FnZT4gJmV4dHJhKSB7CiAgICAgbUV4cGVjdGVkQ29udGludWl0eUNvdW50ZXIgPSAtMTsKQEAgLTY1Nyw2ICs3NzUsNyBAQAogICAgIH0KIAogICAgIG1QYXlsb2FkU3RhcnRlZCA9IGZhbHNlOworICAgIG1FT1NSZWFjaGVkID0gZmFsc2U7CiAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CiAKICAgICBib29sIGNsZWFyRm9ybWF0ID0gZmFsc2U7CkBAIC02OTUsMTAgKzgxNCwxMCBAQAogICAgICAgICBtU291cmNlLT5zaWduYWxFT1MoZmluYWxSZXN1bHQpOwogICAgIH0KICAgICBtRU9TUmVhY2hlZCA9IHRydWU7Ci0gICAgZmx1c2goKTsKKyAgICBmbHVzaChOVUxMKTsKIH0KIAotc3RhdHVzX3QgQVRTUGFyc2VyOjpTdHJlYW06OnBhcnNlUEVTKEFCaXRSZWFkZXIgKmJyKSB7CitzdGF0dXNfdCBBVFNQYXJzZXI6OlN0cmVhbTo6cGFyc2VQRVMoQUJpdFJlYWRlciAqYnIsIFN5bmNFdmVudCAqZXZlbnQpIHsKICAgICB1bnNpZ25lZCBwYWNrZXRfc3RhcnRjb2RlX3ByZWZpeCA9IGJyLT5nZXRCaXRzKDI0KTsKIAogICAgIEFMT0dWKCJwYWNrZXRfc3RhcnRjb2RlX3ByZWZpeCA9IDB4JTA4eCIsIHBhY2tldF9zdGFydGNvZGVfcHJlZml4KTsKQEAgLTcxMCw4ICs4MjksNiBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIENIRUNLX0VRKHBhY2tldF9zdGFydGNvZGVfcHJlZml4LCAweDAwMDAwMXUpOwotCiAgICAgdW5zaWduZWQgc3RyZWFtX2lkID0gYnItPmdldEJpdHMoOCk7CiAgICAgQUxPR1YoInN0cmVhbV9pZCA9IDB4JTAyeCIsIHN0cmVhbV9pZCk7CiAKQEAgLTcyNiw3ICs4NDMsOSBAQAogICAgICAgICAgICAgJiYgc3RyZWFtX2lkICE9IDB4ZmYgIC8vIHByb2dyYW1fc3RyZWFtX2RpcmVjdG9yeQogICAgICAgICAgICAgJiYgc3RyZWFtX2lkICE9IDB4ZjIgIC8vIERTTUNDCiAgICAgICAgICAgICAmJiBzdHJlYW1faWQgIT0gMHhmOCkgeyAgLy8gSC4yMjIuMSB0eXBlIEUKLSAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMiksIDJ1KTsKKyAgICAgICAgaWYgKGJyLT5nZXRCaXRzKDIpICE9IDJ1KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CiAKICAgICAgICAgTVlfTE9HVigiUEVTX3NjcmFtYmxpbmdfY29udHJvbCA9ICV1IiwgYnItPmdldEJpdHMoMikpOwogICAgICAgICBNWV9MT0dWKCJQRVNfcHJpb3JpdHkgPSAldSIsIGJyLT5nZXRCaXRzKDEpKTsKQEAgLTc2MCwzNCArODc5LDUxIEBACiAgICAgICAgIHVpbnQ2NF90IFBUUyA9IDAsIERUUyA9IDA7CiAKICAgICAgICAgaWYgKFBUU19EVFNfZmxhZ3MgPT0gMiB8fCBQVFNfRFRTX2ZsYWdzID09IDMpIHsKLSAgICAgICAgICAgIENIRUNLX0dFKG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZywgNXUpOworICAgICAgICAgICAgaWYgKG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyA8IDV1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGJyLT5nZXRCaXRzKDQpICE9IFBUU19EVFNfZmxhZ3MpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiUEVTIGRhdGEgRXJyb3IhIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFBUUyA9ICgodWludDY0X3QpYnItPmdldEJpdHMoMykpIDw8IDMwOwotICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgIGlmIChici0+Z2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBQVFMgfD0gKCh1aW50NjRfdClici0+Z2V0Qml0cygxNSkpIDw8IDE1OwotICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgIGlmIChici0+Z2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBQVFMgfD0gYnItPmdldEJpdHMoMTUpOwotICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgIGlmIChici0+Z2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEFMT0dWKCJQVFMgPSAweCUwMTYiIFBSSXg2NCAiICglLjJmKSIsIFBUUywgUFRTIC8gOTAwMDAuMCk7CiAKICAgICAgICAgICAgIG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAtPSA1OwogCiAgICAgICAgICAgICBpZiAoUFRTX0RUU19mbGFncyA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfR0Uob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nLCA1dSk7CisgICAgICAgICAgICAgICAgaWYgKG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyA8IDV1KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoNCksIDF1KTsKKyAgICAgICAgICAgICAgICBpZiAoYnItPmdldEJpdHMoNCkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBEVFMgPSAoKHVpbnQ2NF90KWJyLT5nZXRCaXRzKDMpKSA8PCAzMDsKLSAgICAgICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgICAgIGlmIChici0+Z2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBEVFMgfD0gKCh1aW50NjRfdClici0+Z2V0Qml0cygxNSkpIDw8IDE1OwotICAgICAgICAgICAgICAgIENIRUNLX0VRKGJyLT5nZXRCaXRzKDEpLCAxdSk7CisgICAgICAgICAgICAgICAgaWYgKGJyLT5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIERUUyB8PSBici0+Z2V0Qml0cygxNSk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgICAgICBpZiAoYnItPmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBBTE9HVigiRFRTID0gJSIgUFJJdTY0LCBEVFMpOwogCkBAIC03OTYsMzEgKzkzMiw0NyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKEVTQ1JfZmxhZykgewotICAgICAgICAgICAgQ0hFQ0tfR0Uob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nLCA2dSk7CisgICAgICAgICAgICBpZiAob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIDwgNnUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBici0+Z2V0Qml0cygyKTsKIAogICAgICAgICAgICAgdWludDY0X3QgRVNDUiA9ICgodWludDY0X3QpYnItPmdldEJpdHMoMykpIDw8IDMwOwotICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgIGlmIChici0+Z2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBFU0NSIHw9ICgodWludDY0X3QpYnItPmdldEJpdHMoMTUpKSA8PCAxNTsKLSAgICAgICAgICAgIENIRUNLX0VRKGJyLT5nZXRCaXRzKDEpLCAxdSk7CisgICAgICAgICAgICBpZiAoYnItPmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogICAgICAgICAgICAgRVNDUiB8PSBici0+Z2V0Qml0cygxNSk7Ci0gICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgaWYgKGJyLT5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQUxPR1YoIkVTQ1IgPSAlIiBQUkl1NjQsIEVTQ1IpOwogICAgICAgICAgICAgTVlfTE9HVigiRVNDUl9leHRlbnNpb24gPSAldSIsIGJyLT5nZXRCaXRzKDkpKTsKIAotICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgIGlmIChici0+Z2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAtPSA2OwogICAgICAgICB9CiAKICAgICAgICAgaWYgKEVTX3JhdGVfZmxhZykgewotICAgICAgICAgICAgQ0hFQ0tfR0Uob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nLCAzdSk7CisgICAgICAgICAgICBpZiAob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIDwgM3UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgaWYgKGJyLT5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIE1ZX0xPR1YoIkVTX3JhdGUgPSAldSIsIGJyLT5nZXRCaXRzKDIyKSk7Ci0gICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgaWYgKGJyLT5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgb3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIC09IDM7CiAgICAgICAgIH0KQEAgLTgzMCw3ICs5ODIsOSBAQAogICAgICAgICAvLyBFUyBkYXRhIGZvbGxvd3MuCiAKICAgICAgICAgaWYgKFBFU19wYWNrZXRfbGVuZ3RoICE9IDApIHsKLSAgICAgICAgICAgIENIRUNLX0dFKFBFU19wYWNrZXRfbGVuZ3RoLCBQRVNfaGVhZGVyX2RhdGFfbGVuZ3RoICsgMyk7CisgICAgICAgICAgICBpZiAoUEVTX3BhY2tldF9sZW5ndGggPCBQRVNfaGVhZGVyX2RhdGFfbGVuZ3RoICsgMykgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHVuc2lnbmVkIGRhdGFMZW5ndGggPQogICAgICAgICAgICAgICAgIFBFU19wYWNrZXRfbGVuZ3RoIC0gMyAtIFBFU19oZWFkZXJfZGF0YV9sZW5ndGg7CkBAIC04NDMsMzUgKzk5NywzOSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIENIRUNLX0dFKGJyLT5udW1CaXRzTGVmdCgpLCBkYXRhTGVuZ3RoICogOCk7Ci0KICAgICAgICAgICAgIG9uUGF5bG9hZERhdGEoCi0gICAgICAgICAgICAgICAgICAgIFBUU19EVFNfZmxhZ3MsIFBUUywgRFRTLCBici0+ZGF0YSgpLCBkYXRhTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgUFRTX0RUU19mbGFncywgUFRTLCBEVFMsIGJyLT5kYXRhKCksIGRhdGFMZW5ndGgsIGV2ZW50KTsKIAogICAgICAgICAgICAgYnItPnNraXBCaXRzKGRhdGFMZW5ndGggKiA4KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG9uUGF5bG9hZERhdGEoCiAgICAgICAgICAgICAgICAgICAgIFBUU19EVFNfZmxhZ3MsIFBUUywgRFRTLAotICAgICAgICAgICAgICAgICAgICBici0+ZGF0YSgpLCBici0+bnVtQml0c0xlZnQoKSAvIDgpOworICAgICAgICAgICAgICAgICAgICBici0+ZGF0YSgpLCBici0+bnVtQml0c0xlZnQoKSAvIDgsIGV2ZW50KTsKIAogICAgICAgICAgICAgc2l6ZV90IHBheWxvYWRTaXplQml0cyA9IGJyLT5udW1CaXRzTGVmdCgpOwotICAgICAgICAgICAgQ0hFQ0tfRVEocGF5bG9hZFNpemVCaXRzICUgOCwgMHUpOworICAgICAgICAgICAgaWYgKHBheWxvYWRTaXplQml0cyAlIDggIT0gMHUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBBTE9HVigiVGhlcmUncyAlenUgYnl0ZXMgb2YgcGF5bG9hZC4iLCBwYXlsb2FkU2l6ZUJpdHMgLyA4KTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoc3RyZWFtX2lkID09IDB4YmUpIHsgIC8vIHBhZGRpbmdfc3RyZWFtCi0gICAgICAgIENIRUNLX05FKFBFU19wYWNrZXRfbGVuZ3RoLCAwdSk7CisgICAgICAgIGlmIChQRVNfcGFja2V0X2xlbmd0aCA9PSAwdSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQogICAgICAgICBici0+c2tpcEJpdHMoUEVTX3BhY2tldF9sZW5ndGggKiA4KTsKICAgICB9IGVsc2UgewotICAgICAgICBDSEVDS19ORShQRVNfcGFja2V0X2xlbmd0aCwgMHUpOworICAgICAgICBpZiAoUEVTX3BhY2tldF9sZW5ndGggPT0gMHUpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KICAgICAgICAgYnItPnNraXBCaXRzKFBFU19wYWNrZXRfbGVuZ3RoICogOCk7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBBVFNQYXJzZXI6OlN0cmVhbTo6Zmx1c2goKSB7Ci0gICAgaWYgKG1CdWZmZXItPnNpemUoKSA9PSAwKSB7CitzdGF0dXNfdCBBVFNQYXJzZXI6OlN0cmVhbTo6Zmx1c2goU3luY0V2ZW50ICpldmVudCkgeworICAgIGlmIChtQnVmZmVyID09IE5VTEwgfHwgbUJ1ZmZlci0+c2l6ZSgpID09IDApIHsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIApAQCAtODc5LDcgKzEwMzcsNyBAQAogCiAgICAgQUJpdFJlYWRlciBicihtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSk7CiAKLSAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZVBFUygmYnIpOworICAgIHN0YXR1c190IGVyciA9IHBhcnNlUEVTKCZiciwgZXZlbnQpOwogCiAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CiAKQEAgLTg4OCw3ICsxMDQ2LDcgQEAKIAogdm9pZCBBVFNQYXJzZXI6OlN0cmVhbTo6b25QYXlsb2FkRGF0YSgKICAgICAgICAgdW5zaWduZWQgUFRTX0RUU19mbGFncywgdWludDY0X3QgUFRTLCB1aW50NjRfdCAvKiBEVFMgKi8sCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplLCBTeW5jRXZlbnQgKmV2ZW50KSB7CiAjaWYgMAogICAgIEFMT0dJKCJwYXlsb2FkIHN0cmVhbVR5cGUgMHglMDJ4LCBQVFMgPSAweCUwMTZsbHgsIGRQVFMgPSAlbGxkIiwKICAgICAgICAgICBtU3RyZWFtVHlwZSwKQEAgLTkxNSw2ICsxMDczLDcgQEAKICAgICB9CiAKICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0OworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKICAgICB3aGlsZSAoKGFjY2Vzc1VuaXQgPSBtUXVldWUtPmRlcXVldWVBY2Nlc3NVbml0KCkpICE9IE5VTEwpIHsKICAgICAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgewogICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtUXVldWUtPmdldEZvcm1hdCgpOwpAQCAtOTQyLDYgKzExMDEsMTcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1Tb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKICAgICAgICAgfQorCisgICAgICAgIGlmICgoZXZlbnQgIT0gTlVMTCkgJiYgIWZvdW5kICYmIG1RdWV1ZS0+Z2V0Rm9ybWF0KCkgIT0gTlVMTCkgeworICAgICAgICAgICAgaW50MzJfdCBzeW5jID0gMDsKKyAgICAgICAgICAgIGlmIChhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQzMigiaXNTeW5jIiwgJnN5bmMpICYmIHN5bmMpIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgICAgICAgICBpZiAoYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQtPmluaXQobVBlc1N0YXJ0T2Zmc2V0LCBtU291cmNlLCB0aW1lVXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIH0KIApAQCAtOTYzLDYgKzExMzMsMTQgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBNRVRBOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXNNZXRhKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNvdXJjZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTk3Nyw2ICsxMTU1LDcgQEAKICAgICAgIG1BYnNvbHV0ZVRpbWVBbmNob3JVcygtMWxsKSwKICAgICAgIG1UaW1lT2Zmc2V0VmFsaWQoZmFsc2UpLAogICAgICAgbVRpbWVPZmZzZXRVcygwbGwpLAorICAgICAgbUxhc3RSZWNvdmVyZWRQVFMoLTFsbCksCiAgICAgICBtTnVtVFNQYWNrZXRzUGFyc2VkKDApLAogICAgICAgbU51bVBDUnMoMCkgewogICAgIG1QU0lTZWN0aW9ucy5hZGQoMCAvKiBQSUQgKi8sIG5ldyBQU0lTZWN0aW9uKTsKQEAgLTk4NSwzMSArMTE2NCw1NCBAQAogQVRTUGFyc2VyOjp+QVRTUGFyc2VyKCkgewogfQogCi1zdGF0dXNfdCBBVFNQYXJzZXI6OmZlZWRUU1BhY2tldChjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIENIRUNLX0VRKHNpemUsIGtUU1BhY2tldFNpemUpOworc3RhdHVzX3QgQVRTUGFyc2VyOjpmZWVkVFNQYWNrZXQoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsCisgICAgICAgIFN5bmNFdmVudCAqZXZlbnQpIHsKKyAgICBpZiAoc2l6ZSAhPSBrVFNQYWNrZXRTaXplKSB7CisgICAgICAgIEFMT0dFKCJXcm9uZyBUUyBwYWNrZXQgc2l6ZSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KIAogICAgIEFCaXRSZWFkZXIgYnIoKGNvbnN0IHVpbnQ4X3QgKilkYXRhLCBrVFNQYWNrZXRTaXplKTsKLSAgICByZXR1cm4gcGFyc2VUUygmYnIpOworICAgIHJldHVybiBwYXJzZVRTKCZiciwgZXZlbnQpOwogfQogCiB2b2lkIEFUU1BhcnNlcjo6c2lnbmFsRGlzY29udGludWl0eSgKICAgICAgICAgRGlzY29udGludWl0eVR5cGUgdHlwZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZleHRyYSkgewogICAgIGludDY0X3QgbWVkaWFUaW1lVXM7Ci0gICAgaWYgKCh0eXBlICYgRElTQ09OVElOVUlUWV9USU1FKQotICAgICAgICAgICAgJiYgZXh0cmEgIT0gTlVMTAotICAgICAgICAgICAgJiYgZXh0cmEtPmZpbmRJbnQ2NCgKLSAgICAgICAgICAgICAgICBJU3RyZWFtTGlzdGVuZXI6OmtLZXlNZWRpYVRpbWVVcywgJm1lZGlhVGltZVVzKSkgewotICAgICAgICBtQWJzb2x1dGVUaW1lQW5jaG9yVXMgPSBtZWRpYVRpbWVVczsKKyAgICBpZiAoKHR5cGUgJiBESVNDT05USU5VSVRZX1RJTUUpICYmIGV4dHJhICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGV4dHJhLT5maW5kSW50NjQoSVN0cmVhbUxpc3RlbmVyOjprS2V5TWVkaWFUaW1lVXMsICZtZWRpYVRpbWVVcykpIHsKKyAgICAgICAgICAgIG1BYnNvbHV0ZVRpbWVBbmNob3JVcyA9IG1lZGlhVGltZVVzOworICAgICAgICB9CisgICAgICAgIGlmICgobUZsYWdzICYgVFNfVElNRVNUQU1QU19BUkVfQUJTT0xVVEUpCisgICAgICAgICAgICAgICAgJiYgZXh0cmEtPmZpbmRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgSVN0cmVhbUxpc3RlbmVyOjprS2V5UmVjZW50TWVkaWFUaW1lVXMsICZtZWRpYVRpbWVVcykpIHsKKyAgICAgICAgICAgIGlmIChtQWJzb2x1dGVUaW1lQW5jaG9yVXMgPj0gMGxsKSB7CisgICAgICAgICAgICAgICAgbWVkaWFUaW1lVXMgLT0gbUFic29sdXRlVGltZUFuY2hvclVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1UaW1lT2Zmc2V0VmFsaWQpIHsKKyAgICAgICAgICAgICAgICBtZWRpYVRpbWVVcyAtPSBtVGltZU9mZnNldFVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUxhc3RSZWNvdmVyZWRQVFMgPSAobWVkaWFUaW1lVXMgKiA5KSAvIDEwMDsKKyAgICAgICAgfQogICAgIH0gZWxzZSBpZiAodHlwZSA9PSBESVNDT05USU5VSVRZX0FCU09MVVRFX1RJTUUpIHsKICAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgIENIRUNLKGV4dHJhLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKyAgICAgICAgaWYgKCFleHRyYS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSkgeworICAgICAgICAgICAgQUxPR0UoInRpbWVVcyBub3QgZm91bmQiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0gICAgICAgIENIRUNLKG1Qcm9ncmFtcy5lbXB0eSgpKTsKKyAgICAgICAgaWYgKCFtUHJvZ3JhbXMuZW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR0UoIm1Qcm9ncmFtcyBpcyBub3QgZW1wdHkiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICBtQWJzb2x1dGVUaW1lQW5jaG9yVXMgPSB0aW1lVXM7CiAgICAgICAgIHJldHVybjsKICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gRElTQ09OVElOVUlUWV9USU1FX09GRlNFVCkgewogICAgICAgICBpbnQ2NF90IG9mZnNldDsKLSAgICAgICAgQ0hFQ0soZXh0cmEtPmZpbmRJbnQ2NCgib2Zmc2V0IiwgJm9mZnNldCkpOworICAgICAgICBpZiAoIWV4dHJhLT5maW5kSW50NjQoIm9mZnNldCIsICZvZmZzZXQpKSB7CisgICAgICAgICAgICBBTE9HRSgib2Zmc2V0IG5vdCBmb3VuZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKICAgICAgICAgbVRpbWVPZmZzZXRWYWxpZCA9IHRydWU7CiAgICAgICAgIG1UaW1lT2Zmc2V0VXMgPSBvZmZzZXQ7CkBAIC0xMDIyLDcgKzEyMjQsMTAgQEAKIH0KIAogdm9pZCBBVFNQYXJzZXI6OnNpZ25hbEVPUyhzdGF0dXNfdCBmaW5hbFJlc3VsdCkgewotICAgIENIRUNLX05FKGZpbmFsUmVzdWx0LCAoc3RhdHVzX3QpT0spOworICAgIGlmIChmaW5hbFJlc3VsdCA9PSAoc3RhdHVzX3QpIE9LKSB7CisgICAgICAgIEFMT0dFKCJmaW5hbFJlc3VsdCBub3QgT0siKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVByb2dyYW1zLnNpemUoKTsgKytpKSB7CiAgICAgICAgIG1Qcm9ncmFtcy5lZGl0SXRlbUF0KGkpLT5zaWduYWxFT1MoZmluYWxSZXN1bHQpOwpAQCAtMTAzOCwxNCArMTI0MywxMiBAQAogICAgIH0KICAgICB1bnNpZ25lZCBzZWN0aW9uX3N5bnRheF9pbmRpY3RvciA9IGJyLT5nZXRCaXRzKDEpOwogICAgIEFMT0dWKCIgIHNlY3Rpb25fc3ludGF4X2luZGljdG9yID0gJXUiLCBzZWN0aW9uX3N5bnRheF9pbmRpY3Rvcik7Ci0gICAgQ0hFQ0tfRVEoc2VjdGlvbl9zeW50YXhfaW5kaWN0b3IsIDF1KTsKIAotICAgIENIRUNLX0VRKGJyLT5nZXRCaXRzKDEpLCAwdSk7CisgICAgYnItPnNraXBCaXRzKDEpOyAgLy8gJzAnCiAgICAgTVlfTE9HVigiICByZXNlcnZlZCA9ICV1IiwgYnItPmdldEJpdHMoMikpOwogCiAgICAgdW5zaWduZWQgc2VjdGlvbl9sZW5ndGggPSBici0+Z2V0Qml0cygxMik7CiAgICAgQUxPR1YoIiAgc2VjdGlvbl9sZW5ndGggPSAldSIsIHNlY3Rpb25fbGVuZ3RoKTsKLSAgICBDSEVDS19FUShzZWN0aW9uX2xlbmd0aCAmIDB4YzAwLCAwdSk7CiAKICAgICBNWV9MT0dWKCIgIHRyYW5zcG9ydF9zdHJlYW1faWQgPSAldSIsIGJyLT5nZXRCaXRzKDE2KSk7CiAgICAgTVlfTE9HVigiICByZXNlcnZlZCA9ICV1IiwgYnItPmdldEJpdHMoMikpOwpAQCAtMTA1NSw3ICsxMjU4LDYgQEAKICAgICBNWV9MT0dWKCIgIGxhc3Rfc2VjdGlvbl9udW1iZXIgPSAldSIsIGJyLT5nZXRCaXRzKDgpKTsKIAogICAgIHNpemVfdCBudW1Qcm9ncmFtQnl0ZXMgPSAoc2VjdGlvbl9sZW5ndGggLSA1IC8qIGhlYWRlciAqLyAtIDQgLyogY3JjICovKTsKLSAgICBDSEVDS19FUSgobnVtUHJvZ3JhbUJ5dGVzICUgNCksIDB1KTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtUHJvZ3JhbUJ5dGVzIC8gNDsgKytpKSB7CiAgICAgICAgIHVuc2lnbmVkIHByb2dyYW1fbnVtYmVyID0gYnItPmdldEJpdHMoMTYpOwpAQCAtMTA4Myw3ICsxMjg1LDcgQEAKIAogICAgICAgICAgICAgaWYgKCFmb3VuZCkgewogICAgICAgICAgICAgICAgIG1Qcm9ncmFtcy5wdXNoKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByb2dyYW0odGhpcywgcHJvZ3JhbV9udW1iZXIsIHByb2dyYW1NYXBQSUQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcm9ncmFtKHRoaXMsIHByb2dyYW1fbnVtYmVyLCBwcm9ncmFtTWFwUElELCBtTGFzdFJlY292ZXJlZFBUUykpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobVBTSVNlY3Rpb25zLmluZGV4T2ZLZXkocHJvZ3JhbU1hcFBJRCkgPCAwKSB7CkBAIC0xMDk4LDcgKzEzMDAsOCBAQAogc3RhdHVzX3QgQVRTUGFyc2VyOjpwYXJzZVBJRCgKICAgICAgICAgQUJpdFJlYWRlciAqYnIsIHVuc2lnbmVkIFBJRCwKICAgICAgICAgdW5zaWduZWQgY29udGludWl0eV9jb3VudGVyLAotICAgICAgICB1bnNpZ25lZCBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yKSB7CisgICAgICAgIHVuc2lnbmVkIHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IsCisgICAgICAgIFN5bmNFdmVudCAqZXZlbnQpIHsKICAgICBzc2l6ZV90IHNlY3Rpb25JbmRleCA9IG1QU0lTZWN0aW9ucy5pbmRleE9mS2V5KFBJRCk7CiAKICAgICBpZiAoc2VjdGlvbkluZGV4ID49IDApIHsKQEAgLTExMDYsMTQgKzEzMDksMTggQEAKIAogICAgICAgICBpZiAocGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvcikgewogICAgICAgICAgICAgaWYgKCFzZWN0aW9uLT5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICAgICAgQUxPR1coInBhcnNlUElEIGVuY291bnRlcnMgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciB3aGVuIHNlY3Rpb24gaXMgbm90IGVtcHR5Iik7CisgICAgICAgICAgICAgICAgc2VjdGlvbi0+Y2xlYXIoKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdW5zaWduZWQgc2tpcCA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICAgICAgc2VjdGlvbi0+c2V0U2tpcEJ5dGVzKHNraXAgKyAxKTsgIC8vIHNraXAgZmlsbGVyIGJ5dGVzICsgcG9pbnRlciBmaWVsZCBpdHNlbGYKICAgICAgICAgICAgIGJyLT5za2lwQml0cyhza2lwICogOCk7CiAgICAgICAgIH0KIAotICAgICAgICBDSEVDSygoYnItPm51bUJpdHNMZWZ0KCkgJSA4KSA9PSAwKTsKKyAgICAgICAgaWYgKGJyLT5udW1CaXRzTGVmdCgpICUgOCAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CiAgICAgICAgIHN0YXR1c190IGVyciA9IHNlY3Rpb24tPmFwcGVuZChici0+ZGF0YSgpLCBici0+bnVtQml0c0xlZnQoKSAvIDgpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTExMjQsNiArMTMzMSw5IEBACiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoIXNlY3Rpb24tPmlzQ1JDT2theSgpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CiAgICAgICAgIEFCaXRSZWFkZXIgc2VjdGlvbkJpdHMoc2VjdGlvbi0+ZGF0YSgpLCBzZWN0aW9uLT5zaXplKCkpOwogCiAgICAgICAgIGlmIChQSUQgPT0gMCkgewpAQCAtMTE2Myw3ICsxMzczLDcgQEAKICAgICAgICAgc3RhdHVzX3QgZXJyOwogICAgICAgICBpZiAobVByb2dyYW1zLmVkaXRJdGVtQXQoaSktPnBhcnNlUElEKAogICAgICAgICAgICAgICAgICAgICBQSUQsIGNvbnRpbnVpdHlfY291bnRlciwgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciwKLSAgICAgICAgICAgICAgICAgICAgYnIsICZlcnIpKSB7CisgICAgICAgICAgICAgICAgICAgIGJyLCAmZXJyLCBldmVudCkpIHsKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQpAQCAtMTE4MCwxMCArMTM5MCwxNSBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBBVFNQYXJzZXI6OnBhcnNlQWRhcHRhdGlvbkZpZWxkKEFCaXRSZWFkZXIgKmJyLCB1bnNpZ25lZCBQSUQpIHsKK3N0YXR1c190IEFUU1BhcnNlcjo6cGFyc2VBZGFwdGF0aW9uRmllbGQoQUJpdFJlYWRlciAqYnIsIHVuc2lnbmVkIFBJRCkgewogICAgIHVuc2lnbmVkIGFkYXB0YXRpb25fZmllbGRfbGVuZ3RoID0gYnItPmdldEJpdHMoOCk7CiAKICAgICBpZiAoYWRhcHRhdGlvbl9maWVsZF9sZW5ndGggPiAwKSB7CisgICAgICAgIGlmIChhZGFwdGF0aW9uX2ZpZWxkX2xlbmd0aCAqIDggPiBici0+bnVtQml0c0xlZnQoKSkgeworICAgICAgICAgICAgQUxPR1YoIkFkYXB0YXRpb24gZmllbGQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGEgc2luZ2xlIFRTIHBhY2tldC4iKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKwogICAgICAgICB1bnNpZ25lZCBkaXNjb250aW51aXR5X2luZGljYXRvciA9IGJyLT5nZXRCaXRzKDEpOwogCiAgICAgICAgIGlmIChkaXNjb250aW51aXR5X2luZGljYXRvcikgewpAQCAtMTE5Niw2ICsxNDExLDkgQEAKICAgICAgICAgc2l6ZV90IG51bUJpdHNSZWFkID0gNDsKIAogICAgICAgICBpZiAoUENSX2ZsYWcpIHsKKyAgICAgICAgICAgIGlmIChhZGFwdGF0aW9uX2ZpZWxkX2xlbmd0aCAqIDggPCA1MikgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBici0+c2tpcEJpdHMoNCk7CiAgICAgICAgICAgICB1aW50NjRfdCBQQ1JfYmFzZSA9IGJyLT5nZXRCaXRzKDMyKTsKICAgICAgICAgICAgIFBDUl9iYXNlID0gKFBDUl9iYXNlIDw8IDEpIHwgYnItPmdldEJpdHMoMSk7CkBAIC0xMjI2LDEzICsxNDQ0LDEyIEBACiAgICAgICAgICAgICBudW1CaXRzUmVhZCArPSA1MjsKICAgICAgICAgfQogCi0gICAgICAgIENIRUNLX0dFKGFkYXB0YXRpb25fZmllbGRfbGVuZ3RoICogOCwgbnVtQml0c1JlYWQpOwotCiAgICAgICAgIGJyLT5za2lwQml0cyhhZGFwdGF0aW9uX2ZpZWxkX2xlbmd0aCAqIDggLSBudW1CaXRzUmVhZCk7CiAgICAgfQorICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQVRTUGFyc2VyOjpwYXJzZVRTKEFCaXRSZWFkZXIgKmJyKSB7CitzdGF0dXNfdCBBVFNQYXJzZXI6OnBhcnNlVFMoQUJpdFJlYWRlciAqYnIsIFN5bmNFdmVudCAqZXZlbnQpIHsKICAgICBBTE9HVigiLS0tIik7CiAKICAgICB1bnNpZ25lZCBzeW5jX2J5dGUgPSBici0+Z2V0Qml0cyg4KTsKQEAgLTEyNjQsMTUgKzE0ODEsMTYgQEAKIAogICAgIC8vIEFMT0dJKCJQSUQgPSAweCUwNHgsIGNvbnRpbnVpdHlfY291bnRlciA9ICV1IiwgUElELCBjb250aW51aXR5X2NvdW50ZXIpOwogCi0gICAgaWYgKGFkYXB0YXRpb25fZmllbGRfY29udHJvbCA9PSAyIHx8IGFkYXB0YXRpb25fZmllbGRfY29udHJvbCA9PSAzKSB7Ci0gICAgICAgIHBhcnNlQWRhcHRhdGlvbkZpZWxkKGJyLCBQSUQpOwotICAgIH0KLQogICAgIHN0YXR1c190IGVyciA9IE9LOwogCi0gICAgaWYgKGFkYXB0YXRpb25fZmllbGRfY29udHJvbCA9PSAxIHx8IGFkYXB0YXRpb25fZmllbGRfY29udHJvbCA9PSAzKSB7Ci0gICAgICAgIGVyciA9IHBhcnNlUElEKAotICAgICAgICAgICAgICAgIGJyLCBQSUQsIGNvbnRpbnVpdHlfY291bnRlciwgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvcik7CisgICAgaWYgKGFkYXB0YXRpb25fZmllbGRfY29udHJvbCA9PSAyIHx8IGFkYXB0YXRpb25fZmllbGRfY29udHJvbCA9PSAzKSB7CisgICAgICAgIGVyciA9IHBhcnNlQWRhcHRhdGlvbkZpZWxkKGJyLCBQSUQpOworICAgIH0KKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIGlmIChhZGFwdGF0aW9uX2ZpZWxkX2NvbnRyb2wgPT0gMSB8fCBhZGFwdGF0aW9uX2ZpZWxkX2NvbnRyb2wgPT0gMykgeworICAgICAgICAgICAgZXJyID0gcGFyc2VQSUQoYnIsIFBJRCwgY29udGludWl0eV9jb3VudGVyLAorICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yLCBldmVudCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICArK21OdW1UU1BhY2tldHNQYXJzZWQ7CkBAIC0xMzQ2LDcgKzE1NjQsNzkgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotQVRTUGFyc2VyOjpQU0lTZWN0aW9uOjpQU0lTZWN0aW9uKCkgeworCisvLyBDUkMzMiB1c2VkIGZvciBQU0kgc2VjdGlvbi4gVGhlIHRhYmxlIHdhcyBnZW5lcmF0ZWQgYnkgZm9sbG93aW5nIGNvbW1hbmQ6CisvLyAkIHB5dGhvbiBweWNyYy5weSAtLW1vZGVsIGNyYy0zMi1tcGVnIC0tYWxnb3JpdGhtIHRhYmxlLWRyaXZlbiAtLWdlbmVyYXRlIGMKKy8vIFZpc2l0IGh0dHA6Ly93d3cudHR5MS5uZXQvcHljcmMvaW5kZXhfZW4uaHRtbCBmb3IgbW9yZSBkZXRhaWxzLgordWludDMyX3QgQVRTUGFyc2VyOjpQU0lTZWN0aW9uOjpDUkNfVEFCTEVbXSA9IHsKKyAgICAweDAwMDAwMDAwLCAweDA0YzExZGI3LCAweDA5ODIzYjZlLCAweDBkNDMyNmQ5LAorICAgIDB4MTMwNDc2ZGMsIDB4MTdjNTZiNmIsIDB4MWE4NjRkYjIsIDB4MWU0NzUwMDUsCisgICAgMHgyNjA4ZWRiOCwgMHgyMmM5ZjAwZiwgMHgyZjhhZDZkNiwgMHgyYjRiY2I2MSwKKyAgICAweDM1MGM5YjY0LCAweDMxY2Q4NmQzLCAweDNjOGVhMDBhLCAweDM4NGZiZGJkLAorICAgIDB4NGMxMWRiNzAsIDB4NDhkMGM2YzcsIDB4NDU5M2UwMWUsIDB4NDE1MmZkYTksCisgICAgMHg1ZjE1YWRhYywgMHg1YmQ0YjAxYiwgMHg1Njk3OTZjMiwgMHg1MjU2OGI3NSwKKyAgICAweDZhMTkzNmM4LCAweDZlZDgyYjdmLCAweDYzOWIwZGE2LCAweDY3NWExMDExLAorICAgIDB4NzkxZDQwMTQsIDB4N2RkYzVkYTMsIDB4NzA5ZjdiN2EsIDB4NzQ1ZTY2Y2QsCisgICAgMHg5ODIzYjZlMCwgMHg5Y2UyYWI1NywgMHg5MWExOGQ4ZSwgMHg5NTYwOTAzOSwKKyAgICAweDhiMjdjMDNjLCAweDhmZTZkZDhiLCAweDgyYTVmYjUyLCAweDg2NjRlNmU1LAorICAgIDB4YmUyYjViNTgsIDB4YmFlYTQ2ZWYsIDB4YjdhOTYwMzYsIDB4YjM2ODdkODEsCisgICAgMHhhZDJmMmQ4NCwgMHhhOWVlMzAzMywgMHhhNGFkMTZlYSwgMHhhMDZjMGI1ZCwKKyAgICAweGQ0MzI2ZDkwLCAweGQwZjM3MDI3LCAweGRkYjA1NmZlLCAweGQ5NzE0YjQ5LAorICAgIDB4YzczNjFiNGMsIDB4YzNmNzA2ZmIsIDB4Y2ViNDIwMjIsIDB4Y2E3NTNkOTUsCisgICAgMHhmMjNhODAyOCwgMHhmNmZiOWQ5ZiwgMHhmYmI4YmI0NiwgMHhmZjc5YTZmMSwKKyAgICAweGUxM2VmNmY0LCAweGU1ZmZlYjQzLCAweGU4YmNjZDlhLCAweGVjN2RkMDJkLAorICAgIDB4MzQ4NjcwNzcsIDB4MzA0NzZkYzAsIDB4M2QwNDRiMTksIDB4MzljNTU2YWUsCisgICAgMHgyNzgyMDZhYiwgMHgyMzQzMWIxYywgMHgyZTAwM2RjNSwgMHgyYWMxMjA3MiwKKyAgICAweDEyOGU5ZGNmLCAweDE2NGY4MDc4LCAweDFiMGNhNmExLCAweDFmY2RiYjE2LAorICAgIDB4MDE4YWViMTMsIDB4MDU0YmY2YTQsIDB4MDgwOGQwN2QsIDB4MGNjOWNkY2EsCisgICAgMHg3ODk3YWIwNywgMHg3YzU2YjZiMCwgMHg3MTE1OTA2OSwgMHg3NWQ0OGRkZSwKKyAgICAweDZiOTNkZGRiLCAweDZmNTJjMDZjLCAweDYyMTFlNmI1LCAweDY2ZDBmYjAyLAorICAgIDB4NWU5ZjQ2YmYsIDB4NWE1ZTViMDgsIDB4NTcxZDdkZDEsIDB4NTNkYzYwNjYsCisgICAgMHg0ZDliMzA2MywgMHg0OTVhMmRkNCwgMHg0NDE5MGIwZCwgMHg0MGQ4MTZiYSwKKyAgICAweGFjYTVjNjk3LCAweGE4NjRkYjIwLCAweGE1MjdmZGY5LCAweGExZTZlMDRlLAorICAgIDB4YmZhMWIwNGIsIDB4YmI2MGFkZmMsIDB4YjYyMzhiMjUsIDB4YjJlMjk2OTIsCisgICAgMHg4YWFkMmIyZiwgMHg4ZTZjMzY5OCwgMHg4MzJmMTA0MSwgMHg4N2VlMGRmNiwKKyAgICAweDk5YTk1ZGYzLCAweDlkNjg0MDQ0LCAweDkwMmI2NjlkLCAweDk0ZWE3YjJhLAorICAgIDB4ZTBiNDFkZTcsIDB4ZTQ3NTAwNTAsIDB4ZTkzNjI2ODksIDB4ZWRmNzNiM2UsCisgICAgMHhmM2IwNmIzYiwgMHhmNzcxNzY4YywgMHhmYTMyNTA1NSwgMHhmZWYzNGRlMiwKKyAgICAweGM2YmNmMDVmLCAweGMyN2RlZGU4LCAweGNmM2VjYjMxLCAweGNiZmZkNjg2LAorICAgIDB4ZDViODg2ODMsIDB4ZDE3OTliMzQsIDB4ZGMzYWJkZWQsIDB4ZDhmYmEwNWEsCisgICAgMHg2OTBjZTBlZSwgMHg2ZGNkZmQ1OSwgMHg2MDhlZGI4MCwgMHg2NDRmYzYzNywKKyAgICAweDdhMDg5NjMyLCAweDdlYzk4Yjg1LCAweDczOGFhZDVjLCAweDc3NGJiMGViLAorICAgIDB4NGYwNDBkNTYsIDB4NGJjNTEwZTEsIDB4NDY4NjM2MzgsIDB4NDI0NzJiOGYsCisgICAgMHg1YzAwN2I4YSwgMHg1OGMxNjYzZCwgMHg1NTgyNDBlNCwgMHg1MTQzNWQ1MywKKyAgICAweDI1MWQzYjllLCAweDIxZGMyNjI5LCAweDJjOWYwMGYwLCAweDI4NWUxZDQ3LAorICAgIDB4MzYxOTRkNDIsIDB4MzJkODUwZjUsIDB4M2Y5Yjc2MmMsIDB4M2I1YTZiOWIsCisgICAgMHgwMzE1ZDYyNiwgMHgwN2Q0Y2I5MSwgMHgwYTk3ZWQ0OCwgMHgwZTU2ZjBmZiwKKyAgICAweDEwMTFhMGZhLCAweDE0ZDBiZDRkLCAweDE5OTM5Yjk0LCAweDFkNTI4NjIzLAorICAgIDB4ZjEyZjU2MGUsIDB4ZjVlZTRiYjksIDB4ZjhhZDZkNjAsIDB4ZmM2YzcwZDcsCisgICAgMHhlMjJiMjBkMiwgMHhlNmVhM2Q2NSwgMHhlYmE5MWJiYywgMHhlZjY4MDYwYiwKKyAgICAweGQ3MjdiYmI2LCAweGQzZTZhNjAxLCAweGRlYTU4MGQ4LCAweGRhNjQ5ZDZmLAorICAgIDB4YzQyM2NkNmEsIDB4YzBlMmQwZGQsIDB4Y2RhMWY2MDQsIDB4Yzk2MGViYjMsCisgICAgMHhiZDNlOGQ3ZSwgMHhiOWZmOTBjOSwgMHhiNGJjYjYxMCwgMHhiMDdkYWJhNywKKyAgICAweGFlM2FmYmEyLCAweGFhZmJlNjE1LCAweGE3YjhjMGNjLCAweGEzNzlkZDdiLAorICAgIDB4OWIzNjYwYzYsIDB4OWZmNzdkNzEsIDB4OTJiNDViYTgsIDB4OTY3NTQ2MWYsCisgICAgMHg4ODMyMTYxYSwgMHg4Y2YzMGJhZCwgMHg4MWIwMmQ3NCwgMHg4NTcxMzBjMywKKyAgICAweDVkOGE5MDk5LCAweDU5NGI4ZDJlLCAweDU0MDhhYmY3LCAweDUwYzliNjQwLAorICAgIDB4NGU4ZWU2NDUsIDB4NGE0ZmZiZjIsIDB4NDcwY2RkMmIsIDB4NDNjZGMwOWMsCisgICAgMHg3YjgyN2QyMSwgMHg3ZjQzNjA5NiwgMHg3MjAwNDY0ZiwgMHg3NmMxNWJmOCwKKyAgICAweDY4ODYwYmZkLCAweDZjNDcxNjRhLCAweDYxMDQzMDkzLCAweDY1YzUyZDI0LAorICAgIDB4MTE5YjRiZTksIDB4MTU1YTU2NWUsIDB4MTgxOTcwODcsIDB4MWNkODZkMzAsCisgICAgMHgwMjlmM2QzNSwgMHgwNjVlMjA4MiwgMHgwYjFkMDY1YiwgMHgwZmRjMWJlYywKKyAgICAweDM3OTNhNjUxLCAweDMzNTJiYmU2LCAweDNlMTE5ZDNmLCAweDNhZDA4MDg4LAorICAgIDB4MjQ5N2QwOGQsIDB4MjA1NmNkM2EsIDB4MmQxNWViZTMsIDB4MjlkNGY2NTQsCisgICAgMHhjNWE5MjY3OSwgMHhjMTY4M2JjZSwgMHhjYzJiMWQxNywgMHhjOGVhMDBhMCwKKyAgICAweGQ2YWQ1MGE1LCAweGQyNmM0ZDEyLCAweGRmMmY2YmNiLCAweGRiZWU3NjdjLAorICAgIDB4ZTNhMWNiYzEsIDB4ZTc2MGQ2NzYsIDB4ZWEyM2YwYWYsIDB4ZWVlMmVkMTgsCisgICAgMHhmMGE1YmQxZCwgMHhmNDY0YTBhYSwgMHhmOTI3ODY3MywgMHhmZGU2OWJjNCwKKyAgICAweDg5YjhmZDA5LCAweDhkNzllMGJlLCAweDgwM2FjNjY3LCAweDg0ZmJkYmQwLAorICAgIDB4OWFiYzhiZDUsIDB4OWU3ZDk2NjIsIDB4OTMzZWIwYmIsIDB4OTdmZmFkMGMsCisgICAgMHhhZmIwMTBiMSwgMHhhYjcxMGQwNiwgMHhhNjMyMmJkZiwgMHhhMmYzMzY2OCwKKyAgICAweGJjYjQ2NjZkLCAweGI4NzU3YmRhLCAweGI1MzY1ZDAzLCAweGIxZjc0MGI0CisgICAgfTsKKworQVRTUGFyc2VyOjpQU0lTZWN0aW9uOjpQU0lTZWN0aW9uKCkgOgorICAgIG1Ta2lwQnl0ZXMoMCkgewogfQogCiBBVFNQYXJzZXI6OlBTSVNlY3Rpb246On5QU0lTZWN0aW9uKCkgewpAQCAtMTM3NywxMCArMTY2NywxNSBAQAogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBBVFNQYXJzZXI6OlBTSVNlY3Rpb246OnNldFNraXBCeXRlcyh1aW50OF90IHNraXApIHsKKyAgICBtU2tpcEJ5dGVzID0gc2tpcDsKK30KKwogdm9pZCBBVFNQYXJzZXI6OlBTSVNlY3Rpb246OmNsZWFyKCkgewogICAgIGlmIChtQnVmZmVyICE9IE5VTEwpIHsKICAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CiAgICAgfQorICAgIG1Ta2lwQnl0ZXMgPSAwOwogfQogCiBib29sIEFUU1BhcnNlcjo6UFNJU2VjdGlvbjo6aXNDb21wbGV0ZSgpIGNvbnN0IHsKQEAgLTE0MDQsNCArMTY5OSwzMCBAQAogICAgIHJldHVybiBtQnVmZmVyID09IE5VTEwgPyAwIDogbUJ1ZmZlci0+c2l6ZSgpOwogfQogCitib29sIEFUU1BhcnNlcjo6UFNJU2VjdGlvbjo6aXNDUkNPa2F5KCkgY29uc3QgeworICAgIGlmICghaXNDb21wbGV0ZSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdWludDhfdCogZGF0YSA9IG1CdWZmZXItPmRhdGEoKTsKKworICAgIC8vIFJldHVybiB0cnVlIGlmIHNlY3Rpb25fc3ludGF4X2luZGljYXRvciBzYXlzIG5vIHNlY3Rpb24gZm9sbG93cyB0aGUgZmllbGQgc2VjdGlvbl9sZW5ndGguCisgICAgaWYgKChkYXRhWzFdICYgMHg4MCkgPT0gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBzZWN0aW9uTGVuZ3RoID0gVTE2X0FUKGRhdGEgKyAxKSAmIDB4ZmZmOworICAgIEFMT0dWKCJzZWN0aW9uTGVuZ3RoICV1LCBza2lwICV1Iiwgc2VjdGlvbkxlbmd0aCwgbVNraXBCeXRlcyk7CisKKyAgICAvLyBTa2lwIHRoZSBwcmVjZWRpbmcgZmllbGQgcHJlc2VudCB3aGVuIHBheWxvYWQgc3RhcnQgaW5kaWNhdG9yIGlzIG9uLgorICAgIHNlY3Rpb25MZW5ndGggLT0gbVNraXBCeXRlczsKKworICAgIHVpbnQzMl90IGNyYyA9IDB4ZmZmZmZmZmY7CisgICAgZm9yKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2VjdGlvbkxlbmd0aCArIDQgLyogY3JjICovOyBpKyspIHsKKyAgICAgICAgdWludDhfdCBiID0gZGF0YVtpXTsKKyAgICAgICAgaW50IGluZGV4ID0gKChjcmMgPj4gMjQpIF4gKGIgJiAweGZmKSkgJiAweGZmOworICAgICAgICBjcmMgPSBDUkNfVEFCTEVbaW5kZXhdIF4gKGNyYyA8PCA4KTsKKyAgICB9CisgICAgQUxPR1YoImNyYzogJTA4eFxuIiwgY3JjKTsKKyAgICByZXR1cm4gKGNyYyA9PSAwKTsKK30KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaAppbmRleCA3NWQ3NmRjLi40MzBhOGQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KQEAgLTMwLDcgKzMxLDYgQEAKIAogY2xhc3MgQUJpdFJlYWRlcjsKIHN0cnVjdCBBQnVmZmVyOwotc3RydWN0IE1lZGlhU291cmNlOwogCiBzdHJ1Y3QgQVRTUGFyc2VyIDogcHVibGljIFJlZkJhc2UgewogICAgIGVudW0gRGlzY29udGludWl0eVR5cGUgewpAQCAtNDYsNiArNDYsOSBAQAogICAgICAgICAgICAgRElTQ09OVElOVUlUWV9BVURJT19GT1JNQVQKICAgICAgICAgICAgICAgICB8IERJU0NPTlRJTlVJVFlfVklERU9fRk9STUFUCiAgICAgICAgICAgICAgICAgfCBESVNDT05USU5VSVRZX1RJTUUsCisgICAgICAgIERJU0NPTlRJTlVJVFlfRk9STUFUX09OTFkgICAgICAgPQorICAgICAgICAgICAgRElTQ09OVElOVUlUWV9BVURJT19GT1JNQVQKKyAgICAgICAgICAgICAgICB8IERJU0NPTlRJTlVJVFlfVklERU9fRk9STUFULAogICAgIH07CiAKICAgICBlbnVtIEZsYWdzIHsKQEAgLTU5LDkgKzYyLDQzIEBACiAgICAgICAgIEFMSUdORURfVklERU9fREFUQSAgICAgICAgID0gMiwKICAgICB9OwogCisgICAgLy8gRXZlbnQgaXMgdXNlZCB0byBzaWduYWwgc3luYyBwb2ludCBldmVudCBhdCBmZWVkVFNQYWNrZXQoKS4KKyAgICBzdHJ1Y3QgU3luY0V2ZW50IHsKKyAgICAgICAgU3luY0V2ZW50KG9mZjY0X3Qgb2Zmc2V0KTsKKworICAgICAgICB2b2lkIGluaXQob2ZmNjRfdCBvZmZzZXQsIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLAorICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVVzKTsKKworICAgICAgICBib29sIGlzSW5pdCgpIHsgcmV0dXJuIG1Jbml0OyB9CisgICAgICAgIG9mZjY0X3QgZ2V0T2Zmc2V0KCkgeyByZXR1cm4gbU9mZnNldDsgfQorICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJmdldE1lZGlhU291cmNlKCkgeyByZXR1cm4gbU1lZGlhU291cmNlOyB9CisgICAgICAgIGludDY0X3QgZ2V0VGltZVVzKCkgeyByZXR1cm4gbVRpbWVVczsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgYm9vbCBtSW5pdDsKKyAgICAgICAgLyoKKyAgICAgICAgICogbUluaXQgPT0gZmFsc2U6IHRoZSBjdXJyZW50IG9mZnNldAorICAgICAgICAgKiBtSW5pdCA9PSB0cnVlOiB0aGUgc3RhcnQgb2Zmc2V0IG9mIHN5bmMgcGF5bG9hZAorICAgICAgICAgKi8KKyAgICAgICAgb2ZmNjRfdCBtT2Zmc2V0OworICAgICAgICAvKiBUaGUgbWVkaWEgc291cmNlIG9iamVjdCBmb3IgdGhpcyBldmVudC4gKi8KKyAgICAgICAgc3A8TWVkaWFTb3VyY2U+IG1NZWRpYVNvdXJjZTsKKyAgICAgICAgLyogVGhlIHRpbWVzdGFtcCBvZiB0aGUgc3luYyBmcmFtZS4gKi8KKyAgICAgICAgaW50NjRfdCBtVGltZVVzOworICAgIH07CisKICAgICBBVFNQYXJzZXIodWludDMyX3QgZmxhZ3MgPSAwKTsKIAotICAgIHN0YXR1c190IGZlZWRUU1BhY2tldChjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgLy8gRmVlZCBhIFRTIHBhY2tldCBpbnRvIHRoZSBwYXJzZXIuIHVuaW5pdGlhbGl6ZWQgZXZlbnQgd2l0aCB0aGUgc3RhcnQKKyAgICAvLyBvZmZzZXQgb2YgdGhpcyBUUyBwYWNrZXQgZ29lcyBpbiwgYW5kIGlmIHRoZSBwYXJzZXIgZGV0ZWN0cyBQRVMgd2l0aAorICAgIC8vIGEgc3luYyBmcmFtZSwgdGhlIGV2ZW50IHdpbGwgYmUgaW5pdGlhaWx6ZWQgd2l0aCB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZQorICAgIC8vIFBFUy4gTm90ZSB0aGF0IHRoZSBvZmZzZXQgb2YgdGhlIGV2ZW50IGNhbiBiZSBkaWZmZXJlbnQgZnJvbSB3aGF0IHdlIGZlZCwKKyAgICAvLyBhcyBhIFBFUyBtYXkgY29uc2lzdCBvZiBtdWx0aXBsZSBUUyBwYWNrZXRzLgorICAgIC8vCisgICAgLy8gRXZlbiBpbiB0aGUgY2FzZSBmZWVkVFNQYWNrZXQoKSByZXR1cm5zIG5vbi1PSyB2YWx1ZSwgZXZlbnQgc3RpbGwgbWF5IGJlCisgICAgLy8gaW5pdGlhbGl6ZWQgaWYgdGhlIHBhcnNpbmcgZmFpbGVkIGFmdGVyIHRoZSBkZXRlY3Rpb24uCisgICAgc3RhdHVzX3QgZmVlZFRTUGFja2V0KAorICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIFN5bmNFdmVudCAqZXZlbnQgPSBOVUxMKTsKIAogICAgIHZvaWQgc2lnbmFsRGlzY29udGludWl0eSgKICAgICAgICAgICAgIERpc2NvbnRpbnVpdHlUeXBlIHR5cGUsIGNvbnN0IHNwPEFNZXNzYWdlPiAmZXh0cmEpOwpAQCAtNzEsNyArMTA4LDggQEAKICAgICBlbnVtIFNvdXJjZVR5cGUgewogICAgICAgICBWSURFTyA9IDAsCiAgICAgICAgIEFVRElPID0gMSwKLSAgICAgICAgTlVNX1NPVVJDRV9UWVBFUyA9IDIKKyAgICAgICAgTUVUQSAgPSAyLAorICAgICAgICBOVU1fU09VUkNFX1RZUEVTID0gMwogICAgIH07CiAgICAgc3A8TWVkaWFTb3VyY2U+IGdldFNvdXJjZShTb3VyY2VUeXBlIHR5cGUpOwogICAgIGJvb2wgaGFzU291cmNlKFNvdXJjZVR5cGUgdHlwZSkgY29uc3Q7CkBAIC04Nyw2ICsxMjUsNyBAQAogICAgICAgICBTVFJFQU1UWVBFX01QRUcyX0FVRElPICAgICAgICAgID0gMHgwNCwKICAgICAgICAgU1RSRUFNVFlQRV9NUEVHMl9BVURJT19BRFRTICAgICA9IDB4MGYsCiAgICAgICAgIFNUUkVBTVRZUEVfTVBFRzRfVklERU8gICAgICAgICAgPSAweDEwLAorICAgICAgICBTVFJFQU1UWVBFX01FVEFEQVRBICAgICAgICAgICAgID0gMHgxNSwKICAgICAgICAgU1RSRUFNVFlQRV9IMjY0ICAgICAgICAgICAgICAgICA9IDB4MWIsCiAKICAgICAgICAgLy8gRnJvbSBBVFNDIEEvNTMgUGFydCAzOjIwMDksIDYuNy4xCkBAIC0xMTUsMjAgKzE1NCwzMSBAQAogCiAgICAgYm9vbCBtVGltZU9mZnNldFZhbGlkOwogICAgIGludDY0X3QgbVRpbWVPZmZzZXRVczsKKyAgICBpbnQ2NF90IG1MYXN0UmVjb3ZlcmVkUFRTOwogCiAgICAgc2l6ZV90IG1OdW1UU1BhY2tldHNQYXJzZWQ7CiAKICAgICB2b2lkIHBhcnNlUHJvZ3JhbUFzc29jaWF0aW9uVGFibGUoQUJpdFJlYWRlciAqYnIpOwogICAgIHZvaWQgcGFyc2VQcm9ncmFtTWFwKEFCaXRSZWFkZXIgKmJyKTsKLSAgICB2b2lkIHBhcnNlUEVTKEFCaXRSZWFkZXIgKmJyKTsKKyAgICAvLyBQYXJzZSBQRVMgcGFja2V0IHdoZXJlIGJyIGlzIHBvaW50aW5nIHRvLiBJZiB0aGUgUEVTIGNvbnRhaW5zIGEgc3luYworICAgIC8vIGZyYW1lLCBzZXQgZXZlbnQgd2l0aCB0aGUgdGltZSBhbmQgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGlzIFBFUy4KKyAgICAvLyBOb3RlIHRoYXQgdGhlIG1ldGhvZCBpdHNlbGYgZG9lcyBub3QgdG91Y2ggZXZlbnQuCisgICAgdm9pZCBwYXJzZVBFUyhBQml0UmVhZGVyICpiciwgU3luY0V2ZW50ICpldmVudCk7CiAKKyAgICAvLyBTdHJpcCByZW1haW5pbmcgcGFja2V0IGhlYWRlcnMgYW5kIHBhc3MgdG8gYXBwcm9wcmlhdGUgcHJvZ3JhbS9zdHJlYW0KKyAgICAvLyB0byBwYXJzZSB0aGUgcGF5bG9hZC4gSWYgdGhlIHBheWxvYWQgdHVybnMgb3V0IHRvIGJlIFBFUyBhbmQgY29udGFpbnMKKyAgICAvLyBhIHN5bmMgZnJhbWUsIGV2ZW50IHNoYWxsIGJlIHNldCB3aXRoIHRoZSB0aW1lIGFuZCBzdGFydCBvZmZzZXQgb2YgdGhlCisgICAgLy8gUEVTLgorICAgIC8vIE5vdGUgdGhhdCB0aGUgbWV0aG9kIGl0c2VsZiBkb2VzIG5vdCB0b3VjaCBldmVudC4KICAgICBzdGF0dXNfdCBwYXJzZVBJRCgKICAgICAgICAgQUJpdFJlYWRlciAqYnIsIHVuc2lnbmVkIFBJRCwKICAgICAgICAgdW5zaWduZWQgY29udGludWl0eV9jb3VudGVyLAotICAgICAgICB1bnNpZ25lZCBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yKTsKKyAgICAgICAgdW5zaWduZWQgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciwKKyAgICAgICAgU3luY0V2ZW50ICpldmVudCk7CiAKLSAgICB2b2lkIHBhcnNlQWRhcHRhdGlvbkZpZWxkKEFCaXRSZWFkZXIgKmJyLCB1bnNpZ25lZCBQSUQpOwotICAgIHN0YXR1c190IHBhcnNlVFMoQUJpdFJlYWRlciAqYnIpOworICAgIHN0YXR1c190IHBhcnNlQWRhcHRhdGlvbkZpZWxkKEFCaXRSZWFkZXIgKmJyLCB1bnNpZ25lZCBQSUQpOworICAgIC8vIHNlZSBmZWVkVFNQYWNrZXQoKS4KKyAgICBzdGF0dXNfdCBwYXJzZVRTKEFCaXRSZWFkZXIgKmJyLCBTeW5jRXZlbnQgKmV2ZW50KTsKIAogICAgIHZvaWQgdXBkYXRlUENSKHVuc2lnbmVkIFBJRCwgdWludDY0X3QgUENSLCBzaXplX3QgYnl0ZU9mZnNldEZyb21TdGFydCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5tawppbmRleCBjMTdhMGI3Li4xNmIwMTYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLm1rCkBAIC0xMyw3ICsxMyw4IEBACiAJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAogCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAotTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCiAKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X21wZWcydHMKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAKaW5kZXggZjI2NmZlNy4uY2FiZGUzMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuY3BwCkBAIC0xOSw2ICsxOSw4IEBACiAKICNpbmNsdWRlICJBbm90aGVyUGFja2V0U291cmNlLmgiCiAKKyNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgorCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CkBAIC0yNyw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgpAQCAtMzgsMTcgKzQxLDIyIEBACiBBbm90aGVyUGFja2V0U291cmNlOjpBbm90aGVyUGFja2V0U291cmNlKGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSkKICAgICA6IG1Jc0F1ZGlvKGZhbHNlKSwKICAgICAgIG1Jc1ZpZGVvKGZhbHNlKSwKKyAgICAgIG1FbmFibGVkKHRydWUpLAogICAgICAgbUZvcm1hdChOVUxMKSwKICAgICAgIG1MYXN0UXVldWVkVGltZVVzKDApLAogICAgICAgbUVPU1Jlc3VsdChPSyksCiAgICAgICBtTGF0ZXN0RW5xdWV1ZWRNZXRhKE5VTEwpLAotICAgICAgbUxhdGVzdERlcXVldWVkTWV0YShOVUxMKSwKLSAgICAgIG1RdWV1ZWREaXNjb250aW51aXR5Q291bnQoMCkgeworICAgICAgbUxhdGVzdERlcXVldWVkTWV0YShOVUxMKSB7CiAgICAgc2V0Rm9ybWF0KG1ldGEpOworCisgICAgbURpc2NvbnRpbnVpdHlTZWdtZW50cy5wdXNoX2JhY2soRGlzY29udGludWl0eVNlZ21lbnQoKSk7CiB9CiAKIHZvaWQgQW5vdGhlclBhY2tldFNvdXJjZTo6c2V0Rm9ybWF0KGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSkgewotICAgIENIRUNLKG1Gb3JtYXQgPT0gTlVMTCk7CisgICAgaWYgKG1Gb3JtYXQgIT0gTlVMTCkgeworICAgICAgICAvLyBPbmx5IGFsbG93ZWQgdG8gYmUgc2V0IG9uY2UuIFJlcXVpcmVzIGV4cGxpY2l0IGNsZWFyIHRvIHJlc2V0LgorICAgICAgICByZXR1cm47CisgICAgfQogCiAgICAgbUlzQXVkaW8gPSBmYWxzZTsKICAgICBtSXNWaWRlbyA9IGZhbHNlOwpAQCAtNjYsNyArNzQsNyBAQAogICAgIH0gZWxzZSAgaWYgKCFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikpIHsKICAgICAgICAgbUlzVmlkZW8gPSB0cnVlOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIENIRUNLKCFzdHJuY2FzZWNtcCgidGV4dC8iLCBtaW1lLCA1KSk7CisgICAgICAgIENIRUNLKCFzdHJuY2FzZWNtcCgidGV4dC8iLCBtaW1lLCA1KSB8fCAhc3RybmNhc2VjbXAoImFwcGxpY2F0aW9uLyIsIG1pbWUsIDEyKSk7CiAgICAgfQogfQogCkBAIC05MSwxMyArOTksMTIgQEAKICAgICB3aGlsZSAoaXQgIT0gbUJ1ZmZlcnMuZW5kKCkpIHsKICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gKml0OwogICAgICAgICBpbnQzMl90IGRpc2NvbnRpbnVpdHk7Ci0gICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJmRpc2NvbnRpbnVpdHkpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHNwPFJlZkJhc2U+IG9iamVjdDsKLSAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kT2JqZWN0KCJmb3JtYXQiLCAmb2JqZWN0KSkgewotICAgICAgICAgICAgcmV0dXJuIG1Gb3JtYXQgPSBzdGF0aWNfY2FzdDxNZXRhRGF0YSo+KG9iamVjdC5nZXQoKSk7CisgICAgICAgIGlmICghYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZGlzY29udGludWl0eSIsICZkaXNjb250aW51aXR5KSkgeworICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqZWN0OworICAgICAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kT2JqZWN0KCJmb3JtYXQiLCAmb2JqZWN0KSkgeworICAgICAgICAgICAgICAgIHNldEZvcm1hdChzdGF0aWNfY2FzdDxNZXRhRGF0YSo+KG9iamVjdC5nZXQoKSkpOworICAgICAgICAgICAgICAgIHJldHVybiBtRm9ybWF0OworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgKytpdDsKQEAgLTEyMywxNSArMTMwLDI0IEBACiAgICAgICAgICAgICAgICAgbUZvcm1hdC5jbGVhcigpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAtLW1RdWV1ZWREaXNjb250aW51aXR5Q291bnQ7CisgICAgICAgICAgICBtRGlzY29udGludWl0eVNlZ21lbnRzLmVyYXNlKG1EaXNjb250aW51aXR5U2VnbWVudHMuYmVnaW4oKSk7CisgICAgICAgICAgICAvLyBDSEVDSyghbURpc2NvbnRpbnVpdHlTZWdtZW50cy5lbXB0eSgpKTsKICAgICAgICAgICAgIHJldHVybiBJTkZPX0RJU0NPTlRJTlVJVFk7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBDSEVDSyghbURpc2NvbnRpbnVpdHlTZWdtZW50cy5lbXB0eSgpKTsKKyAgICAgICAgRGlzY29udGludWl0eVNlZ21lbnQgJnNlZyA9ICptRGlzY29udGludWl0eVNlZ21lbnRzLmJlZ2luKCk7CisKKyAgICAgICAgaW50NjRfdCB0aW1lVXM7CiAgICAgICAgIG1MYXRlc3REZXF1ZXVlZE1ldGEgPSAoKmJ1ZmZlciktPm1ldGEoKS0+ZHVwKCk7CisgICAgICAgIENIRUNLKG1MYXRlc3REZXF1ZXVlZE1ldGEtPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworICAgICAgICBpZiAodGltZVVzID4gc2VnLm1NYXhEZXF1ZVRpbWVVcykgeworICAgICAgICAgICAgc2VnLm1NYXhEZXF1ZVRpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgfQogCiAgICAgICAgIHNwPFJlZkJhc2U+IG9iamVjdDsKICAgICAgICAgaWYgKCgqYnVmZmVyKS0+bWV0YSgpLT5maW5kT2JqZWN0KCJmb3JtYXQiLCAmb2JqZWN0KSkgewotICAgICAgICAgICAgbUZvcm1hdCA9IHN0YXRpY19jYXN0PE1ldGFEYXRhKj4ob2JqZWN0LmdldCgpKTsKKyAgICAgICAgICAgIHNldEZvcm1hdChzdGF0aWNfY2FzdDxNZXRhRGF0YSo+KG9iamVjdC5nZXQoKSkpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIE9LOwpAQCAtMTQwLDYgKzE1NiwxMiBAQAogICAgIHJldHVybiBtRU9TUmVzdWx0OwogfQogCit2b2lkIEFub3RoZXJQYWNrZXRTb3VyY2U6OnJlcXVldWVBY2Nlc3NVbml0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKKyAgICAvLyBUT0RPOiB1cGRhdGUgY29ycmVzcG9uZGluZyBib29rIGtlZXBpbmcgaW5mby4KKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG1CdWZmZXJzLnB1c2hfZnJvbnQoYnVmZmVyKTsKK30KKwogc3RhdHVzX3QgQW5vdGhlclBhY2tldFNvdXJjZTo6cmVhZCgKICAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICopIHsKICAgICAqb3V0ID0gTlVMTDsKQEAgLTE1Myw3ICsxNzUsNiBAQAogCiAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICptQnVmZmVycy5iZWdpbigpOwogICAgICAgICBtQnVmZmVycy5lcmFzZShtQnVmZmVycy5iZWdpbigpKTsKLSAgICAgICAgbUxhdGVzdERlcXVldWVkTWV0YSA9IGJ1ZmZlci0+bWV0YSgpLT5kdXAoKTsKIAogICAgICAgICBpbnQzMl90IGRpc2NvbnRpbnVpdHk7CiAgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJmRpc2NvbnRpbnVpdHkpKSB7CkBAIC0xNjEsMjEgKzE4Miw0MCBAQAogICAgICAgICAgICAgICAgIG1Gb3JtYXQuY2xlYXIoKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgbURpc2NvbnRpbnVpdHlTZWdtZW50cy5lcmFzZShtRGlzY29udGludWl0eVNlZ21lbnRzLmJlZ2luKCkpOworICAgICAgICAgICAgLy8gQ0hFQ0soIW1EaXNjb250aW51aXR5U2VnbWVudHMuZW1wdHkoKSk7CiAgICAgICAgICAgICByZXR1cm4gSU5GT19ESVNDT05USU5VSVRZOwogICAgICAgICB9CiAKKyAgICAgICAgbUxhdGVzdERlcXVldWVkTWV0YSA9IGJ1ZmZlci0+bWV0YSgpLT5kdXAoKTsKKwogICAgICAgICBzcDxSZWZCYXNlPiBvYmplY3Q7CiAgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZE9iamVjdCgiZm9ybWF0IiwgJm9iamVjdCkpIHsKLSAgICAgICAgICAgIG1Gb3JtYXQgPSBzdGF0aWNfY2FzdDxNZXRhRGF0YSo+KG9iamVjdC5nZXQoKSk7CisgICAgICAgICAgICBzZXRGb3JtYXQoc3RhdGljX2Nhc3Q8TWV0YURhdGEqPihvYmplY3QuZ2V0KCkpKTsKICAgICAgICAgfQogCiAgICAgICAgIGludDY0X3QgdGltZVVzOwogICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisgICAgICAgIC8vIENIRUNLKCFtRGlzY29udGludWl0eVNlZ21lbnRzLmVtcHR5KCkpOworICAgICAgICBEaXNjb250aW51aXR5U2VnbWVudCAmc2VnID0gKm1EaXNjb250aW51aXR5U2VnbWVudHMuYmVnaW4oKTsKKyAgICAgICAgaWYgKHRpbWVVcyA+IHNlZy5tTWF4RGVxdWVUaW1lVXMpIHsKKyAgICAgICAgICAgIHNlZy5tTWF4RGVxdWVUaW1lVXMgPSB0aW1lVXM7CisgICAgICAgIH0KIAogICAgICAgICBNZWRpYUJ1ZmZlciAqbWVkaWFCdWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoYnVmZmVyKTsKIAogICAgICAgICBtZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwogCisgICAgICAgIGludDMyX3QgaXNTeW5jOworICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiaXNTeW5jIiwgJmlzU3luYykpIHsKKyAgICAgICAgICAgIG1lZGlhQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCBpc1N5bmMpOworICAgICAgICB9CisKKyAgICAgICAgc3A8QUJ1ZmZlcj4gc2VpOworICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRCdWZmZXIoInNlaSIsICZzZWkpICYmIHNlaSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldERhdGEoa0tleVNFSSwgMCwgc2VpLT5kYXRhKCksIHNlaS0+c2l6ZSgpKTsKKyAgICAgICAgfQorCiAgICAgICAgICpvdXQgPSBtZWRpYUJ1ZmZlcjsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KQEAgLTIwMywxOCArMjQzLDM1IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpbnQ2NF90IGxhc3RRdWV1ZWRUaW1lVXM7Ci0gICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJmxhc3RRdWV1ZWRUaW1lVXMpKTsKLSAgICBtTGFzdFF1ZXVlZFRpbWVVcyA9IGxhc3RRdWV1ZWRUaW1lVXM7Ci0gICAgQUxPR1YoInF1ZXVlQWNjZXNzVW5pdCB0aW1lVXM9JSIgUFJJaTY0ICIgdXMgKCUuMmYgc2VjcykiLCBtTGFzdFF1ZXVlZFRpbWVVcywgbUxhc3RRdWV1ZWRUaW1lVXMgLyAxRTYpOwotCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBtQnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKICAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOwogCiAgICAgaW50MzJfdCBkaXNjb250aW51aXR5OwotICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJmRpc2NvbnRpbnVpdHkpKSB7Ci0gICAgICAgICsrbVF1ZXVlZERpc2NvbnRpbnVpdHlDb3VudDsKKyAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZGlzY29udGludWl0eSIsICZkaXNjb250aW51aXR5KSl7CisgICAgICAgIEFMT0dWKCJxdWV1ZWluZyBhIGRpc2NvbnRpbnVpdHkgd2l0aCBxdWV1ZUFjY2Vzc1VuaXQiKTsKKworICAgICAgICBtTGFzdFF1ZXVlZFRpbWVVcyA9IDBsbDsKKyAgICAgICAgbUVPU1Jlc3VsdCA9IE9LOworICAgICAgICBtTGF0ZXN0RW5xdWV1ZWRNZXRhID0gTlVMTDsKKworICAgICAgICBtRGlzY29udGludWl0eVNlZ21lbnRzLnB1c2hfYmFjayhEaXNjb250aW51aXR5U2VnbWVudCgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDY0X3QgbGFzdFF1ZXVlZFRpbWVVczsKKyAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbGFzdFF1ZXVlZFRpbWVVcykpOworICAgIG1MYXN0UXVldWVkVGltZVVzID0gbGFzdFF1ZXVlZFRpbWVVczsKKyAgICBBTE9HVigicXVldWVBY2Nlc3NVbml0IHRpbWVVcz0lIiBQUklpNjQgIiB1cyAoJS4yZiBzZWNzKSIsCisgICAgICAgICAgICBtTGFzdFF1ZXVlZFRpbWVVcywgbUxhc3RRdWV1ZWRUaW1lVXMgLyAxRTYpOworCisgICAgLy8gQ0hFQ0soIW1EaXNjb250aW51aXR5U2VnbWVudHMuZW1wdHkoKSk7CisgICAgRGlzY29udGludWl0eVNlZ21lbnQgJnRhaWxTZWcgPSAqKC0tbURpc2NvbnRpbnVpdHlTZWdtZW50cy5lbmQoKSk7CisgICAgaWYgKGxhc3RRdWV1ZWRUaW1lVXMgPiB0YWlsU2VnLm1NYXhFbnF1ZVRpbWVVcykgeworICAgICAgICB0YWlsU2VnLm1NYXhFbnF1ZVRpbWVVcyA9IGxhc3RRdWV1ZWRUaW1lVXM7CisgICAgfQorICAgIGlmICh0YWlsU2VnLm1NYXhEZXF1ZVRpbWVVcyA9PSAtMSkgeworICAgICAgICB0YWlsU2VnLm1NYXhEZXF1ZVRpbWVVcyA9IGxhc3RRdWV1ZWRUaW1lVXM7CiAgICAgfQogCiAgICAgaWYgKG1MYXRlc3RFbnF1ZXVlZE1ldGEgPT0gTlVMTCkgewpAQCAtMjQwLDcgKzI5Nyw5IEBACiAKICAgICBtQnVmZmVycy5jbGVhcigpOwogICAgIG1FT1NSZXN1bHQgPSBPSzsKLSAgICBtUXVldWVkRGlzY29udGludWl0eUNvdW50ID0gMDsKKworICAgIG1EaXNjb250aW51aXR5U2VnbWVudHMuY2xlYXIoKTsKKyAgICBtRGlzY29udGludWl0eVNlZ21lbnRzLnB1c2hfYmFjayhEaXNjb250aW51aXR5U2VnbWVudCgpKTsKIAogICAgIG1Gb3JtYXQgPSBOVUxMOwogICAgIG1MYXRlc3RFbnF1ZXVlZE1ldGEgPSBOVUxMOwpAQCAtMjY3LDYgKzMyNiwxNCBAQAogCiAgICAgICAgICAgICArK2l0OwogICAgICAgICB9CisKKyAgICAgICAgZm9yIChMaXN0PERpc2NvbnRpbnVpdHlTZWdtZW50Pjo6aXRlcmF0b3IgaXQyID0gbURpc2NvbnRpbnVpdHlTZWdtZW50cy5iZWdpbigpOworICAgICAgICAgICAgICAgIGl0MiAhPSBtRGlzY29udGludWl0eVNlZ21lbnRzLmVuZCgpOworICAgICAgICAgICAgICAgICsraXQyKSB7CisgICAgICAgICAgICBEaXNjb250aW51aXR5U2VnbWVudCAmc2VnID0gKml0MjsKKyAgICAgICAgICAgIHNlZy5jbGVhcigpOworICAgICAgICB9CisKICAgICB9CiAKICAgICBtRU9TUmVzdWx0ID0gT0s7CkBAIC0yNzcsNyArMzQ0LDggQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgICsrbVF1ZXVlZERpc2NvbnRpbnVpdHlDb3VudDsKKyAgICBtRGlzY29udGludWl0eVNlZ21lbnRzLnB1c2hfYmFjayhEaXNjb250aW51aXR5U2VnbWVudCgpKTsKKwogICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKDApOwogICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZGlzY29udGludWl0eSIsIHN0YXRpY19jYXN0PGludDMyX3Q+KHR5cGUpKTsKICAgICBidWZmZXItPm1ldGEoKS0+c2V0TWVzc2FnZSgiZXh0cmEiLCBleHRyYSk7CkBAIC0yOTYsNiArMzY0LDEwIEBACiAKIGJvb2wgQW5vdGhlclBhY2tldFNvdXJjZTo6aGFzQnVmZmVyQXZhaWxhYmxlKHN0YXR1c190ICpmaW5hbFJlc3VsdCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgKmZpbmFsUmVzdWx0ID0gT0s7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogICAgIGlmICghbUJ1ZmZlcnMuZW1wdHkoKSkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC0zMDQsODYgKzM3Niw1MyBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAorYm9vbCBBbm90aGVyUGFja2V0U291cmNlOjpoYXNEYXRhQnVmZmVyQXZhaWxhYmxlKHN0YXR1c190ICpmaW5hbFJlc3VsdCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgKmZpbmFsUmVzdWx0ID0gT0s7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQ7CisgICAgZm9yIChpdCA9IG1CdWZmZXJzLmJlZ2luKCk7IGl0ICE9IG1CdWZmZXJzLmVuZCgpOyBpdCsrKSB7CisgICAgICAgIGludDMyX3QgZGlzY29udGludWl0eTsKKyAgICAgICAgaWYgKCEoKml0KS0+bWV0YSgpLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHkiLCAmZGlzY29udGludWl0eSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgKmZpbmFsUmVzdWx0ID0gbUVPU1Jlc3VsdDsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3NpemVfdCBBbm90aGVyUGFja2V0U291cmNlOjpnZXRBdmFpbGFibGVCdWZmZXJDb3VudChzdGF0dXNfdCAqZmluYWxSZXN1bHQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgKmZpbmFsUmVzdWx0ID0gT0s7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCFtQnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBtQnVmZmVycy5zaXplKCk7CisgICAgfQorICAgICpmaW5hbFJlc3VsdCA9IG1FT1NSZXN1bHQ7CisgICAgcmV0dXJuIDA7Cit9CisKIGludDY0X3QgQW5vdGhlclBhY2tldFNvdXJjZTo6Z2V0QnVmZmVyZWREdXJhdGlvblVzKHN0YXR1c190ICpmaW5hbFJlc3VsdCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIGdldEJ1ZmZlcmVkRHVyYXRpb25Vc19sKGZpbmFsUmVzdWx0KTsKLX0KLQotaW50NjRfdCBBbm90aGVyUGFja2V0U291cmNlOjpnZXRCdWZmZXJlZER1cmF0aW9uVXNfbChzdGF0dXNfdCAqZmluYWxSZXN1bHQpIHsKICAgICAqZmluYWxSZXN1bHQgPSBtRU9TUmVzdWx0OwogCi0gICAgaWYgKG1CdWZmZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaW50NjRfdCB0aW1lMSA9IC0xOwotICAgIGludDY0X3QgdGltZTIgPSAtMTsKICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSAwOwotCi0gICAgTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdCA9IG1CdWZmZXJzLmJlZ2luKCk7Ci0gICAgd2hpbGUgKGl0ICE9IG1CdWZmZXJzLmVuZCgpKSB7Ci0gICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIgPSAqaXQ7Ci0KLSAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSkgewotICAgICAgICAgICAgaWYgKHRpbWUxIDwgMCB8fCB0aW1lVXMgPCB0aW1lMSkgewotICAgICAgICAgICAgICAgIHRpbWUxID0gdGltZVVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodGltZTIgPCAwIHx8IHRpbWVVcyA+IHRpbWUyKSB7Ci0gICAgICAgICAgICAgICAgdGltZTIgPSB0aW1lVXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGlzIGEgZGlzY29udGludWl0eSwgcmVzZXQgZXZlcnl0aGluZy4KLSAgICAgICAgICAgIGR1cmF0aW9uVXMgKz0gdGltZTIgLSB0aW1lMTsKLSAgICAgICAgICAgIHRpbWUxID0gdGltZTIgPSAtMTsKLSAgICAgICAgfQotCi0gICAgICAgICsraXQ7CisgICAgZm9yIChMaXN0PERpc2NvbnRpbnVpdHlTZWdtZW50Pjo6aXRlcmF0b3IgaXQgPSBtRGlzY29udGludWl0eVNlZ21lbnRzLmJlZ2luKCk7CisgICAgICAgICAgICBpdCAhPSBtRGlzY29udGludWl0eVNlZ21lbnRzLmVuZCgpOworICAgICAgICAgICAgKytpdCkgeworICAgICAgICBjb25zdCBEaXNjb250aW51aXR5U2VnbWVudCAmc2VnID0gKml0OworICAgICAgICAvLyBkZXF1ZXVlZCBhY2Nlc3MgdW5pdHMgc2hvdWxkIGJlIGEgc3Vic2V0IG9mIGVucXVldWVkIGFjY2VzcyB1bml0cworICAgICAgICAvLyBDSEVDSyhzZWcubWF4RW5xdWVUaW1lVXMgPj0gc2VnLm1NYXhEZXF1ZVRpbWVVcyk7CisgICAgICAgIGR1cmF0aW9uVXMgKz0gKHNlZy5tTWF4RW5xdWVUaW1lVXMgLSBzZWcubU1heERlcXVlVGltZVVzKTsKICAgICB9CiAKLSAgICByZXR1cm4gZHVyYXRpb25VcyArICh0aW1lMiAtIHRpbWUxKTsKLX0KLQotLy8gQSBjaGVhcGVyIGJ1dCBsZXNzIHByZWNpc2UgdmVyc2lvbiBvZiBnZXRCdWZmZXJlZER1cmF0aW9uVXMgdGhhdCB3ZSB3b3VsZCBsaWtlIHRvIHVzZSBpbgotLy8gTGl2ZVNlc3Npb246OmRlcXVldWVBY2Nlc3NVbml0IHRvIHRyaWdnZXIgZG93bndhcmRzIGFkYXB0YXRpb24uCi1pbnQ2NF90IEFub3RoZXJQYWNrZXRTb3VyY2U6OmdldEVzdGltYXRlZER1cmF0aW9uVXMoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBpZiAobUJ1ZmZlcnMuZW1wdHkoKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAobVF1ZXVlZERpc2NvbnRpbnVpdHlDb3VudCA+IDApIHsKLSAgICAgICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7Ci0gICAgICAgIHJldHVybiBnZXRCdWZmZXJlZER1cmF0aW9uVXNfbCgmZmluYWxSZXN1bHQpOwotICAgIH0KLQotICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBtQnVmZmVycy5iZWdpbigpOwotICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICppdDsKLQotICAgIGludDY0X3Qgc3RhcnRUaW1lVXM7Ci0gICAgYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnN0YXJ0VGltZVVzKTsKLSAgICBpZiAoc3RhcnRUaW1lVXMgPCAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGl0ID0gbUJ1ZmZlcnMuZW5kKCk7Ci0gICAgLS1pdDsKLSAgICBidWZmZXIgPSAqaXQ7Ci0KLSAgICBpbnQ2NF90IGVuZFRpbWVVczsKLSAgICBidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmZW5kVGltZVVzKTsKLSAgICBpZiAoZW5kVGltZVVzIDwgMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IGRpZmZVczsKLSAgICBpZiAoZW5kVGltZVVzID4gc3RhcnRUaW1lVXMpIHsKLSAgICAgICAgZGlmZlVzID0gZW5kVGltZVVzIC0gc3RhcnRUaW1lVXM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZGlmZlVzID0gc3RhcnRUaW1lVXMgLSBlbmRUaW1lVXM7Ci0gICAgfQotICAgIHJldHVybiBkaWZmVXM7CisgICAgcmV0dXJuIGR1cmF0aW9uVXM7CiB9CiAKIHN0YXR1c190IEFub3RoZXJQYWNrZXRTb3VyY2U6Om5leHRCdWZmZXJUaW1lKGludDY0X3QgKnRpbWVVcykgewpAQCAtNDIyLDQgKzQ2MSwxNzEgQEAKICAgICByZXR1cm4gbUxhdGVzdERlcXVldWVkTWV0YTsKIH0KIAordm9pZCBBbm90aGVyUGFja2V0U291cmNlOjplbmFibGUoYm9vbCBlbmFibGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG1FbmFibGVkID0gZW5hYmxlOworfQorCisvKgorICogcmV0dXJucyB0aGUgc2FtcGxlIG1ldGEgdGhhdCdzIGRlbGF5VXMgYWZ0ZXIgcXVldWUgaGVhZAorICogKE5VTEwgaWYgc3VjaCBzYW1wbGUgaXMgdW5hdmFpbGFibGUpCisgKi8KK3NwPEFNZXNzYWdlPiBBbm90aGVyUGFja2V0U291cmNlOjpnZXRNZXRhQWZ0ZXJMYXN0RGVxdWV1ZWQoaW50NjRfdCBkZWxheVVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpbnQ2NF90IGZpcnN0VXMgPSAtMTsKKyAgICBpbnQ2NF90IGxhc3RVcyA9IC0xOworICAgIGludDY0X3QgZHVyYXRpb25VcyA9IDA7CisKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0OworICAgIGZvciAoaXQgPSBtQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtQnVmZmVycy5lbmQoKTsgKytpdCkgeworICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyID0gKml0OworICAgICAgICBpbnQzMl90IGRpc2NvbnRpbnVpdHk7CisgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJmRpc2NvbnRpbnVpdHkpKSB7CisgICAgICAgICAgICBkdXJhdGlvblVzICs9IGxhc3RVcyAtIGZpcnN0VXM7CisgICAgICAgICAgICBmaXJzdFVzID0gLTE7CisgICAgICAgICAgICBsYXN0VXMgPSAtMTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpIHsKKyAgICAgICAgICAgIGlmIChmaXJzdFVzIDwgMCkgeworICAgICAgICAgICAgICAgIGZpcnN0VXMgPSB0aW1lVXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGFzdFVzIDwgMCB8fCB0aW1lVXMgPiBsYXN0VXMpIHsKKyAgICAgICAgICAgICAgICBsYXN0VXMgPSB0aW1lVXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZHVyYXRpb25VcyArIChsYXN0VXMgLSBmaXJzdFVzKSA+PSBkZWxheVVzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci0+bWV0YSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvKgorICogcmVtb3ZlcyBzYW1wbGVzIHdpdGggdGltZSBlcXVhbCBvciBhZnRlciBtZXRhCisgKi8KK3ZvaWQgQW5vdGhlclBhY2tldFNvdXJjZTo6dHJpbUJ1ZmZlcnNBZnRlck1ldGEoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbWV0YSkgeworICAgIGlmIChtZXRhID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coInRyaW1taW5nIHdpdGggTlVMTCBtZXRhLCBpZ25vcmluZyIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobUJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgSExTVGltZSBzdG9wVGltZShtZXRhKTsKKyAgICBBTE9HVigidHJpbUJ1ZmZlcnNBZnRlck1ldGE6IGRpc2NvbnRpbnVpdHlTZXEgJWQsIHRpbWVVcyAlbGxkIiwKKyAgICAgICAgICAgIHN0b3BUaW1lLm1TZXEsIChsb25nIGxvbmcpc3RvcFRpbWUubVRpbWVVcyk7CisKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0OworICAgIExpc3Q8RGlzY29udGludWl0eVNlZ21lbnQgPjo6aXRlcmF0b3IgaXQyOworICAgIHNwPEFNZXNzYWdlPiBuZXdMYXRlc3RFbnF1ZXVlZE1ldGEgPSBOVUxMOworICAgIGludDY0X3QgbmV3TGFzdFF1ZXVlZFRpbWVVcyA9IDA7CisgICAgZm9yIChpdCA9IG1CdWZmZXJzLmJlZ2luKCksIGl0MiA9IG1EaXNjb250aW51aXR5U2VnbWVudHMuYmVnaW4oKTsgaXQgIT0gbUJ1ZmZlcnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciA9ICppdDsKKyAgICAgICAgaW50MzJfdCBkaXNjb250aW51aXR5OworICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZGlzY29udGludWl0eSIsICZkaXNjb250aW51aXR5KSkgeworICAgICAgICAgICAgLy8gQ0hFQ0soaXQyICE9IG1EaXNjb250aW51aXR5U2VnbWVudHMuZW5kKCkpOworICAgICAgICAgICAgKytpdDI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEhMU1RpbWUgY3VyVGltZShidWZmZXItPm1ldGEoKSk7CisgICAgICAgIGlmICghKGN1clRpbWUgPCBzdG9wVGltZSkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJ0cmltbWluZyBmcm9tICVsbGQgKGluY2x1c2l2ZSkgdG8gZW5kIiwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyljdXJUaW1lLm1UaW1lVXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbmV3TGF0ZXN0RW5xdWV1ZWRNZXRhID0gYnVmZmVyLT5tZXRhKCk7CisgICAgICAgIG5ld0xhc3RRdWV1ZWRUaW1lVXMgPSBjdXJUaW1lLm1UaW1lVXM7CisgICAgfQorCisgICAgbUJ1ZmZlcnMuZXJhc2UoaXQsIG1CdWZmZXJzLmVuZCgpKTsKKyAgICBtTGF0ZXN0RW5xdWV1ZWRNZXRhID0gbmV3TGF0ZXN0RW5xdWV1ZWRNZXRhOworICAgIG1MYXN0UXVldWVkVGltZVVzID0gbmV3TGFzdFF1ZXVlZFRpbWVVczsKKworICAgIERpc2NvbnRpbnVpdHlTZWdtZW50ICZzZWcgPSAqaXQyOworICAgIGlmIChuZXdMYXRlc3RFbnF1ZXVlZE1ldGEgIT0gTlVMTCkgeworICAgICAgICBzZWcubU1heEVucXVlVGltZVVzID0gbmV3TGFzdFF1ZXVlZFRpbWVVczsKKyAgICB9IGVsc2UgeworICAgICAgICBzZWcuY2xlYXIoKTsKKyAgICB9CisgICAgbURpc2NvbnRpbnVpdHlTZWdtZW50cy5lcmFzZSgrK2l0MiwgbURpc2NvbnRpbnVpdHlTZWdtZW50cy5lbmQoKSk7Cit9CisKKy8qCisgKiByZW1vdmVzIHNhbXBsZXMgd2l0aCB0aW1lIGVxdWFsIG9yIGJlZm9yZSBtZXRhOworICogcmV0dXJucyBmaXJzdCBzYW1wbGUgbGVmdCBpbiB0aGUgcXVldWUuCisgKgorICogKGZvciBBVkMsIGlmIHRyaW0gaGFwcGVucywgdGhlIHNhbXBsZXMgbGVmdCB3aWxsIGFsd2F5cyBzdGFydAorICogYXQgbmV4dCBJRFIuKQorICovCitzcDxBTWVzc2FnZT4gQW5vdGhlclBhY2tldFNvdXJjZTo6dHJpbUJ1ZmZlcnNCZWZvcmVNZXRhKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1ldGEpIHsKKyAgICBITFNUaW1lIHN0YXJ0VGltZShtZXRhKTsKKyAgICBBTE9HVigidHJpbUJ1ZmZlcnNCZWZvcmVNZXRhOiBkaXNjb250aW51aXR5U2VxICVkLCB0aW1lVXMgJWxsZCIsCisgICAgICAgICAgICBzdGFydFRpbWUubVNlcSwgKGxvbmcgbG9uZylzdGFydFRpbWUubVRpbWVVcyk7CisKKyAgICBzcDxBTWVzc2FnZT4gZmlyc3RNZXRhOworICAgIGludDY0X3QgZmlyc3RUaW1lVXMgPSAtMTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmIChtQnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQ7CisgICAgYm9vbCBpc0F2YyA9IGZhbHNlOworCisgICAgTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdDsKKyAgICBmb3IgKGl0ID0gbUJ1ZmZlcnMuYmVnaW4oKTsgaXQgIT0gbUJ1ZmZlcnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciA9ICppdDsKKyAgICAgICAgaW50MzJfdCBkaXNjb250aW51aXR5OworICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZGlzY29udGludWl0eSIsICZkaXNjb250aW51aXR5KSkgeworICAgICAgICAgICAgbURpc2NvbnRpbnVpdHlTZWdtZW50cy5lcmFzZShtRGlzY29udGludWl0eVNlZ21lbnRzLmJlZ2luKCkpOworICAgICAgICAgICAgLy8gQ0hFQ0soIW1EaXNjb250aW51aXR5U2VnbWVudHMuZW1wdHkoKSk7CisgICAgICAgICAgICBmb3JtYXQgPSBOVUxMOworICAgICAgICAgICAgaXNBdmMgPSBmYWxzZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQgPT0gTlVMTCkgeworICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqZWN0OworICAgICAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kT2JqZWN0KCJmb3JtYXQiLCAmb2JqZWN0KSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1pbWU7CisgICAgICAgICAgICAgICAgZm9ybWF0ID0gc3RhdGljX2Nhc3Q8TWV0YURhdGEqPihvYmplY3QuZ2V0KCkpOworICAgICAgICAgICAgICAgIGlzQXZjID0gZm9ybWF0ICE9IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdC0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzQXZjICYmICFJc0lEUihidWZmZXIpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEhMU1RpbWUgY3VyVGltZShidWZmZXItPm1ldGEoKSk7CisgICAgICAgIGlmIChzdGFydFRpbWUgPCBjdXJUaW1lKSB7CisgICAgICAgICAgICBBTE9HVigidHJpbW1pbmcgZnJvbSBiZWdpbm5pbmcgdG8gJWxsZCAobm90IGluY2x1c2l2ZSkiLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWN1clRpbWUubVRpbWVVcyk7CisgICAgICAgICAgICBmaXJzdE1ldGEgPSBidWZmZXItPm1ldGEoKTsKKyAgICAgICAgICAgIGZpcnN0VGltZVVzID0gY3VyVGltZS5tVGltZVVzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgbUJ1ZmZlcnMuZXJhc2UobUJ1ZmZlcnMuYmVnaW4oKSwgaXQpOworICAgIG1MYXRlc3REZXF1ZXVlZE1ldGEgPSBOVUxMOworCisgICAgLy8gQ0hFQ0soIW1EaXNjb250aW51aXR5U2VnbWVudHMuZW1wdHkoKSk7CisgICAgRGlzY29udGludWl0eVNlZ21lbnQgJnNlZyA9ICptRGlzY29udGludWl0eVNlZ21lbnRzLmJlZ2luKCk7CisgICAgaWYgKGZpcnN0VGltZVVzID49IDApIHsKKyAgICAgICAgc2VnLm1NYXhEZXF1ZVRpbWVVcyA9IGZpcnN0VGltZVVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHNlZy5jbGVhcigpOworICAgIH0KKworICAgIHJldHVybiBmaXJzdE1ldGE7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oCmluZGV4IDgwOWE4NTguLjI4YTBlODkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oCkBAIC00MywxNCArNDMsMjAgQEAKIAogICAgIHZvaWQgY2xlYXIoKTsKIAorICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB3ZSBoYXZlIGFueSBwYWNrZXRzIGluY2x1ZGluZyBkaXNjb250aW51aXRpZXMKICAgICBib29sIGhhc0J1ZmZlckF2YWlsYWJsZShzdGF0dXNfdCAqZmluYWxSZXN1bHQpOwogCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHdlIGhhdmUgcGFja2V0cyB0aGF0J3Mgbm90IGRpc2NvbnRpbnVpdGllcworICAgIGJvb2wgaGFzRGF0YUJ1ZmZlckF2YWlsYWJsZShzdGF0dXNfdCAqZmluYWxSZXN1bHQpOworCisgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBidWZmZXJzLiBmaW5hbFJlc3VsdCBpcyBhbHdheXMgT0sKKyAgICAvLyBpZiB0aGlzIG1ldGhvZCByZXR1cm5zIG5vbi0wLCBvciB0aGUgZmluYWwgcmVzdWx0IGlmIGl0IHJldHVybnMgMC4KKyAgICBzaXplX3QgZ2V0QXZhaWxhYmxlQnVmZmVyQ291bnQoc3RhdHVzX3QgKmZpbmFsUmVzdWx0KTsKKwogICAgIC8vIFJldHVybnMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbGFzdCBhbmQgdGhlIGZpcnN0IHF1ZXVlZAogICAgIC8vIHByZXNlbnRhdGlvbiB0aW1lc3RhbXBzIHNpbmNlIHRoZSBsYXN0IGRpc2NvbnRpbnVpdHkgKGlmIGFueSkuCiAgICAgaW50NjRfdCBnZXRCdWZmZXJlZER1cmF0aW9uVXMoc3RhdHVzX3QgKmZpbmFsUmVzdWx0KTsKIAotICAgIGludDY0X3QgZ2V0RXN0aW1hdGVkRHVyYXRpb25VcygpOwotCiAgICAgc3RhdHVzX3QgbmV4dEJ1ZmZlclRpbWUoaW50NjRfdCAqdGltZVVzKTsKIAogICAgIHZvaWQgcXVldWVBY2Nlc3NVbml0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwpAQCAtNjMsMjEgKzY5LDQ4IEBACiAgICAgdm9pZCBzaWduYWxFT1Moc3RhdHVzX3QgcmVzdWx0KTsKIAogICAgIHN0YXR1c190IGRlcXVldWVBY2Nlc3NVbml0KHNwPEFCdWZmZXI+ICpidWZmZXIpOworICAgIHZvaWQgcmVxdWV1ZUFjY2Vzc1VuaXQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAKICAgICBib29sIGlzRmluaXNoZWQoaW50NjRfdCBkdXJhdGlvbikgY29uc3Q7CiAKKyAgICB2b2lkIGVuYWJsZShib29sIGVuYWJsZSk7CisKICAgICBzcDxBTWVzc2FnZT4gZ2V0TGF0ZXN0RW5xdWV1ZWRNZXRhKCk7CiAgICAgc3A8QU1lc3NhZ2U+IGdldExhdGVzdERlcXVldWVkTWV0YSgpOworICAgIHNwPEFNZXNzYWdlPiBnZXRNZXRhQWZ0ZXJMYXN0RGVxdWV1ZWQoaW50NjRfdCBkZWxheVVzKTsKKworICAgIHZvaWQgdHJpbUJ1ZmZlcnNBZnRlck1ldGEoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtZXRhKTsKKyAgICBzcDxBTWVzc2FnZT4gdHJpbUJ1ZmZlcnNCZWZvcmVNZXRhKGNvbnN0IHNwPEFNZXNzYWdlPiAmbWV0YSk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5Bbm90aGVyUGFja2V0U291cmNlKCk7CiAKIHByaXZhdGU6CisKKyAgICBzdHJ1Y3QgRGlzY29udGludWl0eVNlZ21lbnQgeworICAgICAgICBpbnQ2NF90IG1NYXhEZXF1ZVRpbWVVcywgbU1heEVucXVlVGltZVVzOworICAgICAgICBEaXNjb250aW51aXR5U2VnbWVudCgpCisgICAgICAgICAgICA6IG1NYXhEZXF1ZVRpbWVVcygtMSksCisgICAgICAgICAgICAgIG1NYXhFbnF1ZVRpbWVVcygtMSkgeworICAgICAgICB9OworCisgICAgICAgIHZvaWQgY2xlYXIoKSB7CisgICAgICAgICAgICBtTWF4RGVxdWVUaW1lVXMgPSBtTWF4RW5xdWVUaW1lVXMgPSAtMTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBEaXNjb250aW51aXR5IHNlZ21lbnRzIGFyZSBjb25zZWN1dGl2ZSBhY2Nlc3MgdW5pdHMgYmV0d2VlbgorICAgIC8vIGRpc2NvbnRpbnVpdHkgbWFya2Vycy4gVGhlcmUgc2hvdWxkIGFsd2F5cyBiZSBhdCBsZWFzdCBfT05FXworICAgIC8vIGRpc2NvbnRpbnVpdHkgc2VnbWVudCwgaGVuY2UgdGhlIHZhcmlvdXMgQ0hFQ0tzIGluCisgICAgLy8gQW5vdGhlclBhY2tldFNvdXJjZS5jcHAgZm9yIG5vbi1lbXB0eSgpLW5lc3MuCisgICAgTGlzdDxEaXNjb250aW51aXR5U2VnbWVudD4gbURpc2NvbnRpbnVpdHlTZWdtZW50czsKKwogICAgIE11dGV4IG1Mb2NrOwogICAgIENvbmRpdGlvbiBtQ29uZGl0aW9uOwogCiAgICAgYm9vbCBtSXNBdWRpbzsKICAgICBib29sIG1Jc1ZpZGVvOworICAgIGJvb2wgbUVuYWJsZWQ7CiAgICAgc3A8TWV0YURhdGE+IG1Gb3JtYXQ7CiAgICAgaW50NjRfdCBtTGFzdFF1ZXVlZFRpbWVVczsKICAgICBMaXN0PHNwPEFCdWZmZXI+ID4gbUJ1ZmZlcnM7CkBAIC04NSwxMCArMTE4LDcgQEAKICAgICBzcDxBTWVzc2FnZT4gbUxhdGVzdEVucXVldWVkTWV0YTsKICAgICBzcDxBTWVzc2FnZT4gbUxhdGVzdERlcXVldWVkTWV0YTsKIAotICAgIHNpemVfdCAgbVF1ZXVlZERpc2NvbnRpbnVpdHlDb3VudDsKLQogICAgIGJvb2wgd2FzRm9ybWF0Q2hhbmdlKGludDMyX3QgZGlzY29udGludWl0eVR5cGUpIGNvbnN0OwotICAgIGludDY0X3QgZ2V0QnVmZmVyZWREdXJhdGlvblVzX2woc3RhdHVzX3QgKmZpbmFsUmVzdWx0KTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFub3RoZXJQYWNrZXRTb3VyY2UpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCmluZGV4IDU1MjdkZjAuLjM2ZWMzNjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcApAQCAtNTYsNiArNTYsOCBAQAogICAgIGlmIChjbGVhckZvcm1hdCkgewogICAgICAgICBtRm9ybWF0LmNsZWFyKCk7CiAgICAgfQorCisgICAgbUVPU1JlYWNoZWQgPSBmYWxzZTsKIH0KIAogLy8gUGFyc2UgQUMzIGhlYWRlciBhc3N1bWluZyB0aGUgY3VycmVudCBwdHIgaXMgc3RhcnQgcG9zaXRpb24gb2Ygc3luY2ZyYW1lLApAQCAtNDE1LDEzICs0MTcsMTQgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgY2FzZSBQQ01fQVVESU86CisgICAgICAgICAgICBjYXNlIE1FVEFEQVRBOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgQUxPR0UoIlVua25vd24gbW9kZTogJWQiLCBtTW9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDk5LDggKzUwMiwxMyBAQAogICAgICAgICAgICAgcmV0dXJuIGRlcXVldWVBY2Nlc3NVbml0TVBFRzRWaWRlbygpOwogICAgICAgICBjYXNlIFBDTV9BVURJTzoKICAgICAgICAgICAgIHJldHVybiBkZXF1ZXVlQWNjZXNzVW5pdFBDTUF1ZGlvKCk7CisgICAgICAgIGNhc2UgTUVUQURBVEE6CisgICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRNZXRhZGF0YSgpOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQ0hFQ0tfRVEoKHVuc2lnbmVkKW1Nb2RlLCAodW5zaWduZWQpTVBFR19BVURJTyk7CisgICAgICAgICAgICBpZiAobU1vZGUgIT0gTVBFR19BVURJTykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIG1vZGUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBkZXF1ZXVlQWNjZXNzVW5pdE1QRUdBdWRpbygpOwogICAgIH0KIH0KQEAgLTUzNyw4ICs1NDUsMTIgQEAKICAgICBtZW1jcHkoYWNjZXNzVW5pdC0+ZGF0YSgpLCBtQnVmZmVyLT5kYXRhKCksIHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplKTsKIAogICAgIGludDY0X3QgdGltZVVzID0gZmV0Y2hUaW1lc3RhbXAoc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUpOwotICAgIENIRUNLX0dFKHRpbWVVcywgMGxsKTsKKyAgICBpZiAodGltZVVzIDwgMGxsKSB7CisgICAgICAgIEFMT0dFKCJuZWdhdGl2ZSB0aW1lVXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiaXNTeW5jIiwgMSk7CiAKICAgICBtZW1tb3ZlKAogICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpLApAQCAtNTU2LDE1ICs1NjgsMjQgQEAKICAgICB9CiAKICAgICBBQml0UmVhZGVyIGJpdHMobUJ1ZmZlci0+ZGF0YSgpLCA0KTsKLSAgICBDSEVDS19FUShiaXRzLmdldEJpdHMoOCksIDB4YTApOworICAgIGlmIChiaXRzLmdldEJpdHMoOCkgIT0gMHhhMCkgeworICAgICAgICBBTE9HRSgiVW5leHBlY3RlZCBiaXQgdmFsdWVzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICAgICB1bnNpZ25lZCBudW1BVXMgPSBiaXRzLmdldEJpdHMoOCk7CiAgICAgYml0cy5za2lwQml0cyg4KTsKICAgICB1bnNpZ25lZCBxdWFudGl6YXRpb25fd29yZF9sZW5ndGggX191bnVzZWQgPSBiaXRzLmdldEJpdHMoMik7CiAgICAgdW5zaWduZWQgYXVkaW9fc2FtcGxpbmdfZnJlcXVlbmN5ID0gYml0cy5nZXRCaXRzKDMpOwogICAgIHVuc2lnbmVkIG51bV9jaGFubmVscyA9IGJpdHMuZ2V0Qml0cygzKTsKIAotICAgIENIRUNLX0VRKGF1ZGlvX3NhbXBsaW5nX2ZyZXF1ZW5jeSwgMik7ICAvLyA0OGtIegotICAgIENIRUNLX0VRKG51bV9jaGFubmVscywgMXUpOyAgLy8gc3RlcmVvIQorICAgIGlmIChhdWRpb19zYW1wbGluZ19mcmVxdWVuY3kgIT0gMikgeworICAgICAgICBBTE9HRSgiV3Jvbmcgc2FtcGxpbmcgZnJlcSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKG51bV9jaGFubmVscyAhPSAxdSkgeworICAgICAgICBBTE9HRSgiV3JvbmcgY2hhbm5lbCAjIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAogICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKICAgICAgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKQEAgLTU4Niw4ICs2MDcsMTIgQEAKICAgICBtZW1jcHkoYWNjZXNzVW5pdC0+ZGF0YSgpLCBtQnVmZmVyLT5kYXRhKCkgKyA0LCBwYXlsb2FkU2l6ZSk7CiAKICAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wKHBheWxvYWRTaXplICsgNCk7Ci0gICAgQ0hFQ0tfR0UodGltZVVzLCAwbGwpOworICAgIGlmICh0aW1lVXMgPCAwbGwpIHsKKyAgICAgICAgQUxPR0UoIk5lZ2F0aXZlIHRpbWVVcyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKyAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJpc1N5bmMiLCAxKTsKIAogICAgIGludDE2X3QgKnB0ciA9IChpbnQxNl90ICopYWNjZXNzVW5pdC0+ZGF0YSgpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGF5bG9hZFNpemUgLyBzaXplb2YoaW50MTZfdCk7ICsraSkgewpAQCAtNjA5LDIyICs2MzQsMjUgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgQ0hFQ0soIW1SYW5nZUluZm9zLmVtcHR5KCkpOworICAgIGlmIChtUmFuZ2VJbmZvcy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAogICAgIGNvbnN0IFJhbmdlSW5mbyAmaW5mbyA9ICptUmFuZ2VJbmZvcy5iZWdpbigpOwogICAgIGlmIChtQnVmZmVyLT5zaXplKCkgPCBpbmZvLm1MZW5ndGgpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgQ0hFQ0tfR0UoaW5mby5tVGltZXN0YW1wVXMsIDBsbCk7CisgICAgaWYgKGluZm8ubVRpbWVzdGFtcFVzIDwgMGxsKSB7CisgICAgICAgIEFMT0dFKCJOZWdhdGl2ZSBpbmZvLm1UaW1lc3RhbXBVcyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKICAgICAvLyBUaGUgaWRlYSBoZXJlIGlzIGNvbnN1bWUgYWxsIEFBQyBmcmFtZXMgc3RhcnRpbmcgYXQgb2Zmc2V0cyBiZWZvcmUKICAgICAvLyBpbmZvLm1MZW5ndGggc28gd2UgY2FuIGFzc2lnbiBhIG1lYW5pbmdmdWwgdGltZXN0YW1wIHdpdGhvdXQKICAgICAvLyBoYXZpbmcgdG8gaW50ZXJwb2xhdGUuCiAgICAgLy8gVGhlIGZpbmFsIEFBQyBmcmFtZSBtYXkgd2VsbCBleHRlbmQgaW50byB0aGUgbmV4dCBSYW5nZUluZm8gYnV0CiAgICAgLy8gdGhhdCdzIG9rLgotICAgIC8vIFRPRE86IHRoZSBsb2dpYyBjb21tZW50ZWQgYWJvdmUgaXMgc2tpcHBlZCBiZWNhdXNlIGNvZGVjIGNhbm5vdCB0YWtlCi0gICAgLy8gYXJiaXRyYXJ5IHNpemVkIGlucHV0IGJ1ZmZlcnM7CiAgICAgc2l6ZV90IG9mZnNldCA9IDA7CiAgICAgd2hpbGUgKG9mZnNldCA8IGluZm8ubUxlbmd0aCkgewogICAgICAgICBpZiAob2Zmc2V0ICsgNyA+IG1CdWZmZXItPnNpemUoKSkgewpAQCAtNjM1LDE3ICs2NjMsMjYgQEAKIAogICAgICAgICAvLyBhZHRzX2ZpeGVkX2hlYWRlcgogCi0gICAgICAgIENIRUNLX0VRKGJpdHMuZ2V0Qml0cygxMiksIDB4ZmZmdSk7CisgICAgICAgIGlmIChiaXRzLmdldEJpdHMoMTIpICE9IDB4ZmZmdSkgeworICAgICAgICAgICAgQUxPR0UoIldyb25nIGF0ZHNfZml4ZWRfaGVhZGVyIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogICAgICAgICBiaXRzLnNraXBCaXRzKDMpOyAgLy8gSUQsIGxheWVyCiAgICAgICAgIGJvb2wgcHJvdGVjdGlvbl9hYnNlbnQgX191bnVzZWQgPSBiaXRzLmdldEJpdHMoMSkgIT0gMDsKIAogICAgICAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7CiAgICAgICAgICAgICB1bnNpZ25lZCBwcm9maWxlID0gYml0cy5nZXRCaXRzKDIpOwotICAgICAgICAgICAgQ0hFQ0tfTkUocHJvZmlsZSwgM3UpOworICAgICAgICAgICAgaWYgKHByb2ZpbGUgPT0gM3UpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgicHJvZmlsZSBzaG91bGQgbm90IGJlIDMiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXggPSBiaXRzLmdldEJpdHMoNCk7CiAgICAgICAgICAgICBiaXRzLmdldEJpdHMoMSk7ICAvLyBwcml2YXRlX2JpdAogICAgICAgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uID0gYml0cy5nZXRCaXRzKDMpOwotICAgICAgICAgICAgQ0hFQ0tfTkUoY2hhbm5lbF9jb25maWd1cmF0aW9uLCAwdSk7CisgICAgICAgICAgICBpZiAoY2hhbm5lbF9jb25maWd1cmF0aW9uID09IDB1KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImNoYW5uZWxfY29uZmlnIHNob3VsZCBub3QgYmUgMCIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYml0cy5za2lwQml0cygyKTsgIC8vIG9yaWdpbmFsX2NvcHksIGhvbWUKIAogICAgICAgICAgICAgbUZvcm1hdCA9IE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgKQEAgLTY1NSw4ICs2OTIsMTQgQEAKIAogICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOwogICAgICAgICAgICAgaW50MzJfdCBudW1DaGFubmVsczsKLSAgICAgICAgICAgIENIRUNLKG1Gb3JtYXQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZVJhdGUpKTsKLSAgICAgICAgICAgIENIRUNLKG1Gb3JtYXQtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbnVtQ2hhbm5lbHMpKTsKKyAgICAgICAgICAgIGlmICghbUZvcm1hdC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiU2FtcGxlUmF0ZSBub3QgZm91bmQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbUZvcm1hdC0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZudW1DaGFubmVscykpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2hhbm5lbENvdW50IG5vdCBmb3VuZCIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBBTE9HSSgiZm91bmQgQUFDIGNvZGVjIGNvbmZpZyAoJWQgSHosICVkIGNoYW5uZWxzKSIsCiAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKTsKQEAgLTY3OSw3ICs3MjIsOCBAQAogCiAgICAgICAgIGlmIChudW1iZXJfb2ZfcmF3X2RhdGFfYmxvY2tzX2luX2ZyYW1lICE9IDApIHsKICAgICAgICAgICAgIC8vIFRvIGJlIGltcGxlbWVudGVkLgotICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgIEFMT0dFKCJTaG91bGQgbm90IHJlYWNoIGhlcmUuIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChvZmZzZXQgKyBhYWNfZnJhbWVfbGVuZ3RoID4gbUJ1ZmZlci0+c2l6ZSgpKSB7CkBAIC02ODksMTIgKzczMyw5IEBACiAgICAgICAgIHNpemVfdCBoZWFkZXJTaXplIF9fdW51c2VkID0gcHJvdGVjdGlvbl9hYnNlbnQgPyA3IDogOTsKIAogICAgICAgICBvZmZzZXQgKz0gYWFjX2ZyYW1lX2xlbmd0aDsKLSAgICAgICAgLy8gVE9ETzogbW92ZSBiYWNrIHRvIGNvbmNhdGVuYXRpb24gd2hlbiBjb2RlYyBjYW4gc3VwcG9ydCBhcmJpdHJhcnkgaW5wdXQgYnVmZmVycy4KLSAgICAgICAgLy8gRm9yIG5vdyBvbmx5IHF1ZXVlIGEgc2luZ2xlIGJ1ZmZlcgotICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wQUFDKG9mZnNldCk7CisgICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcChvZmZzZXQpOwogCiAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKG9mZnNldCk7CiAgICAgbWVtY3B5KGFjY2Vzc1VuaXQtPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpLCBvZmZzZXQpOwpAQCAtNzA0LDYgKzc0NSw3IEBACiAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpIC0gb2Zmc2V0KTsKIAogICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiaXNTeW5jIiwgMSk7CiAKICAgICByZXR1cm4gYWNjZXNzVW5pdDsKIH0KQEAgLTcxMyw3ICs3NTUsOSBAQAogICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogCiAgICAgd2hpbGUgKHNpemUgPiAwKSB7Ci0gICAgICAgIENIRUNLKCFtUmFuZ2VJbmZvcy5lbXB0eSgpKTsKKyAgICAgICAgaWYgKG1SYW5nZUluZm9zLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0aW1lVXM7CisgICAgICAgIH0KIAogICAgICAgICBSYW5nZUluZm8gKmluZm8gPSAmKm1SYW5nZUluZm9zLmJlZ2luKCk7CiAKQEAgLTc0MSw1MCArNzg1LDYgQEAKICAgICByZXR1cm4gdGltZVVzOwogfQogCi0vLyBUT0RPOiBhdm9pZCBpbnRlcnBvbGF0aW5nIHRpbWVzdGFtcHMgb25jZSBjb2RlYyBzdXBwb3J0cyBhcmJpdHJhcnkgc2l6ZWQgaW5wdXQgYnVmZmVycwotaW50NjRfdCBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmZldGNoVGltZXN0YW1wQUFDKHNpemVfdCBzaXplKSB7Ci0gICAgaW50NjRfdCB0aW1lVXMgPSAtMTsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLQotICAgIHNpemVfdCBzYW1wbGVzaXplID0gc2l6ZTsKLSAgICB3aGlsZSAoc2l6ZSA+IDApIHsKLSAgICAgICAgQ0hFQ0soIW1SYW5nZUluZm9zLmVtcHR5KCkpOwotCi0gICAgICAgIFJhbmdlSW5mbyAqaW5mbyA9ICYqbVJhbmdlSW5mb3MuYmVnaW4oKTsKLQotICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgIHRpbWVVcyA9IGluZm8tPm1UaW1lc3RhbXBVczsKLSAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaW5mby0+bUxlbmd0aCA+IHNpemUpIHsKLSAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKLSAgICAgICAgICAgIENIRUNLKG1Gb3JtYXQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZVJhdGUpKTsKLSAgICAgICAgICAgIGluZm8tPm1MZW5ndGggLT0gc2l6ZTsKLSAgICAgICAgICAgIHNpemVfdCBudW1TYW1wbGVzID0gMTAyNCAqIHNpemUgLyBzYW1wbGVzaXplOwotICAgICAgICAgICAgaW5mby0+bVRpbWVzdGFtcFVzICs9IG51bVNhbXBsZXMgKiAxMDAwMDAwbGwgLyBzYW1wbGVSYXRlOwotICAgICAgICAgICAgc2l6ZSA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzaXplIC09IGluZm8tPm1MZW5ndGg7Ci0KLSAgICAgICAgICAgIG1SYW5nZUluZm9zLmVyYXNlKG1SYW5nZUluZm9zLmJlZ2luKCkpOwotICAgICAgICAgICAgaW5mbyA9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIGlmICh0aW1lVXMgPT0gMGxsKSB7Ci0gICAgICAgIEFMT0dWKCJSZXR1cm5pbmcgMCB0aW1lc3RhbXAiKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGltZVVzOwotfQotCi1zdHJ1Y3QgTkFMUG9zaXRpb24gewotICAgIHNpemVfdCBuYWxPZmZzZXQ7Ci0gICAgc2l6ZV90IG5hbFNpemU7Ci19OwotCiBzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0SDI2NCgpIHsKICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gbUJ1ZmZlci0+ZGF0YSgpOwogCkBAIC03OTIsMTEgKzc5MiwxMyBAQAogICAgIFZlY3RvcjxOQUxQb3NpdGlvbj4gbmFsczsKIAogICAgIHNpemVfdCB0b3RhbFNpemUgPSAwOworICAgIHNpemVfdCBzZWlDb3VudCA9IDA7CiAKICAgICBzdGF0dXNfdCBlcnI7CiAgICAgY29uc3QgdWludDhfdCAqbmFsU3RhcnQ7CiAgICAgc2l6ZV90IG5hbFNpemU7CiAgICAgYm9vbCBmb3VuZFNsaWNlID0gZmFsc2U7CisgICAgYm9vbCBmb3VuZElEUiA9IGZhbHNlOwogICAgIHdoaWxlICgoZXJyID0gZ2V0TmV4dE5BTFVuaXQoJmRhdGEsICZzaXplLCAmbmFsU3RhcnQsICZuYWxTaXplKSkgPT0gT0spIHsKICAgICAgICAgaWYgKG5hbFNpemUgPT0gMCkgY29udGludWU7CiAKQEAgLTgwNCw2ICs4MDYsOSBAQAogICAgICAgICBib29sIGZsdXNoID0gZmFsc2U7CiAKICAgICAgICAgaWYgKG5hbFR5cGUgPT0gMSB8fCBuYWxUeXBlID09IDUpIHsKKyAgICAgICAgICAgIGlmIChuYWxUeXBlID09IDUpIHsKKyAgICAgICAgICAgICAgICBmb3VuZElEUiA9IHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZm91bmRTbGljZSkgewogICAgICAgICAgICAgICAgIEFCaXRSZWFkZXIgYnIobmFsU3RhcnQgKyAxLCBuYWxTaXplKTsKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmaXJzdF9tYl9pbl9zbGljZSA9IHBhcnNlVUUoJmJyKTsKQEAgLTgyMSw2ICs4MjYsOSBAQAogICAgICAgICAgICAgLy8gbmV4dCBmcmFtZS4KIAogICAgICAgICAgICAgZmx1c2ggPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKG5hbFR5cGUgPT0gNiAmJiBuYWxTaXplID4gMCkgeworICAgICAgICAgICAgLy8gZm91bmQgbm9uLXplcm8gc2l6ZWQgU0VJCisgICAgICAgICAgICArK3NlaUNvdW50OwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGZsdXNoKSB7CkBAIC04MjksMjEgKzgzNywzMiBAQAogCiAgICAgICAgICAgICBzaXplX3QgYXVTaXplID0gNCAqIG5hbHMuc2l6ZSgpICsgdG90YWxTaXplOwogICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKGF1U2l6ZSk7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBzZWk7CisKKyAgICAgICAgICAgIGlmIChzZWlDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBzZWkgPSBuZXcgQUJ1ZmZlcihzZWlDb3VudCAqIHNpemVvZihOQUxQb3NpdGlvbikpOworICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0QnVmZmVyKCJzZWkiLCBzZWkpOworICAgICAgICAgICAgfQogCiAjaWYgIUxPR19OREVCVUcKICAgICAgICAgICAgIEFTdHJpbmcgb3V0OwogI2VuZGlmCiAKICAgICAgICAgICAgIHNpemVfdCBkc3RPZmZzZXQgPSAwOworICAgICAgICAgICAgc2l6ZV90IHNlaUluZGV4ID0gMDsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmFscy5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgICAgIGNvbnN0IE5BTFBvc2l0aW9uICZwb3MgPSBuYWxzLml0ZW1BdChpKTsKIAogICAgICAgICAgICAgICAgIHVuc2lnbmVkIG5hbFR5cGUgPSBtQnVmZmVyLT5kYXRhKClbcG9zLm5hbE9mZnNldF0gJiAweDFmOwogCi0gICAgICAgICAgICAgICAgaWYgKG5hbFR5cGUgPT0gNikgewotICAgICAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBzZWkgPSBuZXcgQUJ1ZmZlcihwb3MubmFsU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweShzZWktPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpICsgcG9zLm5hbE9mZnNldCwgcG9zLm5hbFNpemUpOwotICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEJ1ZmZlcigic2VpIiwgc2VpKTsKKyAgICAgICAgICAgICAgICBpZiAobmFsVHlwZSA9PSA2ICYmIHBvcy5uYWxTaXplID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2VpSW5kZXggPj0gc2VpLT5zaXplKCkgLyBzaXplb2YoTkFMUG9zaXRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiV3Jvbmcgc2VpSW5kZXgiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIE5BTFBvc2l0aW9uICZzZWlQb3MgPSAoKE5BTFBvc2l0aW9uICopc2VpLT5kYXRhKCkpW3NlaUluZGV4KytdOworICAgICAgICAgICAgICAgICAgICBzZWlQb3MubmFsT2Zmc2V0ID0gZHN0T2Zmc2V0ICsgNDsKKyAgICAgICAgICAgICAgICAgICAgc2VpUG9zLm5hbFNpemUgPSBwb3MubmFsU2l6ZTsKICAgICAgICAgICAgICAgICB9CiAKICNpZiAhTE9HX05ERUJVRwpAQCAtODc4LDkgKzg5NywxNSBAQAogICAgICAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpIC0gbmV4dFNjYW4pOwogCiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wKG5leHRTY2FuKTsKLSAgICAgICAgICAgIENIRUNLX0dFKHRpbWVVcywgMGxsKTsKKyAgICAgICAgICAgIGlmICh0aW1lVXMgPCAwbGwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiTmVnYXRpdmUgdGltZVVzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgICAgICAgICBpZiAoZm91bmRJRFIpIHsKKyAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJpc1N5bmMiLCAxKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1Gb3JtYXQgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIG1Gb3JtYXQgPSBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoYWNjZXNzVW5pdCk7CkBAIC04OTcsNyArOTIyLDEwIEBACiAKICAgICAgICAgdG90YWxTaXplICs9IG5hbFNpemU7CiAgICAgfQotICAgIENIRUNLX0VRKGVyciwgKHN0YXR1c190KS1FQUdBSU4pOworICAgIGlmIChlcnIgIT0gKHN0YXR1c190KS1FQUdBSU4pIHsKKyAgICAgICAgQUxPR0UoIlVuZXhwZXRlZCBlcnIiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCiAgICAgcmV0dXJuIE5VTEw7CiB9CkBAIC05MTQsOSArOTQyLDEyIEBACiAKICAgICBzaXplX3QgZnJhbWVTaXplOwogICAgIGludCBzYW1wbGluZ1JhdGUsIG51bUNoYW5uZWxzLCBiaXRyYXRlLCBudW1TYW1wbGVzOwotICAgIENIRUNLKEdldE1QRUdBdWRpb0ZyYW1lU2l6ZSgKKyAgICBpZiAoIUdldE1QRUdBdWRpb0ZyYW1lU2l6ZSgKICAgICAgICAgICAgICAgICBoZWFkZXIsICZmcmFtZVNpemUsICZzYW1wbGluZ1JhdGUsICZudW1DaGFubmVscywKLSAgICAgICAgICAgICAgICAmYml0cmF0ZSwgJm51bVNhbXBsZXMpKTsKKyAgICAgICAgICAgICAgICAmYml0cmF0ZSwgJm51bVNhbXBsZXMpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGF1ZGlvIGZyYW1lIHNpemUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCiAgICAgaWYgKHNpemUgPCBmcmFtZVNpemUpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC05MzQsOSArOTY1LDEzIEBACiAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpIC0gZnJhbWVTaXplKTsKIAogICAgIGludDY0X3QgdGltZVVzID0gZmV0Y2hUaW1lc3RhbXAoZnJhbWVTaXplKTsKLSAgICBDSEVDS19HRSh0aW1lVXMsIDBsbCk7CisgICAgaWYgKHRpbWVVcyA8IDBsbCkgeworICAgICAgICBBTE9HRSgiTmVnYXRpdmUgdGltZVVzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAogICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiaXNTeW5jIiwgMSk7CiAKICAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7CiAgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7CkBAIC05NTUsNyArOTkwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIAogICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxpbmdSYXRlKTsKQEAgLTk2Niw3ICsxMDAxLDEwIEBACiB9CiAKIHN0YXRpYyB2b2lkIEVuY29kZVNpemUxNCh1aW50OF90ICoqX3B0ciwgc2l6ZV90IHNpemUpIHsKLSAgICBDSEVDS19MRShzaXplLCAweDNmZmYpOworICAgIGlmIChzaXplID4gMHgzZmZmKSB7CisgICAgICAgIEFMT0dFKCJXcm9uZyBzaXplIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICB1aW50OF90ICpwdHIgPSAqX3B0cjsKIApAQCAtMTAxMyw2ICsxMDUxLDkgQEAKICAgICBpbnQgcHByZXZTdGFydENvZGUgPSAtMTsKICAgICBpbnQgcHJldlN0YXJ0Q29kZSA9IC0xOwogICAgIGludCBjdXJyZW50U3RhcnRDb2RlID0gLTE7CisgICAgYm9vbCBnb3BGb3VuZCA9IGZhbHNlOworICAgIGJvb2wgaXNDbG9zZWRHb3AgPSBmYWxzZTsKKyAgICBib29sIGJyb2tlbkxpbmsgPSBmYWxzZTsKIAogICAgIHNpemVfdCBvZmZzZXQgPSAwOwogICAgIHdoaWxlIChvZmZzZXQgKyAzIDwgc2l6ZSkgewpAQCAtMTAzOCw3ICsxMDc5LDEwIEBACiAgICAgICAgICAgICAvLyBzZXFIZWFkZXIgd2l0aG91dC93aXRoIGV4dGVuc2lvbgogCiAgICAgICAgICAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfR0Uoc2l6ZSwgN3UpOworICAgICAgICAgICAgICAgIGlmIChzaXplIDwgN3UpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlNpemUgdG9vIHNtYWxsIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIHVuc2lnbmVkIHdpZHRoID0KICAgICAgICAgICAgICAgICAgICAgKGRhdGFbNF0gPDwgNCkgfCBkYXRhWzVdID4+IDQ7CkBAIC0xMDc1LDYgKzExMTksMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIGlmIChtRm9ybWF0ICE9IE5VTEwgJiYgY3VycmVudFN0YXJ0Q29kZSA9PSAweGI4KSB7CisgICAgICAgICAgICAvLyBHT1AgbGF5ZXIKKyAgICAgICAgICAgIGdvcEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIGlzQ2xvc2VkR29wID0gKGRhdGFbb2Zmc2V0ICsgN10gJiAweDQwKSAhPSAwOworICAgICAgICAgICAgYnJva2VuTGluayA9IChkYXRhW29mZnNldCArIDddICYgMHgyMCkgIT0gMDsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChtRm9ybWF0ICE9IE5VTEwgJiYgY3VycmVudFN0YXJ0Q29kZSA9PSAweDAwKSB7CiAgICAgICAgICAgICAvLyBQaWN0dXJlIHN0YXJ0CiAKQEAgLTEwOTEsMTEgKzExNDIsMTcgQEAKICAgICAgICAgICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkgLSBvZmZzZXQpOwogCiAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcChvZmZzZXQpOwotICAgICAgICAgICAgICAgIENIRUNLX0dFKHRpbWVVcywgMGxsKTsKKyAgICAgICAgICAgICAgICBpZiAodGltZVVzIDwgMGxsKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOZWdhdGl2ZSB0aW1lVXMiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDsKIAogICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgaWYgKGdvcEZvdW5kICYmICghYnJva2VuTGluayB8fCBpc0Nsb3NlZEdvcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiaXNTeW5jIiwgMSk7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgQUxPR1YoInJldHVybmluZyBNUEVHIHZpZGVvIGFjY2VzcyB1bml0IGF0IHRpbWUgJSIgUFJJZDY0ICIgdXMiLAogICAgICAgICAgICAgICAgICAgICAgIHRpbWVVcyk7CkBAIC0xMTIxLDcgKzExNzgsNyBAQAogICAgIH0KIAogICAgIGlmIChtZW1jbXAoa1N0YXJ0Q29kZSwgZGF0YSwgMykpIHsKLSAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgcmV0dXJuIC1FQUdBSU47CiAgICAgfQogCiAgICAgc2l6ZV90IG9mZnNldCA9IDM7CkBAIC0xMTgxLDI1ICsxMjM4LDM3IEBACiAKICAgICAgICAgICAgIGNhc2UgRVhQRUNUX1ZJU1VBTF9PQkpFQ1RfU1RBUlQ6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEoY2h1bmtUeXBlLCAweGI1KTsKKyAgICAgICAgICAgICAgICBpZiAoY2h1bmtUeXBlICE9IDB4YjUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlVuZXhwZWN0ZWQgY2h1bmtUeXBlIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBzdGF0ZSA9IEVYUEVDVF9WT19TVEFSVDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgY2FzZSBFWFBFQ1RfVk9fU1RBUlQ6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfTEUoY2h1bmtUeXBlLCAweDFmKTsKKyAgICAgICAgICAgICAgICBpZiAoY2h1bmtUeXBlID4gMHgxZikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVW5leHBlY3RlZCBjaHVua1R5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHN0YXRlID0gRVhQRUNUX1ZPTF9TVEFSVDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgY2FzZSBFWFBFQ1RfVk9MX1NUQVJUOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENIRUNLKChjaHVua1R5cGUgJiAweGYwKSA9PSAweDIwKTsKKyAgICAgICAgICAgICAgICBpZiAoKGNodW5rVHlwZSAmIDB4ZjApICE9IDB4MjApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIldyb25nIGNodW5rVHlwZSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBDSEVDSyhFeHRyYWN0RGltZW5zaW9uc0Zyb21WT0xIZWFkZXIoCisgICAgICAgICAgICAgICAgaWYgKCFFeHRyYWN0RGltZW5zaW9uc0Zyb21WT0xIZWFkZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFbb2Zmc2V0XSwgY2h1bmtTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCwgJmhlaWdodCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCwgJmhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgZGltZW5zaW9uIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIHN0YXRlID0gV0FJVF9GT1JfVk9QX1NUQVJUOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTI0MCw2ICsxMzA5LDggQEAKICAgICAgICAgICAgIGNhc2UgU0tJUF9UT19WT1BfU1RBUlQ6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKGNodW5rVHlwZSA9PSAweGI2KSB7CisgICAgICAgICAgICAgICAgICAgIGludCB2b3BDb2RpbmdUeXBlID0gKGRhdGFbb2Zmc2V0ICsgNF0gJiAweGMwKSA+PiA2OworCiAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBjaHVua1NpemU7CiAKICAgICAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKG9mZnNldCk7CkBAIC0xMjUwLDExICsxMzIxLDE3IEBACiAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIHNpemUpOwogCiAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVVzID0gZmV0Y2hUaW1lc3RhbXAob2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfR0UodGltZVVzLCAwbGwpOworICAgICAgICAgICAgICAgICAgICBpZiAodGltZVVzIDwgMGxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTmVnYXRpdmUgdGltZXVzIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IDA7CiAKICAgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZvcENvZGluZ1R5cGUgPT0gMCkgeyAgLy8gaW50cmEtY29kZWQgVk9QCisgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJpc1N5bmMiLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZXR1cm5pbmcgTVBFRzQgdmlkZW8gYWNjZXNzIHVuaXQgYXQgdGltZSAlIiBQUklkNjQgIiB1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzKTsKQEAgLTEyNzEsNyArMTM0OCw4IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiVW5rbm93biBzdGF0ZTogJWQiLCBzdGF0ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZGlzY2FyZCkgewpAQCAtMTMwMCw1ICsxMzc4LDI1IEBACiAgICAgfQogfQogCitzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0TWV0YWRhdGEoKSB7CisgICAgc2l6ZV90IHNpemUgPSBtQnVmZmVyLT5zaXplKCk7CisgICAgaWYgKCFzaXplKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBuZXcgQUJ1ZmZlcihzaXplKTsKKyAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wKHNpemUpOworICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisKKyAgICBtZW1jcHkoYWNjZXNzVW5pdC0+ZGF0YSgpLCBtQnVmZmVyLT5kYXRhKCksIHNpemUpOworICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIDApOworCisgICAgaWYgKG1Gb3JtYXQgPT0gTlVMTCkgeworICAgICAgICBtRm9ybWF0ID0gbmV3IE1ldGFEYXRhOworICAgICAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfREFUQV9USU1FRF9JRDMpOworICAgIH0KKworICAgIHJldHVybiBhY2Nlc3NVbml0OworfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaAppbmRleCBhNmQ4MTJmLi5lOWY5NmI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaApAQCAtMzcsNiArMzcsNyBAQAogICAgICAgICBNUEVHX1ZJREVPLAogICAgICAgICBNUEVHNF9WSURFTywKICAgICAgICAgUENNX0FVRElPLAorICAgICAgICBNRVRBREFUQSwKICAgICB9OwogCiAgICAgZW51bSBGbGFncyB7CkBAIC03NSwxMSArNzYsMTEgQEAKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdE1QRUdWaWRlbygpOwogICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0TVBFRzRWaWRlbygpOwogICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0UENNQXVkaW8oKTsKKyAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdE1ldGFkYXRhKCk7CiAKICAgICAvLyBjb25zdW1lIGEgbG9naWNhbCAoY29tcHJlc3NlZCkgYWNjZXNzIHVuaXQgb2Ygc2l6ZSAic2l6ZSIsCiAgICAgLy8gcmV0dXJucyBpdHMgdGltZXN0YW1wIGluIHVzIChvciAtMSBpZiBubyB0aW1lIGluZm9ybWF0aW9uKS4KICAgICBpbnQ2NF90IGZldGNoVGltZXN0YW1wKHNpemVfdCBzaXplKTsKLSAgICBpbnQ2NF90IGZldGNoVGltZXN0YW1wQUFDKHNpemVfdCBzaXplKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEVsZW1lbnRhcnlTdHJlYW1RdWV1ZSk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlBTRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJQU0V4dHJhY3Rvci5jcHAKaW5kZXggODU4NTlmNy4uNmQ5ZmU5ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlBTRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyUFNFeHRyYWN0b3IuY3BwCkBAIC0yNjUsNyArMjY1LDEwIEBACiAgICAgfQogCiAgICAgdW5zaWduZWQgUEVTX3BhY2tldF9sZW5ndGggPSBVMTZfQVQobUJ1ZmZlci0+ZGF0YSgpICsgNCk7Ci0gICAgQ0hFQ0tfTkUoUEVTX3BhY2tldF9sZW5ndGgsIDB1KTsKKyAgICBpZiAoUEVTX3BhY2tldF9sZW5ndGggPT0gMHUpIHsKKyAgICAgICAgQUxPR0UoIlBFU19wYWNrZXRfbGVuZ3RoIGlzIDAiKTsKKyAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgfQogCiAgICAgc2l6ZV90IG4gPSBQRVNfcGFja2V0X2xlbmd0aCArIDY7CiAKQEAgLTI4Niw3ICsyODksMTAgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKLSAgICBDSEVDS19FUShwYWNrZXRfc3RhcnRjb2RlX3ByZWZpeCwgMHgwMDAwMDF1KTsKKyAgICBpZiAocGFja2V0X3N0YXJ0Y29kZV9wcmVmaXggIT0gMHgwMDAwMDF1KSB7CisgICAgICAgIEFMT0dFKCJXcm9uZyBQRVMgcHJlZml4Iik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQogCiAgICAgdW5zaWduZWQgc3RyZWFtX2lkID0gYnIuZ2V0Qml0cyg4KTsKICAgICBBTE9HVigic3RyZWFtX2lkID0gMHglMDJ4Iiwgc3RyZWFtX2lkKTsKQEAgLTM2Niw4ICszNzIsNyBAQAogICAgICAgICAgICAgJiYgc3RyZWFtX2lkICE9IDB4ZmYgIC8vIHByb2dyYW1fc3RyZWFtX2RpcmVjdG9yeQogICAgICAgICAgICAgJiYgc3RyZWFtX2lkICE9IDB4ZjIgIC8vIERTTUNDCiAgICAgICAgICAgICAmJiBzdHJlYW1faWQgIT0gMHhmOCkgeyAgLy8gSC4yMjIuMSB0eXBlIEUKLSAgICAgICAgQ0hFQ0tfRVEoYnIuZ2V0Qml0cygyKSwgMnUpOwotCisgICAgICAgIC8qIHVuc2lnbmVkIFBFU19tYXJrZXJfYml0cyA9ICovYnIuZ2V0Qml0cygyKTsgIC8vIHNob3VsZCBiZSAweDIoaGV4KQogICAgICAgICAvKiB1bnNpZ25lZCBQRVNfc2NyYW1ibGluZ19jb250cm9sID0gKi9ici5nZXRCaXRzKDIpOwogICAgICAgICAvKiB1bnNpZ25lZCBQRVNfcHJpb3JpdHkgPSAqL2JyLmdldEJpdHMoMSk7CiAgICAgICAgIC8qIHVuc2lnbmVkIGRhdGFfYWxpZ25tZW50X2luZGljYXRvciA9ICovYnIuZ2V0Qml0cygxKTsKQEAgLTQwMCwxNiArNDA1LDI2IEBACiAgICAgICAgIHVpbnQ2NF90IFBUUyA9IDAsIERUUyA9IDA7CiAKICAgICAgICAgaWYgKFBUU19EVFNfZmxhZ3MgPT0gMiB8fCBQVFNfRFRTX2ZsYWdzID09IDMpIHsKLSAgICAgICAgICAgIENIRUNLX0dFKG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZywgNXUpOworICAgICAgICAgICAgaWYgKG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyA8IDV1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQ0hFQ0tfRVEoYnIuZ2V0Qml0cyg0KSwgUFRTX0RUU19mbGFncyk7CisgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cyg0KSAhPSBQVFNfRFRTX2ZsYWdzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgUFRTID0gKCh1aW50NjRfdClici5nZXRCaXRzKDMpKSA8PCAzMDsKLSAgICAgICAgICAgIENIRUNLX0VRKGJyLmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIFBUUyB8PSAoKHVpbnQ2NF90KWJyLmdldEJpdHMoMTUpKSA8PCAxNTsKLSAgICAgICAgICAgIENIRUNLX0VRKGJyLmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIFBUUyB8PSBici5nZXRCaXRzKDE1KTsKLSAgICAgICAgICAgIENIRUNLX0VRKGJyLmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQUxPR1YoIlBUUyA9ICUiIFBSSXU2NCwgUFRTKTsKICAgICAgICAgICAgIC8vIEFMT0dJKCJQVFMgPSAlLjJmIHNlY3MiLCBQVFMgLyA5MDAwMC4wZik7CkBAIC00MTcsMTYgKzQzMiwyNiBAQAogICAgICAgICAgICAgb3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIC09IDU7CiAKICAgICAgICAgICAgIGlmIChQVFNfRFRTX2ZsYWdzID09IDMpIHsKLSAgICAgICAgICAgICAgICBDSEVDS19HRShvcHRpb25hbF9ieXRlc19yZW1haW5pbmcsIDV1KTsKKyAgICAgICAgICAgICAgICBpZiAob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIDwgNXUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBDSEVDS19FUShici5nZXRCaXRzKDQpLCAxdSk7CisgICAgICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoNCkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBEVFMgPSAoKHVpbnQ2NF90KWJyLmdldEJpdHMoMykpIDw8IDMwOwotICAgICAgICAgICAgICAgIENIRUNLX0VRKGJyLmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBEVFMgfD0gKCh1aW50NjRfdClici5nZXRCaXRzKDE1KSkgPDwgMTU7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEoYnIuZ2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIERUUyB8PSBici5nZXRCaXRzKDE1KTsKLSAgICAgICAgICAgICAgICBDSEVDS19FUShici5nZXRCaXRzKDEpLCAxdSk7CisgICAgICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBBTE9HVigiRFRTID0gJSIgUFJJdTY0LCBEVFMpOwogCkBAIC00MzUsNDAgKzQ2MCw2MiBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKEVTQ1JfZmxhZykgewotICAgICAgICAgICAgQ0hFQ0tfR0Uob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nLCA2dSk7CisgICAgICAgICAgICBpZiAob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIDwgNnUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBici5nZXRCaXRzKDIpOwogCiAgICAgICAgICAgICB1aW50NjRfdCBFU0NSID0gKCh1aW50NjRfdClici5nZXRCaXRzKDMpKSA8PCAzMDsKLSAgICAgICAgICAgIENIRUNLX0VRKGJyLmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIEVTQ1IgfD0gKCh1aW50NjRfdClici5nZXRCaXRzKDE1KSkgPDwgMTU7Ci0gICAgICAgICAgICBDSEVDS19FUShici5nZXRCaXRzKDEpLCAxdSk7CisgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBFU0NSIHw9IGJyLmdldEJpdHMoMTUpOwotICAgICAgICAgICAgQ0hFQ0tfRVEoYnIuZ2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBBTE9HVigiRVNDUiA9ICUiIFBSSXU2NCwgRVNDUik7CiAgICAgICAgICAgICAvKiB1bnNpZ25lZCBFU0NSX2V4dGVuc2lvbiA9ICovYnIuZ2V0Qml0cyg5KTsKIAotICAgICAgICAgICAgQ0hFQ0tfRVEoYnIuZ2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgLT0gNjsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChFU19yYXRlX2ZsYWcpIHsKLSAgICAgICAgICAgIENIRUNLX0dFKG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZywgM3UpOworICAgICAgICAgICAgaWYgKG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyA8IDN1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQ0hFQ0tfRVEoYnIuZ2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLyogdW5zaWduZWQgRVNfcmF0ZSA9ICovYnIuZ2V0Qml0cygyMik7Ci0gICAgICAgICAgICBDSEVDS19FUShici5nZXRCaXRzKDEpLCAxdSk7CisgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAtPSAzOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCBvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgKiA4KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKICAgICAgICAgYnIuc2tpcEJpdHMob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nICogOCk7CiAKICAgICAgICAgLy8gRVMgZGF0YSBmb2xsb3dzLgogCi0gICAgICAgIENIRUNLX0dFKFBFU19wYWNrZXRfbGVuZ3RoLCBQRVNfaGVhZGVyX2RhdGFfbGVuZ3RoICsgMyk7CisgICAgICAgIGlmIChQRVNfcGFja2V0X2xlbmd0aCA8IFBFU19oZWFkZXJfZGF0YV9sZW5ndGggKyAzKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CiAKICAgICAgICAgdW5zaWduZWQgZGF0YUxlbmd0aCA9CiAgICAgICAgICAgICBQRVNfcGFja2V0X2xlbmd0aCAtIDMgLSBQRVNfaGVhZGVyX2RhdGFfbGVuZ3RoOwpAQCAtNDgxLDcgKzUyOCw5IEBACiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAKLSAgICAgICAgQ0hFQ0tfR0UoYnIubnVtQml0c0xlZnQoKSwgZGF0YUxlbmd0aCAqIDgpOworICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IGRhdGFMZW5ndGggKiA4KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CiAKICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1UcmFja3MuaW5kZXhPZktleShzdHJlYW1faWQpOwogICAgICAgICBpZiAoaW5kZXggPCAwICYmIG1TY2FubmluZykgewpAQCAtNTIxLDEwICs1NzAsMTQgQEAKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKHN0cmVhbV9pZCA9PSAweGJlKSB7ICAvLyBwYWRkaW5nX3N0cmVhbQotICAgICAgICBDSEVDS19ORShQRVNfcGFja2V0X2xlbmd0aCwgMHUpOworICAgICAgICBpZiAoUEVTX3BhY2tldF9sZW5ndGggPT0gMHUpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KICAgICAgICAgYnIuc2tpcEJpdHMoUEVTX3BhY2tldF9sZW5ndGggKiA4KTsKICAgICB9IGVsc2UgewotICAgICAgICBDSEVDS19ORShQRVNfcGFja2V0X2xlbmd0aCwgMHUpOworICAgICAgICBpZiAoUEVTX3BhY2tldF9sZW5ndGggPT0gMHUpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KICAgICAgICAgYnIuc2tpcEJpdHMoUEVTX3BhY2tldF9sZW5ndGggKiA4KTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwCmluZGV4IDc0Y2I1ZDguLmNiZTk2NzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlRTRXh0cmFjdG9yLmNwcApAQCAtMTYsMTcgKzE2LDIyIEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTVBFRzJUU0V4dHJhY3RvciIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgogCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvSVN0cmVhbVNvdXJjZS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogI2luY2x1ZGUgIkFub3RoZXJQYWNrZXRTb3VyY2UuaCIKQEAgLTQwLDcgKzQ1LDcgQEAKICAgICBNUEVHMlRTU291cmNlKAogICAgICAgICAgICAgY29uc3Qgc3A8TVBFRzJUU0V4dHJhY3Rvcj4gJmV4dHJhY3RvciwKICAgICAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsLAotICAgICAgICAgICAgYm9vbCBzZWVrYWJsZSk7CisgICAgICAgICAgICBib29sIGRvZXNTZWVrKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwpAQCAtNTQsOCArNTksOCBAQAogICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IG1JbXBsOwogCiAgICAgLy8gSWYgdGhlcmUgYXJlIGJvdGggYXVkaW8gYW5kIHZpZGVvIHN0cmVhbXMsIG9ubHkgdGhlIHZpZGVvIHN0cmVhbQotICAgIC8vIHdpbGwgYmUgc2Vla2FibGUsIG90aGVyd2lzZSB0aGUgc2luZ2xlIHN0cmVhbSB3aWxsIGJlIHNlZWthYmxlLgotICAgIGJvb2wgbVNlZWthYmxlOworICAgIC8vIHdpbGwgc2lnbmFsIHNlZWsgb24gdGhlIGV4dHJhY3Rvcjsgb3RoZXJ3aXNlIHRoZSBzaW5nbGUgc3RyZWFtIHdpbGwgc2Vlay4KKyAgICBib29sIG1Eb2VzU2VlazsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1QRUcyVFNTb3VyY2UpOwogfTsKQEAgLTYzLDEwICs2OCwxMCBAQAogTVBFRzJUU1NvdXJjZTo6TVBFRzJUU1NvdXJjZSgKICAgICAgICAgY29uc3Qgc3A8TVBFRzJUU0V4dHJhY3Rvcj4gJmV4dHJhY3RvciwKICAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwsCi0gICAgICAgIGJvb2wgc2Vla2FibGUpCisgICAgICAgIGJvb2wgZG9lc1NlZWspCiAgICAgOiBtRXh0cmFjdG9yKGV4dHJhY3RvciksCiAgICAgICBtSW1wbChpbXBsKSwKLSAgICAgIG1TZWVrYWJsZShzZWVrYWJsZSkgeworICAgICAgbURvZXNTZWVrKGRvZXNTZWVrKSB7CiB9CiAKIHN0YXR1c190IE1QRUcyVFNTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKQEAgLTg1LDI3ICs5MCwxOCBAQAogICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICAqb3V0ID0gTlVMTDsKIAotICAgIHN0YXR1c190IGZpbmFsUmVzdWx0OwotICAgIHdoaWxlICghbUltcGwtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7Ci0gICAgICAgIGlmIChmaW5hbFJlc3VsdCAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5mZWVkTW9yZSgpOworICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgc2Vla01vZGU7CisgICAgaWYgKG1Eb2VzU2VlayAmJiBvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJnNlZWtNb2RlKSkgeworICAgICAgICAvLyBzZWVrIGlzIG5lZWRlZAorICAgICAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5zZWVrKHNlZWtUaW1lVXMsIHNlZWtNb2RlKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgbUltcGwtPnNpZ25hbEVPUyhlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgIH0KIAotICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgc2Vla01vZGU7Ci0gICAgaWYgKG1TZWVrYWJsZSAmJiBvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJnNlZWtNb2RlKSkgewotICAgICAgICAvLyBBIHNlZWsgd2FzIHJlcXVlc3RlZCwgYnV0IHdlIGRvbid0IGFjdHVhbGx5IHN1cHBvcnQgc2Vla2luZyBhbmQgc28gY2FuIG9ubHkgInNlZWsiIHRvCi0gICAgICAgIC8vIHRoZSBjdXJyZW50IHBvc2l0aW9uCi0gICAgICAgIGludDY0X3QgbmV4dEJ1ZlRpbWVVczsKLSAgICAgICAgaWYgKG1JbXBsLT5uZXh0QnVmZmVyVGltZSgmbmV4dEJ1ZlRpbWVVcykgIT0gT0sgfHwgc2Vla1RpbWVVcyAhPSBuZXh0QnVmVGltZVVzKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgICAgIH0KKyAgICBpZiAobUV4dHJhY3Rvci0+ZmVlZFVudGlsQnVmZmVyQXZhaWxhYmxlKG1JbXBsKSAhPSBPSykgeworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9CiAKICAgICByZXR1cm4gbUltcGwtPnJlYWQob3V0LCBvcHRpb25zKTsKQEAgLTEyOSwyMCArMTI1LDEwIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGJvb2wgc2Vla2FibGUgPSB0cnVlOwotICAgIGlmIChtU291cmNlSW1wbHMuc2l6ZSgpID4gMSkgewotICAgICAgICBDSEVDS19FUShtU291cmNlSW1wbHMuc2l6ZSgpLCAydSk7Ci0KLSAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtU291cmNlSW1wbHMuZWRpdEl0ZW1BdChpbmRleCktPmdldEZvcm1hdCgpOwotICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7Ci0KLSAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgiYXVkaW8vIiwgbWltZSwgNikpIHsKLSAgICAgICAgICAgIHNlZWthYmxlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3IE1QRUcyVFNTb3VyY2UodGhpcywgbVNvdXJjZUltcGxzLmVkaXRJdGVtQXQoaW5kZXgpLCBzZWVrYWJsZSk7CisgICAgLy8gVGhlIHNlZWsgcmVmZXJlbmNlIHRyYWNrICh2aWRlbyBpZiBwcmVzZW50OyBhdWRpbyBvdGhlcndpc2UpIHBlcmZvcm1zCisgICAgLy8gc2VlayByZXF1ZXN0cywgd2hpbGUgb3RoZXIgdHJhY2tzIGlnbm9yZSByZXF1ZXN0cy4KKyAgICByZXR1cm4gbmV3IE1QRUcyVFNTb3VyY2UodGhpcywgbVNvdXJjZUltcGxzLmVkaXRJdGVtQXQoaW5kZXgpLAorICAgICAgICAgICAgKG1TZWVrU3luY1BvaW50cyA9PSAmbVN5bmNQb2ludHMuZWRpdEl0ZW1BdChpbmRleCkpKTsKIH0KIAogc3A8TWV0YURhdGE+IE1QRUcyVFNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCkBAIC0xNjEsNyArMTQ3LDcgQEAKIHZvaWQgTVBFRzJUU0V4dHJhY3Rvcjo6aW5pdCgpIHsKICAgICBib29sIGhhdmVBdWRpbyA9IGZhbHNlOwogICAgIGJvb2wgaGF2ZVZpZGVvID0gZmFsc2U7Ci0gICAgaW50IG51bVBhY2tldHNQYXJzZWQgPSAwOworICAgIGludDY0X3Qgc3RhcnRUaW1lID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKIAogICAgIHdoaWxlIChmZWVkTW9yZSgpID09IE9LKSB7CiAgICAgICAgIGlmIChoYXZlQXVkaW8gJiYgaGF2ZVZpZGVvKSB7CkBAIC0xNzUsNiArMTYxLDggQEAKICAgICAgICAgICAgIGlmIChpbXBsICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBoYXZlVmlkZW8gPSB0cnVlOwogICAgICAgICAgICAgICAgIG1Tb3VyY2VJbXBscy5wdXNoKGltcGwpOworICAgICAgICAgICAgICAgIG1TeW5jUG9pbnRzLnB1c2goKTsKKyAgICAgICAgICAgICAgICBtU2Vla1N5bmNQb2ludHMgPSAmbVN5bmNQb2ludHMuZWRpdFRvcCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTE4NiwxNSArMTc0LDc1IEBACiAgICAgICAgICAgICBpZiAoaW1wbCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgaGF2ZUF1ZGlvID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBtU291cmNlSW1wbHMucHVzaChpbXBsKTsKKyAgICAgICAgICAgICAgICBtU3luY1BvaW50cy5wdXNoKCk7CisgICAgICAgICAgICAgICAgaWYgKCFoYXZlVmlkZW8pIHsKKyAgICAgICAgICAgICAgICAgICAgbVNlZWtTeW5jUG9pbnRzID0gJm1TeW5jUG9pbnRzLmVkaXRUb3AoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKytudW1QYWNrZXRzUGFyc2VkID4gMTAwMDApIHsKKyAgICAgICAgLy8gV2FpdCBvbmx5IGZvciAyIHNlY29uZHMgdG8gZGV0ZWN0IGF1ZGlvL3ZpZGVvIHN0cmVhbXMuCisgICAgICAgIGlmIChBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lID4gMjAwMDAwMGxsKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAotICAgIEFMT0dJKCJoYXZlQXVkaW89JWQsIGhhdmVWaWRlbz0lZCIsIGhhdmVBdWRpbywgaGF2ZVZpZGVvKTsKKyAgICBvZmY2NF90IHNpemU7CisgICAgaWYgKG1EYXRhU291cmNlLT5nZXRTaXplKCZzaXplKSA9PSBPSyAmJiAoaGF2ZUF1ZGlvIHx8IGhhdmVWaWRlbykpIHsKKyAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gaW1wbCA9IGhhdmVWaWRlbworICAgICAgICAgICAgICAgID8gKEFub3RoZXJQYWNrZXRTb3VyY2UgKiltUGFyc2VyLT5nZXRTb3VyY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OlZJREVPKS5nZXQoKQorICAgICAgICAgICAgICAgIDogKEFub3RoZXJQYWNrZXRTb3VyY2UgKiltUGFyc2VyLT5nZXRTb3VyY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkFVRElPKS5nZXQoKTsKKyAgICAgICAgc2l6ZV90IHByZXZTeW5jU2l6ZSA9IDE7CisgICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9IC0xOworICAgICAgICBMaXN0PGludDY0X3Q+IGR1cmF0aW9uczsKKyAgICAgICAgLy8gRXN0aW1hdGUgZHVyYXRpb24gLS0tIHN0YWJpbGl6ZSB1bnRpbCB5b3UgZ2V0IDw1MDBtcyBkZXZpYXRpb24uCisgICAgICAgIHdoaWxlIChmZWVkTW9yZSgpID09IE9LCisgICAgICAgICAgICAgICAgJiYgQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZSA8PSAyMDAwMDAwbGwpIHsKKyAgICAgICAgICAgIGlmIChtU2Vla1N5bmNQb2ludHMtPnNpemUoKSA+IHByZXZTeW5jU2l6ZSkgeworICAgICAgICAgICAgICAgIHByZXZTeW5jU2l6ZSA9IG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpOworICAgICAgICAgICAgICAgIGludDY0X3QgZGlmZlVzID0gbVNlZWtTeW5jUG9pbnRzLT5rZXlBdChwcmV2U3luY1NpemUgLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgLSBtU2Vla1N5bmNQb2ludHMtPmtleUF0KDApOworICAgICAgICAgICAgICAgIG9mZjY0X3QgZGlmZk9mZnNldCA9IG1TZWVrU3luY1BvaW50cy0+dmFsdWVBdChwcmV2U3luY1NpemUgLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgLSBtU2Vla1N5bmNQb2ludHMtPnZhbHVlQXQoMCk7CisgICAgICAgICAgICAgICAgZHVyYXRpb25VcyA9IHNpemUgKiBkaWZmVXMgLyBkaWZmT2Zmc2V0OworICAgICAgICAgICAgICAgIGR1cmF0aW9ucy5wdXNoX2JhY2soZHVyYXRpb25Vcyk7CisgICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9ucy5zaXplKCkgPiA1KSB7CisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9ucy5lcmFzZShkdXJhdGlvbnMuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbWluID0gKmR1cmF0aW9ucy5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1heCA9ICpkdXJhdGlvbnMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChMaXN0PGludDY0X3Q+OjppdGVyYXRvciBpID0gZHVyYXRpb25zLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAhPSBkdXJhdGlvbnMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWluID4gKmkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4gPSAqaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXggPCAqaSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9ICppOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtYXggLSBtaW4gPCA1MDAgKiAxMDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgIGludDY0X3QgYnVmZmVyZWREdXJhdGlvblVzOworICAgICAgICBidWZmZXJlZER1cmF0aW9uVXMgPSBpbXBsLT5nZXRCdWZmZXJlZER1cmF0aW9uVXMoJmVycik7CisgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgZHVyYXRpb25VcyA9IGJ1ZmZlcmVkRHVyYXRpb25VczsKKyAgICAgICAgfQorICAgICAgICBpZiAoZHVyYXRpb25VcyA+IDApIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiBtZXRhID0gaW1wbC0+Z2V0Rm9ybWF0KCk7CisgICAgICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOworICAgICAgICAgICAgaW1wbC0+c2V0Rm9ybWF0KG1ldGEpOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR0koImhhdmVBdWRpbz0lZCwgaGF2ZVZpZGVvPSVkLCBlbGFzcGVkVGltZT0lIiBQUklkNjQsCisgICAgICAgICAgICBoYXZlQXVkaW8sIGhhdmVWaWRlbywgQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZSk7CiB9CiAKIHN0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OmZlZWRNb3JlKCkgewpAQCAtMjEwLDEyICsyNTgsMjA2IEBACiAgICAgICAgIHJldHVybiAobiA8IDApID8gKHN0YXR1c190KW4gOiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgIH0KIAorICAgIEFUU1BhcnNlcjo6U3luY0V2ZW50IGV2ZW50KG1PZmZzZXQpOwogICAgIG1PZmZzZXQgKz0gbjsKLSAgICByZXR1cm4gbVBhcnNlci0+ZmVlZFRTUGFja2V0KHBhY2tldCwga1RTUGFja2V0U2l6ZSk7CisgICAgc3RhdHVzX3QgZXJyID0gbVBhcnNlci0+ZmVlZFRTUGFja2V0KHBhY2tldCwga1RTUGFja2V0U2l6ZSwgJmV2ZW50KTsKKyAgICBpZiAoZXZlbnQuaXNJbml0KCkpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU291cmNlSW1wbHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChtU291cmNlSW1wbHNbaV0uZ2V0KCkgPT0gZXZlbnQuZ2V0TWVkaWFTb3VyY2UoKS5nZXQoKSkgeworICAgICAgICAgICAgICAgIEtleWVkVmVjdG9yPGludDY0X3QsIG9mZjY0X3Q+ICpzeW5jUG9pbnRzID0gJm1TeW5jUG9pbnRzLmVkaXRJdGVtQXQoaSk7CisgICAgICAgICAgICAgICAgc3luY1BvaW50cy0+YWRkKGV2ZW50LmdldFRpbWVVcygpLCBldmVudC5nZXRPZmZzZXQoKSk7CisgICAgICAgICAgICAgICAgLy8gV2UncmUga2VlcGluZyB0aGUgc2l6ZSBvZiB0aGUgc3luYyBwb2ludHMgYXQgbW9zdCA1bWIgcGVyIGEgdHJhY2suCisgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBzeW5jUG9pbnRzLT5zaXplKCk7CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPj0gMzI3NjgwKSB7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZmlyc3RUaW1lVXMgPSBzeW5jUG9pbnRzLT5rZXlBdCgwKTsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBsYXN0VGltZVVzID0gc3luY1BvaW50cy0+a2V5QXQoc2l6ZSAtIDEpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0VGltZVVzKCkgLSBmaXJzdFRpbWVVcyA+IGxhc3RUaW1lVXMgLSBldmVudC5nZXRUaW1lVXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3luY1BvaW50cy0+cmVtb3ZlSXRlbXNBdCgwLCA0MDk2KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNQb2ludHMtPnJlbW92ZUl0ZW1zQXQoc2l6ZSAtIDQwOTYsIDQwOTYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlcnI7CiB9CiAKIHVpbnQzMl90IE1QRUcyVFNFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgewotICAgIHJldHVybiBDQU5fUEFVU0U7CisgICAgcmV0dXJuIENBTl9QQVVTRSB8IENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRDsKK30KKworc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6c2VlayhpbnQ2NF90IHNlZWtUaW1lVXMsCisgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgJnNlZWtNb2RlKSB7CisgICAgaWYgKG1TZWVrU3luY1BvaW50cyA9PSBOVUxMIHx8IG1TZWVrU3luY1BvaW50cy0+aXNFbXB0eSgpKSB7CisgICAgICAgIEFMT0dXKCJObyBzeW5jIHBvaW50IHRvIHNlZWsgdG8uIik7CisgICAgICAgIC8vIC4uLiBhbmQgdGhlcmVmb3JlIHdlIGhhdmUgbm90aGluZyB1c2VmdWwgdG8gZG8gaGVyZS4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIC8vIERldGVybWluZSB3aGV0aGVyIHdlJ3JlIHNlZWtpbmcgYmV5b25kIHRoZSBrbm93biBhcmVhLgorICAgIGJvb2wgc2hvdWxkU2Vla0JleW9uZCA9CisgICAgICAgICAgICAoc2Vla1RpbWVVcyA+IG1TZWVrU3luY1BvaW50cy0+a2V5QXQobVNlZWtTeW5jUG9pbnRzLT5zaXplKCkgLSAxKSk7CisKKyAgICAvLyBEZXRlcm1pbmUgdGhlIHN5bmMgcG9pbnQgdG8gc2Vlay4KKyAgICBzaXplX3QgaW5kZXggPSAwOworICAgIGZvciAoOyBpbmRleCA8IG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpOyArK2luZGV4KSB7CisgICAgICAgIGludDY0X3QgdGltZVVzID0gbVNlZWtTeW5jUG9pbnRzLT5rZXlBdChpbmRleCk7CisgICAgICAgIGlmICh0aW1lVXMgPiBzZWVrVGltZVVzKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAoc2Vla01vZGUpIHsKKyAgICAgICAgY2FzZSBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DOgorICAgICAgICAgICAgaWYgKGluZGV4ID09IG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIk5leHQgc3luYyBub3QgZm91bmQ7IHN0YXJ0aW5nIGZyb20gdGhlIGxhdGVzdCBzeW5jLiIpOworICAgICAgICAgICAgICAgIC0taW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DOgorICAgICAgICBjYXNlIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUOgorICAgICAgICAgICAgQUxPR1coInNlZWtNb2RlIG5vdCBzdXBwb3J0ZWQ6ICVkOyBmYWxsaW5nIGJhY2sgdG8gUFJFVklPVVNfU1lOQyIsCisgICAgICAgICAgICAgICAgICAgIHNlZWtNb2RlKTsKKyAgICAgICAgICAgIC8vIGZhbGwtdGhyb3VnaAorICAgICAgICBjYXNlIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOgorICAgICAgICAgICAgaWYgKGluZGV4ID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiUHJldmlvdXMgc3luYyBub3QgZm91bmQ7IHN0YXJ0aW5nIGZyb20gdGhlIGVhcmxpZXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzeW5jLiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAtLWluZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghc2hvdWxkU2Vla0JleW9uZCB8fCBtT2Zmc2V0IDw9IG1TZWVrU3luY1BvaW50cy0+dmFsdWVBdChpbmRleCkpIHsKKyAgICAgICAgaW50NjRfdCBhY3R1YWxTZWVrVGltZVVzID0gbVNlZWtTeW5jUG9pbnRzLT5rZXlBdChpbmRleCk7CisgICAgICAgIG1PZmZzZXQgPSBtU2Vla1N5bmNQb2ludHMtPnZhbHVlQXQoaW5kZXgpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBxdWV1ZURpc2NvbnRpbnVpdHlGb3JTZWVrKGFjdHVhbFNlZWtUaW1lVXMpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNob3VsZFNlZWtCZXlvbmQpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gc2Vla0JleW9uZChzZWVrVGltZVVzKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEZhc3QtZm9yd2FyZCB0byBzeW5jIGZyYW1lLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNvdXJjZUltcGxzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsID0gbVNvdXJjZUltcGxzW2ldOworICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgIGZlZWRVbnRpbEJ1ZmZlckF2YWlsYWJsZShpbXBsKTsKKyAgICAgICAgd2hpbGUgKGltcGwtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZXJyKSkgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1ldGEgPSBpbXBsLT5nZXRNZXRhQWZ0ZXJMYXN0RGVxdWV1ZWQoMCk7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgICAgICAgICBpZiAobWV0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQzMl90IHN5bmM7CisgICAgICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKCJpc1N5bmMiLCAmc3luYykgJiYgc3luYykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyID0gaW1wbC0+ZGVxdWV1ZUFjY2Vzc1VuaXQoJmJ1ZmZlcik7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZlZWRVbnRpbEJ1ZmZlckF2YWlsYWJsZShpbXBsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6cXVldWVEaXNjb250aW51aXR5Rm9yU2VlayhpbnQ2NF90IGFjdHVhbFNlZWtUaW1lVXMpIHsKKyAgICAvLyBTaWduYWwgZGlzY29udGludWl0eQorICAgIHNwPEFNZXNzYWdlPiBleHRyYShuZXcgQU1lc3NhZ2UpOworICAgIGV4dHJhLT5zZXRJbnQ2NChJU3RyZWFtTGlzdGVuZXI6OmtLZXlNZWRpYVRpbWVVcywgYWN0dWFsU2Vla1RpbWVVcyk7CisgICAgbVBhcnNlci0+c2lnbmFsRGlzY29udGludWl0eShBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfVElNRSwgZXh0cmEpOworCisgICAgLy8gQWZ0ZXIgZGlzY29udGludWl0eSwgaW1wbCBzaG91bGQgb25seSBoYXZlIGRpc2NvbnRpbnVpdGllcworICAgIC8vIHdpdGggdGhlIGxhc3QgYmVpbmcgd2hhdCB3ZSBxdWV1ZWQuIERlcXVldWUgdGhlbSBhbGwgaGVyZS4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VJbXBscy5zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCA9IG1Tb3VyY2VJbXBscy5pdGVtQXQoaSk7CisgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICB3aGlsZSAoaW1wbC0+aGFzQnVmZmVyQXZhaWxhYmxlKCZlcnIpKSB7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVyciA9IGltcGwtPmRlcXVldWVBY2Nlc3NVbml0KCZidWZmZXIpOworICAgICAgICAgICAgLy8gSWYgdGhlIHNvdXJjZSBjb250YWlucyBhbnl0aGluZyBidXQgZGlzY29udGludWl0eSwgdGhhdCdzCisgICAgICAgICAgICAvLyBhIHByb2dyYW1taW5nIG1pc3Rha2UuCisgICAgICAgICAgICBDSEVDSyhlcnIgPT0gSU5GT19ESVNDT05USU5VSVRZKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEZlZWQgdW50aWwgd2UgaGF2ZSBhIGJ1ZmZlciBmb3IgZWFjaCBzb3VyY2UuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU291cmNlSW1wbHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwgPSBtU291cmNlSW1wbHMuaXRlbUF0KGkpOworICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgICAgIHN0YXR1c190IGVyciA9IGZlZWRVbnRpbEJ1ZmZlckF2YWlsYWJsZShpbXBsKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6c2Vla0JleW9uZChpbnQ2NF90IHNlZWtUaW1lVXMpIHsKKyAgICAvLyBJZiB3ZSdyZSBzZWVraW5nIGJleW9uZCB3aGVyZSB3ZSBrbm93IC0tLSByZWFkIHVudGlsIHdlIHJlYWNoIHRoZXJlLgorICAgIHNpemVfdCBzeW5jUG9pbnRzU2l6ZSA9IG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpOworCisgICAgd2hpbGUgKHNlZWtUaW1lVXMgPiBtU2Vla1N5bmNQb2ludHMtPmtleUF0KAorICAgICAgICAgICAgbVNlZWtTeW5jUG9pbnRzLT5zaXplKCkgLSAxKSkgeworICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgIGlmIChzeW5jUG9pbnRzU2l6ZSA8IG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpKSB7CisgICAgICAgICAgICBzeW5jUG9pbnRzU2l6ZSA9IG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpOworICAgICAgICAgICAgaW50NjRfdCBzeW5jVGltZVVzID0gbVNlZWtTeW5jUG9pbnRzLT5rZXlBdChzeW5jUG9pbnRzU2l6ZSAtIDEpOworICAgICAgICAgICAgLy8gRGVxdWV1ZSBidWZmZXJzIGJlZm9yZSBzeW5jIHBvaW50IGluIG9yZGVyIHRvIGF2b2lkIHRvbyBtdWNoCisgICAgICAgICAgICAvLyBjYWNoZSBidWlsZGluZyB1cC4KKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNvdXJjZUltcGxzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwgPSBtU291cmNlSW1wbHNbaV07CisgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgICAgICAgICAgd2hpbGUgKChlcnIgPSBpbXBsLT5uZXh0QnVmZmVyVGltZSgmdGltZVVzKSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVVcyA8IHN5bmNUaW1lVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltcGwtPmRlcXVldWVBY2Nlc3NVbml0KCZidWZmZXIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSyAmJiBlcnIgIT0gLUVXT1VMREJMT0NLKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChmZWVkTW9yZSgpICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6ZmVlZFVudGlsQnVmZmVyQXZhaWxhYmxlKAorICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCkgeworICAgIHN0YXR1c190IGZpbmFsUmVzdWx0OworICAgIHdoaWxlICghaW1wbC0+aGFzQnVmZmVyQXZhaWxhYmxlKCZmaW5hbFJlc3VsdCkpIHsKKyAgICAgICAgaWYgKGZpbmFsUmVzdWx0ICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZmluYWxSZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBmZWVkTW9yZSgpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBpbXBsLT5zaWduYWxFT1MoZXJyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLm1rCmluZGV4IGFhYTgzMzQuLjVmMGY1NjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLm1rCkBAIC0xLDExICsxLDggQEAKIExPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLWlmZXEgKCQoVEFSR0VUX0RFVklDRSksIG1hbnRhKQotICAgIExPQ0FMX0NGTEFHUyArPSAtRFNVUkZBQ0VfSVNfQkdSMzIKLWVuZGlmCi0KIExPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBGcmFtZURyb3BwZXIuY3BwICAgICAgICAgICAgICBcCiAgICAgICAgIEdyYXBoaWNCdWZmZXJTb3VyY2UuY3BwICAgICAgIFwKICAgICAgICAgT01YLmNwcCAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBPTVhNYXN0ZXIuY3BwICAgICAgICAgICAgICAgICBcCkBAIC0zNCw2ICszMSw4IEBACiAgICAgICAgIGxpYmRsCiAKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X29teAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvRnJhbWVEcm9wcGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNDk1MmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvRnJhbWVEcm9wcGVyLmNwcApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJGcmFtZURyb3BwZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJGcmFtZURyb3BwZXIuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IGludDY0X3Qga01heEppdHRlclVzID0gMjAwMDsKKworRnJhbWVEcm9wcGVyOjpGcmFtZURyb3BwZXIoKQorICAgIDogbURlc2lyZWRNaW5UaW1lVXMoLTEpLAorICAgICAgbU1pbkludGVydmFsVXMoMCkgeworfQorCitGcmFtZURyb3BwZXI6On5GcmFtZURyb3BwZXIoKSB7Cit9CisKK3N0YXR1c190IEZyYW1lRHJvcHBlcjo6c2V0TWF4RnJhbWVSYXRlKGZsb2F0IG1heEZyYW1lUmF0ZSkgeworICAgIGlmIChtYXhGcmFtZVJhdGUgPD0gMCkgeworICAgICAgICBBTE9HRSgiZnJhbWVyYXRlIHNob3VsZCBiZSBwb3NpdGl2ZSBidXQgZ290ICVmLiIsIG1heEZyYW1lUmF0ZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1NaW5JbnRlcnZhbFVzID0gKGludDY0X3QpICgxMDAwMDAwLjBmIC8gbWF4RnJhbWVSYXRlKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgRnJhbWVEcm9wcGVyOjpzaG91bGREcm9wKGludDY0X3QgdGltZVVzKSB7CisgICAgaWYgKG1NaW5JbnRlcnZhbFVzIDw9IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChtRGVzaXJlZE1pblRpbWVVcyA8IDApIHsKKyAgICAgICAgbURlc2lyZWRNaW5UaW1lVXMgPSB0aW1lVXMgKyBtTWluSW50ZXJ2YWxVczsKKyAgICAgICAgQUxPR1YoImZpcnN0IGZyYW1lICVsbGQsIG5leHQgZGVzaXJlZCBmcmFtZSAlbGxkIiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVVcywgKGxvbmcgbG9uZyltRGVzaXJlZE1pblRpbWVVcyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAodGltZVVzIDwgKG1EZXNpcmVkTWluVGltZVVzIC0ga01heEppdHRlclVzKSkgeworICAgICAgICBBTE9HVigiZHJvcCBmcmFtZSAlbGxkLCBkZXNpcmVkIGZyYW1lICVsbGQsIGRpZmYgJWxsZCIsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lVXMsIChsb25nIGxvbmcpbURlc2lyZWRNaW5UaW1lVXMsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykobURlc2lyZWRNaW5UaW1lVXMgLSB0aW1lVXMpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaW50NjRfdCBuID0gKHRpbWVVcyAtIG1EZXNpcmVkTWluVGltZVVzICsga01heEppdHRlclVzKSAvIG1NaW5JbnRlcnZhbFVzOworICAgIG1EZXNpcmVkTWluVGltZVVzICs9IChuICsgMSkgKiBtTWluSW50ZXJ2YWxVczsKKyAgICBBTE9HVigia2VlcCBmcmFtZSAlbGxkLCBuZXh0IGRlc2lyZWQgZnJhbWUgJWxsZCwgZGlmZiAlbGxkIiwKKyAgICAgICAgICAgIChsb25nIGxvbmcpdGltZVVzLCAobG9uZyBsb25nKW1EZXNpcmVkTWluVGltZVVzLAorICAgICAgICAgICAgKGxvbmcgbG9uZykobURlc2lyZWRNaW5UaW1lVXMgLSB0aW1lVXMpKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvRnJhbWVEcm9wcGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvRnJhbWVEcm9wcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhNmQ0YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGUkFNRV9EUk9QUEVSX0hfCisKKyNkZWZpbmUgRlJBTUVfRFJPUFBFUl9IXworCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBGcmFtZURyb3BwZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgLy8gTm8gZnJhbWVzIHdpbGwgYmUgZHJvcHBlZCB1bnRpbCBhIHZhbGlkIG1heCBmcmFtZSByYXRlIGlzIHNldC4KKyAgICBGcmFtZURyb3BwZXIoKTsKKworICAgIC8vIG1heEZyYW1lUmF0ZSByZXF1aXJlZCB0byBiZSBwb3NpdGl2ZS4KKyAgICBzdGF0dXNfdCBzZXRNYXhGcmFtZVJhdGUoZmxvYXQgbWF4RnJhbWVSYXRlKTsKKworICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWF4IGZyYW1lIHJhdGUgaGFzIG5vdCBiZWVuIHNldCB2aWEgc2V0TWF4RnJhbWVSYXRlLgorICAgIGJvb2wgc2hvdWxkRHJvcChpbnQ2NF90IHRpbWVVcyk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5GcmFtZURyb3BwZXIoKTsKKworcHJpdmF0ZToKKyAgICBpbnQ2NF90IG1EZXNpcmVkTWluVGltZVVzOworICAgIGludDY0X3QgbU1pbkludGVydmFsVXM7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGcmFtZURyb3BwZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBGUkFNRV9EUk9QUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKaW5kZXggMjk0NTY0NC4uMWE3ZGM5ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmNwcApAQCAtMjMsMjggKzIzLDEwNCBAQAogI2luY2x1ZGUgIkdyYXBoaWNCdWZmZXJTb3VyY2UuaCIKIAogI2luY2x1ZGUgPE9NWF9Db3JlLmg+CisjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KICNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CiAjaW5jbHVkZSA8Z3VpL0J1ZmZlckl0ZW0uaD4KKyNpbmNsdWRlIDxIYXJkd2FyZUFQSS5oPgogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlICJGcmFtZURyb3BwZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0aWMgY29uc3QgYm9vbCBFWFRSQV9DSEVDSyA9IHRydWU7CiAKK0dyYXBoaWNCdWZmZXJTb3VyY2U6OlBlcnNpc3RlbnRQcm94eUxpc3RlbmVyOjpQZXJzaXN0ZW50UHJveHlMaXN0ZW5lcigKKyAgICAgICAgY29uc3Qgd3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gJmNvbnN1bWVyLAorICAgICAgICBjb25zdCB3cDxDb25zdW1lckxpc3RlbmVyPiYgY29uc3VtZXJMaXN0ZW5lcikgOgorICAgIG1Db25zdW1lckxpc3RlbmVyKGNvbnN1bWVyTGlzdGVuZXIpLAorICAgIG1Db25zdW1lcihjb25zdW1lcikge30KIAotR3JhcGhpY0J1ZmZlclNvdXJjZTo6R3JhcGhpY0J1ZmZlclNvdXJjZShPTVhOb2RlSW5zdGFuY2UqIG5vZGVJbnN0YW5jZSwKLSAgICAgICAgdWludDMyX3QgYnVmZmVyV2lkdGgsIHVpbnQzMl90IGJ1ZmZlckhlaWdodCwgdWludDMyX3QgYnVmZmVyQ291bnQsCi0gICAgICAgIGJvb2wgdXNlR3JhcGhpY0J1ZmZlckluTWV0YSkgOgorR3JhcGhpY0J1ZmZlclNvdXJjZTo6UGVyc2lzdGVudFByb3h5TGlzdGVuZXI6On5QZXJzaXN0ZW50UHJveHlMaXN0ZW5lcigpIHt9CisKK3ZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6UGVyc2lzdGVudFByb3h5TGlzdGVuZXI6Om9uRnJhbWVBdmFpbGFibGUoCisgICAgICAgIGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pIHsKKyAgICBzcDxDb25zdW1lckxpc3RlbmVyPiBsaXN0ZW5lcihtQ29uc3VtZXJMaXN0ZW5lci5wcm9tb3RlKCkpOworICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgIGxpc3RlbmVyLT5vbkZyYW1lQXZhaWxhYmxlKGl0ZW0pOworICAgIH0gZWxzZSB7CisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGNvbnN1bWVyKG1Db25zdW1lci5wcm9tb3RlKCkpOworICAgICAgICBpZiAoY29uc3VtZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEJ1ZmZlckl0ZW0gYmk7CisgICAgICAgIHN0YXR1c190IGVyciA9IGNvbnN1bWVyLT5hY3F1aXJlQnVmZmVyKCZiaSwgMCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJQZXJzaXN0ZW50UHJveHlMaXN0ZW5lcjogYWNxdWlyZUJ1ZmZlciBmYWlsZWQgKCVkKSIsIGVycik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSBjb25zdW1lci0+ZGV0YWNoQnVmZmVyKGJpLm1CdWYpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiUGVyc2lzdGVudFByb3h5TGlzdGVuZXI6IGRldGFjaEJ1ZmZlciBmYWlsZWQgKCVkKSIsIGVycik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSBjb25zdW1lci0+YXR0YWNoQnVmZmVyKCZiaS5tQnVmLCBiaS5tR3JhcGhpY0J1ZmZlcik7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJQZXJzaXN0ZW50UHJveHlMaXN0ZW5lcjogYXR0YWNoQnVmZmVyIGZhaWxlZCAoJWQpIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IGNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKGJpLm1CdWYsIDAsCisgICAgICAgICAgICAgICAgRUdMX05PX0RJU1BMQVksIEVHTF9OT19TWU5DX0tIUiwgYmkubUZlbmNlKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIlBlcnNpc3RlbnRQcm94eUxpc3RlbmVyOiByZWxlYXNlQnVmZmVyIGZhaWxlZCAoJWQpIiwgZXJyKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpQZXJzaXN0ZW50UHJveHlMaXN0ZW5lcjo6b25GcmFtZVJlcGxhY2VkKAorICAgICAgICBjb25zdCBCdWZmZXJJdGVtJiBpdGVtKSB7CisgICAgc3A8Q29uc3VtZXJMaXN0ZW5lcj4gbGlzdGVuZXIobUNvbnN1bWVyTGlzdGVuZXIucHJvbW90ZSgpKTsKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBsaXN0ZW5lci0+b25GcmFtZVJlcGxhY2VkKGl0ZW0pOworICAgIH0KK30KKwordm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpQZXJzaXN0ZW50UHJveHlMaXN0ZW5lcjo6b25CdWZmZXJzUmVsZWFzZWQoKSB7CisgICAgc3A8Q29uc3VtZXJMaXN0ZW5lcj4gbGlzdGVuZXIobUNvbnN1bWVyTGlzdGVuZXIucHJvbW90ZSgpKTsKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBsaXN0ZW5lci0+b25CdWZmZXJzUmVsZWFzZWQoKTsKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6UGVyc2lzdGVudFByb3h5TGlzdGVuZXI6Om9uU2lkZWJhbmRTdHJlYW1DaGFuZ2VkKCkgeworICAgIHNwPENvbnN1bWVyTGlzdGVuZXI+IGxpc3RlbmVyKG1Db25zdW1lckxpc3RlbmVyLnByb21vdGUoKSk7CisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgbGlzdGVuZXItPm9uU2lkZWJhbmRTdHJlYW1DaGFuZ2VkKCk7CisgICAgfQorfQorCitHcmFwaGljQnVmZmVyU291cmNlOjpHcmFwaGljQnVmZmVyU291cmNlKAorICAgICAgICBPTVhOb2RlSW5zdGFuY2UqIG5vZGVJbnN0YW5jZSwKKyAgICAgICAgdWludDMyX3QgYnVmZmVyV2lkdGgsCisgICAgICAgIHVpbnQzMl90IGJ1ZmZlckhlaWdodCwKKyAgICAgICAgdWludDMyX3QgYnVmZmVyQ291bnQsCisgICAgICAgIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UsCisgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+ICZjb25zdW1lcikgOgogICAgIG1Jbml0Q2hlY2soVU5LTk9XTl9FUlJPUiksCiAgICAgbU5vZGVJbnN0YW5jZShub2RlSW5zdGFuY2UpLAogICAgIG1FeGVjdXRpbmcoZmFsc2UpLAogICAgIG1TdXNwZW5kZWQoZmFsc2UpLAorICAgIG1Jc1BlcnNpc3RlbnQoZmFsc2UpLAorICAgIG1Db25zdW1lcihjb25zdW1lciksCiAgICAgbU51bUZyYW1lc0F2YWlsYWJsZSgwKSwKKyAgICBtTnVtQnVmZmVyQWNxdWlyZWQoMCksCiAgICAgbUVuZE9mU3RyZWFtKGZhbHNlKSwKICAgICBtRW5kT2ZTdHJlYW1TZW50KGZhbHNlKSwKICAgICBtTWF4VGltZXN0YW1wR2FwVXMoLTFsbCksCkBAIC01NCwxNSArMTMwLDE1IEBACiAgICAgbVJlcGVhdEFmdGVyVXMoLTFsbCksCiAgICAgbVJlcGVhdExhc3RGcmFtZUdlbmVyYXRpb24oMCksCiAgICAgbVJlcGVhdExhc3RGcmFtZVRpbWVzdGFtcCgtMWxsKSwKLSAgICBtTGF0ZXN0U3VibWl0dGVkQnVmZmVySWQoLTEpLAotICAgIG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJGcmFtZU51bSgwKSwKLSAgICBtTGF0ZXN0U3VibWl0dGVkQnVmZmVyVXNlQ291bnQoMCksCisgICAgbUxhdGVzdEJ1ZmZlcklkKC0xKSwKKyAgICBtTGF0ZXN0QnVmZmVyRnJhbWVOdW0oMCksCisgICAgbUxhdGVzdEJ1ZmZlclVzZUNvdW50KDApLAorICAgIG1MYXRlc3RCdWZmZXJGZW5jZShGZW5jZTo6Tk9fRkVOQ0UpLAogICAgIG1SZXBlYXRCdWZmZXJEZWZlcnJlZChmYWxzZSksCiAgICAgbVRpbWVQZXJDYXB0dXJlVXMoLTFsbCksCiAgICAgbVRpbWVQZXJGcmFtZVVzKC0xbGwpLAogICAgIG1QcmV2Q2FwdHVyZVVzKC0xbGwpLAotICAgIG1QcmV2RnJhbWVVcygtMWxsKSwKLSAgICBtVXNlR3JhcGhpY0J1ZmZlckluTWV0YSh1c2VHcmFwaGljQnVmZmVySW5NZXRhKSB7CisgICAgbVByZXZGcmFtZVVzKC0xbGwpIHsKIAogICAgIEFMT0dWKCJHcmFwaGljQnVmZmVyU291cmNlIHc9JXUgaD0ldSBjPSV1IiwKICAgICAgICAgICAgIGJ1ZmZlcldpZHRoLCBidWZmZXJIZWlnaHQsIGJ1ZmZlckNvdW50KTsKQEAgLTczLDI2ICsxNDksMzggQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIFN0cmluZzggbmFtZSgiR3JhcGhpY0J1ZmZlclNvdXJjZSIpOworICAgIGlmIChtQ29uc3VtZXIgPT0gTlVMTCkgeworICAgICAgICBTdHJpbmc4IG5hbWUoIkdyYXBoaWNCdWZmZXJTb3VyY2UiKTsKIAotICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmbVByb2R1Y2VyLCAmbUNvbnN1bWVyKTsKLSAgICBtQ29uc3VtZXItPnNldENvbnN1bWVyTmFtZShuYW1lKTsKLSAgICBtQ29uc3VtZXItPnNldERlZmF1bHRCdWZmZXJTaXplKGJ1ZmZlcldpZHRoLCBidWZmZXJIZWlnaHQpOwotICAgIG1Db25zdW1lci0+c2V0Q29uc3VtZXJVc2FnZUJpdHMoR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSKTsKKyAgICAgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZtUHJvZHVjZXIsICZtQ29uc3VtZXIpOworICAgICAgICBtQ29uc3VtZXItPnNldENvbnN1bWVyTmFtZShuYW1lKTsKIAotICAgIG1Jbml0Q2hlY2sgPSBtQ29uc3VtZXItPnNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQoYnVmZmVyQ291bnQpOwotICAgIGlmIChtSW5pdENoZWNrICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IEJRIG1heCBhY3F1aXJlZCBidWZmZXIgY291bnQgdG8gJXU6ICVkIiwKLSAgICAgICAgICAgICAgICBidWZmZXJDb3VudCwgbUluaXRDaGVjayk7Ci0gICAgICAgIHJldHVybjsKKyAgICAgICAgLy8gdXNlIGNvbnN1bWVyIHVzYWdlIGJpdHMgcXVlcmllZCBmcm9tIGVuY29kZXIsIGJ1dCBhbHdheXMgYWRkIEhXX1ZJREVPX0VOQ09ERVIKKyAgICAgICAgLy8gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgICAgICAgIGNvbnN1bWVyVXNhZ2UgfD0gR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSOworICAgICAgICBtQ29uc3VtZXItPnNldENvbnN1bWVyVXNhZ2VCaXRzKGNvbnN1bWVyVXNhZ2UpOworCisgICAgICAgIG1Jbml0Q2hlY2sgPSBtQ29uc3VtZXItPnNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQoYnVmZmVyQ291bnQpOworICAgICAgICBpZiAobUluaXRDaGVjayAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgQlEgbWF4IGFjcXVpcmVkIGJ1ZmZlciBjb3VudCB0byAldTogJWQiLAorICAgICAgICAgICAgICAgICAgICBidWZmZXJDb3VudCwgbUluaXRDaGVjayk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtSXNQZXJzaXN0ZW50ID0gdHJ1ZTsKICAgICB9Ci0KKyAgICBtQ29uc3VtZXItPnNldERlZmF1bHRCdWZmZXJTaXplKGJ1ZmZlcldpZHRoLCBidWZmZXJIZWlnaHQpOwogICAgIC8vIE5vdGUgdGhhdCB3ZSBjYW4ndCBjcmVhdGUgYW4gc3A8Li4uPih0aGlzKSBpbiBhIGN0b3IgdGhhdCB3aWxsIG5vdCBrZWVwIGEKICAgICAvLyByZWZlcmVuY2Ugb25jZSB0aGUgY3RvciBlbmRzLCBhcyB0aGF0IHdvdWxkIGNhdXNlIHRoZSByZWZjb3VudCBvZiAndGhpcycKICAgICAvLyBkcm9wcGluZyB0byAwIGF0IHRoZSBlbmQgb2YgdGhlIGN0b3IuICBTaW5jZSBhbGwgd2UgbmVlZCBpcyBhIHdwPC4uLj4KICAgICAvLyB0aGF0J3Mgd2hhdCB3ZSBjcmVhdGUuCiAgICAgd3A8QnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXI+IGxpc3RlbmVyID0gc3RhdGljX2Nhc3Q8QnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXIqPih0aGlzKTsKLSAgICBzcDxCdWZmZXJRdWV1ZTo6UHJveHlDb25zdW1lckxpc3RlbmVyPiBwcm94eSA9IG5ldyBCdWZmZXJRdWV1ZTo6UHJveHlDb25zdW1lckxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICBzcDxJQ29uc3VtZXJMaXN0ZW5lcj4gcHJveHk7CisgICAgaWYgKCFtSXNQZXJzaXN0ZW50KSB7CisgICAgICAgIHByb3h5ID0gbmV3IEJ1ZmZlclF1ZXVlOjpQcm94eUNvbnN1bWVyTGlzdGVuZXIobGlzdGVuZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByb3h5ID0gbmV3IFBlcnNpc3RlbnRQcm94eUxpc3RlbmVyKG1Db25zdW1lciwgbGlzdGVuZXIpOworICAgIH0KIAogICAgIG1Jbml0Q2hlY2sgPSBtQ29uc3VtZXItPmNvbnN1bWVyQ29ubmVjdChwcm94eSwgZmFsc2UpOwogICAgIGlmIChtSW5pdENoZWNrICE9IE5PX0VSUk9SKSB7CkBAIC0xMDUsOCArMTkzLDE1IEBACiB9CiAKIEdyYXBoaWNCdWZmZXJTb3VyY2U6On5HcmFwaGljQnVmZmVyU291cmNlKCkgewotICAgIEFMT0dWKCJ+R3JhcGhpY0J1ZmZlclNvdXJjZSIpOwotICAgIGlmIChtQ29uc3VtZXIgIT0gTlVMTCkgeworICAgIGlmIChtTGF0ZXN0QnVmZmVySWQgPj0gMCkgeworICAgICAgICByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgICAgIG1MYXRlc3RCdWZmZXJJZCwgbUxhdGVzdEJ1ZmZlckZyYW1lTnVtLAorICAgICAgICAgICAgICAgIG1CdWZmZXJTbG90W21MYXRlc3RCdWZmZXJJZF0sIG1MYXRlc3RCdWZmZXJGZW5jZSk7CisgICAgfQorICAgIGlmIChtTnVtQnVmZmVyQWNxdWlyZWQgIT0gMCkgeworICAgICAgICBBTE9HVygicG90ZW50aWFsIGJ1ZmZlciBsZWFrIChhY3F1aXJlZCAlZCkiLCBtTnVtQnVmZmVyQWNxdWlyZWQpOworICAgIH0KKyAgICBpZiAobUNvbnN1bWVyICE9IE5VTEwgJiYgIW1Jc1BlcnNpc3RlbnQpIHsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5jb25zdW1lckRpc2Nvbm5lY3QoKTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgQUxPR1coImNvbnN1bWVyRGlzY29ubmVjdCBmYWlsZWQ6ICVkIiwgZXJyKTsKQEAgLTE1Myw5ICsyNDgsOSBAQAogICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVJlZmxlY3Rvcik7CiAgICAgICAgIG1Mb29wZXItPnN0YXJ0KCk7CiAKLSAgICAgICAgaWYgKG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJJZCA+PSAwKSB7CisgICAgICAgIGlmIChtTGF0ZXN0QnVmZmVySWQgPj0gMCkgewogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9Ci0gICAgICAgICAgICAgICAgbmV3IEFNZXNzYWdlKGtXaGF0UmVwZWF0TGFzdEZyYW1lLCBtUmVmbGVjdG9yLT5pZCgpKTsKKyAgICAgICAgICAgICAgICBuZXcgQU1lc3NhZ2Uoa1doYXRSZXBlYXRMYXN0RnJhbWUsIG1SZWZsZWN0b3IpOwogCiAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgKyttUmVwZWF0TGFzdEZyYW1lR2VuZXJhdGlvbik7CiAgICAgICAgICAgICBtc2ctPnBvc3QobVJlcGVhdEFmdGVyVXMpOwpAQCAtMjE4LDkgKzMxMyw4IEBACiAgICAgbUNvZGVjQnVmZmVycy5hZGQoY29kZWNCdWZmZXIpOwogfQogCi12b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6OmNvZGVjQnVmZmVyRW1wdGllZChPTVhfQlVGRkVSSEVBREVSVFlQRSogaGVhZGVyKSB7Cit2b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6OmNvZGVjQnVmZmVyRW1wdGllZChPTVhfQlVGRkVSSEVBREVSVFlQRSogaGVhZGVyLCBpbnQgZmVuY2VGZCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwotCiAgICAgaWYgKCFtRXhlY3V0aW5nKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0yMjksNiArMzIzLDkgQEAKICAgICBpZiAoY2JpIDwgMCkgewogICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uCiAgICAgICAgIEFMT0dFKCJjb2RlY0J1ZmZlckVtcHRpZWQ6IGJ1ZmZlciBub3QgcmVjb2duaXplZCAoaD0lcCkiLCBoZWFkZXIpOworICAgICAgICBpZiAoZmVuY2VGZCA+PSAwKSB7CisgICAgICAgICAgICA6OmNsb3NlKGZlbmNlRmQpOworICAgICAgICB9CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTI1MCwzMCArMzQ3LDMzIEBACiAgICAgICAgIH0KICAgICAgICAgLy8gTm8gR3JhcGhpY0J1ZmZlciB0byBkZWFsIHdpdGgsIG5vIGFkZGl0aW9uYWwgaW5wdXQgb3Igb3V0cHV0IGlzCiAgICAgICAgIC8vIGV4cGVjdGVkLCBzbyBqdXN0IHJldHVybi4KKyAgICAgICAgaWYgKGZlbmNlRmQgPj0gMCkgeworICAgICAgICAgICAgOjpjbG9zZShmZW5jZUZkKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKEVYVFJBX0NIRUNLKSB7CisgICAgaWYgKEVYVFJBX0NIRUNLICYmIGhlYWRlci0+bkFsbG9jTGVuID49IHNpemVvZihNZXRhZGF0YUJ1ZmZlclR5cGUpKSB7CiAgICAgICAgIC8vIFB1bGwgdGhlIGdyYXBoaWMgYnVmZmVyIGhhbmRsZSBiYWNrIG91dCBvZiB0aGUgYnVmZmVyLCBhbmQgY29uZmlybQogICAgICAgICAvLyB0aGF0IGl0IG1hdGNoZXMgZXhwZWN0YXRpb25zLgogICAgICAgICBPTVhfVTgqIGRhdGEgPSBoZWFkZXItPnBCdWZmZXI7CiAgICAgICAgIE1ldGFkYXRhQnVmZmVyVHlwZSB0eXBlID0gKihNZXRhZGF0YUJ1ZmZlclR5cGUgKilkYXRhOwotICAgICAgICBpZiAodHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkgewotICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90IGJ1ZmZlckhhbmRsZTsKLSAgICAgICAgICAgIG1lbWNweSgmYnVmZmVySGFuZGxlLCBkYXRhICsgNCwgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCkpOwotICAgICAgICAgICAgaWYgKGJ1ZmZlckhhbmRsZSAhPSBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlKSB7CisgICAgICAgIGlmICh0eXBlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlCisgICAgICAgICAgICAgICAgJiYgaGVhZGVyLT5uQWxsb2NMZW4gPj0gc2l6ZW9mKFZpZGVvR3JhbGxvY01ldGFkYXRhKSkgeworICAgICAgICAgICAgVmlkZW9HcmFsbG9jTWV0YWRhdGEgJmdyYWxsb2NNZXRhID0gKihWaWRlb0dyYWxsb2NNZXRhZGF0YSAqKWRhdGE7CisgICAgICAgICAgICBpZiAoZ3JhbGxvY01ldGEucEhhbmRsZSAhPSBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlKSB7CiAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbgogICAgICAgICAgICAgICAgIEFMT0dFKCJjb2RlY0J1ZmZlckVtcHRpZWQ6IGJ1ZmZlcidzIGhhbmRsZSBpcyAlcCwgZXhwZWN0ZWQgJXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySGFuZGxlLCBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyYWxsb2NNZXRhLnBIYW5kbGUsIGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyLT5oYW5kbGUpOwogICAgICAgICAgICAgICAgIENIRUNLKCEiY29kZWNCdWZmZXJFbXB0aWVkOiBtaXNtYXRjaGVkIGJ1ZmZlciIpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYXBoaWNCdWZmZXIpIHsKLSAgICAgICAgICAgIEdyYXBoaWNCdWZmZXIgKmJ1ZmZlcjsKLSAgICAgICAgICAgIG1lbWNweSgmYnVmZmVyLCBkYXRhICsgNCwgc2l6ZW9mKGJ1ZmZlcikpOwotICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlci5nZXQoKSkgeworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUFOV0J1ZmZlcgorICAgICAgICAgICAgICAgICYmIGhlYWRlci0+bkFsbG9jTGVuID49IHNpemVvZihWaWRlb05hdGl2ZU1ldGFkYXRhKSkgeworICAgICAgICAgICAgVmlkZW9OYXRpdmVNZXRhZGF0YSAmbmF0aXZlTWV0YSA9ICooVmlkZW9OYXRpdmVNZXRhZGF0YSAqKWRhdGE7CisgICAgICAgICAgICBpZiAobmF0aXZlTWV0YS5wQnVmZmVyICE9IGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyLT5nZXROYXRpdmVCdWZmZXIoKSkgewogICAgICAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4KICAgICAgICAgICAgICAgICBBTE9HRSgiY29kZWNCdWZmZXJFbXB0aWVkOiBidWZmZXIgaXMgJXAsIGV4cGVjdGVkICVwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXIuZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlTWV0YS5wQnVmZmVyLCBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlci0+Z2V0TmF0aXZlQnVmZmVyKCkpOwogICAgICAgICAgICAgICAgIENIRUNLKCEiY29kZWNCdWZmZXJFbXB0aWVkOiBtaXNtYXRjaGVkIGJ1ZmZlciIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yODMsMjAgKzM4MywyMSBAQAogICAgIC8vIElmIHdlIGZpbmQgYSBtYXRjaCwgcmVsZWFzZSB0aGF0IHNsb3QuICBJZiB3ZSBkb24ndCwgdGhlIEJ1ZmZlclF1ZXVlCiAgICAgLy8gaGFzIGRyb3BwZWQgdGhhdCBHcmFwaGljQnVmZmVyLCBhbmQgdGhlcmUncyBub3RoaW5nIGZvciB1cyB0byByZWxlYXNlLgogICAgIGludCBpZCA9IGNvZGVjQnVmZmVyLm1CdWY7CisgICAgc3A8RmVuY2U+IGZlbmNlID0gbmV3IEZlbmNlKGZlbmNlRmQpOwogICAgIGlmIChtQnVmZmVyU2xvdFtpZF0gIT0gTlVMTCAmJgogICAgICAgICBtQnVmZmVyU2xvdFtpZF0tPmhhbmRsZSA9PSBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlKSB7CiAgICAgICAgIEFMT0dWKCJjYmkgJWQgbWF0Y2hlcyBicSBzbG90ICVkLCBoYW5kbGU9JXAiLAogICAgICAgICAgICAgICAgIGNiaSwgaWQsIG1CdWZmZXJTbG90W2lkXS0+aGFuZGxlKTsKIAotICAgICAgICBpZiAoaWQgPT0gbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlcklkKSB7Ci0gICAgICAgICAgICBDSEVDS19HVChtTGF0ZXN0U3VibWl0dGVkQnVmZmVyVXNlQ291bnQtLSwgMCk7CisgICAgICAgIGlmIChpZCA9PSBtTGF0ZXN0QnVmZmVySWQpIHsKKyAgICAgICAgICAgIENIRUNLX0dUKG1MYXRlc3RCdWZmZXJVc2VDb3VudC0tLCAwKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcihpZCwgY29kZWNCdWZmZXIubUZyYW1lTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NZTkNfS0hSLCBGZW5jZTo6Tk9fRkVOQ0UpOworICAgICAgICAgICAgcmVsZWFzZUJ1ZmZlcihpZCwgY29kZWNCdWZmZXIubUZyYW1lTnVtYmVyLCBtQnVmZmVyU2xvdFtpZF0sIGZlbmNlKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dWKCJjb2RlY0J1ZmZlckVtcHRpZWQ6IG5vIG1hdGNoIGZvciBlbXB0aWVkIGJ1ZmZlciBpbiBjYmkgJWQiLAogICAgICAgICAgICAgICAgIGNiaSk7CisgICAgICAgIC8vIHdlIHdpbGwgbm90IHJldXNlIGNvZGVjIGJ1ZmZlciwgc28gdGhlcmUgaXMgbm8gbmVlZCB0byB3YWl0IGZvciBmZW5jZQogICAgIH0KIAogICAgIC8vIE1hcmsgdGhlIGNvZGVjIGJ1ZmZlciBhcyBhdmFpbGFibGUgYnkgY2xlYXJpbmcgdGhlIEdyYXBoaWNCdWZmZXIgcmVmLgpAQCAtMzE0LDExICs0MTUsMTEgQEAKICAgICAgICAgQUxPR1YoImJ1ZmZlciBmcmVlZCwgRU9TIHBlbmRpbmciKTsKICAgICAgICAgc3VibWl0RW5kT2ZJbnB1dFN0cmVhbV9sKCk7CiAgICAgfSBlbHNlIGlmIChtUmVwZWF0QnVmZmVyRGVmZXJyZWQpIHsKLSAgICAgICAgYm9vbCBzdWNjZXNzID0gcmVwZWF0TGF0ZXN0U3VibWl0dGVkQnVmZmVyX2woKTsKKyAgICAgICAgYm9vbCBzdWNjZXNzID0gcmVwZWF0TGF0ZXN0QnVmZmVyX2woKTsKICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKLSAgICAgICAgICAgIEFMT0dWKCJkZWZlcnJlZCByZXBlYXRMYXRlc3RTdWJtaXR0ZWRCdWZmZXJfbCBTVUNDRVNTIik7CisgICAgICAgICAgICBBTE9HVigiZGVmZXJyZWQgcmVwZWF0TGF0ZXN0QnVmZmVyX2wgU1VDQ0VTUyIpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1YoImRlZmVycmVkIHJlcGVhdExhdGVzdFN1Ym1pdHRlZEJ1ZmZlcl9sIEZBSUxVUkUiKTsKKyAgICAgICAgICAgIEFMT0dWKCJkZWZlcnJlZCByZXBlYXRMYXRlc3RCdWZmZXJfbCBGQUlMVVJFIik7CiAgICAgICAgIH0KICAgICAgICAgbVJlcGVhdEJ1ZmZlckRlZmVycmVkID0gZmFsc2U7CiAgICAgfQpAQCAtMzcyLDEwICs0NzMsMTEgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgKyttTnVtQnVmZmVyQWNxdWlyZWQ7CiAgICAgICAgICAgICAtLW1OdW1GcmFtZXNBdmFpbGFibGU7CiAKLSAgICAgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcihpdGVtLm1CdWYsIGl0ZW0ubUZyYW1lTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NZTkNfS0hSLCBpdGVtLm1GZW5jZSk7CisgICAgICAgICAgICByZWxlYXNlQnVmZmVyKGl0ZW0ubUJ1ZiwgaXRlbS5tRnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgIGl0ZW0ubUdyYXBoaWNCdWZmZXIsIGl0ZW0ubUZlbmNlKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMzgzLDEyICs0ODUsMTIgQEAKICAgICBtU3VzcGVuZGVkID0gZmFsc2U7CiAKICAgICBpZiAobUV4ZWN1dGluZyAmJiBtTnVtRnJhbWVzQXZhaWxhYmxlID09IDAgJiYgbVJlcGVhdEJ1ZmZlckRlZmVycmVkKSB7Ci0gICAgICAgIGlmIChyZXBlYXRMYXRlc3RTdWJtaXR0ZWRCdWZmZXJfbCgpKSB7Ci0gICAgICAgICAgICBBTE9HVigic3VzcGVuZC9kZWZlcnJlZCByZXBlYXRMYXRlc3RTdWJtaXR0ZWRCdWZmZXJfbCBTVUNDRVNTIik7CisgICAgICAgIGlmIChyZXBlYXRMYXRlc3RCdWZmZXJfbCgpKSB7CisgICAgICAgICAgICBBTE9HVigic3VzcGVuZC9kZWZlcnJlZCByZXBlYXRMYXRlc3RCdWZmZXJfbCBTVUNDRVNTIik7CiAKICAgICAgICAgICAgIG1SZXBlYXRCdWZmZXJEZWZlcnJlZCA9IGZhbHNlOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1YoInN1c3BlbmQvZGVmZXJyZWQgcmVwZWF0TGF0ZXN0U3VibWl0dGVkQnVmZmVyX2wgRkFJTFVSRSIpOworICAgICAgICAgICAgQUxPR1YoInN1c3BlbmQvZGVmZXJyZWQgcmVwZWF0TGF0ZXN0QnVmZmVyX2wgRkFJTFVSRSIpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtNDIyLDE1ICs1MjQsOSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgbU51bUJ1ZmZlckFjcXVpcmVkKys7CiAgICAgbU51bUZyYW1lc0F2YWlsYWJsZS0tOwogCi0gICAgLy8gV2FpdCBmb3IgaXQgdG8gYmVjb21lIGF2YWlsYWJsZS4KLSAgICBlcnIgPSBpdGVtLm1GZW5jZS0+d2FpdEZvcmV2ZXIoIkdyYXBoaWNCdWZmZXJTb3VyY2U6OmZpbGxDb2RlY0J1ZmZlcl9sIik7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHdhaXQgZm9yIGJ1ZmZlciBmZW5jZTogJWQiLCBlcnIpOwotICAgICAgICAvLyBrZWVwIGdvaW5nCi0gICAgfQotCiAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSdyZSBzZWVpbmcgdGhpcyBidWZmZXIsIGFkZCBpdCB0byBvdXIKICAgICAvLyBzbG90IHRhYmxlLgogICAgIGlmIChpdGVtLm1HcmFwaGljQnVmZmVyICE9IE5VTEwpIHsKQEAgLTQ0Miw2MSArNTM4LDcyIEBACiAKICAgICAvLyBvbmx5IHN1Ym1pdCBzYW1wbGUgaWYgc3RhcnQgdGltZSBpcyB1bnNwZWNpZmllZCwgb3Igc2FtcGxlCiAgICAgLy8gaXMgcXVldWVkIGFmdGVyIHRoZSBzcGVjaWZpZWQgc3RhcnQgdGltZQorICAgIGJvb2wgZHJvcHBlZCA9IGZhbHNlOwogICAgIGlmIChtU2tpcEZyYW1lc0JlZm9yZU5zIDwgMGxsIHx8IGl0ZW0ubVRpbWVzdGFtcCA+PSBtU2tpcEZyYW1lc0JlZm9yZU5zKSB7CiAgICAgICAgIC8vIGlmIHN0YXJ0IHRpbWUgaXMgc2V0LCBvZmZzZXQgdGltZSBzdGFtcCBieSBzdGFydCB0aW1lCiAgICAgICAgIGlmIChtU2tpcEZyYW1lc0JlZm9yZU5zID4gMCkgewogICAgICAgICAgICAgaXRlbS5tVGltZXN0YW1wIC09IG1Ta2lwRnJhbWVzQmVmb3JlTnM7CiAgICAgICAgIH0KLSAgICAgICAgZXJyID0gc3VibWl0QnVmZmVyX2woaXRlbSwgY2JpKTsKKworICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IGl0ZW0ubVRpbWVzdGFtcCAvIDEwMDA7CisgICAgICAgIGlmIChtRnJhbWVEcm9wcGVyICE9IE5VTEwgJiYgbUZyYW1lRHJvcHBlci0+c2hvdWxkRHJvcCh0aW1lVXMpKSB7CisgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgZnJhbWUgKCVsbGQpIHRvIG1lZXQgbWF4IGZyYW1lcmF0ZSIsIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odGltZVVzKSk7CisgICAgICAgICAgICAvLyBzZXQgZXJyIHRvIE9LIHNvIHRoYXQgdGhlIHNraXBwZWQgZnJhbWUgY2FuIHN0aWxsIGJlIHNhdmVkIGFzIHRoZSBsYXN0ZXN0IGZyYW1lCisgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgIGRyb3BwZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXJyID0gc3VibWl0QnVmZmVyX2woaXRlbSwgY2JpKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgQUxPR1YoInN1Ym1pdEJ1ZmZlcl9sIGZhaWxlZCwgcmVsZWFzaW5nIGJxIGJ1ZiAlZCIsIGl0ZW0ubUJ1Zik7Ci0gICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcihpdGVtLm1CdWYsIGl0ZW0ubUZyYW1lTnVtYmVyLAotICAgICAgICAgICAgICAgIEVHTF9OT19ESVNQTEFZLCBFR0xfTk9fU1lOQ19LSFIsIEZlbmNlOjpOT19GRU5DRSk7CisgICAgICAgIHJlbGVhc2VCdWZmZXIoaXRlbS5tQnVmLCBpdGVtLm1GcmFtZU51bWJlciwgaXRlbS5tR3JhcGhpY0J1ZmZlciwgaXRlbS5tRmVuY2UpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dWKCJidWZmZXIgc3VibWl0dGVkIChicSAlZCwgY2JpICVkKSIsIGl0ZW0ubUJ1ZiwgY2JpKTsKLSAgICAgICAgc2V0TGF0ZXN0U3VibWl0dGVkQnVmZmVyX2woaXRlbSk7CisgICAgICAgIHNldExhdGVzdEJ1ZmZlcl9sKGl0ZW0sIGRyb3BwZWQpOwogICAgIH0KIAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIEdyYXBoaWNCdWZmZXJTb3VyY2U6OnJlcGVhdExhdGVzdFN1Ym1pdHRlZEJ1ZmZlcl9sKCkgeworYm9vbCBHcmFwaGljQnVmZmVyU291cmNlOjpyZXBlYXRMYXRlc3RCdWZmZXJfbCgpIHsKICAgICBDSEVDSyhtRXhlY3V0aW5nICYmIG1OdW1GcmFtZXNBdmFpbGFibGUgPT0gMCk7CiAKLSAgICBpZiAobUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlcklkIDwgMCB8fCBtU3VzcGVuZGVkKSB7CisgICAgaWYgKG1MYXRlc3RCdWZmZXJJZCA8IDAgfHwgbVN1c3BlbmRlZCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIGlmIChtQnVmZmVyU2xvdFttTGF0ZXN0U3VibWl0dGVkQnVmZmVySWRdID09IE5VTEwpIHsKKyAgICBpZiAobUJ1ZmZlclNsb3RbbUxhdGVzdEJ1ZmZlcklkXSA9PSBOVUxMKSB7CiAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgcmVtb3RlIHNpZGUgZGlzY29ubmVjdHMsIGNhdXNpbmcKICAgICAgICAgLy8gb25CdWZmZXJzUmVsZWFzZWQoKSB0byBOVUxMIG91dCBvdXIgY29weSBvZiB0aGUgc2xvdHMuICBUaGUKICAgICAgICAgLy8gYnVmZmVyIGlzIGdvbmUsIHNvIHdlIGhhdmUgbm90aGluZyB0byBzaG93LgogICAgICAgICAvLwogICAgICAgICAvLyBUbyBiZSBvbiB0aGUgc2FmZSBzaWRlIHdlIHRyeSB0byByZWxlYXNlIHRoZSBidWZmZXIuCi0gICAgICAgIEFMT0dEKCJyZXBlYXRMYXRlc3RTdWJtaXR0ZWRCdWZmZXJfbDogc2xvdCB3YXMgTlVMTCIpOworICAgICAgICBBTE9HRCgicmVwZWF0TGF0ZXN0QnVmZmVyX2w6IHNsb3Qgd2FzIE5VTEwiKTsKICAgICAgICAgbUNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKAotICAgICAgICAgICAgICAgIG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJJZCwKLSAgICAgICAgICAgICAgICBtTGF0ZXN0U3VibWl0dGVkQnVmZmVyRnJhbWVOdW0sCisgICAgICAgICAgICAgICAgbUxhdGVzdEJ1ZmZlcklkLAorICAgICAgICAgICAgICAgIG1MYXRlc3RCdWZmZXJGcmFtZU51bSwKICAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwKICAgICAgICAgICAgICAgICBFR0xfTk9fU1lOQ19LSFIsCi0gICAgICAgICAgICAgICAgRmVuY2U6Ok5PX0ZFTkNFKTsKLSAgICAgICAgbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlcklkID0gLTE7Ci0gICAgICAgIG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJGcmFtZU51bSA9IDA7CisgICAgICAgICAgICAgICAgbUxhdGVzdEJ1ZmZlckZlbmNlKTsKKyAgICAgICAgbUxhdGVzdEJ1ZmZlcklkID0gLTE7CisgICAgICAgIG1MYXRlc3RCdWZmZXJGcmFtZU51bSA9IDA7CisgICAgICAgIG1MYXRlc3RCdWZmZXJGZW5jZSA9IEZlbmNlOjpOT19GRU5DRTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIGludCBjYmkgPSBmaW5kQXZhaWxhYmxlQ29kZWNCdWZmZXJfbCgpOwogICAgIGlmIChjYmkgPCAwKSB7CiAgICAgICAgIC8vIE5vIGJ1ZmZlcnMgYXZhaWxhYmxlLCBiYWlsLgotICAgICAgICBBTE9HVigicmVwZWF0TGF0ZXN0U3VibWl0dGVkQnVmZmVyX2w6IG5vIGNvZGVjIGJ1ZmZlcnMuIik7CisgICAgICAgIEFMT0dWKCJyZXBlYXRMYXRlc3RCdWZmZXJfbDogbm8gY29kZWMgYnVmZmVycy4iKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIEJ1ZmZlckl0ZW0gaXRlbTsKLSAgICBpdGVtLm1CdWYgPSBtTGF0ZXN0U3VibWl0dGVkQnVmZmVySWQ7Ci0gICAgaXRlbS5tRnJhbWVOdW1iZXIgPSBtTGF0ZXN0U3VibWl0dGVkQnVmZmVyRnJhbWVOdW07CisgICAgaXRlbS5tQnVmID0gbUxhdGVzdEJ1ZmZlcklkOworICAgIGl0ZW0ubUZyYW1lTnVtYmVyID0gbUxhdGVzdEJ1ZmZlckZyYW1lTnVtOwogICAgIGl0ZW0ubVRpbWVzdGFtcCA9IG1SZXBlYXRMYXN0RnJhbWVUaW1lc3RhbXA7CisgICAgaXRlbS5tRmVuY2UgPSBtTGF0ZXN0QnVmZmVyRmVuY2U7CiAKICAgICBzdGF0dXNfdCBlcnIgPSBzdWJtaXRCdWZmZXJfbChpdGVtLCBjYmkpOwogCkBAIC01MDQsNyArNjExLDcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgICsrbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlclVzZUNvdW50OworICAgICsrbUxhdGVzdEJ1ZmZlclVzZUNvdW50OwogCiAgICAgLyogcmVwZWF0IGxhc3QgZnJhbWUgdXAgdG8ga1JlcGVhdExhc3RGcmFtZUNvdW50IHRpbWVzLgogICAgICAqIGluIGNhc2Ugb2Ygc3RhdGljIHNjZW5lLCBhIHNpbmdsZSByZXBlYXQgbWlnaHQgbm90IGdldCByaWQgb2YgZW5jb2RlcgpAQCAtNTE0LDcgKzYyMSw3IEBACiAgICAgICAgIG1SZXBlYXRMYXN0RnJhbWVUaW1lc3RhbXAgPSBpdGVtLm1UaW1lc3RhbXAgKyBtUmVwZWF0QWZ0ZXJVcyAqIDEwMDA7CiAKICAgICAgICAgaWYgKG1SZWZsZWN0b3IgIT0gTlVMTCkgewotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlcGVhdExhc3RGcmFtZSwgbVJlZmxlY3Rvci0+aWQoKSk7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVwZWF0TGFzdEZyYW1lLCBtUmVmbGVjdG9yKTsKICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCArK21SZXBlYXRMYXN0RnJhbWVHZW5lcmF0aW9uKTsKICAgICAgICAgICAgIG1zZy0+cG9zdChtUmVwZWF0QWZ0ZXJVcyk7CiAgICAgICAgIH0KQEAgLTUyMywzMSArNjMwLDI5IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0TGF0ZXN0U3VibWl0dGVkQnVmZmVyX2woCi0gICAgICAgIGNvbnN0IEJ1ZmZlckl0ZW0gJml0ZW0pIHsKLSAgICBBTE9HVigic2V0TGF0ZXN0U3VibWl0dGVkQnVmZmVyX2wiKTsKK3ZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0TGF0ZXN0QnVmZmVyX2woCisgICAgICAgIGNvbnN0IEJ1ZmZlckl0ZW0gJml0ZW0sIGJvb2wgZHJvcHBlZCkgeworICAgIEFMT0dWKCJzZXRMYXRlc3RCdWZmZXJfbCIpOwogCi0gICAgaWYgKG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJJZCA+PSAwKSB7Ci0gICAgICAgIGlmIChtTGF0ZXN0U3VibWl0dGVkQnVmZmVyVXNlQ291bnQgPT0gMCkgewotICAgICAgICAgICAgbUNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKAotICAgICAgICAgICAgICAgICAgICBtTGF0ZXN0U3VibWl0dGVkQnVmZmVySWQsCi0gICAgICAgICAgICAgICAgICAgIG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJGcmFtZU51bSwKLSAgICAgICAgICAgICAgICAgICAgRUdMX05PX0RJU1BMQVksCi0gICAgICAgICAgICAgICAgICAgIEVHTF9OT19TWU5DX0tIUiwKLSAgICAgICAgICAgICAgICAgICAgRmVuY2U6Ok5PX0ZFTkNFKTsKKyAgICBpZiAobUxhdGVzdEJ1ZmZlcklkID49IDApIHsKKyAgICAgICAgaWYgKG1MYXRlc3RCdWZmZXJVc2VDb3VudCA9PSAwKSB7CisgICAgICAgICAgICByZWxlYXNlQnVmZmVyKG1MYXRlc3RCdWZmZXJJZCwgbUxhdGVzdEJ1ZmZlckZyYW1lTnVtLAorICAgICAgICAgICAgICAgICAgICBtQnVmZmVyU2xvdFttTGF0ZXN0QnVmZmVySWRdLCBtTGF0ZXN0QnVmZmVyRmVuY2UpOworICAgICAgICAgICAgLy8gbUxhdGVzdEJ1ZmZlckZlbmNlIHdpbGwgYmUgc2V0IHRvIG5ldyBmZW5jZSBqdXN0IGJlbG93CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtTGF0ZXN0U3VibWl0dGVkQnVmZmVySWQgPSBpdGVtLm1CdWY7Ci0gICAgbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlckZyYW1lTnVtID0gaXRlbS5tRnJhbWVOdW1iZXI7CisgICAgbUxhdGVzdEJ1ZmZlcklkID0gaXRlbS5tQnVmOworICAgIG1MYXRlc3RCdWZmZXJGcmFtZU51bSA9IGl0ZW0ubUZyYW1lTnVtYmVyOwogICAgIG1SZXBlYXRMYXN0RnJhbWVUaW1lc3RhbXAgPSBpdGVtLm1UaW1lc3RhbXAgKyBtUmVwZWF0QWZ0ZXJVcyAqIDEwMDA7CiAKLSAgICBtTGF0ZXN0U3VibWl0dGVkQnVmZmVyVXNlQ291bnQgPSAxOworICAgIG1MYXRlc3RCdWZmZXJVc2VDb3VudCA9IGRyb3BwZWQgPyAwIDogMTsKICAgICBtUmVwZWF0QnVmZmVyRGVmZXJyZWQgPSBmYWxzZTsKICAgICBtUmVwZWF0TGFzdEZyYW1lQ291bnQgPSBrUmVwZWF0TGFzdEZyYW1lQ291bnQ7CisgICAgbUxhdGVzdEJ1ZmZlckZlbmNlID0gaXRlbS5tRmVuY2U7CiAKICAgICBpZiAobVJlZmxlY3RvciAhPSBOVUxMKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZXBlYXRMYXN0RnJhbWUsIG1SZWZsZWN0b3ItPmlkKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVwZWF0TGFzdEZyYW1lLCBtUmVmbGVjdG9yKTsKICAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsICsrbVJlcGVhdExhc3RGcmFtZUdlbmVyYXRpb24pOwogICAgICAgICBtc2ctPnBvc3QobVJlcGVhdEFmdGVyVXMpOwogICAgIH0KQEAgLTY0MCw4ICs3NDUsNyBAQAogICAgIHJldHVybiB0aW1lVXM7CiB9CiAKLXN0YXR1c190IEdyYXBoaWNCdWZmZXJTb3VyY2U6OnN1Ym1pdEJ1ZmZlcl9sKAotICAgICAgICBjb25zdCBCdWZmZXJJdGVtICZpdGVtLCBpbnQgY2JpKSB7CitzdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpzdWJtaXRCdWZmZXJfbChjb25zdCBCdWZmZXJJdGVtICZpdGVtLCBpbnQgY2JpKSB7CiAgICAgQUxPR1YoInN1Ym1pdEJ1ZmZlcl9sIGNiaT0lZCIsIGNiaSk7CiAKICAgICBpbnQ2NF90IHRpbWVVcyA9IGdldFRpbWVzdGFtcChpdGVtKTsKQEAgLTY1NSwzNiArNzU5LDE4IEBACiAgICAgY29kZWNCdWZmZXIubUZyYW1lTnVtYmVyID0gaXRlbS5tRnJhbWVOdW1iZXI7CiAKICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSogaGVhZGVyID0gY29kZWNCdWZmZXIubUhlYWRlcjsKLSAgICBDSEVDSyhoZWFkZXItPm5BbGxvY0xlbiA+PSA0ICsgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCkpOwotICAgIE9NWF9VOCogZGF0YSA9IGhlYWRlci0+cEJ1ZmZlcjsKLSAgICBidWZmZXJfaGFuZGxlX3QgaGFuZGxlOwotICAgIGlmICghbVVzZUdyYXBoaWNCdWZmZXJJbk1ldGEpIHsKLSAgICAgICAgY29uc3QgT01YX1UzMiB0eXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2U7Ci0gICAgICAgIGhhbmRsZSA9IGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyLT5oYW5kbGU7Ci0gICAgICAgIG1lbWNweShkYXRhLCAmdHlwZSwgNCk7Ci0gICAgICAgIG1lbWNweShkYXRhICsgNCwgJmhhbmRsZSwgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGNvZGVjQnVmZmVyIGhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBHcmFwaGljQnVmZmVyLCBzbwotICAgICAgICAvLyBpdCBpcyB2YWxpZCB3aGlsZSBpdCBpcyB3aXRoIHRoZSBPTVggY29tcG9uZW50Ci0gICAgICAgIGNvbnN0IE9NWF9VMzIgdHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFwaGljQnVmZmVyOwotICAgICAgICBtZW1jcHkoZGF0YSwgJnR5cGUsIDQpOwotICAgICAgICAvLyBwYXNzaW5nIGEgbm9uLXJlZmVyZW5jZS1jb3VudGVkIGdyYXBoaWNCdWZmZXIKLSAgICAgICAgR3JhcGhpY0J1ZmZlciAqYnVmZmVyID0gY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXIuZ2V0KCk7Ci0gICAgICAgIGhhbmRsZSA9IGJ1ZmZlci0+aGFuZGxlOwotICAgICAgICBtZW1jcHkoZGF0YSArIDQsICZidWZmZXIsIHNpemVvZihidWZmZXIpKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtTm9kZUluc3RhbmNlLT5lbXB0eURpcmVjdEJ1ZmZlcihoZWFkZXIsIDAsCi0gICAgICAgICAgICA0ICsgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCksIE9NWF9CVUZGRVJGTEFHX0VORE9GRlJBTUUsCi0gICAgICAgICAgICB0aW1lVXMpOworICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlciA9IGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyOworICAgIHN0YXR1c190IGVyciA9IG1Ob2RlSW5zdGFuY2UtPmVtcHR5R3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIGhlYWRlciwgYnVmZmVyLCBPTVhfQlVGRkVSRkxBR19FTkRPRkZSQU1FLCB0aW1lVXMsCisgICAgICAgICAgICBpdGVtLm1GZW5jZS0+aXNWYWxpZCgpID8gaXRlbS5tRmVuY2UtPmR1cCgpIDogLTEpOwogICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR1coIldBUk5JTkc6IGVtcHR5RGlyZWN0QnVmZmVyIGZhaWxlZDogMHgleCIsIGVycik7CisgICAgICAgIEFMT0dXKCJXQVJOSU5HOiBlbXB0eU5hdGl2ZVdpbmRvd0J1ZmZlciBmYWlsZWQ6IDB4JXgiLCBlcnIpOwogICAgICAgICBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlciA9IE5VTEw7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgQUxPR1YoImVtcHR5RGlyZWN0QnVmZmVyIHN1Y2NlZWRlZCwgaD0lcCBwPSVwIGJ1ZmhhbmRsZT0lcCIsCi0gICAgICAgICAgICBoZWFkZXIsIGhlYWRlci0+cEJ1ZmZlciwgaGFuZGxlKTsKKyAgICBBTE9HVigiZW1wdHlOYXRpdmVXaW5kb3dCdWZmZXIgc3VjY2VlZGVkLCBoPSVwIHA9JXAgYnVmPSVwIGJ1ZmhhbmRsZT0lcCIsCisgICAgICAgICAgICBoZWFkZXIsIGhlYWRlci0+cEJ1ZmZlciwgYnVmZmVyLT5nZXROYXRpdmVCdWZmZXIoKSwgYnVmZmVyLT5oYW5kbGUpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtNzA3LDE5ICs3OTMsOSBAQAogICAgIENvZGVjQnVmZmVyJiBjb2RlY0J1ZmZlcihtQ29kZWNCdWZmZXJzLmVkaXRJdGVtQXQoY2JpKSk7CiAKICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSogaGVhZGVyID0gY29kZWNCdWZmZXIubUhlYWRlcjsKLSAgICBpZiAoRVhUUkFfQ0hFQ0spIHsKLSAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCBpbXBsZW1lbnRhdGlvbnMgdGhhdCBkb24ndCBjaGVjayBuRmlsbGVkTGVuLgotICAgICAgICBzaXplX3QgZmlsbExlbiA9IDQgKyBzaXplb2YoYnVmZmVyX2hhbmRsZV90KTsKLSAgICAgICAgQ0hFQ0soaGVhZGVyLT5uQWxsb2NMZW4gPj0gZmlsbExlbik7Ci0gICAgICAgIE9NWF9VOCogZGF0YSA9IGhlYWRlci0+cEJ1ZmZlcjsKLSAgICAgICAgbWVtc2V0KGRhdGEsIDB4Y2QsIGZpbGxMZW4pOwotICAgIH0KLQotICAgIHVpbnQ2NF90IHRpbWVzdGFtcCA9IDA7IC8vIGRvZXMgdGhpcyBtYXR0ZXI/Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtTm9kZUluc3RhbmNlLT5lbXB0eURpcmVjdEJ1ZmZlcihoZWFkZXIsIC8qb2Zmc2V0Ki8gMCwKLSAgICAgICAgICAgIC8qbGVuZ3RoKi8gMCwgT01YX0JVRkZFUkZMQUdfRU5ET0ZGUkFNRSB8IE9NWF9CVUZGRVJGTEFHX0VPUywKLSAgICAgICAgICAgIHRpbWVzdGFtcCk7CisgICAgc3RhdHVzX3QgZXJyID0gbU5vZGVJbnN0YW5jZS0+ZW1wdHlHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgaGVhZGVyLCBOVUxMIC8qIGJ1ZmZlciAqLywgT01YX0JVRkZFUkZMQUdfRU5ET0ZGUkFNRSB8IE9NWF9CVUZGRVJGTEFHX0VPUywKKyAgICAgICAgICAgIDAgLyogdGltZXN0YW1wICovLCAtMSAvKiBmZW5jZUZkICovKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIEFMT0dXKCJlbXB0eURpcmVjdEJ1ZmZlciBFT1MgZmFpbGVkOiAweCV4IiwgZXJyKTsKICAgICB9IGVsc2UgewpAQCAtNzUwLDYgKzgyNiwzNSBAQAogICAgIHJldHVybiAtMTsKIH0KIAorLyoKKyAqIFJlbGVhc2VzIGFuIGFjcXVpcmVkIGJ1ZmZlciBiYWNrIHRvIHRoZSBjb25zdW1lciBmb3IgZWl0aGVyIHBlcnNpc3RlbnQKKyAqIG9yIG5vbi1wZXJzaXN0ZW50IHN1cmZhY2VzLgorICoKKyAqIGlkOiBidWZmZXIgc2xvdCB0byByZWxlYXNlIChpbiBwZXJzaXN0ZW50IGNhc2UgdGhlIGlkIG1pZ2h0IGJlIGNoYW5nZWQpCisgKiBmcmFtZU51bTogZnJhbWUgbnVtYmVyIG9mIHRoZSBmcmFtZSBiZWluZyByZWxlYXNlZAorICogYnVmZmVyOiBHcmFwaGljQnVmZmVyIHBvaW50ZXIgdG8gcmVsZWFzZSAobm90ZSB0aGlzIG11c3Qgbm90IGJlICYgYXMgd2UKKyAqICAgICAgICAgd2lsbCBjbGVhciB0aGUgb3JpZ2luYWwgbUJ1ZmZlclNsb3QgaW4gcGVyc2lzdGVudCBjYXNlKQorICogZmVuY2U6IGZlbmNlIG9mIHRoZSBmcmFtZSBiZWluZyByZWxlYXNlZAorICovCit2b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6OnJlbGVhc2VCdWZmZXIoCisgICAgICAgIGludCAmaWQsIHVpbnQ2NF90IGZyYW1lTnVtLAorICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiBidWZmZXIsIGNvbnN0IHNwPEZlbmNlPiAmZmVuY2UpIHsKKyAgICBpZiAobUlzUGVyc2lzdGVudCkgeworICAgICAgICBtQ29uc3VtZXItPmRldGFjaEJ1ZmZlcihpZCk7CisgICAgICAgIG1CdWZmZXJTbG90W2lkXSA9IE5VTEw7CisKKyAgICAgICAgaWYgKG1Db25zdW1lci0+YXR0YWNoQnVmZmVyKCZpZCwgYnVmZmVyKSA9PSBPSykgeworICAgICAgICAgICAgbUNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBpZCwgMCwgRUdMX05PX0RJU1BMQVksIEVHTF9OT19TWU5DX0tIUiwgZmVuY2UpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgICAgIGlkLCBmcmFtZU51bSwgRUdMX05PX0RJU1BMQVksIEVHTF9OT19TWU5DX0tIUiwgZmVuY2UpOworICAgIH0KKyAgICBpZCA9IC0xOyAvLyBpbnZhbGlkYXRlIGlkCisgICAgbU51bUJ1ZmZlckFjcXVpcmVkLS07Cit9CisKIC8vIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIGNhbGxiYWNrCiB2b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6Om9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgLyppdGVtKi8pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKQEAgLTc3MCwxNCArODc1LDE3IEBACiAgICAgICAgIEJ1ZmZlckl0ZW0gaXRlbTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5hY3F1aXJlQnVmZmVyKCZpdGVtLCAwKTsKICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgbU51bUJ1ZmZlckFjcXVpcmVkKys7CisKICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UncmUgc2VlaW5nIHRoaXMgYnVmZmVyLCBhZGQgaXQgdG8gb3VyCiAgICAgICAgICAgICAvLyBzbG90IHRhYmxlLgogICAgICAgICAgICAgaWYgKGl0ZW0ubUdyYXBoaWNCdWZmZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJvbkZyYW1lQXZhaWxhYmxlOiBzZXR0aW5nIG1CdWZmZXJTbG90ICVkIiwgaXRlbS5tQnVmKTsKICAgICAgICAgICAgICAgICBtQnVmZmVyU2xvdFtpdGVtLm1CdWZdID0gaXRlbS5tR3JhcGhpY0J1ZmZlcjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcihpdGVtLm1CdWYsIGl0ZW0ubUZyYW1lTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NZTkNfS0hSLCBpdGVtLm1GZW5jZSk7CisKKyAgICAgICAgICAgIHJlbGVhc2VCdWZmZXIoaXRlbS5tQnVmLCBpdGVtLm1GcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgaXRlbS5tR3JhcGhpY0J1ZmZlciwgaXRlbS5tRmVuY2UpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC04NDIsNiArOTUwLDIzIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpzZXRNYXhGcHMoZmxvYXQgbWF4RnBzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBpZiAobUV4ZWN1dGluZykgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgbUZyYW1lRHJvcHBlciA9IG5ldyBGcmFtZURyb3BwZXIoKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtRnJhbWVEcm9wcGVyLT5zZXRNYXhGcmFtZVJhdGUobWF4RnBzKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIG1GcmFtZURyb3BwZXIuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0U2tpcEZyYW1lc0JlZm9yZVVzKGludDY0X3Qgc2tpcEZyYW1lc0JlZm9yZVVzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CiAKQEAgLTg4MCwxMiArMTAwNSwxMiBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBib29sIHN1Y2Nlc3MgPSByZXBlYXRMYXRlc3RTdWJtaXR0ZWRCdWZmZXJfbCgpOworICAgICAgICAgICAgYm9vbCBzdWNjZXNzID0gcmVwZWF0TGF0ZXN0QnVmZmVyX2woKTsKIAogICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigicmVwZWF0TGF0ZXN0U3VibWl0dGVkQnVmZmVyX2wgU1VDQ0VTUyIpOworICAgICAgICAgICAgICAgIEFMT0dWKCJyZXBlYXRMYXRlc3RCdWZmZXJfbCBTVUNDRVNTIik7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJyZXBlYXRMYXRlc3RTdWJtaXR0ZWRCdWZmZXJfbCBGQUlMVVJFIik7CisgICAgICAgICAgICAgICAgQUxPR1YoInJlcGVhdExhdGVzdEJ1ZmZlcl9sIEZBSUxVUkUiKTsKICAgICAgICAgICAgICAgICBtUmVwZWF0QnVmZmVyRGVmZXJyZWQgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaAppbmRleCA0MDFiYmMzLi4yZjkyOWQ5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmgKQEAgLTMwLDYgKzMwLDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgRnJhbWVEcm9wcGVyOworCiAvKgogICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGZlZWQgT01YIGNvZGVjcyBmcm9tIGEgU3VyZmFjZSB2aWEgQnVmZmVyUXVldWUuCiAgKgpAQCAtNDgsOSArNTAsMTUgQEAKICAqLwogY2xhc3MgR3JhcGhpY0J1ZmZlclNvdXJjZSA6IHB1YmxpYyBCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lciB7CiBwdWJsaWM6Ci0gICAgR3JhcGhpY0J1ZmZlclNvdXJjZShPTVhOb2RlSW5zdGFuY2UqIG5vZGVJbnN0YW5jZSwKLSAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlcldpZHRoLCB1aW50MzJfdCBidWZmZXJIZWlnaHQsIHVpbnQzMl90IGJ1ZmZlckNvdW50LAotICAgICAgICAgICAgYm9vbCB1c2VHcmFwaGljQnVmZmVySW5NZXRhID0gZmFsc2UpOworICAgIEdyYXBoaWNCdWZmZXJTb3VyY2UoCisgICAgICAgICAgICBPTVhOb2RlSW5zdGFuY2UqIG5vZGVJbnN0YW5jZSwKKyAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlcldpZHRoLAorICAgICAgICAgICAgdWludDMyX3QgYnVmZmVySGVpZ2h0LAorICAgICAgICAgICAgdWludDMyX3QgYnVmZmVyQ291bnQsCisgICAgICAgICAgICB1aW50MzJfdCBjb25zdW1lclVzYWdlLAorICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gJmNvbnN1bWVyID0gTlVMTAorICAgICk7CisKICAgICB2aXJ0dWFsIH5HcmFwaGljQnVmZmVyU291cmNlKCk7CiAKICAgICAvLyBXZSBjYW4ndCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbnN0cnVjdG9yIGZhaWxzLCBzbyB3ZSBqdXN0IHNldApAQCAtODYsNyArOTQsNyBAQAogCiAgICAgLy8gQ2FsbGVkIGZyb20gT25FbXB0eUJ1ZmZlckRvbmUuICBJZiB3ZSBoYXZlIGEgQlEgYnVmZmVyIGF2YWlsYWJsZSwKICAgICAvLyBmaWxsIGl0IHdpdGggYSBuZXcgZnJhbWUgb2YgZGF0YTsgb3RoZXJ3aXNlLCBqdXN0IG1hcmsgaXQgYXMgYXZhaWxhYmxlLgotICAgIHZvaWQgY29kZWNCdWZmZXJFbXB0aWVkKE9NWF9CVUZGRVJIRUFERVJUWVBFKiBoZWFkZXIpOworICAgIHZvaWQgY29kZWNCdWZmZXJFbXB0aWVkKE9NWF9CVUZGRVJIRUFERVJUWVBFKiBoZWFkZXIsIGludCBmZW5jZUZkKTsKIAogICAgIC8vIENhbGxlZCB3aGVuIG9teF9tZXNzYWdlOjpGSUxMX0JVRkZFUl9ET05FIGlzIHJlY2VpdmVkLiAoQ3VycmVudGx5IHRoZQogICAgIC8vIGJ1ZmZlciBzb3VyY2Ugd2lsbCBmaXggdGltZXN0YW1wIGluIHRoZSBoZWFkZXIgaWYgbmVlZGVkLikKQEAgLTExOSw2ICsxMjcsOSBAQAogICAgIC8vIG9mIHN1c3BlbnNpb24gb24gaW5wdXQuCiAgICAgc3RhdHVzX3Qgc2V0TWF4VGltZXN0YW1wR2FwVXMoaW50NjRfdCBtYXhHYXBVcyk7CiAKKyAgICAvLyBXaGVuIHNldCwgdGhlIG1heCBmcmFtZSByYXRlIGZlZCB0byB0aGUgZW5jb2RlciB3aWxsIGJlIGNhcHBlZCBhdCBtYXhGcHMuCisgICAgc3RhdHVzX3Qgc2V0TWF4RnBzKGZsb2F0IG1heEZwcyk7CisKICAgICAvLyBTZXRzIHRoZSB0aW1lIGxhcHNlIChvciBzbG93IG1vdGlvbikgcGFyYW1ldGVycy4KICAgICAvLyBkYXRhWzBdIGlzIHRoZSB0aW1lICh1cykgYmV0d2VlbiB0d28gZnJhbWVzIGZvciBwbGF5YmFjawogICAgIC8vIGRhdGFbMV0gaXMgdGhlIHRpbWUgKHVzKSBiZXR3ZWVuIHR3byBmcmFtZXMgZm9yIGNhcHR1cmUKQEAgLTE1MCw2ICsxNjEsMzEgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKTsKIAogcHJpdmF0ZToKKyAgICAvLyBQZXJzaXN0ZW50UHJveHlMaXN0ZW5lciBpcyBzaW1pbGFyIHRvIEJ1ZmZlclF1ZXVlOjpQcm94eUNvbnN1bWVyTGlzdGVuZXIKKyAgICAvLyBleGNlcHQgdGhhdCBpdCByZXR1cm5zIChhY3F1aXJlL2RldGFjaC9yZS1hdHRhY2hlL3JlbGVhc2UpIGJ1ZmZlcnMKKyAgICAvLyBpbiBvbkZyYW1lQXZhaWxhYmxlKCkgaWYgdGhlIGFjdHVhbCBjb25zdW1lciBvYmplY3QgaXMgbm8gbG9uZ2VyIHZhbGlkLgorICAgIC8vCisgICAgLy8gVGhpcyBjbGFzcyBpcyB1c2VkIGluIHBlcnNpc3RlbnQgaW5wdXQgc3VyZmFjZSBjYXNlIHRvIHByZXZlbnQgYnVmZmVyCisgICAgLy8gbG9zcyB3aGVuIG9uRnJhbWVBdmFpbGFibGUoKSBpcyByZWNlaXZlZCB3aGlsZSB3ZSBkb24ndCBoYXZlIGEgdmFsaWQKKyAgICAvLyBjb25zdW1lciBhcm91bmQuCisgICAgY2xhc3MgUGVyc2lzdGVudFByb3h5TGlzdGVuZXIgOiBwdWJsaWMgQm5Db25zdW1lckxpc3RlbmVyIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgUGVyc2lzdGVudFByb3h5TGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+ICZjb25zdW1lciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8Q29uc3VtZXJMaXN0ZW5lcj4mIGNvbnN1bWVyTGlzdGVuZXIpOworICAgICAgICAgICAgdmlydHVhbCB+UGVyc2lzdGVudFByb3h5TGlzdGVuZXIoKTsKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pIG92ZXJyaWRlOworICAgICAgICAgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVSZXBsYWNlZChjb25zdCBCdWZmZXJJdGVtJiBpdGVtKSBvdmVycmlkZTsKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlcnNSZWxlYXNlZCgpIG92ZXJyaWRlOworICAgICAgICAgICAgdmlydHVhbCB2b2lkIG9uU2lkZWJhbmRTdHJlYW1DaGFuZ2VkKCkgb3ZlcnJpZGU7CisgICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgLy8gbUNvbnN1bWVyTGlzdGVuZXIgaXMgYSB3ZWFrIHJlZmVyZW5jZSB0byB0aGUgSUNvbnN1bWVyTGlzdGVuZXIuCisgICAgICAgICAgICB3cDxDb25zdW1lckxpc3RlbmVyPiBtQ29uc3VtZXJMaXN0ZW5lcjsKKyAgICAgICAgICAgIC8vIG1Db25zdW1lciBpcyBhIHdlYWsgcmVmZXJlbmNlIHRvIHRoZSBJR3JhcGhpY0J1ZmZlckNvbnN1bWVyLCB1c2UKKyAgICAgICAgICAgIC8vIGEgd2VhayByZWYgdG8gYXZvaWQgY2lyY3VsYXIgcmVmIGJldHdlZW4gbUNvbnN1bWVyIGFuZCB0aGlzIGNsYXNzCisgICAgICAgICAgICB3cDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBtQ29uc3VtZXI7CisgICAgfTsKKwogICAgIC8vIEtlZXAgdHJhY2sgb2YgY29kZWMgaW5wdXQgYnVmZmVycy4gIFRoZXkgbWF5IGVpdGhlciBiZSBhdmFpbGFibGUKICAgICAvLyAobUdyYXBoaWNCdWZmZXIgPT0gTlVMTCkgb3IgaW4gdXNlIGJ5IHRoZSBjb2RlYy4KICAgICBzdHJ1Y3QgQ29kZWNCdWZmZXIgewpAQCAtMTkzLDggKzIyOSwxMyBAQAogICAgIC8vIGRvaW5nIGFueXRoaW5nIGlmIHdlIGRvbid0IGhhdmUgYSBjb2RlYyBidWZmZXIgYXZhaWxhYmxlLgogICAgIHZvaWQgc3VibWl0RW5kT2ZJbnB1dFN0cmVhbV9sKCk7CiAKLSAgICB2b2lkIHNldExhdGVzdFN1Ym1pdHRlZEJ1ZmZlcl9sKGNvbnN0IEJ1ZmZlckl0ZW0gJml0ZW0pOwotICAgIGJvb2wgcmVwZWF0TGF0ZXN0U3VibWl0dGVkQnVmZmVyX2woKTsKKyAgICAvLyBSZWxlYXNlIGJ1ZmZlciB0byB0aGUgY29uc3VtZXIKKyAgICB2b2lkIHJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBpbnQgJmlkLCB1aW50NjRfdCBmcmFtZU51bSwKKyAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlciwgY29uc3Qgc3A8RmVuY2U+ICZmZW5jZSk7CisKKyAgICB2b2lkIHNldExhdGVzdEJ1ZmZlcl9sKGNvbnN0IEJ1ZmZlckl0ZW0gJml0ZW0sIGJvb2wgZHJvcHBlZCk7CisgICAgYm9vbCByZXBlYXRMYXRlc3RCdWZmZXJfbCgpOwogICAgIGludDY0X3QgZ2V0VGltZXN0YW1wKGNvbnN0IEJ1ZmZlckl0ZW0gJml0ZW0pOwogCiAgICAgLy8gTG9jaywgY292ZXJzIGFsbCBtZW1iZXIgdmFyaWFibGVzLgpAQCAtMjE0LDYgKzI1NSw3IEBACiAgICAgLy8gT3VyIEJ1ZmZlclF1ZXVlIGludGVyZmFjZXMuIG1Qcm9kdWNlciBpcyBwYXNzZWQgdG8gdGhlIHByb2R1Y2VyIHRocm91Z2gKICAgICAvLyBnZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyLCBhbmQgbUNvbnN1bWVyIGlzIHVzZWQgaW50ZXJuYWxseSB0byByZXRyaWV2ZQogICAgIC8vIHRoZSBidWZmZXJzIHF1ZXVlZCBieSB0aGUgcHJvZHVjZXIuCisgICAgYm9vbCBtSXNQZXJzaXN0ZW50OwogICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1Qcm9kdWNlcjsKICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBtQ29uc3VtZXI7CiAKQEAgLTIyMSw2ICsyNjMsOSBAQAogICAgIC8vIGZvcndhcmRlZCB0byB0aGUgY29kZWMuCiAgICAgc2l6ZV90IG1OdW1GcmFtZXNBdmFpbGFibGU7CiAKKyAgICAvLyBOdW1iZXIgb2YgZnJhbWVzIGFjcXVpcmVkIGZyb20gY29uc3VtZXIgKGRlYnVnIG9ubHkpCisgICAgaW50MzJfdCBtTnVtQnVmZmVyQWNxdWlyZWQ7CisKICAgICAvLyBTZXQgdG8gdHJ1ZSBpZiB3ZSB3YW50IHRvIHNlbmQgZW5kLW9mLXN0cmVhbSBhZnRlciB3ZSBydW4gb3V0IG9mCiAgICAgLy8gZnJhbWVzIGluIEJ1ZmZlclF1ZXVlLgogICAgIGJvb2wgbUVuZE9mU3RyZWFtOwpAQCAtMjM1LDcgKzI4MCw3IEBACiAgICAgVmVjdG9yPENvZGVjQnVmZmVyPiBtQ29kZWNCdWZmZXJzOwogCiAgICAgLy8vLwotICAgIGZyaWVuZCBjbGFzcyBBSGFuZGxlclJlZmxlY3RvcjxHcmFwaGljQnVmZmVyU291cmNlPjsKKyAgICBmcmllbmQgc3RydWN0IEFIYW5kbGVyUmVmbGVjdG9yPEdyYXBoaWNCdWZmZXJTb3VyY2U+OwogCiAgICAgZW51bSB7CiAgICAgICAgIGtXaGF0UmVwZWF0TGFzdEZyYW1lLApAQCAtMjUwLDYgKzI5NSw4IEBACiAgICAgaW50NjRfdCBtUHJldk1vZGlmaWVkVGltZVVzOwogICAgIGludDY0X3QgbVNraXBGcmFtZXNCZWZvcmVOczsKIAorICAgIHNwPEZyYW1lRHJvcHBlcj4gbUZyYW1lRHJvcHBlcjsKKwogICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CiAgICAgc3A8QUhhbmRsZXJSZWZsZWN0b3I8R3JhcGhpY0J1ZmZlclNvdXJjZT4gPiBtUmVmbGVjdG9yOwogCkBAIC0yNTgsMTEgKzMwNSwxMiBAQAogICAgIGludDY0X3QgbVJlcGVhdExhc3RGcmFtZVRpbWVzdGFtcDsKICAgICBpbnQzMl90IG1SZXBlYXRMYXN0RnJhbWVDb3VudDsKIAotICAgIGludCBtTGF0ZXN0U3VibWl0dGVkQnVmZmVySWQ7Ci0gICAgdWludDY0X3QgbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlckZyYW1lTnVtOwotICAgIGludDMyX3QgbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlclVzZUNvdW50OworICAgIGludCBtTGF0ZXN0QnVmZmVySWQ7CisgICAgdWludDY0X3QgbUxhdGVzdEJ1ZmZlckZyYW1lTnVtOworICAgIGludDMyX3QgbUxhdGVzdEJ1ZmZlclVzZUNvdW50OworICAgIHNwPEZlbmNlPiBtTGF0ZXN0QnVmZmVyRmVuY2U7CiAKLSAgICAvLyBUaGUgcHJldmlvdXNseSBzdWJtaXR0ZWQgYnVmZmVyIHNob3VsZCd2ZSBiZWVuIHJlcGVhdGVkIGJ1dAorICAgIC8vIFRoZSBwcmV2aW91cyBidWZmZXIgc2hvdWxkJ3ZlIGJlZW4gcmVwZWF0ZWQgYnV0CiAgICAgLy8gbm8gY29kZWMgYnVmZmVyIHdhcyBhdmFpbGFibGUgYXQgdGhlIHRpbWUuCiAgICAgYm9vbCBtUmVwZWF0QnVmZmVyRGVmZXJyZWQ7CiAKQEAgLTI3Miw3ICszMjAsNyBAQAogICAgIGludDY0X3QgbVByZXZDYXB0dXJlVXM7CiAgICAgaW50NjRfdCBtUHJldkZyYW1lVXM7CiAKLSAgICBib29sIG1Vc2VHcmFwaGljQnVmZmVySW5NZXRhOworICAgIE1ldGFkYXRhQnVmZmVyVHlwZSBtTWV0YWRhdGFCdWZmZXJUeXBlOwogCiAgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKaW5kZXggYTk0MzY0Ni4uNTZiNjA1NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKQEAgLTMyLDcgKzMyLDkgQEAKIAogI2luY2x1ZGUgIk9NWE1hc3Rlci5oIgogCisjaW5jbHVkZSA8T01YX0FzU3RyaW5nLmg+CiAjaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgorI2luY2x1ZGUgPE9NWF9WaWRlb0V4dC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTYwLDcgKzYyLDExIEBACiBzdHJ1Y3QgT01YOjpDYWxsYmFja0Rpc3BhdGNoZXIgOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgQ2FsbGJhY2tEaXNwYXRjaGVyKE9NWE5vZGVJbnN0YW5jZSAqb3duZXIpOwogCi0gICAgdm9pZCBwb3N0KGNvbnN0IG9teF9tZXNzYWdlICZtc2cpOworICAgIC8vIFBvc3RzIHxtc2d8IHRvIHRoZSBsaXN0ZW5lcidzIHF1ZXVlLiBJZiB8cmVhbFRpbWV8IGlzIHRydWUsIHRoZSBsaXN0ZW5lciB0aHJlYWQgaXMgbm90aWZpZWQKKyAgICAvLyB0aGF0IGEgbmV3IG1lc3NhZ2UgaXMgYXZhaWxhYmxlIG9uIHRoZSBxdWV1ZS4gT3RoZXJ3aXNlLCB0aGUgbWVzc2FnZSBzdGF5cyBvbiB0aGUgcXVldWUsIGJ1dAorICAgIC8vIHRoZSBsaXN0ZW5lciBpcyBub3Qgbm90aWZpZWQgb2YgaXQuIEl0IHdpbGwgcHJvY2VzcyB0aGlzIG1lc3NhZ2Ugd2hlbiBhIHN1YnNlcXVlbnQgbWVzc2FnZQorICAgIC8vIGlzIHBvc3RlZCB3aXRoIHxyZWFsVGltZXwgc2V0IHRvIHRydWUuCisgICAgdm9pZCBwb3N0KGNvbnN0IG9teF9tZXNzYWdlICZtc2csIGJvb2wgcmVhbFRpbWUgPSB0cnVlKTsKIAogICAgIGJvb2wgbG9vcCgpOwogCkBAIC03MywxMSArNzksMTEgQEAKICAgICBPTVhOb2RlSW5zdGFuY2UgKm1Pd25lcjsKICAgICBib29sIG1Eb25lOwogICAgIENvbmRpdGlvbiBtUXVldWVDaGFuZ2VkOwotICAgIExpc3Q8b214X21lc3NhZ2U+IG1RdWV1ZTsKKyAgICBzdGQ6Omxpc3Q8b214X21lc3NhZ2U+IG1RdWV1ZTsKIAogICAgIHNwPENhbGxiYWNrRGlzcGF0Y2hlclRocmVhZD4gbVRocmVhZDsKIAotICAgIHZvaWQgZGlzcGF0Y2goY29uc3Qgb214X21lc3NhZ2UgJm1zZyk7CisgICAgdm9pZCBkaXNwYXRjaChzdGQ6Omxpc3Q8b214X21lc3NhZ2U+ICZtZXNzYWdlcyk7CiAKICAgICBDYWxsYmFja0Rpc3BhdGNoZXIoY29uc3QgQ2FsbGJhY2tEaXNwYXRjaGVyICYpOwogICAgIENhbGxiYWNrRGlzcGF0Y2hlciAmb3BlcmF0b3I9KGNvbnN0IENhbGxiYWNrRGlzcGF0Y2hlciAmKTsKQEAgLTEwOCwyNCArMTE0LDI2IEBACiAgICAgfQogfQogCi12b2lkIE9NWDo6Q2FsbGJhY2tEaXNwYXRjaGVyOjpwb3N0KGNvbnN0IG9teF9tZXNzYWdlICZtc2cpIHsKK3ZvaWQgT01YOjpDYWxsYmFja0Rpc3BhdGNoZXI6OnBvc3QoY29uc3Qgb214X21lc3NhZ2UgJm1zZywgYm9vbCByZWFsVGltZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBtUXVldWUucHVzaF9iYWNrKG1zZyk7Ci0gICAgbVF1ZXVlQ2hhbmdlZC5zaWduYWwoKTsKKyAgICBpZiAocmVhbFRpbWUpIHsKKyAgICAgICAgbVF1ZXVlQ2hhbmdlZC5zaWduYWwoKTsKKyAgICB9CiB9CiAKLXZvaWQgT01YOjpDYWxsYmFja0Rpc3BhdGNoZXI6OmRpc3BhdGNoKGNvbnN0IG9teF9tZXNzYWdlICZtc2cpIHsKK3ZvaWQgT01YOjpDYWxsYmFja0Rpc3BhdGNoZXI6OmRpc3BhdGNoKHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT4gJm1lc3NhZ2VzKSB7CiAgICAgaWYgKG1Pd25lciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJXb3VsZCBoYXZlIGRpc3BhdGNoZWQgYSBtZXNzYWdlIHRvIGEgbm9kZSB0aGF0J3MgYWxyZWFkeSBnb25lLiIpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIG1Pd25lci0+b25NZXNzYWdlKG1zZyk7CisgICAgbU93bmVyLT5vbk1lc3NhZ2VzKG1lc3NhZ2VzKTsKIH0KIAogYm9vbCBPTVg6OkNhbGxiYWNrRGlzcGF0Y2hlcjo6bG9vcCgpIHsKICAgICBmb3IgKDs7KSB7Ci0gICAgICAgIG9teF9tZXNzYWdlIG1zZzsKKyAgICAgICAgc3RkOjpsaXN0PG9teF9tZXNzYWdlPiBtZXNzYWdlczsKIAogICAgICAgICB7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwpAQCAtMTM3LDExICsxNDUsMTAgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbXNnID0gKm1RdWV1ZS5iZWdpbigpOwotICAgICAgICAgICAgbVF1ZXVlLmVyYXNlKG1RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIG1lc3NhZ2VzLnN3YXAobVF1ZXVlKTsKICAgICAgICAgfQogCi0gICAgICAgIGRpc3BhdGNoKG1zZyk7CisgICAgICAgIGRpc3BhdGNoKG1lc3NhZ2VzKTsKICAgICB9CiAKICAgICByZXR1cm4gZmFsc2U7CkBAIC0yNDMsMTEgKzI1MCwxMSBAQAogICAgICAgICAgICAgaW5zdGFuY2UsICZoYW5kbGUpOwogCiAgICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb25lKSB7Ci0gICAgICAgIEFMT0dFKCJGQUlMRUQgdG8gYWxsb2NhdGUgb214IGNvbXBvbmVudCAnJXMnIiwgbmFtZSk7CisgICAgICAgIEFMT0dFKCJGQUlMRUQgdG8gYWxsb2NhdGUgb214IGNvbXBvbmVudCAnJXMnIGVycj0lcyglI3gpIiwgbmFtZSwgYXNTdHJpbmcoZXJyKSwgZXJyKTsKIAogICAgICAgICBpbnN0YW5jZS0+b25HZXRIYW5kbGVGYWlsZWQoKTsKIAotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIFN0YXR1c0Zyb21PTVhFcnJvcihlcnIpOwogICAgIH0KIAogICAgICpub2RlID0gbWFrZU5vZGVJRChpbnN0YW5jZSk7CkBAIC0zNDEsOCArMzQ4LDggQEAKIH0KIAogc3RhdHVzX3QgT01YOjpzdG9yZU1ldGFEYXRhSW5CdWZmZXJzKAotICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlKSB7Ci0gICAgcmV0dXJuIGZpbmRJbnN0YW5jZShub2RlKS0+c3RvcmVNZXRhRGF0YUluQnVmZmVycyhwb3J0X2luZGV4LCBlbmFibGUpOworICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlLCBNZXRhZGF0YUJ1ZmZlclR5cGUgKnR5cGUpIHsKKyAgICByZXR1cm4gZmluZEluc3RhbmNlKG5vZGUpLT5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzKHBvcnRfaW5kZXgsIGVuYWJsZSwgdHlwZSk7CiB9CiAKIHN0YXR1c190IE9NWDo6cHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2soCkBAIC0zNjEsOSArMzY4LDkgQEAKIAogc3RhdHVzX3QgT01YOjp1c2VCdWZmZXIoCiAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAotICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlcikgeworICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlciwgT01YX1UzMiBhbGxvdHRlZFNpemUpIHsKICAgICByZXR1cm4gZmluZEluc3RhbmNlKG5vZGUpLT51c2VCdWZmZXIoCi0gICAgICAgICAgICBwb3J0X2luZGV4LCBwYXJhbXMsIGJ1ZmZlcik7CisgICAgICAgICAgICBwb3J0X2luZGV4LCBwYXJhbXMsIGJ1ZmZlciwgYWxsb3R0ZWRTaXplKTsKIH0KIAogc3RhdHVzX3QgT01YOjp1c2VHcmFwaGljQnVmZmVyKApAQCAtMzgyLDExICszODksMjUgQEAKIAogc3RhdHVzX3QgT01YOjpjcmVhdGVJbnB1dFN1cmZhY2UoCiAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LAotICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqYnVmZmVyUHJvZHVjZXIpIHsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKmJ1ZmZlclByb2R1Y2VyLCBNZXRhZGF0YUJ1ZmZlclR5cGUgKnR5cGUpIHsKICAgICByZXR1cm4gZmluZEluc3RhbmNlKG5vZGUpLT5jcmVhdGVJbnB1dFN1cmZhY2UoCi0gICAgICAgICAgICBwb3J0X2luZGV4LCBidWZmZXJQcm9kdWNlcik7CisgICAgICAgICAgICBwb3J0X2luZGV4LCBidWZmZXJQcm9kdWNlciwgdHlwZSk7CiB9CiAKK3N0YXR1c190IE9NWDo6Y3JlYXRlUGVyc2lzdGVudElucHV0U3VyZmFjZSgKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKmJ1ZmZlclByb2R1Y2VyLAorICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiAqYnVmZmVyQ29uc3VtZXIpIHsKKyAgICByZXR1cm4gT01YTm9kZUluc3RhbmNlOjpjcmVhdGVQZXJzaXN0ZW50SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgYnVmZmVyUHJvZHVjZXIsIGJ1ZmZlckNvbnN1bWVyKTsKK30KKworc3RhdHVzX3QgT01YOjpzZXRJbnB1dFN1cmZhY2UoCisgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LAorICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiAmYnVmZmVyQ29uc3VtZXIsIE1ldGFkYXRhQnVmZmVyVHlwZSAqdHlwZSkgeworICAgIHJldHVybiBmaW5kSW5zdGFuY2Uobm9kZSktPnNldElucHV0U3VyZmFjZShwb3J0X2luZGV4LCBidWZmZXJDb25zdW1lciwgdHlwZSk7Cit9CisKKwogc3RhdHVzX3QgT01YOjpzaWduYWxFbmRPZklucHV0U3RyZWFtKG5vZGVfaWQgbm9kZSkgewogICAgIHJldHVybiBmaW5kSW5zdGFuY2Uobm9kZSktPnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKTsKIH0KQEAgLTQwMCw5ICs0MjEsOSBAQAogCiBzdGF0dXNfdCBPTVg6OmFsbG9jYXRlQnVmZmVyV2l0aEJhY2t1cCgKICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCi0gICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyKSB7CisgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyLCBPTVhfVTMyIGFsbG90dGVkU2l6ZSkgewogICAgIHJldHVybiBmaW5kSW5zdGFuY2Uobm9kZSktPmFsbG9jYXRlQnVmZmVyV2l0aEJhY2t1cCgKLSAgICAgICAgICAgIHBvcnRfaW5kZXgsIHBhcmFtcywgYnVmZmVyKTsKKyAgICAgICAgICAgIHBvcnRfaW5kZXgsIHBhcmFtcywgYnVmZmVyLCBhbGxvdHRlZFNpemUpOwogfQogCiBzdGF0dXNfdCBPTVg6OmZyZWVCdWZmZXIobm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIGJ1ZmZlcl9pZCBidWZmZXIpIHsKQEAgLTQxMCwxNyArNDMxLDE3IEBACiAgICAgICAgICAgICBwb3J0X2luZGV4LCBidWZmZXIpOwogfQogCi1zdGF0dXNfdCBPTVg6OmZpbGxCdWZmZXIobm9kZV9pZCBub2RlLCBidWZmZXJfaWQgYnVmZmVyKSB7Ci0gICAgcmV0dXJuIGZpbmRJbnN0YW5jZShub2RlKS0+ZmlsbEJ1ZmZlcihidWZmZXIpOworc3RhdHVzX3QgT01YOjpmaWxsQnVmZmVyKG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlciwgaW50IGZlbmNlRmQpIHsKKyAgICByZXR1cm4gZmluZEluc3RhbmNlKG5vZGUpLT5maWxsQnVmZmVyKGJ1ZmZlciwgZmVuY2VGZCk7CiB9CiAKIHN0YXR1c190IE9NWDo6ZW1wdHlCdWZmZXIoCiAgICAgICAgIG5vZGVfaWQgbm9kZSwKICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlciwKICAgICAgICAgT01YX1UzMiByYW5nZV9vZmZzZXQsIE9NWF9VMzIgcmFuZ2VfbGVuZ3RoLAotICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wKSB7CisgICAgICAgIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXAsIGludCBmZW5jZUZkKSB7CiAgICAgcmV0dXJuIGZpbmRJbnN0YW5jZShub2RlKS0+ZW1wdHlCdWZmZXIoCi0gICAgICAgICAgICBidWZmZXIsIHJhbmdlX29mZnNldCwgcmFuZ2VfbGVuZ3RoLCBmbGFncywgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIGJ1ZmZlciwgcmFuZ2Vfb2Zmc2V0LCByYW5nZV9sZW5ndGgsIGZsYWdzLCB0aW1lc3RhbXAsIGZlbmNlRmQpOwogfQogCiBzdGF0dXNfdCBPTVg6OmdldEV4dGVuc2lvbkluZGV4KApAQCAtNDQ1LDMxICs0NjYsNTYgQEAKICAgICAgICAgT01YX0lOIE9NWF9FVkVOVFRZUEUgZUV2ZW50LAogICAgICAgICBPTVhfSU4gT01YX1UzMiBuRGF0YTEsCiAgICAgICAgIE9NWF9JTiBPTVhfVTMyIG5EYXRhMiwKLSAgICAgICAgT01YX0lOIE9NWF9QVFIgLyogcEV2ZW50RGF0YSAqLykgeworICAgICAgICBPTVhfSU4gT01YX1BUUiBwRXZlbnREYXRhKSB7CiAgICAgQUxPR1YoIk9uRXZlbnQoJWQsICUiIFBSSXUzMiIsICUiIFBSSXUzMiAiKSIsIGVFdmVudCwgbkRhdGExLCBuRGF0YTIpOwogCiAgICAgLy8gRm9yd2FyZCB0byBPTVhOb2RlSW5zdGFuY2UuCiAgICAgZmluZEluc3RhbmNlKG5vZGUpLT5vbkV2ZW50KGVFdmVudCwgbkRhdGExLCBuRGF0YTIpOwogCisgICAgc3A8T01YOjpDYWxsYmFja0Rpc3BhdGNoZXI+IGRpc3BhdGNoZXIgPSBmaW5kRGlzcGF0Y2hlcihub2RlKTsKKworICAgIC8vIG91dHB1dCByZW5kZXJlZCBldmVudHMgYXJlIG5vdCBwcm9jZXNzZWQgYXMgcmVndWxhciBldmVudHMgdW50aWwgdGhleSBoaXQgdGhlIG9ic2VydmVyCisgICAgaWYgKGVFdmVudCA9PSBPTVhfRXZlbnRPdXRwdXRSZW5kZXJlZCkgeworICAgICAgICBpZiAocEV2ZW50RGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICB9CisKKyAgICAgICAgLy8gcHJvY2VzcyBkYXRhIGZyb20gYXJyYXkKKyAgICAgICAgT01YX1ZJREVPX1JFTkRFUkVWRU5UVFlQRSAqcmVuZGVyRGF0YSA9IChPTVhfVklERU9fUkVOREVSRVZFTlRUWVBFICopcEV2ZW50RGF0YTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuRGF0YTE7ICsraSkgeworICAgICAgICAgICAgb214X21lc3NhZ2UgbXNnOworICAgICAgICAgICAgbXNnLnR5cGUgPSBvbXhfbWVzc2FnZTo6RlJBTUVfUkVOREVSRUQ7CisgICAgICAgICAgICBtc2cubm9kZSA9IG5vZGU7CisgICAgICAgICAgICBtc2cuZmVuY2VGZCA9IC0xOworICAgICAgICAgICAgbXNnLnUucmVuZGVyX2RhdGEudGltZXN0YW1wID0gcmVuZGVyRGF0YVtpXS5uTWVkaWFUaW1lVXM7CisgICAgICAgICAgICBtc2cudS5yZW5kZXJfZGF0YS5uYW5vVGltZSA9IHJlbmRlckRhdGFbaV0ublN5c3RlbVRpbWVOczsKKworICAgICAgICAgICAgZGlzcGF0Y2hlci0+cG9zdChtc2csIGZhbHNlIC8qIHJlYWxUaW1lICovKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICB9CisKICAgICBvbXhfbWVzc2FnZSBtc2c7CiAgICAgbXNnLnR5cGUgPSBvbXhfbWVzc2FnZTo6RVZFTlQ7CiAgICAgbXNnLm5vZGUgPSBub2RlOworICAgIG1zZy5mZW5jZUZkID0gLTE7CiAgICAgbXNnLnUuZXZlbnRfZGF0YS5ldmVudCA9IGVFdmVudDsKICAgICBtc2cudS5ldmVudF9kYXRhLmRhdGExID0gbkRhdGExOwogICAgIG1zZy51LmV2ZW50X2RhdGEuZGF0YTIgPSBuRGF0YTI7CiAKLSAgICBmaW5kRGlzcGF0Y2hlcihub2RlKS0+cG9zdChtc2cpOworICAgIGRpc3BhdGNoZXItPnBvc3QobXNnLCB0cnVlIC8qIHJlYWxUaW1lICovKTsKIAogICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogfQogCiBPTVhfRVJST1JUWVBFIE9NWDo6T25FbXB0eUJ1ZmZlckRvbmUoCi0gICAgICAgIG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlciwgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyKSB7CisgICAgICAgIG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlciwgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyLCBpbnQgZmVuY2VGZCkgewogICAgIEFMT0dWKCJPbkVtcHR5QnVmZmVyRG9uZSBidWZmZXI9JXAiLCBwQnVmZmVyKTsKIAogICAgIG9teF9tZXNzYWdlIG1zZzsKICAgICBtc2cudHlwZSA9IG9teF9tZXNzYWdlOjpFTVBUWV9CVUZGRVJfRE9ORTsKICAgICBtc2cubm9kZSA9IG5vZGU7CisgICAgbXNnLmZlbmNlRmQgPSBmZW5jZUZkOwogICAgIG1zZy51LmJ1ZmZlcl9kYXRhLmJ1ZmZlciA9IGJ1ZmZlcjsKIAogICAgIGZpbmREaXNwYXRjaGVyKG5vZGUpLT5wb3N0KG1zZyk7CkBAIC00NzgsMTIgKzUyNCwxMyBAQAogfQogCiBPTVhfRVJST1JUWVBFIE9NWDo6T25GaWxsQnVmZmVyRG9uZSgKLSAgICAgICAgbm9kZV9pZCBub2RlLCBidWZmZXJfaWQgYnVmZmVyLCBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUgKnBCdWZmZXIpIHsKKyAgICAgICAgbm9kZV9pZCBub2RlLCBidWZmZXJfaWQgYnVmZmVyLCBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUgKnBCdWZmZXIsIGludCBmZW5jZUZkKSB7CiAgICAgQUxPR1YoIk9uRmlsbEJ1ZmZlckRvbmUgYnVmZmVyPSVwIiwgcEJ1ZmZlcik7CiAKICAgICBvbXhfbWVzc2FnZSBtc2c7CiAgICAgbXNnLnR5cGUgPSBvbXhfbWVzc2FnZTo6RklMTF9CVUZGRVJfRE9ORTsKICAgICBtc2cubm9kZSA9IG5vZGU7CisgICAgbXNnLmZlbmNlRmQgPSBmZW5jZUZkOwogICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmJ1ZmZlciA9IGJ1ZmZlcjsKICAgICBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5yYW5nZV9vZmZzZXQgPSBwQnVmZmVyLT5uT2Zmc2V0OwogICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnJhbmdlX2xlbmd0aCA9IHBCdWZmZXItPm5GaWxsZWRMZW47CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCmluZGV4IDdlYTM0ZmYuLjg3MzVlZmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8Z3VpL0J1ZmZlclF1ZXVlLmg+CiAjaW5jbHVkZSA8SGFyZHdhcmVBUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAKICNpbmNsdWRlIDx1dGlscy9taXNjLmg+CkBAIC03NSwxMSArNzYsMTEgQEAKICNkZWZpbmUgU0lNUExFX05FV19CVUZGRVIoYnVmZmVyX2lkLCBwb3J0LCBzaXplLCBkYXRhKSBcCiAgICAgTkVXX0JVRkZFUl9GTVQoYnVmZmVyX2lkLCBwb3J0LCAiJXp1QCVwIiwgKHNpemUpLCAoZGF0YSkpCiAKLSNkZWZpbmUgRU1QVFlfQlVGRkVSKGFkZHIsIGhlYWRlcikgIiUjeCBbJXVAJXBdIiwgXAotICAgIChhZGRyKSwgKGhlYWRlciktPm5BbGxvY0xlbiwgKGhlYWRlciktPnBCdWZmZXIKLSNkZWZpbmUgRlVMTF9CVUZGRVIoYWRkciwgaGVhZGVyKSAiJSMiIFBSSXhQVFIgIiBbJXVAJXAgKCV1Li4rJXUpIGY9JXggdHM9JWxsZF0iLCBcCisjZGVmaW5lIEVNUFRZX0JVRkZFUihhZGRyLCBoZWFkZXIsIGZlbmNlRmQpICIlI3ggWyV1QCVwIGZjPSVkXSIsIFwKKyAgICAoYWRkciksIChoZWFkZXIpLT5uQWxsb2NMZW4sIChoZWFkZXIpLT5wQnVmZmVyLCAoZmVuY2VGZCkKKyNkZWZpbmUgRlVMTF9CVUZGRVIoYWRkciwgaGVhZGVyLCBmZW5jZUZkKSAiJSMiIFBSSXhQVFIgIiBbJXVAJXAgKCV1Li4rJXUpIGY9JXggdHM9JWxsZCBmYz0lZF0iLCBcCiAgICAgKGludHB0cl90KShhZGRyKSwgKGhlYWRlciktPm5BbGxvY0xlbiwgKGhlYWRlciktPnBCdWZmZXIsIFwKLSAgICAoaGVhZGVyKS0+bk9mZnNldCwgKGhlYWRlciktPm5GaWxsZWRMZW4sIChoZWFkZXIpLT5uRmxhZ3MsIChoZWFkZXIpLT5uVGltZVN0YW1wCisgICAgKGhlYWRlciktPm5PZmZzZXQsIChoZWFkZXIpLT5uRmlsbGVkTGVuLCAoaGVhZGVyKS0+bkZsYWdzLCAoaGVhZGVyKS0+blRpbWVTdGFtcCwgKGZlbmNlRmQpCiAKICNkZWZpbmUgV0lUSF9TVEFUU19XUkFQUEVSKGZtdCwgLi4uKSBmbXQgIiB7IElOPSV6dS8lenUgT1VUPSV6dS8lenUgfSIsICMjX19WQV9BUkdTX18sIFwKICAgICBtSW5wdXRCdWZmZXJzV2l0aENvZGVjLnNpemUoKSwgbU51bVBvcnRCdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF0sIFwKQEAgLTEyMCw5ICsxMjEsMTAgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIG1lbWNweSgoT01YX1U4ICopbU1lbS0+cG9pbnRlcigpICsgaGVhZGVyLT5uT2Zmc2V0LAotICAgICAgICAgICAgICAgIGhlYWRlci0+cEJ1ZmZlciArIGhlYWRlci0+bk9mZnNldCwKLSAgICAgICAgICAgICAgICBoZWFkZXItPm5GaWxsZWRMZW4pOworICAgICAgICAvLyBjaGVjayBjb21wb25lbnQgcmV0dXJucyBwcm9wZXIgcmFuZ2UKKyAgICAgICAgc3A8QUJ1ZmZlcj4gY29kZWMgPSBnZXRCdWZmZXIoaGVhZGVyLCBmYWxzZSAvKiBiYWNrdXAgKi8sIHRydWUgLyogbGltaXQgKi8pOworCisgICAgICAgIG1lbWNweSgoT01YX1U4ICopbU1lbS0+cG9pbnRlcigpICsgaGVhZGVyLT5uT2Zmc2V0LCBjb2RlYy0+ZGF0YSgpLCBjb2RlYy0+c2l6ZSgpKTsKICAgICB9CiAKICAgICB2b2lkIENvcHlUb09NWChjb25zdCBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyKSB7CkBAIC0xMzUsNiArMTM3LDI1IEBACiAgICAgICAgICAgICAgICAgaGVhZGVyLT5uRmlsbGVkTGVuKTsKICAgICB9CiAKKyAgICAvLyByZXR1cm4gZWl0aGVyIHRoZSBjb2RlYyBvciB0aGUgYmFja3VwIGJ1ZmZlcgorICAgIHNwPEFCdWZmZXI+IGdldEJ1ZmZlcihjb25zdCBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyLCBib29sIGJhY2t1cCwgYm9vbCBsaW1pdCkgeworICAgICAgICBzcDxBQnVmZmVyPiBidWY7CisgICAgICAgIGlmIChiYWNrdXAgJiYgbU1lbSAhPSBOVUxMKSB7CisgICAgICAgICAgICBidWYgPSBuZXcgQUJ1ZmZlcihtTWVtLT5wb2ludGVyKCksIG1NZW0tPnNpemUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWYgPSBuZXcgQUJ1ZmZlcihoZWFkZXItPnBCdWZmZXIsIGhlYWRlci0+bkFsbG9jTGVuKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGltaXQpIHsKKyAgICAgICAgICAgIGlmIChoZWFkZXItPm5PZmZzZXQgKyBoZWFkZXItPm5GaWxsZWRMZW4gPiBoZWFkZXItPm5PZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgJiYgaGVhZGVyLT5uT2Zmc2V0ICsgaGVhZGVyLT5uRmlsbGVkTGVuIDw9IGhlYWRlci0+bkFsbG9jTGVuKSB7CisgICAgICAgICAgICAgICAgYnVmLT5zZXRSYW5nZShoZWFkZXItPm5PZmZzZXQsIGhlYWRlci0+bkZpbGxlZExlbik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1Zi0+c2V0UmFuZ2UoMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisKICAgICB2b2lkIHNldEdyYXBoaWNCdWZmZXIoY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIpIHsKICAgICAgICAgbUdyYXBoaWNCdWZmZXIgPSBncmFwaGljQnVmZmVyOwogICAgIH0KQEAgLTE4MCw2ICsyMDEsOCBAQAogICAgIG1OdW1Qb3J0QnVmZmVyc1sxXSA9IDA7CiAgICAgbURlYnVnTGV2ZWxCdW1wUGVuZGluZ0J1ZmZlcnNbMF0gPSAwOwogICAgIG1EZWJ1Z0xldmVsQnVtcFBlbmRpbmdCdWZmZXJzWzFdID0gMDsKKyAgICBtTWV0YWRhdGFUeXBlWzBdID0ga01ldGFkYXRhQnVmZmVyVHlwZUludmFsaWQ7CisgICAgbU1ldGFkYXRhVHlwZVsxXSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVJbnZhbGlkOwogICAgIG1Jc1NlY3VyZSA9IEFTdHJpbmcobmFtZSkuZW5kc1dpdGgoIi5zZWN1cmUiKTsKIH0KIApAQCAtMjE5LDEzICsyNDIsMTUgQEAKICAgICByZXR1cm4gbU5vZGVJRDsKIH0KIAotc3RhdGljIHN0YXR1c190IFN0YXR1c0Zyb21PTVhFcnJvcihPTVhfRVJST1JUWVBFIGVycikgeworc3RhdHVzX3QgU3RhdHVzRnJvbU9NWEVycm9yKE9NWF9FUlJPUlRZUEUgZXJyKSB7CiAgICAgc3dpdGNoIChlcnIpIHsKICAgICAgICAgY2FzZSBPTVhfRXJyb3JOb25lOgogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICBjYXNlIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzoKICAgICAgICAgY2FzZSBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OgogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICBjYXNlIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczoKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CkBAIC00ODUsNjMgKzUxMCw3NCBAQAogfQogCiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMoCi0gICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAotICAgICAgICBPTVhfQk9PTCBlbmFibGUpIHsKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSwgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKICAgICBDTE9HX0NPTkZJRyhzdG9yZU1ldGFEYXRhSW5CdWZmZXJzLCAiJXM6JXUgZW46JWQiLCBwb3J0U3RyaW5nKHBvcnRJbmRleCksIHBvcnRJbmRleCwgZW5hYmxlKTsKLSAgICByZXR1cm4gc3RvcmVNZXRhRGF0YUluQnVmZmVyc19sKAotICAgICAgICAgICAgcG9ydEluZGV4LCBlbmFibGUsCi0gICAgICAgICAgICBPTVhfRkFMU0UgLyogdXNlR3JhcGhpY0J1ZmZlciAqLywgTlVMTCAvKiB1c2luZ0dyYXBoaWNCdWZmZXJJbk1ldGFkYXRhICovKTsKKyAgICByZXR1cm4gc3RvcmVNZXRhRGF0YUluQnVmZmVyc19sKHBvcnRJbmRleCwgZW5hYmxlLCB0eXBlKTsKIH0KIAogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpzdG9yZU1ldGFEYXRhSW5CdWZmZXJzX2woCi0gICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAotICAgICAgICBPTVhfQk9PTCBlbmFibGUsCi0gICAgICAgIE9NWF9CT09MIHVzZUdyYXBoaWNCdWZmZXIsCi0gICAgICAgIE9NWF9CT09MICp1c2luZ0dyYXBoaWNCdWZmZXJJbk1ldGFkYXRhKSB7CisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCBlbmFibGUsIE1ldGFkYXRhQnVmZmVyVHlwZSAqdHlwZSkgeworICAgIGlmIChwb3J0SW5kZXggIT0ga1BvcnRJbmRleElucHV0ICYmIHBvcnRJbmRleCAhPSBrUG9ydEluZGV4T3V0cHV0KSB7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjYzMjQzNTgiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKICAgICBPTVhfSU5ERVhUWVBFIGluZGV4OwogICAgIE9NWF9TVFJJTkcgbmFtZSA9IGNvbnN0X2Nhc3Q8T01YX1NUUklORz4oCiAgICAgICAgICAgICAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMiKTsKIAotICAgIE9NWF9TVFJJTkcgZ3JhcGhpY0J1ZmZlck5hbWUgPSBjb25zdF9jYXN0PE9NWF9TVFJJTkc+KAotICAgICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5zdG9yZUdyYXBoaWNCdWZmZXJJbk1ldGFEYXRhIik7Ci0gICAgaWYgKHVzaW5nR3JhcGhpY0J1ZmZlckluTWV0YWRhdGEgPT0gTlVMTCkgewotICAgICAgICB1c2luZ0dyYXBoaWNCdWZmZXJJbk1ldGFkYXRhID0gJnVzZUdyYXBoaWNCdWZmZXI7Ci0gICAgfQorICAgIE9NWF9TVFJJTkcgbmF0aXZlQnVmZmVyTmFtZSA9IGNvbnN0X2Nhc3Q8T01YX1NUUklORz4oCisgICAgICAgICAgICAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnN0b3JlQU5XQnVmZmVySW5NZXRhZGF0YSIpOworICAgIE1ldGFkYXRhQnVmZmVyVHlwZSBuZWdvdGlhdGVkVHlwZTsKIAotICAgIE9NWF9FUlJPUlRZUEUgZXJyID0KLSAgICAgICAgKHVzZUdyYXBoaWNCdWZmZXIgJiYgcG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCkKLSAgICAgICAgICAgICAgICA/IE9NWF9HZXRFeHRlbnNpb25JbmRleChtSGFuZGxlLCBncmFwaGljQnVmZmVyTmFtZSwgJmluZGV4KQotICAgICAgICAgICAgICAgIDogT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIGlmIChlcnIgPT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICAqdXNpbmdHcmFwaGljQnVmZmVySW5NZXRhZGF0YSA9IE9NWF9UUlVFOwotICAgICAgICBuYW1lID0gZ3JhcGhpY0J1ZmZlck5hbWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gT01YX0dldEV4dGVuc2lvbkluZGV4KG1IYW5kbGUsIG5hbWUsICZpbmRleCk7Ci0gICAgfQorICAgIFN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNQYXJhbXMgcGFyYW1zOworICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7CisgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CisgICAgcGFyYW1zLmJTdG9yZU1ldGFEYXRhID0gZW5hYmxlOwogCisgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfR2V0RXh0ZW5zaW9uSW5kZXgobUhhbmRsZSwgbmF0aXZlQnVmZmVyTmFtZSwgJmluZGV4KTsKICAgICBPTVhfRVJST1JUWVBFIHhlcnIgPSBlcnI7CiAgICAgaWYgKGVyciA9PSBPTVhfRXJyb3JOb25lKSB7Ci0gICAgICAgIFN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNQYXJhbXMgcGFyYW1zOwotICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOwotICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKLSAgICAgICAgcGFyYW1zLmJTdG9yZU1ldGFEYXRhID0gZW5hYmxlOwotCiAgICAgICAgIGVyciA9IE9NWF9TZXRQYXJhbWV0ZXIobUhhbmRsZSwgaW5kZXgsICZwYXJhbXMpOworICAgICAgICBpZiAoZXJyID09IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIG5hbWUgPSBuYXRpdmVCdWZmZXJOYW1lOyAvLyBzZXQgbmFtZSBmb3IgZGVidWdnaW5nCisgICAgICAgICAgICBuZWdvdGlhdGVkVHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXI7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGVyciA9IE9NWF9HZXRFeHRlbnNpb25JbmRleChtSGFuZGxlLCBuYW1lLCAmaW5kZXgpOworICAgICAgICB4ZXJyID0gZXJyOworICAgICAgICBpZiAoZXJyID09IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIG5lZ290aWF0ZWRUeXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2U7CisgICAgICAgICAgICBlcnIgPSBPTVhfU2V0UGFyYW1ldGVyKG1IYW5kbGUsIGluZGV4LCAmcGFyYW1zKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIGRvbid0IGxvZyBsb3VkIGVycm9yIGlmIGNvbXBvbmVudCBkb2VzIG5vdCBzdXBwb3J0IG1ldGFkYXRhIG1vZGUgb24gdGhlIG91dHB1dAogICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICAqdXNpbmdHcmFwaGljQnVmZmVySW5NZXRhZGF0YSA9IE9NWF9GQUxTRTsKICAgICAgICAgaWYgKGVyciA9PSBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4ICYmIHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0KSB7CiAgICAgICAgICAgICBDTE9HVygiY29tcG9uZW50IGRvZXMgbm90IHN1cHBvcnQgbWV0YWRhdGEgbW9kZTsgdXNpbmcgZmFsbGJhY2siKTsKICAgICAgICAgfSBlbHNlIGlmICh4ZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKICAgICAgICAgICAgIENMT0dfRVJST1IoZ2V0RXh0ZW5zaW9uSW5kZXgsIHhlcnIsICIlcyIsIG5hbWUpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ0xPR19FUlJPUihzZXRQYXJhbWV0ZXIsIGVyciwgIiVzKCUjeCk6ICVzOiV1IGVuPSVkIEdCPSVkIiwgbmFtZSwgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgIHBvcnRTdHJpbmcocG9ydEluZGV4KSwgcG9ydEluZGV4LCBlbmFibGUsIHVzZUdyYXBoaWNCdWZmZXIpOworICAgICAgICAgICAgQ0xPR19FUlJPUihzZXRQYXJhbWV0ZXIsIGVyciwgIiVzKCUjeCk6ICVzOiV1IGVuPSVkIHR5cGU9JWQiLCBuYW1lLCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgcG9ydFN0cmluZyhwb3J0SW5kZXgpLCBwb3J0SW5kZXgsIGVuYWJsZSwgbmVnb3RpYXRlZFR5cGUpOwogICAgICAgICB9CisgICAgICAgIG5lZ290aWF0ZWRUeXBlID0gbU1ldGFkYXRhVHlwZVtwb3J0SW5kZXhdOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghZW5hYmxlKSB7CisgICAgICAgICAgICBuZWdvdGlhdGVkVHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVJbnZhbGlkOworICAgICAgICB9CisgICAgICAgIG1NZXRhZGF0YVR5cGVbcG9ydEluZGV4XSA9IG5lZ290aWF0ZWRUeXBlOwogICAgIH0KKyAgICBDTE9HX0NPTkZJRyhzdG9yZU1ldGFEYXRhSW5CdWZmZXJzLCAiJXM6JXUgbmVnb3RpYXRlZCAlczolZCIsCisgICAgICAgICAgICBwb3J0U3RyaW5nKHBvcnRJbmRleCksIHBvcnRJbmRleCwgYXNTdHJpbmcobmVnb3RpYXRlZFR5cGUpLCBuZWdvdGlhdGVkVHlwZSk7CisKKyAgICBpZiAodHlwZSAhPSBOVUxMKSB7CisgICAgICAgICp0eXBlID0gbmVnb3RpYXRlZFR5cGU7CisgICAgfQorCiAgICAgcmV0dXJuIFN0YXR1c0Zyb21PTVhFcnJvcihlcnIpOwogfQogCkBAIC02MTksOCArNjU1LDExIEBACiAKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6dXNlQnVmZmVyKAogICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKLSAgICAgICAgT01YOjpidWZmZXJfaWQgKmJ1ZmZlcikgeworICAgICAgICBPTVg6OmJ1ZmZlcl9pZCAqYnVmZmVyLCBPTVhfVTMyIGFsbG90dGVkU2l6ZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKGFsbG90dGVkU2l6ZSA+IHBhcmFtcy0+c2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogCiAgICAgQnVmZmVyTWV0YSAqYnVmZmVyX21ldGEgPSBuZXcgQnVmZmVyTWV0YShwYXJhbXMpOwogCkBAIC02MjgsMTAgKzY2NywxMSBAQAogCiAgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfVXNlQnVmZmVyKAogICAgICAgICAgICAgbUhhbmRsZSwgJmhlYWRlciwgcG9ydEluZGV4LCBidWZmZXJfbWV0YSwKLSAgICAgICAgICAgIHBhcmFtcy0+c2l6ZSgpLCBzdGF0aWNfY2FzdDxPTVhfVTggKj4ocGFyYW1zLT5wb2ludGVyKCkpKTsKKyAgICAgICAgICAgIGFsbG90dGVkU2l6ZSwgc3RhdGljX2Nhc3Q8T01YX1U4ICo+KHBhcmFtcy0+cG9pbnRlcigpKSk7CiAKICAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKLSAgICAgICAgQ0xPR19FUlJPUih1c2VCdWZmZXIsIGVyciwgU0lNUExFX0JVRkZFUihwb3J0SW5kZXgsIHBhcmFtcy0+c2l6ZSgpLCBwYXJhbXMtPnBvaW50ZXIoKSkpOworICAgICAgICBDTE9HX0VSUk9SKHVzZUJ1ZmZlciwgZXJyLCBTSU1QTEVfQlVGRkVSKAorICAgICAgICAgICAgICAgIHBvcnRJbmRleCwgKHNpemVfdClhbGxvdHRlZFNpemUsIHBhcmFtcy0+cG9pbnRlcigpKSk7CiAKICAgICAgICAgZGVsZXRlIGJ1ZmZlcl9tZXRhOwogICAgICAgICBidWZmZXJfbWV0YSA9IE5VTEw7CkBAIC02NTMsNyArNjkzLDcgQEAKICAgICB9CiAKICAgICBDTE9HX0JVRkZFUih1c2VCdWZmZXIsIE5FV19CVUZGRVJfRk1UKAotICAgICAgICAgICAgKmJ1ZmZlciwgcG9ydEluZGV4LCAiJXp1QCVwIiwgcGFyYW1zLT5zaXplKCksIHBhcmFtcy0+cG9pbnRlcigpKSk7CisgICAgICAgICAgICAqYnVmZmVyLCBwb3J0SW5kZXgsICIldSglenUpQCVwIiwgYWxsb3R0ZWRTaXplLCBwYXJhbXMtPnNpemUoKSwgcGFyYW1zLT5wb2ludGVyKCkpKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTc2OSwzOCArODA5LDYwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OnVwZGF0ZUdyYXBoaWNCdWZmZXJJbk1ldGFfbCgKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBncmFwaGljQnVmZmVyLAorICAgICAgICBPTVg6OmJ1ZmZlcl9pZCBidWZmZXIsIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIpIHsKKyAgICBpZiAocG9ydEluZGV4ICE9IGtQb3J0SW5kZXhJbnB1dCAmJiBwb3J0SW5kZXggIT0ga1BvcnRJbmRleE91dHB1dCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEJ1ZmZlck1ldGEgKmJ1ZmZlck1ldGEgPSAoQnVmZmVyTWV0YSAqKShoZWFkZXItPnBBcHBQcml2YXRlKTsKKyAgICBidWZmZXJNZXRhLT5zZXRHcmFwaGljQnVmZmVyKGdyYXBoaWNCdWZmZXIpOworICAgIGlmIChtTWV0YWRhdGFUeXBlW3BvcnRJbmRleF0gPT0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UKKyAgICAgICAgICAgICYmIGhlYWRlci0+bkFsbG9jTGVuID49IHNpemVvZihWaWRlb0dyYWxsb2NNZXRhZGF0YSkpIHsKKyAgICAgICAgVmlkZW9HcmFsbG9jTWV0YWRhdGEgJm1ldGFkYXRhID0gKihWaWRlb0dyYWxsb2NNZXRhZGF0YSAqKShoZWFkZXItPnBCdWZmZXIpOworICAgICAgICBtZXRhZGF0YS5lVHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlOworICAgICAgICBtZXRhZGF0YS5wSGFuZGxlID0gZ3JhcGhpY0J1ZmZlciA9PSBOVUxMID8gTlVMTCA6IGdyYXBoaWNCdWZmZXItPmhhbmRsZTsKKyAgICB9IGVsc2UgaWYgKG1NZXRhZGF0YVR5cGVbcG9ydEluZGV4XSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyCisgICAgICAgICAgICAmJiBoZWFkZXItPm5BbGxvY0xlbiA+PSBzaXplb2YoVmlkZW9OYXRpdmVNZXRhZGF0YSkpIHsKKyAgICAgICAgVmlkZW9OYXRpdmVNZXRhZGF0YSAmbWV0YWRhdGEgPSAqKFZpZGVvTmF0aXZlTWV0YWRhdGEgKikoaGVhZGVyLT5wQnVmZmVyKTsKKyAgICAgICAgbWV0YWRhdGEuZVR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyOworICAgICAgICBtZXRhZGF0YS5wQnVmZmVyID0gZ3JhcGhpY0J1ZmZlciA9PSBOVUxMID8gTlVMTCA6IGdyYXBoaWNCdWZmZXItPmdldE5hdGl2ZUJ1ZmZlcigpOworICAgICAgICBtZXRhZGF0YS5uRmVuY2VGZCA9IC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIENMT0dfQlVGRkVSKHVwZGF0ZUdyYXBoaWNCdWZmZXJJbk1ldGEsICIlczoldSwgJSN4IGJhZCB0eXBlICglZCkgb3Igc2l6ZSAoJXUpIiwKKyAgICAgICAgICAgIHBvcnRTdHJpbmcocG9ydEluZGV4KSwgcG9ydEluZGV4LCBidWZmZXIsIG1NZXRhZGF0YVR5cGVbcG9ydEluZGV4XSwgaGVhZGVyLT5uQWxsb2NMZW4pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIENMT0dfQlVGRkVSKHVwZGF0ZUdyYXBoaWNCdWZmZXJJbk1ldGEsICIlczoldSwgJSN4IDo9ICVwIiwKKyAgICAgICAgICAgIHBvcnRTdHJpbmcocG9ydEluZGV4KSwgcG9ydEluZGV4LCBidWZmZXIsCisgICAgICAgICAgICBncmFwaGljQnVmZmVyID09IE5VTEwgPyBOVUxMIDogZ3JhcGhpY0J1ZmZlci0+aGFuZGxlKTsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6dXBkYXRlR3JhcGhpY0J1ZmZlckluTWV0YSgKICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBncmFwaGljQnVmZmVyLAogICAgICAgICBPTVg6OmJ1ZmZlcl9pZCBidWZmZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCiAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IGZpbmRCdWZmZXJIZWFkZXIoYnVmZmVyKTsKLSAgICBWaWRlb0RlY29kZXJPdXRwdXRNZXRhRGF0YSAqbWV0YWRhdGEgPQotICAgICAgICAoVmlkZW9EZWNvZGVyT3V0cHV0TWV0YURhdGEgKikoaGVhZGVyLT5wQnVmZmVyKTsKLSAgICBCdWZmZXJNZXRhICpidWZmZXJNZXRhID0gKEJ1ZmZlck1ldGEgKikoaGVhZGVyLT5wQXBwUHJpdmF0ZSk7Ci0gICAgYnVmZmVyTWV0YS0+c2V0R3JhcGhpY0J1ZmZlcihncmFwaGljQnVmZmVyKTsKLSAgICBtZXRhZGF0YS0+ZVR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZTsKLSAgICBtZXRhZGF0YS0+cEhhbmRsZSA9IGdyYXBoaWNCdWZmZXItPmhhbmRsZTsKLSAgICBDTE9HX0JVRkZFUih1cGRhdGVHcmFwaGljQnVmZmVySW5NZXRhLCAiJXM6JXUsICUjeCA6PSAlcCIsCi0gICAgICAgICAgICBwb3J0U3RyaW5nKHBvcnRJbmRleCksIHBvcnRJbmRleCwgYnVmZmVyLCBncmFwaGljQnVmZmVyLT5oYW5kbGUpOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gdXBkYXRlR3JhcGhpY0J1ZmZlckluTWV0YV9sKHBvcnRJbmRleCwgZ3JhcGhpY0J1ZmZlciwgYnVmZmVyLCBoZWFkZXIpOwogfQogCi1zdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OmNyZWF0ZUlucHV0U3VyZmFjZSgKLSAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpidWZmZXJQcm9kdWNlcikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CitzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OmNyZWF0ZUdyYXBoaWNCdWZmZXJTb3VyY2UoCisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBidWZmZXJDb25zdW1lciwgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKSB7CiAgICAgc3RhdHVzX3QgZXJyOwogCiAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4mIHN1cmZhY2VDaGVjayA9IGdldEdyYXBoaWNCdWZmZXJTb3VyY2UoKTsKICAgICBpZiAoc3VyZmFjZUNoZWNrICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHBvcnRJbmRleCA8IE5FTEVNKG1NZXRhZGF0YVR5cGUpICYmIHR5cGUgIT0gTlVMTCkgeworICAgICAgICAgICAgKnR5cGUgPSBtTWV0YWRhdGFUeXBlW3BvcnRJbmRleF07CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOwogICAgIH0KIAotICAgIC8vIElucHV0IGJ1ZmZlcnMgd2lsbCBob2xkIG1ldGEtZGF0YSAoZ3JhbGxvYyByZWZlcmVuY2VzKS4KLSAgICBPTVhfQk9PTCB1c2luZ0dyYXBoaWNCdWZmZXIgPSBPTVhfRkFMU0U7Ci0gICAgZXJyID0gc3RvcmVNZXRhRGF0YUluQnVmZmVyc19sKAotICAgICAgICAgICAgcG9ydEluZGV4LCBPTVhfVFJVRSwKLSAgICAgICAgICAgIE9NWF9UUlVFIC8qIHVzZUdyYXBoaWNCdWZmZXIgKi8sICZ1c2luZ0dyYXBoaWNCdWZmZXIpOworICAgIC8vIElucHV0IGJ1ZmZlcnMgd2lsbCBob2xkIG1ldGEtZGF0YSAoQU5hdGl2ZVdpbmRvd0J1ZmZlciByZWZlcmVuY2VzKS4KKyAgICBlcnIgPSBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzX2wocG9ydEluZGV4LCBPTVhfVFJVRSwgdHlwZSk7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KQEAgLTgyNiwxOSArODg4LDc1IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBHcmFwaGljQnVmZmVyU291cmNlKiBidWZmZXJTb3VyY2UgPSBuZXcgR3JhcGhpY0J1ZmZlclNvdXJjZSgKLSAgICAgICAgICAgIHRoaXMsIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0LAotICAgICAgICAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCwgdXNpbmdHcmFwaGljQnVmZmVyKTsKKyAgICB1aW50MzJfdCB1c2FnZUJpdHM7CisgICAgb2VyciA9IE9NWF9HZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBtSGFuZGxlLCAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUNvbnN1bWVyVXNhZ2VCaXRzLCAmdXNhZ2VCaXRzKTsKKyAgICBpZiAob2VyciAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIHVzYWdlQml0cyA9IDA7CisgICAgfQorCisgICAgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gYnVmZmVyU291cmNlID0gbmV3IEdyYXBoaWNCdWZmZXJTb3VyY2UodGhpcywKKyAgICAgICAgICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsCisgICAgICAgICAgICBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCwKKyAgICAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwsCisgICAgICAgICAgICB1c2FnZUJpdHMsCisgICAgICAgICAgICBidWZmZXJDb25zdW1lcik7CisKICAgICBpZiAoKGVyciA9IGJ1ZmZlclNvdXJjZS0+aW5pdENoZWNrKCkpICE9IE9LKSB7Ci0gICAgICAgIGRlbGV0ZSBidWZmZXJTb3VyY2U7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogICAgIHNldEdyYXBoaWNCdWZmZXJTb3VyY2UoYnVmZmVyU291cmNlKTsKIAotICAgICpidWZmZXJQcm9kdWNlciA9IGJ1ZmZlclNvdXJjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOwogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpjcmVhdGVJbnB1dFN1cmZhY2UoCisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqYnVmZmVyUHJvZHVjZXIsIE1ldGFkYXRhQnVmZmVyVHlwZSAqdHlwZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CisgICAgc3RhdHVzX3QgZXJyID0gY3JlYXRlR3JhcGhpY0J1ZmZlclNvdXJjZShwb3J0SW5kZXgsIE5VTEwgLyogYnVmZmVyQ29uc3VtZXIgKi8sIHR5cGUpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgICpidWZmZXJQcm9kdWNlciA9IG1HcmFwaGljQnVmZmVyU291cmNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CisgICAgcmV0dXJuIE9LOworfQorCisvL3N0YXRpYworc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpjcmVhdGVQZXJzaXN0ZW50SW5wdXRTdXJmYWNlKAorICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqYnVmZmVyUHJvZHVjZXIsCisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+ICpidWZmZXJDb25zdW1lcikgeworICAgIFN0cmluZzggbmFtZSgiR3JhcGhpY0J1ZmZlclNvdXJjZSIpOworCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICBjb25zdW1lci0+c2V0Q29uc3VtZXJOYW1lKG5hbWUpOworICAgIGNvbnN1bWVyLT5zZXRDb25zdW1lclVzYWdlQml0cyhHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIpOworCisgICAgc3A8QnVmZmVyUXVldWU6OlByb3h5Q29uc3VtZXJMaXN0ZW5lcj4gcHJveHkgPQorICAgICAgICBuZXcgQnVmZmVyUXVldWU6OlByb3h5Q29uc3VtZXJMaXN0ZW5lcihOVUxMKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBjb25zdW1lci0+Y29uc3VtZXJDb25uZWN0KHByb3h5LCBmYWxzZSk7CisgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiRXJyb3IgY29ubmVjdGluZyB0byBCdWZmZXJRdWV1ZTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgKmJ1ZmZlclByb2R1Y2VyID0gcHJvZHVjZXI7CisgICAgKmJ1ZmZlckNvbnN1bWVyID0gY29uc3VtZXI7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6c2V0SW5wdXRTdXJmYWNlKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gJmJ1ZmZlckNvbnN1bWVyLAorICAgICAgICBNZXRhZGF0YUJ1ZmZlclR5cGUgKnR5cGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOworICAgIHJldHVybiBjcmVhdGVHcmFwaGljQnVmZmVyU291cmNlKHBvcnRJbmRleCwgYnVmZmVyQ29uc3VtZXIsIHR5cGUpOworfQorCiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSB7CiAgICAgLy8gRm9yIG5vbi1TdXJmYWNlIGlucHV0LCB0aGUgTWVkaWFDb2RlYyBzaG91bGQgY29udmVydCB0aGUgY2FsbCB0byBhCiAgICAgLy8gcGFpciBvZiByZXF1ZXN0cyAoZGVxdWV1ZSBpbnB1dCBidWZmZXIsIHF1ZXVlIGlucHV0IGJ1ZmZlciB3aXRoIEVPUwpAQCAtODkxLDE5ICsxMDA5LDIxIEBACiAKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6YWxsb2NhdGVCdWZmZXJXaXRoQmFja3VwKAogICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKLSAgICAgICAgT01YOjpidWZmZXJfaWQgKmJ1ZmZlcikgeworICAgICAgICBPTVg6OmJ1ZmZlcl9pZCAqYnVmZmVyLCBPTVhfVTMyIGFsbG90dGVkU2l6ZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKGFsbG90dGVkU2l6ZSA+IHBhcmFtcy0+c2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogCiAgICAgQnVmZmVyTWV0YSAqYnVmZmVyX21ldGEgPSBuZXcgQnVmZmVyTWV0YShwYXJhbXMsIHRydWUpOwogCiAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlcjsKIAogICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gT01YX0FsbG9jYXRlQnVmZmVyKAotICAgICAgICAgICAgbUhhbmRsZSwgJmhlYWRlciwgcG9ydEluZGV4LCBidWZmZXJfbWV0YSwgcGFyYW1zLT5zaXplKCkpOwotCisgICAgICAgICAgICBtSGFuZGxlLCAmaGVhZGVyLCBwb3J0SW5kZXgsIGJ1ZmZlcl9tZXRhLCBhbGxvdHRlZFNpemUpOwogICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgewogICAgICAgICBDTE9HX0VSUk9SKGFsbG9jYXRlQnVmZmVyV2l0aEJhY2t1cCwgZXJyLAotICAgICAgICAgICAgICAgIFNJTVBMRV9CVUZGRVIocG9ydEluZGV4LCBwYXJhbXMtPnNpemUoKSwgcGFyYW1zLT5wb2ludGVyKCkpKTsKKyAgICAgICAgICAgICAgICBTSU1QTEVfQlVGRkVSKHBvcnRJbmRleCwgKHNpemVfdClhbGxvdHRlZFNpemUsIHBhcmFtcy0+cG9pbnRlcigpKSk7CiAgICAgICAgIGRlbGV0ZSBidWZmZXJfbWV0YTsKICAgICAgICAgYnVmZmVyX21ldGEgPSBOVUxMOwogCkBAIC05MjMsOCArMTA0Myw4IEBACiAgICAgICAgIGJ1ZmZlclNvdXJjZS0+YWRkQ29kZWNCdWZmZXIoaGVhZGVyKTsKICAgICB9CiAKLSAgICBDTE9HX0JVRkZFUihhbGxvY2F0ZUJ1ZmZlcldpdGhCYWNrdXAsIE5FV19CVUZGRVJfRk1UKCpidWZmZXIsIHBvcnRJbmRleCwgIiV6dUAlcCA6PiAlcCIsCi0gICAgICAgICAgICBwYXJhbXMtPnNpemUoKSwgcGFyYW1zLT5wb2ludGVyKCksIGhlYWRlci0+cEJ1ZmZlcikpOworICAgIENMT0dfQlVGRkVSKGFsbG9jYXRlQnVmZmVyV2l0aEJhY2t1cCwgTkVXX0JVRkZFUl9GTVQoKmJ1ZmZlciwgcG9ydEluZGV4LCAiJXp1QCVwIDo+ICV1QCVwIiwKKyAgICAgICAgICAgIHBhcmFtcy0+c2l6ZSgpLCBwYXJhbXMtPnBvaW50ZXIoKSwgYWxsb3R0ZWRTaXplLCBoZWFkZXItPnBCdWZmZXIpKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTk0OSw3ICsxMDY5LDcgQEAKICAgICByZXR1cm4gU3RhdHVzRnJvbU9NWEVycm9yKGVycik7CiB9CiAKLXN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6ZmlsbEJ1ZmZlcihPTVg6OmJ1ZmZlcl9pZCBidWZmZXIpIHsKK3N0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6ZmlsbEJ1ZmZlcihPTVg6OmJ1ZmZlcl9pZCBidWZmZXIsIGludCBmZW5jZUZkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSBmaW5kQnVmZmVySGVhZGVyKGJ1ZmZlcik7CkBAIC05NTcsMTUgKzEwNzcsMjIgQEAKICAgICBoZWFkZXItPm5PZmZzZXQgPSAwOwogICAgIGhlYWRlci0+bkZsYWdzID0gMDsKIAorICAgIC8vIG1ldGEgbm93IG93bnMgZmVuY2VGZAorICAgIHN0YXR1c190IHJlcyA9IHN0b3JlRmVuY2VJbk1ldGFfbChoZWFkZXIsIGZlbmNlRmQsIGtQb3J0SW5kZXhPdXRwdXQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQ0xPR19FUlJPUihmaWxsQnVmZmVyOjpzdG9yZUZlbmNlSW5NZXRhLCByZXMsIEVNUFRZX0JVRkZFUihidWZmZXIsIGhlYWRlciwgZmVuY2VGZCkpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWJ1Z0xvY2spOwogICAgICAgICBtT3V0cHV0QnVmZmVyc1dpdGhDb2RlYy5hZGQoaGVhZGVyKTsKLSAgICAgICAgQ0xPR19CVU1QRURfQlVGRkVSKGZpbGxCdWZmZXIsIFdJVEhfU1RBVFMoRU1QVFlfQlVGRkVSKGJ1ZmZlciwgaGVhZGVyKSkpOworICAgICAgICBDTE9HX0JVTVBFRF9CVUZGRVIoZmlsbEJ1ZmZlciwgV0lUSF9TVEFUUyhFTVBUWV9CVUZGRVIoYnVmZmVyLCBoZWFkZXIsIGZlbmNlRmQpKSk7CiAgICAgfQogCiAgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfRmlsbFRoaXNCdWZmZXIobUhhbmRsZSwgaGVhZGVyKTsKICAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKLSAgICAgICAgQ0xPR19FUlJPUihmaWxsQnVmZmVyLCBlcnIsIEVNUFRZX0JVRkZFUihidWZmZXIsIGhlYWRlcikpOworICAgICAgICBDTE9HX0VSUk9SKGZpbGxCdWZmZXIsIGVyciwgRU1QVFlfQlVGRkVSKGJ1ZmZlciwgaGVhZGVyLCBmZW5jZUZkKSk7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVidWdMb2NrKTsKICAgICAgICAgbU91dHB1dEJ1ZmZlcnNXaXRoQ29kZWMucmVtb3ZlKGhlYWRlcik7CiAgICAgfQpAQCAtOTc1LDI0ICsxMTAyLDQ4IEBACiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OmVtcHR5QnVmZmVyKAogICAgICAgICBPTVg6OmJ1ZmZlcl9pZCBidWZmZXIsCiAgICAgICAgIE9NWF9VMzIgcmFuZ2VPZmZzZXQsIE9NWF9VMzIgcmFuZ2VMZW5ndGgsCi0gICAgICAgIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXApIHsKKyAgICAgICAgT01YX1UzMiBmbGFncywgT01YX1RJQ0tTIHRpbWVzdGFtcCwgaW50IGZlbmNlRmQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IGZpbmRCdWZmZXJIZWFkZXIoYnVmZmVyKTsKLSAgICAvLyByYW5nZUxlbmd0aCBhbmQgcmFuZ2VPZmZzZXQgbXVzdCBiZSBhIHN1YnNldCBvZiB0aGUgYWxsb2NhdGVkIGRhdGEgaW4gdGhlIGJ1ZmZlci4KLSAgICAvLyBjb3JuZXIgY2FzZTogd2UgcGVybWl0IHJhbmdlT2Zmc2V0ID09IGVuZC1vZi1idWZmZXIgd2l0aCByYW5nZUxlbmd0aCA9PSAwLgotICAgIGlmIChyYW5nZU9mZnNldCA+IGhlYWRlci0+bkFsbG9jTGVuCi0gICAgICAgICAgICB8fCByYW5nZUxlbmd0aCA+IGhlYWRlci0+bkFsbG9jTGVuIC0gcmFuZ2VPZmZzZXQpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgaGVhZGVyLT5uRmlsbGVkTGVuID0gcmFuZ2VMZW5ndGg7Ci0gICAgaGVhZGVyLT5uT2Zmc2V0ID0gcmFuZ2VPZmZzZXQ7Ci0KICAgICBCdWZmZXJNZXRhICpidWZmZXJfbWV0YSA9CiAgICAgICAgIHN0YXRpY19jYXN0PEJ1ZmZlck1ldGEgKj4oaGVhZGVyLT5wQXBwUHJpdmF0ZSk7Ci0gICAgYnVmZmVyX21ldGEtPkNvcHlUb09NWChoZWFkZXIpOworICAgIHNwPEFCdWZmZXI+IGJhY2t1cCA9IGJ1ZmZlcl9tZXRhLT5nZXRCdWZmZXIoaGVhZGVyLCB0cnVlIC8qIGJhY2t1cCAqLywgZmFsc2UgLyogbGltaXQgKi8pOworICAgIHNwPEFCdWZmZXI+IGNvZGVjID0gYnVmZmVyX21ldGEtPmdldEJ1ZmZlcihoZWFkZXIsIGZhbHNlIC8qIGJhY2t1cCAqLywgZmFsc2UgLyogbGltaXQgKi8pOwogCi0gICAgcmV0dXJuIGVtcHR5QnVmZmVyX2woaGVhZGVyLCBmbGFncywgdGltZXN0YW1wLCAoaW50cHRyX3QpYnVmZmVyKTsKKyAgICAvLyBjb252ZXJ0IGluY29taW5nIEFOVyBtZXRhIGJ1ZmZlcnMgaWYgY29tcG9uZW50IGlzIGNvbmZpZ3VyZWQgZm9yIGdyYWxsb2MgbWV0YWRhdGEgbW9kZQorICAgIC8vIGlnbm9yZSByYW5nZU9mZnNldCBpbiB0aGlzIGNhc2UKKyAgICBpZiAobU1ldGFkYXRhVHlwZVtrUG9ydEluZGV4SW5wdXRdID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlCisgICAgICAgICAgICAmJiBiYWNrdXAtPmNhcGFjaXR5KCkgPj0gc2l6ZW9mKFZpZGVvTmF0aXZlTWV0YWRhdGEpCisgICAgICAgICAgICAmJiBjb2RlYy0+Y2FwYWNpdHkoKSA+PSBzaXplb2YoVmlkZW9HcmFsbG9jTWV0YWRhdGEpCisgICAgICAgICAgICAmJiAoKFZpZGVvTmF0aXZlTWV0YWRhdGEgKiliYWNrdXAtPmJhc2UoKSktPmVUeXBlCisgICAgICAgICAgICAgICAgICAgID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXIpIHsKKyAgICAgICAgVmlkZW9OYXRpdmVNZXRhZGF0YSAmYmFja3VwTWV0YSA9ICooVmlkZW9OYXRpdmVNZXRhZGF0YSAqKWJhY2t1cC0+YmFzZSgpOworICAgICAgICBWaWRlb0dyYWxsb2NNZXRhZGF0YSAmY29kZWNNZXRhID0gKihWaWRlb0dyYWxsb2NNZXRhZGF0YSAqKWNvZGVjLT5iYXNlKCk7CisgICAgICAgIENMT0dfQlVGRkVSKGVtcHR5QnVmZmVyLCAiY29udmVydGluZyBBTldCICVwIHRvIGhhbmRsZSAlcCIsCisgICAgICAgICAgICAgICAgYmFja3VwTWV0YS5wQnVmZmVyLCBiYWNrdXBNZXRhLnBCdWZmZXItPmhhbmRsZSk7CisgICAgICAgIGNvZGVjTWV0YS5wSGFuZGxlID0gYmFja3VwTWV0YS5wQnVmZmVyICE9IE5VTEwgPyBiYWNrdXBNZXRhLnBCdWZmZXItPmhhbmRsZSA6IE5VTEw7CisgICAgICAgIGNvZGVjTWV0YS5lVHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlOworICAgICAgICBoZWFkZXItPm5GaWxsZWRMZW4gPSByYW5nZUxlbmd0aCA/IHNpemVvZihjb2RlY01ldGEpIDogMDsKKyAgICAgICAgaGVhZGVyLT5uT2Zmc2V0ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyByYW5nZUxlbmd0aCBhbmQgcmFuZ2VPZmZzZXQgbXVzdCBiZSBhIHN1YnNldCBvZiB0aGUgYWxsb2NhdGVkIGRhdGEgaW4gdGhlIGJ1ZmZlci4KKyAgICAgICAgLy8gY29ybmVyIGNhc2U6IHdlIHBlcm1pdCByYW5nZU9mZnNldCA9PSBlbmQtb2YtYnVmZmVyIHdpdGggcmFuZ2VMZW5ndGggPT0gMC4KKyAgICAgICAgaWYgKHJhbmdlT2Zmc2V0ID4gaGVhZGVyLT5uQWxsb2NMZW4KKyAgICAgICAgICAgICAgICB8fCByYW5nZUxlbmd0aCA+IGhlYWRlci0+bkFsbG9jTGVuIC0gcmFuZ2VPZmZzZXQpIHsKKyAgICAgICAgICAgIENMT0dfRVJST1IoZW1wdHlCdWZmZXIsIE9NWF9FcnJvckJhZFBhcmFtZXRlciwgRlVMTF9CVUZGRVIoTlVMTCwgaGVhZGVyLCBmZW5jZUZkKSk7CisgICAgICAgICAgICBpZiAoZmVuY2VGZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgOjpjbG9zZShmZW5jZUZkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaGVhZGVyLT5uRmlsbGVkTGVuID0gcmFuZ2VMZW5ndGg7CisgICAgICAgIGhlYWRlci0+bk9mZnNldCA9IHJhbmdlT2Zmc2V0OworCisgICAgICAgIGJ1ZmZlcl9tZXRhLT5Db3B5VG9PTVgoaGVhZGVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gZW1wdHlCdWZmZXJfbChoZWFkZXIsIGZsYWdzLCB0aW1lc3RhbXAsIChpbnRwdHJfdClidWZmZXIsIGZlbmNlRmQpOwogfQogCiAvLyBsb2cgcXVldWVkIGJ1ZmZlciBhY3Rpdml0eSBmb3IgdGhlIG5leHQgZmV3IGlucHV0IGFuZC9vciBvdXRwdXQgZnJhbWVzCkBAIC0xMDE5LDExICsxMTcwLDYyIEBACiAgICAgfQogfQogCitzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OnN0b3JlRmVuY2VJbk1ldGFfbCgKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciwgaW50IGZlbmNlRmQsIE9NWF9VMzIgcG9ydEluZGV4KSB7CisgICAgLy8gcHJvcGFnYXRlIGZlbmNlIGlmIGNvbXBvbmVudCBzdXBwb3J0cyBpdDsgd2FpdCBmb3IgaXQgb3RoZXJ3aXNlCisgICAgT01YX1UzMiBtZXRhU2l6ZSA9IHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQgPyBoZWFkZXItPm5GaWxsZWRMZW4gOiBoZWFkZXItPm5BbGxvY0xlbjsKKyAgICBpZiAobU1ldGFkYXRhVHlwZVtwb3J0SW5kZXhdID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXIKKyAgICAgICAgICAgICYmIG1ldGFTaXplID49IHNpemVvZihWaWRlb05hdGl2ZU1ldGFkYXRhKSkgeworICAgICAgICBWaWRlb05hdGl2ZU1ldGFkYXRhICZuYXRpdmVNZXRhID0gKihWaWRlb05hdGl2ZU1ldGFkYXRhICopKGhlYWRlci0+cEJ1ZmZlcik7CisgICAgICAgIGlmIChuYXRpdmVNZXRhLm5GZW5jZUZkID49IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJmZW5jZSAoJWQpIGFscmVhZHkgZXhpc3RzIGluIG1ldGEiLCBuYXRpdmVNZXRhLm5GZW5jZUZkKTsKKyAgICAgICAgICAgIGlmIChmZW5jZUZkID49IDApIHsKKyAgICAgICAgICAgICAgICA6OmNsb3NlKGZlbmNlRmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgICAgICB9CisgICAgICAgIG5hdGl2ZU1ldGEubkZlbmNlRmQgPSBmZW5jZUZkOworICAgIH0gZWxzZSBpZiAoZmVuY2VGZCA+PSAwKSB7CisgICAgICAgIENMT0dfQlVGRkVSKHN0b3JlRmVuY2VJbk1ldGEsICJ3YWl0aW5nIGZvciBmZW5jZSAlZCIsIGZlbmNlRmQpOworICAgICAgICBzcDxGZW5jZT4gZmVuY2UgPSBuZXcgRmVuY2UoZmVuY2VGZCk7CisgICAgICAgIHJldHVybiBmZW5jZS0+d2FpdChJT01YOjprRmVuY2VUaW1lb3V0TXMpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK2ludCBPTVhOb2RlSW5zdGFuY2U6OnJldHJpZXZlRmVuY2VGcm9tTWV0YV9sKAorICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyLCBPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIE9NWF9VMzIgbWV0YVNpemUgPSBwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0ID8gaGVhZGVyLT5uQWxsb2NMZW4gOiBoZWFkZXItPm5GaWxsZWRMZW47CisgICAgaW50IGZlbmNlRmQgPSAtMTsKKyAgICBpZiAobU1ldGFkYXRhVHlwZVtwb3J0SW5kZXhdID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXIKKyAgICAgICAgICAgICYmIGhlYWRlci0+bkFsbG9jTGVuID49IHNpemVvZihWaWRlb05hdGl2ZU1ldGFkYXRhKSkgeworICAgICAgICBWaWRlb05hdGl2ZU1ldGFkYXRhICZuYXRpdmVNZXRhID0gKihWaWRlb05hdGl2ZU1ldGFkYXRhICopKGhlYWRlci0+cEJ1ZmZlcik7CisgICAgICAgIGlmIChuYXRpdmVNZXRhLmVUeXBlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXIpIHsKKyAgICAgICAgICAgIGZlbmNlRmQgPSBuYXRpdmVNZXRhLm5GZW5jZUZkOworICAgICAgICAgICAgbmF0aXZlTWV0YS5uRmVuY2VGZCA9IC0xOworICAgICAgICB9CisgICAgICAgIGlmIChtZXRhU2l6ZSA8IHNpemVvZihuYXRpdmVNZXRhKSAmJiBmZW5jZUZkID49IDApIHsKKyAgICAgICAgICAgIENMT0dfRVJST1IoZm91bmRGZW5jZUluRW1wdHlNZXRhLCBCQURfVkFMVUUsIEZVTExfQlVGRkVSKAorICAgICAgICAgICAgICAgICAgICBOVUxMLCBoZWFkZXIsIG5hdGl2ZU1ldGEubkZlbmNlRmQpKTsKKyAgICAgICAgICAgIGZlbmNlRmQgPSAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmVuY2VGZDsKK30KKwogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjplbXB0eUJ1ZmZlcl9sKAotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyLCBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wLCBpbnRwdHJfdCBkZWJ1Z0FkZHIpIHsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciwgT01YX1UzMiBmbGFncywgT01YX1RJQ0tTIHRpbWVzdGFtcCwKKyAgICAgICAgaW50cHRyX3QgZGVidWdBZGRyLCBpbnQgZmVuY2VGZCkgewogICAgIGhlYWRlci0+bkZsYWdzID0gZmxhZ3M7CiAgICAgaGVhZGVyLT5uVGltZVN0YW1wID0gdGltZXN0YW1wOwogCisgICAgc3RhdHVzX3QgcmVzID0gc3RvcmVGZW5jZUluTWV0YV9sKGhlYWRlciwgZmVuY2VGZCwga1BvcnRJbmRleElucHV0KTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIENMT0dfRVJST1IoZW1wdHlCdWZmZXI6OnN0b3JlRmVuY2VJbk1ldGEsIHJlcywgV0lUSF9TVEFUUygKKyAgICAgICAgICAgICAgICBGVUxMX0JVRkZFUihkZWJ1Z0FkZHIsIGhlYWRlciwgZmVuY2VGZCkpKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVidWdMb2NrKTsKICAgICAgICAgbUlucHV0QnVmZmVyc1dpdGhDb2RlYy5hZGQoaGVhZGVyKTsKQEAgLTEwMzMsMTEgKzEyMzUsMTEgQEAKICAgICAgICAgICAgIGJ1bXBEZWJ1Z0xldmVsX2woMiAvKiBudW1JbnB1dEJ1ZmZlcnMgKi8sIDAgLyogbnVtT3V0cHV0QnVmZmVycyAqLyk7CiAgICAgICAgIH0KIAotICAgICAgICBDTE9HX0JVTVBFRF9CVUZGRVIoZW1wdHlCdWZmZXIsIFdJVEhfU1RBVFMoRlVMTF9CVUZGRVIoZGVidWdBZGRyLCBoZWFkZXIpKSk7CisgICAgICAgIENMT0dfQlVNUEVEX0JVRkZFUihlbXB0eUJ1ZmZlciwgV0lUSF9TVEFUUyhGVUxMX0JVRkZFUihkZWJ1Z0FkZHIsIGhlYWRlciwgZmVuY2VGZCkpKTsKICAgICB9CiAKICAgICBPTVhfRVJST1JUWVBFIGVyciA9IE9NWF9FbXB0eVRoaXNCdWZmZXIobUhhbmRsZSwgaGVhZGVyKTsKLSAgICBDTE9HX0lGX0VSUk9SKGVtcHR5QnVmZmVyLCBlcnIsIEZVTExfQlVGRkVSKGRlYnVnQWRkciwgaGVhZGVyKSk7CisgICAgQ0xPR19JRl9FUlJPUihlbXB0eUJ1ZmZlciwgZXJyLCBGVUxMX0JVRkZFUihkZWJ1Z0FkZHIsIGhlYWRlciwgZmVuY2VGZCkpOwogCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlYnVnTG9jayk7CkBAIC0xMDUyLDE2ICsxMjU0LDIxIEBACiB9CiAKIC8vIGxpa2UgZW1wdHlCdWZmZXIsIGJ1dCB0aGUgZGF0YSBpcyBhbHJlYWR5IGluIGhlYWRlci0+cEJ1ZmZlcgotc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjplbXB0eURpcmVjdEJ1ZmZlcigKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciwKLSAgICAgICAgT01YX1UzMiByYW5nZU9mZnNldCwgT01YX1UzMiByYW5nZUxlbmd0aCwKLSAgICAgICAgT01YX1UzMiBmbGFncywgT01YX1RJQ0tTIHRpbWVzdGFtcCkgeworc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjplbXB0eUdyYXBoaWNCdWZmZXIoCisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIsIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+ICZncmFwaGljQnVmZmVyLAorICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wLCBpbnQgZmVuY2VGZCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgT01YOjpidWZmZXJfaWQgYnVmZmVyID0gZmluZEJ1ZmZlcklEKGhlYWRlcik7CisgICAgc3RhdHVzX3QgZXJyID0gdXBkYXRlR3JhcGhpY0J1ZmZlckluTWV0YV9sKGtQb3J0SW5kZXhJbnB1dCwgZ3JhcGhpY0J1ZmZlciwgYnVmZmVyLCBoZWFkZXIpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQ0xPR19FUlJPUihlbXB0eUdyYXBoaWNCdWZmZXIsIGVyciwgRlVMTF9CVUZGRVIoCisgICAgICAgICAgICAgICAgKGludHB0cl90KWhlYWRlci0+cEJ1ZmZlciwgaGVhZGVyLCBmZW5jZUZkKSk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQogCi0gICAgaGVhZGVyLT5uRmlsbGVkTGVuID0gcmFuZ2VMZW5ndGg7Ci0gICAgaGVhZGVyLT5uT2Zmc2V0ID0gcmFuZ2VPZmZzZXQ7Ci0KLSAgICByZXR1cm4gZW1wdHlCdWZmZXJfbChoZWFkZXIsIGZsYWdzLCB0aW1lc3RhbXAsIChpbnRwdHJfdCloZWFkZXItPnBCdWZmZXIpOworICAgIGhlYWRlci0+bk9mZnNldCA9IDA7CisgICAgaGVhZGVyLT5uRmlsbGVkTGVuID0gZ3JhcGhpY0J1ZmZlciA9PSBOVUxMID8gMCA6IGhlYWRlci0+bkFsbG9jTGVuOworICAgIHJldHVybiBlbXB0eUJ1ZmZlcl9sKGhlYWRlciwgZmxhZ3MsIHRpbWVzdGFtcCwgKGludHB0cl90KWhlYWRlci0+cEJ1ZmZlciwgZmVuY2VGZCk7CiB9CiAKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6Z2V0RXh0ZW5zaW9uSW5kZXgoCkBAIC0xMDgwLDYgKzEyODcsNyBAQAogICAgICAgICBjYXNlIElPTVg6OklOVEVSTkFMX09QVElPTl9SRVBFQVRfUFJFVklPVVNfRlJBTUVfREVMQVk6CiAgICAgICAgICAgICByZXR1cm4gIlJFUEVBVF9QUkVWSU9VU19GUkFNRV9ERUxBWSI7CiAgICAgICAgIGNhc2UgSU9NWDo6SU5URVJOQUxfT1BUSU9OX01BWF9USU1FU1RBTVBfR0FQOiByZXR1cm4gIk1BWF9USU1FU1RBTVBfR0FQIjsKKyAgICAgICAgY2FzZSBJT01YOjpJTlRFUk5BTF9PUFRJT05fTUFYX0ZQUzogICAgICAgICAgIHJldHVybiAiTUFYX0ZQUyI7CiAgICAgICAgIGNhc2UgSU9NWDo6SU5URVJOQUxfT1BUSU9OX1NUQVJUX1RJTUU6ICAgICAgICByZXR1cm4gIlNUQVJUX1RJTUUiOwogICAgICAgICBjYXNlIElPTVg6OklOVEVSTkFMX09QVElPTl9USU1FX0xBUFNFOiAgICAgICAgcmV0dXJuICJUSU1FX0xBUFNFIjsKICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CkBAIC0xMDk3LDYgKzEzMDUsNyBAQAogICAgICAgICBjYXNlIElPTVg6OklOVEVSTkFMX09QVElPTl9TVVNQRU5EOgogICAgICAgICBjYXNlIElPTVg6OklOVEVSTkFMX09QVElPTl9SRVBFQVRfUFJFVklPVVNfRlJBTUVfREVMQVk6CiAgICAgICAgIGNhc2UgSU9NWDo6SU5URVJOQUxfT1BUSU9OX01BWF9USU1FU1RBTVBfR0FQOgorICAgICAgICBjYXNlIElPTVg6OklOVEVSTkFMX09QVElPTl9NQVhfRlBTOgogICAgICAgICBjYXNlIElPTVg6OklOVEVSTkFMX09QVElPTl9TVEFSVF9USU1FOgogICAgICAgICBjYXNlIElPTVg6OklOVEVSTkFMX09QVElPTl9USU1FX0xBUFNFOgogICAgICAgICB7CkBAIC0xMTM0LDYgKzEzNDMsMTQgQEAKICAgICAgICAgICAgICAgICBpbnQ2NF90IG1heEdhcFVzID0gKihpbnQ2NF90ICopZGF0YTsKICAgICAgICAgICAgICAgICBDTE9HX0NPTkZJRyhzZXRJbnRlcm5hbE9wdGlvbiwgImdhcFVzPSVsbGQiLCAobG9uZyBsb25nKW1heEdhcFVzKTsKICAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyU291cmNlLT5zZXRNYXhUaW1lc3RhbXBHYXBVcyhtYXhHYXBVcyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gSU9NWDo6SU5URVJOQUxfT1BUSU9OX01BWF9GUFMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSAhPSBzaXplb2YoZmxvYXQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmbG9hdCBtYXhGcHMgPSAqKGZsb2F0ICopZGF0YTsKKyAgICAgICAgICAgICAgICBDTE9HX0NPTkZJRyhzZXRJbnRlcm5hbE9wdGlvbiwgIm1heEZwcz0lZiIsIG1heEZwcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlclNvdXJjZS0+c2V0TWF4RnBzKG1heEZwcyk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gSU9NWDo6SU5URVJOQUxfT1BUSU9OX1NUQVJUX1RJTUUpIHsKICAgICAgICAgICAgICAgICBpZiAoc2l6ZSAhPSBzaXplb2YoaW50NjRfdCkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMTE2Myw3ICsxMzgwLDcgQEAKICAgICB9CiB9CiAKLXZvaWQgT01YTm9kZUluc3RhbmNlOjpvbk1lc3NhZ2UoY29uc3Qgb214X21lc3NhZ2UgJm1zZykgeworYm9vbCBPTVhOb2RlSW5zdGFuY2U6OmhhbmRsZU1lc3NhZ2Uob214X21lc3NhZ2UgJm1zZykgewogICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBidWZmZXJTb3VyY2UoZ2V0R3JhcGhpY0J1ZmZlclNvdXJjZSgpKTsKIAogICAgIGlmIChtc2cudHlwZSA9PSBvbXhfbWVzc2FnZTo6RklMTF9CVUZGRVJfRE9ORSkgewpAQCAtMTE3NSw3ICsxMzkyLDggQEAKICAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJzV2l0aENvZGVjLnJlbW92ZShidWZmZXIpOwogCiAgICAgICAgICAgICBDTE9HX0JVTVBFRF9CVUZGRVIoCi0gICAgICAgICAgICAgICAgICAgIEZCRCwgV0lUSF9TVEFUUyhGVUxMX0JVRkZFUihtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5idWZmZXIsIGJ1ZmZlcikpKTsKKyAgICAgICAgICAgICAgICAgICAgRkJELCBXSVRIX1NUQVRTKEZVTExfQlVGRkVSKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmJ1ZmZlciwgYnVmZmVyLCBtc2cuZmVuY2VGZCkpKTsKIAogICAgICAgICAgICAgdW5idW1wRGVidWdMZXZlbF9sKGtQb3J0SW5kZXhPdXRwdXQpOwogICAgICAgICB9CkBAIC0xMTgzLDE2ICsxNDAxLDE4IEBACiAgICAgICAgIEJ1ZmZlck1ldGEgKmJ1ZmZlcl9tZXRhID0KICAgICAgICAgICAgIHN0YXRpY19jYXN0PEJ1ZmZlck1ldGEgKj4oYnVmZmVyLT5wQXBwUHJpdmF0ZSk7CiAKKyAgICAgICAgaWYgKGJ1ZmZlci0+bk9mZnNldCArIGJ1ZmZlci0+bkZpbGxlZExlbiA8IGJ1ZmZlci0+bk9mZnNldAorICAgICAgICAgICAgICAgIHx8IGJ1ZmZlci0+bk9mZnNldCArIGJ1ZmZlci0+bkZpbGxlZExlbiA+IGJ1ZmZlci0+bkFsbG9jTGVuKSB7CisgICAgICAgICAgICBDTE9HX0VSUk9SKG9uRmlsbEJ1ZmZlckRvbmUsIE9NWF9FcnJvckJhZFBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAgRlVMTF9CVUZGRVIoTlVMTCwgYnVmZmVyLCBtc2cuZmVuY2VGZCkpOworICAgICAgICB9CiAgICAgICAgIGJ1ZmZlcl9tZXRhLT5Db3B5RnJvbU9NWChidWZmZXIpOwogCiAgICAgICAgIGlmIChidWZmZXJTb3VyY2UgIT0gTlVMTCkgewogICAgICAgICAgICAgLy8gZml4IHVwIHRoZSBidWZmZXIgaW5mbyAoZXNwZWNpYWxseSB0aW1lc3RhbXApIGlmIG5lZWRlZAogICAgICAgICAgICAgYnVmZmVyU291cmNlLT5jb2RlY0J1ZmZlckZpbGxlZChidWZmZXIpOwogCi0gICAgICAgICAgICBvbXhfbWVzc2FnZSBuZXdNc2cgPSBtc2c7Ci0gICAgICAgICAgICBuZXdNc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS50aW1lc3RhbXAgPSBidWZmZXItPm5UaW1lU3RhbXA7Ci0gICAgICAgICAgICBtT2JzZXJ2ZXItPm9uTWVzc2FnZShuZXdNc2cpOwotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEudGltZXN0YW1wID0gYnVmZmVyLT5uVGltZVN0YW1wOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtc2cudHlwZSA9PSBvbXhfbWVzc2FnZTo6RU1QVFlfQlVGRkVSX0RPTkUpIHsKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlciA9CkBAIC0xMjAzLDcgKzE0MjMsNyBAQAogICAgICAgICAgICAgbUlucHV0QnVmZmVyc1dpdGhDb2RlYy5yZW1vdmUoYnVmZmVyKTsKIAogICAgICAgICAgICAgQ0xPR19CVU1QRURfQlVGRkVSKAotICAgICAgICAgICAgICAgICAgICBFQkQsIFdJVEhfU1RBVFMoRU1QVFlfQlVGRkVSKG1zZy51LmJ1ZmZlcl9kYXRhLmJ1ZmZlciwgYnVmZmVyKSkpOworICAgICAgICAgICAgICAgICAgICBFQkQsIFdJVEhfU1RBVFMoRU1QVFlfQlVGRkVSKG1zZy51LmJ1ZmZlcl9kYXRhLmJ1ZmZlciwgYnVmZmVyLCBtc2cuZmVuY2VGZCkpKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChidWZmZXJTb3VyY2UgIT0gTlVMTCkgewpAQCAtMTIxMiwxMiArMTQzMiwyNiBAQAogICAgICAgICAgICAgLy8gRG9uJ3QgZGlzcGF0Y2ggYSBtZXNzYWdlIGJhY2sgdG8gQUNvZGVjLCBzaW5jZSBpdCBkb2Vzbid0CiAgICAgICAgICAgICAvLyBrbm93IHRoYXQgYW55b25lIGFza2VkIHRvIGhhdmUgdGhlIGJ1ZmZlciBlbXB0aWVkIGFuZCB3aWxsCiAgICAgICAgICAgICAvLyBiZSB2ZXJ5IGNvbmZ1c2VkLgotICAgICAgICAgICAgYnVmZmVyU291cmNlLT5jb2RlY0J1ZmZlckVtcHRpZWQoYnVmZmVyKTsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGJ1ZmZlclNvdXJjZS0+Y29kZWNCdWZmZXJFbXB0aWVkKGJ1ZmZlciwgbXNnLmZlbmNlRmQpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtT2JzZXJ2ZXItPm9uTWVzc2FnZShtc2cpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBPTVhOb2RlSW5zdGFuY2U6Om9uTWVzc2FnZXMoc3RkOjpsaXN0PG9teF9tZXNzYWdlPiAmbWVzc2FnZXMpIHsKKyAgICBmb3IgKHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT46Oml0ZXJhdG9yIGl0ID0gbWVzc2FnZXMuYmVnaW4oKTsgaXQgIT0gbWVzc2FnZXMuZW5kKCk7ICkgeworICAgICAgICBpZiAoaGFuZGxlTWVzc2FnZSgqaXQpKSB7CisgICAgICAgICAgICBtZXNzYWdlcy5lcmFzZShpdCsrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIW1lc3NhZ2VzLmVtcHR5KCkpIHsKKyAgICAgICAgbU9ic2VydmVyLT5vbk1lc3NhZ2VzKG1lc3NhZ2VzKTsKKyAgICB9CiB9CiAKIHZvaWQgT01YTm9kZUluc3RhbmNlOjpvbk9ic2VydmVyRGllZChPTVhNYXN0ZXIgKm1hc3RlcikgewpAQCAtMTMwNyw4ICsxNTQxLDkgQEAKICAgICBpZiAoaW5zdGFuY2UtPm1EeWluZykgewogICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICB9CisgICAgaW50IGZlbmNlRmQgPSBpbnN0YW5jZS0+cmV0cmlldmVGZW5jZUZyb21NZXRhX2wocEJ1ZmZlciwga1BvcnRJbmRleE91dHB1dCk7CiAgICAgcmV0dXJuIGluc3RhbmNlLT5vd25lcigpLT5PbkVtcHR5QnVmZmVyRG9uZShpbnN0YW5jZS0+bm9kZUlEKCksCi0gICAgICAgICAgICBpbnN0YW5jZS0+ZmluZEJ1ZmZlcklEKHBCdWZmZXIpLCBwQnVmZmVyKTsKKyAgICAgICAgICAgIGluc3RhbmNlLT5maW5kQnVmZmVySUQocEJ1ZmZlciksIHBCdWZmZXIsIGZlbmNlRmQpOwogfQogCiAvLyBzdGF0aWMKQEAgLTEzMjAsOCArMTU1NSw5IEBACiAgICAgaWYgKGluc3RhbmNlLT5tRHlpbmcpIHsKICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgfQorICAgIGludCBmZW5jZUZkID0gaW5zdGFuY2UtPnJldHJpZXZlRmVuY2VGcm9tTWV0YV9sKHBCdWZmZXIsIGtQb3J0SW5kZXhPdXRwdXQpOwogICAgIHJldHVybiBpbnN0YW5jZS0+b3duZXIoKS0+T25GaWxsQnVmZmVyRG9uZShpbnN0YW5jZS0+bm9kZUlEKCksCi0gICAgICAgICAgICBpbnN0YW5jZS0+ZmluZEJ1ZmZlcklEKHBCdWZmZXIpLCBwQnVmZmVyKTsKKyAgICAgICAgICAgIGluc3RhbmNlLT5maW5kQnVmZmVySUQocEJ1ZmZlciksIHBCdWZmZXIsIGZlbmNlRmQpOwogfQogCiB2b2lkIE9NWE5vZGVJbnN0YW5jZTo6YWRkQWN0aXZlQnVmZmVyKE9NWF9VMzIgcG9ydEluZGV4LCBPTVg6OmJ1ZmZlcl9pZCBpZCkgewpAQCAtMTM4Miw3ICsxNjE4LDEyIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUJ1ZmZlcklETG9jayk7Ci0gICAgcmV0dXJuIG1CdWZmZXJJRFRvQnVmZmVySGVhZGVyLnZhbHVlRm9yKGJ1ZmZlcik7CisgICAgc3NpemVfdCBpbmRleCA9IG1CdWZmZXJJRFRvQnVmZmVySGVhZGVyLmluZGV4T2ZLZXkoYnVmZmVyKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIENMT0dXKCJmaW5kQnVmZmVySGVhZGVyOiBidWZmZXIgJXUgbm90IGZvdW5kIiwgYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBtQnVmZmVySURUb0J1ZmZlckhlYWRlci52YWx1ZUF0KGluZGV4KTsKIH0KIAogT01YOjpidWZmZXJfaWQgT01YTm9kZUluc3RhbmNlOjpmaW5kQnVmZmVySUQoT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlckhlYWRlcikgewpAQCAtMTM5MCw3ICsxNjMxLDEyIEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUJ1ZmZlcklETG9jayk7Ci0gICAgcmV0dXJuIG1CdWZmZXJIZWFkZXJUb0J1ZmZlcklELnZhbHVlRm9yKGJ1ZmZlckhlYWRlcik7CisgICAgc3NpemVfdCBpbmRleCA9IG1CdWZmZXJIZWFkZXJUb0J1ZmZlcklELmluZGV4T2ZLZXkoYnVmZmVySGVhZGVyKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIENMT0dXKCJmaW5kQnVmZmVySUQ6IGJ1ZmZlckhlYWRlciAlcCBub3QgZm91bmQiLCBidWZmZXJIZWFkZXIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIG1CdWZmZXJIZWFkZXJUb0J1ZmZlcklELnZhbHVlQXQoaW5kZXgpOwogfQogCiB2b2lkIE9NWE5vZGVJbnN0YW5jZTo6aW52YWxpZGF0ZUJ1ZmZlcklEKE9NWDo6YnVmZmVyX2lkIGJ1ZmZlcikgewpAQCAtMTM5OCw4ICsxNjQ0LDEzIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1CdWZmZXJJRExvY2spOwotICAgIG1CdWZmZXJIZWFkZXJUb0J1ZmZlcklELnJlbW92ZUl0ZW0obUJ1ZmZlcklEVG9CdWZmZXJIZWFkZXIudmFsdWVGb3IoYnVmZmVyKSk7Ci0gICAgbUJ1ZmZlcklEVG9CdWZmZXJIZWFkZXIucmVtb3ZlSXRlbShidWZmZXIpOworICAgIHNzaXplX3QgaW5kZXggPSBtQnVmZmVySURUb0J1ZmZlckhlYWRlci5pbmRleE9mS2V5KGJ1ZmZlcik7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBDTE9HVygiaW52YWxpZGF0ZUJ1ZmZlcklEOiBidWZmZXIgJXUgbm90IGZvdW5kIiwgYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQnVmZmVySGVhZGVyVG9CdWZmZXJJRC5yZW1vdmVJdGVtKG1CdWZmZXJJRFRvQnVmZmVySGVhZGVyLnZhbHVlQXQoaW5kZXgpKTsKKyAgICBtQnVmZmVySURUb0J1ZmZlckhlYWRlci5yZW1vdmVJdGVtc0F0KGluZGV4KTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcAppbmRleCA3Zjk5ZGNkLi42MGMxZTJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwCkBAIC01OCw3ICs1OCw3IEBACiAgICAgICAgIE9NWF9DT01NQU5EVFlQRSBjbWQsIE9NWF9VMzIgcGFyYW0sIE9NWF9QVFIgZGF0YSkgewogICAgIENIRUNLKGRhdGEgPT0gTlVMTCk7CiAKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZENvbW1hbmQsIG1IYW5kbGVyLT5pZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZENvbW1hbmQsIG1IYW5kbGVyKTsKICAgICBtc2ctPnNldEludDMyKCJjbWQiLCBjbWQpOwogICAgIG1zZy0+c2V0SW50MzIoInBhcmFtIiwgcGFyYW0pOwogICAgIG1zZy0+cG9zdCgpOwpAQCAtMTI1LDYgKzEyNSwxMCBAQAogICAgICAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqZGVmUGFyYW1zID0KICAgICAgICAgICAgICAgICAoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqKXBhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZGVmUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChkZWZQYXJhbXMtPm5Qb3J0SW5kZXggPj0gbVBvcnRzLnNpemUoKQogICAgICAgICAgICAgICAgICAgICB8fCBkZWZQYXJhbXMtPm5TaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gc2l6ZW9mKE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUpKSB7CkBAIC0xNTIsNiArMTU2LDEwIEBACiAgICAgICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpkZWZQYXJhbXMgPQogICAgICAgICAgICAgICAgIChPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShkZWZQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGRlZlBhcmFtcy0+blBvcnRJbmRleCA+PSBtUG9ydHMuc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBvcnRJbmRleDsKICAgICAgICAgICAgIH0KQEAgLTMwNyw3ICszMTUsNyBAQAogCiBPTVhfRVJST1JUWVBFIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmVtcHR5VGhpc0J1ZmZlcigKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcikgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRFbXB0eVRoaXNCdWZmZXIsIG1IYW5kbGVyLT5pZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RW1wdHlUaGlzQnVmZmVyLCBtSGFuZGxlcik7CiAgICAgbXNnLT5zZXRQb2ludGVyKCJoZWFkZXIiLCBidWZmZXIpOwogICAgIG1zZy0+cG9zdCgpOwogCkBAIC0zMTYsNyArMzI0LDcgQEAKIAogT01YX0VSUk9SVFlQRSBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpmaWxsVGhpc0J1ZmZlcigKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcikgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRGaWxsVGhpc0J1ZmZlciwgbUhhbmRsZXItPmlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRGaWxsVGhpc0J1ZmZlciwgbUhhbmRsZXIpOwogICAgIG1zZy0+c2V0UG9pbnRlcigiaGVhZGVyIiwgYnVmZmVyKTsKICAgICBtc2ctPnBvc3QoKTsKIApAQCAtNTA1LDcgKzUxMywxNSBAQAogICAgIENIRUNLX0xUKHBvcnRJbmRleCwgbVBvcnRzLnNpemUoKSk7CiAKICAgICBQb3J0SW5mbyAqcG9ydCA9ICZtUG9ydHMuZWRpdEl0ZW1BdChwb3J0SW5kZXgpOwotICAgIENIRUNLX0VRKChpbnQpcG9ydC0+bVRyYW5zaXRpb24sIChpbnQpUG9ydEluZm86Ok5PTkUpOworICAgIC8vIElkZWFsbHksIHRoZSBwb3J0IHNob3VsZCBub3QgaW4gdHJhbnNpdGlvbmluZyBzdGF0ZSB3aGVuIGZsdXNoaW5nLgorICAgIC8vIEhvd2V2ZXIsIGluIGVycm9yIGhhbmRsaW5nIGNhc2UsIGUuZy4sIHRoZSBjbGllbnQgY2FuJ3QgYWxsb2NhdGUgYnVmZmVycworICAgIC8vIHdoZW4gaXQgdHJpZXMgdG8gcmUtZW5hYmxlIHRoZSBwb3J0LCB0aGUgcG9ydCB3aWxsIGJlIHN0dWNrIGluIEVOQUJMSU5HLgorICAgIC8vIFRoZSBjbGllbnQgd2lsbCB0aGVuIHRyYW5zaXRpb24gdGhlIGNvbXBvbmVudCBmcm9tIEV4ZWN1dGluZyB0byBJZGxlLAorICAgIC8vIHdoaWNoIGxlYWRzIHRvIGZsdXNoaW5nIHBvcnRzLiBBdCB0aGlzIHRpbWUsIGl0IHNob3VsZCBiZSBvayB0byBub3RpZnkKKyAgICAvLyB0aGUgY2xpZW50IG9mIHRoZSBlcnJvciBhbmQgc3RpbGwgY2xlYXIgYWxsIGJ1ZmZlcnMgb24gdGhlIHBvcnQuCisgICAgaWYgKHBvcnQtPm1UcmFuc2l0aW9uICE9IFBvcnRJbmZvOjpOT05FKSB7CisgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCAwKTsKKyAgICB9CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBvcnQtPm1CdWZmZXJzLnNpemUoKTsgKytpKSB7CiAgICAgICAgIEJ1ZmZlckluZm8gKmJ1ZmZlciA9ICZwb3J0LT5tQnVmZmVycy5lZGl0SXRlbUF0KGkpOwpAQCAtNTk4LDcgKzYxNCw3IEBACiAKICAgICAgICAgaWYgKHBvcnQtPm1UcmFuc2l0aW9uID09IFBvcnRJbmZvOjpESVNBQkxJTkcpIHsKICAgICAgICAgICAgIGlmIChwb3J0LT5tQnVmZmVycy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlBvcnQgJWQgbm93IGRpc2FibGVkLiIsIGkpOworICAgICAgICAgICAgICAgIEFMT0dWKCJQb3J0ICV6dSBub3cgZGlzYWJsZWQuIiwgaSk7CiAKICAgICAgICAgICAgICAgICBwb3J0LT5tVHJhbnNpdGlvbiA9IFBvcnRJbmZvOjpOT05FOwogICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRDbWRDb21wbGV0ZSwgT01YX0NvbW1hbmRQb3J0RGlzYWJsZSwgaSwgTlVMTCk7CkBAIC02MDcsNyArNjIzLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChwb3J0LT5tVHJhbnNpdGlvbiA9PSBQb3J0SW5mbzo6RU5BQkxJTkcpIHsKICAgICAgICAgICAgIGlmIChwb3J0LT5tRGVmLmJQb3B1bGF0ZWQgPT0gT01YX1RSVUUpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiUG9ydCAlZCBub3cgZW5hYmxlZC4iLCBpKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiUG9ydCAlenUgbm93IGVuYWJsZWQuIiwgaSk7CiAKICAgICAgICAgICAgICAgICBwb3J0LT5tVHJhbnNpdGlvbiA9IFBvcnRJbmZvOjpOT05FOwogICAgICAgICAgICAgICAgIHBvcnQtPm1EZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKQEAgLTYyOCwxNCArNjQ0LDE0IEBACiAgICAgaW5mby0+bVRyYW5zaXRpb24gPSBQb3J0SW5mbzo6Tk9ORTsKIH0KIAotdm9pZCBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7Cit2b2lkIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXggX191bnVzZWQpIHsKIH0KIAotdm9pZCBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCBfX3VudXNlZCkgewogfQogCiB2b2lkIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6Om9uUG9ydEVuYWJsZUNvbXBsZXRlZCgKLSAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGJvb2wgZW5hYmxlZCkgeworICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCBfX3VudXNlZCwgYm9vbCBlbmFibGVkIF9fdW51c2VkKSB7CiB9CiAKIExpc3Q8U2ltcGxlU29mdE9NWENvbXBvbmVudDo6QnVmZmVySW5mbyAqPiAmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAKaW5kZXggNGNlMTY1Yi4uMTlkZGU4MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcApAQCAtMjY0LDYgKzI2NCwxMCBAQAogICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQogICAgICAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4ga01heFBvcnRJbmRleCkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CiAgICAgICAgICAgICB9CkBAIC0yOTIsNiArMjk2LDEwIEBACiAgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSAqcHJvZmlsZUxldmVsID0KICAgICAgICAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSAqKSBwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKHByb2ZpbGVMZXZlbCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAocHJvZmlsZUxldmVsLT5uUG9ydEluZGV4ICE9IGtJbnB1dFBvcnRJbmRleCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHBvcnQgaW5kZXg6ICUiIFBSSXUzMiwgcHJvZmlsZUxldmVsLT5uUG9ydEluZGV4KTsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKQEAgLTMyMiw2ICszMzAsMTAgQEAKICAgICAgICAgICAgIGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcm9sZVBhcmFtcyA9CiAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqKXBhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0ocm9sZVBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoc3RybmNtcCgoY29uc3QgY2hhciAqKXJvbGVQYXJhbXMtPmNSb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudFJvbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSAtIDEpKSB7CkBAIC0zMzYsNiArMzQ4LDEwIEBACiAgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CiAgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiBrTWF4UG9ydEluZGV4KSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBvcnRJbmRleDsKICAgICAgICAgICAgIH0KQEAgLTM2Myw2ICszNzksMTEgQEAKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgUHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2tQYXJhbXMqIGFkYXB0aXZlUGxheWJhY2tQYXJhbXMgPQogICAgICAgICAgICAgICAgICAgICAoY29uc3QgUHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2tQYXJhbXMgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGFkYXB0aXZlUGxheWJhY2tQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgbUlzQWRhcHRpdmUgPSBhZGFwdGl2ZVBsYXliYWNrUGFyYW1zLT5iRW5hYmxlOwogICAgICAgICAgICAgaWYgKG1Jc0FkYXB0aXZlKSB7CiAgICAgICAgICAgICAgICAgbUFkYXB0aXZlTWF4V2lkdGggPSBhZGFwdGl2ZVBsYXliYWNrUGFyYW1zLT5uTWF4RnJhbWVXaWR0aDsKQEAgLTM4MSw2ICs0MDIsMTEgQEAKICAgICAgICAgewogICAgICAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqbmV3UGFyYW1zID0KICAgICAgICAgICAgICAgICAoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0obmV3UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIE9NWF9WSURFT19QT1JUREVGSU5JVElPTlRZUEUgKnZpZGVvX2RlZiA9ICZuZXdQYXJhbXMtPmZvcm1hdC52aWRlbzsKICAgICAgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKmRlZiA9ICZlZGl0UG9ydEluZm8obmV3UGFyYW1zLT5uUG9ydEluZGV4KS0+bURlZjsKIApAQCAtNDIxLDYgKzQ0NywxMCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQ09ORklHX1JFQ1RUWVBFICpyZWN0UGFyYW1zID0gKE9NWF9DT05GSUdfUkVDVFRZUEUgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKHJlY3RQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHJlY3RQYXJhbXMtPm5Qb3J0SW5kZXggIT0ga091dHB1dFBvcnRJbmRleCkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAKaW5kZXggZDRkNjIxNy4uOGVhN2E2ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcApAQCAtMzQsNiArMzQsOCBAQAogI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KICNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyTWFwcGVyLmg+CiAKKyNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjb25zdCBzdGF0aWMgT01YX0NPTE9SX0ZPUk1BVFRZUEUga1N1cHBvcnRlZENvbG9yRm9ybWF0c1tdID0gewpAQCAtMTU1LDcgKzE1Nyw3IEBACiAgICAgdWludDMyX3QgcmF3QnVmZmVyU2l6ZSA9CiAgICAgICAgIGluRGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSAqIGluRGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ICogMyAvIDI7CiAgICAgaWYgKGluRGVmLT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkT3BhcXVlKSB7Ci0gICAgICAgIGluRGVmLT5uQnVmZmVyU2l6ZSA9IDQgKyBtYXgoc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCksIHNpemVvZihHcmFwaGljQnVmZmVyICopKTsKKyAgICAgICAgaW5EZWYtPm5CdWZmZXJTaXplID0gbWF4KHNpemVvZihWaWRlb05hdGl2ZU1ldGFkYXRhKSwgc2l6ZW9mKFZpZGVvR3JhbGxvY01ldGFkYXRhKSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaW5EZWYtPm5CdWZmZXJTaXplID0gcmF3QnVmZmVyU2l6ZTsKICAgICB9CkBAIC0yOTMsNyArMjk1LDcgQEAKIAogT01YX0VSUk9SVFlQRSBTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50OjppbnRlcm5hbEdldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbSkgewotICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICBzd2l0Y2ggKChpbnQpaW5kZXgpIHsKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvRXJyb3JDb3JyZWN0aW9uOgogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm90SW1wbGVtZW50ZWQ7CkBAIC0zNDMsNiArMzQ1LDEzIEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Db25zdW1lclVzYWdlQml0czoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX1UzMiAqdXNhZ2VCaXRzID0gKE9NWF9VMzIgKilwYXJhbTsKKyAgICAgICAgICAgICp1c2FnZUJpdHMgPSBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU47CisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtKTsKICAgICB9CkBAIC00ODIsOCArNDkxLDggQEAKICAgICBzaXplX3QgZHN0VlN0cmlkZSA9IGhlaWdodDsKIAogICAgIE1ldGFkYXRhQnVmZmVyVHlwZSBidWZmZXJUeXBlID0gKihNZXRhZGF0YUJ1ZmZlclR5cGUgKilzcmM7Ci0gICAgYm9vbCB1c2luZ0dyYXBoaWNCdWZmZXIgPSBidWZmZXJUeXBlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFwaGljQnVmZmVyOwotICAgIGlmICghdXNpbmdHcmFwaGljQnVmZmVyICYmIGJ1ZmZlclR5cGUgIT0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UpIHsKKyAgICBib29sIHVzaW5nQU5XQnVmZmVyID0gYnVmZmVyVHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyOworICAgIGlmICghdXNpbmdBTldCdWZmZXIgJiYgYnVmZmVyVHlwZSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkgewogICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgbWV0YWRhdGEgdHlwZSAoJWQpIiwgYnVmZmVyVHlwZSk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTQ5OSwxMyArNTA4LDE0IEBACiAgICAgaW50IGZvcm1hdDsKICAgICBzaXplX3Qgc3JjU3RyaWRlOwogICAgIHNpemVfdCBzcmNWU3RyaWRlOwotICAgIGlmICh1c2luZ0dyYXBoaWNCdWZmZXIpIHsKLSAgICAgICAgaWYgKHNyY1NpemUgPCBzaXplb2YoT01YX1UzMikgKyBzaXplb2YoR3JhcGhpY0J1ZmZlciAqKSkgewotICAgICAgICAgICAgQUxPR0UoIk1ldGFkYXRhIGlzIHRvbyBzbWFsbCAoJXp1IHZzICV6dSkiLCBzcmNTaXplLCBzaXplb2YoT01YX1UzMikgKyBzaXplb2YoR3JhcGhpY0J1ZmZlciAqKSk7CisgICAgaWYgKHVzaW5nQU5XQnVmZmVyKSB7CisgICAgICAgIGlmIChzcmNTaXplIDwgc2l6ZW9mKFZpZGVvTmF0aXZlTWV0YWRhdGEpKSB7CisgICAgICAgICAgICBBTE9HRSgiTWV0YWRhdGEgaXMgdG9vIHNtYWxsICglenUgdnMgJXp1KSIsIHNyY1NpemUsIHNpemVvZihWaWRlb05hdGl2ZU1ldGFkYXRhKSk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogCi0gICAgICAgIEdyYXBoaWNCdWZmZXIgKmJ1ZmZlciA9ICooR3JhcGhpY0J1ZmZlciAqKikoc3JjICsgc2l6ZW9mKE9NWF9VMzIpKTsKKyAgICAgICAgVmlkZW9OYXRpdmVNZXRhZGF0YSAmbmF0aXZlTWV0YSA9ICooVmlkZW9OYXRpdmVNZXRhZGF0YSAqKXNyYzsKKyAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciAqYnVmZmVyID0gbmF0aXZlTWV0YS5wQnVmZmVyOwogICAgICAgICBoYW5kbGUgPSBidWZmZXItPmhhbmRsZTsKICAgICAgICAgZm9ybWF0ID0gYnVmZmVyLT5mb3JtYXQ7CiAgICAgICAgIHNyY1N0cmlkZSA9IGJ1ZmZlci0+c3RyaWRlOwpAQCAtNTE2LDE1ICs1MjYsMjYgQEAKICAgICAgICAgICAgIC8vIFRPRE8gZG8gd2UgbmVlZCB0byBzdXBwb3J0IG90aGVyIGZvcm1hdHM/CiAgICAgICAgICAgICBzcmNTdHJpZGUgKj0gNDsKICAgICAgICAgfQorCisgICAgICAgIGlmIChuYXRpdmVNZXRhLm5GZW5jZUZkID49IDApIHsKKyAgICAgICAgICAgIHNwPEZlbmNlPiBmZW5jZSA9IG5ldyBGZW5jZShuYXRpdmVNZXRhLm5GZW5jZUZkKTsKKyAgICAgICAgICAgIG5hdGl2ZU1ldGEubkZlbmNlRmQgPSAtMTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGZlbmNlLT53YWl0KElPTVg6OmtGZW5jZVRpbWVvdXRNcyk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlRpbWVkIG91dCB3YWl0aW5nIG9uIGlucHV0IGZlbmNlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBwYXJ0LiAgQ2hlY2sgaWYgYW55b25lIHVzZXMgdGhpcy4KIAotICAgICAgICBpZiAoc3JjU2l6ZSA8IHNpemVvZihPTVhfVTMyKSArIHNpemVvZihidWZmZXJfaGFuZGxlX3QpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiTWV0YWRhdGEgaXMgdG9vIHNtYWxsICglenUgdnMgJXp1KSIsIHNyY1NpemUsIHNpemVvZihPTVhfVTMyKSArIHNpemVvZihidWZmZXJfaGFuZGxlX3QpKTsKKyAgICAgICAgaWYgKHNyY1NpemUgPCBzaXplb2YoVmlkZW9HcmFsbG9jTWV0YWRhdGEpKSB7CisgICAgICAgICAgICBBTE9HRSgiTWV0YWRhdGEgaXMgdG9vIHNtYWxsICglenUgdnMgJXp1KSIsIHNyY1NpemUsIHNpemVvZihWaWRlb0dyYWxsb2NNZXRhZGF0YSkpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIAotICAgICAgICBoYW5kbGUgPSAqKGJ1ZmZlcl9oYW5kbGVfdCAqKShzcmMgKyBzaXplb2YoT01YX1UzMikpOworICAgICAgICBWaWRlb0dyYWxsb2NNZXRhZGF0YSAmZ3JhbGxvY01ldGEgPSAqKFZpZGVvR3JhbGxvY01ldGFkYXRhICopKHNyYyk7CisgICAgICAgIGhhbmRsZSA9IGdyYWxsb2NNZXRhLnBIYW5kbGU7CiAgICAgICAgIC8vIGFzc3VtZSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OAogICAgICAgICAvLyB0aGVyZSBpcyBubyB3YXkgdG8gZ2V0IHRoZSBzcmMgc3RyaWRlIHdpdGhvdXQgdGhlIGdyYXBoaWMgYnVmZmVyCiAgICAgICAgIGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OwpAQCAtNjA2LDcgKzYyNyw3IEBACiBPTVhfRVJST1JUWVBFIFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQ6OmdldEV4dGVuc2lvbkluZGV4KAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCkgewogICAgIGlmICghc3RyY21wKG5hbWUsICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguc3RvcmVNZXRhRGF0YUluQnVmZmVycyIpIHx8Ci0gICAgICAgICFzdHJjbXAobmFtZSwgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5zdG9yZUdyYXBoaWNCdWZmZXJJbk1ldGFEYXRhIikpIHsKKyAgICAgICAgIXN0cmNtcChuYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnN0b3JlQU5XQnVmZmVySW5NZXRhZGF0YSIpKSB7CiAgICAgICAgICooaW50MzJfdCopaW5kZXggPSBrU3RvcmVNZXRhRGF0YUV4dGVuc2lvbkluZGV4OwogICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IDQ0N2IyOWUuLjAyZTk3ZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLm1rCkBAIC0xMSw3ICsxMSw4IEBACiAJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAogCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAotTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCiAKIExPQ0FMX01PRFVMRSA6PSBvbXhfdGVzdHMKIApAQCAtMjAsMyArMjEsMjQgQEAKIExPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKIAogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gRnJhbWVEcm9wcGVyX3Rlc3QKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKwlGcmFtZURyb3BwZXJfdGVzdC5jcHAgXAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJzdGFnZWZyaWdodF9vbXggXAorCWxpYnV0aWxzIFwKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXggXAorCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvciAtV2FsbAorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQorCitpbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvRnJhbWVEcm9wcGVyX3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0ZyYW1lRHJvcHBlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTY2YjVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0ZyYW1lRHJvcHBlcl90ZXN0LmNwcApAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRnJhbWVEcm9wcGVyX3Rlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAiRnJhbWVEcm9wcGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgVGVzdEZyYW1lIHsKKyAgaW50NjRfdCB0aW1lVXM7CisgIGJvb2wgc2hvdWxkRHJvcDsKK307CisKK3N0YXRpYyBjb25zdCBUZXN0RnJhbWUgdGVzdEZyYW1lczIwRnBzW10gPSB7CisgICAgezEwMDAwMDAsIGZhbHNlfSwgezEwNTAwMDAsIGZhbHNlfSwgezExMDAwMDAsIGZhbHNlfSwgezExNTAwMDAsIGZhbHNlfSwKKyAgICB7MTIwMDAwMCwgZmFsc2V9LCB7MTI1MDAwMCwgZmFsc2V9LCB7MTMwMDAwMCwgZmFsc2V9LCB7MTM1MDAwMCwgZmFsc2V9LAorICAgIHsxNDAwMDAwLCBmYWxzZX0sIHsxNDUwMDAwLCBmYWxzZX0sIHsxNTAwMDAwLCBmYWxzZX0sIHsxNTUwMDAwLCBmYWxzZX0sCisgICAgezE2MDAwMDAsIGZhbHNlfSwgezE2NTAwMDAsIGZhbHNlfSwgezE3MDAwMDAsIGZhbHNlfSwgezE3NTAwMDAsIGZhbHNlfSwKKyAgICB7MTgwMDAwMCwgZmFsc2V9LCB7MTg1MDAwMCwgZmFsc2V9LCB7MTkwMDAwMCwgZmFsc2V9LCB7MTk1MDAwMCwgZmFsc2V9LAorfTsKKworc3RhdGljIGNvbnN0IFRlc3RGcmFtZSB0ZXN0RnJhbWVzMzBGcHNbXSA9IHsKKyAgICB7MTAwMDAwMCwgZmFsc2V9LCB7MTAzMzMzMywgZmFsc2V9LCB7MTA2NjY2NywgZmFsc2V9LCB7MTEwMDAwMCwgZmFsc2V9LAorICAgIHsxMTMzMzMzLCBmYWxzZX0sIHsxMTY2NjY3LCBmYWxzZX0sIHsxMjAwMDAwLCBmYWxzZX0sIHsxMjMzMzMzLCBmYWxzZX0sCisgICAgezEyNjY2NjcsIGZhbHNlfSwgezEzMDAwMDAsIGZhbHNlfSwgezEzMzMzMzMsIGZhbHNlfSwgezEzNjY2NjcsIGZhbHNlfSwKKyAgICB7MTQwMDAwMCwgZmFsc2V9LCB7MTQzMzMzMywgZmFsc2V9LCB7MTQ2NjY2NywgZmFsc2V9LCB7MTUwMDAwMCwgZmFsc2V9LAorICAgIHsxNTMzMzMzLCBmYWxzZX0sIHsxNTY2NjY3LCBmYWxzZX0sIHsxNjAwMDAwLCBmYWxzZX0sIHsxNjMzMzMzLCBmYWxzZX0sCit9OworCitzdGF0aWMgY29uc3QgVGVzdEZyYW1lIHRlc3RGcmFtZXM0MEZwc1tdID0geworICAgIHsxMDAwMDAwLCBmYWxzZX0sIHsxMDI1MDAwLCB0cnVlfSwgezEwNTAwMDAsIGZhbHNlfSwgezEwNzUwMDAsIGZhbHNlfSwKKyAgICB7MTEwMDAwMCwgZmFsc2V9LCB7MTEyNTAwMCwgdHJ1ZX0sIHsxMTUwMDAwLCBmYWxzZX0sIHsxMTc1MDAwLCBmYWxzZX0sCisgICAgezEyMDAwMDAsIGZhbHNlfSwgezEyMjUwMDAsIHRydWV9LCB7MTI1MDAwMCwgZmFsc2V9LCB7MTI3NTAwMCwgZmFsc2V9LAorICAgIHsxMzAwMDAwLCBmYWxzZX0sIHsxMzI1MDAwLCB0cnVlfSwgezEzNTAwMDAsIGZhbHNlfSwgezEzNzUwMDAsIGZhbHNlfSwKKyAgICB7MTQwMDAwMCwgZmFsc2V9LCB7MTQyNTAwMCwgdHJ1ZX0sIHsxNDUwMDAwLCBmYWxzZX0sIHsxNDc1MDAwLCBmYWxzZX0sCit9OworCitzdGF0aWMgY29uc3QgVGVzdEZyYW1lIHRlc3RGcmFtZXM2MEZwc1tdID0geworICAgIHsxMDAwMDAwLCBmYWxzZX0sIHsxMDE2NjY3LCB0cnVlfSwgezEwMzMzMzMsIGZhbHNlfSwgezEwNTAwMDAsIHRydWV9LAorICAgIHsxMDY2NjY3LCBmYWxzZX0sIHsxMDgzMzMzLCB0cnVlfSwgezExMDAwMDAsIGZhbHNlfSwgezExMTY2NjcsIHRydWV9LAorICAgIHsxMTMzMzMzLCBmYWxzZX0sIHsxMTUwMDAwLCB0cnVlfSwgezExNjY2NjcsIGZhbHNlfSwgezExODMzMzMsIHRydWV9LAorICAgIHsxMjAwMDAwLCBmYWxzZX0sIHsxMjE2NjY3LCB0cnVlfSwgezEyMzMzMzMsIGZhbHNlfSwgezEyNTAwMDAsIHRydWV9LAorICAgIHsxMjY2NjY3LCBmYWxzZX0sIHsxMjgzMzMzLCB0cnVlfSwgezEzMDAwMDAsIGZhbHNlfSwgezEzMTY2NjcsIHRydWV9LAorfTsKKworc3RhdGljIGNvbnN0IFRlc3RGcmFtZSB0ZXN0RnJhbWVzVmFyaWFibGVGcHNbXSA9IHsKKyAgICAvLyA0MGZwcworICAgIHsxMDAwMDAwLCBmYWxzZX0sIHsxMDI1MDAwLCB0cnVlfSwgezEwNTAwMDAsIGZhbHNlfSwgezEwNzUwMDAsIGZhbHNlfSwKKyAgICB7MTEwMDAwMCwgZmFsc2V9LCB7MTEyNTAwMCwgdHJ1ZX0sIHsxMTUwMDAwLCBmYWxzZX0sIHsxMTc1MDAwLCBmYWxzZX0sCisgICAgezEyMDAwMDAsIGZhbHNlfSwgezEyMjUwMDAsIHRydWV9LCB7MTI1MDAwMCwgZmFsc2V9LCB7MTI3NTAwMCwgZmFsc2V9LAorICAgIHsxMzAwMDAwLCBmYWxzZX0sIHsxMzI1MDAwLCB0cnVlfSwgezEzNTAwMDAsIGZhbHNlfSwgezEzNzUwMDAsIGZhbHNlfSwKKyAgICB7MTQwMDAwMCwgZmFsc2V9LCB7MTQyNTAwMCwgdHJ1ZX0sIHsxNDUwMDAwLCBmYWxzZX0sIHsxNDc1MDAwLCBmYWxzZX0sCisgICAgLy8gYSB0aW1lc3RhbXAganVtcCBwbHVzIHN3aXRjaCB0byAyMGZwcworICAgIHsyMDAwMDAwLCBmYWxzZX0sIHsyMDUwMDAwLCBmYWxzZX0sIHsyMTAwMDAwLCBmYWxzZX0sIHsyMTUwMDAwLCBmYWxzZX0sCisgICAgezIyMDAwMDAsIGZhbHNlfSwgezIyNTAwMDAsIGZhbHNlfSwgezIzMDAwMDAsIGZhbHNlfSwgezIzNTAwMDAsIGZhbHNlfSwKKyAgICB7MjQwMDAwMCwgZmFsc2V9LCB7MjQ1MDAwMCwgZmFsc2V9LCB7MjUwMDAwMCwgZmFsc2V9LCB7MjU1MDAwMCwgZmFsc2V9LAorICAgIHsyNjAwMDAwLCBmYWxzZX0sIHsyNjUwMDAwLCBmYWxzZX0sIHsyNzAwMDAwLCBmYWxzZX0sIHsyNzUwMDAwLCBmYWxzZX0sCisgICAgezI4MDAwMDAsIGZhbHNlfSwgezI4NTAwMDAsIGZhbHNlfSwgezI5MDAwMDAsIGZhbHNlfSwgezI5NTAwMDAsIGZhbHNlfSwKKyAgICAvLyA2MGZwcworICAgIHsyOTY2NjY3LCBmYWxzZX0sIHsyOTgzMzMzLCB0cnVlfSwgezMwMDAwMDAsIGZhbHNlfSwgezMwMTY2NjcsIHRydWV9LAorICAgIHszMDMzMzMzLCBmYWxzZX0sIHszMDUwMDAwLCB0cnVlfSwgezMwNjY2NjcsIGZhbHNlfSwgezMwODMzMzMsIHRydWV9LAorICAgIHszMTAwMDAwLCBmYWxzZX0sIHszMTE2NjY3LCB0cnVlfSwgezMxMzMzMzMsIGZhbHNlfSwgezMxNTAwMDAsIHRydWV9LAorICAgIHszMTY2NjY3LCBmYWxzZX0sIHszMTgzMzMzLCB0cnVlfSwgezMyMDAwMDAsIGZhbHNlfSwgezMyMTY2NjcsIHRydWV9LAorICAgIHszMjMzMzMzLCBmYWxzZX0sIHszMjUwMDAwLCB0cnVlfSwgezMyNjY2NjcsIGZhbHNlfSwgezMyODMzMzMsIHRydWV9LAorfTsKKworc3RhdGljIGNvbnN0IGludCBrTWF4VGVzdEppdHRlclVzID0gMjAwMDsKKy8vIHJldHVybiBvbmUgb2YgMTAwMCwgMCwgLTEwMDAgYXMgaml0dGVyLgorc3RhdGljIGludCBHZXRKaXR0ZXIoc2l6ZV90IGkpIHsKKyAgICByZXR1cm4gKDEgLSAoaSAlIDMpKSAqIChrTWF4VGVzdEppdHRlclVzIC8gMik7Cit9CisKK2NsYXNzIEZyYW1lRHJvcHBlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3B1YmxpYzoKKyAgICBGcmFtZURyb3BwZXJUZXN0KCkgOiBtRnJhbWVEcm9wcGVyKG5ldyBGcmFtZURyb3BwZXIoKSkgeworICAgICAgICBFWFBFQ1RfRVEoT0ssIG1GcmFtZURyb3BwZXItPnNldE1heEZyYW1lUmF0ZSgzMC4wKSk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBSdW5UZXN0KGNvbnN0IFRlc3RGcmFtZSogZnJhbWVzLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICAgICAgaW50IGppdHRlciA9IEdldEppdHRlcihpKTsKKyAgICAgICAgICAgIGludDY0X3QgdGVzdFRpbWVVcyA9IGZyYW1lc1tpXS50aW1lVXMgKyBqaXR0ZXI7CisgICAgICAgICAgICBwcmludGYoInRpbWUgJWxsZCwgdGVzdFRpbWUgJWxsZCwgaml0dGVyICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWZyYW1lc1tpXS50aW1lVXMsIChsb25nIGxvbmcpdGVzdFRpbWVVcywgaml0dGVyKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShmcmFtZXNbaV0uc2hvdWxkRHJvcCwgbUZyYW1lRHJvcHBlci0+c2hvdWxkRHJvcCh0ZXN0VGltZVVzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxGcmFtZURyb3BwZXI+IG1GcmFtZURyb3BwZXI7Cit9OworCitURVNUX0YoRnJhbWVEcm9wcGVyVGVzdCwgVGVzdEludmFsaWRNYXhGcmFtZVJhdGUpIHsKKyAgICBFWFBFQ1RfTkUoT0ssIG1GcmFtZURyb3BwZXItPnNldE1heEZyYW1lUmF0ZSgtMS4wKSk7CisgICAgRVhQRUNUX05FKE9LLCBtRnJhbWVEcm9wcGVyLT5zZXRNYXhGcmFtZVJhdGUoMCkpOworfQorCitURVNUX0YoRnJhbWVEcm9wcGVyVGVzdCwgVGVzdDIwRnBzKSB7CisgICAgUnVuVGVzdCh0ZXN0RnJhbWVzMjBGcHMsIEFSUkFZX1NJWkUodGVzdEZyYW1lczIwRnBzKSk7Cit9CisKK1RFU1RfRihGcmFtZURyb3BwZXJUZXN0LCBUZXN0MzBGcHMpIHsKKyAgICBSdW5UZXN0KHRlc3RGcmFtZXMzMEZwcywgQVJSQVlfU0laRSh0ZXN0RnJhbWVzMzBGcHMpKTsKK30KKworVEVTVF9GKEZyYW1lRHJvcHBlclRlc3QsIFRlc3Q0MEZwcykgeworICAgIFJ1blRlc3QodGVzdEZyYW1lczQwRnBzLCBBUlJBWV9TSVpFKHRlc3RGcmFtZXM0MEZwcykpOworfQorCitURVNUX0YoRnJhbWVEcm9wcGVyVGVzdCwgVGVzdDYwRnBzKSB7CisgICAgUnVuVGVzdCh0ZXN0RnJhbWVzNjBGcHMsIEFSUkFZX1NJWkUodGVzdEZyYW1lczYwRnBzKSk7Cit9CisKK1RFU1RfRihGcmFtZURyb3BwZXJUZXN0LCBUZXN0VmFyaWFibGVGcHMpIHsKKyAgICBSdW5UZXN0KHRlc3RGcmFtZXNWYXJpYWJsZUZwcywgQVJSQVlfU0laRSh0ZXN0RnJhbWVzVmFyaWFibGVGcHMpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwCmluZGV4IDY3ZmYxNDUuLjY0NGI2ZWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAKQEAgLTY0LDkgKzY0LDExIEBACiAgICAgcmV0dXJuIG1PTVggIT0gMCA/IE9LIDogTk9fSU5JVDsKIH0KIAotdm9pZCBIYXJuZXNzOjpvbk1lc3NhZ2UoY29uc3Qgb214X21lc3NhZ2UgJm1zZykgewordm9pZCBIYXJuZXNzOjpvbk1lc3NhZ2VzKGNvbnN0IHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT4gJm1lc3NhZ2VzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBtTWVzc2FnZVF1ZXVlLnB1c2hfYmFjayhtc2cpOworICAgIGZvciAoc3RkOjpsaXN0PG9teF9tZXNzYWdlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtZXNzYWdlcy5jYmVnaW4oKTsgaXQgIT0gbWVzc2FnZXMuY2VuZCgpOyApIHsKKyAgICAgICAgbU1lc3NhZ2VRdWV1ZS5wdXNoX2JhY2soKml0KyspOworICAgIH0KICAgICBtTWVzc2FnZUFkZGVkQ29uZGl0aW9uLnNpZ25hbCgpOwogfQogCkBAIC0xOTMsNyArMTk1LDcgQEAKICAgICAgICAgQ0hFQ0soYnVmZmVyLm1NZW1vcnkgIT0gTlVMTCk7CiAKICAgICAgICAgZXJyID0gbU9NWC0+YWxsb2NhdGVCdWZmZXJXaXRoQmFja3VwKAotICAgICAgICAgICAgICAgIG5vZGUsIHBvcnRJbmRleCwgYnVmZmVyLm1NZW1vcnksICZidWZmZXIubUlEKTsKKyAgICAgICAgICAgICAgICBub2RlLCBwb3J0SW5kZXgsIGJ1ZmZlci5tTWVtb3J5LCAmYnVmZmVyLm1JRCwgYnVmZmVyLm1NZW1vcnktPnNpemUoKSk7CiAgICAgICAgIEVYUEVDVF9TVUNDRVNTKGVyciwgImFsbG9jYXRlQnVmZmVyIik7CiAKICAgICAgICAgYnVmZmVycy0+cHVzaChidWZmZXIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmgKaW5kZXggYmI4ZmQwYy4uMWViZjNhYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5oCkBAIC03NCw3ICs3NCw3IEBACiAKICAgICBzdGF0dXNfdCB0ZXN0QWxsKCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlKGNvbnN0IG9teF9tZXNzYWdlICZtc2cpOworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VzKGNvbnN0IHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT4gJm1lc3NhZ2VzKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkhhcm5lc3MoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAKaW5kZXggYTZiZDgyNC4uYTg2YWI3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAKQEAgLTgyLDcgKzgyLDcgQEAKICAgICAgICAgc2l6ZV90IGluZGV4LAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKICAgICAgICAgYm9vbCBpbmplY3RlZCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBZGRTdHJlYW0sIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBZGRTdHJlYW0sIHRoaXMpOwogICAgIG1zZy0+c2V0SW50MzIoInJ0cC1zb2NrZXQiLCBydHBTb2NrZXQpOwogICAgIG1zZy0+c2V0SW50MzIoInJ0Y3Atc29ja2V0IiwgcnRjcFNvY2tldCk7CiAgICAgbXNnLT5zZXRPYmplY3QoInNlc3Npb24tZGVzYyIsIHNlc3Npb25EZXNjKTsKQEAgLTkzLDcgKzkzLDcgQEAKIH0KIAogdm9pZCBBUlRQQ29ubmVjdGlvbjo6cmVtb3ZlU3RyZWFtKGludCBydHBTb2NrZXQsIGludCBydGNwU29ja2V0KSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbW92ZVN0cmVhbSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbW92ZVN0cmVhbSwgdGhpcyk7CiAgICAgbXNnLT5zZXRJbnQzMigicnRwLXNvY2tldCIsIHJ0cFNvY2tldCk7CiAgICAgbXNnLT5zZXRJbnQzMigicnRjcC1zb2NrZXQiLCBydGNwU29ja2V0KTsKICAgICBtc2ctPnBvc3QoKTsKQEAgLTIzMyw3ICsyMzMsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBvbGxTdHJlYW1zLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UG9sbFN0cmVhbXMsIHRoaXMpOwogICAgIG1zZy0+cG9zdCgpOwogCiAgICAgbVBvbGxFdmVudFBlbmRpbmcgPSB0cnVlOwpAQCAtNjM5LDcgKzYzOSw3IEBACiB9CiAKIHZvaWQgQVJUUENvbm5lY3Rpb246OmluamVjdFBhY2tldChpbnQgaW5kZXgsIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0SW5qZWN0UGFja2V0LCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0SW5qZWN0UGFja2V0LCB0aGlzKTsKICAgICBtc2ctPnNldEludDMyKCJpbmRleCIsIGluZGV4KTsKICAgICBtc2ctPnNldEJ1ZmZlcigiYnVmZmVyIiwgYnVmZmVyKTsKICAgICBtc2ctPnBvc3QoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNlc3Npb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU2Vzc2lvbi5jcHAKaW5kZXggYmE0ZTMzYy4uZTVhY2IwNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU2Vzc2lvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU2Vzc2lvbi5jcHAKQEAgLTgyLDcgKzgyLDcgQEAKICAgICAgICAgaW5mby0+bVJUUFNvY2tldCA9IHJ0cFNvY2tldDsKICAgICAgICAgaW5mby0+bVJUQ1BTb2NrZXQgPSBydGNwU29ja2V0OwogCi0gICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBY2Nlc3NVbml0Q29tcGxldGUsIGlkKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0QWNjZXNzVW5pdENvbXBsZXRlLCB0aGlzKTsKICAgICAgICAgbm90aWZ5LT5zZXRTaXplKCJ0cmFjay1pbmRleCIsIG1UcmFja3Muc2l6ZSgpIC0gMSk7CiAKICAgICAgICAgbVJUUENvbm4tPmFkZFN0cmVhbSgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuY3BwCmluZGV4IGUxNjA3YmYuLjU2YzRhYTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcApAQCAtMTQ2LDcgKzE0Niw3IEBACiAgICAgICAgIFRSRVNQQVNTKCk7CiAgICAgfQogCi0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCBtUmVmbGVjdG9yLT5pZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIG1SZWZsZWN0b3IpKS0+cG9zdCgpOwogCiAgICAgd2hpbGUgKCEobUZsYWdzICYga0ZsYWdTdGFydGVkKSkgewogICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOwpAQCAtMTYxLDcgKzE2MSw3IEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgbVJlZmxlY3Rvci0+aWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0b3AsIG1SZWZsZWN0b3IpKS0+cG9zdCgpOwogCiAgICAgd2hpbGUgKG1GbGFncyAmIGtGbGFnU3RhcnRlZCkgewogICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOwpAQCAtMjEzLDggKzIxMyw4IEBACiAgICAgICAgICAgICAgICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlYWQsIG1SZWZsZWN0b3ItPmlkKCkpKS0+cG9zdCgpOwotICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFNlbmRTUiwgbVJlZmxlY3Rvci0+aWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVhZCwgbVJlZmxlY3RvcikpLT5wb3N0KCk7CisgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0U2VuZFNSLCBtUmVmbGVjdG9yKSktPnBvc3QoKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmgKaW5kZXggZmRjOGQyMy4uYmU4YmMxMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmgKQEAgLTMyLDcgKzMyLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFCdWZmZXI7Ci1zdHJ1Y3QgTWVkaWFCdWZmZXI7CitjbGFzcyBNZWRpYUJ1ZmZlcjsKIAogc3RydWN0IEFSVFBXcml0ZXIgOiBwdWJsaWMgTWVkaWFXcml0ZXIgewogICAgIEFSVFBXcml0ZXIoaW50IGZkKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcAppbmRleCA2MGIzYWFmLi44NTVmZmRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCkBAIC02OCwyOCArNjgsMjggQEAKIH0KIAogdm9pZCBBUlRTUENvbm5lY3Rpb246OmNvbm5lY3QoY29uc3QgY2hhciAqdXJsLCBjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbm5lY3QsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb25uZWN0LCB0aGlzKTsKICAgICBtc2ctPnNldFN0cmluZygidXJsIiwgdXJsKTsKICAgICBtc2ctPnNldE1lc3NhZ2UoInJlcGx5IiwgcmVwbHkpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCiB2b2lkIEFSVFNQQ29ubmVjdGlvbjo6ZGlzY29ubmVjdChjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdERpc2Nvbm5lY3QsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREaXNjb25uZWN0LCB0aGlzKTsKICAgICBtc2ctPnNldE1lc3NhZ2UoInJlcGx5IiwgcmVwbHkpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCiB2b2lkIEFSVFNQQ29ubmVjdGlvbjo6c2VuZFJlcXVlc3QoCiAgICAgICAgIGNvbnN0IGNoYXIgKnJlcXVlc3QsIGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZFJlcXVlc3QsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZW5kUmVxdWVzdCwgdGhpcyk7CiAgICAgbXNnLT5zZXRTdHJpbmcoInJlcXVlc3QiLCByZXF1ZXN0KTsKICAgICBtc2ctPnNldE1lc3NhZ2UoInJlcGx5IiwgcmVwbHkpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCiB2b2lkIEFSVFNQQ29ubmVjdGlvbjo6b2JzZXJ2ZUJpbmFyeURhdGEoY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPYnNlcnZlQmluYXJ5RGF0YSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdE9ic2VydmVCaW5hcnlEYXRhLCB0aGlzKTsKICAgICBtc2ctPnNldE1lc3NhZ2UoInJlcGx5IiwgcmVwbHkpOwogICAgIG1zZy0+cG9zdCgpOwogfQpAQCAtMjg2LDcgKzI4Niw3IEBACiAKICAgICBpZiAoZXJyIDwgMCkgewogICAgICAgICBpZiAoZXJybm8gPT0gRUlOUFJPR1JFU1MpIHsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb21wbGV0ZUNvbm5lY3Rpb24sIGlkKCkpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbXBsZXRlQ29ubmVjdGlvbiwgdGhpcyk7CiAgICAgICAgICAgICBtc2ctPnNldE1lc3NhZ2UoInJlcGx5IiwgcmVwbHkpOwogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiY29ubmVjdGlvbi1pZCIsIG1Db25uZWN0aW9uSUQpOwogICAgICAgICAgICAgbXNnLT5wb3N0KCk7CkBAIC01MjMsNyArNTIzLDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWNlaXZlUmVzcG9uc2UsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWNlaXZlUmVzcG9uc2UsIHRoaXMpOwogICAgIG1zZy0+cG9zdCgpOwogCiAgICAgbVJlY2VpdmVSZXNwb25zZUV2ZW50UGVuZGluZyA9IHRydWU7CkBAIC03NDYsNyArNzQ2LDcgQEAKICAgICAgICAgICAgIEFTdHJpbmcgcmVxdWVzdDsKICAgICAgICAgICAgIENIRUNLKHJlcGx5LT5maW5kU3RyaW5nKCJvcmlnaW5hbC1yZXF1ZXN0IiwgJnJlcXVlc3QpKTsKIAotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbmRSZXF1ZXN0LCBpZCgpKTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZW5kUmVxdWVzdCwgdGhpcyk7CiAgICAgICAgICAgICBtc2ctPnNldE1lc3NhZ2UoInJlcGx5IiwgcmVwbHkpOwogICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoInJlcXVlc3QiLCByZXF1ZXN0LmNfc3RyKCksIHJlcXVlc3Quc2l6ZSgpKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLm1rCmluZGV4IDlmZWRiNzEuLmM1ZThjMzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQubWsKQEAgLTMxLDcgKzMxLDggQEAKICAgICBMT0NBTF9DRkxBR1MgKz0gLVduby1wc2FiaQogZW5kaWYKIAotTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCiAKIExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9ICQoTE9DQUxfUEFUSCkvQW5kcm9pZC5tawogCkBAIC01NCw3ICs1NSw4IEBACiAJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCiAJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCmluZGV4IDNiZjQ4OWIuLjBkMGJhZjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaApAQCAtOTgsNiArOTgsNyBAQAogICAgIGVudW0gewogICAgICAgICBrV2hhdENvbm5lY3RlZCAgICAgICAgICAgICAgICAgID0gJ2Nvbm4nLAogICAgICAgICBrV2hhdERpc2Nvbm5lY3RlZCAgICAgICAgICAgICAgID0gJ2Rpc2MnLAorICAgICAgICBrV2hhdFNlZWtQYXVzZWQgICAgICAgICAgICAgICAgID0gJ3NwYXUnLAogICAgICAgICBrV2hhdFNlZWtEb25lICAgICAgICAgICAgICAgICAgID0gJ3Nkb24nLAogCiAgICAgICAgIGtXaGF0QWNjZXNzVW5pdCAgICAgICAgICAgICAgICAgPSAnYWNjVScsCkBAIC0xNjksMTAgKzE3MCwxMCBAQAogICAgICAgICBsb29wZXIoKS0+cmVnaXN0ZXJIYW5kbGVyKG1Db25uKTsKICAgICAgICAgKDEgPyBtTmV0TG9vcGVyIDogbG9vcGVyKCkpLT5yZWdpc3RlckhhbmRsZXIobVJUUENvbm4pOwogCi0gICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2UoJ2JpbnknLCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZSgnYmlueScsIHRoaXMpOwogICAgICAgICBtQ29ubi0+b2JzZXJ2ZUJpbmFyeURhdGEobm90aWZ5KTsKIAotICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Nvbm4nLCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdjb25uJywgdGhpcyk7CiAgICAgICAgIG1Db25uLT5jb25uZWN0KG1PcmlnaW5hbFNlc3Npb25VUkwuY19zdHIoKSwgcmVwbHkpOwogICAgIH0KIApAQCAtMTgwLDEwICsxODEsMTAgQEAKICAgICAgICAgbG9vcGVyKCktPnJlZ2lzdGVySGFuZGxlcihtQ29ubik7CiAgICAgICAgICgxID8gbU5ldExvb3BlciA6IGxvb3BlcigpKS0+cmVnaXN0ZXJIYW5kbGVyKG1SVFBDb25uKTsKIAotICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKCdiaW55JywgaWQoKSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2UoJ2JpbnknLCB0aGlzKTsKICAgICAgICAgbUNvbm4tPm9ic2VydmVCaW5hcnlEYXRhKG5vdGlmeSk7CiAKLSAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdzZHBsJywgaWQoKSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnc2RwbCcsIHRoaXMpOwogICAgICAgICByZXBseS0+c2V0T2JqZWN0KCJkZXNjcmlwdGlvbiIsIGRlc2MpOwogICAgICAgICBtQ29ubi0+Y29ubmVjdChtT3JpZ2luYWxTZXNzaW9uVVJMLmNfc3RyKCksIHJlcGx5KTsKICAgICB9CkBAIC0yMTAsMjkgKzIxMSwzNSBAQAogICAgIH0KIAogICAgIHZvaWQgZGlzY29ubmVjdCgpIHsKLSAgICAgICAgKG5ldyBBTWVzc2FnZSgnYWJvcicsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAobmV3IEFNZXNzYWdlKCdhYm9yJywgdGhpcykpLT5wb3N0KCk7CiAgICAgfQogCiAgICAgdm9pZCBzZWVrKGludDY0X3QgdGltZVVzKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoJ3NlZWsnLCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgnc2VlaycsIHRoaXMpOwogICAgICAgICBtc2ctPnNldEludDY0KCJ0aW1lIiwgdGltZVVzKTsKICAgICAgICAgbVBhdXNlR2VuZXJhdGlvbisrOwogICAgICAgICBtc2ctPnBvc3QoKTsKICAgICB9CiAKKyAgICB2b2lkIGNvbnRpbnVlU2Vla0FmdGVyUGF1c2UoaW50NjRfdCB0aW1lVXMpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgnc2VlMScsIHRoaXMpOworICAgICAgICBtc2ctPnNldEludDY0KCJ0aW1lIiwgdGltZVVzKTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQorCiAgICAgYm9vbCBpc1NlZWthYmxlKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVNlZWthYmxlOwogICAgIH0KIAogICAgIHZvaWQgcGF1c2UoKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoJ3BhdXMnLCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgncGF1cycsIHRoaXMpOwogICAgICAgICBtUGF1c2VHZW5lcmF0aW9uKys7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoInBhdXNlY2hlY2siLCBtUGF1c2VHZW5lcmF0aW9uKTsKICAgICAgICAgbXNnLT5wb3N0KGtQYXVzZURlbGF5VXMpOwogICAgIH0KIAogICAgIHZvaWQgcmVzdW1lKCkgewotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCdyZXN1JywgaWQoKSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoJ3Jlc3UnLCB0aGlzKTsKICAgICAgICAgbVBhdXNlR2VuZXJhdGlvbisrOwogICAgICAgICBtc2ctPnBvc3QoKTsKICAgICB9CkBAIC00NTQsMTAgKzQ2MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiQWNjZXB0OiBhcHBsaWNhdGlvbi9zZHBcclxuIik7CiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CiAKLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdkZXNjJywgaWQoKSk7CisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnZGVzYycsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnZGlzYycsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdkaXNjJywgdGhpcykpLT5wb3N0KCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNDY4LDEwICs0NzUsMTAgQEAKIAogICAgICAgICAgICAgICAgIGludDMyX3QgcmVjb25uZWN0OwogICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigicmVjb25uZWN0IiwgJnJlY29ubmVjdCkgJiYgcmVjb25uZWN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnY29ubicsIGlkKCkpOworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Nvbm4nLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgbUNvbm4tPmNvbm5lY3QobU9yaWdpbmFsU2Vzc2lvblVSTC5jX3N0cigpLCByZXBseSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgncXVpdCcsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgdGhpcykpLT5wb3N0KCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNTE0LDcgKzUyMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0koInJld3JpdHRlbiBzZXNzaW9uIHVybDogJyVzJyIsIG1TZXNzaW9uVVJMLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Nvbm4nLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnY29ubicsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm4tPmNvbm5lY3QobU9yaWdpbmFsU2Vzc2lvblVSTC5jX3N0cigpLCByZXBseSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTg2LDcgKzU5Myw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Rpc2MnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdkaXNjJywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgIG1Db25uLT5kaXNjb25uZWN0KHJlcGx5KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC02MzEsNyArNjM4LDcgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnZGlzYycsIGlkKCkpOworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Rpc2MnLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgbUNvbm4tPmRpc2Nvbm5lY3QocmVwbHkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTY1MSw3ICs2NTgsNyBAQAogICAgICAgICAgICAgICAgIGludDMyX3QgcmVzdWx0OwogICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bHQiLCAmcmVzdWx0KSk7CiAKLSAgICAgICAgICAgICAgICBBTE9HSSgiU0VUVVAoJWQpIGNvbXBsZXRlZCB3aXRoIHJlc3VsdCAlZCAoJXMpIiwKKyAgICAgICAgICAgICAgICBBTE9HSSgiU0VUVVAoJXp1KSBjb21wbGV0ZWQgd2l0aCByZXN1bHQgJWQgKCVzKSIsCiAgICAgICAgICAgICAgICAgICAgICBpbmRleCwgcmVzdWx0LCBzdHJlcnJvcigtcmVzdWx0KSk7CiAKICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IE9LKSB7CkBAIC03MDMsNyArNzEwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklELmVyYXNlKGksIG1TZXNzaW9uSUQuc2l6ZSgpIC0gaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2UoJ2FjY3UnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2UoJ2FjY3UnLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U2l6ZSgidHJhY2staW5kZXgiLCB0cmFja0luZGV4KTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHJlc3BvbnNlLT5tSGVhZGVycy5pbmRleE9mS2V5KCJ0cmFuc3BvcnQiKTsKQEAgLTc2OSwxMCArNzc2LDEwIEBACiAKICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKIAotICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3BsYXknLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdwbGF5JywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgIG1Db25uLT5zZW5kUmVxdWVzdChyZXF1ZXN0LmNfc3RyKCksIHJlcGx5KTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Rpc2MnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdkaXNjJywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgIG1Db25uLT5kaXNjb25uZWN0KHJlcGx5KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC03OTcsNyArODA0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlUGxheVJlc3BvbnNlKHJlc3BvbnNlKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHRpbWVvdXQgPSBuZXcgQU1lc3NhZ2UoJ3Rpb3UnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiB0aW1lb3V0ID0gbmV3IEFNZXNzYWdlKCd0aW91JywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hlY2tUaW1lb3V0R2VuZXJhdGlvbisrOwogICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dC0+c2V0SW50MzIoInRpb3VjaGVjayIsIG1DaGVja1RpbWVvdXRHZW5lcmF0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQtPnBvc3Qoa1N0YXJ0dXBUaW1lb3V0VXMpOwpAQCAtODA1LDcgKzgxMiw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Rpc2MnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdkaXNjJywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgIG1Db25uLT5kaXNjb25uZWN0KHJlcGx5KTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTgzMSw3ICs4MzgsNyBAQAogICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKIAotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnb3B0cycsIGlkKCkpOworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnb3B0cycsIHRoaXMpOwogICAgICAgICAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1LZWVwQWxpdmVHZW5lcmF0aW9uKTsKICAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC04OTQsNyArOTAxLDcgQEAKICAgICAgICAgICAgICAgICBtUGF1c2luZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIG1TZWVrYWJsZSA9IHRydWU7CiAKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3RlYXInLCBpZCgpKTsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3RlYXInLCB0aGlzKTsKIAogICAgICAgICAgICAgICAgIGludDMyX3QgcmVjb25uZWN0OwogICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigicmVjb25uZWN0IiwgJnJlY29ubmVjdCkgJiYgcmVjb25uZWN0KSB7CkBAIC05MjYsNyArOTMzLDcgQEAKICAgICAgICAgICAgICAgICBBTE9HSSgiVEVBUkRPV04gY29tcGxldGVkIHdpdGggcmVzdWx0ICVkICglcykiLAogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBzdHJlcnJvcigtcmVzdWx0KSk7CiAKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Rpc2MnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Rpc2MnLCB0aGlzKTsKIAogICAgICAgICAgICAgICAgIGludDMyX3QgcmVjb25uZWN0OwogICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigicmVjb25uZWN0IiwgJnJlY29ubmVjdCkgJiYgcmVjb25uZWN0KSB7CkBAIC05NTgsNyArOTY1LDcgQEAKICAgICAgICAgICAgICAgICBpZiAobU51bUFjY2Vzc1VuaXRzUmVjZWl2ZWQgPT0gMCkgewogI2lmIDEKICAgICAgICAgICAgICAgICAgICAgQUxPR0koInN0cmVhbSBlbmRlZD8gYWJvcnRpbmcuIik7Ci0gICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ2Fib3InLCBpZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnYWJvcicsIHRoaXMpKS0+cG9zdCgpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICNlbHNlCiAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJoYXZlbid0IHNlZW4gYW4gQVUgaW4gYSBsb29vbmcgdGltZS4iKTsKQEAgLTEwMTIsNyArMTAxOSw3IEBACiAKICAgICAgICAgICAgICAgICBpbnQzMl90IGVvczsKICAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImVvcyIsICZlb3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dJKCJyZWNlaXZlZCBCWUUgb24gdHJhY2sgaW5kZXggJWQiLCB0cmFja0luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koInJlY2VpdmVkIEJZRSBvbiB0cmFjayBpbmRleCAlenUiLCB0cmFja0luZGV4KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtQWxsVHJhY2tzSGF2ZVRpbWUgJiYgZGF0YVJlY2VpdmVkT25BbGxDaGFubmVscygpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgiTm8gdGltZSBlc3RhYmxpc2hlZCA9PiBmYWtlIGV4aXN0aW5nIGRhdGEiKTsKIApAQCAtMTA3Nyw3ICsxMDg0LDcgQEAKIAogICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CiAKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3BhdTInLCBpZCgpKTsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3BhdTInLCB0aGlzKTsKICAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xMTE0LDcgKzExMjEsNyBAQAogCiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKIAotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgncmVzMicsIGlkKCkpOworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgncmVzMicsIHRoaXMpOwogICAgICAgICAgICAgICAgIG1Db25uLT5zZW5kUmVxdWVzdChyZXF1ZXN0LmNfc3RyKCksIHJlcGx5KTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTExNDMsNyArMTE1MCw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBvc3QgbmV3IHRpbWVvdXQgaW4gb3JkZXIgdG8gbWFrZSBzdXJlIHRvIHVzZQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFrZSB0aW1lc3RhbXBzIGlmIG5vIG5ldyBTZW5kZXIgUmVwb3J0cyBhcnJpdmUKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiB0aW1lb3V0ID0gbmV3IEFNZXNzYWdlKCd0aW91JywgaWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gdGltZW91dCA9IG5ldyBBTWVzc2FnZSgndGlvdScsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgbUNoZWNrVGltZW91dEdlbmVyYXRpb24rKzsKICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQtPnNldEludDMyKCJ0aW91Y2hlY2siLCBtQ2hlY2tUaW1lb3V0R2VuZXJhdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LT5wb3N0KGtTdGFydHVwVGltZW91dFVzKTsKQEAgLTExNTIsNyArMTE1OSw3IEBACiAKICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJyZXN1bWUgZmFpbGVkLCBhYm9ydGluZy4iKTsKLSAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnYWJvcicsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdhYm9yJywgdGhpcykpLT5wb3N0KCk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgbVBhdXNpbmcgPSBmYWxzZTsKQEAgLTExODAsNyArMTE4Nyw3IEBACiAgICAgICAgICAgICAgICAgbUNoZWNrUGVuZGluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgKyttQ2hlY2tHZW5lcmF0aW9uOwogCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdzZWUxJywgaWQoKSk7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdzZWUwJywgdGhpcyk7CiAgICAgICAgICAgICAgICAgcmVwbHktPnNldEludDY0KCJ0aW1lIiwgdGltZVVzKTsKIAogICAgICAgICAgICAgICAgIGlmIChtUGF1c2luZykgewpAQCAtMTIwMyw5ICsxMjEwLDI2IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNhc2UgJ3NlZTEnOgorICAgICAgICAgICAgY2FzZSAnc2VlMCc6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLy8gU2Vzc2lvbiBpcyBwYXVzZWQgbm93LgorICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworICAgICAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKCJyZXN1bHQiLCAmZXJyKTsKKworICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lIiwgJnRpbWVVcykpOworCisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFNlZWtQYXVzZWQpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQ2NCgidGltZSIsIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAnc2VlMSc6CisgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQoaSk7CiAKQEAgLTEyMjEsNyArMTI0NSw3IEBACiAKICAgICAgICAgICAgICAgICAvLyBTdGFydCBuZXcgdGltZW91dGdlbmVyYXRpb24gdG8gYXZvaWQgZ2V0dGluZyB0aW1lb3V0CiAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIFBMQVkgcmVzcG9uc2UgYXJyaXZlCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHRpbWVvdXQgPSBuZXcgQU1lc3NhZ2UoJ3Rpb3UnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gdGltZW91dCA9IG5ldyBBTWVzc2FnZSgndGlvdScsIHRoaXMpOwogICAgICAgICAgICAgICAgIG1DaGVja1RpbWVvdXRHZW5lcmF0aW9uKys7CiAgICAgICAgICAgICAgICAgdGltZW91dC0+c2V0SW50MzIoInRpb3VjaGVjayIsIG1DaGVja1RpbWVvdXRHZW5lcmF0aW9uKTsKICAgICAgICAgICAgICAgICB0aW1lb3V0LT5wb3N0KGtTdGFydHVwVGltZW91dFVzKTsKQEAgLTEyNDMsNyArMTI2Nyw3IEBACiAKICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwogCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdzZWUyJywgaWQoKSk7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdzZWUyJywgdGhpcyk7CiAgICAgICAgICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTI3Nyw3ICsxMzAxLDcgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gUG9zdCBuZXcgdGltZW91dCBpbiBvcmRlciB0byBtYWtlIHN1cmUgdG8gdXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWtlIHRpbWVzdGFtcHMgaWYgbm8gbmV3IFNlbmRlciBSZXBvcnRzIGFycml2ZQotICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHRpbWVvdXQgPSBuZXcgQU1lc3NhZ2UoJ3Rpb3UnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiB0aW1lb3V0ID0gbmV3IEFNZXNzYWdlKCd0aW91JywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hlY2tUaW1lb3V0R2VuZXJhdGlvbisrOwogICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dC0+c2V0SW50MzIoInRpb3VjaGVjayIsIG1DaGVja1RpbWVvdXRHZW5lcmF0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQtPnBvc3Qoa1N0YXJ0dXBUaW1lb3V0VXMpOwpAQCAtMTI5Myw3ICsxMzE3LDcgQEAKIAogICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoInNlZWsgZmFpbGVkLCBhYm9ydGluZy4iKTsKLSAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnYWJvcicsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdhYm9yJywgdGhpcykpLT5wb3N0KCk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgbVBhdXNpbmcgPSBmYWxzZTsKQEAgLTEzNDMsMTIgKzEzNjcsMTIgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgbVRyeVRDUEludGVybGVhdmluZyA9IHRydWU7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoJ2Fib3InLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoJ2Fib3InLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoInJlY29ubmVjdCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgbXNnLT5wb3N0KCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiTmV2ZXIgcmVjZWl2ZWQgYW55IGRhdGEsIGRpc2Nvbm5lY3RpbmcuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdhYm9yJywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdhYm9yJywgdGhpcykpLT5wb3N0KCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAoIW1BbGxUcmFja3NIYXZlVGltZSkgewpAQCAtMTM2OSw3ICsxMzkzLDcgQEAKICAgICB9CiAKICAgICB2b2lkIHBvc3RLZWVwQWxpdmUoKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoJ2FsaXYnLCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgnYWxpdicsIHRoaXMpOwogICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUtlZXBBbGl2ZUdlbmVyYXRpb24pOwogICAgICAgICBtc2ctPnBvc3QoKG1LZWVwQWxpdmVUaW1lb3V0VXMgKiA5KSAvIDEwKTsKICAgICB9CkBAIC0xMzgwLDcgKzE0MDQsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgbUNoZWNrUGVuZGluZyA9IHRydWU7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBjaGVjayA9IG5ldyBBTWVzc2FnZSgnY2hlaycsIGlkKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gY2hlY2sgPSBuZXcgQU1lc3NhZ2UoJ2NoZWsnLCB0aGlzKTsKICAgICAgICAgY2hlY2stPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUNoZWNrR2VuZXJhdGlvbik7CiAgICAgICAgIGNoZWNrLT5wb3N0KGtBY2Nlc3NVbml0VGltZW91dFVzKTsKICAgICB9CkBAIC0xNTY0LDkgKzE1ODgsOSBAQAogICAgICAgICAgICAgbmV3IEFQYWNrZXRTb3VyY2UobVNlc3Npb25EZXNjLCBpbmRleCk7CiAKICAgICAgICAgaWYgKHNvdXJjZS0+aW5pdENoZWNrKCkgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dXKCJVbnN1cHBvcnRlZCBmb3JtYXQuIElnbm9yaW5nIHRyYWNrICMlZC4iLCBpbmRleCk7CisgICAgICAgICAgICBBTE9HVygiVW5zdXBwb3J0ZWQgZm9ybWF0LiBJZ25vcmluZyB0cmFjayAjJXp1LiIsIGluZGV4KTsKIAotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdzZXR1JywgaWQoKSk7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3NldHUnLCB0aGlzKTsKICAgICAgICAgICAgIHJlcGx5LT5zZXRTaXplKCJpbmRleCIsIGluZGV4KTsKICAgICAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigicmVzdWx0IiwgRVJST1JfVU5TVVBQT1JURUQpOwogICAgICAgICAgICAgcmVwbHktPnBvc3QoKTsKQEAgLTE2MDYsNyArMTYzMCw3IEBACiAgICAgICAgIGluZm8tPm1UaW1lU2NhbGUgPSB0aW1lc2NhbGU7CiAgICAgICAgIGluZm8tPm1FT1NSZWNlaXZlZCA9IGZhbHNlOwogCi0gICAgICAgIEFMT0dWKCJ0cmFjayAjJWQgVVJMPSVzIiwgbVRyYWNrcy5zaXplKCksIHRyYWNrVVJMLmNfc3RyKCkpOworICAgICAgICBBTE9HVigidHJhY2sgIyV6dSBVUkw9JXMiLCBtVHJhY2tzLnNpemUoKSwgdHJhY2tVUkwuY19zdHIoKSk7CiAKICAgICAgICAgQVN0cmluZyByZXF1ZXN0ID0gIlNFVFVQICI7CiAgICAgICAgIHJlcXVlc3QuYXBwZW5kKHRyYWNrVVJMKTsKQEAgLTE2NTIsNyArMTY3Niw3IEBACiAKICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKIAotICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3NldHUnLCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdzZXR1JywgdGhpcyk7CiAgICAgICAgIHJlcGx5LT5zZXRTaXplKCJpbmRleCIsIGluZGV4KTsKICAgICAgICAgcmVwbHktPnNldFNpemUoInRyYWNrLWluZGV4IiwgbVRyYWNrcy5zaXplKCkgLSAxKTsKICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOwpAQCAtMTY3MywyMSArMTY5NywxMSBAQAogICAgICAgICB9CiAKICAgICAgICAgc2l6ZV90IG4gPSBzdHJsZW4oYmFzZVVSTCk7Ci0gICAgICAgIGlmIChiYXNlVVJMW24gLSAxXSA9PSAnLycpIHsKLSAgICAgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCk7Ci0gICAgICAgICAgICBvdXQtPmFwcGVuZCh1cmwpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uc3QgY2hhciAqc2xhc2hQb3MgPSBzdHJyY2hyKGJhc2VVUkwsICcvJyk7Ci0KLSAgICAgICAgICAgIGlmIChzbGFzaFBvcyA+ICZiYXNlVVJMWzZdKSB7Ci0gICAgICAgICAgICAgICAgb3V0LT5zZXRUbyhiYXNlVVJMLCBzbGFzaFBvcyAtIGJhc2VVUkwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvdXQtPnNldFRvKGJhc2VVUkwpOwotICAgICAgICAgICAgfQotCisgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCk7CisgICAgICAgIGlmIChiYXNlVVJMW24gLSAxXSAhPSAnLycpIHsKICAgICAgICAgICAgIG91dC0+YXBwZW5kKCIvIik7Ci0gICAgICAgICAgICBvdXQtPmFwcGVuZCh1cmwpOwogICAgICAgICB9CisgICAgICAgIG91dC0+YXBwZW5kKHVybCk7CiAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtMTczMSw4ICsxNzQ1LDggQEAKICAgICB9CiAKICAgICB2b2lkIG9uVGltZVVwZGF0ZShpbnQzMl90IHRyYWNrSW5kZXgsIHVpbnQzMl90IHJ0cFRpbWUsIHVpbnQ2NF90IG50cFRpbWUpIHsKLSAgICAgICAgQUxPR1YoIm9uVGltZVVwZGF0ZSB0cmFjayAlZCwgcnRwVGltZSA9IDB4JTA4eCwgbnRwVGltZSA9IDB4JTAxNmxseCIsCi0gICAgICAgICAgICAgdHJhY2tJbmRleCwgcnRwVGltZSwgbnRwVGltZSk7CisgICAgICAgIEFMT0dWKCJvblRpbWVVcGRhdGUgdHJhY2sgJWQsIHJ0cFRpbWUgPSAweCUwOHgsIG50cFRpbWUgPSAlIzAxNmxseCIsCisgICAgICAgICAgICAgdHJhY2tJbmRleCwgcnRwVGltZSwgKGxvbmcgbG9uZyludHBUaW1lKTsKIAogICAgICAgICBpbnQ2NF90IG50cFRpbWVVcyA9IChpbnQ2NF90KShudHBUaW1lICogMUU2IC8gKDFsbCA8PCAzMikpOwogCkBAIC0xNzQ3LDcgKzE3NjEsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFtQWxsVHJhY2tzSGF2ZVRpbWUpIHsKLSAgICAgICAgICAgIGJvb2wgYWxsVHJhY2tzSGF2ZVRpbWUgPSB0cnVlOworICAgICAgICAgICAgYm9vbCBhbGxUcmFja3NIYXZlVGltZSA9IChtVHJhY2tzLnNpemUoKSA+IDApOwogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgICAgICAgVHJhY2tJbmZvICp0cmFjayA9ICZtVHJhY2tzLmVkaXRJdGVtQXQoaSk7CiAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tTlRQQW5jaG9yVXMgPCAwKSB7CkBAIC0xODUxLDggKzE4NjUsOCBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgQUxPR1YoInRyYWNrICVkIHJ0cFRpbWU9JWQgbWVkaWFUaW1lVXMgPSAlbGxkIHVzICglLjJmIHNlY3MpIiwKLSAgICAgICAgICAgICB0cmFja0luZGV4LCBydHBUaW1lLCBtZWRpYVRpbWVVcywgbWVkaWFUaW1lVXMgLyAxRTYpOworICAgICAgICBBTE9HVigidHJhY2sgJWQgcnRwVGltZT0ldSBtZWRpYVRpbWVVcyA9ICVsbGQgdXMgKCUuMmYgc2VjcykiLAorICAgICAgICAgICAgIHRyYWNrSW5kZXgsIHJ0cFRpbWUsIChsb25nIGxvbmcpbWVkaWFUaW1lVXMsIG1lZGlhVGltZVVzIC8gMUU2KTsKIAogICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCBtZWRpYVRpbWVVcyk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlUcmFuc21pdHRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeVRyYW5zbWl0dGVyLmgKaW5kZXggMDA5YTNiMS4uMzY5ZjI3NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeVRyYW5zbWl0dGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeVRyYW5zbWl0dGVyLmgKQEAgLTEwMCw3ICsxMDAsNyBAQAogICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpcyk7CiAgICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtQ29ubik7CiAKLSAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdjb25uJywgaWQoKSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnY29ubicsIHRoaXMpOwogICAgICAgICBtQ29ubi0+Y29ubmVjdChtU2VydmVyVVJMLmNfc3RyKCksIHJlcGx5KTsKIAogI2lmZGVmIEFORFJPSUQKQEAgLTIyOSw3ICsyMjksNyBAQAogICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwogICAgICAgICByZXF1ZXN0LmFwcGVuZChzZHApOwogCi0gICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnYW5ubycsIGlkKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Fubm8nLCB0aGlzKTsKICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOwogICAgIH0KIApAQCAtMzUwLDcgKzM1MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICA8PCByZXN1bHQgPDwgIiAoIiA8PCBzdHJlcnJvcigtcmVzdWx0KSA8PCAiKSI7CiAKICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3F1aXQnLCBpZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgncXVpdCcsIHRoaXMpKS0+cG9zdCgpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTM4MSw3ICszODEsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UtPm1TdGF0dXNDb2RlID09IDQwMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BdXRoVHlwZSAhPSBOT05FKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJGQUlMRUQgdG8gYXV0aGVudGljYXRlIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgncXVpdCcsIHRoaXMpKS0+cG9zdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC0zOTEsMTQgKzM5MSwxNCBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT0sgfHwgcmVzcG9uc2UtPm1TdGF0dXNDb2RlICE9IDIwMCkgewotICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3F1aXQnLCB0aGlzKSktPnBvc3QoKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgdW5zaWduZWQgcnRwUG9ydDsKICAgICAgICAgICAgICAgICBBUlRQQ29ubmVjdGlvbjo6TWFrZVBvcnRQYWlyKCZtUlRQU29ja2V0LCAmbVJUQ1BTb2NrZXQsICZydHBQb3J0KTsKIAotICAgICAgICAgICAgICAgIC8vIChuZXcgQU1lc3NhZ2UoJ3BvbGwnLCBpZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAvLyAobmV3IEFNZXNzYWdlKCdwb2xsJywgdGhpcykpLT5wb3N0KCk7CiAKICAgICAgICAgICAgICAgICBBU3RyaW5nIHJlcXVlc3Q7CiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlNFVFVQICIpOwpAQCAtNDE0LDcgKzQxNCw3IEBACiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIjttb2RlPXJlY29yZFxyXG4iKTsKICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwogCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdzZXR1JywgaWQoKSk7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdzZXR1JywgdGhpcyk7CiAgICAgICAgICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNDY4LDcgKzQ2OCw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSyB8fCByZXNwb25zZS0+bVN0YXR1c0NvZGUgIT0gMjAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3F1aXQnLCBpZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgncXVpdCcsIHRoaXMpKS0+cG9zdCgpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTUzNSw3ICs1MzUsNyBAQAogICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKIAotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgncmVjbycsIGlkKCkpOworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgncmVjbycsIHRoaXMpOwogICAgICAgICAgICAgICAgIG1Db25uLT5zZW5kUmVxdWVzdChyZXF1ZXN0LmNfc3RyKCksIHJlcGx5KTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTU1OCwxMyArNTU4LDEzIEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3F1aXQnLCB0aGlzKSktPnBvc3QoKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnbW9yZScsIGlkKCkpKS0+cG9zdCgpOwotICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3NyICAnLCBpZCgpKSktPnBvc3QoKTsKLSAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdhbGl2JywgaWQoKSkpLT5wb3N0KDMwMDAwMDAwbGwpOworICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ21vcmUnLCB0aGlzKSktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdzciAgJywgdGhpcykpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnYWxpdicsIHRoaXMpKS0+cG9zdCgzMDAwMDAwMGxsKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtNTg2LDcgKzU4Niw3IEBACiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwogCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdvcHRzJywgaWQoKSk7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdvcHRzJywgdGhpcyk7CiAgICAgICAgICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNjAzLDcgKzYwMyw3IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ2FsaXYnLCBpZCgpKSktPnBvc3QoMzAwMDAwMDBsbCk7CisgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnYWxpdicsIHRoaXMpKS0+cG9zdCgzMDAwMDAwMGxsKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtNzAyLDcgKzcwMiw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CiAKLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdwYXVzJywgaWQoKSk7CisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgncGF1cycsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNzUzLDcgKzc1Myw3IEBACiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwogCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCd0ZWFyJywgaWQoKSk7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCd0ZWFyJywgdGhpcyk7CiAgICAgICAgICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNzc1LDcgKzc3NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3BvbnNlICE9IE5VTEwpOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3F1aXQnLCBpZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgdGhpcykpLT5wb3N0KCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTc4NCwxNCArNzg0LDE0IEBACiAgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJkaXNjb25uZWN0IGNvbXBsZXRlZCI7CiAKICAgICAgICAgICAgICAgICBtQ29ubmVjdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgncXVpdCcsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3F1aXQnLCB0aGlzKSktPnBvc3QoKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgY2FzZSAncXVpdCc6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbm4tPmRpc2Nvbm5lY3QobmV3IEFNZXNzYWdlKCdkaXNjJywgaWQoKSkpOworICAgICAgICAgICAgICAgICAgICBtQ29ubi0+ZGlzY29ubmVjdChuZXcgQU1lc3NhZ2UoJ2Rpc2MnLCB0aGlzKSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwCmluZGV4IGEyNGViNjkuLjBmNDZjODMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAKQEAgLTUxLDcgKzUxLDcgQEAKIHZvaWQgU0RQTG9hZGVyOjpsb2FkKGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKICAgICBtTmV0TG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpcyk7CiAKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0TG9hZCwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdExvYWQsIHRoaXMpOwogICAgIG1zZy0+c2V0U3RyaW5nKCJ1cmwiLCB1cmwpOwogCiAgICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9VRFBQdXNoZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9VRFBQdXNoZXIuY3BwCmluZGV4IDQ3ZWE2ZjEuLjVjNjg1YTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvVURQUHVzaGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1VEUFB1c2hlci5jcHAKQEAgLTY1LDcgKzY1LDcgQEAKICAgICBtRmlyc3RUaW1lTXMgPSBmcm9tbGVsKHRpbWVNcyk7CiAgICAgbUZpcnN0VGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKIAotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQdXNoLCBpZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UHVzaCwgdGhpcykpLT5wb3N0KCk7CiB9CiAKIGJvb2wgVURQUHVzaGVyOjpvblB1c2goKSB7CkBAIC0xMDMsNyArMTAzLDcgQEAKICAgICB0aW1lTXMgLT0gbUZpcnN0VGltZU1zOwogICAgIGludDY0X3Qgd2hlblVzID0gbUZpcnN0VGltZVVzICsgdGltZU1zICogMTAwMGxsOwogICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQdXNoLCBpZCgpKSktPnBvc3Qod2hlblVzIC0gbm93VXMpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQdXNoLCB0aGlzKSktPnBvc3Qod2hlblVzIC0gbm93VXMpOwogCiAgICAgcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvQW5kcm9pZC5tawppbmRleCA4ZDZmZjViLi4xMTFlNmM1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQubWsKQEAgLTMxLDYgKzMxLDkgQEAKIAlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAogCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvciAtV2FsbAorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQorCiBMT0NBTF8zMl9CSVRfT05MWSA6PSB0cnVlCiAKIGluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKQEAgLTYwLDYgKzYzLDM5IEBACiAJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKKworaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9ICQoTE9DQUxfUEFUSCkvQW5kcm9pZC5taworCitMT0NBTF9NT0RVTEUgOj0gTWVkaWFDb2RlY0xpc3RPdmVycmlkZXNfdGVzdAorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCU1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzX3Rlc3QuY3BwIFwKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGlibWVkaWEgXAorCWxpYnN0YWdlZnJpZ2h0IFwKKwlsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKKwlsaWJzdGFnZWZyaWdodF9vbXggXAorCWxpYnV0aWxzIFwKKwlsaWJsb2cKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCisJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKKwlmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAorCitMT0NBTF8zMl9CSVRfT05MWSA6PSB0cnVlCisKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCisKIGluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKIAogIyBJbmNsdWRlIHN1YmRpcmVjdG9yeSBtYWtlZmlsZXMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0R1bW15UmVjb3JkZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0R1bW15UmVjb3JkZXIuaAppbmRleCAxY2JlYTFiLi5jZDRkMGVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9EdW1teVJlY29yZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRHVtbXlSZWNvcmRlci5oCkBAIC0yNCw3ICsyNCw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgTWVkaWFTb3VyY2U7CitzdHJ1Y3QgTWVkaWFTb3VyY2U7CiBjbGFzcyBNZWRpYUJ1ZmZlcjsKIAogY2xhc3MgRHVtbXlSZWNvcmRlciB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlc190ZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNTQ3YmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlc190ZXN0LmNwcApAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDb2RlY0xpc3RPdmVycmlkZXNfdGVzdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlICJNZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5oIgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0luZm8uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3QgY2hhciBrVGVzdE92ZXJyaWRlc1N0cltdID0KKyI8TWVkaWFDb2RlY3M+XG4iCisiICAgIDxTZXR0aW5ncz5cbiIKKyIgICAgICAgIDxTZXR0aW5nIG5hbWU9XCJzdXBwb3J0cy1tdWx0aXBsZS1zZWN1cmUtY29kZWNzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4iCisiICAgICAgICA8U2V0dGluZyBuYW1lPVwic3VwcG9ydHMtc2VjdXJlLXdpdGgtbm9uLXNlY3VyZS1jb2RlY1wiIHZhbHVlPVwidHJ1ZVwiIC8+XG4iCisiICAgIDwvU2V0dGluZ3M+XG4iCisiICAgIDxFbmNvZGVycz5cbiIKKyIgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9XCJPTVgucWNvbS52aWRlby5lbmNvZGVyLmF2Y1wiIHR5cGU9XCJ2aWRlby9hdmNcIiB1cGRhdGU9XCJ0cnVlXCIgPlxuIgorIiAgICAgICAgICAgIDxMaW1pdCBuYW1lPVwibWF4LXN1cHBvcnRlZC1pbnN0YW5jZXNcIiB2YWx1ZT1cIjRcIiAvPlxuIgorIiAgICAgICAgPC9NZWRpYUNvZGVjPlxuIgorIiAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT1cIk9NWC5xY29tLnZpZGVvLmVuY29kZXIubXBlZzRcIiB0eXBlPVwidmlkZW8vbXA0di1lc1wiIHVwZGF0ZT1cInRydWVcIiA+XG4iCisiICAgICAgICAgICAgPExpbWl0IG5hbWU9XCJtYXgtc3VwcG9ydGVkLWluc3RhbmNlc1wiIHZhbHVlPVwiNFwiIC8+XG4iCisiICAgICAgICA8L01lZGlhQ29kZWM+XG4iCisiICAgIDwvRW5jb2RlcnM+XG4iCisiICAgIDxEZWNvZGVycz5cbiIKKyIgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9XCJPTVgucWNvbS52aWRlby5kZWNvZGVyLmF2Yy5zZWN1cmVcIiB0eXBlPVwidmlkZW8vYXZjXCIgdXBkYXRlPVwidHJ1ZVwiID5cbiIKKyIgICAgICAgICAgICA8TGltaXQgbmFtZT1cIm1heC1zdXBwb3J0ZWQtaW5zdGFuY2VzXCIgdmFsdWU9XCIxXCIgLz5cbiIKKyIgICAgICAgIDwvTWVkaWFDb2RlYz5cbiIKKyIgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9XCJPTVgucWNvbS52aWRlby5kZWNvZGVyLmgyNjNcIiB0eXBlPVwidmlkZW8vM2dwcFwiIHVwZGF0ZT1cInRydWVcIiA+XG4iCisiICAgICAgICAgICAgPExpbWl0IG5hbWU9XCJtYXgtc3VwcG9ydGVkLWluc3RhbmNlc1wiIHZhbHVlPVwiNFwiIC8+XG4iCisiICAgICAgICA8L01lZGlhQ29kZWM+XG4iCisiICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPVwiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tcGVnMlwiIHR5cGU9XCJ2aWRlby9tcGVnMlwiIHVwZGF0ZT1cInRydWVcIiA+XG4iCisiICAgICAgICAgICAgPExpbWl0IG5hbWU9XCJtYXgtc3VwcG9ydGVkLWluc3RhbmNlc1wiIHZhbHVlPVwiM1wiIC8+XG4iCisiICAgICAgICA8L01lZGlhQ29kZWM+XG4iCisiICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPVwiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tcGVnNFwiIHR5cGU9XCJ2aWRlby9tcDR2LWVzXCIgdXBkYXRlPVwidHJ1ZVwiID5cbiIKKyIgICAgICAgICAgICA8TGltaXQgbmFtZT1cIm1heC1zdXBwb3J0ZWQtaW5zdGFuY2VzXCIgdmFsdWU9XCIzXCIgLz5cbiIKKyIgICAgICAgIDwvTWVkaWFDb2RlYz5cbiIKKyIgICAgPC9EZWNvZGVycz5cbiIKKyI8L01lZGlhQ29kZWNzPlxuIjsKKworY2xhc3MgTWVkaWFDb2RlY0xpc3RPdmVycmlkZXNUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgTWVkaWFDb2RlY0xpc3RPdmVycmlkZXNUZXN0KCkge30KKworICAgIHZvaWQgYWRkTWF4SW5zdGFuY2VzU2V0dGluZygKKyAgICAgICAgICAgIGNvbnN0IEFTdHJpbmcgJmtleSwKKyAgICAgICAgICAgIGNvbnN0IEFTdHJpbmcgJnZhbHVlLAorICAgICAgICAgICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgQ29kZWNTZXR0aW5ncz4gKnJlc3VsdHMpIHsKKyAgICAgICAgQ29kZWNTZXR0aW5ncyBzZXR0aW5nczsKKyAgICAgICAgc2V0dGluZ3MuYWRkKCJtYXgtc3VwcG9ydGVkLWluc3RhbmNlcyIsIHZhbHVlKTsKKyAgICAgICAgcmVzdWx0cy0+YWRkKGtleSwgc2V0dGluZ3MpOworICAgIH0KKworICAgIHZvaWQgdmVyaWZ5UHJvZmlsZVJlc3VsdHMoY29uc3QgS2V5ZWRWZWN0b3I8QVN0cmluZywgQ29kZWNTZXR0aW5ncz4gJnJlc3VsdHMpIHsKKyAgICAgICAgRVhQRUNUX0xUKDB1LCByZXN1bHRzLnNpemUoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzdWx0cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgQVN0cmluZyBrZXkgPSByZXN1bHRzLmtleUF0KGkpOworICAgICAgICAgICAgQ29kZWNTZXR0aW5ncyBzZXR0aW5ncyA9IHJlc3VsdHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxdSwgc2V0dGluZ3Muc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHNldHRpbmdzLmtleUF0KDApID09ICJtYXgtc3VwcG9ydGVkLWluc3RhbmNlcyIpOworICAgICAgICAgICAgQVN0cmluZyB2YWx1ZVMgPSBzZXR0aW5ncy52YWx1ZUF0KDApOworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSA9IHN0cnRvbCh2YWx1ZVMuY19zdHIoKSwgTlVMTCwgMTApOworICAgICAgICAgICAgRVhQRUNUX0xUKDAsIHZhbHVlKTsKKyAgICAgICAgICAgIEFMT0dWKCJwcm9maWxlQ29kZWNzIHJlc3VsdHMgJXMgJXMiLCBrZXkuY19zdHIoKSwgdmFsdWVTLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBleHBvcnRUZXN0UmVzdWx0c1RvWE1MKGNvbnN0IGNoYXIgKmZpbGVOYW1lKSB7CisgICAgICAgIENvZGVjU2V0dGluZ3MgZ1I7CisgICAgICAgIGdSLmFkZCgic3VwcG9ydHMtbXVsdGlwbGUtc2VjdXJlLWNvZGVjcyIsICJmYWxzZSIpOworICAgICAgICBnUi5hZGQoInN1cHBvcnRzLXNlY3VyZS13aXRoLW5vbi1zZWN1cmUtY29kZWMiLCAidHJ1ZSIpOworICAgICAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBDb2RlY1NldHRpbmdzPiBlUjsKKyAgICAgICAgYWRkTWF4SW5zdGFuY2VzU2V0dGluZygiT01YLnFjb20udmlkZW8uZW5jb2Rlci5hdmMgdmlkZW8vYXZjIiwgIjQiLCAmZVIpOworICAgICAgICBhZGRNYXhJbnN0YW5jZXNTZXR0aW5nKCJPTVgucWNvbS52aWRlby5lbmNvZGVyLm1wZWc0IHZpZGVvL21wNHYtZXMiLCAiNCIsICZlUik7CisgICAgICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIENvZGVjU2V0dGluZ3M+IGRSOworICAgICAgICBhZGRNYXhJbnN0YW5jZXNTZXR0aW5nKCJPTVgucWNvbS52aWRlby5kZWNvZGVyLmF2Yy5zZWN1cmUgdmlkZW8vYXZjIiwgIjEiLCAmZFIpOworICAgICAgICBhZGRNYXhJbnN0YW5jZXNTZXR0aW5nKCJPTVgucWNvbS52aWRlby5kZWNvZGVyLmgyNjMgdmlkZW8vM2dwcCIsICI0IiwgJmRSKTsKKyAgICAgICAgYWRkTWF4SW5zdGFuY2VzU2V0dGluZygiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tcGVnMiB2aWRlby9tcGVnMiIsICIzIiwgJmRSKTsKKyAgICAgICAgYWRkTWF4SW5zdGFuY2VzU2V0dGluZygiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tcGVnNCB2aWRlby9tcDR2LWVzIiwgIjMiLCAmZFIpOworCisgICAgICAgIGV4cG9ydFJlc3VsdHNUb1hNTChmaWxlTmFtZSwgZ1IsIGVSLCBkUik7CisgICAgfQorfTsKKworVEVTVF9GKE1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzVGVzdCwgc3BsaXRTdHJpbmcpIHsKKyAgICBBU3RyaW5nIHMgPSAiYWJjMTIzIjsKKyAgICBBU3RyaW5nIGRlbGltaXRlciA9ICIgIjsKKyAgICBBU3RyaW5nIHMxOworICAgIEFTdHJpbmcgczI7CisgICAgRVhQRUNUX0ZBTFNFKHNwbGl0U3RyaW5nKHMsIGRlbGltaXRlciwgJnMxLCAmczIpKTsKKyAgICBzID0gImFiYyAxMjMiOworICAgIEVYUEVDVF9UUlVFKHNwbGl0U3RyaW5nKHMsIGRlbGltaXRlciwgJnMxLCAmczIpKTsKKyAgICBFWFBFQ1RfVFJVRShzMSA9PSAiYWJjIik7CisgICAgRVhQRUNUX1RSVUUoczIgPT0gIjEyMyIpOworfQorCisvLyBUT0RPOiB0aGUgY29kZWMgY29tcG9uZW50IG5ldmVyIHJldHVybnMgT01YX0V2ZW50Q21kQ29tcGxldGUgaW4gdW5pdCB0ZXN0LgorVEVTVF9GKE1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzVGVzdCwgRElTQUJMRURfcHJvZmlsZUNvZGVjcykgeworICAgIHNwPElNZWRpYUNvZGVjTGlzdD4gbGlzdCA9IE1lZGlhQ29kZWNMaXN0OjpnZXRJbnN0YW5jZSgpOworICAgIFZlY3RvcjxzcDxNZWRpYUNvZGVjSW5mbz4+IGluZm9zOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdC0+Y291bnRDb2RlY3MoKTsgKytpKSB7CisgICAgICAgIGluZm9zLnB1c2hfYmFjayhsaXN0LT5nZXRDb2RlY0luZm8oaSkpOworICAgIH0KKyAgICBDb2RlY1NldHRpbmdzIGdsb2JhbF9yZXN1bHRzOworICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIENvZGVjU2V0dGluZ3M+IGVuY29kZXJfcmVzdWx0czsKKyAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBDb2RlY1NldHRpbmdzPiBkZWNvZGVyX3Jlc3VsdHM7CisgICAgcHJvZmlsZUNvZGVjcygKKyAgICAgICAgICAgIGluZm9zLCAmZ2xvYmFsX3Jlc3VsdHMsICZlbmNvZGVyX3Jlc3VsdHMsICZkZWNvZGVyX3Jlc3VsdHMsIHRydWUgLyogZm9yY2VUb01lYXN1cmUgKi8pOworICAgIHZlcmlmeVByb2ZpbGVSZXN1bHRzKGVuY29kZXJfcmVzdWx0cyk7CisgICAgdmVyaWZ5UHJvZmlsZVJlc3VsdHMoZGVjb2Rlcl9yZXN1bHRzKTsKK30KKworVEVTVF9GKE1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzVGVzdCwgZXhwb3J0VGVzdFJlc3VsdHNUb1hNTCkgeworICAgIGNvbnN0IGNoYXIgKmZpbGVOYW1lID0gIi9zZGNhcmQvbWVkaWFjb2RlY19saXN0X292ZXJyaWRlc190ZXN0LnhtbCI7CisgICAgcmVtb3ZlKGZpbGVOYW1lKTsKKworICAgIGV4cG9ydFRlc3RSZXN1bHRzVG9YTUwoZmlsZU5hbWUpOworCisgICAgLy8gdmVyaWZ5CisgICAgQVN0cmluZyBvdmVycmlkZXM7CisgICAgRklMRSAqZiA9IGZvcGVuKGZpbGVOYW1lLCAicmIiKTsKKyAgICBBU1NFUlRfVFJVRShmICE9IE5VTEwpOworICAgIGZzZWVrKGYsIDAsIFNFRUtfRU5EKTsKKyAgICBsb25nIHNpemUgPSBmdGVsbChmKTsKKyAgICByZXdpbmQoZik7CisKKyAgICBjaGFyICpidWYgPSAoY2hhciAqKW1hbGxvYyhzaXplKTsKKyAgICBFWFBFQ1RfRVEoKHNpemVfdCkxLCBmcmVhZChidWYsIHNpemUsIDEsIGYpKTsKKyAgICBvdmVycmlkZXMuc2V0VG8oYnVmLCBzaXplKTsKKyAgICBmY2xvc2UoZik7CisgICAgZnJlZShidWYpOworCisgICAgQVN0cmluZyBleHBlY3RlZDsKKyAgICBleHBlY3RlZC5hcHBlbmQoZ2V0UHJvZmlsaW5nVmVyc2lvblN0cmluZygpKTsKKyAgICBleHBlY3RlZC5hcHBlbmQoIlxuIik7CisgICAgZXhwZWN0ZWQuYXBwZW5kKGtUZXN0T3ZlcnJpZGVzU3RyKTsKKyAgICBFWFBFQ1RfVFJVRShvdmVycmlkZXMgPT0gZXhwZWN0ZWQpOworCisgICAgcmVtb3ZlKGZpbGVOYW1lKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvU3VyZmFjZU1lZGlhU291cmNlX3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvU3VyZmFjZU1lZGlhU291cmNlX3Rlc3QuY3BwCmluZGV4IGZkODg5ZjkuLjM4NjBlOWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL1N1cmZhY2VNZWRpYVNvdXJjZV90ZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9TdXJmYWNlTWVkaWFTb3VyY2VfdGVzdC5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KQEAgLTQ2Niw3ICs0NjcsNyBAQAogLy8gU2V0IHVwIHRoZSBNZWRpYVJlY29yZGVyIHdoaWNoIHJ1bnMgaW4gdGhlIHNhbWUgcHJvY2VzcyBhcyBtZWRpYXNlcnZlcgogc3A8TWVkaWFSZWNvcmRlcj4gU3VyZmFjZU1lZGlhU291cmNlR0xUZXN0OjpzZXRVcE1lZGlhUmVjb3JkZXIoaW50IGZkLCBpbnQgdmlkZW9Tb3VyY2UsCiAgICAgICAgIGludCBvdXRwdXRGb3JtYXQsIGludCB2aWRlb0VuY29kZXIsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZwcykgewotICAgIHNwPE1lZGlhUmVjb3JkZXI+IG1yID0gbmV3IE1lZGlhUmVjb3JkZXIoKTsKKyAgICBzcDxNZWRpYVJlY29yZGVyPiBtciA9IG5ldyBNZWRpYVJlY29yZGVyKFN0cmluZzE2KCkpOwogICAgIG1yLT5zZXRWaWRlb1NvdXJjZSh2aWRlb1NvdXJjZSk7CiAgICAgbXItPnNldE91dHB1dEZvcm1hdChvdXRwdXRGb3JtYXQpOwogICAgIG1yLT5zZXRWaWRlb0VuY29kZXIodmlkZW9FbmNvZGVyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL1V0aWxzX3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvVXRpbHNfdGVzdC5jcHAKaW5kZXggYzFlNjYzYy4uZDczNjUwMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvVXRpbHNfdGVzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvVXRpbHNfdGVzdC5jcHAKQEAgLTEwOSwyMSArMTA5LDIxIEBACiAKIFRFU1RfRihVdGlsc1Rlc3QsIFRlc3REZWJ1ZykgewogI2RlZmluZSBMVkwoeCkgKEFEZWJ1Zzo6TGV2ZWwpKHgpCi0gICAgQVNTRVJUX0VRKEFEZWJ1Zzo6R2V0RGVidWdMZXZlbEZyb21TdHJpbmcoInZpZGVvIiwgIiIsIExWTCg1KSksIExWTCg1KSk7Ci0gICAgQVNTRVJUX0VRKEFEZWJ1Zzo6R2V0RGVidWdMZXZlbEZyb21TdHJpbmcoInZpZGVvIiwgIiAgIFx0ICBcbiAiLCBMVkwoMikpLCBMVkwoMikpOwotICAgIEFTU0VSVF9FUShBRGVidWc6OkdldERlYnVnTGV2ZWxGcm9tU3RyaW5nKCJ2aWRlbyIsICIzIiwgTFZMKDUpKSwgTFZMKDMpKTsKLSAgICBBU1NFUlRfRVEoQURlYnVnOjpHZXREZWJ1Z0xldmVsRnJvbVN0cmluZygidmlkZW8iLCAiMzoqZGVvIiwgTFZMKDUpKSwgTFZMKDMpKTsKLSAgICBBU1NFUlRfRVEoQURlYnVnOjpHZXREZWJ1Z0xldmVsRnJvbVN0cmluZygKKyAgICBBU1NFUlRfRVEoQURlYnVnOjpHZXRMZXZlbEZyb21TZXR0aW5nc1N0cmluZygidmlkZW8iLCAiIiwgTFZMKDUpKSwgTFZMKDUpKTsKKyAgICBBU1NFUlRfRVEoQURlYnVnOjpHZXRMZXZlbEZyb21TZXR0aW5nc1N0cmluZygidmlkZW8iLCAiICAgXHQgIFxuICIsIExWTCgyKSksIExWTCgyKSk7CisgICAgQVNTRVJUX0VRKEFEZWJ1Zzo6R2V0TGV2ZWxGcm9tU2V0dGluZ3NTdHJpbmcoInZpZGVvIiwgIjMiLCBMVkwoNSkpLCBMVkwoMykpOworICAgIEFTU0VSVF9FUShBRGVidWc6OkdldExldmVsRnJvbVNldHRpbmdzU3RyaW5nKCJ2aWRlbyIsICIzOipkZW8iLCBMVkwoNSkpLCBMVkwoMykpOworICAgIEFTU0VSVF9FUShBRGVidWc6OkdldExldmVsRnJvbVNldHRpbmdzU3RyaW5nKAogICAgICAgICAgICAgInZpZGVvIiwgIlx0XG4gMyBcdFxuOlx0XG4gdmlkZW8gXHRcbiIsIExWTCg1KSksIExWTCgzKSk7Ci0gICAgQVNTRVJUX0VRKEFEZWJ1Zzo6R2V0RGVidWdMZXZlbEZyb21TdHJpbmcoInZpZGVvIiwgIjM6KmRlbywyOnZpZCoiLCBMVkwoNSkpLCBMVkwoMikpOwotICAgIEFTU0VSVF9FUShBRGVidWc6OkdldERlYnVnTGV2ZWxGcm9tU3RyaW5nKAorICAgIEFTU0VSVF9FUShBRGVidWc6OkdldExldmVsRnJvbVNldHRpbmdzU3RyaW5nKCJ2aWRlbyIsICIzOipkZW8sMjp2aWQqIiwgTFZMKDUpKSwgTFZMKDIpKTsKKyAgICBBU1NFUlRfRVEoQURlYnVnOjpHZXRMZXZlbEZyb21TZXR0aW5nc1N0cmluZygKICAgICAgICAgICAgICJhdmlkZW8iLCAiXHRcbiAzIFx0XG46XHRcbiBhdmlkZW8gXHRcbixcdFxuIDIgXHRcbjpcdFxuIHZpZGVvIFx0XG4iLCBMVkwoNSkpLCBMVkwoMykpOwotICAgIEFTU0VSVF9FUShBRGVidWc6OkdldERlYnVnTGV2ZWxGcm9tU3RyaW5nKAorICAgIEFTU0VSVF9FUShBRGVidWc6OkdldExldmVsRnJvbVNldHRpbmdzU3RyaW5nKAogICAgICAgICAgICAgImF1ZGlvLm9teCIsICI0OipvbXgsMzoqZCpvKiwyOmF1ZGlvKiIsIExWTCg1KSksIExWTCgyKSk7Ci0gICAgQVNTRVJUX0VRKEFEZWJ1Zzo6R2V0RGVidWdMZXZlbEZyb21TdHJpbmcoCisgICAgQVNTRVJUX0VRKEFEZWJ1Zzo6R2V0TGV2ZWxGcm9tU2V0dGluZ3NTdHJpbmcoCiAgICAgICAgICAgICAidmlkZW8ub214IiwgIjQ6Km9teCwzOipkKm8qLDI6YXVkaW8qIiwgTFZMKDUpKSwgTFZMKDMpKTsKLSAgICBBU1NFUlRfRVEoQURlYnVnOjpHZXREZWJ1Z0xldmVsRnJvbVN0cmluZygidmlkZW8iLCAiNDoqb214LDM6KmQqbyosMjphdWRpbyoiLCBMVkwoNSkpLCBMVkwoMykpOwotICAgIEFTU0VSVF9FUShBRGVidWc6OkdldERlYnVnTGV2ZWxGcm9tU3RyaW5nKCJvbXgiLCAiNDoqb214LDM6KmQqbyosMjphdWRpbyoiLCBMVkwoNSkpLCBMVkwoNCkpOworICAgIEFTU0VSVF9FUShBRGVidWc6OkdldExldmVsRnJvbVNldHRpbmdzU3RyaW5nKCJ2aWRlbyIsICI0OipvbXgsMzoqZCpvKiwyOmF1ZGlvKiIsIExWTCg1KSksIExWTCgzKSk7CisgICAgQVNTRVJUX0VRKEFEZWJ1Zzo6R2V0TGV2ZWxGcm9tU2V0dGluZ3NTdHJpbmcoIm9teCIsICI0OipvbXgsMzoqZCpvKiwyOmF1ZGlvKiIsIExWTCg1KSksIExWTCg0KSk7CiAjdW5kZWYgTFZMCiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQubWsKaW5kZXggNmE4YjlmYy4uNThmYjEyZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQubWsKQEAgLTksNyArOSw4IEBACiAgICAgICAgIFRpbWVkVGV4dFNSVFNvdXJjZS5jcHAgICAgXAogICAgICAgICBUaW1lZFRleHRQbGF5ZXIuY3BwCiAKLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yCitMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgLVdlcnJvciAtV2FsbAorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3RpbWVkdGV4dCBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0UGxheWVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRQbGF5ZXIuY3BwCmluZGV4IGEwNzA0ODcuLmFlY2Y2NjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRQbGF5ZXIuY3BwCkBAIC01NiwyNSArNTYsMjUgQEAKIH0KIAogdm9pZCBUaW1lZFRleHRQbGF5ZXI6OnN0YXJ0KCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgaWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCB0aGlzKSktPnBvc3QoKTsKIH0KIAogdm9pZCBUaW1lZFRleHRQbGF5ZXI6OnBhdXNlKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgaWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFBhdXNlLCB0aGlzKSktPnBvc3QoKTsKIH0KIAogdm9pZCBUaW1lZFRleHRQbGF5ZXI6OnJlc3VtZSgpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCBpZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCB0aGlzKSktPnBvc3QoKTsKIH0KIAogdm9pZCBUaW1lZFRleHRQbGF5ZXI6OnNlZWtUb0FzeW5jKGludDY0X3QgdGltZVVzKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlZWssIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWVrLCB0aGlzKTsKICAgICBtc2ctPnNldEludDY0KCJzZWVrVGltZVVzIiwgdGltZVVzKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KIAogdm9pZCBUaW1lZFRleHRQbGF5ZXI6OnNldERhdGFTb3VyY2Uoc3A8VGltZWRUZXh0U291cmNlPiBzb3VyY2UpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0U291cmNlLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0U291cmNlLCB0aGlzKTsKICAgICBtc2ctPnNldE9iamVjdCgic291cmNlIiwgc291cmNlKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KQEAgLTIzMSw3ICsyMzEsNyBAQAogICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnJlYWQoJnN0YXJ0VGltZVVzLCAmZW5kVGltZVVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwYXJjZWxFdmVudC0+cGFyY2VsKSwgb3B0aW9ucyk7CiAgICAgaWYgKGVyciA9PSBXT1VMRF9CTE9DSykgewotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmV0cnlSZWFkLCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJldHJ5UmVhZCwgdGhpcyk7CiAgICAgICAgIGlmIChvcHRpb25zICE9IE5VTEwpIHsKICAgICAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVcyA9IGtJbnZhbGlkVGltZVVzOwogICAgICAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBzZWVrTW9kZSA9CkBAIC0yNTksNyArMjU5LDcgQEAKIAogdm9pZCBUaW1lZFRleHRQbGF5ZXI6OnBvc3RUZXh0RXZlbnQoY29uc3Qgc3A8UGFyY2VsRXZlbnQ+JiBwYXJjZWwsIGludDY0X3QgdGltZVVzKSB7CiAgICAgaW50NjRfdCBkZWxheVVzID0gZGVsYXlVc0Zyb21DdXJyZW50VGltZSh0aW1lVXMpOwotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZW5kU3VidGl0bGUsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZW5kU3VidGl0bGUsIHRoaXMpOwogICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtU2VuZFN1YnRpdGxlR2VuZXJhdGlvbik7CiAgICAgaWYgKHBhcmNlbCAhPSBOVUxMKSB7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KCJzdWJ0aXRsZSIsIHBhcmNlbCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZC5tawppbmRleCA5YTlmZGUyLi5lMGUwZTBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L0FuZHJvaWQubWsKQEAgLTI2LDQgKzI2LDcgQEAKICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKICAgICBsaWJ1dGlscwogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvciAtV2FsbAorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQorCiBpbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9UaW1lZFRleHRTUlRTb3VyY2VfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9UaW1lZFRleHRTUlRTb3VyY2VfdGVzdC5jcHAKaW5kZXggM2EwNmQ2MS4uMjExZTczMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0U1JUU291cmNlX3Rlc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1RpbWVkVGV4dFNSVFNvdXJjZV90ZXN0LmNwcApAQCAtNjMsMTAgKzYzLDEwIEBACiAgICAgfQogCiAgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICAgICAgaWYgKG9mZnNldCA+PSBtU2l6ZSkgcmV0dXJuIDA7CisgICAgICAgIGlmICgoc2l6ZV90KW9mZnNldCA+PSBtU2l6ZSkgcmV0dXJuIDA7CiAKICAgICAgICAgc3NpemVfdCBhdmFpbCA9IG1TaXplIC0gb2Zmc2V0OwotICAgICAgICBpZiAoYXZhaWwgPiBzaXplKSB7CisgICAgICAgIGlmICgoc2l6ZV90KWF2YWlsID4gc2l6ZSkgewogICAgICAgICAgICAgYXZhaWwgPSBzaXplOwogICAgICAgICB9CiAgICAgICAgIG1lbWNweShkYXRhLCBtRGF0YSArIG9mZnNldCwgYXZhaWwpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLm1rCmluZGV4IDcwODE0NjMuLmJjNTNjNTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0FuZHJvaWQubWsKQEAgLTEsOCArMSwxMCBAQAogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAotTE9DQUxfQ1BQRkxBR1MgKz0gLURfX1NURElOVF9MSU1JVFMgXAotICAgICAgICAgICAgICAgICAgLVdlcnJvcgorTE9DQUxfQ1BQRkxBR1MgKz0gLURfX1NURElOVF9MSU1JVFMKKworTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKIAogTE9DQUxfU1JDX0ZJTEVTOj0gRWJtbFV0aWwuY3BwICAgICAgICBcCiAgICAgICAgICAgICAgICAgICBXZWJtRWxlbWVudC5jcHAgICAgIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwCmluZGV4IDA2OTk2MWIuLjczN2YxNDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcApAQCAtODAsMzggKzgwLDYgQEAKICAgICAgICAgICAgIG1DdWVQb2ludHMpOwogfQogCi1XZWJtV3JpdGVyOjpXZWJtV3JpdGVyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotICAgIDogbUluaXRDaGVjayhOT19JTklUKSwKLSAgICAgIG1UaW1lQ29kZVNjYWxlKDEwMDAwMDApLAotICAgICAgbVN0YXJ0VGltZXN0YW1wVXMoMCksCi0gICAgICBtU3RhcnRUaW1lT2Zmc2V0TXMoMCksCi0gICAgICBtU2VnbWVudE9mZnNldCgwKSwKLSAgICAgIG1TZWdtZW50RGF0YVN0YXJ0KDApLAotICAgICAgbUluZm9PZmZzZXQoMCksCi0gICAgICBtSW5mb1NpemUoMCksCi0gICAgICBtVHJhY2tzT2Zmc2V0KDApLAotICAgICAgbUN1ZXNPZmZzZXQoMCksCi0gICAgICBtUGF1c2VkKGZhbHNlKSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKSwKLSAgICAgIG1Jc0ZpbGVTaXplTGltaXRFeHBsaWNpdGx5UmVxdWVzdGVkKGZhbHNlKSwKLSAgICAgIG1Jc1JlYWxUaW1lUmVjb3JkaW5nKGZhbHNlKSwKLSAgICAgIG1TdHJlYW1hYmxlRmlsZSh0cnVlKSwKLSAgICAgIG1Fc3RpbWF0ZWRDdWVzU2l6ZSgwKSB7Ci0gICAgbUZkID0gb3BlbihmaWxlbmFtZSwgT19DUkVBVCB8IE9fTEFSR0VGSUxFIHwgT19UUlVOQyB8IE9fUkRXUiwgU19JUlVTUiB8IFNfSVdVU1IpOwotICAgIGlmIChtRmQgPj0gMCkgewotICAgICAgICBBTE9HVigiZmQgJWQ7IGZsYWdzOiAlbyIsIG1GZCwgZmNudGwobUZkLCBGX0dFVEZMLCAwKSk7Ci0gICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKLSAgICB9Ci0gICAgbVN0cmVhbXNba0F1ZGlvSW5kZXhdID0gV2VibVN0cmVhbShrQXVkaW9UeXBlLCAiQXVkaW8iLCAmV2VibVdyaXRlcjo6YXVkaW9UcmFjayk7Ci0gICAgbVN0cmVhbXNba1ZpZGVvSW5kZXhdID0gV2VibVN0cmVhbShrVmlkZW9UeXBlLCAiVmlkZW8iLCAmV2VibVdyaXRlcjo6dmlkZW9UcmFjayk7Ci0gICAgbVNpbmtUaHJlYWQgPSBuZXcgV2VibUZyYW1lU2lua1RocmVhZCgKLSAgICAgICAgICAgIG1GZCwKLSAgICAgICAgICAgIG1TZWdtZW50RGF0YVN0YXJ0LAotICAgICAgICAgICAgbVN0cmVhbXNba1ZpZGVvSW5kZXhdLm1TaW5rLAotICAgICAgICAgICAgbVN0cmVhbXNba0F1ZGlvSW5kZXhdLm1TaW5rLAotICAgICAgICAgICAgbUN1ZVBvaW50cyk7Ci19Ci0KIC8vIHN0YXRpYwogc3A8V2VibUVsZW1lbnQ+IFdlYm1Xcml0ZXI6OnZpZGVvVHJhY2soY29uc3Qgc3A8TWV0YURhdGE+JiBtZCkgewogICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmgKaW5kZXggMzZiNjk2NS4uNGFkNzcwZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmgKQEAgLTM3LDcgKzM3LDYgQEAKIGNsYXNzIFdlYm1Xcml0ZXIgOiBwdWJsaWMgTWVkaWFXcml0ZXIgewogcHVibGljOgogICAgIFdlYm1Xcml0ZXIoaW50IGZkKTsKLSAgICBXZWJtV3JpdGVyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKICAgICB+V2VibVdyaXRlcigpIHsgcmVzZXQoKTsgfQogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L0FuZHJvaWQubWsKaW5kZXggZjcwNDU0YS4uZmIyODYyNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L0FuZHJvaWQubWsKQEAgLTMwLDYgKzMwLDkgQEAKICAgICAgICAgbGlidWkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGxpYnV0aWxzICAgICAgICAgICAgICAgICAgICAgICAgXAogCitMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgLVdlcnJvciAtV2FsbAorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQorCiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF93ZmQKIAogTE9DQUxfTU9EVUxFX1RBR1M6PSBvcHRpb25hbApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L01lZGlhU2VuZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9NZWRpYVNlbmRlci5jcHAKaW5kZXggYjFjZGVjMC4uNmYwMDg3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L01lZGlhU2VuZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvTWVkaWFTZW5kZXIuY3BwCkBAIC0xMjEsNyArMTIxLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZW5kZXJOb3RpZnksIGlkKCkpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbmRlck5vdGlmeSwgdGhpcyk7CiAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUdlbmVyYXRpb24pOwogICAgICAgICAgICAgbVRTU2VuZGVyID0gbmV3IFJUUFNlbmRlcihtTmV0U2Vzc2lvbiwgbm90aWZ5KTsKICAgICAgICAgICAgIGxvb3BlcigpLT5yZWdpc3RlckhhbmRsZXIobVRTU2VuZGVyKTsKQEAgLTE3MCw3ICsxNzAsNyBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbmRlck5vdGlmeSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbmRlck5vdGlmeSwgdGhpcyk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1HZW5lcmF0aW9uKTsKICAgICBub3RpZnktPnNldFNpemUoInRyYWNrSW5kZXgiLCB0cmFja0luZGV4KTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L1ZpZGVvRm9ybWF0cy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvVmlkZW9Gb3JtYXRzLmNwcAppbmRleCAyZjRhZjViLi5kYmM1MTFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvVmlkZW9Gb3JtYXRzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvVmlkZW9Gb3JtYXRzLmNwcApAQCAtMjQ4LDggKzI0OCw4IEBACiAgICAgfQogCiAgICAgaWYgKGJlc3RQcm9maWxlID09IC0xIHx8IGJlc3RMZXZlbCA9PSAtMSkgewotICAgICAgICBBTE9HRSgiUHJvZmlsZSBvciBsZXZlbCBub3Qgc2V0IGZvciByZXNvbHV0aW9uIHR5cGUgJWQsIGluZGV4ICVkIiwKLSAgICAgICAgICAgICAgdHlwZSwgaW5kZXgpOworICAgICAgICBBTE9HRSgiUHJvZmlsZSBvciBsZXZlbCBub3Qgc2V0IGZvciByZXNvbHV0aW9uIHR5cGUgJWQsIGluZGV4ICV6dSIsCisgICAgICAgICAgICAgICAgdHlwZSwgaW5kZXgpOwogICAgICAgICBiZXN0UHJvZmlsZSA9IFBST0ZJTEVfQ0JQOwogICAgICAgICBiZXN0TGV2ZWwgPSBMRVZFTF8zMTsKICAgICB9CkBAIC0zODIsNyArMzgyLDYgQEAKICAgICBkaXNhYmxlQWxsKCk7CiAKICAgICB1bnNpZ25lZCBuYXRpdmUsIGR1bW15OwotICAgIHVuc2lnbmVkIHJlc1szXTsKICAgICBzaXplX3Qgc2l6ZSA9IHN0cmxlbihzcGVjKTsKICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKIApAQCAtNTA3LDcgKzUwNiw3IEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIEFMT0dWKCJ0eXBlICV1LCBpbmRleCAldSwgJXUgeCAldSAlYyV1IHN1cHBvcnRlZCIsCisgICAgICAgICAgICBBTE9HVigidHlwZSAlenUsIGluZGV4ICV6dSwgJXp1IHggJXp1ICVjJXp1IHN1cHBvcnRlZCIsCiAgICAgICAgICAgICAgICAgICBpLCBqLCB3aWR0aCwgaGVpZ2h0LCBpbnRlcmxhY2VkID8gJ2knIDogJ3AnLCBmcmFtZXNQZXJTZWNvbmQpOwogCiAgICAgICAgICAgICB1aW50MzJfdCBzY29yZSA9IHdpZHRoICogaGVpZ2h0ICogZnJhbWVzUGVyU2Vjb25kOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3J0cC9SVFBTZW5kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3J0cC9SVFBTZW5kZXIuY3BwCmluZGV4IGU4OGEzYmQuLmM2NmE4OTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9ydHAvUlRQU2VuZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvcnRwL1JUUFNlbmRlci5jcHAKQEAgLTk1LDExICs5NSwxMSBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgc3A8QU1lc3NhZ2U+IHJ0cE5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFJUUE5vdGlmeSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IHJ0cE5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFJUUE5vdGlmeSwgdGhpcyk7CiAKICAgICBzcDxBTWVzc2FnZT4gcnRjcE5vdGlmeTsKICAgICBpZiAocmVtb3RlUlRDUFBvcnQgPj0gMCkgewotICAgICAgICBydGNwTm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0UlRDUE5vdGlmeSwgaWQoKSk7CisgICAgICAgIHJ0Y3BOb3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSVENQTm90aWZ5LCB0aGlzKTsKICAgICB9CiAKICAgICBDSEVDS19FUShtUlRQU2Vzc2lvbklELCAwKTsKQEAgLTI1Miw4ICsyNTIsNiBAQAogICAgIGludDY0X3QgdGltZVVzOwogICAgIENIRUNLKHRzUGFja2V0cy0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKIAotICAgIGNvbnN0IHNpemVfdCBudW1UU1BhY2tldHMgPSB0c1BhY2tldHMtPnNpemUoKSAvIDE4ODsKLQogICAgIHNpemVfdCBzcmNPZmZzZXQgPSAwOwogICAgIHdoaWxlIChzcmNPZmZzZXQgPCB0c1BhY2tldHMtPnNpemUoKSkgewogICAgICAgICBzcDxBQnVmZmVyPiB1ZHBQYWNrZXQgPQpAQCAtNjcyLDggKzY3MCw4IEBACiAKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIlVua25vd24gUlRDUCBwYWNrZXQgdHlwZSAldSBvZiBzaXplICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClkYXRhWzFdLCBoZWFkZXJMZW5ndGgpOworICAgICAgICAgICAgICAgIEFMT0dXKCJVbmtub3duIFJUQ1AgcGFja2V0IHR5cGUgJXUgb2Ygc2l6ZSAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKWRhdGFbMV0sIGhlYWRlckxlbmd0aCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTc2NCw3ICs3NjIsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgUlRQU2VuZGVyOjpwYXJzZUFQUChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworc3RhdHVzX3QgUlRQU2VuZGVyOjpwYXJzZUFQUChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSBfX3VudXNlZCkgewogICAgIGlmICghbWVtY21wKCJsYXRlIiwgJmRhdGFbOF0sIDQpKSB7CiAgICAgICAgIGludDY0X3QgYXZnTGF0ZW5jeVVzID0gKGludDY0X3QpVTY0X0FUKCZkYXRhWzEyXSk7CiAgICAgICAgIGludDY0X3QgbWF4TGF0ZW5jeVVzID0gKGludDY0X3QpVTY0X0FUKCZkYXRhWzIwXSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL0NvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL0NvbnZlcnRlci5jcHAKaW5kZXggMjgzNGE2Ni4uNDcxMTUyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9Db252ZXJ0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvQ29udmVydGVyLmNwcApAQCAtOTMsNyArOTMsNyBAQAogCiB2b2lkIENvbnZlcnRlcjo6c2h1dGRvd25Bc3luYygpIHsKICAgICBBTE9HVigic2h1dGRvd24iKTsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0U2h1dGRvd24sIGlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTaHV0ZG93biwgdGhpcykpLT5wb3N0KCk7CiB9CiAKIHN0YXR1c190IENvbnZlcnRlcjo6aW5pdCgpIHsKQEAgLTQ4MiwxMSArNDgyLDExIEBACiAKICNpZiAxCiAgICAgaWYgKG1FbmNvZGVyQWN0aXZpdHlOb3RpZnkgPT0gTlVMTCkgewotICAgICAgICBtRW5jb2RlckFjdGl2aXR5Tm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0RW5jb2RlckFjdGl2aXR5LCBpZCgpKTsKKyAgICAgICAgbUVuY29kZXJBY3Rpdml0eU5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdEVuY29kZXJBY3Rpdml0eSwgdGhpcyk7CiAgICAgfQogICAgIG1FbmNvZGVyLT5yZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb24obUVuY29kZXJBY3Rpdml0eU5vdGlmeS0+ZHVwKCkpOwogI2Vsc2UKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0RW5jb2RlckFjdGl2aXR5LCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0RW5jb2RlckFjdGl2aXR5LCB0aGlzKTsKICAgICBub3RpZnktPnNldEludDY0KCJ3aGVuVXMiLCBBTG9vcGVyOjpHZXROb3dVcygpKTsKICAgICBtRW5jb2Rlci0+cmVxdWVzdEFjdGl2aXR5Tm90aWZpY2F0aW9uKG5vdGlmeSk7CiAjZW5kaWYKQEAgLTczMSw4ICs3MzEsNyBAQAogCiAgICAgICAgICAgICAgICAgLy8gTWVkaWFTZW5kZXIgd2lsbCBwb3N0IHRoZSBmb2xsb3dpbmcgbWVzc2FnZSB3aGVuIEhEQ1AKICAgICAgICAgICAgICAgICAvLyBpcyBkb25lLCB0byByZWxlYXNlIHRoZSBvdXRwdXQgYnVmZmVyIGJhY2sgdG8gZW5jb2Rlci4KLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5KG5ldyBBTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGtXaGF0UmVsZWFzZU91dHB1dEJ1ZmZlciwgaWQoKSkpOworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkobmV3IEFNZXNzYWdlKGtXaGF0UmVsZWFzZU91dHB1dEJ1ZmZlciwgdGhpcykpOwogICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImJ1ZmZlckluZGV4IiwgYnVmZmVySW5kZXgpOwogCiAgICAgICAgICAgICAgICAgYnVmZmVyID0gbmV3IEFCdWZmZXIoCkBAIC03NDgsNyArNzQ3LDcgQEAKICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKIAogICAgICAgICAgICAgQUxPR1YoIlslc10gdGltZSAlbGxkIHVzICglLjJmIHNlY3MpIiwKLSAgICAgICAgICAgICAgICAgIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIsIHRpbWVVcywgdGltZVVzIC8gMUU2KTsKKyAgICAgICAgICAgICAgICAgICAgbUlzVmlkZW8gPyAidmlkZW8iIDogImF1ZGlvIiwgKGxvbmcgbG9uZyl0aW1lVXMsIHRpbWVVcyAvIDFFNik7CiAKICAgICAgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgb3V0YnVmLT5iYXNlKCkgKyBvZmZzZXQsIHNpemUpOwogCkBAIC03ODcsMTggKzc4NiwxOCBAQAogfQogCiB2b2lkIENvbnZlcnRlcjo6cmVxdWVzdElEUkZyYW1lKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXF1ZXN0SURSRnJhbWUsIGlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXF1ZXN0SURSRnJhbWUsIHRoaXMpKS0+cG9zdCgpOwogfQogCiB2b2lkIENvbnZlcnRlcjo6ZHJvcEFGcmFtZSgpIHsKICAgICAvLyBVbnN1cHBvcnRlZCBpbiBzdXJmYWNlIGlucHV0IG1vZGUuCiAgICAgQ0hFQ0soIShtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSk7CiAKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0RHJvcEFGcmFtZSwgaWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdERyb3BBRnJhbWUsIHRoaXMpKS0+cG9zdCgpOwogfQogCiB2b2lkIENvbnZlcnRlcjo6c3VzcGVuZEVuY29kaW5nKGJvb2wgc3VzcGVuZCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdXNwZW5kRW5jb2RpbmcsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdXNwZW5kRW5jb2RpbmcsIHRoaXMpOwogICAgIG1zZy0+c2V0SW50MzIoInN1c3BlbmQiLCBzdXNwZW5kKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvQ29udmVydGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL0NvbnZlcnRlci5oCmluZGV4IDU4NzZlMDcuLmIxODI5OTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvQ29udmVydGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9Db252ZXJ0ZXIuaApAQCAtMjMsNyArMjMsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUJ1ZmZlcjsKLXN0cnVjdCBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworY2xhc3MgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKIHN0cnVjdCBNZWRpYUNvZGVjOwogCiAjZGVmaW5lIEVOQUJMRV9TSUxFTkNFX0RFVEVDVElPTiAgICAgICAgMApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9NZWRpYVB1bGxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL01lZGlhUHVsbGVyLmNwcAppbmRleCA4NmI5MThmLi5jZTA3YTRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL01lZGlhUHVsbGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL01lZGlhUHVsbGVyLmNwcApAQCAtNjMsMjEgKzYzLDIxIEBACiB9CiAKIHN0YXR1c190IE1lZGlhUHVsbGVyOjpzdGFydCgpIHsKLSAgICByZXR1cm4gcG9zdFN5bmNocm9ub3VzbHlBbmRSZXR1cm5FcnJvcihuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgaWQoKSkpOworICAgIHJldHVybiBwb3N0U3luY2hyb25vdXNseUFuZFJldHVybkVycm9yKG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCB0aGlzKSk7CiB9CiAKIHZvaWQgTWVkaWFQdWxsZXI6OnN0b3BBc3luYyhjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgdGhpcyk7CiAgICAgbXNnLT5zZXRNZXNzYWdlKCJub3RpZnkiLCBub3RpZnkpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCiB2b2lkIE1lZGlhUHVsbGVyOjpwYXVzZSgpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UGF1c2UsIGlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgdGhpcykpLT5wb3N0KCk7CiB9CiAKIHZvaWQgTWVkaWFQdWxsZXI6OnJlc3VtZSgpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCBpZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCB0aGlzKSktPnBvc3QoKTsKIH0KIAogdm9pZCBNZWRpYVB1bGxlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKQEAgLTEwNSw3ICsxMDUsNyBAQAogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwogCi0gICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0yMTUsNyArMjE1LDcgQEAKIH0KIAogdm9pZCBNZWRpYVB1bGxlcjo6c2NoZWR1bGVQdWxsKCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQdWxsLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UHVsbCwgdGhpcyk7CiAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1QdWxsR2VuZXJhdGlvbik7CiAgICAgbXNnLT5wb3N0KCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1BsYXliYWNrU2Vzc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1BsYXliYWNrU2Vzc2lvbi5jcHAKaW5kZXggMmNiNDc4Ni4uZWQ1YTQwNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUGxheWJhY2tTZXNzaW9uLmNwcApAQCAtMjE0LDcgKzIxNCw3IEBACiAgICAgICAgIG1Db252ZXJ0ZXItPnNodXRkb3duQXN5bmMoKTsKICAgICB9CiAKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0TWVkaWFQdWxsZXJTdG9wcGVkLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0TWVkaWFQdWxsZXJTdG9wcGVkLCB0aGlzKTsKIAogICAgIGlmIChtU3RhcnRlZCAmJiBtTWVkaWFQdWxsZXIgIT0gTlVMTCkgewogICAgICAgICBpZiAobVJlcGVhdGVyU291cmNlICE9IE5VTEwpIHsKQEAgLTM0NSwxMiArMzQ1LDE0IEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBXaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpQbGF5YmFja1Nlc3Npb24oCisgICAgICAgIGNvbnN0IFN0cmluZzE2ICZvcFBhY2thZ2VOYW1lLAogICAgICAgICBjb25zdCBzcDxBTmV0d29ya1Nlc3Npb24+ICZuZXRTZXNzaW9uLAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKICAgICAgICAgY29uc3QgaW5fYWRkciAmaW50ZXJmYWNlQWRkciwKICAgICAgICAgY29uc3Qgc3A8SUhEQ1A+ICZoZGNwLAogICAgICAgICBjb25zdCBjaGFyICpwYXRoKQotICAgIDogbU5ldFNlc3Npb24obmV0U2Vzc2lvbiksCisgICAgOiBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKSwKKyAgICAgIG1OZXRTZXNzaW9uKG5ldFNlc3Npb24pLAogICAgICAgbU5vdGlmeShub3RpZnkpLAogICAgICAgbUludGVyZmFjZUFkZHIoaW50ZXJmYWNlQWRkciksCiAgICAgICBtSERDUChoZGNwKSwKQEAgLTM4Miw3ICszODQsNyBAQAogICAgICAgICBzaXplX3QgdmlkZW9SZXNvbHV0aW9uSW5kZXgsCiAgICAgICAgIFZpZGVvRm9ybWF0czo6UHJvZmlsZVR5cGUgdmlkZW9Qcm9maWxlVHlwZSwKICAgICAgICAgVmlkZW9Gb3JtYXRzOjpMZXZlbFR5cGUgdmlkZW9MZXZlbFR5cGUpIHsKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0TWVkaWFTZW5kZXJOb3RpZnksIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRNZWRpYVNlbmRlck5vdGlmeSwgdGhpcyk7CiAgICAgbU1lZGlhU2VuZGVyID0gbmV3IE1lZGlhU2VuZGVyKG1OZXRTZXNzaW9uLCBub3RpZnkpOwogICAgIGxvb3BlcigpLT5yZWdpc3RlckhhbmRsZXIobU1lZGlhU2VuZGVyKTsKIApAQCAtNDQwLDcgKzQ0Miw3IEBACiBzdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpwbGF5KCkgewogICAgIHVwZGF0ZUxpdmVuZXNzKCk7CiAKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCBpZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCB0aGlzKSktPnBvc3QoKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTQ2MCw3ICs0NjIsNyBAQAogc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6cGF1c2UoKSB7CiAgICAgdXBkYXRlTGl2ZW5lc3MoKTsKIAotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgaWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFBhdXNlLCB0aGlzKSktPnBvc3QoKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTUwOCw3ICs1MTAsNyBAQAogICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IENvbnZlcnRlcjo6a1doYXRFT1MpIHsKICAgICAgICAgICAgICAgICBDSEVDS19FUSh3aGF0LCBDb252ZXJ0ZXI6OmtXaGF0RU9TKTsKIAotICAgICAgICAgICAgICAgIEFMT0dJKCJvdXRwdXQgRU9TIG9uIHRyYWNrICVkIiwgdHJhY2tJbmRleCk7CisgICAgICAgICAgICAgICAgQUxPR0koIm91dHB1dCBFT1Mgb24gdHJhY2sgJXp1IiwgdHJhY2tJbmRleCk7CiAKICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbVRyYWNrcy5pbmRleE9mS2V5KHRyYWNrSW5kZXgpOwogICAgICAgICAgICAgICAgIENIRUNLX0dFKGluZGV4LCAwKTsKQEAgLTU4MSw3ICs1ODMsNyBAQAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7CiAKICAgICAgICAgICAgIGlmICh3aGF0ID09IFRyYWNrOjprV2hhdFN0b3BwZWQpIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgiVHJhY2sgJWQgc3RvcHBlZCIsIHRyYWNrSW5kZXgpOworICAgICAgICAgICAgICAgIEFMT0dJKCJUcmFjayAlenUgc3RvcHBlZCIsIHRyYWNrSW5kZXgpOwogCiAgICAgICAgICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbVRyYWNrcy52YWx1ZUZvcih0cmFja0luZGV4KTsKICAgICAgICAgICAgICAgICBsb29wZXIoKS0+dW5yZWdpc3RlckhhbmRsZXIodHJhY2stPmlkKCkpOwpAQCAtNzg2LDcgKzc4OCw3IEBACiAKICAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXggPSBtVHJhY2tzLnNpemUoKTsKIAotICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0VHJhY2tOb3RpZnksIGlkKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0VHJhY2tOb3RpZnksIHRoaXMpOwogICAgICAgICBub3RpZnktPnNldFNpemUoInRyYWNrSW5kZXgiLCB0cmFja0luZGV4KTsKIAogICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBuZXcgVHJhY2sobm90aWZ5LCBmb3JtYXQpOwpAQCAtODIxLDIxICs4MjMsMjcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIGludDY0X3QgZGVsYXlVcyA9IDEwMDAwMDA7IC8vIGRlZmF1bHQgZGVsYXkgaXMgMSBzZWMKICAgICBpbnQ2NF90IHNhbXBsZVRpbWVVczsKICAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5nZXRTYW1wbGVUaW1lKCZzYW1wbGVUaW1lVXMpOwogCi0gICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKIAotICAgIGlmIChtRmlyc3RTYW1wbGVUaW1lUmVhbFVzIDwgMGxsKSB7Ci0gICAgICAgIG1GaXJzdFNhbXBsZVRpbWVSZWFsVXMgPSBub3dVczsKLSAgICAgICAgbUZpcnN0U2FtcGxlVGltZVVzID0gc2FtcGxlVGltZVVzOworICAgICAgICBpZiAobUZpcnN0U2FtcGxlVGltZVJlYWxVcyA8IDBsbCkgeworICAgICAgICAgICAgbUZpcnN0U2FtcGxlVGltZVJlYWxVcyA9IG5vd1VzOworICAgICAgICAgICAgbUZpcnN0U2FtcGxlVGltZVVzID0gc2FtcGxlVGltZVVzOworICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCB3aGVuVXMgPSBzYW1wbGVUaW1lVXMgLSBtRmlyc3RTYW1wbGVUaW1lVXMgKyBtRmlyc3RTYW1wbGVUaW1lUmVhbFVzOworICAgICAgICBkZWxheVVzID0gd2hlblVzIC0gbm93VXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coImNvdWxkIG5vdCBnZXQgc2FtcGxlIHRpbWUgKCVkKSIsIGVycik7CiAgICAgfQogCi0gICAgaW50NjRfdCB3aGVuVXMgPSBzYW1wbGVUaW1lVXMgLSBtRmlyc3RTYW1wbGVUaW1lVXMgKyBtRmlyc3RTYW1wbGVUaW1lUmVhbFVzOwotCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFB1bGxFeHRyYWN0b3JTYW1wbGUsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQdWxsRXh0cmFjdG9yU2FtcGxlLCB0aGlzKTsKICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVB1bGxFeHRyYWN0b3JHZW5lcmF0aW9uKTsKLSAgICBtc2ctPnBvc3Qod2hlblVzIC0gbm93VXMpOworICAgIG1zZy0+cG9zdChkZWxheVVzKTsKIAogICAgIG1QdWxsRXh0cmFjdG9yUGVuZGluZyA9IHRydWU7CiB9CkBAIC04NTcsNyArODY1LDcgQEAKICAgICBzaXplX3QgdHJhY2tJbmRleDsKICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIG1FeHRyYWN0b3ItPmdldFNhbXBsZVRyYWNrSW5kZXgoJnRyYWNrSW5kZXgpKTsKIAotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb252ZXJ0ZXJOb3RpZnksIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb252ZXJ0ZXJOb3RpZnksIHRoaXMpOwogCiAgICAgbXNnLT5zZXRTaXplKAogICAgICAgICAgICAgInRyYWNrSW5kZXgiLCBtRXh0cmFjdG9yVHJhY2tUb0ludGVybmFsVHJhY2sudmFsdWVGb3IodHJhY2tJbmRleCkpOwpAQCAtOTU1LDcgKzk2Myw3IEBACiAgICAgICAgICAgICAgICAgICAgID8gTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXIDogTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKICAgICB9CiAKLSAgICBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb252ZXJ0ZXJOb3RpZnksIGlkKCkpOworICAgIG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdENvbnZlcnRlck5vdGlmeSwgdGhpcyk7CiAgICAgbm90aWZ5LT5zZXRTaXplKCJ0cmFja0luZGV4IiwgdHJhY2tJbmRleCk7CiAKICAgICBzcDxDb252ZXJ0ZXI+IGNvbnZlcnRlciA9IG5ldyBDb252ZXJ0ZXIobm90aWZ5LCBjb2RlY0xvb3BlciwgZm9ybWF0KTsKQEAgLTk3MCw3ICs5NzgsNyBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIG5vdGlmeSA9IG5ldyBBTWVzc2FnZShDb252ZXJ0ZXI6OmtXaGF0TWVkaWFQdWxsZXJOb3RpZnksIGNvbnZlcnRlci0+aWQoKSk7CisgICAgbm90aWZ5ID0gbmV3IEFNZXNzYWdlKENvbnZlcnRlcjo6a1doYXRNZWRpYVB1bGxlck5vdGlmeSwgY29udmVydGVyKTsKICAgICBub3RpZnktPnNldFNpemUoInRyYWNrSW5kZXgiLCB0cmFja0luZGV4KTsKIAogICAgIHNwPE1lZGlhUHVsbGVyPiBwdWxsZXIgPSBuZXcgTWVkaWFQdWxsZXIoc291cmNlLCBub3RpZnkpOwpAQCAtOTgwLDcgKzk4OCw3IEBACiAgICAgICAgICpudW1JbnB1dEJ1ZmZlcnMgPSBjb252ZXJ0ZXItPmdldElucHV0QnVmZmVyQ291bnQoKTsKICAgICB9CiAKLSAgICBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRUcmFja05vdGlmeSwgaWQoKSk7CisgICAgbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0VHJhY2tOb3RpZnksIHRoaXMpOwogICAgIG5vdGlmeS0+c2V0U2l6ZSgidHJhY2tJbmRleCIsIHRyYWNrSW5kZXgpOwogCiAgICAgc3A8VHJhY2s+IHRyYWNrID0gbmV3IFRyYWNrKApAQCAtMTA2Myw2ICsxMDcxLDcgQEAKIHN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OmFkZEF1ZGlvU291cmNlKGJvb2wgdXNlUENNQXVkaW8pIHsKICAgICBzcDxBdWRpb1NvdXJjZT4gYXVkaW9Tb3VyY2UgPSBuZXcgQXVkaW9Tb3VyY2UoCiAgICAgICAgICAgICBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgIG1PcFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlUmF0ZSAqLywKICAgICAgICAgICAgIDIgLyogY2hhbm5lbENvdW50ICovKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUGxheWJhY2tTZXNzaW9uLmgKaW5kZXggMjgyNDE0My4uZjY2NzNkZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1BsYXliYWNrU2Vzc2lvbi5oCkBAIC0yMiwxMSArMjIsMTMgQEAKICNpbmNsdWRlICJWaWRlb0Zvcm1hdHMuaCIKICNpbmNsdWRlICJXaWZpRGlzcGxheVNvdXJjZS5oIgogCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUJ1ZmZlcjsKIHN0cnVjdCBJSERDUDsKLXN0cnVjdCBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworY2xhc3MgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKIHN0cnVjdCBNZWRpYVB1bGxlcjsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKIHN0cnVjdCBNZWRpYVNlbmRlcjsKQEAgLTM2LDYgKzM4LDcgQEAKIC8vIGRpc3BsYXkuCiBzdHJ1Y3QgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbiA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgUGxheWJhY2tTZXNzaW9uKAorICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYgJm9wUGFja2FnZU5hbWUsCiAgICAgICAgICAgICBjb25zdCBzcDxBTmV0d29ya1Nlc3Npb24+ICZuZXRTZXNzaW9uLAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCiAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAmaW50ZXJmYWNlQWRkciwKQEAgLTk2LDYgKzk5LDggQEAKICAgICAgICAga1doYXRQdWxsRXh0cmFjdG9yU2FtcGxlLAogICAgIH07CiAKKyAgICBTdHJpbmcxNiBtT3BQYWNrYWdlTmFtZTsKKwogICAgIHNwPEFOZXR3b3JrU2Vzc2lvbj4gbU5ldFNlc3Npb247CiAgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CiAgICAgaW5fYWRkciBtSW50ZXJmYWNlQWRkcjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUmVwZWF0ZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9SZXBlYXRlclNvdXJjZS5jcHAKaW5kZXggNTlkN2U2ZS4uYWY2YjY2MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9SZXBlYXRlclNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9SZXBlYXRlclNvdXJjZS5jcHAKQEAgLTE3Myw3ICsxNzMsNyBAQAogfQogCiB2b2lkIFJlcGVhdGVyU291cmNlOjpwb3N0UmVhZCgpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVhZCwgbVJlZmxlY3Rvci0+aWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlYWQsIG1SZWZsZWN0b3IpKS0+cG9zdCgpOwogfQogCiB2b2lkIFJlcGVhdGVyU291cmNlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9XaWZpRGlzcGxheVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1dpZmlEaXNwbGF5U291cmNlLmNwcAppbmRleCA3ZWI4YjczLi5lMjYxNjVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1dpZmlEaXNwbGF5U291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1dpZmlEaXNwbGF5U291cmNlLmNwcApAQCAtNTAsMTQgKzUwLDE2IEBACiBjb25zdCBBU3RyaW5nIFdpZmlEaXNwbGF5U291cmNlOjpzVXNlckFnZW50ID0gTWFrZVVzZXJBZ2VudCgpOwogCiBXaWZpRGlzcGxheVNvdXJjZTo6V2lmaURpc3BsYXlTb3VyY2UoCisgICAgICAgIGNvbnN0IFN0cmluZzE2ICZvcFBhY2thZ2VOYW1lLAogICAgICAgICBjb25zdCBzcDxBTmV0d29ya1Nlc3Npb24+ICZuZXRTZXNzaW9uLAogICAgICAgICBjb25zdCBzcDxJUmVtb3RlRGlzcGxheUNsaWVudD4gJmNsaWVudCwKICAgICAgICAgY29uc3QgY2hhciAqcGF0aCkKLSAgICA6IG1TdGF0ZShJTklUSUFMSVpFRCksCisgICAgOiBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKSwKKyAgICAgIG1TdGF0ZShJTklUSUFMSVpFRCksCiAgICAgICBtTmV0U2Vzc2lvbihuZXRTZXNzaW9uKSwKICAgICAgIG1DbGllbnQoY2xpZW50KSwKICAgICAgIG1TZXNzaW9uSUQoMCksCi0gICAgICBtU3RvcFJlcGx5SUQoMCksCisgICAgICBtU3RvcFJlcGx5SUQoTlVMTCksCiAgICAgICBtQ2hvc2VuUlRQUG9ydCgtMSksCiAgICAgICBtVXNpbmdQQ01BdWRpbyhmYWxzZSksCiAgICAgICBtQ2xpZW50U2Vzc2lvbklEKDApLApAQCAtMTA2LDcgKzEwOCw3IEBACiBzdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6c3RhcnQoY29uc3QgY2hhciAqaWZhY2UpIHsKICAgICBDSEVDS19FUShtU3RhdGUsIElOSVRJQUxJWkVEKTsKIAotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCB0aGlzKTsKICAgICBtc2ctPnNldFN0cmluZygiaWZhY2UiLCBpZmFjZSk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CkBAIC0xMTQsMjEgKzExNiwyMSBAQAogfQogCiBzdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6c3RvcCgpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0b3AsIHRoaXMpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwogICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7CiB9CiAKIHN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpwYXVzZSgpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UGF1c2UsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgdGhpcyk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CiAgICAgcmV0dXJuIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKIH0KIAogc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6OnJlc3VtZSgpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCB0aGlzKTsKIAogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKICAgICByZXR1cm4gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOwpAQCAtMTM4LDcgKzE0MCw3IEBACiAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgewogICAgICAgICBjYXNlIGtXaGF0U3RhcnQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgQVN0cmluZyBpZmFjZTsKQEAgLTE2Nyw3ICsxNjksNyBAQAogCiAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICAgICAgaWYgKGluZXRfYXRvbihpZmFjZS5jX3N0cigpLCAmbUludGVyZmFjZUFkZHIpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFJUU1BOb3RpZnksIGlkKCkpOworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0UlRTUE5vdGlmeSwgdGhpcyk7CiAKICAgICAgICAgICAgICAgICAgICAgZXJyID0gbU5ldFNlc3Npb24tPmNyZWF0ZVJUU1BTZXJ2ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUludGVyZmFjZUFkZHIsIHBvcnQsIG5vdGlmeSwgJm1TZXNzaW9uSUQpOwpAQCAtMzEwLDcgKzMxMiw3IEBACiAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBBV0FJVElOR19DTElFTlRfVEVBUkRPV047CiAKLSAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFRlYXJkb3duVHJpZ2dlclRpbWVkT3V0LCBpZCgpKSktPnBvc3QoCisgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRUZWFyZG93blRyaWdnZXJUaW1lZE91dCwgdGhpcykpLT5wb3N0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUZWFyZG93blRyaWdnZXJUaW1lb3VTZWNzICogMTAwMDAwMGxsKTsKIAogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTMyNSw3ICszMjcsNyBAQAogCiAgICAgICAgIGNhc2Uga1doYXRQYXVzZToKICAgICAgICAgewotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKQEAgLTM0NSw3ICszNDcsNyBAQAogCiAgICAgICAgIGNhc2Uga1doYXRSZXN1bWU6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CkBAIC00OTIsNyArNDk0LDcgQEAKICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gQVdBSVRJTkdfQ0xJRU5UX1RFQVJET1dOKSB7CiAgICAgICAgICAgICAgICAgQUxPR0koIlRFQVJET1dOIHRyaWdnZXIgdGltZWQgb3V0LCBmb3JjaW5nIGRpc2Nvbm5lY3Rpb24uIik7CiAKLSAgICAgICAgICAgICAgICBDSEVDS19ORShtU3RvcFJlcGx5SUQsIDApOworICAgICAgICAgICAgICAgIENIRUNLKG1TdG9wUmVwbHlJRCAhPSBOVUxMKTsKICAgICAgICAgICAgICAgICBmaW5pc2hTdG9wKCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC01MjksNyArNTMxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gSERDUE9ic2VydmVyOjpub3RpZnkgaXMgY29tcGxldGVseSBoYW5kbGVkIGJlZm9yZQogICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjbGVhciB0aGUgSERDUCBpbnN0YW5jZSBhbmQgdW5sb2FkIHRoZSBzaGFyZWQKICAgICAgICAgICAgICAgICAgICAgLy8gbGlicmFyeSA6KAotICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0RmluaXNoU3RvcDIsIGlkKCkpKS0+cG9zdCgzMDAwMDBsbCk7CisgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRGaW5pc2hTdG9wMiwgdGhpcykpLT5wb3N0KDMwMDAwMGxsKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCkBAIC04ODEsNyArODgzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgJmZyYW1lc1BlclNlY29uZCwKICAgICAgICAgICAgICAgICAgICAgJmludGVybGFjZWQpKTsKIAotICAgICAgICBBTE9HSSgiUGlja2VkIHZpZGVvIHJlc29sdXRpb24gJXUgeCAldSAlYyV1IiwKKyAgICAgICAgQUxPR0koIlBpY2tlZCB2aWRlbyByZXNvbHV0aW9uICV6dSB4ICV6dSAlYyV6dSIsCiAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGludGVybGFjZWQgPyAnaScgOiAncCcsIGZyYW1lc1BlclNlY29uZCk7CiAKICAgICAgICAgQUxPR0koIlBpY2tlZCBBVkMgcHJvZmlsZSAlZCwgbGV2ZWwgJWQiLApAQCAtMTAyNyw3ICsxMDI5LDcgQEAKICAgICB9CiAKICAgICBtUmVhcGVyUGVuZGluZyA9IHRydWU7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlYXBEZWFkQ2xpZW50cywgaWQoKSkpLT5wb3N0KGtSZWFwZXJJbnRlcnZhbFVzKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVhcERlYWRDbGllbnRzLCB0aGlzKSktPnBvc3Qoa1JlYXBlckludGVydmFsVXMpOwogfQogCiB2b2lkIFdpZmlEaXNwbGF5U291cmNlOjpzY2hlZHVsZUtlZXBBbGl2ZShpbnQzMl90IHNlc3Npb25JRCkgewpAQCAtMTAzNSw3ICsxMDM3LDcgQEAKICAgICAvLyBleHBpcmUsIG1ha2Ugc3VyZSB0aGUgdGltZW91dCBpcyBncmVhdGVyIHRoYW4gNSBzZWNzIHRvIGJlZ2luIHdpdGguCiAgICAgQ0hFQ0tfR1Qoa1BsYXliYWNrU2Vzc2lvblRpbWVvdXRVcywgNTAwMDAwMGxsKTsKIAotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRLZWVwQWxpdmUsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRLZWVwQWxpdmUsIHRoaXMpOwogICAgIG1zZy0+c2V0SW50MzIoInNlc3Npb25JRCIsIHNlc3Npb25JRCk7CiAgICAgbXNnLT5wb3N0KGtQbGF5YmFja1Nlc3Npb25UaW1lb3V0VXMgLSA1MDAwMDAwbGwpOwogfQpAQCAtMTIzOSwxMyArMTI0MSwxMyBAQAogCiAgICAgaW50MzJfdCBwbGF5YmFja1Nlc3Npb25JRCA9IG1ha2VVbmlxdWVQbGF5YmFja1Nlc3Npb25JRCgpOwogCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFBsYXliYWNrU2Vzc2lvbk5vdGlmeSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFBsYXliYWNrU2Vzc2lvbk5vdGlmeSwgdGhpcyk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigicGxheWJhY2tTZXNzaW9uSUQiLCBwbGF5YmFja1Nlc3Npb25JRCk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigic2Vzc2lvbklEIiwgc2Vzc2lvbklEKTsKIAogICAgIHNwPFBsYXliYWNrU2Vzc2lvbj4gcGxheWJhY2tTZXNzaW9uID0KICAgICAgICAgbmV3IFBsYXliYWNrU2Vzc2lvbigKLSAgICAgICAgICAgICAgICBtTmV0U2Vzc2lvbiwgbm90aWZ5LCBtSW50ZXJmYWNlQWRkciwgbUhEQ1AsIG1NZWRpYVBhdGguY19zdHIoKSk7CisgICAgICAgICAgICAgICAgbU9wUGFja2FnZU5hbWUsIG1OZXRTZXNzaW9uLCBub3RpZnksIG1JbnRlcmZhY2VBZGRyLCBtSERDUCwgbU1lZGlhUGF0aC5jX3N0cigpKTsKIAogICAgIGxvb3BlcigpLT5yZWdpc3RlckhhbmRsZXIocGxheWJhY2tTZXNzaW9uKTsKIApAQCAtMTQ3MCw3ICsxNDcyLDcgQEAKICAgICBtTmV0U2Vzc2lvbi0+c2VuZFJlcXVlc3Qoc2Vzc2lvbklELCByZXNwb25zZS5jX3N0cigpKTsKIAogICAgIGlmIChtU3RhdGUgPT0gQVdBSVRJTkdfQ0xJRU5UX1RFQVJET1dOKSB7Ci0gICAgICAgIENIRUNLX05FKG1TdG9wUmVwbHlJRCwgMCk7CisgICAgICAgIENIRUNLKG1TdG9wUmVwbHlJRCAhPSBOVUxMKTsKICAgICAgICAgZmluaXNoU3RvcCgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1DbGllbnQtPm9uRGlzcGxheUVycm9yKElSZW1vdGVEaXNwbGF5Q2xpZW50OjprRGlzcGxheUVycm9yVW5rbm93bik7CkBAIC0xNzA3LDcgKzE3MDksNyBAQAogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdEhEQ1BOb3RpZnksIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRIRENQTm90aWZ5LCB0aGlzKTsKICAgICBtSERDUE9ic2VydmVyID0gbmV3IEhEQ1BPYnNlcnZlcihub3RpZnkpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gbUhEQ1AtPnNldE9ic2VydmVyKG1IRENQT2JzZXJ2ZXIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9XaWZpRGlzcGxheVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9XaWZpRGlzcGxheVNvdXJjZS5oCmluZGV4IDc1MDI2NWYuLmMyNWE2NzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvV2lmaURpc3BsYXlTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1dpZmlEaXNwbGF5U291cmNlLmgKQEAgLTI1LDEwICsyNSwxMyBAQAogCiAjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgogCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgQVJlcGx5VG9rZW47CiBzdHJ1Y3QgSUhEQ1A7Ci1zdHJ1Y3QgSVJlbW90ZURpc3BsYXlDbGllbnQ7CitjbGFzcyBJUmVtb3RlRGlzcGxheUNsaWVudDsKIHN0cnVjdCBQYXJzZWRNZXNzYWdlOwogCiAvLyBSZXByZXNlbnRzIHRoZSBSVFNQIHNlcnZlciBhY3RpbmcgYXMgYSB3aWZpIGRpc3BsYXkgc291cmNlLgpAQCAtMzcsNiArNDAsNyBAQAogICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBrV2lmaURpc3BsYXlEZWZhdWx0UG9ydCA9IDcyMzY7CiAKICAgICBXaWZpRGlzcGxheVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2ICZvcFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgY29uc3Qgc3A8QU5ldHdvcmtTZXNzaW9uPiAmbmV0U2Vzc2lvbiwKICAgICAgICAgICAgIGNvbnN0IHNwPElSZW1vdGVEaXNwbGF5Q2xpZW50PiAmY2xpZW50LAogICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0aCA9IE5VTEwpOwpAQCAtMTEzLDYgKzExNyw4IEBACiAKICAgICBzdGF0aWMgY29uc3QgQVN0cmluZyBzVXNlckFnZW50OwogCisgICAgU3RyaW5nMTYgbU9wUGFja2FnZU5hbWU7CisKICAgICBTdGF0ZSBtU3RhdGU7CiAgICAgVmlkZW9Gb3JtYXRzIG1TdXBwb3J0ZWRTb3VyY2VWaWRlb0Zvcm1hdHM7CiAgICAgc3A8QU5ldHdvcmtTZXNzaW9uPiBtTmV0U2Vzc2lvbjsKQEAgLTEyMSw3ICsxMjcsNyBAQAogICAgIHN0cnVjdCBpbl9hZGRyIG1JbnRlcmZhY2VBZGRyOwogICAgIGludDMyX3QgbVNlc3Npb25JRDsKIAotICAgIHVpbnQzMl90IG1TdG9wUmVwbHlJRDsKKyAgICBzcDxBUmVwbHlUb2tlbj4gbVN0b3BSZXBseUlEOwogCiAgICAgQVN0cmluZyBtV2ZkQ2xpZW50UnRwUG9ydHM7CiAgICAgaW50MzJfdCBtQ2hvc2VuUlRQUG9ydDsgIC8vIGV4dHJhY3RlZCBmcm9tICJ3ZmRfY2xpZW50X3J0cF9wb3J0cyIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L0FuZHJvaWQubWsKaW5kZXggYmI4NmRmYy4uZGM2NzI4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L0FuZHJvaWQubWsKQEAgLTEyLDcgKzEyLDcgQEAKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X3l1dgogCiAKLUxPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCi0KK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9ZVVZJbWFnZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvWVVWSW1hZ2UuY3BwCmluZGV4IGJiM2UyZmQuLmMwOTgxMzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9ZVVZJbWFnZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L1lVVkltYWdlLmNwcApAQCAtMzc0LDEzICszNzQsMTMgQEAKIAogdm9pZCBZVVZJbWFnZTo6eXV2MnJnYih1aW50OF90IHlWYWx1ZSwgdWludDhfdCB1VmFsdWUsIHVpbnQ4X3QgdlZhbHVlLAogICAgICAgICB1aW50OF90ICpyLCB1aW50OF90ICpnLCB1aW50OF90ICpiKSBjb25zdCB7Ci0gICAgKnIgPSB5VmFsdWUgKyAoMS4zNzA3MDUgKiAodlZhbHVlLTEyOCkpOwotICAgICpnID0geVZhbHVlIC0gKDAuNjk4MDAxICogKHZWYWx1ZS0xMjgpKSAtICgwLjMzNzYzMyAqICh1VmFsdWUtMTI4KSk7Ci0gICAgKmIgPSB5VmFsdWUgKyAoMS43MzI0NDYgKiAodVZhbHVlLTEyOCkpOworICAgIGludCByVG1wID0geVZhbHVlICsgKDEuMzcwNzA1ICogKHZWYWx1ZS0xMjgpKTsKKyAgICBpbnQgZ1RtcCA9IHlWYWx1ZSAtICgwLjY5ODAwMSAqICh2VmFsdWUtMTI4KSkgLSAoMC4zMzc2MzMgKiAodVZhbHVlLTEyOCkpOworICAgIGludCBiVG1wID0geVZhbHVlICsgKDEuNzMyNDQ2ICogKHVWYWx1ZS0xMjgpKTsKIAotICAgICpyID0gY2xhbXAoKnIsIDAsIDI1NSk7Ci0gICAgKmcgPSBjbGFtcCgqZywgMCwgMjU1KTsKLSAgICAqYiA9IGNsYW1wKCpiLCAwLCAyNTUpOworICAgICpyID0gY2xhbXAoclRtcCwgMCwgMjU1KTsKKyAgICAqZyA9IGNsYW1wKGdUbXAsIDAsIDI1NSk7CisgICAgKmIgPSBjbGFtcChiVG1wLCAwLCAyNTUpOwogfQogCiBib29sIFlVVkltYWdlOjp3cml0ZVRvUFBNKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSBjb25zdCB7CmRpZmYgLS1naXQgYS9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLm1rIGIvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5tawppbmRleCAzYTI4MGYwLi5iNmRlMGQ5IDEwMDY0NAotLS0gYS9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQubWsKQEAgLTExLDE0ICsxMSwxNiBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX1NSQ19GSUxFUzo9IFwKLQltYWluX21lZGlhc2VydmVyLmNwcCAKKwltYWluX21lZGlhc2VydmVyLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJhdWRpb2ZsaW5nZXIgXAogCWxpYmF1ZGlvcG9saWN5c2VydmljZSBcCiAJbGliY2FtZXJhX21ldGFkYXRhXAogCWxpYmNhbWVyYXNlcnZpY2UgXAorCWxpYmljdXVjIFwKIAlsaWJtZWRpYWxvZ3NlcnZpY2UgXAorCWxpYnJlc291cmNlbWFuYWdlcnNlcnZpY2UgXAogCWxpYmN1dGlscyBcCiAJbGlibmJhaW8gXAogCWxpYm1lZGlhIFwKQEAgLTI2LDE5ICsyOCwyNyBAQAogCWxpYnV0aWxzIFwKIAlsaWJsb2cgXAogCWxpYmJpbmRlciBcCi0JbGlic291bmR0cmlnZ2Vyc2VydmljZQorCWxpYnNvdW5kdHJpZ2dlcnNlcnZpY2UgXAorCWxpYnJhZGlvc2VydmljZQogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLQlsaWJyZWdpc3Rlcm1zZXh0CisgICAgICAgIGxpYmljdWFuZHJvaWRfdXRpbHMgXAorICAgICAgICBsaWJyZWdpc3Rlcm1zZXh0CiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlIFwKICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL21lZGlhbG9nIFwKICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlciBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeSBcCisgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUgXAorICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUgXAorICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZSBcCisgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlciBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIKKyAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL3NvdW5kdHJpZ2dlciBcCisgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9yYWRpbyBcCisgICAgZXh0ZXJuYWwvc29uaWMKIAogTE9DQUxfTU9EVUxFOj0gbWVkaWFzZXJ2ZXIKIExPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKZGlmZiAtLWdpdCBhL21lZGlhL21lZGlhc2VydmVyL21haW5fbWVkaWFzZXJ2ZXIuY3BwIGIvbWVkaWEvbWVkaWFzZXJ2ZXIvbWFpbl9tZWRpYXNlcnZlci5jcHAKaW5kZXggYWYxYzllNi4uNGE0ODVlZCAxMDA2NDQKLS0tIGEvbWVkaWEvbWVkaWFzZXJ2ZXIvbWFpbl9tZWRpYXNlcnZlci5jcHAKKysrIGIvbWVkaWEvbWVkaWFzZXJ2ZXIvbWFpbl9tZWRpYXNlcnZlci5jcHAKQEAgLTMxLDEwICszMSwxMyBAQAogLy8gZnJvbSBMT0NBTF9DX0lOQ0xVREVTCiAjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCiAjaW5jbHVkZSAiQ2FtZXJhU2VydmljZS5oIgorI2luY2x1ZGUgIkljdVV0aWxzLmgiCiAjaW5jbHVkZSAiTWVkaWFMb2dTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiTWVkaWFQbGF5ZXJTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCisjaW5jbHVkZSAiUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oIgorI2luY2x1ZGUgInNlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgiCisjaW5jbHVkZSAiUmFkaW9TZXJ2aWNlLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCkBAIC0xMjIsMTQgKzEyNSwxNyBAQAogICAgICAgICAgICAgcHJjdGwoUFJfU0VUX1BERUFUSFNJRywgU0lHS0lMTCk7ICAgLy8gaWYgcGFyZW50IG1lZGlhLmxvZyBkaWVzIGJlZm9yZSBtZSwga2lsbCBtZSBhbHNvCiAgICAgICAgICAgICBzZXRwZ2lkKDAsIDApOyAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgaWYgSSBkaWUgZmlyc3QsIGRvbid0IGtpbGwgbXkgcGFyZW50CiAgICAgICAgIH0KKyAgICAgICAgSW5pdGlhbGl6ZUljdU9yRGllKCk7CiAgICAgICAgIHNwPFByb2Nlc3NTdGF0ZT4gcHJvYyhQcm9jZXNzU3RhdGU6OnNlbGYoKSk7CiAgICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKICAgICAgICAgQUxPR0koIlNlcnZpY2VNYW5hZ2VyOiAlcCIsIHNtLmdldCgpKTsKICAgICAgICAgQXVkaW9GbGluZ2VyOjppbnN0YW50aWF0ZSgpOwogICAgICAgICBNZWRpYVBsYXllclNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CisgICAgICAgIFJlc291cmNlTWFuYWdlclNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAgICAgICAgIENhbWVyYVNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAgICAgICAgIEF1ZGlvUG9saWN5U2VydmljZTo6aW5zdGFudGlhdGUoKTsKICAgICAgICAgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOworICAgICAgICBSYWRpb1NlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAgICAgICAgIHJlZ2lzdGVyRXh0ZW5zaW9ucygpOwogICAgICAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmpvaW5UaHJlYWRQb29sKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAKaW5kZXggZWQwMGI3Mi4uY2QwYzQ2MiAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhQ29kZWMuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcApAQCAtMTE2LDcgKzExNiw3IEBACiAKICAgICAgICAgY2FzZSBrV2hhdFN0b3BBY3Rpdml0eU5vdGlmaWNhdGlvbnM6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpOwogCiAgICAgICAgICAgICBtQ29kZWMtPm1HZW5lcmF0aW9uKys7CkBAIC0xMzYsNyArMTM2LDcgQEAKIAogCiBzdGF0aWMgdm9pZCByZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb24oQU1lZGlhQ29kZWMgKmNvZGVjKSB7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbnMsIGNvZGVjLT5tSGFuZGxlci0+aWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbnMsIGNvZGVjLT5tSGFuZGxlcikpLT5wb3N0KCk7CiB9CiAKIGV4dGVybiAiQyIgewpAQCAtMTU0LDYgKzE1NCwxMCBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIG1EYXRhLT5tQ29kZWMgPSBhbmRyb2lkOjpNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUobURhdGEtPm1Mb29wZXIsIG5hbWUpOwogICAgIH0KKyAgICBpZiAobURhdGEtPm1Db2RlYyA9PSBOVUxMKSB7ICAvLyBmYWlsZWQgdG8gY3JlYXRlIGNvZGVjCisgICAgICAgIEFNZWRpYUNvZGVjX2RlbGV0ZShtRGF0YSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICAgICBtRGF0YS0+bUhhbmRsZXIgPSBuZXcgQ29kZWNIYW5kbGVyKG1EYXRhKTsKICAgICBtRGF0YS0+bUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1EYXRhLT5tSGFuZGxlcik7CiAgICAgbURhdGEtPm1HZW5lcmF0aW9uID0gMTsKQEAgLTE4MCwxNyArMTg0LDIxIEBACiAKIEVYUE9SVAogbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfZGVsZXRlKEFNZWRpYUNvZGVjICptRGF0YSkgewotICAgIGlmIChtRGF0YS0+bUNvZGVjICE9IE5VTEwpIHsKLSAgICAgICAgbURhdGEtPm1Db2RlYy0+cmVsZWFzZSgpOwotICAgICAgICBtRGF0YS0+bUNvZGVjLmNsZWFyKCk7Ci0gICAgfQorICAgIGlmIChtRGF0YSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChtRGF0YS0+bUNvZGVjICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1EYXRhLT5tQ29kZWMtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1EYXRhLT5tQ29kZWMuY2xlYXIoKTsKKyAgICAgICAgfQogCi0gICAgaWYgKG1EYXRhLT5tTG9vcGVyICE9IE5VTEwpIHsKLSAgICAgICAgbURhdGEtPm1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1EYXRhLT5tSGFuZGxlci0+aWQoKSk7Ci0gICAgICAgIG1EYXRhLT5tTG9vcGVyLT5zdG9wKCk7Ci0gICAgICAgIG1EYXRhLT5tTG9vcGVyLmNsZWFyKCk7CisgICAgICAgIGlmIChtRGF0YS0+bUxvb3BlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAobURhdGEtPm1IYW5kbGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtRGF0YS0+bUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobURhdGEtPm1IYW5kbGVyLT5pZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EYXRhLT5tTG9vcGVyLT5zdG9wKCk7CisgICAgICAgICAgICBtRGF0YS0+bUxvb3Blci5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBtRGF0YTsKICAgICB9Ci0gICAgZGVsZXRlIG1EYXRhOwogICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKQEAgLTIxOSw3ICsyMjcsNyBAQAogICAgIGlmIChyZXQgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihyZXQpOwogICAgIH0KLSAgICBtRGF0YS0+bUFjdGl2aXR5Tm90aWZpY2F0aW9uID0gbmV3IEFNZXNzYWdlKGtXaGF0QWN0aXZpdHlOb3RpZnksIG1EYXRhLT5tSGFuZGxlci0+aWQoKSk7CisgICAgbURhdGEtPm1BY3Rpdml0eU5vdGlmaWNhdGlvbiA9IG5ldyBBTWVzc2FnZShrV2hhdEFjdGl2aXR5Tm90aWZ5LCBtRGF0YS0+bUhhbmRsZXIpOwogICAgIG1EYXRhLT5tQWN0aXZpdHlOb3RpZmljYXRpb24tPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbURhdGEtPm1HZW5lcmF0aW9uKTsKICAgICByZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb24obURhdGEpOwogICAgIHJldHVybiBBTUVESUFfT0s7CkBAIC0yMjksNyArMjM3LDcgQEAKIG1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3N0b3AoQU1lZGlhQ29kZWMgKm1EYXRhKSB7CiAgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gdHJhbnNsYXRlX2Vycm9yKG1EYXRhLT5tQ29kZWMtPnN0b3AoKSk7CiAKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RvcEFjdGl2aXR5Tm90aWZpY2F0aW9ucywgbURhdGEtPm1IYW5kbGVyLT5pZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RvcEFjdGl2aXR5Tm90aWZpY2F0aW9ucywgbURhdGEtPm1IYW5kbGVyKTsKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CiAgICAgbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwogICAgIG1EYXRhLT5tQWN0aXZpdHlOb3RpZmljYXRpb24uY2xlYXIoKTsKQEAgLTM1Miw3ICszNjAsOCBAQAogfQogCiAvL0VYUE9SVAotbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc2V0Tm90aWZpY2F0aW9uQ2FsbGJhY2soQU1lZGlhQ29kZWMgKm1EYXRhLCBPbkNvZGVjRXZlbnQgY2FsbGJhY2ssIHZvaWQgKnVzZXJkYXRhKSB7CittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19zZXROb3RpZmljYXRpb25DYWxsYmFjayhBTWVkaWFDb2RlYyAqbURhdGEsIE9uQ29kZWNFdmVudCBjYWxsYmFjaywKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpIHsKICAgICBtRGF0YS0+bUNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgbURhdGEtPm1DYWxsYmFja1VzZXJEYXRhID0gdXNlcmRhdGE7CiAgICAgcmV0dXJuIEFNRURJQV9PSzsKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwCmluZGV4IDdhMTA0OGMuLjgzYTViYTEgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcApAQCAtMzEyLDggKzMxMiwxMCBAQAogICAgICAgICAgICAgICAgIFN0cmluZzgob3B0aW9uYWxQYXJhbWV0ZXJzW2ldLm1WYWx1ZSkpOwogICAgIH0KICAgICBTdHJpbmc4IGRlZmF1bHRVcmw7CisgICAgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSBrZXlSZXF1ZXN0VHlwZTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5nZXRLZXlSZXF1ZXN0KCppdGVyLCBtZEluaXQsIFN0cmluZzgobWltZVR5cGUpLAotICAgICAgICAgICAgbWRLZXlUeXBlLCBtZE9wdGlvbmFsUGFyYW1ldGVycywgbU9iai0+bUtleVJlcXVlc3QsIGRlZmF1bHRVcmwpOworICAgICAgICAgICAgbWRLZXlUeXBlLCBtZE9wdGlvbmFsUGFyYW1ldGVycywgbU9iai0+bUtleVJlcXVlc3QsIGRlZmF1bHRVcmwsCisgICAgICAgICAgICAma2V5UmVxdWVzdFR5cGUpOwogICAgIGlmIChzdGF0dXMgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZVN0YXR1cyhzdGF0dXMpOwogICAgIH0gZWxzZSB7CkBAIC03MjUsNCArNzI3LDMgQEAKIH0KIAogfSAvLyBleHRlcm4gIkMiCi0KZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IGRiNTdkMGIuLjBlY2Q2NGYgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcApAQCAtNzAsNyArNzAsOCBAQAogfQogCiBFWFBPUlQKLW1lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlRmQoQU1lZGlhRXh0cmFjdG9yICptRGF0YSwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpIHsKK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlRmQoQU1lZGlhRXh0cmFjdG9yICptRGF0YSwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwKKyAgICAgICAgb2ZmNjRfdCBsZW5ndGgpIHsKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglZCwgJWxsZCwgJWxsZCkiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOwogICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IobURhdGEtPm1JbXBsLT5zZXREYXRhU291cmNlKGZkLCBvZmZzZXQsIGxlbmd0aCkpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvQW5kcm9pZC5tayBiL21lZGlhL3V0aWxzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZhZGJjODAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzkgQEAKKyMgQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgQmF0dGVyeU5vdGlmaWVyLmNwcCBcCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICBsaWJiaW5kZXIgXAorICBsaWJjdXRpbHMgXAorICBsaWJsb2cgXAorICBsaWJ1dGlscyBcCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS9pbmNsdWRlCisKK0xPQ0FMX0NGTEFHUyArPSBcCisgIC1XYWxsIFwKKyAgLVdleHRyYSBcCisgIC1XZXJyb3IgXAorCitMT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gJChMT0NBTF9QQVRIKS9pbmNsdWRlCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJtZWRpYXV0aWxzCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL0JhdHRlcnlOb3RpZmllci5jcHAgYi9tZWRpYS91dGlscy9CYXR0ZXJ5Tm90aWZpZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOWNkN2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9CYXR0ZXJ5Tm90aWZpZXIuY3BwCkBAIC0wLDAgKzEsMjEzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZS9tZWRpYXV0aWxzL0JhdHRlcnlOb3RpZmllci5oIgorCisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3ZvaWQgQmF0dGVyeU5vdGlmaWVyOjpEZWF0aE5vdGlmaWVyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiAvKndobyovKSB7CisgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm9uQmF0dGVyeVN0YXRTZXJ2aWNlRGllZCgpOworfQorCitCYXR0ZXJ5Tm90aWZpZXI6OkJhdHRlcnlOb3RpZmllcigpIDogbVZpZGVvUmVmQ291bnQoMCksIG1BdWRpb1JlZkNvdW50KDApIHt9CisKK0JhdHRlcnlOb3RpZmllcjo6fkJhdHRlcnlOb3RpZmllcigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtRGVhdGhOb3RpZmllciAhPSBudWxscHRyKSB7CisgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1CYXR0ZXJ5U3RhdFNlcnZpY2UpLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyKTsKKyAgICB9Cit9CisKK3ZvaWQgQmF0dGVyeU5vdGlmaWVyOjpub3RlU3RhcnRWaWRlbygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNwPElCYXR0ZXJ5U3RhdHM+IGJhdHRlcnlTZXJ2aWNlID0gZ2V0QmF0dGVyeVNlcnZpY2VfbCgpOworICAgIGlmIChtVmlkZW9SZWZDb3VudCA9PSAwICYmIGJhdHRlcnlTZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgYmF0dGVyeVNlcnZpY2UtPm5vdGVTdGFydFZpZGVvKEFJRF9NRURJQSk7CisgICAgfQorICAgIG1WaWRlb1JlZkNvdW50Kys7Cit9CisKK3ZvaWQgQmF0dGVyeU5vdGlmaWVyOjpub3RlU3RvcFZpZGVvKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1WaWRlb1JlZkNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiB2aWRlbyByZWZjb3VudCBpcyBicm9rZW4uIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPElCYXR0ZXJ5U3RhdHM+IGJhdHRlcnlTZXJ2aWNlID0gZ2V0QmF0dGVyeVNlcnZpY2VfbCgpOworCisgICAgbVZpZGVvUmVmQ291bnQtLTsKKyAgICBpZiAobVZpZGVvUmVmQ291bnQgPT0gMCAmJiBiYXR0ZXJ5U2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIGJhdHRlcnlTZXJ2aWNlLT5ub3RlU3RvcFZpZGVvKEFJRF9NRURJQSk7CisgICAgfQorfQorCit2b2lkIEJhdHRlcnlOb3RpZmllcjo6bm90ZVJlc2V0VmlkZW8oKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzcDxJQmF0dGVyeVN0YXRzPiBiYXR0ZXJ5U2VydmljZSA9IGdldEJhdHRlcnlTZXJ2aWNlX2woKTsKKyAgICBtVmlkZW9SZWZDb3VudCA9IDA7CisgICAgaWYgKGJhdHRlcnlTZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgYmF0dGVyeVNlcnZpY2UtPm5vdGVSZXNldEF1ZGlvKCk7CisgICAgfQorfQorCit2b2lkIEJhdHRlcnlOb3RpZmllcjo6bm90ZVN0YXJ0QXVkaW8oKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzcDxJQmF0dGVyeVN0YXRzPiBiYXR0ZXJ5U2VydmljZSA9IGdldEJhdHRlcnlTZXJ2aWNlX2woKTsKKyAgICBpZiAobUF1ZGlvUmVmQ291bnQgPT0gMCAmJiBiYXR0ZXJ5U2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIGJhdHRlcnlTZXJ2aWNlLT5ub3RlU3RhcnRBdWRpbyhBSURfTUVESUEpOworICAgIH0KKyAgICBtQXVkaW9SZWZDb3VudCsrOworfQorCit2b2lkIEJhdHRlcnlOb3RpZmllcjo6bm90ZVN0b3BBdWRpbygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtQXVkaW9SZWZDb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlczogYXVkaW8gcmVmY291bnQgaXMgYnJva2VuLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxJQmF0dGVyeVN0YXRzPiBiYXR0ZXJ5U2VydmljZSA9IGdldEJhdHRlcnlTZXJ2aWNlX2woKTsKKworICAgIG1BdWRpb1JlZkNvdW50LS07CisgICAgaWYgKG1BdWRpb1JlZkNvdW50ID09IDAgJiYgYmF0dGVyeVNlcnZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICBiYXR0ZXJ5U2VydmljZS0+bm90ZVN0b3BBdWRpbyhBSURfTUVESUEpOworICAgIH0KK30KKwordm9pZCBCYXR0ZXJ5Tm90aWZpZXI6Om5vdGVSZXNldEF1ZGlvKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3A8SUJhdHRlcnlTdGF0cz4gYmF0dGVyeVNlcnZpY2UgPSBnZXRCYXR0ZXJ5U2VydmljZV9sKCk7CisgICAgbUF1ZGlvUmVmQ291bnQgPSAwOworICAgIGlmIChiYXR0ZXJ5U2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIGJhdHRlcnlTZXJ2aWNlLT5ub3RlUmVzZXRBdWRpbygpOworICAgIH0KK30KKwordm9pZCBCYXR0ZXJ5Tm90aWZpZXI6Om5vdGVGbGFzaGxpZ2h0T24oY29uc3QgU3RyaW5nOCYgaWQsIGludCB1aWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNwPElCYXR0ZXJ5U3RhdHM+IGJhdHRlcnlTZXJ2aWNlID0gZ2V0QmF0dGVyeVNlcnZpY2VfbCgpOworCisgICAgc3RkOjpwYWlyPFN0cmluZzgsIGludD4gayA9IHN0ZDo6bWFrZV9wYWlyKGlkLCB1aWQpOworICAgIGlmICghbUZsYXNobGlnaHRTdGF0ZVtrXSkgeworICAgICAgICBtRmxhc2hsaWdodFN0YXRlW2tdID0gdHJ1ZTsKKyAgICAgICAgaWYgKGJhdHRlcnlTZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGJhdHRlcnlTZXJ2aWNlLT5ub3RlRmxhc2hsaWdodE9uKHVpZCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQmF0dGVyeU5vdGlmaWVyOjpub3RlRmxhc2hsaWdodE9mZihjb25zdCBTdHJpbmc4JiBpZCwgaW50IHVpZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3A8SUJhdHRlcnlTdGF0cz4gYmF0dGVyeVNlcnZpY2UgPSBnZXRCYXR0ZXJ5U2VydmljZV9sKCk7CisKKyAgICBzdGQ6OnBhaXI8U3RyaW5nOCwgaW50PiBrID0gc3RkOjptYWtlX3BhaXIoaWQsIHVpZCk7CisgICAgaWYgKG1GbGFzaGxpZ2h0U3RhdGVba10pIHsKKyAgICAgICAgbUZsYXNobGlnaHRTdGF0ZVtrXSA9IGZhbHNlOworICAgICAgICBpZiAoYmF0dGVyeVNlcnZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgYmF0dGVyeVNlcnZpY2UtPm5vdGVGbGFzaGxpZ2h0T2ZmKHVpZCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQmF0dGVyeU5vdGlmaWVyOjpub3RlUmVzZXRGbGFzaGxpZ2h0KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3A8SUJhdHRlcnlTdGF0cz4gYmF0dGVyeVNlcnZpY2UgPSBnZXRCYXR0ZXJ5U2VydmljZV9sKCk7CisgICAgbUZsYXNobGlnaHRTdGF0ZS5jbGVhcigpOworICAgIGlmIChiYXR0ZXJ5U2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIGJhdHRlcnlTZXJ2aWNlLT5ub3RlUmVzZXRGbGFzaGxpZ2h0KCk7CisgICAgfQorfQorCit2b2lkIEJhdHRlcnlOb3RpZmllcjo6bm90ZVN0YXJ0Q2FtZXJhKGNvbnN0IFN0cmluZzgmIGlkLCBpbnQgdWlkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzcDxJQmF0dGVyeVN0YXRzPiBiYXR0ZXJ5U2VydmljZSA9IGdldEJhdHRlcnlTZXJ2aWNlX2woKTsKKyAgICBzdGQ6OnBhaXI8U3RyaW5nOCwgaW50PiBrID0gc3RkOjptYWtlX3BhaXIoaWQsIHVpZCk7CisgICAgaWYgKCFtQ2FtZXJhU3RhdGVba10pIHsKKyAgICAgICAgbUNhbWVyYVN0YXRlW2tdID0gdHJ1ZTsKKyAgICAgICAgaWYgKGJhdHRlcnlTZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGJhdHRlcnlTZXJ2aWNlLT5ub3RlU3RhcnRDYW1lcmEodWlkKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBCYXR0ZXJ5Tm90aWZpZXI6Om5vdGVTdG9wQ2FtZXJhKGNvbnN0IFN0cmluZzgmIGlkLCBpbnQgdWlkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzcDxJQmF0dGVyeVN0YXRzPiBiYXR0ZXJ5U2VydmljZSA9IGdldEJhdHRlcnlTZXJ2aWNlX2woKTsKKyAgICBzdGQ6OnBhaXI8U3RyaW5nOCwgaW50PiBrID0gc3RkOjptYWtlX3BhaXIoaWQsIHVpZCk7CisgICAgaWYgKG1DYW1lcmFTdGF0ZVtrXSkgeworICAgICAgICBtQ2FtZXJhU3RhdGVba10gPSBmYWxzZTsKKyAgICAgICAgaWYgKGJhdHRlcnlTZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGJhdHRlcnlTZXJ2aWNlLT5ub3RlU3RvcENhbWVyYSh1aWQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEJhdHRlcnlOb3RpZmllcjo6bm90ZVJlc2V0Q2FtZXJhKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3A8SUJhdHRlcnlTdGF0cz4gYmF0dGVyeVNlcnZpY2UgPSBnZXRCYXR0ZXJ5U2VydmljZV9sKCk7CisgICAgbUNhbWVyYVN0YXRlLmNsZWFyKCk7CisgICAgaWYgKGJhdHRlcnlTZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgYmF0dGVyeVNlcnZpY2UtPm5vdGVSZXNldENhbWVyYSgpOworICAgIH0KK30KKwordm9pZCBCYXR0ZXJ5Tm90aWZpZXI6Om9uQmF0dGVyeVN0YXRTZXJ2aWNlRGllZCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1CYXR0ZXJ5U3RhdFNlcnZpY2UuY2xlYXIoKTsKKyAgICBtRGVhdGhOb3RpZmllci5jbGVhcigpOworICAgIC8vIERvIG5vdCByZXNldCBtVmlkZW9SZWZDb3VudCBhbmQgbUF1ZGlvUmVmQ291bnQgaGVyZS4gVGhlIHJlZgorICAgIC8vIGNvdW50aW5nIGlzIGluZGVwZW5kZW50IG9mIHRoZSBiYXR0ZXJ5IHNlcnZpY2UgYXZhaWxhYmlsaXR5LgorICAgIC8vIFdlIG5lZWQgdGhpcyBpZiBiYXR0ZXJ5IHNlcnZpY2UgYmVjb21lcyBhdmFpbGFibGUgYWZ0ZXIgbWVkaWEKKyAgICAvLyBzdGFydGVkLgorCit9CisKK3NwPElCYXR0ZXJ5U3RhdHM+IEJhdHRlcnlOb3RpZmllcjo6Z2V0QmF0dGVyeVNlcnZpY2VfbCgpIHsKKyAgICBpZiAobUJhdHRlcnlTdGF0U2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBtQmF0dGVyeVN0YXRTZXJ2aWNlOworICAgIH0KKyAgICAvLyBHZXQgYmF0dGVyeSBzZXJ2aWNlIGZyb20gc2VydmljZSBtYW5hZ2VyCisgICAgY29uc3Qgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbShkZWZhdWx0U2VydmljZU1hbmFnZXIoKSk7CisgICAgaWYgKHNtICE9IG51bGxwdHIpIHsKKyAgICAgICAgY29uc3QgU3RyaW5nMTYgbmFtZSgiYmF0dGVyeXN0YXRzIik7CisgICAgICAgIG1CYXR0ZXJ5U3RhdFNlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJQmF0dGVyeVN0YXRzPihzbS0+Y2hlY2tTZXJ2aWNlKG5hbWUpKTsKKyAgICAgICAgaWYgKG1CYXR0ZXJ5U3RhdFNlcnZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoImJhdHRlcnlzdGF0cyBzZXJ2aWNlIHVuYXZhaWxhYmxlISIpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICBtRGVhdGhOb3RpZmllciA9IG5ldyBEZWF0aE5vdGlmaWVyKCk7CisgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1CYXR0ZXJ5U3RhdFNlcnZpY2UpLT5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllcik7CisKKyAgICAgICAgLy8gTm90aWZ5IHN0YXJ0IG5vdyBpZiBtZWRpYSBhbHJlYWR5IHN0YXJ0ZWQKKyAgICAgICAgaWYgKG1WaWRlb1JlZkNvdW50ID4gMCkgeworICAgICAgICAgICAgbUJhdHRlcnlTdGF0U2VydmljZS0+bm90ZVN0YXJ0VmlkZW8oQUlEX01FRElBKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUF1ZGlvUmVmQ291bnQgPiAwKSB7CisgICAgICAgICAgICBtQmF0dGVyeVN0YXRTZXJ2aWNlLT5ub3RlU3RhcnRBdWRpbyhBSURfTUVESUEpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtQmF0dGVyeVN0YXRTZXJ2aWNlOworfQorCitBTkRST0lEX1NJTkdMRVRPTl9TVEFUSUNfSU5TVEFOQ0UoQmF0dGVyeU5vdGlmaWVyKTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL1JFQURNRSBiL21lZGlhL3V0aWxzL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWFiMGI4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvUkVBRE1FCkBAIC0wLDAgKzEsNCBAQAorVGhpcyBpcyBhIGNvbW1vbiBzaGFyZWQgbGlicmFyeSBmb3IgbWVkaWEgdXRpbGl0eSBjbGFzc2VzLgorCitDb25zaWRlciBhZGRpbmcgeW91ciB1dGlsaXR5IGNsYXNzL2Z1bmN0aW9uIGhlcmUgaWYgaXQgd2lsbAorYmUgdXNlZCBhY3Jvc3Mgc2V2ZXJhbCBvZiB0aGUgbWVkaWEgbGlicmFyaWVzLgpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL0JhdHRlcnlOb3RpZmllci5oIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL0JhdHRlcnlOb3RpZmllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MDQ4MDQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL0JhdHRlcnlOb3RpZmllci5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfQkFUVEVSWV9OT1RJRklFUl9ICisjZGVmaW5lIE1FRElBX0JBVFRFUllfTk9USUZJRVJfSAorCisjaW5jbHVkZSA8YmluZGVyL0lCYXR0ZXJ5U3RhdHMuaD4KKyNpbmNsdWRlIDx1dGlscy9TaW5nbGV0b24uaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIENsYXNzIHVzZWQgZm9yIGxvZ2dpbmcgYmF0dGVyeSBsaWZlIGV2ZW50cyBpbiBtZWRpYXNlcnZlci4KKyAqLworY2xhc3MgQmF0dGVyeU5vdGlmaWVyIDogcHVibGljIFNpbmdsZXRvbjxCYXR0ZXJ5Tm90aWZpZXI+IHsKKworICAgIGZyaWVuZCBjbGFzcyBTaW5nbGV0b248QmF0dGVyeU5vdGlmaWVyPjsKKyAgICBCYXR0ZXJ5Tm90aWZpZXIoKTsKKworcHVibGljOgorICAgIH5CYXR0ZXJ5Tm90aWZpZXIoKTsKKworICAgIHZvaWQgbm90ZVN0YXJ0VmlkZW8oKTsKKyAgICB2b2lkIG5vdGVTdG9wVmlkZW8oKTsKKyAgICB2b2lkIG5vdGVSZXNldFZpZGVvKCk7CisgICAgdm9pZCBub3RlU3RhcnRBdWRpbygpOworICAgIHZvaWQgbm90ZVN0b3BBdWRpbygpOworICAgIHZvaWQgbm90ZVJlc2V0QXVkaW8oKTsKKyAgICB2b2lkIG5vdGVGbGFzaGxpZ2h0T24oY29uc3QgU3RyaW5nOCYgaWQsIGludCB1aWQpOworICAgIHZvaWQgbm90ZUZsYXNobGlnaHRPZmYoY29uc3QgU3RyaW5nOCYgaWQsIGludCB1aWQpOworICAgIHZvaWQgbm90ZVJlc2V0Rmxhc2hsaWdodCgpOworICAgIHZvaWQgbm90ZVN0YXJ0Q2FtZXJhKGNvbnN0IFN0cmluZzgmIGlkLCBpbnQgdWlkKTsKKyAgICB2b2lkIG5vdGVTdG9wQ2FtZXJhKGNvbnN0IFN0cmluZzgmIGlkLCBpbnQgdWlkKTsKKyAgICB2b2lkIG5vdGVSZXNldENhbWVyYSgpOworCitwcml2YXRlOgorICAgIHZvaWQgb25CYXR0ZXJ5U3RhdFNlcnZpY2VEaWVkKCk7CisKKyAgICBjbGFzcyBEZWF0aE5vdGlmaWVyIDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKKyAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIC8qd2hvKi8pOworICAgIH07CisKKyAgICBNdXRleCBtTG9jazsKKyAgICBpbnQgbVZpZGVvUmVmQ291bnQ7CisgICAgaW50IG1BdWRpb1JlZkNvdW50OworICAgIHN0ZDo6bWFwPHN0ZDo6cGFpcjxTdHJpbmc4LCBpbnQ+LCBib29sPiBtRmxhc2hsaWdodFN0YXRlOworICAgIHN0ZDo6bWFwPHN0ZDo6cGFpcjxTdHJpbmc4LCBpbnQ+LCBib29sPiBtQ2FtZXJhU3RhdGU7CisgICAgc3A8SUJhdHRlcnlTdGF0cz4gbUJhdHRlcnlTdGF0U2VydmljZTsKKyAgICBzcDxEZWF0aE5vdGlmaWVyPiBtRGVhdGhOb3RpZmllcjsKKworICAgIHNwPElCYXR0ZXJ5U3RhdHM+IGdldEJhdHRlcnlTZXJ2aWNlX2woKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBNRURJQV9CQVRURVJZX05PVElGSUVSX0gKZGlmZiAtLWdpdCBhL3JhZGlvL0FuZHJvaWQubWsgYi9yYWRpby9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYmI4ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9yYWRpby9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzkgQEAKKyMgQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJUmFkaW8uY3BwIFwKKwlJUmFkaW8uY3BwIFwKKwlJUmFkaW9DbGllbnQuY3BwIFwKKwlJUmFkaW9TZXJ2aWNlLmNwcAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJjdXRpbHMgXAorCWxpYnV0aWxzIFwKKwlsaWJsb2cgXAorCWxpYmJpbmRlciBcCisJbGliaGFyZHdhcmUgXAorCWxpYnJhZGlvX21ldGFkYXRhCisKKyNMT0NBTF9DX0lOQ0xVREVTICs9IFwKKwlzeXN0ZW0vbWVkaWEvY2FtZXJhL2luY2x1ZGUgXAorCXN5c3RlbS9tZWRpYS9wcml2YXRlL2NhbWVyYS9pbmNsdWRlCisKK0xPQ0FMX01PRFVMRTo9IGxpYnJhZGlvCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3JhZGlvL0lSYWRpby5jcHAgYi9yYWRpby9JUmFkaW8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MmRmNzcKLS0tIC9kZXYvbnVsbAorKysgYi9yYWRpby9JUmFkaW8uY3BwCkBAIC0wLDAgKzEsMzQ0IEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjZGVmaW5lIExPR19UQUcgIklSYWRpbyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPHJhZGlvL0lSYWRpby5oPgorI2luY2x1ZGUgPHJhZGlvL0lSYWRpb1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxyYWRpby9JUmFkaW9DbGllbnQuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vcmFkaW9fbWV0YWRhdGEuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHsKKyAgICBERVRBQ0ggPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorICAgIFNFVF9DT05GSUdVUkFUSU9OLAorICAgIEdFVF9DT05GSUdVUkFUSU9OLAorICAgIFNFVF9NVVRFLAorICAgIEdFVF9NVVRFLAorICAgIFNDQU4sCisgICAgU1RFUCwKKyAgICBUVU5FLAorICAgIENBTkNFTCwKKyAgICBHRVRfUFJPR1JBTV9JTkZPUk1BVElPTiwKKyAgICBIQVNfQ09OVFJPTAorfTsKKworY2xhc3MgQnBSYWRpbzogcHVibGljIEJwSW50ZXJmYWNlPElSYWRpbz4KK3sKK3B1YmxpYzoKKyAgICBCcFJhZGlvKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQorICAgICAgICA6IEJwSW50ZXJmYWNlPElSYWRpbz4oaW1wbCkKKyAgICB7CisgICAgfQorCisgICAgdm9pZCBkZXRhY2goKQorICAgIHsKKyAgICAgICAgQUxPR1YoImRldGFjaCIpOworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChERVRBQ0gsIGRhdGEsICZyZXBseSk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDb25maWd1cmF0aW9uKGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBpZiAoY29uZmlnID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpbzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZShjb25maWcsIHNpemVvZihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9DT05GSUdVUkFUSU9OLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldENvbmZpZ3VyYXRpb24oc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGlmIChjb25maWcgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0NPTkZJR1VSQVRJT04sIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS5yZWFkKGNvbmZpZywgc2l6ZW9mKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNdXRlKGJvb2wgbXV0ZSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpbzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKG11dGUgPyAxIDogMCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfTVVURSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNdXRlKGJvb2wgKm11dGUpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGlmIChtdXRlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpbzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9NVVRFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgaW50IG11dGVyZWFkID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICAgICAgKm11dGUgPSBtdXRlcmVhZCAhPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzY2FuKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViQ2hhbm5lbCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpbzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGRpcmVjdGlvbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihza2lwU3ViQ2hhbm5lbCA/IDEgOiAwKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNDQU4sIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RlcChyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihkaXJlY3Rpb24pOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc2tpcFN1YkNoYW5uZWwgPyAxIDogMCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTVEVQLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHR1bmUodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBzdWJDaGFubmVsKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoY2hhbm5lbCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdWJDaGFubmVsKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFRVTkUsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FuY2VsKCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpbzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KENBTkNFTCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9ncmFtSW5mb3JtYXRpb24oc3RydWN0IHJhZGlvX3Byb2dyYW1faW5mbyAqaW5mbykKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgaWYgKGluZm8gPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICByYWRpb19tZXRhZGF0YV90ICptZXRhZGF0YSA9IGluZm8tPm1ldGFkYXRhOworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1BST0dSQU1fSU5GT1JNQVRJT04sIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS5yZWFkKGluZm8sIHNpemVvZihzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvKSk7CisgICAgICAgICAgICAgICAgaW5mby0+bWV0YWRhdGEgPSBtZXRhZGF0YTsKKyAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IChzaXplX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZXRhZGF0YSA9CisgICAgICAgICAgICAgICAgICAgIChyYWRpb19tZXRhZGF0YV90ICopY2FsbG9jKHNpemUgLyBzaXplb2YodW5zaWduZWQgaW50KSwgc2l6ZW9mKHVuc2lnbmVkIGludCkpOworICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcGx5LnJlYWQobWV0YWRhdGEsIHNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHJhZGlvX21ldGFkYXRhX2FkZF9tZXRhZGF0YSgmaW5mby0+bWV0YWRhdGEsIG1ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICBmcmVlKG1ldGFkYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFzQ29udHJvbChib29sICpoYXNDb250cm9sKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBpZiAoaGFzQ29udHJvbCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChIQVNfQ09OVFJPTCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICpoYXNDb250cm9sID0gcmVwbHkucmVhZEludDMyKCkgIT0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KK307CisKK0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShSYWRpbywgImFuZHJvaWQuaGFyZHdhcmUuSVJhZGlvIik7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdHVzX3QgQm5SYWRpbzo6b25UcmFuc2FjdCgKKyAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQoreworICAgIHN3aXRjaChjb2RlKSB7CisgICAgICAgIGNhc2UgREVUQUNIOiB7CisgICAgICAgICAgICBBTE9HVigiREVUQUNIIik7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBkZXRhY2goKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTRVRfQ09ORklHVVJBVElPTjogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnIGNvbmZpZzsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmY29uZmlnLCBzaXplb2Yoc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnKSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRDb25maWd1cmF0aW9uKCZjb25maWcpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEdFVF9DT05GSUdVUkFUSU9OOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgY29uZmlnOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0Q29uZmlndXJhdGlvbigmY29uZmlnKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZjb25maWcsIHNpemVvZihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNFVF9NVVRFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBib29sIG11dGUgPSBkYXRhLnJlYWRJbnQzMigpICE9IDA7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRNdXRlKG11dGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEdFVF9NVVRFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBib29sIG11dGU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRNdXRlKCZtdXRlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobXV0ZSA/IDEgOiAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNDQU46IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW8sIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiA9IChyYWRpb19kaXJlY3Rpb25fdClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYm9vbCBza2lwU3ViQ2hhbm5lbCA9IGRhdGEucmVhZEludDMyKCkgPT0gMTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNjYW4oZGlyZWN0aW9uLCBza2lwU3ViQ2hhbm5lbCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNhc2UgU1RFUDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgcmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uID0gKHJhZGlvX2RpcmVjdGlvbl90KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBib29sIHNraXBTdWJDaGFubmVsID0gZGF0YS5yZWFkSW50MzIoKSA9PSAxOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RlcChkaXJlY3Rpb24sIHNraXBTdWJDaGFubmVsKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUVU5FOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbCA9ICh1bnNpZ25lZCBpbnQpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBzdWJDaGFubmVsID0gKHVuc2lnbmVkIGludClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gdHVuZShjaGFubmVsLCBzdWJDaGFubmVsKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDQU5DRUw6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW8sIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNhbmNlbCgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEdFVF9QUk9HUkFNX0lORk9STUFUSU9OOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvIGluZm87CisKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJhZGlvX21ldGFkYXRhX2FsbG9jYXRlKCZpbmZvLm1ldGFkYXRhLCAwLCAwKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gZ2V0UHJvZ3JhbUluZm9ybWF0aW9uKCZpbmZvKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZpbmZvLCBzaXplb2Yoc3RydWN0IHJhZGlvX3Byb2dyYW1faW5mbykpOworICAgICAgICAgICAgICAgIGludCBjb3VudCA9IHJhZGlvX21ldGFkYXRhX2dldF9jb3VudChpbmZvLm1ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplID0gcmFkaW9fbWV0YWRhdGFfZ2V0X3NpemUoaW5mby5tZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNpemUpOworICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoaW5mby5tZXRhZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmFkaW9fbWV0YWRhdGFfZGVhbGxvY2F0ZShpbmZvLm1ldGFkYXRhKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhBU19DT05UUk9MOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBib29sIGNvbnRyb2w7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBoYXNDb250cm9sKCZjb250cm9sKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoY29udHJvbCA/IDEgOiAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3JhZGlvL0lSYWRpb0NsaWVudC5jcHAgYi9yYWRpby9JUmFkaW9DbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzM2NhNDkKLS0tIC9kZXYvbnVsbAorKysgYi9yYWRpby9JUmFkaW9DbGllbnQuY3BwCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTUsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8cmFkaW8vSVJhZGlvQ2xpZW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZW51bSB7CisgICAgT05fRVZFTlQgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorfTsKKworY2xhc3MgQnBSYWRpb0NsaWVudDogcHVibGljIEJwSW50ZXJmYWNlPElSYWRpb0NsaWVudD4KK3sKKworcHVibGljOgorICAgIEJwUmFkaW9DbGllbnQoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCisgICAgICAgIDogQnBJbnRlcmZhY2U8SVJhZGlvQ2xpZW50PihpbXBsKQorICAgIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25FdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW9DbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoZXZlbnRNZW1vcnkpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE9OX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseSk7CisgICAgfQorfTsKKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFJhZGlvQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLklSYWRpb0NsaWVudCIpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXR1c190IEJuUmFkaW9DbGllbnQ6Om9uVHJhbnNhY3QoCisgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKK3sKKyAgICBzd2l0Y2goY29kZSkgeworICAgICAgICBjYXNlIE9OX0VWRU5UOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvQ2xpZW50LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeSA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KAorICAgICAgICAgICAgICAgIGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIG9uRXZlbnQoZXZlbnRNZW1vcnkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICB9ICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9yYWRpby9JUmFkaW9TZXJ2aWNlLmNwcCBiL3JhZGlvL0lSYWRpb1NlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMmIzZWYKLS0tIC9kZXYvbnVsbAorKysgYi9yYWRpby9JUmFkaW9TZXJ2aWNlLmNwcApAQCAtMCwwICsxLDE4MSBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2RlZmluZSBMT0dfVEFHICJCcFJhZGlvU2VydmljZSIKKy8vCisjZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxyYWRpby9JUmFkaW9TZXJ2aWNlLmg+CisjaW5jbHVkZSA8cmFkaW8vSVJhZGlvLmg+CisjaW5jbHVkZSA8cmFkaW8vSVJhZGlvQ2xpZW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZW51bSB7CisgICAgTElTVF9NT0RVTEVTID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICBBVFRBQ0gsCit9OworCisjZGVmaW5lIE1BWF9JVEVNU19QRVJfTElTVCAxMDI0CisKK2NsYXNzIEJwUmFkaW9TZXJ2aWNlOiBwdWJsaWMgQnBJbnRlcmZhY2U8SVJhZGlvU2VydmljZT4KK3sKK3B1YmxpYzoKKyAgICBCcFJhZGlvU2VydmljZShjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKKyAgICAgICAgOiBCcEludGVyZmFjZTxJUmFkaW9TZXJ2aWNlPihpbXBsKQorICAgIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RNb2R1bGVzKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpCisgICAgeworICAgICAgICBpZiAobnVtTW9kdWxlcyA9PSBOVUxMIHx8ICgqbnVtTW9kdWxlcyAhPSAwICYmIHByb3BlcnRpZXMgPT0gTlVMTCkpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgdW5zaWduZWQgaW50IG51bU1vZHVsZXNSZXEgPSAocHJvcGVydGllcyA9PSBOVUxMKSA/IDAgOiAqbnVtTW9kdWxlczsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKG51bU1vZHVsZXNSZXEpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTElTVF9NT0RVTEVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICAqbnVtTW9kdWxlcyA9ICh1bnNpZ25lZCBpbnQpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImxpc3RNb2R1bGVzKCkgc3RhdHVzICVkIGdvdCAqbnVtTW9kdWxlcyAlZCIsIHN0YXR1cywgKm51bU1vZHVsZXMpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBpZiAobnVtTW9kdWxlc1JlcSA+ICpudW1Nb2R1bGVzKSB7CisgICAgICAgICAgICAgICAgbnVtTW9kdWxlc1JlcSA9ICpudW1Nb2R1bGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG51bU1vZHVsZXNSZXEgPiAwKSB7CisgICAgICAgICAgICAgICAgcmVwbHkucmVhZChwcm9wZXJ0aWVzLCBudW1Nb2R1bGVzUmVxICogc2l6ZW9mKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGF0dGFjaChyYWRpb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVJhZGlvQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd2l0aEF1ZGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElSYWRpbz4mIHJhZGlvKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGhhbmRsZSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoY2xpZW50KSk7CisgICAgICAgIEFMT0dWKCJhdHRhY2goKSBjb25maWcgJXAgd2l0aEF1ZGlvICVkIHJlZ2lvbiAlZCB0eXBlICVkIiwgY29uZmlnLCB3aXRoQXVkaW8sIGNvbmZpZy0+cmVnaW9uLCBjb25maWctPmJhbmQudHlwZSk7CisgICAgICAgIGlmIChjb25maWcgPT0gTlVMTCkgeworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOworICAgICAgICAgICAgZGF0YS53cml0ZShjb25maWcsIHNpemVvZihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcpKTsKKyAgICAgICAgfQorICAgICAgICBkYXRhLndyaXRlSW50MzIod2l0aEF1ZGlvID8gMSA6IDApOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQVRUQUNILCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAocmVwbHkucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgcmFkaW8gPSBpbnRlcmZhY2VfY2FzdDxJUmFkaW8+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9Cit9OworCitJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoUmFkaW9TZXJ2aWNlLCAiYW5kcm9pZC5oYXJkd2FyZS5JUmFkaW9TZXJ2aWNlIik7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdHVzX3QgQm5SYWRpb1NlcnZpY2U6Om9uVHJhbnNhY3QoCisgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKK3sKKyAgICBzd2l0Y2goY29kZSkgeworICAgICAgICBjYXNlIExJU1RfTU9EVUxFUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpb1NlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1Nb2R1bGVzUmVxID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGlmIChudW1Nb2R1bGVzUmVxID4gTUFYX0lURU1TX1BFUl9MSVNUKSB7CisgICAgICAgICAgICAgICAgbnVtTW9kdWxlc1JlcSA9IE1BWF9JVEVNU19QRVJfTElTVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1Nb2R1bGVzID0gbnVtTW9kdWxlc1JlcTsKKyAgICAgICAgICAgIHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzID0KKyAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzICopY2FsbG9jKG51bU1vZHVsZXNSZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMpKTsKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihOT19NRU1PUlkpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbGlzdE1vZHVsZXMocHJvcGVydGllcywgJm51bU1vZHVsZXMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG51bU1vZHVsZXMpOworICAgICAgICAgICAgQUxPR1YoIkxJU1RfTU9EVUxFUyBzdGF0dXMgJWQgZ290IG51bU1vZHVsZXMgJWQiLCBzdGF0dXMsIG51bU1vZHVsZXMpOworCisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgaWYgKG51bU1vZHVsZXNSZXEgPiBudW1Nb2R1bGVzKSB7CisgICAgICAgICAgICAgICAgICAgIG51bU1vZHVsZXNSZXEgPSBudW1Nb2R1bGVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUocHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtTW9kdWxlc1JlcSAqIHNpemVvZihzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShwcm9wZXJ0aWVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIEFUVEFDSDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpb1NlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJhZGlvX2hhbmRsZV90IGhhbmRsZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzcDxJUmFkaW9DbGllbnQ+IGNsaWVudCA9CisgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElSYWRpb0NsaWVudD4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnIGNvbmZpZzsKKyAgICAgICAgICAgIHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnUHRyID0gTlVMTDsKKyAgICAgICAgICAgIGlmIChkYXRhLnJlYWRJbnQzMigpICE9IDApIHsKKyAgICAgICAgICAgICAgICBkYXRhLnJlYWQoJmNvbmZpZywgc2l6ZW9mKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZykpOworICAgICAgICAgICAgICAgIGNvbmZpZ1B0ciA9ICZjb25maWc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sIHdpdGhBdWRpbyA9IGRhdGEucmVhZEludDMyKCkgIT0gMDsKKyAgICAgICAgICAgIEFMT0dWKCJBVFRBQ0ggY29uZmlnUHRyICVwIHdpdGhBdWRpbyAlZCIsIGNvbmZpZ1B0ciwgd2l0aEF1ZGlvKTsKKyAgICAgICAgICAgIHNwPElSYWRpbz4gcmFkaW87CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdHRhY2goaGFuZGxlLCBjbGllbnQsIGNvbmZpZ1B0ciwgd2l0aEF1ZGlvLCByYWRpbyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHJhZGlvICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigxKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIocmFkaW8pKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvcmFkaW8vUmFkaW8uY3BwIGIvcmFkaW8vUmFkaW8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNTU0YzIKLS0tIC9kZXYvbnVsbAorKysgYi9yYWRpby9SYWRpby5jcHAKQEAgLTAsMCArMSwyODMgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IChDKSAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjZGVmaW5lIExPR19UQUcgIlJhZGlvIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorCisjaW5jbHVkZSA8cmFkaW8vUmFkaW8uaD4KKyNpbmNsdWRlIDxyYWRpby9JUmFkaW8uaD4KKyNpbmNsdWRlIDxyYWRpby9JUmFkaW9TZXJ2aWNlLmg+CisjaW5jbHVkZSA8cmFkaW8vSVJhZGlvQ2xpZW50Lmg+CisjaW5jbHVkZSA8cmFkaW8vUmFkaW9DYWxsYmFjay5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisgICAgc3A8SVJhZGlvU2VydmljZT4gICAgICAgICAgZ1JhZGlvU2VydmljZTsKKyAgICBjb25zdCBpbnQgICAgICAgICAgICAgICAgICBrUmFkaW9TZXJ2aWNlUG9sbERlbGF5ID0gNTAwMDAwOyAvLyAwLjVzCisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAga1JhZGlvU2VydmljZU5hbWUgICAgICA9ICJtZWRpYS5yYWRpbyI7CisgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgZ0xvY2s7CisKKyAgICBjbGFzcyBEZWF0aE5vdGlmaWVyIDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgRGVhdGhOb3RpZmllcigpIHsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpIHsKKyAgICAgICAgICAgIEFMT0dWKCJiaW5kZXJEaWVkIik7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOworICAgICAgICAgICAgZ1JhZGlvU2VydmljZS5jbGVhcigpOworICAgICAgICAgICAgQUxPR1coIlJhZGlvIHNlcnZpY2UgZGllZCEiKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBzcDxEZWF0aE5vdGlmaWVyPiAgICAgICAgIGdEZWF0aE5vdGlmaWVyOworfTsgLy8gbmFtZXNwYWNlIGFub255bW91cworCitjb25zdCBzcDxJUmFkaW9TZXJ2aWNlPiYgUmFkaW86OmdldFJhZGlvU2VydmljZSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrKTsKKyAgICBpZiAoZ1JhZGlvU2VydmljZS5nZXQoKSA9PSAwKSB7CisgICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyOworICAgICAgICBkbyB7CisgICAgICAgICAgICBiaW5kZXIgPSBzbS0+Z2V0U2VydmljZShTdHJpbmcxNihrUmFkaW9TZXJ2aWNlTmFtZSkpOworICAgICAgICAgICAgaWYgKGJpbmRlciAhPSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVygiUmFkaW9TZXJ2aWNlIG5vdCBwdWJsaXNoZWQsIHdhaXRpbmcuLi4iKTsKKyAgICAgICAgICAgIHVzbGVlcChrUmFkaW9TZXJ2aWNlUG9sbERlbGF5KTsKKyAgICAgICAgfSB3aGlsZSh0cnVlKTsKKyAgICAgICAgaWYgKGdEZWF0aE5vdGlmaWVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGdEZWF0aE5vdGlmaWVyID0gbmV3IERlYXRoTm90aWZpZXIoKTsKKyAgICAgICAgfQorICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKGdEZWF0aE5vdGlmaWVyKTsKKyAgICAgICAgZ1JhZGlvU2VydmljZSA9IGludGVyZmFjZV9jYXN0PElSYWRpb1NlcnZpY2U+KGJpbmRlcik7CisgICAgfQorICAgIEFMT0dFX0lGKGdSYWRpb1NlcnZpY2UgPT0gMCwgIm5vIFJhZGlvU2VydmljZSE/Iik7CisgICAgcmV0dXJuIGdSYWRpb1NlcnZpY2U7Cit9CisKKy8vIFN0YXRpYyBtZXRob2RzCitzdGF0dXNfdCBSYWRpbzo6bGlzdE1vZHVsZXMoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgKnByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpCit7CisgICAgQUxPR1YoImxpc3RNb2R1bGVzKCkiKTsKKyAgICBjb25zdCBzcDxJUmFkaW9TZXJ2aWNlPiYgc2VydmljZSA9IGdldFJhZGlvU2VydmljZSgpOworICAgIGlmIChzZXJ2aWNlID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBzZXJ2aWNlLT5saXN0TW9kdWxlcyhwcm9wZXJ0aWVzLCBudW1Nb2R1bGVzKTsKK30KKworc3A8UmFkaW8+IFJhZGlvOjphdHRhY2gocmFkaW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdpdGhBdWRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFJhZGlvQ2FsbGJhY2s+JiBjYWxsYmFjaykKK3sKKyAgICBBTE9HVigiYXR0YWNoKCkiKTsKKyAgICBzcDxSYWRpbz4gcmFkaW87CisgICAgY29uc3Qgc3A8SVJhZGlvU2VydmljZT4mIHNlcnZpY2UgPSBnZXRSYWRpb1NlcnZpY2UoKTsKKyAgICBpZiAoc2VydmljZSA9PSAwKSB7CisgICAgICAgIHJldHVybiByYWRpbzsKKyAgICB9CisgICAgcmFkaW8gPSBuZXcgUmFkaW8oaGFuZGxlLCBjYWxsYmFjayk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2VydmljZS0+YXR0YWNoKGhhbmRsZSwgcmFkaW8sIGNvbmZpZywgd2l0aEF1ZGlvLCByYWRpby0+bUlSYWRpbyk7CisKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHJhZGlvLT5tSVJhZGlvICE9IDApIHsKKyAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIocmFkaW8tPm1JUmFkaW8pLT5saW5rVG9EZWF0aChyYWRpbyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coIkVycm9yICVkIGNvbm5lY3RpbmcgdG8gcmFkaW8gc2VydmljZSIsIHN0YXR1cyk7CisgICAgICAgIHJhZGlvLmNsZWFyKCk7CisgICAgfQorICAgIHJldHVybiByYWRpbzsKK30KKworCisKKy8vIFJhZGlvCitSYWRpbzo6UmFkaW8ocmFkaW9faGFuZGxlX3QgaGFuZGxlLCBjb25zdCBzcDxSYWRpb0NhbGxiYWNrPiYgY2FsbGJhY2spCisgICAgOiBtSGFuZGxlKGhhbmRsZSksIG1DYWxsYmFjayhjYWxsYmFjaykKK3sKK30KKworUmFkaW86On5SYWRpbygpCit7CisgICAgaWYgKG1JUmFkaW8gIT0gMCkgeworICAgICAgICBtSVJhZGlvLT5kZXRhY2goKTsKKyAgICB9Cit9CisKKwordm9pZCBSYWRpbzo6ZGV0YWNoKCkgeworICAgIEFMT0dWKCJkZXRhY2goKSIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUNhbGxiYWNrLmNsZWFyKCk7CisgICAgaWYgKG1JUmFkaW8gIT0gMCkgeworICAgICAgICBtSVJhZGlvLT5kZXRhY2goKTsKKyAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUlSYWRpbyktPnVubGlua1RvRGVhdGgodGhpcyk7CisgICAgICAgIG1JUmFkaW8gPSAwOworICAgIH0KK30KKworc3RhdHVzX3QgUmFkaW86OnNldENvbmZpZ3VyYXRpb24oY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUlSYWRpbyA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUlSYWRpby0+c2V0Q29uZmlndXJhdGlvbihjb25maWcpOworfQorCitzdGF0dXNfdCBSYWRpbzo6Z2V0Q29uZmlndXJhdGlvbihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtSVJhZGlvID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtSVJhZGlvLT5nZXRDb25maWd1cmF0aW9uKGNvbmZpZyk7Cit9CisKK3N0YXR1c190IFJhZGlvOjpzZXRNdXRlKGJvb2wgbXV0ZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtSVJhZGlvID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtSVJhZGlvLT5zZXRNdXRlKG11dGUpOworfQorCitzdGF0dXNfdCBSYWRpbzo6Z2V0TXV0ZShib29sICptdXRlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1JUmFkaW8gPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1JUmFkaW8tPmdldE11dGUobXV0ZSk7Cit9CisKK3N0YXR1c190IFJhZGlvOjpzY2FuKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViY2hhbm5lbCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtSVJhZGlvID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtSVJhZGlvLT5zY2FuKGRpcmVjdGlvbiwgc2tpcFN1YmNoYW5uZWwpOworfQorCitzdGF0dXNfdCBSYWRpbzo6c3RlcChyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YmNoYW5uZWwpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUlSYWRpbyA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUlSYWRpby0+c3RlcChkaXJlY3Rpb24sIHNraXBTdWJjaGFubmVsKTsKK30KKworc3RhdHVzX3QgUmFkaW86OnR1bmUodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBzdWJDaGFubmVsKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1JUmFkaW8gPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1JUmFkaW8tPnR1bmUoY2hhbm5lbCwgc3ViQ2hhbm5lbCk7Cit9CisKK3N0YXR1c190IFJhZGlvOjpjYW5jZWwoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1JUmFkaW8gPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1JUmFkaW8tPmNhbmNlbCgpOworfQorCitzdGF0dXNfdCBSYWRpbzo6Z2V0UHJvZ3JhbUluZm9ybWF0aW9uKHN0cnVjdCByYWRpb19wcm9ncmFtX2luZm8gKmluZm8pCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUlSYWRpbyA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUlSYWRpby0+Z2V0UHJvZ3JhbUluZm9ybWF0aW9uKGluZm8pOworfQorCitzdGF0dXNfdCBSYWRpbzo6aGFzQ29udHJvbChib29sICpoYXNDb250cm9sKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1JUmFkaW8gPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1JUmFkaW8tPmhhc0NvbnRyb2woaGFzQ29udHJvbCk7Cit9CisKKworLy8gQnBSYWRpb0NsaWVudAordm9pZCBSYWRpbzo6b25FdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCB8fCBldmVudE1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0cnVjdCByYWRpb19ldmVudCAqZXZlbnQgPSAoc3RydWN0IHJhZGlvX2V2ZW50ICopZXZlbnRNZW1vcnktPnBvaW50ZXIoKTsKKyAgICAvLyByZXN0b3JlIGxvY2FsIG1ldGFkYXRhIHBvaW50ZXIgZnJvbSBvZmZzZXQKKyAgICBzd2l0Y2ggKGV2ZW50LT50eXBlKSB7CisgICAgY2FzZSBSQURJT19FVkVOVF9UVU5FRDoKKyAgICBjYXNlIFJBRElPX0VWRU5UX0FGX1NXSVRDSDoKKyAgICAgICAgaWYgKGV2ZW50LT5pbmZvLm1ldGFkYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGV2ZW50LT5pbmZvLm1ldGFkYXRhID0KKyAgICAgICAgICAgICAgICAgICAgKHJhZGlvX21ldGFkYXRhX3QgKikoKGNoYXIgKilldmVudCArIChzaXplX3QpZXZlbnQtPmluZm8ubWV0YWRhdGEpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUkFESU9fRVZFTlRfTUVUQURBVEE6CisgICAgICAgIGlmIChldmVudC0+bWV0YWRhdGEgIT0gTlVMTCkgeworICAgICAgICAgICAgZXZlbnQtPm1ldGFkYXRhID0KKyAgICAgICAgICAgICAgICAgICAgKHJhZGlvX21ldGFkYXRhX3QgKikoKGNoYXIgKilldmVudCArIChzaXplX3QpZXZlbnQtPm1ldGFkYXRhKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAobUNhbGxiYWNrICE9IDApIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vbkV2ZW50KGV2ZW50KTsKKyAgICB9Cit9CisKKworLy9JQmluZGVyOjpEZWF0aFJlY2lwaWVudAordm9pZCBSYWRpbzo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBTE9HVygiUmFkaW8gc2VydmVyIGJpbmRlciBEaWVkICIpOworICAgIG1JUmFkaW8gPSAwOworICAgIHN0cnVjdCByYWRpb19ldmVudCBldmVudDsKKyAgICBtZW1zZXQoJmV2ZW50LCAwLCBzaXplb2Yoc3RydWN0IHJhZGlvX2V2ZW50KSk7CisgICAgZXZlbnQudHlwZSA9IFJBRElPX0VWRU5UX1NFUlZFUl9ESUVEOworICAgIGV2ZW50LnN0YXR1cyA9IERFQURfT0JKRUNUOworICAgIGlmIChtQ2FsbGJhY2sgIT0gMCkgeworICAgICAgICBtQ2FsbGJhY2stPm9uRXZlbnQoJmV2ZW50KTsKKyAgICB9Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCmluZGV4IDQ0ZDI1NTMuLmRlYmNkZjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCkBAIC0yOSwyOSArMjksMjggQEAKIAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLSMgQ2xhbmcrKyBhYm9ydHMgb24gQXVkaW9NaXhlci5jcHAsCi0jIGIvMTgzNzM4NjYsICJkbyBub3Qga25vdyBob3cgdG8gc3BsaXQgdGhpcyBvcGVyYXRvci4iCi1pZmVxICgkKGZpbHRlciAkKFRBUkdFVF9BUkNIKSxhcm0gYXJtNjQpLCQoVEFSR0VUX0FSQ0gpKQotICAgIExPQ0FMX0NMQU5HIDo9IGZhbHNlCi1lbmRpZgotCiBMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgIFwKICAgICBBdWRpb0ZsaW5nZXIuY3BwICAgICAgICAgICAgXAogICAgIFRocmVhZHMuY3BwICAgICAgICAgICAgICAgICBcCiAgICAgVHJhY2tzLmNwcCAgICAgICAgICAgICAgICAgIFwKKyAgICBBdWRpb0h3RGV2aWNlLmNwcCAgICAgICAgICAgXAorICAgIEF1ZGlvU3RyZWFtT3V0LmNwcCAgICAgICAgICBcCisgICAgU3BkaWZTdHJlYW1PdXQuY3BwICAgICAgICAgIFwKICAgICBFZmZlY3RzLmNwcCAgICAgICAgICAgICAgICAgXAogICAgIEF1ZGlvTWl4ZXIuY3BwLmFybSAgICAgICAgICBcCi0gICAgUGF0Y2hQYW5lbC5jcHAKLQotTE9DQUxfU1JDX0ZJTEVTICs9IFN0YXRlUXVldWUuY3BwCisgICAgQnVmZmVyUHJvdmlkZXJzLmNwcCAgICAgICAgIFwKKyAgICBQYXRjaFBhbmVsLmNwcCAgICAgICAgICAgICAgXAorICAgIFN0YXRlUXVldWUuY3BwCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgICQoVE9QRElSKWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kgXAorICAgICQoVE9QRElSKWV4dGVybmFsL3NvbmljIFwKICAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykgXAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGliYXVkaW9yZXNhbXBsZXIgXAorICAgIGxpYmF1ZGlvc3BkaWYgXAogICAgIGxpYmF1ZGlvdXRpbHMgXAogICAgIGxpYmNvbW1vbl90aW1lX2NsaWVudCBcCiAgICAgbGliY3V0aWxzIFwKQEAgLTY0LDcgKzYzLDggQEAKICAgICBsaWJoYXJkd2FyZV9sZWdhY3kgXAogICAgIGxpYmVmZmVjdHMgXAogICAgIGxpYnBvd2VybWFuYWdlciBcCi0gICAgbGlic2VydmljZXV0aWxpdHkKKyAgICBsaWJzZXJ2aWNldXRpbGl0eSBcCisgICAgbGlic29uaWMKIAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgbGlic2NoZWR1bGluZ19wb2xpY3kgXApAQCAtNzQsOSArNzQsMTcgQEAKIExPQ0FMX01PRFVMRTo9IGxpYmF1ZGlvZmxpbmdlcgogTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQogCi1MT0NBTF9TUkNfRklMRVMgKz0gRmFzdE1peGVyLmNwcCBGYXN0TWl4ZXJTdGF0ZS5jcHAgQXVkaW9XYXRjaGRvZy5jcHAKLUxPQ0FMX1NSQ19GSUxFUyArPSBGYXN0VGhyZWFkLmNwcCBGYXN0VGhyZWFkU3RhdGUuY3BwCi1MT0NBTF9TUkNfRklMRVMgKz0gRmFzdENhcHR1cmUuY3BwIEZhc3RDYXB0dXJlU3RhdGUuY3BwCitMT0NBTF9TUkNfRklMRVMgKz0gXAorICAgIEF1ZGlvV2F0Y2hkb2cuY3BwICAgICAgICBcCisgICAgRmFzdENhcHR1cmUuY3BwICAgICAgICAgIFwKKyAgICBGYXN0Q2FwdHVyZUR1bXBTdGF0ZS5jcHAgXAorICAgIEZhc3RDYXB0dXJlU3RhdGUuY3BwICAgICBcCisgICAgRmFzdE1peGVyLmNwcCAgICAgICAgICAgIFwKKyAgICBGYXN0TWl4ZXJEdW1wU3RhdGUuY3BwICAgXAorICAgIEZhc3RNaXhlclN0YXRlLmNwcCAgICAgICBcCisgICAgRmFzdFRocmVhZC5jcHAgICAgICAgICAgIFwKKyAgICBGYXN0VGhyZWFkRHVtcFN0YXRlLmNwcCAgXAorICAgIEZhc3RUaHJlYWRTdGF0ZS5jcHAKIAogTE9DQUxfQ0ZMQUdTICs9IC1EU1RBVEVfUVVFVUVfSU5TVEFOVElBVElPTlM9JyJTdGF0ZVF1ZXVlSW5zdGFudGlhdGlvbnMuY3BwIicKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAppbmRleCAxOGJhMWFlLi45ZWM1ODAyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcApAQCAtNDUsNiArNDUsOCBAQAogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgogI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKIAorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CisKICNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgogI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X3Zpc3VhbGl6ZXIuaD4KICNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9ucy5oPgpAQCAtMTc5LDEzICsxODEsMTQgQEAKICAgICAgIG1Jc0xvd1JhbURldmljZSh0cnVlKSwKICAgICAgIG1Jc0RldmljZVR5cGVLbm93bihmYWxzZSksCiAgICAgICBtR2xvYmFsRWZmZWN0RW5hYmxlVGltZSgwKSwKLSAgICAgIG1QcmltYXJ5T3V0cHV0U2FtcGxlUmF0ZSgwKQorICAgICAgbVN5c3RlbVJlYWR5KGZhbHNlKQogewogICAgIGdldHBpZF9jYWNoZWQgPSBnZXRwaWQoKTsKICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CiAgICAgYm9vbCBkb0xvZyA9IChwcm9wZXJ0eV9nZXQoInJvLnRlc3RfaGFybmVzcyIsIHZhbHVlLCAiMCIpID4gMCkgJiYgKGF0b2kodmFsdWUpID09IDEpOwogICAgIGlmIChkb0xvZykgewotICAgICAgICBtTG9nTWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihrTG9nTWVtb3J5U2l6ZSwgIkxvZ1dyaXRlcnMiLCBNZW1vcnlIZWFwQmFzZTo6UkVBRF9PTkxZKTsKKyAgICAgICAgbUxvZ01lbW9yeURlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIoa0xvZ01lbW9yeVNpemUsICJMb2dXcml0ZXJzIiwKKyAgICAgICAgICAgICAgICBNZW1vcnlIZWFwQmFzZTo6UkVBRF9PTkxZKTsKICAgICB9CiAKICNpZmRlZiBURUVfU0lOSwpAQCAtMjcxLDcgKzI3NCw3IEBACiB9OwogI2RlZmluZSBBUlJBWV9TSVpFKHgpIChzaXplb2YoKHgpKS9zaXplb2YoKCh4KVswXSkpKQogCi1BdWRpb0ZsaW5nZXI6OkF1ZGlvSHdEZXZpY2UqIEF1ZGlvRmxpbmdlcjo6ZmluZFN1aXRhYmxlSHdEZXZfbCgKK0F1ZGlvSHdEZXZpY2UqIEF1ZGlvRmxpbmdlcjo6ZmluZFN1aXRhYmxlSHdEZXZfbCgKICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMpCiB7CkBAIC00MDEsNiArNDA0LDkgQEAKICAgICAgICAgICAgIFN0cmluZzggcmVzdWx0KGtDbGllbnRMb2NrZWRTdHJpbmcpOwogICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgICAgIH0KKworICAgICAgICBFZmZlY3REdW1wRWZmZWN0cyhmZCk7CisKICAgICAgICAgZHVtcENsaWVudHMoZmQsIGFyZ3MpOwogICAgICAgICBpZiAoY2xpZW50TG9ja2VkKSB7CiAgICAgICAgICAgICBtQ2xpZW50TG9jay51bmxvY2soKTsKQEAgLTgyNiwxNCArODMyLDIwIEBACiAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotCisgICAgYm9vbCBtdXRlID0gdHJ1ZTsKICAgICBib29sIHN0YXRlID0gQVVESU9fTU9ERV9JTlZBTElEOwogICAgIEF1dG9NdXRleCBsb2NrKG1IYXJkd2FyZUxvY2spOwotICAgIGF1ZGlvX2h3X2RldmljZV90ICpkZXYgPSBtUHJpbWFyeUhhcmR3YXJlRGV2LT5od0RldmljZSgpOwogICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0dFVF9NSUNfTVVURTsKLSAgICBkZXYtPmdldF9taWNfbXV0ZShkZXYsICZzdGF0ZSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Id0RldnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmRldiA9IG1BdWRpb0h3RGV2cy52YWx1ZUF0KGkpLT5od0RldmljZSgpOworICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBkZXYtPmdldF9taWNfbXV0ZShkZXYsICZzdGF0ZSk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG11dGUgPSBtdXRlICYmIHN0YXRlOworICAgICAgICB9CisgICAgfQogICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7Ci0gICAgcmV0dXJuIHN0YXRlOworCisgICAgcmV0dXJuIG11dGU7CiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0TWFzdGVyTXV0ZShib29sIG11dGVkKQpAQCAtMTAwOSw2ICsxMDIxLDE0IEBACiAgICAgcmV0dXJuIHN0cmVhbU11dGVfbChzdHJlYW0pOwogfQogCisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpicm9hY2FzdFBhcmFtZXRlcnNUb1JlY29yZFRocmVhZHNfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVJlY29yZFRocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbVJlY29yZFRocmVhZHMudmFsdWVBdChpKS0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKKyAgICB9Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykKIHsKICAgICBBTE9HVigic2V0UGFyYW1ldGVycygpOiBpbyAlZCwga2V5dmFsdWUgJXMsIGNhbGxpbmcgcGlkICVkIiwKQEAgLTEwODMsOSArMTEwMyw3IEBACiAgICAgICAgICAgICBpbnQgdmFsdWU7CiAgICAgICAgICAgICBpZiAoKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgdmFsdWUpID09IE5PX0VSUk9SKSAmJgogICAgICAgICAgICAgICAgICAgICAodmFsdWUgIT0gMCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1SZWNvcmRUaHJlYWRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1SZWNvcmRUaHJlYWRzLnZhbHVlQXQoaSktPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlycyk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyb2FjYXN0UGFyYW1ldGVyc1RvUmVjb3JkVGhyZWFkc19sKGtleVZhbHVlUGFpcnMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTEzOCwxOSArMTE1Niw0NiBAQAogICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQorICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkgfHwgIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKICAgICBBdXRvTXV0ZXggbG9jayhtSGFyZHdhcmVMb2NrKTsKICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19HRVRfSU5QVVRfQlVGRkVSX1NJWkU7Ci0gICAgYXVkaW9fY29uZmlnX3QgY29uZmlnOwotICAgIG1lbXNldCgmY29uZmlnLCAwLCBzaXplb2YoY29uZmlnKSk7Ci0gICAgY29uZmlnLnNhbXBsZV9yYXRlID0gc2FtcGxlUmF0ZTsKLSAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2s7Ci0gICAgY29uZmlnLmZvcm1hdCA9IGZvcm1hdDsKKyAgICBhdWRpb19jb25maWdfdCBjb25maWcsIHByb3Bvc2VkOworICAgIG1lbXNldCgmcHJvcG9zZWQsIDAsIHNpemVvZihwcm9wb3NlZCkpOworICAgIHByb3Bvc2VkLnNhbXBsZV9yYXRlID0gc2FtcGxlUmF0ZTsKKyAgICBwcm9wb3NlZC5jaGFubmVsX21hc2sgPSBjaGFubmVsTWFzazsKKyAgICBwcm9wb3NlZC5mb3JtYXQgPSBmb3JtYXQ7CiAKICAgICBhdWRpb19od19kZXZpY2VfdCAqZGV2ID0gbVByaW1hcnlIYXJkd2FyZURldi0+aHdEZXZpY2UoKTsKLSAgICBzaXplX3Qgc2l6ZSA9IGRldi0+Z2V0X2lucHV0X2J1ZmZlcl9zaXplKGRldiwgJmNvbmZpZyk7CisgICAgc2l6ZV90IGZyYW1lczsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8vIE5vdGU6IGNvbmZpZyBpcyBjdXJyZW50bHkgYSBjb25zdCBwYXJhbWV0ZXIgZm9yIGdldF9pbnB1dF9idWZmZXJfc2l6ZSgpCisgICAgICAgIC8vIGJ1dCB3ZSB1c2UgYSBjb3B5IGZyb20gcHJvcG9zZWQgaW4gY2FzZSBjb25maWcgY2hhbmdlcyBmcm9tIHRoZSBjYWxsLgorICAgICAgICBjb25maWcgPSBwcm9wb3NlZDsKKyAgICAgICAgZnJhbWVzID0gZGV2LT5nZXRfaW5wdXRfYnVmZmVyX3NpemUoZGV2LCAmY29uZmlnKTsKKyAgICAgICAgaWYgKGZyYW1lcyAhPSAwKSB7CisgICAgICAgICAgICBicmVhazsgLy8gaGFsIHN1Y2Nlc3MsIGNvbmZpZyBpcyB0aGUgcmVzdWx0CisgICAgICAgIH0KKyAgICAgICAgLy8gY2hhbmdlIG9uZSBwYXJhbWV0ZXIgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZWFjaCBpdGVyYXRpb24gdG8gYSBtb3JlICJjb21tb24iIHZhbHVlCisgICAgICAgIC8vIHRvIHNlZSBpZiB0aGUgZGV2aWNlIHdpbGwgc3VwcG9ydCBpdC4KKyAgICAgICAgaWYgKHByb3Bvc2VkLmZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgeworICAgICAgICAgICAgcHJvcG9zZWQuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgICAgIH0gZWxzZSBpZiAocHJvcG9zZWQuc2FtcGxlX3JhdGUgIT0gNDQxMDApIHsgLy8gNDQuMSBpcyBjbGFpbWVkIGFzIG11c3QgaW4gQ0REIGFzIHdlbGwgYXMKKyAgICAgICAgICAgIHByb3Bvc2VkLnNhbXBsZV9yYXRlID0gNDQxMDA7ICAgICAgICAgICAvLyBsZWdhY3kgQXVkaW9SZWNvcmQuamF2YS4gVE9ETzogUXVlcnkgaHc/CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRCdWZmZXJTaXplIGZhaWxlZCB3aXRoIG1pbmltdW0gYnVmZmVyIHNpemUgc2FtcGxlUmF0ZSAldSwgIgorICAgICAgICAgICAgICAgICAgICAiZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgMHglWCIsCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2spOworICAgICAgICAgICAgYnJlYWs7IC8vIHJldHJpZXMgZmFpbGVkLCBicmVhayBvdXQgb2YgbG9vcCB3aXRoIGZyYW1lcyA9PSAwLgorICAgICAgICB9CisgICAgfQogICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7Ci0gICAgcmV0dXJuIHNpemU7CisgICAgaWYgKGZyYW1lcyA+IDAgJiYgY29uZmlnLnNhbXBsZV9yYXRlICE9IHNhbXBsZVJhdGUpIHsKKyAgICAgICAgZnJhbWVzID0gZGVzdGluYXRpb25GcmFtZXNQb3NzaWJsZShmcmFtZXMsIHNhbXBsZVJhdGUsIGNvbmZpZy5zYW1wbGVfcmF0ZSk7CisgICAgfQorICAgIHJldHVybiBmcmFtZXM7IC8vIG1heSBiZSBjb252ZXJ0ZWQgdG8gYnl0ZXMgYXQgdGhlIEphdmEgbGV2ZWwuCiB9CiAKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6Z2V0SW5wdXRGcmFtZXNMb3N0KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdApAQCAtMTIwNiwxMSArMTI1MSw5IEBACiAgICAgaWYgKGNsaWVudCA9PSAwKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgYm9vbCBjbGllbnRBZGRlZCA9IGZhbHNlOworICAgIHBpZF90IHBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfY2wobUNsaWVudExvY2spOwotCi0gICAgICAgIHBpZF90IHBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkocGlkKSA8IDApIHsKICAgICAgICAgICAgIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4gbm90aWZpY2F0aW9uQ2xpZW50ID0gbmV3IE5vdGlmaWNhdGlvbkNsaWVudCh0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsCkBAIC0xMjIxLDIyICsxMjY0LDE5IEBACiAKICAgICAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKGNsaWVudCk7CiAgICAgICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKG5vdGlmaWNhdGlvbkNsaWVudCk7Ci0gICAgICAgICAgICBjbGllbnRBZGRlZCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBtQ2xpZW50TG9jayBzaG91bGQgbm90IGJlIGhlbGQgaGVyZSBiZWNhdXNlIFRocmVhZEJhc2U6OnNlbmRJb0NvbmZpZ0V2ZW50KCkgd2lsbCBsb2NrIHRoZQogICAgIC8vIFRocmVhZEJhc2UgbXV0ZXggYW5kIHRoZSBsb2NraW5nIG9yZGVyIGlzIFRocmVhZEJhc2U6Om1Mb2NrIHRoZW4gQXVkaW9GbGluZ2VyOjptQ2xpZW50TG9jay4KLSAgICBpZiAoY2xpZW50QWRkZWQpIHsKLSAgICAgICAgLy8gdGhlIGNvbmZpZyBjaGFuZ2UgaXMgYWx3YXlzIHNlbnQgZnJvbSBwbGF5YmFjayBvciByZWNvcmQgdGhyZWFkcyB0byBhdm9pZCBkZWFkbG9jawotICAgICAgICAvLyB3aXRoIEF1ZGlvU3lzdGVtOjpnTG9jawotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS0+c2VuZElvQ29uZmlnRXZlbnQoQXVkaW9TeXN0ZW06Ok9VVFBVVF9PUEVORUQpOwotICAgICAgICB9CisgICAgLy8gdGhlIGNvbmZpZyBjaGFuZ2UgaXMgYWx3YXlzIHNlbnQgZnJvbSBwbGF5YmFjayBvciByZWNvcmQgdGhyZWFkcyB0byBhdm9pZCBkZWFkbG9jaworICAgIC8vIHdpdGggQXVkaW9TeXN0ZW06OmdMb2NrCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS0+c2VuZElvQ29uZmlnRXZlbnQoQVVESU9fT1VUUFVUX09QRU5FRCwgcGlkKTsKKyAgICB9CiAKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVjb3JkVGhyZWFkcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgbVJlY29yZFRocmVhZHMudmFsdWVBdChpKS0+c2VuZElvQ29uZmlnRXZlbnQoQXVkaW9TeXN0ZW06OklOUFVUX09QRU5FRCk7Ci0gICAgICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1SZWNvcmRUaHJlYWRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1SZWNvcmRUaHJlYWRzLnZhbHVlQXQoaSktPnNlbmRJb0NvbmZpZ0V2ZW50KEFVRElPX0lOUFVUX09QRU5FRCwgcGlkKTsKICAgICB9CiB9CiAKQEAgLTEyNjksMTQgKzEzMDksMTYgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjphdWRpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3Qgdm9pZCAqcGFyYW0yKQordm9pZCBBdWRpb0ZsaW5nZXI6OmlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiYgaW9EZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DbGllbnRMb2NrKTsKICAgICBzaXplX3Qgc2l6ZSA9IG1Ob3RpZmljYXRpb25DbGllbnRzLnNpemUoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUF0KGkpLT5hdWRpb0ZsaW5nZXJDbGllbnQoKS0+aW9Db25maWdDaGFuZ2VkKGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbTIpOworICAgICAgICBpZiAoKHBpZCA9PSAwKSB8fCAobU5vdGlmaWNhdGlvbkNsaWVudHMua2V5QXQoaSkgPT0gcGlkKSkgeworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVBdChpKS0+YXVkaW9GbGluZ2VyQ2xpZW50KCktPmlvQ29uZmlnQ2hhbmdlZChldmVudCwgaW9EZXNjKTsKKyAgICAgICAgfQogICAgIH0KIH0KIApAQCAtMTM4NSw5ICsxNDI3LDExIEBACiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAogICAgICAgICBzaXplX3QgKmZyYW1lQ291bnQsCiAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICBwaWRfdCB0aWQsCisgICAgICAgIGludCBjbGllbnRVaWQsCiAgICAgICAgIGludCAqc2Vzc2lvbklkLAogICAgICAgICBzaXplX3QgKm5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgc3A8SU1lbW9yeT4mIGNibGssCkBAIC0xNDA0LDcgKzE0NDgsNyBAQAogICAgIGJ1ZmZlcnMuY2xlYXIoKTsKIAogICAgIC8vIGNoZWNrIGNhbGxpbmcgcGVybWlzc2lvbnMKLSAgICBpZiAoIXJlY29yZGluZ0FsbG93ZWQoKSkgeworICAgIGlmICghcmVjb3JkaW5nQWxsb3dlZChvcFBhY2thZ2VOYW1lKSkgewogICAgICAgICBBTE9HRSgib3BlblJlY29yZCgpIHBlcm1pc3Npb24gZGVuaWVkOiByZWNvcmRpbmcgbm90IGFsbG93ZWQiKTsKICAgICAgICAgbFN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwogICAgICAgICBnb3RvIEV4aXQ7CkBAIC0xNDE3LDkgKzE0NjEsOCBAQAogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCi0gICAgLy8gd2UgZG9uJ3QgeWV0IHN1cHBvcnQgYW55dGhpbmcgb3RoZXIgdGhhbiAxNi1iaXQgUENNCi0gICAgaWYgKCEoYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkgJiYKLSAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSAmJiBmb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpKSB7CisgICAgLy8gd2UgZG9uJ3QgeWV0IHN1cHBvcnQgYW55dGhpbmcgb3RoZXIgdGhhbiBsaW5lYXIgUENNCisgICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQoZm9ybWF0KSB8fCAhYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CiAgICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkKCkgaW52YWxpZCBmb3JtYXQgJSN4IiwgZm9ybWF0KTsKICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBFeGl0OwpAQCAtMTQ1OCw4ICsxNTAxLDcgQEAKICAgICAgICAgLy8gVE9ETzogdGhlIHVpZCBzaG91bGQgYmUgcGFzc2VkIGluIGFzIGEgcGFyYW1ldGVyIHRvIG9wZW5SZWNvcmQKICAgICAgICAgcmVjb3JkVHJhY2sgPSB0aHJlYWQtPmNyZWF0ZVJlY29yZFRyYWNrX2woY2xpZW50LCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBsU2Vzc2lvbklkLCBub3RpZmljYXRpb25GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIHRpZCwgJmxTdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRVaWQsIGZsYWdzLCB0aWQsICZsU3RhdHVzKTsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigobFN0YXR1cyA9PSBOT19FUlJPUikgJiYgKHJlY29yZFRyYWNrID09IDApKTsKIAogICAgICAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUikgewpAQCAtMTY3OCw2ICsxNzIwLDI2IEBACiAgICAgcmV0dXJuIChhdWRpb19od19zeW5jX3QpdmFsdWU7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6c3lzdGVtUmVhZHkoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQUxPR0koIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICBpZiAobVN5c3RlbVJlYWR5KSB7CisgICAgICAgIEFMT0dXKCIlcyBjYWxsZWQgdHdpY2UiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIG1TeXN0ZW1SZWFkeSA9IHRydWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIFRocmVhZEJhc2UgKnRocmVhZCA9IChUaHJlYWRCYXNlICopbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLmdldCgpOworICAgICAgICB0aHJlYWQtPnN5c3RlbVJlYWR5KCk7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVJlY29yZFRocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgVGhyZWFkQmFzZSAqdGhyZWFkID0gKFRocmVhZEJhc2UgKiltUmVjb3JkVGhyZWFkcy52YWx1ZUF0KGkpLmdldCgpOworICAgICAgICB0aHJlYWQtPnN5c3RlbVJlYWR5KCk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwogLy8gc2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAogdm9pZCBBdWRpb0ZsaW5nZXI6OnNldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbl9sKFBsYXliYWNrVGhyZWFkICp0aHJlYWQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpCiB7CkBAIC0xNzE0LDggKzE3NzYsNiBAQAogCiAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfT1VUUFVUX09QRU47CiAKLSAgICBhdWRpb19zdHJlYW1fb3V0X3QgKm91dFN0cmVhbSA9IE5VTEw7Ci0KICAgICAvLyBGT1IgVEVTVElORyBPTkxZOgogICAgIC8vIFRoaXMgaWYgc3RhdGVtZW50IGFsbG93cyBvdmVycmlkaW5nIHRoZSBhdWRpbyBwb2xpY3kgc2V0dGluZ3MKICAgICAvLyBhbmQgZm9yY2luZyBhIHNwZWNpZmljIGZvcm1hdCBvciBjaGFubmVsIG1hc2sgdG8gdGhlIEhBTC9TaW5rIGRldmljZSBmb3IgdGVzdGluZy4KQEAgLTE3MzcsMzcgKzE3OTcsMzAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHN0YXR1c190IHN0YXR1cyA9IGh3RGV2SGFsLT5vcGVuX291dHB1dF9zdHJlYW0oaHdEZXZIYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCkpOworICAgIEF1ZGlvU3RyZWFtT3V0ICpvdXRwdXRTdHJlYW0gPSBOVUxMOworICAgIHN0YXR1c190IHN0YXR1cyA9IG91dEh3RGV2LT5vcGVuT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgJm91dHB1dFN0cmVhbSwKKyAgICAgICAgICAgICpvdXRwdXQsCisgICAgICAgICAgICBkZXZpY2VzLAorICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICBjb25maWcsCisgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpKTsKIAogICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7Ci0gICAgQUxPR1YoIm9wZW5PdXRwdXRfbCgpIG9wZW5PdXRwdXRTdHJlYW0gcmV0dXJuZWQgb3V0cHV0ICVwLCBzYW1wbGVSYXRlICVkLCBGb3JtYXQgJSN4LCAiCi0gICAgICAgICAgICAiY2hhbm5lbE1hc2sgJSN4LCBzdGF0dXMgJWQiLAotICAgICAgICAgICAgb3V0U3RyZWFtLAotICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LAotICAgICAgICAgICAgY29uZmlnLT5jaGFubmVsX21hc2ssCi0gICAgICAgICAgICBzdGF0dXMpOwogCi0gICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBvdXRTdHJlYW0gIT0gTlVMTCkgewotICAgICAgICBBdWRpb1N0cmVhbU91dCAqb3V0cHV0U3RyZWFtID0gbmV3IEF1ZGlvU3RyZWFtT3V0KG91dEh3RGV2LCBvdXRTdHJlYW0sIGZsYWdzKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAKICAgICAgICAgUGxheWJhY2tUaHJlYWQgKnRocmVhZDsKICAgICAgICAgaWYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgewotICAgICAgICAgICAgdGhyZWFkID0gbmV3IE9mZmxvYWRUaHJlYWQodGhpcywgb3V0cHV0U3RyZWFtLCAqb3V0cHV0LCBkZXZpY2VzKTsKKyAgICAgICAgICAgIHRocmVhZCA9IG5ldyBPZmZsb2FkVGhyZWFkKHRoaXMsIG91dHB1dFN0cmVhbSwgKm91dHB1dCwgZGV2aWNlcywgbVN5c3RlbVJlYWR5KTsKICAgICAgICAgICAgIEFMT0dWKCJvcGVuT3V0cHV0X2woKSBjcmVhdGVkIG9mZmxvYWQgb3V0cHV0OiBJRCAlZCB0aHJlYWQgJXAiLCAqb3V0cHV0LCB0aHJlYWQpOwogICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkKICAgICAgICAgICAgICAgICB8fCAhaXNWYWxpZFBjbVNpbmtGb3JtYXQoY29uZmlnLT5mb3JtYXQpCiAgICAgICAgICAgICAgICAgfHwgIWlzVmFsaWRQY21TaW5rQ2hhbm5lbE1hc2soY29uZmlnLT5jaGFubmVsX21hc2spKSB7Ci0gICAgICAgICAgICB0aHJlYWQgPSBuZXcgRGlyZWN0T3V0cHV0VGhyZWFkKHRoaXMsIG91dHB1dFN0cmVhbSwgKm91dHB1dCwgZGV2aWNlcyk7CisgICAgICAgICAgICB0aHJlYWQgPSBuZXcgRGlyZWN0T3V0cHV0VGhyZWFkKHRoaXMsIG91dHB1dFN0cmVhbSwgKm91dHB1dCwgZGV2aWNlcywgbVN5c3RlbVJlYWR5KTsKICAgICAgICAgICAgIEFMT0dWKCJvcGVuT3V0cHV0X2woKSBjcmVhdGVkIGRpcmVjdCBvdXRwdXQ6IElEICVkIHRocmVhZCAlcCIsICpvdXRwdXQsIHRocmVhZCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJlYWQgPSBuZXcgTWl4ZXJUaHJlYWQodGhpcywgb3V0cHV0U3RyZWFtLCAqb3V0cHV0LCBkZXZpY2VzKTsKKyAgICAgICAgICAgIHRocmVhZCA9IG5ldyBNaXhlclRocmVhZCh0aGlzLCBvdXRwdXRTdHJlYW0sICpvdXRwdXQsIGRldmljZXMsIG1TeXN0ZW1SZWFkeSk7CiAgICAgICAgICAgICBBTE9HVigib3Blbk91dHB1dF9sKCkgY3JlYXRlZCBtaXhlciBvdXRwdXQ6IElEICVkIHRocmVhZCAlcCIsICpvdXRwdXQsIHRocmVhZCk7CiAgICAgICAgIH0KICAgICAgICAgbVBsYXliYWNrVGhyZWFkcy5hZGQoKm91dHB1dCwgdGhyZWFkKTsKQEAgLTE3ODUsNyArMTgzOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmxhdGVuY3lNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKIHsKLSAgICBBTE9HVigib3Blbk91dHB1dCgpLCBtb2R1bGUgJWQgRGV2aWNlICV4LCBTYW1wbGluZ1JhdGUgJWQsIEZvcm1hdCAlIzA4eCwgQ2hhbm5lbHMgJXgsIGZsYWdzICV4IiwKKyAgICBBTE9HSSgib3Blbk91dHB1dCgpLCBtb2R1bGUgJWQgRGV2aWNlICV4LCBTYW1wbGluZ1JhdGUgJWQsIEZvcm1hdCAlIzA4eCwgQ2hhbm5lbHMgJXgsIGZsYWdzICV4IiwKICAgICAgICAgICAgICAgbW9kdWxlLAogICAgICAgICAgICAgICAoZGV2aWNlcyAhPSBOVUxMKSA/ICpkZXZpY2VzIDogMCwKICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwKQEAgLTE4MDQsNyArMTg1Nyw3IEBACiAgICAgICAgICpsYXRlbmN5TXMgPSB0aHJlYWQtPmxhdGVuY3koKTsKIAogICAgICAgICAvLyBub3RpZnkgY2xpZW50IHByb2Nlc3NlcyBvZiB0aGUgbmV3IG91dHB1dCBjcmVhdGlvbgotICAgICAgICB0aHJlYWQtPmF1ZGlvQ29uZmlnQ2hhbmdlZChBdWRpb1N5c3RlbTo6T1VUUFVUX09QRU5FRCk7CisgICAgICAgIHRocmVhZC0+aW9Db25maWdDaGFuZ2VkKEFVRElPX09VVFBVVF9PUEVORUQpOwogCiAgICAgICAgIC8vIHRoZSBmaXJzdCBwcmltYXJ5IG91dHB1dCBvcGVuZWQgZGVzaWduYXRlcyB0aGUgcHJpbWFyeSBodyBkZXZpY2UKICAgICAgICAgaWYgKChtUHJpbWFyeUhhcmR3YXJlRGV2ID09IE5VTEwpICYmIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpKSB7CkBAIC0xODE1LDggKzE4NjgsNiBAQAogICAgICAgICAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfU0VUX01PREU7CiAgICAgICAgICAgICBtUHJpbWFyeUhhcmR3YXJlRGV2LT5od0RldmljZSgpLT5zZXRfbW9kZShtUHJpbWFyeUhhcmR3YXJlRGV2LT5od0RldmljZSgpLCBtTW9kZSk7CiAgICAgICAgICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19JRExFOwotCi0gICAgICAgICAgICBtUHJpbWFyeU91dHB1dFNhbXBsZVJhdGUgPSBjb25maWctPnNhbXBsZV9yYXRlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CkBAIC0xODM4LDExICsxODg5LDExIEBACiAgICAgfQogCiAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQgPSBuZXh0VW5pcXVlSWQoKTsKLSAgICBEdXBsaWNhdGluZ1RocmVhZCAqdGhyZWFkID0gbmV3IER1cGxpY2F0aW5nVGhyZWFkKHRoaXMsIHRocmVhZDEsIGlkKTsKKyAgICBEdXBsaWNhdGluZ1RocmVhZCAqdGhyZWFkID0gbmV3IER1cGxpY2F0aW5nVGhyZWFkKHRoaXMsIHRocmVhZDEsIGlkLCBtU3lzdGVtUmVhZHkpOwogICAgIHRocmVhZC0+YWRkT3V0cHV0VHJhY2sodGhyZWFkMik7CiAgICAgbVBsYXliYWNrVGhyZWFkcy5hZGQoaWQsIHRocmVhZCk7CiAgICAgLy8gbm90aWZ5IGNsaWVudCBwcm9jZXNzZXMgb2YgdGhlIG5ldyBvdXRwdXQgY3JlYXRpb24KLSAgICB0aHJlYWQtPmF1ZGlvQ29uZmlnQ2hhbmdlZChBdWRpb1N5c3RlbTo6T1VUUFVUX09QRU5FRCk7CisgICAgdGhyZWFkLT5pb0NvbmZpZ0NoYW5nZWQoQVVESU9fT1VUUFVUX09QRU5FRCk7CiAgICAgcmV0dXJuIGlkOwogfQogCkBAIC0xODkxLDcgKzE5NDIsOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWQoQXVkaW9TeXN0ZW06Ok9VVFBVVF9DTE9TRUQsIG91dHB1dCwgTlVMTCk7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBpb0Rlc2MgPSBuZXcgQXVkaW9Jb0Rlc2NyaXB0b3IoKTsKKyAgICAgICAgaW9EZXNjLT5tSW9IYW5kbGUgPSBvdXRwdXQ7CisgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChBVURJT19PVVRQVVRfQ0xPU0VELCBpb0Rlc2MpOwogICAgIH0KICAgICB0aHJlYWQtPmV4aXQoKTsKICAgICAvLyBUaGUgdGhyZWFkIGVudGl0eSAoYWN0aXZlIHVuaXQgb2YgZXhlY3V0aW9uKSBpcyBubyBsb25nZXIgcnVubmluZyBoZXJlLApAQCAtMTk1NCwyMiArMjAwNywyMiBAQAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKLSAgICBpZiAoKmRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgIGlmICgqZGV2aWNlcyA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHNwPFJlY29yZFRocmVhZD4gdGhyZWFkID0gb3BlbklucHV0X2wobW9kdWxlLCBpbnB1dCwgY29uZmlnLCAqZGV2aWNlLCBhZGRyZXNzLCBzb3VyY2UsIGZsYWdzKTsKKyAgICBzcDxSZWNvcmRUaHJlYWQ+IHRocmVhZCA9IG9wZW5JbnB1dF9sKG1vZHVsZSwgaW5wdXQsIGNvbmZpZywgKmRldmljZXMsIGFkZHJlc3MsIHNvdXJjZSwgZmxhZ3MpOwogCiAgICAgaWYgKHRocmVhZCAhPSAwKSB7CiAgICAgICAgIC8vIG5vdGlmeSBjbGllbnQgcHJvY2Vzc2VzIG9mIHRoZSBuZXcgaW5wdXQgY3JlYXRpb24KLSAgICAgICAgdGhyZWFkLT5hdWRpb0NvbmZpZ0NoYW5nZWQoQXVkaW9TeXN0ZW06OklOUFVUX09QRU5FRCk7CisgICAgICAgIHRocmVhZC0+aW9Db25maWdDaGFuZ2VkKEFVRElPX0lOUFVUX09QRU5FRCk7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC0xOTc4LDEyICsyMDMxLDEyIEBACiBzcDxBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZD4gQXVkaW9GbGluZ2VyOjpvcGVuSW5wdXRfbChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQogewotICAgIEF1ZGlvSHdEZXZpY2UgKmluSHdEZXYgPSBmaW5kU3VpdGFibGVId0Rldl9sKG1vZHVsZSwgZGV2aWNlKTsKKyAgICBBdWRpb0h3RGV2aWNlICppbkh3RGV2ID0gZmluZFN1aXRhYmxlSHdEZXZfbChtb2R1bGUsIGRldmljZXMpOwogICAgIGlmIChpbkh3RGV2ID09IE5VTEwpIHsKICAgICAgICAgKmlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgICAgIHJldHVybiAwOwpAQCAtMTk5Niw3ICsyMDQ5LDcgQEAKICAgICBhdWRpb19jb25maWdfdCBoYWxjb25maWcgPSAqY29uZmlnOwogICAgIGF1ZGlvX2h3X2RldmljZV90ICppbkh3SGFsID0gaW5Id0Rldi0+aHdEZXZpY2UoKTsKICAgICBhdWRpb19zdHJlYW1faW5fdCAqaW5TdHJlYW0gPSBOVUxMOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGluSHdIYWwtPm9wZW5faW5wdXRfc3RyZWFtKGluSHdIYWwsICppbnB1dCwgZGV2aWNlLCAmaGFsY29uZmlnLAorICAgIHN0YXR1c190IHN0YXR1cyA9IGluSHdIYWwtPm9wZW5faW5wdXRfc3RyZWFtKGluSHdIYWwsICppbnB1dCwgZGV2aWNlcywgJmhhbGNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdHJlYW0sIGZsYWdzLCBhZGRyZXNzLnN0cmluZygpLCBzb3VyY2UpOwogICAgIEFMT0dWKCJvcGVuSW5wdXRfbCgpIG9wZW5JbnB1dFN0cmVhbSByZXR1cm5lZCBpbnB1dCAlcCwgU2FtcGxpbmdSYXRlICVkIgogICAgICAgICAgICAiLCBGb3JtYXQgJSN4LCBDaGFubmVscyAleCwgZmxhZ3MgJSN4LCBzdGF0dXMgJWQgYWRkciAlcyIsCkBAIC0yMDA4LDE3ICsyMDYxLDE3IEBACiAgICAgICAgICAgICBzdGF0dXMsIGFkZHJlc3Muc3RyaW5nKCkpOwogCiAgICAgLy8gSWYgdGhlIGlucHV0IGNvdWxkIG5vdCBiZSBvcGVuZWQgd2l0aCB0aGUgcmVxdWVzdGVkIHBhcmFtZXRlcnMgYW5kIHdlIGNhbiBoYW5kbGUgdGhlCi0gICAgLy8gY29udmVyc2lvbiBpbnRlcm5hbGx5LCB0cnkgdG8gb3BlbiBhZ2FpbiB3aXRoIHRoZSBwcm9wb3NlZCBwYXJhbWV0ZXJzLiBUaGUgQXVkaW9GbGluZ2VyIGNhbgotICAgIC8vIHJlc2FtcGxlIHRoZSBpbnB1dCBhbmQgZG8gbW9ubyB0byBzdGVyZW8gb3Igc3RlcmVvIHRvIG1vbm8gY29udmVyc2lvbnMgb24gMTYgYml0IFBDTSBpbnB1dHMuCisgICAgLy8gY29udmVyc2lvbiBpbnRlcm5hbGx5LCB0cnkgdG8gb3BlbiBhZ2FpbiB3aXRoIHRoZSBwcm9wb3NlZCBwYXJhbWV0ZXJzLgogICAgIGlmIChzdGF0dXMgPT0gQkFEX1ZBTFVFICYmCi0gICAgICAgICAgICBjb25maWctPmZvcm1hdCA9PSBoYWxjb25maWcuZm9ybWF0ICYmIGhhbGNvbmZpZy5mb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgJiYKLSAgICAgICAgKGhhbGNvbmZpZy5zYW1wbGVfcmF0ZSA8PSAyICogY29uZmlnLT5zYW1wbGVfcmF0ZSkgJiYKKyAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShjb25maWctPmZvcm1hdCkgJiYKKyAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShoYWxjb25maWcuZm9ybWF0KSAmJgorICAgICAgICAoaGFsY29uZmlnLnNhbXBsZV9yYXRlIDw9IEFVRElPX1JFU0FNUExFUl9ET1dOX1JBVElPX01BWCAqIGNvbmZpZy0+c2FtcGxlX3JhdGUpICYmCiAgICAgICAgIChhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhoYWxjb25maWcuY2hhbm5lbF9tYXNrKSA8PSBGQ0NfMikgJiYKICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKSA8PSBGQ0NfMikpIHsKICAgICAgICAgLy8gRklYTUUgZGVzY3JpYmUgdGhlIGNoYW5nZSBwcm9wb3NlZCBieSBIQUwgKHNhdmUgb2xkIHZhbHVlcyBzbyB3ZSBjYW4gbG9nIHRoZW0gaGVyZSkKICAgICAgICAgQUxPR1YoIm9wZW5JbnB1dF9sKCkgcmVvcGVuaW5nIHdpdGggcHJvcG9zZWQgc2FtcGxpbmcgcmF0ZSBhbmQgY2hhbm5lbCBtYXNrIik7CiAgICAgICAgIGluU3RyZWFtID0gTlVMTDsKLSAgICAgICAgc3RhdHVzID0gaW5Id0hhbC0+b3Blbl9pbnB1dF9zdHJlYW0oaW5Id0hhbCwgKmlucHV0LCBkZXZpY2UsICZoYWxjb25maWcsCisgICAgICAgIHN0YXR1cyA9IGluSHdIYWwtPm9wZW5faW5wdXRfc3RyZWFtKGluSHdIYWwsICppbnB1dCwgZGV2aWNlcywgJmhhbGNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RyZWFtLCBmbGFncywgYWRkcmVzcy5zdHJpbmcoKSwgc291cmNlKTsKICAgICAgICAgLy8gRklYTUUgbG9nIHRoaXMgbmV3IHN0YXR1czsgSEFMIHNob3VsZCBub3QgcHJvcG9zZSBhbnkgZnVydGhlciBjaGFuZ2VzCiAgICAgfQpAQCAtMjA4Myw3ICsyMTM2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeU91dHB1dERldmljZV9sKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUmVhZHkKICNpZmRlZiBURUVfU0lOSwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgdGVlU2luawogI2VuZGlmCkBAIC0yMTUyLDcgKzIyMDYsOSBAQAogICAgICAgICAgICAgICAgIHB1dE9ycGhhbkVmZmVjdENoYWluX2woY2hhaW4pOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZChBdWRpb1N5c3RlbTo6SU5QVVRfQ0xPU0VELCBpbnB1dCwgTlVMTCk7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBpb0Rlc2MgPSBuZXcgQXVkaW9Jb0Rlc2NyaXB0b3IoKTsKKyAgICAgICAgaW9EZXNjLT5tSW9IYW5kbGUgPSBpbnB1dDsKKyAgICAgICAgaW9Db25maWdDaGFuZ2VkKEFVRElPX0lOUFVUX0NMT1NFRCwgaW9EZXNjKTsKICAgICAgICAgbVJlY29yZFRocmVhZHMucmVtb3ZlSXRlbShpbnB1dCk7CiAgICAgfQogICAgIC8vIEZJWE1FOiBjYWxsaW5nIHRocmVhZC0+ZXhpdCgpIHdpdGhvdXQgbUxvY2sgaGVsZCBzaG91bGQgbm90IGJlIG5lZWRlZCBhbnltb3JlIG5vdyB0aGF0CkBAIC0yNDI4LDYgKzI0ODQsNyBAQAogICAgICAgICBpbnQzMl90IHByaW9yaXR5LAogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKICAgICAgICAgaW50IHNlc3Npb25JZCwKKyAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCiAgICAgICAgIHN0YXR1c190ICpzdGF0dXMsCiAgICAgICAgIGludCAqaWQsCiAgICAgICAgIGludCAqZW5hYmxlZCkKQEAgLTI1MjQsNyArMjU4MSw3IEBACiAKICAgICAgICAgLy8gY2hlY2sgcmVjb3JkaW5nIHBlcm1pc3Npb24gZm9yIHZpc3VhbGl6ZXIKICAgICAgICAgaWYgKChtZW1jbXAoJmRlc2MudHlwZSwgU0xfSUlEX1ZJU1VBTElaQVRJT04sIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgJiYKLSAgICAgICAgICAgICFyZWNvcmRpbmdBbGxvd2VkKCkpIHsKKyAgICAgICAgICAgICFyZWNvcmRpbmdBbGxvd2VkKG9wUGFja2FnZU5hbWUpKSB7CiAgICAgICAgICAgICBsU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIH0KQEAgLTI4MDksMTMgKzI4NjYsMTMgQEAKIAogCiBzdHJ1Y3QgRW50cnkgewotI2RlZmluZSBNQVhfTkFNRSAzMiAgICAgLy8gJVklbSVkJUglTSVTXyVkLndhdgotICAgIGNoYXIgbU5hbWVbTUFYX05BTUVdOworI2RlZmluZSBURUVfTUFYX0ZJTEVOQU1FIDMyIC8vICVZJW0lZCVIJU0lU18lZC53YXYgPSA0KzIrMisyKzIrMisxKzErNCsxID0gMjEKKyAgICBjaGFyIG1GaWxlTmFtZVtURUVfTUFYX0ZJTEVOQU1FXTsKIH07CiAKIGludCBjb21wYXJFbnRyeShjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCiB7Ci0gICAgcmV0dXJuIHN0cmNtcCgoKGNvbnN0IEVudHJ5ICopIHAxKS0+bU5hbWUsICgoY29uc3QgRW50cnkgKikgcDIpLT5tTmFtZSk7CisgICAgcmV0dXJuIHN0cmNtcCgoKGNvbnN0IEVudHJ5ICopIHAxKS0+bUZpbGVOYW1lLCAoKGNvbnN0IEVudHJ5ICopIHAyKS0+bUZpbGVOYW1lKTsKIH0KIAogI2lmZGVmIFRFRV9TSU5LCkBAIC0yODM0LDExICsyODkxLDExIEBACiAgICAgICAgIERJUiAqZGlyID0gb3BlbmRpcih0ZWVQYXRoKTsKICAgICAgICAgdGVlUGF0aFt0ZWVQYXRoTGVuKytdID0gJy8nOwogICAgICAgICBpZiAoZGlyICE9IE5VTEwpIHsKLSNkZWZpbmUgTUFYX1NPUlQgMjAgLy8gbnVtYmVyIG9mIGVudHJpZXMgdG8gc29ydAotI2RlZmluZSBNQVhfS0VFUCAxMCAvLyBudW1iZXIgb2YgZW50cmllcyB0byBrZWVwCi0gICAgICAgICAgICBzdHJ1Y3QgRW50cnkgZW50cmllc1tNQVhfU09SVF07CisjZGVmaW5lIFRFRV9NQVhfU09SVCAyMCAvLyBudW1iZXIgb2YgZW50cmllcyB0byBzb3J0CisjZGVmaW5lIFRFRV9NQVhfS0VFUCAxMCAvLyBudW1iZXIgb2YgZW50cmllcyB0byBrZWVwCisgICAgICAgICAgICBzdHJ1Y3QgRW50cnkgZW50cmllc1tURUVfTUFYX1NPUlRdOwogICAgICAgICAgICAgc2l6ZV90IGVudHJ5Q291bnQgPSAwOwotICAgICAgICAgICAgd2hpbGUgKGVudHJ5Q291bnQgPCBNQVhfU09SVCkgeworICAgICAgICAgICAgd2hpbGUgKGVudHJ5Q291bnQgPCBURUVfTUFYX1NPUlQpIHsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGlyZW50IGRlOwogICAgICAgICAgICAgICAgIHN0cnVjdCBkaXJlbnQgKnJlc3VsdCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgaW50IHJjID0gcmVhZGRpcl9yKGRpciwgJmRlLCAmcmVzdWx0KTsKQEAgLTI4NTUsMTcgKzI5MTIsMTcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gaWdub3JlIG5vbiAud2F2IGZpbGUgZW50cmllcwogICAgICAgICAgICAgICAgIHNpemVfdCBuYW1lTGVuID0gc3RybGVuKGRlLmRfbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVMZW4gPD0gNCB8fCBuYW1lTGVuID49IE1BWF9OQU1FIHx8CisgICAgICAgICAgICAgICAgaWYgKG5hbWVMZW4gPD0gNCB8fCBuYW1lTGVuID49IFRFRV9NQVhfRklMRU5BTUUgfHwKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNtcCgmZGUuZF9uYW1lW25hbWVMZW4gLSA0XSwgIi53YXYiKSkgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RyY3B5KGVudHJpZXNbZW50cnlDb3VudCsrXS5tTmFtZSwgZGUuZF9uYW1lKTsKKyAgICAgICAgICAgICAgICBzdHJjcHkoZW50cmllc1tlbnRyeUNvdW50KytdLm1GaWxlTmFtZSwgZGUuZF9uYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICh2b2lkKSBjbG9zZWRpcihkaXIpOwotICAgICAgICAgICAgaWYgKGVudHJ5Q291bnQgPiBNQVhfS0VFUCkgeworICAgICAgICAgICAgaWYgKGVudHJ5Q291bnQgPiBURUVfTUFYX0tFRVApIHsKICAgICAgICAgICAgICAgICBxc29ydChlbnRyaWVzLCBlbnRyeUNvdW50LCBzaXplb2YoRW50cnkpLCBjb21wYXJFbnRyeSk7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeUNvdW50IC0gTUFYX0tFRVA7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBzdHJjcHkoJnRlZVBhdGhbdGVlUGF0aExlbl0sIGVudHJpZXNbaV0ubU5hbWUpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnlDb3VudCAtIFRFRV9NQVhfS0VFUDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmNweSgmdGVlUGF0aFt0ZWVQYXRoTGVuXSwgZW50cmllc1tpXS5tRmlsZU5hbWUpOwogICAgICAgICAgICAgICAgICAgICAodm9pZCkgdW5saW5rKHRlZVBhdGgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTI5NDksNCArMzAwNiw0IEBACiAgICAgcmV0dXJuIEJuQXVkaW9GbGluZ2VyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKaW5kZXggYWEwYWYxZi4uMjBjMzRlZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaApAQCAtNTYsNiArNTYsOSBAQAogI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CiAjaW5jbHVkZSAiQXVkaW9XYXRjaGRvZy5oIgogI2luY2x1ZGUgIkF1ZGlvTWl4ZXIuaCIKKyNpbmNsdWRlICJBdWRpb1N0cmVhbU91dC5oIgorI2luY2x1ZGUgIlNwZGlmU3RyZWFtT3V0LmgiCisjaW5jbHVkZSAiQXVkaW9Id0RldmljZS5oIgogCiAjaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL0lQb3dlck1hbmFnZXIuaD4KIApAQCAtNzAsMTggKzczLDE4IEBACiBjbGFzcyBBdWRpb0J1ZmZlcjsKIGNsYXNzIEF1ZGlvUmVzYW1wbGVyOwogY2xhc3MgRmFzdE1peGVyOworY2xhc3MgUGFzc3RocnVCdWZmZXJQcm92aWRlcjsKIGNsYXNzIFNlcnZlclByb3h5OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS8vIEF1ZGlvRmxpbmdlciBoYXMgYSBoYXJkLWNvZGVkIHVwcGVyIGxpbWl0IG9mIDIgY2hhbm5lbHMgZm9yIGNhcHR1cmUgYW5kIHBsYXliYWNrLgotLy8gVGhlcmUgaXMgc3VwcG9ydCBmb3IgPiAyIGNoYW5uZWwgdHJhY2tzIGRvd24tbWl4ZWQgdG8gMiBjaGFubmVsIG91dHB1dCB2aWEgYSBkb3duLW1peCBlZmZlY3QuCi0vLyBBZGRpbmcgZnVsbCBzdXBwb3J0IGZvciA+IDIgY2hhbm5lbCBjYXB0dXJlIG9yIHBsYXliYWNrIHdvdWxkIHJlcXVpcmUgbW9yZSB0aGFuIHNpbXBseSBjaGFuZ2luZwotLy8gdGhpcyAjZGVmaW5lLiAgVGhlcmUgaXMgYW4gaW5kZXBlbmRlbnQgaGFyZC1jb2RlZCB1cHBlciBsaW1pdCBpbiBBdWRpb01peGVyOwotLy8gcmVtb3ZpbmcgdGhhdCBBdWRpb01peGVyIGxpbWl0IHdvdWxkIGJlIG5lY2Vzc2FyeSBidXQgaW5zdWZmaWNpZW50IHRvIHN1cHBvcnQgPiAyIGNoYW5uZWxzLgotLy8gVGhlIG1hY3JvIEZDQ18yIGhpZ2hsaWdodHMgc29tZSAoYnV0IG5vdCBhbGwpIHBsYWNlcyB3aGVyZSB0aGVyZSBpcyBhcmUgMi1jaGFubmVsIGFzc3VtcHRpb25zLgorLy8gVGhlIG1hY3JvIEZDQ18yIGhpZ2hsaWdodHMgc29tZSAoYnV0IG5vdCBhbGwpIHBsYWNlcyB3aGVyZSB0aGVyZSBhcmUgYXJlIDItY2hhbm5lbCBhc3N1bXB0aW9ucy4KKy8vIFRoaXMgaXMgdHlwaWNhbGx5IGR1ZSB0byBsZWdhY3kgaW1wbGVtZW50YXRpb24gb2Ygc3RlcmVvIGlucHV0IG9yIG91dHB1dC4KIC8vIFNlYXJjaCBhbHNvIGZvciAiMiIsICJsZWZ0IiwgInJpZ2h0IiwgIlswXSIsICJbMV0iLCAiPj4gMTYiLCAiPDwgMTYiLCBldGMuCiAjZGVmaW5lIEZDQ18yIDIgICAgIC8vIEZDQ18yID0gRml4ZWQgQ2hhbm5lbCBDb3VudCAyCisvLyBUaGUgbWFjcm8gRkNDXzggaGlnaGxpZ2h0cyBwbGFjZXMgd2hlcmUgdGhlcmUgYXJlIDgtY2hhbm5lbCBhc3N1bXB0aW9ucy4KKy8vIFRoaXMgaXMgdHlwaWNhbGx5IGR1ZSB0byBhdWRpbyBtaXhlciBhbmQgcmVzYW1wbGVyIGxpbWl0YXRpb25zLgorI2RlZmluZSBGQ0NfOCA4ICAgICAvLyBGQ0NfOCA9IEZpeGVkIENoYW5uZWwgQ291bnQgOAogCiBzdGF0aWMgY29uc3QgbnNlY3NfdCBrRGVmYXVsdFN0YW5kYnlUaW1lSW5Oc2VjcyA9IHNlY29uZHMoMyk7CiAKQEAgLTExNyw5ICsxMjAsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcEZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRVaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4mIGNibGssCkBAIC0yMTMsNiArMjE4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMgLypub24tTlVMTCovLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZW5hYmxlZCk7CkBAIC0yNTEsNiArMjU3LDkgQEAKICAgICAvKiBHZXQgdGhlIEhXIHN5bmNocm9uaXphdGlvbiBzb3VyY2UgdXNlZCBmb3IgYW4gYXVkaW8gc2Vzc2lvbiAqLwogICAgIHZpcnR1YWwgYXVkaW9faHdfc3luY190IGdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKTsKIAorICAgIC8qIEluZGljYXRlIEpBVkEgc2VydmljZXMgYXJlIHJlYWR5IChzY2hlZHVsaW5nLCBwb3dlciBtYW5hZ2VtZW50IC4uLikgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN5c3RlbVJlYWR5KCk7CisKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBvblRyYW5zYWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCkBAIC0zMTEsNyArMzIwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cDxSZWZCYXNlPiBjb29raWUpOwogCiBwcml2YXRlOgotICAgIGNsYXNzIEF1ZGlvSHdEZXZpY2U7ICAgIC8vIGZ3ZCBkZWNsYXJhdGlvbiBmb3IgZmluZFN1aXRhYmxlSHdEZXZfbAogCiAgICAgICAgICAgICAgICBhdWRpb19tb2RlX3QgZ2V0TW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1Nb2RlOyB9CiAKQEAgLTM1MSw2ICszNTksMTUgQEAKICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgY2hhbm5lbE1hc2sgaXMgdGhlICJjYW5vbmljYWwiIG9uZSB3ZSBleHBlY3QgZm9yIHRoZSBjaGFubmVsQ291bnQuCiAgICAgICAgICAgICByZXR1cm4gY2hhbm5lbE1hc2sgPT0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCk7CiAgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9JTkRFWDoKKyAgICAgICAgICAgIGlmIChrRW5hYmxlRXh0ZW5kZWRDaGFubmVscykgeworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxDb3VudCA+PSBGQ0NfMiAvLyBtb25vIGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBjaGFubmVsQ291bnQgPD0gQXVkaW9NaXhlcjo6TUFYX05VTV9DSEFOTkVMUykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KQEAgLTQ0OSw3ICs0NjYsNyBAQAogICAgIGNsYXNzIEVmZmVjdE1vZHVsZTsKICAgICBjbGFzcyBFZmZlY3RIYW5kbGU7CiAgICAgY2xhc3MgRWZmZWN0Q2hhaW47Ci0gICAgc3RydWN0IEF1ZGlvU3RyZWFtT3V0OworCiAgICAgc3RydWN0IEF1ZGlvU3RyZWFtSW47CiAKICAgICBzdHJ1Y3QgIHN0cmVhbV90eXBlX3QgewpAQCAtNTQxLDcgKzU1OCw5IEBACiAgICAgICAgICAgICAgIC8vIG5vIHJhbmdlIGNoZWNrLCBkb2Vzbid0IGNoZWNrIHBlci10aHJlYWQgc3RyZWFtIHZvbHVtZSwgQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCiAgICAgICAgICAgICAgIGZsb2F0IHN0cmVhbVZvbHVtZV9sKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBtU3RyZWFtVHlwZXNbc3RyZWFtXS52b2x1bWU7IH0KLSAgICAgICAgICAgICAgdm9pZCBhdWRpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3Qgdm9pZCAqcGFyYW0yKTsKKyAgICAgICAgICAgICAgdm9pZCBpb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4mIGlvRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkID0gMCk7CiAKICAgICAgICAgICAgICAgLy8gQWxsb2NhdGUgYW4gYXVkaW9faW9faGFuZGxlX3QsIHNlc3Npb24gSUQsIGVmZmVjdCBJRCwgb3IgYXVkaW9fbW9kdWxlX2hhbmRsZV90LgogICAgICAgICAgICAgICAvLyBUaGV5IGFsbCBzaGFyZSB0aGUgc2FtZSBJRCBzcGFjZSwgYnV0IHRoZSBuYW1lc3BhY2VzIGFyZSBhY3R1YWxseSBpbmRlcGVuZGVudApAQCAtNTg2LDU3ICs2MDUsMTIgQEAKICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZWZmZWN0IHdhcyBmb3VuZCBpbiBtT3JwaGFuRWZmZWN0Q2hhaW5zLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgIHVwZGF0ZU9ycGhhbkVmZmVjdENoYWlucyhjb25zdCBzcDxFZmZlY3RNb2R1bGU+JiBlZmZlY3QpOwogCi0gICAgY2xhc3MgQXVkaW9Id0RldmljZSB7Ci0gICAgcHVibGljOgotICAgICAgICBlbnVtIEZsYWdzIHsKLSAgICAgICAgICAgIEFIV0RfQ0FOX1NFVF9NQVNURVJfVk9MVU1FICA9IDB4MSwKLSAgICAgICAgICAgIEFIV0RfQ0FOX1NFVF9NQVNURVJfTVVURSAgICA9IDB4MiwKLSAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB2b2lkIGJyb2FjYXN0UGFyYW1ldGVyc1RvUmVjb3JkVGhyZWFkc19sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwogCi0gICAgICAgIEF1ZGlvSHdEZXZpY2UoYXVkaW9fbW9kdWxlX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb2R1bGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICBGbGFncyBmbGFncykKLSAgICAgICAgICAgIDogbUhhbmRsZShoYW5kbGUpLCBtTW9kdWxlTmFtZShzdHJkdXAobW9kdWxlTmFtZSkpCi0gICAgICAgICAgICAsIG1Id0RldmljZShod0RldmljZSkKLSAgICAgICAgICAgICwgbUZsYWdzKGZsYWdzKSB7IH0KLSAgICAgICAgLyp2aXJ0dWFsKi8gfkF1ZGlvSHdEZXZpY2UoKSB7IGZyZWUoKHZvaWQgKiltTW9kdWxlTmFtZSk7IH0KLQotICAgICAgICBib29sIGNhblNldE1hc3RlclZvbHVtZSgpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiAoMCAhPSAobUZsYWdzICYgQUhXRF9DQU5fU0VUX01BU1RFUl9WT0xVTUUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2wgY2FuU2V0TWFzdGVyTXV0ZSgpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiAoMCAhPSAobUZsYWdzICYgQUhXRF9DQU5fU0VUX01BU1RFUl9NVVRFKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbUhhbmRsZTsgfQotICAgICAgICBjb25zdCBjaGFyICptb2R1bGVOYW1lKCkgY29uc3QgeyByZXR1cm4gbU1vZHVsZU5hbWU7IH0KLSAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbUh3RGV2aWNlOyB9Ci0gICAgICAgIHVpbnQzMl90IHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBtSHdEZXZpY2UtPmNvbW1vbi52ZXJzaW9uOyB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBjb25zdCBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbUhhbmRsZTsKLSAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0IG1Nb2R1bGVOYW1lOwotICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqIGNvbnN0IG1Id0RldmljZTsKLSAgICAgICAgY29uc3QgRmxhZ3MgbUZsYWdzOwotICAgIH07Ci0KLSAgICAvLyBBdWRpb1N0cmVhbU91dCBhbmQgQXVkaW9TdHJlYW1JbiBhcmUgaW1tdXRhYmxlLCBzbyB0aGVpciBmaWVsZHMgYXJlIGNvbnN0LgorICAgIC8vIEF1ZGlvU3RyZWFtSW4gaXMgaW1tdXRhYmxlLCBzbyB0aGVpciBmaWVsZHMgYXJlIGNvbnN0LgogICAgIC8vIEZvciBlbXBoYXNpcywgd2UgY291bGQgYWxzbyBtYWtlIGFsbCBwb2ludGVycyB0byB0aGVtIGJlICJjb25zdCAqIiwKICAgICAvLyBidXQgdGhhdCB3b3VsZCBjbHV0dGVyIHRoZSBjb2RlIHVubmVjZXNzYXJpbHkuCiAKLSAgICBzdHJ1Y3QgQXVkaW9TdHJlYW1PdXQgewotICAgICAgICBBdWRpb0h3RGV2aWNlKiBjb25zdCBhdWRpb0h3RGV2OwotICAgICAgICBhdWRpb19zdHJlYW1fb3V0X3QqIGNvbnN0IHN0cmVhbTsKLSAgICAgICAgY29uc3QgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3M7Ci0KLSAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QqIGh3RGV2KCkgY29uc3QgeyByZXR1cm4gYXVkaW9Id0Rldi0+aHdEZXZpY2UoKTsgfQotCi0gICAgICAgIEF1ZGlvU3RyZWFtT3V0KEF1ZGlvSHdEZXZpY2UgKmRldiwgYXVkaW9fc3RyZWFtX291dF90ICpvdXQsIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKSA6Ci0gICAgICAgICAgICBhdWRpb0h3RGV2KGRldiksIHN0cmVhbShvdXQpLCBmbGFncyhmbGFncykge30KLSAgICB9OwotCiAgICAgc3RydWN0IEF1ZGlvU3RyZWFtSW4gewogICAgICAgICBBdWRpb0h3RGV2aWNlKiBjb25zdCBhdWRpb0h3RGV2OwogICAgICAgICBhdWRpb19zdHJlYW1faW5fdCogY29uc3Qgc3RyZWFtOwpAQCAtNzg5LDE2ICs3NjMsMTkgQEAKIAogICAgIHNwPFBhdGNoUGFuZWw+IG1QYXRjaFBhbmVsOwogCi0gICAgdWludDMyX3QgICAgbVByaW1hcnlPdXRwdXRTYW1wbGVSYXRlOyAgIC8vIHNhbXBsZSByYXRlIG9mIHRoZSBwcmltYXJ5IG91dHB1dCwgb3IgemVybyBpZiBub25lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3RlY3RlZCBieSBtSGFyZHdhcmVMb2NrCisgICAgYm9vbCAgICAgICAgbVN5c3RlbVJlYWR5OwogfTsKIAogI3VuZGVmIElOQ0xVRElOR19GUk9NX0FVRElPRkxJTkdFUl9ICiAKIGNvbnN0IGNoYXIgKmZvcm1hdFRvU3RyaW5nKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCk7CitTdHJpbmc4IGlucHV0RmxhZ3NUb1N0cmluZyhhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKTsKK1N0cmluZzggb3V0cHV0RmxhZ3NUb1N0cmluZyhhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyk7CitTdHJpbmc4IGRldmljZXNUb1N0cmluZyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyk7Citjb25zdCBjaGFyICpzb3VyY2VUb1N0cmluZyhhdWRpb19zb3VyY2VfdCBzb3VyY2UpOwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvLyBBTkRST0lEX0FVRElPX0ZMSU5HRVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxOTE1OTgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5jcHAKQEAgLTAsMCArMSw5NyBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb0h3RGV2aWNlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3NwZGlmL1NQRElGRW5jb2Rlci5oPgorCisjaW5jbHVkZSAiQXVkaW9Id0RldmljZS5oIgorI2luY2x1ZGUgIkF1ZGlvU3RyZWFtT3V0LmgiCisjaW5jbHVkZSAiU3BkaWZTdHJlYW1PdXQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXR1c190IEF1ZGlvSHdEZXZpY2U6Om9wZW5PdXRwdXRTdHJlYW0oCisgICAgICAgIEF1ZGlvU3RyZWFtT3V0ICoqcHBTdHJlYW1PdXQsCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MpCit7CisKKyAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnIG9yaWdpbmFsQ29uZmlnID0gKmNvbmZpZzsKKyAgICBBdWRpb1N0cmVhbU91dCAqb3V0cHV0U3RyZWFtID0gbmV3IEF1ZGlvU3RyZWFtT3V0KHRoaXMsIGZsYWdzKTsKKworICAgIC8vIFRyeSB0byBvcGVuIHRoZSBIQUwgZmlyc3QgdXNpbmcgdGhlIGN1cnJlbnQgZm9ybWF0LgorICAgIEFMT0dWKCJvcGVuT3V0cHV0U3RyZWFtKCksIHRyeSAiCisgICAgICAgICAgICAiIHNhbXBsZVJhdGUgJWQsIEZvcm1hdCAlI3gsICIKKyAgICAgICAgICAgICJjaGFubmVsTWFzayAlI3giLAorICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LAorICAgICAgICAgICAgY29uZmlnLT5jaGFubmVsX21hc2spOworICAgIHN0YXR1c190IHN0YXR1cyA9IG91dHB1dFN0cmVhbS0+b3BlbihoYW5kbGUsIGRldmljZXMsIGNvbmZpZywgYWRkcmVzcyk7CisKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGRlbGV0ZSBvdXRwdXRTdHJlYW07CisgICAgICAgIG91dHB1dFN0cmVhbSA9IE5VTEw7CisKKyAgICAgICAgLy8gRklYTUUgTG9vayBhdCBhbnkgbW9kaWZpY2F0aW9uIHRvIHRoZSBjb25maWcuCisgICAgICAgIC8vIFRoZSBIQUwgbWlnaHQgbW9kaWZ5IHRoZSBjb25maWcgdG8gc3VnZ2VzdCBhIHdyYXBwZWQgZm9ybWF0LgorICAgICAgICAvLyBMb2cgdGhpcyBzbyB3ZSBjYW4gc2VlIHdoYXQgdGhlIEhBTHMgYXJlIGRvaW5nLgorICAgICAgICBBTE9HSSgib3Blbk91dHB1dFN0cmVhbSgpLCBIQUwgcmV0dXJuZWQiCisgICAgICAgICAgICAiIHNhbXBsZVJhdGUgJWQsIEZvcm1hdCAlI3gsICIKKyAgICAgICAgICAgICJjaGFubmVsTWFzayAlI3gsIHN0YXR1cyAlZCIsCisgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgY29uZmlnLT5mb3JtYXQsCisgICAgICAgICAgICBjb25maWctPmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgIHN0YXR1cyk7CisKKyAgICAgICAgLy8gSWYgdGhlIGRhdGEgaXMgZW5jb2RlZCB0aGVuIHRyeSBhZ2FpbiB1c2luZyB3cmFwcGVkIFBDTS4KKyAgICAgICAgYm9vbCB3cmFwcGVyTmVlZGVkID0gIWF1ZGlvX2lzX2xpbmVhcl9wY20ob3JpZ2luYWxDb25maWcuZm9ybWF0KQorICAgICAgICAgICAgICAgICYmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDApCisgICAgICAgICAgICAgICAgJiYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpID09IDApOworCisgICAgICAgIGlmICh3cmFwcGVyTmVlZGVkKSB7CisgICAgICAgICAgICBpZiAoU1BESUZFbmNvZGVyOjppc0Zvcm1hdFN1cHBvcnRlZChvcmlnaW5hbENvbmZpZy5mb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbmV3IFNwZGlmU3RyZWFtT3V0KHRoaXMsIGZsYWdzLCBvcmlnaW5hbENvbmZpZy5mb3JtYXQpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IG91dHB1dFN0cmVhbS0+b3BlbihoYW5kbGUsIGRldmljZXMsICZvcmlnaW5hbENvbmZpZywgYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRVJST1IgLSBvcGVuT3V0cHV0U3RyZWFtKCksIFNQRElGIG9wZW4gcmV0dXJuZWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG91dHB1dFN0cmVhbTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJFUlJPUiAtIG9wZW5PdXRwdXRTdHJlYW0oKSwgU1BESUZFbmNvZGVyIGRvZXMgbm90IHN1cHBvcnQgZm9ybWF0IDB4JTA4eCIsCisgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsQ29uZmlnLmZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqcHBTdHJlYW1PdXQgPSBvdXRwdXRTdHJlYW07CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlmNjVjMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX0hXX0RFVklDRV9ICisjZGVmaW5lIEFORFJPSURfQVVESU9fSFdfREVWSUNFX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEF1ZGlvU3RyZWFtT3V0OworCitjbGFzcyBBdWRpb0h3RGV2aWNlIHsKK3B1YmxpYzoKKyAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAgQUhXRF9DQU5fU0VUX01BU1RFUl9WT0xVTUUgID0gMHgxLAorICAgICAgICBBSFdEX0NBTl9TRVRfTUFTVEVSX01VVEUgICAgPSAweDIsCisgICAgfTsKKworICAgIEF1ZGlvSHdEZXZpY2UoYXVkaW9fbW9kdWxlX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUsCisgICAgICAgICAgICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZpY2UsCisgICAgICAgICAgICAgICAgICBGbGFncyBmbGFncykKKyAgICAgICAgOiBtSGFuZGxlKGhhbmRsZSkKKyAgICAgICAgLCBtTW9kdWxlTmFtZShzdHJkdXAobW9kdWxlTmFtZSkpCisgICAgICAgICwgbUh3RGV2aWNlKGh3RGV2aWNlKQorICAgICAgICAsIG1GbGFncyhmbGFncykgeyB9CisgICAgdmlydHVhbCB+QXVkaW9Id0RldmljZSgpIHsgZnJlZSgodm9pZCAqKW1Nb2R1bGVOYW1lKTsgfQorCisgICAgYm9vbCBjYW5TZXRNYXN0ZXJWb2x1bWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoMCAhPSAobUZsYWdzICYgQUhXRF9DQU5fU0VUX01BU1RFUl9WT0xVTUUpKTsKKyAgICB9CisKKyAgICBib29sIGNhblNldE1hc3Rlck11dGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoMCAhPSAobUZsYWdzICYgQUhXRF9DQU5fU0VUX01BU1RFUl9NVVRFKSk7CisgICAgfQorCisgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1IYW5kbGU7IH0KKyAgICBjb25zdCBjaGFyICptb2R1bGVOYW1lKCkgY29uc3QgeyByZXR1cm4gbU1vZHVsZU5hbWU7IH0KKyAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZpY2UoKSBjb25zdCB7IHJldHVybiBtSHdEZXZpY2U7IH0KKyAgICB1aW50MzJfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbUh3RGV2aWNlLT5jb21tb24udmVyc2lvbjsgfQorCisgICAgLyoqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLgorICAgICAqIFRoZSAiYWRkcmVzcyIgcGFyYW1ldGVyIHF1YWxpZmllcyB0aGUgImRldmljZXMiIGF1ZGlvIGRldmljZSB0eXBlIGlmIG5lZWRlZC4KKyAgICAgKiBUaGUgZm9ybWF0IGZvcm1hdCBkZXBlbmRzIG9uIHRoZSBkZXZpY2UgdHlwZToKKyAgICAgKiAtIEJsdWV0b290aCBkZXZpY2VzIHVzZSB0aGUgTUFDIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBpbiB0aGUgZm9ybSAiMDA6MTE6MjI6QUE6QkI6Q0MiCisgICAgICogLSBVU0IgZGV2aWNlcyB1c2UgdGhlIEFMU0EgY2FyZCBhbmQgZGV2aWNlIG51bWJlcnMgaW4gdGhlIGZvcm0gICJjYXJkPVg7ZGV2aWNlPVkiCisgICAgICogLSBPdGhlciBkZXZpY2VzIG1heSB1c2UgYSBudW1iZXIgb3IgYW55IG90aGVyIHN0cmluZy4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgQXVkaW9TdHJlYW1PdXQgKipwcFN0cmVhbU91dCwKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzKTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbUhhbmRsZTsKKyAgICBjb25zdCBjaGFyICogY29uc3QgICAgICAgICAgbU1vZHVsZU5hbWU7CisgICAgYXVkaW9faHdfZGV2aWNlX3QgKiBjb25zdCAgIG1Id0RldmljZTsKKyAgICBjb25zdCBGbGFncyAgICAgICAgICAgICAgICAgbUZsYWdzOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9BVURJT19IV19ERVZJQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuY3BwCmluZGV4IGZkMjhlYTEuLjhhOWE4MzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5jcHAKQEAgLTM5LDkgKzM5LDYgQEAKICNpbmNsdWRlIDxjb21tb25fdGltZS9sb2NhbF9jbG9jay5oPgogI2luY2x1ZGUgPGNvbW1vbl90aW1lL2NjX2hlbHBlci5oPgogCi0jaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KLSNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9kb3dubWl4Lmg+Ci0KICNpbmNsdWRlICJBdWRpb01peGVyT3BzLmgiCiAjaW5jbHVkZSAiQXVkaW9NaXhlci5oIgogCkBAIC02OSw5ICs2NiwxNiBAQAogI2RlZmluZSBBUlJBWV9TSVpFKHgpIChzaXplb2YoeCkvc2l6ZW9mKCh4KVswXSkpCiAjZW5kaWYKIAotLy8gU2V0IGtVc2VOZXdNaXhlciB0byB0cnVlIHRvIHVzZSB0aGUgbmV3IG1peGVyIGVuZ2luZS4gT3RoZXJ3aXNlIHRoZQotLy8gb3JpZ2luYWwgY29kZSB3aWxsIGJlIHVzZWQuICBUaGlzIGlzIGZhbHNlIGZvciBub3cuCi1zdGF0aWMgY29uc3QgYm9vbCBrVXNlTmV3TWl4ZXIgPSBmYWxzZTsKKy8vIFRPRE86IE1vdmUgdGhlc2UgbWFjcm8vaW5saW5lcyB0byBhIGhlYWRlciBmaWxlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgaW5saW5lCitUIG1heChjb25zdCBUJiB4LCBjb25zdCBUJiB5KSB7CisgICAgcmV0dXJuIHggPiB5ID8geCA6IHk7Cit9CisKKy8vIFNldCBrVXNlTmV3TWl4ZXIgdG8gdHJ1ZSB0byB1c2UgdGhlIG5ldyBtaXhlciBlbmdpbmUgYWx3YXlzLiBPdGhlcndpc2UgdGhlCisvLyBvcmlnaW5hbCBjb2RlIHdpbGwgYmUgdXNlZCBmb3Igc3RlcmVvIHNpbmtzLCB0aGUgbmV3IG1peGVyIGZvciBtdWx0aWNoYW5uZWwuCitzdGF0aWMgY29uc3QgYm9vbCBrVXNlTmV3TWl4ZXIgPSB0cnVlOwogCiAvLyBTZXQga1VzZUZsb2F0IHRvIHRydWUgdG8gYWxsb3cgZmxvYXRpbmcgaW5wdXQgaW50byB0aGUgbWl4ZXIgZW5naW5lLgogLy8gSWYga1VzZU5ld01peGVyIGlzIGZhbHNlLCB0aGlzIGlzIGlnbm9yZWQgb3IgbWF5IGJlIG92ZXJyaWRkZW4gaW50ZXJuYWxseQpAQCAtOTEsMjg4ICs5NSw2IEBACiAgICAgcmV0dXJuIGEgPCBiID8gYSA6IGI7CiB9CiAKLUF1ZGlvTWl4ZXI6OkNvcHlCdWZmZXJQcm92aWRlcjo6Q29weUJ1ZmZlclByb3ZpZGVyKHNpemVfdCBpbnB1dEZyYW1lU2l6ZSwKLSAgICAgICAgc2l6ZV90IG91dHB1dEZyYW1lU2l6ZSwgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpIDoKLSAgICAgICAgbUlucHV0RnJhbWVTaXplKGlucHV0RnJhbWVTaXplKSwKLSAgICAgICAgbU91dHB1dEZyYW1lU2l6ZShvdXRwdXRGcmFtZVNpemUpLAotICAgICAgICBtTG9jYWxCdWZmZXJGcmFtZUNvdW50KGJ1ZmZlckZyYW1lQ291bnQpLAotICAgICAgICBtTG9jYWxCdWZmZXJEYXRhKE5VTEwpLAotICAgICAgICBtQ29uc3VtZWQoMCkKLXsKLSAgICBBTE9HVigiQ29weUJ1ZmZlclByb3ZpZGVyKCVwKSglenUsICV6dSwgJXp1KSIsIHRoaXMsCi0gICAgICAgICAgICBpbnB1dEZyYW1lU2l6ZSwgb3V0cHV0RnJhbWVTaXplLCBidWZmZXJGcmFtZUNvdW50KTsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGlucHV0RnJhbWVTaXplIDwgb3V0cHV0RnJhbWVTaXplICYmIGJ1ZmZlckZyYW1lQ291bnQgPT0gMCwKLSAgICAgICAgICAgICJSZXF1aXJlcyBsb2NhbCBidWZmZXIgaWYgaW5wdXRGcmFtZVNpemUoJXp1KSA8IG91dHB1dEZyYW1lU2l6ZSglenUpIiwKLSAgICAgICAgICAgIGlucHV0RnJhbWVTaXplLCBvdXRwdXRGcmFtZVNpemUpOwotICAgIGlmIChtTG9jYWxCdWZmZXJGcmFtZUNvdW50KSB7Ci0gICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtTG9jYWxCdWZmZXJEYXRhLCAzMiwgbUxvY2FsQnVmZmVyRnJhbWVDb3VudCAqIG1PdXRwdXRGcmFtZVNpemUpOwotICAgIH0KLSAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSAwOwotfQotCi1BdWRpb01peGVyOjpDb3B5QnVmZmVyUHJvdmlkZXI6On5Db3B5QnVmZmVyUHJvdmlkZXIoKQotewotICAgIEFMT0dWKCJ+Q29weUJ1ZmZlclByb3ZpZGVyKCVwKSIsIHRoaXMpOwotICAgIGlmIChtQnVmZmVyLmZyYW1lQ291bnQgIT0gMCkgewotICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmbUJ1ZmZlcik7Ci0gICAgfQotICAgIGZyZWUobUxvY2FsQnVmZmVyRGF0YSk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvTWl4ZXI6OkNvcHlCdWZmZXJQcm92aWRlcjo6Z2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgKnBCdWZmZXIsCi0gICAgICAgIGludDY0X3QgcHRzKQotewotICAgIC8vQUxPR1YoIkNvcHlCdWZmZXJQcm92aWRlciglcCk6OmdldE5leHRCdWZmZXIoJXAgKCV6dSksICVsbGQpIiwKLSAgICAvLyAgICAgICAgdGhpcywgcEJ1ZmZlciwgcEJ1ZmZlci0+ZnJhbWVDb3VudCwgcHRzKTsKLSAgICBpZiAobUxvY2FsQnVmZmVyRnJhbWVDb3VudCA9PSAwKSB7Ci0gICAgICAgIHN0YXR1c190IHJlcyA9IG1UcmFja0J1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKHBCdWZmZXIsIHB0cyk7Ci0gICAgICAgIGlmIChyZXMgPT0gT0spIHsKLSAgICAgICAgICAgIGNvcHlGcmFtZXMocEJ1ZmZlci0+cmF3LCBwQnVmZmVyLT5yYXcsIHBCdWZmZXItPmZyYW1lQ291bnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotICAgIGlmIChtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCkgewotICAgICAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSBwQnVmZmVyLT5mcmFtZUNvdW50OwotICAgICAgICBzdGF0dXNfdCByZXMgPSBtVHJhY2tCdWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmbUJ1ZmZlciwgcHRzKTsKLSAgICAgICAgLy8gQXQgb25lIHRpbWUgYW4gdXBzdHJlYW0gYnVmZmVyIHByb3ZpZGVyIGhhZAotICAgICAgICAvLyByZXMgPT0gT0sgYW5kIG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwLCBkb2Vzbid0IHNlZW0gdG8gaGFwcGVuIG5vdyA3LzE4LzIwMTQuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEJ5IEFQSSBzcGVjLCBpZiByZXMgIT0gT0ssIHRoZW4gbUJ1ZmZlci5mcmFtZUNvdW50ID09IDAuCi0gICAgICAgIC8vIGJ1dCB0aGVyZSBtYXkgYmUgaW1wcm9wZXIgaW1wbGVtZW50YXRpb25zLgotICAgICAgICBBTE9HX0FTU0VSVChyZXMgPT0gT0sgfHwgbUJ1ZmZlci5mcmFtZUNvdW50ID09IDApOwotICAgICAgICBpZiAocmVzICE9IE9LIHx8IG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKSB7IC8vIG5vdCBuZWVkZWQgYnkgQVBJIHNwZWMsIGJ1dCB0byBiZSBzYWZlLgotICAgICAgICAgICAgcEJ1ZmZlci0+cmF3ID0gTlVMTDsKLSAgICAgICAgICAgIHBCdWZmZXItPmZyYW1lQ291bnQgPSAwOwotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotICAgICAgICBtQ29uc3VtZWQgPSAwOwotICAgIH0KLSAgICBBTE9HX0FTU0VSVChtQ29uc3VtZWQgPCBtQnVmZmVyLmZyYW1lQ291bnQpOwotICAgIHNpemVfdCBjb3VudCA9IG1pbihtTG9jYWxCdWZmZXJGcmFtZUNvdW50LCBtQnVmZmVyLmZyYW1lQ291bnQgLSBtQ29uc3VtZWQpOwotICAgIGNvdW50ID0gbWluKGNvdW50LCBwQnVmZmVyLT5mcmFtZUNvdW50KTsKLSAgICBwQnVmZmVyLT5yYXcgPSBtTG9jYWxCdWZmZXJEYXRhOwotICAgIHBCdWZmZXItPmZyYW1lQ291bnQgPSBjb3VudDsKLSAgICBjb3B5RnJhbWVzKHBCdWZmZXItPnJhdywgKHVpbnQ4X3QqKW1CdWZmZXIucmF3ICsgbUNvbnN1bWVkICogbUlucHV0RnJhbWVTaXplLAotICAgICAgICAgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIEF1ZGlvTWl4ZXI6OkNvcHlCdWZmZXJQcm92aWRlcjo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgKnBCdWZmZXIpCi17Ci0gICAgLy9BTE9HVigiQ29weUJ1ZmZlclByb3ZpZGVyKCVwKTo6cmVsZWFzZUJ1ZmZlciglcCglenUpKSIsCi0gICAgLy8gICAgICAgIHRoaXMsIHBCdWZmZXIsIHBCdWZmZXItPmZyYW1lQ291bnQpOwotICAgIGlmIChtTG9jYWxCdWZmZXJGcmFtZUNvdW50ID09IDApIHsKLSAgICAgICAgbVRyYWNrQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIocEJ1ZmZlcik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gTE9HX0FMV0FZU19GQVRBTF9JRihwQnVmZmVyLT5mcmFtZUNvdW50ID09IDAsICJJbnZhbGlkIGZyYW1lY291bnQiKTsKLSAgICBtQ29uc3VtZWQgKz0gcEJ1ZmZlci0+ZnJhbWVDb3VudDsgLy8gVE9ETzogdXBkYXRlIGZvciBlZmZpY2llbmN5IHRvIHJldXNlIGV4aXN0aW5nIGNvbnRlbnQKLSAgICBpZiAobUNvbnN1bWVkICE9IDAgJiYgbUNvbnN1bWVkID49IG1CdWZmZXIuZnJhbWVDb3VudCkgewotICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmbUJ1ZmZlcik7Ci0gICAgICAgIEFMT0dfQVNTRVJUKG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKTsKLSAgICB9Ci0gICAgcEJ1ZmZlci0+cmF3ID0gTlVMTDsKLSAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKLX0KLQotdm9pZCBBdWRpb01peGVyOjpDb3B5QnVmZmVyUHJvdmlkZXI6OnJlc2V0KCkKLXsKLSAgICBpZiAobUJ1ZmZlci5mcmFtZUNvdW50ICE9IDApIHsKLSAgICAgICAgbVRyYWNrQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOwotICAgIH0KLSAgICBtQ29uc3VtZWQgPSAwOwotfQotCi1BdWRpb01peGVyOjpEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXIoCi0gICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGlucHV0Q2hhbm5lbE1hc2ssCi0gICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dHB1dENoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3Qgc2Vzc2lvbklkLCBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCkgOgotICAgICAgICBDb3B5QnVmZmVyUHJvdmlkZXIoCi0gICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkgKiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soaW5wdXRDaGFubmVsTWFzayksCi0gICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkgKiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sob3V0cHV0Q2hhbm5lbE1hc2spLAotICAgICAgICAgICAgYnVmZmVyRnJhbWVDb3VudCkgIC8vIHNldCBidWZmZXJGcmFtZUNvdW50IHRvIDAgdG8gZG8gaW4tcGxhY2UKLXsKLSAgICBBTE9HVigiRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoJXApKCUjeCwgJSN4LCAlI3ggJXUgJWQpIiwKLSAgICAgICAgICAgIHRoaXMsIGlucHV0Q2hhbm5lbE1hc2ssIG91dHB1dENoYW5uZWxNYXNrLCBmb3JtYXQsCi0gICAgICAgICAgICBzYW1wbGVSYXRlLCBzZXNzaW9uSWQpOwotICAgIGlmICghc0lzTXVsdGljaGFubmVsQ2FwYWJsZQotICAgICAgICAgICAgfHwgRWZmZWN0Q3JlYXRlKCZzRHdubUZ4RGVzYy51dWlkLAotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgIFNFU1NJT05fSURfSU5WQUxJRF9BTkRfSUdOT1JFRCwKLSAgICAgICAgICAgICAgICAgICAgJm1Eb3dubWl4SGFuZGxlKSAhPSAwKSB7Ci0gICAgICAgICBBTE9HRSgiRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKSBlcnJvciBjcmVhdGluZyBkb3dubWl4ZXIgZWZmZWN0Iik7Ci0gICAgICAgICBtRG93bm1peEhhbmRsZSA9IE5VTEw7Ci0gICAgICAgICByZXR1cm47Ci0gICAgIH0KLSAgICAgLy8gY2hhbm5lbCBpbnB1dCBjb25maWd1cmF0aW9uIHdpbGwgYmUgb3ZlcnJpZGRlbiBwZXItdHJhY2sKLSAgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBpbnB1dENoYW5uZWxNYXNrOyAgIC8vIEZJWE1FOiBTaG91bGQgYmUgYml0cwotICAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBvdXRwdXRDaGFubmVsTWFzazsgLy8gRklYTUU6IHNob3VsZCBiZSBiaXRzCi0gICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IGZvcm1hdDsKLSAgICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IGZvcm1hdDsKLSAgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gc2FtcGxlUmF0ZTsKLSAgICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHNhbXBsZVJhdGU7Ci0gICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOwotICAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFOwotICAgICAvLyBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlciBwcm92aWRlciwgYW5kIGZyYW1lIGNvdW50IHdpbGwgbm90IGJlIHVzZWQgYXMgdGhlIGRvd25taXggZWZmZWN0Ci0gICAgIC8vIHByb2Nlc3MoKSBmdW5jdGlvbiBpcyBjYWxsZWQgZGlyZWN0bHkgKHNlZSBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6Z2V0TmV4dEJ1ZmZlcigpKQotICAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19TTVBfUkFURSB8IEVGRkVDVF9DT05GSUdfQ0hBTk5FTFMgfAotICAgICAgICAgICAgIEVGRkVDVF9DT05GSUdfRk9STUFUIHwgRUZGRUNUX0NPTkZJR19BQ0NfTU9ERTsKLSAgICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLm1hc2sgPSBtRG93bm1peENvbmZpZy5pbnB1dENmZy5tYXNrOwotCi0gICAgIGludCBjbWRTdGF0dXM7Ci0gICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IHNpemVvZihpbnQpOwotCi0gICAgIC8vIENvbmZpZ3VyZSBkb3dubWl4ZXIKLSAgICAgc3RhdHVzX3Qgc3RhdHVzID0gKCptRG93bm1peEhhbmRsZSktPmNvbW1hbmQobURvd25taXhIYW5kbGUsCi0gICAgICAgICAgICAgRUZGRUNUX0NNRF9TRVRfQ09ORklHIC8qY21kQ29kZSovLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSAvKmNtZFNpemUqLywKLSAgICAgICAgICAgICAmbURvd25taXhDb25maWcgLypwQ21kRGF0YSovLAotICAgICAgICAgICAgICZyZXBseVNpemUsICZjbWRTdGF0dXMgLypwUmVwbHlEYXRhKi8pOwotICAgICBpZiAoc3RhdHVzICE9IDAgfHwgY21kU3RhdHVzICE9IDApIHsKLSAgICAgICAgIEFMT0dFKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpIGVycm9yICVkIGNtZFN0YXR1cyAlZCB3aGlsZSBjb25maWd1cmluZyBkb3dubWl4ZXIiLAotICAgICAgICAgICAgICAgICBzdGF0dXMsIGNtZFN0YXR1cyk7Ci0gICAgICAgICBFZmZlY3RSZWxlYXNlKG1Eb3dubWl4SGFuZGxlKTsKLSAgICAgICAgIG1Eb3dubWl4SGFuZGxlID0gTlVMTDsKLSAgICAgICAgIHJldHVybjsKLSAgICAgfQotCi0gICAgIC8vIEVuYWJsZSBkb3dubWl4ZXIKLSAgICAgcmVwbHlTaXplID0gc2l6ZW9mKGludCk7Ci0gICAgIHN0YXR1cyA9ICgqbURvd25taXhIYW5kbGUpLT5jb21tYW5kKG1Eb3dubWl4SGFuZGxlLAotICAgICAgICAgICAgIEVGRkVDVF9DTURfRU5BQkxFIC8qY21kQ29kZSovLCAwIC8qY21kU2l6ZSovLCBOVUxMIC8qcENtZERhdGEqLywKLSAgICAgICAgICAgICAmcmVwbHlTaXplLCAmY21kU3RhdHVzIC8qcFJlcGx5RGF0YSovKTsKLSAgICAgaWYgKHN0YXR1cyAhPSAwIHx8IGNtZFN0YXR1cyAhPSAwKSB7Ci0gICAgICAgICBBTE9HRSgiRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKSBlcnJvciAlZCBjbWRTdGF0dXMgJWQgd2hpbGUgZW5hYmxpbmcgZG93bm1peGVyIiwKLSAgICAgICAgICAgICAgICAgc3RhdHVzLCBjbWRTdGF0dXMpOwotICAgICAgICAgRWZmZWN0UmVsZWFzZShtRG93bm1peEhhbmRsZSk7Ci0gICAgICAgICBtRG93bm1peEhhbmRsZSA9IE5VTEw7Ci0gICAgICAgICByZXR1cm47Ci0gICAgIH0KLQotICAgICAvLyBTZXQgZG93bm1peCB0eXBlCi0gICAgIC8vIHBhcmFtZXRlciBzaXplIHJvdW5kZWQgZm9yIHBhZGRpbmcgb24gMzJiaXQgYm91bmRhcnkKLSAgICAgY29uc3QgaW50IHBzaXplUGFkZGVkID0gKChzaXplb2YoZG93bm1peF9wYXJhbXNfdCkgLSAxKS9zaXplb2YoaW50KSArIDEpICogc2l6ZW9mKGludCk7Ci0gICAgIGNvbnN0IGludCBkb3dubWl4UGFyYW1TaXplID0KLSAgICAgICAgICAgICBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcHNpemVQYWRkZWQgKyBzaXplb2YoZG93bm1peF90eXBlX3QpOwotICAgICBlZmZlY3RfcGFyYW1fdCAqIGNvbnN0IHBhcmFtID0gKGVmZmVjdF9wYXJhbV90ICopIG1hbGxvYyhkb3dubWl4UGFyYW1TaXplKTsKLSAgICAgcGFyYW0tPnBzaXplID0gc2l6ZW9mKGRvd25taXhfcGFyYW1zX3QpOwotICAgICBjb25zdCBkb3dubWl4X3BhcmFtc190IGRvd25taXhQYXJhbSA9IERPV05NSVhfUEFSQU1fVFlQRTsKLSAgICAgbWVtY3B5KHBhcmFtLT5kYXRhLCAmZG93bm1peFBhcmFtLCBwYXJhbS0+cHNpemUpOwotICAgICBjb25zdCBkb3dubWl4X3R5cGVfdCBkb3dubWl4VHlwZSA9IERPV05NSVhfVFlQRV9GT0xEOwotICAgICBwYXJhbS0+dnNpemUgPSBzaXplb2YoZG93bm1peF90eXBlX3QpOwotICAgICBtZW1jcHkocGFyYW0tPmRhdGEgKyBwc2l6ZVBhZGRlZCwgJmRvd25taXhUeXBlLCBwYXJhbS0+dnNpemUpOwotICAgICByZXBseVNpemUgPSBzaXplb2YoaW50KTsKLSAgICAgc3RhdHVzID0gKCptRG93bm1peEhhbmRsZSktPmNvbW1hbmQobURvd25taXhIYW5kbGUsCi0gICAgICAgICAgICAgRUZGRUNUX0NNRF9TRVRfUEFSQU0gLyogY21kQ29kZSAqLywgZG93bm1peFBhcmFtU2l6ZSAvKiBjbWRTaXplICovLAotICAgICAgICAgICAgIHBhcmFtIC8qcENtZERhdGEqLywgJnJlcGx5U2l6ZSwgJmNtZFN0YXR1cyAvKnBSZXBseURhdGEqLyk7Ci0gICAgIGZyZWUocGFyYW0pOwotICAgICBpZiAoc3RhdHVzICE9IDAgfHwgY21kU3RhdHVzICE9IDApIHsKLSAgICAgICAgIEFMT0dFKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpIGVycm9yICVkIGNtZFN0YXR1cyAlZCB3aGlsZSBzZXR0aW5nIGRvd25taXggdHlwZSIsCi0gICAgICAgICAgICAgICAgIHN0YXR1cywgY21kU3RhdHVzKTsKLSAgICAgICAgIEVmZmVjdFJlbGVhc2UobURvd25taXhIYW5kbGUpOwotICAgICAgICAgbURvd25taXhIYW5kbGUgPSBOVUxMOwotICAgICAgICAgcmV0dXJuOwotICAgICB9Ci0gICAgIEFMT0dWKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpIGRvd25taXggdHlwZSBzZXQgdG8gJWQiLCAoaW50KSBkb3dubWl4VHlwZSk7Ci19Ci0KLUF1ZGlvTWl4ZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjp+RG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKQotewotICAgIEFMT0dWKCJ+RG93bm1peGVyQnVmZmVyUHJvdmlkZXIgKCVwKSIsIHRoaXMpOwotICAgIEVmZmVjdFJlbGVhc2UobURvd25taXhIYW5kbGUpOwotICAgIG1Eb3dubWl4SGFuZGxlID0gTlVMTDsKLX0KLQotdm9pZCBBdWRpb01peGVyOjpEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6Y29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykKLXsKLSAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lczsKLSAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5idWZmZXIucmF3ID0gY29uc3RfY2FzdDx2b2lkICo+KHNyYyk7Ci0gICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVzOwotICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5idWZmZXIucmF3ID0gZHN0OwotICAgIC8vIG1heSBiZSBpbi1wbGFjZSBpZiBzcmMgPT0gZHN0LgotICAgIHN0YXR1c190IHJlcyA9ICgqbURvd25taXhIYW5kbGUpLT5wcm9jZXNzKG1Eb3dubWl4SGFuZGxlLAotICAgICAgICAgICAgJm1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmJ1ZmZlciwgJm1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5idWZmZXIpOwotICAgIEFMT0dFX0lGKHJlcyAhPSBPSywgIkRvd25taXhCdWZmZXJQcm92aWRlciBlcnJvciAlZCIsIHJlcyk7Ci19Ci0KLS8qIGNhbGwgb25jZSBpbiBhIHB0aHJlYWRfb25jZSBoYW5kbGVyLiAqLwotLypzdGF0aWMqLyBzdGF0dXNfdCBBdWRpb01peGVyOjpEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6aW5pdCgpCi17Ci0gICAgLy8gZmluZCBtdWx0aWNoYW5uZWwgZG93bm1peCBlZmZlY3QgaWYgd2UgaGF2ZSB0byBwbGF5IG11bHRpY2hhbm5lbCBjb250ZW50Ci0gICAgdWludDMyX3QgbnVtRWZmZWN0cyA9IDA7Ci0gICAgaW50IHJldCA9IEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cygmbnVtRWZmZWN0cyk7Ci0gICAgaWYgKHJldCAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb01peGVyKCkgZXJyb3IgJWQgcXVlcnlpbmcgbnVtYmVyIG9mIGVmZmVjdHMiLCByZXQpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgQUxPR1YoIkVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cygpIG51bUVmZmVjdHM9JWQiLCBudW1FZmZlY3RzKTsKLQotICAgIGZvciAodWludDMyX3QgaSA9IDAgOyBpIDwgbnVtRWZmZWN0cyA7IGkrKykgewotICAgICAgICBpZiAoRWZmZWN0UXVlcnlFZmZlY3QoaSwgJnNEd25tRnhEZXNjKSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVigiZWZmZWN0ICVkIGlzIGNhbGxlZCAlcyIsIGksIHNEd25tRnhEZXNjLm5hbWUpOwotICAgICAgICAgICAgaWYgKG1lbWNtcCgmc0R3bm1GeERlc2MudHlwZSwgRUZGRUNUX1VJSURfRE9XTk1JWCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIGVmZmVjdCBcIiVzXCIgZnJvbSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzRHdubUZ4RGVzYy5uYW1lLCBzRHdubUZ4RGVzYy5pbXBsZW1lbnRvcik7Ci0gICAgICAgICAgICAgICAgc0lzTXVsdGljaGFubmVsQ2FwYWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQUxPR1dfSUYoIXNJc011bHRpY2hhbm5lbENhcGFibGUsICJ1bmFibGUgdG8gZmluZCBkb3dubWl4IGVmZmVjdCIpOwotICAgIHJldHVybiBOT19JTklUOwotfQotCi0vKnN0YXRpYyovIGJvb2wgQXVkaW9NaXhlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OnNJc011bHRpY2hhbm5lbENhcGFibGUgPSBmYWxzZTsKLS8qc3RhdGljKi8gZWZmZWN0X2Rlc2NyaXB0b3JfdCBBdWRpb01peGVyOjpEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6c0R3bm1GeERlc2M7Ci0KLUF1ZGlvTWl4ZXI6OlJlbWl4QnVmZmVyUHJvdmlkZXI6OlJlbWl4QnVmZmVyUHJvdmlkZXIoYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5wdXRDaGFubmVsTWFzaywKLSAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0cHV0Q2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpIDoKLSAgICAgICAgQ29weUJ1ZmZlclByb3ZpZGVyKAotICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KQotICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhpbnB1dENoYW5uZWxNYXNrKSwKLSAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkKLSAgICAgICAgICAgICAgICAgICAgKiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sob3V0cHV0Q2hhbm5lbE1hc2spLAotICAgICAgICAgICAgICAgIGJ1ZmZlckZyYW1lQ291bnQpLAotICAgICAgICBtRm9ybWF0KGZvcm1hdCksCi0gICAgICAgIG1TYW1wbGVTaXplKGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSksCi0gICAgICAgIG1JbnB1dENoYW5uZWxzKGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhpbnB1dENoYW5uZWxNYXNrKSksCi0gICAgICAgIG1PdXRwdXRDaGFubmVscyhhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sob3V0cHV0Q2hhbm5lbE1hc2spKQotewotICAgIEFMT0dWKCJSZW1peEJ1ZmZlclByb3ZpZGVyKCVwKSglI3gsICUjeCwgJSN4KSAlenUgJXp1IiwKLSAgICAgICAgICAgIHRoaXMsIGZvcm1hdCwgaW5wdXRDaGFubmVsTWFzaywgb3V0cHV0Q2hhbm5lbE1hc2ssCi0gICAgICAgICAgICBtSW5wdXRDaGFubmVscywgbU91dHB1dENoYW5uZWxzKTsKLSAgICAvLyBUT0RPOiBjb25zaWRlciBjaGFubmVsIHJlcHJlc2VudGF0aW9uIGluIGluZGV4IGFycmF5IGZvcm11bGF0aW9uCi0gICAgLy8gV2UgaWdub3JlIGNoYW5uZWwgcmVwcmVzZW50YXRpb24sIGFuZCBqdXN0IHVzZSB0aGUgYml0cy4KLSAgICBtZW1jcHlfYnlfaW5kZXhfYXJyYXlfaW5pdGlhbGl6YXRpb24obUlkeEFyeSwgQVJSQVlfU0laRShtSWR4QXJ5KSwKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhvdXRwdXRDaGFubmVsTWFzayksCi0gICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoaW5wdXRDaGFubmVsTWFzaykpOwotfQotCi12b2lkIEF1ZGlvTWl4ZXI6OlJlbWl4QnVmZmVyUHJvdmlkZXI6OmNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpCi17Ci0gICAgbWVtY3B5X2J5X2luZGV4X2FycmF5KGRzdCwgbU91dHB1dENoYW5uZWxzLAotICAgICAgICAgICAgc3JjLCBtSW5wdXRDaGFubmVscywgbUlkeEFyeSwgbVNhbXBsZVNpemUsIGZyYW1lcyk7Ci19Ci0KLUF1ZGlvTWl4ZXI6OlJlZm9ybWF0QnVmZmVyUHJvdmlkZXI6OlJlZm9ybWF0QnVmZmVyUHJvdmlkZXIoaW50MzJfdCBjaGFubmVscywKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgaW5wdXRGb3JtYXQsIGF1ZGlvX2Zvcm1hdF90IG91dHB1dEZvcm1hdCwKLSAgICAgICAgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpIDoKLSAgICAgICAgQ29weUJ1ZmZlclByb3ZpZGVyKAotICAgICAgICAgICAgY2hhbm5lbHMgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGlucHV0Rm9ybWF0KSwKLSAgICAgICAgICAgIGNoYW5uZWxzICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShvdXRwdXRGb3JtYXQpLAotICAgICAgICAgICAgYnVmZmVyRnJhbWVDb3VudCksCi0gICAgICAgIG1DaGFubmVscyhjaGFubmVscyksCi0gICAgICAgIG1JbnB1dEZvcm1hdChpbnB1dEZvcm1hdCksCi0gICAgICAgIG1PdXRwdXRGb3JtYXQob3V0cHV0Rm9ybWF0KQotewotICAgIEFMT0dWKCJSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyKCVwKSglZCwgJSN4LCAlI3gpIiwgdGhpcywgY2hhbm5lbHMsIGlucHV0Rm9ybWF0LCBvdXRwdXRGb3JtYXQpOwotfQotCi12b2lkIEF1ZGlvTWl4ZXI6OlJlZm9ybWF0QnVmZmVyUHJvdmlkZXI6OmNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpCi17Ci0gICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChkc3QsIG1PdXRwdXRGb3JtYXQsIHNyYywgbUlucHV0Rm9ybWF0LCBmcmFtZXMgKiBtQ2hhbm5lbHMpOwotfQotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8vIEVuc3VyZSBtQ29uZmlndXJlZE5hbWVzIGJpdG1hc2sgaXMgaW5pdGlhbGl6ZWQgcHJvcGVybHkgb24gYWxsIGFyY2hpdGVjdHVyZXMuCkBAIC00MDcsNiArMTI5LDcgQEAKICAgICAgICAgdC0+cmVzYW1wbGVyID0gTlVMTDsKICAgICAgICAgdC0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgPSBOVUxMOwogICAgICAgICB0LT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlciA9IE5VTEw7CisgICAgICAgIHQtPm1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKICAgICAgICAgdCsrOwogICAgIH0KIApAQCAtNDE5LDYgKzE0Miw3IEBACiAgICAgICAgIGRlbGV0ZSB0LT5yZXNhbXBsZXI7CiAgICAgICAgIGRlbGV0ZSB0LT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlcjsKICAgICAgICAgZGVsZXRlIHQtPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOworICAgICAgICBkZWxldGUgdC0+bVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXI7CiAgICAgICAgIHQrKzsKICAgICB9CiAgICAgZGVsZXRlIFtdIG1TdGF0ZS5vdXRwdXRUZW1wOwpAQCAtNDMwLDYgKzE1NCwxMCBAQAogICAgIG1TdGF0ZS5tTG9nID0gbG9nOwogfQogCitzdGF0aWMgaW5saW5lIGF1ZGlvX2Zvcm1hdF90IHNlbGVjdE1peGVySW5Gb3JtYXQoYXVkaW9fZm9ybWF0X3QgaW5wdXRGb3JtYXQgX191bnVzZWQpIHsKKyAgICByZXR1cm4ga1VzZUZsb2F0ICYmIGtVc2VOZXdNaXhlciA/IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQgOiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKK30KKwogaW50IEF1ZGlvTWl4ZXI6OmdldFRyYWNrTmFtZShhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgc2Vzc2lvbklkKQogewpAQCAtNDkyLDI0ICsyMjAsMjUgQEAKICAgICAgICAgdC0+bUlucHV0QnVmZmVyUHJvdmlkZXIgPSBOVUxMOwogICAgICAgICB0LT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlciA9IE5VTEw7CiAgICAgICAgIHQtPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKKyAgICAgICAgdC0+bVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlciA9IE5VTEw7CisgICAgICAgIHQtPm1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKICAgICAgICAgdC0+bU1peGVyRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgICAgIHQtPm1Gb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgIHQtPm1NaXhlckluRm9ybWF0ID0ga1VzZUZsb2F0ICYmIGtVc2VOZXdNaXhlcgotICAgICAgICAgICAgICAgID8gQVVESU9fRk9STUFUX1BDTV9GTE9BVCA6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgICAgICB0LT5tTWl4ZXJJbkZvcm1hdCA9IHNlbGVjdE1peGVySW5Gb3JtYXQoZm9ybWF0KTsKKyAgICAgICAgdC0+bURvd25taXhSZXF1aXJlc0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOyAvLyBubyBmb3JtYXQgcmVxdWlyZWQKICAgICAgICAgdC0+bU1peGVyQ2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX21hc2tfZnJvbV9yZXByZXNlbnRhdGlvbl9hbmRfYml0cygKICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX1BPU0lUSU9OLCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOwogICAgICAgICB0LT5tTWl4ZXJDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sodC0+bU1peGVyQ2hhbm5lbE1hc2spOworICAgICAgICB0LT5tUGxheWJhY2tSYXRlID0gQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUOwogICAgICAgICAvLyBDaGVjayB0aGUgZG93bm1peGluZyAob3IgdXBtaXhpbmcpIHJlcXVpcmVtZW50cy4KLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5pdFRyYWNrRG93bm1peCh0LCBuKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gdC0+cHJlcGFyZUZvckRvd25taXgoKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIkF1ZGlvTWl4ZXI6OmdldFRyYWNrTmFtZSBpbnZhbGlkIGNoYW5uZWxNYXNrICglI3gpIiwgY2hhbm5lbE1hc2spOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9Ci0gICAgICAgIC8vIGluaXRUcmFja0Rvd25taXgoKSBtYXkgY2hhbmdlIHRoZSBpbnB1dCBmb3JtYXQgcmVxdWlyZW1lbnQuCi0gICAgICAgIC8vIElmIHlvdSBkZXNpcmUgZmxvYXRpbmcgcG9pbnQgaW5wdXQgdG8gdGhlIG1peGVyLCBpdCBtYXkgY2hhbmdlCi0gICAgICAgIC8vIHRvIGludGVnZXIgYmVjYXVzZSB0aGUgZG93bm1peGVyIHJlcXVpcmVzIGludGVnZXIgdG8gcHJvY2Vzcy4KKyAgICAgICAgLy8gcHJlcGFyZUZvckRvd25taXgoKSBtYXkgY2hhbmdlIG1Eb3dubWl4UmVxdWlyZXNGb3JtYXQKICAgICAgICAgQUxPR1ZWKCJtTWl4ZXJGb3JtYXQ6JSN4ICBtTWl4ZXJJbkZvcm1hdDolI3hcbiIsIHQtPm1NaXhlckZvcm1hdCwgdC0+bU1peGVySW5Gb3JtYXQpOwotICAgICAgICBwcmVwYXJlVHJhY2tGb3JSZWZvcm1hdCh0LCBuKTsKKyAgICAgICAgdC0+cHJlcGFyZUZvclJlZm9ybWF0KCk7CiAgICAgICAgIG1UcmFja05hbWVzIHw9IDEgPDwgbjsKICAgICAgICAgcmV0dXJuIFRSQUNLMCArIG47CiAgICAgfQpAQCAtNTI2LDcgKzI1NSw3IEBACiAgfQogCiAvLyBDYWxsZWQgd2hlbiBjaGFubmVsIG1hc2tzIGhhdmUgY2hhbmdlZCBmb3IgYSB0cmFjayBuYW1lCi0vLyBUT0RPOiBGaXggRG93bm1peGJ1ZmZlcnByb2ZpZGVyIG5vdCB0byAocG9zc2libHkpIGNoYW5nZSBtaXhlciBpbnB1dCBmb3JtYXQsCisvLyBUT0RPOiBGaXggRG93bm1peGVyQnVmZmVyUHJvdmlkZXIgbm90IHRvIChwb3NzaWJseSkgY2hhbmdlIG1peGVyIGlucHV0IGZvcm1hdCwKIC8vIHdoaWNoIHdpbGwgc2ltcGxpZnkgdGhpcyBsb2dpYy4KIGJvb2wgQXVkaW9NaXhlcjo6c2V0Q2hhbm5lbE1hc2tzKGludCBuYW1lLAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCB0cmFja0NoYW5uZWxNYXNrLCBhdWRpb19jaGFubmVsX21hc2tfdCBtaXhlckNoYW5uZWxNYXNrKSB7CkBAIC01NTEsMjEgKzI4MCwxOCBAQAogCiAgICAgLy8gY2hhbm5lbCBtYXNrcyBoYXZlIGNoYW5nZWQsIGRvZXMgdGhpcyB0cmFjayBuZWVkIGEgZG93bm1peGVyPwogICAgIC8vIHVwZGF0ZSB0byB0cnkgdXNpbmcgb3VyIGRlc2lyZWQgZm9ybWF0IChpZiB3ZSBhcmVuJ3QgYWxyZWFkeSB1c2luZyBpdCkKLSAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBwcmV2TWl4ZXJJbkZvcm1hdCA9IHRyYWNrLm1NaXhlckluRm9ybWF0OwotICAgIHRyYWNrLm1NaXhlckluRm9ybWF0ID0ga1VzZUZsb2F0ICYmIGtVc2VOZXdNaXhlcgotICAgICAgICAgICAgPyBBVURJT19GT1JNQVRfUENNX0ZMT0FUIDogQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7Ci0gICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gaW5pdFRyYWNrRG93bm1peCgmbVN0YXRlLnRyYWNrc1tuYW1lXSwgbmFtZSk7CisgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgcHJldkRvd25taXhlckZvcm1hdCA9IHRyYWNrLm1Eb3dubWl4UmVxdWlyZXNGb3JtYXQ7CisgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gbVN0YXRlLnRyYWNrc1tuYW1lXS5wcmVwYXJlRm9yRG93bm1peCgpOwogICAgIEFMT0dFX0lGKHN0YXR1cyAhPSBPSywKLSAgICAgICAgICAgICJpbml0VHJhY2tEb3dubWl4IGVycm9yICVkLCB0cmFjayBjaGFubmVsIG1hc2sgJSN4LCBtaXhlciBjaGFubmVsIG1hc2sgJSN4IiwKKyAgICAgICAgICAgICJwcmVwYXJlRm9yRG93bm1peCBlcnJvciAlZCwgdHJhY2sgY2hhbm5lbCBtYXNrICUjeCwgbWl4ZXIgY2hhbm5lbCBtYXNrICUjeCIsCiAgICAgICAgICAgICBzdGF0dXMsIHRyYWNrLmNoYW5uZWxNYXNrLCB0cmFjay5tTWl4ZXJDaGFubmVsTWFzayk7CiAKLSAgICBjb25zdCBib29sIG1peGVySW5Gb3JtYXRDaGFuZ2VkID0gcHJldk1peGVySW5Gb3JtYXQgIT0gdHJhY2subU1peGVySW5Gb3JtYXQ7Ci0gICAgaWYgKG1peGVySW5Gb3JtYXRDaGFuZ2VkKSB7Ci0gICAgICAgIHByZXBhcmVUcmFja0ZvclJlZm9ybWF0KCZ0cmFjaywgbmFtZSk7IC8vIGJlY2F1c2Ugb2YgZG93bm1peGVyLCB0cmFjayBmb3JtYXQgbWF5IGNoYW5nZSEKKyAgICBpZiAocHJldkRvd25taXhlckZvcm1hdCAhPSB0cmFjay5tRG93bm1peFJlcXVpcmVzRm9ybWF0KSB7CisgICAgICAgIHRyYWNrLnByZXBhcmVGb3JSZWZvcm1hdCgpOyAvLyBiZWNhdXNlIG9mIGRvd25taXhlciwgdHJhY2sgZm9ybWF0IG1heSBjaGFuZ2UhCiAgICAgfQogCi0gICAgaWYgKHRyYWNrLnJlc2FtcGxlciAmJiAobWl4ZXJJbkZvcm1hdENoYW5nZWQgfHwgbWl4ZXJDaGFubmVsQ291bnRDaGFuZ2VkKSkgewotICAgICAgICAvLyByZXNhbXBsZXIgaW5wdXQgZm9ybWF0IG9yIGNoYW5uZWxzIG1heSBoYXZlIGNoYW5nZWQuCisgICAgaWYgKHRyYWNrLnJlc2FtcGxlciAmJiBtaXhlckNoYW5uZWxDb3VudENoYW5nZWQpIHsKKyAgICAgICAgLy8gcmVzYW1wbGVyIGNoYW5uZWxzIG1heSBoYXZlIGNoYW5nZWQuCiAgICAgICAgIGNvbnN0IHVpbnQzMl90IHJlc2V0VG9TYW1wbGVSYXRlID0gdHJhY2suc2FtcGxlUmF0ZTsKICAgICAgICAgZGVsZXRlIHRyYWNrLnJlc2FtcGxlcjsKICAgICAgICAgdHJhY2sucmVzYW1wbGVyID0gTlVMTDsKQEAgLTU3Niw5OSArMzAyLDEyOSBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0dXNfdCBBdWRpb01peGVyOjppbml0VHJhY2tEb3dubWl4KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTmFtZSkKLXsKLSAgICAvLyBPbmx5IHJlbWl4ICh1cG1peCBvciBkb3dubWl4KSBpZiB0aGUgdHJhY2sgYW5kIG1peGVyL2RldmljZSBjaGFubmVsIG1hc2tzCi0gICAgLy8gYXJlIG5vdCB0aGUgc2FtZSBhbmQgbm90IGhhbmRsZWQgaW50ZXJuYWxseSwgYXMgbW9ubyAtPiBzdGVyZW8gY3VycmVudGx5IGlzLgotICAgIGlmIChwVHJhY2stPmNoYW5uZWxNYXNrICE9IHBUcmFjay0+bU1peGVyQ2hhbm5lbE1hc2sKLSAgICAgICAgICAgICYmICEocFRyYWNrLT5jaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PCi0gICAgICAgICAgICAgICAgICAgICYmIHBUcmFjay0+bU1peGVyQ2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSkgewotICAgICAgICByZXR1cm4gcHJlcGFyZVRyYWNrRm9yRG93bm1peChwVHJhY2ssIHRyYWNrTmFtZSk7Ci0gICAgfQotICAgIC8vIG5vIHJlbWl4IG5lY2Vzc2FyeQotICAgIHVucHJlcGFyZVRyYWNrRm9yRG93bm1peChwVHJhY2ssIHRyYWNrTmFtZSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQordm9pZCBBdWRpb01peGVyOjp0cmFja190Ojp1bnByZXBhcmVGb3JEb3dubWl4KCkgeworICAgIEFMT0dWKCJBdWRpb01peGVyOjp1bnByZXBhcmVGb3JEb3dubWl4KCVwKSIsIHRoaXMpOwogCi12b2lkIEF1ZGlvTWl4ZXI6OnVucHJlcGFyZVRyYWNrRm9yRG93bm1peCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja05hbWUgX191bnVzZWQpIHsKLSAgICBBTE9HVigiQXVkaW9NaXhlcjo6dW5wcmVwYXJlVHJhY2tGb3JEb3dubWl4KCVkKSIsIHRyYWNrTmFtZSk7Ci0KLSAgICBpZiAocFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7CisgICAgbURvd25taXhSZXF1aXJlc0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgIGlmIChkb3dubWl4ZXJCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7CiAgICAgICAgIC8vIHRoaXMgdHJhY2sgaGFkIHByZXZpb3VzbHkgYmVlbiBjb25maWd1cmVkIHdpdGggYSBkb3dubWl4ZXIsIGRlbGV0ZSBpdAogICAgICAgICBBTE9HVigiIGRlbGV0aW5nIG9sZCBkb3dubWl4ZXIiKTsKLSAgICAgICAgZGVsZXRlIHBUcmFjay0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXI7Ci0gICAgICAgIHBUcmFjay0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgPSBOVUxMOwotICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycyhwVHJhY2spOworICAgICAgICBkZWxldGUgZG93bm1peGVyQnVmZmVyUHJvdmlkZXI7CisgICAgICAgIGRvd25taXhlckJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKKyAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigiIG5vdGhpbmcgdG8gZG8sIG5vIGRvd25taXhlciB0byBkZWxldGUiKTsKICAgICB9CiB9CiAKLXN0YXR1c190IEF1ZGlvTWl4ZXI6OnByZXBhcmVUcmFja0ZvckRvd25taXgodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOYW1lKQorc3RhdHVzX3QgQXVkaW9NaXhlcjo6dHJhY2tfdDo6cHJlcGFyZUZvckRvd25taXgoKQogewotICAgIEFMT0dWKCJBdWRpb01peGVyOjpwcmVwYXJlVHJhY2tGb3JEb3dubWl4KCVkKSB3aXRoIG1hc2sgMHgleCIsIHRyYWNrTmFtZSwgcFRyYWNrLT5jaGFubmVsTWFzayk7CisgICAgQUxPR1YoIkF1ZGlvTWl4ZXI6OnByZXBhcmVGb3JEb3dubWl4KCVwKSB3aXRoIG1hc2sgMHgleCIsCisgICAgICAgICAgICB0aGlzLCBjaGFubmVsTWFzayk7CiAKICAgICAvLyBkaXNjYXJkIHRoZSBwcmV2aW91cyBkb3dubWl4ZXIgaWYgdGhlcmUgd2FzIG9uZQotICAgIHVucHJlcGFyZVRyYWNrRm9yRG93bm1peChwVHJhY2ssIHRyYWNrTmFtZSk7Ci0gICAgaWYgKERvd25taXhlckJ1ZmZlclByb3ZpZGVyOjppc011bHRpY2hhbm5lbENhcGFibGUoKSkgewotICAgICAgICBEb3dubWl4ZXJCdWZmZXJQcm92aWRlciogcERicCA9IG5ldyBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcihwVHJhY2stPmNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIHBUcmFjay0+bU1peGVyQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgLyogVE9ETzogdXNlIHBUcmFjay0+bU1peGVySW5Gb3JtYXQsIG5vdyBvbmx5IFBDTSAxNiAqLywKLSAgICAgICAgICAgICAgICBwVHJhY2stPnNhbXBsZVJhdGUsIHBUcmFjay0+c2Vzc2lvbklkLCBrQ29weUJ1ZmZlckZyYW1lQ291bnQpOworICAgIHVucHJlcGFyZUZvckRvd25taXgoKTsKKyAgICAvLyBNT05PX0hBQ0sgT25seSByZW1peCAodXBtaXggb3IgZG93bm1peCkgaWYgdGhlIHRyYWNrIGFuZCBtaXhlci9kZXZpY2UgY2hhbm5lbCBtYXNrcworICAgIC8vIGFyZSBub3QgdGhlIHNhbWUgYW5kIG5vdCBoYW5kbGVkIGludGVybmFsbHksIGFzIG1vbm8gLT4gc3RlcmVvIGN1cnJlbnRseSBpcy4KKyAgICBpZiAoY2hhbm5lbE1hc2sgPT0gbU1peGVyQ2hhbm5lbE1hc2sKKyAgICAgICAgICAgIHx8IChjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PCisgICAgICAgICAgICAgICAgICAgICYmIG1NaXhlckNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykpIHsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICAvLyBEb3dubWl4ZXJCdWZmZXJQcm92aWRlciBpcyBvbmx5IHVzZWQgZm9yIHBvc2l0aW9uIG1hc2tzLgorICAgIGlmIChhdWRpb19jaGFubmVsX21hc2tfZ2V0X3JlcHJlc2VudGF0aW9uKGNoYW5uZWxNYXNrKQorICAgICAgICAgICAgICAgID09IEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fUE9TSVRJT04KKyAgICAgICAgICAgICYmIERvd25taXhlckJ1ZmZlclByb3ZpZGVyOjppc011bHRpY2hhbm5lbENhcGFibGUoKSkgeworICAgICAgICBEb3dubWl4ZXJCdWZmZXJQcm92aWRlciogcERicCA9IG5ldyBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcihjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICBtTWl4ZXJDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCAvKiBUT0RPOiB1c2UgbU1peGVySW5Gb3JtYXQsIG5vdyBvbmx5IFBDTSAxNiAqLywKKyAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBzZXNzaW9uSWQsIGtDb3B5QnVmZmVyRnJhbWVDb3VudCk7CiAKICAgICAgICAgaWYgKHBEYnAtPmlzVmFsaWQoKSkgeyAvLyBpZiBjb25zdHJ1Y3RvciBjb21wbGV0ZWQgcHJvcGVybHkKLSAgICAgICAgICAgIHBUcmFjay0+bU1peGVySW5Gb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsgLy8gUENNIDE2IGJpdCByZXF1aXJlZCBmb3IgZG93bm1peAotICAgICAgICAgICAgcFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciA9IHBEYnA7Ci0gICAgICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycyhwVHJhY2spOworICAgICAgICAgICAgbURvd25taXhSZXF1aXJlc0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOyAvLyBQQ00gMTYgYml0IHJlcXVpcmVkIGZvciBkb3dubWl4CisgICAgICAgICAgICBkb3dubWl4ZXJCdWZmZXJQcm92aWRlciA9IHBEYnA7CisgICAgICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAgICAgICAgIGRlbGV0ZSBwRGJwOwogICAgIH0KIAogICAgIC8vIEVmZmVjdCBkb3dubWl4ZXIgZG9lcyBub3QgYWNjZXB0IHRoZSBjaGFubmVsIGNvbnZlcnNpb24uICBMZXQncyB1c2Ugb3VyIHJlbWl4ZXIuCi0gICAgUmVtaXhCdWZmZXJQcm92aWRlciogcFJicCA9IG5ldyBSZW1peEJ1ZmZlclByb3ZpZGVyKHBUcmFjay0+Y2hhbm5lbE1hc2ssCi0gICAgICAgICAgICBwVHJhY2stPm1NaXhlckNoYW5uZWxNYXNrLCBwVHJhY2stPm1NaXhlckluRm9ybWF0LCBrQ29weUJ1ZmZlckZyYW1lQ291bnQpOworICAgIFJlbWl4QnVmZmVyUHJvdmlkZXIqIHBSYnAgPSBuZXcgUmVtaXhCdWZmZXJQcm92aWRlcihjaGFubmVsTWFzaywKKyAgICAgICAgICAgIG1NaXhlckNoYW5uZWxNYXNrLCBtTWl4ZXJJbkZvcm1hdCwga0NvcHlCdWZmZXJGcmFtZUNvdW50KTsKICAgICAvLyBSZW1peCBhbHdheXMgZmluZHMgYSBjb252ZXJzaW9uIHdoZXJlYXMgRG93bm1peGVyIGVmZmVjdCBhYm92ZSBtYXkgZmFpbC4KLSAgICBwVHJhY2stPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyID0gcFJicDsKLSAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycyhwVHJhY2spOworICAgIGRvd25taXhlckJ1ZmZlclByb3ZpZGVyID0gcFJicDsKKyAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotdm9pZCBBdWRpb01peGVyOjp1bnByZXBhcmVUcmFja0ZvclJlZm9ybWF0KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTmFtZSBfX3VudXNlZCkgewotICAgIEFMT0dWKCJBdWRpb01peGVyOjp1bnByZXBhcmVUcmFja0ZvclJlZm9ybWF0KCVkKSIsIHRyYWNrTmFtZSk7Ci0gICAgaWYgKHBUcmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgcFRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlcjsKLSAgICAgICAgcFRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlciA9IE5VTEw7Ci0gICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKHBUcmFjayk7Cit2b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX3Q6OnVucHJlcGFyZUZvclJlZm9ybWF0KCkgeworICAgIEFMT0dWKCJBdWRpb01peGVyOjp1bnByZXBhcmVGb3JSZWZvcm1hdCglcCkiLCB0aGlzKTsKKyAgICBib29sIHJlcXVpcmVzUmVjb25maWd1cmUgPSBmYWxzZTsKKyAgICBpZiAobVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7CisgICAgICAgIG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKKyAgICAgICAgcmVxdWlyZXNSZWNvbmZpZ3VyZSA9IHRydWU7CisgICAgfQorICAgIGlmIChtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7CisgICAgICAgIG1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgPSBOVUxMOworICAgICAgICByZXF1aXJlc1JlY29uZmlndXJlID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKHJlcXVpcmVzUmVjb25maWd1cmUpIHsKKyAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKICAgICB9CiB9CiAKLXN0YXR1c190IEF1ZGlvTWl4ZXI6OnByZXBhcmVUcmFja0ZvclJlZm9ybWF0KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTmFtZSkKK3N0YXR1c190IEF1ZGlvTWl4ZXI6OnRyYWNrX3Q6OnByZXBhcmVGb3JSZWZvcm1hdCgpCiB7Ci0gICAgQUxPR1YoIkF1ZGlvTWl4ZXI6OnByZXBhcmVUcmFja0ZvclJlZm9ybWF0KCVkKSB3aXRoIGZvcm1hdCAlI3giLCB0cmFja05hbWUsIHBUcmFjay0+bUZvcm1hdCk7Ci0gICAgLy8gZGlzY2FyZCB0aGUgcHJldmlvdXMgcmVmb3JtYXR0ZXIgaWYgdGhlcmUgd2FzIG9uZQotICAgIHVucHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQocFRyYWNrLCB0cmFja05hbWUpOwotICAgIC8vIG9ubHkgY29uZmlndXJlIHJlZm9ybWF0dGVyIGlmIG5lZWRlZAotICAgIGlmIChwVHJhY2stPm1Gb3JtYXQgIT0gcFRyYWNrLT5tTWl4ZXJJbkZvcm1hdCkgewotICAgICAgICBwVHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyID0gbmV3IFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIoCi0gICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBUcmFjay0+Y2hhbm5lbE1hc2spLAotICAgICAgICAgICAgICAgIHBUcmFjay0+bUZvcm1hdCwgcFRyYWNrLT5tTWl4ZXJJbkZvcm1hdCwKKyAgICBBTE9HVigiQXVkaW9NaXhlcjo6cHJlcGFyZUZvclJlZm9ybWF0KCVwKSB3aXRoIGZvcm1hdCAlI3giLCB0aGlzLCBtRm9ybWF0KTsKKyAgICAvLyBkaXNjYXJkIHByZXZpb3VzIHJlZm9ybWF0dGVycworICAgIHVucHJlcGFyZUZvclJlZm9ybWF0KCk7CisgICAgLy8gb25seSBjb25maWd1cmUgcmVmb3JtYXR0ZXJzIGFzIG5lZWRlZAorICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IHRhcmdldEZvcm1hdCA9IG1Eb3dubWl4UmVxdWlyZXNGb3JtYXQgIT0gQVVESU9fRk9STUFUX0lOVkFMSUQKKyAgICAgICAgICAgID8gbURvd25taXhSZXF1aXJlc0Zvcm1hdCA6IG1NaXhlckluRm9ybWF0OworICAgIGJvb2wgcmVxdWlyZXNSZWNvbmZpZ3VyZSA9IGZhbHNlOworICAgIGlmIChtRm9ybWF0ICE9IHRhcmdldEZvcm1hdCkgeworICAgICAgICBtUmVmb3JtYXRCdWZmZXJQcm92aWRlciA9IG5ldyBSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayksCisgICAgICAgICAgICAgICAgbUZvcm1hdCwKKyAgICAgICAgICAgICAgICB0YXJnZXRGb3JtYXQsCiAgICAgICAgICAgICAgICAga0NvcHlCdWZmZXJGcmFtZUNvdW50KTsKLSAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMocFRyYWNrKTsKKyAgICAgICAgcmVxdWlyZXNSZWNvbmZpZ3VyZSA9IHRydWU7CisgICAgfQorICAgIGlmICh0YXJnZXRGb3JtYXQgIT0gbU1peGVySW5Gb3JtYXQpIHsKKyAgICAgICAgbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlciA9IG5ldyBSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtTWl4ZXJDaGFubmVsTWFzayksCisgICAgICAgICAgICAgICAgdGFyZ2V0Rm9ybWF0LAorICAgICAgICAgICAgICAgIG1NaXhlckluRm9ybWF0LAorICAgICAgICAgICAgICAgIGtDb3B5QnVmZmVyRnJhbWVDb3VudCk7CisgICAgICAgIHJlcXVpcmVzUmVjb25maWd1cmUgPSB0cnVlOworICAgIH0KKyAgICBpZiAocmVxdWlyZXNSZWNvbmZpZ3VyZSkgeworICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXZvaWQgQXVkaW9NaXhlcjo6cmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnModHJhY2tfdCogcFRyYWNrKQordm9pZCBBdWRpb01peGVyOjp0cmFja190OjpyZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpCiB7Ci0gICAgcFRyYWNrLT5idWZmZXJQcm92aWRlciA9IHBUcmFjay0+bUlucHV0QnVmZmVyUHJvdmlkZXI7Ci0gICAgaWYgKHBUcmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIpIHsKLSAgICAgICAgcFRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlci0+c2V0QnVmZmVyUHJvdmlkZXIocFRyYWNrLT5idWZmZXJQcm92aWRlcik7Ci0gICAgICAgIHBUcmFjay0+YnVmZmVyUHJvdmlkZXIgPSBwVHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOworICAgIGJ1ZmZlclByb3ZpZGVyID0gbUlucHV0QnVmZmVyUHJvdmlkZXI7CisgICAgaWYgKG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyKSB7CisgICAgICAgIG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLT5zZXRCdWZmZXJQcm92aWRlcihidWZmZXJQcm92aWRlcik7CisgICAgICAgIGJ1ZmZlclByb3ZpZGVyID0gbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7CiAgICAgfQotICAgIGlmIChwVHJhY2stPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyKSB7Ci0gICAgICAgIHBUcmFjay0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXItPnNldEJ1ZmZlclByb3ZpZGVyKHBUcmFjay0+YnVmZmVyUHJvdmlkZXIpOwotICAgICAgICBwVHJhY2stPmJ1ZmZlclByb3ZpZGVyID0gcFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlcjsKKyAgICBpZiAoZG93bm1peGVyQnVmZmVyUHJvdmlkZXIpIHsKKyAgICAgICAgZG93bm1peGVyQnVmZmVyUHJvdmlkZXItPnNldEJ1ZmZlclByb3ZpZGVyKGJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgYnVmZmVyUHJvdmlkZXIgPSBkb3dubWl4ZXJCdWZmZXJQcm92aWRlcjsKKyAgICB9CisgICAgaWYgKG1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIpIHsKKyAgICAgICAgbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlci0+c2V0QnVmZmVyUHJvdmlkZXIoYnVmZmVyUHJvdmlkZXIpOworICAgICAgICBidWZmZXJQcm92aWRlciA9IG1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7CisgICAgfQorICAgIGlmIChtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcikgeworICAgICAgICBtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlci0+c2V0QnVmZmVyUHJvdmlkZXIoYnVmZmVyUHJvdmlkZXIpOworICAgICAgICBidWZmZXJQcm92aWRlciA9IG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOwogICAgIH0KIH0KIApAQCAtNjg3LDEwICs0NDMsMTIgQEAKICAgICBkZWxldGUgdHJhY2sucmVzYW1wbGVyOwogICAgIHRyYWNrLnJlc2FtcGxlciA9IE5VTEw7CiAgICAgLy8gZGVsZXRlIHRoZSBkb3dubWl4ZXIKLSAgICB1bnByZXBhcmVUcmFja0ZvckRvd25taXgoJm1TdGF0ZS50cmFja3NbbmFtZV0sIG5hbWUpOworICAgIG1TdGF0ZS50cmFja3NbbmFtZV0udW5wcmVwYXJlRm9yRG93bm1peCgpOwogICAgIC8vIGRlbGV0ZSB0aGUgcmVmb3JtYXR0ZXIKLSAgICB1bnByZXBhcmVUcmFja0ZvclJlZm9ybWF0KCZtU3RhdGUudHJhY2tzW25hbWVdLCBuYW1lKTsKLQorICAgIG1TdGF0ZS50cmFja3NbbmFtZV0udW5wcmVwYXJlRm9yUmVmb3JtYXQoKTsKKyAgICAvLyBkZWxldGUgdGhlIHRpbWVzdHJldGNoIHByb3ZpZGVyCisgICAgZGVsZXRlIHRyYWNrLm1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOworICAgIHRyYWNrLm1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKICAgICBtVHJhY2tOYW1lcyAmPSB+KDE8PG5hbWUpOwogfQogCkBAIC03NDgsNDEgKzUwNiw5OSBAQAogc3RhdGljIGlubGluZSBib29sIHNldFZvbHVtZVJhbXBWYXJpYWJsZXMoZmxvYXQgbmV3Vm9sdW1lLCBpbnQzMl90IHJhbXAsCiAgICAgICAgIGludDE2X3QgKnBJbnRTZXRWb2x1bWUsIGludDMyX3QgKnBJbnRQcmV2Vm9sdW1lLCBpbnQzMl90ICpwSW50Vm9sdW1lSW5jLAogICAgICAgICBmbG9hdCAqcFNldFZvbHVtZSwgZmxvYXQgKnBQcmV2Vm9sdW1lLCBmbG9hdCAqcFZvbHVtZUluYykgeworICAgIC8vIGNoZWNrIGZsb2F0aW5nIHBvaW50IHZvbHVtZSB0byBzZWUgaWYgaXQgaXMgaWRlbnRpY2FsIHRvIHRoZSBwcmV2aW91c2x5CisgICAgLy8gc2V0IHZvbHVtZS4KKyAgICAvLyBXZSBkbyBub3QgdXNlIGEgdG9sZXJhbmNlIGhlcmUgKGFuZCByZWplY3QgY2hhbmdlcyB0b28gc21hbGwpCisgICAgLy8gYXMgaXQgbWF5IGJlIGNvbmZ1c2luZyB0byB1c2UgYSBkaWZmZXJlbnQgdmFsdWUgdGhhbiB0aGUgb25lIHNldC4KKyAgICAvLyBJZiB0aGUgcmVzdWx0aW5nIHZvbHVtZSBpcyB0b28gc21hbGwgdG8gcmFtcCwgaXQgaXMgYSBkaXJlY3Qgc2V0IG9mIHRoZSB2b2x1bWUuCiAgICAgaWYgKG5ld1ZvbHVtZSA9PSAqcFNldFZvbHVtZSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIC8qIHNldCB0aGUgZmxvYXRpbmcgcG9pbnQgdm9sdW1lIHZhcmlhYmxlcyAqLwotICAgIGlmIChyYW1wICE9IDApIHsKLSAgICAgICAgKnBWb2x1bWVJbmMgPSAobmV3Vm9sdW1lIC0gKnBTZXRWb2x1bWUpIC8gcmFtcDsKLSAgICAgICAgKnBQcmV2Vm9sdW1lID0gKnBTZXRWb2x1bWU7CisgICAgaWYgKG5ld1ZvbHVtZSA8IDApIHsKKyAgICAgICAgbmV3Vm9sdW1lID0gMDsgLy8gc2hvdWxkIG5vdCBoYXZlIG5lZ2F0aXZlIHZvbHVtZXMKICAgICB9IGVsc2UgewotICAgICAgICAqcFZvbHVtZUluYyA9IDA7Ci0gICAgICAgICpwUHJldlZvbHVtZSA9IG5ld1ZvbHVtZTsKKyAgICAgICAgc3dpdGNoIChmcGNsYXNzaWZ5KG5ld1ZvbHVtZSkpIHsKKyAgICAgICAgY2FzZSBGUF9TVUJOT1JNQUw6CisgICAgICAgIGNhc2UgRlBfTkFOOgorICAgICAgICAgICAgbmV3Vm9sdW1lID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZQX1pFUk86CisgICAgICAgICAgICBicmVhazsgLy8gemVybyB2b2x1bWUgaXMgZmluZQorICAgICAgICBjYXNlIEZQX0lORklOSVRFOgorICAgICAgICAgICAgLy8gSW5maW5pdGUgdm9sdW1lIGNvdWxkIGJlIGhhbmRsZWQgY29uc2lzdGVudGx5IHNpbmNlCisgICAgICAgICAgICAvLyBmbG9hdGluZyBwb2ludCBtYXRoIHNhdHVyYXRlcyBhdCBpbmZpbml0aWVzLAorICAgICAgICAgICAgLy8gYnV0IHdlIGxpbWl0IHZvbHVtZSB0byB1bml0eSBnYWluIGZsb2F0LgorICAgICAgICAgICAgLy8gcmFtcCA9IDA7IGJyZWFrOworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIG5ld1ZvbHVtZSA9IEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fRkxPQVQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGUF9OT1JNQUw6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBGbG9hdGluZyBwb2ludCBkb2VzIG5vdCBoYXZlIHByb2JsZW1zIHdpdGggb3ZlcmZsb3cgd3JhcAorICAgICAgICAgICAgLy8gdGhhdCBpbnRlZ2VyIGhhcy4gIEhvd2V2ZXIsIHdlIGxpbWl0IHRoZSB2b2x1bWUgdG8KKyAgICAgICAgICAgIC8vIHVuaXR5IGdhaW4gaGVyZS4KKyAgICAgICAgICAgIC8vIFRPRE86IFJldmlzaXQgdGhlIHZvbHVtZSBsaW1pdGF0aW9uIGFuZCBwZXJoYXBzIHBhcmFtZXRlcml6ZS4KKyAgICAgICAgICAgIGlmIChuZXdWb2x1bWUgPiBBdWRpb01peGVyOjpVTklUWV9HQUlOX0ZMT0FUKSB7CisgICAgICAgICAgICAgICAgbmV3Vm9sdW1lID0gQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9GTE9BVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgfQotICAgICpwU2V0Vm9sdW1lID0gbmV3Vm9sdW1lOwogCi0gICAgLyogc2V0IHRoZSBsZWdhY3kgaW50ZWdlciB2b2x1bWUgdmFyaWFibGVzICovCi0gICAgaW50MzJfdCBpbnRWb2x1bWUgPSBuZXdWb2x1bWUgKiBBdWRpb01peGVyOjpVTklUWV9HQUlOX0lOVDsKLSAgICBpZiAoaW50Vm9sdW1lID4gQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9JTlQpIHsKLSAgICAgICAgaW50Vm9sdW1lID0gQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9JTlQ7Ci0gICAgfSBlbHNlIGlmIChpbnRWb2x1bWUgPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJuZWdhdGl2ZSB2b2x1bWUgJS43ZyIsIG5ld1ZvbHVtZSk7Ci0gICAgICAgIGludFZvbHVtZSA9IDA7IC8vIHNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dCBmb3Igc2FmZXR5IGNoZWNrLgorICAgIC8vIHNldCBmbG9hdGluZyBwb2ludCB2b2x1bWUgcmFtcAorICAgIGlmIChyYW1wICE9IDApIHsKKyAgICAgICAgLy8gd2hlbiB0aGUgcmFtcCBjb21wbGV0ZXMsICpwUHJldlZvbHVtZSBpcyBzZXQgdG8gKnBTZXRWb2x1bWUsIHNvIHRoZXJlCisgICAgICAgIC8vIGlzIG5vIGNvbXB1dGF0aW9uYWwgbWlzbWF0Y2g7IGhlbmNlIGVxdWFsaXR5IGlzIGNoZWNrZWQgaGVyZS4KKyAgICAgICAgQUxPR0RfSUYoKnBQcmV2Vm9sdW1lICE9ICpwU2V0Vm9sdW1lLCAicHJldmlvdXMgZmxvYXQgcmFtcCBoYXNuJ3QgZmluaXNoZWQsIgorICAgICAgICAgICAgICAgICIgcHJldjolZiAgc2V0X3RvOiVmIiwgKnBQcmV2Vm9sdW1lLCAqcFNldFZvbHVtZSk7CisgICAgICAgIGNvbnN0IGZsb2F0IGluYyA9IChuZXdWb2x1bWUgLSAqcFByZXZWb2x1bWUpIC8gcmFtcDsgLy8gY291bGQgYmUgaW5mLCBuYW4sIHN1Ym5vcm1hbAorICAgICAgICBjb25zdCBmbG9hdCBtYXh2ID0gbWF4KG5ld1ZvbHVtZSwgKnBQcmV2Vm9sdW1lKTsgLy8gY291bGQgYmUgaW5mLCBjYW5ub3QgYmUgbmFuLCBzdWJub3JtYWwKKworICAgICAgICBpZiAoaXNub3JtYWwoaW5jKSAvLyBpbmMgbXVzdCBiZSBhIG5vcm1hbCBudW1iZXIgKG5vIHN1Ym5vcm1hbHMsIGluZmluaXRlLCBuYW4pCisgICAgICAgICAgICAgICAgJiYgbWF4diArIGluYyAhPSBtYXh2KSB7IC8vIGluYyBtdXN0IG1ha2UgZm9yd2FyZCBwcm9ncmVzcworICAgICAgICAgICAgKnBWb2x1bWVJbmMgPSBpbmM7CisgICAgICAgICAgICAvLyByYW1wIGlzIHNldCBub3cuCisgICAgICAgICAgICAvLyBOb3RlOiBpZiBuZXdWb2x1bWUgaXMgMCwgdGhlbiBuZWFyIHRoZSBlbmQgb2YgdGhlIHJhbXAsCisgICAgICAgICAgICAvLyBpdCBtYXkgYmUgcG9zc2libGUgdGhhdCB0aGUgcmFtcGVkIHZvbHVtZSBtYXkgYmUgc3Vibm9ybWFsIG9yCisgICAgICAgICAgICAvLyB0ZW1wb3JhcmlseSBuZWdhdGl2ZSBieSBhIHNtYWxsIGFtb3VudCBvciBzdWJub3JtYWwgZHVlIHRvIGZsb2F0aW5nCisgICAgICAgICAgICAvLyBwb2ludCBpbmFjY3VyYWNpZXMuCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByYW1wID0gMDsgLy8gcmFtcCBub3QgYWxsb3dlZAorICAgICAgICB9CiAgICAgfQotICAgIGlmIChpbnRWb2x1bWUgPT0gKnBJbnRTZXRWb2x1bWUpIHsKLSAgICAgICAgKnBJbnRWb2x1bWVJbmMgPSAwOwotICAgICAgICAvKiBUT0RPOiBpbnRlZ2VyL2Zsb2F0IHdvcmthcm91bmQ6IGlnbm9yZSBmbG9hdGluZyB2b2x1bWUgcmFtcCAqLworCisgICAgLy8gY29tcHV0ZSBhbmQgY2hlY2sgaW50ZWdlciB2b2x1bWUsIG5vIG5lZWQgdG8gY2hlY2sgbmVnYXRpdmUgdmFsdWVzCisgICAgLy8gVGhlIGludGVnZXIgdm9sdW1lIGlzIGxpbWl0ZWQgdG8gInVuaXR5X2dhaW4iIHRvIGF2b2lkIHdyYXBwaW5nIGFuZCBvdGhlcgorICAgIC8vIGF1ZGlvIGFydGlmYWN0cywgc28gaXQgbmV2ZXIgcmVhY2hlcyB0aGUgcmFuZ2UgbGltaXQgb2YgVTQuMjguCisgICAgLy8gV2Ugc2FmZWx5IHVzZSBzaWduZWQgMTYgYW5kIDMyIGJpdCBpbnRlZ2VycyBoZXJlLgorICAgIGNvbnN0IGZsb2F0IHNjYWxlZFZvbHVtZSA9IG5ld1ZvbHVtZSAqIEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fSU5UOyAvLyBub3QgbmVnLCBzdWJub3JtYWwsIG5hbgorICAgIGNvbnN0IGludDMyX3QgaW50Vm9sdW1lID0gKHNjYWxlZFZvbHVtZSA+PSAoZmxvYXQpQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9JTlQpID8KKyAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fSU5UIDogKGludDMyX3Qpc2NhbGVkVm9sdW1lOworCisgICAgLy8gc2V0IGludGVnZXIgdm9sdW1lIHJhbXAKKyAgICBpZiAocmFtcCAhPSAwKSB7CisgICAgICAgIC8vIGludGVnZXIgdm9sdW1lIGlzIFU0LjEyICh0byB1c2UgMTYgYml0IG11bHRpcGxpZXMpLCBidXQgcmFtcGluZyB1c2VzIFU0LjI4LgorICAgICAgICAvLyB3aGVuIHRoZSByYW1wIGNvbXBsZXRlcywgKnBJbnRQcmV2Vm9sdW1lIGlzIHNldCB0byAqcEludFNldFZvbHVtZSA8PCAxNiwgc28gdGhlcmUKKyAgICAgICAgLy8gaXMgbm8gY29tcHV0YXRpb25hbCBtaXNtYXRjaDsgaGVuY2UgZXF1YWxpdHkgaXMgY2hlY2tlZCBoZXJlLgorICAgICAgICBBTE9HRF9JRigqcEludFByZXZWb2x1bWUgIT0gKnBJbnRTZXRWb2x1bWUgPDwgMTYsICJwcmV2aW91cyBpbnQgcmFtcCBoYXNuJ3QgZmluaXNoZWQsIgorICAgICAgICAgICAgICAgICIgcHJldjolZCAgc2V0X3RvOiVkIiwgKnBJbnRQcmV2Vm9sdW1lLCAqcEludFNldFZvbHVtZSA8PCAxNik7CisgICAgICAgIGNvbnN0IGludDMyX3QgaW5jID0gKChpbnRWb2x1bWUgPDwgMTYpIC0gKnBJbnRQcmV2Vm9sdW1lKSAvIHJhbXA7CisKKyAgICAgICAgaWYgKGluYyAhPSAwKSB7IC8vIGluYyBtdXN0IG1ha2UgZm9yd2FyZCBwcm9ncmVzcworICAgICAgICAgICAgKnBJbnRWb2x1bWVJbmMgPSBpbmM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByYW1wID0gMDsgLy8gcmFtcCBub3QgYWxsb3dlZAorICAgICAgICB9CisgICAgfQorCisgICAgLy8gaWYgbm8gcmFtcCwgb3IgcmFtcCBub3QgYWxsb3dlZCwgdGhlbiBjbGVhciBmbG9hdCBhbmQgaW50ZWdlciBpbmNyZW1lbnRzCisgICAgaWYgKHJhbXAgPT0gMCkgewogICAgICAgICAqcFZvbHVtZUluYyA9IDA7CiAgICAgICAgICpwUHJldlZvbHVtZSA9IG5ld1ZvbHVtZTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmIChyYW1wICE9IDApIHsKLSAgICAgICAgKnBJbnRWb2x1bWVJbmMgPSAoKGludFZvbHVtZSAtICpwSW50U2V0Vm9sdW1lKSA8PCAxNikgLyByYW1wOwotICAgICAgICAqcEludFByZXZWb2x1bWUgPSAoKnBJbnRWb2x1bWVJbmMgPT0gMCA/IGludFZvbHVtZSA6ICpwSW50U2V0Vm9sdW1lKSA8PCAxNjsKLSAgICB9IGVsc2UgewogICAgICAgICAqcEludFZvbHVtZUluYyA9IDA7CiAgICAgICAgICpwSW50UHJldlZvbHVtZSA9IGludFZvbHVtZSA8PCAxNjsKICAgICB9CisgICAgKnBTZXRWb2x1bWUgPSBuZXdWb2x1bWU7CiAgICAgKnBJbnRTZXRWb2x1bWUgPSBpbnRWb2x1bWU7CiAgICAgcmV0dXJuIHRydWU7CiB9CkBAIC04MjgsNyArNjQ0LDcgQEAKICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCksICJJbnZhbGlkIGZvcm1hdCAlI3giLCBmb3JtYXQpOwogICAgICAgICAgICAgICAgIHRyYWNrLm1Gb3JtYXQgPSBmb3JtYXQ7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUUkFDSywgRk9STUFULCAlI3gpIiwgZm9ybWF0KTsKLSAgICAgICAgICAgICAgICBwcmVwYXJlVHJhY2tGb3JSZWZvcm1hdCgmdHJhY2ssIG5hbWUpOworICAgICAgICAgICAgICAgIHRyYWNrLnByZXBhcmVGb3JSZWZvcm1hdCgpOwogICAgICAgICAgICAgICAgIGludmFsaWRhdGVTdGF0ZSgxIDw8IG5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBicmVhazsKQEAgLTkxMiw2ICs3MjgsMjggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUSU1FU1RSRVRDSDoKKyAgICAgICAgICAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfUkFURTogeworICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICpwbGF5YmFja1JhdGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxBdWRpb1BsYXliYWNrUmF0ZSo+KHZhbHVlKTsKKyAgICAgICAgICAgICAgICBBTE9HV19JRighaXNBdWRpb1BsYXliYWNrUmF0ZVZhbGlkKCpwbGF5YmFja1JhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgImJhZCBwYXJhbWV0ZXJzIHNwZWVkICVmLCBwaXRjaCAlZiIscGxheWJhY2tSYXRlLT5tU3BlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUtPm1QaXRjaCk7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrLnNldFBsYXliYWNrUmF0ZSgqcGxheWJhY2tSYXRlKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRJTUVTVFJFVENILCBQTEFZQkFDS19SQVRFLCBTVFJFVENIX01PREUsIEZBTExCQUNLX01PREUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlZiAlZiAlZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tSYXRlLT5tU3BlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tSYXRlLT5tUGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tSYXRlLT5tU3RyZXRjaE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tSYXRlLT5tRmFsbGJhY2tNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gaW52YWxpZGF0ZVN0YXRlKDEgPDwgbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgic2V0UGFyYW1ldGVyIHRpbWVzdHJldGNoOiBiYWQgcGFyYW0gJWQiLCBwYXJhbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKIAogICAgIGRlZmF1bHQ6CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoInNldFBhcmFtZXRlcjogYmFkIHRhcmdldCAlZCIsIHRhcmdldCk7CkBAIC05MzEsMTEgKzc2OSwxMCBAQAogICAgICAgICAgICAgICAgIC8vIEZJWE1FIHRoaXMgaXMgZmxhd2VkIGZvciBkeW5hbWljIHNhbXBsZSByYXRlcywgYXMgd2UgY2hvb3NlIHRoZSByZXNhbXBsZXIKICAgICAgICAgICAgICAgICAvLyBxdWFsaXR5IGxldmVsIGJhc2VkIG9uIHRoZSBpbml0aWFsIHJhdGlvLCBidXQgdGhhdCBjb3VsZCBjaGFuZ2UgbGF0ZXIuCiAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIGhhdmUgYSB3YXkgdG8gZGlzdGluZ3Vpc2ggdHJhY2tzIHdpdGggc3RhdGljIHJhdGlvcyB2cy4gZHluYW1pYyByYXRpb3MuCi0gICAgICAgICAgICAgICAgaWYgKCEoKHRyYWNrU2FtcGxlUmF0ZSA9PSA0NDEwMCAmJiBkZXZTYW1wbGVSYXRlID09IDQ4MDAwKSB8fAotICAgICAgICAgICAgICAgICAgICAgICh0cmFja1NhbXBsZVJhdGUgPT0gNDgwMDAgJiYgZGV2U2FtcGxlUmF0ZSA9PSA0NDEwMCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHF1YWxpdHkgPSBBdWRpb1Jlc2FtcGxlcjo6RFlOX0xPV19RVUFMSVRZOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGlzTXVzaWNSYXRlKHRyYWNrU2FtcGxlUmF0ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSA9IEF1ZGlvUmVzYW1wbGVyOjpERUZBVUxUX1FVQUxJVFk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSA9IEF1ZGlvUmVzYW1wbGVyOjpEWU5fTE9XX1FVQUxJVFk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIE1PTk9fSEFDSy4gUmVzYW1wbGVyIHNlZXMgI2NoYW5uZWxzIGFmdGVyIHRoZSBkb3dubWl4ZXIKQEAgLTk1Nyw2ICs3OTQsMzAgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK2Jvb2wgQXVkaW9NaXhlcjo6dHJhY2tfdDo6c2V0UGxheWJhY2tSYXRlKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpCit7CisgICAgaWYgKChtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlciA9PSBOVUxMICYmCisgICAgICAgICAgICBmYWJzKHBsYXliYWNrUmF0ZS5tU3BlZWQgLSBtUGxheWJhY2tSYXRlLm1TcGVlZCkgPCBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NSU5fREVMVEEgJiYKKyAgICAgICAgICAgIGZhYnMocGxheWJhY2tSYXRlLm1QaXRjaCAtIG1QbGF5YmFja1JhdGUubVBpdGNoKSA8IEFVRElPX1RJTUVTVFJFVENIX1BJVENIX01JTl9ERUxUQSkgfHwKKyAgICAgICAgICAgIGlzQXVkaW9QbGF5YmFja1JhdGVFcXVhbChwbGF5YmFja1JhdGUsIG1QbGF5YmFja1JhdGUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbVBsYXliYWNrUmF0ZSA9IHBsYXliYWNrUmF0ZTsKKyAgICBpZiAobVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIgPT0gTlVMTCkgeworICAgICAgICAvLyBUT0RPOiBSZW1vdmUgTU9OT19IQUNLLiBSZXNhbXBsZXIgc2VlcyAjY2hhbm5lbHMgYWZ0ZXIgdGhlIGRvd25taXhlcgorICAgICAgICAvLyBidXQgaWYgbm9uZSBleGlzdHMsIGl0IGlzIHRoZSBjaGFubmVsIGNvdW50ICgxIGZvciBtb25vKS4KKyAgICAgICAgY29uc3QgaW50IHRpbWVzdHJldGNoQ2hhbm5lbENvdW50ID0gZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgIT0gTlVMTAorICAgICAgICAgICAgICAgID8gbU1peGVyQ2hhbm5lbENvdW50IDogY2hhbm5lbENvdW50OworICAgICAgICBtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlciA9IG5ldyBUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyKHRpbWVzdHJldGNoQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgIG1NaXhlckluRm9ybWF0LCBzYW1wbGVSYXRlLCBwbGF5YmFja1JhdGUpOworICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8VGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcio+KG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyKQorICAgICAgICAgICAgICAgIC0+c2V0UGxheWJhY2tSYXRlKHBsYXliYWNrUmF0ZSk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCiAvKiBDaGVja3MgdG8gc2VlIGlmIHRoZSB2b2x1bWUgcmFtcCBoYXMgY29tcGxldGVkIGFuZCBjbGVhcnMgdGhlIGluY3JlbWVudAogICogdmFyaWFibGVzIGFwcHJvcHJpYXRlbHkuCiAgKgpAQCAtOTc0LDcgKzgzNSw4IEBACiB7CiAgICAgaWYgKHVzZUZsb2F0KSB7CiAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBNQVhfTlVNX1ZPTFVNRVM7IGkrKykgewotICAgICAgICAgICAgaWYgKG1Wb2x1bWVJbmNbaV0gIT0gMCAmJiBmYWJzKG1Wb2x1bWVbaV0gLSBtUHJldlZvbHVtZVtpXSkgPD0gZmFicyhtVm9sdW1lSW5jW2ldKSkgeworICAgICAgICAgICAgaWYgKChtVm9sdW1lSW5jW2ldID4gMCAmJiBtUHJldlZvbHVtZVtpXSArIG1Wb2x1bWVJbmNbaV0gPj0gbVZvbHVtZVtpXSkgfHwKKyAgICAgICAgICAgICAgICAgICAgIChtVm9sdW1lSW5jW2ldIDwgMCAmJiBtUHJldlZvbHVtZVtpXSArIG1Wb2x1bWVJbmNbaV0gPD0gbVZvbHVtZVtpXSkpIHsKICAgICAgICAgICAgICAgICB2b2x1bWVJbmNbaV0gPSAwOwogICAgICAgICAgICAgICAgIHByZXZWb2x1bWVbaV0gPSB2b2x1bWVbaV0gPDwgMTY7CiAgICAgICAgICAgICAgICAgbVZvbHVtZUluY1tpXSA9IDAuOwpAQCAtMTAzMiwxMCArODk0LDE1IEBACiAgICAgaWYgKG1TdGF0ZS50cmFja3NbbmFtZV0ubVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgIT0gTlVMTCkgewogICAgICAgICBtU3RhdGUudHJhY2tzW25hbWVdLm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOwogICAgIH0gZWxzZSBpZiAobVN0YXRlLnRyYWNrc1tuYW1lXS5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7CisgICAgICAgIG1TdGF0ZS50cmFja3NbbmFtZV0uZG93bm1peGVyQnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CisgICAgfSBlbHNlIGlmIChtU3RhdGUudHJhY2tzW25hbWVdLm1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgIT0gTlVMTCkgeworICAgICAgICBtU3RhdGUudHJhY2tzW25hbWVdLm1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CisgICAgfSBlbHNlIGlmIChtU3RhdGUudHJhY2tzW25hbWVdLm1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpIHsKKyAgICAgICAgbVN0YXRlLnRyYWNrc1tuYW1lXS5tVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKICAgICB9CiAKICAgICBtU3RhdGUudHJhY2tzW25hbWVdLm1JbnB1dEJ1ZmZlclByb3ZpZGVyID0gYnVmZmVyUHJvdmlkZXI7Ci0gICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoJm1TdGF0ZS50cmFja3NbbmFtZV0pOworICAgIG1TdGF0ZS50cmFja3NbbmFtZV0ucmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKIH0KIAogCkBAIC0xMTE0LDcgKzk4MSw4IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmICgobiAmIE5FRURTX0NIQU5ORUxfQ09VTlRfX01BU0spID09IE5FRURTX0NIQU5ORUxfMSl7CiAgICAgICAgICAgICAgICAgICAgIHQuaG9vayA9IGdldFRyYWNrSG9vaygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lm1NaXhlckNoYW5uZWxDb3VudCA9PSAyIC8vIFRPRE86IE1PTk9fSEFDSy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodC5tTWl4ZXJDaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gIC8vIFRPRE86IE1PTk9fSEFDSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdC5jaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFRSQUNLVFlQRV9OT1JFU0FNUExFTU9OTyA6IFRSQUNLVFlQRV9OT1JFU0FNUExFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubU1peGVyQ2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubU1peGVySW5Gb3JtYXQsIHQubU1peGVyRm9ybWF0KTsKQEAgLTIyMzYsNCArMjEwNCw0IEBACiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaAppbmRleCBmNGYxNDJiLi43MTY1YzZjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmgKQEAgLTIzLDEyICsyMywxNCBAQAogCiAjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJMb2cuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9Db21wYXQuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKICNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlci5oIgorI2luY2x1ZGUgIkJ1ZmZlclByb3ZpZGVycy5oIgogCiAvLyBGSVhNRSBUaGlzIGlzIGFjdHVhbGx5IHVuaXR5IGdhaW4sIHdoaWNoIG1pZ2h0IG5vdCBiZSBtYXggaW4gZnV0dXJlLCBleHByZXNzZWQgaW4gVS4xMgogI2RlZmluZSBNQVhfR0FJTl9JTlQgQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9JTlQKQEAgLTcyLDYgKzc0LDcgQEAKICAgICAgICAgUkVTQU1QTEUgICAgICAgID0gMHgzMDAxLAogICAgICAgICBSQU1QX1ZPTFVNRSAgICAgPSAweDMwMDIsIC8vIHJhbXAgdG8gbmV3IHZvbHVtZQogICAgICAgICBWT0xVTUUgICAgICAgICAgPSAweDMwMDMsIC8vIGRvbid0IHJhbXAKKyAgICAgICAgVElNRVNUUkVUQ0ggICAgID0gMHgzMDA0LAogCiAgICAgICAgIC8vIHNldCBQYXJhbWV0ZXIgbmFtZXMKICAgICAgICAgLy8gZm9yIHRhcmdldCBUUkFDSwpAQCAtOTksNiArMTAyLDkgQEAKICAgICAgICAgVk9MVU1FMCAgICAgICAgID0gMHg0MjAwLAogICAgICAgICBWT0xVTUUxICAgICAgICAgPSAweDQyMDEsCiAgICAgICAgIEFVWExFVkVMICAgICAgICA9IDB4NDIxMCwKKyAgICAgICAgLy8gZm9yIHRhcmdldCBUSU1FU1RSRVRDSAorICAgICAgICBQTEFZQkFDS19SQVRFICAgPSAweDQzMDAsIC8vIENvbmZpZ3VyZSB0aW1lc3RyZXRjaCBvbiB0aGlzIHRyYWNrIG5hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVyICd2YWx1ZScgaXMgYSBwb2ludGVyIHRvIHRoZSBuZXcgcGxheWJhY2sgcmF0ZS4KICAgICB9OwogCiAKQEAgLTEyNywxMCArMTMzLDE2IEBACiAgICAgc2l6ZV90ICAgICAgZ2V0VW5yZWxlYXNlZEZyYW1lcyhpbnQgbmFtZSkgY29uc3Q7CiAKICAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNWYWxpZFBjbVRyYWNrRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgewotICAgICAgICByZXR1cm4gZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIHx8Ci0gICAgICAgICAgICAgICAgZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRCB8fAotICAgICAgICAgICAgICAgIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzMyX0JJVCB8fAotICAgICAgICAgICAgICAgIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICAgICAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQ6CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEOgorICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOgorICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogICAgIH0KIAogcHJpdmF0ZToKQEAgLTE1Myw3ICsxNjUsNiBAQAogCiAgICAgc3RydWN0IHN0YXRlX3Q7CiAgICAgc3RydWN0IHRyYWNrX3Q7Ci0gICAgY2xhc3MgQ29weUJ1ZmZlclByb3ZpZGVyOwogCiAgICAgdHlwZWRlZiB2b2lkICgqaG9va190KSh0cmFja190KiB0LCBpbnQzMl90KiBvdXRwdXQsIHNpemVfdCBudW1PdXRGcmFtZXMsIGludDMyX3QqIHRlbXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBhdXgpOwpAQCAtMjA1LDE3ICsyMTYsMzggQEAKICAgICAgICAgaW50MzJfdCogICAgICAgICAgIGF1eEJ1ZmZlcjsKIAogICAgICAgICAvLyAxNi1ieXRlIGJvdW5kYXJ5CisKKyAgICAgICAgLyogQnVmZmVyIHByb3ZpZGVycyBhcmUgY29uc3RydWN0ZWQgdG8gdHJhbnNsYXRlIHRoZSB0cmFjayBpbnB1dCBkYXRhIGFzIG5lZWRlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogVE9ETzogcGVyaGFwcyBtYWtlIGEgc2luZ2xlIFBsYXliYWNrQ29udmVydGVyUHJvdmlkZXIgY2xhc3MgdG8gbW92ZQorICAgICAgICAgKiBhbGwgcHJlLW1peGVyIHRyYWNrIGJ1ZmZlciBjb252ZXJzaW9ucyBvdXRzaWRlIHRoZSBBdWRpb01peGVyIGNsYXNzLgorICAgICAgICAgKgorICAgICAgICAgKiAxKSBtSW5wdXRCdWZmZXJQcm92aWRlcjogVGhlIEF1ZGlvVHJhY2sgYnVmZmVyIHByb3ZpZGVyLgorICAgICAgICAgKiAyKSBtUmVmb3JtYXRCdWZmZXJQcm92aWRlcjogSWYgbm90IE5VTEwsIHBlcmZvcm1zIHRoZSBhdWRpbyByZWZvcm1hdCB0bworICAgICAgICAgKiAgICBtYXRjaCBlaXRoZXIgbU1peGVySW5Gb3JtYXQgb3IgbURvd25taXhSZXF1aXJlc0Zvcm1hdCwgaWYgdGhlIGRvd25taXhlcgorICAgICAgICAgKiAgICByZXF1aXJlcyByZWZvcm1hdC4gRm9yIGV4YW1wbGUsIGl0IG1heSBjb252ZXJ0IGZsb2F0aW5nIHBvaW50IGlucHV0IHRvCisgICAgICAgICAqICAgIFBDTV8xNl9iaXQgaWYgdGhhdCdzIHJlcXVpcmVkIGJ5IHRoZSBkb3dubWl4ZXIuCisgICAgICAgICAqIDMpIGRvd25taXhlckJ1ZmZlclByb3ZpZGVyOiBJZiBub3QgTlVMTCwgcGVyZm9ybXMgdGhlIGNoYW5uZWwgcmVtaXhpbmcgdG8gbWF0Y2gKKyAgICAgICAgICogICAgdGhlIG51bWJlciBvZiBjaGFubmVscyByZXF1aXJlZCBieSB0aGUgbWl4ZXIgc2luay4KKyAgICAgICAgICogNCkgbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlcjogSWYgbm90IE5VTEwsIHBlcmZvcm1zIHJlZm9ybWF0dGluZyBmcm9tCisgICAgICAgICAqICAgIHRoZSBkb3dubWl4ZXIgcmVxdWlyZW1lbnRzIHRvIHRoZSBtaXhlciBlbmdpbmUgaW5wdXQgcmVxdWlyZW1lbnRzLgorICAgICAgICAgKiA1KSBtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjogQWRkcyB0aW1lc3RyZXRjaGluZyBmb3IgcGxheWJhY2sgcmF0ZQorICAgICAgICAgKi8KICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogICAgIG1JbnB1dEJ1ZmZlclByb3ZpZGVyOyAgICAvLyBleHRlcm5hbGx5IHByb3ZpZGVkIGJ1ZmZlciBwcm92aWRlci4KLSAgICAgICAgQ29weUJ1ZmZlclByb3ZpZGVyKiAgICAgIG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOyAvLyBwcm92aWRlciB3cmFwcGVyIGZvciByZWZvcm1hdHRpbmcuCi0gICAgICAgIENvcHlCdWZmZXJQcm92aWRlciogICAgICBkb3dubWl4ZXJCdWZmZXJQcm92aWRlcjsgLy8gd3JhcHBlciBmb3IgY2hhbm5lbCBjb252ZXJzaW9uLgorICAgICAgICBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyKiAgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7IC8vIHByb3ZpZGVyIHdyYXBwZXIgZm9yIHJlZm9ybWF0dGluZy4KKyAgICAgICAgUGFzc3RocnVCdWZmZXJQcm92aWRlciogIGRvd25taXhlckJ1ZmZlclByb3ZpZGVyOyAvLyB3cmFwcGVyIGZvciBjaGFubmVsIGNvbnZlcnNpb24uCisgICAgICAgIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXIqICBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOworICAgICAgICBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyKiAgbVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXI7CiAKICAgICAgICAgaW50MzJfdCAgICAgc2Vzc2lvbklkOwogCi0gICAgICAgIC8vIDE2LWJ5dGUgYm91bmRhcnkKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgbU1peGVyRm9ybWF0OyAgICAgLy8gb3V0cHV0IG1peCBmb3JtYXQ6IEFVRElPX0ZPUk1BVF9QQ01fKEZMT0FUfDE2X0JJVCkKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdDsgICAgICAgICAgLy8gaW5wdXQgdHJhY2sgZm9ybWF0CiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1NaXhlckluRm9ybWF0OyAgIC8vIG1peCBpbnRlcm5hbCBmb3JtYXQgQVVESU9fRk9STUFUX1BDTV8oRkxPQVR8MTZfQklUKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlYWNoIHRyYWNrIG11c3QgYmUgY29udmVydGVkIHRvIHRoaXMgZm9ybWF0LgorICAgICAgICBhdWRpb19mb3JtYXRfdCBtRG93bm1peFJlcXVpcmVzRm9ybWF0OyAgLy8gcmVxdWlyZWQgZG93bm1peGVyIGZvcm1hdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgaWYgMTYgYml0IG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQVVESU9fRk9STUFUX0lOVkFMSUQgaWYgbm8gcmVxdWlyZWQgZm9ybWF0CiAKICAgICAgICAgZmxvYXQgICAgICAgICAgbVZvbHVtZVtNQVhfTlVNX1ZPTFVNRVNdOyAgICAgLy8gZmxvYXRpbmcgcG9pbnQgc2V0IHZvbHVtZQogICAgICAgICBmbG9hdCAgICAgICAgICBtUHJldlZvbHVtZVtNQVhfTlVNX1ZPTFVNRVNdOyAvLyBmbG9hdGluZyBwb2ludCBwcmV2aW91cyB2b2x1bWUKQEAgLTIyNSwxMCArMjU3LDExIEBACiAgICAgICAgIGZsb2F0ICAgICAgICAgIG1QcmV2QXV4TGV2ZWw7ICAgICAgICAgICAgICAgICAvLyBmbG9hdGluZyBwb2ludCBwcmV2IGF1eCBsZXZlbAogICAgICAgICBmbG9hdCAgICAgICAgICBtQXV4SW5jOyAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXRpbmcgcG9pbnQgYXV4IGluY3JlbWVudAogCi0gICAgICAgIC8vIDE2LWJ5dGUgYm91bmRhcnkKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbU1peGVyQ2hhbm5lbE1hc2s7CiAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1NaXhlckNoYW5uZWxDb3VudDsKIAorICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSAgICBtUGxheWJhY2tSYXRlOworCiAgICAgICAgIGJvb2wgICAgICAgIG5lZWRzUmFtcCgpIHsgcmV0dXJuICh2b2x1bWVJbmNbMF0gfCB2b2x1bWVJbmNbMV0gfCBhdXhJbmMpICE9IDA7IH0KICAgICAgICAgYm9vbCAgICAgICAgc2V0UmVzYW1wbGVyKHVpbnQzMl90IHRyYWNrU2FtcGxlUmF0ZSwgdWludDMyX3QgZGV2U2FtcGxlUmF0ZSk7CiAgICAgICAgIGJvb2wgICAgICAgIGRvZXNSZXNhbXBsZSgpIGNvbnN0IHsgcmV0dXJuIHJlc2FtcGxlciAhPSBOVUxMOyB9CkBAIC0yMzYsNiArMjY5LDEzIEBACiAgICAgICAgIHZvaWQgICAgICAgIGFkanVzdFZvbHVtZVJhbXAoYm9vbCBhdXgsIGJvb2wgdXNlRmxvYXQgPSBmYWxzZSk7CiAgICAgICAgIHNpemVfdCAgICAgIGdldFVucmVsZWFzZWRGcmFtZXMoKSBjb25zdCB7IHJldHVybiByZXNhbXBsZXIgIT0gTlVMTCA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzYW1wbGVyLT5nZXRVbnJlbGVhc2VkRnJhbWVzKCkgOiAwOyB9OworCisgICAgICAgIHN0YXR1c190ICAgIHByZXBhcmVGb3JEb3dubWl4KCk7CisgICAgICAgIHZvaWQgICAgICAgIHVucHJlcGFyZUZvckRvd25taXgoKTsKKyAgICAgICAgc3RhdHVzX3QgICAgcHJlcGFyZUZvclJlZm9ybWF0KCk7CisgICAgICAgIHZvaWQgICAgICAgIHVucHJlcGFyZUZvclJlZm9ybWF0KCk7CisgICAgICAgIGJvb2wgICAgICAgIHNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKTsKKyAgICAgICAgdm9pZCAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKICAgICB9OwogCiAgICAgdHlwZWRlZiB2b2lkICgqcHJvY2Vzc19ob29rX3QpKHN0YXRlX3QqIHN0YXRlLCBpbnQ2NF90IHB0cyk7CkBAIC0yNTQsMTEyICsyOTQsNiBAQAogICAgICAgICB0cmFja190ICAgICAgICAgdHJhY2tzW01BWF9OVU1fVFJBQ0tTXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDMyKSkpOwogICAgIH07CiAKLSAgICAvLyBCYXNlIEF1ZGlvQnVmZmVyUHJvdmlkZXIgY2xhc3MgdXNlZCBmb3IgRG93bk1peGVyQnVmZmVyUHJvdmlkZXIsIFJlbWl4QnVmZmVyUHJvdmlkZXIsCi0gICAgLy8gYW5kIFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuCi0gICAgLy8gSXQgaGFuZGxlcyBhIHByaXZhdGUgYnVmZmVyIGZvciB1c2UgaW4gY29udmVydGluZyBmb3JtYXQgb3IgY2hhbm5lbCBtYXNrcyBmcm9tIHRoZQotICAgIC8vIGlucHV0IGRhdGEgdG8gYSBmb3JtIGFjY2VwdGFibGUgYnkgdGhlIG1peGVyLgotICAgIC8vIFRPRE86IE1ha2UgYSBSZXNhbXBsZXJCdWZmZXJQcm92aWRlciB3aGVuIGludGVnZXJzIGFyZSBlbnRpcmVseSByZW1vdmVkIGZyb20gdGhlCi0gICAgLy8gcHJvY2Vzc2luZyBwaXBlbGluZS4KLSAgICBjbGFzcyBDb3B5QnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQXVkaW9CdWZmZXJQcm92aWRlciB7Ci0gICAgcHVibGljOgotICAgICAgICAvLyBVc2UgYSBwcml2YXRlIGJ1ZmZlciBvZiBidWZmZXJGcmFtZUNvdW50IGZyYW1lcyAoZWFjaCBmcmFtZSBpcyBvdXRwdXRGcmFtZVNpemUgYnl0ZXMpLgotICAgICAgICAvLyBJZiBidWZmZXJGcmFtZUNvdW50IGlzIDAsIG5vIHByaXZhdGUgYnVmZmVyIGlzIGNyZWF0ZWQgYW5kIGluLXBsYWNlIG1vZGlmaWNhdGlvbiBvZgotICAgICAgICAvLyB0aGUgdXBzdHJlYW0gYnVmZmVyIHByb3ZpZGVyJ3MgYnVmZmVycyBpcyBwZXJmb3JtZWQgYnkgY29weUZyYW1lcygpLgotICAgICAgICBDb3B5QnVmZmVyUHJvdmlkZXIoc2l6ZV90IGlucHV0RnJhbWVTaXplLCBzaXplX3Qgb3V0cHV0RnJhbWVTaXplLAotICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KTsKLSAgICAgICAgdmlydHVhbCB+Q29weUJ1ZmZlclByb3ZpZGVyKCk7Ci0KLSAgICAgICAgLy8gT3ZlcnJpZGVzIEF1ZGlvQnVmZmVyUHJvdmlkZXIgbWV0aG9kcwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRCdWZmZXIoQnVmZmVyKiBidWZmZXIsIGludDY0X3QgcHRzKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VCdWZmZXIoQnVmZmVyKiBidWZmZXIpOwotCi0gICAgICAgIC8vIE90aGVyIHB1YmxpYyBtZXRob2RzCi0KLSAgICAgICAgLy8gY2FsbCB0aGlzIHRvIHJlbGVhc2UgdGhlIGJ1ZmZlciB0byB0aGUgdXBzdHJlYW0gcHJvdmlkZXIuCi0gICAgICAgIC8vIHRyZWF0IGl0IGFzIGFuIGF1ZGlvIGRpc2NvbnRpbnVpdHkgZm9yIGZ1dHVyZSBzYW1wbGVzLgotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKLQotICAgICAgICAvLyB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBzdXBwbGllZCBieSB0aGUgZGVyaXZlZCBjbGFzcy4gIEl0IGNvbnZlcnRzCi0gICAgICAgIC8vICNmcmFtZXMgaW4gdGhlICpzcmMgcG9pbnRlciB0byB0aGUgKmRzdCBwb2ludGVyLiAgSXQgaXMgcHVibGljIGJlY2F1c2UKLSAgICAgICAgLy8gc29tZSBwcm92aWRlcnMgd2lsbCBhbGxvdyB0aGlzIHRvIHdvcmsgb24gYXJiaXRyYXJ5IGJ1ZmZlcnMgb3V0c2lkZQotICAgICAgICAvLyBvZiB0aGUgaW50ZXJuYWwgYnVmZmVycy4KLSAgICAgICAgdmlydHVhbCB2b2lkIGNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpID0gMDsKLQotICAgICAgICAvLyBzZXQgdGhlIHVwc3RyZWFtIGJ1ZmZlciBwcm92aWRlci4gQ29uc2lkZXIgY2FsbGluZyAicmVzZXQiIGJlZm9yZSB0aGlzIGZ1bmN0aW9uLgotICAgICAgICB2b2lkIHNldEJ1ZmZlclByb3ZpZGVyKEF1ZGlvQnVmZmVyUHJvdmlkZXIgKnApIHsKLSAgICAgICAgICAgIG1UcmFja0J1ZmZlclByb3ZpZGVyID0gcDsKLSAgICAgICAgfQotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBtVHJhY2tCdWZmZXJQcm92aWRlcjsKLSAgICAgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbUlucHV0RnJhbWVTaXplOwotICAgICAgICBjb25zdCBzaXplX3QgICAgICAgICBtT3V0cHV0RnJhbWVTaXplOwotICAgIHByaXZhdGU6Ci0gICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBtQnVmZmVyOwotICAgICAgICBjb25zdCBzaXplX3QgICAgICAgICBtTG9jYWxCdWZmZXJGcmFtZUNvdW50OwotICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICBtTG9jYWxCdWZmZXJEYXRhOwotICAgICAgICBzaXplX3QgICAgICAgICAgICAgICBtQ29uc3VtZWQ7Ci0gICAgfTsKLQotICAgIC8vIERvd25taXhlckJ1ZmZlclByb3ZpZGVyIHdyYXBzIGEgdHJhY2sgQXVkaW9CdWZmZXJQcm92aWRlciB0byBwcm92aWRlCi0gICAgLy8gcG9zaXRpb24gZGVwZW5kZW50IGRvd25taXhpbmcgYnkgYW4gQXVkaW8gRWZmZWN0LgotICAgIGNsYXNzIERvd25taXhlckJ1ZmZlclByb3ZpZGVyIDogcHVibGljIENvcHlCdWZmZXJQcm92aWRlciB7Ci0gICAgcHVibGljOgotICAgICAgICBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcihhdWRpb19jaGFubmVsX21hc2tfdCBpbnB1dENoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dHB1dENoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBzZXNzaW9uSWQsIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KTsKLSAgICAgICAgdmlydHVhbCB+RG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIGNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpOwotICAgICAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBtRG93bm1peEhhbmRsZSAhPSBOVUxMOyB9Ci0KLSAgICAgICAgc3RhdGljIHN0YXR1c190IGluaXQoKTsKLSAgICAgICAgc3RhdGljIGJvb2wgaXNNdWx0aWNoYW5uZWxDYXBhYmxlKCkgeyByZXR1cm4gc0lzTXVsdGljaGFubmVsQ2FwYWJsZTsgfQotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICBlZmZlY3RfaGFuZGxlX3QgICAgbURvd25taXhIYW5kbGU7Ci0gICAgICAgIGVmZmVjdF9jb25maWdfdCAgICBtRG93bm1peENvbmZpZzsKLQotICAgICAgICAvLyBlZmZlY3QgZGVzY3JpcHRvciBmb3IgdGhlIGRvd25taXhlciB1c2VkIGJ5IHRoZSBtaXhlcgotICAgICAgICBzdGF0aWMgZWZmZWN0X2Rlc2NyaXB0b3JfdCBzRHdubUZ4RGVzYzsKLSAgICAgICAgLy8gaW5kaWNhdGVzIHdoZXRoZXIgYSBkb3dubWl4IGVmZmVjdCBoYXMgYmVlbiBmb3VuZCBhbmQgaXMgdXNhYmxlIGJ5IHRoaXMgbWl4ZXIKLSAgICAgICAgc3RhdGljIGJvb2wgICAgICAgICAgICAgICAgc0lzTXVsdGljaGFubmVsQ2FwYWJsZTsKLSAgICAgICAgLy8gRklYTUU6IHNob3VsZCB3ZSBhbGxvdyBlZmZlY3RzIG91dHNpZGUgb2YgdGhlIGZyYW1ld29yaz8KLSAgICAgICAgLy8gV2UgbmVlZCB0byBoZXJlLiBBIHNwZWNpYWwgaW9JZCB0aGF0IG11c3QgYmUgPD0gLTIgc28gaXQgZG9lcyBub3QgbWFwIHRvIGEgc2Vzc2lvbi4KLSAgICAgICAgc3RhdGljIGNvbnN0IGludDMyX3QgU0VTU0lPTl9JRF9JTlZBTElEX0FORF9JR05PUkVEID0gLTI7Ci0gICAgfTsKLQotICAgIC8vIFJlbWl4QnVmZmVyUHJvdmlkZXIgd3JhcHMgYSB0cmFjayBBdWRpb0J1ZmZlclByb3ZpZGVyIHRvIHBlcmZvcm0gYW4KLSAgICAvLyB1cG1peCBvciBkb3dubWl4IHRvIHRoZSBwcm9wZXIgY2hhbm5lbCBjb3VudCBhbmQgbWFzay4KLSAgICBjbGFzcyBSZW1peEJ1ZmZlclByb3ZpZGVyIDogcHVibGljIENvcHlCdWZmZXJQcm92aWRlciB7Ci0gICAgcHVibGljOgotICAgICAgICBSZW1peEJ1ZmZlclByb3ZpZGVyKGF1ZGlvX2NoYW5uZWxfbWFza190IGlucHV0Q2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0cHV0Q2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKTsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdDsKLSAgICAgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbVNhbXBsZVNpemU7Ci0gICAgICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1JbnB1dENoYW5uZWxzOwotICAgICAgICBjb25zdCBzaXplX3QgICAgICAgICBtT3V0cHV0Q2hhbm5lbHM7Ci0gICAgICAgIGludDhfdCAgICAgICAgICAgICAgIG1JZHhBcnlbc2l6ZW9mKHVpbnQzMl90KSo4XTsgLy8gMzIgYml0cyA9PiBjaGFubmVsIGluZGljZXMKLSAgICB9OwotCi0gICAgLy8gUmVmb3JtYXRCdWZmZXJQcm92aWRlciB3cmFwcyBhIHRyYWNrIEF1ZGlvQnVmZmVyUHJvdmlkZXIgdG8gY29udmVydCB0aGUgaW5wdXQgZGF0YQotICAgIC8vIHRvIGFuIGFjY2VwdGFibGUgbWl4ZXIgaW5wdXQgZm9ybWF0IHR5cGUuCi0gICAgY2xhc3MgUmVmb3JtYXRCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBDb3B5QnVmZmVyUHJvdmlkZXIgewotICAgIHB1YmxpYzoKLSAgICAgICAgUmVmb3JtYXRCdWZmZXJQcm92aWRlcihpbnQzMl90IGNoYW5uZWxzLAotICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGlucHV0Rm9ybWF0LCBhdWRpb19mb3JtYXRfdCBvdXRwdXRGb3JtYXQsCi0gICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgY29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcyk7Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIGNvbnN0IGludDMyX3QgICAgICAgIG1DaGFubmVsczsKLSAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgbUlucHV0Rm9ybWF0OwotICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBtT3V0cHV0Rm9ybWF0OwotICAgIH07Ci0KICAgICAvLyBiaXRtYXNrIG9mIGFsbG9jYXRlZCB0cmFjayBuYW1lcywgd2hlcmUgYml0IDAgY29ycmVzcG9uZHMgdG8gVFJBQ0swIGV0Yy4KICAgICB1aW50MzJfdCAgICAgICAgbVRyYWNrTmFtZXM7CiAKQEAgLTM4MiwxNCArMzE2LDYgQEAKICAgICBib29sIHNldENoYW5uZWxNYXNrcyhpbnQgbmFtZSwKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IHRyYWNrQ2hhbm5lbE1hc2ssIGF1ZGlvX2NoYW5uZWxfbWFza190IG1peGVyQ2hhbm5lbE1hc2spOwogCi0gICAgLy8gVE9ETzogcmVtb3ZlIHVudXNlZCB0cmFja05hbWUvdHJhY2tOdW0gZnJvbSBmdW5jdGlvbnMgYmVsb3cuCi0gICAgc3RhdGljIHN0YXR1c190IGluaXRUcmFja0Rvd25taXgodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOYW1lKTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgcHJlcGFyZVRyYWNrRm9yRG93bm1peCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja051bSk7Ci0gICAgc3RhdGljIHZvaWQgdW5wcmVwYXJlVHJhY2tGb3JEb3dubWl4KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTmFtZSk7Ci0gICAgc3RhdGljIHN0YXR1c190IHByZXBhcmVUcmFja0ZvclJlZm9ybWF0KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTnVtKTsKLSAgICBzdGF0aWMgdm9pZCB1bnByZXBhcmVUcmFja0ZvclJlZm9ybWF0KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTmFtZSk7Ci0gICAgc3RhdGljIHZvaWQgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnModHJhY2tfdCogcFRyYWNrKTsKLQogICAgIHN0YXRpYyB2b2lkIHRyYWNrX19nZW5lcmljUmVzYW1wbGUodHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgbnVtRnJhbWVzLCBpbnQzMl90KiB0ZW1wLAogICAgICAgICAgICAgaW50MzJfdCogYXV4KTsKICAgICBzdGF0aWMgdm9pZCB0cmFja19fbm9wKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IG51bUZyYW1lcywgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KTsKQEAgLTQ2NSw2ICszOTEsNiBAQAogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIEFORFJPSURfQVVESU9fTUlYRVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXJPcHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyT3BzLmgKaW5kZXggMjY3ODg1Ny4uOGQ3NDAyNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXJPcHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlck9wcy5oCkBAIC0xNjQsMTMgKzE2NCwxMiBAQAogdGVtcGxhdGUgPD4KIGlubGluZSBpbnQxNl90IE1peE11bDxpbnQxNl90LCBpbnQxNl90LCBmbG9hdD4oaW50MTZfdCB2YWx1ZSwgZmxvYXQgdm9sdW1lKSB7CiAgICAgTE9HX0FMV0FZU19GQVRBTCgiTWl4TXVsPGludDE2X3QsIGludDE2X3QsIGZsb2F0PiBSdW50aW1lIFNob3VsZCBub3QgYmUgaGVyZSIpOwotICAgIHJldHVybiB2YWx1ZSAqIHZvbHVtZTsKKyAgICByZXR1cm4gY2xhbXAxNl9mcm9tX2Zsb2F0KE1peE11bDxmbG9hdCwgaW50MTZfdCwgZmxvYXQ+KHZhbHVlLCB2b2x1bWUpKTsKIH0KIAogdGVtcGxhdGUgPD4KIGlubGluZSBpbnQxNl90IE1peE11bDxpbnQxNl90LCBmbG9hdCwgZmxvYXQ+KGZsb2F0IHZhbHVlLCBmbG9hdCB2b2x1bWUpIHsKLSAgICBzdGF0aWMgY29uc3QgZmxvYXQgcV8xNV9mcm9tX2Zsb2F0ID0gKDEgPDwgMTUpOwotICAgIHJldHVybiB2YWx1ZSAqIHZvbHVtZSAqIHFfMTVfZnJvbV9mbG9hdDsKKyAgICByZXR1cm4gY2xhbXAxNl9mcm9tX2Zsb2F0KHZhbHVlICogdm9sdW1lKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuY3BwCmluZGV4IDQ2ZTNkNmMuLmU0OWI3YjEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmNwcApAQCAtNDEsNyArNDEsNyBAQAogICAgIEF1ZGlvUmVzYW1wbGVyT3JkZXIxKGludCBpbkNoYW5uZWxDb3VudCwgaW50MzJfdCBzYW1wbGVSYXRlKSA6CiAgICAgICAgIEF1ZGlvUmVzYW1wbGVyKGluQ2hhbm5lbENvdW50LCBzYW1wbGVSYXRlLCBMT1dfUVVBTElUWSksIG1YMEwoMCksIG1YMFIoMCkgewogICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgcmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKKyAgICB2aXJ0dWFsIHNpemVfdCByZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpOwogcHJpdmF0ZToKICAgICAvLyBudW1iZXIgb2YgYml0cyB1c2VkIGluIGludGVycG9sYXRpb24gbXVsdGlwbHkgLSAxNSBiaXRzIGF2b2lkcyBvdmVyZmxvdwpAQCAtNTEsOSArNTEsOSBAQAogICAgIHN0YXRpYyBjb25zdCBpbnQga1ByZUludGVycFNoaWZ0ID0ga051bVBoYXNlQml0cyAtIGtOdW1JbnRlcnBCaXRzOwogCiAgICAgdm9pZCBpbml0KCkge30KLSAgICB2b2lkIHJlc2FtcGxlTW9ubzE2KGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCisgICAgc2l6ZV90IHJlc2FtcGxlTW9ubzE2KGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7Ci0gICAgdm9pZCByZXNhbXBsZVN0ZXJlbzE2KGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCisgICAgc2l6ZV90IHJlc2FtcGxlU3RlcmVvMTYoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKICNpZmRlZiBBU01fQVJNX1JFU0FNUDEgIC8vIGFzbSBvcHRpbWlzYXRpb24gZm9yIFJlc2FtcGxlck9yZGVyMQogICAgIHZvaWQgQXNtTW9ubzE2TG9vcChpbnQxNl90ICppbiwgaW50MzJfdCogbWF4T3V0UHQsIGludDMyX3QgbWF4SW5JZHgsCkBAIC0zMjksNyArMzI5LDcgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi12b2lkIEF1ZGlvUmVzYW1wbGVyT3JkZXIxOjpyZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAorc2l6ZV90IEF1ZGlvUmVzYW1wbGVyT3JkZXIxOjpyZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcikgewogCiAgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiwgYnV0IHdlIG92ZXJmbG93IGlmIGl0IGRvZXMKQEAgLTMzOCwxNSArMzM4LDE2IEBACiAgICAgLy8gc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSByZXNhbXBsZXIKICAgICBzd2l0Y2ggKG1DaGFubmVsQ291bnQpIHsKICAgICBjYXNlIDE6Ci0gICAgICAgIHJlc2FtcGxlTW9ubzE2KG91dCwgb3V0RnJhbWVDb3VudCwgcHJvdmlkZXIpOwotICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIHJlc2FtcGxlTW9ubzE2KG91dCwgb3V0RnJhbWVDb3VudCwgcHJvdmlkZXIpOwogICAgIGNhc2UgMjoKLSAgICAgICAgcmVzYW1wbGVTdGVyZW8xNihvdXQsIG91dEZyYW1lQ291bnQsIHByb3ZpZGVyKTsKLSAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiByZXNhbXBsZVN0ZXJlbzE2KG91dCwgb3V0RnJhbWVDb3VudCwgcHJvdmlkZXIpOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImludmFsaWQgY2hhbm5lbCBjb3VudDogJWQiLCBtQ2hhbm5lbENvdW50KTsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogfQogCi12b2lkIEF1ZGlvUmVzYW1wbGVyT3JkZXIxOjpyZXNhbXBsZVN0ZXJlbzE2KGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCitzaXplX3QgQXVkaW9SZXNhbXBsZXJPcmRlcjE6OnJlc2FtcGxlU3RlcmVvMTYoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpIHsKIAogICAgIGludDMyX3QgdmwgPSBtVm9sdW1lWzBdOwpAQCAtNDQyLDkgKzQ0MywxMCBAQAogICAgIC8vIHNhdmUgc3RhdGUKICAgICBtSW5wdXRJbmRleCA9IGlucHV0SW5kZXg7CiAgICAgbVBoYXNlRnJhY3Rpb24gPSBwaGFzZUZyYWN0aW9uOworICAgIHJldHVybiBvdXRwdXRJbmRleCAvIDIgLyogY2hhbm5lbHMgZm9yIHN0ZXJlbyAqLzsKIH0KIAotdm9pZCBBdWRpb1Jlc2FtcGxlck9yZGVyMTo6cmVzYW1wbGVNb25vMTYoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKK3NpemVfdCBBdWRpb1Jlc2FtcGxlck9yZGVyMTo6cmVzYW1wbGVNb25vMTYoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpIHsKIAogICAgIGludDMyX3QgdmwgPSBtVm9sdW1lWzBdOwpAQCAtNTM4LDYgKzU0MCw3IEBACiAgICAgLy8gc2F2ZSBzdGF0ZQogICAgIG1JbnB1dEluZGV4ID0gaW5wdXRJbmRleDsKICAgICBtUGhhc2VGcmFjdGlvbiA9IHBoYXNlRnJhY3Rpb247CisgICAgcmV0dXJuIG91dHB1dEluZGV4OwogfQogCiAjaWZkZWYgQVNNX0FSTV9SRVNBTVAxICAvLyBhc20gb3B0aW1pc2F0aW9uIGZvciBSZXNhbXBsZXJPcmRlcjEKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmgKaW5kZXggMDY5ZDk0Ni4uYThlM2U2ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmgKQEAgLTY3LDEyICs2NywxOCBAQAogICAgIC8vIFJlc2FtcGxlIGludDE2X3Qgc2FtcGxlcyBmcm9tIHByb3ZpZGVyIGFuZCBhY2N1bXVsYXRlIGludG8gJ291dCcuCiAgICAgLy8gQSBtb25vIHByb3ZpZGVyIGRlbGl2ZXJzIGEgc2VxdWVuY2Ugb2Ygc2FtcGxlcy4KICAgICAvLyBBIHN0ZXJlbyBwcm92aWRlciBkZWxpdmVycyBhIHNlcXVlbmNlIG9mIGludGVybGVhdmVkIHBhaXJzIG9mIHNhbXBsZXMuCi0gICAgLy8gTXVsdGktY2hhbm5lbCBwcm92aWRlcnMgYXJlIG5vdCBzdXBwb3J0ZWQuCisgICAgLy8KICAgICAvLyBJbiBlaXRoZXIgY2FzZSwgJ291dCcgaG9sZHMgaW50ZXJsZWF2ZWQgcGFpcnMgb2YgZml4ZWQtcG9pbnQgUTQuMjcuCiAgICAgLy8gVGhhdCBpcywgZm9yIGEgbW9ubyBwcm92aWRlciwgdGhlcmUgaXMgYW4gaW1wbGljaXQgdXAtY2hhbm5lbGluZy4KICAgICAvLyBTaW5jZSB0aGlzIG1ldGhvZCBhY2N1bXVsYXRlcywgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2xlYXJpbmcgJ291dCcgaW5pdGlhbGx5LgotICAgIC8vIEZJWE1FIGFzc3VtZXMgcHJvdmlkZXIgaXMgYWx3YXlzIHN1Y2Nlc3NmdWw7IGl0IHNob3VsZCByZXR1cm4gdGhlIGFjdHVhbCBmcmFtZSBjb3VudC4KLSAgICB2aXJ0dWFsIHZvaWQgcmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKKyAgICAvLworICAgIC8vIEZvciBhIGZsb2F0IHJlc2FtcGxlciwgJ291dCcgaG9sZHMgaW50ZXJsZWF2ZWQgcGFpcnMgb2YgZmxvYXQgc2FtcGxlcy4KKyAgICAvLworICAgIC8vIE11bHRpY2hhbm5lbCBpbnRlcmxlYXZlZCBmcmFtZXMgZm9yIG4gPiAyIGlzIHN1cHBvcnRlZCBmb3IgcXVhbGl0eSBEWU5fTE9XX1FVQUxJVFksCisgICAgLy8gRFlOX01FRF9RVUFMSVRZLCBhbmQgRFlOX0hJR0hfUVVBTElUWS4KKyAgICAvLworICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBmcmFtZXMgcmVzYW1wbGVkIGludG8gdGhlIG91dCBidWZmZXIuCisgICAgdmlydHVhbCBzaXplX3QgcmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKQEAgLTE3MCw3ICsxNzYsNiBAQAogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfQotOyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy8gQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyQ3ViaWMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyQ3ViaWMuY3BwCmluZGV4IDhmMTRmZjkuLjE3MmMyYTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckN1YmljLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJDdWJpYy5jcHAKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNkZWZpbmUgTE9HX1RBRyAiQXVkaW9TUkMiCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvUmVzYW1wbGVyQ3ViaWMiCiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTMyLDcgKzMyLDcgQEAKICAgICBtZW1zZXQoJnJpZ2h0LCAwLCBzaXplb2Yoc3RhdGUpKTsKIH0KIAotdm9pZCBBdWRpb1Jlc2FtcGxlckN1YmljOjpyZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAorc2l6ZV90IEF1ZGlvUmVzYW1wbGVyQ3ViaWM6OnJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKSB7CiAKICAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgd2Ugb3ZlcmZsb3cgaWYgaXQgZG9lcwpAQCAtNDEsMTUgKzQxLDE2IEBACiAgICAgLy8gc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSByZXNhbXBsZXIKICAgICBzd2l0Y2ggKG1DaGFubmVsQ291bnQpIHsKICAgICBjYXNlIDE6Ci0gICAgICAgIHJlc2FtcGxlTW9ubzE2KG91dCwgb3V0RnJhbWVDb3VudCwgcHJvdmlkZXIpOwotICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIHJlc2FtcGxlTW9ubzE2KG91dCwgb3V0RnJhbWVDb3VudCwgcHJvdmlkZXIpOwogICAgIGNhc2UgMjoKLSAgICAgICAgcmVzYW1wbGVTdGVyZW8xNihvdXQsIG91dEZyYW1lQ291bnQsIHByb3ZpZGVyKTsKLSAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiByZXNhbXBsZVN0ZXJlbzE2KG91dCwgb3V0RnJhbWVDb3VudCwgcHJvdmlkZXIpOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImludmFsaWQgY2hhbm5lbCBjb3VudDogJWQiLCBtQ2hhbm5lbENvdW50KTsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogfQogCi12b2lkIEF1ZGlvUmVzYW1wbGVyQ3ViaWM6OnJlc2FtcGxlU3RlcmVvMTYoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKK3NpemVfdCBBdWRpb1Jlc2FtcGxlckN1YmljOjpyZXNhbXBsZVN0ZXJlbzE2KGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKSB7CiAKICAgICBpbnQzMl90IHZsID0gbVZvbHVtZVswXTsKQEAgLTY3LDcgKzY4LDcgQEAKICAgICAgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gaW5GcmFtZUNvdW50OwogICAgICAgICBwcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmbUJ1ZmZlciwgbVBUUyk7CiAgICAgICAgIGlmIChtQnVmZmVyLnJhdyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQogICAgICAgICAvLyBBTE9HVygiTmV3IGJ1ZmZlcjogb2Zmc2V0PSVwLCBmcmFtZXM9JWRuIiwgbUJ1ZmZlci5yYXcsIG1CdWZmZXIuZnJhbWVDb3VudCk7CiAgICAgfQpAQCAtMTE1LDkgKzExNiwxMCBAQAogICAgIC8vIEFMT0dXKCJEb25lOiBpbmRleD0lZCwgZnJhY3Rpb249JXUiLCBpbnB1dEluZGV4LCBwaGFzZUZyYWN0aW9uKTsKICAgICBtSW5wdXRJbmRleCA9IGlucHV0SW5kZXg7CiAgICAgbVBoYXNlRnJhY3Rpb24gPSBwaGFzZUZyYWN0aW9uOworICAgIHJldHVybiBvdXRwdXRJbmRleCAvIDIgLyogY2hhbm5lbHMgZm9yIHN0ZXJlbyAqLzsKIH0KIAotdm9pZCBBdWRpb1Jlc2FtcGxlckN1YmljOjpyZXNhbXBsZU1vbm8xNihpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAorc2l6ZV90IEF1ZGlvUmVzYW1wbGVyQ3ViaWM6OnJlc2FtcGxlTW9ubzE2KGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKSB7CiAKICAgICBpbnQzMl90IHZsID0gbVZvbHVtZVswXTsKQEAgLTEzNSw3ICsxMzcsNyBAQAogICAgICAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSBpbkZyYW1lQ291bnQ7CiAgICAgICAgIHByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZtQnVmZmVyLCBtUFRTKTsKICAgICAgICAgaWYgKG1CdWZmZXIucmF3ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgICAgIC8vIEFMT0dXKCJOZXcgYnVmZmVyOiBvZmZzZXQ9JXAsIGZyYW1lcz0lZCIsIG1CdWZmZXIucmF3LCBtQnVmZmVyLmZyYW1lQ291bnQpOwogICAgIH0KQEAgLTE4Miw4ICsxODQsOCBAQAogICAgIC8vIEFMT0dXKCJEb25lOiBpbmRleD0lZCwgZnJhY3Rpb249JXUiLCBpbnB1dEluZGV4LCBwaGFzZUZyYWN0aW9uKTsKICAgICBtSW5wdXRJbmRleCA9IGlucHV0SW5kZXg7CiAgICAgbVBoYXNlRnJhY3Rpb24gPSBwaGFzZUZyYWN0aW9uOworICAgIHJldHVybiBvdXRwdXRJbmRleDsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfQotOyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyQ3ViaWMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckN1YmljLmgKaW5kZXggYjMxNWRhNS4uNGI0NWIwYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyQ3ViaWMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJDdWJpYy5oCkBAIC0zMSw3ICszMSw3IEBACiAgICAgQXVkaW9SZXNhbXBsZXJDdWJpYyhpbnQgaW5DaGFubmVsQ291bnQsIGludDMyX3Qgc2FtcGxlUmF0ZSkgOgogICAgICAgICBBdWRpb1Jlc2FtcGxlcihpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSwgTUVEX1FVQUxJVFkpIHsKICAgICB9Ci0gICAgdmlydHVhbCB2b2lkIHJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCisgICAgdmlydHVhbCBzaXplX3QgcmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKIHByaXZhdGU6CiAgICAgLy8gbnVtYmVyIG9mIGJpdHMgdXNlZCBpbiBpbnRlcnBvbGF0aW9uIG11bHRpcGx5IC0gMTQgYml0cyBhdm9pZHMgb3ZlcmZsb3cKQEAgLTQzLDkgKzQzLDkgQEAKICAgICAgICAgaW50MzJfdCBhLCBiLCBjLCB5MCwgeTEsIHkyLCB5MzsKICAgICB9IHN0YXRlOwogICAgIHZvaWQgaW5pdCgpOwotICAgIHZvaWQgcmVzYW1wbGVNb25vMTYoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKKyAgICBzaXplX3QgcmVzYW1wbGVNb25vMTYoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKLSAgICB2b2lkIHJlc2FtcGxlU3RlcmVvMTYoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKKyAgICBzaXplX3QgcmVzYW1wbGVTdGVyZW8xNihpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpOwogICAgIHN0YXRpYyBpbmxpbmUgaW50MzJfdCBpbnRlcnAoc3RhdGUqIHAsIGludDMyX3QgeCkgewogICAgICAgICByZXR1cm4gKCgoKChwLT5hICogeCA+PiAxNCkgKyBwLT5iKSAqIHggPj4gMTQpICsgcC0+YykgKiB4ID4+IDE0KSArIHAtPnkxOwpAQCAtNjMsNiArNjMsNiBAQAogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8qQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfQ1VCSUNfSCovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJEeW4uY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRHluLmNwcAppbmRleCAwZWViMjAxLi42NDgxYjg1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJEeW4uY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckR5bi5jcHAKQEAgLTQ3NywxNSArNDc3LDE1IEBACiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+Ci12b2lkIEF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAorc2l6ZV90IEF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpCiB7Ci0gICAgKHRoaXMtPiptUmVzYW1wbGVGdW5jKShyZWludGVycHJldF9jYXN0PFRPKj4ob3V0KSwgb3V0RnJhbWVDb3VudCwgcHJvdmlkZXIpOworICAgIHJldHVybiAodGhpcy0+Km1SZXNhbXBsZUZ1bmMpKHJlaW50ZXJwcmV0X2Nhc3Q8VE8qPihvdXQpLCBvdXRGcmFtZUNvdW50LCBwcm92aWRlcik7CiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+CiB0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFMsIGJvb2wgTE9DS0VELCBpbnQgU1RSSURFPgotdm9pZCBBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGUoVE8qIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCitzaXplX3QgQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlKFRPKiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcikKIHsKICAgICAvLyBUT0RPIE1vbm8gLT4gTW9ubyBpcyBub3Qgc3VwcG9ydGVkLiBPVVRQVVRfQ0hBTk5FTFMgcmVmbGVjdHMgbWluaW11bSBvZiBzdGVyZW8gb3V0LgpAQCAtNjEwLDYgKzYxMCw3IEBACiAgICAgQUxPR19BU1NFUlQobUJ1ZmZlci5mcmFtZUNvdW50ID09IDApOyAvLyB0aGVyZSBtdXN0IGJlIG5vIGZyYW1lcyBpbiB0aGUgYnVmZmVyCiAgICAgbUluQnVmZmVyLnNldEltcHVsc2UoaW1wdWxzZSk7CiAgICAgbVBoYXNlRnJhY3Rpb24gPSBwaGFzZUZyYWN0aW9uOworICAgIHJldHVybiBvdXRwdXRJbmRleCAvIE9VVFBVVF9DSEFOTkVMUzsKIH0KIAogLyogaW5zdGFudGlhdGUgdGVtcGxhdGVzIHVzZWQgYnkgQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZSAqLwpAQCAtNjE4LDQgKzYxOSw0IEBACiB0ZW1wbGF0ZSBjbGFzcyBBdWRpb1Jlc2FtcGxlckR5bjxpbnQzMl90LCBpbnQxNl90LCBpbnQzMl90PjsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckR5bi5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRHluLmgKaW5kZXggZTg4NmE2OC4uM2IxYzM4MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRHluLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRHluLmgKQEAgLTUyLDcgKzUyLDcgQEAKIAogICAgIHZpcnR1YWwgdm9pZCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOwogCi0gICAgdmlydHVhbCB2b2lkIHJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCisgICAgdmlydHVhbCBzaXplX3QgcmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKIAogcHJpdmF0ZToKQEAgLTExMSwxMCArMTExLDEwIEBACiAgICAgICAgICAgICBpbnQgaW5TYW1wbGVSYXRlLCBpbnQgb3V0U2FtcGxlUmF0ZSwgZG91YmxlIHRid0NoZWF0KTsKIAogICAgIHRlbXBsYXRlPGludCBDSEFOTkVMUywgYm9vbCBMT0NLRUQsIGludCBTVFJJREU+Ci0gICAgdm9pZCByZXNhbXBsZShUTyogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpOworICAgIHNpemVfdCByZXNhbXBsZShUTyogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpOwogCiAgICAgLy8gZGVmaW5lIGEgcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gdHlwZSBmb3IgcmVzYW1wbGUKLSAgICB0eXBlZGVmIHZvaWQgKEF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjoqcmVzYW1wbGVfQUJQX3QpKFRPKiBvdXQsCisgICAgdHlwZWRlZiBzaXplX3QgKEF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjoqcmVzYW1wbGVfQUJQX3QpKFRPKiBvdXQsCiAgICAgICAgICAgICBzaXplX3Qgb3V0RnJhbWVDb3VudCwgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpOwogCiAgICAgLy8gZGF0YSAtIHRoZSBjb250aWd1b3VzIHN0b3JhZ2UgYW5kIGxheW91dCBvZiB0aGVzZSBpcyBpbXBvcnRhbnQuCkBAIC0xMjcsNiArMTI3LDYgQEAKICAgICAgICAgICAgICAgdm9pZCogbUNvZWZCdWZmZXI7ICAgICAgIC8vIGlmIGEgZmlsdGVyIGlzIGNyZWF0ZWQsIHRoaXMgaXMgbm90IG51bGwKIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvKkFORFJPSURfQVVESU9fUkVTQU1QTEVSX0RZTl9IKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpckdlbi5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyR2VuLmgKaW5kZXggZjM3MThiNi4uYWQxODk2NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyR2VuLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyR2VuLmgKQEAgLTIwNCw3ICsyMDQsOCBAQAogCiB0ZW1wbGF0ZSA8Pgogc3RydWN0IEkwQVRlcm08MD4geyAvLyAxL3NxcnQoMipQSSk7Ci0gICAgc3RhdGljIGNvbnN0IENPTlNURVhQUiBkb3VibGUgdmFsdWUgPSAwLjM5ODk0MjI4MDQwMTQzMjY3NzkzOTk0NjA1OTkzNDM4MTg2ODQ3NTg1ODYzMTE2NDkzNDY1NzY2NTkyNTsKKyAgICBzdGF0aWMgY29uc3QgQ09OU1RFWFBSIGRvdWJsZSB2YWx1ZSA9CisgICAgICAgICAgICAwLjM5ODk0MjI4MDQwMTQzMjY3NzkzOTk0NjA1OTkzNDM4MTg2ODQ3NTg1ODYzMTE2NDkzNDY1NzY2NTkyNTsKIH07CiAKICNpZiBVU0VfSE9STkVSU19NRVRIT0QKQEAgLTcwNiw2ICs3MDcsNiBAQAogICAgIH0KIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8qQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRklSX0dFTl9IKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpck9wcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyT3BzLmgKaW5kZXggYmYyMTYzZi4uNjU4Mjg1ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyT3BzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyT3BzLmgKQEAgLTI1LDcgKzI1LDcgQEAKICNkZWZpbmUgVVNFX0lOTElORV9BU1NFTUJMWSAoZmFsc2UpCiAjZW5kaWYKIAotI2lmIFVTRV9JTkxJTkVfQVNTRU1CTFkgJiYgZGVmaW5lZChfX0FSTV9ORU9OX18pCisjaWYgZGVmaW5lZChfX2FhcmNoNjRfXykgfHwgZGVmaW5lZChfX0FSTV9ORU9OX18pCiAjZGVmaW5lIFVTRV9ORU9OICh0cnVlKQogI2luY2x1ZGUgPGFybV9uZW9uLmg+CiAjZWxzZQpAQCAtMTU4LDYgKzE1OCw2IEBACiAjZW5kaWYKIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8qQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRklSX09QU19IKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaAppbmRleCBlZmM4MDU1Li4xNzYyMDJlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oCkBAIC0xNzQsNyArMTc0LDggQEAKICAqIFByb2Nlc3MoKSBjYWxscyBQcm9jZXNzQmFzZSgpIHdpdGggVEZVTkMgPSBJbnRlcnBDb21wdXRlLCBmb3IgaW50ZXJwb2xhdGVkIHBoYXNlLgogICovCiAKLXRlbXBsYXRlIDxpbnQgQ0hBTk5FTFMsIGludCBTVFJJREUsIHR5cGVuYW1lIFRGVU5DLCB0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSU5URVJQPgordGVtcGxhdGUgPGludCBDSEFOTkVMUywgaW50IFNUUklERSwgdHlwZW5hbWUgVEZVTkMsIHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8sCisgICAgICAgIHR5cGVuYW1lIFRJTlRFUlA+CiBzdGF0aWMgaW5saW5lCiB2b2lkIFByb2Nlc3NCYXNlKFRPKiBjb25zdCBvdXQsCiAgICAgICAgIHNpemVfdCBjb3VudCwKQEAgLTI0Miw2ICsyNDMsOSBAQAogICAgIH0KIH0KIAorLyogQ2FsY3VsYXRlcyBhIHNpbmdsZSBvdXRwdXQgZnJhbWUgZnJvbSBhIHBvbHlwaGFzZSByZXNhbXBsaW5nIGZpbHRlci4KKyAqIFNlZSBQcm9jZXNzKCkgZm9yIHBhcmFtZXRlciBkZXRhaWxzLgorICovCiB0ZW1wbGF0ZSA8aW50IENIQU5ORUxTLCBpbnQgU1RSSURFLCB0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgogc3RhdGljIGlubGluZQogdm9pZCBQcm9jZXNzTChUTyogY29uc3Qgb3V0LApAQCAtMjU1LDYgKzI1OSwzOSBAQAogICAgIFByb2Nlc3NCYXNlPENIQU5ORUxTLCBTVFJJREUsIEludGVycE51bGw+KG91dCwgY291bnQsIGNvZWZzUCwgY29lZnNOLCBzUCwgc04sIDAsIHZvbHVtZUxSKTsKIH0KIAorLyoKKyAqIENhbGN1bGF0ZXMgYSBzaW5nbGUgb3V0cHV0IGZyYW1lIGZyb20gYSBwb2x5cGhhc2UgcmVzYW1wbGluZyBmaWx0ZXIsCisgKiB3aXRoIGZpbHRlciBwaGFzZSBpbnRlcnBvbGF0aW9uLgorICoKKyAqIEBwYXJhbSBvdXQgc2hvdWxkIHBvaW50IHRvIHRoZSBvdXRwdXQgYnVmZmVyIHdpdGggc3BhY2UgZm9yIGF0IGxlYXN0IG9uZSBvdXRwdXQgZnJhbWUuCisgKgorICogQHBhcmFtIGNvdW50IHNob3VsZCBiZSBoYWxmIHRoZSBzaXplIG9mIHRoZSB0b3RhbCBmaWx0ZXIgbGVuZ3RoIChoYWxmTnVtQ29lZnMpLCBhcyB3ZQorICogdXNlIHN5bW1ldHJ5IGluIGZpbHRlciBjb2VmZmljaWVudHMgdG8gZXZhbHVhdGUgdHdvIGRvdCBwcm9kdWN0cy4KKyAqCisgKiBAcGFyYW0gY29lZnNQIGlzIG9uZSBwaGFzZSBvZiB0aGUgcG9seXBoYXNlIGZpbHRlciBiYW5rIG9mIHNpemUgaGFsZk51bUNvZWZzLCBjb3JyZXNwb25kaW5nCisgKiB0byB0aGUgcG9zaXRpdmUgc1AuCisgKgorICogQHBhcmFtIGNvZWZzTiBpcyBvbmUgcGhhc2Ugb2YgdGhlIHBvbHlwaGFzZSBmaWx0ZXIgYmFuayBvZiBzaXplIGhhbGZOdW1Db2VmcywgY29ycmVzcG9uZGluZworICogdG8gdGhlIG5lZ2F0aXZlIHNOLgorICoKKyAqIEBwYXJhbSBjb2Vmc1AxIGlzIHRoZSBuZXh0IHBoYXNlIG9mIGNvZWZzUCAodXNlZCBmb3IgaW50ZXJwb2xhdGlvbikuCisgKgorICogQHBhcmFtIGNvZWZzTjEgaXMgdGhlIG5leHQgcGhhc2Ugb2YgY29lZnNOICh1c2VkIGZvciBpbnRlcnBvbGF0aW9uKS4KKyAqCisgKiBAcGFyYW0gc1AgaXMgdGhlIHBvc2l0aXZlIGhhbGYgb2YgdGhlIGNvZWZmaWNpZW50cyAoYXMgdmlld2VkIGJ5IGEgY29udm9sdXRpb24pLAorICogc3RhcnRpbmcgYXQgdGhlIG9yaWdpbmFsIHNhbXBsZXMgcG9pbnRlciBhbmQgZGVjcmVtZW50aW5nIChieSBDSEFOTkVMUykuCisgKgorICogQHBhcmFtIHNOIGlzIHRoZSBuZWdhdGl2ZSBoYWxmIG9mIHRoZSBzYW1wbGVzIChhcyB2aWV3ZWQgYnkgYSBjb252b2x1dGlvbiksCisgKiBzdGFydGluZyBhdCB0aGUgb3JpZ2luYWwgc2FtcGxlcyBwb2ludGVyICsgQ0hBTk5FTFMgYW5kIGluY3JlbWVudGluZyAoYnkgQ0hBTk5FTFMpLgorICoKKyAqIEBwYXJhbSBsZXJwUCBUaGUgZnJhY3Rpb25hbCBzaXRpbmcgYmV0d2VlbiB0aGUgcG9seXBoYXNlIGluZGljZXMgaXMgZ2l2ZW4gYnkgdGhlIGJpdHMKKyAqIGJlbG93IGNvZWZTaGlmdC4gU2VlIGZpcigpIGZvciBkZXRhaWxzLgorICoKKyAqIEBwYXJhbSB2b2x1bWVMUiBpcyBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdHdvIDMyIGJpdCB2b2x1bWUgdmFsdWVzLCBvbmUgcGVyIHN0ZXJlbyBjaGFubmVsLAorICogZXhwcmVzc2VkIGFzIGEgUzMyIGludGVnZXIgb3IgZmxvYXQuICBBIG5lZ2F0aXZlIHZhbHVlIGludmVydHMgdGhlIGNoYW5uZWwgMTgwIGRlZ3JlZXMuCisgKiBUaGUgcG9pbnRlciB2b2x1bWVMUiBzaG91bGQgYmUgYWxpZ25lZCB0byBhIG1pbmltdW0gb2YgOCBieXRlcy4KKyAqIEEgdHlwaWNhbCB2YWx1ZSBmb3Igdm9sdW1lIGlzIDB4MTAwMCB0byBhbGlnbiB0byBhIHVuaXR5IGdhaW4gb3V0cHV0IG9mIDIwLjEyLgorICovCiB0ZW1wbGF0ZSA8aW50IENIQU5ORUxTLCBpbnQgU1RSSURFLCB0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSU5URVJQPgogc3RhdGljIGlubGluZQogdm9pZCBQcm9jZXNzKFRPKiBjb25zdCBvdXQsCkBAIC0yNjgsMTEgKzMwNSwxMiBAQAogICAgICAgICBUSU5URVJQIGxlcnBQLAogICAgICAgICBjb25zdCBUTyogY29uc3Qgdm9sdW1lTFIpCiB7Ci0gICAgUHJvY2Vzc0Jhc2U8Q0hBTk5FTFMsIFNUUklERSwgSW50ZXJwQ29tcHV0ZT4ob3V0LCBjb3VudCwgY29lZnNQLCBjb2Vmc04sIHNQLCBzTiwgbGVycFAsIHZvbHVtZUxSKTsKKyAgICBQcm9jZXNzQmFzZTxDSEFOTkVMUywgU1RSSURFLCBJbnRlcnBDb21wdXRlPihvdXQsIGNvdW50LCBjb2Vmc1AsIGNvZWZzTiwgc1AsIHNOLCBsZXJwUCwKKyAgICAgICAgICAgIHZvbHVtZUxSKTsKIH0KIAogLyoKLSAqIENhbGN1bGF0ZXMgYSBzaW5nbGUgb3V0cHV0IGZyYW1lICh0d28gc2FtcGxlcykgZnJvbSBpbnB1dCBzYW1wbGUgcG9pbnRlci4KKyAqIENhbGN1bGF0ZXMgYSBzaW5nbGUgb3V0cHV0IGZyYW1lIGZyb20gaW5wdXQgc2FtcGxlIHBvaW50ZXIuCiAgKgogICogVGhpcyBzZXRzIHVwIHRoZSBwYXJhbXMgZm9yIHRoZSBhY2NlbGVyYXRlZCBQcm9jZXNzKCkgYW5kIFByb2Nlc3NMKCkKICAqIGZ1bmN0aW9ucyB0byBkbyB0aGUgYXBwcm9wcmlhdGUgZG90IHByb2R1Y3RzLgpAQCAtMzA3LDcgKzM0NSw3IEBACiAgKiB0aGUgcG9zaXRpdmUgaGFsZiBvZiB0aGUgZmlsdGVyIGlzIGRvdCBwcm9kdWN0IGZyb20gc2FtcGxlcyB0byBzYW1wbGVzLWhhbGZOdW1Db2VmcysxLgogICoKICAqIEBwYXJhbSB2b2x1bWVMUiBpcyBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdHdvIDMyIGJpdCB2b2x1bWUgdmFsdWVzLCBvbmUgcGVyIHN0ZXJlbyBjaGFubmVsLAotICogZXhwcmVzc2VkIGFzIGEgUzMyIGludGVnZXIuICBBIG5lZ2F0aXZlIHZhbHVlIGludmVydHMgdGhlIGNoYW5uZWwgMTgwIGRlZ3JlZXMuCisgKiBleHByZXNzZWQgYXMgYSBTMzIgaW50ZWdlciBvciBmbG9hdC4gIEEgbmVnYXRpdmUgdmFsdWUgaW52ZXJ0cyB0aGUgY2hhbm5lbCAxODAgZGVncmVlcy4KICAqIFRoZSBwb2ludGVyIHZvbHVtZUxSIHNob3VsZCBiZSBhbGlnbmVkIHRvIGEgbWluaW11bSBvZiA4IGJ5dGVzLgogICogQSB0eXBpY2FsIHZhbHVlIGZvciB2b2x1bWUgaXMgMHgxMDAwIHRvIGFsaWduIHRvIGEgdW5pdHkgZ2FpbiBvdXRwdXQgb2YgMjAuMTIuCiAgKgpAQCAtMzk2LDYgKzQzNCw2IEBACiAgICAgfQogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLypBTkRST0lEX0FVRElPX1JFU0FNUExFUl9GSVJfUFJPQ0VTU19IKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3NOZW9uLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzTmVvbi5oCmluZGV4IGYzMTFjZWYuLjNkZTllZGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3NOZW9uLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzc05lb24uaApAQCAtMjIsMTQgKzIyLDM1IEBACiAvLyBkZXBlbmRzIG9uIEF1ZGlvUmVzYW1wbGVyRmlyT3BzLmgsIEF1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oCiAKICNpZiBVU0VfTkVPTgorCisvLyB1c2UgaW50cmluc2ljcyBpZiBpbmxpbmUgYXJtMzIgYXNzZW1ibHkgaXMgbm90IHBvc3NpYmxlCisjaWYgIVVTRV9JTkxJTkVfQVNTRU1CTFkKKyNkZWZpbmUgVVNFX0lOVFJJTlNJQworI2VuZGlmCisKKy8vIGZvbGxvd2luZyBpbnRyaW5zaWNzIGF2YWlsYWJsZSBvbmx5IG9uIEFSTSA2NCBiaXQgQUNMRQorI2lmbmRlZiBfX2FhcmNoNjRfXworI3VuZGVmIHZsZDFxX2YzMl94MgorI3VuZGVmIHZsZDFxX3MzMl94MgorI2VuZGlmCisKKyNkZWZpbmUgVE9fU1RSSU5HMih4KSAjeAorI2RlZmluZSBUT19TVFJJTkcoeCkgVE9fU1RSSU5HMih4KQorLy8gdW5jb21tZW50IHRvIHByaW50IEdDQyB2ZXJzaW9uLCBtYXkgYmUgcmVsZXZhbnQgZm9yIGludHJpbnNpYyBvcHRpbWl6YXRpb25zCisvKiAjcHJhZ21hIG1lc3NhZ2UgKCJHQ0MgdmVyc2lvbjogIiBUT19TVFJJTkcoX19HTlVDX18pIFwKKyAgICAgICAgIi4iIFRPX1NUUklORyhfX0dOVUNfTUlOT1JfXykgXAorICAgICAgICAiLiIgVE9fU1RSSU5HKF9fR05VQ19QQVRDSExFVkVMX18pKSAqLworCiAvLwotLy8gTkVPTiBzcGVjaWFsaXphdGlvbnMgYXJlIGVuYWJsZWQgZm9yIFByb2Nlc3MoKSBhbmQgUHJvY2Vzc0woKQorLy8gTkVPTiBzcGVjaWFsaXphdGlvbnMgYXJlIGVuYWJsZWQgZm9yIFByb2Nlc3MoKSBhbmQgUHJvY2Vzc0woKSBpbiBBdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaAogLy8KLS8vIFRPRE86IFN0cmlkZSAxNiBhbmQgU3RyaWRlIDggY2FuIGJlIGNvbWJpbmVkIHdpdGggb25lIHBhc3Mgc3RyaWRlIDggKGlmIG5lY2Vzc2FyeSkKLS8vIGFuZCBsb29waW5nIHN0cmlkZSAxNiAob3IgdmljZSB2ZXJzYSkuIFRoaXMgaGFzIHNvbWUgcG9seXBoYXNlIGNvZWYgZGF0YSBhbGlnbm1lbnQKLS8vIGlzc3VlcyB3aXRoIFMxNiBjb2Vmcy4gQ29uc2lkZXIgdGhpcyBsYXRlci4KKy8vIFR3byB2YXJpYW50cyBhcmUgcHJlc2VudGVkIGhlcmU6CisvLyBBUk0gTkVPTiBpbmxpbmUgYXNzZW1ibHkgd2hpY2ggYXBwZWFycyB1cCB0byAxMC0xNSUgZmFzdGVyIHRoYW4gaW50cmluc2ljcyAoZ2NjIDQuOSkgZm9yIGFybTMyLgorLy8gQVJNIE5FT04gaW50cmluc2ljcyB3aGljaCBjYW4gYWxzbyBiZSB1c2VkIGJ5IGFybTY0IGFuZCB4ODYvNjQgd2l0aCBORU9OIGhlYWRlci4KKy8vCiAKIC8vIE1hY3JvcyB0byBzYXZlIGEgbW9uby9zdGVyZW8gYWNjdW11bGF0b3Igc2FtcGxlIGluIHEwIChhbmQgcTQpIGFzIHN0ZXJlbyBvdXQuCisvLyBUaGVzZSBhcmUgb25seSB1c2VkIGZvciBpbmxpbmUgYXNzZW1ibHkuCiAjZGVmaW5lIEFTU0VNQkxZX0FDQ1VNVUxBVEVfTU9OTyBcCiAgICAgICAgICJ2bGQxLnMzMiAgICAgICB7ZDJ9LCBbJVt2TFJdOjY0XSAgICAgICAgXG4iLyogKDEpIGxvYWQgdm9sdW1lcyAqL1wKICAgICAgICAgInZsZDEuczMyICAgICAgIHtkM30sICVbb3V0XSAgICAgICAgICAgICBcbiIvKiAoMikgdW5hbGlnbmVkIGxvYWQgdGhlIG91dHB1dCAqL1wKQEAgLTQ5LDYgKzcwLDQ1OCBAQAogICAgICAgICAidnFhZGQuczMyICAgICAgZDMsIGQzLCBkMCAgICAgICAgICAgICAgIFxuIi8qICgxKzRkKSBhY2N1bXVsYXRlIHJlc3VsdCAoc2F0dXJhdGluZykqL1wKICAgICAgICAgInZzdDEuczMyICAgICAgIHtkM30sICVbb3V0XSAgICAgICAgICAgICBcbiIvKiAoMisyZClzdG9yZSByZXN1bHQqLwogCit0ZW1wbGF0ZSA8aW50IENIQU5ORUxTLCBpbnQgU1RSSURFLCBib29sIEZJWEVEPgorc3RhdGljIGlubGluZSB2b2lkIFByb2Nlc3NOZW9uSW50cmluc2ljKGludDMyX3QqIG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAorICAgICAgICBjb25zdCBpbnQzMl90KiB2b2x1bWVMUiwKKyAgICAgICAgdWludDMyX3QgbGVycFAsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzUDEsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzTjEpCit7CisgICAgQUxPR19BU1NFUlQoY291bnQgPiAwICYmIChjb3VudCAmIDcpID09IDApOyAvLyBtdWx0aXBsZSBvZiA4CisgICAgQ09NUElMRV9USU1FX0FTU0VSVF9GVU5DVElPTl9TQ09QRShDSEFOTkVMUyA9PSAxIHx8IENIQU5ORUxTID09IDIpOworCisgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOworICAgIGNvZWZzUCA9IChjb25zdCBpbnQxNl90KilfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQoY29lZnNQLCAxNik7CisgICAgY29lZnNOID0gKGNvbnN0IGludDE2X3QqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChjb2Vmc04sIDE2KTsKKworICAgIGludDE2eDRfdCBpbnRlcnA7CisgICAgaWYgKCFGSVhFRCkgeworICAgICAgICBpbnRlcnAgPSB2ZHVwX25fczE2KGxlcnBQKTsKKyAgICAgICAgLy9pbnRlcnAgPSAoaW50MTZ4NF90KXZzZXRfbGFuZV9zMzIgKChpbnQzMngyX3QpbGVycFAsIGludGVycCwgMCk7CisgICAgICAgIGNvZWZzUDEgPSAoY29uc3QgaW50MTZfdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKGNvZWZzUDEsIDE2KTsKKyAgICAgICAgY29lZnNOMSA9IChjb25zdCBpbnQxNl90KilfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQoY29lZnNOMSwgMTYpOworICAgIH0KKyAgICBpbnQzMng0X3QgYWNjdW0sIGFjY3VtMjsKKyAgICAvLyB3YXJuaW5nIHVuaW5pdGlhbGl6ZWQgaWYgd2UgdXNlIHZlb3JxX3MzMgorICAgIC8vIChhbHRlcm5hdGl2ZSB0byBiZWxvdykgYWNjdW0gPSB2ZW9ycV9zMzIoYWNjdW0sIGFjY3VtKTsKKyAgICBhY2N1bSA9IHZkdXBxX25fczMyKDApOworICAgIGlmIChDSEFOTkVMUyA9PSAyKSB7CisgICAgICAgIC8vIChhbHRlcm5hdGl2ZSB0byBiZWxvdykgYWNjdW0yID0gdmVvcnFfczMyKGFjY3VtMiwgYWNjdW0yKTsKKyAgICAgICAgYWNjdW0yID0gdmR1cHFfbl9zMzIoMCk7CisgICAgfQorICAgIGRvIHsKKyAgICAgICAgaW50MTZ4OF90IHBvc0NvZWYgPSB2bGQxcV9zMTYoY29lZnNQKTsKKyAgICAgICAgY29lZnNQICs9IDg7CisgICAgICAgIGludDE2eDhfdCBuZWdDb2VmID0gdmxkMXFfczE2KGNvZWZzTik7CisgICAgICAgIGNvZWZzTiArPSA4OworICAgICAgICBpZiAoIUZJWEVEKSB7IC8vIGludGVycG9sYXRlCisgICAgICAgICAgICBpbnQxNng4X3QgcG9zQ29lZjEgPSB2bGQxcV9zMTYoY29lZnNQMSk7CisgICAgICAgICAgICBjb2Vmc1AxICs9IDg7CisgICAgICAgICAgICBpbnQxNng4X3QgbmVnQ29lZjEgPSB2bGQxcV9zMTYoY29lZnNOMSk7CisgICAgICAgICAgICBjb2Vmc04xICs9IDg7CisKKyAgICAgICAgICAgIHBvc0NvZWYxID0gdnN1YnFfczE2KHBvc0NvZWYxLCBwb3NDb2VmKTsKKyAgICAgICAgICAgIG5lZ0NvZWYgPSB2c3VicV9zMTYobmVnQ29lZiwgbmVnQ29lZjEpOworCisgICAgICAgICAgICBwb3NDb2VmMSA9IHZxcmRtdWxocV9sYW5lX3MxNihwb3NDb2VmMSwgaW50ZXJwLCAwKTsKKyAgICAgICAgICAgIG5lZ0NvZWYgPSB2cXJkbXVsaHFfbGFuZV9zMTYobmVnQ29lZiwgaW50ZXJwLCAwKTsKKworICAgICAgICAgICAgcG9zQ29lZiA9IHZhZGRxX3MxNihwb3NDb2VmLCBwb3NDb2VmMSk7CisgICAgICAgICAgICBuZWdDb2VmID0gdmFkZHFfczE2KG5lZ0NvZWYsIG5lZ0NvZWYxKTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKENIQU5ORUxTKSB7CisgICAgICAgIGNhc2UgMTogeworICAgICAgICAgICAgaW50MTZ4OF90IHBvc1NhbXAgPSB2bGQxcV9zMTYoc1ApOworICAgICAgICAgICAgaW50MTZ4OF90IG5lZ1NhbXAgPSB2bGQxcV9zMTYoc04pOworICAgICAgICAgICAgc04gKz0gODsKKyAgICAgICAgICAgIHBvc1NhbXAgPSB2cmV2NjRxX3MxNihwb3NTYW1wKTsKKworICAgICAgICAgICAgLy8gZG90IHByb2R1Y3QKKyAgICAgICAgICAgIGFjY3VtID0gdm1sYWxfczE2KGFjY3VtLCB2Z2V0X2xvd19zMTYocG9zU2FtcCksIHZnZXRfaGlnaF9zMTYocG9zQ29lZikpOyAvLyByZXZlcnNlZAorICAgICAgICAgICAgYWNjdW0gPSB2bWxhbF9zMTYoYWNjdW0sIHZnZXRfaGlnaF9zMTYocG9zU2FtcCksIHZnZXRfbG93X3MxNihwb3NDb2VmKSk7IC8vIHJldmVyc2VkCisgICAgICAgICAgICBhY2N1bSA9IHZtbGFsX3MxNihhY2N1bSwgdmdldF9sb3dfczE2KG5lZ1NhbXApLCB2Z2V0X2xvd19zMTYobmVnQ29lZikpOworICAgICAgICAgICAgYWNjdW0gPSB2bWxhbF9zMTYoYWNjdW0sIHZnZXRfaGlnaF9zMTYobmVnU2FtcCksIHZnZXRfaGlnaF9zMTYobmVnQ29lZikpOworICAgICAgICAgICAgc1AgLT0gODsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSAyOiB7CisgICAgICAgICAgICBpbnQxNng4eDJfdCBwb3NTYW1wID0gdmxkMnFfczE2KHNQKTsKKyAgICAgICAgICAgIGludDE2eDh4Ml90IG5lZ1NhbXAgPSB2bGQycV9zMTYoc04pOworICAgICAgICAgICAgc04gKz0gMTY7CisgICAgICAgICAgICBwb3NTYW1wLnZhbFswXSA9IHZyZXY2NHFfczE2KHBvc1NhbXAudmFsWzBdKTsKKyAgICAgICAgICAgIHBvc1NhbXAudmFsWzFdID0gdnJldjY0cV9zMTYocG9zU2FtcC52YWxbMV0pOworCisgICAgICAgICAgICAvLyBkb3QgcHJvZHVjdAorICAgICAgICAgICAgYWNjdW0gPSB2bWxhbF9zMTYoYWNjdW0sIHZnZXRfbG93X3MxNihwb3NTYW1wLnZhbFswXSksIHZnZXRfaGlnaF9zMTYocG9zQ29lZikpOyAvLyByCisgICAgICAgICAgICBhY2N1bSA9IHZtbGFsX3MxNihhY2N1bSwgdmdldF9oaWdoX3MxNihwb3NTYW1wLnZhbFswXSksIHZnZXRfbG93X3MxNihwb3NDb2VmKSk7IC8vIHIKKyAgICAgICAgICAgIGFjY3VtMiA9IHZtbGFsX3MxNihhY2N1bTIsIHZnZXRfbG93X3MxNihwb3NTYW1wLnZhbFsxXSksIHZnZXRfaGlnaF9zMTYocG9zQ29lZikpOyAvLyByCisgICAgICAgICAgICBhY2N1bTIgPSB2bWxhbF9zMTYoYWNjdW0yLCB2Z2V0X2hpZ2hfczE2KHBvc1NhbXAudmFsWzFdKSwgdmdldF9sb3dfczE2KHBvc0NvZWYpKTsgLy8gcgorICAgICAgICAgICAgYWNjdW0gPSB2bWxhbF9zMTYoYWNjdW0sIHZnZXRfbG93X3MxNihuZWdTYW1wLnZhbFswXSksIHZnZXRfbG93X3MxNihuZWdDb2VmKSk7CisgICAgICAgICAgICBhY2N1bSA9IHZtbGFsX3MxNihhY2N1bSwgdmdldF9oaWdoX3MxNihuZWdTYW1wLnZhbFswXSksIHZnZXRfaGlnaF9zMTYobmVnQ29lZikpOworICAgICAgICAgICAgYWNjdW0yID0gdm1sYWxfczE2KGFjY3VtMiwgdmdldF9sb3dfczE2KG5lZ1NhbXAudmFsWzFdKSwgdmdldF9sb3dfczE2KG5lZ0NvZWYpKTsKKyAgICAgICAgICAgIGFjY3VtMiA9IHZtbGFsX3MxNihhY2N1bTIsIHZnZXRfaGlnaF9zMTYobmVnU2FtcC52YWxbMV0pLCB2Z2V0X2hpZ2hfczE2KG5lZ0NvZWYpKTsKKyAgICAgICAgICAgIHNQIC09IDE2OworICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgfSB3aGlsZSAoY291bnQgLT0gOCk7CisKKyAgICAvLyBtdWx0aXBseSBieSB2b2x1bWUgYW5kIHNhdmUKKyAgICB2b2x1bWVMUiA9IChjb25zdCBpbnQzMl90KilfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQodm9sdW1lTFIsIDgpOworICAgIGludDMyeDJfdCB2TFIgPSB2bGQxX3MzMih2b2x1bWVMUik7CisgICAgaW50MzJ4Ml90IG91dFNhbXAgPSB2bGQxX3MzMihvdXQpOworICAgIC8vIGNvbWJpbmUgYW5kIGZ1bm5lbCBkb3duIGFjY3VtdWxhdG9yCisgICAgaW50MzJ4Ml90IG91dEFjY3VtID0gdnBhZGRfczMyKHZnZXRfbG93X3MzMihhY2N1bSksIHZnZXRfaGlnaF9zMzIoYWNjdW0pKTsKKyAgICBpZiAoQ0hBTk5FTFMgPT0gMSkgeworICAgICAgICAvLyBkdXBsaWNhdGUgYWNjdW0gdG8gYm90aCBMIGFuZCBSCisgICAgICAgIG91dEFjY3VtID0gdnBhZGRfczMyKG91dEFjY3VtLCBvdXRBY2N1bSk7CisgICAgfSBlbHNlIGlmIChDSEFOTkVMUyA9PSAyKSB7CisgICAgICAgIC8vIGFjY3VtMiBjb250YWlucyBSLCBmb2xkIGluCisgICAgICAgIGludDMyeDJfdCBvdXRBY2N1bTIgPSB2cGFkZF9zMzIodmdldF9sb3dfczMyKGFjY3VtMiksIHZnZXRfaGlnaF9zMzIoYWNjdW0yKSk7CisgICAgICAgIG91dEFjY3VtID0gdnBhZGRfczMyKG91dEFjY3VtLCBvdXRBY2N1bTIpOworICAgIH0KKyAgICBvdXRBY2N1bSA9IHZxcmRtdWxoX3MzMihvdXRBY2N1bSwgdkxSKTsKKyAgICBvdXRTYW1wID0gdnFhZGRfczMyKG91dFNhbXAsIG91dEFjY3VtKTsKKyAgICB2c3QxX3MzMihvdXQsIG91dFNhbXApOworfQorCit0ZW1wbGF0ZSA8aW50IENIQU5ORUxTLCBpbnQgU1RSSURFLCBib29sIEZJWEVEPgorc3RhdGljIGlubGluZSB2b2lkIFByb2Nlc3NOZW9uSW50cmluc2ljKGludDMyX3QqIG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAorICAgICAgICBjb25zdCBpbnQzMl90KiB2b2x1bWVMUiwKKyAgICAgICAgdWludDMyX3QgbGVycFAsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzUDEsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzTjEpCit7CisgICAgQUxPR19BU1NFUlQoY291bnQgPiAwICYmIChjb3VudCAmIDcpID09IDApOyAvLyBtdWx0aXBsZSBvZiA4CisgICAgQ09NUElMRV9USU1FX0FTU0VSVF9GVU5DVElPTl9TQ09QRShDSEFOTkVMUyA9PSAxIHx8IENIQU5ORUxTID09IDIpOworCisgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOworICAgIGNvZWZzUCA9IChjb25zdCBpbnQzMl90KilfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQoY29lZnNQLCAxNik7CisgICAgY29lZnNOID0gKGNvbnN0IGludDMyX3QqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChjb2Vmc04sIDE2KTsKKworICAgIGludDMyeDJfdCBpbnRlcnA7CisgICAgaWYgKCFGSVhFRCkgeworICAgICAgICBpbnRlcnAgPSB2ZHVwX25fczMyKGxlcnBQKTsKKyAgICAgICAgY29lZnNQMSA9IChjb25zdCBpbnQzMl90KilfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQoY29lZnNQMSwgMTYpOworICAgICAgICBjb2Vmc04xID0gKGNvbnN0IGludDMyX3QqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChjb2Vmc04xLCAxNik7CisgICAgfQorICAgIGludDMyeDRfdCBhY2N1bSwgYWNjdW0yOworICAgIC8vIHdhcm5pbmcgdW5pbml0aWFsaXplZCBpZiB3ZSB1c2UgdmVvcnFfczMyCisgICAgLy8gKGFsdGVybmF0aXZlIHRvIGJlbG93KSBhY2N1bSA9IHZlb3JxX3MzMihhY2N1bSwgYWNjdW0pOworICAgIGFjY3VtID0gdmR1cHFfbl9zMzIoMCk7CisgICAgaWYgKENIQU5ORUxTID09IDIpIHsKKyAgICAgICAgLy8gKGFsdGVybmF0aXZlIHRvIGJlbG93KSBhY2N1bTIgPSB2ZW9ycV9zMzIoYWNjdW0yLCBhY2N1bTIpOworICAgICAgICBhY2N1bTIgPSB2ZHVwcV9uX3MzMigwKTsKKyAgICB9CisgICAgZG8geworI2lmZGVmIHZsZDFxX3MzMl94MgorICAgICAgICBpbnQzMng0eDJfdCBwb3NDb2VmID0gdmxkMXFfczMyX3gyKGNvZWZzUCk7CisgICAgICAgIGNvZWZzUCArPSA4OworICAgICAgICBpbnQzMng0eDJfdCBuZWdDb2VmID0gdmxkMXFfczMyX3gyKGNvZWZzTik7CisgICAgICAgIGNvZWZzTiArPSA4OworI2Vsc2UKKyAgICAgICAgaW50MzJ4NHgyX3QgcG9zQ29lZjsKKyAgICAgICAgcG9zQ29lZi52YWxbMF0gPSB2bGQxcV9zMzIoY29lZnNQKTsKKyAgICAgICAgY29lZnNQICs9IDQ7CisgICAgICAgIHBvc0NvZWYudmFsWzFdID0gdmxkMXFfczMyKGNvZWZzUCk7CisgICAgICAgIGNvZWZzUCArPSA0OworICAgICAgICBpbnQzMng0eDJfdCBuZWdDb2VmOworICAgICAgICBuZWdDb2VmLnZhbFswXSA9IHZsZDFxX3MzMihjb2Vmc04pOworICAgICAgICBjb2Vmc04gKz0gNDsKKyAgICAgICAgbmVnQ29lZi52YWxbMV0gPSB2bGQxcV9zMzIoY29lZnNOKTsKKyAgICAgICAgY29lZnNOICs9IDQ7CisjZW5kaWYKKyAgICAgICAgaWYgKCFGSVhFRCkgeyAvLyBpbnRlcnBvbGF0ZQorI2lmZGVmIHZsZDFxX3MzMl94MgorICAgICAgICAgICAgaW50MzJ4NHgyX3QgcG9zQ29lZjEgPSB2bGQxcV9zMzJfeDIoY29lZnNQMSk7CisgICAgICAgICAgICBjb2Vmc1AxICs9IDg7CisgICAgICAgICAgICBpbnQzMng0eDJfdCBuZWdDb2VmMSA9IHZsZDFxX3MzMl94Mihjb2Vmc04xKTsKKyAgICAgICAgICAgIGNvZWZzTjEgKz0gODsKKyNlbHNlCisgICAgICAgICAgICBpbnQzMng0eDJfdCBwb3NDb2VmMTsKKyAgICAgICAgICAgIHBvc0NvZWYxLnZhbFswXSA9IHZsZDFxX3MzMihjb2Vmc1AxKTsKKyAgICAgICAgICAgIGNvZWZzUDEgKz0gNDsKKyAgICAgICAgICAgIHBvc0NvZWYxLnZhbFsxXSA9IHZsZDFxX3MzMihjb2Vmc1AxKTsKKyAgICAgICAgICAgIGNvZWZzUDEgKz0gNDsKKyAgICAgICAgICAgIGludDMyeDR4Ml90IG5lZ0NvZWYxOworICAgICAgICAgICAgbmVnQ29lZjEudmFsWzBdID0gdmxkMXFfczMyKGNvZWZzTjEpOworICAgICAgICAgICAgY29lZnNOMSArPSA0OworICAgICAgICAgICAgbmVnQ29lZjEudmFsWzFdID0gdmxkMXFfczMyKGNvZWZzTjEpOworICAgICAgICAgICAgY29lZnNOMSArPSA0OworI2VuZGlmCisKKyAgICAgICAgICAgIHBvc0NvZWYxLnZhbFswXSA9IHZzdWJxX3MzMihwb3NDb2VmMS52YWxbMF0sIHBvc0NvZWYudmFsWzBdKTsKKyAgICAgICAgICAgIHBvc0NvZWYxLnZhbFsxXSA9IHZzdWJxX3MzMihwb3NDb2VmMS52YWxbMV0sIHBvc0NvZWYudmFsWzFdKTsKKyAgICAgICAgICAgIG5lZ0NvZWYudmFsWzBdID0gdnN1YnFfczMyKG5lZ0NvZWYudmFsWzBdLCBuZWdDb2VmMS52YWxbMF0pOworICAgICAgICAgICAgbmVnQ29lZi52YWxbMV0gPSB2c3VicV9zMzIobmVnQ29lZi52YWxbMV0sIG5lZ0NvZWYxLnZhbFsxXSk7CisKKyAgICAgICAgICAgIHBvc0NvZWYxLnZhbFswXSA9IHZxcmRtdWxocV9sYW5lX3MzMihwb3NDb2VmMS52YWxbMF0sIGludGVycCwgMCk7CisgICAgICAgICAgICBwb3NDb2VmMS52YWxbMV0gPSB2cXJkbXVsaHFfbGFuZV9zMzIocG9zQ29lZjEudmFsWzFdLCBpbnRlcnAsIDApOworICAgICAgICAgICAgbmVnQ29lZi52YWxbMF0gPSB2cXJkbXVsaHFfbGFuZV9zMzIobmVnQ29lZi52YWxbMF0sIGludGVycCwgMCk7CisgICAgICAgICAgICBuZWdDb2VmLnZhbFsxXSA9IHZxcmRtdWxocV9sYW5lX3MzMihuZWdDb2VmLnZhbFsxXSwgaW50ZXJwLCAwKTsKKworICAgICAgICAgICAgcG9zQ29lZi52YWxbMF0gPSB2YWRkcV9zMzIocG9zQ29lZi52YWxbMF0sIHBvc0NvZWYxLnZhbFswXSk7CisgICAgICAgICAgICBwb3NDb2VmLnZhbFsxXSA9IHZhZGRxX3MzMihwb3NDb2VmLnZhbFsxXSwgcG9zQ29lZjEudmFsWzFdKTsKKyAgICAgICAgICAgIG5lZ0NvZWYudmFsWzBdID0gdmFkZHFfczMyKG5lZ0NvZWYudmFsWzBdLCBuZWdDb2VmMS52YWxbMF0pOworICAgICAgICAgICAgbmVnQ29lZi52YWxbMV0gPSB2YWRkcV9zMzIobmVnQ29lZi52YWxbMV0sIG5lZ0NvZWYxLnZhbFsxXSk7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChDSEFOTkVMUykgeworICAgICAgICBjYXNlIDE6IHsKKyAgICAgICAgICAgIGludDE2eDhfdCBwb3NTYW1wID0gdmxkMXFfczE2KHNQKTsKKyAgICAgICAgICAgIGludDE2eDhfdCBuZWdTYW1wID0gdmxkMXFfczE2KHNOKTsKKyAgICAgICAgICAgIHNOICs9IDg7CisgICAgICAgICAgICBwb3NTYW1wID0gdnJldjY0cV9zMTYocG9zU2FtcCk7CisKKyAgICAgICAgICAgIGludDMyeDRfdCBwb3NTYW1wMCA9IHZzaGxsX25fczE2KHZnZXRfbG93X3MxNihwb3NTYW1wKSwgMTUpOworICAgICAgICAgICAgaW50MzJ4NF90IHBvc1NhbXAxID0gdnNobGxfbl9zMTYodmdldF9oaWdoX3MxNihwb3NTYW1wKSwgMTUpOworICAgICAgICAgICAgaW50MzJ4NF90IG5lZ1NhbXAwID0gdnNobGxfbl9zMTYodmdldF9sb3dfczE2KG5lZ1NhbXApLCAxNSk7CisgICAgICAgICAgICBpbnQzMng0X3QgbmVnU2FtcDEgPSB2c2hsbF9uX3MxNih2Z2V0X2hpZ2hfczE2KG5lZ1NhbXApLCAxNSk7CisKKyAgICAgICAgICAgIC8vIGRvdCBwcm9kdWN0CisgICAgICAgICAgICBwb3NTYW1wMCA9IHZxcmRtdWxocV9zMzIocG9zU2FtcDAsIHBvc0NvZWYudmFsWzFdKTsgLy8gcmV2ZXJzZWQKKyAgICAgICAgICAgIHBvc1NhbXAxID0gdnFyZG11bGhxX3MzMihwb3NTYW1wMSwgcG9zQ29lZi52YWxbMF0pOyAvLyByZXZlcnNlZAorICAgICAgICAgICAgbmVnU2FtcDAgPSB2cXJkbXVsaHFfczMyKG5lZ1NhbXAwLCBuZWdDb2VmLnZhbFswXSk7CisgICAgICAgICAgICBuZWdTYW1wMSA9IHZxcmRtdWxocV9zMzIobmVnU2FtcDEsIG5lZ0NvZWYudmFsWzFdKTsKKworICAgICAgICAgICAgYWNjdW0gPSB2YWRkcV9zMzIoYWNjdW0sIHBvc1NhbXAwKTsKKyAgICAgICAgICAgIG5lZ1NhbXAwID0gdmFkZHFfczMyKG5lZ1NhbXAwLCBuZWdTYW1wMSk7CisgICAgICAgICAgICBhY2N1bSA9IHZhZGRxX3MzMihhY2N1bSwgcG9zU2FtcDEpOworICAgICAgICAgICAgYWNjdW0gPSB2YWRkcV9zMzIoYWNjdW0sIG5lZ1NhbXAwKTsKKworICAgICAgICAgICAgc1AgLT0gODsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSAyOiB7CisgICAgICAgICAgICBpbnQxNng4eDJfdCBwb3NTYW1wID0gdmxkMnFfczE2KHNQKTsKKyAgICAgICAgICAgIGludDE2eDh4Ml90IG5lZ1NhbXAgPSB2bGQycV9zMTYoc04pOworICAgICAgICAgICAgc04gKz0gMTY7CisgICAgICAgICAgICBwb3NTYW1wLnZhbFswXSA9IHZyZXY2NHFfczE2KHBvc1NhbXAudmFsWzBdKTsKKyAgICAgICAgICAgIHBvc1NhbXAudmFsWzFdID0gdnJldjY0cV9zMTYocG9zU2FtcC52YWxbMV0pOworCisgICAgICAgICAgICAvLyBsZWZ0CisgICAgICAgICAgICBpbnQzMng0X3QgcG9zU2FtcDAgPSB2c2hsbF9uX3MxNih2Z2V0X2xvd19zMTYocG9zU2FtcC52YWxbMF0pLCAxNSk7CisgICAgICAgICAgICBpbnQzMng0X3QgcG9zU2FtcDEgPSB2c2hsbF9uX3MxNih2Z2V0X2hpZ2hfczE2KHBvc1NhbXAudmFsWzBdKSwgMTUpOworICAgICAgICAgICAgaW50MzJ4NF90IG5lZ1NhbXAwID0gdnNobGxfbl9zMTYodmdldF9sb3dfczE2KG5lZ1NhbXAudmFsWzBdKSwgMTUpOworICAgICAgICAgICAgaW50MzJ4NF90IG5lZ1NhbXAxID0gdnNobGxfbl9zMTYodmdldF9oaWdoX3MxNihuZWdTYW1wLnZhbFswXSksIDE1KTsKKworICAgICAgICAgICAgLy8gZG90IHByb2R1Y3QKKyAgICAgICAgICAgIHBvc1NhbXAwID0gdnFyZG11bGhxX3MzMihwb3NTYW1wMCwgcG9zQ29lZi52YWxbMV0pOyAvLyByZXZlcnNlZAorICAgICAgICAgICAgcG9zU2FtcDEgPSB2cXJkbXVsaHFfczMyKHBvc1NhbXAxLCBwb3NDb2VmLnZhbFswXSk7IC8vIHJldmVyc2VkCisgICAgICAgICAgICBuZWdTYW1wMCA9IHZxcmRtdWxocV9zMzIobmVnU2FtcDAsIG5lZ0NvZWYudmFsWzBdKTsKKyAgICAgICAgICAgIG5lZ1NhbXAxID0gdnFyZG11bGhxX3MzMihuZWdTYW1wMSwgbmVnQ29lZi52YWxbMV0pOworCisgICAgICAgICAgICBhY2N1bSA9IHZhZGRxX3MzMihhY2N1bSwgcG9zU2FtcDApOworICAgICAgICAgICAgbmVnU2FtcDAgPSB2YWRkcV9zMzIobmVnU2FtcDAsIG5lZ1NhbXAxKTsKKyAgICAgICAgICAgIGFjY3VtID0gdmFkZHFfczMyKGFjY3VtLCBwb3NTYW1wMSk7CisgICAgICAgICAgICBhY2N1bSA9IHZhZGRxX3MzMihhY2N1bSwgbmVnU2FtcDApOworCisgICAgICAgICAgICAvLyByaWdodAorICAgICAgICAgICAgcG9zU2FtcDAgPSB2c2hsbF9uX3MxNih2Z2V0X2xvd19zMTYocG9zU2FtcC52YWxbMV0pLCAxNSk7CisgICAgICAgICAgICBwb3NTYW1wMSA9IHZzaGxsX25fczE2KHZnZXRfaGlnaF9zMTYocG9zU2FtcC52YWxbMV0pLCAxNSk7CisgICAgICAgICAgICBuZWdTYW1wMCA9IHZzaGxsX25fczE2KHZnZXRfbG93X3MxNihuZWdTYW1wLnZhbFsxXSksIDE1KTsKKyAgICAgICAgICAgIG5lZ1NhbXAxID0gdnNobGxfbl9zMTYodmdldF9oaWdoX3MxNihuZWdTYW1wLnZhbFsxXSksIDE1KTsKKworICAgICAgICAgICAgLy8gZG90IHByb2R1Y3QKKyAgICAgICAgICAgIHBvc1NhbXAwID0gdnFyZG11bGhxX3MzMihwb3NTYW1wMCwgcG9zQ29lZi52YWxbMV0pOyAvLyByZXZlcnNlZAorICAgICAgICAgICAgcG9zU2FtcDEgPSB2cXJkbXVsaHFfczMyKHBvc1NhbXAxLCBwb3NDb2VmLnZhbFswXSk7IC8vIHJldmVyc2VkCisgICAgICAgICAgICBuZWdTYW1wMCA9IHZxcmRtdWxocV9zMzIobmVnU2FtcDAsIG5lZ0NvZWYudmFsWzBdKTsKKyAgICAgICAgICAgIG5lZ1NhbXAxID0gdnFyZG11bGhxX3MzMihuZWdTYW1wMSwgbmVnQ29lZi52YWxbMV0pOworCisgICAgICAgICAgICBhY2N1bTIgPSB2YWRkcV9zMzIoYWNjdW0yLCBwb3NTYW1wMCk7CisgICAgICAgICAgICBuZWdTYW1wMCA9IHZhZGRxX3MzMihuZWdTYW1wMCwgbmVnU2FtcDEpOworICAgICAgICAgICAgYWNjdW0yID0gdmFkZHFfczMyKGFjY3VtMiwgcG9zU2FtcDEpOworICAgICAgICAgICAgYWNjdW0yID0gdmFkZHFfczMyKGFjY3VtMiwgbmVnU2FtcDApOworCisgICAgICAgICAgICBzUCAtPSAxNjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGNvdW50IC09IDgpOworCisgICAgLy8gbXVsdGlwbHkgYnkgdm9sdW1lIGFuZCBzYXZlCisgICAgdm9sdW1lTFIgPSAoY29uc3QgaW50MzJfdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKHZvbHVtZUxSLCA4KTsKKyAgICBpbnQzMngyX3QgdkxSID0gdmxkMV9zMzIodm9sdW1lTFIpOworICAgIGludDMyeDJfdCBvdXRTYW1wID0gdmxkMV9zMzIob3V0KTsKKyAgICAvLyBjb21iaW5lIGFuZCBmdW5uZWwgZG93biBhY2N1bXVsYXRvcgorICAgIGludDMyeDJfdCBvdXRBY2N1bSA9IHZwYWRkX3MzMih2Z2V0X2xvd19zMzIoYWNjdW0pLCB2Z2V0X2hpZ2hfczMyKGFjY3VtKSk7CisgICAgaWYgKENIQU5ORUxTID09IDEpIHsKKyAgICAgICAgLy8gZHVwbGljYXRlIGFjY3VtIHRvIGJvdGggTCBhbmQgUgorICAgICAgICBvdXRBY2N1bSA9IHZwYWRkX3MzMihvdXRBY2N1bSwgb3V0QWNjdW0pOworICAgIH0gZWxzZSBpZiAoQ0hBTk5FTFMgPT0gMikgeworICAgICAgICAvLyBhY2N1bTIgY29udGFpbnMgUiwgZm9sZCBpbgorICAgICAgICBpbnQzMngyX3Qgb3V0QWNjdW0yID0gdnBhZGRfczMyKHZnZXRfbG93X3MzMihhY2N1bTIpLCB2Z2V0X2hpZ2hfczMyKGFjY3VtMikpOworICAgICAgICBvdXRBY2N1bSA9IHZwYWRkX3MzMihvdXRBY2N1bSwgb3V0QWNjdW0yKTsKKyAgICB9CisgICAgb3V0QWNjdW0gPSB2cXJkbXVsaF9zMzIob3V0QWNjdW0sIHZMUik7CisgICAgb3V0U2FtcCA9IHZxYWRkX3MzMihvdXRTYW1wLCBvdXRBY2N1bSk7CisgICAgdnN0MV9zMzIob3V0LCBvdXRTYW1wKTsKK30KKwordGVtcGxhdGUgPGludCBDSEFOTkVMUywgaW50IFNUUklERSwgYm9vbCBGSVhFRD4KK3N0YXRpYyBpbmxpbmUgdm9pZCBQcm9jZXNzTmVvbkludHJpbnNpYyhmbG9hdCogb3V0LAorICAgICAgICBpbnQgY291bnQsCisgICAgICAgIGNvbnN0IGZsb2F0KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGZsb2F0KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGZsb2F0KiBzUCwKKyAgICAgICAgY29uc3QgZmxvYXQqIHNOLAorICAgICAgICBjb25zdCBmbG9hdCogdm9sdW1lTFIsCisgICAgICAgIGZsb2F0IGxlcnBQLAorICAgICAgICBjb25zdCBmbG9hdCogY29lZnNQMSwKKyAgICAgICAgY29uc3QgZmxvYXQqIGNvZWZzTjEpCit7CisgICAgQUxPR19BU1NFUlQoY291bnQgPiAwICYmIChjb3VudCAmIDcpID09IDApOyAvLyBtdWx0aXBsZSBvZiA4CisgICAgQ09NUElMRV9USU1FX0FTU0VSVF9GVU5DVElPTl9TQ09QRShDSEFOTkVMUyA9PSAxIHx8IENIQU5ORUxTID09IDIpOworCisgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOworICAgIGNvZWZzUCA9IChjb25zdCBmbG9hdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKGNvZWZzUCwgMTYpOworICAgIGNvZWZzTiA9IChjb25zdCBmbG9hdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKGNvZWZzTiwgMTYpOworCisgICAgZmxvYXQzMngyX3QgaW50ZXJwOworICAgIGlmICghRklYRUQpIHsKKyAgICAgICAgaW50ZXJwID0gdmR1cF9uX2YzMihsZXJwUCk7CisgICAgICAgIGNvZWZzUDEgPSAoY29uc3QgZmxvYXQqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChjb2Vmc1AxLCAxNik7CisgICAgICAgIGNvZWZzTjEgPSAoY29uc3QgZmxvYXQqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChjb2Vmc04xLCAxNik7CisgICAgfQorICAgIGZsb2F0MzJ4NF90IGFjY3VtLCBhY2N1bTI7CisgICAgLy8gd2FybmluZyB1bmluaXRpYWxpemVkIGlmIHdlIHVzZSB2ZW9ycV9zMzIKKyAgICAvLyAoYWx0ZXJuYXRpdmUgdG8gYmVsb3cpIGFjY3VtID0gdmVvcnFfczMyKGFjY3VtLCBhY2N1bSk7CisgICAgYWNjdW0gPSB2ZHVwcV9uX2YzMigwKTsKKyAgICBpZiAoQ0hBTk5FTFMgPT0gMikgeworICAgICAgICAvLyAoYWx0ZXJuYXRpdmUgdG8gYmVsb3cpIGFjY3VtMiA9IHZlb3JxX3MzMihhY2N1bTIsIGFjY3VtMik7CisgICAgICAgIGFjY3VtMiA9IHZkdXBxX25fZjMyKDApOworICAgIH0KKyAgICBkbyB7CisjaWZkZWYgdmxkMXFfZjMyX3gyCisgICAgICAgIGZsb2F0MzJ4NHgyX3QgcG9zQ29lZiA9IHZsZDFxX2YzMl94Mihjb2Vmc1ApOworICAgICAgICBjb2Vmc1AgKz0gODsKKyAgICAgICAgZmxvYXQzMng0eDJfdCBuZWdDb2VmID0gdmxkMXFfZjMyX3gyKGNvZWZzTik7CisgICAgICAgIGNvZWZzTiArPSA4OworI2Vsc2UKKyAgICAgICAgZmxvYXQzMng0eDJfdCBwb3NDb2VmOworICAgICAgICBwb3NDb2VmLnZhbFswXSA9IHZsZDFxX2YzMihjb2Vmc1ApOworICAgICAgICBjb2Vmc1AgKz0gNDsKKyAgICAgICAgcG9zQ29lZi52YWxbMV0gPSB2bGQxcV9mMzIoY29lZnNQKTsKKyAgICAgICAgY29lZnNQICs9IDQ7CisgICAgICAgIGZsb2F0MzJ4NHgyX3QgbmVnQ29lZjsKKyAgICAgICAgbmVnQ29lZi52YWxbMF0gPSB2bGQxcV9mMzIoY29lZnNOKTsKKyAgICAgICAgY29lZnNOICs9IDQ7CisgICAgICAgIG5lZ0NvZWYudmFsWzFdID0gdmxkMXFfZjMyKGNvZWZzTik7CisgICAgICAgIGNvZWZzTiArPSA0OworI2VuZGlmCisgICAgICAgIGlmICghRklYRUQpIHsgLy8gaW50ZXJwb2xhdGUKKyNpZmRlZiB2bGQxcV9mMzJfeDIKKyAgICAgICAgICAgIGZsb2F0MzJ4NHgyX3QgcG9zQ29lZjEgPSB2bGQxcV9mMzJfeDIoY29lZnNQMSk7CisgICAgICAgICAgICBjb2Vmc1AxICs9IDg7CisgICAgICAgICAgICBmbG9hdDMyeDR4Ml90IG5lZ0NvZWYxID0gdmxkMXFfZjMyX3gyKGNvZWZzTjEpOworICAgICAgICAgICAgY29lZnNOMSArPSA4OworI2Vsc2UKKyAgICAgICAgICAgIGZsb2F0MzJ4NHgyX3QgcG9zQ29lZjE7CisgICAgICAgICAgICBwb3NDb2VmMS52YWxbMF0gPSB2bGQxcV9mMzIoY29lZnNQMSk7CisgICAgICAgICAgICBjb2Vmc1AxICs9IDQ7CisgICAgICAgICAgICBwb3NDb2VmMS52YWxbMV0gPSB2bGQxcV9mMzIoY29lZnNQMSk7CisgICAgICAgICAgICBjb2Vmc1AxICs9IDQ7CisgICAgICAgICAgICBmbG9hdDMyeDR4Ml90IG5lZ0NvZWYxOworICAgICAgICAgICAgbmVnQ29lZjEudmFsWzBdID0gdmxkMXFfZjMyKGNvZWZzTjEpOworICAgICAgICAgICAgY29lZnNOMSArPSA0OworICAgICAgICAgICAgbmVnQ29lZjEudmFsWzFdID0gdmxkMXFfZjMyKGNvZWZzTjEpOworICAgICAgICAgICAgY29lZnNOMSArPSA0OworI2VuZGlmCisgICAgICAgICAgICBwb3NDb2VmMS52YWxbMF0gPSB2c3VicV9mMzIocG9zQ29lZjEudmFsWzBdLCBwb3NDb2VmLnZhbFswXSk7CisgICAgICAgICAgICBwb3NDb2VmMS52YWxbMV0gPSB2c3VicV9mMzIocG9zQ29lZjEudmFsWzFdLCBwb3NDb2VmLnZhbFsxXSk7CisgICAgICAgICAgICBuZWdDb2VmLnZhbFswXSA9IHZzdWJxX2YzMihuZWdDb2VmLnZhbFswXSwgbmVnQ29lZjEudmFsWzBdKTsKKyAgICAgICAgICAgIG5lZ0NvZWYudmFsWzFdID0gdnN1YnFfZjMyKG5lZ0NvZWYudmFsWzFdLCBuZWdDb2VmMS52YWxbMV0pOworCisgICAgICAgICAgICBwb3NDb2VmLnZhbFswXSA9IHZtbGFxX2xhbmVfZjMyKHBvc0NvZWYudmFsWzBdLCBwb3NDb2VmMS52YWxbMF0sIGludGVycCwgMCk7CisgICAgICAgICAgICBwb3NDb2VmLnZhbFsxXSA9IHZtbGFxX2xhbmVfZjMyKHBvc0NvZWYudmFsWzFdLCBwb3NDb2VmMS52YWxbMV0sIGludGVycCwgMCk7CisgICAgICAgICAgICBuZWdDb2VmLnZhbFswXSA9IHZtbGFxX2xhbmVfZjMyKG5lZ0NvZWYxLnZhbFswXSwgbmVnQ29lZi52YWxbMF0sIGludGVycCwgMCk7IC8vIHJldgorICAgICAgICAgICAgbmVnQ29lZi52YWxbMV0gPSB2bWxhcV9sYW5lX2YzMihuZWdDb2VmMS52YWxbMV0sIG5lZ0NvZWYudmFsWzFdLCBpbnRlcnAsIDApOyAvLyByZXYKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKENIQU5ORUxTKSB7CisgICAgICAgIGNhc2UgMTogeworI2lmZGVmIHZsZDFxX2YzMl94MgorICAgICAgICAgICAgZmxvYXQzMng0eDJfdCBwb3NTYW1wID0gdmxkMXFfZjMyX3gyKHNQKTsKKyAgICAgICAgICAgIGZsb2F0MzJ4NHgyX3QgbmVnU2FtcCA9IHZsZDFxX2YzMl94MihzTik7CisgICAgICAgICAgICBzTiArPSA4OworICAgICAgICAgICAgc1AgLT0gODsKKyNlbHNlCisgICAgICAgICAgICBmbG9hdDMyeDR4Ml90IHBvc1NhbXA7CisgICAgICAgICAgICBwb3NTYW1wLnZhbFswXSA9IHZsZDFxX2YzMihzUCk7CisgICAgICAgICAgICBzUCArPSA0OworICAgICAgICAgICAgcG9zU2FtcC52YWxbMV0gPSB2bGQxcV9mMzIoc1ApOworICAgICAgICAgICAgc1AgLT0gMTI7CisgICAgICAgICAgICBmbG9hdDMyeDR4Ml90IG5lZ1NhbXA7CisgICAgICAgICAgICBuZWdTYW1wLnZhbFswXSA9IHZsZDFxX2YzMihzTik7CisgICAgICAgICAgICBzTiArPSA0OworICAgICAgICAgICAgbmVnU2FtcC52YWxbMV0gPSB2bGQxcV9mMzIoc04pOworICAgICAgICAgICAgc04gKz0gNDsKKyNlbmRpZgorICAgICAgICAgICAgLy8gZWZmZWN0aXZlbHkgd2Ugd2FudCBhIHZyZXYxMjhxX2YzMigpCisgICAgICAgICAgICBwb3NTYW1wLnZhbFswXSA9IHZyZXY2NHFfZjMyKHBvc1NhbXAudmFsWzBdKTsKKyAgICAgICAgICAgIHBvc1NhbXAudmFsWzFdID0gdnJldjY0cV9mMzIocG9zU2FtcC52YWxbMV0pOworICAgICAgICAgICAgcG9zU2FtcC52YWxbMF0gPSB2Y29tYmluZV9mMzIoCisgICAgICAgICAgICAgICAgICAgIHZnZXRfaGlnaF9mMzIocG9zU2FtcC52YWxbMF0pLCB2Z2V0X2xvd19mMzIocG9zU2FtcC52YWxbMF0pKTsKKyAgICAgICAgICAgIHBvc1NhbXAudmFsWzFdID0gdmNvbWJpbmVfZjMyKAorICAgICAgICAgICAgICAgICAgICB2Z2V0X2hpZ2hfZjMyKHBvc1NhbXAudmFsWzFdKSwgdmdldF9sb3dfZjMyKHBvc1NhbXAudmFsWzFdKSk7CisKKyAgICAgICAgICAgIGFjY3VtID0gdm1sYXFfZjMyKGFjY3VtLCBwb3NTYW1wLnZhbFswXSwgcG9zQ29lZi52YWxbMV0pOworICAgICAgICAgICAgYWNjdW0gPSB2bWxhcV9mMzIoYWNjdW0sIHBvc1NhbXAudmFsWzFdLCBwb3NDb2VmLnZhbFswXSk7CisgICAgICAgICAgICBhY2N1bSA9IHZtbGFxX2YzMihhY2N1bSwgbmVnU2FtcC52YWxbMF0sIG5lZ0NvZWYudmFsWzBdKTsKKyAgICAgICAgICAgIGFjY3VtID0gdm1sYXFfZjMyKGFjY3VtLCBuZWdTYW1wLnZhbFsxXSwgbmVnQ29lZi52YWxbMV0pOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIDI6IHsKKyAgICAgICAgICAgIGZsb2F0MzJ4NHgyX3QgcG9zU2FtcDAgPSB2bGQycV9mMzIoc1ApOworICAgICAgICAgICAgc1AgKz0gODsKKyAgICAgICAgICAgIGZsb2F0MzJ4NHgyX3QgbmVnU2FtcDAgPSB2bGQycV9mMzIoc04pOworICAgICAgICAgICAgc04gKz0gODsKKyAgICAgICAgICAgIHBvc1NhbXAwLnZhbFswXSA9IHZyZXY2NHFfZjMyKHBvc1NhbXAwLnZhbFswXSk7CisgICAgICAgICAgICBwb3NTYW1wMC52YWxbMV0gPSB2cmV2NjRxX2YzMihwb3NTYW1wMC52YWxbMV0pOworICAgICAgICAgICAgcG9zU2FtcDAudmFsWzBdID0gdmNvbWJpbmVfZjMyKAorICAgICAgICAgICAgICAgICAgICB2Z2V0X2hpZ2hfZjMyKHBvc1NhbXAwLnZhbFswXSksIHZnZXRfbG93X2YzMihwb3NTYW1wMC52YWxbMF0pKTsKKyAgICAgICAgICAgIHBvc1NhbXAwLnZhbFsxXSA9IHZjb21iaW5lX2YzMigKKyAgICAgICAgICAgICAgICAgICAgdmdldF9oaWdoX2YzMihwb3NTYW1wMC52YWxbMV0pLCB2Z2V0X2xvd19mMzIocG9zU2FtcDAudmFsWzFdKSk7CisKKyAgICAgICAgICAgIGZsb2F0MzJ4NHgyX3QgcG9zU2FtcDEgPSB2bGQycV9mMzIoc1ApOworICAgICAgICAgICAgc1AgLT0gMjQ7CisgICAgICAgICAgICBmbG9hdDMyeDR4Ml90IG5lZ1NhbXAxID0gdmxkMnFfZjMyKHNOKTsKKyAgICAgICAgICAgIHNOICs9IDg7CisgICAgICAgICAgICBwb3NTYW1wMS52YWxbMF0gPSB2cmV2NjRxX2YzMihwb3NTYW1wMS52YWxbMF0pOworICAgICAgICAgICAgcG9zU2FtcDEudmFsWzFdID0gdnJldjY0cV9mMzIocG9zU2FtcDEudmFsWzFdKTsKKyAgICAgICAgICAgIHBvc1NhbXAxLnZhbFswXSA9IHZjb21iaW5lX2YzMigKKyAgICAgICAgICAgICAgICAgICAgdmdldF9oaWdoX2YzMihwb3NTYW1wMS52YWxbMF0pLCB2Z2V0X2xvd19mMzIocG9zU2FtcDEudmFsWzBdKSk7CisgICAgICAgICAgICBwb3NTYW1wMS52YWxbMV0gPSB2Y29tYmluZV9mMzIoCisgICAgICAgICAgICAgICAgICAgIHZnZXRfaGlnaF9mMzIocG9zU2FtcDEudmFsWzFdKSwgdmdldF9sb3dfZjMyKHBvc1NhbXAxLnZhbFsxXSkpOworCisgICAgICAgICAgICAvLyBOb3RlOiBzcGVlZCBpcyBhZmZlY3RlZCBieSBhY2N1bXVsYXRpb24gb3JkZXIuCisgICAgICAgICAgICAvLyBBbHNvLCBzcGVlZCBhcHBlYXJzIHNsb3dlciB1c2luZyB2bXVsL3ZhZGQgaW5zdGVhZCBvZiB2bWxhIGZvcgorICAgICAgICAgICAgLy8gc3RlcmVvIGNhc2UsIGNvbXBhcmFibGUgZm9yIG1vbm8uCisKKyAgICAgICAgICAgIGFjY3VtID0gdm1sYXFfZjMyKGFjY3VtLCBuZWdTYW1wMC52YWxbMF0sIG5lZ0NvZWYudmFsWzBdKTsKKyAgICAgICAgICAgIGFjY3VtID0gdm1sYXFfZjMyKGFjY3VtLCBuZWdTYW1wMS52YWxbMF0sIG5lZ0NvZWYudmFsWzFdKTsKKyAgICAgICAgICAgIGFjY3VtMiA9IHZtbGFxX2YzMihhY2N1bTIsIG5lZ1NhbXAwLnZhbFsxXSwgbmVnQ29lZi52YWxbMF0pOworICAgICAgICAgICAgYWNjdW0yID0gdm1sYXFfZjMyKGFjY3VtMiwgbmVnU2FtcDEudmFsWzFdLCBuZWdDb2VmLnZhbFsxXSk7CisKKyAgICAgICAgICAgIGFjY3VtID0gdm1sYXFfZjMyKGFjY3VtLCBwb3NTYW1wMC52YWxbMF0sIHBvc0NvZWYudmFsWzFdKTsgLy8gcmV2ZXJzZWQKKyAgICAgICAgICAgIGFjY3VtID0gdm1sYXFfZjMyKGFjY3VtLCBwb3NTYW1wMS52YWxbMF0sIHBvc0NvZWYudmFsWzBdKTsgLy8gcmV2ZXJzZWQKKyAgICAgICAgICAgIGFjY3VtMiA9IHZtbGFxX2YzMihhY2N1bTIsIHBvc1NhbXAwLnZhbFsxXSwgcG9zQ29lZi52YWxbMV0pOyAvLyByZXZlcnNlZAorICAgICAgICAgICAgYWNjdW0yID0gdm1sYXFfZjMyKGFjY3VtMiwgcG9zU2FtcDEudmFsWzFdLCBwb3NDb2VmLnZhbFswXSk7IC8vIHJldmVyc2VkCisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChjb3VudCAtPSA4KTsKKworICAgIC8vIG11bHRpcGx5IGJ5IHZvbHVtZSBhbmQgc2F2ZQorICAgIHZvbHVtZUxSID0gKGNvbnN0IGZsb2F0KilfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQodm9sdW1lTFIsIDgpOworICAgIGZsb2F0MzJ4Ml90IHZMUiA9IHZsZDFfZjMyKHZvbHVtZUxSKTsKKyAgICBmbG9hdDMyeDJfdCBvdXRTYW1wID0gdmxkMV9mMzIob3V0KTsKKyAgICAvLyBjb21iaW5lIGFuZCBmdW5uZWwgZG93biBhY2N1bXVsYXRvcgorICAgIGZsb2F0MzJ4Ml90IG91dEFjY3VtID0gdnBhZGRfZjMyKHZnZXRfbG93X2YzMihhY2N1bSksIHZnZXRfaGlnaF9mMzIoYWNjdW0pKTsKKyAgICBpZiAoQ0hBTk5FTFMgPT0gMSkgeworICAgICAgICAvLyBkdXBsaWNhdGUgYWNjdW0gdG8gYm90aCBMIGFuZCBSCisgICAgICAgIG91dEFjY3VtID0gdnBhZGRfZjMyKG91dEFjY3VtLCBvdXRBY2N1bSk7CisgICAgfSBlbHNlIGlmIChDSEFOTkVMUyA9PSAyKSB7CisgICAgICAgIC8vIGFjY3VtMiBjb250YWlucyBSLCBmb2xkIGluCisgICAgICAgIGZsb2F0MzJ4Ml90IG91dEFjY3VtMiA9IHZwYWRkX2YzMih2Z2V0X2xvd19mMzIoYWNjdW0yKSwgdmdldF9oaWdoX2YzMihhY2N1bTIpKTsKKyAgICAgICAgb3V0QWNjdW0gPSB2cGFkZF9mMzIob3V0QWNjdW0sIG91dEFjY3VtMik7CisgICAgfQorICAgIG91dFNhbXAgPSB2bWxhX2YzMihvdXRTYW1wLCBvdXRBY2N1bSwgdkxSKTsKKyAgICB2c3QxX2YzMihvdXQsIG91dFNhbXApOworfQorCiB0ZW1wbGF0ZSA8PgogaW5saW5lIHZvaWQgUHJvY2Vzc0w8MSwgMTY+KGludDMyX3QqIGNvbnN0IG91dCwKICAgICAgICAgaW50IGNvdW50LApAQCAtNTgsNiArNTMxLDEwIEBACiAgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAogICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKIHsKKyNpZmRlZiBVU0VfSU5UUklOU0lDCisgICAgUHJvY2Vzc05lb25JbnRyaW5zaWM8MSwgMTYsIHRydWU+KG91dCwgY291bnQsIGNvZWZzUCwgY29lZnNOLCBzUCwgc04sIHZvbHVtZUxSLAorICAgICAgICAgICAgMCAvKmxlcnBQKi8sIE5VTEwgLypjb2Vmc1AxKi8sIE5VTEwgLypjb2Vmc04xKi8pOworI2Vsc2UKICAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAxOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKICAgICBjb25zdCBpbnQgU1RSSURFID0gMTY7CiAgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOwpAQCAtOTksNiArNTc2LDcgQEAKICAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAogICAgICAgICAgICJxOCIsICJxMTAiCiAgICAgKTsKKyNlbmRpZgogfQogCiB0ZW1wbGF0ZSA8PgpAQCAtMTEwLDYgKzU4OCwxMCBAQAogICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKICAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCiB7CisjaWZkZWYgVVNFX0lOVFJJTlNJQworICAgIFByb2Nlc3NOZW9uSW50cmluc2ljPDIsIDE2LCB0cnVlPihvdXQsIGNvdW50LCBjb2Vmc1AsIGNvZWZzTiwgc1AsIHNOLCB2b2x1bWVMUiwKKyAgICAgICAgICAgIDAgLypsZXJwUCovLCBOVUxMIC8qY29lZnNQMSovLCBOVUxMIC8qY29lZnNOMSovKTsKKyNlbHNlCiAgICAgY29uc3QgaW50IENIQU5ORUxTID0gMjsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCiAgICAgY29uc3QgaW50IFNUUklERSA9IDE2OwogICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKQEAgLTExOSwxMyArNjAxLDEzIEBACiAKICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKIAotICAgICAgICAidmxkMi4xNiAgICAgICAge3EyLCBxM30sIFslW3NQXV0gICAgICAgIFxuIi8vICgzKzBkKSBsb2FkIDggMTYtYml0cyBzdGVyZW8gc2FtcGxlcwotICAgICAgICAidmxkMi4xNiAgICAgICAge3E1LCBxNn0sIFslW3NOXV0hICAgICAgIFxuIi8vICgzKSBsb2FkIDggMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMi4xNiAgICAgICAge3EyLCBxM30sIFslW3NQXV0gICAgICAgIFxuIi8vICgzKzBkKSBsb2FkIDggMTYtYml0cyBzdGVyZW8gZnJhbWVzCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7cTUsIHE2fSwgWyVbc05dXSEgICAgICAgXG4iLy8gKDMpIGxvYWQgOCAxNi1iaXRzIHN0ZXJlbyBmcmFtZXMKICAgICAgICAgInZsZDEuMTYgICAgICAgIHtxOH0sIFslW2NvZWZzUDBdOjEyOF0hICBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMKICAgICAgICAgInZsZDEuMTYgICAgICAgIHtxMTB9LCBbJVtjb2Vmc04wXToxMjhdISBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMKIAotICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgIFxuIi8vICgxKSByZXZlcnNlIDggZnJhbWVzIG9mIHRoZSBsZWZ0IHBvc2l0aXZlCi0gICAgICAgICJ2cmV2NjQuMTYgICAgICBxMywgcTMgICAgICAgICAgICAgICAgICAgXG4iLy8gKDAgY29tYmluZXMrKSByZXZlcnNlIHJpZ2h0IHBvc2l0aXZlCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgXG4iLy8gKDEpIHJldmVyc2UgOCBzYW1wbGVzIG9mIHBvc2l0aXZlIGxlZnQKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEzLCBxMyAgICAgICAgICAgICAgICAgICBcbiIvLyAoMCBjb21iaW5lcyspIHJldmVyc2UgcG9zaXRpdmUgcmlnaHQKIAogICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ0LCBkMTcgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSAocmV2ZXJzZWQpIHNhbXBsZXMgbGVmdAogICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ1LCBkMTYgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSAocmV2ZXJzZWQpIHNhbXBsZXMgbGVmdApAQCAtMTU3LDYgKzYzOSw3IEBACiAgICAgICAgICAgInE0IiwgInE1IiwgInE2IiwKICAgICAgICAgICAicTgiLCAicTEwIgogICAgICApOworI2VuZGlmCiB9CiAKIHRlbXBsYXRlIDw+CkBAIC0xNzEsNiArNjU0LDExIEBACiAgICAgICAgIHVpbnQzMl90IGxlcnBQLAogICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKIHsKKyNpZmRlZiBVU0VfSU5UUklOU0lDCisgICAgUHJvY2Vzc05lb25JbnRyaW5zaWM8MSwgMTYsIGZhbHNlPihvdXQsIGNvdW50LCBjb2Vmc1AsIGNvZWZzTiwgc1AsIHNOLCB2b2x1bWVMUiwKKyAgICAgICAgICAgIGxlcnBQLCBjb2Vmc1AxLCBjb2Vmc04xKTsKKyNlbHNlCisKICAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAxOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKICAgICBjb25zdCBpbnQgU1RSSURFID0gMTY7CiAgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOwpAQCAtMjI3LDYgKzcxNSw3IEBACiAgICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKICAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIKICAgICApOworI2VuZGlmCiB9CiAKIHRlbXBsYXRlIDw+CkBAIC0yNDEsNiArNzMwLDEwIEBACiAgICAgICAgIHVpbnQzMl90IGxlcnBQLAogICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKIHsKKyNpZmRlZiBVU0VfSU5UUklOU0lDCisgICAgUHJvY2Vzc05lb25JbnRyaW5zaWM8MiwgMTYsIGZhbHNlPihvdXQsIGNvdW50LCBjb2Vmc1AsIGNvZWZzTiwgc1AsIHNOLCB2b2x1bWVMUiwKKyAgICAgICAgICAgIGxlcnBQLCBjb2Vmc1AxLCBjb2Vmc04xKTsKKyNlbHNlCiAgICAgY29uc3QgaW50IENIQU5ORUxTID0gMjsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCiAgICAgY29uc3QgaW50IFNUUklERSA9IDE2OwogICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKQEAgLTI1MSw4ICs3NDQsOCBAQAogCiAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCiAKLSAgICAgICAgInZsZDIuMTYgICAgICAgIHtxMiwgcTN9LCBbJVtzUF1dICAgICAgICBcbiIvLyAoMyswZCkgbG9hZCA4IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKLSAgICAgICAgInZsZDIuMTYgICAgICAgIHtxNSwgcTZ9LCBbJVtzTl1dISAgICAgICBcbiIvLyAoMykgbG9hZCA4IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtxMiwgcTN9LCBbJVtzUF1dICAgICAgICBcbiIvLyAoMyswZCkgbG9hZCA4IDE2LWJpdHMgc3RlcmVvIGZyYW1lcworICAgICAgICAidmxkMi4xNiAgICAgICAge3E1LCBxNn0sIFslW3NOXV0hICAgICAgIFxuIi8vICgzKSBsb2FkIDggMTYtYml0cyBzdGVyZW8gZnJhbWVzCiAgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTh9LCBbJVtjb2Vmc1AwXToxMjhdISAgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzCiAgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTl9LCBbJVtjb2Vmc1AxXToxMjhdISAgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCiAgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTEwfSwgWyVbY29lZnNOMV06MTI4XSEgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzCkBAIC0yNjQsOCArNzU3LDggQEAKICAgICAgICAgInZxcmRtdWxoLnMxNiAgIHE5LCBxOSwgZDJbMF0gICAgICAgICAgICBcbiIvLyAoMikgaW50ZXJwb2xhdGUgKHN0ZXAyKSAxc3Qgc2V0IG9mIGNvZWZzCiAgICAgICAgICJ2cXJkbXVsaC5zMTYgICBxMTEsIHExMSwgZDJbMF0gICAgICAgICAgXG4iLy8gKDIpIGludGVycG9sYXRlIChzdGVwMikgMm5kIHNldCBvZiBjb2VmcwogCi0gICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgXG4iLy8gKDEpIHJldmVyc2UgOCBmcmFtZXMgb2YgdGhlIGxlZnQgcG9zaXRpdmUKLSAgICAgICAgInZyZXY2NC4xNiAgICAgIHEzLCBxMyAgICAgICAgICAgICAgICAgICBcbiIvLyAoMSkgcmV2ZXJzZSA4IGZyYW1lcyBvZiB0aGUgcmlnaHQgcG9zaXRpdmUKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICBcbiIvLyAoMSkgcmV2ZXJzZSA4IHNhbXBsZXMgb2YgcG9zaXRpdmUgbGVmdAorICAgICAgICAidnJldjY0LjE2ICAgICAgcTMsIHEzICAgICAgICAgICAgICAgICAgIFxuIi8vICgxKSByZXZlcnNlIDggc2FtcGxlcyBvZiBwb3NpdGl2ZSByaWdodAogCiAgICAgICAgICJ2YWRkLnMxNiAgICAgICBxOCwgcTgsIHE5ICAgICAgICAgICAgICAgXG4iLy8gKDErMWQpIGludGVycG9sYXRlIChzdGVwMykgMXN0IHNldAogICAgICAgICAidmFkZC5zMTYgICAgICAgcTEwLCBxMTAsIHExMSAgICAgICAgICAgIFxuIi8vICgxKzFkKSBpbnRlcnBvbGF0ZSAoc3RlcDMpIDJuZCBzZXQKQEAgLTMwMyw2ICs3OTYsNyBAQAogICAgICAgICAgICJxNCIsICJxNSIsICJxNiIsCiAgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiCiAgICAgKTsKKyNlbmRpZgogfQogCiB0ZW1wbGF0ZSA8PgpAQCAtMzE0LDYgKzgwOCwxMCBAQAogICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKICAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCiB7CisjaWZkZWYgVVNFX0lOVFJJTlNJQworICAgIFByb2Nlc3NOZW9uSW50cmluc2ljPDEsIDE2LCB0cnVlPihvdXQsIGNvdW50LCBjb2Vmc1AsIGNvZWZzTiwgc1AsIHNOLCB2b2x1bWVMUiwKKyAgICAgICAgICAgIDAgLypsZXJwUCovLCBOVUxMIC8qY29lZnNQMSovLCBOVUxMIC8qY29lZnNOMSovKTsKKyNlbHNlCiAgICAgY29uc3QgaW50IENIQU5ORUxTID0gMTsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCiAgICAgY29uc3QgaW50IFNUUklERSA9IDE2OwogICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKQEAgLTMyNyw3ICs4MjUsNyBAQAogICAgICAgICAidmxkMS4zMiAgICAgICAge3E4LCBxOX0sIFslW2NvZWZzUDBdOjEyOF0hICAgXG4iLy8gbG9hZCA4IDMyLWJpdHMgY29lZnMKICAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTAsIHExMX0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIi8vIGxvYWQgOCAzMi1iaXRzIGNvZWZzCiAKLSAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgOCBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgOCBzYW1wbGVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCiAKICAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgZDQsICMxNSAgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKICAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMywgZDUsICMxNSAgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKQEAgLTMzNSwxMCArODMzLDEwIEBACiAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTQsIGQ2LCAjMTUgICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCiAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTUsIGQ3LCAjMTUgICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCiAKLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOSAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMywgcTEzLCBxOCAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNSwgcTE1LCBxMTEgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOSAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMywgcTEzLCBxOCAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNSwgcTE1LCBxMTEgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMKIAogICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTIgICAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKICAgICAgICAgInZhZGQuczMyICAgICAgIHExMywgcTEzLCBxMTQgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CkBAIC0zNjQsNiArODYyLDcgQEAKICAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIsCiAgICAgICAgICAgInExMiIsICJxMTMiLCAicTE0IiwgInExNSIKICAgICApOworI2VuZGlmCiB9CiAKIHRlbXBsYXRlIDw+CkBAIC0zNzUsNiArODc0LDEwIEBACiAgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAogICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKIHsKKyNpZmRlZiBVU0VfSU5UUklOU0lDCisgICAgUHJvY2Vzc05lb25JbnRyaW5zaWM8MiwgMTYsIHRydWU+KG91dCwgY291bnQsIGNvZWZzUCwgY29lZnNOLCBzUCwgc04sIHZvbHVtZUxSLAorICAgICAgICAgICAgMCAvKmxlcnBQKi8sIE5VTEwgLypjb2Vmc1AxKi8sIE5VTEwgLypjb2Vmc04xKi8pOworI2Vsc2UKICAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAyOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKICAgICBjb25zdCBpbnQgU1RSSURFID0gMTY7CiAgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOwpAQCAtMzg0LDEzICs4ODcsMTMgQEAKIAogICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCiAKLSAgICAgICAgInZsZDIuMTYgICAgICAgIHtxMiwgcTN9LCBbJVtzUF1dICAgICAgICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCi0gICAgICAgICJ2bGQyLjE2ICAgICAgICB7cTUsIHE2fSwgWyVbc05dXSEgICAgICAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBzdGVyZW8gc2FtcGxlcwotICAgICAgICAidmxkMS4zMiAgICAgICAge3E4LCBxOX0sIFslW2NvZWZzUDBdOjEyOF0hICAgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKLSAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTAsIHExMX0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7cTIsIHEzfSwgWyVbc1BdXSAgICAgICAgICAgICBcbiIvLyBsb2FkIDggMTYtYml0cyBzdGVyZW8gZnJhbWVzCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7cTUsIHE2fSwgWyVbc05dXSEgICAgICAgICAgICBcbiIvLyBsb2FkIDggMTYtYml0cyBzdGVyZW8gZnJhbWVzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTgsIHE5fSwgWyVbY29lZnNQMF06MTI4XSEgICBcbiIvLyBsb2FkIDggMzItYml0cyBjb2VmcworICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMCwgcTExfSwgWyVbY29lZnNOMF06MTI4XSEgXG4iLy8gbG9hZCA4IDMyLWJpdHMgY29lZnMKIAotICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gcmV2ZXJzZSA4IGZyYW1lcyBvZiB0aGUgcG9zaXRpdmUgc2lkZQotICAgICAgICAidnJldjY0LjE2ICAgICAgcTMsIHEzICAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gcmV2ZXJzZSA4IGZyYW1lcyBvZiB0aGUgcG9zaXRpdmUgc2lkZQorICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gcmV2ZXJzZSA4IHNhbXBsZXMgb2YgcG9zaXRpdmUgbGVmdAorICAgICAgICAidnJldjY0LjE2ICAgICAgcTMsIHEzICAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gcmV2ZXJzZSA4IHNhbXBsZXMgb2YgcG9zaXRpdmUgcmlnaHQKIAogICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCAgZDQsICMxNSAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwogICAgICAgICAidnNobGwuczE2ICAgICAgcTEzLCAgZDUsICMxNSAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwpAQCAtMzk4LDE1ICs5MDEsMTUgQEAKICAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNCwgIGQxMCwgIzE1ICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKICAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNSwgIGQxMSwgIzE1ICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKIAotICAgICAgICAidnFyZG11bGguczMyICAgcTEyLCBxMTIsIHE5ICAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotICAgICAgICAidnFyZG11bGguczMyICAgcTEzLCBxMTMsIHE4ICAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotICAgICAgICAidnFyZG11bGguczMyICAgcTE0LCBxMTQsIHExMCAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotICAgICAgICAidnFyZG11bGguczMyICAgcTE1LCBxMTUsIHExMSAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTEyLCBxMTIsIHE5ICAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTMsIHExMywgcTggICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTE1LCBxMTUsIHExMSAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBjb2VmCiAKICAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEyICAgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CiAgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTMsIHExMywgcTE0ICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAotICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTUgICAgICAgICAgICAgICAgICAgXG4iLy8gKCsxKSBhY2N1bXVsYXRlIHJlc3VsdAotICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTMgICAgICAgICAgICAgICAgICAgXG4iLy8gKCsxKSBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTUgICAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEzICAgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CiAKICAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgIGQ2LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKICAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMywgIGQ3LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKQEAgLTQxNCwxNSArOTE3LDE1IEBACiAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTQsICBkMTIsICMxNSAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCiAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTUsICBkMTMsICMxNSAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCiAKLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOSAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMywgcTEzLCBxOCAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNSwgcTE1LCBxMTEgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOSAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTEzLCBxMTMsIHE4ICAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNSwgcTE1LCBxMTEgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgY29lZgogCiAgICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExMiAgICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAogICAgICAgICAidmFkZC5zMzIgICAgICAgcTEzLCBxMTMsIHExNCAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKLSAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTE1ICAgICAgICAgICAgICAgICAgIFxuIi8vICgrMSkgYWNjdW11bGF0ZSByZXN1bHQKLSAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTEzICAgICAgICAgICAgICAgICAgIFxuIi8vICgrMSkgYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTE1ICAgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExMyAgICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAogCiAgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM4ICAgICAgICBcbiIvLyB1cGRhdGUgbG9vcCBjb3VudGVyCiAgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICMzMiAgICAgICAgICAgICBcbiIvLyBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcwpAQCAtNDQ0LDYgKzk0Nyw3IEBACiAgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiLAogICAgICAgICAgICJxMTIiLCAicTEzIiwgInExNCIsICJxMTUiCiAgICAgKTsKKyNlbmRpZgogfQogCiB0ZW1wbGF0ZSA8PgpAQCAtNDU4LDYgKzk2MiwxMCBAQAogICAgICAgICB1aW50MzJfdCBsZXJwUCwKICAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCiB7CisjaWZkZWYgVVNFX0lOVFJJTlNJQworICAgIFByb2Nlc3NOZW9uSW50cmluc2ljPDEsIDE2LCBmYWxzZT4ob3V0LCBjb3VudCwgY29lZnNQLCBjb2Vmc04sIHNQLCBzTiwgdm9sdW1lTFIsCisgICAgICAgICAgICBsZXJwUCwgY29lZnNQMSwgY29lZnNOMSk7CisjZWxzZQogICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDE7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcwogICAgIGNvbnN0IGludCBTVFJJREUgPSAxNjsKICAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CkBAIC00ODksNyArOTk3LDcgQEAKICAgICAgICAgInZhZGQuczMyICAgICAgIHExMCwgcTEwLCBxMTQgICAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMykKICAgICAgICAgInZhZGQuczMyICAgICAgIHExMSwgcTExLCBxMTUgICAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMykKIAotICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gcmV2ZXJzZSA4IGZyYW1lcyBvZiB0aGUgcG9zaXRpdmUgc2lkZQorICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gcmV2ZXJzZSA4IHNhbXBsZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKIAogICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCAgZDQsICMxNSAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwogICAgICAgICAidnNobGwuczE2ICAgICAgcTEzLCAgZDUsICMxNSAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwpAQCAtNTI5LDYgKzEwMzcsNyBAQAogICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIiwKICAgICAgICAgICAicTEyIiwgInExMyIsICJxMTQiLCAicTE1IgogICAgICk7CisjZW5kaWYKIH0KIAogdGVtcGxhdGUgPD4KQEAgLTU0Myw2ICsxMDUyLDEwIEBACiAgICAgICAgIHVpbnQzMl90IGxlcnBQLAogICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKIHsKKyNpZmRlZiBVU0VfSU5UUklOU0lDCisgICAgUHJvY2Vzc05lb25JbnRyaW5zaWM8MiwgMTYsIGZhbHNlPihvdXQsIGNvdW50LCBjb2Vmc1AsIGNvZWZzTiwgc1AsIHNOLCB2b2x1bWVMUiwKKyAgICAgICAgICAgIGxlcnBQLCBjb2Vmc1AxLCBjb2Vmc04xKTsKKyNlbHNlCiAgICAgY29uc3QgaW50IENIQU5ORUxTID0gMjsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCiAgICAgY29uc3QgaW50IFNUUklERSA9IDE2OwogICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKQEAgLTU1Myw4ICsxMDY2LDggQEAKIAogICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCiAKLSAgICAgICAgInZsZDIuMTYgICAgICAgIHtxMiwgcTN9LCBbJVtzUF1dICAgICAgICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCi0gICAgICAgICJ2bGQyLjE2ICAgICAgICB7cTUsIHE2fSwgWyVbc05dXSEgICAgICAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMi4xNiAgICAgICAge3EyLCBxM30sIFslW3NQXV0gICAgICAgICAgICAgXG4iLy8gbG9hZCA4IDE2LWJpdHMgc3RlcmVvIGZyYW1lcworICAgICAgICAidmxkMi4xNiAgICAgICAge3E1LCBxNn0sIFslW3NOXV0hICAgICAgICAgICAgXG4iLy8gbG9hZCA4IDE2LWJpdHMgc3RlcmVvIGZyYW1lcwogICAgICAgICAidmxkMS4zMiAgICAgICAge3E4LCBxOX0sIFslW2NvZWZzUDBdOjEyOF0hICAgXG4iLy8gbG9hZCA4IDMyLWJpdHMgY29lZnMKICAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTIsIHExM30sIFslW2NvZWZzUDFdOjEyOF0hIFxuIi8vIGxvYWQgOCAzMi1iaXRzIGNvZWZzCiAgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTEwLCBxMTF9LCBbJVtjb2Vmc04xXToxMjhdISBcbiIvLyBsb2FkIDggMzItYml0cyBjb2VmcwpAQCAtNTc1LDggKzEwODgsOCBAQAogICAgICAgICAidmFkZC5zMzIgICAgICAgcTEwLCBxMTAsIHExNCAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKQogICAgICAgICAidmFkZC5zMzIgICAgICAgcTExLCBxMTEsIHExNSAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKQogCi0gICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDggZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCi0gICAgICAgICJ2cmV2NjQuMTYgICAgICBxMywgcTMgICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDggZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDggc2FtcGxlcyBvZiBwb3NpdGl2ZSBsZWZ0CisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMywgcTMgICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDggc2FtcGxlcyBvZiBwb3NpdGl2ZSByaWdodAogCiAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTIsICBkNCwgIzE1ICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCiAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTMsICBkNSwgIzE1ICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCkBAIC01OTEsOCArMTEwNCw4IEBACiAKICAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEyICAgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CiAgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTMsIHExMywgcTE0ICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAotICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTUgICAgICAgICAgICAgICAgICAgXG4iLy8gKCsxKSBhY2N1bXVsYXRlIHJlc3VsdAotICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTMgICAgICAgICAgICAgICAgICAgXG4iLy8gKCsxKSBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTUgICAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEzICAgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CiAKICAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgIGQ2LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKICAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMywgIGQ3LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKQEAgLTYwNyw4ICsxMTIwLDggQEAKIAogICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTIgICAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKICAgICAgICAgInZhZGQuczMyICAgICAgIHExMywgcTEzLCBxMTQgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0Ci0gICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExNSAgICAgICAgICAgICAgICAgICBcbiIvLyAoKzEpIGFjY3VtdWxhdGUgcmVzdWx0Ci0gICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExMyAgICAgICAgICAgICAgICAgICBcbiIvLyAoKzEpIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExNSAgICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTMgICAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKIAogICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjOCAgICAgICAgXG4iLy8gdXBkYXRlIGxvb3AgY291bnRlcgogICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjMzIgICAgICAgICAgICAgXG4iLy8gbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKQEAgLTYzMyw1MTcgKzExNDYsNjkgQEAKICAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIsCiAgICAgICAgICAgInExMiIsICJxMTMiLCAicTE0IiwgInExNSIKICAgICApOworI2VuZGlmCiB9CiAKLXRlbXBsYXRlIDw+Ci1pbmxpbmUgdm9pZCBQcm9jZXNzTDwxLCA4PihpbnQzMl90KiBjb25zdCBvdXQsCit0ZW1wbGF0ZTw+CitpbmxpbmUgdm9pZCBQcm9jZXNzTDwxLCAxNj4oZmxvYXQqIGNvbnN0IG91dCwKICAgICAgICAgaW50IGNvdW50LAotICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc1AsCi0gICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzTiwKLSAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCi0gICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAotICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKKyAgICAgICAgY29uc3QgZmxvYXQqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgZmxvYXQqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgZmxvYXQqIHNQLAorICAgICAgICBjb25zdCBmbG9hdCogc04sCisgICAgICAgIGNvbnN0IGZsb2F0KiBjb25zdCB2b2x1bWVMUikKIHsKLSAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAxOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKLSAgICBjb25zdCBpbnQgU1RSSURFID0gODsKLSAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7Ci0gICAgYXNtICgKLSAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIvLyAoMCAtIGNvbWJpbmVzKykgYWNjdW11bGF0b3IgPSAwCi0KLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgICAgICAidmxkMS4xNiAgICAgICAge2Q0fSwgWyVbc1BdXSAgICAgICAgICAgIFxuIi8vICgyKzBkKSBsb2FkIDQgMTYtYml0cyBtb25vIHNhbXBsZXMKLSAgICAgICAgInZsZDEuMTYgICAgICAgIHtkNn0sIFslW3NOXV0hICAgICAgICAgICBcbiIvLyAoMikgbG9hZCA0IDE2LWJpdHMgbW9ubyBzYW1wbGVzCi0gICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDE2fSwgWyVbY29lZnNQMF06NjRdISAgXG4iLy8gKDEpIGxvYWQgNCAxNi1iaXRzIGNvZWZzCi0gICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDIwfSwgWyVbY29lZnNOMF06NjRdISAgXG4iLy8gKDEpIGxvYWQgNCAxNi1iaXRzIGNvZWZzCi0KLSAgICAgICAgInZyZXY2NC4xNiAgICAgIGQ0LCBkNCAgICAgICAgICAgICAgICAgICBcbiIvLyAoMSkgcmV2ZXJzZWQgczMsIHMyLCBzMSwgczAsIHM3LCBzNiwgczUsIHM0Ci0KLSAgICAgICAgLy8gcmVvcmRlcmluZyB0aGUgdm1hbCB0byBkbyBkNiwgZDcgYmVmb3JlIGQ0LCBkNSBpcyBzbG93ZXIoPykKLSAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNCwgZDE2ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgKHJldmVyc2VkKXNhbXBsZXMgYnkgY29lZgotICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ2LCBkMjAgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSBuZWcgc2FtcGxlcwotCi0gICAgICAgIC8vIG1vdmluZyB0aGVzZSBBUk0gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBuZW9uIGFib3ZlIHNlZW1zIHRvIGJlIHNsb3dlcgotICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjNCAgIFxuIi8vICgxKSB1cGRhdGUgbG9vcCBjb3VudGVyCi0gICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICM4ICAgICAgICAgXG4iLy8gKDApIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCi0KLSAgICAgICAgLy8gc1AgdXNlZCBhZnRlciBicmFuY2ggKHdhcm5pbmcpCi0gICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAotCi0gICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfTU9OTwotCi0gICAgICAgIDogW291dF0gICAgICI9VXYiIChvdXRbMF0pLAotICAgICAgICAgIFtjb3VudF0gICAiK3IiIChjb3VudCksCi0gICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCi0gICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCi0gICAgICAgICAgW3NQXSAgICAgICIrciIgKHNQKSwKLSAgICAgICAgICBbc05dICAgICAgIityIiAoc04pCi0gICAgICAgIDogW3ZMUl0gICAgICJyIiAodm9sdW1lTFIpCi0gICAgICAgIDogImNjIiwgIm1lbW9yeSIsCi0gICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKLSAgICAgICAgICAicTgiLCAicTEwIgotICAgICk7CisgICAgUHJvY2Vzc05lb25JbnRyaW5zaWM8MSwgMTYsIHRydWU+KG91dCwgY291bnQsIGNvZWZzUCwgY29lZnNOLCBzUCwgc04sIHZvbHVtZUxSLAorICAgICAgICAgICAgMCAvKmxlcnBQKi8sIE5VTEwgLypjb2Vmc1AxKi8sIE5VTEwgLypjb2Vmc04xKi8pOwogfQogCi10ZW1wbGF0ZSA8PgotaW5saW5lIHZvaWQgUHJvY2Vzc0w8MiwgOD4oaW50MzJfdCogY29uc3Qgb3V0LAordGVtcGxhdGU8PgoraW5saW5lIHZvaWQgUHJvY2Vzc0w8MiwgMTY+KGZsb2F0KiBjb25zdCBvdXQsCiAgICAgICAgIGludCBjb3VudCwKLSAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNQLAotICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc04sCi0gICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAotICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKLSAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCisgICAgICAgIGNvbnN0IGZsb2F0KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGZsb2F0KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGZsb2F0KiBzUCwKKyAgICAgICAgY29uc3QgZmxvYXQqIHNOLAorICAgICAgICBjb25zdCBmbG9hdCogY29uc3Qgdm9sdW1lTFIpCiB7Ci0gICAgY29uc3QgaW50IENIQU5ORUxTID0gMjsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCi0gICAgY29uc3QgaW50IFNUUklERSA9IDg7Ci0gICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOwotICAgIGFzbSAoCi0gICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgXG4iLy8gKDEpIGFjY19MID0gMAotICAgICAgICAidmVvciAgICAgICAgICAgcTQsIHE0LCBxNCAgICAgICAgICAgICAgIFxuIi8vICgwIGNvbWJpbmVzKykgYWNjX1IgPSAwCi0KLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgICAgICAidmxkMi4xNiAgICAgICAge2Q0LCBkNX0sIFslW3NQXV0gICAgICAgIFxuIi8vICgyKzBkKSBsb2FkIDggMTYtYml0cyBzdGVyZW8gc2FtcGxlcwotICAgICAgICAidmxkMi4xNiAgICAgICAge2Q2LCBkN30sIFslW3NOXV0hICAgICAgIFxuIi8vICgyKSBsb2FkIDggMTYtYml0cyBzdGVyZW8gc2FtcGxlcwotICAgICAgICAidmxkMS4xNiAgICAgICAge2QxNn0sIFslW2NvZWZzUDBdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcwotICAgICAgICAidmxkMS4xNiAgICAgICAge2QyMH0sIFslW2NvZWZzTjBdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcwotCi0gICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgXG4iLy8gKDEpIHJldmVyc2UgOCBmcmFtZXMgb2YgdGhlIGxlZnQgcG9zaXRpdmUKLQotICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ0LCBkMTYgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSAocmV2ZXJzZWQpIHNhbXBsZXMgbGVmdAotICAgICAgICAidm1sYWwuczE2ICAgICAgcTQsIGQ1LCBkMTYgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSAocmV2ZXJzZWQpIHNhbXBsZXMgcmlnaHQKLSAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNiwgZDIwICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgc2FtcGxlcyBsZWZ0Ci0gICAgICAgICJ2bWxhbC5zMTYgICAgICBxNCwgZDcsIGQyMCAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHNhbXBsZXMgcmlnaHQKLQotICAgICAgICAvLyBtb3ZpbmcgdGhlc2UgQVJNIGJlZm9yZSBuZW9uIHNlZW1zIHRvIGJlIHNsb3dlcgotICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjNCAgIFxuIi8vICgxKSB1cGRhdGUgbG9vcCBjb3VudGVyCi0gICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICMxNiAgICAgICAgXG4iLy8gKDApIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCi0KLSAgICAgICAgLy8gc1AgdXNlZCBhZnRlciBicmFuY2ggKHdhcm5pbmcpCi0gICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAotCi0gICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfU1RFUkVPCi0KLSAgICAgICAgOiBbb3V0XSAiPVV2IiAob3V0WzBdKSwKLSAgICAgICAgICBbY291bnRdICIrciIgKGNvdW50KSwKLSAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKLSAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKLSAgICAgICAgICBbc1BdICIrciIgKHNQKSwKLSAgICAgICAgICBbc05dICIrciIgKHNOKQotICAgICAgICA6IFt2TFJdICJyIiAodm9sdW1lTFIpCi0gICAgICAgIDogImNjIiwgIm1lbW9yeSIsCi0gICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKLSAgICAgICAgICAicTQiLCAicTUiLCAicTYiLAotICAgICAgICAgICJxOCIsICJxMTAiCi0gICAgICk7CisgICAgUHJvY2Vzc05lb25JbnRyaW5zaWM8MiwgMTYsIHRydWU+KG91dCwgY291bnQsIGNvZWZzUCwgY29lZnNOLCBzUCwgc04sIHZvbHVtZUxSLAorICAgICAgICAgICAgMCAvKmxlcnBQKi8sIE5VTEwgLypjb2Vmc1AxKi8sIE5VTEwgLypjb2Vmc04xKi8pOwogfQogCi10ZW1wbGF0ZSA8PgotaW5saW5lIHZvaWQgUHJvY2VzczwxLCA4PihpbnQzMl90KiBjb25zdCBvdXQsCit0ZW1wbGF0ZTw+CitpbmxpbmUgdm9pZCBQcm9jZXNzPDEsIDE2PihmbG9hdCogY29uc3Qgb3V0LAogICAgICAgICBpbnQgY291bnQsCi0gICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzUCwKLSAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNOLAotICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc1AxLAotICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc04xLAotICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKLSAgICAgICAgY29uc3QgaW50MTZfdCogc04sCi0gICAgICAgIHVpbnQzMl90IGxlcnBQLAotICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKKyAgICAgICAgY29uc3QgZmxvYXQqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgZmxvYXQqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgZmxvYXQqIGNvZWZzUDEsCisgICAgICAgIGNvbnN0IGZsb2F0KiBjb2Vmc04xLAorICAgICAgICBjb25zdCBmbG9hdCogc1AsCisgICAgICAgIGNvbnN0IGZsb2F0KiBzTiwKKyAgICAgICAgZmxvYXQgbGVycFAsCisgICAgICAgIGNvbnN0IGZsb2F0KiBjb25zdCB2b2x1bWVMUikKIHsKLSAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAxOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKLSAgICBjb25zdCBpbnQgU1RSSURFID0gODsKLSAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7Ci0gICAgYXNtICgKLSAgICAgICAgInZtb3YuMzIgICAgICAgIGQyWzBdLCAlW2xlcnBQXSAgICAgICAgICBcbiIvLyBsb2FkIHRoZSBwb3NpdGl2ZSBwaGFzZSBTMzIgUTE1Ci0gICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgXG4iLy8gKDAgLSBjb21iaW5lcyspIGFjY3VtdWxhdG9yID0gMAotCi0gICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAgICAgInZsZDEuMTYgICAgICAgIHtkNH0sIFslW3NQXV0gICAgICAgICAgICBcbiIvLyAoMiswZCkgbG9hZCA0IDE2LWJpdHMgbW9ubyBzYW1wbGVzCi0gICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDZ9LCBbJVtzTl1dISAgICAgICAgICAgXG4iLy8gKDIpIGxvYWQgNCAxNi1iaXRzIG1vbm8gc2FtcGxlcwotICAgICAgICAidmxkMS4xNiAgICAgICAge2QxNn0sIFslW2NvZWZzUDBdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDQgMTYtYml0cyBjb2VmcwotICAgICAgICAidmxkMS4xNiAgICAgICAge2QxN30sIFslW2NvZWZzUDFdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDQgMTYtYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgotICAgICAgICAidmxkMS4xNiAgICAgICAge2QyMH0sIFslW2NvZWZzTjFdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDQgMTYtYml0cyBjb2VmcwotICAgICAgICAidmxkMS4xNiAgICAgICAge2QyMX0sIFslW2NvZWZzTjBdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDQgMTYtYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgotCi0gICAgICAgICJ2c3ViLnMxNiAgICAgICBkMTcsIGQxNywgZDE2ICAgICAgICAgICAgXG4iLy8gKDEpIGludGVycG9sYXRlIChzdGVwMSkgMXN0IHNldCBvZiBjb2VmcwotICAgICAgICAidnN1Yi5zMTYgICAgICAgZDIxLCBkMjEsIGQyMCAgICAgICAgICAgIFxuIi8vICgxKSBpbnRlcnBvbGF0ZSAoc3RlcDEpIDJuZCBzZXQgb2YgY29ldHMKLQotICAgICAgICAidnFyZG11bGguczE2ICAgZDE3LCBkMTcsIGQyWzBdICAgICAgICAgIFxuIi8vICgyKSBpbnRlcnBvbGF0ZSAoc3RlcDIpIDFzdCBzZXQgb2YgY29lZnMKLSAgICAgICAgInZxcmRtdWxoLnMxNiAgIGQyMSwgZDIxLCBkMlswXSAgICAgICAgICBcbiIvLyAoMikgaW50ZXJwb2xhdGUgKHN0ZXAyKSAybmQgc2V0IG9mIGNvZWZzCi0KLSAgICAgICAgInZyZXY2NC4xNiAgICAgIGQ0LCBkNCAgICAgICAgICAgICAgICAgICBcbiIvLyAoMSkgcmV2ZXJzZSBzMywgczIsIHMxLCBzMCwgczcsIHM2LCBzNSwgczQKLQotICAgICAgICAidmFkZC5zMTYgICAgICAgZDE2LCBkMTYsIGQxNyAgICAgICAgICAgIFxuIi8vICgxKzJkKSBpbnRlcnBvbGF0ZSAoc3RlcDMpIDFzdCBzZXQKLSAgICAgICAgInZhZGQuczE2ICAgICAgIGQyMCwgZDIwLCBkMjEgICAgICAgICAgICBcbiIvLyAoMSsxZCkgaW50ZXJwb2xhdGUgKHN0ZXAzKSAybmQgc2V0Ci0KLSAgICAgICAgLy8gcmVvcmRlcmluZyB0aGUgdm1hbCB0byBkbyBkNiwgZDcgYmVmb3JlIGQ0LCBkNSBpcyBzbG93ZXIoPykKLSAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNCwgZDE2ICAgICAgICAgICAgICBcbiIvLyAoMSswZCkgbXVsdGlwbHkgKHJldmVyc2VkKWJ5IGNvZWYKLSAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNiwgZDIwICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgbmVnIHNhbXBsZXMKLQotICAgICAgICAvLyBtb3ZpbmcgdGhlc2UgQVJNIGluc3RydWN0aW9ucyBiZWZvcmUgbmVvbiBhYm92ZSBzZWVtcyB0byBiZSBzbG93ZXIKLSAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzQgICBcbiIvLyAoMSkgdXBkYXRlIGxvb3AgY291bnRlcgotICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjOCAgICAgICAgXG4iLy8gbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKLQotICAgICAgICAvLyBzUCB1c2VkIGFmdGVyIGJyYW5jaCAod2FybmluZykKLSAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCi0KLSAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9NT05PCi0KLSAgICAgICAgOiBbb3V0XSAgICAgIj1VdiIgKG91dFswXSksCi0gICAgICAgICAgW2NvdW50XSAgICIrciIgKGNvdW50KSwKLSAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKLSAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKLSAgICAgICAgICBbY29lZnNQMV0gIityIiAoY29lZnNQMSksCi0gICAgICAgICAgW2NvZWZzTjFdICIrciIgKGNvZWZzTjEpLAotICAgICAgICAgIFtzUF0gICAgICAiK3IiIChzUCksCi0gICAgICAgICAgW3NOXSAgICAgICIrciIgKHNOKQotICAgICAgICA6IFtsZXJwUF0gICAiciIgKGxlcnBQKSwKLSAgICAgICAgICBbdkxSXSAgICAgInIiICh2b2x1bWVMUikKLSAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKLSAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAotICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIgotICAgICk7CisgICAgUHJvY2Vzc05lb25JbnRyaW5zaWM8MSwgMTYsIGZhbHNlPihvdXQsIGNvdW50LCBjb2Vmc1AsIGNvZWZzTiwgc1AsIHNOLCB2b2x1bWVMUiwKKyAgICAgICAgICAgIGxlcnBQLCBjb2Vmc1AxLCBjb2Vmc04xKTsKIH0KIAotdGVtcGxhdGUgPD4KLWlubGluZSB2b2lkIFByb2Nlc3M8MiwgOD4oaW50MzJfdCogY29uc3Qgb3V0LAordGVtcGxhdGU8PgoraW5saW5lIHZvaWQgUHJvY2VzczwyLCAxNj4oZmxvYXQqIGNvbnN0IG91dCwKICAgICAgICAgaW50IGNvdW50LAotICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc1AsCi0gICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzTiwKLSAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNQMSwKLSAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNOMSwKLSAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCi0gICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAotICAgICAgICB1aW50MzJfdCBsZXJwUCwKLSAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCisgICAgICAgIGNvbnN0IGZsb2F0KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGZsb2F0KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGZsb2F0KiBjb2Vmc1AxLAorICAgICAgICBjb25zdCBmbG9hdCogY29lZnNOMSwKKyAgICAgICAgY29uc3QgZmxvYXQqIHNQLAorICAgICAgICBjb25zdCBmbG9hdCogc04sCisgICAgICAgIGZsb2F0IGxlcnBQLAorICAgICAgICBjb25zdCBmbG9hdCogY29uc3Qgdm9sdW1lTFIpCiB7Ci0gICAgY29uc3QgaW50IENIQU5ORUxTID0gMjsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCi0gICAgY29uc3QgaW50IFNUUklERSA9IDg7Ci0gICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOwotICAgIGFzbSAoCi0gICAgICAgICJ2bW92LjMyICAgICAgICBkMlswXSwgJVtsZXJwUF0gICAgICAgICAgXG4iLy8gbG9hZCB0aGUgcG9zaXRpdmUgcGhhc2UKLSAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIvLyAoMSkgYWNjX0wgPSAwCi0gICAgICAgICJ2ZW9yICAgICAgICAgICBxNCwgcTQsIHE0ICAgICAgICAgICAgICAgXG4iLy8gKDAgY29tYmluZXMrKSBhY2NfUiA9IDAKLQotICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgICAgICJ2bGQyLjE2ICAgICAgICB7ZDQsIGQ1fSwgWyVbc1BdXSAgICAgICAgXG4iLy8gKDMrMGQpIGxvYWQgOCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCi0gICAgICAgICJ2bGQyLjE2ICAgICAgICB7ZDYsIGQ3fSwgWyVbc05dXSEgICAgICAgXG4iLy8gKDMpIGxvYWQgOCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCi0gICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDE2fSwgWyVbY29lZnNQMF06NjRdISAgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzCi0gICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDE3fSwgWyVbY29lZnNQMV06NjRdISAgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCi0gICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDIwfSwgWyVbY29lZnNOMV06NjRdISAgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzCi0gICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDIxfSwgWyVbY29lZnNOMF06NjRdISAgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCi0KLSAgICAgICAgInZzdWIuczE2ICAgICAgIGQxNywgZDE3LCBkMTYgICAgICAgICAgICBcbiIvLyAoMSkgaW50ZXJwb2xhdGUgKHN0ZXAxKSAxc3Qgc2V0IG9mIGNvZWZzCi0gICAgICAgICJ2c3ViLnMxNiAgICAgICBkMjEsIGQyMSwgZDIwICAgICAgICAgICAgXG4iLy8gKDEpIGludGVycG9sYXRlIChzdGVwMSkgMm5kIHNldCBvZiBjb2V0cwotCi0gICAgICAgICJ2cXJkbXVsaC5zMTYgICBkMTcsIGQxNywgZDJbMF0gICAgICAgICAgXG4iLy8gKDIpIGludGVycG9sYXRlIChzdGVwMikgMXN0IHNldCBvZiBjb2VmcwotICAgICAgICAidnFyZG11bGguczE2ICAgZDIxLCBkMjEsIGQyWzBdICAgICAgICAgIFxuIi8vICgyKSBpbnRlcnBvbGF0ZSAoc3RlcDIpIDJuZCBzZXQgb2YgY29lZnMKLQotICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgIFxuIi8vICgxKSByZXZlcnNlIDggZnJhbWVzIG9mIHRoZSBsZWZ0IHBvc2l0aXZlCi0KLSAgICAgICAgInZhZGQuczE2ICAgICAgIGQxNiwgZDE2LCBkMTcgICAgICAgICAgICBcbiIvLyAoMSsxZCkgaW50ZXJwb2xhdGUgKHN0ZXAzKSAxc3Qgc2V0Ci0gICAgICAgICJ2YWRkLnMxNiAgICAgICBkMjAsIGQyMCwgZDIxICAgICAgICAgICAgXG4iLy8gKDErMWQpIGludGVycG9sYXRlIChzdGVwMykgMm5kIHNldAotCi0gICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDQsIGQxNiAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IChyZXZlcnNlZCkgc2FtcGxlcyBsZWZ0Ci0gICAgICAgICJ2bWxhbC5zMTYgICAgICBxNCwgZDUsIGQxNiAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IChyZXZlcnNlZCkgc2FtcGxlcyByaWdodAotICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ2LCBkMjAgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSBzYW1wbGVzIGxlZnQKLSAgICAgICAgInZtbGFsLnMxNiAgICAgIHE0LCBkNywgZDIwICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgc2FtcGxlcyByaWdodAotCi0gICAgICAgIC8vIG1vdmluZyB0aGVzZSBBUk0gYmVmb3JlIG5lb24gc2VlbXMgdG8gYmUgc2xvd2VyCi0gICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM0ICAgXG4iLy8gKDEpIHVwZGF0ZSBsb29wIGNvdW50ZXIKLSAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzE2ICAgICAgICBcbiIvLyBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcwotCi0gICAgICAgIC8vIHNQIHVzZWQgYWZ0ZXIgYnJhbmNoICh3YXJuaW5nKQotICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKLQotICAgICAgICBBU1NFTUJMWV9BQ0NVTVVMQVRFX1NURVJFTwotCi0gICAgICAgIDogW291dF0gIj1VdiIgKG91dFswXSksCi0gICAgICAgICAgW2NvdW50XSAiK3IiIChjb3VudCksCi0gICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCi0gICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCi0gICAgICAgICAgW2NvZWZzUDFdICIrciIgKGNvZWZzUDEpLAotICAgICAgICAgIFtjb2Vmc04xXSAiK3IiIChjb2Vmc04xKSwKLSAgICAgICAgICBbc1BdICIrciIgKHNQKSwKLSAgICAgICAgICBbc05dICIrciIgKHNOKQotICAgICAgICA6IFtsZXJwUF0gICAiciIgKGxlcnBQKSwKLSAgICAgICAgICBbdkxSXSAiciIgKHZvbHVtZUxSKQotICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAotICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsCi0gICAgICAgICAgInE0IiwgInE1IiwgInE2IiwKLSAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIKLSAgICApOwotfQotCi10ZW1wbGF0ZSA8PgotaW5saW5lIHZvaWQgUHJvY2Vzc0w8MSwgOD4oaW50MzJfdCogY29uc3Qgb3V0LAotICAgICAgICBpbnQgY291bnQsCi0gICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzUCwKLSAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNOLAotICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKLSAgICAgICAgY29uc3QgaW50MTZfdCogc04sCi0gICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQotewotICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDE7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcwotICAgIGNvbnN0IGludCBTVFJJREUgPSA4OwotICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKLSAgICBhc20gKAotICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIi8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCi0KLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgICAgICAidmxkMS4xNiAgICAgICAge2Q0fSwgWyVbc1BdXSAgICAgICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIG1vbm8gc2FtcGxlcwotICAgICAgICAidmxkMS4xNiAgICAgICAge2Q2fSwgWyVbc05dXSEgICAgICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIG1vbm8gc2FtcGxlcwotICAgICAgICAidmxkMS4zMiAgICAgICAge3E4fSwgWyVbY29lZnNQMF06MTI4XSEgIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCi0gICAgICAgICJ2bGQxLjMyICAgICAgICB7cTEwfSwgWyVbY29lZnNOMF06MTI4XSEgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKLQotICAgICAgICAidnJldjY0LjE2ICAgICAgZDQsIGQ0ICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgMiBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKLQotICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCBkNCwgIzE1ICAgICAgICAgICAgIFxuIi8vIChzdGFsbCkgZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwotICAgICAgICAidnNobGwuczE2ICAgICAgcTE0LCBkNiwgIzE1ICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKLQotICAgICAgICAidnFyZG11bGguczMyICAgcTEyLCBxMTIsIHE4ICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCi0KLSAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEyICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAotICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTQgICAgICAgICAgICAgIFxuIi8vIChzdGFsbCkgYWNjdW11bGF0ZSByZXN1bHQKLQotICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjNCAgIFxuIi8vIHVwZGF0ZSBsb29wIGNvdW50ZXIKLSAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzggICAgICAgICBcbiIvLyBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcwotCi0gICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAotCi0gICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfTU9OTwotCi0gICAgICAgIDogW291dF0gIj1VdiIgKG91dFswXSksCi0gICAgICAgICAgW2NvdW50XSAiK3IiIChjb3VudCksCi0gICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCi0gICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCi0gICAgICAgICAgW3NQXSAiK3IiIChzUCksCi0gICAgICAgICAgW3NOXSAiK3IiIChzTikKLSAgICAgICAgOiBbdkxSXSAiciIgKHZvbHVtZUxSKQotICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAotICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsCi0gICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiLAotICAgICAgICAgICJxMTIiLCAicTE0IgotICAgICk7Ci19Ci0KLXRlbXBsYXRlIDw+Ci1pbmxpbmUgdm9pZCBQcm9jZXNzTDwyLCA4PihpbnQzMl90KiBjb25zdCBvdXQsCi0gICAgICAgIGludCBjb3VudCwKLSAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNQLAotICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc04sCi0gICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAotICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKLSAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCi17Ci0gICAgY29uc3QgaW50IENIQU5ORUxTID0gMjsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCi0gICAgY29uc3QgaW50IFNUUklERSA9IDg7Ci0gICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOwotICAgIGFzbSAoCi0gICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgXG4iLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKLSAgICAgICAgInZlb3IgICAgICAgICAgIHE0LCBxNCwgcTQgICAgICAgICAgICAgICBcbiIvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAotCi0gICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAgICAgInZsZDIuMTYgICAgICAgIHtkNCwgZDV9LCBbJVtzUF1dICAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBzdGVyZW8gc2FtcGxlcwotICAgICAgICAidmxkMi4xNiAgICAgICAge2Q2LCBkN30sIFslW3NOXV0hICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCi0gICAgICAgICJ2bGQxLjMyICAgICAgICB7cTh9LCBbJVtjb2Vmc1AwXToxMjhdISAgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKLSAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTB9LCBbJVtjb2Vmc04wXToxMjhdISBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcwotCi0gICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgXG4iLy8gcmV2ZXJzZSAyIGZyYW1lcyBvZiB0aGUgcG9zaXRpdmUgc2lkZQotCi0gICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTIsIGQ0LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwotICAgICAgICAidnNobGwuczE2ICAgICAgcTEzLCBkNSwgIzE1ICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKLQotICAgICAgICAidnNobGwuczE2ICAgICAgcTE0LCBkNiwgIzE1ICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKLSAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNSwgZDcsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCi0KLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOCAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGNvZWYKLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMywgcTEzLCBxOCAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGNvZWYKLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGNvZWYKLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNSwgcTE1LCBxMTAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGNvZWYKLQotICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTIgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0Ci0gICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExMyAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKLSAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTE0ICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAotICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTUgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0Ci0KLSAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzQgICBcbiIvLyB1cGRhdGUgbG9vcCBjb3VudGVyCi0gICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICMxNiAgICAgICAgXG4iLy8gbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKLQotICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKLQotICAgICAgICBBU1NFTUJMWV9BQ0NVTVVMQVRFX1NURVJFTwotCi0gICAgICAgIDogW291dF0gICAgICI9VXYiIChvdXRbMF0pLAotICAgICAgICAgIFtjb3VudF0gICAiK3IiIChjb3VudCksCi0gICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCi0gICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCi0gICAgICAgICAgW3NQXSAgICAgICIrciIgKHNQKSwKLSAgICAgICAgICBbc05dICAgICAgIityIiAoc04pCi0gICAgICAgIDogW3ZMUl0gICAgICJyIiAodm9sdW1lTFIpCi0gICAgICAgIDogImNjIiwgIm1lbW9yeSIsCi0gICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwgInE0IiwKLSAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIsCi0gICAgICAgICAgInExMiIsICJxMTMiLCAicTE0IiwgInExNSIKLSAgICApOwotfQotCi10ZW1wbGF0ZSA8PgotaW5saW5lIHZvaWQgUHJvY2VzczwxLCA4PihpbnQzMl90KiBjb25zdCBvdXQsCi0gICAgICAgIGludCBjb3VudCwKLSAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNQLAotICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc04sCi0gICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzUDEsCi0gICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzTjEsCi0gICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAotICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKLSAgICAgICAgdWludDMyX3QgbGVycFAsCi0gICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQotewotICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDE7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcwotICAgIGNvbnN0IGludCBTVFJJREUgPSA4OwotICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKLSAgICBhc20gKAotICAgICAgICAidm1vdi4zMiAgICAgICAgZDJbMF0sICVbbGVycFBdICAgICAgICAgIFxuIi8vIGxvYWQgdGhlIHBvc2l0aXZlIHBoYXNlCi0gICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgXG4iLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKLQotICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDR9LCBbJVtzUF1dICAgICAgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgbW9ubyBzYW1wbGVzCi0gICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDZ9LCBbJVtzTl1dISAgICAgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgbW9ubyBzYW1wbGVzCi0gICAgICAgICJ2bGQxLjMyICAgICAgICB7cTh9LCBbJVtjb2Vmc1AwXToxMjhdISAgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKLSAgICAgICAgInZsZDEuMzIgICAgICAgIHtxOX0sIFslW2NvZWZzUDFdOjEyOF0hICBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgotICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMH0sIFslW2NvZWZzTjFdOjEyOF0hIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCi0gICAgICAgICJ2bGQxLjMyICAgICAgICB7cTExfSwgWyVbY29lZnNOMF06MTI4XSEgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KLQotICAgICAgICAidnJldjY0LjE2ICAgICAgZDQsIGQ0ICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgMiBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKLQotICAgICAgICAidnN1Yi5zMzIgICAgICAgcTksIHE5LCBxOCAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMSkgMXN0IHNldCBvZiBjb2VmcwotICAgICAgICAidnN1Yi5zMzIgICAgICAgcTExLCBxMTEsIHExMCAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMSkgMm5kIHNldCBvZiBjb2V0cwotICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCBkNCwgIzE1ICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKLQotICAgICAgICAidnFyZG11bGguczMyICAgcTksIHE5LCBkMlswXSAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMikgMXN0IHNldCBvZiBjb2VmcwotICAgICAgICAidnFyZG11bGguczMyICAgcTExLCBxMTEsIGQyWzBdICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMikgMm5kIHNldCBvZiBjb2VmcwotICAgICAgICAidnNobGwuczE2ICAgICAgcTE0LCBkNiwgIzE1ICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKLQotICAgICAgICAidmFkZC5zMzIgICAgICAgcTgsIHE4LCBxOSAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMykgMXN0IHNldAotICAgICAgICAidmFkZC5zMzIgICAgICAgcTEwLCBxMTAsIHExMSAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwNCkgMm5kIHNldAotCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTggICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotICAgICAgICAidnFyZG11bGguczMyICAgcTE0LCBxMTQsIHExMCAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLQotICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTIgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0Ci0gICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExNCAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKLQotICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjNCAgIFxuIi8vIHVwZGF0ZSBsb29wIGNvdW50ZXIKLSAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzggICAgICAgICBcbiIvLyBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcwotCi0gICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAotCi0gICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfTU9OTwotCi0gICAgICAgIDogW291dF0gICAgICI9VXYiIChvdXRbMF0pLAotICAgICAgICAgIFtjb3VudF0gICAiK3IiIChjb3VudCksCi0gICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCi0gICAgICAgICAgW2NvZWZzUDFdICIrciIgKGNvZWZzUDEpLAotICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAotICAgICAgICAgIFtjb2Vmc04xXSAiK3IiIChjb2Vmc04xKSwKLSAgICAgICAgICBbc1BdICAgICAgIityIiAoc1ApLAotICAgICAgICAgIFtzTl0gICAgICAiK3IiIChzTikKLSAgICAgICAgOiBbbGVycFBdICAgInIiIChsZXJwUCksCi0gICAgICAgICAgW3ZMUl0gICAgICJyIiAodm9sdW1lTFIpCi0gICAgICAgIDogImNjIiwgIm1lbW9yeSIsCi0gICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKLSAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIsCi0gICAgICAgICAgInExMiIsICJxMTQiCi0gICAgKTsKLX0KLQotdGVtcGxhdGUgPD4KLWlubGluZQotdm9pZCBQcm9jZXNzPDIsIDg+KGludDMyX3QqIGNvbnN0IG91dCwKLSAgICAgICAgaW50IGNvdW50LAotICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc1AsCi0gICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzTiwKLSAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNQMSwKLSAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNOMSwKLSAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCi0gICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAotICAgICAgICB1aW50MzJfdCBsZXJwUCwKLSAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCi17Ci0gICAgY29uc3QgaW50IENIQU5ORUxTID0gMjsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCi0gICAgY29uc3QgaW50IFNUUklERSA9IDg7Ci0gICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOwotICAgIGFzbSAoCi0gICAgICAgICJ2bW92LjMyICAgICAgICBkMlswXSwgJVtsZXJwUF0gICAgICAgICAgXG4iLy8gbG9hZCB0aGUgcG9zaXRpdmUgcGhhc2UKLSAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAotICAgICAgICAidmVvciAgICAgICAgICAgcTQsIHE0LCBxNCAgICAgICAgICAgICAgIFxuIi8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCi0KLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAgICAgInZsZDIuMTYgICAgICAgIHtkNCwgZDV9LCBbJVtzUF1dICAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBzdGVyZW8gc2FtcGxlcwotICAgICAgICAidmxkMi4xNiAgICAgICAge2Q2LCBkN30sIFslW3NOXV0hICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCi0gICAgICAgICJ2bGQxLjMyICAgICAgICB7cTh9LCBbJVtjb2Vmc1AwXToxMjhdISAgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKLSAgICAgICAgInZsZDEuMzIgICAgICAgIHtxOX0sIFslW2NvZWZzUDFdOjEyOF0hICBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgotICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMH0sIFslW2NvZWZzTjFdOjEyOF0hIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCi0gICAgICAgICJ2bGQxLjMyICAgICAgICB7cTExfSwgWyVbY29lZnNOMF06MTI4XSEgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KLQotICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgIFxuIi8vIChyZXZlcnNlZCkgMiBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKLQotICAgICAgICAidnN1Yi5zMzIgICAgICAgcTksIHE5LCBxOCAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMSkgMXN0IHNldCBvZiBjb2VmcwotICAgICAgICAidnN1Yi5zMzIgICAgICAgcTExLCBxMTEsIHExMCAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMSkgMm5kIHNldCBvZiBjb2V0cwotICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCBkNCwgIzE1ICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKLSAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMywgZDUsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCi0KLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHE5LCBxOSwgZDJbMF0gICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDIpIDFzdCBzZXQgb2YgY29lZnMKLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMSwgcTExLCBkMlsxXSAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpIDJuZCBzZXQgb2YgY29lZnMKLSAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNCwgZDYsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCi0gICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTUsIGQ3LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwotCi0gICAgICAgICJ2YWRkLnMzMiAgICAgICBxOCwgcTgsIHE5ICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKSAxc3Qgc2V0Ci0gICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTAsIHExMCwgcTExICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXA0KSAybmQgc2V0Ci0KLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOCAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTMsIHExMywgcTggICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotICAgICAgICAidnFyZG11bGguczMyICAgcTE0LCBxMTQsIHExMCAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNSwgcTE1LCBxMTAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCi0KLSAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEyICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAotICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTMgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0Ci0gICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExNCAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKLSAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTE1ICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAotCi0gICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM0ICAgXG4iLy8gdXBkYXRlIGxvb3AgY291bnRlcgotICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjMTYgICAgICAgIFxuIi8vIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCi0KLSAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCi0KLSAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9TVEVSRU8KLQotICAgICAgICA6IFtvdXRdICAgICAiPVV2IiAob3V0WzBdKSwKLSAgICAgICAgICBbY291bnRdICAgIityIiAoY291bnQpLAotICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAotICAgICAgICAgIFtjb2Vmc1AxXSAiK3IiIChjb2Vmc1AxKSwKLSAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKLSAgICAgICAgICBbY29lZnNOMV0gIityIiAoY29lZnNOMSksCi0gICAgICAgICAgW3NQXSAgICAgICIrciIgKHNQKSwKLSAgICAgICAgICBbc05dICAgICAgIityIiAoc04pCi0gICAgICAgIDogW2xlcnBQXSAgICJyIiAobGVycFApLAotICAgICAgICAgIFt2TFJdICAgICAiciIgKHZvbHVtZUxSKQotICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAotICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsICJxNCIsCi0gICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiLAotICAgICAgICAgICJxMTIiLCAicTEzIiwgInExNCIsICJxMTUiCi0gICAgKTsKKyAgICBQcm9jZXNzTmVvbkludHJpbnNpYzwyLCAxNiwgZmFsc2U+KG91dCwgY291bnQsIGNvZWZzUCwgY29lZnNOLCBzUCwgc04sIHZvbHVtZUxSLAorICAgICAgICAgICAgbGVycFAsIGNvZWZzUDEsIGNvZWZzTjEpOwogfQogCiAjZW5kaWYgLy9VU0VfTkVPTgogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLypBTkRST0lEX0FVRElPX1JFU0FNUExFUl9GSVJfUFJPQ0VTU19ORU9OX0gqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcAppbmRleCBlNmZiNzZjLi40MTczMGVlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcApAQCAtNjEsMTM1ICs2MSw3IEBACiAgKiBjbWQtbGluZTogZmlyIC1sIDcgLXMgNDgwMDAgLWMgMjA0NzgKICAqLwogY29uc3QgdWludDMyX3QgQXVkaW9SZXNhbXBsZXJTaW5jOjptRmlyQ29lZnNVcFtdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICgzMikpKSA9IHsKLSAgICAgICAgMHg2ZDM3NGJjNywgMHgxMTFjNmJhMCwgMHhmMzI0MGU2MSwgMHgwN2QxNGEzOCwgMHhmYzUwOWU2NCwgMHgwMTM5Y2VlOSwgMHhmZmM4Yzg2NiwgMHhmZmZjYzMwMCwKLSAgICAgICAgMHg2ZDM1Mjc4YSwgMHgxMDNlODE5MiwgMHhmMzZiOWRmZCwgMHgwN2JkZmFhNSwgMHhmYzUxMDJkMCwgMHgwMTNkNjE4ZCwgMHhmZmM2NjNiOSwgMHhmZmZkOTU5MiwKLSAgICAgICAgMHg2ZDJlYmFmZSwgMHgwZjYyODExYSwgMHhmM2IzZDhhYywgMHgwN2E5ZjM5OSwgMHhmYzUxZDlhNiwgMHgwMTQwYmVhNSwgMHhmZmM0MTIxMiwgMHhmZmZlNjMxZSwKLSAgICAgICAgMHg2ZDI0MDY5ZCwgMHgwZTg4NzVhZCwgMHhmM2ZjYjQzZSwgMHgwNzk1Mzk3NiwgMHhmYzUzMjE2ZiwgMHgwMTQzZTY3YywgMHhmZmMxZDM3MywgMHhmZmZmMmI5ZiwKLSAgICAgICAgMHg2ZDE1MGIzNSwgMHgwZGIwNmE4OSwgMHhmNDQ2MjY5MCwgMHgwNzdmZDBhYywgMHhmYzU0ZDhhZSwgMHgwMTQ2ZDk2NSwgMHhmZmJmYTdkOSwgMHhmZmZmZWYxMCwKLSAgICAgICAgMHg2ZDAxYzllMywgMHgwY2RhNmFiNSwgMHhmNDkwMjU4NywgMHgwNzY5YmRhZiwgMHhmYzU2ZmRkYSwgMHgwMTQ5OTdiYiwgMHhmZmJkOGY0MCwgMHgwMDAwYWQ2ZSwKLSAgICAgICAgMHg2Y2VhNDQxOCwgMHgwYzA2ODBmZSwgMHhmNGRhYTcxOCwgMHgwNzUzMDUwMSwgMHhmYzU5OGY2MCwgMHgwMTRjMjFkYiwgMHhmZmJiODlhMSwgMHgwMDAxNjZiNiwKLSAgICAgICAgMHg2Y2NlN2I5NywgMHgwYjM0YjdmNSwgMHhmNTI1YTE0MywgMHgwNzNiYWIyOCwgMHhmYzVjOGJhNSwgMHgwMTRlNzgyYSwgMHhmZmI5OTZmMywgMHgwMDAyMWFlNSwKLSAgICAgICAgMHg2Y2FlNzI3MiwgMHgwYTY1MTlmNCwgMHhmNTcxMGExNywgMHgwNzIzYjRiNCwgMHhmYzVmZjEwNSwgMHgwMTUwOWIxNCwgMHhmZmI3YjcyOCwgMHgwMDAyYzlmZCwKLSAgICAgICAgMHg2YzhhMmIwZiwgMHgwOTk3YjExNiwgMHhmNWJjZDdiMSwgMHgwNzBiMjYzOSwgMHhmYzYzYmRkMywgMHgwMTUyOGIwOCwgMHhmZmI1ZWEzMSwgMHgwMDAzNzNmYiwKLSAgICAgICAgMHg2YzYxYTgyMywgMHgwOGNjODczYywgMHhmNjA5MDAzZiwgMHgwNmYyMDQ1MywgMHhmYzY3ZjA1YSwgMHgwMTU0NDg3YiwgMHhmZmI0MmZmYywgMHgwMDA0MThlMiwKLSAgICAgICAgMHg2YzM0ZWNiNSwgMHgwODAzYTYwYSwgMHhmNjU1N2EwMCwgMHgwNmQ4NTNhMiwgMHhmYzZjODZkZCwgMHgwMTU1ZDNlOCwgMHhmZmIyODg3NiwgMHgwMDA0YjhiMywKLSAgICAgICAgMHg2YzAzZmMxYywgMHgwNzNkMTZlNywgMHhmNmEyM2I0NCwgMHgwNmJlMThjZCwgMHhmYzcxN2Y5NywgMHgwMTU3MmRjZiwgMHhmZmIwZjM4OCwgMHgwMDA1NTM3MSwKLSAgICAgICAgMHg2YmNlZDlmZiwgMHgwNjc4ZTJmYywgMHhmNmVmM2E2ZSwgMHgwNmEzNTg3ZSwgMHhmYzc2ZDhiYywgMHgwMTU4NTZiNiwgMHhmZmFmNzExOCwgMHgwMDA1ZTkyMSwKLSAgICAgICAgMHg2Yjk1OGE1NCwgMHgwNWI3MTMzMiwgMHhmNzNjNmRmNCwgMHgwNjg4MTc2MSwgMHhmYzdjOTA3OSwgMHgwMTU5NGYyNSwgMHhmZmFlMDEwYiwgMHgwMDA2NzljNSwKLSAgICAgICAgMHg2YjU4MTE2MywgMHgwNGY3YjAzNywgMHhmNzg5Y2M2MSwgMHgwNjZjNWEyNywgMHhmYzgyYTRmNCwgMHgwMTVhMTdhYiwgMHhmZmFjYTM0NCwgMHgwMDA3MDU2NCwKLSAgICAgICAgMHg2YjE2NzNjMSwgMHgwNDNhYzI3NiwgMHhmN2Q3NGM1MywgMHgwNjUwMjU4MywgMHhmYzg5MTQ0ZCwgMHgwMTVhYjBkYiwgMHhmZmFiNTdhMSwgMHgwMDA3OGMwNCwKLSAgICAgICAgMHg2YWQwYjY1MiwgMHgwMzgwNTIxYywgMHhmODI0ZTQ4MCwgMHgwNjMzN2UyYSwgMHhmYzhmZGM5ZiwgMHgwMTViMWI0ZSwgMHhmZmFhMWUwMiwgMHgwMDA4MGRhYiwKLSAgICAgICAgMHg2YTg2ZGU0OCwgMHgwMmM4NjcxNSwgMHhmODcyOGJiMywgMHgwNjE2NjhkMiwgMHhmYzk2ZmJmYywgMHgwMTViNTc5ZSwgMHhmZmE4ZjY0MSwgMHgwMDA4OGE2MiwKLSAgICAgICAgMHg2YTM4ZjEyMywgMHgwMjEzMDkwYywgMHhmOGMwMzhkMCwgMHgwNWY4ZWEzMCwgMHhmYzllNzA3NCwgMHgwMTViNjY2YywgMHhmZmE3ZTAzOSwgMHgwMDA5MDIzMCwKLSAgICAgICAgMHg2OWU2ZjRiMSwgMHgwMTYwM2Y2ZSwgMHhmOTBkZTJkMSwgMHgwNWRiMDZmYywgMHhmY2E2MzgxMCwgMHgwMTViNDg1YiwgMHhmZmE2ZGJjMCwgMHgwMDA5NzUxZSwKLSAgICAgICAgMHg2OTkwZWYwYiwgMHgwMGIwMTE2MiwgMHhmOTViODBjYiwgMHgwNWJjYzNlZCwgMHhmY2FlNTBkNiwgMHgwMTVhZmUxNCwgMHhmZmE1ZThhZCwgMHgwMDA5ZTMzNywKLSAgICAgICAgMHg2OTM2ZTY5NywgMHgwMDAyODVkMCwgMHhmOWE5MDllYSwgMHgwNTllMjViNSwgMHhmY2I2YjhjNCwgMHgwMTVhODg0MywgMHhmZmE1MDZkMiwgMHgwMDBhNGM4NSwKLSAgICAgICAgMHg2OGQ4ZTIwNiwgMHhmZjU3YTM1ZSwgMHhmOWY2NzU3NywgMHgwNTdmMzEwYSwgMHhmY2JmNmRkOCwgMHgwMTU5ZTc5NiwgMHhmZmE0MzYwMywgMHgwMDBhYjExMiwKLSAgICAgICAgMHg2ODc2ZTg1NSwgMHhmZWFmNzA2ZiwgMHhmYTQzYmFkMiwgMHgwNTVmZWE5ZCwgMHhmY2M4NmUwOSwgMHgwMTU5MWNjMCwgMHhmZmEzNzYwZSwgMHgwMDBiMTBlYywKLSAgICAgICAgMHg2ODExMDBjOSwgMHhmZTA5ZjMyMywgMHhmYTkwZDE3YiwgMHgwNTQwNTcxYSwgMHhmY2QxYjc0YywgMHgwMTU4Mjg3OCwgMHhmZmEyYzZjMiwgMHgwMDBiNmMxZCwKLSAgICAgICAgMHg2N2E3MzJmNCwgMHhmZDY3MzE1OSwgMHhmYWRkYjEwYywgMHgwNTIwN2IyZiwgMHhmY2RiNDc5MywgMHgwMTU3MGI3NywgMHhmZmEyMjdlYywgMHgwMDBiYzJiMywKLSAgICAgICAgMHg2NzM5ODZhYywgMHhmY2M3MzBhYSwgMHhmYjJhNTEzYiwgMHgwNTAwNWI4MiwgMHhmY2U1MWNjYiwgMHgwMTU1YzY3OCwgMHhmZmExOTk1NywgMHgwMDBjMTRiYiwKLSAgICAgICAgMHg2NmM4MDQxMywgMHhmYzI5ZjY3MCwgMHhmYjc2YTlkZCwgMHgwNGRmZmNiNiwgMHhmY2VmMzRlMSwgMHgwMTU0NWEzYywgMHhmZmExMWFjYiwgMHgwMDBjNjI0NCwKLSAgICAgICAgMHg2NjUyYjM5MiwgMHhmYjhmODdiZCwgMHhmYmMyYjJlNCwgMHgwNGJmNjM2OSwgMHhmY2Y5OGRiZSwgMHgwMTUyYzc4MywgMHhmZmEwYWMxMSwgMHgwMDBjYWI1YywKLSAgICAgICAgMHg2NWQ5OWRkNSwgMHhmYWY3ZTk2MywgMHhmYzBlNjQ2MSwgMHgwNDllOTQzMywgMHhmZDA0MjU0YSwgMHgwMTUxMGYxMywgMHhmZmEwNGNmMCwgMHgwMDBjZjAxMiwKLSAgICAgICAgMHg2NTVjY2JkMywgMHhmYTYzMWZlZiwgMHhmYzU5YjY4NSwgMHgwNDdkOTNhOCwgMHhmZDBlZjk2OSwgMHgwMTRmMzFiMiwgMHhmZjlmZmQyYywgMHgwMDBkMzA3NSwKLSAgICAgICAgMHg2NGRjNDZjMywgMHhmOWQxMmZhYiwgMHhmY2E0YTE5ZiwgMHgwNDVjNjY1NCwgMHhmZDFhMDgwMSwgMHgwMTRkMzAyOSwgMHhmZjlmYmM4OSwgMHgwMDBkNmM5NywKLSAgICAgICAgMHg2NDU4MTgyMywgMHhmOTQyMWM5ZCwgMHhmY2VmMWUyMCwgMHgwNDNiMTBiZCwgMHhmZDI1NGVmNCwgMHgwMTRiMGI0NSwgMHhmZjlmOGFjOSwgMHgwMDBkYTQ4NiwKLSAgICAgICAgMHg2M2QwNDliNCwgMHhmOGI1ZWE4NywgMHhmZDM5MjQ5OCwgMHgwNDE5OTc2MCwgMHhmZDMwY2MyNCwgMHgwMTQ4YzNkMiwgMHhmZjlmNjdhZSwgMHgwMDBkZDg1NCwKLSAgICAgICAgMHg2MzQ0ZTU3OCwgMHhmODJjOWNlNywgMHhmZDgyYWRiYSwgMHgwM2Y3ZmViNCwgMHhmZDNjN2Q3MywgMHgwMTQ2NWE5ZiwgMHhmZjlmNTJmNywgMHgwMDBlMDgxMiwKLSAgICAgICAgMHg2MmI1ZjViMiwgMHhmN2E2MzZmYSwgMHhmZGNiYjI1YSwgMHgwM2Q2NGIyNywgMHhmZDQ4NjBjMiwgMHgwMTQzZDA3ZiwgMHhmZjlmNGM2NSwgMHgwMDBlMzNkMywKLSAgICAgICAgMHg2MjIzODRlOCwgMHhmNzIyYmJiNSwgMHhmZTE0MmI2ZSwgMHgwM2I0ODExZCwgMHhmZDU0NzNmMywgMHgwMTQxMjY0MywgMHhmZjlmNTNiNCwgMHgwMDBlNWJhNywKLSAgICAgICAgMHg2MThkOWRkYywgMHhmNmEyMmRjZiwgMHhmZTVjMTIwZiwgMHgwMzkyYTRmNCwgMHhmZDYwYjRlNywgMHgwMTNlNWNjMCwgMHhmZjlmNjhhMSwgMHgwMDBlN2ZhMSwKLSAgICAgICAgMHg2MGY0NGI5MSwgMHhmNjI0OGZiNiwgMHhmZWEzNWY3OSwgMHgwMzcwYmFmYywgMHhmZDZkMjE4MCwgMHgwMTNiNzRjYSwgMHhmZjlmOGFlOSwgMHgwMDBlOWZkNSwKLSAgICAgICAgMHg2MDU3OTk0NywgMHhmNWE5ZTM5OCwgMHhmZWVhMGQwYywgMHgwMzRlYzc3ZiwgMHhmZDc5YjdhMSwgMHgwMTM4NmYzYSwgMHhmZjlmYmE0NywgMHgwMDBlYmM1NCwKLSAgICAgICAgMHg1ZmI3OTI3OCwgMHhmNTMyMmI2MSwgMHhmZjMwMTQ0YSwgMHgwMzJjY2ViYiwgMHhmZDg2NzUyZSwgMHgwMTM1NGNlNywgMHhmZjlmZjY3NCwgMHgwMDBlZDUzMywKLSAgICAgICAgMHg1ZjE0NDJkYywgMHhmNGJkNjhiNiwgMHhmZjc1NmVkYywgMHgwMzBhZDRlMSwgMHhmZDkzNTgwZCwgMHgwMTMyMGVhOSwgMHhmZmEwM2YyYiwgMHgwMDBlZWE4NCwKLSAgICAgICAgMHg1ZTZkYjY2NSwgMHhmNDRiOWNmZSwgMHhmZmJhMTY4ZCwgMHgwMmU4ZGUxOSwgMHhmZGEwNWUyMywgMHgwMTJlYjU1YSwgMHhmZmEwOTQyNSwgMHgwMDBlZmM1YywKLSAgICAgICAgMHg1ZGMzZjkzYywgMHhmM2RjYzk1OSwgMHhmZmZlMDU0ZSwgMHgwMmM2ZWU3ZiwgMHhmZGFkODU1YiwgMHgwMTJiNDFkMywgMHhmZmEwZjUxOSwgMHgwMDBmMGFjZSwKLSAgICAgICAgMHg1ZDE3MTdjNCwgMHhmMzcwZWVhOSwgMHgwMDQxMzUzNiwgMHgwMmE1MGEyMiwgMHhmZGJhY2I5ZSwgMHgwMTI3YjRmMSwgMHhmZmExNjFiZiwgMHgwMDBmMTVlZiwKLSAgICAgICAgMHg1YzY3MWU5NiwgMHhmMzA4MGQ4YywgMHgwMDgzYTA4MSwgMHgwMjgzMzUwNiwgMHhmZGM4MmVkYiwgMHgwMTI0MGY4ZSwgMHhmZmExZDljZiwgMHgwMDBmMWRkMiwKLSAgICAgICAgMHg1YmI0MWE4MCwgMHhmMmEyMjY1ZSwgMHgwMGM1NDE5MCwgMHgwMjYxNzMyMSwgMHhmZGQ1YWQwMSwgMHgwMTIwNTI4NSwgMHhmZmEyNWNmZSwgMHgwMDBmMjI4ZCwKLSAgICAgICAgMHg1YWZlMTg4NiwgMHhmMjNmMzkzYiwgMHgwMTA2MTJlYiwgMHgwMjNmYzg1YywgMHhmZGUzNDQwMywgMHgwMTFjN2ViMiwgMHhmZmEyZWIwNCwgMHgwMDBmMjQzNCwKLSAgICAgICAgMHg1YTQ1MjVkZiwgMHhmMWRmNDVmZCwgMHgwMTQ2MGY0MSwgMHgwMjFlMzg5MSwgMHhmZGYwZjFkNiwgMHgwMTE4OTRmMCwgMHhmZmEzODM5NSwgMHgwMDBmMjJkYywKLSAgICAgICAgMHg1OTg5NGZmMywgMHhmMTgyNGMzZSwgMHgwMTg1MzE2NSwgMHgwMWZjYzc4ZiwgMHhmZGZlYjQ3NSwgMHgwMTE0OTYxYiwgMHhmZmE0MjY2OCwgMHgwMDBmMWU5OSwKLSAgICAgICAgMHg1OGNhYTQ1YiwgMHhmMTI4NGI1OCwgMHgwMWMzNzQ1MiwgMHgwMWRiNzkxNCwgMHhmZTBjODlkYiwgMHgwMTEwODMwZiwgMHhmZmE0ZDMzMiwgMHgwMDBmMTc4MSwKLSAgICAgICAgMHg1ODA5MzBlMSwgMHhmMGQxNDI2NywgMHgwMjAwZDMyYywgMHgwMWJhNTBkMiwgMHhmZTFhNzAwOSwgMHgwMTBjNWNhNiwgMHhmZmE1ODlhNiwgMHgwMDBmMGRhOCwKLSAgICAgICAgMHg1NzQ1MDM3YywgMHhmMDdkMzA0MywgMHgwMjNkNDkzYywgMHgwMTk5NTI2YiwgMHhmZTI4NjUwNSwgMHgwMTA4MjNiYSwgMHhmZmE2NDk3YywgMHgwMDBmMDEyNSwKLSAgICAgICAgMHg1NjdlMmE1MSwgMHhmMDJjMTM4YSwgMHgwMjc4ZDFmMiwgMHgwMTc4ODE3MCwgMHhmZTM2NjZkNSwgMHgwMTAzZDkyNywgMHhmZmE3MTI2NiwgMHgwMDBlZjIwYiwKLSAgICAgICAgMHg1NWI0YjNhZiwgMHhlZmRkZWE5YSwgMHgwMmIzNjhlNiwgMHgwMTU3ZTE2NiwgMHhmZTQ0NzM4OSwgMHgwMGZmN2RjNCwgMHhmZmE3ZTQxYSwgMHgwMDBlZTA3MCwKLSAgICAgICAgMHg1NGU4YWUxMywgMHhlZjkyYjM5MywgMHgwMmVkMDlkNywgMHgwMTM3NzViZiwgMHhmZTUyODkzMSwgMHgwMGZiMTI2YiwgMHhmZmE4YmU0YywgMHgwMDBlY2M2OSwKLSAgICAgICAgMHg1NDFhMjgxZSwgMHhlZjRhNmM1OCwgMHgwMzI1YjBhZCwgMHgwMTE3NDFkZiwgMHhmZTYwYTVlNSwgMHgwMGY2OTdmMywgMHhmZmE5YTBiMSwgMHgwMDBlYjYwYiwKLSAgICAgICAgMHg1MzQ5MzA5ZSwgMHhlZjA1MTI5MCwgMHgwMzVkNTk3NywgMHgwMGY3NDkxYSwgMHhmZTZlYzdjMCwgMHgwMGYyMGYzMiwgMHhmZmFhOGFmZSwgMHgwMDBlOWQ2YiwKLSAgICAgICAgMHg1Mjc1ZDY4NCwgMHhlZWMyYTNhMywgMHgwMzk0MDA2YSwgMHgwMGQ3OGViMywgMHhmZTdjZWNlMiwgMHgwMGVkNzhmZiwgMHhmZmFiN2NlNywgMHgwMDBlODI5ZSwKLSAgICAgICAgMHg1MWEwMjhlOCwgMHhlZTgzMWNjMywgMHgwM2M5YTFlNSwgMHgwMGI4MTVkYSwgMHhmZThiMTM3MywgMHgwMGU4ZDYyZCwgMHhmZmFjNzYyMSwgMHgwMDBlNjViYSwKLSAgICAgICAgMHg1MGM4MzcwNCwgMHhlZTQ2N2FlMSwgMHgwM2ZlM2E2ZiwgMHgwMDk4ZTFiMywgMHhmZTk5Mzk5ZiwgMHgwMGU0Mjc4ZiwgMHhmZmFkNzY2MiwgMHgwMDBlNDZkMywKLSAgICAgICAgMHg0ZmVlMTAzNywgMHhlZTBjYmFiOSwgMHgwNDMxYzZiNSwgMHgwMDc5ZjU0YywgMHhmZWE3NWQ5NywgMHgwMGRmNmRmNywgMHhmZmFlN2Q1ZiwgMHgwMDBlMjVmZCwKLSAgICAgICAgMHg0ZjExYzNmZSwgMHhlZGQ1ZDhjYSwgMHgwNDY0NDM4YywgMHgwMDViNTNhNCwgMHhmZWI1N2Q5MiwgMHgwMGRhYWEzNCwgMHhmZmFmOGFjZCwgMHgwMDBlMDM0ZiwKLSAgICAgICAgMHg0ZTMzNjFmNywgMHhlZGExZDE1YywgMHgwNDk1YWRmMiwgMHgwMDNjZmZhOSwgMHhmZWMzOTdjZiwgMHgwMGQ1ZGQxNiwgMHhmZmIwOWU2MywgMHgwMDBkZGVkYiwKLSAgICAgICAgMHg0ZDUyZjlkZiwgMHhlZDcwYTA3ZCwgMHgwNGM2MDMwZCwgMHgwMDFlZmMzNSwgMHhmZWQxYWE5MiwgMHgwMGQxMDc2OSwgMHhmZmIxYjdkOCwgMHgwMDBkYjhiNywKLSAgICAgICAgMHg0YzcwOWI4ZSwgMHhlZDQyNDIwNSwgMHgwNGY1NDAyOSwgMHgwMDAxNGMxMiwgMHhmZWRmYjQyNSwgMHgwMGNjMjlmNywgMHhmZmIyZDZlMSwgMHgwMDBkOTBmNiwKLSAgICAgICAgMHg0YjhjNTZmOCwgMHhlZDE2YjE5NiwgMHgwNTIzNjJiYSwgMHhmZmUzZjFmNywgMHhmZWVkYjJkYSwgMHgwMGM3NDU4YSwgMHhmZmIzZmIzNywgMHgwMDBkNjdhZSwKLSAgICAgICAgMHg0YWE2M2MyYywgMHhlY2VkZWE5OSwgMHgwNTUwNjg1ZCwgMHhmZmM2ZjA4YSwgMHhmZWZiYTUwOCwgMHgwMGMyNWFlOCwgMHhmZmI1MjQ5MCwgMHgwMDBkM2NmMSwKLSAgICAgICAgMHg0OWJlNWI1MCwgMHhlY2M3ZTg0NSwgMHgwNTdjNGVkNCwgMHhmZmFhNGE1ZCwgMHhmZjA5ODkwZiwgMHgwMGJkNmFkNywgMHhmZmI2NTJhNywgMHgwMDBkMTBkNSwKLSAgICAgICAgMHg0OGQ0YzRhMiwgMHhlY2E0YTU5YiwgMHgwNWE3MTQwYiwgMHhmZjhlMDFmMSwgMHhmZjE3NWQ1MywgMHgwMGI4NzYxOSwgMHhmZmI3ODUzMywgMHgwMDBjZTM2YiwKLSAgICAgICAgMHg0N2U5ODg3NCwgMHhlYzg0MWQ2OCwgMHgwNWQwYjYxMiwgMHhmZjcyMTliMywgMHhmZjI1MjA0MiwgMHgwMGIzN2Q3MCwgMHhmZmI4YmJlZCwgMHgwMDBjYjRjOCwKLSAgICAgICAgMHg0NmZjYjcyZCwgMHhlYzY2NGE0OCwgMHgwNWY5MzMyNCwgMHhmZjU2OTNmZSwgMHhmZjMyZDA0ZiwgMHgwMGFlODE5OCwgMHhmZmI5ZjY5MSwgMHgwMDBjODRmZiwKLSAgICAgICAgMHg0NjBlNjE0OCwgMHhlYzRiMjZhMiwgMHgwNjIwODk5ZSwgMHhmZjNiNzMxYiwgMHhmZjQwNmJmOCwgMHgwMGE5ODM0ZSwgMHhmZmJiMzRkOCwgMHgwMDBjNTQyMiwKLSAgICAgICAgMHg0NTFlOTc1MCwgMHhlYzMyYWNiMCwgMHgwNjQ2YjgwOCwgMHhmZjIwYjkzZSwgMHhmZjRkZjFiZSwgMHgwMGE0ODM0YywgMHhmZmJjNzY3ZiwgMHgwMDBjMjI0NSwKLSAgICAgICAgMHg0NDJkNjlkZSwgMHhlYzFjZDY3NywgMHgwNjZiYmQwZCwgMHhmZjA2Njg4OSwgMHhmZjViNjAyYywgMHgwMDlmODI0OSwgMHhmZmJkYmI0MiwgMHgwMDBiZWY3OSwKLSAgICAgICAgMHg0MzNhZTk5YywgMHhlYzA5OWRjZiwgMHgwNjhmOTc4MSwgMHhmZWVjODMwZCwgMHhmZjY4YjVkNSwgMHgwMDlhODBmOCwgMHhmZmJmMDJkZCwgMHgwMDBiYmJkMiwKLSAgICAgICAgMHg0MjQ3MjczZiwgMHhlYmY4ZmM2NCwgMHgwNmIyNDY1YiwgMHhmZWQzMGFjNSwgMHhmZjc1ZjE1MywgMHgwMDk1ODAwYywgMHhmZmMwNGQwZiwgMHgwMDBiODc2MCwKLSAgICAgICAgMHg0MTUyMzM4OSwgMHhlYmVhZWJhZiwgMHgwNmQzYzhiYiwgMHhmZWJhMDE5OSwgMHhmZjgzMTE0OCwgMHgwMDkwODAzNCwgMHhmZmMxOTk5NiwgMHgwMDBiNTIzNSwKLSAgICAgICAgMHg0MDVjMWY0MywgMHhlYmRmNjUwMCwgMHgwNmY0MWRlMywgMHhmZWExNjk2MCwgMHhmZjkwMTQ1ZSwgMHgwMDhiODIxYiwgMHhmZmMyZTgzMiwgMHgwMDBiMWM2NCwKLSAgICAgICAgMHgzZjY0ZmI0MCwgMHhlYmQ2NjE3YiwgMHgwNzEzNDUzZCwgMHhmZTg5NDNkYywgMHhmZjljZjk0NywgMHgwMDg2ODY2YiwgMHhmZmM0MzhhMywgMHgwMDBhZTVmYywKLSAgICAgICAgMHgzZTZjZDg1YiwgMHhlYmNmZGExOSwgMHgwNzMxM2U1NiwgMHhmZTcxOTJiZCwgMHhmZmE5YmViZSwgMHgwMDgxOGRjYiwgMHhmZmM1OGFhYSwgMHgwMDBhYWYwZiwKLSAgICAgICAgMHgzZDczYzc3MiwgMHhlYmNiYzdhNywgMHgwNzRlMDhlMCwgMHhmZTVhNTc5ZCwgMHhmZmI2NjM4NiwgMHgwMDdjOThkZSwgMHhmZmM2ZGUwOSwgMHgwMDBhNzdhYywKLSAgICAgICAgMHgzYzc5ZDk2OCwgMHhlYmNhMjJjYywgMHgwNzY5YTRiMiwgMHhmZTQzOTQwNywgMHhmZmMyZTY2OSwgMHgwMDc3YTg0NSwgMHhmZmM4MzI4NSwgMHgwMDBhM2ZlNSwKLSAgICAgICAgMHgzYjdmMWYyMywgMHhlYmNhZTQwNSwgMHgwNzg0MTFjNywgMHhmZTJkNDk2ZiwgMHhmZmNmNDYzYSwgMHgwMDcyYmM5ZCwgMHhmZmM5ODdlMCwgMHgwMDBhMDdjOSwKLSAgICAgICAgMHgzYTgzYTk4OSwgMHhlYmNlMDNhYSwgMHgwNzlkNTAzYiwgMHhmZTE3NzkzNywgMHhmZmRiODFkNiwgMHgwMDZkZDY4MCwgMHhmZmNhZGRlMSwgMHgwMDA5Y2Y2NywKLSAgICAgICAgMHgzOTg3ODk3ZiwgMHhlYmQzNzllYiwgMHgwN2I1NjA1MSwgMHhmZTAyMjRiMCwgMHhmZmU3OTgyMCwgMHgwMDY4ZjY4NywgMHhmZmNjMzQ0YywgMHgwMDA5OTZjZSwKLSAgICAgICAgMHgzODhhY2ZlOSwgMHhlYmRiM2VkNSwgMHgwN2NjNDI2YywgMHhmZGVkNGQxMywgMHhmZmYzODgwNiwgMHgwMDY0MWQ0NCwgMHhmZmNkOGFlYiwgMHgwMDA5NWUwZSwKLSAgICAgICAgMHgzNzhkOGRhOCwgMHhlYmU1NGE0ZiwgMHgwN2UxZjcxMiwgMHhmZGQ4ZjM4YiwgMHhmZmZmNTA3YiwgMHgwMDVmNGI0YSwgMHhmZmNlZTE4MywgMHgwMDA5MjUzNSwKLSAgICAgICAgMHgzNjhmZDM5NywgMHhlYmYxOTQxZiwgMHgwN2Y2N2VlYywgMHhmZGM1MTkyZCwgMHgwMDBhZjA3ZiwgMHgwMDVhODEyNSwgMHhmZmQwMzdlMCwgMHgwMDA4ZWM1MCwKLSAgICAgICAgMHgzNTkxYjI4YiwgMHhlYzAwMTNlOCwgMHgwODA5ZGFjMywgMHhmZGIxYmVmYywgMHgwMDE2NjcxOCwgMHgwMDU1YmY2MCwgMHhmZmQxOGRjYywgMHgwMDA4YjM2ZSwKLSAgICAgICAgMHgzNDkzM2I1MCwgMHhlYzEwYzEyYywgMHgwODFjMGI4NCwgMHhmZDllZTVlNywgMHgwMDIxYjM1NSwgMHgwMDUxMDY4MiwgMHhmZmQyZTMxMSwgMHgwMDA4N2E5YywKLSAgICAgICAgMHgzMzk0N2VhYiwgMHhlYzIzOTM0ZiwgMHgwODJkMTIzOSwgMHhmZDhjOGVjYywgMHgwMDJjZDQ0ZCwgMHgwMDRjNTcwZiwgMHhmZmQ0Mzc3ZCwgMHgwMDA4NDFlOCwKLSAgICAgICAgMHgzMjk1OGQ1NSwgMHhlYzM4ODE5NCwgMHgwODNjZjAxMCwgMHhmZDdhYmE3NCwgMHgwMDM3YzkyMiwgMHgwMDQ3YjE4NiwgMHhmZmQ1OGFkZSwgMHgwMDA4MDk1ZCwKLSAgICAgICAgMHgzMTk2NzdmYSwgMHhlYzRmODMyMiwgMHgwODRiYTY1NCwgMHhmZDY5Njk5OCwgMHgwMDQyOTBmYywgMHgwMDQzMTY2NiwgMHhmZmQ2ZGQwMiwgMHgwMDA3ZDEwOCwKLSAgICAgICAgMHgzMDk3NGYzYiwgMHhlYzY4OGYwMiwgMHgwODU5MzY3MSwgMHhmZDU4OWNkYywgMHgwMDRkMmIwZSwgMHgwMDNlODYyOCwgMHhmZmQ4MmRiYSwgMHgwMDA3OThmNSwKLSAgICAgICAgMHgyZjk4MjNhOCwgMHhlYzgzOWMyMiwgMHgwODY1YTFmMSwgMHhmZDQ4NTRkMywgMHgwMDU3OTY5MSwgMHgwMDNhMDE0MSwgMHhmZmQ5N2NkNiwgMHgwMDA3NjEzMCwKLSAgICAgICAgMHgyZTk5MDVjMSwgMHhlY2EwYTE1NiwgMHgwODcwZWE3ZSwgMHhmZDM4OTFmZCwgMHgwMDYxZDJjYSwgMHgwMDM1ODgyNCwgMHhmZmRhY2EyYSwgMHgwMDA3MjljNCwKLSAgICAgICAgMHgyZDlhMDVmNCwgMHhlY2JmOTU1OCwgMHgwODdiMTFkZSwgMHhmZDI5NTRjOCwgMHgwMDZiZGYwNSwgMHgwMDMxMWI0MSwgMHhmZmRjMTU4OCwgMHgwMDA2ZjJiYiwKLSAgICAgICAgMHgyYzliMzQ5ZSwgMHhlY2UwNmVjYiwgMHgwODg0MTlmNiwgMHhmZDFhOWQ5MSwgMHgwMDc1YmE5NSwgMHgwMDJjYmIwMywgMHhmZmRkNWVjNiwgMHgwMDA2YmMyMSwKLSAgICAgICAgMHgyYjljYTIwMywgMHhlZDAzMjQzOSwgMHgwODhjMDRjOCwgMHhmZDBjNmNhMiwgMHgwMDdmNjRkYSwgMHgwMDI4NjdkMiwgMHhmZmRlYTViYiwgMHgwMDA2ODVmZiwKLSAgICAgICAgMHgyYTllNWU1NywgMHhlZDI3YWMxNiwgMHgwODkyZDQ3MCwgMHhmY2ZlYzIzMywgMHgwMDg4ZGQzOCwgMHgwMDI0MjIxMywgMHhmZmRmZWEzYywgMHgwMDA2NTA1ZiwKLSAgICAgICAgMHgyOWEwNzliMiwgMHhlZDRkZmNjMiwgMHgwODk4OGIyYSwgMHhmY2YxOWU2YiwgMHgwMDkyMjMxZSwgMHgwMDFmZWEyNywgMHhmZmUxMmMyMiwgMHgwMDA2MWI0YiwKLSAgICAgICAgMHgyOGEzMDQxNiwgMHhlZDc2MGM4OCwgMHgwODlkMmI0YSwgMHhmY2U1MDE2MSwgMHgwMDliMzYwNSwgMHgwMDFiYzA2YiwgMHhmZmUyNmI0OCwgMHgwMDA1ZTZjYiwKLSAgICAgICAgMHgyN2E2MGQ2YSwgMHhlZDlmZDFhMiwgMHgwOGEwYjc0MCwgMHhmY2Q4ZWIxNywgMHgwMGE0MTU2YiwgMHgwMDE3YTUzYiwgMHhmZmUzYTc4OCwgMHgwMDA1YjJlOCwKLSAgICAgICAgMHgyNmE5YTU3YiwgMHhlZGNiNDIzNywgMHgwOGEzMzE5NiwgMHhmY2NkNWI4MiwgMHgwMGFjYzBkYSwgMHgwMDEzOThlYywgMHhmZmU0ZTBiZiwgMHgwMDA1N2ZhYSwKLSAgICAgICAgMHgyNWFkZGJmOSwgMHhlZGY4NTQ1YiwgMHgwOGE0OWNmMCwgMHhmY2MyNTI4NSwgMHgwMGI1MzdlMSwgMHgwMDBmOWJkMiwgMHhmZmU2MTZjOCwgMHgwMDA1NGQxYSwKLSAgICAgICAgMHgyNGIyYzA3NSwgMHhlZTI2ZmUxNywgMHgwOGE0ZmMwZCwgMHhmY2I3Y2ZmMCwgMHgwMGJkN2ExYywgMHgwMDBiYWUzYywgMHhmZmU3NDk4NCwgMHgwMDA1MWIzZSwKLSAgICAgICAgMHgyM2I4NjI2MywgMHhlZTU3MzU2MiwgMHgwOGE0NTFjMCwgMHhmY2FkZDM4NiwgMHgwMGM1ODcyYSwgMHgwMDA3ZDA3NSwgMHhmZmU4NzhkMywgMHgwMDA0ZWExZCwKLSAgICAgICAgMHgyMmJlZDExNiwgMHhlZTg4ZjAyNiwgMHgwOGEyYTBmOCwgMHhmY2E0NWNmNywgMHgwMGNkNWViNywgMHgwMDA0MDJjOCwgMHhmZmU5YTQ5NCwgMHgwMDA0YjljMCwKLSAgICAgICAgMHgyMWM2MWJjMCwgMHhlZWJjMjQ0NCwgMHgwODlmZWNiYiwgMHhmYzliNmJlNSwgMHgwMGQ1MDA3NSwgMHgwMDAwNDU3OSwgMHhmZmVhY2NhYSwgMHgwMDA0OGEyYiwKLSAgICAgICAgMHgyMGNlNTE2ZiwgMHhlZWYwYzc4ZCwgMHgwODljMzgyNCwgMHhmYzkyZmZlMSwgMHgwMGRjNmMxZSwgMHhmZmZjOThjOSwgMHhmZmViZjBmYSwgMHgwMDA0NWI2NSwKLSAgICAgICAgMHgxZmQ3ODEwZiwgMHhlZjI2Y2ZjYSwgMHgwODk3ODY2NiwgMHhmYzhiMTg2ZCwgMHgwMGUzYTE3NSwgMHhmZmY4ZmNmNywgMHhmZmVkMTE2NiwgMHgwMDA0MmQ3NCwKLSAgICAgICAgMHgxZWUxYjk2NSwgMHhlZjVlMzJiZCwgMHgwODkxZGFjOCwgMHhmYzgzYjRmYywgMHgwMGVhYTA0NSwgMHhmZmY1NzIzZCwgMHhmZmVlMmRkNywgMHgwMDA0MDA1ZSwKLSAgICAgICAgMHgxZGVkMDkxMSwgMHhlZjk2ZTYxYywgMHgwODhiMzhhOSwgMHhmYzdjZDRmMCwgMHgwMGYxNjg2MSwgMHhmZmYxZjhkMiwgMHhmZmVmNDYzMiwgMHgwMDAzZDQyNiwKLSAgICAgICAgMHgxY2Y5N2U4YiwgMHhlZmQwZGY5YSwgMHgwODgzYTM3OCwgMHhmYzc2Nzc5ZSwgMHgwMGY3ZjlhMywgMHhmZmVlOTBlYiwgMHhmZmYwNWE2MCwgMHgwMDAzYThkMiwKLSAgICAgICAgMHgxYzA3MjgyMywgMHhmMDBjMTRlMSwgMHgwODdiMWViYywgMHhmYzcwOWM0ZCwgMHgwMGZlNTNlZiwgMHhmZmViM2FiOCwgMHhmZmYxNmE0YSwgMHgwMDAzN2U2NSwKLSAgICAgICAgMHgxYjE2MTNmZiwgMHhmMDQ4N2I5OCwgMHgwODcxYWUwZCwgMHhmYzZiNDIzMywgMHgwMTA0NzcyZSwgMHhmZmU3ZjY2NiwgMHhmZmYyNzVkYiwgMHgwMDAzNTRlNSwKLSAgICAgICAgMHgxYTI2NTAxYiwgMHhmMDg2MDk2MiwgMHgwODY3NTUxNiwgMHhmYzY2Njg3YSwgMHgwMTBhNjM1MywgMHhmZmU0YzQxZSwgMHhmZmYzN2QwMCwgMHgwMDAzMmM1NCwKLSAgICAgICAgMHgxOTM3ZWE0NywgMHhmMGM0YjNlMCwgMHgwODVjMTc5NCwgMHhmYzYyMGUzZCwgMHgwMTEwMTg1OCwgMHhmZmUxYTQwOCwgMHhmZmY0N2ZhNSwgMHgwMDAzMDRiNywKLSAgICAgICAgMHgxODRhZjAyNSwgMHhmMTA0NzBiMCwgMHgwODRmZjk1NywgMHhmYzVlMzI4YywgMHgwMTE1OTYzZCwgMHhmZmRlOTY0NiwgMHhmZmY1N2RiOCwgMHgwMDAyZGUwZSwKLSAgICAgICAgMHgxNzVmNmYyYiwgMHhmMTQ1MzU3MSwgMHgwODQyZmUzZCwgMHhmYzVhZDQ2NSwgMHgwMTFhZGQwYiwgMHhmZmRiOWFmOCwgMHhmZmY2NzcyOSwgMHgwMDAyYjg1ZiwKLSAgICAgICAgMHgxNjc1NzQ5ZSwgMHhmMTg2ZjdjMCwgMHgwODM1MmEzNSwgMHhmYzU3ZjJiZSwgMHgwMTFmZWNkMywgMHhmZmQ4YjIzYiwgMHhmZmY3NmJlOSwgMHgwMDAyOTNhYSwKLSAgICAgICAgMHgxNThkMGQ5NSwgMHhmMWM5YWQ0MCwgMHgwODI2ODEzZSwgMHhmYzU1OGM3YywgMHgwMTI0YzVhYiwgMHhmZmQ1ZGMyOCwgMHhmZmY4NWJlOCwgMHgwMDAyNmZmMiwKLSAgICAgICAgMHgxNGE2NDZmNiwgMHhmMjBkNGI5MiwgMHgwODE3MDc2NywgMHhmYzUzYTA3YiwgMHgwMTI5NjdiMSwgMHhmZmQzMThkNiwgMHhmZmY5NDcxYiwgMHgwMDAyNGQzOSwKLSAgICAgICAgMHgxM2MxMmQ3MywgMHhmMjUxYzg1ZCwgMHgwODA2YzBjYiwgMHhmYzUyMmQ4OCwgMHgwMTJkZDMwYSwgMHhmZmQwNjg1OCwgMHhmZmZhMmQ3NCwgMHgwMDAyMmI3ZiwKLSAgICAgICAgMHgxMmRkY2Q4ZiwgMHhmMjk3MTk0ZCwgMHgwN2Y1YjE5MywgMHhmYzUxMzI2NiwgMHgwMTMyMDdlNCwgMHhmZmNkY2FiZSwgMHhmZmZiMGVlOSwgMHgwMDAyMGFjNywKLSAgICAgICAgMHgxMWZjMzM5NSwgMHhmMmRkMzQxMSwgMHgwN2UzZGRmNywgMHhmYzUwYWRjYywgMHgwMTM2MDY3MCwgMHhmZmNiNDAxNCwgMHhmZmZiZWI3MCwgMHgwMDAxZWIxMCwKLSAgICAgICAgMHgxMTFjNmJhMCwgMHhmMzI0MGU2MSwgMHgwN2QxNGEzOCwgMHhmYzUwOWU2NCwgMHgwMTM5Y2VlOSwgMHhmZmM4Yzg2NiwgMHhmZmZjYzMwMCwgMHgwMDAxY2M1YywKKyNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlclNpbmNVcC5oIgogfTsKIAogLyoKQEAgLTE5NywxMzUgKzY5LDcgQEAKICAqIGNtZC1saW5lOiBmaXIgLWwgNyAtcyA0ODAwMCAtYyAxNzE4OQogICovCiBjb25zdCB1aW50MzJfdCBBdWRpb1Jlc2FtcGxlclNpbmM6Om1GaXJDb2Vmc0Rvd25bXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoMzIpKSkgPSB7Ci0gICAgICAgIDB4NWJhY2I2ZjQsIDB4MWRlZDFhMWQsIDB4ZjAzOThkNTYsIDB4MDM5NGY2NzQsIDB4MDE5M2E1ZjksIDB4ZmU2NmRiZWIsIDB4MDA3OTEwNDMsIDB4ZmZmZTY2MzEsCi0gICAgICAgIDB4NWJhYjZjODEsIDB4MWQzZGRjY2QsIDB4ZjA0MjFkMmMsIDB4MDNhZjk5OTUsIDB4MDE4MThkYzksIDB4ZmU2YmI2M2UsIDB4MDA3OTgxMmEsIDB4ZmZmZGMzN2QsCi0gICAgICAgIDB4NWJhNzhkMzcsIDB4MWM4ZjJjZjksIDB4ZjA0YmViMWQsIDB4MDNjOWEwNGEsIDB4MDE2ZjhhY2EsIDB4ZmU3MGE1MTEsIDB4MDA3OWUzNGQsIDB4ZmZmZDI1NDUsCi0gICAgICAgIDB4NWJhMTE5NGYsIDB4MWJlMTEyMzEsIDB4ZjA1NmYyYzcsIDB4MDNlMzA5ZmUsIDB4MDE1ZDllNjQsIDB4ZmU3NWE3OWYsIDB4MDA3YTM2ZTIsIDB4ZmZmYzhiODYsCi0gICAgICAgIDB4NWI5ODExMjIsIDB4MWIzMzkzZjgsIDB4ZjA2MzJmYjcsIDB4MDNmYmQ2MjUsIDB4MDE0YmM5ZmEsIDB4ZmU3YWJkMjMsIDB4MDA3YTdjMjAsIDB4ZmZmYmY2MzksCi0gICAgICAgIDB4NWI4Yzc1MzAsIDB4MWE4NmI5YmYsIDB4ZjA3MDlkNzQsIDB4MDQxNDA0NDksIDB4MDEzYTBlZTksIDB4ZmU3ZmU0ZGIsIDB4MDA3YWIzM2QsIDB4ZmZmYjY1NWIsCi0gICAgICAgIDB4NWI3ZTQ2MWEsIDB4MTlkYThhZTUsIDB4ZjA3ZjM3NzYsIDB4MDQyYjkzZmQsIDB4MDEyODZlODYsIDB4ZmU4NTFlMDUsIDB4MDA3YWRjNzIsIDB4ZmZmYWQ4ZTQsCi0gICAgICAgIDB4NWI2ZDg0YTgsIDB4MTkyZjBlYjcsIDB4ZjA4ZWY5MmQsIDB4MDQ0Mjg0ZTYsIDB4MDExNmVhMjIsIDB4ZmU4YTY3ZGQsIDB4MDA3YWY3ZjYsIDB4ZmZmYTUwY2UsCi0gICAgICAgIDB4NWI1YTMxYzYsIDB4MTg4NDRjNzAsIDB4ZjA5ZmRkZmUsIDB4MDQ1OGQ2YjcsIDB4MDEwNTgzMDYsIDB4ZmU4ZmMxYTUsIDB4MDA3YjA2MDMsIDB4ZmZmOWNkMTIsCi0gICAgICAgIDB4NWI0NDRlODEsIDB4MTdkYTRiMzcsIDB4ZjBiMWUxNDMsIDB4MDQ2ZTg5MzMsIDB4MDBmNDNhNzQsIDB4ZmU5NTJhOWIsIDB4MDA3YjA2ZDQsIDB4ZmZmOTRkYTksCi0gICAgICAgIDB4NWIyYmRjMGUsIDB4MTczMTEyMjIsIDB4ZjBjNGZlNTAsIDB4MDQ4MzljMjksIDB4MDBlMzExYTksIDB4ZmU5YWEyMDEsIDB4MDA3YWZhYTEsIDB4ZmZmOGQyOGMsCi0gICAgICAgIDB4NWIxMGRiYzIsIDB4MTY4OGE4MzIsIDB4ZjBkOTMwNmQsIDB4MDQ5ODBmNzksIDB4MDBkMjA5ZGIsIDB4ZmVhMDI3MTksIDB4MDA3YWUxYTcsIDB4ZmZmODViYjEsCi0gICAgICAgIDB4NWFmMzRmMTgsIDB4MTVlMTE0NTMsIDB4ZjBlZTcyZGIsIDB4MDRhYmUzMTAsIDB4MDBjMTI0MzksIDB4ZmVhNWI5MjYsIDB4MDA3YWJjMjAsIDB4ZmZmN2U5MTAsCi0gICAgICAgIDB4NWFkMzM3YWYsIDB4MTUzYTVkNWUsIDB4ZjEwNGMwZDIsIDB4MDRiZjE2ZTksIDB4MDBiMDYxZWIsIDB4ZmVhYjU3NmQsIDB4MDA3YThhNDksIDB4ZmZmNzdhOWYsCi0gICAgICAgIDB4NWFiMDk3NDgsIDB4MTQ5NDhhMTYsIDB4ZjExYzE1ODMsIDB4MDRkMWFiMGQsIDB4MDA5ZmM0MTMsIDB4ZmViMTAxMzQsIDB4MDA3YTRjNWQsIDB4ZmZmNzEwNTcsCi0gICAgICAgIDB4NWE4YjZmYzcsIDB4MTNlZmExMmMsIDB4ZjEzNDZjMTcsIDB4MDRlMzlmOTMsIDB4MDA4ZjRiY2IsIDB4ZmViNmI1YzAsIDB4MDA3YTAyOWEsIDB4ZmZmNmFhMmIsCi0gICAgICAgIDB4NWE2M2MzMzYsIDB4MTM0YmE5MzcsIDB4ZjE0ZGJmYjEsIDB4MDRmNGY0YTIsIDB4MDA3ZWZhMjksIDB4ZmViYzc0NWMsIDB4MDA3OWFkM2QsIDB4ZmZmNjQ4MTIsCi0gICAgICAgIDB4NWEzOTkzYzAsIDB4MTJhOGE4YmIsIDB4ZjE2ODBiNmUsIDB4MDUwNWFhNmEsIDB4MDA2ZWQwMzgsIDB4ZmVjMjNjNTAsIDB4MDA3OTRjODIsIDB4ZmZmNWVhMDIsCi0gICAgICAgIDB4NWEwY2UzYjIsIDB4MTIwNmE2MjUsIDB4ZjE4MzRhNjMsIDB4MDUxNWMxMmQsIDB4MDA1ZWNmMDEsIDB4ZmVjODBjZTgsIDB4MDA3OGUwYTksIDB4ZmZmNThmZjAsCi0gICAgICAgIDB4NTlkZGI1N2YsIDB4MTE2NWE3Y2MsIDB4ZjE5Zjc3YTAsIDB4MDUyNTM5MzgsIDB4MDA0ZWY3ODIsIDB4ZmVjZGU1NzEsIDB4MDA3ODY5ZWUsIDB4ZmZmNTM5Y2YsCi0gICAgICAgIDB4NTlhYzBiYmEsIDB4MTBjNWIzZWYsIDB4ZjFiYzhlMzEsIDB4MDUzNDEyZTQsIDB4MDAzZjRhYjQsIDB4ZmVkM2M1MzgsIDB4MDA3N2U4OTEsIDB4ZmZmNGU3OTQsCi0gICAgICAgIDB4NTk3N2U5MTksIDB4MTAyNmQwYjgsIDB4ZjFkYTg5MWIsIDB4MDU0MjRlOWIsIDB4MDAyZmM5OGEsIDB4ZmVkOWFiOGYsIDB4MDA3NzVjY2YsIDB4ZmZmNDk5MzQsCi0gICAgICAgIDB4NTk0MTUwNzUsIDB4MGY4OTA0MzcsIDB4ZjFmOTYzNjAsIDB4MDU0ZmVjY2YsIDB4MDAyMDc0ZWQsIDB4ZmVkZjk3YzYsIDB4MDA3NmM2ZTgsIDB4ZmZmNDRlYTMsCi0gICAgICAgIDB4NTkwODQ0YzksIDB4MGVlYzU0NjUsIDB4ZjIxOTE3ZmYsIDB4MDU1Y2VlMDMsIDB4MDAxMTRkYzMsIDB4ZmVlNTg5MzIsIDB4MDA3NjI3MTksIDB4ZmZmNDA3ZDIsCi0gICAgICAgIDB4NThjY2M5MzAsIDB4MGU1MGM3MjMsIDB4ZjIzOWExZWYsIDB4MDU2OTUyYzMsIDB4MDAwMjU0ZTgsIDB4ZmVlYjdmMjcsIDB4MDA3NTdkYTMsIDB4ZmZmM2M0YjcsCi0gICAgICAgIDB4NTg4ZWUwZWEsIDB4MGRiNjYyM2IsIDB4ZjI1YWZjMjksIDB4MDU3NTFiYWEsIDB4ZmZmMzhiMzIsIDB4ZmVmMTc4ZmMsIDB4MDA3NGNhYzQsIDB4ZmZmMzg1NDIsCi0gICAgICAgIDB4NTg0ZThmNTYsIDB4MGQxZDJiNWQsIDB4ZjI3ZDIxOWYsIDB4MDU4MDQ5NWMsIDB4ZmZlNGYxNzEsIDB4ZmVmNzc2MGMsIDB4MDA3NDBlYmIsIDB4ZmZmMzQ5NjgsCi0gICAgICAgIDB4NTgwYmQ3ZjQsIDB4MGM4NTI4MWYsIDB4ZjJhMDBkNDMsIDB4MDU4YWRjOGQsIDB4ZmZkNjg4NmQsIDB4ZmVmZDc1YWYsIDB4MDA3MzQ5YzcsIDB4ZmZmMzExMWIsCi0gICAgICAgIDB4NTdjNmJlNjcsIDB4MGJlZTVkZmYsIDB4ZjJjM2JhMDQsIDB4MDU5NGQ1ZmEsIDB4ZmZjODUwZTYsIDB4ZmYwMzc3NDQsIDB4MDA3MjdjMjcsIDB4ZmZmMmRjNGMsCi0gICAgICAgIDB4NTc3ZjQ2NzAsIDB4MGI1OGQyNjIsIDB4ZjJlODIyY2UsIDB4MDU5ZTM2NmMsIDB4ZmZiYTRiOTgsIDB4ZmYwOTdhMjksIDB4MDA3MWE2MWIsIDB4ZmZmMmFhZWYsCi0gICAgICAgIDB4NTczNTczZjIsIDB4MGFjNDhhOTIsIDB4ZjMwZDQyOGUsIDB4MDVhNmZlYjksIDB4ZmZhYzc5MzYsIDB4ZmYwZjdkYmYsIDB4MDA3MGM3ZTEsIDB4ZmZmMjdjZjMsCi0gICAgICAgIDB4NTZlOTRhZjEsIDB4MGEzMThiYzEsIDB4ZjMzMzE0MmYsIDB4MDVhZjJmYmYsIDB4ZmY5ZWRhNmQsIDB4ZmYxNTgxNmEsIDB4MDA2ZmUxYjgsIDB4ZmZmMjUyNGMsCi0gICAgICAgIDB4NTY5YWNmOTAsIDB4MDk5ZmRiMDQsIDB4ZjM1OTkyOWEsIDB4MDViNmNhNmIsIDB4ZmY5MTZmZTEsIDB4ZmYxYjg0OGUsIDB4MDA2ZWYzZGYsIDB4ZmZmMjJhZWEsCi0gICAgICAgIDB4NTY0YTA2MTAsIDB4MDkwZjdkNTcsIDB4ZjM4MGI4YmEsIDB4MDViZGNmYjIsIDB4ZmY4NDNhMzIsIDB4ZmYyMTg2OTIsIDB4MDA2ZGZlOTQsIDB4ZmZmMjA2YmYsCi0gICAgICAgIDB4NTVmNmYyZDMsIDB4MDg4MDc3OWQsIDB4ZjNhODgxNzksIDB4MDVjNDQwOTUsIDB4ZmY3NzM5ZjcsIDB4ZmYyNzg2ZTEsIDB4MDA2ZDAyMTcsIDB4ZmZmMWU1YmIsCi0gICAgICAgIDB4NTVhMTlhNWMsIDB4MDdmMmNlOWIsIDB4ZjNkMGU3YzIsIDB4MDVjYTFlMWYsIDB4ZmY2YTZmYzEsIDB4ZmYyZDg0ZTUsIDB4MDA2YmZlYTQsIDB4ZmZmMWM3ZDAsCi0gICAgICAgIDB4NTU0YTAxNDgsIDB4MDc2Njg2ZmMsIDB4ZjNmOWU2ODAsIDB4MDVjZjY5NjUsIDB4ZmY1ZGRjMWEsIDB4ZmYzMzgwMGUsIDB4MDA2YWY0N2IsIDB4ZmZmMWFjZWYsCi0gICAgICAgIDB4NTRmMDJjNTYsIDB4MDZkYmE1NTEsIDB4ZjQyMzc4YTAsIDB4MDVkNDIzODcsIDB4ZmY1MTdmODYsIDB4ZmYzOTc3Y2IsIDB4MDA2OWUzZDksIDB4ZmZmMTk1MDgsCi0gICAgICAgIDB4NTQ5NDIwNjEsIDB4MDY1MjJlMGYsIDB4ZjQ0ZDk5MTIsIDB4MDVkODRkYWYsIDB4ZmY0NTVhODAsIDB4ZmYzZjZiOGYsIDB4MDA2OGNjZmEsIDB4ZmZmMTgwMGIsCi0gICAgICAgIDB4NTQzNWUyNjMsIDB4MDVjYTI1OGYsIDB4ZjQ3ODQyYzUsIDB4MDVkYmU5MGYsIDB4ZmYzOTZkN2YsIDB4ZmY0NTVhY2YsIDB4MDA2N2IwMWUsIDB4ZmZmMTZkZTksCi0gICAgICAgIDB4NTNkNTc3NzQsIDB4MDU0MzkwMGQsIDB4ZjRhMzcwYWQsIDB4MDVkZWY2ZTQsIDB4ZmYyZGI4ZjIsIDB4ZmY0YjQ1MDMsIDB4MDA2NjhkODAsIDB4ZmZmMTVlOTMsCi0gICAgICAgIDB4NTM3MmU0YzYsIDB4MDRiZTcxYWIsIDB4ZjRjZjFkYmYsIDB4MDVlMTc4NzMsIDB4ZmYyMjNkNDAsIDB4ZmY1MTI5YTMsIDB4MDA2NTY1NWQsIDB4ZmZmMTUxZjksCi0gICAgICAgIDB4NTMwZTJmYWMsIDB4MDQzYWNlNmUsIDB4ZjRmYjQ0ZjQsIDB4MDVlMzZmMGQsIDB4ZmYxNmZhY2EsIDB4ZmY1NzA4MmUsIDB4MDA2NDM3ZjEsIDB4ZmZmMTQ4MGIsCi0gICAgICAgIDB4NTJhNzVkOTAsIDB4MDNiOGFhNDAsIDB4ZjUyN2UxNDksIDB4MDVlNGRjMDgsIDB4ZmYwYmYxZWQsIDB4ZmY1Y2UwMjEsIDB4MDA2MzA1NzcsIDB4ZmZmMTQwYjksCi0gICAgICAgIDB4NTIzZTczZmQsIDB4MDMzODA4ZWIsIDB4ZjU1NGVkYmQsIDB4MDVlNWMwYzYsIDB4ZmYwMTIyZmMsIDB4ZmY2MmIwZmQsIDB4MDA2MWNlMmMsIDB4ZmZmMTNiZjMsCi0gICAgICAgIDB4NTFkMzc4OTcsIDB4MDJiOGVlMjIsIDB4ZjU4MjY1NTUsIDB4MDVlNjFlYWUsIDB4ZmVmNjhlNDUsIDB4ZmY2ODdhNDcsIDB4MDA2MDkyNDksIDB4ZmZmMTM5YWEsCi0gICAgICAgIDB4NTE2NjcxMWMsIDB4MDIzYjVkNzYsIDB4ZjViMDQzMWEsIDB4MDVlNWY3MzMsIDB4ZmVlYzM0MGYsIDB4ZmY2ZTNiODQsIDB4MDA1ZjUyMGEsIDB4ZmZmMTM5Y2QsCi0gICAgICAgIDB4NTBmNzYzNjgsIDB4MDFiZjVhNWUsIDB4ZjVkZTgyMTgsIDB4MDVlNTRiY2QsIDB4ZmVlMjE0OWIsIDB4ZmY3M2Y0M2QsIDB4MDA1ZTBkYTgsIDB4ZmZmMTNjNGMsCi0gICAgICAgIDB4NTA4NjU1NmYsIDB4MDE0NGU4MzQsIDB4ZjYwZDFkNjMsIDB4MDVlNDFkZmUsIDB4ZmVkODMwMjMsIDB4ZmY3OWEzZmUsIDB4MDA1Y2M1NWMsIDB4ZmZmMTQxMTksCi0gICAgICAgIDB4NTAxMzRkM2UsIDB4MDBjYzBhMzYsIDB4ZjYzYzEwMTIsIDB4MDVlMjZmNGUsIDB4ZmVjZTg2ZGIsIDB4ZmY3ZjRhNTQsIDB4MDA1Yjc5NjEsIDB4ZmZmMTQ4MjEsCi0gICAgICAgIDB4NGY5ZTUwZmYsIDB4MDA1NGMzODIsIDB4ZjY2YjU1NDQsIDB4MDVlMDQxNGQsIDB4ZmVjNTE4ZjEsIDB4ZmY4NGU2ZDAsIDB4MDA1YTI5ZWQsIDB4ZmZmMTUxNTYsCi0gICAgICAgIDB4NGYyNzY2ZjIsIDB4ZmZkZjE3MWIsIDB4ZjY5YWU4MWQsIDB4MDVkZDk1OTMsIDB4ZmViYmU2OGMsIDB4ZmY4YTc5MDUsIDB4MDA1OGQ3MzgsIDB4ZmZmMTVjYTgsCi0gICAgICAgIDB4NGVhZTk1NzEsIDB4ZmY2YjA3ZTcsIDB4ZjZjYWMzYzcsIDB4MDVkYTZkYmUsIDB4ZmViMmVmY2QsIDB4ZmY5MDAwODksIDB4MDA1NzgxN2IsIDB4ZmZmMTZhMDcsCi0gICAgICAgIDB4NGUzM2UyZWUsIDB4ZmVmODk4YWUsIDB4ZjZmYWUzNzMsIDB4MDVkNmNiNzIsIDB4ZmVhYTM0ZDAsIDB4ZmY5NTdjZjQsIDB4MDA1NjI4ZWMsIDB4ZmZmMTc5NjIsCi0gICAgICAgIDB4NGRiNzU1ZjMsIDB4ZmU4N2NjMWIsIDB4ZjcyYjQyNWIsIDB4MDVkMmIwNWMsIDB4ZmVhMWI1YTksIDB4ZmY5YWVkZTAsIDB4MDA1NGNkYzAsIDB4ZmZmMThhYWIsCi0gICAgICAgIDB4NGQzOGY1MjAsIDB4ZmUxOGE0YmMsIDB4Zjc1YmRiYmQsIDB4MDVjZTFlMmQsIDB4ZmU5OTcyNjgsIDB4ZmZhMDUyZWMsIDB4MDA1MzcwMmQsIDB4ZmZmMTlkZDEsCi0gICAgICAgIDB4NGNiOGM3MmUsIDB4ZmRhYjI1MDEsIDB4Zjc4Y2FhZTAsIDB4MDVjOTE2OWQsIDB4ZmU5MTZiMTUsIDB4ZmZhNWFiYjgsIDB4MDA1MjEwNjgsIDB4ZmZmMWIyYzUsCi0gICAgICAgIDB4NGMzNmQyZWIsIDB4ZmQzZjRmM2QsIDB4ZjdiZGFiMTYsIDB4MDVjMzliNmEsIDB4ZmU4OTlmYjIsIDB4ZmZhYWY3ZTYsIDB4MDA1MGFlYTUsIDB4ZmZmMWM5NzYsCi0gICAgICAgIDB4NGJiMzFmM2MsIDB4ZmNkNTI1YTUsIDB4ZjdlZWQ3YjQsIDB4MDViZGFlNTcsIDB4ZmU4MjEwM2YsIDB4ZmZiMDM3MWMsIDB4MDA0ZjRiMTcsIDB4ZmZmMWUxZDYsCi0gICAgICAgIDB4NGIyZGIzMWEsIDB4ZmM2Y2FhNTMsIDB4ZjgyMDJjMWMsIDB4MDViNzUxMmUsIDB4ZmU3YWJjYjEsIDB4ZmZiNTY5MDIsIDB4MDA0ZGU1ZjEsIDB4ZmZmMWZiZDUsCi0gICAgICAgIDB4NGFhNjk1OTQsIDB4ZmMwNWRmNDAsIDB4Zjg1MWEzYjYsIDB4MDViMDg1YmMsIDB4ZmU3M2E0ZmIsIDB4ZmZiYThkNDQsIDB4MDA0YzdmNjYsIDB4ZmZmMjE3NjQsCi0gICAgICAgIDB4NGExZGNkY2UsIDB4ZmJhMGM2NGIsIDB4Zjg4MzM5ZjUsIDB4MDVhOTRkZDUsIDB4ZmU2Y2M5MDksIDB4ZmZiZmEzOGQsIDB4MDA0YjE3YTYsIDB4ZmZmMjM0NzMsCi0gICAgICAgIDB4NDk5MzYyZmYsIDB4ZmIzZDYxMzMsIDB4ZjhiNGVhNTUsIDB4MDVhMWFiNTIsIDB4ZmU2NjI4YzEsIDB4ZmZjNGFiOGYsIDB4MDA0OWFlZTMsIDB4ZmZmMjUyZjMsCi0gICAgICAgIDB4NDkwNzVjNzIsIDB4ZmFkYmIxOWEsIDB4ZjhlNmIwNTksIDB4MDU5OWEwMGUsIDB4ZmU1ZmM0MDUsIDB4ZmZjOWE0ZmMsIDB4MDA0ODQ1NGIsIDB4ZmZmMjcyZDYsCi0gICAgICAgIDB4NDg3OWMxODUsIDB4ZmE3YmI5MDgsIDB4ZjkxODg3OTMsIDB4MDU5MTJkZWEsIDB4ZmU1OTlhYWYsIDB4ZmZjZThmOGEsIDB4MDA0NmRiMGYsIDB4ZmZmMjk0MGIsCi0gICAgICAgIDB4NDdlYTk5YTksIDB4ZmExZDc4ZTMsIDB4Zjk0YTZiOWIsIDB4MDU4ODU2Y2QsIDB4ZmU1M2FjOTcsIDB4ZmZkMzZhZjEsIDB4MDA0NTcwNWMsIDB4ZmZmMmI2ODYsCi0gICAgICAgIDB4NDc1OWVjNjAsIDB4ZjljMGYyNzYsIDB4Zjk3YzU4MTUsIDB4MDU3ZjFjOWUsIDB4ZmU0ZGY5OGUsIDB4ZmZkODM2ZWIsIDB4MDA0NDA1NjEsIDB4ZmZmMmRhMzYsCi0gICAgICAgIDB4NDZjN2MxNDAsIDB4Zjk2NjI2ZjAsIDB4ZjlhZTQ4YWYsIDB4MDU3NTgxNGMsIDB4ZmU0ODgxNWUsIDB4ZmZkY2YzMzYsIDB4MDA0MjlhNGEsIDB4ZmZmMmZmMGQsCi0gICAgICAgIDB4NDYzNDFmZWQsIDB4ZjkwZDE3NjEsIDB4ZjllMDM5MjQsIDB4MDU2Yjg2YzYsIDB4ZmU0MzQzZDAsIDB4ZmZlMTlmOTEsIDB4MDA0MTJmNDMsIDB4ZmZmMzI0ZmQsCi0gICAgICAgIDB4NDU5ZjEwMWQsIDB4ZjhiNWM0YmUsIDB4ZmExMjI1MzcsIDB4MDU2MTJmMDAsIDB4ZmUzZTQwYTYsIDB4ZmZlNjNiYzAsIDB4MDAzZmM0NzgsIDB4ZmZmMzRiZjksCi0gICAgICAgIDB4NDUwODk5OTYsIDB4Zjg2MDJmZGMsIDB4ZmE0NDA4YmEsIDB4MDU1NjdiZjEsIDB4ZmUzOTc3OWEsIDB4ZmZlYWM3ODcsIDB4MDAzZTVhMTIsIDB4ZmZmMzczZjAsCi0gICAgICAgIDB4NDQ3MGM0MmQsIDB4ZjgwYzU5NzcsIDB4ZmE3NWRmODcsIDB4MDU0YjZmOTIsIDB4ZmUzNGU4NjcsIDB4ZmZlZjQyYWYsIDB4MDAzY2YwM2QsIDB4ZmZmMzljZDcsCi0gICAgICAgIDB4NDNkNzk3YzcsIDB4ZjdiYTQyMmIsIDB4ZmFhN2E1ODYsIDB4MDU0MDBiZTEsIDB4ZmUzMDkyYmYsIDB4ZmZmM2FkMDEsIDB4MDAzYjg3MWYsIDB4ZmZmM2M2OWYsCi0gICAgICAgIDB4NDMzZDFjNTYsIDB4Zjc2OWVhNzgsIDB4ZmFkOTU2YWIsIDB4MDUzNDUyZGMsIDB4ZmUyYzc2NTAsIDB4ZmZmODA2NGIsIDB4MDAzYTFlZTMsIDB4ZmZmM2YxM2EsCi0gICAgICAgIDB4NDJhMTU5ZGMsIDB4ZjcxYjUyYzQsIDB4ZmIwYWVlZjYsIDB4MDUyODQ2ODUsIDB4ZmUyODkyYzUsIDB4ZmZmYzRlNWMsIDB4MDAzOGI3YWUsIDB4ZmZmNDFjOWMsCi0gICAgICAgIDB4NDIwNDU4NjUsIDB4ZjZjZTdiNTcsIDB4ZmIzYzZhNzMsIDB4MDUxYmU4ZGQsIDB4ZmUyNGU3YzMsIDB4MDAwMDg1MDcsIDB4MDAzNzUxYTcsIDB4ZmZmNDQ4YjcsCi0gICAgICAgIDB4NDE2NjIwMGUsIDB4ZjY4MzY0NWEsIDB4ZmI2ZGM1M2MsIDB4MDUwZjNiZWMsIDB4ZmUyMTc0ZWMsIDB4MDAwNGFhMWYsIDB4MDAzNWVjZjQsIDB4ZmZmNDc1N2UsCi0gICAgICAgIDB4NDBjNmI4ZmQsIDB4ZjYzYTBkZGYsIDB4ZmI5ZWZiNzcsIDB4MDUwMjQxYjYsIDB4ZmUxZTM5ZGEsIDB4MDAwOGJkN2MsIDB4MDAzNDg5YjksIDB4ZmZmNGEyZTUsCi0gICAgICAgIDB4NDAyNjJiNjUsIDB4ZjVmMjc3ZDksIDB4ZmJkMDA5NTYsIDB4MDRmNGZjNDYsIDB4ZmUxYjM2MjgsIDB4MDAwY2JlZjcsIDB4MDAzMzI4MWEsIDB4ZmZmNGQwZGUsCi0gICAgICAgIDB4M2Y4NDdmODMsIDB4ZjVhY2EyMWYsIDB4ZmMwMGViMWIsIDB4MDRlNzZkYTMsIDB4ZmUxODY5NmEsIDB4MDAxMGFlNmUsIDB4MDAzMWM4M2EsIDB4ZmZmNGZmNWQsCi0gICAgICAgIDB4M2VlMWJkYTIsIDB4ZjU2ODhjNmQsIDB4ZmMzMTlkMTMsIDB4MDRkOTk3ZDgsIDB4ZmUxNWQzMmYsIDB4MDAxNDhiYmQsIDB4MDAzMDZhM2IsIDB4ZmZmNTJlNTcsCi0gICAgICAgIDB4M2UzZGVlMTMsIDB4ZjUyNjM2NjUsIDB4ZmM2MjFiOWEsIDB4MDRjYjdjZjIsIDB4ZmUxMzczMDQsIDB4MDAxODU2YzcsIDB4MDAyZjBlM2YsIDB4ZmZmNTVkYmYsCi0gICAgICAgIDB4M2Q5OTE5MzIsIDB4ZjRlNTlmOGEsIDB4ZmM5MjYzMTksIDB4MDRiZDFlZmIsIDB4ZmUxMTQ4NzIsIDB4MDAxYzBmNmUsIDB4MDAyZGI0NjYsIDB4ZmZmNThkODksCi0gICAgICAgIDB4M2NmMzQ3NjYsIDB4ZjRhNmM3NDgsIDB4ZmNjMjcwMDgsIDB4MDRhZTgwMDAsIDB4ZmUwZjUyZmMsIDB4MDAxZmI1OTksIDB4MDAyYzVjZDAsIDB4ZmZmNWJkYWEsCi0gICAgICAgIDB4M2M0YzgxMWMsIDB4ZjQ2OWFjZWQsIDB4ZmNmMjNlZWMsIDB4MDQ5ZmEyMGYsIDB4ZmUwZDkyMjQsIDB4MDAyMzQ5MmYsIDB4MDAyYjA3OWEsIDB4ZmZmNWVlMTcsCi0gICAgICAgIDB4M2JhNGNlYzksIDB4ZjQyZTRmYWYsIDB4ZmQyMWNjNTksIDB4MDQ5MDg3MzMsIDB4ZmUwYzA1NjcsIDB4MDAyNmNhMWMsIDB4MDAyOWI0ZTQsIDB4ZmZmNjFlYzUsCi0gICAgICAgIDB4M2FmYzM4ZWIsIDB4ZjNmNGFlYTYsIDB4ZmQ1MTE0ZjAsIDB4MDQ4MTMxN2EsIDB4ZmUwYWFjM2YsIDB4MDAyYTM4NGMsIDB4MDAyODY0YzksIDB4ZmZmNjRmYTgsCi0gICAgICAgIDB4M2E1MmM4MDUsIDB4ZjNiY2M4ZDMsIDB4ZmQ4MDE1NjQsIDB4MDQ3MWEyZWYsIDB4ZmUwOTg2MjIsIDB4MDAyZDkzYWUsIDB4MDAyNzE3NjYsIDB4ZmZmNjgwYjUsCi0gICAgICAgIDB4MzlhODg0YTEsIDB4ZjM4NjlkMWEsIDB4ZmRhZWNhNzMsIDB4MDQ2MWRkYTAsIDB4ZmUwODkyODMsIDB4MDAzMGRjMzQsIDB4MDAyNWNjZDcsIDB4ZmZmNmIxZTQsCi0gICAgICAgIDB4MzhmZDc3NGUsIDB4ZjM1MjJhNDksIDB4ZmRkZDMwZWIsIDB4MDQ1MWUzOTYsIDB4ZmUwN2QwZDMsIDB4MDAzNDExZDIsIDB4MDAyNDg1MzUsIDB4ZmZmNmUzMjksCi0gICAgICAgIDB4Mzg1MWE4YTIsIDB4ZjMxZjZmMGYsIDB4ZmUwYjQ1YWEsIDB4MDQ0MWI2ZGQsIDB4ZmUwNzQwN2QsIDB4MDAzNzM0N2QsIDB4MDAyMzQwOWEsIDB4ZmZmNzE0N2EsCi0gICAgICAgIDB4MzdhNTIxMzUsIDB4ZjJlZTZhMDcsIDB4ZmUzOTA1OWIsIDB4MDQzMTU5N2QsIDB4ZmUwNmUwZWIsIDB4MDAzYTQ0MmUsIDB4MDAyMWZmMWYsIDB4ZmZmNzQ1Y2QsCi0gICAgICAgIDB4MzZmN2U5YTQsIDB4ZjJiZjE5YWUsIDB4ZmU2NjZkYmMsIDB4MDQyMGNkODAsIDB4ZmUwNmIxODQsIDB4MDAzZDQwZTAsIDB4MDAyMGMwZGMsIDB4ZmZmNzc3MWEsCi0gICAgICAgIDB4MzY0YTBhOTAsIDB4ZjI5MTdjNmQsIDB4ZmU5MzdiMTUsIDB4MDQxMDE0ZWIsIDB4ZmUwNmIxYWMsIDB4MDA0MDJhOGUsIDB4MDAxZjg1ZTYsIDB4ZmZmN2E4NTcsCi0gICAgICAgIDB4MzU5YjhjOWQsIDB4ZjI2NTkwOGYsIDB4ZmVjMDJhYzIsIDB4MDNmZjMxYzMsIDB4ZmUwNmUwYzQsIDB4MDA0MzAxMzcsIDB4MDAxZTRlNTYsIDB4ZmZmN2Q5N2EsCi0gICAgICAgIDB4MzRlYzc4NmYsIDB4ZjIzYjU0NGIsIDB4ZmVlYzc5ZWMsIDB4MDNlZTI2MGQsIDB4ZmUwNzNlMmEsIDB4MDA0NWM0ZGQsIDB4MDAxZDFhM2YsIDB4ZmZmODBhN2MsCi0gICAgICAgIDB4MzQzY2Q2YWYsIDB4ZjIxMmM1YmUsIDB4ZmYxODY1Y2QsIDB4MDNkY2YzY2EsIDB4ZmUwN2M5M2EsIDB4MDA0ODc1ODIsIDB4MDAxYmU5YjcsIDB4ZmZmODNiNTIsCi0gICAgICAgIDB4MzM4Y2IwMDQsIDB4ZjFlYmUyZWMsIDB4ZmY0M2ViYWMsIDB4MDNjYjljZjksIDB4ZmUwODgxNGUsIDB4MDA0YjEzMmIsIDB4MDAxYWJjZDAsIDB4ZmZmODZiZjYsCi0gICAgICAgIDB4MzJkYzBkMTcsIDB4ZjFjNmE5YzMsIDB4ZmY2ZjA4ZTQsIDB4MDNiYTIzOTgsIDB4ZmUwOTY1YmMsIDB4MDA0ZDlkZGUsIDB4MDAxOTkzOWQsIDB4ZmZmODljNjAsCi0gICAgICAgIDB4MzIyYWY2OTMsIDB4ZjFhMzE4MWEsIDB4ZmY5OWJhZGIsIDB4MDNhODg5YTEsIDB4ZmUwYTc1ZGEsIDB4MDA1MDE1YTUsIDB4MDAxODZlMzEsIDB4ZmZmOGNjODYsCi0gICAgICAgIDB4MzE3OTc1MWYsIDB4ZjE4MTJiYjAsIDB4ZmZjM2ZmMGMsIDB4MDM5NmQxMGMsIDB4ZmUwYmIwZjksIDB4MDA1MjdhOGEsIDB4MDAxNzRjOWMsIDB4ZmZmOGZjNjIsCi0gICAgICAgIDB4MzBjNzkxNjMsIDB4ZjE2MGUyMmQsIDB4ZmZlZGQyZmQsIDB4MDM4NGZiZDEsIDB4ZmUwZDE2NmIsIDB4MDA1NGNjOWEsIDB4MDAxNjJlZWYsIDB4ZmZmOTJiZWMsCi0gICAgICAgIDB4MzAxNTU0MDQsIDB4ZjE0MjM5MjQsIDB4MDAxNzM0NDcsIDB4MDM3MzBiZTAsIDB4ZmUwZWE1N2UsIDB4MDA1NzBiZTQsIDB4MDAxNTE1MzgsIDB4ZmZmOTViMWUsCi0gICAgICAgIDB4MmY2MmM1YTcsIDB4ZjEyNTJlMGYsIDB4MDA0MDIwOTIsIDB4MDM2MTAzMmEsIDB4ZmUxMDVkN2UsIDB4MDA1OTM4NzcsIDB4MDAxM2ZmODgsIDB4ZmZmOTg5ZWYsCi0gICAgICAgIDB4MmVhZmVlZWQsIDB4ZjEwOWJlNTYsIDB4MDA2ODk1OTgsIDB4MDM0ZWUzOWIsIDB4ZmUxMjNkYjYsIDB4MDA1YjUyNjcsIDB4MDAxMmVkZWEsIDB4ZmZmOWI4NWIsCi0gICAgICAgIDB4MmRmY2Q4NzMsIDB4ZjBlZmU3NDgsIDB4MDA5MDkxMWYsIDB4MDMzY2FmMWQsIDB4ZmUxNDQ1NzAsIDB4MDA1ZDU5YzYsIDB4MDAxMWUwNmQsIDB4ZmZmOWU2NWEsCi0gICAgICAgIDB4MmQ0OThhZDMsIDB4ZjBkN2E2MjIsIDB4MDBiODExMDIsIDB4MDMyYTY3OTYsIDB4ZmUxNjczZjIsIDB4MDA1ZjRlYWMsIDB4MDAxMGQ3MWQsIDB4ZmZmYTEzZTUsCi0gICAgICAgIDB4MmM5NjBlYTMsIDB4ZjBjMGY4MDgsIDB4MDBkZjEzMjgsIDB4MDMxODBlZTcsIDB4ZmUxOGM4ODQsIDB4MDA2MTMxMmUsIDB4MDAwZmQyMDUsIDB4ZmZmYTQwZjgsCi0gICAgICAgIDB4MmJlMjZjNzMsIDB4ZjBhYmRhMGUsIDB4MDEwNTk1OGMsIDB4MDMwNWE2ZjAsIDB4ZmUxYjQyNjgsIDB4MDA2MzAxNjcsIDB4MDAwZWQxMzAsIDB4ZmZmYTZkOGQsCi0gICAgICAgIDB4MmIyZWFjY2YsIDB4ZjA5ODQ5MzEsIDB4MDEyYjk2MzUsIDB4MDJmMzMxOGEsIDB4ZmUxZGUwZTIsIDB4MDA2NGJmNzEsIDB4MDAwZGQ0YTcsIDB4ZmZmYTk5OWQsCi0gICAgICAgIDB4MmE3YWQ4M2MsIDB4ZjA4NjQyNWEsIDB4MDE1MTEzM2UsIDB4MDJlMGIwOGQsIDB4ZmUyMGEzMzUsIDB4MDA2NjZiNjgsIDB4MDAwY2RjNzQsIDB4ZmZmYWM1MjUsCi0gICAgICAgIDB4MjljNmY3MzgsIDB4ZjA3NWMyNjAsIDB4MDE3NjBhZDEsIDB4MDJjZTI1Y2EsIDB4ZmUyMzg4YTEsIDB4MDA2ODA1NmIsIDB4MDAwYmU4OWYsIDB4ZmZmYWYwMWUsCi0gICAgICAgIDB4MjkxMzEyM2MsIDB4ZjA2NmM2MDYsIDB4MDE5YTdiMjcsIDB4MDJiYjkzMTAsIDB4ZmUyNjkwNjUsIDB4MDA2OThkOTgsIDB4MDAwYWY5MzEsIDB4ZmZmYjFhODQsCi0gICAgICAgIDB4Mjg1ZjMxYjcsIDB4ZjA1OTQ5ZmIsIDB4MDFiZTYyOGMsIDB4MDJhOGZhMmEsIDB4ZmUyOWI5YzEsIDB4MDA2YjA0MTEsIDB4MDAwYTBlMmYsIDB4ZmZmYjQ0NTMsCi0gICAgICAgIDB4MjdhYjVlMTIsIDB4ZjA0ZDRhZGUsIDB4MDFlMWJmNTgsIDB4MDI5NjVjZGIsIDB4ZmUyZDAzZjIsIDB4MDA2YzY4ZjgsIDB4MDAwOTI3YTAsIDB4ZmZmYjZkODYsCi0gICAgICAgIDB4MjZmNzlmYWIsIDB4ZjA0MmM1MzksIDB4MDIwNDhmZjgsIDB4MDI4M2JjZTYsIDB4ZmUzMDZlMzUsIDB4MDA2ZGJjNzEsIDB4MDAwODQ1ODksIDB4ZmZmYjk2MWEsCi0gICAgICAgIDB4MjY0M2ZlZGEsIDB4ZjAzOWI1ODcsIDB4MDIyNmQyZTYsIDB4MDI3MTFjMDUsIDB4ZmUzM2Y3YzcsIDB4MDA2ZWZlYTAsIDB4MDAwNzY3ZjAsIDB4ZmZmYmJlMDksCi0gICAgICAgIDB4MjU5MDgzZWIsIDB4ZjAzMjE4MmYsIDB4MDI0ODg2YWQsIDB4MDI1ZTdiZjAsIDB4ZmUzNzlmZTMsIDB4MDA3MDJmYWUsIDB4MDAwNjhlZDgsIDB4ZmZmYmU1NTIsCi0gICAgICAgIDB4MjRkZDM3MjEsIDB4ZjAyYmU5OGEsIDB4MDI2OWE5ZTksIDB4MDI0YmRlNWEsIDB4ZmUzYjY1YzQsIDB4MDA3MTRmYzAsIDB4MDAwNWJhNDYsIDB4ZmZmYzBiZWYsCi0gICAgICAgIDB4MjQyYTIwYjMsIDB4ZjAyNzI1ZGMsIDB4MDI4YTNiNDQsIDB4MDIzOTQ0ZWUsIDB4ZmUzZjQ4YTUsIDB4MDA3MjVmMDIsIDB4MDAwNGVhM2EsIDB4ZmZmYzMxZGYsCi0gICAgICAgIDB4MjM3NzQ4Y2YsIDB4ZjAyM2M5NWQsIDB4MDJhYTM5N2IsIDB4MDIyNmIxNTYsIDB4ZmU0MzQ3YzAsIDB4MDA3MzVkOWMsIDB4MDAwNDFlYjksIDB4ZmZmYzU3MWUsCi0gICAgICAgIDB4MjJjNGI3OTUsIDB4ZjAyMWQwMzEsIDB4MDJjOWEzNTksIDB4MDIxNDI1MzMsIDB4ZmU0NzYyNTAsIDB4MDA3NDRiYmEsIDB4MDAwMzU3YzIsIDB4ZmZmYzdiYTksCi0gICAgICAgIDB4MjIxMjc1MWEsIDB4ZjAyMTM2NzEsIDB4MDJlODc3YjksIDB4MDIwMWEyMjMsIDB4ZmU0Yjk3OGUsIDB4MDA3NTI5OGEsIDB4MDAwMjk1NTgsIDB4ZmZmYzlmN2UsCi0gICAgICAgIDB4MjE2MDg5NjgsIDB4ZjAyMWY4MjMsIDB4MDMwNmI1ODYsIDB4MDFlZjI5YmUsIDB4ZmU0ZmU2YjMsIDB4MDA3NWY3MzksIDB4MDAwMWQ3NzksIDB4ZmZmY2MyOWEsCi0gICAgICAgIDB4MjBhZWZjNzksIDB4ZjAyNDExNDAsIDB4MDMyNDViYmMsIDB4MDFkY2JkOTYsIDB4ZmU1NDRlZmIsIDB4MDA3NmI0ZjUsIDB4MDAwMTFlMjYsIDB4ZmZmY2U0ZmMsCi0gICAgICAgIDB4MWZmZGQ2M2IsIDB4ZjAyNzdkYjEsIDB4MDM0MTY5NjYsIDB4MDFjYTVmMzcsIDB4ZmU1OGNmOWQsIDB4MDA3NzYyZjAsIDB4MDAwMDY5NWUsIDB4ZmZmZDA2YTEsCi0gICAgICAgIDB4MWY0ZDFlOGUsIDB4ZjAyYzM5NTMsIDB4MDM1ZGRkOWUsIDB4MDFiODEwMjgsIDB4ZmU1ZDY3ZDQsIDB4MDA3ODAxNWEsIDB4ZmZmZmI5MWYsIDB4ZmZmZDI3ODcsCi0gICAgICAgIDB4MWU5Y2RkNDMsIDB4ZjAzMjNmZjUsIDB4MDM3OWI3OTAsIDB4MDFhNWQxZWEsIDB4ZmU2MjE2ZGIsIDB4MDA3ODkwNjUsIDB4ZmZmZjBkNjYsIDB4ZmZmZDQ3YWUsCi0gICAgICAgIDB4MWRlZDFhMWQsIDB4ZjAzOThkNTYsIDB4MDM5NGY2NzQsIDB4MDE5M2E1ZjksIDB4ZmU2NmRiZWIsIDB4MDA3OTEwNDMsIDB4ZmZmZTY2MzEsIDB4ZmZmZDY3MTMsCisjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXJTaW5jRG93bi5oIgogfTsKIAogLy8gd2UgdXNlIDE1IGJpdHMgdG8gaW50ZXJwb2xhdGUgYmV0d2VlbiB0aGVzZSBzYW1wbGVzCkBAIC01MTIsNyArMjU2LDcgQEAKICAgICBtVm9sdW1lU0lNRFsxXSA9IHU0XzI4X2Zyb21fZmxvYXQoY2xhbXBGbG9hdFZvbChyaWdodCkpOwogfQogCi12b2lkIEF1ZGlvUmVzYW1wbGVyU2luYzo6cmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKK3NpemVfdCBBdWRpb1Jlc2FtcGxlclNpbmM6OnJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcikKIHsKICAgICAvLyBGSVhNRSBzdG9yZSBjdXJyZW50IHN0YXRlICh1cCBvciBkb3duIHNhbXBsZSkgYW5kIG9ubHkgbG9hZCB0aGUgY29lZnMgd2hlbiB0aGUgc3RhdGUKQEAgLTUyMSwyMyArMjY1LDI1IEBACiAgICAgaWYgKG1Db25zdGFudHMgPT0gJnZlcnlIaWdoUXVhbGl0eUNvbnN0YW50cyAmJiByZWFkUmVzYW1wbGVDb2VmZmljaWVudHMpIHsKICAgICAgICAgbUZpckNvZWZzID0gcmVhZFJlc2FtcGxlQ29lZmZpY2llbnRzKCBtSW5TYW1wbGVSYXRlIDw9IG1TYW1wbGVSYXRlICk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbUZpckNvZWZzID0gKGNvbnN0IGludDMyX3QgKikgKChtSW5TYW1wbGVSYXRlIDw9IG1TYW1wbGVSYXRlKSA/IG1GaXJDb2Vmc1VwIDogbUZpckNvZWZzRG93bik7CisgICAgICAgIG1GaXJDb2VmcyA9IChjb25zdCBpbnQzMl90ICopCisgICAgICAgICAgICAgICAgKChtSW5TYW1wbGVSYXRlIDw9IG1TYW1wbGVSYXRlKSA/IG1GaXJDb2Vmc1VwIDogbUZpckNvZWZzRG93bik7CiAgICAgfQogCiAgICAgLy8gc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSByZXNhbXBsZXIKICAgICBzd2l0Y2ggKG1DaGFubmVsQ291bnQpIHsKICAgICBjYXNlIDE6Ci0gICAgICAgIHJlc2FtcGxlPDE+KG91dCwgb3V0RnJhbWVDb3VudCwgcHJvdmlkZXIpOwotICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIHJlc2FtcGxlPDE+KG91dCwgb3V0RnJhbWVDb3VudCwgcHJvdmlkZXIpOwogICAgIGNhc2UgMjoKLSAgICAgICAgcmVzYW1wbGU8Mj4ob3V0LCBvdXRGcmFtZUNvdW50LCBwcm92aWRlcik7Ci0gICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gcmVzYW1wbGU8Mj4ob3V0LCBvdXRGcmFtZUNvdW50LCBwcm92aWRlcik7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiaW52YWxpZCBjaGFubmVsIGNvdW50OiAlZCIsIG1DaGFubmVsQ291bnQpOworICAgICAgICByZXR1cm4gMDsKICAgICB9CiB9CiAKIAogdGVtcGxhdGU8aW50IENIQU5ORUxTPgotdm9pZCBBdWRpb1Jlc2FtcGxlclNpbmM6OnJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCitzaXplX3QgQXVkaW9SZXNhbXBsZXJTaW5jOjpyZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcikKIHsKICAgICBjb25zdCBDb25zdGFudHMmIGMoKm1Db25zdGFudHMpOwpAQCAtNjEyLDYgKzM1OCw3IEBACiAgICAgbUltcHVsc2UgPSBpbXB1bHNlOwogICAgIG1JbnB1dEluZGV4ID0gaW5wdXRJbmRleDsKICAgICBtUGhhc2VGcmFjdGlvbiA9IHBoYXNlRnJhY3Rpb247CisgICAgcmV0dXJuIG91dHB1dEluZGV4IC8gQ0hBTk5FTFM7CiB9CiAKIHRlbXBsYXRlPGludCBDSEFOTkVMUz4KQEAgLTg1Niw0ICs2MDMsNCBAQAogICAgIH0KIH0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmgKaW5kZXggNDY5MWQwYS4uMGZiZWFjOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuaApAQCAtMzksNyArMzksNyBAQAogCiAgICAgdmlydHVhbCB+QXVkaW9SZXNhbXBsZXJTaW5jKCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgcmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKKyAgICB2aXJ0dWFsIHNpemVfdCByZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpOwogcHJpdmF0ZToKICAgICB2b2lkIGluaXQoKTsKQEAgLTQ3LDcgKzQ3LDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKIAogICAgIHRlbXBsYXRlPGludCBDSEFOTkVMUz4KLSAgICB2b2lkIHJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCisgICAgc2l6ZV90IHJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7CiAKICAgICB0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFM+CkBAIC05NSw2ICs5NSw2IEBACiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLypBTkRST0lEX0FVRElPX1JFU0FNUExFUl9TSU5DX0gqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luY0Rvd24uaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmNEb3duLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQwZmI4NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmNEb3duLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8vIGNtZC1saW5lOiBmaXIgLWwgNyAtczQ4MDAwIC1jIDE3MTg5CisKKyAgICAweDViYWNiNmY0LCAweDFkZWQxYTFkLCAweGYwMzk4ZDU2LCAweDAzOTRmNjc0LCAweDAxOTNhNWY5LCAweGZlNjZkYmViLCAweDAwNzkxMDQzLCAweGZmZmU2NjMxLAorICAgIDB4NWJhYjZjODEsIDB4MWQzZGRjY2QsIDB4ZjA0MjFkMmMsIDB4MDNhZjk5OTUsIDB4MDE4MThkYzksIDB4ZmU2YmI2M2UsIDB4MDA3OTgxMmEsIDB4ZmZmZGMzN2QsCisgICAgMHg1YmE3OGQzNywgMHgxYzhmMmNmOSwgMHhmMDRiZWIxZCwgMHgwM2M5YTA0YSwgMHgwMTZmOGFjYSwgMHhmZTcwYTUxMSwgMHgwMDc5ZTM0ZCwgMHhmZmZkMjU0NSwKKyAgICAweDViYTExOTRmLCAweDFiZTExMjMxLCAweGYwNTZmMmM3LCAweDAzZTMwOWZlLCAweDAxNWQ5ZTY0LCAweGZlNzVhNzlmLCAweDAwN2EzNmUyLCAweGZmZmM4Yjg2LAorICAgIDB4NWI5ODExMjIsIDB4MWIzMzkzZjgsIDB4ZjA2MzJmYjcsIDB4MDNmYmQ2MjUsIDB4MDE0YmM5ZmEsIDB4ZmU3YWJkMjMsIDB4MDA3YTdjMjAsIDB4ZmZmYmY2MzksCisgICAgMHg1YjhjNzUzMCwgMHgxYTg2YjliZiwgMHhmMDcwOWQ3NCwgMHgwNDE0MDQ0OSwgMHgwMTNhMGVlOSwgMHhmZTdmZTRkYiwgMHgwMDdhYjMzZCwgMHhmZmZiNjU1YiwKKyAgICAweDViN2U0NjFhLCAweDE5ZGE4YWU1LCAweGYwN2YzNzc2LCAweDA0MmI5M2ZkLCAweDAxMjg2ZTg2LCAweGZlODUxZTA1LCAweDAwN2FkYzcyLCAweGZmZmFkOGU0LAorICAgIDB4NWI2ZDg0YTgsIDB4MTkyZjBlYjcsIDB4ZjA4ZWY5MmQsIDB4MDQ0Mjg0ZTYsIDB4MDExNmVhMjIsIDB4ZmU4YTY3ZGQsIDB4MDA3YWY3ZjYsIDB4ZmZmYTUwY2UsCisgICAgMHg1YjVhMzFjNiwgMHgxODg0NGM3MCwgMHhmMDlmZGRmZSwgMHgwNDU4ZDZiNywgMHgwMTA1ODMwNiwgMHhmZThmYzFhNSwgMHgwMDdiMDYwMywgMHhmZmY5Y2QxMiwKKyAgICAweDViNDQ0ZTgxLCAweDE3ZGE0YjM3LCAweGYwYjFlMTQzLCAweDA0NmU4OTMzLCAweDAwZjQzYTc0LCAweGZlOTUyYTliLCAweDAwN2IwNmQ0LCAweGZmZjk0ZGE5LAorICAgIDB4NWIyYmRjMGUsIDB4MTczMTEyMjIsIDB4ZjBjNGZlNTAsIDB4MDQ4MzljMjksIDB4MDBlMzExYTksIDB4ZmU5YWEyMDEsIDB4MDA3YWZhYTEsIDB4ZmZmOGQyOGMsCisgICAgMHg1YjEwZGJjMiwgMHgxNjg4YTgzMiwgMHhmMGQ5MzA2ZCwgMHgwNDk4MGY3OSwgMHgwMGQyMDlkYiwgMHhmZWEwMjcxOSwgMHgwMDdhZTFhNywgMHhmZmY4NWJiMSwKKyAgICAweDVhZjM0ZjE4LCAweDE1ZTExNDUzLCAweGYwZWU3MmRiLCAweDA0YWJlMzEwLCAweDAwYzEyNDM5LCAweGZlYTViOTI2LCAweDAwN2FiYzIwLCAweGZmZjdlOTEwLAorICAgIDB4NWFkMzM3YWYsIDB4MTUzYTVkNWUsIDB4ZjEwNGMwZDIsIDB4MDRiZjE2ZTksIDB4MDBiMDYxZWIsIDB4ZmVhYjU3NmQsIDB4MDA3YThhNDksIDB4ZmZmNzdhOWYsCisgICAgMHg1YWIwOTc0OCwgMHgxNDk0OGExNiwgMHhmMTFjMTU4MywgMHgwNGQxYWIwZCwgMHgwMDlmYzQxMywgMHhmZWIxMDEzNCwgMHgwMDdhNGM1ZCwgMHhmZmY3MTA1NywKKyAgICAweDVhOGI2ZmM3LCAweDEzZWZhMTJjLCAweGYxMzQ2YzE3LCAweDA0ZTM5ZjkzLCAweDAwOGY0YmNiLCAweGZlYjZiNWMwLCAweDAwN2EwMjlhLCAweGZmZjZhYTJiLAorICAgIDB4NWE2M2MzMzYsIDB4MTM0YmE5MzcsIDB4ZjE0ZGJmYjEsIDB4MDRmNGY0YTIsIDB4MDA3ZWZhMjksIDB4ZmViYzc0NWMsIDB4MDA3OWFkM2QsIDB4ZmZmNjQ4MTIsCisgICAgMHg1YTM5OTNjMCwgMHgxMmE4YThiYiwgMHhmMTY4MGI2ZSwgMHgwNTA1YWE2YSwgMHgwMDZlZDAzOCwgMHhmZWMyM2M1MCwgMHgwMDc5NGM4MiwgMHhmZmY1ZWEwMiwKKyAgICAweDVhMGNlM2IyLCAweDEyMDZhNjI1LCAweGYxODM0YTYzLCAweDA1MTVjMTJkLCAweDAwNWVjZjAxLCAweGZlYzgwY2U4LCAweDAwNzhlMGE5LCAweGZmZjU4ZmYwLAorICAgIDB4NTlkZGI1N2YsIDB4MTE2NWE3Y2MsIDB4ZjE5Zjc3YTAsIDB4MDUyNTM5MzgsIDB4MDA0ZWY3ODIsIDB4ZmVjZGU1NzEsIDB4MDA3ODY5ZWUsIDB4ZmZmNTM5Y2YsCisgICAgMHg1OWFjMGJiYSwgMHgxMGM1YjNlZiwgMHhmMWJjOGUzMSwgMHgwNTM0MTJlNCwgMHgwMDNmNGFiNCwgMHhmZWQzYzUzOCwgMHgwMDc3ZTg5MSwgMHhmZmY0ZTc5NCwKKyAgICAweDU5NzdlOTE5LCAweDEwMjZkMGI4LCAweGYxZGE4OTFiLCAweDA1NDI0ZTliLCAweDAwMmZjOThhLCAweGZlZDlhYjhmLCAweDAwNzc1Y2NmLCAweGZmZjQ5OTM0LAorICAgIDB4NTk0MTUwNzUsIDB4MGY4OTA0MzcsIDB4ZjFmOTYzNjAsIDB4MDU0ZmVjY2YsIDB4MDAyMDc0ZWQsIDB4ZmVkZjk3YzYsIDB4MDA3NmM2ZTgsIDB4ZmZmNDRlYTMsCisgICAgMHg1OTA4NDRjOSwgMHgwZWVjNTQ2NSwgMHhmMjE5MTdmZiwgMHgwNTVjZWUwMywgMHgwMDExNGRjMywgMHhmZWU1ODkzMiwgMHgwMDc2MjcxOSwgMHhmZmY0MDdkMiwKKyAgICAweDU4Y2NjOTMwLCAweDBlNTBjNzIzLCAweGYyMzlhMWVmLCAweDA1Njk1MmMzLCAweDAwMDI1NGU4LCAweGZlZWI3ZjI3LCAweDAwNzU3ZGEzLCAweGZmZjNjNGI3LAorICAgIDB4NTg4ZWUwZWEsIDB4MGRiNjYyM2IsIDB4ZjI1YWZjMjksIDB4MDU3NTFiYWEsIDB4ZmZmMzhiMzIsIDB4ZmVmMTc4ZmMsIDB4MDA3NGNhYzQsIDB4ZmZmMzg1NDIsCisgICAgMHg1ODRlOGY1NiwgMHgwZDFkMmI1ZCwgMHhmMjdkMjE5ZiwgMHgwNTgwNDk1YywgMHhmZmU0ZjE3MSwgMHhmZWY3NzYwYywgMHgwMDc0MGViYiwgMHhmZmYzNDk2OCwKKyAgICAweDU4MGJkN2Y0LCAweDBjODUyODFmLCAweGYyYTAwZDQzLCAweDA1OGFkYzhkLCAweGZmZDY4ODZkLCAweGZlZmQ3NWFmLCAweDAwNzM0OWM3LCAweGZmZjMxMTFiLAorICAgIDB4NTdjNmJlNjcsIDB4MGJlZTVkZmYsIDB4ZjJjM2JhMDQsIDB4MDU5NGQ1ZmEsIDB4ZmZjODUwZTYsIDB4ZmYwMzc3NDQsIDB4MDA3MjdjMjcsIDB4ZmZmMmRjNGMsCisgICAgMHg1NzdmNDY3MCwgMHgwYjU4ZDI2MiwgMHhmMmU4MjJjZSwgMHgwNTllMzY2YywgMHhmZmJhNGI5OCwgMHhmZjA5N2EyOSwgMHgwMDcxYTYxYiwgMHhmZmYyYWFlZiwKKyAgICAweDU3MzU3M2YyLCAweDBhYzQ4YTkyLCAweGYzMGQ0MjhlLCAweDA1YTZmZWI5LCAweGZmYWM3OTM2LCAweGZmMGY3ZGJmLCAweDAwNzBjN2UxLCAweGZmZjI3Y2YzLAorICAgIDB4NTZlOTRhZjEsIDB4MGEzMThiYzEsIDB4ZjMzMzE0MmYsIDB4MDVhZjJmYmYsIDB4ZmY5ZWRhNmQsIDB4ZmYxNTgxNmEsIDB4MDA2ZmUxYjgsIDB4ZmZmMjUyNGMsCisgICAgMHg1NjlhY2Y5MCwgMHgwOTlmZGIwNCwgMHhmMzU5OTI5YSwgMHgwNWI2Y2E2YiwgMHhmZjkxNmZlMSwgMHhmZjFiODQ4ZSwgMHgwMDZlZjNkZiwgMHhmZmYyMmFlYSwKKyAgICAweDU2NGEwNjEwLCAweDA5MGY3ZDU3LCAweGYzODBiOGJhLCAweDA1YmRjZmIyLCAweGZmODQzYTMyLCAweGZmMjE4NjkyLCAweDAwNmRmZTk0LCAweGZmZjIwNmJmLAorICAgIDB4NTVmNmYyZDMsIDB4MDg4MDc3OWQsIDB4ZjNhODgxNzksIDB4MDVjNDQwOTUsIDB4ZmY3NzM5ZjcsIDB4ZmYyNzg2ZTEsIDB4MDA2ZDAyMTcsIDB4ZmZmMWU1YmIsCisgICAgMHg1NWExOWE1YywgMHgwN2YyY2U5YiwgMHhmM2QwZTdjMiwgMHgwNWNhMWUxZiwgMHhmZjZhNmZjMSwgMHhmZjJkODRlNSwgMHgwMDZiZmVhNCwgMHhmZmYxYzdkMCwKKyAgICAweDU1NGEwMTQ4LCAweDA3NjY4NmZjLCAweGYzZjllNjgwLCAweDA1Y2Y2OTY1LCAweGZmNWRkYzFhLCAweGZmMzM4MDBlLCAweDAwNmFmNDdiLCAweGZmZjFhY2VmLAorICAgIDB4NTRmMDJjNTYsIDB4MDZkYmE1NTEsIDB4ZjQyMzc4YTAsIDB4MDVkNDIzODcsIDB4ZmY1MTdmODYsIDB4ZmYzOTc3Y2IsIDB4MDA2OWUzZDksIDB4ZmZmMTk1MDgsCisgICAgMHg1NDk0MjA2MSwgMHgwNjUyMmUwZiwgMHhmNDRkOTkxMiwgMHgwNWQ4NGRhZiwgMHhmZjQ1NWE4MCwgMHhmZjNmNmI4ZiwgMHgwMDY4Y2NmYSwgMHhmZmYxODAwYiwKKyAgICAweDU0MzVlMjYzLCAweDA1Y2EyNThmLCAweGY0Nzg0MmM1LCAweDA1ZGJlOTBmLCAweGZmMzk2ZDdmLCAweGZmNDU1YWNmLCAweDAwNjdiMDFlLCAweGZmZjE2ZGU5LAorICAgIDB4NTNkNTc3NzQsIDB4MDU0MzkwMGQsIDB4ZjRhMzcwYWQsIDB4MDVkZWY2ZTQsIDB4ZmYyZGI4ZjIsIDB4ZmY0YjQ1MDMsIDB4MDA2NjhkODAsIDB4ZmZmMTVlOTMsCisgICAgMHg1MzcyZTRjNiwgMHgwNGJlNzFhYiwgMHhmNGNmMWRiZiwgMHgwNWUxNzg3MywgMHhmZjIyM2Q0MCwgMHhmZjUxMjlhMywgMHgwMDY1NjU1ZCwgMHhmZmYxNTFmOSwKKyAgICAweDUzMGUyZmFjLCAweDA0M2FjZTZlLCAweGY0ZmI0NGY0LCAweDA1ZTM2ZjBkLCAweGZmMTZmYWNhLCAweGZmNTcwODJlLCAweDAwNjQzN2YxLCAweGZmZjE0ODBiLAorICAgIDB4NTJhNzVkOTAsIDB4MDNiOGFhNDAsIDB4ZjUyN2UxNDksIDB4MDVlNGRjMDgsIDB4ZmYwYmYxZWQsIDB4ZmY1Y2UwMjEsIDB4MDA2MzA1NzcsIDB4ZmZmMTQwYjksCisgICAgMHg1MjNlNzNmZCwgMHgwMzM4MDhlYiwgMHhmNTU0ZWRiZCwgMHgwNWU1YzBjNiwgMHhmZjAxMjJmYywgMHhmZjYyYjBmZCwgMHgwMDYxY2UyYywgMHhmZmYxM2JmMywKKyAgICAweDUxZDM3ODk3LCAweDAyYjhlZTIyLCAweGY1ODI2NTU1LCAweDA1ZTYxZWFlLCAweGZlZjY4ZTQ1LCAweGZmNjg3YTQ3LCAweDAwNjA5MjQ5LCAweGZmZjEzOWFhLAorICAgIDB4NTE2NjcxMWMsIDB4MDIzYjVkNzYsIDB4ZjViMDQzMWEsIDB4MDVlNWY3MzMsIDB4ZmVlYzM0MGYsIDB4ZmY2ZTNiODQsIDB4MDA1ZjUyMGEsIDB4ZmZmMTM5Y2QsCisgICAgMHg1MGY3NjM2OCwgMHgwMWJmNWE1ZSwgMHhmNWRlODIxOCwgMHgwNWU1NGJjZCwgMHhmZWUyMTQ5YiwgMHhmZjczZjQzZCwgMHgwMDVlMGRhOCwgMHhmZmYxM2M0YywKKyAgICAweDUwODY1NTZmLCAweDAxNDRlODM0LCAweGY2MGQxZDYzLCAweDA1ZTQxZGZlLCAweGZlZDgzMDIzLCAweGZmNzlhM2ZlLCAweDAwNWNjNTVjLCAweGZmZjE0MTE5LAorICAgIDB4NTAxMzRkM2UsIDB4MDBjYzBhMzYsIDB4ZjYzYzEwMTIsIDB4MDVlMjZmNGUsIDB4ZmVjZTg2ZGIsIDB4ZmY3ZjRhNTQsIDB4MDA1Yjc5NjEsIDB4ZmZmMTQ4MjEsCisgICAgMHg0ZjllNTBmZiwgMHgwMDU0YzM4MiwgMHhmNjZiNTU0NCwgMHgwNWUwNDE0ZCwgMHhmZWM1MThmMSwgMHhmZjg0ZTZkMCwgMHgwMDVhMjllZCwgMHhmZmYxNTE1NiwKKyAgICAweDRmMjc2NmYyLCAweGZmZGYxNzFiLCAweGY2OWFlODFkLCAweDA1ZGQ5NTkzLCAweGZlYmJlNjhjLCAweGZmOGE3OTA1LCAweDAwNThkNzM4LCAweGZmZjE1Y2E4LAorICAgIDB4NGVhZTk1NzEsIDB4ZmY2YjA3ZTcsIDB4ZjZjYWMzYzcsIDB4MDVkYTZkYmUsIDB4ZmViMmVmY2QsIDB4ZmY5MDAwODksIDB4MDA1NzgxN2IsIDB4ZmZmMTZhMDcsCisgICAgMHg0ZTMzZTJlZSwgMHhmZWY4OThhZSwgMHhmNmZhZTM3MywgMHgwNWQ2Y2I3MiwgMHhmZWFhMzRkMCwgMHhmZjk1N2NmNCwgMHgwMDU2MjhlYywgMHhmZmYxNzk2MiwKKyAgICAweDRkYjc1NWYzLCAweGZlODdjYzFiLCAweGY3MmI0MjViLCAweDA1ZDJiMDVjLCAweGZlYTFiNWE5LCAweGZmOWFlZGUwLCAweDAwNTRjZGMwLCAweGZmZjE4YWFiLAorICAgIDB4NGQzOGY1MjAsIDB4ZmUxOGE0YmMsIDB4Zjc1YmRiYmQsIDB4MDVjZTFlMmQsIDB4ZmU5OTcyNjgsIDB4ZmZhMDUyZWMsIDB4MDA1MzcwMmQsIDB4ZmZmMTlkZDEsCisgICAgMHg0Y2I4YzcyZSwgMHhmZGFiMjUwMSwgMHhmNzhjYWFlMCwgMHgwNWM5MTY5ZCwgMHhmZTkxNmIxNSwgMHhmZmE1YWJiOCwgMHgwMDUyMTA2OCwgMHhmZmYxYjJjNSwKKyAgICAweDRjMzZkMmViLCAweGZkM2Y0ZjNkLCAweGY3YmRhYjE2LCAweDA1YzM5YjZhLCAweGZlODk5ZmIyLCAweGZmYWFmN2U2LCAweDAwNTBhZWE1LCAweGZmZjFjOTc2LAorICAgIDB4NGJiMzFmM2MsIDB4ZmNkNTI1YTUsIDB4ZjdlZWQ3YjQsIDB4MDViZGFlNTcsIDB4ZmU4MjEwM2YsIDB4ZmZiMDM3MWMsIDB4MDA0ZjRiMTcsIDB4ZmZmMWUxZDYsCisgICAgMHg0YjJkYjMxYSwgMHhmYzZjYWE1MywgMHhmODIwMmMxYywgMHgwNWI3NTEyZSwgMHhmZTdhYmNiMSwgMHhmZmI1NjkwMiwgMHgwMDRkZTVmMSwgMHhmZmYxZmJkNSwKKyAgICAweDRhYTY5NTk0LCAweGZjMDVkZjQwLCAweGY4NTFhM2I2LCAweDA1YjA4NWJjLCAweGZlNzNhNGZiLCAweGZmYmE4ZDQ0LCAweDAwNGM3ZjY2LCAweGZmZjIxNzY0LAorICAgIDB4NGExZGNkY2UsIDB4ZmJhMGM2NGIsIDB4Zjg4MzM5ZjUsIDB4MDVhOTRkZDUsIDB4ZmU2Y2M5MDksIDB4ZmZiZmEzOGQsIDB4MDA0YjE3YTYsIDB4ZmZmMjM0NzMsCisgICAgMHg0OTkzNjJmZiwgMHhmYjNkNjEzMywgMHhmOGI0ZWE1NSwgMHgwNWExYWI1MiwgMHhmZTY2MjhjMSwgMHhmZmM0YWI4ZiwgMHgwMDQ5YWVlMywgMHhmZmYyNTJmMywKKyAgICAweDQ5MDc1YzcyLCAweGZhZGJiMTlhLCAweGY4ZTZiMDU5LCAweDA1OTlhMDBlLCAweGZlNWZjNDA1LCAweGZmYzlhNGZjLCAweDAwNDg0NTRiLCAweGZmZjI3MmQ2LAorICAgIDB4NDg3OWMxODUsIDB4ZmE3YmI5MDgsIDB4ZjkxODg3OTMsIDB4MDU5MTJkZWEsIDB4ZmU1OTlhYWYsIDB4ZmZjZThmOGEsIDB4MDA0NmRiMGYsIDB4ZmZmMjk0MGIsCisgICAgMHg0N2VhOTlhOSwgMHhmYTFkNzhlMywgMHhmOTRhNmI5YiwgMHgwNTg4NTZjZCwgMHhmZTUzYWM5NywgMHhmZmQzNmFmMSwgMHgwMDQ1NzA1YywgMHhmZmYyYjY4NiwKKyAgICAweDQ3NTllYzYwLCAweGY5YzBmMjc2LCAweGY5N2M1ODE1LCAweDA1N2YxYzllLCAweGZlNGRmOThlLCAweGZmZDgzNmViLCAweDAwNDQwNTYxLCAweGZmZjJkYTM2LAorICAgIDB4NDZjN2MxNDAsIDB4Zjk2NjI2ZjAsIDB4ZjlhZTQ4YWYsIDB4MDU3NTgxNGMsIDB4ZmU0ODgxNWUsIDB4ZmZkY2YzMzYsIDB4MDA0MjlhNGEsIDB4ZmZmMmZmMGQsCisgICAgMHg0NjM0MWZlZCwgMHhmOTBkMTc2MSwgMHhmOWUwMzkyNCwgMHgwNTZiODZjNiwgMHhmZTQzNDNkMCwgMHhmZmUxOWY5MSwgMHgwMDQxMmY0MywgMHhmZmYzMjRmZCwKKyAgICAweDQ1OWYxMDFkLCAweGY4YjVjNGJlLCAweGZhMTIyNTM3LCAweDA1NjEyZjAwLCAweGZlM2U0MGE2LCAweGZmZTYzYmMwLCAweDAwM2ZjNDc4LCAweGZmZjM0YmY5LAorICAgIDB4NDUwODk5OTYsIDB4Zjg2MDJmZGMsIDB4ZmE0NDA4YmEsIDB4MDU1NjdiZjEsIDB4ZmUzOTc3OWEsIDB4ZmZlYWM3ODcsIDB4MDAzZTVhMTIsIDB4ZmZmMzczZjAsCisgICAgMHg0NDcwYzQyZCwgMHhmODBjNTk3NywgMHhmYTc1ZGY4NywgMHgwNTRiNmY5MiwgMHhmZTM0ZTg2NywgMHhmZmVmNDJhZiwgMHgwMDNjZjAzZCwgMHhmZmYzOWNkNywKKyAgICAweDQzZDc5N2M3LCAweGY3YmE0MjJiLCAweGZhYTdhNTg2LCAweDA1NDAwYmUxLCAweGZlMzA5MmJmLCAweGZmZjNhZDAxLCAweDAwM2I4NzFmLCAweGZmZjNjNjlmLAorICAgIDB4NDMzZDFjNTYsIDB4Zjc2OWVhNzgsIDB4ZmFkOTU2YWIsIDB4MDUzNDUyZGMsIDB4ZmUyYzc2NTAsIDB4ZmZmODA2NGIsIDB4MDAzYTFlZTMsIDB4ZmZmM2YxM2EsCisgICAgMHg0MmExNTlkYywgMHhmNzFiNTJjNCwgMHhmYjBhZWVmNiwgMHgwNTI4NDY4NSwgMHhmZTI4OTJjNSwgMHhmZmZjNGU1YywgMHgwMDM4YjdhZSwgMHhmZmY0MWM5YywKKyAgICAweDQyMDQ1ODY1LCAweGY2Y2U3YjU3LCAweGZiM2M2YTczLCAweDA1MWJlOGRkLCAweGZlMjRlN2MzLCAweDAwMDA4NTA3LCAweDAwMzc1MWE3LCAweGZmZjQ0OGI3LAorICAgIDB4NDE2NjIwMGUsIDB4ZjY4MzY0NWEsIDB4ZmI2ZGM1M2MsIDB4MDUwZjNiZWMsIDB4ZmUyMTc0ZWMsIDB4MDAwNGFhMWYsIDB4MDAzNWVjZjQsIDB4ZmZmNDc1N2UsCisgICAgMHg0MGM2YjhmZCwgMHhmNjNhMGRkZiwgMHhmYjllZmI3NywgMHgwNTAyNDFiNiwgMHhmZTFlMzlkYSwgMHgwMDA4YmQ3YywgMHgwMDM0ODliOSwgMHhmZmY0YTJlNSwKKyAgICAweDQwMjYyYjY1LCAweGY1ZjI3N2Q5LCAweGZiZDAwOTU2LCAweDA0ZjRmYzQ2LCAweGZlMWIzNjI4LCAweDAwMGNiZWY3LCAweDAwMzMyODFhLCAweGZmZjRkMGRlLAorICAgIDB4M2Y4NDdmODMsIDB4ZjVhY2EyMWYsIDB4ZmMwMGViMWIsIDB4MDRlNzZkYTMsIDB4ZmUxODY5NmEsIDB4MDAxMGFlNmUsIDB4MDAzMWM4M2EsIDB4ZmZmNGZmNWQsCisgICAgMHgzZWUxYmRhMiwgMHhmNTY4OGM2ZCwgMHhmYzMxOWQxMywgMHgwNGQ5OTdkOCwgMHhmZTE1ZDMyZiwgMHgwMDE0OGJiZCwgMHgwMDMwNmEzYiwgMHhmZmY1MmU1NywKKyAgICAweDNlM2RlZTEzLCAweGY1MjYzNjY1LCAweGZjNjIxYjlhLCAweDA0Y2I3Y2YyLCAweGZlMTM3MzA0LCAweDAwMTg1NmM3LCAweDAwMmYwZTNmLCAweGZmZjU1ZGJmLAorICAgIDB4M2Q5OTE5MzIsIDB4ZjRlNTlmOGEsIDB4ZmM5MjYzMTksIDB4MDRiZDFlZmIsIDB4ZmUxMTQ4NzIsIDB4MDAxYzBmNmUsIDB4MDAyZGI0NjYsIDB4ZmZmNThkODksCisgICAgMHgzY2YzNDc2NiwgMHhmNGE2Yzc0OCwgMHhmY2MyNzAwOCwgMHgwNGFlODAwMCwgMHhmZTBmNTJmYywgMHgwMDFmYjU5OSwgMHgwMDJjNWNkMCwgMHhmZmY1YmRhYSwKKyAgICAweDNjNGM4MTFjLCAweGY0NjlhY2VkLCAweGZjZjIzZWVjLCAweDA0OWZhMjBmLCAweGZlMGQ5MjI0LCAweDAwMjM0OTJmLCAweDAwMmIwNzlhLCAweGZmZjVlZTE3LAorICAgIDB4M2JhNGNlYzksIDB4ZjQyZTRmYWYsIDB4ZmQyMWNjNTksIDB4MDQ5MDg3MzMsIDB4ZmUwYzA1NjcsIDB4MDAyNmNhMWMsIDB4MDAyOWI0ZTQsIDB4ZmZmNjFlYzUsCisgICAgMHgzYWZjMzhlYiwgMHhmM2Y0YWVhNiwgMHhmZDUxMTRmMCwgMHgwNDgxMzE3YSwgMHhmZTBhYWMzZiwgMHgwMDJhMzg0YywgMHgwMDI4NjRjOSwgMHhmZmY2NGZhOCwKKyAgICAweDNhNTJjODA1LCAweGYzYmNjOGQzLCAweGZkODAxNTY0LCAweDA0NzFhMmVmLCAweGZlMDk4NjIyLCAweDAwMmQ5M2FlLCAweDAwMjcxNzY2LCAweGZmZjY4MGI1LAorICAgIDB4MzlhODg0YTEsIDB4ZjM4NjlkMWEsIDB4ZmRhZWNhNzMsIDB4MDQ2MWRkYTAsIDB4ZmUwODkyODMsIDB4MDAzMGRjMzQsIDB4MDAyNWNjZDcsIDB4ZmZmNmIxZTQsCisgICAgMHgzOGZkNzc0ZSwgMHhmMzUyMmE0OSwgMHhmZGRkMzBlYiwgMHgwNDUxZTM5NiwgMHhmZTA3ZDBkMywgMHgwMDM0MTFkMiwgMHgwMDI0ODUzNSwgMHhmZmY2ZTMyOSwKKyAgICAweDM4NTFhOGEyLCAweGYzMWY2ZjBmLCAweGZlMGI0NWFhLCAweDA0NDFiNmRkLCAweGZlMDc0MDdkLCAweDAwMzczNDdkLCAweDAwMjM0MDlhLCAweGZmZjcxNDdhLAorICAgIDB4MzdhNTIxMzUsIDB4ZjJlZTZhMDcsIDB4ZmUzOTA1OWIsIDB4MDQzMTU5N2QsIDB4ZmUwNmUwZWIsIDB4MDAzYTQ0MmUsIDB4MDAyMWZmMWYsIDB4ZmZmNzQ1Y2QsCisgICAgMHgzNmY3ZTlhNCwgMHhmMmJmMTlhZSwgMHhmZTY2NmRiYywgMHgwNDIwY2Q4MCwgMHhmZTA2YjE4NCwgMHgwMDNkNDBlMCwgMHgwMDIwYzBkYywgMHhmZmY3NzcxYSwKKyAgICAweDM2NGEwYTkwLCAweGYyOTE3YzZkLCAweGZlOTM3YjE1LCAweDA0MTAxNGViLCAweGZlMDZiMWFjLCAweDAwNDAyYThlLCAweDAwMWY4NWU2LCAweGZmZjdhODU3LAorICAgIDB4MzU5YjhjOWQsIDB4ZjI2NTkwOGYsIDB4ZmVjMDJhYzIsIDB4MDNmZjMxYzMsIDB4ZmUwNmUwYzQsIDB4MDA0MzAxMzcsIDB4MDAxZTRlNTYsIDB4ZmZmN2Q5N2EsCisgICAgMHgzNGVjNzg2ZiwgMHhmMjNiNTQ0YiwgMHhmZWVjNzllYywgMHgwM2VlMjYwZCwgMHhmZTA3M2UyYSwgMHgwMDQ1YzRkZCwgMHgwMDFkMWEzZiwgMHhmZmY4MGE3YywKKyAgICAweDM0M2NkNmFmLCAweGYyMTJjNWJlLCAweGZmMTg2NWNkLCAweDAzZGNmM2NhLCAweGZlMDdjOTNhLCAweDAwNDg3NTgyLCAweDAwMWJlOWI3LCAweGZmZjgzYjUyLAorICAgIDB4MzM4Y2IwMDQsIDB4ZjFlYmUyZWMsIDB4ZmY0M2ViYWMsIDB4MDNjYjljZjksIDB4ZmUwODgxNGUsIDB4MDA0YjEzMmIsIDB4MDAxYWJjZDAsIDB4ZmZmODZiZjYsCisgICAgMHgzMmRjMGQxNywgMHhmMWM2YTljMywgMHhmZjZmMDhlNCwgMHgwM2JhMjM5OCwgMHhmZTA5NjViYywgMHgwMDRkOWRkZSwgMHgwMDE5OTM5ZCwgMHhmZmY4OWM2MCwKKyAgICAweDMyMmFmNjkzLCAweGYxYTMxODFhLCAweGZmOTliYWRiLCAweDAzYTg4OWExLCAweGZlMGE3NWRhLCAweDAwNTAxNWE1LCAweDAwMTg2ZTMxLCAweGZmZjhjYzg2LAorICAgIDB4MzE3OTc1MWYsIDB4ZjE4MTJiYjAsIDB4ZmZjM2ZmMGMsIDB4MDM5NmQxMGMsIDB4ZmUwYmIwZjksIDB4MDA1MjdhOGEsIDB4MDAxNzRjOWMsIDB4ZmZmOGZjNjIsCisgICAgMHgzMGM3OTE2MywgMHhmMTYwZTIyZCwgMHhmZmVkZDJmZCwgMHgwMzg0ZmJkMSwgMHhmZTBkMTY2YiwgMHgwMDU0Y2M5YSwgMHgwMDE2MmVlZiwgMHhmZmY5MmJlYywKKyAgICAweDMwMTU1NDA0LCAweGYxNDIzOTI0LCAweDAwMTczNDQ3LCAweDAzNzMwYmUwLCAweGZlMGVhNTdlLCAweDAwNTcwYmU0LCAweDAwMTUxNTM4LCAweGZmZjk1YjFlLAorICAgIDB4MmY2MmM1YTcsIDB4ZjEyNTJlMGYsIDB4MDA0MDIwOTIsIDB4MDM2MTAzMmEsIDB4ZmUxMDVkN2UsIDB4MDA1OTM4NzcsIDB4MDAxM2ZmODgsIDB4ZmZmOTg5ZWYsCisgICAgMHgyZWFmZWVlZCwgMHhmMTA5YmU1NiwgMHgwMDY4OTU5OCwgMHgwMzRlZTM5YiwgMHhmZTEyM2RiNiwgMHgwMDViNTI2NywgMHgwMDEyZWRlYSwgMHhmZmY5Yjg1YiwKKyAgICAweDJkZmNkODczLCAweGYwZWZlNzQ4LCAweDAwOTA5MTFmLCAweDAzM2NhZjFkLCAweGZlMTQ0NTcwLCAweDAwNWQ1OWM2LCAweDAwMTFlMDZkLCAweGZmZjllNjVhLAorICAgIDB4MmQ0OThhZDMsIDB4ZjBkN2E2MjIsIDB4MDBiODExMDIsIDB4MDMyYTY3OTYsIDB4ZmUxNjczZjIsIDB4MDA1ZjRlYWMsIDB4MDAxMGQ3MWQsIDB4ZmZmYTEzZTUsCisgICAgMHgyYzk2MGVhMywgMHhmMGMwZjgwOCwgMHgwMGRmMTMyOCwgMHgwMzE4MGVlNywgMHhmZTE4Yzg4NCwgMHgwMDYxMzEyZSwgMHgwMDBmZDIwNSwgMHhmZmZhNDBmOCwKKyAgICAweDJiZTI2YzczLCAweGYwYWJkYTBlLCAweDAxMDU5NThjLCAweDAzMDVhNmYwLCAweGZlMWI0MjY4LCAweDAwNjMwMTY3LCAweDAwMGVkMTMwLCAweGZmZmE2ZDhkLAorICAgIDB4MmIyZWFjY2YsIDB4ZjA5ODQ5MzEsIDB4MDEyYjk2MzUsIDB4MDJmMzMxOGEsIDB4ZmUxZGUwZTIsIDB4MDA2NGJmNzEsIDB4MDAwZGQ0YTcsIDB4ZmZmYTk5OWQsCisgICAgMHgyYTdhZDgzYywgMHhmMDg2NDI1YSwgMHgwMTUxMTMzZSwgMHgwMmUwYjA4ZCwgMHhmZTIwYTMzNSwgMHgwMDY2NmI2OCwgMHgwMDBjZGM3NCwgMHhmZmZhYzUyNSwKKyAgICAweDI5YzZmNzM4LCAweGYwNzVjMjYwLCAweDAxNzYwYWQxLCAweDAyY2UyNWNhLCAweGZlMjM4OGExLCAweDAwNjgwNTZiLCAweDAwMGJlODlmLCAweGZmZmFmMDFlLAorICAgIDB4MjkxMzEyM2MsIDB4ZjA2NmM2MDYsIDB4MDE5YTdiMjcsIDB4MDJiYjkzMTAsIDB4ZmUyNjkwNjUsIDB4MDA2OThkOTgsIDB4MDAwYWY5MzEsIDB4ZmZmYjFhODQsCisgICAgMHgyODVmMzFiNywgMHhmMDU5NDlmYiwgMHgwMWJlNjI4YywgMHgwMmE4ZmEyYSwgMHhmZTI5YjljMSwgMHgwMDZiMDQxMSwgMHgwMDBhMGUyZiwgMHhmZmZiNDQ1MywKKyAgICAweDI3YWI1ZTEyLCAweGYwNGQ0YWRlLCAweDAxZTFiZjU4LCAweDAyOTY1Y2RiLCAweGZlMmQwM2YyLCAweDAwNmM2OGY4LCAweDAwMDkyN2EwLCAweGZmZmI2ZDg2LAorICAgIDB4MjZmNzlmYWIsIDB4ZjA0MmM1MzksIDB4MDIwNDhmZjgsIDB4MDI4M2JjZTYsIDB4ZmUzMDZlMzUsIDB4MDA2ZGJjNzEsIDB4MDAwODQ1ODksIDB4ZmZmYjk2MWEsCisgICAgMHgyNjQzZmVkYSwgMHhmMDM5YjU4NywgMHgwMjI2ZDJlNiwgMHgwMjcxMWMwNSwgMHhmZTMzZjdjNywgMHgwMDZlZmVhMCwgMHgwMDA3NjdmMCwgMHhmZmZiYmUwOSwKKyAgICAweDI1OTA4M2ViLCAweGYwMzIxODJmLCAweDAyNDg4NmFkLCAweDAyNWU3YmYwLCAweGZlMzc5ZmUzLCAweDAwNzAyZmFlLCAweDAwMDY4ZWQ4LCAweGZmZmJlNTUyLAorICAgIDB4MjRkZDM3MjEsIDB4ZjAyYmU5OGEsIDB4MDI2OWE5ZTksIDB4MDI0YmRlNWEsIDB4ZmUzYjY1YzQsIDB4MDA3MTRmYzAsIDB4MDAwNWJhNDYsIDB4ZmZmYzBiZWYsCisgICAgMHgyNDJhMjBiMywgMHhmMDI3MjVkYywgMHgwMjhhM2I0NCwgMHgwMjM5NDRlZSwgMHhmZTNmNDhhNSwgMHgwMDcyNWYwMiwgMHgwMDA0ZWEzYSwgMHhmZmZjMzFkZiwKKyAgICAweDIzNzc0OGNmLCAweGYwMjNjOTVkLCAweDAyYWEzOTdiLCAweDAyMjZiMTU2LCAweGZlNDM0N2MwLCAweDAwNzM1ZDljLCAweDAwMDQxZWI5LCAweGZmZmM1NzFlLAorICAgIDB4MjJjNGI3OTUsIDB4ZjAyMWQwMzEsIDB4MDJjOWEzNTksIDB4MDIxNDI1MzMsIDB4ZmU0NzYyNTAsIDB4MDA3NDRiYmEsIDB4MDAwMzU3YzIsIDB4ZmZmYzdiYTksCisgICAgMHgyMjEyNzUxYSwgMHhmMDIxMzY3MSwgMHgwMmU4NzdiOSwgMHgwMjAxYTIyMywgMHhmZTRiOTc4ZSwgMHgwMDc1Mjk4YSwgMHgwMDAyOTU1OCwgMHhmZmZjOWY3ZSwKKyAgICAweDIxNjA4OTY4LCAweGYwMjFmODIzLCAweDAzMDZiNTg2LCAweDAxZWYyOWJlLCAweGZlNGZlNmIzLCAweDAwNzVmNzM5LCAweDAwMDFkNzc5LCAweGZmZmNjMjlhLAorICAgIDB4MjBhZWZjNzksIDB4ZjAyNDExNDAsIDB4MDMyNDViYmMsIDB4MDFkY2JkOTYsIDB4ZmU1NDRlZmIsIDB4MDA3NmI0ZjUsIDB4MDAwMTFlMjYsIDB4ZmZmY2U0ZmMsCisgICAgMHgxZmZkZDYzYiwgMHhmMDI3N2RiMSwgMHgwMzQxNjk2NiwgMHgwMWNhNWYzNywgMHhmZTU4Y2Y5ZCwgMHgwMDc3NjJmMCwgMHgwMDAwNjk1ZSwgMHhmZmZkMDZhMSwKKyAgICAweDFmNGQxZThlLCAweGYwMmMzOTUzLCAweDAzNWRkZDllLCAweDAxYjgxMDI4LCAweGZlNWQ2N2Q0LCAweDAwNzgwMTVhLCAweGZmZmZiOTFmLCAweGZmZmQyNzg3LAorICAgIDB4MWU5Y2RkNDMsIDB4ZjAzMjNmZjUsIDB4MDM3OWI3OTAsIDB4MDFhNWQxZWEsIDB4ZmU2MjE2ZGIsIDB4MDA3ODkwNjUsIDB4ZmZmZjBkNjYsIDB4ZmZmZDQ3YWUsCisgICAgMHgxZGVkMWExZCwgMHhmMDM5OGQ1NiwgMHgwMzk0ZjY3NCwgMHgwMTkzYTVmOSwgMHhmZTY2ZGJlYiwgMHgwMDc5MTA0MywgMHhmZmZlNjYzMSwgMHhmZmZkNjcxMywKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmNVcC5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luY1VwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1MzY3ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmNVcC5oCkBAIC0wLDAgKzEsMTMxIEBACisvLyBjbWQtbGluZTogZmlyIC1sIDcgLXM0ODAwMCAtYyAyMDQ3OAorCisgICAgMHg2ZDM3NGJjNywgMHgxMTFjNmJhMCwgMHhmMzI0MGU2MSwgMHgwN2QxNGEzOCwgMHhmYzUwOWU2NCwgMHgwMTM5Y2VlOSwgMHhmZmM4Yzg2NiwgMHhmZmZjYzMwMCwKKyAgICAweDZkMzUyNzhhLCAweDEwM2U4MTkyLCAweGYzNmI5ZGZkLCAweDA3YmRmYWE1LCAweGZjNTEwMmQwLCAweDAxM2Q2MThkLCAweGZmYzY2M2I5LCAweGZmZmQ5NTkyLAorICAgIDB4NmQyZWJhZmUsIDB4MGY2MjgxMWEsIDB4ZjNiM2Q4YWMsIDB4MDdhOWYzOTksIDB4ZmM1MWQ5YTYsIDB4MDE0MGJlYTUsIDB4ZmZjNDEyMTIsIDB4ZmZmZTYzMWUsCisgICAgMHg2ZDI0MDY5ZCwgMHgwZTg4NzVhZCwgMHhmM2ZjYjQzZSwgMHgwNzk1Mzk3NiwgMHhmYzUzMjE2ZiwgMHgwMTQzZTY3YywgMHhmZmMxZDM3MywgMHhmZmZmMmI5ZiwKKyAgICAweDZkMTUwYjM1LCAweDBkYjA2YTg5LCAweGY0NDYyNjkwLCAweDA3N2ZkMGFjLCAweGZjNTRkOGFlLCAweDAxNDZkOTY1LCAweGZmYmZhN2Q5LCAweGZmZmZlZjEwLAorICAgIDB4NmQwMWM5ZTMsIDB4MGNkYTZhYjUsIDB4ZjQ5MDI1ODcsIDB4MDc2OWJkYWYsIDB4ZmM1NmZkZGEsIDB4MDE0OTk3YmIsIDB4ZmZiZDhmNDAsIDB4MDAwMGFkNmUsCisgICAgMHg2Y2VhNDQxOCwgMHgwYzA2ODBmZSwgMHhmNGRhYTcxOCwgMHgwNzUzMDUwMSwgMHhmYzU5OGY2MCwgMHgwMTRjMjFkYiwgMHhmZmJiODlhMSwgMHgwMDAxNjZiNiwKKyAgICAweDZjY2U3Yjk3LCAweDBiMzRiN2Y1LCAweGY1MjVhMTQzLCAweDA3M2JhYjI4LCAweGZjNWM4YmE1LCAweDAxNGU3ODJhLCAweGZmYjk5NmYzLCAweDAwMDIxYWU1LAorICAgIDB4NmNhZTcyNzIsIDB4MGE2NTE5ZjQsIDB4ZjU3MTBhMTcsIDB4MDcyM2I0YjQsIDB4ZmM1ZmYxMDUsIDB4MDE1MDliMTQsIDB4ZmZiN2I3MjgsIDB4MDAwMmM5ZmQsCisgICAgMHg2YzhhMmIwZiwgMHgwOTk3YjExNiwgMHhmNWJjZDdiMSwgMHgwNzBiMjYzOSwgMHhmYzYzYmRkMywgMHgwMTUyOGIwOCwgMHhmZmI1ZWEzMSwgMHgwMDAzNzNmYiwKKyAgICAweDZjNjFhODIzLCAweDA4Y2M4NzNjLCAweGY2MDkwMDNmLCAweDA2ZjIwNDUzLCAweGZjNjdmMDVhLCAweDAxNTQ0ODdiLCAweGZmYjQyZmZjLCAweDAwMDQxOGUyLAorICAgIDB4NmMzNGVjYjUsIDB4MDgwM2E2MGEsIDB4ZjY1NTdhMDAsIDB4MDZkODUzYTIsIDB4ZmM2Yzg2ZGQsIDB4MDE1NWQzZTgsIDB4ZmZiMjg4NzYsIDB4MDAwNGI4YjMsCisgICAgMHg2YzAzZmMxYywgMHgwNzNkMTZlNywgMHhmNmEyM2I0NCwgMHgwNmJlMThjZCwgMHhmYzcxN2Y5NywgMHgwMTU3MmRjZiwgMHhmZmIwZjM4OCwgMHgwMDA1NTM3MSwKKyAgICAweDZiY2VkOWZmLCAweDA2NzhlMmZjLCAweGY2ZWYzYTZlLCAweDA2YTM1ODdlLCAweGZjNzZkOGJjLCAweDAxNTg1NmI2LCAweGZmYWY3MTE4LCAweDAwMDVlOTIxLAorICAgIDB4NmI5NThhNTQsIDB4MDViNzEzMzIsIDB4ZjczYzZkZjQsIDB4MDY4ODE3NjEsIDB4ZmM3YzkwNzksIDB4MDE1OTRmMjUsIDB4ZmZhZTAxMGIsIDB4MDAwNjc5YzUsCisgICAgMHg2YjU4MTE2MywgMHgwNGY3YjAzNywgMHhmNzg5Y2M2MSwgMHgwNjZjNWEyNywgMHhmYzgyYTRmNCwgMHgwMTVhMTdhYiwgMHhmZmFjYTM0NCwgMHgwMDA3MDU2NCwKKyAgICAweDZiMTY3M2MxLCAweDA0M2FjMjc2LCAweGY3ZDc0YzUzLCAweDA2NTAyNTgzLCAweGZjODkxNDRkLCAweDAxNWFiMGRiLCAweGZmYWI1N2ExLCAweDAwMDc4YzA0LAorICAgIDB4NmFkMGI2NTIsIDB4MDM4MDUyMWMsIDB4ZjgyNGU0ODAsIDB4MDYzMzdlMmEsIDB4ZmM4ZmRjOWYsIDB4MDE1YjFiNGUsIDB4ZmZhYTFlMDIsIDB4MDAwODBkYWIsCisgICAgMHg2YTg2ZGU0OCwgMHgwMmM4NjcxNSwgMHhmODcyOGJiMywgMHgwNjE2NjhkMiwgMHhmYzk2ZmJmYywgMHgwMTViNTc5ZSwgMHhmZmE4ZjY0MSwgMHgwMDA4OGE2MiwKKyAgICAweDZhMzhmMTIzLCAweDAyMTMwOTBjLCAweGY4YzAzOGQwLCAweDA1ZjhlYTMwLCAweGZjOWU3MDc0LCAweDAxNWI2NjZjLCAweGZmYTdlMDM5LCAweDAwMDkwMjMwLAorICAgIDB4NjllNmY0YjEsIDB4MDE2MDNmNmUsIDB4ZjkwZGUyZDEsIDB4MDVkYjA2ZmMsIDB4ZmNhNjM4MTAsIDB4MDE1YjQ4NWIsIDB4ZmZhNmRiYzAsIDB4MDAwOTc1MWUsCisgICAgMHg2OTkwZWYwYiwgMHgwMGIwMTE2MiwgMHhmOTViODBjYiwgMHgwNWJjYzNlZCwgMHhmY2FlNTBkNiwgMHgwMTVhZmUxNCwgMHhmZmE1ZThhZCwgMHgwMDA5ZTMzNywKKyAgICAweDY5MzZlNjk3LCAweDAwMDI4NWQwLCAweGY5YTkwOWVhLCAweDA1OWUyNWI1LCAweGZjYjZiOGM0LCAweDAxNWE4ODQzLCAweGZmYTUwNmQyLCAweDAwMGE0Yzg1LAorICAgIDB4NjhkOGUyMDYsIDB4ZmY1N2EzNWUsIDB4ZjlmNjc1NzcsIDB4MDU3ZjMxMGEsIDB4ZmNiZjZkZDgsIDB4MDE1OWU3OTYsIDB4ZmZhNDM2MDMsIDB4MDAwYWIxMTIsCisgICAgMHg2ODc2ZTg1NSwgMHhmZWFmNzA2ZiwgMHhmYTQzYmFkMiwgMHgwNTVmZWE5ZCwgMHhmY2M4NmUwOSwgMHgwMTU5MWNjMCwgMHhmZmEzNzYwZSwgMHgwMDBiMTBlYywKKyAgICAweDY4MTEwMGM5LCAweGZlMDlmMzIzLCAweGZhOTBkMTdiLCAweDA1NDA1NzFhLCAweGZjZDFiNzRjLCAweDAxNTgyODc4LCAweGZmYTJjNmMyLCAweDAwMGI2YzFkLAorICAgIDB4NjdhNzMyZjQsIDB4ZmQ2NzMxNTksIDB4ZmFkZGIxMGMsIDB4MDUyMDdiMmYsIDB4ZmNkYjQ3OTMsIDB4MDE1NzBiNzcsIDB4ZmZhMjI3ZWMsIDB4MDAwYmMyYjMsCisgICAgMHg2NzM5ODZhYywgMHhmY2M3MzBhYSwgMHhmYjJhNTEzYiwgMHgwNTAwNWI4MiwgMHhmY2U1MWNjYiwgMHgwMTU1YzY3OCwgMHhmZmExOTk1NywgMHgwMDBjMTRiYiwKKyAgICAweDY2YzgwNDEzLCAweGZjMjlmNjcwLCAweGZiNzZhOWRkLCAweDA0ZGZmY2I2LCAweGZjZWYzNGUxLCAweDAxNTQ1YTNjLCAweGZmYTExYWNiLCAweDAwMGM2MjQ0LAorICAgIDB4NjY1MmIzOTIsIDB4ZmI4Zjg3YmQsIDB4ZmJjMmIyZTQsIDB4MDRiZjYzNjksIDB4ZmNmOThkYmUsIDB4MDE1MmM3ODMsIDB4ZmZhMGFjMTEsIDB4MDAwY2FiNWMsCisgICAgMHg2NWQ5OWRkNSwgMHhmYWY3ZTk2MywgMHhmYzBlNjQ2MSwgMHgwNDllOTQzMywgMHhmZDA0MjU0YSwgMHgwMTUxMGYxMywgMHhmZmEwNGNmMCwgMHgwMDBjZjAxMiwKKyAgICAweDY1NWNjYmQzLCAweGZhNjMxZmVmLCAweGZjNTliNjg1LCAweDA0N2Q5M2E4LCAweGZkMGVmOTY5LCAweDAxNGYzMWIyLCAweGZmOWZmZDJjLCAweDAwMGQzMDc1LAorICAgIDB4NjRkYzQ2YzMsIDB4ZjlkMTJmYWIsIDB4ZmNhNGExOWYsIDB4MDQ1YzY2NTQsIDB4ZmQxYTA4MDEsIDB4MDE0ZDMwMjksIDB4ZmY5ZmJjODksIDB4MDAwZDZjOTcsCisgICAgMHg2NDU4MTgyMywgMHhmOTQyMWM5ZCwgMHhmY2VmMWUyMCwgMHgwNDNiMTBiZCwgMHhmZDI1NGVmNCwgMHgwMTRiMGI0NSwgMHhmZjlmOGFjOSwgMHgwMDBkYTQ4NiwKKyAgICAweDYzZDA0OWI0LCAweGY4YjVlYTg3LCAweGZkMzkyNDk4LCAweDA0MTk5NzYwLCAweGZkMzBjYzI0LCAweDAxNDhjM2QyLCAweGZmOWY2N2FlLCAweDAwMGRkODU0LAorICAgIDB4NjM0NGU1NzgsIDB4ZjgyYzljZTcsIDB4ZmQ4MmFkYmEsIDB4MDNmN2ZlYjQsIDB4ZmQzYzdkNzMsIDB4MDE0NjVhOWYsIDB4ZmY5ZjUyZjcsIDB4MDAwZTA4MTIsCisgICAgMHg2MmI1ZjViMiwgMHhmN2E2MzZmYSwgMHhmZGNiYjI1YSwgMHgwM2Q2NGIyNywgMHhmZDQ4NjBjMiwgMHgwMTQzZDA3ZiwgMHhmZjlmNGM2NSwgMHgwMDBlMzNkMywKKyAgICAweDYyMjM4NGU4LCAweGY3MjJiYmI1LCAweGZlMTQyYjZlLCAweDAzYjQ4MTFkLCAweGZkNTQ3M2YzLCAweDAxNDEyNjQzLCAweGZmOWY1M2I0LCAweDAwMGU1YmE3LAorICAgIDB4NjE4ZDlkZGMsIDB4ZjZhMjJkY2YsIDB4ZmU1YzEyMGYsIDB4MDM5MmE0ZjQsIDB4ZmQ2MGI0ZTcsIDB4MDEzZTVjYzAsIDB4ZmY5ZjY4YTEsIDB4MDAwZTdmYTEsCisgICAgMHg2MGY0NGI5MSwgMHhmNjI0OGZiNiwgMHhmZWEzNWY3OSwgMHgwMzcwYmFmYywgMHhmZDZkMjE4MCwgMHgwMTNiNzRjYSwgMHhmZjlmOGFlOSwgMHgwMDBlOWZkNSwKKyAgICAweDYwNTc5OTQ3LCAweGY1YTllMzk4LCAweGZlZWEwZDBjLCAweDAzNGVjNzdmLCAweGZkNzliN2ExLCAweDAxMzg2ZjNhLCAweGZmOWZiYTQ3LCAweDAwMGViYzU0LAorICAgIDB4NWZiNzkyNzgsIDB4ZjUzMjJiNjEsIDB4ZmYzMDE0NGEsIDB4MDMyY2NlYmIsIDB4ZmQ4Njc1MmUsIDB4MDEzNTRjZTcsIDB4ZmY5ZmY2NzQsIDB4MDAwZWQ1MzMsCisgICAgMHg1ZjE0NDJkYywgMHhmNGJkNjhiNiwgMHhmZjc1NmVkYywgMHgwMzBhZDRlMSwgMHhmZDkzNTgwZCwgMHgwMTMyMGVhOSwgMHhmZmEwM2YyYiwgMHgwMDBlZWE4NCwKKyAgICAweDVlNmRiNjY1LCAweGY0NGI5Y2ZlLCAweGZmYmExNjhkLCAweDAyZThkZTE5LCAweGZkYTA1ZTIzLCAweDAxMmViNTVhLCAweGZmYTA5NDI1LCAweDAwMGVmYzVjLAorICAgIDB4NWRjM2Y5M2MsIDB4ZjNkY2M5NTksIDB4ZmZmZTA1NGUsIDB4MDJjNmVlN2YsIDB4ZmRhZDg1NWIsIDB4MDEyYjQxZDMsIDB4ZmZhMGY1MTksIDB4MDAwZjBhY2UsCisgICAgMHg1ZDE3MTdjNCwgMHhmMzcwZWVhOSwgMHgwMDQxMzUzNiwgMHgwMmE1MGEyMiwgMHhmZGJhY2I5ZSwgMHgwMTI3YjRmMSwgMHhmZmExNjFiZiwgMHgwMDBmMTVlZiwKKyAgICAweDVjNjcxZTk2LCAweGYzMDgwZDhjLCAweDAwODNhMDgxLCAweDAyODMzNTA2LCAweGZkYzgyZWRiLCAweDAxMjQwZjhlLCAweGZmYTFkOWNmLCAweDAwMGYxZGQyLAorICAgIDB4NWJiNDFhODAsIDB4ZjJhMjI2NWUsIDB4MDBjNTQxOTAsIDB4MDI2MTczMjEsIDB4ZmRkNWFkMDEsIDB4MDEyMDUyODUsIDB4ZmZhMjVjZmUsIDB4MDAwZjIyOGQsCisgICAgMHg1YWZlMTg4NiwgMHhmMjNmMzkzYiwgMHgwMTA2MTJlYiwgMHgwMjNmYzg1YywgMHhmZGUzNDQwMywgMHgwMTFjN2ViMiwgMHhmZmEyZWIwNCwgMHgwMDBmMjQzNCwKKyAgICAweDVhNDUyNWRmLCAweGYxZGY0NWZkLCAweDAxNDYwZjQxLCAweDAyMWUzODkxLCAweGZkZjBmMWQ2LCAweDAxMTg5NGYwLCAweGZmYTM4Mzk1LCAweDAwMGYyMmRjLAorICAgIDB4NTk4OTRmZjMsIDB4ZjE4MjRjM2UsIDB4MDE4NTMxNjUsIDB4MDFmY2M3OGYsIDB4ZmRmZWI0NzUsIDB4MDExNDk2MWIsIDB4ZmZhNDI2NjgsIDB4MDAwZjFlOTksCisgICAgMHg1OGNhYTQ1YiwgMHhmMTI4NGI1OCwgMHgwMWMzNzQ1MiwgMHgwMWRiNzkxNCwgMHhmZTBjODlkYiwgMHgwMTEwODMwZiwgMHhmZmE0ZDMzMiwgMHgwMDBmMTc4MSwKKyAgICAweDU4MDkzMGUxLCAweGYwZDE0MjY3LCAweDAyMDBkMzJjLCAweDAxYmE1MGQyLCAweGZlMWE3MDA5LCAweDAxMGM1Y2E2LCAweGZmYTU4OWE2LCAweDAwMGYwZGE4LAorICAgIDB4NTc0NTAzN2MsIDB4ZjA3ZDMwNDMsIDB4MDIzZDQ5M2MsIDB4MDE5OTUyNmIsIDB4ZmUyODY1MDUsIDB4MDEwODIzYmEsIDB4ZmZhNjQ5N2MsIDB4MDAwZjAxMjUsCisgICAgMHg1NjdlMmE1MSwgMHhmMDJjMTM4YSwgMHgwMjc4ZDFmMiwgMHgwMTc4ODE3MCwgMHhmZTM2NjZkNSwgMHgwMTAzZDkyNywgMHhmZmE3MTI2NiwgMHgwMDBlZjIwYiwKKyAgICAweDU1YjRiM2FmLCAweGVmZGRlYTlhLCAweDAyYjM2OGU2LCAweDAxNTdlMTY2LCAweGZlNDQ3Mzg5LCAweDAwZmY3ZGM0LCAweGZmYTdlNDFhLCAweDAwMGVlMDcwLAorICAgIDB4NTRlOGFlMTMsIDB4ZWY5MmIzOTMsIDB4MDJlZDA5ZDcsIDB4MDEzNzc1YmYsIDB4ZmU1Mjg5MzEsIDB4MDBmYjEyNmIsIDB4ZmZhOGJlNGMsIDB4MDAwZWNjNjksCisgICAgMHg1NDFhMjgxZSwgMHhlZjRhNmM1OCwgMHgwMzI1YjBhZCwgMHgwMTE3NDFkZiwgMHhmZTYwYTVlNSwgMHgwMGY2OTdmMywgMHhmZmE5YTBiMSwgMHgwMDBlYjYwYiwKKyAgICAweDUzNDkzMDllLCAweGVmMDUxMjkwLCAweDAzNWQ1OTc3LCAweDAwZjc0OTFhLCAweGZlNmVjN2MwLCAweDAwZjIwZjMyLCAweGZmYWE4YWZlLCAweDAwMGU5ZDZiLAorICAgIDB4NTI3NWQ2ODQsIDB4ZWVjMmEzYTMsIDB4MDM5NDAwNmEsIDB4MDBkNzhlYjMsIDB4ZmU3Y2VjZTIsIDB4MDBlZDc4ZmYsIDB4ZmZhYjdjZTcsIDB4MDAwZTgyOWUsCisgICAgMHg1MWEwMjhlOCwgMHhlZTgzMWNjMywgMHgwM2M5YTFlNSwgMHgwMGI4MTVkYSwgMHhmZThiMTM3MywgMHgwMGU4ZDYyZCwgMHhmZmFjNzYyMSwgMHgwMDBlNjViYSwKKyAgICAweDUwYzgzNzA0LCAweGVlNDY3YWUxLCAweDAzZmUzYTZmLCAweDAwOThlMWIzLCAweGZlOTkzOTlmLCAweDAwZTQyNzhmLCAweGZmYWQ3NjYyLCAweDAwMGU0NmQzLAorICAgIDB4NGZlZTEwMzcsIDB4ZWUwY2JhYjksIDB4MDQzMWM2YjUsIDB4MDA3OWY1NGMsIDB4ZmVhNzVkOTcsIDB4MDBkZjZkZjcsIDB4ZmZhZTdkNWYsIDB4MDAwZTI1ZmQsCisgICAgMHg0ZjExYzNmZSwgMHhlZGQ1ZDhjYSwgMHgwNDY0NDM4YywgMHgwMDViNTNhNCwgMHhmZWI1N2Q5MiwgMHgwMGRhYWEzNCwgMHhmZmFmOGFjZCwgMHgwMDBlMDM0ZiwKKyAgICAweDRlMzM2MWY3LCAweGVkYTFkMTVjLCAweDA0OTVhZGYyLCAweDAwM2NmZmE5LCAweGZlYzM5N2NmLCAweDAwZDVkZDE2LCAweGZmYjA5ZTYzLCAweDAwMGRkZWRiLAorICAgIDB4NGQ1MmY5ZGYsIDB4ZWQ3MGEwN2QsIDB4MDRjNjAzMGQsIDB4MDAxZWZjMzUsIDB4ZmVkMWFhOTIsIDB4MDBkMTA3NjksIDB4ZmZiMWI3ZDgsIDB4MDAwZGI4YjcsCisgICAgMHg0YzcwOWI4ZSwgMHhlZDQyNDIwNSwgMHgwNGY1NDAyOSwgMHgwMDAxNGMxMiwgMHhmZWRmYjQyNSwgMHgwMGNjMjlmNywgMHhmZmIyZDZlMSwgMHgwMDBkOTBmNiwKKyAgICAweDRiOGM1NmY4LCAweGVkMTZiMTk2LCAweDA1MjM2MmJhLCAweGZmZTNmMWY3LCAweGZlZWRiMmRhLCAweDAwYzc0NThhLCAweGZmYjNmYjM3LCAweDAwMGQ2N2FlLAorICAgIDB4NGFhNjNjMmMsIDB4ZWNlZGVhOTksIDB4MDU1MDY4NWQsIDB4ZmZjNmYwOGEsIDB4ZmVmYmE1MDgsIDB4MDBjMjVhZTgsIDB4ZmZiNTI0OTAsIDB4MDAwZDNjZjEsCisgICAgMHg0OWJlNWI1MCwgMHhlY2M3ZTg0NSwgMHgwNTdjNGVkNCwgMHhmZmFhNGE1ZCwgMHhmZjA5ODkwZiwgMHgwMGJkNmFkNywgMHhmZmI2NTJhNywgMHgwMDBkMTBkNSwKKyAgICAweDQ4ZDRjNGEyLCAweGVjYTRhNTliLCAweDA1YTcxNDBiLCAweGZmOGUwMWYxLCAweGZmMTc1ZDUzLCAweDAwYjg3NjE5LCAweGZmYjc4NTMzLCAweDAwMGNlMzZiLAorICAgIDB4NDdlOTg4NzQsIDB4ZWM4NDFkNjgsIDB4MDVkMGI2MTIsIDB4ZmY3MjE5YjMsIDB4ZmYyNTIwNDIsIDB4MDBiMzdkNzAsIDB4ZmZiOGJiZWQsIDB4MDAwY2I0YzgsCisgICAgMHg0NmZjYjcyZCwgMHhlYzY2NGE0OCwgMHgwNWY5MzMyNCwgMHhmZjU2OTNmZSwgMHhmZjMyZDA0ZiwgMHgwMGFlODE5OCwgMHhmZmI5ZjY5MSwgMHgwMDBjODRmZiwKKyAgICAweDQ2MGU2MTQ4LCAweGVjNGIyNmEyLCAweDA2MjA4OTllLCAweGZmM2I3MzFiLCAweGZmNDA2YmY4LCAweDAwYTk4MzRlLCAweGZmYmIzNGQ4LCAweDAwMGM1NDIyLAorICAgIDB4NDUxZTk3NTAsIDB4ZWMzMmFjYjAsIDB4MDY0NmI4MDgsIDB4ZmYyMGI5M2UsIDB4ZmY0ZGYxYmUsIDB4MDBhNDgzNGMsIDB4ZmZiYzc2N2YsIDB4MDAwYzIyNDUsCisgICAgMHg0NDJkNjlkZSwgMHhlYzFjZDY3NywgMHgwNjZiYmQwZCwgMHhmZjA2Njg4OSwgMHhmZjViNjAyYywgMHgwMDlmODI0OSwgMHhmZmJkYmI0MiwgMHgwMDBiZWY3OSwKKyAgICAweDQzM2FlOTljLCAweGVjMDk5ZGNmLCAweDA2OGY5NzgxLCAweGZlZWM4MzBkLCAweGZmNjhiNWQ1LCAweDAwOWE4MGY4LCAweGZmYmYwMmRkLCAweDAwMGJiYmQyLAorICAgIDB4NDI0NzI3M2YsIDB4ZWJmOGZjNjQsIDB4MDZiMjQ2NWIsIDB4ZmVkMzBhYzUsIDB4ZmY3NWYxNTMsIDB4MDA5NTgwMGMsIDB4ZmZjMDRkMGYsIDB4MDAwYjg3NjAsCisgICAgMHg0MTUyMzM4OSwgMHhlYmVhZWJhZiwgMHgwNmQzYzhiYiwgMHhmZWJhMDE5OSwgMHhmZjgzMTE0OCwgMHgwMDkwODAzNCwgMHhmZmMxOTk5NiwgMHgwMDBiNTIzNSwKKyAgICAweDQwNWMxZjQzLCAweGViZGY2NTAwLCAweDA2ZjQxZGUzLCAweGZlYTE2OTYwLCAweGZmOTAxNDVlLCAweDAwOGI4MjFiLCAweGZmYzJlODMyLCAweDAwMGIxYzY0LAorICAgIDB4M2Y2NGZiNDAsIDB4ZWJkNjYxN2IsIDB4MDcxMzQ1M2QsIDB4ZmU4OTQzZGMsIDB4ZmY5Y2Y5NDcsIDB4MDA4Njg2NmIsIDB4ZmZjNDM4YTMsIDB4MDAwYWU1ZmMsCisgICAgMHgzZTZjZDg1YiwgMHhlYmNmZGExOSwgMHgwNzMxM2U1NiwgMHhmZTcxOTJiZCwgMHhmZmE5YmViZSwgMHgwMDgxOGRjYiwgMHhmZmM1OGFhYSwgMHgwMDBhYWYwZiwKKyAgICAweDNkNzNjNzcyLCAweGViY2JjN2E3LCAweDA3NGUwOGUwLCAweGZlNWE1NzlkLCAweGZmYjY2Mzg2LCAweDAwN2M5OGRlLCAweGZmYzZkZTA5LCAweDAwMGE3N2FjLAorICAgIDB4M2M3OWQ5NjgsIDB4ZWJjYTIyY2MsIDB4MDc2OWE0YjIsIDB4ZmU0Mzk0MDcsIDB4ZmZjMmU2NjksIDB4MDA3N2E4NDUsIDB4ZmZjODMyODUsIDB4MDAwYTNmZTUsCisgICAgMHgzYjdmMWYyMywgMHhlYmNhZTQwNSwgMHgwNzg0MTFjNywgMHhmZTJkNDk2ZiwgMHhmZmNmNDYzYSwgMHgwMDcyYmM5ZCwgMHhmZmM5ODdlMCwgMHgwMDBhMDdjOSwKKyAgICAweDNhODNhOTg5LCAweGViY2UwM2FhLCAweDA3OWQ1MDNiLCAweGZlMTc3OTM3LCAweGZmZGI4MWQ2LCAweDAwNmRkNjgwLCAweGZmY2FkZGUxLCAweDAwMDljZjY3LAorICAgIDB4Mzk4Nzg5N2YsIDB4ZWJkMzc5ZWIsIDB4MDdiNTYwNTEsIDB4ZmUwMjI0YjAsIDB4ZmZlNzk4MjAsIDB4MDA2OGY2ODcsIDB4ZmZjYzM0NGMsIDB4MDAwOTk2Y2UsCisgICAgMHgzODhhY2ZlOSwgMHhlYmRiM2VkNSwgMHgwN2NjNDI2YywgMHhmZGVkNGQxMywgMHhmZmYzODgwNiwgMHgwMDY0MWQ0NCwgMHhmZmNkOGFlYiwgMHgwMDA5NWUwZSwKKyAgICAweDM3OGQ4ZGE4LCAweGViZTU0YTRmLCAweDA3ZTFmNzEyLCAweGZkZDhmMzhiLCAweGZmZmY1MDdiLCAweDAwNWY0YjRhLCAweGZmY2VlMTgzLCAweDAwMDkyNTM1LAorICAgIDB4MzY4ZmQzOTcsIDB4ZWJmMTk0MWYsIDB4MDdmNjdlZWMsIDB4ZmRjNTE5MmQsIDB4MDAwYWYwN2YsIDB4MDA1YTgxMjUsIDB4ZmZkMDM3ZTAsIDB4MDAwOGVjNTAsCisgICAgMHgzNTkxYjI4YiwgMHhlYzAwMTNlOCwgMHgwODA5ZGFjMywgMHhmZGIxYmVmYywgMHgwMDE2NjcxOCwgMHgwMDU1YmY2MCwgMHhmZmQxOGRjYywgMHgwMDA4YjM2ZSwKKyAgICAweDM0OTMzYjUwLCAweGVjMTBjMTJjLCAweDA4MWMwYjg0LCAweGZkOWVlNWU3LCAweDAwMjFiMzU1LCAweDAwNTEwNjgyLCAweGZmZDJlMzExLCAweDAwMDg3YTljLAorICAgIDB4MzM5NDdlYWIsIDB4ZWMyMzkzNGYsIDB4MDgyZDEyMzksIDB4ZmQ4YzhlY2MsIDB4MDAyY2Q0NGQsIDB4MDA0YzU3MGYsIDB4ZmZkNDM3N2QsIDB4MDAwODQxZTgsCisgICAgMHgzMjk1OGQ1NSwgMHhlYzM4ODE5NCwgMHgwODNjZjAxMCwgMHhmZDdhYmE3NCwgMHgwMDM3YzkyMiwgMHgwMDQ3YjE4NiwgMHhmZmQ1OGFkZSwgMHgwMDA4MDk1ZCwKKyAgICAweDMxOTY3N2ZhLCAweGVjNGY4MzIyLCAweDA4NGJhNjU0LCAweGZkNjk2OTk4LCAweDAwNDI5MGZjLCAweDAwNDMxNjY2LCAweGZmZDZkZDAyLCAweDAwMDdkMTA4LAorICAgIDB4MzA5NzRmM2IsIDB4ZWM2ODhmMDIsIDB4MDg1OTM2NzEsIDB4ZmQ1ODljZGMsIDB4MDA0ZDJiMGUsIDB4MDAzZTg2MjgsIDB4ZmZkODJkYmEsIDB4MDAwNzk4ZjUsCisgICAgMHgyZjk4MjNhOCwgMHhlYzgzOWMyMiwgMHgwODY1YTFmMSwgMHhmZDQ4NTRkMywgMHgwMDU3OTY5MSwgMHgwMDNhMDE0MSwgMHhmZmQ5N2NkNiwgMHgwMDA3NjEzMCwKKyAgICAweDJlOTkwNWMxLCAweGVjYTBhMTU2LCAweDA4NzBlYTdlLCAweGZkMzg5MWZkLCAweDAwNjFkMmNhLCAweDAwMzU4ODI0LCAweGZmZGFjYTJhLCAweDAwMDcyOWM0LAorICAgIDB4MmQ5YTA1ZjQsIDB4ZWNiZjk1NTgsIDB4MDg3YjExZGUsIDB4ZmQyOTU0YzgsIDB4MDA2YmRmMDUsIDB4MDAzMTFiNDEsIDB4ZmZkYzE1ODgsIDB4MDAwNmYyYmIsCisgICAgMHgyYzliMzQ5ZSwgMHhlY2UwNmVjYiwgMHgwODg0MTlmNiwgMHhmZDFhOWQ5MSwgMHgwMDc1YmE5NSwgMHgwMDJjYmIwMywgMHhmZmRkNWVjNiwgMHgwMDA2YmMyMSwKKyAgICAweDJiOWNhMjAzLCAweGVkMDMyNDM5LCAweDA4OGMwNGM4LCAweGZkMGM2Y2EyLCAweDAwN2Y2NGRhLCAweDAwMjg2N2QyLCAweGZmZGVhNWJiLCAweDAwMDY4NWZmLAorICAgIDB4MmE5ZTVlNTcsIDB4ZWQyN2FjMTYsIDB4MDg5MmQ0NzAsIDB4ZmNmZWMyMzMsIDB4MDA4OGRkMzgsIDB4MDAyNDIyMTMsIDB4ZmZkZmVhM2MsIDB4MDAwNjUwNWYsCisgICAgMHgyOWEwNzliMiwgMHhlZDRkZmNjMiwgMHgwODk4OGIyYSwgMHhmY2YxOWU2YiwgMHgwMDkyMjMxZSwgMHgwMDFmZWEyNywgMHhmZmUxMmMyMiwgMHgwMDA2MWI0YiwKKyAgICAweDI4YTMwNDE2LCAweGVkNzYwYzg4LCAweDA4OWQyYjRhLCAweGZjZTUwMTYxLCAweDAwOWIzNjA1LCAweDAwMWJjMDZiLCAweGZmZTI2YjQ4LCAweDAwMDVlNmNiLAorICAgIDB4MjdhNjBkNmEsIDB4ZWQ5ZmQxYTIsIDB4MDhhMGI3NDAsIDB4ZmNkOGViMTcsIDB4MDBhNDE1NmIsIDB4MDAxN2E1M2IsIDB4ZmZlM2E3ODgsIDB4MDAwNWIyZTgsCisgICAgMHgyNmE5YTU3YiwgMHhlZGNiNDIzNywgMHgwOGEzMzE5NiwgMHhmY2NkNWI4MiwgMHgwMGFjYzBkYSwgMHgwMDEzOThlYywgMHhmZmU0ZTBiZiwgMHgwMDA1N2ZhYSwKKyAgICAweDI1YWRkYmY5LCAweGVkZjg1NDViLCAweDA4YTQ5Y2YwLCAweGZjYzI1Mjg1LCAweDAwYjUzN2UxLCAweDAwMGY5YmQyLCAweGZmZTYxNmM4LCAweDAwMDU0ZDFhLAorICAgIDB4MjRiMmMwNzUsIDB4ZWUyNmZlMTcsIDB4MDhhNGZjMGQsIDB4ZmNiN2NmZjAsIDB4MDBiZDdhMWMsIDB4MDAwYmFlM2MsIDB4ZmZlNzQ5ODQsIDB4MDAwNTFiM2UsCisgICAgMHgyM2I4NjI2MywgMHhlZTU3MzU2MiwgMHgwOGE0NTFjMCwgMHhmY2FkZDM4NiwgMHgwMGM1ODcyYSwgMHgwMDA3ZDA3NSwgMHhmZmU4NzhkMywgMHgwMDA0ZWExZCwKKyAgICAweDIyYmVkMTE2LCAweGVlODhmMDI2LCAweDA4YTJhMGY4LCAweGZjYTQ1Y2Y3LCAweDAwY2Q1ZWI3LCAweDAwMDQwMmM4LCAweGZmZTlhNDk0LCAweDAwMDRiOWMwLAorICAgIDB4MjFjNjFiYzAsIDB4ZWViYzI0NDQsIDB4MDg5ZmVjYmIsIDB4ZmM5YjZiZTUsIDB4MDBkNTAwNzUsIDB4MDAwMDQ1NzksIDB4ZmZlYWNjYWEsIDB4MDAwNDhhMmIsCisgICAgMHgyMGNlNTE2ZiwgMHhlZWYwYzc4ZCwgMHgwODljMzgyNCwgMHhmYzkyZmZlMSwgMHgwMGRjNmMxZSwgMHhmZmZjOThjOSwgMHhmZmViZjBmYSwgMHgwMDA0NWI2NSwKKyAgICAweDFmZDc4MTBmLCAweGVmMjZjZmNhLCAweDA4OTc4NjY2LCAweGZjOGIxODZkLCAweDAwZTNhMTc1LCAweGZmZjhmY2Y3LCAweGZmZWQxMTY2LCAweDAwMDQyZDc0LAorICAgIDB4MWVlMWI5NjUsIDB4ZWY1ZTMyYmQsIDB4MDg5MWRhYzgsIDB4ZmM4M2I0ZmMsIDB4MDBlYWEwNDUsIDB4ZmZmNTcyM2QsIDB4ZmZlZTJkZDcsIDB4MDAwNDAwNWUsCisgICAgMHgxZGVkMDkxMSwgMHhlZjk2ZTYxYywgMHgwODhiMzhhOSwgMHhmYzdjZDRmMCwgMHgwMGYxNjg2MSwgMHhmZmYxZjhkMiwgMHhmZmVmNDYzMiwgMHgwMDAzZDQyNiwKKyAgICAweDFjZjk3ZThiLCAweGVmZDBkZjlhLCAweDA4ODNhMzc4LCAweGZjNzY3NzllLCAweDAwZjdmOWEzLCAweGZmZWU5MGViLCAweGZmZjA1YTYwLCAweDAwMDNhOGQyLAorICAgIDB4MWMwNzI4MjMsIDB4ZjAwYzE0ZTEsIDB4MDg3YjFlYmMsIDB4ZmM3MDljNGQsIDB4MDBmZTUzZWYsIDB4ZmZlYjNhYjgsIDB4ZmZmMTZhNGEsIDB4MDAwMzdlNjUsCisgICAgMHgxYjE2MTNmZiwgMHhmMDQ4N2I5OCwgMHgwODcxYWUwZCwgMHhmYzZiNDIzMywgMHgwMTA0NzcyZSwgMHhmZmU3ZjY2NiwgMHhmZmYyNzVkYiwgMHgwMDAzNTRlNSwKKyAgICAweDFhMjY1MDFiLCAweGYwODYwOTYyLCAweDA4Njc1NTE2LCAweGZjNjY2ODdhLCAweDAxMGE2MzUzLCAweGZmZTRjNDFlLCAweGZmZjM3ZDAwLCAweDAwMDMyYzU0LAorICAgIDB4MTkzN2VhNDcsIDB4ZjBjNGIzZTAsIDB4MDg1YzE3OTQsIDB4ZmM2MjBlM2QsIDB4MDExMDE4NTgsIDB4ZmZlMWE0MDgsIDB4ZmZmNDdmYTUsIDB4MDAwMzA0YjcsCisgICAgMHgxODRhZjAyNSwgMHhmMTA0NzBiMCwgMHgwODRmZjk1NywgMHhmYzVlMzI4YywgMHgwMTE1OTYzZCwgMHhmZmRlOTY0NiwgMHhmZmY1N2RiOCwgMHgwMDAyZGUwZSwKKyAgICAweDE3NWY2ZjJiLCAweGYxNDUzNTcxLCAweDA4NDJmZTNkLCAweGZjNWFkNDY1LCAweDAxMWFkZDBiLCAweGZmZGI5YWY4LCAweGZmZjY3NzI5LCAweDAwMDJiODVmLAorICAgIDB4MTY3NTc0OWUsIDB4ZjE4NmY3YzAsIDB4MDgzNTJhMzUsIDB4ZmM1N2YyYmUsIDB4MDExZmVjZDMsIDB4ZmZkOGIyM2IsIDB4ZmZmNzZiZTksIDB4MDAwMjkzYWEsCisgICAgMHgxNThkMGQ5NSwgMHhmMWM5YWQ0MCwgMHgwODI2ODEzZSwgMHhmYzU1OGM3YywgMHgwMTI0YzVhYiwgMHhmZmQ1ZGMyOCwgMHhmZmY4NWJlOCwgMHgwMDAyNmZmMiwKKyAgICAweDE0YTY0NmY2LCAweGYyMGQ0YjkyLCAweDA4MTcwNzY3LCAweGZjNTNhMDdiLCAweDAxMjk2N2IxLCAweGZmZDMxOGQ2LCAweGZmZjk0NzFiLCAweDAwMDI0ZDM5LAorICAgIDB4MTNjMTJkNzMsIDB4ZjI1MWM4NWQsIDB4MDgwNmMwY2IsIDB4ZmM1MjJkODgsIDB4MDEyZGQzMGEsIDB4ZmZkMDY4NTgsIDB4ZmZmYTJkNzQsIDB4MDAwMjJiN2YsCisgICAgMHgxMmRkY2Q4ZiwgMHhmMjk3MTk0ZCwgMHgwN2Y1YjE5MywgMHhmYzUxMzI2NiwgMHgwMTMyMDdlNCwgMHhmZmNkY2FiZSwgMHhmZmZiMGVlOSwgMHgwMDAyMGFjNywKKyAgICAweDExZmMzMzk1LCAweGYyZGQzNDExLCAweDA3ZTNkZGY3LCAweGZjNTBhZGNjLCAweDAxMzYwNjcwLCAweGZmY2I0MDE0LCAweGZmZmJlYjcwLCAweDAwMDFlYjEwLAorICAgIDB4MTExYzZiYTAsIDB4ZjMyNDBlNjEsIDB4MDdkMTRhMzgsIDB4ZmM1MDllNjQsIDB4MDEzOWNlZTksIDB4ZmZjOGM4NjYsIDB4ZmZmY2MzMDAsIDB4MDAwMWNjNWMsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9TdHJlYW1PdXQuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmQxYmU3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmNwcApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb0ZsaW5nZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQXVkaW9Id0RldmljZS5oIgorI2luY2x1ZGUgIkF1ZGlvU3RyZWFtT3V0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQXVkaW9TdHJlYW1PdXQ6OkF1ZGlvU3RyZWFtT3V0KEF1ZGlvSHdEZXZpY2UgKmRldiwgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCisgICAgICAgIDogYXVkaW9Id0RldihkZXYpCisgICAgICAgICwgc3RyZWFtKE5VTEwpCisgICAgICAgICwgZmxhZ3MoZmxhZ3MpCisgICAgICAgICwgbUZyYW1lc1dyaXR0ZW4oMCkKKyAgICAgICAgLCBtRnJhbWVzV3JpdHRlbkF0U3RhbmRieSgwKQorICAgICAgICAsIG1SZW5kZXJQb3NpdGlvbigwKQorICAgICAgICAsIG1SYXRlTXVsdGlwbGllcigxKQorICAgICAgICAsIG1IYWxGb3JtYXRJc0xpbmVhclBjbShmYWxzZSkKKyAgICAgICAgLCBtSGFsRnJhbWVTaXplKDApCit7Cit9CisKK2F1ZGlvX2h3X2RldmljZV90ICpBdWRpb1N0cmVhbU91dDo6aHdEZXYoKSBjb25zdAoreworICAgIHJldHVybiBhdWRpb0h3RGV2LT5od0RldmljZSgpOworfQorCitzdGF0dXNfdCBBdWRpb1N0cmVhbU91dDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDY0X3QgKmZyYW1lcykKK3sKKyAgICBpZiAoc3RyZWFtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgdWludDMyX3QgaGFsUG9zaXRpb24gPSAwOworICAgIHN0YXR1c190IHN0YXR1cyA9IHN0cmVhbS0+Z2V0X3JlbmRlcl9wb3NpdGlvbihzdHJlYW0sICZoYWxQb3NpdGlvbik7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8vIE1haW50YWluIGEgNjQtYml0IHJlbmRlciBwb3NpdGlvbiB1c2luZyB0aGUgMzItYml0IHJlc3VsdCBmcm9tIHRoZSBIQUwuCisgICAgLy8gVGhpcyBkZWx0YSBjYWxjdWxhdGlvbiByZWxpZXMgb24gdGhlIGFyaXRobWV0aWMgb3ZlcmZsb3cgYmVoYXZpb3IKKyAgICAvLyBvZiBpbnRlZ2Vycy4gRm9yIGV4YW1wbGUgKDEwMCAtIDB4RkZGRkZGRjApID0gMTE2LgorICAgIHVpbnQzMl90IHRydW5jYXRlZFBvc2l0aW9uID0gKHVpbnQzMl90KW1SZW5kZXJQb3NpdGlvbjsKKyAgICBpbnQzMl90IGRlbHRhSGFsUG9zaXRpb24gPSAoaW50MzJfdCkoaGFsUG9zaXRpb24gLSB0cnVuY2F0ZWRQb3NpdGlvbik7CisgICAgaWYgKGRlbHRhSGFsUG9zaXRpb24gPiAwKSB7CisgICAgICAgIG1SZW5kZXJQb3NpdGlvbiArPSBkZWx0YUhhbFBvc2l0aW9uOworICAgIH0KKyAgICAvLyBTY2FsZSBmcm9tIEhBTCBzYW1wbGUgcmF0ZSB0byBhcHBsaWNhdGlvbiByYXRlLgorICAgICpmcmFtZXMgPSBtUmVuZGVyUG9zaXRpb24gLyBtUmF0ZU11bHRpcGxpZXI7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvLyByZXR1cm4gYm90dG9tIDMyLWJpdHMgb2YgdGhlIHJlbmRlciBwb3NpdGlvbgorc3RhdHVzX3QgQXVkaW9TdHJlYW1PdXQ6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpmcmFtZXMpCit7CisgICAgdWludDY0X3QgcG9zaXRpb242NCA9IDA7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0UmVuZGVyUG9zaXRpb24oJnBvc2l0aW9uNjQpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgKmZyYW1lcyA9ICh1aW50MzJfdClwb3NpdGlvbjY0OworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1N0cmVhbU91dDo6Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApCit7CisgICAgaWYgKHN0cmVhbSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHVpbnQ2NF90IGhhbFBvc2l0aW9uID0gMDsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24oc3RyZWFtLCAmaGFsUG9zaXRpb24sIHRpbWVzdGFtcCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8vIEFkanVzdCBmb3Igc3RhbmRieSB1c2luZyBIQUwgcmF0ZSBmcmFtZXMuCisgICAgLy8gT25seSBhcHBseSB0aGlzIGNvcnJlY3Rpb24gaWYgdGhlIEhBTCBpcyBnZXR0aW5nIFBDTSBmcmFtZXMuCisgICAgaWYgKG1IYWxGb3JtYXRJc0xpbmVhclBjbSkgeworICAgICAgICB1aW50NjRfdCBhZGp1c3RlZFBvc2l0aW9uID0gKGhhbFBvc2l0aW9uIDw9IG1GcmFtZXNXcml0dGVuQXRTdGFuZGJ5KSA/CisgICAgICAgICAgICAgICAgMCA6IChoYWxQb3NpdGlvbiAtIG1GcmFtZXNXcml0dGVuQXRTdGFuZGJ5KTsKKyAgICAgICAgLy8gU2NhbGUgZnJvbSBIQUwgc2FtcGxlIHJhdGUgdG8gYXBwbGljYXRpb24gcmF0ZS4KKyAgICAgICAgKmZyYW1lcyA9IGFkanVzdGVkUG9zaXRpb24gLyBtUmF0ZU11bHRpcGxpZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRm9yIG9mZmxvYWRlZCBNUDMgYW5kIG90aGVyIGNvbXByZXNzZWQgZm9ybWF0cy4KKyAgICAgICAgKmZyYW1lcyA9IGhhbFBvc2l0aW9uOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvU3RyZWFtT3V0OjpvcGVuKAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MpCit7CisgICAgYXVkaW9fc3RyZWFtX291dF90ICpvdXRTdHJlYW07CisgICAgaW50IHN0YXR1cyA9IGh3RGV2KCktPm9wZW5fb3V0cHV0X3N0cmVhbSgKKyAgICAgICAgICAgIGh3RGV2KCksCisgICAgICAgICAgICBoYW5kbGUsCisgICAgICAgICAgICBkZXZpY2VzLAorICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICBjb25maWcsCisgICAgICAgICAgICAmb3V0U3RyZWFtLAorICAgICAgICAgICAgYWRkcmVzcyk7CisgICAgQUxPR1YoIkF1ZGlvU3RyZWFtT3V0OjpvcGVuKCksIEhBTCBvcGVuX291dHB1dF9zdHJlYW0gcmV0dXJuZWQgIgorICAgICAgICAgICAgIiAlcCwgc2FtcGxlUmF0ZSAlZCwgRm9ybWF0ICUjeCwgIgorICAgICAgICAgICAgImNoYW5uZWxNYXNrICUjeCwgc3RhdHVzICVkIiwKKyAgICAgICAgICAgIG91dFN0cmVhbSwKKyAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgICBjb25maWctPmZvcm1hdCwKKyAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgc3RhdHVzKTsKKworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgc3RyZWFtID0gb3V0U3RyZWFtOworICAgICAgICBtSGFsRm9ybWF0SXNMaW5lYXJQY20gPSBhdWRpb19pc19saW5lYXJfcGNtKGNvbmZpZy0+Zm9ybWF0KTsKKyAgICAgICAgQUxPR0koIkF1ZGlvU3RyZWFtT3V0OjpvcGVuKCksIG1IYWxGb3JtYXRJc0xpbmVhclBjbSA9ICVkIiwgKGludCltSGFsRm9ybWF0SXNMaW5lYXJQY20pOworICAgICAgICBtSGFsRnJhbWVTaXplID0gYXVkaW9fc3RyZWFtX291dF9mcmFtZV9zaXplKHN0cmVhbSk7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYXVkaW9fZm9ybWF0X3QgQXVkaW9TdHJlYW1PdXQ6OmdldEZvcm1hdCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN0cmVhbS0+Y29tbW9uLmdldF9mb3JtYXQoJnN0cmVhbS0+Y29tbW9uKTsKK30KKwordWludDMyX3QgQXVkaW9TdHJlYW1PdXQ6OmdldFNhbXBsZVJhdGUoKSBjb25zdAoreworICAgIHJldHVybiBzdHJlYW0tPmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUoJnN0cmVhbS0+Y29tbW9uKTsKK30KKworYXVkaW9fY2hhbm5lbF9tYXNrX3QgQXVkaW9TdHJlYW1PdXQ6OmdldENoYW5uZWxNYXNrKCkgY29uc3QKK3sKKyAgICByZXR1cm4gc3RyZWFtLT5jb21tb24uZ2V0X2NoYW5uZWxzKCZzdHJlYW0tPmNvbW1vbik7Cit9CisKK2ludCBBdWRpb1N0cmVhbU91dDo6Zmx1c2goKQoreworICAgIEFMT0dfQVNTRVJUKHN0cmVhbSAhPSBOVUxMKTsKKyAgICBtUmVuZGVyUG9zaXRpb24gPSAwOworICAgIG1GcmFtZXNXcml0dGVuID0gMDsKKyAgICBtRnJhbWVzV3JpdHRlbkF0U3RhbmRieSA9IDA7CisgICAgaWYgKHN0cmVhbS0+Zmx1c2ggIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gc3RyZWFtLT5mbHVzaChzdHJlYW0pOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2ludCBBdWRpb1N0cmVhbU91dDo6c3RhbmRieSgpCit7CisgICAgQUxPR19BU1NFUlQoc3RyZWFtICE9IE5VTEwpOworICAgIG1SZW5kZXJQb3NpdGlvbiA9IDA7CisgICAgbUZyYW1lc1dyaXR0ZW5BdFN0YW5kYnkgPSBtRnJhbWVzV3JpdHRlbjsKKyAgICByZXR1cm4gc3RyZWFtLT5jb21tb24uc3RhbmRieSgmc3RyZWFtLT5jb21tb24pOworfQorCitzc2l6ZV90IEF1ZGlvU3RyZWFtT3V0Ojp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBudW1CeXRlcykKK3sKKyAgICBBTE9HX0FTU0VSVChzdHJlYW0gIT0gTlVMTCk7CisgICAgc3NpemVfdCBieXRlc1dyaXR0ZW4gPSBzdHJlYW0tPndyaXRlKHN0cmVhbSwgYnVmZmVyLCBudW1CeXRlcyk7CisgICAgaWYgKGJ5dGVzV3JpdHRlbiA+IDAgJiYgbUhhbEZyYW1lU2l6ZSA+IDApIHsKKyAgICAgICAgbUZyYW1lc1dyaXR0ZW4gKz0gYnl0ZXNXcml0dGVuIC8gbUhhbEZyYW1lU2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIGJ5dGVzV3JpdHRlbjsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9TdHJlYW1PdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmEyMjc3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTUsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19TVFJFQU1fT1VUX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19TVFJFQU1fT1VUX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJBdWRpb1N0cmVhbU91dC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEF1ZGlvSHdEZXZpY2U7CisKKy8qKgorICogTWFuYWdlZCBhY2Nlc3MgdG8gYSBIQUwgb3V0cHV0IHN0cmVhbS4KKyAqLworY2xhc3MgQXVkaW9TdHJlYW1PdXQgeworcHVibGljOgorLy8gQXVkaW9TdHJlYW1PdXQgaXMgaW1tdXRhYmxlLCBzbyBpdHMgZmllbGRzIGFyZSBjb25zdC4KKy8vIEZvciBlbXBoYXNpcywgd2UgY291bGQgYWxzbyBtYWtlIGFsbCBwb2ludGVycyB0byB0aGVtIGJlICJjb25zdCAqIiwKKy8vIGJ1dCB0aGF0IHdvdWxkIGNsdXR0ZXIgdGhlIGNvZGUgdW5uZWNlc3NhcmlseS4KKyAgICBBdWRpb0h3RGV2aWNlICogY29uc3QgYXVkaW9Id0RldjsKKyAgICBhdWRpb19zdHJlYW1fb3V0X3QgKnN0cmVhbTsKKyAgICBjb25zdCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFnczsKKworICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldigpIGNvbnN0OworCisgICAgQXVkaW9TdHJlYW1PdXQoQXVkaW9Id0RldmljZSAqZGV2LCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW4oCisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MpOworCisgICAgdmlydHVhbCB+QXVkaW9TdHJlYW1PdXQoKSB7IH0KKworICAgIC8vIEdldCB0aGUgYm90dG9tIDMyLWJpdHMgb2YgdGhlIDY0LWJpdCByZW5kZXIgcG9zaXRpb24uCisgICAgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmZyYW1lcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCk7CisKKyAgICAvKioKKyAgICAqIFdyaXRlIGF1ZGlvIGJ1ZmZlciB0byBkcml2ZXIuIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4sIG9yIGEKKyAgICAqIG5lZ2F0aXZlIHN0YXR1c190LiBJZiBhdCBsZWFzdCBvbmUgZnJhbWUgd2FzIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5IHByaW9yIHRvIHRoZSBlcnJvciwKKyAgICAqIGl0IGlzIHN1Z2dlc3RlZCB0aGF0IHRoZSBkcml2ZXIgcmV0dXJuIHRoYXQgc3VjY2Vzc2Z1bCAoc2hvcnQpIGJ5dGUgY291bnQKKyAgICAqIGFuZCB0aGVuIHJldHVybiBhbiBlcnJvciBpbiB0aGUgc3Vic2VxdWVudCBjYWxsLgorICAgICoKKyAgICAqIElmIHNldF9jYWxsYmFjaygpIGhhcyBwcmV2aW91c2x5IGJlZW4gY2FsbGVkIHRvIGVuYWJsZSBub24tYmxvY2tpbmcgbW9kZQorICAgICogdGhlIHdyaXRlKCkgaXMgbm90IGFsbG93ZWQgdG8gYmxvY2suIEl0IG11c3Qgd3JpdGUgb25seSB0aGUgbnVtYmVyIG9mCisgICAgKiBieXRlcyB0aGF0IGN1cnJlbnRseSBmaXQgaW4gdGhlIGRyaXZlci9oYXJkd2FyZSBidWZmZXIgYW5kIHRoZW4gcmV0dXJuCisgICAgKiB0aGlzIGJ5dGUgY291bnQuIElmIHRoaXMgaXMgbGVzcyB0aGFuIHRoZSByZXF1ZXN0ZWQgd3JpdGUgc2l6ZSB0aGUKKyAgICAqIGNhbGxiYWNrIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdoZW4gbW9yZSBzcGFjZSBpcyBhdmFpbGFibGUgaW4gdGhlCisgICAgKiBkcml2ZXIvaGFyZHdhcmUgYnVmZmVyLgorICAgICovCisgICAgdmlydHVhbCBzc2l6ZV90IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gZnJhbWUgc2l6ZSBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBBdWRpb0ZsaW5nZXIuCisgICAgICovCisgICAgdmlydHVhbCBzaXplX3QgZ2V0RnJhbWVTaXplKCkgY29uc3QgeyByZXR1cm4gbUhhbEZyYW1lU2l6ZTsgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBmb3JtYXQgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgQXVkaW9GbGluZ2VyLgorICAgICAqLworICAgIHZpcnR1YWwgYXVkaW9fZm9ybWF0X3QgZ2V0Rm9ybWF0KCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBUaGUgSEFMIG1heSBiZSBydW5uaW5nIGF0IGEgaGlnaGVyIHNhbXBsZSByYXRlIGlmLCBmb3IgZXhhbXBsZSwgcGxheWluZyB3cmFwcGVkIEVBQzMuCisgICAgICogQHJldHVybiBzYW1wbGUgcmF0ZSBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBBdWRpb0ZsaW5nZXIuCisgICAgICovCisgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTYW1wbGVSYXRlKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBUaGUgSEFMIGlzIGluIHN0ZXJlbyBtb2RlIHdoZW4gcGxheWluZyBtdWx0aS1jaGFubmVsIGNvbXByZXNzZWQgYXVkaW8gb3ZlciBIRE1JLgorICAgICAqIEByZXR1cm4gY2hhbm5lbCBtYXNrIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIEF1ZGlvRmxpbmdlci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGF1ZGlvX2NoYW5uZWxfbWFza190IGdldENoYW5uZWxNYXNrKCkgY29uc3Q7CisKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKKworcHJvdGVjdGVkOgorICAgIHVpbnQ2NF90ICAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuOyAvLyByZXNldCBieSBmbHVzaAorICAgIHVpbnQ2NF90ICAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuQXRTdGFuZGJ5OworICAgIHVpbnQ2NF90ICAgICAgICAgICAgIG1SZW5kZXJQb3NpdGlvbjsgLy8gcmVzZXQgYnkgZmx1c2ggb3Igc3RhbmRieQorICAgIGludCAgICAgICAgICAgICAgICAgIG1SYXRlTXVsdGlwbGllcjsKKyAgICBib29sICAgICAgICAgICAgICAgICBtSGFsRm9ybWF0SXNMaW5lYXJQY207CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgbUhhbEZyYW1lU2l6ZTsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfQVVESU9fU1RSRUFNX09VVF9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQnVmZmVyUHJvdmlkZXJzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9CdWZmZXJQcm92aWRlcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YmUyMDYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQnVmZmVyUHJvdmlkZXJzLmNwcApAQCAtMCwwICsxLDU0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUHJvdmlkZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9kb3dubWl4Lmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Zvcm1hdC5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgIkJ1ZmZlclByb3ZpZGVycy5oIgorCisjaWZuZGVmIEFSUkFZX1NJWkUKKyNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9mKHgpL3NpemVvZigoeClbMF0pKQorI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBpbmxpbmUgVCBtaW4oY29uc3QgVCYgYSwgY29uc3QgVCYgYikKK3sKKyAgICByZXR1cm4gYSA8IGIgPyBhIDogYjsKK30KKworQ29weUJ1ZmZlclByb3ZpZGVyOjpDb3B5QnVmZmVyUHJvdmlkZXIoc2l6ZV90IGlucHV0RnJhbWVTaXplLAorICAgICAgICBzaXplX3Qgb3V0cHV0RnJhbWVTaXplLCBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCkgOgorICAgICAgICBtSW5wdXRGcmFtZVNpemUoaW5wdXRGcmFtZVNpemUpLAorICAgICAgICBtT3V0cHV0RnJhbWVTaXplKG91dHB1dEZyYW1lU2l6ZSksCisgICAgICAgIG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQoYnVmZmVyRnJhbWVDb3VudCksCisgICAgICAgIG1Mb2NhbEJ1ZmZlckRhdGEoTlVMTCksCisgICAgICAgIG1Db25zdW1lZCgwKQoreworICAgIEFMT0dWKCJDb3B5QnVmZmVyUHJvdmlkZXIoJXApKCV6dSwgJXp1LCAlenUpIiwgdGhpcywKKyAgICAgICAgICAgIGlucHV0RnJhbWVTaXplLCBvdXRwdXRGcmFtZVNpemUsIGJ1ZmZlckZyYW1lQ291bnQpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaW5wdXRGcmFtZVNpemUgPCBvdXRwdXRGcmFtZVNpemUgJiYgYnVmZmVyRnJhbWVDb3VudCA9PSAwLAorICAgICAgICAgICAgIlJlcXVpcmVzIGxvY2FsIGJ1ZmZlciBpZiBpbnB1dEZyYW1lU2l6ZSglenUpIDwgb3V0cHV0RnJhbWVTaXplKCV6dSkiLAorICAgICAgICAgICAgaW5wdXRGcmFtZVNpemUsIG91dHB1dEZyYW1lU2l6ZSk7CisgICAgaWYgKG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQpIHsKKyAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1Mb2NhbEJ1ZmZlckRhdGEsIDMyLCBtTG9jYWxCdWZmZXJGcmFtZUNvdW50ICogbU91dHB1dEZyYW1lU2l6ZSk7CisgICAgfQorICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IDA7Cit9CisKK0NvcHlCdWZmZXJQcm92aWRlcjo6fkNvcHlCdWZmZXJQcm92aWRlcigpCit7CisgICAgQUxPR1YoIn5Db3B5QnVmZmVyUHJvdmlkZXIoJXApIiwgdGhpcyk7CisgICAgaWYgKG1CdWZmZXIuZnJhbWVDb3VudCAhPSAwKSB7CisgICAgICAgIG1UcmFja0J1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZtQnVmZmVyKTsKKyAgICB9CisgICAgZnJlZShtTG9jYWxCdWZmZXJEYXRhKTsKK30KKworc3RhdHVzX3QgQ29weUJ1ZmZlclByb3ZpZGVyOjpnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciAqcEJ1ZmZlciwKKyAgICAgICAgaW50NjRfdCBwdHMpCit7CisgICAgLy9BTE9HVigiQ29weUJ1ZmZlclByb3ZpZGVyKCVwKTo6Z2V0TmV4dEJ1ZmZlciglcCAoJXp1KSwgJWxsZCkiLAorICAgIC8vICAgICAgICB0aGlzLCBwQnVmZmVyLCBwQnVmZmVyLT5mcmFtZUNvdW50LCBwdHMpOworICAgIGlmIChtTG9jYWxCdWZmZXJGcmFtZUNvdW50ID09IDApIHsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gbVRyYWNrQnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIocEJ1ZmZlciwgcHRzKTsKKyAgICAgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICAgICAgY29weUZyYW1lcyhwQnVmZmVyLT5yYXcsIHBCdWZmZXItPnJhdywgcEJ1ZmZlci0+ZnJhbWVDb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgaWYgKG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IHBCdWZmZXItPmZyYW1lQ291bnQ7CisgICAgICAgIHN0YXR1c190IHJlcyA9IG1UcmFja0J1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZtQnVmZmVyLCBwdHMpOworICAgICAgICAvLyBBdCBvbmUgdGltZSBhbiB1cHN0cmVhbSBidWZmZXIgcHJvdmlkZXIgaGFkCisgICAgICAgIC8vIHJlcyA9PSBPSyBhbmQgbUJ1ZmZlci5mcmFtZUNvdW50ID09IDAsIGRvZXNuJ3Qgc2VlbSB0byBoYXBwZW4gbm93IDcvMTgvMjAxNC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQnkgQVBJIHNwZWMsIGlmIHJlcyAhPSBPSywgdGhlbiBtQnVmZmVyLmZyYW1lQ291bnQgPT0gMC4KKyAgICAgICAgLy8gYnV0IHRoZXJlIG1heSBiZSBpbXByb3BlciBpbXBsZW1lbnRhdGlvbnMuCisgICAgICAgIEFMT0dfQVNTRVJUKHJlcyA9PSBPSyB8fCBtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCk7CisgICAgICAgIGlmIChyZXMgIT0gT0sgfHwgbUJ1ZmZlci5mcmFtZUNvdW50ID09IDApIHsgLy8gbm90IG5lZWRlZCBieSBBUEkgc3BlYywgYnV0IHRvIGJlIHNhZmUuCisgICAgICAgICAgICBwQnVmZmVyLT5yYXcgPSBOVUxMOworICAgICAgICAgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIG1Db25zdW1lZCA9IDA7CisgICAgfQorICAgIEFMT0dfQVNTRVJUKG1Db25zdW1lZCA8IG1CdWZmZXIuZnJhbWVDb3VudCk7CisgICAgc2l6ZV90IGNvdW50ID0gbWluKG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQsIG1CdWZmZXIuZnJhbWVDb3VudCAtIG1Db25zdW1lZCk7CisgICAgY291bnQgPSBtaW4oY291bnQsIHBCdWZmZXItPmZyYW1lQ291bnQpOworICAgIHBCdWZmZXItPnJhdyA9IG1Mb2NhbEJ1ZmZlckRhdGE7CisgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IGNvdW50OworICAgIGNvcHlGcmFtZXMocEJ1ZmZlci0+cmF3LCAodWludDhfdCopbUJ1ZmZlci5yYXcgKyBtQ29uc3VtZWQgKiBtSW5wdXRGcmFtZVNpemUsCisgICAgICAgICAgICBwQnVmZmVyLT5mcmFtZUNvdW50KTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQ29weUJ1ZmZlclByb3ZpZGVyOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciAqcEJ1ZmZlcikKK3sKKyAgICAvL0FMT0dWKCJDb3B5QnVmZmVyUHJvdmlkZXIoJXApOjpyZWxlYXNlQnVmZmVyKCVwKCV6dSkpIiwKKyAgICAvLyAgICAgICAgdGhpcywgcEJ1ZmZlciwgcEJ1ZmZlci0+ZnJhbWVDb3VudCk7CisgICAgaWYgKG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcihwQnVmZmVyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBMT0dfQUxXQVlTX0ZBVEFMX0lGKHBCdWZmZXItPmZyYW1lQ291bnQgPT0gMCwgIkludmFsaWQgZnJhbWVjb3VudCIpOworICAgIG1Db25zdW1lZCArPSBwQnVmZmVyLT5mcmFtZUNvdW50OyAvLyBUT0RPOiB1cGRhdGUgZm9yIGVmZmljaWVuY3kgdG8gcmV1c2UgZXhpc3RpbmcgY29udGVudAorICAgIGlmIChtQ29uc3VtZWQgIT0gMCAmJiBtQ29uc3VtZWQgPj0gbUJ1ZmZlci5mcmFtZUNvdW50KSB7CisgICAgICAgIG1UcmFja0J1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZtQnVmZmVyKTsKKyAgICAgICAgQUxPR19BU1NFUlQobUJ1ZmZlci5mcmFtZUNvdW50ID09IDApOworICAgIH0KKyAgICBwQnVmZmVyLT5yYXcgPSBOVUxMOworICAgIHBCdWZmZXItPmZyYW1lQ291bnQgPSAwOworfQorCit2b2lkIENvcHlCdWZmZXJQcm92aWRlcjo6cmVzZXQoKQoreworICAgIGlmIChtQnVmZmVyLmZyYW1lQ291bnQgIT0gMCkgeworICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmbUJ1ZmZlcik7CisgICAgfQorICAgIG1Db25zdW1lZCA9IDA7Cit9CisKK0Rvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5wdXRDaGFubmVsTWFzaywKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0cHV0Q2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBzZXNzaW9uSWQsIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KSA6CisgICAgICAgIENvcHlCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSAqIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhpbnB1dENoYW5uZWxNYXNrKSwKKyAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSAqIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhvdXRwdXRDaGFubmVsTWFzayksCisgICAgICAgICAgICBidWZmZXJGcmFtZUNvdW50KSAgLy8gc2V0IGJ1ZmZlckZyYW1lQ291bnQgdG8gMCB0byBkbyBpbi1wbGFjZQoreworICAgIEFMT0dWKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlciglcCkoJSN4LCAlI3gsICUjeCAldSAlZCkiLAorICAgICAgICAgICAgdGhpcywgaW5wdXRDaGFubmVsTWFzaywgb3V0cHV0Q2hhbm5lbE1hc2ssIGZvcm1hdCwKKyAgICAgICAgICAgIHNhbXBsZVJhdGUsIHNlc3Npb25JZCk7CisgICAgaWYgKCFzSXNNdWx0aWNoYW5uZWxDYXBhYmxlCisgICAgICAgICAgICB8fCBFZmZlY3RDcmVhdGUoJnNEd25tRnhEZXNjLnV1aWQsCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgU0VTU0lPTl9JRF9JTlZBTElEX0FORF9JR05PUkVELAorICAgICAgICAgICAgICAgICAgICAmbURvd25taXhIYW5kbGUpICE9IDApIHsKKyAgICAgICAgIEFMT0dFKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpIGVycm9yIGNyZWF0aW5nIGRvd25taXhlciBlZmZlY3QiKTsKKyAgICAgICAgIG1Eb3dubWl4SGFuZGxlID0gTlVMTDsKKyAgICAgICAgIHJldHVybjsKKyAgICAgfQorICAgICAvLyBjaGFubmVsIGlucHV0IGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBvdmVycmlkZGVuIHBlci10cmFjaworICAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IGlucHV0Q2hhbm5lbE1hc2s7ICAgLy8gRklYTUU6IFNob3VsZCBiZSBiaXRzCisgICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IG91dHB1dENoYW5uZWxNYXNrOyAvLyBGSVhNRTogc2hvdWxkIGJlIGJpdHMKKyAgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gZm9ybWF0OworICAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gZm9ybWF0OworICAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSBzYW1wbGVSYXRlOworICAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gc2FtcGxlUmF0ZTsKKyAgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CisgICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEU7CisgICAgIC8vIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVyIHByb3ZpZGVyLCBhbmQgZnJhbWUgY291bnQgd2lsbCBub3QgYmUgdXNlZCBhcyB0aGUgZG93bm1peCBlZmZlY3QKKyAgICAgLy8gcHJvY2VzcygpIGZ1bmN0aW9uIGlzIGNhbGxlZCBkaXJlY3RseSAoc2VlIERvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpnZXROZXh0QnVmZmVyKCkpCisgICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX1NNUF9SQVRFIHwgRUZGRUNUX0NPTkZJR19DSEFOTkVMUyB8CisgICAgICAgICAgICAgRUZGRUNUX0NPTkZJR19GT1JNQVQgfCBFRkZFQ1RfQ09ORklHX0FDQ19NT0RFOworICAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcubWFzayA9IG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLm1hc2s7CisKKyAgICAgaW50IGNtZFN0YXR1czsKKyAgICAgdWludDMyX3QgcmVwbHlTaXplID0gc2l6ZW9mKGludCk7CisKKyAgICAgLy8gQ29uZmlndXJlIGRvd25taXhlcgorICAgICBzdGF0dXNfdCBzdGF0dXMgPSAoKm1Eb3dubWl4SGFuZGxlKS0+Y29tbWFuZChtRG93bm1peEhhbmRsZSwKKyAgICAgICAgICAgICBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgLypjbWRDb2RlKi8sIHNpemVvZihlZmZlY3RfY29uZmlnX3QpIC8qY21kU2l6ZSovLAorICAgICAgICAgICAgICZtRG93bm1peENvbmZpZyAvKnBDbWREYXRhKi8sCisgICAgICAgICAgICAgJnJlcGx5U2l6ZSwgJmNtZFN0YXR1cyAvKnBSZXBseURhdGEqLyk7CisgICAgIGlmIChzdGF0dXMgIT0gMCB8fCBjbWRTdGF0dXMgIT0gMCkgeworICAgICAgICAgQUxPR0UoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCkgZXJyb3IgJWQgY21kU3RhdHVzICVkIHdoaWxlIGNvbmZpZ3VyaW5nIGRvd25taXhlciIsCisgICAgICAgICAgICAgICAgIHN0YXR1cywgY21kU3RhdHVzKTsKKyAgICAgICAgIEVmZmVjdFJlbGVhc2UobURvd25taXhIYW5kbGUpOworICAgICAgICAgbURvd25taXhIYW5kbGUgPSBOVUxMOworICAgICAgICAgcmV0dXJuOworICAgICB9CisKKyAgICAgLy8gRW5hYmxlIGRvd25taXhlcgorICAgICByZXBseVNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgc3RhdHVzID0gKCptRG93bm1peEhhbmRsZSktPmNvbW1hbmQobURvd25taXhIYW5kbGUsCisgICAgICAgICAgICAgRUZGRUNUX0NNRF9FTkFCTEUgLypjbWRDb2RlKi8sIDAgLypjbWRTaXplKi8sIE5VTEwgLypwQ21kRGF0YSovLAorICAgICAgICAgICAgICZyZXBseVNpemUsICZjbWRTdGF0dXMgLypwUmVwbHlEYXRhKi8pOworICAgICBpZiAoc3RhdHVzICE9IDAgfHwgY21kU3RhdHVzICE9IDApIHsKKyAgICAgICAgIEFMT0dFKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpIGVycm9yICVkIGNtZFN0YXR1cyAlZCB3aGlsZSBlbmFibGluZyBkb3dubWl4ZXIiLAorICAgICAgICAgICAgICAgICBzdGF0dXMsIGNtZFN0YXR1cyk7CisgICAgICAgICBFZmZlY3RSZWxlYXNlKG1Eb3dubWl4SGFuZGxlKTsKKyAgICAgICAgIG1Eb3dubWl4SGFuZGxlID0gTlVMTDsKKyAgICAgICAgIHJldHVybjsKKyAgICAgfQorCisgICAgIC8vIFNldCBkb3dubWl4IHR5cGUKKyAgICAgLy8gcGFyYW1ldGVyIHNpemUgcm91bmRlZCBmb3IgcGFkZGluZyBvbiAzMmJpdCBib3VuZGFyeQorICAgICBjb25zdCBpbnQgcHNpemVQYWRkZWQgPSAoKHNpemVvZihkb3dubWl4X3BhcmFtc190KSAtIDEpL3NpemVvZihpbnQpICsgMSkgKiBzaXplb2YoaW50KTsKKyAgICAgY29uc3QgaW50IGRvd25taXhQYXJhbVNpemUgPQorICAgICAgICAgICAgIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwc2l6ZVBhZGRlZCArIHNpemVvZihkb3dubWl4X3R5cGVfdCk7CisgICAgIGVmZmVjdF9wYXJhbV90ICogY29uc3QgcGFyYW0gPSAoZWZmZWN0X3BhcmFtX3QgKikgbWFsbG9jKGRvd25taXhQYXJhbVNpemUpOworICAgICBwYXJhbS0+cHNpemUgPSBzaXplb2YoZG93bm1peF9wYXJhbXNfdCk7CisgICAgIGNvbnN0IGRvd25taXhfcGFyYW1zX3QgZG93bm1peFBhcmFtID0gRE9XTk1JWF9QQVJBTV9UWVBFOworICAgICBtZW1jcHkocGFyYW0tPmRhdGEsICZkb3dubWl4UGFyYW0sIHBhcmFtLT5wc2l6ZSk7CisgICAgIGNvbnN0IGRvd25taXhfdHlwZV90IGRvd25taXhUeXBlID0gRE9XTk1JWF9UWVBFX0ZPTEQ7CisgICAgIHBhcmFtLT52c2l6ZSA9IHNpemVvZihkb3dubWl4X3R5cGVfdCk7CisgICAgIG1lbWNweShwYXJhbS0+ZGF0YSArIHBzaXplUGFkZGVkLCAmZG93bm1peFR5cGUsIHBhcmFtLT52c2l6ZSk7CisgICAgIHJlcGx5U2l6ZSA9IHNpemVvZihpbnQpOworICAgICBzdGF0dXMgPSAoKm1Eb3dubWl4SGFuZGxlKS0+Y29tbWFuZChtRG93bm1peEhhbmRsZSwKKyAgICAgICAgICAgICBFRkZFQ1RfQ01EX1NFVF9QQVJBTSAvKiBjbWRDb2RlICovLCBkb3dubWl4UGFyYW1TaXplIC8qIGNtZFNpemUgKi8sCisgICAgICAgICAgICAgcGFyYW0gLypwQ21kRGF0YSovLCAmcmVwbHlTaXplLCAmY21kU3RhdHVzIC8qcFJlcGx5RGF0YSovKTsKKyAgICAgZnJlZShwYXJhbSk7CisgICAgIGlmIChzdGF0dXMgIT0gMCB8fCBjbWRTdGF0dXMgIT0gMCkgeworICAgICAgICAgQUxPR0UoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCkgZXJyb3IgJWQgY21kU3RhdHVzICVkIHdoaWxlIHNldHRpbmcgZG93bm1peCB0eXBlIiwKKyAgICAgICAgICAgICAgICAgc3RhdHVzLCBjbWRTdGF0dXMpOworICAgICAgICAgRWZmZWN0UmVsZWFzZShtRG93bm1peEhhbmRsZSk7CisgICAgICAgICBtRG93bm1peEhhbmRsZSA9IE5VTEw7CisgICAgICAgICByZXR1cm47CisgICAgIH0KKyAgICAgQUxPR1YoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCkgZG93bm1peCB0eXBlIHNldCB0byAlZCIsIChpbnQpIGRvd25taXhUeXBlKTsKK30KKworRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6On5Eb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpCit7CisgICAgQUxPR1YoIn5Eb3dubWl4ZXJCdWZmZXJQcm92aWRlciAoJXApIiwgdGhpcyk7CisgICAgRWZmZWN0UmVsZWFzZShtRG93bm1peEhhbmRsZSk7CisgICAgbURvd25taXhIYW5kbGUgPSBOVUxMOworfQorCit2b2lkIERvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKQoreworICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVzOworICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcgPSBjb25zdF9jYXN0PHZvaWQgKj4oc3JjKTsKKyAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZXM7CisgICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5yYXcgPSBkc3Q7CisgICAgLy8gbWF5IGJlIGluLXBsYWNlIGlmIHNyYyA9PSBkc3QuCisgICAgc3RhdHVzX3QgcmVzID0gKCptRG93bm1peEhhbmRsZSktPnByb2Nlc3MobURvd25taXhIYW5kbGUsCisgICAgICAgICAgICAmbURvd25taXhDb25maWcuaW5wdXRDZmcuYnVmZmVyLCAmbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmJ1ZmZlcik7CisgICAgQUxPR0VfSUYocmVzICE9IE9LLCAiRG93bm1peEJ1ZmZlclByb3ZpZGVyIGVycm9yICVkIiwgcmVzKTsKK30KKworLyogY2FsbCBvbmNlIGluIGEgcHRocmVhZF9vbmNlIGhhbmRsZXIuICovCisvKnN0YXRpYyovIHN0YXR1c190IERvd25taXhlckJ1ZmZlclByb3ZpZGVyOjppbml0KCkKK3sKKyAgICAvLyBmaW5kIG11bHRpY2hhbm5lbCBkb3dubWl4IGVmZmVjdCBpZiB3ZSBoYXZlIHRvIHBsYXkgbXVsdGljaGFubmVsIGNvbnRlbnQKKyAgICB1aW50MzJfdCBudW1FZmZlY3RzID0gMDsKKyAgICBpbnQgcmV0ID0gRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCZudW1FZmZlY3RzKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgQUxPR0UoIkF1ZGlvTWl4ZXIoKSBlcnJvciAlZCBxdWVyeWluZyBudW1iZXIgb2YgZWZmZWN0cyIsIHJldCk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBBTE9HVigiRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCkgbnVtRWZmZWN0cz0lZCIsIG51bUVmZmVjdHMpOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMCA7IGkgPCBudW1FZmZlY3RzIDsgaSsrKSB7CisgICAgICAgIGlmIChFZmZlY3RRdWVyeUVmZmVjdChpLCAmc0R3bm1GeERlc2MpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJlZmZlY3QgJWQgaXMgY2FsbGVkICVzIiwgaSwgc0R3bm1GeERlc2MubmFtZSk7CisgICAgICAgICAgICBpZiAobWVtY21wKCZzRHdubUZ4RGVzYy50eXBlLCBFRkZFQ1RfVUlJRF9ET1dOTUlYLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiZm91bmQgZWZmZWN0IFwiJXNcIiBmcm9tICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNEd25tRnhEZXNjLm5hbWUsIHNEd25tRnhEZXNjLmltcGxlbWVudG9yKTsKKyAgICAgICAgICAgICAgICBzSXNNdWx0aWNoYW5uZWxDYXBhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HV19JRighc0lzTXVsdGljaGFubmVsQ2FwYWJsZSwgInVuYWJsZSB0byBmaW5kIGRvd25taXggZWZmZWN0Iik7CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKKy8qc3RhdGljKi8gYm9vbCBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6c0lzTXVsdGljaGFubmVsQ2FwYWJsZSA9IGZhbHNlOworLypzdGF0aWMqLyBlZmZlY3RfZGVzY3JpcHRvcl90IERvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpzRHdubUZ4RGVzYzsKKworUmVtaXhCdWZmZXJQcm92aWRlcjo6UmVtaXhCdWZmZXJQcm92aWRlcihhdWRpb19jaGFubmVsX21hc2tfdCBpbnB1dENoYW5uZWxNYXNrLAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRwdXRDaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCkgOgorICAgICAgICBDb3B5QnVmZmVyUHJvdmlkZXIoCisgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpCisgICAgICAgICAgICAgICAgICAgICogYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGlucHV0Q2hhbm5lbE1hc2spLAorICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KQorICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhvdXRwdXRDaGFubmVsTWFzayksCisgICAgICAgICAgICAgICAgYnVmZmVyRnJhbWVDb3VudCksCisgICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKKyAgICAgICAgbVNhbXBsZVNpemUoYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpKSwKKyAgICAgICAgbUlucHV0Q2hhbm5lbHMoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGlucHV0Q2hhbm5lbE1hc2spKSwKKyAgICAgICAgbU91dHB1dENoYW5uZWxzKGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhvdXRwdXRDaGFubmVsTWFzaykpCit7CisgICAgQUxPR1YoIlJlbWl4QnVmZmVyUHJvdmlkZXIoJXApKCUjeCwgJSN4LCAlI3gpICV6dSAlenUiLAorICAgICAgICAgICAgdGhpcywgZm9ybWF0LCBpbnB1dENoYW5uZWxNYXNrLCBvdXRwdXRDaGFubmVsTWFzaywKKyAgICAgICAgICAgIG1JbnB1dENoYW5uZWxzLCBtT3V0cHV0Q2hhbm5lbHMpOworICAgICh2b2lkKSBtZW1jcHlfYnlfaW5kZXhfYXJyYXlfaW5pdGlhbGl6YXRpb25fZnJvbV9jaGFubmVsX21hc2soCisgICAgICAgICAgICBtSWR4QXJ5LCBBUlJBWV9TSVpFKG1JZHhBcnkpLCBvdXRwdXRDaGFubmVsTWFzaywgaW5wdXRDaGFubmVsTWFzayk7Cit9CisKK3ZvaWQgUmVtaXhCdWZmZXJQcm92aWRlcjo6Y29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykKK3sKKyAgICBtZW1jcHlfYnlfaW5kZXhfYXJyYXkoZHN0LCBtT3V0cHV0Q2hhbm5lbHMsCisgICAgICAgICAgICBzcmMsIG1JbnB1dENoYW5uZWxzLCBtSWR4QXJ5LCBtU2FtcGxlU2l6ZSwgZnJhbWVzKTsKK30KKworUmVmb3JtYXRCdWZmZXJQcm92aWRlcjo6UmVmb3JtYXRCdWZmZXJQcm92aWRlcihpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgaW5wdXRGb3JtYXQsIGF1ZGlvX2Zvcm1hdF90IG91dHB1dEZvcm1hdCwKKyAgICAgICAgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpIDoKKyAgICAgICAgQ29weUJ1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoaW5wdXRGb3JtYXQpLAorICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUob3V0cHV0Rm9ybWF0KSwKKyAgICAgICAgICAgICAgICBidWZmZXJGcmFtZUNvdW50KSwKKyAgICAgICAgbUNoYW5uZWxDb3VudChjaGFubmVsQ291bnQpLAorICAgICAgICBtSW5wdXRGb3JtYXQoaW5wdXRGb3JtYXQpLAorICAgICAgICBtT3V0cHV0Rm9ybWF0KG91dHB1dEZvcm1hdCkKK3sKKyAgICBBTE9HVigiUmVmb3JtYXRCdWZmZXJQcm92aWRlciglcCkoJXUsICUjeCwgJSN4KSIsCisgICAgICAgICAgICB0aGlzLCBjaGFubmVsQ291bnQsIGlucHV0Rm9ybWF0LCBvdXRwdXRGb3JtYXQpOworfQorCit2b2lkIFJlZm9ybWF0QnVmZmVyUHJvdmlkZXI6OmNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpCit7CisgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChkc3QsIG1PdXRwdXRGb3JtYXQsIHNyYywgbUlucHV0Rm9ybWF0LCBmcmFtZXMgKiBtQ2hhbm5lbENvdW50KTsKK30KKworVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjo6VGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcihpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCB1aW50MzJfdCBzYW1wbGVSYXRlLCBjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKSA6CisgICAgICAgIG1DaGFubmVsQ291bnQoY2hhbm5lbENvdW50KSwKKyAgICAgICAgbUZvcm1hdChmb3JtYXQpLAorICAgICAgICBtU2FtcGxlUmF0ZShzYW1wbGVSYXRlKSwKKyAgICAgICAgbUZyYW1lU2l6ZShjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkpLAorICAgICAgICBtTG9jYWxCdWZmZXJGcmFtZUNvdW50KDApLAorICAgICAgICBtTG9jYWxCdWZmZXJEYXRhKE5VTEwpLAorICAgICAgICBtUmVtYWluaW5nKDApLAorICAgICAgICBtU29uaWNTdHJlYW0oc29uaWNDcmVhdGVTdHJlYW0oc2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCkpLAorICAgICAgICBtRmFsbGJhY2tGYWlsRXJyb3JTaG93bihmYWxzZSksCisgICAgICAgIG1BdWRpb1BsYXliYWNrUmF0ZVZhbGlkKGZhbHNlKQoreworICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVNvbmljU3RyZWFtID09IE5VTEwsCisgICAgICAgICAgICAiVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlciBjYW4ndCBhbGxvY2F0ZSBTb25pYyBzdHJlYW0iKTsKKworICAgIHNldFBsYXliYWNrUmF0ZShwbGF5YmFja1JhdGUpOworICAgIEFMT0dWKCJUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyKCVwKSgldSwgJSN4LCAldSAlZiAlZiAlZCAlZCkiLAorICAgICAgICAgICAgdGhpcywgY2hhbm5lbENvdW50LCBmb3JtYXQsIHNhbXBsZVJhdGUsIHBsYXliYWNrUmF0ZS5tU3BlZWQsCisgICAgICAgICAgICBwbGF5YmFja1JhdGUubVBpdGNoLCBwbGF5YmFja1JhdGUubVN0cmV0Y2hNb2RlLCBwbGF5YmFja1JhdGUubUZhbGxiYWNrTW9kZSk7CisgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKK30KKworVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjo6flRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIoKQoreworICAgIEFMT0dWKCJ+VGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlciglcCkiLCB0aGlzKTsKKyAgICBzb25pY0Rlc3Ryb3lTdHJlYW0obVNvbmljU3RyZWFtKTsKKyAgICBpZiAobUJ1ZmZlci5mcmFtZUNvdW50ICE9IDApIHsKKyAgICAgICAgbVRyYWNrQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOworICAgIH0KKyAgICBmcmVlKG1Mb2NhbEJ1ZmZlckRhdGEpOworfQorCitzdGF0dXNfdCBUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOjpnZXROZXh0QnVmZmVyKAorICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgKnBCdWZmZXIsIGludDY0X3QgcHRzKQoreworICAgIEFMT0dWKCJUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyKCVwKTo6Z2V0TmV4dEJ1ZmZlciglcCAoJXp1KSwgJWxsZCkiLAorICAgICAgICAgICAgdGhpcywgcEJ1ZmZlciwgcEJ1ZmZlci0+ZnJhbWVDb3VudCwgcHRzKTsKKworICAgIC8vIEJZUEFTUworICAgIC8vcmV0dXJuIG1UcmFja0J1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKHBCdWZmZXIsIHB0cyk7CisKKyAgICAvLyBjaGVjayBpZiBwcmV2aW91c2x5IHByb2Nlc3NlZCBkYXRhIGlzIHN1ZmZpY2llbnQuCisgICAgaWYgKHBCdWZmZXItPmZyYW1lQ291bnQgPD0gbVJlbWFpbmluZykgeworICAgICAgICBBTE9HVigicHJldmlvdXMgc3VmZmljaWVudCIpOworICAgICAgICBwQnVmZmVyLT5yYXcgPSBtTG9jYWxCdWZmZXJEYXRhOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgLy8gZG8gd2UgbmVlZCB0byByZXNpemUgb3VyIGJ1ZmZlcj8KKyAgICBpZiAocEJ1ZmZlci0+ZnJhbWVDb3VudCA+IG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQpIHsKKyAgICAgICAgdm9pZCAqbmV3bWVtOworICAgICAgICBpZiAocG9zaXhfbWVtYWxpZ24oJm5ld21lbSwgMzIsIHBCdWZmZXItPmZyYW1lQ291bnQgKiBtRnJhbWVTaXplKSA9PSBPSykgeworICAgICAgICAgICAgaWYgKG1SZW1haW5pbmcgIT0gMCkgeworICAgICAgICAgICAgICAgIG1lbWNweShuZXdtZW0sIG1Mb2NhbEJ1ZmZlckRhdGEsIG1SZW1haW5pbmcgKiBtRnJhbWVTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyZWUobUxvY2FsQnVmZmVyRGF0YSk7CisgICAgICAgICAgICBtTG9jYWxCdWZmZXJEYXRhID0gbmV3bWVtOworICAgICAgICAgICAgbUxvY2FsQnVmZmVyRnJhbWVDb3VudCA9IHBCdWZmZXItPmZyYW1lQ291bnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBuZWVkIHRvIGZldGNoIG1vcmUgZGF0YQorICAgIGNvbnN0IHNpemVfdCBvdXRwdXREZXNpcmVkID0gcEJ1ZmZlci0+ZnJhbWVDb3VudCAtIG1SZW1haW5pbmc7CisgICAgc2l6ZV90IGRzdEF2YWlsYWJsZTsKKyAgICBkbyB7CisgICAgICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IG1QbGF5YmFja1JhdGUubVNwZWVkID09IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX05PUk1BTAorICAgICAgICAgICAgICAgID8gb3V0cHV0RGVzaXJlZCA6IG91dHB1dERlc2lyZWQgKiBtUGxheWJhY2tSYXRlLm1TcGVlZCArIDE7CisKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gbVRyYWNrQnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJm1CdWZmZXIsIHB0cyk7CisKKyAgICAgICAgQUxPR19BU1NFUlQocmVzID09IE9LIHx8IG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSyB8fCBtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCkgeyAvLyBub3QgbmVlZGVkIGJ5IEFQSSBzcGVjLCBidXQgdG8gYmUgc2FmZS4KKyAgICAgICAgICAgIEFMT0dWKCJ1cHN0cmVhbSBwcm92aWRlciBjYW5ub3QgcHJvdmlkZSBkYXRhIik7CisgICAgICAgICAgICBpZiAobVJlbWFpbmluZyA9PSAwKSB7CisgICAgICAgICAgICAgICAgcEJ1ZmZlci0+cmF3ID0gTlVMTDsKKyAgICAgICAgICAgICAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfSBlbHNlIHsgLy8gcmV0dXJuIHBhcnRpYWwgY291bnQKKyAgICAgICAgICAgICAgICBwQnVmZmVyLT5yYXcgPSBtTG9jYWxCdWZmZXJEYXRhOworICAgICAgICAgICAgICAgIHBCdWZmZXItPmZyYW1lQ291bnQgPSBtUmVtYWluaW5nOworICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRpbWUtc3RyZXRjaCB0aGUgZGF0YQorICAgICAgICBkc3RBdmFpbGFibGUgPSBtaW4obUxvY2FsQnVmZmVyRnJhbWVDb3VudCAtIG1SZW1haW5pbmcsIG91dHB1dERlc2lyZWQpOworICAgICAgICBzaXplX3Qgc3JjQXZhaWxhYmxlID0gbUJ1ZmZlci5mcmFtZUNvdW50OworICAgICAgICBwcm9jZXNzRnJhbWVzKCh1aW50OF90KiltTG9jYWxCdWZmZXJEYXRhICsgbVJlbWFpbmluZyAqIG1GcmFtZVNpemUsICZkc3RBdmFpbGFibGUsCisgICAgICAgICAgICAgICAgbUJ1ZmZlci5yYXcsICZzcmNBdmFpbGFibGUpOworCisgICAgICAgIC8vIHJlbGVhc2UgYWxsIGRhdGEgY29uc3VtZWQKKyAgICAgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gc3JjQXZhaWxhYmxlOworICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmbUJ1ZmZlcik7CisgICAgfSB3aGlsZSAoZHN0QXZhaWxhYmxlID09IDApOyAvLyB0cnkgdW50aWwgd2UgZ2V0IG91dHB1dCBkYXRhIG9yIHVwc3RyZWFtIHByb3ZpZGVyIGZhaWxzLgorCisgICAgLy8gdXBkYXRlIGJ1ZmZlciB2YXJzIHdpdGggdGhlIGFjdHVhbCBkYXRhIHByb2Nlc3NlZCBhbmQgcmV0dXJuIHdpdGggYnVmZmVyCisgICAgbVJlbWFpbmluZyArPSBkc3RBdmFpbGFibGU7CisKKyAgICBwQnVmZmVyLT5yYXcgPSBtTG9jYWxCdWZmZXJEYXRhOworICAgIHBCdWZmZXItPmZyYW1lQ291bnQgPSBtUmVtYWluaW5nOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIFRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXI6OnJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyICpwQnVmZmVyKQoreworICAgIEFMT0dWKCJUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyKCVwKTo6cmVsZWFzZUJ1ZmZlciglcCAoJXp1KSkiLAorICAgICAgIHRoaXMsIHBCdWZmZXIsIHBCdWZmZXItPmZyYW1lQ291bnQpOworCisgICAgLy8gQllQQVNTCisgICAgLy9yZXR1cm4gbVRyYWNrQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIocEJ1ZmZlcik7CisKKyAgICAvLyBMT0dfQUxXQVlTX0ZBVEFMX0lGKHBCdWZmZXItPmZyYW1lQ291bnQgPT0gMCwgIkludmFsaWQgZnJhbWVjb3VudCIpOworICAgIGlmIChwQnVmZmVyLT5mcmFtZUNvdW50IDwgbVJlbWFpbmluZykgeworICAgICAgICBtZW1jcHkobUxvY2FsQnVmZmVyRGF0YSwKKyAgICAgICAgICAgICAgICAodWludDhfdCopbUxvY2FsQnVmZmVyRGF0YSArIHBCdWZmZXItPmZyYW1lQ291bnQgKiBtRnJhbWVTaXplLAorICAgICAgICAgICAgICAgIChtUmVtYWluaW5nIC0gcEJ1ZmZlci0+ZnJhbWVDb3VudCkgKiBtRnJhbWVTaXplKTsKKyAgICAgICAgbVJlbWFpbmluZyAtPSBwQnVmZmVyLT5mcmFtZUNvdW50OworICAgIH0gZWxzZSBpZiAocEJ1ZmZlci0+ZnJhbWVDb3VudCA9PSBtUmVtYWluaW5nKSB7CisgICAgICAgIG1SZW1haW5pbmcgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlJlbGVhc2luZyBtb3JlIGZyYW1lcyglenUpIHRoYW4gYXZhaWxhYmxlKCV6dSkiLAorICAgICAgICAgICAgICAgIHBCdWZmZXItPmZyYW1lQ291bnQsIG1SZW1haW5pbmcpOworICAgIH0KKworICAgIHBCdWZmZXItPnJhdyA9IE5VTEw7CisgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7Cit9CisKK3ZvaWQgVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjo6cmVzZXQoKQoreworICAgIG1SZW1haW5pbmcgPSAwOworfQorCitzdGF0dXNfdCBUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOjpzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSkKK3sKKyAgICBtUGxheWJhY2tSYXRlID0gcGxheWJhY2tSYXRlOworICAgIG1GYWxsYmFja0ZhaWxFcnJvclNob3duID0gZmFsc2U7CisgICAgc29uaWNTZXRTcGVlZChtU29uaWNTdHJlYW0sIG1QbGF5YmFja1JhdGUubVNwZWVkKTsKKyAgICAvL1RPRE86IHBpdGNoIGlzIGlnbm9yZWQgZm9yIG5vdworICAgIC8vVE9ETzogb3B0aW1pemU6IGlmIHBhcmFtZXRlcnMgYXJlIHRoZSBzYW1lLCBkb24ndCBkbyBhbnkgZXh0cmEgY29tcHV0YXRpb24uCisKKyAgICBtQXVkaW9QbGF5YmFja1JhdGVWYWxpZCA9IGlzQXVkaW9QbGF5YmFja1JhdGVWYWxpZChtUGxheWJhY2tSYXRlKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjo6cHJvY2Vzc0ZyYW1lcyh2b2lkICpkc3RCdWZmZXIsIHNpemVfdCAqZHN0RnJhbWVzLAorICAgICAgICBjb25zdCB2b2lkICpzcmNCdWZmZXIsIHNpemVfdCAqc3JjRnJhbWVzKQoreworICAgIEFMT0dWKCJwcm9jZXNzRnJhbWVzKCV6dSAlenUpICByZW1haW5pbmcoJXp1KSIsICpkc3RGcmFtZXMsICpzcmNGcmFtZXMsIG1SZW1haW5pbmcpOworICAgIC8vIE5vdGUgZHN0RnJhbWVzIGlzIHRoZSByZXF1aXJlZCBudW1iZXIgb2YgZnJhbWVzLgorCisgICAgLy8gRW5zdXJlIGNvbnN1bXB0aW9uIGZyb20gc3JjIGlzIGFzIGV4cGVjdGVkLgorICAgIC8vVE9ETzogYWRkIGxvZ2ljIHRvIHRyYWNrICJ2ZXJ5IGFjY3VyYXRlIiBjb25zdW1wdGlvbiByZWxhdGVkIHRvIHNwZWVkLCBvcmlnaW5hbCBzYW1wbGluZworICAgIC8vcmF0ZSwgYWN0dWFsIGZyYW1lcyBwcm9jZXNzZWQuCisgICAgY29uc3Qgc2l6ZV90IHRhcmdldFNyYyA9ICpkc3RGcmFtZXMgKiBtUGxheWJhY2tSYXRlLm1TcGVlZDsKKyAgICBpZiAoKnNyY0ZyYW1lcyA8IHRhcmdldFNyYykgeyAvLyBsaW1pdCBkc3QgZnJhbWVzIHRvIHRoYXQgcG9zc2libGUKKyAgICAgICAgKmRzdEZyYW1lcyA9ICpzcmNGcmFtZXMgLyBtUGxheWJhY2tSYXRlLm1TcGVlZDsKKyAgICB9IGVsc2UgaWYgKCpzcmNGcmFtZXMgPiB0YXJnZXRTcmMgKyAxKSB7CisgICAgICAgICpzcmNGcmFtZXMgPSB0YXJnZXRTcmMgKyAxOworICAgIH0KKworICAgIGlmICghbUF1ZGlvUGxheWJhY2tSYXRlVmFsaWQpIHsKKyAgICAgICAgLy9mYWxsYmFjayBtb2RlCisgICAgICAgIGlmICgqZHN0RnJhbWVzID4gMCkgeworICAgICAgICAgICAgc3dpdGNoKG1QbGF5YmFja1JhdGUubUZhbGxiYWNrTW9kZSkgeworICAgICAgICAgICAgY2FzZSBBVURJT19USU1FU1RSRVRDSF9GQUxMQkFDS19DVVRfUkVQRUFUOgorICAgICAgICAgICAgICAgIGlmICgqZHN0RnJhbWVzIDw9ICpzcmNGcmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY29weVNpemUgPSBtRnJhbWVTaXplICogKmRzdEZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZHN0QnVmZmVyLCBzcmNCdWZmZXIsIGNvcHlTaXplKTsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgLy8gY3ljbGljYWxseSByZXBlYXQgdGhlIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBjb3VudCA9IDA7IGNvdW50IDwgKmRzdEZyYW1lczsgY291bnQgKz0gKnNyY0ZyYW1lcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVtYWluaW5nID0gbWluKCpzcmNGcmFtZXMsICpkc3RGcmFtZXMgLSBjb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodWludDhfdCopZHN0QnVmZmVyICsgbUZyYW1lU2l6ZSAqIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0J1ZmZlciwgbUZyYW1lU2l6ZSAqIHJlbWFpbmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVURJT19USU1FU1RSRVRDSF9GQUxMQkFDS19ERUZBVUxUOgorICAgICAgICAgICAgY2FzZSBBVURJT19USU1FU1RSRVRDSF9GQUxMQkFDS19NVVRFOgorICAgICAgICAgICAgICAgIG1lbXNldChkc3RCdWZmZXIsMCwgbUZyYW1lU2l6ZSAqICpkc3RGcmFtZXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVURJT19USU1FU1RSRVRDSF9GQUxMQkFDS19GQUlMOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZighbUZhbGxiYWNrRmFpbEVycm9yU2hvd24pIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImludmFsaWQgcGFyYW1ldGVycyBpbiBUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyIGZhbGxiYWNrTW9kZTolZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrUmF0ZS5tRmFsbGJhY2tNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgbUZhbGxiYWNrRmFpbEVycm9yU2hvd24gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAobUZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICBpZiAoc29uaWNXcml0ZUZsb2F0VG9TdHJlYW0obVNvbmljU3RyZWFtLCAoZmxvYXQqKXNyY0J1ZmZlciwgKnNyY0ZyYW1lcykgIT0gMSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJzb25pY1dyaXRlRmxvYXRUb1N0cmVhbSBjYW5ub3QgcmVhbGxvYyIpOworICAgICAgICAgICAgICAgICpzcmNGcmFtZXMgPSAwOyAvLyBjYW5ub3QgY29uc3VtZSBhbGwgb2Ygc3JjQnVmZmVyCisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZHN0RnJhbWVzID0gc29uaWNSZWFkRmxvYXRGcm9tU3RyZWFtKG1Tb25pY1N0cmVhbSwgKGZsb2F0Kilkc3RCdWZmZXIsICpkc3RGcmFtZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICBpZiAoc29uaWNXcml0ZVNob3J0VG9TdHJlYW0obVNvbmljU3RyZWFtLCAoc2hvcnQqKXNyY0J1ZmZlciwgKnNyY0ZyYW1lcykgIT0gMSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJzb25pY1dyaXRlU2hvcnRUb1N0cmVhbSBjYW5ub3QgcmVhbGxvYyIpOworICAgICAgICAgICAgICAgICpzcmNGcmFtZXMgPSAwOyAvLyBjYW5ub3QgY29uc3VtZSBhbGwgb2Ygc3JjQnVmZmVyCisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZHN0RnJhbWVzID0gc29uaWNSZWFkU2hvcnRGcm9tU3RyZWFtKG1Tb25pY1N0cmVhbSwgKHNob3J0Kilkc3RCdWZmZXIsICpkc3RGcmFtZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBjb3VsZCBhbHNvIGJlIGNhdWdodCBvbiBjb25zdHJ1Y3Rpb24KKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImludmFsaWQgZm9ybWF0ICUjeCBmb3IgVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlciIsIG1Gb3JtYXQpOworICAgICAgICB9CisgICAgfQorfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0J1ZmZlclByb3ZpZGVycy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0J1ZmZlclByb3ZpZGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYzg5NWMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQnVmZmVyUHJvdmlkZXJzLmgKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQlVGRkVSX1BST1ZJREVSU19ICisjZGVmaW5lIEFORFJPSURfQlVGRkVSX1BST1ZJREVSU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzb25pYy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgUGFzc3RocnVCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBBdWRpb0J1ZmZlclByb3ZpZGVyIHsKK3B1YmxpYzoKKyAgICBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyKCkgOiBtVHJhY2tCdWZmZXJQcm92aWRlcihOVUxMKSB7IH0KKworICAgIHZpcnR1YWwgflBhc3N0aHJ1QnVmZmVyUHJvdmlkZXIoKSB7IH0KKworICAgIC8vIGNhbGwgdGhpcyB0byByZWxlYXNlIHRoZSBidWZmZXIgdG8gdGhlIHVwc3RyZWFtIHByb3ZpZGVyLgorICAgIC8vIHRyZWF0IGl0IGFzIGFuIGF1ZGlvIGRpc2NvbnRpbnVpdHkgZm9yIGZ1dHVyZSBzYW1wbGVzLgorICAgIHZpcnR1YWwgdm9pZCByZXNldCgpIHsgfQorCisgICAgLy8gc2V0IHRoZSB1cHN0cmVhbSBidWZmZXIgcHJvdmlkZXIuIENvbnNpZGVyIGNhbGxpbmcgInJlc2V0IiBiZWZvcmUgdGhpcyBmdW5jdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0QnVmZmVyUHJvdmlkZXIoQXVkaW9CdWZmZXJQcm92aWRlciAqcCkgeworICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlciA9IHA7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgQXVkaW9CdWZmZXJQcm92aWRlciAqbVRyYWNrQnVmZmVyUHJvdmlkZXI7Cit9OworCisvLyBCYXNlIEF1ZGlvQnVmZmVyUHJvdmlkZXIgY2xhc3MgdXNlZCBmb3IgRG93bk1peGVyQnVmZmVyUHJvdmlkZXIsIFJlbWl4QnVmZmVyUHJvdmlkZXIsCisvLyBhbmQgUmVmb3JtYXRCdWZmZXJQcm92aWRlci4KKy8vIEl0IGhhbmRsZXMgYSBwcml2YXRlIGJ1ZmZlciBmb3IgdXNlIGluIGNvbnZlcnRpbmcgZm9ybWF0IG9yIGNoYW5uZWwgbWFza3MgZnJvbSB0aGUKKy8vIGlucHV0IGRhdGEgdG8gYSBmb3JtIGFjY2VwdGFibGUgYnkgdGhlIG1peGVyLgorLy8gVE9ETzogTWFrZSBhIFJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyIHdoZW4gaW50ZWdlcnMgYXJlIGVudGlyZWx5IHJlbW92ZWQgZnJvbSB0aGUKKy8vIHByb2Nlc3NpbmcgcGlwZWxpbmUuCitjbGFzcyBDb3B5QnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgUGFzc3RocnVCdWZmZXJQcm92aWRlciB7CitwdWJsaWM6CisgICAgLy8gVXNlIGEgcHJpdmF0ZSBidWZmZXIgb2YgYnVmZmVyRnJhbWVDb3VudCBmcmFtZXMgKGVhY2ggZnJhbWUgaXMgb3V0cHV0RnJhbWVTaXplIGJ5dGVzKS4KKyAgICAvLyBJZiBidWZmZXJGcmFtZUNvdW50IGlzIDAsIG5vIHByaXZhdGUgYnVmZmVyIGlzIGNyZWF0ZWQgYW5kIGluLXBsYWNlIG1vZGlmaWNhdGlvbiBvZgorICAgIC8vIHRoZSB1cHN0cmVhbSBidWZmZXIgcHJvdmlkZXIncyBidWZmZXJzIGlzIHBlcmZvcm1lZCBieSBjb3B5RnJhbWVzKCkuCisgICAgQ29weUJ1ZmZlclByb3ZpZGVyKHNpemVfdCBpbnB1dEZyYW1lU2l6ZSwgc2l6ZV90IG91dHB1dEZyYW1lU2l6ZSwKKyAgICAgICAgICAgIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KTsKKyAgICB2aXJ0dWFsIH5Db3B5QnVmZmVyUHJvdmlkZXIoKTsKKworICAgIC8vIE92ZXJyaWRlcyBBdWRpb0J1ZmZlclByb3ZpZGVyIG1ldGhvZHMKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRCdWZmZXIoQnVmZmVyICpidWZmZXIsIGludDY0X3QgcHRzKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUJ1ZmZlcihCdWZmZXIgKmJ1ZmZlcik7CisKKyAgICAvLyBPdmVycmlkZXMgUGFzc3RocnVCdWZmZXJQcm92aWRlcgorICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOworCisgICAgLy8gdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgc3VwcGxpZWQgYnkgdGhlIGRlcml2ZWQgY2xhc3MuICBJdCBjb252ZXJ0cworICAgIC8vICNmcmFtZXMgaW4gdGhlICpzcmMgcG9pbnRlciB0byB0aGUgKmRzdCBwb2ludGVyLiAgSXQgaXMgcHVibGljIGJlY2F1c2UKKyAgICAvLyBzb21lIHByb3ZpZGVycyB3aWxsIGFsbG93IHRoaXMgdG8gd29yayBvbiBhcmJpdHJhcnkgYnVmZmVycyBvdXRzaWRlCisgICAgLy8gb2YgdGhlIGludGVybmFsIGJ1ZmZlcnMuCisgICAgdmlydHVhbCB2b2lkIGNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpID0gMDsKKworcHJvdGVjdGVkOgorICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1JbnB1dEZyYW1lU2l6ZTsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtT3V0cHV0RnJhbWVTaXplOworcHJpdmF0ZToKKyAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgbUJ1ZmZlcjsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtTG9jYWxCdWZmZXJGcmFtZUNvdW50OworICAgIHZvaWQgICAgICAgICAgICAgICAgKm1Mb2NhbEJ1ZmZlckRhdGE7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgbUNvbnN1bWVkOworfTsKKworLy8gRG93bm1peGVyQnVmZmVyUHJvdmlkZXIgZGVyaXZlcyBmcm9tIENvcHlCdWZmZXJQcm92aWRlciB0byBwcm92aWRlCisvLyBwb3NpdGlvbiBkZXBlbmRlbnQgZG93bm1peGluZyBieSBhbiBBdWRpbyBFZmZlY3QuCitjbGFzcyBEb3dubWl4ZXJCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBDb3B5QnVmZmVyUHJvdmlkZXIgeworcHVibGljOgorICAgIERvd25taXhlckJ1ZmZlclByb3ZpZGVyKGF1ZGlvX2NoYW5uZWxfbWFza190IGlucHV0Q2hhbm5lbE1hc2ssCisgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRwdXRDaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBzZXNzaW9uSWQsIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KTsKKyAgICB2aXJ0dWFsIH5Eb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpOworICAgIC8vT3ZlcnJpZGVzCisgICAgdmlydHVhbCB2b2lkIGNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpOworCisgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gbURvd25taXhIYW5kbGUgIT0gTlVMTDsgfQorICAgIHN0YXRpYyBzdGF0dXNfdCBpbml0KCk7CisgICAgc3RhdGljIGJvb2wgaXNNdWx0aWNoYW5uZWxDYXBhYmxlKCkgeyByZXR1cm4gc0lzTXVsdGljaGFubmVsQ2FwYWJsZTsgfQorCitwcm90ZWN0ZWQ6CisgICAgZWZmZWN0X2hhbmRsZV90ICAgIG1Eb3dubWl4SGFuZGxlOworICAgIGVmZmVjdF9jb25maWdfdCAgICBtRG93bm1peENvbmZpZzsKKworICAgIC8vIGVmZmVjdCBkZXNjcmlwdG9yIGZvciB0aGUgZG93bm1peGVyIHVzZWQgYnkgdGhlIG1peGVyCisgICAgc3RhdGljIGVmZmVjdF9kZXNjcmlwdG9yX3Qgc0R3bm1GeERlc2M7CisgICAgLy8gaW5kaWNhdGVzIHdoZXRoZXIgYSBkb3dubWl4IGVmZmVjdCBoYXMgYmVlbiBmb3VuZCBhbmQgaXMgdXNhYmxlIGJ5IHRoaXMgbWl4ZXIKKyAgICBzdGF0aWMgYm9vbCAgICAgICAgICAgICAgICBzSXNNdWx0aWNoYW5uZWxDYXBhYmxlOworICAgIC8vIEZJWE1FOiBzaG91bGQgd2UgYWxsb3cgZWZmZWN0cyBvdXRzaWRlIG9mIHRoZSBmcmFtZXdvcms/CisgICAgLy8gV2UgbmVlZCB0byBoZXJlLiBBIHNwZWNpYWwgaW9JZCB0aGF0IG11c3QgYmUgPD0gLTIgc28gaXQgZG9lcyBub3QgbWFwIHRvIGEgc2Vzc2lvbi4KKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBTRVNTSU9OX0lEX0lOVkFMSURfQU5EX0lHTk9SRUQgPSAtMjsKK307CisKKy8vIFJlbWl4QnVmZmVyUHJvdmlkZXIgZGVyaXZlcyBmcm9tIENvcHlCdWZmZXJQcm92aWRlciB0byBwZXJmb3JtIGFuCisvLyB1cG1peCBvciBkb3dubWl4IHRvIHRoZSBwcm9wZXIgY2hhbm5lbCBjb3VudCBhbmQgbWFzay4KK2NsYXNzIFJlbWl4QnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQ29weUJ1ZmZlclByb3ZpZGVyIHsKK3B1YmxpYzoKKyAgICBSZW1peEJ1ZmZlclByb3ZpZGVyKGF1ZGlvX2NoYW5uZWxfbWFza190IGlucHV0Q2hhbm5lbE1hc2ssCisgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRwdXRDaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpOworICAgIC8vT3ZlcnJpZGVzCisgICAgdmlydHVhbCB2b2lkIGNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpOworCitwcm90ZWN0ZWQ6CisgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdDsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtU2FtcGxlU2l6ZTsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtSW5wdXRDaGFubmVsczsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtT3V0cHV0Q2hhbm5lbHM7CisgICAgaW50OF90ICAgICAgICAgICAgICAgbUlkeEFyeVtzaXplb2YodWludDMyX3QpICogOF07IC8vIDMyIGJpdHMgPT4gY2hhbm5lbCBpbmRpY2VzCit9OworCisvLyBSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyIGRlcml2ZXMgZnJvbSBDb3B5QnVmZmVyUHJvdmlkZXIgdG8gY29udmVydCB0aGUgaW5wdXQgZGF0YQorLy8gdG8gYW4gYWNjZXB0YWJsZSBtaXhlciBpbnB1dCBmb3JtYXQgdHlwZS4KK2NsYXNzIFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQ29weUJ1ZmZlclByb3ZpZGVyIHsKK3B1YmxpYzoKKyAgICBSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyKGludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgaW5wdXRGb3JtYXQsIGF1ZGlvX2Zvcm1hdF90IG91dHB1dEZvcm1hdCwKKyAgICAgICAgICAgIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KTsKKyAgICB2aXJ0dWFsIHZvaWQgY29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcyk7CisKK3Byb3RlY3RlZDoKKyAgICBjb25zdCB1aW50MzJfdCAgICAgICBtQ2hhbm5lbENvdW50OworICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IG1JbnB1dEZvcm1hdDsKKyAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBtT3V0cHV0Rm9ybWF0OworfTsKKworLy8gVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlciBkZXJpdmVzIGZyb20gUGFzc3RocnVCdWZmZXJQcm92aWRlciBmb3IgdGltZSBzdHJldGNoaW5nCitjbGFzcyBUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyIDogcHVibGljIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXIgeworcHVibGljOgorICAgIFRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIoaW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICBjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKTsKKyAgICB2aXJ0dWFsIH5UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyKCk7CisKKyAgICAvLyBPdmVycmlkZXMgQXVkaW9CdWZmZXJQcm92aWRlciBtZXRob2RzCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0QnVmZmVyKEJ1ZmZlciogYnVmZmVyLCBpbnQ2NF90IHB0cyk7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VCdWZmZXIoQnVmZmVyKiBidWZmZXIpOworCisgICAgLy8gT3ZlcnJpZGVzIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXIKKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tSYXRlKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpOworCisgICAgLy8gcHJvY2Vzc2VzIGZyYW1lcworICAgIC8vIGRzdEJ1ZmZlciBpcyB3aGVyZSB0byBwbGFjZSB0aGUgZGF0YQorICAgIC8vIGRzdEZyYW1lcyBbaW4vb3V0XSBpcyB0aGUgZGVzaXJlZCBmcmFtZXMgKHJldHVybiB3aXRoIGFjdHVhbCBwbGFjZWQgaW4gYnVmZmVyKQorICAgIC8vIHNyY0J1ZmZlciBpcyB0aGUgc291cmNlIGRhdGEKKyAgICAvLyBzcmNGcmFtZXMgW2luL291dF0gaXMgdGhlIGF2YWlsYWJsZSBzb3VyY2UgZnJhbWVzIChyZXR1cm4gd2l0aCBjb25zdW1lZCkKKyAgICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc0ZyYW1lcyh2b2lkICpkc3RCdWZmZXIsIHNpemVfdCAqZHN0RnJhbWVzLAorICAgICAgICAgICAgY29uc3Qgdm9pZCAqc3JjQnVmZmVyLCBzaXplX3QgKnNyY0ZyYW1lcyk7CisKK3Byb3RlY3RlZDoKKyAgICBjb25zdCB1aW50MzJfdCAgICAgICBtQ2hhbm5lbENvdW50OworICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IG1Gb3JtYXQ7CisgICAgY29uc3QgdWludDMyX3QgICAgICAgbVNhbXBsZVJhdGU7IC8vIGNvbnN0IGZvciBub3cgKFRPRE8gY2hhbmdlIHRoaXMpCisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbUZyYW1lU2l6ZTsKKyAgICBBdWRpb1BsYXliYWNrUmF0ZSAgICBtUGxheWJhY2tSYXRlOworCitwcml2YXRlOgorICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBtQnVmZmVyOyAgICAgICAgICAvLyBmb3IgdXBzdHJlYW0gcmVxdWVzdAorICAgIHNpemVfdCAgICAgICAgICAgICAgIG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQ7ICAvLyBzaXplIG9mIGxvY2FsIGJ1ZmZlcgorICAgIHZvaWQgICAgICAgICAgICAgICAgKm1Mb2NhbEJ1ZmZlckRhdGE7ICAgICAgICAvLyBpbnRlcm5hbGx5IGFsbG9jYXRlZCBidWZmZXIgZm9yIGRhdGEgcmV0dXJuZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY2FsbGVyCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgbVJlbWFpbmluZzsgICAgICAgICAgICAgIC8vIHJlbWFpbmluZyBkYXRhIGluIGxvY2FsIGJ1ZmZlcgorICAgIHNvbmljU3RyZWFtICAgICAgICAgIG1Tb25pY1N0cmVhbTsgICAgICAgICAgICAvLyBoYW5kbGUgdG8gc29uaWMgdGltZXN0cmV0Y2ggb2JqZWN0CisgICAgLy9GSVhNRTogdGhpcyBkZXBlbmRlbmN5IHNob3VsZCBiZSBhYnN0cmFjdGVkIG91dAorICAgIGJvb2wgICAgICAgICAgICAgICAgIG1GYWxsYmFja0ZhaWxFcnJvclNob3duOyAvLyBsb2cgZmFsbGJhY2sgZXJyb3Igb25seSBvbmNlCisgICAgYm9vbCAgICAgICAgICAgICAgICAgbUF1ZGlvUGxheWJhY2tSYXRlVmFsaWQ7IC8vIGZsYWcgZm9yIGN1cnJlbnQgcGFyYW1ldGVycyB2YWxpZGl0eQorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9CVUZGRVJfUFJPVklERVJTX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9Db25maWd1cmF0aW9uLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQ29uZmlndXJhdGlvbi5oCmluZGV4IDZhOGFlYjEuLjg0NTY5N2EgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9Db25maWd1cmF0aW9uLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0NvbmZpZ3VyYXRpb24uaApAQCAtMjksOSArMjksOCBAQAogLy8gdW5jb21tZW50IHRvIGRpc3BsYXkgQ1BVIGxvYWQgYWRqdXN0ZWQgZm9yIENQVSBmcmVxdWVuY3kKIC8vI2RlZmluZSBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKIAotLy8gdW5jb21tZW50IHRvIGVuYWJsZSBmYXN0IG1peGVyIHRvIHRha2UgcGVyZm9ybWFuY2Ugc2FtcGxlcyBmb3IgbGF0ZXIgc3RhdGlzdGljYWwgYW5hbHlzaXMKLSNkZWZpbmUgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0vLyBGSVhNRSByZW5hbWUgdG8gRkFTVF9USFJFQURfU1RBVElTVElDUworLy8gdW5jb21tZW50IHRvIGVuYWJsZSBmYXN0IHRocmVhZHMgdG8gdGFrZSBwZXJmb3JtYW5jZSBzYW1wbGVzIGZvciBsYXRlciBzdGF0aXN0aWNhbCBhbmFseXNpcworI2RlZmluZSBGQVNUX1RIUkVBRF9TVEFUSVNUSUNTCiAKIC8vIHVuY29tbWVudCBmb3IgZGVidWdnaW5nIHRpbWluZyBwcm9ibGVtcyByZWxhdGVkIHRvIFN0YXRlUXVldWU6OnB1c2goKQogLy8jZGVmaW5lIFNUQVRFX1FVRVVFX0RVTVAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcAppbmRleCBiY2FmOGFlLi45NDljOTFkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCkBAIC0zMzUsMTMgKzMzNSwyMSBAQAogCiAgICAgLy8gVE9ETzogaGFuZGxlIGNvbmZpZ3VyYXRpb24gb2YgZWZmZWN0cyByZXBsYWNpbmcgdHJhY2sgcHJvY2VzcwogICAgIGNoYW5uZWxNYXNrID0gdGhyZWFkLT5jaGFubmVsTWFzaygpOworICAgIG1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gY2hhbm5lbE1hc2s7CiAKICAgICBpZiAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSkgewogICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTzsKICAgICB9IGVsc2UgewogICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gY2hhbm5lbE1hc2s7CisgICAgICAgIC8vIFRPRE86IFVwZGF0ZSB0aGlzIGxvZ2ljIHdoZW4gbXVsdGljaGFubmVsIGVmZmVjdHMgYXJlIGltcGxlbWVudGVkLgorICAgICAgICAvLyBGb3Igb2ZmbG9hZGVkIHRyYWNrcyBjb25zaWRlciBtb25vIG91dHB1dCBhcyBzdGVyZW8gZm9yIHByb3BlciBlZmZlY3QgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgaWYgKGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX01PTk8pIHsKKyAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICAgICAgICAgIEFMT0dWKCJPdmVycmlkaW5nIGVmZmVjdCBpbnB1dCBhbmQgb3V0cHV0IGFzIFNURVJFTyIpOworICAgICAgICB9CiAgICAgfQotICAgIG1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gY2hhbm5lbE1hc2s7CisKICAgICBtQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIG1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIG1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gdGhyZWFkLT5zYW1wbGVSYXRlKCk7CkBAIC0xOTUzLDQgKzE5NjEsNCBAQAogICAgIH0KIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuY3BwCmluZGV4IDk2MTNlMjYuLjFiYmE1ZjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmNwcApAQCAtMjksMTggKzI5LDE4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotLypzdGF0aWMqLyBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlIEZhc3RDYXB0dXJlOjppbml0aWFsOworLypzdGF0aWMqLyBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlIEZhc3RDYXB0dXJlOjpzSW5pdGlhbDsKIAogRmFzdENhcHR1cmU6OkZhc3RDYXB0dXJlKCkgOiBGYXN0VGhyZWFkKCksCi0gICAgaW5wdXRTb3VyY2UoTlVMTCksIGlucHV0U291cmNlR2VuKDApLCBwaXBlU2luayhOVUxMKSwgcGlwZVNpbmtHZW4oMCksCi0gICAgcmVhZEJ1ZmZlcihOVUxMKSwgcmVhZEJ1ZmZlclN0YXRlKC0xKSwgZm9ybWF0KEZvcm1hdF9JbnZhbGlkKSwgc2FtcGxlUmF0ZSgwKSwKLSAgICAvLyBkdW1teUR1bXBTdGF0ZQotICAgIHRvdGFsTmF0aXZlRnJhbWVzUmVhZCgwKQorICAgIG1JbnB1dFNvdXJjZShOVUxMKSwgbUlucHV0U291cmNlR2VuKDApLCBtUGlwZVNpbmsoTlVMTCksIG1QaXBlU2lua0dlbigwKSwKKyAgICBtUmVhZEJ1ZmZlcihOVUxMKSwgbVJlYWRCdWZmZXJTdGF0ZSgtMSksIG1Gb3JtYXQoRm9ybWF0X0ludmFsaWQpLCBtU2FtcGxlUmF0ZSgwKSwKKyAgICAvLyBtRHVtbXlEdW1wU3RhdGUKKyAgICBtVG90YWxOYXRpdmVGcmFtZXNSZWFkKDApCiB7Ci0gICAgcHJldmlvdXMgPSAmaW5pdGlhbDsKLSAgICBjdXJyZW50ID0gJmluaXRpYWw7CisgICAgbVByZXZpb3VzID0gJnNJbml0aWFsOworICAgIG1DdXJyZW50ID0gJnNJbml0aWFsOwogCi0gICAgbUR1bW15RHVtcFN0YXRlID0gJmR1bW15RHVtcFN0YXRlOworICAgIG1EdW1teUR1bXBTdGF0ZSA9ICZtRHVtbXlGYXN0Q2FwdHVyZUR1bXBTdGF0ZTsKIH0KIAogRmFzdENhcHR1cmU6On5GYXN0Q2FwdHVyZSgpCkBAIC02MywxMyArNjMsMTMgQEAKIAogdm9pZCBGYXN0Q2FwdHVyZTo6b25JZGxlKCkKIHsKLSAgICBwcmVJZGxlID0gKihjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICopY3VycmVudDsKLSAgICBjdXJyZW50ID0gJnByZUlkbGU7CisgICAgbVByZUlkbGUgPSAqKGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKiltQ3VycmVudDsKKyAgICBtQ3VycmVudCA9ICZtUHJlSWRsZTsKIH0KIAogdm9pZCBGYXN0Q2FwdHVyZTo6b25FeGl0KCkKIHsKLSAgICBkZWxldGVbXSByZWFkQnVmZmVyOworICAgIGZyZWUobVJlYWRCdWZmZXIpOwogfQogCiBib29sIEZhc3RDYXB0dXJlOjppc1N1YkNsYXNzQ29tbWFuZChGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQgY29tbWFuZCkKQEAgLTg2LDY4ICs4Niw2OSBAQAogCiB2b2lkIEZhc3RDYXB0dXJlOjpvblN0YXRlQ2hhbmdlKCkKIHsKLSAgICBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICogY29uc3QgY3VycmVudCA9IChjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICopIHRoaXMtPmN1cnJlbnQ7Ci0gICAgY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqIGNvbnN0IHByZXZpb3VzID0gKGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKikgdGhpcy0+cHJldmlvdXM7Ci0gICAgRmFzdENhcHR1cmVEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdENhcHR1cmVEdW1wU3RhdGUgKikgdGhpcy0+ZHVtcFN0YXRlOworICAgIGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKiBjb25zdCBjdXJyZW50ID0gKGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKikgbUN1cnJlbnQ7CisgICAgY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqIGNvbnN0IHByZXZpb3VzID0gKGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKikgbVByZXZpb3VzOworICAgIEZhc3RDYXB0dXJlRHVtcFN0YXRlICogY29uc3QgZHVtcFN0YXRlID0gKEZhc3RDYXB0dXJlRHVtcFN0YXRlICopIG1EdW1wU3RhdGU7CiAgICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPSBjdXJyZW50LT5tRnJhbWVDb3VudDsKIAogICAgIGJvb2wgZWl0aGVyQ2hhbmdlZCA9IGZhbHNlOwogCiAgICAgLy8gY2hlY2sgZm9yIGNoYW5nZSBpbiBpbnB1dCBIQUwgY29uZmlndXJhdGlvbgotICAgIE5CQUlPX0Zvcm1hdCBwcmV2aW91c0Zvcm1hdCA9IGZvcm1hdDsKLSAgICBpZiAoY3VycmVudC0+bUlucHV0U291cmNlR2VuICE9IGlucHV0U291cmNlR2VuKSB7Ci0gICAgICAgIGlucHV0U291cmNlID0gY3VycmVudC0+bUlucHV0U291cmNlOwotICAgICAgICBpbnB1dFNvdXJjZUdlbiA9IGN1cnJlbnQtPm1JbnB1dFNvdXJjZUdlbjsKLSAgICAgICAgaWYgKGlucHV0U291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgIGZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkOwotICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IDA7CisgICAgTkJBSU9fRm9ybWF0IHByZXZpb3VzRm9ybWF0ID0gbUZvcm1hdDsKKyAgICBpZiAoY3VycmVudC0+bUlucHV0U291cmNlR2VuICE9IG1JbnB1dFNvdXJjZUdlbikgeworICAgICAgICBtSW5wdXRTb3VyY2UgPSBjdXJyZW50LT5tSW5wdXRTb3VyY2U7CisgICAgICAgIG1JbnB1dFNvdXJjZUdlbiA9IGN1cnJlbnQtPm1JbnB1dFNvdXJjZUdlbjsKKyAgICAgICAgaWYgKG1JbnB1dFNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBtRm9ybWF0ID0gRm9ybWF0X0ludmFsaWQ7CisgICAgICAgICAgICBtU2FtcGxlUmF0ZSA9IDA7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3JtYXQgPSBpbnB1dFNvdXJjZS0+Zm9ybWF0KCk7Ci0gICAgICAgICAgICBzYW1wbGVSYXRlID0gRm9ybWF0X3NhbXBsZVJhdGUoZm9ybWF0KTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KTsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKGNoYW5uZWxDb3VudCA9PSAxIHx8IGNoYW5uZWxDb3VudCA9PSAyKTsKKyAgICAgICAgICAgIG1Gb3JtYXQgPSBtSW5wdXRTb3VyY2UtPmZvcm1hdCgpOworICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSBGb3JtYXRfc2FtcGxlUmF0ZShtRm9ybWF0KTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IEZvcm1hdF9jaGFubmVsQ291bnQobUZvcm1hdCk7CisgICAgICAgICAgICBBTE9HX0FTU0VSVChjaGFubmVsQ291bnQgPj0gMSAmJiBjaGFubmVsQ291bnQgPD0gRkNDXzgpOwogICAgICAgICB9Ci0gICAgICAgIGR1bXBTdGF0ZS0+bVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworICAgICAgICBkdW1wU3RhdGUtPm1TYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CiAgICAgICAgIGVpdGhlckNoYW5nZWQgPSB0cnVlOwogICAgIH0KIAogICAgIC8vIGNoZWNrIGZvciBjaGFuZ2UgaW4gcGlwZQotICAgIGlmIChjdXJyZW50LT5tUGlwZVNpbmtHZW4gIT0gcGlwZVNpbmtHZW4pIHsKLSAgICAgICAgcGlwZVNpbmsgPSBjdXJyZW50LT5tUGlwZVNpbms7Ci0gICAgICAgIHBpcGVTaW5rR2VuID0gY3VycmVudC0+bVBpcGVTaW5rR2VuOworICAgIGlmIChjdXJyZW50LT5tUGlwZVNpbmtHZW4gIT0gbVBpcGVTaW5rR2VuKSB7CisgICAgICAgIG1QaXBlU2luayA9IGN1cnJlbnQtPm1QaXBlU2luazsKKyAgICAgICAgbVBpcGVTaW5rR2VuID0gY3VycmVudC0+bVBpcGVTaW5rR2VuOwogICAgICAgICBlaXRoZXJDaGFuZ2VkID0gdHJ1ZTsKICAgICB9CiAKICAgICAvLyBpbnB1dCBzb3VyY2UgYW5kIHBpcGUgc2luayBtdXN0IGJlIGNvbXBhdGlibGUKLSAgICBpZiAoZWl0aGVyQ2hhbmdlZCAmJiBpbnB1dFNvdXJjZSAhPSBOVUxMICYmIHBpcGVTaW5rICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR19BU1NFUlQoRm9ybWF0X2lzRXF1YWwoZm9ybWF0LCBwaXBlU2luay0+Zm9ybWF0KCkpKTsKKyAgICBpZiAoZWl0aGVyQ2hhbmdlZCAmJiBtSW5wdXRTb3VyY2UgIT0gTlVMTCAmJiBtUGlwZVNpbmsgIT0gTlVMTCkgeworICAgICAgICBBTE9HX0FTU0VSVChGb3JtYXRfaXNFcXVhbChtRm9ybWF0LCBtUGlwZVNpbmstPmZvcm1hdCgpKSk7CiAgICAgfQogCi0gICAgaWYgKCghRm9ybWF0X2lzRXF1YWwoZm9ybWF0LCBwcmV2aW91c0Zvcm1hdCkpIHx8IChmcmFtZUNvdW50ICE9IHByZXZpb3VzLT5tRnJhbWVDb3VudCkpIHsKLSAgICAgICAgLy8gRklYTUUgdG8gYXZvaWQgcHJpb3JpdHkgaW52ZXJzaW9uLCBkb24ndCBkZWxldGUgaGVyZQotICAgICAgICBkZWxldGVbXSByZWFkQnVmZmVyOwotICAgICAgICByZWFkQnVmZmVyID0gTlVMTDsKLSAgICAgICAgaWYgKGZyYW1lQ291bnQgPiAwICYmIHNhbXBsZVJhdGUgPiAwKSB7CisgICAgaWYgKCghRm9ybWF0X2lzRXF1YWwobUZvcm1hdCwgcHJldmlvdXNGb3JtYXQpKSB8fCAoZnJhbWVDb3VudCAhPSBwcmV2aW91cy0+bUZyYW1lQ291bnQpKSB7CisgICAgICAgIC8vIEZJWE1FIHRvIGF2b2lkIHByaW9yaXR5IGludmVyc2lvbiwgZG9uJ3QgZnJlZSBoZXJlCisgICAgICAgIGZyZWUobVJlYWRCdWZmZXIpOworICAgICAgICBtUmVhZEJ1ZmZlciA9IE5VTEw7CisgICAgICAgIGlmIChmcmFtZUNvdW50ID4gMCAmJiBtU2FtcGxlUmF0ZSA+IDApIHsKICAgICAgICAgICAgIC8vIEZJWE1FIG5ldyBtYXkgYmxvY2sgZm9yIHVuYm91bmRlZCB0aW1lIGF0IGludGVybmFsIG11dGV4IG9mIHRoZSBoZWFwCiAgICAgICAgICAgICAvLyAgICAgICBpbXBsZW1lbnRhdGlvbjsgaXQgd291bGQgYmUgYmV0dGVyIHRvIGhhdmUgbm9ybWFsIGNhcHR1cmUgdGhyZWFkIGFsbG9jYXRlIGZvcgogICAgICAgICAgICAgLy8gICAgICAgdXMgdG8gYXZvaWQgYmxvY2tpbmcgaGVyZSBhbmQgdG8gcHJldmVudCBwb3NzaWJsZSBwcmlvcml0eSBpbnZlcnNpb24KLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KTsKLSAgICAgICAgICAgIC8vIEZJWE1FIGZyYW1lU2l6ZQotICAgICAgICAgICAgcmVhZEJ1ZmZlciA9IG5ldyBzaG9ydFtmcmFtZUNvdW50ICogY2hhbm5lbENvdW50XTsKLSAgICAgICAgICAgIG1lbXNldChyZWFkQnVmZmVyLCAwLCBmcmFtZUNvdW50ICogY2hhbm5lbENvdW50ICogc2l6ZW9mKHJlYWRCdWZmZXJbMF0pKTsKLSAgICAgICAgICAgIHBlcmlvZE5zID0gKGZyYW1lQ291bnQgKiAxMDAwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgLy8gMS4wMAotICAgICAgICAgICAgdW5kZXJydW5OcyA9IChmcmFtZUNvdW50ICogMTc1MDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAvLyAxLjc1Ci0gICAgICAgICAgICBvdmVycnVuTnMgPSAoZnJhbWVDb3VudCAqIDUwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgIC8vIDAuNTAKLSAgICAgICAgICAgIGZvcmNlTnMgPSAoZnJhbWVDb3VudCAqIDk1MDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgICAgLy8gMC45NQotICAgICAgICAgICAgd2FybXVwTnMgPSAoZnJhbWVDb3VudCAqIDUwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgICAvLyAwLjUwCisgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IGZyYW1lQ291bnQgKiBGb3JtYXRfZnJhbWVTaXplKG1Gb3JtYXQpOworICAgICAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1SZWFkQnVmZmVyLCAzMiwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBtZW1zZXQobVJlYWRCdWZmZXIsIDAsIGJ1ZmZlclNpemUpOyAvLyBpZiBwb3NpeF9tZW1hbGlnbiBmYWlscywgd2lsbCBzZWd2IGhlcmUuCisgICAgICAgICAgICBtUGVyaW9kTnMgPSAoZnJhbWVDb3VudCAqIDEwMDAwMDAwMDBMTCkgLyBtU2FtcGxlUmF0ZTsgICAgICAvLyAxLjAwCisgICAgICAgICAgICBtVW5kZXJydW5OcyA9IChmcmFtZUNvdW50ICogMTc1MDAwMDAwMExMKSAvIG1TYW1wbGVSYXRlOyAgICAvLyAxLjc1CisgICAgICAgICAgICBtT3ZlcnJ1bk5zID0gKGZyYW1lQ291bnQgKiA1MDAwMDAwMDBMTCkgLyBtU2FtcGxlUmF0ZTsgICAgICAvLyAwLjUwCisgICAgICAgICAgICBtRm9yY2VOcyA9IChmcmFtZUNvdW50ICogOTUwMDAwMDAwTEwpIC8gbVNhbXBsZVJhdGU7ICAgICAgICAvLyAwLjk1CisgICAgICAgICAgICBtV2FybXVwTnNNaW4gPSAoZnJhbWVDb3VudCAqIDc1MDAwMDAwMExMKSAvIG1TYW1wbGVSYXRlOyAgICAvLyAwLjc1CisgICAgICAgICAgICBtV2FybXVwTnNNYXggPSAoZnJhbWVDb3VudCAqIDEyNTAwMDAwMDBMTCkgLyBtU2FtcGxlUmF0ZTsgICAvLyAxLjI1CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwZXJpb2ROcyA9IDA7Ci0gICAgICAgICAgICB1bmRlcnJ1bk5zID0gMDsKLSAgICAgICAgICAgIG92ZXJydW5OcyA9IDA7Ci0gICAgICAgICAgICBmb3JjZU5zID0gMDsKLSAgICAgICAgICAgIHdhcm11cE5zID0gMDsKKyAgICAgICAgICAgIG1QZXJpb2ROcyA9IDA7CisgICAgICAgICAgICBtVW5kZXJydW5OcyA9IDA7CisgICAgICAgICAgICBtT3ZlcnJ1bk5zID0gMDsKKyAgICAgICAgICAgIG1Gb3JjZU5zID0gMDsKKyAgICAgICAgICAgIG1XYXJtdXBOc01pbiA9IDA7CisgICAgICAgICAgICBtV2FybXVwTnNNYXggPSBMT05HX01BWDsKICAgICAgICAgfQotICAgICAgICByZWFkQnVmZmVyU3RhdGUgPSAtMTsKKyAgICAgICAgbVJlYWRCdWZmZXJTdGF0ZSA9IC0xOwogICAgICAgICBkdW1wU3RhdGUtPm1GcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKICAgICB9CiAKQEAgLTE1NSw0NCArMTU2LDQzIEBACiAKIHZvaWQgRmFzdENhcHR1cmU6Om9uV29yaygpCiB7Ci0gICAgY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqKSB0aGlzLT5jdXJyZW50OwotICAgIEZhc3RDYXB0dXJlRHVtcFN0YXRlICogY29uc3QgZHVtcFN0YXRlID0gKEZhc3RDYXB0dXJlRHVtcFN0YXRlICopIHRoaXMtPmR1bXBTdGF0ZTsKLSAgICBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlOjpDb21tYW5kIGNvbW1hbmQgPSB0aGlzLT5jb21tYW5kOworICAgIGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKiBjb25zdCBjdXJyZW50ID0gKGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKikgbUN1cnJlbnQ7CisgICAgRmFzdENhcHR1cmVEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdENhcHR1cmVEdW1wU3RhdGUgKikgbUR1bXBTdGF0ZTsKKyAgICBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlOjpDb21tYW5kIGNvbW1hbmQgPSBtQ29tbWFuZDsKICAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IGN1cnJlbnQtPm1GcmFtZUNvdW50OwogCiAgICAgaWYgKChjb21tYW5kICYgRmFzdENhcHR1cmVTdGF0ZTo6UkVBRCkgLyomJiBpc1dhcm0qLykgewotICAgICAgICBBTE9HX0FTU0VSVChpbnB1dFNvdXJjZSAhPSBOVUxMKTsKLSAgICAgICAgQUxPR19BU1NFUlQocmVhZEJ1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgQUxPR19BU1NFUlQobUlucHV0U291cmNlICE9IE5VTEwpOworICAgICAgICBBTE9HX0FTU0VSVChtUmVhZEJ1ZmZlciAhPSBOVUxMKTsKICAgICAgICAgZHVtcFN0YXRlLT5tUmVhZFNlcXVlbmNlKys7CiAgICAgICAgIEFUUkFDRV9CRUdJTigicmVhZCIpOwotICAgICAgICBzc2l6ZV90IGZyYW1lc1JlYWQgPSBpbnB1dFNvdXJjZS0+cmVhZChyZWFkQnVmZmVyLCBmcmFtZUNvdW50LAorICAgICAgICBzc2l6ZV90IGZyYW1lc1JlYWQgPSBtSW5wdXRTb3VyY2UtPnJlYWQobVJlYWRCdWZmZXIsIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6a0ludmFsaWRQVFMpOwogICAgICAgICBBVFJBQ0VfRU5EKCk7CiAgICAgICAgIGR1bXBTdGF0ZS0+bVJlYWRTZXF1ZW5jZSsrOwogICAgICAgICBpZiAoZnJhbWVzUmVhZCA+PSAwKSB7CiAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChzaXplX3QpIGZyYW1lc1JlYWQgPiBmcmFtZUNvdW50KTsKLSAgICAgICAgICAgIHRvdGFsTmF0aXZlRnJhbWVzUmVhZCArPSBmcmFtZXNSZWFkOwotICAgICAgICAgICAgZHVtcFN0YXRlLT5tRnJhbWVzUmVhZCA9IHRvdGFsTmF0aXZlRnJhbWVzUmVhZDsKLSAgICAgICAgICAgIHJlYWRCdWZmZXJTdGF0ZSA9IGZyYW1lc1JlYWQ7CisgICAgICAgICAgICBtVG90YWxOYXRpdmVGcmFtZXNSZWFkICs9IGZyYW1lc1JlYWQ7CisgICAgICAgICAgICBkdW1wU3RhdGUtPm1GcmFtZXNSZWFkID0gbVRvdGFsTmF0aXZlRnJhbWVzUmVhZDsKKyAgICAgICAgICAgIG1SZWFkQnVmZmVyU3RhdGUgPSBmcmFtZXNSZWFkOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZHVtcFN0YXRlLT5tUmVhZEVycm9ycysrOwotICAgICAgICAgICAgcmVhZEJ1ZmZlclN0YXRlID0gMDsKKyAgICAgICAgICAgIG1SZWFkQnVmZmVyU3RhdGUgPSAwOwogICAgICAgICB9CiAgICAgICAgIC8vIEZJWE1FIHJlbmFtZSB0byBhdHRlbXB0ZWRJTwotICAgICAgICBhdHRlbXB0ZWRXcml0ZSA9IHRydWU7CisgICAgICAgIG1BdHRlbXB0ZWRXcml0ZSA9IHRydWU7CiAgICAgfQogCiAgICAgaWYgKGNvbW1hbmQgJiBGYXN0Q2FwdHVyZVN0YXRlOjpXUklURSkgewotICAgICAgICBBTE9HX0FTU0VSVChwaXBlU2luayAhPSBOVUxMKTsKLSAgICAgICAgQUxPR19BU1NFUlQocmVhZEJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgaWYgKHJlYWRCdWZmZXJTdGF0ZSA8IDApIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KTsKLSAgICAgICAgICAgIC8vIEZJWE1FIGZyYW1lU2l6ZQotICAgICAgICAgICAgbWVtc2V0KHJlYWRCdWZmZXIsIDAsIGZyYW1lQ291bnQgKiBjaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpKTsKLSAgICAgICAgICAgIHJlYWRCdWZmZXJTdGF0ZSA9IGZyYW1lQ291bnQ7CisgICAgICAgIEFMT0dfQVNTRVJUKG1QaXBlU2luayAhPSBOVUxMKTsKKyAgICAgICAgQUxPR19BU1NFUlQobVJlYWRCdWZmZXIgIT0gTlVMTCk7CisgICAgICAgIGlmIChtUmVhZEJ1ZmZlclN0YXRlIDwgMCkgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhbm5lbENvdW50ID0gRm9ybWF0X2NoYW5uZWxDb3VudChtRm9ybWF0KTsKKyAgICAgICAgICAgIG1lbXNldChtUmVhZEJ1ZmZlciwgMCwgZnJhbWVDb3VudCAqIEZvcm1hdF9mcmFtZVNpemUobUZvcm1hdCkpOworICAgICAgICAgICAgbVJlYWRCdWZmZXJTdGF0ZSA9IGZyYW1lQ291bnQ7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHJlYWRCdWZmZXJTdGF0ZSA+IDApIHsKLSAgICAgICAgICAgIHNzaXplX3QgZnJhbWVzV3JpdHRlbiA9IHBpcGVTaW5rLT53cml0ZShyZWFkQnVmZmVyLCByZWFkQnVmZmVyU3RhdGUpOworICAgICAgICBpZiAobVJlYWRCdWZmZXJTdGF0ZSA+IDApIHsKKyAgICAgICAgICAgIHNzaXplX3QgZnJhbWVzV3JpdHRlbiA9IG1QaXBlU2luay0+d3JpdGUobVJlYWRCdWZmZXIsIG1SZWFkQnVmZmVyU3RhdGUpOwogICAgICAgICAgICAgLy8gRklYTUUgVGhpcyBzdXBwb3J0cyBhdCBtb3N0IG9uZSBmYXN0IGNhcHR1cmUgY2xpZW50LgogICAgICAgICAgICAgLy8gICAgICAgVG8gaGFuZGxlIG11bHRpcGxlIGNsaWVudHMgdGhpcyBjb3VsZCBiZSBjb252ZXJ0ZWQgdG8gYW4gYXJyYXksCiAgICAgICAgICAgICAvLyAgICAgICBvciB3aXRoIGEgbG90IG1vcmUgd29yayB0aGUgY29udHJvbCBibG9jayBjb3VsZCBiZSBzaGFyZWQgYnkgYWxsIGNsaWVudHMuCkBAIC0yMTEsMTMgKzIxMSw0IEBACiAgICAgfQogfQogCi1GYXN0Q2FwdHVyZUR1bXBTdGF0ZTo6RmFzdENhcHR1cmVEdW1wU3RhdGUoKSA6IEZhc3RUaHJlYWREdW1wU3RhdGUoKSwKLSAgICBtUmVhZFNlcXVlbmNlKDApLCBtRnJhbWVzUmVhZCgwKSwgbVJlYWRFcnJvcnMoMCksIG1TYW1wbGVSYXRlKDApLCBtRnJhbWVDb3VudCgwKQotewotfQotCi1GYXN0Q2FwdHVyZUR1bXBTdGF0ZTo6fkZhc3RDYXB0dXJlRHVtcFN0YXRlKCkKLXsKLX0KLQogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5oCmluZGV4IGU1MzViOWQuLmUyNThhNGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5oCkBAIC0yMCwyMyArMjAsMTIgQEAKICNpbmNsdWRlICJGYXN0VGhyZWFkLmgiCiAjaW5jbHVkZSAiU3RhdGVRdWV1ZS5oIgogI2luY2x1ZGUgIkZhc3RDYXB0dXJlU3RhdGUuaCIKKyNpbmNsdWRlICJGYXN0Q2FwdHVyZUR1bXBTdGF0ZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHR5cGVkZWYgU3RhdGVRdWV1ZTxGYXN0Q2FwdHVyZVN0YXRlPiBGYXN0Q2FwdHVyZVN0YXRlUXVldWU7CiAKLXN0cnVjdCBGYXN0Q2FwdHVyZUR1bXBTdGF0ZSA6IEZhc3RUaHJlYWREdW1wU3RhdGUgewotICAgIEZhc3RDYXB0dXJlRHVtcFN0YXRlKCk7Ci0gICAgLyp2aXJ0dWFsKi8gfkZhc3RDYXB0dXJlRHVtcFN0YXRlKCk7Ci0KLSAgICAvLyBGSVhNRSBieSByZW5hbWluZywgY291bGQgcHVsbCB1cCBtYW55IG9mIHRoZXNlIHRvIEZhc3RUaHJlYWREdW1wU3RhdGUKLSAgICB1aW50MzJfdCBtUmVhZFNlcXVlbmNlOyAgICAgLy8gaW5jcmVtZW50ZWQgYmVmb3JlIGFuZCBhZnRlciBlYWNoIHJlYWQoKQotICAgIHVpbnQzMl90IG1GcmFtZXNSZWFkOyAgICAgICAvLyB0b3RhbCBudW1iZXIgb2YgZnJhbWVzIHJlYWQgc3VjY2Vzc2Z1bGx5Ci0gICAgdWludDMyX3QgbVJlYWRFcnJvcnM7ICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiByZWFkKCkgZXJyb3JzCi0gICAgdWludDMyX3QgbVNhbXBsZVJhdGU7Ci0gICAgc2l6ZV90ICAgbUZyYW1lQ291bnQ7Ci19OwotCiBjbGFzcyBGYXN0Q2FwdHVyZSA6IHB1YmxpYyBGYXN0VGhyZWFkIHsKIAogcHVibGljOgpAQCAtNTcsMTkgKzQ2LDIxIEBACiAgICAgdmlydHVhbCB2b2lkIG9uU3RhdGVDaGFuZ2UoKTsKICAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrKCk7CiAKLSAgICBzdGF0aWMgY29uc3QgRmFzdENhcHR1cmVTdGF0ZSBpbml0aWFsOwotICAgIEZhc3RDYXB0dXJlU3RhdGUgcHJlSWRsZTsgLy8gY29weSBvZiBzdGF0ZSBiZWZvcmUgd2Ugd2VudCBpbnRvIGlkbGUKKyAgICBzdGF0aWMgY29uc3QgRmFzdENhcHR1cmVTdGF0ZSBzSW5pdGlhbDsKKworICAgIEZhc3RDYXB0dXJlU3RhdGUgICAgbVByZUlkbGU7ICAgLy8gY29weSBvZiBzdGF0ZSBiZWZvcmUgd2Ugd2VudCBpbnRvIGlkbGUKICAgICAvLyBGSVhNRSBieSByZW5hbWluZywgY291bGQgcHVsbCB1cCBtYW55IG9mIHRoZXNlIHRvIEZhc3RUaHJlYWQKLSAgICBOQkFJT19Tb3VyY2UgKmlucHV0U291cmNlOwotICAgIGludCBpbnB1dFNvdXJjZUdlbjsKLSAgICBOQkFJT19TaW5rICpwaXBlU2luazsKLSAgICBpbnQgcGlwZVNpbmtHZW47Ci0gICAgc2hvcnQgKnJlYWRCdWZmZXI7Ci0gICAgc3NpemVfdCByZWFkQnVmZmVyU3RhdGU7ICAgIC8vIG51bWJlciBvZiBpbml0aWFsaXplZCBmcmFtZXMgaW4gcmVhZEJ1ZmZlciwgb3IgLTEgdG8gY2xlYXIKLSAgICBOQkFJT19Gb3JtYXQgZm9ybWF0OwotICAgIHVuc2lnbmVkIHNhbXBsZVJhdGU7Ci0gICAgRmFzdENhcHR1cmVEdW1wU3RhdGUgZHVtbXlEdW1wU3RhdGU7Ci0gICAgdWludDMyX3QgdG90YWxOYXRpdmVGcmFtZXNSZWFkOyAvLyBjb3BpZWQgdG8gZHVtcFN0YXRlLT5tRnJhbWVzUmVhZAorICAgIE5CQUlPX1NvdXJjZSogICAgICAgbUlucHV0U291cmNlOworICAgIGludCAgICAgICAgICAgICAgICAgbUlucHV0U291cmNlR2VuOworICAgIE5CQUlPX1NpbmsqICAgICAgICAgbVBpcGVTaW5rOworICAgIGludCAgICAgICAgICAgICAgICAgbVBpcGVTaW5rR2VuOworICAgIHZvaWQqICAgICAgICAgICAgICAgbVJlYWRCdWZmZXI7CisgICAgc3NpemVfdCAgICAgICAgICAgICBtUmVhZEJ1ZmZlclN0YXRlOyAgIC8vIG51bWJlciBvZiBpbml0aWFsaXplZCBmcmFtZXMgaW4gcmVhZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgLTEgdG8gY2xlYXIKKyAgICBOQkFJT19Gb3JtYXQgICAgICAgIG1Gb3JtYXQ7CisgICAgdW5zaWduZWQgICAgICAgICAgICBtU2FtcGxlUmF0ZTsKKyAgICBGYXN0Q2FwdHVyZUR1bXBTdGF0ZSBtRHVtbXlGYXN0Q2FwdHVyZUR1bXBTdGF0ZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1Ub3RhbE5hdGl2ZUZyYW1lc1JlYWQ7IC8vIGNvcGllZCB0byBkdW1wU3RhdGUtPm1GcmFtZXNSZWFkCiAKIH07ICAvLyBjbGFzcyBGYXN0Q2FwdHVyZQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVEdW1wU3RhdGUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlRHVtcFN0YXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2VlYmE1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlRHVtcFN0YXRlLmNwcApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJGYXN0Q2FwdHVyZUR1bXBTdGF0ZSIKKy8vZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgIkZhc3RDYXB0dXJlRHVtcFN0YXRlLmgiCisjaW5jbHVkZSAiRmFzdENhcHR1cmVTdGF0ZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0Zhc3RDYXB0dXJlRHVtcFN0YXRlOjpGYXN0Q2FwdHVyZUR1bXBTdGF0ZSgpIDogRmFzdFRocmVhZER1bXBTdGF0ZSgpLAorICAgIG1SZWFkU2VxdWVuY2UoMCksIG1GcmFtZXNSZWFkKDApLCBtUmVhZEVycm9ycygwKSwgbVNhbXBsZVJhdGUoMCksIG1GcmFtZUNvdW50KDApCit7Cit9CisKK0Zhc3RDYXB0dXJlRHVtcFN0YXRlOjp+RmFzdENhcHR1cmVEdW1wU3RhdGUoKQoreworfQorCit2b2lkIEZhc3RDYXB0dXJlRHVtcFN0YXRlOjpkdW1wKGludCBmZCkgY29uc3QKK3sKKyAgICBpZiAobUNvbW1hbmQgPT0gRmFzdENhcHR1cmVTdGF0ZTo6SU5JVElBTCkgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBGYXN0Q2FwdHVyZSBub3QgaW5pdGlhbGl6ZWRcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGRvdWJsZSBtZWFzdXJlZFdhcm11cE1zID0gKG1NZWFzdXJlZFdhcm11cFRzLnR2X3NlYyAqIDEwMDAuMCkgKworICAgICAgICAgICAgKG1NZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgLyAxMDAwMDAwLjApOworICAgIGRvdWJsZSBwZXJpb2RTZWMgPSAoZG91YmxlKSBtRnJhbWVDb3VudCAvIG1TYW1wbGVSYXRlOworICAgIGRwcmludGYoZmQsICIgIEZhc3RDYXB0dXJlIGNvbW1hbmQ9JXMgcmVhZFNlcXVlbmNlPSV1IGZyYW1lc1JlYWQ9JXVcbiIKKyAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICByZWFkRXJyb3JzPSV1IHNhbXBsZVJhdGU9JXUgZnJhbWVDb3VudD0lenVcbiIKKyAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cD0lLjNnIG1zLCB3YXJtdXBDeWNsZXM9JXUgcGVyaW9kPSUuMmYgbXNcbiIsCisgICAgICAgICAgICAgICAgRmFzdENhcHR1cmVTdGF0ZTo6Y29tbWFuZFRvU3RyaW5nKG1Db21tYW5kKSwgbVJlYWRTZXF1ZW5jZSwgbUZyYW1lc1JlYWQsCisgICAgICAgICAgICAgICAgbVJlYWRFcnJvcnMsIG1TYW1wbGVSYXRlLCBtRnJhbWVDb3VudCwgbWVhc3VyZWRXYXJtdXBNcywgbVdhcm11cEN5Y2xlcywKKyAgICAgICAgICAgICAgICBwZXJpb2RTZWMgKiAxZTMpOworfQorCit9ICAgLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlRHVtcFN0YXRlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVEdW1wU3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjljNGMzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlRHVtcFN0YXRlLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19GQVNUX0NBUFRVUkVfRFVNUF9TVEFURV9ICisjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9DQVBUVVJFX0RVTVBfU1RBVEVfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgIkZhc3RUaHJlYWREdW1wU3RhdGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgRmFzdENhcHR1cmVEdW1wU3RhdGUgOiBGYXN0VGhyZWFkRHVtcFN0YXRlIHsKKyAgICBGYXN0Q2FwdHVyZUR1bXBTdGF0ZSgpOworICAgIC8qdmlydHVhbCovIH5GYXN0Q2FwdHVyZUR1bXBTdGF0ZSgpOworCisgICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3Q7ICAgIC8vIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHN0YWJsZSBjb3B5LCBub3QgdGhlIG9yaWdpbmFsCisKKyAgICAvLyBGSVhNRSBieSByZW5hbWluZywgY291bGQgcHVsbCB1cCBtYW55IG9mIHRoZXNlIHRvIEZhc3RUaHJlYWREdW1wU3RhdGUKKyAgICB1aW50MzJfdCBtUmVhZFNlcXVlbmNlOyAgICAgLy8gaW5jcmVtZW50ZWQgYmVmb3JlIGFuZCBhZnRlciBlYWNoIHJlYWQoKQorICAgIHVpbnQzMl90IG1GcmFtZXNSZWFkOyAgICAgICAvLyB0b3RhbCBudW1iZXIgb2YgZnJhbWVzIHJlYWQgc3VjY2Vzc2Z1bGx5CisgICAgdWludDMyX3QgbVJlYWRFcnJvcnM7ICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiByZWFkKCkgZXJyb3JzCisgICAgdWludDMyX3QgbVNhbXBsZVJhdGU7CisgICAgc2l6ZV90ICAgbUZyYW1lQ291bnQ7Cit9OworCit9ICAgLy8gYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQVVESU9fRkFTVF9DQVBUVVJFX0RVTVBfU1RBVEVfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuY3BwCmluZGV4IDFkMDI5YjcuLmM0ZDVlNDUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5jcHAKQEAgLTI3LDQgKzI3LDE5IEBACiB7CiB9CiAKKy8vIHN0YXRpYworY29uc3QgY2hhciAqRmFzdENhcHR1cmVTdGF0ZTo6Y29tbWFuZFRvU3RyaW5nKENvbW1hbmQgY29tbWFuZCkKK3sKKyAgICBjb25zdCBjaGFyICpzdHIgPSBGYXN0VGhyZWFkU3RhdGU6OmNvbW1hbmRUb1N0cmluZyhjb21tYW5kKTsKKyAgICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIHN0cjsKKyAgICB9CisgICAgc3dpdGNoIChjb21tYW5kKSB7CisgICAgY2FzZSBGYXN0Q2FwdHVyZVN0YXRlOjpSRUFEOiAgICAgICAgcmV0dXJuICJSRUFEIjsKKyAgICBjYXNlIEZhc3RDYXB0dXJlU3RhdGU6OldSSVRFOiAgICAgICByZXR1cm4gIldSSVRFIjsKKyAgICBjYXNlIEZhc3RDYXB0dXJlU3RhdGU6OlJFQURfV1JJVEU6ICByZXR1cm4gIlJFQURfV1JJVEUiOworICAgIH0KKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyIsIF9fZnVuY19fKTsKK30KKwogfSAgIC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5oCmluZGV4IDI5Yzg2NWEuLjliY2EyZDQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuaApAQCAtMjksMjEgKzI5LDIzIEBACiAgICAgLyp2aXJ0dWFsKi8gfkZhc3RDYXB0dXJlU3RhdGUoKTsKIAogICAgIC8vIGFsbCBwb2ludGVyIGZpZWxkcyB1c2UgcmF3IHBvaW50ZXJzOyBvYmplY3RzIGFyZSBvd25lZCBhbmQgcmVmLWNvdW50ZWQgYnkgUmVjb3JkVGhyZWFkCi0gICAgTkJBSU9fU291cmNlICAgICptSW5wdXRTb3VyY2U7ICAgICAgLy8gSEFMIGlucHV0IGRldmljZSwgbXVzdCBhbHJlYWR5IGJlIG5lZ290aWF0ZWQKKyAgICBOQkFJT19Tb3VyY2UqICAgbUlucHV0U291cmNlOyAgICAgICAvLyBIQUwgaW5wdXQgZGV2aWNlLCBtdXN0IGFscmVhZHkgYmUgbmVnb3RpYXRlZAogICAgIC8vIEZJWE1FIGJ5IHJlbmFtaW5nLCBjb3VsZCBwdWxsIHVwIHRoZXNlIGZpZWxkcyB0byBGYXN0VGhyZWFkU3RhdGUKICAgICBpbnQgICAgICAgICAgICAgbUlucHV0U291cmNlR2VuOyAgICAvLyBpbmNyZW1lbnQgd2hlbiBtSW5wdXRTb3VyY2UgaXMgYXNzaWduZWQKLSAgICBOQkFJT19TaW5rICAgICAgKm1QaXBlU2luazsgICAgICAgICAvLyBhZnRlciByZWFkaW5nIGZyb20gaW5wdXQgc291cmNlLCB3cml0ZSB0byB0aGlzIHBpcGUgc2luaworICAgIE5CQUlPX1NpbmsqICAgICBtUGlwZVNpbms7ICAgICAgICAgIC8vIGFmdGVyIHJlYWRpbmcgZnJvbSBpbnB1dCBzb3VyY2UsIHdyaXRlIHRvIHRoaXMgcGlwZSBzaW5rCiAgICAgaW50ICAgICAgICAgICAgIG1QaXBlU2lua0dlbjsgICAgICAgLy8gaW5jcmVtZW50IHdoZW4gbVBpcGVTaW5rIGlzIGFzc2lnbmVkCiAgICAgc2l6ZV90ICAgICAgICAgIG1GcmFtZUNvdW50OyAgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBwZXIgZmFzdCBjYXB0dXJlIGJ1ZmZlcgotICAgIGF1ZGlvX3RyYWNrX2NibGtfdCAgKm1DYmxrOyAgICAgICAgIC8vIGNvbnRyb2wgYmxvY2sgZm9yIHRoZSBzaW5nbGUgZmFzdCBjbGllbnQsIG9yIE5VTEwKKyAgICBhdWRpb190cmFja19jYmxrX3QqIG1DYmxrOyAgICAgICAgICAvLyBjb250cm9sIGJsb2NrIGZvciB0aGUgc2luZ2xlIGZhc3QgY2xpZW50LCBvciBOVUxMCiAKICAgICAvLyBFeHRlbmRzIEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZAogICAgIHN0YXRpYyBjb25zdCBDb21tYW5kCiAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYWxzbyBwcm9jZXNzIGNvbmZpZ3VyYXRpb24gY2hhbmdlcywgYW5kIGNhbiBiZSAib3IiZWQ6Ci0gICAgICAgIFJFQUQgPSAweDgsICAgICAgICAgICAgIC8vIHJlYWQgZnJvbSBpbnB1dCBzb3VyY2UKLSAgICAgICAgV1JJVEUgPSAweDEwLCAgICAgICAgICAgLy8gd3JpdGUgdG8gcGlwZSBzaW5rCi0gICAgICAgIFJFQURfV1JJVEUgPSAweDE4OyAgICAgIC8vIHJlYWQgZnJvbSBpbnB1dCBzb3VyY2UgYW5kIHdyaXRlIHRvIHBpcGUgc2luaworICAgICAgICBSRUFEID0gMHg4LCAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWQgZnJvbSBpbnB1dCBzb3VyY2UKKyAgICAgICAgV1JJVEUgPSAweDEwLCAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0byBwaXBlIHNpbmsKKyAgICAgICAgUkVBRF9XUklURSA9IDB4MTg7ICAgICAgICAgICAgICAvLyByZWFkIGZyb20gaW5wdXQgc291cmNlIGFuZCB3cml0ZSB0byBwaXBlIHNpbmsKIAorICAgIC8vIG5ldmVyIHJldHVybnMgTlVMTDsgYXNzZXJ0cyBpZiBjb21tYW5kIGlzIGludmFsaWQKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29tbWFuZFRvU3RyaW5nKENvbW1hbmQgY29tbWFuZCk7CiB9OyAgLy8gc3RydWN0IEZhc3RDYXB0dXJlU3RhdGUKIAogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCmluZGV4IDI2NzhjYmYuLjQ1YzY4YjUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCkBAIC0yNywxMCArMjcsMTEgQEAKIAogI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUworI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKICNpbmNsdWRlIDxjcHVzdGF0cy9DZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzLmg+CiAjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCiAjaW5jbHVkZSA8Y3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuaD4KQEAgLTQ0LDE1ICs0NSwxNSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLS8qc3RhdGljKi8gY29uc3QgRmFzdE1peGVyU3RhdGUgRmFzdE1peGVyOjppbml0aWFsOworLypzdGF0aWMqLyBjb25zdCBGYXN0TWl4ZXJTdGF0ZSBGYXN0TWl4ZXI6OnNJbml0aWFsOwogCiBGYXN0TWl4ZXI6OkZhc3RNaXhlcigpIDogRmFzdFRocmVhZCgpLAotICAgIHNsb3BOcygwKSwKLSAgICAvLyBmYXN0VHJhY2tOYW1lcwotICAgIC8vIGdlbmVyYXRpb25zCi0gICAgb3V0cHV0U2luayhOVUxMKSwKLSAgICBvdXRwdXRTaW5rR2VuKDApLAotICAgIG1peGVyKE5VTEwpLAorICAgIG1TbG9wTnMoMCksCisgICAgLy8gbUZhc3RUcmFja05hbWVzCisgICAgLy8gbUdlbmVyYXRpb25zCisgICAgbU91dHB1dFNpbmsoTlVMTCksCisgICAgbU91dHB1dFNpbmtHZW4oMCksCisgICAgbU1peGVyKE5VTEwpLAogICAgIG1TaW5rQnVmZmVyKE5VTEwpLAogICAgIG1TaW5rQnVmZmVyU2l6ZSgwKSwKICAgICBtU2lua0NoYW5uZWxDb3VudChGQ0NfMiksCkBAIC02MCwzMCArNjEsMzAgQEAKICAgICBtTWl4ZXJCdWZmZXJTaXplKDApLAogICAgIG1NaXhlckJ1ZmZlckZvcm1hdChBVURJT19GT1JNQVRfUENNXzE2X0JJVCksCiAgICAgbU1peGVyQnVmZmVyU3RhdGUoVU5ERUZJTkVEKSwKLSAgICBmb3JtYXQoRm9ybWF0X0ludmFsaWQpLAotICAgIHNhbXBsZVJhdGUoMCksCi0gICAgZmFzdFRyYWNrc0dlbigwKSwKLSAgICB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4oMCksCisgICAgbUZvcm1hdChGb3JtYXRfSW52YWxpZCksCisgICAgbVNhbXBsZVJhdGUoMCksCisgICAgbUZhc3RUcmFja3NHZW4oMCksCisgICAgbVRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbigwKSwKICAgICAvLyB0aW1lc3RhbXAKLSAgICBuYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkKDApICAgLy8gdGhlID0gMCBpcyB0byBzaWxlbmNlIHRoZSBjb21waWxlcgorICAgIG1OYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkKDApICAgLy8gdGhlID0gMCBpcyB0byBzaWxlbmNlIHRoZSBjb21waWxlcgogewotICAgIC8vIEZJWE1FIHBhc3MgaW5pdGlhbCBhcyBwYXJhbWV0ZXIgdG8gYmFzZSBjbGFzcyBjb25zdHJ1Y3RvciwgYW5kIG1ha2UgaXQgc3RhdGljIGxvY2FsCi0gICAgcHJldmlvdXMgPSAmaW5pdGlhbDsKLSAgICBjdXJyZW50ID0gJmluaXRpYWw7CisgICAgLy8gRklYTUUgcGFzcyBzSW5pdGlhbCBhcyBwYXJhbWV0ZXIgdG8gYmFzZSBjbGFzcyBjb25zdHJ1Y3RvciwgYW5kIG1ha2UgaXQgc3RhdGljIGxvY2FsCisgICAgbVByZXZpb3VzID0gJnNJbml0aWFsOworICAgIG1DdXJyZW50ID0gJnNJbml0aWFsOwogCi0gICAgbUR1bW15RHVtcFN0YXRlID0gJmR1bW15RHVtcFN0YXRlOworICAgIG1EdW1teUR1bXBTdGF0ZSA9ICZtRHVtbXlGYXN0TWl4ZXJEdW1wU3RhdGU7CiAgICAgLy8gVE9ETzogQWRkIGNoYW5uZWwgbWFzayB0byBOQkFJT19Gb3JtYXQuCiAgICAgLy8gV2UgYXNzdW1lIHRoYXQgdGhlIGNoYW5uZWwgbWFzayBtdXN0IGJlIGEgdmFsaWQgcG9zaXRpb25hbCBjaGFubmVsIG1hc2suCiAgICAgbVNpbmtDaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChtU2lua0NoYW5uZWxDb3VudCk7CiAKICAgICB1bnNpZ25lZCBpOwogICAgIGZvciAoaSA9IDA7IGkgPCBGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3M7ICsraSkgewotICAgICAgICBmYXN0VHJhY2tOYW1lc1tpXSA9IC0xOwotICAgICAgICBnZW5lcmF0aW9uc1tpXSA9IDA7CisgICAgICAgIG1GYXN0VHJhY2tOYW1lc1tpXSA9IC0xOworICAgICAgICBtR2VuZXJhdGlvbnNbaV0gPSAwOwogICAgIH0KLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICBvbGRMb2FkLnR2X3NlYyA9IDA7Ci0gICAgb2xkTG9hZC50dl9uc2VjID0gMDsKKyNpZmRlZiBGQVNUX1RIUkVBRF9TVEFUSVNUSUNTCisgICAgbU9sZExvYWQudHZfc2VjID0gMDsKKyAgICBtT2xkTG9hZC50dl9uc2VjID0gMDsKICNlbmRpZgogfQogCkBAIC0xMDMsMjAgKzEwNCwyMCBAQAogCiB2b2lkIEZhc3RNaXhlcjo6c2V0TG9nKE5CTG9nOjpXcml0ZXIgKmxvZ1dyaXRlcikKIHsKLSAgICBpZiAobWl4ZXIgIT0gTlVMTCkgewotICAgICAgICBtaXhlci0+c2V0TG9nKGxvZ1dyaXRlcik7CisgICAgaWYgKG1NaXhlciAhPSBOVUxMKSB7CisgICAgICAgIG1NaXhlci0+c2V0TG9nKGxvZ1dyaXRlcik7CiAgICAgfQogfQogCiB2b2lkIEZhc3RNaXhlcjo6b25JZGxlKCkKIHsKLSAgICBwcmVJZGxlID0gKihjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKWN1cnJlbnQ7Ci0gICAgY3VycmVudCA9ICZwcmVJZGxlOworICAgIG1QcmVJZGxlID0gKihjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKW1DdXJyZW50OworICAgIG1DdXJyZW50ID0gJm1QcmVJZGxlOwogfQogCiB2b2lkIEZhc3RNaXhlcjo6b25FeGl0KCkKIHsKLSAgICBkZWxldGUgbWl4ZXI7CisgICAgZGVsZXRlIG1NaXhlcjsKICAgICBmcmVlKG1NaXhlckJ1ZmZlcik7CiAgICAgZnJlZShtU2lua0J1ZmZlcik7CiB9CkBAIC0xMzUsODIgKzEzNiw4OCBAQAogCiB2b2lkIEZhc3RNaXhlcjo6b25TdGF0ZUNoYW5nZSgpCiB7Ci0gICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKiBjb25zdCBjdXJyZW50ID0gKGNvbnN0IEZhc3RNaXhlclN0YXRlICopIHRoaXMtPmN1cnJlbnQ7Ci0gICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKiBjb25zdCBwcmV2aW91cyA9IChjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKSB0aGlzLT5wcmV2aW91czsKLSAgICBGYXN0TWl4ZXJEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdE1peGVyRHVtcFN0YXRlICopIHRoaXMtPmR1bXBTdGF0ZTsKKyAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdE1peGVyU3RhdGUgKikgbUN1cnJlbnQ7CisgICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKiBjb25zdCBwcmV2aW91cyA9IChjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKSBtUHJldmlvdXM7CisgICAgRmFzdE1peGVyRHVtcFN0YXRlICogY29uc3QgZHVtcFN0YXRlID0gKEZhc3RNaXhlckR1bXBTdGF0ZSAqKSBtRHVtcFN0YXRlOwogICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0gY3VycmVudC0+bUZyYW1lQ291bnQ7CiAKICAgICAvLyBoYW5kbGUgc3RhdGUgY2hhbmdlIGhlcmUsIGJ1dCBzaW5jZSB3ZSB3YW50IHRvIGRpZmYgdGhlIHN0YXRlLAotICAgIC8vIHdlJ3JlIHByZXBhcmVkIGZvciBwcmV2aW91cyA9PSAmaW5pdGlhbCB0aGUgZmlyc3QgdGltZSB0aHJvdWdoCisgICAgLy8gd2UncmUgcHJlcGFyZWQgZm9yIHByZXZpb3VzID09ICZzSW5pdGlhbCB0aGUgZmlyc3QgdGltZSB0aHJvdWdoCiAgICAgdW5zaWduZWQgcHJldmlvdXNUcmFja01hc2s7CiAKICAgICAvLyBjaGVjayBmb3IgY2hhbmdlIGluIG91dHB1dCBIQUwgY29uZmlndXJhdGlvbgotICAgIE5CQUlPX0Zvcm1hdCBwcmV2aW91c0Zvcm1hdCA9IGZvcm1hdDsKLSAgICBpZiAoY3VycmVudC0+bU91dHB1dFNpbmtHZW4gIT0gb3V0cHV0U2lua0dlbikgewotICAgICAgICBvdXRwdXRTaW5rID0gY3VycmVudC0+bU91dHB1dFNpbms7Ci0gICAgICAgIG91dHB1dFNpbmtHZW4gPSBjdXJyZW50LT5tT3V0cHV0U2lua0dlbjsKLSAgICAgICAgaWYgKG91dHB1dFNpbmsgPT0gTlVMTCkgewotICAgICAgICAgICAgZm9ybWF0ID0gRm9ybWF0X0ludmFsaWQ7Ci0gICAgICAgICAgICBzYW1wbGVSYXRlID0gMDsKKyAgICBOQkFJT19Gb3JtYXQgcHJldmlvdXNGb3JtYXQgPSBtRm9ybWF0OworICAgIGlmIChjdXJyZW50LT5tT3V0cHV0U2lua0dlbiAhPSBtT3V0cHV0U2lua0dlbikgeworICAgICAgICBtT3V0cHV0U2luayA9IGN1cnJlbnQtPm1PdXRwdXRTaW5rOworICAgICAgICBtT3V0cHV0U2lua0dlbiA9IGN1cnJlbnQtPm1PdXRwdXRTaW5rR2VuOworICAgICAgICBpZiAobU91dHB1dFNpbmsgPT0gTlVMTCkgeworICAgICAgICAgICAgbUZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkOworICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSAwOwogICAgICAgICAgICAgbVNpbmtDaGFubmVsQ291bnQgPSAwOwogICAgICAgICAgICAgbVNpbmtDaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvcm1hdCA9IG91dHB1dFNpbmstPmZvcm1hdCgpOwotICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IEZvcm1hdF9zYW1wbGVSYXRlKGZvcm1hdCk7Ci0gICAgICAgICAgICBtU2lua0NoYW5uZWxDb3VudCA9IEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KTsKKyAgICAgICAgICAgIG1Gb3JtYXQgPSBtT3V0cHV0U2luay0+Zm9ybWF0KCk7CisgICAgICAgICAgICBtU2FtcGxlUmF0ZSA9IEZvcm1hdF9zYW1wbGVSYXRlKG1Gb3JtYXQpOworICAgICAgICAgICAgbVNpbmtDaGFubmVsQ291bnQgPSBGb3JtYXRfY2hhbm5lbENvdW50KG1Gb3JtYXQpOwogICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtU2lua0NoYW5uZWxDb3VudCA+IEF1ZGlvTWl4ZXI6Ok1BWF9OVU1fQ0hBTk5FTFMpOwogCiAgICAgICAgICAgICAvLyBUT0RPOiBBZGQgY2hhbm5lbCBtYXNrIHRvIE5CQUlPX0Zvcm1hdAogICAgICAgICAgICAgLy8gV2UgYXNzdW1lIHRoYXQgdGhlIGNoYW5uZWwgbWFzayBtdXN0IGJlIGEgdmFsaWQgcG9zaXRpb25hbCBjaGFubmVsIG1hc2suCiAgICAgICAgICAgICBtU2lua0NoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KG1TaW5rQ2hhbm5lbENvdW50KTsKICAgICAgICAgfQotICAgICAgICBkdW1wU3RhdGUtPm1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKyAgICAgICAgZHVtcFN0YXRlLT5tU2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOwogICAgIH0KIAotICAgIGlmICgoIUZvcm1hdF9pc0VxdWFsKGZvcm1hdCwgcHJldmlvdXNGb3JtYXQpKSB8fCAoZnJhbWVDb3VudCAhPSBwcmV2aW91cy0+bUZyYW1lQ291bnQpKSB7CisgICAgaWYgKCghRm9ybWF0X2lzRXF1YWwobUZvcm1hdCwgcHJldmlvdXNGb3JtYXQpKSB8fCAoZnJhbWVDb3VudCAhPSBwcmV2aW91cy0+bUZyYW1lQ291bnQpKSB7CiAgICAgICAgIC8vIEZJWE1FIHRvIGF2b2lkIHByaW9yaXR5IGludmVyc2lvbiwgZG9uJ3QgZGVsZXRlIGhlcmUKLSAgICAgICAgZGVsZXRlIG1peGVyOwotICAgICAgICBtaXhlciA9IE5VTEw7CisgICAgICAgIGRlbGV0ZSBtTWl4ZXI7CisgICAgICAgIG1NaXhlciA9IE5VTEw7CiAgICAgICAgIGZyZWUobU1peGVyQnVmZmVyKTsKICAgICAgICAgbU1peGVyQnVmZmVyID0gTlVMTDsKICAgICAgICAgZnJlZShtU2lua0J1ZmZlcik7CiAgICAgICAgIG1TaW5rQnVmZmVyID0gTlVMTDsKLSAgICAgICAgaWYgKGZyYW1lQ291bnQgPiAwICYmIHNhbXBsZVJhdGUgPiAwKSB7CisgICAgICAgIGlmIChmcmFtZUNvdW50ID4gMCAmJiBtU2FtcGxlUmF0ZSA+IDApIHsKKyAgICAgICAgICAgIC8vIFRoZSBtaXhlciBwcm9kdWNlcyBlaXRoZXIgMTYgYml0IFBDTSBvciBmbG9hdCBvdXRwdXQsIHNlbGVjdAorICAgICAgICAgICAgLy8gZmxvYXQgb3V0cHV0IGlmIHRoZSBIQUwgc3VwcG9ydHMgaGlnaGVyIHRoYW4gMTYgYml0IHByZWNpc2lvbi4KKyAgICAgICAgICAgIG1NaXhlckJ1ZmZlckZvcm1hdCA9IG1Gb3JtYXQubUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCA/CisgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIDogQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKICAgICAgICAgICAgIC8vIEZJWE1FIG5ldyBtYXkgYmxvY2sgZm9yIHVuYm91bmRlZCB0aW1lIGF0IGludGVybmFsIG11dGV4IG9mIHRoZSBoZWFwCiAgICAgICAgICAgICAvLyAgICAgICBpbXBsZW1lbnRhdGlvbjsgaXQgd291bGQgYmUgYmV0dGVyIHRvIGhhdmUgbm9ybWFsIG1peGVyIGFsbG9jYXRlIGZvciB1cwogICAgICAgICAgICAgLy8gICAgICAgdG8gYXZvaWQgYmxvY2tpbmcgaGVyZSBhbmQgdG8gcHJldmVudCBwb3NzaWJsZSBwcmlvcml0eSBpbnZlcnNpb24KLSAgICAgICAgICAgIG1peGVyID0gbmV3IEF1ZGlvTWl4ZXIoZnJhbWVDb3VudCwgc2FtcGxlUmF0ZSwgRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzKTsKKyAgICAgICAgICAgIG1NaXhlciA9IG5ldyBBdWRpb01peGVyKGZyYW1lQ291bnQsIG1TYW1wbGVSYXRlLCBGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3MpOwogICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG1peGVyRnJhbWVTaXplID0gbVNpbmtDaGFubmVsQ291bnQKICAgICAgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1NaXhlckJ1ZmZlckZvcm1hdCk7CiAgICAgICAgICAgICBtTWl4ZXJCdWZmZXJTaXplID0gbWl4ZXJGcmFtZVNpemUgKiBmcmFtZUNvdW50OwogICAgICAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1NaXhlckJ1ZmZlciwgMzIsIG1NaXhlckJ1ZmZlclNpemUpOwogICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHNpbmtGcmFtZVNpemUgPSBtU2lua0NoYW5uZWxDb3VudAotICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0Lm1Gb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUZvcm1hdC5tRm9ybWF0KTsKICAgICAgICAgICAgIGlmIChzaW5rRnJhbWVTaXplID4gbWl4ZXJGcmFtZVNpemUpIHsgLy8gbmVlZCBhIHNpbmsgYnVmZmVyCiAgICAgICAgICAgICAgICAgbVNpbmtCdWZmZXJTaXplID0gc2lua0ZyYW1lU2l6ZSAqIGZyYW1lQ291bnQ7CiAgICAgICAgICAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1TaW5rQnVmZmVyLCAzMiwgbVNpbmtCdWZmZXJTaXplKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBlcmlvZE5zID0gKGZyYW1lQ291bnQgKiAxMDAwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgLy8gMS4wMAotICAgICAgICAgICAgdW5kZXJydW5OcyA9IChmcmFtZUNvdW50ICogMTc1MDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAvLyAxLjc1Ci0gICAgICAgICAgICBvdmVycnVuTnMgPSAoZnJhbWVDb3VudCAqIDUwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgIC8vIDAuNTAKLSAgICAgICAgICAgIGZvcmNlTnMgPSAoZnJhbWVDb3VudCAqIDk1MDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgICAgLy8gMC45NQotICAgICAgICAgICAgd2FybXVwTnMgPSAoZnJhbWVDb3VudCAqIDUwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgICAvLyAwLjUwCisgICAgICAgICAgICBtUGVyaW9kTnMgPSAoZnJhbWVDb3VudCAqIDEwMDAwMDAwMDBMTCkgLyBtU2FtcGxlUmF0ZTsgICAgLy8gMS4wMAorICAgICAgICAgICAgbVVuZGVycnVuTnMgPSAoZnJhbWVDb3VudCAqIDE3NTAwMDAwMDBMTCkgLyBtU2FtcGxlUmF0ZTsgIC8vIDEuNzUKKyAgICAgICAgICAgIG1PdmVycnVuTnMgPSAoZnJhbWVDb3VudCAqIDUwMDAwMDAwMExMKSAvIG1TYW1wbGVSYXRlOyAgICAvLyAwLjUwCisgICAgICAgICAgICBtRm9yY2VOcyA9IChmcmFtZUNvdW50ICogOTUwMDAwMDAwTEwpIC8gbVNhbXBsZVJhdGU7ICAgICAgLy8gMC45NQorICAgICAgICAgICAgbVdhcm11cE5zTWluID0gKGZyYW1lQ291bnQgKiA3NTAwMDAwMDBMTCkgLyBtU2FtcGxlUmF0ZTsgIC8vIDAuNzUKKyAgICAgICAgICAgIG1XYXJtdXBOc01heCA9IChmcmFtZUNvdW50ICogMTI1MDAwMDAwMExMKSAvIG1TYW1wbGVSYXRlOyAvLyAxLjI1CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwZXJpb2ROcyA9IDA7Ci0gICAgICAgICAgICB1bmRlcnJ1bk5zID0gMDsKLSAgICAgICAgICAgIG92ZXJydW5OcyA9IDA7Ci0gICAgICAgICAgICBmb3JjZU5zID0gMDsKLSAgICAgICAgICAgIHdhcm11cE5zID0gMDsKKyAgICAgICAgICAgIG1QZXJpb2ROcyA9IDA7CisgICAgICAgICAgICBtVW5kZXJydW5OcyA9IDA7CisgICAgICAgICAgICBtT3ZlcnJ1bk5zID0gMDsKKyAgICAgICAgICAgIG1Gb3JjZU5zID0gMDsKKyAgICAgICAgICAgIG1XYXJtdXBOc01pbiA9IDA7CisgICAgICAgICAgICBtV2FybXVwTnNNYXggPSBMT05HX01BWDsKICAgICAgICAgfQogICAgICAgICBtTWl4ZXJCdWZmZXJTdGF0ZSA9IFVOREVGSU5FRDsKICNpZiAhTE9HX05ERUJVRwogICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzOyArK2kpIHsKLSAgICAgICAgICAgIGZhc3RUcmFja05hbWVzW2ldID0gLTE7CisgICAgICAgICAgICBtRmFzdFRyYWNrTmFtZXNbaV0gPSAtMTsKICAgICAgICAgfQogI2VuZGlmCiAgICAgICAgIC8vIHdlIG5lZWQgdG8gcmVjb25maWd1cmUgYWxsIGFjdGl2ZSB0cmFja3MKICAgICAgICAgcHJldmlvdXNUcmFja01hc2sgPSAwOwotICAgICAgICBmYXN0VHJhY2tzR2VuID0gY3VycmVudC0+bUZhc3RUcmFja3NHZW4gLSAxOworICAgICAgICBtRmFzdFRyYWNrc0dlbiA9IGN1cnJlbnQtPm1GYXN0VHJhY2tzR2VuIC0gMTsKICAgICAgICAgZHVtcFN0YXRlLT5tRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcHJldmlvdXNUcmFja01hc2sgPSBwcmV2aW91cy0+bVRyYWNrTWFzazsKQEAgLTIxOSw3ICsyMjYsNyBAQAogICAgIC8vIGNoZWNrIGZvciBjaGFuZ2UgaW4gYWN0aXZlIHRyYWNrIHNldAogICAgIGNvbnN0IHVuc2lnbmVkIGN1cnJlbnRUcmFja01hc2sgPSBjdXJyZW50LT5tVHJhY2tNYXNrOwogICAgIGR1bXBTdGF0ZS0+bVRyYWNrTWFzayA9IGN1cnJlbnRUcmFja01hc2s7Ci0gICAgaWYgKGN1cnJlbnQtPm1GYXN0VHJhY2tzR2VuICE9IGZhc3RUcmFja3NHZW4pIHsKKyAgICBpZiAoY3VycmVudC0+bUZhc3RUcmFja3NHZW4gIT0gbUZhc3RUcmFja3NHZW4pIHsKICAgICAgICAgQUxPR19BU1NFUlQobU1peGVyQnVmZmVyICE9IE5VTEwpOwogICAgICAgICBpbnQgbmFtZTsKIApAQCAtMjMwLDE2ICsyMzcsMTYgQEAKICAgICAgICAgICAgIHJlbW92ZWRUcmFja3MgJj0gfigxIDw8IGkpOwogICAgICAgICAgICAgY29uc3QgRmFzdFRyYWNrKiBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaV07CiAgICAgICAgICAgICBBTE9HX0FTU0VSVChmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlciA9PSBOVUxMKTsKLSAgICAgICAgICAgIGlmIChtaXhlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbmFtZSA9IGZhc3RUcmFja05hbWVzW2ldOworICAgICAgICAgICAgaWYgKG1NaXhlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbmFtZSA9IG1GYXN0VHJhY2tOYW1lc1tpXTsKICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChuYW1lID49IDApOwotICAgICAgICAgICAgICAgIG1peGVyLT5kZWxldGVUcmFja05hbWUobmFtZSk7CisgICAgICAgICAgICAgICAgbU1peGVyLT5kZWxldGVUcmFja05hbWUobmFtZSk7CiAgICAgICAgICAgICB9CiAjaWYgIUxPR19OREVCVUcKLSAgICAgICAgICAgIGZhc3RUcmFja05hbWVzW2ldID0gLTE7CisgICAgICAgICAgICBtRmFzdFRyYWNrTmFtZXNbaV0gPSAtMTsKICNlbmRpZgogICAgICAgICAgICAgLy8gZG9uJ3QgcmVzZXQgdHJhY2sgZHVtcCBzdGF0ZSwgc2luY2Ugb3RoZXIgc2lkZSBpcyBpZ25vcmluZyBpdAotICAgICAgICAgICAgZ2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOworICAgICAgICAgICAgbUdlbmVyYXRpb25zW2ldID0gZmFzdFRyYWNrLT5tR2VuZXJhdGlvbjsKICAgICAgICAgfQogCiAgICAgICAgIC8vIG5vdyBwcm9jZXNzIGFkZGVkIHRyYWNrcwpAQCAtMjQ5LDI5ICsyNTYsMjkgQEAKICAgICAgICAgICAgIGFkZGVkVHJhY2tzICY9IH4oMSA8PCBpKTsKICAgICAgICAgICAgIGNvbnN0IEZhc3RUcmFjayogZmFzdFRyYWNrID0gJmN1cnJlbnQtPm1GYXN0VHJhY2tzW2ldOwogICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciAqYnVmZmVyUHJvdmlkZXIgPSBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlcjsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKGJ1ZmZlclByb3ZpZGVyICE9IE5VTEwgJiYgZmFzdFRyYWNrTmFtZXNbaV0gPT0gLTEpOwotICAgICAgICAgICAgaWYgKG1peGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gbWl4ZXItPmdldFRyYWNrTmFtZShmYXN0VHJhY2stPm1DaGFubmVsTWFzaywKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKGJ1ZmZlclByb3ZpZGVyICE9IE5VTEwgJiYgbUZhc3RUcmFja05hbWVzW2ldID09IC0xKTsKKyAgICAgICAgICAgIGlmIChtTWl4ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG5hbWUgPSBtTWl4ZXItPmdldFRyYWNrTmFtZShmYXN0VHJhY2stPm1DaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUZvcm1hdCwgQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKTsKICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChuYW1lID49IDApOwotICAgICAgICAgICAgICAgIGZhc3RUcmFja05hbWVzW2ldID0gbmFtZTsKLSAgICAgICAgICAgICAgICBtaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgYnVmZmVyUHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1BSU5fQlVGRkVSLAorICAgICAgICAgICAgICAgIG1GYXN0VHJhY2tOYW1lc1tpXSA9IG5hbWU7CisgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCBidWZmZXJQcm92aWRlcik7CisgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1BSU5fQlVGRkVSLAogICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTWl4ZXJCdWZmZXIpOwogICAgICAgICAgICAgICAgIC8vIG5ld2x5IGFsbG9jYXRlZCB0cmFjayBuYW1lcyBkZWZhdWx0IHRvIGZ1bGwgc2NhbGUgdm9sdW1lCi0gICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0ZPUk1BVCwgKHZvaWQgKiltTWl4ZXJCdWZmZXJGb3JtYXQpOwotICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkZPUk1BVCwKKyAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Rk9STUFULAogICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWZhc3RUcmFjay0+bUZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssCiAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1JWEVSX0NIQU5ORUxfTUFTSywKKyAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUlYRVJfQ0hBTk5FTF9NQVNLLAogICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KW1TaW5rQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgIG1peGVyLT5lbmFibGUobmFtZSk7CisgICAgICAgICAgICAgICAgbU1peGVyLT5lbmFibGUobmFtZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247CisgICAgICAgICAgICBtR2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOwogICAgICAgICB9CiAKICAgICAgICAgLy8gZmluYWxseSBwcm9jZXNzIChwb3RlbnRpYWxseSkgbW9kaWZpZWQgdHJhY2tzOyB0aGVzZSB1c2UgdGhlIHNhbWUgc2xvdApAQCAtMjgxLDM4ICsyODgsMzggQEAKICAgICAgICAgICAgIGludCBpID0gX19idWlsdGluX2N0eihtb2RpZmllZFRyYWNrcyk7CiAgICAgICAgICAgICBtb2RpZmllZFRyYWNrcyAmPSB+KDEgPDwgaSk7CiAgICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKLSAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1HZW5lcmF0aW9uICE9IGdlbmVyYXRpb25zW2ldKSB7CisgICAgICAgICAgICBpZiAoZmFzdFRyYWNrLT5tR2VuZXJhdGlvbiAhPSBtR2VuZXJhdGlvbnNbaV0pIHsKICAgICAgICAgICAgICAgICAvLyB0aGlzIHRyYWNrIHdhcyBhY3R1YWxseSBtb2RpZmllZAogICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIgKmJ1ZmZlclByb3ZpZGVyID0gZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXI7CiAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoYnVmZmVyUHJvdmlkZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1peGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGZhc3RUcmFja05hbWVzW2ldOworICAgICAgICAgICAgICAgIGlmIChtTWl4ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gbUZhc3RUcmFja05hbWVzW2ldOwogICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChuYW1lID49IDApOwotICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgYnVmZmVyUHJvdmlkZXIpOworICAgICAgICAgICAgICAgICAgICBtTWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIGJ1ZmZlclByb3ZpZGVyKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGYgPSBBdWRpb01peGVyOjpVTklUWV9HQUlOX0ZMT0FUOwotICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsICZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmZik7CisgICAgICAgICAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsICZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwgJmYpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6UkVTQU1QTEUsCisgICAgICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlJFTU9WRSwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULCAodm9pZCAqKW1NaXhlckJ1ZmZlckZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkZPUk1BVCwKKyAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkZPUk1BVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tRm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClmYXN0VHJhY2stPm1DaGFubmVsTWFzayk7Ci0gICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1JWEVSX0NIQU5ORUxfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1JWEVSX0NIQU5ORUxfTUFTSywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpbVNpbmtDaGFubmVsTWFzayk7CiAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgZW5hYmxlZAogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBnZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247CisgICAgICAgICAgICAgICAgbUdlbmVyYXRpb25zW2ldID0gZmFzdFRyYWNrLT5tR2VuZXJhdGlvbjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGZhc3RUcmFja3NHZW4gPSBjdXJyZW50LT5tRmFzdFRyYWNrc0dlbjsKKyAgICAgICAgbUZhc3RUcmFja3NHZW4gPSBjdXJyZW50LT5tRmFzdFRyYWNrc0dlbjsKIAogICAgICAgICBkdW1wU3RhdGUtPm1OdW1UcmFja3MgPSBwb3Bjb3VudChjdXJyZW50VHJhY2tNYXNrKTsKICAgICB9CkBAIC0zMjAsMTIgKzMyNywxMiBAQAogCiB2b2lkIEZhc3RNaXhlcjo6b25Xb3JrKCkKIHsKLSAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdE1peGVyU3RhdGUgKikgdGhpcy0+Y3VycmVudDsKLSAgICBGYXN0TWl4ZXJEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdE1peGVyRHVtcFN0YXRlICopIHRoaXMtPmR1bXBTdGF0ZTsKLSAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZTo6Q29tbWFuZCBjb21tYW5kID0gdGhpcy0+Y29tbWFuZDsKKyAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdE1peGVyU3RhdGUgKikgbUN1cnJlbnQ7CisgICAgRmFzdE1peGVyRHVtcFN0YXRlICogY29uc3QgZHVtcFN0YXRlID0gKEZhc3RNaXhlckR1bXBTdGF0ZSAqKSBtRHVtcFN0YXRlOworICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlOjpDb21tYW5kIGNvbW1hbmQgPSBtQ29tbWFuZDsKICAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IGN1cnJlbnQtPm1GcmFtZUNvdW50OwogCi0gICAgaWYgKChjb21tYW5kICYgRmFzdE1peGVyU3RhdGU6Ok1JWCkgJiYgKG1peGVyICE9IE5VTEwpICYmIGlzV2FybSkgeworICAgIGlmICgoY29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpNSVgpICYmIChtTWl4ZXIgIT0gTlVMTCkgJiYgbUlzV2FybSkgewogICAgICAgICBBTE9HX0FTU0VSVChtTWl4ZXJCdWZmZXIgIT0gTlVMTCk7CiAgICAgICAgIC8vIGZvciBlYWNoIHRyYWNrLCB1cGRhdGUgdm9sdW1lIGFuZCBjaGVjayBmb3IgdW5kZXJydW4KICAgICAgICAgdW5zaWduZWQgY3VycmVudFRyYWNrTWFzayA9IGN1cnJlbnQtPm1UcmFja01hc2s7CkBAIC0zMzUsOSArMzQyLDkgQEAKICAgICAgICAgICAgIGNvbnN0IEZhc3RUcmFjayogZmFzdFRyYWNrID0gJmN1cnJlbnQtPm1GYXN0VHJhY2tzW2ldOwogCiAgICAgICAgICAgICAvLyBSZWZyZXNoIHRoZSBwZXItdHJhY2sgdGltZXN0YW1wCi0gICAgICAgICAgICBpZiAodGltZXN0YW1wU3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBpZiAobVRpbWVzdGFtcFN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIHVpbnQzMl90IHRyYWNrRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCA9Ci0gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQ7CisgICAgICAgICAgICAgICAgICAgIG1OYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkOwogICAgICAgICAgICAgICAgIHVpbnQzMl90IHRyYWNrRnJhbWVzV3JpdHRlbiA9IGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyLT5mcmFtZXNSZWxlYXNlZCgpOwogICAgICAgICAgICAgICAgIC8vIENhbid0IHByb3ZpZGUgYW4gQXVkaW9UaW1lc3RhbXAgYmVmb3JlIGZpcnN0IGZyYW1lIHByZXNlbnRlZCwKICAgICAgICAgICAgICAgICAvLyBvciBkdXJpbmcgdGhlIGJyaWVmIDMyLWJpdCB3cmFwYXJvdW5kIHdpbmRvdwpAQCAtMzQ1LDIwICszNTIsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lc3RhbXAgcGVyVHJhY2tUaW1lc3RhbXA7CiAgICAgICAgICAgICAgICAgICAgIHBlclRyYWNrVGltZXN0YW1wLm1Qb3NpdGlvbiA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tGcmFtZXNXcml0dGVuIC0gdHJhY2tGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkOwotICAgICAgICAgICAgICAgICAgICBwZXJUcmFja1RpbWVzdGFtcC5tVGltZSA9IHRpbWVzdGFtcC5tVGltZTsKKyAgICAgICAgICAgICAgICAgICAgcGVyVHJhY2tUaW1lc3RhbXAubVRpbWUgPSBtVGltZXN0YW1wLm1UaW1lOwogICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlci0+b25UaW1lc3RhbXAocGVyVHJhY2tUaW1lc3RhbXApOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaW50IG5hbWUgPSBmYXN0VHJhY2tOYW1lc1tpXTsKKyAgICAgICAgICAgIGludCBuYW1lID0gbUZhc3RUcmFja05hbWVzW2ldOwogICAgICAgICAgICAgQUxPR19BU1NFUlQobmFtZSA+PSAwKTsKICAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1Wb2x1bWVQcm92aWRlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgdmxyID0gZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXItPmdldFZvbHVtZUxSKCk7CiAgICAgICAgICAgICAgICAgZmxvYXQgdmxmID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19sZWZ0KHZscikpOwogICAgICAgICAgICAgICAgIGZsb2F0IHZyZiA9IGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfcmlnaHQodmxyKSk7CiAKLSAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJnZsZik7Ci0gICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZ2cmYpOworICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJnZsZik7CisgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmdnJmKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIEZJWE1FIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIGZyYW1lc1JlYWR5KCkgZm9yIGZhc3QgdHJhY2tzCiAgICAgICAgICAgICAvLyB0YWtlcyBhIHRyeUxvY2ssIHdoaWNoIGNhbiBibG9jawpAQCAtMzc5LDQzICszODYsNDQgQEAKICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzUmVhZHkgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tRW1wdHkrKzsKICAgICAgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubU1vc3RSZWNlbnQgPSBVTkRFUlJVTl9FTVBUWTsKLSAgICAgICAgICAgICAgICAgICAgbWl4ZXItPmRpc2FibGUobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIG1NaXhlci0+ZGlzYWJsZShuYW1lKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBtaXhpbmcgcGFydGlhbCBidWZmZXIKICAgICAgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubVBhcnRpYWwrKzsKICAgICAgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubU1vc3RSZWNlbnQgPSBVTkRFUlJVTl9QQVJUSUFMOwotICAgICAgICAgICAgICAgICAgICBtaXhlci0+ZW5hYmxlKG5hbWUpOworICAgICAgICAgICAgICAgICAgICBtTWl4ZXItPmVuYWJsZShuYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1GdWxsKys7CiAgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubU1vc3RSZWNlbnQgPSBVTkRFUlJVTl9GVUxMOwotICAgICAgICAgICAgICAgIG1peGVyLT5lbmFibGUobmFtZSk7CisgICAgICAgICAgICAgICAgbU1peGVyLT5lbmFibGUobmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmdER1bXAtPm1VbmRlcnJ1bnMgPSB1bmRlcnJ1bnM7CiAgICAgICAgICAgICBmdER1bXAtPm1GcmFtZXNSZWFkeSA9IGZyYW1lc1JlYWR5OwogICAgICAgICB9CiAKICAgICAgICAgaW50NjRfdCBwdHM7Ci0gICAgICAgIGlmIChvdXRwdXRTaW5rID09IE5VTEwgfHwgKE9LICE9IG91dHB1dFNpbmstPmdldE5leHRXcml0ZVRpbWVzdGFtcCgmcHRzKSkpIHsKKyAgICAgICAgaWYgKG1PdXRwdXRTaW5rID09IE5VTEwgfHwgKE9LICE9IG1PdXRwdXRTaW5rLT5nZXROZXh0V3JpdGVUaW1lc3RhbXAoJnB0cykpKSB7CiAgICAgICAgICAgICBwdHMgPSBBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUzsKICAgICAgICAgfQogCiAgICAgICAgIC8vIHByb2Nlc3MoKSBpcyBDUFUtYm91bmQKLSAgICAgICAgbWl4ZXItPnByb2Nlc3MocHRzKTsKKyAgICAgICAgbU1peGVyLT5wcm9jZXNzKHB0cyk7CiAgICAgICAgIG1NaXhlckJ1ZmZlclN0YXRlID0gTUlYRUQ7CiAgICAgfSBlbHNlIGlmIChtTWl4ZXJCdWZmZXJTdGF0ZSA9PSBNSVhFRCkgewogICAgICAgICBtTWl4ZXJCdWZmZXJTdGF0ZSA9IFVOREVGSU5FRDsKICAgICB9CiAgICAgLy9ib29sIGRpZEZ1bGxXcml0ZSA9IGZhbHNlOyAgICAvLyBkdW1wc3lzIGNvdWxkIGRpc3BsYXkgYSBjb3VudCBvZiBwYXJ0aWFsIHdyaXRlcwotICAgIGlmICgoY29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpXUklURSkgJiYgKG91dHB1dFNpbmsgIT0gTlVMTCkgJiYgKG1NaXhlckJ1ZmZlciAhPSBOVUxMKSkgeworICAgIGlmICgoY29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpXUklURSkgJiYgKG1PdXRwdXRTaW5rICE9IE5VTEwpICYmIChtTWl4ZXJCdWZmZXIgIT0gTlVMTCkpIHsKICAgICAgICAgaWYgKG1NaXhlckJ1ZmZlclN0YXRlID09IFVOREVGSU5FRCkgewogICAgICAgICAgICAgbWVtc2V0KG1NaXhlckJ1ZmZlciwgMCwgbU1peGVyQnVmZmVyU2l6ZSk7CiAgICAgICAgICAgICBtTWl4ZXJCdWZmZXJTdGF0ZSA9IFpFUk9FRDsKICAgICAgICAgfQorICAgICAgICAvLyBwcmVwYXJlIHRoZSBidWZmZXIgdXNlZCB0byB3cml0ZSB0byBzaW5rCiAgICAgICAgIHZvaWQgKmJ1ZmZlciA9IG1TaW5rQnVmZmVyICE9IE5VTEwgPyBtU2lua0J1ZmZlciA6IG1NaXhlckJ1ZmZlcjsKLSAgICAgICAgaWYgKGZvcm1hdC5tRm9ybWF0ICE9IG1NaXhlckJ1ZmZlckZvcm1hdCkgeyAvLyBzaW5rIGZvcm1hdCBub3QgdGhlIHNhbWUgYXMgbWl4ZXIgZm9ybWF0Ci0gICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KGJ1ZmZlciwgZm9ybWF0Lm1Gb3JtYXQsIG1NaXhlckJ1ZmZlciwgbU1peGVyQnVmZmVyRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50ICogRm9ybWF0X2NoYW5uZWxDb3VudChmb3JtYXQpKTsKKyAgICAgICAgaWYgKG1Gb3JtYXQubUZvcm1hdCAhPSBtTWl4ZXJCdWZmZXJGb3JtYXQpIHsgLy8gc2luayBmb3JtYXQgbm90IHRoZSBzYW1lIGFzIG1peGVyIGZvcm1hdAorICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChidWZmZXIsIG1Gb3JtYXQubUZvcm1hdCwgbU1peGVyQnVmZmVyLCBtTWl4ZXJCdWZmZXJGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQgKiBGb3JtYXRfY2hhbm5lbENvdW50KG1Gb3JtYXQpKTsKICAgICAgICAgfQogICAgICAgICAvLyBpZiBub24tTlVMTCwgdGhlbiBkdXBsaWNhdGUgd3JpdGUoKSB0byB0aGlzIG5vbi1ibG9ja2luZyBzaW5rCiAgICAgICAgIE5CQUlPX1NpbmsqIHRlZVNpbms7CkBAIC00MjYsMjUyICs0MzQsMzQgQEAKICAgICAgICAgLy8gICAgICAgYnV0IHRoaXMgY29kZSBzaG91bGQgYmUgbW9kaWZpZWQgdG8gaGFuZGxlIGJvdGggbm9uLWJsb2NraW5nIGFuZCBibG9ja2luZyBzaW5rcwogICAgICAgICBkdW1wU3RhdGUtPm1Xcml0ZVNlcXVlbmNlKys7CiAgICAgICAgIEFUUkFDRV9CRUdJTigid3JpdGUiKTsKLSAgICAgICAgc3NpemVfdCBmcmFtZXNXcml0dGVuID0gb3V0cHV0U2luay0+d3JpdGUoYnVmZmVyLCBmcmFtZUNvdW50KTsKKyAgICAgICAgc3NpemVfdCBmcmFtZXNXcml0dGVuID0gbU91dHB1dFNpbmstPndyaXRlKGJ1ZmZlciwgZnJhbWVDb3VudCk7CiAgICAgICAgIEFUUkFDRV9FTkQoKTsKICAgICAgICAgZHVtcFN0YXRlLT5tV3JpdGVTZXF1ZW5jZSsrOwogICAgICAgICBpZiAoZnJhbWVzV3JpdHRlbiA+PSAwKSB7CiAgICAgICAgICAgICBBTE9HX0FTU0VSVCgoc2l6ZV90KSBmcmFtZXNXcml0dGVuIDw9IGZyYW1lQ291bnQpOwotICAgICAgICAgICAgdG90YWxOYXRpdmVGcmFtZXNXcml0dGVuICs9IGZyYW1lc1dyaXR0ZW47Ci0gICAgICAgICAgICBkdW1wU3RhdGUtPm1GcmFtZXNXcml0dGVuID0gdG90YWxOYXRpdmVGcmFtZXNXcml0dGVuOworICAgICAgICAgICAgbVRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbiArPSBmcmFtZXNXcml0dGVuOworICAgICAgICAgICAgZHVtcFN0YXRlLT5tRnJhbWVzV3JpdHRlbiA9IG1Ub3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW47CiAgICAgICAgICAgICAvL2lmICgoc2l6ZV90KSBmcmFtZXNXcml0dGVuID09IGZyYW1lQ291bnQpIHsKICAgICAgICAgICAgIC8vICAgIGRpZEZ1bGxXcml0ZSA9IHRydWU7CiAgICAgICAgICAgICAvL30KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVdyaXRlRXJyb3JzKys7CiAgICAgICAgIH0KLSAgICAgICAgYXR0ZW1wdGVkV3JpdGUgPSB0cnVlOworICAgICAgICBtQXR0ZW1wdGVkV3JpdGUgPSB0cnVlOwogICAgICAgICAvLyBGSVhNRSBjb3VudCAjIG9mIHdyaXRlcyBibG9ja2VkIGV4Y2Vzc2l2ZWx5LCBDUFUgdXNhZ2UsIGV0Yy4gZm9yIGR1bXAKIAotICAgICAgICB0aW1lc3RhbXBTdGF0dXMgPSBvdXRwdXRTaW5rLT5nZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKLSAgICAgICAgaWYgKHRpbWVzdGFtcFN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgdWludDMyX3QgdG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQgPSB0aW1lc3RhbXAubVBvc2l0aW9uOwotICAgICAgICAgICAgaWYgKHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkIDw9IHRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbikgewotICAgICAgICAgICAgICAgIG5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPQotICAgICAgICAgICAgICAgICAgICB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4gLSB0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZDsKKyAgICAgICAgbVRpbWVzdGFtcFN0YXR1cyA9IG1PdXRwdXRTaW5rLT5nZXRUaW1lc3RhbXAobVRpbWVzdGFtcCk7CisgICAgICAgIGlmIChtVGltZXN0YW1wU3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICB1aW50MzJfdCB0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZCA9IG1UaW1lc3RhbXAubVBvc2l0aW9uOworICAgICAgICAgICAgaWYgKHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkIDw9IG1Ub3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4pIHsKKyAgICAgICAgICAgICAgICBtTmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCA9CisgICAgICAgICAgICAgICAgICAgIG1Ub3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4gLSB0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gSEFMIHJlcG9ydGVkIHRoYXQgbW9yZSBmcmFtZXMgd2VyZSBwcmVzZW50ZWQgdGhhbiB3ZXJlIHdyaXR0ZW4KLSAgICAgICAgICAgICAgICB0aW1lc3RhbXBTdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wU3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKLUZhc3RNaXhlckR1bXBTdGF0ZTo6RmFzdE1peGVyRHVtcFN0YXRlKAotI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwotICAgICAgICB1aW50MzJfdCBzYW1wbGluZ04KLSNlbmRpZgotICAgICAgICApIDogRmFzdFRocmVhZER1bXBTdGF0ZSgpLAotICAgIG1Xcml0ZVNlcXVlbmNlKDApLCBtRnJhbWVzV3JpdHRlbigwKSwKLSAgICBtTnVtVHJhY2tzKDApLCBtV3JpdGVFcnJvcnMoMCksCi0gICAgbVNhbXBsZVJhdGUoMCksIG1GcmFtZUNvdW50KDApLAotICAgIG1UcmFja01hc2soMCkKLXsKLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICBpbmNyZWFzZVNhbXBsaW5nTihzYW1wbGluZ04pOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLXZvaWQgRmFzdE1peGVyRHVtcFN0YXRlOjppbmNyZWFzZVNhbXBsaW5nTih1aW50MzJfdCBzYW1wbGluZ04pCi17Ci0gICAgaWYgKHNhbXBsaW5nTiA8PSBtU2FtcGxpbmdOIHx8IHNhbXBsaW5nTiA+IGtTYW1wbGluZ04gfHwgcm91bmR1cChzYW1wbGluZ04pICE9IHNhbXBsaW5nTikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHVpbnQzMl90IGFkZGl0aW9uYWwgPSBzYW1wbGluZ04gLSBtU2FtcGxpbmdOOwotICAgIC8vIHNhbXBsZSBhcnJheXMgYXJlbid0IGFjY2Vzc2VkIGF0b21pY2FsbHkgd2l0aCByZXNwZWN0IHRvIHRoZSBib3VuZHMsCi0gICAgLy8gc28gY2xlYXJpbmcgcmVkdWNlcyBjaGFuY2UgZm9yIGR1bXBzeXMgdG8gcmVhZCByYW5kb20gdW5pbml0aWFsaXplZCBzYW1wbGVzCi0gICAgbWVtc2V0KCZtTW9ub3RvbmljTnNbbVNhbXBsaW5nTl0sIDAsIHNpemVvZihtTW9ub3RvbmljTnNbMF0pICogYWRkaXRpb25hbCk7Ci0gICAgbWVtc2V0KCZtTG9hZE5zW21TYW1wbGluZ05dLCAwLCBzaXplb2YobUxvYWROc1swXSkgKiBhZGRpdGlvbmFsKTsKLSNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKLSAgICBtZW1zZXQoJm1DcHVrSHpbbVNhbXBsaW5nTl0sIDAsIHNpemVvZihtQ3B1a0h6WzBdKSAqIGFkZGl0aW9uYWwpOwotI2VuZGlmCi0gICAgbVNhbXBsaW5nTiA9IHNhbXBsaW5nTjsKLX0KLSNlbmRpZgotCi1GYXN0TWl4ZXJEdW1wU3RhdGU6On5GYXN0TWl4ZXJEdW1wU3RhdGUoKQotewotfQotCi0vLyBoZWxwZXIgZnVuY3Rpb24gY2FsbGVkIGJ5IHFzb3J0KCkKLXN0YXRpYyBpbnQgY29tcGFyZV91aW50MzJfdChjb25zdCB2b2lkICpwYSwgY29uc3Qgdm9pZCAqcGIpCi17Ci0gICAgdWludDMyX3QgYSA9ICooY29uc3QgdWludDMyX3QgKilwYTsKLSAgICB1aW50MzJfdCBiID0gKihjb25zdCB1aW50MzJfdCAqKXBiOwotICAgIGlmIChhIDwgYikgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmIChhID4gYikgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLXZvaWQgRmFzdE1peGVyRHVtcFN0YXRlOjpkdW1wKGludCBmZCkgY29uc3QKLXsKLSAgICBpZiAobUNvbW1hbmQgPT0gRmFzdE1peGVyU3RhdGU6OklOSVRJQUwpIHsKLSAgICAgICAgZHByaW50ZihmZCwgIiAgRmFzdE1peGVyIG5vdCBpbml0aWFsaXplZFxuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jZGVmaW5lIENPTU1BTkRfTUFYIDMyCi0gICAgY2hhciBzdHJpbmdbQ09NTUFORF9NQVhdOwotICAgIHN3aXRjaCAobUNvbW1hbmQpIHsKLSAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpJTklUSUFMOgotICAgICAgICBzdHJjcHkoc3RyaW5nLCAiSU5JVElBTCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpIT1RfSURMRToKLSAgICAgICAgc3RyY3B5KHN0cmluZywgIkhPVF9JRExFIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6OkNPTERfSURMRToKLSAgICAgICAgc3RyY3B5KHN0cmluZywgIkNPTERfSURMRSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpFWElUOgotICAgICAgICBzdHJjcHkoc3RyaW5nLCAiRVhJVCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpNSVg6Ci0gICAgICAgIHN0cmNweShzdHJpbmcsICJNSVgiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGYXN0TWl4ZXJTdGF0ZTo6V1JJVEU6Ci0gICAgICAgIHN0cmNweShzdHJpbmcsICJXUklURSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpNSVhfV1JJVEU6Ci0gICAgICAgIHN0cmNweShzdHJpbmcsICJNSVhfV1JJVEUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgc25wcmludGYoc3RyaW5nLCBDT01NQU5EX01BWCwgIiVkIiwgbUNvbW1hbmQpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgZG91YmxlIG1lYXN1cmVkV2FybXVwTXMgPSAobU1lYXN1cmVkV2FybXVwVHMudHZfc2VjICogMTAwMC4wKSArCi0gICAgICAgICAgICAobU1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyAvIDEwMDAwMDAuMCk7Ci0gICAgZG91YmxlIG1peFBlcmlvZFNlYyA9IChkb3VibGUpIG1GcmFtZUNvdW50IC8gKGRvdWJsZSkgbVNhbXBsZVJhdGU7Ci0gICAgZHByaW50ZihmZCwgIiAgRmFzdE1peGVyIGNvbW1hbmQ9JXMgd3JpdGVTZXF1ZW5jZT0ldSBmcmFtZXNXcml0dGVuPSV1XG4iCi0gICAgICAgICAgICAgICAgIiAgICAgICAgICAgIG51bVRyYWNrcz0ldSB3cml0ZUVycm9ycz0ldSB1bmRlcnJ1bnM9JXUgb3ZlcnJ1bnM9JXVcbiIKLSAgICAgICAgICAgICAgICAiICAgICAgICAgICAgc2FtcGxlUmF0ZT0ldSBmcmFtZUNvdW50PSV6dSBtZWFzdXJlZFdhcm11cD0lLjNnIG1zLCB3YXJtdXBDeWNsZXM9JXVcbiIKLSAgICAgICAgICAgICAgICAiICAgICAgICAgICAgbWl4UGVyaW9kPSUuMmYgbXNcbiIsCi0gICAgICAgICAgICAgICAgIHN0cmluZywgbVdyaXRlU2VxdWVuY2UsIG1GcmFtZXNXcml0dGVuLAotICAgICAgICAgICAgICAgICBtTnVtVHJhY2tzLCBtV3JpdGVFcnJvcnMsIG1VbmRlcnJ1bnMsIG1PdmVycnVucywKLSAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1GcmFtZUNvdW50LCBtZWFzdXJlZFdhcm11cE1zLCBtV2FybXVwQ3ljbGVzLAotICAgICAgICAgICAgICAgICBtaXhQZXJpb2RTZWMgKiAxZTMpOwotI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwotICAgIC8vIGZpbmQgdGhlIGludGVydmFsIG9mIHZhbGlkIHNhbXBsZXMKLSAgICB1aW50MzJfdCBib3VuZHMgPSBtQm91bmRzOwotICAgIHVpbnQzMl90IG5ld2VzdE9wZW4gPSBib3VuZHMgJiAweEZGRkY7Ci0gICAgdWludDMyX3Qgb2xkZXN0Q2xvc2VkID0gYm91bmRzID4+IDE2OwotICAgIHVpbnQzMl90IG4gPSAobmV3ZXN0T3BlbiAtIG9sZGVzdENsb3NlZCkgJiAweEZGRkY7Ci0gICAgaWYgKG4gPiBtU2FtcGxpbmdOKSB7Ci0gICAgICAgIEFMT0dFKCJ0b28gbWFueSBzYW1wbGVzICV1Iiwgbik7Ci0gICAgICAgIG4gPSBtU2FtcGxpbmdOOwotICAgIH0KLSAgICAvLyBzdGF0aXN0aWNzIGZvciBtb25vdG9uaWMgKHdhbGwgY2xvY2spIHRpbWUsIHRocmVhZCByYXcgQ1BVIGxvYWQgaW4gdGltZSwgQ1BVIGNsb2NrIGZyZXF1ZW5jeSwKLSAgICAvLyBhbmQgYWRqdXN0ZWQgQ1BVIGxvYWQgaW4gTUh6IG5vcm1hbGl6ZWQgZm9yIENQVSBjbG9jayBmcmVxdWVuY3kKLSAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIHdhbGwsIGxvYWROczsKLSNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKLSAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIGtIeiwgbG9hZE1IejsKLSAgICB1aW50MzJfdCBwcmV2aW91c0NwdWtIeiA9IDA7Ci0jZW5kaWYKLSAgICAvLyBBc3N1bWluZyBhIG5vcm1hbCBkaXN0cmlidXRpb24gZm9yIGN5Y2xlIHRpbWVzLCB0aHJlZSBzdGFuZGFyZCBkZXZpYXRpb25zIG9uIGVpdGhlciBzaWRlIG9mCi0gICAgLy8gdGhlIG1lYW4gYWNjb3VudCBmb3IgOTkuNzMlIG9mIHRoZSBwb3B1bGF0aW9uLiAgU28gaWYgd2UgdGFrZSBlYWNoIHRhaWwgdG8gYmUgMS8xMDAwIG9mIHRoZQotICAgIC8vIHNhbXBsZSBzZXQsIHdlIGdldCA5OS44JSBjb21iaW5lZCwgb3IgY2xvc2UgdG8gdGhyZWUgc3RhbmRhcmQgZGV2aWF0aW9ucy4KLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1RhaWxEZW5vbWluYXRvciA9IDEwMDA7Ci0gICAgdWludDMyX3QgKnRhaWwgPSBuID49IGtUYWlsRGVub21pbmF0b3IgPyBuZXcgdWludDMyX3Rbbl0gOiBOVUxMOwotICAgIC8vIGxvb3Agb3ZlciBhbGwgdGhlIHNhbXBsZXMKLSAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgbjsgKytqKSB7Ci0gICAgICAgIHNpemVfdCBpID0gb2xkZXN0Q2xvc2VkKysgJiAobVNhbXBsaW5nTiAtIDEpOwotICAgICAgICB1aW50MzJfdCB3YWxsTnMgPSBtTW9ub3RvbmljTnNbaV07Ci0gICAgICAgIGlmICh0YWlsICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHRhaWxbal0gPSB3YWxsTnM7Ci0gICAgICAgIH0KLSAgICAgICAgd2FsbC5zYW1wbGUod2FsbE5zKTsKLSAgICAgICAgdWludDMyX3Qgc2FtcGxlTG9hZE5zID0gbUxvYWROc1tpXTsKLSAgICAgICAgbG9hZE5zLnNhbXBsZShzYW1wbGVMb2FkTnMpOwotI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwotICAgICAgICB1aW50MzJfdCBzYW1wbGVDcHVrSHogPSBtQ3B1a0h6W2ldOwotICAgICAgICAvLyBza2lwIGJhZCBrSHogc2FtcGxlcwotICAgICAgICBpZiAoKHNhbXBsZUNwdWtIeiAmIH4weEYpICE9IDApIHsKLSAgICAgICAgICAgIGtIei5zYW1wbGUoc2FtcGxlQ3B1a0h6ID4+IDQpOwotICAgICAgICAgICAgaWYgKHNhbXBsZUNwdWtIeiA9PSBwcmV2aW91c0NwdWtIeikgewotICAgICAgICAgICAgICAgIGRvdWJsZSBtZWdhY3ljbGVzID0gKGRvdWJsZSkgc2FtcGxlTG9hZE5zICogKGRvdWJsZSkgKHNhbXBsZUNwdWtIeiA+PiA0KSAqIDFlLTEyOwotICAgICAgICAgICAgICAgIGRvdWJsZSBhZGpNSHogPSBtZWdhY3ljbGVzIC8gbWl4UGVyaW9kU2VjOyAgLy8gX25vdF8gd2FsbE5zICogMWU5Ci0gICAgICAgICAgICAgICAgbG9hZE1Iei5zYW1wbGUoYWRqTUh6KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcmV2aW91c0NwdWtIeiA9IHNhbXBsZUNwdWtIejsKLSNlbmRpZgotICAgIH0KLSAgICBpZiAobikgewotICAgICAgICBkcHJpbnRmKGZkLCAiICBTaW1wbGUgbW92aW5nIHN0YXRpc3RpY3Mgb3ZlciBsYXN0ICUuMWYgc2Vjb25kczpcbiIsCi0gICAgICAgICAgICAgICAgICAgIHdhbGwubigpICogbWl4UGVyaW9kU2VjKTsKLSAgICAgICAgZHByaW50ZihmZCwgIiAgICB3YWxsIGNsb2NrIHRpbWUgaW4gbXMgcGVyIG1peCBjeWNsZTpcbiIKLSAgICAgICAgICAgICAgICAgICAgIiAgICAgIG1lYW49JS4yZiBtaW49JS4yZiBtYXg9JS4yZiBzdGRkZXY9JS4yZlxuIiwKLSAgICAgICAgICAgICAgICAgICAgd2FsbC5tZWFuKCkqMWUtNiwgd2FsbC5taW5pbXVtKCkqMWUtNiwgd2FsbC5tYXhpbXVtKCkqMWUtNiwKLSAgICAgICAgICAgICAgICAgICAgd2FsbC5zdGRkZXYoKSoxZS02KTsKLSAgICAgICAgZHByaW50ZihmZCwgIiAgICByYXcgQ1BVIGxvYWQgaW4gdXMgcGVyIG1peCBjeWNsZTpcbiIKLSAgICAgICAgICAgICAgICAgICAgIiAgICAgIG1lYW49JS4wZiBtaW49JS4wZiBtYXg9JS4wZiBzdGRkZXY9JS4wZlxuIiwKLSAgICAgICAgICAgICAgICAgICAgbG9hZE5zLm1lYW4oKSoxZS0zLCBsb2FkTnMubWluaW11bSgpKjFlLTMsIGxvYWROcy5tYXhpbXVtKCkqMWUtMywKLSAgICAgICAgICAgICAgICAgICAgbG9hZE5zLnN0ZGRldigpKjFlLTMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRwcmludGYoZmQsICIgIE5vIEZhc3RNaXhlciBzdGF0aXN0aWNzIGF2YWlsYWJsZSBjdXJyZW50bHlcbiIpOwotICAgIH0KLSNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKLSAgICBkcHJpbnRmKGZkLCAiICBDUFUgY2xvY2sgZnJlcXVlbmN5IGluIE1IejpcbiIKLSAgICAgICAgICAgICAgICAiICAgIG1lYW49JS4wZiBtaW49JS4wZiBtYXg9JS4wZiBzdGRkZXY9JS4wZlxuIiwKLSAgICAgICAgICAgICAgICBrSHoubWVhbigpKjFlLTMsIGtIei5taW5pbXVtKCkqMWUtMywga0h6Lm1heGltdW0oKSoxZS0zLCBrSHouc3RkZGV2KCkqMWUtMyk7Ci0gICAgZHByaW50ZihmZCwgIiAgYWRqdXN0ZWQgQ1BVIGxvYWQgaW4gTUh6IChpLmUuIG5vcm1hbGl6ZWQgZm9yIENQVSBjbG9jayBmcmVxdWVuY3kpOlxuIgotICAgICAgICAgICAgICAgICIgICAgbWVhbj0lLjFmIG1pbj0lLjFmIG1heD0lLjFmIHN0ZGRldj0lLjFmXG4iLAotICAgICAgICAgICAgICAgIGxvYWRNSHoubWVhbigpLCBsb2FkTUh6Lm1pbmltdW0oKSwgbG9hZE1Iei5tYXhpbXVtKCksIGxvYWRNSHouc3RkZGV2KCkpOwotI2VuZGlmCi0gICAgaWYgKHRhaWwgIT0gTlVMTCkgewotICAgICAgICBxc29ydCh0YWlsLCBuLCBzaXplb2YodWludDMyX3QpLCBjb21wYXJlX3VpbnQzMl90KTsKLSAgICAgICAgLy8gYXNzdW1lIHNhbWUgbnVtYmVyIG9mIHRhaWwgc2FtcGxlcyBvbiBlYWNoIHNpZGUsIGxlZnQgYW5kIHJpZ2h0Ci0gICAgICAgIHVpbnQzMl90IGNvdW50ID0gbiAvIGtUYWlsRGVub21pbmF0b3I7Ci0gICAgICAgIENlbnRyYWxUZW5kZW5jeVN0YXRpc3RpY3MgbGVmdCwgcmlnaHQ7Ci0gICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICAgICAgICBsZWZ0LnNhbXBsZSh0YWlsW2ldKTsKLSAgICAgICAgICAgIHJpZ2h0LnNhbXBsZSh0YWlsW24gLSAoaSArIDEpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZHByaW50ZihmZCwgIiAgRGlzdHJpYnV0aW9uIG9mIG1peCBjeWNsZSB0aW1lcyBpbiBtcyBmb3IgdGhlIHRhaWxzICg+IH4zIHN0ZGRldiBvdXRsaWVycyk6XG4iCi0gICAgICAgICAgICAgICAgICAgICIgICAgbGVmdCB0YWlsOiBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIKLSAgICAgICAgICAgICAgICAgICAgIiAgICByaWdodCB0YWlsOiBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIsCi0gICAgICAgICAgICAgICAgICAgIGxlZnQubWVhbigpKjFlLTYsIGxlZnQubWluaW11bSgpKjFlLTYsIGxlZnQubWF4aW11bSgpKjFlLTYsIGxlZnQuc3RkZGV2KCkqMWUtNiwKLSAgICAgICAgICAgICAgICAgICAgcmlnaHQubWVhbigpKjFlLTYsIHJpZ2h0Lm1pbmltdW0oKSoxZS02LCByaWdodC5tYXhpbXVtKCkqMWUtNiwKLSAgICAgICAgICAgICAgICAgICAgcmlnaHQuc3RkZGV2KCkqMWUtNik7Ci0gICAgICAgIGRlbGV0ZVtdIHRhaWw7Ci0gICAgfQotI2VuZGlmCi0gICAgLy8gVGhlIGFjdGl2ZSB0cmFjayBtYXNrIGFuZCB0cmFjayBzdGF0ZXMgYXJlIHVwZGF0ZWQgbm9uLWF0b21pY2FsbHkuCi0gICAgLy8gU28gaWYgd2UgcmVsaWVkIG9uIGlzQWN0aXZlIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGRpc3BsYXksCi0gICAgLy8gdGhlbiB3ZSBtaWdodCBkaXNwbGF5IGFuIG9ic29sZXRlIHRyYWNrIG9yIG9taXQgYW4gYWN0aXZlIHRyYWNrLgotICAgIC8vIEluc3RlYWQgd2UgYWx3YXlzIGRpc3BsYXkgYWxsIHRyYWNrcywgd2l0aCBhbiBpbmRpY2F0aW9uCi0gICAgLy8gb2Ygd2hldGhlciB3ZSB0aGluayB0aGUgdHJhY2sgaXMgYWN0aXZlLgotICAgIHVpbnQzMl90IHRyYWNrTWFzayA9IG1UcmFja01hc2s7Ci0gICAgZHByaW50ZihmZCwgIiAgRmFzdCB0cmFja3M6IGtNYXhGYXN0VHJhY2tzPSV1IGFjdGl2ZU1hc2s9JSN4XG4iLAotICAgICAgICAgICAgRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzLCB0cmFja01hc2spOwotICAgIGRwcmludGYoZmQsICIgIEluZGV4IEFjdGl2ZSBGdWxsIFBhcnRpYWwgRW1wdHkgIFJlY2VudCBSZWFkeVxuIik7Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IEZhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrczsgKytpLCB0cmFja01hc2sgPj49IDEpIHsKLSAgICAgICAgYm9vbCBpc0FjdGl2ZSA9IHRyYWNrTWFzayAmIDE7Ci0gICAgICAgIGNvbnN0IEZhc3RUcmFja0R1bXAgKmZ0RHVtcCA9ICZtVHJhY2tzW2ldOwotICAgICAgICBjb25zdCBGYXN0VHJhY2tVbmRlcnJ1bnMmIHVuZGVycnVucyA9IGZ0RHVtcC0+bVVuZGVycnVuczsKLSAgICAgICAgY29uc3QgY2hhciAqbW9zdFJlY2VudDsKLSAgICAgICAgc3dpdGNoICh1bmRlcnJ1bnMubUJpdEZpZWxkcy5tTW9zdFJlY2VudCkgewotICAgICAgICBjYXNlIFVOREVSUlVOX0ZVTEw6Ci0gICAgICAgICAgICBtb3N0UmVjZW50ID0gImZ1bGwiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVU5ERVJSVU5fUEFSVElBTDoKLSAgICAgICAgICAgIG1vc3RSZWNlbnQgPSAicGFydGlhbCI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBVTkRFUlJVTl9FTVBUWToKLSAgICAgICAgICAgIG1vc3RSZWNlbnQgPSAiZW1wdHkiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBtb3N0UmVjZW50ID0gIj8iOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZHByaW50ZihmZCwgIiAgJTV1ICU2cyAlNHUgJTd1ICU1dSAlN3MgJTV6dVxuIiwgaSwgaXNBY3RpdmUgPyAieWVzIiA6ICJubyIsCi0gICAgICAgICAgICAgICAgKHVuZGVycnVucy5tQml0RmllbGRzLm1GdWxsKSAmIFVOREVSUlVOX01BU0ssCi0gICAgICAgICAgICAgICAgKHVuZGVycnVucy5tQml0RmllbGRzLm1QYXJ0aWFsKSAmIFVOREVSUlVOX01BU0ssCi0gICAgICAgICAgICAgICAgKHVuZGVycnVucy5tQml0RmllbGRzLm1FbXB0eSkgJiBVTkRFUlJVTl9NQVNLLAotICAgICAgICAgICAgICAgIG1vc3RSZWNlbnQsIGZ0RHVtcC0+bUZyYW1lc1JlYWR5KTsKLSAgICB9Ci19Ci0KIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5oCmluZGV4IGZkZThjMmIuLjA2YTY4ZmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmgKQEAgLTE3LDExICsxNyw3IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9ICiAKLSNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgotI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KICNpbmNsdWRlICJGYXN0VGhyZWFkLmgiCi0jaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+CiAjaW5jbHVkZSAiU3RhdGVRdWV1ZS5oIgogI2luY2x1ZGUgIkZhc3RNaXhlclN0YXRlLmgiCiAjaW5jbHVkZSAiRmFzdE1peGVyRHVtcFN0YXRlLmgiCkBAIC01MiwzNiArNDgsMzkgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25TdGF0ZUNoYW5nZSgpOwogICAgIHZpcnR1YWwgdm9pZCBvbldvcmsoKTsKIAotICAgIC8vIEZJWE1FIHRoZXNlIGZvcm1lciBsb2NhbCB2YXJpYWJsZXMgbmVlZCBjb21tZW50cyBhbmQgdG8gYmUgcmVuYW1lZCB0byBoYXZlICJtIiBwcmVmaXgKLSAgICBzdGF0aWMgY29uc3QgRmFzdE1peGVyU3RhdGUgaW5pdGlhbDsKLSAgICBGYXN0TWl4ZXJTdGF0ZSBwcmVJZGxlOyAvLyBjb3B5IG9mIHN0YXRlIGJlZm9yZSB3ZSB3ZW50IGludG8gaWRsZQotICAgIGxvbmcgc2xvcE5zOyAgICAgICAgLy8gYWNjdW11bGF0ZWQgdGltZSB3ZSd2ZSB3b2tlbiB1cCB0b28gZWFybHkgKD4gMCkgb3IgdG9vIGxhdGUgKDwgMCkKLSAgICBpbnQgZmFzdFRyYWNrTmFtZXNbRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzXTsgLy8gaGFuZGxlcyB1c2VkIGJ5IG1peGVyIHRvIGlkZW50aWZ5IHRyYWNrcwotICAgIGludCBnZW5lcmF0aW9uc1tGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3NdOyAgICAvLyBsYXN0IG9ic2VydmVkIG1GYXN0VHJhY2tzW2ldLm1HZW5lcmF0aW9uCi0gICAgTkJBSU9fU2luayAqb3V0cHV0U2luazsKLSAgICBpbnQgb3V0cHV0U2lua0dlbjsKLSAgICBBdWRpb01peGVyKiBtaXhlcjsKKyAgICAvLyBGSVhNRSB0aGVzZSBmb3JtZXIgbG9jYWwgdmFyaWFibGVzIG5lZWQgY29tbWVudHMKKyAgICBzdGF0aWMgY29uc3QgRmFzdE1peGVyU3RhdGUgc0luaXRpYWw7CisKKyAgICBGYXN0TWl4ZXJTdGF0ZSAgbVByZUlkbGU7ICAgLy8gY29weSBvZiBzdGF0ZSBiZWZvcmUgd2Ugd2VudCBpbnRvIGlkbGUKKyAgICBsb25nICAgICAgICAgICAgbVNsb3BOczsgICAgLy8gYWNjdW11bGF0ZWQgdGltZSB3ZSd2ZSB3b2tlbiB1cCB0b28gZWFybHkgKD4gMCkgb3IgdG9vIGxhdGUgKDwgMCkKKyAgICBpbnQgICAgICAgICAgICAgbUZhc3RUcmFja05hbWVzW0Zhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrc107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXMgdXNlZCBieSBtaXhlciB0byBpZGVudGlmeSB0cmFja3MKKyAgICBpbnQgICAgICAgICAgICAgbUdlbmVyYXRpb25zW0Zhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrc107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhc3Qgb2JzZXJ2ZWQgbUZhc3RUcmFja3NbaV0ubUdlbmVyYXRpb24KKyAgICBOQkFJT19TaW5rKiAgICAgbU91dHB1dFNpbms7CisgICAgaW50ICAgICAgICAgICAgIG1PdXRwdXRTaW5rR2VuOworICAgIEF1ZGlvTWl4ZXIqICAgICBtTWl4ZXI7CiAKICAgICAvLyBtU2lua0J1ZmZlciBhdWRpbyBmb3JtYXQgaXMgc3RvcmVkIGluIGZvcm1hdC5tRm9ybWF0LgotICAgIHZvaWQqIG1TaW5rQnVmZmVyOyAgICAgICAgICAgICAgICAgIC8vIHVzZWQgZm9yIG1peGVyIG91dHB1dCBmb3JtYXQgdHJhbnNsYXRpb24KKyAgICB2b2lkKiAgICAgICAgICAgbVNpbmtCdWZmZXI7ICAgICAgICAvLyB1c2VkIGZvciBtaXhlciBvdXRwdXQgZm9ybWF0IHRyYW5zbGF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgc2luayBmb3JtYXQgaXMgZGlmZmVyZW50IHRoYW4gbWl4ZXIgb3V0cHV0LgotICAgIHNpemVfdCBtU2lua0J1ZmZlclNpemU7Ci0gICAgdWludDMyX3QgbVNpbmtDaGFubmVsQ291bnQ7CisgICAgc2l6ZV90ICAgICAgICAgIG1TaW5rQnVmZmVyU2l6ZTsKKyAgICB1aW50MzJfdCAgICAgICAgbVNpbmtDaGFubmVsQ291bnQ7CiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbVNpbmtDaGFubmVsTWFzazsKLSAgICB2b2lkKiBtTWl4ZXJCdWZmZXI7ICAgICAgICAgICAgICAgICAvLyBtaXhlciBvdXRwdXQgYnVmZmVyLgotICAgIHNpemVfdCBtTWl4ZXJCdWZmZXJTaXplOwotICAgIGF1ZGlvX2Zvcm1hdF90IG1NaXhlckJ1ZmZlckZvcm1hdDsgIC8vIG1peGVyIG91dHB1dCBmb3JtYXQ6IEFVRElPX0ZPUk1BVF9QQ01fKDE2X0JJVHxGTE9BVCkuCisgICAgdm9pZCogICAgICAgICAgIG1NaXhlckJ1ZmZlcjsgICAgICAgLy8gbWl4ZXIgb3V0cHV0IGJ1ZmZlci4KKyAgICBzaXplX3QgICAgICAgICAgbU1peGVyQnVmZmVyU2l6ZTsKKyAgICBhdWRpb19mb3JtYXRfdCAgbU1peGVyQnVmZmVyRm9ybWF0OyAvLyBtaXhlciBvdXRwdXQgZm9ybWF0OiBBVURJT19GT1JNQVRfUENNXygxNl9CSVR8RkxPQVQpLgogCiAgICAgZW51bSB7VU5ERUZJTkVELCBNSVhFRCwgWkVST0VEfSBtTWl4ZXJCdWZmZXJTdGF0ZTsKLSAgICBOQkFJT19Gb3JtYXQgZm9ybWF0OwotICAgIHVuc2lnbmVkIHNhbXBsZVJhdGU7Ci0gICAgaW50IGZhc3RUcmFja3NHZW47Ci0gICAgRmFzdE1peGVyRHVtcFN0YXRlIGR1bW15RHVtcFN0YXRlOwotICAgIHVpbnQzMl90IHRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbjsgIC8vIGNvcGllZCB0byBkdW1wU3RhdGUtPm1GcmFtZXNXcml0dGVuCisgICAgTkJBSU9fRm9ybWF0ICAgIG1Gb3JtYXQ7CisgICAgdW5zaWduZWQgICAgICAgIG1TYW1wbGVSYXRlOworICAgIGludCAgICAgICAgICAgICBtRmFzdFRyYWNrc0dlbjsKKyAgICBGYXN0TWl4ZXJEdW1wU3RhdGUgbUR1bW15RmFzdE1peGVyRHVtcFN0YXRlOworICAgIHVpbnQzMl90ICAgICAgICBtVG90YWxOYXRpdmVGcmFtZXNXcml0dGVuOyAgLy8gY29waWVkIHRvIGR1bXBTdGF0ZS0+bUZyYW1lc1dyaXR0ZW4KIAogICAgIC8vIG5leHQgMiBmaWVsZHMgYXJlIHZhbGlkIG9ubHkgd2hlbiB0aW1lc3RhbXBTdGF0dXMgPT0gTk9fRVJST1IKLSAgICBBdWRpb1RpbWVzdGFtcCB0aW1lc3RhbXA7Ci0gICAgdWludDMyX3QgbmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZDsKKyAgICBBdWRpb1RpbWVzdGFtcCAgbVRpbWVzdGFtcDsKKyAgICB1aW50MzJfdCAgICAgICAgbU5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQ7CiAKIH07ICAvLyBjbGFzcyBGYXN0TWl4ZXIKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTA5NDJiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5jcHAKQEAgLTAsMCArMSwxOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkZhc3RNaXhlckR1bXBTdGF0ZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKyNpZmRlZiBGQVNUX1RIUkVBRF9TVEFUSVNUSUNTCisjaW5jbHVkZSA8Y3B1c3RhdHMvQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcy5oPgorI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUworI2luY2x1ZGUgPGNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmg+CisjZW5kaWYKKyNlbmRpZgorI2luY2x1ZGUgPHV0aWxzL0RlYnVnLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSAiRmFzdE1peGVyRHVtcFN0YXRlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworRmFzdE1peGVyRHVtcFN0YXRlOjpGYXN0TWl4ZXJEdW1wU3RhdGUoKSA6IEZhc3RUaHJlYWREdW1wU3RhdGUoKSwKKyAgICBtV3JpdGVTZXF1ZW5jZSgwKSwgbUZyYW1lc1dyaXR0ZW4oMCksCisgICAgbU51bVRyYWNrcygwKSwgbVdyaXRlRXJyb3JzKDApLAorICAgIG1TYW1wbGVSYXRlKDApLCBtRnJhbWVDb3VudCgwKSwKKyAgICBtVHJhY2tNYXNrKDApCit7Cit9CisKK0Zhc3RNaXhlckR1bXBTdGF0ZTo6fkZhc3RNaXhlckR1bXBTdGF0ZSgpCit7Cit9CisKKy8vIGhlbHBlciBmdW5jdGlvbiBjYWxsZWQgYnkgcXNvcnQoKQorc3RhdGljIGludCBjb21wYXJlX3VpbnQzMl90KGNvbnN0IHZvaWQgKnBhLCBjb25zdCB2b2lkICpwYikKK3sKKyAgICB1aW50MzJfdCBhID0gKihjb25zdCB1aW50MzJfdCAqKXBhOworICAgIHVpbnQzMl90IGIgPSAqKGNvbnN0IHVpbnQzMl90ICopcGI7CisgICAgaWYgKGEgPCBiKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKGEgPiBiKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKwordm9pZCBGYXN0TWl4ZXJEdW1wU3RhdGU6OmR1bXAoaW50IGZkKSBjb25zdAoreworICAgIGlmIChtQ29tbWFuZCA9PSBGYXN0TWl4ZXJTdGF0ZTo6SU5JVElBTCkgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBGYXN0TWl4ZXIgbm90IGluaXRpYWxpemVkXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBkb3VibGUgbWVhc3VyZWRXYXJtdXBNcyA9IChtTWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgKiAxMDAwLjApICsKKyAgICAgICAgICAgIChtTWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjIC8gMTAwMDAwMC4wKTsKKyAgICBkb3VibGUgbWl4UGVyaW9kU2VjID0gKGRvdWJsZSkgbUZyYW1lQ291bnQgLyBtU2FtcGxlUmF0ZTsKKyAgICBkcHJpbnRmKGZkLCAiICBGYXN0TWl4ZXIgY29tbWFuZD0lcyB3cml0ZVNlcXVlbmNlPSV1IGZyYW1lc1dyaXR0ZW49JXVcbiIKKyAgICAgICAgICAgICAgICAiICAgICAgICAgICAgbnVtVHJhY2tzPSV1IHdyaXRlRXJyb3JzPSV1IHVuZGVycnVucz0ldSBvdmVycnVucz0ldVxuIgorICAgICAgICAgICAgICAgICIgICAgICAgICAgICBzYW1wbGVSYXRlPSV1IGZyYW1lQ291bnQ9JXp1IG1lYXN1cmVkV2FybXVwPSUuM2cgbXMsIHdhcm11cEN5Y2xlcz0ldVxuIgorICAgICAgICAgICAgICAgICIgICAgICAgICAgICBtaXhQZXJpb2Q9JS4yZiBtc1xuIiwKKyAgICAgICAgICAgICAgICBGYXN0TWl4ZXJTdGF0ZTo6Y29tbWFuZFRvU3RyaW5nKG1Db21tYW5kKSwgbVdyaXRlU2VxdWVuY2UsIG1GcmFtZXNXcml0dGVuLAorICAgICAgICAgICAgICAgIG1OdW1UcmFja3MsIG1Xcml0ZUVycm9ycywgbVVuZGVycnVucywgbU92ZXJydW5zLAorICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtRnJhbWVDb3VudCwgbWVhc3VyZWRXYXJtdXBNcywgbVdhcm11cEN5Y2xlcywKKyAgICAgICAgICAgICAgICBtaXhQZXJpb2RTZWMgKiAxZTMpOworI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKKyAgICAvLyBmaW5kIHRoZSBpbnRlcnZhbCBvZiB2YWxpZCBzYW1wbGVzCisgICAgdWludDMyX3QgYm91bmRzID0gbUJvdW5kczsKKyAgICB1aW50MzJfdCBuZXdlc3RPcGVuID0gYm91bmRzICYgMHhGRkZGOworICAgIHVpbnQzMl90IG9sZGVzdENsb3NlZCA9IGJvdW5kcyA+PiAxNjsKKyAgICB1aW50MzJfdCBuID0gKG5ld2VzdE9wZW4gLSBvbGRlc3RDbG9zZWQpICYgMHhGRkZGOworICAgIGlmIChuID4gbVNhbXBsaW5nTikgeworICAgICAgICBBTE9HRSgidG9vIG1hbnkgc2FtcGxlcyAldSIsIG4pOworICAgICAgICBuID0gbVNhbXBsaW5nTjsKKyAgICB9CisgICAgLy8gc3RhdGlzdGljcyBmb3IgbW9ub3RvbmljICh3YWxsIGNsb2NrKSB0aW1lLCB0aHJlYWQgcmF3IENQVSBsb2FkIGluIHRpbWUsIENQVSBjbG9jayBmcmVxdWVuY3ksCisgICAgLy8gYW5kIGFkanVzdGVkIENQVSBsb2FkIGluIE1IeiBub3JtYWxpemVkIGZvciBDUFUgY2xvY2sgZnJlcXVlbmN5CisgICAgQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcyB3YWxsLCBsb2FkTnM7CisjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCisgICAgQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcyBrSHosIGxvYWRNSHo7CisgICAgdWludDMyX3QgcHJldmlvdXNDcHVrSHogPSAwOworI2VuZGlmCisgICAgLy8gQXNzdW1pbmcgYSBub3JtYWwgZGlzdHJpYnV0aW9uIGZvciBjeWNsZSB0aW1lcywgdGhyZWUgc3RhbmRhcmQgZGV2aWF0aW9ucyBvbiBlaXRoZXIgc2lkZSBvZgorICAgIC8vIHRoZSBtZWFuIGFjY291bnQgZm9yIDk5LjczJSBvZiB0aGUgcG9wdWxhdGlvbi4gIFNvIGlmIHdlIHRha2UgZWFjaCB0YWlsIHRvIGJlIDEvMTAwMCBvZiB0aGUKKyAgICAvLyBzYW1wbGUgc2V0LCB3ZSBnZXQgOTkuOCUgY29tYmluZWQsIG9yIGNsb3NlIHRvIHRocmVlIHN0YW5kYXJkIGRldmlhdGlvbnMuCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtUYWlsRGVub21pbmF0b3IgPSAxMDAwOworICAgIHVpbnQzMl90ICp0YWlsID0gbiA+PSBrVGFpbERlbm9taW5hdG9yID8gbmV3IHVpbnQzMl90W25dIDogTlVMTDsKKyAgICAvLyBsb29wIG92ZXIgYWxsIHRoZSBzYW1wbGVzCisgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IG47ICsraikgeworICAgICAgICBzaXplX3QgaSA9IG9sZGVzdENsb3NlZCsrICYgKG1TYW1wbGluZ04gLSAxKTsKKyAgICAgICAgdWludDMyX3Qgd2FsbE5zID0gbU1vbm90b25pY05zW2ldOworICAgICAgICBpZiAodGFpbCAhPSBOVUxMKSB7CisgICAgICAgICAgICB0YWlsW2pdID0gd2FsbE5zOworICAgICAgICB9CisgICAgICAgIHdhbGwuc2FtcGxlKHdhbGxOcyk7CisgICAgICAgIHVpbnQzMl90IHNhbXBsZUxvYWROcyA9IG1Mb2FkTnNbaV07CisgICAgICAgIGxvYWROcy5zYW1wbGUoc2FtcGxlTG9hZE5zKTsKKyNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlQ3B1a0h6ID0gbUNwdWtIeltpXTsKKyAgICAgICAgLy8gc2tpcCBiYWQga0h6IHNhbXBsZXMKKyAgICAgICAgaWYgKChzYW1wbGVDcHVrSHogJiB+MHhGKSAhPSAwKSB7CisgICAgICAgICAgICBrSHouc2FtcGxlKHNhbXBsZUNwdWtIeiA+PiA0KTsKKyAgICAgICAgICAgIGlmIChzYW1wbGVDcHVrSHogPT0gcHJldmlvdXNDcHVrSHopIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgbWVnYWN5Y2xlcyA9IChkb3VibGUpIHNhbXBsZUxvYWROcyAqIChkb3VibGUpIChzYW1wbGVDcHVrSHogPj4gNCkgKiAxZS0xMjsKKyAgICAgICAgICAgICAgICBkb3VibGUgYWRqTUh6ID0gbWVnYWN5Y2xlcyAvIG1peFBlcmlvZFNlYzsgIC8vIF9ub3RfIHdhbGxOcyAqIDFlOQorICAgICAgICAgICAgICAgIGxvYWRNSHouc2FtcGxlKGFkak1Ieik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJldmlvdXNDcHVrSHogPSBzYW1wbGVDcHVrSHo7CisjZW5kaWYKKyAgICB9CisgICAgaWYgKG4pIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgU2ltcGxlIG1vdmluZyBzdGF0aXN0aWNzIG92ZXIgbGFzdCAlLjFmIHNlY29uZHM6XG4iLAorICAgICAgICAgICAgICAgICAgICB3YWxsLm4oKSAqIG1peFBlcmlvZFNlYyk7CisgICAgICAgIGRwcmludGYoZmQsICIgICAgd2FsbCBjbG9jayB0aW1lIGluIG1zIHBlciBtaXggY3ljbGU6XG4iCisgICAgICAgICAgICAgICAgICAgICIgICAgICBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIsCisgICAgICAgICAgICAgICAgICAgIHdhbGwubWVhbigpKjFlLTYsIHdhbGwubWluaW11bSgpKjFlLTYsIHdhbGwubWF4aW11bSgpKjFlLTYsCisgICAgICAgICAgICAgICAgICAgIHdhbGwuc3RkZGV2KCkqMWUtNik7CisgICAgICAgIGRwcmludGYoZmQsICIgICAgcmF3IENQVSBsb2FkIGluIHVzIHBlciBtaXggY3ljbGU6XG4iCisgICAgICAgICAgICAgICAgICAgICIgICAgICBtZWFuPSUuMGYgbWluPSUuMGYgbWF4PSUuMGYgc3RkZGV2PSUuMGZcbiIsCisgICAgICAgICAgICAgICAgICAgIGxvYWROcy5tZWFuKCkqMWUtMywgbG9hZE5zLm1pbmltdW0oKSoxZS0zLCBsb2FkTnMubWF4aW11bSgpKjFlLTMsCisgICAgICAgICAgICAgICAgICAgIGxvYWROcy5zdGRkZXYoKSoxZS0zKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBObyBGYXN0TWl4ZXIgc3RhdGlzdGljcyBhdmFpbGFibGUgY3VycmVudGx5XG4iKTsKKyAgICB9CisjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCisgICAgZHByaW50ZihmZCwgIiAgQ1BVIGNsb2NrIGZyZXF1ZW5jeSBpbiBNSHo6XG4iCisgICAgICAgICAgICAgICAgIiAgICBtZWFuPSUuMGYgbWluPSUuMGYgbWF4PSUuMGYgc3RkZGV2PSUuMGZcbiIsCisgICAgICAgICAgICAgICAga0h6Lm1lYW4oKSoxZS0zLCBrSHoubWluaW11bSgpKjFlLTMsIGtIei5tYXhpbXVtKCkqMWUtMywga0h6LnN0ZGRldigpKjFlLTMpOworICAgIGRwcmludGYoZmQsICIgIGFkanVzdGVkIENQVSBsb2FkIGluIE1IeiAoaS5lLiBub3JtYWxpemVkIGZvciBDUFUgY2xvY2sgZnJlcXVlbmN5KTpcbiIKKyAgICAgICAgICAgICAgICAiICAgIG1lYW49JS4xZiBtaW49JS4xZiBtYXg9JS4xZiBzdGRkZXY9JS4xZlxuIiwKKyAgICAgICAgICAgICAgICBsb2FkTUh6Lm1lYW4oKSwgbG9hZE1Iei5taW5pbXVtKCksIGxvYWRNSHoubWF4aW11bSgpLCBsb2FkTUh6LnN0ZGRldigpKTsKKyNlbmRpZgorICAgIGlmICh0YWlsICE9IE5VTEwpIHsKKyAgICAgICAgcXNvcnQodGFpbCwgbiwgc2l6ZW9mKHVpbnQzMl90KSwgY29tcGFyZV91aW50MzJfdCk7CisgICAgICAgIC8vIGFzc3VtZSBzYW1lIG51bWJlciBvZiB0YWlsIHNhbXBsZXMgb24gZWFjaCBzaWRlLCBsZWZ0IGFuZCByaWdodAorICAgICAgICB1aW50MzJfdCBjb3VudCA9IG4gLyBrVGFpbERlbm9taW5hdG9yOworICAgICAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIGxlZnQsIHJpZ2h0OworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICAgICAgbGVmdC5zYW1wbGUodGFpbFtpXSk7CisgICAgICAgICAgICByaWdodC5zYW1wbGUodGFpbFtuIC0gKGkgKyAxKV0pOworICAgICAgICB9CisgICAgICAgIGRwcmludGYoZmQsICIgIERpc3RyaWJ1dGlvbiBvZiBtaXggY3ljbGUgdGltZXMgaW4gbXMgZm9yIHRoZSB0YWlscyAiCisgICAgICAgICAgICAgICAgICAgICIoPiB+MyBzdGRkZXYgb3V0bGllcnMpOlxuIgorICAgICAgICAgICAgICAgICAgICAiICAgIGxlZnQgdGFpbDogbWVhbj0lLjJmIG1pbj0lLjJmIG1heD0lLjJmIHN0ZGRldj0lLjJmXG4iCisgICAgICAgICAgICAgICAgICAgICIgICAgcmlnaHQgdGFpbDogbWVhbj0lLjJmIG1pbj0lLjJmIG1heD0lLjJmIHN0ZGRldj0lLjJmXG4iLAorICAgICAgICAgICAgICAgICAgICBsZWZ0Lm1lYW4oKSoxZS02LCBsZWZ0Lm1pbmltdW0oKSoxZS02LCBsZWZ0Lm1heGltdW0oKSoxZS02LCBsZWZ0LnN0ZGRldigpKjFlLTYsCisgICAgICAgICAgICAgICAgICAgIHJpZ2h0Lm1lYW4oKSoxZS02LCByaWdodC5taW5pbXVtKCkqMWUtNiwgcmlnaHQubWF4aW11bSgpKjFlLTYsCisgICAgICAgICAgICAgICAgICAgIHJpZ2h0LnN0ZGRldigpKjFlLTYpOworICAgICAgICBkZWxldGVbXSB0YWlsOworICAgIH0KKyNlbmRpZgorICAgIC8vIFRoZSBhY3RpdmUgdHJhY2sgbWFzayBhbmQgdHJhY2sgc3RhdGVzIGFyZSB1cGRhdGVkIG5vbi1hdG9taWNhbGx5LgorICAgIC8vIFNvIGlmIHdlIHJlbGllZCBvbiBpc0FjdGl2ZSB0byBkZWNpZGUgd2hldGhlciB0byBkaXNwbGF5LAorICAgIC8vIHRoZW4gd2UgbWlnaHQgZGlzcGxheSBhbiBvYnNvbGV0ZSB0cmFjayBvciBvbWl0IGFuIGFjdGl2ZSB0cmFjay4KKyAgICAvLyBJbnN0ZWFkIHdlIGFsd2F5cyBkaXNwbGF5IGFsbCB0cmFja3MsIHdpdGggYW4gaW5kaWNhdGlvbgorICAgIC8vIG9mIHdoZXRoZXIgd2UgdGhpbmsgdGhlIHRyYWNrIGlzIGFjdGl2ZS4KKyAgICB1aW50MzJfdCB0cmFja01hc2sgPSBtVHJhY2tNYXNrOworICAgIGRwcmludGYoZmQsICIgIEZhc3QgdHJhY2tzOiBrTWF4RmFzdFRyYWNrcz0ldSBhY3RpdmVNYXNrPSUjeFxuIiwKKyAgICAgICAgICAgIEZhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrcywgdHJhY2tNYXNrKTsKKyAgICBkcHJpbnRmKGZkLCAiICBJbmRleCBBY3RpdmUgRnVsbCBQYXJ0aWFsIEVtcHR5ICBSZWNlbnQgUmVhZHlcbiIpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3M7ICsraSwgdHJhY2tNYXNrID4+PSAxKSB7CisgICAgICAgIGJvb2wgaXNBY3RpdmUgPSB0cmFja01hc2sgJiAxOworICAgICAgICBjb25zdCBGYXN0VHJhY2tEdW1wICpmdER1bXAgPSAmbVRyYWNrc1tpXTsKKyAgICAgICAgY29uc3QgRmFzdFRyYWNrVW5kZXJydW5zJiB1bmRlcnJ1bnMgPSBmdER1bXAtPm1VbmRlcnJ1bnM7CisgICAgICAgIGNvbnN0IGNoYXIgKm1vc3RSZWNlbnQ7CisgICAgICAgIHN3aXRjaCAodW5kZXJydW5zLm1CaXRGaWVsZHMubU1vc3RSZWNlbnQpIHsKKyAgICAgICAgY2FzZSBVTkRFUlJVTl9GVUxMOgorICAgICAgICAgICAgbW9zdFJlY2VudCA9ICJmdWxsIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFVOREVSUlVOX1BBUlRJQUw6CisgICAgICAgICAgICBtb3N0UmVjZW50ID0gInBhcnRpYWwiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVU5ERVJSVU5fRU1QVFk6CisgICAgICAgICAgICBtb3N0UmVjZW50ID0gImVtcHR5IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbW9zdFJlY2VudCA9ICI/IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRwcmludGYoZmQsICIgICU1dSAlNnMgJTR1ICU3dSAlNXUgJTdzICU1enVcbiIsIGksIGlzQWN0aXZlID8gInllcyIgOiAibm8iLAorICAgICAgICAgICAgICAgICh1bmRlcnJ1bnMubUJpdEZpZWxkcy5tRnVsbCkgJiBVTkRFUlJVTl9NQVNLLAorICAgICAgICAgICAgICAgICh1bmRlcnJ1bnMubUJpdEZpZWxkcy5tUGFydGlhbCkgJiBVTkRFUlJVTl9NQVNLLAorICAgICAgICAgICAgICAgICh1bmRlcnJ1bnMubUJpdEZpZWxkcy5tRW1wdHkpICYgVU5ERVJSVU5fTUFTSywKKyAgICAgICAgICAgICAgICBtb3N0UmVjZW50LCBmdER1bXAtPm1GcmFtZXNSZWFkeSk7CisgICAgfQorfQorCit9ICAgLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5oCmluZGV4IDZhMWU0NjQ5Li5hYzE1ZTdjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5oCkBAIC0xNyw3ICsxNywxMCBAQAogI2lmbmRlZiBBTkRST0lEX0FVRElPX0ZBU1RfTUlYRVJfRFVNUF9TVEFURV9ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9EVU1QX1NUQVRFX0gKIAorI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlICJGYXN0VGhyZWFkRHVtcFN0YXRlLmgiCisjaW5jbHVkZSAiRmFzdE1peGVyU3RhdGUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC01MiwyMiArNTUsMTIgQEAKIHN0cnVjdCBGYXN0VHJhY2tEdW1wIHsKICAgICBGYXN0VHJhY2tEdW1wKCkgOiBtRnJhbWVzUmVhZHkoMCkgeyB9CiAgICAgLyp2aXJ0dWFsKi8gfkZhc3RUcmFja0R1bXAoKSB7IH0KLSAgICBGYXN0VHJhY2tVbmRlcnJ1bnMgbVVuZGVycnVuczsKLSAgICBzaXplX3QgbUZyYW1lc1JlYWR5OyAgICAgICAgLy8gbW9zdCByZWNlbnQgdmFsdWUgb25seTsgbm8gbG9uZy10ZXJtIHN0YXRpc3RpY3Mga2VwdAorICAgIEZhc3RUcmFja1VuZGVycnVucyAgbVVuZGVycnVuczsKKyAgICBzaXplX3QgICAgICAgICAgICAgIG1GcmFtZXNSZWFkeTsgICAgICAgIC8vIG1vc3QgcmVjZW50IHZhbHVlIG9ubHk7IG5vIGxvbmctdGVybSBzdGF0aXN0aWNzIGtlcHQKIH07CiAKLS8vIFRoZSBGYXN0TWl4ZXJEdW1wU3RhdGUga2VlcHMgYSBjYWNoZSBvZiBGYXN0TWl4ZXIgc3RhdGlzdGljcyB0aGF0IGNhbiBiZSBsb2dnZWQgYnkgZHVtcHN5cy4KLS8vIEVhY2ggaW5kaXZpZHVhbCBuYXRpdmUgd29yZC1zaXplZCBmaWVsZCBpcyBhY2Nlc3NlZCBhdG9taWNhbGx5LiAgQnV0IHRoZQotLy8gb3ZlcmFsbCBzdHJ1Y3R1cmUgaXMgbm9uLWF0b21pYywgdGhhdCBpcyB0aGVyZSBtYXkgYmUgYW4gaW5jb25zaXN0ZW5jeSBiZXR3ZWVuIGZpZWxkcy4KLS8vIE5vIGJhcnJpZXJzIG9yIGxvY2tzIGFyZSB1c2VkIGZvciBlaXRoZXIgd3JpdGluZyBvciByZWFkaW5nLgotLy8gT25seSBQT0QgdHlwZXMgYXJlIHBlcm1pdHRlZCwgYW5kIHRoZSBjb250ZW50cyBzaG91bGRuJ3QgYmUgdHJ1c3RlZCAoaS5lLiBkbyByYW5nZSBjaGVja3MpLgotLy8gSXQgaGFzIGEgZGlmZmVyZW50IGxpZmV0aW1lIHRoYW4gdGhlIEZhc3RNaXhlciwgYW5kIHNvIGl0IGNhbid0IGJlIGEgbWVtYmVyIG9mIEZhc3RNaXhlci4KIHN0cnVjdCBGYXN0TWl4ZXJEdW1wU3RhdGUgOiBGYXN0VGhyZWFkRHVtcFN0YXRlIHsKLSAgICBGYXN0TWl4ZXJEdW1wU3RhdGUoCi0jaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ04gPSBrU2FtcGxpbmdOZm9yTG93UmFtRGV2aWNlCi0jZW5kaWYKLSAgICAgICAgICAgICk7CisgICAgRmFzdE1peGVyRHVtcFN0YXRlKCk7CiAgICAgLyp2aXJ0dWFsKi8gfkZhc3RNaXhlckR1bXBTdGF0ZSgpOwogCiAgICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3Q7ICAgIC8vIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHN0YWJsZSBjb3B5LCBub3QgdGhlIG9yaWdpbmFsCkBAIC04MCwxNCArNzMsNiBAQAogICAgIHNpemVfdCAgIG1GcmFtZUNvdW50OwogICAgIHVpbnQzMl90IG1UcmFja01hc2s7ICAgICAgICAvLyBtYXNrIG9mIGFjdGl2ZSB0cmFja3MKICAgICBGYXN0VHJhY2tEdW1wICAgbVRyYWNrc1tGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3NdOwotCi0jaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgLy8gQ29tcGlsZS10aW1lIGNvbnN0YW50IGZvciBhICJsb3cgUkFNIGRldmljZSIsIG11c3QgYmUgYSBwb3dlciBvZiAyIDw9IGtTYW1wbGluZ04uCi0gICAgLy8gVGhpcyB2YWx1ZSB3YXMgY2hvc2VuIHN1Y2ggdGhhdCBlYWNoIGFycmF5IHVzZXMgMSBzbWFsbCBwYWdlICg0IEtieXRlcykuCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtTYW1wbGluZ05mb3JMb3dSYW1EZXZpY2UgPSAweDQwMDsKLSAgICAvLyBJbmNyZWFzZSBzYW1wbGluZyB3aW5kb3cgYWZ0ZXIgY29uc3RydWN0aW9uLCBtdXN0IGJlIGEgcG93ZXIgb2YgMiA8PSBrU2FtcGxpbmdOCi0gICAgdm9pZCAgICBpbmNyZWFzZVNhbXBsaW5nTih1aW50MzJfdCBzYW1wbGluZ04pOwotI2VuZGlmCiB9OwogCiB9ICAgLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5jcHAKaW5kZXggM2FhOGRhZC4uYThjMjYzNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuY3BwCkBAIC0zOSw0ICszOSwxOSBAQAogewogfQogCisvLyBzdGF0aWMKK2NvbnN0IGNoYXIgKkZhc3RNaXhlclN0YXRlOjpjb21tYW5kVG9TdHJpbmcoQ29tbWFuZCBjb21tYW5kKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IEZhc3RUaHJlYWRTdGF0ZTo6Y29tbWFuZFRvU3RyaW5nKGNvbW1hbmQpOworICAgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gc3RyOworICAgIH0KKyAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKKyAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpNSVg6ICAgICAgIHJldHVybiAiTUlYIjsKKyAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpXUklURTogICAgIHJldHVybiAiV1JJVEUiOworICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6Ok1JWF9XUklURTogcmV0dXJuICJNSVhfV1JJVEUiOworICAgIH0KKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyIsIF9fZnVuY19fKTsKK30KKwogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oCmluZGV4IDY2MWM5Y2EuLjkxNjUxNGYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oCkBAIC03Myw2ICs3Myw5IEBACiAKICAgICAvLyBUaGlzIG1pZ2h0IGJlIGEgb25lLXRpbWUgY29uZmlndXJhdGlvbiByYXRoZXIgdGhhbiBwZXItc3RhdGUKICAgICBOQkFJT19TaW5rKiBtVGVlU2luazsgICAgICAgLy8gaWYgbm9uLU5VTEwsIHRoZW4gZHVwbGljYXRlIHdyaXRlKClzIHRvIHRoaXMgbm9uLWJsb2NraW5nIHNpbmsKKworICAgIC8vIG5ldmVyIHJldHVybnMgTlVMTDsgYXNzZXJ0cyBpZiBjb21tYW5kIGlzIGludmFsaWQKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29tbWFuZFRvU3RyaW5nKENvbW1hbmQgY29tbWFuZCk7CiB9OyAgLy8gc3RydWN0IEZhc3RNaXhlclN0YXRlCiAKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuY3BwCmluZGV4IDIxNmRhY2UuLjVjYTU3OWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5jcHAKQEAgLTI1LDU0ICsyNSw1OCBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSAiRmFzdFRocmVhZC5oIgorI2luY2x1ZGUgIkZhc3RUaHJlYWREdW1wU3RhdGUuaCIKIAogI2RlZmluZSBGQVNUX0RFRkFVTFRfTlMgICAgOTk5OTk5OTk5TCAgIC8vIH4xIHNlYzogZGVmYXVsdCB0aW1lIHRvIHNsZWVwCiAjZGVmaW5lIEZBU1RfSE9UX0lETEVfTlMgICAgIDEwMDAwMDBMICAgLy8gMSBtczogdGltZSB0byBzbGVlcCB3aGlsZSBob3QgaWRsaW5nCi0jZGVmaW5lIE1JTl9XQVJNVVBfQ1lDTEVTICAgICAgICAgIDIgICAgLy8gbWluaW11bSBudW1iZXIgb2YgbG9vcCBjeWNsZXMgdG8gd2FpdCBmb3Igd2FybXVwCisjZGVmaW5lIE1JTl9XQVJNVVBfQ1lDTEVTICAgICAgICAgIDIgICAgLy8gbWluaW11bSBudW1iZXIgb2YgY29uc2VjdXRpdmUgaW4tcmFuZ2UgbG9vcCBjeWNsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byB3YWl0IGZvciB3YXJtdXAKICNkZWZpbmUgTUFYX1dBUk1VUF9DWUNMRVMgICAgICAgICAxMCAgICAvLyBtYXhpbXVtIG51bWJlciBvZiBsb29wIGN5Y2xlcyB0byB3YWl0IGZvciB3YXJtdXAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBGYXN0VGhyZWFkOjpGYXN0VGhyZWFkKCkgOiBUaHJlYWQoZmFsc2UgLypjYW5DYWxsSmF2YSovKSwKLSAgICAvLyByZS1pbml0aWFsaXplZCB0byAmaW5pdGlhbCBieSBzdWJjbGFzcyBjb25zdHJ1Y3RvcgotICAgICBwcmV2aW91cyhOVUxMKSwgY3VycmVudChOVUxMKSwKLSAgICAvKiBvbGRUcyh7MCwgMH0pLCAqLwotICAgIG9sZFRzVmFsaWQoZmFsc2UpLAotICAgIHNsZWVwTnMoLTEpLAotICAgIHBlcmlvZE5zKDApLAotICAgIHVuZGVycnVuTnMoMCksCi0gICAgb3ZlcnJ1bk5zKDApLAotICAgIGZvcmNlTnMoMCksCi0gICAgd2FybXVwTnMoMCksCi0gICAgLy8gcmUtaW5pdGlhbGl6ZWQgdG8gJmR1bW15RHVtcFN0YXRlIGJ5IHN1YmNsYXNzIGNvbnN0cnVjdG9yCisgICAgLy8gcmUtaW5pdGlhbGl6ZWQgdG8gJnNJbml0aWFsIGJ5IHN1YmNsYXNzIGNvbnN0cnVjdG9yCisgICAgbVByZXZpb3VzKE5VTEwpLCBtQ3VycmVudChOVUxMKSwKKyAgICAvKiBtT2xkVHMoezAsIDB9KSwgKi8KKyAgICBtT2xkVHNWYWxpZChmYWxzZSksCisgICAgbVNsZWVwTnMoLTEpLAorICAgIG1QZXJpb2ROcygwKSwKKyAgICBtVW5kZXJydW5OcygwKSwKKyAgICBtT3ZlcnJ1bk5zKDApLAorICAgIG1Gb3JjZU5zKDApLAorICAgIG1XYXJtdXBOc01pbigwKSwKKyAgICBtV2FybXVwTnNNYXgoTE9OR19NQVgpLAorICAgIC8vIHJlLWluaXRpYWxpemVkIHRvICZtRHVtbXlTdWJjbGFzc0R1bXBTdGF0ZSBieSBzdWJjbGFzcyBjb25zdHJ1Y3RvcgogICAgIG1EdW1teUR1bXBTdGF0ZShOVUxMKSwKLSAgICBkdW1wU3RhdGUoTlVMTCksCi0gICAgaWdub3JlTmV4dE92ZXJydW4odHJ1ZSksCi0jaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgLy8gb2xkTG9hZAotICAgIG9sZExvYWRWYWxpZChmYWxzZSksCi0gICAgYm91bmRzKDApLAotICAgIGZ1bGwoZmFsc2UpLAotICAgIC8vIHRjdQorICAgIG1EdW1wU3RhdGUoTlVMTCksCisgICAgbUlnbm9yZU5leHRPdmVycnVuKHRydWUpLAorI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKKyAgICAvLyBtT2xkTG9hZAorICAgIG1PbGRMb2FkVmFsaWQoZmFsc2UpLAorICAgIG1Cb3VuZHMoMCksCisgICAgbUZ1bGwoZmFsc2UpLAorICAgIC8vIG1UY3UKICNlbmRpZgotICAgIGNvbGRHZW4oMCksCi0gICAgaXNXYXJtKGZhbHNlKSwKLSAgICAvKiBtZWFzdXJlZFdhcm11cFRzKHswLCAwfSksICovCi0gICAgd2FybXVwQ3ljbGVzKDApLAotICAgIC8vIGR1bW15TG9nV3JpdGVyCi0gICAgbG9nV3JpdGVyKCZkdW1teUxvZ1dyaXRlciksCi0gICAgdGltZXN0YW1wU3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKSwKKyAgICBtQ29sZEdlbigwKSwKKyAgICBtSXNXYXJtKGZhbHNlKSwKKyAgICAvKiBtTWVhc3VyZWRXYXJtdXBUcyh7MCwgMH0pLCAqLworICAgIG1XYXJtdXBDeWNsZXMoMCksCisgICAgbVdhcm11cENvbnNlY3V0aXZlSW5SYW5nZUN5Y2xlcygwKSwKKyAgICAvLyBtRHVtbXlMb2dXcml0ZXIKKyAgICBtTG9nV3JpdGVyKCZtRHVtbXlMb2dXcml0ZXIpLAorICAgIG1UaW1lc3RhbXBTdGF0dXMoSU5WQUxJRF9PUEVSQVRJT04pLAogCi0gICAgY29tbWFuZChGYXN0VGhyZWFkU3RhdGU6OklOSVRJQUwpLAorICAgIG1Db21tYW5kKEZhc3RUaHJlYWRTdGF0ZTo6SU5JVElBTCksCiAjaWYgMAogICAgIGZyYW1lQ291bnQoMCksCiAjZW5kaWYKLSAgICBhdHRlbXB0ZWRXcml0ZShmYWxzZSkKKyAgICBtQXR0ZW1wdGVkV3JpdGUoZmFsc2UpCiB7Ci0gICAgb2xkVHMudHZfc2VjID0gMDsKLSAgICBvbGRUcy50dl9uc2VjID0gMDsKLSAgICBtZWFzdXJlZFdhcm11cFRzLnR2X3NlYyA9IDA7Ci0gICAgbWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjID0gMDsKKyAgICBtT2xkVHMudHZfc2VjID0gMDsKKyAgICBtT2xkVHMudHZfbnNlYyA9IDA7CisgICAgbU1lYXN1cmVkV2FybXVwVHMudHZfc2VjID0gMDsKKyAgICBtTWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjID0gMDsKIH0KIAogRmFzdFRocmVhZDo6fkZhc3RUaHJlYWQoKQpAQCAtODQsMzQgKzg4LDM0IEBACiAgICAgZm9yICg7OykgewogCiAgICAgICAgIC8vIGVpdGhlciBuYW5vc2xlZXAsIHNjaGVkX3lpZWxkLCBvciBidXN5IHdhaXQKLSAgICAgICAgaWYgKHNsZWVwTnMgPj0gMCkgewotICAgICAgICAgICAgaWYgKHNsZWVwTnMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoc2xlZXBOcyA8IDEwMDAwMDAwMDApOwotICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyByZXEgPSB7MCwgc2xlZXBOc307CisgICAgICAgIGlmIChtU2xlZXBOcyA+PSAwKSB7CisgICAgICAgICAgICBpZiAobVNsZWVwTnMgPiAwKSB7CisgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQobVNsZWVwTnMgPCAxMDAwMDAwMDAwKTsKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgcmVxID0gezAsIG1TbGVlcE5zfTsKICAgICAgICAgICAgICAgICBuYW5vc2xlZXAoJnJlcSwgTlVMTCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHNjaGVkX3lpZWxkKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLy8gZGVmYXVsdCB0byBsb25nIHNsZWVwIGZvciBuZXh0IGN5Y2xlCi0gICAgICAgIHNsZWVwTnMgPSBGQVNUX0RFRkFVTFRfTlM7CisgICAgICAgIG1TbGVlcE5zID0gRkFTVF9ERUZBVUxUX05TOwogCiAgICAgICAgIC8vIHBvbGwgZm9yIHN0YXRlIGNoYW5nZQogICAgICAgICBjb25zdCBGYXN0VGhyZWFkU3RhdGUgKm5leHQgPSBwb2xsKCk7CiAgICAgICAgIGlmIChuZXh0ID09IE5VTEwpIHsKICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHRvIHVzZSB0aGUgZGVmYXVsdCBpbml0aWFsIHN0YXRlIHVudGlsIGEgcmVhbCBzdGF0ZSBpcyBhdmFpbGFibGUKLSAgICAgICAgICAgIC8vIEZJWE1FICZpbml0aWFsIG5vdCBhdmFpbGFibGUsIHNob3VsZCBzYXZlIGFkZHJlc3MgZWFybGllcgotICAgICAgICAgICAgLy9BTE9HX0FTU0VSVChjdXJyZW50ID09ICZpbml0aWFsICYmIHByZXZpb3VzID09ICZpbml0aWFsKTsKLSAgICAgICAgICAgIG5leHQgPSBjdXJyZW50OworICAgICAgICAgICAgLy8gRklYTUUgJnNJbml0aWFsIG5vdCBhdmFpbGFibGUsIHNob3VsZCBzYXZlIGFkZHJlc3MgZWFybGllcgorICAgICAgICAgICAgLy9BTE9HX0FTU0VSVChtQ3VycmVudCA9PSAmc0luaXRpYWwgJiYgcHJldmlvdXMgPT0gJnNJbml0aWFsKTsKKyAgICAgICAgICAgIG5leHQgPSBtQ3VycmVudDsKICAgICAgICAgfQogCi0gICAgICAgIGNvbW1hbmQgPSBuZXh0LT5tQ29tbWFuZDsKLSAgICAgICAgaWYgKG5leHQgIT0gY3VycmVudCkgeworICAgICAgICBtQ29tbWFuZCA9IG5leHQtPm1Db21tYW5kOworICAgICAgICBpZiAobmV4dCAhPSBtQ3VycmVudCkgewogCiAgICAgICAgICAgICAvLyBBcyBzb29uIGFzIHBvc3NpYmxlIG9mIGxlYXJuaW5nIG9mIGEgbmV3IGR1bXAgYXJlYSwgc3RhcnQgdXNpbmcgaXQKLSAgICAgICAgICAgIGR1bXBTdGF0ZSA9IG5leHQtPm1EdW1wU3RhdGUgIT0gTlVMTCA/IG5leHQtPm1EdW1wU3RhdGUgOiBtRHVtbXlEdW1wU3RhdGU7Ci0gICAgICAgICAgICBsb2dXcml0ZXIgPSBuZXh0LT5tTkJMb2dXcml0ZXIgIT0gTlVMTCA/IG5leHQtPm1OQkxvZ1dyaXRlciA6ICZkdW1teUxvZ1dyaXRlcjsKLSAgICAgICAgICAgIHNldExvZyhsb2dXcml0ZXIpOworICAgICAgICAgICAgbUR1bXBTdGF0ZSA9IG5leHQtPm1EdW1wU3RhdGUgIT0gTlVMTCA/IG5leHQtPm1EdW1wU3RhdGUgOiBtRHVtbXlEdW1wU3RhdGU7CisgICAgICAgICAgICBtTG9nV3JpdGVyID0gbmV4dC0+bU5CTG9nV3JpdGVyICE9IE5VTEwgPyBuZXh0LT5tTkJMb2dXcml0ZXIgOiAmbUR1bW15TG9nV3JpdGVyOworICAgICAgICAgICAgc2V0TG9nKG1Mb2dXcml0ZXIpOwogCiAgICAgICAgICAgICAvLyBXZSB3YW50IHRvIGFsd2F5cyBoYXZlIGEgdmFsaWQgcmVmZXJlbmNlIHRvIHRoZSBwcmV2aW91cyAobm9uLWlkbGUpIHN0YXRlLgogICAgICAgICAgICAgLy8gSG93ZXZlciwgdGhlIHN0YXRlIHF1ZXVlIG9ubHkgZ3VhcmFudGVlcyBhY2Nlc3MgdG8gY3VycmVudCBhbmQgcHJldmlvdXMgc3RhdGVzLgpAQCAtMTIyLDM3ICsxMjYsMzggQEAKICAgICAgICAgICAgIC8vICBub24taWRsZSAtPiBpZGxlICAgICAgICB1cGRhdGUgcHJldmlvdXMgZnJvbSBjb3B5IG9mIGN1cnJlbnQKICAgICAgICAgICAgIC8vICBpZGxlICAgICAtPiBpZGxlICAgICAgICBkb24ndCB1cGRhdGUgcHJldmlvdXMKICAgICAgICAgICAgIC8vICBpZGxlICAgICAtPiBub24taWRsZSAgICBkb24ndCB1cGRhdGUgcHJldmlvdXMKLSAgICAgICAgICAgIGlmICghKGN1cnJlbnQtPm1Db21tYW5kICYgRmFzdFRocmVhZFN0YXRlOjpJRExFKSkgewotICAgICAgICAgICAgICAgIGlmIChjb21tYW5kICYgRmFzdFRocmVhZFN0YXRlOjpJRExFKSB7CisgICAgICAgICAgICBpZiAoIShtQ3VycmVudC0+bUNvbW1hbmQgJiBGYXN0VGhyZWFkU3RhdGU6OklETEUpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Db21tYW5kICYgRmFzdFRocmVhZFN0YXRlOjpJRExFKSB7CiAgICAgICAgICAgICAgICAgICAgIG9uSWRsZSgpOwotICAgICAgICAgICAgICAgICAgICBvbGRUc1ZhbGlkID0gZmFsc2U7Ci0jaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgICAgICAgICAgICAgICAgIG9sZExvYWRWYWxpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBtT2xkVHNWYWxpZCA9IGZhbHNlOworI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKKyAgICAgICAgICAgICAgICAgICAgbU9sZExvYWRWYWxpZCA9IGZhbHNlOwogI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIGlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbUlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJldmlvdXMgPSBjdXJyZW50OworICAgICAgICAgICAgICAgIG1QcmV2aW91cyA9IG1DdXJyZW50OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY3VycmVudCA9IG5leHQ7CisgICAgICAgICAgICBtQ3VycmVudCA9IG5leHQ7CiAgICAgICAgIH0KICNpZiAhTE9HX05ERUJVRwogICAgICAgICBuZXh0ID0gTlVMTDsgICAgLy8gbm90IHJlZmVyZW5jZWQgYWdhaW4KICNlbmRpZgogCi0gICAgICAgIGR1bXBTdGF0ZS0+bUNvbW1hbmQgPSBjb21tYW5kOworICAgICAgICBtRHVtcFN0YXRlLT5tQ29tbWFuZCA9IG1Db21tYW5kOwogCisgICAgICAgIC8vIEZJWE1FIHdoYXQgZG9lcyB0aGlzIGNvbW1lbnQgbWVhbj8KICAgICAgICAgLy8gPDwgY3VycmVudCwgcHJldmlvdXMsIGNvbW1hbmQsIGR1bXBTdGF0ZSA+PgogCi0gICAgICAgIHN3aXRjaCAoY29tbWFuZCkgeworICAgICAgICBzd2l0Y2ggKG1Db21tYW5kKSB7CiAgICAgICAgIGNhc2UgRmFzdFRocmVhZFN0YXRlOjpJTklUSUFMOgogICAgICAgICBjYXNlIEZhc3RUaHJlYWRTdGF0ZTo6SE9UX0lETEU6Ci0gICAgICAgICAgICBzbGVlcE5zID0gRkFTVF9IT1RfSURMRV9OUzsKKyAgICAgICAgICAgIG1TbGVlcE5zID0gRkFTVF9IT1RfSURMRV9OUzsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICBjYXNlIEZhc3RUaHJlYWRTdGF0ZTo6Q09MRF9JRExFOgogICAgICAgICAgICAgLy8gb25seSBwZXJmb3JtIGEgY29sZCBpZGxlIGNvbW1hbmQgb25jZQogICAgICAgICAgICAgLy8gRklYTUUgY29uc2lkZXIgY2hlY2tpbmcgcHJldmlvdXMgc3RhdGUgYW5kIG9ubHkgcGVyZm9ybSBpZiBwcmV2aW91cyAhPSBDT0xEX0lETEUKLSAgICAgICAgICAgIGlmIChjdXJyZW50LT5tQ29sZEdlbiAhPSBjb2xkR2VuKSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCAqY29sZEZ1dGV4QWRkciA9IGN1cnJlbnQtPm1Db2xkRnV0ZXhBZGRyOworICAgICAgICAgICAgaWYgKG1DdXJyZW50LT5tQ29sZEdlbiAhPSBtQ29sZEdlbikgeworICAgICAgICAgICAgICAgIGludDMyX3QgKmNvbGRGdXRleEFkZHIgPSBtQ3VycmVudC0+bUNvbGRGdXRleEFkZHI7CiAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoY29sZEZ1dGV4QWRkciAhPSBOVUxMKTsKICAgICAgICAgICAgICAgICBpbnQzMl90IG9sZCA9IGFuZHJvaWRfYXRvbWljX2RlYyhjb2xkRnV0ZXhBZGRyKTsKICAgICAgICAgICAgICAgICBpZiAob2xkIDw9IDApIHsKQEAgLTE2NCw0MSArMTY5LDQyIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIFRoaXMgbWF5IGJlIG92ZXJseSBjb25zZXJ2YXRpdmU7IHRoZXJlIGNvdWxkIGJlIHRpbWVzIHRoYXQgdGhlIG5vcm1hbCBtaXhlcgogICAgICAgICAgICAgICAgIC8vIHJlcXVlc3RzIHN1Y2ggYSBicmllZiBjb2xkIGlkbGUgdGhhdCBpdCBkb2Vzbid0IHJlcXVpcmUgcmVzZXR0aW5nIHRoaXMgZmxhZy4KLSAgICAgICAgICAgICAgICBpc1dhcm0gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X3NlYyA9IDA7Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjID0gMDsKLSAgICAgICAgICAgICAgICB3YXJtdXBDeWNsZXMgPSAwOwotICAgICAgICAgICAgICAgIHNsZWVwTnMgPSAtMTsKLSAgICAgICAgICAgICAgICBjb2xkR2VuID0gY3VycmVudC0+bUNvbGRHZW47Ci0jaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgICAgICAgICAgICAgYm91bmRzID0gMDsKLSAgICAgICAgICAgICAgICBmdWxsID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbUlzV2FybSA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1NZWFzdXJlZFdhcm11cFRzLnR2X3NlYyA9IDA7CisgICAgICAgICAgICAgICAgbU1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyA9IDA7CisgICAgICAgICAgICAgICAgbVdhcm11cEN5Y2xlcyA9IDA7CisgICAgICAgICAgICAgICAgbVdhcm11cENvbnNlY3V0aXZlSW5SYW5nZUN5Y2xlcyA9IDA7CisgICAgICAgICAgICAgICAgbVNsZWVwTnMgPSAtMTsKKyAgICAgICAgICAgICAgICBtQ29sZEdlbiA9IG1DdXJyZW50LT5tQ29sZEdlbjsKKyNpZmRlZiBGQVNUX1RIUkVBRF9TVEFUSVNUSUNTCisgICAgICAgICAgICAgICAgbUJvdW5kcyA9IDA7CisgICAgICAgICAgICAgICAgbUZ1bGwgPSBmYWxzZTsKICNlbmRpZgotICAgICAgICAgICAgICAgIG9sZFRzVmFsaWQgPSAhY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZvbGRUcyk7Ci0gICAgICAgICAgICAgICAgdGltZXN0YW1wU3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgbU9sZFRzVmFsaWQgPSAhY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZtT2xkVHMpOworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBTdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2xlZXBOcyA9IEZBU1RfSE9UX0lETEVfTlM7CisgICAgICAgICAgICAgICAgbVNsZWVwTnMgPSBGQVNUX0hPVF9JRExFX05TOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIGNhc2UgRmFzdFRocmVhZFN0YXRlOjpFWElUOgogICAgICAgICAgICAgb25FeGl0KCk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFpc1N1YkNsYXNzQ29tbWFuZChjb21tYW5kKSk7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFpc1N1YkNsYXNzQ29tbWFuZChtQ29tbWFuZCkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICAvLyB0aGVyZSBpcyBhIG5vbi1pZGxlIHN0YXRlIGF2YWlsYWJsZSB0byB1czsgZGlkIHRoZSBzdGF0ZSBjaGFuZ2U/Ci0gICAgICAgIGlmIChjdXJyZW50ICE9IHByZXZpb3VzKSB7CisgICAgICAgIGlmIChtQ3VycmVudCAhPSBtUHJldmlvdXMpIHsKICAgICAgICAgICAgIG9uU3RhdGVDaGFuZ2UoKTsKICNpZiAxICAgLy8gRklYTUUgc2hvdWxkbid0IG5lZWQgdGhpcwogICAgICAgICAgICAgLy8gb25seSBwcm9jZXNzIHN0YXRlIGNoYW5nZSBvbmNlCi0gICAgICAgICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7CisgICAgICAgICAgICBtUHJldmlvdXMgPSBtQ3VycmVudDsKICNlbmRpZgogICAgICAgICB9CiAKICAgICAgICAgLy8gZG8gd29yayB1c2luZyBjdXJyZW50IHN0YXRlIGhlcmUKLSAgICAgICAgYXR0ZW1wdGVkV3JpdGUgPSBmYWxzZTsKKyAgICAgICAgbUF0dGVtcHRlZFdyaXRlID0gZmFsc2U7CiAgICAgICAgIG9uV29yaygpOwogCiAgICAgICAgIC8vIFRvIGJlIGV4YWN0bHkgcGVyaW9kaWMsIGNvbXB1dGUgdGhlIG5leHQgc2xlZXAgdGltZSBiYXNlZCBvbiBjdXJyZW50IHRpbWUuCkBAIC0yMDcsMTMgKzIxMywxMyBAQAogICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgbmV3VHM7CiAgICAgICAgIGludCByYyA9IGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmbmV3VHMpOwogICAgICAgICBpZiAocmMgPT0gMCkgewotICAgICAgICAgICAgLy9sb2dXcml0ZXItPmxvZ1RpbWVzdGFtcChuZXdUcyk7Ci0gICAgICAgICAgICBpZiAob2xkVHNWYWxpZCkgewotICAgICAgICAgICAgICAgIHRpbWVfdCBzZWMgPSBuZXdUcy50dl9zZWMgLSBvbGRUcy50dl9zZWM7Ci0gICAgICAgICAgICAgICAgbG9uZyBuc2VjID0gbmV3VHMudHZfbnNlYyAtIG9sZFRzLnR2X25zZWM7CisgICAgICAgICAgICAvL21Mb2dXcml0ZXItPmxvZ1RpbWVzdGFtcChuZXdUcyk7CisgICAgICAgICAgICBpZiAobU9sZFRzVmFsaWQpIHsKKyAgICAgICAgICAgICAgICB0aW1lX3Qgc2VjID0gbmV3VHMudHZfc2VjIC0gbU9sZFRzLnR2X3NlYzsKKyAgICAgICAgICAgICAgICBsb25nIG5zZWMgPSBuZXdUcy50dl9uc2VjIC0gbU9sZFRzLnR2X25zZWM7CiAgICAgICAgICAgICAgICAgQUxPR0VfSUYoc2VjIDwgMCB8fCAoc2VjID09IDAgJiYgbnNlYyA8IDApLAogICAgICAgICAgICAgICAgICAgICAgICAgImNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDKSBmYWlsZWQ6IHdhcyAlbGQuJTA5bGQgYnV0IG5vdyAlbGQuJTA5bGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgb2xkVHMudHZfc2VjLCBvbGRUcy50dl9uc2VjLCBuZXdUcy50dl9zZWMsIG5ld1RzLnR2X25zZWMpOworICAgICAgICAgICAgICAgICAgICAgICAgbU9sZFRzLnR2X3NlYywgbU9sZFRzLnR2X25zZWMsIG5ld1RzLnR2X3NlYywgbmV3VHMudHZfbnNlYyk7CiAgICAgICAgICAgICAgICAgaWYgKG5zZWMgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgIC0tc2VjOwogICAgICAgICAgICAgICAgICAgICBuc2VjICs9IDEwMDAwMDAwMDA7CkBAIC0yMjEsNjIgKzIyNyw3MCBAQAogICAgICAgICAgICAgICAgIC8vIFRvIGF2b2lkIGFuIGluaXRpYWwgdW5kZXJydW4gb24gZmFzdCB0cmFja3MgYWZ0ZXIgZXhpdGluZyBzdGFuZGJ5LAogICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBzdGFydCBwdWxsaW5nIGRhdGEgZnJvbSB0cmFja3MgYW5kIG1peGluZyB1bnRpbCB3YXJtdXAgaXMgY29tcGxldGUuCiAgICAgICAgICAgICAgICAgLy8gV2FybXVwIGlzIGNvbnNpZGVyZWQgY29tcGxldGUgYWZ0ZXIgdGhlIGVhcmxpZXIgb2Y6Ci0gICAgICAgICAgICAgICAgLy8gICAgICBNSU5fV0FSTVVQX0NZQ0xFUyB3cml0ZSgpIGF0dGVtcHRzIGFuZCBsYXN0IG9uZSBibG9ja3MgZm9yIGF0IGxlYXN0IHdhcm11cE5zCisgICAgICAgICAgICAgICAgLy8gICAgICBNSU5fV0FSTVVQX0NZQ0xFUyBjb25zZWN1dGl2ZSBpbi1yYW5nZSB3cml0ZSgpIGF0dGVtcHRzLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAgIHdoZXJlICJpbi1yYW5nZSIgbWVhbnMgbVdhcm11cE5zTWluIDw9IGN5Y2xlIHRpbWUgPD0gbVdhcm11cE5zTWF4CiAgICAgICAgICAgICAgICAgLy8gICAgICBNQVhfV0FSTVVQX0NZQ0xFUyB3cml0ZSgpIGF0dGVtcHRzLgogICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgb3Zlcmx5IGNvbnNlcnZhdGl2ZSwgYnV0IHRvIGdldCBiZXR0ZXIgYWNjdXJhY3kgcmVxdWlyZXMgYSBuZXcgSEFMIEFQSS4KLSAgICAgICAgICAgICAgICBpZiAoIWlzV2FybSAmJiBhdHRlbXB0ZWRXcml0ZSkgewotICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X3NlYyArPSBzZWM7Ci0gICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyArPSBuc2VjOwotICAgICAgICAgICAgICAgICAgICBpZiAobWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjID49IDEwMDAwMDAwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfc2VjKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgLT0gMTAwMDAwMDAwMDsKKyAgICAgICAgICAgICAgICBpZiAoIW1Jc1dhcm0gJiYgbUF0dGVtcHRlZFdyaXRlKSB7CisgICAgICAgICAgICAgICAgICAgIG1NZWFzdXJlZFdhcm11cFRzLnR2X3NlYyArPSBzZWM7CisgICAgICAgICAgICAgICAgICAgIG1NZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgKz0gbnNlYzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1NZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgPj0gMTAwMDAwMDAwMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbU1lYXN1cmVkV2FybXVwVHMudHZfc2VjKys7CisgICAgICAgICAgICAgICAgICAgICAgICBtTWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjIC09IDEwMDAwMDAwMDA7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgKyt3YXJtdXBDeWNsZXM7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgobnNlYyA+IHdhcm11cE5zICYmIHdhcm11cEN5Y2xlcyA+PSBNSU5fV0FSTVVQX0NZQ0xFUykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2FybXVwQ3ljbGVzID49IE1BWF9XQVJNVVBfQ1lDTEVTKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNXYXJtID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bU1lYXN1cmVkV2FybXVwVHMgPSBtZWFzdXJlZFdhcm11cFRzOwotICAgICAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tV2FybXVwQ3ljbGVzID0gd2FybXVwQ3ljbGVzOworICAgICAgICAgICAgICAgICAgICArK21XYXJtdXBDeWNsZXM7CisgICAgICAgICAgICAgICAgICAgIGlmIChtV2FybXVwTnNNaW4gPD0gbnNlYyAmJiBuc2VjIDw9IG1XYXJtdXBOc01heCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIndhcm11cCBjeWNsZSAlZCBpbiByYW5nZTogJS4wM2YgbXMiLCBtV2FybXVwQ3ljbGVzLCBuc2VjICogMWUtOSk7CisgICAgICAgICAgICAgICAgICAgICAgICArK21XYXJtdXBDb25zZWN1dGl2ZUluUmFuZ2VDeWNsZXM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigid2FybXVwIGN5Y2xlICVkIG91dCBvZiByYW5nZTogJS4wM2YgbXMiLCBtV2FybXVwQ3ljbGVzLCBuc2VjICogMWUtOSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtV2FybXVwQ29uc2VjdXRpdmVJblJhbmdlQ3ljbGVzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKG1XYXJtdXBDb25zZWN1dGl2ZUluUmFuZ2VDeWNsZXMgPj0gTUlOX1dBUk1VUF9DWUNMRVMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1XYXJtdXBDeWNsZXMgPj0gTUFYX1dBUk1VUF9DWUNMRVMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtSXNXYXJtID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1NZWFzdXJlZFdhcm11cFRzID0gbU1lYXN1cmVkV2FybXVwVHM7CisgICAgICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tV2FybXVwQ3ljbGVzID0gbVdhcm11cEN5Y2xlczsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzbGVlcE5zID0gLTE7Ci0gICAgICAgICAgICAgICAgaWYgKGlzV2FybSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VjID4gMCB8fCBuc2VjID4gdW5kZXJydW5OcykgeworICAgICAgICAgICAgICAgIG1TbGVlcE5zID0gLTE7CisgICAgICAgICAgICAgICAgaWYgKG1Jc1dhcm0pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlYyA+IDAgfHwgbnNlYyA+IG1VbmRlcnJ1bk5zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfTkFNRSgidW5kZXJydW4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIG9ubHkgbG9nIG9jY2FzaW9uYWxseQogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInVuZGVycnVuOiB0aW1lIHNpbmNlIGxhc3QgY3ljbGUgJWQuJTAzbGQgc2VjIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgc2VjLCBuc2VjIC8gMTAwMDAwMEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tVW5kZXJydW5zKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVOZXh0T3ZlcnJ1biA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnNlYyA8IG92ZXJydW5OcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlnbm9yZU5leHRPdmVycnVuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlTmV4dE92ZXJydW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1VbmRlcnJ1bnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JZ25vcmVOZXh0T3ZlcnJ1biA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnNlYyA8IG1PdmVycnVuTnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSWdub3JlTmV4dE92ZXJydW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSWdub3JlTmV4dE92ZXJydW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgb25seSBsb2cgb2NjYXNpb25hbGx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm92ZXJydW46IHRpbWUgc2luY2UgbGFzdCBjeWNsZSAlZC4lMDNsZCBzZWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgc2VjLCBuc2VjIC8gMTAwMDAwMEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bU92ZXJydW5zKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUR1bXBTdGF0ZS0+bU92ZXJydW5zKys7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGZvcmNlcyBhIG1pbmltdW0gY3ljbGUgdGltZS4gSXQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBjb21wZW5zYXRlcyBmb3IgYW4gYXVkaW8gSEFMIHdpdGggaml0dGVyIGR1ZSB0byBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSB3b3JrcyB3aXRoIGEgdmFyaWFibGUgYnVmZmVyIGRlcHRoIGF1ZGlvIEhBTCB0aGF0IG5ldmVyIHB1bGxzIGF0IGEKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJhdGUgPCB0aGFuIG92ZXJydW5OcyBwZXIgYnVmZmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcmF0ZSA8IHRoYW4gbU92ZXJydW5OcyBwZXIgYnVmZmVyLgogICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gcmVjb3ZlcnMgZnJvbSBvdmVycnVuIGltbWVkaWF0ZWx5IGFmdGVyIHVuZGVycnVuCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCBkb2Vzbid0IHdvcmsgd2l0aCBhIG5vbi1ibG9ja2luZyBhdWRpbyBIQUwuCi0gICAgICAgICAgICAgICAgICAgICAgICBzbGVlcE5zID0gZm9yY2VOcyAtIG5zZWM7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2xlZXBOcyA9IG1Gb3JjZU5zIC0gbnNlYzsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZU5leHRPdmVycnVuID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBtSWdub3JlTmV4dE92ZXJydW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICAgICAgICAgICAgICBpZiAoaXNXYXJtKSB7CisjaWZkZWYgRkFTVF9USFJFQURfU1RBVElTVElDUworICAgICAgICAgICAgICAgIGlmIChtSXNXYXJtKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGFkdmFuY2UgdGhlIEZJRk8gcXVldWUgYm91bmRzCi0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBpID0gYm91bmRzICYgKGR1bXBTdGF0ZS0+bVNhbXBsaW5nTiAtIDEpOwotICAgICAgICAgICAgICAgICAgICBib3VuZHMgPSAoYm91bmRzICYgMHhGRkZGMDAwMCkgfCAoKGJvdW5kcyArIDEpICYgMHhGRkZGKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcyArPSAweDEwMDAwOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEoYm91bmRzICYgKGR1bXBTdGF0ZS0+bVNhbXBsaW5nTiAtIDEpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZnVsbCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpID0gbUJvdW5kcyAmIChtRHVtcFN0YXRlLT5tU2FtcGxpbmdOIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIG1Cb3VuZHMgPSAobUJvdW5kcyAmIDB4RkZGRjAwMDApIHwgKChtQm91bmRzICsgMSkgJiAweEZGRkYpOworICAgICAgICAgICAgICAgICAgICBpZiAobUZ1bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Cb3VuZHMgKz0gMHgxMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghKG1Cb3VuZHMgJiAobUR1bXBTdGF0ZS0+bVNhbXBsaW5nTiAtIDEpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUZ1bGwgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgdGhlIGRlbHRhIHZhbHVlIG9mIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDKQogICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtb25vdG9uaWNOcyA9IG5zZWM7CkBAIC0yODgsOSArMzAyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjIG5ld0xvYWQ7CiAgICAgICAgICAgICAgICAgICAgIHJjID0gY2xvY2tfZ2V0dGltZShDTE9DS19USFJFQURfQ1BVVElNRV9JRCwgJm5ld0xvYWQpOwogICAgICAgICAgICAgICAgICAgICBpZiAocmMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZExvYWRWYWxpZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYyA9IG5ld0xvYWQudHZfc2VjIC0gb2xkTG9hZC50dl9zZWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlYyA9IG5ld0xvYWQudHZfbnNlYyAtIG9sZExvYWQudHZfbnNlYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtT2xkTG9hZFZhbGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjID0gbmV3TG9hZC50dl9zZWMgLSBtT2xkTG9hZC50dl9zZWM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlYyA9IG5ld0xvYWQudHZfbnNlYyAtIG1PbGRMb2FkLnR2X25zZWM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5zZWMgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tc2VjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2VjICs9IDEwMDAwMDAwMDA7CkBAIC0zMDEsNDIgKzMxNSw0MiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgdGltZSB0aHJvdWdoIHRoZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkTG9hZFZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT2xkTG9hZFZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9sZExvYWQgPSBuZXdMb2FkOworICAgICAgICAgICAgICAgICAgICAgICAgbU9sZExvYWQgPSBuZXdMb2FkOwogICAgICAgICAgICAgICAgICAgICB9CiAjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCiAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgQ1BVIGNsb2NrIGZyZXF1ZW5jeSBpbiBrSHoKICAgICAgICAgICAgICAgICAgICAgaW50IGNwdU51bSA9IHNjaGVkX2dldGNwdSgpOwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBrSHogPSB0Y3UuZ2V0Q3B1a0h6KGNwdU51bSk7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGtIeiA9IG1UY3UuZ2V0Q3B1a0h6KGNwdU51bSk7CiAgICAgICAgICAgICAgICAgICAgIGtIeiA9IChrSHogPDwgNCkgfCAoY3B1TnVtICYgMHhGKTsKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHZhbHVlcyBpbiBGSUZPIHF1ZXVlcyBmb3IgZHVtcHN5cwogICAgICAgICAgICAgICAgICAgICAvLyB0aGVzZSBzdG9yZXMgIzEsICMyLCAjMyBhcmUgbm90IGF0b21pYyB3aXRoIHJlc3BlY3QgdG8gZWFjaCBvdGhlciwKICAgICAgICAgICAgICAgICAgICAgLy8gb3Igd2l0aCByZXNwZWN0IHRvIHN0b3JlICM0IGJlbG93Ci0gICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bU1vbm90b25pY05zW2ldID0gbW9ub3RvbmljTnM7Ci0gICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUxvYWROc1tpXSA9IGxvYWROczsKKyAgICAgICAgICAgICAgICAgICAgbUR1bXBTdGF0ZS0+bU1vbm90b25pY05zW2ldID0gbW9ub3RvbmljTnM7CisgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1Mb2FkTnNbaV0gPSBsb2FkTnM7CiAjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCi0gICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUNwdWtIeltpXSA9IGtIejsKKyAgICAgICAgICAgICAgICAgICAgbUR1bXBTdGF0ZS0+bUNwdWtIeltpXSA9IGtIejsKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHN0b3JlICM0IGlzIG5vdCBhdG9taWMgd2l0aCByZXNwZWN0IHRvIHN0b3JlcyAjMSwgIzIsICMzIGFib3ZlLCBidXQKICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5ld2VzdCBvcGVuICYgb2xkZXN0IGNsb3NlZCBoYWx2ZXMgYXJlIGF0b21pYyB3aXRoIHJlc3BlY3QgdG8gZWFjaCBvdGhlcgotICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1Cb3VuZHMgPSBib3VuZHM7CisgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1Cb3VuZHMgPSBtQm91bmRzOwogICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfSU5UKCJjeWNsZV9tcyIsIG1vbm90b25pY05zIC8gMTAwMDAwMCk7CiAgICAgICAgICAgICAgICAgICAgIEFUUkFDRV9JTlQoImxvYWRfdXMiLCBsb2FkTnMgLyAxMDAwKTsKICAgICAgICAgICAgICAgICB9CiAjZW5kaWYKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gZmlyc3QgdGltZSB0aHJvdWdoIHRoZSBsb29wCi0gICAgICAgICAgICAgICAgb2xkVHNWYWxpZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgc2xlZXBOcyA9IHBlcmlvZE5zOwotICAgICAgICAgICAgICAgIGlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtT2xkVHNWYWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgbVNsZWVwTnMgPSBtUGVyaW9kTnM7CisgICAgICAgICAgICAgICAgbUlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9sZFRzID0gbmV3VHM7CisgICAgICAgICAgICBtT2xkVHMgPSBuZXdUczsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIG1vbm90b25pYyBjbG9jayBpcyBicm9rZW4KLSAgICAgICAgICAgIG9sZFRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHNsZWVwTnMgPSBwZXJpb2ROczsKKyAgICAgICAgICAgIG1PbGRUc1ZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICBtU2xlZXBOcyA9IG1QZXJpb2ROczsKICAgICAgICAgfQogCiAgICAgfSAgIC8vIGZvciAoOzspCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuaAppbmRleCAxMzMwMzM0Li4yZWZiNmRlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmgKQEAgLTQ4LDQyICs0OCw0NSBAQAogICAgIHZpcnR1YWwgdm9pZCBvblN0YXRlQ2hhbmdlKCkgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBvbldvcmsoKSA9IDA7CiAKLSAgICAvLyBGSVhNRSB0aGVzZSBmb3JtZXIgbG9jYWwgdmFyaWFibGVzIG5lZWQgY29tbWVudHMgYW5kIHRvIGJlIHJlbmFtZWQgdG8gaGF2ZSBhbiAibSIgcHJlZml4Ci0gICAgY29uc3QgRmFzdFRocmVhZFN0YXRlICpwcmV2aW91czsKLSAgICBjb25zdCBGYXN0VGhyZWFkU3RhdGUgKmN1cnJlbnQ7Ci0gICAgc3RydWN0IHRpbWVzcGVjIG9sZFRzOwotICAgIGJvb2wgb2xkVHNWYWxpZDsKLSAgICBsb25nIHNsZWVwTnM7ICAgLy8gLTE6IGJ1c3kgd2FpdCwgMDogc2NoZWRfeWllbGQsID4gMDogbmFub3NsZWVwCi0gICAgbG9uZyBwZXJpb2ROczsgICAgICAvLyBleHBlY3RlZCBwZXJpb2Q7IHRoZSB0aW1lIHJlcXVpcmVkIHRvIHJlbmRlciBvbmUgbWl4IGJ1ZmZlcgotICAgIGxvbmcgdW5kZXJydW5OczsgICAgLy8gdW5kZXJydW4gbGlrZWx5IHdoZW4gd3JpdGUgY3ljbGUgaXMgZ3JlYXRlciB0aGFuIHRoaXMgdmFsdWUKLSAgICBsb25nIG92ZXJydW5OczsgICAgIC8vIG92ZXJydW4gbGlrZWx5IHdoZW4gd3JpdGUgY3ljbGUgaXMgbGVzcyB0aGFuIHRoaXMgdmFsdWUKLSAgICBsb25nIGZvcmNlTnM7ICAgICAgIC8vIGlmIG92ZXJydW4gZGV0ZWN0ZWQsIGZvcmNlIHRoZSB3cml0ZSBjeWNsZSB0byB0YWtlIHRoaXMgbXVjaCB0aW1lCi0gICAgbG9uZyB3YXJtdXBOczsgICAgICAvLyB3YXJtdXAgY29tcGxldGUgd2hlbiB3cml0ZSBjeWNsZSBpcyBncmVhdGVyIHRoYW4gdG8gdGhpcyB2YWx1ZQotICAgIEZhc3RUaHJlYWREdW1wU3RhdGUgKm1EdW1teUR1bXBTdGF0ZTsKLSAgICBGYXN0VGhyZWFkRHVtcFN0YXRlICpkdW1wU3RhdGU7Ci0gICAgYm9vbCBpZ25vcmVOZXh0T3ZlcnJ1bjsgIC8vIHVzZWQgdG8gaWdub3JlIGluaXRpYWwgb3ZlcnJ1biBhbmQgZmlyc3QgYWZ0ZXIgYW4gdW5kZXJydW4KLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICBzdHJ1Y3QgdGltZXNwZWMgb2xkTG9hZDsgICAgLy8gcHJldmlvdXMgdmFsdWUgb2YgY2xvY2tfZ2V0dGltZShDTE9DS19USFJFQURfQ1BVVElNRV9JRCkKLSAgICBib29sIG9sZExvYWRWYWxpZDsgIC8vIHdoZXRoZXIgb2xkTG9hZCBpcyB2YWxpZAotICAgIHVpbnQzMl90IGJvdW5kczsKLSAgICBib29sIGZ1bGw7ICAgICAgICAgIC8vIHdoZXRoZXIgd2UgaGF2ZSBjb2xsZWN0ZWQgYXQgbGVhc3QgbVNhbXBsaW5nTiBzYW1wbGVzCisgICAgLy8gRklYTUUgdGhlc2UgZm9ybWVyIGxvY2FsIHZhcmlhYmxlcyBuZWVkIGNvbW1lbnRzCisgICAgY29uc3QgRmFzdFRocmVhZFN0YXRlKiAgbVByZXZpb3VzOworICAgIGNvbnN0IEZhc3RUaHJlYWRTdGF0ZSogIG1DdXJyZW50OworICAgIHN0cnVjdCB0aW1lc3BlYyBtT2xkVHM7CisgICAgYm9vbCAgICAgICAgICAgIG1PbGRUc1ZhbGlkOworICAgIGxvbmcgICAgICAgICAgICBtU2xlZXBOczsgICAgICAgLy8gLTE6IGJ1c3kgd2FpdCwgMDogc2NoZWRfeWllbGQsID4gMDogbmFub3NsZWVwCisgICAgbG9uZyAgICAgICAgICAgIG1QZXJpb2ROczsgICAgICAvLyBleHBlY3RlZCBwZXJpb2Q7IHRoZSB0aW1lIHJlcXVpcmVkIHRvIHJlbmRlciBvbmUgbWl4IGJ1ZmZlcgorICAgIGxvbmcgICAgICAgICAgICBtVW5kZXJydW5OczsgICAgLy8gdW5kZXJydW4gbGlrZWx5IHdoZW4gd3JpdGUgY3ljbGUgaXMgZ3JlYXRlciB0aGFuIHRoaXMgdmFsdWUKKyAgICBsb25nICAgICAgICAgICAgbU92ZXJydW5OczsgICAgIC8vIG92ZXJydW4gbGlrZWx5IHdoZW4gd3JpdGUgY3ljbGUgaXMgbGVzcyB0aGFuIHRoaXMgdmFsdWUKKyAgICBsb25nICAgICAgICAgICAgbUZvcmNlTnM7ICAgICAgIC8vIGlmIG92ZXJydW4gZGV0ZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZSB0aGUgd3JpdGUgY3ljbGUgdG8gdGFrZSB0aGlzIG11Y2ggdGltZQorICAgIGxvbmcgICAgICAgICAgICBtV2FybXVwTnNNaW47ICAgLy8gd2FybXVwIGNvbXBsZXRlIHdoZW4gd3JpdGUgY3ljbGUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHZhbHVlCisgICAgbG9uZyAgICAgICAgICAgIG1XYXJtdXBOc01heDsgICAvLyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoaXMgdmFsdWUKKyAgICBGYXN0VGhyZWFkRHVtcFN0YXRlKiBtRHVtbXlEdW1wU3RhdGU7CisgICAgRmFzdFRocmVhZER1bXBTdGF0ZSogbUR1bXBTdGF0ZTsKKyAgICBib29sICAgICAgICAgICAgbUlnbm9yZU5leHRPdmVycnVuOyAgICAgLy8gdXNlZCB0byBpZ25vcmUgaW5pdGlhbCBvdmVycnVuIGFuZCBmaXJzdCBhZnRlciBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmRlcnJ1bgorI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKKyAgICBzdHJ1Y3QgdGltZXNwZWMgbU9sZExvYWQ7ICAgICAgIC8vIHByZXZpb3VzIHZhbHVlIG9mIGNsb2NrX2dldHRpbWUoQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQpCisgICAgYm9vbCAgICAgICAgICAgIG1PbGRMb2FkVmFsaWQ7ICAvLyB3aGV0aGVyIG9sZExvYWQgaXMgdmFsaWQKKyAgICB1aW50MzJfdCAgICAgICAgbUJvdW5kczsKKyAgICBib29sICAgICAgICAgICAgbUZ1bGw7ICAgICAgICAgIC8vIHdoZXRoZXIgd2UgaGF2ZSBjb2xsZWN0ZWQgYXQgbGVhc3QgbVNhbXBsaW5nTiBzYW1wbGVzCiAjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCi0gICAgVGhyZWFkQ3B1VXNhZ2UgdGN1OyAgICAgLy8gZm9yIHJlYWRpbmcgdGhlIGN1cnJlbnQgQ1BVIGNsb2NrIGZyZXF1ZW5jeSBpbiBrSHoKKyAgICBUaHJlYWRDcHVVc2FnZSAgbVRjdTsgICAgICAgICAgIC8vIGZvciByZWFkaW5nIHRoZSBjdXJyZW50IENQVSBjbG9jayBmcmVxdWVuY3kgaW4ga0h6CiAjZW5kaWYKICNlbmRpZgotICAgIHVuc2lnbmVkIGNvbGRHZW47ICAgLy8gbGFzdCBvYnNlcnZlZCBtQ29sZEdlbgotICAgIGJvb2wgaXNXYXJtOyAgICAgICAgLy8gdHJ1ZSBtZWFucyByZWFkeSB0byBtaXgsIGZhbHNlIG1lYW5zIHdhaXQgZm9yIHdhcm11cCBiZWZvcmUgbWl4aW5nCi0gICAgc3RydWN0IHRpbWVzcGVjIG1lYXN1cmVkV2FybXVwVHM7ICAvLyBob3cgbG9uZyBkaWQgaXQgdGFrZSBmb3Igd2FybXVwIHRvIGNvbXBsZXRlCi0gICAgdWludDMyX3Qgd2FybXVwQ3ljbGVzOyAgLy8gY291bnRlciBvZiBudW1iZXIgb2YgbG9vcCBjeWNsZXMgcmVxdWlyZWQgdG8gd2FybXVwCi0gICAgTkJMb2c6OldyaXRlciBkdW1teUxvZ1dyaXRlcjsKLSAgICBOQkxvZzo6V3JpdGVyICpsb2dXcml0ZXI7Ci0gICAgc3RhdHVzX3QgdGltZXN0YW1wU3RhdHVzOworICAgIHVuc2lnbmVkICAgICAgICBtQ29sZEdlbjsgICAgICAgLy8gbGFzdCBvYnNlcnZlZCBtQ29sZEdlbgorICAgIGJvb2wgICAgICAgICAgICBtSXNXYXJtOyAgICAgICAgLy8gdHJ1ZSBtZWFucyByZWFkeSB0byBtaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxzZSBtZWFucyB3YWl0IGZvciB3YXJtdXAgYmVmb3JlIG1peGluZworICAgIHN0cnVjdCB0aW1lc3BlYyBtTWVhc3VyZWRXYXJtdXBUczsgIC8vIGhvdyBsb25nIGRpZCBpdCB0YWtlIGZvciB3YXJtdXAgdG8gY29tcGxldGUKKyAgICB1aW50MzJfdCAgICAgICAgbVdhcm11cEN5Y2xlczsgIC8vIGNvdW50ZXIgb2YgbnVtYmVyIG9mIGxvb3AgY3ljbGVzIGR1cmluZyB3YXJtdXAgcGhhc2UKKyAgICB1aW50MzJfdCAgICAgICAgbVdhcm11cENvbnNlY3V0aXZlSW5SYW5nZUN5Y2xlczsgICAgLy8gbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGN5Y2xlcyBpbiByYW5nZQorICAgIE5CTG9nOjpXcml0ZXIgICBtRHVtbXlMb2dXcml0ZXI7CisgICAgTkJMb2c6OldyaXRlciogIG1Mb2dXcml0ZXI7CisgICAgc3RhdHVzX3QgICAgICAgIG1UaW1lc3RhbXBTdGF0dXM7CiAKLSAgICBGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQgY29tbWFuZDsKLSNpZiAwCi0gICAgc2l6ZV90IGZyYW1lQ291bnQ7Ci0jZW5kaWYKLSAgICBib29sIGF0dGVtcHRlZFdyaXRlOworICAgIEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZCBtQ29tbWFuZDsKKyAgICBib29sICAgICAgICAgICAgbUF0dGVtcHRlZFdyaXRlOwogCiB9OyAgLy8gY2xhc3MgRmFzdFRocmVhZAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZER1bXBTdGF0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZER1bXBTdGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRmNWM0YwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkRHVtcFN0YXRlLmNwcApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkZhc3RUaHJlYWREdW1wU3RhdGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitGYXN0VGhyZWFkRHVtcFN0YXRlOjpGYXN0VGhyZWFkRHVtcFN0YXRlKCkgOgorICAgIG1Db21tYW5kKEZhc3RUaHJlYWRTdGF0ZTo6SU5JVElBTCksIG1VbmRlcnJ1bnMoMCksIG1PdmVycnVucygwKSwKKyAgICAvKiBtTWVhc3VyZWRXYXJtdXBUcyh7MCwgMH0pLCAqLworICAgIG1XYXJtdXBDeWNsZXMoMCkKKyNpZmRlZiBGQVNUX1RIUkVBRF9TVEFUSVNUSUNTCisgICAgLCBtU2FtcGxpbmdOKDApLCBtQm91bmRzKDApCisjZW5kaWYKK3sKKyAgICBtTWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgPSAwOworICAgIG1NZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgPSAwOworI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKKyAgICBpbmNyZWFzZVNhbXBsaW5nTigxKTsKKyNlbmRpZgorfQorCitGYXN0VGhyZWFkRHVtcFN0YXRlOjp+RmFzdFRocmVhZER1bXBTdGF0ZSgpCit7Cit9CisKKyNpZmRlZiBGQVNUX1RIUkVBRF9TVEFUSVNUSUNTCit2b2lkIEZhc3RUaHJlYWREdW1wU3RhdGU6OmluY3JlYXNlU2FtcGxpbmdOKHVpbnQzMl90IHNhbXBsaW5nTikKK3sKKyAgICBpZiAoc2FtcGxpbmdOIDw9IG1TYW1wbGluZ04gfHwgc2FtcGxpbmdOID4ga1NhbXBsaW5nTiB8fCByb3VuZHVwKHNhbXBsaW5nTikgIT0gc2FtcGxpbmdOKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdWludDMyX3QgYWRkaXRpb25hbCA9IHNhbXBsaW5nTiAtIG1TYW1wbGluZ047CisgICAgLy8gc2FtcGxlIGFycmF5cyBhcmVuJ3QgYWNjZXNzZWQgYXRvbWljYWxseSB3aXRoIHJlc3BlY3QgdG8gdGhlIGJvdW5kcywKKyAgICAvLyBzbyBjbGVhcmluZyByZWR1Y2VzIGNoYW5jZSBmb3IgZHVtcHN5cyB0byByZWFkIHJhbmRvbSB1bmluaXRpYWxpemVkIHNhbXBsZXMKKyAgICBtZW1zZXQoJm1Nb25vdG9uaWNOc1ttU2FtcGxpbmdOXSwgMCwgc2l6ZW9mKG1Nb25vdG9uaWNOc1swXSkgKiBhZGRpdGlvbmFsKTsKKyAgICBtZW1zZXQoJm1Mb2FkTnNbbVNhbXBsaW5nTl0sIDAsIHNpemVvZihtTG9hZE5zWzBdKSAqIGFkZGl0aW9uYWwpOworI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUworICAgIG1lbXNldCgmbUNwdWtIelttU2FtcGxpbmdOXSwgMCwgc2l6ZW9mKG1DcHVrSHpbMF0pICogYWRkaXRpb25hbCk7CisjZW5kaWYKKyAgICBtU2FtcGxpbmdOID0gc2FtcGxpbmdOOworfQorI2VuZGlmCisKK30gICAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZER1bXBTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWREdW1wU3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2UwOTE0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWREdW1wU3RhdGUuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX0ZBU1RfVEhSRUFEX0RVTVBfU1RBVEVfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX0ZBU1RfVEhSRUFEX0RVTVBfU1RBVEVfSAorCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgIkZhc3RUaHJlYWRTdGF0ZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIFRoZSBGYXN0VGhyZWFkRHVtcFN0YXRlIGtlZXBzIGEgY2FjaGUgb2YgRmFzdFRocmVhZCBzdGF0aXN0aWNzIHRoYXQgY2FuIGJlIGxvZ2dlZCBieSBkdW1wc3lzLgorLy8gRWFjaCBpbmRpdmlkdWFsIG5hdGl2ZSB3b3JkLXNpemVkIGZpZWxkIGlzIGFjY2Vzc2VkIGF0b21pY2FsbHkuICBCdXQgdGhlCisvLyBvdmVyYWxsIHN0cnVjdHVyZSBpcyBub24tYXRvbWljLCB0aGF0IGlzIHRoZXJlIG1heSBiZSBhbiBpbmNvbnNpc3RlbmN5IGJldHdlZW4gZmllbGRzLgorLy8gTm8gYmFycmllcnMgb3IgbG9ja3MgYXJlIHVzZWQgZm9yIGVpdGhlciB3cml0aW5nIG9yIHJlYWRpbmcuCisvLyBPbmx5IFBPRCB0eXBlcyBhcmUgcGVybWl0dGVkLCBhbmQgdGhlIGNvbnRlbnRzIHNob3VsZG4ndCBiZSB0cnVzdGVkIChpLmUuIGRvIHJhbmdlIGNoZWNrcykuCisvLyBJdCBoYXMgYSBkaWZmZXJlbnQgbGlmZXRpbWUgdGhhbiB0aGUgRmFzdFRocmVhZCwgYW5kIHNvIGl0IGNhbid0IGJlIGEgbWVtYmVyIG9mIEZhc3RUaHJlYWQuCitzdHJ1Y3QgRmFzdFRocmVhZER1bXBTdGF0ZSB7CisgICAgRmFzdFRocmVhZER1bXBTdGF0ZSgpOworICAgIC8qdmlydHVhbCovIH5GYXN0VGhyZWFkRHVtcFN0YXRlKCk7CisKKyAgICBGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQgbUNvbW1hbmQ7ICAgLy8gY3VycmVudCBjb21tYW5kCisgICAgdWludDMyX3QgbVVuZGVycnVuczsgICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiB1bmRlcnJ1bnMKKyAgICB1aW50MzJfdCBtT3ZlcnJ1bnM7ICAgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIG92ZXJydW5zCisgICAgc3RydWN0IHRpbWVzcGVjIG1NZWFzdXJlZFdhcm11cFRzOyAgLy8gbWVhc3VyZWQgd2FybXVwIHRpbWUKKyAgICB1aW50MzJfdCBtV2FybXVwQ3ljbGVzOyAgICAgLy8gbnVtYmVyIG9mIGxvb3AgY3ljbGVzIHJlcXVpcmVkIHRvIHdhcm11cAorCisjaWZkZWYgRkFTVF9USFJFQURfU1RBVElTVElDUworICAgIC8vIFJlY2VudGx5IGNvbGxlY3RlZCBzYW1wbGVzIG9mIHBlci1jeWNsZSBtb25vdG9uaWMgdGltZSwgdGhyZWFkIENQVSB0aW1lLCBhbmQgQ1BVIGZyZXF1ZW5jeS4KKyAgICAvLyBrU2FtcGxpbmdOIGlzIG1heCBzaXplIG9mIHNhbXBsaW5nIGZyYW1lIChzdGF0aXN0aWNzKSwgYW5kIG11c3QgYmUgYSBwb3dlciBvZiAyIDw9IDB4ODAwMC4KKyAgICAvLyBUaGUgc2FtcGxlIGFycmF5cyBhcmUgdmlydHVhbGx5IGFsbG9jYXRlZCBiYXNlZCBvbiB0aGlzIGNvbXBpbGUtdGltZSBjb25zdGFudCwKKyAgICAvLyBidXQgYXJlIG9ubHkgaW5pdGlhbGl6ZWQgYW5kIHVzZWQgYmFzZWQgb24gdGhlIHJ1bnRpbWUgcGFyYW1ldGVyIG1TYW1wbGluZ04uCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtTYW1wbGluZ04gPSAweDgwMDA7CisgICAgLy8gQ29tcGlsZS10aW1lIGNvbnN0YW50IGZvciBhICJsb3cgUkFNIGRldmljZSIsIG11c3QgYmUgYSBwb3dlciBvZiAyIDw9IGtTYW1wbGluZ04uCisgICAgLy8gVGhpcyB2YWx1ZSB3YXMgY2hvc2VuIHN1Y2ggdGhhdCBlYWNoIGFycmF5IHVzZXMgMSBzbWFsbCBwYWdlICg0IEtieXRlcykuCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtTYW1wbGluZ05mb3JMb3dSYW1EZXZpY2UgPSAweDQwMDsKKyAgICAvLyBDb3JyZXNwb25kaW5nIHJ1bnRpbWUgbWF4aW11bSBzaXplIG9mIHNhbXBsZSBhcnJheXMsIG11c3QgYmUgYSBwb3dlciBvZiAyIDw9IGtTYW1wbGluZ04uCisgICAgdWludDMyX3QgbVNhbXBsaW5nTjsKKyAgICAvLyBUaGUgYm91bmRzIGRlZmluZSB0aGUgaW50ZXJ2YWwgb2YgdmFsaWQgc2FtcGxlcywgYW5kIGFyZSByZXByZXNlbnRlZCBhcyBmb2xsb3dzOgorICAgIC8vICAgICAgbmV3ZXN0IG9wZW4gKGV4Y2x1ZGVkKSBlbmRwb2ludCAgID0gbG93ZXIgMTYgYml0cyBvZiBib3VuZHMsIG1vZHVsbyBOCisgICAgLy8gICAgICBvbGRlc3QgY2xvc2VkIChpbmNsdWRlZCkgZW5kcG9pbnQgPSB1cHBlciAxNiBiaXRzIG9mIGJvdW5kcywgbW9kdWxvIE4KKyAgICAvLyBOdW1iZXIgb2YgdmFsaWQgc2FtcGxlcyBpcyBuZXdlc3QgLSBvbGRlc3QuCisgICAgdWludDMyX3QgbUJvdW5kczsgICAgICAgICAgICAgICAgICAgLy8gYm91bmRzIGZvciBtTW9ub3RvbmljTnMsIG1UaHJlYWRDcHVOcywgYW5kIG1DcHVrSHoKKyAgICAvLyBUaGUgZWxlbWVudHMgaW4gdGhlICpOcyBhcnJheXMgYXJlIGluIHVuaXRzIG9mIG5hbm9zZWNvbmRzIDw9IDM5OTk5OTk5OTkuCisgICAgdWludDMyX3QgbU1vbm90b25pY05zW2tTYW1wbGluZ05dOyAgLy8gZGVsdGEgbW9ub3RvbmljICh3YWxsIGNsb2NrKSB0aW1lCisgICAgdWludDMyX3QgbUxvYWROc1trU2FtcGxpbmdOXTsgICAgICAgLy8gZGVsdGEgQ1BVIGxvYWQgaW4gdGltZQorI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUworICAgIHVpbnQzMl90IG1DcHVrSHpba1NhbXBsaW5nTl07ICAgICAgIC8vIGFic29sdXRlIENQVSBjbG9jayBmcmVxdWVuY3kgaW4ga0h6LCBiaXRzIDAtMyBhcmUgQ1BVIworI2VuZGlmCisKKyAgICAvLyBJbmNyZWFzZSBzYW1wbGluZyB3aW5kb3cgYWZ0ZXIgY29uc3RydWN0aW9uLCBtdXN0IGJlIGEgcG93ZXIgb2YgMiA8PSBrU2FtcGxpbmdOCisgICAgdm9pZCAgICBpbmNyZWFzZVNhbXBsaW5nTih1aW50MzJfdCBzYW1wbGluZ04pOworI2VuZGlmCisKK307ICAvLyBzdHJ1Y3QgRmFzdFRocmVhZER1bXBTdGF0ZQorCit9ICAgLy8gYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQVVESU9fRkFTVF9USFJFQURfRFVNUF9TVEFURV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZFN0YXRlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkU3RhdGUuY3BwCmluZGV4IDY5OTQ4NzIuLmFkNWYzMWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkU3RhdGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkU3RhdGUuY3BwCkBAIC0yOSwyMSArMjksMTYgQEAKIHsKIH0KIAotCi1GYXN0VGhyZWFkRHVtcFN0YXRlOjpGYXN0VGhyZWFkRHVtcFN0YXRlKCkgOgotICAgIG1Db21tYW5kKEZhc3RUaHJlYWRTdGF0ZTo6SU5JVElBTCksIG1VbmRlcnJ1bnMoMCksIG1PdmVycnVucygwKSwKLSAgICAvKiBtTWVhc3VyZWRXYXJtdXBUcyh7MCwgMH0pLCAqLwotICAgIG1XYXJtdXBDeWNsZXMoMCkKLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICAsIG1TYW1wbGluZ04oMSksIG1Cb3VuZHMoMCkKLSNlbmRpZgorLy8gc3RhdGljCitjb25zdCBjaGFyICpGYXN0VGhyZWFkU3RhdGU6OmNvbW1hbmRUb1N0cmluZyhGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQgY29tbWFuZCkKIHsKLSAgICBtTWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgPSAwOwotICAgIG1NZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgPSAwOwotfQotCi1GYXN0VGhyZWFkRHVtcFN0YXRlOjp+RmFzdFRocmVhZER1bXBTdGF0ZSgpCi17CisgICAgc3dpdGNoIChjb21tYW5kKSB7CisgICAgY2FzZSBGYXN0VGhyZWFkU3RhdGU6OklOSVRJQUw6ICAgICAgcmV0dXJuICJJTklUSUFMIjsKKyAgICBjYXNlIEZhc3RUaHJlYWRTdGF0ZTo6SE9UX0lETEU6ICAgICByZXR1cm4gIkhPVF9JRExFIjsKKyAgICBjYXNlIEZhc3RUaHJlYWRTdGF0ZTo6Q09MRF9JRExFOiAgICByZXR1cm4gIkNPTERfSURMRSI7CisgICAgY2FzZSBGYXN0VGhyZWFkU3RhdGU6OkVYSVQ6ICAgICAgICAgcmV0dXJuICJFWElUIjsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWRTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWRTdGF0ZS5oCmluZGV4IDFhYjhhMGEuLmYxOGY4NDYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkU3RhdGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZFN0YXRlLmgKQEAgLTQ2LDQzICs0NiwxMCBAQAogICAgIEZhc3RUaHJlYWREdW1wU3RhdGUqIG1EdW1wU3RhdGU7IC8vIGlmIG5vbi1OVUxMLCB0aGVuIHVwZGF0ZSBkdW1wIHN0YXRlIHBlcmlvZGljYWxseQogICAgIE5CTG9nOjpXcml0ZXIqIG1OQkxvZ1dyaXRlcjsgLy8gbm9uLWJsb2NraW5nIGxvZ2dlcgogCisgICAgLy8gcmV0dXJucyBOVUxMIGlmIGNvbW1hbmQgYmVsb25ncyB0byBhIHN1YmNsYXNzCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbW1hbmRUb1N0cmluZyhDb21tYW5kIGNvbW1hbmQpOwogfTsgIC8vIHN0cnVjdCBGYXN0VGhyZWFkU3RhdGUKIAotCi0vLyBGSVhNRSBleHRyYWN0IGNvbW1vbiBwYXJ0IG9mIGNvbW1lbnQgYXQgRmFzdE1peGVyRHVtcFN0YXRlCi1zdHJ1Y3QgRmFzdFRocmVhZER1bXBTdGF0ZSB7Ci0gICAgRmFzdFRocmVhZER1bXBTdGF0ZSgpOwotICAgIC8qdmlydHVhbCovIH5GYXN0VGhyZWFkRHVtcFN0YXRlKCk7Ci0KLSAgICBGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQgbUNvbW1hbmQ7ICAgLy8gY3VycmVudCBjb21tYW5kCi0gICAgdWludDMyX3QgbVVuZGVycnVuczsgICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiB1bmRlcnJ1bnMKLSAgICB1aW50MzJfdCBtT3ZlcnJ1bnM7ICAgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIG92ZXJydW5zCi0gICAgc3RydWN0IHRpbWVzcGVjIG1NZWFzdXJlZFdhcm11cFRzOyAgLy8gbWVhc3VyZWQgd2FybXVwIHRpbWUKLSAgICB1aW50MzJfdCBtV2FybXVwQ3ljbGVzOyAgICAgLy8gbnVtYmVyIG9mIGxvb3AgY3ljbGVzIHJlcXVpcmVkIHRvIHdhcm11cAotCi0jaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgLy8gUmVjZW50bHkgY29sbGVjdGVkIHNhbXBsZXMgb2YgcGVyLWN5Y2xlIG1vbm90b25pYyB0aW1lLCB0aHJlYWQgQ1BVIHRpbWUsIGFuZCBDUFUgZnJlcXVlbmN5LgotICAgIC8vIGtTYW1wbGluZ04gaXMgbWF4IHNpemUgb2Ygc2FtcGxpbmcgZnJhbWUgKHN0YXRpc3RpY3MpLCBhbmQgbXVzdCBiZSBhIHBvd2VyIG9mIDIgPD0gMHg4MDAwLgotICAgIC8vIFRoZSBzYW1wbGUgYXJyYXlzIGFyZSB2aXJ0dWFsbHkgYWxsb2NhdGVkIGJhc2VkIG9uIHRoaXMgY29tcGlsZS10aW1lIGNvbnN0YW50LAotICAgIC8vIGJ1dCBhcmUgb25seSBpbml0aWFsaXplZCBhbmQgdXNlZCBiYXNlZCBvbiB0aGUgcnVudGltZSBwYXJhbWV0ZXIgbVNhbXBsaW5nTi4KLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1NhbXBsaW5nTiA9IDB4ODAwMDsKLSAgICAvLyBDb3JyZXNwb25kaW5nIHJ1bnRpbWUgbWF4aW11bSBzaXplIG9mIHNhbXBsZSBhcnJheXMsIG11c3QgYmUgYSBwb3dlciBvZiAyIDw9IGtTYW1wbGluZ04uCi0gICAgdWludDMyX3QgbVNhbXBsaW5nTjsKLSAgICAvLyBUaGUgYm91bmRzIGRlZmluZSB0aGUgaW50ZXJ2YWwgb2YgdmFsaWQgc2FtcGxlcywgYW5kIGFyZSByZXByZXNlbnRlZCBhcyBmb2xsb3dzOgotICAgIC8vICAgICAgbmV3ZXN0IG9wZW4gKGV4Y2x1ZGVkKSBlbmRwb2ludCAgID0gbG93ZXIgMTYgYml0cyBvZiBib3VuZHMsIG1vZHVsbyBOCi0gICAgLy8gICAgICBvbGRlc3QgY2xvc2VkIChpbmNsdWRlZCkgZW5kcG9pbnQgPSB1cHBlciAxNiBiaXRzIG9mIGJvdW5kcywgbW9kdWxvIE4KLSAgICAvLyBOdW1iZXIgb2YgdmFsaWQgc2FtcGxlcyBpcyBuZXdlc3QgLSBvbGRlc3QuCi0gICAgdWludDMyX3QgbUJvdW5kczsgICAgICAgICAgICAgICAgICAgLy8gYm91bmRzIGZvciBtTW9ub3RvbmljTnMsIG1UaHJlYWRDcHVOcywgYW5kIG1DcHVrSHoKLSAgICAvLyBUaGUgZWxlbWVudHMgaW4gdGhlICpOcyBhcnJheXMgYXJlIGluIHVuaXRzIG9mIG5hbm9zZWNvbmRzIDw9IDM5OTk5OTk5OTkuCi0gICAgdWludDMyX3QgbU1vbm90b25pY05zW2tTYW1wbGluZ05dOyAgLy8gZGVsdGEgbW9ub3RvbmljICh3YWxsIGNsb2NrKSB0aW1lCi0gICAgdWludDMyX3QgbUxvYWROc1trU2FtcGxpbmdOXTsgICAgICAgLy8gZGVsdGEgQ1BVIGxvYWQgaW4gdGltZQotI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwotICAgIHVpbnQzMl90IG1DcHVrSHpba1NhbXBsaW5nTl07ICAgICAgIC8vIGFic29sdXRlIENQVSBjbG9jayBmcmVxdWVuY3kgaW4ga0h6LCBiaXRzIDAtMyBhcmUgQ1BVIwotI2VuZGlmCi0jZW5kaWYKLQotfTsgIC8vIHN0cnVjdCBGYXN0VGhyZWFkRHVtcFN0YXRlCi0KIH0gICAvLyBhbmRyb2lkCiAKICNlbmRpZiAgLy8gQU5EUk9JRF9BVURJT19GQVNUX1RIUkVBRF9TVEFURV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKaW5kZXggNGYwYzZiMS4uZjYwNzhhMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcApAQCAtMjAwLDI2ICsyMDAsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGxpbWl0IHRvIGNvbm5lY3Rpb25zIGJldHdlZW4gZGV2aWNlcyBhbmQgaW5wdXQgc3RyZWFtcyBmb3IgSEFMIGJlZm9yZSAzLjAKLSAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLmV4dC5taXguaHdfbW9kdWxlID09IHNyY01vZHVsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvSHdEZXZpY2UtPnZlcnNpb24oKSA8IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX01JWCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBpbnZhbGlkIHNpbmsgdHlwZSAlZCBmb3IgZGV2aWNlIHNvdXJjZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS50eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9IHNyY01vZHVsZSkgewotICAgICAgICAgICAgICAgIC8vIGxpbWl0IHRvIGRldmljZSB0byBkZXZpY2UgY29ubmVjdGlvbiBpZiBub3Qgb24gc2FtZSBodyBtb2R1bGUKLSAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGludmFsaWQgc2luayB0eXBlIGZvciBjcm9zcyBodyBtb2R1bGUiKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIG51bSBzb3VyY2VzID09IDIgLT0+IHJldXNlIGFuIGV4aXRpbmcgb3V0cHV0IG1peCB0byBjb25uZWN0IHRvIHRoZQotICAgICAgICAgICAgICAgIC8vIHNpbmsKKyAgICAgICAgICAgIC8vIG1hbmFnZSBwYXRjaGVzIHJlcXVpcmluZyBhIHNvZnR3YXJlIGJyaWRnZQorICAgICAgICAgICAgLy8gLSBEZXZpY2UgdG8gZGV2aWNlIEFORAorICAgICAgICAgICAgLy8gICAgLSBzb3VyY2UgSFcgbW9kdWxlICE9IGRlc3RpbmF0aW9uIEhXIG1vZHVsZSBPUgorICAgICAgICAgICAgLy8gICAgLSBhdWRpbyBIQUwgdmVyc2lvbiA8IDMuMAorICAgICAgICAgICAgLy8gICAgLSBzcGVjaWFsIHBhdGNoIHJlcXVlc3Qgd2l0aCAyIHNvdXJjZXMgKHJldXNlIG9uZSBleGlzdGluZyBvdXRwdXQgbWl4KQorICAgICAgICAgICAgaWYgKChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSAmJgorICAgICAgICAgICAgICAgICAgICAoKHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPSBzcmNNb2R1bGUpIHx8CisgICAgICAgICAgICAgICAgICAgIChhdWRpb0h3RGV2aWNlLT52ZXJzaW9uKCkgPCBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB8fAorICAgICAgICAgICAgICAgICAgICAocGF0Y2gtPm51bV9zb3VyY2VzID09IDIpKSkgewogICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+bnVtX3NvdXJjZXMgPT0gMikgewogICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNvdXJjZXNbMV0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfTUlYIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9CkBAIC0yODMsNTIgKzI3NCwyOSBAQAogICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoYXVkaW9Id0RldmljZS0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tSZWNvcmRUaHJlYWRfbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGJhZCBjYXB0dXJlIEkvTyBoYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHBhdGNoLCAmaGFsSGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldmljZSA9IGF1ZGlvSHdEZXZpY2UtPmh3RGV2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+Y3JlYXRlX2F1ZGlvX3BhdGNoKGh3RGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm51bV9zb3VyY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bnVtX3NpbmtzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbEhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CiAgICAgICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tSZWNvcmRUaHJlYWRfbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGJhZCBjYXB0dXJlIEkvTyBoYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgKmFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAocGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5hZGRyZXNzLCAiIikgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gKGNoYXIgKiljYWxsb2MoMSwgMSk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudChwYXRjaCwgJmhhbEhhbmRsZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvSHdEZXZpY2UtPnZlcnNpb24oKSA8IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoU3RyaW5nOChhZGRyZXNzKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fUk9VVElORyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fSU5QVVRfU09VUkNFKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgQVVESU9fUE9SVF9UWVBFX0RFVklDRSBzZXRQYXJhbWV0ZXJzICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS50b1N0cmluZygpLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldmljZSA9IGF1ZGlvSHdEZXZpY2UtPmh3RGV2aWNlKCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGh3RGV2aWNlLT5jcmVhdGVfYXVkaW9fcGF0Y2goaHdEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5udW1fc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5udW1fc2lua3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbEhhbmRsZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGJyZWFrOwpAQCAtMzQxLDYgKzMwOSw3IEBACiAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gbGltaXQgdG8gY29ubmVjdGlvbnMgYmV0d2VlbiBkZXZpY2VzIGFuZCBvdXRwdXQgc3RyZWFtcworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBpbnZhbGlkIHNpbmsgdHlwZSAlZCBmb3IgbWl4IHNvdXJjZSIsCkBAIC0zNTMsOCArMzIyLDggQEAKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHR5cGUgfD0gcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KTsKICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9mbGluZ2VyLT5jaGVja1BsYXliYWNrVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7CkBAIC0zNjMsMjggKzMzMiwxNCBAQAogICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXVkaW9Id0RldmljZS0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnQocGF0Y2gsICZoYWxIYW5kbGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IEFVRElPX0RFVklDRV9OT05FOwotICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGUgfD0gcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2hhciAqYWRkcmVzczsKLSAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmFkZHJlc3MsICIiKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vRklYTUU6IHdlIG9ubHkgc3VwcG9ydCBhZGRyZXNzIG9uIGZpcnN0IHNpbmsgd2l0aCBIQUwgdmVyc2lvbiA8IDMuMAotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gYXVkaW9fZGV2aWNlX2FkZHJlc3NfdG9fcGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IChjaGFyICopY2FsbG9jKDEsIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKFN0cmluZzgoYWRkcmVzcykpOwotICAgICAgICAgICAgICAgIGZyZWUoYWRkcmVzcyk7CisgICAgICAgICAgICBpZiAodGhyZWFkID09IGF1ZGlvZmxpbmdlci0+cHJpbWFyeVBsYXliYWNrVGhyZWFkX2woKSkgeworICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKICAgICAgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1JPVVRJTkcpLCAoaW50KXR5cGUpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKKworICAgICAgICAgICAgICAgIGF1ZGlvZmxpbmdlci0+YnJvYWNhc3RQYXJhbWV0ZXJzVG9SZWNvcmRUaHJlYWRzX2wocGFyYW0udG9TdHJpbmcoKSk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudChwYXRjaCwgJmhhbEhhbmRsZSk7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CkBAIC00NzIsNiArNDI3LDcgQEAKICAgICAvLyB0aGlzIHRyYWNrIGlzIGdpdmVuIHRoZSBzYW1lIGJ1ZmZlciBhcyB0aGUgUGF0Y2hSZWNvcmQgYnVmZmVyCiAgICAgcGF0Y2gtPm1QYXRjaFRyYWNrID0gbmV3IFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5tUGxheWJhY2tUaHJlYWQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9QYXRjaC0+c291cmNlc1sxXS5leHQubWl4LnVzZWNhc2Uuc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Q2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LApAQCAtNTI1LDIyICs0ODEsMzEgQEAKICAgICBpZiAocGF0Y2gtPm1SZWNvcmRUaHJlYWQgIT0gMCkgewogICAgICAgICBpZiAocGF0Y2gtPm1QYXRjaFJlY29yZCAhPSAwKSB7CiAgICAgICAgICAgICBwYXRjaC0+bVJlY29yZFRocmVhZC0+ZGVsZXRlUGF0Y2hSZWNvcmQocGF0Y2gtPm1QYXRjaFJlY29yZCk7Ci0gICAgICAgICAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLmNsZWFyKCk7CiAgICAgICAgIH0KICAgICAgICAgYXVkaW9mbGluZ2VyLT5jbG9zZUlucHV0SW50ZXJuYWxfbChwYXRjaC0+bVJlY29yZFRocmVhZCk7Ci0gICAgICAgIHBhdGNoLT5tUmVjb3JkVGhyZWFkLmNsZWFyKCk7CiAgICAgfQogICAgIGlmIChwYXRjaC0+bVBsYXliYWNrVGhyZWFkICE9IDApIHsKICAgICAgICAgaWYgKHBhdGNoLT5tUGF0Y2hUcmFjayAhPSAwKSB7CiAgICAgICAgICAgICBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5kZWxldGVQYXRjaFRyYWNrKHBhdGNoLT5tUGF0Y2hUcmFjayk7Ci0gICAgICAgICAgICBwYXRjaC0+bVBhdGNoVHJhY2suY2xlYXIoKTsKICAgICAgICAgfQogICAgICAgICAvLyBpZiBudW0gc291cmNlcyA9PSAyIHdlIGFyZSByZXVzaW5nIGFuIGV4aXN0aW5nIHBsYXliYWNrIHRocmVhZCBzbyB3ZSBkbyBub3QgY2xvc2UgaXQKICAgICAgICAgaWYgKHBhdGNoLT5tQXVkaW9QYXRjaC5udW1fc291cmNlcyAhPSAyKSB7CiAgICAgICAgICAgICBhdWRpb2ZsaW5nZXItPmNsb3NlT3V0cHV0SW50ZXJuYWxfbChwYXRjaC0+bVBsYXliYWNrVGhyZWFkKTsKICAgICAgICAgfQorICAgIH0KKyAgICBpZiAocGF0Y2gtPm1SZWNvcmRUaHJlYWQgIT0gMCkgeworICAgICAgICBpZiAocGF0Y2gtPm1QYXRjaFJlY29yZCAhPSAwKSB7CisgICAgICAgICAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgcGF0Y2gtPm1SZWNvcmRUaHJlYWQuY2xlYXIoKTsKKyAgICB9CisgICAgaWYgKHBhdGNoLT5tUGxheWJhY2tUaHJlYWQgIT0gMCkgeworICAgICAgICBpZiAocGF0Y2gtPm1QYXRjaFRyYWNrICE9IDApIHsKKyAgICAgICAgICAgIHBhdGNoLT5tUGF0Y2hUcmFjay5jbGVhcigpOworICAgICAgICB9CiAgICAgICAgIHBhdGNoLT5tUGxheWJhY2tUaHJlYWQuY2xlYXIoKTsKICAgICB9CisKIH0KIAogLyogRGlzY29ubmVjdCBhIHBhdGNoICovCkBAIC01NzgsNDIgKzU0MywzMCBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSAmJgotICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUgIT0gc3JjTW9kdWxlKSB7CisgICAgICAgICAgICBpZiAocmVtb3ZlZFBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUgfHwKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZFBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgICAgIGNsZWFyUGF0Y2hDb25uZWN0aW9ucyhyZW1vdmVkUGF0Y2gpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgICAgICBpZiAoYXVkaW9Id0RldmljZS0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKLSAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgewotICAgICAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBhdWRpb2ZsaW5nZXItPmNoZWNrUmVjb3JkVGhyZWFkX2woCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coInJlbGVhc2VBdWRpb1BhdGNoKCkgYmFkIGNhcHR1cmUgSS9PIGhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudChyZW1vdmVkUGF0Y2gtPm1IYWxIYW5kbGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldmljZSA9IGF1ZGlvSHdEZXZpY2UtPmh3RGV2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGh3RGV2aWNlLT5yZWxlYXNlX2F1ZGlvX3BhdGNoKGh3RGV2aWNlLCByZW1vdmVkUGF0Y2gtPm1IYWxIYW5kbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgewogICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tSZWNvcmRUaHJlYWRfbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygicmVsZWFzZUF1ZGlvUGF0Y2goKSBiYWQgY2FwdHVyZSBJL08gaGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOwotICAgICAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fUk9VVElORyksIDApOwotICAgICAgICAgICAgICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCgpIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0Ugc2V0UGFyYW1ldGVycyAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0udG9TdHJpbmcoKS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQocmVtb3ZlZFBhdGNoLT5tSGFsSGFuZGxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICAgICAgICAgIGlmIChhdWRpb0h3RGV2aWNlLT52ZXJzaW9uKCkgPCBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlID0gYXVkaW9Id0RldmljZS0+aHdEZXZpY2UoKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+cmVsZWFzZV9hdWRpb19wYXRjaChod0RldmljZSwgcmVtb3ZlZFBhdGNoLT5tSGFsSGFuZGxlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfTUlYOiB7CkBAIC02MzIsMTQgKzU4NSw3IEBACiAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICAgICAgaWYgKGF1ZGlvSHdEZXZpY2UtPnZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudChyZW1vdmVkUGF0Y2gtPm1IYWxIYW5kbGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKLSAgICAgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1JPVVRJTkcpLCAwKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHJlbW92ZWRQYXRjaC0+bUhhbEhhbmRsZSk7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CkBAIC02OTMsNSArNjM5LDQgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmgKaW5kZXggZWU0ODI3Ni4uN2JjNmYwYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmgKQEAgLTE1NiwxMCArMTU2LDYgQEAKICAgICBib29sICAgICAgICAgICAgICAgIG1SZXN1bWVUb1N0b3BwaW5nOyAvLyB0cmFjayB3YXMgcGF1c2VkIGluIHN0b3BwaW5nIHN0YXRlLgogICAgIGJvb2wgICAgICAgICAgICAgICAgbUZsdXNoSHdQZW5kaW5nOyAvLyB0cmFjayByZXF1ZXN0cyBmb3IgdGhyZWFkIGZsdXNoCiAKLSAgICAvLyBmb3IgbGFzdCBjYWxsIHRvIGdldFRpbWVzdGFtcAotICAgIGJvb2wgICAgICAgICAgICAgICAgbVByZXZpb3VzVmFsaWQ7Ci0gICAgdWludDMyX3QgICAgICAgICAgICBtUHJldmlvdXNGcmFtZXNXcml0dGVuOwotICAgIEF1ZGlvVGltZXN0YW1wICAgICAgbVByZXZpb3VzVGltZXN0YW1wOwogfTsgIC8vIGVuZCBvZiBUcmFjawogCiBjbGFzcyBUaW1lZFRyYWNrIDogcHVibGljIFRyYWNrIHsKQEAgLTI1NSw3ICsyNTEsNyBAQAogCiAgICAgY2xhc3MgQnVmZmVyIDogcHVibGljIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciB7CiAgICAgcHVibGljOgotICAgICAgICBpbnQxNl90ICptQnVmZmVyOworICAgICAgICB2b2lkICptQnVmZmVyOwogICAgIH07CiAKICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFRyYWNrKFBsYXliYWNrVGhyZWFkICp0aHJlYWQsCkBAIC0yNzEsNyArMjY3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmlnZ2VyU2Vzc2lvbiA9IDApOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgc3RvcCgpOwotICAgICAgICAgICAgYm9vbCAgICAgICAgd3JpdGUoaW50MTZfdCogZGF0YSwgdWludDMyX3QgZnJhbWVzKTsKKyAgICAgICAgICAgIGJvb2wgICAgICAgIHdyaXRlKHZvaWQqIGRhdGEsIHVpbnQzMl90IGZyYW1lcyk7CiAgICAgICAgICAgICBib29sICAgICAgICBidWZmZXJRdWV1ZUVtcHR5KCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlclF1ZXVlLnNpemUoKSA9PSAwOyB9CiAgICAgICAgICAgICBib29sICAgICAgICBpc0FjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIG1BY3RpdmU7IH0KICAgICBjb25zdCB3cDxUaHJlYWRCYXNlPiYgdGhyZWFkKCkgY29uc3QgeyByZXR1cm4gbVRocmVhZDsgfQpAQCAtMjk3LDYgKzI5Myw3IEBACiBwdWJsaWM6CiAKICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGNoVHJhY2soUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKaW5kZXggMjA0YTlkNi4uMjVkNmQ5NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaApAQCAtMzQsNiArMzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja190eXBlIHR5cGUpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflJlY29yZFRyYWNrKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBpbml0Q2hlY2soKSBjb25zdDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCwgaW50IHRyaWdnZXJTZXNzaW9uKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHN0b3AoKTsKQEAgLTY2LDIxICs2Nyw2IEBACiAKICAgICBib29sICAgICAgICAgICAgICAgIG1PdmVyZmxvdzsgIC8vIG92ZXJmbG93IG9uIG1vc3QgcmVjZW50IGF0dGVtcHQgdG8gZmlsbCBjbGllbnQgYnVmZmVyCiAKLSAgICAgICAgICAgLy8gdXBkYXRlZCBieSBSZWNvcmRUaHJlYWQ6OnJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpCi0gICAgICAgICAgICBBdWRpb1Jlc2FtcGxlciAgICAgICAgICAgICAgICAgICAgICAqbVJlc2FtcGxlcjsKLQotICAgICAgICAgICAgLy8gaW50ZXJsZWF2ZWQgc3RlcmVvIHBhaXJzIG9mIGZpeGVkLXBvaW50IFE0LjI3Ci0gICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbVJzbXBPdXRCdWZmZXI7Ci0gICAgICAgICAgICAvLyBjdXJyZW50IGFsbG9jYXRlZCBmcmFtZSBjb3VudCBmb3IgdGhlIGFib3ZlLCB3aGljaCBtYXkgYmUgbGFyZ2VyIHRoYW4gbmVlZGVkCi0gICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcE91dEZyYW1lQ291bnQ7Ci0KLSAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wSW5VbnJlbDsgICAvLyB1bnJlbGVhc2VkIGZyYW1lcyByZW1haW5pbmcgZnJvbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vc3QgcmVjZW50IGdldE5leHRCdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZGVidWcgb25seQotCi0gICAgICAgICAgICAvLyByb2xsaW5nIGNvdW50ZXIgdGhhdCBpcyBuZXZlciBjbGVhcmVkCi0gICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcEluRnJvbnQ7ICAgLy8gbmV4dCBhdmFpbGFibGUgZnJhbWUKLQogICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIG1TaW5rOyAgLy8gcmVmZXJlbmNlcyBjbGllbnQncyBidWZmZXIgc2luayBpbiBzaGFyZWQgbWVtb3J5CiAKICAgICAgICAgICAgIC8vIHN5bmMgZXZlbnQgdHJpZ2dlcmluZyBhY3R1YWwgYXVkaW8gY2FwdHVyZS4gRnJhbWVzIHJlYWQgYmVmb3JlIHRoaXMgZXZlbnQgd2lsbApAQCAtOTMsNyArNzksMTAgQEAKICAgICAgICAgICAgIHNzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNUb0Ryb3A7CiAKICAgICAgICAgICAgIC8vIHVzZWQgYnkgcmVzYW1wbGVyIHRvIGZpbmQgc291cmNlIGZyYW1lcwotICAgICAgICAgICAgUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIgKm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlcjsKKyAgICAgICAgICAgIFJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyICAgICAgICAgICAgKm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlcjsKKworICAgICAgICAgICAgLy8gdXNlZCBieSB0aGUgcmVjb3JkIHRocmVhZCB0byBjb252ZXJ0IGZyYW1lcyB0byBwcm9wZXIgZGVzdGluYXRpb24gZm9ybWF0CisgICAgICAgICAgICBSZWNvcmRCdWZmZXJDb252ZXJ0ZXIgICAgICAgICAgICAgICptUmVjb3JkQnVmZmVyQ29udmVydGVyOwogfTsKIAogLy8gcGxheWJhY2sgdHJhY2ssIHVzZWQgYnkgUGF0Y2hQYW5lbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwCmluZGV4IGZhZTE5YTEuLjJlNjhkYWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAKQEAgLTE0LDYxICsxNCwxMTkgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxiaW5kZXIvQXBwT3BzTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNhY2hlLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAjaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgogCisvKiBXaGVuIHBlcmZvcm1pbmcgcGVybWlzc2lvbiBjaGVja3Mgd2UgZG8gbm90IHVzZSBwZXJtaXNzaW9uIGNhY2hlIGZvcgorICogcnVudGltZSBwZXJtaXNzaW9ucyAocHJvdGVjdGlvbiBsZXZlbCBkYW5nZXJvdXMpIGFzIHRoZXkgbWF5IGNoYW5nZSBhdAorICogcnVudGltZS4gQWxsIG90aGVyIHBlcm1pc3Npb25zIChwcm90ZWN0aW9uIGxldmVsIG5vcm1hbCBhbmQgZGFuZ2Vyb3VzKQorICogY2FuIGJlIGNhY2hlZCBhcyB0aGV5IG5ldmVyIGNoYW5nZS4gT2YgY291cnNlIGFsbCBwZXJtaXNzaW9uIGNoZWNrZWQKKyAqIGhlcmUgYXJlIHBsYXRmb3JtIGRlZmluZWQuCisgKi8KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyBOb3QgdmFsaWQgdW50aWwgaW5pdGlhbGl6ZWQgYnkgQXVkaW9GbGluZ2VyIGNvbnN0cnVjdG9yLiAgSXQgd291bGQgaGF2ZSB0byBiZQogLy8gcmUtaW5pdGlhbGl6ZWQgaWYgdGhlIHByb2Nlc3MgY29udGFpbmluZyBBdWRpb0ZsaW5nZXIgc2VydmljZSBmb3JrcyAod2hpY2ggaXQgZG9lc24ndCkuCiBwaWRfdCBnZXRwaWRfY2FjaGVkOwogCi1ib29sIHJlY29yZGluZ0FsbG93ZWQoKSB7Citib29sIHJlY29yZGluZ0FsbG93ZWQoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpIHsKKyAgICAvLyBOb3RlOiBXZSBhcmUgZ2V0dGluZyB0aGUgVUlEIGZyb20gdGhlIGNhbGxpbmcgSVBDIHRocmVhZCBzdGF0ZSBiZWNhdXNlIGFsbAorICAgIC8vIGNsaWVudHMgdGhhdCBwZXJmb3JtIHJlY29yZGluZyBjcmVhdGUgQXVkaW9SZWNvcmQgaW4gdGhlaXIgb3duIHByb2Nlc3NlcworICAgIC8vIGFuZCB0aGUgc3lzdGVtIGRvZXMgbm90IGNyZWF0ZSBBdWRpb1JlY29yZCBvYmplY3RzIG9uIGJlaGFsZiBvZiBhcHBzLiBUaGlzCisgICAgLy8gZGlmZmVycyBmcm9tIHBsYXliYWNrIHdoZXJlIGluIHNvbWUgc2l0dWF0aW9ucyB0aGUgc3lzdGVtIHJlY3JlYXRlcyBBdWRpb1RyYWNrCisgICAgLy8gaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCBhIGNsaWVudCdzIE1lZGlhUGxheWVyIG9uIGJlaGFsZiBvZiB0aGlzIGNsaWVudC4KKyAgICAvLyBJbiB0aGUgbGF0dGVyIGNhc2Ugd2UgaGF2ZSB0byBzdG9yZSB0aGUgY2xpZW50IFVJRCBhbmQgcGFzcyBpbiBhbG9uZyBmb3IKKyAgICAvLyBzZWN1cml0eSBjaGVja3MuCisKICAgICBpZiAoZ2V0cGlkX2NhY2hlZCA9PSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpIHJldHVybiB0cnVlOwogICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzUmVjb3JkQXVkaW8oImFuZHJvaWQucGVybWlzc2lvbi5SRUNPUkRfQVVESU8iKTsKLSAgICAvLyBkb24ndCB1c2UgUGVybWlzc2lvbkNhY2hlOyB0aGlzIGlzIG5vdCBhIHN5c3RlbSBwZXJtaXNzaW9uCi0gICAgYm9vbCBvayA9IGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc1JlY29yZEF1ZGlvKTsKLSAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uUkVDT1JEX0FVRElPIik7Ci0gICAgcmV0dXJuIG9rOworCisgICAgLy8gSU1QT1JUQU5UOiBEb24ndCB1c2UgUGVybWlzc2lvbkNhY2hlIC0gYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBjaGFuZ2UuCisgICAgY29uc3QgYm9vbCBvayA9IGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc1JlY29yZEF1ZGlvKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5SRUNPUkRfQVVESU8iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IHVpZF90IHVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKworICAgIC8vIFRvIHBlcm1pdCBjb21tYW5kLWxpbmUgbmF0aXZlIHRlc3RzCisgICAgaWYgKHVpZCA9PSBBSURfUk9PVCkgcmV0dXJuIHRydWU7CisKKyAgICBTdHJpbmcxNiBjaGVja2VkT3BQYWNrYWdlTmFtZSA9IG9wUGFja2FnZU5hbWU7CisKKyAgICAvLyBJbiBzb21lIGNhc2VzIHRoZSBjYWxsaW5nIGNvZGUgaGFzIG5vIGFjY2VzcyB0byB0aGUgcGFja2FnZSBpdCBydW5zIHVuZGVyLgorICAgIC8vIEZvciBleGFtcGxlLCBjb2RlIHVzaW5nIHRoZSB3aWxoZWxtIGZyYW1ld29yaydzIE9wZW5TTC1FUyBBUElzLiBJbiB0aGlzCisgICAgLy8gY2FzZSB3ZSB3aWxsIGdldCB0aGUgcGFja2FnZXMgZm9yIHRoZSBjYWxsaW5nIFVJRCBhbmQgcGljayB0aGUgZmlyc3Qgb25lCisgICAgLy8gZm9yIGF0dHJpYnV0aW5nIHRoZSBhcHAgb3AuIFRoaXMgd2lsbCB3b3JrIGNvcnJlY3RseSBmb3IgcnVudGltZSBwZXJtaXNzaW9ucworICAgIC8vIGFzIGZvciBsZWdhY3kgYXBwcyB3ZSB3aWxsIHRvZ2dsZSB0aGUgYXBwIG9wIGZvciBhbGwgcGFja2FnZXMgaW4gdGhlIFVJRC4KKyAgICAvLyBUaGUgY2F2ZWF0IGlzIHRoYXQgdGhlIG9wZXJhdGlvbiBtYXkgYmUgYXR0cmlidXRlZCB0byB0aGUgd3JvbmcgcGFja2FnZSBhbmQKKyAgICAvLyBzdGF0cyBiYXNlZCBvbiBhcHAgb3BzIG1heSBiZSBzbGlnaHRseSBvZmYuCisgICAgaWYgKGNoZWNrZWRPcFBhY2thZ2VOYW1lLnNpemUoKSA8PSAwKSB7CisgICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoInBlcm1pc3Npb24iKSk7CisgICAgICAgIGlmIChiaW5kZXIgPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBnZXQgcGVybWlzc2lvbiBzZXJ2aWNlIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBzcDxJUGVybWlzc2lvbkNvbnRyb2xsZXI+IHBlcm1DdHJsID0gaW50ZXJmYWNlX2Nhc3Q8SVBlcm1pc3Npb25Db250cm9sbGVyPihiaW5kZXIpOworICAgICAgICBWZWN0b3I8U3RyaW5nMTY+IHBhY2thZ2VzOworCisgICAgICAgIHBlcm1DdHJsLT5nZXRQYWNrYWdlc0ZvclVpZCh1aWQsIHBhY2thZ2VzKTsKKworICAgICAgICBpZiAocGFja2FnZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiTm8gcGFja2FnZXMgZm9yIGNhbGxpbmcgVUlEIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgY2hlY2tlZE9wUGFja2FnZU5hbWUgPSBwYWNrYWdlc1swXTsKKyAgICB9CisKKyAgICBBcHBPcHNNYW5hZ2VyIGFwcE9wczsKKyAgICBpZiAoYXBwT3BzLm5vdGVPcChBcHBPcHNNYW5hZ2VyOjpPUF9SRUNPUkRfQVVESU8sIHVpZCwgY2hlY2tlZE9wUGFja2FnZU5hbWUpCisgICAgICAgICAgICAhPSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0FMTE9XRUQpIHsKKyAgICAgICAgQUxPR0UoIlJlcXVlc3QgZGVuaWVkIGJ5IGFwcCBvcCBPUF9SRUNPUkRfQVVESU8iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOwogfQogCiBib29sIGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQoKSB7CiAgICAgaWYgKGdldHBpZF9jYWNoZWQgPT0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKSByZXR1cm4gdHJ1ZTsKICAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0NhcHR1cmVBdWRpb091dHB1dCgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fT1VUUFVUIik7Ci0gICAgLy8gZG9uJ3QgdXNlIFBlcm1pc3Npb25DYWNoZTsgdGhpcyBpcyBub3QgYSBzeXN0ZW0gcGVybWlzc2lvbgotICAgIGJvb2wgb2sgPSBjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNDYXB0dXJlQXVkaW9PdXRwdXQpOworICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCisgICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzQ2FwdHVyZUF1ZGlvT3V0cHV0KTsKICAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19PVVRQVVQiKTsKICAgICByZXR1cm4gb2s7CiB9CiAKIGJvb2wgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkgewogICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQ2FwdHVyZUhvdHdvcmRBbGxvd2VkKCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEIik7Ci0gICAgYm9vbCBvayA9IGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0NhcHR1cmVIb3R3b3JkQWxsb3dlZCk7CisgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNDYXB0dXJlSG90d29yZEFsbG93ZWQpOwogICAgIGlmICghb2spIEFMT0dFKCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEIik7CiAgICAgcmV0dXJuIG9rOwogfQogCi1ib29sIGNhcHR1cmVGbVR1bmVyQWxsb3dlZCgpIHsKLSAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0NhcHR1cmVGbVR1bmVyQWxsb3dlZCgiYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19GTV9SQURJTyIpOwotICAgIGJvb2wgb2sgPSBjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNDYXB0dXJlRm1UdW5lckFsbG93ZWQpOwotICAgIGlmICghb2spIEFMT0dFKCJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX0ZNX1JBRElPIik7Ci0gICAgcmV0dXJuIG9rOwotfQotCiBib29sIHNldHRpbmdzQWxsb3dlZCgpIHsKICAgICBpZiAoZ2V0cGlkX2NhY2hlZCA9PSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpIHJldHVybiB0cnVlOwogICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQXVkaW9TZXR0aW5ncygiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19TRVRUSU5HUyIpOwotICAgIC8vIGRvbid0IHVzZSBQZXJtaXNzaW9uQ2FjaGU7IHRoaXMgaXMgbm90IGEgc3lzdGVtIHBlcm1pc3Npb24KLSAgICBib29sIG9rID0gY2hlY2tDYWxsaW5nUGVybWlzc2lvbihzQXVkaW9TZXR0aW5ncyk7CisgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNBdWRpb1NldHRpbmdzKTsKICAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1NFVFRJTkdTIik7CiAgICAgcmV0dXJuIG9rOwogfQogCiBib29sIG1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSB7CiAgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNNb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1JPVVRJTkciKTsKLSAgICBib29sIG9rID0gY2hlY2tDYWxsaW5nUGVybWlzc2lvbihzTW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCk7CisgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNNb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKTsKICAgICBpZiAoIW9rKSBBTE9HRSgiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19ST1VUSU5HIik7CiAgICAgcmV0dXJuIG9rOwogfQpAQCAtNzYsNyArMTM0LDcgQEAKIGJvb2wgZHVtcEFsbG93ZWQoKSB7CiAgICAgLy8gZG9uJ3Qgb3B0aW1pemUgZm9yIHNhbWUgcGlkLCBzaW5jZSBtZWRpYXNlcnZlciBuZXZlciBkdW1wcyBpdHNlbGYKICAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0R1bXAoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIik7Ci0gICAgLy8gT0sgdG8gdXNlIFBlcm1pc3Npb25DYWNoZTsgdGhpcyBpcyBhIHN5c3RlbSBwZXJtaXNzaW9uCisgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KICAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNEdW1wKTsKICAgICAvLyBjb252ZW50aW9uIGlzIGZvciBjYWxsZXIgdG8gZHVtcCBhbiBlcnJvciBtZXNzYWdlIHRvIGZkIGluc3RlYWQgb2YgbG9nZ2luZyBoZXJlCiAgICAgLy9pZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmgKaW5kZXggY2UxOGE5MC4uZmJhNmRjZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5oCkBAIC0yMCwxMiArMjAsMTAgQEAKIAogZXh0ZXJuIHBpZF90IGdldHBpZF9jYWNoZWQ7CiAKLWJvb2wgcmVjb3JkaW5nQWxsb3dlZCgpOworYm9vbCByZWNvcmRpbmdBbGxvd2VkKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKTsKIGJvb2wgY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZCgpOwogYm9vbCBjYXB0dXJlSG90d29yZEFsbG93ZWQoKTsKLWJvb2wgY2FwdHVyZUZtVHVuZXJBbGxvd2VkKCk7CiBib29sIHNldHRpbmdzQWxsb3dlZCgpOwogYm9vbCBtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCk7CiBib29sIGR1bXBBbGxvd2VkKCk7Ci0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TcGRpZlN0cmVhbU91dC5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3BkaWZTdHJlYW1PdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNGEwNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3BkaWZTdHJlYW1PdXQuY3BwCkBAIC0wLDAgKzEsMTI4IEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvRmxpbmdlciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvc3BkaWYvU1BESUZFbmNvZGVyLmg+CisKKyNpbmNsdWRlICJBdWRpb0h3RGV2aWNlLmgiCisjaW5jbHVkZSAiQXVkaW9TdHJlYW1PdXQuaCIKKyNpbmNsdWRlICJTcGRpZlN0cmVhbU91dC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogSWYgdGhlIEF1ZGlvRmxpbmdlciBpcyBwcm9jZXNzaW5nIGVuY29kZWQgZGF0YSBhbmQgdGhlIEhBTCBleHBlY3RzCisgKiBQQ00gdGhlbiB3ZSBuZWVkIHRvIHdyYXAgdGhlIGRhdGEgaW4gYW4gU1BESUYgd3JhcHBlci4KKyAqLworU3BkaWZTdHJlYW1PdXQ6OlNwZGlmU3RyZWFtT3V0KEF1ZGlvSHdEZXZpY2UgKmRldiwKKyAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQorICAgICAgICAvLyBUZWxsIHRoZSBIQUwgdGhhdCB0aGUgZGF0YSB3aWxsIGJlIGNvbXByZXNzZWQgYXVkaW8gd3JhcHBlZCBpbiBhIGRhdGEgYnVyc3QuCisgICAgICAgIDogQXVkaW9TdHJlYW1PdXQoZGV2LCAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIChmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0lFQzk1OF9OT05BVURJTykpCisgICAgICAgICwgbVNwZGlmRW5jb2Rlcih0aGlzLCBmb3JtYXQpCisgICAgICAgICwgbUFwcGxpY2F0aW9uRm9ybWF0KEFVRElPX0ZPUk1BVF9ERUZBVUxUKQorICAgICAgICAsIG1BcHBsaWNhdGlvblNhbXBsZVJhdGUoMCkKKyAgICAgICAgLCBtQXBwbGljYXRpb25DaGFubmVsTWFzaygwKQoreworfQorCitzdGF0dXNfdCBTcGRpZlN0cmVhbU91dDo6b3BlbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcykKK3sKKyAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnIGN1c3RvbUNvbmZpZyA9ICpjb25maWc7CisKKyAgICBtQXBwbGljYXRpb25Gb3JtYXQgPSBjb25maWctPmZvcm1hdDsKKyAgICBtQXBwbGljYXRpb25TYW1wbGVSYXRlID0gY29uZmlnLT5zYW1wbGVfcmF0ZTsKKyAgICBtQXBwbGljYXRpb25DaGFubmVsTWFzayA9IGNvbmZpZy0+Y2hhbm5lbF9tYXNrOworCisgICAgLy8gU29tZSBkYXRhIGJ1cnN0cyBydW4gYXQgYSBoaWdoZXIgc2FtcGxlIHJhdGUuCisgICAgLy8gVE9ETyBNb3ZlIHRoaXMgaW50byB0aGUgYXVkaW9fdXRpbHMgYXMgYSBzdGF0aWMgbWV0aG9kLgorICAgIHN3aXRjaChjb25maWctPmZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9FX0FDMzoKKyAgICAgICAgICAgIG1SYXRlTXVsdGlwbGllciA9IDQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfQUMzOgorICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9EVFM6CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RUU19IRDoKKyAgICAgICAgICAgIG1SYXRlTXVsdGlwbGllciA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJFUlJPUiBTcGRpZlN0cmVhbU91dDo6b3BlbigpIHVucmVjb2duaXplZCBmb3JtYXQgMHglMDhYXG4iLAorICAgICAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGN1c3RvbUNvbmZpZy5zYW1wbGVfcmF0ZSA9IGNvbmZpZy0+c2FtcGxlX3JhdGUgKiBtUmF0ZU11bHRpcGxpZXI7CisKKyAgICBjdXN0b21Db25maWcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgY3VzdG9tQ29uZmlnLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKworICAgIC8vIEFsd2F5cyBwcmludCB0aGlzIGJlY2F1c2Ugb3RoZXJ3aXNlIGl0IGNvdWxkIGJlIHZlcnkgY29uZnVzaW5nIGlmIHRoZQorICAgIC8vIEhBTCBhbmQgQXVkaW9GbGluZ2VyIGFyZSB1c2luZyBkaWZmZXJlbnQgZm9ybWF0cy4KKyAgICAvLyBQcmludCBiZWZvcmUgb3BlbigpIGJlY2F1c2UgSEFMIG1heSBtb2RpZnkgY3VzdG9tQ29uZmlnLgorICAgIEFMT0dJKCJTcGRpZlN0cmVhbU91dDo6b3BlbigpIEF1ZGlvRmxpbmdlciByZXF1ZXN0ZWQiCisgICAgICAgICAgICAiIHNhbXBsZVJhdGUgJWQsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCIsCisgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgY29uZmlnLT5mb3JtYXQsCisgICAgICAgICAgICBjb25maWctPmNoYW5uZWxfbWFzayk7CisgICAgQUxPR0koIlNwZGlmU3RyZWFtT3V0OjpvcGVuKCkgSEFMIGNvbmZpZ3VyZWQgZm9yIgorICAgICAgICAgICAgIiBzYW1wbGVSYXRlICVkLCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3giLAorICAgICAgICAgICAgY3VzdG9tQ29uZmlnLnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgY3VzdG9tQ29uZmlnLmZvcm1hdCwKKyAgICAgICAgICAgIGN1c3RvbUNvbmZpZy5jaGFubmVsX21hc2spOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9TdHJlYW1PdXQ6Om9wZW4oCisgICAgICAgICAgICBoYW5kbGUsCisgICAgICAgICAgICBkZXZpY2VzLAorICAgICAgICAgICAgJmN1c3RvbUNvbmZpZywKKyAgICAgICAgICAgIGFkZHJlc3MpOworCisgICAgQUxPR0koIlNwZGlmU3RyZWFtT3V0OjpvcGVuKCkgc3RhdHVzID0gJWQiLCBzdGF0dXMpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworaW50IFNwZGlmU3RyZWFtT3V0OjpmbHVzaCgpCit7CisgICAgbVNwZGlmRW5jb2Rlci5yZXNldCgpOworICAgIHJldHVybiBBdWRpb1N0cmVhbU91dDo6Zmx1c2goKTsKK30KKworaW50IFNwZGlmU3RyZWFtT3V0OjpzdGFuZGJ5KCkKK3sKKyAgICBtU3BkaWZFbmNvZGVyLnJlc2V0KCk7CisgICAgcmV0dXJuIEF1ZGlvU3RyZWFtT3V0OjpzdGFuZGJ5KCk7Cit9CisKK3NzaXplX3QgU3BkaWZTdHJlYW1PdXQ6OndyaXRlRGF0YUJ1cnN0KGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGJ5dGVzKQoreworICAgIHJldHVybiBBdWRpb1N0cmVhbU91dDo6d3JpdGUoYnVmZmVyLCBieXRlcyk7Cit9CisKK3NzaXplX3QgU3BkaWZTdHJlYW1PdXQ6OndyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IG51bUJ5dGVzKQoreworICAgIC8vIFdyaXRlIHRvIFNQRElGIHdyYXBwZXIuIEl0IHdpbGwgY2FsbCBiYWNrIHRvIHdyaXRlRGF0YUJ1cnN0KCkuCisgICAgcmV0dXJuIG1TcGRpZkVuY29kZXIud3JpdGUoYnVmZmVyLCBudW1CeXRlcyk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TcGRpZlN0cmVhbU91dC5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NwZGlmU3RyZWFtT3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg3MDI1MAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TcGRpZlN0cmVhbU91dC5oCkBAIC0wLDAgKzEsMTIzIEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIEFORFJPSURfU1BESUZfU1RSRUFNX09VVF9ICisjZGVmaW5lIEFORFJPSURfU1BESUZfU1RSRUFNX09VVF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCisjaW5jbHVkZSAiQXVkaW9Id0RldmljZS5oIgorI2luY2x1ZGUgIkF1ZGlvU3RyZWFtT3V0LmgiCisjaW5jbHVkZSAiU3BkaWZTdHJlYW1PdXQuaCIKKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3NwZGlmL1NQRElGRW5jb2Rlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogU3RyZWFtIHRoYXQgaXMgYSBQQ00gZGF0YSBidXJzdCBpbiB0aGUgSEFMIGJ1dCBsb29rcyBsaWtlIGFuIGVuY29kZWQgc3RyZWFtCisgKiB0byB0aGUgQXVkaW9GbGluZ2VyLiBXcmFwcyBlbmNvZGVkIGRhdGEgaW4gYW4gU1BESUYgd3JhcHBlciBwZXIgSUVDNjE5NzMtMy4KKyAqLworY2xhc3MgU3BkaWZTdHJlYW1PdXQgOiBwdWJsaWMgQXVkaW9TdHJlYW1PdXQgeworcHVibGljOgorCisgICAgU3BkaWZTdHJlYW1PdXQoQXVkaW9Id0RldmljZSAqZGV2LCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCk7CisKKyAgICB2aXJ0dWFsIH5TcGRpZlN0cmVhbU91dCgpIHsgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuKAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzKTsKKworICAgIC8qKgorICAgICogV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4gUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwgb3IgYQorICAgICogbmVnYXRpdmUgc3RhdHVzX3QuIElmIGF0IGxlYXN0IG9uZSBmcmFtZSB3YXMgd3JpdHRlbiBzdWNjZXNzZnVsbHkgcHJpb3IgdG8gdGhlIGVycm9yLAorICAgICogaXQgaXMgc3VnZ2VzdGVkIHRoYXQgdGhlIGRyaXZlciByZXR1cm4gdGhhdCBzdWNjZXNzZnVsIChzaG9ydCkgYnl0ZSBjb3VudAorICAgICogYW5kIHRoZW4gcmV0dXJuIGFuIGVycm9yIGluIHRoZSBzdWJzZXF1ZW50IGNhbGwuCisgICAgKgorICAgICogSWYgc2V0X2NhbGxiYWNrKCkgaGFzIHByZXZpb3VzbHkgYmVlbiBjYWxsZWQgdG8gZW5hYmxlIG5vbi1ibG9ja2luZyBtb2RlCisgICAgKiB0aGUgd3JpdGUoKSBpcyBub3QgYWxsb3dlZCB0byBibG9jay4gSXQgbXVzdCB3cml0ZSBvbmx5IHRoZSBudW1iZXIgb2YKKyAgICAqIGJ5dGVzIHRoYXQgY3VycmVudGx5IGZpdCBpbiB0aGUgZHJpdmVyL2hhcmR3YXJlIGJ1ZmZlciBhbmQgdGhlbiByZXR1cm4KKyAgICAqIHRoaXMgYnl0ZSBjb3VudC4gSWYgdGhpcyBpcyBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCB3cml0ZSBzaXplIHRoZQorICAgICogY2FsbGJhY2sgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2hlbiBtb3JlIHNwYWNlIGlzIGF2YWlsYWJsZSBpbiB0aGUKKyAgICAqIGRyaXZlci9oYXJkd2FyZSBidWZmZXIuCisgICAgKi8KKyAgICB2aXJ0dWFsIHNzaXplX3Qgd3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgYnl0ZXMpOworCisgICAgLyoqCisgICAgICogQHJldHVybiBmcmFtZSBzaXplIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIEF1ZGlvRmxpbmdlci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHNpemVfdCBnZXRGcmFtZVNpemUoKSBjb25zdCB7IHJldHVybiBzaXplb2YoaW50OF90KTsgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBmb3JtYXQgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgQXVkaW9GbGluZ2VyLgorICAgICAqLworICAgIHZpcnR1YWwgYXVkaW9fZm9ybWF0X3QgZ2V0Rm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUFwcGxpY2F0aW9uRm9ybWF0OyB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgSEFMIG1heSBiZSBydW5uaW5nIGF0IGEgaGlnaGVyIHNhbXBsZSByYXRlIGlmLCBmb3IgZXhhbXBsZSwgcGxheWluZyB3cmFwcGVkIEVBQzMuCisgICAgICogQHJldHVybiBzYW1wbGUgcmF0ZSBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBBdWRpb0ZsaW5nZXIuCisgICAgICovCisgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbUFwcGxpY2F0aW9uU2FtcGxlUmF0ZTsgfQorCisgICAgLyoqCisgICAgICogVGhlIEhBTCBpcyBpbiBzdGVyZW8gbW9kZSB3aGVuIHBsYXlpbmcgbXVsdGktY2hhbm5lbCBjb21wcmVzc2VkIGF1ZGlvIG92ZXIgSERNSS4KKyAgICAgKiBAcmV0dXJuIGNoYW5uZWwgbWFzayBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBBdWRpb0ZsaW5nZXIuCisgICAgICovCisgICAgdmlydHVhbCBhdWRpb19jaGFubmVsX21hc2tfdCBnZXRDaGFubmVsTWFzaygpIGNvbnN0IHsgcmV0dXJuIG1BcHBsaWNhdGlvbkNoYW5uZWxNYXNrOyB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7CisKK3ByaXZhdGU6CisKKyAgICBjbGFzcyBNeVNQRElGRW5jb2RlciA6IHB1YmxpYyBTUERJRkVuY29kZXIKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBNeVNQRElGRW5jb2RlcihTcGRpZlN0cmVhbU91dCAqc3BkaWZTdHJlYW1PdXQsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKKyAgICAgICAgICA6ICBTUERJRkVuY29kZXIoZm9ybWF0KQorICAgICAgICAgICwgbVNwZGlmU3RyZWFtT3V0KHNwZGlmU3RyZWFtT3V0KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHNzaXplX3Qgd3JpdGVPdXRwdXQoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtU3BkaWZTdHJlYW1PdXQtPndyaXRlRGF0YUJ1cnN0KGJ1ZmZlciwgYnl0ZXMpOworICAgICAgICB9CisgICAgcHJvdGVjdGVkOgorICAgICAgICBTcGRpZlN0cmVhbU91dCAqIGNvbnN0IG1TcGRpZlN0cmVhbU91dDsKKyAgICB9OworCisgICAgTXlTUERJRkVuY29kZXIgICAgICAgbVNwZGlmRW5jb2RlcjsKKyAgICBhdWRpb19mb3JtYXRfdCAgICAgICBtQXBwbGljYXRpb25Gb3JtYXQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgbUFwcGxpY2F0aW9uU2FtcGxlUmF0ZTsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtQXBwbGljYXRpb25DaGFubmVsTWFzazsKKworICAgIHNzaXplX3QgIHdyaXRlRGF0YUJ1cnN0KGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBieXRlcyk7CisgICAgc3NpemVfdCAgd3JpdGVJbnRlcm5hbChjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBieXRlcyk7CisKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfU1BESUZfU1RSRUFNX09VVF9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKaW5kZXggOTY4YjBmOS4uMjQ2ZjZiYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcApAQCAtMjMsNyArMjMsOSBAQAogI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KQEAgLTU0LDYgKzU2LDcgQEAKIAogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgogI2luY2x1ZGUgIkF1ZGlvTWl4ZXIuaCIKKyNpbmNsdWRlICJCdWZmZXJQcm92aWRlcnMuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXIuaCIKICNpbmNsdWRlICJGYXN0Q2FwdHVyZS5oIgogI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKQEAgLTg0LDcgKzg3LDE3IEBACiAjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKICNlbmRpZgogCisvLyBUT0RPOiBNb3ZlIHRoZXNlIG1hY3JvL2lubGluZXMgdG8gYSBoZWFkZXIgZmlsZS4KICNkZWZpbmUgbWF4KGEsIGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBpbmxpbmUgVCBtaW4oY29uc3QgVCYgYSwgY29uc3QgVCYgYikKK3sKKyAgICByZXR1cm4gYSA8IGIgPyBhIDogYjsKK30KKworI2lmbmRlZiBBUlJBWV9TSVpFCisjZGVmaW5lIEFSUkFZX1NJWkUoYSkgKHNpemVvZihhKSAvIHNpemVvZihhWzBdKSkKKyNlbmRpZgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTExMiwxMCArMTI1LDE1IEBACiBzdGF0aWMgY29uc3QgdWludDMyX3Qga01heFRocmVhZFNsZWVwVGltZVNoaWZ0ID0gMjsKIAogLy8gbWluaW11bSBub3JtYWwgc2luayBidWZmZXIgc2l6ZSwgZXhwcmVzc2VkIGluIG1pbGxpc2Vjb25kcyByYXRoZXIgdGhhbiBmcmFtZXMKKy8vIEZJWE1FIFRoaXMgc2hvdWxkIGJlIGJhc2VkIG9uIGV4cGVyaW1lbnRhbGx5IG9ic2VydmVkIHNjaGVkdWxpbmcgaml0dGVyCiBzdGF0aWMgY29uc3QgdWludDMyX3Qga01pbk5vcm1hbFNpbmtCdWZmZXJTaXplTXMgPSAyMDsKIC8vIG1heGltdW0gbm9ybWFsIHNpbmsgYnVmZmVyIHNpemUKIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWF4Tm9ybWFsU2lua0J1ZmZlclNpemVNcyA9IDI0OwogCisvLyBtaW5pbXVtIGNhcHR1cmUgYnVmZmVyIHNpemUgaW4gbWlsbGlzZWNvbmRzIHRvIF9ub3RfIG5lZWQgYSBmYXN0IGNhcHR1cmUgdGhyZWFkCisvLyBGSVhNRSBUaGlzIHNob3VsZCBiZSBiYXNlZCBvbiBleHBlcmltZW50YWxseSBvYnNlcnZlZCBzY2hlZHVsaW5nIGppdHRlcgorc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNaW5Ob3JtYWxDYXB0dXJlQnVmZmVyU2l6ZU1zID0gMTI7CisKIC8vIE9mZmxvYWRlZCBvdXRwdXQgdGhyZWFkIHN0YW5kYnkgZGVsYXk6IGFsbG93cyB0cmFjayB0cmFuc2l0aW9uIHdpdGhvdXQgZ29pbmcgdG8gc3RhbmRieQogc3RhdGljIGNvbnN0IG5zZWNzX3Qga09mZmxvYWRTdGFuZGJ5RGVsYXlOcyA9IHNlY29uZHMoMSk7CiAKQEAgLTMxNCw4ICszMzIsMjAzIEBACiAvLyAgICAgIFRocmVhZEJhc2UKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorLy8gc3RhdGljCitjb25zdCBjaGFyICpBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnRocmVhZFR5cGVUb1N0cmluZyhBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnR5cGVfdCB0eXBlKQoreworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgTUlYRVI6CisgICAgICAgIHJldHVybiAiTUlYRVIiOworICAgIGNhc2UgRElSRUNUOgorICAgICAgICByZXR1cm4gIkRJUkVDVCI7CisgICAgY2FzZSBEVVBMSUNBVElORzoKKyAgICAgICAgcmV0dXJuICJEVVBMSUNBVElORyI7CisgICAgY2FzZSBSRUNPUkQ6CisgICAgICAgIHJldHVybiAiUkVDT1JEIjsKKyAgICBjYXNlIE9GRkxPQUQ6CisgICAgICAgIHJldHVybiAiT0ZGTE9BRCI7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICJ1bmtub3duIjsKKyAgICB9Cit9CisKK1N0cmluZzggZGV2aWNlc1RvU3RyaW5nKGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKQoreworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbWFwcGluZyB7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlczsKKyAgICAgICAgY29uc3QgY2hhciAqICAgIG1TdHJpbmc7CisgICAgfSBtYXBwaW5nc091dFtdID0geworICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFLCAgICAgICAgICAiRUFSUElFQ0UiLAorICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIsICAgICAgICAgICAiU1BFQUtFUiIsCisgICAgICAgIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVCwgICAgICJXSVJFRF9IRUFEU0VUIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkUsICAgIldJUkVEX0hFQURQSE9ORSIsCisgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDTywgICAgICJCTFVFVE9PVEhfU0NPIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQsICAgICAiQkxVRVRPT1RIX1NDT19IRUFEU0VUIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCwgICAgICAiQkxVRVRPT1RIX1NDT19DQVJLSVQiLAorICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQLCAgICAgICAgICAgICJCTFVFVE9PVEhfQTJEUCIsCisgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUywgIkJMVUVUT09USF9BMkRQX0hFQURQSE9ORVMiLAorICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIsICAgICJCTFVFVE9PVEhfQTJEUF9TUEVBS0VSIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTCwgICAgICAgIkFVWF9ESUdJVEFMIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9IRE1JLCAgICAgICAgICAgICAgIkhETUkiLAorICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VULCAiQU5MR19ET0NLX0hFQURTRVQiLAorICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VULCAiREdUTF9ET0NLX0hFQURTRVQiLAorICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlksICAgICAiVVNCX0FDQ0VTU09SWSIsCisgICAgICAgIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRSwgICAgICAgICJVU0JfREVWSUNFIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgsICAgICAgIlRFTEVQSE9OWV9UWCIsCisgICAgICAgIEFVRElPX0RFVklDRV9PVVRfTElORSwgICAgICAgICAgICAgICJMSU5FIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9IRE1JX0FSQywgICAgICAgICAgIkhETUlfQVJDIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9TUERJRiwgICAgICAgICAgICAgIlNQRElGIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9GTSwgICAgICAgICAgICAgICAgIkZNIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9BVVhfTElORSwgICAgICAgICAgIkFVWF9MSU5FIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUsICAgICAgIlNQRUFLRVJfU0FGRSIsCisgICAgICAgIEFVRElPX0RFVklDRV9PVVRfSVAsICAgICAgICAgICAgICAgICJJUCIsCisgICAgICAgIEFVRElPX0RFVklDRV9OT05FLCAgICAgICAgICAgICAgICAgICJOT05FIiwgICAgICAgICAvLyBtdXN0IGJlIGxhc3QKKyAgICB9LCBtYXBwaW5nc0luW10gPSB7CisgICAgICAgIEFVRElPX0RFVklDRV9JTl9DT01NVU5JQ0FUSU9OLCAgICAgICJDT01NVU5JQ0FUSU9OIiwKKyAgICAgICAgQVVESU9fREVWSUNFX0lOX0FNQklFTlQsICAgICAgICAgICAgIkFNQklFTlQiLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMsICAgICAgICAiQlVJTFRJTl9NSUMiLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VULCAgIkJMVUVUT09USF9TQ09fSEVBRFNFVCIsCisgICAgICAgIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VULCAgICAgICJXSVJFRF9IRUFEU0VUIiwKKyAgICAgICAgQVVESU9fREVWSUNFX0lOX0FVWF9ESUdJVEFMLCAgICAgICAgIkFVWF9ESUdJVEFMIiwKKyAgICAgICAgQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEwsICAgICAgICAgIlZPSUNFX0NBTEwiLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYLCAgICAgICAiVEVMRVBIT05ZX1JYIiwKKyAgICAgICAgQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDLCAgICAgICAgICAgIkJBQ0tfTUlDIiwKKyAgICAgICAgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsICAgICAgIlJFTU9URV9TVUJNSVgiLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fQU5MR19ET0NLX0hFQURTRVQsICAiQU5MR19ET0NLX0hFQURTRVQiLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fREdUTF9ET0NLX0hFQURTRVQsICAiREdUTF9ET0NLX0hFQURTRVQiLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fVVNCX0FDQ0VTU09SWSwgICAgICAiVVNCX0FDQ0VTU09SWSIsCisgICAgICAgIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFLCAgICAgICAgICJVU0JfREVWSUNFIiwKKyAgICAgICAgQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSLCAgICAgICAgICAgIkZNX1RVTkVSIiwKKyAgICAgICAgQVVESU9fREVWSUNFX0lOX1RWX1RVTkVSLCAgICAgICAgICAgIlRWX1RVTkVSIiwKKyAgICAgICAgQVVESU9fREVWSUNFX0lOX0xJTkUsICAgICAgICAgICAgICAgIkxJTkUiLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fU1BESUYsICAgICAgICAgICAgICAiU1BESUYiLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFAsICAgICAiQkxVRVRPT1RIX0EyRFAiLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fTE9PUEJBQ0ssICAgICAgICAgICAiTE9PUEJBQ0siLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fSVAsICAgICAgICAgICAgICAgICAiSVAiLAorICAgICAgICBBVURJT19ERVZJQ0VfTk9ORSwgICAgICAgICAgICAgICAgICAiTk9ORSIsICAgICAgICAgLy8gbXVzdCBiZSBsYXN0CisgICAgfTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICBhdWRpb19kZXZpY2VzX3QgYWxsRGV2aWNlcyA9IEFVRElPX0RFVklDRV9OT05FOworICAgIGNvbnN0IG1hcHBpbmcgKmVudHJ5OworICAgIGlmIChkZXZpY2VzICYgQVVESU9fREVWSUNFX0JJVF9JTikgeworICAgICAgICBkZXZpY2VzICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOworICAgICAgICBlbnRyeSA9IG1hcHBpbmdzSW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW50cnkgPSBtYXBwaW5nc091dDsKKyAgICB9CisgICAgZm9yICggOyBlbnRyeS0+bURldmljZXMgIT0gQVVESU9fREVWSUNFX05PTkU7IGVudHJ5KyspIHsKKyAgICAgICAgYWxsRGV2aWNlcyA9IChhdWRpb19kZXZpY2VzX3QpIChhbGxEZXZpY2VzIHwgZW50cnktPm1EZXZpY2VzKTsKKyAgICAgICAgaWYgKGRldmljZXMgJiBlbnRyeS0+bURldmljZXMpIHsKKyAgICAgICAgICAgIGlmICghcmVzdWx0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZW50cnktPm1TdHJpbmcpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChkZXZpY2VzICYgfmFsbERldmljZXMpIHsKKyAgICAgICAgaWYgKCFyZXN1bHQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJ8Iik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiMHglWCIsIGRldmljZXMgJiB+YWxsRGV2aWNlcyk7CisgICAgfQorICAgIGlmIChyZXN1bHQuaXNFbXB0eSgpKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoZW50cnktPm1TdHJpbmcpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitTdHJpbmc4IGlucHV0RmxhZ3NUb1N0cmluZyhhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQoreworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbWFwcGluZyB7CisgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgICAgIG1GbGFnOworICAgICAgICBjb25zdCBjaGFyICogICAgICAgICAgICBtU3RyaW5nOworICAgIH0gbWFwcGluZ3NbXSA9IHsKKyAgICAgICAgQVVESU9fSU5QVVRfRkxBR19GQVNULCAgICAgICAgICAgICAgIkZBU1QiLAorICAgICAgICBBVURJT19JTlBVVF9GTEFHX0hXX0hPVFdPUkQsICAgICAgICAiSFdfSE9UV09SRCIsCisgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSwgICAgICAgICAgICAgICJOT05FIiwgICAgICAgICAvLyBtdXN0IGJlIGxhc3QKKyAgICB9OworICAgIFN0cmluZzggcmVzdWx0OworICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgYWxsRmxhZ3MgPSBBVURJT19JTlBVVF9GTEFHX05PTkU7CisgICAgY29uc3QgbWFwcGluZyAqZW50cnk7CisgICAgZm9yIChlbnRyeSA9IG1hcHBpbmdzOyBlbnRyeS0+bUZsYWcgIT0gQVVESU9fSU5QVVRfRkxBR19OT05FOyBlbnRyeSsrKSB7CisgICAgICAgIGFsbEZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIChhbGxGbGFncyB8IGVudHJ5LT5tRmxhZyk7CisgICAgICAgIGlmIChmbGFncyAmIGVudHJ5LT5tRmxhZykgeworICAgICAgICAgICAgaWYgKCFyZXN1bHQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChlbnRyeS0+bVN0cmluZyk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGZsYWdzICYgfmFsbEZsYWdzKSB7CisgICAgICAgIGlmICghcmVzdWx0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgifCIpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIjB4JVgiLCBmbGFncyAmIH5hbGxGbGFncyk7CisgICAgfQorICAgIGlmIChyZXN1bHQuaXNFbXB0eSgpKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoZW50cnktPm1TdHJpbmcpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitTdHJpbmc4IG91dHB1dEZsYWdzVG9TdHJpbmcoYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCit7CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCBtYXBwaW5nIHsKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgICAgbUZsYWc7CisgICAgICAgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgIG1TdHJpbmc7CisgICAgfSBtYXBwaW5nc1tdID0geworICAgICAgICBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QsICAgICAgICAgICAiRElSRUNUIiwKKyAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSwgICAgICAgICAgIlBSSU1BUlkiLAorICAgICAgICBBVURJT19PVVRQVVRfRkxBR19GQVNULCAgICAgICAgICAgICAiRkFTVCIsCisgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSLCAgICAgICJERUVQX0JVRkZFUiIsCisgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQsICJDT01QUkVTU19PRkZMT0FEIiwKKyAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9OX0JMT0NLSU5HLCAgICAgIk5PTl9CTE9DS0lORyIsCisgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMsICAgICAgICJIV19BVl9TWU5DIiwKKyAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgICAgICAgICAgICAgIk5PTkUiLCAgICAgICAgIC8vIG11c3QgYmUgbGFzdAorICAgIH07CisgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgYWxsRmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgIGNvbnN0IG1hcHBpbmcgKmVudHJ5OworICAgIGZvciAoZW50cnkgPSBtYXBwaW5nczsgZW50cnktPm1GbGFnICE9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7IGVudHJ5KyspIHsKKyAgICAgICAgYWxsRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIChhbGxGbGFncyB8IGVudHJ5LT5tRmxhZyk7CisgICAgICAgIGlmIChmbGFncyAmIGVudHJ5LT5tRmxhZykgeworICAgICAgICAgICAgaWYgKCFyZXN1bHQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChlbnRyeS0+bVN0cmluZyk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGZsYWdzICYgfmFsbEZsYWdzKSB7CisgICAgICAgIGlmICghcmVzdWx0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgifCIpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIjB4JVgiLCBmbGFncyAmIH5hbGxGbGFncyk7CisgICAgfQorICAgIGlmIChyZXN1bHQuaXNFbXB0eSgpKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoZW50cnktPm1TdHJpbmcpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitjb25zdCBjaGFyICpzb3VyY2VUb1N0cmluZyhhdWRpb19zb3VyY2VfdCBzb3VyY2UpCit7CisgICAgc3dpdGNoIChzb3VyY2UpIHsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9ERUZBVUxUOiAgICAgICAgICAgICAgcmV0dXJuICJkZWZhdWx0IjsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9NSUM6ICAgICAgICAgICAgICAgICAgcmV0dXJuICJtaWMiOworICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSzogICAgICAgICByZXR1cm4gInZvaWNlIHVwbGluayI7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTks6ICAgICAgIHJldHVybiAidm9pY2UgZG93bmxpbmsiOworICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NBTEw6ICAgICAgICAgICByZXR1cm4gInZvaWNlIGNhbGwiOworICAgIGNhc2UgQVVESU9fU09VUkNFX0NBTUNPUkRFUjogICAgICAgICAgICByZXR1cm4gImNhbWNvcmRlciI7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT046ICAgIHJldHVybiAidm9pY2UgcmVjb2duaXRpb24iOworICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT046ICByZXR1cm4gInZvaWNlIGNvbW11bmljYXRpb24iOworICAgIGNhc2UgQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVg6ICAgICAgICByZXR1cm4gInJlbW90ZSBzdWJtaXgiOworICAgIGNhc2UgQVVESU9fU09VUkNFX0ZNX1RVTkVSOiAgICAgICAgICAgICByZXR1cm4gIkZNIHR1bmVyIjsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9IT1RXT1JEOiAgICAgICAgICAgICAgcmV0dXJuICJob3R3b3JkIjsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ1bmtub3duIjsKKyAgICB9Cit9CisKIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6VGhyZWFkQmFzZShjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLAotICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0RGV2aWNlLCBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UsIHR5cGVfdCB0eXBlKQorICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0RGV2aWNlLCBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UsIHR5cGVfdCB0eXBlLCBib29sIHN5c3RlbVJlYWR5KQogICAgIDogICBUaHJlYWQoZmFsc2UgLypjYW5DYWxsSmF2YSovKSwKICAgICAgICAgbVR5cGUodHlwZSksCiAgICAgICAgIG1BdWRpb0ZsaW5nZXIoYXVkaW9GbGluZ2VyKSwKQEAgLTMyNCwxMCArNTM3LDEzIEBACiAgICAgICAgIC8vIFJlY29yZFRocmVhZDo6cmVhZElucHV0UGFyYW1ldGVyc19sKCkKICAgICAgICAgLy9GSVhNRTogbVN0YW5kYnkgc2hvdWxkIGJlIHRydWUgaGVyZS4gSXMgdGhpcyBzb21lIGtpbmQgb2YgaGFjaz8KICAgICAgICAgbVN0YW5kYnkoZmFsc2UpLCBtT3V0RGV2aWNlKG91dERldmljZSksIG1JbkRldmljZShpbkRldmljZSksCisgICAgICAgIG1QcmV2T3V0RGV2aWNlKEFVRElPX0RFVklDRV9OT05FKSwgbVByZXZJbkRldmljZShBVURJT19ERVZJQ0VfTk9ORSksCiAgICAgICAgIG1BdWRpb1NvdXJjZShBVURJT19TT1VSQ0VfREVGQVVMVCksIG1JZChpZCksCiAgICAgICAgIC8vIG1OYW1lIHdpbGwgYmUgc2V0IGJ5IGNvbmNyZXRlIChub24tdmlydHVhbCkgc3ViY2xhc3MKLSAgICAgICAgbURlYXRoUmVjaXBpZW50KG5ldyBQTURlYXRoUmVjaXBpZW50KHRoaXMpKQorICAgICAgICBtRGVhdGhSZWNpcGllbnQobmV3IFBNRGVhdGhSZWNpcGllbnQodGhpcykpLAorICAgICAgICBtU3lzdGVtUmVhZHkoc3lzdGVtUmVhZHkpCiB7CisgICAgbWVtc2V0KCZtUGF0Y2gsIDAsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcGF0Y2gpKTsKIH0KIAogQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjp+VGhyZWFkQmFzZSgpCkBAIC0zOTQsNiArNjEwLDExIEBACiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAKKyAgICBpZiAoZXZlbnQtPm1SZXF1aXJlc1N5c3RlbVJlYWR5ICYmICFtU3lzdGVtUmVhZHkpIHsKKyAgICAgICAgZXZlbnQtPm1XYWl0U3RhdHVzID0gZmFsc2U7CisgICAgICAgIG1QZW5kaW5nQ29uZmlnRXZlbnRzLmFkZChldmVudCk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQogICAgIG1Db25maWdFdmVudHMuYWRkKGV2ZW50KTsKICAgICBBTE9HVigic2VuZENvbmZpZ0V2ZW50X2woKSBudW0gZXZlbnRzICVkIGV2ZW50ICVkIiwgbUNvbmZpZ0V2ZW50cy5zaXplKCksIGV2ZW50LT5tVHlwZSk7CiAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CkBAIC00MTIsMTkgKzYzMywyNSBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kSW9Db25maWdFdmVudChpbnQgZXZlbnQsIGludCBwYXJhbSkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kSW9Db25maWdFdmVudChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woZXZlbnQsIHBhcmFtKTsKKyAgICBzZW5kSW9Db25maWdFdmVudF9sKGV2ZW50LCBwaWQpOwogfQogCiAvLyBzZW5kSW9Db25maWdFdmVudF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCi12b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6c2VuZElvQ29uZmlnRXZlbnRfbChpbnQgZXZlbnQsIGludCBwYXJhbSkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kSW9Db25maWdFdmVudF9sKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkKQogewotICAgIHNwPENvbmZpZ0V2ZW50PiBjb25maWdFdmVudCA9IChDb25maWdFdmVudCAqKW5ldyBJb0NvbmZpZ0V2ZW50KGV2ZW50LCBwYXJhbSk7CisgICAgc3A8Q29uZmlnRXZlbnQ+IGNvbmZpZ0V2ZW50ID0gKENvbmZpZ0V2ZW50ICopbmV3IElvQ29uZmlnRXZlbnQoZXZlbnQsIHBpZCk7CiAgICAgc2VuZENvbmZpZ0V2ZW50X2woY29uZmlnRXZlbnQpOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6c2VuZFByaW9Db25maWdFdmVudChwaWRfdCBwaWQsIHBpZF90IHRpZCwgaW50MzJfdCBwcmlvKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc2VuZFByaW9Db25maWdFdmVudF9sKHBpZCwgdGlkLCBwcmlvKTsKK30KKwogLy8gc2VuZFByaW9Db25maWdFdmVudF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6c2VuZFByaW9Db25maWdFdmVudF9sKHBpZF90IHBpZCwgcGlkX3QgdGlkLCBpbnQzMl90IHByaW8pCiB7CkBAIC00ODUsNyArNzEyLDcgQEAKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBDRkdfRVZFTlRfSU86IHsKICAgICAgICAgICAgIElvQ29uZmlnRXZlbnREYXRhICpkYXRhID0gKElvQ29uZmlnRXZlbnREYXRhICopZXZlbnQtPm1EYXRhLmdldCgpOwotICAgICAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkKGRhdGEtPm1FdmVudCwgZGF0YS0+bVBhcmFtKTsKKyAgICAgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChkYXRhLT5tRXZlbnQsIGRhdGEtPm1QaWQpOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIENGR19FVkVOVF9TRVRfUEFSQU1FVEVSOiB7CiAgICAgICAgICAgICBTZXRQYXJhbWV0ZXJDb25maWdFdmVudERhdGEgKmRhdGEgPSAoU2V0UGFyYW1ldGVyQ29uZmlnRXZlbnREYXRhICopZXZlbnQtPm1EYXRhLmdldCgpOwpAQCAtNTI0LDQ5ICs3NTEsNjMgQEAKIAogU3RyaW5nOCBjaGFubmVsTWFza1RvU3RyaW5nKGF1ZGlvX2NoYW5uZWxfbWFza190IG1hc2ssIGJvb2wgb3V0cHV0KSB7CiAgICAgU3RyaW5nOCBzOwotICAgIGlmIChvdXRwdXQpIHsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUKSBzLmFwcGVuZCgiZnJvbnQtbGVmdCwgIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQpIHMuYXBwZW5kKCJmcm9udC1yaWdodCwgIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSKSBzLmFwcGVuZCgiZnJvbnQtY2VudGVyLCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZKSBzLmFwcGVuZCgibG93IGZyZXEsICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfTEVGVCkgcy5hcHBlbmQoImJhY2stbGVmdCwgIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19SSUdIVCkgcy5hcHBlbmQoImJhY2stcmlnaHQsICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlRfT0ZfQ0VOVEVSKSBzLmFwcGVuZCgiZnJvbnQtbGVmdC1vZi1jZW50ZXIsICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1JJR0hUX09GX0NFTlRFUikgcy5hcHBlbmQoImZyb250LXJpZ2h0LW9mLWNlbnRlciwgIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19DRU5URVIpIHMuYXBwZW5kKCJiYWNrLWNlbnRlciwgIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9MRUZUKSBzLmFwcGVuZCgic2lkZS1sZWZ0LCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9TSURFX1JJR0hUKSBzLmFwcGVuZCgic2lkZS1yaWdodCwgIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0NFTlRFUikgcy5hcHBlbmQoInRvcC1jZW50ZXIgLCIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9GUk9OVF9MRUZUKSBzLmFwcGVuZCgidG9wLWZyb250LWxlZnQsICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9GUk9OVF9DRU5URVIpIHMuYXBwZW5kKCJ0b3AtZnJvbnQtY2VudGVyLCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfUklHSFQpIHMuYXBwZW5kKCJ0b3AtZnJvbnQtcmlnaHQsICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX0xFRlQpIHMuYXBwZW5kKCJ0b3AtYmFjay1sZWZ0LCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19DRU5URVIpIHMuYXBwZW5kKCJ0b3AtYmFjay1jZW50ZXIsICIgKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19SSUdIVCkgcy5hcHBlbmQoInRvcC1iYWNrLXJpZ2h0LCAiICk7Ci0gICAgICAgIGlmIChtYXNrICYgfkFVRElPX0NIQU5ORUxfT1VUX0FMTCkgcy5hcHBlbmQoInVua25vd24sICAiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fTEVGVCkgcy5hcHBlbmQoImxlZnQsICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fUklHSFQpIHMuYXBwZW5kKCJyaWdodCwgIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9GUk9OVCkgcy5hcHBlbmQoImZyb250LCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0JBQ0spIHMuYXBwZW5kKCJiYWNrLCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0xFRlRfUFJPQ0VTU0VEKSBzLmFwcGVuZCgibGVmdC1wcm9jZXNzZWQsICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fUklHSFRfUFJPQ0VTU0VEKSBzLmFwcGVuZCgicmlnaHQtcHJvY2Vzc2VkLCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0ZST05UX1BST0NFU1NFRCkgcy5hcHBlbmQoImZyb250LXByb2Nlc3NlZCwgIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9CQUNLX1BST0NFU1NFRCkgcy5hcHBlbmQoImJhY2stcHJvY2Vzc2VkLCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1BSRVNTVVJFKSBzLmFwcGVuZCgicHJlc3N1cmUsICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fWF9BWElTKSBzLmFwcGVuZCgiWCwgIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9ZX0FYSVMpIHMuYXBwZW5kKCJZLCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1pfQVhJUykgcy5hcHBlbmQoIlosICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfVVBMSU5LKSBzLmFwcGVuZCgidm9pY2UtdXBsaW5rLCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOSykgcy5hcHBlbmQoInZvaWNlLWRubGluaywgIik7Ci0gICAgICAgIGlmIChtYXNrICYgfkFVRElPX0NIQU5ORUxfSU5fQUxMKSBzLmFwcGVuZCgidW5rbm93biwgICIpOworICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfcmVwcmVzZW50YXRpb25fdCByZXByZXNlbnRhdGlvbiA9CisgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfZ2V0X3JlcHJlc2VudGF0aW9uKG1hc2spOworCisgICAgc3dpdGNoIChyZXByZXNlbnRhdGlvbikgeworICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9QT1NJVElPTjogeworICAgICAgICBpZiAob3V0cHV0KSB7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQpIHMuYXBwZW5kKCJmcm9udC1sZWZ0LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQpIHMuYXBwZW5kKCJmcm9udC1yaWdodCwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUikgcy5hcHBlbmQoImZyb250LWNlbnRlciwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kpIHMuYXBwZW5kKCJsb3cgZnJlcSwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfTEVGVCkgcy5hcHBlbmQoImJhY2stbGVmdCwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfUklHSFQpIHMuYXBwZW5kKCJiYWNrLXJpZ2h0LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVF9PRl9DRU5URVIpIHMuYXBwZW5kKCJmcm9udC1sZWZ0LW9mLWNlbnRlciwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1JJR0hUX09GX0NFTlRFUikgcy5hcHBlbmQoImZyb250LXJpZ2h0LW9mLWNlbnRlciwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfQ0VOVEVSKSBzLmFwcGVuZCgiYmFjay1jZW50ZXIsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9TSURFX0xFRlQpIHMuYXBwZW5kKCJzaWRlLWxlZnQsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9TSURFX1JJR0hUKSBzLmFwcGVuZCgic2lkZS1yaWdodCwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9DRU5URVIpIHMuYXBwZW5kKCJ0b3AtY2VudGVyICwiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0ZST05UX0xFRlQpIHMuYXBwZW5kKCJ0b3AtZnJvbnQtbGVmdCwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9GUk9OVF9DRU5URVIpIHMuYXBwZW5kKCJ0b3AtZnJvbnQtY2VudGVyLCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0ZST05UX1JJR0hUKSBzLmFwcGVuZCgidG9wLWZyb250LXJpZ2h0LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfTEVGVCkgcy5hcHBlbmQoInRvcC1iYWNrLWxlZnQsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19DRU5URVIpIHMuYXBwZW5kKCJ0b3AtYmFjay1jZW50ZXIsICIgKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfUklHSFQpIHMuYXBwZW5kKCJ0b3AtYmFjay1yaWdodCwgIiApOworICAgICAgICAgICAgaWYgKG1hc2sgJiB+QVVESU9fQ0hBTk5FTF9PVVRfQUxMKSBzLmFwcGVuZCgidW5rbm93biwgICIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0xFRlQpIHMuYXBwZW5kKCJsZWZ0LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9SSUdIVCkgcy5hcHBlbmQoInJpZ2h0LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9GUk9OVCkgcy5hcHBlbmQoImZyb250LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9CQUNLKSBzLmFwcGVuZCgiYmFjaywgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fTEVGVF9QUk9DRVNTRUQpIHMuYXBwZW5kKCJsZWZ0LXByb2Nlc3NlZCwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fUklHSFRfUFJPQ0VTU0VEKSBzLmFwcGVuZCgicmlnaHQtcHJvY2Vzc2VkLCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9GUk9OVF9QUk9DRVNTRUQpIHMuYXBwZW5kKCJmcm9udC1wcm9jZXNzZWQsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0JBQ0tfUFJPQ0VTU0VEKSBzLmFwcGVuZCgiYmFjay1wcm9jZXNzZWQsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1BSRVNTVVJFKSBzLmFwcGVuZCgicHJlc3N1cmUsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1hfQVhJUykgcy5hcHBlbmQoIlgsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1lfQVhJUykgcy5hcHBlbmQoIlksICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1pfQVhJUykgcy5hcHBlbmQoIlosICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX1VQTElOSykgcy5hcHBlbmQoInZvaWNlLXVwbGluaywgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfRE5MSU5LKSBzLmFwcGVuZCgidm9pY2UtZG5saW5rLCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgfkFVRElPX0NIQU5ORUxfSU5fQUxMKSBzLmFwcGVuZCgidW5rbm93biwgICIpOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGludCBsZW4gPSBzLmxlbmd0aCgpOworICAgICAgICBpZiAobGVuID4gMikgeworICAgICAgICAgICAgY2hhciAqc3RyID0gcy5sb2NrQnVmZmVyKGxlbik7IC8vIG5lZWRlZD8KKyAgICAgICAgICAgIHMudW5sb2NrQnVmZmVyKGxlbiAtIDIpOyAgICAgICAvLyByZW1vdmUgdHJhaWxpbmcgIiwgIgorICAgICAgICB9CisgICAgICAgIHJldHVybiBzOwogICAgIH0KLSAgICBpbnQgbGVuID0gcy5sZW5ndGgoKTsKLSAgICBpZiAocy5sZW5ndGgoKSA+IDIpIHsKLSAgICAgICAgY2hhciAqc3RyID0gcy5sb2NrQnVmZmVyKGxlbik7Ci0gICAgICAgIHMudW5sb2NrQnVmZmVyKGxlbiAtIDIpOworICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9JTkRFWDoKKyAgICAgICAgcy5hcHBlbmRGb3JtYXQoImluZGV4IG1hc2ssIGJpdHM6JSN4IiwgYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKG1hc2spKTsKKyAgICAgICAgcmV0dXJuIHM7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcy5hcHBlbmRGb3JtYXQoInVua25vd24gbWFzaywgcmVwcmVzZW50YXRpb246JWQgIGJpdHM6JSN4IiwKKyAgICAgICAgICAgICAgICByZXByZXNlbnRhdGlvbiwgYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKG1hc2spKTsKKyAgICAgICAgcmV0dXJuIHM7CiAgICAgfQotICAgIHJldHVybiBzOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6ZHVtcEJhc2UoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQpAQCAtNTc3LDIwICs4MTgsMjIgQEAKIAogICAgIGJvb2wgbG9ja2VkID0gQXVkaW9GbGluZ2VyOjpkdW1wVHJ5TG9jayhtTG9jayk7CiAgICAgaWYgKCFsb2NrZWQpIHsKLSAgICAgICAgZHByaW50ZihmZCwgInRocmVhZCAlcCBtYXliZSBkZWFkIGxvY2tlZFxuIiwgdGhpcyk7CisgICAgICAgIGRwcmludGYoZmQsICJ0aHJlYWQgJXAgbWF5IGJlIGRlYWRsb2NrZWRcbiIsIHRoaXMpOwogICAgIH0KIAorICAgIGRwcmludGYoZmQsICIgIFRocmVhZCBuYW1lOiAlc1xuIiwgbVRocmVhZE5hbWUpOwogICAgIGRwcmludGYoZmQsICIgIEkvTyBoYW5kbGU6ICVkXG4iLCBtSWQpOwogICAgIGRwcmludGYoZmQsICIgIFRJRDogJWRcbiIsIGdldFRpZCgpKTsKICAgICBkcHJpbnRmKGZkLCAiICBTdGFuZGJ5OiAlc1xuIiwgbVN0YW5kYnkgPyAieWVzIiA6ICJubyIpOwotICAgIGRwcmludGYoZmQsICIgIFNhbXBsZSByYXRlOiAldVxuIiwgbVNhbXBsZVJhdGUpOworICAgIGRwcmludGYoZmQsICIgIFNhbXBsZSByYXRlOiAldSBIelxuIiwgbVNhbXBsZVJhdGUpOwogICAgIGRwcmludGYoZmQsICIgIEhBTCBmcmFtZSBjb3VudDogJXp1XG4iLCBtRnJhbWVDb3VudCk7CisgICAgZHByaW50ZihmZCwgIiAgSEFMIGZvcm1hdDogMHgleCAoJXMpXG4iLCBtSEFMRm9ybWF0LCBmb3JtYXRUb1N0cmluZyhtSEFMRm9ybWF0KSk7CiAgICAgZHByaW50ZihmZCwgIiAgSEFMIGJ1ZmZlciBzaXplOiAldSBieXRlc1xuIiwgbUJ1ZmZlclNpemUpOwotICAgIGRwcmludGYoZmQsICIgIENoYW5uZWwgQ291bnQ6ICV1XG4iLCBtQ2hhbm5lbENvdW50KTsKLSAgICBkcHJpbnRmKGZkLCAiICBDaGFubmVsIE1hc2s6IDB4JTA4eCAoJXMpXG4iLCBtQ2hhbm5lbE1hc2ssCisgICAgZHByaW50ZihmZCwgIiAgQ2hhbm5lbCBjb3VudDogJXVcbiIsIG1DaGFubmVsQ291bnQpOworICAgIGRwcmludGYoZmQsICIgIENoYW5uZWwgbWFzazogMHglMDh4ICglcylcbiIsIG1DaGFubmVsTWFzaywKICAgICAgICAgICAgIGNoYW5uZWxNYXNrVG9TdHJpbmcobUNoYW5uZWxNYXNrLCBtVHlwZSAhPSBSRUNPUkQpLnN0cmluZygpKTsKLSAgICBkcHJpbnRmKGZkLCAiICBGb3JtYXQ6IDB4JXggKCVzKVxuIiwgbUhBTEZvcm1hdCwgZm9ybWF0VG9TdHJpbmcobUhBTEZvcm1hdCkpOwotICAgIGRwcmludGYoZmQsICIgIEZyYW1lIHNpemU6ICV6dVxuIiwgbUZyYW1lU2l6ZSk7CisgICAgZHByaW50ZihmZCwgIiAgRm9ybWF0OiAweCV4ICglcylcbiIsIG1Gb3JtYXQsIGZvcm1hdFRvU3RyaW5nKG1Gb3JtYXQpKTsKKyAgICBkcHJpbnRmKGZkLCAiICBGcmFtZSBzaXplOiAlenUgYnl0ZXNcbiIsIG1GcmFtZVNpemUpOwogICAgIGRwcmludGYoZmQsICIgIFBlbmRpbmcgY29uZmlnIGV2ZW50czoiKTsKICAgICBzaXplX3QgbnVtQ29uZmlnID0gbUNvbmZpZ0V2ZW50cy5zaXplKCk7CiAgICAgaWYgKG51bUNvbmZpZykgewpAQCAtNjAyLDYgKzg0NSw5IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgZHByaW50ZihmZCwgIiBub25lXG4iKTsKICAgICB9CisgICAgZHByaW50ZihmZCwgIiAgT3V0cHV0IGRldmljZTogJSN4ICglcylcbiIsIG1PdXREZXZpY2UsIGRldmljZXNUb1N0cmluZyhtT3V0RGV2aWNlKS5zdHJpbmcoKSk7CisgICAgZHByaW50ZihmZCwgIiAgSW5wdXQgZGV2aWNlOiAlI3ggKCVzKVxuIiwgbUluRGV2aWNlLCBkZXZpY2VzVG9TdHJpbmcobUluRGV2aWNlKS5zdHJpbmcoKSk7CisgICAgZHByaW50ZihmZCwgIiAgQXVkaW8gc291cmNlOiAlZCAoJXMpXG4iLCBtQXVkaW9Tb3VyY2UsIHNvdXJjZVRvU3RyaW5nKG1BdWRpb1NvdXJjZSkpOwogCiAgICAgaWYgKGxvY2tlZCkgewogICAgICAgICBtTG9jay51bmxvY2soKTsKQEAgLTYzNSwxOSArODgxLDE5IEBACiBTdHJpbmcxNiBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmdldFdha2VMb2NrVGFnKCkKIHsKICAgICBzd2l0Y2ggKG1UeXBlKSB7Ci0gICAgICAgIGNhc2UgTUlYRVI6Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nMTYoIkF1ZGlvTWl4Iik7Ci0gICAgICAgIGNhc2UgRElSRUNUOgotICAgICAgICAgICAgcmV0dXJuIFN0cmluZzE2KCJBdWRpb0RpcmVjdE91dCIpOwotICAgICAgICBjYXNlIERVUExJQ0FUSU5HOgotICAgICAgICAgICAgcmV0dXJuIFN0cmluZzE2KCJBdWRpb0R1cCIpOwotICAgICAgICBjYXNlIFJFQ09SRDoKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcxNigiQXVkaW9JbiIpOwotICAgICAgICBjYXNlIE9GRkxPQUQ6Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nMTYoIkF1ZGlvT2ZmbG9hZCIpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR19BU1NFUlQoZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuIFN0cmluZzE2KCJBdWRpb1Vua25vd24iKTsKKyAgICBjYXNlIE1JWEVSOgorICAgICAgICByZXR1cm4gU3RyaW5nMTYoIkF1ZGlvTWl4Iik7CisgICAgY2FzZSBESVJFQ1Q6CisgICAgICAgIHJldHVybiBTdHJpbmcxNigiQXVkaW9EaXJlY3RPdXQiKTsKKyAgICBjYXNlIERVUExJQ0FUSU5HOgorICAgICAgICByZXR1cm4gU3RyaW5nMTYoIkF1ZGlvRHVwIik7CisgICAgY2FzZSBSRUNPUkQ6CisgICAgICAgIHJldHVybiBTdHJpbmcxNigiQXVkaW9JbiIpOworICAgIGNhc2UgT0ZGTE9BRDoKKyAgICAgICAgcmV0dXJuIFN0cmluZzE2KCJBdWRpb09mZmxvYWQiKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HX0FTU0VSVChmYWxzZSk7CisgICAgICAgIHJldHVybiBTdHJpbmcxNigiQXVkaW9Vbmtub3duIik7CiAgICAgfQogfQogCkBAIC02NzQsNyArOTIwLDcgQEAKICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgbVdha2VMb2NrVG9rZW4gPSBiaW5kZXI7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoImFjcXVpcmVXYWtlTG9ja19sKCkgJXMgc3RhdHVzICVkIiwgbU5hbWUsIHN0YXR1cyk7CisgICAgICAgIEFMT0dWKCJhY3F1aXJlV2FrZUxvY2tfbCgpICVzIHN0YXR1cyAlZCIsIG1UaHJlYWROYW1lLCBzdGF0dXMpOwogICAgIH0KIH0KIApAQCAtNjg3LDcgKzkzMyw3IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6cmVsZWFzZVdha2VMb2NrX2woKQogewogICAgIGlmIChtV2FrZUxvY2tUb2tlbiAhPSAwKSB7Ci0gICAgICAgIEFMT0dWKCJyZWxlYXNlV2FrZUxvY2tfbCgpICVzIiwgbU5hbWUpOworICAgICAgICBBTE9HVigicmVsZWFzZVdha2VMb2NrX2woKSAlcyIsIG1UaHJlYWROYW1lKTsKICAgICAgICAgaWYgKG1Qb3dlck1hbmFnZXIgIT0gMCkgewogICAgICAgICAgICAgbVBvd2VyTWFuYWdlci0+cmVsZWFzZVdha2VMb2NrKG1XYWtlTG9ja1Rva2VuLCAwLAogICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIEZJWE1FIGZvcmNlIG9uZXdheSBjb250cmFyeSB0byAuYWlkbCAqLyk7CkBAIC03MDIsMTMgKzk0OCwxMiBAQAogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6Z2V0UG93ZXJNYW5hZ2VyX2woKSB7Ci0KLSAgICBpZiAobVBvd2VyTWFuYWdlciA9PSAwKSB7CisgICAgaWYgKG1TeXN0ZW1SZWFkeSAmJiBtUG93ZXJNYW5hZ2VyID09IDApIHsKICAgICAgICAgLy8gdXNlIGNoZWNrU2VydmljZSgpIHRvIGF2b2lkIGJsb2NraW5nIGlmIHBvd2VyIHNlcnZpY2UgaXMgbm90IHVwIHlldAogICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPQogICAgICAgICAgICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmNoZWNrU2VydmljZShTdHJpbmcxNigicG93ZXIiKSk7CiAgICAgICAgIGlmIChiaW5kZXIgPT0gMCkgewotICAgICAgICAgICAgQUxPR1coIlRocmVhZCAlcyBjYW5ub3QgY29ubmVjdCB0byB0aGUgcG93ZXIgbWFuYWdlciBzZXJ2aWNlIiwgbU5hbWUpOworICAgICAgICAgICAgQUxPR1coIlRocmVhZCAlcyBjYW5ub3QgY29ubmVjdCB0byB0aGUgcG93ZXIgbWFuYWdlciBzZXJ2aWNlIiwgbVRocmVhZE5hbWUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbVBvd2VyTWFuYWdlciA9IGludGVyZmFjZV9jYXN0PElQb3dlck1hbmFnZXI+KGJpbmRlcik7CiAgICAgICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCk7CkBAIC03MTcsNyArOTYyLDYgQEAKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnVwZGF0ZVdha2VMb2NrVWlkc19sKGNvbnN0IFNvcnRlZFZlY3RvcjxpbnQ+ICZ1aWRzKSB7Ci0KICAgICBnZXRQb3dlck1hbmFnZXJfbCgpOwogICAgIGlmIChtV2FrZUxvY2tUb2tlbiA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJubyB3YWtlIGxvY2sgdG8gdXBkYXRlISIpOwpAQCAtNzI4LDcgKzk3Miw3IEBACiAgICAgICAgIHN0YXR1c190IHN0YXR1czsKICAgICAgICAgc3RhdHVzID0gbVBvd2VyTWFuYWdlci0+dXBkYXRlV2FrZUxvY2tVaWRzKG1XYWtlTG9ja1Rva2VuLCB1aWRzLnNpemUoKSwgdWlkcy5hcnJheSgpLAogICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIEZJWE1FIGZvcmNlIG9uZXdheSBjb250cmFyeSB0byAuYWlkbCAqLyk7Ci0gICAgICAgIEFMT0dWKCJhY3F1aXJlV2FrZUxvY2tfbCgpICVzIHN0YXR1cyAlZCIsIG1OYW1lLCBzdGF0dXMpOworICAgICAgICBBTE9HVigiYWNxdWlyZVdha2VMb2NrX2woKSAlcyBzdGF0dXMgJWQiLCBtVGhyZWFkTmFtZSwgc3RhdHVzKTsKICAgICB9CiB9CiAKQEAgLTkxMiw3ICsxMTU2LDcgQEAKICAgICAvLyBtU2lua0J1ZmZlciBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggZWZmZWN0IHByb2Nlc3NpbmcgKFBDTSAxNiBzdGVyZW8pLgogICAgIGlmIChtVHlwZSA9PSBESVJFQ1QpIHsKICAgICAgICAgQUxPR1coImNyZWF0ZUVmZmVjdF9sKCkgQ2Fubm90IGFkZCBlZmZlY3QgJXMgb24gRGlyZWN0IG91dHB1dCB0eXBlIHRocmVhZCAlcyIsCi0gICAgICAgICAgICAgICAgZGVzYy0+bmFtZSwgbU5hbWUpOworICAgICAgICAgICAgICAgIGRlc2MtPm5hbWUsIG1UaHJlYWROYW1lKTsKICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KQEAgLTkzNiw3ICsxMTgwLDggQEAKICAgICAgICAgY2FzZSBEVVBMSUNBVElORzoKICAgICAgICAgY2FzZSBSRUNPUkQ6CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0X2woKSBDYW5ub3QgYWRkIGdsb2JhbCBlZmZlY3QgJXMgb24gdGhyZWFkICVzIiwgZGVzYy0+bmFtZSwgbU5hbWUpOworICAgICAgICAgICAgQUxPR1coImNyZWF0ZUVmZmVjdF9sKCkgQ2Fubm90IGFkZCBnbG9iYWwgZWZmZWN0ICVzIG9uIHRocmVhZCAlcyIsCisgICAgICAgICAgICAgICAgICAgIGRlc2MtPm5hbWUsIG1UaHJlYWROYW1lKTsKICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIH0KQEAgLTExNTgsNiArMTQwMywyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVDsKIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnN5c3RlbVJlYWR5KCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtU3lzdGVtUmVhZHkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtU3lzdGVtUmVhZHkgPSB0cnVlOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGVuZGluZ0NvbmZpZ0V2ZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBzZW5kQ29uZmlnRXZlbnRfbChtUGVuZGluZ0NvbmZpZ0V2ZW50cy5lZGl0SXRlbUF0KGkpKTsKKyAgICB9CisgICAgbVBlbmRpbmdDb25maWdFdmVudHMuY2xlYXIoKTsKK30KKwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyAgICAgIFBsYXliYWNrCkBAIC0xMTY3LDggKzE0MjYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfdCB0eXBlKQotICAgIDogICBUaHJlYWRCYXNlKGF1ZGlvRmxpbmdlciwgaWQsIGRldmljZSwgQVVESU9fREVWSUNFX05PTkUsIHR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN5c3RlbVJlYWR5KQorICAgIDogICBUaHJlYWRCYXNlKGF1ZGlvRmxpbmdlciwgaWQsIGRldmljZSwgQVVESU9fREVWSUNFX05PTkUsIHR5cGUsIHN5c3RlbVJlYWR5KSwKICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQoMCksIG1TaW5rQnVmZmVyKE5VTEwpLAogICAgICAgICBtTWl4ZXJCdWZmZXJFbmFibGVkKEF1ZGlvRmxpbmdlcjo6a0VuYWJsZUV4dGVuZGVkUHJlY2lzaW9uKSwKICAgICAgICAgbU1peGVyQnVmZmVyKE5VTEwpLApAQCAtMTE4Nyw3ICsxNDQ3LDcgQEAKICAgICAgICAgbUxhc3RXcml0ZVRpbWUoMCksIG1OdW1Xcml0ZXMoMCksIG1OdW1EZWxheWVkV3JpdGVzKDApLCBtSW5Xcml0ZShmYWxzZSksCiAgICAgICAgIG1NaXhlclN0YXR1cyhNSVhFUl9JRExFKSwKICAgICAgICAgbU1peGVyU3RhdHVzSWdub3JpbmdGYXN0VHJhY2tzKE1JWEVSX0lETEUpLAotICAgICAgICBzdGFuZGJ5RGVsYXkoQXVkaW9GbGluZ2VyOjptU3RhbmRieVRpbWVJbk5zZWNzKSwKKyAgICAgICAgbVN0YW5kYnlEZWxheU5zKEF1ZGlvRmxpbmdlcjo6bVN0YW5kYnlUaW1lSW5Oc2VjcyksCiAgICAgICAgIG1CeXRlc1JlbWFpbmluZygwKSwKICAgICAgICAgbUN1cnJlbnRXcml0ZUxlbmd0aCgwKSwKICAgICAgICAgbVVzZUFzeW5jV3JpdGUoZmFsc2UpLApAQCAtMTIwMSw4ICsxNDYxLDggQEAKICAgICAgICAgLy8gbUxhdGNoRCwgbUxhdGNoUSwKICAgICAgICAgbUxhdGNoRFZhbGlkKGZhbHNlKSwgbUxhdGNoUVZhbGlkKGZhbHNlKQogewotICAgIHNucHJpbnRmKG1OYW1lLCBrTmFtZUxlbmd0aCwgIkF1ZGlvT3V0XyVYIiwgaWQpOwotICAgIG1OQkxvZ1dyaXRlciA9IGF1ZGlvRmxpbmdlci0+bmV3V3JpdGVyX2woa0xvZ1NpemUsIG1OYW1lKTsKKyAgICBzbnByaW50ZihtVGhyZWFkTmFtZSwga1RocmVhZE5hbWVMZW5ndGgsICJBdWRpb091dF8lWCIsIGlkKTsKKyAgICBtTkJMb2dXcml0ZXIgPSBhdWRpb0ZsaW5nZXItPm5ld1dyaXRlcl9sKGtMb2dTaXplLCBtVGhyZWFkTmFtZSk7CiAKICAgICAvLyBBc3N1bWVzIGNvbnN0cnVjdG9yIGlzIGNhbGxlZCBieSBBdWRpb0ZsaW5nZXIgd2l0aCBpdCdzIG1Mb2NrIGhlbGQsIGJ1dAogICAgIC8vIGl0IHdvdWxkIGJlIHNhZmVyIHRvIGV4cGxpY2l0bHkgcGFzcyBpbml0aWFsIG1hc3RlclZvbHVtZS9tYXN0ZXJNdXRlIGFzCkBAIC0xMzE1LDcgKzE1NzUsMTAgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKIHsKLSAgICBkcHJpbnRmKGZkLCAiXG5PdXRwdXQgdGhyZWFkICVwOlxuIiwgdGhpcyk7CisgICAgZHByaW50ZihmZCwgIlxuT3V0cHV0IHRocmVhZCAlcCB0eXBlICVkICglcyk6XG4iLCB0aGlzLCB0eXBlKCksIHRocmVhZFR5cGVUb1N0cmluZyh0eXBlKCkpKTsKKworICAgIGR1bXBCYXNlKGZkLCBhcmdzKTsKKwogICAgIGRwcmludGYoZmQsICIgIE5vcm1hbCBmcmFtZSBjb3VudDogJXp1XG4iLCBtTm9ybWFsRnJhbWVDb3VudCk7CiAgICAgZHByaW50ZihmZCwgIiAgTGFzdCB3cml0ZSBvY2N1cnJlZCAobXNlY3MpOiAlbGx1XG4iLCBuczJtcyhzeXN0ZW1UaW1lKCkgLSBtTGFzdFdyaXRlVGltZSkpOwogICAgIGRwcmludGYoZmQsICIgIFRvdGFsIHdyaXRlczogJWRcbiIsIG1OdW1Xcml0ZXMpOwpAQCAtMTMyNiwxNSArMTU4OSwxNyBAQAogICAgIGRwcmludGYoZmQsICIgIE1peGVyIGJ1ZmZlcjogJXBcbiIsIG1NaXhlckJ1ZmZlcik7CiAgICAgZHByaW50ZihmZCwgIiAgRWZmZWN0IGJ1ZmZlcjogJXBcbiIsIG1FZmZlY3RCdWZmZXIpOwogICAgIGRwcmludGYoZmQsICIgIEZhc3QgdHJhY2sgYXZhaWxNYXNrPSUjeFxuIiwgbUZhc3RUcmFja0F2YWlsTWFzayk7Ci0KLSAgICBkdW1wQmFzZShmZCwgYXJncyk7CisgICAgQXVkaW9TdHJlYW1PdXQgKm91dHB1dCA9IG1PdXRwdXQ7CisgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBvdXRwdXQgIT0gTlVMTCA/IG91dHB1dC0+ZmxhZ3MgOiBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgIFN0cmluZzggZmxhZ3NBc1N0cmluZyA9IG91dHB1dEZsYWdzVG9TdHJpbmcoZmxhZ3MpOworICAgIGRwcmludGYoZmQsICIgIEF1ZGlvU3RyZWFtT3V0OiAlcCBmbGFncyAlI3ggKCVzKVxuIiwgb3V0cHV0LCBmbGFncywgZmxhZ3NBc1N0cmluZy5zdHJpbmcoKSk7CiB9CiAKIC8vIFRocmVhZCB2aXJ0dWFscwogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Om9uRmlyc3RSZWYoKQogewotICAgIHJ1bihtTmFtZSwgQU5EUk9JRF9QUklPUklUWV9VUkdFTlRfQVVESU8pOworICAgIHJ1bihtVGhyZWFkTmFtZSwgQU5EUk9JRF9QUklPUklUWV9VUkdFTlRfQVVESU8pOwogfQogCiAvLyBUaHJlYWRCYXNlIHZpcnR1YWxzCkBAIC0xMzc4LDE5ICsxNjQzLDIyIEBACiAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAoc2hhcmVkQnVmZmVyICE9IDApCiAgICAgICAgICAgICAgICkgfHwKLSAgICAgICAgICAgICAgLy8gdXNlIGNhc2UgMjogY2FsbGJhY2sgaGFuZGxlciBhbmQgZnJhbWUgY291bnQgaXMgZGVmYXVsdCBvciBhdCBsZWFzdCBhcyBsYXJnZSBhcyBIQUwKKyAgICAgICAgICAgICAgLy8gdXNlIGNhc2UgMjogZnJhbWUgY291bnQgaXMgZGVmYXVsdCBvciBhdCBsZWFzdCBhcyBsYXJnZSBhcyBIQUwKICAgICAgICAgICAgICAgKAotICAgICAgICAgICAgICAgICh0aWQgIT0gLTEpICYmCisgICAgICAgICAgICAgICAgLy8gd2UgZm9ybWVybHkgY2hlY2tlZCBmb3IgYSBjYWxsYmFjayBoYW5kbGVyIChub24tMCB0aWQpLAorICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGF0IGlzIG5vIGxvbmdlciByZXF1aXJlZCBmb3IgVFJBTlNGRVJfT0JUQUlOIG1vZGUKICAgICAgICAgICAgICAgICAoKGZyYW1lQ291bnQgPT0gMCkgfHwKICAgICAgICAgICAgICAgICAoZnJhbWVDb3VudCA+PSBtRnJhbWVDb3VudCkpCiAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICkgJiYKICAgICAgICAgICAgIC8vIFBDTSBkYXRhCiAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgJiYKLSAgICAgICAgICAgIC8vIGlkZW50aWNhbCBjaGFubmVsIG1hc2sgdG8gc2luaywgb3IgbW9ubyBpbiBhbmQgc3RlcmVvIHNpbmsKKyAgICAgICAgICAgIC8vIFRPRE86IGV4dHJhY3QgYXMgYSBkYXRhIGxpYnJhcnkgZnVuY3Rpb24gdGhhdCBjaGVja3MgdGhhdCBhIGNvbXB1dGF0aW9uYWxseQorICAgICAgICAgICAgLy8gZXhwZW5zaXZlIGRvd25taXhlciBpcyBub3QgcmVxdWlyZWQ6IGlzRmFzdE91dHB1dENoYW5uZWxDb252ZXJzaW9uKCkKICAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBtQ2hhbm5lbE1hc2sgfHwKLSAgICAgICAgICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX01PTk8gJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyB8fAorICAgICAgICAgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICYmIG1DaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gKi8pKSAmJgogICAgICAgICAgICAgLy8gaGFyZHdhcmUgc2FtcGxlIHJhdGUKICAgICAgICAgICAgIChzYW1wbGVSYXRlID09IG1TYW1wbGVSYXRlKSAmJgogICAgICAgICAgICAgLy8gbm9ybWFsIG1peGVyIGhhcyBhbiBhc3NvY2lhdGVkIGZhc3QgbWl4ZXIKQEAgLTE0MjAsMjAgKzE2ODgsMzEgQEAKICAgICAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCksCiAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIHNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlLCBoYXNGYXN0TWl4ZXIoKSwgdGlkLCBtRmFzdFRyYWNrQXZhaWxNYXNrKTsKICAgICAgICAgKmZsYWdzICY9IH5JQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUOwotICAgICAgICAvLyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIEF1ZGlvVHJhY2sgY2FsY3VsYXRpb24sIGJ1ZmZlciBkZXB0aCBpcyBmb3JjZWQKLSAgICAgICAgLy8gdG8gYmUgYXQgbGVhc3QgMiB4IHRoZSBub3JtYWwgbWl4ZXIgZnJhbWUgY291bnQgYW5kIGNvdmVyIGF1ZGlvIGhhcmR3YXJlIGxhdGVuY3kuCi0gICAgICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgdG9vIGNvbnNlcnZhdGl2ZSwgYnV0IGxlZ2FjeSBhcHBsaWNhdGlvbiBjb2RlIG1heSBkZXBlbmQgb24gaXQuCi0gICAgICAgIC8vIElmIHlvdSBjaGFuZ2UgdGhpcyBjYWxjdWxhdGlvbiwgYWxzbyByZXZpZXcgdGhlIHN0YXJ0IHRocmVzaG9sZCB3aGljaCBpcyByZWxhdGVkLgorICAgICAgfQorICAgIH0KKyAgICAvLyBGb3Igbm9ybWFsIFBDTSBzdHJlYW1pbmcgdHJhY2tzLCB1cGRhdGUgbWluaW11bSBmcmFtZSBjb3VudC4KKyAgICAvLyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIEF1ZGlvVHJhY2sgY2FsY3VsYXRpb24sIGJ1ZmZlciBkZXB0aCBpcyBmb3JjZWQKKyAgICAvLyB0byBiZSBhdCBsZWFzdCAyIHggdGhlIG5vcm1hbCBtaXhlciBmcmFtZSBjb3VudCBhbmQgY292ZXIgYXVkaW8gaGFyZHdhcmUgbGF0ZW5jeS4KKyAgICAvLyBUaGlzIGlzIHByb2JhYmx5IHRvbyBjb25zZXJ2YXRpdmUsIGJ1dCBsZWdhY3kgYXBwbGljYXRpb24gY29kZSBtYXkgZGVwZW5kIG9uIGl0LgorICAgIC8vIElmIHlvdSBjaGFuZ2UgdGhpcyBjYWxjdWxhdGlvbiwgYWxzbyByZXZpZXcgdGhlIHN0YXJ0IHRocmVzaG9sZCB3aGljaCBpcyByZWxhdGVkLgorICAgIGlmICghKCpmbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpCisgICAgICAgICAgICAmJiBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgJiYgc2hhcmVkQnVmZmVyID09IDApIHsKKyAgICAgICAgLy8gdGhpcyBtdXN0IG1hdGNoIEF1ZGlvVHJhY2suY3BwIGNhbGN1bGF0ZU1pbkZyYW1lQ291bnQoKS4KKyAgICAgICAgLy8gVE9ETzogTW92ZSB0byBhIGNvbW1vbiBsaWJyYXJ5CiAgICAgICAgIHVpbnQzMl90IGxhdGVuY3lNcyA9IG1PdXRwdXQtPnN0cmVhbS0+Z2V0X2xhdGVuY3kobU91dHB1dC0+c3RyZWFtKTsKICAgICAgICAgdWludDMyX3QgbWluQnVmQ291bnQgPSBsYXRlbmN5TXMgLyAoKDEwMDAgKiBtTm9ybWFsRnJhbWVDb3VudCkgLyBtU2FtcGxlUmF0ZSk7CiAgICAgICAgIGlmIChtaW5CdWZDb3VudCA8IDIpIHsKICAgICAgICAgICAgIG1pbkJ1ZkNvdW50ID0gMjsKICAgICAgICAgfQotICAgICAgICBzaXplX3QgbWluRnJhbWVDb3VudCA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbWluQnVmQ291bnQ7Ci0gICAgICAgIGlmIChmcmFtZUNvdW50IDwgbWluRnJhbWVDb3VudCkgeworICAgICAgICAvLyBGb3Igbm9ybWFsIG1peGluZyB0cmFja3MsIGlmIHNwZWVkIGlzID4gMS4wZiAobm9ybWFsKSwgQXVkaW9UcmFjaworICAgICAgICAvLyBvciB0aGUgY2xpZW50IHNob3VsZCBjb21wdXRlIGFuZCBwYXNzIGluIGEgbGFyZ2VyIGJ1ZmZlciByZXF1ZXN0LgorICAgICAgICBzaXplX3QgbWluRnJhbWVDb3VudCA9CisgICAgICAgICAgICAgICAgbWluQnVmQ291bnQgKiBzb3VyY2VGcmFtZXNOZWVkZWRXaXRoVGltZXN0cmV0Y2goCisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBtTm9ybWFsRnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9OT1JNQUwgLypzcGVlZCovKTsKKyAgICAgICAgaWYgKGZyYW1lQ291bnQgPCBtaW5GcmFtZUNvdW50KSB7IC8vIGluY2x1ZGluZyBmcmFtZUNvdW50ID09IDAKICAgICAgICAgICAgIGZyYW1lQ291bnQgPSBtaW5GcmFtZUNvdW50OwogICAgICAgICB9Ci0gICAgICB9CiAgICAgfQogICAgICpwRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CiAKQEAgLTE3MjYsMzIgKzIwMDUsMjkgQEAKICAgICByZXR1cm4gb3V0X3M4OwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmF1ZGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGludCBwYXJhbSkgewotICAgIEF1ZGlvU3lzdGVtOjpPdXRwdXREZXNjcmlwdG9yIGRlc2M7Ci0gICAgdm9pZCAqcGFyYW0yID0gTlVMTDsKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6aW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkKSB7CisgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGRlc2MgPSBuZXcgQXVkaW9Jb0Rlc2NyaXB0b3IoKTsKKyAgICBBTE9HVigiUGxheWJhY2tUaHJlYWQ6OmlvQ29uZmlnQ2hhbmdlZCwgdGhyZWFkICVwLCBldmVudCAlZCIsIHRoaXMsIGV2ZW50KTsKIAotICAgIEFMT0dWKCJQbGF5YmFja1RocmVhZDo6YXVkaW9Db25maWdDaGFuZ2VkLCB0aHJlYWQgJXAsIGV2ZW50ICVkLCBwYXJhbSAlZCIsIHRoaXMsIGV2ZW50LAotICAgICAgICAgICAgcGFyYW0pOworICAgIGRlc2MtPm1Jb0hhbmRsZSA9IG1JZDsKIAogICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEF1ZGlvU3lzdGVtOjpPVVRQVVRfT1BFTkVEOgotICAgIGNhc2UgQXVkaW9TeXN0ZW06Ok9VVFBVVF9DT05GSUdfQ0hBTkdFRDoKLSAgICAgICAgZGVzYy5jaGFubmVsTWFzayA9IG1DaGFubmVsTWFzazsKLSAgICAgICAgZGVzYy5zYW1wbGluZ1JhdGUgPSBtU2FtcGxlUmF0ZTsKLSAgICAgICAgZGVzYy5mb3JtYXQgPSBtRm9ybWF0OwotICAgICAgICBkZXNjLmZyYW1lQ291bnQgPSBtTm9ybWFsRnJhbWVDb3VudDsgLy8gRklYTUUgc2VlCisgICAgY2FzZSBBVURJT19PVVRQVVRfT1BFTkVEOgorICAgIGNhc2UgQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEOgorICAgICAgICBkZXNjLT5tUGF0Y2ggPSBtUGF0Y2g7CisgICAgICAgIGRlc2MtPm1DaGFubmVsTWFzayA9IG1DaGFubmVsTWFzazsKKyAgICAgICAgZGVzYy0+bVNhbXBsaW5nUmF0ZSA9IG1TYW1wbGVSYXRlOworICAgICAgICBkZXNjLT5tRm9ybWF0ID0gbUZvcm1hdDsKKyAgICAgICAgZGVzYy0+bUZyYW1lQ291bnQgPSBtTm9ybWFsRnJhbWVDb3VudDsgLy8gRklYTUUgc2VlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb0ZsaW5nZXI6OmZyYW1lQ291bnQoYXVkaW9faW9faGFuZGxlX3QpCi0gICAgICAgIGRlc2MubGF0ZW5jeSA9IGxhdGVuY3lfbCgpOwotICAgICAgICBwYXJhbTIgPSAmZGVzYzsKKyAgICAgICAgZGVzYy0+bUxhdGVuY3kgPSBsYXRlbmN5X2woKTsKICAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIEF1ZGlvU3lzdGVtOjpTVFJFQU1fQ09ORklHX0NIQU5HRUQ6Ci0gICAgICAgIHBhcmFtMiA9ICZwYXJhbTsKLSAgICBjYXNlIEF1ZGlvU3lzdGVtOjpPVVRQVVRfQ0xPU0VEOgorICAgIGNhc2UgQVVESU9fT1VUUFVUX0NMT1NFRDoKICAgICBkZWZhdWx0OgogICAgICAgICBicmVhazsKICAgICB9Ci0gICAgbUF1ZGlvRmxpbmdlci0+YXVkaW9Db25maWdDaGFuZ2VkKGV2ZW50LCBtSWQsIHBhcmFtMik7CisgICAgbUF1ZGlvRmxpbmdlci0+aW9Db25maWdDaGFuZ2VkKGV2ZW50LCBkZXNjLCBwaWQpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OndyaXRlQ2FsbGJhY2soKQpAQCAtMTgxMCw4ICsyMDg2LDggQEAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6cmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpCiB7CiAgICAgLy8gdW5mb3J0dW5hdGVseSB3ZSBoYXZlIG5vIHdheSBvZiByZWNvdmVyaW5nIGZyb20gZXJyb3JzIGhlcmUsIGhlbmNlIHRoZSBMT0dfQUxXQVlTX0ZBVEFMCi0gICAgbVNhbXBsZVJhdGUgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKLSAgICBtQ2hhbm5lbE1hc2sgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKKyAgICBtU2FtcGxlUmF0ZSA9IG1PdXRwdXQtPmdldFNhbXBsZVJhdGUoKTsKKyAgICBtQ2hhbm5lbE1hc2sgPSBtT3V0cHV0LT5nZXRDaGFubmVsTWFzaygpOwogICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwobUNoYW5uZWxNYXNrKSkgewogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJIQUwgY2hhbm5lbCBtYXNrICUjeCBub3QgdmFsaWQgZm9yIG91dHB1dCIsIG1DaGFubmVsTWFzayk7CiAgICAgfQpAQCAtMTgyMSw4ICsyMDk3LDEyIEBACiAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrKTsKICAgICB9CiAgICAgbUNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtQ2hhbm5lbE1hc2spOworCisgICAgLy8gR2V0IGFjdHVhbCBIQUwgZm9ybWF0LgogICAgIG1IQUxGb3JtYXQgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfZm9ybWF0KCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7Ci0gICAgbUZvcm1hdCA9IG1IQUxGb3JtYXQ7CisgICAgLy8gR2V0IGZvcm1hdCBmcm9tIHRoZSBzaGltLCB3aGljaCB3aWxsIGJlIGRpZmZlcmVudCB0aGFuIHRoZSBIQUwgZm9ybWF0CisgICAgLy8gaWYgcGxheWluZyBjb21wcmVzc2VkIGF1ZGlvIG92ZXIgSERNSSBwYXNzdGhyb3VnaC4KKyAgICBtRm9ybWF0ID0gbU91dHB1dC0+Z2V0Rm9ybWF0KCk7CiAgICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQobUZvcm1hdCkpIHsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiSEFMIGZvcm1hdCAlI3ggbm90IHZhbGlkIGZvciBvdXRwdXQiLCBtRm9ybWF0KTsKICAgICB9CkBAIC0xODMxLDcgKzIxMTEsNyBAQAogICAgICAgICBMT0dfRkFUQUwoIkhBTCBmb3JtYXQgJSN4IG5vdCBzdXBwb3J0ZWQgZm9yIG1peGVkIG91dHB1dCIsCiAgICAgICAgICAgICAgICAgbUZvcm1hdCk7CiAgICAgfQotICAgIG1GcmFtZVNpemUgPSBhdWRpb19zdHJlYW1fb3V0X2ZyYW1lX3NpemUobU91dHB1dC0+c3RyZWFtKTsKKyAgICBtRnJhbWVTaXplID0gbU91dHB1dC0+Z2V0RnJhbWVTaXplKCk7CiAgICAgbUJ1ZmZlclNpemUgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfYnVmZmVyX3NpemUoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKICAgICBtRnJhbWVDb3VudCA9IG1CdWZmZXJTaXplIC8gbUZyYW1lU2l6ZTsKICAgICBpZiAobUZyYW1lQ291bnQgJiAxNSkgewpAQCAtMTg2MCw2ICsyMTQwLDI1IEBACiAgICAgICAgICAgICBBTE9HVygiZGlyZWN0IG91dHB1dCBpbXBsZW1lbnRzIHJlc3VtZSBidXQgbm90IHBhdXNlIik7CiAgICAgICAgIH0KICAgICB9CisgICAgaWYgKCFtSHdTdXBwb3J0c1BhdXNlICYmIG1PdXRwdXQtPmZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQykgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJIV19BVl9TWU5DIHJlcXVlc3RlZCBidXQgSEFMIGRvZXMgbm90IGltcGxlbWVudCBwYXVzZSBhbmQgcmVzdW1lIik7CisgICAgfQorCisgICAgaWYgKG1UeXBlID09IERVUExJQ0FUSU5HICYmIG1NaXhlckJ1ZmZlckVuYWJsZWQgJiYgbUVmZmVjdEJ1ZmZlckVuYWJsZWQpIHsKKyAgICAgICAgLy8gRm9yIGJlc3QgcHJlY2lzaW9uLCB3ZSB1c2UgZmxvYXQgaW5zdGVhZCBvZiB0aGUgYXNzb2NpYXRlZCBvdXRwdXQKKyAgICAgICAgLy8gZGV2aWNlIGZvcm1hdCAodHlwaWNhbGx5IFBDTSAxNiBiaXQpLgorCisgICAgICAgIG1Gb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICAgICAgICBtRnJhbWVTaXplID0gbUNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUZvcm1hdCk7CisgICAgICAgIG1CdWZmZXJTaXplID0gbUZyYW1lU2l6ZSAqIG1GcmFtZUNvdW50OworCisgICAgICAgIC8vIFRPRE86IFdlIGN1cnJlbnRseSB1c2UgdGhlIGFzc29jaWF0ZWQgb3V0cHV0IGRldmljZSBjaGFubmVsIG1hc2sgYW5kIHNhbXBsZSByYXRlLgorICAgICAgICAvLyAoMSkgUGVyaGFwcyB1c2UgdGhlIE9SZWQgY2hhbm5lbCBtYXNrIG9mIGFsbCBkb3duc3RyZWFtIE1peGVyVGhyZWFkcworICAgICAgICAvLyAoaWYgYSB2YWxpZCBtYXNrKSB0byBhdm9pZCBwcmVtYXR1cmUgZG93bm1peC4KKyAgICAgICAgLy8gKDIpIFBlcmhhcHMgdXNlIHRoZSBtYXhpbXVtIHNhbXBsZSByYXRlIG9mIGFsbCBkb3duc3RyZWFtIE1peGVyVGhyZWFkcworICAgICAgICAvLyBpbnN0ZWFkIG9mIHRoZSBvdXRwdXQgZGV2aWNlIHNhbXBsZSByYXRlIHRvIGF2b2lkIGxvc3Mgb2YgaGlnaCBmcmVxdWVuY3kgaW5mb3JtYXRpb24uCisgICAgICAgIC8vIFRoaXMgbWF5IG5lZWQgdG8gYmUgdXBkYXRlZCBhcyBNaXhlclRocmVhZC9PdXRwdXRUcmFja3MgYXJlIGFkZGVkIGFuZCBub3QgaGVyZS4KKyAgICB9CiAKICAgICAvLyBDYWxjdWxhdGUgc2l6ZSBvZiBub3JtYWwgc2luayBidWZmZXIgcmVsYXRpdmUgdG8gdGhlIEhBTCBvdXRwdXQgYnVmZmVyIHNpemUKICAgICBkb3VibGUgbXVsdGlwbGllciA9IDEuMDsKQEAgLTE5MDUsNiArMjIwNCwxMiBAQAogICAgIEFMT0dJKCJIQUwgb3V0cHV0IGJ1ZmZlciBzaXplICV1IGZyYW1lcywgbm9ybWFsIHNpbmsgYnVmZmVyIHNpemUgJXUgZnJhbWVzIiwgbUZyYW1lQ291bnQsCiAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCk7CiAKKyAgICAvLyBDaGVjayBpZiB3ZSB3YW50IHRvIHRocm90dGxlIHRoZSBwcm9jZXNzaW5nIHRvIG5vIG1vcmUgdGhhbiAyeCBub3JtYWwgcmF0ZQorICAgIG1UaHJlYWRUaHJvdHRsZSA9IHByb3BlcnR5X2dldF9ib29sKCJhZi50aHJlYWQudGhyb3R0bGUiLCB0cnVlIC8qIGRlZmF1bHRfdmFsdWUgKi8pOworICAgIG1UaHJlYWRUaHJvdHRsZVRpbWVNcyA9IDA7CisgICAgbVRocmVhZFRocm90dGxlRW5kTXMgPSAwOworICAgIG1IYWxmQnVmZmVyTXMgPSBtTm9ybWFsRnJhbWVDb3VudCAqIDEwMDAgLyAoMiAqIG1TYW1wbGVSYXRlKTsKKwogICAgIC8vIG1TaW5rQnVmZmVyIGlzIHRoZSBzaW5rIGJ1ZmZlci4gIFNpemUgaXMgYWx3YXlzIG11bHRpcGxlLW9mLTE2IGZyYW1lcy4KICAgICAvLyBPcmlnaW5hbGx5IHRoaXMgd2FzIGludDE2X3RbXSBhcnJheSwgbmVlZCB0byByZW1vdmUgbGVnYWN5IGltcGxpY2F0aW9ucy4KICAgICBmcmVlKG1TaW5rQnVmZmVyKTsKQEAgLTE5NjYsNyArMjI3MSw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgICAgICB1aW50MzJfdCBmcmFtZXM7Ci0gICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+Z2V0X3JlbmRlcl9wb3NpdGlvbihtT3V0cHV0LT5zdHJlYW0sICZmcmFtZXMpOworICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5nZXRSZW5kZXJQb3NpdGlvbigmZnJhbWVzKTsKICAgICAgICAgKmRzcEZyYW1lcyA9IChzaXplX3QpZnJhbWVzOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KQEAgLTIwMDgsMTMgKzIzMTMsMTMgQEAKIH0KIAogCi1BdWRpb0ZsaW5nZXI6OkF1ZGlvU3RyZWFtT3V0KiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpnZXRPdXRwdXQoKSBjb25zdAorQXVkaW9TdHJlYW1PdXQqIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmdldE91dHB1dCgpIGNvbnN0CiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICByZXR1cm4gbU91dHB1dDsKIH0KIAotQXVkaW9GbGluZ2VyOjpBdWRpb1N0cmVhbU91dCogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Y2xlYXJPdXRwdXQoKQorQXVkaW9TdHJlYW1PdXQqIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmNsZWFyT3V0cHV0KCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1ZGlvU3RyZWFtT3V0ICpvdXRwdXQgPSBtT3V0cHV0OwpAQCAtMjEzNyw2ICsyNDQyLDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGZyYW1lc1dyaXR0ZW47CiAgICAgICAgIH0KKyAgICAgICAgbUxhdGNoRFZhbGlkID0gZmFsc2U7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1Ob3JtYWxTaW5rLT5nZXRUaW1lc3RhbXAobUxhdGNoRC5tVGltZXN0YW1wKTsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgc2l6ZV90IHRvdGFsRnJhbWVzV3JpdHRlbiA9IG1Ob3JtYWxTaW5rLT5mcmFtZXNXcml0dGVuKCk7CkBAIC0yMTU5LDggKzI0NjUsNyBAQAogICAgICAgICB9CiAgICAgICAgIC8vIEZJWE1FIFdlIHNob3VsZCBoYXZlIGFuIGltcGxlbWVudGF0aW9uIG9mIHRpbWVzdGFtcHMgZm9yIGRpcmVjdCBvdXRwdXQgdGhyZWFkcy4KICAgICAgICAgLy8gVGhleSBhcmUgdXNlZCBlLmcgZm9yIG11bHRpY2hhbm5lbCBQQ00gcGxheWJhY2sgb3ZlciBIRE1JLgotICAgICAgICBieXRlc1dyaXR0ZW4gPSBtT3V0cHV0LT5zdHJlYW0tPndyaXRlKG1PdXRwdXQtPnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbVNpbmtCdWZmZXIgKyBvZmZzZXQsIG1CeXRlc1JlbWFpbmluZyk7CisgICAgICAgIGJ5dGVzV3JpdHRlbiA9IG1PdXRwdXQtPndyaXRlKChjaGFyICopbVNpbmtCdWZmZXIgKyBvZmZzZXQsIG1CeXRlc1JlbWFpbmluZyk7CiAgICAgICAgIGlmIChtVXNlQXN5bmNXcml0ZSAmJgogICAgICAgICAgICAgICAgICgoYnl0ZXNXcml0dGVuIDwgMCkgfHwgKGJ5dGVzV3JpdHRlbiA9PSAoc3NpemVfdCltQnl0ZXNSZW1haW5pbmcpKSkgewogICAgICAgICAgICAgLy8gZG8gbm90IHdhaXQgZm9yIGFzeW5jIGNhbGxiYWNrIGluIGNhc2Ugb2YgZXJyb3Igb2YgZnVsbCB3cml0ZQpAQCAtMjIwNiw5ICsyNTExLDkgQEAKIC8qCiBUaGUgZGVyaXZlZCB2YWx1ZXMgdGhhdCBhcmUgY2FjaGVkOgogIC0gbVNpbmtCdWZmZXJTaXplIGZyb20gZnJhbWUgY291bnQgKiBmcmFtZSBzaXplCi0gLSBhY3RpdmVTbGVlcFRpbWUgZnJvbSBhY3RpdmVTbGVlcFRpbWVVcygpCi0gLSBpZGxlU2xlZXBUaW1lIGZyb20gaWRsZVNsZWVwVGltZVVzKCkKLSAtIHN0YW5kYnlEZWxheSBmcm9tIG1BY3RpdmVTbGVlcFRpbWVVcyAoRElSRUNUIG9ubHkpCisgLSBtQWN0aXZlU2xlZXBUaW1lVXMgZnJvbSBhY3RpdmVTbGVlcFRpbWVVcygpCisgLSBtSWRsZVNsZWVwVGltZVVzIGZyb20gaWRsZVNsZWVwVGltZVVzKCkKKyAtIG1TdGFuZGJ5RGVsYXlOcyBmcm9tIG1BY3RpdmVTbGVlcFRpbWVVcyAoRElSRUNUIG9ubHkpCiAgLSBtYXhQZXJpb2QgZnJvbSBmcmFtZSBjb3VudCBhbmQgc2FtcGxlIHJhdGUgKE1JWEVSIG9ubHkpCiAKIFRoZSBwYXJhbWV0ZXJzIHRoYXQgYWZmZWN0IHRoZXNlIGRlcml2ZWQgdmFsdWVzIGFyZToKQEAgLTIyMjUsOCArMjUzMCw4IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmNhY2hlUGFyYW1ldGVyc19sKCkKIHsKICAgICBtU2lua0J1ZmZlclNpemUgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1GcmFtZVNpemU7Ci0gICAgYWN0aXZlU2xlZXBUaW1lID0gYWN0aXZlU2xlZXBUaW1lVXMoKTsKLSAgICBpZGxlU2xlZXBUaW1lID0gaWRsZVNsZWVwVGltZVVzKCk7CisgICAgbUFjdGl2ZVNsZWVwVGltZVVzID0gYWN0aXZlU2xlZXBUaW1lVXMoKTsKKyAgICBtSWRsZVNsZWVwVGltZVVzID0gaWRsZVNsZWVwVGltZVVzKCk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6aW52YWxpZGF0ZVRyYWNrcyhhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpCkBAIC0yMzkzLDcgKzI2OTgsNyBAQAogewogICAgIFZlY3Rvcjwgc3A8VHJhY2s+ID4gdHJhY2tzVG9SZW1vdmU7CiAKLSAgICBzdGFuZGJ5VGltZSA9IHN5c3RlbVRpbWUoKTsKKyAgICBtU3RhbmRieVRpbWVOcyA9IHN5c3RlbVRpbWUoKTsKIAogICAgIC8vIE1JWEVSCiAgICAgbnNlY3NfdCBsYXN0V2FybmluZyA9IDA7CkBAIC0yNDA1LDcgKzI3MTAsNyBAQAogICAgIGludCBsYXN0R2VuZXJhdGlvbiA9IDA7CiAKICAgICBjYWNoZVBhcmFtZXRlcnNfbCgpOwotICAgIHNsZWVwVGltZSA9IGlkbGVTbGVlcFRpbWU7CisgICAgbVNsZWVwVGltZVVzID0gbUlkbGVTbGVlcFRpbWVVczsKIAogICAgIGlmIChtVHlwZSA9PSBNSVhFUikgewogICAgICAgICBzbGVlcFRpbWVTaGlmdCA9IDA7CkBAIC0yNDY3LDE5ICsyNzcyLDI5IEBACiAgICAgICAgICAgICAgICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlbGVhc2VXYWtlTG9ja19sKCk7CisgICAgICAgICAgICAgICAgYm9vbCByZWxlYXNlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBvZmZsb2FkIGRyaXZlci4gSWRlYWxseSB3ZSB3b3VsZCByZWxlYXNlCisgICAgICAgICAgICAgICAgLy8gdGhlIHdha2UgbG9jayBldmVyeSB0aW1lLCBidXQgdGhhdCBjYXVzZXMgdGhlIGxhc3Qgb2ZmbG9hZCBidWZmZXIocykgdG8gYmUKKyAgICAgICAgICAgICAgICAvLyBkcm9wcGVkIHdoaWxlIHRoZSBkZXZpY2UgaXMgb24gYmF0dGVyeSwgc28gd2UgbmVlZCB0byBob2xkIGEgd2FrZSBsb2NrIGR1cmluZworICAgICAgICAgICAgICAgIC8vIHRoZSBkcmFpbiBwaGFzZS4KKyAgICAgICAgICAgICAgICBpZiAobUJ5dGVzUmVtYWluaW5nICYmICEobURyYWluU2VxdWVuY2UgJiAxKSkgeworICAgICAgICAgICAgICAgICAgICByZWxlYXNlV2FrZUxvY2tfbCgpOworICAgICAgICAgICAgICAgICAgICByZWxlYXNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1XYWtlTG9ja1VpZHMuY2xlYXIoKTsKICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzR2VuZXJhdGlvbisrOwogICAgICAgICAgICAgICAgIEFMT0dWKCJ3YWl0IGFzeW5jIGNvbXBsZXRpb24iKTsKICAgICAgICAgICAgICAgICBtV2FpdFdvcmtDVi53YWl0KG1Mb2NrKTsKICAgICAgICAgICAgICAgICBBTE9HVigiYXN5bmMgY29tcGxldGlvbi93YWtlIik7Ci0gICAgICAgICAgICAgICAgYWNxdWlyZVdha2VMb2NrX2woKTsKLSAgICAgICAgICAgICAgICBzdGFuZGJ5VGltZSA9IHN5c3RlbVRpbWUoKSArIHN0YW5kYnlEZWxheTsKLSAgICAgICAgICAgICAgICBzbGVlcFRpbWUgPSAwOworICAgICAgICAgICAgICAgIGlmIChyZWxlYXNlZCkgeworICAgICAgICAgICAgICAgICAgICBhY3F1aXJlV2FrZUxvY2tfbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtU3RhbmRieVRpbWVOcyA9IHN5c3RlbVRpbWUoKSArIG1TdGFuZGJ5RGVsYXlOczsKKyAgICAgICAgICAgICAgICBtU2xlZXBUaW1lVXMgPSAwOwogCiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKCFtQWN0aXZlVHJhY2tzLnNpemUoKSAmJiBzeXN0ZW1UaW1lKCkgPiBzdGFuZGJ5VGltZSkgfHwKKyAgICAgICAgICAgIGlmICgoIW1BY3RpdmVUcmFja3Muc2l6ZSgpICYmIHN5c3RlbVRpbWUoKSA+IG1TdGFuZGJ5VGltZU5zKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1N1c3BlbmRlZCgpKSB7CiAgICAgICAgICAgICAgICAgLy8gcHV0IGF1ZGlvIGhhcmR3YXJlIGludG8gc3RhbmRieSBhZnRlciBzaG9ydCBkZWxheQogICAgICAgICAgICAgICAgIGlmIChzaG91bGRTdGFuZGJ5X2woKSkgewpAQCAtMjUxNCw4ICsyODI5LDggQEAKICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzUmVtYWluaW5nID0gMDsKICAgICAgICAgICAgICAgICAgICAgY2hlY2tTaWxlbnRNb2RlX2woKTsKIAotICAgICAgICAgICAgICAgICAgICBzdGFuZGJ5VGltZSA9IHN5c3RlbVRpbWUoKSArIHN0YW5kYnlEZWxheTsKLSAgICAgICAgICAgICAgICAgICAgc2xlZXBUaW1lID0gaWRsZVNsZWVwVGltZTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YW5kYnlUaW1lTnMgPSBzeXN0ZW1UaW1lKCkgKyBtU3RhbmRieURlbGF5TnM7CisgICAgICAgICAgICAgICAgICAgIG1TbGVlcFRpbWVVcyA9IG1JZGxlU2xlZXBUaW1lVXM7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtVHlwZSA9PSBNSVhFUikgewogICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXBUaW1lU2hpZnQgPSAwOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0yNTQ2LDE1ICsyODYxLDE1IEBACiAgICAgICAgICAgICAgICAgdGhyZWFkTG9vcF9taXgoKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoKG1NaXhlclN0YXR1cyAhPSBNSVhFUl9EUkFJTl9UUkFDSykKICAgICAgICAgICAgICAgICAgICAgICAgICYmIChtTWl4ZXJTdGF0dXMgIT0gTUlYRVJfRFJBSU5fQUxMKSkgewotICAgICAgICAgICAgICAgIC8vIHRocmVhZExvb3Bfc2xlZXBUaW1lIHNldHMgc2xlZXBUaW1lIHRvIDAgaWYgZGF0YQorICAgICAgICAgICAgICAgIC8vIHRocmVhZExvb3Bfc2xlZXBUaW1lIHNldHMgbVNsZWVwVGltZVVzIHRvIDAgaWYgZGF0YQogICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgd3JpdHRlbiB0byBIQUwKICAgICAgICAgICAgICAgICB0aHJlYWRMb29wX3NsZWVwVGltZSgpOwotICAgICAgICAgICAgICAgIGlmIChzbGVlcFRpbWUgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChtU2xlZXBUaW1lVXMgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gbVNpbmtCdWZmZXJTaXplOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIEVpdGhlciB0aHJlYWRMb29wX21peCgpIG9yIHRocmVhZExvb3Bfc2xlZXBUaW1lKCkgc2hvdWxkIGhhdmUgc2V0Ci0gICAgICAgICAgICAvLyBtTWl4ZXJCdWZmZXIgd2l0aCBkYXRhIGlmIG1NaXhlckJ1ZmZlclZhbGlkIGlzIHRydWUgYW5kIHNsZWVwVGltZSA9PSAwLgorICAgICAgICAgICAgLy8gbU1peGVyQnVmZmVyIHdpdGggZGF0YSBpZiBtTWl4ZXJCdWZmZXJWYWxpZCBpcyB0cnVlIGFuZCBtU2xlZXBUaW1lVXMgPT0gMC4KICAgICAgICAgICAgIC8vIE1lcmdlIG1NaXhlckJ1ZmZlciBkYXRhIGludG8gbUVmZmVjdEJ1ZmZlciAoaWYgYW55IGVmZmVjdHMgYXJlIHZhbGlkKQogICAgICAgICAgICAgLy8gb3IgbVNpbmtCdWZmZXIgKGlmIHRoZXJlIGFyZSBubyBlZmZlY3RzKS4KICAgICAgICAgICAgIC8vCkBAIC0yNTYyLDcgKzI4NzcsNyBAQAogICAgICAgICAgICAgLy8gc3VwcG9ydCBoaWdoZXIgcHJlY2lzaW9uLCB0aGlzIG5lZWRzIHRvIG1vdmUuCiAgICAgICAgICAgICAvLwogICAgICAgICAgICAgLy8gbU1peGVyQnVmZmVyVmFsaWQgaXMgb25seSBzZXQgdHJ1ZSBieSBNaXhlclRocmVhZDo6cHJlcGFyZVRyYWNrc19sKCkuCi0gICAgICAgICAgICAvLyBUT0RPIHVzZSBzbGVlcFRpbWUgPT0gMCBhcyBhbiBhZGRpdGlvbmFsIGNvbmRpdGlvbi4KKyAgICAgICAgICAgIC8vIFRPRE8gdXNlIG1TbGVlcFRpbWVVcyA9PSAwIGFzIGFuIGFkZGl0aW9uYWwgY29uZGl0aW9uLgogICAgICAgICAgICAgaWYgKG1NaXhlckJ1ZmZlclZhbGlkKSB7CiAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyID0gbUVmZmVjdEJ1ZmZlclZhbGlkID8gbUVmZmVjdEJ1ZmZlciA6IG1TaW5rQnVmZmVyOwogICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IG1FZmZlY3RCdWZmZXJWYWxpZCA/IG1FZmZlY3RCdWZmZXJGb3JtYXQgOiBtRm9ybWF0OwpAQCAtMjU3MywxNCArMjg4OCwxNCBAQAogCiAgICAgICAgICAgICBtQnl0ZXNSZW1haW5pbmcgPSBtQ3VycmVudFdyaXRlTGVuZ3RoOwogICAgICAgICAgICAgaWYgKGlzU3VzcGVuZGVkKCkpIHsKLSAgICAgICAgICAgICAgICBzbGVlcFRpbWUgPSBzdXNwZW5kU2xlZXBUaW1lVXMoKTsKKyAgICAgICAgICAgICAgICBtU2xlZXBUaW1lVXMgPSBzdXNwZW5kU2xlZXBUaW1lVXMoKTsKICAgICAgICAgICAgICAgICAvLyBzaW11bGF0ZSB3cml0ZSB0byBIQUwgd2hlbiBzdXNwZW5kZWQKICAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuICs9IG1TaW5rQnVmZmVyU2l6ZTsKICAgICAgICAgICAgICAgICBtQnl0ZXNSZW1haW5pbmcgPSAwOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBvbmx5IHByb2Nlc3MgZWZmZWN0cyBpZiB3ZSdyZSBnb2luZyB0byB3cml0ZQotICAgICAgICAgICAgaWYgKHNsZWVwVGltZSA9PSAwICYmIG1UeXBlICE9IE9GRkxPQUQpIHsKKyAgICAgICAgICAgIGlmIChtU2xlZXBUaW1lVXMgPT0gMCAmJiBtVHlwZSAhPSBPRkZMT0FEKSB7CiAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RDaGFpbnMuc2l6ZSgpOyBpICsrKSB7CiAgICAgICAgICAgICAgICAgICAgIGVmZmVjdENoYWluc1tpXS0+cHJvY2Vzc19sKCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjU5OSw3ICsyOTE0LDcgQEAKICAgICAgICAgLy8gT25seSBpZiB0aGUgRWZmZWN0cyBidWZmZXIgaXMgZW5hYmxlZCBhbmQgdGhlcmUgaXMgZGF0YSBpbiB0aGUKICAgICAgICAgLy8gRWZmZWN0cyBidWZmZXIgKGJ1ZmZlciB2YWxpZCksIHdlIG5lZWQgdG8KICAgICAgICAgLy8gY29weSBpbnRvIHRoZSBzaW5rIGJ1ZmZlci4KLSAgICAgICAgLy8gVE9ETyB1c2Ugc2xlZXBUaW1lID09IDAgYXMgYW4gYWRkaXRpb25hbCBjb25kaXRpb24uCisgICAgICAgIC8vIFRPRE8gdXNlIG1TbGVlcFRpbWVVcyA9PSAwIGFzIGFuIGFkZGl0aW9uYWwgY29uZGl0aW9uLgogICAgICAgICBpZiAobUVmZmVjdEJ1ZmZlclZhbGlkKSB7CiAgICAgICAgICAgICAvL0FMT0dWKCJ3cml0aW5nIGVmZmVjdCBidWZmZXIgdG8gc2luayBidWZmZXIgZm9ybWF0ICUjeCIsIG1Gb3JtYXQpOwogICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChtU2lua0J1ZmZlciwgbUZvcm1hdCwgbUVmZmVjdEJ1ZmZlciwgbUVmZmVjdEJ1ZmZlckZvcm1hdCwKQEAgLTI2MTAsMTAgKzI5MjUsMTEgQEAKICAgICAgICAgdW5sb2NrRWZmZWN0Q2hhaW5zKGVmZmVjdENoYWlucyk7CiAKICAgICAgICAgaWYgKCF3YWl0aW5nQXN5bmNDYWxsYmFjaygpKSB7Ci0gICAgICAgICAgICAvLyBzbGVlcFRpbWUgPT0gMCBtZWFucyB3ZSBtdXN0IHdyaXRlIHRvIGF1ZGlvIGhhcmR3YXJlCi0gICAgICAgICAgICBpZiAoc2xlZXBUaW1lID09IDApIHsKKyAgICAgICAgICAgIC8vIG1TbGVlcFRpbWVVcyA9PSAwIG1lYW5zIHdlIG11c3Qgd3JpdGUgdG8gYXVkaW8gaGFyZHdhcmUKKyAgICAgICAgICAgIGlmIChtU2xlZXBUaW1lVXMgPT0gMCkgeworICAgICAgICAgICAgICAgIHNzaXplX3QgcmV0ID0gMDsKICAgICAgICAgICAgICAgICBpZiAobUJ5dGVzUmVtYWluaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNzaXplX3QgcmV0ID0gdGhyZWFkTG9vcF93cml0ZSgpOworICAgICAgICAgICAgICAgICAgICByZXQgPSB0aHJlYWRMb29wX3dyaXRlKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNSZW1haW5pbmcgPSAwOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMjYyNCwxMSArMjk0MCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9EUkFJTl9BTEwpKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocmVhZExvb3BfZHJhaW4oKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1UeXBlID09IE1JWEVSKSB7CisgICAgICAgICAgICAgICAgaWYgKG1UeXBlID09IE1JWEVSICYmICFtU3RhbmRieSkgewogICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBibG9ja2VkIGRldGVjdGlvbgogICAgICAgICAgICAgICAgICAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBkZWx0YSA9IG5vdyAtIG1MYXN0V3JpdGVUaW1lOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1TdGFuZGJ5ICYmIGRlbHRhID4gbWF4UGVyaW9kKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSA+IG1heFBlcmlvZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbU51bURlbGF5ZWRXcml0ZXMrKzsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobm93IC0gbGFzdFdhcm5pbmcpID4ga1dhcm5pbmdUaHJvdHRsZU5zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRSQUNFX05BTUUoInVuZGVycnVuIik7CkBAIC0yNjM3LDEwICsyOTUzLDQ4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFdhcm5pbmcgPSBub3c7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAobVRocmVhZFRocm90dGxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19SRUFEWSAvLyB3ZSBhcmUgbWl4aW5nIChhY3RpdmUgdHJhY2tzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHJldCA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugd3JvdGUgc29tZXRoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBMaW1pdCBNaXhlclRocmVhZCBkYXRhIHByb2Nlc3NpbmcgdG8gbm8gbW9yZSB0aGFuIHR3aWNlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQgcHJvY2Vzc2luZyByYXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaGVscHMgcHJldmVudCB1bmRlcnJ1bnMgd2l0aCBOdVBsYXllciBhbmQgb3RoZXIgYXBwbGljYXRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBtYXkgc2V0IHVwIGJ1ZmZlcnMgdGhhdCBhcmUgY2xvc2UgdG8gdGhlIG1pbmltdW0gc2l6ZSwgb3IgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWVwIGJ1ZmZlcnMsIGFuZCByZWx5IG9uIGEgZG91YmxlLWJ1ZmZlcmluZyBzbGVlcCBzdHJhdGVneSB0byBmaWxsLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB0aHJvdHRsZSBzbW9vdGhzIG91dCBzdWRkZW4gbGFyZ2UgZGF0YSBkcmFpbnMgZnJvbSB0aGUgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZS5nLiB3aGVuIGl0IGNvbWVzIG91dCBvZiBzdGFuZGJ5LCB3aGljaCBvZnRlbiBjYXVzZXMgcHJvYmxlbXMgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gKDEpIG1peGVyIHRocmVhZHMgd2l0aG91dCBhIGZhc3QgbWl4ZXIgKHdoaWNoIGhhcyBpdHMgb3duIHdhcm0tdXApCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAoMikgbWluaW11bSBidWZmZXIgc2l6ZWQgdHJhY2tzIChldmVuIGlmIHRoZSB0cmFjayBpcyBmdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoZSBhcHAgd29uJ3QgZmlsbCBmYXN0IGVub3VnaCB0byBoYW5kbGUgdGhlIHN1ZGRlbiBkcmF3KS4KKworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBkZWx0YU1zID0gZGVsdGEgLyAxMDAwMDAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCB0aHJvdHRsZU1zID0gbUhhbGZCdWZmZXJNcyAtIGRlbHRhTXM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNpZ25lZCltSGFsZkJ1ZmZlck1zID49IHRocm90dGxlTXMgJiYgdGhyb3R0bGVNcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2xlZXAodGhyb3R0bGVNcyAqIDEwMDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBvZiB0aHJvdHRsZSBzdGFydCBvbiB2ZXJib3NlIGxvZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWX0lGKG1UaHJlYWRUaHJvdHRsZUVuZE1zID09IG1UaHJlYWRUaHJvdHRsZVRpbWVNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaXhlciglcCkgdGhyb3R0bGUgYmVnaW46IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZXQoJXpkKSBkZWx0YU1zKCVkKSByZXF1aXJlcyBzbGVlcCAlZCBtcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCByZXQsIGRlbHRhTXMsIHRocm90dGxlTXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWRUaHJvdHRsZVRpbWVNcyArPSB0aHJvdHRsZU1zOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkaWZmID0gbVRocmVhZFRocm90dGxlVGltZU1zIC0gbVRocmVhZFRocm90dGxlRW5kTXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBvZiB0aHJvdHRsZSBlbmQgb24gZGVidWcgbG9nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJtaXhlciglcCkgdGhyb3R0bGUgZW5kOiB0aHJvdHRsZSB0aW1lKCV1KSIsIHRoaXMsIGRpZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkVGhyb3R0bGVFbmRNcyA9IG1UaHJlYWRUaHJvdHRsZVRpbWVNczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdXNsZWVwKHNsZWVwVGltZSk7CisgICAgICAgICAgICAgICAgQVRSQUNFX0JFR0lOKCJzbGVlcCIpOworICAgICAgICAgICAgICAgIHVzbGVlcChtU2xlZXBUaW1lVXMpOworICAgICAgICAgICAgICAgIEFUUkFDRV9FTkQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yNzExLDggKzMwNjUsNyBAQAogICAgIGlmICgobVR5cGUgPT0gT0ZGTE9BRCB8fCBtVHlwZSA9PSBESVJFQ1QpCiAgICAgICAgICAgICAmJiBtT3V0cHV0ICE9IE5VTEwgJiYgbU91dHB1dC0+c3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uKSB7CiAgICAgICAgIHVpbnQ2NF90IHBvc2l0aW9uNjQ7Ci0gICAgICAgIGludCByZXQgPSBtT3V0cHV0LT5zdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0LT5zdHJlYW0sICZwb3NpdGlvbjY0LCAmdGltZXN0YW1wLm1UaW1lKTsKKyAgICAgICAgaW50IHJldCA9IG1PdXRwdXQtPmdldFByZXNlbnRhdGlvblBvc2l0aW9uKCZwb3NpdGlvbjY0LCAmdGltZXN0YW1wLm1UaW1lKTsKICAgICAgICAgaWYgKHJldCA9PSAwKSB7CiAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gKHVpbnQzMl90KXBvc2l0aW9uNjQ7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC0yNzIxLDIxICszMDc0LDgzIEBACiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjpjcmVhdGVBdWRpb1BhdGNoX2woY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQoreworICAgIC8vIGlmICEmSURMRSwgaG9sZHMgdGhlIEZhc3RNaXhlciBzdGF0ZSB0byByZXN0b3JlIGFmdGVyIG5ldyBwYXJhbWV0ZXJzIHByb2Nlc3NlZAorICAgIEZhc3RNaXhlclN0YXRlOjpDb21tYW5kIHByZXZpb3VzQ29tbWFuZCA9IEZhc3RNaXhlclN0YXRlOjpIT1RfSURMRTsKKyAgICBpZiAobUZhc3RNaXhlciAhPSAwKSB7CisgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUgKnNxID0gbUZhc3RNaXhlci0+c3EoKTsKKyAgICAgICAgRmFzdE1peGVyU3RhdGUgKnN0YXRlID0gc3EtPmJlZ2luKCk7CisgICAgICAgIGlmICghKHN0YXRlLT5tQ29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpJRExFKSkgeworICAgICAgICAgICAgcHJldmlvdXNDb21tYW5kID0gc3RhdGUtPm1Db21tYW5kOworICAgICAgICAgICAgc3RhdGUtPm1Db21tYW5kID0gRmFzdE1peGVyU3RhdGU6OkhPVF9JRExFOworICAgICAgICAgICAgc3EtPmVuZCgpOworICAgICAgICAgICAgc3EtPnB1c2goRmFzdE1peGVyU3RhdGVRdWV1ZTo6QkxPQ0tfVU5USUxfQUNLRUQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3EtPmVuZChmYWxzZSAvKmRpZE1vZGlmeSovKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBQbGF5YmFja1RocmVhZDo6Y3JlYXRlQXVkaW9QYXRjaF9sKHBhdGNoLCBoYW5kbGUpOworCisgICAgaWYgKCEocHJldmlvdXNDb21tYW5kICYgRmFzdE1peGVyU3RhdGU6OklETEUpKSB7CisgICAgICAgIEFMT0dfQVNTRVJUKG1GYXN0TWl4ZXIgIT0gMCk7CisgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUgKnNxID0gbUZhc3RNaXhlci0+c3EoKTsKKyAgICAgICAgRmFzdE1peGVyU3RhdGUgKnN0YXRlID0gc3EtPmJlZ2luKCk7CisgICAgICAgIEFMT0dfQVNTRVJUKHN0YXRlLT5tQ29tbWFuZCA9PSBGYXN0TWl4ZXJTdGF0ZTo6SE9UX0lETEUpOworICAgICAgICBzdGF0ZS0+bUNvbW1hbmQgPSBwcmV2aW91c0NvbW1hbmQ7CisgICAgICAgIHNxLT5lbmQoKTsKKyAgICAgICAgc3EtPnB1c2goRmFzdE1peGVyU3RhdGVRdWV1ZTo6QkxPQ0tfVU5USUxfUFVTSEVEKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpjcmVhdGVBdWRpb1BhdGNoX2woY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQogewogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIGlmIChtT3V0cHV0LT5hdWRpb0h3RGV2LT52ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgewotICAgICAgICAvLyBzdG9yZSBuZXcgZGV2aWNlIGFuZCBzZW5kIHRvIGVmZmVjdHMKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKLSAgICAgICAgICAgIHR5cGUgfD0gcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZTsKLSAgICAgICAgfQotICAgICAgICBtT3V0RGV2aWNlID0gdHlwZTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VfbChtT3V0RGV2aWNlKTsKKworICAgIC8vIHN0b3JlIG5ldyBkZXZpY2UgYW5kIHNlbmQgdG8gZWZmZWN0cworICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgdHlwZSB8PSBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS50eXBlOworICAgIH0KKworI2lmZGVmIEFERF9CQVRURVJZX0RBVEEKKyAgICAvLyB3aGVuIGNoYW5naW5nIHRoZSBhdWRpbyBvdXRwdXQgZGV2aWNlLCBjYWxsIGFkZEJhdHRlcnlEYXRhIHRvIG5vdGlmeQorICAgIC8vIHRoZSBjaGFuZ2UKKyAgICBpZiAobU91dERldmljZSAhPSB0eXBlKSB7CisgICAgICAgIHVpbnQzMl90IHBhcmFtcyA9IDA7CisgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgc3BlYWtlciBpcyBvbgorICAgICAgICBpZiAodHlwZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikgeworICAgICAgICAgICAgcGFyYW1zIHw9IElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YVNwZWFrZXJPbjsKICAgICAgICAgfQogCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VXaXRob3V0U3BlYWtlcgorICAgICAgICAgICAgPSBBVURJT19ERVZJQ0VfT1VUX0FMTCAmIH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgIC8vIGNoZWNrIGlmIGFueSBvdGhlciBkZXZpY2UgKGV4Y2VwdCBzcGVha2VyKSBpcyBvbgorICAgICAgICBpZiAodHlwZSAmIGRldmljZVdpdGhvdXRTcGVha2VyKSB7CisgICAgICAgICAgICBwYXJhbXMgfD0gSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhT3RoZXJBdWRpb0RldmljZU9uOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBhcmFtcyAhPSAwKSB7CisgICAgICAgICAgICBhZGRCYXR0ZXJ5RGF0YShwYXJhbXMpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0RGV2aWNlX2wodHlwZSk7CisgICAgfQorCisgICAgLy8gbVByZXZPdXREZXZpY2UgaXMgdGhlIGxhdGVzdCBkZXZpY2Ugc2V0IGJ5IGNyZWF0ZUF1ZGlvUGF0Y2hfbCgpLiBJdCBpcyBub3Qgc2V0IHdoZW4KKyAgICAvLyB0aGUgdGhyZWFkIGlzIGNyZWF0ZWQgc28gdGhhdCB0aGUgZmlyc3QgcGF0Y2ggY3JlYXRpb24gdHJpZ2dlcnMgYW4gaW9Db25maWdDaGFuZ2VkIGNhbGxiYWNrCisgICAgYm9vbCBjb25maWdDaGFuZ2VkID0gbVByZXZPdXREZXZpY2UgIT0gdHlwZTsKKyAgICBtT3V0RGV2aWNlID0gdHlwZTsKKyAgICBtUGF0Y2ggPSAqcGF0Y2g7CisKKyAgICBpZiAobU91dHB1dC0+YXVkaW9Id0Rldi0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKICAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlID0gbU91dHB1dC0+YXVkaW9Id0Rldi0+aHdEZXZpY2UoKTsKICAgICAgICAgc3RhdHVzID0gaHdEZXZpY2UtPmNyZWF0ZV9hdWRpb19wYXRjaChod0RldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm51bV9zb3VyY2VzLApAQCAtMjc0NCwxOSArMzE1OSw3NSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR19BU1NFUlQoZmFsc2UsICJjcmVhdGVBdWRpb1BhdGNoX2woKSBjYWxsZWQgb24gYSBwcmUgMy4wIEhBTCIpOworICAgICAgICBjaGFyICphZGRyZXNzOworICAgICAgICBpZiAoc3RyY21wKHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmFkZHJlc3MsICIiKSAhPSAwKSB7CisgICAgICAgICAgICAvL0ZJWE1FOiB3ZSBvbmx5IHN1cHBvcnQgYWRkcmVzcyBvbiBmaXJzdCBzaW5rIHdpdGggSEFMIHZlcnNpb24gPCAzLjAKKyAgICAgICAgICAgIGFkZHJlc3MgPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmFkZHJlc3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRkcmVzcyA9IChjaGFyICopY2FsbG9jKDEsIDEpOworICAgICAgICB9CisgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoU3RyaW5nOChhZGRyZXNzKSk7CisgICAgICAgIGZyZWUoYWRkcmVzcyk7CisgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fUk9VVElORyksIChpbnQpdHlwZSk7CisgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbiwKKyAgICAgICAgICAgICAgICBwYXJhbS50b1N0cmluZygpLnN0cmluZygpKTsKKyAgICAgICAgKmhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgIH0KKyAgICBpZiAoY29uZmlnQ2hhbmdlZCkgeworICAgICAgICBtUHJldk91dERldmljZSA9IHR5cGU7CisgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6cmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgLy8gaWYgISZJRExFLCBob2xkcyB0aGUgRmFzdE1peGVyIHN0YXRlIHRvIHJlc3RvcmUgYWZ0ZXIgbmV3IHBhcmFtZXRlcnMgcHJvY2Vzc2VkCisgICAgRmFzdE1peGVyU3RhdGU6OkNvbW1hbmQgcHJldmlvdXNDb21tYW5kID0gRmFzdE1peGVyU3RhdGU6OkhPVF9JRExFOworICAgIGlmIChtRmFzdE1peGVyICE9IDApIHsKKyAgICAgICAgRmFzdE1peGVyU3RhdGVRdWV1ZSAqc3EgPSBtRmFzdE1peGVyLT5zcSgpOworICAgICAgICBGYXN0TWl4ZXJTdGF0ZSAqc3RhdGUgPSBzcS0+YmVnaW4oKTsKKyAgICAgICAgaWYgKCEoc3RhdGUtPm1Db21tYW5kICYgRmFzdE1peGVyU3RhdGU6OklETEUpKSB7CisgICAgICAgICAgICBwcmV2aW91c0NvbW1hbmQgPSBzdGF0ZS0+bUNvbW1hbmQ7CisgICAgICAgICAgICBzdGF0ZS0+bUNvbW1hbmQgPSBGYXN0TWl4ZXJTdGF0ZTo6SE9UX0lETEU7CisgICAgICAgICAgICBzcS0+ZW5kKCk7CisgICAgICAgICAgICBzcS0+cHVzaChGYXN0TWl4ZXJTdGF0ZVF1ZXVlOjpCTE9DS19VTlRJTF9BQ0tFRCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcS0+ZW5kKGZhbHNlIC8qZGlkTW9kaWZ5Ki8pOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gUGxheWJhY2tUaHJlYWQ6OnJlbGVhc2VBdWRpb1BhdGNoX2woaGFuZGxlKTsKKworICAgIGlmICghKHByZXZpb3VzQ29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpJRExFKSkgeworICAgICAgICBBTE9HX0FTU0VSVChtRmFzdE1peGVyICE9IDApOworICAgICAgICBGYXN0TWl4ZXJTdGF0ZVF1ZXVlICpzcSA9IG1GYXN0TWl4ZXItPnNxKCk7CisgICAgICAgIEZhc3RNaXhlclN0YXRlICpzdGF0ZSA9IHNxLT5iZWdpbigpOworICAgICAgICBBTE9HX0FTU0VSVChzdGF0ZS0+bUNvbW1hbmQgPT0gRmFzdE1peGVyU3RhdGU6OkhPVF9JRExFKTsKKyAgICAgICAgc3RhdGUtPm1Db21tYW5kID0gcHJldmlvdXNDb21tYW5kOworICAgICAgICBzcS0+ZW5kKCk7CisgICAgICAgIHNxLT5wdXNoKEZhc3RNaXhlclN0YXRlUXVldWU6OkJMT0NLX1VOVElMX1BVU0hFRCk7CisgICAgfQorCiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6cmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICBtT3V0RGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisKICAgICBpZiAobU91dHB1dC0+YXVkaW9Id0Rldi0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKICAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlID0gbU91dHB1dC0+YXVkaW9Id0Rldi0+aHdEZXZpY2UoKTsKICAgICAgICAgc3RhdHVzID0gaHdEZXZpY2UtPnJlbGVhc2VfYXVkaW9fcGF0Y2goaHdEZXZpY2UsIGhhbmRsZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR19BU1NFUlQoZmFsc2UsICJyZWxlYXNlQXVkaW9QYXRjaF9sKCkgY2FsbGVkIG9uIGEgcHJlIDMuMCBIQUwiKTsKKyAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07CisgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fUk9VVElORyksIDApOworICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCisgICAgICAgICAgICAgICAgcGFyYW0udG9TdHJpbmcoKS5zdHJpbmcoKSk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC0yNzg0LDggKzMyNTUsOCBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjpNaXhlclRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCB0eXBlX3QgdHlwZSkKLSAgICA6ICAgUGxheWJhY2tUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCBkZXZpY2UsIHR5cGUpLAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgYm9vbCBzeXN0ZW1SZWFkeSwgdHlwZV90IHR5cGUpCisgICAgOiAgIFBsYXliYWNrVGhyZWFkKGF1ZGlvRmxpbmdlciwgb3V0cHV0LCBpZCwgZGV2aWNlLCB0eXBlLCBzeXN0ZW1SZWFkeSksCiAgICAgICAgIC8vIG1BdWRpb01peGVyIGJlbG93CiAgICAgICAgIC8vIG1GYXN0TWl4ZXIgYmVsb3cKICAgICAgICAgbUZhc3RNaXhlckZ1dGV4KDApCkBAIC0yODAwLDYgKzMyNzEsMTIgQEAKICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50KTsKICAgICBtQXVkaW9NaXhlciA9IG5ldyBBdWRpb01peGVyKG1Ob3JtYWxGcmFtZUNvdW50LCBtU2FtcGxlUmF0ZSk7CiAKKyAgICBpZiAodHlwZSA9PSBEVVBMSUNBVElORykgeworICAgICAgICAvLyBUaGUgRHVwbGljYXRpbmcgdGhyZWFkIHVzZXMgdGhlIEF1ZGlvTWl4ZXIgYW5kIGRlbGl2ZXJzIGRhdGEgdG8gT3V0cHV0VHJhY2tzCisgICAgICAgIC8vIChkb3duc3RyZWFtIE1peGVyVGhyZWFkcykgaW4gRHVwbGljYXRpbmdUaHJlYWQ6OnRocmVhZExvb3Bfd3JpdGUoKS4KKyAgICAgICAgLy8gRG8gbm90IGNyZWF0ZSBvciB1c2UgbUZhc3RNaXhlciwgbU91dHB1dFNpbmssIG1QaXBlU2luaywgb3IgbU5vcm1hbFNpbmsuCisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgLy8gY3JlYXRlIGFuIE5CQUlPIHNpbmsgZm9yIHRoZSBIQUwgb3V0cHV0IHN0cmVhbSwgYW5kIG5lZ290aWF0ZQogICAgIG1PdXRwdXRTaW5rID0gbmV3IEF1ZGlvU3RyZWFtT3V0U2luayhvdXRwdXQtPnN0cmVhbSk7CiAgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOwpAQCAtMjg0MSw2ICszMzE4LDcgQEAKICAgICAgICAgTkJBSU9fRm9ybWF0IGZvcm1hdCA9IG1PdXRwdXRTaW5rLT5mb3JtYXQoKTsKICAgICAgICAgTkJBSU9fRm9ybWF0IG9yaWdmb3JtYXQgPSBmb3JtYXQ7CiAgICAgICAgIC8vIGFkanVzdCBmb3JtYXQgdG8gbWF0Y2ggdGhhdCBvZiB0aGUgRmFzdCBNaXhlcgorICAgICAgICBBTE9HVigiZm9ybWF0IGNoYW5nZWQgZnJvbSAlZCB0byAlZCIsIGZvcm1hdC5tRm9ybWF0LCBmYXN0TWl4ZXJGb3JtYXQpOwogICAgICAgICBmb3JtYXQubUZvcm1hdCA9IGZhc3RNaXhlckZvcm1hdDsKICAgICAgICAgZm9ybWF0Lm1GcmFtZVNpemUgPSBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdC5tRm9ybWF0KSAqIGZvcm1hdC5tQ2hhbm5lbENvdW50OwogCkBAIC0yOTExLDExICszMzg5LDcgQEAKICAgICAgICAgLy8gc3RhcnQgdGhlIGZhc3QgbWl4ZXIKICAgICAgICAgbUZhc3RNaXhlci0+cnVuKCJGYXN0TWl4ZXIiLCBQUklPUklUWV9VUkdFTlRfQVVESU8pOwogICAgICAgICBwaWRfdCB0aWQgPSBtRmFzdE1peGVyLT5nZXRUaWQoKTsKLSAgICAgICAgaW50IGVyciA9IHJlcXVlc3RQcmlvcml0eShnZXRwaWRfY2FjaGVkLCB0aWQsIGtQcmlvcml0eUZhc3RNaXhlcik7Ci0gICAgICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICAgICAgQUxPR1coIlBvbGljeSBTQ0hFRF9GSUZPIHByaW9yaXR5ICVkIGlzIHVuYXZhaWxhYmxlIGZvciBwaWQgJWQgdGlkICVkOyBlcnJvciAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGtQcmlvcml0eUZhc3RNaXhlciwgZ2V0cGlkX2NhY2hlZCwgdGlkLCBlcnIpOwotICAgICAgICB9CisgICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnQoZ2V0cGlkX2NhY2hlZCwgdGlkLCBrUHJpb3JpdHlGYXN0TWl4ZXIpOwogCiAjaWZkZWYgQVVESU9fV0FUQ0hET0cKICAgICAgICAgLy8gY3JlYXRlIGFuZCBzdGFydCB0aGUgd2F0Y2hkb2cKQEAgLTI5MjMsMTEgKzMzOTcsNyBAQAogICAgICAgICBtQXVkaW9XYXRjaGRvZy0+c2V0RHVtcCgmbUF1ZGlvV2F0Y2hkb2dEdW1wKTsKICAgICAgICAgbUF1ZGlvV2F0Y2hkb2ctPnJ1bigiQXVkaW9XYXRjaGRvZyIsIFBSSU9SSVRZX1VSR0VOVF9BVURJTyk7CiAgICAgICAgIHRpZCA9IG1BdWRpb1dhdGNoZG9nLT5nZXRUaWQoKTsKLSAgICAgICAgZXJyID0gcmVxdWVzdFByaW9yaXR5KGdldHBpZF9jYWNoZWQsIHRpZCwga1ByaW9yaXR5RmFzdE1peGVyKTsKLSAgICAgICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiUG9saWN5IFNDSEVEX0ZJRk8gcHJpb3JpdHkgJWQgaXMgdW5hdmFpbGFibGUgZm9yIHBpZCAlZCB0aWQgJWQ7IGVycm9yICVkIiwKLSAgICAgICAgICAgICAgICAgICAga1ByaW9yaXR5RmFzdE1peGVyLCBnZXRwaWRfY2FjaGVkLCB0aWQsIGVycik7Ci0gICAgICAgIH0KKyAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChnZXRwaWRfY2FjaGVkLCB0aWQsIGtQcmlvcml0eUZhc3RNaXhlcik7CiAjZW5kaWYKIAogICAgIH0KQEAgLTMwMjAsOCArMzQ5MCwxMCBAQAogI2VuZGlmCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzdGF0ZS0+bUNvbW1hbmQgPSBGYXN0TWl4ZXJTdGF0ZTo6TUlYX1dSSVRFOworI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKICAgICAgICAgICAgIG1GYXN0TWl4ZXJEdW1wU3RhdGUuaW5jcmVhc2VTYW1wbGluZ04obUF1ZGlvRmxpbmdlci0+aXNMb3dSYW1EZXZpY2UoKSA/Ci0gICAgICAgICAgICAgICAgICAgIEZhc3RNaXhlckR1bXBTdGF0ZTo6a1NhbXBsaW5nTmZvckxvd1JhbURldmljZSA6IEZhc3RNaXhlckR1bXBTdGF0ZTo6a1NhbXBsaW5nTik7CisgICAgICAgICAgICAgICAgRmFzdFRocmVhZER1bXBTdGF0ZTo6a1NhbXBsaW5nTmZvckxvd1JhbURldmljZSA6IEZhc3RUaHJlYWREdW1wU3RhdGU6OmtTYW1wbGluZ04pOworI2VuZGlmCiAgICAgICAgICAgICBzcS0+ZW5kKCk7CiAgICAgICAgICAgICBzcS0+cHVzaChGYXN0TWl4ZXJTdGF0ZVF1ZXVlOjpCTE9DS19VTlRJTF9QVVNIRUQpOwogICAgICAgICAgICAgaWYgKGtVc2VGYXN0TWl4ZXIgPT0gRmFzdE1peGVyX0R5bmFtaWMpIHsKQEAgLTMwODMsNyArMzU1NSw3IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnRocmVhZExvb3Bfc3RhbmRieSgpCiB7CiAgICAgQUxPR1YoIkF1ZGlvIGhhcmR3YXJlIGVudGVyaW5nIHN0YW5kYnksIG1peGVyICVwLCBzdXNwZW5kIGNvdW50ICVkIiwgdGhpcywgbVN1c3BlbmRlZCk7Ci0gICAgbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOworICAgIG1PdXRwdXQtPnN0YW5kYnkoKTsKICAgICBpZiAobVVzZUFzeW5jV3JpdGUgIT0gMCkgewogICAgICAgICAvLyBkaXNjYXJkIGFueSBwZW5kaW5nIGRyYWluIG9yIHdyaXRlIGFjayBieSBpbmNyZW1lbnRpbmcgc2VxdWVuY2UKICAgICAgICAgbVdyaXRlQWNrU2VxdWVuY2UgPSAobVdyaXRlQWNrU2VxdWVuY2UgKyAyKSAmIH4xOwpAQCAtMzEyNCwxMSArMzU5NiwxMSBAQAogICAgIC8vIE9ubHkgaW5jcmVhc2Ugc2xlZXAgdGltZSBpZiB0aGUgbWl4ZXIgaXMgcmVhZHkgZm9yIHR3byBjb25zZWN1dGl2ZSB0aW1lcyB0byBhdm9pZAogICAgIC8vIHRoYXQgYSBzdGVhZHkgc3RhdGUgb2YgYWx0ZXJuYXRpbmcgcmVhZHkvbm90IHJlYWR5IGNvbmRpdGlvbnMga2VlcHMgdGhlIHNsZWVwIHRpbWUKICAgICAvLyBzdWNoIHRoYXQgd2Ugd291bGQgdW5kZXJydW4gdGhlIGF1ZGlvIEhBTC4KLSAgICBpZiAoKHNsZWVwVGltZSA9PSAwKSAmJiAoc2xlZXBUaW1lU2hpZnQgPiAwKSkgeworICAgIGlmICgobVNsZWVwVGltZVVzID09IDApICYmIChzbGVlcFRpbWVTaGlmdCA+IDApKSB7CiAgICAgICAgIHNsZWVwVGltZVNoaWZ0LS07CiAgICAgfQotICAgIHNsZWVwVGltZSA9IDA7Ci0gICAgc3RhbmRieVRpbWUgPSBzeXN0ZW1UaW1lKCkgKyBzdGFuZGJ5RGVsYXk7CisgICAgbVNsZWVwVGltZVVzID0gMDsKKyAgICBtU3RhbmRieVRpbWVOcyA9IHN5c3RlbVRpbWUoKSArIG1TdGFuZGJ5RGVsYXlOczsKICAgICAvL1RPRE86IGRlbGF5IHN0YW5kYnkgd2hlbiBlZmZlY3RzIGhhdmUgYSB0YWlsCiAKIH0KQEAgLTMxMzcsMTEgKzM2MDksMTEgQEAKIHsKICAgICAvLyBJZiBubyB0cmFja3MgYXJlIHJlYWR5LCBzbGVlcCBvbmNlIGZvciB0aGUgZHVyYXRpb24gb2YgYW4gb3V0cHV0CiAgICAgLy8gYnVmZmVyIHNpemUsIHRoZW4gd3JpdGUgMHMgdG8gdGhlIG91dHB1dAotICAgIGlmIChzbGVlcFRpbWUgPT0gMCkgeworICAgIGlmIChtU2xlZXBUaW1lVXMgPT0gMCkgewogICAgICAgICBpZiAobU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19FTkFCTEVEKSB7Ci0gICAgICAgICAgICBzbGVlcFRpbWUgPSBhY3RpdmVTbGVlcFRpbWUgPj4gc2xlZXBUaW1lU2hpZnQ7Ci0gICAgICAgICAgICBpZiAoc2xlZXBUaW1lIDwga01pblRocmVhZFNsZWVwVGltZVVzKSB7Ci0gICAgICAgICAgICAgICAgc2xlZXBUaW1lID0ga01pblRocmVhZFNsZWVwVGltZVVzOworICAgICAgICAgICAgbVNsZWVwVGltZVVzID0gbUFjdGl2ZVNsZWVwVGltZVVzID4+IHNsZWVwVGltZVNoaWZ0OworICAgICAgICAgICAgaWYgKG1TbGVlcFRpbWVVcyA8IGtNaW5UaHJlYWRTbGVlcFRpbWVVcykgeworICAgICAgICAgICAgICAgIG1TbGVlcFRpbWVVcyA9IGtNaW5UaHJlYWRTbGVlcFRpbWVVczsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIHJlZHVjZSBzbGVlcCB0aW1lIGluIGNhc2Ugb2YgY29uc2VjdXRpdmUgYXBwbGljYXRpb24gdW5kZXJydW5zIHRvIGF2b2lkCiAgICAgICAgICAgICAvLyBzdGFydmluZyB0aGUgYXVkaW8gSEFMLiBBcyBhY3RpdmVTbGVlcFRpbWVVcygpIGlzIGxhcmdlciB0aGFuIGEgYnVmZmVyCkBAIC0zMTUxLDcgKzM2MjMsNyBAQAogICAgICAgICAgICAgICAgIHNsZWVwVGltZVNoaWZ0Kys7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzbGVlcFRpbWUgPSBpZGxlU2xlZXBUaW1lOworICAgICAgICAgICAgbVNsZWVwVGltZVVzID0gbUlkbGVTbGVlcFRpbWVVczsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobUJ5dGVzV3JpdHRlbiAhPSAwIHx8IChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQpKSB7CiAgICAgICAgIC8vIGNsZWFyIG91dCBtTWl4ZXJCdWZmZXIgb3IgbVNpbmtCdWZmZXIsIHRvIGVuc3VyZSBidWZmZXJzIGFyZSBjbGVhcmVkCkBAIC0zMTYxLDcgKzM2MzMsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbWVtc2V0KG1TaW5rQnVmZmVyLCAwLCBtU2lua0J1ZmZlclNpemUpOwogICAgICAgICB9Ci0gICAgICAgIHNsZWVwVGltZSA9IDA7CisgICAgICAgIG1TbGVlcFRpbWVVcyA9IDA7CiAgICAgICAgIEFMT0dWX0lGKG1CeXRlc1dyaXR0ZW4gPT0gMCAmJiAobU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19FTkFCTEVEKSwKICAgICAgICAgICAgICAgICAiYW50aWNpcGF0ZWQgc3RhcnQiKTsKICAgICB9CkBAIC0zMzgyLDIyICszODU0LDE2IEBACiAgICAgICAgIC8vIGhlbmNlIHRoZSB0ZXN0IG9uIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX1JFQURZKSBtZWFuaW5nIHRoZSB0cmFjayB3YXMgbWl4ZWQKICAgICAgICAgLy8gZHVyaW5nIGxhc3Qgcm91bmQKICAgICAgICAgc2l6ZV90IGRlc2lyZWRGcmFtZXM7Ci0gICAgICAgIHVpbnQzMl90IHNyID0gdHJhY2stPnNhbXBsZVJhdGUoKTsKLSAgICAgICAgaWYgKHNyID09IG1TYW1wbGVSYXRlKSB7Ci0gICAgICAgICAgICBkZXNpcmVkRnJhbWVzID0gbU5vcm1hbEZyYW1lQ291bnQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyArMSBmb3Igcm91bmRpbmcgYW5kICsxIGZvciBhZGRpdGlvbmFsIHNhbXBsZSBuZWVkZWQgZm9yIGludGVycG9sYXRpb24KLSAgICAgICAgICAgIGRlc2lyZWRGcmFtZXMgPSAobU5vcm1hbEZyYW1lQ291bnQgKiBzcikgLyBtU2FtcGxlUmF0ZSArIDEgKyAxOwotICAgICAgICAgICAgLy8gYWRkIGZyYW1lcyBhbHJlYWR5IGNvbnN1bWVkIGJ1dCBub3QgeWV0IHJlbGVhc2VkIGJ5IHRoZSByZXNhbXBsZXIKLSAgICAgICAgICAgIC8vIGJlY2F1c2UgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVhZHkoKSB3aWxsIGluY2x1ZGUgdGhlc2UgZnJhbWVzCi0gICAgICAgICAgICBkZXNpcmVkRnJhbWVzICs9IG1BdWRpb01peGVyLT5nZXRVbnJlbGVhc2VkRnJhbWVzKHRyYWNrLT5uYW1lKCkpOwotI2lmIDAKLSAgICAgICAgICAgIC8vIHRoZSBtaW5pbXVtIHRyYWNrIGJ1ZmZlciBzaXplIGlzIG5vcm1hbGx5IHR3aWNlIHRoZSBudW1iZXIgb2YgZnJhbWVzIG5lY2Vzc2FyeQotICAgICAgICAgICAgLy8gdG8gZmlsbCBvbmUgYnVmZmVyIGFuZCB0aGUgcmVzYW1wbGVyIHNob3VsZCBub3QgbGVhdmUgbW9yZSB0aGFuIG9uZSBidWZmZXIgd29ydGgKLSAgICAgICAgICAgIC8vIG9mIHVucmVsZWFzZWQgZnJhbWVzIGFmdGVyIGVhY2ggcGFzcywgYnV0IGp1c3QgaW4gY2FzZS4uLgotICAgICAgICAgICAgQUxPR19BU1NFUlQoZGVzaXJlZEZyYW1lcyA8PSBjYmxrLT5mcmFtZUNvdW50Xyk7Ci0jZW5kaWYKLSAgICAgICAgfQorICAgICAgICBjb25zdCB1aW50MzJfdCBzYW1wbGVSYXRlID0gdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFNhbXBsZVJhdGUoKTsKKyAgICAgICAgQXVkaW9QbGF5YmFja1JhdGUgcGxheWJhY2tSYXRlID0gdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFBsYXliYWNrUmF0ZSgpOworCisgICAgICAgIGRlc2lyZWRGcmFtZXMgPSBzb3VyY2VGcmFtZXNOZWVkZWRXaXRoVGltZXN0cmV0Y2goCisgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgbU5vcm1hbEZyYW1lQ291bnQsIG1TYW1wbGVSYXRlLCBwbGF5YmFja1JhdGUubVNwZWVkKTsKKyAgICAgICAgLy8gVE9ETzogT05MWSBVU0VEIEZPUiBMRUdBQ1kgUkVTQU1QTEVSUywgcmVtb3ZlIHdoZW4gdGhleSBhcmUgcmVtb3ZlZC4KKyAgICAgICAgLy8gYWRkIGZyYW1lcyBhbHJlYWR5IGNvbnN1bWVkIGJ1dCBub3QgeWV0IHJlbGVhc2VkIGJ5IHRoZSByZXNhbXBsZXIKKyAgICAgICAgLy8gYmVjYXVzZSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWFkeSgpIHdpbGwgaW5jbHVkZSB0aGVzZSBmcmFtZXMKKyAgICAgICAgZGVzaXJlZEZyYW1lcyArPSBtQXVkaW9NaXhlci0+Z2V0VW5yZWxlYXNlZEZyYW1lcyh0cmFjay0+bmFtZSgpKTsKKwogICAgICAgICB1aW50MzJfdCBtaW5GcmFtZXMgPSAxOwogICAgICAgICBpZiAoKHRyYWNrLT5zaGFyZWRCdWZmZXIoKSA9PSAwKSAmJiAhdHJhY2stPmlzU3RvcHBlZCgpICYmICF0cmFjay0+aXNQYXVzaW5nKCkgJiYKICAgICAgICAgICAgICAgICAobU1peGVyU3RhdHVzSWdub3JpbmdGYXN0VHJhY2tzID09IE1JWEVSX1RSQUNLU19SRUFEWSkpIHsKQEAgLTM0MDUsNiArMzg3MSwyMyBAQAogICAgICAgICB9CiAKICAgICAgICAgc2l6ZV90IGZyYW1lc1JlYWR5ID0gdHJhY2stPmZyYW1lc1JlYWR5KCk7CisgICAgICAgIGlmIChBVFJBQ0VfRU5BQkxFRCgpKSB7CisgICAgICAgICAgICAvLyBJIHdpc2ggd2UgaGFkIGZvcm1hdHRlZCB0cmFjZSBuYW1lcworICAgICAgICAgICAgY2hhciB0cmFjZU5hbWVbMTZdOworICAgICAgICAgICAgc3RyY3B5KHRyYWNlTmFtZSwgIm5SZHkiKTsKKyAgICAgICAgICAgIGludCBuYW1lID0gdHJhY2stPm5hbWUoKTsKKyAgICAgICAgICAgIGlmIChBdWRpb01peGVyOjpUUkFDSzAgPD0gbmFtZSAmJgorICAgICAgICAgICAgICAgICAgICBuYW1lIDwgKGludCkgKEF1ZGlvTWl4ZXI6OlRSQUNLMCArIEF1ZGlvTWl4ZXI6Ok1BWF9OVU1fVFJBQ0tTKSkgeworICAgICAgICAgICAgICAgIG5hbWUgLT0gQXVkaW9NaXhlcjo6VFJBQ0swOworICAgICAgICAgICAgICAgIHRyYWNlTmFtZVs0XSA9IChuYW1lIC8gMTApICsgJzAnOworICAgICAgICAgICAgICAgIHRyYWNlTmFtZVs1XSA9IChuYW1lICUgMTApICsgJzAnOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cmFjZU5hbWVbNF0gPSAnPyc7CisgICAgICAgICAgICAgICAgdHJhY2VOYW1lWzVdID0gJz8nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJhY2VOYW1lWzZdID0gJ1wwJzsKKyAgICAgICAgICAgIEFUUkFDRV9JTlQodHJhY2VOYW1lLCBmcmFtZXNSZWFkeSk7CisgICAgICAgIH0KICAgICAgICAgaWYgKChmcmFtZXNSZWFkeSA+PSBtaW5GcmFtZXMpICYmIHRyYWNrLT5pc1JlYWR5KCkgJiYKICAgICAgICAgICAgICAgICAhdHJhY2stPmlzUGF1c2VkKCkgJiYgIXRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkKICAgICAgICAgewpAQCAtMzU0Myw2ICs0MDI2LDE0IEBACiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UkVTQU1QTEUsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6U0FNUExFX1JBVEUsCiAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KXJlcVNhbXBsZVJhdGUpOworCisgICAgICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSBwbGF5YmFja1JhdGUgPSB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0UGxheWJhY2tSYXRlKCk7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VElNRVNUUkVUQ0gsCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UExBWUJBQ0tfUkFURSwKKyAgICAgICAgICAgICAgICAmcGxheWJhY2tSYXRlKTsKKwogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgb3V0cHV0IGJ1ZmZlciBmb3IgdGhlIHRyYWNrLgogICAgICAgICAgICAgICoKQEAgLTM1OTUsNiArNDA4Niw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoZnJhbWVzUmVhZHkgPCBkZXNpcmVkRnJhbWVzICYmICF0cmFjay0+aXNTdG9wcGVkKCkgJiYgIXRyYWNrLT5pc1BhdXNlZCgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInRyYWNrKCVwKSB1bmRlcnJ1biwgIGZyYW1lc1JlYWR5KCV6dSkgPCBmcmFtZXNEZXNpcmVkKCV6ZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2ssIGZyYW1lc1JlYWR5LCBkZXNpcmVkRnJhbWVzKTsKICAgICAgICAgICAgICAgICB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcyhkZXNpcmVkRnJhbWVzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGNsZWFyIGVmZmVjdCBjaGFpbiBpbnB1dCBidWZmZXIgaWYgYW4gYWN0aXZlIHRyYWNrIHVuZGVycnVucyB0byBhdm9pZCBzZW5kaW5nCkBAIC0zODEyLDcgKzQzMDUsNyBAQAogICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVdpdGhvdXRTcGVha2VyCiAgICAgICAgICAgICAgICAgPSBBVURJT19ERVZJQ0VfT1VUX0FMTCAmIH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CiAgICAgICAgICAgICAvLyBjaGVjayBpZiBhbnkgb3RoZXIgZGV2aWNlIChleGNlcHQgc3BlYWtlcikgaXMgb24KLSAgICAgICAgICAgIGlmICh2YWx1ZSAmIGRldmljZVdpdGhvdXRTcGVha2VyICkgeworICAgICAgICAgICAgaWYgKHZhbHVlICYgZGV2aWNlV2l0aG91dFNwZWFrZXIpIHsKICAgICAgICAgICAgICAgICBwYXJhbXMgfD0gSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhT3RoZXJBdWRpb0RldmljZU9uOwogICAgICAgICAgICAgfQogCkBAIC0zODM2LDcgKzQzMjksNyBAQAogICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZVBhaXIuc3RyaW5nKCkpOwogICAgICAgICBpZiAoIW1TdGFuZGJ5ICYmIHN0YXR1cyA9PSBJTlZBTElEX09QRVJBVElPTikgewotICAgICAgICAgICAgbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOworICAgICAgICAgICAgbU91dHB1dC0+c3RhbmRieSgpOwogICAgICAgICAgICAgbVN0YW5kYnkgPSB0cnVlOwogICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiA9IDA7CiAgICAgICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCkBAIC0zODU0LDcgKzQzNDcsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtVHJhY2tzW2ldLT5tTmFtZSA9IG5hbWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEF1ZGlvU3lzdGVtOjpPVVRQVVRfQ09ORklHX0NIQU5HRUQpOworICAgICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zODc5LDcgKzQzNzIsNyBAQAogICAgIFN0cmluZzggcmVzdWx0OwogCiAgICAgUGxheWJhY2tUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoZmQsIGFyZ3MpOwotCisgICAgZHByaW50ZihmZCwgIiAgVGhyZWFkIHRocm90dGxlIHRpbWUgKG1zZWNzKTogJXVcbiIsIG1UaHJlYWRUaHJvdHRsZVRpbWVNcyk7CiAgICAgZHByaW50ZihmZCwgIiAgQXVkaW9NaXhlciB0cmFja3M6IDB4JTA4eFxuIiwgbUF1ZGlvTWl4ZXItPnRyYWNrTmFtZXMoKSk7CiAKICAgICAvLyBNYWtlIGEgbm9uLWF0b21pYyBjb3B5IG9mIGZhc3QgbWl4ZXIgZHVtcCBzdGF0ZSBzbyBpdCB3b24ndCBjaGFuZ2UgdW5kZXJuZWF0aCB1cwpAQCAtMzkzMiwxNiArNDQyNSwxNiBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6RGlyZWN0T3V0cHV0VGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwKLSAgICAgICAgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwgYXVkaW9faW9faGFuZGxlX3QgaWQsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCi0gICAgOiAgIFBsYXliYWNrVGhyZWFkKGF1ZGlvRmxpbmdlciwgb3V0cHV0LCBpZCwgZGV2aWNlLCBESVJFQ1QpCisgICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBib29sIHN5c3RlbVJlYWR5KQorICAgIDogICBQbGF5YmFja1RocmVhZChhdWRpb0ZsaW5nZXIsIG91dHB1dCwgaWQsIGRldmljZSwgRElSRUNULCBzeXN0ZW1SZWFkeSkKICAgICAgICAgLy8gbUxlZnRWb2xGbG9hdCwgbVJpZ2h0Vm9sRmxvYXQKIHsKIH0KIAogQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OkRpcmVjdE91dHB1dFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsCiAgICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCB1aW50MzJfdCBkZXZpY2UsCi0gICAgICAgIFRocmVhZEJhc2U6OnR5cGVfdCB0eXBlKQotICAgIDogICBQbGF5YmFja1RocmVhZChhdWRpb0ZsaW5nZXIsIG91dHB1dCwgaWQsIGRldmljZSwgdHlwZSkKKyAgICAgICAgVGhyZWFkQmFzZTo6dHlwZV90IHR5cGUsIGJvb2wgc3lzdGVtUmVhZHkpCisgICAgOiAgIFBsYXliYWNrVGhyZWFkKGF1ZGlvRmxpbmdlciwgb3V0cHV0LCBpZCwgZGV2aWNlLCB0eXBlLCBzeXN0ZW1SZWFkeSkKICAgICAgICAgLy8gbUxlZnRWb2xGbG9hdCwgbVJpZ2h0Vm9sRmxvYXQKIHsKIH0KQEAgLTM5OTgsNiArNDQ5MSwyNCBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6b25BZGROZXdUcmFja19sKCkKK3sKKyAgICBzcDxUcmFjaz4gcHJldmlvdXNUcmFjayA9IG1QcmV2aW91c1RyYWNrLnByb21vdGUoKTsKKyAgICBzcDxUcmFjaz4gbGF0ZXN0VHJhY2sgPSBtTGF0ZXN0QWN0aXZlVHJhY2sucHJvbW90ZSgpOworCisgICAgaWYgKHByZXZpb3VzVHJhY2sgIT0gMCAmJiBsYXRlc3RUcmFjayAhPSAwKSB7CisgICAgICAgIGlmIChtVHlwZSA9PSBESVJFQ1QpIHsKKyAgICAgICAgICAgIGlmIChwcmV2aW91c1RyYWNrLmdldCgpICE9IGxhdGVzdFRyYWNrLmdldCgpKSB7CisgICAgICAgICAgICAgICAgbUZsdXNoUGVuZGluZyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSAvKiBtVHlwZSA9PSBPRkZMT0FEICovIHsKKyAgICAgICAgICAgIGlmIChwcmV2aW91c1RyYWNrLT5zZXNzaW9uSWQoKSAhPSBsYXRlc3RUcmFjay0+c2Vzc2lvbklkKCkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hQZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBQbGF5YmFja1RocmVhZDo6b25BZGROZXdUcmFja19sKCk7Cit9CiAKIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Om1peGVyX3N0YXRlIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpwcmVwYXJlVHJhY2tzX2woCiAgICAgVmVjdG9yPCBzcDxUcmFjaz4gPiAqdHJhY2tzVG9SZW1vdmUKQEAgLTQwMDcsNyArNDUxOCw2IEBACiAgICAgbWl4ZXJfc3RhdGUgbWl4ZXJTdGF0dXMgPSBNSVhFUl9JRExFOwogICAgIGJvb2wgZG9Id1BhdXNlID0gZmFsc2U7CiAgICAgYm9vbCBkb0h3UmVzdW1lID0gZmFsc2U7Ci0gICAgYm9vbCBmbHVzaFBlbmRpbmcgPSBmYWxzZTsKIAogICAgIC8vIGZpbmQgb3V0IHdoaWNoIHRyYWNrcyBuZWVkIHRvIGJlIHByb2Nlc3NlZAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewpAQCAtNDAxNyw2ICs0NTI3LDEyIEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCisgICAgICAgIGlmICh0LT5pc0ludmFsaWQoKSkgeworICAgICAgICAgICAgQUxPR1coIkFuIGludmFsaWRhdGVkIHRyYWNrIHNob3VsZG4ndCBiZSBpbiBhY3RpdmUgbGlzdCIpOworICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKICAgICAgICAgVHJhY2sqIGNvbnN0IHRyYWNrID0gdC5nZXQoKTsKICAgICAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gdHJhY2stPmNibGsoKTsKICAgICAgICAgLy8gT25seSBjb25zaWRlciBsYXN0IHRyYWNrIHN0YXJ0ZWQgZm9yIHZvbHVtZSBhbmQgbWl4ZXIgc3RhdGUgY29udHJvbC4KQEAgLTQwMjYsOSArNDU0Miw5IEBACiAgICAgICAgIHNwPFRyYWNrPiBsID0gbUxhdGVzdEFjdGl2ZVRyYWNrLnByb21vdGUoKTsKICAgICAgICAgYm9vbCBsYXN0ID0gbC5nZXQoKSA9PSB0cmFjazsKIAotICAgICAgICBpZiAobUh3U3VwcG9ydHNQYXVzZSAmJiB0cmFjay0+aXNQYXVzaW5nKCkpIHsKKyAgICAgICAgaWYgKHRyYWNrLT5pc1BhdXNpbmcoKSkgewogICAgICAgICAgICAgdHJhY2stPnNldFBhdXNlZCgpOwotICAgICAgICAgICAgaWYgKGxhc3QgJiYgIW1Id1BhdXNlZCkgeworICAgICAgICAgICAgaWYgKG1Id1N1cHBvcnRzUGF1c2UgJiYgbGFzdCAmJiAhbUh3UGF1c2VkKSB7CiAgICAgICAgICAgICAgICAgZG9Id1BhdXNlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBtSHdQYXVzZWQgPSB0cnVlOwogICAgICAgICAgICAgfQpAQCAtNDAzNiwxNSArNDU1MiwxMyBAQAogICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLT5pc0ZsdXNoUGVuZGluZygpKSB7CiAgICAgICAgICAgICB0cmFjay0+Zmx1c2hBY2soKTsKICAgICAgICAgICAgIGlmIChsYXN0KSB7Ci0gICAgICAgICAgICAgICAgZmx1c2hQZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtRmx1c2hQZW5kaW5nID0gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtSHdTdXBwb3J0c1BhdXNlICYmIHRyYWNrLT5pc1Jlc3VtZVBlbmRpbmcoKSl7CisgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPmlzUmVzdW1lUGVuZGluZygpKSB7CiAgICAgICAgICAgICB0cmFjay0+cmVzdW1lQWNrKCk7Ci0gICAgICAgICAgICBpZiAobGFzdCkgewotICAgICAgICAgICAgICAgIGlmIChtSHdQYXVzZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgZG9Id1Jlc3VtZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIG1Id1BhdXNlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsYXN0ICYmIG1Id1BhdXNlZCkgeworICAgICAgICAgICAgICAgIGRvSHdSZXN1bWUgPSB0cnVlOworICAgICAgICAgICAgICAgIG1Id1BhdXNlZCA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTQwNTQsOSArNDU2OCwxMCBAQAogICAgICAgICAvLyBhcHAgZG9lcyBub3QgY2FsbCBzdG9wKCkgYW5kIHJlbGllcyBvbiB1bmRlcnJ1biB0byBzdG9wOgogICAgICAgICAvLyBoZW5jZSB0aGUgdGVzdCBvbiAodHJhY2stPm1SZXRyeUNvdW50ID4gMSkuCiAgICAgICAgIC8vIElmIHJldHJ5Q291bnQ8PTEgdGhlbiB0cmFjayBpcyBhYm91dCB0byB1bmRlcnJ1biBhbmQgYmUgcmVtb3ZlZC4KKyAgICAgICAgLy8gRG8gbm90IHVzZSBhIGhpZ2ggdGhyZXNob2xkIGZvciBjb21wcmVzc2VkIGF1ZGlvLgogICAgICAgICB1aW50MzJfdCBtaW5GcmFtZXM7CiAgICAgICAgIGlmICgodHJhY2stPnNoYXJlZEJ1ZmZlcigpID09IDApICYmICF0cmFjay0+aXNTdG9wcGluZ18xKCkgJiYgIXRyYWNrLT5pc1BhdXNpbmcoKQotICAgICAgICAgICAgJiYgKHRyYWNrLT5tUmV0cnlDb3VudCA+IDEpKSB7CisgICAgICAgICAgICAmJiAodHJhY2stPm1SZXRyeUNvdW50ID4gMSkgJiYgYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgewogICAgICAgICAgICAgbWluRnJhbWVzID0gbU5vcm1hbEZyYW1lQ291bnQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtaW5GcmFtZXMgPSAxOwpAQCAtNDA3OSwxMSArNDU5NCwyMiBAQAogICAgICAgICAgICAgLy8gY29tcHV0ZSB2b2x1bWUgZm9yIHRoaXMgdHJhY2sKICAgICAgICAgICAgIHByb2Nlc3NWb2x1bWVfbCh0cmFjaywgbGFzdCk7CiAgICAgICAgICAgICBpZiAobGFzdCkgeworICAgICAgICAgICAgICAgIHNwPFRyYWNrPiBwcmV2aW91c1RyYWNrID0gbVByZXZpb3VzVHJhY2sucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c1RyYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrICE9IHByZXZpb3VzVHJhY2suZ2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZsdXNoIGFueSBkYXRhIHN0aWxsIGJlaW5nIHdyaXR0ZW4gZnJvbSBsYXN0IHRyYWNrCisgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNSZW1haW5pbmcgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW52YWxpZGF0ZSBwcmV2aW91cyB0cmFjayB0byBmb3JjZSBhIHNlZWsgd2hlbiByZXN1bWluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzVHJhY2stPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtUHJldmlvdXNUcmFjayA9IHRyYWNrOworCiAgICAgICAgICAgICAgICAgLy8gcmVzZXQgcmV0cnkgY291bnQKICAgICAgICAgICAgICAgICB0cmFjay0+bVJldHJ5Q291bnQgPSBrTWF4VHJhY2tSZXRyaWVzRGlyZWN0OwogICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjayA9IHQ7CiAgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9UUkFDS1NfUkVBRFk7Ci0gICAgICAgICAgICAgICAgaWYgKHVzZXNId0F2U3luYygpICYmIG1Id1BhdXNlZCkgeworICAgICAgICAgICAgICAgIGlmIChtSHdQYXVzZWQpIHsKICAgICAgICAgICAgICAgICAgICAgZG9Id1Jlc3VtZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG1Id1BhdXNlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KQEAgLTQwOTYsNiArNDYyMiwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1N0b3BwaW5nXzEoKSkgewogICAgICAgICAgICAgICAgIHRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUT1BQSU5HXzI7CisgICAgICAgICAgICAgICAgaWYgKGxhc3QgJiYgbUh3UGF1c2VkKSB7CisgICAgICAgICAgICAgICAgICAgICBkb0h3UmVzdW1lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgIG1Id1BhdXNlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoKHRyYWNrLT5zaGFyZWRCdWZmZXIoKSAhPSAwKSB8fCB0cmFjay0+aXNTdG9wcGVkKCkgfHwKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmlzU3RvcHBpbmdfMigpIHx8IHRyYWNrLT5pc1BhdXNlZCgpKSB7CkBAIC00MTMwLDggKzQ2NjAsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gaXQgd2lsbCB0aGVuIGF1dG9tYXRpY2FsbHkgY2FsbCBzdGFydCgpIHdoZW4gZGF0YSBpcyBhdmFpbGFibGUKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19ESVNBQkxFRCwgJmNibGstPm1GbGFncyk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJwYXVzZSBiZWNhdXNlIG9mIFVOREVSUlVOLCBmcmFtZXNSZWFkeSA9ICV6dSwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pbkZyYW1lcyA9ICV1LCBtRm9ybWF0ID0gJSN4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+ZnJhbWVzUmVhZHkoKSwgbWluRnJhbWVzLCBtRm9ybWF0KTsKICAgICAgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9UUkFDS1NfRU5BQkxFRDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXNId0F2U3luYygpICYmICFtSHdQYXVzZWQgJiYgIW1TdGFuZGJ5KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtSHdTdXBwb3J0c1BhdXNlICYmICFtSHdQYXVzZWQgJiYgIW1TdGFuZGJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBkb0h3UGF1c2UgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgbUh3UGF1c2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNDE0MSwxMSArNDY3NCwxMSBAQAogICAgIH0KIAogICAgIC8vIGlmIGFuIGFjdGl2ZSB0cmFjayBkaWQgbm90IGNvbW1hbmQgYSBmbHVzaCwgY2hlY2sgZm9yIHBlbmRpbmcgZmx1c2ggb24gc3RvcHBlZCB0cmFja3MKLSAgICBpZiAoIWZsdXNoUGVuZGluZykgeworICAgIGlmICghbUZsdXNoUGVuZGluZykgewogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIGlmIChtVHJhY2tzW2ldLT5pc0ZsdXNoUGVuZGluZygpKSB7CiAgICAgICAgICAgICAgICAgbVRyYWNrc1tpXS0+Zmx1c2hBY2soKTsKLSAgICAgICAgICAgICAgICBmbHVzaFBlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIG1GbHVzaFBlbmRpbmcgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNDE1NSwxMCArNDY4OCwxMCBAQAogICAgIC8vIGJlZm9yZSBmbHVzaCBhbmQgdGhlbiByZXN1bWUgSFcuIFRoaXMgY2FuIGhhcHBlbiBpbiBjYXNlIG9mIHBhdXNlL2ZsdXNoL3Jlc3VtZQogICAgIC8vIGlmIHJlc3VtZSBpcyByZWNlaXZlZCBiZWZvcmUgcGF1c2UgaXMgZXhlY3V0ZWQuCiAgICAgaWYgKG1Id1N1cHBvcnRzUGF1c2UgJiYgIW1TdGFuZGJ5ICYmCi0gICAgICAgICAgICAoZG9Id1BhdXNlIHx8IChmbHVzaFBlbmRpbmcgJiYgIW1Id1BhdXNlZCAmJiAoY291bnQgIT0gMCkpKSkgeworICAgICAgICAgICAgKGRvSHdQYXVzZSB8fCAobUZsdXNoUGVuZGluZyAmJiAhbUh3UGF1c2VkICYmIChjb3VudCAhPSAwKSkpKSB7CiAgICAgICAgIG1PdXRwdXQtPnN0cmVhbS0+cGF1c2UobU91dHB1dC0+c3RyZWFtKTsKICAgICB9Ci0gICAgaWYgKGZsdXNoUGVuZGluZykgeworICAgIGlmIChtRmx1c2hQZW5kaW5nKSB7CiAgICAgICAgIGZsdXNoSHdfbCgpOwogICAgIH0KICAgICBpZiAobUh3U3VwcG9ydHNQYXVzZSAmJiAhbVN0YW5kYnkgJiYgZG9Id1Jlc3VtZSkgewpAQCAtNDE3OCw4ICs0NzExLDggQEAKICAgICB3aGlsZSAoZnJhbWVDb3VudCkgewogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgYnVmZmVyOwogICAgICAgICBidWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7Ci0gICAgICAgIG1BY3RpdmVUcmFjay0+Z2V0TmV4dEJ1ZmZlcigmYnVmZmVyKTsKLSAgICAgICAgaWYgKGJ1ZmZlci5yYXcgPT0gTlVMTCkgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQWN0aXZlVHJhY2stPmdldE5leHRCdWZmZXIoJmJ1ZmZlcik7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwgYnVmZmVyLnJhdyA9PSBOVUxMKSB7CiAgICAgICAgICAgICBtZW1zZXQoY3VyQnVmLCAwLCBmcmFtZUNvdW50ICogbUZyYW1lU2l6ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtNDE4OSw4ICs0NzIyLDggQEAKICAgICAgICAgbUFjdGl2ZVRyYWNrLT5yZWxlYXNlQnVmZmVyKCZidWZmZXIpOwogICAgIH0KICAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gY3VyQnVmIC0gKGludDhfdCAqKW1TaW5rQnVmZmVyOwotICAgIHNsZWVwVGltZSA9IDA7Ci0gICAgc3RhbmRieVRpbWUgPSBzeXN0ZW1UaW1lKCkgKyBzdGFuZGJ5RGVsYXk7CisgICAgbVNsZWVwVGltZVVzID0gMDsKKyAgICBtU3RhbmRieVRpbWVOcyA9IHN5c3RlbVRpbWUoKSArIG1TdGFuZGJ5RGVsYXlOczsKICAgICBtQWN0aXZlVHJhY2suY2xlYXIoKTsKIH0KIApAQCAtNDE5OCwxOCArNDczMSwxOCBAQAogewogICAgIC8vIGRvIG5vdCB3cml0ZSB0byBIQUwgd2hlbiBwYXVzZWQKICAgICBpZiAobUh3UGF1c2VkIHx8ICh1c2VzSHdBdlN5bmMoKSAmJiBtU3RhbmRieSkpIHsKLSAgICAgICAgc2xlZXBUaW1lID0gaWRsZVNsZWVwVGltZTsKKyAgICAgICAgbVNsZWVwVGltZVVzID0gbUlkbGVTbGVlcFRpbWVVczsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBpZiAoc2xlZXBUaW1lID09IDApIHsKKyAgICBpZiAobVNsZWVwVGltZVVzID09IDApIHsKICAgICAgICAgaWYgKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfRU5BQkxFRCkgewotICAgICAgICAgICAgc2xlZXBUaW1lID0gYWN0aXZlU2xlZXBUaW1lOworICAgICAgICAgICAgbVNsZWVwVGltZVVzID0gbUFjdGl2ZVNsZWVwVGltZVVzOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2xlZXBUaW1lID0gaWRsZVNsZWVwVGltZTsKKyAgICAgICAgICAgIG1TbGVlcFRpbWVVcyA9IG1JZGxlU2xlZXBUaW1lVXM7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1CeXRlc1dyaXR0ZW4gIT0gMCAmJiBhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CiAgICAgICAgIG1lbXNldChtU2lua0J1ZmZlciwgMCwgbUZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKLSAgICAgICAgc2xlZXBUaW1lID0gMDsKKyAgICAgICAgbVNsZWVwVGltZVVzID0gMDsKICAgICB9CiB9CiAKQEAgLTQyMTcsMTQgKzQ3NTAsMTMgQEAKIHsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIGJvb2wgZmx1c2hQZW5kaW5nID0gZmFsc2U7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgaWYgKG1UcmFja3NbaV0tPmlzRmx1c2hQZW5kaW5nKCkpIHsKICAgICAgICAgICAgICAgICBtVHJhY2tzW2ldLT5mbHVzaEFjaygpOwotICAgICAgICAgICAgICAgIGZsdXNoUGVuZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgbUZsdXNoUGVuZGluZyA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGZsdXNoUGVuZGluZykgeworICAgICAgICBpZiAobUZsdXNoUGVuZGluZykgewogICAgICAgICAgICAgZmx1c2hId19sKCk7CiAgICAgICAgIH0KICAgICB9CkBAIC00MjM1LDE0ICs0NzY3LDE3IEBACiBib29sIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpzaG91bGRTdGFuZGJ5X2woKQogewogICAgIGJvb2wgdHJhY2tQYXVzZWQgPSBmYWxzZTsKKyAgICBib29sIHRyYWNrU3RvcHBlZCA9IGZhbHNlOwogCiAgICAgLy8gZG8gbm90IHB1dCB0aGUgSEFMIGluIHN0YW5kYnkgd2hlbiBwYXVzZWQuIEF3ZXNvbWVQbGF5ZXIgY2xlYXIgdGhlIG9mZmxvYWRlZCBBdWRpb1RyYWNrCiAgICAgLy8gYWZ0ZXIgYSB0aW1lb3V0IGFuZCB3ZSB3aWxsIGVudGVyIHN0YW5kYnkgdGhlbi4KICAgICBpZiAobVRyYWNrcy5zaXplKCkgPiAwKSB7CiAgICAgICAgIHRyYWNrUGF1c2VkID0gbVRyYWNrc1ttVHJhY2tzLnNpemUoKSAtIDFdLT5pc1BhdXNlZCgpOworICAgICAgICB0cmFja1N0b3BwZWQgPSBtVHJhY2tzW21UcmFja3Muc2l6ZSgpIC0gMV0tPmlzU3RvcHBlZCgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tzW21UcmFja3Muc2l6ZSgpIC0gMV0tPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OklETEU7CiAgICAgfQogCi0gICAgcmV0dXJuICFtU3RhbmRieSAmJiAhKHRyYWNrUGF1c2VkIHx8ICh1c2VzSHdBdlN5bmMoKSAmJiBtSHdQYXVzZWQpKTsKKyAgICByZXR1cm4gIW1TdGFuZGJ5ICYmICEodHJhY2tQYXVzZWQgfHwgKG1Id1BhdXNlZCAmJiAhdHJhY2tTdG9wcGVkKSk7CiB9CiAKIC8vIGdldFRyYWNrTmFtZV9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCkBAIC00MjkxLDcgKzQ4MjYsNyBAQAogICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZVBhaXIuc3RyaW5nKCkpOwogICAgICAgICBpZiAoIW1TdGFuZGJ5ICYmIHN0YXR1cyA9PSBJTlZBTElEX09QRVJBVElPTikgewotICAgICAgICAgICAgbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOworICAgICAgICAgICAgbU91dHB1dC0+c3RhbmRieSgpOwogICAgICAgICAgICAgbVN0YW5kYnkgPSB0cnVlOwogICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiA9IDA7CiAgICAgICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCkBAIC00Mjk5LDcgKzQ4MzQsNyBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgcmVjb25maWcpIHsKICAgICAgICAgICAgIHJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKTsKLSAgICAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQXVkaW9TeXN0ZW06Ok9VVFBVVF9DT05GSUdfQ0hBTkdFRCk7CisgICAgICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQzNDUsMTkgKzQ4ODAsMjEgQEAKIAogICAgIC8vIHVzZSBzaG9ydGVyIHN0YW5kYnkgZGVsYXkgYXMgb24gbm9ybWFsIG91dHB1dCB0byByZWxlYXNlCiAgICAgLy8gaGFyZHdhcmUgcmVzb3VyY2VzIGFzIHNvb24gYXMgcG9zc2libGUKLSAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgewotICAgICAgICBzdGFuZGJ5RGVsYXkgPSBtaWNyb3NlY29uZHMoYWN0aXZlU2xlZXBUaW1lKjIpOworICAgIC8vIG5vIGRlbGF5IG9uIG91dHB1dHMgd2l0aCBIVyBBL1Ygc3luYworICAgIGlmICh1c2VzSHdBdlN5bmMoKSkgeworICAgICAgICBtU3RhbmRieURlbGF5TnMgPSAwOworICAgIH0gZWxzZSBpZiAoKG1UeXBlID09IE9GRkxPQUQpICYmICFhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CisgICAgICAgIG1TdGFuZGJ5RGVsYXlOcyA9IGtPZmZsb2FkU3RhbmRieURlbGF5TnM7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RhbmRieURlbGF5ID0ga09mZmxvYWRTdGFuZGJ5RGVsYXlOczsKKyAgICAgICAgbVN0YW5kYnlEZWxheU5zID0gbWljcm9zZWNvbmRzKG1BY3RpdmVTbGVlcFRpbWVVcyoyKTsKICAgICB9CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OmZsdXNoSHdfbCgpCiB7Ci0gICAgaWYgKG1PdXRwdXQtPnN0cmVhbS0+Zmx1c2ggIT0gTlVMTCkgewotICAgICAgICBtT3V0cHV0LT5zdHJlYW0tPmZsdXNoKG1PdXRwdXQtPnN0cmVhbSk7Ci0gICAgfQorICAgIG1PdXRwdXQtPmZsdXNoKCk7CiAgICAgbUh3UGF1c2VkID0gZmFsc2U7CisgICAgbUZsdXNoUGVuZGluZyA9IGZhbHNlOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00NDY0LDggKzUwMDEsOCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBBdWRpb0ZsaW5nZXI6Ok9mZmxvYWRUaHJlYWQ6Ok9mZmxvYWRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAotICAgICAgICBBdWRpb1N0cmVhbU91dCogb3V0cHV0LCBhdWRpb19pb19oYW5kbGVfdCBpZCwgdWludDMyX3QgZGV2aWNlKQotICAgIDogICBEaXJlY3RPdXRwdXRUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCBkZXZpY2UsIE9GRkxPQUQpLAorICAgICAgICBBdWRpb1N0cmVhbU91dCogb3V0cHV0LCBhdWRpb19pb19oYW5kbGVfdCBpZCwgdWludDMyX3QgZGV2aWNlLCBib29sIHN5c3RlbVJlYWR5KQorICAgIDogICBEaXJlY3RPdXRwdXRUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCBkZXZpY2UsIE9GRkxPQUQsIHN5c3RlbVJlYWR5KSwKICAgICAgICAgbVBhdXNlZEJ5dGVzUmVtYWluaW5nKDApCiB7CiAgICAgLy9GSVhNRTogbVN0YW5kYnkgc2hvdWxkIGJlIHNldCB0byB0cnVlIGJ5IFRocmVhZEJhc2UgY29uc3RydWN0b3IKQEAgLTQ1MzAsNyArNTA2Nyw3IEBACiAgICAgICAgIGlmICh0cmFjay0+aXNQYXVzaW5nKCkpIHsKICAgICAgICAgICAgIHRyYWNrLT5zZXRQYXVzZWQoKTsKICAgICAgICAgICAgIGlmIChsYXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtSHdQYXVzZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAobUh3U3VwcG9ydHNQYXVzZSAmJiAhbUh3UGF1c2VkKSB7CiAgICAgICAgICAgICAgICAgICAgIGRvSHdQYXVzZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG1Id1BhdXNlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDU2Niw3ICs1MTAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdW1lIGFuIGludGVycnVwdGVkIHdyaXRlCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIGVuYWJsZSB3cml0ZSB0byBhdWRpbyBIQUwKLSAgICAgICAgICAgICAgICBzbGVlcFRpbWUgPSAwOworICAgICAgICAgICAgICAgIG1TbGVlcFRpbWVVcyA9IDA7CiAKICAgICAgICAgICAgICAgICAvLyBEbyBub3QgaGFuZGxlIG5ldyBkYXRhIGluIHRoaXMgaXRlcmF0aW9uIGV2ZW4gaWYgdHJhY2stPmZyYW1lc1JlYWR5KCkKICAgICAgICAgICAgICAgICBtaXhlclN0YXR1cyA9IE1JWEVSX1RSQUNLU19FTkFCTEVEOwpAQCAtNDYyNiw4ICs1MTYzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBtb2RpZnkgZHJhaW4gc2VxdWVuY2UgaWYgd2UgYXJlIGFscmVhZHkgZHJhaW5pbmcuIFRoaXMgaGFwcGVucwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiByZXN1bWluZyBmcm9tIHBhdXNlIGFmdGVyIGRyYWluLgogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtRHJhaW5TZXF1ZW5jZSAmIDEpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcFRpbWUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYnlUaW1lID0gc3lzdGVtVGltZSgpICsgc3RhbmRieURlbGF5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TbGVlcFRpbWVVcyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YW5kYnlUaW1lTnMgPSBzeXN0ZW1UaW1lKCkgKyBtU3RhbmRieURlbGF5TnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9EUkFJTl9UUkFDSzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJhaW5TZXF1ZW5jZSArPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNDY0Niw3ICs1MTgzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGF1ZGlvSEFMRnJhbWVzID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobU91dHB1dC0+c3RyZWFtLT5nZXRfbGF0ZW5jeShtT3V0cHV0LT5zdHJlYW0pKm1TYW1wbGVSYXRlKSAvIDEwMDA7CiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZXNXcml0dGVuID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuIC8gYXVkaW9fc3RyZWFtX291dF9mcmFtZV9zaXplKG1PdXRwdXQtPnN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiAvIG1PdXRwdXQtPmdldEZyYW1lU2l6ZSgpOwogICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlc2VudGF0aW9uQ29tcGxldGUoZnJhbWVzV3JpdHRlbiwgYXVkaW9IQUxGcmFtZXMpOwogICAgICAgICAgICAgICAgICAgICB0cmFjay0+cmVzZXQoKTsKICAgICAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CkBAIC00Njc5LDcgKzUyMTYsNiBAQAogICAgIH0KICAgICBpZiAobUZsdXNoUGVuZGluZykgewogICAgICAgICBmbHVzaEh3X2woKTsKLSAgICAgICAgbUZsdXNoUGVuZGluZyA9IGZhbHNlOwogICAgIH0KICAgICBpZiAoIW1TdGFuZGJ5ICYmIGRvSHdSZXN1bWUpIHsKICAgICAgICAgbU91dHB1dC0+c3RyZWFtLT5yZXN1bWUobU91dHB1dC0+c3RyZWFtKTsKQEAgLTQ3MjcsMjQgKzUyNjMsMTIgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpPZmZsb2FkVGhyZWFkOjpvbkFkZE5ld1RyYWNrX2woKQotewotICAgIHNwPFRyYWNrPiBwcmV2aW91c1RyYWNrID0gbVByZXZpb3VzVHJhY2sucHJvbW90ZSgpOwotICAgIHNwPFRyYWNrPiBsYXRlc3RUcmFjayA9IG1MYXRlc3RBY3RpdmVUcmFjay5wcm9tb3RlKCk7Ci0KLSAgICBpZiAocHJldmlvdXNUcmFjayAhPSAwICYmIGxhdGVzdFRyYWNrICE9IDAgJiYKLSAgICAgICAgKHByZXZpb3VzVHJhY2stPnNlc3Npb25JZCgpICE9IGxhdGVzdFRyYWNrLT5zZXNzaW9uSWQoKSkpIHsKLSAgICAgICAgbUZsdXNoUGVuZGluZyA9IHRydWU7Ci0gICAgfQotICAgIFBsYXliYWNrVGhyZWFkOjpvbkFkZE5ld1RyYWNrX2woKTsKLX0KLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBdWRpb0ZsaW5nZXI6OkR1cGxpY2F0aW5nVGhyZWFkOjpEdXBsaWNhdGluZ1RocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsCi0gICAgICAgIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQqIG1haW5UaHJlYWQsIGF1ZGlvX2lvX2hhbmRsZV90IGlkKQorICAgICAgICBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkKiBtYWluVGhyZWFkLCBhdWRpb19pb19oYW5kbGVfdCBpZCwgYm9vbCBzeXN0ZW1SZWFkeSkKICAgICA6ICAgTWl4ZXJUaHJlYWQoYXVkaW9GbGluZ2VyLCBtYWluVGhyZWFkLT5nZXRPdXRwdXQoKSwgaWQsIG1haW5UaHJlYWQtPm91dERldmljZSgpLAotICAgICAgICAgICAgICAgIERVUExJQ0FUSU5HKSwKKyAgICAgICAgICAgICAgICAgICAgc3lzdGVtUmVhZHksIERVUExJQ0FUSU5HKSwKICAgICAgICAgbVdhaXRUaW1lTXMoVUlOVF9NQVgpCiB7CiAgICAgYWRkT3V0cHV0VHJhY2sobWFpblRocmVhZCk7CkBAIC00NzY5LDE5ICs1MjkzLDE5IEBACiAgICAgICAgICAgICBtZW1zZXQobVNpbmtCdWZmZXIsIDAsIG1TaW5rQnVmZmVyU2l6ZSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgc2xlZXBUaW1lID0gMDsKKyAgICBtU2xlZXBUaW1lVXMgPSAwOwogICAgIHdyaXRlRnJhbWVzID0gbU5vcm1hbEZyYW1lQ291bnQ7CiAgICAgbUN1cnJlbnRXcml0ZUxlbmd0aCA9IG1TaW5rQnVmZmVyU2l6ZTsKLSAgICBzdGFuZGJ5VGltZSA9IHN5c3RlbVRpbWUoKSArIHN0YW5kYnlEZWxheTsKKyAgICBtU3RhbmRieVRpbWVOcyA9IHN5c3RlbVRpbWUoKSArIG1TdGFuZGJ5RGVsYXlOczsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OkR1cGxpY2F0aW5nVGhyZWFkOjp0aHJlYWRMb29wX3NsZWVwVGltZSgpCiB7Ci0gICAgaWYgKHNsZWVwVGltZSA9PSAwKSB7CisgICAgaWYgKG1TbGVlcFRpbWVVcyA9PSAwKSB7CiAgICAgICAgIGlmIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHNsZWVwVGltZSA9IGFjdGl2ZVNsZWVwVGltZTsKKyAgICAgICAgICAgIG1TbGVlcFRpbWVVcyA9IG1BY3RpdmVTbGVlcFRpbWVVczsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNsZWVwVGltZSA9IGlkbGVTbGVlcFRpbWU7CisgICAgICAgICAgICBtU2xlZXBUaW1lVXMgPSBtSWRsZVNsZWVwVGltZVVzOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtQnl0ZXNXcml0dGVuICE9IDApIHsKICAgICAgICAgaWYgKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfRU5BQkxFRCkgewpAQCAtNDc5MSwyMiArNTMxNSwxNCBAQAogICAgICAgICAgICAgLy8gZmx1c2ggcmVtYWluaW5nIG92ZXJmbG93IGJ1ZmZlcnMgaW4gb3V0cHV0IHRyYWNrcwogICAgICAgICAgICAgd3JpdGVGcmFtZXMgPSAwOwogICAgICAgICB9Ci0gICAgICAgIHNsZWVwVGltZSA9IDA7CisgICAgICAgIG1TbGVlcFRpbWVVcyA9IDA7CiAgICAgfQogfQogCiBzc2l6ZV90IEF1ZGlvRmxpbmdlcjo6RHVwbGljYXRpbmdUaHJlYWQ6OnRocmVhZExvb3Bfd3JpdGUoKQogewotICAgIC8vIFdlIGNvbnZlcnQgdGhlIGR1cGxpY2F0aW5nIHRocmVhZCBmb3JtYXQgdG8gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQKLSAgICAvLyBmb3IgZGVsaXZlcnkgZG93bnN0cmVhbSBhcyBuZWVkZWQuIFRoaXMgaW4tcGxhY2UgY29udmVyc2lvbiBpcyBzYWZlIGFzCi0gICAgLy8gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgaXMgc21hbGxlciB0aGFuIGFueSBvdGhlciBzdXBwb3J0ZWQgZm9ybWF0Ci0gICAgLy8gKEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQgaXMgbm90IGFsbG93ZWQgaGVyZSkuCi0gICAgaWYgKG1Gb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKLSAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChtU2lua0J1ZmZlciwgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNpbmtCdWZmZXIsIG1Gb3JtYXQsIHdyaXRlRnJhbWVzICogbUNoYW5uZWxDb3VudCk7Ci0gICAgfQogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0VHJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG91dHB1dFRyYWNrc1tpXS0+d3JpdGUocmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4obVNpbmtCdWZmZXIpLCB3cml0ZUZyYW1lcyk7CisgICAgICAgIG91dHB1dFRyYWNrc1tpXS0+d3JpdGUobVNpbmtCdWZmZXIsIHdyaXRlRnJhbWVzKTsKICAgICB9CiAgICAgbVN0YW5kYnkgPSBmYWxzZTsKICAgICByZXR1cm4gKHNzaXplX3QpbVNpbmtCdWZmZXJTaXplOwpAQCAtNDgzMywyNSArNTM0OSwyNiBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OkR1cGxpY2F0aW5nVGhyZWFkOjphZGRPdXRwdXRUcmFjayhNaXhlclRocmVhZCAqdGhyZWFkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgLy8gRklYTUUgZXhwbGFpbiB0aGlzIGZvcm11bGEKLSAgICBzaXplX3QgZnJhbWVDb3VudCA9ICgzICogbU5vcm1hbEZyYW1lQ291bnQgKiBtU2FtcGxlUmF0ZSkgLyB0aHJlYWQtPnNhbXBsZVJhdGUoKTsKLSAgICAvLyBPdXRwdXRUcmFjayBpcyBmb3JjZWQgdG8gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgcmVnYXJkbGVzcyBvZiBtRm9ybWF0Ci0gICAgLy8gZHVlIHRvIGN1cnJlbnQgdXNhZ2UgY2FzZSBhbmQgcmVzdHJpY3Rpb25zIG9uIHRoZSBBdWRpb0J1ZmZlclByb3ZpZGVyLgotICAgIC8vIEFjdHVhbCBidWZmZXIgY29udmVyc2lvbiBpcyBkb25lIGluIHRocmVhZExvb3Bfd3JpdGUoKS4KLSAgICAvLwotICAgIC8vIFRPRE86IFRoaXMgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLCBkZXBlbmRpbmcgb24gbXVsdGljaGFubmVsCi0gICAgLy8gKGFuZCBub24gaW50MTZfdCopIHN1cHBvcnQgb24gQUY6OlBsYXliYWNrVGhyZWFkOjpPdXRwdXRUcmFjawotICAgIE91dHB1dFRyYWNrICpvdXRwdXRUcmFjayA9IG5ldyBPdXRwdXRUcmFjayh0aHJlYWQsCisgICAgLy8gVGhlIGRvd25zdHJlYW0gTWl4ZXJUaHJlYWQgY29uc3VtZXMgdGhyZWFkLT5mcmFtZUNvdW50KCkgYW1vdW50IG9mIGZyYW1lcyBwZXIgbWl4IHBhc3MuCisgICAgLy8gQWRqdXN0IGZvciB0aHJlYWQtPnNhbXBsZVJhdGUoKSB0byBkZXRlcm1pbmUgbWluaW11bSBidWZmZXIgZnJhbWUgY291bnQuCisgICAgLy8gVGhlbiB0cmlwbGUgYnVmZmVyIGJlY2F1c2UgVGhyZWFkcyBkbyBub3QgcnVuIHN5bmNocm9ub3VzbHkgYW5kIG1heSBub3QgYmUgY2xvY2sgbG9ja2VkLgorICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0KKyAgICAgICAgICAgIDMgKiBzb3VyY2VGcmFtZXNOZWVkZWQobVNhbXBsZVJhdGUsIHRocmVhZC0+ZnJhbWVDb3VudCgpLCB0aHJlYWQtPnNhbXBsZVJhdGUoKSk7CisgICAgLy8gVE9ETzogQ29uc2lkZXIgYXN5bmNocm9ub3VzIHNhbXBsZSByYXRlIGNvbnZlcnNpb24gdG8gaGFuZGxlIGNsb2NrIGRpc3Bhcml0eQorICAgIC8vIGZyb20gZGlmZmVyZW50IE91dHB1dFRyYWNrcyBhbmQgdGhlaXIgYXNzb2NpYXRlZCBNaXhlclRocmVhZHMgKGUuZy4gb25lIG1heQorICAgIC8vIG5lYXJseSBlbXB0eSBhbmQgdGhlIG90aGVyIG1heSBiZSBkcm9wcGluZyBkYXRhKS4KKworICAgIHNwPE91dHB1dFRyYWNrPiBvdXRwdXRUcmFjayA9IG5ldyBPdXRwdXRUcmFjayh0aHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwogICAgIGlmIChvdXRwdXRUcmFjay0+Y2JsaygpICE9IE5VTEwpIHsKICAgICAgICAgdGhyZWFkLT5zZXRTdHJlYW1Wb2x1bWUoQVVESU9fU1RSRUFNX1BBVENILCAxLjBmKTsKICAgICAgICAgbU91dHB1dFRyYWNrcy5hZGQob3V0cHV0VHJhY2spOwotICAgICAgICBBTE9HVigiYWRkT3V0cHV0VHJhY2soKSB0cmFjayAlcCwgb24gdGhyZWFkICVwIiwgb3V0cHV0VHJhY2ssIHRocmVhZCk7CisgICAgICAgIEFMT0dWKCJhZGRPdXRwdXRUcmFjaygpIHRyYWNrICVwLCBvbiB0aHJlYWQgJXAiLCBvdXRwdXRUcmFjay5nZXQoKSwgdGhyZWFkKTsKICAgICAgICAgdXBkYXRlV2FpdFRpbWVfbCgpOwogICAgIH0KIH0KQEAgLTQ5MzEsMTIgKzU0NDgsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1JbiAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0RGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGluRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN5c3RlbVJlYWR5CiAjaWZkZWYgVEVFX1NJTksKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBjb25zdCBzcDxOQkFJT19TaW5rPiYgdGVlU2luawogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgOgotICAgIFRocmVhZEJhc2UoYXVkaW9GbGluZ2VyLCBpZCwgb3V0RGV2aWNlLCBpbkRldmljZSwgUkVDT1JEKSwKKyAgICBUaHJlYWRCYXNlKGF1ZGlvRmxpbmdlciwgaWQsIG91dERldmljZSwgaW5EZXZpY2UsIFJFQ09SRCwgc3lzdGVtUmVhZHkpLAogICAgIG1JbnB1dChpbnB1dCksIG1BY3RpdmVUcmFja3NHZW4oMCksIG1Sc21wSW5CdWZmZXIoTlVMTCksCiAgICAgLy8gbVJzbXBJbkZyYW1lcyBhbmQgbVJzbXBJbkZyYW1lc1AyIGFyZSBzZXQgYnkgcmVhZElucHV0UGFyYW1ldGVyc19sKCkKICAgICBtUnNtcEluUmVhcigwKQpAQCAtNDk1NSw4ICs1NDczLDggQEAKICAgICAvLyBtRmFzdENhcHR1cmVOQkxvZ1dyaXRlcgogICAgICwgbUZhc3RUcmFja0F2YWlsKGZhbHNlKQogewotICAgIHNucHJpbnRmKG1OYW1lLCBrTmFtZUxlbmd0aCwgIkF1ZGlvSW5fJVgiLCBpZCk7Ci0gICAgbU5CTG9nV3JpdGVyID0gYXVkaW9GbGluZ2VyLT5uZXdXcml0ZXJfbChrTG9nU2l6ZSwgbU5hbWUpOworICAgIHNucHJpbnRmKG1UaHJlYWROYW1lLCBrVGhyZWFkTmFtZUxlbmd0aCwgIkF1ZGlvSW5fJVgiLCBpZCk7CisgICAgbU5CTG9nV3JpdGVyID0gYXVkaW9GbGluZ2VyLT5uZXdXcml0ZXJfbChrTG9nU2l6ZSwgbVRocmVhZE5hbWUpOwogCiAgICAgcmVhZElucHV0UGFyYW1ldGVyc19sKCk7CiAKQEAgLTQ5NzcsMjYgKzU0OTUsMTMgQEAKICAgICAgICAgaW5pdEZhc3RDYXB0dXJlID0gdHJ1ZTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBGYXN0Q2FwdHVyZV9TdGF0aWM6Ci0gICAgICAgIHVpbnQzMl90IHByaW1hcnlPdXRwdXRTYW1wbGVSYXRlOwotICAgICAgICB7Ci0gICAgICAgICAgICBBdXRvTXV0ZXggX2woYXVkaW9GbGluZ2VyLT5tSGFyZHdhcmVMb2NrKTsKLSAgICAgICAgICAgIHByaW1hcnlPdXRwdXRTYW1wbGVSYXRlID0gYXVkaW9GbGluZ2VyLT5tUHJpbWFyeU91dHB1dFNhbXBsZVJhdGU7Ci0gICAgICAgIH0KLSAgICAgICAgaW5pdEZhc3RDYXB0dXJlID0KLSAgICAgICAgICAgICAgICAvLyBlaXRoZXIgY2FwdHVyZSBzYW1wbGUgcmF0ZSBpcyBzYW1lIGFzIChhIHJlYXNvbmFibGUpIHByaW1hcnkgb3V0cHV0IHNhbXBsZSByYXRlCi0gICAgICAgICAgICAgICAgKCgocHJpbWFyeU91dHB1dFNhbXBsZVJhdGUgPT0gNDQxMDAgfHwgcHJpbWFyeU91dHB1dFNhbXBsZVJhdGUgPT0gNDgwMDApICYmCi0gICAgICAgICAgICAgICAgICAgIChtU2FtcGxlUmF0ZSA9PSBwcmltYXJ5T3V0cHV0U2FtcGxlUmF0ZSkpIHx8Ci0gICAgICAgICAgICAgICAgLy8gb3IgcHJpbWFyeSBvdXRwdXQgc2FtcGxlIHJhdGUgaXMgdW5rbm93biwgYW5kIGNhcHR1cmUgc2FtcGxlIHJhdGUgaXMgcmVhc29uYWJsZQotICAgICAgICAgICAgICAgICgocHJpbWFyeU91dHB1dFNhbXBsZVJhdGUgPT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKChtU2FtcGxlUmF0ZSA9PSA0NDEwMCB8fCBtU2FtcGxlUmF0ZSA9PSA0ODAwMCkpKSkgJiYKLSAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIGJ1ZmZlciBzaXplIGlzIDwgMTIgbXMKLSAgICAgICAgICAgICAgICAobUZyYW1lQ291bnQgKiAxMDAwKSAvIG1TYW1wbGVSYXRlIDwgMTI7CisgICAgICAgIGluaXRGYXN0Q2FwdHVyZSA9IChtRnJhbWVDb3VudCAqIDEwMDApIC8gbVNhbXBsZVJhdGUgPCBrTWluTm9ybWFsQ2FwdHVyZUJ1ZmZlclNpemVNczsKICAgICAgICAgYnJlYWs7CiAgICAgLy8gY2FzZSBGYXN0Q2FwdHVyZV9EeW5hbWljOgogICAgIH0KIAogICAgIGlmIChpbml0RmFzdENhcHR1cmUpIHsKLSAgICAgICAgLy8gY3JlYXRlIGEgUGlwZSBmb3IgRmFzdE1peGVyIHRvIHdyaXRlIHRvLCBhbmQgZm9yIHVzIGFuZCBmYXN0IHRyYWNrcyB0byByZWFkIGZyb20KKyAgICAgICAgLy8gY3JlYXRlIGEgUGlwZSBmb3IgRmFzdENhcHR1cmUgdG8gd3JpdGUgdG8sIGFuZCBmb3IgdXMgYW5kIGZhc3QgdHJhY2tzIHRvIHJlYWQgZnJvbQogICAgICAgICBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gbUlucHV0U291cmNlLT5mb3JtYXQoKTsKICAgICAgICAgc2l6ZV90IHBpcGVGcmFtZXNQMiA9IHJvdW5kdXAobVNhbXBsZVJhdGUgLyAyNSk7ICAgIC8vIGRvdWJsZS1idWZmZXJpbmcgb2YgMjAgbXMgZWFjaAogICAgICAgICBzaXplX3QgcGlwZVNpemUgPSBwaXBlRnJhbWVzUDIgKiBGb3JtYXRfZnJhbWVTaXplKGZvcm1hdCk7CkBAIC01MDU1LDEyICs1NTYwLDcgQEAKICAgICAgICAgLy8gc3RhcnQgdGhlIGZhc3QgY2FwdHVyZQogICAgICAgICBtRmFzdENhcHR1cmUtPnJ1bigiRmFzdENhcHR1cmUiLCBBTkRST0lEX1BSSU9SSVRZX1VSR0VOVF9BVURJTyk7CiAgICAgICAgIHBpZF90IHRpZCA9IG1GYXN0Q2FwdHVyZS0+Z2V0VGlkKCk7Ci0gICAgICAgIGludCBlcnIgPSByZXF1ZXN0UHJpb3JpdHkoZ2V0cGlkX2NhY2hlZCwgdGlkLCBrUHJpb3JpdHlGYXN0TWl4ZXIpOwotICAgICAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dXKCJQb2xpY3kgU0NIRURfRklGTyBwcmlvcml0eSAlZCBpcyB1bmF2YWlsYWJsZSBmb3IgcGlkICVkIHRpZCAlZDsgZXJyb3IgJWQiLAotICAgICAgICAgICAgICAgICAgICBrUHJpb3JpdHlGYXN0Q2FwdHVyZSwgZ2V0cGlkX2NhY2hlZCwgdGlkLCBlcnIpOwotICAgICAgICB9Ci0KKyAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChnZXRwaWRfY2FjaGVkLCB0aWQsIGtQcmlvcml0eUZhc3RNaXhlcik7CiAjaWZkZWYgQVVESU9fV0FUQ0hET0cKICAgICAgICAgLy8gRklYTUUKICNlbmRpZgpAQCAtNTA3Miw3ICs1NTcyLDYgQEAKICAgICAvLyBGSVhNRSBtTm9ybWFsU291cmNlCiB9CiAKLQogQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6On5SZWNvcmRUaHJlYWQoKQogewogICAgIGlmIChtRmFzdENhcHR1cmUgIT0gMCkgewpAQCAtNTA5MiwxMiArNTU5MSwxMiBAQAogICAgIH0KICAgICBtQXVkaW9GbGluZ2VyLT51bnJlZ2lzdGVyV3JpdGVyKG1GYXN0Q2FwdHVyZU5CTG9nV3JpdGVyKTsKICAgICBtQXVkaW9GbGluZ2VyLT51bnJlZ2lzdGVyV3JpdGVyKG1OQkxvZ1dyaXRlcik7Ci0gICAgZGVsZXRlW10gbVJzbXBJbkJ1ZmZlcjsKKyAgICBmcmVlKG1Sc21wSW5CdWZmZXIpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpvbkZpcnN0UmVmKCkKIHsKLSAgICBydW4obU5hbWUsIFBSSU9SSVRZX1VSR0VOVF9BVURJTyk7CisgICAgcnVuKG1UaHJlYWROYW1lLCBQUklPUklUWV9VUkdFTlRfQVVESU8pOwogfQogCiBib29sIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjp0aHJlYWRMb29wKCkKQEAgLTUxMzgsNyArNTYzNyw5IEBACiAKICAgICAgICAgLy8gc2xlZXAgd2l0aCBtdXRleCB1bmxvY2tlZAogICAgICAgICBpZiAoc2xlZXBVcyA+IDApIHsKKyAgICAgICAgICAgIEFUUkFDRV9CRUdJTigic2xlZXAiKTsKICAgICAgICAgICAgIHVzbGVlcChzbGVlcFVzKTsKKyAgICAgICAgICAgIEFUUkFDRV9FTkQoKTsKICAgICAgICAgICAgIHNsZWVwVXMgPSAwOwogICAgICAgICB9CiAKQEAgLTUyODIsNyArNTc4Myw4IEBACiAgICAgICAgICAgICAgICAgc3RhdGUtPm1Db21tYW5kID0gRmFzdENhcHR1cmVTdGF0ZTo6UkVBRF9XUklURTsKICNpZiAwICAgLy8gRklYTUUKICAgICAgICAgICAgICAgICBtRmFzdENhcHR1cmVEdW1wU3RhdGUuaW5jcmVhc2VTYW1wbGluZ04obUF1ZGlvRmxpbmdlci0+aXNMb3dSYW1EZXZpY2UoKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBGYXN0Q2FwdHVyZUR1bXBTdGF0ZTo6a1NhbXBsaW5nTmZvckxvd1JhbURldmljZSA6IEZhc3RNaXhlckR1bXBTdGF0ZTo6a1NhbXBsaW5nTik7CisgICAgICAgICAgICAgICAgICAgICAgICBGYXN0VGhyZWFkRHVtcFN0YXRlOjprU2FtcGxpbmdOZm9yTG93UmFtRGV2aWNlIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEZhc3RUaHJlYWREdW1wU3RhdGU6OmtTYW1wbGluZ04pOwogI2VuZGlmCiAgICAgICAgICAgICAgICAgZGlkTW9kaWZ5ID0gdHJ1ZTsKICAgICAgICAgICAgIH0KQEAgLTUzMjIsNyArNTgyNCw3IEBACiAgICAgICAgIC8vIElmIGFuIE5CQUlPIHNvdXJjZSBpcyBwcmVzZW50LCB1c2UgaXQgdG8gcmVhZCB0aGUgbm9ybWFsIGNhcHR1cmUncyBkYXRhCiAgICAgICAgIGlmIChtUGlwZVNvdXJjZSAhPSAwKSB7CiAgICAgICAgICAgICBzaXplX3QgZnJhbWVzVG9SZWFkID0gbUJ1ZmZlclNpemUgLyBtRnJhbWVTaXplOwotICAgICAgICAgICAgZnJhbWVzUmVhZCA9IG1QaXBlU291cmNlLT5yZWFkKCZtUnNtcEluQnVmZmVyW3JlYXIgKiBtQ2hhbm5lbENvdW50XSwKKyAgICAgICAgICAgIGZyYW1lc1JlYWQgPSBtUGlwZVNvdXJjZS0+cmVhZCgodWludDhfdCopbVJzbXBJbkJ1ZmZlciArIHJlYXIgKiBtRnJhbWVTaXplLAogICAgICAgICAgICAgICAgICAgICBmcmFtZXNUb1JlYWQsIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OmtJbnZhbGlkUFRTKTsKICAgICAgICAgICAgIGlmIChmcmFtZXNSZWFkID09IDApIHsKICAgICAgICAgICAgICAgICAvLyBzaW5jZSBwaXBlIGlzIG5vbi1ibG9ja2luZywgc2ltdWxhdGUgYmxvY2tpbmcgaW5wdXQKQEAgLTUzMzEsNyArNTgzMyw3IEBACiAgICAgICAgIC8vIG90aGVyd2lzZSB1c2UgdGhlIEhBTCAvIEF1ZGlvU3RyZWFtSW4gZGlyZWN0bHkKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNzaXplX3QgYnl0ZXNSZWFkID0gbUlucHV0LT5zdHJlYW0tPnJlYWQobUlucHV0LT5zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICZtUnNtcEluQnVmZmVyW3JlYXIgKiBtQ2hhbm5lbENvdW50XSwgbUJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgICAgICAodWludDhfdCopbVJzbXBJbkJ1ZmZlciArIHJlYXIgKiBtRnJhbWVTaXplLCBtQnVmZmVyU2l6ZSk7CiAgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkIDwgMCkgewogICAgICAgICAgICAgICAgIGZyYW1lc1JlYWQgPSBieXRlc1JlYWQ7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNTM1MSwxMyArNTg1MywxMyBAQAogICAgICAgICBBTE9HX0FTU0VSVChmcmFtZXNSZWFkID4gMCk7CiAKICAgICAgICAgaWYgKG1UZWVTaW5rICE9IDApIHsKLSAgICAgICAgICAgICh2b2lkKSBtVGVlU2luay0+d3JpdGUoJm1Sc21wSW5CdWZmZXJbcmVhciAqIG1DaGFubmVsQ291bnRdLCBmcmFtZXNSZWFkKTsKKyAgICAgICAgICAgICh2b2lkKSBtVGVlU2luay0+d3JpdGUoKHVpbnQ4X3QqKW1Sc21wSW5CdWZmZXIgKyByZWFyICogbUZyYW1lU2l6ZSwgZnJhbWVzUmVhZCk7CiAgICAgICAgIH0KICAgICAgICAgLy8gSWYgZGVzdGluYXRpb24gaXMgbm9uLWNvbnRpZ3VvdXMsIHdlIG5vdyBjb3JyZWN0IGZvciByZWFkaW5nIHBhc3QgZW5kIG9mIGJ1ZmZlci4KICAgICAgICAgewogICAgICAgICAgICAgc2l6ZV90IHBhcnQxID0gbVJzbXBJbkZyYW1lc1AyIC0gcmVhcjsKICAgICAgICAgICAgIGlmICgoc2l6ZV90KSBmcmFtZXNSZWFkID4gcGFydDEpIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkobVJzbXBJbkJ1ZmZlciwgJm1Sc21wSW5CdWZmZXJbbVJzbXBJbkZyYW1lc1AyICogbUNoYW5uZWxDb3VudF0sCisgICAgICAgICAgICAgICAgbWVtY3B5KG1Sc21wSW5CdWZmZXIsICh1aW50OF90KiltUnNtcEluQnVmZmVyICsgbVJzbXBJbkZyYW1lc1AyICogbUZyYW1lU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIChmcmFtZXNSZWFkIC0gcGFydDEpICogbUZyYW1lU2l6ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTUzNzMsNiArNTg3NSw5IEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgY29kZSBwcm9iYWJseSBzaG91bGQgYmUgbW92ZWQgdG8gUmVjb3JkVHJhY2suCisgICAgICAgICAgICAvLyBUT0RPOiBVcGRhdGUgdGhlIGFjdGl2ZVRyYWNrIGJ1ZmZlciBjb252ZXJ0ZXIgaW4gY2FzZSBvZiByZWNvbmZpZ3VyZS4KKwogICAgICAgICAgICAgZW51bSB7CiAgICAgICAgICAgICAgICAgT1ZFUlJVTl9VTktOT1dOLAogICAgICAgICAgICAgICAgIE9WRVJSVU5fVFJVRSwKQEAgLTUzODcsMTMxICs1ODkyLDI4IEBACiAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lc091dCA9IGFjdGl2ZVRyYWNrLT5tU2luay5mcmFtZUNvdW50OwogICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKHN0YXR1cyA9PSBPSykgIT0gKGZyYW1lc091dCA+IDApKTsKIAotICAgICAgICAgICAgICAgIGludDMyX3QgZnJvbnQgPSBhY3RpdmVUcmFjay0+bVJzbXBJbkZyb250OwotICAgICAgICAgICAgICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGZyb250OworICAgICAgICAgICAgICAgIC8vIGNoZWNrIGF2YWlsYWJsZSBmcmFtZXMgYW5kIGhhbmRsZSBvdmVycnVuIGNvbmRpdGlvbnMKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcmVjb3JkIHRyYWNrIGlzbid0IGRyYWluaW5nIGZhc3QgZW5vdWdoLgorICAgICAgICAgICAgICAgIGJvb2wgaGFzT3ZlcnJ1bjsKICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVzSW47Ci0KLSAgICAgICAgICAgICAgICBpZiAoZmlsbGVkIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IHRyZWF0IGxpa2UgYSBtYXNzaXZlIG92ZXJydW4gYW5kIHJlLXN5bmMKLSAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4gPSAwOwotICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJzbXBJbkZyb250ID0gcmVhcjsKLSAgICAgICAgICAgICAgICAgICAgb3ZlcnJ1biA9IE9WRVJSVU5fVFJVRTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChzaXplX3QpIGZpbGxlZCA8PSBtUnNtcEluRnJhbWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1lc0luID0gKHNpemVfdCkgZmlsbGVkOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBpcyBub3Qga2VlcGluZyB1cCB3aXRoIHNlcnZlciwgYnV0IGdpdmUgaXQgbGF0ZXN0IGRhdGEKLSAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4gPSBtUnNtcEluRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJzbXBJbkZyb250ID0gZnJvbnQgPSByZWFyIC0gZnJhbWVzSW47CisgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlci0+c3luYygmZnJhbWVzSW4sICZoYXNPdmVycnVuKTsKKyAgICAgICAgICAgICAgICBpZiAoaGFzT3ZlcnJ1bikgewogICAgICAgICAgICAgICAgICAgICBvdmVycnVuID0gT1ZFUlJVTl9UUlVFOwogICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgIGlmIChmcmFtZXNPdXQgPT0gMCB8fCBmcmFtZXNJbiA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+bVJlc2FtcGxlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIG5vIHJlc2FtcGxpbmcKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc0luID4gZnJhbWVzT3V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiA9IGZyYW1lc091dDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCA9IGZyYW1lc0luOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGludDhfdCAqZHN0ID0gYWN0aXZlVHJhY2stPm1TaW5rLmk4OwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZnJhbWVzSW4gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcm9udCAmPSBtUnNtcEluRnJhbWVzUDIgLSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBhcnQxID0gbVJzbXBJbkZyYW1lc1AyIC0gZnJvbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFydDEgPiBmcmFtZXNJbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQxID0gZnJhbWVzSW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgKnNyYyA9IChpbnQ4X3QgKiltUnNtcEluQnVmZmVyICsgKGZyb250ICogbUZyYW1lU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNoYW5uZWxDb3VudCA9PSBhY3RpdmVUcmFjay0+bUNoYW5uZWxDb3VudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShkc3QsIHNyYywgcGFydDEgKiBtRnJhbWVTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUNoYW5uZWxDb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBtaXhfdG9fc3RlcmVvX2kxNl9mcm9tX21vbm9faTE2KChpbnQxNl90ICopZHN0LCAoY29uc3QgaW50MTZfdCAqKXNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bm1peF90b19tb25vX2kxNl9mcm9tX3N0ZXJlb19pMTYoKGludDE2X3QgKilkc3QsIChjb25zdCBpbnQxNl90ICopc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZHN0ICs9IHBhcnQxICogYWN0aXZlVHJhY2stPm1GcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcm9udCArPSBwYXJ0MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luIC09IHBhcnQxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tUnNtcEluRnJvbnQgKz0gZnJhbWVzT3V0OwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVzYW1wbGluZwotICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBmcmFtZXNJbk5lZWRlZCBzaG91bGQgcmVhbGx5IGJlIHBhcnQgb2YgcmVzYW1wbGVyIEFQSSwgYW5kIHNob3VsZAotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBkZXBlbmQgb24gdGhlIFNSQyByYXRpbwotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICB0byBrZWVwIG1Sc21wSW5CdWZmZXIgZnVsbCBzbyByZXNhbXBsZXIgYWx3YXlzIGhhcyBzdWZmaWNpZW50IGlucHV0Ci0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZXNJbk5lZWRlZDsKLSAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgb25seSByZS1jYWxjdWxhdGUgd2hlbiBpdCBjaGFuZ2VzLCBhbmQgb3B0aW1pemUgZm9yIGNvbW1vbiByYXRpb3MKLSAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IHByZWNvbXB1dGUgaW4vb3V0IGJlY2F1c2UgZmxvYXRpbmcgcG9pbnQgaXMgbm90IGFzc29jaWF0aXZlCi0gICAgICAgICAgICAgICAgICAgIC8vIGUuZy4gYSpiL2MgIT0gYSooYi9jKS4KLSAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIGluKG1TYW1wbGVSYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIG91dChhY3RpdmVUcmFjay0+bVNhbXBsZVJhdGUpOwotICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbk5lZWRlZCA9IGNlaWwoZnJhbWVzT3V0ICogaW4gLyBvdXQpICsgMTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm5lZWQgJXUgZnJhbWVzIGluIHRvIHByb2R1Y2UgJXUgb3V0IGdpdmVuIGluL291dCByYXRpbyBvZiAlLjRnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW5OZWVkZWQsIGZyYW1lc091dCwgaW4gLyBvdXQpOwotICAgICAgICAgICAgICAgICAgICAvLyBBbHRob3VnaCB3ZSB0aGVvcmV0aWNhbGx5IGhhdmUgZnJhbWVzSW4gaW4gY2lyY3VsYXIgYnVmZmVyLCBzb21lIG9mIHRob3NlIGFyZQotICAgICAgICAgICAgICAgICAgICAvLyB1bnJlbGVhc2VkIGZyYW1lcywgYW5kIHRodXMgbXVzdCBiZSBkaXNjb3VudGVkIGZvciBwdXJwb3NlIG9mIGJ1ZGdldGluZy4KLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHVucmVsZWFzZWQgPSBhY3RpdmVUcmFjay0+bVJzbXBJblVucmVsOwotICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiA9IGZyYW1lc0luID4gdW5yZWxlYXNlZCA/IGZyYW1lc0luIC0gdW5yZWxlYXNlZCA6IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXNJbiA8IGZyYW1lc0luTmVlZGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigibm90IGVub3VnaCB0byByZXNhbXBsZTogaGF2ZSAldSBmcmFtZXMgaW4gYnV0IG5lZWQgJXUgaW4gdG8gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvZHVjZSAldSBvdXQgZ2l2ZW4gaW4vb3V0IHJhdGlvIG9mICUuNGciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiwgZnJhbWVzSW5OZWVkZWQsIGZyYW1lc091dCwgaW4gLyBvdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5ld0ZyYW1lc091dCA9IGZyYW1lc0luID4gMCA/IGZsb29yKChmcmFtZXNJbiAtIDEpICogb3V0IC8gaW4pIDogMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobmV3RnJhbWVzT3V0ID49IGZyYW1lc091dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3RnJhbWVzT3V0ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luTmVlZGVkID0gY2VpbChuZXdGcmFtZXNPdXQgKiBpbiAvIG91dCkgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm5vdyBuZWVkICV1IGZyYW1lcyBpbiB0byBwcm9kdWNlICV1IG91dCBnaXZlbiBvdXQvaW4gcmF0aW8gb2YgJS40ZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luTmVlZGVkLCBuZXdGcmFtZXNPdXQsIG91dCAvIGluKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZnJhbWVzSW4gPCBmcmFtZXNJbk5lZWRlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigic3VjY2VzcyAyOiBoYXZlICV1IGZyYW1lcyBpbiBhbmQgbmVlZCAldSBpbiB0byBwcm9kdWNlICV1IG91dCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2l2ZW4gaW4vb3V0IHJhdGlvIG9mICUuNGciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4sIGZyYW1lc0luTmVlZGVkLCBuZXdGcmFtZXNPdXQsIGluIC8gb3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCA9IG5ld0ZyYW1lc091dDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzdWNjZXNzIDE6IGhhdmUgJXUgaW4gYW5kIG5lZWQgJXUgaW4gdG8gcHJvZHVjZSAldSBvdXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnaXZlbiBpbi9vdXQgcmF0aW8gb2YgJS40ZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4sIGZyYW1lc0luTmVlZGVkLCBmcmFtZXNPdXQsIGluIC8gb3V0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlYWxsb2NhdGUgbVJzbXBPdXRCdWZmZXIgYXMgbmVlZGVkOyB3ZSB3aWxsIGdyb3cgYnV0IG5ldmVyIHNocmluawotICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPm1Sc21wT3V0RnJhbWVDb3VudCA8IGZyYW1lc091dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgd2h5IGRvZXMgZWFjaCB0cmFjayBuZWVkIGl0J3Mgb3duIG1Sc21wT3V0QnVmZmVyPyBjYW4ndCB0aGV5IHNoYXJlPwotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlW10gYWN0aXZlVHJhY2stPm1Sc21wT3V0QnVmZmVyOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzYW1wbGVyIGFsd2F5cyBvdXRwdXRzIHN0ZXJlbwotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1Sc21wT3V0QnVmZmVyID0gbmV3IGludDMyX3RbZnJhbWVzT3V0ICogRkNDXzJdOwotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1Sc21wT3V0RnJhbWVDb3VudCA9IGZyYW1lc091dDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlc2FtcGxlciBhY2N1bXVsYXRlcywgYnV0IHdlIG9ubHkgaGF2ZSBvbmUgc291cmNlIHRyYWNrCi0gICAgICAgICAgICAgICAgICAgIG1lbXNldChhY3RpdmVUcmFjay0+bVJzbXBPdXRCdWZmZXIsIDAsIGZyYW1lc091dCAqIEZDQ18yICogc2l6ZW9mKGludDMyX3QpKTsKLSAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1SZXNhbXBsZXItPnJlc2FtcGxlKGFjdGl2ZVRyYWNrLT5tUnNtcE91dEJ1ZmZlciwgZnJhbWVzT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIGhvdyBhYm91dCBoYXZpbmcgYWN0aXZlVHJhY2sgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGl0c2VsZj8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aGlzKi8gLyogQXVkaW9CdWZmZXJQcm92aWRlciogKi8pOwotICAgICAgICAgICAgICAgICAgICAvLyBkaXRoZXJBbmRDbGFtcCgpIHdvcmtzIGFzIGxvbmcgYXMgYWxsIGJ1ZmZlcnMgcmV0dXJuZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgLy8gYWN0aXZlVHJhY2stPmdldE5leHRCdWZmZXIoKSBhcmUgMzIgYml0IGFsaWduZWQgd2hpY2ggc2hvdWxkIGJlIGFsd2F5cyB0cnVlLgotICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPm1DaGFubmVsQ291bnQgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVtcG9yYXJpbHkgdHlwZSBwdW4gbVJzbXBPdXRCdWZmZXIgZnJvbSBRNC4yNyB0byBpbnQxNl90Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXRoZXJBbmRDbGFtcChhY3RpdmVUcmFjay0+bVJzbXBPdXRCdWZmZXIsIGFjdGl2ZVRyYWNrLT5tUnNtcE91dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXNhbXBsZXIgYWx3YXlzIG91dHB1dHMgc3RlcmVvIHNhbXBsZXM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBwb3N0IHN0ZXJlbyB0byBtb25vIGNvbnZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIGRvd25taXhfdG9fbW9ub19pMTZfZnJvbV9zdGVyZW9faTE2KGFjdGl2ZVRyYWNrLT5tU2luay5pMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopYWN0aXZlVHJhY2stPm1Sc21wT3V0QnVmZmVyLCBmcmFtZXNPdXQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZGl0aGVyQW5kQ2xhbXAoKGludDMyX3QgKilhY3RpdmVUcmFjay0+bVNpbmsucmF3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJzbXBPdXRCdWZmZXIsIGZyYW1lc091dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gbm93IGRvbmUgd2l0aCBtUnNtcE91dEJ1ZmZlcgotCi0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIERvbid0IGFsbG93IGZyYW1lc091dCB0byBiZSBsYXJnZXIgdGhhbiB3aGF0IGlzIHBvc3NpYmxlIHdpdGggcmVzYW1wbGluZworICAgICAgICAgICAgICAgIC8vIGZyb20gZnJhbWVzSW4uCisgICAgICAgICAgICAgICAgLy8gVGhpcyBpc24ndCBzdHJpY3RseSBuZWNlc3NhcnkgYnV0IGhlbHBzIGxpbWl0IGJ1ZmZlciByZXNpemluZyBpbgorICAgICAgICAgICAgICAgIC8vIFJlY29yZEJ1ZmZlckNvbnZlcnRlci4gIFRPRE86IHJlbW92ZSB3aGVuIG5vIGxvbmdlciBuZWVkZWQuCisgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gbWluKGZyYW1lc091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uRnJhbWVzUG9zc2libGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luLCBtU2FtcGxlUmF0ZSwgYWN0aXZlVHJhY2stPm1TYW1wbGVSYXRlKSk7CisgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBmcmFtZXMgZnJvbSB0aGUgUmVjb3JkVGhyZWFkIGJ1ZmZlciBwcm92aWRlciB0byB0aGUgUmVjb3JkVHJhY2sgYnVmZmVyCisgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gYWN0aXZlVHJhY2stPm1SZWNvcmRCdWZmZXJDb252ZXJ0ZXItPmNvbnZlcnQoCisgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVNpbmsucmF3LCBhY3RpdmVUcmFjay0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyLCBmcmFtZXNPdXQpOwogCiAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc091dCA+IDAgJiYgKG92ZXJydW4gPT0gT1ZFUlJVTl9VTktOT1dOKSkgewogICAgICAgICAgICAgICAgICAgICBvdmVycnVuID0gT1ZFUlJVTl9GQUxTRTsKQEAgLTU2NTIsOCArNjA1NCw5IEBACiAgICAgLy8gY2xpZW50IGV4cHJlc3NlcyBhIHByZWZlcmVuY2UgZm9yIEZBU1QsIGJ1dCB3ZSBnZXQgdGhlIGZpbmFsIHNheQogICAgIGlmICgqZmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUKSB7CiAgICAgICBpZiAoCi0gICAgICAgICAgICAvLyB1c2UgY2FzZTogY2FsbGJhY2sgaGFuZGxlcgotICAgICAgICAgICAgKHRpZCAhPSAtMSkgJiYKKyAgICAgICAgICAgIC8vIHdlIGZvcm1lcmx5IGNoZWNrZWQgZm9yIGEgY2FsbGJhY2sgaGFuZGxlciAobm9uLTAgdGlkKSwKKyAgICAgICAgICAgIC8vIGJ1dCB0aGF0IGlzIG5vIGxvbmdlciByZXF1aXJlZCBmb3IgVFJBTlNGRVJfT0JUQUlOIG1vZGUKKyAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAvLyBmcmFtZSBjb3VudCBpcyBub3Qgc3BlY2lmaWVkLCBvciBpcyBleGFjdGx5IHRoZSBwaXBlIGRlcHRoCiAgICAgICAgICAgICAoKGZyYW1lQ291bnQgPT0gMCkgfHwgKGZyYW1lQ291bnQgPT0gbVBpcGVGcmFtZXNQMikpICYmCiAgICAgICAgICAgICAvLyBQQ00gZGF0YQpAQCAtNTgxOSwxMiArNjIyMiw5IEBACiAgICAgICAgIC8vIHdhcyBpbml0aWFsaXplZCB0byBzb21lIHZhbHVlIGNsb3NlciB0byB0aGUgdGhyZWFkJ3MgbVJzbXBJbkZyb250LCB0aGVuIHRoZSB0cmFjayBjb3VsZAogICAgICAgICAvLyBzZWUgcHJldmlvdXNseSBidWZmZXJlZCBkYXRhIGJlZm9yZSBpdCBjYWxsZWQgc3RhcnQoKSwgYnV0IHdpdGggZ3JlYXRlciByaXNrIG9mIG92ZXJydW4uCiAKLSAgICAgICAgcmVjb3JkVHJhY2stPm1Sc21wSW5Gcm9udCA9IG1Sc21wSW5SZWFyOwotICAgICAgICByZWNvcmRUcmFjay0+bVJzbXBJblVucmVsID0gMDsKLSAgICAgICAgLy8gRklYTUUgd2h5IHJlc2V0PwotICAgICAgICBpZiAocmVjb3JkVHJhY2stPm1SZXNhbXBsZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgcmVjb3JkVHJhY2stPm1SZXNhbXBsZXItPnJlc2V0KCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmVjb3JkVHJhY2stPm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKKyAgICAgICAgLy8gY2xlYXIgYW55IGNvbnZlcnRlciBzdGF0ZSBhcyBuZXcgZGF0YSB3aWxsIGJlIGRpc2NvbnRpbnVvdXMKKyAgICAgICAgcmVjb3JkVHJhY2stPm1SZWNvcmRCdWZmZXJDb252ZXJ0ZXItPnJlc2V0KCk7CiAgICAgICAgIHJlY29yZFRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUQVJUSU5HXzI7CiAgICAgICAgIC8vIHNpZ25hbCB0aHJlYWQgdG8gc3RhcnQKICAgICAgICAgbVdhaXRXb3JrQ1YuYnJvYWRjYXN0KCk7CkBAIC01OTQyLDE1ICs2MzQyLDE3IEBACiB7CiAgICAgZHByaW50ZihmZCwgIlxuSW5wdXQgdGhyZWFkICVwOlxuIiwgdGhpcyk7CiAKLSAgICBpZiAobUFjdGl2ZVRyYWNrcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgIGRwcmludGYoZmQsICIgIEJ1ZmZlciBzaXplOiAlenUgYnl0ZXNcbiIsIG1CdWZmZXJTaXplKTsKLSAgICB9IGVsc2UgeworICAgIGR1bXBCYXNlKGZkLCBhcmdzKTsKKworICAgIGlmIChtQWN0aXZlVHJhY2tzLnNpemUoKSA9PSAwKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIE5vIGFjdGl2ZSByZWNvcmQgY2xpZW50c1xuIik7CiAgICAgfQogICAgIGRwcmludGYoZmQsICIgIEZhc3QgY2FwdHVyZSB0aHJlYWQ6ICVzXG4iLCBoYXNGYXN0Q2FwdHVyZSgpID8gInllcyIgOiAibm8iKTsKICAgICBkcHJpbnRmKGZkLCAiICBGYXN0IHRyYWNrIGF2YWlsYWJsZTogJXNcbiIsIG1GYXN0VHJhY2tBdmFpbCA/ICJ5ZXMiIDogIm5vIik7CiAKLSAgICBkdW1wQmFzZShmZCwgYXJncyk7CisgICAgLy8gIE1ha2UgYSBub24tYXRvbWljIGNvcHkgb2YgZmFzdCBjYXB0dXJlIGR1bXAgc3RhdGUgc28gaXQgd29uJ3QgY2hhbmdlIHVuZGVybmVhdGggdXMKKyAgICBjb25zdCBGYXN0Q2FwdHVyZUR1bXBTdGF0ZSBjb3B5KG1GYXN0Q2FwdHVyZUR1bXBTdGF0ZSk7CisgICAgY29weS5kdW1wKGZkKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCkBAIC01OTk4LDEyICs2NDAwLDUyIEBACiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiB9CiAKKwordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVzYW1wbGVyQnVmZmVyUHJvdmlkZXI6OnJlc2V0KCkKK3sKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWRCYXNlID0gbVJlY29yZFRyYWNrLT5tVGhyZWFkLnByb21vdGUoKTsKKyAgICBSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKikgdGhyZWFkQmFzZS5nZXQoKTsKKyAgICBtUnNtcEluRnJvbnQgPSByZWNvcmRUaHJlYWQtPm1Sc21wSW5SZWFyOworICAgIG1Sc21wSW5VbnJlbCA9IDA7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyOjpzeW5jKAorICAgICAgICBzaXplX3QgKmZyYW1lc0F2YWlsYWJsZSwgYm9vbCAqaGFzT3ZlcnJ1bikKK3sKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWRCYXNlID0gbVJlY29yZFRyYWNrLT5tVGhyZWFkLnByb21vdGUoKTsKKyAgICBSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKikgdGhyZWFkQmFzZS5nZXQoKTsKKyAgICBjb25zdCBpbnQzMl90IHJlYXIgPSByZWNvcmRUaHJlYWQtPm1Sc21wSW5SZWFyOworICAgIGNvbnN0IGludDMyX3QgZnJvbnQgPSBtUnNtcEluRnJvbnQ7CisgICAgY29uc3Qgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CisKKyAgICBzaXplX3QgZnJhbWVzSW47CisgICAgYm9vbCBvdmVycnVuID0gZmFsc2U7CisgICAgaWYgKGZpbGxlZCA8IDApIHsKKyAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4sIGJ1dCB0cmVhdCBsaWtlIGEgbWFzc2l2ZSBvdmVycnVuIGFuZCByZS1zeW5jCisgICAgICAgIGZyYW1lc0luID0gMDsKKyAgICAgICAgbVJzbXBJbkZyb250ID0gcmVhcjsKKyAgICAgICAgb3ZlcnJ1biA9IHRydWU7CisgICAgfSBlbHNlIGlmICgoc2l6ZV90KSBmaWxsZWQgPD0gcmVjb3JkVGhyZWFkLT5tUnNtcEluRnJhbWVzKSB7CisgICAgICAgIGZyYW1lc0luID0gKHNpemVfdCkgZmlsbGVkOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGNsaWVudCBpcyBub3Qga2VlcGluZyB1cCB3aXRoIHNlcnZlciwgYnV0IGdpdmUgaXQgbGF0ZXN0IGRhdGEKKyAgICAgICAgZnJhbWVzSW4gPSByZWNvcmRUaHJlYWQtPm1Sc21wSW5GcmFtZXM7CisgICAgICAgIG1Sc21wSW5Gcm9udCA9IC8qIGZyb250ID0gKi8gcmVhciAtIGZyYW1lc0luOworICAgICAgICBvdmVycnVuID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGZyYW1lc0F2YWlsYWJsZSAhPSBOVUxMKSB7CisgICAgICAgICpmcmFtZXNBdmFpbGFibGUgPSBmcmFtZXNJbjsKKyAgICB9CisgICAgaWYgKGhhc092ZXJydW4gIT0gTlVMTCkgeworICAgICAgICAqaGFzT3ZlcnJ1biA9IG92ZXJydW47CisgICAgfQorfQorCiAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyOjpnZXROZXh0QnVmZmVyKAogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMgX191bnVzZWQpCiB7Ci0gICAgUmVjb3JkVHJhY2sgKmFjdGl2ZVRyYWNrID0gbVJlY29yZFRyYWNrOwotICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZEJhc2UgPSBhY3RpdmVUcmFjay0+bVRocmVhZC5wcm9tb3RlKCk7CisgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkQmFzZSA9IG1SZWNvcmRUcmFjay0+bVRocmVhZC5wcm9tb3RlKCk7CiAgICAgaWYgKHRocmVhZEJhc2UgPT0gMCkgewogICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSAwOwogICAgICAgICBidWZmZXItPnJhdyA9IE5VTEw7CkBAIC02MDExLDcgKzY0NTMsNyBAQAogICAgIH0KICAgICBSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKikgdGhyZWFkQmFzZS5nZXQoKTsKICAgICBpbnQzMl90IHJlYXIgPSByZWNvcmRUaHJlYWQtPm1Sc21wSW5SZWFyOwotICAgIGludDMyX3QgZnJvbnQgPSBhY3RpdmVUcmFjay0+bVJzbXBJbkZyb250OworICAgIGludDMyX3QgZnJvbnQgPSBtUnNtcEluRnJvbnQ7CiAgICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CiAgICAgLy8gRklYTUUgc2hvdWxkIG5vdCBiZSBQMiAoZG9uJ3Qgd2FudCB0byBpbmNyZWFzZSBsYXRlbmN5KQogICAgIC8vIEZJWE1FIGlmIGNsaWVudCBub3Qga2VlcGluZyB1cCwgZGlzY2FyZApAQCAtNjAyOCwxNyArNjQ3MCwxNiBAQAogICAgICAgICBwYXJ0MSA9IGFzazsKICAgICB9CiAgICAgaWYgKHBhcnQxID09IDApIHsKLSAgICAgICAgLy8gSGlnaGVyLWxldmVsIHNob3VsZCBrZWVwIG1Sc21wSW5CdWZmZXIgZnVsbCwgYW5kIG5vdCBjYWxsIHJlc2FtcGxlciBpZiBlbXB0eQotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJSZWNvcmRUaHJlYWQ6OmdldE5leHRCdWZmZXIoKSBzdGFydmVkIik7CisgICAgICAgIC8vIG91dCBvZiBkYXRhIGlzIGZpbmUgc2luY2UgdGhlIHJlc2FtcGxlciB3aWxsIHJldHVybiBhIHNob3J0LWNvdW50LgogICAgICAgICBidWZmZXItPnJhdyA9IE5VTEw7CiAgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7Ci0gICAgICAgIGFjdGl2ZVRyYWNrLT5tUnNtcEluVW5yZWwgPSAwOworICAgICAgICBtUnNtcEluVW5yZWwgPSAwOwogICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwogICAgIH0KIAotICAgIGJ1ZmZlci0+cmF3ID0gcmVjb3JkVGhyZWFkLT5tUnNtcEluQnVmZmVyICsgZnJvbnQgKiByZWNvcmRUaHJlYWQtPm1DaGFubmVsQ291bnQ7CisgICAgYnVmZmVyLT5yYXcgPSAodWludDhfdCopcmVjb3JkVGhyZWFkLT5tUnNtcEluQnVmZmVyICsgZnJvbnQgKiByZWNvcmRUaHJlYWQtPm1GcmFtZVNpemU7CiAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gcGFydDE7Ci0gICAgYWN0aXZlVHJhY2stPm1Sc21wSW5VbnJlbCA9IHBhcnQxOworICAgIG1Sc21wSW5VbnJlbCA9IHBhcnQxOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtNjA0NiwxOCArNjQ4NywyNjQgQEAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyOjpyZWxlYXNlQnVmZmVyKAogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKLSAgICBSZWNvcmRUcmFjayAqYWN0aXZlVHJhY2sgPSBtUmVjb3JkVHJhY2s7CiAgICAgc2l6ZV90IHN0ZXBDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKICAgICBpZiAoc3RlcENvdW50ID09IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBBTE9HX0FTU0VSVChzdGVwQ291bnQgPD0gYWN0aXZlVHJhY2stPm1Sc21wSW5VbnJlbCk7Ci0gICAgYWN0aXZlVHJhY2stPm1Sc21wSW5VbnJlbCAtPSBzdGVwQ291bnQ7Ci0gICAgYWN0aXZlVHJhY2stPm1Sc21wSW5Gcm9udCArPSBzdGVwQ291bnQ7CisgICAgQUxPR19BU1NFUlQoc3RlcENvdW50IDw9IG1Sc21wSW5VbnJlbCk7CisgICAgbVJzbXBJblVucmVsIC09IHN0ZXBDb3VudDsKKyAgICBtUnNtcEluRnJvbnQgKz0gc3RlcENvdW50OwogICAgIGJ1ZmZlci0+cmF3ID0gTlVMTDsKICAgICBidWZmZXItPmZyYW1lQ291bnQgPSAwOwogfQogCitBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkQnVmZmVyQ29udmVydGVyOjpSZWNvcmRCdWZmZXJDb252ZXJ0ZXIoCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IHNyY0NoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBzcmNGb3JtYXQsCisgICAgICAgIHVpbnQzMl90IHNyY1NhbXBsZVJhdGUsCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGRzdENoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBkc3RGb3JtYXQsCisgICAgICAgIHVpbnQzMl90IGRzdFNhbXBsZVJhdGUpIDoKKyAgICAgICAgICAgIG1TcmNDaGFubmVsTWFzayhBVURJT19DSEFOTkVMX0lOVkFMSUQpLCAvLyB1cGRhdGVQYXJhbWV0ZXJzIHdpbGwgc2V0IGZvbGxvd2luZyB2YXJzCisgICAgICAgICAgICAvLyBtU3JjRm9ybWF0CisgICAgICAgICAgICAvLyBtU3JjU2FtcGxlUmF0ZQorICAgICAgICAgICAgLy8gbURzdENoYW5uZWxNYXNrCisgICAgICAgICAgICAvLyBtRHN0Rm9ybWF0CisgICAgICAgICAgICAvLyBtRHN0U2FtcGxlUmF0ZQorICAgICAgICAgICAgLy8gbVNyY0NoYW5uZWxDb3VudAorICAgICAgICAgICAgLy8gbURzdENoYW5uZWxDb3VudAorICAgICAgICAgICAgLy8gbURzdEZyYW1lU2l6ZQorICAgICAgICAgICAgbUJ1ZihOVUxMKSwgbUJ1ZkZyYW1lcygwKSwgbUJ1ZkZyYW1lU2l6ZSgwKSwKKyAgICAgICAgICAgIG1SZXNhbXBsZXIoTlVMTCksCisgICAgICAgICAgICBtSXNMZWdhY3lEb3dubWl4KGZhbHNlKSwKKyAgICAgICAgICAgIG1Jc0xlZ2FjeVVwbWl4KGZhbHNlKSwKKyAgICAgICAgICAgIG1SZXF1aXJlc0Zsb2F0KGZhbHNlKSwKKyAgICAgICAgICAgIG1JbnB1dENvbnZlcnRlclByb3ZpZGVyKE5VTEwpCit7CisgICAgKHZvaWQpdXBkYXRlUGFyYW1ldGVycyhzcmNDaGFubmVsTWFzaywgc3JjRm9ybWF0LCBzcmNTYW1wbGVSYXRlLAorICAgICAgICAgICAgZHN0Q2hhbm5lbE1hc2ssIGRzdEZvcm1hdCwgZHN0U2FtcGxlUmF0ZSk7Cit9CisKK0F1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRCdWZmZXJDb252ZXJ0ZXI6On5SZWNvcmRCdWZmZXJDb252ZXJ0ZXIoKSB7CisgICAgZnJlZShtQnVmKTsKKyAgICBkZWxldGUgbVJlc2FtcGxlcjsKKyAgICBkZWxldGUgbUlucHV0Q29udmVydGVyUHJvdmlkZXI7Cit9CisKK3NpemVfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkQnVmZmVyQ29udmVydGVyOjpjb252ZXJ0KHZvaWQgKmRzdCwKKyAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciAqcHJvdmlkZXIsIHNpemVfdCBmcmFtZXMpCit7CisgICAgaWYgKG1JbnB1dENvbnZlcnRlclByb3ZpZGVyICE9IE5VTEwpIHsKKyAgICAgICAgbUlucHV0Q29udmVydGVyUHJvdmlkZXItPnNldEJ1ZmZlclByb3ZpZGVyKHByb3ZpZGVyKTsKKyAgICAgICAgcHJvdmlkZXIgPSBtSW5wdXRDb252ZXJ0ZXJQcm92aWRlcjsKKyAgICB9CisKKyAgICBpZiAobVJlc2FtcGxlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dWVigiTk8gUkVTQU1QTElORyBzYW1wbGVSYXRlOiV1IG1TcmNGb3JtYXQ6JSN4IG1Ec3RGb3JtYXQ6JSN4IiwKKyAgICAgICAgICAgICAgICBtU3JjU2FtcGxlUmF0ZSwgbVNyY0Zvcm1hdCwgbURzdEZvcm1hdCk7CisKKyAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIGJ1ZmZlcjsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IGZyYW1lczsgaSA+IDA7ICkgeworICAgICAgICAgICAgYnVmZmVyLmZyYW1lQ291bnQgPSBpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcHJvdmlkZXItPmdldE5leHRCdWZmZXIoJmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE9LIHx8IGJ1ZmZlci5mcmFtZUNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBmcmFtZXMgLT0gaTsgLy8gY2Fubm90IGZpbGwgcmVxdWVzdC4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGZvcm1hdCBjb252ZXJ0IHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICAgICAgICAgICAgY29udmVydE5vUmVzYW1wbGVyKGRzdCwgYnVmZmVyLnJhdywgYnVmZmVyLmZyYW1lQ291bnQpOworCisgICAgICAgICAgICBkc3QgPSAoaW50OF90Kilkc3QgKyBidWZmZXIuZnJhbWVDb3VudCAqIG1Ec3RGcmFtZVNpemU7CisgICAgICAgICAgICBpIC09IGJ1ZmZlci5mcmFtZUNvdW50OworICAgICAgICAgICAgcHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJmJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAgQUxPR1ZWKCJSRVNBTVBMSU5HIG1TcmNTYW1wbGVSYXRlOiV1IG1Ec3RTYW1wbGVSYXRlOiV1IG1TcmNGb3JtYXQ6JSN4IG1Ec3RGb3JtYXQ6JSN4IiwKKyAgICAgICAgICAgICAgICAgbVNyY1NhbXBsZVJhdGUsIG1Ec3RTYW1wbGVSYXRlLCBtU3JjRm9ybWF0LCBtRHN0Rm9ybWF0KTsKKworICAgICAgICAgLy8gcmVhbGxvY2F0ZSBidWZmZXIgaWYgbmVlZGVkCisgICAgICAgICBpZiAobUJ1ZkZyYW1lU2l6ZSAhPSAwICYmIG1CdWZGcmFtZXMgPCBmcmFtZXMpIHsKKyAgICAgICAgICAgICBmcmVlKG1CdWYpOworICAgICAgICAgICAgIG1CdWZGcmFtZXMgPSBmcmFtZXM7CisgICAgICAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1CdWYsIDMyLCBtQnVmRnJhbWVzICogbUJ1ZkZyYW1lU2l6ZSk7CisgICAgICAgICB9CisgICAgICAgIC8vIHJlc2FtcGxlciBhY2N1bXVsYXRlcywgYnV0IHdlIG9ubHkgaGF2ZSBvbmUgc291cmNlIHRyYWNrCisgICAgICAgIG1lbXNldChtQnVmLCAwLCBmcmFtZXMgKiBtQnVmRnJhbWVTaXplKTsKKyAgICAgICAgZnJhbWVzID0gbVJlc2FtcGxlci0+cmVzYW1wbGUoKGludDMyX3QqKW1CdWYsIGZyYW1lcywgcHJvdmlkZXIpOworICAgICAgICAvLyBmb3JtYXQgY29udmVydCB0byBkZXN0aW5hdGlvbiBidWZmZXIKKyAgICAgICAgY29udmVydFJlc2FtcGxlcihkc3QsIG1CdWYsIGZyYW1lcyk7CisgICAgfQorICAgIHJldHVybiBmcmFtZXM7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRCdWZmZXJDb252ZXJ0ZXI6OnVwZGF0ZVBhcmFtZXRlcnMoCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IHNyY0NoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBzcmNGb3JtYXQsCisgICAgICAgIHVpbnQzMl90IHNyY1NhbXBsZVJhdGUsCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGRzdENoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBkc3RGb3JtYXQsCisgICAgICAgIHVpbnQzMl90IGRzdFNhbXBsZVJhdGUpCit7CisgICAgLy8gcXVpY2sgZXZhbHVhdGlvbiBpZiB0aGVyZSBpcyBhbnkgY2hhbmdlLgorICAgIGlmIChtU3JjRm9ybWF0ID09IHNyY0Zvcm1hdAorICAgICAgICAgICAgJiYgbVNyY0NoYW5uZWxNYXNrID09IHNyY0NoYW5uZWxNYXNrCisgICAgICAgICAgICAmJiBtU3JjU2FtcGxlUmF0ZSA9PSBzcmNTYW1wbGVSYXRlCisgICAgICAgICAgICAmJiBtRHN0Rm9ybWF0ID09IGRzdEZvcm1hdAorICAgICAgICAgICAgJiYgbURzdENoYW5uZWxNYXNrID09IGRzdENoYW5uZWxNYXNrCisgICAgICAgICAgICAmJiBtRHN0U2FtcGxlUmF0ZSA9PSBkc3RTYW1wbGVSYXRlKSB7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBBTE9HVigiUmVjb3JkQnVmZmVyQ29udmVydGVyIHVwZGF0ZVBhcmFtZXRlcnMgc3JjTWFzazolI3ggZHN0TWFzazolI3giCisgICAgICAgICAgICAiICBzcmNGb3JtYXQ6JSN4IGRzdEZvcm1hdDolI3ggIHNyY1JhdGU6JXUgZHN0UmF0ZToldSIsCisgICAgICAgICAgICBzcmNDaGFubmVsTWFzaywgZHN0Q2hhbm5lbE1hc2ssIHNyY0Zvcm1hdCwgZHN0Rm9ybWF0LCBzcmNTYW1wbGVSYXRlLCBkc3RTYW1wbGVSYXRlKTsKKyAgICBjb25zdCBib29sIHZhbGlkID0KKyAgICAgICAgICAgIGF1ZGlvX2lzX2lucHV0X2NoYW5uZWwoc3JjQ2hhbm5lbE1hc2spCisgICAgICAgICAgICAmJiBhdWRpb19pc19pbnB1dF9jaGFubmVsKGRzdENoYW5uZWxNYXNrKQorICAgICAgICAgICAgJiYgYXVkaW9faXNfdmFsaWRfZm9ybWF0KHNyY0Zvcm1hdCkgJiYgYXVkaW9faXNfbGluZWFyX3BjbShzcmNGb3JtYXQpCisgICAgICAgICAgICAmJiBhdWRpb19pc192YWxpZF9mb3JtYXQoZHN0Rm9ybWF0KSAmJiBhdWRpb19pc19saW5lYXJfcGNtKGRzdEZvcm1hdCkKKyAgICAgICAgICAgICYmIChzcmNTYW1wbGVSYXRlIDw9IGRzdFNhbXBsZVJhdGUgKiBBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVgpCisgICAgICAgICAgICA7IC8vIG5vIHVwc2FtcGxpbmcgY2hlY2tzIGZvciBub3cKKyAgICBpZiAoIXZhbGlkKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgbVNyY0Zvcm1hdCA9IHNyY0Zvcm1hdDsKKyAgICBtU3JjQ2hhbm5lbE1hc2sgPSBzcmNDaGFubmVsTWFzazsKKyAgICBtU3JjU2FtcGxlUmF0ZSA9IHNyY1NhbXBsZVJhdGU7CisgICAgbURzdEZvcm1hdCA9IGRzdEZvcm1hdDsKKyAgICBtRHN0Q2hhbm5lbE1hc2sgPSBkc3RDaGFubmVsTWFzazsKKyAgICBtRHN0U2FtcGxlUmF0ZSA9IGRzdFNhbXBsZVJhdGU7CisKKyAgICAvLyBjb21wdXRlIGRlcml2ZWQgcGFyYW1ldGVycworICAgIG1TcmNDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhzcmNDaGFubmVsTWFzayk7CisgICAgbURzdENoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGRzdENoYW5uZWxNYXNrKTsKKyAgICBtRHN0RnJhbWVTaXplID0gbURzdENoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobURzdEZvcm1hdCk7CisKKyAgICAvLyBkbyB3ZSBuZWVkIHRvIHJlc2FtcGxlPworICAgIGRlbGV0ZSBtUmVzYW1wbGVyOworICAgIG1SZXNhbXBsZXIgPSBOVUxMOworICAgIGlmIChtU3JjU2FtcGxlUmF0ZSAhPSBtRHN0U2FtcGxlUmF0ZSkgeworICAgICAgICBtUmVzYW1wbGVyID0gQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZShBVURJT19GT1JNQVRfUENNX0ZMT0FULAorICAgICAgICAgICAgICAgIG1TcmNDaGFubmVsQ291bnQsIG1Ec3RTYW1wbGVSYXRlKTsKKyAgICAgICAgbVJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZShtU3JjU2FtcGxlUmF0ZSk7CisgICAgICAgIG1SZXNhbXBsZXItPnNldFZvbHVtZShBdWRpb01peGVyOjpVTklUWV9HQUlOX0ZMT0FULCBBdWRpb01peGVyOjpVTklUWV9HQUlOX0ZMT0FUKTsKKyAgICB9CisKKyAgICAvLyBhcmUgd2UgcnVubmluZyBsZWdhY3kgY2hhbm5lbCBjb252ZXJzaW9uIG1vZGVzPworICAgIG1Jc0xlZ2FjeURvd25taXggPSAobVNyY0NoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbVNyY0NoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSykKKyAgICAgICAgICAgICAgICAgICAmJiBtRHN0Q2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTl9NT05POworICAgIG1Jc0xlZ2FjeVVwbWl4ID0gbVNyY0NoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fTU9OTworICAgICAgICAgICAgICAgICAgICYmIChtRHN0Q2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtRHN0Q2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTl9GUk9OVF9CQUNLKTsKKworICAgIC8vIGRvIHdlIG5lZWQgdG8gcHJvY2VzcyBpbiBmbG9hdD8KKyAgICBtUmVxdWlyZXNGbG9hdCA9IG1SZXNhbXBsZXIgIT0gTlVMTCB8fCBtSXNMZWdhY3lEb3dubWl4IHx8IG1Jc0xlZ2FjeVVwbWl4OworCisgICAgLy8gZG8gd2UgbmVlZCBhIHN0YWdpbmcgYnVmZmVyIHRvIGNvbnZlcnQgZm9yIGRlc3RpbmF0aW9uICh3ZSBjYW4gc3RpbGwgb3B0aW1pemUgdGhpcyk/CisgICAgLy8gd2UgdXNlIG1CdWZGcmFtZVNpemUgPiAwIHRvIGluZGljYXRlIGJvdGggZnJhbWUgc2l6ZSBhcyB3ZWxsIGFzIGJ1ZmZlciBuZWNlc3NpdHkKKyAgICBpZiAobVJlc2FtcGxlciAhPSBOVUxMKSB7CisgICAgICAgIG1CdWZGcmFtZVNpemUgPSBtYXgobVNyY0NoYW5uZWxDb3VudCwgRkNDXzIpCisgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOworICAgIH0gZWxzZSBpZiAobUlzTGVnYWN5VXBtaXggfHwgbUlzTGVnYWN5RG93bm1peCkgeyAvLyBsZWdhY3kgbW9kZXMgYWx3YXlzIGZsb2F0CisgICAgICAgIG1CdWZGcmFtZVNpemUgPSBtRHN0Q2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKKyAgICB9IGVsc2UgaWYgKG1TcmNDaGFubmVsTWFzayAhPSBtRHN0Q2hhbm5lbE1hc2sgJiYgbURzdEZvcm1hdCAhPSBtU3JjRm9ybWF0KSB7CisgICAgICAgIG1CdWZGcmFtZVNpemUgPSBtRHN0Q2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtU3JjRm9ybWF0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQnVmRnJhbWVTaXplID0gMDsKKyAgICB9CisgICAgbUJ1ZkZyYW1lcyA9IDA7IC8vIGZvcmNlIHRoZSBidWZmZXIgdG8gYmUgcmVzaXplZC4KKworICAgIC8vIGRvIHdlIG5lZWQgYW4gaW5wdXQgY29udmVydGVyIGJ1ZmZlciBwcm92aWRlciB0byBnaXZlIHVzIGZsb2F0PworICAgIGRlbGV0ZSBtSW5wdXRDb252ZXJ0ZXJQcm92aWRlcjsKKyAgICBtSW5wdXRDb252ZXJ0ZXJQcm92aWRlciA9IE5VTEw7CisgICAgaWYgKG1SZXF1aXJlc0Zsb2F0ICYmIG1TcmNGb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICBtSW5wdXRDb252ZXJ0ZXJQcm92aWRlciA9IG5ldyBSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1TcmNDaGFubmVsTWFzayksCisgICAgICAgICAgICAgICAgbVNyY0Zvcm1hdCwKKyAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNX0ZMT0FULAorICAgICAgICAgICAgICAgIDI1NiAvKiBwcm92aWRlciBidWZmZXIgZnJhbWUgY291bnQgKi8pOworICAgIH0KKworICAgIC8vIGRvIHdlIG5lZWQgYSByZW1peGVyIHRvIGRvIGNoYW5uZWwgbWFzayBjb252ZXJzaW9uCisgICAgaWYgKCFtSXNMZWdhY3lEb3dubWl4ICYmICFtSXNMZWdhY3lVcG1peCAmJiBtU3JjQ2hhbm5lbE1hc2sgIT0gbURzdENoYW5uZWxNYXNrKSB7CisgICAgICAgICh2b2lkKSBtZW1jcHlfYnlfaW5kZXhfYXJyYXlfaW5pdGlhbGl6YXRpb25fZnJvbV9jaGFubmVsX21hc2soCisgICAgICAgICAgICAgICAgbUlkeEFyeSwgQVJSQVlfU0laRShtSWR4QXJ5KSwgbURzdENoYW5uZWxNYXNrLCBtU3JjQ2hhbm5lbE1hc2spOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZEJ1ZmZlckNvbnZlcnRlcjo6Y29udmVydE5vUmVzYW1wbGVyKAorICAgICAgICB2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykKK3sKKyAgICAvLyBzcmMgaXMgbmF0aXZlIHR5cGUgdW5sZXNzIHRoZXJlIGlzIGxlZ2FjeSB1cG1peCBvciBkb3dubWl4LCB3aGVyZXVwb24gaXQgaXMgZmxvYXQuCisgICAgaWYgKG1CdWZGcmFtZVNpemUgIT0gMCAmJiBtQnVmRnJhbWVzIDwgZnJhbWVzKSB7CisgICAgICAgIGZyZWUobUJ1Zik7CisgICAgICAgIG1CdWZGcmFtZXMgPSBmcmFtZXM7CisgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtQnVmLCAzMiwgbUJ1ZkZyYW1lcyAqIG1CdWZGcmFtZVNpemUpOworICAgIH0KKyAgICAvLyBkbyB3ZSBuZWVkIHRvIGRvIGxlZ2FjeSB1cG1peCBhbmQgZG93bm1peD8KKyAgICBpZiAobUlzTGVnYWN5VXBtaXggfHwgbUlzTGVnYWN5RG93bm1peCkgeworICAgICAgICB2b2lkICpkc3RCdWYgPSBtQnVmICE9IE5VTEwgPyBtQnVmIDogZHN0OworICAgICAgICBpZiAobUlzTGVnYWN5VXBtaXgpIHsKKyAgICAgICAgICAgIHVwbWl4X3RvX3N0ZXJlb19mbG9hdF9mcm9tX21vbm9fZmxvYXQoKGZsb2F0ICopZHN0QnVmLAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKilzcmMsIGZyYW1lcyk7CisgICAgICAgIH0gZWxzZSAvKm1Jc0xlZ2FjeURvd25taXggKi8geworICAgICAgICAgICAgZG93bm1peF90b19tb25vX2Zsb2F0X2Zyb21fc3RlcmVvX2Zsb2F0KChmbG9hdCAqKWRzdEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopc3JjLCBmcmFtZXMpOworICAgICAgICB9CisgICAgICAgIGlmIChtQnVmICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoZHN0LCBtRHN0Rm9ybWF0LCBtQnVmLCBBVURJT19GT1JNQVRfUENNX0ZMT0FULAorICAgICAgICAgICAgICAgICAgICBmcmFtZXMgKiBtRHN0Q2hhbm5lbENvdW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIGRvIHdlIG5lZWQgdG8gZG8gY2hhbm5lbCBtYXNrIGNvbnZlcnNpb24/CisgICAgaWYgKG1TcmNDaGFubmVsTWFzayAhPSBtRHN0Q2hhbm5lbE1hc2spIHsKKyAgICAgICAgdm9pZCAqZHN0QnVmID0gbUJ1ZiAhPSBOVUxMID8gbUJ1ZiA6IGRzdDsKKyAgICAgICAgbWVtY3B5X2J5X2luZGV4X2FycmF5KGRzdEJ1ZiwgbURzdENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICBzcmMsIG1TcmNDaGFubmVsQ291bnQsIG1JZHhBcnksIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobVNyY0Zvcm1hdCksIGZyYW1lcyk7CisgICAgICAgIGlmIChkc3RCdWYgPT0gZHN0KSB7CisgICAgICAgICAgICByZXR1cm47IC8vIGZvcm1hdCBpcyB0aGUgc2FtZQorICAgICAgICB9CisgICAgfQorICAgIC8vIGNvbnZlcnQgdG8gZGVzdGluYXRpb24gYnVmZmVyCisgICAgY29uc3Qgdm9pZCAqY29udmVydEJ1ZiA9IG1CdWYgIT0gTlVMTCA/IG1CdWYgOiBzcmM7CisgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChkc3QsIG1Ec3RGb3JtYXQsIGNvbnZlcnRCdWYsIG1TcmNGb3JtYXQsCisgICAgICAgICAgICBmcmFtZXMgKiBtRHN0Q2hhbm5lbENvdW50KTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkQnVmZmVyQ29udmVydGVyOjpjb252ZXJ0UmVzYW1wbGVyKAorICAgICAgICB2b2lkICpkc3QsIC8qbm90LWEtY29uc3QqLyB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpCit7CisgICAgLy8gc3JjIGJ1ZmZlciBmb3JtYXQgaXMgQUxXQVlTIGZsb2F0IHdoZW4gZW50ZXJpbmcgdGhpcyByb3V0aW5lCisgICAgaWYgKG1Jc0xlZ2FjeVVwbWl4KSB7CisgICAgICAgIDsgLy8gbW9ubyB0byBzdGVyZW8gYWxyZWFkeSBoYW5kbGVkIGJ5IHJlc2FtcGxlcgorICAgIH0gZWxzZSBpZiAobUlzTGVnYWN5RG93bm1peAorICAgICAgICAgICAgfHwgKG1TcmNDaGFubmVsTWFzayA9PSBtRHN0Q2hhbm5lbE1hc2sgJiYgbVNyY0NoYW5uZWxDb3VudCA9PSAxKSkgeworICAgICAgICAvLyB0aGUgcmVzYW1wbGVyIG91dHB1dHMgc3RlcmVvIGZvciBtb25vIGlucHV0IGNoYW5uZWwgKGEgZmVhdHVyZT8pCisgICAgICAgIC8vIG11c3QgY29udmVydCB0byBtb25vCisgICAgICAgIGRvd25taXhfdG9fbW9ub19mbG9hdF9mcm9tX3N0ZXJlb19mbG9hdCgoZmxvYXQgKilzcmMsCisgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopc3JjLCBmcmFtZXMpOworICAgIH0gZWxzZSBpZiAobVNyY0NoYW5uZWxNYXNrICE9IG1Ec3RDaGFubmVsTWFzaykgeworICAgICAgICAvLyBjb252ZXJ0IHRvIG1vbm8gY2hhbm5lbCBhZ2FpbiBmb3IgY2hhbm5lbCBtYXNrIGNvbnZlcnNpb24gKGNvdWxkIGJlIHNraXBwZWQKKyAgICAgICAgLy8gd2l0aCBmdXJ0aGVyIG9wdGltaXphdGlvbikuCisgICAgICAgIGlmIChtU3JjQ2hhbm5lbENvdW50ID09IDEpIHsKKyAgICAgICAgICAgIGRvd25taXhfdG9fbW9ub19mbG9hdF9mcm9tX3N0ZXJlb19mbG9hdCgoZmxvYXQgKilzcmMsCisgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopc3JjLCBmcmFtZXMpOworICAgICAgICB9CisgICAgICAgIC8vIGNvbnZlcnQgdG8gZGVzdGluYXRpb24gZm9ybWF0IChpbiBwbGFjZSwgT0sgYXMgZmxvYXQgaXMgbGFyZ2VyIHRoYW4gb3RoZXIgdHlwZXMpCisgICAgICAgIGlmIChtRHN0Rm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoc3JjLCBtRHN0Rm9ybWF0LCBzcmMsIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQsCisgICAgICAgICAgICAgICAgICAgIGZyYW1lcyAqIG1TcmNDaGFubmVsQ291bnQpOworICAgICAgICB9CisgICAgICAgIC8vIGNoYW5uZWwgY29udmVydCBhbmQgc2F2ZSB0byBkc3QKKyAgICAgICAgbWVtY3B5X2J5X2luZGV4X2FycmF5KGRzdCwgbURzdENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICBzcmMsIG1TcmNDaGFubmVsQ291bnQsIG1JZHhBcnksIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobURzdEZvcm1hdCksIGZyYW1lcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gY29udmVydCB0byBkZXN0aW5hdGlvbiBmb3JtYXQgYW5kIHNhdmUgdG8gZHN0CisgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChkc3QsIG1Ec3RGb3JtYXQsIHNyYywgQVVESU9fRk9STUFUX1BDTV9GTE9BVCwKKyAgICAgICAgICAgIGZyYW1lcyAqIG1Ec3RDaGFubmVsQ291bnQpOworfQorCiBib29sIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpjaGVja0Zvck5ld1BhcmFtZXRlcl9sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QmIHN0YXR1cykKIHsKQEAgLTYwNjcsNiArNjc1NCw3IEBACiAKICAgICBhdWRpb19mb3JtYXRfdCByZXFGb3JtYXQgPSBtRm9ybWF0OwogICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IG1TYW1wbGVSYXRlOworICAgIC8vIFRPRE8gdGhpcyBtYXkgY2hhbmdlIGlmIHdlIHdhbnQgdG8gc3VwcG9ydCBjYXB0dXJlIGZyb20gSERNSSBQQ00gbXVsdGkgY2hhbm5lbCAoZS5nIG9uIFRWcykuCiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX2luX21hc2tfZnJvbV9jb3VudChtQ2hhbm5lbENvdW50KTsKIAogICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5VmFsdWVQYWlyKTsKQEAgLTYwNzksNyArNjc2Nyw3IEBACiAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKICAgICB9CiAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlGb3JtYXQpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgaWYgKChhdWRpb19mb3JtYXRfdCkgdmFsdWUgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKKyAgICAgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKChhdWRpb19mb3JtYXRfdCkgdmFsdWUpKSB7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXFGb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIHZhbHVlOwpAQCAtNjA4OCw3ICs2Nzc2LDggQEAKICAgICB9CiAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlDaGFubmVscyksIHZhbHVlKSA9PSBOT19FUlJPUikgewogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtYXNrID0gKGF1ZGlvX2NoYW5uZWxfbWFza190KSB2YWx1ZTsKLSAgICAgICAgaWYgKG1hc2sgIT0gQVVESU9fQ0hBTk5FTF9JTl9NT05PICYmIG1hc2sgIT0gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8pIHsKKyAgICAgICAgaWYgKCFhdWRpb19pc19pbnB1dF9jaGFubmVsKG1hc2spIHx8CisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobWFzaykgPiBGQ0NfOCkgewogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBtYXNrOwpAQCAtNjEyMCw2ICs2ODA5LDkgQEAKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1JbkRldmljZSA9IHZhbHVlOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgbVByZXZJbkRldmljZSA9IHZhbHVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gZGlzYWJsZSBBRUMgYW5kIE5TIGlmIHRoZSBkZXZpY2UgaXMgYSBCVCBTQ08gaGVhZHNldCBzdXBwb3J0aW5nIHRob3NlCiAgICAgICAgICAgICAvLyBwcmUgcHJvY2Vzc2luZ3MKICAgICAgICAgICAgIGlmIChtVHJhY2tzLnNpemUoKSA+IDApIHsKQEAgLTYxNTMsMTkgKzY4NDUsMTcgQEAKICAgICAgICAgfQogICAgICAgICBpZiAocmVjb25maWcpIHsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQkFEX1ZBTFVFICYmCi0gICAgICAgICAgICAgICAgcmVxRm9ybWF0ID09IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2Zvcm1hdCgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbikgJiYKLSAgICAgICAgICAgICAgICByZXFGb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgJiYKKyAgICAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2Zvcm1hdCgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbikpICYmCisgICAgICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShyZXFGb3JtYXQpICYmCiAgICAgICAgICAgICAgICAgKG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X3NhbXBsZV9yYXRlKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgPD0gKDIgKiBzYW1wbGluZ1JhdGUpKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgPD0gKEFVRElPX1JFU0FNUExFUl9ET1dOX1JBVElPX01BWCAqIHNhbXBsaW5nUmF0ZSkpICYmCiAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soCi0gICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbUlucHV0LT5zdHJlYW0tPmNvbW1vbikpIDw9IEZDQ18yICYmCi0gICAgICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fTU9OTyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbUlucHV0LT5zdHJlYW0tPmNvbW1vbikpIDw9IEZDQ184KSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgcmVhZElucHV0UGFyYW1ldGVyc19sKCk7Ci0gICAgICAgICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBdWRpb1N5c3RlbTo6SU5QVVRfQ09ORklHX0NIQU5HRUQpOworICAgICAgICAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQVVESU9fSU5QVVRfQ09ORklHX0NIQU5HRUQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNjE4NiwyNiArNjg3NiwyNyBAQAogICAgIHJldHVybiBvdXRfczg7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmF1ZGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGludCBwYXJhbSBfX3VudXNlZCkgewotICAgIEF1ZGlvU3lzdGVtOjpPdXRwdXREZXNjcmlwdG9yIGRlc2M7Ci0gICAgY29uc3Qgdm9pZCAqcGFyYW0yID0gTlVMTDsKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCkgeworICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBkZXNjID0gbmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCk7CisKKyAgICBkZXNjLT5tSW9IYW5kbGUgPSBtSWQ7CiAKICAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBBdWRpb1N5c3RlbTo6SU5QVVRfT1BFTkVEOgotICAgIGNhc2UgQXVkaW9TeXN0ZW06OklOUFVUX0NPTkZJR19DSEFOR0VEOgotICAgICAgICBkZXNjLmNoYW5uZWxNYXNrID0gbUNoYW5uZWxNYXNrOwotICAgICAgICBkZXNjLnNhbXBsaW5nUmF0ZSA9IG1TYW1wbGVSYXRlOwotICAgICAgICBkZXNjLmZvcm1hdCA9IG1Gb3JtYXQ7Ci0gICAgICAgIGRlc2MuZnJhbWVDb3VudCA9IG1GcmFtZUNvdW50OwotICAgICAgICBkZXNjLmxhdGVuY3kgPSAwOwotICAgICAgICBwYXJhbTIgPSAmZGVzYzsKKyAgICBjYXNlIEFVRElPX0lOUFVUX09QRU5FRDoKKyAgICBjYXNlIEFVRElPX0lOUFVUX0NPTkZJR19DSEFOR0VEOgorICAgICAgICBkZXNjLT5tUGF0Y2ggPSBtUGF0Y2g7CisgICAgICAgIGRlc2MtPm1DaGFubmVsTWFzayA9IG1DaGFubmVsTWFzazsKKyAgICAgICAgZGVzYy0+bVNhbXBsaW5nUmF0ZSA9IG1TYW1wbGVSYXRlOworICAgICAgICBkZXNjLT5tRm9ybWF0ID0gbUZvcm1hdDsKKyAgICAgICAgZGVzYy0+bUZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKKyAgICAgICAgZGVzYy0+bUxhdGVuY3kgPSAwOwogICAgICAgICBicmVhazsKIAotICAgIGNhc2UgQXVkaW9TeXN0ZW06OklOUFVUX0NMT1NFRDoKKyAgICBjYXNlIEFVRElPX0lOUFVUX0NMT1NFRDoKICAgICBkZWZhdWx0OgogICAgICAgICBicmVhazsKICAgICB9Ci0gICAgbUF1ZGlvRmxpbmdlci0+YXVkaW9Db25maWdDaGFuZ2VkKGV2ZW50LCBtSWQsIHBhcmFtMik7CisgICAgbUF1ZGlvRmxpbmdlci0+aW9Db25maWdDaGFuZ2VkKGV2ZW50LCBkZXNjLCBwaWQpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpyZWFkSW5wdXRQYXJhbWV0ZXJzX2woKQpAQCAtNjIxMywxMCArNjkwNCwxMyBAQAogICAgIG1TYW1wbGVSYXRlID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOwogICAgIG1DaGFubmVsTWFzayA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2NoYW5uZWxzKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKICAgICBtQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUNoYW5uZWxNYXNrKTsKKyAgICBpZiAobUNoYW5uZWxDb3VudCA+IEZDQ184KSB7CisgICAgICAgIEFMT0dFKCJIQUwgY2hhbm5lbCBjb3VudCAlZCA+ICVkIiwgbUNoYW5uZWxDb3VudCwgRkNDXzgpOworICAgIH0KICAgICBtSEFMRm9ybWF0ID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfZm9ybWF0KCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKICAgICBtRm9ybWF0ID0gbUhBTEZvcm1hdDsKLSAgICBpZiAobUZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICBBTE9HRSgiSEFMIGZvcm1hdCAlI3ggbm90IHN1cHBvcnRlZDsgbXVzdCBiZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCIsIG1Gb3JtYXQpOworICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgeworICAgICAgICBBTE9HRSgiSEFMIGZvcm1hdCAlI3ggaXMgbm90IGxpbmVhciBwY20iLCBtRm9ybWF0KTsKICAgICB9CiAgICAgbUZyYW1lU2l6ZSA9IGF1ZGlvX3N0cmVhbV9pbl9mcmFtZV9zaXplKG1JbnB1dC0+c3RyZWFtKTsKICAgICBtQnVmZmVyU2l6ZSA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2J1ZmZlcl9zaXplKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKQEAgLTYyMjcsOSArNjkyMSwxMiBAQAogICAgIC8vIFRoZSB2YWx1ZSBpcyBzb21ld2hhdCBhcmJpdHJhcnksIGFuZCBjb3VsZCBwcm9iYWJseSBiZSBldmVuIGxhcmdlci4KICAgICAvLyBBIGxhcmdlciB2YWx1ZSBzaG91bGQgYWxsb3cgbW9yZSBvbGQgZGF0YSB0byBiZSByZWFkIGFmdGVyIGEgdHJhY2sgY2FsbHMgc3RhcnQoKSwKICAgICAvLyB3aXRob3V0IGluY3JlYXNpbmcgbGF0ZW5jeS4KKyAgICAvLworICAgIC8vIE5vdGUgdGhpcyBpcyBpbmRlcGVuZGVudCBvZiB0aGUgbWF4aW11bSBkb3duc2FtcGxpbmcgcmF0aW8gcGVybWl0dGVkIGZvciBjYXB0dXJlLgogICAgIG1Sc21wSW5GcmFtZXMgPSBtRnJhbWVDb3VudCAqIDc7CiAgICAgbVJzbXBJbkZyYW1lc1AyID0gcm91bmR1cChtUnNtcEluRnJhbWVzKTsKLSAgICBkZWxldGVbXSBtUnNtcEluQnVmZmVyOworICAgIGZyZWUobVJzbXBJbkJ1ZmZlcik7CisgICAgbVJzbXBJbkJ1ZmZlciA9IE5VTEw7CiAKICAgICAvLyBUT0RPIG9wdGltaXplIGF1ZGlvIGNhcHR1cmUgYnVmZmVyIHNpemVzIC4uLgogICAgIC8vIEhlcmUgd2UgY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBzbGlkaW5nIGJ1ZmZlciB1c2VkIGFzIGEgc291cmNlCkBAIC02MjM5LDkgKzY5MzYsOSBAQAogICAgIC8vIFRoZSBjdXJyZW50IHZhbHVlIGlzIGhpZ2hlciB0aGFuIG5lY2Vzc2FyeS4gIEhvd2V2ZXIgaXQgc2hvdWxkIG5vdCBhZGQgdG8gbGF0ZW5jeS4KIAogICAgIC8vIE92ZXItYWxsb2NhdGUgYmV5b25kIG1Sc21wSW5GcmFtZXNQMiB0byBwZXJtaXQgYSBIQUwgcmVhZCBwYXN0IGVuZCBvZiBidWZmZXIKLSAgICBzaXplX3QgYnVmZmVyU2l6ZUluU2hvcnRzID0gKG1Sc21wSW5GcmFtZXNQMiArIG1GcmFtZUNvdW50IC0gMSkgKiBtQ2hhbm5lbENvdW50OwotICAgIG1Sc21wSW5CdWZmZXIgPSBuZXcgaW50MTZfdFtidWZmZXJTaXplSW5TaG9ydHNdOwotICAgIG1lbXNldChtUnNtcEluQnVmZmVyLCAwLCBidWZmZXJTaXplSW5TaG9ydHMgKiBzaXplb2YobVJzbXBJbkJ1ZmZlclswXSkpOworICAgIHNpemVfdCBidWZmZXJTaXplID0gKG1Sc21wSW5GcmFtZXNQMiArIG1GcmFtZUNvdW50IC0gMSkgKiBtRnJhbWVTaXplOworICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtUnNtcEluQnVmZmVyLCAzMiwgYnVmZmVyU2l6ZSk7CisgICAgbWVtc2V0KG1Sc21wSW5CdWZmZXIsIDAsIGJ1ZmZlclNpemUpOyAvLyBpZiBwb3NpeF9tZW1hbGlnbiBmYWlscywgd2lsbCBzZWd2IGhlcmUuCiAKICAgICAvLyBBdWRpb1JlY29yZCBtU2FtcGxlUmF0ZSBhbmQgbUNoYW5uZWxDb3VudCBhcmUgY29uc3RhbnQgZHVlIHRvIEF1ZGlvUmVjb3JkIEFQSSBjb25zdHJhaW50cy4KICAgICAvLyBCdXQgaWYgdGhyZWFkJ3MgbVNhbXBsZVJhdGUgb3IgbUNoYW5uZWxDb3VudCBjaGFuZ2VzLCBob3cgd2lsbCB0aGF0IGFmZmVjdCBhY3RpdmUgdHJhY2tzPwpAQCAtNjM0NSwzMyArNzA0MiwzNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgaWYgKG1JbnB1dC0+YXVkaW9Id0Rldi0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKLSAgICAgICAgLy8gc3RvcmUgbmV3IGRldmljZSBhbmQgc2VuZCB0byBlZmZlY3RzCi0gICAgICAgIG1JbkRldmljZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZTsKKworICAgIC8vIHN0b3JlIG5ldyBkZXZpY2UgYW5kIHNlbmQgdG8gZWZmZWN0cworICAgIG1JbkRldmljZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZTsKKyAgICBtUGF0Y2ggPSAqcGF0Y2g7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1FZmZlY3RDaGFpbnNbaV0tPnNldERldmljZV9sKG1JbkRldmljZSk7CisgICAgfQorCisgICAgLy8gZGlzYWJsZSBBRUMgYW5kIE5TIGlmIHRoZSBkZXZpY2UgaXMgYSBCVCBTQ08gaGVhZHNldCBzdXBwb3J0aW5nIHRob3NlCisgICAgLy8gcHJlIHByb2Nlc3NpbmdzCisgICAgaWYgKG1UcmFja3Muc2l6ZSgpID4gMCkgeworICAgICAgICBib29sIHN1c3BlbmQgPSBhdWRpb19pc19ibHVldG9vdGhfc2NvX2RldmljZShtSW5EZXZpY2UpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlci0+YnROcmVjSXNPZmYoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOworICAgICAgICAgICAgc2V0RWZmZWN0U3VzcGVuZGVkX2woRlhfSUlEX0FFQywgc3VzcGVuZCwgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgIHNldEVmZmVjdFN1c3BlbmRlZF9sKEZYX0lJRF9OUywgc3VzcGVuZCwgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHN0b3JlIG5ldyBzb3VyY2UgYW5kIHNlbmQgdG8gZWZmZWN0cworICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UpIHsKKyAgICAgICAgbUF1ZGlvU291cmNlID0gcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2U7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0RGV2aWNlX2wobUluRGV2aWNlKTsKKyAgICAgICAgICAgIG1FZmZlY3RDaGFpbnNbaV0tPnNldEF1ZGlvU291cmNlX2wobUF1ZGlvU291cmNlKTsKICAgICAgICAgfQorICAgIH0KIAotICAgICAgICAvLyBkaXNhYmxlIEFFQyBhbmQgTlMgaWYgdGhlIGRldmljZSBpcyBhIEJUIFNDTyBoZWFkc2V0IHN1cHBvcnRpbmcgdGhvc2UKLSAgICAgICAgLy8gcHJlIHByb2Nlc3NpbmdzCi0gICAgICAgIGlmIChtVHJhY2tzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGJvb2wgc3VzcGVuZCA9IGF1ZGlvX2lzX2JsdWV0b290aF9zY29fZGV2aWNlKG1JbkRldmljZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlci0+YnROcmVjSXNPZmYoKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07Ci0gICAgICAgICAgICAgICAgc2V0RWZmZWN0U3VzcGVuZGVkX2woRlhfSUlEX0FFQywgc3VzcGVuZCwgdHJhY2stPnNlc3Npb25JZCgpKTsKLSAgICAgICAgICAgICAgICBzZXRFZmZlY3RTdXNwZW5kZWRfbChGWF9JSURfTlMsIHN1c3BlbmQsIHRyYWNrLT5zZXNzaW9uSWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzdG9yZSBuZXcgc291cmNlIGFuZCBzZW5kIHRvIGVmZmVjdHMKLSAgICAgICAgaWYgKG1BdWRpb1NvdXJjZSAhPSBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSkgewotICAgICAgICAgICAgbUF1ZGlvU291cmNlID0gcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2U7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXRBdWRpb1NvdXJjZV9sKG1BdWRpb1NvdXJjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQorICAgIGlmIChtSW5wdXQtPmF1ZGlvSHdEZXYtPnZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CiAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldmljZSA9IG1JbnB1dC0+YXVkaW9Id0Rldi0+aHdEZXZpY2UoKTsKICAgICAgICAgc3RhdHVzID0gaHdEZXZpY2UtPmNyZWF0ZV9hdWRpb19wYXRjaChod0RldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm51bV9zb3VyY2VzLApAQCAtNjM4MCwxOSArNzA3OSw0NyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR19BU1NFUlQoZmFsc2UsICJjcmVhdGVBdWRpb1BhdGNoX2woKSBjYWxsZWQgb24gYSBwcmUgMy4wIEhBTCIpOworICAgICAgICBjaGFyICphZGRyZXNzOworICAgICAgICBpZiAoc3RyY21wKHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcywgIiIpICE9IDApIHsKKyAgICAgICAgICAgIGFkZHJlc3MgPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmFkZHJlc3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRkcmVzcyA9IChjaGFyICopY2FsbG9jKDEsIDEpOworICAgICAgICB9CisgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoU3RyaW5nOChhZGRyZXNzKSk7CisgICAgICAgIGZyZWUoYWRkcmVzcyk7CisgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fUk9VVElORyksCisgICAgICAgICAgICAgICAgICAgICAoaW50KXBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZSk7CisgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fSU5QVVRfU09VUkNFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSk7CisgICAgICAgIHN0YXR1cyA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uc2V0X3BhcmFtZXRlcnMoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24sCisgICAgICAgICAgICAgICAgcGFyYW0udG9TdHJpbmcoKS5zdHJpbmcoKSk7CisgICAgICAgICpoYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICB9CisKKyAgICBpZiAobUluRGV2aWNlICE9IG1QcmV2SW5EZXZpY2UpIHsKKyAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBVURJT19JTlBVVF9DT05GSUdfQ0hBTkdFRCk7CisgICAgICAgIG1QcmV2SW5EZXZpY2UgPSBtSW5EZXZpY2U7CisgICAgfQorCiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnJlbGVhc2VBdWRpb1BhdGNoX2woY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQogewogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworCisgICAgbUluRGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisKICAgICBpZiAobUlucHV0LT5hdWRpb0h3RGV2LT52ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgewogICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZpY2UgPSBtSW5wdXQtPmF1ZGlvSHdEZXYtPmh3RGV2aWNlKCk7CiAgICAgICAgIHN0YXR1cyA9IGh3RGV2aWNlLT5yZWxlYXNlX2F1ZGlvX3BhdGNoKGh3RGV2aWNlLCBoYW5kbGUpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dfQVNTRVJUKGZhbHNlLCAicmVsZWFzZUF1ZGlvUGF0Y2hfbCgpIGNhbGxlZCBvbiBhIHByZSAzLjAgSEFMIik7CisgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOworICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1JPVVRJTkcpLCAwKTsKKyAgICAgICAgc3RhdHVzID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbUlucHV0LT5zdHJlYW0tPmNvbW1vbiwKKyAgICAgICAgICAgICAgICBwYXJhbS50b1N0cmluZygpLnN0cmluZygpKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTY0MTcsNCArNzE0NCw0IEBACiAgICAgY29uZmlnLT5leHQubWl4LnVzZWNhc2Uuc291cmNlID0gbUF1ZGlvU291cmNlOwogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKaW5kZXggNTZhNDJhOC4uNDZhYzMwMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCkBAIC0zMiw4ICszMiwxMSBAQAogICAgICAgICBPRkZMT0FEICAgICAgICAgICAgIC8vIFRocmVhZCBjbGFzcyBpcyBPZmZsb2FkVGhyZWFkCiAgICAgfTsKIAorICAgIHN0YXRpYyBjb25zdCBjaGFyICp0aHJlYWRUeXBlVG9TdHJpbmcodHlwZV90IHR5cGUpOworCiAgICAgVGhyZWFkQmFzZShjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLAotICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwgdHlwZV90IHR5cGUpOworICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwgdHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgYm9vbCBzeXN0ZW1SZWFkeSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+VGhyZWFkQmFzZSgpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICByZWFkeVRvUnVuKCk7CkBAIC05MCwzMCArOTMsMzMgQEAKICAgICAgICAgQ29uZGl0aW9uIG1Db25kOyAvLyBjb25kaXRpb24gZm9yIHN0YXR1cyByZXR1cm4KICAgICAgICAgc3RhdHVzX3QgbVN0YXR1czsgLy8gc3RhdHVzIGNvbW11bmljYXRlZCB0byBzZW5kZXIKICAgICAgICAgYm9vbCBtV2FpdFN0YXR1czsgLy8gdHJ1ZSBpZiBzZW5kZXIgaXMgd2FpdGluZyBmb3Igc3RhdHVzCisgICAgICAgIGJvb2wgbVJlcXVpcmVzU3lzdGVtUmVhZHk7IC8vIHRydWUgaWYgbXVzdCB3YWl0IGZvciBzeXN0ZW0gcmVhZHkgdG8gZW50ZXIgZXZlbnQgcXVldWUKICAgICAgICAgc3A8Q29uZmlnRXZlbnREYXRhPiBtRGF0YTsgICAgIC8vIGV2ZW50IHNwZWNpZmljIHBhcmFtZXRlciBkYXRhCiAKICAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIENvbmZpZ0V2ZW50KGludCB0eXBlKSA6IG1UeXBlKHR5cGUpLCBtU3RhdHVzKE5PX0VSUk9SKSwgbVdhaXRTdGF0dXMoZmFsc2UpLCBtRGF0YShOVUxMKSB7fQorICAgICAgICBDb25maWdFdmVudChpbnQgdHlwZSwgYm9vbCByZXF1aXJlc1N5c3RlbVJlYWR5ID0gZmFsc2UpIDoKKyAgICAgICAgICAgIG1UeXBlKHR5cGUpLCBtU3RhdHVzKE5PX0VSUk9SKSwgbVdhaXRTdGF0dXMoZmFsc2UpLAorICAgICAgICAgICAgbVJlcXVpcmVzU3lzdGVtUmVhZHkocmVxdWlyZXNTeXN0ZW1SZWFkeSksIG1EYXRhKE5VTEwpIHt9CiAgICAgfTsKIAogICAgIGNsYXNzIElvQ29uZmlnRXZlbnREYXRhIDogcHVibGljIENvbmZpZ0V2ZW50RGF0YSB7CiAgICAgcHVibGljOgotICAgICAgICBJb0NvbmZpZ0V2ZW50RGF0YShpbnQgZXZlbnQsIGludCBwYXJhbSkgOgotICAgICAgICAgICAgbUV2ZW50KGV2ZW50KSwgbVBhcmFtKHBhcmFtKSB7fQorICAgICAgICBJb0NvbmZpZ0V2ZW50RGF0YShhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCkgOgorICAgICAgICAgICAgbUV2ZW50KGV2ZW50KSwgbVBpZChwaWQpIHt9CiAKICAgICAgICAgdmlydHVhbCAgdm9pZCBkdW1wKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIklPIGV2ZW50OiBldmVudCAlZCwgcGFyYW0gJWRcbiIsIG1FdmVudCwgbVBhcmFtKTsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIklPIGV2ZW50OiBldmVudCAlZFxuIiwgbUV2ZW50KTsKICAgICAgICAgfQogCi0gICAgICAgIGNvbnN0IGludCBtRXZlbnQ7Ci0gICAgICAgIGNvbnN0IGludCBtUGFyYW07CisgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBtRXZlbnQ7CisgICAgICAgIGNvbnN0IHBpZF90ICAgICAgICAgICAgICAgICBtUGlkOwogICAgIH07CiAKICAgICBjbGFzcyBJb0NvbmZpZ0V2ZW50IDogcHVibGljIENvbmZpZ0V2ZW50IHsKICAgICBwdWJsaWM6Ci0gICAgICAgIElvQ29uZmlnRXZlbnQoaW50IGV2ZW50LCBpbnQgcGFyYW0pIDoKKyAgICAgICAgSW9Db25maWdFdmVudChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCkgOgogICAgICAgICAgICAgQ29uZmlnRXZlbnQoQ0ZHX0VWRU5UX0lPKSB7Ci0gICAgICAgICAgICBtRGF0YSA9IG5ldyBJb0NvbmZpZ0V2ZW50RGF0YShldmVudCwgcGFyYW0pOworICAgICAgICAgICAgbURhdGEgPSBuZXcgSW9Db25maWdFdmVudERhdGEoZXZlbnQsIHBpZCk7CiAgICAgICAgIH0KICAgICAgICAgdmlydHVhbCB+SW9Db25maWdFdmVudCgpIHt9CiAgICAgfTsKQEAgLTEzNSw3ICsxNDEsNyBAQAogICAgIGNsYXNzIFByaW9Db25maWdFdmVudCA6IHB1YmxpYyBDb25maWdFdmVudCB7CiAgICAgcHVibGljOgogICAgICAgICBQcmlvQ29uZmlnRXZlbnQocGlkX3QgcGlkLCBwaWRfdCB0aWQsIGludDMyX3QgcHJpbykgOgotICAgICAgICAgICAgQ29uZmlnRXZlbnQoQ0ZHX0VWRU5UX1BSSU8pIHsKKyAgICAgICAgICAgIENvbmZpZ0V2ZW50KENGR19FVkVOVF9QUklPLCB0cnVlKSB7CiAgICAgICAgICAgICBtRGF0YSA9IG5ldyBQcmlvQ29uZmlnRXZlbnREYXRhKHBpZCwgdGlkLCBwcmlvKTsKICAgICAgICAgfQogICAgICAgICB2aXJ0dWFsIH5QcmlvQ29uZmlnRXZlbnQoKSB7fQpAQCAtMjUwLDEzICsyNTYsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKSA9IDA7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKICAgICB2aXJ0dWFsICAgICBTdHJpbmc4ICAgICBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpID0gMDsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKSA9IDA7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkID0gMCkgPSAwOwogICAgICAgICAgICAgICAgIC8vIHNlbmRDb25maWdFdmVudF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiAgICAgICAgICAgICAgICAgLy8gQ2FuIHRlbXBvcmFyaWx5IHJlbGVhc2UgdGhlIGxvY2sgaWYgd2FpdGluZyBmb3IgYSByZXBseSBmcm9tCiAgICAgICAgICAgICAgICAgLy8gcHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCkuCiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VuZENvbmZpZ0V2ZW50X2woc3A8Q29uZmlnRXZlbnQ+JiBldmVudCk7Ci0gICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZElvQ29uZmlnRXZlbnQoaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKTsKLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKGludCBldmVudCwgaW50IHBhcmFtID0gMCk7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZElvQ29uZmlnRXZlbnQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwKTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkID0gMCk7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChwaWRfdCBwaWQsIHBpZF90IHRpZCwgaW50MzJfdCBwcmlvKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50X2wocGlkX3QgcGlkLCBwaWRfdCB0aWQsIGludDMyX3QgcHJpbyk7CiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VuZFNldFBhcmFtZXRlckNvbmZpZ0V2ZW50X2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlyKTsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZW5kQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCkBAIC0zNTgsNiArMzY1LDggQEAKIAogICAgICAgICAgICAgICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gcGlwZU1lbW9yeSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KIAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBzeXN0ZW1SZWFkeSgpOworCiAgICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgbUxvY2s7CiAKIHByb3RlY3RlZDoKQEAgLTQwOCw2ICs0MTcsNyBAQAogICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICAgIG1DaGFubmVsTWFzazsKICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50OwogICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZVNpemU7CisgICAgICAgICAgICAgICAgLy8gbm90IEhBTCBmcmFtZSBzaXplLCB0aGlzIGlzIGZvciBvdXRwdXQgc2luayAodG8gcGlwZSB0byBmYXN0IG1peGVyKQogICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgIG1Gb3JtYXQ7ICAgICAgICAgICAvLyBTb3VyY2UgZm9ybWF0IGZvciBSZWNvcmRpbmcgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmsgZm9ybWF0IGZvciBQbGF5YmFjay4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luayBmb3JtYXQgbWF5IGJlIGRpZmZlcmVudCB0aGFuCkBAIC00MTYsNiArNDI2LDcgQEAKICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZTsgICAgICAgLy8gSEFMIGJ1ZmZlciBzaXplIGZvciByZWFkKCkgb3Igd3JpdGUoKQogCiAgICAgICAgICAgICAgICAgVmVjdG9yPCBzcDxDb25maWdFdmVudD4gPiAgICAgbUNvbmZpZ0V2ZW50czsKKyAgICAgICAgICAgICAgICBWZWN0b3I8IHNwPENvbmZpZ0V2ZW50PiA+ICAgICBtUGVuZGluZ0NvbmZpZ0V2ZW50czsgLy8gZXZlbnRzIGF3YWl0aW5nIHN5c3RlbSByZWFkeQogCiAgICAgICAgICAgICAgICAgLy8gVGhlc2UgZmllbGRzIGFyZSB3cml0dGVuIGFuZCByZWFkIGJ5IHRocmVhZCBpdHNlbGYgd2l0aG91dCBsb2NrIG9yIGJhcnJpZXIsCiAgICAgICAgICAgICAgICAgLy8gYW5kIHJlYWQgYnkgb3RoZXIgdGhyZWFkcyB3aXRob3V0IGxvY2sgb3IgYmFycmllciB2aWEgc3RhbmRieSgpLCBvdXREZXZpY2UoKQpAQCAtNDI2LDEzICs0MzcsMTYgQEAKICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICBtU3RhbmRieTsgICAgIC8vIFdoZXRoZXIgdGhyZWFkIGlzIGN1cnJlbnRseSBpbiBzdGFuZGJ5LgogICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgIG1PdXREZXZpY2U7ICAgLy8gb3V0cHV0IGRldmljZQogICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgIG1JbkRldmljZTsgICAgLy8gaW5wdXQgZGV2aWNlCi0gICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgICAgICAgICAgbUF1ZGlvU291cmNlOyAvLyAoc2VlIGF1ZGlvLmgsIGF1ZGlvX3NvdXJjZV90KQorICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgIG1QcmV2T3V0RGV2aWNlOyAgIC8vIHByZXZpb3VzIG91dHB1dCBkZXZpY2UKKyAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICBtUHJldkluRGV2aWNlOyAgICAvLyBwcmV2aW91cyBpbnB1dCBkZXZpY2UKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggICAgICBtUGF0Y2g7CisgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgICAgICAgICAgbUF1ZGlvU291cmNlOwogCiAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgbUlkOwogICAgICAgICAgICAgICAgIFZlY3Rvcjwgc3A8RWZmZWN0Q2hhaW4+ID4gbUVmZmVjdENoYWluczsKIAotICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgICAgICAgIGtOYW1lTGVuZ3RoID0gMTY7ICAgLy8gcHJjdGwoUFJfU0VUX05BTUUpIGxpbWl0Ci0gICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgbU5hbWVba05hbWVMZW5ndGhdOworICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgICAgICAgIGtUaHJlYWROYW1lTGVuZ3RoID0gMTY7IC8vIHByY3RsKFBSX1NFVF9OQU1FKSBsaW1pdAorICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICAgIG1UaHJlYWROYW1lW2tUaHJlYWROYW1lTGVuZ3RoXTsgLy8gZ3VhcmFudGVlZCBOVUwtdGVybWluYXRlZAogICAgICAgICAgICAgICAgIHNwPElQb3dlck1hbmFnZXI+ICAgICAgIG1Qb3dlck1hbmFnZXI7CiAgICAgICAgICAgICAgICAgc3A8SUJpbmRlcj4gICAgICAgICAgICAgbVdha2VMb2NrVG9rZW47CiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8UE1EZWF0aFJlY2lwaWVudD4gbURlYXRoUmVjaXBpZW50OwpAQCAtNDQyLDYgKzQ1Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1c3BlbmRlZFNlc3Npb25zOwogICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3QgICAgIGtMb2dTaXplID0gNCAqIDEwMjQ7CiAgICAgICAgICAgICAgICAgc3A8TkJMb2c6OldyaXRlcj4gICAgICAgbU5CTG9nV3JpdGVyOworICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1SZWFkeTsKIH07CiAKIC8vIC0tLSBQbGF5YmFja1RocmVhZCAtLS0KQEAgLTQ2Nyw3ICs0ODIsNyBAQAogICAgIHN0YXRpYyBjb25zdCBpbnQ4X3Qga01heFRyYWNrUmV0cmllc09mZmxvYWQgPSAyMDsKIAogICAgIFBsYXliYWNrVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgdHlwZV90IHR5cGUpOworICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCB0eXBlX3QgdHlwZSwgYm9vbCBzeXN0ZW1SZWFkeSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+UGxheWJhY2tUaHJlYWQoKTsKIAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKQEAgLTU1OSw3ICs1NzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJm1TdXNwZW5kZWQpID4gMDsgfQogCiAgICAgdmlydHVhbCAgICAgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKTsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwKTsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqaGFsRnJhbWVzLCB1aW50MzJfdCAqZHNwRnJhbWVzKTsKICAgICAgICAgICAgICAgICAvLyBGSVhNRSByZW5hbWUgbWl4QnVmZmVyKCkgdG8gc2lua0J1ZmZlcigpIGFuZCByZW1vdmUgaW50MTZfdCogZGVwZW5kZW5jeS4KICAgICAgICAgICAgICAgICAvLyBDb25zaWRlciBhbHNvIHJlbW92aW5nIGFuZCBwYXNzaW5nIGFuIGV4cGxpY2l0IG1NYWluQnVmZmVyIGluaXRpYWxpemF0aW9uCkBAIC02MDEsNiArNjE2LDExIEBACiAgICAgLy8gdXBkYXRlZCBieSByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCkKICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50OyAgLy8gbm9ybWFsIG1peGVyIGFuZCBlZmZlY3RzCiAKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWRUaHJvdHRsZTsgICAgIC8vIHRocm90dGxlIHRoZSB0aHJlYWQgcHJvY2Vzc2luZworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZFRocm90dGxlVGltZU1zOyAvLyB0aHJvdHRsZSB0aW1lIGZvciBNSVhFUiB0aHJlYWRzCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkVGhyb3R0bGVFbmRNczsgIC8vIG5vdGlmeSBvbmNlIHBlciB0aHJvdHRsaW5nCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBtSGFsZkJ1ZmZlck1zOyAgICAgICAvLyBoYWxmIHRoZSBidWZmZXIgc2l6ZSBpbiBtaWxsaXNlY29uZHMKKwogICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNpbmtCdWZmZXI7ICAgICAgICAgLy8gZnJhbWUgc2l6ZSBhbGlnbmVkIHNpbmsgYnVmZmVyCiAKICAgICAvLyBUT0RPOgpAQCAtNzEyLDggKzczMiw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHJlbGVhc2VBdWRpb1BhdGNoX2woY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKIAotICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIHVzZXNId0F2U3luYygpIGNvbnN0IHsgcmV0dXJuIChtVHlwZSA9PSBESVJFQ1QpICYmIChtT3V0cHV0ICE9IE5VTEwpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobU91dHB1dC0+ZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKTsgfQorICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIHVzZXNId0F2U3luYygpIGNvbnN0IHsgcmV0dXJuIChtVHlwZSA9PSBESVJFQ1QpICYmIChtT3V0cHV0ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtSHdTdXBwb3J0c1BhdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAobU91dHB1dC0+ZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKTsgfQogCiBwcml2YXRlOgogCkBAIC03NDIsMTQgKzc2MywxNCBAQAogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluV3JpdGU7CiAKICAgICAvLyBGSVhNRSByZW5hbWUgdGhlc2UgZm9ybWVyIGxvY2FsIHZhcmlhYmxlcyBvZiB0aHJlYWRMb29wIHRvIHN0YW5kYXJkICJtIiBuYW1lcwotICAgIG5zZWNzX3QgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRieVRpbWU7CisgICAgbnNlY3NfdCAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhbmRieVRpbWVOczsKICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1TaW5rQnVmZmVyU2l6ZTsKIAogICAgIC8vIGNhY2hlZCBjb3BpZXMgb2YgYWN0aXZlU2xlZXBUaW1lVXMoKSBhbmQgaWRsZVNsZWVwVGltZVVzKCkgbWFkZSBieSBjYWNoZVBhcmFtZXRlcnNfbCgpCi0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVTbGVlcFRpbWU7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBpZGxlU2xlZXBUaW1lOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVNsZWVwVGltZVVzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgbUlkbGVTbGVlcFRpbWVVczsKIAotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXBUaW1lOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgbVNsZWVwVGltZVVzOwogCiAgICAgLy8gbWl4ZXIgc3RhdHVzIHJldHVybmVkIGJ5IHByZXBhcmVUcmFja3NfbCgpCiAgICAgbWl4ZXJfc3RhdGUgICAgICAgICAgICAgICAgICAgICBtTWl4ZXJTdGF0dXM7IC8vIGN1cnJlbnQgY3ljbGUKQEAgLTc2Miw3ICs3ODMsNyBAQAogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXBUaW1lU2hpZnQ7CiAKICAgICAvLyBzYW1lIGFzIEF1ZGlvRmxpbmdlcjo6bVN0YW5kYnlUaW1lSW5Oc2VjcyBleGNlcHQgZm9yIERJUkVDVCB3aGljaCB1c2VzIGEgc2hvcnRlciB2YWx1ZQotICAgIG5zZWNzX3QgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRieURlbGF5OworICAgIG5zZWNzX3QgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YW5kYnlEZWxheU5zOwogCiAgICAgLy8gTUlYRVIgb25seQogICAgIG5zZWNzX3QgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UGVyaW9kOwpAQCAtODM4LDYgKzg1OSw3IEBACiAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwKICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwKICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgIGJvb2wgc3lzdGVtUmVhZHksCiAgICAgICAgICAgICAgICAgdHlwZV90IHR5cGUgPSBNSVhFUik7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+TWl4ZXJUaHJlYWQoKTsKIApAQCAtODY0LDYgKzg4NiwxMCBAQAogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRocmVhZExvb3BfcmVtb3ZlVHJhY2tzKGNvbnN0IFZlY3Rvcjwgc3A8VHJhY2s+ID4mIHRyYWNrc1RvUmVtb3ZlKTsKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBjb3JyZWN0TGF0ZW5jeV9sKHVpbnQzMl90IGxhdGVuY3kpIGNvbnN0OwogCisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgY3JlYXRlQXVkaW9QYXRjaF9sKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOworICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHJlbGVhc2VBdWRpb1BhdGNoX2woY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKwogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXIqIG1BdWRpb01peGVyOyAgICAvLyBub3JtYWwgbWl4ZXIKIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgLy8gb25lLXRpbWUgaW5pdGlhbGl6YXRpb24sIG5vIGxvY2tzIHJlcXVpcmVkCkBAIC04OTUsNyArOTIxLDcgQEAKIHB1YmxpYzoKIAogICAgIERpcmVjdE91dHB1dFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGJvb2wgc3lzdGVtUmVhZHkpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5EaXJlY3RPdXRwdXRUaHJlYWQoKTsKIAogICAgIC8vIFRocmVhZCB2aXJ0dWFscwpAQCAtOTIwLDE2ICs5NDYsMjIgQEAKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0aHJlYWRMb29wX2V4aXQoKTsKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBzaG91bGRTdGFuZGJ5X2woKTsKIAorICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIG9uQWRkTmV3VHJhY2tfbCgpOworCiAgICAgLy8gdm9sdW1lcyBsYXN0IHNlbnQgdG8gYXVkaW8gSEFMIHdpdGggc3RyZWFtLT5zZXRfdm9sdW1lKCkKICAgICBmbG9hdCBtTGVmdFZvbEZsb2F0OwogICAgIGZsb2F0IG1SaWdodFZvbEZsb2F0OwogCiAgICAgRGlyZWN0T3V0cHV0VGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCB1aW50MzJfdCBkZXZpY2UsIFRocmVhZEJhc2U6OnR5cGVfdCB0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCB1aW50MzJfdCBkZXZpY2UsIFRocmVhZEJhc2U6OnR5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzeXN0ZW1SZWFkeSk7CiAgICAgdm9pZCBwcm9jZXNzVm9sdW1lX2woVHJhY2sgKnRyYWNrLCBib29sIGxhc3RUcmFjayk7CiAKICAgICAvLyBwcmVwYXJlVHJhY2tzX2woKSB0ZWxscyB0aHJlYWRMb29wX21peCgpIHRoZSBuYW1lIG9mIHRoZSBzaW5nbGUgYWN0aXZlIHRyYWNrCiAgICAgc3A8VHJhY2s+ICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrOworCisgICAgd3A8VHJhY2s+ICAgICAgICAgICAgICAgbVByZXZpb3VzVHJhY2s7ICAgICAgICAgLy8gdXNlZCB0byBkZXRlY3QgdHJhY2sgc3dpdGNoCisKIHB1YmxpYzoKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBoYXNGYXN0TWl4ZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogfTsKQEAgLTkzOCw3ICs5NzAsNyBAQAogcHVibGljOgogCiAgICAgT2ZmbG9hZFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgdWludDMyX3QgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCB1aW50MzJfdCBkZXZpY2UsIGJvb2wgc3lzdGVtUmVhZHkpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5PZmZsb2FkVGhyZWFkKCkge307CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZmx1c2hId19sKCk7CiAKQEAgLTk0OSwxMiArOTgxLDEwIEBACiAKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICB3YWl0aW5nQXN5bmNDYWxsYmFjaygpOwogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHdhaXRpbmdBc3luY0NhbGxiYWNrX2woKTsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBvbkFkZE5ld1RyYWNrX2woKTsKIAogcHJpdmF0ZToKICAgICBzaXplX3QgICAgICBtUGF1c2VkV3JpdGVMZW5ndGg7ICAgICAvLyBsZW5ndGggaW4gYnl0ZXMgb2Ygd3JpdGUgaW50ZXJydXB0ZWQgYnkgcGF1c2UKICAgICBzaXplX3QgICAgICBtUGF1c2VkQnl0ZXNSZW1haW5pbmc7ICAvLyBieXRlcyBzdGlsbCB3YWl0aW5nIGluIG1peGJ1ZmZlciBhZnRlciByZXN1bWUKLSAgICB3cDxUcmFjaz4gICBtUHJldmlvdXNUcmFjazsgICAgICAgICAvLyB1c2VkIHRvIGRldGVjdCB0cmFjayBzd2l0Y2gKIH07CiAKIGNsYXNzIEFzeW5jQ2FsbGJhY2tUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKQEAgLTk5Myw3ICsxMDIzLDcgQEAKIGNsYXNzIER1cGxpY2F0aW5nVGhyZWFkIDogcHVibGljIE1peGVyVGhyZWFkIHsKIHB1YmxpYzoKICAgICBEdXBsaWNhdGluZ1RocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIE1peGVyVGhyZWFkKiBtYWluVGhyZWFkLAotICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgYm9vbCBzeXN0ZW1SZWFkeSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfkR1cGxpY2F0aW5nVGhyZWFkKCk7CiAKICAgICAvLyBUaHJlYWQgdmlydHVhbHMKQEAgLTEwMzUsMTcgKzEwNjUsMTMyIEBACiBwdWJsaWM6CiAKICAgICBjbGFzcyBSZWNvcmRUcmFjazsKKworICAgIC8qIFRoZSBSZXNhbXBsZXJCdWZmZXJQcm92aWRlciBpcyB1c2VkIHRvIHJldHJpZXZlIHJlY29yZGVkIGlucHV0IGRhdGEgZnJvbSB0aGUKKyAgICAgKiBSZWNvcmRUaHJlYWQuICBJdCBtYWludGFpbnMgbG9jYWwgc3RhdGUgb24gdGhlIHJlbGF0aXZlIHBvc2l0aW9uIG9mIHRoZSByZWFkCisgICAgICogcG9zaXRpb24gb2YgdGhlIFJlY29yZFRyYWNrIGNvbXBhcmVkIHdpdGggdGhlIFJlY29yZFRocmVhZC4KKyAgICAgKi8KICAgICBjbGFzcyBSZXNhbXBsZXJCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBBdWRpb0J1ZmZlclByb3ZpZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXJpdmVzIGZyb20gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UgZm9yIHVzZSBieSByZXNhbXBsZXIKICAgICB7CiAgICAgcHVibGljOgotICAgICAgICBSZXNhbXBsZXJCdWZmZXJQcm92aWRlcihSZWNvcmRUcmFjayogcmVjb3JkVHJhY2spIDogbVJlY29yZFRyYWNrKHJlY29yZFRyYWNrKSB7IH0KKyAgICAgICAgUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIoUmVjb3JkVHJhY2sqIHJlY29yZFRyYWNrKSA6CisgICAgICAgICAgICBtUmVjb3JkVHJhY2socmVjb3JkVHJhY2spLAorICAgICAgICAgICAgbVJzbXBJblVucmVsKDApLCBtUnNtcEluRnJvbnQoMCkgeyB9CiAgICAgICAgIHZpcnR1YWwgflJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyKCkgeyB9CisKKyAgICAgICAgLy8gY2FsbGVkIHRvIHNldCB0aGUgUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIgdG8gaGVhZCBvZiB0aGUgUmVjb3JkVGhyZWFkIGRhdGEgYnVmZmVyLAorICAgICAgICAvLyBza2lwcGluZyBhbnkgcHJldmlvdXMgZGF0YSByZWFkIGZyb20gdGhlIGhhbC4KKyAgICAgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CisKKyAgICAgICAgLyogU3luY2hyb25pemVzIFJlY29yZFRyYWNrIHBvc2l0aW9uIHdpdGggdGhlIFJlY29yZFRocmVhZC4KKyAgICAgICAgICogQ2FsY3VsYXRlcyBhdmFpbGFibGUgZnJhbWVzIGFuZCBoYW5kbGUgb3ZlcnJ1bnMgaWYgdGhlIFJlY29yZFRocmVhZAorICAgICAgICAgKiBoYXMgYWR2YW5jZWQgZmFzdGVyIHRoYW4gdGhlIFJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyIGhhcyByZXRyaWV2ZWQgZGF0YS4KKyAgICAgICAgICogVE9ETzogd2h5IG5vdCBkbyB0aGlzIGZvciBldmVyeSBnZXROZXh0QnVmZmVyPworICAgICAgICAgKgorICAgICAgICAgKiBQYXJhbWV0ZXJzCisgICAgICAgICAqIGZyYW1lc0F2YWlsYWJsZTogIHBvaW50ZXIgdG8gb3B0aW9uYWwgb3V0cHV0IHNpemVfdCB0byBzdG9yZSByZWNvcmQgdHJhY2sKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgZnJhbWVzIGF2YWlsYWJsZS4KKyAgICAgICAgICogICAgICBoYXNPdmVycnVuOiAgcG9pbnRlciB0byBvcHRpb25hbCBib29sZWFuLCByZXR1cm5zIHRydWUgaWYgdHJhY2sgaGFzIG92ZXJydW4uCisgICAgICAgICAqLworCisgICAgICAgIHZpcnR1YWwgdm9pZCBzeW5jKHNpemVfdCAqZnJhbWVzQXZhaWxhYmxlID0gTlVMTCwgYm9vbCAqaGFzT3ZlcnJ1biA9IE5VTEwpOworCiAgICAgICAgIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpOwogICAgIHByaXZhdGU6CiAgICAgICAgIFJlY29yZFRyYWNrICogY29uc3QgbVJlY29yZFRyYWNrOworICAgICAgICBzaXplX3QgICAgICAgICAgICAgIG1Sc21wSW5VbnJlbDsgICAvLyB1bnJlbGVhc2VkIGZyYW1lcyByZW1haW5pbmcgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3N0IHJlY2VudCBnZXROZXh0QnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBkZWJ1ZyBvbmx5CisgICAgICAgIGludDMyX3QgICAgICAgICAgICAgbVJzbXBJbkZyb250OyAgIC8vIG5leHQgYXZhaWxhYmxlIGZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJvbGxpbmcgY291bnRlciB0aGF0IGlzIG5ldmVyIGNsZWFyZWQKKyAgICB9OworCisgICAgLyogVGhlIFJlY29yZEJ1ZmZlckNvbnZlcnRlciBpcyB1c2VkIGZvciBmb3JtYXQsIGNoYW5uZWwsIGFuZCBzYW1wbGUgcmF0ZQorICAgICAqIGNvbnZlcnNpb24gZm9yIGEgUmVjb3JkVHJhY2suCisgICAgICoKKyAgICAgKiBUT0RPOiBTZWxmIGNvbnRhaW5lZCwgc28gbW92ZSB0byBhIHNlcGFyYXRlIGZpbGUgbGF0ZXIuCisgICAgICoKKyAgICAgKiBSZWNvcmRCdWZmZXJDb252ZXJ0ZXIgdXNlcyB0aGUgY29udmVydCgpIG1ldGhvZCByYXRoZXIgdGhhbiBleHBvc2luZyBhCisgICAgICogYnVmZmVyIHByb3ZpZGVyIGludGVyZmFjZTsgdGhpcyBpcyB0byBzYXZlIGEgbWVtb3J5IGNvcHkuCisgICAgICovCisgICAgY2xhc3MgUmVjb3JkQnVmZmVyQ29udmVydGVyCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgUmVjb3JkQnVmZmVyQ29udmVydGVyKAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IHNyY0NoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBzcmNGb3JtYXQsCisgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBkc3RDaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZHN0Rm9ybWF0LAorICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzdFNhbXBsZVJhdGUpOworCisgICAgICAgIH5SZWNvcmRCdWZmZXJDb252ZXJ0ZXIoKTsKKworICAgICAgICAvKiBDb252ZXJ0cyBpbnB1dCBkYXRhIGZyb20gYW4gQXVkaW9CdWZmZXJQcm92aWRlciBieSBmb3JtYXQsIGNoYW5uZWxNYXNrLAorICAgICAgICAgKiBhbmQgc2FtcGxlUmF0ZSB0byBhIGRlc3RpbmF0aW9uIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogUGFyYW1ldGVycworICAgICAgICAgKiAgICAgIGRzdDogIGJ1ZmZlciB0byBwbGFjZSB0aGUgY29udmVydGVkIGRhdGEuCisgICAgICAgICAqIHByb3ZpZGVyOiAgYnVmZmVyIHByb3ZpZGVyIHRvIG9idGFpbiBzb3VyY2UgZGF0YS4KKyAgICAgICAgICogICBmcmFtZXM6ICBudW1iZXIgb2YgZnJhbWVzIHRvIGNvbnZlcnQKKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBjb252ZXJ0ZWQuCisgICAgICAgICAqLworICAgICAgICBzaXplX3QgY29udmVydCh2b2lkICpkc3QsIEF1ZGlvQnVmZmVyUHJvdmlkZXIgKnByb3ZpZGVyLCBzaXplX3QgZnJhbWVzKTsKKworICAgICAgICAvLyByZXR1cm5zIE5PX0VSUk9SIGlmIGNvbnN0cnVjdG9yIHdhcyBzdWNjZXNzZnVsCisgICAgICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0IHsKKyAgICAgICAgICAgIC8vIG1TcmNDaGFubmVsTWFzayBzZXQgb24gc3VjY2Vzc2Z1bCB1cGRhdGVQYXJhbWV0ZXJzCisgICAgICAgICAgICByZXR1cm4gbVNyY0NoYW5uZWxNYXNrICE9IEFVRElPX0NIQU5ORUxfSU5WQUxJRCA/IE5PX0VSUk9SIDogTk9fSU5JVDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFsbG93cyBkeW5hbWljIHJlY29uZmlndXJlIG9mIGFsbCBwYXJhbWV0ZXJzCisgICAgICAgIHN0YXR1c190IHVwZGF0ZVBhcmFtZXRlcnMoCisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgc3JjQ2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IHNyY0Zvcm1hdCwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNTYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGRzdENoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBkc3RGb3JtYXQsCisgICAgICAgICAgICAgICAgdWludDMyX3QgZHN0U2FtcGxlUmF0ZSk7CisKKyAgICAgICAgLy8gY2FsbGVkIHRvIHJlc2V0IHJlc2FtcGxlciBidWZmZXJzIG9uIHJlY29yZCB0cmFjayBkaXNjb250aW51aXR5CisgICAgICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBpZiAobVJlc2FtcGxlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbVJlc2FtcGxlci0+cmVzZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gZm9ybWF0IGNvbnZlcnNpb24gd2hlbiBub3QgdXNpbmcgcmVzYW1wbGVyCisgICAgICAgIHZvaWQgY29udmVydE5vUmVzYW1wbGVyKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKTsKKworICAgICAgICAvLyBmb3JtYXQgY29udmVyc2lvbiB3aGVuIHVzaW5nIHJlc2FtcGxlcjsgbW9kaWZpZXMgc3JjIGluLXBsYWNlCisgICAgICAgIHZvaWQgY29udmVydFJlc2FtcGxlcih2b2lkICpkc3QsIC8qbm90LWEtY29uc3QqLyB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpOworCisgICAgICAgIC8vIHVzZXIgcHJvdmlkZWQgaW5mb3JtYXRpb24KKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbVNyY0NoYW5uZWxNYXNrOworICAgICAgICBhdWRpb19mb3JtYXRfdCAgICAgICBtU3JjRm9ybWF0OworICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBtU3JjU2FtcGxlUmF0ZTsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbURzdENoYW5uZWxNYXNrOworICAgICAgICBhdWRpb19mb3JtYXRfdCAgICAgICBtRHN0Rm9ybWF0OworICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBtRHN0U2FtcGxlUmF0ZTsKKworICAgICAgICAvLyBkZXJpdmVkIGluZm9ybWF0aW9uCisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1TcmNDaGFubmVsQ291bnQ7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1Ec3RDaGFubmVsQ291bnQ7CisgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgIG1Ec3RGcmFtZVNpemU7CisKKyAgICAgICAgLy8gZm9ybWF0IGNvbnZlcnNpb24gYnVmZmVyCisgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgKm1CdWY7CisgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgIG1CdWZGcmFtZXM7CisgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgIG1CdWZGcmFtZVNpemU7CisKKyAgICAgICAgLy8gcmVzYW1wbGVyIGluZm8KKyAgICAgICAgQXVkaW9SZXNhbXBsZXIgICAgICAqbVJlc2FtcGxlcjsKKworICAgICAgICBib29sICAgICAgICAgICAgICAgICBtSXNMZWdhY3lEb3dubWl4OyAgLy8gbGVnYWN5IHN0ZXJlbyB0byBtb25vIGNvbnZlcnNpb24gbmVlZGVkCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgIG1Jc0xlZ2FjeVVwbWl4OyAgICAvLyBsZWdhY3kgbW9ubyB0byBzdGVyZW8gY29udmVyc2lvbiBuZWVkZWQKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgbVJlcXVpcmVzRmxvYXQ7ICAgIC8vIGRhdGEgcHJvY2Vzc2luZyByZXF1aXJlcyBmbG9hdCAoZS5nLiByZXNhbXBsZXIpCisgICAgICAgIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXIgKm1JbnB1dENvbnZlcnRlclByb3ZpZGVyOyAgICAvLyBjb252ZXJ0cyBpbnB1dCB0byBmbG9hdAorICAgICAgICBpbnQ4X3QgICAgICAgICAgICAgICBtSWR4QXJ5W3NpemVvZih1aW50MzJfdCkgKiA4XTsgLy8gdXNlZCBmb3IgY2hhbm5lbCBtYXNrIGNvbnZlcnNpb24KICAgICB9OwogCiAjaW5jbHVkZSAiUmVjb3JkVHJhY2tzLmgiCkBAIC0xMDU0LDcgKzExOTksOCBAQAogICAgICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbUluICppbnB1dCwKICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZQorICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgc3lzdGVtUmVhZHkKICNpZmRlZiBURUVfU0lOSwogICAgICAgICAgICAgICAgICAgICAsIGNvbnN0IHNwPE5CQUlPX1Npbms+JiB0ZWVTaW5rCiAjZW5kaWYKQEAgLTExMTAsNyArMTI1Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgY2FjaGVQYXJhbWV0ZXJzX2woKSB7fQogICAgIHZpcnR1YWwgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGludCBwYXJhbSA9IDApOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkID0gMCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBjcmVhdGVBdWRpb1BhdGNoX2woY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHJlbGVhc2VBdWRpb1BhdGNoX2woY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKQEAgLTExNTYsNyArMTMwMiw3IEBACiAgICAgICAgICAgICBDb25kaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRTdG9wQ29uZDsKIAogICAgICAgICAgICAgLy8gcmVzYW1wbGVyIGNvbnZlcnRzIGlucHV0IGF0IEhBTCBIeiB0byBvdXRwdXQgYXQgQXVkaW9SZWNvcmQgY2xpZW50IEh6Ci0gICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbVJzbXBJbkJ1ZmZlcjsgLy8gc2VlIG5ld1tdIGZvciBkZXRhaWxzIG9uIHRoZSBzaXplCisgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptUnNtcEluQnVmZmVyOyAvLwogICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJbkZyYW1lczsgIC8vIHNpemUgb2YgcmVzYW1wbGVyIGlucHV0IGluIGZyYW1lcwogICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJbkZyYW1lc1AyOy8vIHNpemUgcm91bmRlZCB1cCB0byBhIHBvd2VyLW9mLTIKIApAQCAtMTE2OSw3ICsxMzE1LDkgQEAKICAgICAgICAgICAgIGNvbnN0IHNwPE1lbW9yeURlYWxlcj4gICAgICAgICAgICAgIG1SZWFkT25seUhlYXA7CiAKICAgICAgICAgICAgIC8vIG9uZS10aW1lIGluaXRpYWxpemF0aW9uLCBubyBsb2NrcyByZXF1aXJlZAotICAgICAgICAgICAgc3A8RmFzdENhcHR1cmU+ICAgICAgICAgICAgICAgICAgICAgbUZhc3RDYXB0dXJlOyAgIC8vIG5vbi0wIGlmIHRoZXJlIGlzIGFsc28gYSBmYXN0IGNhcHR1cmUKKyAgICAgICAgICAgIHNwPEZhc3RDYXB0dXJlPiAgICAgICAgICAgICAgICAgICAgIG1GYXN0Q2FwdHVyZTsgICAvLyBub24tMCBpZiB0aGVyZSBpcyBhbHNvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBmYXN0IGNhcHR1cmUKKwogICAgICAgICAgICAgLy8gRklYTUUgYXVkaW8gd2F0Y2hkb2cgdGhyZWFkCiAKICAgICAgICAgICAgIC8vIGNvbnRlbnRzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSBjb25zaXN0ZW50LCBubyBsb2NrcyByZXF1aXJlZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcAppbmRleCBlOTcwMDM2Li5mN2RhMjA5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcApAQCAtMjAsNiArMjAsNyBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC00MDMsMTAgKzQwNCw3IEBACiAgICAgbUlzSW52YWxpZChmYWxzZSksCiAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eShOVUxMKSwKICAgICBtUmVzdW1lVG9TdG9wcGluZyhmYWxzZSksCi0gICAgbUZsdXNoSHdQZW5kaW5nKGZhbHNlKSwKLSAgICBtUHJldmlvdXNWYWxpZChmYWxzZSksCi0gICAgbVByZXZpb3VzRnJhbWVzV3JpdHRlbigwKQotICAgIC8vIG1QcmV2aW91c1RpbWVzdGFtcAorICAgIG1GbHVzaEh3UGVuZGluZyhmYWxzZSkKIHsKICAgICAvLyBjbGllbnQgPT0gMCBpbXBsaWVzIHNoYXJlZEJ1ZmZlciA9PSAwCiAgICAgQUxPR19BU1NFUlQoIShjbGllbnQgPT0gMCAmJiBzaGFyZWRCdWZmZXIgIT0gMCkpOwpAQCAtNDQzLDggKzQ0MSw2IEBACiAgICAgICAgIC8vICAgICAgIHRoaXMgbWVhbnMgd2UgYXJlIHBvdGVudGlhbGx5IGRlbnlpbmcgb3RoZXIgbW9yZSBpbXBvcnRhbnQgZmFzdCB0cmFja3MgZnJvbQogICAgICAgICAvLyAgICAgICBiZWluZyBjcmVhdGVkLiAgSXQgd291bGQgYmUgYmV0dGVyIHRvIGFsbG9jYXRlIHRoZSBpbmRleCBkeW5hbWljYWxseS4KICAgICAgICAgbUZhc3RJbmRleCA9IGk7Ci0gICAgICAgIC8vIFJlYWQgdGhlIGluaXRpYWwgdW5kZXJydW5zIGJlY2F1c2UgdGhpcyBmaWVsZCBpcyBuZXZlciBjbGVhcmVkIGJ5IHRoZSBmYXN0IG1peGVyCi0gICAgICAgIG1PYnNlcnZlZFVuZGVycnVucyA9IHRocmVhZC0+Z2V0RmFzdFRyYWNrVW5kZXJydW5zKGkpOwogICAgICAgICB0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbE1hc2sgJj0gfigxIDw8IGkpOwogICAgIH0KIH0KQEAgLTY5Myw2ICs2ODksMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKKyAgICAgICAgaWYgKGlzRmFzdFRyYWNrKCkpIHsKKyAgICAgICAgICAgIC8vIHJlZnJlc2ggZmFzdCB0cmFjayB1bmRlcnJ1bnMgb24gc3RhcnQgYmVjYXVzZSB0aGF0IGZpZWxkIGlzIG5ldmVyIGNsZWFyZWQKKyAgICAgICAgICAgIC8vIGJ5IHRoZSBmYXN0IG1peGVyOyBmdXJ0aGVybW9yZSwgdGhlIHNhbWUgdHJhY2sgY2FuIGJlIHJlY3ljbGVkLCBpLmUuIHN0YXJ0CisgICAgICAgICAgICAvLyBhZnRlciBzdG9wLgorICAgICAgICAgICAgbU9ic2VydmVkVW5kZXJydW5zID0gcGxheWJhY2tUaHJlYWQtPmdldEZhc3RUcmFja1VuZGVycnVucyhtRmFzdEluZGV4KTsKKyAgICAgICAgfQogICAgICAgICBzdGF0dXMgPSBwbGF5YmFja1RocmVhZC0+YWRkVHJhY2tfbCh0aGlzKTsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBJTlZBTElEX09QRVJBVElPTiB8fCBzdGF0dXMgPT0gUEVSTUlTU0lPTl9ERU5JRUQpIHsKICAgICAgICAgICAgIHRyaWdnZXJFdmVudHMoQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfUFJFU0VOVEFUSU9OX0NPTVBMRVRFKTsKQEAgLTc0Miw2ICs3NDQsNyBAQAogICAgICAgICAgICAgICAgIC8vIG1vdmUgdG8gU1RPUFBJTkdfMiB3aGVuIGRyYWluIGNvbXBsZXRlcyBhbmQgdGhlbiBTVE9QUEVECiAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RPUFBJTkdfMTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBsYXliYWNrVGhyZWFkLT5icm9hZGNhc3RfbCgpOwogICAgICAgICAgICAgQUxPR1YoIm5vdCBzdG9wcGluZy9zdG9wcGVkID0+IHN0b3BwaW5nL3N0b3BwZWQgKCVkKSBvbiB0aHJlYWQgJXAiLCBtTmFtZSwKICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQpOwogICAgICAgICB9CkBAIC04ODAsMjQgKzg4MywyNyBAQAogewogICAgIC8vIENsaWVudCBzaG91bGQgaW1wbGVtZW50IHRoaXMgdXNpbmcgU1NROyB0aGUgdW5wcmVzZW50ZWQgZnJhbWUgY291bnQgaW4gbGF0Y2ggaXMgaXJyZWxldmFudAogICAgIGlmIChpc0Zhc3RUcmFjaygpKSB7Ci0gICAgICAgIC8vIEZJWE1FIG5vIGxvY2sgaGVsZCB0byBzZXQgbVByZXZpb3VzVmFsaWQgPSBmYWxzZQogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAvLyBGSVhNRSBubyBsb2NrIGhlbGQgdG8gc2V0IG1QcmV2aW91c1ZhbGlkID0gZmFsc2UKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KKwogICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKICAgICBQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQgPSAoUGxheWJhY2tUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CisKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICBpZiAoIWlzT2ZmbG9hZGVkKCkgJiYgIWlzRGlyZWN0KCkpIHsKICAgICAgICAgaWYgKCFwbGF5YmFja1RocmVhZC0+bUxhdGNoUVZhbGlkKSB7Ci0gICAgICAgICAgICBtUHJldmlvdXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9Ci0gICAgICAgIHVpbnQzMl90IHVucHJlc2VudGVkRnJhbWVzID0KLSAgICAgICAgICAgICAgICAoKGludDY0X3QpIHBsYXliYWNrVGhyZWFkLT5tTGF0Y2hRLm1VbnByZXNlbnRlZEZyYW1lcyAqIG1TYW1wbGVSYXRlKSAvCi0gICAgICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQtPm1TYW1wbGVSYXRlOworICAgICAgICAvLyBGSVhNRSBOb3QgYWNjdXJhdGUgdW5kZXIgZHluYW1pYyBjaGFuZ2VzIG9mIHNhbXBsZSByYXRlIGFuZCBzcGVlZC4KKyAgICAgICAgLy8gRG8gbm90IHVzZSB0cmFjaydzIG1TYW1wbGVSYXRlIGFzIGl0IGlzIG5vdCBjdXJyZW50IGZvciBtaXhlciB0cmFja3MuCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRTYW1wbGVSYXRlKCk7CisgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIHBsYXliYWNrUmF0ZSA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFBsYXliYWNrUmF0ZSgpOworICAgICAgICB1aW50MzJfdCB1bnByZXNlbnRlZEZyYW1lcyA9ICgoZG91YmxlKSBwbGF5YmFja1RocmVhZC0+bUxhdGNoUS5tVW5wcmVzZW50ZWRGcmFtZXMgKgorICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUgKiBwbGF5YmFja1JhdGUubVNwZWVkKS8gcGxheWJhY2tUaHJlYWQtPm1TYW1wbGVSYXRlOwogICAgICAgICAvLyBGSVhNRSBTaW5jZSB3ZSdyZSB1c2luZyBhIHJhdyBwb2ludGVyIGFzIHRoZSBrZXksIGl0IGlzIHRoZW9yZXRpY2FsbHkgcG9zc2libGUKICAgICAgICAgLy8gICAgICAgZm9yIGEgYnJhbmQgbmV3IHRyYWNrIHRvIHNoYXJlIHRoZSBzYW1lIGFkZHJlc3MgYXMgYSByZWNlbnRseSBkZXN0cm95ZWQKICAgICAgICAgLy8gICAgICAgdHJhY2ssIGFuZCB0aHVzIGZvciB1cyB0byBnZXQgdGhlIGZyYW1lcyByZWxlYXNlZCBvZiB0aGUgd3JvbmcgdHJhY2suCkBAIC05MDgsMzYgKzkxNCwxNiBAQAogICAgICAgICB1aW50MzJfdCBmcmFtZXNXcml0dGVuID0gaSA+PSAwID8KICAgICAgICAgICAgICAgICBwbGF5YmFja1RocmVhZC0+bUxhdGNoUS5tRnJhbWVzUmVsZWFzZWRbaV0gOgogICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlbGVhc2VkKCk7Ci0gICAgICAgIGJvb2wgY2hlY2tQcmV2aW91c1RpbWVzdGFtcCA9IG1QcmV2aW91c1ZhbGlkICYmIGZyYW1lc1dyaXR0ZW4gPj0gbVByZXZpb3VzRnJhbWVzV3JpdHRlbjsKLSAgICAgICAgaWYgKGZyYW1lc1dyaXR0ZW4gPCB1bnByZXNlbnRlZEZyYW1lcykgewotICAgICAgICAgICAgbVByZXZpb3VzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgaWYgKGZyYW1lc1dyaXR0ZW4gPj0gdW5wcmVzZW50ZWRGcmFtZXMpIHsKKyAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSBmcmFtZXNXcml0dGVuIC0gdW5wcmVzZW50ZWRGcmFtZXM7CisgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWUgPSBwbGF5YmFja1RocmVhZC0+bUxhdGNoUS5tVGltZXN0YW1wLm1UaW1lOworICAgICAgICAgICAgcmVzdWx0ID0gTk9fRVJST1I7CiAgICAgICAgIH0KLSAgICAgICAgbVByZXZpb3VzRnJhbWVzV3JpdHRlbiA9IGZyYW1lc1dyaXR0ZW47Ci0gICAgICAgIHVpbnQzMl90IHBvc2l0aW9uID0gZnJhbWVzV3JpdHRlbiAtIHVucHJlc2VudGVkRnJhbWVzOwotICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgdGltZSA9IHBsYXliYWNrVGhyZWFkLT5tTGF0Y2hRLm1UaW1lc3RhbXAubVRpbWU7Ci0gICAgICAgIGlmIChjaGVja1ByZXZpb3VzVGltZXN0YW1wKSB7Ci0gICAgICAgICAgICBpZiAodGltZS50dl9zZWMgPCBtUHJldmlvdXNUaW1lc3RhbXAubVRpbWUudHZfc2VjIHx8Ci0gICAgICAgICAgICAgICAgICAgICh0aW1lLnR2X3NlYyA9PSBtUHJldmlvdXNUaW1lc3RhbXAubVRpbWUudHZfc2VjICYmCi0gICAgICAgICAgICAgICAgICAgIHRpbWUudHZfbnNlYyA8IG1QcmV2aW91c1RpbWVzdGFtcC5tVGltZS50dl9uc2VjKSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJUaW1lIGlzIGdvaW5nIGJhY2t3YXJkcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gcG9zaXRpb24gY2FuIGJvYmJsZSBzbGlnaHRseSBhcyBhbiBhcnRpZmFjdDsgdGhpcyBoaWRlcyB0aGUgYm9iYmxlCi0gICAgICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUlOSU1VTV9QT1NJVElPTl9ERUxUQSA9IDh1OwotICAgICAgICAgICAgaWYgKChwb3NpdGlvbiA8PSBtUHJldmlvdXNUaW1lc3RhbXAubVBvc2l0aW9uKSB8fAotICAgICAgICAgICAgICAgICAgICAocG9zaXRpb24gLSBtUHJldmlvdXNUaW1lc3RhbXAubVBvc2l0aW9uKSA8IE1JTklNVU1fUE9TSVRJT05fREVMVEEpIHsKLSAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IG1QcmV2aW91c1RpbWVzdGFtcC5tUG9zaXRpb247Ci0gICAgICAgICAgICAgICAgdGltZSA9IG1QcmV2aW91c1RpbWVzdGFtcC5tVGltZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gcG9zaXRpb247Ci0gICAgICAgIHRpbWVzdGFtcC5tVGltZSA9IHRpbWU7Ci0gICAgICAgIG1QcmV2aW91c1RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKLSAgICAgICAgbVByZXZpb3VzVmFsaWQgPSB0cnVlOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfSBlbHNlIHsgLy8gb2ZmbG9hZGVkIG9yIGRpcmVjdAorICAgICAgICByZXN1bHQgPSBwbGF5YmFja1RocmVhZC0+Z2V0VGltZXN0YW1wX2wodGltZXN0YW1wKTsKICAgICB9CiAKLSAgICByZXR1cm4gcGxheWJhY2tUaHJlYWQtPmdldFRpbWVzdGFtcF9sKHRpbWVzdGFtcCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmF0dGFjaEF1eEVmZmVjdChpbnQgRWZmZWN0SWQpCkBAIC0xNzA5LDM2ICsxNjk1LDE4IEBACiAgICAgbUFjdGl2ZSA9IGZhbHNlOwogfQogCi1ib29sIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Ok91dHB1dFRyYWNrOjp3cml0ZShpbnQxNl90KiBkYXRhLCB1aW50MzJfdCBmcmFtZXMpCitib29sIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Ok91dHB1dFRyYWNrOjp3cml0ZSh2b2lkKiBkYXRhLCB1aW50MzJfdCBmcmFtZXMpCiB7CiAgICAgQnVmZmVyICpwSW5CdWZmZXI7CiAgICAgQnVmZmVyIGluQnVmZmVyOwotICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IG1DaGFubmVsQ291bnQ7CiAgICAgYm9vbCBvdXRwdXRCdWZmZXJGdWxsID0gZmFsc2U7CiAgICAgaW5CdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lczsKLSAgICBpbkJ1ZmZlci5pMTYgPSBkYXRhOworICAgIGluQnVmZmVyLnJhdyA9IGRhdGE7CiAKICAgICB1aW50MzJfdCB3YWl0VGltZUxlZnRNcyA9IG1Tb3VyY2VUaHJlYWQtPndhaXRUaW1lTXMoKTsKIAogICAgIGlmICghbUFjdGl2ZSAmJiBmcmFtZXMgIT0gMCkgewotICAgICAgICBzdGFydCgpOwotICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKLSAgICAgICAgaWYgKHRocmVhZCAhPSAwKSB7Ci0gICAgICAgICAgICBNaXhlclRocmVhZCAqbWl4ZXJUaHJlYWQgPSAoTWl4ZXJUaHJlYWQgKil0aHJlYWQuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAobUZyYW1lQ291bnQgPiBmcmFtZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAobUJ1ZmZlclF1ZXVlLnNpemUoKSA8IGtNYXhPdmVyRmxvd0J1ZmZlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RhcnRGcmFtZXMgPSAobUZyYW1lQ291bnQgLSBmcmFtZXMpOwotICAgICAgICAgICAgICAgICAgICBwSW5CdWZmZXIgPSBuZXcgQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICBwSW5CdWZmZXItPm1CdWZmZXIgPSBuZXcgaW50MTZfdFtzdGFydEZyYW1lcyAqIGNoYW5uZWxDb3VudF07Ci0gICAgICAgICAgICAgICAgICAgIHBJbkJ1ZmZlci0+ZnJhbWVDb3VudCA9IHN0YXJ0RnJhbWVzOwotICAgICAgICAgICAgICAgICAgICBwSW5CdWZmZXItPmkxNiA9IHBJbkJ1ZmZlci0+bUJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHBJbkJ1ZmZlci0+cmF3LCAwLCBzdGFydEZyYW1lcyAqIGNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXJRdWV1ZS5hZGQocEluQnVmZmVyKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiT3V0cHV0VHJhY2s6OndyaXRlKCkgJXAgbm8gbW9yZSBidWZmZXJzIGluIHF1ZXVlIiwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgICh2b2lkKSBzdGFydCgpOwogICAgIH0KIAogICAgIHdoaWxlICh3YWl0VGltZUxlZnRNcykgewpAQCAtMTc3MywyMCArMTc0MSwyMCBAQAogCiAgICAgICAgIHVpbnQzMl90IG91dEZyYW1lcyA9IHBJbkJ1ZmZlci0+ZnJhbWVDb3VudCA+IG1PdXRCdWZmZXIuZnJhbWVDb3VudCA/IG1PdXRCdWZmZXIuZnJhbWVDb3VudCA6CiAgICAgICAgICAgICAgICAgcEluQnVmZmVyLT5mcmFtZUNvdW50OwotICAgICAgICBtZW1jcHkobU91dEJ1ZmZlci5yYXcsIHBJbkJ1ZmZlci0+cmF3LCBvdXRGcmFtZXMgKiBjaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICBtZW1jcHkobU91dEJ1ZmZlci5yYXcsIHBJbkJ1ZmZlci0+cmF3LCBvdXRGcmFtZXMgKiBtRnJhbWVTaXplKTsKICAgICAgICAgUHJveHk6OkJ1ZmZlciBidWY7CiAgICAgICAgIGJ1Zi5tRnJhbWVDb3VudCA9IG91dEZyYW1lczsKICAgICAgICAgYnVmLm1SYXcgPSBOVUxMOwogICAgICAgICBtQ2xpZW50UHJveHktPnJlbGVhc2VCdWZmZXIoJmJ1Zik7CiAgICAgICAgIHBJbkJ1ZmZlci0+ZnJhbWVDb3VudCAtPSBvdXRGcmFtZXM7Ci0gICAgICAgIHBJbkJ1ZmZlci0+aTE2ICs9IG91dEZyYW1lcyAqIGNoYW5uZWxDb3VudDsKKyAgICAgICAgcEluQnVmZmVyLT5yYXcgPSAoaW50OF90ICopcEluQnVmZmVyLT5yYXcgKyBvdXRGcmFtZXMgKiBtRnJhbWVTaXplOwogICAgICAgICBtT3V0QnVmZmVyLmZyYW1lQ291bnQgLT0gb3V0RnJhbWVzOwotICAgICAgICBtT3V0QnVmZmVyLmkxNiArPSBvdXRGcmFtZXMgKiBjaGFubmVsQ291bnQ7CisgICAgICAgIG1PdXRCdWZmZXIucmF3ID0gKGludDhfdCAqKW1PdXRCdWZmZXIucmF3ICsgb3V0RnJhbWVzICogbUZyYW1lU2l6ZTsKIAogICAgICAgICBpZiAocEluQnVmZmVyLT5mcmFtZUNvdW50ID09IDApIHsKICAgICAgICAgICAgIGlmIChtQnVmZmVyUXVldWUuc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlclF1ZXVlLnJlbW92ZUF0KDApOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBbXSBwSW5CdWZmZXItPm1CdWZmZXI7CisgICAgICAgICAgICAgICAgZnJlZShwSW5CdWZmZXItPm1CdWZmZXIpOwogICAgICAgICAgICAgICAgIGRlbGV0ZSBwSW5CdWZmZXI7CiAgICAgICAgICAgICAgICAgQUxPR1YoIk91dHB1dFRyYWNrOjp3cml0ZSgpICVwIHRocmVhZCAlcCByZWxlYXNlZCBvdmVyZmxvdyBidWZmZXIgJWQiLCB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZC51bnNhZmVfZ2V0KCksIG1CdWZmZXJRdWV1ZS5zaXplKCkpOwpAQCAtMTgwMiwxMSArMTc3MCwxMCBAQAogICAgICAgICBpZiAodGhyZWFkICE9IDAgJiYgIXRocmVhZC0+c3RhbmRieSgpKSB7CiAgICAgICAgICAgICBpZiAobUJ1ZmZlclF1ZXVlLnNpemUoKSA8IGtNYXhPdmVyRmxvd0J1ZmZlcnMpIHsKICAgICAgICAgICAgICAgICBwSW5CdWZmZXIgPSBuZXcgQnVmZmVyOwotICAgICAgICAgICAgICAgIHBJbkJ1ZmZlci0+bUJ1ZmZlciA9IG5ldyBpbnQxNl90W2luQnVmZmVyLmZyYW1lQ291bnQgKiBjaGFubmVsQ291bnRdOworICAgICAgICAgICAgICAgIHBJbkJ1ZmZlci0+bUJ1ZmZlciA9IG1hbGxvYyhpbkJ1ZmZlci5mcmFtZUNvdW50ICogbUZyYW1lU2l6ZSk7CiAgICAgICAgICAgICAgICAgcEluQnVmZmVyLT5mcmFtZUNvdW50ID0gaW5CdWZmZXIuZnJhbWVDb3VudDsKLSAgICAgICAgICAgICAgICBwSW5CdWZmZXItPmkxNiA9IHBJbkJ1ZmZlci0+bUJ1ZmZlcjsKLSAgICAgICAgICAgICAgICBtZW1jcHkocEluQnVmZmVyLT5yYXcsIGluQnVmZmVyLnJhdywgaW5CdWZmZXIuZnJhbWVDb3VudCAqIGNoYW5uZWxDb3VudCAqCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50MTZfdCkpOworICAgICAgICAgICAgICAgIHBJbkJ1ZmZlci0+cmF3ID0gcEluQnVmZmVyLT5tQnVmZmVyOworICAgICAgICAgICAgICAgIG1lbWNweShwSW5CdWZmZXItPnJhdywgaW5CdWZmZXIucmF3LCBpbkJ1ZmZlci5mcmFtZUNvdW50ICogbUZyYW1lU2l6ZSk7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlclF1ZXVlLmFkZChwSW5CdWZmZXIpOwogICAgICAgICAgICAgICAgIEFMT0dWKCJPdXRwdXRUcmFjazo6d3JpdGUoKSAlcCB0aHJlYWQgJXAgYWRkaW5nIG92ZXJmbG93IGJ1ZmZlciAlZCIsIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkLnVuc2FmZV9nZXQoKSwgbUJ1ZmZlclF1ZXVlLnNpemUoKSk7CkBAIC0xODE3LDIzICsxNzg0LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBDYWxsaW5nIHdyaXRlKCkgd2l0aCBhIDAgbGVuZ3RoIGJ1ZmZlciwgbWVhbnMgdGhhdCBubyBtb3JlIGRhdGEgd2lsbCBiZSB3cml0dGVuOgotICAgIC8vIElmIG5vIG1vcmUgYnVmZmVycyBhcmUgcGVuZGluZywgZmlsbCBvdXRwdXQgdHJhY2sgYnVmZmVyIHRvIG1ha2Ugc3VyZSBpdCBpcyBzdGFydGVkCi0gICAgLy8gYnkgb3V0cHV0IG1peGVyLgotICAgIGlmIChmcmFtZXMgPT0gMCAmJiBtQnVmZmVyUXVldWUuc2l6ZSgpID09IDApIHsKLSAgICAgICAgLy8gRklYTUUgYm9ya2VuLCByZXBsYWNlIGJ5IGdldHRpbmcgZnJhbWVzUmVhZHkoKSBmcm9tIHByb3h5Ci0gICAgICAgIHNpemVfdCB1c2VyID0gMDsgICAgLy8gd2FzIG1DYmxrLT51c2VyCi0gICAgICAgIGlmICh1c2VyIDwgbUZyYW1lQ291bnQpIHsKLSAgICAgICAgICAgIGZyYW1lcyA9IG1GcmFtZUNvdW50IC0gdXNlcjsKLSAgICAgICAgICAgIHBJbkJ1ZmZlciA9IG5ldyBCdWZmZXI7Ci0gICAgICAgICAgICBwSW5CdWZmZXItPm1CdWZmZXIgPSBuZXcgaW50MTZfdFtmcmFtZXMgKiBjaGFubmVsQ291bnRdOwotICAgICAgICAgICAgcEluQnVmZmVyLT5mcmFtZUNvdW50ID0gZnJhbWVzOwotICAgICAgICAgICAgcEluQnVmZmVyLT5pMTYgPSBwSW5CdWZmZXItPm1CdWZmZXI7Ci0gICAgICAgICAgICBtZW1zZXQocEluQnVmZmVyLT5yYXcsIDAsIGZyYW1lcyAqIGNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7Ci0gICAgICAgICAgICBtQnVmZmVyUXVldWUuYWRkKHBJbkJ1ZmZlcik7Ci0gICAgICAgIH0gZWxzZSBpZiAobUFjdGl2ZSkgewotICAgICAgICAgICAgc3RvcCgpOwotICAgICAgICB9CisgICAgLy8gQ2FsbGluZyB3cml0ZSgpIHdpdGggYSAwIGxlbmd0aCBidWZmZXIgbWVhbnMgdGhhdCBubyBtb3JlIGRhdGEgd2lsbCBiZSB3cml0dGVuOgorICAgIC8vIFdlIHJlbHkgb24gc3RvcCgpIHRvIHNldCB0aGUgYXBwcm9wcmlhdGUgZmxhZ3MgdG8gYWxsb3cgdGhlIHJlbWFpbmluZyBmcmFtZXMgdG8gcGxheSBvdXQuCisgICAgaWYgKGZyYW1lcyA9PSAwICYmIG1CdWZmZXJRdWV1ZS5zaXplKCkgPT0gMCAmJiBtQWN0aXZlKSB7CisgICAgICAgIHN0b3AoKTsKICAgICB9CiAKICAgICByZXR1cm4gb3V0cHV0QnVmZmVyRnVsbDsKQEAgLTE4NTksNyArMTgxMyw3IEBACiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAgICAgICBCdWZmZXIgKnBCdWZmZXIgPSBtQnVmZmVyUXVldWUuaXRlbUF0KGkpOwotICAgICAgICBkZWxldGUgW10gcEJ1ZmZlci0+bUJ1ZmZlcjsKKyAgICAgICAgZnJlZShwQnVmZmVyLT5tQnVmZmVyKTsKICAgICAgICAgZGVsZXRlIHBCdWZmZXI7CiAgICAgfQogICAgIG1CdWZmZXJRdWV1ZS5jbGVhcigpOwpAQCAtMTg2NywxMyArMTgyMSwxNCBAQAogCiAKIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6OlBhdGNoVHJhY2soUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgZmxhZ3MpCi0gICAgOiAgIFRyYWNrKHBsYXliYWNrVGhyZWFkLCBOVUxMLCBBVURJT19TVFJFQU1fUEFUQ0gsCisgICAgOiAgIFRyYWNrKHBsYXliYWNrVGhyZWFkLCBOVUxMLCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICBidWZmZXIsIDAsIDAsIGdldHVpZCgpLCBmbGFncywgVFlQRV9QQVRDSCksCiAgICAgICAgICAgICAgIG1Qcm94eShuZXcgQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUsIHRydWUsIHRydWUpKQpAQCAtMTk5NSwyOSArMTk1MCwzMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAoKGZsYWdzICYgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVCkgPyBBTExPQ19QSVBFIDogQUxMT0NfQ0JMSykgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJ1ZmZlciA9PSBOVUxMKSA/IEFMTE9DX0xPQ0FMIDogQUxMT0NfTk9ORSksCiAgICAgICAgICAgICAgICAgICB0eXBlKSwKLSAgICAgICAgbU92ZXJmbG93KGZhbHNlKSwgbVJlc2FtcGxlcihOVUxMKSwgbVJzbXBPdXRCdWZmZXIoTlVMTCksIG1Sc21wT3V0RnJhbWVDb3VudCgwKSwKLSAgICAgICAgLy8gU2VlIHJlYWwgaW5pdGlhbGl6YXRpb24gb2YgbVJzbXBJbkZyb250IGF0IFJlY29yZFRocmVhZDo6c3RhcnQoKQotICAgICAgICBtUnNtcEluVW5yZWwoMCksIG1Sc21wSW5Gcm9udCgwKSwgbUZyYW1lc1RvRHJvcCgwKSwgbVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyKE5VTEwpCisgICAgICAgIG1PdmVyZmxvdyhmYWxzZSksCisgICAgICAgIG1GcmFtZXNUb0Ryb3AoMCksCisgICAgICAgIG1SZXNhbXBsZXJCdWZmZXJQcm92aWRlcihOVUxMKSwgLy8gaW5pdGlhbGl6ZSBpbiBjYXNlIG9mIGVhcmx5IGNvbnN0cnVjdG9yIGV4aXQKKyAgICAgICAgbVJlY29yZEJ1ZmZlckNvbnZlcnRlcihOVUxMKQogewogICAgIGlmIChtQ2JsayA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICBtUmVjb3JkQnVmZmVyQ29udmVydGVyID0gbmV3IFJlY29yZEJ1ZmZlckNvbnZlcnRlcigKKyAgICAgICAgICAgIHRocmVhZC0+bUNoYW5uZWxNYXNrLCB0aHJlYWQtPm1Gb3JtYXQsIHRocmVhZC0+bVNhbXBsZVJhdGUsCisgICAgICAgICAgICBjaGFubmVsTWFzaywgZm9ybWF0LCBzYW1wbGVSYXRlKTsKKyAgICAvLyBDaGVjayBpZiB0aGUgUmVjb3JkQnVmZmVyQ29udmVydGVyIGNvbnN0cnVjdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAgICAvLyBJZiBub3QsIGRvbid0IGNvbnRpbnVlIHdpdGggY29uc3RydWN0aW9uLgorICAgIC8vCisgICAgLy8gTk9URTogSXQgd291bGQgYmUgZXh0cmVtZWx5IHJhcmUgdGhhdCB0aGUgcmVjb3JkIHRyYWNrIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgLy8gZm9yIHRoZSBjdXJyZW50IGRldmljZSwgYnV0IGEgcGVuZGluZyBvciBmdXR1cmUgZGV2aWNlIGNoYW5nZSB3b3VsZCBtYWtlCisgICAgLy8gdGhlIHJlY29yZCB0cmFjayBjb25maWd1cmF0aW9uIHZhbGlkLgorICAgIGlmIChtUmVjb3JkQnVmZmVyQ29udmVydGVyLT5pbml0Q2hlY2soKSAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiUmVjb3JkVHJhY2sgdW5hYmxlIHRvIGNyZWF0ZSByZWNvcmQgYnVmZmVyIGNvbnZlcnRlciIpOworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgbVNlcnZlclByb3h5ID0gbmV3IEF1ZGlvUmVjb3JkU2VydmVyUHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZSwgIWlzRXh0ZXJuYWxUcmFjaygpKTsKLQotICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNoYW5uZWxNYXNrKTsKLSAgICAvLyBGSVhNRSBJIGRvbid0IHVuZGVyc3RhbmQgZWl0aGVyIG9mIHRoZSBjaGFubmVsIGNvdW50IGNoZWNrcwotICAgIGlmICh0aHJlYWQtPm1TYW1wbGVSYXRlICE9IHNhbXBsZVJhdGUgJiYgdGhyZWFkLT5tQ2hhbm5lbENvdW50IDw9IEZDQ18yICYmCi0gICAgICAgICAgICBjaGFubmVsQ291bnQgPD0gRkNDXzIpIHsKLSAgICAgICAgLy8gc2luayBTUgotICAgICAgICBtUmVzYW1wbGVyID0gQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZShBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKLSAgICAgICAgICAgICAgICB0aHJlYWQtPm1DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpOwotICAgICAgICAvLyBzb3VyY2UgU1IKLSAgICAgICAgbVJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZSh0aHJlYWQtPm1TYW1wbGVSYXRlKTsKLSAgICAgICAgbVJlc2FtcGxlci0+c2V0Vm9sdW1lKEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fRkxPQVQsIEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fRkxPQVQpOwotICAgICAgICBtUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIgPSBuZXcgUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIodGhpcyk7Ci0gICAgfQorICAgIG1SZXNhbXBsZXJCdWZmZXJQcm92aWRlciA9IG5ldyBSZXNhbXBsZXJCdWZmZXJQcm92aWRlcih0aGlzKTsKIAogICAgIGlmIChmbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpIHsKICAgICAgICAgQUxPR19BU1NFUlQodGhyZWFkLT5tRmFzdFRyYWNrQXZhaWwpOwpAQCAtMjAyOCwxMSArMTk4NiwxOSBAQAogQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjp+UmVjb3JkVHJhY2soKQogewogICAgIEFMT0dWKCIlcyIsIF9fZnVuY19fKTsKLSAgICBkZWxldGUgbVJlc2FtcGxlcjsKLSAgICBkZWxldGVbXSBtUnNtcE91dEJ1ZmZlcjsKKyAgICBkZWxldGUgbVJlY29yZEJ1ZmZlckNvbnZlcnRlcjsKICAgICBkZWxldGUgbVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmluaXRDaGVjaygpIGNvbnN0Cit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gVHJhY2tCYXNlOjppbml0Q2hlY2soKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIG1TZXJ2ZXJQcm94eSA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwogLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6Z2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwKICAgICAgICAgaW50NjRfdCBwdHMgX191bnVzZWQpCkBAIC0yMjEyLDQgKzIxNzgsNCBAQAogICAgIG1Qcm94eS0+cmVsZWFzZUJ1ZmZlcihidWZmZXIpOwogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3QtcmVzYW1wbGUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3QtcmVzYW1wbGUuY3BwCmluZGV4IDg0YTY1NWEuLjc4OTM3NzggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0LXJlc2FtcGxlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdC1yZXNhbXBsZS5jcHAKQEAgLTQyNyw2ICs0MjcsMTQgQEAKICAgICAgICAgcHJpbnRmKCJxdWFsaXR5OiAlZCAgY2hhbm5lbHM6ICVkICBtc2VjOiAlIiBQUklkNjQgIiAgTWZybXMvczogJS4ybGZcbiIsCiAgICAgICAgICAgICAgICAgcXVhbGl0eSwgY2hhbm5lbHMsIHRpbWUvMTAwMDAwMCwgb3V0cHV0X2ZyYW1lcyAqIGxvb3BsaW1pdCAvICh0aW1lIC8gMWU5KSAvIDFlNik7CiAgICAgICAgIHJlc2FtcGxlci0+cmVzZXQoKTsKKworICAgICAgICAvLyBUT0RPIGZpeCBsZWdhY3kgYnVnOiByZXNldCBkb2VzIG5vdCBjbGVhciBidWZmZXJzLgorICAgICAgICAvLyBkZWxldGUgYW5kIHJlY3JlYXRlIHJlc2FtcGxlciBoZXJlLgorICAgICAgICBkZWxldGUgcmVzYW1wbGVyOworICAgICAgICByZXNhbXBsZXIgPSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKGZvcm1hdCwgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgIG91dHB1dF9mcmVxLCBxdWFsaXR5KTsKKyAgICAgICAgcmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKGlucHV0X2ZyZXEpOworICAgICAgICByZXNhbXBsZXItPnNldFZvbHVtZShBdWRpb1Jlc2FtcGxlcjo6VU5JVFlfR0FJTl9GTE9BVCwgQXVkaW9SZXNhbXBsZXI6OlVOSVRZX0dBSU5fRkxPQVQpOwogICAgIH0KIAogICAgIG1lbXNldChvdXRwdXRfdmFkZHIsIDAsIG91dHB1dF9zaXplKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggODYwNGVmNS4uZTE1MjQ2OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTMwLDIwICszMCwxNiBAQAogIwogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLSMgQ2xhbmcrKyBhYm9ydHMgb24gQXVkaW9NaXhlci5jcHAsCi0jIGIvMTgzNzM4NjYsICJkbyBub3Qga25vdyBob3cgdG8gc3BsaXQgdGhpcyBvcGVyYXRvci4iCi1pZmVxICgkKGZpbHRlciAkKFRBUkdFVF9BUkNIKSxhcm0gYXJtNjQpLCQoVEFSR0VUX0FSQ0gpKQotICAgIExPQ0FMX0NMQU5HIDo9IGZhbHNlCi1lbmRpZgotCiBMT0NBTF9TUkNfRklMRVM6PSBcCiAJdGVzdC1taXhlci5jcHAgXAogCS4uL0F1ZGlvTWl4ZXIuY3BwLmFybSBcCisJLi4vQnVmZmVyUHJvdmlkZXJzLmNwcAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykgXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotCWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyCisJZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIgXAorCWV4dGVybmFsL3NvbmljCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogCWxpYnNuZGZpbGUKQEAgLTU3LDcgKzUzLDggQEAKIAlsaWJkbCBcCiAJbGliY3V0aWxzIFwKIAlsaWJ1dGlscyBcCi0JbGlibG9nCisJbGlibG9nIFwKKwlsaWJzb25pYwogCiBMT0NBTF9NT0RVTEU6PSB0ZXN0LW1peGVyCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKaW5kZXggMmM0NTNiMC4uN2Y0ZDQ1NiAxMDA3NTUKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKQEAgLTE1LDcgKzE1LDcgQEAKIGVjaG8gIndhaXRpbmcgZm9yIGRldmljZSIKIGFkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudAogYWRiIHB1c2ggJE9VVC9zeXN0ZW0vbGliL2xpYmF1ZGlvcmVzYW1wbGVyLnNvIC9zeXN0ZW0vbGliCi1hZGIgcHVzaCAkT1VUL3N5c3RlbS9iaW4vcmVzYW1wbGVyX3Rlc3RzIC9zeXN0ZW0vYmluCithZGIgcHVzaCAkT1VUL2RhdGEvbmF0aXZldGVzdC9yZXNhbXBsZXJfdGVzdHMgL3N5c3RlbS9iaW4KIAogc2ggJEFORFJPSURfQlVJTERfVE9QL2ZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3J1bl9hbGxfdW5pdF90ZXN0cy5zaAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvbWl4ZXJfdG9fd2F2X3Rlc3RzLnNoIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL21peGVyX3RvX3dhdl90ZXN0cy5zaAppbmRleCA5YjM5ZTc3Li5kMDQ4MmExIDEwMDc1NQotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvbWl4ZXJfdG9fd2F2X3Rlc3RzLnNoCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9taXhlcl90b193YXZfdGVzdHMuc2gKQEAgLTYwLDExICs2MCwyMSBAQAogICAgIGZpCiAKICMgVGVzdDoKKyMgcHJvY2Vzc19fZ2VuZXJpY1Jlc2FtcGxpbmcgd2l0aCBtaXhlZCBpbnRlZ2VyIGFuZCBmbG9hdCB0cmFjayBpbnB1dAorIyB0cmFja19fUmVzYW1wbGUgLyB0cmFja19fZ2VuZXJpY1Jlc2FtcGxlCisgICAgYWRiIHNoZWxsIHRlc3QtbWl4ZXIgJDEgLXMgNDgwMDAgXAorICAgICAgICAtbyAvc2RjYXJkL3RtNDgwMDBncmlmLndhdiBcCisgICAgICAgIHNpbmU6Miw0MDAwLDc1MjAgY2hpcnA6Miw5MjAwIHNpbmU6MSwzMDAwLDE4MDAwIFwKKyAgICAgICAgc2luZTpmLDYsNjAwMCwxOTAwMCAgY2hpcnA6aSw0LDMwMDAwCisgICAgYWRiIHB1bGwgL3NkY2FyZC90bTQ4MDAwZ3JpZi53YXYgJDIKKworIyBUZXN0OgogIyBwcm9jZXNzX19nZW5lcmljUmVzYW1wbGluZwogIyB0cmFja19fUmVzYW1wbGUgLyB0cmFja19fZ2VuZXJpY1Jlc2FtcGxlCiAgICAgYWRiIHNoZWxsIHRlc3QtbWl4ZXIgJDEgLXMgNDgwMDAgXAogICAgICAgICAtbyAvc2RjYXJkL3RtNDgwMDBnci53YXYgXAotICAgICAgICBzaW5lOjIsNDAwMCw3NTIwIGNoaXJwOjIsOTIwMCBzaW5lOjEsMzAwMCwxODAwMAorICAgICAgICBzaW5lOjIsNDAwMCw3NTIwIGNoaXJwOjIsOTIwMCBzaW5lOjEsMzAwMCwxODAwMCBcCisgICAgICAgIHNpbmU6Niw2MDAwLDE5MDAwCiAgICAgYWRiIHB1bGwgL3NkY2FyZC90bTQ4MDAwZ3Iud2F2ICQyCiAKICMgVGVzdDoKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9yZXNhbXBsZXJfdGVzdHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3Jlc2FtcGxlcl90ZXN0cy5jcHAKaW5kZXggZDYyMTdiYS4uOWUzNzVkYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3Jlc2FtcGxlcl90ZXN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3Jlc2FtcGxlcl90ZXN0cy5jcHAKQEAgLTQ4LDcgKzQ4LDEwIEBACiAgICAgICAgIGlmICh0aGlzRnJhbWVzID09IDAgfHwgdGhpc0ZyYW1lcyA+IG91dHB1dEZyYW1lcyAtIGkpIHsKICAgICAgICAgICAgIHRoaXNGcmFtZXMgPSBvdXRwdXRGcmFtZXMgLSBpOwogICAgICAgICB9Ci0gICAgICAgIHJlc2FtcGxlci0+cmVzYW1wbGUoKGludDMyX3QqKSBvdXRwdXQgKyBjaGFubmVscyppLCB0aGlzRnJhbWVzLCBwcm92aWRlcik7CisgICAgICAgIHNpemVfdCBmcmFtZXNSZXNhbXBsZWQgPSByZXNhbXBsZXItPnJlc2FtcGxlKAorICAgICAgICAgICAgICAgIChpbnQzMl90Kikgb3V0cHV0ICsgY2hhbm5lbHMqaSwgdGhpc0ZyYW1lcywgcHJvdmlkZXIpOworICAgICAgICAvLyB3ZSBzaG91bGQgaGF2ZSBlbm91Z2ggYnVmZmVyIHNwYWNlLCBzbyB0aGVyZSBpcyBubyBzaG9ydCBjb3VudC4KKyAgICAgICAgQVNTRVJUX0VRKHRoaXNGcmFtZXMsIGZyYW1lc1Jlc2FtcGxlZCk7CiAgICAgICAgIGkgKz0gdGhpc0ZyYW1lczsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvdGVzdC1taXhlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvdGVzdC1taXhlci5jcHAKaW5kZXggOWE0ZmFkNi4uOGRhNjI0NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3Rlc3QtbWl4ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy90ZXN0LW1peGVyLmNwcApAQCAtMzksNyArMzksNyBAQAogICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstZl0gWy1tXSBbLWMgY2hhbm5lbHNdIgogICAgICAgICAgICAgICAgICAgICAiIFstcyBzYW1wbGUtcmF0ZV0gWy1vIDxvdXRwdXQtZmlsZT5dIFstYSA8YXV4LWJ1ZmZlci1maWxlPl0gWy1QIGNzdl0iCiAgICAgICAgICAgICAgICAgICAgICIgKDxpbnB1dC1maWxlPiB8IDxjb21tYW5kPikrXG4iLCBuYW1lKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtZiAgICBlbmFibGUgZmxvYXRpbmcgcG9pbnQgaW5wdXQgdHJhY2tcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1mICAgIGVuYWJsZSBmbG9hdGluZyBwb2ludCBpbnB1dCB0cmFjayBieSBkZWZhdWx0XG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtbSAgICBlbmFibGUgZmxvYXRpbmcgcG9pbnQgbWl4ZXIgb3V0cHV0XG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtYyAgICBudW1iZXIgb2YgbWl4ZXIgb3V0cHV0IGNoYW5uZWxzXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtcyAgICBtaXhlciBzYW1wbGUtcmF0ZVxuIik7CkBAIC00Nyw4ICs0Nyw4IEBACiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgLWEgICAgPGF1eC1idWZmZXItZmlsZT5cbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1QICAgICMgZnJhbWVzIHByb3ZpZGVkIHBlciBjYWxsIHRvIHJlc2FtcGxlKCkgaW4gQ1NWIGZvcm1hdFxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgPGlucHV0LWZpbGU+IGlzIGEgV0FWIGZpbGVcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgIDxjb21tYW5kPiBjYW4gYmUgJ3NpbmU6PGNoYW5uZWxzPiw8ZnJlcXVlbmN5Piw8c2FtcGxlcmF0ZT4nXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICAgICAgICdjaGlycDo8Y2hhbm5lbHM+LDxzYW1wbGVyYXRlPidcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIDxjb21tYW5kPiBjYW4gYmUgJ3NpbmU6WyhpfGYpLF08Y2hhbm5lbHM+LDxmcmVxdWVuY3k+LDxzYW1wbGVyYXRlPidcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgICAgICAgJ2NoaXJwOlsoaXxmKSxdPGNoYW5uZWxzPiw8c2FtcGxlcmF0ZT4nXG4iKTsKIH0KIAogc3RhdGljIGludCB3cml0ZUZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKQEAgLTc4LDYgKzc4LDE4IEBACiAgICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKIH0KIAorY29uc3QgY2hhciAqcGFyc2VGb3JtYXQoY29uc3QgY2hhciAqcywgYm9vbCAqdXNlRmxvYXQpIHsKKyAgICBpZiAoIXN0cm5jbXAocywgImYsIiwgMikpIHsKKyAgICAgICAgKnVzZUZsb2F0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHMgKyAyOworICAgIH0KKyAgICBpZiAoIXN0cm5jbXAocywgImksIiwgMikpIHsKKyAgICAgICAgKnVzZUZsb2F0ID0gZmFsc2U7CisgICAgICAgIHJldHVybiBzICsgMjsKKyAgICB9CisgICAgcmV0dXJuIHM7Cit9CisKIGludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKICAgICBjb25zdCBjaGFyKiBjb25zdCBwcm9nbmFtZSA9IGFyZ3ZbMF07CiAgICAgYm9vbCB1c2VJbnB1dEZsb2F0ID0gZmFsc2U7CkBAIC04OCw4ICsxMDAsOSBAQAogICAgIHN0ZDo6dmVjdG9yPGludD4gUHZhbHVlczsKICAgICBjb25zdCBjaGFyKiBvdXRwdXRGaWxlbmFtZSA9IE5VTEw7CiAgICAgY29uc3QgY2hhciogYXV4RmlsZW5hbWUgPSBOVUxMOwotICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IE5hbWVzOwotICAgIHN0ZDo6dmVjdG9yPFNpZ25hbFByb3ZpZGVyPiBQcm92aWRlcnM7CisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gbmFtZXM7CisgICAgc3RkOjp2ZWN0b3I8U2lnbmFsUHJvdmlkZXI+IHByb3ZpZGVyczsKKyAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gZm9ybWF0czsKIAogICAgIGZvciAoaW50IGNoOyAoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgImZtYzpzOm86YTpQOiIpKSAhPSAtMTspIHsKICAgICAgICAgc3dpdGNoIChjaCkgewpAQCAtMTM4LDU0ICsxNTEsNjUgQEAKICAgICBzaXplX3Qgb3V0cHV0RnJhbWVzID0gMDsKIAogICAgIC8vIGNyZWF0ZSBwcm92aWRlcnMgZm9yIGVhY2ggdHJhY2sKLSAgICBQcm92aWRlcnMucmVzaXplKGFyZ2MpOworICAgIG5hbWVzLnJlc2l6ZShhcmdjKTsKKyAgICBwcm92aWRlcnMucmVzaXplKGFyZ2MpOworICAgIGZvcm1hdHMucmVzaXplKGFyZ2MpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnYzsgKytpKSB7CiAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGNoaXJwW10gPSAiY2hpcnA6IjsKICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgc2luZVtdID0gInNpbmU6IjsKICAgICAgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBrU2Vjb25kcyA9IDE7CisgICAgICAgIGJvb2wgdXNlRmxvYXQgPSB1c2VJbnB1dEZsb2F0OwogCiAgICAgICAgIGlmICghc3RybmNtcChhcmd2W2ldLCBjaGlycCwgc3RybGVuKGNoaXJwKSkpIHsKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gdjsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMgPSBwYXJzZUZvcm1hdChhcmd2W2ldICsgc3RybGVuKGNoaXJwKSwgJnVzZUZsb2F0KTsKIAotICAgICAgICAgICAgcGFyc2VDU1YoYXJndltpXSArIHN0cmxlbihjaGlycCksIHYpOworICAgICAgICAgICAgcGFyc2VDU1Yocywgdik7CiAgICAgICAgICAgICBpZiAodi5zaXplKCkgPT0gMikgewogICAgICAgICAgICAgICAgIHByaW50ZigiY3JlYXRpbmcgY2hpcnAoJWQgJWQpXG4iLCB2WzBdLCB2WzFdKTsKLSAgICAgICAgICAgICAgICBpZiAodXNlSW5wdXRGbG9hdCkgewotICAgICAgICAgICAgICAgICAgICBQcm92aWRlcnNbaV0uc2V0Q2hpcnA8ZmxvYXQ+KHZbMF0sIDAsIHZbMV0vMiwgdlsxXSwga1NlY29uZHMpOworICAgICAgICAgICAgICAgIGlmICh1c2VGbG9hdCkgeworICAgICAgICAgICAgICAgICAgICBwcm92aWRlcnNbaV0uc2V0Q2hpcnA8ZmxvYXQ+KHZbMF0sIDAsIHZbMV0vMiwgdlsxXSwga1NlY29uZHMpOworICAgICAgICAgICAgICAgICAgICBmb3JtYXRzW2ldID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBQcm92aWRlcnNbaV0uc2V0Q2hpcnA8aW50MTZfdD4odlswXSwgMCwgdlsxXS8yLCB2WzFdLCBrU2Vjb25kcyk7CisgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyc1tpXS5zZXRDaGlycDxpbnQxNl90Pih2WzBdLCAwLCB2WzFdLzIsIHZbMV0sIGtTZWNvbmRzKTsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0c1tpXSA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQcm92aWRlcnNbaV0uc2V0SW5jcihQdmFsdWVzKTsKKyAgICAgICAgICAgICAgICBwcm92aWRlcnNbaV0uc2V0SW5jcihQdmFsdWVzKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJtYWxmb3JtZWQgaW5wdXQgJyVzJ1xuIiwgYXJndltpXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgc2luZSwgc3RybGVuKHNpbmUpKSkgewogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiB2OworICAgICAgICAgICAgY29uc3QgY2hhciAqcyA9IHBhcnNlRm9ybWF0KGFyZ3ZbaV0gKyBzdHJsZW4oc2luZSksICZ1c2VGbG9hdCk7CiAKLSAgICAgICAgICAgIHBhcnNlQ1NWKGFyZ3ZbaV0gKyBzdHJsZW4oc2luZSksIHYpOworICAgICAgICAgICAgcGFyc2VDU1Yocywgdik7CiAgICAgICAgICAgICBpZiAodi5zaXplKCkgPT0gMykgewogICAgICAgICAgICAgICAgIHByaW50ZigiY3JlYXRpbmcgc2luZSglZCAlZCAlZClcbiIsIHZbMF0sIHZbMV0sIHZbMl0pOwotICAgICAgICAgICAgICAgIGlmICh1c2VJbnB1dEZsb2F0KSB7Ci0gICAgICAgICAgICAgICAgICAgIFByb3ZpZGVyc1tpXS5zZXRTaW5lPGZsb2F0Pih2WzBdLCB2WzFdLCB2WzJdLCBrU2Vjb25kcyk7CisgICAgICAgICAgICAgICAgaWYgKHVzZUZsb2F0KSB7CisgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyc1tpXS5zZXRTaW5lPGZsb2F0Pih2WzBdLCB2WzFdLCB2WzJdLCBrU2Vjb25kcyk7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdHNbaV0gPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFByb3ZpZGVyc1tpXS5zZXRTaW5lPGludDE2X3Q+KHZbMF0sIHZbMV0sIHZbMl0sIGtTZWNvbmRzKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzW2ldLnNldFNpbmU8aW50MTZfdD4odlswXSwgdlsxXSwgdlsyXSwga1NlY29uZHMpOworICAgICAgICAgICAgICAgICAgICBmb3JtYXRzW2ldID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFByb3ZpZGVyc1tpXS5zZXRJbmNyKFB2YWx1ZXMpOworICAgICAgICAgICAgICAgIHByb3ZpZGVyc1tpXS5zZXRJbmNyKFB2YWx1ZXMpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1hbGZvcm1lZCBpbnB1dCAnJXMnXG4iLCBhcmd2W2ldKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHByaW50ZigiY3JlYXRpbmcgZmlsZW5hbWUoJXMpXG4iLCBhcmd2W2ldKTsKICAgICAgICAgICAgIGlmICh1c2VJbnB1dEZsb2F0KSB7Ci0gICAgICAgICAgICAgICAgUHJvdmlkZXJzW2ldLnNldEZpbGU8ZmxvYXQ+KGFyZ3ZbaV0pOworICAgICAgICAgICAgICAgIHByb3ZpZGVyc1tpXS5zZXRGaWxlPGZsb2F0Pihhcmd2W2ldKTsKKyAgICAgICAgICAgICAgICBmb3JtYXRzW2ldID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgUHJvdmlkZXJzW2ldLnNldEZpbGU8c2hvcnQ+KGFyZ3ZbaV0pOworICAgICAgICAgICAgICAgIHByb3ZpZGVyc1tpXS5zZXRGaWxlPHNob3J0Pihhcmd2W2ldKTsKKyAgICAgICAgICAgICAgICBmb3JtYXRzW2ldID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBQcm92aWRlcnNbaV0uc2V0SW5jcihQdmFsdWVzKTsKKyAgICAgICAgICAgIHByb3ZpZGVyc1tpXS5zZXRJbmNyKFB2YWx1ZXMpOwogICAgICAgICB9CiAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIG91dHB1dCBmcmFtZXMKLSAgICAgICAgc2l6ZV90IG5mcmFtZXMgPSAoaW50NjRfdCkgUHJvdmlkZXJzW2ldLmdldE51bUZyYW1lcygpICogb3V0cHV0U2FtcGxlUmF0ZQotICAgICAgICAgICAgICAgIC8gUHJvdmlkZXJzW2ldLmdldFNhbXBsZVJhdGUoKTsKKyAgICAgICAgc2l6ZV90IG5mcmFtZXMgPSAoaW50NjRfdCkgcHJvdmlkZXJzW2ldLmdldE51bUZyYW1lcygpICogb3V0cHV0U2FtcGxlUmF0ZQorICAgICAgICAgICAgICAgIC8gcHJvdmlkZXJzW2ldLmdldFNhbXBsZVJhdGUoKTsKICAgICAgICAgaWYgKGkgPT0gMCB8fCBvdXRwdXRGcmFtZXMgPiBuZnJhbWVzKSB7IC8vIGNob29zZSBtaW5pbXVtIGZvciBvdXRwdXRGcmFtZXMKICAgICAgICAgICAgIG91dHB1dEZyYW1lcyA9IG5mcmFtZXM7CiAgICAgICAgIH0KQEAgLTIxMywyMiArMjM3LDIwIEBACiAgICAgLy8gY3JlYXRlIHRoZSBtaXhlci4KICAgICBjb25zdCBzaXplX3QgbWl4ZXJGcmFtZUNvdW50ID0gMzIwOyAvLyB0eXBpY2FsIG51bWJlcnMgbWF5IHJhbmdlIGZyb20gMjQwIG9yIDk2MAogICAgIEF1ZGlvTWl4ZXIgKm1peGVyID0gbmV3IEF1ZGlvTWl4ZXIobWl4ZXJGcmFtZUNvdW50LCBvdXRwdXRTYW1wbGVSYXRlKTsKLSAgICBhdWRpb19mb3JtYXRfdCBpbnB1dEZvcm1hdCA9IHVzZUlucHV0RmxvYXQKLSAgICAgICAgICAgID8gQVVESU9fRk9STUFUX1BDTV9GTE9BVCA6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIGF1ZGlvX2Zvcm1hdF90IG1peGVyRm9ybWF0ID0gdXNlTWl4ZXJGbG9hdAogICAgICAgICAgICAgPyBBVURJT19GT1JNQVRfUENNX0ZMT0FUIDogQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7Ci0gICAgZmxvYXQgZiA9IEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fRkxPQVQgLyBQcm92aWRlcnMuc2l6ZSgpOyAvLyBub3JtYWxpemUgdm9sdW1lIGJ5ICMgdHJhY2tzCisgICAgZmxvYXQgZiA9IEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fRkxPQVQgLyBwcm92aWRlcnMuc2l6ZSgpOyAvLyBub3JtYWxpemUgdm9sdW1lIGJ5ICMgdHJhY2tzCiAgICAgc3RhdGljIGZsb2F0IGYwOyAvLyB6ZXJvCiAKICAgICAvLyBzZXQgdXAgdGhlIHRyYWNrcy4KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IFByb3ZpZGVycy5zaXplKCk7ICsraSkgewotICAgICAgICAvL3ByaW50ZigidHJhY2sgJWQgb3V0IG9mICVkXG4iLCBpLCBQcm92aWRlcnMuc2l6ZSgpKTsKLSAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQoUHJvdmlkZXJzW2ldLmdldE51bUNoYW5uZWxzKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJvdmlkZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIC8vcHJpbnRmKCJ0cmFjayAlZCBvdXQgb2YgJWRcbiIsIGksIHByb3ZpZGVycy5zaXplKCkpOworICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChwcm92aWRlcnNbaV0uZ2V0TnVtQ2hhbm5lbHMoKSk7CiAgICAgICAgIGludDMyX3QgbmFtZSA9IG1peGVyLT5nZXRUcmFja05hbWUoY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgaW5wdXRGb3JtYXQsIEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCk7CisgICAgICAgICAgICAgICAgZm9ybWF0c1tpXSwgQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKTsKICAgICAgICAgQUxPR19BU1NFUlQobmFtZSA+PSAwKTsKLSAgICAgICAgTmFtZXMucHVzaF9iYWNrKG5hbWUpOwotICAgICAgICBtaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgJlByb3ZpZGVyc1tpXSk7CisgICAgICAgIG5hbWVzW2ldID0gbmFtZTsKKyAgICAgICAgbWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsICZwcm92aWRlcnNbaV0pOwogICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwKICAgICAgICAgICAgICAgICAodm9pZCAqKW91dHB1dEFkZHIpOwogICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKApAQCAtMjQwLDcgKzI2Miw3IEBACiAgICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpGT1JNQVQsCi0gICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWlucHV0Rm9ybWF0KTsKKyAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZm9ybWF0c1tpXSk7CiAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKQEAgLTI1NSw3ICsyNzcsNyBAQAogICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UkVTQU1QTEUsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6U0FNUExFX1JBVEUsCi0gICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KVByb3ZpZGVyc1tpXS5nZXRTYW1wbGVSYXRlKCkpOworICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClwcm92aWRlcnNbaV0uZ2V0U2FtcGxlUmF0ZSgpKTsKICAgICAgICAgaWYgKHVzZVJhbXApIHsKICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUwLCAmZjApOwogICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZmMCk7CkBAIC0yNzcsMTEgKzI5OSwxMSBAQAogICAgIC8vIHB1bXAgdGhlIG1peGVyIHRvIHByb2Nlc3MgZGF0YS4KICAgICBzaXplX3QgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgb3V0cHV0RnJhbWVzIC0gbWl4ZXJGcmFtZUNvdW50OyBpICs9IG1peGVyRnJhbWVDb3VudCkgewotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IE5hbWVzLnNpemUoKTsgKytqKSB7Ci0gICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKE5hbWVzW2pdLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsCisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbmFtZXMuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZXNbal0sIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwKICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgb3V0cHV0QWRkciArIGkgKiBvdXRwdXRGcmFtZVNpemUpOwogICAgICAgICAgICAgaWYgKGF1eEZpbGVuYW1lKSB7Ci0gICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihOYW1lc1tqXSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkFVWF9CVUZGRVIsCisgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lc1tqXSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkFVWF9CVUZGRVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBhdXhBZGRyICsgaSAqIGF1eEZyYW1lU2l6ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rCmluZGV4IDE4OGZjODkuLjViMzhlMWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5tawpAQCAtMywyNSArMywyNyBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX1NSQ19GSUxFUzo9IFwKLSAgICBBdWRpb1BvbGljeVNlcnZpY2UuY3BwIFwKLSAgICBBdWRpb1BvbGljeUVmZmVjdHMuY3BwCisgICAgc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwIFwKKyAgICBzZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKIAogaWZlcSAoJChVU0VfTEVHQUNZX0FVRElPX1BPTElDWSksIDEpCiBMT0NBTF9TUkNfRklMRVMgKz0gXAotICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbExlZ2FjeS5jcHAgXAotICAgIEF1ZGlvUG9saWN5Q2xpZW50SW1wbExlZ2FjeS5jcHAKKyAgICBzZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbExlZ2FjeS5jcHAgXAorICAgIHNlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsTGVnYWN5LmNwcAogCiAgICAgTE9DQUxfQ0ZMQUdTICs9IC1EVVNFX0xFR0FDWV9BVURJT19QT0xJQ1kKIGVsc2UKIExPQ0FMX1NSQ19GSUxFUyArPSBcCi0gICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcCBcCi0gICAgQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAorICAgIHNlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcCBcCisgICAgc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCiBlbmRpZgogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlciBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlIFwKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGliY3V0aWxzIFwKQEAgLTM5LDcgKzQxLDggQEAKIGVuZGlmCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAotICAgIGxpYm1lZGlhX2hlbHBlcgorICAgIGxpYm1lZGlhX2hlbHBlciBcCisgICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCiAKIExPQ0FMX01PRFVMRTo9IGxpYmF1ZGlvcG9saWN5c2VydmljZQogCkBAIC01Myw3ICs1Niw3IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIEF1ZGlvUG9saWN5TWFuYWdlci5jcHAKKyAgICBtYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwIFwKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGliY3V0aWxzIFwKQEAgLTYxLDggKzY0LDMwIEBACiAgICAgbGlibG9nIFwKICAgICBsaWJzb3VuZHRyaWdnZXIKIAoraWZlcSAoJChVU0VfQ09ORklHVVJBQkxFX0FVRElPX1BPTElDWSksIDEpCisKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gXAorICAgIHBhcmFtZXRlci1mcmFtZXdvcmsucG9saWN5IFwKKyAgICBhdWRpb19wb2xpY3lfY3JpdGVyaWEuY29uZiBcCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICQoVE9QRElSKWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2luY2x1ZGUgXAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmF1ZGlvcG9saWN5ZW5naW5lY29uZmlndXJhYmxlCisKK2Vsc2UKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJhdWRpb3BvbGljeWVuZ2luZWRlZmF1bHQKKworZW5kaWYKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlIFwKKwogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGlibWVkaWFfaGVscGVyCisgICAgbGlibWVkaWFfaGVscGVyIFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMKIAogTE9DQUxfTU9EVUxFOj0gbGliYXVkaW9wb2xpY3ltYW5hZ2VyZGVmYXVsdAogCkBAIC03MywxNCArOTgsMjYgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcAorICAgIG1hbmFnZXIvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICBsaWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0CiAKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cworCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKKyAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UgXAorCiBMT0NBTF9NT0RVTEU6PSBsaWJhdWRpb3BvbGljeW1hbmFnZXIKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCiBlbmRpZgogZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUmVjdXJzaXZlIGNhbGwgc3ViLWZvbGRlciBBbmRyb2lkLm1rCisjCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaAppbmRleCA0NTA4ZmE3Li5jMWU3YmMwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKQEAgLTY0LDYgKzY0LDcgQEAKICAgICAgICAgQVBJX0lOUFVUX01JWF9FWFRfUE9MSUNZX1JFUk9VVEUsLy8gdXNlZCBmb3IgcGxhdGZvcm0gYXVkaW8gcmVyb3V0aW5nLCB3aGVyZSBtaXhlcyBhcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlZCBieSBleHRlcm5hbCBhbmQgZHluYW1pY2FsbHkgaW5zdGFsbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvbGljaWVzIHdoaWNoIHJlcm91dGUgYXVkaW8gbWl4ZXMKKyAgICAgICAgQVBJX0lOUFVUX1RFTEVQSE9OWV9SWCwgLy8gdXNlZCBmb3IgY2FwdHVyZSBmcm9tIHRlbGVwaG9ueSBSWCBwYXRoCiAgICAgfSBpbnB1dF90eXBlX3Q7CiAKIHB1YmxpYzoKQEAgLTc1LDcgKzc2LDggQEAKICAgICAvLyBpbmRpY2F0ZSBhIGNoYW5nZSBpbiBkZXZpY2UgY29ubmVjdGlvbiBzdGF0dXMKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpID0gMDsKICAgICAvLyByZXRyaWV2ZSBhIGRldmljZSBjb25uZWN0aW9uIHN0YXR1cwogICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykgPSAwOwpAQCAtMTA1LDEwICsxMDcsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pID0gMDsKICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIG91dHB1dCBzdGFydHMgYmVpbmcgdXNlZCBieSBjb3JyZXNwb25kaW5nIHN0cmVhbS4KICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKQEAgLTEyNywxMCArMTMxLDEyIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF90eXBlX3QgKmlucHV0VHlwZSkgPSAwOwogICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RhcnRzIGJlaW5nIHVzZWQuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LApAQCAtMjA2LDcgKzIxMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgY2xlYXJBdWRpb1BhdGNoZXModWlkX3QgdWlkKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VSZXNvdXJjZXNGb3JVaWQodWlkX3QgdWlkKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCkBAIC0yMTYsNiArMjIyLDExIEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyUG9saWN5TWl4ZXMoVmVjdG9yPEF1ZGlvTWl4PiBtaXhlcykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlclBvbGljeU1peGVzKFZlY3RvcjxBdWRpb01peD4gbWl4ZXMpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaGFuZGxlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlKSA9IDA7CiB9OwogCiAKQEAgLTMxOCw2ICszMjksOCBAQAogICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkgPSAwOwogCiAgICAgdmlydHVhbCBhdWRpb191bmlxdWVfaWRfdCBuZXdBdWRpb1VuaXF1ZUlkKCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpID0gMDsKIH07CiAKIGV4dGVybiAiQyIgQXVkaW9Qb2xpY3lJbnRlcmZhY2UqIGNyZWF0ZUF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWJkMGVkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MDk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkF1ZGlvUG9saWN5TWFuYWdlciIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotLy8jZGVmaW5lIFZFUllfVkVSQk9TRV9MT0dHSU5HCi0jaWZkZWYgVkVSWV9WRVJCT1NFX0xPR0dJTkcKLSNkZWZpbmUgQUxPR1ZWIEFMT0dWCi0jZWxzZQotI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlKDApCi0jZW5kaWYKLQotLy8gQSBkZXZpY2UgbWFzayBmb3IgYWxsIGF1ZGlvIGlucHV0IGRldmljZXMgdGhhdCBhcmUgY29uc2lkZXJlZCAidmlydHVhbCIgd2hlbiBldmFsdWF0aW5nCi0vLyBhY3RpdmUgaW5wdXRzIGluIGdldEFjdGl2ZUlucHV0KCkKLSNkZWZpbmUgQVBNX0FVRElPX0lOX0RFVklDRV9WSVJUVUFMX0FMTCAgKEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYfEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUikKLS8vIEEgZGV2aWNlIG1hc2sgZm9yIGFsbCBhdWRpbyBvdXRwdXQgZGV2aWNlcyB0aGF0IGFyZSBjb25zaWRlcmVkICJyZW1vdGUiIHdoZW4gZXZhbHVhdGluZwotLy8gYWN0aXZlIG91dHB1dCBkZXZpY2VzIGluIGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoKQotI2RlZmluZSBBUE1fQVVESU9fT1VUX0RFVklDRV9SRU1PVEVfQUxMICBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgKLS8vIEEgZGV2aWNlIG1hc2sgZm9yIGFsbCBhdWRpbyBpbnB1dCBhbmQgb3V0cHV0IGRldmljZXMgd2hlcmUgbWF0Y2hpbmcgaW5wdXRzL291dHB1dHMgb24gZGV2aWNlCi0vLyB0eXBlIGFsb25lIGlzIG5vdCBlbm91Z2g6IHRoZSBhZGRyZXNzIG11c3QgbWF0Y2ggdG9vCi0jZGVmaW5lIEFQTV9BVURJT19ERVZJQ0VfTUFUQ0hfQUREUkVTU19BTEwgKEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpCi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPG1hdGguaD4KLQotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+Ci0jaW5jbHVkZSA8c291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oPgotI2luY2x1ZGUgIkF1ZGlvUG9saWN5TWFuYWdlci5oIgotI2luY2x1ZGUgImF1ZGlvX3BvbGljeV9jb25mLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRGVmaW5pdGlvbnMgZm9yIGF1ZGlvX3BvbGljeS5jb25mIGZpbGUgcGFyc2luZwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdHJ1Y3QgU3RyaW5nVG9FbnVtIHsKLSAgICBjb25zdCBjaGFyICpuYW1lOwotICAgIHVpbnQzMl90IHZhbHVlOwotfTsKLQotI2RlZmluZSBTVFJJTkdfVE9fRU5VTShzdHJpbmcpIHsgI3N0cmluZywgc3RyaW5nIH0KLSNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpCi0KLWNvbnN0IFN0cmluZ1RvRW51bSBzRGV2aWNlTmFtZVRvRW51bVRhYmxlW10gPSB7Ci0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fSEVBRFNFVCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9BTExfU0NPKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9IRE1JKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlkpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRSksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9BTExfVVNCKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0xJTkUpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkMpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfU1BESUYpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfRk0pLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQVVYX0xJTkUpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9BTUJJRU5UKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9BTExfU0NPKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0FVWF9ESUdJVEFMKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fSERNSSksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEwpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9CQUNLX01JQyksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9BTkxHX0RPQ0tfSEVBRFNFVCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0RHVExfRE9DS19IRUFEU0VUKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fVVNCX0FDQ0VTU09SWSksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUiksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1RWX1RVTkVSKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fTElORSksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1NQRElGKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9MT09QQkFDSyksCi19OwotCi1jb25zdCBTdHJpbmdUb0VudW0gc091dHB1dEZsYWdOYW1lVG9FbnVtVGFibGVbXSA9IHsKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19PVVRQVVRfRkxBR19OT05fQkxPQ0tJTkcpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpLAotfTsKLQotY29uc3QgU3RyaW5nVG9FbnVtIHNJbnB1dEZsYWdOYW1lVG9FbnVtVGFibGVbXSA9IHsKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19JTlBVVF9GTEFHX0ZBU1QpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0lOUFVUX0ZMQUdfSFdfSE9UV09SRCksCi19OwotCi1jb25zdCBTdHJpbmdUb0VudW0gc0Zvcm1hdE5hbWVUb0VudW1UYWJsZVtdID0gewotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNXzhfQklUKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNXzMyX0JJVCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1BDTV84XzI0X0JJVCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1BDTV9GTE9BVCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfTVAzKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX01BSU4pLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTEMpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfU1NSKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0xUUCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19IRV9WMSksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19TQ0FMQUJMRSksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19FUkxDKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0xEKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0hFX1YyKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0VMRCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1ZPUkJJUyksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0hFX0FBQ19WMSksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0hFX0FBQ19WMiksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX09QVVMpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQzMpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9FX0FDMyksCi19OwotCi1jb25zdCBTdHJpbmdUb0VudW0gc091dENoYW5uZWxzTmFtZVRvRW51bVRhYmxlW10gPSB7Ci0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX09VVF9RVUFEKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX09VVF81UE9JTlQxKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX09VVF83UE9JTlQxKSwKLX07Ci0KLWNvbnN0IFN0cmluZ1RvRW51bSBzSW5DaGFubmVsc05hbWVUb0VudW1UYWJsZVtdID0gewotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfSU5fTU9OTyksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8pLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSyksCi19OwotCi1jb25zdCBTdHJpbmdUb0VudW0gc0dhaW5Nb2RlTmFtZVRvRW51bVRhYmxlW10gPSB7Ci0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fR0FJTl9NT0RFX0pPSU5UKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19HQUlOX01PREVfQ0hBTk5FTFMpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0dBSU5fTU9ERV9SQU1QKSwKLX07Ci0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdHJpbmdUb0VudW0oY29uc3Qgc3RydWN0IFN0cmluZ1RvRW51bSAqdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICBpZiAoc3RyY21wKHRhYmxlW2ldLm5hbWUsIG5hbWUpID09IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJzdHJpbmdUb0VudW0oKSBmb3VuZCAlcyIsIHRhYmxlW2ldLm5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIHRhYmxlW2ldLnZhbHVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1jb25zdCBjaGFyICpBdWRpb1BvbGljeU1hbmFnZXI6OmVudW1Ub1N0cmluZyhjb25zdCBzdHJ1Y3QgU3RyaW5nVG9FbnVtICp0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSkKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICBpZiAodGFibGVbaV0udmFsdWUgPT0gdmFsdWUpIHsKLSAgICAgICAgICAgIHJldHVybiB0YWJsZVtpXS5uYW1lOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAiIjsKLX0KLQotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0cmluZ1RvQm9vbChjb25zdCBjaGFyICp2YWx1ZSkKLXsKLSAgICByZXR1cm4gKChzdHJjYXNlY21wKCJ0cnVlIiwgdmFsdWUpID09IDApIHx8IChzdHJjbXAoIjEiLCB2YWx1ZSkgPT0gMCkpOwotfQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGltcGxlbWVudGF0aW9uCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKLXsKLSAgICByZXR1cm4gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KGRldmljZSwgc3RhdGUsIGRldmljZV9hZGRyZXNzKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQotewotICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2U6ICV4LCBzdGF0ZSAlZCwgYWRkcmVzcyAlcyIsCi0gICAgICAgICAgICBkZXZpY2UsIHN0YXRlLCBkZXZpY2VfYWRkcmVzcyAhPSBOVUxMID8gZGV2aWNlX2FkZHJlc3MgOiAiIik7Ci0KLSAgICAvLyBjb25uZWN0L2Rpc2Nvbm5lY3Qgb25seSAxIGRldmljZSBhdCBhIHRpbWUKLSAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSAmJiAhYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHJldHVybiBCQURfVkFMVUU7Ci0KLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gZ2V0RGV2aWNlRGVzY3JpcHRvcihkZXZpY2UsIGRldmljZV9hZGRyZXNzKTsKLQotICAgIC8vIGhhbmRsZSBvdXRwdXQgZGV2aWNlcwotICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgU29ydGVkVmVjdG9yIDxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0czsKLQotICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuaW5kZXhPZihkZXZEZXNjKTsKLQotICAgICAgICAvLyBzYXZlIGEgY29weSBvZiB0aGUgb3BlbmVkIG91dHB1dCBkZXNjcmlwdG9ycyBiZWZvcmUgYW55IG91dHB1dCBpcyBvcGVuZWQgb3IgY2xvc2VkCi0gICAgICAgIC8vIGJ5IGNoZWNrT3V0cHV0c0ZvckRldmljZSgpLiBUaGlzIHdpbGwgYmUgbmVlZGVkIGJ5IGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpCi0gICAgICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkKLSAgICAgICAgewotICAgICAgICAvLyBoYW5kbGUgb3V0cHV0IGRldmljZSBjb25uZWN0aW9uCi0gICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEU6IHsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBhbHJlYWR5IGNvbm5lY3RlZDogJXgiLCBkZXZpY2UpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBjb25uZWN0aW5nIGRldmljZSAleCIsIGRldmljZSk7Ci0KLSAgICAgICAgICAgIC8vIHJlZ2lzdGVyIG5ldyBkZXZpY2UgYXMgYXZhaWxhYmxlCi0gICAgICAgICAgICBpbmRleCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmFkZChkZXZEZXNjKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IGdldE1vZHVsZUZvckRldmljZShkZXZpY2UpOwotICAgICAgICAgICAgICAgIGlmIChtb2R1bGUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRCgic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgY291bGQgbm90IGZpbmQgSFcgbW9kdWxlIGZvciBkZXZpY2UgJTA4eCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPm1JZCA9IG5leHRVbmlxdWVJZCgpOwotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2luZGV4XS0+bU1vZHVsZSA9IG1vZHVsZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNoZWNrT3V0cHV0c0ZvckRldmljZShkZXZEZXNjLCBzdGF0ZSwgb3V0cHV0cywgZGV2RGVzYy0+bUFkZHJlc3MpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKGRldkRlc2MpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIG91dHB1dHMgc2hvdWxkIG5ldmVyIGJlIGVtcHR5IGhlcmUKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKG91dHB1dHMuc2l6ZSgpICE9IDAsICJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKToiCi0gICAgICAgICAgICAgICAgICAgICJjaGVja091dHB1dHNGb3JEZXZpY2UoKSByZXR1cm5lZCBubyBvdXRwdXRzIGJ1dCBzdGF0dXMgT0siKTsKLSAgICAgICAgICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBjaGVja091dHB1dHNGb3JEZXZpY2UoKSByZXR1cm5lZCAlenUgb3V0cHV0cyIsCi0gICAgICAgICAgICAgICAgICBvdXRwdXRzLnNpemUoKSk7Ci0KLQotICAgICAgICAgICAgLy8gU2V0IGNvbm5lY3QgdG8gSEFMcwotICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihkZXZEZXNjLT5tQWRkcmVzcyk7Ci0gICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfREVWSUNFX0NPTk5FQ1QpLCBkZXZpY2UpOwotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIHBhcmFtLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICB9IGJyZWFrOwotICAgICAgICAvLyBoYW5kbGUgb3V0cHV0IGRldmljZSBkaXNjb25uZWN0aW9uCi0gICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTogewotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2Ugbm90IGNvbm5lY3RlZDogJXgiLCBkZXZpY2UpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRpc2Nvbm5lY3Rpbmcgb3V0cHV0IGRldmljZSAleCIsIGRldmljZSk7Ci0KLSAgICAgICAgICAgIC8vIFNldCBEaXNjb25uZWN0IHRvIEhBTHMKLSAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoZGV2RGVzYy0+bUFkZHJlc3MpOwotICAgICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX0RFVklDRV9ESVNDT05ORUNUKSwgZGV2aWNlKTsKLSAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKEFVRElPX0lPX0hBTkRMRV9OT05FLCBwYXJhbS50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgLy8gcmVtb3ZlIGRldmljZSBmcm9tIGF2YWlsYWJsZSBvdXRwdXQgZGV2aWNlcwotICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKGRldkRlc2MpOwotCi0gICAgICAgICAgICBjaGVja091dHB1dHNGb3JEZXZpY2UoZGV2RGVzYywgc3RhdGUsIG91dHB1dHMsIGRldkRlc2MtPm1BZGRyZXNzKTsKLSAgICAgICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBpbnZhbGlkIHN0YXRlOiAleCIsIHN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVja0EyZHBTdXNwZW5kIG11c3QgcnVuIGJlZm9yZSBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMgc28gdGhhdCBBMkRQCi0gICAgICAgIC8vIG91dHB1dCBpcyBzdXNwZW5kZWQgYmVmb3JlIGFueSB0cmFja3MgYXJlIG1vdmVkIHRvIGl0Ci0gICAgICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKLSAgICAgICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7Ci0gICAgICAgIC8vIG91dHB1dHMgbXVzdCBiZSBjbG9zZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkgaXMgZXhlY3V0ZWQKLSAgICAgICAgaWYgKCFvdXRwdXRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0c1tpXSk7Ci0gICAgICAgICAgICAgICAgLy8gY2xvc2UgdW51c2VkIG91dHB1dHMgYWZ0ZXIgZGV2aWNlIGRpc2Nvbm5lY3Rpb24gb3IgZGlyZWN0IG91dHB1dHMgdGhhdCBoYXZlIGJlZW4KLSAgICAgICAgICAgICAgICAvLyBvcGVuZWQgYnkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgdG8gcXVlcnkgZHluYW1pYyBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgaWYgKChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKCgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApKSkgewotICAgICAgICAgICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXRzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBjaGVjayBhZ2FpbiBhZnRlciBjbG9zaW5nIEEyRFAgb3V0cHV0IHRvIHJlc2V0IG1BMmRwU3VzcGVuZGVkIGlmIG5lZWRlZAotICAgICAgICAgICAgY2hlY2tBMmRwU3VzcGVuZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKLSAgICAgICAgaWYgKG1QaG9uZVN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhuZXdEZXZpY2UpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IG1PdXRwdXRzLmtleUF0KGkpOwotICAgICAgICAgICAgaWYgKChtUGhvbmVTdGF0ZSAhPSBBVURJT19NT0RFX0lOX0NBTEwpIHx8IChvdXRwdXQgIT0gbVByaW1hcnlPdXRwdXQpKSB7Ci0gICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShtT3V0cHV0cy5rZXlBdChpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgICAgICAgICAgLy8gZG8gbm90IGZvcmNlIGRldmljZSBjaGFuZ2Ugb24gZHVwbGljYXRlZCBvdXRwdXQgYmVjYXVzZSBpZiBkZXZpY2UgaXMgMCwgaXQgd2lsbAotICAgICAgICAgICAgICAgIC8vIGFsc28gZm9yY2UgYSBkZXZpY2UgMCBmb3IgdGhlIHR3byBvdXRwdXRzIGl0IGlzIGR1cGxpY2F0ZWQgdG8gd2hpY2ggbWF5IG92ZXJyaWRlCi0gICAgICAgICAgICAgICAgLy8gYSB2YWxpZCBkZXZpY2Ugc2VsZWN0aW9uIG9uIHRob3NlIG91dHB1dHMuCi0gICAgICAgICAgICAgICAgYm9vbCBmb3JjZSA9ICFtT3V0cHV0cy52YWx1ZUF0KGkpLT5pc0R1cGxpY2F0ZWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCFkZXZpY2VEaXN0aW5ndWlzaGVzT25BZGRyZXNzKGRldmljZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWx3YXlzIGZvcmNlIHdoZW4gZGlzY29ubmVjdGluZyAoYSBub24tZHVwbGljYXRlZCBkZXZpY2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSk7Ci0gICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dCwgbmV3RGV2aWNlLCBmb3JjZSwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9ICAvLyBlbmQgaWYgaXMgb3V0cHV0IGRldmljZQotCi0gICAgLy8gaGFuZGxlIGlucHV0IGRldmljZXMKLSAgICBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgU29ydGVkVmVjdG9yIDxhdWRpb19pb19oYW5kbGVfdD4gaW5wdXRzOwotCi0gICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmluZGV4T2YoZGV2RGVzYyk7Ci0gICAgICAgIHN3aXRjaCAoc3RhdGUpCi0gICAgICAgIHsKLSAgICAgICAgLy8gaGFuZGxlIGlucHV0IGRldmljZSBjb25uZWN0aW9uCi0gICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEU6IHsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBhbHJlYWR5IGNvbm5lY3RlZDogJWQiLCBkZXZpY2UpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBnZXRNb2R1bGVGb3JEZXZpY2UoZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChtb2R1bGUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKTogY291bGQgbm90IGZpbmQgSFcgbW9kdWxlIGZvciBkZXZpY2UgJTA4eCIsCi0gICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2hlY2tJbnB1dHNGb3JEZXZpY2UoZGV2aWNlLCBzdGF0ZSwgaW5wdXRzLCBkZXZEZXNjLT5tQWRkcmVzcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGluZGV4ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5hZGQoZGV2RGVzYyk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdLT5tSWQgPSBuZXh0VW5pcXVlSWQoKTsKLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2luZGV4XS0+bU1vZHVsZSA9IG1vZHVsZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU2V0IGNvbm5lY3QgdG8gSEFMcwotICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihkZXZEZXNjLT5tQWRkcmVzcyk7Ci0gICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfREVWSUNFX0NPTk5FQ1QpLCBkZXZpY2UpOwotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIHBhcmFtLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgLy8gaGFuZGxlIGlucHV0IGRldmljZSBkaXNjb25uZWN0aW9uCi0gICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTogewotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2Ugbm90IGNvbm5lY3RlZDogJWQiLCBkZXZpY2UpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRpc2Nvbm5lY3RpbmcgaW5wdXQgZGV2aWNlICV4IiwgZGV2aWNlKTsKLQotICAgICAgICAgICAgLy8gU2V0IERpc2Nvbm5lY3QgdG8gSEFMcwotICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihkZXZEZXNjLT5tQWRkcmVzcyk7Ci0gICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfREVWSUNFX0RJU0NPTk5FQ1QpLCBkZXZpY2UpOwotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIHBhcmFtLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICBjaGVja0lucHV0c0ZvckRldmljZShkZXZpY2UsIHN0YXRlLCBpbnB1dHMsIGRldkRlc2MtPm1BZGRyZXNzKTsKLSAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMucmVtb3ZlKGRldkRlc2MpOwotCi0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBpbnZhbGlkIHN0YXRlOiAleCIsIHN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBjbG9zZUFsbElucHV0cygpOwotCi0gICAgICAgIGlmIChtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICAgICAgdXBkYXRlQ2FsbFJvdXRpbmcobmV3RGV2aWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0gLy8gZW5kIGlmIGlzIGlucHV0IGRldmljZQotCi0gICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgZGV2aWNlOiAleCIsIGRldmljZSk7Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKLX0KLQotYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQotewotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBnZXREZXZpY2VEZXNjcmlwdG9yKGRldmljZSwgZGV2aWNlX2FkZHJlc3MpOwotICAgIERldmljZVZlY3RvciAqZGV2aWNlVmVjdG9yOwotCi0gICAgaWYgKGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgewotICAgICAgICBkZXZpY2VWZWN0b3IgPSAmbUF2YWlsYWJsZU91dHB1dERldmljZXM7Ci0gICAgfSBlbHNlIGlmIChhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgewotICAgICAgICBkZXZpY2VWZWN0b3IgPSAmbUF2YWlsYWJsZUlucHV0RGV2aWNlczsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygiZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgaW52YWxpZCBkZXZpY2UgdHlwZSAlMDh4IiwgZGV2aWNlKTsKLSAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU7Ci0gICAgfQotCi0gICAgc3NpemVfdCBpbmRleCA9IGRldmljZVZlY3Rvci0+aW5kZXhPZihkZXZEZXNjKTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU7Ci0gICAgfQotfQotCi1zcDxBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I+ICBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZURlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQotewotICAgIFN0cmluZzggYWRkcmVzcyA9IChkZXZpY2VfYWRkcmVzcyA9PSBOVUxMKSA/IFN0cmluZzgoIiIpIDogU3RyaW5nOChkZXZpY2VfYWRkcmVzcyk7Ci0gICAgLy8gaGFuZGxlIGxlZ2FjeSByZW1vdGUgc3VibWl4IGNhc2Ugd2hlcmUgdGhlIGFkZHJlc3Mgd2FzIG5vdCBhbHdheXMgc3BlY2lmaWVkCi0gICAgaWYgKGRldmljZURpc3Rpbmd1aXNoZXNPbkFkZHJlc3MoZGV2aWNlKSAmJiAoYWRkcmVzcy5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICBhZGRyZXNzID0gU3RyaW5nOCgiMCIpOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9PSAwKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9Ci0gICAgICAgICAgICAgICAgbUh3TW9kdWxlc1tpXS0+bURlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVBZGRyKGRldmljZSwgYWRkcmVzcyk7Ci0gICAgICAgIGlmICghZGV2aWNlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKLSAgICAgICAgfQotICAgICAgICBkZXZpY2VMaXN0ID0gbUh3TW9kdWxlc1tpXS0+bURlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKLSAgICAgICAgaWYgKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIGRldmljZUxpc3QuaXRlbUF0KDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgoIiIpLCBkZXZpY2UpOwotICAgIGRldkRlc2MtPm1BZGRyZXNzID0gYWRkcmVzczsKLSAgICByZXR1cm4gZGV2RGVzYzsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZUNhbGxSb3V0aW5nKGF1ZGlvX2RldmljZXNfdCByeERldmljZSwgaW50IGRlbGF5TXMpCi17Ci0gICAgYm9vbCBjcmVhdGVUeFBhdGNoID0gZmFsc2U7Ci0gICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOwotICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKLSAgICBwYXRjaC5udW1fc2lua3MgPSAxOwotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlOwotICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0OwotCi0gICAgYXVkaW9fZGV2aWNlc190IHR4RGV2aWNlID0gZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04pOwotICAgIEFMT0dWKCJ1cGRhdGVDYWxsUm91dGluZyBkZXZpY2UgcnhEZXZpY2UgJTA4eCB0eERldmljZSAlMDh4IiwgcnhEZXZpY2UsIHR4RGV2aWNlKTsKLQotICAgIC8vIHJlbGVhc2UgZXhpc3RpbmcgUlggcGF0Y2ggaWYgYW55Ci0gICAgaWYgKG1DYWxsUnhQYXRjaCAhPSAwKSB7Ci0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChtQ2FsbFJ4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlLCAwKTsKLSAgICAgICAgbUNhbGxSeFBhdGNoLmNsZWFyKCk7Ci0gICAgfQotICAgIC8vIHJlbGVhc2UgVFggcGF0Y2ggaWYgYW55Ci0gICAgaWYgKG1DYWxsVHhQYXRjaCAhPSAwKSB7Ci0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChtQ2FsbFR4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlLCAwKTsKLSAgICAgICAgbUNhbGxUeFBhdGNoLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLy8gSWYgdGhlIFJYIGRldmljZSBpcyBvbiB0aGUgcHJpbWFyeSBIVyBtb2R1bGUsIHRoZW4gdXNlIGxlZ2FjeSByb3V0aW5nIG1ldGhvZCBmb3Igdm9pY2UgY2FsbHMKLSAgICAvLyB2aWEgc2V0T3V0cHV0RGV2aWNlKCkgb24gcHJpbWFyeSBvdXRwdXQuCi0gICAgLy8gT3RoZXJ3aXNlLCBjcmVhdGUgdHdvIGF1ZGlvIHBhdGNoZXMgZm9yIFRYIGFuZCBSWCBwYXRoLgotICAgIGlmIChhdmFpbGFibGVQcmltYXJ5T3V0cHV0RGV2aWNlcygpICYgcnhEZXZpY2UpIHsKLSAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCByeERldmljZSwgdHJ1ZSwgZGVsYXlNcyk7Ci0gICAgICAgIC8vIElmIHRoZSBUWCBkZXZpY2UgaXMgYWxzbyBvbiB0aGUgcHJpbWFyeSBIVyBtb2R1bGUsIHNldE91dHB1dERldmljZSgpIHdpbGwgdGFrZSBjYXJlCi0gICAgICAgIC8vIG9mIGl0IGR1ZSB0byBsZWdhY3kgaW1wbGVtZW50YXRpb24uIElmIG5vdCwgY3JlYXRlIGEgcGF0Y2guCi0gICAgICAgIGlmICgoYXZhaWxhYmxlUHJpbWFyeUlucHV0RGV2aWNlcygpICYgdHhEZXZpY2UgJiB+QVVESU9fREVWSUNFX0JJVF9JTikKLSAgICAgICAgICAgICAgICA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgY3JlYXRlVHhQYXRjaCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAvLyBjcmVhdGUgUlggcGF0aCBhdWRpbyBwYXRjaAotICAgICAgICBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKHJ4RGV2aWNlKTsKLSAgICAgICAgQUxPR19BU1NFUlQoIWRldmljZUxpc3QuaXNFbXB0eSgpLAotICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBzZWxlY3RlZCBkZXZpY2Ugbm90IGluIG91dHB1dCBkZXZpY2UgbGlzdCIpOwotICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiByeFNpbmtEZXZpY2VEZXNjID0gZGV2aWNlTGlzdC5pdGVtQXQoMCk7Ci0gICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYKTsKLSAgICAgICAgQUxPR19BU1NFUlQoIWRldmljZUxpc3QuaXNFbXB0eSgpLAotICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBubyB0ZWxlcGhvbnkgUlggZGV2aWNlIik7Ci0gICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHJ4U291cmNlRGV2aWNlRGVzYyA9IGRldmljZUxpc3QuaXRlbUF0KDApOwotCi0gICAgICAgIHJ4U291cmNlRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMF0pOwotICAgICAgICByeFNpbmtEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc2lua3NbMF0pOwotCi0gICAgICAgIC8vIHJlcXVlc3QgdG8gcmV1c2UgZXhpc3Rpbmcgb3V0cHV0IHN0cmVhbSBpZiBvbmUgaXMgYWxyZWFkeSBvcGVuZWQgdG8gcmVhY2ggdGhlIFJYIGRldmljZQotICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRzRm9yRGV2aWNlKHJ4RGV2aWNlLCBtT3V0cHV0cyk7Ci0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKLSAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIFJYIGRldmljZSBvdXRwdXQgaXMgZHVwbGljYXRlZCIpOwotICAgICAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMV0pOwotICAgICAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAyOwotICAgICAgICB9Ci0KLSAgICAgICAgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZhZlBhdGNoSGFuZGxlLCAwKTsKLSAgICAgICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAidXBkYXRlQ2FsbFJvdXRpbmcoKSBlcnJvciAlZCBjcmVhdGluZyBSWCBhdWRpbyBwYXRjaCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1DYWxsUnhQYXRjaCA9IG5ldyBBdWRpb1BhdGNoKChhdWRpb19wYXRjaF9oYW5kbGVfdCluZXh0VW5pcXVlSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRjaCwgbVVpZENhY2hlZCk7Ci0gICAgICAgICAgICBtQ2FsbFJ4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgIG1DYWxsUnhQYXRjaC0+bVVpZCA9IG1VaWRDYWNoZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgY3JlYXRlVHhQYXRjaCA9IHRydWU7Ci0gICAgfQotICAgIGlmIChjcmVhdGVUeFBhdGNoKSB7Ci0KLSAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOwotICAgICAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7Ci0gICAgICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7Ci0gICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZSh0eERldmljZSk7Ci0gICAgICAgIEFMT0dfQVNTRVJUKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSwKLSAgICAgICAgICAgICAgICAgICAgInVwZGF0ZUNhbGxSb3V0aW5nKCkgc2VsZWN0ZWQgZGV2aWNlIG5vdCBpbiBpbnB1dCBkZXZpY2UgbGlzdCIpOwotICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiB0eFNvdXJjZURldmljZURlc2MgPSBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKLSAgICAgICAgdHhTb3VyY2VEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1swXSk7Ci0gICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgpOwotICAgICAgICBBTE9HX0FTU0VSVCghZGV2aWNlTGlzdC5pc0VtcHR5KCksCi0gICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIG5vIHRlbGVwaG9ueSBUWCBkZXZpY2UiKTsKLSAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gdHhTaW5rRGV2aWNlRGVzYyA9IGRldmljZUxpc3QuaXRlbUF0KDApOwotICAgICAgICB0eFNpbmtEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc2lua3NbMF0pOwotCi0gICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dHNGb3JEZXZpY2UoQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgsIG1PdXRwdXRzKTsKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0lOVkFMSUQpOwotICAgICAgICAvLyByZXF1ZXN0IHRvIHJldXNlIGV4aXN0aW5nIG91dHB1dCBzdHJlYW0gaWYgb25lIGlzIGFscmVhZHkgb3BlbmVkIHRvIHJlYWNoIHRoZSBUWAotICAgICAgICAvLyBwYXRoIG91dHB1dCBkZXZpY2UKLSAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIFJYIGRldmljZSBvdXRwdXQgaXMgZHVwbGljYXRlZCIpOwotICAgICAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMV0pOwotICAgICAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAyOwotICAgICAgICB9Ci0KLSAgICAgICAgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZhZlBhdGNoSGFuZGxlLCAwKTsKLSAgICAgICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAic2V0UGhvbmVTdGF0ZSgpIGVycm9yICVkIGNyZWF0aW5nIFRYIGF1ZGlvIHBhdGNoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgbUNhbGxUeFBhdGNoID0gbmV3IEF1ZGlvUGF0Y2goKGF1ZGlvX3BhdGNoX2hhbmRsZV90KW5leHRVbmlxdWVJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGNoLCBtVWlkQ2FjaGVkKTsKLSAgICAgICAgICAgIG1DYWxsVHhQYXRjaC0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgbUNhbGxUeFBhdGNoLT5tVWlkID0gbVVpZENhY2hlZDsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKQotewotICAgIEFMT0dWKCJzZXRQaG9uZVN0YXRlKCkgc3RhdGUgJWQiLCBzdGF0ZSk7Ci0gICAgaWYgKHN0YXRlIDwgMCB8fCBzdGF0ZSA+PSBBVURJT19NT0RFX0NOVCkgewotICAgICAgICBBTE9HVygic2V0UGhvbmVTdGF0ZSgpIGludmFsaWQgc3RhdGUgJWQiLCBzdGF0ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdGUgPT0gbVBob25lU3RhdGUgKSB7Ci0gICAgICAgIEFMT0dXKCJzZXRQaG9uZVN0YXRlKCkgc2V0dGluZyBzYW1lIHN0YXRlICVkIiwgc3RhdGUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gaWYgbGVhdmluZyBjYWxsIHN0YXRlLCBoYW5kbGUgc3BlY2lhbCBjYXNlIG9mIGFjdGl2ZSBzdHJlYW1zCi0gICAgLy8gcGVydGFpbmluZyB0byBzb25pZmljYXRpb24gc3RyYXRlZ3kgc2VlIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpCi0gICAgaWYgKGlzSW5DYWxsKCkpIHsKLSAgICAgICAgQUxPR1YoInNldFBob25lU3RhdGUoKSBpbiBjYWxsIHN0YXRlIG1hbmFnZW1lbnQ6IG5ldyBzdGF0ZSBpcyAlZCIsIHN0YXRlKTsKLSAgICAgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0NOVDsgc3RyZWFtKyspIHsKLSAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1BBVENIKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmb3JjZSByZWV2YWx1YXRpbmcgYWNjZXNzaWJpbGl0eSByb3V0aW5nIHdoZW4gY2FsbCBzdGFydHMKLSAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkpOwotICAgIH0KLQotICAgIC8vIHN0b3JlIHByZXZpb3VzIHBob25lIHN0YXRlIGZvciBtYW5hZ2VtZW50IG9mIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBiZWxvdwotICAgIGludCBvbGRTdGF0ZSA9IG1QaG9uZVN0YXRlOwotICAgIG1QaG9uZVN0YXRlID0gc3RhdGU7Ci0gICAgYm9vbCBmb3JjZSA9IGZhbHNlOwotCi0gICAgLy8gYXJlIHdlIGVudGVyaW5nIG9yIHN0YXJ0aW5nIGEgY2FsbAotICAgIGlmICghaXNTdGF0ZUluQ2FsbChvbGRTdGF0ZSkgJiYgaXNTdGF0ZUluQ2FsbChzdGF0ZSkpIHsKLSAgICAgICAgQUxPR1YoIiAgRW50ZXJpbmcgY2FsbCBpbiBzZXRQaG9uZVN0YXRlKCkiKTsKLSAgICAgICAgLy8gZm9yY2Ugcm91dGluZyBjb21tYW5kIHRvIGF1ZGlvIGhhcmR3YXJlIHdoZW4gc3RhcnRpbmcgYSBjYWxsCi0gICAgICAgIC8vIGV2ZW4gaWYgbm8gZGV2aWNlIGNoYW5nZSBpcyBuZWVkZWQKLSAgICAgICAgZm9yY2UgPSB0cnVlOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IERFVklDRV9DQVRFR09SWV9DTlQ7IGorKykgewotICAgICAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX0RUTUZdLm1Wb2x1bWVDdXJ2ZVtqXSA9Ci0gICAgICAgICAgICAgICAgICAgIHNWb2x1bWVQcm9maWxlc1tBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTF1bal07Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGlzU3RhdGVJbkNhbGwob2xkU3RhdGUpICYmICFpc1N0YXRlSW5DYWxsKHN0YXRlKSkgewotICAgICAgICBBTE9HVigiICBFeGl0aW5nIGNhbGwgaW4gc2V0UGhvbmVTdGF0ZSgpIik7Ci0gICAgICAgIC8vIGZvcmNlIHJvdXRpbmcgY29tbWFuZCB0byBhdWRpbyBoYXJkd2FyZSB3aGVuIGV4aXRpbmcgYSBjYWxsCi0gICAgICAgIC8vIGV2ZW4gaWYgbm8gZGV2aWNlIGNoYW5nZSBpcyBuZWVkZWQKLSAgICAgICAgZm9yY2UgPSB0cnVlOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IERFVklDRV9DQVRFR09SWV9DTlQ7IGorKykgewotICAgICAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX0RUTUZdLm1Wb2x1bWVDdXJ2ZVtqXSA9Ci0gICAgICAgICAgICAgICAgICAgIHNWb2x1bWVQcm9maWxlc1tBVURJT19TVFJFQU1fRFRNRl1bal07Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGlzU3RhdGVJbkNhbGwoc3RhdGUpICYmIChzdGF0ZSAhPSBvbGRTdGF0ZSkpIHsKLSAgICAgICAgQUxPR1YoIiAgU3dpdGNoaW5nIGJldHdlZW4gdGVsZXBob255IGFuZCBWb0lQIGluIHNldFBob25lU3RhdGUoKSIpOwotICAgICAgICAvLyBmb3JjZSByb3V0aW5nIGNvbW1hbmQgdG8gYXVkaW8gaGFyZHdhcmUgd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiB0ZWxlcGhvbnkgYW5kIFZvSVAKLSAgICAgICAgLy8gZXZlbiBpZiBubyBkZXZpY2UgY2hhbmdlIGlzIG5lZWRlZAotICAgICAgICBmb3JjZSA9IHRydWU7Ci0gICAgfQotCi0gICAgLy8gY2hlY2sgZm9yIGRldmljZSBhbmQgb3V0cHV0IGNoYW5nZXMgdHJpZ2dlcmVkIGJ5IG5ldyBwaG9uZSBzdGF0ZQotICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKLSAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKLSAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOwotCi0gICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBod091dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihtUHJpbWFyeU91dHB1dCk7Ci0KLSAgICBpbnQgZGVsYXlNcyA9IDA7Ci0gICAgaWYgKGlzU3RhdGVJbkNhbGwoc3RhdGUpKSB7Ci0gICAgICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgIC8vIG11dGUgbWVkaWEgYW5kIHNvbmlmaWNhdGlvbiBzdHJhdGVnaWVzIGFuZCBkZWxheSBkZXZpY2Ugc3dpdGNoIGJ5IHRoZSBsYXJnZXN0Ci0gICAgICAgICAgICAvLyBsYXRlbmN5IG9mIGFueSBvdXRwdXQgd2hlcmUgZWl0aGVyIHN0cmF0ZWd5IGlzIGFjdGl2ZS4KLSAgICAgICAgICAgIC8vIFRoaXMgYXZvaWQgc2VuZGluZyB0aGUgcmluZyB0b25lIG9yIG11c2ljIHRhaWwgaW50byB0aGUgZWFycGllY2Ugb3IgaGVhZHNldC4KLSAgICAgICAgICAgIGlmICgoZGVzYy0+aXNTdHJhdGVneUFjdGl2ZShTVFJBVEVHWV9NRURJQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNUaW1lKSB8fAotICAgICAgICAgICAgICAgICAgICBkZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX1NPTklGSUNBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c1RpbWUpKSAmJgotICAgICAgICAgICAgICAgICAgICAoZGVsYXlNcyA8IChpbnQpZGVzYy0+bUxhdGVuY3kqMikpIHsKLSAgICAgICAgICAgICAgICBkZWxheU1zID0gZGVzYy0+bUxhdGVuY3kqMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9NRURJQSwgdHJ1ZSwgbU91dHB1dHMua2V5QXQoaSkpOwotICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX01FRElBLCBmYWxzZSwgbU91dHB1dHMua2V5QXQoaSksIE1VVEVfVElNRV9NUywKLSAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgdHJ1ZSAvKmZyb21DYWNoZSovKSk7Ci0gICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCB0cnVlLCBtT3V0cHV0cy5rZXlBdChpKSk7Ci0gICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBmYWxzZSwgbU91dHB1dHMua2V5QXQoaSksIE1VVEVfVElNRV9NUywKLSAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04sIHRydWUgLypmcm9tQ2FjaGUqLykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gTm90ZSB0aGF0IGRlc3BpdGUgdGhlIGZhY3QgdGhhdCBnZXROZXdPdXRwdXREZXZpY2UoKSBpcyBjYWxsZWQgb24gdGhlIHByaW1hcnkgb3V0cHV0LAotICAgIC8vIHRoZSBkZXZpY2UgcmV0dXJuZWQgaXMgbm90IG5lY2Vzc2FyaWx5IHJlYWNoYWJsZSB2aWEgdGhpcyBvdXRwdXQKLSAgICBhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgIC8vIGZvcmNlIHJvdXRpbmcgY29tbWFuZCB0byBhdWRpbyBoYXJkd2FyZSB3aGVuIGVuZGluZyBjYWxsCi0gICAgLy8gZXZlbiBpZiBubyBkZXZpY2UgY2hhbmdlIGlzIG5lZWRlZAotICAgIGlmIChpc1N0YXRlSW5DYWxsKG9sZFN0YXRlKSAmJiByeERldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICByeERldmljZSA9IGh3T3V0cHV0RGVzYy0+ZGV2aWNlKCk7Ci0gICAgfQotCi0gICAgaWYgKHN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgewotICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhyeERldmljZSwgZGVsYXlNcyk7Ci0gICAgfSBlbHNlIGlmIChvbGRTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHsKLSAgICAgICAgaWYgKG1DYWxsUnhQYXRjaCAhPSAwKSB7Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gobUNhbGxSeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSwgMCk7Ci0gICAgICAgICAgICBtQ2FsbFJ4UGF0Y2guY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUNhbGxUeFBhdGNoICE9IDApIHsKLSAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChtQ2FsbFR4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlLCAwKTsKLSAgICAgICAgICAgIG1DYWxsVHhQYXRjaC5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIHNldE91dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgcnhEZXZpY2UsIGZvcmNlLCAwKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzZXRPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlLCBmb3JjZSwgMCk7Ci0gICAgfQotICAgIC8vIGlmIGVudGVyaW5nIGluIGNhbGwgc3RhdGUsIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgYWN0aXZlIHN0cmVhbXMKLSAgICAvLyBwZXJ0YWluaW5nIHRvIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBzZWUgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkKLSAgICBpZiAoaXNTdGF0ZUluQ2FsbChzdGF0ZSkpIHsKLSAgICAgICAgQUxPR1YoInNldFBob25lU3RhdGUoKSBpbiBjYWxsIHN0YXRlIG1hbmFnZW1lbnQ6IG5ldyBzdGF0ZSBpcyAlZCIsIHN0YXRlKTsKLSAgICAgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0NOVDsgc3RyZWFtKyspIHsKLSAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1BBVENIKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEZsYWcgdGhhdCByaW5ndG9uZSB2b2x1bWUgbXVzdCBiZSBsaW1pdGVkIHRvIG11c2ljIHZvbHVtZSB1bnRpbCB3ZSBleGl0IE1PREVfUklOR1RPTkUKLSAgICBpZiAoc3RhdGUgPT0gQVVESU9fTU9ERV9SSU5HVE9ORSAmJgotICAgICAgICBpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMsIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZKSkgewotICAgICAgICBtTGltaXRSaW5ndG9uZVZvbHVtZSA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUgPSBmYWxzZTsKLSAgICB9Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQotewotICAgIEFMT0dWKCJzZXRGb3JjZVVzZSgpIHVzYWdlICVkLCBjb25maWcgJWQsIG1QaG9uZVN0YXRlICVkIiwgdXNhZ2UsIGNvbmZpZywgbVBob25lU3RhdGUpOwotCi0gICAgYm9vbCBmb3JjZVZvbHVtZVJlZXZhbCA9IGZhbHNlOwotICAgIHN3aXRjaCh1c2FnZSkgewotICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OOgotICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPICYmCi0gICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpIHsKLSAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfQ09NTVVOSUNBVElPTiIsIGNvbmZpZyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZm9yY2VWb2x1bWVSZWV2YWwgPSB0cnVlOwotICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUE6Ci0gICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0hFQURQSE9ORVMgJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9BMkRQICYmCi0gICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1dJUkVEX0FDQ0VTU09SWSAmJgotICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9BTkFMT0dfRE9DSyAmJgotICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9ESUdJVEFMX0RPQ0sgJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FICYmCi0gICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFAgJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSICkgewotICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9NRURJQSIsIGNvbmZpZyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRDoKLSAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfV0lSRURfQUNDRVNTT1JZICYmCi0gICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpIHsKLSAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfUkVDT1JEIiwgY29uZmlnKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRE9DSzoKLSAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX0NBUl9ET0NLICYmCi0gICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX0RFU0tfRE9DSyAmJgotICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9XSVJFRF9BQ0NFU1NPUlkgJiYKLSAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQU5BTE9HX0RPQ0sgJiYKLSAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfRElHSVRBTF9ET0NLKSB7Ci0gICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX0RPQ0siLCBjb25maWcpOwotICAgICAgICB9Ci0gICAgICAgIGZvcmNlVm9sdW1lUmVldmFsID0gdHJ1ZTsKLSAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTToKLSAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJgotICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpIHsKLSAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfU1lTVEVNIiwgY29uZmlnKTsKLSAgICAgICAgfQotICAgICAgICBmb3JjZVZvbHVtZVJlZXZhbCA9IHRydWU7Ci0gICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJTzoKLSAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJgotICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9IRE1JX1NZU1RFTV9BVURJT19FTkZPUkNFRCkgewotICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9ySERNSV9TWVNURU1fQVVESU8iLCBjb25maWcpOwotICAgICAgICB9Ci0gICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgdXNhZ2UgJWQiLCB1c2FnZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIGNoZWNrIGZvciBkZXZpY2UgYW5kIG91dHB1dCBjaGFuZ2VzIHRyaWdnZXJlZCBieSBuZXcgZm9yY2UgdXNhZ2UKLSAgICBjaGVja0EyZHBTdXNwZW5kKCk7Ci0gICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7Ci0gICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKLSAgICBpZiAobVBob25lU3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHRydWUgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgIHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZSk7Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gbU91dHB1dHMua2V5QXQoaSk7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0LCB0cnVlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICBpZiAoKG1QaG9uZVN0YXRlICE9IEFVRElPX01PREVfSU5fQ0FMTCkgfHwgKG91dHB1dCAhPSBtUHJpbWFyeU91dHB1dCkpIHsKLSAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXQsIG5ld0RldmljZSwgKG5ld0RldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmb3JjZVZvbHVtZVJlZXZhbCAmJiAobmV3RGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSkgewotICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG91dHB1dCwgbmV3RGV2aWNlLCAwLCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGF1ZGlvX2lvX2hhbmRsZV90IGFjdGl2ZUlucHV0ID0gZ2V0QWN0aXZlSW5wdXQoKTsKLSAgICBpZiAoYWN0aXZlSW5wdXQgIT0gMCkgewotICAgICAgICBzZXRJbnB1dERldmljZShhY3RpdmVJbnB1dCwgZ2V0TmV3SW5wdXREZXZpY2UoYWN0aXZlSW5wdXQpKTsKLSAgICB9Ci0KLX0KLQotYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkKLXsKLSAgICByZXR1cm4gbUZvcmNlVXNlW3VzYWdlXTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN5c3RlbVByb3BlcnR5KGNvbnN0IGNoYXIqIHByb3BlcnR5LCBjb25zdCBjaGFyKiB2YWx1ZSkKLXsKLSAgICBBTE9HVigic2V0U3lzdGVtUHJvcGVydHkoKSBwcm9wZXJ0eSAlcywgdmFsdWUgJXMiLCBwcm9wZXJ0eSwgdmFsdWUpOwotfQotCi0vLyBGaW5kIGEgZGlyZWN0IG91dHB1dCBwcm9maWxlIGNvbXBhdGlibGUgd2l0aCB0aGUgcGFyYW1ldGVycyBwYXNzZWQsIGV2ZW4gaWYgdGhlIGlucHV0IGZsYWdzIGRvCi0vLyBub3QgZXhwbGljaXRseSByZXF1ZXN0IGEgZGlyZWN0IG91dHB1dAotc3A8QXVkaW9Qb2xpY3lNYW5hZ2VyOjpJT1Byb2ZpbGU+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0UHJvZmlsZUZvckRpcmVjdE91dHB1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9PSAwKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdOwotICAgICAgICAgICAgYm9vbCBmb3VuZCA9IHByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2aWNlLCBTdHJpbmc4KCIiKSwgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICBOVUxMIC8qdXBkYXRlZFNhbXBsaW5nUmF0ZSovLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICBmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQgPwotICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCA6IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7Ci0gICAgICAgICAgICBpZiAoZm91bmQgJiYgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkgJiBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBwcm9maWxlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCi17Ci0gICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICBBTE9HVigiZ2V0T3V0cHV0KCkgZGV2aWNlICVkLCBzdHJlYW0gJWQsIHNhbXBsaW5nUmF0ZSAlZCwgZm9ybWF0ICV4LCBjaGFubmVsTWFzayAleCwgZmxhZ3MgJXgiLAotICAgICAgICAgIGRldmljZSwgc3RyZWFtLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzKTsKLQotICAgIHJldHVybiBnZXRPdXRwdXRGb3JEZXZpY2UoZGV2aWNlLCBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCBzYW1wbGluZ1JhdGUsZm9ybWF0LCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBvZmZsb2FkSW5mbyk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCi17Ci0gICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXM7Ci0gICAgaWYgKGF0dHIgIT0gTlVMTCkgewotICAgICAgICBpZiAoIWlzVmFsaWRBdHRyaWJ1dGVzKGF0dHIpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0cigpIGludmFsaWQgYXR0cmlidXRlczogdXNhZ2U9JWQgY29udGVudD0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCi0gICAgICAgICAgICAgICAgICBhdHRyLT51c2FnZSwgYXR0ci0+Y29udGVudF90eXBlLCBhdHRyLT5mbGFncywKLSAgICAgICAgICAgICAgICAgIGF0dHItPnRhZ3MpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBhdHRyaWJ1dGVzID0gKmF0dHI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCpzdHJlYW0gPCBBVURJT19TVFJFQU1fTUlOIHx8ICpzdHJlYW0gPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJnZXRPdXRwdXRGb3JBdHRyKCk6ICBpbnZhbGlkIHN0cmVhbSB0eXBlIik7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIHN0cmVhbV90eXBlX3RvX2F1ZGlvX2F0dHJpYnV0ZXMoKnN0cmVhbSwgJmF0dHJpYnV0ZXMpOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBvbGljeU1peGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYzsKLSAgICAgICAgaWYgKG1Qb2xpY3lNaXhlc1tpXS0+bU1peC5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Qb2xpY3lNaXhlc1tpXS0+bU1peC5tQ3JpdGVyaWEuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoKFJVTEVfTUFUQ0hfQVRUUklCVVRFX1VTQUdFID09IG1Qb2xpY3lNaXhlc1tpXS0+bU1peC5tQ3JpdGVyaWFbal0ubVJ1bGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lNaXhlc1tpXS0+bU1peC5tQ3JpdGVyaWFbal0ubUF0dHIubVVzYWdlID09IGF0dHJpYnV0ZXMudXNhZ2UpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChSVUxFX0VYQ0xVREVfQVRUUklCVVRFX1VTQUdFID09IG1Qb2xpY3lNaXhlc1tpXS0+bU1peC5tQ3JpdGVyaWFbal0ubVJ1bGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lNaXhlc1tpXS0+bU1peC5tQ3JpdGVyaWFbal0ubUF0dHIubVVzYWdlICE9IGF0dHJpYnV0ZXMudXNhZ2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc2MgPSBtUG9saWN5TWl4ZXNbaV0tPm1PdXRwdXQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgPT0gMCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MgKyBzdHJsZW4oImFkZHI9IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lNaXhlc1tpXS0+bU1peC5tUmVnaXN0cmF0aW9uSWQuc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtIHN0cmxlbigiYWRkcj0iKSAtIDEpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzYyA9IG1Qb2xpY3lNaXhlc1tpXS0+bU91dHB1dDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1Qb2xpY3lNaXhlc1tpXS0+bU1peC5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzLnVzYWdlID09IEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFICYmCi0gICAgICAgICAgICAgICAgICAgIHN0cm5jbXAoYXR0cmlidXRlcy50YWdzLCAiYWRkcj0iLCBzdHJsZW4oImFkZHI9IikpID09IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MgKyBzdHJsZW4oImFkZHI9IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeU1peGVzW2ldLT5tTWl4Lm1SZWdpc3RyYXRpb25JZC5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSBzdHJsZW4oImFkZHI9IikgLSAxKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZGVzYyA9IG1Qb2xpY3lNaXhlc1tpXS0+bU91dHB1dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZGVzYyAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXNjLT5tUG9saWN5TWl4ID0gJm1Qb2xpY3lNaXhlc1tpXS0+bU1peDsKLSAgICAgICAgICAgICpzdHJlYW0gPSBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoJmF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgKm91dHB1dCA9IGRlc2MtPm1Jb0hhbmRsZTsKLSAgICAgICAgICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkgcmV0dXJucyBvdXRwdXQgJWQiLCAqb3V0cHV0KTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoYXR0cmlidXRlcy51c2FnZSA9PSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSkgewotICAgICAgICBBTE9HVygiZ2V0T3V0cHV0Rm9yQXR0cigpIG5vIHBvbGljeSBtaXggZm91bmQgZm9yIHVzYWdlIEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFIik7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgQUxPR1YoImdldE91dHB1dEZvckF0dHIoKSB1c2FnZT0lZCwgY29udGVudD0lZCwgdGFnPSVzIGZsYWdzPSUwOHgiLAotICAgICAgICAgICAgYXR0cmlidXRlcy51c2FnZSwgYXR0cmlidXRlcy5jb250ZW50X3R5cGUsIGF0dHJpYnV0ZXMudGFncywgYXR0cmlidXRlcy5mbGFncyk7Ci0KLSAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gKHJvdXRpbmdfc3RyYXRlZ3kpIGdldFN0cmF0ZWd5Rm9yQXR0cigmYXR0cmlidXRlcyk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLQotICAgIGlmICgoYXR0cmlidXRlcy5mbGFncyAmIEFVRElPX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkgewotICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKTsKLSAgICB9Ci0KLSAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIGRldmljZSAweCV4LCBzYW1wbGluZ1JhdGUgJWQsIGZvcm1hdCAleCwgY2hhbm5lbE1hc2sgJXgsIGZsYWdzICV4IiwKLSAgICAgICAgICBkZXZpY2UsIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MpOwotCi0gICAgKnN0cmVhbSA9IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludCgmYXR0cmlidXRlcyk7Ci0gICAgKm91dHB1dCA9IGdldE91dHB1dEZvckRldmljZShkZXZpY2UsIHNlc3Npb24sICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgb2ZmbG9hZEluZm8pOwotICAgIGlmICgqb3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dEZvckRldmljZSgKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gX191bnVzZWQsCi0gICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCi17Ci0gICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgdWludDMyX3QgbGF0ZW5jeSA9IDA7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotCi0jaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKLSAgICBpZiAobUN1ck91dHB1dCAhPSAwKSB7Ci0gICAgICAgIEFMT0dWKCJnZXRPdXRwdXQoKSB0ZXN0IG91dHB1dCBtQ3VyT3V0cHV0ICVkLCBzYW1wbGluZ1JhdGUgJWQsIGZvcm1hdCAlZCwgY2hhbm5lbE1hc2sgJXgsIG1EaXJlY3RPdXRwdXQgJWQiLAotICAgICAgICAgICAgICAgIG1DdXJPdXRwdXQsIG1UZXN0U2FtcGxpbmdSYXRlLCBtVGVzdEZvcm1hdCwgbVRlc3RDaGFubmVscywgbURpcmVjdE91dHB1dCk7Ci0KLSAgICAgICAgaWYgKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgb3BlbmluZyB0ZXN0IG91dHB1dCIpOwotICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbmV3IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihOVUxMKTsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBtVGVzdERldmljZTsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1MYXRlbmN5ID0gbVRlc3RMYXRlbmN5TXM7Ci0gICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MgPQotICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKG1EaXJlY3RPdXRwdXQgPyBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QgOiAwKTsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID0gMDsKLSAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKLSAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IG1UZXN0U2FtcGxpbmdSYXRlOwotICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IG1UZXN0Q2hhbm5lbHM7Ci0gICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gbVRlc3RGb3JtYXQ7Ci0gICAgICAgICAgICBpZiAob2ZmbG9hZEluZm8gIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8gPSAqb2ZmbG9hZEluZm87Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dCgwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tTGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OwotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7Ci0gICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgb3V0cHV0Q21kID0gQXVkaW9QYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgICAgICBvdXRwdXRDbWQuYWRkSW50KFN0cmluZzgoInNldF9pZCIpLG1DdXJPdXRwdXQpOwotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSxvdXRwdXRDbWQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgYWRkT3V0cHV0KG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSwgb3V0cHV0RGVzYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XTsKLSAgICB9Ci0jZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotCi0gICAgLy8gb3BlbiBhIGRpcmVjdCBvdXRwdXQgaWYgcmVxdWlyZWQgYnkgc3BlY2lmaWVkIHBhcmFtZXRlcnMKLSAgICAvL2ZvcmNlIGRpcmVjdCBmbGFnIGlmIG9mZmxvYWQgZmxhZyBpcyBzZXQ6IG9mZmxvYWRpbmcgaW1wbGllcyBhIGRpcmVjdCBvdXRwdXQgc3RyZWFtCi0gICAgLy8gYW5kIGFsbCBjb21tb24gYmVoYXZpb3JzIGFyZSBkcml2ZW4gYnkgY2hlY2tpbmcgb25seSB0aGUgZGlyZWN0IGZsYWcKLSAgICAvLyB0aGlzIHNob3VsZCBub3JtYWxseSBiZSBzZXQgYXBwcm9wcmlhdGVseSBpbiB0aGUgcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZQotICAgIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSB7Ci0gICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7Ci0gICAgfQotICAgIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKSAhPSAwKSB7Ci0gICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7Ci0gICAgfQotICAgIC8vIG9ubHkgYWxsb3cgZGVlcCBidWZmZXJpbmcgZm9yIG11c2ljIHN0cmVhbSB0eXBlCi0gICAgaWYgKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fTVVTSUMpIHsKLSAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzICZ+QVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVIpOwotICAgIH0KLQotICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZTsKLQotICAgIC8vIHNraXAgZGlyZWN0IG91dHB1dCBzZWxlY3Rpb24gaWYgdGhlIHJlcXVlc3QgY2FuIG9idmlvdXNseSBiZSBhdHRhY2hlZCB0byBhIG1peGVkIG91dHB1dAotICAgIC8vIGFuZCBub3QgZXhwbGljaXRseSByZXF1ZXN0ZWQKLSAgICBpZiAoKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgPT0gMCkgJiYKLSAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSAmJiBzYW1wbGluZ1JhdGUgPD0gTUFYX01JWEVSX1NBTVBMSU5HX1JBVEUgJiYKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzaykgPD0gMikgewotICAgICAgICBnb3RvIG5vbl9kaXJlY3Rfb3V0cHV0OwotICAgIH0KLQotICAgIC8vIERvIG5vdCBhbGxvdyBvZmZsb2FkaW5nIGlmIG9uZSBub24gb2ZmbG9hZGFibGUgZWZmZWN0IGlzIGVuYWJsZWQuIFRoaXMgcHJldmVudHMgZnJvbQotICAgIC8vIGNyZWF0aW5nIGFuIG9mZmxvYWRlZCB0cmFjayBhbmQgdGVhcmluZyBpdCBkb3duIGltbWVkaWF0ZWx5IGFmdGVyIHN0YXJ0IHdoZW4gYXVkaW9mbGluZ2VyCi0gICAgLy8gZGV0ZWN0cyB0aGVyZSBpcyBhbiBhY3RpdmUgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdC4KLSAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGNoZWNrIHRoZSBhdWRpbyBzZXNzaW9uIGhlcmUgYnV0IHdlIGRvIG5vdCBoYXZlIGl0IGluIHRoaXMgY29udGV4dC4KLSAgICAvLyBUaGlzIG1heSBwcmV2ZW50IG9mZmxvYWRpbmcgaW4gcmFyZSBzaXR1YXRpb25zIHdoZXJlIGVmZmVjdHMgYXJlIGxlZnQgYWN0aXZlIGJ5IGFwcHMKLSAgICAvLyBpbiB0aGUgYmFja2dyb3VuZC4KLQotICAgIGlmICgoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgPT0gMCkgfHwKLSAgICAgICAgICAgICFpc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpKSB7Ci0gICAgICAgIHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdClmbGFncyk7Ci0gICAgfQotCi0gICAgaWYgKHByb2ZpbGUgIT0gMCkgewotICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBOVUxMOwotCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIChwcm9maWxlID09IGRlc2MtPm1Qcm9maWxlKSkgewotICAgICAgICAgICAgICAgIG91dHB1dERlc2MgPSBkZXNjOwotICAgICAgICAgICAgICAgIC8vIHJldXNlIGRpcmVjdCBvdXRwdXQgaWYgY3VycmVudGx5IG9wZW4gYW5kIGNvbmZpZ3VyZWQgd2l0aCBzYW1lIHBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICBpZiAoKHNhbXBsaW5nUmF0ZSA9PSBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdCA9PSBvdXRwdXREZXNjLT5tRm9ybWF0KSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IG91dHB1dERlc2MtPm1DaGFubmVsTWFzaykpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURpcmVjdE9wZW5Db3VudCsrOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgcmV1c2luZyBkaXJlY3Qgb3V0cHV0ICVkIiwgbU91dHB1dHMua2V5QXQoaSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbU91dHB1dHMua2V5QXQoaSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIGNsb3NlIGRpcmVjdCBvdXRwdXQgaWYgY3VycmVudGx5IG9wZW4gYW5kIGNvbmZpZ3VyZWQgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVycwotICAgICAgICBpZiAob3V0cHV0RGVzYyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXREZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICB9Ci0gICAgICAgIG91dHB1dERlc2MgPSBuZXcgQXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUpOwotICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gZGV2aWNlOwotICAgICAgICBvdXRwdXREZXNjLT5tTGF0ZW5jeSA9IDA7Ci0gICAgICAgIG91dHB1dERlc2MtPm1GbGFncyA9KGF1ZGlvX291dHB1dF9mbGFnc190KSAob3V0cHV0RGVzYy0+bUZsYWdzIHwgZmxhZ3MpOwotICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7Ci0gICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHNhbXBsaW5nUmF0ZTsKLSAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrOwotICAgICAgICBjb25maWcuZm9ybWF0ID0gZm9ybWF0OwotICAgICAgICBpZiAob2ZmbG9hZEluZm8gIT0gTlVMTCkgewotICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mbyA9ICpvZmZsb2FkSW5mbzsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChwcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tTGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzKTsKLQotICAgICAgICAvLyBvbmx5IGFjY2VwdCBhbiBvdXRwdXQgd2l0aCB0aGUgcmVxdWVzdGVkIHBhcmFtZXRlcnMKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fAotICAgICAgICAgICAgKHNhbXBsaW5nUmF0ZSAhPSAwICYmIHNhbXBsaW5nUmF0ZSAhPSBjb25maWcuc2FtcGxlX3JhdGUpIHx8Ci0gICAgICAgICAgICAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUICYmIGZvcm1hdCAhPSBjb25maWcuZm9ybWF0KSB8fAotICAgICAgICAgICAgKGNoYW5uZWxNYXNrICE9IDAgJiYgY2hhbm5lbE1hc2sgIT0gY29uZmlnLmNoYW5uZWxfbWFzaykpIHsKLSAgICAgICAgICAgIEFMT0dWKCJnZXRPdXRwdXQoKSBmYWlsZWQgb3BlbmluZyBkaXJlY3Qgb3V0cHV0OiBvdXRwdXQgJWQgc2FtcGxpbmdSYXRlICVkICVkLCIKLSAgICAgICAgICAgICAgICAgICAgImZvcm1hdCAlZCAlZCwgY2hhbm5lbE1hc2sgJTA0eCAlMDR4Iiwgb3V0cHV0LCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUsIGZvcm1hdCwgb3V0cHV0RGVzYy0+bUZvcm1hdCwgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBmYWxsIGJhY2sgdG8gbWl4ZXIgb3V0cHV0IGlmIHBvc3NpYmxlIHdoZW4gdGhlIGRpcmVjdCBvdXRwdXQgY291bGQgbm90IGJlIG9wZW4KLSAgICAgICAgICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgJiYgc2FtcGxpbmdSYXRlIDw9IE1BWF9NSVhFUl9TQU1QTElOR19SQVRFKSB7Ci0gICAgICAgICAgICAgICAgZ290byBub25fZGlyZWN0X291dHB1dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgfQotICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOwotICAgICAgICBvdXRwdXREZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKLSAgICAgICAgb3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPSAwOwotICAgICAgICBvdXRwdXREZXNjLT5tU3RvcFRpbWVbc3RyZWFtXSA9IDA7Ci0gICAgICAgIG91dHB1dERlc2MtPm1EaXJlY3RPcGVuQ291bnQgPSAxOwotCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dHB1dCA9IGdldE91dHB1dEZvckVmZmVjdCgpOwotICAgICAgICBhZGRPdXRwdXQob3V0cHV0LCBvdXRwdXREZXNjKTsKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRWZmZWN0KCk7Ci0gICAgICAgIGlmIChkc3RPdXRwdXQgPT0gb3V0cHV0KSB7Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+bW92ZUVmZmVjdHMoQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLCBzcmNPdXRwdXQsIGRzdE91dHB1dCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVByZXZpb3VzT3V0cHV0cyA9IG1PdXRwdXRzOwotICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgcmV0dXJucyBuZXcgZGlyZWN0IG91dHB1dCAlZCIsIG91dHB1dCk7Ci0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKLSAgICAgICAgcmV0dXJuIG91dHB1dDsKLSAgICB9Ci0KLW5vbl9kaXJlY3Rfb3V0cHV0OgotCi0gICAgLy8gaWdub3JpbmcgY2hhbm5lbCBtYXNrIGR1ZSB0byBkb3dubWl4IGNhcGFiaWxpdHkgaW4gbWl4ZXIKLQotICAgIC8vIG9wZW4gYSBub24gZGlyZWN0IG91dHB1dAotCi0gICAgLy8gZm9yIG5vbiBkaXJlY3Qgb3V0cHV0cywgb25seSBQQ00gaXMgc3VwcG9ydGVkCi0gICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgewotICAgICAgICAvLyBnZXQgd2hpY2ggb3V0cHV0IGlzIHN1aXRhYmxlIGZvciB0aGUgc3BlY2lmaWVkIHN0cmVhbS4gVGhlIGFjdHVhbAotICAgICAgICAvLyByb3V0aW5nIGNoYW5nZSB3aWxsIGhhcHBlbiB3aGVuIHN0YXJ0T3V0cHV0KCkgd2lsbCBiZSBjYWxsZWQKLSAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShkZXZpY2UsIG1PdXRwdXRzKTsKLQotICAgICAgICAvLyBhdCB0aGlzIHN0YWdlIHdlIHNob3VsZCBpZ25vcmUgdGhlIERJUkVDVCBmbGFnIGFzIG5vIGRpcmVjdCBvdXRwdXQgY291bGQgYmUgZm91bmQgZWFybGllcgotICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKLSAgICAgICAgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsIGZsYWdzLCBmb3JtYXQpOwotICAgIH0KLSAgICBBTE9HV19JRigob3V0cHV0ID09IDApLCAiZ2V0T3V0cHV0KCkgY291bGQgbm90IGZpbmQgb3V0cHV0IGZvciBzdHJlYW0gJWQsIHNhbXBsaW5nUmF0ZSAlZCwiCi0gICAgICAgICAgICAiZm9ybWF0ICVkLCBjaGFubmVscyAleCwgZmxhZ3MgJXgiLCBzdHJlYW0sIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MpOwotCi0gICAgQUxPR1YoImdldE91dHB1dCgpIHJldHVybnMgb3V0cHV0ICVkIiwgb3V0cHV0KTsKLQotICAgIHJldHVybiBvdXRwdXQ7Ci19Ci0KLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2VsZWN0T3V0cHV0KGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQotewotICAgIC8vIHNlbGVjdCBvbmUgb3V0cHV0IGFtb25nIHNldmVyYWwgdGhhdCBwcm92aWRlIGEgcGF0aCB0byBhIHBhcnRpY3VsYXIgZGV2aWNlIG9yIHNldCBvZgotICAgIC8vIGRldmljZXMgKHRoZSBsaXN0IHdhcyBwcmV2aW91c2x5IGJ1aWxkIGJ5IGdldE91dHB1dHNGb3JEZXZpY2UoKSkuCi0gICAgLy8gVGhlIHByaW9yaXR5IGlzIGFzIGZvbGxvd3M6Ci0gICAgLy8gMTogdGhlIG91dHB1dCB3aXRoIHRoZSBoaWdoZXN0IG51bWJlciBvZiByZXF1ZXN0ZWQgcG9saWN5IGZsYWdzCi0gICAgLy8gMjogdGhlIHByaW1hcnkgb3V0cHV0Ci0gICAgLy8gMzogdGhlIGZpcnN0IG91dHB1dCBpbiB0aGUgbGlzdAotCi0gICAgaWYgKG91dHB1dHMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChvdXRwdXRzLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgIHJldHVybiBvdXRwdXRzWzBdOwotICAgIH0KLQotICAgIGludCBtYXhDb21tb25GbGFncyA9IDA7Ci0gICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0RmxhZ3MgPSAwOwotICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dFByaW1hcnkgPSAwOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHNbaV0pOwotICAgICAgICBpZiAoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7Ci0gICAgICAgICAgICAvLyBpZiBhIHZhbGlkIGZvcm1hdCBpcyBzcGVjaWZpZWQsIHNraXAgb3V0cHV0IGlmIG5vdCBjb21wYXRpYmxlCi0gICAgICAgICAgICBpZiAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElEKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IG91dHB1dERlc2MtPm1Gb3JtYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGNvbW1vbkZsYWdzID0gcG9wY291bnQob3V0cHV0RGVzYy0+bVByb2ZpbGUtPm1GbGFncyAmIGZsYWdzKTsKLSAgICAgICAgICAgIGlmIChjb21tb25GbGFncyA+IG1heENvbW1vbkZsYWdzKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RmxhZ3MgPSBvdXRwdXRzW2ldOwotICAgICAgICAgICAgICAgIG1heENvbW1vbkZsYWdzID0gY29tbW9uRmxhZ3M7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInNlbGVjdE91dHB1dCgpIGNvbW1vbkZsYWdzIGZvciBvdXRwdXQgJWQsICUwNHgiLCBvdXRwdXRzW2ldLCBjb21tb25GbGFncyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVByb2ZpbGUtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRQcmltYXJ5ID0gb3V0cHV0c1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChvdXRwdXRGbGFncyAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBvdXRwdXRGbGFnczsKLSAgICB9Ci0gICAgaWYgKG91dHB1dFByaW1hcnkgIT0gMCkgewotICAgICAgICByZXR1cm4gb3V0cHV0UHJpbWFyeTsKLSAgICB9Ci0KLSAgICByZXR1cm4gb3V0cHV0c1swXTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQotewotICAgIEFMT0dWKCJzdGFydE91dHB1dCgpIG91dHB1dCAlZCwgc3RyZWFtICVkLCBzZXNzaW9uICVkIiwgb3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOwotICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KG91dHB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygic3RhcnRPdXRwdXQoKSB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgLy8gY2Fubm90IHN0YXJ0IHBsYXliYWNrIG9mIFNUUkVBTV9UVFMgaWYgYW55IG90aGVyIG91dHB1dCBpcyBiZWluZyB1c2VkCi0gICAgdWludDMyX3QgYmVhY29uTXV0ZUxhdGVuY3kgPSAwOwotICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1RUUykgewotICAgICAgICBBTE9HVigiXHQgZm91bmQgQkVBQ09OIHN0cmVhbSIpOwotICAgICAgICBpZiAoaXNBbnlPdXRwdXRBY3RpdmUoQVVESU9fU1RSRUFNX1RUUyAvKnN0cmVhbVRvSWdub3JlKi8pKSB7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBiZWFjb25NdXRlTGF0ZW5jeSA9IGhhbmRsZUV2ZW50Rm9yQmVhY29uKFNUQVJUSU5HX0JFQUNPTik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAvLyBzb21lIHBsYXliYWNrIG90aGVyIHRoYW4gYmVhY29uIHN0YXJ0cwotICAgICAgICBiZWFjb25NdXRlTGF0ZW5jeSA9IGhhbmRsZUV2ZW50Rm9yQmVhY29uKFNUQVJUSU5HX09VVFBVVCk7Ci0gICAgfQotCi0gICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7Ci0KLSAgICAvLyBpbmNyZW1lbnQgdXNhZ2UgY291bnQgZm9yIHRoaXMgc3RyZWFtIG9uIHRoZSByZXF1ZXN0ZWQgb3V0cHV0OgotICAgIC8vIE5PVEUgdGhhdCB0aGUgdXNhZ2UgY291bnQgaXMgdGhlIHNhbWUgZm9yIGR1cGxpY2F0ZWQgb3V0cHV0IGFuZCBoYXJkd2FyZSBvdXRwdXQgd2hpY2ggaXMKLSAgICAvLyBuZWNlc3NhcnkgZm9yIGEgY29ycmVjdCBjb250cm9sIG9mIGhhcmR3YXJlIG91dHB1dCByb3V0aW5nIGJ5IHN0YXJ0T3V0cHV0KCkgYW5kIHN0b3BPdXRwdXQoKQotICAgIG91dHB1dERlc2MtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgMSk7Ci0KLSAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPT0gMSkgewotICAgICAgICAvLyBzdGFydGluZyBhbiBvdXRwdXQgYmVpbmcgcmVyb3V0ZWQ/Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2U7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG5ld0RldmljZSA9IEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICB9Ci0gICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOwotICAgICAgICBib29sIHNob3VsZFdhaXQgPSAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmVhY29uTXV0ZUxhdGVuY3kgPiAwKTsKLSAgICAgICAgdWludDMyX3Qgd2FpdE1zID0gYmVhY29uTXV0ZUxhdGVuY3k7Ci0gICAgICAgIGJvb2wgZm9yY2UgPSBmYWxzZTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGlmIChkZXNjICE9IG91dHB1dERlc2MpIHsKLSAgICAgICAgICAgICAgICAvLyBmb3JjZSBhIGRldmljZSBjaGFuZ2UgaWYgYW55IG90aGVyIG91dHB1dCBpcyBtYW5hZ2VkIGJ5IHRoZSBzYW1lIGh3Ci0gICAgICAgICAgICAgICAgLy8gbW9kdWxlIGFuZCBoYXMgYSBjdXJyZW50IGRldmljZSBzZWxlY3Rpb24gdGhhdCBkaWZmZXJzIGZyb20gc2VsZWN0ZWQgZGV2aWNlLgotICAgICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlIGF1ZGlvIEhBTCBtdXN0IHJlY2VpdmUgdGhlIG5ldyBkZXZpY2Ugc2VsZWN0aW9uIHNvIHRoYXQgaXQgY2FuCi0gICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBkZXZpY2UgY3VycmVudGx5IHNlbGVjdGVkIGJ5IHRoZSBvdGhlciBhY3RpdmUgb3V0cHV0LgotICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5zaGFyZXNId01vZHVsZVdpdGgoZGVzYykgJiYKLSAgICAgICAgICAgICAgICAgICAgZGVzYy0+ZGV2aWNlKCkgIT0gbmV3RGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcmNlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgYXVkaW8gb24gb3RoZXIgYWN0aXZlIG91dHB1dHMgdG8gYmUgcHJlc2VudGVkIHdoZW4gc3RhcnRpbmcKLSAgICAgICAgICAgICAgICAvLyBhIG5vdGlmaWNhdGlvbiBzbyB0aGF0IGF1ZGlvIGZvY3VzIGVmZmVjdCBjYW4gcHJvcGFnYXRlLCBvciB0aGF0IGEgbXV0ZS91bm11dGUKLSAgICAgICAgICAgICAgICAvLyBldmVudCBvY2N1cnJlZCBmb3IgYmVhY29uCi0gICAgICAgICAgICAgICAgdWludDMyX3QgbGF0ZW5jeSA9IGRlc2MtPmxhdGVuY3koKTsKLSAgICAgICAgICAgICAgICBpZiAoc2hvdWxkV2FpdCAmJiBkZXNjLT5pc0FjdGl2ZShsYXRlbmN5ICogMikgJiYgKHdhaXRNcyA8IGxhdGVuY3kpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdhaXRNcyA9IGxhdGVuY3k7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHVpbnQzMl90IG11dGVXYWl0TXMgPSBzZXRPdXRwdXREZXZpY2Uob3V0cHV0LCBuZXdEZXZpY2UsIGZvcmNlKTsKLQotICAgICAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNlIGZvciBzb25pZmljYXRpb24gd2hpbGUgaW4gY2FsbAotICAgICAgICBpZiAoaXNJbkNhbGwoKSkgewotICAgICAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKHN0cmVhbSwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYXBwbHkgdm9sdW1lIHJ1bGVzIGZvciBjdXJyZW50IHN0cmVhbSBhbmQgZGV2aWNlIGlmIG5lY2Vzc2FyeQotICAgICAgICBjaGVja0FuZFNldFZvbHVtZShzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1zW3N0cmVhbV0uZ2V0Vm9sdW1lSW5kZXgobmV3RGV2aWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEZXZpY2UpOwotCi0gICAgICAgIC8vIHVwZGF0ZSB0aGUgb3V0cHV0cyBpZiBzdGFydGluZyBhbiBvdXRwdXQgd2l0aCBhIHN0cmVhbSB0aGF0IGNhbiBhZmZlY3Qgbm90aWZpY2F0aW9uCi0gICAgICAgIC8vIHJvdXRpbmcKLSAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uUm91dGluZ0ZvclN0cmVhbShzdHJlYW0pOwotCi0gICAgICAgIC8vIEF1dG9tYXRpY2FsbHkgZW5hYmxlIHRoZSByZW1vdGUgc3VibWl4IGlucHV0IHdoZW4gb3V0cHV0IGlzIHN0YXJ0ZWQgb24gYSByZSByb3V0aW5nIG1peAotICAgICAgICAvLyBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUwotICAgICAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UobmV3RGV2aWNlKSAmJiBvdXRwdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwgJiYKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKLSAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Qb2xpY3lNaXgtPm1SZWdpc3RyYXRpb25JZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmb3JjZSByZWV2YWx1YXRpbmcgYWNjZXNzaWJpbGl0eSByb3V0aW5nIHdoZW4gcmluZ3RvbmUgb3IgYWxhcm0gc3RhcnRzCi0gICAgICAgIGlmIChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHsKLSAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh3YWl0TXMgPiBtdXRlV2FpdE1zKSB7Ci0gICAgICAgICAgICB1c2xlZXAoKHdhaXRNcyAtIG11dGVXYWl0TXMpICogMiAqIDEwMDApOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCi17Ci0gICAgQUxPR1YoInN0b3BPdXRwdXQoKSBvdXRwdXQgJWQsIHN0cmVhbSAlZCwgc2Vzc2lvbiAlZCIsIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInN0b3BPdXRwdXQoKSB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7Ci0KLSAgICAvLyBhbHdheXMgaGFuZGxlIHN0cmVhbSBzdG9wLCBjaGVjayB3aGljaCBzdHJlYW0gdHlwZSBpcyBzdG9wcGluZwotICAgIGhhbmRsZUV2ZW50Rm9yQmVhY29uKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVFRTID8gU1RPUFBJTkdfQkVBQ09OIDogU1RPUFBJTkdfT1VUUFVUKTsKLQotICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIHNvbmlmaWNhdGlvbiB3aGlsZSBpbiBjYWxsCi0gICAgaWYgKGlzSW5DYWxsKCkpIHsKLSAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKHN0cmVhbSwgZmFsc2UsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPiAwKSB7Ci0gICAgICAgIC8vIGRlY3JlbWVudCB1c2FnZSBjb3VudCBvZiB0aGlzIHN0cmVhbSBvbiB0aGUgb3V0cHV0Ci0gICAgICAgIG91dHB1dERlc2MtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgLTEpOwotICAgICAgICAvLyBzdG9yZSB0aW1lIGF0IHdoaWNoIHRoZSBzdHJlYW0gd2FzIHN0b3BwZWQgLSBzZWUgaXNTdHJlYW1BY3RpdmUoKQotICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPT0gMCkgewotICAgICAgICAgICAgLy8gQXV0b21hdGljYWxseSBkaXNhYmxlIHRoZSByZW1vdGUgc3VibWl4IGlucHV0IHdoZW4gb3V0cHV0IGlzIHN0b3BwZWQgb24gYQotICAgICAgICAgICAgLy8gcmUgcm91dGluZyBtaXggb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKLSAgICAgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShvdXRwdXREZXNjLT5tRGV2aWNlKSAmJgotICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwgJiYKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7Ci0gICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAotICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Qb2xpY3lNaXgtPm1SZWdpc3RyYXRpb25JZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1TdG9wVGltZVtzdHJlYW1dID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICAgICAgLy8gZGVsYXkgdGhlIGRldmljZSBzd2l0Y2ggYnkgdHdpY2UgdGhlIGxhdGVuY3kgYmVjYXVzZSBzdG9wT3V0cHV0KCkgaXMgZXhlY3V0ZWQgd2hlbgotICAgICAgICAgICAgLy8gdGhlIHRyYWNrIHN0b3AoKSBjb21tYW5kIGlzIHJlY2VpdmVkIGFuZCBhdCB0aGF0IHRpbWUgdGhlIGF1ZGlvIHRyYWNrIGJ1ZmZlciBjYW4KLSAgICAgICAgICAgIC8vIHN0aWxsIGNvbnRhaW4gZGF0YSB0aGF0IG5lZWRzIHRvIGJlIGRyYWluZWQuIFRoZSBsYXRlbmN5IG9ubHkgY292ZXJzIHRoZSBhdWRpbyBIQUwKLSAgICAgICAgICAgIC8vIGFuZCBrZXJuZWwgYnVmZmVycy4gQWxzbyB0aGUgbGF0ZW5jeSBkb2VzIG5vdCBhbHdheXMgaW5jbHVkZSBhZGRpdGlvbmFsIGRlbGF5IGluIHRoZQotICAgICAgICAgICAgLy8gYXVkaW8gcGF0aCAoYXVkaW8gRFNQLCBDT0RFQyAuLi4pCi0gICAgICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0LCBuZXdEZXZpY2UsIGZhbHNlLCBvdXRwdXREZXNjLT5tTGF0ZW5jeSoyKTsKLQotICAgICAgICAgICAgLy8gZm9yY2UgcmVzdG9yaW5nIHRoZSBkZXZpY2Ugc2VsZWN0aW9uIG9uIG90aGVyIGFjdGl2ZSBvdXRwdXRzIGlmIGl0IGRpZmZlcnMgZnJvbSB0aGUKLSAgICAgICAgICAgIC8vIG9uZSBiZWluZyBzZWxlY3RlZCBmb3IgdGhpcyBvdXRwdXQKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBjdXJPdXRwdXQgPSBtT3V0cHV0cy5rZXlBdChpKTsKLSAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgICAgIGlmIChjdXJPdXRwdXQgIT0gb3V0cHV0ICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5pc0FjdGl2ZSgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5zaGFyZXNId01vZHVsZVdpdGgoZGVzYykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChuZXdEZXZpY2UgIT0gZGVzYy0+ZGV2aWNlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShjdXJPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROZXdPdXRwdXREZXZpY2UoY3VyT3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tTGF0ZW5jeSoyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyB1cGRhdGUgdGhlIG91dHB1dHMgaWYgc3RvcHBpbmcgb25lIHdpdGggYSBzdHJlYW0gdGhhdCBjYW4gYWZmZWN0IG5vdGlmaWNhdGlvbiByb3V0aW5nCi0gICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25Sb3V0aW5nRm9yU3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCJzdG9wT3V0cHV0KCkgcmVmY291bnQgaXMgYWxyZWFkeSAwIGZvciBvdXRwdXQgJWQiLCBvdXRwdXQpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSBfX3VudXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uIF9fdW51c2VkKQotewotICAgIEFMT0dWKCJyZWxlYXNlT3V0cHV0KCkgJWQiLCBvdXRwdXQpOwotICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KG91dHB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygicmVsZWFzZU91dHB1dCgpIHJlbGVhc2luZyB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAotICAgIGludCB0ZXN0SW5kZXggPSB0ZXN0T3V0cHV0SW5kZXgob3V0cHV0KTsKLSAgICBpZiAodGVzdEluZGV4ICE9IDApIHsKLSAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0FjdGl2ZSgpKSB7Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKLSAgICAgICAgICAgIG1PdXRwdXRzLnJlbW92ZUl0ZW0ob3V0cHV0KTsKLSAgICAgICAgICAgIG1UZXN0T3V0cHV0c1t0ZXN0SW5kZXhdID0gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKLQotICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOwotICAgIGlmIChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpIHsKLSAgICAgICAgaWYgKGRlc2MtPm1EaXJlY3RPcGVuQ291bnQgPD0gMCkgewotICAgICAgICAgICAgQUxPR1coInJlbGVhc2VPdXRwdXQoKSBpbnZhbGlkIG9wZW4gY291bnQgJWQgZm9yIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1EaXJlY3RPcGVuQ291bnQsIG91dHB1dCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKC0tZGVzYy0+bURpcmVjdE9wZW5Db3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXQpOwotICAgICAgICAgICAgLy8gSWYgZWZmZWN0cyB3aGVyZSBwcmVzZW50IG9uIHRoZSBvdXRwdXQsIGF1ZGlvZmxpbmdlciBtb3ZlZCB0aGVtIHRvIHRoZSBwcmltYXJ5Ci0gICAgICAgICAgICAvLyBvdXRwdXQgYnkgZGVmYXVsdDogbW92ZSB0aGVtIGJhY2sgdG8gdGhlIGFwcHJvcHJpYXRlIG91dHB1dC4KLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdE91dHB1dCA9IGdldE91dHB1dEZvckVmZmVjdCgpOwotICAgICAgICAgICAgaWYgKGRzdE91dHB1dCAhPSBtUHJpbWFyeU91dHB1dCkgewotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5tb3ZlRWZmZWN0cyhBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsIG1QcmltYXJ5T3V0cHV0LCBkc3RPdXRwdXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfdHlwZV90ICppbnB1dFR5cGUpCi17Ci0gICAgQUxPR1YoImdldElucHV0Rm9yQXR0cigpIHNvdXJjZSAlZCwgc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJWQsIGNoYW5uZWxNYXNrICV4LCIKLSAgICAgICAgICAgICJzZXNzaW9uICVkLCBmbGFncyAlI3giLAotICAgICAgICAgIGF0dHItPnNvdXJjZSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBzZXNzaW9uLCBmbGFncyk7Ci0KLSAgICAqaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX0lOVkFMSUQ7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZTsKLSAgICAvLyBoYW5kbGUgbGVnYWN5IHJlbW90ZSBzdWJtaXggY2FzZSB3aGVyZSB0aGUgYWRkcmVzcyB3YXMgbm90IGFsd2F5cyBzcGVjaWZpZWQKLSAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KCIiKTsKLSAgICBib29sIGlzU291bmRUcmlnZ2VyID0gZmFsc2U7Ci0gICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UgPSBhdHRyLT5zb3VyY2U7Ci0gICAgYXVkaW9fc291cmNlX3QgaGFsSW5wdXRTb3VyY2U7Ci0gICAgQXVkaW9NaXggKnBvbGljeU1peCA9IE5VTEw7Ci0KLSAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0RFRkFVTFQpIHsKLSAgICAgICAgaW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDOwotICAgIH0KLSAgICBoYWxJbnB1dFNvdXJjZSA9IGlucHV0U291cmNlOwotCi0gICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYICYmCi0gICAgICAgICAgICBzdHJuY21wKGF0dHItPnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgPT0gMCkgewotICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWDsKLSAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoYXR0ci0+dGFncyArIHN0cmxlbigiYWRkcj0iKSk7Ci0gICAgICAgIHNzaXplX3QgaW5kZXggPSBtUG9saWN5TWl4ZXMuaW5kZXhPZktleShhZGRyZXNzKTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIG5vIHBvbGljeSBmb3IgYWRkcmVzcyAlcyIsIGFkZHJlc3Muc3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVBvbGljeU1peGVzW2luZGV4XS0+bU1peC5tTWl4VHlwZSAhPSBNSVhfVFlQRV9QTEFZRVJTKSB7Ci0gICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgYmFkIHBvbGljeSBtaXggdHlwZSBmb3IgYWRkcmVzcyAlcyIsIGFkZHJlc3Muc3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBwb2xpY3lNaXggPSAmbVBvbGljeU1peGVzW2luZGV4XS0+bU1peDsKLSAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9NSVhfRVhUX1BPTElDWV9SRVJPVVRFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGlucHV0U291cmNlLCAmcG9saWN5TWl4KTsKLSAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGNvdWxkIG5vdCBmaW5kIGRldmljZSBmb3Igc291cmNlICVkIiwgaW5wdXRTb3VyY2UpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAocG9saWN5TWl4ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGFkZHJlc3MgPSBwb2xpY3lNaXgtPm1SZWdpc3RyYXRpb25JZDsKLSAgICAgICAgICAgIGlmIChwb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgewotICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIGFuIGV4dGVybmFsIHBvbGljeSwgYnV0IHRoaXMgaW5wdXQgaXMgYXR0YWNoZWQgdG8gYSBtaXggb2YgcmVjb3JkZXJzLAotICAgICAgICAgICAgICAgIC8vIG1lYW5pbmcgaXQgcmVjZWl2ZXMgYXVkaW8gaW5qZWN0ZWQgaW50byB0aGUgZnJhbWV3b3JrLCBzbyB0aGUgcmVjb3JkZXIgZG9lc24ndAotICAgICAgICAgICAgICAgIC8vIGtub3cgYWJvdXQgaXQgYW5kIGlzIHRoZXJlZm9yZSBjb25zaWRlcmVkICJsZWdhY3kiCi0gICAgICAgICAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9MRUdBQ1k7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHJlY29yZGluZyBhIG1peCBvZiBwbGF5ZXJzIGRlZmluZWQgYnkgYW4gZXh0ZXJuYWwgcG9saWN5LCB3ZSdyZSByZXJvdXRpbmcgZm9yCi0gICAgICAgICAgICAgICAgLy8gYW4gZXh0ZXJuYWwgcG9saWN5Ci0gICAgICAgICAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9NSVhfRVhUX1BPTElDWV9SRVJPVVRFOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KCIwIik7Ci0gICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX01JWF9DQVBUVVJFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9MRUdBQ1k7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gYWRhcHQgY2hhbm5lbCBzZWxlY3Rpb24gdG8gaW5wdXQgc291cmNlCi0gICAgICAgIHN3aXRjaCAoaW5wdXRTb3VyY2UpIHsKLSAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOgotICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX1VQTElOSzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSzoKLSAgICAgICAgICAgIGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9ETkxJTks7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTDoKLSAgICAgICAgICAgIGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTksgfCBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOSzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7Ci0gICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbVNvdW5kVHJpZ2dlclNlc3Npb25zLmluZGV4T2ZLZXkoc2Vzc2lvbik7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICppbnB1dCA9IG1Tb3VuZFRyaWdnZXJTZXNzaW9ucy52YWx1ZUZvcihzZXNzaW9uKTsKLSAgICAgICAgICAgICAgICBpc1NvdW5kVHJpZ2dlciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkoZmxhZ3MgfCBBVURJT19JTlBVVF9GTEFHX0hXX0hPVFdPUkQpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJTb3VuZFRyaWdnZXIgY2FwdHVyZSBvbiBzZXNzaW9uICVkIGlucHV0ICVkIiwgc2Vzc2lvbiwgKmlucHV0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaGFsSW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBnZXRJbnB1dFByb2ZpbGUoZGV2aWNlLCBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLSAgICBpZiAocHJvZmlsZSA9PSAwKSB7Ci0gICAgICAgIC8vcmV0cnkgd2l0aG91dCBmbGFncwotICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGxvZ19mbGFncyA9IGZsYWdzOwotICAgICAgICBmbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsKLSAgICAgICAgcHJvZmlsZSA9IGdldElucHV0UHJvZmlsZShkZXZpY2UsIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLSAgICAgICAgaWYgKHByb2ZpbGUgPT0gMCkgewotICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGNvdWxkIG5vdCBmaW5kIHByb2ZpbGUgZm9yIGRldmljZSAweCVYLCBzYW1wbGluZ1JhdGUgJXUsIgotICAgICAgICAgICAgICAgICAgICAiZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgMHglWCwgZmxhZ3MgJSN4IiwKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGxvZ19mbGFncyk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGUgPT0gMCkgewotICAgICAgICBBTE9HRSgiZ2V0SW5wdXRGb3JBdHRyKCk6IEhXIG1vZHVsZSAlcyBub3Qgb3BlbmVkIiwgcHJvZmlsZS0+bU1vZHVsZS0+bU5hbWUpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7Ci0gICAgY29uZmlnLnNhbXBsZV9yYXRlID0gc2FtcGxpbmdSYXRlOwotICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBjaGFubmVsTWFzazsKLSAgICBjb25maWcuZm9ybWF0ID0gZm9ybWF0OwotCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5JbnB1dChwcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxJbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQotICAgIC8vIG9ubHkgYWNjZXB0IGlucHV0IHdpdGggdGhlIGV4YWN0IHJlcXVlc3RlZCBzZXQgb2YgcGFyYW1ldGVycwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwgKmlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FIHx8Ci0gICAgICAgIChzYW1wbGluZ1JhdGUgIT0gY29uZmlnLnNhbXBsZV9yYXRlKSB8fAotICAgICAgICAoZm9ybWF0ICE9IGNvbmZpZy5mb3JtYXQpIHx8Ci0gICAgICAgIChjaGFubmVsTWFzayAhPSBjb25maWcuY2hhbm5lbF9tYXNrKSkgewotICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgZmFpbGVkIG9wZW5pbmcgaW5wdXQ6IHNhbXBsaW5nUmF0ZSAlZCwgZm9ybWF0ICVkLCBjaGFubmVsTWFzayAleCIsCi0gICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKLSAgICAgICAgaWYgKCppbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQoKmlucHV0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBuZXcgQXVkaW9JbnB1dERlc2NyaXB0b3IocHJvZmlsZSk7Ci0gICAgaW5wdXREZXNjLT5tSW5wdXRTb3VyY2UgPSBpbnB1dFNvdXJjZTsKLSAgICBpbnB1dERlc2MtPm1SZWZDb3VudCA9IDA7Ci0gICAgaW5wdXREZXNjLT5tT3BlblJlZkNvdW50ID0gMTsKLSAgICBpbnB1dERlc2MtPm1TYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7Ci0gICAgaW5wdXREZXNjLT5tRm9ybWF0ID0gZm9ybWF0OwotICAgIGlucHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7Ci0gICAgaW5wdXREZXNjLT5tRGV2aWNlID0gZGV2aWNlOwotICAgIGlucHV0RGVzYy0+bVNlc3Npb25zLmFkZChzZXNzaW9uKTsKLSAgICBpbnB1dERlc2MtPm1Jc1NvdW5kVHJpZ2dlciA9IGlzU291bmRUcmlnZ2VyOwotICAgIGlucHV0RGVzYy0+bVBvbGljeU1peCA9IHBvbGljeU1peDsKLQotICAgIEFMT0dWKCJnZXRJbnB1dEZvckF0dHIoKSByZXR1cm5zIGlucHV0IHR5cGUgPSAlZCIsIGlucHV0VHlwZSk7Ci0KLSAgICBhZGRJbnB1dCgqaW5wdXQsIGlucHV0RGVzYyk7Ci0gICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQotewotICAgIEFMT0dWKCJzdGFydElucHV0KCkgaW5wdXQgJWQiLCBpbnB1dCk7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleShpbnB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygic3RhcnRJbnB1dCgpIHVua25vd24gaW5wdXQgJWQiLCBpbnB1dCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOwotCi0gICAgaW5kZXggPSBpbnB1dERlc2MtPm1TZXNzaW9ucy5pbmRleE9mKHNlc3Npb24pOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoKSB1bmtub3duIHNlc3Npb24gJWQgb24gaW5wdXQgJWQiLCBzZXNzaW9uLCBpbnB1dCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgLy8gdmlydHVhbCBpbnB1dCBkZXZpY2VzIGFyZSBjb21wYXRpYmxlIHdpdGggb3RoZXIgaW5wdXQgZGV2aWNlcwotICAgIGlmICghaXNWaXJ0dWFsSW5wdXREZXZpY2UoaW5wdXREZXNjLT5tRGV2aWNlKSkgewotCi0gICAgICAgIC8vIGZvciBhIG5vbi12aXJ0dWFsIGlucHV0IGRldmljZSwgY2hlY2sgaWYgdGhlcmUgaXMgYW5vdGhlciAobm9uLXZpcnR1YWwpIGFjdGl2ZSBpbnB1dAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhY3RpdmVJbnB1dCA9IGdldEFjdGl2ZUlucHV0KCk7Ci0gICAgICAgIGlmIChhY3RpdmVJbnB1dCAhPSAwICYmIGFjdGl2ZUlucHV0ICE9IGlucHV0KSB7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSBhbHJlYWR5IGFjdGl2ZSBpbnB1dCB1c2VzIEFVRElPX1NPVVJDRV9IT1RXT1JEIHRoZW4gaXQgaXMgY2xvc2VkLAotICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHRoZSBhY3RpdmUgaW5wdXQgY29udGludWVzIGFuZCB0aGUgbmV3IGlucHV0IGNhbm5vdCBiZSBzdGFydGVkLgotICAgICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGFjdGl2ZURlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKGFjdGl2ZUlucHV0KTsKLSAgICAgICAgICAgIGlmIChhY3RpdmVEZXNjLT5tSW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygic3RhcnRJbnB1dCglZCkgcHJlZW1wdGluZyBsb3ctcHJpb3JpdHkgaW5wdXQgJWQiLCBpbnB1dCwgYWN0aXZlSW5wdXQpOwotICAgICAgICAgICAgICAgIHN0b3BJbnB1dChhY3RpdmVJbnB1dCwgYWN0aXZlRGVzYy0+bVNlc3Npb25zLml0ZW1BdCgwKSk7Ci0gICAgICAgICAgICAgICAgcmVsZWFzZUlucHV0KGFjdGl2ZUlucHV0LCBhY3RpdmVEZXNjLT5tU2Vzc2lvbnMuaXRlbUF0KDApKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoInN0YXJ0SW5wdXQoJWQpIGZhaWxlZDogb3RoZXIgaW5wdXQgJWQgYWxyZWFkeSBzdGFydGVkIiwgaW5wdXQsIGFjdGl2ZUlucHV0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaW5wdXREZXNjLT5tUmVmQ291bnQgPT0gMCkgewotICAgICAgICBpZiAoYWN0aXZlSW5wdXRzQ291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgICBTb3VuZFRyaWdnZXI6OnNldENhcHR1cmVTdGF0ZSh0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dCwgZ2V0TmV3SW5wdXREZXZpY2UoaW5wdXQpLCB0cnVlIC8qIGZvcmNlICovKTsKLQotICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGVuYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBvdXRwdXQgd2hlbiBpbnB1dCBpcyBzdGFydGVkIGlmIG5vdAotICAgICAgICAvLyB1c2VkIGJ5IGEgcG9saWN5IG1peCBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUwotICAgICAgICAvLyBGb3IgcmVtb3RlIHN1Ym1peCAoYSB2aXJ0dWFsIGRldmljZSksIHdlIG9wZW4gb25seSBvbmUgaW5wdXQgcGVyIGNhcHR1cmUgcmVxdWVzdC4KLSAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGlucHV0RGVzYy0+bURldmljZSkpIHsKLSAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IFN0cmluZzgoIiIpOwotICAgICAgICAgICAgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7Ci0gICAgICAgICAgICAgICAgYWRkcmVzcyA9IGlucHV0RGVzYy0+bVBvbGljeU1peC0+bVJlZ2lzdHJhdGlvbklkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFkZHJlc3MgIT0gIiIpIHsKLSAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAotICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEFMT0dWKCJBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0SW5wdXQoKSBpbnB1dCBzb3VyY2UgPSAlZCIsIGlucHV0RGVzYy0+bUlucHV0U291cmNlKTsKLQotICAgIGlucHV0RGVzYy0+bVJlZkNvdW50Kys7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQotewotICAgIEFMT0dWKCJzdG9wSW5wdXQoKSBpbnB1dCAlZCIsIGlucHV0KTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdG9wSW5wdXQoKSB1bmtub3duIGlucHV0ICVkIiwgaW5wdXQpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKLQotICAgIGluZGV4ID0gaW5wdXREZXNjLT5tU2Vzc2lvbnMuaW5kZXhPZihzZXNzaW9uKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdG9wSW5wdXQoKSB1bmtub3duIHNlc3Npb24gJWQgb24gaW5wdXQgJWQiLCBzZXNzaW9uLCBpbnB1dCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgaWYgKGlucHV0RGVzYy0+bVJlZkNvdW50ID09IDApIHsKLSAgICAgICAgQUxPR1coInN0b3BJbnB1dCgpIGlucHV0ICVkIGFscmVhZHkgc3RvcHBlZCIsIGlucHV0KTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIGlucHV0RGVzYy0+bVJlZkNvdW50LS07Ci0gICAgaWYgKGlucHV0RGVzYy0+bVJlZkNvdW50ID09IDApIHsKLQotICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGRpc2FibGUgdGhlIHJlbW90ZSBzdWJtaXggb3V0cHV0IHdoZW4gaW5wdXQgaXMgc3RvcHBlZCBpZiBub3QKLSAgICAgICAgLy8gdXNlZCBieSBhIHBvbGljeSBtaXggb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKLSAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGlucHV0RGVzYy0+bURldmljZSkpIHsKLSAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IFN0cmluZzgoIiIpOwotICAgICAgICAgICAgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7Ci0gICAgICAgICAgICAgICAgYWRkcmVzcyA9IGlucHV0RGVzYy0+bVBvbGljeU1peC0+bVJlZ2lzdHJhdGlvbklkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFkZHJlc3MgIT0gIiIpIHsKLSAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJlc2V0SW5wdXREZXZpY2UoaW5wdXQpOwotCi0gICAgICAgIGlmIChhY3RpdmVJbnB1dHNDb3VudCgpID09IDApIHsKLSAgICAgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQotewotICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSAlZCIsIGlucHV0KTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJyZWxlYXNlSW5wdXQoKSByZWxlYXNpbmcgdW5rbm93biBpbnB1dCAlZCIsIGlucHV0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKLSAgICBBTE9HX0FTU0VSVChpbnB1dERlc2MgIT0gMCk7Ci0KLSAgICBpbmRleCA9IGlucHV0RGVzYy0+bVNlc3Npb25zLmluZGV4T2Yoc2Vzc2lvbik7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygicmVsZWFzZUlucHV0KCkgdW5rbm93biBzZXNzaW9uICVkIG9uIGlucHV0ICVkIiwgc2Vzc2lvbiwgaW5wdXQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlucHV0RGVzYy0+bVNlc3Npb25zLnJlbW92ZShzZXNzaW9uKTsKLSAgICBpZiAoaW5wdXREZXNjLT5tT3BlblJlZkNvdW50ID09IDApIHsKLSAgICAgICAgQUxPR1coInJlbGVhc2VJbnB1dCgpIGludmFsaWQgb3BlbiByZWYgY291bnQgJWQiLCBpbnB1dERlc2MtPm1PcGVuUmVmQ291bnQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlucHV0RGVzYy0+bU9wZW5SZWZDb3VudC0tOwotICAgIGlmIChpbnB1dERlc2MtPm1PcGVuUmVmQ291bnQgPiAwKSB7Ci0gICAgICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSBleGl0ID4gMCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY2xvc2VJbnB1dChpbnB1dCk7Ci0gICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwotICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSBleGl0Iik7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbG9zZUFsbElucHV0cygpIHsKLSAgICBib29sIHBhdGNoUmVtb3ZlZCA9IGZhbHNlOwotCi0gICAgZm9yKHNpemVfdCBpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKLSAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbnB1dF9pbmRleCk7Ci0gICAgICAgIHNzaXplX3QgcGF0Y2hfaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUpOwotICAgICAgICBpZiAocGF0Y2hfaW5kZXggPj0gMCkgewotICAgICAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KHBhdGNoX2luZGV4KTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKLSAgICAgICAgICAgIG1BdWRpb1BhdGNoZXMucmVtb3ZlSXRlbXNBdChwYXRjaF9pbmRleCk7Ci0gICAgICAgICAgICBwYXRjaFJlbW92ZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKLSAgICB9Ci0gICAgbUlucHV0cy5jbGVhcigpOwotICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0KLSAgICBpZiAocGF0Y2hSZW1vdmVkKSB7Ci0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpCi17Ci0gICAgQUxPR1YoImluaXRTdHJlYW1Wb2x1bWUoKSBzdHJlYW0gJWQsIG1pbiAlZCwgbWF4ICVkIiwgc3RyZWFtICwgaW5kZXhNaW4sIGluZGV4TWF4KTsKLSAgICBpZiAoaW5kZXhNaW4gPCAwIHx8IGluZGV4TWluID49IGluZGV4TWF4KSB7Ci0gICAgICAgIEFMT0dXKCJpbml0U3RyZWFtVm9sdW1lKCkgaW52YWxpZCBpbmRleCBsaW1pdHMgZm9yIHN0cmVhbSAlZCwgbWluICVkLCBtYXggJWQiLCBzdHJlYW0gLCBpbmRleE1pbiwgaW5kZXhNYXgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWluID0gaW5kZXhNaW47Ci0gICAgbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNYXggPSBpbmRleE1heDsKLSAgICAvL0ZJWE1FOiBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSB2b2x1bWUgZm9sbG93cyBBVURJT19TVFJFQU1fTVVTSUMgZm9yIG5vdwotICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX01VU0lDKSB7Ci0gICAgICAgIG1TdHJlYW1zW0FVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZXS5tSW5kZXhNaW4gPSBpbmRleE1pbjsKLSAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFldLm1JbmRleE1heCA9IGluZGV4TWF4OwotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCi17Ci0KLSAgICBpZiAoKGluZGV4IDwgbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNaW4pIHx8IChpbmRleCA+IG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWF4KSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIC8vIEZvcmNlIG1heCB2b2x1bWUgaWYgc3RyZWFtIGNhbm5vdCBiZSBtdXRlZAotICAgIGlmICghbVN0cmVhbXNbc3RyZWFtXS5tQ2FuQmVNdXRlZCkgaW5kZXggPSBtU3RyZWFtc1tzdHJlYW1dLm1JbmRleE1heDsKLQotICAgIEFMT0dWKCJzZXRTdHJlYW1Wb2x1bWVJbmRleCgpIHN0cmVhbSAlZCwgZGV2aWNlICUwNHgsIGluZGV4ICVkIiwKLSAgICAgICAgICBzdHJlYW0sIGRldmljZSwgaW5kZXgpOwotCi0gICAgLy8gaWYgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCBzZXQgZGVmYXVsdCB2YWx1ZSBhbmQKLSAgICAvLyBjbGVhciBhbGwgZGV2aWNlIHNwZWNpZmljIHZhbHVlcwotICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUKSB7Ci0gICAgICAgIG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4Q3VyLmNsZWFyKCk7Ci0gICAgfQotICAgIG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4Q3VyLmFkZChkZXZpY2UsIGluZGV4KTsKLQotICAgIC8vIHVwZGF0ZSB2b2x1bWUgb24gYWxsIG91dHB1dHMgd2hvc2UgY3VycmVudCBkZXZpY2UgaXMgYWxzbyBzZWxlY3RlZCBieSB0aGUgc2FtZQotICAgIC8vIHN0cmF0ZWd5IGFzIHRoZSBkZXZpY2Ugc3BlY2lmaWVkIGJ5IHRoZSBjYWxsZXIKLSAgICBhdWRpb19kZXZpY2VzX3Qgc3RyYXRlZ3lEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShnZXRTdHJhdGVneShzdHJlYW0pLCB0cnVlIC8qZnJvbUNhY2hlKi8pOwotCi0KLSAgICAvL0ZJWE1FOiBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSB2b2x1bWUgZm9sbG93cyBBVURJT19TVFJFQU1fTVVTSUMgZm9yIG5vdwotICAgIGF1ZGlvX2RldmljZXNfdCBhY2Nlc3NpYmlsaXR5RGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fTVVTSUMpIHsKLSAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFldLm1JbmRleEN1ci5hZGQoZGV2aWNlLCBpbmRleCk7Ci0gICAgICAgIGFjY2Vzc2liaWxpdHlEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9BQ0NFU1NJQklMSVRZLCB0cnVlIC8qZnJvbUNhY2hlKi8pOwotICAgIH0KLSAgICBpZiAoKGRldmljZSAhPSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQpICYmCi0gICAgICAgICAgICAoZGV2aWNlICYgKHN0cmF0ZWd5RGV2aWNlIHwgYWNjZXNzaWJpbGl0eURldmljZSkpID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJEZXZpY2UgPQotICAgICAgICAgICAgICAgIGdldERldmljZUZvclZvbHVtZShtT3V0cHV0cy52YWx1ZUF0KGkpLT5kZXZpY2UoKSk7Ci0gICAgICAgIGlmICgoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCkgfHwgKChjdXJEZXZpY2UgJiBzdHJhdGVneURldmljZSkgIT0gMCkpIHsKLSAgICAgICAgICAgIHN0YXR1c190IHZvbFN0YXR1cyA9IGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwgaW5kZXgsIG1PdXRwdXRzLmtleUF0KGkpLCBjdXJEZXZpY2UpOwotICAgICAgICAgICAgaWYgKHZvbFN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHZvbFN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQpIHx8ICgoY3VyRGV2aWNlICYgYWNjZXNzaWJpbGl0eURldmljZSkgIT0gMCkpIHsKLSAgICAgICAgICAgIHN0YXR1c190IHZvbFN0YXR1cyA9IGNoZWNrQW5kU2V0Vm9sdW1lKEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIG1PdXRwdXRzLmtleUF0KGkpLCBjdXJEZXZpY2UpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKLXsKLSAgICBpZiAoaW5kZXggPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICAvLyBpZiBkZXZpY2UgaXMgQVVESU9fREVWSUNFX09VVF9ERUZBVUxULCByZXR1cm4gdm9sdW1lIGZvciBkZXZpY2UgY29ycmVzcG9uZGluZyB0bwotICAgIC8vIHRoZSBzdHJhdGVneSB0aGUgc3RyZWFtIGJlbG9uZ3MgdG8uCi0gICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koZ2V0U3RyYXRlZ3koc3RyZWFtKSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKLSAgICB9Ci0gICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSk7Ci0KLSAgICAqaW5kZXggPSAgbVN0cmVhbXNbc3RyZWFtXS5nZXRWb2x1bWVJbmRleChkZXZpY2UpOwotICAgIEFMT0dWKCJnZXRTdHJlYW1Wb2x1bWVJbmRleCgpIHN0cmVhbSAlZCBkZXZpY2UgJTA4eCBpbmRleCAlZCIsIHN0cmVhbSwgZGV2aWNlLCAqaW5kZXgpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZWxlY3RPdXRwdXRGb3JFZmZlY3RzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzKQotewotICAgIC8vIHNlbGVjdCBvbmUgb3V0cHV0IGFtb25nIHNldmVyYWwgc3VpdGFibGUgZm9yIGdsb2JhbCBlZmZlY3RzLgotICAgIC8vIFRoZSBwcmlvcml0eSBpcyBhcyBmb2xsb3dzOgotICAgIC8vIDE6IEFuIG9mZmxvYWRlZCBvdXRwdXQuIElmIHRoZSBlZmZlY3QgZW5kcyB1cCBub3QgYmVpbmcgb2ZmbG9hZGFibGUsCi0gICAgLy8gICAgQXVkaW9GbGluZ2VyIHdpbGwgaW52YWxpZGF0ZSB0aGUgdHJhY2sgYW5kIHRoZSBvZmZsb2FkZWQgb3V0cHV0Ci0gICAgLy8gICAgd2lsbCBiZSBjbG9zZWQgY2F1c2luZyB0aGUgZWZmZWN0IHRvIGJlIG1vdmVkIHRvIGEgUENNIG91dHB1dC4KLSAgICAvLyAyOiBBIGRlZXAgYnVmZmVyIG91dHB1dAotICAgIC8vIDM6IHRoZSBmaXJzdCBvdXRwdXQgaW4gdGhlIGxpc3QKLQotICAgIGlmIChvdXRwdXRzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dE9mZmxvYWRlZCA9IDA7Ci0gICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0RGVlcEJ1ZmZlciA9IDA7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0c1tpXSk7Ci0gICAgICAgIEFMT0dWKCJzZWxlY3RPdXRwdXRGb3JFZmZlY3RzIG91dHB1dHNbJXp1XSBmbGFncyAleCIsIGksIGRlc2MtPm1GbGFncyk7Ci0gICAgICAgIGlmICgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgewotICAgICAgICAgICAgb3V0cHV0T2ZmbG9hZGVkID0gb3V0cHV0c1tpXTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSKSAhPSAwKSB7Ci0gICAgICAgICAgICBvdXRwdXREZWVwQnVmZmVyID0gb3V0cHV0c1tpXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEFMT0dWKCJzZWxlY3RPdXRwdXRGb3JFZmZlY3RzIG91dHB1dE9mZmxvYWRlZCAlZCBvdXRwdXREZWVwQnVmZmVyICVkIiwKLSAgICAgICAgICBvdXRwdXRPZmZsb2FkZWQsIG91dHB1dERlZXBCdWZmZXIpOwotICAgIGlmIChvdXRwdXRPZmZsb2FkZWQgIT0gMCkgewotICAgICAgICByZXR1cm4gb3V0cHV0T2ZmbG9hZGVkOwotICAgIH0KLSAgICBpZiAob3V0cHV0RGVlcEJ1ZmZlciAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBvdXRwdXREZWVwQnVmZmVyOwotICAgIH0KLQotICAgIHJldHVybiBvdXRwdXRzWzBdOwotfQotCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKQotewotICAgIC8vIGFwcGx5IHNpbXBsZSBydWxlIHdoZXJlIGdsb2JhbCBlZmZlY3RzIGFyZSBhdHRhY2hlZCB0byB0aGUgc2FtZSBvdXRwdXQgYXMgTVVTSUMgc3RyZWFtcwotCi0gICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IGdldFN0cmF0ZWd5KEFVRElPX1NUUkVBTV9NVVNJQyk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IGRzdE91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKGRldmljZSwgbU91dHB1dHMpOwotCi0gICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0Rm9yRWZmZWN0cyhkc3RPdXRwdXRzKTsKLSAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yRWZmZWN0KCkgZ290IG91dHB1dCAlZCBmb3IgZnggJXMgZmxhZ3MgJXgiLAotICAgICAgICAgIG91dHB1dCwgKGRlc2MgPT0gTlVMTCkgPyAidW5zcGVjaWZpZWQiIDogZGVzYy0+bmFtZSwgIChkZXNjID09IE5VTEwpID8gMCA6IGRlc2MtPmZsYWdzKTsKLQotICAgIHJldHVybiBvdXRwdXQ7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKQotewotICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KGlvKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlvKTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgQUxPR1coInJlZ2lzdGVyRWZmZWN0KCkgdW5rbm93biBpbyAlZCIsIGlvKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChtVG90YWxFZmZlY3RzTWVtb3J5ICsgZGVzYy0+bWVtb3J5VXNhZ2UgPiBnZXRNYXhFZmZlY3RzTWVtb3J5KCkpIHsKLSAgICAgICAgQUxPR1coInJlZ2lzdGVyRWZmZWN0KCkgbWVtb3J5IGxpbWl0IGV4Y2VlZGVkIGZvciBGeCAlcywgTWVtb3J5ICVkIEtCIiwKLSAgICAgICAgICAgICAgICBkZXNjLT5uYW1lLCBkZXNjLT5tZW1vcnlVc2FnZSk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgbVRvdGFsRWZmZWN0c01lbW9yeSArPSBkZXNjLT5tZW1vcnlVc2FnZTsKLSAgICBBTE9HVigicmVnaXN0ZXJFZmZlY3QoKSBlZmZlY3QgJXMsIGlvICVkLCBzdHJhdGVneSAlZCBzZXNzaW9uICVkIGlkICVkIiwKLSAgICAgICAgICAgIGRlc2MtPm5hbWUsIGlvLCBzdHJhdGVneSwgc2Vzc2lvbiwgaWQpOwotICAgIEFMT0dWKCJyZWdpc3RlckVmZmVjdCgpIG1lbW9yeSAlZCwgdG90YWwgbWVtb3J5ICVkIiwgZGVzYy0+bWVtb3J5VXNhZ2UsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOwotCi0gICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IG5ldyBFZmZlY3REZXNjcmlwdG9yKCk7Ci0gICAgbWVtY3B5ICgmZWZmZWN0RGVzYy0+bURlc2MsIGRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7Ci0gICAgZWZmZWN0RGVzYy0+bUlvID0gaW87Ci0gICAgZWZmZWN0RGVzYy0+bVN0cmF0ZWd5ID0gKHJvdXRpbmdfc3RyYXRlZ3kpc3RyYXRlZ3k7Ci0gICAgZWZmZWN0RGVzYy0+bVNlc3Npb24gPSBzZXNzaW9uOwotICAgIGVmZmVjdERlc2MtPm1FbmFibGVkID0gZmFsc2U7Ci0KLSAgICBtRWZmZWN0cy5hZGQoaWQsIGVmZmVjdERlc2MpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKQotewotICAgIHNzaXplX3QgaW5kZXggPSBtRWZmZWN0cy5pbmRleE9mS2V5KGlkKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJ1bnJlZ2lzdGVyRWZmZWN0KCkgdW5rbm93biBlZmZlY3QgSUQgJWQiLCBpZCk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3REZXNjID0gbUVmZmVjdHMudmFsdWVBdChpbmRleCk7Ci0KLSAgICBzZXRFZmZlY3RFbmFibGVkKGVmZmVjdERlc2MsIGZhbHNlKTsKLQotICAgIGlmIChtVG90YWxFZmZlY3RzTWVtb3J5IDwgZWZmZWN0RGVzYy0+bURlc2MubWVtb3J5VXNhZ2UpIHsKLSAgICAgICAgQUxPR1coInVucmVnaXN0ZXJFZmZlY3QoKSBtZW1vcnkgJWQgdG9vIGJpZyBmb3IgdG90YWwgJWQiLAotICAgICAgICAgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLm1lbW9yeVVzYWdlLCBtVG90YWxFZmZlY3RzTWVtb3J5KTsKLSAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MubWVtb3J5VXNhZ2UgPSBtVG90YWxFZmZlY3RzTWVtb3J5OwotICAgIH0KLSAgICBtVG90YWxFZmZlY3RzTWVtb3J5IC09IGVmZmVjdERlc2MtPm1EZXNjLm1lbW9yeVVzYWdlOwotICAgIEFMT0dWKCJ1bnJlZ2lzdGVyRWZmZWN0KCkgZWZmZWN0ICVzLCBJRCAlZCwgbWVtb3J5ICVkIHRvdGFsIG1lbW9yeSAlZCIsCi0gICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5uYW1lLCBpZCwgZWZmZWN0RGVzYy0+bURlc2MubWVtb3J5VXNhZ2UsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOwotCi0gICAgbUVmZmVjdHMucmVtb3ZlSXRlbShpZCk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCkKLXsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUVmZmVjdHMuaW5kZXhPZktleShpZCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIHVua25vd24gZWZmZWN0IElEICVkIiwgaWQpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgcmV0dXJuIHNldEVmZmVjdEVuYWJsZWQobUVmZmVjdHMudmFsdWVBdChpbmRleCksIGVuYWJsZWQpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldEVmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4mIGVmZmVjdERlc2MsIGJvb2wgZW5hYmxlZCkKLXsKLSAgICBpZiAoZW5hYmxlZCA9PSBlZmZlY3REZXNjLT5tRW5hYmxlZCkgewotICAgICAgICBBTE9HVigic2V0RWZmZWN0RW5hYmxlZCglcykgZWZmZWN0IGFscmVhZHkgJXMiLAotICAgICAgICAgICAgIGVuYWJsZWQ/InRydWUiOiJmYWxzZSIsIGVuYWJsZWQ/ImVuYWJsZWQiOiJkaXNhYmxlZCIpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgaWYgKG1Ub3RhbEVmZmVjdHNDcHVMb2FkICsgZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZCA+IGdldE1heEVmZmVjdHNDcHVMb2FkKCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJzZXRFZmZlY3RFbmFibGVkKHRydWUpIENQVSBMb2FkIGxpbWl0IGV4Y2VlZGVkIGZvciBGeCAlcywgQ1BVICVmIE1JUFMiLAotICAgICAgICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5uYW1lLCAoZmxvYXQpZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZC8xMCk7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICAgICAgbVRvdGFsRWZmZWN0c0NwdUxvYWQgKz0gZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZDsKLSAgICAgICAgQUxPR1YoInNldEVmZmVjdEVuYWJsZWQodHJ1ZSkgdG90YWwgQ1BVICVkIiwgbVRvdGFsRWZmZWN0c0NwdUxvYWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtVG90YWxFZmZlY3RzQ3B1TG9hZCA8IGVmZmVjdERlc2MtPm1EZXNjLmNwdUxvYWQpIHsKLSAgICAgICAgICAgIEFMT0dXKCJzZXRFZmZlY3RFbmFibGVkKGZhbHNlKSBDUFUgbG9hZCAlZCB0b28gaGlnaCBmb3IgdG90YWwgJWQiLAotICAgICAgICAgICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkLCBtVG90YWxFZmZlY3RzQ3B1TG9hZCk7Ci0gICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkID0gbVRvdGFsRWZmZWN0c0NwdUxvYWQ7Ci0gICAgICAgIH0KLSAgICAgICAgbVRvdGFsRWZmZWN0c0NwdUxvYWQgLT0gZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZDsKLSAgICAgICAgQUxPR1YoInNldEVmZmVjdEVuYWJsZWQoZmFsc2UpIHRvdGFsIENQVSAlZCIsIG1Ub3RhbEVmZmVjdHNDcHVMb2FkKTsKLSAgICB9Ci0gICAgZWZmZWN0RGVzYy0+bUVuYWJsZWQgPSBlbmFibGVkOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSBtRWZmZWN0cy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoZWZmZWN0RGVzYy0+bUVuYWJsZWQgJiYgKGVmZmVjdERlc2MtPm1TdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQSkgJiYKLSAgICAgICAgICAgICAgICAoKGVmZmVjdERlc2MtPm1EZXNjLmZsYWdzICYgRUZGRUNUX0ZMQUdfT0ZGTE9BRF9TVVBQT1JURUQpID09IDApKSB7Ci0gICAgICAgICAgICBBTE9HVigiaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKSBub24gb2ZmbG9hZGFibGUgZWZmZWN0ICVzIGVuYWJsZWQgb24gc2Vzc2lvbiAlZCIsCi0gICAgICAgICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5uYW1lLCBlZmZlY3REZXNjLT5tU2Vzc2lvbik7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Ci17Ci0gICAgbnNlY3NfdCBzeXNUaW1lID0gc3lzdGVtVGltZSgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAotewotICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmICgoKG91dHB1dERlc2MtPmRldmljZSgpICYgQVBNX0FVRElPX09VVF9ERVZJQ0VfUkVNT1RFX0FMTCkgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5pc1N0cmVhbUFjdGl2ZShzdHJlYW0sIGluUGFzdE1zLCBzeXNUaW1lKSkgewotICAgICAgICAgICAgLy8gZG8gbm90IGNvbnNpZGVyIHJlIHJvdXRpbmcgKHdoZW4gdGhlIG91dHB1dCBpcyBnb2luZyB0byBhIGR5bmFtaWMgcG9saWN5KQotICAgICAgICAgICAgLy8gYXMgInJlbW90ZSBwbGF5YmFjayIKLSAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUG9saWN5TWl4ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0Ci17Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiAgaW5wdXREZXNjcmlwdG9yID0gbUlucHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoaW5wdXREZXNjcmlwdG9yLT5tUmVmQ291bnQgPT0gMCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0RGVzY3JpcHRvci0+bUlucHV0U291cmNlID09IChpbnQpc291cmNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBBVURJT19TT1VSQ0VfSE9UV09SRCBpcyBlcXVpdmFsZW50IHRvIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiBvbmx5IGlmIGl0Ci0gICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIGFuIGFjdGl2ZSBjYXB0dXJlIHRyaWdnZXJlZCBieSBhIGhhcmR3YXJlIGhvdHdvcmQgcmVjb2duaXRpb24KLSAgICAgICAgaWYgKChzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OKSAmJgotICAgICAgICAgICAgICAgICAoaW5wdXREZXNjcmlwdG9yLT5tSW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpKSB7Ci0gICAgICAgICAgICAvLyBGSVhNRTogd2Ugc2hvdWxkIG5vdCBhc3N1bWUgdGhhdCB0aGUgZmlyc3Qgc2Vzc2lvbiBpcyB0aGUgYWN0aXZlIG9uZSBhbmQga2VlcAotICAgICAgICAgICAgLy8gYWN0aXZpdHkgY291bnQgcGVyIHNlc3Npb24uIFNhbWUgaW4gc3RhcnRJbnB1dCgpLgotICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1Tb3VuZFRyaWdnZXJTZXNzaW9ucy5pbmRleE9mS2V5KGlucHV0RGVzY3JpcHRvci0+bVNlc3Npb25zLml0ZW1BdCgwKSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLy8gUmVnaXN0ZXIgYSBsaXN0IG9mIGN1c3RvbSBtaXhlcyB3aXRoIHRoZWlyIGF0dHJpYnV0ZXMgYW5kIGZvcm1hdC4KLS8vIFdoZW4gYSBtaXggaXMgcmVnaXN0ZXJlZCwgY29ycmVzcG9uZGluZyBpbnB1dCBhbmQgb3V0cHV0IHByb2ZpbGVzIGFyZQotLy8gYWRkZWQgdG8gdGhlIHJlbW90ZSBzdWJtaXggaHcgbW9kdWxlLiBUaGUgcHJvZmlsZSBjb250YWlucyBvbmx5IHRoZQotLy8gcGFyYW1ldGVycyAoc2FtcGxpbmcgcmF0ZSwgZm9ybWF0Li4uKSBzcGVjaWZpZWQgYnkgdGhlIG1peC4KLS8vIFRoZSBjb3JyZXNwb25kaW5nIGlucHV0IHJlbW90ZSBzdWJtaXggZGV2aWNlIGlzIGFsc28gY29ubmVjdGVkLgotLy8KLS8vIFdoZW4gYSByZW1vdGUgc3VibWl4IGRldmljZSBpcyBjb25uZWN0ZWQsIHRoZSBhZGRyZXNzIGlzIGNoZWNrZWQgdG8gc2VsZWN0IHRoZQotLy8gYXBwcm9wcmlhdGUgcHJvZmlsZSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgaW5wdXQgb3Igb3V0cHV0IHN0cmVhbSBpcyBvcGVuZWQuCi0vLwotLy8gV2hlbiBjYXB0dXJlIHN0YXJ0cywgZ2V0SW5wdXRGb3JBdHRyKCkgd2lsbDoKLS8vICAtIDEgbG9vayBmb3IgYSBtaXggbWF0Y2hpbmcgdGhlIGFkZHJlc3MgcGFzc2VkIGluIGF0dHJpYnR1dGVzIHRhZ3MgaWYgYW55Ci0vLyAgLSAyIGlmIG5vbmUgZm91bmQsIGdldERldmljZUZvcklucHV0U291cmNlKCkgd2lsbDoKLS8vICAgICAtIDIuMSBsb29rIGZvciBhIG1peCBtYXRjaGluZyB0aGUgYXR0cmlidXRlcyBzb3VyY2UKLS8vICAgICAtIDIuMiBpZiBub25lIGZvdW5kLCBkZWZhdWx0IHRvIGRldmljZSBzZWxlY3Rpb24gYnkgcG9saWN5IHJ1bGVzCi0vLyBBdCB0aGlzIHRpbWUsIHRoZSBjb3JyZXNwb25kaW5nIG91dHB1dCByZW1vdGUgc3VibWl4IGRldmljZSBpcyBhbHNvIGNvbm5lY3RlZAotLy8gYW5kIGFjdGl2ZSBwbGF5YmFjayB1c2UgY2FzZXMgY2FuIGJlIHRyYW5zZmVycmVkIHRvIHRoaXMgbWl4IGlmIG5lZWRlZCB3aGVuIHJlY29ubmVjdGluZwotLy8gYWZ0ZXIgQXVkaW9UcmFja3MgYXJlIGludmFsaWRhdGVkCi0vLwotLy8gV2hlbiBwbGF5YmFjayBzdGFydHMsIGdldE91dHB1dEZvckF0dHIoKSB3aWxsOgotLy8gIC0gMSBsb29rIGZvciBhIG1peCBtYXRjaGluZyB0aGUgYWRkcmVzcyBwYXNzZWQgaW4gYXR0cmlidHV0ZXMgdGFncyBpZiBhbnkKLS8vICAtIDIgaWYgbm9uZSBmb3VuZCwgbG9vayBmb3IgYSBtaXggbWF0Y2hpbmcgdGhlIGF0dHJpYnV0ZXMgdXNhZ2UKLS8vICAtIDMgaWYgbm9uZSBmb3VuZCwgZGVmYXVsdCB0byBkZXZpY2UgYW5kIG91dHB1dCBzZWxlY3Rpb24gYnkgcG9saWN5IHJ1bGVzLgotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlZ2lzdGVyUG9saWN5TWl4ZXMoVmVjdG9yPEF1ZGlvTWl4PiBtaXhlcykKLXsKLSAgICBzcDxId01vZHVsZT4gbW9kdWxlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAoc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9SRU1PVEVfU1VCTUlYLCBtSHdNb2R1bGVzW2ldLT5tTmFtZSkgPT0gMCAmJgotICAgICAgICAgICAgICAgIG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgIT0gMCkgewotICAgICAgICAgICAgbW9kdWxlID0gbUh3TW9kdWxlc1tpXTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1vZHVsZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBBTE9HVigicmVnaXN0ZXJQb2xpY3lNaXhlcygpIG51bSBtaXhlcyAlZCIsIG1peGVzLnNpemUoKSk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1peGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIFN0cmluZzggYWRkcmVzcyA9IG1peGVzW2ldLm1SZWdpc3RyYXRpb25JZDsKLSAgICAgICAgc3NpemVfdCBpbmRleCA9IG1Qb2xpY3lNaXhlcy5pbmRleE9mS2V5KGFkZHJlc3MpOwotICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgQUxPR0UoInJlZ2lzdGVyUG9saWN5TWl4ZXMoKTogbWl4IGZvciBhZGRyZXNzICVzIGFscmVhZHkgcmVnaXN0ZXJlZCIsIGFkZHJlc3Muc3RyaW5nKCkpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgYXVkaW9fY29uZmlnX3Qgb3V0cHV0Q29uZmlnID0gbWl4ZXNbaV0ubUZvcm1hdDsKLSAgICAgICAgYXVkaW9fY29uZmlnX3QgaW5wdXRDb25maWcgPSBtaXhlc1tpXS5tRm9ybWF0OwotICAgICAgICAvLyBOT1RFOiBhdWRpbyBmbGluZ2VyIG1peGVyIGRvZXMgbm90IHN1cHBvcnQgbW9ubyBvdXRwdXQ6IGNvbmZpZ3VyZSByZW1vdGUgc3VibWl4IEhBTCBpbgotICAgICAgICAvLyBzdGVyZW8gYW5kIGxldCBhdWRpbyBmbGluZ2VyIGRvIHRoZSBjaGFubmVsIGNvbnZlcnNpb24gaWYgbmVlZGVkLgotICAgICAgICBvdXRwdXRDb25maWcuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgICAgICBpbnB1dENvbmZpZy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX0lOX1NURVJFTzsKLSAgICAgICAgbW9kdWxlLT5hZGRPdXRwdXRQcm9maWxlKGFkZHJlc3MsICZvdXRwdXRDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsIGFkZHJlc3MpOwotICAgICAgICBtb2R1bGUtPmFkZElucHV0UHJvZmlsZShhZGRyZXNzLCAmaW5wdXRDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwgYWRkcmVzcyk7Ci0gICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSBuZXcgQXVkaW9Qb2xpY3lNaXgoKTsKLSAgICAgICAgcG9saWN5TWl4LT5tTWl4ID0gbWl4ZXNbaV07Ci0gICAgICAgIG1Qb2xpY3lNaXhlcy5hZGQoYWRkcmVzcywgcG9saWN5TWl4KTsKLSAgICAgICAgaWYgKG1peGVzW2ldLm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKLSAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnVucmVnaXN0ZXJQb2xpY3lNaXhlcyhWZWN0b3I8QXVkaW9NaXg+IG1peGVzKQotewotICAgIHNwPEh3TW9kdWxlPiBtb2R1bGU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1JFTU9URV9TVUJNSVgsIG1Id01vZHVsZXNbaV0tPm1OYW1lKSA9PSAwICYmCi0gICAgICAgICAgICAgICAgbUh3TW9kdWxlc1tpXS0+bUhhbmRsZSAhPSAwKSB7Ci0gICAgICAgICAgICBtb2R1bGUgPSBtSHdNb2R1bGVzW2ldOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobW9kdWxlID09IDApIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIEFMT0dWKCJ1bnJlZ2lzdGVyUG9saWN5TWl4ZXMoKSBudW0gbWl4ZXMgJWQiLCBtaXhlcy5zaXplKCkpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtaXhlcy5zaXplKCk7IGkrKykgewotICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBtaXhlc1tpXS5tUmVnaXN0cmF0aW9uSWQ7Ci0gICAgICAgIHNzaXplX3QgaW5kZXggPSBtUG9saWN5TWl4ZXMuaW5kZXhPZktleShhZGRyZXNzKTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgQUxPR0UoInVucmVnaXN0ZXJQb2xpY3lNaXhlcygpOiBtaXggZm9yIGFkZHJlc3MgJXMgbm90IHJlZ2lzdGVyZWQiLCBhZGRyZXNzLnN0cmluZygpKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgbVBvbGljeU1peGVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwotCi0gICAgICAgIGlmIChnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsIGFkZHJlc3Muc3RyaW5nKCkpID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSkKLSAgICAgICAgewotICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwgYWRkcmVzcy5zdHJpbmcoKSkgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbW9kdWxlLT5yZW1vdmVPdXRwdXRQcm9maWxlKGFkZHJlc3MpOwotICAgICAgICBtb2R1bGUtPnJlbW92ZUlucHV0UHJvZmlsZShhZGRyZXNzKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZHVtcChpbnQgZmQpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkF1ZGlvUG9saWN5TWFuYWdlciBEdW1wOiAlcFxuIiwgdGhpcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFByaW1hcnkgT3V0cHV0OiAlZFxuIiwgbVByaW1hcnlPdXRwdXQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgUGhvbmUgc3RhdGU6ICVkXG4iLCBtUGhvbmVTdGF0ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIGNvbW11bmljYXRpb25zICVkXG4iLAotICAgICAgICAgICAgIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgbWVkaWEgJWRcbiIsIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBXSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIHJlY29yZCAlZFxuIiwgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEXSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIGRvY2sgJWRcbiIsIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0tdKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3Igc3lzdGVtICVkXG4iLCBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgaGRtaSBzeXN0ZW0gYXVkaW8gJWRcbiIsCi0gICAgICAgICAgICBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJT10pOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBBdmFpbGFibGUgb3V0cHV0IGRldmljZXM6XG4iKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXS0+ZHVtcChmZCwgMiwgaSk7Ci0gICAgfQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuIEF2YWlsYWJsZSBpbnB1dCBkZXZpY2VzOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5kdW1wKGZkLCAyLCBpKTsKLSAgICB9Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkhXIE1vZHVsZXMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBIVyBNb2R1bGUgJXp1OlxuIiwgaSArIDEpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIG1Id01vZHVsZXNbaV0tPmR1bXAoZmQpOwotICAgIH0KLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuT3V0cHV0cyBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBPdXRwdXQgJWQgZHVtcDpcbiIsIG1PdXRwdXRzLmtleUF0KGkpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICBtT3V0cHV0cy52YWx1ZUF0KGkpLT5kdW1wKGZkKTsKLSAgICB9Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbklucHV0cyBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIElucHV0ICVkIGR1bXA6XG4iLCBtSW5wdXRzLmtleUF0KGkpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICBtSW5wdXRzLnZhbHVlQXQoaSktPmR1bXAoZmQpOwotICAgIH0KLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuU3RyZWFtcyBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKLSAgICAgICAgICAgICAiIFN0cmVhbSAgQ2FuIGJlIG11dGVkICBJbmRleCBNaW4gIEluZGV4IE1heCAgSW5kZXggQ3VyIFtkZXZpY2UgOiBpbmRleF0uLi5cbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgJTAyenUgICAgICAiLCBpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICBtU3RyZWFtc1tpXS5kdW1wKGZkKTsKLSAgICB9Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblRvdGFsIEVmZmVjdHMgQ1BVOiAlZiBNSVBTLCBUb3RhbCBFZmZlY3RzIG1lbW9yeTogJWQgS0JcbiIsCi0gICAgICAgICAgICAoZmxvYXQpbVRvdGFsRWZmZWN0c0NwdUxvYWQvMTAsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlJlZ2lzdGVyZWQgZWZmZWN0czpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gRWZmZWN0ICVkIGR1bXA6XG4iLCBtRWZmZWN0cy5rZXlBdChpKSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgbUVmZmVjdHMudmFsdWVBdChpKS0+ZHVtcChmZCk7Ci0gICAgfQotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5BdWRpbyBQYXRjaGVzOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvUGF0Y2hlcy5zaXplKCk7IGkrKykgewotICAgICAgICBtQXVkaW9QYXRjaGVzW2ldLT5kdW1wKGZkLCAyLCBpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGZvciB0aGUgcGFyYW1ldGVycyB3aGljaCBjYW4gYmUgb2ZmbG9hZGVkLgotLy8gVGhpcyBjYW4gYmUgZW5oYW5jZWQgZGVwZW5kaW5nIG9uIHRoZSBjYXBhYmlsaXR5IG9mIHRoZSBEU1AgYW5kIHBvbGljeQotLy8gb2YgdGhlIHN5c3RlbS4KLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIG9mZmxvYWRJbmZvKQotewotICAgIEFMT0dWKCJpc09mZmxvYWRTdXBwb3J0ZWQ6IFNSPSV1LCBDTT0weCV4LCBGb3JtYXQ9MHgleCwgU3RyZWFtVHlwZT0lZCwiCi0gICAgICIgQml0UmF0ZT0ldSwgZHVyYXRpb249JSIgUFJJZDY0ICIgdXMsIGhhc192aWRlbz0lZCIsCi0gICAgIG9mZmxvYWRJbmZvLnNhbXBsZV9yYXRlLCBvZmZsb2FkSW5mby5jaGFubmVsX21hc2ssCi0gICAgIG9mZmxvYWRJbmZvLmZvcm1hdCwKLSAgICAgb2ZmbG9hZEluZm8uc3RyZWFtX3R5cGUsIG9mZmxvYWRJbmZvLmJpdF9yYXRlLCBvZmZsb2FkSW5mby5kdXJhdGlvbl91cywKLSAgICAgb2ZmbG9hZEluZm8uaGFzX3ZpZGVvKTsKLQotICAgIC8vIENoZWNrIGlmIG9mZmxvYWQgaGFzIGJlZW4gZGlzYWJsZWQKLSAgICBjaGFyIHByb3BWYWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGlmIChwcm9wZXJ0eV9nZXQoImF1ZGlvLm9mZmxvYWQuZGlzYWJsZSIsIHByb3BWYWx1ZSwgIjAiKSkgewotICAgICAgICBpZiAoYXRvaShwcm9wVmFsdWUpICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJvZmZsb2FkIGRpc2FibGVkIGJ5IGF1ZGlvLm9mZmxvYWQuZGlzYWJsZT0lcyIsIHByb3BWYWx1ZSApOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgaWYgc3RyZWFtIHR5cGUgaXMgbXVzaWMsIHRoZW4gb25seSBhbGxvdyBvZmZsb2FkIGFzIG9mIG5vdy4KLSAgICBpZiAob2ZmbG9hZEluZm8uc3RyZWFtX3R5cGUgIT0gQVVESU9fU1RSRUFNX01VU0lDKQotICAgIHsKLSAgICAgICAgQUxPR1YoImlzT2ZmbG9hZFN1cHBvcnRlZDogc3RyZWFtX3R5cGUgIT0gTVVTSUMsIHJldHVybmluZyBmYWxzZSIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy9UT0RPOiBlbmFibGUgYXVkaW8gb2ZmbG9hZGluZyB3aXRoIHZpZGVvIHdoZW4gcmVhZHkKLSAgICBpZiAob2ZmbG9hZEluZm8uaGFzX3ZpZGVvKQotICAgIHsKLSAgICAgICAgQUxPR1YoImlzT2ZmbG9hZFN1cHBvcnRlZDogaGFzX3ZpZGVvID09IHRydWUsIHJldHVybmluZyBmYWxzZSIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy9JZiBkdXJhdGlvbiBpcyBsZXNzIHRoYW4gbWluaW11bSB2YWx1ZSBkZWZpbmVkIGluIHByb3BlcnR5LCByZXR1cm4gZmFsc2UKLSAgICBpZiAocHJvcGVydHlfZ2V0KCJhdWRpby5vZmZsb2FkLm1pbi5kdXJhdGlvbi5zZWNzIiwgcHJvcFZhbHVlLCBOVUxMKSkgewotICAgICAgICBpZiAob2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPCAoYXRvaShwcm9wVmFsdWUpICogMTAwMDAwMCApKSB7Ci0gICAgICAgICAgICBBTE9HVigiT2ZmbG9hZCBkZW5pZWQgYnkgZHVyYXRpb24gPCBhdWRpby5vZmZsb2FkLm1pbi5kdXJhdGlvbi5zZWNzKD0lcykiLCBwcm9wVmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA8IE9GRkxPQURfREVGQVVMVF9NSU5fRFVSQVRJT05fU0VDUyAqIDEwMDAwMDApIHsKLSAgICAgICAgQUxPR1YoIk9mZmxvYWQgZGVuaWVkIGJ5IGR1cmF0aW9uIDwgZGVmYXVsdCBtaW4oPSV1KSIsIE9GRkxPQURfREVGQVVMVF9NSU5fRFVSQVRJT05fU0VDUyk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBEbyBub3QgYWxsb3cgb2ZmbG9hZGluZyBpZiBvbmUgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdCBpcyBlbmFibGVkLiBUaGlzIHByZXZlbnRzIGZyb20KLSAgICAvLyBjcmVhdGluZyBhbiBvZmZsb2FkZWQgdHJhY2sgYW5kIHRlYXJpbmcgaXQgZG93biBpbW1lZGlhdGVseSBhZnRlciBzdGFydCB3aGVuIGF1ZGlvZmxpbmdlcgotICAgIC8vIGRldGVjdHMgdGhlcmUgaXMgYW4gYWN0aXZlIG5vbiBvZmZsb2FkYWJsZSBlZmZlY3QuCi0gICAgLy8gRklYTUU6IFdlIHNob3VsZCBjaGVjayB0aGUgYXVkaW8gc2Vzc2lvbiBoZXJlIGJ1dCB3ZSBkbyBub3QgaGF2ZSBpdCBpbiB0aGlzIGNvbnRleHQuCi0gICAgLy8gVGhpcyBtYXkgcHJldmVudCBvZmZsb2FkaW5nIGluIHJhcmUgc2l0dWF0aW9ucyB3aGVyZSBlZmZlY3RzIGFyZSBsZWZ0IGFjdGl2ZSBieSBhcHBzCi0gICAgLy8gaW4gdGhlIGJhY2tncm91bmQuCi0gICAgaWYgKGlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIFNlZSBpZiB0aGVyZSBpcyBhIHByb2ZpbGUgdG8gc3VwcG9ydCB0aGlzLgotICAgIC8vIEFVRElPX0RFVklDRV9OT05FCi0gICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gZ2V0UHJvZmlsZUZvckRpcmVjdE91dHB1dChBVURJT19ERVZJQ0VfTk9ORSAvKmlnbm9yZSBkZXZpY2UgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvLnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsb2FkSW5mby5mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvLmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCk7Ci0gICAgQUxPR1YoImlzT2ZmbG9hZFN1cHBvcnRlZCgpIHByb2ZpbGUgJXNmb3VuZCIsIHByb2ZpbGUgIT0gMCA/ICIiIDogIk5PVCAiKTsKLSAgICByZXR1cm4gKHByb2ZpbGUgIT0gMCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6bGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKQotewotICAgIGlmIChudW1fcG9ydHMgPT0gTlVMTCB8fCAoKm51bV9wb3J0cyAhPSAwICYmIHBvcnRzID09IE5VTEwpIHx8Ci0gICAgICAgICAgICBnZW5lcmF0aW9uID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgQUxPR1YoImxpc3RBdWRpb1BvcnRzKCkgcm9sZSAlZCB0eXBlICVkIG51bV9wb3J0cyAlZCBwb3J0cyAlcCIsIHJvbGUsIHR5cGUsICpudW1fcG9ydHMsIHBvcnRzKTsKLSAgICBpZiAocG9ydHMgPT0gTlVMTCkgewotICAgICAgICAqbnVtX3BvcnRzID0gMDsKLSAgICB9Ci0KLSAgICBzaXplX3QgcG9ydHNXcml0dGVuID0gMDsKLSAgICBzaXplX3QgcG9ydHNNYXggPSAqbnVtX3BvcnRzOwotICAgICpudW1fcG9ydHMgPSAwOwotICAgIGlmICh0eXBlID09IEFVRElPX1BPUlRfVFlQRV9OT05FIHx8IHR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICBpZiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSyB8fCByb2xlID09IEFVRElPX1BPUlRfUk9MRV9OT05FKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaSAgPCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5zaXplKCkgJiYgcG9ydHNXcml0dGVuIDwgcG9ydHNNYXg7IGkrKykgewotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldLT50b0F1ZGlvUG9ydCgmcG9ydHNbcG9ydHNXcml0dGVuKytdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpudW1fcG9ydHMgKz0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuc2l6ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgfHwgcm9sZSA9PSBBVURJT19QT1JUX1JPTEVfTk9ORSkgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGkgIDwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCkgJiYgcG9ydHNXcml0dGVuIDwgcG9ydHNNYXg7IGkrKykgewotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPnRvQXVkaW9Qb3J0KCZwb3J0c1twb3J0c1dyaXR0ZW4rK10pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKm51bV9wb3J0cyArPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnNpemUoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAodHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTk9ORSB8fCB0eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKLSAgICAgICAgaWYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTksgfHwgcm9sZSA9PSBBVURJT19QT1JUX1JPTEVfTk9ORSkgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKSAmJiBwb3J0c1dyaXR0ZW4gPCBwb3J0c01heDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUlucHV0c1tpXS0+dG9BdWRpb1BvcnQoJnBvcnRzW3BvcnRzV3JpdHRlbisrXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqbnVtX3BvcnRzICs9IG1JbnB1dHMuc2l6ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgfHwgcm9sZSA9PSBBVURJT19QT1JUX1JPTEVfTk9ORSkgewotICAgICAgICAgICAgc2l6ZV90IG51bU91dHB1dHMgPSAwOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICghbU91dHB1dHNbaV0tPmlzRHVwbGljYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG51bU91dHB1dHMrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnRzV3JpdHRlbiA8IHBvcnRzTWF4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0c1tpXS0+dG9BdWRpb1BvcnQoJnBvcnRzW3BvcnRzV3JpdHRlbisrXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqbnVtX3BvcnRzICs9IG51bU91dHB1dHM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKmdlbmVyYXRpb24gPSBjdXJBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0gICAgQUxPR1YoImxpc3RBdWRpb1BvcnRzKCkgZ290ICV6dSBwb3J0cyBuZWVkZWQgJWQiLCBwb3J0c1dyaXR0ZW4sICpudW1fcG9ydHMpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQgX191bnVzZWQpCi17Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zcDxBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRGcm9tSWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0Ci17Ci0gICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gTlVMTDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAob3V0cHV0RGVzYy0+bUlkID09IGlkKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gb3V0cHV0RGVzYzsKLX0KLQotc3A8QXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb0lucHV0RGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dEZyb21JZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3QKLXsKLSAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gTlVMTDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoaW5wdXREZXNjLT5tSWQgPT0gaWQpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpbnB1dERlc2M7Ci19Ci0KLXNwIDxBdWRpb1BvbGljeU1hbmFnZXI6Okh3TW9kdWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1vZHVsZUZvckRldmljZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKLXsKLSAgICBzcCA8SHdNb2R1bGU+IG1vZHVsZTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9PSAwKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtSHdNb2R1bGVzW2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUlucHV0UHJvZmlsZXNbal0tPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJgotICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1Id01vZHVsZXNbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtb2R1bGU7Ci19Ci0KLXNwIDxBdWRpb1BvbGljeU1hbmFnZXI6Okh3TW9kdWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1vZHVsZUZyb21OYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0Ci17Ci0gICAgc3AgPEh3TW9kdWxlPiBtb2R1bGU7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgICBpZiAoc3RyY21wKG1Id01vZHVsZXNbaV0tPm1OYW1lLCBuYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUh3TW9kdWxlc1tpXTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbW9kdWxlOwotfQotCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphdmFpbGFibGVQcmltYXJ5T3V0cHV0RGV2aWNlcygpCi17Ci0gICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3IobVByaW1hcnlPdXRwdXQpOwotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gb3V0cHV0RGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCk7Ci0gICAgcmV0dXJuIGRldmljZXMgJiBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpOwotfQotCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCkKLXsKLSAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgcHJpbWFyeUhhbmRsZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLnZhbHVlRm9yKG1QcmltYXJ5T3V0cHV0KS0+bVByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGU7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdmFpbGFibGVJbnB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPm1Nb2R1bGUtPm1IYW5kbGUgPT0gcHJpbWFyeUhhbmRsZSkgewotICAgICAgICAgICAgZGV2aWNlcyB8PSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5tRGV2aWNlVHlwZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZGV2aWNlczsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkKLXsKLSAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIik7Ci0KLSAgICBpZiAoaGFuZGxlID09IE5VTEwgfHwgcGF0Y2ggPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIG51bSBzb3VyY2VzICVkIG51bSBzaW5rcyAlZCIsIHBhdGNoLT5udW1fc291cmNlcywgcGF0Y2gtPm51bV9zaW5rcyk7Ci0KLSAgICBpZiAocGF0Y2gtPm51bV9zb3VyY2VzID09IDAgfHwgcGF0Y2gtPm51bV9zb3VyY2VzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYIHx8Ci0gICAgICAgICAgICBwYXRjaC0+bnVtX3NpbmtzID09IDAgfHwgcGF0Y2gtPm51bV9zaW5rcyA+IEFVRElPX1BBVENIX1BPUlRTX01BWCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICAvLyBvbmx5IG9uZSBzb3VyY2UgcGVyIGF1ZGlvIHBhdGNoIHN1cHBvcnRlZCBmb3Igbm93Ci0gICAgaWYgKHBhdGNoLT5udW1fc291cmNlcyA+IDEpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIGlmIChwYXRjaC0+c291cmNlc1swXS5yb2xlICE9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhdGNoLT5udW1fc2lua3M7IGkrKykgewotICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLnJvbGUgIT0gQVVESU9fUE9SVF9ST0xFX1NJTkspIHsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpoYW5kbGUpOwotCi0gICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2ggc291cmNlIGlkICVkIHJvbGUgJWQgdHlwZSAlZCIsIHBhdGNoLT5zb3VyY2VzWzBdLmlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5yb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS50eXBlKTsKLSNpZiBMT0dfTkRFQlVHID09IDAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhdGNoLT5udW1fc2lua3M7IGkrKykgewotICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCBzaW5rICVkOiBpZCAlZCByb2xlICVkIHR5cGUgJWQiLCBpLCBwYXRjaC0+c2lua3NbaV0uaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLnJvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLnR5cGUpOwotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBtVWlkQ2FjaGVkICVkIHBhdGNoRGVzYy0+bVVpZCAlZCB1aWQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVVpZENhY2hlZCwgcGF0Y2hEZXNjLT5tVWlkLCB1aWQpOwotICAgICAgICBpZiAocGF0Y2hEZXNjLT5tVWlkICE9IG1VaWRDYWNoZWQgJiYgdWlkICE9IHBhdGNoRGVzYy0+bVVpZCkgewotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKmhhbmRsZSA9IDA7Ci0gICAgfQotCi0gICAgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgewotICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBnZXRPdXRwdXRGcm9tSWQocGF0Y2gtPnNvdXJjZXNbMF0uaWQpOwotICAgICAgICBpZiAob3V0cHV0RGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIG91dHB1dCBub3QgZm91bmQgZm9yIGlkICVkIiwgcGF0Y2gtPnNvdXJjZXNbMF0uaWQpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBBTE9HX0FTU0VSVCghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCksImR1cGxpY2F0ZWQgb3V0cHV0ICVkIGluIHNvdXJjZSBpbiBwb3J0cyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICBpZiAocGF0Y2hEZXNjICE9IDApIHsKLSAgICAgICAgICAgIGlmIChwYXRjaERlc2MtPm1QYXRjaC5zb3VyY2VzWzBdLmlkICE9IHBhdGNoLT5zb3VyY2VzWzBdLmlkKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzb3VyY2UgaWQgZGlmZmVycyBmb3IgcGF0Y2ggY3VycmVudCBpZCAlZCBuZXcgaWQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2guc291cmNlc1swXS5pZCwgcGF0Y2gtPnNvdXJjZXNbMF0uaWQpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7Ci0gICAgICAgICAgICAvLyBPbmx5IHN1cHBvcnQgbWl4IHRvIGRldmljZXMgY29ubmVjdGlvbgotICAgICAgICAgICAgLy8gVE9ETyBhZGQgc3VwcG9ydCBmb3IgbWl4IHRvIG1peCBjb25uZWN0aW9uCi0gICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc291cmNlIG1peCBidXQgc2luayBpcyBub3QgYSBkZXZpY2UiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zaW5rc1tpXS5pZCk7Ci0gICAgICAgICAgICBpZiAoZGV2RGVzYyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBvdXQgZGV2aWNlIG5vdCBmb3VuZCBmb3IgaWQgJWQiLCBwYXRjaC0+c2lua3NbaV0uaWQpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghb3V0cHV0RGVzYy0+bVByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2RGVzYy0+bURldmljZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5zYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAvLyB1cGRhdGVkU2FtcGxpbmdSYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5jaGFubmVsX21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FIC8qRklYTUUqLykpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHByb2ZpbGUgbm90IHN1cHBvcnRlZCBmb3IgZGV2aWNlICUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1EZXZpY2VUeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXZpY2VzLmFkZChkZXZEZXNjKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGV2aWNlcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETzogcmVjb25maWd1cmUgb3V0cHV0IGZvcm1hdCBhbmQgY2hhbm5lbHMgaGVyZQotICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHNldHRpbmcgZGV2aWNlICUwOHggb24gb3V0cHV0ICVkIiwKLSAgICAgICAgICAgICAgZGV2aWNlcy50eXBlcygpLCBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYy0+bUlvSGFuZGxlLCBkZXZpY2VzLnR5cGVzKCksIHRydWUsIDAsIGhhbmRsZSk7Ci0gICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpoYW5kbGUpOwotICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgaWYgKHBhdGNoRGVzYyAhPSAwICYmIHBhdGNoRGVzYyAhPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXRPdXRwdXREZXZpY2UoKSBkaWQgbm90IHJldXNlIHRoZSBwYXRjaCBwcm92aWRlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgICAgIHBhdGNoRGVzYy0+bVVpZCA9IHVpZDsKLSAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc3VjY2VzcyIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXRPdXRwdXREZXZpY2UoKSBmYWlsZWQgdG8gY3JlYXRlIGEgcGF0Y2giKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7Ci0gICAgICAgICAgICAvLyBpbnB1dCBkZXZpY2UgdG8gaW5wdXQgbWl4IGNvbm5lY3Rpb24KLSAgICAgICAgICAgIC8vIG9ubHkgb25lIHNpbmsgc3VwcG9ydGVkIHdoZW4gY29ubmVjdGluZyBhbiBpbnB1dCBkZXZpY2UgdG8gYSBtaXgKLSAgICAgICAgICAgIGlmIChwYXRjaC0+bnVtX3NpbmtzID4gMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBnZXRJbnB1dEZyb21JZChwYXRjaC0+c2lua3NbMF0uaWQpOwotICAgICAgICAgICAgaWYgKGlucHV0RGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXRjaERlc2MgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChwYXRjaERlc2MtPm1QYXRjaC5zaW5rc1swXS5pZCAhPSBwYXRjaC0+c2lua3NbMF0uaWQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQocGF0Y2gtPnNvdXJjZXNbMF0uaWQpOwotICAgICAgICAgICAgaWYgKGRldkRlc2MgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghaW5wdXREZXNjLT5tUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZEZXNjLT5tRGV2aWNlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5tQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgLyp1cGRhdGVkU2FtcGxlUmF0ZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uY2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIGZvciB0aGUgcGFyYW1ldGVyIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBOT05FCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRPRE86IHJlY29uZmlndXJlIG91dHB1dCBmb3JtYXQgYW5kIGNoYW5uZWxzIGhlcmUKLSAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0dGluZyBkZXZpY2UgJTA4eCBvbiBvdXRwdXQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5tRGV2aWNlVHlwZSwgaW5wdXREZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICAgICAgc2V0SW5wdXREZXZpY2UoaW5wdXREZXNjLT5tSW9IYW5kbGUsIGRldkRlc2MtPm1EZXZpY2VUeXBlLCB0cnVlLCBoYW5kbGUpOwotICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKmhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIGlmIChwYXRjaERlc2MgIT0gMCAmJiBwYXRjaERlc2MgIT0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIHNldElucHV0RGV2aWNlKCkgZGlkIG5vdCByZXVzZSB0aGUgcGF0Y2ggcHJvdmlkZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1VaWQgPSB1aWQ7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzdWNjZXNzIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0SW5wdXREZXZpY2UoKSBmYWlsZWQgdG8gY3JlYXRlIGEgcGF0Y2giKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICAgICAgLy8gZGV2aWNlIHRvIGRldmljZSBjb25uZWN0aW9uCi0gICAgICAgICAgICBpZiAocGF0Y2hEZXNjICE9IDApIHsKLSAgICAgICAgICAgICAgICBpZiAocGF0Y2hEZXNjLT5tUGF0Y2guc291cmNlc1swXS5pZCAhPSBwYXRjaC0+c291cmNlc1swXS5pZCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNyY0RldmljZURlc2MgPQotICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZUZyb21JZChwYXRjaC0+c291cmNlc1swXS5pZCk7Ci0gICAgICAgICAgICBpZiAoc3JjRGV2aWNlRGVzYyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy91cGRhdGUgc291cmNlIGFuZCBzaW5rIHdpdGggb3VyIG93biBkYXRhIGFzIHRoZSBkYXRhIHBhc3NlZCBpbiB0aGUgcGF0Y2ggbWF5Ci0gICAgICAgICAgICAvLyBiZSBpbmNvbXBsZXRlLgotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIG5ld1BhdGNoID0gKnBhdGNoOwotICAgICAgICAgICAgc3JjRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJm5ld1BhdGNoLnNvdXJjZXNbMF0sICZwYXRjaC0+c291cmNlc1swXSk7Ci0KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzb3VyY2UgZGV2aWNlIGJ1dCBvbmUgc2luayBpcyBub3QgYSBkZXZpY2UiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNpbmtEZXZpY2VEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZChwYXRjaC0+c2lua3NbaV0uaWQpOwotICAgICAgICAgICAgICAgIGlmIChzaW5rRGV2aWNlRGVzYyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNpbmtEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3UGF0Y2guc2lua3NbaV0sICZwYXRjaC0+c2lua3NbaV0pOwotCi0gICAgICAgICAgICAgICAgaWYgKHNyY0RldmljZURlc2MtPm1Nb2R1bGUgIT0gc2lua0RldmljZURlc2MtPm1Nb2R1bGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gb25seSBvbmUgc2luayBzdXBwb3J0ZWQgd2hlbiBjb25uZWN0ZWQgZGV2aWNlcyBhY3Jvc3MgSFcgbW9kdWxlcwotICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPm51bV9zaW5rcyA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRzRm9yRGV2aWNlKHNpbmtEZXZpY2VEZXNjLT5tRGV2aWNlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0cyk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzaW5rIGRldmljZSBpcyByZWFjaGFibGUgdmlhIGFuIG9wZW5lZCBvdXRwdXQgc3RyZWFtLCByZXF1ZXN0IHRvIGdvIHZpYQotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG91dHB1dCBzdHJlYW0gYnkgYWRkaW5nIGEgc2Vjb25kIHNvdXJjZSB0byB0aGUgcGF0Y2ggZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0lOVkFMSUQpOwotICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJm5ld1BhdGNoLnNvdXJjZXNbMV0sICZwYXRjaC0+c291cmNlc1swXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC5udW1fc291cmNlcyA9IDI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUT0RPOiBjaGVjayBmcm9tIHJvdXRpbmcgY2FwYWJpbGl0aWVzIGluIGNvbmZpZyBmaWxlIGFuZCBvdGhlciBjb25mbGljdGluZyBwYXRjaGVzCi0KLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgYWZQYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZuZXdQYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZlBhdGNoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHBhdGNoIHBhbmVsIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWZQYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaCgoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpbmV4dFVuaXF1ZUlkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdQYXRjaCwgdWlkKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2ggPSBuZXdQYXRjaDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICAgICAgKmhhbmRsZSA9IHBhdGNoRGVzYy0+bUhhbmRsZTsKLSAgICAgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgcGF0Y2ggcGFuZWwgY291bGQgbm90IGNvbm5lY3QgZGV2aWNlIHBhdGNoLCBlcnJvciAlZCIsCi0gICAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKQotewotICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCgpIHBhdGNoICVkIiwgaGFuZGxlKTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaGFuZGxlKTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2goKSBtVWlkQ2FjaGVkICVkIHBhdGNoRGVzYy0+bVVpZCAlZCB1aWQgJWQiLAotICAgICAgICAgIG1VaWRDYWNoZWQsIHBhdGNoRGVzYy0+bVVpZCwgdWlkKTsKLSAgICBpZiAocGF0Y2hEZXNjLT5tVWlkICE9IG1VaWRDYWNoZWQgJiYgdWlkICE9IHBhdGNoRGVzYy0+bVVpZCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCA9ICZwYXRjaERlc2MtPm1QYXRjaDsKLSAgICBwYXRjaERlc2MtPm1VaWQgPSBtVWlkQ2FjaGVkOwotICAgIGlmIChwYXRjaC0+c291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKLSAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gZ2V0T3V0cHV0RnJvbUlkKHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKLSAgICAgICAgaWYgKG91dHB1dERlc2MgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR1YoInJlbGVhc2VBdWRpb1BhdGNoKCkgb3V0cHV0IG5vdCBmb3VuZCBmb3IgaWQgJWQiLCBwYXRjaC0+c291cmNlc1swXS5pZCk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MtPm1Jb0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLT5tSW9IYW5kbGUsIHRydWUgLypmcm9tQ2FjaGUqLyksCi0gICAgICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgIH0gZWxzZSBpZiAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gZ2V0SW5wdXRGcm9tSWQocGF0Y2gtPnNpbmtzWzBdLmlkKTsKLSAgICAgICAgICAgIGlmIChpbnB1dERlc2MgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCgpIGlucHV0IG5vdCBmb3VuZCBmb3IgaWQgJWQiLCBwYXRjaC0+c2lua3NbMF0uaWQpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dERlc2MtPm1Jb0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld0lucHV0RGV2aWNlKGlucHV0RGVzYy0+bUlvSGFuZGxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICAgICAgfSBlbHNlIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKLSAgICAgICAgICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCgpIHBhdGNoIHBhbmVsIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlKTsKLSAgICAgICAgICAgIHJlbW92ZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlKTsKLSAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikKLXsKLSAgICBpZiAobnVtX3BhdGNoZXMgPT0gTlVMTCB8fCAoKm51bV9wYXRjaGVzICE9IDAgJiYgcGF0Y2hlcyA9PSBOVUxMKSB8fAotICAgICAgICAgICAgZ2VuZXJhdGlvbiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIEFMT0dWKCJsaXN0QXVkaW9QYXRjaGVzKCkgbnVtX3BhdGNoZXMgJWQgcGF0Y2hlcyAlcCBhdmFpbGFibGUgcGF0Y2hlcyAlenUiLAotICAgICAgICAgICpudW1fcGF0Y2hlcywgcGF0Y2hlcywgbUF1ZGlvUGF0Y2hlcy5zaXplKCkpOwotICAgIGlmIChwYXRjaGVzID09IE5VTEwpIHsKLSAgICAgICAgKm51bV9wYXRjaGVzID0gMDsKLSAgICB9Ci0KLSAgICBzaXplX3QgcGF0Y2hlc1dyaXR0ZW4gPSAwOwotICAgIHNpemVfdCBwYXRjaGVzTWF4ID0gKm51bV9wYXRjaGVzOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOwotICAgICAgICAgICAgaSAgPCBtQXVkaW9QYXRjaGVzLnNpemUoKSAmJiBwYXRjaGVzV3JpdHRlbiA8IHBhdGNoZXNNYXg7IGkrKykgewotICAgICAgICBwYXRjaGVzW3BhdGNoZXNXcml0dGVuXSA9IG1BdWRpb1BhdGNoZXNbaV0tPm1QYXRjaDsKLSAgICAgICAgcGF0Y2hlc1twYXRjaGVzV3JpdHRlbisrXS5pZCA9IG1BdWRpb1BhdGNoZXNbaV0tPm1IYW5kbGU7Ci0gICAgICAgIEFMT0dWKCJsaXN0QXVkaW9QYXRjaGVzKCkgcGF0Y2ggJXp1IG51bV9zb3VyY2VzICVkIG51bV9zaW5rcyAlZCIsCi0gICAgICAgICAgICAgIGksIG1BdWRpb1BhdGNoZXNbaV0tPm1QYXRjaC5udW1fc291cmNlcywgbUF1ZGlvUGF0Y2hlc1tpXS0+bVBhdGNoLm51bV9zaW5rcyk7Ci0gICAgfQotICAgICpudW1fcGF0Y2hlcyA9IG1BdWRpb1BhdGNoZXMuc2l6ZSgpOwotCi0gICAgKmdlbmVyYXRpb24gPSBjdXJBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0gICAgQUxPR1YoImxpc3RBdWRpb1BhdGNoZXMoKSBnb3QgJXp1IHBhdGNoZXMgbmVlZGVkICVkIiwgcGF0Y2hlc1dyaXR0ZW4sICpudW1fcGF0Y2hlcyk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKLXsKLSAgICBBTE9HVigic2V0QXVkaW9Qb3J0Q29uZmlnKCkiKTsKLQotICAgIGlmIChjb25maWcgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBBTE9HVigic2V0QXVkaW9Qb3J0Q29uZmlnKCkgb24gcG9ydCBoYW5kbGUgJWQiLCBjb25maWctPmlkKTsKLSAgICAvLyBPbmx5IHN1cHBvcnQgZ2FpbiBjb25maWd1cmF0aW9uIGZvciBub3cKLSAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAhPSBBVURJT19QT1JUX0NPTkZJR19HQUlOKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBzcDxBdWRpb1BvcnRDb25maWc+IGF1ZGlvUG9ydENvbmZpZzsKLSAgICBpZiAoY29uZmlnLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKLSAgICAgICAgaWYgKGNvbmZpZy0+cm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBnZXRPdXRwdXRGcm9tSWQoY29uZmlnLT5pZCk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0RGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJzZXRBdWRpb1BvcnRDb25maWcoKSBjYWxsZWQgb24gZHVwbGljYXRlZCBvdXRwdXQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgIGF1ZGlvUG9ydENvbmZpZyA9IG91dHB1dERlc2M7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5yb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gZ2V0SW5wdXRGcm9tSWQoY29uZmlnLT5pZCk7Ci0gICAgICAgICAgICBpZiAoaW5wdXREZXNjID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXVkaW9Qb3J0Q29uZmlnID0gaW5wdXREZXNjOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoY29uZmlnLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYzsKLSAgICAgICAgaWYgKGNvbmZpZy0+cm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB7Ci0gICAgICAgICAgICBkZXZpY2VEZXNjID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoY29uZmlnLT5pZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5yb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSB7Ci0gICAgICAgICAgICBkZXZpY2VEZXNjID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKGNvbmZpZy0+aWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGV2aWNlRGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGF1ZGlvUG9ydENvbmZpZyA9IGRldmljZURlc2M7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgYmFja3VwQ29uZmlnOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9ydENvbmZpZy0+YXBwbHlBdWRpb1BvcnRDb25maWcoY29uZmlnLCAmYmFja3VwQ29uZmlnKTsKLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBuZXdDb25maWc7Ci0gICAgICAgIGF1ZGlvUG9ydENvbmZpZy0+dG9BdWRpb1BvcnRDb25maWcoJm5ld0NvbmZpZywgY29uZmlnKTsKLSAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnNldEF1ZGlvUG9ydENvbmZpZygmbmV3Q29uZmlnLCAwKTsKLSAgICB9Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBhdWRpb1BvcnRDb25maWctPmFwcGx5QXVkaW9Qb3J0Q29uZmlnKCZiYWNrdXBDb25maWcpOwotICAgIH0KLQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbGVhckF1ZGlvUGF0Y2hlcyh1aWRfdCB1aWQpCi17Ci0gICAgZm9yIChzc2l6ZV90IGkgPSAoc3NpemVfdCltQXVkaW9QYXRjaGVzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSAgewotICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChwYXRjaERlc2MtPm1VaWQgPT0gdWlkKSB7Ci0gICAgICAgICAgICByZWxlYXNlQXVkaW9QYXRjaChtQXVkaW9QYXRjaGVzLmtleUF0KGkpLCB1aWQpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlKQotewotICAgICpzZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdCltcENsaWVudEludGVyZmFjZS0+bmV3QXVkaW9VbmlxdWVJZCgpOwotICAgICppb0hhbmRsZSA9IChhdWRpb19pb19oYW5kbGVfdCltcENsaWVudEludGVyZmFjZS0+bmV3QXVkaW9VbmlxdWVJZCgpOwotICAgICpkZXZpY2UgPSBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShBVURJT19TT1VSQ0VfSE9UV09SRCk7Ci0KLSAgICBtU291bmRUcmlnZ2VyU2Vzc2lvbnMuYWRkKCpzZXNzaW9uLCAqaW9IYW5kbGUpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQotewotICAgIHNzaXplX3QgaW5kZXggPSBtU291bmRUcmlnZ2VyU2Vzc2lvbnMuaW5kZXhPZktleShzZXNzaW9uKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbigpIHNlc3Npb24gJWQgbm90IHJlZ2lzdGVyZWQiLCBzZXNzaW9uKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBtU291bmRUcmlnZ2VyU2Vzc2lvbnMucmVtb3ZlSXRlbShzZXNzaW9uKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6YWRkQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9QYXRjaD4mIHBhdGNoKQotewotICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaGFuZGxlKTsKLQotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJhZGRBdWRpb1BhdGNoKCkgcGF0Y2ggJWQgYWxyZWFkeSBpbiIsIGhhbmRsZSk7Ci0gICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKLSAgICB9Ci0gICAgbUF1ZGlvUGF0Y2hlcy5hZGQoaGFuZGxlLCBwYXRjaCk7Ci0gICAgQUxPR1YoImFkZEF1ZGlvUGF0Y2goKSBoYW5kbGUgJWQgYWYgaGFuZGxlICVkIG51bV9zb3VyY2VzICVkIG51bV9zaW5rcyAlZCBzb3VyY2UgaGFuZGxlICVkIgotICAgICAgICAgICAgInNpbmsgaGFuZGxlICVkIiwKLSAgICAgICAgICBoYW5kbGUsIHBhdGNoLT5tQWZQYXRjaEhhbmRsZSwgcGF0Y2gtPm1QYXRjaC5udW1fc291cmNlcywgcGF0Y2gtPm1QYXRjaC5udW1fc2lua3MsCi0gICAgICAgICAgcGF0Y2gtPm1QYXRjaC5zb3VyY2VzWzBdLmlkLCBwYXRjaC0+bVBhdGNoLnNpbmtzWzBdLmlkKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVtb3ZlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCi17Ci0gICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShoYW5kbGUpOwotCi0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygicmVtb3ZlQXVkaW9QYXRjaCgpIHBhdGNoICVkIG5vdCBpbiIsIGhhbmRsZSk7Ci0gICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKLSAgICB9Ci0gICAgQUxPR1YoInJlbW92ZUF1ZGlvUGF0Y2goKSBoYW5kbGUgJWQgYWYgaGFuZGxlICVkIiwgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCktPm1BZlBhdGNoSGFuZGxlKTsKLSAgICBtQXVkaW9QYXRjaGVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQXVkaW9Qb2xpY3lNYW5hZ2VyCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6bmV4dFVuaXF1ZUlkKCkKLXsKLSAgICByZXR1cm4gYW5kcm9pZF9hdG9taWNfaW5jKCZtTmV4dFVuaXF1ZUlkKTsKLX0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpCi17Ci0gICAgcmV0dXJuIGFuZHJvaWRfYXRvbWljX2luYygmbUF1ZGlvUG9ydEdlbmVyYXRpb24pOwotfQotCi1BdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQotICAgIDoKLSNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAotICAgIFRocmVhZChmYWxzZSksCi0jZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotICAgIG1QcmltYXJ5T3V0cHV0KChhdWRpb19pb19oYW5kbGVfdCkwKSwKLSAgICBtUGhvbmVTdGF0ZShBVURJT19NT0RFX05PUk1BTCksCi0gICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUoZmFsc2UpLCBtTGFzdFZvaWNlVm9sdW1lKC0xLjBmKSwKLSAgICBtVG90YWxFZmZlY3RzQ3B1TG9hZCgwKSwgbVRvdGFsRWZmZWN0c01lbW9yeSgwKSwKLSAgICBtQTJkcFN1c3BlbmRlZChmYWxzZSksCi0gICAgbVNwZWFrZXJEcmNFbmFibGVkKGZhbHNlKSwgbU5leHRVbmlxdWVJZCgxKSwKLSAgICBtQXVkaW9Qb3J0R2VuZXJhdGlvbigxKSwKLSAgICBtQmVhY29uTXV0ZVJlZkNvdW50KDApLAotICAgIG1CZWFjb25QbGF5aW5nUmVmQ291bnQoMCksCi0gICAgbUJlYWNvbk11dGVkKGZhbHNlKQotewotICAgIG1VaWRDYWNoZWQgPSBnZXR1aWQoKTsKLSAgICBtcENsaWVudEludGVyZmFjZSA9IGNsaWVudEludGVyZmFjZTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlQ7IGkrKykgewotICAgICAgICBtRm9yY2VVc2VbaV0gPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKLSAgICB9Ci0KLSAgICBtRGVmYXVsdE91dHB1dERldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgoIiIpLCBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpOwotICAgIGlmIChsb2FkQXVkaW9Qb2xpY3lDb25maWcoQVVESU9fUE9MSUNZX1ZFTkRPUl9DT05GSUdfRklMRSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgaWYgKGxvYWRBdWRpb1BvbGljeUNvbmZpZyhBVURJT19QT0xJQ1lfQ09ORklHX0ZJTEUpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY291bGQgbm90IGxvYWQgYXVkaW8gcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZSwgc2V0dGluZyBkZWZhdWx0cyIpOwotICAgICAgICAgICAgZGVmYXVsdEF1ZGlvUG9saWN5Q29uZmlnKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gbUF2YWlsYWJsZU91dHB1dERldmljZXMgYW5kIG1BdmFpbGFibGVJbnB1dERldmljZXMgbm93IGNvbnRhaW4gYWxsIGF0dGFjaGVkIGRldmljZXMKLQotICAgIC8vIG11c3QgYmUgZG9uZSBhZnRlciByZWFkaW5nIHRoZSBwb2xpY3kKLSAgICBpbml0aWFsaXplVm9sdW1lQ3VydmVzKCk7Ci0KLSAgICAvLyBvcGVuIGFsbCBvdXRwdXQgc3RyZWFtcyBuZWVkZWQgdG8gYWNjZXNzIGF0dGFjaGVkIGRldmljZXMKLSAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpOwotICAgIGF1ZGlvX2RldmljZXNfdCBpbnB1dERldmljZVR5cGVzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYgfkFVRElPX0RFVklDRV9CSVRfSU47Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPSBtcENsaWVudEludGVyZmFjZS0+bG9hZEh3TW9kdWxlKG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKLSAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgewotICAgICAgICAgICAgQUxPR1coImNvdWxkIG5vdCBvcGVuIEhXIG1vZHVsZSAlcyIsIG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIG9wZW4gYWxsIG91dHB1dCBzdHJlYW1zIG5lZWRlZCB0byBhY2Nlc3MgYXR0YWNoZWQgZGV2aWNlcwotICAgICAgICAvLyBleGNlcHQgZm9yIGRpcmVjdCBvdXRwdXQgc3RyZWFtcyB0aGF0IGFyZSBvbmx5IG9wZW5lZCB3aGVuIHRoZXkgYXJlIGFjdHVhbGx5Ci0gICAgICAgIC8vIHJlcXVpcmVkIGJ5IGFuIGFwcC4KLSAgICAgICAgLy8gVGhpcyBhbHNvIHZhbGlkYXRlcyBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBsaXN0Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+IG91dFByb2ZpbGUgPSBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXNbal07Ci0KLSAgICAgICAgICAgIGlmIChvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiT3V0cHV0IHByb2ZpbGUgY29udGFpbnMgbm8gZGV2aWNlIG9uIG1vZHVsZSAlcyIsIG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKChvdXRQcm9maWxlLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcm9maWxlVHlwZSA9IG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCk7Ci0gICAgICAgICAgICBpZiAoKHByb2ZpbGVUeXBlICYgbURlZmF1bHRPdXRwdXREZXZpY2UtPm1EZXZpY2VUeXBlKSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgICAgIHByb2ZpbGVUeXBlID0gbURlZmF1bHRPdXRwdXREZXZpY2UtPm1EZXZpY2VUeXBlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBjaG9zZSBmaXJzdCBkZXZpY2UgcHJlc2VudCBpbiBtU3VwcG9ydGVkRGV2aWNlcyBhbHNvIHBhcnQgb2YKLSAgICAgICAgICAgICAgICAvLyBvdXRwdXREZXZpY2VUeXBlcwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrICA8IG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnNpemUoKTsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2ZpbGVUeXBlID0gb3V0UHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXNba10tPm1EZXZpY2VUeXBlOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHByb2ZpbGVUeXBlICYgb3V0cHV0RGV2aWNlVHlwZXMpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChwcm9maWxlVHlwZSAmIG91dHB1dERldmljZVR5cGVzKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBuZXcgQXVkaW9PdXRwdXREZXNjcmlwdG9yKG91dFByb2ZpbGUpOwotCi0gICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gcHJvZmlsZVR5cGU7Ci0gICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7Ci0gICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlOwotICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IG91dHB1dERlc2MtPm1DaGFubmVsTWFzazsKLSAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBvdXRwdXREZXNjLT5tRm9ybWF0OwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChvdXRQcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1MYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzKTsKLQotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dXKCJDYW5ub3Qgb3BlbiBvdXRwdXQgc3RyZWFtIGZvciBkZXZpY2UgJTA4eCBvbiBodyBtb2R1bGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgbUh3TW9kdWxlc1tpXS0+bU5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayAgPCBvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzW2tdLT5tRGV2aWNlVHlwZTsKLSAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuaW5kZXhPZihvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlc1trXSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGdpdmUgYSB2YWxpZCBJRCB0byBhbiBhdHRhY2hlZCBkZXZpY2Ugb25jZSBjb25maXJtZWQgaXQgaXMgcmVhY2hhYmxlCi0gICAgICAgICAgICAgICAgICAgIGlmICgoaW5kZXggPj0gMCkgJiYgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2luZGV4XS0+bUlkID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPm1JZCA9IG5leHRVbmlxdWVJZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaW5kZXhdLT5tTW9kdWxlID0gbUh3TW9kdWxlc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVByaW1hcnlPdXRwdXQgPT0gMCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgb3V0UHJvZmlsZS0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSkgewotICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeU91dHB1dCA9IG91dHB1dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgb3V0cHV0RGVzYyk7Ci0gICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gb3BlbiBpbnB1dCBzdHJlYW1zIG5lZWRlZCB0byBhY2Nlc3MgYXR0YWNoZWQgZGV2aWNlcyB0byB2YWxpZGF0ZQotICAgICAgICAvLyBtQXZhaWxhYmxlSW5wdXREZXZpY2VzIGxpc3QKLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tSW5wdXRQcm9maWxlcy5zaXplKCk7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiBpblByb2ZpbGUgPSBtSHdNb2R1bGVzW2ldLT5tSW5wdXRQcm9maWxlc1tqXTsKLQotICAgICAgICAgICAgaWYgKGluUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIklucHV0IHByb2ZpbGUgY29udGFpbnMgbm8gZGV2aWNlIG9uIG1vZHVsZSAlcyIsIG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGNob3NlIGZpcnN0IGRldmljZSBwcmVzZW50IGluIG1TdXBwb3J0ZWREZXZpY2VzIGFsc28gcGFydCBvZgotICAgICAgICAgICAgLy8gaW5wdXREZXZpY2VUeXBlcwotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByb2ZpbGVUeXBlID0gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayAgPCBpblByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnNpemUoKTsgaysrKSB7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZVR5cGUgPSBpblByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzW2tdLT5tRGV2aWNlVHlwZTsKLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZVR5cGUgJiBpbnB1dERldmljZVR5cGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgocHJvZmlsZVR5cGUgJiBpbnB1dERldmljZVR5cGVzKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbmV3IEF1ZGlvSW5wdXREZXNjcmlwdG9yKGluUHJvZmlsZSk7Ci0KLSAgICAgICAgICAgIGlucHV0RGVzYy0+bUlucHV0U291cmNlID0gQVVESU9fU09VUkNFX01JQzsKLSAgICAgICAgICAgIGlucHV0RGVzYy0+bURldmljZSA9IHByb2ZpbGVUeXBlOwotCi0gICAgICAgICAgICAvLyBmaW5kIHRoZSBhZGRyZXNzCi0gICAgICAgICAgICBEZXZpY2VWZWN0b3IgaW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUocHJvZmlsZVR5cGUpOwotICAgICAgICAgICAgLy8gICB0aGUgaW5wdXRzIHZlY3RvciBtdXN0IGJlIG9mIHNpemUgMSwgYnV0IHdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggaGVyZQotICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaW5wdXREZXZpY2VzLnNpemUoKSA+IDAgPyBpbnB1dERldmljZXMuaXRlbUF0KDApLT5tQWRkcmVzcwotICAgICAgICAgICAgICAgICAgICA6IFN0cmluZzgoIiIpOwotICAgICAgICAgICAgQUxPR1YoIiAgZm9yIGlucHV0IGRldmljZSAweCV4IHVzaW5nIGFkZHJlc3MgJXMiLCBwcm9maWxlVHlwZSwgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBBTE9HRV9JRihpbnB1dERldmljZXMuc2l6ZSgpID09IDAsICJJbnB1dCBkZXZpY2UgbGlzdCBpcyBlbXB0eSEiKTsKLQotICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOwotICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gaW5wdXREZXNjLT5tU2FtcGxpbmdSYXRlOwotICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGlucHV0RGVzYy0+bUNoYW5uZWxNYXNrOwotICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IGlucHV0RGVzYy0+bUZvcm1hdDsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3BlbklucHV0KGluUHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXREZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfTUlDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUpOwotCi0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgIDwgaW5Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IGluUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXNba10tPm1EZXZpY2VUeXBlOwotICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmluZGV4T2YoaW5Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlc1trXSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGdpdmUgYSB2YWxpZCBJRCB0byBhbiBhdHRhY2hlZCBkZXZpY2Ugb25jZSBjb25maXJtZWQgaXQgaXMgcmVhY2hhYmxlCi0gICAgICAgICAgICAgICAgICAgIGlmICgoaW5kZXggPj0gMCkgJiYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdLT5tSWQgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdLT5tSWQgPSBuZXh0VW5pcXVlSWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdLT5tTW9kdWxlID0gbUh3TW9kdWxlc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VJbnB1dChpbnB1dCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dXKCJDYW5ub3Qgb3BlbiBpbnB1dCBzdHJlYW0gZm9yIGRldmljZSAlMDh4IG9uIGh3IG1vZHVsZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgaW5wdXREZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgIG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBtYWtlIHN1cmUgYWxsIGF0dGFjaGVkIGRldmljZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhIHVuaXF1ZSBJRAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICA8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnNpemUoKTspIHsKLSAgICAgICAgaWYgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldLT5tSWQgPT0gMCkgewotICAgICAgICAgICAgQUxPR1coIklucHV0IGRldmljZSAlMDh4IHVucmVhY2hhYmxlIiwgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0tPm1EZXZpY2VUeXBlKTsKLSAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpKys7Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICA8IG1BdmFpbGFibGVJbnB1dERldmljZXMuc2l6ZSgpOykgewotICAgICAgICBpZiAobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+bUlkID09IDApIHsKLSAgICAgICAgICAgIEFMT0dXKCJJbnB1dCBkZXZpY2UgJTA4eCB1bnJlYWNoYWJsZSIsIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPm1EZXZpY2VUeXBlKTsKLSAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMucmVtb3ZlKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0pOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaSsrOwotICAgIH0KLSAgICAvLyBtYWtlIHN1cmUgZGVmYXVsdCBkZXZpY2UgaXMgcmVhY2hhYmxlCi0gICAgaWYgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2YobURlZmF1bHRPdXRwdXREZXZpY2UpIDwgMCkgewotICAgICAgICBBTE9HRSgiRGVmYXVsdCBkZXZpY2UgJTA4eCBpcyB1bnJlYWNoYWJsZSIsIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5tRGV2aWNlVHlwZSk7Ci0gICAgfQotCi0gICAgQUxPR0VfSUYoKG1QcmltYXJ5T3V0cHV0ID09IDApLCAiRmFpbGVkIHRvIG9wZW4gcHJpbWFyeSBvdXRwdXQiKTsKLQotICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7Ci0KLSNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAotICAgIGlmIChtUHJpbWFyeU91dHB1dCAhPSAwKSB7Ci0gICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dENtZCA9IEF1ZGlvUGFyYW1ldGVyKCk7Ci0gICAgICAgIG91dHB1dENtZC5hZGRJbnQoU3RyaW5nOCgic2V0X2lkIiksIDApOwotICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtUHJpbWFyeU91dHB1dCwgb3V0cHV0Q21kLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIG1UZXN0RGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOwotICAgICAgICBtVGVzdFNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwotICAgICAgICBtVGVzdEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwotICAgICAgICBtVGVzdENoYW5uZWxzID0gIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICAgICAgbVRlc3RMYXRlbmN5TXMgPSAwOwotICAgICAgICBtQ3VyT3V0cHV0ID0gMDsKLSAgICAgICAgbURpcmVjdE91dHB1dCA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9URVNUX09VVFBVVFM7IGkrKykgewotICAgICAgICAgICAgbVRlc3RPdXRwdXRzW2ldID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCIpOwotICAgICAgICBydW4oYnVmZmVyLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKLSAgICB9Ci0jZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotfQotCi1BdWRpb1BvbGljeU1hbmFnZXI6On5BdWRpb1BvbGljeU1hbmFnZXIoKQotewotI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCi0gICAgZXhpdCgpOwotI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKLSAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG1PdXRwdXRzLmtleUF0KGkpKTsKLSAgIH0KLSAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VJbnB1dChtSW5wdXRzLmtleUF0KGkpKTsKLSAgIH0KLSAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmNsZWFyKCk7Ci0gICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmNsZWFyKCk7Ci0gICBtT3V0cHV0cy5jbGVhcigpOwotICAgbUlucHV0cy5jbGVhcigpOwotICAgbUh3TW9kdWxlcy5jbGVhcigpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmluaXRDaGVjaygpCi17Ci0gICAgcmV0dXJuIChtUHJpbWFyeU91dHB1dCA9PSAwKSA/IE5PX0lOSVQgOiBOT19FUlJPUjsKLX0KLQotI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6dGhyZWFkTG9vcCgpCi17Ci0gICAgQUxPR1YoImVudGVyaW5nIHRocmVhZExvb3AoKSIpOwotICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkKLSAgICB7Ci0gICAgICAgIFN0cmluZzggY29tbWFuZDsKLSAgICAgICAgaW50IHZhbHVlSW50OwotICAgICAgICBTdHJpbmc4IHZhbHVlOwotCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIG1XYWl0V29ya0NWLndhaXRSZWxhdGl2ZShtTG9jaywgbWlsbGlzZWNvbmRzKDUwKSk7Ci0KLSAgICAgICAgY29tbWFuZCA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKDAsIFN0cmluZzgoInRlc3RfY21kX3BvbGljeSIpKTsKLSAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihjb21tYW5kKTsKLQotICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoInRlc3RfY21kX3BvbGljeSIpLCB2YWx1ZUludCkgPT0gTk9fRVJST1IgJiYKLSAgICAgICAgICAgIHZhbHVlSW50ICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJUZXN0IGNvbW1hbmQgJXMgcmVjZWl2ZWQiLCBjb21tYW5kLnN0cmluZygpKTsKLSAgICAgICAgICAgIFN0cmluZzggdGFyZ2V0OwotICAgICAgICAgICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0YXJnZXQiKSwgdGFyZ2V0KSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHRhcmdldCA9ICJNYW5hZ2VyIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X291dHB1dCIpLCB2YWx1ZUludCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X291dHB1dCIpKTsKLSAgICAgICAgICAgICAgICBtQ3VyT3V0cHV0ID0gdmFsdWVJbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9kaXJlY3QiKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9kaXJlY3QiKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICJmYWxzZSIpIHsKLSAgICAgICAgICAgICAgICAgICAgbURpcmVjdE91dHB1dCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gInRydWUiKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EaXJlY3RPdXRwdXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2lucHV0IiksIHZhbHVlSW50KSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfaW5wdXQiKSk7Ci0gICAgICAgICAgICAgICAgbVRlc3RJbnB1dCA9IHZhbHVlSW50OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9mb3JtYXQiKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9mb3JtYXQiKSk7Ci0gICAgICAgICAgICAgICAgaW50IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAiUENNIDE2IGJpdHMiKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gIlBDTSA4IGJpdHMiKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAiQ29tcHJlc3NlZCBNUDMiKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9NUDM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gQVVESU9fRk9STUFUX0lOVkFMSUQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCA9PSAiTWFuYWdlciIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UZXN0Rm9ybWF0ID0gZm9ybWF0OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRQYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQYXJhbS5hZGRJbnQoU3RyaW5nOCgiZm9ybWF0IiksIGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sIG91dHB1dFBhcmFtLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfY2hhbm5lbHMiKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9jaGFubmVscyIpKTsKLSAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMgPSAwOwotCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICJDaGFubmVscyBTdGVyZW8iKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJDaGFubmVscyBNb25vIikgewotICAgICAgICAgICAgICAgICAgICBjaGFubmVscyA9ICBBVURJT19DSEFOTkVMX09VVF9NT05POwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbHMgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09ICJNYW5hZ2VyIikgewotICAgICAgICAgICAgICAgICAgICAgICAgbVRlc3RDaGFubmVscyA9IGNoYW5uZWxzOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRQYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQYXJhbS5hZGRJbnQoU3RyaW5nOCgiY2hhbm5lbHMiKSwgY2hhbm5lbHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLCBvdXRwdXRQYXJhbS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X3NhbXBsZVJhdGUiKSwgdmFsdWVJbnQpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9zYW1wbGVSYXRlIikpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZUludCA+PSAwICYmIHZhbHVlSW50IDw9IDk2MDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGluZ1JhdGUgPSB2YWx1ZUludDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCA9PSAiTWFuYWdlciIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UZXN0U2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRQYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQYXJhbS5hZGRJbnQoU3RyaW5nOCgic2FtcGxpbmdfcmF0ZSIpLCBzYW1wbGluZ1JhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLCBvdXRwdXRQYXJhbS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfcmVvcGVuIiksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfcmVvcGVuIikpOwotCi0gICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3IobVByaW1hcnlPdXRwdXQpOwotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChtUHJpbWFyeU91dHB1dCk7Ci0KLSAgICAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlSGFuZGxlID0gb3V0cHV0RGVzYy0+bU1vZHVsZS0+bUhhbmRsZTsKLQotICAgICAgICAgICAgICAgIG1PdXRwdXRzLnJlbW92ZUl0ZW0obVByaW1hcnlPdXRwdXQpOwotCi0gICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbmV3IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihOVUxMKTsKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOwotICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKLSAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlOwotICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2s7Ci0gICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IG91dHB1dERlc2MtPm1Gb3JtYXQ7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQobW9kdWxlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtUHJpbWFyeU91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tTGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MpOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZW9wZW4gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbSwgIgotICAgICAgICAgICAgICAgICAgICAgICAgInNhbXBsaW5nUmF0ZTogJWQsIGZvcm1hdCAlZCwgY2hhbm5lbHMgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSwgb3V0cHV0RGVzYy0+bUZvcm1hdCwgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgb3V0cHV0Q21kID0gQXVkaW9QYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0Q21kLmFkZEludChTdHJpbmc4KCJzZXRfaWQiKSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1QcmltYXJ5T3V0cHV0LCBvdXRwdXRDbWQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZE91dHB1dChtUHJpbWFyeU91dHB1dCwgb3V0cHV0RGVzYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKDAsIFN0cmluZzgoInRlc3RfY21kX3BvbGljeT0iKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZXhpdCgpCi17Ci0gICAgewotICAgICAgICBBdXRvTXV0ZXggX2wobUxvY2spOwotICAgICAgICByZXF1ZXN0RXhpdCgpOwotICAgICAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKLSAgICB9Ci0gICAgcmVxdWVzdEV4aXRBbmRXYWl0KCk7Ci19Ci0KLWludCBBdWRpb1BvbGljeU1hbmFnZXI6OnRlc3RPdXRwdXRJbmRleChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCi17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fVEVTVF9PVVRQVVRTOyBpKyspIHsKLSAgICAgICAgaWYgKG91dHB1dCA9PSBtVGVzdE91dHB1dHNbaV0pIHJldHVybiBpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLSNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCi0KLS8vIC0tLQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6YWRkT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjKQotewotICAgIG91dHB1dERlc2MtPm1Jb0hhbmRsZSA9IG91dHB1dDsKLSAgICBvdXRwdXREZXNjLT5tSWQgPSBuZXh0VW5pcXVlSWQoKTsKLSAgICBtT3V0cHV0cy5hZGQob3V0cHV0LCBvdXRwdXREZXNjKTsKLSAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6YWRkSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MpCi17Ci0gICAgaW5wdXREZXNjLT5tSW9IYW5kbGUgPSBpbnB1dDsKLSAgICBpbnB1dERlc2MtPm1JZCA9IG5leHRVbmlxdWVJZCgpOwotICAgIG1JbnB1dHMuYWRkKGlucHV0LCBpbnB1dERlc2MpOwotICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyAvKmluKi8sCi0gICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgLyppbiovLAotICAgICAgICBjb25zdCBTdHJpbmc4IGFkZHJlc3MgLyppbiovLAotICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzIC8qb3V0Ki8pIHsKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0KLSAgICAgICAgZGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmdldERldmljZShkZXZpY2UsIGFkZHJlc3MpOwotICAgIGlmIChkZXZEZXNjICE9IDApIHsKLSAgICAgICAgQUxPR1YoImZpbmRJb0hhbmRsZXNCeUFkZHJlc3MoKTogYWRkaW5nIG9wZW5lZCBvdXRwdXQgJWQgb24gc2FtZSBhZGRyZXNzICVzIiwKLSAgICAgICAgICAgICAgZGVzYy0+bUlvSGFuZGxlLCBhZGRyZXNzLnN0cmluZygpKTsKLSAgICAgICAgb3V0cHV0cy5hZGQoZGVzYy0+bUlvSGFuZGxlKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tPdXRwdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBhZGRyZXNzKQotewotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBkZXZEZXNjLT5tRGV2aWNlVHlwZTsKLSAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2M7Ci0gICAgLy8gZXJhc2UgYWxsIGN1cnJlbnQgc2FtcGxlIHJhdGVzLCBmb3JtYXRzIGFuZCBjaGFubmVsIG1hc2tzCi0gICAgZGV2RGVzYy0+Y2xlYXJDYXBhYmlsaXRpZXMoKTsKLQotICAgIGlmIChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSkgewotICAgICAgICAvLyBmaXJzdCBsaXN0IGFscmVhZHkgb3BlbiBvdXRwdXRzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgKGRlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSkgewotICAgICAgICAgICAgICAgIGlmICghZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIG9wZW5lZCBvdXRwdXQgJWQiLCBtT3V0cHV0cy5rZXlBdChpKSk7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG1PdXRwdXRzLmtleUF0KGkpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiICBjaGVja2luZyBhZGRyZXNzIG1hdGNoIGR1ZSB0byBkZXZpY2UgMHgleCIsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmRJb0hhbmRsZXNCeUFkZHJlc3MoZGVzYywgZGV2aWNlLCBhZGRyZXNzLCBvdXRwdXRzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gdGhlbiBsb29rIGZvciBvdXRwdXQgcHJvZmlsZXMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCi0gICAgICAgIFNvcnRlZFZlY3Rvcjwgc3A8SU9Qcm9maWxlPiA+IHByb2ZpbGVzOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID09IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlc1tqXTsKLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWRldmljZURpc3Rpbmd1aXNoZXNPbkFkZHJlc3MoZGV2aWNlKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPT0gcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXNbMF0tPm1BZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlcy5hZGQocHJvZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBwcm9maWxlICV6dSBmcm9tIG1vZHVsZSAlenUiLCBqLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEFMT0dWKCIgIGZvdW5kICVkIHByb2ZpbGVzLCAlZCBvdXRwdXRzIiwgcHJvZmlsZXMuc2l6ZSgpLCBvdXRwdXRzLnNpemUoKSk7Ci0KLSAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSAmJiBvdXRwdXRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBObyBvdXRwdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgJTA0eCIsIGRldmljZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gb3BlbiBvdXRwdXRzIGZvciBtYXRjaGluZyBwcm9maWxlcyBpZiBuZWVkZWQuIERpcmVjdCBvdXRwdXRzIGFyZSBhbHNvIG9wZW5lZCB0bwotICAgICAgICAvLyBxdWVyeSBmb3IgZHluYW1pYyBwYXJhbWV0ZXJzIGFuZCB3aWxsIGJlIGNsb3NlZCBsYXRlciBieSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKQotICAgICAgICBmb3IgKHNzaXplX3QgcHJvZmlsZV9pbmRleCA9IDA7IHByb2ZpbGVfaW5kZXggPCAoc3NpemVfdClwcm9maWxlcy5zaXplKCk7IHByb2ZpbGVfaW5kZXgrKykgewotICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gcHJvZmlsZXNbcHJvZmlsZV9pbmRleF07Ci0KLSAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaWYgb25lIG91dHB1dCBpcyBhbHJlYWR5IG9wZW5lZCBmb3IgdGhpcyBwcm9maWxlCi0gICAgICAgICAgICBzaXplX3QgajsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBvdXRwdXRzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHMuaXRlbUF0KGopKTsKLSAgICAgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIGRlc2MtPm1Qcm9maWxlID09IHByb2ZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hpbmcgcHJvZmlsZTogc2F2ZSB0aGUgc2FtcGxlIHJhdGVzLCBmb3JtYXQgYW5kIGNoYW5uZWwgbWFza3Mgc3VwcG9ydGVkCi0gICAgICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSBwcm9maWxlIGluIG91ciBkZXZpY2UgZGVzY3JpcHRvcgotICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5pbXBvcnRBdWRpb1BvcnQocHJvZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChqICE9IG91dHB1dHMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFMT0dWKCJvcGVuaW5nIG91dHB1dCBmb3IgZGV2aWNlICUwOHggd2l0aCBwYXJhbXMgJXMgcHJvZmlsZSAlcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCksIHByb2ZpbGUuZ2V0KCkpOwotICAgICAgICAgICAgZGVzYyA9IG5ldyBBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSk7Ci0gICAgICAgICAgICBkZXNjLT5tRGV2aWNlID0gZGV2aWNlOwotICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOwotICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gZGVzYy0+bVNhbXBsaW5nUmF0ZTsKLSAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBkZXNjLT5tQ2hhbm5lbE1hc2s7Ci0gICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gZGVzYy0+bUZvcm1hdDsKLSAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uc2FtcGxlX3JhdGUgPSBkZXNjLT5tU2FtcGxpbmdSYXRlOwotICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5jaGFubmVsX21hc2sgPSBkZXNjLT5tQ2hhbm5lbE1hc2s7Ci0gICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLmZvcm1hdCA9IGRlc2MtPm1Gb3JtYXQ7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KHByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLT5tTGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1GbGFncyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgZGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKLSAgICAgICAgICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOwotICAgICAgICAgICAgICAgIGRlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OwotCi0gICAgICAgICAgICAgICAgLy8gSGVyZSBpcyB3aGVyZSB0aGUgb3V0X3NldF9wYXJhbWV0ZXJzKCkgZm9yIGNhcmQgJiBkZXZpY2UgZ2V0cyBjYWxsZWQKLSAgICAgICAgICAgICAgICBpZiAoIWFkZHJlc3MuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhcmFtID0gYXVkaW9fZGV2aWNlX2FkZHJlc3NfdG9fcGFyYW1ldGVyKGRldmljZSwgYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG91dHB1dCwgU3RyaW5nOChwYXJhbSkpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKHBhcmFtKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBIZXJlIGlzIHdoZXJlIHdlIHN0ZXAgdGhyb3VnaCBhbmQgcmVzb2x2ZSBhbnkgImR5bmFtaWMiIGZpZWxkcwotICAgICAgICAgICAgICAgIFN0cmluZzggcmVwbHk7Ci0gICAgICAgICAgICAgICAgY2hhciAqdmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfU0FNUExJTkdfUkFURVMpKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcyAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RycGJyaygoY2hhciAqKXJlcGx5LnN0cmluZygpLCAiPSIpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bG9hZFNhbXBsaW5nUmF0ZXModmFsdWUgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX0ZPUk1BVFMpKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHN1cHBvcnRlZCBmb3JtYXRzICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJwYnJrKChjaGFyICopcmVwbHkuc3RyaW5nKCksICI9Iik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5sb2FkRm9ybWF0cyh2YWx1ZSArIDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzWzBdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfQ0hBTk5FTFMpKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHN1cHBvcnRlZCBjaGFubmVsIG1hc2tzICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJwYnJrKChjaGFyICopcmVwbHkuc3RyaW5nKCksICI9Iik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5sb2FkT3V0Q2hhbm5lbHModmFsdWUgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKChwcm9maWxlLT5tU2FtcGxpbmdSYXRlc1swXSA9PSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgPCAyKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICgocHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHByb2ZpbGUtPm1Gb3JtYXRzLnNpemUoKSA8IDIpKSB8fAotICAgICAgICAgICAgICAgICAgICAgKChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzWzBdID09IDApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHByb2ZpbGUtPm1DaGFubmVsTWFza3Muc2l6ZSgpIDwgMikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBtaXNzaW5nIHBhcmFtIik7Ci0gICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDAgfHwgcHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gMCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3NbMF0gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gcHJvZmlsZS0+cGlja1NhbXBsaW5nUmF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gcHJvZmlsZS0+cGlja0NoYW5uZWxNYXNrKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBwcm9maWxlLT5waWNrRm9ybWF0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uc2FtcGxlX3JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uY2hhbm5lbF9tYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5mb3JtYXQgPSBjb25maWcuZm9ybWF0OwotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChwcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MtPm1MYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tRmxhZ3MpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZE91dHB1dChvdXRwdXQsIGRlc2MpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhkZXZpY2UpICYmIGFkZHJlc3MgIT0gIjAiKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbVBvbGljeU1peGVzLmluZGV4T2ZLZXkoYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lNaXhlc1tpbmRleF0tPm1PdXRwdXQgPSBkZXNjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1Qb2xpY3lNaXggPSAmbVBvbGljeU1peGVzW2luZGV4XS0+bU1peDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIGNhbm5vdCBmaW5kIHBvbGljeSBmb3IgYWRkcmVzcyAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gZHVwbGljYXRlZCBvdXRwdXQgZm9yIGRpcmVjdCBvdXRwdXRzIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0cHV0cyB1c2VkIGJ5IGR5bmFtaWMgcG9saWN5IG1peGVzCi0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkdXBsaWNhdGVkT3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBpbml0aWFsIHN0cmVhbSB2b2x1bWUgZm9yIGRldmljZQotICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG91dHB1dCwgZGV2aWNlLCAwLCB0cnVlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPOiBjb25maWd1cmUgYXVkaW8gZWZmZWN0IG91dHB1dCBzdGFnZSBoZXJlCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wZW4gYSBkdXBsaWNhdGluZyBvdXRwdXQgdGhyZWFkIGZvciB0aGUgbmV3IG91dHB1dCBhbmQgdGhlIHByaW1hcnkgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVkT3V0cHV0ID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5EdXBsaWNhdGVPdXRwdXQob3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmltYXJ5T3V0cHV0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkdXBsaWNhdGVkT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGR1cGxpY2F0ZWQgb3V0cHV0IGRlc2NyaXB0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGR1cE91dHB1dERlc2MgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MSA9IG1PdXRwdXRzLnZhbHVlRm9yKG1QcmltYXJ5T3V0cHV0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MiA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGRlc2MtPm1TYW1wbGluZ1JhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bUZvcm1hdCA9IGRlc2MtPm1Gb3JtYXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gZGVzYy0+bUNoYW5uZWxNYXNrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1MYXRlbmN5ID0gZGVzYy0+bUxhdGVuY3k7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkT3V0cHV0KGR1cGxpY2F0ZWRPdXRwdXQsIGR1cE91dHB1dERlc2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhkdXBsaWNhdGVkT3V0cHV0LCBkZXZpY2UsIDAsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgY291bGQgbm90IG9wZW4gZHVwIG91dHB1dCBmb3IgJWQgYW5kICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmltYXJ5T3V0cHV0LCBvdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLnJlbW92ZUl0ZW0ob3V0cHV0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgY291bGQgbm90IG9wZW4gb3V0cHV0IGZvciBkZXZpY2UgJXgiLCBkZXZpY2UpOwotICAgICAgICAgICAgICAgIHByb2ZpbGVzLnJlbW92ZUF0KHByb2ZpbGVfaW5kZXgpOwotICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgtLTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQob3V0cHV0KTsKLSAgICAgICAgICAgICAgICBkZXZEZXNjLT5pbXBvcnRBdWRpb1BvcnQocHJvZmlsZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogc2V0T3V0cHV0RGV2aWNlKGRldj0weCV4LCBhZGRyPSVzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dCwgZGV2aWNlLCB0cnVlLypmb3JjZSovLCAwLypkZWxheSovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwvKnBhdGNoIGhhbmRsZSovLCBhZGRyZXNzLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBhZGRpbmcgb3V0cHV0ICVkIiwgb3V0cHV0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9maWxlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogTm8gb3V0cHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlICUwNHgiLCBkZXZpY2UpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7IC8vIERpc2Nvbm5lY3QKLSAgICAgICAgLy8gY2hlY2sgaWYgb25lIG9wZW5lZCBvdXRwdXQgaXMgbm90IG5lZWRlZCBhbnkgbW9yZSBhZnRlciBkaXNjb25uZWN0aW5nIG9uZSBkZXZpY2UKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZXhhY3QgbWF0Y2ggb24gZGV2aWNlCi0gICAgICAgICAgICAgICAgaWYgKGRldmljZURpc3Rpbmd1aXNoZXNPbkFkZHJlc3MoZGV2aWNlKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpID09IGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluZElvSGFuZGxlc0J5QWRkcmVzcyhkZXNjLCBkZXZpY2UsIGFkZHJlc3MsIG91dHB1dHMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIShkZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKQotICAgICAgICAgICAgICAgICAgICAgICAgJiBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGRpc2Nvbm5lY3RpbmcgYWRkaW5nIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dHMua2V5QXQoaSkpOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChtT3V0cHV0cy5rZXlBdChpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIENsZWFyIGFueSBwcm9maWxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGRpc2Nvbm5lY3RlZCBkZXZpY2UuCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdOwotICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGVhcmluZyBkaXJlY3Qgb3V0cHV0IHByb2ZpbGUgJXp1IG9uIG1vZHVsZSAlenUiLCBqLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5hZGQoMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tRm9ybWF0cy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmFkZCgwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tJbnB1dHNGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIGlucHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggYWRkcmVzcykKLXsKLSAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZGVzYzsKLSAgICBpZiAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpIHsKLSAgICAgICAgLy8gZmlyc3QgbGlzdCBhbHJlYWR5IG9wZW4gaW5wdXRzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQotICAgICAgICBmb3IgKHNpemVfdCBpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKLSAgICAgICAgICAgIGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5wdXRfaW5kZXgpOwotICAgICAgICAgICAgaWYgKGRlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgKGRldmljZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBhZGRpbmcgb3BlbmVkIGlucHV0ICVkIiwgbUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOwotICAgICAgICAgICAgICAgaW5wdXRzLmFkZChtSW5wdXRzLmtleUF0KGlucHV0X2luZGV4KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0aGVuIGxvb2sgZm9yIGlucHV0IHByb2ZpbGVzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQotICAgICAgICBTb3J0ZWRWZWN0b3I8IHNwPElPUHJvZmlsZT4gPiBwcm9maWxlczsKLSAgICAgICAgZm9yIChzaXplX3QgbW9kdWxlX2lkeCA9IDA7IG1vZHVsZV9pZHggPCBtSHdNb2R1bGVzLnNpemUoKTsgbW9kdWxlX2lkeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobUh3TW9kdWxlc1ttb2R1bGVfaWR4XS0+bUhhbmRsZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBwcm9maWxlX2luZGV4ID0gMDsKLSAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCA8IG1Id01vZHVsZXNbbW9kdWxlX2lkeF0tPm1JbnB1dFByb2ZpbGVzLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG1Id01vZHVsZXNbbW9kdWxlX2lkeF0tPm1JbnB1dFByb2ZpbGVzW3Byb2ZpbGVfaW5kZXhdOwotCi0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJiAoZGV2aWNlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhkZXZpY2UpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9PSBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlc1swXS0+bUFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZChwcm9maWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBhZGRpbmcgcHJvZmlsZSAlenUgZnJvbSBtb2R1bGUgJXp1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgsIG1vZHVsZV9pZHgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSAmJiBpbnB1dHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBBTE9HVygiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogTm8gaW5wdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgMHglWCIsIGRldmljZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gb3BlbiBpbnB1dHMgZm9yIG1hdGNoaW5nIHByb2ZpbGVzIGlmIG5lZWRlZC4gRGlyZWN0IGlucHV0cyBhcmUgYWxzbyBvcGVuZWQgdG8KLSAgICAgICAgLy8gcXVlcnkgZm9yIGR5bmFtaWMgcGFyYW1ldGVycyBhbmQgd2lsbCBiZSBjbG9zZWQgbGF0ZXIgYnkgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkKLSAgICAgICAgZm9yIChzc2l6ZV90IHByb2ZpbGVfaW5kZXggPSAwOyBwcm9maWxlX2luZGV4IDwgKHNzaXplX3QpcHJvZmlsZXMuc2l6ZSgpOyBwcm9maWxlX2luZGV4KyspIHsKLQotICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gcHJvZmlsZXNbcHJvZmlsZV9pbmRleF07Ci0gICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGlmIG9uZSBpbnB1dCBpcyBhbHJlYWR5IG9wZW5lZCBmb3IgdGhpcyBwcm9maWxlCi0gICAgICAgICAgICBzaXplX3QgaW5wdXRfaW5kZXg7Ci0gICAgICAgICAgICBmb3IgKGlucHV0X2luZGV4ID0gMDsgaW5wdXRfaW5kZXggPCBtSW5wdXRzLnNpemUoKTsgaW5wdXRfaW5kZXgrKykgewotICAgICAgICAgICAgICAgIGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5wdXRfaW5kZXgpOwotICAgICAgICAgICAgICAgIGlmIChkZXNjLT5tUHJvZmlsZSA9PSBwcm9maWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpbnB1dF9pbmRleCAhPSBtSW5wdXRzLnNpemUoKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBTE9HVigib3BlbmluZyBpbnB1dCBmb3IgZGV2aWNlIDB4JVggd2l0aCBwYXJhbXMgJXMiLCBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCkpOwotICAgICAgICAgICAgZGVzYyA9IG5ldyBBdWRpb0lucHV0RGVzY3JpcHRvcihwcm9maWxlKTsKLSAgICAgICAgICAgIGRlc2MtPm1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7Ci0gICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBkZXNjLT5tU2FtcGxpbmdSYXRlOwotICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGRlc2MtPm1DaGFubmVsTWFzazsKLSAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBkZXNjLT5tRm9ybWF0OwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuSW5wdXQocHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FIC8qRklYTUUqLyk7Ci0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBkZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotICAgICAgICAgICAgICAgIGRlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7Ci0gICAgICAgICAgICAgICAgZGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWFkZHJlc3MuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhcmFtID0gYXVkaW9fZGV2aWNlX2FkZHJlc3NfdG9fcGFyYW1ldGVyKGRldmljZSwgYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKGlucHV0LCBTdHJpbmc4KHBhcmFtKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocGFyYW0pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIEhlcmUgaXMgd2hlcmUgd2Ugc3RlcCB0aHJvdWdoIGFuZCByZXNvbHZlIGFueSAiZHluYW1pYyIgZmllbGRzCi0gICAgICAgICAgICAgICAgU3RyaW5nOCByZXBseTsKLSAgICAgICAgICAgICAgICBjaGFyICp2YWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXNbMF0gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXBseSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX1NBTVBMSU5HX1JBVEVTKSk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpIGRpcmVjdCBpbnB1dCBzdXAgc2FtcGxpbmcgcmF0ZXMgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnBicmsoKGNoYXIgKilyZXBseS5zdHJpbmcoKSwgIj0iKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRTYW1wbGluZ1JhdGVzKHZhbHVlICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX0ZPUk1BVFMpKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCkgZGlyZWN0IGlucHV0IHN1cCBmb3JtYXRzICVzIiwgcmVwbHkuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnBicmsoKGNoYXIgKilyZXBseS5zdHJpbmcoKSwgIj0iKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRGb3JtYXRzKHZhbHVlICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1DaGFubmVsTWFza3NbMF0gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXBseSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX0NIQU5ORUxTKSk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpIGRpcmVjdCBpbnB1dCBzdXAgY2hhbm5lbCBtYXNrcyAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RycGJyaygoY2hhciAqKXJlcGx5LnN0cmluZygpLCAiPSIpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEluQ2hhbm5lbHModmFsdWUgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKChwcm9maWxlLT5tU2FtcGxpbmdSYXRlc1swXSA9PSAwKSAmJiAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIDwgMikpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAoKHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IDApICYmIChwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgPCAyKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICgocHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSAmJiAocHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5zaXplKCkgPCAyKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImNoZWNrSW5wdXRzRm9yRGV2aWNlKCkgZGlyZWN0IGlucHV0IG1pc3NpbmcgcGFyYW0iKTsKLSAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQoaW5wdXQpOwotICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpbnB1dCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZElucHV0KGlucHV0LCBkZXNjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IC8vIGVuZGlmIGlucHV0ICE9IDAKLQotICAgICAgICAgICAgaWYgKGlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNoZWNrSW5wdXRzRm9yRGV2aWNlKCkgY291bGQgbm90IG9wZW4gaW5wdXQgZm9yIGRldmljZSAweCVYIiwgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBwcm9maWxlcy5yZW1vdmVBdChwcm9maWxlX2luZGV4KTsKLSAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4LS07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlucHV0cy5hZGQoaW5wdXQpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBhZGRpbmcgaW5wdXQgJWQiLCBpbnB1dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gLy8gZW5kIHNjYW4gcHJvZmlsZXMKLQotICAgICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBBTE9HVygiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogTm8gaW5wdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgMHglWCIsIGRldmljZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gRGlzY29ubmVjdAotICAgICAgICAvLyBjaGVjayBpZiBvbmUgb3BlbmVkIGlucHV0IGlzIG5vdCBuZWVkZWQgYW55IG1vcmUgYWZ0ZXIgZGlzY29ubmVjdGluZyBvbmUgZGV2aWNlCi0gICAgICAgIGZvciAoc2l6ZV90IGlucHV0X2luZGV4ID0gMDsgaW5wdXRfaW5kZXggPCBtSW5wdXRzLnNpemUoKTsgaW5wdXRfaW5kZXgrKykgewotICAgICAgICAgICAgZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbnB1dF9pbmRleCk7Ci0gICAgICAgICAgICBpZiAoIShkZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSAmCi0gICAgICAgICAgICAgICAgICAgIH5BVURJT19ERVZJQ0VfQklUX0lOKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBkaXNjb25uZWN0aW5nIGFkZGluZyBpbnB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgbUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOwotICAgICAgICAgICAgICAgIGlucHV0cy5hZGQobUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIENsZWFyIGFueSBwcm9maWxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGRpc2Nvbm5lY3RlZCBkZXZpY2UuCi0gICAgICAgIGZvciAoc2l6ZV90IG1vZHVsZV9pbmRleCA9IDA7IG1vZHVsZV9pbmRleCA8IG1Id01vZHVsZXMuc2l6ZSgpOyBtb2R1bGVfaW5kZXgrKykgewotICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbbW9kdWxlX2luZGV4XS0+bUhhbmRsZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBwcm9maWxlX2luZGV4ID0gMDsKLSAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCA8IG1Id01vZHVsZXNbbW9kdWxlX2luZGV4XS0+bUlucHV0UHJvZmlsZXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4KyspIHsKLSAgICAgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBtSHdNb2R1bGVzW21vZHVsZV9pbmRleF0tPm1JbnB1dFByb2ZpbGVzW3Byb2ZpbGVfaW5kZXhdOwotICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGNsZWFyaW5nIGRpcmVjdCBpbnB1dCBwcm9maWxlICV6dSBvbiBtb2R1bGUgJXp1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCwgbW9kdWxlX2luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5hZGQoMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tRm9ybWF0cy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmFkZCgwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gLy8gZW5kIGRpc2Nvbm5lY3QKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQotewotICAgIEFMT0dWKCJjbG9zZU91dHB1dCglZCkiLCBvdXRwdXQpOwotCi0gICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICBpZiAob3V0cHV0RGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJjbG9zZU91dHB1dCgpIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBvbGljeU1peGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtUG9saWN5TWl4ZXNbaV0tPm1PdXRwdXQgPT0gb3V0cHV0RGVzYykgewotICAgICAgICAgICAgbVBvbGljeU1peGVzW2ldLT5tT3V0cHV0LmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBsb29rIGZvciBkdXBsaWNhdGVkIG91dHB1dHMgY29ubmVjdGVkIHRvIHRoZSBvdXRwdXQgYmVpbmcgcmVtb3ZlZC4KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZHVwT3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChkdXBPdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJgotICAgICAgICAgICAgICAgIChkdXBPdXRwdXREZXNjLT5tT3V0cHV0MSA9PSBvdXRwdXREZXNjIHx8Ci0gICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bU91dHB1dDIgPT0gb3V0cHV0RGVzYykpIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYzI7Ci0gICAgICAgICAgICBpZiAoZHVwT3V0cHV0RGVzYy0+bU91dHB1dDEgPT0gb3V0cHV0RGVzYykgewotICAgICAgICAgICAgICAgIG91dHB1dERlc2MyID0gZHVwT3V0cHV0RGVzYy0+bU91dHB1dDI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG91dHB1dERlc2MyID0gZHVwT3V0cHV0RGVzYy0+bU91dHB1dDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBBcyBhbGwgYWN0aXZlIHRyYWNrcyBvbiBkdXBsaWNhdGVkIG91dHB1dCB3aWxsIGJlIGRlbGV0ZWQsCi0gICAgICAgICAgICAvLyBhbmQgYXMgdGhleSB3ZXJlIGFsc28gcmVmZXJlbmNlZCBvbiB0aGUgb3RoZXIgb3V0cHV0LCB0aGUgcmVmZXJlbmNlCi0gICAgICAgICAgICAvLyBjb3VudCBmb3IgdGhlaXIgc3RyZWFtIHR5cGUgbXVzdCBiZSBhZGp1c3RlZCBhY2NvcmRpbmdseSBvbgotICAgICAgICAgICAgLy8gdGhlIG90aGVyIG91dHB1dC4KLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgQVVESU9fU1RSRUFNX0NOVDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHJlZkNvdW50ID0gZHVwT3V0cHV0RGVzYy0+bVJlZkNvdW50W2pdOwotICAgICAgICAgICAgICAgIG91dHB1dERlc2MyLT5jaGFuZ2VSZWZDb3VudCgoYXVkaW9fc3RyZWFtX3R5cGVfdClqLC1yZWZDb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkdXBsaWNhdGVkT3V0cHV0ID0gbU91dHB1dHMua2V5QXQoaSk7Ci0gICAgICAgICAgICBBTE9HVigiY2xvc2VPdXRwdXQoKSBjbG9zaW5nIGFsc28gZHVwbGljYXRlZCBvdXRwdXQgJWQiLCBkdXBsaWNhdGVkT3V0cHV0KTsKLQotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KGR1cGxpY2F0ZWRPdXRwdXQpOwotICAgICAgICAgICAgbU91dHB1dHMucmVtb3ZlSXRlbShkdXBsaWNhdGVkT3V0cHV0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSk7Ci0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOwotICAgICAgICBtQXVkaW9QYXRjaGVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwotICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotICAgIH0KLQotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOwotICAgIHBhcmFtLmFkZChTdHJpbmc4KCJjbG9zaW5nIiksIFN0cmluZzgoInRydWUiKSk7Ci0gICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMob3V0cHV0LCBwYXJhbS50b1N0cmluZygpKTsKLQotICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOwotICAgIG1PdXRwdXRzLnJlbW92ZUl0ZW0ob3V0cHV0KTsKLSAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQotewotICAgIEFMT0dWKCJjbG9zZUlucHV0KCVkKSIsIGlucHV0KTsKLQotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKGlucHV0KTsKLSAgICBpZiAoaW5wdXREZXNjID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coImNsb3NlSW5wdXQoKSB1bmtub3duIGlucHV0ICVkIiwgaW5wdXQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUpOwotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKLSAgICAgICAgbUF1ZGlvUGF0Y2hlcy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKLSAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKLSAgICB9Ci0KLSAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VJbnB1dChpbnB1dCk7Ci0gICAgbUlucHV0cy5yZW1vdmVJdGVtKGlucHV0KTsKLX0KLQotU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dHNGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiA+IG9wZW5PdXRwdXRzKQotewotICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0czsKLQotICAgIEFMT0dWVigiZ2V0T3V0cHV0c0ZvckRldmljZSgpIGRldmljZSAlMDR4IiwgZGV2aWNlKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9wZW5PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIEFMT0dWVigib3V0cHV0ICVkIGlzRHVwbGljYXRlZD0lZCBkZXZpY2U9JTA0eCIsCi0gICAgICAgICAgICAgICAgaSwgb3Blbk91dHB1dHMudmFsdWVBdChpKS0+aXNEdXBsaWNhdGVkKCksIG9wZW5PdXRwdXRzLnZhbHVlQXQoaSktPnN1cHBvcnRlZERldmljZXMoKSk7Ci0gICAgICAgIGlmICgoZGV2aWNlICYgb3Blbk91dHB1dHMudmFsdWVBdChpKS0+c3VwcG9ydGVkRGV2aWNlcygpKSA9PSBkZXZpY2UpIHsKLSAgICAgICAgICAgIEFMT0dWVigiZ2V0T3V0cHV0c0ZvckRldmljZSgpIGZvdW5kIG91dHB1dCAlZCIsIG9wZW5PdXRwdXRzLmtleUF0KGkpKTsKLSAgICAgICAgICAgIG91dHB1dHMuYWRkKG9wZW5PdXRwdXRzLmtleUF0KGkpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gb3V0cHV0czsKLX0KLQotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OnZlY3RvcnNFcXVhbChTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0czIpCi17Ci0gICAgaWYgKG91dHB1dHMxLnNpemUoKSAhPSBvdXRwdXRzMi5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMxLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChvdXRwdXRzMVtpXSAhPSBvdXRwdXRzMltpXSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tPdXRwdXRGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KQotewotICAgIGF1ZGlvX2RldmljZXNfdCBvbGREZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gc3JjT3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2Uob2xkRGV2aWNlLCBtUHJldmlvdXNPdXRwdXRzKTsKLSAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IGRzdE91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKG5ld0RldmljZSwgbU91dHB1dHMpOwotCi0gICAgLy8gYWxzbyB0YWtlIGludG8gYWNjb3VudCBleHRlcm5hbCBwb2xpY3ktcmVsYXRlZCBjaGFuZ2VzOiBhZGQgYWxsIG91dHB1dHMgd2hpY2ggYXJlCi0gICAgLy8gYXNzb2NpYXRlZCB3aXRoIHBvbGljaWVzIGluIHRoZSAiYmVmb3JlIiBhbmQgImFmdGVyIiBvdXRwdXQgdmVjdG9ycwotICAgIEFMT0dWVigiY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpOiBwb2xpY3kgcmVsYXRlZCBvdXRwdXRzIik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDAgOyBpIDwgbVByZXZpb3VzT3V0cHV0cy5zaXplKCkgOyBpKyspIHsKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbVByZXZpb3VzT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoZGVzYyAhPSAwICYmIGRlc2MtPm1Qb2xpY3lNaXggIT0gTlVMTCkgewotICAgICAgICAgICAgc3JjT3V0cHV0cy5hZGQoZGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgIEFMT0dWVigiIHByZXZpb3VzIG91dHB1dHM6IGFkZGluZyAlZCIsIGRlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDAgOyBpIDwgbU91dHB1dHMuc2l6ZSgpIDsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChkZXNjICE9IDAgJiYgZGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBkc3RPdXRwdXRzLmFkZChkZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICAgICAgQUxPR1ZWKCIgbmV3IG91dHB1dHM6IGFkZGluZyAlZCIsIGRlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIXZlY3RvcnNFcXVhbChzcmNPdXRwdXRzLGRzdE91dHB1dHMpKSB7Ci0gICAgICAgIEFMT0dWKCJjaGVja091dHB1dEZvclN0cmF0ZWd5KCkgc3RyYXRlZ3kgJWQsIG1vdmluZyBmcm9tIG91dHB1dCAlZCB0byBvdXRwdXQgJWQiLAotICAgICAgICAgICAgICBzdHJhdGVneSwgc3JjT3V0cHV0c1swXSwgZHN0T3V0cHV0c1swXSk7Ci0gICAgICAgIC8vIG11dGUgc3RyYXRlZ3kgd2hpbGUgbW92aW5nIHRyYWNrcyBmcm9tIG9uZSBvdXRwdXQgdG8gYW5vdGhlcgotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNyY091dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKHNyY091dHB1dHNbaV0pOwotICAgICAgICAgICAgaWYgKGRlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoc3RyYXRlZ3kpKSB7Ci0gICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHN0cmF0ZWd5LCB0cnVlLCBzcmNPdXRwdXRzW2ldKTsKLSAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoc3RyYXRlZ3ksIGZhbHNlLCBzcmNPdXRwdXRzW2ldLCBNVVRFX1RJTUVfTVMsIG5ld0RldmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNb3ZlIGVmZmVjdHMgYXNzb2NpYXRlZCB0byB0aGlzIHN0cmF0ZWd5IGZyb20gcHJldmlvdXMgb3V0cHV0IHRvIG5ldyBvdXRwdXQKLSAgICAgICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSB7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBmeE91dHB1dCA9IHNlbGVjdE91dHB1dEZvckVmZmVjdHMoZHN0T3V0cHV0cyk7Ci0gICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG1vdmVkOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSBtRWZmZWN0cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgICAgIGlmIChlZmZlY3REZXNjLT5tU2Vzc2lvbiA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdERlc2MtPm1JbyAhPSBmeE91dHB1dCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobW92ZWQuaW5kZXhPZihlZmZlY3REZXNjLT5tSW8pIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBtb3ZpbmcgZWZmZWN0ICVkIHRvIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0cy5rZXlBdChpKSwgZnhPdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm1vdmVFZmZlY3RzKEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwgZWZmZWN0RGVzYy0+bUlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ4T3V0cHV0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVkLmFkZChlZmZlY3REZXNjLT5tSW8pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVmZmVjdERlc2MtPm1JbyA9IGZ4T3V0cHV0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBNb3ZlIHRyYWNrcyBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyYXRlZ3kgZnJvbSBwcmV2aW91cyBvdXRwdXQgdG8gbmV3IG91dHB1dAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7IGkrKykgewotICAgICAgICAgICAgaWYgKGkgPT0gQVVESU9fU1RSRUFNX1BBVENIKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSkgPT0gc3RyYXRlZ3kpIHsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpCi17Ci0gICAgaWYgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkKLSAgICAgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FKTsKLSAgICBpZiAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNXSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKQotICAgICAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkpOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEpOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfRFRNRik7Ci0gICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9SRVJPVVRJTkcpOwotfQotCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEEyZHBPdXRwdXQoKQotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiBvdXRwdXREZXNjLT5kZXZpY2UoKSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApIHsKLSAgICAgICAgICAgIHJldHVybiBtT3V0cHV0cy5rZXlBdChpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tBMmRwU3VzcGVuZCgpCi17Ci0gICAgYXVkaW9faW9faGFuZGxlX3QgYTJkcE91dHB1dCA9IGdldEEyZHBPdXRwdXQoKTsKLSAgICBpZiAoYTJkcE91dHB1dCA9PSAwKSB7Ci0gICAgICAgIG1BMmRwU3VzcGVuZGVkID0gZmFsc2U7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBib29sIGlzU2NvQ29ubmVjdGVkID0KLSAgICAgICAgICAgICgobUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCAmCi0gICAgICAgICAgICAgICAgICAgIH5BVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwKSB8fAotICAgICAgICAgICAgKChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgQVVESU9fREVWSUNFX09VVF9BTExfU0NPKSAhPSAwKTsKLSAgICAvLyBzdXNwZW5kIEEyRFAgb3V0cHV0IGlmOgotICAgIC8vICAgICAgKE5PVCBhbHJlYWR5IHN1c3BlbmRlZCkgJiYKLSAgICAvLyAgICAgICgoU0NPIGRldmljZSBpcyBjb25uZWN0ZWQgJiYKLSAgICAvLyAgICAgICAoZm9yY2VkIHVzYWdlIGZvciBjb21tdW5pY2F0aW9uIHx8IGZvciByZWNvcmQgaXMgU0NPKSkpIHx8Ci0gICAgLy8gICAgICAocGhvbmUgc3RhdGUgaXMgcmluZ2luZyB8fCBpbiBjYWxsKQotICAgIC8vCi0gICAgLy8gcmVzdG9yZSBBMkRQIG91dHB1dCBpZjoKLSAgICAvLyAgICAgIChBbHJlYWR5IHN1c3BlbmRlZCkgJiYKLSAgICAvLyAgICAgICgoU0NPIGRldmljZSBpcyBOT1QgY29ubmVjdGVkIHx8Ci0gICAgLy8gICAgICAgKGZvcmNlZCB1c2FnZSBOT1QgZm9yIGNvbW11bmljYXRpb24gJiYgTk9UIGZvciByZWNvcmQgaXMgU0NPKSkpICYmCi0gICAgLy8gICAgICAocGhvbmUgc3RhdGUgaXMgTk9UIHJpbmdpbmcgJiYgTk9UIGluIGNhbGwpCi0gICAgLy8KLSAgICBpZiAobUEyZHBTdXNwZW5kZWQpIHsKLSAgICAgICAgaWYgKCghaXNTY29Db25uZWN0ZWQgfHwKLSAgICAgICAgICAgICAoKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pICYmCi0gICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pKSkgJiYKLSAgICAgICAgICAgICAoKG1QaG9uZVN0YXRlICE9IEFVRElPX01PREVfSU5fQ0FMTCkgJiYKLSAgICAgICAgICAgICAgKG1QaG9uZVN0YXRlICE9IEFVRElPX01PREVfUklOR1RPTkUpKSkgewotCi0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVzdG9yZU91dHB1dChhMmRwT3V0cHV0KTsKLSAgICAgICAgICAgIG1BMmRwU3VzcGVuZGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoKGlzU2NvQ29ubmVjdGVkICYmCi0gICAgICAgICAgICAgKChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSB8fAotICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSkpIHx8Ci0gICAgICAgICAgICAgKChtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHx8Ci0gICAgICAgICAgICAgIChtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX1JJTkdUT05FKSkpIHsKLQotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnN1c3BlbmRPdXRwdXQoYTJkcE91dHB1dCk7Ci0gICAgICAgICAgICBtQTJkcFN1c3BlbmRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE5ld091dHB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGJvb2wgZnJvbUNhY2hlKQotewotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKLQotICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSk7Ci0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVVpZCAhPSBtVWlkQ2FjaGVkKSB7Ci0gICAgICAgICAgICBBTE9HVigiZ2V0TmV3T3V0cHV0RGV2aWNlKCkgZGV2aWNlICUwOHggZm9yY2VkIGJ5IHBhdGNoICVkIiwKLSAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmRldmljZSgpLCBvdXRwdXREZXNjLT5tUGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgcmV0dXJuIG91dHB1dERlc2MtPmRldmljZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gY2hlY2sgdGhlIGZvbGxvd2luZyBieSBvcmRlciBvZiBwcmlvcml0eSB0byByZXF1ZXN0IGEgcm91dGluZyBjaGFuZ2UgaWYgbmVjZXNzYXJ5OgotICAgIC8vIDE6IHRoZSBzdHJhdGVneSBlbmZvcmNlZCBhdWRpYmxlIGlzIGFjdGl2ZSBhbmQgZW5mb3JjZWQgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IGVuZm9yY2VkIGF1ZGlibGUKLSAgICAvLyAyOiB3ZSBhcmUgaW4gY2FsbCBvciB0aGUgc3RyYXRlZ3kgcGhvbmUgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBwaG9uZQotICAgIC8vIDM6IHRoZSBzdHJhdGVneSBmb3IgZW5mb3JjZWQgYXVkaWJsZSBpcyBhY3RpdmUgYnV0IG5vdCBlbmZvcmNlZCBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIHRoZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IGVuZm9yY2VkIGF1ZGlibGUKLSAgICAvLyA0OiB0aGUgc3RyYXRlZ3kgc29uaWZpY2F0aW9uIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgc29uaWZpY2F0aW9uCi0gICAgLy8gNTogdGhlIHN0cmF0ZWd5ICJyZXNwZWN0ZnVsIiBzb25pZmljYXRpb24gaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSAicmVzcGVjdGZ1bCIgc29uaWZpY2F0aW9uCi0gICAgLy8gNjogdGhlIHN0cmF0ZWd5IGFjY2Vzc2liaWxpdHkgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBhY2Nlc3NpYmlsaXR5Ci0gICAgLy8gNzogdGhlIHN0cmF0ZWd5IG1lZGlhIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgbWVkaWEKLSAgICAvLyA4OiB0aGUgc3RyYXRlZ3kgRFRNRiBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IERUTUYKLSAgICAvLyA5OiB0aGUgc3RyYXRlZ3kgZm9yIGJlYWNvbiwgYS5rLmEuICJ0cmFuc21pdHRlZCB0aHJvdWdoIHNwZWFrZXIiIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgdC10LXMKLSAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKSAmJgotICAgICAgICBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKGlzSW5DYWxsKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShTVFJBVEVHWV9QSE9ORSkpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX1NPTklGSUNBVElPTikpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAob3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0FDQ0VTU0lCSUxJVFksIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX01FRElBKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoU1RSQVRFR1lfRFRNRikpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfRFRNRiwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVIsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX1JFUk9VVElORykpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUkVST1VUSU5HLCBmcm9tQ2FjaGUpOwotICAgIH0KLQotICAgIEFMT0dWKCJnZXROZXdPdXRwdXREZXZpY2UoKSBzZWxlY3RlZCBkZXZpY2UgJXgiLCBkZXZpY2UpOwotICAgIHJldHVybiBkZXZpY2U7Ci19Ci0KLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE5ld0lucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQotewotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKGlucHV0KTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUpOwotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgIGlmIChwYXRjaERlc2MtPm1VaWQgIT0gbVVpZENhY2hlZCkgewotICAgICAgICAgICAgQUxPR1YoImdldE5ld0lucHV0RGV2aWNlKCkgZGV2aWNlICUwOHggZm9yY2VkIGJ5IHBhdGNoICVkIiwKLSAgICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+bURldmljZSwgaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgcmV0dXJuIGlucHV0RGVzYy0+bURldmljZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShpbnB1dERlc2MtPm1JbnB1dFNvdXJjZSk7Ci0KLSAgICBBTE9HVigiZ2V0TmV3SW5wdXREZXZpY2UoKSBzZWxlY3RlZCBkZXZpY2UgJXgiLCBkZXZpY2UpOwotICAgIHJldHVybiBkZXZpY2U7Ci19Ci0KLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIHsKLSAgICByZXR1cm4gKHVpbnQzMl90KWdldFN0cmF0ZWd5KHN0cmVhbSk7Ci19Ci0KLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIHsKLSAgICAvLyBCeSBjaGVja2luZyB0aGUgcmFuZ2Ugb2Ygc3RyZWFtIGJlZm9yZSBjYWxsaW5nIGdldFN0cmF0ZWd5LCB3ZSBhdm9pZAotICAgIC8vIGdldFN0cmF0ZWd5J3MgYmVoYXZpb3IgZm9yIGludmFsaWQgc3RyZWFtcy4gIGdldFN0cmF0ZWd5IHdvdWxkIGRvIGEgQUxPR0UKLSAgICAvLyBhbmQgdGhlbiByZXR1cm4gU1RSQVRFR1lfTUVESUEsIGJ1dCB3ZSB3YW50IHRvIHJldHVybiB0aGUgZW1wdHkgc2V0LgotICAgIGlmIChzdHJlYW0gPCAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgMCB8fCBzdHJlYW0gPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOwotICAgIH0KLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlczsKLSAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOwotICAgIGRldmljZXMgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKLSAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKGRldmljZXMsIG1PdXRwdXRzKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0c1tpXSk7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKHN0cmF0ZWd5KSkgewotICAgICAgICAgICAgZGV2aWNlcyA9IG91dHB1dERlc2MtPmRldmljZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKkZpbHRlciBTUEVBS0VSX1NBRkUgb3V0IG9mIHJlc3VsdHMsIGFzIEF1ZGlvU2VydmljZSBkb2Vzbid0IGtub3cgYWJvdXQgaXQKLSAgICAgIGFuZCBkb2Vzbid0IHJlYWxseSBuZWVkIHRvLiovCi0gICAgaWYgKGRldmljZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSkgewotICAgICAgICBkZXZpY2VzIHw9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKLSAgICAgICAgZGV2aWNlcyAmPSB+QVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGRldmljZXM7Ci19Ci0KLUF1ZGlvUG9saWN5TWFuYWdlcjo6cm91dGluZ19zdHJhdGVneSBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmF0ZWd5KAotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgewotCi0gICAgQUxPR19BU1NFUlQoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9QQVRDSCwiZ2V0U3RyYXRlZ3koKSBjYWxsZWQgZm9yIEFVRElPX1NUUkVBTV9QQVRDSCIpOwotCi0gICAgLy8gc3RyZWFtIHRvIHN0cmF0ZWd5IG1hcHBpbmcKLSAgICBzd2l0Y2ggKHN0cmVhbSkgewotICAgIGNhc2UgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw6Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTzoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX1BIT05FOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX1JJTkc6Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fQUxBUk06Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9TT05JRklDQVRJT047Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUw7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fRFRNRjoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX0RUTUY7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR0UoInVua25vd24gc3RyZWFtIHR5cGUgJWQiLCBzdHJlYW0pOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX1NZU1RFTToKLSAgICAgICAgLy8gTk9URTogU1lTVEVNIHN0cmVhbSB1c2VzIE1FRElBIHN0cmF0ZWd5IGJlY2F1c2UgbXV0aW5nIG11c2ljIGFuZCBzd2l0Y2hpbmcgb3V0cHV0cwotICAgICAgICAvLyB3aGlsZSBrZXkgY2xpY2tzIGFyZSBwbGF5ZWQgcHJvZHVjZXMgYSBwb29yIHJlc3VsdAotICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfTUVESUE7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRToKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEU7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fVFRTOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFk6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX1JFUk9VVElORzoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX1JFUk9VVElORzsKLSAgICB9Ci19Ci0KLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyYXRlZ3lGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cikgewotICAgIC8vIGZsYWdzIHRvIHN0cmF0ZWd5IG1hcHBpbmcKLSAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19CRUFDT04pID09IEFVRElPX0ZMQUdfQkVBQ09OKSB7Ci0gICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUjsKLSAgICB9Ci0gICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgPT0gQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSB7Ci0gICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEU7Ci0gICAgfQotCi0gICAgLy8gdXNhZ2UgdG8gc3RyYXRlZ3kgbWFwcGluZwotICAgIHN3aXRjaCAoYXR0ci0+dXNhZ2UpIHsKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKLSAgICAgICAgaWYgKGlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9SSU5HKSB8fCBpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fQUxBUk0pKSB7Ci0gICAgICAgICAgICByZXR1cm4gKHVpbnQzMl90KSBTVFJBVEVHWV9TT05JRklDQVRJT047Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzSW5DYWxsKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX1BIT05FOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFk7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX01FRElBOgotICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgotICAgICAgICByZXR1cm4gKHVpbnQzMl90KSBTVFJBVEVHWV9NRURJQTsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKLSAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfUEhPTkU7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKLSAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfRFRNRjsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfQUxBUk06Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgotICAgICAgICByZXR1cm4gKHVpbnQzMl90KSBTVFJBVEVHWV9TT05JRklDQVRJT047Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTjoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1Q6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVDoKLSAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUw7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX1VOS05PV046Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfTUVESUE7Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aGFuZGxlTm90aWZpY2F0aW9uUm91dGluZ0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgewotICAgIHN3aXRjaChzdHJlYW0pIHsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9NVVNJQzoKLSAgICAgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCk7Ci0gICAgICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzQW55T3V0cHV0QWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVG9JZ25vcmUpIHsKLSAgICBmb3IgKHNpemVfdCBzID0gMCA7IHMgPCBBVURJT19TVFJFQU1fQ05UIDsgcysrKSB7Ci0gICAgICAgIGlmIChzID09IChzaXplX3QpIHN0cmVhbVRvSWdub3JlKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzXSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmhhbmRsZUV2ZW50Rm9yQmVhY29uKGludCBldmVudCkgewotICAgIHN3aXRjaChldmVudCkgewotICAgIGNhc2UgU1RBUlRJTkdfT1VUUFVUOgotICAgICAgICBtQmVhY29uTXV0ZVJlZkNvdW50Kys7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgU1RPUFBJTkdfT1VUUFVUOgotICAgICAgICBpZiAobUJlYWNvbk11dGVSZWZDb3VudCA+IDApIHsKLSAgICAgICAgICAgIG1CZWFjb25NdXRlUmVmQ291bnQtLTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFNUQVJUSU5HX0JFQUNPTjoKLSAgICAgICAgbUJlYWNvblBsYXlpbmdSZWZDb3VudCsrOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFNUT1BQSU5HX0JFQUNPTjoKLSAgICAgICAgaWYgKG1CZWFjb25QbGF5aW5nUmVmQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICBtQmVhY29uUGxheWluZ1JlZkNvdW50LS07Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKG1CZWFjb25NdXRlUmVmQ291bnQgPiAwKSB7Ci0gICAgICAgIC8vIGFueSBwbGF5YmFjayBjYXVzZXMgYmVhY29uIHRvIGJlIG11dGVkCi0gICAgICAgIHJldHVybiBzZXRCZWFjb25NdXRlKHRydWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIG5vIG90aGVyIHBsYXliYWNrOiB1bm11dGUgd2hlbiBiZWFjb24gc3RhcnRzIHBsYXlpbmcsIG11dGUgd2hlbiBpdCBzdG9wcwotICAgICAgICByZXR1cm4gc2V0QmVhY29uTXV0ZShtQmVhY29uUGxheWluZ1JlZkNvdW50ID09IDApOwotICAgIH0KLX0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRCZWFjb25NdXRlKGJvb2wgbXV0ZSkgewotICAgIEFMT0dWKCJzZXRCZWFjb25NdXRlKCVkKSBtQmVhY29uTXV0ZVJlZkNvdW50PSVkIG1CZWFjb25QbGF5aW5nUmVmQ291bnQ9JWQiLAotICAgICAgICAgICAgbXV0ZSwgbUJlYWNvbk11dGVSZWZDb3VudCwgbUJlYWNvblBsYXlpbmdSZWZDb3VudCk7Ci0gICAgLy8ga2VlcCB0cmFjayBvZiBtdXRlZCBzdGF0ZSB0byBhdm9pZCByZXBlYXRpbmcgbXV0ZS91bm11dGUgb3BlcmF0aW9ucwotICAgIGlmIChtQmVhY29uTXV0ZWQgIT0gbXV0ZSkgewotICAgICAgICAvLyBtdXRlL3VubXV0ZSBBVURJT19TVFJFQU1fVFRTIG9uIGFsbCBvdXRwdXRzCi0gICAgICAgIEFMT0dWKCJcdCBtdXRpbmcgJWQiLCBtdXRlKTsKLSAgICAgICAgdWludDMyX3QgbWF4TGF0ZW5jeSA9IDA7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBzZXRTdHJlYW1NdXRlKEFVRElPX1NUUkVBTV9UVFMsIG11dGUvKm9uKi8sCi0gICAgICAgICAgICAgICAgICAgIGRlc2MtPm1Jb0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgMCAvKmRlbGF5Ki8sIEFVRElPX0RFVklDRV9OT05FKTsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGxhdGVuY3kgPSBkZXNjLT5sYXRlbmN5KCkgKiAyOwotICAgICAgICAgICAgaWYgKGxhdGVuY3kgPiBtYXhMYXRlbmN5KSB7Ci0gICAgICAgICAgICAgICAgbWF4TGF0ZW5jeSA9IGxhdGVuY3k7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbUJlYWNvbk11dGVkID0gbXV0ZTsKLSAgICAgICAgcmV0dXJuIG1heExhdGVuY3k7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKQotewotICAgIHVpbnQzMl90IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOwotCi0gICAgaWYgKGZyb21DYWNoZSkgewotICAgICAgICBBTE9HVlYoImdldERldmljZUZvclN0cmF0ZWd5KCkgZnJvbSBjYWNoZSBzdHJhdGVneSAlZCwgZGV2aWNlICV4IiwKLSAgICAgICAgICAgICAgc3RyYXRlZ3ksIG1EZXZpY2VGb3JTdHJhdGVneVtzdHJhdGVneV0pOwotICAgICAgICByZXR1cm4gbURldmljZUZvclN0cmF0ZWd5W3N0cmF0ZWd5XTsKLSAgICB9Ci0gICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKTsKLSAgICBzd2l0Y2ggKHN0cmF0ZWd5KSB7Ci0KLSAgICBjYXNlIFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUjoKLSAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7Ci0gICAgICAgIGlmICghZGV2aWNlKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBubyBkZXZpY2UgZm91bmQgZm9yICJcCi0gICAgICAgICAgICAgICAgICAgICJTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVIiKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUw6Ci0gICAgICAgIGlmIChpc0luQ2FsbCgpKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04sIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICB9IGVsc2UgaWYgKGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoQVVESU9fU1RSRUFNX01VU0lDLAotICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKSkgewotICAgICAgICAgICAgLy8gd2hpbGUgbWVkaWEgaXMgcGxheWluZyBvbiBhIHJlbW90ZSBkZXZpY2UsIHVzZSB0aGUgdGhlIHNvbmlmaWNhdGlvbiBiZWhhdmlvci4KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSB0ZXN0IHRoaXMgdXNlY2FzZSBiZWZvcmUgdGVzdGluZyBpZiBtZWRpYSBpcyBwbGF5aW5nIGJlY2F1c2UKLSAgICAgICAgICAgIC8vICAgdGhlIGlzU3RyZWFtQWN0aXZlKCkgbWV0aG9kIG9ubHkgaW5mb3JtcyBhYm91dCB0aGUgYWN0aXZpdHkgb2YgYSBzdHJlYW0sIG5vdAotICAgICAgICAgICAgLy8gICBpZiBpdCdzIGZvciBsb2NhbCBwbGF5YmFjay4gTm90ZSBhbHNvIHRoYXQgd2UgdXNlIHRoZSBzYW1lIGRlbGF5IGJldHdlZW4gYm90aCB0ZXN0cwotICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgICAgIC8vdXNlciAic2FmZSIgc3BlYWtlciBpZiBhdmFpbGFibGUgaW5zdGVhZCBvZiBub3JtYWwgc3BlYWtlciB0byBhdm9pZCB0cmlnZ2VyaW5nCi0gICAgICAgICAgICAvL290aGVyIGFjb3VzdGljIHNhZmV0eSBtZWNoYW5pc21zIGZvciBub3RpZmljYXRpb24KLSAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSICYmIChhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSkKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRTsKLSAgICAgICAgfSBlbHNlIGlmIChpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMsIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKSkgewotICAgICAgICAgICAgLy8gd2hpbGUgbWVkaWEgaXMgcGxheWluZyAob3IgaGFzIHJlY2VudGx5IHBsYXllZCksIHVzZSB0aGUgc2FtZSBkZXZpY2UKLSAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHdoZW4gbWVkaWEgaXMgbm90IHBsYXlpbmcgYW55bW9yZSwgZmFsbCBiYWNrIG9uIHRoZSBzb25pZmljYXRpb24gYmVoYXZpb3IKLSAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTiwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgICAgICAvL3VzZXIgInNhZmUiIHNwZWFrZXIgaWYgYXZhaWxhYmxlIGluc3RlYWQgb2Ygbm9ybWFsIHNwZWFrZXIgdG8gYXZvaWQgdHJpZ2dlcmluZwotICAgICAgICAgICAgLy9vdGhlciBhY291c3RpYyBzYWZldHkgbWVjaGFuaXNtcyBmb3Igbm90aWZpY2F0aW9uCi0gICAgICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUiAmJiAoYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSkpCi0gICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkU7Ci0gICAgICAgIH0KLQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgU1RSQVRFR1lfRFRNRjoKLSAgICAgICAgaWYgKCFpc0luQ2FsbCgpKSB7Ci0gICAgICAgICAgICAvLyB3aGVuIG9mZiBjYWxsLCBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgdGhlIHNhbWUgcnVsZXMgYXMgTUVESUEgc3RyYXRlZ3kKLSAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIC8vIHdoZW4gaW4gY2FsbCwgRFRNRiBhbmQgUEhPTkUgc3RyYXRlZ2llcyBmb2xsb3cgdGhlIHNhbWUgcnVsZXMKLSAgICAgICAgLy8gRkFMTCBUSFJPVUdICi0KLSAgICBjYXNlIFNUUkFURUdZX1BIT05FOgotICAgICAgICAvLyBGb3JjZSB1c2Ugb2Ygb25seSBkZXZpY2VzIG9uIHByaW1hcnkgb3V0cHV0IGlmOgotICAgICAgICAvLyAtIGluIGNhbGwgQU5ECi0gICAgICAgIC8vICAgLSBjYW5ub3Qgcm91dGUgZnJvbSB2b2ljZSBjYWxsIFJYIE9SCi0gICAgICAgIC8vICAgLSBhdWRpbyBIQUwgdmVyc2lvbiBpcyA8IDMuMCBhbmQgVFggZGV2aWNlIGlzIG9uIHRoZSBwcmltYXJ5IEhXIG1vZHVsZQotICAgICAgICBpZiAobVBob25lU3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHhEZXZpY2UgPQotICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTik7Ci0gICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGh3T3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG1QcmltYXJ5T3V0cHV0KTsKLSAgICAgICAgICAgIGlmICgoKG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSAmCi0gICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlggJiB+QVVESU9fREVWSUNFX0JJVF9JTikgPT0gMCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKCgodHhEZXZpY2UgJiBhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCkgJiB+QVVESU9fREVWSUNFX0JJVF9JTikgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAoaHdPdXRwdXREZXNjLT5nZXRBdWRpb1BvcnQoKS0+bU1vZHVsZS0+bUhhbFZlcnNpb24gPAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSkpIHsKLSAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyA9IGF2YWlsYWJsZVByaW1hcnlPdXRwdXREZXZpY2VzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZm9yIHBob25lIHN0cmF0ZWd5LCB3ZSBmaXJzdCBjb25zaWRlciB0aGUgZm9yY2VkIHVzZSBhbmQgdGhlbiB0aGUgYXZhaWxhYmxlIGRldmljZXMgYnkgb3JkZXIKLSAgICAgICAgLy8gb2YgcHJpb3JpdHkKLSAgICAgICAgc3dpdGNoIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSkgewotICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ086Ci0gICAgICAgICAgICBpZiAoIWlzSW5DYWxsKCkgfHwgc3RyYXRlZ3kgIT0gU1RSQVRFR1lfRFRNRikgewotICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVDsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQ7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPOwotICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICAvLyBpZiBTQ08gZGV2aWNlIGlzIHJlcXVlc3RlZCBidXQgbm8gU0NPIGRldmljZSBpcyBhdmFpbGFibGUsIGZhbGwgYmFjayB0byBkZWZhdWx0IGNhc2UKLSAgICAgICAgICAgIC8vIEZBTEwgVEhST1VHSAotCi0gICAgICAgIGRlZmF1bHQ6ICAgIC8vIEZPUkNFX05PTkUKLSAgICAgICAgICAgIC8vIHdoZW4gbm90IGluIGEgcGhvbmUgY2FsbCwgcGhvbmUgc3RyYXRlZ3kgc2hvdWxkIHJvdXRlIFNUUkVBTV9WT0lDRV9DQUxMIHRvIEEyRFAKLSAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSAmJgotICAgICAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgotICAgICAgICAgICAgICAgICAgICAoZ2V0QTJkcE91dHB1dCgpICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORTsKLSAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQ7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOwotICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICBpZiAobVBob25lU3RhdGUgIT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlk7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTDsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQ7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0U7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIGRldmljZSA9IG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5tRGV2aWNlVHlwZTsKLSAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBubyBkZXZpY2UgZm91bmQgZm9yIFNUUkFURUdZX1BIT05FIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSOgotICAgICAgICAgICAgLy8gd2hlbiBub3QgaW4gYSBwaG9uZSBjYWxsLCBwaG9uZSBzdHJhdGVneSBzaG91bGQgcm91dGUgU1RSRUFNX1ZPSUNFX0NBTEwgdG8KLSAgICAgICAgICAgIC8vIEEyRFAgc3BlYWtlciB3aGVuIGZvcmNpbmcgdG8gc3BlYWtlciBvdXRwdXQKLSAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSAmJgotICAgICAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgotICAgICAgICAgICAgICAgICAgICAoZ2V0QTJkcE91dHB1dCgpICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVI7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWlzSW5DYWxsKCkpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWTsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRTsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQ7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVDsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9MSU5FOwotICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKLSAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgZGV2aWNlID0gbURlZmF1bHRPdXRwdXREZXZpY2UtPm1EZXZpY2VUeXBlOwotICAgICAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIG5vIGRldmljZSBmb3VuZCBmb3IgU1RSQVRFR1lfUEhPTkUsIEZPUkNFX1NQRUFLRVIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNUUkFURUdZX1NPTklGSUNBVElPTjoKLQotICAgICAgICAvLyBJZiBpbmNhbGwsIGp1c3Qgc2VsZWN0IHRoZSBTVFJBVEVHWV9QSE9ORSBkZXZpY2U6IFRoZSByZXN0IG9mIHRoZSBiZWhhdmlvciBpcyBoYW5kbGVkIGJ5Ci0gICAgICAgIC8vIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpLgotICAgICAgICBpZiAoaXNJbkNhbGwoKSkgewotICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRkFMTCBUSFJPVUdICi0KLSAgICBjYXNlIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEU6Ci0gICAgICAgIC8vIHN0cmF0ZWd5IFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUgdXNlcyBzYW1lIHJvdXRpbmcgcG9saWN5IGFzIFNUUkFURUdZX1NPTklGSUNBVElPTgotICAgICAgICAvLyBleGNlcHQ6Ci0gICAgICAgIC8vICAgLSB3aGVuIGluIGNhbGwgd2hlcmUgaXQgZG9lc24ndCBkZWZhdWx0IHRvIFNUUkFURUdZX1BIT05FIGJlaGF2aW9yCi0gICAgICAgIC8vICAgLSBpbiBjb3VudHJpZXMgd2hlcmUgbm90IGVuZm9yY2VkIGluIHdoaWNoIGNhc2UgaXQgZm9sbG93cyBTVFJBVEVHWV9NRURJQQotCi0gICAgICAgIGlmICgoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB8fAotICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKLSAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBzcGVha2VyIGRldmljZSBub3QgZm91bmQgZm9yIFNUUkFURUdZX1NPTklGSUNBVElPTiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFRoZSBzZWNvbmQgZGV2aWNlIHVzZWQgZm9yIHNvbmlmaWNhdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGUgZGV2aWNlIHVzZWQgYnkgbWVkaWEgc3RyYXRlZ3kKLSAgICAgICAgLy8gRkFMTCBUSFJPVUdICi0KLSAgICAvLyBGSVhNRTogU1RSQVRFR1lfQUNDRVNTSUJJTElUWSBhbmQgU1RSQVRFR1lfUkVST1VUSU5HIGZvbGxvdyBTVFJBVEVHWV9NRURJQSBmb3Igbm93Ci0gICAgY2FzZSBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZOgotICAgICAgICBpZiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfQUNDRVNTSUJJTElUWSkgewotICAgICAgICAgICAgLy8gZG8gbm90IHJvdXRlIGFjY2Vzc2liaWxpdHkgcHJvbXB0cyB0byBhIGRpZ2l0YWwgb3V0cHV0IGN1cnJlbnRseSBjb25maWd1cmVkIHdpdGggYQotICAgICAgICAgICAgLy8gY29tcHJlc3NlZCBmb3JtYXQgYXMgdGhleSB3b3VsZCBsaWtlbHkgbm90IGJlIG1peGVkIGFuZCBkcm9wcGVkLgotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBkZXNjLT5kZXZpY2UoKSAmCi0gICAgICAgICAgICAgICAgICAgIChBVURJT19ERVZJQ0VfT1VUX0hETUkgfCBBVURJT19ERVZJQ0VfT1VUX1NQRElGIHwgQVVESU9fREVWSUNFX09VVF9IRE1JX0FSQyk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlc2MtPmlzQWN0aXZlKCkgJiYgIWF1ZGlvX2lzX2xpbmVhcl9wY20oZGVzYy0+bUZvcm1hdCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZXMgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIH5kZXZpY2VzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBGQUxMIFRIUk9VR0gKLQotICAgIGNhc2UgU1RSQVRFR1lfUkVST1VUSU5HOgotICAgIGNhc2UgU1RSQVRFR1lfTUVESUE6IHsKLSAgICAgICAgdWludDMyX3QgZGV2aWNlMiA9IEFVRElPX0RFVklDRV9OT05FOwotICAgICAgICBpZiAoc3RyYXRlZ3kgIT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB7Ci0gICAgICAgICAgICAvLyBubyBzb25pZmljYXRpb24gb24gcmVtb3RlIHN1Ym1peCAoZS5nLiBXRkQpCi0gICAgICAgICAgICBpZiAobUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlKEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwgU3RyaW5nOCgiMCIpKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgJiYKLSAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgotICAgICAgICAgICAgICAgIChnZXRBMmRwT3V0cHV0KCkgIT0gMCkpIHsKLSAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFA7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgJiYKLSAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NQRUFLRVIpKSB7Ci0gICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkpIHsKLSAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfTElORTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVDsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpICYmIChzdHJhdGVneSAhPSBTVFJBVEVHWV9TT05JRklDQVRJT04pKSB7Ci0gICAgICAgICAgICAvLyBubyBzb25pZmljYXRpb24gb24gYXV4IGRpZ2l0YWwgKGUuZy4gSERNSSkKLSAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSAmJgotICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9ET0NLXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQU5BTE9HX0RPQ0spKSB7Ci0gICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGRldmljZTMgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICAgICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSB7Ci0gICAgICAgICAgICAvLyBBUkMsIFNQRElGIGFuZCBBVVhfTElORSBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMuCi0gICAgICAgICAgICBkZXZpY2UzID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDOwotICAgICAgICAgICAgZGV2aWNlMyB8PSAoYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRElGKTsKLSAgICAgICAgICAgIGRldmljZTMgfD0gKGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9BVVhfTElORSk7Ci0gICAgICAgIH0KLQotICAgICAgICBkZXZpY2UyIHw9IGRldmljZTM7Ci0gICAgICAgIC8vIGRldmljZSBpcyBERVZJQ0VfT1VUX1NQRUFLRVIgaWYgd2UgY29tZSBmcm9tIGNhc2UgU1RSQVRFR1lfU09OSUZJQ0FUSU9OIG9yCi0gICAgICAgIC8vIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsIEFVRElPX0RFVklDRV9OT05FIG90aGVyd2lzZQotICAgICAgICBkZXZpY2UgfD0gZGV2aWNlMjsKLQotICAgICAgICAvLyBJZiBoZG1pIHN5c3RlbSBhdWRpbyBtb2RlIGlzIG9uLCByZW1vdmUgc3BlYWtlciBvdXQgb2Ygb3V0cHV0IGxpc3QuCi0gICAgICAgIGlmICgoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfTUVESUEpICYmCi0gICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfSERNSV9TWVNURU1fQVVESU9dID09Ci0gICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0hETUlfU1lTVEVNX0FVRElPX0VORk9SQ0VEKSkgewotICAgICAgICAgICAgZGV2aWNlICY9IH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgZGV2aWNlID0gbURlZmF1bHRPdXRwdXREZXZpY2UtPm1EZXZpY2VUeXBlOwotICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBubyBkZXZpY2UgZm91bmQgZm9yIFNUUkFURUdZX01FRElBIik7Ci0gICAgICAgIH0KLSAgICAgICAgfSBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dXKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIHVua25vd24gc3RyYXRlZ3k6ICVkIiwgc3RyYXRlZ3kpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBBTE9HVlYoImdldERldmljZUZvclN0cmF0ZWd5KCkgc3RyYXRlZ3kgJWQsIGRldmljZSAleCIsIHN0cmF0ZWd5LCBkZXZpY2UpOwotICAgIHJldHVybiBkZXZpY2U7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpCi17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7Ci0gICAgICAgIG1EZXZpY2VGb3JTdHJhdGVneVtpXSA9IGdldERldmljZUZvclN0cmF0ZWd5KChyb3V0aW5nX3N0cmF0ZWd5KWksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgIH0KLSAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7Ci19Ci0KLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyhzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByZXZEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcykKLXsKLSAgICAvLyBtdXRlL3VubXV0ZSBzdHJhdGVnaWVzIHVzaW5nIGFuIGluY29tcGF0aWJsZSBkZXZpY2UgY29tYmluYXRpb24KLSAgICAvLyBpZiBtdXRpbmcsIHdhaXQgZm9yIHRoZSBhdWRpbyBpbiBwY20gYnVmZmVyIHRvIGJlIGRyYWluZWQgYmVmb3JlIHByb2NlZWRpbmcKLSAgICAvLyBpZiB1bm11dGluZywgdW5tdXRlIG9ubHkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBkZWxheQotICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBtdXRlV2FpdE1zID0gMDsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7Ci0gICAgYm9vbCBzaG91bGRNdXRlID0gb3V0cHV0RGVzYy0+aXNBY3RpdmUoKSAmJiAocG9wY291bnQoZGV2aWNlKSA+PSAyKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgewotICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyRGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKHJvdXRpbmdfc3RyYXRlZ3kpaSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgIGN1ckRldmljZSA9IGN1ckRldmljZSAmIG91dHB1dERlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpOwotICAgICAgICBib29sIG11dGUgPSBzaG91bGRNdXRlICYmIChjdXJEZXZpY2UgJiBkZXZpY2UpICYmIChjdXJEZXZpY2UgIT0gZGV2aWNlKTsKLSAgICAgICAgYm9vbCBkb011dGUgPSBmYWxzZTsKLQotICAgICAgICBpZiAobXV0ZSAmJiAhb3V0cHV0RGVzYy0+bVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSkgewotICAgICAgICAgICAgZG9NdXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0gPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKCFtdXRlICYmIG91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0pewotICAgICAgICAgICAgZG9NdXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0gPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZG9NdXRlKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1PdXRwdXRzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChqKTsKLSAgICAgICAgICAgICAgICAvLyBza2lwIG91dHB1dCBpZiBpdCBkb2VzIG5vdCBzaGFyZSBhbnkgZGV2aWNlIHdpdGggY3VycmVudCBvdXRwdXQKLSAgICAgICAgICAgICAgICBpZiAoKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSAmIG91dHB1dERlc2MtPnN1cHBvcnRlZERldmljZXMoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBjdXJPdXRwdXQgPSBtT3V0cHV0cy5rZXlBdChqKTsKLSAgICAgICAgICAgICAgICBBTE9HVlYoImNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoKSAlcyBzdHJhdGVneSAlZCAoY3VyRGV2aWNlICUwNHgpIG9uIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgbXV0ZSA/ICJtdXRpbmciIDogInVubXV0aW5nIiwgaSwgY3VyRGV2aWNlLCBjdXJPdXRwdXQpOwotICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZSgocm91dGluZ19zdHJhdGVneSlpLCBtdXRlLCBjdXJPdXRwdXQsIG11dGUgPyAwIDogZGVsYXlNcyk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoKHJvdXRpbmdfc3RyYXRlZ3kpaSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG11dGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBzaG91bGQgbm90IG5lZWQgdG8gZG91YmxlIGxhdGVuY3kgaWYgdm9sdW1lIGNvdWxkIGJlIGFwcGxpZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IGJ5IHRoZSBhdWRpb2ZsaW5nZXIgbWl4ZXIuIFdlIG11c3QgYWNjb3VudCBmb3IgdGhlIGRlbGF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBiZXR3ZWVuIG5vdyBhbmQgdGhlIG5leHQgdGltZSB0aGUgYXVkaW9mbGluZ2VyIHRocmVhZCBmb3IgdGhpcyBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgcHJvY2VzcyBhIGJ1ZmZlciAod2hpY2ggY29ycmVzcG9uZHMgdG8gb25lIGJ1ZmZlciBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXN1YWxseSAxLzIgb3IgMS80IG9mIHRoZSBsYXRlbmN5KS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdXRlV2FpdE1zIDwgZGVzYy0+bGF0ZW5jeSgpICogMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGVXYWl0TXMgPSBkZXNjLT5sYXRlbmN5KCkgKiAyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gdGVtcG9yYXJ5IG11dGUgb3V0cHV0IGlmIGRldmljZSBzZWxlY3Rpb24gY2hhbmdlcyB0byBhdm9pZCB2b2x1bWUgYnVyc3RzIGR1ZSB0bwotICAgIC8vIGRpZmZlcmVudCBwZXIgZGV2aWNlIHZvbHVtZXMKLSAgICBpZiAob3V0cHV0RGVzYy0+aXNBY3RpdmUoKSAmJiAoZGV2aWNlICE9IHByZXZEZXZpY2UpKSB7Ci0gICAgICAgIGlmIChtdXRlV2FpdE1zIDwgb3V0cHV0RGVzYy0+bGF0ZW5jeSgpICogMikgewotICAgICAgICAgICAgbXV0ZVdhaXRNcyA9IG91dHB1dERlc2MtPmxhdGVuY3koKSAqIDI7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZSgocm91dGluZ19zdHJhdGVneSlpKSkgewotICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZSgocm91dGluZ19zdHJhdGVneSlpLCB0cnVlLCBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICAgICAgICAgIC8vIGRvIHRlbXBNdXRlIHVubXV0ZSBhZnRlciB0d2ljZSB0aGUgbXV0ZSB3YWl0IHRpbWUKLSAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoKHJvdXRpbmdfc3RyYXRlZ3kpaSwgZmFsc2UsIG91dHB1dERlc2MtPm1Jb0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZVdhaXRNcyAqMiwgZGV2aWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHdhaXQgZm9yIHRoZSBQQ00gb3V0cHV0IGJ1ZmZlcnMgdG8gZW1wdHkgYmVmb3JlIHByb2NlZWRpbmcgd2l0aCB0aGUgcmVzdCBvZiB0aGUgY29tbWFuZAotICAgIGlmIChtdXRlV2FpdE1zID4gZGVsYXlNcykgewotICAgICAgICBtdXRlV2FpdE1zIC09IGRlbGF5TXM7Ci0gICAgICAgIHVzbGVlcChtdXRlV2FpdE1zICogMTAwMCk7Ci0gICAgICAgIHJldHVybiBtdXRlV2FpdE1zOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRPdXRwdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFkZHJlc3MpCi17Ci0gICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIG91dHB1dCAlZCBkZXZpY2UgJTA0eCBkZWxheU1zICVkIiwgb3V0cHV0LCBkZXZpY2UsIGRlbGF5TXMpOwotICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07Ci0gICAgdWludDMyX3QgbXV0ZVdhaXRNczsKLQotICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICBtdXRlV2FpdE1zID0gc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MtPm1PdXRwdXQxLT5tSW9IYW5kbGUsIGRldmljZSwgZm9yY2UsIGRlbGF5TXMpOwotICAgICAgICBtdXRlV2FpdE1zICs9IHNldE91dHB1dERldmljZShvdXRwdXREZXNjLT5tT3V0cHV0Mi0+bUlvSGFuZGxlLCBkZXZpY2UsIGZvcmNlLCBkZWxheU1zKTsKLSAgICAgICAgcmV0dXJuIG11dGVXYWl0TXM7Ci0gICAgfQotICAgIC8vIG5vIG5lZWQgdG8gcHJvY2VlZCBpZiBuZXcgZGV2aWNlIGlzIG5vdCBBVURJT19ERVZJQ0VfTk9ORSBhbmQgbm90IHN1cHBvcnRlZCBieSBjdXJyZW50Ci0gICAgLy8gb3V0cHV0IHByb2ZpbGUKLSAgICBpZiAoKGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgJiYKLSAgICAgICAgICAgICgoZGV2aWNlICYgb3V0cHV0RGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkpID09IDApKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8vIGZpbHRlciBkZXZpY2VzIGFjY29yZGluZyB0byBvdXRwdXQgc2VsZWN0ZWQKLSAgICBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KShkZXZpY2UgJiBvdXRwdXREZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSk7Ci0KLSAgICBhdWRpb19kZXZpY2VzX3QgcHJldkRldmljZSA9IG91dHB1dERlc2MtPm1EZXZpY2U7Ci0KLSAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgcHJldkRldmljZSAlMDR4IiwgcHJldkRldmljZSk7Ci0KLSAgICBpZiAoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgfQotICAgIG11dGVXYWl0TXMgPSBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKG91dHB1dERlc2MsIHByZXZEZXZpY2UsIGRlbGF5TXMpOwotCi0gICAgLy8gRG8gbm90IGNoYW5nZSB0aGUgcm91dGluZyBpZjoKLSAgICAvLyAgICAgIHRoZSByZXF1ZXN0ZWQgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9OT05FCi0gICAgLy8gICAgICBPUiB0aGUgcmVxdWVzdGVkIGRldmljZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50IGRldmljZQotICAgIC8vICBBTkQgZm9yY2UgaXMgbm90IHNwZWNpZmllZAotICAgIC8vICBBTkQgdGhlIG91dHB1dCBpcyBjb25uZWN0ZWQgYnkgYSB2YWxpZCBhdWRpbyBwYXRjaC4KLSAgICAvLyBEb2luZyB0aGlzIGNoZWNrIGhlcmUgYWxsb3dzIHRoZSBjYWxsZXIgdG8gY2FsbCBzZXRPdXRwdXREZXZpY2UoKSB3aXRob3V0IGNvbmRpdGlvbnMKLSAgICBpZiAoKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSB8fCBkZXZpY2UgPT0gcHJldkRldmljZSkgJiYgIWZvcmNlICYmCi0gICAgICAgICAgICBvdXRwdXREZXNjLT5tUGF0Y2hIYW5kbGUgIT0gMCkgewotICAgICAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgc2V0dGluZyBzYW1lIGRldmljZSAlMDR4IG9yIG51bGwgZGV2aWNlIGZvciBvdXRwdXQgJWQiLAotICAgICAgICAgICAgICBkZXZpY2UsIG91dHB1dCk7Ci0gICAgICAgIHJldHVybiBtdXRlV2FpdE1zOwotICAgIH0KLQotICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBjaGFuZ2luZyBkZXZpY2UiKTsKLQotICAgIC8vIGRvIHRoZSByb3V0aW5nCi0gICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICByZXNldE91dHB1dERldmljZShvdXRwdXQsIGRlbGF5TXMsIE5VTEwpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0gKGFkZHJlc3MgPT0gTlVMTCkgPwotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpCi0gICAgICAgICAgICAgICAgOiBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVBZGRyKGRldmljZSwgU3RyaW5nOChhZGRyZXNzKSk7Ci0gICAgICAgIGlmICghZGV2aWNlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzBdKTsKLSAgICAgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKLSAgICAgICAgICAgIHBhdGNoLm51bV9zaW5rcyA9IDA7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRldmljZUxpc3Quc2l6ZSgpICYmIGkgPCBBVURJT19QQVRDSF9QT1JUU19NQVg7IGkrKykgewotICAgICAgICAgICAgICAgIGRldmljZUxpc3QuaXRlbUF0KGkpLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc2lua3NbaV0pOwotICAgICAgICAgICAgICAgIHBhdGNoLm51bV9zaW5rcysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3NpemVfdCBpbmRleDsKLSAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSAmJiAqcGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqcGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShvdXRwdXREZXNjLT5tUGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8IEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZlBhdGNoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMpOwotICAgICAgICAgICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIGNyZWF0ZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiCi0gICAgICAgICAgICAgICAgICAgICJudW1fc291cmNlcyAlZCBudW1fc2lua3MgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBhZlBhdGNoSGFuZGxlLCBwYXRjaC5udW1fc291cmNlcywgcGF0Y2gubnVtX3NpbmtzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG5ldyBBdWRpb1BhdGNoKChhdWRpb19wYXRjaF9oYW5kbGVfdCluZXh0VW5pcXVlSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGNoLCBtVWlkQ2FjaGVkKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2ggPSBwYXRjaDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tVWlkID0gbVVpZENhY2hlZDsKLSAgICAgICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgKnBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7Ci0gICAgICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaW5mb3JtIGFsbCBpbnB1dCBhcyB3ZWxsCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ICBpbnB1dERlc2NyaXB0b3IgPSBtSW5wdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBpZiAoIWlzVmlydHVhbElucHV0RGV2aWNlKGlucHV0RGVzY3JpcHRvci0+bURldmljZSkpIHsKLSAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBpbnB1dENtZCA9IEF1ZGlvUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBpbmZvcm0gaW5wdXQgJWQgb2YgZGV2aWNlOiVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgaW5wdXREZXNjcmlwdG9yLT5tSW9IYW5kbGUsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgaW5wdXRDbWQuYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLGRldmljZSk7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoaW5wdXREZXNjcmlwdG9yLT5tSW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRDbWQudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHVwZGF0ZSBzdHJlYW0gdm9sdW1lcyBhY2NvcmRpbmcgdG8gbmV3IGRldmljZQotICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhvdXRwdXQsIGRldmljZSwgZGVsYXlNcyk7Ci0KLSAgICByZXR1cm4gbXV0ZVdhaXRNczsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZXNldE91dHB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUpCi17Ci0gICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICBzc2l6ZV90IGluZGV4OwotICAgIGlmIChwYXRjaEhhbmRsZSkgewotICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqcGF0Y2hIYW5kbGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSk7Ci0gICAgfQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBzcDwgQXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgZGVsYXlNcyk7Ci0gICAgQUxPR1YoInJlc2V0T3V0cHV0RGV2aWNlKCkgcmVsZWFzZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQiLCBzdGF0dXMpOwotICAgIG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSA9IDA7Ci0gICAgcmVtb3ZlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUpOwotICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0gICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUpCi17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0KLSAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUZvcihpbnB1dCk7Ci0gICAgaWYgKChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpICYmICgoZGV2aWNlICE9IGlucHV0RGVzYy0+bURldmljZSkgfHwgZm9yY2UpKSB7Ci0gICAgICAgIGlucHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKLQotICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7Ci0gICAgICAgIGlmICghZGV2aWNlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKLSAgICAgICAgICAgIGlucHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNpbmtzWzBdKTsKLSAgICAgICAgICAgIC8vIEFVRElPX1NPVVJDRV9IT1RXT1JEIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seToKLSAgICAgICAgICAgIC8vIGhhbmRsZWQgYXMgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIGJ5IHRoZSBhdWRpbyBIQUwKLSAgICAgICAgICAgIGlmIChwYXRjaC5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEICYmCi0gICAgICAgICAgICAgICAgICAgICFpbnB1dERlc2MtPm1Jc1NvdW5kVHJpZ2dlcikgewotICAgICAgICAgICAgICAgIHBhdGNoLnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXRjaC5udW1fc2lua3MgPSAxOwotICAgICAgICAgICAgLy9vbmx5IG9uZSBpbnB1dCBkZXZpY2UgZm9yIG5vdwotICAgICAgICAgICAgZGV2aWNlTGlzdC5pdGVtQXQoMCktPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzBdKTsKLSAgICAgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKLSAgICAgICAgICAgIHNzaXplX3QgaW5kZXg7Ci0gICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUgJiYgKnBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKnBhdGNoSGFuZGxlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8IEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgICAgIEFMT0dWKCJzZXRJbnB1dERldmljZSgpIGNyZWF0ZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGFmUGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbmV3IEF1ZGlvUGF0Y2goKGF1ZGlvX3BhdGNoX2hhbmRsZV90KW5leHRVbmlxdWVJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0Y2gsIG1VaWRDYWNoZWQpOwotICAgICAgICAgICAgICAgICAgICBhZGRBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSwgcGF0Y2hEZXNjKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaCA9IHBhdGNoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1VaWQgPSBtVWlkQ2FjaGVkOwotICAgICAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSkgewotICAgICAgICAgICAgICAgICAgICAqcGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+bVBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOwotICAgICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlc2V0SW5wdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlKQotewotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKGlucHV0KTsKLSAgICBzc2l6ZV90IGluZGV4OwotICAgIGlmIChwYXRjaEhhbmRsZSkgewotICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqcGF0Y2hIYW5kbGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKLSAgICB9Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIHNwPCBBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKLSAgICBBTE9HVigicmVzZXRJbnB1dERldmljZSgpIHJlbGVhc2VBdWRpb1BhdGNoIHJldHVybmVkICVkIiwgc3RhdHVzKTsKLSAgICBpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSA9IDA7Ci0gICAgcmVtb3ZlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUpOwotICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0gICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zcDxBdWRpb1BvbGljeU1hbmFnZXI6OklPUHJvZmlsZT4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dFByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCi17Ci0gICAgLy8gQ2hvb3NlIGFuIGlucHV0IHByb2ZpbGUgYmFzZWQgb24gdGhlIHJlcXVlc3RlZCBjYXB0dXJlIHBhcmFtZXRlcnM6IHNlbGVjdCB0aGUgZmlyc3QgYXZhaWxhYmxlCi0gICAgLy8gcHJvZmlsZSBzdXBwb3J0aW5nIGFsbCByZXF1ZXN0ZWQgcGFyYW1ldGVycy4KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID09IDApIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1JbnB1dFByb2ZpbGVzW2pdOwotICAgICAgICAgICAgLy8gcHJvZmlsZS0+bG9nKCk7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZpY2UsIGFkZHJlc3MsIHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGluZ1JhdGUgLyp1cGRhdGVkU2FtcGxpbmdSYXRlKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIGZsYWdzKSkgewotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByb2ZpbGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peCAqKnBvbGljeU1peCkKLXsKLSAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlRGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+QVVESU9fREVWSUNFX0JJVF9JTjsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBvbGljeU1peGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtUG9saWN5TWl4ZXNbaV0tPm1NaXgubU1peFR5cGUgIT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Qb2xpY3lNaXhlc1tpXS0+bU1peC5tQ3JpdGVyaWEuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIGlmICgoUlVMRV9NQVRDSF9BVFRSSUJVVEVfQ0FQVFVSRV9QUkVTRVQgPT0gbVBvbGljeU1peGVzW2ldLT5tTWl4Lm1Dcml0ZXJpYVtqXS5tUnVsZSAmJgotICAgICAgICAgICAgICAgICAgICBtUG9saWN5TWl4ZXNbaV0tPm1NaXgubUNyaXRlcmlhW2pdLm1BdHRyLm1Tb3VyY2UgPT0gaW5wdXRTb3VyY2UpIHx8Ci0gICAgICAgICAgICAgICAoUlVMRV9FWENMVURFX0FUVFJJQlVURV9DQVBUVVJFX1BSRVNFVCA9PSBtUG9saWN5TWl4ZXNbaV0tPm1NaXgubUNyaXRlcmlhW2pdLm1SdWxlICYmCi0gICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lNaXhlc1tpXS0+bU1peC5tQ3JpdGVyaWFbal0ubUF0dHIubVNvdXJjZSAhPSBpbnB1dFNvdXJjZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocG9saWN5TWl4ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpwb2xpY3lNaXggPSAmbVBvbGljeU1peGVzW2ldLT5tTWl4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UpOwotfQotCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkKLXsKLSAgICB1aW50MzJfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlRGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+QVVESU9fREVWSUNFX0JJVF9JTjsKLQotICAgIHN3aXRjaCAoaW5wdXRTb3VyY2UpIHsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTks6Ci0gICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTCkgewotICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9WT0lDRV9DQUxMOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFVRElPX1NPVVJDRV9ERUZBVUxUOgotICAgIGNhc2UgQVVESU9fU09VUkNFX01JQzoKLSAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApIHsKLSAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQOwotICAgIH0gZWxzZSBpZiAoKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRF0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgJiYKLSAgICAgICAgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCkpIHsKLSAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVDsKLSAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQpIHsKLSAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQ7Ci0gICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFKSB7Ci0gICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFOwotICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKLSAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDOwotICAgIH0KLSAgICBicmVhazsKLQotICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT046Ci0gICAgICAgIC8vIEFsbG93IG9ubHkgdXNlIG9mIGRldmljZXMgb24gcHJpbWFyeSBpbnB1dCBpZiBpbiBjYWxsIGFuZCBIQUwgZG9lcyBub3Qgc3VwcG9ydCByb3V0aW5nCi0gICAgICAgIC8vIHRvIHZvaWNlIGNhbGwgcGF0aC4KLSAgICAgICAgaWYgKChtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpICYmCi0gICAgICAgICAgICAgICAgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkgJiBBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCkgPT0gMCkgewotICAgICAgICAgICAgYXZhaWxhYmxlRGV2aWNlVHlwZXMgPSBhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCkgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0pIHsKLSAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPOgotICAgICAgICAgICAgLy8gaWYgU0NPIGRldmljZSBpcyByZXF1ZXN0ZWQgYnV0IG5vIFNDTyBkZXZpY2UgaXMgYXZhaWxhYmxlLCBmYWxsIGJhY2sgdG8gZGVmYXVsdCBjYXNlCi0gICAgICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEZBTEwgVEhST1VHSAotCi0gICAgICAgIGRlZmF1bHQ6ICAgIC8vIEZPUkNFX05PTkUKLSAgICAgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQ7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSOgotICAgICAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQykgewotICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT046Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfSE9UV09SRDoKLSAgICAgICAgaWYgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRF0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTyAmJgotICAgICAgICAgICAgICAgIGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCkgewotICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVDsKLSAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVDsKLSAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRTsKLSAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQykgewotICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fU09VUkNFX0NBTUNPUkRFUjoKLSAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQkFDS19NSUM7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKLSAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQzsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSzoKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMOgotICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTCkgewotICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEw7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWDoKLSAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpIHsKLSAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICBjYXNlIEFVRElPX1NPVVJDRV9GTV9UVU5FUjoKLSAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fRk1fVFVORVI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR1coImdldERldmljZUZvcklucHV0U291cmNlKCkgaW52YWxpZCBpbnB1dCBzb3VyY2UgJWQiLCBpbnB1dFNvdXJjZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBBTE9HVigiZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoKWlucHV0IHNvdXJjZSAlZCwgZGV2aWNlICUwOHgiLCBpbnB1dFNvdXJjZSwgZGV2aWNlKTsKLSAgICByZXR1cm4gZGV2aWNlOwotfQotCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNWaXJ0dWFsSW5wdXREZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkKLXsKLSAgICBpZiAoKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApIHsKLSAgICAgICAgZGV2aWNlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgICAgICBpZiAoKHBvcGNvdW50KGRldmljZSkgPT0gMSkgJiYgKChkZXZpY2UgJiB+QVBNX0FVRElPX0lOX0RFVklDRV9WSVJUVUFMX0FMTCkgPT0gMCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSB7Ci0gICAgcmV0dXJuICgoZGV2aWNlICYgQVBNX0FVRElPX0RFVklDRV9NQVRDSF9BRERSRVNTX0FMTCAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwKTsKLX0KLQotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRBY3RpdmVJbnB1dChib29sIGlnbm9yZVZpcnR1YWxJbnB1dHMpCi17Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiAgaW5wdXRfZGVzY3JpcHRvciA9IG1JbnB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKChpbnB1dF9kZXNjcmlwdG9yLT5tUmVmQ291bnQgPiAwKQotICAgICAgICAgICAgICAgICYmICghaWdub3JlVmlydHVhbElucHV0cyB8fCAhaXNWaXJ0dWFsSW5wdXREZXZpY2UoaW5wdXRfZGVzY3JpcHRvci0+bURldmljZSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUlucHV0cy5rZXlBdChpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphY3RpdmVJbnB1dHNDb3VudCgpIGNvbnN0Ci17Ci0gICAgdWludDMyX3QgY291bnQgPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gIGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChkZXNjLT5tUmVmQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICBjb3VudCsrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjb3VudDsKLX0KLQotCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VGb3JWb2x1bWUoYXVkaW9fZGV2aWNlc190IGRldmljZSkKLXsKLSAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgIC8vIHRoaXMgaGFwcGVucyB3aGVuIGZvcmNpbmcgYSByb3V0ZSB1cGRhdGUgYW5kIG5vIHRyYWNrIGlzIGFjdGl2ZSBvbiBhbiBvdXRwdXQuCi0gICAgICAgIC8vIEluIHRoaXMgY2FzZSB0aGUgcmV0dXJuZWQgY2F0ZWdvcnkgaXMgbm90IGltcG9ydGFudC4KLSAgICAgICAgZGV2aWNlID0gIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKLSAgICB9IGVsc2UgaWYgKHBvcGNvdW50KGRldmljZSkgPiAxKSB7Ci0gICAgICAgIC8vIE11bHRpcGxlIGRldmljZSBzZWxlY3Rpb24gaXMgZWl0aGVyOgotICAgICAgICAvLyAgLSBzcGVha2VyICsgb25lIG90aGVyIGRldmljZTogZ2l2ZSBwcmlvcml0eSB0byBzcGVha2VyIGluIHRoaXMgY2FzZS4KLSAgICAgICAgLy8gIC0gb25lIEEyRFAgZGV2aWNlICsgYW5vdGhlciBkZXZpY2U6IGhhcHBlbnMgd2l0aCBkdXBsaWNhdGVkIG91dHB1dC4gSW4gdGhpcyBjYXNlCi0gICAgICAgIC8vIHJldGFpbiB0aGUgZGV2aWNlIG9uIHRoZSBBMkRQIG91dHB1dCBhcyB0aGUgb3RoZXIgbXVzdCBub3QgY29ycmVzcG9uZCB0byBhbiBhY3RpdmUKLSAgICAgICAgLy8gc2VsZWN0aW9uIGlmIG5vdCB0aGUgc3BlYWtlci4KLSAgICAgICAgLy8gIC0gSERNSS1DRUMgc3lzdGVtIGF1ZGlvIG1vZGUgb25seSBvdXRwdXQ6IGdpdmUgcHJpb3JpdHkgdG8gYXZhaWxhYmxlIGl0ZW0gaW4gb3JkZXIuCi0gICAgICAgIGlmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpIHsKLSAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKLSAgICAgICAgfSBlbHNlIGlmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDOwotICAgICAgICB9IGVsc2UgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQVVYX0xJTkUpIHsKLSAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfQVVYX0xJTkU7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9TUERJRikgewotICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUERJRjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLypTUEVBS0VSX1NBRkUgaXMgYW4gYWxpYXMgb2YgU1BFQUtFUiBmb3IgcHVycG9zZXMgb2Ygdm9sdW1lIGNvbnRyb2wqLwotICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpCi0gICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKLQotICAgIEFMT0dXX0lGKHBvcGNvdW50KGRldmljZSkgIT0gMSwKLSAgICAgICAgICAgICJnZXREZXZpY2VGb3JWb2x1bWUoKSBpbnZhbGlkIGRldmljZSBjb21iaW5hdGlvbjogJTA4eCIsCi0gICAgICAgICAgICBkZXZpY2UpOwotCi0gICAgcmV0dXJuIGRldmljZTsKLX0KLQotQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkZXZpY2VfY2F0ZWdvcnkgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VDYXRlZ29yeShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQotewotICAgIHN3aXRjaChnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKSkgewotICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0U6Ci0gICAgICAgICAgICByZXR1cm4gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFOwotICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVDoKLSAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORToKLSAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ086Ci0gICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQ6Ci0gICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUDoKLSAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM6Ci0gICAgICAgICAgICByZXR1cm4gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQ7Ci0gICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9MSU5FOgotICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUw6Ci0gICAgICAgIC8qVVNCPyAgUmVtb3RlIHN1Ym1peD8qLwotICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUE7Ci0gICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOgotICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQ6Ci0gICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSOgotICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWToKLSAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U6Ci0gICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9TUEVBS0VSOwotICAgIH0KLX0KLQotLyogc3RhdGljICovCi1mbG9hdCBBdWRpb1BvbGljeU1hbmFnZXI6OnZvbEluZGV4VG9BbXBsKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGNvbnN0IFN0cmVhbURlc2NyaXB0b3ImIHN0cmVhbURlc2MsCi0gICAgICAgIGludCBpbmRleEluVWkpCi17Ci0gICAgZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5ID0gZ2V0RGV2aWNlQ2F0ZWdvcnkoZGV2aWNlKTsKLSAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpjdXJ2ZSA9IHN0cmVhbURlc2MubVZvbHVtZUN1cnZlW2RldmljZUNhdGVnb3J5XTsKLQotICAgIC8vIHRoZSB2b2x1bWUgaW5kZXggaW4gdGhlIFVJIGlzIHJlbGF0aXZlIHRvIHRoZSBtaW4gYW5kIG1heCB2b2x1bWUgaW5kaWNlcyBmb3IgdGhpcyBzdHJlYW0gdHlwZQotICAgIGludCBuYlN0ZXBzID0gMSArIGN1cnZlW1ZPTE1BWF0ubUluZGV4IC0KLSAgICAgICAgICAgIGN1cnZlW1ZPTE1JTl0ubUluZGV4OwotICAgIGludCB2b2xJZHggPSAobmJTdGVwcyAqIChpbmRleEluVWkgLSBzdHJlYW1EZXNjLm1JbmRleE1pbikpIC8KLSAgICAgICAgICAgIChzdHJlYW1EZXNjLm1JbmRleE1heCAtIHN0cmVhbURlc2MubUluZGV4TWluKTsKLQotICAgIC8vIGZpbmQgd2hhdCBwYXJ0IG9mIHRoZSBjdXJ2ZSB0aGlzIGluZGV4IHZvbHVtZSBiZWxvbmdzIHRvLCBvciBpZiBpdCdzIG91dCBvZiBib3VuZHMKLSAgICBpbnQgc2VnbWVudCA9IDA7Ci0gICAgaWYgKHZvbElkeCA8IGN1cnZlW1ZPTE1JTl0ubUluZGV4KSB7ICAgICAgICAgLy8gb3V0IG9mIGJvdW5kcwotICAgICAgICByZXR1cm4gMC4wZjsKLSAgICB9IGVsc2UgaWYgKHZvbElkeCA8IGN1cnZlW1ZPTEtORUUxXS5tSW5kZXgpIHsKLSAgICAgICAgc2VnbWVudCA9IDA7Ci0gICAgfSBlbHNlIGlmICh2b2xJZHggPCBjdXJ2ZVtWT0xLTkVFMl0ubUluZGV4KSB7Ci0gICAgICAgIHNlZ21lbnQgPSAxOwotICAgIH0gZWxzZSBpZiAodm9sSWR4IDw9IGN1cnZlW1ZPTE1BWF0ubUluZGV4KSB7Ci0gICAgICAgIHNlZ21lbnQgPSAyOwotICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0IG9mIGJvdW5kcwotICAgICAgICByZXR1cm4gMS4wZjsKLSAgICB9Ci0KLSAgICAvLyBsaW5lYXIgaW50ZXJwb2xhdGlvbiBpbiB0aGUgYXR0ZW51YXRpb24gdGFibGUgaW4gZEIKLSAgICBmbG9hdCBkZWNpYmVscyA9IGN1cnZlW3NlZ21lbnRdLm1EQkF0dGVudWF0aW9uICsKLSAgICAgICAgICAgICgoZmxvYXQpKHZvbElkeCAtIGN1cnZlW3NlZ21lbnRdLm1JbmRleCkpICoKLSAgICAgICAgICAgICAgICAoIChjdXJ2ZVtzZWdtZW50KzFdLm1EQkF0dGVudWF0aW9uIC0KLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1EQkF0dGVudWF0aW9uKSAvCi0gICAgICAgICAgICAgICAgICAgICgoZmxvYXQpKGN1cnZlW3NlZ21lbnQrMV0ubUluZGV4IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tSW5kZXgpKSApOwotCi0gICAgZmxvYXQgYW1wbGlmaWNhdGlvbiA9IGV4cCggZGVjaWJlbHMgKiAwLjExNTEyOWYpOyAvLyBleHAoIGRCICogbG4oMTApIC8gMjAgKQotCi0gICAgQUxPR1ZWKCJWT0xVTUUgdm9sIGluZGV4PVslZCAlZCAlZF0sIGRCPVslLjFmICUuMWYgJS4xZl0gYW1wbD0lLjVmIiwKLSAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1JbmRleCwgdm9sSWR4LAotICAgICAgICAgICAgY3VydmVbc2VnbWVudCsxXS5tSW5kZXgsCi0gICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tREJBdHRlbnVhdGlvbiwKLSAgICAgICAgICAgIGRlY2liZWxzLAotICAgICAgICAgICAgY3VydmVbc2VnbWVudCsxXS5tREJBdHRlbnVhdGlvbiwKLSAgICAgICAgICAgIGFtcGxpZmljYXRpb24pOwotCi0gICAgcmV0dXJuIGFtcGxpZmljYXRpb247Ci19Ci0KLWNvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAotICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c0RlZmF1bHRWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7Ci0gICAgezEsIC00OS41Zn0sIHszMywgLTMzLjVmfSwgezY2LCAtMTcuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50Ci0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0gewotICAgIHsxLCAtNTguMGZ9LCB7MjAsIC00MC4wZn0sIHs2MCwgLTE3LjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAotICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0gewotICAgIHsxLCAtNTguMGZ9LCB7MjAsIC00MC4wZn0sIHs2MCwgLTIxLjBmfSwgezEwMCwgLTEwLjBmfQotfTsKLQotY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50Ci0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0gewotICAgIHsxLCAtNTYuMGZ9LCB7MjAsIC0zNC4wZn0sIHs2MCwgLTExLjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAotICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlRHJjW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTU1LjBmfSwgezIwLCAtNDMuMGZ9LCB7ODYsIC0xMi4wZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKLSAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0gewotICAgIHsxLCAtMjkuN2Z9LCB7MzMsIC0yMC4xZn0sIHs2NiwgLTEwLjJmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAotICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyY1tBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7Ci0gICAgezEsIC0zNS43Zn0sIHszMywgLTI2LjFmfSwgezY2LCAtMTMuMmZ9LCB7MTAwLCAwLjBmfQotfTsKLQotLy8gQVVESU9fU1RSRUFNX1NZU1RFTSwgQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUgYW5kIEFVRElPX1NUUkVBTV9EVE1GIHZvbHVtZSB0cmFja3MKLS8vIEFVRElPX1NUUkVBTV9SSU5HIG9uIHBob25lcyBhbmQgQVVESU9fU1RSRUFNX01VU0lDIG9uIHRhYmxldHMuCi0vLyBBVURJT19TVFJFQU1fRFRNRiB0cmFja3MgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwgd2hpbGUgaW4gY2FsbCAoU2VlIEF1ZGlvU2VydmljZS5qYXZhKS4KLS8vIFRoZSByYW5nZSBpcyBjb25zdHJhaW5lZCBiZXR3ZWVuIC0yNGRCIGFuZCAtNmRCIG92ZXIgc3BlYWtlciBhbmQgLTMwZEIgYW5kIC0xOGRCIG92ZXIgaGVhZHNldC4KLQotY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50Ci0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTI0LjBmfSwgezMzLCAtMTguMGZ9LCB7NjYsIC0xMi4wZn0sIHsxMDAsIC02LjBmfQotfTsKLQotY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50Ci0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlRHJjW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTM0LjBmfSwgezMzLCAtMjQuMGZ9LCB7NjYsIC0xNS4wZn0sIHsxMDAsIC02LjBmfQotfTsKLQotY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50Ci0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTMwLjBmfSwgezMzLCAtMjYuMGZ9LCB7NjYsIC0yMi4wZn0sIHsxMDAsIC0xOC4wZn0KLX07Ci0KLWNvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAotICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKLSAgICB7MCwgLTQyLjBmfSwgezMzLCAtMjguMGZ9LCB7NjYsIC0xNC4wZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKLSAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7Ci0gICAgezAsIC0yNC4wZn0sIHszMywgLTE2LjBmfSwgezY2LCAtOC4wZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKLSAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNMaW5lYXJWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7Ci0gICAgezAsIC05Ni4wZn0sIHszMywgLTY4LjBmfSwgezY2LCAtMzQuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50Ci0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzU2lsZW50Vm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0gewotICAgIHswLCAtOTYuMGZ9LCB7MSwgLTk2LjBmfSwgezIsIC05Ni4wZn0sIHsxMDAsIC05Ni4wZn0KLX07Ci0KLWNvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAotICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKLSAgICB7MCwgMC4wZn0sIHsxLCAwLjBmfSwgezIsIDAuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50Ci0gICAgICAgICAgICAqQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzVm9sdW1lUHJvZmlsZXNbQVVESU9fU1RSRUFNX0NOVF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBdWRpb1BvbGljeU1hbmFnZXI6OkRFVklDRV9DQVRFR09SWV9DTlRdID0gewotICAgIHsgLy8gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwKLSAgICAgICAgc0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIHNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fU1lTVEVNCi0gICAgICAgIHNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgc0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICB9LAotICAgIHsgLy8gQVVESU9fU1RSRUFNX1JJTkcKLSAgICAgICAgc0RlZmF1bHRWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgc0RlZmF1bHRWb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fTVVTSUMKLSAgICAgICAgc0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fQUxBUk0KLSAgICAgICAgc0RlZmF1bHRWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgc0RlZmF1bHRWb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OCi0gICAgICAgIHNEZWZhdWx0Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIHNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIHNEZWZhdWx0Vm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgc0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICB9LAotICAgIHsgLy8gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08KLSAgICAgICAgc0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIHNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRQotICAgICAgICBzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgc0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICB9LAotICAgIHsgIC8vIEFVRElPX1NUUkVBTV9EVE1GCi0gICAgICAgIHNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fVFRTCi0gICAgICAvLyAiVHJhbnNtaXR0ZWQgVGhyb3VnaCBTcGVha2VyIjogYWx3YXlzIHNpbGVudCBleGNlcHQgb24gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgc1NpbGVudFZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBzTGluZWFyVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIHNTaWxlbnRWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIHNTaWxlbnRWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWQotICAgICAgICBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIHNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgc0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgc0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9SRVJPVVRJTkcKLSAgICAgICAgc0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIHNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIHNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fUEFUQ0gKLSAgICAgICAgc0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIHNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIHNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgIH0sCi19OwotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5pdGlhbGl6ZVZvbHVtZUN1cnZlcygpCi17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBERVZJQ0VfQ0FURUdPUllfQ05UOyBqKyspIHsKLSAgICAgICAgICAgIG1TdHJlYW1zW2ldLm1Wb2x1bWVDdXJ2ZVtqXSA9Ci0gICAgICAgICAgICAgICAgICAgIHNWb2x1bWVQcm9maWxlc1tpXVtqXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIENoZWNrIGF2YWlsYWJpbGl0eSBvZiBEUkMgb24gc3BlYWtlciBwYXRoOiBpZiBhdmFpbGFibGUsIG92ZXJyaWRlIHNvbWUgb2YgdGhlIHNwZWFrZXIgY3VydmVzCi0gICAgaWYgKG1TcGVha2VyRHJjRW5hYmxlZCkgewotICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fU1lTVEVNXS5tVm9sdW1lQ3VydmVbREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJdID0KLSAgICAgICAgICAgICAgICBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlRHJjOwotICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fUklOR10ubVZvbHVtZUN1cnZlW0RFVklDRV9DQVRFR09SWV9TUEVBS0VSXSA9Ci0gICAgICAgICAgICAgICAgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyYzsKLSAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX0FMQVJNXS5tVm9sdW1lQ3VydmVbREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJdID0KLSAgICAgICAgICAgICAgICBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjOwotICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OXS5tVm9sdW1lQ3VydmVbREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJdID0KLSAgICAgICAgICAgICAgICBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjOwotICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fTVVTSUNdLm1Wb2x1bWVDdXJ2ZVtERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl0gPQotICAgICAgICAgICAgICAgIHNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZURyYzsKLSAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFldLm1Wb2x1bWVDdXJ2ZVtERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl0gPQotICAgICAgICAgICAgICAgIHNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZURyYzsKLSAgICB9Ci19Ci0KLWZsb2F0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y29tcHV0ZVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCi17Ci0gICAgZmxvYXQgdm9sdW1lID0gMS4wOwotICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgU3RyZWFtRGVzY3JpcHRvciAmc3RyZWFtRGVzYyA9IG1TdHJlYW1zW3N0cmVhbV07Ci0KLSAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgIGRldmljZSA9IG91dHB1dERlc2MtPmRldmljZSgpOwotICAgIH0KLQotICAgIHZvbHVtZSA9IHZvbEluZGV4VG9BbXBsKGRldmljZSwgc3RyZWFtRGVzYywgaW5kZXgpOwotCi0gICAgLy8gaWYgYSBoZWFkc2V0IGlzIGNvbm5lY3RlZCwgYXBwbHkgdGhlIGZvbGxvd2luZyBydWxlcyB0byByaW5nIHRvbmVzIGFuZCBub3RpZmljYXRpb25zCi0gICAgLy8gdG8gYXZvaWQgc291bmQgbGV2ZWwgYnVyc3RzIGluIHVzZXIncyBlYXJzOgotICAgIC8vIC0gYWx3YXlzIGF0dGVudWF0ZSByaW5nIHRvbmVzIGFuZCBub3RpZmljYXRpb25zIHZvbHVtZSBieSA2ZEIKLSAgICAvLyAtIGlmIG11c2ljIGlzIHBsYXlpbmcsIGFsd2F5cyBsaW1pdCB0aGUgdm9sdW1lIHRvIGN1cnJlbnQgbXVzaWMgdm9sdW1lLAotICAgIC8vIHdpdGggYSBtaW5pbXVtIHRocmVzaG9sZCBhdCAtMzZkQiBzbyB0aGF0IG5vdGlmaWNhdGlvbiBpcyBhbHdheXMgcGVyY2VpdmVkLgotICAgIGNvbnN0IHJvdXRpbmdfc3RyYXRlZ3kgc3RyZWFtX3N0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koc3RyZWFtKTsKLSAgICBpZiAoKGRldmljZSAmIChBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQIHwKLSAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyB8Ci0gICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQgfAotICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkUpKSAmJgotICAgICAgICAoKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pCi0gICAgICAgICAgICAgICAgfHwgKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkKLSAgICAgICAgICAgICAgICB8fCAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9TWVNURU0pCi0gICAgICAgICAgICAgICAgfHwgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpKSkgJiYKLSAgICAgICAgc3RyZWFtRGVzYy5tQ2FuQmVNdXRlZCkgewotICAgICAgICB2b2x1bWUgKj0gU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX0ZBQ1RPUjsKLSAgICAgICAgLy8gd2hlbiB0aGUgcGhvbmUgaXMgcmluZ2luZyB3ZSBtdXN0IGNvbnNpZGVyIHRoYXQgbXVzaWMgY291bGQgaGF2ZSBiZWVuIHBhdXNlZCBqdXN0IGJlZm9yZQotICAgICAgICAvLyBieSB0aGUgbXVzaWMgYXBwbGljYXRpb24gYW5kIGJlaGF2ZSBhcyBpZiBtdXNpYyB3YXMgYWN0aXZlIGlmIHRoZSBsYXN0IG11c2ljIHRyYWNrIHdhcwotICAgICAgICAvLyBqdXN0IHN0b3BwZWQKLSAgICAgICAgaWYgKGlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9NVVNJQywgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVkpIHx8Ci0gICAgICAgICAgICAgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUpIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBtdXNpY0RldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBLCB0cnVlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICAgICAgZmxvYXQgbXVzaWNWb2wgPSBjb21wdXRlVm9sdW1lKEFVRElPX1NUUkVBTV9NVVNJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fTVVTSUNdLmdldFZvbHVtZUluZGV4KG11c2ljRGV2aWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzaWNEZXZpY2UpOwotICAgICAgICAgICAgZmxvYXQgbWluVm9sID0gKG11c2ljVm9sID4gU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX01JTikgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXNpY1ZvbCA6IFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9NSU47Ci0gICAgICAgICAgICBpZiAodm9sdW1lID4gbWluVm9sKSB7Ci0gICAgICAgICAgICAgICAgdm9sdW1lID0gbWluVm9sOwotICAgICAgICAgICAgICAgIEFMT0dWKCJjb21wdXRlVm9sdW1lIGxpbWl0aW5nIHZvbHVtZSB0byAlZiBtdXNpY1ZvbCAlZiIsIG1pblZvbCwgbXVzaWNWb2wpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHZvbHVtZTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0FuZFNldFZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpCi17Ci0KLSAgICAvLyBkbyBub3QgY2hhbmdlIGFjdHVhbCBzdHJlYW0gdm9sdW1lIGlmIHRoZSBzdHJlYW0gaXMgbXV0ZWQKLSAgICBpZiAobU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KS0+bU11dGVDb3VudFtzdHJlYW1dICE9IDApIHsKLSAgICAgICAgQUxPR1ZWKCJjaGVja0FuZFNldFZvbHVtZSgpIHN0cmVhbSAlZCBtdXRlZCBjb3VudCAlZCIsCi0gICAgICAgICAgICAgIHN0cmVhbSwgbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KS0+bU11dGVDb3VudFtzdHJlYW1dKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8vIGRvIG5vdCBjaGFuZ2UgaW4gY2FsbCB2b2x1bWUgaWYgYmx1ZXRvb3RoIGlzIGNvbm5lY3RlZCBhbmQgdmljZSB2ZXJzYQotICAgIGlmICgoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMICYmCi0gICAgICAgICAgICBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSB8fAotICAgICAgICAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPICYmCi0gICAgICAgICAgICAgICAgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykpIHsKLSAgICAgICAgQUxPR1YoImNoZWNrQW5kU2V0Vm9sdW1lKCkgY2Fubm90IHNldCBzdHJlYW0gJWQgdm9sdW1lIHdpdGggZm9yY2UgdXNlID0gJWQgZm9yIGNvbW0iLAotICAgICAgICAgICAgIHN0cmVhbSwgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0pOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgZmxvYXQgdm9sdW1lID0gY29tcHV0ZVZvbHVtZShzdHJlYW0sIGluZGV4LCBvdXRwdXQsIGRldmljZSk7Ci0gICAgLy8gdW5pdCBnYWluIGlmIHJlcm91dGluZyB0byBleHRlcm5hbCBwb2xpY3kKLSAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCkgewotICAgICAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOwotICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIm1heCBnYWluIHdoZW4gcmVyb3V0aW5nIGZvciBvdXRwdXQ9JWQiLCBvdXRwdXQpOwotICAgICAgICAgICAgICAgIHZvbHVtZSA9IDEuMGY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICAvLyBXZSBhY3R1YWxseSBjaGFuZ2UgdGhlIHZvbHVtZSBpZjoKLSAgICAvLyAtIHRoZSBmbG9hdCB2YWx1ZSByZXR1cm5lZCBieSBjb21wdXRlVm9sdW1lKCkgY2hhbmdlZAotICAgIC8vIC0gdGhlIGZvcmNlIGZsYWcgaXMgc2V0Ci0gICAgaWYgKHZvbHVtZSAhPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpLT5tQ3VyVm9sdW1lW3N0cmVhbV0gfHwKLSAgICAgICAgICAgIGZvcmNlKSB7Ci0gICAgICAgIG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCktPm1DdXJWb2x1bWVbc3RyZWFtXSA9IHZvbHVtZTsKLSAgICAgICAgQUxPR1ZWKCJjaGVja0FuZFNldFZvbHVtZSgpIGZvciBvdXRwdXQgJWQgc3RyZWFtICVkLCB2b2x1bWUgJWYsIGRlbGF5ICVkIiwgb3V0cHV0LCBzdHJlYW0sIHZvbHVtZSwgZGVsYXlNcyk7Ci0gICAgICAgIC8vIEZvcmNlIFZPSUNFX0NBTEwgdG8gdHJhY2sgQkxVRVRPT1RIX1NDTyBzdHJlYW0gdm9sdW1lIHdoZW4gYmx1ZXRvb3RoIGF1ZGlvIGlzCi0gICAgICAgIC8vIGVuYWJsZWQKLSAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTykgewotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgdm9sdW1lLCBvdXRwdXQsIGRlbGF5TXMpOwotICAgICAgICB9Ci0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCB2b2x1bWUsIG91dHB1dCwgZGVsYXlNcyk7Ci0gICAgfQotCi0gICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCB8fAotICAgICAgICBzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08pIHsKLSAgICAgICAgZmxvYXQgdm9pY2VWb2x1bWU7Ci0gICAgICAgIC8vIEZvcmNlIHZvaWNlIHZvbHVtZSB0byBtYXggZm9yIGJsdWV0b290aCBTQ08gYXMgdm9sdW1lIGlzIG1hbmFnZWQgYnkgdGhlIGhlYWRzZXQKLSAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkgewotICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAoZmxvYXQpaW5kZXgvKGZsb2F0KW1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWF4OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAxLjA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodm9pY2VWb2x1bWUgIT0gbUxhc3RWb2ljZVZvbHVtZSAmJiBvdXRwdXQgPT0gbVByaW1hcnlPdXRwdXQpIHsKLSAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRWb2ljZVZvbHVtZSh2b2ljZVZvbHVtZSwgZGVsYXlNcyk7Ci0gICAgICAgICAgICBtTGFzdFZvaWNlVm9sdW1lID0gdm9pY2VWb2x1bWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphcHBseVN0cmVhbVZvbHVtZXMoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKLXsKLSAgICBBTE9HVlYoImFwcGx5U3RyZWFtVm9sdW1lcygpIGZvciBvdXRwdXQgJWQgYW5kIGRldmljZSAleCIsIG91dHB1dCwgZGV2aWNlKTsKLQotICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1BBVENIKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0FuZFNldFZvbHVtZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1zW3N0cmVhbV0uZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlKTsKLSAgICB9Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTdHJhdGVneU11dGUocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCi17Ci0gICAgQUxPR1ZWKCJzZXRTdHJhdGVneU11dGUoKSBzdHJhdGVneSAlZCwgbXV0ZSAlZCwgb3V0cHV0ICVkIiwgc3RyYXRlZ3ksIG9uLCBvdXRwdXQpOwotICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1BBVENIKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtKSA9PSBzdHJhdGVneSkgewotICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sIG9uLCBvdXRwdXQsIGRlbGF5TXMsIGRldmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCi17Ci0gICAgU3RyZWFtRGVzY3JpcHRvciAmc3RyZWFtRGVzYyA9IG1TdHJlYW1zW3N0cmVhbV07Ci0gICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgIGRldmljZSA9IG91dHB1dERlc2MtPmRldmljZSgpOwotICAgIH0KLQotICAgIEFMT0dWVigic2V0U3RyZWFtTXV0ZSgpIHN0cmVhbSAlZCwgbXV0ZSAlZCwgb3V0cHV0ICVkLCBtTXV0ZUNvdW50ICVkIGRldmljZSAlMDR4IiwKLSAgICAgICAgICBzdHJlYW0sIG9uLCBvdXRwdXQsIG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSwgZGV2aWNlKTsKLQotICAgIGlmIChvbikgewotICAgICAgICBpZiAob3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dID09IDApIHsKLSAgICAgICAgICAgIGlmIChzdHJlYW1EZXNjLm1DYW5CZU11dGVkICYmCi0gICAgICAgICAgICAgICAgICAgICgoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKSB8fAotICAgICAgICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpKSkgewotICAgICAgICAgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwgMCwgb3V0cHV0LCBkZXZpY2UsIGRlbGF5TXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIGluY3JlbWVudCBtTXV0ZUNvdW50IGFmdGVyIGNhbGxpbmcgY2hlY2tBbmRTZXRWb2x1bWUoKSBzbyB0aGF0IHZvbHVtZSBjaGFuZ2UgaXMgbm90IGlnbm9yZWQKLSAgICAgICAgb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVigic2V0U3RyZWFtTXV0ZSgpIHVubXV0aW5nIG5vbiBtdXRlZCBzdHJlYW0hIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKC0tb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dID09IDApIHsKLSAgICAgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2MuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdGFydGluZywgYm9vbCBzdGF0ZUNoYW5nZSkKLXsKLSAgICAvLyBpZiB0aGUgc3RyZWFtIHBlcnRhaW5zIHRvIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBhbmQgd2UgYXJlIGluIGNhbGwgd2UgbXVzdAotICAgIC8vIG11dGUgdGhlIHN0cmVhbSBpZiBpdCBpcyBsb3cgdmlzaWJpbGl0eS4gSWYgaXQgaXMgaGlnaCB2aXNpYmlsaXR5LCB3ZSBtdXN0IHBsYXkgYSB0b25lCi0gICAgLy8gaW4gdGhlIGRldmljZSB1c2VkIGZvciBwaG9uZSBzdHJhdGVneSBhbmQgcGxheSB0aGUgdG9uZSBpZiB0aGUgc2VsZWN0ZWQgZGV2aWNlIGRvZXMgbm90Ci0gICAgLy8gaW50ZXJmZXJlIHdpdGggdGhlIGRldmljZSB1c2VkIGZvciBwaG9uZSBzdHJhdGVneQotICAgIC8vIGlmIHN0YXRlQ2hhbmdlIGlzIHRydWUsIHdlIGFyZSBjYWxsZWQgZnJvbSBzZXRQaG9uZVN0YXRlKCkgYW5kIHdlIG11c3QgbXV0ZSBvciB1bm11dGUgYXMKLSAgICAvLyBtYW55IHRpbWVzIGFzIHRoZXJlIGFyZSBhY3RpdmUgdHJhY2tzIG9uIHRoZSBvdXRwdXQKLSAgICBjb25zdCByb3V0aW5nX3N0cmF0ZWd5IHN0cmVhbV9zdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7Ci0gICAgaWYgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB8fAotICAgICAgICAgICAgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpKSkgewotICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihtUHJpbWFyeU91dHB1dCk7Ci0gICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBzdHJlYW0gJWQgc3RhcnRpbmcgJWQgZGV2aWNlICV4IHN0YXRlQ2hhbmdlICVkIiwKLSAgICAgICAgICAgICAgICBzdHJlYW0sIHN0YXJ0aW5nLCBvdXRwdXREZXNjLT5tRGV2aWNlLCBzdGF0ZUNoYW5nZSk7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSkgewotICAgICAgICAgICAgaW50IG11dGVDb3VudCA9IDE7Ci0gICAgICAgICAgICBpZiAoc3RhdGVDaGFuZ2UpIHsKLSAgICAgICAgICAgICAgICBtdXRlQ291bnQgPSBvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhdWRpb19pc19sb3dfdmlzaWJpbGl0eShzdHJlYW0pKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIGxvdyB2aXNpYmlsaXR5LCBtdXRlQ291bnQgJWQiLCBtdXRlQ291bnQpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXV0ZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZShzdHJlYW0sIHN0YXJ0aW5nLCBtUHJpbWFyeU91dHB1dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgaGlnaCB2aXNpYmlsaXR5Iik7Ci0gICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmRldmljZSgpICYKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FLCB0cnVlIC8qZnJvbUNhY2hlKi8pKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBoaWdoIHZpc2liaWxpdHkgbXV0ZWQsIG11dGVDb3VudCAlZCIsIG11dGVDb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXV0ZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0cmVhbU11dGUoc3RyZWFtLCBzdGFydGluZywgbVByaW1hcnlPdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzdGFydGluZykgewotICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c3RhcnRUb25lKEFVRElPX1BPTElDWV9UT05FX0lOX0NBTExfTk9USUZJQ0FUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c3RvcFRvbmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc0luQ2FsbCgpCi17Ci0gICAgcmV0dXJuIGlzU3RhdGVJbkNhbGwobVBob25lU3RhdGUpOwotfQotCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTdGF0ZUluQ2FsbChpbnQgc3RhdGUpIHsKLSAgICByZXR1cm4gKChzdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHx8Ci0gICAgICAgICAgICAoc3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DT01NVU5JQ0FUSU9OKSk7Ci19Ci0KLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TWF4RWZmZWN0c0NwdUxvYWQoKQotewotICAgIHJldHVybiBNQVhfRUZGRUNUU19DUFVfTE9BRDsKLX0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNYXhFZmZlY3RzTWVtb3J5KCkKLXsKLSAgICByZXR1cm4gTUFYX0VGRkVDVFNfTUVNT1JZOwotfQotCi0KLS8vIC0tLSBBdWRpb091dHB1dERlc2NyaXB0b3IgY2xhc3MgaW1wbGVtZW50YXRpb24KLQotQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcigKLSAgICAgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiYgcHJvZmlsZSkKLSAgICA6IG1JZCgwKSwgbUlvSGFuZGxlKDApLCBtTGF0ZW5jeSgwKSwKLSAgICBtRmxhZ3MoKGF1ZGlvX291dHB1dF9mbGFnc190KTApLCBtRGV2aWNlKEFVRElPX0RFVklDRV9OT05FKSwgbVBvbGljeU1peChOVUxMKSwKLSAgICBtUGF0Y2hIYW5kbGUoMCksCi0gICAgbU91dHB1dDEoMCksIG1PdXRwdXQyKDApLCBtUHJvZmlsZShwcm9maWxlKSwgbURpcmVjdE9wZW5Db3VudCgwKQotewotICAgIC8vIGNsZWFyIHVzYWdlIGNvdW50IGZvciBhbGwgc3RyZWFtIHR5cGVzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKLSAgICAgICAgbVJlZkNvdW50W2ldID0gMDsKLSAgICAgICAgbUN1clZvbHVtZVtpXSA9IC0xLjA7Ci0gICAgICAgIG1NdXRlQ291bnRbaV0gPSAwOwotICAgICAgICBtU3RvcFRpbWVbaV0gPSAwOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9TVFJBVEVHSUVTOyBpKyspIHsKLSAgICAgICAgbVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSA9IGZhbHNlOwotICAgIH0KLSAgICBpZiAocHJvZmlsZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1GbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdClwcm9maWxlLT5tRmxhZ3M7Ci0gICAgICAgIG1TYW1wbGluZ1JhdGUgPSBwcm9maWxlLT5waWNrU2FtcGxpbmdSYXRlKCk7Ci0gICAgICAgIG1Gb3JtYXQgPSBwcm9maWxlLT5waWNrRm9ybWF0KCk7Ci0gICAgICAgIG1DaGFubmVsTWFzayA9IHByb2ZpbGUtPnBpY2tDaGFubmVsTWFzaygpOwotICAgICAgICBpZiAocHJvZmlsZS0+bUdhaW5zLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIHByb2ZpbGUtPm1HYWluc1swXS0+Z2V0RGVmYXVsdENvbmZpZygmbUdhaW4pOwotICAgICAgICB9Ci0gICAgfQotfQotCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OmRldmljZSgpIGNvbnN0Ci17Ci0gICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7Ci0gICAgICAgIHJldHVybiAoYXVkaW9fZGV2aWNlc190KShtT3V0cHV0MS0+bURldmljZSB8IG1PdXRwdXQyLT5tRGV2aWNlKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbURldmljZTsKLSAgICB9Ci19Ci0KLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpsYXRlbmN5KCkKLXsKLSAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgcmV0dXJuIChtT3V0cHV0MS0+bUxhdGVuY3kgPiBtT3V0cHV0Mi0+bUxhdGVuY3kpID8gbU91dHB1dDEtPm1MYXRlbmN5IDogbU91dHB1dDItPm1MYXRlbmN5OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtTGF0ZW5jeTsKLSAgICB9Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OnNoYXJlc0h3TW9kdWxlV2l0aCgKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjKQotewotICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICByZXR1cm4gbU91dHB1dDEtPnNoYXJlc0h3TW9kdWxlV2l0aChvdXRwdXREZXNjKSB8fCBtT3V0cHV0Mi0+c2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MpOwotICAgIH0gZWxzZSBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpewotICAgICAgICByZXR1cm4gc2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MtPm1PdXRwdXQxKSB8fCBzaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYy0+bU91dHB1dDIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAobVByb2ZpbGUtPm1Nb2R1bGUgPT0gb3V0cHV0RGVzYy0+bVByb2ZpbGUtPm1Nb2R1bGUpOwotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Y2hhbmdlUmVmQ291bnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhKQotewotICAgIC8vIGZvcndhcmQgdXNhZ2UgY291bnQgY2hhbmdlIHRvIGF0dGFjaGVkIG91dHB1dHMKLSAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgbU91dHB1dDEtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgZGVsdGEpOwotICAgICAgICBtT3V0cHV0Mi0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCBkZWx0YSk7Ci0gICAgfQotICAgIGlmICgoZGVsdGEgKyAoaW50KW1SZWZDb3VudFtzdHJlYW1dKSA8IDApIHsKLSAgICAgICAgQUxPR1coImNoYW5nZVJlZkNvdW50KCkgaW52YWxpZCBkZWx0YSAlZCBmb3Igc3RyZWFtICVkLCByZWZDb3VudCAlZCIsCi0gICAgICAgICAgICAgIGRlbHRhLCBzdHJlYW0sIG1SZWZDb3VudFtzdHJlYW1dKTsKLSAgICAgICAgbVJlZkNvdW50W3N0cmVhbV0gPSAwOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1SZWZDb3VudFtzdHJlYW1dICs9IGRlbHRhOwotICAgIEFMT0dWKCJjaGFuZ2VSZWZDb3VudCgpIHN0cmVhbSAlZCwgY291bnQgJWQiLCBzdHJlYW0sIG1SZWZDb3VudFtzdHJlYW1dKTsKLX0KLQotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzdXBwb3J0ZWREZXZpY2VzKCkKLXsKLSAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgcmV0dXJuIChhdWRpb19kZXZpY2VzX3QpKG1PdXRwdXQxLT5zdXBwb3J0ZWREZXZpY2VzKCkgfCBtT3V0cHV0Mi0+c3VwcG9ydGVkRGV2aWNlcygpKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgOwotICAgIH0KLX0KLQotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNBY3RpdmUodWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGlzU3RyYXRlZ3lBY3RpdmUoTlVNX1NUUkFURUdJRVMsIGluUGFzdE1zKTsKLX0KLQotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNTdHJhdGVneUFjdGl2ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lKSBjb25zdAotewotICAgIGlmICgoc3lzVGltZSA9PSAwKSAmJiAoaW5QYXN0TXMgIT0gMCkpIHsKLSAgICAgICAgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KUFVRElPX1NUUkVBTV9DTlQ7IGkrKykgewotICAgICAgICBpZiAoaSA9PSBBVURJT19TVFJFQU1fUEFUQ0gpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KWkpID09IHN0cmF0ZWd5KSB8fAotICAgICAgICAgICAgICAgIChOVU1fU1RSQVRFR0lFUyA9PSBzdHJhdGVneSkpICYmCi0gICAgICAgICAgICAgICAgaXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lKSBjb25zdAotewotICAgIGlmIChtUmVmQ291bnRbc3RyZWFtXSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAoaW5QYXN0TXMgPT0gMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChzeXNUaW1lID09IDApIHsKLSAgICAgICAgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKLSAgICB9Ci0gICAgaWYgKG5zMm1zKHN5c1RpbWUgLSBtU3RvcFRpbWVbc3RyZWFtXSkgPCBpblBhc3RNcykgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZykgY29uc3QKLXsKLSAgICBBTE9HX0FTU0VSVCghaXNEdXBsaWNhdGVkKCksICJ0b0F1ZGlvUG9ydENvbmZpZygpIGNhbGxlZCBvbiBkdXBsaWNhdGVkIG91dHB1dCAlZCIsIG1Jb0hhbmRsZSk7Ci0KLSAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrID0gQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEV8QVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVHxBVURJT19QT1JUX0NPTkZJR19HQUlOOwotICAgIGlmIChzcmNDb25maWcgIT0gTlVMTCkgewotICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrIHw9IHNyY0NvbmZpZy0+Y29uZmlnX21hc2s7Ci0gICAgfQotICAgIEF1ZGlvUG9ydENvbmZpZzo6dG9BdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOwotCi0gICAgZHN0Q29uZmlnLT5pZCA9IG1JZDsKLSAgICBkc3RDb25maWctPnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFOwotICAgIGRzdENvbmZpZy0+dHlwZSA9IEFVRElPX1BPUlRfVFlQRV9NSVg7Ci0gICAgZHN0Q29uZmlnLT5leHQubWl4Lmh3X21vZHVsZSA9IG1Qcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlOwotICAgIGRzdENvbmZpZy0+ZXh0Lm1peC5oYW5kbGUgPSBtSW9IYW5kbGU7Ci0gICAgZHN0Q29uZmlnLT5leHQubWl4LnVzZWNhc2Uuc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAotewotICAgIEFMT0dfQVNTRVJUKCFpc0R1cGxpY2F0ZWQoKSwgInRvQXVkaW9Qb3J0KCkgY2FsbGVkIG9uIGR1cGxpY2F0ZWQgb3V0cHV0ICVkIiwgbUlvSGFuZGxlKTsKLSAgICBtUHJvZmlsZS0+dG9BdWRpb1BvcnQocG9ydCk7Ci0gICAgcG9ydC0+aWQgPSBtSWQ7Ci0gICAgdG9BdWRpb1BvcnRDb25maWcoJnBvcnQtPmFjdGl2ZV9jb25maWcpOwotICAgIHBvcnQtPmV4dC5taXguaHdfbW9kdWxlID0gbVByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGU7Ci0gICAgcG9ydC0+ZXh0Lm1peC5oYW5kbGUgPSBtSW9IYW5kbGU7Ci0gICAgcG9ydC0+ZXh0Lm1peC5sYXRlbmN5X2NsYXNzID0KLSAgICAgICAgICAgIG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgPyBBVURJT19MQVRFTkNZX0xPVyA6IEFVRElPX0xBVEVOQ1lfTk9STUFMOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgSUQ6ICVkXG4iLCBtSWQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9ybWF0OiAlMDh4XG4iLCBtRm9ybWF0KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIENoYW5uZWxzOiAlMDh4XG4iLCBtQ2hhbm5lbE1hc2spOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgTGF0ZW5jeTogJWRcbiIsIG1MYXRlbmN5KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZsYWdzICUwOHhcbiIsIG1GbGFncyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBEZXZpY2VzICUwOHhcbiIsIGRldmljZSgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFN0cmVhbSB2b2x1bWUgcmVmQ291bnQgbXV0ZUNvdW50XG4iKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KUFVRElPX1NUUkVBTV9DTlQ7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgJTAyZCAgICAgJS4wM2YgICAgICUwMmQgICAgICAgJTAyZFxuIiwKLSAgICAgICAgICAgICAgICAgaSwgbUN1clZvbHVtZVtpXSwgbVJlZkNvdW50W2ldLCBtTXV0ZUNvdW50W2ldKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gLS0tIEF1ZGlvSW5wdXREZXNjcmlwdG9yIGNsYXNzIGltcGxlbWVudGF0aW9uCi0KLUF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9JbnB1dERlc2NyaXB0b3I6OkF1ZGlvSW5wdXREZXNjcmlwdG9yKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUpCi0gICAgOiBtSWQoMCksIG1Jb0hhbmRsZSgwKSwKLSAgICAgIG1EZXZpY2UoQVVESU9fREVWSUNFX05PTkUpLCBtUG9saWN5TWl4KE5VTEwpLCBtUGF0Y2hIYW5kbGUoMCksIG1SZWZDb3VudCgwKSwKLSAgICAgIG1JbnB1dFNvdXJjZShBVURJT19TT1VSQ0VfREVGQVVMVCksIG1Qcm9maWxlKHByb2ZpbGUpLCBtSXNTb3VuZFRyaWdnZXIoZmFsc2UpCi17Ci0gICAgaWYgKHByb2ZpbGUgIT0gTlVMTCkgewotICAgICAgICBtU2FtcGxpbmdSYXRlID0gcHJvZmlsZS0+cGlja1NhbXBsaW5nUmF0ZSgpOwotICAgICAgICBtRm9ybWF0ID0gcHJvZmlsZS0+cGlja0Zvcm1hdCgpOwotICAgICAgICBtQ2hhbm5lbE1hc2sgPSBwcm9maWxlLT5waWNrQ2hhbm5lbE1hc2soKTsKLSAgICAgICAgaWYgKHByb2ZpbGUtPm1HYWlucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBwcm9maWxlLT5tR2FpbnNbMF0tPmdldERlZmF1bHRDb25maWcoJm1HYWluKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvSW5wdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0Ci17Ci0gICAgQUxPR19BU1NFUlQobVByb2ZpbGUgIT0gMCwKLSAgICAgICAgICAgICAgICAidG9BdWRpb1BvcnRDb25maWcoKSBjYWxsZWQgb24gaW5wdXQgd2l0aCBudWxsIHByb2ZpbGUgJWQiLCBtSW9IYW5kbGUpOwotICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgPSBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURXxBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0t8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUfEFVRElPX1BPUlRfQ09ORklHX0dBSU47Ci0gICAgaWYgKHNyY0NvbmZpZyAhPSBOVUxMKSB7Ci0gICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgfD0gc3JjQ29uZmlnLT5jb25maWdfbWFzazsKLSAgICB9Ci0KLSAgICBBdWRpb1BvcnRDb25maWc6OnRvQXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKLQotICAgIGRzdENvbmZpZy0+aWQgPSBtSWQ7Ci0gICAgZHN0Q29uZmlnLT5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NJTks7Ci0gICAgZHN0Q29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWDsKLSAgICBkc3RDb25maWctPmV4dC5taXguaHdfbW9kdWxlID0gbVByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGU7Ci0gICAgZHN0Q29uZmlnLT5leHQubWl4LmhhbmRsZSA9IG1Jb0hhbmRsZTsKLSAgICBkc3RDb25maWctPmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBtSW5wdXRTb3VyY2U7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb0lucHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0Ci17Ci0gICAgQUxPR19BU1NFUlQobVByb2ZpbGUgIT0gMCwgInRvQXVkaW9Qb3J0KCkgY2FsbGVkIG9uIGlucHV0IHdpdGggbnVsbCBwcm9maWxlICVkIiwgbUlvSGFuZGxlKTsKLQotICAgIG1Qcm9maWxlLT50b0F1ZGlvUG9ydChwb3J0KTsKLSAgICBwb3J0LT5pZCA9IG1JZDsKLSAgICB0b0F1ZGlvUG9ydENvbmZpZygmcG9ydC0+YWN0aXZlX2NvbmZpZyk7Ci0gICAgcG9ydC0+ZXh0Lm1peC5od19tb2R1bGUgPSBtUHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZTsKLSAgICBwb3J0LT5leHQubWl4LmhhbmRsZSA9IG1Jb0hhbmRsZTsKLSAgICBwb3J0LT5leHQubWl4LmxhdGVuY3lfY2xhc3MgPSBBVURJT19MQVRFTkNZX05PUk1BTDsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb0lucHV0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgSUQ6ICVkXG4iLCBtSWQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9ybWF0OiAlZFxuIiwgbUZvcm1hdCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIERldmljZXMgJTA4eFxuIiwgbURldmljZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBSZWYgQ291bnQgJWRcbiIsIG1SZWZDb3VudCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBPcGVuIFJlZiBDb3VudCAlZFxuIiwgbU9wZW5SZWZDb3VudCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIC0tLSBTdHJlYW1EZXNjcmlwdG9yIGNsYXNzIGltcGxlbWVudGF0aW9uCi0KLUF1ZGlvUG9saWN5TWFuYWdlcjo6U3RyZWFtRGVzY3JpcHRvcjo6U3RyZWFtRGVzY3JpcHRvcigpCi0gICAgOiAgIG1JbmRleE1pbigwKSwgbUluZGV4TWF4KDEpLCBtQ2FuQmVNdXRlZCh0cnVlKQotewotICAgIG1JbmRleEN1ci5hZGQoQVVESU9fREVWSUNFX09VVF9ERUZBVUxULCAwKTsKLX0KLQotaW50IEF1ZGlvUG9saWN5TWFuYWdlcjo6U3RyZWFtRGVzY3JpcHRvcjo6Z2V0Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSkKLXsKLSAgICBkZXZpY2UgPSBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUZvclZvbHVtZShkZXZpY2UpOwotICAgIC8vIHRoZXJlIGlzIGFsd2F5cyBhIHZhbGlkIGVudHJ5IGZvciBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQKLSAgICBpZiAobUluZGV4Q3VyLmluZGV4T2ZLZXkoZGV2aWNlKSA8IDApIHsKLSAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUOwotICAgIH0KLSAgICByZXR1cm4gbUluZGV4Q3VyLnZhbHVlRm9yKGRldmljZSk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpTdHJlYW1EZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiVzICAgICAgICAgJTAyZCAgICAgICAgICUwMmQgICAgICAgICAiLAotICAgICAgICAgICAgIG1DYW5CZU11dGVkID8gInRydWUgIiA6ICJmYWxzZSIsIG1JbmRleE1pbiwgbUluZGV4TWF4KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5kZXhDdXIuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJTA0eCA6ICUwMmQsICIsCi0gICAgICAgICAgICAgICAgIG1JbmRleEN1ci5rZXlBdChpKSwKLSAgICAgICAgICAgICAgICAgbUluZGV4Q3VyLnZhbHVlQXQoaSkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQotICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLX0KLQotLy8gLS0tIEVmZmVjdERlc2NyaXB0b3IgY2xhc3MgaW1wbGVtZW50YXRpb24KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpFZmZlY3REZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBJL086ICVkXG4iLCBtSW8pOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU3RyYXRlZ3k6ICVkXG4iLCBtU3RyYXRlZ3kpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2Vzc2lvbjogJWRcbiIsIG1TZXNzaW9uKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIE5hbWU6ICVzXG4iLCAgbURlc2MubmFtZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAlc1xuIiwgIG1FbmFibGVkID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vLyAtLS0gSHdNb2R1bGUgY2xhc3MgaW1wbGVtZW50YXRpb24KLQotQXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZTo6SHdNb2R1bGUoY29uc3QgY2hhciAqbmFtZSkKLSAgICA6IG1OYW1lKHN0cm5kdXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01BWF9MRU4pKSwKLSAgICAgIG1IYWxWZXJzaW9uKEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl9NSU4pLCBtSGFuZGxlKDApCi17Ci19Ci0KLUF1ZGlvUG9saWN5TWFuYWdlcjo6SHdNb2R1bGU6On5Id01vZHVsZSgpCi17Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbU91dHB1dFByb2ZpbGVzW2ldLT5tU3VwcG9ydGVkRGV2aWNlcy5jbGVhcigpOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1JbnB1dFByb2ZpbGVzW2ldLT5tU3VwcG9ydGVkRGV2aWNlcy5jbGVhcigpOwotICAgIH0KLSAgICBmcmVlKCh2b2lkICopbU5hbWUpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6Okh3TW9kdWxlOjpsb2FkSW5wdXQoY25vZGUgKnJvb3QpCi17Ci0gICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKLQotICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG5ldyBJT1Byb2ZpbGUoU3RyaW5nOChyb290LT5uYW1lKSwgQVVESU9fUE9SVF9ST0xFX1NJTkssIHRoaXMpOwotCi0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBTQU1QTElOR19SQVRFU19UQUcpID09IDApIHsKLSAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRTYW1wbGluZ1JhdGVzKChjaGFyICopbm9kZS0+dmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBGT1JNQVRTX1RBRykgPT0gMCkgewotICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEZvcm1hdHMoKGNoYXIgKilub2RlLT52YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIENIQU5ORUxTX1RBRykgPT0gMCkgewotICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEluQ2hhbm5lbHMoKGNoYXIgKilub2RlLT52YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIERFVklDRVNfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5sb2FkRGV2aWNlc0Zyb21OYW1lKChjaGFyICopbm9kZS0+dmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWNsYXJlZERldmljZXMpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBGTEFHU19UQUcpID09IDApIHsKLSAgICAgICAgICAgIHByb2ZpbGUtPm1GbGFncyA9IHBhcnNlSW5wdXRGbGFnTmFtZXMoKGNoYXIgKilub2RlLT52YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5TX1RBRykgPT0gMCkgewotICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEdhaW5zKG5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLSAgICBBTE9HV19JRihwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCksCi0gICAgICAgICAgICAibG9hZElucHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgZGV2aWNlcyIpOwotICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1DaGFubmVsTWFza3Muc2l6ZSgpID09IDAsCi0gICAgICAgICAgICAibG9hZElucHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgY2hhbm5lbCBtYXNrcyIpOwotICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLnNpemUoKSA9PSAwLAotICAgICAgICAgICAgImxvYWRJbnB1dCgpIGludmFsaWQgc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzIik7Ci0gICAgQUxPR1dfSUYocHJvZmlsZS0+bUZvcm1hdHMuc2l6ZSgpID09IDAsCi0gICAgICAgICAgICAibG9hZElucHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgZm9ybWF0cyIpOwotICAgIGlmICghcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuaXNFbXB0eSgpICYmCi0gICAgICAgICAgICAocHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5zaXplKCkgIT0gMCkgJiYKLSAgICAgICAgICAgIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgIT0gMCkgJiYKLSAgICAgICAgICAgIChwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgIT0gMCkpIHsKLQotICAgICAgICBBTE9HVigibG9hZElucHV0KCkgYWRkaW5nIGlucHV0IFN1cHBvcnRlZCBEZXZpY2VzICUwNHgiLAotICAgICAgICAgICAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpKTsKLQotICAgICAgICBtSW5wdXRQcm9maWxlcy5hZGQocHJvZmlsZSk7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZTo6bG9hZE91dHB1dChjbm9kZSAqcm9vdCkKLXsKLSAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOwotCi0gICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbmV3IElPUHJvZmlsZShTdHJpbmc4KHJvb3QtPm5hbWUpLCBBVURJT19QT1JUX1JPTEVfU09VUkNFLCB0aGlzKTsKLQotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgU0FNUExJTkdfUkFURVNfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBwcm9maWxlLT5sb2FkU2FtcGxpbmdSYXRlcygoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgRk9STUFUU19UQUcpID09IDApIHsKLSAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRGb3JtYXRzKChjaGFyICopbm9kZS0+dmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBDSEFOTkVMU19UQUcpID09IDApIHsKLSAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRPdXRDaGFubmVscygoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgREVWSUNFU19UQUcpID09IDApIHsKLSAgICAgICAgICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmxvYWREZXZpY2VzRnJvbU5hbWUoKGNoYXIgKilub2RlLT52YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlY2xhcmVkRGV2aWNlcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEZMQUdTX1RBRykgPT0gMCkgewotICAgICAgICAgICAgcHJvZmlsZS0+bUZsYWdzID0gcGFyc2VPdXRwdXRGbGFnTmFtZXMoKGNoYXIgKilub2RlLT52YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5TX1RBRykgPT0gMCkgewotICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEdhaW5zKG5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLSAgICBBTE9HV19JRihwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCksCi0gICAgICAgICAgICAibG9hZE91dHB1dCgpIGludmFsaWQgc3VwcG9ydGVkIGRldmljZXMiKTsKLSAgICBBTE9HV19JRihwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLnNpemUoKSA9PSAwLAotICAgICAgICAgICAgImxvYWRPdXRwdXQoKSBpbnZhbGlkIHN1cHBvcnRlZCBjaGFubmVsIG1hc2tzIik7Ci0gICAgQUxPR1dfSUYocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpID09IDAsCi0gICAgICAgICAgICAibG9hZE91dHB1dCgpIGludmFsaWQgc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzIik7Ci0gICAgQUxPR1dfSUYocHJvZmlsZS0+bUZvcm1hdHMuc2l6ZSgpID09IDAsCi0gICAgICAgICAgICAibG9hZE91dHB1dCgpIGludmFsaWQgc3VwcG9ydGVkIGZvcm1hdHMiKTsKLSAgICBpZiAoIXByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKSAmJgotICAgICAgICAgICAgKHByb2ZpbGUtPm1DaGFubmVsTWFza3Muc2l6ZSgpICE9IDApICYmCi0gICAgICAgICAgICAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpICE9IDApICYmCi0gICAgICAgICAgICAocHJvZmlsZS0+bUZvcm1hdHMuc2l6ZSgpICE9IDApKSB7Ci0KLSAgICAgICAgQUxPR1YoImxvYWRPdXRwdXQoKSBhZGRpbmcgb3V0cHV0IFN1cHBvcnRlZCBEZXZpY2VzICUwNHgsIG1GbGFncyAlMDR4IiwKLSAgICAgICAgICAgICAgcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSwgcHJvZmlsZS0+bUZsYWdzKTsKLQotICAgICAgICBtT3V0cHV0UHJvZmlsZXMuYWRkKHByb2ZpbGUpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6SHdNb2R1bGU6OmxvYWREZXZpY2UoY25vZGUgKnJvb3QpCi17Ci0gICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKLQotICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBERVZJQ0VfVFlQRSkgPT0gMCkgewotICAgICAgICAgICAgdHlwZSA9IHBhcnNlRGV2aWNlTmFtZXMoKGNoYXIgKilub2RlLT52YWx1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0gICAgaWYgKHR5cGUgPT0gQVVESU9fREVWSUNFX05PTkUgfHwKLSAgICAgICAgICAgICghYXVkaW9faXNfaW5wdXRfZGV2aWNlKHR5cGUpICYmICFhdWRpb19pc19vdXRwdXRfZGV2aWNlKHR5cGUpKSkgewotICAgICAgICBBTE9HVygibG9hZERldmljZSgpIGJhZCB0eXBlICUwOHgiLCB0eXBlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgocm9vdC0+bmFtZSksIHR5cGUpOwotICAgIGRldmljZURlc2MtPm1Nb2R1bGUgPSB0aGlzOwotCi0gICAgbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgREVWSUNFX0FERFJFU1MpID09IDApIHsKLSAgICAgICAgICAgIGRldmljZURlc2MtPm1BZGRyZXNzID0gU3RyaW5nOCgoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgQ0hBTk5FTFNfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlRGVzYy0+bG9hZEluQ2hhbm5lbHMoKGNoYXIgKilub2RlLT52YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRldmljZURlc2MtPmxvYWRPdXRDaGFubmVscygoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTlNfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBkZXZpY2VEZXNjLT5sb2FkR2FpbnMobm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotCi0gICAgQUxPR1YoImxvYWREZXZpY2UoKSBhZGRpbmcgZGV2aWNlIG5hbWUgJXMgdHlwZSAlMDh4IGFkZHJlc3MgJXMiLAotICAgICAgICAgIGRldmljZURlc2MtPm1OYW1lLnN0cmluZygpLCB0eXBlLCBkZXZpY2VEZXNjLT5tQWRkcmVzcy5zdHJpbmcoKSk7Ci0KLSAgICBtRGVjbGFyZWREZXZpY2VzLmFkZChkZXZpY2VEZXNjKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZTo6YWRkT3V0cHV0UHJvZmlsZShTdHJpbmc4IG5hbWUsIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIFN0cmluZzggYWRkcmVzcykKLXsKLSAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBuZXcgSU9Qcm9maWxlKG5hbWUsIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIHRoaXMpOwotCi0gICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuYWRkKGNvbmZpZy0+c2FtcGxlX3JhdGUpOwotICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3MuYWRkKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKTsKLSAgICBwcm9maWxlLT5tRm9ybWF0cy5hZGQoY29uZmlnLT5mb3JtYXQpOwotCi0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgoIiIpLCBkZXZpY2UpOwotICAgIGRldkRlc2MtPm1BZGRyZXNzID0gYWRkcmVzczsKLSAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5hZGQoZGV2RGVzYyk7Ci0KLSAgICBtT3V0cHV0UHJvZmlsZXMuYWRkKHByb2ZpbGUpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6Okh3TW9kdWxlOjpyZW1vdmVPdXRwdXRQcm9maWxlKFN0cmluZzggbmFtZSkKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobU91dHB1dFByb2ZpbGVzW2ldLT5tTmFtZSA9PSBuYW1lKSB7Ci0gICAgICAgICAgICBtT3V0cHV0UHJvZmlsZXMucmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZTo6YWRkSW5wdXRQcm9maWxlKFN0cmluZzggbmFtZSwgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgU3RyaW5nOCBhZGRyZXNzKQotewotICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG5ldyBJT1Byb2ZpbGUobmFtZSwgQVVESU9fUE9SVF9ST0xFX1NJTkssIHRoaXMpOwotCi0gICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuYWRkKGNvbmZpZy0+c2FtcGxlX3JhdGUpOwotICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3MuYWRkKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKTsKLSAgICBwcm9maWxlLT5tRm9ybWF0cy5hZGQoY29uZmlnLT5mb3JtYXQpOwotCi0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgoIiIpLCBkZXZpY2UpOwotICAgIGRldkRlc2MtPm1BZGRyZXNzID0gYWRkcmVzczsKLSAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5hZGQoZGV2RGVzYyk7Ci0KLSAgICBBTE9HVigiYWRkSW5wdXRQcm9maWxlKCkgbmFtZSAlcyByYXRlICVkIG1hc2sgMHgwOCIsIG5hbWUuc3RyaW5nKCksIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrKTsKLQotICAgIG1JbnB1dFByb2ZpbGVzLmFkZChwcm9maWxlKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZTo6cmVtb3ZlSW5wdXRQcm9maWxlKFN0cmluZzggbmFtZSkKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtSW5wdXRQcm9maWxlc1tpXS0+bU5hbWUgPT0gbmFtZSkgewotICAgICAgICAgICAgbUlucHV0UHJvZmlsZXMucmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6SHdNb2R1bGU6OmR1bXAoaW50IGZkKQotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAtIG5hbWU6ICVzXG4iLCBtTmFtZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgLSBoYW5kbGU6ICVkXG4iLCBtSGFuZGxlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAtIHZlcnNpb246ICV1LiV1XG4iLCBtSGFsVmVyc2lvbiA+PiA4LCBtSGFsVmVyc2lvbiAmIDB4RkYpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICBpZiAobU91dHB1dFByb2ZpbGVzLnNpemUoKSkgewotICAgICAgICB3cml0ZShmZCwgIiAgLSBvdXRwdXRzOlxuIiwgc3RybGVuKCIgIC0gb3V0cHV0czpcbiIpKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICBvdXRwdXQgJXp1OlxuIiwgaSk7Ci0gICAgICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgICAgICBtT3V0cHV0UHJvZmlsZXNbaV0tPmR1bXAoZmQpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtSW5wdXRQcm9maWxlcy5zaXplKCkpIHsKLSAgICAgICAgd3JpdGUoZmQsICIgIC0gaW5wdXRzOlxuIiwgc3RybGVuKCIgIC0gaW5wdXRzOlxuIikpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgaW5wdXQgJXp1OlxuIiwgaSk7Ci0gICAgICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgICAgICBtSW5wdXRQcm9maWxlc1tpXS0+ZHVtcChmZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1EZWNsYXJlZERldmljZXMuc2l6ZSgpKSB7Ci0gICAgICAgIHdyaXRlKGZkLCAiICAtIGRldmljZXM6XG4iLCBzdHJsZW4oIiAgLSBkZXZpY2VzOlxuIikpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1EZWNsYXJlZERldmljZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIG1EZWNsYXJlZERldmljZXNbaV0tPmR1bXAoZmQsIDQsIGkpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyAtLS0gQXVkaW9Qb3J0IGNsYXNzIGltcGxlbWVudGF0aW9uCi0KLQotQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OkF1ZGlvUG9ydChjb25zdCBTdHJpbmc4JiBuYW1lLCBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAotICAgICAgICAgIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsIGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKSA6Ci0gICAgbU5hbWUobmFtZSksIG1UeXBlKHR5cGUpLCBtUm9sZShyb2xlKSwgbU1vZHVsZShtb2R1bGUpLCBtRmxhZ3MoMCkKLXsKLSAgICBtVXNlSW5DaGFubmVsTWFzayA9ICgodHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSAmJiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKCh0eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpICYmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OnRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAotewotICAgIHBvcnQtPnJvbGUgPSBtUm9sZTsKLSAgICBwb3J0LT50eXBlID0gbVR5cGU7Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKSAmJiBpIDwgQVVESU9fUE9SVF9NQVhfU0FNUExJTkdfUkFURVM7IGkrKykgewotICAgICAgICBpZiAobVNhbXBsaW5nUmF0ZXNbaV0gIT0gMCkgewotICAgICAgICAgICAgcG9ydC0+c2FtcGxlX3JhdGVzW2ldID0gbVNhbXBsaW5nUmF0ZXNbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcG9ydC0+bnVtX3NhbXBsZV9yYXRlcyA9IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpICYmIGkgPCBBVURJT19QT1JUX01BWF9DSEFOTkVMX01BU0tTOyBpKyspIHsKLSAgICAgICAgaWYgKG1DaGFubmVsTWFza3NbaV0gIT0gMCkgewotICAgICAgICAgICAgcG9ydC0+Y2hhbm5lbF9tYXNrc1tpXSA9IG1DaGFubmVsTWFza3NbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcG9ydC0+bnVtX2NoYW5uZWxfbWFza3MgPSBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBtRm9ybWF0cy5zaXplKCkgJiYgaSA8IEFVRElPX1BPUlRfTUFYX0ZPUk1BVFM7IGkrKykgewotICAgICAgICBpZiAobUZvcm1hdHNbaV0gIT0gMCkgewotICAgICAgICAgICAgcG9ydC0+Zm9ybWF0c1tpXSA9IG1Gb3JtYXRzW2ldOwotICAgICAgICB9Ci0gICAgfQotICAgIHBvcnQtPm51bV9mb3JtYXRzID0gaTsKLQotICAgIEFMT0dWKCJBdWRpb1BvcnQ6OnRvQXVkaW9Qb3J0KCkgbnVtIGdhaW5zICV6dSIsIG1HYWlucy5zaXplKCkpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG1HYWlucy5zaXplKCkgJiYgaSA8IEFVRElPX1BPUlRfTUFYX0dBSU5TOyBpKyspIHsKLSAgICAgICAgcG9ydC0+Z2FpbnNbaV0gPSBtR2FpbnNbaV0tPm1HYWluOwotICAgIH0KLSAgICBwb3J0LT5udW1fZ2FpbnMgPSBpOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjppbXBvcnRBdWRpb1BvcnQoY29uc3Qgc3A8QXVkaW9Qb3J0PiBwb3J0KSB7Ci0gICAgZm9yIChzaXplX3QgayA9IDAgOyBrIDwgcG9ydC0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIDsgaysrKSB7Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IHJhdGUgPSBwb3J0LT5tU2FtcGxpbmdSYXRlcy5pdGVtQXQoayk7Ci0gICAgICAgIGlmIChyYXRlICE9IDApIHsgLy8gc2tpcCAiZHluYW1pYyIgcmF0ZXMKLSAgICAgICAgICAgIGJvb2wgaGFzUmF0ZSA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChzaXplX3QgbCA9IDAgOyBsIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIDsgbCsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJhdGUgPT0gbVNhbXBsaW5nUmF0ZXMuaXRlbUF0KGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhc1JhdGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWhhc1JhdGUpIHsgLy8gbmV2ZXIgaW1wb3J0IGEgc2FtcGxpbmcgcmF0ZSB0d2ljZQotICAgICAgICAgICAgICAgIG1TYW1wbGluZ1JhdGVzLmFkZChyYXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBmb3IgKHNpemVfdCBrID0gMCA7IGsgPCBwb3J0LT5tQ2hhbm5lbE1hc2tzLnNpemUoKSA7IGsrKykgewotICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBtYXNrID0gcG9ydC0+bUNoYW5uZWxNYXNrcy5pdGVtQXQoayk7Ci0gICAgICAgIGlmIChtYXNrICE9IDApIHsgLy8gc2tpcCAiZHluYW1pYyIgbWFza3MKLSAgICAgICAgICAgIGJvb2wgaGFzTWFzayA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChzaXplX3QgbCA9IDAgOyBsIDwgbUNoYW5uZWxNYXNrcy5zaXplKCkgOyBsKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobWFzayA9PSBtQ2hhbm5lbE1hc2tzLml0ZW1BdChsKSkgewotICAgICAgICAgICAgICAgICAgICBoYXNNYXNrID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFoYXNNYXNrKSB7IC8vIG5ldmVyIGltcG9ydCBhIGNoYW5uZWwgbWFzayB0d2ljZQotICAgICAgICAgICAgICAgIG1DaGFubmVsTWFza3MuYWRkKG1hc2spOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGsgPSAwIDsgayA8IHBvcnQtPm1Gb3JtYXRzLnNpemUoKSA7IGsrKykgewotICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBwb3J0LT5tRm9ybWF0cy5pdGVtQXQoayk7Ci0gICAgICAgIGlmIChmb3JtYXQgIT0gMCkgeyAvLyBza2lwICJkeW5hbWljIiBmb3JtYXRzCi0gICAgICAgICAgICBib29sIGhhc0Zvcm1hdCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChzaXplX3QgbCA9IDAgOyBsIDwgbUZvcm1hdHMuc2l6ZSgpIDsgbCsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBtRm9ybWF0cy5pdGVtQXQobCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFzRm9ybWF0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFoYXNGb3JtYXQpIHsgLy8gbmV2ZXIgaW1wb3J0IGEgY2hhbm5lbCBtYXNrIHR3aWNlCi0gICAgICAgICAgICAgICAgbUZvcm1hdHMuYWRkKGZvcm1hdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChzaXplX3QgayA9IDAgOyBrIDwgcG9ydC0+bUdhaW5zLnNpemUoKSA7IGsrKykgewotICAgICAgICBzcDxBdWRpb0dhaW4+IGdhaW4gPSBwb3J0LT5tR2FpbnMuaXRlbUF0KGspOwotICAgICAgICBpZiAoZ2FpbiAhPSAwKSB7Ci0gICAgICAgICAgICBib29sIGhhc0dhaW4gPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGwgPSAwIDsgbCA8IG1HYWlucy5zaXplKCkgOyBsKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoZ2FpbiA9PSBtR2FpbnMuaXRlbUF0KGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhc0dhaW4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWhhc0dhaW4pIHsgLy8gbmV2ZXIgaW1wb3J0IGEgZ2FpbiB0d2ljZQotICAgICAgICAgICAgICAgIG1HYWlucy5hZGQoZ2Fpbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmNsZWFyQ2FwYWJpbGl0aWVzKCkgewotICAgIG1DaGFubmVsTWFza3MuY2xlYXIoKTsKLSAgICBtRm9ybWF0cy5jbGVhcigpOwotICAgIG1TYW1wbGluZ1JhdGVzLmNsZWFyKCk7Ci0gICAgbUdhaW5zLmNsZWFyKCk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmxvYWRTYW1wbGluZ1JhdGVzKGNoYXIgKm5hbWUpCi17Ci0gICAgY2hhciAqc3RyID0gc3RydG9rKG5hbWUsICJ8Iik7Ci0KLSAgICAvLyBieSBjb252ZW50aW9uLCAiMCcgaW4gdGhlIGZpcnN0IGVudHJ5IGluIG1TYW1wbGluZ1JhdGVzIGluZGljYXRlcyB0aGUgc3VwcG9ydGVkIHNhbXBsaW5nCi0gICAgLy8gcmF0ZXMgc2hvdWxkIGJlIHJlYWQgZnJvbSB0aGUgb3V0cHV0IHN0cmVhbSBhZnRlciBpdCBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lCi0gICAgaWYgKHN0ciAhPSBOVUxMICYmIHN0cmNtcChzdHIsIERZTkFNSUNfVkFMVUVfVEFHKSA9PSAwKSB7Ci0gICAgICAgIG1TYW1wbGluZ1JhdGVzLmFkZCgwKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHdoaWxlIChzdHIgIT0gTlVMTCkgewotICAgICAgICB1aW50MzJfdCByYXRlID0gYXRvaShzdHIpOwotICAgICAgICBpZiAocmF0ZSAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HVigibG9hZFNhbXBsaW5nUmF0ZXMoKSBhZGRpbmcgcmF0ZSAlZCIsIHJhdGUpOwotICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZXMuYWRkKHJhdGUpOwotICAgICAgICB9Ci0gICAgICAgIHN0ciA9IHN0cnRvayhOVUxMLCAifCIpOwotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6bG9hZEZvcm1hdHMoY2hhciAqbmFtZSkKLXsKLSAgICBjaGFyICpzdHIgPSBzdHJ0b2sobmFtZSwgInwiKTsKLQotICAgIC8vIGJ5IGNvbnZlbnRpb24sICIwJyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gbUZvcm1hdHMgaW5kaWNhdGVzIHRoZSBzdXBwb3J0ZWQgZm9ybWF0cwotICAgIC8vIHNob3VsZCBiZSByZWFkIGZyb20gdGhlIG91dHB1dCBzdHJlYW0gYWZ0ZXIgaXQgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZQotICAgIGlmIChzdHIgIT0gTlVMTCAmJiBzdHJjbXAoc3RyLCBEWU5BTUlDX1ZBTFVFX1RBRykgPT0gMCkgewotICAgICAgICBtRm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0RFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgd2hpbGUgKHN0ciAhPSBOVUxMKSB7Ci0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdClzdHJpbmdUb0VudW0oc0Zvcm1hdE5hbWVUb0VudW1UYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNGb3JtYXROYW1lVG9FbnVtVGFibGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cik7Ci0gICAgICAgIGlmIChmb3JtYXQgIT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKLSAgICAgICAgICAgIG1Gb3JtYXRzLmFkZChmb3JtYXQpOwotICAgICAgICB9Ci0gICAgICAgIHN0ciA9IHN0cnRvayhOVUxMLCAifCIpOwotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6bG9hZEluQ2hhbm5lbHMoY2hhciAqbmFtZSkKLXsKLSAgICBjb25zdCBjaGFyICpzdHIgPSBzdHJ0b2sobmFtZSwgInwiKTsKLQotICAgIEFMT0dWKCJsb2FkSW5DaGFubmVscygpICVzIiwgbmFtZSk7Ci0KLSAgICBpZiAoc3RyICE9IE5VTEwgJiYgc3RyY21wKHN0ciwgRFlOQU1JQ19WQUxVRV9UQUcpID09IDApIHsKLSAgICAgICAgbUNoYW5uZWxNYXNrcy5hZGQoMCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB3aGlsZSAoc3RyICE9IE5VTEwpIHsKLSAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPQotICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdClzdHJpbmdUb0VudW0oc0luQ2hhbm5lbHNOYW1lVG9FbnVtVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNJbkNoYW5uZWxzTmFtZVRvRW51bVRhYmxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cik7Ci0gICAgICAgIGlmIChjaGFubmVsTWFzayAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HVigibG9hZEluQ2hhbm5lbHMoKSBhZGRpbmcgY2hhbm5lbE1hc2sgJTA0eCIsIGNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgIG1DaGFubmVsTWFza3MuYWRkKGNoYW5uZWxNYXNrKTsKLSAgICAgICAgfQotICAgICAgICBzdHIgPSBzdHJ0b2soTlVMTCwgInwiKTsKLSAgICB9Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmxvYWRPdXRDaGFubmVscyhjaGFyICpuYW1lKQotewotICAgIGNvbnN0IGNoYXIgKnN0ciA9IHN0cnRvayhuYW1lLCAifCIpOwotCi0gICAgQUxPR1YoImxvYWRPdXRDaGFubmVscygpICVzIiwgbmFtZSk7Ci0KLSAgICAvLyBieSBjb252ZW50aW9uLCAiMCcgaW4gdGhlIGZpcnN0IGVudHJ5IGluIG1DaGFubmVsTWFza3MgaW5kaWNhdGVzIHRoZSBzdXBwb3J0ZWQgY2hhbm5lbAotICAgIC8vIG1hc2tzIHNob3VsZCBiZSByZWFkIGZyb20gdGhlIG91dHB1dCBzdHJlYW0gYWZ0ZXIgaXQgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZQotICAgIGlmIChzdHIgIT0gTlVMTCAmJiBzdHJjbXAoc3RyLCBEWU5BTUlDX1ZBTFVFX1RBRykgPT0gMCkgewotICAgICAgICBtQ2hhbm5lbE1hc2tzLmFkZCgwKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHdoaWxlIChzdHIgIT0gTlVMTCkgewotICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9Ci0gICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KXN0cmluZ1RvRW51bShzT3V0Q2hhbm5lbHNOYW1lVG9FbnVtVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNPdXRDaGFubmVsc05hbWVUb0VudW1UYWJsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOwotICAgICAgICBpZiAoY2hhbm5lbE1hc2sgIT0gMCkgewotICAgICAgICAgICAgbUNoYW5uZWxNYXNrcy5hZGQoY2hhbm5lbE1hc2spOwotICAgICAgICB9Ci0gICAgICAgIHN0ciA9IHN0cnRvayhOVUxMLCAifCIpOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLWF1ZGlvX2dhaW5fbW9kZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Ojpsb2FkR2Fpbk1vZGUoY2hhciAqbmFtZSkKLXsKLSAgICBjb25zdCBjaGFyICpzdHIgPSBzdHJ0b2sobmFtZSwgInwiKTsKLQotICAgIEFMT0dWKCJsb2FkR2Fpbk1vZGUoKSAlcyIsIG5hbWUpOwotICAgIGF1ZGlvX2dhaW5fbW9kZV90IG1vZGUgPSAwOwotICAgIHdoaWxlIChzdHIgIT0gTlVMTCkgewotICAgICAgICBtb2RlIHw9IChhdWRpb19nYWluX21vZGVfdClzdHJpbmdUb0VudW0oc0dhaW5Nb2RlTmFtZVRvRW51bVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzR2Fpbk1vZGVOYW1lVG9FbnVtVGFibGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKLSAgICAgICAgc3RyID0gc3RydG9rKE5VTEwsICJ8Iik7Ci0gICAgfQotICAgIHJldHVybiBtb2RlOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Ojpsb2FkR2Fpbihjbm9kZSAqcm9vdCwgaW50IGluZGV4KQotewotICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0KLSAgICBzcDxBdWRpb0dhaW4+IGdhaW4gPSBuZXcgQXVkaW9HYWluKGluZGV4LCBtVXNlSW5DaGFubmVsTWFzayk7Ci0KLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTU9ERSkgPT0gMCkgewotICAgICAgICAgICAgZ2Fpbi0+bUdhaW4ubW9kZSA9IGxvYWRHYWluTW9kZSgoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9DSEFOTkVMUykgPT0gMCkgewotICAgICAgICAgICAgaWYgKG1Vc2VJbkNoYW5uZWxNYXNrKSB7Ci0gICAgICAgICAgICAgICAgZ2Fpbi0+bUdhaW4uY2hhbm5lbF9tYXNrID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdClzdHJpbmdUb0VudW0oc0luQ2hhbm5lbHNOYW1lVG9FbnVtVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0luQ2hhbm5lbHNOYW1lVG9FbnVtVGFibGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZ2Fpbi0+bUdhaW4uY2hhbm5lbF9tYXNrID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdClzdHJpbmdUb0VudW0oc091dENoYW5uZWxzTmFtZVRvRW51bVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNPdXRDaGFubmVsc05hbWVUb0VudW1UYWJsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbm9kZS0+dmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01JTl9WQUxVRSkgPT0gMCkgewotICAgICAgICAgICAgZ2Fpbi0+bUdhaW4ubWluX3ZhbHVlID0gYXRvaSgoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NQVhfVkFMVUUpID09IDApIHsKLSAgICAgICAgICAgIGdhaW4tPm1HYWluLm1heF92YWx1ZSA9IGF0b2koKGNoYXIgKilub2RlLT52YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fREVGQVVMVF9WQUxVRSkgPT0gMCkgewotICAgICAgICAgICAgZ2Fpbi0+bUdhaW4uZGVmYXVsdF92YWx1ZSA9IGF0b2koKGNoYXIgKilub2RlLT52YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fU1RFUF9WQUxVRSkgPT0gMCkgewotICAgICAgICAgICAgZ2Fpbi0+bUdhaW4uc3RlcF92YWx1ZSA9IGF0b2koKGNoYXIgKilub2RlLT52YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTUlOX1JBTVBfTVMpID09IDApIHsKLSAgICAgICAgICAgIGdhaW4tPm1HYWluLm1pbl9yYW1wX21zID0gYXRvaSgoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NQVhfUkFNUF9NUykgPT0gMCkgewotICAgICAgICAgICAgZ2Fpbi0+bUdhaW4ubWF4X3JhbXBfbXMgPSBhdG9pKChjaGFyICopbm9kZS0+dmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLQotICAgIEFMT0dWKCJsb2FkR2FpbigpIGFkZGluZyBuZXcgZ2FpbiBtb2RlICUwOHggY2hhbm5lbCBtYXNrICUwOHggbWluIG1CICVkIG1heCBtQiAlZCIsCi0gICAgICAgICAgZ2Fpbi0+bUdhaW4ubW9kZSwgZ2Fpbi0+bUdhaW4uY2hhbm5lbF9tYXNrLCBnYWluLT5tR2Fpbi5taW5fdmFsdWUsIGdhaW4tPm1HYWluLm1heF92YWx1ZSk7Ci0KLSAgICBpZiAoZ2Fpbi0+bUdhaW4ubW9kZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbUdhaW5zLmFkZChnYWluKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6bG9hZEdhaW5zKGNub2RlICpyb290KQotewotICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBBTE9HVigibG9hZEdhaW5zKCkgbG9hZGluZyBnYWluICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgIGxvYWRHYWluKG5vZGUsIGluZGV4KyspOwotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpjaGVja0V4YWN0U2FtcGxpbmdSYXRlKHVpbnQzMl90IHNhbXBsaW5nUmF0ZSkgY29uc3QKLXsKLSAgICBpZiAobVNhbXBsaW5nUmF0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKTsgaSArKykgewotICAgICAgICBpZiAobVNhbXBsaW5nUmF0ZXNbaV0gPT0gc2FtcGxpbmdSYXRlKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmNoZWNrQ29tcGF0aWJsZVNhbXBsaW5nUmF0ZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgIHVpbnQzMl90ICp1cGRhdGVkU2FtcGxpbmdSYXRlKSBjb25zdAotewotICAgIGlmIChtU2FtcGxpbmdSYXRlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8vIFNlYXJjaCBmb3IgdGhlIGNsb3Nlc3Qgc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGUgdGhhdCBpcyBhYm92ZSAocHJlZmVycmVkKQotICAgIC8vIG9yIGJlbG93IChhY2NlcHRhYmxlKSB0aGUgZGVzaXJlZCBzYW1wbGluZyByYXRlLCB3aXRoaW4gYSBwZXJtaXR0ZWQgcmF0aW8uCi0gICAgLy8gVGhlIHNhbXBsaW5nIHJhdGVzIGRvIG5vdCBuZWVkIHRvIGJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuCi0gICAgc3NpemVfdCBtYXhCZWxvdyA9IC0xOwotICAgIHNzaXplX3QgbWluQWJvdmUgPSAtMTsKLSAgICB1aW50MzJfdCBjYW5kaWRhdGU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkrKykgewotICAgICAgICBjYW5kaWRhdGUgPSBtU2FtcGxpbmdSYXRlc1tpXTsKLSAgICAgICAgaWYgKGNhbmRpZGF0ZSA9PSBzYW1wbGluZ1JhdGUpIHsKLSAgICAgICAgICAgIGlmICh1cGRhdGVkU2FtcGxpbmdSYXRlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqdXBkYXRlZFNhbXBsaW5nUmF0ZSA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICAvLyBjYW5kaWRhdGUgPCBkZXNpcmVkCi0gICAgICAgIGlmIChjYW5kaWRhdGUgPCBzYW1wbGluZ1JhdGUpIHsKLSAgICAgICAgICAgIGlmIChtYXhCZWxvdyA8IDAgfHwgY2FuZGlkYXRlID4gbVNhbXBsaW5nUmF0ZXNbbWF4QmVsb3ddKSB7Ci0gICAgICAgICAgICAgICAgbWF4QmVsb3cgPSBpOwotICAgICAgICAgICAgfQotICAgICAgICAvLyBjYW5kaWRhdGUgPiBkZXNpcmVkCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobWluQWJvdmUgPCAwIHx8IGNhbmRpZGF0ZSA8IG1TYW1wbGluZ1JhdGVzW21pbkFib3ZlXSkgewotICAgICAgICAgICAgICAgIG1pbkFib3ZlID0gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBUaGlzIHVzZXMgaGFyZC1jb2RlZCBrbm93bGVkZ2UgYWJvdXQgQXVkaW9GbGluZ2VyIHJlc2FtcGxpbmcgcmF0aW9zLgotICAgIC8vIFRPRE8gTW92ZSB0aGVzZSBhc3N1bXB0aW9ucyBvdXQuCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXhEb3duU2FtcGxlUmF0aW8gPSA2OyAgLy8gYmV5b25kIHRoaXMgYWxpYXNpbmcgb2NjdXJzCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXhVcFNhbXBsZVJhdGlvID0gMjU2OyAgLy8gYmV5b25kIHRoaXMgc2FtcGxlIHJhdGUgaW5hY2N1cmFjaWVzIG9jY3VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVlIHRvIGFwcHJveGltYXRpb24gYnkgYW4gaW50MzJfdCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaGFzZSBpbmNyZW1lbnRzCi0gICAgLy8gUHJlZmVyIHRvIGRvd24tc2FtcGxlIGZyb20gYSBoaWdoZXIgc2FtcGxpbmcgcmF0ZSwgYXMgd2UgZ2V0IHRoZSBkZXNpcmVkIGZyZXF1ZW5jeSBzcGVjdHJ1bS4KLSAgICBpZiAobWluQWJvdmUgPj0gMCkgewotICAgICAgICBjYW5kaWRhdGUgPSBtU2FtcGxpbmdSYXRlc1ttaW5BYm92ZV07Ci0gICAgICAgIGlmIChjYW5kaWRhdGUgLyBrTWF4RG93blNhbXBsZVJhdGlvIDw9IHNhbXBsaW5nUmF0ZSkgewotICAgICAgICAgICAgaWYgKHVwZGF0ZWRTYW1wbGluZ1JhdGUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICp1cGRhdGVkU2FtcGxpbmdSYXRlID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vIEJ1dCBpZiB3ZSBoYXZlIHRvIHVwLXNhbXBsZSBmcm9tIGEgbG93ZXIgc2FtcGxpbmcgcmF0ZSwgdGhhdCdzIE9LLgotICAgIGlmIChtYXhCZWxvdyA+PSAwKSB7Ci0gICAgICAgIGNhbmRpZGF0ZSA9IG1TYW1wbGluZ1JhdGVzW21heEJlbG93XTsKLSAgICAgICAgaWYgKGNhbmRpZGF0ZSAqIGtNYXhVcFNhbXBsZVJhdGlvID49IHNhbXBsaW5nUmF0ZSkgewotICAgICAgICAgICAgaWYgKHVwZGF0ZWRTYW1wbGluZ1JhdGUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICp1cGRhdGVkU2FtcGxpbmdSYXRlID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vIGxlYXZlIHVwZGF0ZWRTYW1wbGluZ1JhdGUgdW5tb2RpZmllZAotICAgIHJldHVybiBCQURfVkFMVUU7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpjaGVja0V4YWN0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIGNvbnN0Ci17Ci0gICAgaWYgKG1DaGFubmVsTWFza3MuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1DaGFubmVsTWFza3NbaV0gPT0gY2hhbm5lbE1hc2spIHsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gQkFEX1ZBTFVFOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6Y2hlY2tDb21wYXRpYmxlQ2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spCi0gICAgICAgIGNvbnN0Ci17Ci0gICAgaWYgKG1DaGFubmVsTWFza3MuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICBjb25zdCBib29sIGlzUmVjb3JkVGhyZWFkID0gbVR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCAmJiBtUm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSzsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIC8vIEZJWE1FIERvZXMgbm90IGhhbmRsZSBtdWx0aS1jaGFubmVsIGF1dG9tYXRpYyBjb252ZXJzaW9ucyB5ZXQKLSAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgc3VwcG9ydGVkID0gbUNoYW5uZWxNYXNrc1tpXTsKLSAgICAgICAgaWYgKHN1cHBvcnRlZCA9PSBjaGFubmVsTWFzaykgewotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc1JlY29yZFRocmVhZCkgewotICAgICAgICAgICAgLy8gVGhpcyB1c2VzIGhhcmQtY29kZWQga25vd2xlZGdlIHRoYXQgQXVkaW9GbGluZ2VyIGNhbiBzaWxlbnRseSBkb3duLW1peCBhbmQgdXAtbWl4LgotICAgICAgICAgICAgLy8gRklYTUUgQWJzdHJhY3QgdGhpcyBvdXQgdG8gYSB0YWJsZS4KLSAgICAgICAgICAgIGlmICgoKHN1cHBvcnRlZCA9PSBBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0sgfHwgc3VwcG9ydGVkID09IEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPKQotICAgICAgICAgICAgICAgICAgICAmJiBjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX0lOX01PTk8pIHx8Ci0gICAgICAgICAgICAgICAgKHN1cHBvcnRlZCA9PSBBVURJT19DSEFOTkVMX0lOX01PTk8gJiYgKGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSwotICAgICAgICAgICAgICAgICAgICB8fCBjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX0lOX1NURVJFTykpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBCQURfVkFMVUU7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpjaGVja0Zvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0Ci17Ci0gICAgaWYgKG1Gb3JtYXRzLmlzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRm9ybWF0cy5zaXplKCk7IGkgKyspIHsKLSAgICAgICAgaWYgKG1Gb3JtYXRzW2ldID09IGZvcm1hdCkgewotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBCQURfVkFMVUU7Ci19Ci0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OnBpY2tTYW1wbGluZ1JhdGUoKSBjb25zdAotewotICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgdW5pbml0aWFsaXplZCBkeW5hbWljIHByb2ZpbGUKLSAgICBpZiAobVNhbXBsaW5nUmF0ZXMuc2l6ZSgpID09IDEgJiYgbVNhbXBsaW5nUmF0ZXNbMF0gPT0gMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvLyBGb3IgZGlyZWN0IG91dHB1dHMsIHBpY2sgbWluaW11bSBzYW1wbGluZyByYXRlOiB0aGlzIGhlbHBzIGVuc3VyaW5nIHRoYXQgdGhlCi0gICAgLy8gY2hhbm5lbCBjb3VudCAvIHNhbXBsaW5nIHJhdGUgY29tYmluYXRpb24gY2hvc2VuIHdpbGwgYmUgc3VwcG9ydGVkIGJ5IHRoZSBjb25uZWN0ZWQKLSAgICAvLyBzaW5rCi0gICAgaWYgKChtVHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSAmJiAobVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgJiYKLSAgICAgICAgICAgIChtRmxhZ3MgJiAoQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIHwgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkpKSB7Ci0gICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IFVJTlRfTUFYOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKTsgaSArKykgewotICAgICAgICAgICAgaWYgKChtU2FtcGxpbmdSYXRlc1tpXSA8IHNhbXBsaW5nUmF0ZSkgJiYgKG1TYW1wbGluZ1JhdGVzW2ldID4gMCkpIHsKLSAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUgPSBtU2FtcGxpbmdSYXRlc1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKHNhbXBsaW5nUmF0ZSA9PSBVSU5UX01BWCkgPyAwIDogc2FtcGxpbmdSYXRlOwotICAgIH0KLQotICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDA7Ci0gICAgdWludDMyX3QgbWF4UmF0ZSA9IE1BWF9NSVhFUl9TQU1QTElOR19SQVRFOwotCi0gICAgLy8gRm9yIG1peGVkIG91dHB1dCBhbmQgaW5wdXRzLCB1c2UgbWF4IG1peGVyIHNhbXBsaW5nIHJhdGVzLiBEbyBub3QKLSAgICAvLyBsaW1pdCBzYW1wbGluZyByYXRlIG90aGVyd2lzZQotICAgIGlmIChtVHlwZSAhPSBBVURJT19QT1JUX1RZUEVfTUlYKSB7Ci0gICAgICAgIG1heFJhdGUgPSBVSU5UX01BWDsKLSAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkgKyspIHsKLSAgICAgICAgaWYgKChtU2FtcGxpbmdSYXRlc1tpXSA+IHNhbXBsaW5nUmF0ZSkgJiYgKG1TYW1wbGluZ1JhdGVzW2ldIDw9IG1heFJhdGUpKSB7Ci0gICAgICAgICAgICBzYW1wbGluZ1JhdGUgPSBtU2FtcGxpbmdSYXRlc1tpXTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc2FtcGxpbmdSYXRlOwotfQotCi1hdWRpb19jaGFubmVsX21hc2tfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6cGlja0NoYW5uZWxNYXNrKCkgY29uc3QKLXsKLSAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHVuaW5pdGlhbGl6ZWQgZHluYW1pYyBwcm9maWxlCi0gICAgaWYgKG1DaGFubmVsTWFza3Muc2l6ZSgpID09IDEgJiYgbUNoYW5uZWxNYXNrc1swXSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX05PTkU7Ci0gICAgfQotICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOwotCi0gICAgLy8gRm9yIGRpcmVjdCBvdXRwdXRzLCBwaWNrIG1pbmltdW0gY2hhbm5lbCBjb3VudDogdGhpcyBoZWxwcyBlbnN1cmluZyB0aGF0IHRoZQotICAgIC8vIGNoYW5uZWwgY291bnQgLyBzYW1wbGluZyByYXRlIGNvbWJpbmF0aW9uIGNob3NlbiB3aWxsIGJlIHN1cHBvcnRlZCBieSB0aGUgY29ubmVjdGVkCi0gICAgLy8gc2luawotICAgIGlmICgobVR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgJiYgKG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpICYmCi0gICAgICAgICAgICAobUZsYWdzICYgKEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpKSkgewotICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBVSU5UX01BWDsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKTsgaSArKykgewotICAgICAgICAgICAgdWludDMyX3QgY25sQ291bnQ7Ci0gICAgICAgICAgICBpZiAobVVzZUluQ2hhbm5lbE1hc2spIHsKLSAgICAgICAgICAgICAgICBjbmxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1DaGFubmVsTWFza3NbaV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjbmxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtQ2hhbm5lbE1hc2tzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoY25sQ291bnQgPCBjaGFubmVsQ291bnQpICYmIChjbmxDb3VudCA+IDApKSB7Ci0gICAgICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2tzW2ldOwotICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IGNubENvdW50OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGFubmVsTWFzazsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSAwOwotICAgIHVpbnQzMl90IG1heENvdW50ID0gTUFYX01JWEVSX0NIQU5ORUxfQ09VTlQ7Ci0KLSAgICAvLyBGb3IgbWl4ZWQgb3V0cHV0IGFuZCBpbnB1dHMsIHVzZSBtYXggbWl4ZXIgY2hhbm5lbCBjb3VudC4gRG8gbm90Ci0gICAgLy8gbGltaXQgY2hhbm5lbCBjb3VudCBvdGhlcndpc2UKLSAgICBpZiAobVR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX01JWCkgewotICAgICAgICBtYXhDb3VudCA9IFVJTlRfTUFYOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIHVpbnQzMl90IGNubENvdW50OwotICAgICAgICBpZiAobVVzZUluQ2hhbm5lbE1hc2spIHsKLSAgICAgICAgICAgIGNubENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUNoYW5uZWxNYXNrc1tpXSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjbmxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtQ2hhbm5lbE1hc2tzW2ldKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGNubENvdW50ID4gY2hhbm5lbENvdW50KSAmJiAoY25sQ291bnQgPD0gbWF4Q291bnQpKSB7Ci0gICAgICAgICAgICBjaGFubmVsTWFzayA9IG1DaGFubmVsTWFza3NbaV07Ci0gICAgICAgICAgICBjaGFubmVsQ291bnQgPSBjbmxDb3VudDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gY2hhbm5lbE1hc2s7Ci19Ci0KLS8qIGZvcm1hdCBpbiBvcmRlciBvZiBpbmNyZWFzaW5nIHByZWZlcmVuY2UgKi8KLWNvbnN0IGF1ZGlvX2Zvcm1hdF90IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpzUGNtRm9ybWF0Q29tcGFyZVRhYmxlW10gPSB7Ci0gICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxULAotICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKLSAgICAgICAgQVVESU9fRk9STUFUX1BDTV84XzI0X0JJVCwKLSAgICAgICAgQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VELAotICAgICAgICBBVURJT19GT1JNQVRfUENNXzMyX0JJVCwKLSAgICAgICAgQVVESU9fRk9STUFUX1BDTV9GTE9BVCwKLX07Ci0KLWludCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6Y29tcGFyZUZvcm1hdHMoYXVkaW9fZm9ybWF0X3QgZm9ybWF0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0MikKLXsKLSAgICAvLyBOT1RFOiBBVURJT19GT1JNQVRfSU5WQUxJRCBpcyBhbHNvIGNvbnNpZGVyZWQgbm90IFBDTSBhbmQgd2lsbCBiZSBjb21wYXJlZCBlcXVhbCB0byBhbnkKLSAgICAvLyBjb21wcmVzc2VkIGZvcm1hdCBhbmQgYmV0dGVyIHRoYW4gYW55IFBDTSBmb3JtYXQuIFRoaXMgaXMgYnkgZGVzaWduIG9mIHBpY2tGb3JtYXQoKQotICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQxKSkgewotICAgICAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0MikpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0MikpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGludCBpbmRleDEgPSAtMSwgaW5kZXgyID0gLTE7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7Ci0gICAgICAgICAgICAoaSA8IEFSUkFZX1NJWkUoc1BjbUZvcm1hdENvbXBhcmVUYWJsZSkpICYmICgoaW5kZXgxID09IC0xKSB8fCAoaW5kZXgyID09IC0xKSk7Ci0gICAgICAgICAgICBpICsrKSB7Ci0gICAgICAgIGlmIChzUGNtRm9ybWF0Q29tcGFyZVRhYmxlW2ldID09IGZvcm1hdDEpIHsKLSAgICAgICAgICAgIGluZGV4MSA9IGk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNQY21Gb3JtYXRDb21wYXJlVGFibGVbaV0gPT0gZm9ybWF0MikgewotICAgICAgICAgICAgaW5kZXgyID0gaTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBmb3JtYXQxIG5vdCBmb3VuZCA9PiBpbmRleDEgPCAwID0+IGZvcm1hdDIgPiBmb3JtYXQxCi0gICAgLy8gZm9ybWF0MiBub3QgZm91bmQgPT4gaW5kZXgyIDwgMCA9PiBmb3JtYXQyIDwgZm9ybWF0MQotICAgIHJldHVybiBpbmRleDEgLSBpbmRleDI7Ci19Ci0KLWF1ZGlvX2Zvcm1hdF90IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpwaWNrRm9ybWF0KCkgY29uc3QKLXsKLSAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHVuaW5pdGlhbGl6ZWQgZHluYW1pYyBwcm9maWxlCi0gICAgaWYgKG1Gb3JtYXRzLnNpemUoKSA9PSAxICYmIG1Gb3JtYXRzWzBdID09IDApIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX0ZPUk1BVF9ERUZBVUxUOwotICAgIH0KLQotICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUOwotICAgIGF1ZGlvX2Zvcm1hdF90IGJlc3RGb3JtYXQgPQotICAgICAgICAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OnNQY21Gb3JtYXRDb21wYXJlVGFibGVbCi0gICAgICAgICAgICAgICAgQVJSQVlfU0laRShBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6c1BjbUZvcm1hdENvbXBhcmVUYWJsZSkgLSAxXTsKLSAgICAvLyBGb3IgbWl4ZWQgb3V0cHV0IGFuZCBpbnB1dHMsIHVzZSBiZXN0IG1peGVyIG91dHB1dCBmb3JtYXQuIERvIG5vdAotICAgIC8vIGxpbWl0IGZvcm1hdCBvdGhlcndpc2UKLSAgICBpZiAoKG1UeXBlICE9IEFVRElPX1BPUlRfVFlQRV9NSVgpIHx8Ci0gICAgICAgICAgICAoKG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpICYmCi0gICAgICAgICAgICAgKCgobUZsYWdzICYgKEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpKSAhPSAwKSkpKSB7Ci0gICAgICAgIGJlc3RGb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Gb3JtYXRzLnNpemUoKTsgaSArKykgewotICAgICAgICBpZiAoKGNvbXBhcmVGb3JtYXRzKG1Gb3JtYXRzW2ldLCBmb3JtYXQpID4gMCkgJiYKLSAgICAgICAgICAgICAgICAoY29tcGFyZUZvcm1hdHMobUZvcm1hdHNbaV0sIGJlc3RGb3JtYXQpIDw9IDApKSB7Ci0gICAgICAgICAgICBmb3JtYXQgPSBtRm9ybWF0c1tpXTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZm9ybWF0OwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6Y2hlY2tHYWluKGNvbnN0IHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqZ2FpbkNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdAotewotICAgIGlmIChpbmRleCA8IDAgfHwgKHNpemVfdClpbmRleCA+PSBtR2FpbnMuc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHJldHVybiBtR2FpbnNbaW5kZXhdLT5jaGVja0NvbmZpZyhnYWluQ29uZmlnKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBpZiAobU5hbWUuc2l6ZSgpICE9IDApIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU5hbWUuc3RyaW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQotCi0gICAgaWYgKG1TYW1wbGluZ1JhdGVzLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gc2FtcGxpbmcgcmF0ZXM6ICIsIHNwYWNlcywgIiIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpID09IDAgJiYgbVNhbXBsaW5nUmF0ZXNbaV0gPT0gMCkgewotICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkR5bmFtaWMiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJWQiLCBtU2FtcGxpbmdSYXRlc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGkgPT0gKG1TYW1wbGluZ1JhdGVzLnNpemUoKSAtIDEpID8gIiIgOiAiLCAiKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwotICAgIH0KLQotICAgIGlmIChtQ2hhbm5lbE1hc2tzLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gY2hhbm5lbCBtYXNrczogIiwgc3BhY2VzLCAiIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBBTE9HVigiQXVkaW9Qb3J0OjpkdW1wIG1DaGFubmVsTWFza3MgJXp1ICUwOHgiLCBpLCBtQ2hhbm5lbE1hc2tzW2ldKTsKLQotICAgICAgICAgICAgaWYgKGkgPT0gMCAmJiBtQ2hhbm5lbE1hc2tzW2ldID09IDApIHsKLSAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJEeW5hbWljIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIjB4JTA0eCIsIG1DaGFubmVsTWFza3NbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpID09IChtQ2hhbm5lbE1hc2tzLnNpemUoKSAtIDEpID8gIiIgOiAiLCAiKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwotICAgIH0KLQotICAgIGlmIChtRm9ybWF0cy5zaXplKCkgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGZvcm1hdHM6ICIsIHNwYWNlcywgIiIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdFN0ciA9IGVudW1Ub1N0cmluZyhzRm9ybWF0TmFtZVRvRW51bVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0Zvcm1hdE5hbWVUb0VudW1UYWJsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdHNbaV0pOwotICAgICAgICAgICAgaWYgKGkgPT0gMCAmJiBzdHJjbXAoZm9ybWF0U3RyLCAiIikgPT0gMCkgewotICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkR5bmFtaWMiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJXMiLCBmb3JtYXRTdHIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpID09IChtRm9ybWF0cy5zaXplKCkgLSAxKSA/ICIiIDogIiwgIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLSAgICB9Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgaWYgKG1HYWlucy5zaXplKCkgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGdhaW5zOlxuIiwgc3BhY2VzLCAiIik7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpICsgMSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtR2FpbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIG1HYWluc1tpXS0+ZHVtcChmZCwgc3BhY2VzICsgMiwgaSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIC0tLSBBdWRpb0dhaW4gY2xhc3MgaW1wbGVtZW50YXRpb24KLQotQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb0dhaW46OkF1ZGlvR2FpbihpbnQgaW5kZXgsIGJvb2wgdXNlSW5DaGFubmVsTWFzaykKLXsKLSAgICBtSW5kZXggPSBpbmRleDsKLSAgICBtVXNlSW5DaGFubmVsTWFzayA9IHVzZUluQ2hhbm5lbE1hc2s7Ci0gICAgbWVtc2V0KCZtR2FpbiwgMCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19nYWluKSk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb0dhaW46OmdldERlZmF1bHRDb25maWcoc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpjb25maWcpCi17Ci0gICAgY29uZmlnLT5pbmRleCA9IG1JbmRleDsKLSAgICBjb25maWctPm1vZGUgPSBtR2Fpbi5tb2RlOwotICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrID0gbUdhaW4uY2hhbm5lbF9tYXNrOwotICAgIGlmICgobUdhaW4ubW9kZSAmIEFVRElPX0dBSU5fTU9ERV9KT0lOVCkgPT0gQVVESU9fR0FJTl9NT0RFX0pPSU5UKSB7Ci0gICAgICAgIGNvbmZpZy0+dmFsdWVzWzBdID0gbUdhaW4uZGVmYXVsdF92YWx1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICB1aW50MzJfdCBudW1WYWx1ZXM7Ci0gICAgICAgIGlmIChtVXNlSW5DaGFubmVsTWFzaykgewotICAgICAgICAgICAgbnVtVmFsdWVzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUdhaW4uY2hhbm5lbF9tYXNrKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG51bVZhbHVlcyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtR2Fpbi5jaGFubmVsX21hc2spOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyBpKyspIHsKLSAgICAgICAgICAgIGNvbmZpZy0+dmFsdWVzW2ldID0gbUdhaW4uZGVmYXVsdF92YWx1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoKG1HYWluLm1vZGUgJiBBVURJT19HQUlOX01PREVfUkFNUCkgPT0gQVVESU9fR0FJTl9NT0RFX1JBTVApIHsKLSAgICAgICAgY29uZmlnLT5yYW1wX2R1cmF0aW9uX21zID0gbUdhaW4ubWluX3JhbXBfbXM7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvR2Fpbjo6Y2hlY2tDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpjb25maWcpCi17Ci0gICAgaWYgKChjb25maWctPm1vZGUgJiB+bUdhaW4ubW9kZSkgIT0gMCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBpZiAoKGNvbmZpZy0+bW9kZSAmIEFVRElPX0dBSU5fTU9ERV9KT0lOVCkgPT0gQVVESU9fR0FJTl9NT0RFX0pPSU5UKSB7Ci0gICAgICAgIGlmICgoY29uZmlnLT52YWx1ZXNbMF0gPCBtR2Fpbi5taW5fdmFsdWUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChjb25maWctPnZhbHVlc1swXSA+IG1HYWluLm1heF92YWx1ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoKGNvbmZpZy0+Y2hhbm5lbF9tYXNrICYgfm1HYWluLmNoYW5uZWxfbWFzaykgIT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICB1aW50MzJfdCBudW1WYWx1ZXM7Ci0gICAgICAgIGlmIChtVXNlSW5DaGFubmVsTWFzaykgewotICAgICAgICAgICAgbnVtVmFsdWVzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY29uZmlnLT5jaGFubmVsX21hc2spOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbnVtVmFsdWVzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVZhbHVlczsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoKGNvbmZpZy0+dmFsdWVzW2ldIDwgbUdhaW4ubWluX3ZhbHVlKSB8fAotICAgICAgICAgICAgICAgICAgICAoY29uZmlnLT52YWx1ZXNbaV0gPiBtR2Fpbi5tYXhfdmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoKGNvbmZpZy0+bW9kZSAmIEFVRElPX0dBSU5fTU9ERV9SQU1QKSA9PSBBVURJT19HQUlOX01PREVfUkFNUCkgewotICAgICAgICBpZiAoKGNvbmZpZy0+cmFtcF9kdXJhdGlvbl9tcyA8IG1HYWluLm1pbl9yYW1wX21zKSB8fAotICAgICAgICAgICAgICAgICAgICAoY29uZmlnLT5yYW1wX2R1cmF0aW9uX21zID4gbUdhaW4ubWF4X3JhbXBfbXMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvR2Fpbjo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0dhaW4gJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtb2RlOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5tb2RlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBjaGFubmVsX21hc2s6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1HYWluLmNoYW5uZWxfbWFzayk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWluX3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWluX3ZhbHVlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtYXhfdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5tYXhfdmFsdWUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGRlZmF1bHRfdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5kZWZhdWx0X3ZhbHVlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBzdGVwX3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uc3RlcF92YWx1ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWluX3JhbXBfbXM6ICVkIG1zXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5taW5fcmFtcF9tcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWF4X3JhbXBfbXM6ICVkIG1zXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5tYXhfcmFtcF9tcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci19Ci0KLS8vIC0tLSBBdWRpb1BvcnRDb25maWcgY2xhc3MgaW1wbGVtZW50YXRpb24KLQotQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnRDb25maWc6OkF1ZGlvUG9ydENvbmZpZygpCi17Ci0gICAgbVNhbXBsaW5nUmF0ZSA9IDA7Ci0gICAgbUNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOwotICAgIG1Gb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICBtR2Fpbi5pbmRleCA9IC0xOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydENvbmZpZzo6YXBwbHlBdWRpb1BvcnRDb25maWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmJhY2t1cENvbmZpZykKLXsKLSAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgbG9jYWxCYWNrdXBDb25maWc7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0KLSAgICBsb2NhbEJhY2t1cENvbmZpZy5jb25maWdfbWFzayA9IGNvbmZpZy0+Y29uZmlnX21hc2s7Ci0gICAgdG9BdWRpb1BvcnRDb25maWcoJmxvY2FsQmFja3VwQ29uZmlnKTsKLQotICAgIHNwPEF1ZGlvUG9ydD4gYXVkaW9wb3J0ID0gZ2V0QXVkaW9Qb3J0KCk7Ci0gICAgaWYgKGF1ZGlvcG9ydCA9PSAwKSB7Ci0gICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7Ci0gICAgICAgIGdvdG8gZXhpdDsKLSAgICB9Ci0gICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSkgewotICAgICAgICBzdGF0dXMgPSBhdWRpb3BvcnQtPmNoZWNrRXhhY3RTYW1wbGluZ1JhdGUoY29uZmlnLT5zYW1wbGVfcmF0ZSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgfQotICAgICAgICBtU2FtcGxpbmdSYXRlID0gY29uZmlnLT5zYW1wbGVfcmF0ZTsKLSAgICB9Ci0gICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0spIHsKLSAgICAgICAgc3RhdHVzID0gYXVkaW9wb3J0LT5jaGVja0V4YWN0Q2hhbm5lbE1hc2soY29uZmlnLT5jaGFubmVsX21hc2spOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgIH0KLSAgICAgICAgbUNoYW5uZWxNYXNrID0gY29uZmlnLT5jaGFubmVsX21hc2s7Ci0gICAgfQotICAgIGlmIChjb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSB7Ci0gICAgICAgIHN0YXR1cyA9IGF1ZGlvcG9ydC0+Y2hlY2tGb3JtYXQoY29uZmlnLT5mb3JtYXQpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgIH0KLSAgICAgICAgbUZvcm1hdCA9IGNvbmZpZy0+Zm9ybWF0OwotICAgIH0KLSAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0dBSU4pIHsKLSAgICAgICAgc3RhdHVzID0gYXVkaW9wb3J0LT5jaGVja0dhaW4oJmNvbmZpZy0+Z2FpbiwgY29uZmlnLT5nYWluLmluZGV4KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICB9Ci0gICAgICAgIG1HYWluID0gY29uZmlnLT5nYWluOwotICAgIH0KLQotZXhpdDoKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIGFwcGx5QXVkaW9Qb3J0Q29uZmlnKCZsb2NhbEJhY2t1cENvbmZpZyk7Ci0gICAgfQotICAgIGlmIChiYWNrdXBDb25maWcgIT0gTlVMTCkgewotICAgICAgICAqYmFja3VwQ29uZmlnID0gbG9jYWxCYWNrdXBDb25maWc7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnRDb25maWc6OnRvQXVkaW9Qb3J0Q29uZmlnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAotewotICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpIHsKLSAgICAgICAgZHN0Q29uZmlnLT5zYW1wbGVfcmF0ZSA9IG1TYW1wbGluZ1JhdGU7Ci0gICAgICAgIGlmICgoc3JjQ29uZmlnICE9IE5VTEwpICYmIChzcmNDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpKSB7Ci0gICAgICAgICAgICBkc3RDb25maWctPnNhbXBsZV9yYXRlID0gc3JjQ29uZmlnLT5zYW1wbGVfcmF0ZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRzdENvbmZpZy0+c2FtcGxlX3JhdGUgPSAwOwotICAgIH0KLSAgICBpZiAoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgewotICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IG1DaGFubmVsTWFzazsKLSAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0spKSB7Ci0gICAgICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IHNyY0NvbmZpZy0+Y2hhbm5lbF9tYXNrOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHN0Q29uZmlnLT5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7Ci0gICAgfQotICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSB7Ci0gICAgICAgIGRzdENvbmZpZy0+Zm9ybWF0ID0gbUZvcm1hdDsKLSAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpKSB7Ci0gICAgICAgICAgICBkc3RDb25maWctPmZvcm1hdCA9IHNyY0NvbmZpZy0+Zm9ybWF0OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHN0Q29uZmlnLT5mb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICB9Ci0gICAgaWYgKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19HQUlOKSB7Ci0gICAgICAgIGRzdENvbmZpZy0+Z2FpbiA9IG1HYWluOwotICAgICAgICBpZiAoKHNyY0NvbmZpZyAhPSBOVUxMKSAmJiAoc3JjQ29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0dBSU4pKSB7Ci0gICAgICAgICAgICBkc3RDb25maWctPmdhaW4gPSBzcmNDb25maWctPmdhaW47Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBkc3RDb25maWctPmdhaW4uaW5kZXggPSAtMTsKLSAgICB9Ci0gICAgaWYgKGRzdENvbmZpZy0+Z2Fpbi5pbmRleCAhPSAtMSkgewotICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0dBSU47Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayAmPSB+QVVESU9fUE9SVF9DT05GSUdfR0FJTjsKLSAgICB9Ci19Ci0KLS8vIC0tLSBJT1Byb2ZpbGUgY2xhc3MgaW1wbGVtZW50YXRpb24KLQotQXVkaW9Qb2xpY3lNYW5hZ2VyOjpJT1Byb2ZpbGU6OklPUHJvZmlsZShjb25zdCBTdHJpbmc4JiBuYW1lLCBhdWRpb19wb3J0X3JvbGVfdCByb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSkKLSAgICA6IEF1ZGlvUG9ydChuYW1lLCBBVURJT19QT1JUX1RZUEVfTUlYLCByb2xlLCBtb2R1bGUpCi17Ci19Ci0KLUF1ZGlvUG9saWN5TWFuYWdlcjo6SU9Qcm9maWxlOjp+SU9Qcm9maWxlKCkKLXsKLX0KLQotLy8gY2hlY2tzIGlmIHRoZSBJTyBwcm9maWxlIGlzIGNvbXBhdGlibGUgd2l0aCBzcGVjaWZpZWQgcGFyYW1ldGVycy4KLS8vIFNhbXBsaW5nIHJhdGUsIGZvcm1hdCBhbmQgY2hhbm5lbCBtYXNrIG11c3QgYmUgc3BlY2lmaWVkIGluIG9yZGVyIHRvCi0vLyBnZXQgYSB2YWxpZCBhIG1hdGNoCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6SU9Qcm9maWxlOjppc0NvbXBhdGlibGVQcm9maWxlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqdXBkYXRlZFNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpIGNvbnN0Ci17Ci0gICAgY29uc3QgYm9vbCBpc1BsYXliYWNrVGhyZWFkID0gbVR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCAmJiBtUm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFOwotICAgIGNvbnN0IGJvb2wgaXNSZWNvcmRUaHJlYWQgPSBtVHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYICYmIG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LOwotICAgIEFMT0dfQVNTRVJUKGlzUGxheWJhY2tUaHJlYWQgIT0gaXNSZWNvcmRUaHJlYWQpOwotCi0gICAgaWYgKGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSAmJiBtU3VwcG9ydGVkRGV2aWNlcy5nZXREZXZpY2UoZGV2aWNlLCBhZGRyZXNzKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoc2FtcGxpbmdSYXRlID09IDApIHsKLSAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgdWludDMyX3QgbXlVcGRhdGVkU2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlOwotICAgIGlmIChpc1BsYXliYWNrVGhyZWFkICYmIGNoZWNrRXhhY3RTYW1wbGluZ1JhdGUoc2FtcGxpbmdSYXRlKSAhPSBOT19FUlJPUikgewotICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoaXNSZWNvcmRUaHJlYWQgJiYgY2hlY2tDb21wYXRpYmxlU2FtcGxpbmdSYXRlKHNhbXBsaW5nUmF0ZSwgJm15VXBkYXRlZFNhbXBsaW5nUmF0ZSkgIT0KLSAgICAgICAgICAgIE5PX0VSUk9SKSB7Ci0gICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQoZm9ybWF0KSB8fCBjaGVja0Zvcm1hdChmb3JtYXQpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoaXNQbGF5YmFja1RocmVhZCAmJiAoIWF1ZGlvX2lzX291dHB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSB8fAotICAgICAgICAgICAgY2hlY2tFeGFjdENoYW5uZWxNYXNrKGNoYW5uZWxNYXNrKSAhPSBOT19FUlJPUikpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoaXNSZWNvcmRUaHJlYWQgJiYgKCFhdWRpb19pc19pbnB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSB8fAotICAgICAgICAgICAgY2hlY2tDb21wYXRpYmxlQ2hhbm5lbE1hc2soY2hhbm5lbE1hc2spICE9IE5PX0VSUk9SKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKGlzUGxheWJhY2tUaHJlYWQgJiYgKG1GbGFncyAmIGZsYWdzKSAhPSBmbGFncykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIC8vIFRoZSBvbmx5IGlucHV0IGZsYWcgdGhhdCBpcyBhbGxvd2VkIHRvIGJlIGRpZmZlcmVudCBpcyB0aGUgZmFzdCBmbGFnLgotICAgIC8vIEFuIGV4aXN0aW5nIGZhc3Qgc3RyZWFtIGlzIGNvbXBhdGlibGUgd2l0aCBhIG5vcm1hbCB0cmFjayByZXF1ZXN0LgotICAgIC8vIEFuIGV4aXN0aW5nIG5vcm1hbCBzdHJlYW0gaXMgY29tcGF0aWJsZSB3aXRoIGEgZmFzdCB0cmFjayByZXF1ZXN0LAotICAgIC8vIGJ1dCB0aGUgZmFzdCByZXF1ZXN0IHdpbGwgYmUgZGVuaWVkIGJ5IEF1ZGlvRmxpbmdlciBhbmQgY29udmVydGVkIHRvIG5vcm1hbCB0cmFjay4KLSAgICBpZiAoaXNSZWNvcmRUaHJlYWQgJiYgKChtRmxhZ3MgXiBmbGFncykgJgotICAgICAgICAgICAgfkFVRElPX0lOUFVUX0ZMQUdfRkFTVCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICh1cGRhdGVkU2FtcGxpbmdSYXRlICE9IE5VTEwpIHsKLSAgICAgICAgKnVwZGF0ZWRTYW1wbGluZ1JhdGUgPSBteVVwZGF0ZWRTYW1wbGluZ1JhdGU7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6SU9Qcm9maWxlOjpkdW1wKGludCBmZCkKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIEF1ZGlvUG9ydDo6ZHVtcChmZCwgNCk7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgLSBmbGFnczogMHglMDR4XG4iLCBtRmxhZ3MpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgLSBkZXZpY2VzOlxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVN1cHBvcnRlZERldmljZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbVN1cHBvcnRlZERldmljZXNbaV0tPmR1bXAoZmQsIDYsIGkpOwotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OklPUHJvZmlsZTo6bG9nKCkKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIEFMT0dWKCIgICAgLSBzYW1wbGluZyByYXRlczogIik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkrKykgewotICAgICAgICBBTE9HVigiICAlZCIsIG1TYW1wbGluZ1JhdGVzW2ldKTsKLSAgICB9Ci0KLSAgICBBTE9HVigiICAgIC0gY2hhbm5lbCBtYXNrczogIik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIEFMT0dWKCIgIDB4JTA0eCIsIG1DaGFubmVsTWFza3NbaV0pOwotICAgIH0KLQotICAgIEFMT0dWKCIgICAgLSBmb3JtYXRzOiAiKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Gb3JtYXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIEFMT0dWKCIgIDB4JTA4eCIsIG1Gb3JtYXRzW2ldKTsKLSAgICB9Ci0KLSAgICBBTE9HVigiICAgIC0gZGV2aWNlczogMHglMDR4XG4iLCBtU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpKTsKLSAgICBBTE9HVigiICAgIC0gZmxhZ3M6IDB4JTA0eFxuIiwgbUZsYWdzKTsKLX0KLQotCi0vLyAtLS0gRGV2aWNlRGVzY3JpcHRvciBpbXBsZW1lbnRhdGlvbgotCi0KLUF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlRGVzY3JpcHRvcjo6RGV2aWNlRGVzY3JpcHRvcihjb25zdCBTdHJpbmc4JiBuYW1lLCBhdWRpb19kZXZpY2VzX3QgdHlwZSkgOgotICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb3J0KG5hbWUsIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faXNfb3V0cHV0X2RldmljZSh0eXBlKSA/IEFVRElPX1BPUlRfUk9MRV9TSU5LIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCksCi0gICAgICAgICAgICAgICAgICAgICBtRGV2aWNlVHlwZSh0eXBlKSwgbUFkZHJlc3MoIiIpLCBtSWQoMCkKLXsKLX0KLQotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I6OmVxdWFscyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgb3RoZXIpIGNvbnN0Ci17Ci0gICAgLy8gRGV2aWNlcyBhcmUgY29uc2lkZXJlZCBlcXVhbCBpZiB0aGV5OgotICAgIC8vIC0gYXJlIG9mIHRoZSBzYW1lIHR5cGUgKGEgZGV2aWNlIHR5cGUgY2Fubm90IGJlIEFVRElPX0RFVklDRV9OT05FKQotICAgIC8vIC0gaGF2ZSB0aGUgc2FtZSBhZGRyZXNzIG9yIG9uZSBkZXZpY2UgZG9lcyBub3Qgc3BlY2lmeSB0aGUgYWRkcmVzcwotICAgIC8vIC0gaGF2ZSB0aGUgc2FtZSBjaGFubmVsIG1hc2sgb3Igb25lIGRldmljZSBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBjaGFubmVsIG1hc2sKLSAgICByZXR1cm4gKG1EZXZpY2VUeXBlID09IG90aGVyLT5tRGV2aWNlVHlwZSkgJiYKLSAgICAgICAgICAgKG1BZGRyZXNzID09ICIiIHx8IG90aGVyLT5tQWRkcmVzcyA9PSAiIiB8fCBtQWRkcmVzcyA9PSBvdGhlci0+bUFkZHJlc3MpICYmCi0gICAgICAgICAgIChtQ2hhbm5lbE1hc2sgPT0gMCB8fCBvdGhlci0+bUNoYW5uZWxNYXNrID09IDAgfHwKLSAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2sgPT0gb3RoZXItPm1DaGFubmVsTWFzayk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VEZXNjcmlwdG9yOjpsb2FkR2FpbnMoY25vZGUgKnJvb3QpCi17Ci0gICAgQXVkaW9Qb3J0Ojpsb2FkR2FpbnMocm9vdCk7Ci0gICAgaWYgKG1HYWlucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgIG1HYWluc1swXS0+Z2V0RGVmYXVsdENvbmZpZygmbUdhaW4pOwotICAgIH0KLX0KLQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjpyZWZyZXNoVHlwZXMoKQotewotICAgIG1EZXZpY2VUeXBlcyA9IEFVRElPX0RFVklDRV9OT05FOwotICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBtRGV2aWNlVHlwZXMgfD0gaXRlbUF0KGkpLT5tRGV2aWNlVHlwZTsKLSAgICB9Ci0gICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6cmVmcmVzaFR5cGVzKCkgbURldmljZVR5cGVzICUwOHgiLCBtRGV2aWNlVHlwZXMpOwotfQotCi1zc2l6ZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjppbmRleE9mKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKSBjb25zdAotewotICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbS0+ZXF1YWxzKGl0ZW1BdChpKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLQotc3NpemVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6YWRkKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKQotewotICAgIHNzaXplX3QgcmV0ID0gaW5kZXhPZihpdGVtKTsKLQotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIHJldCA9IFNvcnRlZFZlY3Rvcjo6YWRkKGl0ZW0pOwotICAgICAgICBpZiAocmV0ID49IDApIHsKLSAgICAgICAgICAgIHJlZnJlc2hUeXBlcygpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1coIkRldmljZVZlY3Rvcjo6YWRkIGRldmljZSAlMDh4IGFscmVhZHkgaW4iLCBpdGVtLT5tRGV2aWNlVHlwZSk7Ci0gICAgICAgIHJldCA9IC0xOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zc2l6ZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjpyZW1vdmUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pCi17Ci0gICAgc2l6ZV90IGk7Ci0gICAgc3NpemVfdCByZXQgPSBpbmRleE9mKGl0ZW0pOwotCi0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgQUxPR1coIkRldmljZVZlY3Rvcjo6cmVtb3ZlIGRldmljZSAlMDh4IG5vdCBpbiIsIGl0ZW0tPm1EZXZpY2VUeXBlKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXQgPSBTb3J0ZWRWZWN0b3I6OnJlbW92ZUF0KHJldCk7Ci0gICAgICAgIGlmIChyZXQgPj0gMCkgewotICAgICAgICAgICAgcmVmcmVzaFR5cGVzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6bG9hZERldmljZXNGcm9tVHlwZShhdWRpb19kZXZpY2VzX3QgdHlwZXMpCi17Ci0gICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3Q7Ci0KLSAgICB1aW50MzJfdCByb2xlX2JpdCA9IEFVRElPX0RFVklDRV9CSVRfSU4gJiB0eXBlczsKLSAgICB0eXBlcyAmPSB+cm9sZV9iaXQ7Ci0KLSAgICB3aGlsZSAodHlwZXMpIHsKLSAgICAgICAgdWludDMyX3QgaSA9IDMxIC0gX19idWlsdGluX2Nseih0eXBlcyk7Ci0gICAgICAgIHVpbnQzMl90IHR5cGUgPSAxIDw8IGk7Ci0gICAgICAgIHR5cGVzICY9IH50eXBlOwotICAgICAgICBhZGQobmV3IERldmljZURlc2NyaXB0b3IoU3RyaW5nOCgiIiksIHR5cGUgfCByb2xlX2JpdCkpOwotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6bG9hZERldmljZXNGcm9tTmFtZShjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRlY2xhcmVkRGV2aWNlcykKLXsKLSAgICBjaGFyICpkZXZOYW1lID0gc3RydG9rKG5hbWUsICJ8Iik7Ci0gICAgd2hpbGUgKGRldk5hbWUgIT0gTlVMTCkgewotICAgICAgICBpZiAoc3RybGVuKGRldk5hbWUpICE9IDApIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gc3RyaW5nVG9FbnVtKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2TmFtZSk7Ci0gICAgICAgICAgICBpZiAodHlwZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldiA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgoIiIpLCB0eXBlKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVggKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRldi0+bUFkZHJlc3MgPSBTdHJpbmc4KCIwIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFkZChkZXYpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2VGcm9tTmFtZShTdHJpbmc4KGRldk5hbWUpKTsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlRGVzYyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZChkZXZpY2VEZXNjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICBkZXZOYW1lID0gc3RydG9rKE5VTEwsICJ8Iik7Ci0gICAgIH0KLX0KLQotc3A8QXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSwgU3RyaW5nOCBhZGRyZXNzKSBjb25zdAotewotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpdGVtQXQoaSktPm1EZXZpY2VUeXBlID09IHR5cGUpIHsKLSAgICAgICAgICAgIGlmIChhZGRyZXNzID09ICIiIHx8IGl0ZW1BdChpKS0+bUFkZHJlc3MgPT0gYWRkcmVzcykgewotICAgICAgICAgICAgICAgIGRldmljZSA9IGl0ZW1BdChpKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5tQWRkcmVzcyA9PSBhZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HVigiRGV2aWNlVmVjdG9yOjpnZXREZXZpY2UoKSBmb3IgdHlwZSAlMDh4IGFkZHJlc3MgJXMgZm91bmQgJXAiLAotICAgICAgICAgIHR5cGUsIGFkZHJlc3Muc3RyaW5nKCksIGRldmljZS5nZXQoKSk7Ci0gICAgcmV0dXJuIGRldmljZTsKLX0KLQotc3A8QXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlRnJvbUlkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdAotewotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIEFMT0dWKCJEZXZpY2VWZWN0b3I6OmdldERldmljZUZyb21JZCglZCkgaXRlbUF0KCV6dSktPm1JZCAlZCIsIGlkLCBpLCBpdGVtQXQoaSktPm1JZCk7Ci0gICAgICAgIGlmIChpdGVtQXQoaSktPm1JZCA9PSBpZCkgewotICAgICAgICAgICAgZGV2aWNlID0gaXRlbUF0KGkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGRldmljZTsKLX0KLQotQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3IgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlKSBjb25zdAotewotICAgIERldmljZVZlY3RvciBkZXZpY2VzOwotICAgIGJvb2wgaXNPdXRwdXQgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlcyh0eXBlKTsKLSAgICB0eXBlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyAoaSA8IHNpemUoKSkgJiYgKHR5cGUgIT0gQVVESU9fREVWSUNFX05PTkUpOyBpKyspIHsKLSAgICAgICAgYm9vbCBjdXJJc091dHB1dCA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKGl0ZW1BdChpKS0+bURldmljZVR5cGUpOwotICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyVHlwZSA9IGl0ZW1BdChpKS0+bURldmljZVR5cGUgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICAgICAgaWYgKChpc091dHB1dCA9PSBjdXJJc091dHB1dCkgJiYgKCh0eXBlICYgY3VyVHlwZSkgIT0gMCkpIHsKLSAgICAgICAgICAgIGRldmljZXMuYWRkKGl0ZW1BdChpKSk7Ci0gICAgICAgICAgICB0eXBlICY9IH5jdXJUeXBlOwotICAgICAgICAgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21UeXBlKCkgZm9yIHR5cGUgJXggZm91bmQgJXAiLAotICAgICAgICAgICAgICAgICAgaXRlbUF0KGkpLT5tRGV2aWNlVHlwZSwgaXRlbUF0KGkpLmdldCgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZGV2aWNlczsKLX0KLQotQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3IgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tVHlwZUFkZHIoCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlLCBTdHJpbmc4IGFkZHJlc3MpIGNvbnN0Ci17Ci0gICAgRGV2aWNlVmVjdG9yIGRldmljZXM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbUF0KGkpLT5tRGV2aWNlVHlwZSA9PSB0eXBlKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5tQWRkcmVzcyA9PSBhZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlcy5hZGQoaXRlbUF0KGkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZGV2aWNlczsKLX0KLQotc3A8QXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlRnJvbU5hbWUoCi0gICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUpIGNvbnN0Ci17Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGl0ZW1BdChpKS0+bU5hbWUgPT0gbmFtZSkgewotICAgICAgICAgICAgZGV2aWNlID0gaXRlbUF0KGkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGRldmljZTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0Q29uZmlnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAotewotICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgPSBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0t8QVVESU9fUE9SVF9DT05GSUdfR0FJTjsKLSAgICBpZiAoc3JjQ29uZmlnICE9IE5VTEwpIHsKLSAgICAgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayB8PSBzcmNDb25maWctPmNvbmZpZ19tYXNrOwotICAgIH0KLQotICAgIEF1ZGlvUG9ydENvbmZpZzo6dG9BdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOwotCi0gICAgZHN0Q29uZmlnLT5pZCA9IG1JZDsKLSAgICBkc3RDb25maWctPnJvbGUgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlKG1EZXZpY2VUeXBlKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX1JPTEVfU0lOSyA6IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7Ci0gICAgZHN0Q29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRTsKLSAgICBkc3RDb25maWctPmV4dC5kZXZpY2UudHlwZSA9IG1EZXZpY2VUeXBlOwotICAgIGRzdENvbmZpZy0+ZXh0LmRldmljZS5od19tb2R1bGUgPSBtTW9kdWxlLT5tSGFuZGxlOwotICAgIHN0cm5jcHkoZHN0Q29uZmlnLT5leHQuZGV2aWNlLmFkZHJlc3MsIG1BZGRyZXNzLnN0cmluZygpLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAotewotICAgIEFMT0dWKCJEZXZpY2VEZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydCgpIGhhbmRsZSAlZCB0eXBlICV4IiwgbUlkLCBtRGV2aWNlVHlwZSk7Ci0gICAgQXVkaW9Qb3J0Ojp0b0F1ZGlvUG9ydChwb3J0KTsKLSAgICBwb3J0LT5pZCA9IG1JZDsKLSAgICB0b0F1ZGlvUG9ydENvbmZpZygmcG9ydC0+YWN0aXZlX2NvbmZpZyk7Ci0gICAgcG9ydC0+ZXh0LmRldmljZS50eXBlID0gbURldmljZVR5cGU7Ci0gICAgcG9ydC0+ZXh0LmRldmljZS5od19tb2R1bGUgPSBtTW9kdWxlLT5tSGFuZGxlOwotICAgIHN0cm5jcHkocG9ydC0+ZXh0LmRldmljZS5hZGRyZXNzLCBtQWRkcmVzcy5zdHJpbmcoKSwgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTik7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlRGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0RldmljZSAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBpZiAobUlkICE9IDApIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBpZDogJTJkXG4iLCBzcGFjZXMsICIiLCBtSWQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gdHlwZTogJS00OHNcbiIsIHNwYWNlcywgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bVRvU3RyaW5nKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0RldmljZU5hbWVUb0VudW1UYWJsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VUeXBlKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIGlmIChtQWRkcmVzcy5zaXplKCkgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGFkZHJlc3M6ICUtMzJzXG4iLCBzcGFjZXMsICIiLCBtQWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgQXVkaW9Qb3J0OjpkdW1wKGZkLCBzcGFjZXMpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUGF0Y2g6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0F1ZGlvIHBhdGNoICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gaGFuZGxlOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1IYW5kbGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGF1ZGlvIGZsaW5nZXIgaGFuZGxlOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1BZlBhdGNoSGFuZGxlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBvd25lciB1aWQ6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbVVpZCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gJWQgc291cmNlczpcbiIsIHNwYWNlcywgIiIsIG1QYXRjaC5udW1fc291cmNlcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBhdGNoLm51bV9zb3VyY2VzOyBpKyspIHsKLSAgICAgICAgaWYgKG1QYXRjaC5zb3VyY2VzW2ldLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBEZXZpY2UgSUQgJWQgJXNcbiIsIHNwYWNlcyArIDIsICIiLAotICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNvdXJjZXNbaV0uaWQsIGVudW1Ub1N0cmluZyhzRGV2aWNlTmFtZVRvRW51bVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc291cmNlc1tpXS5leHQuZGV2aWNlLnR5cGUpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gTWl4IElEICVkIEkvTyBoYW5kbGUgJWRcbiIsIHNwYWNlcyArIDIsICIiLAotICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNvdXJjZXNbaV0uaWQsIG1QYXRjaC5zb3VyY2VzW2ldLmV4dC5taXguaGFuZGxlKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gJWQgc2lua3M6XG4iLCBzcGFjZXMsICIiLCBtUGF0Y2gubnVtX3NpbmtzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGF0Y2gubnVtX3NpbmtzOyBpKyspIHsKLSAgICAgICAgaWYgKG1QYXRjaC5zaW5rc1tpXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gRGV2aWNlIElEICVkICVzXG4iLCBzcGFjZXMgKyAyLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zaW5rc1tpXS5pZCwgZW51bVRvU3RyaW5nKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0RldmljZU5hbWVUb0VudW1UYWJsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zaW5rc1tpXS5leHQuZGV2aWNlLnR5cGUpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gTWl4IElEICVkIEkvTyBoYW5kbGUgJWRcbiIsIHNwYWNlcyArIDIsICIiLAotICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNpbmtzW2ldLmlkLCBtUGF0Y2guc2lua3NbaV0uZXh0Lm1peC5oYW5kbGUpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Ci0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIC0tLSBhdWRpb19wb2xpY3kuY29uZiBmaWxlIHBhcnNpbmcKLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpwYXJzZU91dHB1dEZsYWdOYW1lcyhjaGFyICpuYW1lKQotewotICAgIHVpbnQzMl90IGZsYWcgPSAwOwotCi0gICAgLy8gaXQgaXMgT0sgdG8gY2FzdCBuYW1lIHRvIG5vbiBjb25zdCBoZXJlIGFzIHdlIGFyZSBub3QgZ29pbmcgdG8gdXNlIGl0IGFmdGVyCi0gICAgLy8gc3RydG9rKCkgbW9kaWZpZXMgaXQKLSAgICBjaGFyICpmbGFnTmFtZSA9IHN0cnRvayhuYW1lLCAifCIpOwotICAgIHdoaWxlIChmbGFnTmFtZSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChzdHJsZW4oZmxhZ05hbWUpICE9IDApIHsKLSAgICAgICAgICAgIGZsYWcgfD0gc3RyaW5nVG9FbnVtKHNPdXRwdXRGbGFnTmFtZVRvRW51bVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc091dHB1dEZsYWdOYW1lVG9FbnVtVGFibGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBmbGFnTmFtZSA9IHN0cnRvayhOVUxMLCAifCIpOwotICAgIH0KLSAgICAvL2ZvcmNlIGRpcmVjdCBmbGFnIGlmIG9mZmxvYWQgZmxhZyBpcyBzZXQ6IG9mZmxvYWRpbmcgaW1wbGllcyBhIGRpcmVjdCBvdXRwdXQgc3RyZWFtCi0gICAgLy8gYW5kIGFsbCBjb21tb24gYmVoYXZpb3JzIGFyZSBkcml2ZW4gYnkgY2hlY2tpbmcgb25seSB0aGUgZGlyZWN0IGZsYWcKLSAgICAvLyB0aGlzIHNob3VsZCBub3JtYWxseSBiZSBzZXQgYXBwcm9wcmlhdGVseSBpbiB0aGUgcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZQotICAgIGlmICgoZmxhZyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKLSAgICAgICAgZmxhZyB8PSBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1Q7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZsYWc7Ci19Ci0KLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6cGFyc2VJbnB1dEZsYWdOYW1lcyhjaGFyICpuYW1lKQotewotICAgIHVpbnQzMl90IGZsYWcgPSAwOwotCi0gICAgLy8gaXQgaXMgT0sgdG8gY2FzdCBuYW1lIHRvIG5vbiBjb25zdCBoZXJlIGFzIHdlIGFyZSBub3QgZ29pbmcgdG8gdXNlIGl0IGFmdGVyCi0gICAgLy8gc3RydG9rKCkgbW9kaWZpZXMgaXQKLSAgICBjaGFyICpmbGFnTmFtZSA9IHN0cnRvayhuYW1lLCAifCIpOwotICAgIHdoaWxlIChmbGFnTmFtZSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChzdHJsZW4oZmxhZ05hbWUpICE9IDApIHsKLSAgICAgICAgICAgIGZsYWcgfD0gc3RyaW5nVG9FbnVtKHNJbnB1dEZsYWdOYW1lVG9FbnVtVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzSW5wdXRGbGFnTmFtZVRvRW51bVRhYmxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmxhZ05hbWUgPSBzdHJ0b2soTlVMTCwgInwiKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZsYWc7Ci19Ci0KLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnBhcnNlRGV2aWNlTmFtZXMoY2hhciAqbmFtZSkKLXsKLSAgICB1aW50MzJfdCBkZXZpY2UgPSAwOwotCi0gICAgY2hhciAqZGV2TmFtZSA9IHN0cnRvayhuYW1lLCAifCIpOwotICAgIHdoaWxlIChkZXZOYW1lICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKHN0cmxlbihkZXZOYW1lKSAhPSAwKSB7Ci0gICAgICAgICAgICBkZXZpY2UgfD0gc3RyaW5nVG9FbnVtKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2TmFtZSk7Ci0gICAgICAgICB9Ci0gICAgICAgIGRldk5hbWUgPSBzdHJ0b2soTlVMTCwgInwiKTsKLSAgICAgfQotICAgIHJldHVybiBkZXZpY2U7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkSHdNb2R1bGUoY25vZGUgKnJvb3QpCi17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgY25vZGUgKm5vZGU7Ci0gICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IG5ldyBId01vZHVsZShyb290LT5uYW1lKTsKLQotICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBERVZJQ0VTX1RBRyk7Ci0gICAgaWYgKG5vZGUgIT0gTlVMTCkgewotICAgICAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlKCkgbG9hZGluZyBkZXZpY2UgJXMiLCBub2RlLT5uYW1lKTsKLSAgICAgICAgICAgIHN0YXR1c190IHRtcFN0YXR1cyA9IG1vZHVsZS0+bG9hZERldmljZShub2RlKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTkFNRV9OT1RfRk9VTkQgfHwgc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gdG1wU3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIE9VVFBVVFNfVEFHKTsKLSAgICBpZiAobm9kZSAhPSBOVUxMKSB7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKLSAgICAgICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGUoKSBsb2FkaW5nIG91dHB1dCAlcyIsIG5vZGUtPm5hbWUpOwotICAgICAgICAgICAgc3RhdHVzX3QgdG1wU3RhdHVzID0gbW9kdWxlLT5sb2FkT3V0cHV0KG5vZGUpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOQU1FX05PVF9GT1VORCB8fCBzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSB0bXBTdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICAgICAgfQotICAgIH0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgSU5QVVRTX1RBRyk7Ci0gICAgaWYgKG5vZGUgIT0gTlVMTCkgewotICAgICAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlKCkgbG9hZGluZyBpbnB1dCAlcyIsIG5vZGUtPm5hbWUpOwotICAgICAgICAgICAgc3RhdHVzX3QgdG1wU3RhdHVzID0gbW9kdWxlLT5sb2FkSW5wdXQobm9kZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5BTUVfTk9UX0ZPVU5EIHx8IHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRtcFN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgICAgICB9Ci0gICAgfQotICAgIGxvYWRHbG9iYWxDb25maWcocm9vdCwgbW9kdWxlKTsKLQotICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgbUh3TW9kdWxlcy5hZGQobW9kdWxlKTsKLSAgICB9Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkSHdNb2R1bGVzKGNub2RlICpyb290KQotewotICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgQVVESU9fSFdfTU9EVUxFX1RBRyk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGVzKCkgbG9hZGluZyBtb2R1bGUgJXMiLCBub2RlLT5uYW1lKTsKLSAgICAgICAgbG9hZEh3TW9kdWxlKG5vZGUpOwotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkR2xvYmFsQ29uZmlnKGNub2RlICpyb290LCBjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSkKLXsKLSAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIEdMT0JBTF9DT05GSUdfVEFHKTsKLQotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBEZXZpY2VWZWN0b3IgZGVjbGFyZWREZXZpY2VzOwotICAgIGlmIChtb2R1bGUgIT0gTlVMTCkgewotICAgICAgICBkZWNsYXJlZERldmljZXMgPSBtb2R1bGUtPm1EZWNsYXJlZERldmljZXM7Ci0gICAgfQotCi0gICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAoQVRUQUNIRURfT1VUUFVUX0RFVklDRVNfVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5sb2FkRGV2aWNlc0Zyb21OYW1lKChjaGFyICopbm9kZS0+dmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkRGV2aWNlcyk7Ci0gICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIEF0dGFjaGVkIE91dHB1dCBEZXZpY2VzICUwOHgiLAotICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKERFRkFVTFRfT1VUUFVUX0RFVklDRV9UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KXN0cmluZ1RvRW51bShzRGV2aWNlTmFtZVRvRW51bVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0RldmljZU5hbWVUb0VudW1UYWJsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilub2RlLT52YWx1ZSk7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihTdHJpbmc4KCIiKSwgZGV2aWNlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImxvYWRHbG9iYWxDb25maWcoKSBkZWZhdWx0IGRldmljZSBub3Qgc3BlY2lmaWVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIG1EZWZhdWx0T3V0cHV0RGV2aWNlICUwOHgiLCBtRGVmYXVsdE91dHB1dERldmljZS0+bURldmljZVR5cGUpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChBVFRBQ0hFRF9JTlBVVF9ERVZJQ0VTX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgewotICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5sb2FkRGV2aWNlc0Zyb21OYW1lKChjaGFyICopbm9kZS0+dmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWREZXZpY2VzKTsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgQXZhaWxhYmxlIElucHV0RGV2aWNlcyAlMDh4IiwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoU1BFQUtFUl9EUkNfRU5BQkxFRF9UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKLSAgICAgICAgICAgIG1TcGVha2VyRHJjRW5hYmxlZCA9IHN0cmluZ1RvQm9vbCgoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgbVNwZWFrZXJEcmNFbmFibGVkID0gJWQiLCBtU3BlYWtlckRyY0VuYWJsZWQpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChBVURJT19IQUxfVkVSU0lPTl9UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKLSAgICAgICAgICAgIHVpbnQzMl90IG1ham9yLCBtaW5vcjsKLSAgICAgICAgICAgIHNzY2FuZigoY2hhciAqKW5vZGUtPnZhbHVlLCAiJXUuJXUiLCAmbWFqb3IsICZtaW5vcik7Ci0gICAgICAgICAgICBtb2R1bGUtPm1IYWxWZXJzaW9uID0gSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKG1ham9yLCBtaW5vcik7Ci0gICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIG1IYWxWZXJzaW9uID0gJTA0eCBtYWpvciAldSBtaW5vciAldSIsCi0gICAgICAgICAgICAgICAgICBtb2R1bGUtPm1IYWxWZXJzaW9uLCBtYWpvciwgbWlub3IpOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkQXVkaW9Qb2xpY3lDb25maWcoY29uc3QgY2hhciAqcGF0aCkKLXsKLSAgICBjbm9kZSAqcm9vdDsKLSAgICBjaGFyICpkYXRhOwotCi0gICAgZGF0YSA9IChjaGFyICopbG9hZF9maWxlKHBhdGgsIE5VTEwpOwotICAgIGlmIChkYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJvb3QgPSBjb25maWdfbm9kZSgiIiwgIiIpOwotICAgIGNvbmZpZ19sb2FkKHJvb3QsIGRhdGEpOwotCi0gICAgbG9hZEh3TW9kdWxlcyhyb290KTsKLSAgICAvLyBsZWdhY3kgYXVkaW9fcG9saWN5LmNvbmYgZmlsZXMgaGF2ZSBvbmUgZ2xvYmFsX2NvbmZpZ3VyYXRpb24gc2VjdGlvbgotICAgIGxvYWRHbG9iYWxDb25maWcocm9vdCwgZ2V0TW9kdWxlRnJvbU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpKTsKLSAgICBjb25maWdfZnJlZShyb290KTsKLSAgICBmcmVlKHJvb3QpOwotICAgIGZyZWUoZGF0YSk7Ci0KLSAgICBBTE9HSSgibG9hZEF1ZGlvUG9saWN5Q29uZmlnKCkgbG9hZGVkICVzXG4iLCBwYXRoKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmRlZmF1bHRBdWRpb1BvbGljeUNvbmZpZyh2b2lkKQotewotICAgIHNwPEh3TW9kdWxlPiBtb2R1bGU7Ci0gICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlOwotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRlZmF1bHRJbnB1dERldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgoIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyk7Ci0gICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuYWRkKG1EZWZhdWx0T3V0cHV0RGV2aWNlKTsKLSAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmFkZChkZWZhdWx0SW5wdXREZXZpY2UpOwotCi0gICAgbW9kdWxlID0gbmV3IEh3TW9kdWxlKCJwcmltYXJ5Iik7Ci0KLSAgICBwcm9maWxlID0gbmV3IElPUHJvZmlsZShTdHJpbmc4KCJwcmltYXJ5IiksIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIG1vZHVsZSk7Ci0gICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuYWRkKDQ0MTAwKTsKLSAgICBwcm9maWxlLT5tRm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpOwotICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3MuYWRkKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyk7Ci0gICAgcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuYWRkKG1EZWZhdWx0T3V0cHV0RGV2aWNlKTsKLSAgICBwcm9maWxlLT5tRmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZOwotICAgIG1vZHVsZS0+bU91dHB1dFByb2ZpbGVzLmFkZChwcm9maWxlKTsKLQotICAgIHByb2ZpbGUgPSBuZXcgSU9Qcm9maWxlKFN0cmluZzgoInByaW1hcnkiKSwgQVVESU9fUE9SVF9ST0xFX1NJTkssIG1vZHVsZSk7Ci0gICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuYWRkKDgwMDApOwotICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmFkZChBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7Ci0gICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5hZGQoQVVESU9fQ0hBTk5FTF9JTl9NT05PKTsKLSAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5hZGQoZGVmYXVsdElucHV0RGV2aWNlKTsKLSAgICBtb2R1bGUtPm1JbnB1dFByb2ZpbGVzLmFkZChwcm9maWxlKTsKLQotICAgIG1Id01vZHVsZXMuYWRkKG1vZHVsZSk7Ci19Ci0KLWF1ZGlvX3N0cmVhbV90eXBlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKQotewotICAgIC8vIGZsYWdzIHRvIHN0cmVhbSB0eXBlIG1hcHBpbmcKLSAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSA9PSBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFOwotICAgIH0KLSAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19TQ08pID09IEFVRElPX0ZMQUdfU0NPKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTzsKLSAgICB9Ci0gICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfQkVBQ09OKSA9PSBBVURJT19GTEFHX0JFQUNPTikgewotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1RUUzsKLSAgICB9Ci0KLSAgICAvLyB1c2FnZSB0byBzdHJlYW0gdHlwZSBtYXBwaW5nCi0gICAgc3dpdGNoIChhdHRyLT51c2FnZSkgewotICAgIGNhc2UgQVVESU9fVVNBR0VfTUVESUE6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9HQU1FOgotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOwotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgotICAgICAgICBpZiAoaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX0FMQVJNKSkgewotICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BTEFSTTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX1JJTkcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1JJTkc7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzSW5DYWxsKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFk7Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9TWVNURU07Ci0gICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9EVE1GOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9BTEFSTToKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BTEFSTTsKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fUklORzsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfVU5LTk9XTjoKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOwotICAgIH0KLX0KLQotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzVmFsaWRBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqcGFhKSB7Ci0gICAgLy8gaGFzIGZsYWdzIHRoYXQgbWFwIHRvIGEgc3RyYXRlZ3k/Ci0gICAgaWYgKChwYWEtPmZsYWdzICYgKEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCB8IEFVRElPX0ZMQUdfU0NPIHwgQVVESU9fRkxBR19CRUFDT04pKSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vIGhhcyBrbm93biB1c2FnZT8KLSAgICBzd2l0Y2ggKHBhYS0+dXNhZ2UpIHsKLSAgICBjYXNlIEFVRElPX1VTQUdFX1VOS05PV046Ci0gICAgY2FzZSBBVURJT19VU0FHRV9NRURJQToKLSAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046Ci0gICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BTEFSTToKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTjoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKLSAgICBjYXNlIEFVRElPX1VTQUdFX0dBTUU6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRToKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5TWFuYWdlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lNYW5hZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZGFmYTYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lNYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbWlzYy5oPgotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KLSNpbmNsdWRlICJBdWRpb1BvbGljeUludGVyZmFjZS5oIgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBBdHRlbnVhdGlvbiBhcHBsaWVkIHRvIFNUUkFURUdZX1NPTklGSUNBVElPTiBzdHJlYW1zIHdoZW4gYSBoZWFkc2V0IGlzIGNvbm5lY3RlZDogNmRCCi0jZGVmaW5lIFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9GQUNUT1IgMC41Ci0vLyBNaW4gdm9sdW1lIGZvciBTVFJBVEVHWV9TT05JRklDQVRJT04gc3RyZWFtcyB3aGVuIGxpbWl0ZWQgYnkgbXVzaWMgdm9sdW1lOiAtMzZkQgotI2RlZmluZSBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfTUlOICAwLjAxNgotLy8gVGltZSBpbiBtaWxsaXNlY29uZHMgZHVyaW5nIHdoaWNoIHdlIGNvbnNpZGVyIHRoYXQgbXVzaWMgaXMgc3RpbGwgYWN0aXZlIGFmdGVyIGEgbXVzaWMKLS8vIHRyYWNrIHdhcyBzdG9wcGVkIC0gc2VlIGNvbXB1dGVWb2x1bWUoKQotI2RlZmluZSBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSAgNTAwMAotLy8gVGltZSBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgbWVkaWEgc3RvcHBlZCBwbGF5aW5nIGR1cmluZyB3aGljaCB3ZSBjb25zaWRlciB0aGF0IHRoZQotLy8gc29uaWZpY2F0aW9uIHNob3VsZCBiZSBhcyB1bm9idHJ1c2l2ZSBhcyBkdXJpbmcgdGhlIHRpbWUgbWVkaWEgd2FzIHBsYXlpbmcuCi0jZGVmaW5lIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZIDUwMDAKLS8vIFRpbWUgaW4gbWlsbGlzZWNvbmRzIGR1cmluZyB3aXRjaCBzb21lIHN0cmVhbXMgYXJlIG11dGVkIHdoaWxlIHRoZSBhdWRpbyBwYXRoCi0vLyBpcyBzd2l0Y2hlZAotI2RlZmluZSBNVVRFX1RJTUVfTVMgMjAwMAotCi0jZGVmaW5lIE5VTV9URVNUX09VVFBVVFMgNQotCi0jZGVmaW5lIE5VTV9WT0xfQ1VSVkVfS05FRVMgMgotCi0vLyBEZWZhdWx0IG1pbmltdW0gbGVuZ3RoIGFsbG93ZWQgZm9yIG9mZmxvYWRpbmcgYSBjb21wcmVzc2VkIHRyYWNrCi0vLyBDYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2VjcyBwcm9wZXJ0eQotI2RlZmluZSBPRkZMT0FEX0RFRkFVTFRfTUlOX0RVUkFUSU9OX1NFQ1MgNjAKLQotI2RlZmluZSBNQVhfTUlYRVJfU0FNUExJTkdfUkFURSA0ODAwMAotI2RlZmluZSBNQVhfTUlYRVJfQ0hBTk5FTF9DT1VOVCA4Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEF1ZGlvUG9saWN5TWFuYWdlciBpbXBsZW1lbnRzIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGJlaGF2aW9yIGNvbW1vbiB0byBhbGwgcGxhdGZvcm1zLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBBdWRpb1BvbGljeU1hbmFnZXI6IHB1YmxpYyBBdWRpb1BvbGljeUludGVyZmFjZQotI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCi0gICAgLCBwdWJsaWMgVGhyZWFkCi0jZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotewotCi1wdWJsaWM6Ci0gICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwotICAgICAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeU1hbmFnZXIoKTsKLQotICAgICAgICAvLyBBdWRpb1BvbGljeUludGVyZmFjZQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7Ci0gICAgICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpOwotICAgICAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIHNldFN5c3RlbVByb3BlcnR5KGNvbnN0IGNoYXIqIHByb3BlcnR5LCBjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7Ci0gICAgICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF90eXBlX3QgKmlucHV0VHlwZSk7Ci0KLSAgICAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdGFydHMgYmVpbmcgdXNlZC4KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotCi0gICAgICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RvcHMgYmVpbmcgdXNlZC4KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBjbG9zZUFsbElucHV0cygpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKLQotICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBzdHJlYW0gdHlwZQotICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICAgICAgLy8gcmV0dXJuIHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzCi0gICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cik7Ci0KLSAgICAgICAgLy8gcmV0dXJuIHRoZSBlbmFibGVkIG91dHB1dCBkZXZpY2VzIGZvciB0aGUgZ2l2ZW4gc3RyZWFtIHR5cGUKLSAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0KLSAgICAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYyA9IE5VTEwpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCk7Ci0KLSAgICAgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OwotICAgICAgICAvLyByZXR1cm4gd2hldGhlciBhIHN0cmVhbSBpcyBwbGF5aW5nIHJlbW90ZWx5LCBvdmVycmlkZSB0byBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YKLSAgICAgICAgLy8gICBsb2NhbC9yZW1vdGUgcGxheWJhY2ssIHVzZWQgZm9yIGluc3RhbmNlIGJ5IG5vdGlmaWNhdGlvbiBtYW5hZ2VyIHRvIG5vdCBtYWtlCi0gICAgICAgIC8vICAgbWVkaWEgcGxheWVycyBsb3NlIGF1ZGlvIGZvY3VzIHdoZW4gbm90IHBsYXlpbmcgbG9jYWxseQotICAgICAgICAvLyAgIEZvciB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbiwgInJlbW90ZWx5IiBtZWFucyBwbGF5aW5nIGR1cmluZyBzY3JlZW4gbWlycm9yaW5nIHdoaWNoCi0gICAgICAgIC8vICAgdXNlcyBhbiBvdXRwdXQgZm9yIHBsYXliYWNrIHdpdGggYSBub24tZW1wdHksIG5vbiAiMCIgYWRkcmVzcy4KLSAgICAgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBpc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0OwotCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCBpc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIG9mZmxvYWRJbmZvKTsKLQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgY2xlYXJBdWRpb1BhdGNoZXModWlkX3QgdWlkKTsKLQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSk7Ci0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlclBvbGljeU1peGVzKFZlY3RvcjxBdWRpb01peD4gbWl4ZXMpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHVucmVnaXN0ZXJQb2xpY3lNaXhlcyhWZWN0b3I8QXVkaW9NaXg+IG1peGVzKTsKLQotcHJvdGVjdGVkOgotCi0gICAgICAgIGVudW0gcm91dGluZ19zdHJhdGVneSB7Ci0gICAgICAgICAgICBTVFJBVEVHWV9NRURJQSwKLSAgICAgICAgICAgIFNUUkFURUdZX1BIT05FLAotICAgICAgICAgICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OLAotICAgICAgICAgICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwsCi0gICAgICAgICAgICBTVFJBVEVHWV9EVE1GLAotICAgICAgICAgICAgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwKLSAgICAgICAgICAgIFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUiwKLSAgICAgICAgICAgIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFksCi0gICAgICAgICAgICBTVFJBVEVHWV9SRVJPVVRJTkcsCi0gICAgICAgICAgICBOVU1fU1RSQVRFR0lFUwotICAgICAgICB9OwotCi0gICAgICAgIC8vIDQgcG9pbnRzIHRvIGRlZmluZSB0aGUgdm9sdW1lIGF0dGVudWF0aW9uIGN1cnZlLCBlYWNoIGNoYXJhY3Rlcml6ZWQgYnkgdGhlIHZvbHVtZQotICAgICAgICAvLyBpbmRleCAoZnJvbSAwIHRvIDEwMCkgYXQgd2hpY2ggdGhleSBhcHBseSwgYW5kIHRoZSBhdHRlbnVhdGlvbiBpbiBkQiBhdCB0aGF0IGluZGV4LgotICAgICAgICAvLyB3ZSB1c2UgMTAwIHN0ZXBzIHRvIGF2b2lkIHJvdW5kaW5nIGVycm9ycyB3aGVuIGNvbXB1dGluZyB0aGUgdm9sdW1lIGluIHZvbEluZGV4VG9BbXBsKCkKLQotICAgICAgICBlbnVtIHsgVk9MTUlOID0gMCwgVk9MS05FRTEgPSAxLCBWT0xLTkVFMiA9IDIsIFZPTE1BWCA9IDMsIFZPTENOVCA9IDR9OwotCi0gICAgICAgIGNsYXNzIFZvbHVtZUN1cnZlUG9pbnQKLSAgICAgICAgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBpbnQgbUluZGV4OwotICAgICAgICAgICAgZmxvYXQgbURCQXR0ZW51YXRpb247Ci0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gZGV2aWNlIGNhdGVnb3JpZXMgdXNlZCBmb3Igdm9sdW1lIGN1cnZlIG1hbmFnZW1lbnQuCi0gICAgICAgIGVudW0gZGV2aWNlX2NhdGVnb3J5IHsKLSAgICAgICAgICAgIERFVklDRV9DQVRFR09SWV9IRUFEU0VULAotICAgICAgICAgICAgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCi0gICAgICAgICAgICBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UsCi0gICAgICAgICAgICBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBLAotICAgICAgICAgICAgREVWSUNFX0NBVEVHT1JZX0NOVAotICAgICAgICB9OwotCi0gICAgICAgIGNsYXNzIEh3TW9kdWxlOwotCi0gICAgICAgIGNsYXNzIEF1ZGlvR2FpbjogcHVibGljIFJlZkJhc2UKLSAgICAgICAgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBBdWRpb0dhaW4oaW50IGluZGV4LCBib29sIHVzZUluQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgdmlydHVhbCB+QXVkaW9HYWluKCkge30KLQotICAgICAgICAgICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKLQotICAgICAgICAgICAgdm9pZCBnZXREZWZhdWx0Q29uZmlnKHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqY29uZmlnKTsKLSAgICAgICAgICAgIHN0YXR1c190IGNoZWNrQ29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqY29uZmlnKTsKLSAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIG1JbmRleDsKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19nYWluIG1HYWluOwotICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgbVVzZUluQ2hhbm5lbE1hc2s7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgY2xhc3MgQXVkaW9Qb3J0OiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCi0gICAgICAgIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgQXVkaW9Qb3J0KGNvbnN0IFN0cmluZzgmIG5hbWUsIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwgY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpOwotICAgICAgICAgICAgdmlydHVhbCB+QXVkaW9Qb3J0KCkge30KLQotICAgICAgICAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKLQotICAgICAgICAgICAgdm9pZCBpbXBvcnRBdWRpb1BvcnQoY29uc3Qgc3A8QXVkaW9Qb3J0PiBwb3J0KTsKLSAgICAgICAgICAgIHZvaWQgY2xlYXJDYXBhYmlsaXRpZXMoKTsKLQotICAgICAgICAgICAgdm9pZCBsb2FkU2FtcGxpbmdSYXRlcyhjaGFyICpuYW1lKTsKLSAgICAgICAgICAgIHZvaWQgbG9hZEZvcm1hdHMoY2hhciAqbmFtZSk7Ci0gICAgICAgICAgICB2b2lkIGxvYWRPdXRDaGFubmVscyhjaGFyICpuYW1lKTsKLSAgICAgICAgICAgIHZvaWQgbG9hZEluQ2hhbm5lbHMoY2hhciAqbmFtZSk7Ci0KLSAgICAgICAgICAgIGF1ZGlvX2dhaW5fbW9kZV90IGxvYWRHYWluTW9kZShjaGFyICpuYW1lKTsKLSAgICAgICAgICAgIHZvaWQgbG9hZEdhaW4oY25vZGUgKnJvb3QsIGludCBpbmRleCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbG9hZEdhaW5zKGNub2RlICpyb290KTsKLQotICAgICAgICAgICAgLy8gc2VhcmNoZXMgZm9yIGFuIGV4YWN0IG1hdGNoCi0gICAgICAgICAgICBzdGF0dXNfdCBjaGVja0V4YWN0U2FtcGxpbmdSYXRlKHVpbnQzMl90IHNhbXBsaW5nUmF0ZSkgY29uc3Q7Ci0gICAgICAgICAgICAvLyBzZWFyY2hlcyBmb3IgYSBjb21wYXRpYmxlIG1hdGNoLCBhbmQgcmV0dXJucyB0aGUgYmVzdCBtYXRjaCB2aWEgdXBkYXRlZFNhbXBsaW5nUmF0ZQotICAgICAgICAgICAgc3RhdHVzX3QgY2hlY2tDb21wYXRpYmxlU2FtcGxpbmdSYXRlKHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnVwZGF0ZWRTYW1wbGluZ1JhdGUpIGNvbnN0OwotICAgICAgICAgICAgLy8gc2VhcmNoZXMgZm9yIGFuIGV4YWN0IG1hdGNoCi0gICAgICAgICAgICBzdGF0dXNfdCBjaGVja0V4YWN0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIGNvbnN0OwotICAgICAgICAgICAgLy8gc2VhcmNoZXMgZm9yIGEgY29tcGF0aWJsZSBtYXRjaCwgY3VycmVudGx5IGltcGxlbWVudGVkIGZvciBpbnB1dCBjaGFubmVsIG1hc2tzIG9ubHkKLSAgICAgICAgICAgIHN0YXR1c190IGNoZWNrQ29tcGF0aWJsZUNoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSBjb25zdDsKLSAgICAgICAgICAgIHN0YXR1c190IGNoZWNrRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7Ci0gICAgICAgICAgICBzdGF0dXNfdCBjaGVja0dhaW4oY29uc3Qgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpnYWluQ29uZmlnLCBpbnQgaW5kZXgpIGNvbnN0OwotCi0gICAgICAgICAgICB1aW50MzJfdCBwaWNrU2FtcGxpbmdSYXRlKCkgY29uc3Q7Ci0gICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBwaWNrQ2hhbm5lbE1hc2soKSBjb25zdDsKLSAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IHBpY2tGb3JtYXQoKSBjb25zdDsKLQotICAgICAgICAgICAgc3RhdGljIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IHNQY21Gb3JtYXRDb21wYXJlVGFibGVbXTsKLSAgICAgICAgICAgIHN0YXRpYyBpbnQgY29tcGFyZUZvcm1hdHMoYXVkaW9fZm9ybWF0X3QgZm9ybWF0MSwgYXVkaW9fZm9ybWF0X3QgZm9ybWF0Mik7Ci0KLSAgICAgICAgICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0OwotCi0gICAgICAgICAgICBTdHJpbmc4ICAgICAgICAgICBtTmFtZTsKLSAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IG1UeXBlOwotICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3QgbVJvbGU7Ci0gICAgICAgICAgICBib29sICAgICAgICAgICAgICBtVXNlSW5DaGFubmVsTWFzazsKLSAgICAgICAgICAgIC8vIGJ5IGNvbnZlbnRpb24sICIwJyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gbVNhbXBsaW5nUmF0ZXMsIG1DaGFubmVsTWFza3Mgb3IgbUZvcm1hdHMKLSAgICAgICAgICAgIC8vIGluZGljYXRlcyB0aGUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgc2hvdWxkIGJlIHJlYWQgZnJvbSB0aGUgb3V0cHV0IHN0cmVhbQotICAgICAgICAgICAgLy8gYWZ0ZXIgaXQgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZQotICAgICAgICAgICAgVmVjdG9yIDx1aW50MzJfdD4gbVNhbXBsaW5nUmF0ZXM7IC8vIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcwotICAgICAgICAgICAgVmVjdG9yIDxhdWRpb19jaGFubmVsX21hc2tfdD4gbUNoYW5uZWxNYXNrczsgLy8gc3VwcG9ydGVkIGNoYW5uZWwgbWFza3MKLSAgICAgICAgICAgIFZlY3RvciA8YXVkaW9fZm9ybWF0X3Q+IG1Gb3JtYXRzOyAvLyBzdXBwb3J0ZWQgYXVkaW8gZm9ybWF0cwotICAgICAgICAgICAgVmVjdG9yIDwgc3A8QXVkaW9HYWluPiA+IG1HYWluczsgLy8gZ2FpbiBjb250cm9sbGVycwotICAgICAgICAgICAgc3A8SHdNb2R1bGU+IG1Nb2R1bGU7ICAgICAgICAgICAgICAgICAvLyBhdWRpbyBIVyBtb2R1bGUgZXhwb3NpbmcgdGhpcyBJL08gc3RyZWFtCi0gICAgICAgICAgICB1aW50MzJfdCBtRmxhZ3M7IC8vIGF0dHJpYnV0ZSBmbGFncyAoZS5nIHByaW1hcnkgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlyZWN0IG91dHB1dC4uLikuCi0gICAgICAgIH07Ci0KLSAgICAgICAgY2xhc3MgQXVkaW9Qb3J0Q29uZmlnOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCi0gICAgICAgIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgQXVkaW9Qb3J0Q29uZmlnKCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIH5BdWRpb1BvcnRDb25maWcoKSB7fQotCi0gICAgICAgICAgICBzdGF0dXNfdCBhcHBseUF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqYmFja3VwQ29uZmlnID0gTlVMTCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3QgPSAwOwotICAgICAgICAgICAgdmlydHVhbCBzcDxBdWRpb1BvcnQ+IGdldEF1ZGlvUG9ydCgpIGNvbnN0ID0gMDsKLSAgICAgICAgICAgIHVpbnQzMl90IG1TYW1wbGluZ1JhdGU7Ci0gICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBtRm9ybWF0OwotICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbUNoYW5uZWxNYXNrOwotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnIG1HYWluOwotICAgICAgICB9OwotCi0KLSAgICAgICAgY2xhc3MgQXVkaW9QYXRjaDogcHVibGljIFJlZkJhc2UKLSAgICAgICAgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwgdWlkX3QgdWlkKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlKGhhbmRsZSksIG1QYXRjaCgqcGF0Y2gpLCBtVWlkKHVpZCksIG1BZlBhdGNoSGFuZGxlKDApIHt9Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OwotCi0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtSGFuZGxlOwotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIG1QYXRjaDsKLSAgICAgICAgICAgIHVpZF90IG1VaWQ7Ci0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtQWZQYXRjaEhhbmRsZTsKLSAgICAgICAgfTsKLQotICAgICAgICBjbGFzcyBEZXZpY2VEZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9Qb3J0LCBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnCi0gICAgICAgIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgRGV2aWNlRGVzY3JpcHRvcihjb25zdCBTdHJpbmc4JiBuYW1lLCBhdWRpb19kZXZpY2VzX3QgdHlwZSk7Ci0KLSAgICAgICAgICAgIHZpcnR1YWwgfkRldmljZURlc2NyaXB0b3IoKSB7fQotCi0gICAgICAgICAgICBib29sIGVxdWFscyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgb3RoZXIpIGNvbnN0OwotCi0gICAgICAgICAgICAvLyBBdWRpb1BvcnRDb25maWcKLSAgICAgICAgICAgIHZpcnR1YWwgc3A8QXVkaW9Qb3J0PiBnZXRBdWRpb1BvcnQoKSBjb25zdCB7IHJldHVybiAoQXVkaW9Qb3J0KikgdGhpczsgfQotICAgICAgICAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0OwotCi0gICAgICAgICAgICAvLyBBdWRpb1BvcnQKLSAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBsb2FkR2FpbnMoY25vZGUgKnJvb3QpOwotICAgICAgICAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7Ci0KLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlVHlwZTsKLSAgICAgICAgICAgIFN0cmluZzggbUFkZHJlc3M7Ci0gICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1JZDsKLSAgICAgICAgfTsKLQotICAgICAgICBjbGFzcyBEZXZpY2VWZWN0b3IgOiBwdWJsaWMgU29ydGVkVmVjdG9yPCBzcDxEZXZpY2VEZXNjcmlwdG9yPiA+Ci0gICAgICAgIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgRGV2aWNlVmVjdG9yKCkgOiBTb3J0ZWRWZWN0b3IoKSwgbURldmljZVR5cGVzKEFVRElPX0RFVklDRV9OT05FKSB7fQotCi0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgYWRkKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKTsKLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICByZW1vdmUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pOwotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIGluZGV4T2YoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pIGNvbnN0OwotCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZXMoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlVHlwZXM7IH0KLQotICAgICAgICAgICAgdm9pZCBsb2FkRGV2aWNlc0Zyb21UeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlcyk7Ci0gICAgICAgICAgICB2b2lkIGxvYWREZXZpY2VzRnJvbU5hbWUoY2hhciAqbmFtZSwgY29uc3QgRGV2aWNlVmVjdG9yJiBkZWNsYXJlZERldmljZXMpOwotCi0gICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2UoYXVkaW9fZGV2aWNlc190IHR5cGUsIFN0cmluZzggYWRkcmVzcykgY29uc3Q7Ci0gICAgICAgICAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0Zyb21UeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlcykgY29uc3Q7Ci0gICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3Q7Ci0gICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VGcm9tTmFtZShjb25zdCBTdHJpbmc4JiBuYW1lKSBjb25zdDsKLSAgICAgICAgICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRnJvbVR5cGVBZGRyKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBTdHJpbmc4IGFkZHJlc3MpCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0OwotCi0gICAgICAgIHByaXZhdGU6Ci0gICAgICAgICAgICB2b2lkIHJlZnJlc2hUeXBlcygpOwotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2VUeXBlczsKLSAgICAgICAgfTsKLQotICAgICAgICAvLyB0aGUgSU9Qcm9maWxlIGNsYXNzIGRlc2NyaWJlcyB0aGUgY2FwYWJpbGl0aWVzIG9mIGFuIG91dHB1dCBvciBpbnB1dCBzdHJlYW0uCi0gICAgICAgIC8vIEl0IGlzIGN1cnJlbnRseSBhc3N1bWVkIHRoYXQgYWxsIGNvbWJpbmF0aW9uIG9mIGxpc3RlZCBwYXJhbWV0ZXJzIGFyZSBzdXBwb3J0ZWQuCi0gICAgICAgIC8vIEl0IGlzIHVzZWQgYnkgdGhlIHBvbGljeSBtYW5hZ2VyIHRvIGRldGVybWluZSBpZiBhbiBvdXRwdXQgb3IgaW5wdXQgaXMgc3VpdGFibGUgZm9yCi0gICAgICAgIC8vIGEgZ2l2ZW4gdXNlIGNhc2UsICBvcGVuL2Nsb3NlIGl0IGFjY29yZGluZ2x5IGFuZCBjb25uZWN0L2Rpc2Nvbm5lY3QgYXVkaW8gdHJhY2tzCi0gICAgICAgIC8vIHRvL2Zyb20gaXQuCi0gICAgICAgIGNsYXNzIElPUHJvZmlsZSA6IHB1YmxpYyBBdWRpb1BvcnQKLSAgICAgICAgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBJT1Byb2ZpbGUoY29uc3QgU3RyaW5nOCYgbmFtZSwgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwgY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpOwotICAgICAgICAgICAgdmlydHVhbCB+SU9Qcm9maWxlKCk7Ci0KLSAgICAgICAgICAgIC8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIGJvdGggb3V0cHV0IGFuZCBpbnB1dC4KLSAgICAgICAgICAgIC8vIElmIHBhcmFtZXRlciB1cGRhdGVkU2FtcGxpbmdSYXRlIGlzIG5vbi1OVUxMLCBpdCBpcyBhc3NpZ25lZCB0aGUgYWN0dWFsIHNhbXBsZSByYXRlLgotICAgICAgICAgICAgLy8gRm9yIGlucHV0LCBmbGFncyBpcyBpbnRlcnByZXRlZCBhcyBhdWRpb19pbnB1dF9mbGFnc190LgotICAgICAgICAgICAgLy8gVE9ETzogbWVyZ2UgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgYW5kIGF1ZGlvX2lucHV0X2ZsYWdzX3QuCi0gICAgICAgICAgICBib29sIGlzQ29tcGF0aWJsZVByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICp1cGRhdGVkU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncykgY29uc3Q7Ci0KLSAgICAgICAgICAgIHZvaWQgZHVtcChpbnQgZmQpOwotICAgICAgICAgICAgdm9pZCBsb2coKTsKLQotICAgICAgICAgICAgRGV2aWNlVmVjdG9yICBtU3VwcG9ydGVkRGV2aWNlczsgLy8gc3VwcG9ydGVkIGRldmljZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChkZXZpY2VzIHRoaXMgb3V0cHV0IGNhbiBiZSByb3V0ZWQgdG8pCi0gICAgICAgIH07Ci0KLSAgICAgICAgY2xhc3MgSHdNb2R1bGUgOiBwdWJsaWMgUmVmQmFzZQotICAgICAgICB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgSHdNb2R1bGUoY29uc3QgY2hhciAqbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH5Id01vZHVsZSgpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBsb2FkT3V0cHV0KGNub2RlICpyb290KTsKLSAgICAgICAgICAgIHN0YXR1c190IGxvYWRJbnB1dChjbm9kZSAqcm9vdCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBsb2FkRGV2aWNlKGNub2RlICpyb290KTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgYWRkT3V0cHV0UHJvZmlsZShTdHJpbmc4IG5hbWUsIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIFN0cmluZzggYWRkcmVzcyk7Ci0gICAgICAgICAgICBzdGF0dXNfdCByZW1vdmVPdXRwdXRQcm9maWxlKFN0cmluZzggbmFtZSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBhZGRJbnB1dFByb2ZpbGUoU3RyaW5nOCBuYW1lLCBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBTdHJpbmc4IGFkZHJlc3MpOwotICAgICAgICAgICAgc3RhdHVzX3QgcmVtb3ZlSW5wdXRQcm9maWxlKFN0cmluZzggbmFtZSk7Ci0KLSAgICAgICAgICAgIHZvaWQgZHVtcChpbnQgZmQpOwotCi0gICAgICAgICAgICBjb25zdCBjaGFyICpjb25zdCAgICAgICAgbU5hbWU7IC8vIGJhc2UgbmFtZSBvZiB0aGUgYXVkaW8gSFcgbW9kdWxlIChwcmltYXJ5LCBhMmRwIC4uLikKLSAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBtSGFsVmVyc2lvbjsgLy8gYXVkaW8gSEFMIEFQSSB2ZXJzaW9uCi0gICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgICAgbUhhbmRsZTsKLSAgICAgICAgICAgIFZlY3RvciA8IHNwPElPUHJvZmlsZT4gPiBtT3V0cHV0UHJvZmlsZXM7IC8vIG91dHB1dCBwcm9maWxlcyBleHBvc2VkIGJ5IHRoaXMgbW9kdWxlCi0gICAgICAgICAgICBWZWN0b3IgPCBzcDxJT1Byb2ZpbGU+ID4gbUlucHV0UHJvZmlsZXM7ICAvLyBpbnB1dCBwcm9maWxlcyBleHBvc2VkIGJ5IHRoaXMgbW9kdWxlCi0gICAgICAgICAgICBEZXZpY2VWZWN0b3IgICAgICAgICAgICAgbURlY2xhcmVkRGV2aWNlczsgLy8gZGV2aWNlcyBkZWNsYXJlZCBpbiBhdWRpb19wb2xpY3kuY29uZgotCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gZGVmYXVsdCB2b2x1bWUgY3VydmUKLSAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07Ci0gICAgICAgIC8vIGRlZmF1bHQgdm9sdW1lIGN1cnZlIGZvciBtZWRpYSBzdHJhdGVneQotICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOwotICAgICAgICAvLyB2b2x1bWUgY3VydmUgZm9yIG5vbi1tZWRpYSBhdWRpbyBvbiBleHQgbWVkaWEgb3V0cHV0cyAoSERNSSwgTGluZSwgZXRjKQotICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07Ci0gICAgICAgIC8vIHZvbHVtZSBjdXJ2ZSBmb3IgbWVkaWEgc3RyYXRlZ3kgb24gc3BlYWtlcnMKLSAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlRHJjW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKLSAgICAgICAgLy8gdm9sdW1lIGN1cnZlIGZvciBzb25pZmljYXRpb24gc3RyYXRlZ3kgb24gc3BlYWtlcnMKLSAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07Ci0gICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmNbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOwotICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZURyY1tBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07Ci0gICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOwotICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOwotICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOwotICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzTGluZWFyVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOwotICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU2lsZW50Vm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOwotICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRnVsbFNjYWxlVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOwotICAgICAgICAvLyBkZWZhdWx0IHZvbHVtZSBjdXJ2ZXMgcGVyIHN0cmVhbSBhbmQgZGV2aWNlIGNhdGVnb3J5LiBTZWUgaW5pdGlhbGl6ZVZvbHVtZUN1cnZlcygpCi0gICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpzVm9sdW1lUHJvZmlsZXNbQVVESU9fU1RSRUFNX0NOVF1bREVWSUNFX0NBVEVHT1JZX0NOVF07Ci0KLSAgICAgICAgLy8gZGVzY3JpcHRvciBmb3IgYXVkaW8gb3V0cHV0cy4gVXNlZCB0byBtYWludGFpbiBjdXJyZW50IGNvbmZpZ3VyYXRpb24gb2YgZWFjaCBvcGVuZWQgYXVkaW8gb3V0cHV0Ci0gICAgICAgIC8vIGFuZCBrZWVwIHRyYWNrIG9mIHRoZSB1c2FnZSBvZiB0aGlzIG91dHB1dCBieSBlYWNoIGF1ZGlvIHN0cmVhbSB0eXBlLgotICAgICAgICBjbGFzcyBBdWRpb091dHB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb1BvcnRDb25maWcKLSAgICAgICAgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8SU9Qcm9maWxlPiYgcHJvZmlsZSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKLQotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSgpIGNvbnN0OwotICAgICAgICAgICAgdm9pZCBjaGFuZ2VSZWZDb3VudChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGRlbHRhKTsKLQotICAgICAgICAgICAgYm9vbCBpc0R1cGxpY2F0ZWQoKSBjb25zdCB7IHJldHVybiAobU91dHB1dDEgIT0gTlVMTCAmJiBtT3V0cHV0MiAhPSBOVUxMKTsgfQotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHN1cHBvcnRlZERldmljZXMoKTsKLSAgICAgICAgICAgIHVpbnQzMl90IGxhdGVuY3koKTsKLSAgICAgICAgICAgIGJvb2wgc2hhcmVzSHdNb2R1bGVXaXRoKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyk7Ci0gICAgICAgICAgICBib29sIGlzQWN0aXZlKHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7Ci0gICAgICAgICAgICBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0OwotICAgICAgICAgICAgYm9vbCBpc1N0cmF0ZWd5QWN0aXZlKHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lID0gMCkgY29uc3Q7Ci0KLSAgICAgICAgICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKLSAgICAgICAgICAgIHZpcnR1YWwgc3A8QXVkaW9Qb3J0PiBnZXRBdWRpb1BvcnQoKSBjb25zdCB7IHJldHVybiBtUHJvZmlsZTsgfQotICAgICAgICAgICAgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3Q7Ci0KLSAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbUlkOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlvSGFuZGxlOyAgICAgICAgICAgICAgLy8gb3V0cHV0IGhhbmRsZQotICAgICAgICAgICAgdWludDMyX3QgbUxhdGVuY3k7ICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG1GbGFnczsgICAvLwotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2U7ICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgZGV2aWNlIHRoaXMgb3V0cHV0IGlzIHJvdXRlZCB0bwotICAgICAgICAgICAgQXVkaW9NaXggKm1Qb2xpY3lNaXg7ICAgICAgICAgICAgIC8vIG5vbiBOVUxMIHdoZW4gdXNlZCBieSBhIGR5bmFtaWMgcG9saWN5Ci0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICB1aW50MzJfdCBtUmVmQ291bnRbQVVESU9fU1RSRUFNX0NOVF07IC8vIG51bWJlciBvZiBzdHJlYW1zIG9mIGVhY2ggdHlwZSB1c2luZyB0aGlzIG91dHB1dAotICAgICAgICAgICAgbnNlY3NfdCBtU3RvcFRpbWVbQVVESU9fU1RSRUFNX0NOVF07Ci0gICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG1PdXRwdXQxOyAgICAvLyB1c2VkIGJ5IGR1cGxpY2F0ZWQgb3V0cHV0czogZmlyc3Qgb3V0cHV0Ci0gICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG1PdXRwdXQyOyAgICAvLyB1c2VkIGJ5IGR1cGxpY2F0ZWQgb3V0cHV0czogc2Vjb25kIG91dHB1dAotICAgICAgICAgICAgZmxvYXQgbUN1clZvbHVtZVtBVURJT19TVFJFQU1fQ05UXTsgICAvLyBjdXJyZW50IHN0cmVhbSB2b2x1bWUKLSAgICAgICAgICAgIGludCBtTXV0ZUNvdW50W0FVRElPX1NUUkVBTV9DTlRdOyAgICAgLy8gbXV0ZSByZXF1ZXN0IGNvdW50ZXIKLSAgICAgICAgICAgIGNvbnN0IHNwPElPUHJvZmlsZT4gbVByb2ZpbGU7ICAgICAgICAgIC8vIEkvTyBwcm9maWxlIHRoaXMgb3V0cHV0IGRlcml2ZXMgZnJvbQotICAgICAgICAgICAgYm9vbCBtU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW05VTV9TVFJBVEVHSUVTXTsgLy8gc3RyYXRlZ2llcyBtdXRlZCBiZWNhdXNlIG9mIGluY29tcGF0aWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV2aWNlIHNlbGVjdGlvbi4gU2VlIGNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoKQotICAgICAgICAgICAgdWludDMyX3QgbURpcmVjdE9wZW5Db3VudDsgLy8gbnVtYmVyIG9mIGNsaWVudHMgdXNpbmcgdGhpcyBvdXRwdXQgKGRpcmVjdCBvdXRwdXRzIG9ubHkpCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gZGVzY3JpcHRvciBmb3IgYXVkaW8gaW5wdXRzLiBVc2VkIHRvIG1haW50YWluIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvZiBlYWNoIG9wZW5lZCBhdWRpbyBpbnB1dAotICAgICAgICAvLyBhbmQga2VlcCB0cmFjayBvZiB0aGUgdXNhZ2Ugb2YgdGhpcyBpbnB1dC4KLSAgICAgICAgY2xhc3MgQXVkaW9JbnB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb1BvcnRDb25maWcKLSAgICAgICAgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBBdWRpb0lucHV0RGVzY3JpcHRvcihjb25zdCBzcDxJT1Byb2ZpbGU+JiBwcm9maWxlKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQpOwotCi0gICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICAgICAgICBtSWQ7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICAgICAgICBtSW9IYW5kbGU7ICAgICAgIC8vIGlucHV0IGhhbmRsZQotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgICAgICAgbURldmljZTsgICAgICAgICAvLyBjdXJyZW50IGRldmljZSB0aGlzIGlucHV0IGlzIHJvdXRlZCB0bwotICAgICAgICAgICAgQXVkaW9NaXggICAgICAgICAgICAgICAgICAgICAgKm1Qb2xpY3lNaXg7ICAgICAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgbVBhdGNoSGFuZGxlOwotICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgbVJlZkNvdW50OyAgICAgICAvLyBudW1iZXIgb2YgQXVkaW9SZWNvcmQgY2xpZW50cyB1c2luZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlucHV0Ci0gICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICBtT3BlblJlZkNvdW50OwotICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgICAgICAgICAgICAgICAgbUlucHV0U291cmNlOyAgICAvLyBpbnB1dCBzb3VyY2Ugc2VsZWN0ZWQgYnkgYXBwbGljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8obWVkaWFyZWNvcmRlci5oKQotICAgICAgICAgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiAgICAgICAgICAgbVByb2ZpbGU7ICAgICAgICAvLyBJL08gcHJvZmlsZSB0aGlzIG91dHB1dCBkZXJpdmVzIGZyb20KLSAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19zZXNzaW9uX3Q+IG1TZXNzaW9uczsgICAgICAgLy8gYXVkaW8gc2Vzc2lvbnMgYXR0YWNoZWQgdG8gdGhpcyBpbnB1dAotICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgbUlzU291bmRUcmlnZ2VyOyAvLyB1c2VkIGJ5IGEgc291bmR0cmlnZ2VyIGNhcHR1cmUKLQotICAgICAgICAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0OwotICAgICAgICAgICAgdmlydHVhbCBzcDxBdWRpb1BvcnQ+IGdldEF1ZGlvUG9ydCgpIGNvbnN0IHsgcmV0dXJuIG1Qcm9maWxlOyB9Ci0gICAgICAgICAgICB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKLSAgICAgICAgfTsKLQotICAgICAgICAvLyBzdHJlYW0gZGVzY3JpcHRvciB1c2VkIGZvciB2b2x1bWUgY29udHJvbAotICAgICAgICBjbGFzcyBTdHJlYW1EZXNjcmlwdG9yCi0gICAgICAgIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgU3RyZWFtRGVzY3JpcHRvcigpOwotCi0gICAgICAgICAgICBpbnQgZ2V0Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSk7Ci0gICAgICAgICAgICB2b2lkIGR1bXAoaW50IGZkKTsKLQotICAgICAgICAgICAgaW50IG1JbmRleE1pbjsgICAgICAvLyBtaW4gdm9sdW1lIGluZGV4Ci0gICAgICAgICAgICBpbnQgbUluZGV4TWF4OyAgICAgIC8vIG1heCB2b2x1bWUgaW5kZXgKLSAgICAgICAgICAgIEtleWVkVmVjdG9yPGF1ZGlvX2RldmljZXNfdCwgaW50PiBtSW5kZXhDdXI7ICAgLy8gY3VycmVudCB2b2x1bWUgaW5kZXggcGVyIGRldmljZQotICAgICAgICAgICAgYm9vbCBtQ2FuQmVNdXRlZDsgICAvLyB0cnVlIGlzIHRoZSBzdHJlYW0gY2FuIGJlIG11dGVkCi0KLSAgICAgICAgICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKm1Wb2x1bWVDdXJ2ZVtERVZJQ0VfQ0FURUdPUllfQ05UXTsKLSAgICAgICAgfTsKLQotICAgICAgICAvLyBzdHJlYW0gZGVzY3JpcHRvciB1c2VkIGZvciB2b2x1bWUgY29udHJvbAotICAgICAgICBjbGFzcyBFZmZlY3REZXNjcmlwdG9yIDogcHVibGljIFJlZkJhc2UKLSAgICAgICAgewotICAgICAgICBwdWJsaWM6Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICAgICAgICAgICAgaW50IG1JbzsgICAgICAgICAgICAgICAgLy8gaW8gdGhlIGVmZmVjdCBpcyBhdHRhY2hlZCB0bwotICAgICAgICAgICAgcm91dGluZ19zdHJhdGVneSBtU3RyYXRlZ3k7IC8vIHJvdXRpbmcgc3RyYXRlZ3kgdGhlIGVmZmVjdCBpcyBhc3NvY2lhdGVkIHRvCi0gICAgICAgICAgICBpbnQgbVNlc3Npb247ICAgICAgICAgICAgICAgLy8gYXVkaW8gc2Vzc2lvbiB0aGUgZWZmZWN0IGlzIG9uCi0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IG1EZXNjOyAgLy8gZWZmZWN0IGRlc2NyaXB0b3IKLSAgICAgICAgICAgIGJvb2wgbUVuYWJsZWQ7ICAgICAgICAgICAgICAvLyBlbmFibGVkIHN0YXRlOiBDUFUgbG9hZCBiZWluZyB1c2VkIG9yIG5vdAotICAgICAgICB9OwotCi0gICAgICAgIHZvaWQgYWRkT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjKTsKLSAgICAgICAgdm9pZCBhZGRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyk7Ci0KLSAgICAgICAgLy8gcmV0dXJuIHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gc3RyZWFtIHR5cGUKLSAgICAgICAgc3RhdGljIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3koYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotCi0gICAgICAgIC8vIHJldHVybiBhcHByb3ByaWF0ZSBkZXZpY2UgZm9yIHN0cmVhbXMgaGFuZGxlZCBieSB0aGUgc3BlY2lmaWVkIHN0cmF0ZWd5IGFjY29yZGluZyB0byBjdXJyZW50Ci0gICAgICAgIC8vIHBob25lIHN0YXRlLCBjb25uZWN0ZWQgZGV2aWNlcy4uLgotICAgICAgICAvLyBpZiBmcm9tQ2FjaGUgaXMgdHJ1ZSwgdGhlIGRldmljZSBpcyByZXR1cm5lZCBmcm9tIG1EZXZpY2VGb3JTdHJhdGVneVtdLAotICAgICAgICAvLyBvdGhlcndpc2UgaXQgaXMgZGV0ZXJtaW5lIGJ5IGN1cnJlbnQgc3RhdGUKLSAgICAgICAgLy8gKGRldmljZSBjb25uZWN0ZWQscGhvbmUgc3RhdGUsIGZvcmNlIHVzZSwgYTJkcCBvdXRwdXQuLi4pCi0gICAgICAgIC8vIFRoaXMgYWxsb3dzIHRvOgotICAgICAgICAvLyAgMSBzcGVlZCB1cCBwcm9jZXNzIHdoZW4gdGhlIHN0YXRlIGlzIHN0YWJsZSAod2hlbiBzdGFydGluZyBvciBzdG9wcGluZyBhbiBvdXRwdXQpCi0gICAgICAgIC8vICAyIGFjY2VzcyB0byBlaXRoZXIgY3VycmVudCBkZXZpY2Ugc2VsZWN0aW9uIChmcm9tQ2FjaGUgPT0gdHJ1ZSkgb3IKLSAgICAgICAgLy8gImZ1dHVyZSIgZGV2aWNlIHNlbGVjdGlvbiAoZnJvbUNhY2hlID09IGZhbHNlKSB3aGVuIGNhbGxlZCBmcm9tIGEgY29udGV4dAotICAgICAgICAvLyAgd2hlcmUgY29uZGl0aW9ucyBhcmUgY2hhbmdpbmcgKHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpLCBzZXRQaG9uZVN0YXRlKCkuLi4pIEFORAotICAgICAgICAvLyAgYmVmb3JlIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCkgaXMgY2FsbGVkLgotICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSk7Ci0KLSAgICAgICAgLy8gY2hhbmdlIHRoZSByb3V0ZSBvZiB0aGUgc3BlY2lmaWVkIG91dHB1dC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1zIHdlIGhhdmUgc2xlcHQgdG8KLSAgICAgICAgLy8gYWxsb3cgbmV3IHJvdXRpbmcgdG8gdGFrZSBlZmZlY3QgaW4gY2VydGFpbiBjYXNlcy4KLSAgICAgICAgdmlydHVhbCB1aW50MzJfdCBzZXRPdXRwdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWRkcmVzcyA9IE5VTEwpOwotICAgICAgICBzdGF0dXNfdCByZXNldE91dHB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCk7Ci0gICAgICAgIHN0YXR1c190IHNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwpOwotICAgICAgICBzdGF0dXNfdCByZXNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwpOwotCi0gICAgICAgIC8vIHNlbGVjdCBpbnB1dCBkZXZpY2UgY29ycmVzcG9uZGluZyB0byByZXF1ZXN0ZWQgYXVkaW8gc291cmNlCi0gICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKTsKLQotICAgICAgICAvLyByZXR1cm4gaW8gaGFuZGxlIG9mIGFjdGl2ZSBpbnB1dCBvciAwIGlmIG5vIGlucHV0IGlzIGFjdGl2ZQotICAgICAgICAvLyAgICBPbmx5IGNvbnNpZGVycyBpbnB1dHMgZnJvbSBwaHlzaWNhbCBkZXZpY2VzIChlLmcuIG1haW4gbWljLCBoZWFkc2V0IG1pYykgd2hlbgotICAgICAgICAvLyAgICBpZ25vcmVWaXJ0dWFsSW5wdXRzIGlzIHRydWUuCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldEFjdGl2ZUlucHV0KGJvb2wgaWdub3JlVmlydHVhbElucHV0cyA9IHRydWUpOwotCi0gICAgICAgIHVpbnQzMl90IGFjdGl2ZUlucHV0c0NvdW50KCkgY29uc3Q7Ci0KLSAgICAgICAgLy8gaW5pdGlhbGl6ZSB2b2x1bWUgY3VydmVzIGZvciBlYWNoIHN0cmF0ZWd5IGFuZCBkZXZpY2UgY2F0ZWdvcnkKLSAgICAgICAgdm9pZCBpbml0aWFsaXplVm9sdW1lQ3VydmVzKCk7Ci0KLSAgICAgICAgLy8gY29tcHV0ZSB0aGUgYWN0dWFsIHZvbHVtZSBmb3IgYSBnaXZlbiBzdHJlYW0gYWNjb3JkaW5nIHRvIHRoZSByZXF1ZXN0ZWQgaW5kZXggYW5kIGEgcGFydGljdWxhcgotICAgICAgICAvLyBkZXZpY2UKLSAgICAgICAgdmlydHVhbCBmbG9hdCBjb21wdXRlVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwotCi0gICAgICAgIC8vIGNoZWNrIHRoYXQgdm9sdW1lIGNoYW5nZSBpcyBwZXJtaXR0ZWQsIGNvbXB1dGUgYW5kIHNlbmQgbmV3IHZvbHVtZSB0byBhdWRpbyBoYXJkd2FyZQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNoZWNrQW5kU2V0Vm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLCBib29sIGZvcmNlID0gZmFsc2UpOwotCi0gICAgICAgIC8vIGFwcGx5IGFsbCBzdHJlYW0gdm9sdW1lcyB0byB0aGUgc3BlY2lmaWVkIG91dHB1dCBhbmQgZGV2aWNlCi0gICAgICAgIHZvaWQgYXBwbHlTdHJlYW1Wb2x1bWVzKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGRlbGF5TXMgPSAwLCBib29sIGZvcmNlID0gZmFsc2UpOwotCi0gICAgICAgIC8vIE11dGUgb3IgdW5tdXRlIGFsbCBzdHJlYW1zIGhhbmRsZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJhdGVneSBvbiB0aGUgc3BlY2lmaWVkIG91dHB1dAotICAgICAgICB2b2lkIHNldFN0cmF0ZWd5TXV0ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpMCk7Ci0KLSAgICAgICAgLy8gTXV0ZSBvciB1bm11dGUgdGhlIHN0cmVhbSBvbiB0aGUgc3BlY2lmaWVkIG91dHB1dAotICAgICAgICB2b2lkIHNldFN0cmVhbU11dGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpMCk7Ci0KLSAgICAgICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZXMgZm9yIHNvbmlmaWNhdGlvbiBzdHJhdGVneSB3aGlsZSBpbiBjYWxsOiBtdXRlIHN0cmVhbXMgb3IgcmVwbGFjZSBieQotICAgICAgICAvLyBhIHNwZWNpYWwgdG9uZSBpbiB0aGUgZGV2aWNlIHVzZWQgZm9yIGNvbW11bmljYXRpb24KLSAgICAgICAgdm9pZCBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgc3RhcnRpbmcsIGJvb2wgc3RhdGVDaGFuZ2UpOwotCi0gICAgICAgIC8vIHRydWUgaWYgZGV2aWNlIGlzIGluIGEgdGVsZXBob255IG9yIFZvSVAgY2FsbAotICAgICAgICB2aXJ0dWFsIGJvb2wgaXNJbkNhbGwoKTsKLQotICAgICAgICAvLyB0cnVlIGlmIGdpdmVuIHN0YXRlIHJlcHJlc2VudHMgYSBkZXZpY2UgaW4gYSB0ZWxlcGhvbnkgb3IgVm9JUCBjYWxsCi0gICAgICAgIHZpcnR1YWwgYm9vbCBpc1N0YXRlSW5DYWxsKGludCBzdGF0ZSk7Ci0KLSAgICAgICAgLy8gd2hlbiBhIGRldmljZSBpcyBjb25uZWN0ZWQsIGNoZWNrcyBpZiBhbiBvcGVuIG91dHB1dCBjYW4gYmUgcm91dGVkCi0gICAgICAgIC8vIHRvIHRoaXMgZGV2aWNlLiBJZiBub25lIGlzIG9wZW4sIHRyaWVzIHRvIG9wZW4gb25lIG9mIHRoZSBhdmFpbGFibGUgb3V0cHV0cy4KLSAgICAgICAgLy8gUmV0dXJucyBhbiBvdXRwdXQgc3VpdGFibGUgdG8gdGhpcyBkZXZpY2Ugb3IgMC4KLSAgICAgICAgLy8gd2hlbiBhIGRldmljZSBpcyBkaXNjb25uZWN0ZWQsIGNoZWNrcyBpZiBhbiBvdXRwdXQgaXMgbm90IHVzZWQgYW55IG1vcmUgYW5kCi0gICAgICAgIC8vIHJldHVybnMgaXRzIGhhbmRsZSBpZiBhbnkuCi0gICAgICAgIC8vIHRyYW5zZmVycyB0aGUgYXVkaW8gdHJhY2tzIGFuZCBlZmZlY3RzIGZyb20gb25lIG91dHB1dCB0aHJlYWQgdG8gYW5vdGhlciBhY2NvcmRpbmdseS4KLSAgICAgICAgc3RhdHVzX3QgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBhZGRyZXNzKTsKLQotICAgICAgICBzdGF0dXNfdCBjaGVja0lucHV0c0ZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIGlucHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBhZGRyZXNzKTsKLQotICAgICAgICAvLyBjbG9zZSBhbiBvdXRwdXQgYW5kIGl0cyBjb21wYW5pb24gZHVwbGljYXRpbmcgb3V0cHV0LgotICAgICAgICB2b2lkIGNsb3NlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7Ci0KLSAgICAgICAgLy8gY2xvc2UgYW4gaW5wdXQuCi0gICAgICAgIHZvaWQgY2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7Ci0KLSAgICAgICAgLy8gY2hlY2tzIGFuZCBpZiBuZWNlc3NhcnkgY2hhbmdlcyBvdXRwdXRzIHVzZWQgZm9yIGFsbCBzdHJhdGVnaWVzLgotICAgICAgICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgb3V0cHV0IGNob2ljZSBmb3IgYSBnaXZlbiBzdHJhdGVneQotICAgICAgICAvLyBjaGFuZ2VzOiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLi4uCi0gICAgICAgIC8vIE11c3QgYmUgY2FsbGVkIGJlZm9yZSB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpCi0gICAgICAgIHZvaWQgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KTsKLQotICAgICAgICAvLyBTYW1lIGFzIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBidXQgZm9yIGEgYWxsIHN0cmF0ZWdpZXMgaW4gb3JkZXIgb2YgcHJpb3JpdHkKLSAgICAgICAgdm9pZCBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKLQotICAgICAgICAvLyBtYW5hZ2VzIEEyRFAgb3V0cHV0IHN1c3BlbmQvcmVzdG9yZSBhY2NvcmRpbmcgdG8gcGhvbmUgc3RhdGUgYW5kIEJUIFNDTyB1c2FnZQotICAgICAgICB2b2lkIGNoZWNrQTJkcFN1c3BlbmQoKTsKLQotICAgICAgICAvLyByZXR1cm5zIHRoZSBBMkRQIG91dHB1dCBoYW5kbGUgaWYgaXQgaXMgb3BlbiBvciAwIG90aGVyd2lzZQotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRBMmRwT3V0cHV0KCk7Ci0KLSAgICAgICAgLy8gc2VsZWN0cyB0aGUgbW9zdCBhcHByb3ByaWF0ZSBkZXZpY2Ugb24gb3V0cHV0IGZvciBjdXJyZW50IHN0YXRlCi0gICAgICAgIC8vIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBjb25kaXRpb24gdGhhdCBhZmZlY3RzIHRoZSBkZXZpY2UgY2hvaWNlIGZvciBhIGdpdmVuIG91dHB1dCBpcwotICAgICAgICAvLyBjaGFuZ2VkOiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLCBvdXRwdXQgc3RhcnQsIG91dHB1dCBzdG9wLi4KLSAgICAgICAgLy8gc2VlIGdldERldmljZUZvclN0cmF0ZWd5KCkgZm9yIHRoZSB1c2Ugb2YgZnJvbUNhY2hlIHBhcmFtZXRlcgotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0TmV3T3V0cHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgYm9vbCBmcm9tQ2FjaGUpOwotCi0gICAgICAgIC8vIHVwZGF0ZXMgY2FjaGUgb2YgZGV2aWNlIHVzZWQgYnkgYWxsIHN0cmF0ZWdpZXMgKG1EZXZpY2VGb3JTdHJhdGVneVtdKQotICAgICAgICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgZGV2aWNlIGNob2ljZSBmb3IgYSBnaXZlbiBzdHJhdGVneSBpcwotICAgICAgICAvLyBjaGFuZ2VkOiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLi4uCi0gICAgICAgIC8vIGNhY2hlZCB2YWx1ZXMgYXJlIHVzZWQgYnkgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBpZiBwYXJhbWV0ZXIgZnJvbUNhY2hlIGlzIHRydWUuCi0gICAgICAgICAvLyBNdXN0IGJlIGNhbGxlZCBhZnRlciBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKQotICAgICAgICB2b2lkIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7Ci0KLSAgICAgICAgLy8gc2VsZWN0cyB0aGUgbW9zdCBhcHByb3ByaWF0ZSBkZXZpY2Ugb24gaW5wdXQgZm9yIGN1cnJlbnQgc3RhdGUKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGdldE5ld0lucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKLQotICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldE1heEVmZmVjdHNDcHVMb2FkKCk7Ci0gICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0TWF4RWZmZWN0c01lbW9yeSgpOwotI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCi0gICAgICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHRocmVhZExvb3AoKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZXhpdCgpOwotICAgICAgICBpbnQgdGVzdE91dHB1dEluZGV4KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7Ci0jZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotCi0gICAgICAgIHN0YXR1c190IHNldEVmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4mIGVmZmVjdERlc2MsIGJvb2wgZW5hYmxlZCk7Ci0KLSAgICAgICAgLy8gcmV0dXJucyB0aGUgY2F0ZWdvcnkgdGhlIGRldmljZSBiZWxvbmdzIHRvIHdpdGggcmVnYXJkIHRvIHZvbHVtZSBjdXJ2ZSBtYW5hZ2VtZW50Ci0gICAgICAgIHN0YXRpYyBkZXZpY2VfY2F0ZWdvcnkgZ2V0RGV2aWNlQ2F0ZWdvcnkoYXVkaW9fZGV2aWNlc190IGRldmljZSk7Ci0KLSAgICAgICAgLy8gZXh0cmFjdCBvbmUgZGV2aWNlIHJlbGV2YW50IGZvciB2b2x1bWUgY29udHJvbCBmcm9tIG11bHRpcGxlIGRldmljZSBzZWxlY3Rpb24KLSAgICAgICAgc3RhdGljIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JWb2x1bWUoYXVkaW9fZGV2aWNlc190IGRldmljZSk7Ci0KLSAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBnZXRPdXRwdXRzRm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gPiBvcGVuT3V0cHV0cyk7Ci0gICAgICAgIGJvb2wgdmVjdG9yc0VxdWFsKFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMyKTsKLQotICAgICAgICAvLyBtdXRlL3VubXV0ZSBzdHJhdGVnaWVzIHVzaW5nIGFuIGluY29tcGF0aWJsZSBkZXZpY2UgY29tYmluYXRpb24KLSAgICAgICAgLy8gaWYgbXV0aW5nLCB3YWl0IGZvciB0aGUgYXVkaW8gaW4gcGNtIGJ1ZmZlciB0byBiZSBkcmFpbmVkIGJlZm9yZSBwcm9jZWVkaW5nCi0gICAgICAgIC8vIGlmIHVubXV0aW5nLCB1bm11dGUgb25seSBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5Ci0gICAgICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBtcyB3YWl0ZWQKLSAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyhzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcmV2RGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zKTsKLQotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzZWxlY3RPdXRwdXQoY29uc3QgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKLSAgICAgICAgLy8gc2FtcGxpbmdSYXRlIHBhcmFtZXRlciBpcyBhbiBpbi9vdXQgYW5kIHNvIG1heSBiZSBtb2RpZmllZAotICAgICAgICBzcDxJT1Byb2ZpbGU+IGdldElucHV0UHJvZmlsZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOwotICAgICAgICBzcDxJT1Byb2ZpbGU+IGdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKLQotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzZWxlY3RPdXRwdXRGb3JFZmZlY3RzKGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMpOwotCi0gICAgICAgIGJvb2wgaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKTsKLQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvUGF0Y2g+JiBwYXRjaCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOwotCi0gICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZ2V0T3V0cHV0RnJvbUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0OwotICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZ2V0SW5wdXRGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3Q7Ci0gICAgICAgIHNwPEh3TW9kdWxlPiBnZXRNb2R1bGVGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3Q7Ci0gICAgICAgIHNwPEh3TW9kdWxlPiBnZXRNb2R1bGVGcm9tTmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdDsKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZVByaW1hcnlPdXRwdXREZXZpY2VzKCk7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCk7Ci0KLSAgICAgICAgdm9pZCB1cGRhdGVDYWxsUm91dGluZyhhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UsIGludCBkZWxheU1zID0gMCk7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gQXVkaW8gcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZSBwYXJzaW5nIChhdWRpb19wb2xpY3kuY29uZikKLSAgICAgICAgLy8KLSAgICAgICAgc3RhdGljIHVpbnQzMl90IHN0cmluZ1RvRW51bShjb25zdCBzdHJ1Y3QgU3RyaW5nVG9FbnVtICp0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmVudW1Ub1N0cmluZyhjb25zdCBzdHJ1Y3QgU3RyaW5nVG9FbnVtICp0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlKTsKLSAgICAgICAgc3RhdGljIGJvb2wgc3RyaW5nVG9Cb29sKGNvbnN0IGNoYXIgKnZhbHVlKTsKLSAgICAgICAgc3RhdGljIHVpbnQzMl90IHBhcnNlT3V0cHV0RmxhZ05hbWVzKGNoYXIgKm5hbWUpOwotICAgICAgICBzdGF0aWMgdWludDMyX3QgcGFyc2VJbnB1dEZsYWdOYW1lcyhjaGFyICpuYW1lKTsKLSAgICAgICAgc3RhdGljIGF1ZGlvX2RldmljZXNfdCBwYXJzZURldmljZU5hbWVzKGNoYXIgKm5hbWUpOwotICAgICAgICB2b2lkIGxvYWRId01vZHVsZShjbm9kZSAqcm9vdCk7Ci0gICAgICAgIHZvaWQgbG9hZEh3TW9kdWxlcyhjbm9kZSAqcm9vdCk7Ci0gICAgICAgIHZvaWQgbG9hZEdsb2JhbENvbmZpZyhjbm9kZSAqcm9vdCwgY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpOwotICAgICAgICBzdGF0dXNfdCBsb2FkQXVkaW9Qb2xpY3lDb25maWcoY29uc3QgY2hhciAqcGF0aCk7Ci0gICAgICAgIHZvaWQgZGVmYXVsdEF1ZGlvUG9saWN5Q29uZmlnKHZvaWQpOwotCi0KLSAgICAgICAgdWlkX3QgbVVpZENhY2hlZDsKLSAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKm1wQ2xpZW50SW50ZXJmYWNlOyAgLy8gYXVkaW8gcG9saWN5IGNsaWVudCBpbnRlcmZhY2UKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbVByaW1hcnlPdXRwdXQ7ICAgICAgICAgICAgICAvLyBwcmltYXJ5IG91dHB1dCBoYW5kbGUKLSAgICAgICAgLy8gbGlzdCBvZiBkZXNjcmlwdG9ycyBmb3Igb3V0cHV0cyBjdXJyZW50bHkgb3BlbmVkCi0gICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiA+IG1PdXRwdXRzOwotICAgICAgICAvLyBjb3B5IG9mIG1PdXRwdXRzIGJlZm9yZSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBvcGVucyBuZXcgb3V0cHV0cwotICAgICAgICAvLyByZXNldCB0byBtT3V0cHV0cyB3aGVuIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCkgaXMgY2FsbGVkLgotICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gPiBtUHJldmlvdXNPdXRwdXRzOwotICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiA+IG1JbnB1dHM7ICAgICAvLyBsaXN0IG9mIGlucHV0IGRlc2NyaXB0b3JzCi0gICAgICAgIERldmljZVZlY3RvciAgbUF2YWlsYWJsZU91dHB1dERldmljZXM7IC8vIGFsbCBhdmFpbGFibGUgb3V0cHV0IGRldmljZXMKLSAgICAgICAgRGV2aWNlVmVjdG9yICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzOyAgLy8gYWxsIGF2YWlsYWJsZSBpbnB1dCBkZXZpY2VzCi0gICAgICAgIGludCBtUGhvbmVTdGF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBwaG9uZSBzdGF0ZQotICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVF07ICAgLy8gY3VycmVudCBmb3JjZWQgdXNlIGNvbmZpZ3VyYXRpb24KLQotICAgICAgICBTdHJlYW1EZXNjcmlwdG9yIG1TdHJlYW1zW0FVRElPX1NUUkVBTV9DTlRdOyAgICAgICAgICAgLy8gc3RyZWFtIGRlc2NyaXB0b3JzIGZvciB2b2x1bWUgY29udHJvbAotICAgICAgICBib29sICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpbWl0IHJpbmd0b25lIHZvbHVtZSB0byBtdXNpYyB2b2x1bWUgaWYgaGVhZHNldCBjb25uZWN0ZWQKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2VGb3JTdHJhdGVneVtOVU1fU1RSQVRFR0lFU107Ci0gICAgICAgIGZsb2F0ICAgbUxhc3RWb2ljZVZvbHVtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFzdCB2b2ljZSB2b2x1bWUgdmFsdWUgc2VudCB0byBhdWRpbyBIQUwKLQotICAgICAgICAvLyBNYXhpbXVtIENQVSBsb2FkIGFsbG9jYXRlZCB0byBhdWRpbyBlZmZlY3RzIGluIDAuMSBNSVBTIChBUk12NVRFLCAwIFdTIG1lbW9yeSkgdW5pdHMKLSAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9FRkZFQ1RTX0NQVV9MT0FEID0gMTAwMDsKLSAgICAgICAgLy8gTWF4aW11bSBtZW1vcnkgYWxsb2NhdGVkIHRvIGF1ZGlvIGVmZmVjdHMgaW4gS0IKLSAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9FRkZFQ1RTX01FTU9SWSA9IDUxMjsKLSAgICAgICAgdWludDMyX3QgbVRvdGFsRWZmZWN0c0NwdUxvYWQ7IC8vIGN1cnJlbnQgQ1BVIGxvYWQgdXNlZCBieSBlZmZlY3RzCi0gICAgICAgIHVpbnQzMl90IG1Ub3RhbEVmZmVjdHNNZW1vcnk7ICAvLyBjdXJyZW50IG1lbW9yeSB1c2VkIGJ5IGVmZmVjdHMKLSAgICAgICAgS2V5ZWRWZWN0b3I8aW50LCBzcDxFZmZlY3REZXNjcmlwdG9yPiA+IG1FZmZlY3RzOyAgLy8gbGlzdCBvZiByZWdpc3RlcmVkIGF1ZGlvIGVmZmVjdHMKLSAgICAgICAgYm9vbCAgICBtQTJkcFN1c3BlbmRlZDsgIC8vIHRydWUgaWYgQTJEUCBvdXRwdXQgaXMgc3VzcGVuZGVkCi0gICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IG1EZWZhdWx0T3V0cHV0RGV2aWNlOyAvLyBvdXRwdXQgZGV2aWNlIHNlbGVjdGVkIGJ5IGRlZmF1bHQgYXQgYm9vdCB0aW1lCi0gICAgICAgIGJvb2wgbVNwZWFrZXJEcmNFbmFibGVkOy8vIHRydWUgb24gZGV2aWNlcyB0aGF0IHVzZSBEUkMgb24gdGhlIERFVklDRV9DQVRFR09SWV9TUEVBS0VSIHBhdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYm9vc3Qgc29mdCBzb3VuZHMsIHVzZWQgdG8gYWRqdXN0IHZvbHVtZSBjdXJ2ZXMgYWNjb3JkaW5nbHkKLQotICAgICAgICBWZWN0b3IgPCBzcDxId01vZHVsZT4gPiBtSHdNb2R1bGVzOwotICAgICAgICB2b2xhdGlsZSBpbnQzMl90IG1OZXh0VW5pcXVlSWQ7Ci0gICAgICAgIHZvbGF0aWxlIGludDMyX3QgbUF1ZGlvUG9ydEdlbmVyYXRpb247Ci0KLSAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX3BhdGNoX2hhbmRsZV90LCBzcDxBdWRpb1BhdGNoPiA+IG1BdWRpb1BhdGNoZXM7Ci0KLSAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdCwgYXVkaW9faW9faGFuZGxlX3Q+IG1Tb3VuZFRyaWdnZXJTZXNzaW9uczsKLQotICAgICAgICBzcDxBdWRpb1BhdGNoPiBtQ2FsbFR4UGF0Y2g7Ci0gICAgICAgIHNwPEF1ZGlvUGF0Y2g+IG1DYWxsUnhQYXRjaDsKLQotICAgICAgICAvLyBmb3Igc3VwcG9ydGluZyAiYmVhY29uIiBzdHJlYW1zLCBpLmUuIHN0cmVhbXMgdGhhdCBvbmx5IHBsYXkgb24gc3BlYWtlciwgYW5kIG5ldmVyCi0gICAgICAgIC8vIHdoZW4gc29tZXRoaW5nIG90aGVyIHRoYW4gU1RSRUFNX1RUUyAoYS5rLmEuICJUcmFuc21pdHRlZCBUaHJvdWdoIFNwZWFrZXIiKSBpcyBwbGF5aW5nCi0gICAgICAgIGVudW0gewotICAgICAgICAgICAgU1RBUlRJTkdfT1VUUFVULAotICAgICAgICAgICAgU1RBUlRJTkdfQkVBQ09OLAotICAgICAgICAgICAgU1RPUFBJTkdfT1VUUFVULAotICAgICAgICAgICAgU1RPUFBJTkdfQkVBQ09OCi0gICAgICAgIH07Ci0gICAgICAgIHVpbnQzMl90IG1CZWFjb25NdXRlUmVmQ291bnQ7ICAgLy8gcmVmIGNvdW50IGZvciBzdHJlYW0gdGhhdCB3b3VsZCBtdXRlIGJlYWNvbgotICAgICAgICB1aW50MzJfdCBtQmVhY29uUGxheWluZ1JlZkNvdW50Oy8vIHJlZiBjb3VudCBmb3IgdGhlIHBsYXlpbmcgYmVhY29uIHN0cmVhbXMKLSAgICAgICAgYm9vbCBtQmVhY29uTXV0ZWQ7ICAgICAgICAgICAgICAvLyBoYXMgU1RSRUFNX1RUUyBiZWVuIG11dGVkCi0KLSAgICAgICAgLy8gY3VzdG9tIG1peCBlbnRyeSBpbiBtUG9saWN5TWl4ZXMKLSAgICAgICAgY2xhc3MgQXVkaW9Qb2xpY3lNaXggOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIEF1ZGlvUG9saWN5TWl4KCkge30KLQotICAgICAgICAgICAgQXVkaW9NaXggICAgbU1peDsgICAgICAgICAgICAgICAgICAgLy8gQXVkaW8gcG9saWN5IG1peCBkZXNjcmlwdG9yCi0gICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG1PdXRwdXQ7ICAvLyBDb3JyZXNwb25kaW5nIG91dHB1dCBzdHJlYW0KLSAgICAgICAgfTsKLSAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPFN0cmluZzgsIHNwPEF1ZGlvUG9saWN5TWl4PiA+IG1Qb2xpY3lNaXhlczsgLy8gbGlzdCBvZiByZWdpc3RlcmVkIG1peGVzCi0KLQotI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCi0gICAgICAgIE11dGV4ICAgbUxvY2s7Ci0gICAgICAgIENvbmRpdGlvbiBtV2FpdFdvcmtDVjsKLQotICAgICAgICBpbnQgICAgICAgICAgICAgbUN1ck91dHB1dDsKLSAgICAgICAgYm9vbCAgICAgICAgICAgIG1EaXJlY3RPdXRwdXQ7Ci0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1UZXN0T3V0cHV0c1tOVU1fVEVTVF9PVVRQVVRTXTsKLSAgICAgICAgaW50ICAgICAgICAgICAgIG1UZXN0SW5wdXQ7Ci0gICAgICAgIHVpbnQzMl90ICAgICAgICBtVGVzdERldmljZTsKLSAgICAgICAgdWludDMyX3QgICAgICAgIG1UZXN0U2FtcGxpbmdSYXRlOwotICAgICAgICB1aW50MzJfdCAgICAgICAgbVRlc3RGb3JtYXQ7Ci0gICAgICAgIHVpbnQzMl90ICAgICAgICBtVGVzdENoYW5uZWxzOwotICAgICAgICB1aW50MzJfdCAgICAgICAgbVRlc3RMYXRlbmN5TXM7Ci0jZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotICAgICAgICBzdGF0aWMgZmxvYXQgdm9sSW5kZXhUb0FtcGwoYXVkaW9fZGV2aWNlc190IGRldmljZSwgY29uc3QgU3RyZWFtRGVzY3JpcHRvciYgc3RyZWFtRGVzYywKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKTsKLSAgICAgICAgc3RhdGljIGJvb2wgaXNWaXJ0dWFsSW5wdXREZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSk7Ci0gICAgICAgIHVpbnQzMl90IG5leHRVbmlxdWVJZCgpOwotICAgICAgICB1aW50MzJfdCBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwotcHJpdmF0ZToKLSAgICAgICAgLy8gdXBkYXRlcyBkZXZpY2UgY2FjaGluZyBhbmQgb3V0cHV0IGZvciBzdHJlYW1zIHRoYXQgY2FuIGluZmx1ZW5jZSB0aGUKLSAgICAgICAgLy8gICAgcm91dGluZyBvZiBub3RpZmljYXRpb25zCi0gICAgICAgIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uUm91dGluZ0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgICAgIHN0YXRpYyBib29sIGRldmljZURpc3Rpbmd1aXNoZXNPbkFkZHJlc3MoYXVkaW9fZGV2aWNlc190IGRldmljZSk7Ci0gICAgICAgIC8vIGZpbmQgdGhlIG91dHB1dHMgb24gYSBnaXZlbiBvdXRwdXQgZGVzY3JpcHRvciB0aGF0IGhhdmUgdGhlIGdpdmVuIGFkZHJlc3MuCi0gICAgICAgIC8vIHRvIGJlIGNhbGxlZCBvbiBhbiBBdWRpb091dHB1dERlc2NyaXB0b3Igd2hvc2Ugc3VwcG9ydGVkIGRldmljZXMgKGFzIGRlZmluZWQKLSAgICAgICAgLy8gICBpbiBtUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMpIG1hdGNoZXMgdGhlIGRldmljZSB3aG9zZSBhZGRyZXNzIGlzIHRvIGJlIG1hdGNoZWQuCi0gICAgICAgIC8vIHNlZSBkZXZpY2VEaXN0aW5ndWlzaGVzT25BZGRyZXNzKGF1ZGlvX2RldmljZXNfdCkgZm9yIHdoZXRoZXIgdGhlIGRldmljZSB0eXBlIGlzIG9uZQotICAgICAgICAvLyAgIHdoZXJlIGFkZHJlc3NlcyBhcmUgdXNlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIG9uZSBjb25uZWN0ZWQgZGV2aWNlIGFuZCBhbm90aGVyLgotICAgICAgICB2b2lkIGZpbmRJb0hhbmRsZXNCeUFkZHJlc3Moc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjIC8qaW4qLywKLSAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlIC8qaW4qLywKLSAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGFkZHJlc3MgLyppbiovLAotICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMgLypvdXQqLyk7Ci0gICAgICAgIHVpbnQzMl90IGN1ckF1ZGlvUG9ydEdlbmVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtQXVkaW9Qb3J0R2VuZXJhdGlvbjsgfQotICAgICAgICAvLyBpbnRlcm5hbCBtZXRob2QgdG8gcmV0dXJuIHRoZSBvdXRwdXQgaGFuZGxlIGZvciB0aGUgZ2l2ZW4gZGV2aWNlIGFuZCBmb3JtYXQKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRGV2aWNlKAotICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pOwotICAgICAgICAvLyBpbnRlcm5hbCBmdW5jdGlvbiB0byBkZXJpdmUgYSBzdHJlYW0gdHlwZSB2YWx1ZSBmcm9tIGF1ZGlvIGF0dHJpYnV0ZXMKLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKTsKLSAgICAgICAgLy8gcmV0dXJuIHRydWUgaWYgYW55IG91dHB1dCBpcyBwbGF5aW5nIGFueXRoaW5nIGJlc2lkZXMgdGhlIHN0cmVhbSB0byBpZ25vcmUKLSAgICAgICAgYm9vbCBpc0FueU91dHB1dEFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVRvSWdub3JlKTsKLSAgICAgICAgLy8gZXZlbnQgaXMgb25lIG9mIFNUQVJUSU5HX09VVFBVVCwgU1RBUlRJTkdfQkVBQ09OLCBTVE9QUElOR19PVVRQVVQsIFNUT1BQSU5HX0JFQUNPTgotICAgICAgICAvLyByZXR1cm5zIDAgaWYgbm8gbXV0ZS91bm11dGUgZXZlbnQgaGFwcGVuZWQsIHRoZSBsYXJnZXN0IGxhdGVuY3kgb2YgdGhlIGRldmljZSB3aGVyZQotICAgICAgICAvLyAgIHRoZSBtdXRlL3VubXV0ZSBoYXBwZW5lZAotICAgICAgICB1aW50MzJfdCBoYW5kbGVFdmVudEZvckJlYWNvbihpbnQgZXZlbnQpOwotICAgICAgICB1aW50MzJfdCBzZXRCZWFjb25NdXRlKGJvb2wgbXV0ZSk7Ci0gICAgICAgIGJvb2wgICAgIGlzVmFsaWRBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqcGFhKTsKLQotICAgICAgICAvLyBzZWxlY3QgaW5wdXQgZGV2aWNlIGNvcnJlc3BvbmRpbmcgdG8gcmVxdWVzdGVkIGF1ZGlvIHNvdXJjZSBhbmQgcmV0dXJuIGFzc29jaWF0ZWQgcG9saWN5Ci0gICAgICAgIC8vIG1peCBpZiBhbnkuIENhbGxzIGdldERldmljZUZvcklucHV0U291cmNlKCkuCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXggKipwb2xpY3lNaXggPSBOVUxMKTsKLQotICAgICAgICAvLyBDYWxsZWQgYnkgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkuCi0gICAgICAgIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7Ci0gICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+ICBnZXREZXZpY2VEZXNjcmlwdG9yKGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKTsKLQotfTsKLQotfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNjZThlMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsOSBAQAorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUmVjdXJzaXZlIGNhbGwgc3ViLWZvbGRlciBBbmRyb2lkLm1rCisjCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1JvdXRpbmdTdHJhdGVneS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvUm91dGluZ1N0cmF0ZWd5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM4OTY3ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1JvdXRpbmdTdHJhdGVneS5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBUaW1lIGluIG1pbGxpc2Vjb25kcyBhZnRlciBtZWRpYSBzdG9wcGVkIHBsYXlpbmcgZHVyaW5nIHdoaWNoIHdlIGNvbnNpZGVyIHRoYXQgdGhlCisvLyBzb25pZmljYXRpb24gc2hvdWxkIGJlIGFzIHVub2J0cnVzaXZlIGFzIGR1cmluZyB0aGUgdGltZSBtZWRpYSB3YXMgcGxheWluZy4KKyNkZWZpbmUgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkgNTAwMAorCitlbnVtIHJvdXRpbmdfc3RyYXRlZ3kgeworICAgIFNUUkFURUdZX01FRElBLAorICAgIFNUUkFURUdZX1BIT05FLAorICAgIFNUUkFURUdZX1NPTklGSUNBVElPTiwKKyAgICBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCwKKyAgICBTVFJBVEVHWV9EVE1GLAorICAgIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsCisgICAgU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSLAorICAgIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFksCisgICAgU1RSQVRFR1lfUkVST1VUSU5HLAorICAgIE5VTV9TVFJBVEVHSUVTCit9OworCit9OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1ZvbHVtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcxMmY3YTcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaApAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisvLyBBYnNvbHV0ZSBtaW4gdm9sdW1lIGluIGRCIChjYW4gYmUgcmVwcmVzZW50ZWQgaW4gc2luZ2xlIHByZWNpc2lvbiBub3JtYWwgZmxvYXQgdmFsdWUpCisjZGVmaW5lIFZPTFVNRV9NSU5fREIgKC03NTgpCisKK2NsYXNzIFZvbHVtZUN1cnZlUG9pbnQKK3sKK3B1YmxpYzoKKyAgICBpbnQgbUluZGV4OworICAgIGZsb2F0IG1EQkF0dGVudWF0aW9uOworfTsKKworY2xhc3MgVm9sdW1lCit7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogNCBwb2ludHMgdG8gZGVmaW5lIHRoZSB2b2x1bWUgYXR0ZW51YXRpb24gY3VydmUsIGVhY2ggY2hhcmFjdGVyaXplZCBieSB0aGUgdm9sdW1lCisgICAgICogaW5kZXggKGZyb20gMCB0byAxMDApIGF0IHdoaWNoIHRoZXkgYXBwbHksIGFuZCB0aGUgYXR0ZW51YXRpb24gaW4gZEIgYXQgdGhhdCBpbmRleC4KKyAgICAgKiB3ZSB1c2UgMTAwIHN0ZXBzIHRvIGF2b2lkIHJvdW5kaW5nIGVycm9ycyB3aGVuIGNvbXB1dGluZyB0aGUgdm9sdW1lIGluIHZvbEluZGV4VG9EYigpCisgICAgICoKKyAgICAgKiBAdG9kbyBzaGFsbCBiZWNvbWUgY29uZmlndXJhYmxlCisgICAgICovCisgICAgZW51bSB7CisgICAgICAgIFZPTE1JTiA9IDAsCisgICAgICAgIFZPTEtORUUxID0gMSwKKyAgICAgICAgVk9MS05FRTIgPSAyLAorICAgICAgICBWT0xNQVggPSAzLAorCisgICAgICAgIFZPTENOVCA9IDQKKyAgICB9OworCisgICAgLyoqCisgICAgICogZGV2aWNlIGNhdGVnb3JpZXMgdXNlZCBmb3Igdm9sdW1lIGN1cnZlIG1hbmFnZW1lbnQuCisgICAgICovCisgICAgZW51bSBkZXZpY2VfY2F0ZWdvcnkgeworICAgICAgICBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCwKKyAgICAgICAgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCisgICAgICAgIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRSwKKyAgICAgICAgREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSwKKyAgICAgICAgREVWSUNFX0NBVEVHT1JZX0NOVAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBleHRyYWN0IG9uZSBkZXZpY2UgcmVsZXZhbnQgZm9yIHZvbHVtZSBjb250cm9sIGZyb20gbXVsdGlwbGUgZGV2aWNlIHNlbGVjdGlvbgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBkZXZpY2UgZm9yIHdoaWNoIHRoZSB2b2x1bWUgY2F0ZWdvcnkgaXMgYXNzb2NpYXRlZAorICAgICAqCisgICAgICogQHJldHVybiBzdWJzZXQgb2YgZGV2aWNlIHJlcXVpcmVkIHRvIGxpbWl0IHRoZSBudW1iZXIgb2Ygdm9sdW1lIGNhdGVnb3J5IHBlciBkZXZpY2UKKyAgICAgKi8KKyAgICBzdGF0aWMgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclZvbHVtZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQorICAgIHsKKyAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgLy8gdGhpcyBoYXBwZW5zIHdoZW4gZm9yY2luZyBhIHJvdXRlIHVwZGF0ZSBhbmQgbm8gdHJhY2sgaXMgYWN0aXZlIG9uIGFuIG91dHB1dC4KKyAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSB0aGUgcmV0dXJuZWQgY2F0ZWdvcnkgaXMgbm90IGltcG9ydGFudC4KKyAgICAgICAgICAgIGRldmljZSA9ICBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgIH0gZWxzZSBpZiAocG9wY291bnQoZGV2aWNlKSA+IDEpIHsKKyAgICAgICAgICAgIC8vIE11bHRpcGxlIGRldmljZSBzZWxlY3Rpb24gaXMgZWl0aGVyOgorICAgICAgICAgICAgLy8gIC0gc3BlYWtlciArIG9uZSBvdGhlciBkZXZpY2U6IGdpdmUgcHJpb3JpdHkgdG8gc3BlYWtlciBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAvLyAgLSBvbmUgQTJEUCBkZXZpY2UgKyBhbm90aGVyIGRldmljZTogaGFwcGVucyB3aXRoIGR1cGxpY2F0ZWQgb3V0cHV0LiBJbiB0aGlzIGNhc2UKKyAgICAgICAgICAgIC8vIHJldGFpbiB0aGUgZGV2aWNlIG9uIHRoZSBBMkRQIG91dHB1dCBhcyB0aGUgb3RoZXIgbXVzdCBub3QgY29ycmVzcG9uZCB0byBhbiBhY3RpdmUKKyAgICAgICAgICAgIC8vIHNlbGVjdGlvbiBpZiBub3QgdGhlIHNwZWFrZXIuCisgICAgICAgICAgICAvLyAgLSBIRE1JLUNFQyBzeXN0ZW0gYXVkaW8gbW9kZSBvbmx5IG91dHB1dDogZ2l2ZSBwcmlvcml0eSB0byBhdmFpbGFibGUgaXRlbSBpbiBvcmRlci4KKyAgICAgICAgICAgIGlmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkMpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDOworICAgICAgICAgICAgfSBlbHNlIGlmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FVWF9MSU5FKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9BVVhfTElORTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9TUERJRikgeworICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfU1BESUY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLypTUEVBS0VSX1NBRkUgaXMgYW4gYWxpYXMgb2YgU1BFQUtFUiBmb3IgcHVycG9zZXMgb2Ygdm9sdW1lIGNvbnRyb2wqLworICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKQorICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworCisgICAgICAgIEFMT0dXX0lGKHBvcGNvdW50KGRldmljZSkgIT0gMSwKKyAgICAgICAgICAgICAgICAgImdldERldmljZUZvclZvbHVtZSgpIGludmFsaWQgZGV2aWNlIGNvbWJpbmF0aW9uOiAlMDh4IiwKKyAgICAgICAgICAgICAgICAgZGV2aWNlKTsKKworICAgICAgICByZXR1cm4gZGV2aWNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJldHVybnMgdGhlIGNhdGVnb3J5IHRoZSBkZXZpY2UgYmVsb25ncyB0byB3aXRoIHJlZ2FyZCB0byB2b2x1bWUgY3VydmUgbWFuYWdlbWVudAorICAgICAqCisgICAgICogQHBhcmFtW2luXSBkZXZpY2UgdG8gY2hlY2sgdXBvbiB0aGUgY2F0ZWdvcnkgdG8gd2hvbSBpdCBiZWxvbmdzIHRvLgorICAgICAqCisgICAgICogQHJldHVybiBkZXZpY2UgY2F0ZWdvcnkuCisgICAgICovCisgICAgc3RhdGljIGRldmljZV9jYXRlZ29yeSBnZXREZXZpY2VDYXRlZ29yeShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQorICAgIHsKKyAgICAgICAgc3dpdGNoKGdldERldmljZUZvclZvbHVtZShkZXZpY2UpKSB7CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRToKKyAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0U7CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDTzoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fSEVBRFNFVDoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUzoKKyAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVDsKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0xJTkU6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTDoKKyAgICAgICAgICAgIC8qVVNCPyAgUmVtb3RlIHN1Ym1peD8qLworICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUE7CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQ6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWToKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9TUEVBS0VSOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGlubGluZSBmbG9hdCBEYlRvQW1wbChmbG9hdCBkZWNpYmVscykKKyAgICB7CisgICAgICAgIGlmIChkZWNpYmVscyA8PSBWT0xVTUVfTUlOX0RCKSB7CisgICAgICAgICAgICByZXR1cm4gMC4wZjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXhwKCBkZWNpYmVscyAqIDAuMTE1MTI5Zik7IC8vIGV4cCggZEIgKiBsbigxMCkgLyAyMCApCisgICAgfQorCisgICAgc3RhdGljIGlubGluZSBmbG9hdCBBbXBsVG9EYihmbG9hdCBhbXBsaWZpY2F0aW9uKQorICAgIHsKKyAgICAgICAgaWYgKGFtcGxpZmljYXRpb24gPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFZPTFVNRV9NSU5fREI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDIwICogbG9nMTAoYW1wbGlmaWNhdGlvbik7CisgICAgfQorCit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvcG9saWN5LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YjczZTNjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvcG9saWN5LmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKKy8vIEZvciBtaXhlZCBvdXRwdXQgYW5kIGlucHV0cywgdGhlIHBvbGljeSB3aWxsIHVzZSBtYXggbWl4ZXIgc2FtcGxpbmcgcmF0ZXMuCisvLyBEbyBub3QgbGltaXQgc2FtcGxpbmcgcmF0ZSBvdGhlcndpc2UKKyNkZWZpbmUgTUFYX01JWEVSX1NBTVBMSU5HX1JBVEUgMTkyMDAwCisKKy8vIEZvciBtaXhlZCBvdXRwdXQgYW5kIGlucHV0cywgdGhlIHBvbGljeSB3aWxsIHVzZSBtYXggbWl4ZXIgY2hhbm5lbCBjb3VudC4KKy8vIERvIG5vdCBsaW1pdCBjaGFubmVsIGNvdW50IG90aGVyd2lzZQorI2RlZmluZSBNQVhfTUlYRVJfQ0hBTk5FTF9DT1VOVCA4CisKKy8qKgorICogQSBkZXZpY2UgbWFzayBmb3IgYWxsIGF1ZGlvIGlucHV0IGRldmljZXMgdGhhdCBhcmUgY29uc2lkZXJlZCAidmlydHVhbCIgd2hlbiBldmFsdWF0aW5nCisgKiBhY3RpdmUgaW5wdXRzIGluIGdldEFjdGl2ZUlucHV0KCkKKyAqLworI2RlZmluZSBBUE1fQVVESU9fSU5fREVWSUNFX1ZJUlRVQUxfQUxMICAoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVh8QVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSKQorCisKKy8qKgorICogQSBkZXZpY2UgbWFzayBmb3IgYWxsIGF1ZGlvIGlucHV0IGFuZCBvdXRwdXQgZGV2aWNlcyB3aGVyZSBtYXRjaGluZyBpbnB1dHMvb3V0cHV0cyBvbiBkZXZpY2UKKyAqIHR5cGUgYWxvbmUgaXMgbm90IGVub3VnaDogdGhlIGFkZHJlc3MgbXVzdCBtYXRjaCB0b28KKyAqLworI2RlZmluZSBBUE1fQVVESU9fREVWSUNFX09VVF9NQVRDSF9BRERSRVNTX0FMTCAoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKQorCisjZGVmaW5lIEFQTV9BVURJT19ERVZJQ0VfSU5fTUFUQ0hfQUREUkVTU19BTEwgKEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKQorCisvKioKKyAqIENoZWNrIGlmIHRoZSBzdGF0ZSBnaXZlbiBjb3JyZXNwb25kIHRvIGFuIGluIGNhbGwgc3RhdGUuCisgKiBAVE9ETyBmaW5kIGEgYmV0dGVyIG5hbWUgZm9yIHdpZGVseSBjYWxsIHN0YXRlCisgKgorICogQHBhcmFtW2luXSBzdGF0ZSB0byBjb25zaWRlcgorICoKKyAqIEByZXR1cm4gdHJ1ZSBpZiBnaXZlbiBzdGF0ZSByZXByZXNlbnRzIGEgZGV2aWNlIGluIGEgdGVsZXBob255IG9yIFZvSVAgY2FsbAorICovCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfc3RhdGVfaW5fY2FsbChpbnQgc3RhdGUpCit7CisgICAgcmV0dXJuIChzdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHx8IChzdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NPTU1VTklDQVRJT04pOworfQorCisvKioKKyAqIENoZWNrIGlmIHRoZSBpbnB1dCBkZXZpY2UgZ2l2ZW4gaXMgY29uc2lkZXJlZCBhcyBhIHZpcnR1YWwgZGV2aWNlLgorICoKKyAqIEBwYXJhbVtpbl0gZGV2aWNlIHRvIGNvbnNpZGVyCisgKgorICogQHJldHVybiB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgYSB2aXJ0dWFsIG9uZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBpZiAoKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApIHsKKyAgICAgICAgZGV2aWNlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOworICAgICAgICBpZiAoKHBvcGNvdW50KGRldmljZSkgPT0gMSkgJiYgKChkZXZpY2UgJiB+QVBNX0FVRElPX0lOX0RFVklDRV9WSVJUVUFMX0FMTCkgPT0gMCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIENoZWNrIHdoZXRoZXIgdGhlIGRldmljZSB0eXBlIGlzIG9uZQorICogd2hlcmUgYWRkcmVzc2VzIGFyZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gb25lIGNvbm5lY3RlZCBkZXZpY2UgYW5kIGFub3RoZXIKKyAqCisgKiBAcGFyYW1baW5dIGRldmljZSB0byBjb25zaWRlcgorICoKKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlIG5lZWRzIGRpc3Rpbmd1aXNoIG9uIGFkZHJlc3MsIGZhbHNlIG90aGVyd2lzZS4uCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgcmV0dXJuICgoKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApICYmCisgICAgICAgICAgICAoKH5BVURJT19ERVZJQ0VfQklUX0lOICYgZGV2aWNlICYgQVBNX0FVRElPX0RFVklDRV9JTl9NQVRDSF9BRERSRVNTX0FMTCkgIT0gMCkpIHx8CisgICAgICAgICAgICgoKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pID09IDApICYmCisgICAgICAgICAgICAoKGRldmljZSAmIEFQTV9BVURJT19ERVZJQ0VfT1VUX01BVENIX0FERFJFU1NfQUxMKSAhPSAwKSk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcyOGZmMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM2IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKyAgICBzcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAgXAorICAgIHNyYy9BdWRpb0dhaW4uY3BwIFwKKyAgICBzcmMvU3RyZWFtRGVzY3JpcHRvci5jcHAgXAorICAgIHNyYy9Id01vZHVsZS5jcHAgXAorICAgIHNyYy9JT1Byb2ZpbGUuY3BwIFwKKyAgICBzcmMvQXVkaW9Qb3J0LmNwcCBcCisgICAgc3JjL0F1ZGlvUG9saWN5TWl4LmNwcCBcCisgICAgc3JjL0F1ZGlvUGF0Y2guY3BwIFwKKyAgICBzcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwIFwKKyAgICBzcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcCBcCisgICAgc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwIFwKKyAgICBzcmMvQ29uZmlnUGFyc2luZ1V0aWxzLmNwcCBcCisgICAgc3JjL1NvdW5kVHJpZ2dlclNlc3Npb24uY3BwIFwKKyAgICBzcmMvU2Vzc2lvblJvdXRlLmNwcCBcCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmN1dGlscyBcCisgICAgbGlidXRpbHMgXAorICAgIGxpYmxvZyBcCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeQorCitMT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gXAorICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZQorCitMT0NBTF9NT0RVTEUgOj0gbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0dhaW4uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0dhaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWZiZjliCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvR2Fpbi5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBBdWRpb0dhaW46IHB1YmxpYyBSZWZCYXNlCit7CitwdWJsaWM6CisgICAgQXVkaW9HYWluKGludCBpbmRleCwgYm9vbCB1c2VJbkNoYW5uZWxNYXNrKTsKKyAgICB2aXJ0dWFsIH5BdWRpb0dhaW4oKSB7fQorCisgICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKKworICAgIHZvaWQgZ2V0RGVmYXVsdENvbmZpZyhzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmNvbmZpZyk7CisgICAgc3RhdHVzX3QgY2hlY2tDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpjb25maWcpOworICAgIGludCAgICAgICAgICAgICAgIG1JbmRleDsKKyAgICBzdHJ1Y3QgYXVkaW9fZ2FpbiBtR2FpbjsKKyAgICBib29sICAgICAgICAgICAgICBtVXNlSW5DaGFubmVsTWFzazsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JbnB1dERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YmNmZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JbnB1dERlc2NyaXB0b3IuaApAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJBdWRpb1BvcnQuaCIKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIElPUHJvZmlsZTsKK2NsYXNzIEF1ZGlvTWl4OworCisvLyBkZXNjcmlwdG9yIGZvciBhdWRpbyBpbnB1dHMuIFVzZWQgdG8gbWFpbnRhaW4gY3VycmVudCBjb25maWd1cmF0aW9uIG9mIGVhY2ggb3BlbmVkIGF1ZGlvIGlucHV0CisvLyBhbmQga2VlcCB0cmFjayBvZiB0aGUgdXNhZ2Ugb2YgdGhpcyBpbnB1dC4KK2NsYXNzIEF1ZGlvSW5wdXREZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnCit7CitwdWJsaWM6CisgICAgQXVkaW9JbnB1dERlc2NyaXB0b3IoY29uc3Qgc3A8SU9Qcm9maWxlPiYgcHJvZmlsZSk7CisgICAgdm9pZCBzZXRJb0hhbmRsZShhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSk7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRJZCgpIGNvbnN0OworICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBnZXRNb2R1bGVIYW5kbGUoKSBjb25zdDsKKworICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKKworICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgICAgICAgIG1Jb0hhbmRsZTsgICAgICAgLy8gaW5wdXQgaGFuZGxlCisgICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgICAgICAgbURldmljZTsgICAgICAgICAvLyBjdXJyZW50IGRldmljZSB0aGlzIGlucHV0IGlzIHJvdXRlZCB0bworICAgIEF1ZGlvTWl4ICAgICAgICAgICAgICAgICAgICAgICptUG9saWN5TWl4OyAgICAgLy8gbm9uIE5VTEwgd2hlbiB1c2VkIGJ5IGEgZHluYW1pYyBwb2xpY3kKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICBtUGF0Y2hIYW5kbGU7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgbVJlZkNvdW50OyAgICAgICAvLyBudW1iZXIgb2YgQXVkaW9SZWNvcmQgY2xpZW50cyB1c2luZworICAgIC8vIHRoaXMgaW5wdXQKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICBtT3BlblJlZkNvdW50OworICAgIGF1ZGlvX3NvdXJjZV90ICAgICAgICAgICAgICAgIG1JbnB1dFNvdXJjZTsgICAgLy8gaW5wdXQgc291cmNlIHNlbGVjdGVkIGJ5IGFwcGxpY2F0aW9uCisgICAgLy8obWVkaWFyZWNvcmRlci5oKQorICAgIGNvbnN0IHNwPElPUHJvZmlsZT4gICAgICAgICAgIG1Qcm9maWxlOyAgICAgICAgLy8gSS9PIHByb2ZpbGUgdGhpcyBvdXRwdXQgZGVyaXZlcyBmcm9tCisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdD4gbVNlc3Npb25zOyAgICAgICAvLyBhdWRpbyBzZXNzaW9ucyBhdHRhY2hlZCB0byB0aGlzIGlucHV0CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgbUlzU291bmRUcmlnZ2VyOyAvLyB1c2VkIGJ5IGEgc291bmR0cmlnZ2VyIGNhcHR1cmUKKworICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CisgICAgdmlydHVhbCBzcDxBdWRpb1BvcnQ+IGdldEF1ZGlvUG9ydCgpIGNvbnN0IHsgcmV0dXJuIG1Qcm9maWxlOyB9CisgICAgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgICAgICAgbUlkOworfTsKKworY2xhc3MgQXVkaW9JbnB1dENvbGxlY3Rpb24gOgorICAgICAgICBwdWJsaWMgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19pb19oYW5kbGVfdCwgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ID4KK3sKK3B1YmxpYzoKKyAgICBib29sIGlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3Q7CisKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZ2V0SW5wdXRGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3Q7CisKKyAgICB1aW50MzJfdCBhY3RpdmVJbnB1dHNDb3VudCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogcmV0dXJuIGlvIGhhbmRsZSBvZiBhY3RpdmUgaW5wdXQgb3IgMCBpZiBubyBpbnB1dCBpcyBhY3RpdmUKKyAgICAgKiBPbmx5IGNvbnNpZGVycyBpbnB1dHMgZnJvbSBwaHlzaWNhbCBkZXZpY2VzIChlLmcuIG1haW4gbWljLCBoZWFkc2V0IG1pYykgd2hlbgorICAgICAqIGlnbm9yZVZpcnR1YWxJbnB1dHMgaXMgdHJ1ZS4KKyAgICAgKi8KKyAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRBY3RpdmVJbnB1dChib29sIGlnbm9yZVZpcnR1YWxJbnB1dHMgPSB0cnVlKTsKKworICAgIGF1ZGlvX2RldmljZXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSkgY29uc3Q7CisKKyAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7Cit9OworCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBmNjIyZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaApAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiQXVkaW9Qb3J0LmgiCisjaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJT1Byb2ZpbGU7CitjbGFzcyBBdWRpb01peDsKK2NsYXNzIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlOworCisvLyBkZXNjcmlwdG9yIGZvciBhdWRpbyBvdXRwdXRzLiBVc2VkIHRvIG1haW50YWluIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvZiBlYWNoIG9wZW5lZCBhdWRpbyBvdXRwdXQKKy8vIGFuZCBrZWVwIHRyYWNrIG9mIHRoZSB1c2FnZSBvZiB0aGlzIG91dHB1dCBieSBlYWNoIGF1ZGlvIHN0cmVhbSB0eXBlLgorY2xhc3MgQXVkaW9PdXRwdXREZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnCit7CitwdWJsaWM6CisgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yKGNvbnN0IHNwPEF1ZGlvUG9ydD4mIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOworICAgIHZpcnR1YWwgfkF1ZGlvT3V0cHV0RGVzY3JpcHRvcigpIHt9CisKKyAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7CisgICAgdm9pZCAgICAgICAgbG9nKGNvbnN0IGNoYXIqIGluZGVudCk7CisKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldElkKCkgY29uc3Q7CisgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKCkgY29uc3Q7CisgICAgdmlydHVhbCBib29sIHNoYXJlc0h3TW9kdWxlV2l0aChjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MpOworICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IHN1cHBvcnRlZERldmljZXMoKTsKKyAgICB2aXJ0dWFsIGJvb2wgaXNEdXBsaWNhdGVkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0dWFsIHVpbnQzMl90IGxhdGVuY3koKSB7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBib29sIGlzRml4ZWRWb2x1bWUoYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisgICAgdmlydHVhbCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IHN1Yk91dHB1dDEoKSB7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IHN1Yk91dHB1dDIoKSB7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBib29sIHNldFZvbHVtZShmbG9hdCB2b2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSk7CisgICAgdmlydHVhbCB2b2lkIGNoYW5nZVJlZkNvdW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgZGVsdGEpOworCisgICAgYm9vbCBpc0FjdGl2ZSh1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworICAgIGJvb2wgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUgPSAwKSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CisgICAgdmlydHVhbCBzcDxBdWRpb1BvcnQ+IGdldEF1ZGlvUG9ydCgpIGNvbnN0IHsgcmV0dXJuIG1Qb3J0OyB9CisgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKKworICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBnZXRNb2R1bGVIYW5kbGUoKSBjb25zdDsKKworICAgIHNwPEF1ZGlvUG9ydD4gICAgICAgbVBvcnQ7CisgICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2U7ICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgZGV2aWNlIHRoaXMgb3V0cHV0IGlzIHJvdXRlZCB0bworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1QYXRjaEhhbmRsZTsKKyAgICB1aW50MzJfdCBtUmVmQ291bnRbQVVESU9fU1RSRUFNX0NOVF07IC8vIG51bWJlciBvZiBzdHJlYW1zIG9mIGVhY2ggdHlwZSB1c2luZyB0aGlzIG91dHB1dAorICAgIG5zZWNzX3QgbVN0b3BUaW1lW0FVRElPX1NUUkVBTV9DTlRdOworICAgIGZsb2F0IG1DdXJWb2x1bWVbQVVESU9fU1RSRUFNX0NOVF07ICAgLy8gY3VycmVudCBzdHJlYW0gdm9sdW1lIGluIGRCCisgICAgaW50IG1NdXRlQ291bnRbQVVESU9fU1RSRUFNX0NOVF07ICAgICAvLyBtdXRlIHJlcXVlc3QgY291bnRlcgorICAgIGJvb2wgbVN0cmF0ZWd5TXV0ZWRCeURldmljZVtOVU1fU1RSQVRFR0lFU107IC8vIHN0cmF0ZWdpZXMgbXV0ZWQgYmVjYXVzZSBvZiBpbmNvbXBhdGlibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXZpY2Ugc2VsZWN0aW9uLiBTZWUgY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcygpCisgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKm1DbGllbnRJbnRlcmZhY2U7CisKK3Byb3RlY3RlZDoKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1JZDsKK307CisKKy8vIEF1ZGlvIG91dHB1dCBkcml2ZW4gYnkgYSBzb2Z0d2FyZSBtaXhlciBpbiBhdWRpbyBmbGluZ2VyLgorY2xhc3MgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb091dHB1dERlc2NyaXB0b3IKK3sKK3B1YmxpYzoKKyAgICBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxJT1Byb2ZpbGU+JiBwcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOworICAgIHZpcnR1YWwgflN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKCkge30KKworICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKKworICAgIHZvaWQgc2V0SW9IYW5kbGUoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpOworCisgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKCkgY29uc3Q7CisgICAgdmlydHVhbCBib29sIHNoYXJlc0h3TW9kdWxlV2l0aChjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MpOworICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IHN1cHBvcnRlZERldmljZXMoKTsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGxhdGVuY3koKTsKKyAgICB2aXJ0dWFsIGJvb2wgaXNEdXBsaWNhdGVkKCkgY29uc3QgeyByZXR1cm4gKG1PdXRwdXQxICE9IE5VTEwgJiYgbU91dHB1dDIgIT0gTlVMTCk7IH0KKyAgICB2aXJ0dWFsIGJvb2wgaXNGaXhlZFZvbHVtZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICB2aXJ0dWFsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3ViT3V0cHV0MSgpIHsgcmV0dXJuIG1PdXRwdXQxOyB9CisgICAgdmlydHVhbCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IHN1Yk91dHB1dDIoKSB7IHJldHVybiBtT3V0cHV0MjsgfQorICAgIHZpcnR1YWwgdm9pZCBjaGFuZ2VSZWZDb3VudChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGRlbHRhKTsKKyAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKTsKKworICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKKworICAgIGNvbnN0IHNwPElPUHJvZmlsZT4gbVByb2ZpbGU7ICAgICAgICAgIC8vIEkvTyBwcm9maWxlIHRoaXMgb3V0cHV0IGRlcml2ZXMgZnJvbQorICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1Jb0hhbmRsZTsgICAgICAgICAgIC8vIG91dHB1dCBoYW5kbGUKKyAgICB1aW50MzJfdCBtTGF0ZW5jeTsgICAgICAgICAgICAgICAgICAvLworICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG1GbGFnczsgICAvLworICAgIEF1ZGlvTWl4ICptUG9saWN5TWl4OyAgICAgICAgICAgICAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQorICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtT3V0cHV0MTsgICAgLy8gdXNlZCBieSBkdXBsaWNhdGVkIG91dHB1dHM6IGZpcnN0IG91dHB1dAorICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtT3V0cHV0MjsgICAgLy8gdXNlZCBieSBkdXBsaWNhdGVkIG91dHB1dHM6IHNlY29uZCBvdXRwdXQKKyAgICB1aW50MzJfdCBtRGlyZWN0T3BlbkNvdW50OyAvLyBudW1iZXIgb2YgY2xpZW50cyB1c2luZyB0aGlzIG91dHB1dCAoZGlyZWN0IG91dHB1dHMgb25seSkKKyAgICB1aW50MzJfdCBtR2xvYmFsUmVmQ291bnQ7ICAvLyBub24tc3RyZWFtLXNwZWNpZmljIHJlZiBjb3VudAorfTsKKworY2xhc3MgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gOgorICAgICAgICBwdWJsaWMgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19pb19oYW5kbGVfdCwgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ID4KK3sKK3B1YmxpYzoKKyAgICBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworCisgICAgLyoqCisgICAgICogcmV0dXJuIHdoZXRoZXIgYSBzdHJlYW0gaXMgcGxheWluZyByZW1vdGVseSwgb3ZlcnJpZGUgdG8gY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mCisgICAgICogbG9jYWwvcmVtb3RlIHBsYXliYWNrLCB1c2VkIGZvciBpbnN0YW5jZSBieSBub3RpZmljYXRpb24gbWFuYWdlciB0byBub3QgbWFrZQorICAgICAqIG1lZGlhIHBsYXllcnMgbG9zZSBhdWRpbyBmb2N1cyB3aGVuIG5vdCBwbGF5aW5nIGxvY2FsbHkKKyAgICAgKiBGb3IgdGhlIGJhc2UgaW1wbGVtZW50YXRpb24sICJyZW1vdGVseSIgbWVhbnMgcGxheWluZyBkdXJpbmcgc2NyZWVuIG1pcnJvcmluZyB3aGljaAorICAgICAqIHVzZXMgYW4gb3V0cHV0IGZvciBwbGF5YmFjayB3aXRoIGEgbm9uLWVtcHR5LCBub24gIjAiIGFkZHJlc3MuCisgICAgICovCisgICAgYm9vbCBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworCisgICAgLyoqCisgICAgICogcmV0dXJucyB0aGUgQTJEUCBvdXRwdXQgaGFuZGxlIGlmIGl0IGlzIG9wZW4gb3IgMCBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRBMmRwT3V0cHV0KCkgY29uc3Q7CisKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZ2V0T3V0cHV0RnJvbUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0OworCisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGdldFByaW1hcnlPdXRwdXQoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIHJldHVybiB0cnVlIGlmIGFueSBvdXRwdXQgaXMgcGxheWluZyBhbnl0aGluZyBiZXNpZGVzIHRoZSBzdHJlYW0gdG8gaWdub3JlCisgICAgICovCisgICAgYm9vbCBpc0FueU91dHB1dEFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVRvSWdub3JlKSBjb25zdDsKKworICAgIGF1ZGlvX2RldmljZXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSkgY29uc3Q7CisKKyAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUGF0Y2guaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BhdGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg1ZjI1NwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BhdGNoLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQXVkaW9QYXRjaCA6IHB1YmxpYyBSZWZCYXNlCit7CitwdWJsaWM6CisgICAgQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLCB1aWRfdCB1aWQpOworCisgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CisKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtSGFuZGxlOworICAgIHN0cnVjdCBhdWRpb19wYXRjaCBtUGF0Y2g7CisgICAgdWlkX3QgbVVpZDsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtQWZQYXRjaEhhbmRsZTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgdm9sYXRpbGUgaW50MzJfdCBtTmV4dFVuaXF1ZUlkOworfTsKKworY2xhc3MgQXVkaW9QYXRjaENvbGxlY3Rpb24gOiBwdWJsaWMgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX3BhdGNoX2hhbmRsZV90LCBzcDxBdWRpb1BhdGNoPiA+Cit7CitwdWJsaWM6CisgICAgc3RhdHVzX3QgYWRkQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsIGNvbnN0IHNwPEF1ZGlvUGF0Y2g+JiBwYXRjaCk7CisKKyAgICBzdGF0dXNfdCByZW1vdmVBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisKKyAgICBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcykgY29uc3Q7CisKKyAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5TWl4LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lNaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTFmNGUxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5TWl4LmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjsKKworLyoqCisgKiBjdXN0b20gbWl4IGVudHJ5IGluIG1Qb2xpY3lNaXhlcworICovCitjbGFzcyBBdWRpb1BvbGljeU1peCA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICBBdWRpb1BvbGljeU1peCgpIHt9CisKKyAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJmdldE91dHB1dCgpIGNvbnN0OworCisgICAgdm9pZCBzZXRPdXRwdXQoc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ICZvdXRwdXQpOworCisgICAgdm9pZCBjbGVhck91dHB1dCgpOworCisgICAgYW5kcm9pZDo6QXVkaW9NaXggKmdldE1peCgpOworCisgICAgdm9pZCBzZXRNaXgoQXVkaW9NaXggJm1peCk7CisKK3ByaXZhdGU6CisgICAgQXVkaW9NaXggICAgbU1peDsgICAgICAgICAgICAgICAgICAgLy8gQXVkaW8gcG9saWN5IG1peCBkZXNjcmlwdG9yCisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG1PdXRwdXQ7ICAvLyBDb3JyZXNwb25kaW5nIG91dHB1dCBzdHJlYW0KK307CisKKworY2xhc3MgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uIDogcHVibGljIERlZmF1bHRLZXllZFZlY3RvcjxTdHJpbmc4LCBzcDxBdWRpb1BvbGljeU1peD4gPgoreworcHVibGljOgorICAgIHN0YXR1c190IGdldEF1ZGlvUG9saWN5TWl4KFN0cmluZzggYWRkcmVzcywgc3A8QXVkaW9Qb2xpY3lNaXg+ICZwb2xpY3lNaXgpIGNvbnN0OworCisgICAgc3RhdHVzX3QgcmVnaXN0ZXJNaXgoU3RyaW5nOCBhZGRyZXNzLCBBdWRpb01peCBtaXgpOworCisgICAgc3RhdHVzX3QgdW5yZWdpc3Rlck1peChTdHJpbmc4IGFkZHJlc3MpOworCisgICAgdm9pZCBjbG9zZU91dHB1dChzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJmRlc2MpOworCisgICAgLyoqCisgICAgICogVHJ5IHRvIGZpbmQgYW4gb3V0cHV0IGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBhdHRyaWJ1dGVzIHRvIGNvbnNpZGVyIGZvd3IgdGhlIHJlc2VhcmNoIG9mIG91dHB1dCBkZXNjcmlwdG9yLgorICAgICAqIEBwYXJhbVtvdXRdIGRlc2MgdG8gcmV0dXJuIGlmIGFuIG91dHB1dCBjb3VsZCBiZSBmb3VuZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgYW4gb3V0cHV0IHdhcyBmb3VuZCBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZSAoaW4gdGhpcyBjYXNlLCB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3Igb3V0cHV0IHBhcmFtIGlzIGluaXRpYWxpemVkKSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgICAgICovCisgICAgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ICZkZXNjKTsKKworICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZURldmljZVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peCAqKnBvbGljeU1peCk7CisKKyAgICBzdGF0dXNfdCBnZXRJbnB1dE1peEZvckF0dHIoYXVkaW9fYXR0cmlidXRlc190IGF0dHIsIEF1ZGlvTWl4ICoqcG9saWN5TWl4KTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb3J0LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZkZjViNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvcnQuaApAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSHdNb2R1bGU7CitjbGFzcyBBdWRpb0dhaW47CisKK2NsYXNzIEF1ZGlvUG9ydCA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKK3sKK3B1YmxpYzoKKyAgICBBdWRpb1BvcnQoY29uc3QgU3RyaW5nOCYgbmFtZSwgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKKyAgICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSk7CisgICAgdmlydHVhbCB+QXVkaW9Qb3J0KCkge30KKworICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpOworICAgIGJvb2wgaXNBdHRhY2hlZCgpIHsgcmV0dXJuIG1Nb2R1bGUgIT0gMDsgfQorCisgICAgc3RhdGljIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0TmV4dFVuaXF1ZUlkKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIGltcG9ydEF1ZGlvUG9ydChjb25zdCBzcDxBdWRpb1BvcnQ+IHBvcnQpOworICAgIHZvaWQgY2xlYXJDYXBhYmlsaXRpZXMoKTsKKworICAgIHZvaWQgbG9hZFNhbXBsaW5nUmF0ZXMoY2hhciAqbmFtZSk7CisgICAgdm9pZCBsb2FkRm9ybWF0cyhjaGFyICpuYW1lKTsKKyAgICB2b2lkIGxvYWRPdXRDaGFubmVscyhjaGFyICpuYW1lKTsKKyAgICB2b2lkIGxvYWRJbkNoYW5uZWxzKGNoYXIgKm5hbWUpOworCisgICAgYXVkaW9fZ2Fpbl9tb2RlX3QgbG9hZEdhaW5Nb2RlKGNoYXIgKm5hbWUpOworICAgIHZvaWQgbG9hZEdhaW4oY25vZGUgKnJvb3QsIGludCBpbmRleCk7CisgICAgdmlydHVhbCB2b2lkIGxvYWRHYWlucyhjbm9kZSAqcm9vdCk7CisKKyAgICAvLyBzZWFyY2hlcyBmb3IgYW4gZXhhY3QgbWF0Y2gKKyAgICBzdGF0dXNfdCBjaGVja0V4YWN0U2FtcGxpbmdSYXRlKHVpbnQzMl90IHNhbXBsaW5nUmF0ZSkgY29uc3Q7CisgICAgLy8gc2VhcmNoZXMgZm9yIGEgY29tcGF0aWJsZSBtYXRjaCwgYW5kIHJldHVybnMgdGhlIGJlc3QgbWF0Y2ggdmlhIHVwZGF0ZWRTYW1wbGluZ1JhdGUKKyAgICBzdGF0dXNfdCBjaGVja0NvbXBhdGlibGVTYW1wbGluZ1JhdGUodWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgdWludDMyX3QgKnVwZGF0ZWRTYW1wbGluZ1JhdGUpIGNvbnN0OworICAgIC8vIHNlYXJjaGVzIGZvciBhbiBleGFjdCBtYXRjaAorICAgIHN0YXR1c190IGNoZWNrRXhhY3RDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgY29uc3Q7CisgICAgLy8gc2VhcmNoZXMgZm9yIGEgY29tcGF0aWJsZSBtYXRjaCwgY3VycmVudGx5IGltcGxlbWVudGVkIGZvciBpbnB1dCBjaGFubmVsIG1hc2tzIG9ubHkKKyAgICBzdGF0dXNfdCBjaGVja0NvbXBhdGlibGVDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICp1cGRhdGVkQ2hhbm5lbE1hc2spIGNvbnN0OworCisgICAgc3RhdHVzX3QgY2hlY2tFeGFjdEZvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0OworICAgIC8vIHNlYXJjaGVzIGZvciBhIGNvbXBhdGlibGUgbWF0Y2gsIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBmb3IgaW5wdXQgZm9ybWF0cyBvbmx5CisgICAgc3RhdHVzX3QgY2hlY2tDb21wYXRpYmxlRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgYXVkaW9fZm9ybWF0X3QgKnVwZGF0ZWRGb3JtYXQpIGNvbnN0OworICAgIHN0YXR1c190IGNoZWNrR2Fpbihjb25zdCBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmdhaW5Db25maWcsIGludCBpbmRleCkgY29uc3Q7CisKKyAgICB1aW50MzJfdCBwaWNrU2FtcGxpbmdSYXRlKCkgY29uc3Q7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgcGlja0NoYW5uZWxNYXNrKCkgY29uc3Q7CisgICAgYXVkaW9fZm9ybWF0X3QgcGlja0Zvcm1hdCgpIGNvbnN0OworCisgICAgc3RhdGljIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IHNQY21Gb3JtYXRDb21wYXJlVGFibGVbXTsKKyAgICBzdGF0aWMgaW50IGNvbXBhcmVGb3JtYXRzKGNvbnN0IGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQxLCBjb25zdCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0MikgeworICAgICAgICByZXR1cm4gY29tcGFyZUZvcm1hdHMoKmZvcm1hdDEsICpmb3JtYXQyKTsKKyAgICB9CisgICAgc3RhdGljIGludCBjb21wYXJlRm9ybWF0cyhhdWRpb19mb3JtYXRfdCBmb3JtYXQxLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQyKTsKKworICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBnZXRNb2R1bGVIYW5kbGUoKSBjb25zdDsKKyAgICB1aW50MzJfdCBnZXRNb2R1bGVWZXJzaW9uKCkgY29uc3Q7CisgICAgY29uc3QgY2hhciAqZ2V0TW9kdWxlTmFtZSgpIGNvbnN0OworCisgICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3Q7CisgICAgdm9pZCBsb2coY29uc3QgY2hhciogaW5kZW50KSBjb25zdDsKKworICAgIFN0cmluZzggICAgICAgICAgIG1OYW1lOworICAgIGF1ZGlvX3BvcnRfdHlwZV90IG1UeXBlOworICAgIGF1ZGlvX3BvcnRfcm9sZV90IG1Sb2xlOworICAgIGJvb2wgICAgICAgICAgICAgIG1Vc2VJbkNoYW5uZWxNYXNrOworICAgIC8vIGJ5IGNvbnZlbnRpb24sICIwJyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gbVNhbXBsaW5nUmF0ZXMsIG1DaGFubmVsTWFza3Mgb3IgbUZvcm1hdHMKKyAgICAvLyBpbmRpY2F0ZXMgdGhlIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIHNob3VsZCBiZSByZWFkIGZyb20gdGhlIG91dHB1dCBzdHJlYW0KKyAgICAvLyBhZnRlciBpdCBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lCisgICAgVmVjdG9yIDx1aW50MzJfdD4gbVNhbXBsaW5nUmF0ZXM7IC8vIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcworICAgIFZlY3RvciA8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+IG1DaGFubmVsTWFza3M7IC8vIHN1cHBvcnRlZCBjaGFubmVsIG1hc2tzCisgICAgVmVjdG9yIDxhdWRpb19mb3JtYXRfdD4gbUZvcm1hdHM7IC8vIHN1cHBvcnRlZCBhdWRpbyBmb3JtYXRzCisgICAgVmVjdG9yIDwgc3A8QXVkaW9HYWluPiA+IG1HYWluczsgLy8gZ2FpbiBjb250cm9sbGVycworICAgIHNwPEh3TW9kdWxlPiBtTW9kdWxlOyAgICAgICAgICAgICAgICAgLy8gYXVkaW8gSFcgbW9kdWxlIGV4cG9zaW5nIHRoaXMgSS9PIHN0cmVhbQorICAgIHVpbnQzMl90IG1GbGFnczsgLy8gYXR0cmlidXRlIGZsYWdzIChlLmcgcHJpbWFyeSBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAvLyBkaXJlY3Qgb3V0cHV0Li4uKS4KKworcHJpdmF0ZToKKyAgICBzdGF0aWMgdm9sYXRpbGUgaW50MzJfdCBtTmV4dFVuaXF1ZUlkOworfTsKKworY2xhc3MgQXVkaW9Qb3J0Q29uZmlnIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQoreworcHVibGljOgorICAgIEF1ZGlvUG9ydENvbmZpZygpOworICAgIHZpcnR1YWwgfkF1ZGlvUG9ydENvbmZpZygpIHt9CisKKyAgICBzdGF0dXNfdCBhcHBseUF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqYmFja3VwQ29uZmlnID0gTlVMTCk7CisgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzcDxBdWRpb1BvcnQ+IGdldEF1ZGlvUG9ydCgpIGNvbnN0ID0gMDsKKyAgICB1aW50MzJfdCBtU2FtcGxpbmdSYXRlOworICAgIGF1ZGlvX2Zvcm1hdF90IG1Gb3JtYXQ7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbUNoYW5uZWxNYXNrOworICAgIHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyBtR2FpbjsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ29uZmlnUGFyc2luZ1V0aWxzLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ29uZmlnUGFyc2luZ1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhkMmNkZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Db25maWdQYXJzaW5nVXRpbHMuaApAQCAtMCwwICsxLDI3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIkh3TW9kdWxlLmgiCisjaW5jbHVkZSAiYXVkaW9fcG9saWN5X2NvbmYuaCIKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWZpbml0aW9ucyBmb3IgYXVkaW9fcG9saWN5LmNvbmYgZmlsZSBwYXJzaW5nCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0cnVjdCBTdHJpbmdUb0VudW0geworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgdWludDMyX3QgdmFsdWU7Cit9OworCisvLyBUT0RPOiBtb3ZlIHRvIGEgc2VwYXJhdGUgZmlsZS4gU2hvdWxkIGJlIGluIHN5bmMgd2l0aCBhdWRpby5oLgorI2RlZmluZSBTVFJJTkdfVE9fRU5VTShzdHJpbmcpIHsgI3N0cmluZywgKHVpbnQzMl90KXN0cmluZyB9IC8vIHVpbnQzMl90IGNhc3QgcmVtb3ZlcyB3YXJuaW5nCisjZGVmaW5lIE5BTUVfVE9fRU5VTShuYW1lLCB2YWx1ZSkgeyBuYW1lLCB2YWx1ZSB9CisjaWZuZGVmIEFSUkFZX1NJWkUKKyNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpCisjZW5kaWYKKworY29uc3QgU3RyaW5nVG9FbnVtIHNEZXZpY2VUeXBlVG9FbnVtVGFibGVbXSA9IHsKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ08pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FMTF9TQ08pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFApLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0hETUkpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FMTF9VU0IpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfTElORSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9IRE1JX0FSQyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9TUERJRiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9GTSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9BVVhfTElORSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9JUCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0FNQklFTlQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0FMTF9TQ08pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fQVVYX0RJR0lUQUwpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9IRE1JKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0FOTEdfRE9DS19IRUFEU0VUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fREdUTF9ET0NLX0hFQURTRVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9VU0JfQUNDRVNTT1JZKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fVFZfVFVORVIpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9MSU5FKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fU1BESUYpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0xPT1BCQUNLKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fSVApLAorfTsKKworY29uc3QgU3RyaW5nVG9FbnVtIHNEZXZpY2VOYW1lVG9FbnVtVGFibGVbXSA9IHsKKyAgICBOQU1FX1RPX0VOVU0oIkVhcnBpZWNlIiwgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSksCisgICAgTkFNRV9UT19FTlVNKCJTcGVha2VyIiwgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSwKKyAgICBOQU1FX1RPX0VOVU0oIlNwZWFrZXIgUHJvdGVjdGVkIiwgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpLAorICAgIE5BTUVfVE9fRU5VTSgiV2lyZWQgSGVhZHNldCIsIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVCksCisgICAgTkFNRV9UT19FTlVNKCJXaXJlZCBIZWFkcGhvbmVzIiwgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkUpLAorICAgIE5BTUVfVE9fRU5VTSgiQlQgU0NPIiwgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPKSwKKyAgICBOQU1FX1RPX0VOVU0oIkJUIFNDTyBIZWFkc2V0IiwgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQpLAorICAgIE5BTUVfVE9fRU5VTSgiQlQgU0NPIENhciBLaXQiLCBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUKSwKKyAgICBOQU1FX1RPX0VOVU0oIiIsIEFVRElPX0RFVklDRV9PVVRfQUxMX1NDTyksCisgICAgTkFNRV9UT19FTlVNKCJCVCBBMkRQIE91dCIsIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFApLAorICAgIE5BTUVfVE9fRU5VTSgiQlQgQTJEUCBIZWFkcGhvbmVzIiwgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTKSwKKyAgICBOQU1FX1RPX0VOVU0oIkJUIEEyRFAgU3BlYWtlciIsIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiksCisgICAgTkFNRV9UT19FTlVNKCIiLCBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSwKKyAgICBOQU1FX1RPX0VOVU0oIkhETUkgT3V0IiwgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTCksCisgICAgTkFNRV9UT19FTlVNKCJIRE1JIE91dCIsIEFVRElPX0RFVklDRV9PVVRfSERNSSksCisgICAgTkFNRV9UT19FTlVNKCJBbmFsb2cgRG9jayBPdXQiLCBBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUKSwKKyAgICBOQU1FX1RPX0VOVU0oIkRpZ2l0YWwgRG9jayBPdXQiLCBBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUKSwKKyAgICBOQU1FX1RPX0VOVU0oIlVTQiBIb3N0IE91dCIsIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWSksCisgICAgTkFNRV9UT19FTlVNKCJVU0IgRGV2aWNlIE91dCIsIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRSksCisgICAgTkFNRV9UT19FTlVNKCIiLCBBVURJT19ERVZJQ0VfT1VUX0FMTF9VU0IpLAorICAgIE5BTUVfVE9fRU5VTSgiUmVyb3V0ZSBTdWJtaXggT3V0IiwgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSwKKyAgICBOQU1FX1RPX0VOVU0oIlRlbGVwaG9ueSBUeCIsIEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYKSwKKyAgICBOQU1FX1RPX0VOVU0oIkxpbmUgT3V0IiwgQVVESU9fREVWSUNFX09VVF9MSU5FKSwKKyAgICBOQU1FX1RPX0VOVU0oIkhETUkgQVJDIE91dCIsIEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkMpLAorICAgIE5BTUVfVE9fRU5VTSgiUy9QRElGIE91dCIsIEFVRElPX0RFVklDRV9PVVRfU1BESUYpLAorICAgIE5BTUVfVE9fRU5VTSgiRk0gdHJhbnNjZWl2ZXIgT3V0IiwgQVVESU9fREVWSUNFX09VVF9GTSksCisgICAgTkFNRV9UT19FTlVNKCJBdXggTGluZSBPdXQiLCBBVURJT19ERVZJQ0VfT1VUX0FVWF9MSU5FKSwKKyAgICBOQU1FX1RPX0VOVU0oIklQIE91dCIsIEFVRElPX0RFVklDRV9PVVRfSVApLAorICAgIE5BTUVfVE9fRU5VTSgiQW1iaWVudCBNaWMiLCBBVURJT19ERVZJQ0VfSU5fQU1CSUVOVCksCisgICAgTkFNRV9UT19FTlVNKCJCdWlsdC1JbiBNaWMiLCBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpLAorICAgIE5BTUVfVE9fRU5VTSgiQlQgU0NPIEhlYWRzZXQgTWljIiwgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCksCisgICAgTkFNRV9UT19FTlVNKCIiLCBBVURJT19ERVZJQ0VfSU5fQUxMX1NDTyksCisgICAgTkFNRV9UT19FTlVNKCJXaXJlZCBIZWFkc2V0IE1pYyIsIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSwKKyAgICBOQU1FX1RPX0VOVU0oIkhETUkgSW4iLCBBVURJT19ERVZJQ0VfSU5fQVVYX0RJR0lUQUwpLAorICAgIE5BTUVfVE9fRU5VTSgiSERNSSBJbiIsIEFVRElPX0RFVklDRV9JTl9IRE1JKSwKKyAgICBOQU1FX1RPX0VOVU0oIlRlbGVwaG9ueSBSeCIsIEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgpLAorICAgIE5BTUVfVE9fRU5VTSgiVGVsZXBob255IFJ4IiwgQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEwpLAorICAgIE5BTUVfVE9fRU5VTSgiQnVpbHQtSW4gQmFjayBNaWMiLCBBVURJT19ERVZJQ0VfSU5fQkFDS19NSUMpLAorICAgIE5BTUVfVE9fRU5VTSgiUmVyb3V0ZSBTdWJtaXggSW4iLCBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCksCisgICAgTkFNRV9UT19FTlVNKCJBbmFsb2cgRG9jayBJbiIsIEFVRElPX0RFVklDRV9JTl9BTkxHX0RPQ0tfSEVBRFNFVCksCisgICAgTkFNRV9UT19FTlVNKCJEaWdpdGFsIERvY2sgSW4iLCBBVURJT19ERVZJQ0VfSU5fREdUTF9ET0NLX0hFQURTRVQpLAorICAgIE5BTUVfVE9fRU5VTSgiVVNCIEhvc3QgSW4iLCBBVURJT19ERVZJQ0VfSU5fVVNCX0FDQ0VTU09SWSksCisgICAgTkFNRV9UT19FTlVNKCJVU0IgRGV2aWNlIEluIiwgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UpLAorICAgIE5BTUVfVE9fRU5VTSgiRk0gVHVuZXIgSW4iLCBBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIpLAorICAgIE5BTUVfVE9fRU5VTSgiVFYgVHVuZXIgSW4iLCBBVURJT19ERVZJQ0VfSU5fVFZfVFVORVIpLAorICAgIE5BTUVfVE9fRU5VTSgiTGluZSBJbiIsIEFVRElPX0RFVklDRV9JTl9MSU5FKSwKKyAgICBOQU1FX1RPX0VOVU0oIlMvUERJRiBJbiIsIEFVRElPX0RFVklDRV9JTl9TUERJRiksCisgICAgTkFNRV9UT19FTlVNKCJCVCBBMkRQIEluIiwgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSwKKyAgICBOQU1FX1RPX0VOVU0oIkxvb3BiYWNrIEluIiwgQVVESU9fREVWSUNFX0lOX0xPT1BCQUNLKSwKKyAgICBOQU1FX1RPX0VOVU0oIklQIEluIiwgQVVESU9fREVWSUNFX0lOX0lQKSwKK307CisKK2NvbnN0IFN0cmluZ1RvRW51bSBzT3V0cHV0RmxhZ05hbWVUb0VudW1UYWJsZVtdID0geworICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVIpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX05PTl9CTE9DS0lORyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfVFRTKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19PVVRQVVRfRkxBR19SQVcpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX1NZTkMpLAorfTsKKworY29uc3QgU3RyaW5nVG9FbnVtIHNJbnB1dEZsYWdOYW1lVG9FbnVtVGFibGVbXSA9IHsKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19JTlBVVF9GTEFHX0ZBU1QpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0lOUFVUX0ZMQUdfSFdfSE9UV09SRCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fSU5QVVRfRkxBR19SQVcpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0lOUFVUX0ZMQUdfU1lOQyksCit9OworCitjb25zdCBTdHJpbmdUb0VudW0gc0Zvcm1hdE5hbWVUb0VudW1UYWJsZVtdID0geworICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNXzhfQklUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNXzMyX0JJVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1BDTV84XzI0X0JJVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1BDTV9GTE9BVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfTVAzKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX01BSU4pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTEMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfU1NSKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0xUUCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19IRV9WMSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19TQ0FMQUJMRSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19FUkxDKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0xEKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0hFX1YyKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0VMRCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1ZPUkJJUyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0hFX0FBQ19WMSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0hFX0FBQ19WMiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX09QVVMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQzMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9FX0FDMyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0RUUyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0RUU19IRCksCit9OworCitjb25zdCBTdHJpbmdUb0VudW0gc091dENoYW5uZWxzTmFtZVRvRW51bVRhYmxlW10gPSB7CisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX09VVF9RVUFEKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX09VVF81UE9JTlQxKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX09VVF83UE9JTlQxKSwKK307CisKK2NvbnN0IFN0cmluZ1RvRW51bSBzSW5DaGFubmVsc05hbWVUb0VudW1UYWJsZVtdID0geworICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfSU5fTU9OTyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSyksCit9OworCitjb25zdCBTdHJpbmdUb0VudW0gc0luZGV4Q2hhbm5lbHNOYW1lVG9FbnVtVGFibGVbXSA9IHsKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18zKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzUpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS182KSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzgpLAorfTsKKworY29uc3QgU3RyaW5nVG9FbnVtIHNHYWluTW9kZU5hbWVUb0VudW1UYWJsZVtdID0geworICAgIFNUUklOR19UT19FTlVNKEFVRElPX0dBSU5fTU9ERV9KT0lOVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fR0FJTl9NT0RFX0NIQU5ORUxTKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19HQUlOX01PREVfUkFNUCksCit9OworCitjbGFzcyBDb25maWdQYXJzaW5nVXRpbHMKK3sKK3B1YmxpYzoKKyAgICBzdGF0aWMgdWludDMyX3Qgc3RyaW5nVG9FbnVtKGNvbnN0IHN0cnVjdCBTdHJpbmdUb0VudW0gKnRhYmxlLAorICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZW51bVRvU3RyaW5nKGNvbnN0IHN0cnVjdCBTdHJpbmdUb0VudW0gKnRhYmxlLAorICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSk7CisgICAgc3RhdGljIGJvb2wgc3RyaW5nVG9Cb29sKGNvbnN0IGNoYXIgKnZhbHVlKTsKKyAgICBzdGF0aWMgdWludDMyX3QgcGFyc2VPdXRwdXRGbGFnTmFtZXMoY2hhciAqbmFtZSk7CisgICAgc3RhdGljIHVpbnQzMl90IHBhcnNlSW5wdXRGbGFnTmFtZXMoY2hhciAqbmFtZSk7CisgICAgc3RhdGljIGF1ZGlvX2RldmljZXNfdCBwYXJzZURldmljZU5hbWVzKGNoYXIgKm5hbWUpOworCisgICAgc3RhdGljIHZvaWQgbG9hZEh3TW9kdWxlcyhjbm9kZSAqcm9vdCwgSHdNb2R1bGVDb2xsZWN0aW9uICZod01vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZUlucHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+ICZkZWZhdWx0T3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJmlzU3BlYWtlckRyY0VuYWJsZWQpOworCisgICAgc3RhdGljIHZvaWQgbG9hZEdsb2JhbENvbmZpZyhjbm9kZSAqcm9vdCwgY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZUlucHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+ICZkZWZhdWx0T3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJmlzU3BlYWtlckRyY0VuYWJsZWQpOworCisgICAgc3RhdGljIHN0YXR1c190IGxvYWRBdWRpb1BvbGljeUNvbmZpZyhjb25zdCBjaGFyICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHdNb2R1bGVDb2xsZWN0aW9uICZod01vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZUlucHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+ICZkZWZhdWx0T3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJmlzU3BlYWtlckRyY0VuYWJsZWQpOworCitwcml2YXRlOgorICAgIHN0YXRpYyB2b2lkIGxvYWRId01vZHVsZShjbm9kZSAqcm9vdCwgSHdNb2R1bGVDb2xsZWN0aW9uICZod01vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlSW5wdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZU91dHB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+ICZkZWZhdWx0T3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmaXNTcGVha2VyRHJjRW5hYmxlZCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQyZWNlNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiQXVkaW9Qb3J0LmgiCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRGV2aWNlRGVzY3JpcHRvciA6IHB1YmxpYyBBdWRpb1BvcnQsIHB1YmxpYyBBdWRpb1BvcnRDb25maWcKK3sKK3B1YmxpYzoKKyAgICBEZXZpY2VEZXNjcmlwdG9yKGF1ZGlvX2RldmljZXNfdCB0eXBlKTsKKworICAgIHZpcnR1YWwgfkRldmljZURlc2NyaXB0b3IoKSB7fQorCisgICAgYm9vbCBlcXVhbHMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIG90aGVyKSBjb25zdDsKKworICAgIC8vIEF1ZGlvUG9ydENvbmZpZworICAgIHZpcnR1YWwgc3A8QXVkaW9Qb3J0PiBnZXRBdWRpb1BvcnQoKSBjb25zdCB7IHJldHVybiAoQXVkaW9Qb3J0KikgdGhpczsgfQorICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CisKKyAgICAvLyBBdWRpb1BvcnQKKyAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoKGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKTsKKyAgICB2aXJ0dWFsIHZvaWQgbG9hZEdhaW5zKGNub2RlICpyb290KTsKKyAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBpbXBvcnRBdWRpb1BvcnQoY29uc3Qgc3A8QXVkaW9Qb3J0PiBwb3J0KTsKKworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0SWQoKSBjb25zdDsKKyAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VUeXBlOyB9CisgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CisgICAgdm9pZCBsb2coKSBjb25zdDsKKworICAgIFN0cmluZzggbVRhZzsKKyAgICBTdHJpbmc4IG1BZGRyZXNzOworCitwcml2YXRlOgorICAgIGF1ZGlvX2RldmljZXNfdCAgICAgbURldmljZVR5cGU7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtSWQ7CisKK2ZyaWVuZCBjbGFzcyBEZXZpY2VWZWN0b3I7Cit9OworCitjbGFzcyBEZXZpY2VWZWN0b3IgOiBwdWJsaWMgU29ydGVkVmVjdG9yPCBzcDxEZXZpY2VEZXNjcmlwdG9yPiA+Cit7CitwdWJsaWM6CisgICAgRGV2aWNlVmVjdG9yKCkgOiBTb3J0ZWRWZWN0b3IoKSwgbURldmljZVR5cGVzKEFVRElPX0RFVklDRV9OT05FKSB7fQorCisgICAgc3NpemVfdCBhZGQoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pOworICAgIHNzaXplX3QgcmVtb3ZlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKTsKKyAgICBzc2l6ZV90IGluZGV4T2YoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pIGNvbnN0OworCisgICAgYXVkaW9fZGV2aWNlc190IHR5cGVzKCkgY29uc3QgeyByZXR1cm4gbURldmljZVR5cGVzOyB9CisKKyAgICB2b2lkIGxvYWREZXZpY2VzRnJvbVR5cGUoYXVkaW9fZGV2aWNlc190IHR5cGVzKTsKKyAgICB2b2lkIGxvYWREZXZpY2VzRnJvbVRhZyhjaGFyICp0YWcsIGNvbnN0IERldmljZVZlY3RvciYgZGVjbGFyZWREZXZpY2VzKTsKKworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZShhdWRpb19kZXZpY2VzX3QgdHlwZSwgU3RyaW5nOCBhZGRyZXNzKSBjb25zdDsKKyAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0Zyb21UeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlcykgY29uc3Q7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlRnJvbUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0OworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZUZyb21UYWcoY29uc3QgU3RyaW5nOCYgdGFnKSBjb25zdDsKKyAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0Zyb21UeXBlQWRkcihhdWRpb19kZXZpY2VzX3QgdHlwZSwgU3RyaW5nOCBhZGRyZXNzKSBjb25zdDsKKworICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRnJvbUh3TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGVIYW5kbGUpIGNvbnN0OworCisgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2RGVzYykgY29uc3Q7CisKKyAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgU3RyaW5nOCAmZGlyZWN0aW9uKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICB2b2lkIHJlZnJlc2hUeXBlcygpOworICAgIGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlVHlwZXM7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0VmZmVjdERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9FZmZlY3REZXNjcmlwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk3ODNhMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9FZmZlY3REZXNjcmlwdG9yLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworCitjbGFzcyBFZmZlY3REZXNjcmlwdG9yIDogcHVibGljIFJlZkJhc2UKK3sKK3B1YmxpYzoKKyAgICBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgICBpbnQgbUlvOyAgICAgICAgICAgICAgICAvLyBpbyB0aGUgZWZmZWN0IGlzIGF0dGFjaGVkIHRvCisgICAgcm91dGluZ19zdHJhdGVneSBtU3RyYXRlZ3k7IC8vIHJvdXRpbmcgc3RyYXRlZ3kgdGhlIGVmZmVjdCBpcyBhc3NvY2lhdGVkIHRvCisgICAgaW50IG1TZXNzaW9uOyAgICAgICAgICAgICAgIC8vIGF1ZGlvIHNlc3Npb24gdGhlIGVmZmVjdCBpcyBvbgorICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgbURlc2M7ICAvLyBlZmZlY3QgZGVzY3JpcHRvcgorICAgIGJvb2wgbUVuYWJsZWQ7ICAgICAgICAgICAgICAvLyBlbmFibGVkIHN0YXRlOiBDUFUgbG9hZCBiZWluZyB1c2VkIG9yIG5vdAorfTsKKworY2xhc3MgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gOiBwdWJsaWMgS2V5ZWRWZWN0b3I8aW50LCBzcDxFZmZlY3REZXNjcmlwdG9yPiA+Cit7CitwdWJsaWM6CisgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24oKTsKKworICAgIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LCBpbnQgc2Vzc2lvbiwgaW50IGlkKTsKKyAgICBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCk7CisgICAgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCk7CisgICAgdWludDMyX3QgZ2V0TWF4RWZmZWN0c0NwdUxvYWQoKSBjb25zdDsKKyAgICB1aW50MzJfdCBnZXRNYXhFZmZlY3RzTWVtb3J5KCkgY29uc3Q7CisgICAgYm9vbCBpc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpOworCisgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworCitwcml2YXRlOgorICAgIHN0YXR1c190IHNldEVmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4gJmVmZmVjdERlc2MsIGJvb2wgZW5hYmxlZCk7CisKKyAgICB1aW50MzJfdCBtVG90YWxFZmZlY3RzQ3B1TG9hZDsgLy8gY3VycmVudCBDUFUgbG9hZCB1c2VkIGJ5IGVmZmVjdHMKKyAgICB1aW50MzJfdCBtVG90YWxFZmZlY3RzTWVtb3J5OyAgLy8gY3VycmVudCBtZW1vcnkgdXNlZCBieSBlZmZlY3RzCisKKyAgICAvKioKKyAgICAgKiBNYXhpbXVtIENQVSBsb2FkIGFsbG9jYXRlZCB0byBhdWRpbyBlZmZlY3RzIGluIDAuMSBNSVBTIChBUk12NVRFLCAwIFdTIG1lbW9yeSkgdW5pdHMKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX0VGRkVDVFNfQ1BVX0xPQUQgPSAxMDAwOworICAgIC8qKgorICAgICAqIE1heGltdW0gbWVtb3J5IGFsbG9jYXRlZCB0byBhdWRpbyBlZmZlY3RzIGluIEtCCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9FRkZFQ1RTX01FTU9SWSA9IDUxMjsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSHdNb2R1bGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYzNlYTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSHdNb2R1bGUuaApAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSU9Qcm9maWxlOworCitjbGFzcyBId01vZHVsZSA6IHB1YmxpYyBSZWZCYXNlCit7CitwdWJsaWM6CisgICAgSHdNb2R1bGUoY29uc3QgY2hhciAqbmFtZSk7CisgICAgfkh3TW9kdWxlKCk7CisKKyAgICBzdGF0dXNfdCBsb2FkT3V0cHV0KGNub2RlICpyb290KTsKKyAgICBzdGF0dXNfdCBsb2FkSW5wdXQoY25vZGUgKnJvb3QpOworICAgIHN0YXR1c190IGxvYWREZXZpY2UoY25vZGUgKnJvb3QpOworCisgICAgc3RhdHVzX3QgYWRkT3V0cHV0UHJvZmlsZShTdHJpbmc4IG5hbWUsIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBTdHJpbmc4IGFkZHJlc3MpOworICAgIHN0YXR1c190IHJlbW92ZU91dHB1dFByb2ZpbGUoU3RyaW5nOCBuYW1lKTsKKyAgICBzdGF0dXNfdCBhZGRJbnB1dFByb2ZpbGUoU3RyaW5nOCBuYW1lLCBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgU3RyaW5nOCBhZGRyZXNzKTsKKyAgICBzdGF0dXNfdCByZW1vdmVJbnB1dFByb2ZpbGUoU3RyaW5nOCBuYW1lKTsKKworICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBnZXRIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtSGFuZGxlOyB9CisKKyAgICB2b2lkIGR1bXAoaW50IGZkKTsKKworICAgIGNvbnN0IGNoYXIgKmNvbnN0ICAgICAgICBtTmFtZTsgLy8gYmFzZSBuYW1lIG9mIHRoZSBhdWRpbyBIVyBtb2R1bGUgKHByaW1hcnksIGEyZHAgLi4uKQorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBtSGFsVmVyc2lvbjsgLy8gYXVkaW8gSEFMIEFQSSB2ZXJzaW9uCisgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90ICAgIG1IYW5kbGU7CisgICAgVmVjdG9yIDwgc3A8SU9Qcm9maWxlPiA+IG1PdXRwdXRQcm9maWxlczsgLy8gb3V0cHV0IHByb2ZpbGVzIGV4cG9zZWQgYnkgdGhpcyBtb2R1bGUKKyAgICBWZWN0b3IgPCBzcDxJT1Byb2ZpbGU+ID4gbUlucHV0UHJvZmlsZXM7ICAvLyBpbnB1dCBwcm9maWxlcyBleHBvc2VkIGJ5IHRoaXMgbW9kdWxlCisgICAgRGV2aWNlVmVjdG9yICAgICAgICAgICAgIG1EZWNsYXJlZERldmljZXM7IC8vIGRldmljZXMgZGVjbGFyZWQgaW4gYXVkaW9fcG9saWN5LmNvbmYKK307CisKK2NsYXNzIEh3TW9kdWxlQ29sbGVjdGlvbiA6IHB1YmxpYyBWZWN0b3I8IHNwPEh3TW9kdWxlPiA+Cit7CitwdWJsaWM6CisgICAgc3A8SHdNb2R1bGU+IGdldE1vZHVsZUZyb21OYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0OworCisgICAgc3AgPEh3TW9kdWxlPiBnZXRNb2R1bGVGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3Q7CisKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiAgZ2V0RGV2aWNlRGVzY3JpcHRvcihjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKSBjb25zdDsKKworICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI2ZmNjMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JT1Byb2ZpbGUuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJBdWRpb1BvcnQuaCIKKyNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEh3TW9kdWxlOworCisvLyB0aGUgSU9Qcm9maWxlIGNsYXNzIGRlc2NyaWJlcyB0aGUgY2FwYWJpbGl0aWVzIG9mIGFuIG91dHB1dCBvciBpbnB1dCBzdHJlYW0uCisvLyBJdCBpcyBjdXJyZW50bHkgYXNzdW1lZCB0aGF0IGFsbCBjb21iaW5hdGlvbiBvZiBsaXN0ZWQgcGFyYW1ldGVycyBhcmUgc3VwcG9ydGVkLgorLy8gSXQgaXMgdXNlZCBieSB0aGUgcG9saWN5IG1hbmFnZXIgdG8gZGV0ZXJtaW5lIGlmIGFuIG91dHB1dCBvciBpbnB1dCBpcyBzdWl0YWJsZSBmb3IKKy8vIGEgZ2l2ZW4gdXNlIGNhc2UsICBvcGVuL2Nsb3NlIGl0IGFjY29yZGluZ2x5IGFuZCBjb25uZWN0L2Rpc2Nvbm5lY3QgYXVkaW8gdHJhY2tzCisvLyB0by9mcm9tIGl0LgorY2xhc3MgSU9Qcm9maWxlIDogcHVibGljIEF1ZGlvUG9ydAoreworcHVibGljOgorICAgIElPUHJvZmlsZShjb25zdCBTdHJpbmc4JiBuYW1lLCBhdWRpb19wb3J0X3JvbGVfdCByb2xlKTsKKyAgICB2aXJ0dWFsIH5JT1Byb2ZpbGUoKTsKKworICAgIC8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIGJvdGggb3V0cHV0IGFuZCBpbnB1dC4KKyAgICAvLyBJZiBwYXJhbWV0ZXIgdXBkYXRlZFNhbXBsaW5nUmF0ZSBpcyBub24tTlVMTCwgaXQgaXMgYXNzaWduZWQgdGhlIGFjdHVhbCBzYW1wbGUgcmF0ZS4KKyAgICAvLyBGb3IgaW5wdXQsIGZsYWdzIGlzIGludGVycHJldGVkIGFzIGF1ZGlvX2lucHV0X2ZsYWdzX3QuCisgICAgLy8gVE9ETzogbWVyZ2UgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgYW5kIGF1ZGlvX2lucHV0X2ZsYWdzX3QuCisgICAgYm9vbCBpc0NvbXBhdGlibGVQcm9maWxlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqdXBkYXRlZFNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqdXBkYXRlZEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICp1cGRhdGVkQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKSBjb25zdDsKKworICAgIHZvaWQgZHVtcChpbnQgZmQpOworICAgIHZvaWQgbG9nKCk7CisKKyAgICBEZXZpY2VWZWN0b3IgIG1TdXBwb3J0ZWREZXZpY2VzOyAvLyBzdXBwb3J0ZWQgZGV2aWNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChkZXZpY2VzIHRoaXMgb3V0cHV0IGNhbiBiZSByb3V0ZWQgdG8pCit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1Nlc3Npb25Sb3V0ZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1Nlc3Npb25Sb3V0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZmVhZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2Vzc2lvblJvdXRlLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERldmljZURlc2NyaXB0b3I7CisKK2NsYXNzIFNlc3Npb25Sb3V0ZSA6IHB1YmxpYyBSZWZCYXNlCit7CitwdWJsaWM6CisgICAgLy8gRm9yIElucHV0IChTb3VyY2UpIHJvdXRlcywgdXNlIFNUUkVBTV9UWVBFX05BICgiTkEiID0gIm5vdCBhcHBsaWNhYmxlKWZvciB0aGUKKyAgICAvLyBzdHJlYW1UeXBlIGFyZ3VtZW50CisgICAgc3RhdGljIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgU1RSRUFNX1RZUEVfTkEgPSBBVURJT19TVFJFQU1fREVGQVVMVDsKKworICAgIC8vIEZvciBPdXRwdXQgKFNpbmspIHJvdXRlcywgdXNlIFNPVVJDRV9UWVBFX05BICgiTkEiID0gIm5vdCBhcHBsaWNhYmxlIikgZm9yIHRoZQorICAgIC8vIHNvdXJjZSBhcmd1bWVudAorCisgICAgc3RhdGljIGNvbnN0IGF1ZGlvX3NvdXJjZV90IFNPVVJDRV9UWVBFX05BID0gQVVESU9fU09VUkNFX0RFRkFVTFQ7CisKKyAgICBTZXNzaW9uUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCisgICAgICAgIDogbVVpZCh1aWQpLAorICAgICAgICAgIG1TZXNzaW9uKHNlc3Npb24pLAorICAgICAgICAgIG1EZXZpY2VEZXNjcmlwdG9yKGRldmljZURlc2NyaXB0b3IpLAorICAgICAgICAgIG1SZWZDb3VudCgwKSwKKyAgICAgICAgICBtQWN0aXZpdHlDb3VudCgwKSwKKyAgICAgICAgICBtQ2hhbmdlZChmYWxzZSksCisgICAgICAgICAgbVN0cmVhbVR5cGUoc3RyZWFtVHlwZSksCisgICAgICAgICAgbVNvdXJjZShzb3VyY2UpCisgICAge30KKworICAgIHZvaWQgbG9nKGNvbnN0IGNoYXIqIHByZWZpeCk7CisKKyAgICBib29sIGlzQWN0aXZlKCkgeworICAgICAgICByZXR1cm4gKG1EZXZpY2VEZXNjcmlwdG9yICE9IDApICYmIChtQ2hhbmdlZCB8fCAobUFjdGl2aXR5Q291bnQgPiAwKSk7CisgICAgfQorCisgICAgdWlkX3QgICAgICAgICAgICAgICAgICAgICAgIG1VaWQ7CisgICAgYXVkaW9fc2Vzc2lvbl90ICAgICAgICAgICAgIG1TZXNzaW9uOworICAgIHNwPERldmljZURlc2NyaXB0b3I+ICAgICAgICBtRGV2aWNlRGVzY3JpcHRvcjsKKworICAgIC8vICJyZWZlcmVuY2UiIGNvdW50aW5nCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWZDb3VudDsgICAgICAvLyArLy0gb24gcmVmZXJlbmNlcworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHlDb3VudDsgLy8gKy8tIG9uIHN0YXJ0L3N0b3AKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5nZWQ7CisgICAgLy8gZm9yIG91dHB1dHMKKyAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICAgbVN0cmVhbVR5cGU7CisgICAgLy8gZm9yIGlucHV0cworICAgIGNvbnN0IGF1ZGlvX3NvdXJjZV90ICAgICAgICBtU291cmNlOworfTsKKworY2xhc3MgU2Vzc2lvblJvdXRlTWFwOiBwdWJsaWMgS2V5ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90LCBzcDxTZXNzaW9uUm91dGU+ID4KK3sKK3B1YmxpYzoKKyAgICAvLyBUaGVzZSBjb25zdGFudHMgaWRlbnRpZnkgdGhlIFNlc3Npb25Sb3V0TWFwIGFzIGhvbGRpbmcgRUlUSEVSIGlucHV0IHJvdXRlcywKKyAgICAvLyBvciBvdXRwdXQgcm91dGVzLiAgQW4gZXJyb3Igd2lsbCBvY2N1ciBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gYWRkIGEgU2Vzc2lvblJvdXRlCisgICAgLy8gb2JqZWN0IHdpdGggbVN0cmVhbVR5cGUgPT0gU1RSRUFNX1RZUEVfTkEgKGkuZS4gYW4gaW5wdXQgU2Vzc2lvblJvdXRlKSB0byBhCisgICAgLy8gU2Vzc2lvblJvdXRNYXAgdGhhdCBpcyBtYXJrZWQgZm9yIG91dHB1dCAoaS5lLiBtTWFwVHlwZSA9PSBTRVNTSU9OX1JPVVRFX01BUF9PVVRQVVQpCisgICAgLy8gYW5kIHNpbWlsYXJseSAgZm9yIG91dHB1dCBTZXNzaW9uUm91dGVzIGFuZCBJbnB1dCBTZXNzaW9uUm91dGVNYXBzLgorICAgIHR5cGVkZWYgZW51bQorICAgIHsKKyAgICAgICAgTUFQVFlQRV9JTlBVVCA9IDAsCisgICAgICAgIE1BUFRZUEVfT1VUUFVUID0gMQorICAgIH0gc2Vzc2lvbl9yb3V0ZV9tYXBfdHlwZV90OworCisgICAgU2Vzc2lvblJvdXRlTWFwKHNlc3Npb25fcm91dGVfbWFwX3R5cGVfdCBtYXBUeXBlKSA6CisgICAgICAgIG1NYXBUeXBlKG1hcFR5cGUpCisgICAge30KKworICAgIGJvb2wgaGFzUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworCisgICAgdm9pZCByZW1vdmVSb3V0ZShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisKKyAgICBpbnQgaW5jUm91dGVBY3Rpdml0eShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgaW50IGRlY1JvdXRlQWN0aXZpdHkoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgIGJvb2wgaGFzUm91dGVDaGFuZ2VkKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsgLy8gYWxzbyBjbGVhcnMgdGhlIGNoYW5nZWQgZmxhZworICAgIHZvaWQgbG9nKGNvbnN0IGNoYXIqIGNhcHRpb24pOworCisgICAgLy8gU3BlY2lmeSBhbiBPdXRwdXQoU2luaykgcm91dGUgYnkgcGFzc2luZyBTZXNzaW9uUm91dGU6OlNPVVJDRV9UWVBFX05BIGluIHRoZQorICAgIC8vIHNvdXJjZSBhcmd1bWVudC4KKyAgICAvLyBTcGVjaWZ5IGFuIElucHV0KFNvdXJjZSkgcm91dCBieSBwYXNzaW5nIFNlc3Npb25Sb3V0ZTo6QVVESU9fU1RSRUFNX0RFRkFVTFQKKyAgICAvLyBpbiB0aGUgc3RyZWFtVHlwZSBhcmd1bWVudC4KKyAgICB2b2lkIGFkZFJvdXRlKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCk7CisKK3ByaXZhdGU6CisgICAgLy8gVXNlZCB0byBtYXJrIGEgU2Vzc2lvblJvdXRlIGFzIGZvciBlaXRoZXIgaW5wdXRzIChtTWFwVHlwZSA9PSBrU2Vzc2lvblJvdXRlTWFwX0lucHV0KQorICAgIC8vIG9yIG91dHB1dHMgKG1NYXBUeXBlID09IGtTZXNzaW9uUm91dGVNYXBfT3V0cHV0KQorICAgIGNvbnN0IHNlc3Npb25fcm91dGVfbWFwX3R5cGVfdCBtTWFwVHlwZTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUZhY3RvcnkuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1NvdW5kVHJpZ2dlclNlc3Npb24uaApzaW1pbGFyaXR5IGluZGV4IDYwJQpjb3B5IGZyb20gc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcApjb3B5IHRvIHNlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Tb3VuZFRyaWdnZXJTZXNzaW9uLmgKaW5kZXggMmFlN2JjMS4uNDIwZTZkNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU291bmRUcmlnZ2VyU2Vzc2lvbi5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTkgKzE0LDIwIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSAiQXVkaW9Qb2xpY3lNYW5hZ2VyLmgiCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotZXh0ZXJuICJDIiBBdWRpb1BvbGljeUludGVyZmFjZSogY3JlYXRlQXVkaW9Qb2xpY3lNYW5hZ2VyKAotICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQorY2xhc3MgU291bmRUcmlnZ2VyU2Vzc2lvbkNvbGxlY3Rpb24gOiBwdWJsaWMgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdCwgYXVkaW9faW9faGFuZGxlX3Q+CiB7Ci0gICAgcmV0dXJuIG5ldyBBdWRpb1BvbGljeU1hbmFnZXIoY2xpZW50SW50ZXJmYWNlKTsKLX0KK3B1YmxpYzoKKyAgICBzdGF0dXNfdCByZWxlYXNlU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CiAKLWV4dGVybiAiQyIgdm9pZCBkZXN0cm95QXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5SW50ZXJmYWNlICppbnRlcmZhY2UpCi17Ci0gICAgZGVsZXRlIGludGVyZmFjZTsKLX0KKyAgICBzdGF0dXNfdCBhY3F1aXJlU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpOworfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TdHJlYW1EZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU3RyZWFtRGVzY3JpcHRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZGI1YWIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU3RyZWFtRGVzY3JpcHRvci5oCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPFZvbHVtZS5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gc3RyZWFtIGRlc2NyaXB0b3IgdXNlZCBmb3Igdm9sdW1lIGNvbnRyb2wKK2NsYXNzIFN0cmVhbURlc2NyaXB0b3IKK3sKK3B1YmxpYzoKKyAgICBTdHJlYW1EZXNjcmlwdG9yKCk7CisKKyAgICBpbnQgZ2V0Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3Q7CisgICAgYm9vbCBjYW5CZU11dGVkKCkgY29uc3QgeyByZXR1cm4gbUNhbkJlTXV0ZWQ7IH0KKyAgICB2b2lkIGNsZWFyQ3VycmVudFZvbHVtZUluZGV4KCk7CisgICAgdm9pZCBhZGRDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGluZGV4KTsKKyAgICBpbnQgZ2V0Vm9sdW1lSW5kZXhNaW4oKSBjb25zdCB7IHJldHVybiBtSW5kZXhNaW47IH0KKyAgICBpbnQgZ2V0Vm9sdW1lSW5kZXhNYXgoKSBjb25zdCB7IHJldHVybiBtSW5kZXhNYXg7IH0KKyAgICB2b2lkIHNldFZvbHVtZUluZGV4TWluKGludCB2b2xJbmRleE1pbik7CisgICAgdm9pZCBzZXRWb2x1bWVJbmRleE1heChpbnQgdm9sSW5kZXhNYXgpOworCisgICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3Q7CisKKyAgICB2b2lkIHNldFZvbHVtZUN1cnZlUG9pbnQoVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKnBvaW50KTsKKyAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpnZXRWb2x1bWVDdXJ2ZVBvaW50KFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1Wb2x1bWVDdXJ2ZVtkZXZpY2VDYXRlZ29yeV07CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKm1Wb2x1bWVDdXJ2ZVtWb2x1bWU6OkRFVklDRV9DQVRFR09SWV9DTlRdOworICAgIEtleWVkVmVjdG9yPGF1ZGlvX2RldmljZXNfdCwgaW50PiBtSW5kZXhDdXI7IC8qKjwgY3VycmVudCB2b2x1bWUgaW5kZXggcGVyIGRldmljZS4gKi8KKyAgICBpbnQgbUluZGV4TWluOyAvKio8IG1pbiB2b2x1bWUgaW5kZXguICovCisgICAgaW50IG1JbmRleE1heDsgLyoqPCBtYXggdm9sdW1lIGluZGV4LiAqLworICAgIGJvb2wgbUNhbkJlTXV0ZWQ7IC8qKjwgdHJ1ZSBpcyB0aGUgc3RyZWFtIGNhbiBiZSBtdXRlZC4gKi8KK307CisKKy8qKgorICogc3RyZWFtIGRlc2NyaXB0b3JzIGNvbGxlY3Rpb24gZm9yIHZvbHVtZSBjb250cm9sCisgKi8KK2NsYXNzIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uIDogcHVibGljIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19zdHJlYW1fdHlwZV90LCBTdHJlYW1EZXNjcmlwdG9yPgoreworcHVibGljOgorICAgIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uKCk7CisKKyAgICB2b2lkIGNsZWFyQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKyAgICB2b2lkIGFkZEN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGluZGV4KTsKKworICAgIGJvb2wgY2FuQmVNdXRlZChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisKKyAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7CisKKyAgICB2b2lkIHNldFZvbHVtZUN1cnZlUG9pbnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpwb2ludCk7CisKKyAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpnZXRWb2x1bWVDdXJ2ZVBvaW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkpIGNvbnN0OworCisgICAgdm9pZCBzZXRWb2x1bWVJbmRleE1pbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSxpbnQgdm9sSW5kZXhNaW4pOworICAgIHZvaWQgc2V0Vm9sdW1lSW5kZXhNYXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0saW50IHZvbEluZGV4TWF4KTsKKworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2F1ZGlvX3BvbGljeV9jb25mLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvYXVkaW9fcG9saWN5X2NvbmYuaApzaW1pbGFyaXR5IGluZGV4IDkxJQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9hdWRpb3BvbGljeS9hdWRpb19wb2xpY3lfY29uZi5oCnJlbmFtZSB0byBzZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvYXVkaW9fcG9saWN5X2NvbmYuaAppbmRleCAyNTM1YTY3Li5hMzkzZTNiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9hdWRpb19wb2xpY3lfY29uZi5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9hdWRpb19wb2xpY3lfY29uZi5oCkBAIC0xNCw5ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0KLSNpZm5kZWYgQU5EUk9JRF9BVURJT19QT0xJQ1lfQ09ORl9ICi0jZGVmaW5lIEFORFJPSURfQVVESU9fUE9MSUNZX0NPTkZfSAorI3ByYWdtYSBvbmNlCiAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNTMsOSArNTEsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gImZvcm1hdHMiIGluIG91dHB1dHMgZGVzY3JpcHRvcnMgaW5kaWNhdGluZyB0aGF0IHN1cHBvcnRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWVzIHNob3VsZCBiZSBxdWVyaWVkIGFmdGVyIG9wZW5pbmcgdGhlIG91dHB1dC4KIAotI2RlZmluZSBERVZJQ0VTX1RBRyAiZGV2aWNlcyIKLSNkZWZpbmUgREVWSUNFX1RZUEUgInR5cGUiCi0jZGVmaW5lIERFVklDRV9BRERSRVNTICJhZGRyZXNzIgorI2RlZmluZSBBUE1fREVWSUNFU19UQUcgImRldmljZXMiCisjZGVmaW5lIEFQTV9ERVZJQ0VfVFlQRSAidHlwZSIKKyNkZWZpbmUgQVBNX0RFVklDRV9BRERSRVNTICJhZGRyZXNzIgogCiAjZGVmaW5lIE1JWEVSU19UQUcgIm1peGVycyIKICNkZWZpbmUgTUlYRVJfVFlQRSAidHlwZSIKQEAgLTcxLDcgKzY5LDMgQEAKICNkZWZpbmUgR0FJTl9TVEVQX1ZBTFVFICJzdGVwX3ZhbHVlX21CIgogI2RlZmluZSBHQUlOX01JTl9SQU1QX01TICJtaW5fcmFtcF9tcyIKICNkZWZpbmUgR0FJTl9NQVhfUkFNUF9NUyAibWF4X3JhbXBfbXMiCi0KLQotCi0jZW5kaWYgIC8vIEFORFJPSURfQVVESU9fUE9MSUNZX0NPTkZfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9HYWluLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvR2Fpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3YjBjYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvR2Fpbi5jcHAKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9HYWluIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisvLyNkZWZpbmUgVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNpZmRlZiBWRVJZX1ZFUkJPU0VfTE9HR0lORworI2RlZmluZSBBTE9HVlYgQUxPR1YKKyNlbHNlCisjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCisjaW5jbHVkZSAiQXVkaW9HYWluLmgiCisjaW5jbHVkZSAiU3RyZWFtRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgPG1hdGguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitBdWRpb0dhaW46OkF1ZGlvR2FpbihpbnQgaW5kZXgsIGJvb2wgdXNlSW5DaGFubmVsTWFzaykKK3sKKyAgICBtSW5kZXggPSBpbmRleDsKKyAgICBtVXNlSW5DaGFubmVsTWFzayA9IHVzZUluQ2hhbm5lbE1hc2s7CisgICAgbWVtc2V0KCZtR2FpbiwgMCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19nYWluKSk7Cit9CisKK3ZvaWQgQXVkaW9HYWluOjpnZXREZWZhdWx0Q29uZmlnKHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqY29uZmlnKQoreworICAgIGNvbmZpZy0+aW5kZXggPSBtSW5kZXg7CisgICAgY29uZmlnLT5tb2RlID0gbUdhaW4ubW9kZTsKKyAgICBjb25maWctPmNoYW5uZWxfbWFzayA9IG1HYWluLmNoYW5uZWxfbWFzazsKKyAgICBpZiAoKG1HYWluLm1vZGUgJiBBVURJT19HQUlOX01PREVfSk9JTlQpID09IEFVRElPX0dBSU5fTU9ERV9KT0lOVCkgeworICAgICAgICBjb25maWctPnZhbHVlc1swXSA9IG1HYWluLmRlZmF1bHRfdmFsdWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdWludDMyX3QgbnVtVmFsdWVzOworICAgICAgICBpZiAobVVzZUluQ2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgIG51bVZhbHVlcyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1HYWluLmNoYW5uZWxfbWFzayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBudW1WYWx1ZXMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobUdhaW4uY2hhbm5lbF9tYXNrKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVZhbHVlczsgaSsrKSB7CisgICAgICAgICAgICBjb25maWctPnZhbHVlc1tpXSA9IG1HYWluLmRlZmF1bHRfdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKChtR2Fpbi5tb2RlICYgQVVESU9fR0FJTl9NT0RFX1JBTVApID09IEFVRElPX0dBSU5fTU9ERV9SQU1QKSB7CisgICAgICAgIGNvbmZpZy0+cmFtcF9kdXJhdGlvbl9tcyA9IG1HYWluLm1pbl9yYW1wX21zOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9HYWluOjpjaGVja0NvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmNvbmZpZykKK3sKKyAgICBpZiAoKGNvbmZpZy0+bW9kZSAmIH5tR2Fpbi5tb2RlKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICgoY29uZmlnLT5tb2RlICYgQVVESU9fR0FJTl9NT0RFX0pPSU5UKSA9PSBBVURJT19HQUlOX01PREVfSk9JTlQpIHsKKyAgICAgICAgaWYgKChjb25maWctPnZhbHVlc1swXSA8IG1HYWluLm1pbl92YWx1ZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGNvbmZpZy0+dmFsdWVzWzBdID4gbUdhaW4ubWF4X3ZhbHVlKSkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgoY29uZmlnLT5jaGFubmVsX21hc2sgJiB+bUdhaW4uY2hhbm5lbF9tYXNrKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHVpbnQzMl90IG51bVZhbHVlczsKKyAgICAgICAgaWYgKG1Vc2VJbkNoYW5uZWxNYXNrKSB7CisgICAgICAgICAgICBudW1WYWx1ZXMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjb25maWctPmNoYW5uZWxfbWFzayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBudW1WYWx1ZXMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY29uZmlnLT5jaGFubmVsX21hc2spOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyBpKyspIHsKKyAgICAgICAgICAgIGlmICgoY29uZmlnLT52YWx1ZXNbaV0gPCBtR2Fpbi5taW5fdmFsdWUpIHx8CisgICAgICAgICAgICAgICAgICAgIChjb25maWctPnZhbHVlc1tpXSA+IG1HYWluLm1heF92YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICgoY29uZmlnLT5tb2RlICYgQVVESU9fR0FJTl9NT0RFX1JBTVApID09IEFVRElPX0dBSU5fTU9ERV9SQU1QKSB7CisgICAgICAgIGlmICgoY29uZmlnLT5yYW1wX2R1cmF0aW9uX21zIDwgbUdhaW4ubWluX3JhbXBfbXMpIHx8CisgICAgICAgICAgICAgICAgICAgIChjb25maWctPnJhbXBfZHVyYXRpb25fbXMgPiBtR2Fpbi5tYXhfcmFtcF9tcykpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvR2Fpbjo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0dhaW4gJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtb2RlOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5tb2RlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBjaGFubmVsX21hc2s6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1HYWluLmNoYW5uZWxfbWFzayk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWluX3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWluX3ZhbHVlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtYXhfdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5tYXhfdmFsdWUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGRlZmF1bHRfdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5kZWZhdWx0X3ZhbHVlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBzdGVwX3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uc3RlcF92YWx1ZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWluX3JhbXBfbXM6ICVkIG1zXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5taW5fcmFtcF9tcyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWF4X3JhbXBfbXM6ICVkIG1zXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5tYXhfcmFtcF9tcyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM3MTYwYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb0lucHV0RGVzY3JpcHRvciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIkF1ZGlvSW5wdXREZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiSU9Qcm9maWxlLmgiCisjaW5jbHVkZSAiQXVkaW9HYWluLmgiCisjaW5jbHVkZSAiSHdNb2R1bGUuaCIKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2luY2x1ZGUgPHBvbGljeS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0F1ZGlvSW5wdXREZXNjcmlwdG9yOjpBdWRpb0lucHV0RGVzY3JpcHRvcihjb25zdCBzcDxJT1Byb2ZpbGU+JiBwcm9maWxlKQorICAgIDogbUlvSGFuZGxlKDApLAorICAgICAgbURldmljZShBVURJT19ERVZJQ0VfTk9ORSksIG1Qb2xpY3lNaXgoTlVMTCksIG1QYXRjaEhhbmRsZSgwKSwgbVJlZkNvdW50KDApLAorICAgICAgbUlucHV0U291cmNlKEFVRElPX1NPVVJDRV9ERUZBVUxUKSwgbVByb2ZpbGUocHJvZmlsZSksIG1Jc1NvdW5kVHJpZ2dlcihmYWxzZSksIG1JZCgwKQoreworICAgIGlmIChwcm9maWxlICE9IE5VTEwpIHsKKyAgICAgICAgbVNhbXBsaW5nUmF0ZSA9IHByb2ZpbGUtPnBpY2tTYW1wbGluZ1JhdGUoKTsKKyAgICAgICAgbUZvcm1hdCA9IHByb2ZpbGUtPnBpY2tGb3JtYXQoKTsKKyAgICAgICAgbUNoYW5uZWxNYXNrID0gcHJvZmlsZS0+cGlja0NoYW5uZWxNYXNrKCk7CisgICAgICAgIGlmIChwcm9maWxlLT5tR2FpbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bUdhaW5zWzBdLT5nZXREZWZhdWx0Q29uZmlnKCZtR2Fpbik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnNldElvSGFuZGxlKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKQoreworICAgIG1JZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7CisgICAgbUlvSGFuZGxlID0gaW9IYW5kbGU7Cit9CisKK2F1ZGlvX21vZHVsZV9oYW5kbGVfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0TW9kdWxlSGFuZGxlKCkgY29uc3QKK3sKKyAgICBpZiAobVByb2ZpbGUgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIG1Qcm9maWxlLT5nZXRNb2R1bGVIYW5kbGUoKTsKK30KKworYXVkaW9fcG9ydF9oYW5kbGVfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0SWQoKSBjb25zdAoreworICAgIHJldHVybiBtSWQ7Cit9CisKK3ZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0Cit7CisgICAgQUxPR19BU1NFUlQobVByb2ZpbGUgIT0gMCwKKyAgICAgICAgICAgICAgICAidG9BdWRpb1BvcnRDb25maWcoKSBjYWxsZWQgb24gaW5wdXQgd2l0aCBudWxsIHByb2ZpbGUgJWQiLCBtSW9IYW5kbGUpOworICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgPSBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURXxBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0t8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUfEFVRElPX1BPUlRfQ09ORklHX0dBSU47CisgICAgaWYgKHNyY0NvbmZpZyAhPSBOVUxMKSB7CisgICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgfD0gc3JjQ29uZmlnLT5jb25maWdfbWFzazsKKyAgICB9CisKKyAgICBBdWRpb1BvcnRDb25maWc6OnRvQXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKKworICAgIGRzdENvbmZpZy0+aWQgPSBtSWQ7CisgICAgZHN0Q29uZmlnLT5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NJTks7CisgICAgZHN0Q29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWDsKKyAgICBkc3RDb25maWctPmV4dC5taXguaHdfbW9kdWxlID0gZ2V0TW9kdWxlSGFuZGxlKCk7CisgICAgZHN0Q29uZmlnLT5leHQubWl4LmhhbmRsZSA9IG1Jb0hhbmRsZTsKKyAgICBkc3RDb25maWctPmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBtSW5wdXRTb3VyY2U7Cit9CisKK3ZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAoreworICAgIEFMT0dfQVNTRVJUKG1Qcm9maWxlICE9IDAsICJ0b0F1ZGlvUG9ydCgpIGNhbGxlZCBvbiBpbnB1dCB3aXRoIG51bGwgcHJvZmlsZSAlZCIsIG1Jb0hhbmRsZSk7CisKKyAgICBtUHJvZmlsZS0+dG9BdWRpb1BvcnQocG9ydCk7CisgICAgcG9ydC0+aWQgPSBtSWQ7CisgICAgdG9BdWRpb1BvcnRDb25maWcoJnBvcnQtPmFjdGl2ZV9jb25maWcpOworICAgIHBvcnQtPmV4dC5taXguaHdfbW9kdWxlID0gZ2V0TW9kdWxlSGFuZGxlKCk7CisgICAgcG9ydC0+ZXh0Lm1peC5oYW5kbGUgPSBtSW9IYW5kbGU7CisgICAgcG9ydC0+ZXh0Lm1peC5sYXRlbmN5X2NsYXNzID0gQVVESU9fTEFURU5DWV9OT1JNQUw7Cit9CisKK3N0YXR1c190IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBJRDogJWRcbiIsIGdldElkKCkpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9ybWF0OiAlZFxuIiwgbUZvcm1hdCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIERldmljZXMgJTA4eFxuIiwgbURldmljZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBSZWYgQ291bnQgJWRcbiIsIG1SZWZDb3VudCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBPcGVuIFJlZiBDb3VudCAlZFxuIiwgbU9wZW5SZWZDb3VudCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2Jvb2wgQXVkaW9JbnB1dENvbGxlY3Rpb246OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiAgaW5wdXREZXNjcmlwdG9yID0gdmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGlucHV0RGVzY3JpcHRvci0+bVJlZkNvdW50ID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dERlc2NyaXB0b3ItPm1JbnB1dFNvdXJjZSA9PSAoaW50KXNvdXJjZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gQXVkaW9JbnB1dENvbGxlY3Rpb246OmdldElucHV0RnJvbUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0Cit7CisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IE5VTEw7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpbnB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICBpZiAoaW5wdXREZXNjLT5nZXRJZCgpID09IGlkKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW5wdXREZXNjOworfQorCit1aW50MzJfdCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6YWN0aXZlSW5wdXRzQ291bnQoKSBjb25zdAoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiAgZGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGlmIChkZXNjLT5tUmVmQ291bnQgPiAwKSB7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjb3VudDsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9JbnB1dENvbGxlY3Rpb246OmdldEFjdGl2ZUlucHV0KGJvb2wgaWdub3JlVmlydHVhbElucHV0cykKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiAgaW5wdXRfZGVzY3JpcHRvciA9IHZhbHVlQXQoaSk7CisgICAgICAgIGlmICgoaW5wdXRfZGVzY3JpcHRvci0+bVJlZkNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICAmJiAoIWlnbm9yZVZpcnR1YWxJbnB1dHMgfHwgIWlzX3ZpcnR1YWxfaW5wdXRfZGV2aWNlKGlucHV0X2Rlc2NyaXB0b3ItPm1EZXZpY2UpKSkgeworICAgICAgICAgICAgcmV0dXJuIGtleUF0KGkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9JbnB1dENvbGxlY3Rpb246OmdldFN1cHBvcnRlZERldmljZXMoYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlKSBjb25zdAoreworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSB2YWx1ZUZvcihoYW5kbGUpOworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gaW5wdXREZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKTsKKyAgICByZXR1cm4gZGV2aWNlczsKK30KKworc3RhdHVzX3QgQXVkaW9JbnB1dENvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5JbnB1dHMgZHVtcDpcbiIpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gSW5wdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKKyAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkKTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK307IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNzgzNzUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwCkBAIC0wLDAgKzEsNDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvT3V0cHV0RGVzY3JpcHRvciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPEF1ZGlvUG9saWN5SW50ZXJmYWNlLmg+CisjaW5jbHVkZSAiQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiSU9Qcm9maWxlLmgiCisjaW5jbHVkZSAiQXVkaW9HYWluLmgiCisjaW5jbHVkZSAiVm9sdW1lLmgiCisjaW5jbHVkZSAiSHdNb2R1bGUuaCIKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorCisvLyBBIGRldmljZSBtYXNrIGZvciBhbGwgYXVkaW8gb3V0cHV0IGRldmljZXMgdGhhdCBhcmUgY29uc2lkZXJlZCAicmVtb3RlIiB3aGVuIGV2YWx1YXRpbmcKKy8vIGFjdGl2ZSBvdXRwdXQgZGV2aWNlcyBpbiBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KCkKKyNkZWZpbmUgQVBNX0FVRElPX09VVF9ERVZJQ0VfUkVNT1RFX0FMTCAgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8QXVkaW9Qb3J0PiYgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCisgICAgOiBtUG9ydChwb3J0KSwgbURldmljZShBVURJT19ERVZJQ0VfTk9ORSksCisgICAgICBtUGF0Y2hIYW5kbGUoMCksIG1DbGllbnRJbnRlcmZhY2UoY2xpZW50SW50ZXJmYWNlKSwgbUlkKDApCit7CisgICAgLy8gY2xlYXIgdXNhZ2UgY291bnQgZm9yIGFsbCBzdHJlYW0gdHlwZXMKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7IGkrKykgeworICAgICAgICBtUmVmQ291bnRbaV0gPSAwOworICAgICAgICBtQ3VyVm9sdW1lW2ldID0gLTEuMDsKKyAgICAgICAgbU11dGVDb3VudFtpXSA9IDA7CisgICAgICAgIG1TdG9wVGltZVtpXSA9IDA7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgeworICAgICAgICBtU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW2ldID0gZmFsc2U7CisgICAgfQorICAgIGlmIChwb3J0ICE9IE5VTEwpIHsKKyAgICAgICAgbVNhbXBsaW5nUmF0ZSA9IHBvcnQtPnBpY2tTYW1wbGluZ1JhdGUoKTsKKyAgICAgICAgbUZvcm1hdCA9IHBvcnQtPnBpY2tGb3JtYXQoKTsKKyAgICAgICAgbUNoYW5uZWxNYXNrID0gcG9ydC0+cGlja0NoYW5uZWxNYXNrKCk7CisgICAgICAgIGlmIChwb3J0LT5tR2FpbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgcG9ydC0+bUdhaW5zWzBdLT5nZXREZWZhdWx0Q29uZmlnKCZtR2Fpbik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2F1ZGlvX21vZHVsZV9oYW5kbGVfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmdldE1vZHVsZUhhbmRsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1Qb3J0LT5nZXRNb2R1bGVIYW5kbGUoKTsKK30KKworYXVkaW9fcG9ydF9oYW5kbGVfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmdldElkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbUlkOworfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkZXZpY2UoKSBjb25zdAoreworICAgIHJldHVybiBtRGV2aWNlOworfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzdXBwb3J0ZWREZXZpY2VzKCkKK3sKKyAgICByZXR1cm4gbURldmljZTsKK30KKworYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNoYXJlc0h3TW9kdWxlV2l0aCgKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjKQoreworICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICByZXR1cm4gc2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MtPnN1Yk91dHB1dDEoKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgc2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MtPnN1Yk91dHB1dDIoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIChnZXRNb2R1bGVIYW5kbGUoKSA9PSBvdXRwdXREZXNjLT5nZXRNb2R1bGVIYW5kbGUoKSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Y2hhbmdlUmVmQ291bnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhKQoreworICAgIGlmICgoZGVsdGEgKyAoaW50KW1SZWZDb3VudFtzdHJlYW1dKSA8IDApIHsKKyAgICAgICAgQUxPR1coImNoYW5nZVJlZkNvdW50KCkgaW52YWxpZCBkZWx0YSAlZCBmb3Igc3RyZWFtICVkLCByZWZDb3VudCAlZCIsCisgICAgICAgICAgICAgIGRlbHRhLCBzdHJlYW0sIG1SZWZDb3VudFtzdHJlYW1dKTsKKyAgICAgICAgbVJlZkNvdW50W3N0cmVhbV0gPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1SZWZDb3VudFtzdHJlYW1dICs9IGRlbHRhOworICAgIEFMT0dWKCJjaGFuZ2VSZWZDb3VudCgpIHN0cmVhbSAlZCwgY291bnQgJWQiLCBzdHJlYW0sIG1SZWZDb3VudFtzdHJlYW1dKTsKK30KKworYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzQWN0aXZlKHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAoreworICAgIG5zZWNzX3Qgc3lzVGltZSA9IDA7CisgICAgaWYgKGluUGFzdE1zICE9IDApIHsKKyAgICAgICAgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KUFVRElPX1NUUkVBTV9DTlQ7IGkrKykgeworICAgICAgICBpZiAoaSA9PSBBVURJT19TVFJFQU1fUEFUQ0gpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChpc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpLCBpblBhc3RNcywgc3lzVGltZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSkgY29uc3QKK3sKKyAgICBpZiAobVJlZkNvdW50W3N0cmVhbV0gIT0gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGluUGFzdE1zID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoc3lzVGltZSA9PSAwKSB7CisgICAgICAgIHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgfQorICAgIGlmIChuczJtcyhzeXNUaW1lIC0gbVN0b3BUaW1lW3N0cmVhbV0pIDwgaW5QYXN0TXMpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworCitib29sIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNGaXhlZFZvbHVtZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlIF9fdW51c2VkKQoreworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZShmbG9hdCB2b2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKQoreworICAgIC8vIFdlIGFjdHVhbGx5IGNoYW5nZSB0aGUgdm9sdW1lIGlmOgorICAgIC8vIC0gdGhlIGZsb2F0IHZhbHVlIHJldHVybmVkIGJ5IGNvbXB1dGVWb2x1bWUoKSBjaGFuZ2VkCisgICAgLy8gLSB0aGUgZm9yY2UgZmxhZyBpcyBzZXQKKyAgICBpZiAodm9sdW1lICE9IG1DdXJWb2x1bWVbc3RyZWFtXSB8fCBmb3JjZSkgeworICAgICAgICBBTE9HVigic2V0Vm9sdW1lKCkgZm9yIHN0cmVhbSAlZCwgdm9sdW1lICVmLCBkZWxheSAlZCIsIHN0cmVhbSwgdm9sdW1lLCBkZWxheU1zKTsKKyAgICAgICAgbUN1clZvbHVtZVtzdHJlYW1dID0gdm9sdW1lOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnRDb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0Cit7CisgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFfEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTS3wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX0NPTkZJR19GT1JNQVR8QVVESU9fUE9SVF9DT05GSUdfR0FJTjsKKyAgICBpZiAoc3JjQ29uZmlnICE9IE5VTEwpIHsKKyAgICAgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayB8PSBzcmNDb25maWctPmNvbmZpZ19tYXNrOworICAgIH0KKyAgICBBdWRpb1BvcnRDb25maWc6OnRvQXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKKworICAgIGRzdENvbmZpZy0+aWQgPSBtSWQ7CisgICAgZHN0Q29uZmlnLT5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKKyAgICBkc3RDb25maWctPnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYOworICAgIGRzdENvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGUgPSBnZXRNb2R1bGVIYW5kbGUoKTsKKyAgICBkc3RDb25maWctPmV4dC5taXgudXNlY2FzZS5zdHJlYW0gPSBBVURJT19TVFJFQU1fREVGQVVMVDsKK30KKwordm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAoreworICAgIG1Qb3J0LT50b0F1ZGlvUG9ydChwb3J0KTsKKyAgICBwb3J0LT5pZCA9IG1JZDsKKyAgICBwb3J0LT5leHQubWl4Lmh3X21vZHVsZSA9IGdldE1vZHVsZUhhbmRsZSgpOworfQorCitzdGF0dXNfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIElEOiAlZFxuIiwgbUlkKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFNhbXBsaW5nIHJhdGU6ICVkXG4iLCBtU2FtcGxpbmdSYXRlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcm1hdDogJTA4eFxuIiwgbUZvcm1hdCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIERldmljZXMgJTA4eFxuIiwgZGV2aWNlKCkpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU3RyZWFtIHZvbHVtZSByZWZDb3VudCBtdXRlQ291bnRcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAlMDJkICAgICAlLjAzZiAgICAgJTAyZCAgICAgICAlMDJkXG4iLAorICAgICAgICAgICAgICAgICBpLCBtQ3VyVm9sdW1lW2ldLCBtUmVmQ291bnRbaV0sIG1NdXRlQ291bnRbaV0pOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6bG9nKGNvbnN0IGNoYXIqIGluZGVudCkKK3sKKyAgICBBTE9HSSgiJXNJRDogJWQsMHglWCwgW3J0OiVkIGZtdDoweCVYIGNoOjB4JVhdIiwKKyAgICAgICAgICBpbmRlbnQsIG1JZCwgbUlkLCBtU2FtcGxpbmdSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbE1hc2spOworfQorCisvLyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvciBpbXBsZW1lbnRhdGlvbgorU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OlN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKAorICAgICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+JiBwcm9maWxlLCBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQorICAgIDogQXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUsIGNsaWVudEludGVyZmFjZSksCisgICAgbVByb2ZpbGUocHJvZmlsZSksIG1Jb0hhbmRsZSgwKSwgbUxhdGVuY3koMCksCisgICAgbUZsYWdzKChhdWRpb19vdXRwdXRfZmxhZ3NfdCkwKSwgbVBvbGljeU1peChOVUxMKSwKKyAgICBtT3V0cHV0MSgwKSwgbU91dHB1dDIoMCksIG1EaXJlY3RPcGVuQ291bnQoMCksIG1HbG9iYWxSZWZDb3VudCgwKQoreworICAgIGlmIChwcm9maWxlICE9IE5VTEwpIHsKKyAgICAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KXByb2ZpbGUtPm1GbGFnczsKKyAgICB9Cit9CisKK3ZvaWQgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldElvSGFuZGxlKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKQoreworICAgIG1JZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7CisgICAgbUlvSGFuZGxlID0gaW9IYW5kbGU7Cit9CisKKworc3RhdHVzX3QgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIExhdGVuY3k6ICVkXG4iLCBtTGF0ZW5jeSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGbGFncyAlMDh4XG4iLCBtRmxhZ3MpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKworICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChmZCk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZGV2aWNlKCkgY29uc3QKK3sKKyAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIChhdWRpb19kZXZpY2VzX3QpKG1PdXRwdXQxLT5tRGV2aWNlIHwgbU91dHB1dDItPm1EZXZpY2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtRGV2aWNlOworICAgIH0KK30KKworYm9vbCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2hhcmVzSHdNb2R1bGVXaXRoKAorICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MpCit7CisgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIHJldHVybiBtT3V0cHV0MS0+c2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MpIHx8IG1PdXRwdXQyLT5zaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYyk7CisgICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSl7CisgICAgICAgIHJldHVybiBzaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYy0+c3ViT3V0cHV0MSgpKSB8fAorICAgICAgICAgICAgICAgICAgICBzaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYy0+c3ViT3V0cHV0MigpKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYyk7CisgICAgfQorfQorCithdWRpb19kZXZpY2VzX3QgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnN1cHBvcnRlZERldmljZXMoKQoreworICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICByZXR1cm4gKGF1ZGlvX2RldmljZXNfdCkobU91dHB1dDEtPnN1cHBvcnRlZERldmljZXMoKSB8IG1PdXRwdXQyLT5zdXBwb3J0ZWREZXZpY2VzKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSA7CisgICAgfQorfQorCit1aW50MzJfdCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6bGF0ZW5jeSgpCit7CisgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIHJldHVybiAobU91dHB1dDEtPm1MYXRlbmN5ID4gbU91dHB1dDItPm1MYXRlbmN5KSA/IG1PdXRwdXQxLT5tTGF0ZW5jeSA6IG1PdXRwdXQyLT5tTGF0ZW5jeTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbUxhdGVuY3k7CisgICAgfQorfQorCit2b2lkIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjaGFuZ2VSZWZDb3VudChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEpCit7CisgICAgLy8gZm9yd2FyZCB1c2FnZSBjb3VudCBjaGFuZ2UgdG8gYXR0YWNoZWQgb3V0cHV0cworICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICBtT3V0cHV0MS0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCBkZWx0YSk7CisgICAgICAgIG1PdXRwdXQyLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIGRlbHRhKTsKKyAgICB9CisgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjaGFuZ2VSZWZDb3VudChzdHJlYW0sIGRlbHRhKTsKKworICAgIC8vIGhhbmRsZSBzdHJlYW0taW5kZXBlbmRlbnQgcmVmIGNvdW50CisgICAgdWludDMyX3Qgb2xkR2xvYmFsUmVmQ291bnQgPSBtR2xvYmFsUmVmQ291bnQ7CisgICAgaWYgKChkZWx0YSArIChpbnQpbUdsb2JhbFJlZkNvdW50KSA8IDApIHsKKyAgICAgICAgQUxPR1coImNoYW5nZVJlZkNvdW50KCkgaW52YWxpZCBkZWx0YSAlZCBnbG9iYWxSZWZDb3VudCAlZCIsIGRlbHRhLCBtR2xvYmFsUmVmQ291bnQpOworICAgICAgICBtR2xvYmFsUmVmQ291bnQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIG1HbG9iYWxSZWZDb3VudCArPSBkZWx0YTsKKyAgICB9CisgICAgaWYgKChvbGRHbG9iYWxSZWZDb3VudCA9PSAwKSAmJiAobUdsb2JhbFJlZkNvdW50ID4gMCkpIHsKKyAgICAgICAgaWYgKChtUG9saWN5TWl4ICE9IE5VTEwpICYmICgobVBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUobVBvbGljeU1peC0+bVJlZ2lzdHJhdGlvbklkLAorICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfTUlYSU5HKTsKKyAgICAgICAgfQorCisgICAgfSBlbHNlIGlmICgob2xkR2xvYmFsUmVmQ291bnQgPiAwKSAmJiAobUdsb2JhbFJlZkNvdW50ID09IDApKSB7CisgICAgICAgIGlmICgobVBvbGljeU1peCAhPSBOVUxMKSAmJiAoKG1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKG1Qb2xpY3lNaXgtPm1SZWdpc3RyYXRpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX0lETEUpOworICAgICAgICB9CisgICAgfQorfQorCisKK2Jvb2wgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzRml4ZWRWb2x1bWUoYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICAvLyB1bml0IGdhaW4gaWYgcmVyb3V0aW5nIHRvIGV4dGVybmFsIHBvbGljeQorICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSB7CisgICAgICAgIGlmIChtUG9saWN5TWl4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dWKCJtYXggZ2FpbiB3aGVuIHJlcm91dGluZyBmb3Igb3V0cHV0PSVkIiwgbUlvSGFuZGxlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnRDb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0Cit7CisKKyAgICBBTE9HX0FTU0VSVCghaXNEdXBsaWNhdGVkKCksICJ0b0F1ZGlvUG9ydENvbmZpZygpIGNhbGxlZCBvbiBkdXBsaWNhdGVkIG91dHB1dCAlZCIsIG1Jb0hhbmRsZSk7CisgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZyhkc3RDb25maWcsIHNyY0NvbmZpZyk7CisKKyAgICBkc3RDb25maWctPmV4dC5taXguaGFuZGxlID0gbUlvSGFuZGxlOworfQorCit2b2lkIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKK3sKKyAgICBBTE9HX0FTU0VSVCghaXNEdXBsaWNhdGVkKCksICJ0b0F1ZGlvUG9ydCgpIGNhbGxlZCBvbiBkdXBsaWNhdGVkIG91dHB1dCAlZCIsIG1Jb0hhbmRsZSk7CisKKyAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KHBvcnQpOworCisgICAgdG9BdWRpb1BvcnRDb25maWcoJnBvcnQtPmFjdGl2ZV9jb25maWcpOworICAgIHBvcnQtPmV4dC5taXguaGFuZGxlID0gbUlvSGFuZGxlOworICAgIHBvcnQtPmV4dC5taXgubGF0ZW5jeV9jbGFzcyA9CisgICAgICAgICAgICBtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUID8gQVVESU9fTEFURU5DWV9MT1cgOiBBVURJT19MQVRFTkNZX05PUk1BTDsKK30KKworYm9vbCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKK3sKKyAgICBib29sIGNoYW5nZWQgPSBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZSh2b2x1bWUsIHN0cmVhbSwgZGV2aWNlLCBkZWxheU1zLCBmb3JjZSk7CisKKyAgICBpZiAoY2hhbmdlZCkgeworICAgICAgICAvLyBGb3JjZSBWT0lDRV9DQUxMIHRvIHRyYWNrIEJMVUVUT09USF9TQ08gc3RyZWFtIHZvbHVtZSB3aGVuIGJsdWV0b290aCBhdWRpbyBpcworICAgICAgICAvLyBlbmFibGVkCisgICAgICAgIGZsb2F0IHZvbHVtZSA9IFZvbHVtZTo6RGJUb0FtcGwobUN1clZvbHVtZVtzdHJlYW1dKTsKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTykgeworICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+c2V0U3RyZWFtVm9sdW1lKAorICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgdm9sdW1lLCBtSW9IYW5kbGUsIGRlbGF5TXMpOworICAgICAgICB9CisgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZvbHVtZSwgbUlvSGFuZGxlLCBkZWxheU1zKTsKKyAgICB9CisgICAgcmV0dXJuIGNoYW5nZWQ7Cit9CisKKy8vIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uIGltcGxlbWVudGF0aW9uCisKK2Jvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK3sKKyAgICBuc2Vjc190IHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aGlzLT5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHRoaXMtPnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmVhbUFjdGl2ZShzdHJlYW0sIGluUGFzdE1zLCBzeXNUaW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Cit7CisgICAgbnNlY3NfdCBzeXNUaW1lID0gc3lzdGVtVGltZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICBpZiAoKChvdXRwdXREZXNjLT5kZXZpY2UoKSAmIEFQTV9BVURJT19PVVRfREVWSUNFX1JFTU9URV9BTEwpICE9IDApICYmCisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcywgc3lzVGltZSkpIHsKKyAgICAgICAgICAgIC8vIGRvIG5vdCBjb25zaWRlciByZSByb3V0aW5nICh3aGVuIHRoZSBvdXRwdXQgaXMgZ29pbmcgdG8gYSBkeW5hbWljIHBvbGljeSkKKyAgICAgICAgICAgIC8vIGFzICJyZW1vdGUgcGxheWJhY2siCisgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVBvbGljeU1peCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCithdWRpb19pb19oYW5kbGVfdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6Z2V0QTJkcE91dHB1dCgpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGlmICghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgb3V0cHV0RGVzYy0+ZGV2aWNlKCkgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy0+a2V5QXQoaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3NwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6Z2V0UHJpbWFyeU91dHB1dCgpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKSB7CisgICAgICAgICAgICByZXR1cm4gb3V0cHV0RGVzYzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpnZXRPdXRwdXRGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3QKK3sKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IE5VTEw7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmdldElkKCkgPT0gaWQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBvdXRwdXREZXNjOworfQorCitib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc0FueU91dHB1dEFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVRvSWdub3JlKSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IHMgPSAwIDsgcyA8IEFVRElPX1NUUkVBTV9DTlQgOyBzKyspIHsKKyAgICAgICAgaWYgKHMgPT0gKHNpemVfdCkgc3RyZWFtVG9JZ25vcmUpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc10gIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYXVkaW9fZGV2aWNlc190IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpnZXRTdXBwb3J0ZWREZXZpY2VzKGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSkgY29uc3QKK3sKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHZhbHVlRm9yKGhhbmRsZSk7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBvdXRwdXREZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKTsKKyAgICByZXR1cm4gZGV2aWNlczsKK30KKworCitzdGF0dXNfdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Cit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbk91dHB1dHMgZHVtcDpcbiIpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gT3V0cHV0ICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7CisgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCk7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit9OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUGF0Y2guY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNmQ4NjcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcApAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BhdGNoIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiQXVkaW9QYXRjaC5oIgorI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgorI2luY2x1ZGUgIkNvbmZpZ1BhcnNpbmdVdGlscy5oIgorI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworaW50MzJfdCB2b2xhdGlsZSBBdWRpb1BhdGNoOjptTmV4dFVuaXF1ZUlkID0gMTsKKworQXVkaW9QYXRjaDo6QXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLCB1aWRfdCB1aWQpIDoKKyAgICBtSGFuZGxlKHN0YXRpY19jYXN0PGF1ZGlvX3BhdGNoX2hhbmRsZV90PihhbmRyb2lkX2F0b21pY19pbmMoJm1OZXh0VW5pcXVlSWQpKSksCisgICAgbVBhdGNoKCpwYXRjaCksCisgICAgbVVpZCh1aWQpLAorICAgIG1BZlBhdGNoSGFuZGxlKDApCit7Cit9CisKK3N0YXR1c190IEF1ZGlvUGF0Y2g6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Cit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNBdWRpbyBwYXRjaCAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGhhbmRsZTogJTJkXG4iLCBzcGFjZXMsICIiLCBtSGFuZGxlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBhdWRpbyBmbGluZ2VyIGhhbmRsZTogJTJkXG4iLCBzcGFjZXMsICIiLCBtQWZQYXRjaEhhbmRsZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gb3duZXIgdWlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1VaWQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtICVkIHNvdXJjZXM6XG4iLCBzcGFjZXMsICIiLCBtUGF0Y2gubnVtX3NvdXJjZXMpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYXRjaC5udW1fc291cmNlczsgaSsrKSB7CisgICAgICAgIGlmIChtUGF0Y2guc291cmNlc1tpXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gRGV2aWNlIElEICVkICVzXG4iLCBzcGFjZXMgKyAyLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zb3VyY2VzW2ldLmlkLCBDb25maWdQYXJzaW5nVXRpbHM6OmVudW1Ub1N0cmluZyhzRGV2aWNlVHlwZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VUeXBlVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc291cmNlc1tpXS5leHQuZGV2aWNlLnR5cGUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gTWl4IElEICVkIEkvTyBoYW5kbGUgJWRcbiIsIHNwYWNlcyArIDIsICIiLAorICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNvdXJjZXNbaV0uaWQsIG1QYXRjaC5zb3VyY2VzW2ldLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gJWQgc2lua3M6XG4iLCBzcGFjZXMsICIiLCBtUGF0Y2gubnVtX3NpbmtzKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGF0Y2gubnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgaWYgKG1QYXRjaC5zaW5rc1tpXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gRGV2aWNlIElEICVkICVzXG4iLCBzcGFjZXMgKyAyLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zaW5rc1tpXS5pZCwgQ29uZmlnUGFyc2luZ1V0aWxzOjplbnVtVG9TdHJpbmcoc0RldmljZVR5cGVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzRGV2aWNlVHlwZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBNaXggSUQgJWQgSS9PIGhhbmRsZSAlZFxuIiwgc3BhY2VzICsgMiwgIiIsCisgICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc2lua3NbaV0uaWQsIG1QYXRjaC5zaW5rc1tpXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIH0KKworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9QYXRjaENvbGxlY3Rpb246OmFkZEF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9QYXRjaD4mIHBhdGNoKQoreworICAgIHNzaXplX3QgaW5kZXggPSBpbmRleE9mS2V5KGhhbmRsZSk7CisKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBBTE9HVygiYWRkQXVkaW9QYXRjaCgpIHBhdGNoICVkIGFscmVhZHkgaW4iLCBoYW5kbGUpOworICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CisgICAgfQorICAgIGFkZChoYW5kbGUsIHBhdGNoKTsKKyAgICBBTE9HVigiYWRkQXVkaW9QYXRjaCgpIGhhbmRsZSAlZCBhZiBoYW5kbGUgJWQgbnVtX3NvdXJjZXMgJWQgbnVtX3NpbmtzICVkIHNvdXJjZSBoYW5kbGUgJWQiCisgICAgICAgICAgICAic2luayBoYW5kbGUgJWQiLAorICAgICAgICAgIGhhbmRsZSwgcGF0Y2gtPm1BZlBhdGNoSGFuZGxlLCBwYXRjaC0+bVBhdGNoLm51bV9zb3VyY2VzLCBwYXRjaC0+bVBhdGNoLm51bV9zaW5rcywKKyAgICAgICAgICBwYXRjaC0+bVBhdGNoLnNvdXJjZXNbMF0uaWQsIHBhdGNoLT5tUGF0Y2guc2lua3NbMF0uaWQpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9QYXRjaENvbGxlY3Rpb246OnJlbW92ZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIHNzaXplX3QgaW5kZXggPSBpbmRleE9mS2V5KGhhbmRsZSk7CisKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJyZW1vdmVBdWRpb1BhdGNoKCkgcGF0Y2ggJWQgbm90IGluIiwgaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgIH0KKyAgICBBTE9HVigicmVtb3ZlQXVkaW9QYXRjaCgpIGhhbmRsZSAlZCBhZiBoYW5kbGUgJWQiLCBoYW5kbGUsIHZhbHVlQXQoaW5kZXgpLT5tQWZQYXRjaEhhbmRsZSk7CisgICAgcmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BhdGNoQ29sbGVjdGlvbjo6bGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzKSBjb25zdAoreworICAgIGlmIChudW1fcGF0Y2hlcyA9PSBOVUxMIHx8ICgqbnVtX3BhdGNoZXMgIT0gMCAmJiBwYXRjaGVzID09IE5VTEwpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCJsaXN0QXVkaW9QYXRjaGVzKCkgbnVtX3BhdGNoZXMgJWQgcGF0Y2hlcyAlcCBhdmFpbGFibGUgcGF0Y2hlcyAlenUiLAorICAgICAgICAgICpudW1fcGF0Y2hlcywgcGF0Y2hlcywgc2l6ZSgpKTsKKyAgICBpZiAocGF0Y2hlcyA9PSBOVUxMKSB7CisgICAgICAgICpudW1fcGF0Y2hlcyA9IDA7CisgICAgfQorCisgICAgc2l6ZV90IHBhdGNoZXNXcml0dGVuID0gMDsKKyAgICBzaXplX3QgcGF0Y2hlc01heCA9ICpudW1fcGF0Y2hlczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAgPCBzaXplKCkgJiYgcGF0Y2hlc1dyaXR0ZW4gPCBwYXRjaGVzTWF4OyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9QYXRjaD4gIHBhdGNoID0gdmFsdWVBdChpKTsKKyAgICAgICAgcGF0Y2hlc1twYXRjaGVzV3JpdHRlbl0gPSBwYXRjaC0+bVBhdGNoOworICAgICAgICBwYXRjaGVzW3BhdGNoZXNXcml0dGVuKytdLmlkID0gcGF0Y2gtPm1IYW5kbGU7CisgICAgICAgIEFMT0dWKCJsaXN0QXVkaW9QYXRjaGVzKCkgcGF0Y2ggJXp1IG51bV9zb3VyY2VzICVkIG51bV9zaW5rcyAlZCIsCisgICAgICAgICAgICAgIGksIHBhdGNoLT5tUGF0Y2gubnVtX3NvdXJjZXMsIHBhdGNoLT5tUGF0Y2gubnVtX3NpbmtzKTsKKyAgICB9CisgICAgKm51bV9wYXRjaGVzID0gc2l6ZSgpOworCisgICAgQUxPR1YoImxpc3RBdWRpb1BhdGNoZXMoKSBnb3QgJXp1IHBhdGNoZXMgbmVlZGVkICVkIiwgcGF0Y2hlc1dyaXR0ZW4sICpudW1fcGF0Y2hlcyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BhdGNoQ29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Cit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5BdWRpbyBQYXRjaGVzOlxuIik7CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCwgMiwgaSk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjE5OThjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb2xpY3lNaXguY3BwCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvUG9saWN5TWl4IgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lNaXguaCIKKyNpbmNsdWRlICJId01vZHVsZS5oIgorI2luY2x1ZGUgIkF1ZGlvUG9ydC5oIgorI2luY2x1ZGUgIklPUHJvZmlsZS5oIgorI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgorI2luY2x1ZGUgPEF1ZGlvT3V0cHV0RGVzY3JpcHRvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3ZvaWQgQXVkaW9Qb2xpY3lNaXg6OnNldE91dHB1dChzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJm91dHB1dCkKK3sKKyAgICBtT3V0cHV0ID0gb3V0cHV0OworfQorCitjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJkF1ZGlvUG9saWN5TWl4OjpnZXRPdXRwdXQoKSBjb25zdAoreworICAgIHJldHVybiBtT3V0cHV0OworfQorCit2b2lkIEF1ZGlvUG9saWN5TWl4OjpjbGVhck91dHB1dCgpCit7CisgICAgbU91dHB1dC5jbGVhcigpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWl4OjpzZXRNaXgoQXVkaW9NaXggJm1peCkKK3sKKyAgICBtTWl4ID0gbWl4OworfQorCithbmRyb2lkOjpBdWRpb01peCAqQXVkaW9Qb2xpY3lNaXg6OmdldE1peCgpCit7CisgICAgcmV0dXJuICZtTWl4OworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OnJlZ2lzdGVyTWl4KFN0cmluZzggYWRkcmVzcywgQXVkaW9NaXggbWl4KQoreworICAgIHNzaXplX3QgaW5kZXggPSBpbmRleE9mS2V5KGFkZHJlc3MpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIEFMT0dFKCJyZWdpc3RlclBvbGljeU1peGVzKCk6IG1peCBmb3IgYWRkcmVzcyAlcyBhbHJlYWR5IHJlZ2lzdGVyZWQiLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peCA9IG5ldyBBdWRpb1BvbGljeU1peCgpOworICAgIHBvbGljeU1peC0+c2V0TWl4KG1peCk7CisgICAgYWRkKGFkZHJlc3MsIHBvbGljeU1peCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OnVucmVnaXN0ZXJNaXgoU3RyaW5nOCBhZGRyZXNzKQoreworICAgIHNzaXplX3QgaW5kZXggPSBpbmRleE9mS2V5KGFkZHJlc3MpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR0UoInVucmVnaXN0ZXJQb2xpY3lNaXhlcygpOiBtaXggZm9yIGFkZHJlc3MgJXMgbm90IHJlZ2lzdGVyZWQiLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByZW1vdmVJdGVtc0F0KGluZGV4KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0QXVkaW9Qb2xpY3lNaXgoU3RyaW5nOCBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gJnBvbGljeU1peCkgY29uc3QKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShhZGRyZXNzKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dFKCJ1bnJlZ2lzdGVyUG9saWN5TWl4ZXMoKTogbWl4IGZvciBhZGRyZXNzICVzIG5vdCByZWdpc3RlcmVkIiwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHBvbGljeU1peCA9IHZhbHVlQXQoaW5kZXgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmNsb3NlT3V0cHV0KHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmZGVzYykKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSB2YWx1ZUF0KGkpOworICAgICAgICBpZiAocG9saWN5TWl4LT5nZXRPdXRwdXQoKSA9PSBkZXNjKSB7CisgICAgICAgICAgICBwb2xpY3lNaXgtPmNsZWFyT3V0cHV0KCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0T3V0cHV0Rm9yQXR0cihhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJmRlc2MpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4ID0gdmFsdWVBdChpKTsKKyAgICAgICAgQXVkaW9NaXggKm1peCA9IHBvbGljeU1peC0+Z2V0TWl4KCk7CisKKyAgICAgICAgaWYgKG1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtaXgtPm1Dcml0ZXJpYS5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIGlmICgoUlVMRV9NQVRDSF9BVFRSSUJVVEVfVVNBR0UgPT0gbWl4LT5tQ3JpdGVyaWFbal0ubVJ1bGUgJiYKKyAgICAgICAgICAgICAgICAgICAgIG1peC0+bUNyaXRlcmlhW2pdLm1BdHRyLm1Vc2FnZSA9PSBhdHRyaWJ1dGVzLnVzYWdlKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKFJVTEVfRVhDTFVERV9BVFRSSUJVVEVfVVNBR0UgPT0gbWl4LT5tQ3JpdGVyaWFbal0ubVJ1bGUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICBtaXgtPm1Dcml0ZXJpYVtqXS5tQXR0ci5tVXNhZ2UgIT0gYXR0cmlidXRlcy51c2FnZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzYyA9IHBvbGljeU1peC0+Z2V0T3V0cHV0KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MgKyBzdHJsZW4oImFkZHI9IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peC0+bVJlZ2lzdHJhdGlvbklkLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSBzdHJsZW4oImFkZHI9IikgLSAxKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGRlc2MgPSBwb2xpY3lNaXgtPmdldE91dHB1dCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKKyAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzLnVzYWdlID09IEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFICYmCisgICAgICAgICAgICAgICAgICAgIHN0cm5jbXAoYXR0cmlidXRlcy50YWdzLCAiYWRkcj0iLCBzdHJsZW4oImFkZHI9IikpID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MgKyBzdHJsZW4oImFkZHI9IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4LT5tUmVnaXN0cmF0aW9uSWQuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gc3RybGVuKCJhZGRyPSIpIC0gMSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGRlc2MgPSBwb2xpY3lNaXgtPmdldE91dHB1dCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChkZXNjICE9IDApIHsKKyAgICAgICAgICAgIGRlc2MtPm1Qb2xpY3lNaXggPSBtaXg7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxEZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXggKipwb2xpY3lNaXgpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBBdWRpb01peCAqbWl4ID0gdmFsdWVBdChpKS0+Z2V0TWl4KCk7CisKKyAgICAgICAgaWYgKG1peC0+bU1peFR5cGUgIT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1peC0+bUNyaXRlcmlhLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICBpZiAoKFJVTEVfTUFUQ0hfQVRUUklCVVRFX0NBUFRVUkVfUFJFU0VUID09IG1peC0+bUNyaXRlcmlhW2pdLm1SdWxlICYmCisgICAgICAgICAgICAgICAgICAgIG1peC0+bUNyaXRlcmlhW2pdLm1BdHRyLm1Tb3VyY2UgPT0gaW5wdXRTb3VyY2UpIHx8CisgICAgICAgICAgICAgICAoUlVMRV9FWENMVURFX0FUVFJJQlVURV9DQVBUVVJFX1BSRVNFVCA9PSBtaXgtPm1Dcml0ZXJpYVtqXS5tUnVsZSAmJgorICAgICAgICAgICAgICAgICAgICBtaXgtPm1Dcml0ZXJpYVtqXS5tQXR0ci5tU291cmNlICE9IGlucHV0U291cmNlKSkgeworICAgICAgICAgICAgICAgIGlmIChhdmFpbERldmljZXMgJiBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocG9saWN5TWl4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwb2xpY3lNaXggPSBtaXg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0SW5wdXRNaXhGb3JBdHRyKGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyLCBBdWRpb01peCAqKnBvbGljeU1peCkKK3sKKyAgICBpZiAoc3RybmNtcChhdHRyLnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgIT0gMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBTdHJpbmc4IGFkZHJlc3MoYXR0ci50YWdzICsgc3RybGVuKCJhZGRyPSIpKTsKKworICAgIHNzaXplX3QgaW5kZXggPSBpbmRleE9mS2V5KGFkZHJlc3MpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coImdldElucHV0TWl4Rm9yQXR0cigpIG5vIHBvbGljeSBmb3IgYWRkcmVzcyAlcyIsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzcDxBdWRpb1BvbGljeU1peD4gYXVkaW9Qb2xpY3lNaXggPSB2YWx1ZUF0KGluZGV4KTsKKyAgICBBdWRpb01peCAqbWl4ID0gYXVkaW9Qb2xpY3lNaXgtPmdldE1peCgpOworCisgICAgaWYgKG1peC0+bU1peFR5cGUgIT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICBBTE9HVygiZ2V0SW5wdXRNaXhGb3JBdHRyKCkgYmFkIHBvbGljeSBtaXggdHlwZSBmb3IgYWRkcmVzcyAlcyIsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICAqcG9saWN5TWl4ID0gbWl4OworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworfTsgLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb3J0LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9ydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyNGYxOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9ydC5jcHAKQEAgLTAsMCArMSw5MjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Qb3J0IgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CisjaW5jbHVkZSAiQXVkaW9Qb3J0LmgiCisjaW5jbHVkZSAiSHdNb2R1bGUuaCIKKyNpbmNsdWRlICJBdWRpb0dhaW4uaCIKKyNpbmNsdWRlICJDb25maWdQYXJzaW5nVXRpbHMuaCIKKyNpbmNsdWRlICJhdWRpb19wb2xpY3lfY29uZi5oIgorI2luY2x1ZGUgPHBvbGljeS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2ludDMyX3Qgdm9sYXRpbGUgQXVkaW9Qb3J0OjptTmV4dFVuaXF1ZUlkID0gMTsKKworLy8gLS0tIEF1ZGlvUG9ydCBjbGFzcyBpbXBsZW1lbnRhdGlvbgorCitBdWRpb1BvcnQ6OkF1ZGlvUG9ydChjb25zdCBTdHJpbmc4JiBuYW1lLCBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSkgOgorICAgIG1OYW1lKG5hbWUpLCBtVHlwZSh0eXBlKSwgbVJvbGUocm9sZSksIG1GbGFncygwKQoreworICAgIG1Vc2VJbkNoYW5uZWxNYXNrID0gKCh0eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpICYmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpKSB8fAorICAgICAgICAgICAgICAgICAgICAoKHR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgJiYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspKTsKK30KKwordm9pZCBBdWRpb1BvcnQ6OmF0dGFjaChjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSkKK3sKKyAgICBtTW9kdWxlID0gbW9kdWxlOworfQorCithdWRpb19wb3J0X2hhbmRsZV90IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCkKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YXVkaW9fcG9ydF9oYW5kbGVfdD4oYW5kcm9pZF9hdG9taWNfaW5jKCZtTmV4dFVuaXF1ZUlkKSk7Cit9CisKK2F1ZGlvX21vZHVsZV9oYW5kbGVfdCBBdWRpb1BvcnQ6OmdldE1vZHVsZUhhbmRsZSgpIGNvbnN0Cit7CisgICAgaWYgKG1Nb2R1bGUgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIG1Nb2R1bGUtPm1IYW5kbGU7Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9ydDo6Z2V0TW9kdWxlVmVyc2lvbigpIGNvbnN0Cit7CisgICAgaWYgKG1Nb2R1bGUgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIG1Nb2R1bGUtPm1IYWxWZXJzaW9uOworfQorCitjb25zdCBjaGFyICpBdWRpb1BvcnQ6OmdldE1vZHVsZU5hbWUoKSBjb25zdAoreworICAgIGlmIChtTW9kdWxlID09IDApIHsKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgICByZXR1cm4gbU1vZHVsZS0+bU5hbWU7Cit9CisKK3ZvaWQgQXVkaW9Qb3J0Ojp0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKK3sKKyAgICBwb3J0LT5yb2xlID0gbVJvbGU7CisgICAgcG9ydC0+dHlwZSA9IG1UeXBlOworICAgIHN0cmxjcHkocG9ydC0+bmFtZSwgbU5hbWUsIEFVRElPX1BPUlRfTUFYX05BTUVfTEVOKTsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpICYmIGkgPCBBVURJT19QT1JUX01BWF9TQU1QTElOR19SQVRFUzsgaSsrKSB7CisgICAgICAgIGlmIChtU2FtcGxpbmdSYXRlc1tpXSAhPSAwKSB7CisgICAgICAgICAgICBwb3J0LT5zYW1wbGVfcmF0ZXNbaV0gPSBtU2FtcGxpbmdSYXRlc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwb3J0LT5udW1fc2FtcGxlX3JhdGVzID0gaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCkgJiYgaSA8IEFVRElPX1BPUlRfTUFYX0NIQU5ORUxfTUFTS1M7IGkrKykgeworICAgICAgICBpZiAobUNoYW5uZWxNYXNrc1tpXSAhPSAwKSB7CisgICAgICAgICAgICBwb3J0LT5jaGFubmVsX21hc2tzW2ldID0gbUNoYW5uZWxNYXNrc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwb3J0LT5udW1fY2hhbm5lbF9tYXNrcyA9IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG1Gb3JtYXRzLnNpemUoKSAmJiBpIDwgQVVESU9fUE9SVF9NQVhfRk9STUFUUzsgaSsrKSB7CisgICAgICAgIGlmIChtRm9ybWF0c1tpXSAhPSAwKSB7CisgICAgICAgICAgICBwb3J0LT5mb3JtYXRzW2ldID0gbUZvcm1hdHNbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgcG9ydC0+bnVtX2Zvcm1hdHMgPSBpOworCisgICAgQUxPR1YoIkF1ZGlvUG9ydDo6dG9BdWRpb1BvcnQoKSBudW0gZ2FpbnMgJXp1IiwgbUdhaW5zLnNpemUoKSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbUdhaW5zLnNpemUoKSAmJiBpIDwgQVVESU9fUE9SVF9NQVhfR0FJTlM7IGkrKykgeworICAgICAgICBwb3J0LT5nYWluc1tpXSA9IG1HYWluc1tpXS0+bUdhaW47CisgICAgfQorICAgIHBvcnQtPm51bV9nYWlucyA9IGk7Cit9CisKK3ZvaWQgQXVkaW9Qb3J0OjppbXBvcnRBdWRpb1BvcnQoY29uc3Qgc3A8QXVkaW9Qb3J0PiBwb3J0KSB7CisgICAgZm9yIChzaXplX3QgayA9IDAgOyBrIDwgcG9ydC0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIDsgaysrKSB7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHJhdGUgPSBwb3J0LT5tU2FtcGxpbmdSYXRlcy5pdGVtQXQoayk7CisgICAgICAgIGlmIChyYXRlICE9IDApIHsgLy8gc2tpcCAiZHluYW1pYyIgcmF0ZXMKKyAgICAgICAgICAgIGJvb2wgaGFzUmF0ZSA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChzaXplX3QgbCA9IDAgOyBsIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIDsgbCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHJhdGUgPT0gbVNhbXBsaW5nUmF0ZXMuaXRlbUF0KGwpKSB7CisgICAgICAgICAgICAgICAgICAgIGhhc1JhdGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWhhc1JhdGUpIHsgLy8gbmV2ZXIgaW1wb3J0IGEgc2FtcGxpbmcgcmF0ZSB0d2ljZQorICAgICAgICAgICAgICAgIG1TYW1wbGluZ1JhdGVzLmFkZChyYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKHNpemVfdCBrID0gMCA7IGsgPCBwb3J0LT5tQ2hhbm5lbE1hc2tzLnNpemUoKSA7IGsrKykgeworICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBtYXNrID0gcG9ydC0+bUNoYW5uZWxNYXNrcy5pdGVtQXQoayk7CisgICAgICAgIGlmIChtYXNrICE9IDApIHsgLy8gc2tpcCAiZHluYW1pYyIgbWFza3MKKyAgICAgICAgICAgIGJvb2wgaGFzTWFzayA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChzaXplX3QgbCA9IDAgOyBsIDwgbUNoYW5uZWxNYXNrcy5zaXplKCkgOyBsKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobWFzayA9PSBtQ2hhbm5lbE1hc2tzLml0ZW1BdChsKSkgeworICAgICAgICAgICAgICAgICAgICBoYXNNYXNrID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFoYXNNYXNrKSB7IC8vIG5ldmVyIGltcG9ydCBhIGNoYW5uZWwgbWFzayB0d2ljZQorICAgICAgICAgICAgICAgIG1DaGFubmVsTWFza3MuYWRkKG1hc2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZvciAoc2l6ZV90IGsgPSAwIDsgayA8IHBvcnQtPm1Gb3JtYXRzLnNpemUoKSA7IGsrKykgeworICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBwb3J0LT5tRm9ybWF0cy5pdGVtQXQoayk7CisgICAgICAgIGlmIChmb3JtYXQgIT0gMCkgeyAvLyBza2lwICJkeW5hbWljIiBmb3JtYXRzCisgICAgICAgICAgICBib29sIGhhc0Zvcm1hdCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChzaXplX3QgbCA9IDAgOyBsIDwgbUZvcm1hdHMuc2l6ZSgpIDsgbCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBtRm9ybWF0cy5pdGVtQXQobCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFzRm9ybWF0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFoYXNGb3JtYXQpIHsgLy8gbmV2ZXIgaW1wb3J0IGEgZm9ybWF0IHR3aWNlCisgICAgICAgICAgICAgICAgbUZvcm1hdHMuYWRkKGZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb3J0OjpjbGVhckNhcGFiaWxpdGllcygpIHsKKyAgICBtQ2hhbm5lbE1hc2tzLmNsZWFyKCk7CisgICAgbUZvcm1hdHMuY2xlYXIoKTsKKyAgICBtU2FtcGxpbmdSYXRlcy5jbGVhcigpOworfQorCit2b2lkIEF1ZGlvUG9ydDo6bG9hZFNhbXBsaW5nUmF0ZXMoY2hhciAqbmFtZSkKK3sKKyAgICBjaGFyICpzdHIgPSBzdHJ0b2sobmFtZSwgInwiKTsKKworICAgIC8vIGJ5IGNvbnZlbnRpb24sICIwJyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gbVNhbXBsaW5nUmF0ZXMgaW5kaWNhdGVzIHRoZSBzdXBwb3J0ZWQgc2FtcGxpbmcKKyAgICAvLyByYXRlcyBzaG91bGQgYmUgcmVhZCBmcm9tIHRoZSBvdXRwdXQgc3RyZWFtIGFmdGVyIGl0IGlzIG9wZW5lZCBmb3IgdGhlIGZpcnN0IHRpbWUKKyAgICBpZiAoc3RyICE9IE5VTEwgJiYgc3RyY21wKHN0ciwgRFlOQU1JQ19WQUxVRV9UQUcpID09IDApIHsKKyAgICAgICAgbVNhbXBsaW5nUmF0ZXMuYWRkKDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2hpbGUgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIHVpbnQzMl90IHJhdGUgPSBhdG9pKHN0cik7CisgICAgICAgIGlmIChyYXRlICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkU2FtcGxpbmdSYXRlcygpIGFkZGluZyByYXRlICVkIiwgcmF0ZSk7CisgICAgICAgICAgICBtU2FtcGxpbmdSYXRlcy5hZGQocmF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgc3RyID0gc3RydG9rKE5VTEwsICJ8Iik7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9ydDo6bG9hZEZvcm1hdHMoY2hhciAqbmFtZSkKK3sKKyAgICBjaGFyICpzdHIgPSBzdHJ0b2sobmFtZSwgInwiKTsKKworICAgIC8vIGJ5IGNvbnZlbnRpb24sICIwJyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gbUZvcm1hdHMgaW5kaWNhdGVzIHRoZSBzdXBwb3J0ZWQgZm9ybWF0cworICAgIC8vIHNob3VsZCBiZSByZWFkIGZyb20gdGhlIG91dHB1dCBzdHJlYW0gYWZ0ZXIgaXQgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZQorICAgIGlmIChzdHIgIT0gTlVMTCAmJiBzdHJjbXAoc3RyLCBEWU5BTUlDX1ZBTFVFX1RBRykgPT0gMCkgeworICAgICAgICBtRm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2hpbGUgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdClDb25maWdQYXJzaW5nVXRpbHM6OnN0cmluZ1RvRW51bShzRm9ybWF0TmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0Zvcm1hdE5hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKKyAgICAgICAgaWYgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICAgICAgbUZvcm1hdHMuYWRkKGZvcm1hdCk7CisgICAgICAgIH0KKyAgICAgICAgc3RyID0gc3RydG9rKE5VTEwsICJ8Iik7CisgICAgfQorICAgIC8vIHdlIHNvcnQgZnJvbSB3b3JzdCB0byBiZXN0LCBzbyB0aGF0IEFVRElPX0ZPUk1BVF9ERUZBVUxUIGlzIGFsd2F5cyB0aGUgZmlyc3QgZW50cnkuCisgICAgLy8gVE9ETzogY29tcGFyZUZvcm1hdHMgY291bGQgYmUgYSBsYW1iZGEgdG8gY29udmVydCBiZXR3ZWVuIHBvaW50ZXItdG8tZm9ybWF0IHRvIGZvcm1hdDoKKyAgICAvLyBbXShjb25zdCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0MSwgY29uc3QgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdDIpIHsKKyAgICAvLyAgICAgcmV0dXJuIGNvbXBhcmVGb3JtYXRzKCpmb3JtYXQxLCAqZm9ybWF0Mik7CisgICAgLy8gfQorICAgIG1Gb3JtYXRzLnNvcnQoY29tcGFyZUZvcm1hdHMpOworfQorCit2b2lkIEF1ZGlvUG9ydDo6bG9hZEluQ2hhbm5lbHMoY2hhciAqbmFtZSkKK3sKKyAgICBjb25zdCBjaGFyICpzdHIgPSBzdHJ0b2sobmFtZSwgInwiKTsKKworICAgIEFMT0dWKCJsb2FkSW5DaGFubmVscygpICVzIiwgbmFtZSk7CisKKyAgICBpZiAoc3RyICE9IE5VTEwgJiYgc3RyY21wKHN0ciwgRFlOQU1JQ19WQUxVRV9UQUcpID09IDApIHsKKyAgICAgICAgbUNoYW5uZWxNYXNrcy5hZGQoMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3aGlsZSAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPQorICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdClDb25maWdQYXJzaW5nVXRpbHM6OnN0cmluZ1RvRW51bShzSW5DaGFubmVsc05hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0luQ2hhbm5lbHNOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKKyAgICAgICAgaWYgKGNoYW5uZWxNYXNrID09IDApIHsgLy8gaWYgbm90IGZvdW5kLCBjaGVjayB0aGUgY2hhbm5lbCBpbmRleCB0YWJsZQorICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpCisgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnUGFyc2luZ1V0aWxzOjpzdHJpbmdUb0VudW0oc0luZGV4Q2hhbm5lbHNOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNJbmRleENoYW5uZWxzTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoYW5uZWxNYXNrICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkSW5DaGFubmVscygpIGFkZGluZyBjaGFubmVsTWFzayAlI3giLCBjaGFubmVsTWFzayk7CisgICAgICAgICAgICBtQ2hhbm5lbE1hc2tzLmFkZChjaGFubmVsTWFzayk7CisgICAgICAgIH0KKyAgICAgICAgc3RyID0gc3RydG9rKE5VTEwsICJ8Iik7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9ydDo6bG9hZE91dENoYW5uZWxzKGNoYXIgKm5hbWUpCit7CisgICAgY29uc3QgY2hhciAqc3RyID0gc3RydG9rKG5hbWUsICJ8Iik7CisKKyAgICBBTE9HVigibG9hZE91dENoYW5uZWxzKCkgJXMiLCBuYW1lKTsKKworICAgIC8vIGJ5IGNvbnZlbnRpb24sICIwJyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gbUNoYW5uZWxNYXNrcyBpbmRpY2F0ZXMgdGhlIHN1cHBvcnRlZCBjaGFubmVsCisgICAgLy8gbWFza3Mgc2hvdWxkIGJlIHJlYWQgZnJvbSB0aGUgb3V0cHV0IHN0cmVhbSBhZnRlciBpdCBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lCisgICAgaWYgKHN0ciAhPSBOVUxMICYmIHN0cmNtcChzdHIsIERZTkFNSUNfVkFMVUVfVEFHKSA9PSAwKSB7CisgICAgICAgIG1DaGFubmVsTWFza3MuYWRkKDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2hpbGUgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0KKyAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpQ29uZmlnUGFyc2luZ1V0aWxzOjpzdHJpbmdUb0VudW0oc091dENoYW5uZWxzTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzT3V0Q2hhbm5lbHNOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKKyAgICAgICAgaWYgKGNoYW5uZWxNYXNrID09IDApIHsgLy8gaWYgbm90IGZvdW5kLCBjaGVjayB0aGUgY2hhbm5lbCBpbmRleCB0YWJsZQorICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpCisgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnUGFyc2luZ1V0aWxzOjpzdHJpbmdUb0VudW0oc0luZGV4Q2hhbm5lbHNOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNJbmRleENoYW5uZWxzTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoYW5uZWxNYXNrICE9IDApIHsKKyAgICAgICAgICAgIG1DaGFubmVsTWFza3MuYWRkKGNoYW5uZWxNYXNrKTsKKyAgICAgICAgfQorICAgICAgICBzdHIgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCithdWRpb19nYWluX21vZGVfdCBBdWRpb1BvcnQ6OmxvYWRHYWluTW9kZShjaGFyICpuYW1lKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHN0cnRvayhuYW1lLCAifCIpOworCisgICAgQUxPR1YoImxvYWRHYWluTW9kZSgpICVzIiwgbmFtZSk7CisgICAgYXVkaW9fZ2Fpbl9tb2RlX3QgbW9kZSA9IDA7CisgICAgd2hpbGUgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIG1vZGUgfD0gKGF1ZGlvX2dhaW5fbW9kZV90KUNvbmZpZ1BhcnNpbmdVdGlsczo6c3RyaW5nVG9FbnVtKHNHYWluTW9kZU5hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0dhaW5Nb2RlTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cik7CisgICAgICAgIHN0ciA9IHN0cnRvayhOVUxMLCAifCIpOworICAgIH0KKyAgICByZXR1cm4gbW9kZTsKK30KKwordm9pZCBBdWRpb1BvcnQ6OmxvYWRHYWluKGNub2RlICpyb290LCBpbnQgaW5kZXgpCit7CisgICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKKworICAgIHNwPEF1ZGlvR2Fpbj4gZ2FpbiA9IG5ldyBBdWRpb0dhaW4oaW5kZXgsIG1Vc2VJbkNoYW5uZWxNYXNrKTsKKworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NT0RFKSA9PSAwKSB7CisgICAgICAgICAgICBnYWluLT5tR2Fpbi5tb2RlID0gbG9hZEdhaW5Nb2RlKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX0NIQU5ORUxTKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAobVVzZUluQ2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgICAgICBnYWluLT5tR2Fpbi5jaGFubmVsX21hc2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KUNvbmZpZ1BhcnNpbmdVdGlsczo6c3RyaW5nVG9FbnVtKHNJbkNoYW5uZWxzTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNJbkNoYW5uZWxzTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdhaW4tPm1HYWluLmNoYW5uZWxfbWFzayA9CisgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpQ29uZmlnUGFyc2luZ1V0aWxzOjpzdHJpbmdUb0VudW0oc091dENoYW5uZWxzTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNPdXRDaGFubmVsc05hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01JTl9WQUxVRSkgPT0gMCkgeworICAgICAgICAgICAgZ2Fpbi0+bUdhaW4ubWluX3ZhbHVlID0gYXRvaSgoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NQVhfVkFMVUUpID09IDApIHsKKyAgICAgICAgICAgIGdhaW4tPm1HYWluLm1heF92YWx1ZSA9IGF0b2koKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fREVGQVVMVF9WQUxVRSkgPT0gMCkgeworICAgICAgICAgICAgZ2Fpbi0+bUdhaW4uZGVmYXVsdF92YWx1ZSA9IGF0b2koKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fU1RFUF9WQUxVRSkgPT0gMCkgeworICAgICAgICAgICAgZ2Fpbi0+bUdhaW4uc3RlcF92YWx1ZSA9IGF0b2koKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTUlOX1JBTVBfTVMpID09IDApIHsKKyAgICAgICAgICAgIGdhaW4tPm1HYWluLm1pbl9yYW1wX21zID0gYXRvaSgoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NQVhfUkFNUF9NUykgPT0gMCkgeworICAgICAgICAgICAgZ2Fpbi0+bUdhaW4ubWF4X3JhbXBfbXMgPSBhdG9pKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKworICAgIEFMT0dWKCJsb2FkR2FpbigpIGFkZGluZyBuZXcgZ2FpbiBtb2RlICUwOHggY2hhbm5lbCBtYXNrICUwOHggbWluIG1CICVkIG1heCBtQiAlZCIsCisgICAgICAgICAgZ2Fpbi0+bUdhaW4ubW9kZSwgZ2Fpbi0+bUdhaW4uY2hhbm5lbF9tYXNrLCBnYWluLT5tR2Fpbi5taW5fdmFsdWUsIGdhaW4tPm1HYWluLm1heF92YWx1ZSk7CisKKyAgICBpZiAoZ2Fpbi0+bUdhaW4ubW9kZSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUdhaW5zLmFkZChnYWluKTsKK30KKwordm9pZCBBdWRpb1BvcnQ6OmxvYWRHYWlucyhjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgQUxPR1YoImxvYWRHYWlucygpIGxvYWRpbmcgZ2FpbiAlcyIsIG5vZGUtPm5hbWUpOworICAgICAgICBsb2FkR2Fpbihub2RlLCBpbmRleCsrKTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvcnQ6OmNoZWNrRXhhY3RTYW1wbGluZ1JhdGUodWludDMyX3Qgc2FtcGxpbmdSYXRlKSBjb25zdAoreworICAgIGlmIChtU2FtcGxpbmdSYXRlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIGlmIChtU2FtcGxpbmdSYXRlc1tpXSA9PSBzYW1wbGluZ1JhdGUpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitzdGF0dXNfdCBBdWRpb1BvcnQ6OmNoZWNrQ29tcGF0aWJsZVNhbXBsaW5nUmF0ZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgIHVpbnQzMl90ICp1cGRhdGVkU2FtcGxpbmdSYXRlKSBjb25zdAoreworICAgIGlmIChtU2FtcGxpbmdSYXRlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKHVwZGF0ZWRTYW1wbGluZ1JhdGUgIT0gTlVMTCkgeworICAgICAgICAgICAgKnVwZGF0ZWRTYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIC8vIFNlYXJjaCBmb3IgdGhlIGNsb3Nlc3Qgc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGUgdGhhdCBpcyBhYm92ZSAocHJlZmVycmVkKQorICAgIC8vIG9yIGJlbG93IChhY2NlcHRhYmxlKSB0aGUgZGVzaXJlZCBzYW1wbGluZyByYXRlLCB3aXRoaW4gYSBwZXJtaXR0ZWQgcmF0aW8uCisgICAgLy8gVGhlIHNhbXBsaW5nIHJhdGVzIGRvIG5vdCBuZWVkIHRvIGJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuCisgICAgc3NpemVfdCBtYXhCZWxvdyA9IC0xOworICAgIHNzaXplX3QgbWluQWJvdmUgPSAtMTsKKyAgICB1aW50MzJfdCBjYW5kaWRhdGU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkrKykgeworICAgICAgICBjYW5kaWRhdGUgPSBtU2FtcGxpbmdSYXRlc1tpXTsKKyAgICAgICAgaWYgKGNhbmRpZGF0ZSA9PSBzYW1wbGluZ1JhdGUpIHsKKyAgICAgICAgICAgIGlmICh1cGRhdGVkU2FtcGxpbmdSYXRlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqdXBkYXRlZFNhbXBsaW5nUmF0ZSA9IGNhbmRpZGF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICAvLyBjYW5kaWRhdGUgPCBkZXNpcmVkCisgICAgICAgIGlmIChjYW5kaWRhdGUgPCBzYW1wbGluZ1JhdGUpIHsKKyAgICAgICAgICAgIGlmIChtYXhCZWxvdyA8IDAgfHwgY2FuZGlkYXRlID4gbVNhbXBsaW5nUmF0ZXNbbWF4QmVsb3ddKSB7CisgICAgICAgICAgICAgICAgbWF4QmVsb3cgPSBpOworICAgICAgICAgICAgfQorICAgICAgICAvLyBjYW5kaWRhdGUgPiBkZXNpcmVkCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobWluQWJvdmUgPCAwIHx8IGNhbmRpZGF0ZSA8IG1TYW1wbGluZ1JhdGVzW21pbkFib3ZlXSkgeworICAgICAgICAgICAgICAgIG1pbkFib3ZlID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFByZWZlciB0byBkb3duLXNhbXBsZSBmcm9tIGEgaGlnaGVyIHNhbXBsaW5nIHJhdGUsIGFzIHdlIGdldCB0aGUgZGVzaXJlZCBmcmVxdWVuY3kgc3BlY3RydW0uCisgICAgaWYgKG1pbkFib3ZlID49IDApIHsKKyAgICAgICAgY2FuZGlkYXRlID0gbVNhbXBsaW5nUmF0ZXNbbWluQWJvdmVdOworICAgICAgICBpZiAoY2FuZGlkYXRlIC8gQVVESU9fUkVTQU1QTEVSX0RPV05fUkFUSU9fTUFYIDw9IHNhbXBsaW5nUmF0ZSkgeworICAgICAgICAgICAgaWYgKHVwZGF0ZWRTYW1wbGluZ1JhdGUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICp1cGRhdGVkU2FtcGxpbmdSYXRlID0gY2FuZGlkYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIC8vIEJ1dCBpZiB3ZSBoYXZlIHRvIHVwLXNhbXBsZSBmcm9tIGEgbG93ZXIgc2FtcGxpbmcgcmF0ZSwgdGhhdCdzIE9LLgorICAgIGlmIChtYXhCZWxvdyA+PSAwKSB7CisgICAgICAgIGNhbmRpZGF0ZSA9IG1TYW1wbGluZ1JhdGVzW21heEJlbG93XTsKKyAgICAgICAgaWYgKGNhbmRpZGF0ZSAqIEFVRElPX1JFU0FNUExFUl9VUF9SQVRJT19NQVggPj0gc2FtcGxpbmdSYXRlKSB7CisgICAgICAgICAgICBpZiAodXBkYXRlZFNhbXBsaW5nUmF0ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKnVwZGF0ZWRTYW1wbGluZ1JhdGUgPSBjYW5kaWRhdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gbGVhdmUgdXBkYXRlZFNhbXBsaW5nUmF0ZSB1bm1vZGlmaWVkCisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb3J0OjpjaGVja0V4YWN0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIGNvbnN0Cit7CisgICAgaWYgKG1DaGFubmVsTWFza3MuaXNFbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1DaGFubmVsTWFza3NbaV0gPT0gY2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitzdGF0dXNfdCBBdWRpb1BvcnQ6OmNoZWNrQ29tcGF0aWJsZUNoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqdXBkYXRlZENoYW5uZWxNYXNrKSBjb25zdAoreworICAgIGlmIChtQ2hhbm5lbE1hc2tzLmlzRW1wdHkoKSkgeworICAgICAgICBpZiAodXBkYXRlZENoYW5uZWxNYXNrICE9IE5VTEwpIHsKKyAgICAgICAgICAgICp1cGRhdGVkQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgY29uc3QgYm9vbCBpc1JlY29yZFRocmVhZCA9IG1UeXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVggJiYgbVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTks7CisgICAgY29uc3QgYm9vbCBpc0luZGV4ID0gYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9yZXByZXNlbnRhdGlvbihjaGFubmVsTWFzaykKKyAgICAgICAgICAgID09IEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fSU5ERVg7CisgICAgaW50IGJlc3RNYXRjaCA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKTsgaSArKykgeworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBzdXBwb3J0ZWQgPSBtQ2hhbm5lbE1hc2tzW2ldOworICAgICAgICBpZiAoc3VwcG9ydGVkID09IGNoYW5uZWxNYXNrKSB7CisgICAgICAgICAgICAvLyBFeGFjdCBtYXRjaGVzIGFsd2F5cyB0YWtlbi4KKyAgICAgICAgICAgIGlmICh1cGRhdGVkQ2hhbm5lbE1hc2sgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICp1cGRhdGVkQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFVRElPX0NIQU5ORUxfTk9ORSAodmFsdWU6IDApIGlzIHVzZWQgZm9yIGR5bmFtaWMgY2hhbm5lbCBzdXBwb3J0CisgICAgICAgIGlmIChpc1JlY29yZFRocmVhZCAmJiBzdXBwb3J0ZWQgIT0gQVVESU9fQ0hBTk5FTF9OT05FKSB7CisgICAgICAgICAgICAvLyBBcHByb3hpbWF0ZSAoYmVzdCkgbWF0Y2g6CisgICAgICAgICAgICAvLyBUaGUgbWF0Y2ggc2NvcmUgbWVhc3VyZXMgaG93IHdlbGwgdGhlIHN1cHBvcnRlZCBjaGFubmVsIG1hc2sgbWF0Y2hlcyB0aGUKKyAgICAgICAgICAgIC8vIGRlc2lyZWQgbWFzaywgd2hlcmUgaW5jcmVhc2luZy1pcy1iZXR0ZXIuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVE9ETzogU29tZSB0d2Vha3MgbWF5IGJlIG5lZWRlZC4KKyAgICAgICAgICAgIC8vIFNob3VsZCBiZSBhIHN0YXRpYyBmdW5jdGlvbiBvZiB0aGUgZGF0YSBwcm9jZXNzaW5nIGxpYnJhcnkuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSW4gcHJpb3JpdHk6CisgICAgICAgICAgICAvLyBtYXRjaCBzY29yZSA9IDEwMDAgaWYgbGVnYWN5IGNoYW5uZWwgY29udmVyc2lvbiBlcXVpdmFsZW50IChhbHdheXMgcHJlZmVyIHRoaXMpCisgICAgICAgICAgICAvLyBPUgorICAgICAgICAgICAgLy8gbWF0Y2ggc2NvcmUgKz0gMTAwIGlmIHRoZSBjaGFubmVsIG1hc2sgcmVwcmVzZW50YXRpb25zIG1hdGNoCisgICAgICAgICAgICAvLyBtYXRjaCBzY29yZSArPSBudW1iZXIgb2YgY2hhbm5lbHMgbWF0Y2hlZC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gbWF0Y2hlZCBjaGFubmVscywgdGhlIG1hc2sgbWF5IHN0aWxsIGJlIGFjY2VwdGVkCisgICAgICAgICAgICAvLyBidXQgdGhlIHBsYXliYWNrIG9yIHJlY29yZCB3aWxsIGJlIHNpbGVudC4KKyAgICAgICAgICAgIGNvbnN0IGJvb2wgaXNTdXBwb3J0ZWRJbmRleCA9IChhdWRpb19jaGFubmVsX21hc2tfZ2V0X3JlcHJlc2VudGF0aW9uKHN1cHBvcnRlZCkKKyAgICAgICAgICAgICAgICAgICAgPT0gQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9JTkRFWCk7CisgICAgICAgICAgICBpbnQgbWF0Y2g7CisgICAgICAgICAgICBpZiAoaXNJbmRleCAmJiBpc1N1cHBvcnRlZEluZGV4KSB7CisgICAgICAgICAgICAgICAgLy8gaW5kZXggZXF1aXZhbGVuY2UKKyAgICAgICAgICAgICAgICBtYXRjaCA9IDEwMCArIF9fYnVpbHRpbl9wb3Bjb3VudCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhjaGFubmVsTWFzaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhzdXBwb3J0ZWQpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNJbmRleCAmJiAhaXNTdXBwb3J0ZWRJbmRleCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGVxdWl2YWxlbnRCaXRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKHN1cHBvcnRlZCkpIC0gMSA7CisgICAgICAgICAgICAgICAgbWF0Y2ggPSBfX2J1aWx0aW5fcG9wY291bnQoCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoY2hhbm5lbE1hc2spICYgZXF1aXZhbGVudEJpdHMpOworICAgICAgICAgICAgfSBlbHNlIGlmICghaXNJbmRleCAmJiBpc1N1cHBvcnRlZEluZGV4KSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgZXF1aXZhbGVudEJpdHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hhbm5lbE1hc2spKSAtIDE7CisgICAgICAgICAgICAgICAgbWF0Y2ggPSBfX2J1aWx0aW5fcG9wY291bnQoCisgICAgICAgICAgICAgICAgICAgICAgICBlcXVpdmFsZW50Qml0cyAmIGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhzdXBwb3J0ZWQpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gcG9zaXRpb25hbCBlcXVpdmFsZW5jZQorICAgICAgICAgICAgICAgIG1hdGNoID0gMTAwICsgX19idWlsdGluX3BvcGNvdW50KAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGNoYW5uZWxNYXNrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKHN1cHBvcnRlZCkpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoc3VwcG9ydGVkKSB7CisgICAgICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0s6CisgICAgICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX0lOX1NURVJFTzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fTU9OTykgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSAxMDAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9JTl9NT05POgorICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTl9GUk9OVF9CQUNLCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gMTAwMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWF0Y2ggPiBiZXN0TWF0Y2gpIHsKKyAgICAgICAgICAgICAgICBiZXN0TWF0Y2ggPSBtYXRjaDsKKyAgICAgICAgICAgICAgICBpZiAodXBkYXRlZENoYW5uZWxNYXNrICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgKnVwZGF0ZWRDaGFubmVsTWFzayA9IHN1cHBvcnRlZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7IC8vIGFueSBtYXRjaCB3aWxsIGRvIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJlc3RNYXRjaCA+IDAgPyBOT19FUlJPUiA6IEJBRF9WQUxVRTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb3J0OjpjaGVja0V4YWN0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKK3sKKyAgICBpZiAobUZvcm1hdHMuaXNFbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Gb3JtYXRzLnNpemUoKTsgaSArKykgeworICAgICAgICBpZiAobUZvcm1hdHNbaV0gPT0gZm9ybWF0KSB7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb3J0OjpjaGVja0NvbXBhdGlibGVGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBhdWRpb19mb3JtYXRfdCAqdXBkYXRlZEZvcm1hdCkKKyAgICAgICAgY29uc3QKK3sKKyAgICBpZiAobUZvcm1hdHMuaXNFbXB0eSgpKSB7CisgICAgICAgIGlmICh1cGRhdGVkRm9ybWF0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICp1cGRhdGVkRm9ybWF0ID0gZm9ybWF0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBjb25zdCBib29sIGNoZWNrSW5leGFjdCA9IC8vIHdoZW4gcG9ydCBpcyBpbnB1dCBhbmQgZm9ybWF0IGlzIGxpbmVhciBwY20KKyAgICAgICAgICAgIG1UeXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVggJiYgbVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTksKKyAgICAgICAgICAgICYmIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KTsKKworICAgIC8vIGl0ZXJhdGUgZnJvbSBiZXN0IGZvcm1hdCB0byB3b3JzdCBmb3JtYXQgKHJldmVyc2Ugb3JkZXIpCisgICAgZm9yIChzc2l6ZV90IGkgPSBtRm9ybWF0cy5zaXplKCkgLSAxOyBpID49IDAgOyAtLWkpIHsKKyAgICAgICAgaWYgKG1Gb3JtYXRzW2ldID09IGZvcm1hdCB8fAorICAgICAgICAgICAgICAgIChjaGVja0luZXhhY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIG1Gb3JtYXRzW2ldICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXRzW2ldKSkpIHsKKyAgICAgICAgICAgIC8vIGZvciBpbmV4YWN0IGNoZWNrcyB3ZSB0YWtlIHRoZSBmaXJzdCBsaW5lYXIgcGNtIGZvcm1hdCBkdWUgdG8gc29ydGluZy4KKyAgICAgICAgICAgIGlmICh1cGRhdGVkRm9ybWF0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqdXBkYXRlZEZvcm1hdCA9IG1Gb3JtYXRzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9ydDo6cGlja1NhbXBsaW5nUmF0ZSgpIGNvbnN0Cit7CisgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB1bmluaXRpYWxpemVkIGR5bmFtaWMgcHJvZmlsZQorICAgIGlmIChtU2FtcGxpbmdSYXRlcy5zaXplKCkgPT0gMSAmJiBtU2FtcGxpbmdSYXRlc1swXSA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIEZvciBkaXJlY3Qgb3V0cHV0cywgcGljayBtaW5pbXVtIHNhbXBsaW5nIHJhdGU6IHRoaXMgaGVscHMgZW5zdXJpbmcgdGhhdCB0aGUKKyAgICAvLyBjaGFubmVsIGNvdW50IC8gc2FtcGxpbmcgcmF0ZSBjb21iaW5hdGlvbiBjaG9zZW4gd2lsbCBiZSBzdXBwb3J0ZWQgYnkgdGhlIGNvbm5lY3RlZAorICAgIC8vIHNpbmsKKyAgICBpZiAoKG1UeXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpICYmIChtUm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSAmJgorICAgICAgICAgICAgKG1GbGFncyAmIChBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QgfCBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSkpIHsKKyAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gVUlOVF9NQVg7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgICAgICBpZiAoKG1TYW1wbGluZ1JhdGVzW2ldIDwgc2FtcGxpbmdSYXRlKSAmJiAobVNhbXBsaW5nUmF0ZXNbaV0gPiAwKSkgeworICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSA9IG1TYW1wbGluZ1JhdGVzW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoc2FtcGxpbmdSYXRlID09IFVJTlRfTUFYKSA/IDAgOiBzYW1wbGluZ1JhdGU7CisgICAgfQorCisgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMDsKKyAgICB1aW50MzJfdCBtYXhSYXRlID0gTUFYX01JWEVSX1NBTVBMSU5HX1JBVEU7CisKKyAgICAvLyBGb3IgbWl4ZWQgb3V0cHV0IGFuZCBpbnB1dHMsIHVzZSBtYXggbWl4ZXIgc2FtcGxpbmcgcmF0ZXMuIERvIG5vdAorICAgIC8vIGxpbWl0IHNhbXBsaW5nIHJhdGUgb3RoZXJ3aXNlCisgICAgLy8gRm9yIGlucHV0cywgYWxzbyBzZWUgY2hlY2tDb21wYXRpYmxlU2FtcGxpbmdSYXRlKCkuCisgICAgaWYgKG1UeXBlICE9IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgbWF4UmF0ZSA9IFVJTlRfTUFYOworICAgIH0KKyAgICAvLyBUT0RPOiBzaG91bGQgbVNhbXBsaW5nUmF0ZXNbXSBiZSBvcmRlcmVkIGluIHRlcm1zIG9mIG91ciBwcmVmZXJlbmNlCisgICAgLy8gYW5kIHdlIHJldHVybiB0aGUgZmlyc3QgKGFuZCBoZW5jZSBtb3N0IHByZWZlcnJlZCkgbWF0Y2g/ICBUaGlzIGlzIG9mIGNvbmNlcm4gaWYKKyAgICAvLyB3ZSB3YW50IHRvIGNob29zZSA5NmtIeiBvdmVyIDE5MmtIeiBmb3IgVVNCIGRyaXZlciBzdGFiaWxpdHkgb3IgcmVzb3VyY2UgY29uc3RyYWludHMuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgaWYgKChtU2FtcGxpbmdSYXRlc1tpXSA+IHNhbXBsaW5nUmF0ZSkgJiYgKG1TYW1wbGluZ1JhdGVzW2ldIDw9IG1heFJhdGUpKSB7CisgICAgICAgICAgICBzYW1wbGluZ1JhdGUgPSBtU2FtcGxpbmdSYXRlc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2FtcGxpbmdSYXRlOworfQorCithdWRpb19jaGFubmVsX21hc2tfdCBBdWRpb1BvcnQ6OnBpY2tDaGFubmVsTWFzaygpIGNvbnN0Cit7CisgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB1bmluaXRpYWxpemVkIGR5bmFtaWMgcHJvZmlsZQorICAgIGlmIChtQ2hhbm5lbE1hc2tzLnNpemUoKSA9PSAxICYmIG1DaGFubmVsTWFza3NbMF0gPT0gMCkgeworICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9OT05FOworICAgIH0KKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKKworICAgIC8vIEZvciBkaXJlY3Qgb3V0cHV0cywgcGljayBtaW5pbXVtIGNoYW5uZWwgY291bnQ6IHRoaXMgaGVscHMgZW5zdXJpbmcgdGhhdCB0aGUKKyAgICAvLyBjaGFubmVsIGNvdW50IC8gc2FtcGxpbmcgcmF0ZSBjb21iaW5hdGlvbiBjaG9zZW4gd2lsbCBiZSBzdXBwb3J0ZWQgYnkgdGhlIGNvbm5lY3RlZAorICAgIC8vIHNpbmsKKyAgICBpZiAoKG1UeXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpICYmIChtUm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSAmJgorICAgICAgICAgICAgKG1GbGFncyAmIChBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QgfCBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSkpIHsKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gVUlOVF9NQVg7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGNubENvdW50OworICAgICAgICAgICAgaWYgKG1Vc2VJbkNoYW5uZWxNYXNrKSB7CisgICAgICAgICAgICAgICAgY25sQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhtQ2hhbm5lbE1hc2tzW2ldKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY25sQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobUNoYW5uZWxNYXNrc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGNubENvdW50IDwgY2hhbm5lbENvdW50KSAmJiAoY25sQ291bnQgPiAwKSkgeworICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrID0gbUNoYW5uZWxNYXNrc1tpXTsKKyAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQgPSBjbmxDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2hhbm5lbE1hc2s7CisgICAgfQorCisgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gMDsKKyAgICB1aW50MzJfdCBtYXhDb3VudCA9IE1BWF9NSVhFUl9DSEFOTkVMX0NPVU5UOworCisgICAgLy8gRm9yIG1peGVkIG91dHB1dCBhbmQgaW5wdXRzLCB1c2UgbWF4IG1peGVyIGNoYW5uZWwgY291bnQuIERvIG5vdAorICAgIC8vIGxpbWl0IGNoYW5uZWwgY291bnQgb3RoZXJ3aXNlCisgICAgaWYgKG1UeXBlICE9IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgbWF4Q291bnQgPSBVSU5UX01BWDsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKTsgaSArKykgeworICAgICAgICB1aW50MzJfdCBjbmxDb3VudDsKKyAgICAgICAgaWYgKG1Vc2VJbkNoYW5uZWxNYXNrKSB7CisgICAgICAgICAgICBjbmxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1DaGFubmVsTWFza3NbaV0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY25sQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobUNoYW5uZWxNYXNrc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChjbmxDb3VudCA+IGNoYW5uZWxDb3VudCkgJiYgKGNubENvdW50IDw9IG1heENvdW50KSkgeworICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2tzW2ldOworICAgICAgICAgICAgY2hhbm5lbENvdW50ID0gY25sQ291bnQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNoYW5uZWxNYXNrOworfQorCisvKiBmb3JtYXQgaW4gb3JkZXIgb2YgaW5jcmVhc2luZyBwcmVmZXJlbmNlICovCitjb25zdCBhdWRpb19mb3JtYXRfdCBBdWRpb1BvcnQ6OnNQY21Gb3JtYXRDb21wYXJlVGFibGVbXSA9IHsKKyAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQsCisgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAorICAgICAgICBBVURJT19GT1JNQVRfUENNXzhfMjRfQklULAorICAgICAgICBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQsCisgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMzJfQklULAorICAgICAgICBBVURJT19GT1JNQVRfUENNX0ZMT0FULAorfTsKKworaW50IEF1ZGlvUG9ydDo6Y29tcGFyZUZvcm1hdHMoYXVkaW9fZm9ybWF0X3QgZm9ybWF0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0MikKK3sKKyAgICAvLyBOT1RFOiBBVURJT19GT1JNQVRfSU5WQUxJRCBpcyBhbHNvIGNvbnNpZGVyZWQgbm90IFBDTSBhbmQgd2lsbCBiZSBjb21wYXJlZCBlcXVhbCB0byBhbnkKKyAgICAvLyBjb21wcmVzc2VkIGZvcm1hdCBhbmQgYmV0dGVyIHRoYW4gYW55IFBDTSBmb3JtYXQuIFRoaXMgaXMgYnkgZGVzaWduIG9mIHBpY2tGb3JtYXQoKQorICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQxKSkgeworICAgICAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0MikpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0MikpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGludCBpbmRleDEgPSAtMSwgaW5kZXgyID0gLTE7CisgICAgZm9yIChzaXplX3QgaSA9IDA7CisgICAgICAgICAgICAoaSA8IEFSUkFZX1NJWkUoc1BjbUZvcm1hdENvbXBhcmVUYWJsZSkpICYmICgoaW5kZXgxID09IC0xKSB8fCAoaW5kZXgyID09IC0xKSk7CisgICAgICAgICAgICBpICsrKSB7CisgICAgICAgIGlmIChzUGNtRm9ybWF0Q29tcGFyZVRhYmxlW2ldID09IGZvcm1hdDEpIHsKKyAgICAgICAgICAgIGluZGV4MSA9IGk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNQY21Gb3JtYXRDb21wYXJlVGFibGVbaV0gPT0gZm9ybWF0MikgeworICAgICAgICAgICAgaW5kZXgyID0gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBmb3JtYXQxIG5vdCBmb3VuZCA9PiBpbmRleDEgPCAwID0+IGZvcm1hdDIgPiBmb3JtYXQxCisgICAgLy8gZm9ybWF0MiBub3QgZm91bmQgPT4gaW5kZXgyIDwgMCA9PiBmb3JtYXQyIDwgZm9ybWF0MQorICAgIHJldHVybiBpbmRleDEgLSBpbmRleDI7Cit9CisKK2F1ZGlvX2Zvcm1hdF90IEF1ZGlvUG9ydDo6cGlja0Zvcm1hdCgpIGNvbnN0Cit7CisgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB1bmluaXRpYWxpemVkIGR5bmFtaWMgcHJvZmlsZQorICAgIGlmIChtRm9ybWF0cy5zaXplKCkgPT0gMSAmJiBtRm9ybWF0c1swXSA9PSAwKSB7CisgICAgICAgIHJldHVybiBBVURJT19GT1JNQVRfREVGQVVMVDsKKyAgICB9CisKKyAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKKyAgICBhdWRpb19mb3JtYXRfdCBiZXN0Rm9ybWF0ID0KKyAgICAgICAgICAgIEF1ZGlvUG9ydDo6c1BjbUZvcm1hdENvbXBhcmVUYWJsZVsKKyAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKEF1ZGlvUG9ydDo6c1BjbUZvcm1hdENvbXBhcmVUYWJsZSkgLSAxXTsKKyAgICAvLyBGb3IgbWl4ZWQgb3V0cHV0IGFuZCBpbnB1dHMsIHVzZSBiZXN0IG1peGVyIG91dHB1dCBmb3JtYXQuIERvIG5vdAorICAgIC8vIGxpbWl0IGZvcm1hdCBvdGhlcndpc2UKKyAgICBpZiAoKG1UeXBlICE9IEFVRElPX1BPUlRfVFlQRV9NSVgpIHx8CisgICAgICAgICAgICAoKG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpICYmCisgICAgICAgICAgICAgKCgobUZsYWdzICYgKEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpKSAhPSAwKSkpKSB7CisgICAgICAgIGJlc3RGb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Gb3JtYXRzLnNpemUoKTsgaSArKykgeworICAgICAgICBpZiAoKGNvbXBhcmVGb3JtYXRzKG1Gb3JtYXRzW2ldLCBmb3JtYXQpID4gMCkgJiYKKyAgICAgICAgICAgICAgICAoY29tcGFyZUZvcm1hdHMobUZvcm1hdHNbaV0sIGJlc3RGb3JtYXQpIDw9IDApKSB7CisgICAgICAgICAgICBmb3JtYXQgPSBtRm9ybWF0c1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZm9ybWF0OworfQorCitzdGF0dXNfdCBBdWRpb1BvcnQ6OmNoZWNrR2Fpbihjb25zdCBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmdhaW5Db25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3QKK3sKKyAgICBpZiAoaW5kZXggPCAwIHx8IChzaXplX3QpaW5kZXggPj0gbUdhaW5zLnNpemUoKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gbUdhaW5zW2luZGV4XS0+Y2hlY2tDb25maWcoZ2FpbkNvbmZpZyk7Cit9CisKK3ZvaWQgQXVkaW9Qb3J0OjpkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3QKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIGlmIChtTmFtZS5sZW5ndGgoKSAhPSAwKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbmFtZTogJXNcbiIsIHNwYWNlcywgIiIsIG1OYW1lLnN0cmluZygpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIH0KKworICAgIGlmIChtU2FtcGxpbmdSYXRlcy5zaXplKCkgIT0gMCkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHNhbXBsaW5nIHJhdGVzOiAiLCBzcGFjZXMsICIiKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA9PSAwICYmIG1TYW1wbGluZ1JhdGVzW2ldID09IDApIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJEeW5hbWljIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiVkIiwgbVNhbXBsaW5nUmF0ZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpID09IChtU2FtcGxpbmdSYXRlcy5zaXplKCkgLSAxKSA/ICIiIDogIiwgIik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICB9CisKKyAgICBpZiAobUNoYW5uZWxNYXNrcy5zaXplKCkgIT0gMCkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGNoYW5uZWwgbWFza3M6ICIsIHNwYWNlcywgIiIpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgQUxPR1YoIkF1ZGlvUG9ydDo6ZHVtcCBtQ2hhbm5lbE1hc2tzICV6dSAlMDh4IiwgaSwgbUNoYW5uZWxNYXNrc1tpXSk7CisKKyAgICAgICAgICAgIGlmIChpID09IDAgJiYgbUNoYW5uZWxNYXNrc1tpXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiRHluYW1pYyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIweCUwNHgiLCBtQ2hhbm5lbE1hc2tzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaSA9PSAobUNoYW5uZWxNYXNrcy5zaXplKCkgLSAxKSA/ICIiIDogIiwgIik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICB9CisKKyAgICBpZiAobUZvcm1hdHMuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBmb3JtYXRzOiAiLCBzcGFjZXMsICIiKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Gb3JtYXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXRTdHIgPSBDb25maWdQYXJzaW5nVXRpbHM6OmVudW1Ub1N0cmluZyhzRm9ybWF0TmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0Zvcm1hdE5hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdHNbaV0pOworICAgICAgICAgICAgY29uc3QgYm9vbCBpc0VtcHR5U3RyID0gZm9ybWF0U3RyWzBdID09IDA7CisgICAgICAgICAgICBpZiAoaSA9PSAwICYmIGlzRW1wdHlTdHIpIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJEeW5hbWljIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChpc0VtcHR5U3RyKSB7CisgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUjeCIsIG1Gb3JtYXRzW2ldKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlcyIsIGZvcm1hdFN0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpID09IChtRm9ybWF0cy5zaXplKCkgLSAxKSA/ICIiIDogIiwgIik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICB9CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgaWYgKG1HYWlucy5zaXplKCkgIT0gMCkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGdhaW5zOlxuIiwgc3BhY2VzLCAiIik7CisgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpICsgMSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUdhaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtR2FpbnNbaV0tPmR1bXAoZmQsIHNwYWNlcyArIDIsIGkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9ydDo6bG9nKGNvbnN0IGNoYXIqIGluZGVudCkgY29uc3QKK3sKKyAgICBBTE9HSSgiJXMgUG9ydFtubTolcywgdHlwZTolZCwgcm9sZTolZF0iLCBpbmRlbnQsIG1OYW1lLnN0cmluZygpLCBtVHlwZSwgbVJvbGUpOworfQorCisvLyAtLS0gQXVkaW9Qb3J0Q29uZmlnIGNsYXNzIGltcGxlbWVudGF0aW9uCisKK0F1ZGlvUG9ydENvbmZpZzo6QXVkaW9Qb3J0Q29uZmlnKCkKK3sKKyAgICBtU2FtcGxpbmdSYXRlID0gMDsKKyAgICBtQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CisgICAgbUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgIG1HYWluLmluZGV4ID0gLTE7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9ydENvbmZpZzo6YXBwbHlBdWRpb1BvcnRDb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmJhY2t1cENvbmZpZykKK3sKKyAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgbG9jYWxCYWNrdXBDb25maWc7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICBsb2NhbEJhY2t1cENvbmZpZy5jb25maWdfbWFzayA9IGNvbmZpZy0+Y29uZmlnX21hc2s7CisgICAgdG9BdWRpb1BvcnRDb25maWcoJmxvY2FsQmFja3VwQ29uZmlnKTsKKworICAgIHNwPEF1ZGlvUG9ydD4gYXVkaW9wb3J0ID0gZ2V0QXVkaW9Qb3J0KCk7CisgICAgaWYgKGF1ZGlvcG9ydCA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSkgeworICAgICAgICBzdGF0dXMgPSBhdWRpb3BvcnQtPmNoZWNrRXhhY3RTYW1wbGluZ1JhdGUoY29uZmlnLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgICAgICBtU2FtcGxpbmdSYXRlID0gY29uZmlnLT5zYW1wbGVfcmF0ZTsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0spIHsKKyAgICAgICAgc3RhdHVzID0gYXVkaW9wb3J0LT5jaGVja0V4YWN0Q2hhbm5lbE1hc2soY29uZmlnLT5jaGFubmVsX21hc2spOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgbUNoYW5uZWxNYXNrID0gY29uZmlnLT5jaGFubmVsX21hc2s7CisgICAgfQorICAgIGlmIChjb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSB7CisgICAgICAgIHN0YXR1cyA9IGF1ZGlvcG9ydC0+Y2hlY2tFeGFjdEZvcm1hdChjb25maWctPmZvcm1hdCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgICAgICBtRm9ybWF0ID0gY29uZmlnLT5mb3JtYXQ7CisgICAgfQorICAgIGlmIChjb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfR0FJTikgeworICAgICAgICBzdGF0dXMgPSBhdWRpb3BvcnQtPmNoZWNrR2FpbigmY29uZmlnLT5nYWluLCBjb25maWctPmdhaW4uaW5kZXgpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgbUdhaW4gPSBjb25maWctPmdhaW47CisgICAgfQorCitleGl0OgorICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgYXBwbHlBdWRpb1BvcnRDb25maWcoJmxvY2FsQmFja3VwQ29uZmlnKTsKKyAgICB9CisgICAgaWYgKGJhY2t1cENvbmZpZyAhPSBOVUxMKSB7CisgICAgICAgICpiYWNrdXBDb25maWcgPSBsb2NhbEJhY2t1cENvbmZpZzsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBBdWRpb1BvcnRDb25maWc6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAoreworICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpIHsKKyAgICAgICAgZHN0Q29uZmlnLT5zYW1wbGVfcmF0ZSA9IG1TYW1wbGluZ1JhdGU7CisgICAgICAgIGlmICgoc3JjQ29uZmlnICE9IE5VTEwpICYmIChzcmNDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpKSB7CisgICAgICAgICAgICBkc3RDb25maWctPnNhbXBsZV9yYXRlID0gc3JjQ29uZmlnLT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRzdENvbmZpZy0+c2FtcGxlX3JhdGUgPSAwOworICAgIH0KKyAgICBpZiAoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgeworICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IG1DaGFubmVsTWFzazsKKyAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0spKSB7CisgICAgICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IHNyY0NvbmZpZy0+Y2hhbm5lbF9tYXNrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHN0Q29uZmlnLT5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CisgICAgfQorICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSB7CisgICAgICAgIGRzdENvbmZpZy0+Zm9ybWF0ID0gbUZvcm1hdDsKKyAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpKSB7CisgICAgICAgICAgICBkc3RDb25maWctPmZvcm1hdCA9IHNyY0NvbmZpZy0+Zm9ybWF0OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHN0Q29uZmlnLT5mb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICB9CisgICAgaWYgKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19HQUlOKSB7CisgICAgICAgIGRzdENvbmZpZy0+Z2FpbiA9IG1HYWluOworICAgICAgICBpZiAoKHNyY0NvbmZpZyAhPSBOVUxMKSAmJiAoc3JjQ29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0dBSU4pKSB7CisgICAgICAgICAgICBkc3RDb25maWctPmdhaW4gPSBzcmNDb25maWctPmdhaW47CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBkc3RDb25maWctPmdhaW4uaW5kZXggPSAtMTsKKyAgICB9CisgICAgaWYgKGRzdENvbmZpZy0+Z2Fpbi5pbmRleCAhPSAtMSkgeworICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0dBSU47CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayAmPSB+QVVESU9fUE9SVF9DT05GSUdfR0FJTjsKKyAgICB9Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Db25maWdQYXJzaW5nVXRpbHMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ29uZmlnUGFyc2luZ1V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWVmMDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ29uZmlnUGFyc2luZ1V0aWxzLmNwcApAQCAtMCwwICsxLDI4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpDb25maWdQYXJzaW5nVXRpbHMiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJDb25maWdQYXJzaW5nVXRpbHMuaCIKKyNpbmNsdWRlICJBdWRpb0dhaW4uaCIKKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy9zdGF0aWMKK3VpbnQzMl90IENvbmZpZ1BhcnNpbmdVdGlsczo6c3RyaW5nVG9FbnVtKGNvbnN0IHN0cnVjdCBTdHJpbmdUb0VudW0gKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgaWYgKHN0cmNtcCh0YWJsZVtpXS5uYW1lLCBuYW1lKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVigic3RyaW5nVG9FbnVtKCkgZm91bmQgJXMiLCB0YWJsZVtpXS5uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiB0YWJsZVtpXS52YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLy9zdGF0aWMKK2NvbnN0IGNoYXIgKkNvbmZpZ1BhcnNpbmdVdGlsczo6ZW51bVRvU3RyaW5nKGNvbnN0IHN0cnVjdCBTdHJpbmdUb0VudW0gKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGlmICh0YWJsZVtpXS52YWx1ZSA9PSB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHRhYmxlW2ldLm5hbWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICIiOworfQorCisvL3N0YXRpYworYm9vbCBDb25maWdQYXJzaW5nVXRpbHM6OnN0cmluZ1RvQm9vbChjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgICByZXR1cm4gKChzdHJjYXNlY21wKCJ0cnVlIiwgdmFsdWUpID09IDApIHx8IChzdHJjbXAoIjEiLCB2YWx1ZSkgPT0gMCkpOworfQorCisKKy8vIC0tLSBhdWRpb19wb2xpY3kuY29uZiBmaWxlIHBhcnNpbmcKKy8vc3RhdGljCit1aW50MzJfdCBDb25maWdQYXJzaW5nVXRpbHM6OnBhcnNlT3V0cHV0RmxhZ05hbWVzKGNoYXIgKm5hbWUpCit7CisgICAgdWludDMyX3QgZmxhZyA9IDA7CisKKyAgICAvLyBpdCBpcyBPSyB0byBjYXN0IG5hbWUgdG8gbm9uIGNvbnN0IGhlcmUgYXMgd2UgYXJlIG5vdCBnb2luZyB0byB1c2UgaXQgYWZ0ZXIKKyAgICAvLyBzdHJ0b2soKSBtb2RpZmllcyBpdAorICAgIGNoYXIgKmZsYWdOYW1lID0gc3RydG9rKG5hbWUsICJ8Iik7CisgICAgd2hpbGUgKGZsYWdOYW1lICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHN0cmxlbihmbGFnTmFtZSkgIT0gMCkgeworICAgICAgICAgICAgZmxhZyB8PSBDb25maWdQYXJzaW5nVXRpbHM6OnN0cmluZ1RvRW51bShzT3V0cHV0RmxhZ05hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNPdXRwdXRGbGFnTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ05hbWUgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICB9CisgICAgLy9mb3JjZSBkaXJlY3QgZmxhZyBpZiBvZmZsb2FkIGZsYWcgaXMgc2V0OiBvZmZsb2FkaW5nIGltcGxpZXMgYSBkaXJlY3Qgb3V0cHV0IHN0cmVhbQorICAgIC8vIGFuZCBhbGwgY29tbW9uIGJlaGF2aW9ycyBhcmUgZHJpdmVuIGJ5IGNoZWNraW5nIG9ubHkgdGhlIGRpcmVjdCBmbGFnCisgICAgLy8gdGhpcyBzaG91bGQgbm9ybWFsbHkgYmUgc2V0IGFwcHJvcHJpYXRlbHkgaW4gdGhlIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUKKyAgICBpZiAoKGZsYWcgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSB7CisgICAgICAgIGZsYWcgfD0gQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUOworICAgIH0KKworICAgIHJldHVybiBmbGFnOworfQorCisvL3N0YXRpYwordWludDMyX3QgQ29uZmlnUGFyc2luZ1V0aWxzOjpwYXJzZUlucHV0RmxhZ05hbWVzKGNoYXIgKm5hbWUpCit7CisgICAgdWludDMyX3QgZmxhZyA9IDA7CisKKyAgICAvLyBpdCBpcyBPSyB0byBjYXN0IG5hbWUgdG8gbm9uIGNvbnN0IGhlcmUgYXMgd2UgYXJlIG5vdCBnb2luZyB0byB1c2UgaXQgYWZ0ZXIKKyAgICAvLyBzdHJ0b2soKSBtb2RpZmllcyBpdAorICAgIGNoYXIgKmZsYWdOYW1lID0gc3RydG9rKG5hbWUsICJ8Iik7CisgICAgd2hpbGUgKGZsYWdOYW1lICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHN0cmxlbihmbGFnTmFtZSkgIT0gMCkgeworICAgICAgICAgICAgZmxhZyB8PSBzdHJpbmdUb0VudW0oc0lucHV0RmxhZ05hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNJbnB1dEZsYWdOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdOYW1lKTsKKyAgICAgICAgfQorICAgICAgICBmbGFnTmFtZSA9IHN0cnRvayhOVUxMLCAifCIpOworICAgIH0KKyAgICByZXR1cm4gZmxhZzsKK30KKworLy9zdGF0aWMKK2F1ZGlvX2RldmljZXNfdCBDb25maWdQYXJzaW5nVXRpbHM6OnBhcnNlRGV2aWNlTmFtZXMoY2hhciAqbmFtZSkKK3sKKyAgICB1aW50MzJfdCBkZXZpY2UgPSAwOworCisgICAgY2hhciAqZGV2TmFtZSA9IHN0cnRvayhuYW1lLCAifCIpOworICAgIHdoaWxlIChkZXZOYW1lICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHN0cmxlbihkZXZOYW1lKSAhPSAwKSB7CisgICAgICAgICAgICBkZXZpY2UgfD0gc3RyaW5nVG9FbnVtKHNEZXZpY2VUeXBlVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VUeXBlVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2TmFtZSk7CisgICAgICAgICB9CisgICAgICAgIGRldk5hbWUgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICAgfQorICAgIHJldHVybiBkZXZpY2U7Cit9CisKKy8vc3RhdGljCit2b2lkIENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZEh3TW9kdWxlKGNub2RlICpyb290LCBId01vZHVsZUNvbGxlY3Rpb24gJmh3TW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVJbnB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRlZmF1bHRPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZpc1NwZWFrZXJEcmNFbmFibGUpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTkFNRV9OT1RfRk9VTkQ7CisgICAgY25vZGUgKm5vZGU7CisgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IG5ldyBId01vZHVsZShyb290LT5uYW1lKTsKKworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBERVZJQ0VTX1RBRyk7CisgICAgaWYgKG5vZGUgIT0gTlVMTCkgeworICAgICAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlKCkgbG9hZGluZyBkZXZpY2UgJXMiLCBub2RlLT5uYW1lKTsKKyAgICAgICAgICAgIHN0YXR1c190IHRtcFN0YXR1cyA9IG1vZHVsZS0+bG9hZERldmljZShub2RlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTkFNRV9OT1RfRk9VTkQgfHwgc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdG1wU3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIE9VVFBVVFNfVEFHKTsKKyAgICBpZiAobm9kZSAhPSBOVUxMKSB7CisgICAgICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKKyAgICAgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGUoKSBsb2FkaW5nIG91dHB1dCAlcyIsIG5vZGUtPm5hbWUpOworICAgICAgICAgICAgc3RhdHVzX3QgdG1wU3RhdHVzID0gbW9kdWxlLT5sb2FkT3V0cHV0KG5vZGUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOQU1FX05PVF9GT1VORCB8fCBzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB0bXBTdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICAgICAgfQorICAgIH0KKyAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgSU5QVVRTX1RBRyk7CisgICAgaWYgKG5vZGUgIT0gTlVMTCkgeworICAgICAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlKCkgbG9hZGluZyBpbnB1dCAlcyIsIG5vZGUtPm5hbWUpOworICAgICAgICAgICAgc3RhdHVzX3QgdG1wU3RhdHVzID0gbW9kdWxlLT5sb2FkSW5wdXQobm9kZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5BTUVfTk9UX0ZPVU5EIHx8IHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRtcFN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgICAgICB9CisgICAgfQorICAgIGxvYWRHbG9iYWxDb25maWcocm9vdCwgbW9kdWxlLCBhdmFpbGFibGVJbnB1dERldmljZXMsIGF2YWlsYWJsZU91dHB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0T3V0cHV0RGV2aWNlcywgaXNTcGVha2VyRHJjRW5hYmxlKTsKKworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaHdNb2R1bGVzLmFkZChtb2R1bGUpOworICAgIH0KK30KKworLy9zdGF0aWMKK3ZvaWQgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkSHdNb2R1bGVzKGNub2RlICpyb290LCBId01vZHVsZUNvbGxlY3Rpb24gJmh3TW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlSW5wdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRlZmF1bHRPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmaXNTcGVha2VyRHJjRW5hYmxlZCkKK3sKKyAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIEFVRElPX0hXX01PRFVMRV9UQUcpOworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlcygpIGxvYWRpbmcgbW9kdWxlICVzIiwgbm9kZS0+bmFtZSk7CisgICAgICAgIGxvYWRId01vZHVsZShub2RlLCBod01vZHVsZXMsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRPdXRwdXREZXZpY2VzLCBpc1NwZWFrZXJEcmNFbmFibGVkKTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorfQorCisvL3N0YXRpYwordm9pZCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRHbG9iYWxDb25maWcoY25vZGUgKnJvb3QsIGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVJbnB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZU91dHB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGVmYXVsdE91dHB1dERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJnNwZWFrZXJEcmNFbmFibGVkKQoreworICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgR0xPQkFMX0NPTkZJR19UQUcpOworCisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIERldmljZVZlY3RvciBkZWNsYXJlZERldmljZXM7CisgICAgaWYgKG1vZHVsZSAhPSBOVUxMKSB7CisgICAgICAgIGRlY2xhcmVkRGV2aWNlcyA9IG1vZHVsZS0+bURlY2xhcmVkRGV2aWNlczsKKyAgICB9CisKKyAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgaWYgKHN0cmNtcChBVFRBQ0hFRF9PVVRQVVRfREVWSUNFU19UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXMubG9hZERldmljZXNGcm9tVGFnKChjaGFyICopbm9kZS0+dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkRGV2aWNlcyk7CisgICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIEF0dGFjaGVkIE91dHB1dCBEZXZpY2VzICUwOHgiLAorICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoREVGQVVMVF9PVVRQVVRfREVWSUNFX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgeworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IChhdWRpb19kZXZpY2VzX3Qpc3RyaW5nVG9FbnVtKAorICAgICAgICAgICAgICAgICAgICBzRGV2aWNlVHlwZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VUeXBlVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBkZWZhdWx0T3V0cHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoZGV2aWNlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coImxvYWRHbG9iYWxDb25maWcoKSBkZWZhdWx0IGRldmljZSBub3Qgc3BlY2lmaWVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIG1EZWZhdWx0T3V0cHV0RGV2aWNlICUwOHgiLCBkZWZhdWx0T3V0cHV0RGV2aWNlLT50eXBlKCkpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChBVFRBQ0hFRF9JTlBVVF9ERVZJQ0VTX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgeworICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLmxvYWREZXZpY2VzRnJvbVRhZygoY2hhciAqKW5vZGUtPnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkRGV2aWNlcyk7CisgICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIEF2YWlsYWJsZSBJbnB1dERldmljZXMgJTA4eCIsIGF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoU1BFQUtFUl9EUkNfRU5BQkxFRF9UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKKyAgICAgICAgICAgIHNwZWFrZXJEcmNFbmFibGVkID0gc3RyaW5nVG9Cb29sKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICAgICAgQUxPR1YoImxvYWRHbG9iYWxDb25maWcoKSBtU3BlYWtlckRyY0VuYWJsZWQgPSAlZCIsIHNwZWFrZXJEcmNFbmFibGVkKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoQVVESU9fSEFMX1ZFUlNJT05fVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICB1aW50MzJfdCBtYWpvciwgbWlub3I7CisgICAgICAgICAgICBzc2NhbmYoKGNoYXIgKilub2RlLT52YWx1ZSwgIiV1LiV1IiwgJm1ham9yLCAmbWlub3IpOworICAgICAgICAgICAgbW9kdWxlLT5tSGFsVmVyc2lvbiA9IEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTihtYWpvciwgbWlub3IpOworICAgICAgICAgICAgQUxPR1YoImxvYWRHbG9iYWxDb25maWcoKSBtSGFsVmVyc2lvbiA9ICUwNHggbWFqb3IgJXUgbWlub3IgJXUiLAorICAgICAgICAgICAgICAgICAgbW9kdWxlLT5tSGFsVmVyc2lvbiwgbWFqb3IsIG1pbm9yKTsKKyAgICAgICAgfQorICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9Cit9CisKKy8vc3RhdGljCitzdGF0dXNfdCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRBdWRpb1BvbGljeUNvbmZpZyhjb25zdCBjaGFyICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHdNb2R1bGVDb2xsZWN0aW9uICZod01vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZUlucHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+ICZkZWZhdWx0T3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJmlzU3BlYWtlckRyY0VuYWJsZWQpCit7CisgICAgY25vZGUgKnJvb3Q7CisgICAgY2hhciAqZGF0YTsKKworICAgIGRhdGEgPSAoY2hhciAqKWxvYWRfZmlsZShwYXRoLCBOVUxMKTsKKyAgICBpZiAoZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKyAgICByb290ID0gY29uZmlnX25vZGUoIiIsICIiKTsKKyAgICBjb25maWdfbG9hZChyb290LCBkYXRhKTsKKworICAgIGxvYWRId01vZHVsZXMocm9vdCwgaHdNb2R1bGVzLAorICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgZGVmYXVsdE91dHB1dERldmljZXMsIGlzU3BlYWtlckRyY0VuYWJsZWQpOworICAgIC8vIGxlZ2FjeSBhdWRpb19wb2xpY3kuY29uZiBmaWxlcyBoYXZlIG9uZSBnbG9iYWxfY29uZmlndXJhdGlvbiBzZWN0aW9uCisgICAgbG9hZEdsb2JhbENvbmZpZyhyb290LCBod01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpLAorICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdE91dHB1dERldmljZXMsIGlzU3BlYWtlckRyY0VuYWJsZWQpOworICAgIGNvbmZpZ19mcmVlKHJvb3QpOworICAgIGZyZWUocm9vdCk7CisgICAgZnJlZShkYXRhKTsKKworICAgIEFMT0dJKCJsb2FkQXVkaW9Qb2xpY3lDb25maWcoKSBsb2FkZWQgJXNcbiIsIHBhdGgpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjFmY2EzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAKQEAgLTAsMCArMSwzNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6RGV2aWNlcyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIkRldmljZURlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJBdWRpb0dhaW4uaCIKKyNpbmNsdWRlICJId01vZHVsZS5oIgorI2luY2x1ZGUgIkNvbmZpZ1BhcnNpbmdVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0RldmljZURlc2NyaXB0b3I6OkRldmljZURlc2NyaXB0b3IoYXVkaW9fZGV2aWNlc190IHR5cGUpIDoKKyAgICBBdWRpb1BvcnQoU3RyaW5nOCgiIiksIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UsCisgICAgICAgICAgICAgIGF1ZGlvX2lzX291dHB1dF9kZXZpY2UodHlwZSkgPyBBVURJT19QT1JUX1JPTEVfU0lOSyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX1JPTEVfU09VUkNFKSwKKyAgICBtVGFnKCIiKSwgbUFkZHJlc3MoIiIpLCBtRGV2aWNlVHlwZSh0eXBlKSwgbUlkKDApCit7CisKK30KKworYXVkaW9fcG9ydF9oYW5kbGVfdCBEZXZpY2VEZXNjcmlwdG9yOjpnZXRJZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1JZDsKK30KKwordm9pZCBEZXZpY2VEZXNjcmlwdG9yOjphdHRhY2goY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpCit7CisgICAgQXVkaW9Qb3J0OjphdHRhY2gobW9kdWxlKTsKKyAgICBtSWQgPSBnZXROZXh0VW5pcXVlSWQoKTsKK30KKworYm9vbCBEZXZpY2VEZXNjcmlwdG9yOjplcXVhbHMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIG90aGVyKSBjb25zdAoreworICAgIC8vIERldmljZXMgYXJlIGNvbnNpZGVyZWQgZXF1YWwgaWYgdGhleToKKyAgICAvLyAtIGFyZSBvZiB0aGUgc2FtZSB0eXBlIChhIGRldmljZSB0eXBlIGNhbm5vdCBiZSBBVURJT19ERVZJQ0VfTk9ORSkKKyAgICAvLyAtIGhhdmUgdGhlIHNhbWUgYWRkcmVzcyBvciBvbmUgZGV2aWNlIGRvZXMgbm90IHNwZWNpZnkgdGhlIGFkZHJlc3MKKyAgICAvLyAtIGhhdmUgdGhlIHNhbWUgY2hhbm5lbCBtYXNrIG9yIG9uZSBkZXZpY2UgZG9lcyBub3Qgc3BlY2lmeSB0aGUgY2hhbm5lbCBtYXNrCisgICAgaWYgKG90aGVyID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gKG1EZXZpY2VUeXBlID09IG90aGVyLT5tRGV2aWNlVHlwZSkgJiYKKyAgICAgICAgICAgKG1BZGRyZXNzID09ICIiIHx8IG90aGVyLT5tQWRkcmVzcyA9PSAiIiB8fCBtQWRkcmVzcyA9PSBvdGhlci0+bUFkZHJlc3MpICYmCisgICAgICAgICAgIChtQ2hhbm5lbE1hc2sgPT0gMCB8fCBvdGhlci0+bUNoYW5uZWxNYXNrID09IDAgfHwKKyAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2sgPT0gb3RoZXItPm1DaGFubmVsTWFzayk7Cit9CisKK3ZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6bG9hZEdhaW5zKGNub2RlICpyb290KQoreworICAgIEF1ZGlvUG9ydDo6bG9hZEdhaW5zKHJvb3QpOworICAgIGlmIChtR2FpbnMuc2l6ZSgpID4gMCkgeworICAgICAgICBtR2FpbnNbMF0tPmdldERlZmF1bHRDb25maWcoJm1HYWluKTsKKyAgICB9Cit9CisKK3ZvaWQgRGV2aWNlVmVjdG9yOjpyZWZyZXNoVHlwZXMoKQoreworICAgIG1EZXZpY2VUeXBlcyA9IEFVRElPX0RFVklDRV9OT05FOworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBtRGV2aWNlVHlwZXMgfD0gaXRlbUF0KGkpLT50eXBlKCk7CisgICAgfQorICAgIEFMT0dWKCJEZXZpY2VWZWN0b3I6OnJlZnJlc2hUeXBlcygpIG1EZXZpY2VUeXBlcyAlMDh4IiwgbURldmljZVR5cGVzKTsKK30KKworc3NpemVfdCBEZXZpY2VWZWN0b3I6OmluZGV4T2YoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pIGNvbnN0Cit7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtLT5lcXVhbHMoaXRlbUF0KGkpKSkgeworICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitzc2l6ZV90IERldmljZVZlY3Rvcjo6YWRkKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKQoreworICAgIHNzaXplX3QgcmV0ID0gaW5kZXhPZihpdGVtKTsKKworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHJldCA9IFNvcnRlZFZlY3Rvcjo6YWRkKGl0ZW0pOworICAgICAgICBpZiAocmV0ID49IDApIHsKKyAgICAgICAgICAgIHJlZnJlc2hUeXBlcygpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coIkRldmljZVZlY3Rvcjo6YWRkIGRldmljZSAlMDh4IGFscmVhZHkgaW4iLCBpdGVtLT50eXBlKCkpOworICAgICAgICByZXQgPSAtMTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3NpemVfdCBEZXZpY2VWZWN0b3I6OnJlbW92ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSkKK3sKKyAgICBzaXplX3QgaTsKKyAgICBzc2l6ZV90IHJldCA9IGluZGV4T2YoaXRlbSk7CisKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBBTE9HVygiRGV2aWNlVmVjdG9yOjpyZW1vdmUgZGV2aWNlICUwOHggbm90IGluIiwgaXRlbS0+dHlwZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBTb3J0ZWRWZWN0b3I6OnJlbW92ZUF0KHJldCk7CisgICAgICAgIGlmIChyZXQgPj0gMCkgeworICAgICAgICAgICAgcmVmcmVzaFR5cGVzKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYXVkaW9fZGV2aWNlc190IERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21Id01vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlSGFuZGxlKSBjb25zdAoreworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbUF0KGkpLT5nZXRNb2R1bGVIYW5kbGUoKSA9PSBtb2R1bGVIYW5kbGUpIHsKKyAgICAgICAgICAgIGRldmljZXMgfD0gaXRlbUF0KGkpLT50eXBlKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRldmljZXM7Cit9CisKK3ZvaWQgRGV2aWNlVmVjdG9yOjpsb2FkRGV2aWNlc0Zyb21UeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlcykKK3sKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdDsKKworICAgIHVpbnQzMl90IHJvbGVfYml0ID0gQVVESU9fREVWSUNFX0JJVF9JTiAmIHR5cGVzOworICAgIHR5cGVzICY9IH5yb2xlX2JpdDsKKworICAgIHdoaWxlICh0eXBlcykgeworICAgICAgICB1aW50MzJfdCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KHR5cGVzKTsKKyAgICAgICAgdWludDMyX3QgdHlwZSA9IDEgPDwgaTsKKyAgICAgICAgdHlwZXMgJj0gfnR5cGU7CisgICAgICAgIGFkZChuZXcgRGV2aWNlRGVzY3JpcHRvcih0eXBlIHwgcm9sZV9iaXQpKTsKKyAgICB9Cit9CisKK3ZvaWQgRGV2aWNlVmVjdG9yOjpsb2FkRGV2aWNlc0Zyb21UYWcoY2hhciAqdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBkZWNsYXJlZERldmljZXMpCit7CisgICAgY2hhciAqZGV2VGFnID0gc3RydG9rKHRhZywgInwiKTsKKyAgICB3aGlsZSAoZGV2VGFnICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHN0cmxlbihkZXZUYWcpICE9IDApIHsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gQ29uZmlnUGFyc2luZ1V0aWxzOjpzdHJpbmdUb0VudW0oc0RldmljZVR5cGVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0RldmljZVR5cGVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZUYWcpOworICAgICAgICAgICAgaWYgKHR5cGUgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXYgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcih0eXBlKTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVggKSB7CisgICAgICAgICAgICAgICAgICAgIGRldi0+bUFkZHJlc3MgPSBTdHJpbmc4KCIwIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZChkZXYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2VGcm9tVGFnKFN0cmluZzgoZGV2VGFnKSk7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZURlc2MgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBhZGQoZGV2aWNlRGVzYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgZGV2VGFnID0gc3RydG9rKE5VTEwsICJ8Iik7CisgICAgIH0KK30KKworc3A8RGV2aWNlRGVzY3JpcHRvcj4gRGV2aWNlVmVjdG9yOjpnZXREZXZpY2UoYXVkaW9fZGV2aWNlc190IHR5cGUsIFN0cmluZzggYWRkcmVzcykgY29uc3QKK3sKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbUF0KGkpLT50eXBlKCkgPT0gdHlwZSkgeworICAgICAgICAgICAgaWYgKGFkZHJlc3MgPT0gIiIgfHwgaXRlbUF0KGkpLT5tQWRkcmVzcyA9PSBhZGRyZXNzKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gaXRlbUF0KGkpOworICAgICAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPm1BZGRyZXNzID09IGFkZHJlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJEZXZpY2VWZWN0b3I6OmdldERldmljZSgpIGZvciB0eXBlICUwOHggYWRkcmVzcyAlcyBmb3VuZCAlcCIsCisgICAgICAgICAgdHlwZSwgYWRkcmVzcy5zdHJpbmcoKSwgZGV2aWNlLmdldCgpKTsKKyAgICByZXR1cm4gZGV2aWNlOworfQorCitzcDxEZXZpY2VEZXNjcmlwdG9yPiBEZXZpY2VWZWN0b3I6OmdldERldmljZUZyb21JZChhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdAoreworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPmdldElkKCkgPT0gaWQpIHsKKyAgICAgICAgICAgIGRldmljZSA9IGl0ZW1BdChpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2U7Cit9CisKK0RldmljZVZlY3RvciBEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tVHlwZShhdWRpb19kZXZpY2VzX3QgdHlwZSkgY29uc3QKK3sKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKKyAgICBib29sIGlzT3V0cHV0ID0gYXVkaW9faXNfb3V0cHV0X2RldmljZXModHlwZSk7CisgICAgdHlwZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgKGkgPCBzaXplKCkpICYmICh0eXBlICE9IEFVRElPX0RFVklDRV9OT05FKTsgaSsrKSB7CisgICAgICAgIGJvb2wgY3VySXNPdXRwdXQgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlcyhpdGVtQXQoaSktPm1EZXZpY2VUeXBlKTsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGN1clR5cGUgPSBpdGVtQXQoaSktPm1EZXZpY2VUeXBlICYgfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgICAgIGlmICgoaXNPdXRwdXQgPT0gY3VySXNPdXRwdXQpICYmICgodHlwZSAmIGN1clR5cGUpICE9IDApKSB7CisgICAgICAgICAgICBkZXZpY2VzLmFkZChpdGVtQXQoaSkpOworICAgICAgICAgICAgdHlwZSAmPSB+Y3VyVHlwZTsKKyAgICAgICAgICAgIEFMT0dWKCJEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tVHlwZSgpIGZvciB0eXBlICV4IGZvdW5kICVwIiwKKyAgICAgICAgICAgICAgICAgIGl0ZW1BdChpKS0+dHlwZSgpLCBpdGVtQXQoaSkuZ2V0KCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2VzOworfQorCitEZXZpY2VWZWN0b3IgRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbVR5cGVBZGRyKAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSwgU3RyaW5nOCBhZGRyZXNzKSBjb25zdAoreworICAgIERldmljZVZlY3RvciBkZXZpY2VzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+dHlwZSgpID09IHR5cGUpIHsKKyAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPm1BZGRyZXNzID09IGFkZHJlc3MpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2VzLmFkZChpdGVtQXQoaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2VzOworfQorCitzcDxEZXZpY2VEZXNjcmlwdG9yPiBEZXZpY2VWZWN0b3I6OmdldERldmljZUZyb21UYWcoY29uc3QgU3RyaW5nOCYgdGFnKSBjb25zdAoreworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPm1UYWcgPT0gdGFnKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBpdGVtQXQoaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGV2aWNlOworfQorCisKK3N0YXR1c190IERldmljZVZlY3Rvcjo6ZHVtcChpbnQgZmQsIGNvbnN0IFN0cmluZzggJmRpcmVjdGlvbikgY29uc3QKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuIEF2YWlsYWJsZSAlcyBkZXZpY2VzOlxuIiwgZGlyZWN0aW9uLnN0cmluZygpKTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpdGVtQXQoaSktPmR1bXAoZmQsIDIsIGkpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2F1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBEZXZpY2VWZWN0b3I6OmdldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2RGVzYykgY29uc3QKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZihkZXZEZXNjKTsKKyAgICByZXR1cm4gaW5kZXggPj0gMCA/IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFIDogQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKK30KKwordm9pZCBEZXZpY2VEZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0Cit7CisgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTS3xBVURJT19QT1JUX0NPTkZJR19HQUlOOworICAgIGlmIChzcmNDb25maWcgIT0gTlVMTCkgeworICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrIHw9IHNyY0NvbmZpZy0+Y29uZmlnX21hc2s7CisgICAgfQorCisgICAgQXVkaW9Qb3J0Q29uZmlnOjp0b0F1ZGlvUG9ydENvbmZpZyhkc3RDb25maWcsIHNyY0NvbmZpZyk7CisKKyAgICBkc3RDb25maWctPmlkID0gbUlkOworICAgIGRzdENvbmZpZy0+cm9sZSA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2UobURldmljZVR5cGUpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfUk9MRV9TSU5LIDogQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKKyAgICBkc3RDb25maWctPnR5cGUgPSBBVURJT19QT1JUX1RZUEVfREVWSUNFOworICAgIGRzdENvbmZpZy0+ZXh0LmRldmljZS50eXBlID0gbURldmljZVR5cGU7CisKKyAgICAvL1RPRE8gVW5kZXJzdGFuZCB3aHkgdGhpcyB0ZXN0IGlzIG5lY2Vzc2FyeS4gaS5lLiB3aHkgYXQgYm9vdCB0aW1lIGRvZXMgaXQgY3Jhc2gKKyAgICAvLyB3aXRob3V0IHRoZSB0ZXN0PworICAgIC8vIFRoaXMgaGFzIGJlZW4gZGVtb25zdHJhdGVkIHRvIE5PVCBiZSB0cnVlIChhdCBzdGFydCB1cCkKKyAgICAvLyBBTE9HX0FTU0VSVChtTW9kdWxlICE9IE5VTEwpOworICAgIGRzdENvbmZpZy0+ZXh0LmRldmljZS5od19tb2R1bGUgPSBtTW9kdWxlICE9IDAgPyBtTW9kdWxlLT5tSGFuZGxlIDogQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgc3RybmNweShkc3RDb25maWctPmV4dC5kZXZpY2UuYWRkcmVzcywgbUFkZHJlc3Muc3RyaW5nKCksIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pOworfQorCit2b2lkIERldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAoreworICAgIEFMT0dWKCJEZXZpY2VEZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydCgpIGhhbmRsZSAlZCB0eXBlICV4IiwgbUlkLCBtRGV2aWNlVHlwZSk7CisgICAgQXVkaW9Qb3J0Ojp0b0F1ZGlvUG9ydChwb3J0KTsKKyAgICBwb3J0LT5pZCA9IG1JZDsKKyAgICB0b0F1ZGlvUG9ydENvbmZpZygmcG9ydC0+YWN0aXZlX2NvbmZpZyk7CisgICAgcG9ydC0+ZXh0LmRldmljZS50eXBlID0gbURldmljZVR5cGU7CisgICAgcG9ydC0+ZXh0LmRldmljZS5od19tb2R1bGUgPSBtTW9kdWxlLT5tSGFuZGxlOworICAgIHN0cm5jcHkocG9ydC0+ZXh0LmRldmljZS5hZGRyZXNzLCBtQWRkcmVzcy5zdHJpbmcoKSwgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTik7Cit9CisKK3ZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6aW1wb3J0QXVkaW9Qb3J0KGNvbnN0IHNwPEF1ZGlvUG9ydD4gcG9ydCkgeworICAgIEF1ZGlvUG9ydDo6aW1wb3J0QXVkaW9Qb3J0KHBvcnQpOworICAgIG1TYW1wbGluZ1JhdGUgPSBwb3J0LT5waWNrU2FtcGxpbmdSYXRlKCk7CisgICAgbUZvcm1hdCA9IHBvcnQtPnBpY2tGb3JtYXQoKTsKKyAgICBtQ2hhbm5lbE1hc2sgPSBwb3J0LT5waWNrQ2hhbm5lbE1hc2soKTsKK30KKworc3RhdHVzX3QgRGV2aWNlRGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0RldmljZSAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBpZiAobUlkICE9IDApIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBpZDogJTJkXG4iLCBzcGFjZXMsICIiLCBtSWQpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gdHlwZTogJS00OHNcbiIsIHNwYWNlcywgIiIsCisgICAgICAgICAgICBDb25maWdQYXJzaW5nVXRpbHM6OmVudW1Ub1N0cmluZyhzRGV2aWNlVHlwZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VUeXBlVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICBtRGV2aWNlVHlwZSkpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBpZiAobUFkZHJlc3Muc2l6ZSgpICE9IDApIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBhZGRyZXNzOiAlLTMyc1xuIiwgc3BhY2VzLCAiIiwgbUFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIEF1ZGlvUG9ydDo6ZHVtcChmZCwgc3BhY2VzKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBEZXZpY2VEZXNjcmlwdG9yOjpsb2coKSBjb25zdAoreworICAgIEFMT0dJKCJEZXZpY2UgaWQ6JWQgdHlwZToweCVYOiVzLCBhZGRyOiVzIiwKKyAgICAgICAgICBtSWQsCisgICAgICAgICAgbURldmljZVR5cGUsCisgICAgICAgICAgQ29uZmlnUGFyc2luZ1V0aWxzOjplbnVtVG9TdHJpbmcoCisgICAgICAgICAgICAgc0RldmljZU5hbWVUb0VudW1UYWJsZSwgQVJSQVlfU0laRShzRGV2aWNlTmFtZVRvRW51bVRhYmxlKSwgbURldmljZVR5cGUpLAorICAgICAgICAgIG1BZGRyZXNzLnN0cmluZygpKTsKKworICAgIEF1ZGlvUG9ydDo6bG9nKCIgICIpOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRWZmZWN0RGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9FZmZlY3REZXNjcmlwdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2Q4MzhkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRWZmZWN0RGVzY3JpcHRvci5jcHAKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6RWZmZWN0RGVzY3JpcHRvciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIkVmZmVjdERlc2NyaXB0b3IuaCIKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdHVzX3QgRWZmZWN0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgSS9POiAlZFxuIiwgbUlvKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFN0cmF0ZWd5OiAlZFxuIiwgbVN0cmF0ZWd5KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFNlc3Npb246ICVkXG4iLCBtU2Vzc2lvbik7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBOYW1lOiAlc1xuIiwgIG1EZXNjLm5hbWUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgJXNcbiIsICBtRW5hYmxlZCA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OkVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uKCkgOgorICAgIG1Ub3RhbEVmZmVjdHNDcHVMb2FkKDApLAorICAgIG1Ub3RhbEVmZmVjdHNNZW1vcnkoMCkKK3sKKworfQorCitzdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6cmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpCit7CisgICAgaWYgKG1Ub3RhbEVmZmVjdHNNZW1vcnkgKyBkZXNjLT5tZW1vcnlVc2FnZSA+IGdldE1heEVmZmVjdHNNZW1vcnkoKSkgeworICAgICAgICBBTE9HVygicmVnaXN0ZXJFZmZlY3QoKSBtZW1vcnkgbGltaXQgZXhjZWVkZWQgZm9yIEZ4ICVzLCBNZW1vcnkgJWQgS0IiLAorICAgICAgICAgICAgICAgIGRlc2MtPm5hbWUsIGRlc2MtPm1lbW9yeVVzYWdlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBtVG90YWxFZmZlY3RzTWVtb3J5ICs9IGRlc2MtPm1lbW9yeVVzYWdlOworICAgIEFMT0dWKCJyZWdpc3RlckVmZmVjdCgpIGVmZmVjdCAlcywgaW8gJWQsIHN0cmF0ZWd5ICVkIHNlc3Npb24gJWQgaWQgJWQiLAorICAgICAgICAgICAgZGVzYy0+bmFtZSwgaW8sIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7CisgICAgQUxPR1YoInJlZ2lzdGVyRWZmZWN0KCkgbWVtb3J5ICVkLCB0b3RhbCBtZW1vcnkgJWQiLCBkZXNjLT5tZW1vcnlVc2FnZSwgbVRvdGFsRWZmZWN0c01lbW9yeSk7CisKKyAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3REZXNjID0gbmV3IEVmZmVjdERlc2NyaXB0b3IoKTsKKyAgICBtZW1jcHkgKCZlZmZlY3REZXNjLT5tRGVzYywgZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICBlZmZlY3REZXNjLT5tSW8gPSBpbzsKKyAgICBlZmZlY3REZXNjLT5tU3RyYXRlZ3kgPSBzdGF0aWNfY2FzdDxyb3V0aW5nX3N0cmF0ZWd5PihzdHJhdGVneSk7CisgICAgZWZmZWN0RGVzYy0+bVNlc3Npb24gPSBzZXNzaW9uOworICAgIGVmZmVjdERlc2MtPm1FbmFibGVkID0gZmFsc2U7CisKKyAgICBhZGQoaWQsIGVmZmVjdERlc2MpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCit7CisgICAgc3NpemVfdCBpbmRleCA9IGluZGV4T2ZLZXkoaWQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInVucmVnaXN0ZXJFZmZlY3QoKSB1bmtub3duIGVmZmVjdCBJRCAlZCIsIGlkKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSB2YWx1ZUF0KGluZGV4KTsKKworICAgIHNldEVmZmVjdEVuYWJsZWQoZWZmZWN0RGVzYywgZmFsc2UpOworCisgICAgaWYgKG1Ub3RhbEVmZmVjdHNNZW1vcnkgPCBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSkgeworICAgICAgICBBTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIG1lbW9yeSAlZCB0b28gYmlnIGZvciB0b3RhbCAlZCIsCisgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MubWVtb3J5VXNhZ2UsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOworICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSA9IG1Ub3RhbEVmZmVjdHNNZW1vcnk7CisgICAgfQorICAgIG1Ub3RhbEVmZmVjdHNNZW1vcnkgLT0gZWZmZWN0RGVzYy0+bURlc2MubWVtb3J5VXNhZ2U7CisgICAgQUxPR1YoInVucmVnaXN0ZXJFZmZlY3QoKSBlZmZlY3QgJXMsIElEICVkLCBtZW1vcnkgJWQgdG90YWwgbWVtb3J5ICVkIiwKKyAgICAgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLm5hbWUsIGlkLCBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSwgbVRvdGFsRWZmZWN0c01lbW9yeSk7CisKKyAgICByZW1vdmVJdGVtKGlkKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OnNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpCit7CisgICAgc3NpemVfdCBpbmRleCA9IGluZGV4T2ZLZXkoaWQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInVucmVnaXN0ZXJFZmZlY3QoKSB1bmtub3duIGVmZmVjdCBJRCAlZCIsIGlkKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHJldHVybiBzZXRFZmZlY3RFbmFibGVkKHZhbHVlQXQoaW5kZXgpLCBlbmFibGVkKTsKK30KKworCitzdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6c2V0RWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3REZXNjcmlwdG9yPiAmZWZmZWN0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlZCkKK3sKKyAgICBpZiAoZW5hYmxlZCA9PSBlZmZlY3REZXNjLT5tRW5hYmxlZCkgeworICAgICAgICBBTE9HVigic2V0RWZmZWN0RW5hYmxlZCglcykgZWZmZWN0IGFscmVhZHkgJXMiLAorICAgICAgICAgICAgIGVuYWJsZWQ/InRydWUiOiJmYWxzZSIsIGVuYWJsZWQ/ImVuYWJsZWQiOiJkaXNhYmxlZCIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgaWYgKG1Ub3RhbEVmZmVjdHNDcHVMb2FkICsgZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZCA+IGdldE1heEVmZmVjdHNDcHVMb2FkKCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJzZXRFZmZlY3RFbmFibGVkKHRydWUpIENQVSBMb2FkIGxpbWl0IGV4Y2VlZGVkIGZvciBGeCAlcywgQ1BVICVmIE1JUFMiLAorICAgICAgICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5uYW1lLCAoZmxvYXQpZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZC8xMCk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgbVRvdGFsRWZmZWN0c0NwdUxvYWQgKz0gZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZDsKKyAgICAgICAgQUxPR1YoInNldEVmZmVjdEVuYWJsZWQodHJ1ZSkgdG90YWwgQ1BVICVkIiwgbVRvdGFsRWZmZWN0c0NwdUxvYWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtVG90YWxFZmZlY3RzQ3B1TG9hZCA8IGVmZmVjdERlc2MtPm1EZXNjLmNwdUxvYWQpIHsKKyAgICAgICAgICAgIEFMT0dXKCJzZXRFZmZlY3RFbmFibGVkKGZhbHNlKSBDUFUgbG9hZCAlZCB0b28gaGlnaCBmb3IgdG90YWwgJWQiLAorICAgICAgICAgICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkLCBtVG90YWxFZmZlY3RzQ3B1TG9hZCk7CisgICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkID0gbVRvdGFsRWZmZWN0c0NwdUxvYWQ7CisgICAgICAgIH0KKyAgICAgICAgbVRvdGFsRWZmZWN0c0NwdUxvYWQgLT0gZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZDsKKyAgICAgICAgQUxPR1YoInNldEVmZmVjdEVuYWJsZWQoZmFsc2UpIHRvdGFsIENQVSAlZCIsIG1Ub3RhbEVmZmVjdHNDcHVMb2FkKTsKKyAgICB9CisgICAgZWZmZWN0RGVzYy0+bUVuYWJsZWQgPSBlbmFibGVkOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYm9vbCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6aXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGlmIChlZmZlY3REZXNjLT5tRW5hYmxlZCAmJiAoZWZmZWN0RGVzYy0+bVN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSAmJgorICAgICAgICAgICAgICAgICgoZWZmZWN0RGVzYy0+bURlc2MuZmxhZ3MgJiBFRkZFQ1RfRkxBR19PRkZMT0FEX1NVUFBPUlRFRCkgPT0gMCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJpc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpIG5vbiBvZmZsb2FkYWJsZSBlZmZlY3QgJXMgZW5hYmxlZCBvbiBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLm5hbWUsIGVmZmVjdERlc2MtPm1TZXNzaW9uKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordWludDMyX3QgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OmdldE1heEVmZmVjdHNDcHVMb2FkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gTUFYX0VGRkVDVFNfQ1BVX0xPQUQ7Cit9CisKK3VpbnQzMl90IEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjpnZXRNYXhFZmZlY3RzTWVtb3J5KCkgY29uc3QKK3sKKyAgICByZXR1cm4gTUFYX0VGRkVDVFNfTUVNT1JZOworfQorCitzdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblRvdGFsIEVmZmVjdHMgQ1BVOiAlZiBNSVBTLCBUb3RhbCBFZmZlY3RzIG1lbW9yeTogJWQgS0JcbiIsCisgICAgICAgICAgICAgKGZsb2F0KW1Ub3RhbEVmZmVjdHNDcHVMb2FkLzEwLCBtVG90YWxFZmZlY3RzTWVtb3J5KTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJSZWdpc3RlcmVkIGVmZmVjdHM6XG4iKTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIEVmZmVjdCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOworICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZmQpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK307IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTIwNTBiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSHdNb2R1bGUuY3BwCkBAIC0wLDAgKzEsMzc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06Okh3TW9kdWxlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiSHdNb2R1bGUuaCIKKyNpbmNsdWRlICJJT1Byb2ZpbGUuaCIKKyNpbmNsdWRlICJBdWRpb0dhaW4uaCIKKyNpbmNsdWRlICJDb25maWdQYXJzaW5nVXRpbHMuaCIKKyNpbmNsdWRlICJhdWRpb19wb2xpY3lfY29uZi5oIgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CisjaW5jbHVkZSA8cG9saWN5Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworSHdNb2R1bGU6Okh3TW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpCisgICAgOiBtTmFtZShzdHJuZHVwKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NQVhfTEVOKSksCisgICAgICBtSGFsVmVyc2lvbihBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fTUlOKSwgbUhhbmRsZSgwKQoreworfQorCitId01vZHVsZTo6fkh3TW9kdWxlKCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICBtT3V0cHV0UHJvZmlsZXNbaV0tPm1TdXBwb3J0ZWREZXZpY2VzLmNsZWFyKCk7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUlucHV0UHJvZmlsZXNbaV0tPm1TdXBwb3J0ZWREZXZpY2VzLmNsZWFyKCk7CisgICAgfQorICAgIGZyZWUoKHZvaWQgKiltTmFtZSk7Cit9CisKK3N0YXR1c190IEh3TW9kdWxlOjpsb2FkSW5wdXQoY25vZGUgKnJvb3QpCit7CisgICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKKworICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG5ldyBJT1Byb2ZpbGUoU3RyaW5nOChyb290LT5uYW1lKSwgQVVESU9fUE9SVF9ST0xFX1NJTkspOworCisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBTQU1QTElOR19SQVRFU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRTYW1wbGluZ1JhdGVzKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBGT1JNQVRTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEZvcm1hdHMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIENIQU5ORUxTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEluQ2hhbm5lbHMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIERFVklDRVNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5sb2FkRGV2aWNlc0Zyb21UYWcoKGNoYXIgKilub2RlLT52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlY2xhcmVkRGV2aWNlcyk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEZMQUdTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bUZsYWdzID0gQ29uZmlnUGFyc2luZ1V0aWxzOjpwYXJzZUlucHV0RmxhZ05hbWVzKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRHYWlucyhub2RlKTsKKyAgICAgICAgfQorICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9CisgICAgQUxPR1dfSUYocHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuaXNFbXB0eSgpLAorICAgICAgICAgICAgImxvYWRJbnB1dCgpIGludmFsaWQgc3VwcG9ydGVkIGRldmljZXMiKTsKKyAgICBBTE9HV19JRihwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLnNpemUoKSA9PSAwLAorICAgICAgICAgICAgImxvYWRJbnB1dCgpIGludmFsaWQgc3VwcG9ydGVkIGNoYW5uZWwgbWFza3MiKTsKKyAgICBBTE9HV19JRihwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgPT0gMCwKKyAgICAgICAgICAgICJsb2FkSW5wdXQoKSBpbnZhbGlkIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcyIpOworICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1Gb3JtYXRzLnNpemUoKSA9PSAwLAorICAgICAgICAgICAgImxvYWRJbnB1dCgpIGludmFsaWQgc3VwcG9ydGVkIGZvcm1hdHMiKTsKKyAgICBpZiAoIXByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKSAmJgorICAgICAgICAgICAgKHByb2ZpbGUtPm1DaGFubmVsTWFza3Muc2l6ZSgpICE9IDApICYmCisgICAgICAgICAgICAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpICE9IDApICYmCisgICAgICAgICAgICAocHJvZmlsZS0+bUZvcm1hdHMuc2l6ZSgpICE9IDApKSB7CisKKyAgICAgICAgQUxPR1YoImxvYWRJbnB1dCgpIGFkZGluZyBpbnB1dCBTdXBwb3J0ZWQgRGV2aWNlcyAlMDR4IiwKKyAgICAgICAgICAgICAgcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSk7CisKKyAgICAgICAgcHJvZmlsZS0+YXR0YWNoKHRoaXMpOworICAgICAgICBtSW5wdXRQcm9maWxlcy5hZGQocHJvZmlsZSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KK30KKworc3RhdHVzX3QgSHdNb2R1bGU6OmxvYWRPdXRwdXQoY25vZGUgKnJvb3QpCit7CisgICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKKworICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG5ldyBJT1Byb2ZpbGUoU3RyaW5nOChyb290LT5uYW1lKSwgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSk7CisKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIFNBTVBMSU5HX1JBVEVTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bG9hZFNhbXBsaW5nUmF0ZXMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEZPUk1BVFNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5sb2FkRm9ybWF0cygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgQ0hBTk5FTFNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5sb2FkT3V0Q2hhbm5lbHMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIERFVklDRVNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5sb2FkRGV2aWNlc0Zyb21UYWcoKGNoYXIgKilub2RlLT52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlY2xhcmVkRGV2aWNlcyk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEZMQUdTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bUZsYWdzID0gQ29uZmlnUGFyc2luZ1V0aWxzOjpwYXJzZU91dHB1dEZsYWdOYW1lcygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTlNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5sb2FkR2FpbnMobm9kZSk7CisgICAgICAgIH0KKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKSwKKyAgICAgICAgICAgICJsb2FkT3V0cHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgZGV2aWNlcyIpOworICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1DaGFubmVsTWFza3Muc2l6ZSgpID09IDAsCisgICAgICAgICAgICAibG9hZE91dHB1dCgpIGludmFsaWQgc3VwcG9ydGVkIGNoYW5uZWwgbWFza3MiKTsKKyAgICBBTE9HV19JRihwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgPT0gMCwKKyAgICAgICAgICAgICJsb2FkT3V0cHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMiKTsKKyAgICBBTE9HV19JRihwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgPT0gMCwKKyAgICAgICAgICAgICJsb2FkT3V0cHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgZm9ybWF0cyIpOworICAgIGlmICghcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuaXNFbXB0eSgpICYmCisgICAgICAgICAgICAocHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5zaXplKCkgIT0gMCkgJiYKKyAgICAgICAgICAgIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgIT0gMCkgJiYKKyAgICAgICAgICAgIChwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgIT0gMCkpIHsKKworICAgICAgICBBTE9HVigibG9hZE91dHB1dCgpIGFkZGluZyBvdXRwdXQgU3VwcG9ydGVkIERldmljZXMgJTA0eCwgbUZsYWdzICUwNHgiLAorICAgICAgICAgICAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpLCBwcm9maWxlLT5tRmxhZ3MpOworICAgICAgICBwcm9maWxlLT5hdHRhY2godGhpcyk7CisgICAgICAgIG1PdXRwdXRQcm9maWxlcy5hZGQocHJvZmlsZSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KK30KKworc3RhdHVzX3QgSHdNb2R1bGU6OmxvYWREZXZpY2UoY25vZGUgKnJvb3QpCit7CisgICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKKworICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBBUE1fREVWSUNFX1RZUEUpID09IDApIHsKKyAgICAgICAgICAgIHR5cGUgPSBDb25maWdQYXJzaW5nVXRpbHM6OnBhcnNlRGV2aWNlTmFtZXMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9CisgICAgaWYgKHR5cGUgPT0gQVVESU9fREVWSUNFX05PTkUgfHwKKyAgICAgICAgICAgICghYXVkaW9faXNfaW5wdXRfZGV2aWNlKHR5cGUpICYmICFhdWRpb19pc19vdXRwdXRfZGV2aWNlKHR5cGUpKSkgeworICAgICAgICBBTE9HVygibG9hZERldmljZSgpIGJhZCB0eXBlICUwOHgiLCB0eXBlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKHR5cGUpOworICAgIGRldmljZURlc2MtPm1UYWcgPSBTdHJpbmc4KHJvb3QtPm5hbWUpOworCisgICAgbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgQVBNX0RFVklDRV9BRERSRVNTKSA9PSAwKSB7CisgICAgICAgICAgICBkZXZpY2VEZXNjLT5tQWRkcmVzcyA9IFN0cmluZzgoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIENIQU5ORUxTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgaWYgKGF1ZGlvX2lzX2lucHV0X2RldmljZSh0eXBlKSkgeworICAgICAgICAgICAgICAgIGRldmljZURlc2MtPmxvYWRJbkNoYW5uZWxzKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZXZpY2VEZXNjLT5sb2FkT3V0Q2hhbm5lbHMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5TX1RBRykgPT0gMCkgeworICAgICAgICAgICAgZGV2aWNlRGVzYy0+bG9hZEdhaW5zKG5vZGUpOworICAgICAgICB9CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKworICAgIEFMT0dWKCJsb2FkRGV2aWNlKCkgYWRkaW5nIGRldmljZSB0YWcgJXMgdHlwZSAlMDh4IGFkZHJlc3MgJXMiLAorICAgICAgICAgIGRldmljZURlc2MtPm1UYWcuc3RyaW5nKCksIHR5cGUsIGRldmljZURlc2MtPm1BZGRyZXNzLnN0cmluZygpKTsKKworICAgIG1EZWNsYXJlZERldmljZXMuYWRkKGRldmljZURlc2MpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBId01vZHVsZTo6YWRkT3V0cHV0UHJvZmlsZShTdHJpbmc4IG5hbWUsIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIFN0cmluZzggYWRkcmVzcykKK3sKKyAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBuZXcgSU9Qcm9maWxlKG5hbWUsIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpOworCisgICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuYWRkKGNvbmZpZy0+c2FtcGxlX3JhdGUpOworICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3MuYWRkKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKTsKKyAgICBwcm9maWxlLT5tRm9ybWF0cy5hZGQoY29uZmlnLT5mb3JtYXQpOworCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKGRldmljZSk7CisgICAgZGV2RGVzYy0+bUFkZHJlc3MgPSBhZGRyZXNzOworICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmFkZChkZXZEZXNjKTsKKworICAgIHByb2ZpbGUtPmF0dGFjaCh0aGlzKTsKKyAgICBtT3V0cHV0UHJvZmlsZXMuYWRkKHByb2ZpbGUpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBId01vZHVsZTo6cmVtb3ZlT3V0cHV0UHJvZmlsZShTdHJpbmc4IG5hbWUpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1PdXRwdXRQcm9maWxlc1tpXS0+bU5hbWUgPT0gbmFtZSkgeworICAgICAgICAgICAgbU91dHB1dFByb2ZpbGVzLnJlbW92ZUF0KGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEh3TW9kdWxlOjphZGRJbnB1dFByb2ZpbGUoU3RyaW5nOCBuYW1lLCBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBTdHJpbmc4IGFkZHJlc3MpCit7CisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbmV3IElPUHJvZmlsZShuYW1lLCBBVURJT19QT1JUX1JPTEVfU0lOSyk7CisKKyAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5hZGQoY29uZmlnLT5zYW1wbGVfcmF0ZSk7CisgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5hZGQoY29uZmlnLT5jaGFubmVsX21hc2spOworICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmFkZChjb25maWctPmZvcm1hdCk7CisKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IoZGV2aWNlKTsKKyAgICBkZXZEZXNjLT5tQWRkcmVzcyA9IGFkZHJlc3M7CisgICAgcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuYWRkKGRldkRlc2MpOworCisgICAgQUxPR1YoImFkZElucHV0UHJvZmlsZSgpIG5hbWUgJXMgcmF0ZSAlZCBtYXNrIDB4MDgiLCBuYW1lLnN0cmluZygpLCBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmNoYW5uZWxfbWFzayk7CisKKyAgICBwcm9maWxlLT5hdHRhY2godGhpcyk7CisgICAgbUlucHV0UHJvZmlsZXMuYWRkKHByb2ZpbGUpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBId01vZHVsZTo6cmVtb3ZlSW5wdXRQcm9maWxlKFN0cmluZzggbmFtZSkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtSW5wdXRQcm9maWxlc1tpXS0+bU5hbWUgPT0gbmFtZSkgeworICAgICAgICAgICAgbUlucHV0UHJvZmlsZXMucmVtb3ZlQXQoaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCit2b2lkIEh3TW9kdWxlOjpkdW1wKGludCBmZCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgLSBuYW1lOiAlc1xuIiwgbU5hbWUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgIC0gaGFuZGxlOiAlZFxuIiwgbUhhbmRsZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgLSB2ZXJzaW9uOiAldS4ldVxuIiwgbUhhbFZlcnNpb24gPj4gOCwgbUhhbFZlcnNpb24gJiAweEZGKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgaWYgKG1PdXRwdXRQcm9maWxlcy5zaXplKCkpIHsKKyAgICAgICAgd3JpdGUoZmQsICIgIC0gb3V0cHV0czpcbiIsIHN0cmxlbigiICAtIG91dHB1dHM6XG4iKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgb3V0cHV0ICV6dTpcbiIsIGkpOworICAgICAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgICAgICAgICAgbU91dHB1dFByb2ZpbGVzW2ldLT5kdW1wKGZkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobUlucHV0UHJvZmlsZXMuc2l6ZSgpKSB7CisgICAgICAgIHdyaXRlKGZkLCAiICAtIGlucHV0czpcbiIsIHN0cmxlbigiICAtIGlucHV0czpcbiIpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRQcm9maWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIGlucHV0ICV6dTpcbiIsIGkpOworICAgICAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgICAgICAgICAgbUlucHV0UHJvZmlsZXNbaV0tPmR1bXAoZmQpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtRGVjbGFyZWREZXZpY2VzLnNpemUoKSkgeworICAgICAgICB3cml0ZShmZCwgIiAgLSBkZXZpY2VzOlxuIiwgc3RybGVuKCIgIC0gZGV2aWNlczpcbiIpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRGVjbGFyZWREZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtRGVjbGFyZWREZXZpY2VzW2ldLT5kdW1wKGZkLCA0LCBpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3AgPEh3TW9kdWxlPiBId01vZHVsZUNvbGxlY3Rpb246OmdldE1vZHVsZUZyb21OYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0Cit7CisgICAgc3AgPEh3TW9kdWxlPiBtb2R1bGU7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHN0cmNtcChpdGVtQXQoaSktPm1OYW1lLCBuYW1lKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gaXRlbUF0KGkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtb2R1bGU7Cit9CisKKworc3AgPEh3TW9kdWxlPiBId01vZHVsZUNvbGxlY3Rpb246OmdldE1vZHVsZUZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAoreworICAgIHNwIDxId01vZHVsZT4gbW9kdWxlOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbUF0KGkpLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaXRlbUF0KGkpLT5tT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+bU91dHB1dFByb2ZpbGVzW2pdLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtQXQoaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBpdGVtQXQoaSktPm1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+bUlucHV0UHJvZmlsZXNbal0tPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJgorICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1BdChpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1vZHVsZTsKK30KKworc3A8RGV2aWNlRGVzY3JpcHRvcj4gIEh3TW9kdWxlQ29sbGVjdGlvbjo6Z2V0RGV2aWNlRGVzY3JpcHRvcihjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpIGNvbnN0Cit7CisgICAgU3RyaW5nOCBhZGRyZXNzID0gKGRldmljZV9hZGRyZXNzID09IE5VTEwpID8gU3RyaW5nOCgiIikgOiBTdHJpbmc4KGRldmljZV9hZGRyZXNzKTsKKyAgICAvLyBoYW5kbGUgbGVnYWN5IHJlbW90ZSBzdWJtaXggY2FzZSB3aGVyZSB0aGUgYWRkcmVzcyB3YXMgbm90IGFsd2F5cyBzcGVjaWZpZWQKKyAgICBpZiAoZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpICYmIChhZGRyZXNzLmxlbmd0aCgpID09IDApKSB7CisgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KCIwIik7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBzcDxId01vZHVsZT4gaHdNb2R1bGUgPSBpdGVtQXQoaSk7CisgICAgICAgIGlmIChod01vZHVsZS0+bUhhbmRsZSA9PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9CisgICAgICAgICAgICAgICAgaHdNb2R1bGUtPm1EZWNsYXJlZERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlQWRkcihkZXZpY2UsIGFkZHJlc3MpOworICAgICAgICBpZiAoIWRldmljZUxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZGV2aWNlTGlzdC5pdGVtQXQoMCk7CisgICAgICAgIH0KKyAgICAgICAgZGV2aWNlTGlzdCA9IGh3TW9kdWxlLT5tRGVjbGFyZWREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOworICAgICAgICBpZiAoIWRldmljZUxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZGV2aWNlTGlzdC5pdGVtQXQoMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0KKyAgICAgICAgICAgIG5ldyBEZXZpY2VEZXNjcmlwdG9yKGRldmljZSk7CisgICAgZGV2RGVzYy0+bU5hbWUgPSBkZXZpY2VfbmFtZTsKKyAgICBkZXZEZXNjLT5tQWRkcmVzcyA9IGFkZHJlc3M7CisgICAgcmV0dXJuIGRldkRlc2M7Cit9CisKK3N0YXR1c190IEh3TW9kdWxlQ29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Cit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkhXIE1vZHVsZXMgZHVtcDpcbiIpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gSFcgTW9kdWxlICV6dTpcbiIsIGkgKyAxKTsKKyAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgICAgICBpdGVtQXQoaSktPmR1bXAoZmQpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK30gLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0lPUHJvZmlsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I2ZDUxZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0lPUHJvZmlsZS5jcHAKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6SU9Qcm9maWxlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiSU9Qcm9maWxlLmgiCisjaW5jbHVkZSAiSHdNb2R1bGUuaCIKKyNpbmNsdWRlICJBdWRpb0dhaW4uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitJT1Byb2ZpbGU6OklPUHJvZmlsZShjb25zdCBTdHJpbmc4JiBuYW1lLCBhdWRpb19wb3J0X3JvbGVfdCByb2xlKQorICAgIDogQXVkaW9Qb3J0KG5hbWUsIEFVRElPX1BPUlRfVFlQRV9NSVgsIHJvbGUpCit7Cit9CisKK0lPUHJvZmlsZTo6fklPUHJvZmlsZSgpCit7Cit9CisKKy8vIGNoZWNrcyBpZiB0aGUgSU8gcHJvZmlsZSBpcyBjb21wYXRpYmxlIHdpdGggc3BlY2lmaWVkIHBhcmFtZXRlcnMuCisvLyBTYW1wbGluZyByYXRlLCBmb3JtYXQgYW5kIGNoYW5uZWwgbWFzayBtdXN0IGJlIHNwZWNpZmllZCBpbiBvcmRlciB0bworLy8gZ2V0IGEgdmFsaWQgYSBtYXRjaAorYm9vbCBJT1Byb2ZpbGU6OmlzQ29tcGF0aWJsZVByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICp1cGRhdGVkU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnVwZGF0ZWRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICp1cGRhdGVkQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncykgY29uc3QKK3sKKyAgICBjb25zdCBib29sIGlzUGxheWJhY2tUaHJlYWQgPSBtVHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYICYmIG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7CisgICAgY29uc3QgYm9vbCBpc1JlY29yZFRocmVhZCA9IG1UeXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVggJiYgbVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTks7CisgICAgQUxPR19BU1NFUlQoaXNQbGF5YmFja1RocmVhZCAhPSBpc1JlY29yZFRocmVhZCk7CisKKworICAgIGlmIChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgLy8ganVzdCBjaGVjayB0eXBlcyBpZiBtdWx0aXBsZSBkZXZpY2VzIGFyZSBzZWxlY3RlZAorICAgICAgICBpZiAocG9wY291bnQoZGV2aWNlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pID4gMSkgeworICAgICAgICAgICAgaWYgKChtU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSAhPSBkZXZpY2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobVN1cHBvcnRlZERldmljZXMuZ2V0RGV2aWNlKGRldmljZSwgYWRkcmVzcykgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNhbXBsaW5nUmF0ZSA9PSAwKSB7CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHVpbnQzMl90IG15VXBkYXRlZFNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZTsKKyAgICBpZiAoaXNQbGF5YmFja1RocmVhZCAmJiBjaGVja0V4YWN0U2FtcGxpbmdSYXRlKHNhbXBsaW5nUmF0ZSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGlzUmVjb3JkVGhyZWFkICYmIGNoZWNrQ29tcGF0aWJsZVNhbXBsaW5nUmF0ZShzYW1wbGluZ1JhdGUsICZteVVwZGF0ZWRTYW1wbGluZ1JhdGUpICE9CisgICAgICAgICAgICBOT19FUlJPUikgeworICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNQbGF5YmFja1RocmVhZCAmJiBjaGVja0V4YWN0Rm9ybWF0KGZvcm1hdCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBhdWRpb19mb3JtYXRfdCBteVVwZGF0ZWRGb3JtYXQgPSBmb3JtYXQ7CisgICAgaWYgKGlzUmVjb3JkVGhyZWFkICYmIGNoZWNrQ29tcGF0aWJsZUZvcm1hdChmb3JtYXQsICZteVVwZGF0ZWRGb3JtYXQpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoaXNQbGF5YmFja1RocmVhZCAmJiAoIWF1ZGlvX2lzX291dHB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSB8fAorICAgICAgICAgICAgY2hlY2tFeGFjdENoYW5uZWxNYXNrKGNoYW5uZWxNYXNrKSAhPSBOT19FUlJPUikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBteVVwZGF0ZWRDaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOworICAgIGlmIChpc1JlY29yZFRocmVhZCAmJiAoIWF1ZGlvX2lzX2lucHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spIHx8CisgICAgICAgICAgICBjaGVja0NvbXBhdGlibGVDaGFubmVsTWFzayhjaGFubmVsTWFzaywgJm15VXBkYXRlZENoYW5uZWxNYXNrKSAhPSBOT19FUlJPUikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChpc1BsYXliYWNrVGhyZWFkICYmIChtRmxhZ3MgJiBmbGFncykgIT0gZmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBUaGUgb25seSBpbnB1dCBmbGFnIHRoYXQgaXMgYWxsb3dlZCB0byBiZSBkaWZmZXJlbnQgaXMgdGhlIGZhc3QgZmxhZy4KKyAgICAvLyBBbiBleGlzdGluZyBmYXN0IHN0cmVhbSBpcyBjb21wYXRpYmxlIHdpdGggYSBub3JtYWwgdHJhY2sgcmVxdWVzdC4KKyAgICAvLyBBbiBleGlzdGluZyBub3JtYWwgc3RyZWFtIGlzIGNvbXBhdGlibGUgd2l0aCBhIGZhc3QgdHJhY2sgcmVxdWVzdCwKKyAgICAvLyBidXQgdGhlIGZhc3QgcmVxdWVzdCB3aWxsIGJlIGRlbmllZCBieSBBdWRpb0ZsaW5nZXIgYW5kIGNvbnZlcnRlZCB0byBub3JtYWwgdHJhY2suCisgICAgaWYgKGlzUmVjb3JkVGhyZWFkICYmICgobUZsYWdzIF4gZmxhZ3MpICYKKyAgICAgICAgICAgIH5BVURJT19JTlBVVF9GTEFHX0ZBU1QpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAodXBkYXRlZFNhbXBsaW5nUmF0ZSAhPSBOVUxMKSB7CisgICAgICAgICp1cGRhdGVkU2FtcGxpbmdSYXRlID0gbXlVcGRhdGVkU2FtcGxpbmdSYXRlOworICAgIH0KKyAgICBpZiAodXBkYXRlZEZvcm1hdCAhPSBOVUxMKSB7CisgICAgICAgICp1cGRhdGVkRm9ybWF0ID0gbXlVcGRhdGVkRm9ybWF0OworICAgIH0KKyAgICBpZiAodXBkYXRlZENoYW5uZWxNYXNrICE9IE5VTEwpIHsKKyAgICAgICAgKnVwZGF0ZWRDaGFubmVsTWFzayA9IG15VXBkYXRlZENoYW5uZWxNYXNrOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBJT1Byb2ZpbGU6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgQXVkaW9Qb3J0OjpkdW1wKGZkLCA0KTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAtIGZsYWdzOiAweCUwNHhcbiIsIG1GbGFncyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAtIGRldmljZXM6XG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3VwcG9ydGVkRGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBtU3VwcG9ydGVkRGV2aWNlc1tpXS0+ZHVtcChmZCwgNiwgaSk7CisgICAgfQorfQorCit2b2lkIElPUHJvZmlsZTo6bG9nKCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIEFMT0dWKCIgICAgLSBzYW1wbGluZyByYXRlczogIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkrKykgeworICAgICAgICBBTE9HVigiICAlZCIsIG1TYW1wbGluZ1JhdGVzW2ldKTsKKyAgICB9CisKKyAgICBBTE9HVigiICAgIC0gY2hhbm5lbCBtYXNrczogIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEFMT0dWKCIgIDB4JTA0eCIsIG1DaGFubmVsTWFza3NbaV0pOworICAgIH0KKworICAgIEFMT0dWKCIgICAgLSBmb3JtYXRzOiAiKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Gb3JtYXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEFMT0dWKCIgIDB4JTA4eCIsIG1Gb3JtYXRzW2ldKTsKKyAgICB9CisKKyAgICBBTE9HVigiICAgIC0gZGV2aWNlczogMHglMDR4XG4iLCBtU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpKTsKKyAgICBBTE9HVigiICAgIC0gZmxhZ3M6IDB4JTA0eFxuIiwgbUZsYWdzKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1Nlc3Npb25Sb3V0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXNzaW9uUm91dGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlY2ZhNDQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXNzaW9uUm91dGUuY3BwCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OlNlc3Npb25Sb3V0ZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIlNlc3Npb25Sb3V0ZS5oIgorI2luY2x1ZGUgIkh3TW9kdWxlLmgiCisjaW5jbHVkZSAiQXVkaW9HYWluLmgiCisjaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLSBTZXNzaW9uUm91dGUgY2xhc3MgaW1wbGVtZW50YXRpb24KK3ZvaWQgU2Vzc2lvblJvdXRlOjpsb2coY29uc3QgY2hhciogcHJlZml4KQoreworICAgIEFMT0dJKCIlc1tTZXNzaW9uUm91dGUgc3RybToweCVYLCBzcmM6JWQsIHNlc3M6MHglWCwgZGV2OjB4JVggcmVmczolZCBhY3Q6JWQiLAorICAgICAgICAgIHByZWZpeCwgbVN0cmVhbVR5cGUsIG1Tb3VyY2UsIG1TZXNzaW9uLAorICAgICAgICAgIG1EZXZpY2VEZXNjcmlwdG9yICE9IDAgPyBtRGV2aWNlRGVzY3JpcHRvci0+dHlwZSgpIDogQVVESU9fREVWSUNFX05PTkUsCisgICAgICAgICAgbVJlZkNvdW50LCBtQWN0aXZpdHlDb3VudCk7Cit9CisKKy8vIC0tLSBTZXNzaW9uUm91dGVNYXAgY2xhc3MgaW1wbGVtZW50YXRpb24KK2Jvb2wgU2Vzc2lvblJvdXRlTWFwOjpoYXNSb3V0ZShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICByZXR1cm4gaW5kZXhPZktleShzZXNzaW9uKSA+PSAwICYmIHZhbHVlRm9yKHNlc3Npb24pLT5tRGV2aWNlRGVzY3JpcHRvciAhPSAwOworfQorCitib29sIFNlc3Npb25Sb3V0ZU1hcDo6aGFzUm91dGVDaGFuZ2VkKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIGlmIChpbmRleE9mS2V5KHNlc3Npb24pID49IDApIHsKKyAgICAgICAgaWYgKHZhbHVlRm9yKHNlc3Npb24pLT5tQ2hhbmdlZCkgeworICAgICAgICAgICAgdmFsdWVGb3Ioc2Vzc2lvbiktPm1DaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgU2Vzc2lvblJvdXRlTWFwOjpyZW1vdmVSb3V0ZShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gaW5kZXhPZktleShzZXNzaW9uKSA+PSAwID8gdmFsdWVGb3Ioc2Vzc2lvbikgOiAwOworICAgIGlmIChyb3V0ZSAhPSAwKSB7CisgICAgICAgIEFMT0dfQVNTRVJUKHJvdXRlLT5tUmVmQ291bnQgPiAwKTsKKyAgICAgICAgLS1yb3V0ZS0+bVJlZkNvdW50OworICAgICAgICBpZiAocm91dGUtPm1SZWZDb3VudCA8PSAwKSB7CisgICAgICAgICAgICByZW1vdmVJdGVtKHNlc3Npb24pOworICAgICAgICB9CisgICAgfQorfQorCitpbnQgU2Vzc2lvblJvdXRlTWFwOjppbmNSb3V0ZUFjdGl2aXR5KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBpbmRleE9mS2V5KHNlc3Npb24pID49IDAgPyB2YWx1ZUZvcihzZXNzaW9uKSA6IDA7CisgICAgcmV0dXJuIHJvdXRlICE9IDAgPyArKyhyb3V0ZS0+bUFjdGl2aXR5Q291bnQpIDogLTE7Cit9CisKK2ludCBTZXNzaW9uUm91dGVNYXA6OmRlY1JvdXRlQWN0aXZpdHkoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IGluZGV4T2ZLZXkoc2Vzc2lvbikgPj0gMCA/IHZhbHVlRm9yKHNlc3Npb24pIDogMDsKKyAgICBpZiAocm91dGUgIT0gMCAmJiByb3V0ZS0+bUFjdGl2aXR5Q291bnQgPiAwKSB7CisgICAgICAgIHJldHVybiAtLShyb3V0ZS0+bUFjdGl2aXR5Q291bnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKK3ZvaWQgU2Vzc2lvblJvdXRlTWFwOjpsb2coY29uc3QgY2hhciogY2FwdGlvbikKK3sKKyAgICBBTE9HSSgiJXMgLS0tLSIsIGNhcHRpb24pOworICAgIGZvcihzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHNpemUoKTsgaW5kZXgrKykgeworICAgICAgICB2YWx1ZUF0KGluZGV4KS0+bG9nKCIgICIpOworICAgIH0KK30KKwordm9pZCBTZXNzaW9uUm91dGVNYXA6OmFkZFJvdXRlKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCit7CisgICAgaWYgKG1NYXBUeXBlID09IE1BUFRZUEVfSU5QVVQgJiYgc3RyZWFtVHlwZSAhPSBTZXNzaW9uUm91dGU6OlNUUkVBTV9UWVBFX05BKSB7CisgICAgICAgIEFMT0dFKCJBZGRpbmcgT3V0cHV0IFJvdXRlIHRvIElucHV0Um91dGVNYXAiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAobU1hcFR5cGUgPT0gTUFQVFlQRV9PVVRQVVQgJiYgc291cmNlICE9IFNlc3Npb25Sb3V0ZTo6U09VUkNFX1RZUEVfTkEpIHsKKyAgICAgICAgQUxPR0UoIkFkZGluZyBJbnB1dCBSb3V0ZSB0byBPdXRwdXRSb3V0ZU1hcCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IGluZGV4T2ZLZXkoc2Vzc2lvbikgPj0gMCA/IHZhbHVlRm9yKHNlc3Npb24pIDogMDsKKworICAgIGlmIChyb3V0ZSAhPSAwKSB7CisgICAgICAgIGlmICgoKHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvciA9PSAwKSAmJiAoZGVzY3JpcHRvciAhPSAwKSkgfHwKKyAgICAgICAgICAgICAgICAoKHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvciAhPSAwKSAmJgorICAgICAgICAgICAgICAgICAoKGRlc2NyaXB0b3IgPT0gMCkgfHwgKCFyb3V0ZS0+bURldmljZURlc2NyaXB0b3ItPmVxdWFscyhkZXNjcmlwdG9yKSkpKSkgeworICAgICAgICAgICAgcm91dGUtPm1DaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByb3V0ZS0+bVJlZkNvdW50Kys7CisgICAgICAgIHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcm91dGUgPSBuZXcgU2Vzc2lvblJvdXRlKHNlc3Npb24sIHN0cmVhbVR5cGUsIHNvdXJjZSwgZGVzY3JpcHRvciwgdWlkKTsKKyAgICAgICAgcm91dGUtPm1SZWZDb3VudCsrOworICAgICAgICBhZGQoc2Vzc2lvbiwgcm91dGUpOworICAgICAgICBpZiAoZGVzY3JpcHRvciAhPSAwKSB7CisgICAgICAgICAgICByb3V0ZS0+bUNoYW5nZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Tb3VuZFRyaWdnZXJTZXNzaW9uLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NvdW5kVHJpZ2dlclNlc3Npb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYTNhZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Tb3VuZFRyaWdnZXJTZXNzaW9uLmNwcApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OlNvdW5kVHJpZ2dlclNlc3Npb24iCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJTb3VuZFRyaWdnZXJTZXNzaW9uLmgiCisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0dXNfdCBTb3VuZFRyaWdnZXJTZXNzaW9uQ29sbGVjdGlvbjo6YWNxdWlyZVNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpCit7CisgICAgYWRkKHNlc3Npb24sIGlvSGFuZGxlKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VyU2Vzc2lvbkNvbGxlY3Rpb246OnJlbGVhc2VTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIHNzaXplX3QgaW5kZXggPSBpbmRleE9mS2V5KHNlc3Npb24pOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coImFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKCkgc2Vzc2lvbiAlZCBub3QgcmVnaXN0ZXJlZCIsIHNlc3Npb24pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJlbW92ZUl0ZW0oc2Vzc2lvbik7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit9OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TdHJlYW1EZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1N0cmVhbURlc2NyaXB0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ODJlMmMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TdHJlYW1EZXNjcmlwdG9yLmNwcApAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpWb2x1bWVzIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisvLyNkZWZpbmUgVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNpZmRlZiBWRVJZX1ZFUkJPU0VfTE9HR0lORworI2RlZmluZSBBTE9HVlYgQUxPR1YKKyNlbHNlCisjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCisjaW5jbHVkZSAiU3RyZWFtRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0gU3RyZWFtRGVzY3JpcHRvciBjbGFzcyBpbXBsZW1lbnRhdGlvbgorCitTdHJlYW1EZXNjcmlwdG9yOjpTdHJlYW1EZXNjcmlwdG9yKCkKKyAgICA6ICAgbUluZGV4TWluKDApLCBtSW5kZXhNYXgoMSksIG1DYW5CZU11dGVkKHRydWUpCit7CisgICAgbUluZGV4Q3VyLmFkZChBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQsIDApOworfQorCitpbnQgU3RyZWFtRGVzY3JpcHRvcjo6Z2V0Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKK3sKKyAgICBkZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShkZXZpY2UpOworICAgIC8vIHRoZXJlIGlzIGFsd2F5cyBhIHZhbGlkIGVudHJ5IGZvciBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQKKyAgICBpZiAobUluZGV4Q3VyLmluZGV4T2ZLZXkoZGV2aWNlKSA8IDApIHsKKyAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUOworICAgIH0KKyAgICByZXR1cm4gbUluZGV4Q3VyLnZhbHVlRm9yKGRldmljZSk7Cit9CisKK3ZvaWQgU3RyZWFtRGVzY3JpcHRvcjo6Y2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoKQoreworICAgIG1JbmRleEN1ci5jbGVhcigpOworfQorCit2b2lkIFN0cmVhbURlc2NyaXB0b3I6OmFkZEN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBpbnQgaW5kZXgpCit7CisgICAgbUluZGV4Q3VyLmFkZChkZXZpY2UsIGluZGV4KTsKK30KKwordm9pZCBTdHJlYW1EZXNjcmlwdG9yOjpzZXRWb2x1bWVJbmRleE1pbihpbnQgdm9sSW5kZXhNaW4pCit7CisgICAgbUluZGV4TWluID0gdm9sSW5kZXhNaW47Cit9CisKK3ZvaWQgU3RyZWFtRGVzY3JpcHRvcjo6c2V0Vm9sdW1lSW5kZXhNYXgoaW50IHZvbEluZGV4TWF4KQoreworICAgIG1JbmRleE1heCA9IHZvbEluZGV4TWF4OworfQorCit2b2lkIFN0cmVhbURlc2NyaXB0b3I6OnNldFZvbHVtZUN1cnZlUG9pbnQoVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqcG9pbnQpCit7CisgICAgbVZvbHVtZUN1cnZlW2RldmljZUNhdGVnb3J5XSA9IHBvaW50OworfQorCit2b2lkIFN0cmVhbURlc2NyaXB0b3I6OmR1bXAoaW50IGZkKSBjb25zdAoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJXMgICAgICAgICAlMDJkICAgICAgICAgJTAyZCAgICAgICAgICIsCisgICAgICAgICAgICAgbUNhbkJlTXV0ZWQgPyAidHJ1ZSAiIDogImZhbHNlIiwgbUluZGV4TWluLCBtSW5kZXhNYXgpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbmRleEN1ci5zaXplKCk7IGkrKykgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlMDR4IDogJTAyZCwgIiwKKyAgICAgICAgICAgICAgICAgbUluZGV4Q3VyLmtleUF0KGkpLAorICAgICAgICAgICAgICAgICBtSW5kZXhDdXIudmFsdWVBdChpKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworfQorCitTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6U3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb24oKQoreworICAgIGZvciAoc2l6ZV90IHN0cmVhbSA9IDAgOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOyBzdHJlYW0rKykgeworICAgICAgICBhZGQoc3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4oc3RyZWFtKSwgU3RyZWFtRGVzY3JpcHRvcigpKTsKKyAgICB9Cit9CisKK2Jvb2wgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmNhbkJlTXV0ZWQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgcmV0dXJuIHZhbHVlQXQoc3RyZWFtKS5jYW5CZU11dGVkKCk7Cit9CisKK3ZvaWQgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmNsZWFyQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIGVkaXRWYWx1ZUF0KHN0cmVhbSkuY2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoKTsKK30KKwordm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6YWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBpbmRleCkKK3sKKyAgICBlZGl0VmFsdWVBdChzdHJlYW0pLmFkZEN1cnJlbnRWb2x1bWVJbmRleChkZXZpY2UsIGluZGV4KTsKK30KKwordm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6c2V0Vm9sdW1lQ3VydmVQb2ludChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKnBvaW50KQoreworICAgIGVkaXRWYWx1ZUF0KHN0cmVhbSkuc2V0Vm9sdW1lQ3VydmVQb2ludChkZXZpY2VDYXRlZ29yeSwgcG9pbnQpOworfQorCitjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6Z2V0Vm9sdW1lQ3VydmVQb2ludChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5KSBjb25zdAoreworICAgIHJldHVybiB2YWx1ZUF0KHN0cmVhbSkuZ2V0Vm9sdW1lQ3VydmVQb2ludChkZXZpY2VDYXRlZ29yeSk7Cit9CisKK3ZvaWQgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OnNldFZvbHVtZUluZGV4TWluKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLGludCB2b2xJbmRleE1pbikKK3sKKyAgICByZXR1cm4gZWRpdFZhbHVlQXQoc3RyZWFtKS5zZXRWb2x1bWVJbmRleE1pbih2b2xJbmRleE1pbik7Cit9CisKK3ZvaWQgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OnNldFZvbHVtZUluZGV4TWF4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLGludCB2b2xJbmRleE1heCkKK3sKKyAgICByZXR1cm4gZWRpdFZhbHVlQXQoc3RyZWFtKS5zZXRWb2x1bWVJbmRleE1heCh2b2xJbmRleE1heCk7Cit9CisKK3N0YXR1c190IFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuU3RyZWFtcyBkdW1wOlxuIik7CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKKyAgICAgICAgICAgICAiIFN0cmVhbSAgQ2FuIGJlIG11dGVkICBJbmRleCBNaW4gIEluZGV4IE1heCAgSW5kZXggQ3VyIFtkZXZpY2UgOiBpbmRleF0uLi5cbiIpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAlMDJ6dSAgICAgICIsIGkpOworICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgIHZhbHVlQXQoaSkuZHVtcChmZCk7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTczZTU0MwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmgKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyLmg+CisjaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8Vm9sdW1lLmg+CisjaW5jbHVkZSA8SHdNb2R1bGUuaD4KKyNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgZGVkaWNhdGVkIHRvIHRoZSBwb2xpY3kgbWFuYWdlciB0aGF0IGEgUG9saWN5IEVuZ2luZSBzaGFsbCBpbXBsZW1lbnQuCisgKi8KK2NsYXNzIEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZQoreworcHVibGljOgorICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGUgZW5naW5lIHdhcyBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIGluaXRpYWxpemF0aW9uIGhhcyBiZWVuIGRvbmUgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4uCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBNYW5hZ2VyIG9ic2VydmVyIHRoYXQgYWxsb3dzIHRoZSBlbmdpbmUgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gb24gY29sbGVjdGlvbgorICAgICAqIG9mIGRldmljZXMsIHN0cmVhbXMsIEh3TW9kdWxlcywgLi4uCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIG9ic2VydmVyIGhhbmRsZSBvbiB0aGUgbWFuYWdlci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgc2V0T2JzZXJ2ZXIoQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm9ic2VydmVyKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGlucHV0IGRldmljZSBzZWxlY3RlZCBmb3IgYSBnaXZlbiBpbnB1dCBzb3VyY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGlucHV0U291cmNlIHRvIGdldCB0aGUgc2VsZWN0ZWQgaW5wdXQgZGV2aWNlIGFzc29jaWF0ZWQgdG8KKyAgICAgKgorICAgICAqIEByZXR1cm4gc2VsZWN0ZWQgaW5wdXQgZGV2aWNlIGZvciB0aGUgZ2l2ZW4gaW5wdXQgc291cmNlLCBtYXkgYmUgbm9uZSBpZiBlcnJvci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBvdXRwdXQgZGV2aWNlIGFzc29jaWF0ZWQgdG8gYSBnaXZlbiBzdHJhdGVneS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gc3RyZWFtIHR5cGUgZm9yIHdoaWNoIHRoZSBzZWxlY3RlZCBvdXB1dCBkZXZpY2UgaXMgcmVxdWVzdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBzZWxlY3RlZCBvdXB1dCBkZXZpY2UgZm9yIHRoZSBnaXZlbiBzdHJhdGVneSwgbWF5IGJlIG5vbmUgaWYgZXJyb3IuCisgICAgICovCisgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdGF0ZWd5KSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHN0cmF0ZWd5IHNlbGVjdGVkIGZvciBhIGdpdmVuIHN0cmVhbSB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBzdHJlYW06IGZvciB3aGljaCB0aGUgc2VsZWN0ZWQgc3RyYXRlZ3kgZm9sbG93ZWQgYnkgaXMgcmVxdWVzdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBzdHJhdGVneSB0byBiZSBmb2xsb3dlZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc3RyYXRlZ3kgc2VsZWN0ZWQgZm9yIGEgZ2l2ZW4gdXNhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVzYWdlIHRvIGdldCB0aGUgc2VsZWN0ZWQgc3RyYXRlZ3kgZm9sbG93ZWQgYnkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHN0cmF0ZWd5IHRvIGJlIGZvbGxvd2VkLgorICAgICAqLworICAgIHZpcnR1YWwgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneUZvclVzYWdlKGF1ZGlvX3VzYWdlX3QgdXNhZ2UpID0gMDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgVGVsZXBob255IE1vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIG1vZGU6IEFuZHJvaWQgUGhvbmUgc3RhdGUgKG5vcm1hbCwgcmluZ3RvbmUsIGNzdiwgaW4gY29tbXVuaWNhdGlvbikKKyAgICAgKgorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgVGVsZXBob255IE1vZGUgc2V0IGNvcnJlY3RseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHRlbGVwaG9ueSBNb2RlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHRlbGVwaG9ueSBtb2RlCisgICAgICovCisgICAgdmlydHVhbCBhdWRpb19tb2RlX3QgZ2V0UGhvbmVTdGF0ZSgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFNldCBGb3JjZSBVc2UgY29uZmlnIGZvciBhIGdpdmVuIHVzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1c2FnZSBmb3Igd2hpY2ggYSBjb25maWd1cmF0aW9uIHNoYWxsIGJlIGZvcmNlZC4KKyAgICAgKiBAcGFyYW1baW5dIGNvbmZpZyB3aXNoZWQgdG8gYmUgZm9yY2VkIGZvciB0aGUgZ2l2ZW4gdXNhZ2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIHRoZSBGb3JjZSBVc2UgY29uZmlnIHdhcyBzZXQgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZSAoZS5nLiBjb25maWcKKyAgICAgKiBub3QgYWxsb3dlZCBhIGdpdmVuIHVzYWdlLi4uKQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpID0gMDsKKworICAgIC8qKgorICAgICAqIEdldCBGb3JjZSBVc2UgY29uZmlnIGZvciBhIGdpdmVuIHVzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1c2FnZSBmb3Igd2hpY2ggYSBjb25maWd1cmF0aW9uIHNoYWxsIGJlIGZvcmNlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY29uZmlnIHdpc2hlZCB0byBiZSBmb3JjZWQgZm9yIHRoZSBnaXZlbiB1c2FnZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgZGV2aWNlKHMpLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBkZXZEZXNjIGZvciB3aGljaCB0aGUgc3RhdGUgaGFzIGNoYW5nZWQuCisgICAgICogQHBhcmFtW2luXSBzdGF0ZSBvZiBhdmFpbGFiaWxpdHkgb2YgdGhpcyh0aGVzZSkgZGV2aWNlKHMpLgorICAgICAqCisgICAgICogQHJldHVybiBOT19FUlJPUiBpZiBkZXZpY2VzIGNyaXRlcmlvbiB1cGRhdGVkIGNvcnJlY3RseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpID0gMDsKKworICAgIC8qKgorICAgICAqIFRyYW5zbGF0ZSBhIHZvbHVtZSBpbmRleCBnaXZlbiBieSB0aGUgVUkgdG8gYW4gYW1wbGlmaWNhdGlvbiB2YWx1ZSBpbiBkQiBmb3IgYSBzdHJlYW0gdHlwZQorICAgICAqIGFuZCBhIGRldmljZSBjYXRlZ29yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gZGV2aWNlQ2F0ZWdvcnkgZm9yIHdoaWNoIHRoZSBjb252ZXJzaW9uIGlzIHJlcXVlc3RlZC4KKyAgICAgKiBAcGFyYW1baW5dIHN0cmVhbSB0eXBlIGZvciB3aGljaCB0aGUgY29udmVyc2lvbiBpcyByZXF1ZXN0ZWQuCisgICAgICogQHBhcmFtW2luXSBpbmRleEluVWkgaW5kZXggcmVjZWl2ZWQgZnJvbSB0aGUgVUkgdG8gYmUgdHJhbnNsYXRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW1wbGlmaWNhdGlvbiB2YWx1ZSBpbiBkQiBtYXRjaGluZyB0aGUgVUkgaW5kZXggZm9yIHRoaXMgZ2l2ZW4gZGV2aWNlIGFuZCBzdHJlYW0uCisgICAgICovCisgICAgdmlydHVhbCBmbG9hdCB2b2xJbmRleFRvRGIoVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4SW5VaSkgPSAwOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGUgbWluIC8gbWF4IGluZGV4IG9mIHZvbHVtZSBhcHBsaWNhYmxlIGZvciBhIGdpdmVuIHN0cmVhbSB0eXBlLiBUaGVzZSBpbmRleGVzCisgICAgICogd2lsbCBiZSB1c2VkIHVwb24gY29udmVyc2lvbiBvZiBVSSBpbmRleCB0byB2b2x1bWUgYW1wbGlmaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gc3RyZWFtIHR5cGUgZm9yIHdoaWNoIHRoZSBpbmRleGVzIG5lZWQgdG8gYmUgc2V0CisgICAgICogQHBhcmFtW2luXSBpbmRleE1pbiBNaW5pbXVtIGluZGV4IGFsbG93ZWQgZm9yIHRoaXMgc3RyZWFtLgorICAgICAqIEBwYXJhbVtpbl0gaW5kZXhNYXggTWF4aW11bSBpbmRleCBhbGxvd2VkIGZvciB0aGlzIHN0cmVhbS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHZvbHVtZSBjdXJ2ZXMgZm9yIGVhY2ggc3RyYXRlZ3kgYW5kIGRldmljZSBjYXRlZ29yeQorICAgICAqCisgICAgICogQHBhcmFtW2luXSBpc1NwZWFrZXJEcmNFbmFibGVkIHRydWUgb24gZGV2aWNlcyB0aGF0IHVzZSBEUkMgb24gdGhlIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgICAgICAgICAgICBwYXRoIHRvIGJvb3N0IHNvZnQgc291bmRzLCB1c2VkIHRvIGFkanVzdCB2b2x1bWUgY3VydmVzIGFjY29yZGluZ2x5CisgICAgICovCisgICAgdmlydHVhbCB2b2lkIGluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoYm9vbCBpc1NwZWFrZXJEcmNFbmFibGVkKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UoKSB7fQorfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZDQzZGYyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlci5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPEF1ZGlvR2Fpbi5oPgorI2luY2x1ZGUgPEF1ZGlvUG9ydC5oPgorI2luY2x1ZGUgPEF1ZGlvUGF0Y2guaD4KKyNpbmNsdWRlIDxJT1Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8QXVkaW9JbnB1dERlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxBdWRpb091dHB1dERlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxBdWRpb1BvbGljeU1peC5oPgorI2luY2x1ZGUgPFNvdW5kVHJpZ2dlclNlc3Npb24uaD4KKyNpbmNsdWRlIDxTdHJlYW1EZXNjcmlwdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyBhbiBvYnNlcnZlciB0aGF0IHRoZSBtYW5hZ2VyIHNoYWxsIGltcGxlbWVudCB0byBhbGxvd3MgZS5nLiB0aGUgZW5naW5lCisgKiB0byBhY2Nlc3MgdG8gcG9saWN5IHBpbGxhcnMgZWxlbWVudHMgKGxpa2Ugb3V0cHV0IC8gaW5wdXQgZGVzY3JpdG9ycyBjb2xsZWN0aW9ucywKKyAqIEh3TW9kdWxlIGNvbGxlY3Rpb25zLCBBdWRpb01peCwgLi4uCisgKi8KK2NsYXNzIEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyCit7CitwdWJsaWM6CisgICAgdmlydHVhbCBjb25zdCBBdWRpb1BhdGNoQ29sbGVjdGlvbiAmZ2V0QXVkaW9QYXRjaGVzKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCBjb25zdCBTb3VuZFRyaWdnZXJTZXNzaW9uQ29sbGVjdGlvbiAmZ2V0U291bmRUcmlnZ2VyU2Vzc2lvbkNvbGxlY3Rpb24oKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIGNvbnN0IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbiAmZ2V0QXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmZ2V0T3V0cHV0cygpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgY29uc3QgQXVkaW9JbnB1dENvbGxlY3Rpb24gJmdldElucHV0cygpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgY29uc3QgRGV2aWNlVmVjdG9yICZnZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCBjb25zdCBEZXZpY2VWZWN0b3IgJmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb24gJmdldFN0cmVhbURlc2NyaXB0b3JzKCkgPSAwOworCisgICAgdmlydHVhbCBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZ2V0RGVmYXVsdE91dHB1dERldmljZSgpIGNvbnN0ID0gMDsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyKCkge30KK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIxOGM1MjAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvQW5kcm9pZC5tawpAQCAtMCwwICsxLDU5IEBACitpZmVxICgkKFVTRV9DT05GSUdVUkFCTEVfQVVESU9fUE9MSUNZKSwgMSkKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCisjIENvbXBvbmVudCBidWlsZAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgc3JjL0VuZ2luZS5jcHAgXAorICAgIHNyYy9FbmdpbmVJbnN0YW5jZS5jcHAgXAorICAgIHNyYy9TdHJlYW0uY3BwIFwKKyAgICBzcmMvU3RyYXRlZ3kuY3BwIFwKKyAgICBzcmMvVXNhZ2UuY3BwIFwKKyAgICBzcmMvSW5wdXRTb3VyY2UuY3BwIFwKKworYXVkaW9fcG9saWN5X2VuZ2luZV9pbmNsdWRlc19jb21tb24gOj0gXAorICAgICQoVE9QRElSKWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2luY2x1ZGUgXAorICAgICQoVE9QRElSKWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2ludGVyZmFjZSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlCisKK0xPQ0FMX0NGTEFHUyArPSBcCisgICAgLVdhbGwgXAorICAgIC1XZXJyb3IgXAorICAgIC1XZXh0cmEgXAorCitMT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gXAorICAgICQoYXVkaW9fcG9saWN5X2VuZ2luZV9pbmNsdWRlc19jb21tb24pCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICQoYXVkaW9fcG9saWN5X2VuZ2luZV9pbmNsdWRlc19jb21tb24pIFwKKyAgICAkKFRBUkdFVF9PVVRfSEVBREVSUykvaHcgXAorICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBmcmFtZXdvcmtzLWF2KSBcCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZQorCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYWJsZQorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgIGxpYm1lZGlhX2hlbHBlciBcCisgICAgbGliYXVkaW9wb2xpY3lwZnd3cmFwcGVyIFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliY3V0aWxzIFwKKyAgICBsaWJ1dGlscyBcCisgICAgbGliYXVkaW91dGlscyBcCisgICAgbGlicGFyYW1ldGVyCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUmVjdXJzaXZlIGNhbGwgc3ViLWZvbGRlciBBbmRyb2lkLm1rCisjCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCisKK2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZS9BdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZS9BdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmM0YmUyYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlL0F1ZGlvUG9saWN5RW5naW5lSW5zdGFuY2UuaApAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKK2NsYXNzIEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZTsKK2NsYXNzIEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlOworCituYW1lc3BhY2UgYW5kcm9pZAoreworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoreworCitjbGFzcyBFbmdpbmU7CisKK2NsYXNzIEVuZ2luZUluc3RhbmNlCit7Citwcm90ZWN0ZWQ6CisgICAgRW5naW5lSW5zdGFuY2UoKTsKKworcHVibGljOgorICAgIHZpcnR1YWwgfkVuZ2luZUluc3RhbmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgQXVkaW8gUG9saWN5IEVuZ2luZSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcG9pbnRlciB0byBSb3V0ZSBNYW5hZ2VyIEluc3RhbmNlIG9iamVjdC4KKyAgICAgKi8KKyAgICBzdGF0aWMgRW5naW5lSW5zdGFuY2UgKmdldEluc3RhbmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgcXVlcnkuCisgICAgICogVGhlIGZpcnN0IGNsaWVudCBvZiBhbiBpbnRlcmZhY2Ugb2YgdGhlIHBvbGljeSBlbmdpbmUgd2lsbCBzdGFydCB0aGUgc2luZ2xldG9uLgorICAgICAqCisgICAgICogQHRwYXJhbSBSZXF1ZXN0ZWRJbnRlcmZhY2U6IGludGVyZmFjZSB0aGF0IHRoZSBjbGllbnQgaXMgd2lzaGluZyB0byByZXRyaWV2ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gaW50ZXJmYWNlIGhhbmRsZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgUmVxdWVzdGVkSW50ZXJmYWNlPgorICAgIFJlcXVlc3RlZEludGVyZmFjZSAqcXVlcnlJbnRlcmZhY2UoKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIC8qKgorICAgICAqIEdldCBBdWRpbyBQb2xpY3kgRW5naW5lIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHJldHVybiBBdWRpbyBQb2xpY3kgRW5naW5lIHNpbmdsZXRvbi4KKyAgICAgKi8KKyAgICBFbmdpbmUgKmdldEVuZ2luZSgpIGNvbnN0OworCitwcml2YXRlOgorICAgIC8qIENvcHkgZmFjaWxpdGllcyBhcmUgcHV0IHByaXZhdGUgdG8gZGlzYWJsZSBjb3B5LiAqLworICAgIEVuZ2luZUluc3RhbmNlKGNvbnN0IEVuZ2luZUluc3RhbmNlICZvYmplY3QpOworICAgIEVuZ2luZUluc3RhbmNlICZvcGVyYXRvcj0oY29uc3QgRW5naW5lSW5zdGFuY2UgJm9iamVjdCk7Cit9OworCisvKioKKyAqIExpbWl0IHRlbXBsYXRlIGluc3RhbnRhdGlvbiB0byBzdXBwb3J0ZWQgdHlwZSBpbnRlcmZhY2VzLgorICogQ29tcGlsZSB0aW1lIGVycm9yIHdpbGwgY2xhaW0gaWYgaW52YWxpZCBpbnRlcmZhY2UgaXMgcmVxdWVzdGVkLgorICovCit0ZW1wbGF0ZSA8PgorQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlICpFbmdpbmVJbnN0YW5jZTo6cXVlcnlJbnRlcmZhY2UoKSBjb25zdDsKKwordGVtcGxhdGUgPD4KK0F1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlICpFbmdpbmVJbnN0YW5jZTo6cXVlcnlJbnRlcmZhY2UoKSBjb25zdDsKKworfTsgLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9yb3VuZHVwLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZS9FbmdpbmVEZWZpbml0aW9uLmgKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQpzaW1pbGFyaXR5IGluZGV4IDY4JQpyZW5hbWUgZnJvbSBpbmNsdWRlL21lZGlhL25iYWlvL3JvdW5kdXAuaApyZW5hbWUgdG8gc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2luY2x1ZGUvRW5naW5lRGVmaW5pdGlvbi5oCmluZGV4IDRjM2NjMjUuLjU0ZDhkYjUKLS0tIGEvaW5jbHVkZS9tZWRpYS9uYmFpby9yb3VuZHVwLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2luY2x1ZGUvRW5naW5lRGVmaW5pdGlvbi5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTggKzE0LDkgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZm5kZWYgUk9VTkRVUF9ICi0jZGVmaW5lIFJPVU5EVVBfSAorI3ByYWdtYSBvbmNlCiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKKyNpbmNsdWRlIDxWb2x1bWUuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKLS8vIFJvdW5kIHVwIHRvIHRoZSBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMgotdW5zaWduZWQgcm91bmR1cCh1bnNpZ25lZCB2KTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmICAvLyBST1VORFVQX0gKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8Vm9sdW1lQ3VydmVQb2ludD4gVm9sdW1lQ3VydmVQb2ludHM7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzRkYWJhNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaApAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8RW5naW5lRGVmaW5pdGlvbi5oPgorI2luY2x1ZGUgPFZvbHVtZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgdGhlIHBhcmFtZXRlciBwbHVnaW4gdG86CisgKiAgLSBpbnN0YW50aWF0ZSBhbGwgdGhlIG1lbWJlcnMgb2YgdGhlIHBvbGljeSBlbmdpbmUgKHN0cmF0ZWdpZXMsIGlucHV0IHNvdXJjZXMsIHVzYWdlcywgcHJvZmlsZXMpCisgKiAgLSBrZWVwIHVwIHRvIGRhdGUgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlc2UgcG9saWN5IG1lbWJlcnMgKCBpLmUuIGRldmljZXMgdG8gYmUgdXNlZCBmb3IgYQorICogICAgc3RyYXRlZ3ksIHN0cmF0ZWd5IHRvIGJlIGZvbGxvd2VkIGJ5IGEgdXNhZ2Ugb3IgYSBzdHJlYW0sIC4uLikKKyAqLworY2xhc3MgQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UKK3sKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzdHJhdGVneSB0byB0aGUgZW5naW5lCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIG5hbWUgb2YgdGhlIHN0cmF0ZWd5IHRvIGFkZAorICAgICAqIEBwYXJhbVtpbl0gaWRlbnRpZmllcjogdGhlIG51bWVyaWNhbCB2YWx1ZSBhc3NvY2lhdGVkIHRvIHRoaXMgbWVtYmVyLiBJdCBNVVNUIG1hdGNoIGVpdGhlcgorICAgICAqICAgICAgICAgICAgc3lzdGVtL2F1ZGlvLmggb3Igc3lzdGVtL2F1ZGlvX3BvbGljeS5oIGVudW1yYXRpb24gdmFsdWUgaW4gb3JkZXIgdG8gbGluayB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlciBjb250cm9sZWQgYnkgdGhlIFBGVyBhbmQgdGhlIHBvbGljeSBtYW5hZ2VyIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIHN0cmF0ZWd5IGhhcyBiZWVuIGFkZGVkIHN1Y2Nlc3NmdWxseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGFuZHJvaWQ6OnN0YXR1c190IGFkZFN0cmF0ZWd5KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCByb3V0aW5nX3N0cmF0ZWd5IGlkKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzdHJlYW1zIHRvIHRoZSBlbmdpbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIG5hbWUgb2YgdGhlIHN0cmVhbSB0byBhZGQKKyAgICAgKiBAcGFyYW1baW5dIGlkZW50aWZpZXI6IHRoZSBudW1lcmljYWwgdmFsdWUgYXNzb2NpYXRlZCB0byB0aGlzIG1lbWJlci4gSXQgTVVTVCBtYXRjaCBlaXRoZXIKKyAgICAgKiAgICAgICAgICAgIHN5c3RlbS9hdWRpby5oIG9yIHN5c3RlbS9hdWRpb19wb2xpY3kuaCBlbnVtcmF0aW9uIHZhbHVlIGluIG9yZGVyIHRvIGxpbmsgdGhlCisgICAgICogICAgICAgICAgICBwYXJhbWV0ZXIgY29udHJvbGVkIGJ5IHRoZSBQRlcgYW5kIHRoZSBwb2xpY3kgbWFuYWdlciBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIHRoZSBzdHJlYW0gaGFzIGJlZW4gYWRkZWQgc3VjY2Vzc2Z1bGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqLworICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3QgYWRkU3RyZWFtKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBhdWRpb19zdHJlYW1fdHlwZV90IGlkKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSB1c2FnZSB0byB0aGUgZW5naW5lCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIG5hbWUgb2YgdGhlIHVzYWdlIHRvIGFkZAorICAgICAqIEBwYXJhbVtpbl0gaWRlbnRpZmllcjogdGhlIG51bWVyaWNhbCB2YWx1ZSBhc3NvY2lhdGVkIHRvIHRoaXMgbWVtYmVyLiBJdCBNVVNUIG1hdGNoIGVpdGhlcgorICAgICAqICAgICAgICAgICAgc3lzdGVtL2F1ZGlvLmggb3Igc3lzdGVtL2F1ZGlvX3BvbGljeS5oIGVudW1yYXRpb24gdmFsdWUgaW4gb3JkZXIgdG8gbGluayB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlciBjb250cm9sZWQgYnkgdGhlIFBGVyBhbmQgdGhlIHBvbGljeSBtYW5hZ2VyIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIHVzYWdlIGhhcyBiZWVuIGFkZGVkIHN1Y2Nlc3NmdWxseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGFuZHJvaWQ6OnN0YXR1c190IGFkZFVzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBhdWRpb191c2FnZV90IGlkKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gaW5wdXQgc291cmNlIHRvIHRoZSBlbmdpbmUKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gbmFtZSBvZiB0aGUgaW5wdXQgc291cmNlIHRvIGFkZAorICAgICAqIEBwYXJhbVtpbl0gaWRlbnRpZmllcjogdGhlIG51bWVyaWNhbCB2YWx1ZSBhc3NvY2lhdGVkIHRvIHRoaXMgbWVtYmVyLiBJdCBNVVNUIG1hdGNoIGVpdGhlcgorICAgICAqICAgICAgICAgICAgc3lzdGVtL2F1ZGlvLmggb3Igc3lzdGVtL2F1ZGlvX3BvbGljeS5oIGVudW1yYXRpb24gdmFsdWUgaW4gb3JkZXIgdG8gbGluayB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlciBjb250cm9sZWQgYnkgdGhlIFBGVyBhbmQgdGhlIHBvbGljeSBtYW5hZ2VyIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIGlucHV0IHNvdXJjZSBoYXMgYmVlbiBhZGRlZCBzdWNjZXNzZnVsbHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICAgICAqCisgICAgICovCisgICAgdmlydHVhbCBhbmRyb2lkOjpzdGF0dXNfdCBhZGRJbnB1dFNvdXJjZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgYXVkaW9fc291cmNlX3QgaWQpID0gMDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGV2aWNlIHRvIGJlIHVzZWQgYnkgYSBzdHJhdGVneS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gc3RyYXRlZ3k6IG5hbWUgb2YgdGhlIHN0cmF0ZWd5IGZvciB3aGljaCB0aGUgZGV2aWNlIHRvIHVzZSBoYXMgdG8gYmUgc2V0CisgICAgICogQHBhcmFtW2luXSBkZXZpY2VzOyBtYXNrIG9mIGRldmljZXMgdG8gYmUgdXNlZCBmb3IgdGhlIGdpdmVuIHN0cmF0ZWd5LgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkZXZpY2VzIHdlcmUgc2V0IGNvcnJlY2x0eSBmb3IgdGhpcyBzdHJhdGVneSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBzZXREZXZpY2VGb3JTdHJhdGVneShjb25zdCByb3V0aW5nX3N0cmF0ZWd5ICZzdHJhdGVneSwgYXVkaW9fZGV2aWNlc190IGRldmljZXMpID0gMDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3RyYXRlZ3kgdG8gYmUgZm9sbG93ZWQgYnkgYSBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHN0cmVhbTogbmFtZSBvZiB0aGUgc3RyZWFtIGZvciB3aGljaCB0aGUgc3RyYXRlZ3kgdG8gdXNlIGhhcyB0byBiZSBzZXQKKyAgICAgKiBAcGFyYW1baW5dIHN0cmF0ZWd5IHRvIGZvbGxvdyBmb3IgdGhlIGdpdmVuIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyYXRlZ3kgd2VyZSBzZXQgY29ycmVjbHR5IGZvciB0aGlzIHN0cmVhbSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBzZXRTdHJhdGVneUZvclN0cmVhbShjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZzdHJlYW0sIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpID0gMDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3RyYXRlZ3kgdG8gYmUgZm9sbG93ZWQgYnkgYSBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHN0cmVhbTogbmFtZSBvZiB0aGUgc3RyZWFtIGZvciB3aGljaCB0aGUgc3RyYXRlZ3kgdG8gdXNlIGhhcyB0byBiZSBzZXQKKyAgICAgKiBAcGFyYW1baW5dIHN0cmF0ZWd5IHRvIGZvbGxvdyBmb3IgdGhlIGdpdmVuIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyYXRlZ3kgd2VyZSBzZXQgY29ycmVjbHR5IGZvciB0aGlzIHN0cmVhbSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWVQcm9maWxlRm9yU3RyZWFtKGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWU6OmRldmljZV9jYXRlZ29yeSBjYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50cyAmcG9pbnRzKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHN0cmF0ZWd5IHRvIGJlIGZvbGxvd2VkIGJ5IGEgdXNhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVzYWdlOiBuYW1lIG9mIHRoZSB1c2FnZSBmb3Igd2hpY2ggdGhlIHN0cmF0ZWd5IHRvIHVzZSBoYXMgdG8gYmUgc2V0CisgICAgICogQHBhcmFtW2luXSBzdHJhdGVneSB0byBmb2xsb3cgZm9yIHRoZSBnaXZlbiB1c2FnZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyYXRlZ3kgd2VyZSBzZXQgY29ycmVjbHR5IGZvciB0aGlzIHVzYWdlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgdmlydHVhbCBib29sIHNldFN0cmF0ZWd5Rm9yVXNhZ2UoY29uc3QgYXVkaW9fdXNhZ2VfdCAmdXNhZ2UsIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpID0gMDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaW5wdXQgZGV2aWNlIHRvIGJlIHVzZWQgYnkgYW4gaW5wdXQgc291cmNlLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBpbnB1dFNvdXJjZTogbmFtZSBvZiB0aGUgaW5wdXQgc291cmNlIGZvciB3aGljaCB0aGUgZGV2aWNlIHRvIHVzZSBoYXMgdG8gYmUgc2V0CisgICAgICogQHBhcmFtW2luXSBkZXZpY2VzOyBtYXNrIG9mIGRldmljZXMgdG8gYmUgdXNlZCBmb3IgdGhlIGdpdmVuIGlucHV0IHNvdXJjZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlcyB3ZXJlIHNldCBjb3JyZWNsdHkgZm9yIHRoaXMgaW5wdXQgc291cmNlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgdmlydHVhbCBib29sIHNldERldmljZUZvcklucHV0U291cmNlKGNvbnN0IGF1ZGlvX3NvdXJjZV90ICZpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UoKSB7fQorfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MDJmZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNyBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBSZWN1cnNpdmUgY2FsbCBzdWItZm9sZGVyIEFuZHJvaWQubWsKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWIxOTAyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTA1IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQE5PVEU6CisjIEF1ZGlvIFBvbGljeSBFbmdpbmUgY29uZmlndXJhYmxlIGV4YW1wbGUgZm9yIGdlbmVyaWMgZGV2aWNlIGJ1aWxkCisjCisjIEFueSB2ZW5kb3Igc2hhbGwgaGF2ZSBpdHMgb3duIGNvbmZpZ3VyYXRpb24gd2l0aGluIHRoZSBjb3JyZXNwb25kaW5nIGRldmljZSBmb2xkZXIKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworUEZXX0NPUkUgOj0gZXh0ZXJuYWwvcGFyYW1ldGVyLWZyYW1ld29yaworQlVJTERfUEZXX1NFVFRJTkdTIDo9ICQoUEZXX0NPUkUpL3N1cHBvcnQvYW5kcm9pZC9idWlsZF9wZndfc2V0dGluZ3MubWsKK1BGV19ERUZBVUxUX1NDSEVNQVNfRElSIDo9ICQoUEZXX0NPUkUpL1NjaGVtYXMKK1BGV19TQ0hFTUFTX0RJUiA6PSAkKFBGV19ERUZBVUxUX1NDSEVNQVNfRElSKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ09ORklHVVJBVElPTiBGSUxFUworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMgUG9saWN5IFBGVyB0b3AgbGV2ZWwgZmlsZSAjIyMjIyMjIyMKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrCitMT0NBTF9TUkNfRklMRVMgOj0gJChMT0NBTF9NT0RVTEUpCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKKworIyMjIyMjIyMjIyBQb2xpY3kgUEZXIFN0cnVjdHVyZXMgIyMjIyMjIyMjCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IFBvbGljeUNsYXNzLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9FVEMpL3BhcmFtZXRlci1mcmFtZXdvcmsvU3RydWN0dXJlL1BvbGljeQorTE9DQUxfU1JDX0ZJTEVTIDo9IFN0cnVjdHVyZS8kKExPQ0FMX01PRFVMRSkKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gUG9saWN5U3Vic3lzdGVtLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gXAorICAgIFBvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwgXAorICAgIFBvbGljeVN1YnN5c3RlbS1Wb2x1bWUueG1sIFwKKyAgICBsaWJwb2xpY3ktc3Vic3lzdGVtIFwKKworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9TdHJ1Y3R1cmUvUG9saWN5CitMT0NBTF9TUkNfRklMRVMgOj0gU3RydWN0dXJlLyQoTE9DQUxfTU9EVUxFKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBQb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9TdHJ1Y3R1cmUvUG9saWN5CitMT0NBTF9TUkNfRklMRVMgOj0gU3RydWN0dXJlLyQoTE9DQUxfTU9EVUxFKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBQb2xpY3lTdWJzeXN0ZW0tVm9sdW1lLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9FVEMpL3BhcmFtZXRlci1mcmFtZXdvcmsvU3RydWN0dXJlL1BvbGljeQorTE9DQUxfU1JDX0ZJTEVTIDo9IFN0cnVjdHVyZS8kKExPQ0FMX01PRFVMRSkKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworIyMjIyMjIyMjIFBvbGljeSBQRlcgU2V0dGluZ3MgIyMjIyMjIyMjCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrLnBvbGljeQorTE9DQUxfTU9EVUxFX1NURU0gOj0gUG9saWN5Q29uZmlndXJhYmxlRG9tYWlucy54bWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsvU2V0dGluZ3MvUG9saWN5CitMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyA6PSBcCisgICAgICAgIFBvbGljeUNsYXNzLnhtbCBcCisgICAgICAgIFBvbGljeVN1YnN5c3RlbS54bWwgXAorICAgICAgICBQYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAorCitpZmVxICgkKHBmd19yZWJ1aWxkX3NldHRpbmdzKSx0cnVlKQorUEZXX1RPUExFVkVMX0ZJTEUgOj0gJChUQVJHRVRfT1VUX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAorUEZXX0NSSVRFUklBX0ZJTEUgOj0gJChMT0NBTF9QQVRIKS9wb2xpY3lfY3JpdGVyaWEudHh0CitQRldfRUREX0ZJTEVTIDo9IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X21lZGlhLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9waG9uZS5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfZHRtZi5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfZW5mb3JjZWRfYXVkaWJsZS5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9hY2Nlc3NpYmlsaXR5LnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9yZXJvdXRpbmcucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9zdHJhdGVneV9mb3Jfc3RyZWFtLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3VzYWdlLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9pbnB1dF9zb3VyY2UucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy92b2x1bWVzLnBmdworCitpbmNsdWRlICQoQlVJTERfUEZXX1NFVFRJTkdTKQorZWxzZQorIyBVc2UgdGhlIGV4aXN0aW5nIGZpbGUKK0xPQ0FMX1NSQ19GSUxFUyA6PSBTZXR0aW5ncy8kKExPQ0FMX01PRFVMRV9TVEVNKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorZW5kaWYgIyBwZndfcmVidWlsZF9zZXR0aW5ncwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjkwNTIwMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKQEAgLTAsMCArMSwxNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxQYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249IlNjaGVtYXMvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvbi54c2QiCisgICAgU3lzdGVtQ2xhc3NOYW1lPSJQb2xpY3kiIFNlcnZlclBvcnQ9IjUwMTkiIFR1bmluZ0FsbG93ZWQ9InRydWUiPgorCisgICAgPFN1YnN5c3RlbVBsdWdpbnM+CisgICAgICAgIDxMb2NhdGlvbiBGb2xkZXI9IiI+CisgICAgICAgICAgICA8UGx1Z2luIE5hbWU9ImxpYnBvbGljeS1zdWJzeXN0ZW0uc28iLz4KKyAgICAgICAgPC9Mb2NhdGlvbj4KKyAgICA8L1N1YnN5c3RlbVBsdWdpbnM+CisgICAgPFN0cnVjdHVyZURlc2NyaXB0aW9uRmlsZUxvY2F0aW9uIFBhdGg9IlN0cnVjdHVyZS9Qb2xpY3kvUG9saWN5Q2xhc3MueG1sIi8+CisgICAgPFNldHRpbmdzQ29uZmlndXJhdGlvbj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZURvbWFpbnNGaWxlTG9jYXRpb24gUGF0aD0iU2V0dGluZ3MvUG9saWN5L1BvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMueG1sIi8+CisgICAgPC9TZXR0aW5nc0NvbmZpZ3VyYXRpb24+Cis8L1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1JFQURNRS5tZCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNjY4ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1JFQURNRS5tZApAQCAtMCwwICsxLDExIEBACitDb25maWd1cmFibGUgUG9saWN5IEVuZ2luZSBFeGFtcGxlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGZvbGRlciBleHBvc2VzIGEgZ2VuZXJpYyBmdW5jdGlvbmFsIGNvbmZpZ3VyYWJsZSBwb2xpY3kgZW5naW5lIGNvbmZpZ3VyYXRpb24gZmlsZXMKK3RvIHByb3ZpZGUgdG8gaGF2ZSBhIHByb2R1Y3QgZm9sbG93aW5nIHRoZSBuZXh1cyBleHBlcmllbmNlLgorCitBIHZlbmRvciB3aXNoaW5nIHRvIGN1c3RvbWl6ZSB0aGUgYmVoYXZpb3Igc2hhbGwgcHJvdmlkZXMgaXRzIG93biBzZXQgb2YgY29uZmlndXJhdGlvbiBmaWxlcword2l0aGluIHRoZSBkZXZpY2UgZm9sZGVyIGZvciB0aGUgcHJvZHVjdCB0byBjdXN0b21pemUuCisKK0ZvciBhbnkgcXVlc3Rpb24gYWJvdXQgdGhlIHBhcmFtZXRlciBmcmFtZXdvcmsgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMsCitTZWUgW3RoZSB3aWtpIG9uIGdpdGh1Yl0oaHR0cHM6Ly9naXRodWIuY29tLzAxb3JnL3BhcmFtZXRlci1mcmFtZXdvcmsvd2lraSkuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL1BvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9Qb2xpY3lDb25maWd1cmFibGVEb21haW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2IwNzIzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9Qb2xpY3lDb25maWd1cmFibGVEb21haW5zLnhtbApAQCAtMCwwICsxLDExMjk4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAjIyMjIERPIE5PVCBFRElUIFRISVMgRklMRSAjIyMjIC0tPgorPENvbmZpZ3VyYWJsZURvbWFpbnMgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249IlNjaGVtYXMvQ29uZmlndXJhYmxlRG9tYWlucy54c2QiIFN5c3RlbUNsYXNzTmFtZT0iUG9saWN5Ij4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5NZWRpYS5VbnJlYWNoYWJsZURldmljZXMiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQ2FsaWJyYXRpb24iPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5NZWRpYS5EZXZpY2UyIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iUmVtb3RlU3VibWl4Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iUmVtb3RlU3VibWl4Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlTm9CdEEyZHAiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aEEyZHAiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwSGVhZHBob25lIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VOb0J0QTJkcCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwU3BlYWtlciI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlTm9CdEEyZHAiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aEEyZHBTcGVha2VyIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRm9yY2VTcGVha2VyIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRwaG9uZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IldpcmVkSGVhZHBob25lIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTGluZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkxpbmUiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJXaXJlZEhlYWRzZXQiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JBY2Nlc3NvcnkiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJVc2JBY2Nlc3NvcnkiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JEZXZpY2UiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJVc2JEZXZpY2UiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZ3RsRG9ja0hlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJEZ3RsRG9ja0hlYWRzZXQiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJBdXhEaWdpdGFsIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iSGRtaSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkFubGdEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkFubGdEb2NrSGVhZHNldCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JEb2NrIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZUFuYWxvZ0RvY2siLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTcGVha2VyIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iU3BlYWtlciIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8iIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGVmYXVsdCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZW1vdGVTdWJtaXgiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBTcGVha2VyIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRm9yY2VTcGVha2VyIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkcGhvbmUiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJMaW5lIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiQWNjZXNzb3J5Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiRGV2aWNlIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGd0bERvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQXV4RGlnaXRhbCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkFubGdEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNwZWFrZXIiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvclN0cmF0ZWd5Lk1lZGlhLkFyYyIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNlbGVjdGVkIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iSGRtaUFyYyIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9Ik5vdFNlbGVjdGVkIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2VsZWN0ZWQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaV9hcmMiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTm90U2VsZWN0ZWQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaV9hcmMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvclN0cmF0ZWd5Lk1lZGlhLlNwZGlmIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2VsZWN0ZWQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJTcGRpZiIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9Ik5vdFNlbGVjdGVkIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2VsZWN0ZWQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTm90U2VsZWN0ZWQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvclN0cmF0ZWd5Lk1lZGlhLkF1eExpbmUiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTZWxlY3RlZCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkF1eExpbmUiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJOb3RTZWxlY3RlZCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNlbGVjdGVkIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImF1eF9saW5lIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9Ik5vdFNlbGVjdGVkIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImF1eF9saW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5QaG9uZS5VbnJlYWNoYWJsZURldmljZXMiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaV9hcmMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYXV4X2xpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuUGhvbmUuRGV2aWNlIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2NvQ2Fya2l0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoU2NvQ2Fya2l0Ii8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQnRTY28iLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhTY29IZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoU2NvSGVhZHNldCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZUJ0U2NvIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoU2NvIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoU2NvIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQnRTY28iLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlTm9CdEEyZHAiLz4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VCdFNjbyIvPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlTm9uZSIvPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBIZWFkcGhvbmVzIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZU5vQnRBMmRwIi8+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQnRTY28iLz4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZU5vbmUiLz4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwU3BlYWtlciI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aEEyZHBTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VOb0J0QTJkcCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRwaG9uZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IldpcmVkSGVhZHBob25lIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IldpcmVkSGVhZHNldCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JEZXZpY2UiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJVc2JEZXZpY2UiLz4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VCdFNjbyIvPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlTm9uZSIvPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkV4Y2x1ZGVzIiBWYWx1ZT0iVXNiQWNjZXNzb3J5Ii8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JBY2Nlc3NvcnkiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJVc2JBY2Nlc3NvcnkiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGd0bERvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iRGd0bERvY2tIZWFkc2V0Ii8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkhkbWkiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJIZG1pIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkFubGdEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkFubGdEb2NrSGVhZHNldCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJFYXJwaWVjZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkVhcnBpZWNlIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkxpbmUiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJMaW5lIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNwZWFrZXIiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlZmF1bHQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNjb0NhcmtpdCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhTY29IZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aFNjbyI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBIZWFkcGhvbmVzIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBTcGVha2VyIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHBob25lIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JEZXZpY2UiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiQWNjZXNzb3J5Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRndGxEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJIZG1pIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkFubGdEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJFYXJwaWVjZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJMaW5lIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNwZWFrZXIiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGVmYXVsdCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuU29uaWZpY2F0aW9uLlVucmVhY2hhYmxlRGV2aWNlcyIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkNhbGlicmF0aW9uIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9mbSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQ2FsaWJyYXRpb24iPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaV9hcmMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZGlmIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9mbSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYXV4X2xpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuU29uaWZpY2F0aW9uLlNwZWFrZXIiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTZWxlY3RlZCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlNwZWFrZXIiLz4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iRXhjbHVkZXMiIFZhbHVlPSJMaW5lIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJOb3RTZWxlY3RlZCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNlbGVjdGVkIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTm90U2VsZWN0ZWQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuU29uaWZpY2F0aW9uLkRldmljZTIiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlTm9CdEEyZHAiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwSGVhZHBob25lcyI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aEEyZHBIZWFkcGhvbmVzIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VOb0J0QTJkcCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBTcGVha2VyIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcFNwZWFrZXIiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZU5vQnRBMmRwIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2NvQ2Fya2l0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZUJ0U2NvIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhTY29DYXJraXQiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTY29IZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZUJ0U2NvIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhTY29IZWFkc2V0Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2NvIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZUJ0U2NvIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhTY28iLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRwaG9uZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IldpcmVkSGVhZHBob25lIi8+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJMaW5lIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iTGluZSIvPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iV2lyZWRIZWFkc2V0Ii8+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JEZXZpY2UiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJVc2JEZXZpY2UiLz4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkV4Y2x1ZGVzIiBWYWx1ZT0iVXNiQWNjZXNzb3J5Ii8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkFjY2Vzc29yeSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlVzYkFjY2Vzc29yeSIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRndGxEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkRndGxEb2NrSGVhZHNldCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkFubGdEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkFubGdEb2NrSGVhZHNldCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JEb2NrIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZUFuYWxvZ0RvY2siLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJFYXJwaWVjZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJFYXJwaWVjZSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9Ik5vbmUiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwSGVhZHBob25lcyI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcFNwZWFrZXIiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNjb0NhcmtpdCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2NvSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2NvIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRwaG9uZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTGluZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JEZXZpY2UiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkFjY2Vzc29yeSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGd0bERvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJBbmxnRG9ja0hlYWRzZXQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkVhcnBpZWNlIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJOb25lIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuU29uaWZpY2F0aW9uUmVzcGVjdGZ1bC5VbnJlYWNoYWJsZURldmljZXMiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ii8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaV9hcmMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYXV4X2xpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuU29uaWZpY2F0aW9uUmVzcGVjdGZ1bC5TcGVha2VycyIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNwZWFrZXJTYWZlIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iU3BlYWtlciIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iU3BlYWtlclNhZmUiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU3BlYWtlciI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlNwZWFrZXIiLz4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iRXhjbHVkZXMiIFZhbHVlPSJMaW5lIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJOb25lIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTcGVha2VyU2FmZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTcGVha2VyIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXJfc2FmZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyX3NhZmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9Ik5vbmUiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvclN0cmF0ZWd5LlNvbmlmaWNhdGlvblJlc3BlY3RmdWwuRGV2aWNlMiIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHAiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VOb0J0QTJkcCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBIZWFkcGhvbmVzIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlTm9CdEEyZHAiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aEEyZHBIZWFkcGhvbmVzIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcFNwZWFrZXIiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VOb0J0QTJkcCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcFNwZWFrZXIiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhTY29DYXJraXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQnRTY28iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aFNjb0NhcmtpdCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aFNjb0hlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQnRTY28iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aFNjb0hlYWRzZXQiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhTY28iPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQnRTY28iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aFNjbyIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHBob25lIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJXaXJlZEhlYWRwaG9uZSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkxpbmVXaGVuRm9sbG93TWVkaWFTdHJhdGVneSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJXaXJlZEhlYWRwaG9uZSIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJXaXJlZEhlYWRzZXQiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JEZXZpY2UiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkV4Y2x1ZGVzIiBWYWx1ZT0iVXNiQWNjZXNzb3J5Ii8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlVzYkRldmljZSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkFjY2Vzc29yeSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlVzYkFjY2Vzc29yeSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRndGxEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkRndGxEb2NrSGVhZHNldCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkF1eERpZ2l0YWwiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJIZG1pIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQW5sZ0RvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JEb2NrIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZUFuYWxvZ0RvY2siLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkFubGdEb2NrSGVhZHNldCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkVhcnBpZWNlIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkVhcnBpZWNlIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTGluZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJMaW5lIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwSGVhZHBob25lcyI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwU3BlYWtlciI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhTY29DYXJraXQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoU2NvSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhTY28iPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkcGhvbmUiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTGluZVdoZW5Gb2xsb3dNZWRpYVN0cmF0ZWd5Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JEZXZpY2UiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiQWNjZXNzb3J5Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRndGxEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJBdXhEaWdpdGFsIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkFubGdEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJFYXJwaWVjZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJMaW5lIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5EdG1mLlVucmVhY2hhYmxlRGV2aWNlcyIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkNhbGlicmF0aW9uIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ii8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5EdG1mLkRldmljZTIiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZW1vdGVTdWJtaXgiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iUmVtb3RlU3VibWl4Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZU5vQnRBMmRwIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhBMmRwIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VOb0J0QTJkcCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwU3BlYWtlciI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZU5vQnRBMmRwIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhBMmRwU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkZvcmNlU3BlYWtlcldoZW5Ob3RJbkNhbGwiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlNwZWFrZXIiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhTY29IZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoU2NvSGVhZHNldCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZUJ0U2NvIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoU2NvIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoU2NvIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQnRTY28iLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRwaG9uZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iV2lyZWRIZWFkcGhvbmUiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJMaW5lV2hlbkZvbGxvd2luZ01lZGlhIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkxpbmUiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IldpcmVkSGVhZHNldCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkRldmljZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iRXhjbHVkZXMiIFZhbHVlPSJVc2JBY2Nlc3NvcnkiLz4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJVc2JEZXZpY2UiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JBY2Nlc3NvcnkiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iVXNiQWNjZXNzb3J5Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGd0bERvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkRndGxEb2NrSGVhZHNldCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkhkbWkiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iSGRtaSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkFubGdEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckRvY2siIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQW5hbG9nRG9jayIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQW5sZ0RvY2tIZWFkc2V0Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRWFycGllY2UiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJFYXJwaWVjZSIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJMaW5lV2hlbkZhbGxUaHJvdWdoUGhvbmUiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJMaW5lIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNwZWFrZXIiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8iIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlNwZWFrZXIiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZW1vdGVTdWJtaXgiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwU3BlYWtlciI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkZvcmNlU3BlYWtlcldoZW5Ob3RJbkNhbGwiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhTY29IZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoU2NvIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkcGhvbmUiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJMaW5lV2hlbkZvbGxvd2luZ01lZGlhIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiRGV2aWNlIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiQWNjZXNzb3J5Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGd0bERvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iSGRtaSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkFubGdEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkVhcnBpZWNlIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTGluZVdoZW5GYWxsVGhyb3VnaFBob25lIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU3BlYWtlciI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlZmF1bHQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuRHRtZi5BcmMiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTZWxlY3RlZCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJIZG1pQXJjIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTm90U2VsZWN0ZWQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTZWxlY3RlZCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pX2FyYyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJOb3RTZWxlY3RlZCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pX2FyYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuRHRtZi5TcGRpZiIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNlbGVjdGVkIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlNwZGlmIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTm90U2VsZWN0ZWQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTZWxlY3RlZCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJOb3RTZWxlY3RlZCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuRHRtZi5BdXhMaW5lIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2VsZWN0ZWQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQXV4TGluZSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9Ik5vdFNlbGVjdGVkIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2VsZWN0ZWQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYXV4X2xpbmUiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTm90U2VsZWN0ZWQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYXV4X2xpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvclN0cmF0ZWd5LkVuZm9yY2VkQXVkaWJsZS5VbnJlYWNoYWJsZURldmljZXMiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkNhbGlicmF0aW9uIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaV9hcmMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImF1eF9saW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuRW5mb3JjZWRBdWRpYmxlLlNwZWFrZXIiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTZWxlY3RlZCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlNwZWFrZXIiLz4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yU3lzdGVtIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZVN5c3RlbUVuZm9yY2VkIi8+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkV4Y2x1ZGVzIiBWYWx1ZT0iUmVtb3RlU3VibWl4Ii8+CisgICAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlTm9CdEEyZHAiLz4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJFeGNsdWRlcyIgVmFsdWU9IkJsdWV0b290aEEyZHAiLz4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJFeGNsdWRlcyIgVmFsdWU9IkJsdWV0b290aEEyZHBIZWFkcGhvbmVzIi8+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iRXhjbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhBMmRwU3BlYWtlciIvPgorICAgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJFeGNsdWRlcyIgVmFsdWU9IlJlbW90ZVN1Ym1peCIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJFeGNsdWRlcyIgVmFsdWU9IldpcmVkSGVhZHBob25lIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkV4Y2x1ZGVzIiBWYWx1ZT0iTGluZSIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJFeGNsdWRlcyIgVmFsdWU9IldpcmVkSGVhZHNldCIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJFeGNsdWRlcyIgVmFsdWU9IlVzYkFjY2Vzc29yeSIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJFeGNsdWRlcyIgVmFsdWU9IlVzYkRldmljZSIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJFeGNsdWRlcyIgVmFsdWU9IkRndGxEb2NrSGVhZHNldCIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJFeGNsdWRlcyIgVmFsdWU9IkhkbWkiLz4KKyAgICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkV4Y2x1ZGVzIiBWYWx1ZT0iQW5sZ0RvY2tIZWFkc2V0Ii8+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckRvY2siIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlQW5hbG9nRG9jayIvPgorICAgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9Ik5vdFNlbGVjdGVkIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNlbGVjdGVkIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9Ik5vdFNlbGVjdGVkIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5FbmZvcmNlZEF1ZGlibGUuRGV2aWNlMiIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlJlbW90ZVN1Ym1peCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlJlbW90ZVN1Ym1peCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHAiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhBMmRwIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZU5vQnRBMmRwIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhBMmRwSGVhZHBob25lcyIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VOb0J0QTJkcCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBTcGVha2VyIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcFNwZWFrZXIiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlTm9CdEEyZHAiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRwaG9uZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iV2lyZWRIZWFkcGhvbmUiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJMaW5lIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJMaW5lIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJXaXJlZEhlYWRzZXQiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JBY2Nlc3NvcnkiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlVzYkFjY2Vzc29yeSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkRldmljZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iVXNiRGV2aWNlIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGd0bERvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJEZ3RsRG9ja0hlYWRzZXQiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJIZG1pIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJIZG1pIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQW5sZ0RvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckRvY2siIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQW5hbG9nRG9jayIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQW5sZ0RvY2tIZWFkc2V0Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9mbSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZW1vdGVTdWJtaXgiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHAiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBIZWFkcGhvbmVzIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwU3BlYWtlciI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9mbSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXJfc2FmZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyX3NhZmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkcGhvbmUiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkxpbmUiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9mbSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXJfc2FmZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyX3NhZmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiQWNjZXNzb3J5Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JEZXZpY2UiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRndGxEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9mbSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXJfc2FmZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyX3NhZmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iSGRtaSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9mbSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXJfc2FmZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyX3NhZmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQW5sZ0RvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuVHJhbnNtaXR0ZWRUaHJvdWdoU3BlYWtlci5VbnJlYWNoZWFibGVEZXZpY2VzIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQ2FsaWJyYXRpb24iPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXJfc2FmZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkNhbGlicmF0aW9uIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWlfYXJjIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYXV4X2xpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5UcmFuc21pdHRlZFRocm91Z2hTcGVha2VyLlNwZWFrZXIiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTZWxlY3RlZCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlNwZWFrZXIiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJOb3RTZWxlY3RlZCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNlbGVjdGVkIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTm90U2VsZWN0ZWQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuQWNjZXNzaWJpbGl0eS5VbnJlYWNoYWJsZURldmljZXMiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9mbSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ii8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWlfYXJjIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhdXhfbGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuQWNjZXNzaWJpbGl0eS5EZXZpY2UyIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iUmVtb3RlU3VibWl4Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iUmVtb3RlU3VibWl4Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlTm9CdEEyZHAiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aEEyZHAiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwSGVhZHBob25lIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VOb0J0QTJkcCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwU3BlYWtlciI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlTm9CdEEyZHAiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aEEyZHBTcGVha2VyIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRm9yY2VTcGVha2VyIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJTcGVha2VyIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkcGhvbmUiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJXaXJlZEhlYWRwaG9uZSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkxpbmUiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJMaW5lIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iV2lyZWRIZWFkc2V0Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiQWNjZXNzb3J5Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iVXNiQWNjZXNzb3J5Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiRGV2aWNlIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iVXNiRGV2aWNlIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGd0bERvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iRGd0bERvY2tIZWFkc2V0Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQXV4RGlnaXRhbCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkhkbWkiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJBbmxnRG9ja0hlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJBbmxnRG9ja0hlYWRzZXQiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yRG9jayIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VBbmFsb2dEb2NrIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU3BlYWtlciI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlNwZWFrZXIiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iUmVtb3RlU3VibWl4Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwSGVhZHBob25lIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwU3BlYWtlciI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRm9yY2VTcGVha2VyIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRwaG9uZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTGluZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JBY2Nlc3NvcnkiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkRldmljZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGd0bERvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJBdXhEaWdpdGFsIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJBbmxnRG9ja0hlYWRzZXQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNwZWFrZXIiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlZmF1bHQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5SZXJvdXRpbmcuVW5yZWFjaGFibGVEZXZpY2VzIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQ2FsaWJyYXRpb24iPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9mbSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ii8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaV9hcmMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZGlmIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhdXhfbGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXJfc2FmZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyX3NhZmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5SZXJvdXRpbmcuRGV2aWNlMiIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlJlbW90ZVN1Ym1peCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlJlbW90ZVN1Ym1peCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHAiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZU5vQnRBMmRwIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhBMmRwIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlTm9CdEEyZHAiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aEEyZHBIZWFkcGhvbmVzIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcFNwZWFrZXIiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZU5vQnRBMmRwIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhBMmRwU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkZvcmNlU3BlYWtlciI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHBob25lIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iV2lyZWRIZWFkcGhvbmUiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJMaW5lIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iTGluZSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IldpcmVkSGVhZHNldCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkFjY2Vzc29yeSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlVzYkFjY2Vzc29yeSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkRldmljZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlVzYkRldmljZSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRndGxEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkRndGxEb2NrSGVhZHNldCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkF1eERpZ2l0YWwiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJIZG1pIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQW5sZ0RvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQW5sZ0RvY2tIZWFkc2V0Ii8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckRvY2siIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQW5hbG9nRG9jayIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNwZWFrZXIiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJTcGVha2VyIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGVmYXVsdCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iUmVtb3RlU3VibWl4Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHAiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwU3BlYWtlciI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJGb3JjZVNwZWFrZXIiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkcGhvbmUiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTGluZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRzZXQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiQWNjZXNzb3J5Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkRldmljZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZ3RsRG9ja0hlYWRzZXQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQXV4RGlnaXRhbCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJBbmxnRG9ja0hlYWRzZXQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU3BlYWtlciI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJTdHJhdGVneUZvclN0cmVhbSIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkNhbGlicmF0aW9uIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3JpbmcvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ii8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ij4KKyAgICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSI+cGhvbmU8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPm1lZGlhPC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ij4KKyAgICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSI+c29uaWZpY2F0aW9uPC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPm1lZGlhPC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPnNvbmlmaWNhdGlvbjwvRW51bVBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ij4KKyAgICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSI+c29uaWZpY2F0aW9uX3Jlc3BlY3RmdWw8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5waG9uZTwvRW51bVBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPmVuZm9yY2VkX2F1ZGlibGU8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5kdG1mPC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij50cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXI8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5hY2Nlc3NpYmlsaXR5PC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5yZXJvdXRpbmc8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJTZWxlY3RlZFN0cmF0ZWd5Rm9yVXNhZ2VzLkNhbGlicmF0aW9uIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQ2FsaWJyYXRpb24iPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL3Vua25vd24vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL21lZGlhL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy92b2ljZV9jb21tdW5pY2F0aW9uX3NpZ25hbGxpbmcvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL2FsYXJtL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy9ub3RpZmljYXRpb24vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL25vdGlmaWNhdGlvbl90ZWxlcGhvbnlfcmluZ3RvbmUvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL25vdGlmaWNhdGlvbl9jb21tdW5pY2F0aW9uX3JlcXVlc3QvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL25vdGlmaWNhdGlvbl9jb21tdW5pY2F0aW9uX2luc3RhbnQvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL25vdGlmaWNhdGlvbl9jb21tdW5pY2F0aW9uX2RlbGF5ZWQvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL25vdGlmaWNhdGlvbl9ldmVudC9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvYXNzaXN0YW5jZV9uYXZpZ2F0aW9uX2d1aWRhbmNlL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy9hc3Npc3RhbmNlX3NvbmlmaWNhdGlvbi9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvZ2FtZS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ii8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy91bmtub3duL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5tZWRpYTwvRW51bVBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvbWVkaWEvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPm1lZGlhPC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5waG9uZTwvRW51bVBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvdm9pY2VfY29tbXVuaWNhdGlvbl9zaWduYWxsaW5nL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5kdG1mPC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy9hbGFybS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ij4KKyAgICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSI+c29uaWZpY2F0aW9uPC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy9ub3RpZmljYXRpb24vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPnNvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsPC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy9ub3RpZmljYXRpb25fdGVsZXBob255X3Jpbmd0b25lL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5zb25pZmljYXRpb248L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL25vdGlmaWNhdGlvbl9jb21tdW5pY2F0aW9uX3JlcXVlc3QvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPnNvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsPC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy9ub3RpZmljYXRpb25fY29tbXVuaWNhdGlvbl9pbnN0YW50L2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5zb25pZmljYXRpb25fcmVzcGVjdGZ1bDwvRW51bVBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvbm90aWZpY2F0aW9uX2NvbW11bmljYXRpb25fZGVsYXllZC9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ij4KKyAgICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSI+c29uaWZpY2F0aW9uX3Jlc3BlY3RmdWw8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL25vdGlmaWNhdGlvbl9ldmVudC9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ij4KKyAgICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSI+c29uaWZpY2F0aW9uX3Jlc3BlY3RmdWw8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL2Fzc2lzdGFuY2VfbmF2aWdhdGlvbl9ndWlkYW5jZS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ij4KKyAgICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSI+bWVkaWE8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL2Fzc2lzdGFuY2Vfc29uaWZpY2F0aW9uL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5tZWRpYTwvRW51bVBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvZ2FtZS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ij4KKyAgICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSI+bWVkaWE8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJTZWxlY3RlZFN0cmF0ZWd5Rm9yVXNhZ2VzLkFzc2lzdGFuY2VBY2Nlc3NpYmlsaXR5IiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU29uaWZpY2F0aW9uIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iUmluZ1RvbmUiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJQaG9uZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQWNjZXNzaWJpbGl0eSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvYXNzaXN0YW5jZV9hY2Nlc3NpYmlsaXR5L2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNvbmlmaWNhdGlvbiI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy9hc3Npc3RhbmNlX2FjY2Vzc2liaWxpdHkvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPnNvbmlmaWNhdGlvbjwvRW51bVBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iUGhvbmUiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvYXNzaXN0YW5jZV9hY2Nlc3NpYmlsaXR5L2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5waG9uZTwvRW51bVBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQWNjZXNzaWJpbGl0eSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy9hc3Npc3RhbmNlX2FjY2Vzc2liaWxpdHkvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPmFjY2Vzc2liaWxpdHk8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JJbnB1dFNvdXJjZS5DYWxpYnJhdGlvbiIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkNhbGlicmF0aW9uIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2luIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9jb21tdW5pY2F0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbWJpZW50Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9oZG1pIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcngiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JhY2tfbWljIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbmxnX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9hY2Nlc3NvcnkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2ZtX3R1bmVyIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90dl90dW5lciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svc3BkaWYiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xvb3BiYWNrIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2luIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2NvbW11bmljYXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW1iaWVudCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9oZG1pIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9hY2Nlc3NvcnkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZm1fdHVuZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdHZfdHVuZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zcGRpZiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9sb29wYmFjayIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2luIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svY29tbXVuaWNhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FtYmllbnQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9oZG1pIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9hY2Nlc3NvcnkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZm1fdHVuZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90dl90dW5lciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xpbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zcGRpZiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbG9vcGJhY2siLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2luIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9jb21tdW5pY2F0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbWJpZW50Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9oZG1pIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svcmVtb3RlX3N1Ym1peCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfYWNjZXNzb3J5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdHZfdHVuZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xpbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3NwZGlmIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbG9vcGJhY2siLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaW4iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svY29tbXVuaWNhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbWJpZW50Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2hkbWkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svcmVtb3RlX3N1Ym1peCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbmxnX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfYWNjZXNzb3J5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZm1fdHVuZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdHZfdHVuZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zcGRpZiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9sb29wYmFjayIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9pbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9jb21tdW5pY2F0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FtYmllbnQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaGRtaSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcngiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svcmVtb3RlX3N1Ym1peCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbmxnX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfYWNjZXNzb3J5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZm1fdHVuZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdHZfdHVuZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zcGRpZiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9sb29wYmFjayIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2luIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svY29tbXVuaWNhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FtYmllbnQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9oZG1pIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdGVsZXBob255X3J4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9hY2Nlc3NvcnkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3R2X3R1bmVyIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3NwZGlmIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9sb29wYmFjayIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaW4iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2NvbW11bmljYXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FtYmllbnQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2hkbWkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svcmVtb3RlX3N1Ym1peCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfYWNjZXNzb3J5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdHZfdHVuZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xpbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3NwZGlmIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbG9vcGJhY2siLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2luIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9jb21tdW5pY2F0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbWJpZW50Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9oZG1pIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcngiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JhY2tfbWljIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbmxnX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9hY2Nlc3NvcnkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2ZtX3R1bmVyIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90dl90dW5lciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svc3BkaWYiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9sb29wYmFjayIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaW4iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2NvbW11bmljYXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FtYmllbnQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2hkbWkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3JlbW90ZV9zdWJtaXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2FjY2Vzc29yeSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZm1fdHVuZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3R2X3R1bmVyIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9saW5lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zcGRpZiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xvb3BiYWNrIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaW4iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9jb21tdW5pY2F0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW1iaWVudCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2hkbWkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcngiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3JlbW90ZV9zdWJtaXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbmxnX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2FjY2Vzc29yeSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3R2X3R1bmVyIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3NwZGlmIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9sb29wYmFjayIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQ2FsaWJyYXRpb24iPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9pbiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJpbiI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2NvbW11bmljYXRpb24iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iY29tbXVuaWNhdGlvbiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FtYmllbnQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW1iaWVudCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfcngiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJiYWNrX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbV90dW5lciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3R2X3R1bmVyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InR2X3R1bmVyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svc3BkaWYiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9sb29wYmFjayI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsb29wYmFjayI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaW4iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaW4iPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2NvbW11bmljYXRpb24iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iY29tbXVuaWNhdGlvbiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW1iaWVudCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbWJpZW50Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfcngiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JhY2tfbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJhY2tfbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbV90dW5lciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdHZfdHVuZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idHZfdHVuZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svc3BkaWYiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xvb3BiYWNrIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Imxvb3BiYWNrIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2luIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImluIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2NvbW11bmljYXRpb24iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iY29tbXVuaWNhdGlvbiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbWJpZW50Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFtYmllbnQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JhY2tfbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJhY2tfbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2ZtX3R1bmVyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtX3R1bmVyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3R2X3R1bmVyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InR2X3R1bmVyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zcGRpZiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9sb29wYmFjayI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsb29wYmFjayI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2luIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImluIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svY29tbXVuaWNhdGlvbiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJjb21tdW5pY2F0aW9uIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW1iaWVudCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbWJpZW50Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmFja19taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZm1fdHVuZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm1fdHVuZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90dl90dW5lciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0dl90dW5lciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3NwZGlmIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZGlmIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9sb29wYmFjayI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsb29wYmFjayI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaW4iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaW4iPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2NvbW11bmljYXRpb24iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iY29tbXVuaWNhdGlvbiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW1iaWVudCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbWJpZW50Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JhY2tfbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJhY2tfbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2ZtX3R1bmVyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtX3R1bmVyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90dl90dW5lciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0dl90dW5lciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zcGRpZiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xvb3BiYWNrIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Imxvb3BiYWNrIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9pbiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJpbiI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svY29tbXVuaWNhdGlvbiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJjb21tdW5pY2F0aW9uIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbWJpZW50Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFtYmllbnQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcngiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3J4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2ZtX3R1bmVyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtX3R1bmVyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90dl90dW5lciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0dl90dW5lciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zcGRpZiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xvb3BiYWNrIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Imxvb3BiYWNrIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2luIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImluIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2NvbW11bmljYXRpb24iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iY29tbXVuaWNhdGlvbiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbWJpZW50Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFtYmllbnQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfcngiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmFja19taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbV90dW5lciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90dl90dW5lciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0dl90dW5lciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svc3BkaWYiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbG9vcGJhY2siPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibG9vcGJhY2siPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9pbiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJpbiI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2NvbW11bmljYXRpb24iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iY29tbXVuaWNhdGlvbiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FtYmllbnQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW1iaWVudCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfcngiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZm1fdHVuZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm1fdHVuZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90dl90dW5lciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0dl90dW5lciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3NwZGlmIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZGlmIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9sb29wYmFjayI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsb29wYmFjayI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2luIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImluIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svY29tbXVuaWNhdGlvbiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJjb21tdW5pY2F0aW9uIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW1iaWVudCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbWJpZW50Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdGVsZXBob255X3J4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV9yeCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JhY2tfbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJhY2tfbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2ZtX3R1bmVyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtX3R1bmVyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdHZfdHVuZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idHZfdHVuZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zcGRpZiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbG9vcGJhY2siPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibG9vcGJhY2siPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9pbiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJpbiI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2NvbW11bmljYXRpb24iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iY29tbXVuaWNhdGlvbiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FtYmllbnQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW1iaWVudCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfcngiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJiYWNrX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbV90dW5lciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3R2X3R1bmVyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InR2X3R1bmVyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svc3BkaWYiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xvb3BiYWNrIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Imxvb3BiYWNrIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2luIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImluIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2NvbW11bmljYXRpb24iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iY29tbXVuaWNhdGlvbiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbWJpZW50Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFtYmllbnQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdGVsZXBob255X3J4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV9yeCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmFja19taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZm1fdHVuZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm1fdHVuZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdHZfdHVuZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idHZfdHVuZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3NwZGlmIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZGlmIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xvb3BiYWNrIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Imxvb3BiYWNrIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JJbnB1dFNvdXJjZS5EZWZhdWx0QW5kTWljIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQTJkcCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNjbyI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoU2NvSGVhZHNldCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JSZWNvcmQiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQnRTY28iLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVJbnB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IldpcmVkSGVhZHNldCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkRldmljZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iVXNiRGV2aWNlIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQnVpbHRpbk1pYyI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQnVpbHRpbk1pYyIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlZmF1bHQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQTJkcCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNjbyI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkRldmljZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJ1aWx0aW5NaWMiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvcklucHV0U291cmNlLlZvaWNlVXBsaW5rQW5kVm9pY2VEb3dubGlua0FuZFZvaWNlQ2FsbCIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlZvaWNlQ2FsbCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iVGVsZXBob255UngiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcngiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcngiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlZvaWNlQ2FsbCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcngiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3J4Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdGVsZXBob255X3J4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV9yeCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdGVsZXBob255X3J4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV9yeCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfcngiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcngiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3J4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcngiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3J4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JJbnB1dFNvdXJjZS5DYW1jb3JkZXIiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCYWNrTWljIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlSW5wdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCYWNrTWljIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQnVpbHRpbk1pYyI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQnVpbHRpbk1pYyIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlZmF1bHQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmFja01pYyI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmFja19taWMiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJ1aWx0aW5NaWMiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JhY2tfbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJhY2tfbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJiYWNrX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvcklucHV0U291cmNlLlZvaWNlUmVjb2duaXRpb25BbmRIb3R3b3JkIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2NvSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yUmVjb3JkIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZUJ0U2NvIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVJbnB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aFNjb0hlYWRzZXQiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVJbnB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IldpcmVkSGVhZHNldCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkRldmljZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iVXNiRGV2aWNlIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQnVpbHRpbk1pYyI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQnVpbHRpbk1pYyIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlZmF1bHQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNjb0hlYWRzZXQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiRGV2aWNlIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCdWlsdGluTWljIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9ySW5wdXRTb3VyY2UuVm9pY2VDb21tdW5pY2F0aW9uIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2NvSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VCdFNjbyIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlSW5wdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhTY29IZWFkc2V0Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZU5vbmUiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iV2lyZWRIZWFkc2V0Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiRGV2aWNlIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZU5vbmUiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iVXNiRGV2aWNlIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQnVpbHRpbk1pYyI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQnVpbHRpbk1pYyIvPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZU5vbmUiLz4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkV4Y2x1ZGVzIiBWYWx1ZT0iQmFja01pYyIvPgorICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmFja01pYyI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVJbnB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJhY2tNaWMiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JhY2tfbWljIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTY29IZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmFja19taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmFja19taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiRGV2aWNlIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmFja19taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQnVpbHRpbk1pYyI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JhY2tfbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJhY2tfbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJhY2tNaWMiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJiYWNrX21pYyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmFja19taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvcklucHV0U291cmNlLlJlbW90ZVN1Ym1peCIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlJlbW90ZVN1Ym1peCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iUmVtb3RlU3VibWl4Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGVmYXVsdCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ii8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZW1vdGVTdWJtaXgiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGVmYXVsdCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9ySW5wdXRTb3VyY2UuRm1UdW5lciIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkZtVHVuZXIiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVJbnB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkZtVHVuZXIiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRm1UdW5lciI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbV90dW5lciI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2ZtX3R1bmVyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtX3R1bmVyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJWb2x1bWVQcm9maWxlc0ZvclN0cmVhbS5DYWxpYnJhdGlvbiIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkNhbGlicmF0aW9uIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4wPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjQuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTIuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0yNC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xNi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi04LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4wPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI0LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xMi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi02LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi01OC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTQwLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTcuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTMwLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0yNi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjIuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xOC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0yNC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTEyLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI0LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTEyLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi02LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjEuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTEwLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDkuNTAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMzMuNTAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTcuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTM1LjY5OTIxODc1PC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI2LjEwMTU2MjUwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTEzLjE5OTIxODc1PC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTQ5LjUwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMzMuNTAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xNy4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTU4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0yNy4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xMC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi00MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE3LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0zNC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTExLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi01OC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE3LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTU4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi00MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTcuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTQ5LjUwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMzMuNTAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xNy4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTM1LjY5OTIxODc1PC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjYuMTAxNTYyNTA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xMy4xOTkyMTg3NTwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDkuNTAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTMzLjUwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xNy4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi01OC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI3LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDkuNTAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTMzLjUwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xNy4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0zNS42OTkyMTg3NTwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjYuMTAxNTYyNTA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTEzLjE5OTIxODc1PC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDkuNTAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMzMuNTAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTcuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTU4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTQwLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI3LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xMC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI0LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTEyLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi02LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4wPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjQuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tOC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0yNC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTIuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi00MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE3LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTMwLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI2LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTIyLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xOC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI0LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTEyLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi02LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0yNC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTIuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi00MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI3LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTEwLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTk2LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTk2LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjI8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTk2LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tOTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tOTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTY4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0zNC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTk2LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tOTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjI8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi05Ni4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tOTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi05Ni4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTk2LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4yPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tOTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTk2LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTcuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTU2LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTM0LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTExLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTU4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xNy4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTU4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xNy4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4yPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4yPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjI8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjI8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4yPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4yPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4yPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJWb2x1bWVQcm9maWxlc0ZvclN0cmVhbS5EdG1mIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iSW5DYWxsIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJPdXRPZkNhbGwiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkluQ2FsbCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMzAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjIuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjQuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTIuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI0LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xMi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi02LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi01OC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTQwLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjcuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9Ik91dE9mQ2FsbCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4wPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjQuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTIuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0yNC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xNi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi04LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4wPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI0LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xMi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi02LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi01OC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTQwLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTcuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+Cis8L0NvbmZpZ3VyYWJsZURvbWFpbnM+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3JfaW5wdXRfc291cmNlLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9pbnB1dF9zb3VyY2UucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YmMzNzAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3JfaW5wdXRfc291cmNlLnBmdwpAQCAtMCwwICsxLDUxNSBAQAorc3VwRG9tYWluOiBEZXZpY2VGb3JJbnB1dFNvdXJjZQorCWRvbWFpbjogQ2FsaWJyYXRpb24KKwkJY29uZjogQ2FsaWJyYXRpb24KKwkJCSMKKwkJCSMgTm90ZSB0aGF0IEFMTCBpbnB1dCBkZXZpY2VzIG11c3QgaGF2ZSB0aGUgc2lnbiBiaXQgc2V0IHRvIDEuCisJCQkjIEFzIHRoZSBkZXZpY2VzIGlzIGEgbWFzaywgdXNlIHRoZSAiaW4iIGJpdCBhcyBhIGRpcmVjdGlvbiBpbmRpY2F0b3IuCisJCQkjCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJaW4gPSAxCisJCQkJY29tbXVuaWNhdGlvbiA9IDAKKwkJCQlhbWJpZW50ID0gMAorCQkJCWhkbWkgPSAwCisJCQkJdGVsZXBob255X3J4ID0gMAorCQkJCWJhY2tfbWljID0gMAorCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQlmbV90dW5lciA9IDAKKwkJCQl0dl90dW5lciA9IDAKKwkJCQlsaW5lID0gMAorCQkJCXNwZGlmID0gMAorCQkJCWxvb3BiYWNrID0gMAorCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJaW4gPSAxCisJCQkJY29tbXVuaWNhdGlvbiA9IDAKKwkJCQlhbWJpZW50ID0gMAorCQkJCWhkbWkgPSAwCisJCQkJdGVsZXBob255X3J4ID0gMAorCQkJCWJhY2tfbWljID0gMAorCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQlmbV90dW5lciA9IDAKKwkJCQl0dl90dW5lciA9IDAKKwkJCQlsaW5lID0gMAorCQkJCXNwZGlmID0gMAorCQkJCWxvb3BiYWNrID0gMAorCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQlpbiA9IDEKKwkJCQljb21tdW5pY2F0aW9uID0gMAorCQkJCWFtYmllbnQgPSAwCisJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJaGRtaSA9IDAKKwkJCQliYWNrX21pYyA9IDAKKwkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJdXNiX2RldmljZSA9IDAKKwkJCQlmbV90dW5lciA9IDAKKwkJCQl0dl90dW5lciA9IDAKKwkJCQlsaW5lID0gMAorCQkJCXNwZGlmID0gMAorCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCWxvb3BiYWNrID0gMAorCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCWluID0gMQorCQkJCWNvbW11bmljYXRpb24gPSAwCisJCQkJYW1iaWVudCA9IDAKKwkJCQlidWlsdGluX21pYyA9IDAKKwkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQloZG1pID0gMAorCQkJCWJhY2tfbWljID0gMAorCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQl1c2JfZGV2aWNlID0gMAorCQkJCWZtX3R1bmVyID0gMAorCQkJCXR2X3R1bmVyID0gMAorCQkJCWxpbmUgPSAwCisJCQkJc3BkaWYgPSAwCisJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJbG9vcGJhY2sgPSAwCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQlpbiA9IDEKKwkJCQljb21tdW5pY2F0aW9uID0gMAorCQkJCWFtYmllbnQgPSAwCisJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJaGRtaSA9IDAKKwkJCQliYWNrX21pYyA9IDAKKwkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJdXNiX2RldmljZSA9IDAKKwkJCQlmbV90dW5lciA9IDAKKwkJCQl0dl90dW5lciA9IDAKKwkJCQlsaW5lID0gMAorCQkJCXNwZGlmID0gMAorCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCWxvb3BiYWNrID0gMAorCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJaW4gPSAxCisJCQkJY29tbXVuaWNhdGlvbiA9IDAKKwkJCQlhbWJpZW50ID0gMAorCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCWhkbWkgPSAwCisJCQkJdGVsZXBob255X3J4ID0gMAorCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQl1c2JfZGV2aWNlID0gMAorCQkJCWZtX3R1bmVyID0gMAorCQkJCXR2X3R1bmVyID0gMAorCQkJCWxpbmUgPSAwCisJCQkJc3BkaWYgPSAwCisJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJbG9vcGJhY2sgPSAwCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCWluID0gMQorCQkJCWNvbW11bmljYXRpb24gPSAwCisJCQkJYW1iaWVudCA9IDAKKwkJCQloZG1pID0gMAorCQkJCXRlbGVwaG9ueV9yeCA9IDAKKwkJCQliYWNrX21pYyA9IDAKKwkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJZm1fdHVuZXIgPSAwCisJCQkJdHZfdHVuZXIgPSAwCisJCQkJbGluZSA9IDAKKwkJCQlzcGRpZiA9IDAKKwkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQlsb29wYmFjayA9IDAKKwkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQlpbiA9IDEKKwkJCQljb21tdW5pY2F0aW9uID0gMAorCQkJCWFtYmllbnQgPSAwCisJCQkJaGRtaSA9IDAKKwkJCQl0ZWxlcGhvbnlfcnggPSAwCisJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCWZtX3R1bmVyID0gMAorCQkJCXR2X3R1bmVyID0gMAorCQkJCWxpbmUgPSAwCisJCQkJc3BkaWYgPSAwCisJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJbG9vcGJhY2sgPSAwCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJaW4gPSAxCisJCQkJY29tbXVuaWNhdGlvbiA9IDAKKwkJCQlhbWJpZW50ID0gMAorCQkJCWJ1aWx0aW5fbWljID0gMAorCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCWhkbWkgPSAwCisJCQkJdGVsZXBob255X3J4ID0gMAorCQkJCWJhY2tfbWljID0gMAorCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJdXNiX2RldmljZSA9IDAKKwkJCQlmbV90dW5lciA9IDAKKwkJCQl0dl90dW5lciA9IDAKKwkJCQlsaW5lID0gMAorCQkJCXNwZGlmID0gMAorCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCWxvb3BiYWNrID0gMAorCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCWluID0gMQorCQkJCWNvbW11bmljYXRpb24gPSAwCisJCQkJYW1iaWVudCA9IDAKKwkJCQloZG1pID0gMAorCQkJCXRlbGVwaG9ueV9yeCA9IDAKKwkJCQliYWNrX21pYyA9IDAKKwkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJZm1fdHVuZXIgPSAwCisJCQkJdHZfdHVuZXIgPSAwCisJCQkJbGluZSA9IDAKKwkJCQlzcGRpZiA9IDAKKwkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQlsb29wYmFjayA9IDAKKwkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJaW4gPSAxCisJCQkJY29tbXVuaWNhdGlvbiA9IDAKKwkJCQlhbWJpZW50ID0gMAorCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQloZG1pID0gMAorCQkJCXRlbGVwaG9ueV9yeCA9IDAKKwkJCQlidWlsdGluX21pYyA9IDAKKwkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCWJhY2tfbWljID0gMAorCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQl1c2JfZGV2aWNlID0gMAorCQkJCWZtX3R1bmVyID0gMAorCQkJCXR2X3R1bmVyID0gMAorCQkJCWxpbmUgPSAwCisJCQkJc3BkaWYgPSAwCisJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJbG9vcGJhY2sgPSAwCisKKwlkb21haW46IERlZmF1bHRBbmRNaWMKKwkJY29uZjogQTJkcAorCQkJQXZhaWxhYmxlSW5wdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKKworCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzCisJCQkJY29tcG9uZW50OiBkZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlidWlsdGluX21pYyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCWNvbXBvbmVudDogbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlidWlsdGluX21pYyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCisJCWNvbmY6IFNjbworCQkJQXZhaWxhYmxlSW5wdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCUZvcmNlVXNlRm9yUmVjb3JkIElzIEZvcmNlQnRTY28KKworCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzCisJCQkJY29tcG9uZW50OiBkZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlidWlsdGluX21pYyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMQorCQkJCWNvbXBvbmVudDogbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlidWlsdGluX21pYyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMQorCisJCWNvbmY6IFdpcmVkSGVhZHNldAorCQkJQXZhaWxhYmxlSW5wdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAorCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMKKwkJCQljb21wb25lbnQ6IGRlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay8KKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWJ1aWx0aW5fbWljID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJY29tcG9uZW50OiBtaWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay8KKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWJ1aWx0aW5fbWljID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisKKwkJY29uZjogVXNiRGV2aWNlCisJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCisKKwkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcworCQkJCWNvbXBvbmVudDogZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrLworCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQljb21wb25lbnQ6IG1pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrLworCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKworCQljb25mOiBCdWlsdGluTWljCisJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgQnVpbHRpbk1pYworCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMKKwkJCQljb21wb25lbnQ6IGRlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay8KKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWJ1aWx0aW5fbWljID0gMQorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJY29tcG9uZW50OiBtaWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay8KKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWJ1aWx0aW5fbWljID0gMQorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisKKwkJY29uZjogRGVmYXVsdAorCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzCisJCQkJY29tcG9uZW50OiBkZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlidWlsdGluX21pYyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCWNvbXBvbmVudDogbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlidWlsdGluX21pYyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCisJZG9tYWluOiBWb2ljZVVwbGlua0FuZFZvaWNlRG93bmxpbmtBbmRWb2ljZUNhbGwKKwkJY29uZjogVm9pY2VDYWxsCisJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgVGVsZXBob255UngKKworCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzCisJCQkJdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcnggPSAxCisJCQkJdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCA9IDEKKwkJCQl2b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcnggPSAxCisKKwkJY29uZjogRGVmYXVsdAorCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzCisJCQkJdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcnggPSAwCisJCQkJdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCA9IDAKKwkJCQl2b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcnggPSAwCisKKwlkb21haW46IENhbWNvcmRlcgorCQljb25mOiBCYWNrTWljCisJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgQmFja01pYworCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQliYWNrX21pYyA9IDEKKwkJCQlidWlsdGluX21pYyA9IDAKKworCQljb25mOiBCdWlsdGluTWljCisJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgQnVpbHRpbk1pYworCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQliYWNrX21pYyA9IDAKKwkJCQlidWlsdGluX21pYyA9IDEKKworCQljb25mOiBEZWZhdWx0CisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQliYWNrX21pYyA9IDAKKwkJCQlidWlsdGluX21pYyA9IDAKKworCWRvbWFpbjogVm9pY2VSZWNvZ25pdGlvbkFuZEhvdHdvcmQKKwkJY29uZjogU2NvSGVhZHNldAorCQkJRm9yY2VVc2VGb3JSZWNvcmQgSXMgRm9yY2VCdFNjbworCQkJQXZhaWxhYmxlSW5wdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKKworCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzCisJCQkJY29tcG9uZW50OiB2b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJY29tcG9uZW50OiBob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlidWlsdGluX21pYyA9IDAKKworCQljb25mOiBXaXJlZEhlYWRzZXQKKwkJCUF2YWlsYWJsZUlucHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKKworCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzCisJCQkJY29tcG9uZW50OiB2b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJY29tcG9uZW50OiBob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlidWlsdGluX21pYyA9IDAKKworCQljb25mOiBVc2JEZXZpY2UKKwkJCUF2YWlsYWJsZUlucHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKKworCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzCisJCQkJY29tcG9uZW50OiB2b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJY29tcG9uZW50OiBob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQlidWlsdGluX21pYyA9IDAKKworCQljb25mOiBCdWlsdGluTWljCisJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgQnVpbHRpbk1pYworCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMKKwkJCQljb21wb25lbnQ6IHZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlidWlsdGluX21pYyA9IDEKKwkJCQljb21wb25lbnQ6IGhvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWJ1aWx0aW5fbWljID0gMQorCisJCWNvbmY6IERlZmF1bHQKKwkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcworCQkJCWNvbXBvbmVudDogdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWJ1aWx0aW5fbWljID0gMAorCQkJCWNvbXBvbmVudDogaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJYnVpbHRpbl9taWMgPSAwCisKKwlkb21haW46IFZvaWNlQ29tbXVuaWNhdGlvbgorCQljb25mOiBTY29IZWFkc2V0CisJCQkjCisJCQkjIFNDTyBkZXZpY2UgbWF5IGJlIHJlcXVlc3RlZCBidXQgbm8gU0NPIGRldmljZSBpcyBhdmFpbGFibGUKKwkJCSMKKwkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvSGVhZHNldAorCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMQorCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJdXNiX2RldmljZSA9IDAKKwkJCQlidWlsdGluX21pYyA9IDAKKwkJCQliYWNrX21pYyA9IDAKKworCQljb25mOiBXaXJlZEhlYWRzZXQKKwkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZU5vbmUKKwkJCUF2YWlsYWJsZUlucHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKKworCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQl3aXJlZF9oZWFkc2V0ID0gMQorCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJYmFja19taWMgPSAwCisKKwkJY29uZjogVXNiRGV2aWNlCisJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VOb25lCisJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCisKKwkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQl1c2JfZGV2aWNlID0gMQorCQkJCWJ1aWx0aW5fbWljID0gMAorCQkJCWJhY2tfbWljID0gMAorCisJCWNvbmY6IEJ1aWx0aW5NaWMKKwkJCUF2YWlsYWJsZUlucHV0RGV2aWNlcyBJbmNsdWRlcyBCdWlsdGluTWljCisJCQlBTlkKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VOb25lCisJCQkJQUxMCisJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKwkJCQkJQXZhaWxhYmxlSW5wdXREZXZpY2VzIEV4Y2x1ZGVzIEJhY2tNaWMKKworCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJYnVpbHRpbl9taWMgPSAxCisJCQkJYmFja19taWMgPSAwCisKKwkJY29uZjogQmFja01pYworCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgorCQkJQXZhaWxhYmxlSW5wdXREZXZpY2VzIEluY2x1ZGVzIEJhY2tNaWMKKworCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJYmFja19taWMgPSAxCisKKwkJY29uZjogRGVmYXVsdAorCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJYmFja19taWMgPSAwCisKKwlkb21haW46IFJlbW90ZVN1Ym1peAorCQljb25mOiBSZW1vdGVTdWJtaXgKKwkJCUF2YWlsYWJsZUlucHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKKworCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCXJlbW90ZV9zdWJtaXggPSAxCisKKwkJY29uZjogRGVmYXVsdAorCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCXJlbW90ZV9zdWJtaXggPSAwCisKKwlkb21haW46IEZtVHVuZXIKKwkJY29uZjogRm1UdW5lcgorCQkJQXZhaWxhYmxlSW5wdXREZXZpY2VzIEluY2x1ZGVzIEZtVHVuZXIKKworCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQlmbV90dW5lciA9IDEKKworCQljb25mOiBEZWZhdWx0CisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCWZtX3R1bmVyID0gMAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfYWNjZXNzaWJpbGl0eS5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfYWNjZXNzaWJpbGl0eS5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThhYjMzYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9hY2Nlc3NpYmlsaXR5LnBmdwpAQCAtMCwwICsxLDMwMiBAQAorc3VwRG9tYWluOiBEZXZpY2VGb3JTdHJhdGVneQorCisJc3VwRG9tYWluOiBBY2Nlc3NpYmlsaXR5CisJCSMKKwkJIyBARklYTUU6IFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkgZm9sbG93cyBTVFJBVEVHWV9NRURJQSBmb3Igbm93CisJCSMKKwkJIyBARklYTUU6IEhvdyB0byBkaXNhYmxlIEhETUkgaWYgIWF1ZGlvX2lzX2xpbmVhcl9wY20gb3RoZXIgdGhhbiBwcm9ncmFtbWF0aWNhbGx5Pz8/CisJCSMKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IENhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCisJCWRvbWFpbjogRGV2aWNlMgorCQkJY29uZjogUmVtb3RlU3VibWl4CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZQorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAxCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBGb3JjZVNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzIEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHBob25lCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMQorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IExpbmUKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDEKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IFVzYkFjY2Vzc29yeQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDEKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogVXNiRGV2aWNlCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEF1eERpZ2l0YWwKKwkJCQkjCisJCQkJIyBEbyBub3Qgcm91dGUgYWNjZXNzaWJpbGl0eSBwcm9tcHRzIHRvIGEgZGlnaXRhbCBvdXRwdXQgY3VycmVudGx5IGNvbmZpZ3VyZWQgd2l0aCBhCisJCQkJIyBjb21wcmVzc2VkIGZvcm1hdCBhcyB0aGV5IHdvdWxkIGxpa2VseSBub3QgYmUgbWl4ZWQgYW5kIGRyb3BwZWQuCisJCQkJIworCQkJCSMgQFRPRE8gSG93IHRvIHRyYW5zbGF0ZSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbig/Pz8pCisJCQkJIyBkZXNjLT5pc0FjdGl2ZSgpICYmICFhdWRpb19pc19saW5lYXJfcGNtKGRlc2MtPm1Gb3JtYXQpICYmIGRldmljZXMgIT0gQVVESU9fREVWSUNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDEKKworCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKwkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9kdG1mLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9kdG1mLnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTI3M2IyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2R0bWYucGZ3CkBAIC0wLDAgKzEsNjM3IEBACitzdXBEb21haW46IERldmljZUZvclN0cmF0ZWd5CisKKwlzdXBEb21haW46IER0bWYKKworCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogQ2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWZtID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCisJCWRvbWFpbjogRGV2aWNlMgorCQkJY29uZjogUmVtb3RlU3VibWl4CisJCQkJIworCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFJlbW90ZVN1Ym1peAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMQorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcAorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEZvcmNlU3BlYWtlcldoZW5Ob3RJbkNhbGwKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXMgRm9yY2VTcGVha2VyCisJCQkJRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8gSXNOb3QgRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAxCisKKwkJCWNvbmY6IEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCQkjCisJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvCisJCQkJIworCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMQorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IExpbmVXaGVuRm9sbG93aW5nTWVkaWEKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDEKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkc2V0CisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkjCisJCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogVXNiRGV2aWNlCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkjCisJCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMgTWVkaWEgc3RyYXRlZ3kgaW52ZXJ0cyB0aGUgcHJpb3JpdHkgb2YgVVNCIGRldmljZSB2cyBhY2Nlc3NvcnkKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAxCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogVXNiQWNjZXNzb3J5CisJCQkJIworCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBVU0IgYWNjZXNzb3J5IG5vdCByZWFjaGFibGUgaW4gY2FsbAorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgTWVkaWEgc3RyYXRlZ3kgaW52ZXJ0cyB0aGUgcHJpb3JpdHkgb2YgVVNCIGRldmljZSB2cyBhY2Nlc3NvcnkKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDEKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKKwkJCQkjCisJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IERndGxEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBIZG1pCisJCQkJIworCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBIZG1pIG5vdCByZWFjaGFibGUgaW4gY2FsbAorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAxCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKKwkJCQkjCisJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IEFubGdEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5CisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEVhcnBpZWNlCisJCQkJIworCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBFYXJwaWVjZQorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAxCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IExpbmVXaGVuRmFsbFRocm91Z2hQaG9uZQorCQkJCSMKKwkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAxCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8gSXNOb3QgRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCWRvbWFpbjogQXJjCisJCQkjCisJCQkjIERUTUYgc3RyYXRlZ3kgZm9sbG93cyBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJIyB0aGVzZSBmb2xsb3dpbmcgZG9tYWlucyBjb25zaXN0cyBpbiBkZXZpY2UocykgdGhhdCBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMKKwkJCSMgZS5nLiBBUkMsIFNQRElGLCBBVVhfTElORQorCQkJIworCQkJY29uZjogU2VsZWN0ZWQKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pQXJjCisKKwkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjID0gMAorCisJCWRvbWFpbjogU3BkaWYKKwkJCSMKKwkJCSMgRFRNRiBzdHJhdGVneSBmb2xsb3dzIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkjIHRoZXNlIGZvbGxvd2luZyBkb21haW5zIGNvbnNpc3RzIGluIGRldmljZShzKSB0aGF0IGNhbiBjby1leGlzdCB3aXRoIG90aGVycworCQkJIyBlLmcuIEFSQywgU1BESUYsIEFVWF9MSU5FCisJCQkjCisJCQljb25mOiBTZWxlY3RlZAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZGlmCisKKwkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmID0gMAorCisJCWRvbWFpbjogQXV4TGluZQorCQkJIworCQkJIyBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCisJCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKKwkJCSMKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQXV4TGluZQorCisJCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lID0gMQorCisJCQljb25mOiBOb3RTZWxlY3RlZAorCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSA9IDAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9lbmZvcmNlZF9hdWRpYmxlLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9lbmZvcmNlZF9hdWRpYmxlLnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzE0NzQzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2VuZm9yY2VkX2F1ZGlibGUucGZ3CkBAIC0wLDAgKzEsMzU4IEBACitzdXBEb21haW46IERldmljZUZvclN0cmF0ZWd5CisKKwlzdXBEb21haW46IEVuZm9yY2VkQXVkaWJsZQorCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBDYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJIyBubyBlbmZvcmNlZF9hdWRpYmxlIG9uIHJlbW90ZSBzdWJtaXggKGUuZy4gV0ZEKQorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisKKwkJZG9tYWluOiBTcGVha2VyCisJCQljb25mOiBTZWxlY3RlZAorCQkJCSMKKwkJCQkjIHN0cmF0ZWd5IFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUgdXNlcyBzYW1lIHJvdXRpbmcgcG9saWN5IGFzIFNUUkFURUdZX1NPTklGSUNBVElPTgorCQkJCSMgZXhjZXB0OgorCQkJCSMgICAgLSB3aGVuIGluIGNhbGwgd2hlcmUgaXQgZG9lc24ndCBkZWZhdWx0IHRvIFNUUkFURUdZX1BIT05FIGJlaGF2aW9yCisJCQkJIyAgICAtIGluIGNvdW50cmllcyB3aGVyZSBub3QgZW5mb3JjZWQgaW4gd2hpY2ggY2FzZSBpdCBmb2xsb3dzIFNUUkFURUdZX01FRElBCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCUFOWQorCQkJCQlGb3JjZVVzZUZvclN5c3RlbSBJcyBGb3JjZVN5c3RlbUVuZm9yY2VkCisJCQkJCUFMTAorCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgUmVtb3RlU3VibWl4CisJCQkJCQlBTlkKKwkJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIEJsdWV0b290aEEyZHAKKwkJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisJCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCQkjCisJCQkJCSMgU3BlYWtlciBpcyBhbHNvIHRoZSBmYWxsYmFjayBkZXZpY2UgaWYgYW55IG9mIHRoZSBkZXZpY2UgZnJvbSBEZXZpY2UyIGRvbWFpbgorCQkJCQkjIGlzIHNlbGVjdGVkLgorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBSZW1vdGVTdWJtaXgKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgV2lyZWRIZWFkcGhvbmUKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgTGluZQorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBXaXJlZEhlYWRzZXQKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5CisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkRldmljZQorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgSGRtaQorCQkJCQkJQU5ZCisJCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKwkJCQkJCQlGb3JjZVVzZUZvckRvY2sgSXNOb3QgRm9yY2VBbmFsb2dEb2NrCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCisJCWRvbWFpbjogRGV2aWNlMgorCQkJY29uZjogUmVtb3RlU3VibWl4CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDEKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCisJCQljb25mOiBMaW5lCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMQorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRzZXQKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKworCQkJY29uZjogVXNiQWNjZXNzb3J5CisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWZtID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisKKwkJCWNvbmY6IFVzYkRldmljZQorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCisJCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKworCQkJY29uZjogSGRtaQorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMQorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKworCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0CisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfbWVkaWEucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X21lZGlhLnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGJlZGU1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X21lZGlhLnBmdwpAQCAtMCwwICsxLDMzMSBAQAorZG9tYWluR3JvdXA6IERldmljZUZvclN0cmF0ZWd5CisKKwlkb21haW5Hcm91cDogTWVkaWEKKworCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogQ2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCisJCWRvbWFpbjogRGV2aWNlMgorCQkJY29uZjogUmVtb3RlU3VibWl4CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDEKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcAorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogRm9yY2VTcGVha2VyCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQkjCisJCQkJIyBJZiBoZG1pIHN5c3RlbSBhdWRpbyBtb2RlIGlzIG9uLCByZW1vdmUgc3BlYWtlciBvdXQgb2Ygb3V0cHV0IGxpc3QuCisJCQkJIworCQkJCUZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIElzTm90IEZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHBob25lCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBMaW5lCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAxCisKKwkJCWNvbmY6IFdpcmVkSGVhZHNldAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFVzYkFjY2Vzc29yeQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAxCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFVzYkRldmljZQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAxCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IERndGxEb2NrSGVhZHNldAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEF1eERpZ2l0YWwKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAxCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKwkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQkjCisJCQkJIyBJZiBoZG1pIHN5c3RlbSBhdWRpbyBtb2RlIGlzIG9uLCByZW1vdmUgc3BlYWtlciBvdXQgb2Ygb3V0cHV0IGxpc3QuCisJCQkJIworCQkJCUZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIElzTm90IEZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJZG9tYWluOiBBcmMKKwkJCSMKKwkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCisJCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKKwkJCSMKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pQXJjCisKKwkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjID0gMAorCisJCWRvbWFpbjogU3BkaWYKKwkJCSMKKwkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCisJCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKKwkJCSMKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGRpZgorCisJCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmID0gMQorCisJCQljb25mOiBOb3RTZWxlY3RlZAorCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiA9IDAKKworCQlkb21haW46IEF1eExpbmUKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBdXhMaW5lCisKKwkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lID0gMApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Bob25lLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9waG9uZS5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IwMTQ5MQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9waG9uZS5wZncKQEAgLTAsMCArMSw0ODUgQEAKK3N1cERvbWFpbjogRGV2aWNlRm9yU3RyYXRlZ3kKKworCXN1cERvbWFpbjogUGhvbmUKKworCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogQ2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQkjIG5vIHNvbmlmaWNhdGlvbiBvbiByZW1vdGUgc3VibWl4IChlLmcuIFdGRCkKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKworCQlkb21haW46IERldmljZQorCQkJY29uZjogU2NvQ2Fya2l0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29DYXJraXQKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhTY29IZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29IZWFkc2V0CisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUFOWQorCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VOb25lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlBTlkKKwkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlTm9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRwaG9uZQorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMQorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHNldAorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0CisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBVc2JEZXZpY2UKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQorCQkJCUFOWQorCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VOb25lCisJCQkJCUFMTAorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgorCQkJCQkJIworCQkJCQkJIyBJbiBjYXNlIG9mIEZvcmNlIFNwZWFrZXIsIHByaW9yaXR5IGJldHdlZW4gZGV2aWNlIGFuZCBhY2Nlc3NvcnkgYXJlCisJCQkJCQkjIGludmVydGVkIGNvbXBhcmVkIHRvIEZvcmNlIE5vbmUgb3IgQnQgU2NvCisJCQkJCQkjCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkFjY2Vzc29yeQorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFVzYkFjY2Vzc29yeQorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogSGRtaQorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMQorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEVhcnBpZWNlCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBFYXJwaWVjZQorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogTGluZQorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDEKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogU3BlYWtlcgorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfcmVyb3V0aW5nLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9yZXJvdXRpbmcucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOTBhMzMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfcmVyb3V0aW5nLnBmdwpAQCAtMCwwICsxLDI5NyBAQAorZG9tYWluR3JvdXA6IERldmljZUZvclN0cmF0ZWd5CisKKwlkb21haW5Hcm91cDogUmVyb3V0aW5nCisJCSMKKwkJIyBGYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5CisJCSMKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IENhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCWZtID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisKKwkJZG9tYWluOiBEZXZpY2UyCisJCQljb25mOiBSZW1vdGVTdWJtaXgKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFJlbW90ZVN1Ym1peAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAxCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcAorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZQorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogRm9yY2VTcGVha2VyCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHBob25lCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogTGluZQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAxCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IFVzYkFjY2Vzc29yeQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBVc2JEZXZpY2UKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogRGd0bERvY2tIZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEF1eERpZ2l0YWwKKwkJCQkjCisJCQkJIyBSZXJvdXRpbmcgaXMgc2ltaWxhciB0byBtZWRpYSBhbmQgc29uaWZpY2F0aW9uIChleGVwdCBoZXJlOiBzb25pZmljYXRpb24gaXMgbm90IGFsbG93ZWQgb24gSERNSSkKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMQorCisJCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMTAxZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uLnBmdwpAQCAtMCwwICsxLDQ4NSBAQAorc3VwRG9tYWluOiBEZXZpY2VGb3JTdHJhdGVneQorCisJc3VwRG9tYWluOiBTb25pZmljYXRpb24KKworCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogQ2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJIyBubyBzb25pZmljYXRpb24gb24gcmVtb3RlIHN1Ym1peCAoZS5nLiBXRkQpCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsIGJ1dCBIRE1JIGlzIG5vdCByZWFjaGFibGUKKwkJCQkJIworCQkJCQloZG1pID0gMAorCisJCWRvbWFpbjogU3BlYWtlcgorCisJCQljb25mOiBTZWxlY3RlZAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggRU5GT1JDRURfQVVESUJMRSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCQkjCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIExpbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCisJCQljb25mOiBOb3RTZWxlY3RlZAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCisJCWRvbWFpbjogRGV2aWNlMgorCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogU2NvQ2Fya2l0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgcGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvQ2Fya2l0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBTY29IZWFkc2V0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgcGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogU2NvCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgcGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRwaG9uZQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBMaW5lCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDEKKworCQkJY29uZjogV2lyZWRIZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCQkjCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBVc2JEZXZpY2UKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5CisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCQkjCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBVc2JBY2Nlc3NvcnkKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IFVTQiBBY2Nlc3Nvcnkgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IERndGxEb2NrSGVhZHNldAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgRGd0bERvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbC4KKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IEFubGdEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwuCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEVhcnBpZWNlCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBFYXJwaWVjZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogTm9uZQorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsLnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjY2NzRjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsLnBmdwpAQCAtMCwwICsxLDU0NSBAQAorZG9tYWluR3JvdXA6IERldmljZUZvclN0cmF0ZWd5CisKKwlkb21haW5Hcm91cDogU29uaWZpY2F0aW9uUmVzcGVjdGZ1bAorCQkjCisJCSMgU29uaWZpY2lhdGlvbiBSZXNwZWN0ZnVsIGZvbGxvd3M6CisJCSMJLSBJZiBpbiBjYWxsOiBTdHJhdGVneSBzb25pZmljYXRpb24gKHRoYXQgZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpbiBjYWxsIGFsc28uLi4pCisJCSMJLSBJZiBub3QgaW4gY2FsbCBBTkQgYSBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlIHJlbW90ZWx5OiBTdHJhdGVneSBzb25pZmljYXRpb24gKHRoYXQKKwkJIyAgICAgZm9sbG93cyBlbmZvcmNlZCBhdWRpYmxlLCB3aGljaCBmb2xsb3dzIG1lZGlhKQorCQkjCS0gaWYgbm90IGluIGNhbGwgYW5kIG5vIG11c2ljIHN0cmVhbSBhY3RpdmUgcmVtb3RlbHkgYW5kIG11c2ljIHN0cmVhbSBhY3RpdmUpOiBzdHJhdGVneQorCQkjICAgICBtZWRpYQorCQkjICAgLSBPdGhlcndpc2UgZm9sbG93cyBzb25pZmljYXRpb24gYnkgcmVwbGFjaW5nIHNwZWFrZXIgd2l0aCBzcGVha2VyIHNhZmUgaWYgc3BlYWtlciBpcworCQkjCSAgc2VsZWN0ZWQuCisJCSMKKwkJIyBDYXNlIG9mIHN0cmVhbSBhY3RpdmUgaGFuZGxlZCBwcm9ncmFtbWF0aWNhbGx5CisKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IENhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKworCQlkb21haW46IFNwZWFrZXJzCisKKwkJCWNvbmY6IFNwZWFrZXJTYWZlCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyU2FmZQorCQkJCSMKKwkJCQkjIEZvbGxvd3Mgc29uaWZpY2F0aW9uIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsIGFuZCByZXBsYWNlIHNwZWFrZXIgYnkgc3BlYWtlciBzYWZlCisJCQkJIyBpZiBhbmQgb25seSBpZiBzcGVha2VyIG9ubHkgc2VsZWN0ZWQKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlcl9zYWZlID0gMQorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBGb2xsb3dzIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBGb2xsb3dzIFBob25lIFN0cmF0ZWd5IGlmIGNhbGwKKwkJCQkJCSMKKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgTGluZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlzcGVha2VyID0gMQorCisJCQljb25mOiBOb25lCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCWRvbWFpbjogRGV2aWNlMgorCQkJY29uZjogQmx1ZXRvb3RoQTJkcAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXMgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aFNjb0NhcmtpdAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29DYXJraXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAxCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKKwkJCQlBTlkKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCQkjCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCQkJIworCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMQorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IExpbmVXaGVuRm9sbG93TWVkaWFTdHJhdGVneQorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDEKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRzZXQKKwkJCQlBTlkKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCQkjCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCQkJIworCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBVc2JEZXZpY2UKKwkJCQlBTlkKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCQkjCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCQkJIworCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogVXNiQWNjZXNzb3J5CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBVc2JBY2Nlc3Nvcnkgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDEKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogRGd0bERvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBEZ3RsRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQXV4RGlnaXRhbAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgSERNSSBub3QgcmVhY2hhYmxlIGluIGNhbGwuCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDEKKworCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBBbmxnRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEVhcnBpZWNlCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRWFycGllY2UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMQorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IExpbmUKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDEKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyLnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWFlOWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci5wZncKQEAgLTAsMCArMSw0MCBAQAorc3VwRG9tYWluOiBEZXZpY2VGb3JTdHJhdGVneQorCisJc3VwRG9tYWluOiBUcmFuc21pdHRlZFRocm91Z2hTcGVha2VyCisJCWRvbWFpbjogVW5yZWFjaGVhYmxlRGV2aWNlcworCQkJY29uZjogQ2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCWRvbWFpbjogU3BlYWtlcgorCQkJY29uZjogU2VsZWN0ZWQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCisJCQljb25mOiBOb3RTZWxlY3RlZAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl9zdHJlYW0ucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9zdHJhdGVneV9mb3Jfc3RyZWFtLnBmdwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zOTQwYjlkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9zdHJhdGVneV9mb3Jfc3RyZWFtLnBmdwpAQCAtMCwwICsxLDIwIEBACitkb21haW46IFN0cmF0ZWd5Rm9yU3RyZWFtCisKKwljb25mOiBDYWxpYnJhdGlvbgorCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHBob25lCisJCSMKKwkJIyBOT1RFOiBTWVNURU0gc3RyZWFtIHVzZXMgTUVESUEgc3RyYXRlZ3kgYmVjYXVzZSBtdXRpbmcgbXVzaWMgYW5kIHN3aXRjaGluZyBvdXRwdXRzCisJCSMgd2hpbGUga2V5IGNsaWNrcyBhcmUgcGxheWVkIHByb2R1Y2VzIGEgcG9vciByZXN1bHQKKwkJIworCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gbWVkaWEKKwkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBzb25pZmljYXRpb24KKwkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gbWVkaWEKKwkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gc29uaWZpY2F0aW9uCisJCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBzb25pZmljYXRpb25fcmVzcGVjdGZ1bAorCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHBob25lCisJCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gZW5mb3JjZWRfYXVkaWJsZQorCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IGR0bWYKKwkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHRyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlcgorCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IGFjY2Vzc2liaWxpdHkKKwkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHJlcm91dGluZworCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl91c2FnZS5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl91c2FnZS5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y1ZGExMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3VzYWdlLnBmdwpAQCAtMCwwICsxLDM5IEBACitzdXBEb21haW46IFNlbGVjdGVkU3RyYXRlZ3lGb3JVc2FnZXMKKworCWRvbWFpbjogQ2FsaWJyYXRpb24KKwkJY29uZjogQ2FsaWJyYXRpb24KKwkJCS9Qb2xpY3kvcG9saWN5L3VzYWdlcy91bmtub3duL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBtZWRpYQorCQkJL1BvbGljeS9wb2xpY3kvdXNhZ2VzL21lZGlhL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBtZWRpYQorCQkJL1BvbGljeS9wb2xpY3kvdXNhZ2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHBob25lCisJCQkvUG9saWN5L3BvbGljeS91c2FnZXMvdm9pY2VfY29tbXVuaWNhdGlvbl9zaWduYWxsaW5nL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBkdG1mCisJCQkvUG9saWN5L3BvbGljeS91c2FnZXMvYWxhcm0vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHNvbmlmaWNhdGlvbgorCQkJL1BvbGljeS9wb2xpY3kvdXNhZ2VzL25vdGlmaWNhdGlvbi9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwKKwkJCS9Qb2xpY3kvcG9saWN5L3VzYWdlcy9ub3RpZmljYXRpb25fdGVsZXBob255X3Jpbmd0b25lL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBzb25pZmljYXRpb24KKwkJCS9Qb2xpY3kvcG9saWN5L3VzYWdlcy9ub3RpZmljYXRpb25fY29tbXVuaWNhdGlvbl9yZXF1ZXN0L2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBzb25pZmljYXRpb25fcmVzcGVjdGZ1bAorCQkJL1BvbGljeS9wb2xpY3kvdXNhZ2VzL25vdGlmaWNhdGlvbl9jb21tdW5pY2F0aW9uX2luc3RhbnQvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHNvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsCisJCQkvUG9saWN5L3BvbGljeS91c2FnZXMvbm90aWZpY2F0aW9uX2NvbW11bmljYXRpb25fZGVsYXllZC9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwKKwkJCS9Qb2xpY3kvcG9saWN5L3VzYWdlcy9ub3RpZmljYXRpb25fZXZlbnQvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHNvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsCisJCQkvUG9saWN5L3BvbGljeS91c2FnZXMvYXNzaXN0YW5jZV9uYXZpZ2F0aW9uX2d1aWRhbmNlL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBtZWRpYQorCQkJL1BvbGljeS9wb2xpY3kvdXNhZ2VzL2Fzc2lzdGFuY2Vfc29uaWZpY2F0aW9uL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBtZWRpYQorCQkJL1BvbGljeS9wb2xpY3kvdXNhZ2VzL2dhbWUvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IG1lZGlhCisKKwlkb21haW46IEFzc2lzdGFuY2VBY2Nlc3NpYmlsaXR5CisJCWNvbmY6IFNvbmlmaWNhdGlvbgorCQkJIworCQkJIyBJbiBjYXNlIG9mIFJpbmcgb3IgQWxhcm0gc3RyZWFtIHR5cGUgYWN0aXZlLCBzd2l0Y2hpbmcgdG8gc29uaWZpY2F0aW9uCisJCQkjIEB0b2RvOiBoYW5kbGUgdGhpcyBkeW5hbWljIGNhc2UuIEFzIGEgV0EsIHVzaW5nIFJpbmd0b25lIG1vZGUuLi4KKwkJCSMKKwkJCVRlbGVwaG9ueU1vZGUgSXMgUmluZ1RvbmUKKworCQkJL1BvbGljeS9wb2xpY3kvdXNhZ2VzL2Fzc2lzdGFuY2VfYWNjZXNzaWJpbGl0eS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gc29uaWZpY2F0aW9uCisKKwkJY29uZjogUGhvbmUKKwkJCUFOWQorCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKworCQkJL1BvbGljeS9wb2xpY3kvdXNhZ2VzL2Fzc2lzdGFuY2VfYWNjZXNzaWJpbGl0eS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gcGhvbmUKKworCQljb25mOiBBY2Nlc3NpYmlsaXR5CisJCQkvUG9saWN5L3BvbGljeS91c2FnZXMvYXNzaXN0YW5jZV9hY2Nlc3NpYmlsaXR5L2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBhY2Nlc3NpYmlsaXR5CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3Mvdm9sdW1lcy5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL3ZvbHVtZXMucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNDk1NjQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL3ZvbHVtZXMucGZ3CkBAIC0wLDAgKzEsNTQ1IEBACitzdXBEb21haW46IFZvbHVtZVByb2ZpbGVzRm9yU3RyZWFtCisJZG9tYWluOiBDYWxpYnJhdGlvbgorCQljb25mOiBDYWxpYnJhdGlvbgorCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJlYW1zCisJCQkJY29tcG9uZW50OiB2b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcworCQkJCQljb21wb25lbnQ6IGhlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDAKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtMjQuMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTE4LjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xMi4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTYuMAorCQkJCQljb21wb25lbnQ6IHNwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDAKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtMjQuMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTE2LjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC04LjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBlYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMAorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC0yNC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtMTguMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTEyLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAtNi4wCisJCQkJCWNvbXBvbmVudDogZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtNTguMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTQwLjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xNy4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisKKwkJCQljb21wb25lbnQ6IHN5c3RlbS92b2x1bWVfcHJvZmlsZXMKKwkJCQkJY29tcG9uZW50OiBoZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTMwLjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0yNi4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMjIuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IC0xOC4wCisJCQkJCWNvbXBvbmVudDogc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC0yNC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtMTguMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTEyLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAtNi4wCisJCQkJCWNvbXBvbmVudDogZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtMjQuMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTE4LjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xMi4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTYuMAorCQkJCQljb21wb25lbnQ6IGV4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTU4LjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC00MC4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMjEuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IC0xMC4wCisKKwkJCQljb21wb25lbnQ6IHJpbmcvdm9sdW1lX3Byb2ZpbGVzCisJCQkJCWNvbXBvbmVudDogaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC00OS41CisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtMzMuNQorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTE3LjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBzcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTM1LjcKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0yNi4xCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTMuMgorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQljb21wb25lbnQ6IGVhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTQ5LjUKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0zMy41CisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTcuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQljb21wb25lbnQ6IGV4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTU4LjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC00MC4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMjcuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IC0xMC4wCisKKwkJCQljb21wb25lbnQ6IG11c2ljL3ZvbHVtZV9wcm9maWxlcworCQkJCQljb21wb25lbnQ6IGhlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtNTguMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTQwLjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xNy4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCWNvbXBvbmVudDogc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC01Ni4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtMzQuMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTExLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBlYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC01OC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtNDAuMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTE3LjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBleHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC01OC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtNDAuMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTE3LjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKworCQkJCWNvbXBvbmVudDogYWxhcm0vdm9sdW1lX3Byb2ZpbGVzCisJCQkJCWNvbXBvbmVudDogaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC00OS41CisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtMzMuNQorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTE3LjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBzcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTM1LjcKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0yNi4xCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTMuMgorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQljb21wb25lbnQ6IGVhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTQ5LjUKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0zMy41CisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTcuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQljb21wb25lbnQ6IGV4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTU4LjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC00MC4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMjcuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IC0xMC4wCisKKwkJCQljb21wb25lbnQ6IG5vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMKKwkJCQkJY29tcG9uZW50OiBoZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTQ5LjUKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0zMy41CisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTcuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQljb21wb25lbnQ6IHNwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtMzUuNworCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTI2LjEKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xMy4yCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCWNvbXBvbmVudDogZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtNDkuNQorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTMzLjUKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xNy4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCWNvbXBvbmVudDogZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtNTguMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTQwLjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0yNy4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTEwLjAKKworCQkJCWNvbXBvbmVudDogYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMKKwkJCQkJY29tcG9uZW50OiBoZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAwCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTI0LjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0xOC4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTIuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IC02LjAKKwkJCQkJY29tcG9uZW50OiBzcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAwCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTI0LjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0xNi4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtOC4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCWNvbXBvbmVudDogZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDAKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtMjQuMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTE4LjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xMi4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTYuMAorCQkJCQljb21wb25lbnQ6IGV4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTU4LjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC00MC4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTcuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCisJCQkJY29tcG9uZW50OiBlbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcworCQkJCQljb21wb25lbnQ6IGhlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtMzAuMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTI2LjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0yMi4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTE4LjAKKwkJCQkJY29tcG9uZW50OiBzcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTI0LjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0xOC4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTIuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IC02LjAKKwkJCQkJY29tcG9uZW50OiBlYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC0yNC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtMTguMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTEyLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAtNi4wCisJCQkJCWNvbXBvbmVudDogZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtNTguMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTQwLjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0yNy4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTEwLjAKKworCQkJCWNvbXBvbmVudDogdHRzL3ZvbHVtZV9wcm9maWxlcworCQkJCQljb21wb25lbnQ6IGhlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDAKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtOTYuMAorCQkJCQkJMS9pbmRleCA9IDEKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtOTYuMAorCQkJCQkJMi9pbmRleCA9IDIKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtOTYuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IC05Ni4wCisJCQkJCWNvbXBvbmVudDogc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMAorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC05Ni4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtNjguMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTM0LjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBlYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMAorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC05Ni4wCisJCQkJCQkxL2luZGV4ID0gMQorCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC05Ni4wCisJCQkJCQkyL2luZGV4ID0gMgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC05Ni4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTk2LjAKKwkJCQkJY29tcG9uZW50OiBleHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMAorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC05Ni4wCisJCQkJCQkxL2luZGV4ID0gMQorCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC05Ni4wCisJCQkJCQkyL2luZGV4ID0gMgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC05Ni4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTk2LjAKKworCQkJCWNvbXBvbmVudDogYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMKKwkJCQkJY29tcG9uZW50OiBoZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTU4LjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC00MC4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTcuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQljb21wb25lbnQ6IHNwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtNTYuMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTM0LjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xMS4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCWNvbXBvbmVudDogZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtNTguMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTQwLjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xNy4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCWNvbXBvbmVudDogZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtNTguMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTQwLjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xNy4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisKKwkJCQljb21wb25lbnQ6IHJlcm91dGluZy92b2x1bWVfcHJvZmlsZXMKKwkJCQkJY29tcG9uZW50OiBoZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAwCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCQkxL2luZGV4ID0gMQorCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQkJMi9pbmRleCA9IDIKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBzcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAwCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCQkxL2luZGV4ID0gMQorCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQkJMi9pbmRleCA9IDIKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBlYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMAorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQkJMS9pbmRleCA9IDEKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJCTIvaW5kZXggPSAyCisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCWNvbXBvbmVudDogZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDAKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJCTEvaW5kZXggPSAxCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCQkyL2luZGV4ID0gMgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCisJCQkJY29tcG9uZW50OiBwYXRjaC92b2x1bWVfcHJvZmlsZXMKKwkJCQkJY29tcG9uZW50OiBoZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAwCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCQkxL2luZGV4ID0gMQorCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQkJMi9pbmRleCA9IDIKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBzcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAwCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCQkxL2luZGV4ID0gMQorCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQkJMi9pbmRleCA9IDIKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBlYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMAorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQkJMS9pbmRleCA9IDEKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJCTIvaW5kZXggPSAyCisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCWNvbXBvbmVudDogZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDAKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJCTEvaW5kZXggPSAxCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCQkyL2luZGV4ID0gMgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCisJZG9tYWluOiBEdG1mCisJCWNvbmY6IEluQ2FsbAorCQkJQU5ZCisJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmVhbXMKKwkJCQljb21wb25lbnQ6IGR0bWYvdm9sdW1lX3Byb2ZpbGVzCisJCQkJCWNvbXBvbmVudDogaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC0zMC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtMjYuMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTIyLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAtMTguMAorCQkJCQljb21wb25lbnQ6IHNwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtMjQuMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTE4LjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xMi4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTYuMAorCQkJCQljb21wb25lbnQ6IGVhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTI0LjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0xOC4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTIuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IC02LjAKKwkJCQkJY29tcG9uZW50OiBleHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC01OC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtNDAuMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTI3LjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAtMTAuMAorCisJCWNvbmY6IE91dE9mQ2FsbAorCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJlYW1zCisJCQkJY29tcG9uZW50OiBkdG1mL3ZvbHVtZV9wcm9maWxlcworCQkJCQljb21wb25lbnQ6IGhlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDAKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtMjQuMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTE4LjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xMi4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTYuMAorCQkJCQljb21wb25lbnQ6IHNwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDAKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtMjQuMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTE2LjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC04LjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBlYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMAorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC0yNC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtMTguMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTEyLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAtNi4wCisJCQkJCWNvbXBvbmVudDogZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtNTguMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTQwLjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xNy4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU3RydWN0dXJlL1BvbGljeUNsYXNzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU3RydWN0dXJlL1BvbGljeUNsYXNzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yOTY4NzlmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TdHJ1Y3R1cmUvUG9saWN5Q2xhc3MueG1sCkBAIC0wLDAgKzEsNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxTeXN0ZW1DbGFzcyB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSIuLi8uLi9TY2hlbWFzL1N5c3RlbUNsYXNzLnhzZCIgTmFtZT0iUG9saWN5Ij4KKyAgICA8U3Vic3lzdGVtSW5jbHVkZSBQYXRoPSJQb2xpY3lTdWJzeXN0ZW0ueG1sIi8+Cis8L1N5c3RlbUNsYXNzPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODIxZDZhZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwKQEAgLTAsMCArMSwxNzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Q29tcG9uZW50VHlwZVNldCB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKKyAgICAgICAgICAgICAgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249IlNjaGVtYXMvQ29tcG9uZW50VHlwZVNldC54c2QiPgorICAgIDwhLS0gT3V0cHV0IGRldmljZXMgZGVmaW5pdGlvbiBhcyBhIGJpdGZpZWxkIGZvciB0aGUgc3VwcG9ydGVkIGRldmljZXMgcGVyIG91dHB1dAorICAgIHByb2ZpbGUuIEl0IG11c3QgbWF0Y2ggd2l0aCB0aGUgb3V0cHV0IGRldmljZSBlbnVtIHBhcmFtZXRlci4KKyAgICAtLT4KKyAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIEdMT0JBTCBDT01QT05FTlRTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisgICAgIDwhLS0gQ29tbW9uIFR5cGVzIGRlZmludGlvbiAtLT4KKyAgICAgPHhpOmluY2x1ZGUgaHJlZj0iUG9saWN5U3Vic3lzdGVtLVZvbHVtZS54bWwiLz4KKworICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgR0xPQkFMIENPTVBPTkVOVFMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJPdXRwdXREZXZpY2VzTWFzayIgRGVzY3JpcHRpb249IjMydGggYml0IGlzIG5vdCBhbGxvd2VkIGFzIGRlZGljYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaW5wdXQgZGV2aWNlcyBkZXRlY3Rpb24iPgorICAgICAgICA8Qml0UGFyYW1ldGVyQmxvY2sgTmFtZT0ibWFzayIgU2l6ZT0iMzIiPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSIgU2l6ZT0iMSIgUG9zPSIwIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiIFNpemU9IjEiIFBvcz0iMSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjIiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIiBTaXplPSIxIiBQb3M9IjMiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyIgU2l6ZT0iMSIgUG9zPSI0Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCIgU2l6ZT0iMSIgUG9zPSI1Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0IiBTaXplPSIxIiBQb3M9IjYiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiIFNpemU9IjEiIFBvcz0iNyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIiBTaXplPSIxIiBQb3M9IjgiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciIgU2l6ZT0iMSIgUG9zPSI5Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiIFNpemU9IjEiIFBvcz0iMTAiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iMTEiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iMTIiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSIgU2l6ZT0iMSIgUG9zPSIxMyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIiBTaXplPSIxIiBQb3M9IjE0Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiIFNpemU9IjEiIFBvcz0iMTUiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4IiBTaXplPSIxIiBQb3M9IjI2Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiIFNpemU9IjEiIFBvcz0iMTciLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaV9hcmMiIFNpemU9IjEiIFBvcz0iMTgiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiIFNpemU9IjEiIFBvcz0iMTkiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iIFNpemU9IjEiIFBvcz0iMjAiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYXV4X2xpbmUiIFNpemU9IjEiIFBvcz0iMjEiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIiBTaXplPSIxIiBQb3M9IjIyIi8+CisgICAgICAgIDwvQml0UGFyYW1ldGVyQmxvY2s+CisgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgPCEtLSBJbnB1dCBkZXZpY2VzIGRlZmluaXRpb24gYXMgYSBiaXRmaWVsZCBmb3IgdGhlIHN1cHBvcnRlZCBkZXZpY2VzIHBlciBJbnB1dAorICAgIHByb2ZpbGUuIEl0IG11c3QgbWF0Y2ggd2l0aCB0aGUgSW5wdXQgZGV2aWNlIGVudW0gcGFyYW1ldGVyLgorICAgIC0tPgorICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IklucHV0RGV2aWNlc01hc2siPgorICAgICAgICA8Qml0UGFyYW1ldGVyQmxvY2sgTmFtZT0ibWFzayIgU2l6ZT0iMzIiPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJjb21tdW5pY2F0aW9uIiBTaXplPSIxIiBQb3M9IjAiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW1iaWVudCIgU2l6ZT0iMSIgUG9zPSIxIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIiBTaXplPSIxIiBQb3M9IjIiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjMiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCIgU2l6ZT0iMSIgUG9zPSI0Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiIFNpemU9IjEiIFBvcz0iNSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfcngiIFNpemU9IjEiIFBvcz0iNiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJiYWNrX21pYyIgU2l6ZT0iMSIgUG9zPSI3Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiIFNpemU9IjEiIFBvcz0iOCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCIgU2l6ZT0iMSIgUG9zPSI5Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjEwIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiIFNpemU9IjEiIFBvcz0iMTEiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSIgU2l6ZT0iMSIgUG9zPSIxMiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbV90dW5lciIgU2l6ZT0iMSIgUG9zPSIxMyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0dl90dW5lciIgU2l6ZT0iMSIgUG9zPSIxNCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIiBTaXplPSIxIiBQb3M9IjE1Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZGlmIiBTaXplPSIxIiBQb3M9IjE2Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIiBTaXplPSIxIiBQb3M9IjE3Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Imxvb3BiYWNrIiBTaXplPSIxIiBQb3M9IjE4Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImluIiBTaXplPSIxIiBQb3M9IjMxIi8+CisgICAgICAgIDwvQml0UGFyYW1ldGVyQmxvY2s+CisgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iT3V0cHV0RmxhZ3MiCisgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249InRoZSBhdWRpbyBvdXRwdXQgZmxhZ3Mgc2VydmUgdHdvIHB1cnBvc2VzOgorICAgICAgICAgICAgICAgICAgICAtIHdoZW4gYW4gQXVkaW9UcmFjayBpcyBjcmVhdGVkIHRoZXkgaW5kaWNhdGUgYSB3aXNoIHRvIGJlIGNvbm5lY3RlZCB0byBhbgorICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBzdHJlYW0gd2l0aCBhdHRyaWJ1dGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBmbGFncy4KKyAgICAgICAgICAgICAgICAgICAgLSB3aGVuIHByZXNlbnQgaW4gYW4gb3V0cHV0IHByb2ZpbGUgZGVzY3JpcHRvciBsaXN0ZWQgZm9yIGEgcGFydGljdWxhciBhdWRpbworICAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlIG1vZHVsZSwgdGhleSBpbmRpY2F0ZSB0aGF0IGFuIG91dHB1dCBzdHJlYW0gY2FuIGJlIG9wZW5lZCB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMgdGhlIGF0dHJpYnV0ZXMgaW5kaWNhdGVkIGJ5IHRoZSBmbGFncy4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHdpbGwgdHJ5IHRvIG1hdGNoIHRoZSBmbGFncyBpbiB0aGUgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAod2hlbiBnZXRPdXB1dCgpIGlzIGNhbGxlZCkgdG8gYW4gYXZhaWxhYmxlIG91dHB1dCBzdHJlYW0uIj4KKyAgICAgICAgPEJpdFBhcmFtZXRlckJsb2NrIE5hbWU9Im1hc2siIFNpemU9IjMyIj4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGlyZWN0IiBTaXplPSIxIiBQb3M9IjAiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icHJpbWFyeSIgU2l6ZT0iMSIgUG9zPSIxIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZhc3QiIFNpemU9IjEiIFBvcz0iMiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZWVwX2J1ZmZlciIgU2l6ZT0iMSIgUG9zPSIzIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImNvbXByZXNzX29mZmxvYWQiIFNpemU9IjEiIFBvcz0iNCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJub25fYmxvY2tpbmciIFNpemU9IjEiIFBvcz0iNSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJod19hdl9zeW5jIiBTaXplPSIxIiBQb3M9IjYiLz4KKyAgICAgICAgPC9CaXRQYXJhbWV0ZXJCbG9jaz4KKyAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJJbnB1dEZsYWdzIgorICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJUaGUgYXVkaW8gaW5wdXQgZmxhZ3MgYXJlIGFuYWxvZ291cyB0byBhdWRpbyBvdXRwdXQgZmxhZ3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRseSB0aGV5IGFyZSB1c2VkIG9ubHkgd2hlbiBhbiBBdWRpb1JlY29yZCBpcyBjcmVhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBpbmRpY2F0ZSBhIHByZWZlcmVuY2UgdG8gYmUgY29ubmVjdGVkIHRvIGFuIGlucHV0IHN0cmVhbSB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGZsYWdzLiI+CisgICAgICAgIDxCaXRQYXJhbWV0ZXJCbG9jayBOYW1lPSJtYXNrIiBTaXplPSIzMiI+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZhc3QiIFNpemU9IjEiIFBvcz0iMCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJod19ob3R3b3JkIiBTaXplPSIxIiBQb3M9IjIiLz4KKyAgICAgICAgPC9CaXRQYXJhbWV0ZXJCbG9jaz4KKyAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJJbnB1dFNvdXJjZXNNYXNrIiBEZXNjcmlwdGlvbj0iVGhlIGF1ZGlvIGlucHV0IHNvdXJjZSBpcyBhbHNvIGtub3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIHRoZSB1c2UgY2FzZS4iPgorICAgICAgICA8Qml0UGFyYW1ldGVyQmxvY2sgTmFtZT0ibWFzayIgU2l6ZT0iMzIiPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZWZhdWx0IiBTaXplPSIxIiBQb3M9IjAiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibWljIiBTaXplPSIxIiBQb3M9IjEiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idm9pY2VfdXBsaW5rIiBTaXplPSIxIiBQb3M9IjIiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idm9pY2VfZG93bmxpbmsiIFNpemU9IjEiIFBvcz0iMyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ2b2ljZV9jYWxsIiBTaXplPSIxIiBQb3M9IjQiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iY2FtY29yZGVyIiBTaXplPSIxIiBQb3M9IjUiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idm9pY2VfcmVjb2duaXRpb24iIFNpemU9IjEiIFBvcz0iNiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ2b2ljZV9jb21tdW5pY2F0aW9uIiBTaXplPSIxIiBQb3M9IjciLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCIgU2l6ZT0iMSIgUG9zPSI4Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtX3R1bmVyIiBTaXplPSIxIiBQb3M9IjkiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaG90d29yZCIgU2l6ZT0iMSIgUG9zPSIxMCIvPgorICAgICAgICA8L0JpdFBhcmFtZXRlckJsb2NrPgorICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgIDwhLS0gUm91dGluZyBTdHJhdGVneSBkZWZpbml0aW9uIGFzIGFuIGVudW1lcmF0aW9uLiBOdW1lcmljYWwgdmFsdWUgbXVzdCBtYXRjaCB0aGUgdmFsdWUKKyAgICAgICAgIG9mIHRoZSByb3V0aW5nIHN0cmF0ZWd5IGluIHBvbGljeSBoZWFkZXIgZmlsZS4gLS0+CisgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyYXRlZ3kiPgorICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSIgU2l6ZT0iMzIiPgorICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJtZWRpYSIgTnVtZXJpY2FsPSIwIi8+CisgICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InBob25lIiBOdW1lcmljYWw9IjEiLz4KKyAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0ic29uaWZpY2F0aW9uIiBOdW1lcmljYWw9IjIiLz4KKyAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0ic29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwiIE51bWVyaWNhbD0iMyIvPgorICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJkdG1mIiBOdW1lcmljYWw9IjQiLz4KKyAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0iZW5mb3JjZWRfYXVkaWJsZSIgTnVtZXJpY2FsPSI1Ii8+CisgICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InRyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlciIgTnVtZXJpY2FsPSI2Ii8+CisgICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9ImFjY2Vzc2liaWxpdHkiIE51bWVyaWNhbD0iNyIvPgorICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJyZXJvdXRpbmciIE51bWVyaWNhbD0iOCIvPgorICAgICAgICA8L0VudW1QYXJhbWV0ZXI+CisgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkFURUdZIENPTU1PTiBUWVBFUyBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyYXRlZ3lDb25maWciIE1hcHBpbmc9IlN0cmF0ZWd5OiclMSciPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9InNlbGVjdGVkX291dHB1dF9kZXZpY2VzIiBUeXBlPSJPdXRwdXREZXZpY2VzTWFzayIvPgorICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJBVEVHWSBDT01NT04gVFlQRVMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSRUFNIENPTU1PTiBUWVBFUyBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyZWFtIj4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhcHBsaWNhYmxlX3N0cmF0ZWd5IiBUeXBlPSJTdHJhdGVneSIgTWFwcGluZz0iU3RyZWFtOiclMSciLz4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2x1bWVfcHJvZmlsZXMiIFR5cGU9IlZvbHVtZUN1cnZlc0NhdGVnb3JpZXMiCisgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IkEgdm9sdW1lIHByb2ZpbGUgaXMgcmVmZXJlZCBieSB0aGUgc3RyZWFtIHR5cGUuIi8+CisgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkVBTSBDT01NT04gVFlQRVMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgVVNBR0UgQ09NTU9OIFRZUEVTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJVc2FnZSI+CisgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYXBwbGljYWJsZV9zdHJhdGVneSIgVHlwZT0iU3RyYXRlZ3kiIE1hcHBpbmc9IlVzYWdlOiclMSciLz4KKyAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgVVNBR0UgQ09NTU9OIFRZUEVTIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIElOUFVUIFNPVVJDRSBDT01NT04gVFlQRVMgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IklucHV0U291cmNlIj4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhcHBsaWNhYmxlX2lucHV0X2RldmljZSIgVHlwZT0iSW5wdXREZXZpY2VzTWFzayIKKyAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJJbnB1dFNvdXJjZTonJTEnIiBEZXNjcmlwdGlvbj0iU2VsZWN0ZWQgSW5wdXQgZGV2aWNlIi8+CisgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIElOUFVUIFNPVVJDRSBDT01NT04gVFlQRVMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKzwvQ29tcG9uZW50VHlwZVNldD4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS1Wb2x1bWUueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLVZvbHVtZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2YzOWNjMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS1Wb2x1bWUueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Q29tcG9uZW50VHlwZVNldCB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKKyAgICAgICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICAgICAgICAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iU2NoZW1hcy9Db21wb25lbnRUeXBlU2V0LnhzZCI+CisgIDxDb21wb25lbnRUeXBlIE5hbWU9IlZvbHVtZUN1cnZlUG9pbnRzIj4KKyAgICA8UGFyYW1ldGVyQmxvY2sgTmFtZT0iY3VydmVfcG9pbnRzIiBBcnJheUxlbmd0aD0iNCIgTWFwcGluZz0iVm9sdW1lUHJvZmlsZTonJTEnIgorICAgICAgICBEZXNjcmlwdGlvbj0iNCBwb2ludHMgdG8gZGVmaW5lIHRoZSB2b2x1bWUgYXR0ZW51YXRpb24gY3VydmUsIGVhY2gKKyAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3Rlcml6ZWQgYnkgdGhlIHZvbHVtZSBpbmRleCAoZnJvbSAwIHRvIDEwMCkgYXQgd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgIHRoZXkgYXBwbHksIGFuZCB0aGUgYXR0ZW51YXRpb24gaW4gZEIgYXQgdGhhdCBpbmRleC4KKyAgICAgICAgICAgICAgICAgICAgIFdlIHVzZSAxMDAgc3RlcHMgdG8gYXZvaWQgcm91bmRpbmcgZXJyb3JzIHdoZW4gY29tcHV0aW5nCisgICAgICAgICAgICAgICAgICAgICB0aGUgdm9sdW1lIj4KKyAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiIFNpemU9IjMyIi8+CisgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIiBTaXplPSIxNiIgSW50ZWdyYWw9IjciIEZyYWN0aW9uYWw9IjgiLz4KKyAgICAgPC9QYXJhbWV0ZXJCbG9jaz4KKyAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJWb2x1bWVDdXJ2ZXNDYXRlZ29yaWVzIj4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJoZWFkc2V0X2RldmljZV9jYXRlZ29yeSIgVHlwZT0iVm9sdW1lQ3VydmVQb2ludHMiIE1hcHBpbmc9IkNhdGVnb3J5OjAiLz4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzcGVha2VyX2RldmljZV9jYXRlZ29yeSIgVHlwZT0iVm9sdW1lQ3VydmVQb2ludHMiIE1hcHBpbmc9IkNhdGVnb3J5OjEiLz4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJlYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkiIFR5cGU9IlZvbHVtZUN1cnZlUG9pbnRzIiBNYXBwaW5nPSJDYXRlZ29yeToyIi8+CisgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5IiBUeXBlPSJWb2x1bWVDdXJ2ZVBvaW50cyIgTWFwcGluZz0iQ2F0ZWdvcnk6MyIvPgorICAgIDwvQ29tcG9uZW50VHlwZT4KKworPC9Db21wb25lbnRUeXBlU2V0PgorCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIyMWY2YWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0ueG1sCkBAIC0wLDAgKzEsMTM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFN1YnN5c3RlbSB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKKyAgICAgICAgICAgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249IlNjaGVtYXMvU3Vic3lzdGVtLnhzZCIKKyAgICAgICAgICAgTmFtZT0icG9saWN5IiBUeXBlPSJQb2xpY3kiIEVuZGlhbm5lc3M9IkxpdHRsZSI+CisKKyAgICA8Q29tcG9uZW50TGlicmFyeT4KKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIEdMT0JBTCBDT01QT05FTlRTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisgICAgICAgIDwhLS0gQ29tbW9uIFR5cGVzIGRlZmludGlvbiAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0iUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbCIvPgorCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBHTE9CQUwgQ09NUE9ORU5UUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSQVRFR1kgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJTdHJhdGVnaWVzIiBEZXNjcmlwdGlvbj0iSWRlbnRpZmllciBtdXN0IG1hdGNoIHRoZSBlbnVtIHZhbHVlIHRvIG1ha2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxpbmsgYmV0d2VlbiB0aGUgUG9saWN5TWFuYWdlciBhbmQgUEZXIj4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibWVkaWEiIFR5cGU9IlN0cmF0ZWd5Q29uZmlnIiBNYXBwaW5nPSJBbWVuZDE6TWVkaWEsSWRlbnRpZmllcjowIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InBob25lIiBUeXBlPSJTdHJhdGVneUNvbmZpZyIgTWFwcGluZz0iQW1lbmQxOlBob25lLElkZW50aWZpZXI6MSIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzb25pZmljYXRpb24iIFR5cGU9IlN0cmF0ZWd5Q29uZmlnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpTb25pZmljYXRpb24sSWRlbnRpZmllcjoyIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InNvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsIiBUeXBlPSJTdHJhdGVneUNvbmZpZyIKKyAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlNvbmlmaWNhdGlvblJlc3BlY3RmdWwsSWRlbnRpZmllcjozIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImR0bWYiIFR5cGU9IlN0cmF0ZWd5Q29uZmlnIiBNYXBwaW5nPSJBbWVuZDE6RHRtZixJZGVudGlmaWVyOjQiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZW5mb3JjZWRfYXVkaWJsZSIgVHlwZT0iU3RyYXRlZ3lDb25maWciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpFbmZvcmNlZEF1ZGlibGUsSWRlbnRpZmllcjo1Ii8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InRyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlciIgVHlwZT0iU3RyYXRlZ3lDb25maWciCisgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpUcmFuc21pdHRlZFRocm91Z2hTcGVha2VyLElkZW50aWZpZXI6NiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhY2Nlc3NpYmlsaXR5IiBUeXBlPSJTdHJhdGVneUNvbmZpZyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOkFjY2Vzc2liaWxpdHksSWRlbnRpZmllcjo3Ii8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InJlcm91dGluZyIgVHlwZT0iU3RyYXRlZ3lDb25maWciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlJlcm91dGluZyxJZGVudGlmaWVyOjgiLz4KKyAgICAgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJBVEVHWSBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSRUFNIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyZWFtcyIgRGVzY3JpcHRpb249ImFzc29jaWF0ZWQgdG8gYXVkaW9fc3RyZWFtX3R5cGVfdCBkZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyIG1hcHBpbmcgbXVzdCBtYXRjaCB0aGUgdmFsdWUgb2YgdGhlIGVudW0iPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jYWxsIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IkFtZW5kMTpWb2ljZUNhbGwsSWRlbnRpZmllcjowIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InN5c3RlbSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJBbWVuZDE6U3lzdGVtLElkZW50aWZpZXI6MSIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJyaW5nIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IkFtZW5kMTpSaW5nLElkZW50aWZpZXI6MiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJtdXNpYyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJBbWVuZDE6TXVzaWMsSWRlbnRpZmllcjozIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFsYXJtIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IkFtZW5kMTpBbGFybSxJZGVudGlmaWVyOjQiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibm90aWZpY2F0aW9uIiBUeXBlPSJTdHJlYW0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOk5vdGlmaWNhdGlvbixJZGVudGlmaWVyOjUiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYmx1ZXRvb3RoX3NjbyIgVHlwZT0iU3RyZWFtIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Qmx1ZXRvb3RoU2NvLElkZW50aWZpZXI6NiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJlbmZvcmNlZF9hdWRpYmxlIiBUeXBlPSJTdHJlYW0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpFbmZvcmNlQXVkaWJsZSxJZGVudGlmaWVyOjciCisgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJTb3VuZHMgdGhhdCBjYW5ub3QgYmUgbXV0ZWQgYnkgdXNlciBhbmQgbXVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgcm91dGVkIHRvIHNwZWFrZXIiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZHRtZiIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJBbWVuZDE6RHRtZixJZGVudGlmaWVyOjgiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idHRzIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IkFtZW5kMTpUdHMsSWRlbnRpZmllcjo5IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iVHJhbnNtaXR0ZWQgVGhyb3VnaCBTcGVha2VyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxheXMgb3ZlciBzcGVha2VyIG9ubHksIHNpbGVudCBvbiBvdGhlciBkZXZpY2VzIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFjY2Vzc2liaWxpdHkiIFR5cGU9IlN0cmVhbSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOkFjY2Vzc2liaWxpdHksSWRlbnRpZmllcjoxMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IkZvciBhY2Nlc3NpYmlsaXR5IHRhbGsgYmFjayBwcm9tcHRzIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InJlcm91dGluZyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJBbWVuZDE6UmVyb3V0aW5nLElkZW50aWZpZXI6MTEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJGb3IgZHluYW1pYyBwb2xpY3kgb3V0cHV0IG1peGVzIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InBhdGNoIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IkFtZW5kMTpQYXRjaCxJZGVudGlmaWVyOjEyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iRm9yIGludGVybmFsIGF1ZGlvIGZsaW5nZXIgdHJhY2tzLiBGaXhlZCB2b2x1bWUiLz4KKyAgICAgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJFQU0gRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFVTQUdFIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iVXNhZ2VzIiBEZXNjcmlwdGlvbj0iYXNzb2NpYXRlZCB0byBhdWRpb19zdHJlYW1fdHlwZV90IGRlZmluaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIgbWFwcGluZyBtdXN0IG1hdGNoIHRoZSB2YWx1ZSBvZiB0aGUgZW51bSI+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InVua25vd24iIFR5cGU9IlVzYWdlIiBNYXBwaW5nPSJBbWVuZDE6VW5rbm93bixJZGVudGlmaWVyOjAiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibWVkaWEiIFR5cGU9IlVzYWdlIiBNYXBwaW5nPSJBbWVuZDE6TWVkaWEsSWRlbnRpZmllcjoxIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NvbW11bmljYXRpb24iIFR5cGU9IlVzYWdlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VDb21tdW5pY2F0aW9uLElkZW50aWZpZXI6MiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jb21tdW5pY2F0aW9uX3NpZ25hbGxpbmciIFR5cGU9IlVzYWdlIgorICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VDb21tdW5pY2F0aW9uU2lnbmFsbGluZyxJZGVudGlmaWVyOjMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYWxhcm0iIFR5cGU9IlVzYWdlIiBNYXBwaW5nPSJBbWVuZDE6QWxhcm0sSWRlbnRpZmllcjo0Ii8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbiIgVHlwZT0iVXNhZ2UiIE1hcHBpbmc9IkFtZW5kMTpOb3RpZmljYXRpb24sSWRlbnRpZmllcjo1Ii8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbl90ZWxlcGhvbnlfcmluZ3RvbmUiIFR5cGU9IlVzYWdlIgorICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Tm90aWZpY2F0aW9uVGVsZXBob255UmluZ3RvbmUsSWRlbnRpZmllcjo2Ii8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbl9jb21tdW5pY2F0aW9uX3JlcXVlc3QiIFR5cGU9IlVzYWdlIgorICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Tm90aWZpY2F0aW9uQ29tbXVuaWNhdGlvblJlcXVlc3QsSWRlbnRpZmllcjo3Ii8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbl9jb21tdW5pY2F0aW9uX2luc3RhbnQiIFR5cGU9IlVzYWdlIgorICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Tm90aWZpY2F0aW9uQ29tbXVuaWNhdGlvbkluc3RhbnQsSWRlbnRpZmllcjo4Ii8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbl9jb21tdW5pY2F0aW9uX2RlbGF5ZWQiIFR5cGU9IlVzYWdlIgorICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Tm90aWZpY2F0aW9uQ29tbXVuaWNhdGlvbkRlbGF0ZWQsSWRlbnRpZmllcjo5Ii8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbl9ldmVudCIgVHlwZT0iVXNhZ2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOk5vdGlmaWNhdGlvbkV2ZW50LElkZW50aWZpZXI6MTAiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYXNzaXN0YW5jZV9hY2Nlc3NpYmlsaXR5IiBUeXBlPSJVc2FnZSIKKyAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOkFzc2lzdGFuY2VBY2Nlc3NpYmlsaXR5LElkZW50aWZpZXI6MTEiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYXNzaXN0YW5jZV9uYXZpZ2F0aW9uX2d1aWRhbmNlIiBUeXBlPSJVc2FnZSIKKyAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOkFzc2lzdGFuY2VOYXZpZ2F0aW9uR3VpZGFuY2UsSWRlbnRpZmllcjoxMiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhc3Npc3RhbmNlX3NvbmlmaWNhdGlvbiIgVHlwZT0iVXNhZ2UiCisgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpBc3Npc3RhbmNlU29uaWZpY2F0aW9uLElkZW50aWZpZXI6MTMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZ2FtZSIgVHlwZT0iVXNhZ2UiIE1hcHBpbmc9IkFtZW5kMTpCbHVldG9vdGhTY28sSWRlbnRpZmllcjoxNCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2aXJ0dWFsX3NvdXJjZSIgVHlwZT0iVXNhZ2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6VmlydHVhbFNvdXJjZSxJZGVudGlmaWVyOjE1Ii8+CisgICAgICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgVVNBR0UgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIElOUFVUIFNPVVJDRSBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IklucHV0U291cmNlcyIgRGVzY3JpcHRpb249ImFzc29jaWF0ZWQgdG8gYXVkaW9fc291cmNlX3QgZGVmaW5pdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciBtYXBwaW5nIG11c3QgbWF0Y2ggdGhlIHZhbHVlIG9mIHRoZSBlbnVtIj4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZGVmYXVsdCIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9IkFtZW5kMTpEZWZhdWx0LElkZW50aWZpZXI6MCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJtaWMiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJBbWVuZDE6TWljLElkZW50aWZpZXI6MSIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV91cGxpbmsiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpWb2ljZVVwbGluayxJZGVudGlmaWVyOjIiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfZG93bmxpbmsiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlZvaWNlRG93bmxpbmssSWRlbnRpZmllcjozIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NhbGwiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VDYWxsLElkZW50aWZpZXI6NCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJjYW1jb3JkZXIiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJBbWVuZDE6Q2FtY29yZGVyLElkZW50aWZpZXI6NSIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9yZWNvZ25pdGlvbiIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VSZWNvZ25pdGlvbixJZGVudGlmaWVyOjYiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY29tbXVuaWNhdGlvbiIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpWb2ljZUNvbW11bmljYXRpb24sSWRlbnRpZmllcjo3Ii8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InJlbW90ZV9zdWJtaXgiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6UmVtb3RlU3VibWl4LElkZW50aWZpZXI6OCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJmbV90dW5lciIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9IkFtZW5kMTpGbVR1bmVyLElkZW50aWZpZXI6MTk5OCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJob3R3b3JkIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iQW1lbmQxOkhvdHdvcmQsSWRlbnRpZmllcjoxOTk5Ii8+CisgICAgICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5QVVQgU09VUkNFIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgPC9Db21wb25lbnRMaWJyYXJ5PgorCisgICAgPEluc3RhbmNlRGVmaW5pdGlvbj4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzdHJlYW1zIiBUeXBlPSJTdHJlYW1zIi8+CisgICAgICAgIDxDb21wb25lbnQgTmFtZT0ic3RyYXRlZ2llcyIgVHlwZT0iU3RyYXRlZ2llcyIvPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImlucHV0X3NvdXJjZXMiIFR5cGU9IklucHV0U291cmNlcyIvPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9InVzYWdlcyIgVHlwZT0iVXNhZ2VzIi8+CisgICAgPC9JbnN0YW5jZURlZmluaXRpb24+Cis8L1N1YnN5c3RlbT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvcG9saWN5X2NyaXRlcmlhLnR4dCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvcG9saWN5X2NyaXRlcmlhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZjA2NDk4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9wb2xpY3lfY3JpdGVyaWEudHh0CkBAIC0wLDAgKzEsOSBAQAorRXhjbHVzaXZlQ3JpdGVyaW9uIFRlbGVwaG9ueU1vZGUgICAgICAgICAgICAgICAgOiAgIE5vcm1hbCAgICAgICAgICBSaW5nVG9uZSAgICAgICAgICAgICAgICBJbkNhbGwgICAgICAgICAgICAgIEluQ29tbXVuaWNhdGlvbgorSW5jbHVzaXZlQ3JpdGVyaW9uIEF2YWlsYWJsZUlucHV0RGV2aWNlcyAgICAgICAgOiAgIENvbW11bmljYXRpb24gQW1iaWVudCBCdWlsdGluTWljIEJsdWV0b290aFNjb0hlYWRzZXQgV2lyZWRIZWFkc2V0IEhkbWkgVGVsZXBob255UnggQmFja01pYyBSZW1vdGVTdWJtaXggQW5sZ0RvY2tIZWFkc2V0IERndGxEb2NrSGVhZHNldCBVc2JBY2Nlc3NvcnkgVXNiRGV2aWNlIEZtVHVuZXIgVHZUdW5lciBMaW5lIFNwZGlmIEJsdWV0b290aEEyZHAgTG9vcGJhY2sKK0luY2x1c2l2ZUNyaXRlcmlvbiBBdmFpbGFibGVPdXRwdXREZXZpY2VzICAgICAgIDogICBFYXJwaWVjZSBTcGVha2VyIFdpcmVkU3BlYWtlciBXaXJlZEhlYWRzZXQgV2lyZWRIZWFkcGhvbmUgQmx1ZXRvb3RoU2NvIEJsdWV0b290aFNjb0hlYWRzZXQgQmx1ZXRvb3RoU2NvQ2Fya2l0IEJsdWV0b290aEEyZHAgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIgSGRtaSBBbmxnRG9ja0hlYWRzZXQgRGd0bERvY2tIZWFkc2V0IFVzYkFjY2Vzc29yeSBVc2JEZXZpY2UgUmVtb3RlU3VibWl4IFRlbGVwaG9ueVR4IExpbmUgSGRtaUFyYyBTcGRpZiBGbSBBdXhMaW5lIFNwZWFrZXJTYWZlCitFeGNsdXNpdmVDcml0ZXJpb24gRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uICAgICA6ICAgRm9yY2VOb25lICAgICAgIEZvcmNlU3BlYWtlciAgICAgICAgICAgIEZvcmNlQnRTY28KK0V4Y2x1c2l2ZUNyaXRlcmlvbiBGb3JjZVVzZUZvck1lZGlhICAgICAgICAgICAgIDogICBGb3JjZU5vbmUgICAgICAgRm9yY2VTcGVha2VyCQkJRm9yY2VIZWFkcGhvbmVzICAgICAgICAgRm9yY2VCdEEyZHAgICAgICAgICBGb3JjZVdpcmVkQWNjZXNzb3J5IEZvcmNlQW5hbG9nRG9jayBGb3JjZURpZ2l0YWxEb2NrICAgIEZvcmNlTm9CdEEyZHAgICAgICAgRm9yY2VTeXN0ZW1FbmZvcmNlZAorRXhjbHVzaXZlQ3JpdGVyaW9uIEZvcmNlVXNlRm9yUmVjb3JkICAgICAgICAgICAgOiAgIEZvcmNlTm9uZSAgICAgICBGb3JjZUJ0U2NvICAgICAgICAgICAgICBGb3JjZVdpcmVkQWNjZXNzb3J5CitFeGNsdXNpdmVDcml0ZXJpb24gRm9yY2VVc2VGb3JEb2NrICAgICAgICAgICAgICA6ICAgRm9yY2VOb25lICAgICAgIEZvcmNlV2lyZWRBY2Nlc3NvcnkgICAgIEZvcmNlQnRDYXJEb2NrICAgICAgRm9yY2VCdERlc2tEb2NrICAgICBGb3JjZUFuYWxvZ0RvY2sgRm9yY2VEaWdpdGFsRG9jaworRXhjbHVzaXZlQ3JpdGVyaW9uIEZvcmNlVXNlRm9yU3lzdGVtICAgICAgICAgICAgOiAgIEZvcmNlTm9uZSAgICAgICBGb3JjZVN5c3RlbUVuZm9yY2VkCitFeGNsdXNpdmVDcml0ZXJpb24gRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8gICA6ICAgRm9yY2VOb25lICAgICAgIEZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE1MjM2NTYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vQW5kcm9pZC5tawpAQCAtMCwwICsxLDM2IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBQb2xpY3lTdWJzeXN0ZW1CdWlsZGVyLmNwcCBcCisgICAgUG9saWN5U3Vic3lzdGVtLmNwcCBcCisgICAgU3RyYXRlZ3kuY3BwIFwKKyAgICBJbnB1dFNvdXJjZS5jcHAgXAorICAgIFZvbHVtZVByb2ZpbGUuY3BwIFwKKyAgICBTdHJlYW0uY3BwIFwKKyAgICBVc2FnZS5jcHAKKworTE9DQUxfQ0ZMQUdTICs9IFwKKyAgICAtV2FsbCBcCisgICAgLVdlcnJvciBcCisgICAgLVdleHRyYSBcCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICQoVE9QRElSKWV4dGVybmFsL3BhcmFtZXRlci1mcmFtZXdvcmsvcGFyYW1ldGVyIFwKKyAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKKyAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlIFwKKyAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UgXAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYWJsZSAgXAorICAgIGxpYnBhcmFtZXRlciBcCisgICAgbGlieG1sc2VyaWFsaXplciBcCisgICAgbGlibG9nIFwKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRSA6PSBsaWJwb2xpY3ktc3Vic3lzdGVtCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0lucHV0U291cmNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9JbnB1dFNvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDk3ZDU1NQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9JbnB1dFNvdXJjZS5jcHAKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJJbnB1dFNvdXJjZS5oIgorI2luY2x1ZGUgIlBvbGljeU1hcHBpbmdLZXlzLmgiCisjaW5jbHVkZSAiUG9saWN5U3Vic3lzdGVtLmgiCisKK3VzaW5nIHN0ZDo6c3RyaW5nOworCitJbnB1dFNvdXJjZTo6SW5wdXRTb3VyY2UoY29uc3Qgc3RyaW5nICZtYXBwaW5nVmFsdWUsCisgICAgICAgICAgICAgICAgICAgQ0luc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCAqaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENNYXBwaW5nQ29udGV4dCAmY29udGV4dCkKKyAgICA6IENGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QoaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmdLZXlBbWVuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNYXBwaW5nS2V5QW1lbmRFbmQgLSBNYXBwaW5nS2V5QW1lbmQxICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQpLAorICAgICAgbVBvbGljeVN1YnN5c3RlbShzdGF0aWNfY2FzdDxjb25zdCBQb2xpY3lTdWJzeXN0ZW0gKj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQtPmdldEJlbG9uZ2luZ1N1YnN5c3RlbSgpKSksCisgICAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlKG1Qb2xpY3lTdWJzeXN0ZW0tPmdldFBvbGljeVBsdWdpbkludGVyZmFjZSgpKSwKKyAgICAgIG1BcHBsaWNhYmxlSW5wdXREZXZpY2UobURlZmF1bHRBcHBsaWNhYmxlSW5wdXREZXZpY2UpCit7CisgICAgbUlkID0gc3RhdGljX2Nhc3Q8YXVkaW9fc291cmNlX3Q+KGNvbnRleHQuZ2V0SXRlbUFzSW50ZWdlcihNYXBwaW5nS2V5SWRlbnRpZmllcikpOworICAgIC8vIERlY2xhcmVzIHRoZSBzdHJhdGVneSB0byBhdWRpbyBwb2xpY3kgZW5naW5lCisgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+YWRkSW5wdXRTb3VyY2UoZ2V0Rm9ybWF0dGVkTWFwcGluZ1ZhbHVlKCksIG1JZCk7Cit9CisKK2Jvb2wgSW5wdXRTb3VyY2U6OnJlY2VpdmVGcm9tSFcoc3RyaW5nICYgLyplcnJvciovKQoreworICAgIGJsYWNrYm9hcmRXcml0ZSgmbUFwcGxpY2FibGVJbnB1dERldmljZSwgc2l6ZW9mKG1BcHBsaWNhYmxlSW5wdXREZXZpY2UpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBJbnB1dFNvdXJjZTo6c2VuZFRvSFcoc3RyaW5nICYgLyplcnJvciovKQoreworICAgIHVpbnQzMl90IGFwcGxpY2FibGVJbnB1dERldmljZTsKKyAgICBibGFja2JvYXJkUmVhZCgmYXBwbGljYWJsZUlucHV0RGV2aWNlLCBzaXplb2YoYXBwbGljYWJsZUlucHV0RGV2aWNlKSk7CisgICAgbUFwcGxpY2FibGVJbnB1dERldmljZSA9IGFwcGxpY2FibGVJbnB1dERldmljZTsKKyAgICByZXR1cm4gbVBvbGljeVBsdWdpbkludGVyZmFjZS0+c2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UobUlkLCBtQXBwbGljYWJsZUlucHV0RGV2aWNlKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9JbnB1dFNvdXJjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0lucHV0U291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjdjNWI1MAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9JbnB1dFNvdXJjZS5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkZvcm1hdHRlZFN1YnN5c3RlbU9iamVjdC5oIgorI2luY2x1ZGUgIkluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC5oIgorI2luY2x1ZGUgIk1hcHBpbmdDb250ZXh0LmgiCisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK2NsYXNzIFBvbGljeVN1YnN5c3RlbTsKKworY2xhc3MgSW5wdXRTb3VyY2UgOiBwdWJsaWMgQ0Zvcm1hdHRlZFN1YnN5c3RlbU9iamVjdAoreworcHVibGljOgorICAgIElucHV0U291cmNlKGNvbnN0IHN0ZDo6c3RyaW5nICZtYXBwaW5nVmFsdWUsCisgICAgICAgICAgICAgQ0luc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCAqaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAorICAgICAgICAgICAgIGNvbnN0IENNYXBwaW5nQ29udGV4dCAmY29udGV4dCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIGJvb2wgcmVjZWl2ZUZyb21IVyhzdGQ6OnN0cmluZyAmZXJyb3IpOworICAgIHZpcnR1YWwgYm9vbCBzZW5kVG9IVyhzdGQ6OnN0cmluZyAmZXJyb3IpOworCitwcml2YXRlOgorICAgIGNvbnN0IFBvbGljeVN1YnN5c3RlbSAqbVBvbGljeVN1YnN5c3RlbTsgLyoqPCBSb3V0ZSBzdWJzeXRlbSBwbHVnaW4uICovCisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgdG8gY29tbXVuaWNhdGUgd2l0aCBBdWRpbyBQb2xpY3kgRW5naW5lLgorICAgICAqLworICAgIGFuZHJvaWQ6OkF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlICptUG9saWN5UGx1Z2luSW50ZXJmYWNlOworCisgICAgYXVkaW9fc291cmNlX3QgbUlkOyAvKio8IGlucHV0IHNvdXJjZSBpZGVudGlmaWVyIHRvIGxpbmsgd2l0aCBhdWRpby5oLiAqLworICAgIHVpbnQzMl90IG1BcHBsaWNhYmxlSW5wdXREZXZpY2U7IC8qKjwgYXBwbGljYWJsZSBpbnB1dCBkZXZpY2UgZm9yIHRoaXMgc3RyYXRlZ3kuICovCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IG1EZWZhdWx0QXBwbGljYWJsZUlucHV0RGV2aWNlID0gMDsgLyoqPCBkZWZhdWx0IGlucHV0IGRldmljZS4gKi8KK307CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL3JvdW5kdXAuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lNYXBwaW5nS2V5cy5oCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKc2ltaWxhcml0eSBpbmRleCA2MyUKY29weSBmcm9tIGluY2x1ZGUvbWVkaWEvbmJhaW8vcm91bmR1cC5oCmNvcHkgdG8gc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeU1hcHBpbmdLZXlzLmgKaW5kZXggNGMzY2MyNS4uNTM5NDRlOQotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL3JvdW5kdXAuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUG9saWN5TWFwcGluZ0tleXMuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDE4ICsxNCwxOSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBST1VORFVQX0gKLSNkZWZpbmUgUk9VTkRVUF9ICisjcHJhZ21hIG9uY2UKIAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgorLyoqCisgKiBNYXBwaW5nIGl0ZW0gdHlwZXMKKyAqLworZW51bSBQb2xpY3lJdGVtVHlwZQoreworICAgIE1hcHBpbmdLZXlOYW1lLAorICAgIE1hcHBpbmdLZXlDYXRlZ29yeSwKKyAgICBNYXBwaW5nS2V5SWRlbnRpZmllciwKKyAgICBNYXBwaW5nS2V5QW1lbmQxLAorICAgIE1hcHBpbmdLZXlBbWVuZDIsCisgICAgTWFwcGluZ0tleUFtZW5kMworfTsKIAotLy8gUm91bmQgdXAgdG8gdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyCi11bnNpZ25lZCByb3VuZHVwKHVuc2lnbmVkIHYpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgIC8vIFJPVU5EVVBfSAorc3RhdGljIGNvbnN0IHVpbnQ4X3QgTWFwcGluZ0tleUFtZW5kRW5kID0gTWFwcGluZ0tleUFtZW5kMzsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lTdWJzeXN0ZW0uY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeVN1YnN5c3RlbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmYzOTA2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lTdWJzeXN0ZW0uY3BwCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiUG9saWN5U3Vic3lzdGVtLmgiCisjaW5jbHVkZSAiU3Vic3lzdGVtT2JqZWN0RmFjdG9yeS5oIgorI2luY2x1ZGUgIlBvbGljeU1hcHBpbmdLZXlzLmgiCisjaW5jbHVkZSAiU3RyYXRlZ3kuaCIKKyNpbmNsdWRlICJTdHJlYW0uaCIKKyNpbmNsdWRlICJJbnB1dFNvdXJjZS5oIgorI2luY2x1ZGUgIlZvbHVtZVByb2ZpbGUuaCIKKyNpbmNsdWRlICJVc2FnZS5oIgorI2luY2x1ZGUgPEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lFbmdpbmVJbnN0YW5jZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCit1c2luZyBhbmRyb2lkOjphdWRpb19wb2xpY3k6OkVuZ2luZUluc3RhbmNlOworCitjb25zdCBjaGFyICpjb25zdCBQb2xpY3lTdWJzeXN0ZW06Om1LZXlOYW1lID0gIk5hbWUiOworY29uc3QgY2hhciAqY29uc3QgUG9saWN5U3Vic3lzdGVtOjptS2V5SWRlbnRpZmllciA9ICJJZGVudGlmaWVyIjsKK2NvbnN0IGNoYXIgKmNvbnN0IFBvbGljeVN1YnN5c3RlbTo6bUtleUNhdGVnb3J5ID0gIkNhdGVnb3J5IjsKK2NvbnN0IGNoYXIgKmNvbnN0IFBvbGljeVN1YnN5c3RlbTo6bUtleUFtZW5kMSA9ICJBbWVuZDEiOworY29uc3QgY2hhciAqY29uc3QgUG9saWN5U3Vic3lzdGVtOjptS2V5QW1lbmQyID0gIkFtZW5kMiI7Citjb25zdCBjaGFyICpjb25zdCBQb2xpY3lTdWJzeXN0ZW06Om1LZXlBbWVuZDMgPSAiQW1lbmQzIjsKKworCitjb25zdCBjaGFyICpjb25zdCBQb2xpY3lTdWJzeXN0ZW06Om1TdHJlYW1Db21wb25lbnROYW1lID0gIlN0cmVhbSI7Citjb25zdCBjaGFyICpjb25zdCBQb2xpY3lTdWJzeXN0ZW06Om1TdHJhdGVneUNvbXBvbmVudE5hbWUgPSAiU3RyYXRlZ3kiOworY29uc3QgY2hhciAqY29uc3QgUG9saWN5U3Vic3lzdGVtOjptSW5wdXRTb3VyY2VDb21wb25lbnROYW1lID0gIklucHV0U291cmNlIjsKK2NvbnN0IGNoYXIgKmNvbnN0IFBvbGljeVN1YnN5c3RlbTo6bVVzYWdlQ29tcG9uZW50TmFtZSA9ICJVc2FnZSI7Citjb25zdCBjaGFyICpjb25zdCBQb2xpY3lTdWJzeXN0ZW06Om1Wb2x1bWVQcm9maWxlQ29tcG9uZW50TmFtZSA9ICJWb2x1bWVQcm9maWxlIjsKKworUG9saWN5U3Vic3lzdGVtOjpQb2xpY3lTdWJzeXN0ZW0oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpCisgICAgOiBDU3Vic3lzdGVtKG5hbWUpLAorICAgICAgbVBsdWdpbkludGVyZmFjZShOVUxMKQoreworICAgIC8vIFRyeSB0byBjb25uZWN0IGEgUGx1Z2luIEludGVyZmFjZSBmcm9tIEF1ZGlvIFBvbGljeSBFbmdpbmUKKyAgICBFbmdpbmVJbnN0YW5jZSAqZW5naW5lSW5zdGFuY2UgPSBFbmdpbmVJbnN0YW5jZTo6Z2V0SW5zdGFuY2UoKTsKKworICAgIEFMT0dfQVNTRVJUKGVuZ2luZUluc3RhbmNlICE9IE5VTEwsICJOVUxMIFBsdWdpbiBJbnRlcmZhY2UiKTsKKworICAgIC8vIFJldHJpZXZlIHRoZSBSb3V0ZSBJbnRlcmZhY2UKKyAgICBtUGx1Z2luSW50ZXJmYWNlID0gZW5naW5lSW5zdGFuY2UtPnF1ZXJ5SW50ZXJmYWNlPGFuZHJvaWQ6OkF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlPigpOworICAgIEFMT0dfQVNTRVJUKG1QbHVnaW5JbnRlcmZhY2UgIT0gTlVMTCwgIk5VTEwgUGx1Z2luIEludGVyZmFjZSIpOworCisgICAgLy8gUHJvdmlkZSBtYXBwaW5nIGtleXMgdG8gdGhlIGNvcmUsIG5lY2Vzc2FyeSB3aGVuIHBhcnNpbmcgdGhlIFhNTCBTdHJ1Y3R1cmUgZmlsZXMuCisgICAgYWRkQ29udGV4dE1hcHBpbmdLZXkobUtleU5hbWUpOworICAgIGFkZENvbnRleHRNYXBwaW5nS2V5KG1LZXlDYXRlZ29yeSk7CisgICAgYWRkQ29udGV4dE1hcHBpbmdLZXkobUtleUlkZW50aWZpZXIpOworICAgIGFkZENvbnRleHRNYXBwaW5nS2V5KG1LZXlBbWVuZDEpOworICAgIGFkZENvbnRleHRNYXBwaW5nS2V5KG1LZXlBbWVuZDIpOworICAgIGFkZENvbnRleHRNYXBwaW5nS2V5KG1LZXlBbWVuZDMpOworCisgICAgLy8gUHJvdmlkZSBjcmVhdG9ycyB0byB1cHBlciBsYXllcgorICAgIGFkZFN1YnN5c3RlbU9iamVjdEZhY3RvcnkoCisgICAgICAgIG5ldyBUU3Vic3lzdGVtT2JqZWN0RmFjdG9yeTxTdHJlYW0+KAorICAgICAgICAgICAgbVN0cmVhbUNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICAoMSA8PCBNYXBwaW5nS2V5QW1lbmQxKSB8ICgxIDw8IE1hcHBpbmdLZXlJZGVudGlmaWVyKSkKKyAgICAgICAgKTsKKyAgICBhZGRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5KAorICAgICAgICBuZXcgVFN1YnN5c3RlbU9iamVjdEZhY3Rvcnk8U3RyYXRlZ3k+KAorICAgICAgICAgICAgbVN0cmF0ZWd5Q29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgICgxIDw8IE1hcHBpbmdLZXlBbWVuZDEpIHwgKDEgPDwgTWFwcGluZ0tleUlkZW50aWZpZXIpKQorICAgICAgICApOworICAgIGFkZFN1YnN5c3RlbU9iamVjdEZhY3RvcnkoCisgICAgICAgIG5ldyBUU3Vic3lzdGVtT2JqZWN0RmFjdG9yeTxVc2FnZT4oCisgICAgICAgICAgICBtVXNhZ2VDb21wb25lbnROYW1lLAorICAgICAgICAgICAgKDEgPDwgTWFwcGluZ0tleUFtZW5kMSkgfCAoMSA8PCBNYXBwaW5nS2V5SWRlbnRpZmllcikpCisgICAgICAgICk7CisgICAgYWRkU3Vic3lzdGVtT2JqZWN0RmFjdG9yeSgKKyAgICAgICAgbmV3IFRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5PElucHV0U291cmNlPigKKyAgICAgICAgICAgIG1JbnB1dFNvdXJjZUNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICAoMSA8PCBNYXBwaW5nS2V5QW1lbmQxKSB8ICgxIDw8IE1hcHBpbmdLZXlJZGVudGlmaWVyKSkKKyAgICAgICAgKTsKKyAgICBhZGRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5KAorICAgICAgICBuZXcgVFN1YnN5c3RlbU9iamVjdEZhY3Rvcnk8Vm9sdW1lUHJvZmlsZT4oCisgICAgICAgICAgICBtVm9sdW1lUHJvZmlsZUNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICAoMSA8PCBNYXBwaW5nS2V5QW1lbmQxKSB8ICgxIDw8IE1hcHBpbmdLZXlJZGVudGlmaWVyKSB8ICgxIDw8IE1hcHBpbmdLZXlJZGVudGlmaWVyKSkKKyAgICAgICAgKTsKK30KKworLy8gUmV0cmlldmUgUm91dGUgaW50ZXJmYWNlCithbmRyb2lkOjpBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZSAqUG9saWN5U3Vic3lzdGVtOjpnZXRQb2xpY3lQbHVnaW5JbnRlcmZhY2UoKSBjb25zdAoreworICAgIEFMT0dfQVNTRVJUKG1QbHVnaW5JbnRlcmZhY2UgIT0gTlVMTCwgIk5VTEwgUGx1Z2luIEludGVyZmFjZSIpOworICAgIHJldHVybiBtUGx1Z2luSW50ZXJmYWNlOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeVN1YnN5c3RlbS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeVN1YnN5c3RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNjMjZmZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUG9saWN5U3Vic3lzdGVtLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiU3Vic3lzdGVtLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlOworCit9CisKK2NsYXNzIFBvbGljeVN1YnN5c3RlbSA6IHB1YmxpYyBDU3Vic3lzdGVtCit7CitwdWJsaWM6CisgICAgUG9saWN5U3Vic3lzdGVtKGNvbnN0IHN0ZDo6c3RyaW5nICZzdHJOYW1lKTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIFJvdXRlIE1hbmFnZXIgaW50ZXJmYWNlLgorICAgICAqCisgICAgICogQHJldHVybiBSb3V0ZU1hbmFnZXIgaW50ZXJmYWNlIGZvciB0aGUgcm91dGUgcGx1Z2luLgorICAgICAqLworICAgIGFuZHJvaWQ6OkF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlICpnZXRQb2xpY3lQbHVnaW5JbnRlcmZhY2UoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICAvKiBDb3B5IGZhY2lsaXRpZXMgYXJlIHB1dCBwcml2YXRlIHRvIGRpc2FibGUgY29weS4gKi8KKyAgICBQb2xpY3lTdWJzeXN0ZW0oY29uc3QgUG9saWN5U3Vic3lzdGVtICZvYmplY3QpOworICAgIFBvbGljeVN1YnN5c3RlbSAmb3BlcmF0b3I9KGNvbnN0IFBvbGljeVN1YnN5c3RlbSAmb2JqZWN0KTsKKworICAgIGFuZHJvaWQ6OkF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlICptUGx1Z2luSW50ZXJmYWNlOyAvKio8IEF1ZGlvIFBvbGljeSBQbHVnaW4gSW50ZXJmYWNlLiAqLworCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1LZXlOYW1lOyAvKio8IG5hbWUga2V5IG1hcHBpbmcgc3RyaW5nLiAqLworICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtS2V5SWRlbnRpZmllcjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbUtleUNhdGVnb3J5OworCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1LZXlBbWVuZDE7IC8qKjwgYW1lbmQxIGtleSBtYXBwaW5nIHN0cmluZy4gKi8KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbUtleUFtZW5kMjsgLyoqPCBhbWVuZDIga2V5IG1hcHBpbmcgc3RyaW5nLiAqLworICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtS2V5QW1lbmQzOyAvKio8IGFtZW5kMyBrZXkgbWFwcGluZyBzdHJpbmcuICovCisKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbVN0cmVhbUNvbXBvbmVudE5hbWU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1TdHJhdGVneUNvbXBvbmVudE5hbWU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1JbnB1dFNvdXJjZUNvbXBvbmVudE5hbWU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1Vc2FnZUNvbXBvbmVudE5hbWU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1Wb2x1bWVQcm9maWxlQ29tcG9uZW50TmFtZTsKK307CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUG9saWN5U3Vic3lzdGVtQnVpbGRlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUG9saWN5U3Vic3lzdGVtQnVpbGRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjE0ZDQ0NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lTdWJzeXN0ZW1CdWlsZGVyLmNwcApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlN1YnN5c3RlbUxpYnJhcnkuaCIKKyNpbmNsdWRlICJOYW1lZEVsZW1lbnRCdWlsZGVyVGVtcGxhdGUuaCIKKyNpbmNsdWRlICJQb2xpY3lTdWJzeXN0ZW0uaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IFBPTElDWV9TVUJTWVNURU1fTkFNRSA9ICJQb2xpY3kiOworZXh0ZXJuICJDIgorewordm9pZCBnZXRQT0xJQ1lTdWJzeXN0ZW1CdWlsZGVyKENTdWJzeXN0ZW1MaWJyYXJ5ICpzdWJzeXN0ZW1MaWJyYXJ5KQoreworICAgIHN1YnN5c3RlbUxpYnJhcnktPmFkZEVsZW1lbnRCdWlsZGVyKFBPTElDWV9TVUJTWVNURU1fTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVE5hbWVkRWxlbWVudEJ1aWxkZXJUZW1wbGF0ZTxQb2xpY3lTdWJzeXN0ZW0+KCkpOworfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmF0ZWd5LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJhdGVneS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTg0ODgxMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJhdGVneS5jcHAKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJTdHJhdGVneS5oIgorI2luY2x1ZGUgIlBvbGljeU1hcHBpbmdLZXlzLmgiCisjaW5jbHVkZSAiUG9saWN5U3Vic3lzdGVtLmgiCisKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgYW5kcm9pZDo6cm91dGluZ19zdHJhdGVneTsKKworU3RyYXRlZ3k6OlN0cmF0ZWd5KGNvbnN0IHN0cmluZyAmbWFwcGluZ1ZhbHVlLAorICAgICAgICAgICAgICAgICAgIENJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQgKmluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDTWFwcGluZ0NvbnRleHQgJmNvbnRleHQpCisgICAgOiBDRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0KGluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZ1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nS2V5QW1lbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWFwcGluZ0tleUFtZW5kRW5kIC0gTWFwcGluZ0tleUFtZW5kMSArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0KSwKKyAgICAgIG1Qb2xpY3lTdWJzeXN0ZW0oc3RhdGljX2Nhc3Q8Y29uc3QgUG9saWN5U3Vic3lzdGVtICo+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LT5nZXRCZWxvbmdpbmdTdWJzeXN0ZW0oKSkpLAorICAgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZShtUG9saWN5U3Vic3lzdGVtLT5nZXRQb2xpY3lQbHVnaW5JbnRlcmZhY2UoKSksCisgICAgICBtQXBwbGljYWJsZU91dHB1dERldmljZShtRGVmYXVsdEFwcGxpY2FibGVPdXRwdXREZXZpY2UpCit7CisgICAgbUlkID0gc3RhdGljX2Nhc3Q8cm91dGluZ19zdHJhdGVneT4oY29udGV4dC5nZXRJdGVtQXNJbnRlZ2VyKE1hcHBpbmdLZXlJZGVudGlmaWVyKSk7CisKKyAgICAvLyBEZWNsYXJlcyB0aGUgc3RyYXRlZ3kgdG8gYXVkaW8gcG9saWN5IGVuZ2luZQorICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPmFkZFN0cmF0ZWd5KGdldEZvcm1hdHRlZE1hcHBpbmdWYWx1ZSgpLCBtSWQpOworfQorCitib29sIFN0cmF0ZWd5OjpyZWNlaXZlRnJvbUhXKHN0cmluZyAmIC8qZXJyb3IqLykKK3sKKyAgICBibGFja2JvYXJkV3JpdGUoJm1BcHBsaWNhYmxlT3V0cHV0RGV2aWNlLCBzaXplb2YobUFwcGxpY2FibGVPdXRwdXREZXZpY2UpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTdHJhdGVneTo6c2VuZFRvSFcoc3RyaW5nICYgLyplcnJvciovKQoreworICAgIHVpbnQzMl90IGFwcGxpY2FibGVPdXRwdXREZXZpY2U7CisgICAgYmxhY2tib2FyZFJlYWQoJmFwcGxpY2FibGVPdXRwdXREZXZpY2UsIHNpemVvZihhcHBsaWNhYmxlT3V0cHV0RGV2aWNlKSk7CisgICAgcmV0dXJuIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPnNldERldmljZUZvclN0cmF0ZWd5KG1JZCwgYXBwbGljYWJsZU91dHB1dERldmljZSk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyYXRlZ3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJhdGVneS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlhOWIzZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyYXRlZ3kuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QuaCIKKyNpbmNsdWRlICJJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQuaCIKKyNpbmNsdWRlICJNYXBwaW5nQ29udGV4dC5oIgorI2luY2x1ZGUgPEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCitjbGFzcyBQb2xpY3lTdWJzeXN0ZW07CisKK2NsYXNzIFN0cmF0ZWd5IDogcHVibGljIENGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QKK3sKK3B1YmxpYzoKKyAgICBTdHJhdGVneShjb25zdCBzdGQ6OnN0cmluZyAmbWFwcGluZ1ZhbHVlLAorICAgICAgICAgICAgIENJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQgKmluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKKyAgICAgICAgICAgICBjb25zdCBDTWFwcGluZ0NvbnRleHQgJmNvbnRleHQpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCBib29sIHJlY2VpdmVGcm9tSFcoc3RkOjpzdHJpbmcgJmVycm9yKTsKKyAgICB2aXJ0dWFsIGJvb2wgc2VuZFRvSFcoc3RkOjpzdHJpbmcgJmVycm9yKTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBQb2xpY3lTdWJzeXN0ZW0gKm1Qb2xpY3lTdWJzeXN0ZW07IC8qKjwgUm91dGUgc3Vic3l0ZW0gcGx1Z2luLiAqLworCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIHRvIGNvbW11bmljYXRlIHdpdGggQXVkaW8gUG9saWN5IEVuZ2luZS4KKyAgICAgKi8KKyAgICBhbmRyb2lkOjpBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZSAqbVBvbGljeVBsdWdpbkludGVyZmFjZTsKKworICAgIGFuZHJvaWQ6OnJvdXRpbmdfc3RyYXRlZ3kgbUlkOyAvKio8IHN0cmF0ZWd5IGlkZW50aWZpZXIgdG8gbGluayB3aXRoIGF1ZGlvLmguKi8KKyAgICB1aW50MzJfdCBtQXBwbGljYWJsZU91dHB1dERldmljZTsgLyoqPCBhcHBsaWNhYmxlIG91dHB1dCBkZXZpY2UgZm9yIHRoaXMgc3RyYXRlZ3kuICovCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IG1EZWZhdWx0QXBwbGljYWJsZU91dHB1dERldmljZSA9IDA7IC8qKjwgZGVmYXVsdCBvdXRwdXQgZGV2aWNlLiAqLworfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJlYW0uY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTc1YjBiYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJlYW0uY3BwCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiU3RyZWFtLmgiCisjaW5jbHVkZSAiUG9saWN5TWFwcGluZ0tleXMuaCIKKyNpbmNsdWRlICJQb2xpY3lTdWJzeXN0ZW0uaCIKKwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBhbmRyb2lkOjpyb3V0aW5nX3N0cmF0ZWd5OworCitTdHJlYW06OlN0cmVhbShjb25zdCBzdHJpbmcgJm1hcHBpbmdWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICBDSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICppbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ01hcHBpbmdDb250ZXh0ICZjb250ZXh0KQorICAgIDogQ0Zvcm1hdHRlZFN1YnN5c3RlbU9iamVjdChpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZ0tleUFtZW5kMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1hcHBpbmdLZXlBbWVuZEVuZCAtIE1hcHBpbmdLZXlBbWVuZDEgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCksCisgICAgICBtUG9saWN5U3Vic3lzdGVtKHN0YXRpY19jYXN0PGNvbnN0IFBvbGljeVN1YnN5c3RlbSAqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC0+Z2V0QmVsb25naW5nU3Vic3lzdGVtKCkpKSwKKyAgICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UobVBvbGljeVN1YnN5c3RlbS0+Z2V0UG9saWN5UGx1Z2luSW50ZXJmYWNlKCkpLAorICAgICAgbUFwcGxpY2FibGVTdHJhdGVneShtRGVmYXVsdEFwcGxpY2FibGVTdHJhdGVneSkKK3sKKyAgICBtSWQgPSBzdGF0aWNfY2FzdDxhdWRpb19zdHJlYW1fdHlwZV90Pihjb250ZXh0LmdldEl0ZW1Bc0ludGVnZXIoTWFwcGluZ0tleUlkZW50aWZpZXIpKTsKKworICAgIC8vIERlY2xhcmVzIHRoZSBzdHJhdGVneSB0byBhdWRpbyBwb2xpY3kgZW5naW5lCisgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+YWRkU3RyZWFtKGdldEZvcm1hdHRlZE1hcHBpbmdWYWx1ZSgpLCBtSWQpOworfQorCitib29sIFN0cmVhbTo6cmVjZWl2ZUZyb21IVyhzdHJpbmcgJiAvKmVycm9yKi8pCit7CisgICAgYmxhY2tib2FyZFdyaXRlKCZtQXBwbGljYWJsZVN0cmF0ZWd5LCBzaXplb2YobUFwcGxpY2FibGVTdHJhdGVneSkpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFN0cmVhbTo6c2VuZFRvSFcoc3RyaW5nICYgLyplcnJvciovKQoreworICAgIHVpbnQzMl90IGFwcGxpY2FibGVTdHJhdGVneTsKKyAgICBibGFja2JvYXJkUmVhZCgmYXBwbGljYWJsZVN0cmF0ZWd5LCBzaXplb2YoYXBwbGljYWJsZVN0cmF0ZWd5KSk7CisgICAgbUFwcGxpY2FibGVTdHJhdGVneSA9IGFwcGxpY2FibGVTdHJhdGVneTsKKyAgICByZXR1cm4gbVBvbGljeVBsdWdpbkludGVyZmFjZS0+c2V0U3RyYXRlZ3lGb3JTdHJlYW0obUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHJvdXRpbmdfc3RyYXRlZ3k+KG1BcHBsaWNhYmxlU3RyYXRlZ3kpKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJlYW0uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZDkwYzM2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmVhbS5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkZvcm1hdHRlZFN1YnN5c3RlbU9iamVjdC5oIgorI2luY2x1ZGUgIkluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC5oIgorI2luY2x1ZGUgIk1hcHBpbmdDb250ZXh0LmgiCisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK2NsYXNzIFBvbGljeVN1YnN5c3RlbTsKKworY2xhc3MgU3RyZWFtIDogcHVibGljIENGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QKK3sKK3B1YmxpYzoKKyAgICBTdHJlYW0oY29uc3Qgc3RkOjpzdHJpbmcgJm1hcHBpbmdWYWx1ZSwKKyAgICAgICAgICAgICBDSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICppbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCisgICAgICAgICAgICAgY29uc3QgQ01hcHBpbmdDb250ZXh0ICZjb250ZXh0KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgYm9vbCByZWNlaXZlRnJvbUhXKHN0ZDo6c3RyaW5nICZlcnJvcik7CisgICAgdmlydHVhbCBib29sIHNlbmRUb0hXKHN0ZDo6c3RyaW5nICZlcnJvcik7CisKK3ByaXZhdGU6CisgICAgY29uc3QgUG9saWN5U3Vic3lzdGVtICptUG9saWN5U3Vic3lzdGVtOyAvKio8IFJvdXRlIHN1YnN5dGVtIHBsdWdpbi4gKi8KKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSB0byBjb21tdW5pY2F0ZSB3aXRoIEF1ZGlvIFBvbGljeSBFbmdpbmUuCisgICAgICovCisgICAgYW5kcm9pZDo6QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgKm1Qb2xpY3lQbHVnaW5JbnRlcmZhY2U7CisKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1JZDsgLyoqPCBzdHJlYW0gdHlwZSBpZGVudGlmaWVyIHRvIGxpbmsgd2l0aCBhdWRpby5oLiAqLworICAgIHVpbnQzMl90IG1BcHBsaWNhYmxlU3RyYXRlZ3k7IC8qKjwgYXBwbGljYWJsZSBzdHJhdGVneSBmb3IgdGhpcyBzdHJlYW0uICovCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IG1EZWZhdWx0QXBwbGljYWJsZVN0cmF0ZWd5ID0gMDsgLyoqPCBkZWZhdWx0IHN0cmF0ZWd5LiAqLworfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Vc2FnZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vVXNhZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE5MTZiOWIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vVXNhZ2UuY3BwCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiVXNhZ2UuaCIKKyNpbmNsdWRlICJQb2xpY3lNYXBwaW5nS2V5cy5oIgorI2luY2x1ZGUgIlBvbGljeVN1YnN5c3RlbS5oIgorCit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIGFuZHJvaWQ6OnJvdXRpbmdfc3RyYXRlZ3k7CisKK1VzYWdlOjpVc2FnZShjb25zdCBzdHJpbmcgJm1hcHBpbmdWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICBDSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICppbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ01hcHBpbmdDb250ZXh0ICZjb250ZXh0KQorICAgIDogQ0Zvcm1hdHRlZFN1YnN5c3RlbU9iamVjdChpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZ0tleUFtZW5kMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1hcHBpbmdLZXlBbWVuZEVuZCAtIE1hcHBpbmdLZXlBbWVuZDEgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCksCisgICAgICBtUG9saWN5U3Vic3lzdGVtKHN0YXRpY19jYXN0PGNvbnN0IFBvbGljeVN1YnN5c3RlbSAqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC0+Z2V0QmVsb25naW5nU3Vic3lzdGVtKCkpKSwKKyAgICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UobVBvbGljeVN1YnN5c3RlbS0+Z2V0UG9saWN5UGx1Z2luSW50ZXJmYWNlKCkpLAorICAgICAgbUFwcGxpY2FibGVTdHJhdGVneShtRGVmYXVsdEFwcGxpY2FibGVTdHJhdGVneSkKK3sKKyAgICBtSWQgPSBzdGF0aWNfY2FzdDxhdWRpb191c2FnZV90Pihjb250ZXh0LmdldEl0ZW1Bc0ludGVnZXIoTWFwcGluZ0tleUlkZW50aWZpZXIpKTsKKworICAgIC8vIERlY2xhcmVzIHRoZSBzdHJhdGVneSB0byBhdWRpbyBwb2xpY3kgZW5naW5lCisgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+YWRkVXNhZ2UoZ2V0Rm9ybWF0dGVkTWFwcGluZ1ZhbHVlKCksIG1JZCk7Cit9CisKK2Jvb2wgVXNhZ2U6OnJlY2VpdmVGcm9tSFcoc3RyaW5nICYgLyplcnJvciovKQoreworICAgIGJsYWNrYm9hcmRXcml0ZSgmbUFwcGxpY2FibGVTdHJhdGVneSwgc2l6ZW9mKG1BcHBsaWNhYmxlU3RyYXRlZ3kpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBVc2FnZTo6c2VuZFRvSFcoc3RyaW5nICYgLyplcnJvciovKQoreworICAgIHVpbnQzMl90IGFwcGxpY2FibGVTdHJhdGVneTsKKyAgICBibGFja2JvYXJkUmVhZCgmYXBwbGljYWJsZVN0cmF0ZWd5LCBzaXplb2YoYXBwbGljYWJsZVN0cmF0ZWd5KSk7CisgICAgbUFwcGxpY2FibGVTdHJhdGVneSA9IGFwcGxpY2FibGVTdHJhdGVneTsKKyAgICByZXR1cm4gbVBvbGljeVBsdWdpbkludGVyZmFjZS0+c2V0U3RyYXRlZ3lGb3JVc2FnZShtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8cm91dGluZ19zdHJhdGVneT4obUFwcGxpY2FibGVTdHJhdGVneSkpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1VzYWdlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vVXNhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZTliNjM4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1VzYWdlLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0LmgiCisjaW5jbHVkZSAiSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LmgiCisjaW5jbHVkZSAiTWFwcGluZ0NvbnRleHQuaCIKKyNpbmNsdWRlIDxBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworY2xhc3MgUG9saWN5U3Vic3lzdGVtOworCitjbGFzcyBVc2FnZSA6IHB1YmxpYyBDRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0Cit7CitwdWJsaWM6CisgICAgVXNhZ2UoY29uc3Qgc3RkOjpzdHJpbmcgJm1hcHBpbmdWYWx1ZSwKKyAgICAgICAgICAgICBDSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICppbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCisgICAgICAgICAgICAgY29uc3QgQ01hcHBpbmdDb250ZXh0ICZjb250ZXh0KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgYm9vbCByZWNlaXZlRnJvbUhXKHN0ZDo6c3RyaW5nICZlcnJvcik7CisgICAgdmlydHVhbCBib29sIHNlbmRUb0hXKHN0ZDo6c3RyaW5nICZlcnJvcik7CisKK3ByaXZhdGU6CisgICAgY29uc3QgUG9saWN5U3Vic3lzdGVtICptUG9saWN5U3Vic3lzdGVtOyAvKio8IFJvdXRlIHN1YnN5dGVtIHBsdWdpbi4gKi8KKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSB0byBjb21tdW5pY2F0ZSB3aXRoIEF1ZGlvIFBvbGljeSBFbmdpbmUuCisgICAgICovCisgICAgYW5kcm9pZDo6QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgKm1Qb2xpY3lQbHVnaW5JbnRlcmZhY2U7CisKKyAgICBhdWRpb191c2FnZV90IG1JZDsgLyoqPCB1c2FnZSBpZGVudGlmaWVyIHRvIGxpbmsgd2l0aCBhdWRpby5oLiAqLworICAgIHVpbnQzMl90IG1BcHBsaWNhYmxlU3RyYXRlZ3k7IC8qKjwgYXBwbGljYWJsZSBzdHJhdGVneSBmb3IgdGhpcyB1c2FnZS4gKi8KKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgbURlZmF1bHRBcHBsaWNhYmxlU3RyYXRlZ3kgPSAwOyAvKio8IGRlZmF1bHQgc3RyYXRlZ3kuICovCit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1ZvbHVtZVByb2ZpbGUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1ZvbHVtZVByb2ZpbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVjMTU1YzgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vVm9sdW1lUHJvZmlsZS5jcHAKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJWb2x1bWVQcm9maWxlLmgiCisjaW5jbHVkZSAiUG9saWN5TWFwcGluZ0tleXMuaCIKKyNpbmNsdWRlICJQb2xpY3lTdWJzeXN0ZW0uaCIKKyNpbmNsdWRlICJQYXJhbWV0ZXJCbG9ja1R5cGUuaCIKKyNpbmNsdWRlIDxWb2x1bWUuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKK3VzaW5nIHN0ZDo6c3RyaW5nOworCitWb2x1bWVQcm9maWxlOjpWb2x1bWVQcm9maWxlKGNvbnN0IHN0cmluZyAmbWFwcGluZ1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICppbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENNYXBwaW5nQ29udGV4dCAmY29udGV4dCkKKyAgICA6IENGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QoaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmdLZXlBbWVuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNYXBwaW5nS2V5QW1lbmRFbmQgLSBNYXBwaW5nS2V5QW1lbmQxICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQpLAorICAgICAgbVBvbGljeVN1YnN5c3RlbShzdGF0aWNfY2FzdDxjb25zdCBQb2xpY3lTdWJzeXN0ZW0gKj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQtPmdldEJlbG9uZ2luZ1N1YnN5c3RlbSgpKSksCisgICAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlKG1Qb2xpY3lTdWJzeXN0ZW0tPmdldFBvbGljeVBsdWdpbkludGVyZmFjZSgpKQoreworICAgIHVpbnQzMl90IGNhdGVnb3J5S2V5ID0gY29udGV4dC5nZXRJdGVtQXNJbnRlZ2VyKE1hcHBpbmdLZXlDYXRlZ29yeSk7CisgICAgaWYgKGNhdGVnb3J5S2V5ID49IFZvbHVtZTo6REVWSUNFX0NBVEVHT1JZX0NOVCkgeworICAgICAgICBtQ2F0ZWdvcnkgPSBWb2x1bWU6OkRFVklDRV9DQVRFR09SWV9TUEVBS0VSOworICAgIH0gZWxzZSB7CisgICAgICAgIG1DYXRlZ29yeSA9IHN0YXRpY19jYXN0PFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5PihjYXRlZ29yeUtleSk7CisgICAgfQorICAgIG1JZCA9IHN0YXRpY19jYXN0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGNvbnRleHQuZ2V0SXRlbUFzSW50ZWdlcihNYXBwaW5nS2V5SWRlbnRpZmllcikpOworCisgICAgLy8gKG5vIGV4Y2VwdGlvbiBzdXBwb3J0LCBkZWZlciB0aGUgZXJyb3IpCisgICAgaWYgKGluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC0+Z2V0VHlwZSgpICE9IENJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQ6OkVQYXJhbWV0ZXJCbG9jaykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIEdldCBhY3R1YWwgZWxlbWVudCB0eXBlCisgICAgY29uc3QgQ1BhcmFtZXRlckJsb2NrVHlwZSAqcGFyYW1ldGVyVHlwZSA9IHN0YXRpY19jYXN0PGNvbnN0IENQYXJhbWV0ZXJCbG9ja1R5cGUgKj4oCisgICAgICAgICAgICAgICAgaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LT5nZXRUeXBlRWxlbWVudCgpKTsKKyAgICBtUG9pbnRzID0gcGFyYW1ldGVyVHlwZS0+Z2V0QXJyYXlMZW5ndGgoKTsKK30KKworYm9vbCBWb2x1bWVQcm9maWxlOjpyZWNlaXZlRnJvbUhXKHN0cmluZyAmIC8qZXJyb3IqLykKK3sKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBWb2x1bWVQcm9maWxlOjpzZW5kVG9IVyhzdHJpbmcgJiAvKmVycm9yKi8pCit7CisgICAgUG9pbnQgcG9pbnRzW21Qb2ludHNdOworICAgIGJsYWNrYm9hcmRSZWFkKCZwb2ludHMsIHNpemVvZihQb2ludCkgKiBtUG9pbnRzKTsKKworICAgIFZvbHVtZUN1cnZlUG9pbnRzIHBvaW50c1ZlY3RvcjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Qb2ludHM7IGkrKykgeworICAgICAgICBWb2x1bWVDdXJ2ZVBvaW50IGN1cnZlUG9pbnQ7CisgICAgICAgIGN1cnZlUG9pbnQubUluZGV4ID0gcG9pbnRzW2ldLmluZGV4OworICAgICAgICBjdXJ2ZVBvaW50Lm1EQkF0dGVudWF0aW9uID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHBvaW50c1tpXS5kYkF0dGVudWF0aW9uKSAvCisgICAgICAgICAgICAgICAgKDFVTCA8PCBnRnJhY3Rpb25hbCk7CisgICAgICAgIHBvaW50c1ZlY3Rvci5wdXNoX2JhY2soY3VydmVQb2ludCk7CisgICAgfQorICAgIHJldHVybiBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5zZXRWb2x1bWVQcm9maWxlRm9yU3RyZWFtKG1JZCwgbUNhdGVnb3J5LCBwb2ludHNWZWN0b3IpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1ZvbHVtZVByb2ZpbGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Wb2x1bWVQcm9maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTAwYWU4NAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Wb2x1bWVQcm9maWxlLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0LmgiCisjaW5jbHVkZSAiSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LmgiCisjaW5jbHVkZSAiTWFwcGluZ0NvbnRleHQuaCIKKyNpbmNsdWRlIDxWb2x1bWUuaD4KKyNpbmNsdWRlIDxBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworY2xhc3MgUG9saWN5U3Vic3lzdGVtOworCitjbGFzcyBWb2x1bWVQcm9maWxlIDogcHVibGljIENGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QKK3sKK3ByaXZhdGU6CisgICAgc3RydWN0IFBvaW50CisgICAgeworICAgICAgICBpbnQgaW5kZXg7CisgICAgICAgIC8qKiBWb2x1bWUgaXMgdXNpbmcgRml4ZWRQb2ludFBhcmFtZXRlciB1bnRpbCBmbG9hdCBwYXJhbWV0ZXJzIGFyZSBhdmFpbGFibGUuICovCisgICAgICAgIGludDE2X3QgZGJBdHRlbnVhdGlvbjsKKyAgICB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitwdWJsaWM6CisgICAgVm9sdW1lUHJvZmlsZShjb25zdCBzdGQ6OnN0cmluZyAmbWFwcGluZ1ZhbHVlLAorICAgICAgICAgICAgICAgICAgQ0luc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCAqaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgY29uc3QgQ01hcHBpbmdDb250ZXh0ICZjb250ZXh0KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgYm9vbCByZWNlaXZlRnJvbUhXKHN0ZDo6c3RyaW5nICZlcnJvcik7CisgICAgdmlydHVhbCBib29sIHNlbmRUb0hXKHN0ZDo6c3RyaW5nICZlcnJvcik7CisKK3ByaXZhdGU6CisgICAgY29uc3QgUG9saWN5U3Vic3lzdGVtICptUG9saWN5U3Vic3lzdGVtOyAvKio8IFJvdXRlIHN1YnN5dGVtIHBsdWdpbi4gKi8KKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSB0byBjb21tdW5pY2F0ZSB3aXRoIEF1ZGlvIFBvbGljeSBFbmdpbmUuCisgICAgICovCisgICAgYW5kcm9pZDo6QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgKm1Qb2xpY3lQbHVnaW5JbnRlcmZhY2U7CisKKyAgICAvKioKKyAgICAgKiB2b2x1bWUgcHJvZmlsZSBpZGVudGlmaWVyLCAgd2hpY2ggaXMgaW4gZmFjdCBhIHN0cmVhbSB0eXBlIHRvIGxpbmsgd2l0aCBhdWRpby5oLgorICAgICAqLworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbUlkOworCisgICAgc2l6ZV90IG1Qb2ludHM7CisgICAgVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgbUNhdGVnb3J5OworCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGdGcmFjdGlvbmFsID0gODsgLyoqPCBCZXdhcmUgdG8gYWxpZ24gd2l0aCB0aGUgc3RydWN0dXJlLiAqLworfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvQ29sbGVjdGlvbi5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Db2xsZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGYxN2IxNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvQ29sbGVjdGlvbi5oCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJFbGVtZW50LmgiCisjaW5jbHVkZSAiU3RyZWFtLmgiCisjaW5jbHVkZSAiU3RyYXRlZ3kuaCIKKyNpbmNsdWRlICJVc2FnZS5oIgorI2luY2x1ZGUgIklucHV0U291cmNlLmgiCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGFuZHJvaWQKK3sKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kKK3sKKworLyoqCisgKiBDb2xsZWN0aW9uIG9mIHBvbGljeSBlbGVtZW50IGFzIGEgbWFwIGluZGV4ZWQgd2l0aCBhIHRoZWlyIFVJRCB0eXBlLgorICoKKyAqIEB0cGFyYW0gS2V5IHR5cGUgb2YgdGhlIHBvbGljeSBlbGVtZW50IGluZGV4aW5nIHRoZSBjb2xsZWN0aW9uLgorICogICAgICAgICBQb2xpY3kgRWxlbWVudCBzdXBwb3J0ZWQgYXJlOgorICogICAgICAgICAgICAgICAgICAgICAgLSBTdHJhdGVneQorICogICAgICAgICAgICAgICAgICAgICAgLSBTdHJlYW0KKyAqICAgICAgICAgICAgICAgICAgICAgIC0gSW5wdXRTb3VyY2UKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gVXNhZ2UuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXk+CitjbGFzcyBDb2xsZWN0aW9uIDogcHVibGljIHN0ZDo6bWFwPEtleSwgRWxlbWVudDxLZXk+ICo+Cit7Citwcml2YXRlOgorICAgIHR5cGVkZWYgRWxlbWVudDxLZXk+IFQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Om1hcDxLZXksIFQgKj46Oml0ZXJhdG9yIENvbGxlY3Rpb25JdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6bWFwPEtleSwgVCAqPjo6Y29uc3RfaXRlcmF0b3IgQ29sbGVjdGlvbkNvbnN0SXRlcmF0b3I7CisKK3B1YmxpYzoKKyAgICBDb2xsZWN0aW9uKCkKKyAgICB7CisgICAgICAgIGNvbGxlY3Rpb25TdXBwb3J0ZWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBwb2xpY3kgZWxlbWVudCB0byB0aGUgY29sbGVjdGlvbi4gUG9saWN5IGVsZW1lbnRzIGFyZSBzdHJlYW1zLCBzdHJhdGVnaWVzLCBpbnB1dAorICAgICAqIHNvdXJjZXMsIC4uLiBDb21waWxlIHRpbWUgZXJyb3IgZ2VuZXJhdGVkIGlmIGNhbGxlZCB3aXRoIG5vdCBzdXBwb3J0ZWQgY29sbGVjdGlvbi4KKyAgICAgKiBJdCBhbHNvIHNldCB0aGUga2V5IGFzIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcG9saWN5IGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAdHBhcmFtIEtleSBpbmRleGluZyB0aGUgY29sbGVjdGlvbiBvZiBwb2xpY3kgZWxlbWVudC4KKyAgICAgKiBAcGFyYW1baW5dIG5hbWUgb2YgdGhlIHBvbGljeSBlbGVtZW50IHRvIGZpbmQuCisgICAgICogQHBhcmFtW2luXSBrZXkgdG8gYmUgdXNlZCB0byBpbmRleCB0aGlzIG5ldyBwb2xpY3kgZWxlbWVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIHBvbGljeSBlbGVtZW50IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBhZGRlZCB0byB0aGUgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBhZGQoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIEtleSBrZXkpCisgICAgeworICAgICAgICBpZiAoKCp0aGlzKS5maW5kKGtleSkgIT0gKCp0aGlzKS5lbmQoKSkgeworICAgICAgICAgICAgQUxPR1coIiVzOiBlbGVtZW50ICVzIGFscmVhZHkgYWRkZWQiLCBfX0ZVTkNUSU9OX18sIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgICgqdGhpcylba2V5XSA9IG5ldyBUKG5hbWUpOworICAgICAgICBBTE9HRCgiJXM6IGFkZGluZyBlbGVtZW50ICVzIHRvIGNvbGxlY3Rpb24iLCBfX0ZVTkNUSU9OX18sIG5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiAoKnRoaXMpW2tleV0tPnNldElkZW50aWZpZXIoa2V5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBwb2xpY3kgZWxlbWVudCBmcm9tIHRoZSBjb2xsZWN0aW9uIGJ5IGl0cyBrZXkuIFBvbGljeSBlbGVtZW50cyBhcmUgc3RyZWFtcywgc3RyYXRlZ2llcywKKyAgICAgKiBpbnB1dCBzb3VyY2VzLCAuLi4gQ29tcGlsZSB0aW1lIGVycm9yIGdlbmVyYXRlZCBpZiBjYWxsZWQgd2l0aCBub3Qgc3VwcG9ydGVkIGNvbGxlY3Rpb24uCisgICAgICoKKyAgICAgKiBAdHBhcmFtIEtleSBpbmRleGluZyB0aGUgY29sbGVjdGlvbiBvZiBwb2xpY3kgZWxlbWVudC4KKyAgICAgKiBAcGFyYW1baW5dIGtleSBvZiB0aGUgcG9saWN5IGVsZW1lbnQgdG8gZmluZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdmFsaWQgcG9pbnRlciBvbiBwb2xpY3kgZWxlbWVudCBpZiBmb3VuZCwgTlVMTCBvdGhlcndpc2UuCisgICAgICovCisgICAgVCAqZ2V0KEtleSBrZXkpIGNvbnN0CisgICAgeworICAgICAgICBDb2xsZWN0aW9uQ29uc3RJdGVyYXRvciBpdCA9ICgqdGhpcykuZmluZChrZXkpOworICAgICAgICByZXR1cm4gKGl0ID09ICgqdGhpcykuZW5kKCkpID8gTlVMTCA6IGl0LT5zZWNvbmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCBhIHBvbGljeSBlbGVtZW50IGZyb20gdGhlIGNvbGxlY3Rpb24gYnkgaXRzIG5hbWUuIFBvbGljeSBlbGVtZW50cyBhcmUgc3RyZWFtcywKKyAgICAgKiBzdHJhdGVnaWVzLCBpbnB1dCBzb3VyY2VzLCAuLi4KKyAgICAgKiBDb21waWxlIHRpbWUgZXJyb3IgZ2VuZXJhdGVkIGlmIGNhbGxlZCB3aXRoIG5vdCBzdXBwb3J0ZWQgY29sbGVjdGlvbi4KKyAgICAgKgorICAgICAqIEB0cGFyYW0gS2V5IGluZGV4aW5nIHRoZSBjb2xsZWN0aW9uIG9mIHBvbGljeSBlbGVtZW50LgorICAgICAqIEBwYXJhbVtpbl0gbmFtZSBvZiB0aGUgcG9saWN5IGVsZW1lbnQgdG8gZmluZC4KKyAgICAgKiBAcGFyYW1baW5dIGVsZW1lbnRzTWFwIG1hcHMgb2YgcG9saWN5IGVsZW1lbnRzIHRvIHNlYXJjaCBpbnRvLgorICAgICAqCisgICAgICogQHJldHVybiB2YWxpZCBwb2ludGVyIG9uIGVsZW1lbnQgaWYgZm91bmQsIE5VTEwgb3RoZXJ3aXNlLgorICAgICAqLworICAgIFQgKmZpbmRCeU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIGNvbnN0CisgICAgeworCisgICAgICAgIENvbGxlY3Rpb25Db25zdEl0ZXJhdG9yIGl0OworICAgICAgICBmb3IgKGl0ID0gKCp0aGlzKS5iZWdpbigpOyBpdCAhPSAoKnRoaXMpLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBUICplbGVtZW50ID0gaXQtPnNlY29uZDsKKyAgICAgICAgICAgIGlmIChlbGVtZW50LT5nZXROYW1lKCkgPT0gbmFtZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYWxsIHRoZSBlbGVtZW50cyBmcm9tIHRoZSBsaXN0IGFuZCBkZXN0cm95IHRoZW0uCisgICAgICovCisgICAgdm9pZCBjbGVhcigpCisgICAgeworICAgICAgICBDb2xsZWN0aW9uSXRlcmF0b3IgaXQ7CisgICAgICAgIGZvciAoaXQgPSAoKnRoaXMpLmJlZ2luKCk7IGl0ICE9ICgqdGhpcykuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBpdC0+c2Vjb25kOworICAgICAgICB9CisgICAgICAgICgqdGhpcykuY2xlYXIoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogcHJvdmlkZSBhIGNvbXBpbGUgdGltZSBlcnJvciBpZiBubyBzcGVjaWFsaXphdGlvbiBpcyBwcm92aWRlZCBmb3IgYSBnaXZlbiB0eXBlLgorICAgICAqCisgICAgICogQHRwYXJhbSBUOiB0eXBlIG9mIHRoZSBwb2xpY3lFbGVtZW50LiBQb2xpY3kgRWxlbWVudCBzdXBwb3J0ZWQgYXJlOgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIC0gU3RyYXRlZ3kKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAtIFN0cmVhbQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIC0gSW5wdXRTb3VyY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAtIFVzYWdlLgorICAgICAqLworICAgIHN0cnVjdCBjb2xsZWN0aW9uU3VwcG9ydGVkOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBDb2xsZWN0aW9uPGF1ZGlvX3N0cmVhbV90eXBlX3Q+Ojpjb2xsZWN0aW9uU3VwcG9ydGVkIHt9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBDb2xsZWN0aW9uPHN0ZDo6c3RyaW5nPjo6Y29sbGVjdGlvblN1cHBvcnRlZCB7fTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgQ29sbGVjdGlvbjxhdWRpb191c2FnZV90Pjo6Y29sbGVjdGlvblN1cHBvcnRlZCB7fTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgQ29sbGVjdGlvbjxhdWRpb19zb3VyY2VfdD46OmNvbGxlY3Rpb25TdXBwb3J0ZWQge307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IENvbGxlY3Rpb248cm91dGluZ19zdHJhdGVneT46OmNvbGxlY3Rpb25TdXBwb3J0ZWQge307CisKK3R5cGVkZWYgQ29sbGVjdGlvbjxyb3V0aW5nX3N0cmF0ZWd5PiBTdHJhdGVneUNvbGxlY3Rpb247Cit0eXBlZGVmIENvbGxlY3Rpb248YXVkaW9fc3RyZWFtX3R5cGVfdD4gU3RyZWFtQ29sbGVjdGlvbjsKK3R5cGVkZWYgQ29sbGVjdGlvbjxhdWRpb191c2FnZV90PiBVc2FnZUNvbGxlY3Rpb247Cit0eXBlZGVmIENvbGxlY3Rpb248YXVkaW9fc291cmNlX3Q+IElucHV0U291cmNlQ29sbGVjdGlvbjsKKworfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VsZW1lbnQuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRWxlbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUyZTc3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VsZW1lbnQuaApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkCit7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXk+CitjbGFzcyBFbGVtZW50Cit7CitwdWJsaWM6CisgICAgRWxlbWVudChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKKyAgICAgICAgOiBtTmFtZShuYW1lKQorICAgIHt9CisgICAgfkVsZW1lbnQoKSB7fQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBpZGVudGlmaWVyIG9mIHRoaXMgcG9saWN5IGVsZW1lbnQKKyAgICAgKgorICAgICAqIEByZXR1cm5zIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgdGhpcyBwb2xpY3kgZWxlbWVudAorICAgICAqLworICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KKworICAgIC8qKgorICAgICogU2V0IHRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBwb2xpY3kgZWxlbWVudC4KKyAgICAqCisgICAgKiBAdHBhcmFtIEtleSB0eXBlIG9mIHRoZSB1bmlxdWUgaWRlbnRpZmllci4KKyAgICAqIEBwYXJhbVtpbl0gaWRlbnRpZmllciB0byBiZSBzZXQuCisgICAgKgorICAgICogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgaWRlbnRpZmllciBpcyB2YWxpZCBhbmQgc2V0IGNvcnJlY3RseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRJZGVudGlmaWVyKEtleSBpZGVudGlmaWVyKQorICAgIHsKKyAgICAgICAgbUlkZW50aWZpZXIgPSBpZGVudGlmaWVyOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhpcyBwb2xpY3kgZWxlbWVudC4KKyAgICAgKi8KKyAgICBjb25zdCBLZXkgJmdldElkZW50aWZpZXIoKSBjb25zdCB7IHJldHVybiBtSWRlbnRpZmllcjsgfQorCisgICAgLyoqCisgICAgICogQSBQb2xpY3kgZWxlbWVudCBtYXkgaW1wbGVtZW50IGdldHRlci9zZXR0ZXIgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gcHJvcGVydHkuCisgICAgICogUHJvcGVydHkgbWF5IGJlIHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90CisgICAgICogb3IgYSBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAdHBhcmFtIFByb3BlcnR5IGZvciB3aGljaCB0aGlzIHBvbGljeSBlbGVtZW50IGhhcyBzZXR0ZXIgLyBnZXR0ZXIuCisgICAgICogQHJldHVybiB0aGUgcHJvcGVydHkga2VwdCB0cmFjayBieSB0aGlzIHBvbGljeSBiYXNlIGVsZW1lbnQuCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5PgorICAgIFByb3BlcnR5IGdldCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQSBQb2xpY3kgZWxlbWVudCBtYXkgaW1wbGVtZW50IGdldHRlci9zZXR0ZXIgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gcHJvcGVydHkuCisgICAgICogUHJvcGVydHkgbWF5IGJlIHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90CisgICAgICogb3IgYSBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAdHBhcmFtIFByb3BlcnR5IGZvciB3aGljaCB0aGlzIHBvbGljeSBlbGVtZW50IGhhcyBzZXR0ZXIgLyBnZXR0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHByb3BlcnR5IHZhbHVlIHRvIGJlIGFzc2lnbmVkIGZvciB0aGlzIHBvbGljeSBiYXNlIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSBrZXB0IHRyYWNrIGJ5IHRoaXMgcG9saWN5IGJhc2UgZWxlbWVudC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHk+CisgICAgc3RhdHVzX3Qgc2V0KFByb3BlcnR5IHByb3BlcnR5KTsKKworcHJpdmF0ZToKKyAgICAvKiBDb3B5IGZhY2lsaXRpZXMgYXJlIHB1dCBwcml2YXRlIHRvIGRpc2FibGUgY29weS4gKi8KKyAgICBFbGVtZW50KGNvbnN0IEVsZW1lbnQgJm9iamVjdCk7CisgICAgRWxlbWVudCAmb3BlcmF0b3I9KGNvbnN0IEVsZW1lbnQgJm9iamVjdCk7CisKKyAgICBzdGQ6OnN0cmluZyBtTmFtZTsgLyoqPCBVbmlxdWUgbGl0ZXJhbCBJZGVudGlmaWVyIG9mIGEgcG9saWN5IGJhc2UgZWxlbWVudCovCisgICAgS2V5IG1JZGVudGlmaWVyOyAvKio8IFVuaXF1ZSBudW1lcmljYWwgSWRlbnRpZmllciBvZiBhIHBvbGljeSBiYXNlIGVsZW1lbnQqLworfTsKK30gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjczM2NkZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5jcHAKQEAgLTAsMCArMSwyNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Qb2xpY3lFbmdpbmUiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKy8vI2RlZmluZSBWRVJZX1ZFUkJPU0VfTE9HR0lORworI2lmZGVmIFZFUllfVkVSQk9TRV9MT0dHSU5HCisjZGVmaW5lIEFMT0dWViBBTE9HVgorI2Vsc2UKKyNkZWZpbmUgQUxPR1ZWKGEuLi4pIGRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKyNpbmNsdWRlICJFbmdpbmUuaCIKKyNpbmNsdWRlICJTdHJhdGVneS5oIgorI2luY2x1ZGUgIlN0cmVhbS5oIgorI2luY2x1ZGUgIklucHV0U291cmNlLmgiCisjaW5jbHVkZSAiVXNhZ2UuaCIKKyNpbmNsdWRlIDxwb2xpY3kuaD4KKyNpbmNsdWRlIDxQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5oPgorCit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6bWFwOworCituYW1lc3BhY2UgYW5kcm9pZAoreworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorewordGVtcGxhdGUgPD4KK1N0cmF0ZWd5Q29sbGVjdGlvbiAmRW5naW5lOjpnZXRDb2xsZWN0aW9uPHJvdXRpbmdfc3RyYXRlZ3k+KCkKK3sKKyAgICByZXR1cm4gbVN0cmF0ZWd5Q29sbGVjdGlvbjsKK30KK3RlbXBsYXRlIDw+CitTdHJlYW1Db2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248YXVkaW9fc3RyZWFtX3R5cGVfdD4oKQoreworICAgIHJldHVybiBtU3RyZWFtQ29sbGVjdGlvbjsKK30KK3RlbXBsYXRlIDw+CitVc2FnZUNvbGxlY3Rpb24gJkVuZ2luZTo6Z2V0Q29sbGVjdGlvbjxhdWRpb191c2FnZV90PigpCit7CisgICAgcmV0dXJuIG1Vc2FnZUNvbGxlY3Rpb247Cit9Cit0ZW1wbGF0ZSA8PgorSW5wdXRTb3VyY2VDb2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248YXVkaW9fc291cmNlX3Q+KCkKK3sKKyAgICByZXR1cm4gbUlucHV0U291cmNlQ29sbGVjdGlvbjsKK30KKwordGVtcGxhdGUgPD4KK2NvbnN0IFN0cmF0ZWd5Q29sbGVjdGlvbiAmRW5naW5lOjpnZXRDb2xsZWN0aW9uPHJvdXRpbmdfc3RyYXRlZ3k+KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVN0cmF0ZWd5Q29sbGVjdGlvbjsKK30KK3RlbXBsYXRlIDw+Citjb25zdCBTdHJlYW1Db2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248YXVkaW9fc3RyZWFtX3R5cGVfdD4oKSBjb25zdAoreworICAgIHJldHVybiBtU3RyZWFtQ29sbGVjdGlvbjsKK30KK3RlbXBsYXRlIDw+Citjb25zdCBVc2FnZUNvbGxlY3Rpb24gJkVuZ2luZTo6Z2V0Q29sbGVjdGlvbjxhdWRpb191c2FnZV90PigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1Vc2FnZUNvbGxlY3Rpb247Cit9Cit0ZW1wbGF0ZSA8PgorY29uc3QgSW5wdXRTb3VyY2VDb2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248YXVkaW9fc291cmNlX3Q+KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbUlucHV0U291cmNlQ29sbGVjdGlvbjsKK30KKworRW5naW5lOjpFbmdpbmUoKQorICAgIDogbU1hbmFnZXJJbnRlcmZhY2UodGhpcyksCisgICAgICBtUGx1Z2luSW50ZXJmYWNlKHRoaXMpLAorICAgICAgbVBvbGljeVBhcmFtZXRlck1ncihuZXcgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIoKSksCisgICAgICBtQXBtT2JzZXJ2ZXIoTlVMTCkKK3sKK30KKworRW5naW5lOjp+RW5naW5lKCkKK3sKKyAgICBtU3RyYXRlZ3lDb2xsZWN0aW9uLmNsZWFyKCk7CisgICAgbVN0cmVhbUNvbGxlY3Rpb24uY2xlYXIoKTsKKyAgICBtSW5wdXRTb3VyY2VDb2xsZWN0aW9uLmNsZWFyKCk7CisgICAgbVVzYWdlQ29sbGVjdGlvbi5jbGVhcigpOworfQorCisKK3ZvaWQgRW5naW5lOjpzZXRPYnNlcnZlcihBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqb2JzZXJ2ZXIpCit7CisgICAgQUxPR19BU1NFUlQob2JzZXJ2ZXIgIT0gTlVMTCwgIkludmFsaWQgQXVkaW8gUG9saWN5IE1hbmFnZXIgb2JzZXJ2ZXIiKTsKKyAgICBtQXBtT2JzZXJ2ZXIgPSBvYnNlcnZlcjsKK30KKworc3RhdHVzX3QgRW5naW5lOjppbml0Q2hlY2soKQoreworICAgIGlmIChtUG9saWN5UGFyYW1ldGVyTWdyICE9IE5VTEwgJiYgbVBvbGljeVBhcmFtZXRlck1nci0+c3RhcnQoKSAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiJXM6IGNvdWxkIG5vdCBzdGFydCBQb2xpY3kgUEZXIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZGVsZXRlIG1Qb2xpY3lQYXJhbWV0ZXJNZ3I7CisgICAgICAgIG1Qb2xpY3lQYXJhbWV0ZXJNZ3IgPSBOVUxMOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIChtQXBtT2JzZXJ2ZXIgIT0gTlVMTCk/IE5PX0VSUk9SIDogTk9fSU5JVDsKK30KKworYm9vbCBFbmdpbmU6OnNldFZvbHVtZVByb2ZpbGVGb3JTdHJlYW0oY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmc3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludHMgJnBvaW50cykKK3sKKyAgICBTdHJlYW0gKnN0cmVhbSA9IGdldEZyb21Db2xsZWN0aW9uPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KHN0cmVhbVR5cGUpOworICAgIGlmIChzdHJlYW0gPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IHN0cmVhbSAlZCBub3QgZm91bmQiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbVR5cGUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBzdHJlYW0tPnNldFZvbHVtZVByb2ZpbGUoZGV2aWNlQ2F0ZWdvcnksIHBvaW50cykgPT0gTk9fRVJST1I7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXk+CitFbGVtZW50PEtleT4gKkVuZ2luZTo6Z2V0RnJvbUNvbGxlY3Rpb24oY29uc3QgS2V5ICZrZXkpIGNvbnN0Cit7CisgICAgY29uc3QgQ29sbGVjdGlvbjxLZXk+IGNvbGxlY3Rpb24gPSBnZXRDb2xsZWN0aW9uPEtleT4oKTsKKyAgICByZXR1cm4gY29sbGVjdGlvbi5nZXQoa2V5KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEtleT4KK3N0YXR1c190IEVuZ2luZTo6YWRkKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBjb25zdCBLZXkgJmtleSkKK3sKKyAgICBDb2xsZWN0aW9uPEtleT4gJmNvbGxlY3Rpb24gPSBnZXRDb2xsZWN0aW9uPEtleT4oKTsKKyAgICByZXR1cm4gY29sbGVjdGlvbi5hZGQobmFtZSwga2V5KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5LCB0eXBlbmFtZSBLZXk+CitQcm9wZXJ0eSBFbmdpbmU6OmdldFByb3BlcnR5Rm9yS2V5KEtleSBrZXkpIGNvbnN0Cit7CisgICAgRWxlbWVudDxLZXk+ICplbGVtZW50ID0gZ2V0RnJvbUNvbGxlY3Rpb248S2V5PihrZXkpOworICAgIGlmIChlbGVtZW50ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFbGVtZW50IG5vdCBmb3VuZCB3aXRoaW4gY29sbGVjdGlvbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm9wZXJ0eT4oMCk7CisgICAgfQorICAgIHJldHVybiBlbGVtZW50LT50ZW1wbGF0ZSBnZXQ8UHJvcGVydHk+KCk7Cit9CisKK3JvdXRpbmdfc3RyYXRlZ3kgRW5naW5lOjpNYW5hZ2VySW50ZXJmYWNlSW1wbDo6Z2V0U3RyYXRlZ3lGb3JVc2FnZShhdWRpb191c2FnZV90IHVzYWdlKQoreworICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gbVBvbGljeUVuZ2luZS0+bUFwbU9ic2VydmVyLT5nZXRPdXRwdXRzKCk7CisKKyAgICBpZiAodXNhZ2UgPT0gQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZICYmCisgICAgICAgICAgICAob3V0cHV0cy5pc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fUklORykgfHwKKyAgICAgICAgICAgICBvdXRwdXRzLmlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9BTEFSTSkpKSB7CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9TT05JRklDQVRJT047CisgICAgfQorICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRQcm9wZXJ0eUZvcktleTxyb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb191c2FnZV90Pih1c2FnZSk7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBFbmdpbmU6Ok1hbmFnZXJJbnRlcmZhY2VJbXBsOjpnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KSBjb25zdAoreworICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gbVBvbGljeUVuZ2luZS0+bUFwbU9ic2VydmVyLT5nZXRPdXRwdXRzKCk7CisKKyAgICAvKiogVGhpcyBpcyB0aGUgb25seSBjYXNlIGhhbmRsZWQgcHJvZ3JhbW1hdGljYWxseSBiZWNhdXNlIHRoZSBQRlcgaXMgdW5hYmxlIHRvIGtub3cgdGhlCisgICAgICogYWN0aXZpdHkgb2Ygc3RyZWFtcy4KKyAgICAgKgorICAgICAqIC1XaGlsZSBtZWRpYSBpcyBwbGF5aW5nIG9uIGEgcmVtb3RlIGRldmljZSwgdXNlIHRoZSB0aGUgc29uaWZpY2F0aW9uIGJlaGF2aW9yLgorICAgICAqIE5vdGUgdGhhdCB3ZSB0ZXN0IHRoaXMgdXNlY2FzZSBiZWZvcmUgdGVzdGluZyBpZiBtZWRpYSBpcyBwbGF5aW5nIGJlY2F1c2UKKyAgICAgKiB0aGUgaXNTdHJlYW1BY3RpdmUoKSBtZXRob2Qgb25seSBpbmZvcm1zIGFib3V0IHRoZSBhY3Rpdml0eSBvZiBhIHN0cmVhbSwgbm90CisgICAgICogaWYgaXQncyBmb3IgbG9jYWwgcGxheWJhY2suIE5vdGUgYWxzbyB0aGF0IHdlIHVzZSB0aGUgc2FtZSBkZWxheSBiZXR3ZWVuIGJvdGggdGVzdHMKKyAgICAgKgorICAgICAqIC1XaGVuIG1lZGlhIGlzIG5vdCBwbGF5aW5nIGFueW1vcmUsIGZhbGwgYmFjayBvbiB0aGUgc29uaWZpY2F0aW9uIGJlaGF2aW9yCisgICAgICovCisgICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMICYmCisgICAgICAgICAgICAhaXNfc3RhdGVfaW5fY2FsbChnZXRQaG9uZVN0YXRlKCkpICYmCisgICAgICAgICAgICAhb3V0cHV0cy5pc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KEFVRElPX1NUUkVBTV9NVVNJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKSAmJgorICAgICAgICAgICAgb3V0cHV0cy5pc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMsIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKSkgeworICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0UHJvcGVydHlGb3JLZXk8YXVkaW9fZGV2aWNlc190LCByb3V0aW5nX3N0cmF0ZWd5PihTVFJBVEVHWV9NRURJQSk7CisgICAgfQorICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRQcm9wZXJ0eUZvcktleTxhdWRpb19kZXZpY2VzX3QsIHJvdXRpbmdfc3RyYXRlZ3k+KHN0cmF0ZWd5KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5LCB0eXBlbmFtZSBLZXk+Citib29sIEVuZ2luZTo6c2V0UHJvcGVydHlGb3JLZXkoY29uc3QgUHJvcGVydHkgJnByb3BlcnR5LCBjb25zdCBLZXkgJmtleSkKK3sKKyAgICBFbGVtZW50PEtleT4gKmVsZW1lbnQgPSBnZXRGcm9tQ29sbGVjdGlvbjxLZXk+KGtleSk7CisgICAgaWYgKGVsZW1lbnQgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IEVsZW1lbnQgbm90IGZvdW5kIHdpdGhpbiBjb2xsZWN0aW9uIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIGVsZW1lbnQtPnRlbXBsYXRlIHNldDxQcm9wZXJ0eT4ocHJvcGVydHkpID09IE5PX0VSUk9SOworfQorCitmbG9hdCBFbmdpbmU6OnZvbEluZGV4VG9EYihWb2x1bWU6OmRldmljZV9jYXRlZ29yeSBjYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKQoreworICAgIFN0cmVhbSAqc3RyZWFtID0gZ2V0RnJvbUNvbGxlY3Rpb248YXVkaW9fc3RyZWFtX3R5cGVfdD4oc3RyZWFtVHlwZSk7CisgICAgaWYgKHN0cmVhbSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogRWxlbWVudCBpbmRleGVkIGJ5IGtleT0lZCBub3QgZm91bmQiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbVR5cGUpOworICAgICAgICByZXR1cm4gMS4wZjsKKyAgICB9CisgICAgcmV0dXJuIHN0cmVhbS0+dm9sSW5kZXhUb0RiKGNhdGVnb3J5LCBpbmRleEluVWkpOworfQorCitzdGF0dXNfdCBFbmdpbmU6OmluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KQoreworICAgIFN0cmVhbSAqc3RyZWFtID0gZ2V0RnJvbUNvbGxlY3Rpb248YXVkaW9fc3RyZWFtX3R5cGVfdD4oc3RyZWFtVHlwZSk7CisgICAgaWYgKHN0cmVhbSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtIFR5cGUgJWQgbm90IGZvdW5kIiwgX19GVU5DVElPTl9fLCBzdHJlYW1UeXBlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgIH0KKyAgICBtQXBtT2JzZXJ2ZXItPmdldFN0cmVhbURlc2NyaXB0b3JzKCkuc2V0Vm9sdW1lSW5kZXhNaW4oc3RyZWFtVHlwZSwgaW5kZXhNaW4pOworICAgIG1BcG1PYnNlcnZlci0+Z2V0U3RyZWFtRGVzY3JpcHRvcnMoKS5zZXRWb2x1bWVJbmRleE1heChzdHJlYW1UeXBlLCBpbmRleE1heCk7CisKKyAgICByZXR1cm4gc3RyZWFtLT5pbml0Vm9sdW1lKGluZGV4TWluLCBpbmRleE1heCk7Cit9CisKK3N0YXR1c190IEVuZ2luZTo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3QgbW9kZSkKK3sKKyAgICByZXR1cm4gbVBvbGljeVBhcmFtZXRlck1nci0+c2V0UGhvbmVTdGF0ZShtb2RlKTsKK30KKworYXVkaW9fbW9kZV90IEVuZ2luZTo6Z2V0UGhvbmVTdGF0ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPmdldFBob25lU3RhdGUoKTsKK30KKworc3RhdHVzX3QgRW5naW5lOjpzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQoreworICAgIHJldHVybiBtUG9saWN5UGFyYW1ldGVyTWdyLT5zZXRGb3JjZVVzZSh1c2FnZSwgY29uZmlnKTsKK30KKworYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBFbmdpbmU6OmdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgY29uc3QKK3sKKyAgICByZXR1cm4gbVBvbGljeVBhcmFtZXRlck1nci0+Z2V0Rm9yY2VVc2UodXNhZ2UpOworfQorCitzdGF0dXNfdCBFbmdpbmU6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlQWRkcmVzcykKK3sKKyAgICByZXR1cm4gbVBvbGljeVBhcmFtZXRlck1nci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZXMsIHN0YXRlLCBkZXZpY2VBZGRyZXNzKTsKK30KKwordGVtcGxhdGUgPD4KK0F1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZSAqRW5naW5lOjpxdWVyeUludGVyZmFjZSgpCit7CisgICAgcmV0dXJuICZtTWFuYWdlckludGVyZmFjZTsKK30KKwordGVtcGxhdGUgPD4KK0F1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlICpFbmdpbmU6OnF1ZXJ5SW50ZXJmYWNlKCkKK3sKKyAgICByZXR1cm4gJm1QbHVnaW5JbnRlcmZhY2U7Cit9CisKK30gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZmYTdhMTMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5oCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKworI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oPgorI2luY2x1ZGUgPEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmg+CisjaW5jbHVkZSAiQ29sbGVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZAoreworY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXI7CisKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kKK3sKKworY2xhc3MgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI7CitjbGFzcyBWb2x1bWVQcm9maWxlOworCitjbGFzcyBFbmdpbmUKK3sKK3B1YmxpYzoKKyAgICBFbmdpbmUoKTsKKyAgICB2aXJ0dWFsIH5FbmdpbmUoKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBSZXF1ZXN0ZWRJbnRlcmZhY2U+CisgICAgUmVxdWVzdGVkSW50ZXJmYWNlICpxdWVyeUludGVyZmFjZSgpOworCitwcml2YXRlOgorICAgIC8vLyBJbnRlcmZhY2UgbWVtYmVycworICAgIGNsYXNzIE1hbmFnZXJJbnRlcmZhY2VJbXBsIDogcHVibGljIEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIE1hbmFnZXJJbnRlcmZhY2VJbXBsKEVuZ2luZSAqcG9saWN5RW5naW5lKQorICAgICAgICAgICAgOiBtUG9saWN5RW5naW5lKHBvbGljeUVuZ2luZSkge30KKworICAgICAgICB2aXJ0dWFsIGFuZHJvaWQ6OnN0YXR1c190IGluaXRDaGVjaygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5pbml0Q2hlY2soKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0T2JzZXJ2ZXIoQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm9ic2VydmVyKQorICAgICAgICB7CisgICAgICAgICAgICBtUG9saWN5RW5naW5lLT5zZXRPYnNlcnZlcihvYnNlcnZlcik7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRQcm9wZXJ0eUZvcktleTxhdWRpb19kZXZpY2VzX3QsIGF1ZGlvX3NvdXJjZV90PihpbnB1dFNvdXJjZSk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdGF0ZWd5KSBjb25zdDsKKyAgICAgICAgdmlydHVhbCByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0UHJvcGVydHlGb3JLZXk8cm91dGluZ19zdHJhdGVneSwgYXVkaW9fc3RyZWFtX3R5cGVfdD4oc3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JVc2FnZShhdWRpb191c2FnZV90IHVzYWdlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0UGhvbmVTdGF0ZShtb2RlKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldFBob25lU3RhdGUoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPnNldEZvcmNlVXNlKHVzYWdlLCBjb25maWcpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRGb3JjZVVzZSh1c2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBhbmRyb2lkOjpzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldkRlc2MtPnR5cGUoKSwgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmluaXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCBpbmRleE1pbiwgaW5kZXhNYXgpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoYm9vbCAvKmlzU3BlYWtlckRyY0VuYWJsZWQqLykge30KKworICAgICAgICB2aXJ0dWFsIGZsb2F0IHZvbEluZGV4VG9EYihWb2x1bWU6OmRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+dm9sSW5kZXhUb0RiKGRldmljZUNhdGVnb3J5LCBzdHJlYW0sIGluZGV4SW5VaSk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIEVuZ2luZSAqbVBvbGljeUVuZ2luZTsKKyAgICB9IG1NYW5hZ2VySW50ZXJmYWNlOworCisgICAgY2xhc3MgUGx1Z2luSW50ZXJmYWNlSW1wbCA6IHB1YmxpYyBBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFBsdWdpbkludGVyZmFjZUltcGwoRW5naW5lICpwb2xpY3lFbmdpbmUpCisgICAgICAgICAgICA6IG1Qb2xpY3lFbmdpbmUocG9saWN5RW5naW5lKSB7fQorCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU3RyYXRlZ3koY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5hZGQ8cm91dGluZ19zdHJhdGVneT4obmFtZSwgc3RyYXRlZ3kpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU3RyZWFtKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmFkZDxhdWRpb19zdHJlYW1fdHlwZV90PihuYW1lLCBzdHJlYW0pOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkVXNhZ2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGF1ZGlvX3VzYWdlX3QgdXNhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5hZGQ8YXVkaW9fdXNhZ2VfdD4obmFtZSwgdXNhZ2UpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkSW5wdXRTb3VyY2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmFkZDxhdWRpb19zb3VyY2VfdD4obmFtZSwgc291cmNlKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgc2V0RGV2aWNlRm9yU3RyYXRlZ3koY29uc3Qgcm91dGluZ19zdHJhdGVneSAmc3RyYXRlZ3ksIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0UHJvcGVydHlGb3JLZXk8YXVkaW9fZGV2aWNlc190LCByb3V0aW5nX3N0cmF0ZWd5PihkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3kpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBzZXRTdHJhdGVneUZvclN0cmVhbShjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0UHJvcGVydHlGb3JLZXk8cm91dGluZ19zdHJhdGVneSwgYXVkaW9fc3RyZWFtX3R5cGVfdD4oc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lUHJvZmlsZUZvclN0cmVhbShjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50cyAmcG9pbnRzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0Vm9sdW1lUHJvZmlsZUZvclN0cmVhbShzdHJlYW0sIGRldmljZUNhdGVnb3J5LCBwb2ludHMpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBib29sIHNldFN0cmF0ZWd5Rm9yVXNhZ2UoY29uc3QgYXVkaW9fdXNhZ2VfdCAmdXNhZ2UsIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5zZXRQcm9wZXJ0eUZvcktleTxyb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb191c2FnZV90PihzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBib29sIHNldERldmljZUZvcklucHV0U291cmNlKGNvbnN0IGF1ZGlvX3NvdXJjZV90ICZpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5zZXRQcm9wZXJ0eUZvcktleTxhdWRpb19kZXZpY2VzX3QsIGF1ZGlvX3NvdXJjZV90PihkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTb3VyY2UpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBFbmdpbmUgKm1Qb2xpY3lFbmdpbmU7CisgICAgfSBtUGx1Z2luSW50ZXJmYWNlOworCitwcml2YXRlOgorICAgIC8qIENvcHkgZmFjaWxpdGllcyBhcmUgcHV0IHByaXZhdGUgdG8gZGlzYWJsZSBjb3B5LiAqLworICAgIEVuZ2luZShjb25zdCBFbmdpbmUgJm9iamVjdCk7CisgICAgRW5naW5lICZvcGVyYXRvcj0oY29uc3QgRW5naW5lICZvYmplY3QpOworCisgICAgdm9pZCBzZXRPYnNlcnZlcihBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqb2JzZXJ2ZXIpOworCisgICAgYm9vbCBzZXRWb2x1bWVQcm9maWxlRm9yU3RyZWFtKGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnRzICZwb2ludHMpOworCisgICAgc3RhdHVzX3QgaW5pdENoZWNrKCk7CisgICAgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3QgbW9kZSk7CisgICAgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKSBjb25zdDsKKyAgICBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKTsKKyAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgY29uc3Q7CisgICAgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZUFkZHJlc3MpOworCisgICAgZmxvYXQgdm9sSW5kZXhUb0RiKFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4SW5VaSk7CisgICAgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpOworCisgICAgU3RyYXRlZ3lDb2xsZWN0aW9uIG1TdHJhdGVneUNvbGxlY3Rpb247IC8qKjwgU3RyYXRlZ2llcyBpbmRleGVkIGJ5IHRoZWlyIGVudW0gaWQuICovCisgICAgU3RyZWFtQ29sbGVjdGlvbiBtU3RyZWFtQ29sbGVjdGlvbjsgLyoqPCBTdHJlYW1zIGluZGV4ZWQgYnkgdGhlaXIgZW51bSBpZC4gICovCisgICAgVXNhZ2VDb2xsZWN0aW9uIG1Vc2FnZUNvbGxlY3Rpb247IC8qKjwgVXNhZ2VzIGluZGV4ZWQgYnkgdGhlaXIgZW51bSBpZC4gKi8KKyAgICBJbnB1dFNvdXJjZUNvbGxlY3Rpb24gbUlucHV0U291cmNlQ29sbGVjdGlvbjsgLyoqPCBJbnB1dCBzb3VyY2VzIGluZGV4ZWQgYnkgdGhlaXIgZW51bSBpZC4gKi8KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBLZXk+CisgICAgc3RhdHVzX3QgYWRkKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBjb25zdCBLZXkgJmtleSk7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5PgorICAgIEVsZW1lbnQ8S2V5PiAqZ2V0RnJvbUNvbGxlY3Rpb24oY29uc3QgS2V5ICZrZXkpIGNvbnN0OworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEtleT4KKyAgICBjb25zdCBDb2xsZWN0aW9uPEtleT4gJmdldENvbGxlY3Rpb24oKSBjb25zdDsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBLZXk+CisgICAgQ29sbGVjdGlvbjxLZXk+ICZnZXRDb2xsZWN0aW9uKCk7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHksIHR5cGVuYW1lIEtleT4KKyAgICBQcm9wZXJ0eSBnZXRQcm9wZXJ0eUZvcktleShLZXkga2V5KSBjb25zdDsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eSwgdHlwZW5hbWUgS2V5PgorICAgIGJvb2wgc2V0UHJvcGVydHlGb3JLZXkoY29uc3QgUHJvcGVydHkgJnByb3BlcnR5LCBjb25zdCBLZXkgJmtleSk7CisKKyAgICAvKioKKyAgICAgKiBQb2xpY3kgUGFyYW1ldGVyIE1hbmFnZXIgaGlkZGVuIHRocm91Z2ggYSB3cmFwcGVyLgorICAgICAqLworICAgIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyICptUG9saWN5UGFyYW1ldGVyTWdyOworCisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm1BcG1PYnNlcnZlcjsKK307CisKK307IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmVJbnN0YW5jZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZUluc3RhbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45YWE4OWIyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmVJbnN0YW5jZS5jcHAKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oPgorI2luY2x1ZGUgIkF1ZGlvUG9saWN5RW5naW5lSW5zdGFuY2UuaCIKKyNpbmNsdWRlICJFbmdpbmUuaCIKKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK25hbWVzcGFjZSBhbmRyb2lkCit7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit7CisKK0VuZ2luZUluc3RhbmNlOjpFbmdpbmVJbnN0YW5jZSgpCit7Cit9CisKK0VuZ2luZUluc3RhbmNlICpFbmdpbmVJbnN0YW5jZTo6Z2V0SW5zdGFuY2UoKQoreworICAgIHN0YXRpYyBFbmdpbmVJbnN0YW5jZSBpbnN0YW5jZTsKKyAgICByZXR1cm4gJmluc3RhbmNlOworfQorCitFbmdpbmVJbnN0YW5jZTo6fkVuZ2luZUluc3RhbmNlKCkKK3sKK30KKworRW5naW5lICpFbmdpbmVJbnN0YW5jZTo6Z2V0RW5naW5lKCkgY29uc3QKK3sKKyAgICBzdGF0aWMgRW5naW5lIGVuZ2luZTsKKyAgICByZXR1cm4gJmVuZ2luZTsKK30KKwordGVtcGxhdGUgPD4KK0F1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZSAqRW5naW5lSW5zdGFuY2U6OnF1ZXJ5SW50ZXJmYWNlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZ2V0RW5naW5lKCktPnF1ZXJ5SW50ZXJmYWNlPEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZT4oKTsKK30KKwordGVtcGxhdGUgPD4KK0F1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlICpFbmdpbmVJbnN0YW5jZTo6cXVlcnlJbnRlcmZhY2UoKSBjb25zdAoreworICAgIHJldHVybiBnZXRFbmdpbmUoKS0+cXVlcnlJbnRlcmZhY2U8QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2U+KCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlmZjE1MzgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmNwcApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvUG9saWN5RW5naW5lL0lucHV0U291cmNlIgorCisjaW5jbHVkZSAiSW5wdXRTb3VyY2UuaCIKKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK25hbWVzcGFjZSBhbmRyb2lkCit7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit7CitzdGF0dXNfdCBFbGVtZW50PGF1ZGlvX3NvdXJjZV90Pjo6c2V0SWRlbnRpZmllcihhdWRpb19zb3VyY2VfdCBpZGVudGlmaWVyKQoreworICAgIGlmIChpZGVudGlmaWVyID4gQVVESU9fU09VUkNFX01BWCAmJiBpZGVudGlmaWVyICE9IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1JZGVudGlmaWVyID0gaWRlbnRpZmllcjsKKyAgICBBTE9HRCgiJXM6IElucHV0U291cmNlICVzIGlkZW50aWZpZXIgMHglWCIsIF9fRlVOQ1RJT05fXywgZ2V0TmFtZSgpLmNfc3RyKCksIGlkZW50aWZpZXIpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyoqCisqIFNldCB0aGUgZGV2aWNlIGFzc29jaWF0ZWQgdG8gdGhpcyBzb3VyY2UuCisqIEl0IGNoZWNrcyBpZiB0aGUgaW5wdXQgZGV2aWNlIGlzIHZhbGlkIGJ1dCBhbGxvd3MgdG8gc2V0IGEgTk9ORSBkZXZpY2UKKyogKGkuZS4gb25seSB0aGUgSU4gQklUIGlzIHNldCkuCisqCisqIEBwYXJhbVtpbl0gZGV2aWNlcyBzZWxlY3RlZCBmb3IgdGhlIGdpdmVuIGlucHV0IHNvdXJjZS4KKyogQHRwYXJhbSBhdWRpb19kZXZpY2VzX3Q6IEFwcGxpY2FibGUgaW5wdXQgZGV2aWNlIGZvciB0aGlzIGlucHV0IHNvdXJjZS4KKyoKKyogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgZGV2aWNlIGlzIGVpdGhlciB2YWxpZCBvciBub25lLCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyovCit0ZW1wbGF0ZSA8Pgorc3RhdHVzX3QgRWxlbWVudDxhdWRpb19zb3VyY2VfdD46OnNldChhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykKK3sKKyAgICBpZiAoIWF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2VzKSAmJiBkZXZpY2VzICE9IEFVRElPX0RFVklDRV9CSVRfSU4pIHsKKyAgICAgICAgQUxPR0UoIiVzOiB0cnlpbmcgdG8gc2V0IGFuIGludmFsaWQgZGV2aWNlIDB4JVggZm9yIGlucHV0IHNvdXJjZSAlcyIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlcywgZ2V0TmFtZSgpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HRCgiJXM6IDB4JVggZm9yIGlucHV0IHNvdXJjZSAlcyIsIF9fRlVOQ1RJT05fXywgZGV2aWNlcywgZ2V0TmFtZSgpLmNfc3RyKCkpOworICAgIG1BcHBsaWNhYmxlRGV2aWNlcyA9IGRldmljZXM7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit0ZW1wbGF0ZSA8PgorYXVkaW9fZGV2aWNlc190IEVsZW1lbnQ8YXVkaW9fc291cmNlX3Q+OjpnZXQ8YXVkaW9fZGV2aWNlc190PigpIGNvbnN0Cit7CisgICAgQUxPR1YoIiVzOiAweCVYIGZvciBpbnB1dFNvdXJjZSAlcyIsIF9fRlVOQ1RJT05fXywgbUFwcGxpY2FibGVEZXZpY2VzLCBnZXROYW1lKCkuY19zdHIoKSk7CisgICAgcmV0dXJuIG1BcHBsaWNhYmxlRGV2aWNlczsKK30KK30gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YzQ5OGRjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9JbnB1dFNvdXJjZS5oCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkVsZW1lbnQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQKK3sKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kKK3sKKworLyoqCisgKiBTcGVjaWFsaXphdGlvbiBvZiBwb2xpY3kgYmFzZSBjbGFzcyBlbGVtZW50IGZvciBhdWRpb19zb3VyY2VfdAorICogQHRwYXJhbSBhdWRpb19zb3VyY2VfdCBQb2xpY3kgQmFzZSBFbGVtZW50IGlkZW50aWZpZWQgYnkgdGhlIGF1ZGlvX3NvdXJjZV90IGRlZmluaXRpb24uCisgKi8KK3RlbXBsYXRlIDw+CitjbGFzcyBFbGVtZW50PGF1ZGlvX3NvdXJjZV90PgoreworcHVibGljOgorICAgIEVsZW1lbnQoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpCisgICAgICAgIDogbU5hbWUobmFtZSksCisgICAgICAgICAgbUFwcGxpY2FibGVEZXZpY2VzKEFVRElPX0RFVklDRV9OT05FKQorICAgIHt9CisgICAgfkVsZW1lbnQoKSB7fQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBpZGVudGlmaWVyIG9mIHRoaXMgcG9saWN5IGVsZW1lbnQKKyAgICAgKgorICAgICAqIEByZXR1cm5zIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgdGhpcyBwb2xpY3kgZWxlbWVudAorICAgICAqLworICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KKworICAgIC8qKgorICAgICogU2V0IHRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBwb2xpY3kgZWxlbWVudC4KKyAgICAqCisgICAgKiBAdHBhcmFtIEtleSB0eXBlIG9mIHRoZSB1bmlxdWUgaWRlbnRpZmllci4KKyAgICAqIEBwYXJhbVtpbl0gaWRlbnRpZmllciB0byBiZSBzZXQuCisgICAgKgorICAgICogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgaWRlbnRpZmllciBpcyB2YWxpZCBhbmQgc2V0IGNvcnJlY3RseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRJZGVudGlmaWVyKGF1ZGlvX3NvdXJjZV90IGlkZW50aWZpZXIpOworCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhpcyBwb2xpY3kgZWxlbWVudC4KKyAgICAgKi8KKyAgICBhdWRpb19zb3VyY2VfdCBnZXRJZGVudGlmaWVyKCkgY29uc3QgeyByZXR1cm4gbUlkZW50aWZpZXI7IH0KKworICAgIC8qKgorICAgICAqIEEgUG9saWN5IGVsZW1lbnQgbWF5IGltcGxlbWVudCBnZXR0ZXIvc2V0dGVyIGZ1bmN0aW9uIGZvciBhIGdpdmVuIHByb3BlcnR5LgorICAgICAqIFByb3BlcnR5IG1heSBiZSByb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb19zdHJlYW1fdHlwZV90LCBhdWRpb191c2FnZV90LCBhdWRpb19zb3VyY2VfdAorICAgICAqIG9yIGEgc3RyaW5nLgorICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eT4KKyAgICBQcm9wZXJ0eSBnZXQoKSBjb25zdDsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eT4KKyAgICBzdGF0dXNfdCBzZXQoUHJvcGVydHkgcHJvcGVydHkpOworCitwcml2YXRlOgorICAgIC8qIENvcHkgZmFjaWxpdGllcyBhcmUgcHV0IHByaXZhdGUgdG8gZGlzYWJsZSBjb3B5LiAqLworICAgIEVsZW1lbnQoY29uc3QgRWxlbWVudCAmb2JqZWN0KTsKKyAgICBFbGVtZW50ICZvcGVyYXRvcj0oY29uc3QgRWxlbWVudCAmb2JqZWN0KTsKKworICAgIHN0ZDo6c3RyaW5nIG1OYW1lOyAvKio8IFVuaXF1ZSBsaXRlcmFsIElkZW50aWZpZXIgb2YgYSBwb2xpY3kgYmFzZSBlbGVtZW50Ki8KKyAgICBhdWRpb19zb3VyY2VfdCBtSWRlbnRpZmllcjsgLyoqPCBVbmlxdWUgbnVtZXJpY2FsIElkZW50aWZpZXIgb2YgYSBwb2xpY3kgYmFzZSBlbGVtZW50Ki8KKworICAgIGF1ZGlvX2RldmljZXNfdCBtQXBwbGljYWJsZURldmljZXM7IC8qKjwgQXBwbGljYWJsZSBpbnB1dCBkZXZpY2UgZm9yIHRoaXMgaW5wdXQgc291cmNlLiAqLworfTsKKwordHlwZWRlZiBFbGVtZW50PGF1ZGlvX3NvdXJjZV90PiBJbnB1dFNvdXJjZTsKKworfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyYXRlZ3kuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJhdGVneS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODQ3NDQzYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyYXRlZ3kuY3BwCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Qb2xpY3lFbmdpbmUvU3RyYXRlZ3kiCisKKyNpbmNsdWRlICJTdHJhdGVneS5oIgorCit1c2luZyBzdGQ6OnN0cmluZzsKKworbmFtZXNwYWNlIGFuZHJvaWQKK3sKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kKK3sKKworc3RhdHVzX3QgRWxlbWVudDxyb3V0aW5nX3N0cmF0ZWd5Pjo6c2V0SWRlbnRpZmllcihyb3V0aW5nX3N0cmF0ZWd5IGlkZW50aWZpZXIpCit7CisgICAgaWYgKGlkZW50aWZpZXIgPj0gTlVNX1NUUkFURUdJRVMpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbUlkZW50aWZpZXIgPSBpZGVudGlmaWVyOworICAgIEFMT0dEKCIlczogU3RyYXRlZ3kgJXMgaWRlbnRpZmllciAweCVYIiwgX19GVU5DVElPTl9fLCBnZXROYW1lKCkuY19zdHIoKSwgaWRlbnRpZmllcik7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKioKKyAqIFNldCB0aGUgZGV2aWNlIGFzc29jaWF0ZWQgdG8gdGhpcyBzdHJhdGVneS4KKyAqIEl0IGNoZWNrcyBpZiB0aGUgb3V0cHV0IGRldmljZSBpcyB2YWxpZCBidXQgYWxsb3dzIHRvIHNldCBhIE5PTkUgZGV2aWNlCisgKgorICogQHBhcmFtW2luXSBkZXZpY2VzIHNlbGVjdGVkIGZvciB0aGUgZ2l2ZW4gc3RyYXRlZ3kuCisgKgorICogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgZGV2aWNlIGlzIGVpdGhlciB2YWxpZCBvciBub25lLCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLwordGVtcGxhdGUgPD4KK3N0YXR1c190IEVsZW1lbnQ8cm91dGluZ19zdHJhdGVneT46OnNldDxhdWRpb19kZXZpY2VzX3Q+KGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKQoreworICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZXMoZGV2aWNlcykgJiYgZGV2aWNlcyAhPSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICBBTE9HRSgiJXM6IHRyeWluZyB0byBzZXQgYW4gaW52YWxpZCBkZXZpY2UgMHglWCBmb3Igc3RyYXRlZ3kgJXMiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZXMsIGdldE5hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR0QoIiVzOiAweCVYIGZvciBzdHJhdGVneSAlcyIsIF9fRlVOQ1RJT05fXywgZGV2aWNlcywgZ2V0TmFtZSgpLmNfc3RyKCkpOworICAgIG1BcHBsaWNhYmxlRGV2aWNlcyA9IGRldmljZXM7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit0ZW1wbGF0ZSA8PgorYXVkaW9fZGV2aWNlc190IEVsZW1lbnQ8cm91dGluZ19zdHJhdGVneT46OmdldDxhdWRpb19kZXZpY2VzX3Q+KCkgY29uc3QKK3sKKyAgICBBTE9HVigiJXM6IDB4JVggZm9yIHN0cmF0ZWd5ICVzIiwgX19GVU5DVElPTl9fLCBtQXBwbGljYWJsZURldmljZXMsIGdldE5hbWUoKS5jX3N0cigpKTsKKyAgICByZXR1cm4gbUFwcGxpY2FibGVEZXZpY2VzOworfQorCit9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJhdGVneS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJhdGVneS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjExNTdkNTUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmF0ZWd5LmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiRWxlbWVudC5oIgorI2luY2x1ZGUgPFJvdXRpbmdTdHJhdGVneS5oPgorCituYW1lc3BhY2UgYW5kcm9pZAoreworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoreworCisvKioKKyAqIEB0cGFyYW0gYXVkaW9fZGV2aWNlc190OiBBcHBsaWNhYmxlIG91dHB1dCBkZXZpY2UocykgZm9yIHRoaXMgc3RyYXRlZ3kuCisgKi8KK3RlbXBsYXRlIDw+CitjbGFzcyBFbGVtZW50PHJvdXRpbmdfc3RyYXRlZ3k+Cit7CitwdWJsaWM6CisgICAgRWxlbWVudChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKKyAgICAgICAgOiBtTmFtZShuYW1lKSwKKyAgICAgICAgICBtQXBwbGljYWJsZURldmljZXMoQVVESU9fREVWSUNFX05PTkUpCisgICAge30KKyAgICB+RWxlbWVudCgpIHt9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGlkZW50aWZpZXIgb2YgdGhpcyBwb2xpY3kgZWxlbWVudAorICAgICAqCisgICAgICogQHJldHVybnMgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiB0aGlzIHBvbGljeSBlbGVtZW50CisgICAgICovCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQorCisgICAgLyoqCisgICAgKiBTZXQgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHBvbGljeSBlbGVtZW50LgorICAgICoKKyAgICAqIEB0cGFyYW0gS2V5IHR5cGUgb2YgdGhlIHVuaXF1ZSBpZGVudGlmaWVyLgorICAgICogQHBhcmFtW2luXSBpZGVudGlmaWVyIHRvIGJlIHNldC4KKyAgICAqCisgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIHRoZSBpZGVudGlmaWVyIGlzIHZhbGlkIGFuZCBzZXQgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgICAqLworICAgIHN0YXR1c190IHNldElkZW50aWZpZXIocm91dGluZ19zdHJhdGVneSBpZGVudGlmaWVyKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoaXMgcG9saWN5IGVsZW1lbnQuCisgICAgICovCisgICAgcm91dGluZ19zdHJhdGVneSBnZXRJZGVudGlmaWVyKCkgY29uc3QgeyByZXR1cm4gbUlkZW50aWZpZXI7IH0KKworICAgIC8qKgorICAgICAqIEEgUG9saWN5IGVsZW1lbnQgbWF5IGltcGxlbWVudCBnZXR0ZXIvc2V0dGVyIGZ1bmN0aW9uIGZvciBhIGdpdmVuIHByb3BlcnR5LgorICAgICAqIFByb3BlcnR5IG1heSBiZSByb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb19zdHJlYW1fdHlwZV90LCBhdWRpb191c2FnZV90LCBhdWRpb19zb3VyY2VfdAorICAgICAqIG9yIGEgc3RyaW5nLgorICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eT4KKyAgICBQcm9wZXJ0eSBnZXQoKSBjb25zdDsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eT4KKyAgICBzdGF0dXNfdCBzZXQoUHJvcGVydHkgcHJvcGVydHkpOworCitwcml2YXRlOgorICAgIC8qIENvcHkgZmFjaWxpdGllcyBhcmUgcHV0IHByaXZhdGUgdG8gZGlzYWJsZSBjb3B5LiAqLworICAgIEVsZW1lbnQoY29uc3QgRWxlbWVudCAmb2JqZWN0KTsKKyAgICBFbGVtZW50ICZvcGVyYXRvcj0oY29uc3QgRWxlbWVudCAmb2JqZWN0KTsKKworICAgIHN0ZDo6c3RyaW5nIG1OYW1lOyAvKio8IFVuaXF1ZSBsaXRlcmFsIElkZW50aWZpZXIgb2YgYSBwb2xpY3kgYmFzZSBlbGVtZW50Ki8KKyAgICByb3V0aW5nX3N0cmF0ZWd5IG1JZGVudGlmaWVyOyAvKio8IFVuaXF1ZSBudW1lcmljYWwgSWRlbnRpZmllciBvZiBhIHBvbGljeSBiYXNlIGVsZW1lbnQqLworCisgICAgYXVkaW9fZGV2aWNlc190IG1BcHBsaWNhYmxlRGV2aWNlczsgLyoqPCBBcHBsaWNhYmxlIG91dHB1dCBkZXZpY2UocykgZm9yIHRoaXMgc3RyYXRlZ3kuICovCit9OworCit0eXBlZGVmIEVsZW1lbnQ8cm91dGluZ19zdHJhdGVneT4gU3RyYXRlZ3k7CisKK30gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZWEyYzE5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJlYW0uY3BwCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvUG9saWN5RW5naW5lL1N0cmVhbSIKKworI2luY2x1ZGUgIlN0cmVhbS5oIgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCit1c2luZyBzdGQ6OnN0cmluZzsKKworbmFtZXNwYWNlIGFuZHJvaWQKK3sKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kKK3sKKworc3RhdHVzX3QgRWxlbWVudDxhdWRpb19zdHJlYW1fdHlwZV90Pjo6c2V0SWRlbnRpZmllcihhdWRpb19zdHJlYW1fdHlwZV90IGlkZW50aWZpZXIpCit7CisgICAgaWYgKGlkZW50aWZpZXIgPiBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1JZGVudGlmaWVyID0gaWRlbnRpZmllcjsKKyAgICBBTE9HRCgiJXM6IFN0cmVhbSAlcyBpZGVudGlmaWVyIDB4JVgiLCBfX0ZVTkNUSU9OX18sIGdldE5hbWUoKS5jX3N0cigpLCBpZGVudGlmaWVyKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qKgorKiBTZXQgdGhlIHN0cmF0ZWd5IHRvIGZvbGxvdyBmb3IgdGhpcyBzdHJlYW0uCisqIEl0IGNoZWNrcyBpZiB0aGUgc3RyYXRlZ3kgaXMgdmFsaWQuCisqCisqIEBwYXJhbVtpbl0gc3RyYXRlZ3kgdG8gYmUgZm9sbG93ZWQuCisqCisqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIHN0cmF0ZWd5IGlzIHNldCBjb3JyZWN0bHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorKi8KK3RlbXBsYXRlIDw+CitzdGF0dXNfdCBFbGVtZW50PGF1ZGlvX3N0cmVhbV90eXBlX3Q+OjpzZXQ8cm91dGluZ19zdHJhdGVneT4ocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkKK3sKKyAgICBpZiAoc3RyYXRlZ3kgPj0gTlVNX1NUUkFURUdJRVMpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbUFwcGxpY2FibGVTdHJhdGVneSA9IHN0cmF0ZWd5OworICAgIEFMT0dEKCIlczogMHglWCBmb3IgU3RyZWFtICVzIiwgX19GVU5DVElPTl9fLCBzdHJhdGVneSwgZ2V0TmFtZSgpLmNfc3RyKCkpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordGVtcGxhdGUgPD4KK3JvdXRpbmdfc3RyYXRlZ3kgRWxlbWVudDxhdWRpb19zdHJlYW1fdHlwZV90Pjo6Z2V0PHJvdXRpbmdfc3RyYXRlZ3k+KCkgY29uc3QKK3sKKyAgICBBTE9HVigiJXM6IDB4JVggZm9yIFN0cmVhbSAlcyIsIF9fRlVOQ1RJT05fXywgbUFwcGxpY2FibGVTdHJhdGVneSwgZ2V0TmFtZSgpLmNfc3RyKCkpOworICAgIHJldHVybiBtQXBwbGljYWJsZVN0cmF0ZWd5OworfQorCitzdGF0dXNfdCBFbGVtZW50PGF1ZGlvX3N0cmVhbV90eXBlX3Q+OjpzZXRWb2x1bWVQcm9maWxlKFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50cyAmcG9pbnRzKQoreworICAgIEFMT0dEKCIlczogYWRkaW5nIHZvbHVtZSBwcm9maWxlIGZvciAlcyBmb3IgZGV2aWNlIGNhdGVnb3J5ICVkLCBwb2ludHMgbmIgPSVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgIGdldE5hbWUoKS5jX3N0cigpLCBjYXRlZ29yeSwgcG9pbnRzLnNpemUoKSk7CisgICAgbVZvbHVtZVByb2ZpbGVzW2NhdGVnb3J5XSA9IHBvaW50czsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcG9pbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEFMT0dWKCIlczogJXMgY2F0PSVkIGN1cnZlIGluZGV4ID0lZCBJbmRleD0lZCBkQkF0dGVudWF0aW9uPSVmIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBnZXROYW1lKCkuY19zdHIoKSwgY2F0ZWdvcnksIGksIHBvaW50c1tpXS5tSW5kZXgsCisgICAgICAgICAgICAgcG9pbnRzW2ldLm1EQkF0dGVudWF0aW9uKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBFbGVtZW50PGF1ZGlvX3N0cmVhbV90eXBlX3Q+Ojppbml0Vm9sdW1lKGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KQoreworICAgIEFMT0dWKCJpbml0U3RyZWFtVm9sdW1lKCkgc3RyZWFtICVzLCBtaW4gJWQsIG1heCAlZCIsIGdldE5hbWUoKS5jX3N0cigpLCBpbmRleE1pbiwgaW5kZXhNYXgpOworICAgIGlmIChpbmRleE1pbiA8IDAgfHwgaW5kZXhNaW4gPj0gaW5kZXhNYXgpIHsKKyAgICAgICAgQUxPR1coImluaXRTdHJlYW1Wb2x1bWUoKSBpbnZhbGlkIGluZGV4IGxpbWl0cyBmb3Igc3RyZWFtICVzLCBtaW4gJWQsIG1heCAlZCIsCisgICAgICAgICAgICAgIGdldE5hbWUoKS5jX3N0cigpLCBpbmRleE1pbiwgaW5kZXhNYXgpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBtSW5kZXhNaW4gPSBpbmRleE1pbjsKKyAgICBtSW5kZXhNYXggPSBpbmRleE1heDsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworZmxvYXQgRWxlbWVudDxhdWRpb19zdHJlYW1fdHlwZV90Pjo6dm9sSW5kZXhUb0RiKFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4SW5VaSkKK3sKKyAgICBWb2x1bWVQcm9maWxlQ29uc3RJdGVyYXRvciBpdCA9IG1Wb2x1bWVQcm9maWxlcy5maW5kKGRldmljZUNhdGVnb3J5KTsKKyAgICBpZiAoaXQgPT0gbVZvbHVtZVByb2ZpbGVzLmVuZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogZGV2aWNlIGNhdGVnb3J5ICVkIG5vdCBmb3VuZCBmb3Igc3RyZWFtICVzIiwgX19GVU5DVElPTl9fLCBkZXZpY2VDYXRlZ29yeSwKKyAgICAgICAgICAgICAgZ2V0TmFtZSgpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gMS4wZjsKKyAgICB9CisgICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludHMgY3VydmUgPSBtVm9sdW1lUHJvZmlsZXNbZGV2aWNlQ2F0ZWdvcnldOworICAgIGlmIChjdXJ2ZS5zaXplKCkgIT0gVm9sdW1lOjpWT0xDTlQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIHByb2ZpbGUgZm9yIGNhdGVnb3J5ICVkIGFuZCBmb3Igc3RyZWFtICVzIiwgX19GVU5DVElPTl9fLCBkZXZpY2VDYXRlZ29yeSwKKyAgICAgICAgICAgICAgZ2V0TmFtZSgpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gMS4wZjsKKyAgICB9CisKKyAgICAvLyB0aGUgdm9sdW1lIGluZGV4IGluIHRoZSBVSSBpcyByZWxhdGl2ZSB0byB0aGUgbWluIGFuZCBtYXggdm9sdW1lIGluZGljZXMgZm9yIHRoaXMgc3RyZWFtIHR5cGUKKyAgICBpbnQgbmJTdGVwcyA9IDEgKyBjdXJ2ZVtWb2x1bWU6OlZPTE1BWF0ubUluZGV4IC0KKyAgICAgICAgICAgIGN1cnZlW1ZvbHVtZTo6Vk9MTUlOXS5tSW5kZXg7CisKKyAgICBpZiAobUluZGV4TWF4IC0gbUluZGV4TWluID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHZvbHVtZSBpbmRleGVzIE1pbj1NYXg9JWQiLCBfX0ZVTkNUSU9OX18sIG1JbmRleE1pbik7CisgICAgICAgIHJldHVybiAxLjBmOworICAgIH0KKyAgICBpbnQgdm9sSWR4ID0gKG5iU3RlcHMgKiAoaW5kZXhJblVpIC0gbUluZGV4TWluKSkgLworICAgICAgICAgICAgKG1JbmRleE1heCAtIG1JbmRleE1pbik7CisKKyAgICAvLyBmaW5kIHdoYXQgcGFydCBvZiB0aGUgY3VydmUgdGhpcyBpbmRleCB2b2x1bWUgYmVsb25ncyB0bywgb3IgaWYgaXQncyBvdXQgb2YgYm91bmRzCisgICAgaW50IHNlZ21lbnQgPSAwOworICAgIGlmICh2b2xJZHggPCBjdXJ2ZVtWb2x1bWU6OlZPTE1JTl0ubUluZGV4KSB7ICAgICAgICAgLy8gb3V0IG9mIGJvdW5kcworICAgICAgICByZXR1cm4gMC4wZjsKKyAgICB9IGVsc2UgaWYgKHZvbElkeCA8IGN1cnZlW1ZvbHVtZTo6Vk9MS05FRTFdLm1JbmRleCkgeworICAgICAgICBzZWdtZW50ID0gMDsKKyAgICB9IGVsc2UgaWYgKHZvbElkeCA8IGN1cnZlW1ZvbHVtZTo6Vk9MS05FRTJdLm1JbmRleCkgeworICAgICAgICBzZWdtZW50ID0gMTsKKyAgICB9IGVsc2UgaWYgKHZvbElkeCA8PSBjdXJ2ZVtWb2x1bWU6OlZPTE1BWF0ubUluZGV4KSB7CisgICAgICAgIHNlZ21lbnQgPSAyOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0IG9mIGJvdW5kcworICAgICAgICByZXR1cm4gMS4wZjsKKyAgICB9CisKKyAgICAvLyBsaW5lYXIgaW50ZXJwb2xhdGlvbiBpbiB0aGUgYXR0ZW51YXRpb24gdGFibGUgaW4gZEIKKyAgICBmbG9hdCBkZWNpYmVscyA9IGN1cnZlW3NlZ21lbnRdLm1EQkF0dGVudWF0aW9uICsKKyAgICAgICAgICAgICgoZmxvYXQpKHZvbElkeCAtIGN1cnZlW3NlZ21lbnRdLm1JbmRleCkpICoKKyAgICAgICAgICAgICAgICAoIChjdXJ2ZVtzZWdtZW50KzFdLm1EQkF0dGVudWF0aW9uIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1EQkF0dGVudWF0aW9uKSAvCisgICAgICAgICAgICAgICAgICAgICgoZmxvYXQpKGN1cnZlW3NlZ21lbnQrMV0ubUluZGV4IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tSW5kZXgpKSApOworCisgICAgQUxPR1YoIlZPTFVNRSB2b2wgaW5kZXg9WyVkICVkICVkXSwgZEI9WyUuMWYgJS4xZiAlLjFmXSIsCisgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tSW5kZXgsIHZvbElkeCwKKyAgICAgICAgICAgIGN1cnZlW3NlZ21lbnQrMV0ubUluZGV4LAorICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubURCQXR0ZW51YXRpb24sCisgICAgICAgICAgICBkZWNpYmVscywKKyAgICAgICAgICAgIGN1cnZlW3NlZ21lbnQrMV0ubURCQXR0ZW51YXRpb24pOworCisgICAgcmV0dXJuIGRlY2liZWxzOworfQorCit9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJlYW0uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGMzOWRjNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyZWFtLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkVsZW1lbnQuaCIKKyNpbmNsdWRlICJFbmdpbmVEZWZpbml0aW9uLmgiCisjaW5jbHVkZSA8Vm9sdW1lLmg+CisjaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgYW5kcm9pZAoreworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoreworLyoqCisgKiBAdHBhcmFtIHJvdXRpbmdfc3RyYXRlZ3k6IEFwcGxpY2FibGUgc3RyYXRlZ3kgZm9yIHRoaXMgc3RyZWFtLgorICovCit0ZW1wbGF0ZSA8PgorY2xhc3MgRWxlbWVudDxhdWRpb19zdHJlYW1fdHlwZV90PgoreworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHN0ZDo6bWFwPFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5LCBWb2x1bWVDdXJ2ZVBvaW50cz4gVm9sdW1lUHJvZmlsZXM7CisgICAgdHlwZWRlZiBWb2x1bWVQcm9maWxlczo6aXRlcmF0b3IgVm9sdW1lUHJvZmlsZUl0ZXJhdG9yOworICAgIHR5cGVkZWYgVm9sdW1lUHJvZmlsZXM6OmNvbnN0X2l0ZXJhdG9yIFZvbHVtZVByb2ZpbGVDb25zdEl0ZXJhdG9yOworCitwdWJsaWM6CisgICAgRWxlbWVudChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKKyAgICAgICAgOiBtTmFtZShuYW1lKSwKKyAgICAgICAgICBtQXBwbGljYWJsZVN0cmF0ZWd5KFNUUkFURUdZX01FRElBKSwKKyAgICAgICAgICBtSW5kZXhNaW4oMCksCisgICAgICAgICAgbUluZGV4TWF4KDEpCisgICAge30KKyAgICB+RWxlbWVudCgpIHt9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGlkZW50aWZpZXIgb2YgdGhpcyBwb2xpY3kgZWxlbWVudAorICAgICAqCisgICAgICogQHJldHVybnMgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiB0aGlzIHBvbGljeSBlbGVtZW50CisgICAgICovCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQorCisgICAgLyoqCisgICAgKiBTZXQgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHBvbGljeSBlbGVtZW50LgorICAgICoKKyAgICAqIEB0cGFyYW0gS2V5IHR5cGUgb2YgdGhlIHVuaXF1ZSBpZGVudGlmaWVyLgorICAgICogQHBhcmFtW2luXSBpZGVudGlmaWVyIHRvIGJlIHNldC4KKyAgICAqCisgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIHRoZSBpZGVudGlmaWVyIGlzIHZhbGlkIGFuZCBzZXQgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgICAqLworICAgIHN0YXR1c190IHNldElkZW50aWZpZXIoYXVkaW9fc3RyZWFtX3R5cGVfdCBpZGVudGlmaWVyKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoaXMgcG9saWN5IGVsZW1lbnQuCisgICAgICovCisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRJZGVudGlmaWVyKCkgY29uc3QgeyByZXR1cm4gbUlkZW50aWZpZXI7IH0KKworICAgIC8qKgorICAgICAqIEEgUG9saWN5IGVsZW1lbnQgbWF5IGltcGxlbWVudCBnZXR0ZXIvc2V0dGVyIGZ1bmN0aW9uIGZvciBhIGdpdmVuIHByb3BlcnR5LgorICAgICAqIFByb3BlcnR5IG1heSBiZSByb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb19zdHJlYW1fdHlwZV90LCBhdWRpb191c2FnZV90LCBhdWRpb19zb3VyY2VfdAorICAgICAqIG9yIGEgc3RyaW5nLgorICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eT4KKyAgICBQcm9wZXJ0eSBnZXQoKSBjb25zdDsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eT4KKyAgICBzdGF0dXNfdCBzZXQoUHJvcGVydHkgcHJvcGVydHkpOworCisgICAgc3RhdHVzX3Qgc2V0Vm9sdW1lUHJvZmlsZShWb2x1bWU6OmRldmljZV9jYXRlZ29yeSBjYXRlZ29yeSwgY29uc3QgVm9sdW1lQ3VydmVQb2ludHMgJnBvaW50cyk7CisKKyAgICBmbG9hdCB2b2xJbmRleFRvRGIoVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksIGludCBpbmRleEluVWkpOworCisgICAgc3RhdHVzX3QgaW5pdFZvbHVtZShpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCk7CisKK3ByaXZhdGU6CisgICAgLyogQ29weSBmYWNpbGl0aWVzIGFyZSBwdXQgcHJpdmF0ZSB0byBkaXNhYmxlIGNvcHkuICovCisgICAgRWxlbWVudChjb25zdCBFbGVtZW50ICZvYmplY3QpOworICAgIEVsZW1lbnQgJm9wZXJhdG9yPShjb25zdCBFbGVtZW50ICZvYmplY3QpOworCisgICAgc3RkOjpzdHJpbmcgbU5hbWU7IC8qKjwgVW5pcXVlIGxpdGVyYWwgSWRlbnRpZmllciBvZiBhIHBvbGljeSBiYXNlIGVsZW1lbnQqLworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbUlkZW50aWZpZXI7IC8qKjwgVW5pcXVlIG51bWVyaWNhbCBJZGVudGlmaWVyIG9mIGEgcG9saWN5IGJhc2UgZWxlbWVudCovCisKKyAgICByb3V0aW5nX3N0cmF0ZWd5IG1BcHBsaWNhYmxlU3RyYXRlZ3k7IC8qKjwgQXBwbGljYWJsZSBzdHJhdGVneSBmb3IgdGhpcyBzdHJlYW0uICovCisKKyAgICAvKioKKyAgICAgKiBDb2xsZWN0aW9uIG9mIHZvbHVtZSBwcm9maWxlcyBpbmRleGVkIGJ5IHRoZSBzdHJlYW0gdHlwZS4KKyAgICAgKiBWb2x1bWUgaXMgdGhlIG9ubHkgcmVhc29uIHdoeSB0aGUgc3RyZWFtIHByb2ZpbGUgd2FzIG5vdCByZW1vdmVkIGZyb20gcG9saWN5IHdoZW4gaW50cm9kdWNpbmcKKyAgICAgKiBhdHRyaWJ1dGVzLgorICAgICAqLworICAgIFZvbHVtZVByb2ZpbGVzIG1Wb2x1bWVQcm9maWxlczsKKworICAgIGludCBtSW5kZXhNaW47CisKKyAgICBpbnQgbUluZGV4TWF4OworfTsKKwordHlwZWRlZiBFbGVtZW50PGF1ZGlvX3N0cmVhbV90eXBlX3Q+IFN0cmVhbTsKKworfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Vc2FnZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1VzYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZDIwODI4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Vc2FnZS5jcHAKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BvbGljeUVuZ2luZS9Vc2FnZSIKKworI2luY2x1ZGUgIlVzYWdlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkCit7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit7CisKK3N0YXR1c190IEVsZW1lbnQ8YXVkaW9fdXNhZ2VfdD46OnNldElkZW50aWZpZXIoYXVkaW9fdXNhZ2VfdCBpZGVudGlmaWVyKQoreworICAgIGlmIChpZGVudGlmaWVyID4gQVVESU9fVVNBR0VfTUFYKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1JZGVudGlmaWVyID0gaWRlbnRpZmllcjsKKyAgICBBTE9HRCgiJXM6IFVzYWdlICVzIGhhcyBpZGVudGlmaWVyIDB4JVgiLCBfX0ZVTkNUSU9OX18sIGdldE5hbWUoKS5jX3N0cigpLCBpZGVudGlmaWVyKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3RlbXBsYXRlIDw+CitzdGF0dXNfdCBFbGVtZW50PGF1ZGlvX3VzYWdlX3Q+OjpzZXQ8cm91dGluZ19zdHJhdGVneT4ocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkKK3sKKyAgICBpZiAoc3RyYXRlZ3kgPj0gTlVNX1NUUkFURUdJRVMpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR0QoIiVzOiAlZCBmb3IgVXNhZ2UgJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmF0ZWd5LCBnZXROYW1lKCkuY19zdHIoKSk7CisgICAgbUFwcGxpY2FibGVTdHJhdGVneSA9IHN0cmF0ZWd5OworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordGVtcGxhdGUgPD4KK3JvdXRpbmdfc3RyYXRlZ3kgRWxlbWVudDxhdWRpb191c2FnZV90Pjo6Z2V0PHJvdXRpbmdfc3RyYXRlZ3k+KCkgY29uc3QKK3sKKyAgICBBTE9HRCgiJXM6ICVkIGZvciBVc2FnZSAlcyIsIF9fRlVOQ1RJT05fXywgbUFwcGxpY2FibGVTdHJhdGVneSwgZ2V0TmFtZSgpLmNfc3RyKCkpOworICAgIHJldHVybiBtQXBwbGljYWJsZVN0cmF0ZWd5OworfQorCit9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1VzYWdlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1VzYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDY5ZTBlMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvVXNhZ2UuaApAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJFbGVtZW50LmgiCisjaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkCit7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit7CisKKy8qKgorICogQHRwYXJhbSByb3V0aW5nX3N0cmF0ZWd5OiBBcHBsaWNhYmxlIHN0cmF0ZWd5IGZvciB0aGlzIHVzYWdlLgorICovCit0ZW1wbGF0ZSA8PgorY2xhc3MgRWxlbWVudDxhdWRpb191c2FnZV90PgoreworcHVibGljOgorICAgIEVsZW1lbnQoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpCisgICAgICAgIDogbU5hbWUobmFtZSksCisgICAgICAgICAgbUFwcGxpY2FibGVTdHJhdGVneShTVFJBVEVHWV9NRURJQSkKKyAgICB7fQorICAgIH5FbGVtZW50KCkge30KKworICAgIC8qKgorICAgICAqIFJldHVybnMgaWRlbnRpZmllciBvZiB0aGlzIHBvbGljeSBlbGVtZW50CisgICAgICoKKyAgICAgKiBAcmV0dXJucyBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBuYW1lIG9mIHRoaXMgcG9saWN5IGVsZW1lbnQKKyAgICAgKi8KKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9CisKKyAgICAvKioKKyAgICAqIFNldCB0aGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgcG9saWN5IGVsZW1lbnQuCisgICAgKgorICAgICogQHRwYXJhbSBLZXkgdHlwZSBvZiB0aGUgdW5pcXVlIGlkZW50aWZpZXIuCisgICAgKiBAcGFyYW1baW5dIGlkZW50aWZpZXIgdG8gYmUgc2V0LgorICAgICoKKyAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIGlkZW50aWZpZXIgaXMgdmFsaWQgYW5kIHNldCBjb3JyZWN0bHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICAgICovCisgICAgc3RhdHVzX3Qgc2V0SWRlbnRpZmllcihhdWRpb191c2FnZV90IGlkZW50aWZpZXIpOworCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhpcyBwb2xpY3kgZWxlbWVudC4KKyAgICAgKi8KKyAgICBhdWRpb191c2FnZV90IGdldElkZW50aWZpZXIoKSBjb25zdCB7IHJldHVybiBtSWRlbnRpZmllcjsgfQorCisgICAgLyoqCisgICAgICogQSBQb2xpY3kgZWxlbWVudCBtYXkgaW1wbGVtZW50IGdldHRlci9zZXR0ZXIgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gcHJvcGVydHkuCisgICAgICogUHJvcGVydHkgbWF5IGJlIHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90CisgICAgICogb3IgYSBzdHJpbmcuCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5PgorICAgIFByb3BlcnR5IGdldCgpIGNvbnN0OworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5PgorICAgIHN0YXR1c190IHNldChQcm9wZXJ0eSBwcm9wZXJ0eSk7CisKK3ByaXZhdGU6CisgICAgLyogQ29weSBmYWNpbGl0aWVzIGFyZSBwdXQgcHJpdmF0ZSB0byBkaXNhYmxlIGNvcHkuICovCisgICAgRWxlbWVudChjb25zdCBFbGVtZW50ICZvYmplY3QpOworICAgIEVsZW1lbnQgJm9wZXJhdG9yPShjb25zdCBFbGVtZW50ICZvYmplY3QpOworCisgICAgc3RkOjpzdHJpbmcgbU5hbWU7IC8qKjwgVW5pcXVlIGxpdGVyYWwgSWRlbnRpZmllciBvZiBhIHBvbGljeSBiYXNlIGVsZW1lbnQqLworICAgIGF1ZGlvX3VzYWdlX3QgbUlkZW50aWZpZXI7IC8qKjwgVW5pcXVlIG51bWVyaWNhbCBJZGVudGlmaWVyIG9mIGEgcG9saWN5IGJhc2UgZWxlbWVudCovCisgICAgcm91dGluZ19zdHJhdGVneSBtQXBwbGljYWJsZVN0cmF0ZWd5OyAvKio8IEFwcGxpY2FibGUgc3RyYXRlZ3kgZm9yIHRoaXMgdXNhZ2UuICovCit9OworCit0eXBlZGVmIEVsZW1lbnQ8YXVkaW9fdXNhZ2VfdD4gVXNhZ2U7CisKK30gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NmY5MTMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDAgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgV1JBUFBFUiBMSUJSQVJZCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZSBcCisgICAgJChUQVJHRVRfT1VUX0hFQURFUlMpL3BhcmFtZXRlciBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlIFwKKyAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L3V0aWxpdGllcy9jb252ZXJ0IFwKKworTE9DQUxfU1JDX0ZJTEVTOj0gUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuY3BwCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgIGxpYm1lZGlhX2hlbHBlciBcCisKK0xPQ0FMX01PRFVMRTo9IGxpYmF1ZGlvcG9saWN5cGZ3d3JhcHBlcgorTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9ICQoTE9DQUxfUEFUSCkvaW5jbHVkZQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IgLVdleHRyYQorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDT05GSUdVUkFUSU9OIEZJTEUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIHNwZWNpZmljIG1hbmFnZW1lbnQgb2YgYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0VUQykKK0xPQ0FMX1NSQ19GSUxFUyA6PSBjb25maWcvJChMT0NBTF9NT0RVTEUpCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2ZlNDlkNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmNwcApAQCAtMCwwICsxLDQzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BvbGljeUVuZ2luZS9QRldXcmFwcGVyIgorCisjaW5jbHVkZSAiUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuaCIKKyNpbmNsdWRlICJhdWRpb19wb2xpY3lfY3JpdGVyaWFfY29uZi5oIgorI2luY2x1ZGUgPFBhcmFtZXRlck1nclBsYXRmb3JtQ29ubmVjdG9yLmg+CisjaW5jbHVkZSA8U2VsZWN0aW9uQ3JpdGVyaW9uVHlwZUludGVyZmFjZS5oPgorI2luY2x1ZGUgPFNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZS5oPgorI2luY2x1ZGUgPGNvbnZlcnQuaD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgorI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKKy8vLyBQRlcgcmVsYXRlZCBkZWZpbml0aW9ucworLy8gTG9nZ2VyCitjbGFzcyBQYXJhbWV0ZXJNZ3JQbGF0Zm9ybUNvbm5lY3RvckxvZ2dlciA6IHB1YmxpYyBDUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3I6OklMb2dnZXIKK3sKK3B1YmxpYzoKKyAgICBQYXJhbWV0ZXJNZ3JQbGF0Zm9ybUNvbm5lY3RvckxvZ2dlcigpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgbG9nKGJvb2wgaXNXYXJuaW5nLCBjb25zdCBzdHJpbmcgJmxvZykKKyAgICB7CisgICAgICAgIGNvbnN0IHN0YXRpYyBzdHJpbmcgZm9ybWF0KCJwb2xpY3ktcGFyYW1ldGVyLW1hbmFnZXI6ICIpOworCisgICAgICAgIGlmIChpc1dhcm5pbmcpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyAlcyIsIGZvcm1hdC5jX3N0cigpLCBsb2cuY19zdHIoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRCgiJXMgJXMiLCBmb3JtYXQuY19zdHIoKSwgbG9nLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorfTsKKworbmFtZXNwYWNlIGFuZHJvaWQKK3sKKwordXNpbmcgdXRpbGl0aWVzOjpjb252ZXJ0VG87CisKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kKK3sKK2NvbnN0IGNoYXIgKmNvbnN0IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjptUG9saWN5UGZ3RGVmYXVsdENvbmZGaWxlTmFtZSA9CisgICAgIi9ldGMvcGFyYW1ldGVyLWZyYW1ld29yay9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbCI7CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OnBhcmFtZXRlck1hbmFnZXJFbGVtZW50U3VwcG9ydGVkPElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U+IHt9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6cGFyYW1ldGVyTWFuYWdlckVsZW1lbnRTdXBwb3J0ZWQ8SVNlbGVjdGlvbkNyaXRlcmlvblR5cGVJbnRlcmZhY2U+IHt9OworCitQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6UGFyYW1ldGVyTWFuYWdlcldyYXBwZXIoKQorICAgIDogbVBmd0Nvbm5lY3RvckxvZ2dlcihuZXcgUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3JMb2dnZXIpCit7CisgICAgLy8gQ29ubmVjdG9yCisgICAgbVBmd0Nvbm5lY3RvciA9IG5ldyBDUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3IobVBvbGljeVBmd0RlZmF1bHRDb25mRmlsZU5hbWUpOworCisgICAgLy8gTG9nZ2VyCisgICAgbVBmd0Nvbm5lY3Rvci0+c2V0TG9nZ2VyKG1QZndDb25uZWN0b3JMb2dnZXIpOworCisgICAgLy8gTG9hZCBjcml0ZXJpYSBmaWxlCisgICAgaWYgKChsb2FkQXVkaW9Qb2xpY3lDcml0ZXJpYUNvbmZpZyhnQXVkaW9Qb2xpY3lDcml0ZXJpYVZlbmRvckNvbmZGaWxlUGF0aCkgIT0gTk9fRVJST1IpICYmCisgICAgICAgIChsb2FkQXVkaW9Qb2xpY3lDcml0ZXJpYUNvbmZpZyhnQXVkaW9Qb2xpY3lDcml0ZXJpYUNvbmZGaWxlUGF0aCkgIT0gTk9fRVJST1IpKSB7CisgICAgICAgIEFMT0dFKCIlczogTmVpdGhlciB2ZW5kb3IgY29uZiBmaWxlICglcykgbm9yIHN5c3RlbSBjb25mIGZpbGUgKCVzKSBjb3VsZCBiZSBmb3VuZCIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZ0F1ZGlvUG9saWN5Q3JpdGVyaWFWZW5kb3JDb25mRmlsZVBhdGgsCisgICAgICAgICAgICAgIGdBdWRpb1BvbGljeUNyaXRlcmlhQ29uZkZpbGVQYXRoKTsKKyAgICB9CisgICAgQUxPR0QoIiVzOiBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlciBpbnN0YW50aWF0ZWQhIiwgX19GVU5DVElPTl9fKTsKK30KKworUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6On5QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcigpCit7CisgICAgLy8gVW5zZXQgbG9nZ2VyCisgICAgbVBmd0Nvbm5lY3Rvci0+c2V0TG9nZ2VyKE5VTEwpOworICAgIC8vIFJlbW92ZSBsb2dnZXIKKyAgICBkZWxldGUgbVBmd0Nvbm5lY3RvckxvZ2dlcjsKKyAgICAvLyBSZW1vdmUgY29ubmVjdG9yCisgICAgZGVsZXRlIG1QZndDb25uZWN0b3I7Cit9CisKK3N0YXR1c190IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpzdGFydCgpCit7CisgICAgQUxPR0QoIiVzOiBpbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgLy8vIFN0YXJ0IFBGVworICAgIHN0ZDo6c3RyaW5nIGVycm9yOworICAgIGlmICghbVBmd0Nvbm5lY3Rvci0+c3RhcnQoZXJyb3IpKSB7CisgICAgICAgIEFMT0dFKCIlczogUG9saWN5IFBGVyBzdGFydCBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVycm9yLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgQUxPR0QoIiVzOiBQb2xpY3kgUEZXIHN1Y2Nlc3NmdWxseSBzdGFydGVkISIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKK3ZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmFkZENyaXRlcmlvblR5cGUoY29uc3Qgc3RyaW5nICZ0eXBlTmFtZSwgYm9vbCBpc0luY2x1c2l2ZSkKK3sKKyAgICBBTE9HX0FTU0VSVChtUG9saWN5Q3JpdGVyaW9uVHlwZXMuZmluZCh0eXBlTmFtZSkgPT0gbVBvbGljeUNyaXRlcmlvblR5cGVzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICJDcml0ZXJpb25UeXBlICIgPDwgdHlwZU5hbWUgPDwgIiBhbHJlYWR5IGFkZGVkIik7CisgICAgQUxPR0QoIiVzOiBBZGRpbmcgbmV3IGNyaXRlcmlvblR5cGUgJXMiLCBfX0ZVTkNUSU9OX18sIHR5cGVOYW1lLmNfc3RyKCkpOworCisgICAgbVBvbGljeUNyaXRlcmlvblR5cGVzW3R5cGVOYW1lXSA9IG1QZndDb25uZWN0b3ItPmNyZWF0ZVNlbGVjdGlvbkNyaXRlcmlvblR5cGUoaXNJbmNsdXNpdmUpOworfQorCit2b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjphZGRDcml0ZXJpb25UeXBlVmFsdWVQYWlyKAorICAgIGNvbnN0IHN0cmluZyAmdHlwZU5hbWUsCisgICAgdWludDMyX3QgbnVtZXJpY1ZhbHVlLAorICAgIGNvbnN0IHN0cmluZyAmbGl0ZXJhbFZhbHVlKQoreworICAgIEFMT0dfQVNTRVJUKG1Qb2xpY3lDcml0ZXJpb25UeXBlcy5maW5kKHR5cGVOYW1lKSAhPSBtUG9saWN5Q3JpdGVyaW9uVHlwZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgIkNyaXRlcmlvblR5cGUgIiA8PCB0eXBlTmFtZS5jX3N0cigpIDw8ICJub3QgZm91bmQiKTsKKyAgICBBTE9HVigiJXM6IEFkZGluZyBuZXcgdmFsdWUgcGFpciAoJWQsJXMpIGZvciBjcml0ZXJpb25UeXBlICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgIG51bWVyaWNWYWx1ZSwgbGl0ZXJhbFZhbHVlLmNfc3RyKCksIHR5cGVOYW1lLmNfc3RyKCkpOworICAgIElTZWxlY3Rpb25Dcml0ZXJpb25UeXBlSW50ZXJmYWNlICpjcml0ZXJpb25UeXBlID0gbVBvbGljeUNyaXRlcmlvblR5cGVzW3R5cGVOYW1lXTsKKyAgICBjcml0ZXJpb25UeXBlLT5hZGRWYWx1ZVBhaXIobnVtZXJpY1ZhbHVlLCBsaXRlcmFsVmFsdWUuY19zdHIoKSk7Cit9CisKK3ZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmxvYWRDcml0ZXJpb25UeXBlKGNub2RlICpyb290LCBib29sIGlzSW5jbHVzaXZlKQoreworICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOworICAgIGNub2RlICpub2RlOworICAgIGZvciAobm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOyBub2RlICE9IE5VTEw7IG5vZGUgPSBub2RlLT5uZXh0KSB7CisKKyAgICAgICAgQUxPR19BU1NFUlQobm9kZSAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlIik7CisgICAgICAgIGNvbnN0IGNoYXIgKnR5cGVOYW1lID0gbm9kZS0+bmFtZTsKKyAgICAgICAgY2hhciAqdmFsdWVOYW1lcyA9IHN0cm5kdXAobm9kZS0+dmFsdWUsIHN0cmxlbihub2RlLT52YWx1ZSkpOworCisgICAgICAgIGFkZENyaXRlcmlvblR5cGUodHlwZU5hbWUsIGlzSW5jbHVzaXZlKTsKKworICAgICAgICB1aW50MzJfdCBpbmRleCA9IDA7CisgICAgICAgIGNoYXIgKmN0eDsKKyAgICAgICAgY2hhciAqdmFsdWVOYW1lID0gc3RydG9rX3IodmFsdWVOYW1lcywgIiwiLCAmY3R4KTsKKyAgICAgICAgd2hpbGUgKHZhbHVlTmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoc3RybGVuKHZhbHVlTmFtZSkgIT0gMCkgeworCisgICAgICAgICAgICAgICAgLy8gQ29uZiBmaWxlIG1heSB1c2Ugb3Igbm90IHBhaXIsIGlmIG5vIHBhaXIsIHVzZSBpbmNyZW1lbnRhbCBpbmRleCwgZWxzZQorICAgICAgICAgICAgICAgIC8vIHVzZSBwcm92aWRlZCBpbmRleC4KKyAgICAgICAgICAgICAgICBpZiAoc3RyY2hyKHZhbHVlTmFtZSwgJzonKSAhPSBOVUxMKSB7CisKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqZmlyc3QgPSBzdHJ0b2sodmFsdWVOYW1lLCAiOiIpOworICAgICAgICAgICAgICAgICAgICBjaGFyICpzZWNvbmQgPSBzdHJ0b2soTlVMTCwgIjoiKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoKGZpcnN0ICE9IE5VTEwpICYmIChzdHJsZW4oZmlyc3QpICE9IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWNvbmQgIT0gTlVMTCkgJiYgKHN0cmxlbihzZWNvbmQpICE9IDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCB2YWx1ZSBwYWlyIik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjb252ZXJ0VG88c3RyaW5nLCB1aW50MzJfdD4oZmlyc3QsIGluZGV4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGluZGV4KCVzKSBmb3VuZCIsIF9fRlVOQ1RJT05fXywgZmlyc3QpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFkZENyaXRlcmlvblR5cGVWYWx1ZVBhaXIodHlwZU5hbWUsIGluZGV4LCBzZWNvbmQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGZ3SW5kZXggPSBpc0luY2x1c2l2ZSA/IDEgPDwgaW5kZXggOiBpbmRleDsKKyAgICAgICAgICAgICAgICAgICAgYWRkQ3JpdGVyaW9uVHlwZVZhbHVlUGFpcih0eXBlTmFtZSwgcGZ3SW5kZXgsIHZhbHVlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsdWVOYW1lID0gc3RydG9rX3IoTlVMTCwgIiwiLCAmY3R4KTsKKyAgICAgICAgfQorICAgICAgICBmcmVlKHZhbHVlTmFtZXMpOworICAgIH0KK30KKwordm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6bG9hZEluY2x1c2l2ZUNyaXRlcmlvblR5cGUoY25vZGUgKnJvb3QpCit7CisgICAgQUxPR19BU1NFUlQocm9vdCAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlIik7CisgICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBnSW5jbHVzaXZlQ3JpdGVyaW9uVHlwZVRhZy5jX3N0cigpKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbG9hZENyaXRlcmlvblR5cGUobm9kZSwgdHJ1ZSk7Cit9CisKK3ZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmxvYWRFeGNsdXNpdmVDcml0ZXJpb25UeXBlKGNub2RlICpyb290KQoreworICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOworICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgZ0V4Y2x1c2l2ZUNyaXRlcmlvblR5cGVUYWcuY19zdHIoKSk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGxvYWRDcml0ZXJpb25UeXBlKG5vZGUsIGZhbHNlKTsKK30KKwordm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6cGFyc2VDaGlsZHJlbihjbm9kZSAqcm9vdCwgc3RyaW5nICZkZWZhdWx0VmFsdWUsIHN0cmluZyAmdHlwZSkKK3sKKyAgICBBTE9HX0FTU0VSVChyb290ICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGUiKTsKKyAgICBjbm9kZSAqbm9kZTsKKyAgICBmb3IgKG5vZGUgPSByb290LT5maXJzdF9jaGlsZDsgbm9kZSAhPSBOVUxMOyBub2RlID0gbm9kZS0+bmV4dCkgeworICAgICAgICBBTE9HX0FTU0VSVChub2RlICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGUiKTsKKworICAgICAgICBpZiAoc3RyaW5nKG5vZGUtPm5hbWUpID09IGdEZWZhdWx0VGFnKSB7CisgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBub2RlLT52YWx1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJpbmcobm9kZS0+bmFtZSkgPT0gZ1R5cGVUYWcpIHsKKyAgICAgICAgICAgIHR5cGUgPSBub2RlLT52YWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICBBTE9HRSgiJXM6IFVucmVjb2duaXplZCAlcyAlcyBub2RlIiwgX19GVU5DVElPTl9fLCBub2RlLT5uYW1lLCBub2RlLT52YWx1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCAqUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmdldEVsZW1lbnQoY29uc3Qgc3RyaW5nICZuYW1lLCBzdGQ6Om1hcDxzdHJpbmcsIFQgKj4gJmVsZW1lbnRzTWFwKQoreworICAgIHBhcmFtZXRlck1hbmFnZXJFbGVtZW50U3VwcG9ydGVkPFQ+KCk7CisgICAgdHlwZW5hbWUgc3RkOjptYXA8c3RyaW5nLCBUICo+OjppdGVyYXRvciBpdCA9IGVsZW1lbnRzTWFwLmZpbmQobmFtZSk7CisgICAgQUxPR19BU1NFUlQoaXQgIT0gZWxlbWVudHNNYXAuZW5kKCksICJFbGVtZW50ICIgPDwgbmFtZSA8PCAiIG5vdCBmb3VuZCIpOworICAgIHJldHVybiBpdC0+c2Vjb25kOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NvbnN0IFQgKlBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpnZXRFbGVtZW50KGNvbnN0IHN0cmluZyAmbmFtZSwgY29uc3Qgc3RkOjptYXA8c3RyaW5nLCBUICo+ICZlbGVtZW50c01hcCkgY29uc3QKK3sKKyAgICBwYXJhbWV0ZXJNYW5hZ2VyRWxlbWVudFN1cHBvcnRlZDxUPigpOworICAgIHR5cGVuYW1lIHN0ZDo6bWFwPHN0cmluZywgVCAqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBlbGVtZW50c01hcC5maW5kKG5hbWUpOworICAgIEFMT0dfQVNTRVJUKGl0ICE9IGVsZW1lbnRzTWFwLmVuZCgpLCAiRWxlbWVudCAiIDw8IG5hbWUgPDwgIiBub3QgZm91bmQiKTsKKyAgICByZXR1cm4gaXQtPnNlY29uZDsKK30KKwordm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6bG9hZENyaXRlcmlhKGNub2RlICpyb290KQoreworICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOworICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgZ0NyaXRlcmlvblRhZy5jX3N0cigpKTsKKworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coIiVzOiBubyBpbmNsdXNpdmUgY3JpdGVyaWEgZm91bmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAobm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOyBub2RlICE9IE5VTEw7IG5vZGUgPSBub2RlLT5uZXh0KSB7CisgICAgICAgIGxvYWRDcml0ZXJpb24obm9kZSk7CisgICAgfQorfQorCit2b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjphZGRDcml0ZXJpb24oY29uc3Qgc3RyaW5nICZuYW1lLCBjb25zdCBzdHJpbmcgJnR5cGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nICZkZWZhdWx0TGl0ZXJhbFZhbHVlKQoreworICAgIEFMT0dfQVNTRVJUKG1Qb2xpY3lDcml0ZXJpYS5maW5kKGNyaXRlcmlvbk5hbWUpID09IG1Qb2xpY3lDcml0ZXJpYS5lbmQoKSwKKyAgICAgICAgICAgICAgICAiUm91dGUgQ3JpdGVyaW9uICIgPDwgY3JpdGVyaW9uTmFtZSA8PCAiIGFscmVhZHkgYWRkZWQiKTsKKworICAgIElTZWxlY3Rpb25Dcml0ZXJpb25UeXBlSW50ZXJmYWNlICpjcml0ZXJpb25UeXBlID0KKyAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvblR5cGVJbnRlcmZhY2U+KHR5cGVOYW1lLCBtUG9saWN5Q3JpdGVyaW9uVHlwZXMpOworCisgICAgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0KKyAgICAgICAgICAgIG1QZndDb25uZWN0b3ItPmNyZWF0ZVNlbGVjdGlvbkNyaXRlcmlvbihuYW1lLCBjcml0ZXJpb25UeXBlKTsKKworICAgIG1Qb2xpY3lDcml0ZXJpYVtuYW1lXSA9IGNyaXRlcmlvbjsKKyAgICBpbnQgbnVtZXJpY2FsVmFsdWUgPSAwOworICAgIGlmICghY3JpdGVyaW9uVHlwZS0+Z2V0TnVtZXJpY2FsVmFsdWUoZGVmYXVsdExpdGVyYWxWYWx1ZS5jX3N0cigpLCAgbnVtZXJpY2FsVmFsdWUpKSB7CisgICAgICAgIEFMT0dFKCIlczsgdHJ5aW5nIHRvIGFwcGx5IGludmFsaWQgZGVmYXVsdCBsaXRlcmFsIHZhbHVlICglcykiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIGRlZmF1bHRMaXRlcmFsVmFsdWUuY19zdHIoKSk7CisgICAgfQorICAgIGNyaXRlcmlvbi0+c2V0Q3JpdGVyaW9uU3RhdGUobnVtZXJpY2FsVmFsdWUpOworfQorCit2b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpsb2FkQ3JpdGVyaW9uKGNub2RlICpyb290KQoreworICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOworICAgIGNvbnN0IGNoYXIgKmNyaXRlcmlvbk5hbWUgPSByb290LT5uYW1lOworCisgICAgQUxPR19BU1NFUlQobVBvbGljeUNyaXRlcmlhLmZpbmQoY3JpdGVyaW9uTmFtZSkgPT0gbVBvbGljeUNyaXRlcmlhLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICJDcml0ZXJpb24gIiA8PCBjcml0ZXJpb25OYW1lIDw8ICIgYWxyZWFkeSBhZGRlZCIpOworCisgICAgc3RyaW5nIHBhcmFtS2V5TmFtZSA9ICIiOworICAgIHN0cmluZyBwYXRoID0gIiI7CisgICAgc3RyaW5nIHR5cGVOYW1lID0gIiI7CisgICAgc3RyaW5nIGRlZmF1bHRWYWx1ZSA9ICIiOworCisgICAgcGFyc2VDaGlsZHJlbihyb290LCBkZWZhdWx0VmFsdWUsIHR5cGVOYW1lKTsKKworICAgIGFkZENyaXRlcmlvbihjcml0ZXJpb25OYW1lLCB0eXBlTmFtZSwgZGVmYXVsdFZhbHVlKTsKK30KKwordm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6bG9hZENvbmZpZyhjbm9kZSAqcm9vdCkKK3sKKyAgICBBTE9HX0FTU0VSVChyb290ICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGUiKTsKKyAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIGdQb2xpY3lDb25mVGFnLmNfc3RyKCkpOworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coIiVzOiBDb3VsZCBub3QgZmluZCBub2RlIGZvciBwZnciLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dEKCIlczogTG9hZGluZyBjb25mIGZvciBwZnciLCBfX0ZVTkNUSU9OX18pOworICAgIGxvYWRJbmNsdXNpdmVDcml0ZXJpb25UeXBlKG5vZGUpOworICAgIGxvYWRFeGNsdXNpdmVDcml0ZXJpb25UeXBlKG5vZGUpOworICAgIGxvYWRDcml0ZXJpYShub2RlKTsKK30KKworCitzdGF0dXNfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6bG9hZEF1ZGlvUG9saWN5Q3JpdGVyaWFDb25maWcoY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgICBBTE9HX0FTU0VSVChwYXRoICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGU6IGVtcHR5IHBhdGgiKTsKKyAgICBjbm9kZSAqcm9vdDsKKyAgICBjaGFyICpkYXRhOworICAgIEFMT0dEKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgZGF0YSA9IChjaGFyICopbG9hZF9maWxlKHBhdGgsIE5VTEwpOworICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorICAgIHJvb3QgPSBjb25maWdfbm9kZSgiIiwgIiIpOworICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgIlVuYWJsZSB0byBhbGxvY2F0ZSBhIGNvbmZpZ3VyYXRpb24gbm9kZSIpOworICAgIGNvbmZpZ19sb2FkKHJvb3QsIGRhdGEpOworCisgICAgbG9hZENvbmZpZyhyb290KTsKKworICAgIGNvbmZpZ19mcmVlKHJvb3QpOworICAgIGZyZWUocm9vdCk7CisgICAgZnJlZShkYXRhKTsKKyAgICBBTE9HRCgiJXM6IGxvYWRlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitib29sIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjppc1N0YXJ0ZWQoKQoreworICAgIHJldHVybiBtUGZ3Q29ubmVjdG9yICYmIG1QZndDb25uZWN0b3ItPmlzU3RhcnRlZCgpOworfQorCitzdGF0dXNfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3QgbW9kZSkKK3sKKyAgICBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICpjcml0ZXJpb24gPSBtUG9saWN5Q3JpdGVyaWFbZ1Bob25lU3RhdGVDcml0ZXJpb25UYWddOworICAgIGlmICghaXNWYWx1ZVZhbGlkRm9yQ3JpdGVyaW9uKGNyaXRlcmlvbiwgc3RhdGljX2Nhc3Q8aW50Pihtb2RlKSkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgY3JpdGVyaW9uLT5zZXRDcml0ZXJpb25TdGF0ZSgoaW50KShtb2RlKSk7CisgICAgYXBwbHlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2F1ZGlvX21vZGVfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6Z2V0UGhvbmVTdGF0ZSgpIGNvbnN0Cit7CisgICAgY29uc3QgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0KKyAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oZ1Bob25lU3RhdGVDcml0ZXJpb25UYWcsIG1Qb2xpY3lDcml0ZXJpYSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGF1ZGlvX21vZGVfdD4oY3JpdGVyaW9uLT5nZXRDcml0ZXJpb25TdGF0ZSgpKTsKK30KKworc3RhdHVzX3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OnNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKK3sKKyAgICAvLyBAdG9kbzogcmV0dXJuIGFuIGVycm9yIG9uIGEgdW5zdXBwb3J0ZWQgdmFsdWUKKyAgICBpZiAodXNhZ2UgPiBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKmNyaXRlcmlvbiA9IG1Qb2xpY3lDcml0ZXJpYVtnRm9yY2VVc2VDcml0ZXJpb25UYWdbdXNhZ2VdXTsKKyAgICBpZiAoIWlzVmFsdWVWYWxpZEZvckNyaXRlcmlvbihjcml0ZXJpb24sIHN0YXRpY19jYXN0PGludD4oY29uZmlnKSkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgY3JpdGVyaW9uLT5zZXRDcml0ZXJpb25TdGF0ZSgoaW50KWNvbmZpZyk7CisgICAgYXBwbHlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2F1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgY29uc3QKK3sKKyAgICAvLyBAdG9kbzogcmV0dXJuIGFuIGVycm9yIG9uIGEgdW5zdXBwb3J0ZWQgdmFsdWUKKyAgICBpZiAodXNhZ2UgPiBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVCkgeworICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkU7CisgICAgfQorICAgIGNvbnN0IElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKmNyaXRlcmlvbiA9CisgICAgICAgICAgICBnZXRFbGVtZW50PElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U+KGdGb3JjZVVzZUNyaXRlcmlvblRhZ1t1c2FnZV0sIG1Qb2xpY3lDcml0ZXJpYSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3Q+KGNyaXRlcmlvbi0+Z2V0Q3JpdGVyaW9uU3RhdGUoKSk7Cit9CisKK2Jvb2wgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmlzVmFsdWVWYWxpZEZvckNyaXRlcmlvbihJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICpjcml0ZXJpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlVG9DaGVjaykKK3sKKyAgICBjb25zdCBJU2VsZWN0aW9uQ3JpdGVyaW9uVHlwZUludGVyZmFjZSAqaW50ZXJmYWNlID0gY3JpdGVyaW9uLT5nZXRDcml0ZXJpb25UeXBlKCk7CisgICAgc3RyaW5nIGxpdGVyYWxWYWx1ZTsKKyAgICByZXR1cm4gaW50ZXJmYWNlLT5nZXRMaXRlcmFsVmFsdWUodmFsdWVUb0NoZWNrLCBsaXRlcmFsVmFsdWUpOworfQorCitzdGF0dXNfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKi8qZGV2aWNlQWRkcmVzKi8pCit7CisgICAgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0gTlVMTDsKKworICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlcyhkZXZpY2VzKSkgeworICAgICAgICBjcml0ZXJpb24gPSBtUG9saWN5Q3JpdGVyaWFbZ091dHB1dERldmljZUNyaXRlcmlvblRhZ107CisgICAgfSBlbHNlIGlmIChkZXZpY2VzICYgQVVESU9fREVWSUNFX0JJVF9JTikgeworICAgICAgICBjcml0ZXJpb24gPSBtUG9saWN5Q3JpdGVyaWFbZ0lucHV0RGV2aWNlQ3JpdGVyaW9uVGFnXTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1RZUEU7CisgICAgfQorICAgIGlmIChjcml0ZXJpb24gPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgZGV2aWNlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICBpbnQzMl90IHByZXZpb3VzRGV2aWNlcyA9IGNyaXRlcmlvbi0+Z2V0Q3JpdGVyaW9uU3RhdGUoKTsKKyAgICBzd2l0Y2ggKHN0YXRlKQorICAgIHsKKyAgICBjYXNlIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFOgorICAgICAgICBjcml0ZXJpb24tPnNldENyaXRlcmlvblN0YXRlKHByZXZpb3VzRGV2aWNlcyB8PSBkZXZpY2VzKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU6CisgICAgICAgIGlmIChkZXZpY2VzICYgQVVESU9fREVWSUNFX0JJVF9JTikgeworICAgICAgICAgICAgZGV2aWNlcyAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICAgICAgfQorICAgICAgICBjcml0ZXJpb24tPnNldENyaXRlcmlvblN0YXRlKHByZXZpb3VzRGV2aWNlcyAmPSB+ZGV2aWNlcyk7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgYXBwbHlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmFwcGx5UGxhdGZvcm1Db25maWd1cmF0aW9uKCkKK3sKKyAgICBtUGZ3Q29ubmVjdG9yLT5hcHBseUNvbmZpZ3VyYXRpb25zKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvYXVkaW9fcG9saWN5X2NyaXRlcmlhX2NvbmYuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2F1ZGlvX3BvbGljeV9jcml0ZXJpYV9jb25mLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNThlNzEzNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2F1ZGlvX3BvbGljeV9jcml0ZXJpYV9jb25mLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgRGVmaW5pdGlvbnMgZm9yIGF1ZGlvIHBvbGljeSBjcml0ZXJpYSBjb25maWd1cmF0aW9uIGZpbGUgKGF1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mKSAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICBAVE9ETzogc2NyaXB0ZWQgZnJvbSBhdWRpby5oICYgYXVkaW9fcG9saWN5LGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnQXVkaW9Qb2xpY3lDcml0ZXJpYUNvbmZGaWxlUGF0aCA9CisgICAgIi9zeXN0ZW0vZXRjL2F1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mIjsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnQXVkaW9Qb2xpY3lDcml0ZXJpYVZlbmRvckNvbmZGaWxlUGF0aCA9CisgICAgIi92ZW5kb3IvZXRjL2F1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mIjsKKworLyoqCisgKiBQRlcgaW5zdGFuY2VzIHRhZ3MKKyAqLworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnUG9saWN5Q29uZlRhZyA9ICJQb2xpY3kiOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnRGVmYXVsdFRhZyA9ICJEZWZhdWx0IjsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmZ1R5cGVUYWcgPSAiVHlwZSI7CisKKy8qKgorICogUEZXIGVsZW1lbnRzIHRhZ3MKKyAqLworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnSW5jbHVzaXZlQ3JpdGVyaW9uVHlwZVRhZyA9ICJJbmNsdXNpdmVDcml0ZXJpb25UeXBlIjsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmZ0V4Y2x1c2l2ZUNyaXRlcmlvblR5cGVUYWcgPSAiRXhjbHVzaXZlQ3JpdGVyaW9uVHlwZSI7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdDcml0ZXJpb25UYWcgPSAiQ3JpdGVyaW9uIjsKKworLyoqCisgKiBQRlcga25vd24gY3JpdGVyaW9uIHRhZ3MKKyAqLworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnSW5wdXREZXZpY2VDcml0ZXJpb25UYWcgPSAiQXZhaWxhYmxlSW5wdXREZXZpY2VzIjsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmZ091dHB1dERldmljZUNyaXRlcmlvblRhZyA9ICJBdmFpbGFibGVPdXRwdXREZXZpY2VzIjsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmZ1Bob25lU3RhdGVDcml0ZXJpb25UYWcgPSAiVGVsZXBob255TW9kZSI7CisKKy8qKgorICogT3JkZXIgTVVTVCBiZSBhbGlnbiB3aXRoIGRlZmludGlpb24gb2YgYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHdpdGhpbiBhdWRpb19wb2xpY3kuaAorICovCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgZ0ZvcmNlVXNlQ3JpdGVyaW9uVGFnW0FVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UXSA9Cit7CisgICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0gPSAgICAgICAgIkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIsCisgICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdID0gICAgICAgICAgICAgICAgIkZvcmNlVXNlRm9yTWVkaWEiLAorICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRF0gPSAgICAgICAgICAgICAgICJGb3JjZVVzZUZvclJlY29yZCIsCisgICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfRE9DS10gPSAgICAgICAgICAgICAgICAgIkZvcmNlVXNlRm9yRG9jayIsCisgICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNXSA9ICAgICAgICAgICAgICAgIkZvcmNlVXNlRm9yU3lzdGVtIiwKKyAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJT10gPSAgICAiRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8iCit9OworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvY29uZmlnL2F1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvY29uZmlnL2F1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjViMDQ2YTgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9jb25maWcvYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYKQEAgLTAsMCArMSwxMzcgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBATk9URToKKyMgQXVkaW8gUG9saWN5IENyaXRlcmlhIGZpbGUgZXhhbXBsZSBmb3IgZ2VuZXJpYyBkZXZpY2UgYnVpbGQKKyMKKyMgQW55IHZlbmRvciBzaGFsbCBoYXZlIGl0cyBvd24gY29uZmlndXJhdGlvbiB3aXRoaW4gdGhlIGNvcnJlc3BvbmRpbmcgZGV2aWNlIGZvbGRlcgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDcml0ZXJpb24gdHlwZSBFeGFtcGxlOgorIyBGb3IgZWFjaCBjcml0ZXJpb24sIGEgY291cGxlIG9mIG51bWVyaWNhbCwgbGl0ZXJhbCB2YWx1ZXMgbXVzdCBiZSBwcm92aWRlZCB0byB0aGUgUEZXLgorIyBUaGUgbnVtZXJpY2FsIHBhcnQgaXMgbm90IG1hbmRhdG9yeS4gSWYgbm90IGZpbGxlZCBieSB0aGUgdXNlciwgYSBkZWZhdWx0IG51bWVyaWNhbCB2YWx1ZSB3aWxsIGJlCisjIGF1dG9tYXRpY2FsbHkgcHJvdmlkZWQgYnkgYXVkaW8gSEFMIHVzaW5nIHRoZSBmb2xsb3dpbmcgbG9naWM6CisjICAgLSBFeGNsdXNpdmUgY3JpdGVyaW9uOgorIyAgICAgICAgICAqIDAgLT4gZmlyc3QgbGl0ZXJhbCB2YWx1ZSwKKyMgICAgICAgICAgKiAxIC0+IHNlY29uZCBsaXRlcmFsIHZhbHVlLAorIyAgICAgICAgICAgICAgIC4uLgorIyAgICAgICAgICAqIE4gLT4gKE4rMSl0aCBsaXRlcmFsIHZhbHVlLgorIyAgIC0gSW5jbHVzaXZlIGNyaXRlcmlvbjoKKyMgICAgICAgICAgKiAxIDw8IDAgLT4gZmlyc3QgbGl0ZXJhbCB2YWx1ZSwKKyMgICAgICAgICAgKiAxIDw8IDEgLT4gc2Vjb25kIGxpdGVyYWwgdmFsdWUsCisjICAgICAgICAgICAgICAgLi4uCisjICAgICAgICAgICogMSA8PCBOIC0+IChOKzEpdGggbGl0ZXJhbCB2YWx1ZSwKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQb2xpY3kgeworIyAgICBJbmNsdXNpdmVDcml0ZXJpb25UeXBlfEV4Y2x1c2l2ZUNyaXRlcmlvblR5cGUgeworIyAgICAgICAgPENyaXRlcmlvbiBOYW1lPiAgW251bWVyaWNhbCB2YWx1ZSAxOl08bGl0ZXJhbCB2YWx1ZSAxPixbbnVtZXJpY2FsIHZhbHVlIDI6XTxsaXRlcmFsIHZhbHVlIDI+LDxsaXRlcmFsIHZhbHVlIDM+LC4uLgorIyAgICB9CisjIH0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENyaXRlcmlvbjoKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQb2xpY3kgeworIyAgICBDcml0ZXJpb24geworIyAgICAgICAgPENyaXRlcmlvbiBOYW1lPiB7CisjICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIDxDcml0ZXJpb24gdHlwZSBuYW1lPgorIyAgICAgICAgICAgIERlZmF1bHQgICAgICAgICA8ZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY3JpdGVyaW9uPgorIyAgICAgICAgfQorIyAgICB9CisjIH0KKworUG9saWN5IHsKKyAgICBJbmNsdXNpdmVDcml0ZXJpb25UeXBlIHsKKyAgICAgICAgIworICAgICAgICAjIERPIE5PVCBDSEFOR0UgT1JERVIuIFRoaXMgZGVmaW5pdGlvbiBtdXN0IGJlIGFsaWduZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZgorICAgICAgICAjIEFVRElPX0RFVklDRV9PVVRfKiB3aXRoaW4gPHN5c3RlbS9hdWRpby5oPiBmaWxlIG9mIGFuZHJvaWQuCisgICAgICAgICMKKyAgICAgICAgT3V0cHV0RGV2aWNlc01hc2tUeXBlICAgRWFycGllY2UsU3BlYWtlcixXaXJlZEhlYWRzZXQsV2lyZWRIZWFkcGhvbmUsQmx1ZXRvb3RoU2NvLEJsdWV0b290aFNjb0hlYWRzZXQsQmx1ZXRvb3RoU2NvQ2Fya2l0LEJsdWV0b290aEEyZHAsQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMsQmx1ZXRvb3RoQTJkcFNwZWFrZXIsSGRtaSxBbmxnRG9ja0hlYWRzZXQsRGd0bERvY2tIZWFkc2V0LFVzYkFjY2Vzc29yeSxVc2JEZXZpY2UsUmVtb3RlU3VibWl4LFRlbGVwaG9ueVR4LExpbmUsSGRtaUFyYyxTcGRpZixGbSxBdXhMaW5lLFNwZWFrZXJTYWZlCisgICAgICAgICMKKyAgICAgICAgIyBETyBOT1QgQ0hBTkdFIE9SREVSLiBUaGlzIGRlZmluaXRpb24gbXVzdCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YKKyAgICAgICAgIyBBVURJT19ERVZJQ0VfSU5fKiB3aXRoaW4gPHN5c3RlbS9hdWRpby5oPiBmaWxlIG9mIGFuZHJvaWQuCisgICAgICAgICMgTm90ZSBhbHNvIHRoYXQgZGlyZWN0aW9uIGJpdCB3aWxsIGJlIGRlY2ltYXRlZCBieSBBdWRpb0hBTCBpbiBvcmRlciB0byBhbGxvdyB1c2luZyBhIG1hc2sKKyAgICAgICAgIyB3aXRoIHRoZSBjYXJkaW5hbGl0eSBvZiAxIGJldHdlZW4gYSBiaXQgYW5kIGFuIGlucHV0IGRldmljZS4KKyAgICAgICAgIworICAgICAgICBJbnB1dERldmljZXNNYXNrVHlwZSAgICBDb21tdW5pY2F0aW9uLEFtYmllbnQsQnVpbHRpbk1pYyxCbHVldG9vdGhTY29IZWFkc2V0LFdpcmVkSGVhZHNldCxIZG1pLFRlbGVwaG9ueVJ4LEJhY2tNaWMsUmVtb3RlU3VibWl4LEFubGdEb2NrSGVhZHNldCxEZ3RsRG9ja0hlYWRzZXQsVXNiQWNjZXNzb3J5LFVzYkRldmljZSxGbVR1bmVyLFR2VHVuZSxMaW5lLFNwZGlmLEJsdWV0b290aEEyZHAsTG9vcGJhY2sKKyAgICB9CisgICAgRXhjbHVzaXZlQ3JpdGVyaW9uVHlwZSB7CisgICAgICAgICMKKyAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBhdWRpb19tb2RlX3QKKyAgICAgICAgIyBmcm9tIHN5c3RlbS9hdWRpby5oCisgICAgICAgICMKKyAgICAgICAgQW5kcm9pZE1vZGVUeXBlICAgICAwOk5vcm1hbCwxOlJpbmdUb25lLDI6SW5DYWxsLDM6SW5Db21tdW5pY2F0aW9uCisgICAgICAgICMKKyAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZQorICAgICAgICAjIGF1ZGlvX3BvbGljeV9mb3JjZWRfY29uZmlnX3QgZnJvbSBzeXN0ZW0vYXVkaW8uaAorICAgICAgICAjCisgICAgICAgIEZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvblR5cGUgICAgMDpGb3JjZU5vbmUsMTpGb3JjZVNwZWFrZXIsMzpGb3JjZUJ0U2NvCisgICAgICAgICMKKyAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZQorICAgICAgICAjIGF1ZGlvX3BvbGljeV9mb3JjZWRfY29uZmlnX3QgZnJvbSBzeXN0ZW0vYXVkaW8uaAorICAgICAgICAjCisgICAgICAgIEZvcmNlVXNlRm9yTWVkaWFUeXBlICAgICAgICAgICAgMDpGb3JjZU5vbmUsMTpGb3JjZVNwZWFrZXIsMjpGb3JjZUhlYWRwaG9uZXMsNDpGb3JjZUJ0QTJkcCw1OkZvcmNlV2lyZWRBY2Nlc3NvcnksODpGb3JjZUFuYWxvZ0RvY2ssOTpGb3JjZURpZ2l0YWxEb2NrLDEwOkZvcmNlTm9CdEEyZHAKKyAgICAgICAgIworICAgICAgICAjIFRoZSB2YWx1ZXMgb2YgdGhlIG1vZGUgTVVTVCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YgdGhlCisgICAgICAgICMgYXVkaW9fcG9saWN5X2ZvcmNlZF9jb25maWdfdCBmcm9tIHN5c3RlbS9hdWRpby5oCisgICAgICAgICMKKyAgICAgICAgRm9yY2VVc2VGb3JSZWNvcmRUeXBlICAgICAgICAgICAwOkZvcmNlTm9uZSwzOkZvcmNlQnRTY28sNTpGb3JjZVdpcmVkQWNjZXNzb3J5CisgICAgICAgICMKKyAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZQorICAgICAgICAjIGF1ZGlvX3BvbGljeV9mb3JjZWRfY29uZmlnX3QgZnJvbSBzeXN0ZW0vYXVkaW8uaAorICAgICAgICAjCisgICAgICAgIEZvcmNlVXNlRm9yRG9ja1R5cGUgICAgICAgICAgICAgMDpGb3JjZU5vbmUsNTpGb3JjZVdpcmVkQWNjZXNzb3J5LDY6Rm9yY2VCdENhckRvY2ssNzpGb3JjZUJ0RGVza0RvY2ssODpGb3JjZUFuYWxvZ0RvY2ssOTpGb3JjZURpZ2l0YWxEb2NrCisgICAgICAgICMKKyAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZQorICAgICAgICAjIGF1ZGlvX3BvbGljeV9mb3JjZWRfY29uZmlnX3QgZnJvbSBzeXN0ZW0vYXVkaW8uaAorICAgICAgICAjCisgICAgICAgIEZvcmNlVXNlRm9yU3lzdGVtVHlwZSAgICAgICAgICAgMDpGb3JjZU5vbmUsMTE6Rm9yY2VTeXN0ZW1FbmZvcmNlZAorICAgICAgICAjCisgICAgICAgICMgVGhlIHZhbHVlcyBvZiB0aGUgbW9kZSBNVVNUIGJlIGFsaWduZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKKyAgICAgICAgIyBhdWRpb19wb2xpY3lfZm9yY2VkX2NvbmZpZ190IGZyb20gc3lzdGVtL2F1ZGlvLmgKKyAgICAgICAgIworICAgICAgICBGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpb1R5cGUgIDA6Rm9yY2VOb25lLDEyOkZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCisgICAgfQorCisgICAgQ3JpdGVyaW9uIHsKKyAgICAgICAgQXZhaWxhYmxlSW5wdXREZXZpY2VzIHsKKyAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBJbnB1dERldmljZXNNYXNrVHlwZQorICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIG5vbmUKKyAgICAgICAgfQorICAgICAgICBBdmFpbGFibGVPdXRwdXREZXZpY2VzIHsKKyAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBPdXRwdXREZXZpY2VzTWFza1R5cGUKKyAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBub25lCisgICAgICAgIH0KKyAgICAgICAgVGVsZXBob255TW9kZSB7CisgICAgICAgICAgICBUeXBlICAgICAgICAgICAgQW5kcm9pZE1vZGVUeXBlCisgICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgTm9ybWFsCisgICAgICAgIH0KKyAgICAgICAgRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIHsKKyAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBGb3JjZVVzZUZvckNvbW11bmljYXRpb25UeXBlCisgICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgRm9yY2VOb25lCisgICAgICAgIH0KKyAgICAgICAgRm9yY2VVc2VGb3JNZWRpYSB7CisgICAgICAgICAgICBUeXBlICAgICAgICAgICAgRm9yY2VVc2VGb3JNZWRpYVR5cGUKKyAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBGb3JjZU5vbmUKKyAgICAgICAgfQorICAgICAgICBGb3JjZVVzZUZvclJlY29yZCB7CisgICAgICAgICAgICBUeXBlICAgICAgICAgICAgRm9yY2VVc2VGb3JSZWNvcmRUeXBlCisgICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgRm9yY2VOb25lCisgICAgICAgIH0KKyAgICAgICAgRm9yY2VVc2VGb3JEb2NrIHsKKyAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBGb3JjZVVzZUZvckRvY2tUeXBlCisgICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgRm9yY2VOb25lCisgICAgICAgIH0KKyAgICAgICAgRm9yY2VVc2VGb3JTeXN0ZW0geworICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEZvcmNlVXNlRm9yU3lzdGVtVHlwZQorICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIEZvcmNlTm9uZQorICAgICAgICB9CisgICAgICAgIEZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIHsKKyAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpb1R5cGUKKyAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBGb3JjZU5vbmUKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvaW5jbHVkZS9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvaW5jbHVkZS9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNjNWYyYzAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9pbmNsdWRlL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmgKQEAgLTAsMCArMSwyODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SV0xvY2suaD4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCitjbGFzcyBDUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3I7CitjbGFzcyBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlOworY2xhc3MgSVNlbGVjdGlvbkNyaXRlcmlvblR5cGVJbnRlcmZhY2U7CitzdHJ1Y3QgY25vZGU7CisKK2NsYXNzIFBhcmFtZXRlck1nclBsYXRmb3JtQ29ubmVjdG9yTG9nZ2VyOworCituYW1lc3BhY2UgYW5kcm9pZAoreworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoreworCitjbGFzcyBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcgoreworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjxpbnQsIGNvbnN0IGNoYXIgKj4gQ3JpdGVyaW9uVHlwZVZhbHVlUGFpcjsKKworICAgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKj4gQ3JpdGVyaW9uQ29sbGVjdGlvbjsKKyAgICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBJU2VsZWN0aW9uQ3JpdGVyaW9uVHlwZUludGVyZmFjZSAqPiBDcml0ZXJpb25UeXBlQ29sbGVjdGlvbjsKKyAgICB0eXBlZGVmIENyaXRlcmlvbkNvbGxlY3Rpb246Oml0ZXJhdG9yIENyaXRlcmlvbk1hcEl0ZXJhdG9yOworICAgIHR5cGVkZWYgQ3JpdGVyaW9uQ29sbGVjdGlvbjo6Y29uc3RfaXRlcmF0b3IgQ3JpdGVyaW9uTWFwQ29uc3RJdGVyYXRvcjsKKyAgICB0eXBlZGVmIENyaXRlcmlvblR5cGVDb2xsZWN0aW9uOjppdGVyYXRvciBDcml0ZXJpb25UeXBlTWFwSXRlcmF0b3I7CisgICAgdHlwZWRlZiBDcml0ZXJpb25UeXBlQ29sbGVjdGlvbjo6Y29uc3RfaXRlcmF0b3IgQ3JpdGVyaWFUeXBlTWFwQ29uc3RJdGVyYXRvcjsKKworcHVibGljOgorICAgIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyKCk7CisgICAgflBhcmFtZXRlck1hbmFnZXJXcmFwcGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBTdGFydHMgdGhlIHBsYXRmb3JtIHN0YXRlIHNlcnZpY2UuCisgICAgICogSXQgc3RhcnRzIHRoZSBwYXJhbWV0ZXIgZnJhbWV3b3JrIHBvbGljeSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgc3VjY2VzcywgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgICAgICovCisgICAgc3RhdHVzX3Qgc3RhcnQoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBmb2xsb3dpbmcgQVBJIHdyYXAgcG9saWN5IGFjdGlvbiB0byBjcml0ZXJpYQorICAgICAqLworCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZSBwbGF0Zm9ybSBzdGF0ZSB3YXMgY29ycmVjdGx5IHN0YXJ0ZWQgKGllIHRoZSBwb2xpY3kgcGFyYW1ldGVyIG1hbmFnZXIKKyAgICAgKiBoYXMgYmVlbiBpbnN0YW50aWF0ZWQgYW5kIHN0YXJ0ZWQgY29ycmVjdGx5KS4KKyAgICAgKgorICAgICAqIEB0b2RvOiBtYXAgb24gaW5pdENoZWNrPworICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHBsYXRmb3JtIHN0YXRlIGlzIHN0YXJ0ZWQgY29ycmVjdGx5LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbCBpc1N0YXJ0ZWQoKTsKKworICAgIC8qKgorICAgICAqIFNldCBUZWxlcGhvbnkgTW9kZS4KKyAgICAgKiBJdCB3aWxsIHNldCB0aGUgdGVsZXBob255IG1vZGUgY3JpdGVyaW9uIGFjY29yZGluZ2x5IGFuZCBhcHBseSB0aGUgY29uZmlndXJhdGlvbiBpbiBvcmRlcgorICAgICAqIHRvIHNlbGVjdCB0aGUgcmlnaHQgY29uZmlndXJhdGlvbiBvbiBkb21haW5zIGRlcGVuZGluZyBvbiB0aGlzIG1vZGUgY3JpdGVyaW9uLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBtb2RlOiBBbmRyb2lkIFBob25lIHN0YXRlIChub3JtYWwsIHJpbmd0b25lLCBjc3YsIGluIGNvbW11bmljYXRpb24pCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIGNyaXRlcmlvbiBzZXQgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKTsKKworICAgIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBTZXQgRm9yY2UgVXNlIGNvbmZpZyBmb3IgYSBnaXZlbiB1c2FnZS4KKyAgICAgKiBJdCB3aWxsIHNldCB0aGUgY29ycmVzcG9uZGluZyBwb2xpY3kgcGFyYW1ldGVyIGZyYW1ld29yayBjcml0ZXJpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVzYWdlIGZvciB3aGljaCBhIGNvbmZpZ3VyYXRpb24gc2hhbGwgYmUgZm9yY2VkLgorICAgICAqIEBwYXJhbVtpbl0gY29uZmlnIHdpc2hlZCB0byBiZSBmb3JjZWQgZm9yIHRoZSBnaXZlbiBzaGFsbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIGNyaXRlcmlvbiB3YXMgc2V0IGNvcnJlY3RseSwgZXJyb3IgY29kZSBvdGhlcndpc2UgKGUuZy4gY29uZmlnIG5vdAorICAgICAqIGFsbG93ZWQgYSBnaXZlbiB1c2FnZS4uLikKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKTsKKworICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29ubmVjdGlvbiBzdGF0ZSBvZiBkZXZpY2UocykuCisgICAgICogSXQgd2lsbCBzZXQgdGhlIGFzc29jaWF0ZWQgcG9saWN5IHBhcmFtZXRlciBmcmFtZXdvcmsgY3JpdGVyaW9uLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBkZXZpY2VzIG1hc2sgb2YgZGV2aWNlcyBmb3Igd2hpY2ggdGhlIHN0YXRlIGhhcyBjaGFuZ2VkLgorICAgICAqIEBwYXJhbVtpbl0gc3RhdGUgb2YgYXZhaWxhYmlsaXR5IG9mIHRoaXModGhlc2UpIGRldmljZShzKS4KKyAgICAgKiBAcGFyYW1baW5dIGRldmljZUFkZHJlc3M6IHRoZSBtYXNrIG1pZ2h0IG5vdCBiZSBlbm91Z2gsIGFzIGl0IG1heSByZXByZXNlbnRzIGEgdHlwZSBvZgorICAgICAqICAgICAgICAgICAgZGV2aWNlLCBzbyBhZGRyZXNzIG9mIHRoZSBkZXZpY2Ugd2lsbCBoZWxwIHByZWNpc2UgaWRlbnRpZmljYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIGRldmljZXMgY3JpdGVyaW9uIHVwZGF0ZWQgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZXMsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlQWRkcmVzcyk7CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogQXBwbHkgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHBsYXRmb3JtIG9uIHRoZSBwb2xpY3kgcGFyYW1ldGVyIG1hbmFnZXIuCisgICAgICogT25jZSBhbGwgdGhlIGNyaXRlcmlhIGhhdmUgYmVlbiBzZXQsIHRoZSBjbGllbnQgb2YgdGhlIHBsYXRmb3JtIHN0YXRlIG11c3QgY2FsbAorICAgICAqIHRoaXMgZnVuY3Rpb24gaW4gb3JkZXIgdG8gaGF2ZSB0aGUgcm91dGUgUEZXIHRha2luZyBpbnRvIGFjY291bnQgdGhlc2UgY3JpdGVyaWEuCisgICAgICoKKyAgICAgKiBPUEVOUzogc2hhbGwgd2UgZXhwb3NlIHRoaXM/CisgICAgICogICAgICAtIFllcyBpZiBhdG9taWMgc2V0IG9wZXJhdGlvbi4KKyAgICAgKiAgICAgICAgICBJbiB0aGlzIGNhc2UsIGFic3RyYWN0IGl0IGJlaGluZCB0aGUgIlNUQUdFIEFORCBDT01NSVQiIHBhdHRlcm4KKyAgICAgKiAgICAgIC0gbm8gaWYgbmVlZCB0byBzZXQgbW9yZSB0aGFuIG9uZSBiZWZvcmUgdHJpZ2dlcmluZyBhbiBhcHBseSBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHZvaWQgYXBwbHlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKKworICAgIC8qKgorICAgICAqIExvYWQgdGhlIGNyaXRlcmlvbiBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHBhdGggQ3JpdGVyaW9uIGNvbmYgZmlsZSBwYXRoLgorICAgICAqCisgICAgICogQHJldHVybiBOT19FUlJPUiBpcyBwYXJzaW5nIHN1Y2Nlc3NmdWwsIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHN0YXR1c190IGxvYWRBdWRpb1BvbGljeUNyaXRlcmlhQ29uZmlnKGNvbnN0IGNoYXIgKnBhdGgpOworCisgICAgLyoqCisgICAgICogQWRkIGEgY3JpdGVyaW9uIHR5cGUgdG8gQXVkaW9Qb2xpY3lQZncuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHR5cGVOYW1lIG9mIHRoZSBQRlcgY3JpdGVyaW9uIHR5cGUuCisgICAgICogQHBhcmFtW2luXSBpc0luY2x1c2l2ZSBhdHRyaWJ1dGUgb2YgdGhlIGNyaXRlcmlvbiB0eXBlLgorICAgICAqLworICAgIHZvaWQgYWRkQ3JpdGVyaW9uVHlwZShjb25zdCBzdGQ6OnN0cmluZyAmdHlwZU5hbWUsIGJvb2wgaXNJbmNsdXNpdmUpOworCisgICAgLyoqCisgICAgICogQWRkIGEgY3JpdGVyaW9uIHR5cGUgdmFsdWUgcGFpciB0byBBdWRpb1BvbGljeVBmdy4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdHlwZU5hbWUgY3JpdGVyaW9uIHR5cGUgbmFtZSB0byB3aGljaCB0aGlzIHZhbHVlIHBhaXIgaXMgYWRkZWQgdG8uCisgICAgICogQHBhcmFtW2luXSBudW1lcmljIHBhcnQgb2YgdGhlIHZhbHVlIHBhaXIuCisgICAgICogQHBhcmFtW2luXSBsaXRlcmFsIHBhcnQgb2YgdGhlIHZhbHVlIHBhaXIuCisgICAgICovCisgICAgdm9pZCBhZGRDcml0ZXJpb25UeXBlVmFsdWVQYWlyKGNvbnN0IHN0ZDo6c3RyaW5nICZ0eXBlTmFtZSwgdWludDMyX3QgbnVtZXJpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmxpdGVyYWwpOworCisgICAgLyoqCisgICAgICogQWRkIGEgY3JpdGVyaW9uIHRvIEF1ZGlvUG9saWN5UGZ3LgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBuYW1lIG9mIHRoZSBQRlcgY3JpdGVyaW9uLgorICAgICAqIEBwYXJhbVtpbl0gdHlwZU5hbWUgY3JpdGVyaW9uIHR5cGUgbmFtZSB0byB3aGljaCB0aGlzIGNyaXRlcmlvbiBpcyBhc3NvY2lhdGVkIHRvLgorICAgICAqIEBwYXJhbVtpbl0gZGVmYXVsdExpdGVyYWxWYWx1ZSBvZiB0aGUgUEZXIGNyaXRlcmlvbi4KKyAgICAgKi8KKyAgICB2b2lkIGFkZENyaXRlcmlvbihjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmdHlwZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmRlZmF1bHRMaXRlcmFsVmFsdWUpOworICAgIC8qKgorICAgICAqIFBhcnNlIGFuZCBsb2FkIHRoZSBpbmNsdXNpdmUgY3JpdGVyaW9uIHR5cGUgZnJvbSBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHJvb3Qgbm9kZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorICAgICAqLworICAgIHZvaWQgbG9hZEluY2x1c2l2ZUNyaXRlcmlvblR5cGUoY25vZGUgKnJvb3QpOworCisgICAgLyoqCisgICAgICogUGFyc2UgYW5kIGxvYWQgdGhlIGV4Y2x1c2l2ZSBjcml0ZXJpb24gdHlwZSBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcm9vdCBub2RlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICovCisgICAgdm9pZCBsb2FkRXhjbHVzaXZlQ3JpdGVyaW9uVHlwZShjbm9kZSAqcm9vdCk7CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhbmQgbG9hZCB0aGUgY3JpdGVyaWEgZnJvbSBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHJvb3Qgbm9kZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorICAgICAqLworICAgIHZvaWQgbG9hZENyaXRlcmlhKGNub2RlICpyb290KTsKKworICAgIC8qKgorICAgICAqIFBhcnNlIGFuZCBsb2FkIGEgY3JpdGVyaW9uIGZyb20gY29uZmlndXJhdGlvbiBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSByb290IG5vZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICAgKi8KKyAgICB2b2lkIGxvYWRDcml0ZXJpb24oY25vZGUgKnJvb3QpOworCisgICAgLyoqCisgICAgICogUGFyc2UgYW5kIGxvYWQgdGhlIGNyaXRlcmlvbiB0eXBlcyBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcm9vdCBub2RlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUKKyAgICAgKiBAcGFyYW1baW5dIGlzSW5jbHVzaXZlIHRydWUgaWYgaW5jbHVzaXZlLCBmYWxzZSBpcyBleGNsdXNpdmUuCisgICAgICovCisgICAgdm9pZCBsb2FkQ3JpdGVyaW9uVHlwZShjbm9kZSAqcm9vdCwgYm9vbCBpc0luY2x1c2l2ZSk7CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHJvb3Qgbm9kZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorICAgICAqLworICAgIHZvaWQgbG9hZENvbmZpZyhjbm9kZSAqcm9vdCk7CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhbmQgbG9hZCB0aGUgY2hpZHJlbiBub2RlIGZyb20gYSBnaXZlbiByb290IG5vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHJvb3Qgbm9kZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlCisgICAgICogQHBhcmFtW291dF0gZGVmYXVsdFZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgbWFuYWdlciBlbGVtZW50IHRvIHJldHJpZXZlLgorICAgICAqIEBwYXJhbVtvdXRdIHR5cGUgb2YgdGhlIHBhcmFtZXRlciBtYW5hZ2VyIGVsZW1lbnQgdG8gcmV0cmlldmUuCisgICAgKi8KKyAgICB2b2lkIHBhcnNlQ2hpbGRyZW4oY25vZGUgKnJvb3QsIHN0ZDo6c3RyaW5nICZkZWZhdWx0VmFsdWUsIHN0ZDo6c3RyaW5nICZ0eXBlKTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIGFuIGVsZW1lbnQgZnJvbSBhIG1hcCBieSBpdHMgbmFtZS4KKyAgICAgKgorICAgICAqIEB0cGFyYW0gVCB0eXBlIG9mIGVsZW1lbnQgdG8gc2VhcmNoLgorICAgICAqIEBwYXJhbVtpbl0gbmFtZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIGZpbmQuCisgICAgICogQHBhcmFtW2luXSBlbGVtZW50c01hcCBtYXBzIG9mIGVsZW1lbnRzIHRvIHNlYXJjaCBpbnRvLgorICAgICAqCisgICAgICogQHJldHVybiB2YWxpZCBwb2ludGVyIG9uIGVsZW1lbnQgaWYgZm91bmQsIE5VTEwgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIFQgKmdldEVsZW1lbnQoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUICo+ICZlbGVtZW50c01hcCk7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSBhbiBlbGVtZW50IGZyb20gYSBtYXAgYnkgaXRzIG5hbWUuIENvbnN0IHZlcnNpb24uCisgICAgICoKKyAgICAgKiBAdHBhcmFtIFQgdHlwZSBvZiBlbGVtZW50IHRvIHNlYXJjaC4KKyAgICAgKiBAcGFyYW1baW5dIG5hbWUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byBmaW5kLgorICAgICAqIEBwYXJhbVtpbl0gZWxlbWVudHNNYXAgbWFwcyBvZiBlbGVtZW50cyB0byBzZWFyY2ggaW50by4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdmFsaWQgcG9pbnRlciBvbiBlbGVtZW50IGlmIGZvdW5kLCBOVUxMIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICBjb25zdCBUICpnZXRFbGVtZW50KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFQgKj4gJmVsZW1lbnRzTWFwKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIHNldCB0aGUgdmFsdWUgb2YgYSBjb21wb25lbnQgc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHZhbHVlIG5ldyB2YWx1ZSB0byBzZXQgdG8gdGhlIGNvbXBvbmVudCBzdGF0ZS4KKyAgICAgKiBAcGFyYW1baW5dIHN0YXRlTmFtZSBvZiB0aGUgY29tcG9uZW50IHN0YXRlLgorICAgICAqLworICAgIHZvaWQgc2V0VmFsdWUoaW50IHZhbHVlLCBjb25zdCBzdGQ6OnN0cmluZyAmc3RhdGVOYW1lKTsKKworICAgIC8qKgorICAgICAqIGdldCB0aGUgdmFsdWUgb2YgYSBjb21wb25lbnQgc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIG5hbWUgb2YgdGhlIGNvbXBvbmVudCBzdGF0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdmFsdWUgb2YgdGhlIGNvbXBvbmVudCBzdGF0ZQorICAgICAqLworICAgIGludCBnZXRWYWx1ZShjb25zdCBzdGQ6OnN0cmluZyAmc3RhdGVOYW1lKSBjb25zdDsKKworICAgIGJvb2wgaXNWYWx1ZVZhbGlkRm9yQ3JpdGVyaW9uKElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKmNyaXRlcmlvbiwgaW50IHZhbHVlVG9DaGVjayk7CisKKyAgICBDcml0ZXJpb25UeXBlQ29sbGVjdGlvbiBtUG9saWN5Q3JpdGVyaW9uVHlwZXM7IC8qKjwgUG9saWN5IENyaXRlcmlvbiBUeXBlIG1hcC4gKi8KKyAgICBDcml0ZXJpb25Db2xsZWN0aW9uIG1Qb2xpY3lDcml0ZXJpYTsgLyoqPCBQb2xpY3kgQ3JpdGVyaW9uIE1hcC4gKi8KKworICAgIENQYXJhbWV0ZXJNZ3JQbGF0Zm9ybUNvbm5lY3RvciAqbVBmd0Nvbm5lY3RvcjsgLyoqPCBQb2xpY3kgUGFyYW1ldGVyIE1hbmFnZXIgY29ubmVjdG9yLiAqLworICAgIFBhcmFtZXRlck1nclBsYXRmb3JtQ29ubmVjdG9yTG9nZ2VyICptUGZ3Q29ubmVjdG9yTG9nZ2VyOyAvKio8IFBvbGljeSBQRlcgbG9nZ2VyLiAqLworCisKKyAgICAvKioKKyAgICAgKiBwcm92aWRlIGEgY29tcGlsZSB0aW1lIGVycm9yIGlmIG5vIHNwZWNpYWxpemF0aW9uIGlzIHByb3ZpZGVkIGZvciBhIGdpdmVuIHR5cGUuCisgICAgICoKKyAgICAgKiBAdHBhcmFtIFQ6IHR5cGUgb2YgdGhlIHBhcmFtZXRlciBtYW5hZ2VyIGVsZW1lbnQuIFN1cHBvcnRlZCBvbmUgYXJlOgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIC0gQ3JpdGVyaW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgLSBDcml0ZXJpb25UeXBlLgorICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBwYXJhbWV0ZXJNYW5hZ2VyRWxlbWVudFN1cHBvcnRlZDsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtUG9saWN5UGZ3RGVmYXVsdENvbmZGaWxlTmFtZTsgLyoqPCBEZWZhdWx0IFBvbGljeSBQRlcgdG9wIGZpbGUgbmFtZS4qLworfTsKKworfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGQ0M2I4OQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQ2IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKKyMgQ29tcG9uZW50IGJ1aWxkCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBzcmMvRW5naW5lLmNwcCBcCisgICAgc3JjL0VuZ2luZUluc3RhbmNlLmNwcCBcCisgICAgc3JjL0dhaW5zLmNwcCBcCisKKworYXVkaW9fcG9saWN5X2VuZ2luZV9pbmNsdWRlc19jb21tb24gOj0gXAorICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlCisKK0xPQ0FMX0NGTEFHUyArPSBcCisgICAgLVdhbGwgXAorICAgIC1XZXJyb3IgXAorICAgIC1XZXh0cmEgXAorCitMT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gXAorICAgICQoYXVkaW9fcG9saWN5X2VuZ2luZV9pbmNsdWRlc19jb21tb24pCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICQoYXVkaW9fcG9saWN5X2VuZ2luZV9pbmNsdWRlc19jb21tb24pIFwKKyAgICAkKFRBUkdFVF9PVVRfSEVBREVSUykvaHcgXAorICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBmcmFtZXdvcmtzLWF2KSBcCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGJpb25pYykgXAorICAgICQoVE9QRElSKWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUKKworCitMT0NBTF9NT0RVTEUgOj0gbGliYXVkaW9wb2xpY3llbmdpbmVkZWZhdWx0CitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgICAgbGlibWVkaWFfaGVscGVyIFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBcCisgICAgbGliY3V0aWxzIFwKKyAgICBsaWJ1dGlscyBcCisgICAgbGliYXVkaW91dGlscyBcCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvaW5jbHVkZS9BdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2luY2x1ZGUvQXVkaW9Qb2xpY3lFbmdpbmVJbnN0YW5jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFlMzI5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2luY2x1ZGUvQXVkaW9Qb2xpY3lFbmdpbmVJbnN0YW5jZS5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlOworCituYW1lc3BhY2UgYW5kcm9pZAoreworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoreworCitjbGFzcyBFbmdpbmU7CisKK2NsYXNzIEVuZ2luZUluc3RhbmNlCit7Citwcm90ZWN0ZWQ6CisgICAgRW5naW5lSW5zdGFuY2UoKTsKKworcHVibGljOgorICAgIHZpcnR1YWwgfkVuZ2luZUluc3RhbmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgQXVkaW8gUG9saWN5IEVuZ2luZSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcG9pbnRlciB0byBSb3V0ZSBNYW5hZ2VyIEluc3RhbmNlIG9iamVjdC4KKyAgICAgKi8KKyAgICBzdGF0aWMgRW5naW5lSW5zdGFuY2UgKmdldEluc3RhbmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgcXVlcnkuCisgICAgICogVGhlIGZpcnN0IGNsaWVudCBvZiBhbiBpbnRlcmZhY2Ugb2YgdGhlIHBvbGljeSBlbmdpbmUgd2lsbCBzdGFydCB0aGUgc2luZ2xldG9uLgorICAgICAqCisgICAgICogQHRwYXJhbSBSZXF1ZXN0ZWRJbnRlcmZhY2U6IGludGVyZmFjZSB0aGF0IHRoZSBjbGllbnQgaXMgd2lzaGluZyB0byByZXRyaWV2ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gaW50ZXJmYWNlIGhhbmRsZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgUmVxdWVzdGVkSW50ZXJmYWNlPgorICAgIFJlcXVlc3RlZEludGVyZmFjZSAqcXVlcnlJbnRlcmZhY2UoKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIC8qKgorICAgICAqIEdldCBBdWRpbyBQb2xpY3kgRW5naW5lIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHJldHVybiBBdWRpbyBQb2xpY3kgRW5naW5lIHNpbmdsZXRvbi4KKyAgICAgKi8KKyAgICBFbmdpbmUgKmdldEVuZ2luZSgpIGNvbnN0OworCitwcml2YXRlOgorICAgIC8qIENvcHkgZmFjaWxpdGllcyBhcmUgcHV0IHByaXZhdGUgdG8gZGlzYWJsZSBjb3B5LiAqLworICAgIEVuZ2luZUluc3RhbmNlKGNvbnN0IEVuZ2luZUluc3RhbmNlICZvYmplY3QpOworICAgIEVuZ2luZUluc3RhbmNlICZvcGVyYXRvcj0oY29uc3QgRW5naW5lSW5zdGFuY2UgJm9iamVjdCk7Cit9OworCisvKioKKyAqIExpbWl0IHRlbXBsYXRlIGluc3RhbnRhdGlvbiB0byBzdXBwb3J0ZWQgdHlwZSBpbnRlcmZhY2VzLgorICogQ29tcGlsZSB0aW1lIGVycm9yIHdpbGwgY2xhaW0gaWYgaW52YWxpZCBpbnRlcmZhY2UgaXMgcmVxdWVzdGVkLgorICovCit0ZW1wbGF0ZSA8PgorQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlICpFbmdpbmVJbnN0YW5jZTo6cXVlcnlJbnRlcmZhY2UoKSBjb25zdDsKKworfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNjg2NDE0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcApAQCAtMCwwICsxLDcxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BvbGljeUVuZ2luZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworLy8jZGVmaW5lIFZFUllfVkVSQk9TRV9MT0dHSU5HCisjaWZkZWYgVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNkZWZpbmUgQUxPR1ZWIEFMT0dWCisjZWxzZQorI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworI2luY2x1ZGUgIkVuZ2luZS5oIgorI2luY2x1ZGUgIkdhaW5zLmgiCisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaD4KKyNpbmNsdWRlIDxBdWRpb1BvcnQuaD4KKyNpbmNsdWRlIDxJT1Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxwb2xpY3kuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkCit7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit7CisKK0VuZ2luZTo6RW5naW5lKCkKKyAgICA6IG1NYW5hZ2VySW50ZXJmYWNlKHRoaXMpLAorICAgICAgbVBob25lU3RhdGUoQVVESU9fTU9ERV9OT1JNQUwpLAorICAgICAgbUFwbU9ic2VydmVyKE5VTEwpCit7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVDsgaSsrKSB7CisgICAgICAgIG1Gb3JjZVVzZVtpXSA9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FOworICAgIH0KK30KKworRW5naW5lOjp+RW5naW5lKCkKK3sKK30KKwordm9pZCBFbmdpbmU6OnNldE9ic2VydmVyKEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICpvYnNlcnZlcikKK3sKKyAgICBBTE9HX0FTU0VSVChvYnNlcnZlciAhPSBOVUxMLCAiSW52YWxpZCBBdWRpbyBQb2xpY3kgTWFuYWdlciBvYnNlcnZlciIpOworICAgIG1BcG1PYnNlcnZlciA9IG9ic2VydmVyOworfQorCitzdGF0dXNfdCBFbmdpbmU6OmluaXRDaGVjaygpCit7CisgICAgcmV0dXJuIChtQXBtT2JzZXJ2ZXIgIT0gTlVMTCkgPyAgTk9fRVJST1IgOiBOT19JTklUOworfQorCitmbG9hdCBFbmdpbmU6OnZvbEluZGV4VG9EYihWb2x1bWU6OmRldmljZV9jYXRlZ29yeSBjYXRlZ29yeSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKQoreworICAgIGNvbnN0IFN0cmVhbURlc2NyaXB0b3IgJnN0cmVhbURlc2MgPSBtQXBtT2JzZXJ2ZXItPmdldFN0cmVhbURlc2NyaXB0b3JzKCkudmFsdWVBdChzdHJlYW1UeXBlKTsKKyAgICByZXR1cm4gR2FpbnM6OnZvbEluZGV4VG9EYihjYXRlZ29yeSwgc3RyZWFtRGVzYywgaW5kZXhJblVpKTsKK30KKworCitzdGF0dXNfdCBFbmdpbmU6OmluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KQoreworICAgIEFMT0dWKCJpbml0U3RyZWFtVm9sdW1lKCkgc3RyZWFtICVkLCBtaW4gJWQsIG1heCAlZCIsIHN0cmVhbSAsIGluZGV4TWluLCBpbmRleE1heCk7CisgICAgaWYgKGluZGV4TWluIDwgMCB8fCBpbmRleE1pbiA+PSBpbmRleE1heCkgeworICAgICAgICBBTE9HVygiaW5pdFN0cmVhbVZvbHVtZSgpIGludmFsaWQgaW5kZXggbGltaXRzIGZvciBzdHJlYW0gJWQsIG1pbiAlZCwgbWF4ICVkIiwKKyAgICAgICAgICAgICAgc3RyZWFtICwgaW5kZXhNaW4sIGluZGV4TWF4KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbUFwbU9ic2VydmVyLT5nZXRTdHJlYW1EZXNjcmlwdG9ycygpLnNldFZvbHVtZUluZGV4TWluKHN0cmVhbSwgaW5kZXhNaW4pOworICAgIG1BcG1PYnNlcnZlci0+Z2V0U3RyZWFtRGVzY3JpcHRvcnMoKS5zZXRWb2x1bWVJbmRleE1heChzdHJlYW0sIGluZGV4TWF4KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgRW5naW5lOjppbml0aWFsaXplVm9sdW1lQ3VydmVzKGJvb2wgaXNTcGVha2VyRHJjRW5hYmxlZCkKK3sKKyAgICBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbiAmc3RyZWFtcyA9IG1BcG1PYnNlcnZlci0+Z2V0U3RyZWFtRGVzY3JpcHRvcnMoKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgVm9sdW1lOjpERVZJQ0VfQ0FURUdPUllfQ05UOyBqKyspIHsKKyAgICAgICAgICAgIHN0cmVhbXMuc2V0Vm9sdW1lQ3VydmVQb2ludChzdGF0aWNfY2FzdDxhdWRpb19zdHJlYW1fdHlwZV90PihpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Vm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnk+KGopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYWluczo6c1ZvbHVtZVByb2ZpbGVzW2ldW2pdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENoZWNrIGF2YWlsYWJpbGl0eSBvZiBEUkMgb24gc3BlYWtlciBwYXRoOiBpZiBhdmFpbGFibGUsIG92ZXJyaWRlIHNvbWUgb2YgdGhlIHNwZWFrZXIgY3VydmVzCisgICAgaWYgKGlzU3BlYWtlckRyY0VuYWJsZWQpIHsKKyAgICAgICAgc3RyZWFtcy5zZXRWb2x1bWVDdXJ2ZVBvaW50KEFVRElPX1NUUkVBTV9TWVNURU0sIFZvbHVtZTo6REVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCisgICAgICAgICAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVEcmMpOworICAgICAgICBzdHJlYW1zLnNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX1JJTkcsIFZvbHVtZTo6REVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCisgICAgICAgICAgICAgICAgR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmMpOworICAgICAgICBzdHJlYW1zLnNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX0FMQVJNLCBWb2x1bWU6OkRFVklDRV9DQVRFR09SWV9TUEVBS0VSLAorICAgICAgICAgICAgICAgIEdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjKTsKKyAgICAgICAgc3RyZWFtcy5zZXRWb2x1bWVDdXJ2ZVBvaW50KEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04sIFZvbHVtZTo6REVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCisgICAgICAgICAgICAgICAgR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmMpOworICAgICAgICBzdHJlYW1zLnNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX01VU0lDLCBWb2x1bWU6OkRFVklDRV9DQVRFR09SWV9TUEVBS0VSLAorICAgICAgICAgICAgICAgIEdhaW5zOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVEcmMpOworICAgICAgICBzdHJlYW1zLnNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFksIFZvbHVtZTo6REVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCisgICAgICAgICAgICAgICAgR2FpbnM6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZURyYyk7CisgICAgfQorfQorCisKK3N0YXR1c190IEVuZ2luZTo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpCit7CisgICAgQUxPR1YoInNldFBob25lU3RhdGUoKSBzdGF0ZSAlZCIsIHN0YXRlKTsKKworICAgIGlmIChzdGF0ZSA8IDAgfHwgc3RhdGUgPj0gQVVESU9fTU9ERV9DTlQpIHsKKyAgICAgICAgQUxPR1coInNldFBob25lU3RhdGUoKSBpbnZhbGlkIHN0YXRlICVkIiwgc3RhdGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChzdGF0ZSA9PSBtUGhvbmVTdGF0ZSApIHsKKyAgICAgICAgQUxPR1coInNldFBob25lU3RhdGUoKSBzZXR0aW5nIHNhbWUgc3RhdGUgJWQiLCBzdGF0ZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gc3RvcmUgcHJldmlvdXMgcGhvbmUgc3RhdGUgZm9yIG1hbmFnZW1lbnQgb2Ygc29uaWZpY2F0aW9uIHN0cmF0ZWd5IGJlbG93CisgICAgaW50IG9sZFN0YXRlID0gbVBob25lU3RhdGU7CisgICAgbVBob25lU3RhdGUgPSBzdGF0ZTsKKyAgICBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbiAmc3RyZWFtcyA9IG1BcG1PYnNlcnZlci0+Z2V0U3RyZWFtRGVzY3JpcHRvcnMoKTsKKyAgICAvLyBhcmUgd2UgZW50ZXJpbmcgb3Igc3RhcnRpbmcgYSBjYWxsCisgICAgaWYgKCFpc19zdGF0ZV9pbl9jYWxsKG9sZFN0YXRlKSAmJiBpc19zdGF0ZV9pbl9jYWxsKHN0YXRlKSkgeworICAgICAgICBBTE9HVigiICBFbnRlcmluZyBjYWxsIGluIHNldFBob25lU3RhdGUoKSIpOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IFZvbHVtZTo6REVWSUNFX0NBVEVHT1JZX0NOVDsgaisrKSB7CisgICAgICAgICAgICBzdHJlYW1zLnNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX0RUTUYsIHN0YXRpY19jYXN0PFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5PihqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNWb2x1bWVQcm9maWxlc1tBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTF1bal0pOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChpc19zdGF0ZV9pbl9jYWxsKG9sZFN0YXRlKSAmJiAhaXNfc3RhdGVfaW5fY2FsbChzdGF0ZSkpIHsKKyAgICAgICAgQUxPR1YoIiAgRXhpdGluZyBjYWxsIGluIHNldFBob25lU3RhdGUoKSIpOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IFZvbHVtZTo6REVWSUNFX0NBVEVHT1JZX0NOVDsgaisrKSB7CisgICAgICAgICAgICBzdHJlYW1zLnNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX0RUTUYsIHN0YXRpY19jYXN0PFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5PihqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNWb2x1bWVQcm9maWxlc1tBVURJT19TVFJFQU1fRFRNRl1bal0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgRW5naW5lOjpzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQoreworICAgIHN3aXRjaCh1c2FnZSkgeworICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OOgorICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpIHsKKyAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfQ09NTVVOSUNBVElPTiIsIGNvbmZpZyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQToKKyAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfSEVBRFBIT05FUyAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX0EyRFAgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfV0lSRURfQUNDRVNTT1JZICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0FOQUxPR19ET0NLICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0RJR0lUQUxfRE9DSyAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NQRUFLRVIgKSB7CisgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX01FRElBIiwgY29uZmlnKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRDoKKyAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfV0lSRURfQUNDRVNTT1JZICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpIHsKKyAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfUkVDT1JEIiwgY29uZmlnKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0s6CisgICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUgJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9DQVJfRE9DSyAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9ERVNLX0RPQ0sgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfV0lSRURfQUNDRVNTT1JZICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0FOQUxPR19ET0NLICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0RJR0lUQUxfRE9DSykgeworICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9ET0NLIiwgY29uZmlnKTsKKyAgICAgICAgfQorICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNOgorICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkgeworICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9TWVNURU0iLCBjb25maWcpOworICAgICAgICB9CisgICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJTzoKKyAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9IRE1JX1NZU1RFTV9BVURJT19FTkZPUkNFRCkgeworICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9ySERNSV9TWVNURU1fQVVESU8iLCBjb25maWcpOworICAgICAgICB9CisgICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgdXNhZ2UgJWQiLCB1c2FnZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3JvdXRpbmdfc3RyYXRlZ3kgRW5naW5lOjpnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3sKKyAgICAvLyBzdHJlYW0gdG8gc3RyYXRlZ3kgbWFwcGluZworICAgIHN3aXRjaCAoc3RyZWFtKSB7CisgICAgY2FzZSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDoKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfUEhPTkU7CisgICAgY2FzZSBBVURJT19TVFJFQU1fUklORzoKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9BTEFSTToKKyAgICAgICAgcmV0dXJuIFNUUkFURUdZX1NPTklGSUNBVElPTjsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT046CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTDsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9EVE1GOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfRFRNRjsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgidW5rbm93biBzdHJlYW0gdHlwZSAlZCIsIHN0cmVhbSk7CisgICAgY2FzZSBBVURJT19TVFJFQU1fU1lTVEVNOgorICAgICAgICAvLyBOT1RFOiBTWVNURU0gc3RyZWFtIHVzZXMgTUVESUEgc3RyYXRlZ3kgYmVjYXVzZSBtdXRpbmcgbXVzaWMgYW5kIHN3aXRjaGluZyBvdXRwdXRzCisgICAgICAgIC8vIHdoaWxlIGtleSBjbGlja3MgYXJlIHBsYXllZCBwcm9kdWNlcyBhIHBvb3IgcmVzdWx0CisgICAgY2FzZSBBVURJT19TVFJFQU1fTVVTSUM6CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9NRURJQTsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRTsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9UVFM6CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVI7CisgICAgY2FzZSBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWToKKyAgICAgICAgcmV0dXJuIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFk7CisgICAgY2FzZSBBVURJT19TVFJFQU1fUkVST1VUSU5HOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfUkVST1VUSU5HOworICAgIH0KK30KKworcm91dGluZ19zdHJhdGVneSBFbmdpbmU6OmdldFN0cmF0ZWd5Rm9yVXNhZ2UoYXVkaW9fdXNhZ2VfdCB1c2FnZSkKK3sKKyAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cyA9IG1BcG1PYnNlcnZlci0+Z2V0T3V0cHV0cygpOworCisgICAgLy8gdXNhZ2UgdG8gc3RyYXRlZ3kgbWFwcGluZworICAgIHN3aXRjaCAodXNhZ2UpIHsKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKKyAgICAgICAgaWYgKG91dHB1dHMuaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX1JJTkcpIHx8CisgICAgICAgICAgICAgICAgb3V0cHV0cy5pc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fQUxBUk0pKSB7CisgICAgICAgICAgICByZXR1cm4gU1RSQVRFR1lfU09OSUZJQ0FUSU9OOworICAgICAgICB9CisgICAgICAgIGlmIChpc0luQ2FsbCgpKSB7CisgICAgICAgICAgICByZXR1cm4gU1RSQVRFR1lfUEhPTkU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFk7CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX01FRElBOgorICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfTUVESUE7CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9QSE9ORTsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfRFRNRjsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfQUxBUk06CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfU09OSUZJQ0FUSU9OOworCisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT046CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTDsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfTUVESUE7CisgICAgfQorfQorCithdWRpb19kZXZpY2VzX3QgRW5naW5lOjpnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KSBjb25zdAoreworICAgIGNvbnN0IERldmljZVZlY3RvciAmYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyA9IG1BcG1PYnNlcnZlci0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpOworICAgIGNvbnN0IERldmljZVZlY3RvciAmYXZhaWxhYmxlSW5wdXREZXZpY2VzID0gbUFwbU9ic2VydmVyLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKTsKKworICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gbUFwbU9ic2VydmVyLT5nZXRPdXRwdXRzKCk7CisKKyAgICB1aW50MzJfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICB1aW50MzJfdCBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKTsKKworICAgIHN3aXRjaCAoc3RyYXRlZ3kpIHsKKworICAgIGNhc2UgU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSOgorICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgaWYgKCFkZXZpY2UpIHsKKyAgICAgICAgICAgIEFMT0dFKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIG5vIGRldmljZSBmb3VuZCBmb3IgIlwKKyAgICAgICAgICAgICAgICAgICAgIlNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUiIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTDoKKyAgICAgICAgaWYgKGlzSW5DYWxsKCkpIHsKKyAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTik7CisgICAgICAgIH0gZWxzZSBpZiAob3V0cHV0cy5pc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KEFVRElPX1NUUkVBTV9NVVNJQywKKyAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSkpIHsKKyAgICAgICAgICAgIC8vIHdoaWxlIG1lZGlhIGlzIHBsYXlpbmcgb24gYSByZW1vdGUgZGV2aWNlLCB1c2UgdGhlIHRoZSBzb25pZmljYXRpb24gYmVoYXZpb3IuCisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgdGVzdCB0aGlzIHVzZWNhc2UgYmVmb3JlIHRlc3RpbmcgaWYgbWVkaWEgaXMgcGxheWluZyBiZWNhdXNlCisgICAgICAgICAgICAvLyAgIHRoZSBpc1N0cmVhbUFjdGl2ZSgpIG1ldGhvZCBvbmx5IGluZm9ybXMgYWJvdXQgdGhlIGFjdGl2aXR5IG9mIGEgc3RyZWFtLCBub3QKKyAgICAgICAgICAgIC8vICAgaWYgaXQncyBmb3IgbG9jYWwgcGxheWJhY2suIE5vdGUgYWxzbyB0aGF0IHdlIHVzZSB0aGUgc2FtZSBkZWxheSBiZXR3ZWVuIGJvdGggdGVzdHMKKyAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTik7CisgICAgICAgICAgICAvL3VzZXIgInNhZmUiIHNwZWFrZXIgaWYgYXZhaWxhYmxlIGluc3RlYWQgb2Ygbm9ybWFsIHNwZWFrZXIgdG8gYXZvaWQgdHJpZ2dlcmluZworICAgICAgICAgICAgLy9vdGhlciBhY291c3RpYyBzYWZldHkgbWVjaGFuaXNtcyBmb3Igbm90aWZpY2F0aW9uCisgICAgICAgICAgICBpZiAoKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikgJiYKKyAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlIHw9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFOworICAgICAgICAgICAgICAgIGRldmljZSAmPSB+QVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG91dHB1dHMuaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX01VU0lDLCBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSkpIHsKKyAgICAgICAgICAgIC8vIHdoaWxlIG1lZGlhIGlzIHBsYXlpbmcgKG9yIGhhcyByZWNlbnRseSBwbGF5ZWQpLCB1c2UgdGhlIHNhbWUgZGV2aWNlCisgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB3aGVuIG1lZGlhIGlzIG5vdCBwbGF5aW5nIGFueW1vcmUsIGZhbGwgYmFjayBvbiB0aGUgc29uaWZpY2F0aW9uIGJlaGF2aW9yCisgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04pOworICAgICAgICAgICAgLy91c2VyICJzYWZlIiBzcGVha2VyIGlmIGF2YWlsYWJsZSBpbnN0ZWFkIG9mIG5vcm1hbCBzcGVha2VyIHRvIGF2b2lkIHRyaWdnZXJpbmcKKyAgICAgICAgICAgIC8vb3RoZXIgYWNvdXN0aWMgc2FmZXR5IG1lY2hhbmlzbXMgZm9yIG5vdGlmaWNhdGlvbgorICAgICAgICAgICAgaWYgKChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpICYmCisgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSkgeworICAgICAgICAgICAgICAgIGRldmljZSB8PSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRTsKKyAgICAgICAgICAgICAgICBkZXZpY2UgJj0gfkFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgU1RSQVRFR1lfRFRNRjoKKyAgICAgICAgaWYgKCFpc0luQ2FsbCgpKSB7CisgICAgICAgICAgICAvLyB3aGVuIG9mZiBjYWxsLCBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgdGhlIHNhbWUgcnVsZXMgYXMgTUVESUEgc3RyYXRlZ3kKKyAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIHdoZW4gaW4gY2FsbCwgRFRNRiBhbmQgUEhPTkUgc3RyYXRlZ2llcyBmb2xsb3cgdGhlIHNhbWUgcnVsZXMKKyAgICAgICAgLy8gRkFMTCBUSFJPVUdICisKKyAgICBjYXNlIFNUUkFURUdZX1BIT05FOgorICAgICAgICAvLyBGb3JjZSB1c2Ugb2Ygb25seSBkZXZpY2VzIG9uIHByaW1hcnkgb3V0cHV0IGlmOgorICAgICAgICAvLyAtIGluIGNhbGwgQU5ECisgICAgICAgIC8vICAgLSBjYW5ub3Qgcm91dGUgZnJvbSB2b2ljZSBjYWxsIFJYIE9SCisgICAgICAgIC8vICAgLSBhdWRpbyBIQUwgdmVyc2lvbiBpcyA8IDMuMCBhbmQgVFggZGV2aWNlIGlzIG9uIHRoZSBwcmltYXJ5IEhXIG1vZHVsZQorICAgICAgICBpZiAoZ2V0UGhvbmVTdGF0ZSgpID09IEFVRElPX01PREVfSU5fQ0FMTCkgeworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR4RGV2aWNlID0gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04pOworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBwcmltYXJ5T3V0cHV0ID0gb3V0cHV0cy5nZXRQcmltYXJ5T3V0cHV0KCk7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxQcmltYXJ5SW5wdXREZXZpY2VzID0KKyAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tSHdNb2R1bGUocHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpOworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsUHJpbWFyeU91dHB1dERldmljZXMgPQorICAgICAgICAgICAgICAgICAgICBwcmltYXJ5T3V0cHV0LT5zdXBwb3J0ZWREZXZpY2VzKCkgJiBhdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCk7CisKKyAgICAgICAgICAgIGlmICgoKGF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAgICAoKCh0eERldmljZSAmIGF2YWlsUHJpbWFyeUlucHV0RGV2aWNlcyAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIChwcmltYXJ5T3V0cHV0LT5nZXRBdWRpb1BvcnQoKS0+Z2V0TW9kdWxlVmVyc2lvbigpIDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkpKSB7CisgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgPSBhdmFpbFByaW1hcnlPdXRwdXREZXZpY2VzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGZvciBwaG9uZSBzdHJhdGVneSwgd2UgZmlyc3QgY29uc2lkZXIgdGhlIGZvcmNlZCB1c2UgYW5kIHRoZW4gdGhlIGF2YWlsYWJsZSBkZXZpY2VzIGJ5IG9yZGVyCisgICAgICAgIC8vIG9mIHByaW9yaXR5CisgICAgICAgIHN3aXRjaCAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0pIHsKKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPOgorICAgICAgICAgICAgaWYgKCFpc0luQ2FsbCgpIHx8IHN0cmF0ZWd5ICE9IFNUUkFURUdZX0RUTUYpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQ7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUOworICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDTzsKKyAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgLy8gaWYgU0NPIGRldmljZSBpcyByZXF1ZXN0ZWQgYnV0IG5vIFNDTyBkZXZpY2UgaXMgYXZhaWxhYmxlLCBmYWxsIGJhY2sgdG8gZGVmYXVsdCBjYXNlCisgICAgICAgICAgICAvLyBGQUxMIFRIUk9VR0gKKworICAgICAgICBkZWZhdWx0OiAgICAvLyBGT1JDRV9OT05FCisgICAgICAgICAgICAvLyB3aGVuIG5vdCBpbiBhIHBob25lIGNhbGwsIHBob25lIHN0cmF0ZWd5IHNob3VsZCByb3V0ZSBTVFJFQU1fVk9JQ0VfQ0FMTCB0byBBMkRQCisgICAgICAgICAgICBpZiAoIWlzSW5DYWxsKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBXSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKG91dHB1dHMuZ2V0QTJkcE91dHB1dCgpICE9IDApKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQ7CisgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOworICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICBpZiAoIWlzSW5DYWxsKCkpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWTsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQ7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVDsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgZGV2aWNlID0gbUFwbU9ic2VydmVyLT5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCktPnR5cGUoKTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBubyBkZXZpY2UgZm91bmQgZm9yIFNUUkFURUdZX1BIT05FIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSOgorICAgICAgICAgICAgLy8gd2hlbiBub3QgaW4gYSBwaG9uZSBjYWxsLCBwaG9uZSBzdHJhdGVneSBzaG91bGQgcm91dGUgU1RSRUFNX1ZPSUNFX0NBTEwgdG8KKyAgICAgICAgICAgIC8vIEEyRFAgc3BlYWtlciB3aGVuIGZvcmNpbmcgdG8gc3BlYWtlciBvdXRwdXQKKyAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSAmJgorICAgICAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgorICAgICAgICAgICAgICAgICAgICAob3V0cHV0cy5nZXRBMmRwT3V0cHV0KCkgIT0gMCkpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUjsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSkgeworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVDsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUw7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0xJTkU7CisgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICBkZXZpY2UgPSBtQXBtT2JzZXJ2ZXItPmdldERlZmF1bHRPdXRwdXREZXZpY2UoKS0+dHlwZSgpOworICAgICAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIG5vIGRldmljZSBmb3VuZCBmb3IgU1RSQVRFR1lfUEhPTkUsIEZPUkNFX1NQRUFLRVIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgYnJlYWs7CisKKyAgICBjYXNlIFNUUkFURUdZX1NPTklGSUNBVElPTjoKKworICAgICAgICAvLyBJZiBpbmNhbGwsIGp1c3Qgc2VsZWN0IHRoZSBTVFJBVEVHWV9QSE9ORSBkZXZpY2U6IFRoZSByZXN0IG9mIHRoZSBiZWhhdmlvciBpcyBoYW5kbGVkIGJ5CisgICAgICAgIC8vIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpLgorICAgICAgICBpZiAoaXNJbkNhbGwoKSkgeworICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gRkFMTCBUSFJPVUdICisKKyAgICBjYXNlIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEU6CisgICAgICAgIC8vIHN0cmF0ZWd5IFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUgdXNlcyBzYW1lIHJvdXRpbmcgcG9saWN5IGFzIFNUUkFURUdZX1NPTklGSUNBVElPTgorICAgICAgICAvLyBleGNlcHQ6CisgICAgICAgIC8vICAgLSB3aGVuIGluIGNhbGwgd2hlcmUgaXQgZG9lc24ndCBkZWZhdWx0IHRvIFNUUkFURUdZX1BIT05FIGJlaGF2aW9yCisgICAgICAgIC8vICAgLSBpbiBjb3VudHJpZXMgd2hlcmUgbm90IGVuZm9yY2VkIGluIHdoaWNoIGNhc2UgaXQgZm9sbG93cyBTVFJBVEVHWV9NRURJQQorCisgICAgICAgIGlmICgoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB8fAorICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBzcGVha2VyIGRldmljZSBub3QgZm91bmQgZm9yIFNUUkFURUdZX1NPTklGSUNBVElPTiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFRoZSBzZWNvbmQgZGV2aWNlIHVzZWQgZm9yIHNvbmlmaWNhdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGUgZGV2aWNlIHVzZWQgYnkgbWVkaWEgc3RyYXRlZ3kKKyAgICAgICAgLy8gRkFMTCBUSFJPVUdICisKKyAgICAvLyBGSVhNRTogU1RSQVRFR1lfQUNDRVNTSUJJTElUWSBhbmQgU1RSQVRFR1lfUkVST1VUSU5HIGZvbGxvdyBTVFJBVEVHWV9NRURJQSBmb3Igbm93CisgICAgY2FzZSBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZOgorICAgICAgICBpZiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfQUNDRVNTSUJJTElUWSkgeworICAgICAgICAgICAgLy8gZG8gbm90IHJvdXRlIGFjY2Vzc2liaWxpdHkgcHJvbXB0cyB0byBhIGRpZ2l0YWwgb3V0cHV0IGN1cnJlbnRseSBjb25maWd1cmVkIHdpdGggYQorICAgICAgICAgICAgLy8gY29tcHJlc3NlZCBmb3JtYXQgYXMgdGhleSB3b3VsZCBsaWtlbHkgbm90IGJlIG1peGVkIGFuZCBkcm9wcGVkLgorICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gb3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gZGVzYy0+ZGV2aWNlKCkgJgorICAgICAgICAgICAgICAgICAgICAoQVVESU9fREVWSUNFX09VVF9IRE1JIHwgQVVESU9fREVWSUNFX09VVF9TUERJRiB8IEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkMpOworICAgICAgICAgICAgICAgIGlmIChkZXNjLT5pc0FjdGl2ZSgpICYmICFhdWRpb19pc19saW5lYXJfcGNtKGRlc2MtPm1Gb3JtYXQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgfmRldmljZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIEZBTEwgVEhST1VHSAorCisgICAgY2FzZSBTVFJBVEVHWV9SRVJPVVRJTkc6CisgICAgY2FzZSBTVFJBVEVHWV9NRURJQTogeworICAgICAgICB1aW50MzJfdCBkZXZpY2UyID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgIGlmIChzdHJhdGVneSAhPSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHsKKyAgICAgICAgICAgIC8vIG5vIHNvbmlmaWNhdGlvbiBvbiByZW1vdGUgc3VibWl4IChlLmcuIFdGRCkKKyAgICAgICAgICAgIGlmIChhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZShBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsIFN0cmluZzgoIjAiKSkgIT0gMCkgeworICAgICAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkgJiBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzSW5DYWxsKCkgJiYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSkgeworICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSAmJgorICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCisgICAgICAgICAgICAgICAgKG91dHB1dHMuZ2V0QTJkcE91dHB1dCgpICE9IDApKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQOworICAgICAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpICYmCisgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdID09IEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSKSkgeworICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9MSU5FOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUOworICAgICAgICB9CisgICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgJiYgKHN0cmF0ZWd5ICE9IFNUUkFURUdZX1NPTklGSUNBVElPTikpIHsKKyAgICAgICAgICAgIC8vIG5vIHNvbmlmaWNhdGlvbiBvbiBhdXggZGlnaXRhbCAoZS5nLiBIRE1JKQorICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpICYmCisgICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0tdID09IEFVRElPX1BPTElDWV9GT1JDRV9BTkFMT0dfRE9DSykpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgfQorICAgICAgICBpbnQgZGV2aWNlMyA9IEFVRElPX0RFVklDRV9OT05FOworICAgICAgICBpZiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfTUVESUEpIHsKKyAgICAgICAgICAgIC8vIEFSQywgU1BESUYgYW5kIEFVWF9MSU5FIGNhbiBjby1leGlzdCB3aXRoIG90aGVycy4KKyAgICAgICAgICAgIGRldmljZTMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkM7CisgICAgICAgICAgICBkZXZpY2UzIHw9IChhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfU1BESUYpOworICAgICAgICAgICAgZGV2aWNlMyB8PSAoYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0FVWF9MSU5FKTsKKyAgICAgICAgfQorCisgICAgICAgIGRldmljZTIgfD0gZGV2aWNlMzsKKyAgICAgICAgLy8gZGV2aWNlIGlzIERFVklDRV9PVVRfU1BFQUtFUiBpZiB3ZSBjb21lIGZyb20gY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT04gb3IKKyAgICAgICAgLy8gU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwgQVVESU9fREVWSUNFX05PTkUgb3RoZXJ3aXNlCisgICAgICAgIGRldmljZSB8PSBkZXZpY2UyOworCisgICAgICAgIC8vIElmIGhkbWkgc3lzdGVtIGF1ZGlvIG1vZGUgaXMgb24sIHJlbW92ZSBzcGVha2VyIG91dCBvZiBvdXRwdXQgbGlzdC4KKyAgICAgICAgaWYgKChzdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQSkgJiYKKyAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJT10gPT0KKyAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfSERNSV9TWVNURU1fQVVESU9fRU5GT1JDRUQpKSB7CisgICAgICAgICAgICBkZXZpY2UgJj0gfkFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICBkZXZpY2UgPSBtQXBtT2JzZXJ2ZXItPmdldERlZmF1bHRPdXRwdXREZXZpY2UoKS0+dHlwZSgpOworICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBBTE9HRSgiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBubyBkZXZpY2UgZm91bmQgZm9yIFNUUkFURUdZX01FRElBIik7CisgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dXKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIHVua25vd24gc3RyYXRlZ3k6ICVkIiwgc3RyYXRlZ3kpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBBTE9HVlYoImdldERldmljZUZvclN0cmF0ZWd5KCkgc3RyYXRlZ3kgJWQsIGRldmljZSAleCIsIHN0cmF0ZWd5LCBkZXZpY2UpOworICAgIHJldHVybiBkZXZpY2U7Cit9CisKKworYXVkaW9fZGV2aWNlc190IEVuZ2luZTo6Z2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpIGNvbnN0Cit7CisgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzID0gbUFwbU9ic2VydmVyLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCk7CisgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVJbnB1dERldmljZXMgPSBtQXBtT2JzZXJ2ZXItPmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpOworICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gbUFwbU9ic2VydmVyLT5nZXRPdXRwdXRzKCk7CisgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZURldmljZVR5cGVzID0gYXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKKworICAgIHVpbnQzMl90IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworCisgICAgc3dpdGNoIChpbnB1dFNvdXJjZSkgeworICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSzoKKyAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9WT0lDRV9DQUxMKSB7CisgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgQVVESU9fU09VUkNFX0RFRkFVTFQ6CisgICAgY2FzZSBBVURJT19TT1VSQ0VfTUlDOgorICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCkgeworICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFA7CisgICAgfSBlbHNlIGlmICgobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSAmJgorICAgICAgICAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSkgeworICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUOworICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCkgeworICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVDsKKyAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UpIHsKKyAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0U7CisgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQykgeworICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUM7CisgICAgfQorICAgIGJyZWFrOworCisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKKyAgICAgICAgLy8gQWxsb3cgb25seSB1c2Ugb2YgZGV2aWNlcyBvbiBwcmltYXJ5IGlucHV0IGlmIGluIGNhbGwgYW5kIEhBTCBkb2VzIG5vdCBzdXBwb3J0IHJvdXRpbmcKKyAgICAgICAgLy8gdG8gdm9pY2UgY2FsbCBwYXRoLgorICAgICAgICBpZiAoKGdldFBob25lU3RhdGUoKSA9PSBBVURJT19NT0RFX0lOX0NBTEwpICYmCisgICAgICAgICAgICAgICAgKGF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYKSA9PSAwKSB7CisgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IHByaW1hcnlPdXRwdXQgPSBvdXRwdXRzLmdldFByaW1hcnlPdXRwdXQoKTsKKyAgICAgICAgICAgIGF2YWlsYWJsZURldmljZVR5cGVzID0KKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tSHdNb2R1bGUocHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpCisgICAgICAgICAgICAgICAgICAgICYgfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dKSB7CisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTzoKKyAgICAgICAgICAgIC8vIGlmIFNDTyBkZXZpY2UgaXMgcmVxdWVzdGVkIGJ1dCBubyBTQ08gZGV2aWNlIGlzIGF2YWlsYWJsZSwgZmFsbCBiYWNrIHRvIGRlZmF1bHQgY2FzZQorICAgICAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCkgeworICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBGQUxMIFRIUk9VR0gKKworICAgICAgICBkZWZhdWx0OiAgICAvLyBGT1JDRV9OT05FCisgICAgICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCkgeworICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUOworICAgICAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfU1BFQUtFUjoKKyAgICAgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CQUNLX01JQykgeworICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CQUNLX01JQzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OOgorICAgIGNhc2UgQVVESU9fU09VUkNFX0hPVFdPUkQ6CisgICAgICAgIGlmIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08gJiYKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQ7CisgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQ7CisgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0U7CisgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9DQU1DT1JERVI6CisgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CQUNLX01JQykgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDOworICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTks6CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTDoKKyAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEwpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9WT0lDRV9DQUxMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVg6CisgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgY2FzZSBBVURJT19TT1VSQ0VfRk1fVFVORVI6CisgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUikgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dXKCJnZXREZXZpY2VGb3JJbnB1dFNvdXJjZSgpIGludmFsaWQgaW5wdXQgc291cmNlICVkIiwgaW5wdXRTb3VyY2UpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgQUxPR1YoImdldERldmljZUZvcklucHV0U291cmNlKClpbnB1dCBzb3VyY2UgJWQsIGRldmljZSAlMDh4IiwgaW5wdXRTb3VyY2UsIGRldmljZSk7CisgICAgcmV0dXJuIGRldmljZTsKK30KKwordGVtcGxhdGUgPD4KK0F1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZSAqRW5naW5lOjpxdWVyeUludGVyZmFjZSgpCit7CisgICAgcmV0dXJuICZtTWFuYWdlckludGVyZmFjZTsKK30KKworfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NmE0NzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmgKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworCisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiR2FpbnMuaCIKKyNpbmNsdWRlIDxBdWRpb0dhaW4uaD4KKyNpbmNsdWRlIDxwb2xpY3kuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQKK3sKKworY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXI7CisKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kKK3sKKworY2xhc3MgRW5naW5lCit7CitwdWJsaWM6CisgICAgRW5naW5lKCk7CisgICAgdmlydHVhbCB+RW5naW5lKCk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgUmVxdWVzdGVkSW50ZXJmYWNlPgorICAgIFJlcXVlc3RlZEludGVyZmFjZSAqcXVlcnlJbnRlcmZhY2UoKTsKKworcHJpdmF0ZToKKyAgICAvLy8gSW50ZXJmYWNlIG1lbWJlcnMKKyAgICBjbGFzcyBNYW5hZ2VySW50ZXJmYWNlSW1wbCA6IHB1YmxpYyBBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBNYW5hZ2VySW50ZXJmYWNlSW1wbChFbmdpbmUgKnBvbGljeUVuZ2luZSkKKyAgICAgICAgICAgIDogbVBvbGljeUVuZ2luZShwb2xpY3lFbmdpbmUpIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldE9ic2VydmVyKEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICpvYnNlcnZlcikKKyAgICAgICAgeworICAgICAgICAgICAgbVBvbGljeUVuZ2luZS0+c2V0T2JzZXJ2ZXIob2JzZXJ2ZXIpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmluaXRDaGVjaygpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JVc2FnZShhdWRpb191c2FnZV90IHVzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0U3RyYXRlZ3lGb3JVc2FnZSh1c2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0UGhvbmVTdGF0ZShtb2RlKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldFBob25lU3RhdGUoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPnNldEZvcmNlVXNlKHVzYWdlLCBjb25maWcpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRGb3JjZVVzZSh1c2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gLypkZXZEZXNjKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCAvKnN0YXRlKi8pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+aW5pdFN0cmVhbVZvbHVtZShzdHJlYW0sIGluZGV4TWluLCBpbmRleE1heCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIGluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoYm9vbCBpc1NwZWFrZXJEcmNFbmFibGVkKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+aW5pdGlhbGl6ZVZvbHVtZUN1cnZlcyhpc1NwZWFrZXJEcmNFbmFibGVkKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGZsb2F0IHZvbEluZGV4VG9EYihWb2x1bWU6OmRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSxpbnQgaW5kZXhJblVpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+dm9sSW5kZXhUb0RiKGRldmljZUNhdGVnb3J5LCBzdHJlYW0sIGluZGV4SW5VaSk7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICBFbmdpbmUgKm1Qb2xpY3lFbmdpbmU7CisgICAgfSBtTWFuYWdlckludGVyZmFjZTsKKworcHJpdmF0ZToKKyAgICAvKiBDb3B5IGZhY2lsaXRpZXMgYXJlIHB1dCBwcml2YXRlIHRvIGRpc2FibGUgY29weS4gKi8KKyAgICBFbmdpbmUoY29uc3QgRW5naW5lICZvYmplY3QpOworICAgIEVuZ2luZSAmb3BlcmF0b3I9KGNvbnN0IEVuZ2luZSAmb2JqZWN0KTsKKworICAgIHZvaWQgc2V0T2JzZXJ2ZXIoQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm9ic2VydmVyKTsKKworICAgIHN0YXR1c190IGluaXRDaGVjaygpOworCisgICAgaW5saW5lIGJvb2wgaXNJbkNhbGwoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzX3N0YXRlX2luX2NhbGwobVBob25lU3RhdGUpOworICAgIH0KKworICAgIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IG1vZGUpOworICAgIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtUGhvbmVTdGF0ZTsKKyAgICB9CisgICAgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyk7CisgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbUZvcmNlVXNlW3VzYWdlXTsKKyAgICB9CisgICAgc3RhdHVzX3Qgc2V0RGVmYXVsdERldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKworICAgIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JVc2FnZShhdWRpb191c2FnZV90IHVzYWdlKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkgY29uc3Q7CisgICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKSBjb25zdDsKKworICAgIGZsb2F0IHZvbEluZGV4VG9EYihWb2x1bWU6OmRldmljZV9jYXRlZ29yeSBjYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4SW5VaSk7CisgICAgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpOworICAgIHZvaWQgaW5pdGlhbGl6ZVZvbHVtZUN1cnZlcyhib29sIGlzU3BlYWtlckRyY0VuYWJsZWQpOworCisgICAgYXVkaW9fbW9kZV90IG1QaG9uZVN0YXRlOyAgLyoqPCBjdXJyZW50IHBob25lIHN0YXRlLiAqLworCisgICAgLyoqIGN1cnJlbnQgZm9yY2VkIHVzZSBjb25maWd1cmF0aW9uLiAqLworICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UXTsKKworICAgIEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICptQXBtT2JzZXJ2ZXI7Cit9OworfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZUluc3RhbmNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZUluc3RhbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xN2U5ODMyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lSW5zdGFuY2UuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmg+CisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lFbmdpbmVJbnN0YW5jZS5oIgorI2luY2x1ZGUgIkVuZ2luZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZAoreworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoreworCitFbmdpbmVJbnN0YW5jZTo6RW5naW5lSW5zdGFuY2UoKQoreworfQorCitFbmdpbmVJbnN0YW5jZSAqRW5naW5lSW5zdGFuY2U6OmdldEluc3RhbmNlKCkKK3sKKyAgICBzdGF0aWMgRW5naW5lSW5zdGFuY2UgaW5zdGFuY2U7CisgICAgcmV0dXJuICZpbnN0YW5jZTsKK30KKworRW5naW5lSW5zdGFuY2U6On5FbmdpbmVJbnN0YW5jZSgpCit7Cit9CisKK0VuZ2luZSAqRW5naW5lSW5zdGFuY2U6OmdldEVuZ2luZSgpIGNvbnN0Cit7CisgICAgc3RhdGljIEVuZ2luZSBlbmdpbmU7CisgICAgcmV0dXJuICZlbmdpbmU7Cit9CisKK3RlbXBsYXRlIDw+CitBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UgKkVuZ2luZUluc3RhbmNlOjpxdWVyeUludGVyZmFjZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGdldEVuZ2luZSgpLT5xdWVyeUludGVyZmFjZTxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2U+KCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9HYWlucy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9HYWlucy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmMjkwOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0dhaW5zLmNwcApAQCAtMCwwICsxLDI1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpHYWlucyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworLy8jZGVmaW5lIFZFUllfVkVSQk9TRV9MT0dHSU5HCisjaWZkZWYgVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNkZWZpbmUgQUxPR1ZWIEFMT0dWCisjZWxzZQorI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworI2luY2x1ZGUgIkdhaW5zLmgiCisjaW5jbHVkZSA8Vm9sdW1lLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBFbmdpbmVkZWZhdWx0Citjb25zdCBWb2x1bWVDdXJ2ZVBvaW50CitHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7CisgICAgezEsIC00OS41Zn0sIHszMywgLTMzLjVmfSwgezY2LCAtMTcuMGZ9LCB7MTAwLCAwLjBmfQorfTsKKworCitjb25zdCBWb2x1bWVDdXJ2ZVBvaW50CitHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTU4LjBmfSwgezIwLCAtNDAuMGZ9LCB7NjAsIC0xNy4wZn0sIHsxMDAsIDAuMGZ9Cit9OworCitjb25zdCBWb2x1bWVDdXJ2ZVBvaW50CitHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0geworICAgIHsxLCAtNTguMGZ9LCB7MjAsIC00MC4wZn0sIHs2MCwgLTIxLjBmfSwgezEwMCwgLTEwLjBmfQorfTsKKworY29uc3QgVm9sdW1lQ3VydmVQb2ludAorR2FpbnM6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7CisgICAgezEsIC01Ni4wZn0sIHsyMCwgLTM0LjBmfSwgezYwLCAtMTEuMGZ9LCB7MTAwLCAwLjBmfQorfTsKKworY29uc3QgVm9sdW1lQ3VydmVQb2ludAorR2FpbnM6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZURyY1tWb2x1bWU6OlZPTENOVF0gPSB7CisgICAgezEsIC01NS4wZn0sIHsyMCwgLTQzLjBmfSwgezg2LCAtMTIuMGZ9LCB7MTAwLCAwLjBmfQorfTsKKworY29uc3QgVm9sdW1lQ3VydmVQb2ludAorR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0geworICAgIHsxLCAtMjkuN2Z9LCB7MzMsIC0yMC4xZn0sIHs2NiwgLTEwLjJmfSwgezEwMCwgMC4wZn0KK307CisKK2NvbnN0IFZvbHVtZUN1cnZlUG9pbnQKK0dhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTM1LjdmfSwgezMzLCAtMjYuMWZ9LCB7NjYsIC0xMy4yZn0sIHsxMDAsIDAuMGZ9Cit9OworCisvLyBBVURJT19TVFJFQU1fU1lTVEVNLCBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSBhbmQgQVVESU9fU1RSRUFNX0RUTUYgdm9sdW1lIHRyYWNrcworLy8gQVVESU9fU1RSRUFNX1JJTkcgb24gcGhvbmVzIGFuZCBBVURJT19TVFJFQU1fTVVTSUMgb24gdGFibGV0cy4KKy8vIEFVRElPX1NUUkVBTV9EVE1GIHRyYWNrcyBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCB3aGlsZSBpbiBjYWxsIChTZWUgQXVkaW9TZXJ2aWNlLmphdmEpLgorLy8gVGhlIHJhbmdlIGlzIGNvbnN0cmFpbmVkIGJldHdlZW4gLTI0ZEIgYW5kIC02ZEIgb3ZlciBzcGVha2VyIGFuZCAtMzBkQiBhbmQgLTE4ZEIgb3ZlciBoZWFkc2V0LgorCitjb25zdCBWb2x1bWVDdXJ2ZVBvaW50CitHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7CisgICAgezEsIC0yNC4wZn0sIHszMywgLTE4LjBmfSwgezY2LCAtMTIuMGZ9LCB7MTAwLCAtNi4wZn0KK307CisKK2NvbnN0IFZvbHVtZUN1cnZlUG9pbnQKK0dhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlRHJjW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTM0LjBmfSwgezMzLCAtMjQuMGZ9LCB7NjYsIC0xNS4wZn0sIHsxMDAsIC02LjBmfQorfTsKKworY29uc3QgVm9sdW1lQ3VydmVQb2ludAorR2FpbnM6OnNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0geworICAgIHsxLCAtMzAuMGZ9LCB7MzMsIC0yNi4wZn0sIHs2NiwgLTIyLjBmfSwgezEwMCwgLTE4LjBmfQorfTsKKworY29uc3QgVm9sdW1lQ3VydmVQb2ludAorR2FpbnM6OnNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7CisgICAgezAsIC00Mi4wZn0sIHszMywgLTI4LjBmfSwgezY2LCAtMTQuMGZ9LCB7MTAwLCAwLjBmfQorfTsKKworY29uc3QgVm9sdW1lQ3VydmVQb2ludAorR2FpbnM6OnNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7CisgICAgezAsIC0yNC4wZn0sIHszMywgLTE2LjBmfSwgezY2LCAtOC4wZn0sIHsxMDAsIDAuMGZ9Cit9OworCitjb25zdCBWb2x1bWVDdXJ2ZVBvaW50CitHYWluczo6c0xpbmVhclZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKKyAgICB7MCwgLTk2LjBmfSwgezMzLCAtNjguMGZ9LCB7NjYsIC0zNC4wZn0sIHsxMDAsIDAuMGZ9Cit9OworCitjb25zdCBWb2x1bWVDdXJ2ZVBvaW50CitHYWluczo6c1NpbGVudFZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKKyAgICB7MCwgLTk2LjBmfSwgezEsIC05Ni4wZn0sIHsyLCAtOTYuMGZ9LCB7MTAwLCAtOTYuMGZ9Cit9OworCitjb25zdCBWb2x1bWVDdXJ2ZVBvaW50CitHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKKyAgICB7MCwgMC4wZn0sIHsxLCAwLjBmfSwgezIsIDAuMGZ9LCB7MTAwLCAwLjBmfQorfTsKKworY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqR2FpbnM6OnNWb2x1bWVQcm9maWxlc1tBVURJT19TVFJFQU1fQ05UXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbVm9sdW1lOjpERVZJQ0VfQ0FURUdPUllfQ05UXSA9IHsKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIEdhaW5zOjpzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIEdhaW5zOjpzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9TWVNURU0KKyAgICAgICAgR2FpbnM6OnNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX1JJTkcKKyAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIEdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX01VU0lDCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIEdhaW5zOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9BTEFSTQorICAgICAgICBHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvbHVtZUN1cnZlLCAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIEdhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgIH0sCisgICAgeyAvLyBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAorICAgICAgICBHYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKKyAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIEdhaW5zOjpzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFCisgICAgICAgIEdhaW5zOjpzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAorICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgIC8vIEFVRElPX1NUUkVBTV9EVE1GCisgICAgICAgIEdhaW5zOjpzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAorICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX1RUUworICAgICAgLy8gIlRyYW5zbWl0dGVkIFRocm91Z2ggU3BlYWtlciI6IGFsd2F5cyBzaWxlbnQgZXhjZXB0IG9uIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIEdhaW5zOjpzU2lsZW50Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIEdhaW5zOjpzTGluZWFyVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIEdhaW5zOjpzU2lsZW50Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBHYWluczo6c1NpbGVudFZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIEdhaW5zOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9SRVJPVVRJTkcKKyAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX1BBVENICisgICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKK307CisKKy8vc3RhdGljCitmbG9hdCBHYWluczo6dm9sSW5kZXhUb0RiKFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJlYW1EZXNjcmlwdG9yJiBzdHJlYW1EZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKQoreworICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKmN1cnZlID0gc3RyZWFtRGVzYy5nZXRWb2x1bWVDdXJ2ZVBvaW50KGRldmljZUNhdGVnb3J5KTsKKworICAgIC8vIHRoZSB2b2x1bWUgaW5kZXggaW4gdGhlIFVJIGlzIHJlbGF0aXZlIHRvIHRoZSBtaW4gYW5kIG1heCB2b2x1bWUgaW5kaWNlcyBmb3IgdGhpcyBzdHJlYW0gdHlwZQorICAgIGludCBuYlN0ZXBzID0gMSArIGN1cnZlW1ZvbHVtZTo6Vk9MTUFYXS5tSW5kZXggLQorICAgICAgICAgICAgY3VydmVbVm9sdW1lOjpWT0xNSU5dLm1JbmRleDsKKyAgICBpbnQgdm9sSWR4ID0gKG5iU3RlcHMgKiAoaW5kZXhJblVpIC0gc3RyZWFtRGVzYy5nZXRWb2x1bWVJbmRleE1pbigpKSkgLworICAgICAgICAgICAgKHN0cmVhbURlc2MuZ2V0Vm9sdW1lSW5kZXhNYXgoKSAtIHN0cmVhbURlc2MuZ2V0Vm9sdW1lSW5kZXhNaW4oKSk7CisKKyAgICAvLyBmaW5kIHdoYXQgcGFydCBvZiB0aGUgY3VydmUgdGhpcyBpbmRleCB2b2x1bWUgYmVsb25ncyB0bywgb3IgaWYgaXQncyBvdXQgb2YgYm91bmRzCisgICAgaW50IHNlZ21lbnQgPSAwOworICAgIGlmICh2b2xJZHggPCBjdXJ2ZVtWb2x1bWU6OlZPTE1JTl0ubUluZGV4KSB7ICAgICAgICAgLy8gb3V0IG9mIGJvdW5kcworICAgICAgICByZXR1cm4gVk9MVU1FX01JTl9EQjsKKyAgICB9IGVsc2UgaWYgKHZvbElkeCA8IGN1cnZlW1ZvbHVtZTo6Vk9MS05FRTFdLm1JbmRleCkgeworICAgICAgICBzZWdtZW50ID0gMDsKKyAgICB9IGVsc2UgaWYgKHZvbElkeCA8IGN1cnZlW1ZvbHVtZTo6Vk9MS05FRTJdLm1JbmRleCkgeworICAgICAgICBzZWdtZW50ID0gMTsKKyAgICB9IGVsc2UgaWYgKHZvbElkeCA8PSBjdXJ2ZVtWb2x1bWU6OlZPTE1BWF0ubUluZGV4KSB7CisgICAgICAgIHNlZ21lbnQgPSAyOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0IG9mIGJvdW5kcworICAgICAgICByZXR1cm4gMC4wZjsKKyAgICB9CisKKyAgICAvLyBsaW5lYXIgaW50ZXJwb2xhdGlvbiBpbiB0aGUgYXR0ZW51YXRpb24gdGFibGUgaW4gZEIKKyAgICBmbG9hdCBkZWNpYmVscyA9IGN1cnZlW3NlZ21lbnRdLm1EQkF0dGVudWF0aW9uICsKKyAgICAgICAgICAgICgoZmxvYXQpKHZvbElkeCAtIGN1cnZlW3NlZ21lbnRdLm1JbmRleCkpICoKKyAgICAgICAgICAgICAgICAoIChjdXJ2ZVtzZWdtZW50KzFdLm1EQkF0dGVudWF0aW9uIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1EQkF0dGVudWF0aW9uKSAvCisgICAgICAgICAgICAgICAgICAgICgoZmxvYXQpKGN1cnZlW3NlZ21lbnQrMV0ubUluZGV4IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tSW5kZXgpKSApOworCisgICAgQUxPR1ZWKCJWT0xVTUUgdm9sIGluZGV4PVslZCAlZCAlZF0sIGRCPVslLjFmICUuMWYgJS4xZl0iLAorICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubUluZGV4LCB2b2xJZHgsCisgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50KzFdLm1JbmRleCwKKyAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1EQkF0dGVudWF0aW9uLAorICAgICAgICAgICAgZGVjaWJlbHMsCisgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50KzFdLm1EQkF0dGVudWF0aW9uKTsKKworICAgIHJldHVybiBkZWNpYmVsczsKK30KKworCisvL3N0YXRpYworZmxvYXQgR2FpbnM6OnZvbEluZGV4VG9BbXBsKFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmVhbURlc2NyaXB0b3ImIHN0cmVhbURlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4SW5VaSkKK3sKKyAgICByZXR1cm4gVm9sdW1lOjpEYlRvQW1wbCh2b2xJbmRleFRvRGIoZGV2aWNlQ2F0ZWdvcnksIHN0cmVhbURlc2MsIGluZGV4SW5VaSkpOworfQorCisKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0dhaW5zLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9HYWlucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MjBiN2QKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9HYWlucy5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPFN0cmVhbURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBTdHJlYW1EZXNjcmlwdG9yOworCitjbGFzcyBHYWlucworeworcHVibGljIDoKKyAgICBzdGF0aWMgZmxvYXQgdm9sSW5kZXhUb0FtcGwoVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmVhbURlc2NyaXB0b3ImIHN0cmVhbURlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleEluVWkpOworCisgICAgc3RhdGljIGZsb2F0IHZvbEluZGV4VG9EYihWb2x1bWU6OmRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmVhbURlc2NyaXB0b3ImIHN0cmVhbURlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKTsKKworICAgIC8vIGRlZmF1bHQgdm9sdW1lIGN1cnZlCisgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07CisgICAgLy8gZGVmYXVsdCB2b2x1bWUgY3VydmUgZm9yIG1lZGlhIHN0cmF0ZWd5CisgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKKyAgICAvLyB2b2x1bWUgY3VydmUgZm9yIG5vbi1tZWRpYSBhdWRpbyBvbiBleHQgbWVkaWEgb3V0cHV0cyAoSERNSSwgTGluZSwgZXRjKQorICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKKyAgICAvLyB2b2x1bWUgY3VydmUgZm9yIG1lZGlhIHN0cmF0ZWd5IG9uIHNwZWFrZXJzCisgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKKyAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVEcmNbVm9sdW1lOjpWT0xDTlRdOworICAgIC8vIHZvbHVtZSBjdXJ2ZSBmb3Igc29uaWZpY2F0aW9uIHN0cmF0ZWd5IG9uIHNwZWFrZXJzCisgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07CisgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyY1tWb2x1bWU6OlZPTENOVF07CisgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07CisgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZURyY1tWb2x1bWU6OlZPTENOVF07CisgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07CisgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKKyAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOworICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNMaW5lYXJWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07CisgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NpbGVudFZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKKyAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRnVsbFNjYWxlVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOworICAgIC8vIGRlZmF1bHQgdm9sdW1lIGN1cnZlcyBwZXIgc3RyZWFtIGFuZCBkZXZpY2UgY2F0ZWdvcnkuIFNlZSBpbml0aWFsaXplVm9sdW1lQ3VydmVzKCkKKyAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqc1ZvbHVtZVByb2ZpbGVzW0FVRElPX1NUUkVBTV9DTlRdW1ZvbHVtZTo6REVWSUNFX0NBVEVHT1JZX0NOVF07Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXIvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcApzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUZhY3RvcnkuY3BwCnJlbmFtZSB0byBzZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyL0F1ZGlvUG9saWN5RmFjdG9yeS5jcHAKaW5kZXggMmFlN2JjMS4uOTkxMGExZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyL0F1ZGlvUG9saWN5RmFjdG9yeS5jcHAKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJBdWRpb1BvbGljeU1hbmFnZXIuaCIKKyNpbmNsdWRlICJtYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2Y2ODY0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDQ4ODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Qb2xpY3lNYW5hZ2VyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisvLyNkZWZpbmUgVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNpZmRlZiBWRVJZX1ZFUkJPU0VfTE9HR0lORworI2RlZmluZSBBTE9HVlYgQUxPR1YKKyNlbHNlCisjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxBdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmg+CisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lNYW5hZ2VyLmgiCisjaW5jbHVkZSAiYXVkaW9fcG9saWN5X2NvbmYuaCIKKyNpbmNsdWRlIDxDb25maWdQYXJzaW5nVXRpbHMuaD4KKyNpbmNsdWRlIDxwb2xpY3kuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBdWRpb1BvbGljeUludGVyZmFjZSBpbXBsZW1lbnRhdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkKK3sKKyAgICByZXR1cm4gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KGRldmljZSwgc3RhdGUsIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQoreworICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoKSBkZXZpY2U6IDB4JVgsIHN0YXRlICVkLCBhZGRyZXNzICVzIG5hbWUgJXMiLAorLSAgICAgICAgICAgIGRldmljZSwgc3RhdGUsIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSk7CisKKyAgICAvLyBjb25uZWN0L2Rpc2Nvbm5lY3Qgb25seSAxIGRldmljZSBhdCBhIHRpbWUKKyAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSAmJiAhYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHJldHVybiBCQURfVkFMVUU7CisKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0KKyAgICAgICAgICAgIG1Id01vZHVsZXMuZ2V0RGV2aWNlRGVzY3JpcHRvcihkZXZpY2UsIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSk7CisKKyAgICAvLyBoYW5kbGUgb3V0cHV0IGRldmljZXMKKyAgICBpZiAoYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpKSB7CisgICAgICAgIFNvcnRlZFZlY3RvciA8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHM7CisKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2YoZGV2RGVzYyk7CisKKyAgICAgICAgLy8gc2F2ZSBhIGNvcHkgb2YgdGhlIG9wZW5lZCBvdXRwdXQgZGVzY3JpcHRvcnMgYmVmb3JlIGFueSBvdXRwdXQgaXMgb3BlbmVkIG9yIGNsb3NlZAorICAgICAgICAvLyBieSBjaGVja091dHB1dHNGb3JEZXZpY2UoKS4gVGhpcyB3aWxsIGJlIG5lZWRlZCBieSBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKQorICAgICAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgLy8gaGFuZGxlIG91dHB1dCBkZXZpY2UgY29ubmVjdGlvbgorICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFOiB7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2UgYWxyZWFkeSBjb25uZWN0ZWQ6ICV4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgY29ubmVjdGluZyBkZXZpY2UgJXgiLCBkZXZpY2UpOworCisgICAgICAgICAgICAvLyByZWdpc3RlciBuZXcgZGV2aWNlIGFzIGF2YWlsYWJsZQorICAgICAgICAgICAgaW5kZXggPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5hZGQoZGV2RGVzYyk7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZvckRldmljZShkZXZpY2UpOworICAgICAgICAgICAgICAgIGlmIChtb2R1bGUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgY291bGQgbm90IGZpbmQgSFcgbW9kdWxlIGZvciBkZXZpY2UgJTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CisgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPmF0dGFjaChtb2R1bGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2hlY2tPdXRwdXRzRm9yRGV2aWNlKGRldkRlc2MsIHN0YXRlLCBvdXRwdXRzLCBkZXZEZXNjLT5tQWRkcmVzcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUoZGV2RGVzYyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUHJvcGFnYXRlIGRldmljZSBhdmFpbGFiaWxpdHkgdG8gRW5naW5lCisgICAgICAgICAgICBtRW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2RGVzYywgc3RhdGUpOworCisgICAgICAgICAgICAvLyBvdXRwdXRzIHNob3VsZCBuZXZlciBiZSBlbXB0eSBoZXJlCisgICAgICAgICAgICBBTE9HX0FTU0VSVChvdXRwdXRzLnNpemUoKSAhPSAwLCAic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCk6IgorICAgICAgICAgICAgICAgICAgICAiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgcmV0dXJuZWQgbm8gb3V0cHV0cyBidXQgc3RhdHVzIE9LIik7CisgICAgICAgICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgcmV0dXJuZWQgJXp1IG91dHB1dHMiLAorICAgICAgICAgICAgICAgICAgb3V0cHV0cy5zaXplKCkpOworCisgICAgICAgICAgICAvLyBTZW5kIGNvbm5lY3QgdG8gSEFMcworICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihkZXZEZXNjLT5tQWRkcmVzcyk7CisgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfREVWSUNFX0NPTk5FQ1QpLCBkZXZpY2UpOworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIHBhcmFtLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAvLyBoYW5kbGUgb3V0cHV0IGRldmljZSBkaXNjb25uZWN0aW9uCisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTogeworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2Ugbm90IGNvbm5lY3RlZDogJXgiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRpc2Nvbm5lY3Rpbmcgb3V0cHV0IGRldmljZSAleCIsIGRldmljZSk7CisKKyAgICAgICAgICAgIC8vIFNlbmQgRGlzY29ubmVjdCB0byBIQUxzCisgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9ERVZJQ0VfRElTQ09OTkVDVCksIGRldmljZSk7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhBVURJT19JT19IQU5ETEVfTk9ORSwgcGFyYW0udG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgIC8vIHJlbW92ZSBkZXZpY2UgZnJvbSBhdmFpbGFibGUgb3V0cHV0IGRldmljZXMKKyAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKKworICAgICAgICAgICAgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKGRldkRlc2MsIHN0YXRlLCBvdXRwdXRzLCBkZXZEZXNjLT5tQWRkcmVzcyk7CisKKyAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSBkZXZpY2UgYXZhaWxhYmlsaXR5IHRvIEVuZ2luZQorICAgICAgICAgICAgbUVuZ2luZS0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldkRlc2MsIHN0YXRlKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBpbnZhbGlkIHN0YXRlOiAleCIsIHN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVja0EyZHBTdXNwZW5kIG11c3QgcnVuIGJlZm9yZSBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMgc28gdGhhdCBBMkRQCisgICAgICAgIC8vIG91dHB1dCBpcyBzdXNwZW5kZWQgYmVmb3JlIGFueSB0cmFja3MgYXJlIG1vdmVkIHRvIGl0CisgICAgICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKKyAgICAgICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7CisgICAgICAgIC8vIG91dHB1dHMgbXVzdCBiZSBjbG9zZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkgaXMgZXhlY3V0ZWQKKyAgICAgICAgaWYgKCFvdXRwdXRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXRzW2ldKTsKKyAgICAgICAgICAgICAgICAvLyBjbG9zZSB1bnVzZWQgb3V0cHV0cyBhZnRlciBkZXZpY2UgZGlzY29ubmVjdGlvbiBvciBkaXJlY3Qgb3V0cHV0cyB0aGF0IGhhdmUgYmVlbgorICAgICAgICAgICAgICAgIC8vIG9wZW5lZCBieSBjaGVja091dHB1dHNGb3JEZXZpY2UoKSB0byBxdWVyeSBkeW5hbWljIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICBpZiAoKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2MtPm1EaXJlY3RPcGVuQ291bnQgPT0gMCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dHNbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGNoZWNrIGFnYWluIGFmdGVyIGNsb3NpbmcgQTJEUCBvdXRwdXQgdG8gcmVzZXQgbUEyZHBTdXNwZW5kZWQgaWYgbmVlZGVkCisgICAgICAgICAgICBjaGVja0EyZHBTdXNwZW5kKCk7CisgICAgICAgIH0KKworICAgICAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOworICAgICAgICBpZiAobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpID09IEFVRElPX01PREVfSU5fQ0FMTCAmJiBoYXNQcmltYXJ5T3V0cHV0KCkpIHsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgdXBkYXRlQ2FsbFJvdXRpbmcobmV3RGV2aWNlKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAoKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSAhPSBBVURJT19NT0RFX0lOX0NBTEwpIHx8IChkZXNjICE9IG1QcmltYXJ5T3V0cHV0KSkgeworICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UoZGVzYywgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgICAgICAvLyBkbyBub3QgZm9yY2UgZGV2aWNlIGNoYW5nZSBvbiBkdXBsaWNhdGVkIG91dHB1dCBiZWNhdXNlIGlmIGRldmljZSBpcyAwLCBpdCB3aWxsCisgICAgICAgICAgICAgICAgLy8gYWxzbyBmb3JjZSBhIGRldmljZSAwIGZvciB0aGUgdHdvIG91dHB1dHMgaXQgaXMgZHVwbGljYXRlZCB0byB3aGljaCBtYXkgb3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAvLyBhIHZhbGlkIGRldmljZSBzZWxlY3Rpb24gb24gdGhvc2Ugb3V0cHV0cy4KKyAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gIWRlc2MtPmlzRHVwbGljYXRlZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIWRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHdheXMgZm9yY2Ugd2hlbiBkaXNjb25uZWN0aW5nIChhIG5vbi1kdXBsaWNhdGVkIGRldmljZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpKTsKKyAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2UoZGVzYywgbmV3RGV2aWNlLCBmb3JjZSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9ICAvLyBlbmQgaWYgaXMgb3V0cHV0IGRldmljZQorCisgICAgLy8gaGFuZGxlIGlucHV0IGRldmljZXMKKyAgICBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgU29ydGVkVmVjdG9yIDxhdWRpb19pb19oYW5kbGVfdD4gaW5wdXRzOworCisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmluZGV4T2YoZGV2RGVzYyk7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgLy8gaGFuZGxlIGlucHV0IGRldmljZSBjb25uZWN0aW9uCisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEU6IHsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBhbHJlYWR5IGNvbm5lY3RlZDogJWQiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZvckRldmljZShkZXZpY2UpOworICAgICAgICAgICAgaWYgKG1vZHVsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpOiBjb3VsZCBub3QgZmluZCBIVyBtb2R1bGUgZm9yIGRldmljZSAlMDh4IiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaGVja0lucHV0c0ZvckRldmljZShkZXZEZXNjLCBzdGF0ZSwgaW5wdXRzLCBkZXZEZXNjLT5tQWRkcmVzcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGluZGV4ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5hZGQoZGV2RGVzYyk7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdLT5hdHRhY2gobW9kdWxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2V0IGNvbm5lY3QgdG8gSEFMcworICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihkZXZEZXNjLT5tQWRkcmVzcyk7CisgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfREVWSUNFX0NPTk5FQ1QpLCBkZXZpY2UpOworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIHBhcmFtLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICAvLyBQcm9wYWdhdGUgZGV2aWNlIGF2YWlsYWJpbGl0eSB0byBFbmdpbmUKKyAgICAgICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZEZXNjLCBzdGF0ZSk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gaGFuZGxlIGlucHV0IGRldmljZSBkaXNjb25uZWN0aW9uCisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTogeworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2Ugbm90IGNvbm5lY3RlZDogJWQiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRpc2Nvbm5lY3RpbmcgaW5wdXQgZGV2aWNlICV4IiwgZGV2aWNlKTsKKworICAgICAgICAgICAgLy8gU2V0IERpc2Nvbm5lY3QgdG8gSEFMcworICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihkZXZEZXNjLT5tQWRkcmVzcyk7CisgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfREVWSUNFX0RJU0NPTk5FQ1QpLCBkZXZpY2UpOworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIHBhcmFtLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICBjaGVja0lucHV0c0ZvckRldmljZShkZXZEZXNjLCBzdGF0ZSwgaW5wdXRzLCBkZXZEZXNjLT5tQWRkcmVzcyk7CisgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKKworICAgICAgICAgICAgLy8gUHJvcGFnYXRlIGRldmljZSBhdmFpbGFiaWxpdHkgdG8gRW5naW5lCisgICAgICAgICAgICBtRW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2RGVzYywgc3RhdGUpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgaW52YWxpZCBzdGF0ZTogJXgiLCBzdGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgY2xvc2VBbGxJbnB1dHMoKTsKKworICAgICAgICBpZiAobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpID09IEFVRElPX01PREVfSU5fQ0FMTCAmJiBoYXNQcmltYXJ5T3V0cHV0KCkpIHsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgdXBkYXRlQ2FsbFJvdXRpbmcobmV3RGV2aWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gLy8gZW5kIGlmIGlzIGlucHV0IGRldmljZQorCisgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgZGV2aWNlOiAleCIsIGRldmljZSk7CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCit7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG1Id01vZHVsZXMuZ2V0RGV2aWNlRGVzY3JpcHRvcihkZXZpY2UsIGRldmljZV9hZGRyZXNzLCAiIik7CisKKyAgICBEZXZpY2VWZWN0b3IgKmRldmljZVZlY3RvcjsKKworICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgZGV2aWNlVmVjdG9yID0gJm1BdmFpbGFibGVPdXRwdXREZXZpY2VzOworICAgIH0gZWxzZSBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgZGV2aWNlVmVjdG9yID0gJm1BdmFpbGFibGVJbnB1dERldmljZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coImdldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgZGV2aWNlIHR5cGUgJTA4eCIsIGRldmljZSk7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOworICAgIH0KKyAgICByZXR1cm4gZGV2aWNlVmVjdG9yLT5nZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2RGVzYyk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1cGRhdGVDYWxsUm91dGluZyhhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UsIGludCBkZWxheU1zKQoreworICAgIGJvb2wgY3JlYXRlVHhQYXRjaCA9IGZhbHNlOworICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKKyAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7CisgICAgcGF0Y2gubnVtX3NpbmtzID0gMTsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZTsKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdDsKKworICAgIGlmKCFoYXNQcmltYXJ5T3V0cHV0KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhdWRpb19kZXZpY2VzX3QgdHhEZXZpY2UgPSBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTik7CisgICAgQUxPR1YoInVwZGF0ZUNhbGxSb3V0aW5nIGRldmljZSByeERldmljZSAlMDh4IHR4RGV2aWNlICUwOHgiLCByeERldmljZSwgdHhEZXZpY2UpOworCisgICAgLy8gcmVsZWFzZSBleGlzdGluZyBSWCBwYXRjaCBpZiBhbnkKKyAgICBpZiAobUNhbGxSeFBhdGNoICE9IDApIHsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKG1DYWxsUnhQYXRjaC0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICBtQ2FsbFJ4UGF0Y2guY2xlYXIoKTsKKyAgICB9CisgICAgLy8gcmVsZWFzZSBUWCBwYXRjaCBpZiBhbnkKKyAgICBpZiAobUNhbGxUeFBhdGNoICE9IDApIHsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKG1DYWxsVHhQYXRjaC0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICBtQ2FsbFR4UGF0Y2guY2xlYXIoKTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgUlggZGV2aWNlIGlzIG9uIHRoZSBwcmltYXJ5IEhXIG1vZHVsZSwgdGhlbiB1c2UgbGVnYWN5IHJvdXRpbmcgbWV0aG9kIGZvciB2b2ljZSBjYWxscworICAgIC8vIHZpYSBzZXRPdXRwdXREZXZpY2UoKSBvbiBwcmltYXJ5IG91dHB1dC4KKyAgICAvLyBPdGhlcndpc2UsIGNyZWF0ZSB0d28gYXVkaW8gcGF0Y2hlcyBmb3IgVFggYW5kIFJYIHBhdGguCisgICAgaWYgKGF2YWlsYWJsZVByaW1hcnlPdXRwdXREZXZpY2VzKCkgJiByeERldmljZSkgeworICAgICAgICBzZXRPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlLCB0cnVlLCBkZWxheU1zKTsKKyAgICAgICAgLy8gSWYgdGhlIFRYIGRldmljZSBpcyBhbHNvIG9uIHRoZSBwcmltYXJ5IEhXIG1vZHVsZSwgc2V0T3V0cHV0RGV2aWNlKCkgd2lsbCB0YWtlIGNhcmUKKyAgICAgICAgLy8gb2YgaXQgZHVlIHRvIGxlZ2FjeSBpbXBsZW1lbnRhdGlvbi4gSWYgbm90LCBjcmVhdGUgYSBwYXRjaC4KKyAgICAgICAgaWYgKChhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCkgJiB0eERldmljZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKQorICAgICAgICAgICAgICAgID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBjcmVhdGVUeFBhdGNoID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGNyZWF0ZSBSWCBwYXRoIGF1ZGlvIHBhdGNoCisgICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUocnhEZXZpY2UpOworICAgICAgICBBTE9HX0FTU0VSVCghZGV2aWNlTGlzdC5pc0VtcHR5KCksCisgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIHNlbGVjdGVkIGRldmljZSBub3QgaW4gb3V0cHV0IGRldmljZSBsaXN0Iik7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHJ4U2lua0RldmljZURlc2MgPSBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKKyAgICAgICAgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgpOworICAgICAgICBBTE9HX0FTU0VSVCghZGV2aWNlTGlzdC5pc0VtcHR5KCksCisgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIG5vIHRlbGVwaG9ueSBSWCBkZXZpY2UiKTsKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gcnhTb3VyY2VEZXZpY2VEZXNjID0gZGV2aWNlTGlzdC5pdGVtQXQoMCk7CisKKyAgICAgICAgcnhTb3VyY2VEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1swXSk7CisgICAgICAgIHJ4U2lua0RldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zaW5rc1swXSk7CisKKyAgICAgICAgLy8gcmVxdWVzdCB0byByZXVzZSBleGlzdGluZyBvdXRwdXQgc3RyZWFtIGlmIG9uZSBpcyBhbHJlYWR5IG9wZW5lZCB0byByZWFjaCB0aGUgUlggZGV2aWNlCisgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dHNGb3JEZXZpY2UocnhEZXZpY2UsIG1PdXRwdXRzKTsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0lOVkFMSUQpOworICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgICAgICAgICBBTE9HX0FTU0VSVCghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBSWCBkZXZpY2Ugb3V0cHV0IGlzIGR1cGxpY2F0ZWQiKTsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzFdKTsKKyAgICAgICAgICAgIHBhdGNoLnNvdXJjZXNbMV0uZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9QQVRDSDsKKyAgICAgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMjsKKyAgICAgICAgfQorCisgICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmYWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgInVwZGF0ZUNhbGxSb3V0aW5nKCkgZXJyb3IgJWQgY3JlYXRpbmcgUlggYXVkaW8gcGF0Y2giLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBtQ2FsbFJ4UGF0Y2ggPSBuZXcgQXVkaW9QYXRjaCgmcGF0Y2gsIG1VaWRDYWNoZWQpOworICAgICAgICAgICAgbUNhbGxSeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICBtQ2FsbFJ4UGF0Y2gtPm1VaWQgPSBtVWlkQ2FjaGVkOworICAgICAgICB9CisgICAgICAgIGNyZWF0ZVR4UGF0Y2ggPSB0cnVlOworICAgIH0KKyAgICBpZiAoY3JlYXRlVHhQYXRjaCkgeworCisgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKKyAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOworICAgICAgICBwYXRjaC5udW1fc2lua3MgPSAxOworICAgICAgICBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUodHhEZXZpY2UpOworICAgICAgICBBTE9HX0FTU0VSVCghZGV2aWNlTGlzdC5pc0VtcHR5KCksCisgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIHNlbGVjdGVkIGRldmljZSBub3QgaW4gaW5wdXQgZGV2aWNlIGxpc3QiKTsKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gdHhTb3VyY2VEZXZpY2VEZXNjID0gZGV2aWNlTGlzdC5pdGVtQXQoMCk7CisgICAgICAgIHR4U291cmNlRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMF0pOworICAgICAgICBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYKTsKKyAgICAgICAgQUxPR19BU1NFUlQoIWRldmljZUxpc3QuaXNFbXB0eSgpLAorICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBubyB0ZWxlcGhvbnkgVFggZGV2aWNlIik7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHR4U2lua0RldmljZURlc2MgPSBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKKyAgICAgICAgdHhTaW5rRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNpbmtzWzBdKTsKKworICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRzRm9yRGV2aWNlKEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYLCBtT3V0cHV0cyk7CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKKyAgICAgICAgLy8gcmVxdWVzdCB0byByZXVzZSBleGlzdGluZyBvdXRwdXQgc3RyZWFtIGlmIG9uZSBpcyBhbHJlYWR5IG9wZW5lZCB0byByZWFjaCB0aGUgVFgKKyAgICAgICAgLy8gcGF0aCBvdXRwdXQgZGV2aWNlCisgICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgICAgICAgICBBTE9HX0FTU0VSVCghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBSWCBkZXZpY2Ugb3V0cHV0IGlzIGR1cGxpY2F0ZWQiKTsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzFdKTsKKyAgICAgICAgICAgIHBhdGNoLnNvdXJjZXNbMV0uZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9QQVRDSDsKKyAgICAgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMjsKKyAgICAgICAgfQorCisgICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmYWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgInNldFBob25lU3RhdGUoKSBlcnJvciAlZCBjcmVhdGluZyBUWCBhdWRpbyBwYXRjaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1DYWxsVHhQYXRjaCA9IG5ldyBBdWRpb1BhdGNoKCZwYXRjaCwgbVVpZENhY2hlZCk7CisgICAgICAgICAgICBtQ2FsbFR4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKKyAgICAgICAgICAgIG1DYWxsVHhQYXRjaC0+bVVpZCA9IG1VaWRDYWNoZWQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKK3sKKyAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIHN0YXRlICVkIiwgc3RhdGUpOworICAgIC8vIHN0b3JlIHByZXZpb3VzIHBob25lIHN0YXRlIGZvciBtYW5hZ2VtZW50IG9mIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBiZWxvdworICAgIGludCBvbGRTdGF0ZSA9IG1FbmdpbmUtPmdldFBob25lU3RhdGUoKTsKKworICAgIGlmIChtRW5naW5lLT5zZXRQaG9uZVN0YXRlKHN0YXRlKSAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HVygic2V0UGhvbmVTdGF0ZSgpIGludmFsaWQgb3Igc2FtZSBzdGF0ZSAlZCIsIHN0YXRlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLy8gT3BlbnM6IGNhbiB0aGVzZSBsaW5lIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBzd2l0Y2ggb2Ygdm9sdW1lIGN1cnZlcz8/PworICAgIC8vIGlmIGxlYXZpbmcgY2FsbCBzdGF0ZSwgaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBhY3RpdmUgc3RyZWFtcworICAgIC8vIHBlcnRhaW5pbmcgdG8gc29uaWZpY2F0aW9uIHN0cmF0ZWd5IHNlZSBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKQorICAgIGlmIChpc1N0YXRlSW5DYWxsKG9sZFN0YXRlKSkgeworICAgICAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIGluIGNhbGwgc3RhdGUgbWFuYWdlbWVudDogbmV3IHN0YXRlIGlzICVkIiwgc3RhdGUpOworICAgICAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOyBzdHJlYW0rKykgeworICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fUEFUQ0gpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZvcmNlIHJlZXZhbHVhdGluZyBhY2Nlc3NpYmlsaXR5IHJvdXRpbmcgd2hlbiBjYWxsIHN0b3BzCisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTd2l0Y2hpbmcgdG8gb3IgZnJvbSBpbmNhbGwgc3RhdGUgb3Igc3dpdGNoaW5nIGJldHdlZW4gdGVsZXBob255IGFuZCBWb0lQIGxlYWQgdG8gZm9yY2UKKyAgICAgKiByb3V0aW5nIGNvbW1hbmQuCisgICAgICovCisgICAgYm9vbCBmb3JjZSA9ICgoaXNfc3RhdGVfaW5fY2FsbChvbGRTdGF0ZSkgIT0gaXNfc3RhdGVfaW5fY2FsbChzdGF0ZSkpCisgICAgICAgICAgICAgICAgICB8fCAoaXNfc3RhdGVfaW5fY2FsbChzdGF0ZSkgJiYgKHN0YXRlICE9IG9sZFN0YXRlKSkpOworCisgICAgLy8gY2hlY2sgZm9yIGRldmljZSBhbmQgb3V0cHV0IGNoYW5nZXMgdHJpZ2dlcmVkIGJ5IG5ldyBwaG9uZSBzdGF0ZQorICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKKyAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKKyAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOworCisgICAgaW50IGRlbGF5TXMgPSAwOworICAgIGlmIChpc1N0YXRlSW5DYWxsKHN0YXRlKSkgeworICAgICAgICBuc2Vjc190IHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIC8vIG11dGUgbWVkaWEgYW5kIHNvbmlmaWNhdGlvbiBzdHJhdGVnaWVzIGFuZCBkZWxheSBkZXZpY2Ugc3dpdGNoIGJ5IHRoZSBsYXJnZXN0CisgICAgICAgICAgICAvLyBsYXRlbmN5IG9mIGFueSBvdXRwdXQgd2hlcmUgZWl0aGVyIHN0cmF0ZWd5IGlzIGFjdGl2ZS4KKyAgICAgICAgICAgIC8vIFRoaXMgYXZvaWQgc2VuZGluZyB0aGUgcmluZyB0b25lIG9yIG11c2ljIHRhaWwgaW50byB0aGUgZWFycGllY2Ugb3IgaGVhZHNldC4KKyAgICAgICAgICAgIGlmICgoaXNTdHJhdGVneUFjdGl2ZShkZXNjLCBTVFJBVEVHWV9NRURJQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNUaW1lKSB8fAorICAgICAgICAgICAgICAgICBpc1N0cmF0ZWd5QWN0aXZlKGRlc2MsIFNUUkFURUdZX1NPTklGSUNBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNUaW1lKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGRlbGF5TXMgPCAoaW50KWRlc2MtPmxhdGVuY3koKSoyKSkgeworICAgICAgICAgICAgICAgIGRlbGF5TXMgPSBkZXNjLT5sYXRlbmN5KCkqMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9NRURJQSwgdHJ1ZSwgZGVzYyk7CisgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfTUVESUEsIGZhbHNlLCBkZXNjLCBNVVRFX1RJTUVfTVMsCisgICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIHRydWUgLypmcm9tQ2FjaGUqLykpOworICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX1NPTklGSUNBVElPTiwgdHJ1ZSwgZGVzYyk7CisgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBmYWxzZSwgZGVzYywgTVVURV9USU1FX01TLAorICAgICAgICAgICAgICAgIGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTiwgdHJ1ZSAvKmZyb21DYWNoZSovKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaGFzUHJpbWFyeU91dHB1dCgpKSB7CisgICAgICAgIC8vIE5vdGUgdGhhdCBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgZ2V0TmV3T3V0cHV0RGV2aWNlKCkgaXMgY2FsbGVkIG9uIHRoZSBwcmltYXJ5IG91dHB1dCwKKyAgICAgICAgLy8gdGhlIGRldmljZSByZXR1cm5lZCBpcyBub3QgbmVjZXNzYXJpbHkgcmVhY2hhYmxlIHZpYSB0aGlzIG91dHB1dAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAvLyBmb3JjZSByb3V0aW5nIGNvbW1hbmQgdG8gYXVkaW8gaGFyZHdhcmUgd2hlbiBlbmRpbmcgY2FsbAorICAgICAgICAvLyBldmVuIGlmIG5vIGRldmljZSBjaGFuZ2UgaXMgbmVlZGVkCisgICAgICAgIGlmIChpc1N0YXRlSW5DYWxsKG9sZFN0YXRlKSAmJiByeERldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgcnhEZXZpY2UgPSBtUHJpbWFyeU91dHB1dC0+ZGV2aWNlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7CisgICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhyeERldmljZSwgZGVsYXlNcyk7CisgICAgICAgIH0gZWxzZSBpZiAob2xkU3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7CisgICAgICAgICAgICBpZiAobUNhbGxSeFBhdGNoICE9IDApIHsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gobUNhbGxSeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgICAgICAgICAgbUNhbGxSeFBhdGNoLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUNhbGxUeFBhdGNoICE9IDApIHsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gobUNhbGxUeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgICAgICAgICAgbUNhbGxUeFBhdGNoLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlLCBmb3JjZSwgMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlLCBmb3JjZSwgMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gaWYgZW50ZXJpbmcgaW4gY2FsbCBzdGF0ZSwgaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBhY3RpdmUgc3RyZWFtcworICAgIC8vIHBlcnRhaW5pbmcgdG8gc29uaWZpY2F0aW9uIHN0cmF0ZWd5IHNlZSBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKQorICAgIGlmIChpc1N0YXRlSW5DYWxsKHN0YXRlKSkgeworICAgICAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIGluIGNhbGwgc3RhdGUgbWFuYWdlbWVudDogbmV3IHN0YXRlIGlzICVkIiwgc3RhdGUpOworICAgICAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOyBzdHJlYW0rKykgeworICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fUEFUQ0gpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sIHRydWUsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZm9yY2UgcmVldmFsdWF0aW5nIGFjY2Vzc2liaWxpdHkgcm91dGluZyB3aGVuIGNhbGwgc3RhcnRzCisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZKTsKKyAgICB9CisKKyAgICAvLyBGbGFnIHRoYXQgcmluZ3RvbmUgdm9sdW1lIG11c3QgYmUgbGltaXRlZCB0byBtdXNpYyB2b2x1bWUgdW50aWwgd2UgZXhpdCBNT0RFX1JJTkdUT05FCisgICAgaWYgKHN0YXRlID09IEFVRElPX01PREVfUklOR1RPTkUgJiYKKyAgICAgICAgaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX01VU0lDLCBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSkpIHsKKyAgICAgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lID0gZmFsc2U7CisgICAgfQorfQorCithdWRpb19tb2RlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRQaG9uZVN0YXRlKCkgeworICAgIHJldHVybiBtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQoreworICAgIEFMT0dWKCJzZXRGb3JjZVVzZSgpIHVzYWdlICVkLCBjb25maWcgJWQsIG1QaG9uZVN0YXRlICVkIiwgdXNhZ2UsIGNvbmZpZywgbUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpKTsKKworICAgIGlmIChtRW5naW5lLT5zZXRGb3JjZVVzZSh1c2FnZSwgY29uZmlnKSAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBjb3VsZCBub3Qgc2V0IGZvcmNlIGNmZyAlZCBmb3IgdXNhZ2UgJWQiLCBjb25maWcsIHVzYWdlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBib29sIGZvcmNlVm9sdW1lUmVldmFsID0gKHVzYWdlID09IEFVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTikgfHwKKyAgICAgICAgICAgICh1c2FnZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0spIHx8CisgICAgICAgICAgICAodXNhZ2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pOworCisgICAgLy8gY2hlY2sgZm9yIGRldmljZSBhbmQgb3V0cHV0IGNoYW5nZXMgdHJpZ2dlcmVkIGJ5IG5ldyBmb3JjZSB1c2FnZQorICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKKyAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKKyAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOworICAgIGlmIChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgPT0gQVVESU9fTU9ERV9JTl9DQUxMICYmIGhhc1ByaW1hcnlPdXRwdXQoKSkgeworICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhuZXdEZXZpY2UpOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICBpZiAoKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSAhPSBBVURJT19NT0RFX0lOX0NBTEwpIHx8IChvdXRwdXREZXNjICE9IG1QcmltYXJ5T3V0cHV0KSkgeworICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIG5ld0RldmljZSwgKG5ld0RldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JjZVZvbHVtZVJlZXZhbCAmJiAobmV3RGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSkgeworICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG91dHB1dERlc2MsIG5ld0RldmljZSwgMCwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdWRpb19pb19oYW5kbGVfdCBhY3RpdmVJbnB1dCA9IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXQoKTsKKyAgICBpZiAoYWN0aXZlSW5wdXQgIT0gMCkgeworICAgICAgICBzZXRJbnB1dERldmljZShhY3RpdmVJbnB1dCwgZ2V0TmV3SW5wdXREZXZpY2UoYWN0aXZlSW5wdXQpKTsKKyAgICB9CisKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN5c3RlbVByb3BlcnR5KGNvbnN0IGNoYXIqIHByb3BlcnR5LCBjb25zdCBjaGFyKiB2YWx1ZSkKK3sKKyAgICBBTE9HVigic2V0U3lzdGVtUHJvcGVydHkoKSBwcm9wZXJ0eSAlcywgdmFsdWUgJXMiLCBwcm9wZXJ0eSwgdmFsdWUpOworfQorCisvLyBGaW5kIGEgZGlyZWN0IG91dHB1dCBwcm9maWxlIGNvbXBhdGlibGUgd2l0aCB0aGUgcGFyYW1ldGVycyBwYXNzZWQsIGV2ZW4gaWYgdGhlIGlucHV0IGZsYWdzIGRvCisvLyBub3QgZXhwbGljaXRseSByZXF1ZXN0IGEgZGlyZWN0IG91dHB1dAorc3A8SU9Qcm9maWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKK3sKKyAgICAvLyBvbmx5IHJldGFpbiBmbGFncyB0aGF0IHdpbGwgZHJpdmUgdGhlIGRpcmVjdCBvdXRwdXQgcHJvZmlsZSBzZWxlY3Rpb24KKyAgICAvLyBpZiBleHBsaWNpdGx5IHJlcXVlc3RlZAorICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrUmVsZXZhbnRGbGFncyA9CisgICAgICAgICAgICAoQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpOworICAgIGZsYWdzID0KKyAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KSgoZmxhZ3MgJiBrUmVsZXZhbnRGbGFncykgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworCisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IGN1clByb2ZpbGUgPSBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXNbal07CisgICAgICAgICAgICBpZiAoIWN1clByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2aWNlLCBTdHJpbmc4KCIiKSwKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLCBOVUxMIC8qdXBkYXRlZFNhbXBsaW5nUmF0ZSovLAorICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIE5VTEwgLyp1cGRhdGVkRm9ybWF0Ki8sCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBOVUxMIC8qdXBkYXRlZENoYW5uZWxNYXNrKi8sCisgICAgICAgICAgICAgICAgICAgIGZsYWdzKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gcmVqZWN0IHByb2ZpbGVzIG5vdCBjb3JyZXNwb25kaW5nIHRvIGEgZGV2aWNlIGN1cnJlbnRseSBhdmFpbGFibGUKKyAgICAgICAgICAgIGlmICgobUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIGN1clByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkpID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGlmIHNldmVyYWwgcHJvZmlsZXMgYXJlIGNvbXBhdGlibGUsIGdpdmUgcHJpb3JpdHkgdG8gb25lIHdpdGggb2ZmbG9hZCBjYXBhYmlsaXR5CisgICAgICAgICAgICBpZiAocHJvZmlsZSAhPSAwICYmICgoY3VyUHJvZmlsZS0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb2ZpbGUgPSBjdXJQcm9maWxlOworICAgICAgICAgICAgaWYgKChwcm9maWxlLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHByb2ZpbGU7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKK3sKKyAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koc3RyZWFtKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgIEFMT0dWKCJnZXRPdXRwdXQoKSBkZXZpY2UgJWQsIHN0cmVhbSAlZCwgc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJXgsIGNoYW5uZWxNYXNrICV4LCBmbGFncyAleCIsCisgICAgICAgICAgZGV2aWNlLCBzdHJlYW0sIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MpOworCisgICAgcmV0dXJuIGdldE91dHB1dEZvckRldmljZShkZXZpY2UsIEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIHNhbXBsaW5nUmF0ZSxmb3JtYXQsIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG9mZmxvYWRJbmZvKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQoreworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzOworICAgIGlmIChhdHRyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKCFpc1ZhbGlkQXR0cmlidXRlcyhhdHRyKSkgeworICAgICAgICAgICAgQUxPR0UoImdldE91dHB1dEZvckF0dHIoKSBpbnZhbGlkIGF0dHJpYnV0ZXM6IHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLAorICAgICAgICAgICAgICAgICAgYXR0ci0+dXNhZ2UsIGF0dHItPmNvbnRlbnRfdHlwZSwgYXR0ci0+ZmxhZ3MsCisgICAgICAgICAgICAgICAgICBhdHRyLT50YWdzKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgYXR0cmlidXRlcyA9ICphdHRyOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgqc3RyZWFtIDwgQVVESU9fU1RSRUFNX01JTiB8fCAqc3RyZWFtID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7CisgICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0cigpOiAgaW52YWxpZCBzdHJlYW0gdHlwZSIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBzdHJlYW1fdHlwZV90b19hdWRpb19hdHRyaWJ1dGVzKCpzdHJlYW0sICZhdHRyaWJ1dGVzKTsKKyAgICB9CisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2M7CisgICAgaWYgKG1Qb2xpY3lNaXhlcy5nZXRPdXRwdXRGb3JBdHRyKGF0dHJpYnV0ZXMsIGRlc2MpID09IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dfQVNTRVJUKGRlc2MgIT0gMCwgIkludmFsaWQgZGVzYyByZXR1cm5lZCBieSBnZXRPdXRwdXRGb3JBdHRyIik7CisgICAgICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgICpzdHJlYW0gPSBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoJmF0dHJpYnV0ZXMpOworICAgICAgICAqb3V0cHV0ID0gZGVzYy0+bUlvSGFuZGxlOworICAgICAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIHJldHVybnMgb3V0cHV0ICVkIiwgKm91dHB1dCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgaWYgKGF0dHJpYnV0ZXMudXNhZ2UgPT0gQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UpIHsKKyAgICAgICAgQUxPR1coImdldE91dHB1dEZvckF0dHIoKSBubyBwb2xpY3kgbWl4IGZvdW5kIGZvciB1c2FnZSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkgdXNhZ2U9JWQsIGNvbnRlbnQ9JWQsIHRhZz0lcyBmbGFncz0lMDh4IgorICAgICAgICAgICAgIiBzZXNzaW9uICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQiLAorICAgICAgICAgICAgYXR0cmlidXRlcy51c2FnZSwgYXR0cmlidXRlcy5jb250ZW50X3R5cGUsIGF0dHJpYnV0ZXMudGFncywgYXR0cmlidXRlcy5mbGFncywKKyAgICAgICAgICAgIHNlc3Npb24sIHNlbGVjdGVkRGV2aWNlSWQpOworCisgICAgKnN0cmVhbSA9IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludCgmYXR0cmlidXRlcyk7CisKKyAgICAvLyBFeHBsaWNpdCByb3V0aW5nPworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2M7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0tPmdldElkKCkgPT0gc2VsZWN0ZWREZXZpY2VJZCkgeworICAgICAgICAgICAgZGV2aWNlRGVzYyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgbU91dHB1dFJvdXRlcy5hZGRSb3V0ZShzZXNzaW9uLCAqc3RyZWFtLCBTZXNzaW9uUm91dGU6OlNPVVJDRV9UWVBFX05BLCBkZXZpY2VEZXNjLCB1aWQpOworCisgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IChyb3V0aW5nX3N0cmF0ZWd5KSBnZXRTdHJhdGVneUZvckF0dHIoJmF0dHJpYnV0ZXMpOworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisKKyAgICBpZiAoKGF0dHJpYnV0ZXMuZmxhZ3MgJiBBVURJT19GTEFHX0hXX0FWX1NZTkMpICE9IDApIHsKKyAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyk7CisgICAgfQorCisgICAgQUxPR1YoImdldE91dHB1dEZvckF0dHIoKSBkZXZpY2UgMHgleCwgc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJXgsIGNoYW5uZWxNYXNrICV4LCBmbGFncyAleCIsCisgICAgICAgICAgZGV2aWNlLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzKTsKKworICAgICpvdXRwdXQgPSBnZXRPdXRwdXRGb3JEZXZpY2UoZGV2aWNlLCBzZXNzaW9uLCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG9mZmxvYWRJbmZvKTsKKyAgICBpZiAoKm91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICBtT3V0cHV0Um91dGVzLnJlbW92ZVJvdXRlKHNlc3Npb24pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dEZvckRldmljZSgKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gX191bnVzZWQsCisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCit7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgdWludDMyX3QgbGF0ZW5jeSA9IDA7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworCisjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKKyAgICBpZiAobUN1ck91dHB1dCAhPSAwKSB7CisgICAgICAgIEFMT0dWKCJnZXRPdXRwdXQoKSB0ZXN0IG91dHB1dCBtQ3VyT3V0cHV0ICVkLCBzYW1wbGluZ1JhdGUgJWQsIGZvcm1hdCAlZCwgY2hhbm5lbE1hc2sgJXgsIG1EaXJlY3RPdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgIG1DdXJPdXRwdXQsIG1UZXN0U2FtcGxpbmdSYXRlLCBtVGVzdEZvcm1hdCwgbVRlc3RDaGFubmVscywgbURpcmVjdE91dHB1dCk7CisKKyAgICAgICAgaWYgKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgb3BlbmluZyB0ZXN0IG91dHB1dCIpOworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UpOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSA9IG1UZXN0RGV2aWNlOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUxhdGVuY3kgPSBtVGVzdExhdGVuY3lNczsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyA9CisgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkobURpcmVjdE91dHB1dCA/IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCA6IDApOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPSAwOworICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gbVRlc3RTYW1wbGluZ1JhdGU7CisgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gbVRlc3RDaGFubmVsczsKKyAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBtVGVzdEZvcm1hdDsKKyAgICAgICAgICAgIGlmIChvZmZsb2FkSW5mbyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mbyA9ICpvZmZsb2FkSW5mbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1MYXRlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRDbWQgPSBBdWRpb1BhcmFtZXRlcigpOworICAgICAgICAgICAgICAgIG91dHB1dENtZC5hZGRJbnQoU3RyaW5nOCgic2V0X2lkIiksbUN1ck91dHB1dCk7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLG91dHB1dENtZC50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBhZGRPdXRwdXQobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLCBvdXRwdXREZXNjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdOworICAgIH0KKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCisKKyAgICAvLyBvcGVuIGEgZGlyZWN0IG91dHB1dCBpZiByZXF1aXJlZCBieSBzcGVjaWZpZWQgcGFyYW1ldGVycworICAgIC8vZm9yY2UgZGlyZWN0IGZsYWcgaWYgb2ZmbG9hZCBmbGFnIGlzIHNldDogb2ZmbG9hZGluZyBpbXBsaWVzIGEgZGlyZWN0IG91dHB1dCBzdHJlYW0KKyAgICAvLyBhbmQgYWxsIGNvbW1vbiBiZWhhdmlvcnMgYXJlIGRyaXZlbiBieSBjaGVja2luZyBvbmx5IHRoZSBkaXJlY3QgZmxhZworICAgIC8vIHRoaXMgc2hvdWxkIG5vcm1hbGx5IGJlIHNldCBhcHByb3ByaWF0ZWx5IGluIHRoZSBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlCisgICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKKyAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICB9CisgICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpICE9IDApIHsKKyAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICB9CisgICAgLy8gb25seSBhbGxvdyBkZWVwIGJ1ZmZlcmluZyBmb3IgbXVzaWMgc3RyZWFtIHR5cGUKKyAgICBpZiAoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9NVVNJQykgeworICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgJn5BVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUik7CisgICAgfSBlbHNlIGlmICgvKiBzdHJlYW0gPT0gQVVESU9fU1RSRUFNX01VU0lDICYmICovCisgICAgICAgICAgICBmbGFncyA9PSBBVURJT19PVVRQVVRfRkxBR19OT05FICYmCisgICAgICAgICAgICBwcm9wZXJ0eV9nZXRfYm9vbCgiYXVkaW8uZGVlcF9idWZmZXIubWVkaWEiLCBmYWxzZSAvKiBkZWZhdWx0X3ZhbHVlICovKSkgeworICAgICAgICAvLyB1c2UgREVFUF9CVUZGRVIgYXMgZGVmYXVsdCBvdXRwdXQgZm9yIG11c2ljIHN0cmVhbSB0eXBlCisgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KUFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSOworICAgIH0KKyAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9UVFMpIHsKKyAgICAgICAgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19UVFM7CisgICAgfQorCisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlOworCisgICAgLy8gc2tpcCBkaXJlY3Qgb3V0cHV0IHNlbGVjdGlvbiBpZiB0aGUgcmVxdWVzdCBjYW4gb2J2aW91c2x5IGJlIGF0dGFjaGVkIHRvIGEgbWl4ZWQgb3V0cHV0CisgICAgLy8gYW5kIG5vdCBleHBsaWNpdGx5IHJlcXVlc3RlZAorICAgIGlmICgoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSA9PSAwKSAmJgorICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpICYmIHNhbXBsaW5nUmF0ZSA8PSBNQVhfTUlYRVJfU0FNUExJTkdfUkFURSAmJgorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKSA8PSAyKSB7CisgICAgICAgIGdvdG8gbm9uX2RpcmVjdF9vdXRwdXQ7CisgICAgfQorCisgICAgLy8gRG8gbm90IGFsbG93IG9mZmxvYWRpbmcgaWYgb25lIG5vbiBvZmZsb2FkYWJsZSBlZmZlY3QgaXMgZW5hYmxlZC4gVGhpcyBwcmV2ZW50cyBmcm9tCisgICAgLy8gY3JlYXRpbmcgYW4gb2ZmbG9hZGVkIHRyYWNrIGFuZCB0ZWFyaW5nIGl0IGRvd24gaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnQgd2hlbiBhdWRpb2ZsaW5nZXIKKyAgICAvLyBkZXRlY3RzIHRoZXJlIGlzIGFuIGFjdGl2ZSBub24gb2ZmbG9hZGFibGUgZWZmZWN0LgorICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgY2hlY2sgdGhlIGF1ZGlvIHNlc3Npb24gaGVyZSBidXQgd2UgZG8gbm90IGhhdmUgaXQgaW4gdGhpcyBjb250ZXh0LgorICAgIC8vIFRoaXMgbWF5IHByZXZlbnQgb2ZmbG9hZGluZyBpbiByYXJlIHNpdHVhdGlvbnMgd2hlcmUgZWZmZWN0cyBhcmUgbGVmdCBhY3RpdmUgYnkgYXBwcworICAgIC8vIGluIHRoZSBiYWNrZ3JvdW5kLgorCisgICAgaWYgKCgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSA9PSAwKSB8fAorICAgICAgICAgICAgIW1FZmZlY3RzLmlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkpIHsKKyAgICAgICAgcHJvZmlsZSA9IGdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KWZsYWdzKTsKKyAgICB9CisKKyAgICBpZiAocHJvZmlsZSAhPSAwKSB7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gTlVMTDsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIChwcm9maWxlID09IGRlc2MtPm1Qcm9maWxlKSkgeworICAgICAgICAgICAgICAgIG91dHB1dERlc2MgPSBkZXNjOworICAgICAgICAgICAgICAgIC8vIHJldXNlIGRpcmVjdCBvdXRwdXQgaWYgY3VycmVudGx5IG9wZW4gYW5kIGNvbmZpZ3VyZWQgd2l0aCBzYW1lIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICBpZiAoKHNhbXBsaW5nUmF0ZSA9PSBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdCA9PSBvdXRwdXREZXNjLT5tRm9ybWF0KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IG91dHB1dERlc2MtPm1DaGFubmVsTWFzaykpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURpcmVjdE9wZW5Db3VudCsrOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgcmV1c2luZyBkaXJlY3Qgb3V0cHV0ICVkIiwgbU91dHB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbU91dHB1dHMua2V5QXQoaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGNsb3NlIGRpcmVjdCBvdXRwdXQgaWYgY3VycmVudGx5IG9wZW4gYW5kIGNvbmZpZ3VyZWQgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVycworICAgICAgICBpZiAob3V0cHV0RGVzYyAhPSBOVUxMKSB7CisgICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXREZXNjLT5tSW9IYW5kbGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgdGhlIHNlbGVjdGVkIHByb2ZpbGUgaXMgb2ZmbG9hZGVkIGFuZCBubyBvZmZsb2FkIGluZm8gd2FzIHNwZWNpZmllZCwKKyAgICAgICAgLy8gY3JlYXRlIGEgZGVmYXVsdCBvbmUKKyAgICAgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgZGVmYXVsdE9mZmxvYWRJbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKyAgICAgICAgaWYgKChwcm9maWxlLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAmJiAhb2ZmbG9hZEluZm8pIHsKKyAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpOworICAgICAgICAgICAgZGVmYXVsdE9mZmxvYWRJbmZvLnNhbXBsZV9yYXRlID0gc2FtcGxpbmdSYXRlOworICAgICAgICAgICAgZGVmYXVsdE9mZmxvYWRJbmZvLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrOworICAgICAgICAgICAgZGVmYXVsdE9mZmxvYWRJbmZvLmZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgICAgIGRlZmF1bHRPZmZsb2FkSW5mby5zdHJlYW1fdHlwZSA9IHN0cmVhbTsKKyAgICAgICAgICAgIGRlZmF1bHRPZmZsb2FkSW5mby5iaXRfcmF0ZSA9IDA7CisgICAgICAgICAgICBkZWZhdWx0T2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPSAtMTsKKyAgICAgICAgICAgIGRlZmF1bHRPZmZsb2FkSW5mby5oYXNfdmlkZW8gPSB0cnVlOyAvLyBjb25zZXJ2YXRpdmUKKyAgICAgICAgICAgIGRlZmF1bHRPZmZsb2FkSW5mby5pc19zdHJlYW1pbmcgPSB0cnVlOyAvLyBsaWtlbHkKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvID0gJmRlZmF1bHRPZmZsb2FkSW5mbzsKKyAgICAgICAgfQorCisgICAgICAgIG91dHB1dERlc2MgPSBuZXcgU3dBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOworICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gZGV2aWNlOworICAgICAgICBvdXRwdXREZXNjLT5tTGF0ZW5jeSA9IDA7CisgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkob3V0cHV0RGVzYy0+bUZsYWdzIHwgZmxhZ3MpOworICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHNhbXBsaW5nUmF0ZTsKKyAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrOworICAgICAgICBjb25maWcuZm9ybWF0ID0gZm9ybWF0OworICAgICAgICBpZiAob2ZmbG9hZEluZm8gIT0gTlVMTCkgeworICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mbyA9ICpvZmZsb2FkSW5mbzsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChwcm9maWxlLT5nZXRNb2R1bGVIYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bUxhdGVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyk7CisKKyAgICAgICAgLy8gb25seSBhY2NlcHQgYW4gb3V0cHV0IHdpdGggdGhlIHJlcXVlc3RlZCBwYXJhbWV0ZXJzCisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKKyAgICAgICAgICAgIChzYW1wbGluZ1JhdGUgIT0gMCAmJiBzYW1wbGluZ1JhdGUgIT0gY29uZmlnLnNhbXBsZV9yYXRlKSB8fAorICAgICAgICAgICAgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfREVGQVVMVCAmJiBmb3JtYXQgIT0gY29uZmlnLmZvcm1hdCkgfHwKKyAgICAgICAgICAgIChjaGFubmVsTWFzayAhPSAwICYmIGNoYW5uZWxNYXNrICE9IGNvbmZpZy5jaGFubmVsX21hc2spKSB7CisgICAgICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgZmFpbGVkIG9wZW5pbmcgZGlyZWN0IG91dHB1dDogb3V0cHV0ICVkIHNhbXBsaW5nUmF0ZSAlZCAlZCwiCisgICAgICAgICAgICAgICAgICAgICJmb3JtYXQgJWQgJWQsIGNoYW5uZWxNYXNrICUwNHggJTA0eCIsIG91dHB1dCwgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlLCBmb3JtYXQsIG91dHB1dERlc2MtPm1Gb3JtYXQsIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZmFsbCBiYWNrIHRvIG1peGVyIG91dHB1dCBpZiBwb3NzaWJsZSB3aGVuIHRoZSBkaXJlY3Qgb3V0cHV0IGNvdWxkIG5vdCBiZSBvcGVuCisgICAgICAgICAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpICYmIHNhbXBsaW5nUmF0ZSA8PSBNQVhfTUlYRVJfU0FNUExJTkdfUkFURSkgeworICAgICAgICAgICAgICAgIGdvdG8gbm9uX2RpcmVjdF9vdXRwdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgb3V0cHV0RGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CisgICAgICAgIG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID0gMDsKKyAgICAgICAgb3V0cHV0RGVzYy0+bVN0b3BUaW1lW3N0cmVhbV0gPSAwOworICAgICAgICBvdXRwdXREZXNjLT5tRGlyZWN0T3BlbkNvdW50ID0gMTsKKworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzcmNPdXRwdXQgPSBnZXRPdXRwdXRGb3JFZmZlY3QoKTsKKyAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgb3V0cHV0RGVzYyk7CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdE91dHB1dCA9IGdldE91dHB1dEZvckVmZmVjdCgpOworICAgICAgICBpZiAoZHN0T3V0cHV0ID09IG91dHB1dCkgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm1vdmVFZmZlY3RzKEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwgc3JjT3V0cHV0LCBkc3RPdXRwdXQpOworICAgICAgICB9CisgICAgICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKKyAgICAgICAgQUxPR1YoImdldE91dHB1dCgpIHJldHVybnMgbmV3IGRpcmVjdCBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgfQorCitub25fZGlyZWN0X291dHB1dDoKKyAgICAvLyBpZ25vcmluZyBjaGFubmVsIG1hc2sgZHVlIHRvIGRvd25taXggY2FwYWJpbGl0eSBpbiBtaXhlcgorCisgICAgLy8gb3BlbiBhIG5vbiBkaXJlY3Qgb3V0cHV0CisKKyAgICAvLyBmb3Igbm9uIGRpcmVjdCBvdXRwdXRzLCBvbmx5IFBDTSBpcyBzdXBwb3J0ZWQKKyAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CisgICAgICAgIC8vIGdldCB3aGljaCBvdXRwdXQgaXMgc3VpdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgc3RyZWFtLiBUaGUgYWN0dWFsCisgICAgICAgIC8vIHJvdXRpbmcgY2hhbmdlIHdpbGwgaGFwcGVuIHdoZW4gc3RhcnRPdXRwdXQoKSB3aWxsIGJlIGNhbGxlZAorICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKGRldmljZSwgbU91dHB1dHMpOworCisgICAgICAgIC8vIGF0IHRoaXMgc3RhZ2Ugd2Ugc2hvdWxkIGlnbm9yZSB0aGUgRElSRUNUIGZsYWcgYXMgbm8gZGlyZWN0IG91dHB1dCBjb3VsZCBiZSBmb3VuZCBlYXJsaWVyCisgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgICAgICBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywgZmxhZ3MsIGZvcm1hdCk7CisgICAgfQorICAgIEFMT0dXX0lGKChvdXRwdXQgPT0gMCksICJnZXRPdXRwdXQoKSBjb3VsZCBub3QgZmluZCBvdXRwdXQgZm9yIHN0cmVhbSAlZCwgc2FtcGxpbmdSYXRlICVkLCIKKyAgICAgICAgICAgICJmb3JtYXQgJWQsIGNoYW5uZWxzICV4LCBmbGFncyAleCIsIHN0cmVhbSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncyk7CisKKyAgICBBTE9HVigiICBnZXRPdXRwdXRGb3JEZXZpY2UoKSByZXR1cm5zIG91dHB1dCAlZCIsIG91dHB1dCk7CisKKyAgICByZXR1cm4gb3V0cHV0OworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNlbGVjdE91dHB1dChjb25zdCBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKK3sKKyAgICAvLyBzZWxlY3Qgb25lIG91dHB1dCBhbW9uZyBzZXZlcmFsIHRoYXQgcHJvdmlkZSBhIHBhdGggdG8gYSBwYXJ0aWN1bGFyIGRldmljZSBvciBzZXQgb2YKKyAgICAvLyBkZXZpY2VzICh0aGUgbGlzdCB3YXMgcHJldmlvdXNseSBidWlsZCBieSBnZXRPdXRwdXRzRm9yRGV2aWNlKCkpLgorICAgIC8vIFRoZSBwcmlvcml0eSBpcyBhcyBmb2xsb3dzOgorICAgIC8vIDE6IHRoZSBvdXRwdXQgd2l0aCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgcmVxdWVzdGVkIHBvbGljeSBmbGFncworICAgIC8vIDI6IHRoZSBwcmltYXJ5IG91dHB1dAorICAgIC8vIDM6IHRoZSBmaXJzdCBvdXRwdXQgaW4gdGhlIGxpc3QKKworICAgIGlmIChvdXRwdXRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAob3V0cHV0cy5zaXplKCkgPT0gMSkgeworICAgICAgICByZXR1cm4gb3V0cHV0c1swXTsKKyAgICB9CisKKyAgICBpbnQgbWF4Q29tbW9uRmxhZ3MgPSAwOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dEZsYWdzID0gMDsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRQcmltYXJ5ID0gMDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHNbaV0pOworICAgICAgICBpZiAoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgICAgICAvLyBpZiBhIHZhbGlkIGZvcm1hdCBpcyBzcGVjaWZpZWQsIHNraXAgb3V0cHV0IGlmIG5vdCBjb21wYXRpYmxlCisgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElEKSB7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IG91dHB1dERlc2MtPm1Gb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGNvbW1vbkZsYWdzID0gcG9wY291bnQob3V0cHV0RGVzYy0+bVByb2ZpbGUtPm1GbGFncyAmIGZsYWdzKTsKKyAgICAgICAgICAgIGlmIChjb21tb25GbGFncyA+IG1heENvbW1vbkZsYWdzKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0RmxhZ3MgPSBvdXRwdXRzW2ldOworICAgICAgICAgICAgICAgIG1heENvbW1vbkZsYWdzID0gY29tbW9uRmxhZ3M7CisgICAgICAgICAgICAgICAgQUxPR1YoInNlbGVjdE91dHB1dCgpIGNvbW1vbkZsYWdzIGZvciBvdXRwdXQgJWQsICUwNHgiLCBvdXRwdXRzW2ldLCBjb21tb25GbGFncyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVByb2ZpbGUtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRQcmltYXJ5ID0gb3V0cHV0c1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvdXRwdXRGbGFncyAhPSAwKSB7CisgICAgICAgIHJldHVybiBvdXRwdXRGbGFnczsKKyAgICB9CisgICAgaWYgKG91dHB1dFByaW1hcnkgIT0gMCkgeworICAgICAgICByZXR1cm4gb3V0cHV0UHJpbWFyeTsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0cHV0c1swXTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIEFMT0dWKCJzdGFydE91dHB1dCgpIG91dHB1dCAlZCwgc3RyZWFtICVkLCBzZXNzaW9uICVkIiwKKyAgICAgICAgICBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJzdGFydE91dHB1dCgpIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOworCisgICAgLy8gUm91dGluZz8KKyAgICBtT3V0cHV0Um91dGVzLmluY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7CisKKyAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlOworICAgIGlmIChvdXRwdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpIHsKKyAgICAgICAgbmV3RGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYOworICAgIH0gZWxzZSBpZiAobU91dHB1dFJvdXRlcy5oYXNSb3V0ZUNoYW5nZWQoc2Vzc2lvbikpIHsKKyAgICAgICAgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICBjaGVja1N0cmF0ZWd5Um91dGUoZ2V0U3RyYXRlZ3koc3RyZWFtKSwgb3V0cHV0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBuZXdEZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBkZWxheU1zID0gMDsKKworICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXJ0U291cmNlKG91dHB1dERlc2MsIHN0cmVhbSwgbmV3RGV2aWNlLCAmZGVsYXlNcyk7CisKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIG1PdXRwdXRSb3V0ZXMuZGVjUm91dGVBY3Rpdml0eShzZXNzaW9uKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgLy8gQXV0b21hdGljYWxseSBlbmFibGUgdGhlIHJlbW90ZSBzdWJtaXggaW5wdXQgd2hlbiBvdXRwdXQgaXMgc3RhcnRlZCBvbiBhIHJlIHJvdXRpbmcgbWl4CisgICAgLy8gb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKKyAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UobmV3RGV2aWNlKSAmJiBvdXRwdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwgJiYKKyAgICAgICAgICAgIG91dHB1dERlc2MtPm1Qb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgeworICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAorICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVBvbGljeU1peC0+bVJlZ2lzdHJhdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAicmVtb3RlLXN1Ym1peCIpOworICAgIH0KKworICAgIGlmIChkZWxheU1zICE9IDApIHsKKyAgICAgICAgdXNsZWVwKGRlbGF5TXMgKiAxMDAwKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0U291cmNlKHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpkZWxheU1zKQoreworICAgIC8vIGNhbm5vdCBzdGFydCBwbGF5YmFjayBvZiBTVFJFQU1fVFRTIGlmIGFueSBvdGhlciBvdXRwdXQgaXMgYmVpbmcgdXNlZAorICAgIHVpbnQzMl90IGJlYWNvbk11dGVMYXRlbmN5ID0gMDsKKworICAgICpkZWxheU1zID0gMDsKKyAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9UVFMpIHsKKyAgICAgICAgQUxPR1YoIlx0IGZvdW5kIEJFQUNPTiBzdHJlYW0iKTsKKyAgICAgICAgaWYgKG1PdXRwdXRzLmlzQW55T3V0cHV0QWN0aXZlKEFVRElPX1NUUkVBTV9UVFMgLypzdHJlYW1Ub0lnbm9yZSovKSkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmVhY29uTXV0ZUxhdGVuY3kgPSBoYW5kbGVFdmVudEZvckJlYWNvbihTVEFSVElOR19CRUFDT04pOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gc29tZSBwbGF5YmFjayBvdGhlciB0aGFuIGJlYWNvbiBzdGFydHMKKyAgICAgICAgYmVhY29uTXV0ZUxhdGVuY3kgPSBoYW5kbGVFdmVudEZvckJlYWNvbihTVEFSVElOR19PVVRQVVQpOworICAgIH0KKworICAgIC8vIGNoZWNrIGFjdGl2ZSBiZWZvcmUgaW5jcmVtZW50aW5nIHVzYWdlIGNvdW50CisgICAgYm9vbCBmb3JjZSA9ICFvdXRwdXREZXNjLT5pc0FjdGl2ZSgpOworCisgICAgLy8gaW5jcmVtZW50IHVzYWdlIGNvdW50IGZvciB0aGlzIHN0cmVhbSBvbiB0aGUgcmVxdWVzdGVkIG91dHB1dDoKKyAgICAvLyBOT1RFIHRoYXQgdGhlIHVzYWdlIGNvdW50IGlzIHRoZSBzYW1lIGZvciBkdXBsaWNhdGVkIG91dHB1dCBhbmQgaGFyZHdhcmUgb3V0cHV0IHdoaWNoIGlzCisgICAgLy8gbmVjZXNzYXJ5IGZvciBhIGNvcnJlY3QgY29udHJvbCBvZiBoYXJkd2FyZSBvdXRwdXQgcm91dGluZyBieSBzdGFydE91dHB1dCgpIGFuZCBzdG9wT3V0cHV0KCkKKyAgICBvdXRwdXREZXNjLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIDEpOworCisgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID09IDEgfHwgZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIC8vIHN0YXJ0aW5nIGFuIG91dHB1dCBiZWluZyByZXJvdXRlZD8KKyAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgZGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICB9CisgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOworICAgICAgICBib29sIHNob3VsZFdhaXQgPSAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmVhY29uTXV0ZUxhdGVuY3kgPiAwKTsKKyAgICAgICAgdWludDMyX3Qgd2FpdE1zID0gYmVhY29uTXV0ZUxhdGVuY3k7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAoZGVzYyAhPSBvdXRwdXREZXNjKSB7CisgICAgICAgICAgICAgICAgLy8gZm9yY2UgYSBkZXZpY2UgY2hhbmdlIGlmIGFueSBvdGhlciBvdXRwdXQgaXMgbWFuYWdlZCBieSB0aGUgc2FtZSBodworICAgICAgICAgICAgICAgIC8vIG1vZHVsZSBhbmQgaGFzIGEgY3VycmVudCBkZXZpY2Ugc2VsZWN0aW9uIHRoYXQgZGlmZmVycyBmcm9tIHNlbGVjdGVkIGRldmljZS4KKyAgICAgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHRoZSBhdWRpbyBIQUwgbXVzdCByZWNlaXZlIHRoZSBuZXcgZGV2aWNlIHNlbGVjdGlvbiBzbyB0aGF0IGl0IGNhbgorICAgICAgICAgICAgICAgIC8vIGNoYW5nZSB0aGUgZGV2aWNlIGN1cnJlbnRseSBzZWxlY3RlZCBieSB0aGUgb3RoZXIgYWN0aXZlIG91dHB1dC4KKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+c2hhcmVzSHdNb2R1bGVXaXRoKGRlc2MpICYmCisgICAgICAgICAgICAgICAgICAgIGRlc2MtPmRldmljZSgpICE9IGRldmljZSkgeworICAgICAgICAgICAgICAgICAgICBmb3JjZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIGF1ZGlvIG9uIG90aGVyIGFjdGl2ZSBvdXRwdXRzIHRvIGJlIHByZXNlbnRlZCB3aGVuIHN0YXJ0aW5nCisgICAgICAgICAgICAgICAgLy8gYSBub3RpZmljYXRpb24gc28gdGhhdCBhdWRpbyBmb2N1cyBlZmZlY3QgY2FuIHByb3BhZ2F0ZSwgb3IgdGhhdCBhIG11dGUvdW5tdXRlCisgICAgICAgICAgICAgICAgLy8gZXZlbnQgb2NjdXJyZWQgZm9yIGJlYWNvbgorICAgICAgICAgICAgICAgIHVpbnQzMl90IGxhdGVuY3kgPSBkZXNjLT5sYXRlbmN5KCk7CisgICAgICAgICAgICAgICAgaWYgKHNob3VsZFdhaXQgJiYgZGVzYy0+aXNBY3RpdmUobGF0ZW5jeSAqIDIpICYmICh3YWl0TXMgPCBsYXRlbmN5KSkgeworICAgICAgICAgICAgICAgICAgICB3YWl0TXMgPSBsYXRlbmN5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCBtdXRlV2FpdE1zID0gc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGRldmljZSwgZm9yY2UpOworCisgICAgICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIHNvbmlmaWNhdGlvbiB3aGlsZSBpbiBjYWxsCisgICAgICAgIGlmIChpc0luQ2FsbCgpKSB7CisgICAgICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oc3RyZWFtLCB0cnVlLCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBhcHBseSB2b2x1bWUgcnVsZXMgZm9yIGN1cnJlbnQgc3RyZWFtIGFuZCBkZXZpY2UgaWYgbmVjZXNzYXJ5CisgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbXMudmFsdWVGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOworCisgICAgICAgIC8vIHVwZGF0ZSB0aGUgb3V0cHV0cyBpZiBzdGFydGluZyBhbiBvdXRwdXQgd2l0aCBhIHN0cmVhbSB0aGF0IGNhbiBhZmZlY3Qgbm90aWZpY2F0aW9uCisgICAgICAgIC8vIHJvdXRpbmcKKyAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uUm91dGluZ0ZvclN0cmVhbShzdHJlYW0pOworCisgICAgICAgIC8vIGZvcmNlIHJlZXZhbHVhdGluZyBhY2Nlc3NpYmlsaXR5IHJvdXRpbmcgd2hlbiByaW5ndG9uZSBvciBhbGFybSBzdGFydHMKKyAgICAgICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgQUxPR1YoInN0b3BPdXRwdXQoKSBvdXRwdXQgJWQsIHN0cmVhbSAlZCwgc2Vzc2lvbiAlZCIsIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInN0b3BPdXRwdXQoKSB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKKworICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA9PSAxKSB7CisgICAgICAgIC8vIEF1dG9tYXRpY2FsbHkgZGlzYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBpbnB1dCB3aGVuIG91dHB1dCBpcyBzdG9wcGVkIG9uIGEKKyAgICAgICAgLy8gcmUgcm91dGluZyBtaXggb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKKyAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKG91dHB1dERlc2MtPm1EZXZpY2UpICYmCisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7CisgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Qb2xpY3lNaXgtPm1SZWdpc3RyYXRpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgInJlbW90ZS1zdWJtaXgiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJvdXRpbmc/CisgICAgYm9vbCBmb3JjZURldmljZVVwZGF0ZSA9IGZhbHNlOworICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA+IDApIHsKKyAgICAgICAgaW50IGFjdGl2aXR5Q291bnQgPSBtT3V0cHV0Um91dGVzLmRlY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7CisgICAgICAgIGZvcmNlRGV2aWNlVXBkYXRlID0gKG1PdXRwdXRSb3V0ZXMuaGFzUm91dGUoc2Vzc2lvbikgJiYgKGFjdGl2aXR5Q291bnQgPT0gMCkpOworCisgICAgICAgIGlmIChmb3JjZURldmljZVVwZGF0ZSkgeworICAgICAgICAgICAgY2hlY2tTdHJhdGVneVJvdXRlKGdldFN0cmF0ZWd5KHN0cmVhbSksIEFVRElPX0lPX0hBTkRMRV9OT05FKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdG9wU291cmNlKG91dHB1dERlc2MsIHN0cmVhbSwgZm9yY2VEZXZpY2VVcGRhdGUpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BTb3VyY2Uoc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZURldmljZVVwZGF0ZSkKK3sKKyAgICAvLyBhbHdheXMgaGFuZGxlIHN0cmVhbSBzdG9wLCBjaGVjayB3aGljaCBzdHJlYW0gdHlwZSBpcyBzdG9wcGluZworICAgIGhhbmRsZUV2ZW50Rm9yQmVhY29uKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVFRTID8gU1RPUFBJTkdfQkVBQ09OIDogU1RPUFBJTkdfT1VUUFVUKTsKKworICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIHNvbmlmaWNhdGlvbiB3aGlsZSBpbiBjYWxsCisgICAgaWYgKGlzSW5DYWxsKCkpIHsKKyAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKHN0cmVhbSwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPiAwKSB7CisgICAgICAgIC8vIGRlY3JlbWVudCB1c2FnZSBjb3VudCBvZiB0aGlzIHN0cmVhbSBvbiB0aGUgb3V0cHV0CisgICAgICAgIG91dHB1dERlc2MtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgLTEpOworCisgICAgICAgIC8vIHN0b3JlIHRpbWUgYXQgd2hpY2ggdGhlIHN0cmVhbSB3YXMgc3RvcHBlZCAtIHNlZSBpc1N0cmVhbUFjdGl2ZSgpCisgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA9PSAwIHx8IGZvcmNlRGV2aWNlVXBkYXRlKSB7CisgICAgICAgICAgICBvdXRwdXREZXNjLT5tU3RvcFRpbWVbc3RyZWFtXSA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICAvLyBkZWxheSB0aGUgZGV2aWNlIHN3aXRjaCBieSB0d2ljZSB0aGUgbGF0ZW5jeSBiZWNhdXNlIHN0b3BPdXRwdXQoKSBpcyBleGVjdXRlZCB3aGVuCisgICAgICAgICAgICAvLyB0aGUgdHJhY2sgc3RvcCgpIGNvbW1hbmQgaXMgcmVjZWl2ZWQgYW5kIGF0IHRoYXQgdGltZSB0aGUgYXVkaW8gdHJhY2sgYnVmZmVyIGNhbgorICAgICAgICAgICAgLy8gc3RpbGwgY29udGFpbiBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgZHJhaW5lZC4gVGhlIGxhdGVuY3kgb25seSBjb3ZlcnMgdGhlIGF1ZGlvIEhBTAorICAgICAgICAgICAgLy8gYW5kIGtlcm5lbCBidWZmZXJzLiBBbHNvIHRoZSBsYXRlbmN5IGRvZXMgbm90IGFsd2F5cyBpbmNsdWRlIGFkZGl0aW9uYWwgZGVsYXkgaW4gdGhlCisgICAgICAgICAgICAvLyBhdWRpbyBwYXRoIChhdWRpbyBEU1AsIENPREVDIC4uLikKKyAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLCBuZXdEZXZpY2UsIGZhbHNlLCBvdXRwdXREZXNjLT5sYXRlbmN5KCkqMik7CisKKyAgICAgICAgICAgIC8vIGZvcmNlIHJlc3RvcmluZyB0aGUgZGV2aWNlIHNlbGVjdGlvbiBvbiBvdGhlciBhY3RpdmUgb3V0cHV0cyBpZiBpdCBkaWZmZXJzIGZyb20gdGhlCisgICAgICAgICAgICAvLyBvbmUgYmVpbmcgc2VsZWN0ZWQgZm9yIHRoaXMgb3V0cHV0CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgY3VyT3V0cHV0ID0gbU91dHB1dHMua2V5QXQoaSk7CisgICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVzYyAhPSBvdXRwdXREZXNjICYmCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5pc0FjdGl2ZSgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5zaGFyZXNId01vZHVsZVdpdGgoZGVzYykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChuZXdEZXZpY2UgIT0gZGVzYy0+ZGV2aWNlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmV3T3V0cHV0RGV2aWNlKGRlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmxhdGVuY3koKSoyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIG91dHB1dHMgaWYgc3RvcHBpbmcgb25lIHdpdGggYSBzdHJlYW0gdGhhdCBjYW4gYWZmZWN0IG5vdGlmaWNhdGlvbiByb3V0aW5nCisgICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25Sb3V0aW5nRm9yU3RyZWFtKHN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJzdG9wT3V0cHV0KCkgcmVmY291bnQgaXMgYWxyZWFkeSAwIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gX191bnVzZWQpCit7CisgICAgQUxPR1YoInJlbGVhc2VPdXRwdXQoKSAlZCIsIG91dHB1dCk7CisgICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJyZWxlYXNlT3V0cHV0KCkgcmVsZWFzaW5nIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCisgICAgaW50IHRlc3RJbmRleCA9IHRlc3RPdXRwdXRJbmRleChvdXRwdXQpOworICAgIGlmICh0ZXN0SW5kZXggIT0gMCkgeworICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzQWN0aXZlKCkpIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgcmVtb3ZlT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICBtVGVzdE91dHB1dHNbdGVzdEluZGV4XSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCisKKyAgICAvLyBSb3V0aW5nCisgICAgbU91dHB1dFJvdXRlcy5yZW1vdmVSb3V0ZShzZXNzaW9uKTsKKworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7CisgICAgaWYgKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgeworICAgICAgICBpZiAoZGVzYy0+bURpcmVjdE9wZW5Db3VudCA8PSAwKSB7CisgICAgICAgICAgICBBTE9HVygicmVsZWFzZU91dHB1dCgpIGludmFsaWQgb3BlbiBjb3VudCAlZCBmb3Igb3V0cHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bURpcmVjdE9wZW5Db3VudCwgb3V0cHV0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoLS1kZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICAvLyBJZiBlZmZlY3RzIHdoZXJlIHByZXNlbnQgb24gdGhlIG91dHB1dCwgYXVkaW9mbGluZ2VyIG1vdmVkIHRoZW0gdG8gdGhlIHByaW1hcnkKKyAgICAgICAgICAgIC8vIG91dHB1dCBieSBkZWZhdWx0OiBtb3ZlIHRoZW0gYmFjayB0byB0aGUgYXBwcm9wcmlhdGUgb3V0cHV0LgorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRWZmZWN0KCk7CisgICAgICAgICAgICBpZiAoaGFzUHJpbWFyeU91dHB1dCgpICYmIGRzdE91dHB1dCAhPSBtUHJpbWFyeU91dHB1dC0+bUlvSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm1vdmVFZmZlY3RzKEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQtPm1Jb0hhbmRsZSwgZHN0T3V0cHV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3R5cGVfdCAqaW5wdXRUeXBlKQoreworICAgIEFMT0dWKCJnZXRJbnB1dEZvckF0dHIoKSBzb3VyY2UgJWQsIHNhbXBsaW5nUmF0ZSAlZCwgZm9ybWF0ICVkLCBjaGFubmVsTWFzayAleCwiCisgICAgICAgICAgICAic2Vzc2lvbiAlZCwgZmxhZ3MgJSN4IiwKKyAgICAgICAgICBhdHRyLT5zb3VyY2UsIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgc2Vzc2lvbiwgZmxhZ3MpOworCisgICAgKmlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9JTlZBTElEOworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2U7CisgICAgLy8gaGFuZGxlIGxlZ2FjeSByZW1vdGUgc3VibWl4IGNhc2Ugd2hlcmUgdGhlIGFkZHJlc3Mgd2FzIG5vdCBhbHdheXMgc3BlY2lmaWVkCisgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOCgiIik7CisgICAgYm9vbCBpc1NvdW5kVHJpZ2dlciA9IGZhbHNlOworICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlID0gYXR0ci0+c291cmNlOworICAgIGF1ZGlvX3NvdXJjZV90IGhhbElucHV0U291cmNlOworICAgIEF1ZGlvTWl4ICpwb2xpY3lNaXggPSBOVUxMOworCisgICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9ERUZBVUxUKSB7CisgICAgICAgIGlucHV0U291cmNlID0gQVVESU9fU09VUkNFX01JQzsKKyAgICB9CisgICAgaGFsSW5wdXRTb3VyY2UgPSBpbnB1dFNvdXJjZTsKKworICAgIC8vIEV4cGxpY2l0IHJvdXRpbmc/CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYzsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdmFpbGFibGVJbnB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPmdldElkKCkgPT0gc2VsZWN0ZWREZXZpY2VJZCkgeworICAgICAgICAgICAgZGV2aWNlRGVzYyA9IG1BdmFpbGFibGVJbnB1dERldmljZXNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBtSW5wdXRSb3V0ZXMuYWRkUm91dGUoc2Vzc2lvbiwgU2Vzc2lvblJvdXRlOjpTVFJFQU1fVFlQRV9OQSwgaW5wdXRTb3VyY2UsIGRldmljZURlc2MsIHVpZCk7CisKKyAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVggJiYKKyAgICAgICAgICAgIHN0cm5jbXAoYXR0ci0+dGFncywgImFkZHI9Iiwgc3RybGVuKCJhZGRyPSIpKSA9PSAwKSB7CisgICAgICAgIHN0YXR1c190IHJldCA9IG1Qb2xpY3lNaXhlcy5nZXRJbnB1dE1peEZvckF0dHIoKmF0dHIsICZwb2xpY3lNaXgpOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTUlYX0VYVF9QT0xJQ1lfUkVST1VURTsKKyAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVg7CisgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KGF0dHItPnRhZ3MgKyBzdHJsZW4oImFkZHI9IikpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGlucHV0U291cmNlLCAmcG9saWN5TWl4KTsKKyAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGNvdWxkIG5vdCBmaW5kIGRldmljZSBmb3Igc291cmNlICVkIiwgaW5wdXRTb3VyY2UpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBpZiAocG9saWN5TWl4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGFkZHJlc3MgPSBwb2xpY3lNaXgtPm1SZWdpc3RyYXRpb25JZDsKKyAgICAgICAgICAgIGlmIChwb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgeworICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIGFuIGV4dGVybmFsIHBvbGljeSwgYnV0IHRoaXMgaW5wdXQgaXMgYXR0YWNoZWQgdG8gYSBtaXggb2YgcmVjb3JkZXJzLAorICAgICAgICAgICAgICAgIC8vIG1lYW5pbmcgaXQgcmVjZWl2ZXMgYXVkaW8gaW5qZWN0ZWQgaW50byB0aGUgZnJhbWV3b3JrLCBzbyB0aGUgcmVjb3JkZXIgZG9lc24ndAorICAgICAgICAgICAgICAgIC8vIGtub3cgYWJvdXQgaXQgYW5kIGlzIHRoZXJlZm9yZSBjb25zaWRlcmVkICJsZWdhY3kiCisgICAgICAgICAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9MRUdBQ1k7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHJlY29yZGluZyBhIG1peCBvZiBwbGF5ZXJzIGRlZmluZWQgYnkgYW4gZXh0ZXJuYWwgcG9saWN5LCB3ZSdyZSByZXJvdXRpbmcgZm9yCisgICAgICAgICAgICAgICAgLy8gYW4gZXh0ZXJuYWwgcG9saWN5CisgICAgICAgICAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9NSVhfRVhUX1BPTElDWV9SRVJPVVRFOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KCIwIik7CisgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX01JWF9DQVBUVVJFOworICAgICAgICB9IGVsc2UgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYKSB7CisgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX1RFTEVQSE9OWV9SWDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTEVHQUNZOworICAgICAgICB9CisgICAgICAgIC8vIGFkYXB0IGNoYW5uZWwgc2VsZWN0aW9uIHRvIGlucHV0IHNvdXJjZQorICAgICAgICBzd2l0Y2ggKGlucHV0U291cmNlKSB7CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSzoKKyAgICAgICAgICAgIGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTks7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTks6CisgICAgICAgICAgICBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfRE5MSU5LOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NBTEw6CisgICAgICAgICAgICBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfVVBMSU5LIHwgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9ETkxJTks7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgeworICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1Tb3VuZFRyaWdnZXJTZXNzaW9ucy5pbmRleE9mS2V5KHNlc3Npb24pOworICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAqaW5wdXQgPSBtU291bmRUcmlnZ2VyU2Vzc2lvbnMudmFsdWVGb3Ioc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgaXNTb3VuZFRyaWdnZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fSU5QVVRfRkxBR19IV19IT1RXT1JEKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiU291bmRUcmlnZ2VyIGNhcHR1cmUgb24gc2Vzc2lvbiAlZCBpbnB1dCAlZCIsIHNlc3Npb24sICppbnB1dCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGhhbElucHV0U291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gZmluZCBhIGNvbXBhdGlibGUgaW5wdXQgcHJvZmlsZSAobm90IG5lY2Vzc2FyaWx5IGlkZW50aWNhbCBpbiBwYXJhbWV0ZXJzKQorICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZTsKKyAgICAvLyBzYW1wbGluZ1JhdGUgYW5kIGZsYWdzIG1heSBiZSB1cGRhdGVkIGJ5IGdldElucHV0UHJvZmlsZQorICAgIHVpbnQzMl90IHByb2ZpbGVTYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7CisgICAgYXVkaW9fZm9ybWF0X3QgcHJvZmlsZUZvcm1hdCA9IGZvcm1hdDsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBwcm9maWxlQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKKyAgICBhdWRpb19pbnB1dF9mbGFnc190IHByb2ZpbGVGbGFncyA9IGZsYWdzOworICAgIGZvciAoOzspIHsKKyAgICAgICAgcHJvZmlsZSA9IGdldElucHV0UHJvZmlsZShkZXZpY2UsIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVNhbXBsaW5nUmF0ZSwgcHJvZmlsZUZvcm1hdCwgcHJvZmlsZUNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVGbGFncyk7CisgICAgICAgIGlmIChwcm9maWxlICE9IDApIHsKKyAgICAgICAgICAgIGJyZWFrOyAvLyBzdWNjZXNzCisgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZUZsYWdzICE9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSkgeworICAgICAgICAgICAgcHJvZmlsZUZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FOyAvLyByZXRyeQorICAgICAgICB9IGVsc2UgeyAvLyBmYWlsCisgICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgY291bGQgbm90IGZpbmQgcHJvZmlsZSBmb3IgZGV2aWNlIDB4JVgsIHNhbXBsaW5nUmF0ZSAldSwiCisgICAgICAgICAgICAgICAgICAgICJmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAweCVYLCBmbGFncyAlI3giLAorICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwcm9maWxlLT5nZXRNb2R1bGVIYW5kbGUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJnZXRJbnB1dEZvckF0dHIoKTogSFcgbW9kdWxlICVzIG5vdCBvcGVuZWQiLCBwcm9maWxlLT5nZXRNb2R1bGVOYW1lKCkpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gcHJvZmlsZVNhbXBsaW5nUmF0ZTsKKyAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gcHJvZmlsZUNoYW5uZWxNYXNrOworICAgIGNvbmZpZy5mb3JtYXQgPSBwcm9maWxlRm9ybWF0OworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5JbnB1dChwcm9maWxlLT5nZXRNb2R1bGVIYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsSW5wdXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlRmxhZ3MpOworCisgICAgLy8gb25seSBhY2NlcHQgaW5wdXQgd2l0aCB0aGUgZXhhY3QgcmVxdWVzdGVkIHNldCBvZiBwYXJhbWV0ZXJzCisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fCAqaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUgfHwKKyAgICAgICAgKHByb2ZpbGVTYW1wbGluZ1JhdGUgIT0gY29uZmlnLnNhbXBsZV9yYXRlKSB8fAorICAgICAgICAocHJvZmlsZUZvcm1hdCAhPSBjb25maWcuZm9ybWF0KSB8fAorICAgICAgICAocHJvZmlsZUNoYW5uZWxNYXNrICE9IGNvbmZpZy5jaGFubmVsX21hc2spKSB7CisgICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckF0dHIoKSBmYWlsZWQgb3BlbmluZyBpbnB1dDogc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJWQsIgorICAgICAgICAgICAgICAgICIgY2hhbm5lbE1hc2sgJXgiLAorICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayk7CisgICAgICAgIGlmICgqaW5wdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KCppbnB1dCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbmV3IEF1ZGlvSW5wdXREZXNjcmlwdG9yKHByb2ZpbGUpOworICAgIGlucHV0RGVzYy0+bUlucHV0U291cmNlID0gaW5wdXRTb3VyY2U7CisgICAgaW5wdXREZXNjLT5tUmVmQ291bnQgPSAwOworICAgIGlucHV0RGVzYy0+bU9wZW5SZWZDb3VudCA9IDE7CisgICAgaW5wdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gcHJvZmlsZVNhbXBsaW5nUmF0ZTsKKyAgICBpbnB1dERlc2MtPm1Gb3JtYXQgPSBwcm9maWxlRm9ybWF0OworICAgIGlucHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gcHJvZmlsZUNoYW5uZWxNYXNrOworICAgIGlucHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKKyAgICBpbnB1dERlc2MtPm1TZXNzaW9ucy5hZGQoc2Vzc2lvbik7CisgICAgaW5wdXREZXNjLT5tSXNTb3VuZFRyaWdnZXIgPSBpc1NvdW5kVHJpZ2dlcjsKKyAgICBpbnB1dERlc2MtPm1Qb2xpY3lNaXggPSBwb2xpY3lNaXg7CisKKyAgICBBTE9HVigiZ2V0SW5wdXRGb3JBdHRyKCkgcmV0dXJucyBpbnB1dCB0eXBlID0gJWQiLCAqaW5wdXRUeXBlKTsKKworICAgIGFkZElucHV0KCppbnB1dCwgaW5wdXREZXNjKTsKKyAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICBBTE9HVigic3RhcnRJbnB1dCgpIGlucHV0ICVkIiwgaW5wdXQpOworICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoKSB1bmtub3duIGlucHV0ICVkIiwgaW5wdXQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKKworICAgIGluZGV4ID0gaW5wdXREZXNjLT5tU2Vzc2lvbnMuaW5kZXhPZihzZXNzaW9uKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJzdGFydElucHV0KCkgdW5rbm93biBzZXNzaW9uICVkIG9uIGlucHV0ICVkIiwgc2Vzc2lvbiwgaW5wdXQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIHZpcnR1YWwgaW5wdXQgZGV2aWNlcyBhcmUgY29tcGF0aWJsZSB3aXRoIG90aGVyIGlucHV0IGRldmljZXMKKyAgICBpZiAoIWlzX3ZpcnR1YWxfaW5wdXRfZGV2aWNlKGlucHV0RGVzYy0+bURldmljZSkpIHsKKworICAgICAgICAvLyBmb3IgYSBub24tdmlydHVhbCBpbnB1dCBkZXZpY2UsIGNoZWNrIGlmIHRoZXJlIGlzIGFub3RoZXIgKG5vbi12aXJ0dWFsKSBhY3RpdmUgaW5wdXQKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYWN0aXZlSW5wdXQgPSBtSW5wdXRzLmdldEFjdGl2ZUlucHV0KCk7CisgICAgICAgIGlmIChhY3RpdmVJbnB1dCAhPSAwICYmIGFjdGl2ZUlucHV0ICE9IGlucHV0KSB7CisKKyAgICAgICAgICAgIC8vIElmIHRoZSBhbHJlYWR5IGFjdGl2ZSBpbnB1dCB1c2VzIEFVRElPX1NPVVJDRV9IT1RXT1JEIHRoZW4gaXQgaXMgY2xvc2VkLAorICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHRoZSBhY3RpdmUgaW5wdXQgY29udGludWVzIGFuZCB0aGUgbmV3IGlucHV0IGNhbm5vdCBiZSBzdGFydGVkLgorICAgICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGFjdGl2ZURlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKGFjdGl2ZUlucHV0KTsKKyAgICAgICAgICAgIGlmIChhY3RpdmVEZXNjLT5tSW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygic3RhcnRJbnB1dCglZCkgcHJlZW1wdGluZyBsb3ctcHJpb3JpdHkgaW5wdXQgJWQiLCBpbnB1dCwgYWN0aXZlSW5wdXQpOworICAgICAgICAgICAgICAgIHN0b3BJbnB1dChhY3RpdmVJbnB1dCwgYWN0aXZlRGVzYy0+bVNlc3Npb25zLml0ZW1BdCgwKSk7CisgICAgICAgICAgICAgICAgcmVsZWFzZUlucHV0KGFjdGl2ZUlucHV0LCBhY3RpdmVEZXNjLT5tU2Vzc2lvbnMuaXRlbUF0KDApKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoInN0YXJ0SW5wdXQoJWQpIGZhaWxlZDogb3RoZXIgaW5wdXQgJWQgYWxyZWFkeSBzdGFydGVkIiwgaW5wdXQsIGFjdGl2ZUlucHV0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSb3V0aW5nPworICAgIG1JbnB1dFJvdXRlcy5pbmNSb3V0ZUFjdGl2aXR5KHNlc3Npb24pOworCisgICAgaWYgKGlucHV0RGVzYy0+bVJlZkNvdW50ID09IDAgfHwgbUlucHV0Um91dGVzLmhhc1JvdXRlQ2hhbmdlZChzZXNzaW9uKSkgeworICAgICAgICAvLyBpZiBpbnB1dCBtYXBzIHRvIGEgZHluYW1pYyBwb2xpY3kgd2l0aCBhbiBhY3Rpdml0eSBsaXN0ZW5lciwgbm90aWZ5IG9mIHN0YXRlIGNoYW5nZQorICAgICAgICBpZiAoKGlucHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKQorICAgICAgICAgICAgICAgICYmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tUmVnaXN0cmF0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9NSVhJTkcpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1JbnB1dHMuYWN0aXZlSW5wdXRzQ291bnQoKSA9PSAwKSB7CisgICAgICAgICAgICBTb3VuZFRyaWdnZXI6OnNldENhcHR1cmVTdGF0ZSh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dCwgZ2V0TmV3SW5wdXREZXZpY2UoaW5wdXQpLCB0cnVlIC8qIGZvcmNlICovKTsKKworICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGVuYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBvdXRwdXQgd2hlbiBpbnB1dCBpcyBzdGFydGVkIGlmIG5vdAorICAgICAgICAvLyB1c2VkIGJ5IGEgcG9saWN5IG1peCBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUworICAgICAgICAvLyBGb3IgcmVtb3RlIHN1Ym1peCAoYSB2aXJ0dWFsIGRldmljZSksIHdlIG9wZW4gb25seSBvbmUgaW5wdXQgcGVyIGNhcHR1cmUgcmVxdWVzdC4KKyAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGlucHV0RGVzYy0+bURldmljZSkpIHsKKyAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IFN0cmluZzgoIiIpOworICAgICAgICAgICAgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7CisgICAgICAgICAgICAgICAgYWRkcmVzcyA9IGlucHV0RGVzYy0+bVBvbGljeU1peC0+bVJlZ2lzdHJhdGlvbklkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFkZHJlc3MgIT0gIiIpIHsKKyAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAorICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCAicmVtb3RlLXN1Ym1peCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoIkF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRJbnB1dCgpIGlucHV0IHNvdXJjZSA9ICVkIiwgaW5wdXREZXNjLT5tSW5wdXRTb3VyY2UpOworCisgICAgaW5wdXREZXNjLT5tUmVmQ291bnQrKzsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgQUxPR1YoInN0b3BJbnB1dCgpIGlucHV0ICVkIiwgaW5wdXQpOworICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInN0b3BJbnB1dCgpIHVua25vd24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOworCisgICAgaW5kZXggPSBpbnB1dERlc2MtPm1TZXNzaW9ucy5pbmRleE9mKHNlc3Npb24pOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInN0b3BJbnB1dCgpIHVua25vd24gc2Vzc2lvbiAlZCBvbiBpbnB1dCAlZCIsIHNlc3Npb24sIGlucHV0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoaW5wdXREZXNjLT5tUmVmQ291bnQgPT0gMCkgeworICAgICAgICBBTE9HVygic3RvcElucHV0KCkgaW5wdXQgJWQgYWxyZWFkeSBzdG9wcGVkIiwgaW5wdXQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaW5wdXREZXNjLT5tUmVmQ291bnQtLTsKKworICAgIC8vIFJvdXRpbmc/CisgICAgbUlucHV0Um91dGVzLmRlY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7CisKKyAgICBpZiAoaW5wdXREZXNjLT5tUmVmQ291bnQgPT0gMCkgeworICAgICAgICAvLyBpZiBpbnB1dCBtYXBzIHRvIGEgZHluYW1pYyBwb2xpY3kgd2l0aCBhbiBhY3Rpdml0eSBsaXN0ZW5lciwgbm90aWZ5IG9mIHN0YXRlIGNoYW5nZQorICAgICAgICBpZiAoKGlucHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKQorICAgICAgICAgICAgICAgICYmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tUmVnaXN0cmF0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9JRExFKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgZGlzYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBvdXRwdXQgd2hlbiBpbnB1dCBpcyBzdG9wcGVkIGlmIG5vdAorICAgICAgICAvLyB1c2VkIGJ5IGEgcG9saWN5IG1peCBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUworICAgICAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoaW5wdXREZXNjLT5tRGV2aWNlKSkgeworICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOCgiIik7CisgICAgICAgICAgICBpZiAoaW5wdXREZXNjLT5tUG9saWN5TWl4ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gU3RyaW5nOCgiMCIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tUmVnaXN0cmF0aW9uSWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWRkcmVzcyAhPSAiIikgeworICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsICJyZW1vdGUtc3VibWl4Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXNldElucHV0RGV2aWNlKGlucHV0KTsKKworICAgICAgICBpZiAobUlucHV0cy5hY3RpdmVJbnB1dHNDb3VudCgpID09IDApIHsKKyAgICAgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSAlZCIsIGlucHV0KTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJyZWxlYXNlSW5wdXQoKSByZWxlYXNpbmcgdW5rbm93biBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFJvdXRpbmcKKyAgICBtSW5wdXRSb3V0ZXMucmVtb3ZlUm91dGUoc2Vzc2lvbik7CisKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKKyAgICBBTE9HX0FTU0VSVChpbnB1dERlc2MgIT0gMCk7CisKKyAgICBpbmRleCA9IGlucHV0RGVzYy0+bVNlc3Npb25zLmluZGV4T2Yoc2Vzc2lvbik7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygicmVsZWFzZUlucHV0KCkgdW5rbm93biBzZXNzaW9uICVkIG9uIGlucHV0ICVkIiwgc2Vzc2lvbiwgaW5wdXQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlucHV0RGVzYy0+bVNlc3Npb25zLnJlbW92ZShzZXNzaW9uKTsKKyAgICBpZiAoaW5wdXREZXNjLT5tT3BlblJlZkNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR1coInJlbGVhc2VJbnB1dCgpIGludmFsaWQgb3BlbiByZWYgY291bnQgJWQiLCBpbnB1dERlc2MtPm1PcGVuUmVmQ291bnQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlucHV0RGVzYy0+bU9wZW5SZWZDb3VudC0tOworICAgIGlmIChpbnB1dERlc2MtPm1PcGVuUmVmQ291bnQgPiAwKSB7CisgICAgICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSBleGl0ID4gMCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY2xvc2VJbnB1dChpbnB1dCk7CisgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSBleGl0Iik7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbG9zZUFsbElucHV0cygpIHsKKyAgICBib29sIHBhdGNoUmVtb3ZlZCA9IGZhbHNlOworCisgICAgZm9yKHNpemVfdCBpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKKyAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbnB1dF9pbmRleCk7CisgICAgICAgIHNzaXplX3QgcGF0Y2hfaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgICAgICBpZiAocGF0Y2hfaW5kZXggPj0gMCkgeworICAgICAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KHBhdGNoX2luZGV4KTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgICAgIG1BdWRpb1BhdGNoZXMucmVtb3ZlSXRlbXNBdChwYXRjaF9pbmRleCk7CisgICAgICAgICAgICBwYXRjaFJlbW92ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKKyAgICB9CisgICAgbUlucHV0cy5jbGVhcigpOworICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisKKyAgICBpZiAocGF0Y2hSZW1vdmVkKSB7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpCit7CisgICAgQUxPR1YoImluaXRTdHJlYW1Wb2x1bWUoKSBzdHJlYW0gJWQsIG1pbiAlZCwgbWF4ICVkIiwgc3RyZWFtICwgaW5kZXhNaW4sIGluZGV4TWF4KTsKKyAgICBtRW5naW5lLT5pbml0U3RyZWFtVm9sdW1lKHN0cmVhbSwgaW5kZXhNaW4sIGluZGV4TWF4KTsKKyAgICAvL0ZJWE1FOiBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSB2b2x1bWUgZm9sbG93cyBBVURJT19TVFJFQU1fTVVTSUMgZm9yIG5vdworICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX01VU0lDKSB7CisgICAgICAgIG1FbmdpbmUtPmluaXRTdHJlYW1Wb2x1bWUoQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFksIGluZGV4TWluLCBpbmRleE1heCk7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisKKyAgICBpZiAoKGluZGV4IDwgbVN0cmVhbXMudmFsdWVGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleE1pbigpKSB8fAorICAgICAgICAgICAgKGluZGV4ID4gbVN0cmVhbXMudmFsdWVGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleE1heCgpKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEZvcmNlIG1heCB2b2x1bWUgaWYgc3RyZWFtIGNhbm5vdCBiZSBtdXRlZAorICAgIGlmICghbVN0cmVhbXMuY2FuQmVNdXRlZChzdHJlYW0pKSBpbmRleCA9IG1TdHJlYW1zLnZhbHVlRm9yKHN0cmVhbSkuZ2V0Vm9sdW1lSW5kZXhNYXgoKTsKKworICAgIEFMT0dWKCJzZXRTdHJlYW1Wb2x1bWVJbmRleCgpIHN0cmVhbSAlZCwgZGV2aWNlICUwNHgsIGluZGV4ICVkIiwKKyAgICAgICAgICBzdHJlYW0sIGRldmljZSwgaW5kZXgpOworCisgICAgLy8gaWYgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCBzZXQgZGVmYXVsdCB2YWx1ZSBhbmQKKyAgICAvLyBjbGVhciBhbGwgZGV2aWNlIHNwZWNpZmljIHZhbHVlcworICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUKSB7CisgICAgICAgIG1TdHJlYW1zLmNsZWFyQ3VycmVudFZvbHVtZUluZGV4KHN0cmVhbSk7CisgICAgfQorICAgIG1TdHJlYW1zLmFkZEN1cnJlbnRWb2x1bWVJbmRleChzdHJlYW0sIGRldmljZSwgaW5kZXgpOworCisgICAgLy8gdXBkYXRlIHZvbHVtZSBvbiBhbGwgb3V0cHV0cyB3aG9zZSBjdXJyZW50IGRldmljZSBpcyBhbHNvIHNlbGVjdGVkIGJ5IHRoZSBzYW1lCisgICAgLy8gc3RyYXRlZ3kgYXMgdGhlIGRldmljZSBzcGVjaWZpZWQgYnkgdGhlIGNhbGxlcgorICAgIGF1ZGlvX2RldmljZXNfdCBzdHJhdGVneURldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KGdldFN0cmF0ZWd5KHN0cmVhbSksIHRydWUgLypmcm9tQ2FjaGUqLyk7CisKKworICAgIC8vRklYTUU6IEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZIHZvbHVtZSBmb2xsb3dzIEFVRElPX1NUUkVBTV9NVVNJQyBmb3Igbm93CisgICAgYXVkaW9fZGV2aWNlc190IGFjY2Vzc2liaWxpdHlEZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9NVVNJQykgeworICAgICAgICBtU3RyZWFtcy5hZGRDdXJyZW50Vm9sdW1lSW5kZXgoQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFksIGRldmljZSwgaW5kZXgpOworICAgICAgICBhY2Nlc3NpYmlsaXR5RGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfQUNDRVNTSUJJTElUWSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICB9CisgICAgaWYgKChkZXZpY2UgIT0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUKSAmJgorICAgICAgICAgICAgKGRldmljZSAmIChzdHJhdGVneURldmljZSB8IGFjY2Vzc2liaWxpdHlEZXZpY2UpKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJEZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShkZXNjLT5kZXZpY2UoKSk7CisgICAgICAgIGlmICgoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCkgfHwgKChjdXJEZXZpY2UgJiBzdHJhdGVneURldmljZSkgIT0gMCkpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHZvbFN0YXR1cyA9IGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwgaW5kZXgsIGRlc2MsIGN1ckRldmljZSk7CisgICAgICAgICAgICBpZiAodm9sU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdm9sU3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCkgfHwgKChjdXJEZXZpY2UgJiBhY2Nlc3NpYmlsaXR5RGV2aWNlKSAhPSAwKSkgeworICAgICAgICAgICAgc3RhdHVzX3Qgdm9sU3RhdHVzID0gY2hlY2tBbmRTZXRWb2x1bWUoQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwgZGVzYywgY3VyRGV2aWNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgaWYgKGluZGV4ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgLy8gaWYgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCwgcmV0dXJuIHZvbHVtZSBmb3IgZGV2aWNlIGNvcnJlc3BvbmRpbmcgdG8KKyAgICAvLyB0aGUgc3RyYXRlZ3kgdGhlIHN0cmVhbSBiZWxvbmdzIHRvLgorICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KGdldFN0cmF0ZWd5KHN0cmVhbSksIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgfQorICAgIGRldmljZSA9IFZvbHVtZTo6Z2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSk7CisKKyAgICAqaW5kZXggPSAgbVN0cmVhbXMudmFsdWVGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleChkZXZpY2UpOworICAgIEFMT0dWKCJnZXRTdHJlYW1Wb2x1bWVJbmRleCgpIHN0cmVhbSAlZCBkZXZpY2UgJTA4eCBpbmRleCAlZCIsIHN0cmVhbSwgZGV2aWNlLCAqaW5kZXgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZWxlY3RPdXRwdXRGb3JFZmZlY3RzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzKQoreworICAgIC8vIHNlbGVjdCBvbmUgb3V0cHV0IGFtb25nIHNldmVyYWwgc3VpdGFibGUgZm9yIGdsb2JhbCBlZmZlY3RzLgorICAgIC8vIFRoZSBwcmlvcml0eSBpcyBhcyBmb2xsb3dzOgorICAgIC8vIDE6IEFuIG9mZmxvYWRlZCBvdXRwdXQuIElmIHRoZSBlZmZlY3QgZW5kcyB1cCBub3QgYmVpbmcgb2ZmbG9hZGFibGUsCisgICAgLy8gICAgQXVkaW9GbGluZ2VyIHdpbGwgaW52YWxpZGF0ZSB0aGUgdHJhY2sgYW5kIHRoZSBvZmZsb2FkZWQgb3V0cHV0CisgICAgLy8gICAgd2lsbCBiZSBjbG9zZWQgY2F1c2luZyB0aGUgZWZmZWN0IHRvIGJlIG1vdmVkIHRvIGEgUENNIG91dHB1dC4KKyAgICAvLyAyOiBBIGRlZXAgYnVmZmVyIG91dHB1dAorICAgIC8vIDM6IHRoZSBmaXJzdCBvdXRwdXQgaW4gdGhlIGxpc3QKKworICAgIGlmIChvdXRwdXRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dE9mZmxvYWRlZCA9IDA7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0RGVlcEJ1ZmZlciA9IDA7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXRzW2ldKTsKKyAgICAgICAgQUxPR1YoInNlbGVjdE91dHB1dEZvckVmZmVjdHMgb3V0cHV0c1slenVdIGZsYWdzICV4IiwgaSwgZGVzYy0+bUZsYWdzKTsKKyAgICAgICAgaWYgKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSB7CisgICAgICAgICAgICBvdXRwdXRPZmZsb2FkZWQgPSBvdXRwdXRzW2ldOworICAgICAgICB9CisgICAgICAgIGlmICgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVIpICE9IDApIHsKKyAgICAgICAgICAgIG91dHB1dERlZXBCdWZmZXIgPSBvdXRwdXRzW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoInNlbGVjdE91dHB1dEZvckVmZmVjdHMgb3V0cHV0T2ZmbG9hZGVkICVkIG91dHB1dERlZXBCdWZmZXIgJWQiLAorICAgICAgICAgIG91dHB1dE9mZmxvYWRlZCwgb3V0cHV0RGVlcEJ1ZmZlcik7CisgICAgaWYgKG91dHB1dE9mZmxvYWRlZCAhPSAwKSB7CisgICAgICAgIHJldHVybiBvdXRwdXRPZmZsb2FkZWQ7CisgICAgfQorICAgIGlmIChvdXRwdXREZWVwQnVmZmVyICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dERlZXBCdWZmZXI7CisgICAgfQorCisgICAgcmV0dXJuIG91dHB1dHNbMF07Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpCit7CisgICAgLy8gYXBwbHkgc2ltcGxlIHJ1bGUgd2hlcmUgZ2xvYmFsIGVmZmVjdHMgYXJlIGF0dGFjaGVkIHRvIHRoZSBzYW1lIG91dHB1dCBhcyBNVVNJQyBzdHJlYW1zCisKKyAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koQVVESU9fU1RSRUFNX01VU0lDKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gZHN0T3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UoZGV2aWNlLCBtT3V0cHV0cyk7CisKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXRGb3JFZmZlY3RzKGRzdE91dHB1dHMpOworICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JFZmZlY3QoKSBnb3Qgb3V0cHV0ICVkIGZvciBmeCAlcyBmbGFncyAleCIsCisgICAgICAgICAgb3V0cHV0LCAoZGVzYyA9PSBOVUxMKSA/ICJ1bnNwZWNpZmllZCIgOiBkZXNjLT5uYW1lLCAgKGRlc2MgPT0gTlVMTCkgPyAwIDogZGVzYy0+ZmxhZ3MpOworCisgICAgcmV0dXJuIG91dHB1dDsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWdpc3RlckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpCit7CisgICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkoaW8pOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW8pOworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICBBTE9HVygicmVnaXN0ZXJFZmZlY3QoKSB1bmtub3duIGlvICVkIiwgaW8pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtRWZmZWN0cy5yZWdpc3RlckVmZmVjdChkZXNjLCBpbywgc3RyYXRlZ3ksIHNlc3Npb24sIGlkKTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK3sKKyAgICByZXR1cm4gbU91dHB1dHMuaXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcyk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK3sKKyAgICByZXR1cm4gbU91dHB1dHMuaXNTdHJlYW1BY3RpdmVSZW1vdGVseShzdHJlYW0sIGluUGFzdE1zKTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ICBpbnB1dERlc2NyaXB0b3IgPSBtSW5wdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChpbnB1dERlc2NyaXB0b3ItPm1SZWZDb3VudCA9PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXREZXNjcmlwdG9yLT5tSW5wdXRTb3VyY2UgPT0gKGludClzb3VyY2UpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIC8vIEFVRElPX1NPVVJDRV9IT1RXT1JEIGlzIGVxdWl2YWxlbnQgdG8gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIG9ubHkgaWYgaXQKKyAgICAgICAgLy8gY29ycmVzcG9uZHMgdG8gYW4gYWN0aXZlIGNhcHR1cmUgdHJpZ2dlcmVkIGJ5IGEgaGFyZHdhcmUgaG90d29yZCByZWNvZ25pdGlvbgorICAgICAgICBpZiAoKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pICYmCisgICAgICAgICAgICAgICAgIChpbnB1dERlc2NyaXB0b3ItPm1JbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkpIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiB3ZSBzaG91bGQgbm90IGFzc3VtZSB0aGF0IHRoZSBmaXJzdCBzZXNzaW9uIGlzIHRoZSBhY3RpdmUgb25lIGFuZCBrZWVwCisgICAgICAgICAgICAvLyBhY3Rpdml0eSBjb3VudCBwZXIgc2Vzc2lvbi4gU2FtZSBpbiBzdGFydElucHV0KCkuCisgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbVNvdW5kVHJpZ2dlclNlc3Npb25zLmluZGV4T2ZLZXkoaW5wdXREZXNjcmlwdG9yLT5tU2Vzc2lvbnMuaXRlbUF0KDApKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBSZWdpc3RlciBhIGxpc3Qgb2YgY3VzdG9tIG1peGVzIHdpdGggdGhlaXIgYXR0cmlidXRlcyBhbmQgZm9ybWF0LgorLy8gV2hlbiBhIG1peCBpcyByZWdpc3RlcmVkLCBjb3JyZXNwb25kaW5nIGlucHV0IGFuZCBvdXRwdXQgcHJvZmlsZXMgYXJlCisvLyBhZGRlZCB0byB0aGUgcmVtb3RlIHN1Ym1peCBodyBtb2R1bGUuIFRoZSBwcm9maWxlIGNvbnRhaW5zIG9ubHkgdGhlCisvLyBwYXJhbWV0ZXJzIChzYW1wbGluZyByYXRlLCBmb3JtYXQuLi4pIHNwZWNpZmllZCBieSB0aGUgbWl4LgorLy8gVGhlIGNvcnJlc3BvbmRpbmcgaW5wdXQgcmVtb3RlIHN1Ym1peCBkZXZpY2UgaXMgYWxzbyBjb25uZWN0ZWQuCisvLworLy8gV2hlbiBhIHJlbW90ZSBzdWJtaXggZGV2aWNlIGlzIGNvbm5lY3RlZCwgdGhlIGFkZHJlc3MgaXMgY2hlY2tlZCB0byBzZWxlY3QgdGhlCisvLyBhcHByb3ByaWF0ZSBwcm9maWxlIGFuZCB0aGUgY29ycmVzcG9uZGluZyBpbnB1dCBvciBvdXRwdXQgc3RyZWFtIGlzIG9wZW5lZC4KKy8vCisvLyBXaGVuIGNhcHR1cmUgc3RhcnRzLCBnZXRJbnB1dEZvckF0dHIoKSB3aWxsOgorLy8gIC0gMSBsb29rIGZvciBhIG1peCBtYXRjaGluZyB0aGUgYWRkcmVzcyBwYXNzZWQgaW4gYXR0cmlidHV0ZXMgdGFncyBpZiBhbnkKKy8vICAtIDIgaWYgbm9uZSBmb3VuZCwgZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoKSB3aWxsOgorLy8gICAgIC0gMi4xIGxvb2sgZm9yIGEgbWl4IG1hdGNoaW5nIHRoZSBhdHRyaWJ1dGVzIHNvdXJjZQorLy8gICAgIC0gMi4yIGlmIG5vbmUgZm91bmQsIGRlZmF1bHQgdG8gZGV2aWNlIHNlbGVjdGlvbiBieSBwb2xpY3kgcnVsZXMKKy8vIEF0IHRoaXMgdGltZSwgdGhlIGNvcnJlc3BvbmRpbmcgb3V0cHV0IHJlbW90ZSBzdWJtaXggZGV2aWNlIGlzIGFsc28gY29ubmVjdGVkCisvLyBhbmQgYWN0aXZlIHBsYXliYWNrIHVzZSBjYXNlcyBjYW4gYmUgdHJhbnNmZXJyZWQgdG8gdGhpcyBtaXggaWYgbmVlZGVkIHdoZW4gcmVjb25uZWN0aW5nCisvLyBhZnRlciBBdWRpb1RyYWNrcyBhcmUgaW52YWxpZGF0ZWQKKy8vCisvLyBXaGVuIHBsYXliYWNrIHN0YXJ0cywgZ2V0T3V0cHV0Rm9yQXR0cigpIHdpbGw6CisvLyAgLSAxIGxvb2sgZm9yIGEgbWl4IG1hdGNoaW5nIHRoZSBhZGRyZXNzIHBhc3NlZCBpbiBhdHRyaWJ0dXRlcyB0YWdzIGlmIGFueQorLy8gIC0gMiBpZiBub25lIGZvdW5kLCBsb29rIGZvciBhIG1peCBtYXRjaGluZyB0aGUgYXR0cmlidXRlcyB1c2FnZQorLy8gIC0gMyBpZiBub25lIGZvdW5kLCBkZWZhdWx0IHRvIGRldmljZSBhbmQgb3V0cHV0IHNlbGVjdGlvbiBieSBwb2xpY3kgcnVsZXMuCisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVnaXN0ZXJQb2xpY3lNaXhlcyhWZWN0b3I8QXVkaW9NaXg+IG1peGVzKQoreworICAgIHNwPEh3TW9kdWxlPiBtb2R1bGU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1JFTU9URV9TVUJNSVgsIG1Id01vZHVsZXNbaV0tPm1OYW1lKSA9PSAwICYmCisgICAgICAgICAgICAgICAgbUh3TW9kdWxlc1tpXS0+bUhhbmRsZSAhPSAwKSB7CisgICAgICAgICAgICBtb2R1bGUgPSBtSHdNb2R1bGVzW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobW9kdWxlID09IDApIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIEFMT0dWKCJyZWdpc3RlclBvbGljeU1peGVzKCkgbnVtIG1peGVzICVkIiwgbWl4ZXMuc2l6ZSgpKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWl4ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gbWl4ZXNbaV0ubVJlZ2lzdHJhdGlvbklkOworCisgICAgICAgIGlmIChtUG9saWN5TWl4ZXMucmVnaXN0ZXJNaXgoYWRkcmVzcywgbWl4ZXNbaV0pICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBhdWRpb19jb25maWdfdCBvdXRwdXRDb25maWcgPSBtaXhlc1tpXS5tRm9ybWF0OworICAgICAgICBhdWRpb19jb25maWdfdCBpbnB1dENvbmZpZyA9IG1peGVzW2ldLm1Gb3JtYXQ7CisgICAgICAgIC8vIE5PVEU6IGF1ZGlvIGZsaW5nZXIgbWl4ZXIgZG9lcyBub3Qgc3VwcG9ydCBtb25vIG91dHB1dDogY29uZmlndXJlIHJlbW90ZSBzdWJtaXggSEFMIGluCisgICAgICAgIC8vIHN0ZXJlbyBhbmQgbGV0IGF1ZGlvIGZsaW5nZXIgZG8gdGhlIGNoYW5uZWwgY29udmVyc2lvbiBpZiBuZWVkZWQuCisgICAgICAgIG91dHB1dENvbmZpZy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgICAgIGlucHV0Q29uZmlnLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPOworICAgICAgICBtb2R1bGUtPmFkZE91dHB1dFByb2ZpbGUoYWRkcmVzcywgJm91dHB1dENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwgYWRkcmVzcyk7CisgICAgICAgIG1vZHVsZS0+YWRkSW5wdXRQcm9maWxlKGFkZHJlc3MsICZpbnB1dENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLCBhZGRyZXNzKTsKKworICAgICAgICBpZiAobWl4ZXNbaV0ubU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCksICJyZW1vdGUtc3VibWl4Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCksICJyZW1vdGUtc3VibWl4Iik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnVucmVnaXN0ZXJQb2xpY3lNaXhlcyhWZWN0b3I8QXVkaW9NaXg+IG1peGVzKQoreworICAgIHNwPEh3TW9kdWxlPiBtb2R1bGU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1JFTU9URV9TVUJNSVgsIG1Id01vZHVsZXNbaV0tPm1OYW1lKSA9PSAwICYmCisgICAgICAgICAgICAgICAgbUh3TW9kdWxlc1tpXS0+bUhhbmRsZSAhPSAwKSB7CisgICAgICAgICAgICBtb2R1bGUgPSBtSHdNb2R1bGVzW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobW9kdWxlID09IDApIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIEFMT0dWKCJ1bnJlZ2lzdGVyUG9saWN5TWl4ZXMoKSBudW0gbWl4ZXMgJWQiLCBtaXhlcy5zaXplKCkpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtaXhlcy5zaXplKCk7IGkrKykgeworICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBtaXhlc1tpXS5tUmVnaXN0cmF0aW9uSWQ7CisKKyAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy51bnJlZ2lzdGVyTWl4KGFkZHJlc3MpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsIGFkZHJlc3Muc3RyaW5nKCkpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSkKKyAgICAgICAgeworICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSwgInJlbW90ZS1zdWJtaXgiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLCBhZGRyZXNzLnN0cmluZygpKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpLCAicmVtb3RlLXN1Ym1peCIpOworICAgICAgICB9CisgICAgICAgIG1vZHVsZS0+cmVtb3ZlT3V0cHV0UHJvZmlsZShhZGRyZXNzKTsKKyAgICAgICAgbW9kdWxlLT5yZW1vdmVJbnB1dFByb2ZpbGUoYWRkcmVzcyk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5BdWRpb1BvbGljeU1hbmFnZXIgRHVtcDogJXBcbiIsIHRoaXMpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBQcmltYXJ5IE91dHB1dDogJWRcbiIsCisgICAgICAgICAgICAgaGFzUHJpbWFyeU91dHB1dCgpID8gbVByaW1hcnlPdXRwdXQtPm1Jb0hhbmRsZSA6IEFVRElPX0lPX0hBTkRMRV9OT05FKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFBob25lIHN0YXRlOiAlZFxuIiwgbUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgY29tbXVuaWNhdGlvbnMgJWRcbiIsCisgICAgICAgICAgICAgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OKSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIG1lZGlhICVkXG4iLCBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBKSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIHJlY29yZCAlZFxuIiwgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkQpKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgZG9jayAlZFxuIiwgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9ET0NLKSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIHN5c3RlbSAlZFxuIiwgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgaGRtaSBzeXN0ZW0gYXVkaW8gJWRcbiIsCisgICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0hETUlfU1lTVEVNX0FVRElPKSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworCisgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZHVtcChmZCwgU3RyaW5nOCgib3V0cHV0IikpOworICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZHVtcChmZCwgU3RyaW5nOCgiaW5wdXQiKSk7CisgICAgbUh3TW9kdWxlcy5kdW1wKGZkKTsKKyAgICBtT3V0cHV0cy5kdW1wKGZkKTsKKyAgICBtSW5wdXRzLmR1bXAoZmQpOworICAgIG1TdHJlYW1zLmR1bXAoZmQpOworICAgIG1FZmZlY3RzLmR1bXAoZmQpOworICAgIG1BdWRpb1BhdGNoZXMuZHVtcChmZCk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGZvciB0aGUgcGFyYW1ldGVycyB3aGljaCBjYW4gYmUgb2ZmbG9hZGVkLgorLy8gVGhpcyBjYW4gYmUgZW5oYW5jZWQgZGVwZW5kaW5nIG9uIHRoZSBjYXBhYmlsaXR5IG9mIHRoZSBEU1AgYW5kIHBvbGljeQorLy8gb2YgdGhlIHN5c3RlbS4KK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIG9mZmxvYWRJbmZvKQoreworICAgIEFMT0dWKCJpc09mZmxvYWRTdXBwb3J0ZWQ6IFNSPSV1LCBDTT0weCV4LCBGb3JtYXQ9MHgleCwgU3RyZWFtVHlwZT0lZCwiCisgICAgICIgQml0UmF0ZT0ldSwgZHVyYXRpb249JSIgUFJJZDY0ICIgdXMsIGhhc192aWRlbz0lZCIsCisgICAgIG9mZmxvYWRJbmZvLnNhbXBsZV9yYXRlLCBvZmZsb2FkSW5mby5jaGFubmVsX21hc2ssCisgICAgIG9mZmxvYWRJbmZvLmZvcm1hdCwKKyAgICAgb2ZmbG9hZEluZm8uc3RyZWFtX3R5cGUsIG9mZmxvYWRJbmZvLmJpdF9yYXRlLCBvZmZsb2FkSW5mby5kdXJhdGlvbl91cywKKyAgICAgb2ZmbG9hZEluZm8uaGFzX3ZpZGVvKTsKKworICAgIC8vIENoZWNrIGlmIG9mZmxvYWQgaGFzIGJlZW4gZGlzYWJsZWQKKyAgICBjaGFyIHByb3BWYWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoImF1ZGlvLm9mZmxvYWQuZGlzYWJsZSIsIHByb3BWYWx1ZSwgIjAiKSkgeworICAgICAgICBpZiAoYXRvaShwcm9wVmFsdWUpICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJvZmZsb2FkIGRpc2FibGVkIGJ5IGF1ZGlvLm9mZmxvYWQuZGlzYWJsZT0lcyIsIHByb3BWYWx1ZSApOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIHR5cGUgaXMgbXVzaWMsIHRoZW4gb25seSBhbGxvdyBvZmZsb2FkIGFzIG9mIG5vdy4KKyAgICBpZiAob2ZmbG9hZEluZm8uc3RyZWFtX3R5cGUgIT0gQVVESU9fU1RSRUFNX01VU0lDKQorICAgIHsKKyAgICAgICAgQUxPR1YoImlzT2ZmbG9hZFN1cHBvcnRlZDogc3RyZWFtX3R5cGUgIT0gTVVTSUMsIHJldHVybmluZyBmYWxzZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy9UT0RPOiBlbmFibGUgYXVkaW8gb2ZmbG9hZGluZyB3aXRoIHZpZGVvIHdoZW4gcmVhZHkKKyAgICBjb25zdCBib29sIGFsbG93T2ZmbG9hZFdpdGhWaWRlbyA9CisgICAgICAgICAgICBwcm9wZXJ0eV9nZXRfYm9vbCgiYXVkaW8ub2ZmbG9hZC52aWRlbyIsIGZhbHNlIC8qIGRlZmF1bHRfdmFsdWUgKi8pOworICAgIGlmIChvZmZsb2FkSW5mby5oYXNfdmlkZW8gJiYgIWFsbG93T2ZmbG9hZFdpdGhWaWRlbykgeworICAgICAgICBBTE9HVigiaXNPZmZsb2FkU3VwcG9ydGVkOiBoYXNfdmlkZW8gPT0gdHJ1ZSwgcmV0dXJuaW5nIGZhbHNlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvL0lmIGR1cmF0aW9uIGlzIGxlc3MgdGhhbiBtaW5pbXVtIHZhbHVlIGRlZmluZWQgaW4gcHJvcGVydHksIHJldHVybiBmYWxzZQorICAgIGlmIChwcm9wZXJ0eV9nZXQoImF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MiLCBwcm9wVmFsdWUsIE5VTEwpKSB7CisgICAgICAgIGlmIChvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA8IChhdG9pKHByb3BWYWx1ZSkgKiAxMDAwMDAwICkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJPZmZsb2FkIGRlbmllZCBieSBkdXJhdGlvbiA8IGF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MoPSVzKSIsIHByb3BWYWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzIDwgT0ZGTE9BRF9ERUZBVUxUX01JTl9EVVJBVElPTl9TRUNTICogMTAwMDAwMCkgeworICAgICAgICBBTE9HVigiT2ZmbG9hZCBkZW5pZWQgYnkgZHVyYXRpb24gPCBkZWZhdWx0IG1pbig9JXUpIiwgT0ZGTE9BRF9ERUZBVUxUX01JTl9EVVJBVElPTl9TRUNTKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIERvIG5vdCBhbGxvdyBvZmZsb2FkaW5nIGlmIG9uZSBub24gb2ZmbG9hZGFibGUgZWZmZWN0IGlzIGVuYWJsZWQuIFRoaXMgcHJldmVudHMgZnJvbQorICAgIC8vIGNyZWF0aW5nIGFuIG9mZmxvYWRlZCB0cmFjayBhbmQgdGVhcmluZyBpdCBkb3duIGltbWVkaWF0ZWx5IGFmdGVyIHN0YXJ0IHdoZW4gYXVkaW9mbGluZ2VyCisgICAgLy8gZGV0ZWN0cyB0aGVyZSBpcyBhbiBhY3RpdmUgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdC4KKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGNoZWNrIHRoZSBhdWRpbyBzZXNzaW9uIGhlcmUgYnV0IHdlIGRvIG5vdCBoYXZlIGl0IGluIHRoaXMgY29udGV4dC4KKyAgICAvLyBUaGlzIG1heSBwcmV2ZW50IG9mZmxvYWRpbmcgaW4gcmFyZSBzaXR1YXRpb25zIHdoZXJlIGVmZmVjdHMgYXJlIGxlZnQgYWN0aXZlIGJ5IGFwcHMKKyAgICAvLyBpbiB0aGUgYmFja2dyb3VuZC4KKyAgICBpZiAobUVmZmVjdHMuaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGEgcHJvZmlsZSB0byBzdXBwb3J0IHRoaXMuCisgICAgLy8gQVVESU9fREVWSUNFX05PTkUKKyAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KEFVRElPX0RFVklDRV9OT05FIC8qaWdub3JlIGRldmljZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uY2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKTsKKyAgICBBTE9HVigiaXNPZmZsb2FkU3VwcG9ydGVkKCkgcHJvZmlsZSAlc2ZvdW5kIiwgcHJvZmlsZSAhPSAwID8gIiIgOiAiTk9UICIpOworICAgIHJldHVybiAocHJvZmlsZSAhPSAwKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pCit7CisgICAgaWYgKG51bV9wb3J0cyA9PSBOVUxMIHx8ICgqbnVtX3BvcnRzICE9IDAgJiYgcG9ydHMgPT0gTlVMTCkgfHwKKyAgICAgICAgICAgIGdlbmVyYXRpb24gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigibGlzdEF1ZGlvUG9ydHMoKSByb2xlICVkIHR5cGUgJWQgbnVtX3BvcnRzICVkIHBvcnRzICVwIiwgcm9sZSwgdHlwZSwgKm51bV9wb3J0cywgcG9ydHMpOworICAgIGlmIChwb3J0cyA9PSBOVUxMKSB7CisgICAgICAgICpudW1fcG9ydHMgPSAwOworICAgIH0KKworICAgIHNpemVfdCBwb3J0c1dyaXR0ZW4gPSAwOworICAgIHNpemVfdCBwb3J0c01heCA9ICpudW1fcG9ydHM7CisgICAgKm51bV9wb3J0cyA9IDA7CisgICAgaWYgKHR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX05PTkUgfHwgdHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgIGlmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LIHx8IHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX05PTkUpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOworICAgICAgICAgICAgICAgICAgICBpICA8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnNpemUoKSAmJiBwb3J0c1dyaXR0ZW4gPCBwb3J0c01heDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0tPnRvQXVkaW9Qb3J0KCZwb3J0c1twb3J0c1dyaXR0ZW4rK10pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKm51bV9wb3J0cyArPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5zaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSB8fCByb2xlID09IEFVRElPX1BPUlRfUk9MRV9OT05FKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaSAgPCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnNpemUoKSAmJiBwb3J0c1dyaXR0ZW4gPCBwb3J0c01heDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+dG9BdWRpb1BvcnQoJnBvcnRzW3BvcnRzV3JpdHRlbisrXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqbnVtX3BvcnRzICs9IG1BdmFpbGFibGVJbnB1dERldmljZXMuc2l6ZSgpOworICAgICAgICB9CisgICAgfQorICAgIGlmICh0eXBlID09IEFVRElPX1BPUlRfVFlQRV9OT05FIHx8IHR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICBpZiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSyB8fCByb2xlID09IEFVRElPX1BPUlRfUk9MRV9OT05FKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpICYmIHBvcnRzV3JpdHRlbiA8IHBvcnRzTWF4OyBpKyspIHsKKyAgICAgICAgICAgICAgICBtSW5wdXRzW2ldLT50b0F1ZGlvUG9ydCgmcG9ydHNbcG9ydHNXcml0dGVuKytdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpudW1fcG9ydHMgKz0gbUlucHV0cy5zaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSB8fCByb2xlID09IEFVRElPX1BPUlRfUk9MRV9OT05FKSB7CisgICAgICAgICAgICBzaXplX3QgbnVtT3V0cHV0cyA9IDA7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtT3V0cHV0c1tpXS0+aXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtT3V0cHV0cysrOworICAgICAgICAgICAgICAgICAgICBpZiAocG9ydHNXcml0dGVuIDwgcG9ydHNNYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzW2ldLT50b0F1ZGlvUG9ydCgmcG9ydHNbcG9ydHNXcml0dGVuKytdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpudW1fcG9ydHMgKz0gbnVtT3V0cHV0czsKKyAgICAgICAgfQorICAgIH0KKyAgICAqZ2VuZXJhdGlvbiA9IGN1ckF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICBBTE9HVigibGlzdEF1ZGlvUG9ydHMoKSBnb3QgJXp1IHBvcnRzIG5lZWRlZCAlZCIsIHBvcnRzV3JpdHRlbiwgKm51bV9wb3J0cyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCBfX3VudXNlZCkKK3sKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCit7CisgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSIpOworCisgICAgaWYgKGhhbmRsZSA9PSBOVUxMIHx8IHBhdGNoID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBudW0gc291cmNlcyAlZCBudW0gc2lua3MgJWQiLCBwYXRjaC0+bnVtX3NvdXJjZXMsIHBhdGNoLT5udW1fc2lua3MpOworCisgICAgaWYgKHBhdGNoLT5udW1fc291cmNlcyA9PSAwIHx8IHBhdGNoLT5udW1fc291cmNlcyA+IEFVRElPX1BBVENIX1BPUlRTX01BWCB8fAorICAgICAgICAgICAgcGF0Y2gtPm51bV9zaW5rcyA9PSAwIHx8IHBhdGNoLT5udW1fc2lua3MgPiBBVURJT19QQVRDSF9QT1JUU19NQVgpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgLy8gb25seSBvbmUgc291cmNlIHBlciBhdWRpbyBwYXRjaCBzdXBwb3J0ZWQgZm9yIG5vdworICAgIGlmIChwYXRjaC0+bnVtX3NvdXJjZXMgPiAxKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAocGF0Y2gtPnNvdXJjZXNbMF0ucm9sZSAhPSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS5yb2xlICE9IEFVRElPX1BPUlRfUk9MRV9TSU5LKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2M7CisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqaGFuZGxlKTsKKworICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoIHNvdXJjZSBpZCAlZCByb2xlICVkIHR5cGUgJWQiLCBwYXRjaC0+c291cmNlc1swXS5pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0ucm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0udHlwZSk7CisjaWYgTE9HX05ERUJVRyA9PSAwCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2ggc2luayAlZDogaWQgJWQgcm9sZSAlZCB0eXBlICVkIiwgaSwgcGF0Y2gtPnNpbmtzW2ldLmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS5yb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS50eXBlKTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CisgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgbVVpZENhY2hlZCAlZCBwYXRjaERlc2MtPm1VaWQgJWQgdWlkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1VaWRDYWNoZWQsIHBhdGNoRGVzYy0+bVVpZCwgdWlkKTsKKyAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVVpZCAhPSBtVWlkQ2FjaGVkICYmIHVpZCAhPSBwYXRjaERlc2MtPm1VaWQpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICpoYW5kbGUgPSAwOworICAgIH0KKworICAgIGlmIChwYXRjaC0+c291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy5nZXRPdXRwdXRGcm9tSWQocGF0Y2gtPnNvdXJjZXNbMF0uaWQpOworICAgICAgICBpZiAob3V0cHV0RGVzYyA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIG91dHB1dCBub3QgZm91bmQgZm9yIGlkICVkIiwgcGF0Y2gtPnNvdXJjZXNbMF0uaWQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBBTE9HX0FTU0VSVCghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCksImR1cGxpY2F0ZWQgb3V0cHV0ICVkIGluIHNvdXJjZSBpbiBwb3J0cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOworICAgICAgICBpZiAocGF0Y2hEZXNjICE9IDApIHsKKyAgICAgICAgICAgIGlmIChwYXRjaERlc2MtPm1QYXRjaC5zb3VyY2VzWzBdLmlkICE9IHBhdGNoLT5zb3VyY2VzWzBdLmlkKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzb3VyY2UgaWQgZGlmZmVycyBmb3IgcGF0Y2ggY3VycmVudCBpZCAlZCBuZXcgaWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2guc291cmNlc1swXS5pZCwgcGF0Y2gtPnNvdXJjZXNbMF0uaWQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7CisgICAgICAgICAgICAvLyBPbmx5IHN1cHBvcnQgbWl4IHRvIGRldmljZXMgY29ubmVjdGlvbgorICAgICAgICAgICAgLy8gVE9ETyBhZGQgc3VwcG9ydCBmb3IgbWl4IHRvIG1peCBjb25uZWN0aW9uCisgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc291cmNlIG1peCBidXQgc2luayBpcyBub3QgYSBkZXZpY2UiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0KKyAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zaW5rc1tpXS5pZCk7CisgICAgICAgICAgICBpZiAoZGV2RGVzYyA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBvdXQgZGV2aWNlIG5vdCBmb3VuZCBmb3IgaWQgJWQiLCBwYXRjaC0+c2lua3NbaV0uaWQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghb3V0cHV0RGVzYy0+bVByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2RGVzYy0+dHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5tQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAvLyB1cGRhdGVkU2FtcGxpbmdSYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgIC8vIHVwZGF0ZWRGb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uY2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgLy8gdXBkYXRlZENoYW5uZWxNYXNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUgLypGSVhNRSovKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgcHJvZmlsZSBub3Qgc3VwcG9ydGVkIGZvciBkZXZpY2UgJTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT50eXBlKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRldmljZXMuYWRkKGRldkRlc2MpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2VzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiByZWNvbmZpZ3VyZSBvdXRwdXQgZm9ybWF0IGFuZCBjaGFubmVscyBoZXJlCisgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0dGluZyBkZXZpY2UgJTA4eCBvbiBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICBkZXZpY2VzLnR5cGVzKCksIG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLCBkZXZpY2VzLnR5cGVzKCksIHRydWUsIDAsIGhhbmRsZSk7CisgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpoYW5kbGUpOworICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgaWYgKHBhdGNoRGVzYyAhPSAwICYmIHBhdGNoRGVzYyAhPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXRPdXRwdXREZXZpY2UoKSBkaWQgbm90IHJldXNlIHRoZSBwYXRjaCBwcm92aWRlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgICAgIHBhdGNoRGVzYy0+bVVpZCA9IHVpZDsKKyAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc3VjY2VzcyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXRPdXRwdXREZXZpY2UoKSBmYWlsZWQgdG8gY3JlYXRlIGEgcGF0Y2giKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgICAgICAvLyBpbnB1dCBkZXZpY2UgdG8gaW5wdXQgbWl4IGNvbm5lY3Rpb24KKyAgICAgICAgICAgIC8vIG9ubHkgb25lIHNpbmsgc3VwcG9ydGVkIHdoZW4gY29ubmVjdGluZyBhbiBpbnB1dCBkZXZpY2UgdG8gYSBtaXgKKyAgICAgICAgICAgIGlmIChwYXRjaC0+bnVtX3NpbmtzID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLmdldElucHV0RnJvbUlkKHBhdGNoLT5zaW5rc1swXS5pZCk7CisgICAgICAgICAgICBpZiAoaW5wdXREZXNjID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhdGNoRGVzYyAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVBhdGNoLnNpbmtzWzBdLmlkICE9IHBhdGNoLT5zaW5rc1swXS5pZCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPQorICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZUZyb21JZChwYXRjaC0+c291cmNlc1swXS5pZCk7CisgICAgICAgICAgICBpZiAoZGV2RGVzYyA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFpbnB1dERlc2MtPm1Qcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldkRlc2MtPnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5tQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgLyp1cGRhdGVkU2FtcGxlUmF0ZSovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAvKnVwZGF0ZWRGb3JtYXQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5jaGFubmVsX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgLyp1cGRhdGVkQ2hhbm5lbE1hc2sqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIGZvciB0aGUgcGFyYW1ldGVyIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBOT05FCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE86IHJlY29uZmlndXJlIG91dHB1dCBmb3JtYXQgYW5kIGNoYW5uZWxzIGhlcmUKKyAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0dGluZyBkZXZpY2UgJTA4eCBvbiBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT50eXBlKCksIGlucHV0RGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgIHNldElucHV0RGV2aWNlKGlucHV0RGVzYy0+bUlvSGFuZGxlLCBkZXZEZXNjLT50eXBlKCksIHRydWUsIGhhbmRsZSk7CisgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqaGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdGNoRGVzYyAhPSAwICYmIHBhdGNoRGVzYyAhPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0SW5wdXREZXZpY2UoKSBkaWQgbm90IHJldXNlIHRoZSBwYXRjaCBwcm92aWRlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVVpZCA9IHVpZDsKKyAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHN1Y2Nlc3MiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXRJbnB1dERldmljZSgpIGZhaWxlZCB0byBjcmVhdGUgYSBwYXRjaCIpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgICAgICAvLyBkZXZpY2UgdG8gZGV2aWNlIGNvbm5lY3Rpb24KKyAgICAgICAgICAgIGlmIChwYXRjaERlc2MgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChwYXRjaERlc2MtPm1QYXRjaC5zb3VyY2VzWzBdLmlkICE9IHBhdGNoLT5zb3VyY2VzWzBdLmlkKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3JjRGV2aWNlRGVzYyA9CisgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKKyAgICAgICAgICAgIGlmIChzcmNEZXZpY2VEZXNjID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL3VwZGF0ZSBzb3VyY2UgYW5kIHNpbmsgd2l0aCBvdXIgb3duIGRhdGEgYXMgdGhlIGRhdGEgcGFzc2VkIGluIHRoZSBwYXRjaCBtYXkKKyAgICAgICAgICAgIC8vIGJlIGluY29tcGxldGUuCisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbmV3UGF0Y2ggPSAqcGF0Y2g7CisgICAgICAgICAgICBzcmNEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3UGF0Y2guc291cmNlc1swXSwgJnBhdGNoLT5zb3VyY2VzWzBdKTsKKworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHNvdXJjZSBkZXZpY2UgYnV0IG9uZSBzaW5rIGlzIG5vdCBhIGRldmljZSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc2lua0RldmljZURlc2MgPQorICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zaW5rc1tpXS5pZCk7CisgICAgICAgICAgICAgICAgaWYgKHNpbmtEZXZpY2VEZXNjID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2lua0RldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZuZXdQYXRjaC5zaW5rc1tpXSwgJnBhdGNoLT5zaW5rc1tpXSk7CisKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBzb2Z0d2FyZSBicmlkZ2UgaW4gUGF0Y2hQYW5lbCBpZjoKKyAgICAgICAgICAgICAgICAvLyAtIHNvdXJjZSBhbmQgc2luayBkZXZpY2VzIGFyZSBvbiBkaWZmZXJudCBIVyBtb2R1bGVzIE9SCisgICAgICAgICAgICAgICAgLy8gLSBhdWRpbyBIQUwgdmVyc2lvbiBpcyA8IDMuMAorICAgICAgICAgICAgICAgIGlmICgoc3JjRGV2aWNlRGVzYy0+Z2V0TW9kdWxlSGFuZGxlKCkgIT0gc2lua0RldmljZURlc2MtPmdldE1vZHVsZUhhbmRsZSgpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHNyY0RldmljZURlc2MtPm1Nb2R1bGUtPm1IYWxWZXJzaW9uIDwgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBvbmx5IG9uZSBzaW5rIGRldmljZSBmb3Igbm93IHRvIHNpbXBsaWZ5IG91dHB1dCBzZWxlY3Rpb24gbG9naWMKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5udW1fc2lua3MgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0c0ZvckRldmljZShzaW5rRGV2aWNlRGVzYy0+dHlwZSgpLCBtT3V0cHV0cyk7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzaW5rIGRldmljZSBpcyByZWFjaGFibGUgdmlhIGFuIG9wZW5lZCBvdXRwdXQgc3RyZWFtLCByZXF1ZXN0IHRvIGdvIHZpYQorICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG91dHB1dCBzdHJlYW0gYnkgYWRkaW5nIGEgc2Vjb25kIHNvdXJjZSB0byB0aGUgcGF0Y2ggZGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0lOVkFMSUQpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJm5ld1BhdGNoLnNvdXJjZXNbMV0sICZwYXRjaC0+c291cmNlc1swXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC5zb3VyY2VzWzFdLmV4dC5taXgudXNlY2FzZS5zdHJlYW0gPSBBVURJT19TVFJFQU1fUEFUQ0g7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC5udW1fc291cmNlcyA9IDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUT0RPOiBjaGVjayBmcm9tIHJvdXRpbmcgY2FwYWJpbGl0aWVzIGluIGNvbmZpZyBmaWxlIGFuZCBvdGhlciBjb25mbGljdGluZyBwYXRjaGVzCisKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgYWZQYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZuZXdQYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZlBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHBhdGNoIHBhbmVsIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWZQYXRjaEhhbmRsZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaCgmbmV3UGF0Y2gsIHVpZCk7CisgICAgICAgICAgICAgICAgICAgIGFkZEF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlLCBwYXRjaERlc2MpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVBhdGNoID0gbmV3UGF0Y2g7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOworICAgICAgICAgICAgICAgICpoYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7CisgICAgICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIHBhdGNoIHBhbmVsIGNvdWxkIG5vdCBjb25uZWN0IGRldmljZSBwYXRjaCwgZXJyb3IgJWQiLAorICAgICAgICAgICAgICAgIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkKK3sKKyAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2goKSBwYXRjaCAlZCIsIGhhbmRsZSk7CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGhhbmRsZSk7CisKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CisgICAgQUxPR1YoInJlbGVhc2VBdWRpb1BhdGNoKCkgbVVpZENhY2hlZCAlZCBwYXRjaERlc2MtPm1VaWQgJWQgdWlkICVkIiwKKyAgICAgICAgICBtVWlkQ2FjaGVkLCBwYXRjaERlc2MtPm1VaWQsIHVpZCk7CisgICAgaWYgKHBhdGNoRGVzYy0+bVVpZCAhPSBtVWlkQ2FjaGVkICYmIHVpZCAhPSBwYXRjaERlc2MtPm1VaWQpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2ggPSAmcGF0Y2hEZXNjLT5tUGF0Y2g7CisgICAgcGF0Y2hEZXNjLT5tVWlkID0gbVVpZENhY2hlZDsKKyAgICBpZiAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMuZ2V0T3V0cHV0RnJvbUlkKHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR1YoInJlbGVhc2VBdWRpb1BhdGNoKCkgb3V0cHV0IG5vdCBmb3VuZCBmb3IgaWQgJWQiLCBwYXRjaC0+c291cmNlc1swXS5pZCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgdHJ1ZSAvKmZyb21DYWNoZSovKSwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfSBlbHNlIGlmIChwYXRjaC0+c291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLmdldElucHV0RnJvbUlkKHBhdGNoLT5zaW5rc1swXS5pZCk7CisgICAgICAgICAgICBpZiAoaW5wdXREZXNjID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2goKSBpbnB1dCBub3QgZm91bmQgZm9yIGlkICVkIiwgcGF0Y2gtPnNpbmtzWzBdLmlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0SW5wdXREZXZpY2UoaW5wdXREZXNjLT5tSW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROZXdJbnB1dERldmljZShpbnB1dERlc2MtPm1Jb0hhbmRsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIH0gZWxzZSBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgICAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2goKSBwYXRjaCBwYW5lbCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSk7CisgICAgICAgICAgICByZW1vdmVBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSk7CisgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6bGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pCit7CisgICAgaWYgKGdlbmVyYXRpb24gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICAqZ2VuZXJhdGlvbiA9IGN1ckF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICByZXR1cm4gbUF1ZGlvUGF0Y2hlcy5saXN0QXVkaW9QYXRjaGVzKG51bV9wYXRjaGVzLCBwYXRjaGVzKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit7CisgICAgQUxPR1YoInNldEF1ZGlvUG9ydENvbmZpZygpIik7CisKKyAgICBpZiAoY29uZmlnID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoInNldEF1ZGlvUG9ydENvbmZpZygpIG9uIHBvcnQgaGFuZGxlICVkIiwgY29uZmlnLT5pZCk7CisgICAgLy8gT25seSBzdXBwb3J0IGdhaW4gY29uZmlndXJhdGlvbiBmb3Igbm93CisgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgIT0gQVVESU9fUE9SVF9DT05GSUdfR0FJTikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3A8QXVkaW9Qb3J0Q29uZmlnPiBhdWRpb1BvcnRDb25maWc7CisgICAgaWYgKGNvbmZpZy0+dHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgIGlmIChjb25maWctPnJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgeworICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy5nZXRPdXRwdXRGcm9tSWQoY29uZmlnLT5pZCk7CisgICAgICAgICAgICBpZiAob3V0cHV0RGVzYyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZXRBdWRpb1BvcnRDb25maWcoKSBjYWxsZWQgb24gZHVwbGljYXRlZCBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgIGF1ZGlvUG9ydENvbmZpZyA9IG91dHB1dERlc2M7CisgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5yb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSB7CisgICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy5nZXRJbnB1dEZyb21JZChjb25maWctPmlkKTsKKyAgICAgICAgICAgIGlmIChpbnB1dERlc2MgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdWRpb1BvcnRDb25maWcgPSBpbnB1dERlc2M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChjb25maWctPnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjOworICAgICAgICBpZiAoY29uZmlnLT5yb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpIHsKKyAgICAgICAgICAgIGRldmljZURlc2MgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZUZyb21JZChjb25maWctPmlkKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb25maWctPnJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspIHsKKyAgICAgICAgICAgIGRldmljZURlc2MgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoY29uZmlnLT5pZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2VEZXNjID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgYXVkaW9Qb3J0Q29uZmlnID0gZGV2aWNlRGVzYzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBiYWNrdXBDb25maWc7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb3J0Q29uZmlnLT5hcHBseUF1ZGlvUG9ydENvbmZpZyhjb25maWcsICZiYWNrdXBDb25maWcpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIG5ld0NvbmZpZzsKKyAgICAgICAgYXVkaW9Qb3J0Q29uZmlnLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3Q29uZmlnLCBjb25maWcpOworICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+c2V0QXVkaW9Qb3J0Q29uZmlnKCZuZXdDb25maWcsIDApOworICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGF1ZGlvUG9ydENvbmZpZy0+YXBwbHlBdWRpb1BvcnRDb25maWcoJmJhY2t1cENvbmZpZyk7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VSZXNvdXJjZXNGb3JVaWQodWlkX3QgdWlkKQoreworICAgIGNsZWFyQXVkaW9QYXRjaGVzKHVpZCk7CisgICAgY2xlYXJTZXNzaW9uUm91dGVzKHVpZCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbGVhckF1ZGlvUGF0Y2hlcyh1aWRfdCB1aWQpCit7CisgICAgZm9yIChzc2l6ZV90IGkgPSAoc3NpemVfdCltQXVkaW9QYXRjaGVzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSAgeworICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChwYXRjaERlc2MtPm1VaWQgPT0gdWlkKSB7CisgICAgICAgICAgICByZWxlYXNlQXVkaW9QYXRjaChtQXVkaW9QYXRjaGVzLmtleUF0KGkpLCB1aWQpOworICAgICAgICB9CisgICAgfQorfQorCisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja1N0cmF0ZWd5Um91dGUocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3VwdHV0VG9Ta2lwKQoreworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShkZXZpY2UsIG1PdXRwdXRzKTsKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1PdXRwdXRzLnNpemUoKTsgaisrKSB7CisgICAgICAgIGlmIChtT3V0cHV0cy5rZXlBdChqKSA9PSBvdXB0dXRUb1NraXApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChqKTsKKyAgICAgICAgaWYgKCFpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIChyb3V0aW5nX3N0cmF0ZWd5KXN0cmF0ZWd5KSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYgdGhlIGRlZmF1bHQgZGV2aWNlIGZvciB0aGlzIHN0cmF0ZWd5IGlzIG9uIGFub3RoZXIgb3V0cHV0IG1peCwKKyAgICAgICAgLy8gaW52YWxpZGF0ZSBhbGwgdHJhY2tzIGluIHRoaXMgc3RyYXRlZ3kgdG8gZm9yY2UgcmUgY29ubmVjdGlvbi4KKyAgICAgICAgLy8gT3RoZXJ3aXNlIHNlbGVjdCBuZXcgZGV2aWNlIG9uIHRoZSBvdXRwdXQgbWl4LgorICAgICAgICBpZiAob3V0cHV0cy5pbmRleE9mKG1PdXRwdXRzLmtleUF0KGopKSA8IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7IHN0cmVhbSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fUEFUQ0gpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0pID09IHN0cmF0ZWd5KSB7CisgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLCBuZXdEZXZpY2UsIGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsZWFyU2Vzc2lvblJvdXRlcyh1aWRfdCB1aWQpCit7CisgICAgLy8gcmVtb3ZlIG91dHB1dCByb3V0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdWlkCisgICAgU29ydGVkVmVjdG9yPHJvdXRpbmdfc3RyYXRlZ3k+IGFmZmVjdGVkU3RyYXRlZ2llczsKKyAgICBmb3IgKHNzaXplX3QgaSA9IChzc2l6ZV90KW1PdXRwdXRSb3V0ZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pICB7CisgICAgICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBtT3V0cHV0Um91dGVzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChyb3V0ZS0+bVVpZCA9PSB1aWQpIHsKKyAgICAgICAgICAgIG1PdXRwdXRSb3V0ZXMucmVtb3ZlSXRlbXNBdChpKTsKKyAgICAgICAgICAgIGlmIChyb3V0ZS0+bURldmljZURlc2NyaXB0b3IgIT0gMCkgeworICAgICAgICAgICAgICAgIGFmZmVjdGVkU3RyYXRlZ2llcy5hZGQoZ2V0U3RyYXRlZ3kocm91dGUtPm1TdHJlYW1UeXBlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gcmVyb3V0ZSBvdXRwdXRzIGlmIG5lY2Vzc2FyeQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWZmZWN0ZWRTdHJhdGVnaWVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNoZWNrU3RyYXRlZ3lSb3V0ZShhZmZlY3RlZFN0cmF0ZWdpZXNbaV0sIEFVRElPX0lPX0hBTkRMRV9OT05FKTsKKyAgICB9CisKKyAgICAvLyByZW1vdmUgaW5wdXQgcm91dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHVpZAorICAgIFNvcnRlZFZlY3RvcjxhdWRpb19zb3VyY2VfdD4gYWZmZWN0ZWRTb3VyY2VzOworICAgIGZvciAoc3NpemVfdCBpID0gKHNzaXplX3QpbUlucHV0Um91dGVzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSAgeworICAgICAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gbUlucHV0Um91dGVzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChyb3V0ZS0+bVVpZCA9PSB1aWQpIHsKKyAgICAgICAgICAgIG1JbnB1dFJvdXRlcy5yZW1vdmVJdGVtc0F0KGkpOworICAgICAgICAgICAgaWYgKHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvciAhPSAwKSB7CisgICAgICAgICAgICAgICAgYWZmZWN0ZWRTb3VyY2VzLmFkZChyb3V0ZS0+bVNvdXJjZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gcmVyb3V0ZSBpbnB1dHMgaWYgbmVjZXNzYXJ5CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBpbnB1dHNUb0Nsb3NlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoYWZmZWN0ZWRTb3VyY2VzLmluZGV4T2YoaW5wdXREZXNjLT5tSW5wdXRTb3VyY2UpID49IDApIHsKKyAgICAgICAgICAgIGlucHV0c1RvQ2xvc2UuYWRkKGlucHV0RGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlucHV0c1RvQ2xvc2Uuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY2xvc2VJbnB1dChpbnB1dHNUb0Nsb3NlW2ldKTsKKyAgICB9Cit9CisKKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSkKK3sKKyAgICAqc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpbXBDbGllbnRJbnRlcmZhY2UtPm5ld0F1ZGlvVW5pcXVlSWQoKTsKKyAgICAqaW9IYW5kbGUgPSAoYXVkaW9faW9faGFuZGxlX3QpbXBDbGllbnRJbnRlcmZhY2UtPm5ld0F1ZGlvVW5pcXVlSWQoKTsKKyAgICAqZGV2aWNlID0gZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoQVVESU9fU09VUkNFX0hPVFdPUkQpOworCisgICAgcmV0dXJuIG1Tb3VuZFRyaWdnZXJTZXNzaW9ucy5hY3F1aXJlU2Vzc2lvbigqc2Vzc2lvbiwgKmlvSGFuZGxlKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmhhbmRsZSBfX3VudXNlZCkKK3sKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSBfX3VudXNlZCkKK3sKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEF1ZGlvUG9saWN5TWFuYWdlcgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpCit7CisgICAgcmV0dXJuIGFuZHJvaWRfYXRvbWljX2luYygmbUF1ZGlvUG9ydEdlbmVyYXRpb24pOworfQorCitBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQorICAgIDoKKyNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAorICAgIFRocmVhZChmYWxzZSksCisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lKGZhbHNlKSwgbUxhc3RWb2ljZVZvbHVtZSgtMS4wZiksCisgICAgbUEyZHBTdXNwZW5kZWQoZmFsc2UpLAorICAgIG1TcGVha2VyRHJjRW5hYmxlZChmYWxzZSksCisgICAgbUF1ZGlvUG9ydEdlbmVyYXRpb24oMSksCisgICAgbUJlYWNvbk11dGVSZWZDb3VudCgwKSwKKyAgICBtQmVhY29uUGxheWluZ1JlZkNvdW50KDApLAorICAgIG1CZWFjb25NdXRlZChmYWxzZSkKK3sKKyAgICBhdWRpb19wb2xpY3k6OkVuZ2luZUluc3RhbmNlICplbmdpbmVJbnN0YW5jZSA9IGF1ZGlvX3BvbGljeTo6RW5naW5lSW5zdGFuY2U6OmdldEluc3RhbmNlKCk7CisgICAgaWYgKCFlbmdpbmVJbnN0YW5jZSkgeworICAgICAgICBBTE9HRSgiJXM6ICBDb3VsZCBub3QgZ2V0IGFuIGluc3RhbmNlIG9mIHBvbGljeSBlbmdpbmUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIFJldHJpZXZlIHRoZSBQb2xpY3kgTWFuYWdlciBJbnRlcmZhY2UKKyAgICBtRW5naW5lID0gZW5naW5lSW5zdGFuY2UtPnF1ZXJ5SW50ZXJmYWNlPEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZT4oKTsKKyAgICBpZiAobUVuZ2luZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGdldCBQb2xpY3kgRW5naW5lIEludGVyZmFjZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUVuZ2luZS0+c2V0T2JzZXJ2ZXIodGhpcyk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUVuZ2luZS0+aW5pdENoZWNrKCk7CisgICAgQUxPR19BU1NFUlQoc3RhdHVzID09IE5PX0VSUk9SLCAiUG9saWN5IGVuZ2luZSBub3QgaW5pdGlhbGl6ZWQoZXJyPSVkKSIsIHN0YXR1cyk7CisKKyAgICBtVWlkQ2FjaGVkID0gZ2V0dWlkKCk7CisgICAgbXBDbGllbnRJbnRlcmZhY2UgPSBjbGllbnRJbnRlcmZhY2U7CisKKyAgICBtRGVmYXVsdE91dHB1dERldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUik7CisgICAgaWYgKENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZEF1ZGlvUG9saWN5Q29uZmlnKEFVRElPX1BPTElDWV9WRU5ET1JfQ09ORklHX0ZJTEUsCisgICAgICAgICAgICAgICAgIG1Id01vZHVsZXMsIG1BdmFpbGFibGVJbnB1dERldmljZXMsIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZSwgbVNwZWFrZXJEcmNFbmFibGVkKSAhPSBOT19FUlJPUikgeworICAgICAgICBpZiAoQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkQXVkaW9Qb2xpY3lDb25maWcoQVVESU9fUE9MSUNZX0NPTkZJR19GSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Id01vZHVsZXMsIG1BdmFpbGFibGVJbnB1dERldmljZXMsIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlLCBtU3BlYWtlckRyY0VuYWJsZWQpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiY291bGQgbm90IGxvYWQgYXVkaW8gcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZSwgc2V0dGluZyBkZWZhdWx0cyIpOworICAgICAgICAgICAgZGVmYXVsdEF1ZGlvUG9saWN5Q29uZmlnKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gbUF2YWlsYWJsZU91dHB1dERldmljZXMgYW5kIG1BdmFpbGFibGVJbnB1dERldmljZXMgbm93IGNvbnRhaW4gYWxsIGF0dGFjaGVkIGRldmljZXMKKworICAgIC8vIG11c3QgYmUgZG9uZSBhZnRlciByZWFkaW5nIHRoZSBwb2xpY3kgKHNpbmNlIGNvbmRpdGlvbm5lZCBieSBTcGVha2VyIERyYyBFbmFibGluZykKKyAgICBtRW5naW5lLT5pbml0aWFsaXplVm9sdW1lQ3VydmVzKG1TcGVha2VyRHJjRW5hYmxlZCk7CisKKyAgICAvLyBvcGVuIGFsbCBvdXRwdXQgc3RyZWFtcyBuZWVkZWQgdG8gYWNjZXNzIGF0dGFjaGVkIGRldmljZXMKKyAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpOworICAgIGF1ZGlvX2RldmljZXNfdCBpbnB1dERldmljZVR5cGVzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYgfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPSBtcENsaWVudEludGVyZmFjZS0+bG9hZEh3TW9kdWxlKG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKKyAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgQUxPR1coImNvdWxkIG5vdCBvcGVuIEhXIG1vZHVsZSAlcyIsIG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIG9wZW4gYWxsIG91dHB1dCBzdHJlYW1zIG5lZWRlZCB0byBhY2Nlc3MgYXR0YWNoZWQgZGV2aWNlcworICAgICAgICAvLyBleGNlcHQgZm9yIGRpcmVjdCBvdXRwdXQgc3RyZWFtcyB0aGF0IGFyZSBvbmx5IG9wZW5lZCB3aGVuIHRoZXkgYXJlIGFjdHVhbGx5CisgICAgICAgIC8vIHJlcXVpcmVkIGJ5IGFuIGFwcC4KKyAgICAgICAgLy8gVGhpcyBhbHNvIHZhbGlkYXRlcyBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBsaXN0CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+IG91dFByb2ZpbGUgPSBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXNbal07CisKKyAgICAgICAgICAgIGlmIChvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiT3V0cHV0IHByb2ZpbGUgY29udGFpbnMgbm8gZGV2aWNlIG9uIG1vZHVsZSAlcyIsIG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChvdXRQcm9maWxlLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcm9maWxlVHlwZSA9IG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCk7CisgICAgICAgICAgICBpZiAoKHByb2ZpbGVUeXBlICYgbURlZmF1bHRPdXRwdXREZXZpY2UtPnR5cGUoKSkgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSA9IG1EZWZhdWx0T3V0cHV0RGV2aWNlLT50eXBlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGNob3NlIGZpcnN0IGRldmljZSBwcmVzZW50IGluIG1TdXBwb3J0ZWREZXZpY2VzIGFsc28gcGFydCBvZgorICAgICAgICAgICAgICAgIC8vIG91dHB1dERldmljZVR5cGVzCisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgIDwgb3V0UHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVR5cGUgPSBvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlc1trXS0+dHlwZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHByb2ZpbGVUeXBlICYgb3V0cHV0RGV2aWNlVHlwZXMpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChwcm9maWxlVHlwZSAmIG91dHB1dERldmljZVR5cGVzKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG5ldyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihvdXRQcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UpOworCisgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gcHJvZmlsZVR5cGU7CisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlOworICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IG91dHB1dERlc2MtPm1DaGFubmVsTWFzazsKKyAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBvdXRwdXREZXNjLT5tRm9ybWF0OworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChvdXRQcm9maWxlLT5nZXRNb2R1bGVIYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tTGF0ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyk7CisKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiQ2Fubm90IG9wZW4gb3V0cHV0IHN0cmVhbSBmb3IgZGV2aWNlICUwOHggb24gaHcgbW9kdWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgIG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OworCisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgIDwgb3V0UHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlc1trXS0+dHlwZSgpOworICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5pbmRleE9mKG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzW2tdKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZSBhIHZhbGlkIElEIHRvIGFuIGF0dGFjaGVkIGRldmljZSBvbmNlIGNvbmZpcm1lZCBpdCBpcyByZWFjaGFibGUKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2luZGV4XS0+aXNBdHRhY2hlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPmF0dGFjaChtSHdNb2R1bGVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobVByaW1hcnlPdXRwdXQgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0UHJvZmlsZS0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSkgeworICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeU91dHB1dCA9IG91dHB1dERlc2M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZE91dHB1dChvdXRwdXQsIG91dHB1dERlc2MpOworICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBvcGVuIGlucHV0IHN0cmVhbXMgbmVlZGVkIHRvIGFjY2VzcyBhdHRhY2hlZCBkZXZpY2VzIHRvIHZhbGlkYXRlCisgICAgICAgIC8vIG1BdmFpbGFibGVJbnB1dERldmljZXMgbGlzdAorICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+IGluUHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1JbnB1dFByb2ZpbGVzW2pdOworCisgICAgICAgICAgICBpZiAoaW5Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiSW5wdXQgcHJvZmlsZSBjb250YWlucyBubyBkZXZpY2Ugb24gbW9kdWxlICVzIiwgbUh3TW9kdWxlc1tpXS0+bU5hbWUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gY2hvc2UgZmlyc3QgZGV2aWNlIHByZXNlbnQgaW4gbVN1cHBvcnRlZERldmljZXMgYWxzbyBwYXJ0IG9mCisgICAgICAgICAgICAvLyBpbnB1dERldmljZVR5cGVzCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJvZmlsZVR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrICA8IGluUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSA9IGluUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXNba10tPnR5cGUoKTsKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZVR5cGUgJiBpbnB1dERldmljZVR5cGVzKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgocHJvZmlsZVR5cGUgJiBpbnB1dERldmljZVR5cGVzKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbmV3IEF1ZGlvSW5wdXREZXNjcmlwdG9yKGluUHJvZmlsZSk7CisKKyAgICAgICAgICAgIGlucHV0RGVzYy0+bUlucHV0U291cmNlID0gQVVESU9fU09VUkNFX01JQzsKKyAgICAgICAgICAgIGlucHV0RGVzYy0+bURldmljZSA9IHByb2ZpbGVUeXBlOworCisgICAgICAgICAgICAvLyBmaW5kIHRoZSBhZGRyZXNzCisgICAgICAgICAgICBEZXZpY2VWZWN0b3IgaW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUocHJvZmlsZVR5cGUpOworICAgICAgICAgICAgLy8gICB0aGUgaW5wdXRzIHZlY3RvciBtdXN0IGJlIG9mIHNpemUgMSwgYnV0IHdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggaGVyZQorICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaW5wdXREZXZpY2VzLnNpemUoKSA+IDAgPyBpbnB1dERldmljZXMuaXRlbUF0KDApLT5tQWRkcmVzcworICAgICAgICAgICAgICAgICAgICA6IFN0cmluZzgoIiIpOworICAgICAgICAgICAgQUxPR1YoIiAgZm9yIGlucHV0IGRldmljZSAweCV4IHVzaW5nIGFkZHJlc3MgJXMiLCBwcm9maWxlVHlwZSwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICBBTE9HRV9JRihpbnB1dERldmljZXMuc2l6ZSgpID09IDAsICJJbnB1dCBkZXZpY2UgbGlzdCBpcyBlbXB0eSEiKTsKKworICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gaW5wdXREZXNjLT5tU2FtcGxpbmdSYXRlOworICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGlucHV0RGVzYy0+bUNoYW5uZWxNYXNrOworICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IGlucHV0RGVzYy0+bUZvcm1hdDsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3BlbklucHV0KGluUHJvZmlsZS0+Z2V0TW9kdWxlSGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0RGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FKTsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrICA8IGluUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBpblByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzW2tdLT50eXBlKCk7CisgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuaW5kZXhPZihpblByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzW2tdKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZSBhIHZhbGlkIElEIHRvIGFuIGF0dGFjaGVkIGRldmljZSBvbmNlIGNvbmZpcm1lZCBpdCBpcyByZWFjaGFibGUKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGV2RGVzYy0+aXNBdHRhY2hlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+YXR0YWNoKG1Id01vZHVsZXNbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmltcG9ydEF1ZGlvUG9ydChpblByb2ZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KGlucHV0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIkNhbm5vdCBvcGVuIGlucHV0IHN0cmVhbSBmb3IgZGV2aWNlICUwOHggb24gaHcgbW9kdWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnB1dERlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgbUh3TW9kdWxlc1tpXS0+bU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIG1ha2Ugc3VyZSBhbGwgYXR0YWNoZWQgZGV2aWNlcyBoYXZlIGJlZW4gYWxsb2NhdGVkIGEgdW5pcXVlIElECisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIDwgbUF2YWlsYWJsZU91dHB1dERldmljZXMuc2l6ZSgpOykgeworICAgICAgICBpZiAoIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldLT5pc0F0dGFjaGVkKCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJJbnB1dCBkZXZpY2UgJTA4eCB1bnJlYWNoYWJsZSIsIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldLT50eXBlKCkpOworICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIFRoZSBkZXZpY2UgaXMgbm93IHZhbGlkYXRlZCBhbmQgY2FuIGJlIGFwcGVuZGVkIHRvIHRoZSBhdmFpbGFibGUgZGV2aWNlcyBvZiB0aGUgZW5naW5lCisgICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKTsKKyAgICAgICAgaSsrOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAgPCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnNpemUoKTspIHsKKyAgICAgICAgaWYgKCFtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5pc0F0dGFjaGVkKCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJJbnB1dCBkZXZpY2UgJTA4eCB1bnJlYWNoYWJsZSIsIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPnR5cGUoKSk7CisgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnJlbW92ZShtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIFRoZSBkZXZpY2UgaXMgbm93IHZhbGlkYXRlZCBhbmQgY2FuIGJlIGFwcGVuZGVkIHRvIHRoZSBhdmFpbGFibGUgZGV2aWNlcyBvZiB0aGUgZW5naW5lCisgICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpOworICAgICAgICBpKys7CisgICAgfQorICAgIC8vIG1ha2Ugc3VyZSBkZWZhdWx0IGRldmljZSBpcyByZWFjaGFibGUKKyAgICBpZiAobUF2YWlsYWJsZU91dHB1dERldmljZXMuaW5kZXhPZihtRGVmYXVsdE91dHB1dERldmljZSkgPCAwKSB7CisgICAgICAgIEFMT0dFKCJEZWZhdWx0IGRldmljZSAlMDh4IGlzIHVucmVhY2hhYmxlIiwgbURlZmF1bHRPdXRwdXREZXZpY2UtPnR5cGUoKSk7CisgICAgfQorCisgICAgQUxPR0VfSUYoKG1QcmltYXJ5T3V0cHV0ID09IDApLCAiRmFpbGVkIHRvIG9wZW4gcHJpbWFyeSBvdXRwdXQiKTsKKworICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisKKyNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAorICAgIGlmIChtUHJpbWFyeU91dHB1dCAhPSAwKSB7CisgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dENtZCA9IEF1ZGlvUGFyYW1ldGVyKCk7CisgICAgICAgIG91dHB1dENtZC5hZGRJbnQoU3RyaW5nOCgic2V0X2lkIiksIDApOworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtUHJpbWFyeU91dHB1dC0+bUlvSGFuZGxlLCBvdXRwdXRDbWQudG9TdHJpbmcoKSk7CisKKyAgICAgICAgbVRlc3REZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgIG1UZXN0U2FtcGxpbmdSYXRlID0gNDQxMDA7CisgICAgICAgIG1UZXN0Rm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgICAgIG1UZXN0Q2hhbm5lbHMgPSAgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgICAgICBtVGVzdExhdGVuY3lNcyA9IDA7CisgICAgICAgIG1DdXJPdXRwdXQgPSAwOworICAgICAgICBtRGlyZWN0T3V0cHV0ID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RFU1RfT1VUUFVUUzsgaSsrKSB7CisgICAgICAgICAgICBtVGVzdE91dHB1dHNbaV0gPSAwOworICAgICAgICB9CisKKyAgICAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJBdWRpb1BvbGljeU1hbmFnZXJUZXN0Iik7CisgICAgICAgIHJ1bihidWZmZXIsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworICAgIH0KKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCit9CisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6fkF1ZGlvUG9saWN5TWFuYWdlcigpCit7CisjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKKyAgICBleGl0KCk7CisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQobU91dHB1dHMua2V5QXQoaSkpOworICAgfQorICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KG1JbnB1dHMua2V5QXQoaSkpOworICAgfQorICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuY2xlYXIoKTsKKyAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuY2xlYXIoKTsKKyAgIG1PdXRwdXRzLmNsZWFyKCk7CisgICBtSW5wdXRzLmNsZWFyKCk7CisgICBtSHdNb2R1bGVzLmNsZWFyKCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5pdENoZWNrKCkKK3sKKyAgICByZXR1cm4gaGFzUHJpbWFyeU91dHB1dCgpID8gTk9fRVJST1IgOiBOT19JTklUOworfQorCisjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp0aHJlYWRMb29wKCkKK3sKKyAgICBBTE9HVigiZW50ZXJpbmcgdGhyZWFkTG9vcCgpIik7CisgICAgd2hpbGUgKCFleGl0UGVuZGluZygpKQorICAgIHsKKyAgICAgICAgU3RyaW5nOCBjb21tYW5kOworICAgICAgICBpbnQgdmFsdWVJbnQ7CisgICAgICAgIFN0cmluZzggdmFsdWU7CisKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgbVdhaXRXb3JrQ1Yud2FpdFJlbGF0aXZlKG1Mb2NrLCBtaWxsaXNlY29uZHMoNTApKTsKKworICAgICAgICBjb21tYW5kID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoMCwgU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5IikpOworICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGNvbW1hbmQpOworCisgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5IiksIHZhbHVlSW50KSA9PSBOT19FUlJPUiAmJgorICAgICAgICAgICAgdmFsdWVJbnQgIT0gMCkgeworICAgICAgICAgICAgQUxPR1YoIlRlc3QgY29tbWFuZCAlcyByZWNlaXZlZCIsIGNvbW1hbmQuc3RyaW5nKCkpOworICAgICAgICAgICAgU3RyaW5nOCB0YXJnZXQ7CisgICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRhcmdldCIpLCB0YXJnZXQpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgdGFyZ2V0ID0gIk1hbmFnZXIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfb3V0cHV0IiksIHZhbHVlSW50KSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfb3V0cHV0IikpOworICAgICAgICAgICAgICAgIG1DdXJPdXRwdXQgPSB2YWx1ZUludDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2RpcmVjdCIpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2RpcmVjdCIpKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gImZhbHNlIikgeworICAgICAgICAgICAgICAgICAgICBtRGlyZWN0T3V0cHV0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAidHJ1ZSIpIHsKKyAgICAgICAgICAgICAgICAgICAgbURpcmVjdE91dHB1dCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfaW5wdXQiKSwgdmFsdWVJbnQpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9pbnB1dCIpKTsKKyAgICAgICAgICAgICAgICBtVGVzdElucHV0ID0gdmFsdWVJbnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2Zvcm1hdCIpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2Zvcm1hdCIpKTsKKyAgICAgICAgICAgICAgICBpbnQgZm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICJQQ00gMTYgYml0cyIpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAiUENNIDggYml0cyIpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV84X0JJVDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJDb21wcmVzc2VkIE1QMyIpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX01QMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfSU5WQUxJRCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09ICJNYW5hZ2VyIikgeworICAgICAgICAgICAgICAgICAgICAgICAgbVRlc3RGb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dFBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBhcmFtLmFkZEludChTdHJpbmc4KCJmb3JtYXQiKSwgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSwgb3V0cHV0UGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9jaGFubmVscyIpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2NoYW5uZWxzIikpOworICAgICAgICAgICAgICAgIGludCBjaGFubmVscyA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gIkNoYW5uZWxzIFN0ZXJlbyIpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSAgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gIkNoYW5uZWxzIE1vbm8iKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gIEFVRElPX0NIQU5ORUxfT1VUX01PTk87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjaGFubmVscyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gIk1hbmFnZXIiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVGVzdENoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dFBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBhcmFtLmFkZEludChTdHJpbmc4KCJjaGFubmVscyIpLCBjaGFubmVscyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sIG91dHB1dFBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfc2FtcGxlUmF0ZSIpLCB2YWx1ZUludCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X3NhbXBsZVJhdGUiKSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlSW50ID49IDAgJiYgdmFsdWVJbnQgPD0gOTYwMDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsaW5nUmF0ZSA9IHZhbHVlSW50OworICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09ICJNYW5hZ2VyIikgeworICAgICAgICAgICAgICAgICAgICAgICAgbVRlc3RTYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dFBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBhcmFtLmFkZEludChTdHJpbmc4KCJzYW1wbGluZ19yYXRlIiksIHNhbXBsaW5nUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sIG91dHB1dFBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9yZW9wZW4iKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9yZW9wZW4iKSk7CisKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQobXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG1QcmltYXJ5T3V0cHV0KTspOworCisgICAgICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZUhhbmRsZSA9IG1QcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKTsKKworICAgICAgICAgICAgICAgIHJlbW92ZU91dHB1dChtUHJpbWFyeU91dHB1dC0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG5ldyBBdWRpb091dHB1dERlc2NyaXB0b3IoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZSk7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSA9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrOworICAgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBvdXRwdXREZXNjLT5tRm9ybWF0OworICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChtb2R1bGVIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tTGF0ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZW9wZW4gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgInNhbXBsaW5nUmF0ZTogJWQsIGZvcm1hdCAlZCwgY2hhbm5lbHMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSwgb3V0cHV0RGVzYy0+bUZvcm1hdCwgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQgPSBvdXRwdXREZXNjOworICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRDbWQgPSBBdWRpb1BhcmFtZXRlcigpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRDbWQuYWRkSW50KFN0cmluZzgoInNldF9pZCIpLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoaGFuZGxlLCBvdXRwdXRDbWQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGFkZE91dHB1dChoYW5kbGUsIG91dHB1dERlc2MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycygwLCBTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3k9IikpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmV4aXQoKQoreworICAgIHsKKyAgICAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKKyAgICAgICAgcmVxdWVzdEV4aXQoKTsKKyAgICAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CisgICAgfQorICAgIHJlcXVlc3RFeGl0QW5kV2FpdCgpOworfQorCitpbnQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp0ZXN0T3V0cHV0SW5kZXgoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RFU1RfT1VUUFVUUzsgaSsrKSB7CisgICAgICAgIGlmIChvdXRwdXQgPT0gbVRlc3RPdXRwdXRzW2ldKSByZXR1cm4gaTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorCisvLyAtLS0KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmFkZE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjKQoreworICAgIG91dHB1dERlc2MtPnNldElvSGFuZGxlKG91dHB1dCk7CisgICAgbU91dHB1dHMuYWRkKG91dHB1dCwgb3V0cHV0RGVzYyk7CisgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbW92ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgbU91dHB1dHMucmVtb3ZlSXRlbShvdXRwdXQpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6YWRkSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MpCit7CisgICAgaW5wdXREZXNjLT5zZXRJb0hhbmRsZShpbnB1dCk7CisgICAgbUlucHV0cy5hZGQoaW5wdXQsIGlucHV0RGVzYyk7CisgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmZpbmRJb0hhbmRsZXNCeUFkZHJlc3Moc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgLyppbiovLAorICAgICAgICBjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlIC8qaW4qLywKKyAgICAgICAgY29uc3QgU3RyaW5nOCBhZGRyZXNzIC8qaW4qLywKKyAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cyAvKm91dCovKSB7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9CisgICAgICAgIGRlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5nZXREZXZpY2UoZGV2aWNlLCBhZGRyZXNzKTsKKyAgICBpZiAoZGV2RGVzYyAhPSAwKSB7CisgICAgICAgIEFMT0dWKCJmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKCk6IGFkZGluZyBvcGVuZWQgb3V0cHV0ICVkIG9uIHNhbWUgYWRkcmVzcyAlcyIsCisgICAgICAgICAgICAgIGRlc2MtPm1Jb0hhbmRsZSwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgIG91dHB1dHMuYWRkKGRlc2MtPm1Jb0hhbmRsZSk7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrT3V0cHV0c0ZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggYWRkcmVzcykKK3sKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZGV2RGVzYy0+dHlwZSgpOworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjOworCisgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZSkpIHsKKyAgICAgICAgLy8gZXJhc2UgYWxsIGN1cnJlbnQgc2FtcGxlIHJhdGVzLCBmb3JtYXRzIGFuZCBjaGFubmVsIG1hc2tzCisgICAgICAgIGRldkRlc2MtPmNsZWFyQ2FwYWJpbGl0aWVzKCk7CisgICAgfQorCisgICAgaWYgKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKSB7CisgICAgICAgIC8vIGZpcnN0IGxpc3QgYWxyZWFkeSBvcGVuIG91dHB1dHMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiAoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpICYgZGV2aWNlKSkgeworICAgICAgICAgICAgICAgIGlmICghZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIG9wZW5lZCBvdXRwdXQgJWQiLCBtT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiICBjaGVja2luZyBhZGRyZXNzIG1hdGNoIGR1ZSB0byBkZXZpY2UgMHgleCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgICAgIGZpbmRJb0hhbmRsZXNCeUFkZHJlc3MoZGVzYywgZGV2aWNlLCBhZGRyZXNzLCBvdXRwdXRzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gdGhlbiBsb29rIGZvciBvdXRwdXQgcHJvZmlsZXMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCisgICAgICAgIFNvcnRlZFZlY3Rvcjwgc3A8SU9Qcm9maWxlPiA+IHByb2ZpbGVzOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlc1tqXTsKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPT0gcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXNbMF0tPm1BZGRyZXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlcy5hZGQocHJvZmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBwcm9maWxlICV6dSBmcm9tIG1vZHVsZSAlenUiLCBqLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCIgIGZvdW5kICVkIHByb2ZpbGVzLCAlZCBvdXRwdXRzIiwgcHJvZmlsZXMuc2l6ZSgpLCBvdXRwdXRzLnNpemUoKSk7CisKKyAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSAmJiBvdXRwdXRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBObyBvdXRwdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgJTA0eCIsIGRldmljZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgLy8gb3BlbiBvdXRwdXRzIGZvciBtYXRjaGluZyBwcm9maWxlcyBpZiBuZWVkZWQuIERpcmVjdCBvdXRwdXRzIGFyZSBhbHNvIG9wZW5lZCB0bworICAgICAgICAvLyBxdWVyeSBmb3IgZHluYW1pYyBwYXJhbWV0ZXJzIGFuZCB3aWxsIGJlIGNsb3NlZCBsYXRlciBieSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKQorICAgICAgICBmb3IgKHNzaXplX3QgcHJvZmlsZV9pbmRleCA9IDA7IHByb2ZpbGVfaW5kZXggPCAoc3NpemVfdClwcm9maWxlcy5zaXplKCk7IHByb2ZpbGVfaW5kZXgrKykgeworICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gcHJvZmlsZXNbcHJvZmlsZV9pbmRleF07CisKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaWYgb25lIG91dHB1dCBpcyBhbHJlYWR5IG9wZW5lZCBmb3IgdGhpcyBwcm9maWxlCisgICAgICAgICAgICBzaXplX3QgajsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBvdXRwdXRzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHMuaXRlbUF0KGopKTsKKyAgICAgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIGRlc2MtPm1Qcm9maWxlID09IHByb2ZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hpbmcgcHJvZmlsZTogc2F2ZSB0aGUgc2FtcGxlIHJhdGVzLCBmb3JtYXQgYW5kIGNoYW5uZWwgbWFza3Mgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSBwcm9maWxlIGluIG91ciBkZXZpY2UgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqICE9IG91dHB1dHMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dWKCJvcGVuaW5nIG91dHB1dCBmb3IgZGV2aWNlICUwOHggd2l0aCBwYXJhbXMgJXMgcHJvZmlsZSAlcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCksIHByb2ZpbGUuZ2V0KCkpOworICAgICAgICAgICAgZGVzYyA9IG5ldyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihwcm9maWxlLCBtcENsaWVudEludGVyZmFjZSk7CisgICAgICAgICAgICBkZXNjLT5tRGV2aWNlID0gZGV2aWNlOworICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gZGVzYy0+bVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBkZXNjLT5tQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gZGVzYy0+bUZvcm1hdDsKKyAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uc2FtcGxlX3JhdGUgPSBkZXNjLT5tU2FtcGxpbmdSYXRlOworICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5jaGFubmVsX21hc2sgPSBkZXNjLT5tQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLmZvcm1hdCA9IGRlc2MtPm1Gb3JtYXQ7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KHByb2ZpbGUtPmdldE1vZHVsZUhhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYy0+bUxhdGVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tRmxhZ3MpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGRlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgZGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgICAgICAgICBkZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKworICAgICAgICAgICAgICAgIC8vIEhlcmUgaXMgd2hlcmUgdGhlIG91dF9zZXRfcGFyYW1ldGVycygpIGZvciBjYXJkICYgZGV2aWNlIGdldHMgY2FsbGVkCisgICAgICAgICAgICAgICAgaWYgKCFhZGRyZXNzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBjaGFyICpwYXJhbSA9IGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcihkZXZpY2UsIGFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhvdXRwdXQsIFN0cmluZzgocGFyYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShwYXJhbSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSGVyZSBpcyB3aGVyZSB3ZSBzdGVwIHRocm91Z2ggYW5kIHJlc29sdmUgYW55ICJkeW5hbWljIiBmaWVsZHMKKyAgICAgICAgICAgICAgICBTdHJpbmc4IHJlcGx5OworICAgICAgICAgICAgICAgIGNoYXIgKnZhbHVlOworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMob3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX1NBTVBMSU5HX1JBVEVTKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnBicmsoKGNoYXIgKilyZXBseS5zdHJpbmcoKSwgIj0iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRTYW1wbGluZ1JhdGVzKHZhbHVlICsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMob3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9GT1JNQVRTKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBzdXBwb3J0ZWQgZm9ybWF0cyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RycGJyaygoY2hhciAqKXJlcGx5LnN0cmluZygpLCAiPSIpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEZvcm1hdHModmFsdWUgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMob3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX0NIQU5ORUxTKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBzdXBwb3J0ZWQgY2hhbm5lbCBtYXNrcyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RycGJyaygoY2hhciAqKXJlcGx5LnN0cmluZygpLCAiPSIpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bG9hZE91dENoYW5uZWxzKHZhbHVlICsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCgocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXNbMF0gPT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIDwgMikpIHx8CisgICAgICAgICAgICAgICAgICAgICAoKHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgPCAyKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICgocHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLnNpemUoKSA8IDIpKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgbWlzc2luZyBwYXJhbSIpOworICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlc1swXSA9PSAwIHx8IHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHByb2ZpbGUtPnBpY2tTYW1wbGluZ1JhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IHByb2ZpbGUtPnBpY2tDaGFubmVsTWFzaygpOworICAgICAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gcHJvZmlsZS0+cGlja0Zvcm1hdCgpOworICAgICAgICAgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLnNhbXBsZV9yYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICAgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLmNoYW5uZWxfbWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uZm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQocHJvZmlsZS0+Z2V0TW9kdWxlSGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYy0+bUxhdGVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1GbGFncyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgZGVzYyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkgJiYgYWRkcmVzcyAhPSAiMCIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXg7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBvbGljeU1peGVzLmdldEF1ZGlvUG9saWN5TWl4KGFkZHJlc3MsIHBvbGljeU1peCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgY2Fubm90IGZpbmQgcG9saWN5IGZvciBhZGRyZXNzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeU1peC0+c2V0T3V0cHV0KGRlc2MpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bVBvbGljeU1peCA9IHBvbGljeU1peC0+Z2V0TWl4KCk7CisKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgPT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1ByaW1hcnlPdXRwdXQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gZHVwbGljYXRlZCBvdXRwdXQgZm9yIGRpcmVjdCBvdXRwdXRzIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0cHV0cyB1c2VkIGJ5IGR5bmFtaWMgcG9saWN5IG1peGVzCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkdXBsaWNhdGVkT3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBpbml0aWFsIHN0cmVhbSB2b2x1bWUgZm9yIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKGRlc2MsIGRldmljZSwgMCwgdHJ1ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogY29uZmlndXJlIGF1ZGlvIGVmZmVjdCBvdXRwdXQgc3RhZ2UgaGVyZQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcGVuIGEgZHVwbGljYXRpbmcgb3V0cHV0IHRocmVhZCBmb3IgdGhlIG5ldyBvdXRwdXQgYW5kIHRoZSBwcmltYXJ5IG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlZE91dHB1dCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuRHVwbGljYXRlT3V0cHV0KG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHVwbGljYXRlZE91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBkdXBsaWNhdGVkIG91dHB1dCBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGR1cE91dHB1dERlc2MgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKE5VTEwsIG1wQ2xpZW50SW50ZXJmYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MSA9IG1QcmltYXJ5T3V0cHV0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1PdXRwdXQyID0gZGVzYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gZGVzYy0+bVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tRm9ybWF0ID0gZGVzYy0+bUZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBkZXNjLT5tQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bUxhdGVuY3kgPSBkZXNjLT5tTGF0ZW5jeTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRPdXRwdXQoZHVwbGljYXRlZE91dHB1dCwgZHVwT3V0cHV0RGVzYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKGR1cE91dHB1dERlc2MsIGRldmljZSwgMCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBjb3VsZCBub3Qgb3BlbiBkdXAgb3V0cHV0IGZvciAlZCBhbmQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQtPm1Jb0hhbmRsZSwgb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgY291bGQgbm90IG9wZW4gb3V0cHV0IGZvciBkZXZpY2UgJXgiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIHByb2ZpbGVzLnJlbW92ZUF0KHByb2ZpbGVfaW5kZXgpOworICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgtLTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAvLyBMb2FkIGRpZ2l0YWwgZm9ybWF0IGluZm8gb25seSBmb3IgZGlnaXRhbCBkZXZpY2VzCisgICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBzZXRPdXRwdXREZXZpY2UoZGV2PTB4JXgsIGFkZHI9JXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2UoZGVzYywgZGV2aWNlLCB0cnVlLypmb3JjZSovLCAwLypkZWxheSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwvKnBhdGNoIGhhbmRsZSovLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBhZGRpbmcgb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcm9maWxlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogTm8gb3V0cHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlICUwNHgiLCBkZXZpY2UpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIERpc2Nvbm5lY3QKKyAgICAgICAgLy8gY2hlY2sgaWYgb25lIG9wZW5lZCBvdXRwdXQgaXMgbm90IG5lZWRlZCBhbnkgbW9yZSBhZnRlciBkaXNjb25uZWN0aW5nIG9uZSBkZXZpY2UKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gZXhhY3QgbWF0Y2ggb24gZGV2aWNlCisgICAgICAgICAgICAgICAgaWYgKGRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSA9PSBkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmRJb0hhbmRsZXNCeUFkZHJlc3MoZGVzYywgZGV2aWNlLCBhZGRyZXNzLCBvdXRwdXRzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpICYgbUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBkaXNjb25uZWN0aW5nIGFkZGluZyBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQobU91dHB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBDbGVhciBhbnkgcHJvZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXNjb25uZWN0ZWQgZGV2aWNlLgorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlc1tqXTsKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xlYXJpbmcgZGlyZWN0IG91dHB1dCBwcm9maWxlICV6dSBvbiBtb2R1bGUgJXp1IiwgaiwgaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuYWRkKDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tRm9ybWF0c1swXSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUZvcm1hdHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmFkZChBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1DaGFubmVsTWFza3NbMF0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5hZGQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrSW5wdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgaW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGFkZHJlc3MpCit7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGRldkRlc2MtPnR5cGUoKTsKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZGVzYzsKKworICAgIGlmIChhdWRpb19kZXZpY2VfaXNfZGlnaXRhbChkZXZpY2UpKSB7CisgICAgICAgIC8vIGVyYXNlIGFsbCBjdXJyZW50IHNhbXBsZSByYXRlcywgZm9ybWF0cyBhbmQgY2hhbm5lbCBtYXNrcworICAgICAgICBkZXZEZXNjLT5jbGVhckNhcGFiaWxpdGllcygpOworICAgIH0KKworICAgIGlmIChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSkgeworICAgICAgICAvLyBmaXJzdCBsaXN0IGFscmVhZHkgb3BlbiBpbnB1dHMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCisgICAgICAgIGZvciAoc2l6ZV90IGlucHV0X2luZGV4ID0gMDsgaW5wdXRfaW5kZXggPCBtSW5wdXRzLnNpemUoKTsgaW5wdXRfaW5kZXgrKykgeworICAgICAgICAgICAgZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbnB1dF9pbmRleCk7CisgICAgICAgICAgICBpZiAoZGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJiAoZGV2aWNlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBvcGVuZWQgaW5wdXQgJWQiLCBtSW5wdXRzLmtleUF0KGlucHV0X2luZGV4KSk7CisgICAgICAgICAgICAgICBpbnB1dHMuYWRkKG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoZW4gbG9vayBmb3IgaW5wdXQgcHJvZmlsZXMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCisgICAgICAgIFNvcnRlZFZlY3Rvcjwgc3A8SU9Qcm9maWxlPiA+IHByb2ZpbGVzOworICAgICAgICBmb3IgKHNpemVfdCBtb2R1bGVfaWR4ID0gMDsgbW9kdWxlX2lkeCA8IG1Id01vZHVsZXMuc2l6ZSgpOyBtb2R1bGVfaWR4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtSHdNb2R1bGVzW21vZHVsZV9pZHhdLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IHByb2ZpbGVfaW5kZXggPSAwOworICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4IDwgbUh3TW9kdWxlc1ttb2R1bGVfaWR4XS0+bUlucHV0UHJvZmlsZXMuc2l6ZSgpOworICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1ttb2R1bGVfaWR4XS0+bUlucHV0UHJvZmlsZXNbcHJvZmlsZV9pbmRleF07CisKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIChkZXZpY2UgJiB+QVVESU9fREVWSUNFX0JJVF9JTikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID09IHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzWzBdLT5tQWRkcmVzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMuYWRkKHByb2ZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBwcm9maWxlICV6dSBmcm9tIG1vZHVsZSAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCwgbW9kdWxlX2lkeCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpICYmIGlucHV0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBObyBpbnB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAweCVYIiwgZGV2aWNlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICAvLyBvcGVuIGlucHV0cyBmb3IgbWF0Y2hpbmcgcHJvZmlsZXMgaWYgbmVlZGVkLiBEaXJlY3QgaW5wdXRzIGFyZSBhbHNvIG9wZW5lZCB0bworICAgICAgICAvLyBxdWVyeSBmb3IgZHluYW1pYyBwYXJhbWV0ZXJzIGFuZCB3aWxsIGJlIGNsb3NlZCBsYXRlciBieSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKQorICAgICAgICBmb3IgKHNzaXplX3QgcHJvZmlsZV9pbmRleCA9IDA7IHByb2ZpbGVfaW5kZXggPCAoc3NpemVfdClwcm9maWxlcy5zaXplKCk7IHByb2ZpbGVfaW5kZXgrKykgeworCisgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBwcm9maWxlc1twcm9maWxlX2luZGV4XTsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaWYgb25lIGlucHV0IGlzIGFscmVhZHkgb3BlbmVkIGZvciB0aGlzIHByb2ZpbGUKKyAgICAgICAgICAgIHNpemVfdCBpbnB1dF9pbmRleDsKKyAgICAgICAgICAgIGZvciAoaW5wdXRfaW5kZXggPSAwOyBpbnB1dF9pbmRleCA8IG1JbnB1dHMuc2l6ZSgpOyBpbnB1dF9pbmRleCsrKSB7CisgICAgICAgICAgICAgICAgZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbnB1dF9pbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKGRlc2MtPm1Qcm9maWxlID09IHByb2ZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5wdXRfaW5kZXggIT0gbUlucHV0cy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR1YoIm9wZW5pbmcgaW5wdXQgZm9yIGRldmljZSAweCVYIHdpdGggcGFyYW1zICVzIiwgZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgIGRlc2MgPSBuZXcgQXVkaW9JbnB1dERlc2NyaXB0b3IocHJvZmlsZSk7CisgICAgICAgICAgICBkZXNjLT5tRGV2aWNlID0gZGV2aWNlOworICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gZGVzYy0+bVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBkZXNjLT5tQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gZGVzYy0+bUZvcm1hdDsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3BlbklucHV0KHByb2ZpbGUtPmdldE1vZHVsZUhhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfTUlDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUgLypGSVhNRSovKTsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGRlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgZGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgICAgICAgICBkZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKworICAgICAgICAgICAgICAgIGlmICghYWRkcmVzcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0gPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoZGV2aWNlLCBhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoaW5wdXQsIFN0cmluZzgocGFyYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShwYXJhbSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSGVyZSBpcyB3aGVyZSB3ZSBzdGVwIHRocm91Z2ggYW5kIHJlc29sdmUgYW55ICJkeW5hbWljIiBmaWVsZHMKKyAgICAgICAgICAgICAgICBTdHJpbmc4IHJlcGx5OworICAgICAgICAgICAgICAgIGNoYXIgKnZhbHVlOworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfU0FNUExJTkdfUkFURVMpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCkgZGlyZWN0IGlucHV0IHN1cCBzYW1wbGluZyByYXRlcyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RycGJyaygoY2hhciAqKXJlcGx5LnN0cmluZygpLCAiPSIpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bG9hZFNhbXBsaW5nUmF0ZXModmFsdWUgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfRk9STUFUUykpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKSBkaXJlY3QgaW5wdXQgc3VwIGZvcm1hdHMgJXMiLCByZXBseS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RycGJyaygoY2hhciAqKXJlcGx5LnN0cmluZygpLCAiPSIpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEZvcm1hdHModmFsdWUgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfQ0hBTk5FTFMpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCkgZGlyZWN0IGlucHV0IHN1cCBjaGFubmVsIG1hc2tzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJwYnJrKChjaGFyICopcmVwbHkuc3RyaW5nKCksICI9Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5sb2FkSW5DaGFubmVscyh2YWx1ZSArIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDApICYmIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgPCAyKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICgocHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gMCkgJiYgKHByb2ZpbGUtPm1Gb3JtYXRzLnNpemUoKSA8IDIpKSB8fAorICAgICAgICAgICAgICAgICAgICAgKChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzWzBdID09IDApICYmIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLnNpemUoKSA8IDIpKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKSBkaXJlY3QgaW5wdXQgbWlzc2luZyBwYXJhbSIpOworICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VJbnB1dChpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGlucHV0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkSW5wdXQoaW5wdXQsIGRlc2MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLy8gZW5kaWYgaW5wdXQgIT0gMAorCisgICAgICAgICAgICBpZiAoaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKSBjb3VsZCBub3Qgb3BlbiBpbnB1dCBmb3IgZGV2aWNlIDB4JVgiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIHByb2ZpbGVzLnJlbW92ZUF0KHByb2ZpbGVfaW5kZXgpOworICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgtLTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5wdXRzLmFkZChpbnB1dCk7CisgICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIGlucHV0ICVkIiwgaW5wdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9IC8vIGVuZCBzY2FuIHByb2ZpbGVzCisKKyAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR1coImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IE5vIGlucHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlIDB4JVgiLCBkZXZpY2UpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIERpc2Nvbm5lY3QKKyAgICAgICAgLy8gY2hlY2sgaWYgb25lIG9wZW5lZCBpbnB1dCBpcyBub3QgbmVlZGVkIGFueSBtb3JlIGFmdGVyIGRpc2Nvbm5lY3Rpbmcgb25lIGRldmljZQorICAgICAgICBmb3IgKHNpemVfdCBpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKKyAgICAgICAgICAgIGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5wdXRfaW5kZXgpOworICAgICAgICAgICAgaWYgKCEoZGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJiBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJgorICAgICAgICAgICAgICAgICAgICB+QVVESU9fREVWSUNFX0JJVF9JTikpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogZGlzY29ubmVjdGluZyBhZGRpbmcgaW5wdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKKyAgICAgICAgICAgICAgICBpbnB1dHMuYWRkKG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBDbGVhciBhbnkgcHJvZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXNjb25uZWN0ZWQgZGV2aWNlLgorICAgICAgICBmb3IgKHNpemVfdCBtb2R1bGVfaW5kZXggPSAwOyBtb2R1bGVfaW5kZXggPCBtSHdNb2R1bGVzLnNpemUoKTsgbW9kdWxlX2luZGV4KyspIHsKKyAgICAgICAgICAgIGlmIChtSHdNb2R1bGVzW21vZHVsZV9pbmRleF0tPm1IYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChzaXplX3QgcHJvZmlsZV9pbmRleCA9IDA7CisgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXggPCBtSHdNb2R1bGVzW21vZHVsZV9pbmRleF0tPm1JbnB1dFByb2ZpbGVzLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCsrKSB7CisgICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1ttb2R1bGVfaW5kZXhdLT5tSW5wdXRQcm9maWxlc1twcm9maWxlX2luZGV4XTsKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIChkZXZpY2UgJiB+QVVESU9fREVWSUNFX0JJVF9JTikpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGNsZWFyaW5nIGRpcmVjdCBpbnB1dCBwcm9maWxlICV6dSBvbiBtb2R1bGUgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCwgbW9kdWxlX2luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5hZGQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tRm9ybWF0cy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmFkZCgwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gLy8gZW5kIGRpc2Nvbm5lY3QKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIEFMT0dWKCJjbG9zZU91dHB1dCglZCkiLCBvdXRwdXQpOworCisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgIGlmIChvdXRwdXREZXNjID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coImNsb3NlT3V0cHV0KCkgdW5rbm93biBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1Qb2xpY3lNaXhlcy5jbG9zZU91dHB1dChvdXRwdXREZXNjKTsKKworICAgIC8vIGxvb2sgZm9yIGR1cGxpY2F0ZWQgb3V0cHV0cyBjb25uZWN0ZWQgdG8gdGhlIG91dHB1dCBiZWluZyByZW1vdmVkLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGR1cE91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoZHVwT3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYKKyAgICAgICAgICAgICAgICAoZHVwT3V0cHV0RGVzYy0+bU91dHB1dDEgPT0gb3V0cHV0RGVzYyB8fAorICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1PdXRwdXQyID09IG91dHB1dERlc2MpKSB7CisgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MyOworICAgICAgICAgICAgaWYgKGR1cE91dHB1dERlc2MtPm1PdXRwdXQxID09IG91dHB1dERlc2MpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjMiA9IGR1cE91dHB1dERlc2MtPm1PdXRwdXQyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjMiA9IGR1cE91dHB1dERlc2MtPm1PdXRwdXQxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQXMgYWxsIGFjdGl2ZSB0cmFja3Mgb24gZHVwbGljYXRlZCBvdXRwdXQgd2lsbCBiZSBkZWxldGVkLAorICAgICAgICAgICAgLy8gYW5kIGFzIHRoZXkgd2VyZSBhbHNvIHJlZmVyZW5jZWQgb24gdGhlIG90aGVyIG91dHB1dCwgdGhlIHJlZmVyZW5jZQorICAgICAgICAgICAgLy8gY291bnQgZm9yIHRoZWlyIHN0cmVhbSB0eXBlIG11c3QgYmUgYWRqdXN0ZWQgYWNjb3JkaW5nbHkgb24KKyAgICAgICAgICAgIC8vIHRoZSBvdGhlciBvdXRwdXQuCisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IEFVRElPX1NUUkVBTV9DTlQ7IGorKykgeworICAgICAgICAgICAgICAgIGludCByZWZDb3VudCA9IGR1cE91dHB1dERlc2MtPm1SZWZDb3VudFtqXTsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjMi0+Y2hhbmdlUmVmQ291bnQoKGF1ZGlvX3N0cmVhbV90eXBlX3QpaiwtcmVmQ291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHVwbGljYXRlZE91dHB1dCA9IG1PdXRwdXRzLmtleUF0KGkpOworICAgICAgICAgICAgQUxPR1YoImNsb3NlT3V0cHV0KCkgY2xvc2luZyBhbHNvIGR1cGxpY2F0ZWQgb3V0cHV0ICVkIiwgZHVwbGljYXRlZE91dHB1dCk7CisKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChkdXBsaWNhdGVkT3V0cHV0KTsKKyAgICAgICAgICAgIHJlbW92ZU91dHB1dChkdXBsaWNhdGVkT3V0cHV0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICBtQXVkaW9QYXRjaGVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgIH0KKworICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOworICAgIHBhcmFtLmFkZChTdHJpbmc4KCJjbG9zaW5nIiksIFN0cmluZzgoInRydWUiKSk7CisgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMob3V0cHV0LCBwYXJhbS50b1N0cmluZygpKTsKKworICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOworICAgIHJlbW92ZU91dHB1dChvdXRwdXQpOworICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsb3NlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCit7CisgICAgQUxPR1YoImNsb3NlSW5wdXQoJWQpIiwgaW5wdXQpOworCisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVGb3IoaW5wdXQpOworICAgIGlmIChpbnB1dERlc2MgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiY2xvc2VJbnB1dCgpIHVua25vd24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworCisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICBtQXVkaW9QYXRjaGVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgIH0KKworICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KGlucHV0KTsKKyAgICBtSW5wdXRzLnJlbW92ZUl0ZW0oaW5wdXQpOworfQorCitTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0c0ZvckRldmljZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uIG9wZW5PdXRwdXRzKQoreworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0czsKKworICAgIEFMT0dWVigiZ2V0T3V0cHV0c0ZvckRldmljZSgpIGRldmljZSAlMDR4IiwgZGV2aWNlKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9wZW5PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEFMT0dWVigib3V0cHV0ICVkIGlzRHVwbGljYXRlZD0lZCBkZXZpY2U9JTA0eCIsCisgICAgICAgICAgICAgICAgaSwgb3Blbk91dHB1dHMudmFsdWVBdChpKS0+aXNEdXBsaWNhdGVkKCksCisgICAgICAgICAgICAgICAgb3Blbk91dHB1dHMudmFsdWVBdChpKS0+c3VwcG9ydGVkRGV2aWNlcygpKTsKKyAgICAgICAgaWYgKChkZXZpY2UgJiBvcGVuT3V0cHV0cy52YWx1ZUF0KGkpLT5zdXBwb3J0ZWREZXZpY2VzKCkpID09IGRldmljZSkgeworICAgICAgICAgICAgQUxPR1ZWKCJnZXRPdXRwdXRzRm9yRGV2aWNlKCkgZm91bmQgb3V0cHV0ICVkIiwgb3Blbk91dHB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgb3V0cHV0cy5hZGQob3Blbk91dHB1dHMua2V5QXQoaSkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBvdXRwdXRzOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6dmVjdG9yc0VxdWFsKFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMikKK3sKKyAgICBpZiAob3V0cHV0czEuc2l6ZSgpICE9IG91dHB1dHMyLnNpemUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0czEuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG91dHB1dHMxW2ldICE9IG91dHB1dHMyW2ldKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja091dHB1dEZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCit7CisgICAgYXVkaW9fZGV2aWNlc190IG9sZERldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBzcmNPdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShvbGREZXZpY2UsIG1QcmV2aW91c091dHB1dHMpOworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gZHN0T3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UobmV3RGV2aWNlLCBtT3V0cHV0cyk7CisKKyAgICAvLyBhbHNvIHRha2UgaW50byBhY2NvdW50IGV4dGVybmFsIHBvbGljeS1yZWxhdGVkIGNoYW5nZXM6IGFkZCBhbGwgb3V0cHV0cyB3aGljaCBhcmUKKyAgICAvLyBhc3NvY2lhdGVkIHdpdGggcG9saWNpZXMgaW4gdGhlICJiZWZvcmUiIGFuZCAiYWZ0ZXIiIG91dHB1dCB2ZWN0b3JzCisgICAgQUxPR1ZWKCJjaGVja091dHB1dEZvclN0cmF0ZWd5KCk6IHBvbGljeSByZWxhdGVkIG91dHB1dHMiKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMCA7IGkgPCBtUHJldmlvdXNPdXRwdXRzLnNpemUoKSA7IGkrKykgeworICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1QcmV2aW91c091dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGRlc2MgIT0gMCAmJiBkZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNyY091dHB1dHMuYWRkKGRlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICBBTE9HVlYoIiBwcmV2aW91cyBvdXRwdXRzOiBhZGRpbmcgJWQiLCBkZXNjLT5tSW9IYW5kbGUpOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IG1PdXRwdXRzLnNpemUoKSA7IGkrKykgeworICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChkZXNjICE9IDAgJiYgZGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKSB7CisgICAgICAgICAgICBkc3RPdXRwdXRzLmFkZChkZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgQUxPR1ZWKCIgbmV3IG91dHB1dHM6IGFkZGluZyAlZCIsIGRlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXZlY3RvcnNFcXVhbChzcmNPdXRwdXRzLGRzdE91dHB1dHMpKSB7CisgICAgICAgIEFMT0dWKCJjaGVja091dHB1dEZvclN0cmF0ZWd5KCkgc3RyYXRlZ3kgJWQsIG1vdmluZyBmcm9tIG91dHB1dCAlZCB0byBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICBzdHJhdGVneSwgc3JjT3V0cHV0c1swXSwgZHN0T3V0cHV0c1swXSk7CisgICAgICAgIC8vIG11dGUgc3RyYXRlZ3kgd2hpbGUgbW92aW5nIHRyYWNrcyBmcm9tIG9uZSBvdXRwdXQgdG8gYW5vdGhlcgorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNyY091dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Ioc3JjT3V0cHV0c1tpXSk7CisgICAgICAgICAgICBpZiAoaXNTdHJhdGVneUFjdGl2ZShkZXNjLCBzdHJhdGVneSkpIHsKKyAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoc3RyYXRlZ3ksIHRydWUsIGRlc2MpOworICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShzdHJhdGVneSwgZmFsc2UsIGRlc2MsIE1VVEVfVElNRV9NUywgbmV3RGV2aWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE1vdmUgZWZmZWN0cyBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyYXRlZ3kgZnJvbSBwcmV2aW91cyBvdXRwdXQgdG8gbmV3IG91dHB1dAorICAgICAgICBpZiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfTUVESUEpIHsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGZ4T3V0cHV0ID0gc2VsZWN0T3V0cHV0Rm9yRWZmZWN0cyhkc3RPdXRwdXRzKTsKKyAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gbW92ZWQ7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IG1FZmZlY3RzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGVmZmVjdERlc2MtPm1TZXNzaW9uID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bUlvICE9IGZ4T3V0cHV0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtb3ZlZC5pbmRleE9mKGVmZmVjdERlc2MtPm1JbykgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIG1vdmluZyBlZmZlY3QgJWQgdG8gb3V0cHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzLmtleUF0KGkpLCBmeE91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+bW92ZUVmZmVjdHMoQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLCBlZmZlY3REZXNjLT5tSW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnhPdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgbW92ZWQuYWRkKGVmZmVjdERlc2MtPm1Jbyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bUlvID0gZnhPdXRwdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE1vdmUgdHJhY2tzIGFzc29jaWF0ZWQgdG8gdGhpcyBzdHJhdGVneSBmcm9tIHByZXZpb3VzIG91dHB1dCB0byBuZXcgb3V0cHV0CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA9PSBBVURJT19TVFJFQU1fUEFUQ0gpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpKSA9PSBzdHJhdGVneSkgeworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKChhdWRpb19zdHJlYW1fdHlwZV90KWkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkKK3sKKyAgICBpZiAobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpCisgICAgICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSk7CisgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSk7CisgICAgaWYgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKQorICAgICAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpOworICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OKTsKKyAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKTsKKyAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkpOworICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEpOworICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfRFRNRik7CisgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9SRVJPVVRJTkcpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tBMmRwU3VzcGVuZCgpCit7CisgICAgYXVkaW9faW9faGFuZGxlX3QgYTJkcE91dHB1dCA9IG1PdXRwdXRzLmdldEEyZHBPdXRwdXQoKTsKKyAgICBpZiAoYTJkcE91dHB1dCA9PSAwKSB7CisgICAgICAgIG1BMmRwU3VzcGVuZGVkID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGlzU2NvQ29ubmVjdGVkID0KKyAgICAgICAgICAgICgobUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCAmCisgICAgICAgICAgICAgICAgICAgIH5BVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwKSB8fAorICAgICAgICAgICAgKChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgQVVESU9fREVWSUNFX09VVF9BTExfU0NPKSAhPSAwKTsKKyAgICAvLyBzdXNwZW5kIEEyRFAgb3V0cHV0IGlmOgorICAgIC8vICAgICAgKE5PVCBhbHJlYWR5IHN1c3BlbmRlZCkgJiYKKyAgICAvLyAgICAgICgoU0NPIGRldmljZSBpcyBjb25uZWN0ZWQgJiYKKyAgICAvLyAgICAgICAoZm9yY2VkIHVzYWdlIGZvciBjb21tdW5pY2F0aW9uIHx8IGZvciByZWNvcmQgaXMgU0NPKSkpIHx8CisgICAgLy8gICAgICAocGhvbmUgc3RhdGUgaXMgcmluZ2luZyB8fCBpbiBjYWxsKQorICAgIC8vCisgICAgLy8gcmVzdG9yZSBBMkRQIG91dHB1dCBpZjoKKyAgICAvLyAgICAgIChBbHJlYWR5IHN1c3BlbmRlZCkgJiYKKyAgICAvLyAgICAgICgoU0NPIGRldmljZSBpcyBOT1QgY29ubmVjdGVkIHx8CisgICAgLy8gICAgICAgKGZvcmNlZCB1c2FnZSBOT1QgZm9yIGNvbW11bmljYXRpb24gJiYgTk9UIGZvciByZWNvcmQgaXMgU0NPKSkpICYmCisgICAgLy8gICAgICAocGhvbmUgc3RhdGUgaXMgTk9UIHJpbmdpbmcgJiYgTk9UIGluIGNhbGwpCisgICAgLy8KKyAgICBpZiAobUEyZHBTdXNwZW5kZWQpIHsKKyAgICAgICAgaWYgKCghaXNTY29Db25uZWN0ZWQgfHwKKyAgICAgICAgICAgICAoKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTikgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgJiYKKyAgICAgICAgICAgICAgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEKSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSkpICYmCisgICAgICAgICAgICAgKChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgIT0gQVVESU9fTU9ERV9JTl9DQUxMKSAmJgorICAgICAgICAgICAgICAobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpICE9IEFVRElPX01PREVfUklOR1RPTkUpKSkgeworCisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVzdG9yZU91dHB1dChhMmRwT3V0cHV0KTsKKyAgICAgICAgICAgIG1BMmRwU3VzcGVuZGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKGlzU2NvQ29ubmVjdGVkICYmCisgICAgICAgICAgICAgKChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT04pID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pIHx8CisgICAgICAgICAgICAgIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRCkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykpKSB8fAorICAgICAgICAgICAgICgobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpID09IEFVRElPX01PREVfSU5fQ0FMTCkgfHwKKyAgICAgICAgICAgICAgKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSA9PSBBVURJT19NT0RFX1JJTkdUT05FKSkpIHsKKworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnN1c3BlbmRPdXRwdXQoYTJkcE91dHB1dCk7CisgICAgICAgICAgICBtQTJkcFN1c3BlbmRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE5ld091dHB1dERldmljZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKQoreworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkob3V0cHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBpZiAocGF0Y2hEZXNjLT5tVWlkICE9IG1VaWRDYWNoZWQpIHsKKyAgICAgICAgICAgIEFMT0dWKCJnZXROZXdPdXRwdXREZXZpY2UoKSBkZXZpY2UgJTA4eCBmb3JjZWQgYnkgcGF0Y2ggJWQiLAorICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZGV2aWNlKCksIG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgICAgICAgICByZXR1cm4gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjaGVjayB0aGUgZm9sbG93aW5nIGJ5IG9yZGVyIG9mIHByaW9yaXR5IHRvIHJlcXVlc3QgYSByb3V0aW5nIGNoYW5nZSBpZiBuZWNlc3Nhcnk6CisgICAgLy8gMTogdGhlIHN0cmF0ZWd5IGVuZm9yY2VkIGF1ZGlibGUgaXMgYWN0aXZlIGFuZCBlbmZvcmNlZCBvbiB0aGUgb3V0cHV0OgorICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgZW5mb3JjZWQgYXVkaWJsZQorICAgIC8vIDI6IHdlIGFyZSBpbiBjYWxsIG9yIHRoZSBzdHJhdGVneSBwaG9uZSBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKKyAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IHBob25lCisgICAgLy8gMzogdGhlIHN0cmF0ZWd5IGZvciBlbmZvcmNlZCBhdWRpYmxlIGlzIGFjdGl2ZSBidXQgbm90IGVuZm9yY2VkIG9uIHRoZSBvdXRwdXQ6CisgICAgLy8gICAgICB1c2UgdGhlIGRldmljZSBmb3Igc3RyYXRlZ3kgZW5mb3JjZWQgYXVkaWJsZQorICAgIC8vIDQ6IHRoZSBzdHJhdGVneSBhY2Nlc3NpYmlsaXR5IGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgorICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgYWNjZXNzaWJpbGl0eQorICAgIC8vIDU6IHRoZSBzdHJhdGVneSBzb25pZmljYXRpb24gaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6CisgICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBzb25pZmljYXRpb24KKyAgICAvLyA2OiB0aGUgc3RyYXRlZ3kgInJlc3BlY3RmdWwiIHNvbmlmaWNhdGlvbiBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKKyAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5ICJyZXNwZWN0ZnVsIiBzb25pZmljYXRpb24KKyAgICAvLyA3OiB0aGUgc3RyYXRlZ3kgbWVkaWEgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6CisgICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBtZWRpYQorICAgIC8vIDg6IHRoZSBzdHJhdGVneSBEVE1GIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgorICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgRFRNRgorICAgIC8vIDk6IHRoZSBzdHJhdGVneSBmb3IgYmVhY29uLCBhLmsuYS4gInRyYW5zbWl0dGVkIHRocm91Z2ggc3BlYWtlciIgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6CisgICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSB0LXQtcworICAgIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpICYmCisgICAgICAgIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsIGZyb21DYWNoZSk7CisgICAgfSBlbHNlIGlmIChpc0luQ2FsbCgpIHx8CisgICAgICAgICAgICAgICAgICAgIGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfUEhPTkUpKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FLCBmcm9tQ2FjaGUpOworICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKSkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFLCBmcm9tQ2FjaGUpOworICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZKSkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9BQ0NFU1NJQklMSVRZLCBmcm9tQ2FjaGUpOworICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9TT05JRklDQVRJT04pKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTiwgZnJvbUNhY2hlKTsKKyAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMLCBmcm9tQ2FjaGUpOworICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9NRURJQSkpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIGZyb21DYWNoZSk7CisgICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX0RUTUYpKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0RUTUYsIGZyb21DYWNoZSk7CisgICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUikpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSLCBmcm9tQ2FjaGUpOworICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9SRVJPVVRJTkcpKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1JFUk9VVElORywgZnJvbUNhY2hlKTsKKyAgICB9CisKKyAgICBBTE9HVigiZ2V0TmV3T3V0cHV0RGV2aWNlKCkgc2VsZWN0ZWQgZGV2aWNlICV4IiwgZGV2aWNlKTsKKyAgICByZXR1cm4gZGV2aWNlOworfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXROZXdJbnB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKK3sKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUZvcihpbnB1dCk7CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBpZiAocGF0Y2hEZXNjLT5tVWlkICE9IG1VaWRDYWNoZWQpIHsKKyAgICAgICAgICAgIEFMT0dWKCJnZXROZXdJbnB1dERldmljZSgpIGRldmljZSAlMDh4IGZvcmNlZCBieSBwYXRjaCAlZCIsCisgICAgICAgICAgICAgICAgICBpbnB1dERlc2MtPm1EZXZpY2UsIGlucHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dERlc2MtPm1EZXZpY2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoaW5wdXREZXNjLT5tSW5wdXRTb3VyY2UpOworCisgICAgcmV0dXJuIGRldmljZTsKK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgeworICAgIHJldHVybiAodWludDMyX3QpZ2V0U3RyYXRlZ3koc3RyZWFtKTsKK30KKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgeworICAgIC8vIEJ5IGNoZWNraW5nIHRoZSByYW5nZSBvZiBzdHJlYW0gYmVmb3JlIGNhbGxpbmcgZ2V0U3RyYXRlZ3ksIHdlIGF2b2lkCisgICAgLy8gZ2V0U3RyYXRlZ3kncyBiZWhhdmlvciBmb3IgaW52YWxpZCBzdHJlYW1zLiAgZ2V0U3RyYXRlZ3kgd291bGQgZG8gYSBBTE9HRQorICAgIC8vIGFuZCB0aGVuIHJldHVybiBTVFJBVEVHWV9NRURJQSwgYnV0IHdlIHdhbnQgdG8gcmV0dXJuIHRoZSBlbXB0eSBzZXQuCisgICAgaWYgKHN0cmVhbSA8IChhdWRpb19zdHJlYW1fdHlwZV90KSAwIHx8IHN0cmVhbSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgeworICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CisgICAgfQorICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzOworICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOworICAgIGRldmljZXMgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKGRldmljZXMsIG1PdXRwdXRzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0c1tpXSk7CisgICAgICAgIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIHN0cmF0ZWd5KSkgeworICAgICAgICAgICAgZGV2aWNlcyA9IG91dHB1dERlc2MtPmRldmljZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKkZpbHRlciBTUEVBS0VSX1NBRkUgb3V0IG9mIHJlc3VsdHMsIGFzIEF1ZGlvU2VydmljZSBkb2Vzbid0IGtub3cgYWJvdXQgaXQKKyAgICAgIGFuZCBkb2Vzbid0IHJlYWxseSBuZWVkIHRvLiovCisgICAgaWYgKGRldmljZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSkgeworICAgICAgICBkZXZpY2VzIHw9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgZGV2aWNlcyAmPSB+QVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkU7CisgICAgfQorCisgICAgcmV0dXJuIGRldmljZXM7Cit9CisKK3JvdXRpbmdfc3RyYXRlZ3kgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdHJhdGVneShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKK3sKKyAgICBBTE9HX0FTU0VSVChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX1BBVENILCJnZXRTdHJhdGVneSgpIGNhbGxlZCBmb3IgQVVESU9fU1RSRUFNX1BBVENIIik7CisgICAgcmV0dXJuIG1FbmdpbmUtPmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSk7Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyYXRlZ3lGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cikgeworICAgIC8vIGZsYWdzIHRvIHN0cmF0ZWd5IG1hcHBpbmcKKyAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19CRUFDT04pID09IEFVRElPX0ZMQUdfQkVBQ09OKSB7CisgICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUjsKKyAgICB9CisgICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgPT0gQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSB7CisgICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEU7CisgICAgfQorICAgIC8vIHVzYWdlIHRvIHN0cmF0ZWd5IG1hcHBpbmcKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG1FbmdpbmUtPmdldFN0cmF0ZWd5Rm9yVXNhZ2UoYXR0ci0+dXNhZ2UpKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmhhbmRsZU5vdGlmaWNhdGlvblJvdXRpbmdGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIHsKKyAgICBzd2l0Y2goc3RyZWFtKSB7CisgICAgY2FzZSBBVURJT19TVFJFQU1fTVVTSUM6CisgICAgICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpOworICAgICAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6aGFuZGxlRXZlbnRGb3JCZWFjb24oaW50IGV2ZW50KSB7CisgICAgc3dpdGNoKGV2ZW50KSB7CisgICAgY2FzZSBTVEFSVElOR19PVVRQVVQ6CisgICAgICAgIG1CZWFjb25NdXRlUmVmQ291bnQrKzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTVE9QUElOR19PVVRQVVQ6CisgICAgICAgIGlmIChtQmVhY29uTXV0ZVJlZkNvdW50ID4gMCkgeworICAgICAgICAgICAgbUJlYWNvbk11dGVSZWZDb3VudC0tOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU1RBUlRJTkdfQkVBQ09OOgorICAgICAgICBtQmVhY29uUGxheWluZ1JlZkNvdW50Kys7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU1RPUFBJTkdfQkVBQ09OOgorICAgICAgICBpZiAobUJlYWNvblBsYXlpbmdSZWZDb3VudCA+IDApIHsKKyAgICAgICAgICAgIG1CZWFjb25QbGF5aW5nUmVmQ291bnQtLTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAobUJlYWNvbk11dGVSZWZDb3VudCA+IDApIHsKKyAgICAgICAgLy8gYW55IHBsYXliYWNrIGNhdXNlcyBiZWFjb24gdG8gYmUgbXV0ZWQKKyAgICAgICAgcmV0dXJuIHNldEJlYWNvbk11dGUodHJ1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbm8gb3RoZXIgcGxheWJhY2s6IHVubXV0ZSB3aGVuIGJlYWNvbiBzdGFydHMgcGxheWluZywgbXV0ZSB3aGVuIGl0IHN0b3BzCisgICAgICAgIHJldHVybiBzZXRCZWFjb25NdXRlKG1CZWFjb25QbGF5aW5nUmVmQ291bnQgPT0gMCk7CisgICAgfQorfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldEJlYWNvbk11dGUoYm9vbCBtdXRlKSB7CisgICAgQUxPR1YoInNldEJlYWNvbk11dGUoJWQpIG1CZWFjb25NdXRlUmVmQ291bnQ9JWQgbUJlYWNvblBsYXlpbmdSZWZDb3VudD0lZCIsCisgICAgICAgICAgICBtdXRlLCBtQmVhY29uTXV0ZVJlZkNvdW50LCBtQmVhY29uUGxheWluZ1JlZkNvdW50KTsKKyAgICAvLyBrZWVwIHRyYWNrIG9mIG11dGVkIHN0YXRlIHRvIGF2b2lkIHJlcGVhdGluZyBtdXRlL3VubXV0ZSBvcGVyYXRpb25zCisgICAgaWYgKG1CZWFjb25NdXRlZCAhPSBtdXRlKSB7CisgICAgICAgIC8vIG11dGUvdW5tdXRlIEFVRElPX1NUUkVBTV9UVFMgb24gYWxsIG91dHB1dHMKKyAgICAgICAgQUxPR1YoIlx0IG11dGluZyAlZCIsIG11dGUpOworICAgICAgICB1aW50MzJfdCBtYXhMYXRlbmN5ID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZShBVURJT19TVFJFQU1fVFRTLCBtdXRlLypvbiovLAorICAgICAgICAgICAgICAgICAgICBkZXNjLAorICAgICAgICAgICAgICAgICAgICAwIC8qZGVsYXkqLywgQVVESU9fREVWSUNFX05PTkUpOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbGF0ZW5jeSA9IGRlc2MtPmxhdGVuY3koKSAqIDI7CisgICAgICAgICAgICBpZiAobGF0ZW5jeSA+IG1heExhdGVuY3kpIHsKKyAgICAgICAgICAgICAgICBtYXhMYXRlbmN5ID0gbGF0ZW5jeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQmVhY29uTXV0ZWQgPSBtdXRlOworICAgICAgICByZXR1cm4gbWF4TGF0ZW5jeTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSkKK3sKKyAgICAvLyBSb3V0aW5nCisgICAgLy8gc2VlIGlmIHdlIGhhdmUgYW4gZXhwbGljaXQgcm91dGUKKyAgICAvLyBzY2FuIHRoZSB3aG9sZSBSb3V0ZU1hcCwgZm9yIGVhY2ggZW50cnksIGNvbnZlcnQgdGhlIHN0cmVhbSB0eXBlIHRvIGEgc3RyYXRlZ3kKKyAgICAvLyAoZ2V0U3RyYXRlZ3koc3RyZWFtKSkuCisgICAgLy8gaWYgdGhlIHN0cmF0ZWd5IGZyb20gdGhlIHN0cmVhbSB0eXBlIGluIHRoZSBSb3V0ZU1hcCBpcyB0aGUgc2FtZSBhcyB0aGUgYXJndW1lbnQgYWJvdmUsCisgICAgLy8gYW5kIGFjdGl2aXR5IGNvdW50IGlzIG5vbi16ZXJvCisgICAgLy8gdGhlIGRldmljZSA9IHRoZSBkZXZpY2UgZnJvbSB0aGUgZGVzY3JpcHRvciBpbiB0aGUgUm91dGVNYXAsIGFuZCBleGl0LgorICAgIGZvciAoc2l6ZV90IHJvdXRlSW5kZXggPSAwOyByb3V0ZUluZGV4IDwgbU91dHB1dFJvdXRlcy5zaXplKCk7IHJvdXRlSW5kZXgrKykgeworICAgICAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gbU91dHB1dFJvdXRlcy52YWx1ZUF0KHJvdXRlSW5kZXgpOworICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ID0gZ2V0U3RyYXRlZ3kocm91dGUtPm1TdHJlYW1UeXBlKTsKKyAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBhY2Nlc3NpYmlsaXR5IHN0cmF0ZWd5IHdoaWNoIG11c3QgZm9sbG93IGFueSBzdHJhdGVneSBpdCBpcworICAgICAgICAvLyBjdXJyZW50bHkgcmVtYXBwZWQgdG8KKyAgICAgICAgYm9vbCBzdHJhdGVneU1hdGNoID0gKHN0cmF0ID09IHN0cmF0ZWd5KSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHN0cmF0ZWd5ID09IFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1FbmdpbmUtPmdldFN0cmF0ZWd5Rm9yVXNhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWSkgPT0gc3RyYXQpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmF0ID09IFNUUkFURUdZX01FRElBKSkpOworICAgICAgICBpZiAoc3RyYXRlZ3lNYXRjaCAmJiByb3V0ZS0+aXNBY3RpdmUoKSkgeworICAgICAgICAgICAgcmV0dXJuIHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvci0+dHlwZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZyb21DYWNoZSkgeworICAgICAgICBBTE9HVlYoImdldERldmljZUZvclN0cmF0ZWd5KCkgZnJvbSBjYWNoZSBzdHJhdGVneSAlZCwgZGV2aWNlICV4IiwKKyAgICAgICAgICAgICAgc3RyYXRlZ3ksIG1EZXZpY2VGb3JTdHJhdGVneVtzdHJhdGVneV0pOworICAgICAgICByZXR1cm4gbURldmljZUZvclN0cmF0ZWd5W3N0cmF0ZWd5XTsKKyAgICB9CisgICAgcmV0dXJuIG1FbmdpbmUtPmdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5KTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCkKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9TVFJBVEVHSUVTOyBpKyspIHsKKyAgICAgICAgbURldmljZUZvclN0cmF0ZWd5W2ldID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKHJvdXRpbmdfc3RyYXRlZ3kpaSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgfQorICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJldkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zKQoreworICAgIC8vIG11dGUvdW5tdXRlIHN0cmF0ZWdpZXMgdXNpbmcgYW4gaW5jb21wYXRpYmxlIGRldmljZSBjb21iaW5hdGlvbgorICAgIC8vIGlmIG11dGluZywgd2FpdCBmb3IgdGhlIGF1ZGlvIGluIHBjbSBidWZmZXIgdG8gYmUgZHJhaW5lZCBiZWZvcmUgcHJvY2VlZGluZworICAgIC8vIGlmIHVubXV0aW5nLCB1bm11dGUgb25seSBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5CisgICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHVpbnQzMl90IG11dGVXYWl0TXMgPSAwOworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBvdXRwdXREZXNjLT5kZXZpY2UoKTsKKyAgICBib29sIHNob3VsZE11dGUgPSBvdXRwdXREZXNjLT5pc0FjdGl2ZSgpICYmIChwb3Bjb3VudChkZXZpY2UpID49IDIpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneSgocm91dGluZ19zdHJhdGVneSlpLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgY3VyRGV2aWNlID0gY3VyRGV2aWNlICYgb3V0cHV0RGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpOworICAgICAgICBib29sIG11dGUgPSBzaG91bGRNdXRlICYmIChjdXJEZXZpY2UgJiBkZXZpY2UpICYmIChjdXJEZXZpY2UgIT0gZGV2aWNlKTsKKyAgICAgICAgYm9vbCBkb011dGUgPSBmYWxzZTsKKworICAgICAgICBpZiAobXV0ZSAmJiAhb3V0cHV0RGVzYy0+bVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSkgeworICAgICAgICAgICAgZG9NdXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0gPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKCFtdXRlICYmIG91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0peworICAgICAgICAgICAgZG9NdXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0gPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZG9NdXRlKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1PdXRwdXRzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChqKTsKKyAgICAgICAgICAgICAgICAvLyBza2lwIG91dHB1dCBpZiBpdCBkb2VzIG5vdCBzaGFyZSBhbnkgZGV2aWNlIHdpdGggY3VycmVudCBvdXRwdXQKKyAgICAgICAgICAgICAgICBpZiAoKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSAmIG91dHB1dERlc2MtPnN1cHBvcnRlZERldmljZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVlYoImNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoKSAlcyBzdHJhdGVneSAlZCAoY3VyRGV2aWNlICUwNHgpIiwKKyAgICAgICAgICAgICAgICAgICAgICBtdXRlID8gIm11dGluZyIgOiAidW5tdXRpbmciLCBpLCBjdXJEZXZpY2UpOworICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZSgocm91dGluZ19zdHJhdGVneSlpLCBtdXRlLCBkZXNjLCBtdXRlID8gMCA6IGRlbGF5TXMpOworICAgICAgICAgICAgICAgIGlmIChpc1N0cmF0ZWd5QWN0aXZlKGRlc2MsIChyb3V0aW5nX3N0cmF0ZWd5KWkpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtdXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogc2hvdWxkIG5vdCBuZWVkIHRvIGRvdWJsZSBsYXRlbmN5IGlmIHZvbHVtZSBjb3VsZCBiZSBhcHBsaWVkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSBieSB0aGUgYXVkaW9mbGluZ2VyIG1peGVyLiBXZSBtdXN0IGFjY291bnQgZm9yIHRoZSBkZWxheQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmV0d2VlbiBub3cgYW5kIHRoZSBuZXh0IHRpbWUgdGhlIGF1ZGlvZmxpbmdlciB0aHJlYWQgZm9yIHRoaXMgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIHByb2Nlc3MgYSBidWZmZXIgKHdoaWNoIGNvcnJlc3BvbmRzIHRvIG9uZSBidWZmZXIgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzdWFsbHkgMS8yIG9yIDEvNCBvZiB0aGUgbGF0ZW5jeSkuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXV0ZVdhaXRNcyA8IGRlc2MtPmxhdGVuY3koKSAqIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRlV2FpdE1zID0gZGVzYy0+bGF0ZW5jeSgpICogMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHRlbXBvcmFyeSBtdXRlIG91dHB1dCBpZiBkZXZpY2Ugc2VsZWN0aW9uIGNoYW5nZXMgdG8gYXZvaWQgdm9sdW1lIGJ1cnN0cyBkdWUgdG8KKyAgICAvLyBkaWZmZXJlbnQgcGVyIGRldmljZSB2b2x1bWVzCisgICAgaWYgKG91dHB1dERlc2MtPmlzQWN0aXZlKCkgJiYgKGRldmljZSAhPSBwcmV2RGV2aWNlKSkgeworICAgICAgICBpZiAobXV0ZVdhaXRNcyA8IG91dHB1dERlc2MtPmxhdGVuY3koKSAqIDIpIHsKKyAgICAgICAgICAgIG11dGVXYWl0TXMgPSBvdXRwdXREZXNjLT5sYXRlbmN5KCkgKiAyOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgeworICAgICAgICAgICAgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgKHJvdXRpbmdfc3RyYXRlZ3kpaSkpIHsKKyAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoKHJvdXRpbmdfc3RyYXRlZ3kpaSwgdHJ1ZSwgb3V0cHV0RGVzYyk7CisgICAgICAgICAgICAgICAgLy8gZG8gdGVtcE11dGUgdW5tdXRlIGFmdGVyIHR3aWNlIHRoZSBtdXRlIHdhaXQgdGltZQorICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZSgocm91dGluZ19zdHJhdGVneSlpLCBmYWxzZSwgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZVdhaXRNcyAqMiwgZGV2aWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHdhaXQgZm9yIHRoZSBQQ00gb3V0cHV0IGJ1ZmZlcnMgdG8gZW1wdHkgYmVmb3JlIHByb2NlZWRpbmcgd2l0aCB0aGUgcmVzdCBvZiB0aGUgY29tbWFuZAorICAgIGlmIChtdXRlV2FpdE1zID4gZGVsYXlNcykgeworICAgICAgICBtdXRlV2FpdE1zIC09IGRlbGF5TXM7CisgICAgICAgIHVzbGVlcChtdXRlV2FpdE1zICogMTAwMCk7CisgICAgICAgIHJldHVybiBtdXRlV2FpdE1zOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRPdXRwdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhZGRyZXNzKQoreworICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBkZXZpY2UgJTA0eCBkZWxheU1zICVkIiwgZGV2aWNlLCBkZWxheU1zKTsKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKKyAgICB1aW50MzJfdCBtdXRlV2FpdE1zOworCisgICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIG11dGVXYWl0TXMgPSBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYy0+c3ViT3V0cHV0MSgpLCBkZXZpY2UsIGZvcmNlLCBkZWxheU1zKTsKKyAgICAgICAgbXV0ZVdhaXRNcyArPSBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYy0+c3ViT3V0cHV0MigpLCBkZXZpY2UsIGZvcmNlLCBkZWxheU1zKTsKKyAgICAgICAgcmV0dXJuIG11dGVXYWl0TXM7CisgICAgfQorICAgIC8vIG5vIG5lZWQgdG8gcHJvY2VlZCBpZiBuZXcgZGV2aWNlIGlzIG5vdCBBVURJT19ERVZJQ0VfTk9ORSBhbmQgbm90IHN1cHBvcnRlZCBieSBjdXJyZW50CisgICAgLy8gb3V0cHV0IHByb2ZpbGUKKyAgICBpZiAoKGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgJiYKKyAgICAgICAgICAgICgoZGV2aWNlICYgb3V0cHV0RGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpKSA9PSAwKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBmaWx0ZXIgZGV2aWNlcyBhY2NvcmRpbmcgdG8gb3V0cHV0IHNlbGVjdGVkCisgICAgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCkoZGV2aWNlICYgb3V0cHV0RGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpKTsKKworICAgIGF1ZGlvX2RldmljZXNfdCBwcmV2RGV2aWNlID0gb3V0cHV0RGVzYy0+bURldmljZTsKKworICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBwcmV2RGV2aWNlIDB4JTA0eCIsIHByZXZEZXZpY2UpOworCisgICAgaWYgKGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gZGV2aWNlOworICAgIH0KKyAgICBtdXRlV2FpdE1zID0gY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyhvdXRwdXREZXNjLCBwcmV2RGV2aWNlLCBkZWxheU1zKTsKKworICAgIC8vIERvIG5vdCBjaGFuZ2UgdGhlIHJvdXRpbmcgaWY6CisgICAgLy8gICAgICB0aGUgcmVxdWVzdGVkIGRldmljZSBpcyBBVURJT19ERVZJQ0VfTk9ORQorICAgIC8vICAgICAgT1IgdGhlIHJlcXVlc3RlZCBkZXZpY2UgaXMgdGhlIHNhbWUgYXMgY3VycmVudCBkZXZpY2UKKyAgICAvLyAgQU5EIGZvcmNlIGlzIG5vdCBzcGVjaWZpZWQKKyAgICAvLyAgQU5EIHRoZSBvdXRwdXQgaXMgY29ubmVjdGVkIGJ5IGEgdmFsaWQgYXVkaW8gcGF0Y2guCisgICAgLy8gRG9pbmcgdGhpcyBjaGVjayBoZXJlIGFsbG93cyB0aGUgY2FsbGVyIHRvIGNhbGwgc2V0T3V0cHV0RGV2aWNlKCkgd2l0aG91dCBjb25kaXRpb25zCisgICAgaWYgKChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUgfHwgZGV2aWNlID09IHByZXZEZXZpY2UpICYmCisgICAgICAgICFmb3JjZSAmJgorICAgICAgICBvdXRwdXREZXNjLT5tUGF0Y2hIYW5kbGUgIT0gMCkgeworICAgICAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgc2V0dGluZyBzYW1lIGRldmljZSAweCUwNHggb3IgbnVsbCBkZXZpY2UiLCBkZXZpY2UpOworICAgICAgICByZXR1cm4gbXV0ZVdhaXRNczsKKyAgICB9CisKKyAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgY2hhbmdpbmcgZGV2aWNlIik7CisKKyAgICAvLyBkbyB0aGUgcm91dGluZworICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgcmVzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZGVsYXlNcywgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3QgPSAoYWRkcmVzcyA9PSBOVUxMKSA/CisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSkKKyAgICAgICAgICAgICAgICA6IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZUFkZHIoZGV2aWNlLCBTdHJpbmc4KGFkZHJlc3MpKTsKKyAgICAgICAgaWYgKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMF0pOworICAgICAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOworICAgICAgICAgICAgcGF0Y2gubnVtX3NpbmtzID0gMDsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGV2aWNlTGlzdC5zaXplKCkgJiYgaSA8IEFVRElPX1BBVENIX1BPUlRTX01BWDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlTGlzdC5pdGVtQXQoaSktPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zaW5rc1tpXSk7CisgICAgICAgICAgICAgICAgcGF0Y2gubnVtX3NpbmtzKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzc2l6ZV90IGluZGV4OworICAgICAgICAgICAgaWYgKHBhdGNoSGFuZGxlICYmICpwYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDwgQXVkaW9QYXRjaD4gcGF0Y2hEZXNjOworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICAgICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyk7CisgICAgICAgICAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgY3JlYXRlQXVkaW9QYXRjaCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCIKKyAgICAgICAgICAgICAgICAgICAgIm51bV9zb3VyY2VzICVkIG51bV9zaW5rcyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGFmUGF0Y2hIYW5kbGUsIHBhdGNoLm51bV9zb3VyY2VzLCBwYXRjaC5udW1fc2lua3MpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbmV3IEF1ZGlvUGF0Y2goJnBhdGNoLCBtVWlkQ2FjaGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2ggPSBwYXRjaDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tVWlkID0gbVVpZENhY2hlZDsKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgKnBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7CisgICAgICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaW5mb3JtIGFsbCBpbnB1dCBhcyB3ZWxsCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ICBpbnB1dERlc2NyaXB0b3IgPSBtSW5wdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAoIWlzX3ZpcnR1YWxfaW5wdXRfZGV2aWNlKGlucHV0RGVzY3JpcHRvci0+bURldmljZSkpIHsKKyAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBpbnB1dENtZCA9IEF1ZGlvUGFyYW1ldGVyKCk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBpbmZvcm0gaW5wdXQgJWQgb2YgZGV2aWNlOiVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgaW5wdXREZXNjcmlwdG9yLT5tSW9IYW5kbGUsIGRldmljZSk7CisgICAgICAgICAgICAgICAgaW5wdXRDbWQuYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLGRldmljZSk7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoaW5wdXREZXNjcmlwdG9yLT5tSW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRDbWQudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHVwZGF0ZSBzdHJlYW0gdm9sdW1lcyBhY2NvcmRpbmcgdG8gbmV3IGRldmljZQorICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhvdXRwdXREZXNjLCBkZXZpY2UsIGRlbGF5TXMpOworCisgICAgcmV0dXJuIG11dGVXYWl0TXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVzZXRPdXRwdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSkKK3sKKyAgICBzc2l6ZV90IGluZGV4OworICAgIGlmIChwYXRjaEhhbmRsZSkgeworICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqcGF0Y2hIYW5kbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgfQorICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBzcDwgQXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgZGVsYXlNcyk7CisgICAgQUxPR1YoInJlc2V0T3V0cHV0RGV2aWNlKCkgcmVsZWFzZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQiLCBzdGF0dXMpOworICAgIG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSA9IDA7CisgICAgcmVtb3ZlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUpOworICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUZvcihpbnB1dCk7CisgICAgaWYgKChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpICYmICgoZGV2aWNlICE9IGlucHV0RGVzYy0+bURldmljZSkgfHwgZm9yY2UpKSB7CisgICAgICAgIGlucHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKKworICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7CisgICAgICAgIGlmICghZGV2aWNlTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKKyAgICAgICAgICAgIGlucHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNpbmtzWzBdKTsKKyAgICAgICAgICAgIC8vIEFVRElPX1NPVVJDRV9IT1RXT1JEIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seToKKyAgICAgICAgICAgIC8vIGhhbmRsZWQgYXMgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIGJ5IHRoZSBhdWRpbyBIQUwKKyAgICAgICAgICAgIGlmIChwYXRjaC5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEICYmCisgICAgICAgICAgICAgICAgICAgICFpbnB1dERlc2MtPm1Jc1NvdW5kVHJpZ2dlcikgeworICAgICAgICAgICAgICAgIHBhdGNoLnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXRjaC5udW1fc2lua3MgPSAxOworICAgICAgICAgICAgLy9vbmx5IG9uZSBpbnB1dCBkZXZpY2UgZm9yIG5vdworICAgICAgICAgICAgZGV2aWNlTGlzdC5pdGVtQXQoMCktPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzBdKTsKKyAgICAgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKKyAgICAgICAgICAgIHNzaXplX3QgaW5kZXg7CisgICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUgJiYgKnBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKnBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8IEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgIEFMT0dWKCJzZXRJbnB1dERldmljZSgpIGNyZWF0ZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGFmUGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbmV3IEF1ZGlvUGF0Y2goJnBhdGNoLCBtVWlkQ2FjaGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2ggPSBwYXRjaDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tVWlkID0gbVVpZENhY2hlZDsKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgKnBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUhhbmRsZTsKKyAgICAgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZXNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSkKK3sKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUZvcihpbnB1dCk7CisgICAgc3NpemVfdCBpbmRleDsKKyAgICBpZiAocGF0Y2hIYW5kbGUpIHsKKyAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKnBhdGNoSGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgfQorICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBzcDwgQXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgQUxPR1YoInJlc2V0SW5wdXREZXZpY2UoKSByZWxlYXNlQXVkaW9QYXRjaCByZXR1cm5lZCAlZCIsIHN0YXR1cyk7CisgICAgaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUgPSAwOworICAgIHJlbW92ZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlKTsKKyAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3A8SU9Qcm9maWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldElucHV0UHJvZmlsZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90JiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190JiBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKK3sKKyAgICAvLyBDaG9vc2UgYW4gaW5wdXQgcHJvZmlsZSBiYXNlZCBvbiB0aGUgcmVxdWVzdGVkIGNhcHR1cmUgcGFyYW1ldGVyczogc2VsZWN0IHRoZSBmaXJzdCBhdmFpbGFibGUKKyAgICAvLyBwcm9maWxlIHN1cHBvcnRpbmcgYWxsIHJlcXVlc3RlZCBwYXJhbWV0ZXJzLgorICAgIC8vCisgICAgLy8gVE9ETzogcGVyaGFwcyBpc0NvbXBhdGlibGVQcm9maWxlIHNob3VsZCByZXR1cm4gYSAibWF0Y2hpbmciIHNjb3JlIHNvIHdlIGNhbiByZXR1cm4KKyAgICAvLyB0aGUgYmVzdCBtYXRjaGluZyBwcm9maWxlLCBub3QgdGhlIGZpcnN0IG9uZS4KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1JbnB1dFByb2ZpbGVzW2pdOworICAgICAgICAgICAgLy8gcHJvZmlsZS0+bG9nKCk7CisgICAgICAgICAgICBpZiAocHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZpY2UsIGFkZHJlc3MsIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGluZ1JhdGUgLyp1cGRhdGVkU2FtcGxpbmdSYXRlKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0IC8qdXBkYXRlZEZvcm1hdCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbE1hc2sgLyp1cGRhdGVkQ2hhbm5lbE1hc2sqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgZmxhZ3MpKSB7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJvZmlsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ICoqcG9saWN5TWl4KQoreworICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVEZXZpY2VUeXBlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSAmIH5BVURJT19ERVZJQ0VfQklUX0lOOworICAgIGF1ZGlvX2RldmljZXNfdCBzZWxlY3RlZERldmljZUZyb21NaXggPQorICAgICAgICAgICBtUG9saWN5TWl4ZXMuZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UsIGF2YWlsYWJsZURldmljZVR5cGVzLCBwb2xpY3lNaXgpOworCisgICAgaWYgKHNlbGVjdGVkRGV2aWNlRnJvbU1peCAhPSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICByZXR1cm4gc2VsZWN0ZWREZXZpY2VGcm9tTWl4OworICAgIH0KKyAgICByZXR1cm4gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UpOworfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkKK3sKKyAgICBmb3IgKHNpemVfdCByb3V0ZUluZGV4ID0gMDsgcm91dGVJbmRleCA8IG1JbnB1dFJvdXRlcy5zaXplKCk7IHJvdXRlSW5kZXgrKykgeworICAgICAgICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IG1JbnB1dFJvdXRlcy52YWx1ZUF0KHJvdXRlSW5kZXgpOworICAgICAgICAgaWYgKGlucHV0U291cmNlID09IHJvdXRlLT5tU291cmNlICYmIHJvdXRlLT5pc0FjdGl2ZSgpKSB7CisgICAgICAgICAgICAgcmV0dXJuIHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvci0+dHlwZSgpOworICAgICAgICAgfQorICAgICB9CisKKyAgICAgcmV0dXJuIG1FbmdpbmUtPmdldERldmljZUZvcklucHV0U291cmNlKGlucHV0U291cmNlKTsKK30KKworZmxvYXQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjb21wdXRlVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgZmxvYXQgdm9sdW1lRGIgPSBtRW5naW5lLT52b2xJbmRleFRvRGIoVm9sdW1lOjpnZXREZXZpY2VDYXRlZ29yeShkZXZpY2UpLCBzdHJlYW0sIGluZGV4KTsKKworICAgIC8vIGlmIGEgaGVhZHNldCBpcyBjb25uZWN0ZWQsIGFwcGx5IHRoZSBmb2xsb3dpbmcgcnVsZXMgdG8gcmluZyB0b25lcyBhbmQgbm90aWZpY2F0aW9ucworICAgIC8vIHRvIGF2b2lkIHNvdW5kIGxldmVsIGJ1cnN0cyBpbiB1c2VyJ3MgZWFyczoKKyAgICAvLyAtIGFsd2F5cyBhdHRlbnVhdGUgcmluZyB0b25lcyBhbmQgbm90aWZpY2F0aW9ucyB2b2x1bWUgYnkgNmRCCisgICAgLy8gLSBpZiBtdXNpYyBpcyBwbGF5aW5nLCBhbHdheXMgbGltaXQgdGhlIHZvbHVtZSB0byBjdXJyZW50IG11c2ljIHZvbHVtZSwKKyAgICAvLyB3aXRoIGEgbWluaW11bSB0aHJlc2hvbGQgYXQgLTM2ZEIgc28gdGhhdCBub3RpZmljYXRpb24gaXMgYWx3YXlzIHBlcmNlaXZlZC4KKyAgICBjb25zdCByb3V0aW5nX3N0cmF0ZWd5IHN0cmVhbV9zdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7CisgICAgaWYgKChkZXZpY2UgJiAoQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCB8CisgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMgfAorICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUIHwKKyAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FKSkgJiYKKyAgICAgICAgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKQorICAgICAgICAgICAgICAgIHx8IChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpCisgICAgICAgICAgICAgICAgfHwgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fU1lTVEVNKQorICAgICAgICAgICAgICAgIHx8ICgoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpICYmCisgICAgICAgICAgICAgICAgICAgIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpKSkgJiYKKyAgICAgICAgICAgIG1TdHJlYW1zLmNhbkJlTXV0ZWQoc3RyZWFtKSkgeworICAgICAgICB2b2x1bWVEYiArPSBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfRkFDVE9SX0RCOworICAgICAgICAvLyB3aGVuIHRoZSBwaG9uZSBpcyByaW5naW5nIHdlIG11c3QgY29uc2lkZXIgdGhhdCBtdXNpYyBjb3VsZCBoYXZlIGJlZW4gcGF1c2VkIGp1c3QgYmVmb3JlCisgICAgICAgIC8vIGJ5IHRoZSBtdXNpYyBhcHBsaWNhdGlvbiBhbmQgYmVoYXZlIGFzIGlmIG11c2ljIHdhcyBhY3RpdmUgaWYgdGhlIGxhc3QgbXVzaWMgdHJhY2sgd2FzCisgICAgICAgIC8vIGp1c3Qgc3RvcHBlZAorICAgICAgICBpZiAoaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX01VU0lDLCBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSkgfHwKKyAgICAgICAgICAgICAgICBtTGltaXRSaW5ndG9uZVZvbHVtZSkgeworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG11c2ljRGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICBmbG9hdCBtdXNpY1ZvbERCID0gY29tcHV0ZVZvbHVtZShBVURJT19TVFJFQU1fTVVTSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtcy52YWx1ZUZvcihBVURJT19TVFJFQU1fTVVTSUMpLmdldFZvbHVtZUluZGV4KG11c2ljRGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXNpY0RldmljZSk7CisgICAgICAgICAgICBmbG9hdCBtaW5Wb2xEQiA9IChtdXNpY1ZvbERCID4gU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX01JTl9EQikgPworICAgICAgICAgICAgICAgICAgICBtdXNpY1ZvbERCIDogU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX01JTl9EQjsKKyAgICAgICAgICAgIGlmICh2b2x1bWVEYiA+IG1pblZvbERCKSB7CisgICAgICAgICAgICAgICAgdm9sdW1lRGIgPSBtaW5Wb2xEQjsKKyAgICAgICAgICAgICAgICBBTE9HVigiY29tcHV0ZVZvbHVtZSBsaW1pdGluZyB2b2x1bWUgdG8gJWYgbXVzaWNWb2wgJWYiLCBtaW5Wb2xEQiwgbXVzaWNWb2xEQik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdm9sdW1lRGI7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tBbmRTZXRWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKK3sKKyAgICAvLyBkbyBub3QgY2hhbmdlIGFjdHVhbCBzdHJlYW0gdm9sdW1lIGlmIHRoZSBzdHJlYW0gaXMgbXV0ZWQKKyAgICBpZiAob3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dICE9IDApIHsKKyAgICAgICAgQUxPR1ZWKCJjaGVja0FuZFNldFZvbHVtZSgpIHN0cmVhbSAlZCBtdXRlZCBjb3VudCAlZCIsCisgICAgICAgICAgICAgIHN0cmVhbSwgb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGZvcmNlVXNlRm9yQ29tbSA9CisgICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT04pOworICAgIC8vIGRvIG5vdCBjaGFuZ2UgaW4gY2FsbCB2b2x1bWUgaWYgYmx1ZXRvb3RoIGlzIGNvbm5lY3RlZCBhbmQgdmljZSB2ZXJzYQorICAgIGlmICgoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMICYmIGZvcmNlVXNlRm9yQ29tbSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSB8fAorICAgICAgICAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPICYmIGZvcmNlVXNlRm9yQ29tbSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSkgeworICAgICAgICBBTE9HVigiY2hlY2tBbmRTZXRWb2x1bWUoKSBjYW5ub3Qgc2V0IHN0cmVhbSAlZCB2b2x1bWUgd2l0aCBmb3JjZSB1c2UgPSAlZCBmb3IgY29tbSIsCisgICAgICAgICAgICAgc3RyZWFtLCBmb3JjZVVzZUZvckNvbW0pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICBkZXZpY2UgPSBvdXRwdXREZXNjLT5kZXZpY2UoKTsKKyAgICB9CisKKyAgICBmbG9hdCB2b2x1bWVEYiA9IGNvbXB1dGVWb2x1bWUoc3RyZWFtLCBpbmRleCwgZGV2aWNlKTsKKyAgICBpZiAob3V0cHV0RGVzYy0+aXNGaXhlZFZvbHVtZShkZXZpY2UpKSB7CisgICAgICAgIHZvbHVtZURiID0gMC4wZjsKKyAgICB9CisKKyAgICBvdXRwdXREZXNjLT5zZXRWb2x1bWUodm9sdW1lRGIsIHN0cmVhbSwgZGV2aWNlLCBkZWxheU1zLCBmb3JjZSk7CisKKyAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIHx8CisgICAgICAgIHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTykgeworICAgICAgICBmbG9hdCB2b2ljZVZvbHVtZTsKKyAgICAgICAgLy8gRm9yY2Ugdm9pY2Ugdm9sdW1lIHRvIG1heCBmb3IgYmx1ZXRvb3RoIFNDTyBhcyB2b2x1bWUgaXMgbWFuYWdlZCBieSB0aGUgaGVhZHNldAorICAgICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSB7CisgICAgICAgICAgICB2b2ljZVZvbHVtZSA9IChmbG9hdClpbmRleC8oZmxvYXQpbVN0cmVhbXMudmFsdWVGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleE1heCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAxLjA7CisgICAgICAgIH0KKworICAgICAgICBpZiAodm9pY2VWb2x1bWUgIT0gbUxhc3RWb2ljZVZvbHVtZSAmJiBvdXRwdXREZXNjID09IG1QcmltYXJ5T3V0cHV0KSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0Vm9pY2VWb2x1bWUodm9pY2VWb2x1bWUsIGRlbGF5TXMpOworICAgICAgICAgICAgbUxhc3RWb2ljZVZvbHVtZSA9IHZvaWNlVm9sdW1lOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6YXBwbHlTdHJlYW1Wb2x1bWVzKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKQoreworICAgIEFMT0dWVigiYXBwbHlTdHJlYW1Wb2x1bWVzKCkgZm9yIGRldmljZSAlMDh4IiwgZGV2aWNlKTsKKworICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7IHN0cmVhbSsrKSB7CisgICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1BBVENIKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjaGVja0FuZFNldFZvbHVtZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1zLnZhbHVlRm9yKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSkuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0U3RyYXRlZ3lNdXRlKHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBBTE9HVlYoInNldFN0cmF0ZWd5TXV0ZSgpIHN0cmF0ZWd5ICVkLCBtdXRlICVkLCBvdXRwdXQgSUQgJWQiLAorICAgICAgICAgICBzdHJhdGVneSwgb24sIG91dHB1dERlc2MtPmdldElkKCkpOworICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7IHN0cmVhbSsrKSB7CisgICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1BBVENIKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtKSA9PSBzdHJhdGVneSkgeworICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sIG9uLCBvdXRwdXREZXNjLCBkZWxheU1zLCBkZXZpY2UpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0U3RyZWFtTXV0ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBjb25zdCBTdHJlYW1EZXNjcmlwdG9yJiBzdHJlYW1EZXNjID0gbVN0cmVhbXMudmFsdWVGb3Ioc3RyZWFtKTsKKyAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIGRldmljZSA9IG91dHB1dERlc2MtPmRldmljZSgpOworICAgIH0KKworICAgIEFMT0dWVigic2V0U3RyZWFtTXV0ZSgpIHN0cmVhbSAlZCwgbXV0ZSAlZCwgbU11dGVDb3VudCAlZCBkZXZpY2UgJTA0eCIsCisgICAgICAgICAgc3RyZWFtLCBvbiwgb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dLCBkZXZpY2UpOworCisgICAgaWYgKG9uKSB7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0gPT0gMCkgeworICAgICAgICAgICAgaWYgKHN0cmVhbURlc2MuY2FuQmVNdXRlZCgpICYmCisgICAgICAgICAgICAgICAgICAgICgoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKSB8fAorICAgICAgICAgICAgICAgICAgICAgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkpKSB7CisgICAgICAgICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoc3RyZWFtLCAwLCBvdXRwdXREZXNjLCBkZXZpY2UsIGRlbGF5TXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGluY3JlbWVudCBtTXV0ZUNvdW50IGFmdGVyIGNhbGxpbmcgY2hlY2tBbmRTZXRWb2x1bWUoKSBzbyB0aGF0IHZvbHVtZSBjaGFuZ2UgaXMgbm90IGlnbm9yZWQKKyAgICAgICAgb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dKys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVigic2V0U3RyZWFtTXV0ZSgpIHVubXV0aW5nIG5vbiBtdXRlZCBzdHJlYW0hIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKC0tb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dID09IDApIHsKKyAgICAgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2MuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RhcnRpbmcsIGJvb2wgc3RhdGVDaGFuZ2UpCit7CisgICAgaWYoIWhhc1ByaW1hcnlPdXRwdXQoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gaWYgdGhlIHN0cmVhbSBwZXJ0YWlucyB0byBzb25pZmljYXRpb24gc3RyYXRlZ3kgYW5kIHdlIGFyZSBpbiBjYWxsIHdlIG11c3QKKyAgICAvLyBtdXRlIHRoZSBzdHJlYW0gaWYgaXQgaXMgbG93IHZpc2liaWxpdHkuIElmIGl0IGlzIGhpZ2ggdmlzaWJpbGl0eSwgd2UgbXVzdCBwbGF5IGEgdG9uZQorICAgIC8vIGluIHRoZSBkZXZpY2UgdXNlZCBmb3IgcGhvbmUgc3RyYXRlZ3kgYW5kIHBsYXkgdGhlIHRvbmUgaWYgdGhlIHNlbGVjdGVkIGRldmljZSBkb2VzIG5vdAorICAgIC8vIGludGVyZmVyZSB3aXRoIHRoZSBkZXZpY2UgdXNlZCBmb3IgcGhvbmUgc3RyYXRlZ3kKKyAgICAvLyBpZiBzdGF0ZUNoYW5nZSBpcyB0cnVlLCB3ZSBhcmUgY2FsbGVkIGZyb20gc2V0UGhvbmVTdGF0ZSgpIGFuZCB3ZSBtdXN0IG11dGUgb3IgdW5tdXRlIGFzCisgICAgLy8gbWFueSB0aW1lcyBhcyB0aGVyZSBhcmUgYWN0aXZlIHRyYWNrcyBvbiB0aGUgb3V0cHV0CisgICAgY29uc3Qgcm91dGluZ19zdHJhdGVneSBzdHJlYW1fc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOworICAgIGlmICgoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgfHwKKyAgICAgICAgICAgICgoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKSkpIHsKKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtUHJpbWFyeU91dHB1dDsKKyAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIHN0cmVhbSAlZCBzdGFydGluZyAlZCBkZXZpY2UgJXggc3RhdGVDaGFuZ2UgJWQiLAorICAgICAgICAgICAgICAgIHN0cmVhbSwgc3RhcnRpbmcsIG91dHB1dERlc2MtPm1EZXZpY2UsIHN0YXRlQ2hhbmdlKTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dKSB7CisgICAgICAgICAgICBpbnQgbXV0ZUNvdW50ID0gMTsKKyAgICAgICAgICAgIGlmIChzdGF0ZUNoYW5nZSkgeworICAgICAgICAgICAgICAgIG11dGVDb3VudCA9IG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGF1ZGlvX2lzX2xvd192aXNpYmlsaXR5KHN0cmVhbSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgbG93IHZpc2liaWxpdHksIG11dGVDb3VudCAlZCIsIG11dGVDb3VudCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtdXRlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzZXRTdHJlYW1NdXRlKHN0cmVhbSwgc3RhcnRpbmcsIG1QcmltYXJ5T3V0cHV0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBoaWdoIHZpc2liaWxpdHkiKTsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+ZGV2aWNlKCkgJgorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUsIHRydWUgLypmcm9tQ2FjaGUqLykpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIGhpZ2ggdmlzaWJpbGl0eSBtdXRlZCwgbXV0ZUNvdW50ICVkIiwgbXV0ZUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtdXRlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZShzdHJlYW0sIHN0YXJ0aW5nLCBtUHJpbWFyeU91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0aW5nKSB7CisgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zdGFydFRvbmUoQVVESU9fUE9MSUNZX1RPTkVfSU5fQ0FMTF9OT1RJRklDQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zdG9wVG9uZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkZWZhdWx0QXVkaW9Qb2xpY3lDb25maWcodm9pZCkKK3sKKyAgICBzcDxId01vZHVsZT4gbW9kdWxlOworICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZWZhdWx0SW5wdXREZXZpY2UgPQorICAgICAgICAgICAgICAgICAgICBuZXcgRGV2aWNlRGVzY3JpcHRvcihBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpOworICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmFkZChtRGVmYXVsdE91dHB1dERldmljZSk7CisgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5hZGQoZGVmYXVsdElucHV0RGV2aWNlKTsKKworICAgIG1vZHVsZSA9IG5ldyBId01vZHVsZSgicHJpbWFyeSIpOworCisgICAgcHJvZmlsZSA9IG5ldyBJT1Byb2ZpbGUoU3RyaW5nOCgicHJpbWFyeSIpLCBBVURJT19QT1JUX1JPTEVfU09VUkNFKTsKKyAgICBwcm9maWxlLT5hdHRhY2gobW9kdWxlKTsKKyAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5hZGQoNDQxMDApOworICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmFkZChBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7CisgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5hZGQoQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKTsKKyAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5hZGQobURlZmF1bHRPdXRwdXREZXZpY2UpOworICAgIHByb2ZpbGUtPm1GbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlk7CisgICAgbW9kdWxlLT5tT3V0cHV0UHJvZmlsZXMuYWRkKHByb2ZpbGUpOworCisgICAgcHJvZmlsZSA9IG5ldyBJT1Byb2ZpbGUoU3RyaW5nOCgicHJpbWFyeSIpLCBBVURJT19QT1JUX1JPTEVfU0lOSyk7CisgICAgcHJvZmlsZS0+YXR0YWNoKG1vZHVsZSk7CisgICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuYWRkKDgwMDApOworICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmFkZChBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7CisgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5hZGQoQVVESU9fQ0hBTk5FTF9JTl9NT05PKTsKKyAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5hZGQoZGVmYXVsdElucHV0RGV2aWNlKTsKKyAgICBtb2R1bGUtPm1JbnB1dFByb2ZpbGVzLmFkZChwcm9maWxlKTsKKworICAgIG1Id01vZHVsZXMuYWRkKG1vZHVsZSk7Cit9CisKK2F1ZGlvX3N0cmVhbV90eXBlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKQoreworICAgIC8vIGZsYWdzIHRvIHN0cmVhbSB0eXBlIG1hcHBpbmcKKyAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSA9PSBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFOworICAgIH0KKyAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19TQ08pID09IEFVRElPX0ZMQUdfU0NPKSB7CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTzsKKyAgICB9CisgICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfQkVBQ09OKSA9PSBBVURJT19GTEFHX0JFQUNPTikgeworICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1RUUzsKKyAgICB9CisKKyAgICAvLyB1c2FnZSB0byBzdHJlYW0gdHlwZSBtYXBwaW5nCisgICAgc3dpdGNoIChhdHRyLT51c2FnZSkgeworICAgIGNhc2UgQVVESU9fVVNBR0VfTUVESUE6CisgICAgY2FzZSBBVURJT19VU0FHRV9HQU1FOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOworICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgorICAgICAgICBpZiAoaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX0FMQVJNKSkgeworICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BTEFSTTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX1JJTkcpKSB7CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1JJTkc7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzSW5DYWxsKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFk7CisgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9TWVNURU07CisgICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw7CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9EVE1GOworCisgICAgY2FzZSBBVURJT19VU0FHRV9BTEFSTToKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BTEFSTTsKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fUklORzsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOworICAgIH0KK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzVmFsaWRBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqcGFhKQoreworICAgIC8vIGhhcyBmbGFncyB0aGF0IG1hcCB0byBhIHN0cmF0ZWd5PworICAgIGlmICgocGFhLT5mbGFncyAmIChBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQgfCBBVURJT19GTEFHX1NDTyB8IEFVRElPX0ZMQUdfQkVBQ09OKSkgIT0gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBoYXMga25vd24gdXNhZ2U/CisgICAgc3dpdGNoIChwYWEtPnVzYWdlKSB7CisgICAgY2FzZSBBVURJT19VU0FHRV9VTktOT1dOOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTUVESUE6CisgICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgorICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQUxBUk06CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT046CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT046CisgICAgY2FzZSBBVURJT19VU0FHRV9HQU1FOgorICAgIGNhc2UgQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0U6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0cmF0ZWd5QWN0aXZlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksIHVpbnQzMl90IGluUGFzdE1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lKSBjb25zdAoreworICAgIGlmICgoc3lzVGltZSA9PSAwKSAmJiAoaW5QYXN0TXMgIT0gMCkpIHsKKyAgICAgICAgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KUFVRElPX1NUUkVBTV9DTlQ7IGkrKykgeworICAgICAgICBpZiAoaSA9PSBBVURJT19TVFJFQU1fUEFUQ0gpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgoKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KWkpID09IHN0cmF0ZWd5KSB8fAorICAgICAgICAgICAgICAgIChOVU1fU1RSQVRFR0lFUyA9PSBzdHJhdGVneSkpICYmCisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2F1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpCit7CisgICAgcmV0dXJuIG1FbmdpbmUtPmdldEZvcmNlVXNlKHVzYWdlKTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzSW5DYWxsKCkKK3sKKyAgICByZXR1cm4gaXNTdGF0ZUluQ2FsbChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkpOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTdGF0ZUluQ2FsbChpbnQgc3RhdGUpCit7CisgICAgcmV0dXJuIGlzX3N0YXRlX2luX2NhbGwoc3RhdGUpOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjNhZTRhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmgKQEAgLTAsMCArMSw2MTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbWlzYy5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KKyNpbmNsdWRlICJBdWRpb1BvbGljeUludGVyZmFjZS5oIgorCisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaD4KKyNpbmNsdWRlIDxBdWRpb0dhaW4uaD4KKyNpbmNsdWRlIDxBdWRpb1BvcnQuaD4KKyNpbmNsdWRlIDxBdWRpb1BhdGNoLmg+CisjaW5jbHVkZSA8Q29uZmlnUGFyc2luZ1V0aWxzLmg+CisjaW5jbHVkZSA8RGV2aWNlRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPElPUHJvZmlsZS5oPgorI2luY2x1ZGUgPEh3TW9kdWxlLmg+CisjaW5jbHVkZSA8QXVkaW9JbnB1dERlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxBdWRpb091dHB1dERlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxBdWRpb1BvbGljeU1peC5oPgorI2luY2x1ZGUgPEVmZmVjdERlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxTb3VuZFRyaWdnZXJTZXNzaW9uLmg+CisjaW5jbHVkZSA8U3RyZWFtRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPFNlc3Npb25Sb3V0ZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQXR0ZW51YXRpb24gYXBwbGllZCB0byBTVFJBVEVHWV9TT05JRklDQVRJT04gc3RyZWFtcyB3aGVuIGEgaGVhZHNldCBpcyBjb25uZWN0ZWQ6IDZkQgorI2RlZmluZSBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfRkFDVE9SIDAuNQorI2RlZmluZSBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfRkFDVE9SX0RCICgtNikKKy8vIE1pbiB2b2x1bWUgZm9yIFNUUkFURUdZX1NPTklGSUNBVElPTiBzdHJlYW1zIHdoZW4gbGltaXRlZCBieSBtdXNpYyB2b2x1bWU6IC0zNmRCCisjZGVmaW5lIFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9NSU4gIDAuMDE2CisjZGVmaW5lIFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9NSU5fREIgICgtMzYpCisKKy8vIFRpbWUgaW4gbWlsbGlzZWNvbmRzIGR1cmluZyB3aGljaCB3ZSBjb25zaWRlciB0aGF0IG11c2ljIGlzIHN0aWxsIGFjdGl2ZSBhZnRlciBhIG11c2ljCisvLyB0cmFjayB3YXMgc3RvcHBlZCAtIHNlZSBjb21wdXRlVm9sdW1lKCkKKyNkZWZpbmUgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVkgIDUwMDAKKworLy8gVGltZSBpbiBtaWxsaXNlY29uZHMgZHVyaW5nIHdpdGNoIHNvbWUgc3RyZWFtcyBhcmUgbXV0ZWQgd2hpbGUgdGhlIGF1ZGlvIHBhdGgKKy8vIGlzIHN3aXRjaGVkCisjZGVmaW5lIE1VVEVfVElNRV9NUyAyMDAwCisKKyNkZWZpbmUgTlVNX1RFU1RfT1VUUFVUUyA1CisKKyNkZWZpbmUgTlVNX1ZPTF9DVVJWRV9LTkVFUyAyCisKKy8vIERlZmF1bHQgbWluaW11bSBsZW5ndGggYWxsb3dlZCBmb3Igb2ZmbG9hZGluZyBhIGNvbXByZXNzZWQgdHJhY2sKKy8vIENhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBhdWRpby5vZmZsb2FkLm1pbi5kdXJhdGlvbi5zZWNzIHByb3BlcnR5CisjZGVmaW5lIE9GRkxPQURfREVGQVVMVF9NSU5fRFVSQVRJT05fU0VDUyA2MAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBdWRpb1BvbGljeU1hbmFnZXIgaW1wbGVtZW50cyBhdWRpbyBwb2xpY3kgbWFuYWdlciBiZWhhdmlvciBjb21tb24gdG8gYWxsIHBsYXRmb3Jtcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyIDogcHVibGljIEF1ZGlvUG9saWN5SW50ZXJmYWNlLCBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIKKworI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCisgICAgLCBwdWJsaWMgVGhyZWFkCisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAoreworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOworICAgICAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeU1hbmFnZXIoKTsKKworICAgICAgICAvLyBBdWRpb1BvbGljeUludGVyZmFjZQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSk7CisgICAgICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpOworICAgICAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKTsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0U3lzdGVtUHJvcGVydHkoY29uc3QgY2hhciogcHJvcGVydHksIGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKKyAgICAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF90eXBlX3QgKmlucHV0VHlwZSk7CisKKyAgICAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdGFydHMgYmVpbmcgdXNlZC4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworCisgICAgICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RvcHMgYmVpbmcgdXNlZC4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgICAgIHZpcnR1YWwgdm9pZCBjbG9zZUFsbElucHV0cygpOworICAgICAgICB2aXJ0dWFsIHZvaWQgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKworICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBzdHJlYW0gdHlwZQorICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKyAgICAgICAgLy8gcmV0dXJuIHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cik7CisKKyAgICAgICAgLy8gcmV0dXJuIHRoZSBlbmFibGVkIG91dHB1dCBkZXZpY2VzIGZvciB0aGUgZ2l2ZW4gc3RyZWFtIHR5cGUKKyAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisKKyAgICAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYyA9IE5VTEwpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1FZmZlY3RzLnVucmVnaXN0ZXJFZmZlY3QoaWQpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1FZmZlY3RzLnNldEVmZmVjdEVuYWJsZWQoaWQsIGVuYWJsZWQpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworICAgICAgICAvLyByZXR1cm4gd2hldGhlciBhIHN0cmVhbSBpcyBwbGF5aW5nIHJlbW90ZWx5LCBvdmVycmlkZSB0byBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YKKyAgICAgICAgLy8gICBsb2NhbC9yZW1vdGUgcGxheWJhY2ssIHVzZWQgZm9yIGluc3RhbmNlIGJ5IG5vdGlmaWNhdGlvbiBtYW5hZ2VyIHRvIG5vdCBtYWtlCisgICAgICAgIC8vICAgbWVkaWEgcGxheWVycyBsb3NlIGF1ZGlvIGZvY3VzIHdoZW4gbm90IHBsYXlpbmcgbG9jYWxseQorICAgICAgICAvLyAgIEZvciB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbiwgInJlbW90ZWx5IiBtZWFucyBwbGF5aW5nIGR1cmluZyBzY3JlZW4gbWlycm9yaW5nIHdoaWNoCisgICAgICAgIC8vICAgdXNlcyBhbiBvdXRwdXQgZm9yIHBsYXliYWNrIHdpdGggYSBub24tZW1wdHksIG5vbiAiMCIgYWRkcmVzcy4KKyAgICAgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3Q7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgb2ZmbG9hZEluZm8pOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtU291bmRUcmlnZ2VyU2Vzc2lvbnMucmVsZWFzZVNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyUG9saWN5TWl4ZXMoVmVjdG9yPEF1ZGlvTWl4PiBtaXhlcyk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlclBvbGljeU1peGVzKFZlY3RvcjxBdWRpb01peD4gbWl4ZXMpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpoYW5kbGUpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUpOworCisgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgcmVsZWFzZVJlc291cmNlc0ZvclVpZCh1aWRfdCB1aWQpOworCisgICAgICAgIC8vIEF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUgcGFyc2luZyAoYXVkaW9fcG9saWN5LmNvbmYpCisgICAgICAgIC8vIFRPRE8gY2FuZGlkYXRlcyB0byBiZSBtb3ZlZCB0byBDb25maWdQYXJzaW5nVXRpbHMKKyAgICAgICAgICAgICAgICB2b2lkIGRlZmF1bHRBdWRpb1BvbGljeUNvbmZpZyh2b2lkKTsKKworICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBzdHJlYW0gdHlwZQorICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgICAgICAvLyBGcm9tIEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyCisgICAgICAgIHZpcnR1YWwgY29uc3QgQXVkaW9QYXRjaENvbGxlY3Rpb24gJmdldEF1ZGlvUGF0Y2hlcygpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtQXVkaW9QYXRjaGVzOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgY29uc3QgU291bmRUcmlnZ2VyU2Vzc2lvbkNvbGxlY3Rpb24gJmdldFNvdW5kVHJpZ2dlclNlc3Npb25Db2xsZWN0aW9uKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Tb3VuZFRyaWdnZXJTZXNzaW9uczsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGNvbnN0IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbiAmZ2V0QXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lNaXhlczsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZnZXRPdXRwdXRzKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1PdXRwdXRzOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgY29uc3QgQXVkaW9JbnB1dENvbGxlY3Rpb24gJmdldElucHV0cygpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtSW5wdXRzOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgY29uc3QgRGV2aWNlVmVjdG9yICZnZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgY29uc3QgRGV2aWNlVmVjdG9yICZnZXRBdmFpbGFibGVJbnB1dERldmljZXMoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbUF2YWlsYWJsZUlucHV0RGV2aWNlczsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uICZnZXRTdHJlYW1EZXNjcmlwdG9ycygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtU3RyZWFtczsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZnZXREZWZhdWx0T3V0cHV0RGV2aWNlKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1EZWZhdWx0T3V0cHV0RGV2aWNlOworICAgICAgICB9Citwcm90ZWN0ZWQ6CisgICAgICAgIHZvaWQgYWRkT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MpOworICAgICAgICB2b2lkIHJlbW92ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworICAgICAgICB2b2lkIGFkZElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjKTsKKworICAgICAgICAvLyByZXR1cm4gYXBwcm9wcmlhdGUgZGV2aWNlIGZvciBzdHJlYW1zIGhhbmRsZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJhdGVneSBhY2NvcmRpbmcgdG8gY3VycmVudAorICAgICAgICAvLyBwaG9uZSBzdGF0ZSwgY29ubmVjdGVkIGRldmljZXMuLi4KKyAgICAgICAgLy8gaWYgZnJvbUNhY2hlIGlzIHRydWUsIHRoZSBkZXZpY2UgaXMgcmV0dXJuZWQgZnJvbSBtRGV2aWNlRm9yU3RyYXRlZ3lbXSwKKyAgICAgICAgLy8gb3RoZXJ3aXNlIGl0IGlzIGRldGVybWluZSBieSBjdXJyZW50IHN0YXRlCisgICAgICAgIC8vIChkZXZpY2UgY29ubmVjdGVkLHBob25lIHN0YXRlLCBmb3JjZSB1c2UsIGEyZHAgb3V0cHV0Li4uKQorICAgICAgICAvLyBUaGlzIGFsbG93cyB0bzoKKyAgICAgICAgLy8gIDEgc3BlZWQgdXAgcHJvY2VzcyB3aGVuIHRoZSBzdGF0ZSBpcyBzdGFibGUgKHdoZW4gc3RhcnRpbmcgb3Igc3RvcHBpbmcgYW4gb3V0cHV0KQorICAgICAgICAvLyAgMiBhY2Nlc3MgdG8gZWl0aGVyIGN1cnJlbnQgZGV2aWNlIHNlbGVjdGlvbiAoZnJvbUNhY2hlID09IHRydWUpIG9yCisgICAgICAgIC8vICJmdXR1cmUiIGRldmljZSBzZWxlY3Rpb24gKGZyb21DYWNoZSA9PSBmYWxzZSkgd2hlbiBjYWxsZWQgZnJvbSBhIGNvbnRleHQKKyAgICAgICAgLy8gIHdoZXJlIGNvbmRpdGlvbnMgYXJlIGNoYW5naW5nIChzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSwgc2V0UGhvbmVTdGF0ZSgpLi4uKSBBTkQKKyAgICAgICAgLy8gIGJlZm9yZSB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpIGlzIGNhbGxlZC4KKyAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpOworCisgICAgICAgIGJvb2wgaXNTdHJhdGVneUFjdGl2ZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MsIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9IDAsIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0OworCisgICAgICAgIC8vIGNoYW5nZSB0aGUgcm91dGUgb2YgdGhlIHNwZWNpZmllZCBvdXRwdXQuIFJldHVybnMgdGhlIG51bWJlciBvZiBtcyB3ZSBoYXZlIHNsZXB0IHRvCisgICAgICAgIC8vIGFsbG93IG5ldyByb3V0aW5nIHRvIHRha2UgZWZmZWN0IGluIGNlcnRhaW4gY2FzZXMuCisgICAgICAgIHZpcnR1YWwgdWludDMyX3Qgc2V0T3V0cHV0RGV2aWNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhZGRyZXNzID0gTlVMTCk7CisgICAgICAgIHN0YXR1c190IHJlc2V0T3V0cHV0RGV2aWNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCk7CisgICAgICAgIHN0YXR1c190IHNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwpOworICAgICAgICBzdGF0dXNfdCByZXNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwpOworCisgICAgICAgIC8vIHNlbGVjdCBpbnB1dCBkZXZpY2UgY29ycmVzcG9uZGluZyB0byByZXF1ZXN0ZWQgYXVkaW8gc291cmNlCisgICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKTsKKworICAgICAgICAvLyBjb21wdXRlIHRoZSBhY3R1YWwgdm9sdW1lIGZvciBhIGdpdmVuIHN0cmVhbSBhY2NvcmRpbmcgdG8gdGhlIHJlcXVlc3RlZCBpbmRleCBhbmQgYSBwYXJ0aWN1bGFyCisgICAgICAgIC8vIGRldmljZQorICAgICAgICB2aXJ0dWFsIGZsb2F0IGNvbXB1dGVWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKworICAgICAgICAvLyBjaGVjayB0aGF0IHZvbHVtZSBjaGFuZ2UgaXMgcGVybWl0dGVkLCBjb21wdXRlIGFuZCBzZW5kIG5ldyB2b2x1bWUgdG8gYXVkaW8gaGFyZHdhcmUKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjaGVja0FuZFNldFZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsIGJvb2wgZm9yY2UgPSBmYWxzZSk7CisKKyAgICAgICAgLy8gYXBwbHkgYWxsIHN0cmVhbSB2b2x1bWVzIHRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0IGFuZCBkZXZpY2UKKyAgICAgICAgdm9pZCBhcHBseVN0cmVhbVZvbHVtZXMoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGRlbGF5TXMgPSAwLCBib29sIGZvcmNlID0gZmFsc2UpOworCisgICAgICAgIC8vIE11dGUgb3IgdW5tdXRlIGFsbCBzdHJlYW1zIGhhbmRsZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJhdGVneSBvbiB0aGUgc3BlY2lmaWVkIG91dHB1dAorICAgICAgICB2b2lkIHNldFN0cmF0ZWd5TXV0ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KTApOworCisgICAgICAgIC8vIE11dGUgb3IgdW5tdXRlIHRoZSBzdHJlYW0gb24gdGhlIHNwZWNpZmllZCBvdXRwdXQKKyAgICAgICAgdm9pZCBzZXRTdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCkwKTsKKworICAgICAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNlcyBmb3Igc29uaWZpY2F0aW9uIHN0cmF0ZWd5IHdoaWxlIGluIGNhbGw6IG11dGUgc3RyZWFtcyBvciByZXBsYWNlIGJ5CisgICAgICAgIC8vIGEgc3BlY2lhbCB0b25lIGluIHRoZSBkZXZpY2UgdXNlZCBmb3IgY29tbXVuaWNhdGlvbgorICAgICAgICB2b2lkIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCBzdGFydGluZywgYm9vbCBzdGF0ZUNoYW5nZSk7CisKKyAgICAgICAgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKTsKKworICAgICAgICAvLyB0cnVlIGlmIGRldmljZSBpcyBpbiBhIHRlbGVwaG9ueSBvciBWb0lQIGNhbGwKKyAgICAgICAgdmlydHVhbCBib29sIGlzSW5DYWxsKCk7CisgICAgICAgIC8vIHRydWUgaWYgZ2l2ZW4gc3RhdGUgcmVwcmVzZW50cyBhIGRldmljZSBpbiBhIHRlbGVwaG9ueSBvciBWb0lQIGNhbGwKKyAgICAgICAgdmlydHVhbCBib29sIGlzU3RhdGVJbkNhbGwoaW50IHN0YXRlKTsKKworICAgICAgICAvLyB3aGVuIGEgZGV2aWNlIGlzIGNvbm5lY3RlZCwgY2hlY2tzIGlmIGFuIG9wZW4gb3V0cHV0IGNhbiBiZSByb3V0ZWQKKyAgICAgICAgLy8gdG8gdGhpcyBkZXZpY2UuIElmIG5vbmUgaXMgb3BlbiwgdHJpZXMgdG8gb3BlbiBvbmUgb2YgdGhlIGF2YWlsYWJsZSBvdXRwdXRzLgorICAgICAgICAvLyBSZXR1cm5zIGFuIG91dHB1dCBzdWl0YWJsZSB0byB0aGlzIGRldmljZSBvciAwLgorICAgICAgICAvLyB3aGVuIGEgZGV2aWNlIGlzIGRpc2Nvbm5lY3RlZCwgY2hlY2tzIGlmIGFuIG91dHB1dCBpcyBub3QgdXNlZCBhbnkgbW9yZSBhbmQKKyAgICAgICAgLy8gcmV0dXJucyBpdHMgaGFuZGxlIGlmIGFueS4KKyAgICAgICAgLy8gdHJhbnNmZXJzIHRoZSBhdWRpbyB0cmFja3MgYW5kIGVmZmVjdHMgZnJvbSBvbmUgb3V0cHV0IHRocmVhZCB0byBhbm90aGVyIGFjY29yZGluZ2x5LgorICAgICAgICBzdGF0dXNfdCBjaGVja091dHB1dHNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGFkZHJlc3MpOworCisgICAgICAgIHN0YXR1c190IGNoZWNrSW5wdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgaW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGFkZHJlc3MpOworCisgICAgICAgIC8vIGNsb3NlIGFuIG91dHB1dCBhbmQgaXRzIGNvbXBhbmlvbiBkdXBsaWNhdGluZyBvdXRwdXQuCisgICAgICAgIHZvaWQgY2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKKworICAgICAgICAvLyBjbG9zZSBhbiBpbnB1dC4KKyAgICAgICAgdm9pZCBjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKKworICAgICAgICAvLyBjaGVja3MgYW5kIGlmIG5lY2Vzc2FyeSBjaGFuZ2VzIG91dHB1dHMgdXNlZCBmb3IgYWxsIHN0cmF0ZWdpZXMuCisgICAgICAgIC8vIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBjb25kaXRpb24gdGhhdCBhZmZlY3RzIHRoZSBvdXRwdXQgY2hvaWNlIGZvciBhIGdpdmVuIHN0cmF0ZWd5CisgICAgICAgIC8vIGNoYW5nZXM6IGNvbm5lY3RlZCBkZXZpY2UsIHBob25lIHN0YXRlLCBmb3JjZSB1c2UuLi4KKyAgICAgICAgLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCkKKyAgICAgICAgdm9pZCBjaGVja091dHB1dEZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpOworCisgICAgICAgIC8vIFNhbWUgYXMgY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIGJ1dCBmb3IgYSBhbGwgc3RyYXRlZ2llcyBpbiBvcmRlciBvZiBwcmlvcml0eQorICAgICAgICB2b2lkIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOworCisgICAgICAgIC8vIG1hbmFnZXMgQTJEUCBvdXRwdXQgc3VzcGVuZC9yZXN0b3JlIGFjY29yZGluZyB0byBwaG9uZSBzdGF0ZSBhbmQgQlQgU0NPIHVzYWdlCisgICAgICAgIHZvaWQgY2hlY2tBMmRwU3VzcGVuZCgpOworCisgICAgICAgIC8vIHNlbGVjdHMgdGhlIG1vc3QgYXBwcm9wcmlhdGUgZGV2aWNlIG9uIG91dHB1dCBmb3IgY3VycmVudCBzdGF0ZQorICAgICAgICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgZGV2aWNlIGNob2ljZSBmb3IgYSBnaXZlbiBvdXRwdXQgaXMKKyAgICAgICAgLy8gY2hhbmdlZDogY29ubmVjdGVkIGRldmljZSwgcGhvbmUgc3RhdGUsIGZvcmNlIHVzZSwgb3V0cHV0IHN0YXJ0LCBvdXRwdXQgc3RvcC4uCisgICAgICAgIC8vIHNlZSBnZXREZXZpY2VGb3JTdHJhdGVneSgpIGZvciB0aGUgdXNlIG9mIGZyb21DYWNoZSBwYXJhbWV0ZXIKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGdldE5ld091dHB1dERldmljZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKTsKKworICAgICAgICAvLyB1cGRhdGVzIGNhY2hlIG9mIGRldmljZSB1c2VkIGJ5IGFsbCBzdHJhdGVnaWVzIChtRGV2aWNlRm9yU3RyYXRlZ3lbXSkKKyAgICAgICAgLy8gbXVzdCBiZSBjYWxsZWQgZXZlcnkgdGltZSBhIGNvbmRpdGlvbiB0aGF0IGFmZmVjdHMgdGhlIGRldmljZSBjaG9pY2UgZm9yIGEgZ2l2ZW4gc3RyYXRlZ3kgaXMKKyAgICAgICAgLy8gY2hhbmdlZDogY29ubmVjdGVkIGRldmljZSwgcGhvbmUgc3RhdGUsIGZvcmNlIHVzZS4uLgorICAgICAgICAvLyBjYWNoZWQgdmFsdWVzIGFyZSB1c2VkIGJ5IGdldERldmljZUZvclN0cmF0ZWd5KCkgaWYgcGFyYW1ldGVyIGZyb21DYWNoZSBpcyB0cnVlLgorICAgICAgICAgLy8gTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkKKyAgICAgICAgdm9pZCB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOworCisgICAgICAgIC8vIHNlbGVjdHMgdGhlIG1vc3QgYXBwcm9wcmlhdGUgZGV2aWNlIG9uIGlucHV0IGZvciBjdXJyZW50IHN0YXRlCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBnZXROZXdJbnB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CisKKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRNYXhFZmZlY3RzQ3B1TG9hZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtRWZmZWN0cy5nZXRNYXhFZmZlY3RzQ3B1TG9hZCgpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRNYXhFZmZlY3RzTWVtb3J5KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1FZmZlY3RzLmdldE1heEVmZmVjdHNNZW1vcnkoKTsKKyAgICAgICAgfQorI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCisgICAgICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHRocmVhZExvb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZXhpdCgpOworICAgICAgICBpbnQgdGVzdE91dHB1dEluZGV4KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorCisgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gZ2V0T3V0cHV0c0ZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gb3Blbk91dHB1dHMpOworICAgICAgICBib29sIHZlY3RvcnNFcXVhbChTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMik7CisKKyAgICAgICAgLy8gbXV0ZS91bm11dGUgc3RyYXRlZ2llcyB1c2luZyBhbiBpbmNvbXBhdGlibGUgZGV2aWNlIGNvbWJpbmF0aW9uCisgICAgICAgIC8vIGlmIG11dGluZywgd2FpdCBmb3IgdGhlIGF1ZGlvIGluIHBjbSBidWZmZXIgdG8gYmUgZHJhaW5lZCBiZWZvcmUgcHJvY2VlZGluZworICAgICAgICAvLyBpZiB1bm11dGluZywgdW5tdXRlIG9ubHkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBkZWxheQorICAgICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbXMgd2FpdGVkCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgIGNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJldkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcyk7CisKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc2VsZWN0T3V0cHV0KGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCk7CisgICAgICAgIC8vIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayBhcmUgaW4vb3V0IGFuZCBzbyBtYXkgYmUgbW9kaWZpZWQKKyAgICAgICAgc3A8SU9Qcm9maWxlPiBnZXRJbnB1dFByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCYgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCYgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOworICAgICAgICBzcDxJT1Byb2ZpbGU+IGdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKKworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzZWxlY3RPdXRwdXRGb3JFZmZlY3RzKGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsIGNvbnN0IHNwPEF1ZGlvUGF0Y2g+JiBwYXRjaCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1BdWRpb1BhdGNoZXMuYWRkQXVkaW9QYXRjaChoYW5kbGUsIHBhdGNoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbUF1ZGlvUGF0Y2hlcy5yZW1vdmVBdWRpb1BhdGNoKGhhbmRsZSk7CisgICAgICAgIH0KKworICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlUHJpbWFyeU91dHB1dERldmljZXMoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWhhc1ByaW1hcnlPdXRwdXQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtUHJpbWFyeU91dHB1dC0+c3VwcG9ydGVkRGV2aWNlcygpICYgbUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKTsKKyAgICAgICAgfQorICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlUHJpbWFyeUlucHV0RGV2aWNlcygpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaGFzUHJpbWFyeU91dHB1dCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21Id01vZHVsZShtUHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB1cGRhdGVDYWxsUm91dGluZyhhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UsIGludCBkZWxheU1zID0gMCk7CisKKyAgICAgICAgLy8gaWYgYXJndW1lbnQgImRldmljZSIgaXMgZGlmZmVyZW50IGZyb20gQVVESU9fREVWSUNFX05PTkUsICBzdGFydFNvdXJjZSgpIHdpbGwgZm9yY2UKKyAgICAgICAgLy8gdGhlIHJlLWV2YWx1YXRpb24gb2YgdGhlIG91dHB1dCBkZXZpY2UuCisgICAgICAgIHN0YXR1c190IHN0YXJ0U291cmNlKHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpkZWxheU1zKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RvcFNvdXJjZShzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZURldmljZVVwZGF0ZSk7CisKKyAgICAgICAgdm9pZCBjbGVhckF1ZGlvUGF0Y2hlcyh1aWRfdCB1aWQpOworICAgICAgICB2b2lkIGNsZWFyU2Vzc2lvblJvdXRlcyh1aWRfdCB1aWQpOworICAgICAgICB2b2lkIGNoZWNrU3RyYXRlZ3lSb3V0ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LCBhdWRpb19pb19oYW5kbGVfdCBvdXB0dXRUb1NraXApOworCisgICAgICAgIHN0YXR1c190IGhhc1ByaW1hcnlPdXRwdXQoKSBjb25zdCB7IHJldHVybiBtUHJpbWFyeU91dHB1dCAhPSAwOyB9CisKKyAgICAgICAgdWlkX3QgbVVpZENhY2hlZDsKKyAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKm1wQ2xpZW50SW50ZXJmYWNlOyAgLy8gYXVkaW8gcG9saWN5IGNsaWVudCBpbnRlcmZhY2UKKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG1QcmltYXJ5T3V0cHV0OyAgICAgLy8gcHJpbWFyeSBvdXRwdXQgZGVzY3JpcHRvcgorICAgICAgICAvLyBsaXN0IG9mIGRlc2NyaXB0b3JzIGZvciBvdXRwdXRzIGN1cnJlbnRseSBvcGVuZWQKKworICAgICAgICBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiBtT3V0cHV0czsKKyAgICAgICAgLy8gY29weSBvZiBtT3V0cHV0cyBiZWZvcmUgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgb3BlbnMgbmV3IG91dHB1dHMKKyAgICAgICAgLy8gcmVzZXQgdG8gbU91dHB1dHMgd2hlbiB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpIGlzIGNhbGxlZC4KKyAgICAgICAgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gbVByZXZpb3VzT3V0cHV0czsKKyAgICAgICAgQXVkaW9JbnB1dENvbGxlY3Rpb24gbUlucHV0czsgICAgIC8vIGxpc3Qgb2YgaW5wdXQgZGVzY3JpcHRvcnMKKworICAgICAgICBEZXZpY2VWZWN0b3IgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzOyAvLyBhbGwgYXZhaWxhYmxlIG91dHB1dCBkZXZpY2VzCisgICAgICAgIERldmljZVZlY3RvciAgbUF2YWlsYWJsZUlucHV0RGV2aWNlczsgIC8vIGFsbCBhdmFpbGFibGUgaW5wdXQgZGV2aWNlcworCisgICAgICAgIFNlc3Npb25Sb3V0ZU1hcCBtT3V0cHV0Um91dGVzID0gU2Vzc2lvblJvdXRlTWFwKFNlc3Npb25Sb3V0ZU1hcDo6TUFQVFlQRV9PVVRQVVQpOworICAgICAgICBTZXNzaW9uUm91dGVNYXAgbUlucHV0Um91dGVzID0gU2Vzc2lvblJvdXRlTWFwKFNlc3Npb25Sb3V0ZU1hcDo6TUFQVFlQRV9JTlBVVCk7CisKKyAgICAgICAgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb24gbVN0cmVhbXM7IC8vIHN0cmVhbSBkZXNjcmlwdG9ycyBmb3Igdm9sdW1lIGNvbnRyb2wKKyAgICAgICAgYm9vbCAgICBtTGltaXRSaW5ndG9uZVZvbHVtZTsgICAgICAgIC8vIGxpbWl0IHJpbmd0b25lIHZvbHVtZSB0byBtdXNpYyB2b2x1bWUgaWYgaGVhZHNldCBjb25uZWN0ZWQKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2VGb3JTdHJhdGVneVtOVU1fU1RSQVRFR0lFU107CisgICAgICAgIGZsb2F0ICAgbUxhc3RWb2ljZVZvbHVtZTsgICAgICAgICAgICAvLyBsYXN0IHZvaWNlIHZvbHVtZSB2YWx1ZSBzZW50IHRvIGF1ZGlvIEhBTAorCisgICAgICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIG1FZmZlY3RzOyAgLy8gbGlzdCBvZiByZWdpc3RlcmVkIGF1ZGlvIGVmZmVjdHMKKyAgICAgICAgYm9vbCAgICBtQTJkcFN1c3BlbmRlZDsgIC8vIHRydWUgaWYgQTJEUCBvdXRwdXQgaXMgc3VzcGVuZGVkCisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IG1EZWZhdWx0T3V0cHV0RGV2aWNlOyAvLyBvdXRwdXQgZGV2aWNlIHNlbGVjdGVkIGJ5IGRlZmF1bHQgYXQgYm9vdCB0aW1lCisgICAgICAgIGJvb2wgbVNwZWFrZXJEcmNFbmFibGVkOy8vIHRydWUgb24gZGV2aWNlcyB0aGF0IHVzZSBEUkMgb24gdGhlIERFVklDRV9DQVRFR09SWV9TUEVBS0VSIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYm9vc3Qgc29mdCBzb3VuZHMsIHVzZWQgdG8gYWRqdXN0IHZvbHVtZSBjdXJ2ZXMgYWNjb3JkaW5nbHkKKworICAgICAgICBId01vZHVsZUNvbGxlY3Rpb24gbUh3TW9kdWxlczsKKworICAgICAgICB2b2xhdGlsZSBpbnQzMl90IG1BdWRpb1BvcnRHZW5lcmF0aW9uOworCisgICAgICAgIEF1ZGlvUGF0Y2hDb2xsZWN0aW9uIG1BdWRpb1BhdGNoZXM7CisKKyAgICAgICAgU291bmRUcmlnZ2VyU2Vzc2lvbkNvbGxlY3Rpb24gbVNvdW5kVHJpZ2dlclNlc3Npb25zOworCisgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IG1DYWxsVHhQYXRjaDsKKyAgICAgICAgc3A8QXVkaW9QYXRjaD4gbUNhbGxSeFBhdGNoOworCisgICAgICAgIC8vIGZvciBzdXBwb3J0aW5nICJiZWFjb24iIHN0cmVhbXMsIGkuZS4gc3RyZWFtcyB0aGF0IG9ubHkgcGxheSBvbiBzcGVha2VyLCBhbmQgbmV2ZXIKKyAgICAgICAgLy8gd2hlbiBzb21ldGhpbmcgb3RoZXIgdGhhbiBTVFJFQU1fVFRTIChhLmsuYS4gIlRyYW5zbWl0dGVkIFRocm91Z2ggU3BlYWtlciIpIGlzIHBsYXlpbmcKKyAgICAgICAgZW51bSB7CisgICAgICAgICAgICBTVEFSVElOR19PVVRQVVQsCisgICAgICAgICAgICBTVEFSVElOR19CRUFDT04sCisgICAgICAgICAgICBTVE9QUElOR19PVVRQVVQsCisgICAgICAgICAgICBTVE9QUElOR19CRUFDT04KKyAgICAgICAgfTsKKyAgICAgICAgdWludDMyX3QgbUJlYWNvbk11dGVSZWZDb3VudDsgICAvLyByZWYgY291bnQgZm9yIHN0cmVhbSB0aGF0IHdvdWxkIG11dGUgYmVhY29uCisgICAgICAgIHVpbnQzMl90IG1CZWFjb25QbGF5aW5nUmVmQ291bnQ7Ly8gcmVmIGNvdW50IGZvciB0aGUgcGxheWluZyBiZWFjb24gc3RyZWFtcworICAgICAgICBib29sIG1CZWFjb25NdXRlZDsgICAgICAgICAgICAgIC8vIGhhcyBTVFJFQU1fVFRTIGJlZW4gbXV0ZWQKKworICAgICAgICBBdWRpb1BvbGljeU1peENvbGxlY3Rpb24gbVBvbGljeU1peGVzOyAvLyBsaXN0IG9mIHJlZ2lzdGVyZWQgbWl4ZXMKKworI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCisgICAgICAgIE11dGV4ICAgbUxvY2s7CisgICAgICAgIENvbmRpdGlvbiBtV2FpdFdvcmtDVjsKKworICAgICAgICBpbnQgICAgICAgICAgICAgbUN1ck91dHB1dDsKKyAgICAgICAgYm9vbCAgICAgICAgICAgIG1EaXJlY3RPdXRwdXQ7CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1UZXN0T3V0cHV0c1tOVU1fVEVTVF9PVVRQVVRTXTsKKyAgICAgICAgaW50ICAgICAgICAgICAgIG1UZXN0SW5wdXQ7CisgICAgICAgIHVpbnQzMl90ICAgICAgICBtVGVzdERldmljZTsKKyAgICAgICAgdWludDMyX3QgICAgICAgIG1UZXN0U2FtcGxpbmdSYXRlOworICAgICAgICB1aW50MzJfdCAgICAgICAgbVRlc3RGb3JtYXQ7CisgICAgICAgIHVpbnQzMl90ICAgICAgICBtVGVzdENoYW5uZWxzOworICAgICAgICB1aW50MzJfdCAgICAgICAgbVRlc3RMYXRlbmN5TXM7CisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorCisgICAgICAgIHVpbnQzMl90IG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisKKyAgICAgICAgLy8gQXVkaW8gUG9saWN5IEVuZ2luZSBJbnRlcmZhY2UuCisgICAgICAgIEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZSAqbUVuZ2luZTsKK3ByaXZhdGU6CisgICAgICAgIC8vIHVwZGF0ZXMgZGV2aWNlIGNhY2hpbmcgYW5kIG91dHB1dCBmb3Igc3RyZWFtcyB0aGF0IGNhbiBpbmZsdWVuY2UgdGhlCisgICAgICAgIC8vICAgIHJvdXRpbmcgb2Ygbm90aWZpY2F0aW9ucworICAgICAgICB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvblJvdXRpbmdGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgICAgICAvLyBmaW5kIHRoZSBvdXRwdXRzIG9uIGEgZ2l2ZW4gb3V0cHV0IGRlc2NyaXB0b3IgdGhhdCBoYXZlIHRoZSBnaXZlbiBhZGRyZXNzLgorICAgICAgICAvLyB0byBiZSBjYWxsZWQgb24gYW4gQXVkaW9PdXRwdXREZXNjcmlwdG9yIHdob3NlIHN1cHBvcnRlZCBkZXZpY2VzIChhcyBkZWZpbmVkCisgICAgICAgIC8vICAgaW4gbVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzKSBtYXRjaGVzIHRoZSBkZXZpY2Ugd2hvc2UgYWRkcmVzcyBpcyB0byBiZSBtYXRjaGVkLgorICAgICAgICAvLyBzZWUgZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhhdWRpb19kZXZpY2VzX3QpIGZvciB3aGV0aGVyIHRoZSBkZXZpY2UgdHlwZSBpcyBvbmUKKyAgICAgICAgLy8gICB3aGVyZSBhZGRyZXNzZXMgYXJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBvbmUgY29ubmVjdGVkIGRldmljZSBhbmQgYW5vdGhlci4KKyAgICAgICAgdm9pZCBmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjIC8qaW4qLywKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlIC8qaW4qLywKKyAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGFkZHJlc3MgLyppbiovLAorICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMgLypvdXQqLyk7CisgICAgICAgIHVpbnQzMl90IGN1ckF1ZGlvUG9ydEdlbmVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtQXVkaW9Qb3J0R2VuZXJhdGlvbjsgfQorICAgICAgICAvLyBpbnRlcm5hbCBtZXRob2QgdG8gcmV0dXJuIHRoZSBvdXRwdXQgaGFuZGxlIGZvciB0aGUgZ2l2ZW4gZGV2aWNlIGFuZCBmb3JtYXQKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRGV2aWNlKAorICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pOworICAgICAgICAvLyBpbnRlcm5hbCBmdW5jdGlvbiB0byBkZXJpdmUgYSBzdHJlYW0gdHlwZSB2YWx1ZSBmcm9tIGF1ZGlvIGF0dHJpYnV0ZXMKKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKTsKKyAgICAgICAgLy8gZXZlbnQgaXMgb25lIG9mIFNUQVJUSU5HX09VVFBVVCwgU1RBUlRJTkdfQkVBQ09OLCBTVE9QUElOR19PVVRQVVQsIFNUT1BQSU5HX0JFQUNPTgorICAgICAgICAvLyByZXR1cm5zIDAgaWYgbm8gbXV0ZS91bm11dGUgZXZlbnQgaGFwcGVuZWQsIHRoZSBsYXJnZXN0IGxhdGVuY3kgb2YgdGhlIGRldmljZSB3aGVyZQorICAgICAgICAvLyAgIHRoZSBtdXRlL3VubXV0ZSBoYXBwZW5lZAorICAgICAgICB1aW50MzJfdCBoYW5kbGVFdmVudEZvckJlYWNvbihpbnQgZXZlbnQpOworICAgICAgICB1aW50MzJfdCBzZXRCZWFjb25NdXRlKGJvb2wgbXV0ZSk7CisgICAgICAgIGJvb2wgICAgIGlzVmFsaWRBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqcGFhKTsKKworICAgICAgICAvLyBzZWxlY3QgaW5wdXQgZGV2aWNlIGNvcnJlc3BvbmRpbmcgdG8gcmVxdWVzdGVkIGF1ZGlvIHNvdXJjZSBhbmQgcmV0dXJuIGFzc29jaWF0ZWQgcG9saWN5CisgICAgICAgIC8vIG1peCBpZiBhbnkuIENhbGxzIGdldERldmljZUZvcklucHV0U291cmNlKCkuCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXggKipwb2xpY3lNaXggPSBOVUxMKTsKKworICAgICAgICAvLyBDYWxsZWQgYnkgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkuCisgICAgICAgIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSk7Cit9OworCit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcApzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCnJlbmFtZSB0byBzZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKaW5kZXggM2UwOTBlOS4uNDg5YTliZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKQEAgLTIxMyw2ICsyMTMsMTIgQEAKICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoCisgICAgICAgIFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpCit7CisgICAgbUF1ZGlvUG9saWN5U2VydmljZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUocmVnSWQsIHN0YXRlKTsKK30KKwogYXVkaW9fdW5pcXVlX2lkX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6bmV3QXVkaW9VbmlxdWVJZCgpCiB7CiAgICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjpuZXdBdWRpb1VuaXF1ZUlkKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUNsaWVudEltcGxMZWdhY3kuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGxMZWdhY3kuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUNsaWVudEltcGxMZWdhY3kuY3BwCnJlbmFtZSB0byBzZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbExlZ2FjeS5jcHAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcApyZW5hbWUgdG8gc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCmluZGV4IGU2YWNlMjAuLjI4MmRkZWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCkBAIC0xMDksOCArMTA5LDggQEAKICAgICAgICAgVmVjdG9yIDxFZmZlY3REZXNjICo+IGVmZmVjdHMgPSBtSW5wdXRTb3VyY2VzLnZhbHVlQXQoaW5kZXgpLT5tRWZmZWN0czsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBFZmZlY3REZXNjICplZmZlY3QgPSBlZmZlY3RzW2ldOwotICAgICAgICAgICAgc3A8QXVkaW9FZmZlY3Q+IGZ4ID0gbmV3IEF1ZGlvRWZmZWN0KE5VTEwsICZlZmZlY3QtPm1VdWlkLCAtMSwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1Nlc3Npb24sIGlucHV0KTsKKyAgICAgICAgICAgIHNwPEF1ZGlvRWZmZWN0PiBmeCA9IG5ldyBBdWRpb0VmZmVjdChOVUxMLCBTdHJpbmcxNigiYW5kcm9pZCIpLCAmZWZmZWN0LT5tVXVpZCwgLTEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgYXVkaW9TZXNzaW9uLCBpbnB1dCk7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmeC0+aW5pdENoZWNrKCk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgewogICAgICAgICAgICAgICAgIEFMT0dXKCJhZGRJbnB1dEVmZmVjdHMoKTogZmFpbGVkIHRvIGNyZWF0ZSBGeCAlcyBvbiBzb3VyY2UgJWQiLApAQCAtMjU0LDcgKzI1NCw3IEBACiAgICAgICAgIFZlY3RvciA8RWZmZWN0RGVzYyAqPiBlZmZlY3RzID0gbU91dHB1dFN0cmVhbXMudmFsdWVBdChpbmRleCktPm1FZmZlY3RzOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIEVmZmVjdERlc2MgKmVmZmVjdCA9IGVmZmVjdHNbaV07Ci0gICAgICAgICAgICBzcDxBdWRpb0VmZmVjdD4gZnggPSBuZXcgQXVkaW9FZmZlY3QoTlVMTCwgJmVmZmVjdC0+bVV1aWQsIDAsIDAsIDAsCisgICAgICAgICAgICBzcDxBdWRpb0VmZmVjdD4gZnggPSBuZXcgQXVkaW9FZmZlY3QoTlVMTCwgU3RyaW5nMTYoImFuZHJvaWQiKSwgJmVmZmVjdC0+bVV1aWQsIDAsIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9TZXNzaW9uLCBvdXRwdXQpOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZngtPmluaXRDaGVjaygpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5RWZmZWN0cy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKcmVuYW1lIHRvIHNlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKc2ltaWxhcml0eSBpbmRleCA4OSUKcmVuYW1lIGZyb20gc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcApyZW5hbWUgdG8gc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCmluZGV4IGE0NWRiYjMuLmNhMzY1YTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCkBAIC0yOCw3ICsyOCw4IEBACiAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtNDYsOCArNDcsOCBAQAogCiAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLCBkZXZpY2VfYWRkcmVzcyk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKIH0KIAogYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKApAQCAtNzUsMTAgKzc2LDE0IEBACiAKICAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIik7CiAKKyAgICAvLyBhY3F1aXJlIGxvY2sgYmVmb3JlIGNhbGxpbmcgc2V0TW9kZSgpIHNvIHRoYXQgc2V0TW9kZSgpICsgc2V0UGhvbmVTdGF0ZSgpIGFyZSBhbiBhdG9taWMKKyAgICAvLyBvcGVyYXRpb24gZnJvbSBwb2xpY3kgbWFuYWdlciBzdGFuZHBvaW50IChubyBvdGhlciBvcGVyYXRpb24gKGUuZyB0cmFjayBzdGFydCBvciBzdG9wKQorICAgIC8vIGNhbiBiZSBpbnRlcmxlYXZlZCkuCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKwogICAgIC8vIFRPRE86IGNoZWNrIGlmIGl0IGlzIG1vcmUgYXBwcm9wcmlhdGUgdG8gZG8gaXQgaW4gcGxhdGZvcm0gc3BlY2lmaWMgcG9saWN5IG1hbmFnZXIKICAgICBBdWRpb1N5c3RlbTo6c2V0TW9kZShzdGF0ZSk7CiAKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFBob25lU3RhdGUoc3RhdGUpOwogICAgIG1QaG9uZVN0YXRlID0gc3RhdGU7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtMTQ1LDEwICsxNTAsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKQEAgLTE1Niw4ICsxNjMsMTcgQEAKICAgICB9CiAgICAgQUxPR1YoImdldE91dHB1dCgpIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0T3V0cHV0Rm9yQXR0cihhdHRyLCBvdXRwdXQsIHNlc3Npb24sIHN0cmVhbSwgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MsIG9mZmxvYWRJbmZvKTsKKworICAgIC8vIGlmIHRoZSBjYWxsZXIgaXMgdXMsIHRydXN0IHRoZSBzcGVjaWZpZWQgdWlkCisgICAgaWYgKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSAhPSBnZXRwaWRfY2FjaGVkIHx8IHVpZCA9PSAodWlkX3QpLTEpIHsKKyAgICAgICAgdWlkX3QgbmV3Y2xpZW50VWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgICAgICBpZiAodWlkICE9ICh1aWRfdCktMSAmJiB1aWQgIT0gbmV3Y2xpZW50VWlkKSB7CisgICAgICAgICAgICBBTE9HVygiJXMgdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsIF9fRlVOQ1RJT05fXywgbmV3Y2xpZW50VWlkLCB1aWQpOworICAgICAgICB9CisgICAgICAgIHVpZCA9IG5ld2NsaWVudFVpZDsKKyAgICB9CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE91dHB1dEZvckF0dHIoYXR0ciwgb3V0cHV0LCBzZXNzaW9uLCBzdHJlYW0sIHVpZCwgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIG9mZmxvYWRJbmZvKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCkBAIC0yNDYsMTAgKzI2MiwxMiBAQAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC0yNjAsMTkgKzI3OCwyOCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGlmICgoKGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgJiYgIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB8fAotICAgICAgICAoKGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfRk1fVFVORVIpICYmICFjYXB0dXJlRm1UdW5lckFsbG93ZWQoKSkpIHsKKyAgICBpZiAoKGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgJiYgIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjppbnB1dF90eXBlX3QgaW5wdXRUeXBlOworICAgIC8vIGlmIHRoZSBjYWxsZXIgaXMgdXMsIHRydXN0IHRoZSBzcGVjaWZpZWQgdWlkCisgICAgaWYgKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSAhPSBnZXRwaWRfY2FjaGVkIHx8IHVpZCA9PSAodWlkX3QpLTEpIHsKKyAgICAgICAgdWlkX3QgbmV3Y2xpZW50VWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgICAgICBpZiAodWlkICE9ICh1aWRfdCktMSAmJiB1aWQgIT0gbmV3Y2xpZW50VWlkKSB7CisgICAgICAgICAgICBBTE9HVygiJXMgdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsIF9fRlVOQ1RJT05fXywgbmV3Y2xpZW50VWlkLCB1aWQpOworICAgICAgICB9CisgICAgICAgIHVpZCA9IG5ld2NsaWVudFVpZDsKKyAgICB9CisKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIC8vIHRoZSBhdWRpb19pbl9hY291c3RpY3NfdCBwYXJhbWV0ZXIgaXMgaWdub3JlZCBieSBnZXRfaW5wdXQoKQotICAgICAgICBzdGF0dXMgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRJbnB1dEZvckF0dHIoYXR0ciwgaW5wdXQsIHNlc3Npb24sCisgICAgICAgIHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPmdldElucHV0Rm9yQXR0cihhdHRyLCBpbnB1dCwgc2Vzc2lvbiwgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCAmaW5wdXRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dFR5cGUpOwogICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOwogCiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKQEAgLTI4MCw2ICszMDcsOCBAQAogICAgICAgICAgICAgc3dpdGNoIChpbnB1dFR5cGUpIHsKICAgICAgICAgICAgIGNhc2UgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9MRUdBQ1k6CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfVEVMRVBIT05ZX1JYOgorICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB1c2UgdGhlIHNhbWUgcGVybWlzc2lvbiBhcyBmb3IgcmVtb3RlIHN1Ym1peCBmb3Igbm93LgogICAgICAgICAgICAgY2FzZSBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX01JWF9DQVBUVVJFOgogICAgICAgICAgICAgICAgIGlmICghY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRJbnB1dEZvckF0dHIoKSBwZXJtaXNzaW9uIGRlbmllZDogY2FwdHVyZSBub3QgYWxsb3dlZCIpOwpAQCAtNTQ1LDkgKzU3NCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KQEAgLTU1OCw5ICs1ODQsNiBAQAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZighbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CkBAIC02MDEsOSArNjI0LDYgQEAKICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQpAQCAtNjYwLDQgKzY4MCwyNiBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaGFuZGxlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRBdWRpb1NvdXJjZShzb3VyY2UsIGF0dHJpYnV0ZXMsIGhhbmRsZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BBdWRpb1NvdXJjZShoYW5kbGUpOworfQorCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsTGVnYWN5LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsTGVnYWN5LmNwcApzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZUltcGxMZWdhY3kuY3BwCnJlbmFtZSB0byBzZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbExlZ2FjeS5jcHAKaW5kZXggYjg4NDZjNi4uMTNhZjNlZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsTGVnYWN5LmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbExlZ2FjeS5jcHAKQEAgLTMzLDcgKzMzLDggQEAKIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lIF9fdW51c2VkKQogewogICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC0yMzMsMTAgKzIzNCwxMiBAQAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgX191bnVzZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkIF9fdW51c2VkKQogewogICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC0yNTQsOCArMjU3LDcgQEAKICAgICAgICAgaW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDOwogICAgIH0KIAotICAgIGlmICgoKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJiAhY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHx8Ci0gICAgICAgICgoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSKSAmJiAhY2FwdHVyZUZtVHVuZXJBbGxvd2VkKCkpKSB7CisgICAgaWYgKChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgJiYgIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC01NjQsMTAgKzU2NiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCiB7CiAgICAgaWYgKGF0dHIgIT0gTlVMTCkgewpAQCAtNjAzLDQgKzYwNywxNiBAQAogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaGFuZGxlKQoreworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wQXVkaW9Tb3VyY2UoYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlKQoreworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5U2VydmljZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKc2ltaWxhcml0eSBpbmRleCA5MSUKcmVuYW1lIGZyb20gc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApyZW5hbWUgdG8gc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCmluZGV4IGViOTExNmQuLmM3N2NjNDUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5U2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCkBAIC0xNjYsNiArMTY2LDE3IEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Ob3RpZmljYXRpb25DbGllbnRzTG9jayk7CisKKyAgICB1aWRfdCB1aWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkodWlkKSA8IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUZvcih1aWQpLT5zZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGVuYWJsZWQpOworfQorCiAvLyByZW1vdmVOb3RpZmljYXRpb25DbGllbnQoKSBpcyBjYWxsZWQgd2hlbiB0aGUgY2xpZW50IHByb2Nlc3MgZGllcy4KIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVOb3RpZmljYXRpb25DbGllbnQodWlkX3QgdWlkKQogewpAQCAtMTc3LDcgKzE4OCw3IEBACiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlcikgewotICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+Y2xlYXJBdWRpb1BhdGNoZXModWlkKTsKKyAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VSZXNvdXJjZXNGb3JVaWQodWlkKTsKICAgICAgICAgfQogICAgIH0KICNlbmRpZgpAQCAtMjIyLDYgKzIzMywyMSBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpCit7CisgICAgQUxPR1YoIkF1ZGlvUG9saWN5U2VydmljZTo6b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoJXMsICVkKSIsCisgICAgICAgICAgICByZWdJZC5zdHJpbmcoKSwgc3RhdGUpOworICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5keW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGVDb21tYW5kKHJlZ0lkLCBzdGF0ZSk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb09uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Ob3RpZmljYXRpb25DbGllbnRzTG9jayk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTm90aWZpY2F0aW9uQ2xpZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUF0KGkpLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShyZWdJZCwgc3RhdGUpOworICAgIH0KK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpjbGllbnRTZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKIHsKQEAgLTIzMSw3ICsyNTcsOCBAQAogQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6Ok5vdGlmaWNhdGlvbkNsaWVudChjb25zdCBzcDxBdWRpb1BvbGljeVNlcnZpY2U+JiBzZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCi0gICAgOiBtU2VydmljZShzZXJ2aWNlKSwgbVVpZCh1aWQpLCBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50KGNsaWVudCkKKyAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpLCBtVWlkKHVpZCksIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQoY2xpZW50KSwKKyAgICAgIG1BdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGZhbHNlKQogewogfQogCkBAIC0yNTAsMTggKzI3NywzMiBAQAogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKQogewotICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDApIHsKKyAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwICYmIG1BdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKSB7CiAgICAgICAgIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwogICAgIH0KIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpCiB7Ci0gICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCkgeworICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDAgJiYgbUF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQpIHsKICAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgIH0KIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoCisgICAgICAgIFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCkgeworICAgICAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUocmVnSWQsIHN0YXRlKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6OnNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIG1BdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkID0gZW5hYmxlZDsKK30KKworCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7CiAgICAgQUxPR1coImJpbmRlckRpZWQoKSAlcCwgY2FsbGluZyBwaWQgJWQiLCB3aG8udW5zYWZlX2dldCgpLAogICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKTsKQEAgLTUxMSw2ICs1NTIsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBhZi0+c2V0QXVkaW9Qb3J0Q29uZmlnKCZkYXRhLT5tQ29uZmlnKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRFlOX1BPTElDWV9NSVhfU1RBVEVfVVBEQVRFOiB7CisgICAgICAgICAgICAgICAgICAgIER5blBvbGljeU1peFN0YXRlVXBkYXRlRGF0YSAqZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKER5blBvbGljeU1peFN0YXRlVXBkYXRlRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8jIyNBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBkeW4gcG9saWN5IG1peCBzdGF0ZSB1cGRhdGUiKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3NpbmcgZHluIHBvbGljeSBtaXggc3RhdGUgdXBkYXRlICVzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tUmVnSWQuc3RyaW5nKCksIGRhdGEtPm1TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIHN2YyA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN2YyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb09uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGRhdGEtPm1SZWdJZCwgZGF0YS0+bVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSB1bmtub3duIGNvbW1hbmQgJWQiLCBjb21tYW5kLT5tQ29tbWFuZCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNTIyLDIyICs1NzcsMjggQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB3YWl0VGltZSA9IElOVDY0X01BWDsKKyAgICAgICAgICAgICAgICAvLyByZWxlYXNlIG1Mb2NrIGJlZm9yZSByZWxlYXNpbmcgc3Ryb25nIHJlZmVyZW5jZSBvbiB0aGUgc2VydmljZSBhcworICAgICAgICAgICAgICAgIC8vIEF1ZGlvUG9saWN5U2VydmljZSBkZXN0cnVjdG9yIGNhbGxzIEF1ZGlvQ29tbWFuZFRocmVhZDo6ZXhpdCgpIHdoaWNoCisgICAgICAgICAgICAgICAgLy8gYWNxdWlyZXMgbUxvY2suCisgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgc3ZjLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB3YWl0VGltZSA9IG1BdWRpb0NvbW1hbmRzWzBdLT5tVGltZSAtIGN1clRpbWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgLy8gcmVsZWFzZSBtTG9jayBiZWZvcmUgcmVsZWFzaW5nIHN0cm9uZyByZWZlcmVuY2Ugb24gdGhlIHNlcnZpY2UgYXMKLSAgICAgICAgLy8gQXVkaW9Qb2xpY3lTZXJ2aWNlIGRlc3RydWN0b3IgY2FsbHMgQXVkaW9Db21tYW5kVGhyZWFkOjpleGl0KCkgd2hpY2ggYWNxdWlyZXMgbUxvY2suCi0gICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICBzdmMuY2xlYXIoKTsKLSAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICBpZiAoIWV4aXRQZW5kaW5nKCkgJiYgbUF1ZGlvQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAvLyByZWxlYXNlIGRlbGF5ZWQgY29tbWFuZHMgd2FrZSBsb2NrCisKKyAgICAgICAgLy8gcmVsZWFzZSBkZWxheWVkIGNvbW1hbmRzIHdha2UgbG9jayBpZiB0aGUgcXVldWUgaXMgZW1wdHkKKyAgICAgICAgaWYgKG1BdWRpb0NvbW1hbmRzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgcmVsZWFzZV93YWtlX2xvY2sobU5hbWUuc3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQXQgdGhpcyBzdGFnZSB3ZSBoYXZlIGVpdGhlciBhbiBlbXB0eSBjb21tYW5kIHF1ZXVlIG9yIHRoZSBmaXJzdCBjb21tYW5kIGluIHRoZSBxdWV1ZQorICAgICAgICAvLyBoYXMgYSBmaW5pdGUgZGVsYXkuIFNvIHVubGVzcyB3ZSBhcmUgZXhpdGluZyBpdCBpcyBzYWZlIHRvIHdhaXQuCisgICAgICAgIGlmICghZXhpdFBlbmRpbmcoKSkgewogICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGdvaW5nIHRvIHNsZWVwIik7CiAgICAgICAgICAgICBtV2FpdFdvcmtDVi53YWl0UmVsYXRpdmUobUxvY2ssIHdhaXRUaW1lKTsKLSAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSB3YWtpbmcgdXAiKTsKICAgICAgICAgfQogICAgIH0KICAgICAvLyByZWxlYXNlIGRlbGF5ZWQgY29tbWFuZHMgd2FrZSBsb2NrIGJlZm9yZSBxdWl0dGluZwpAQCAtNzQ3LDYgKzgwOCwyMCBAQAogICAgIHJldHVybiBzZW5kQ29tbWFuZChjb21tYW5kLCBkZWxheU1zKTsKIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6ZHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlQ29tbWFuZCgKKyAgICAgICAgU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSkKK3sKKyAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CisgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBEWU5fUE9MSUNZX01JWF9TVEFURV9VUERBVEU7CisgICAgRHluUG9saWN5TWl4U3RhdGVVcGRhdGVEYXRhICpkYXRhID0gbmV3IER5blBvbGljeU1peFN0YXRlVXBkYXRlRGF0YSgpOworICAgIGRhdGEtPm1SZWdJZCA9IHJlZ0lkOworICAgIGRhdGEtPm1TdGF0ZSA9IHN0YXRlOworICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHNlbmRpbmcgZHluYW1pYyBwb2xpY3kgbWl4IChpZD0lcykgc3RhdGUgdXBkYXRlIHRvICVkIiwKKyAgICAgICAgICAgIHJlZ0lkLnN0cmluZygpLCBzdGF0ZSk7CisgICAgc2VuZENvbW1hbmQoY29tbWFuZCk7Cit9CisKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzZW5kQ29tbWFuZChzcDxBdWRpb0NvbW1hbmQ+JiBjb21tYW5kLCBpbnQgZGVsYXlNcykKIHsKICAgICB7CkBAIC04NjEsNiArOTM2LDcgQEAKICAgICAgICAgICAgICAgICBwYXRjaDIgPSAoKENyZWF0ZUF1ZGlvUGF0Y2hEYXRhICopY29tbWFuZDItPm1QYXJhbS5nZXQoKSktPm1QYXRjaDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaGFuZGxlMiA9ICgoUmVsZWFzZUF1ZGlvUGF0Y2hEYXRhICopY29tbWFuZDItPm1QYXJhbS5nZXQoKSktPm1IYW5kbGU7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZwYXRjaDIsIDAsIHNpemVvZihwYXRjaDIpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChoYW5kbGUgIT0gaGFuZGxlMikgYnJlYWs7CiAgICAgICAgICAgICAvKiBGaWx0ZXIgQ1JFQVRFX0FVRElPX1BBVENIIGNvbW1hbmRzIG9ubHkgd2hlbiB0aGV5IGFyZSBpc3N1ZWQgZm9yCkBAIC04ODgsNiArOTY0LDEwIEBACiAgICAgICAgICAgICBkZWxheU1zID0gMTsKICAgICAgICAgfSBicmVhazsKIAorICAgICAgICBjYXNlIERZTl9QT0xJQ1lfTUlYX1NUQVRFX1VQREFURTogeworCisgICAgICAgIH0gYnJlYWs7CisKICAgICAgICAgY2FzZSBTVEFSVF9UT05FOgogICAgICAgICBjYXNlIFNUT1BfVE9ORToKICAgICAgICAgZGVmYXVsdDoKQEAgLTkyOSw2ICsxMDA5LDggQEAKICAgICAgICAgcmVxdWVzdEV4aXQoKTsKICAgICAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CiAgICAgfQorICAgIC8vIE5vdGUgdGhhdCB3ZSBjYW4gY2FsbCBpdCBmcm9tIHRoZSB0aHJlYWQgbG9vcCBpZiBhbGwgb3RoZXIgcmVmZXJlbmNlcyBoYXZlIGJlZW4gcmVsZWFzZWQKKyAgICAvLyBidXQgaXQgd2lsbCBzYWZlbHkgcmV0dXJuIFdPVUxEX0JMT0NLIGluIHRoaXMgY2FzZQogICAgIHJlcXVlc3RFeGl0QW5kV2FpdCgpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeVNlcnZpY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKc2ltaWxhcml0eSBpbmRleCA5MiUKcmVuYW1lIGZyb20gc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKcmVuYW1lIHRvIHNlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggODAyODRhNC4uYTBkNWFhMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaApAQCAtMzUsNyArMzUsNyBAQAogI2luY2x1ZGUgPGhhcmR3YXJlX2xlZ2FjeS9BdWRpb1BvbGljeUludGVyZmFjZS5oPgogI2VuZGlmCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lFZmZlY3RzLmgiCi0jaW5jbHVkZSAiQXVkaW9Qb2xpY3lNYW5hZ2VyLmgiCisjaW5jbHVkZSAibWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmgiCiAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNjEsNyArNjEsOCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKTsKICAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CkBAIC03OSwxMCArODAsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCkBAIC05NiwxMCArOTksMTIgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCkBAIC0xODAsNiArMTg1LDggQEAKIAogICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlckNsaWVudChjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50KTsKIAorICAgIHZpcnR1YWwgdm9pZCBzZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpOwpAQCAtMTkwLDYgKzE5NywxMSBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlclBvbGljeU1peGVzKFZlY3RvcjxBdWRpb01peD4gbWl4ZXMsIGJvb2wgcmVnaXN0cmF0aW9uKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaGFuZGxlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUpOworCiAgICAgICAgICAgICBzdGF0dXNfdCBkb1N0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKQEAgLTIxMSw2ICsyMjMsOSBAQAogICAgICAgICAgICAgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CiAgICAgICAgICAgICB2b2lkIGRvT25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogCisgICAgICAgICAgICB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpOworICAgICAgICAgICAgdm9pZCBkb09uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpOworCiBwcml2YXRlOgogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlKCkgQU5EUk9JRF9BUEk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+QXVkaW9Qb2xpY3lTZXJ2aWNlKCk7CkBAIC0yNDEsNiArMjU2LDcgQEAKICAgICAgICAgICAgIFVQREFURV9BVURJT1BPUlRfTElTVCwKICAgICAgICAgICAgIFVQREFURV9BVURJT1BBVENIX0xJU1QsCiAgICAgICAgICAgICBTRVRfQVVESU9QT1JUX0NPTkZJRywKKyAgICAgICAgICAgIERZTl9QT0xJQ1lfTUlYX1NUQVRFX1VQREFURQogICAgICAgICB9OwogCiAgICAgICAgIEF1ZGlvQ29tbWFuZFRocmVhZCAoU3RyaW5nOCBuYW1lLCBjb25zdCB3cDxBdWRpb1BvbGljeVNlcnZpY2U+JiBzZXJ2aWNlKTsKQEAgLTI3OCw2ICsyOTQsNyBAQAogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICB1cGRhdGVBdWRpb1BhdGNoTGlzdENvbW1hbmQoKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0QXVkaW9Qb3J0Q29uZmlnQ29tbWFuZChjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZUNvbW1hbmQoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGluc2VydENvbW1hbmRfbChBdWRpb0NvbW1hbmQgKmNvbW1hbmQsIGludCBkZWxheU1zID0gMCk7CiAKICAgICBwcml2YXRlOgpAQCAtMzYyLDYgKzM3OSwxMiBAQAogICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIG1Db25maWc7CiAgICAgICAgIH07CiAKKyAgICAgICAgY2xhc3MgRHluUG9saWN5TWl4U3RhdGVVcGRhdGVEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBTdHJpbmc4IG1SZWdJZDsKKyAgICAgICAgICAgIGludDMyX3QgbVN0YXRlOworICAgICAgICB9OworCiAgICAgICAgIE11dGV4ICAgbUxvY2s7CiAgICAgICAgIENvbmRpdGlvbiBtV2FpdFdvcmtDVjsKICAgICAgICAgVmVjdG9yIDwgc3A8QXVkaW9Db21tYW5kPiA+IG1BdWRpb0NvbW1hbmRzOyAvLyBsaXN0IG9mIHBlbmRpbmcgY29tbWFuZHMKQEAgLTQ2Nyw2ICs0OTAsNyBAQAogCiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpOwogCiAgICAgICAgIHZpcnR1YWwgYXVkaW9fdW5pcXVlX2lkX3QgbmV3QXVkaW9VbmlxdWVJZCgpOwogCkBAIC00ODIsOCArNTA2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpOwogICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5Ob3RpZmljYXRpb25DbGllbnQoKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIHNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKTsKIAogICAgICAgICAgICAgICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50CiAgICAgICAgICAgICAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKTsKQEAgLTQ5NSw2ICs1MjEsNyBAQAogICAgICAgICBjb25zdCB3cDxBdWRpb1BvbGljeVNlcnZpY2U+ICAgICAgICBtU2VydmljZTsKICAgICAgICAgY29uc3QgdWlkX3QgICAgICAgICAgICAgICAgICAgICAgICAgbVVpZDsKICAgICAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4gbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudDsKKyAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQ7CiAgICAgfTsKIAogICAgIC8vIEludGVybmFsIGR1bXAgdXRpbGl0aWVzLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdXRpbGl0aWVzL2NvbnZlcnQvY29udmVydC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdXRpbGl0aWVzL2NvbnZlcnQvY29udmVydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MGI1ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS91dGlsaXRpZXMvY29udmVydC9jb252ZXJ0LmgKQEAgLTAsMCArMSwzODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Y21hdGg+CisKK25hbWVzcGFjZSBhbmRyb2lkCit7CisKK25hbWVzcGFjZSB1dGlsaXRpZXMKK3sKKworLyoqCisgKiBDb252ZXJ0IGEgZ2l2ZW4gc291cmNlIHR5cGUgdG8gYSBnaXZlbiBkZXN0aW5hdGlvbiB0eXBlLgorICoKKyAqIFN0cmluZyBjb252ZXJzaW9uIHRvIFQgcmVhZHMgdGhlIHZhbHVlIG9mIHRoZSB0eXBlIFQgaW4gdGhlIGdpdmVuIHN0cmluZy4KKyAqIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCBhbGxvdyB0byBoYXZlIHdoaXRlIHNwYWNlcyBhcm91bmQgdGhlIHZhbHVlIHRvIHBhcnNlCisgKiBhbmQgdHJpZXMgdG8gcGFyc2UgdGhlIHdob2xlIHN0cmluZywgd2hpY2ggbWVhbnMgdGhhdCBpZiBzb21lIGJ5dGVzIHdlcmUgbm90CisgKiByZWFkIGluIHRoZSBzdHJpbmcsIHRoZSBmdW5jdGlvbiBmYWlscy4KKyAqIEhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIChpZS4gbnVtYmVycyBzdGFydGluZyB3aXRoIDB4KSBpcyBzdXBwb3J0ZWQgb25seQorICogZm9yIGludGVncmFsIHR5cGVzIGNvbnZlcnNpb25zLgorICoKKyAqIE51bWVyaWMgY29udmVyc2lvbiB0byBzdHJpbmcgZm9ybWF0cyB0aGUgc291cmNlIHZhbHVlIHRvIGRlY2ltYWwgc3BhY2UuCisgKgorICogVmVjdG9yIHRvIHZlY3RvciBjb252ZXJzaW9uIGNhbGxzIGNvbnZlcnRUbyBvbiBlYWNoIGVsZW1lbnQuCisgKgorICogQHRwYXJhbSBzcmNUeXBlIHNvdXJjZSB0eXBlLCBkZWZhdWx0IHZhbHVlIGlzIHN0cmluZyB0eXBlCisgKiBAdHBhcmFtIGRzdFR5cGUgZGVzdGluYXRpb24gdHlwZQorICogQHBhcmFtW2luXSBpbnB1dCBUaGUgc291cmNlIHRvIGNvbnZlcnQgZnJvbS4KKyAqIEBwYXJhbVtvdXRdIHJlc3VsdCBDb252ZXJ0ZWQgdmFsdWUgaWYgc3VjY2VzcywgdW5kZWZpbmVkIG9uIGZhaWx1cmUuCisgKgorICogQHJldHVybiB0cnVlIGlmIGNvbnZlcnNpb24gd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZS4KKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIHNyY1R5cGUsIHR5cGVuYW1lIGRzdFR5cGU+CitzdGF0aWMgaW5saW5lIGJvb2wgY29udmVydFRvKGNvbnN0IHNyY1R5cGUgJmlucHV0LCBkc3RUeXBlICZyZXN1bHQpOworCisvKiBkZXRhaWxzIG5hbWVzcGFjZSBpcyBoZXJlIHRvIGhpZGUgaW1wbGVtZW50YXRpb24gZGV0YWlscyB0byBoZWFkZXIgZW5kIHVzZXIuIEl0CisgKiBpcyBOT1QgaW50ZW5kZWQgdG8gYmUgdXNlZCBvdXRzaWRlLiAqLworbmFtZXNwYWNlIGRldGFpbHMKK3sKKworLyoqIEhlbHBlciBjbGFzcyB0byBsaW1pdCBpbnN0YW50aWF0aW9uIG9mIHRlbXBsYXRlcyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQ29udmVyc2lvbkZyb21TdHJpbmdBbGxvd2VkOwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQ29udmVyc2lvblRvU3RyaW5nQWxsb3dlZDsKKworLyogTGlzdCBvZiBhbGxvd2VkIHR5cGVzIGZvciBjb252ZXJzaW9uICovCit0ZW1wbGF0ZSA8Pgorc3RydWN0IENvbnZlcnNpb25Gcm9tU3RyaW5nQWxsb3dlZDxib29sPiB7fTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgQ29udmVyc2lvbkZyb21TdHJpbmdBbGxvd2VkPHVpbnQ2NF90PiB7fTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgQ29udmVyc2lvbkZyb21TdHJpbmdBbGxvd2VkPGludDY0X3Q+IHt9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBDb252ZXJzaW9uRnJvbVN0cmluZ0FsbG93ZWQ8dWludDMyX3Q+IHt9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBDb252ZXJzaW9uRnJvbVN0cmluZ0FsbG93ZWQ8aW50MzJfdD4ge307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IENvbnZlcnNpb25Gcm9tU3RyaW5nQWxsb3dlZDx1aW50MTZfdD4ge307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IENvbnZlcnNpb25Gcm9tU3RyaW5nQWxsb3dlZDxpbnQxNl90PiB7fTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgQ29udmVyc2lvbkZyb21TdHJpbmdBbGxvd2VkPGZsb2F0PiB7fTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgQ29udmVyc2lvbkZyb21TdHJpbmdBbGxvd2VkPGRvdWJsZT4ge307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgQ29udmVyc2lvblRvU3RyaW5nQWxsb3dlZDxpbnQ2NF90PiB7fTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgQ29udmVyc2lvblRvU3RyaW5nQWxsb3dlZDx1aW50NjRfdD4ge307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IENvbnZlcnNpb25Ub1N0cmluZ0FsbG93ZWQ8dWludDMyX3Q+IHt9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBDb252ZXJzaW9uVG9TdHJpbmdBbGxvd2VkPGludDMyX3Q+IHt9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBDb252ZXJzaW9uVG9TdHJpbmdBbGxvd2VkPGRvdWJsZT4ge307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IENvbnZlcnNpb25Ub1N0cmluZ0FsbG93ZWQ8ZmxvYXQ+IHt9OworCisvKioKKyAqIFNldCB0aGUgZGVjaW1hbCBwcmVjaXNpb24gdG8gMTAgZGlnaXRzLgorICogTm90ZSB0aGF0IHRoaXMgc2V0dGluZyBpcyBhbGlnbmVkIHdpdGggQW5kcm9pZCBBdWRpbyBQYXJhbWV0ZXIKKyAqIHBvbGljeSBjb25jZXJuaW5nIGZsb2F0IHN0b3JhZ2UgaW50byBzdHJpbmcuCisgKi8KK3N0YXRpYyBjb25zdCB1aW50MzJfdCBnRmxvYXRQcmVjaXNpb24gPSAxMDsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgaW5saW5lIGJvb2wgZnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBUICZyZXN1bHQpCit7CisgICAgLyogQ2hlY2sgdGhhdCBjb252ZXJzaW9uIHRvIHRoYXQgdHlwZSBpcyBhbGxvd2VkLgorICAgICAqIElmIHRoaXMgZmFpbHMsIHRoaXMgbWVhbnMgdGhhdCB0aGlzIHRlbXBsYXRlIHdhcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZAorICAgICAqIHdpdGggdGhpcyB0eXBlLCB0aHVzIHRoYXQgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuICovCisgICAgQ29udmVyc2lvbkZyb21TdHJpbmdBbGxvd2VkPFQ+KCk7CisKKyAgICBpZiAoc3RyLmZpbmRfZmlyc3Rfb2Yoc3RkOjpzdHJpbmcoIlxyXG5cdFx2ICIpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIGEgJy0nIGluIHN0cmluZy4gSWYgdHlwZSBpcyB1bnNpZ25lZCBhbmQgYSAtIGlzIGZvdW5kLCB0aGUKKyAgICAgKiBwYXJzaW5nIGZhaWxzLiBUaGlzIGlzIG1hZGUgbmVjZXNzYXJ5IGJlY2F1c2UgIi0xIiBpcyByZWFkIGFzIDY1NTM1IGZvcgorICAgICAqIHVpbnQxNl90LCBmb3IgZXhhbXBsZSAqLworICAgIGlmIChzdHIuZmluZCgiLSIpICE9IHN0ZDo6c3RyaW5nOjpucG9zCisgICAgICAgICYmICFzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19zaWduZWQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzKHN0cik7CisKKyAgICAvKiBTYWRseSwgdGhlIHN0cmVhbSBjb252ZXJzaW9uIGRvZXMgbm90IGhhbmRsZSBoZXhhZGVjaW1hbCBmb3JtYXQsIHRodXMKKyAgICAgKiBjaGVjayBpcyBkb25lIG1hbnVhbGx5ICovCisgICAgaWYgKHN0ci5zdWJzdHIoMCwgMikgPT0gIjB4IikgeworICAgICAgICBpZiAoc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfaW50ZWdlcikgeworICAgICAgICAgICAgc3MgPj4gc3RkOjpoZXggPj4gcmVzdWx0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogQ29udmVyc2lvbiB1bmRlZmluZWQgZm9yIG5vbiBpbnRlZ2VycyAqLworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3MgPj4gcmVzdWx0OworICAgIH0KKworICAgIHJldHVybiBzcy5lb2YoKSAmJiAhc3MuZmFpbCgpICYmICFzcy5iYWQoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgaW5saW5lIGJvb2wgdG9TdHJpbmcoY29uc3QgVCAmdmFsdWUsIHN0ZDo6c3RyaW5nICZzdHIpCit7CisgICAgLyogQ2hlY2sgdGhhdCBjb252ZXJzaW9uIGZyb20gdGhhdCB0eXBlIGlzIGFsbG93ZWQuCisgICAgICogSWYgdGhpcyBmYWlscywgdGhpcyBtZWFucyB0aGF0IHRoaXMgdGVtcGxhdGUgd2FzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkCisgICAgICogd2l0aCB0aGlzIHR5cGUsIHRodXMgdGhhdCB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZC4gKi8KKyAgICBDb252ZXJzaW9uVG9TdHJpbmdBbGxvd2VkPFQ+KCk7CisKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBvc3M7CisgICAgb3NzLnByZWNpc2lvbihnRmxvYXRQcmVjaXNpb24pOworICAgIG9zcyA8PCB2YWx1ZTsKKyAgICBzdHIgPSBvc3Muc3RyKCk7CisgICAgcmV0dXJuICFvc3MuZmFpbCgpICYmICFvc3MuYmFkKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBzcmNUeXBlLCB0eXBlbmFtZSBkc3RUeXBlPgorY2xhc3MgQ29udmVydGVyOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgZHN0VHlwZT4KK2NsYXNzIENvbnZlcnRlcjxzdGQ6OnN0cmluZywgZHN0VHlwZT4KK3sKK3B1YmxpYzoKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgcnVuKGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIGRzdFR5cGUgJnJlc3VsdCkKKyAgICB7CisgICAgICAgIHJldHVybiBmcm9tU3RyaW5nPGRzdFR5cGU+KHN0ciwgcmVzdWx0KTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgc3JjVHlwZT4KK2NsYXNzIENvbnZlcnRlcjxzcmNUeXBlLCBzdGQ6OnN0cmluZz4KK3sKK3B1YmxpYzoKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgcnVuKGNvbnN0IHNyY1R5cGUgJnN0ciwgc3RkOjpzdHJpbmcgJnJlc3VsdCkKKyAgICB7CisgICAgICAgIHJldHVybiB0b1N0cmluZzxzcmNUeXBlPihzdHIsIHJlc3VsdCk7CisgICAgfQorfTsKKworLyoqIENvbnZlcnQgYSB2ZWN0b3IgYnkgYXBwbHlpbmcgY29udmVydFRvIG9uIGVhY2ggZWxlbWVudC4KKyAqCisgKiBAdHBhcmFtIFNyY0VsZW0gVHlwZSBvZiB0aGUgc3JjIGVsZW1lbnRzLgorICogQHRwYXJhbSBEc3RFbGVtIFR5cGUgb2YgdGhlIGRlc3RpbmF0aW9uIGVsZW1lbnRzLgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3JjRWxlbSwgdHlwZW5hbWUgRHN0RWxlbT4KK2NsYXNzIENvbnZlcnRlcjxzdGQ6OnZlY3RvcjxTcmNFbGVtPiwgc3RkOjp2ZWN0b3I8RHN0RWxlbT4gPgoreworcHVibGljOgorICAgIHR5cGVkZWYgY29uc3Qgc3RkOjp2ZWN0b3I8U3JjRWxlbT4gU3JjOworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8RHN0RWxlbT4gRHN0OworCisgICAgc3RhdGljIGlubGluZSBib29sIHJ1bihTcmMgJnNyYywgRHN0ICZkc3QpCisgICAgeworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIFNyYzo6Y29uc3RfaXRlcmF0b3IgU3JjSXQ7CisgICAgICAgIGRzdC5jbGVhcigpOworICAgICAgICBkc3QucmVzZXJ2ZShzcmMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChTcmNJdCBpdCA9IHNyYy5iZWdpbigpOyBpdCAhPSBzcmMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIERzdEVsZW0gZHN0RWxlbTsKKyAgICAgICAgICAgIGlmIChub3QgY29udmVydFRvKCppdCwgZHN0RWxlbSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkc3QucHVzaF9iYWNrKGRzdEVsZW0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGRldGFpbHMKKwordGVtcGxhdGUgPHR5cGVuYW1lIHNyY1R5cGUsIHR5cGVuYW1lIGRzdFR5cGU+CitzdGF0aWMgaW5saW5lIGJvb2wgY29udmVydFRvKGNvbnN0IHNyY1R5cGUgJmlucHV0LCBkc3RUeXBlICZyZXN1bHQpCit7CisgICAgcmV0dXJuIGRldGFpbHM6OkNvbnZlcnRlcjxzcmNUeXBlLCBkc3RUeXBlPjo6cnVuKGlucHV0LCByZXN1bHQpOworfQorCisvKioKKyAqIFNwZWNpYWxpemF0aW9uIGZvciBpbnQxNl90IG9mIGNvbnZlcnRUbyB0ZW1wbGF0ZSBmdW5jdGlvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNhbWUgcGFyYWRpZ20gdGhhbiBpdCdzIGdlbmVyaWMgdmVyc2lvbi4KKyAqCisgKiBUaGUgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gaXMgbWFkZSBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgc3RscG9ydCB2ZXJzaW9uIG9mCisgKiBzdHJpbmcgc3RyZWFtcyBpcyBidWdnZWQgYW5kIGRvZXMgbm90IGZhaWwgd2hlbiBnaXZpbmcgb3ZlcmZsb3dlZCB2YWx1ZXMuCisgKiBUaGlzIHNwZWNpYWxpc2F0aW9uIGNhbiBiZSBzYWZlbHkgcmVtb3ZlZCB3aGVuIHN0bHBvcnQgYmVoYXZpb3VyIGlzIGZpeGVkLgorICoKKyAqIEBwYXJhbVtpbl0gIHN0ciAgICB0aGUgc3RyaW5nIHRvIHBhcnNlLgorICogQHBhcmFtW291dF0gcmVzdWx0IHJlZmVyZW5jZSB0byBvYmplY3Qgd2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdC4KKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgY29udmVyc2lvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlLgorICovCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgY29udmVydFRvPHN0ZDo6c3RyaW5nLCBpbnQxNl90Pihjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBpbnQxNl90ICZyZXN1bHQpCit7CisgICAgaW50NjRfdCByZXM7CisKKyAgICBpZiAoIWNvbnZlcnRUbzxzdGQ6OnN0cmluZywgaW50NjRfdD4oc3RyLCByZXMpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAocmVzID4gc3RkOjpudW1lcmljX2xpbWl0czxpbnQxNl90Pjo6bWF4KCkgfHwgcmVzIDwgc3RkOjpudW1lcmljX2xpbWl0czxpbnQxNl90Pjo6bWluKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJlc3VsdCA9IHN0YXRpY19jYXN0PGludDE2X3Q+KHJlcyk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogU3BlY2lhbGl6YXRpb24gZm9yIGZsb2F0IG9mIGNvbnZlcnRUbyB0ZW1wbGF0ZSBmdW5jdGlvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNhbWUgcGFyYWRpZ20gdGhhbiBpdCdzIGdlbmVyaWMgdmVyc2lvbiBhbmQgaXMKKyAqIGJhc2VkIG9uIGl0IGJ1dCBtYWtlcyBmdXJ0aGVycyBjaGVja3Mgb24gdGhlIHJldHVybmVkIHZhbHVlLgorICoKKyAqIFRoZSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBpcyBtYWRlIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBzdGxwb3J0IGNvbnZlcnNpb24KKyAqIGZyb20gc3RyaW5nIHRvIGZsb2F0IGJlaGF2ZXMgZGlmZmVyZW50bHkgdGhhbiBHTlUgU1RMOiBvdmVyZmxvdyBwcm9kdWNlCisgKiArLy1JbmZpbml0eSByYXRoZXIgdGhhbiBhbiBlcnJvci4KKyAqCisgKiBAcGFyYW1baW5dICBzdHIgICAgdGhlIHN0cmluZyB0byBwYXJzZS4KKyAqIEBwYXJhbVtvdXRdIHJlc3VsdCByZWZlcmVuY2UgdG8gb2JqZWN0IHdoZXJlIHRvIHN0b3JlIHRoZSByZXN1bHQuCisgKgorICogQHJldHVybiB0cnVlIGlmIGNvbnZlcnNpb24gd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZS4KKyAqLwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIGNvbnZlcnRUbzxzdGQ6OnN0cmluZywgZmxvYXQ+KGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIGZsb2F0ICZyZXN1bHQpCit7CisgICAgaWYgKCFkZXRhaWxzOjpDb252ZXJ0ZXI8c3RkOjpzdHJpbmcsIGZsb2F0Pjo6cnVuKHN0ciwgcmVzdWx0KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHN0ZDo6YWJzKHJlc3VsdCkgPT0gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCkgfHwKKyAgICAgICAgcmVzdWx0ID09IHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjpxdWlldF9OYU4oKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogU3BlY2lhbGl6YXRpb24gZm9yIGRvdWJsZSBvZiBjb252ZXJ0VG8gdGVtcGxhdGUgZnVuY3Rpb24uCisgKgorICogVGhpcyBmdW5jdGlvbiBmb2xsb3dzIHRoZSBzYW1lIHBhcmFkaWdtIHRoYW4gaXQncyBnZW5lcmljIHZlcnNpb24gYW5kIGlzCisgKiBiYXNlZCBvbiBpdCBidXQgbWFrZXMgZnVydGhlcnMgY2hlY2tzIG9uIHRoZSByZXR1cm5lZCB2YWx1ZS4KKyAqCisgKiBUaGUgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gaXMgbWFkZSBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgc3RscG9ydCBjb252ZXJzaW9uCisgKiBmcm9tIHN0cmluZyB0byBkb3VibGUgYmVoYXZlcyBkaWZmZXJlbnRseSB0aGFuIEdOVSBTVEw6IG92ZXJmbG93IHByb2R1Y2UKKyAqICsvLUluZmluaXR5IHJhdGhlciB0aGFuIGFuIGVycm9yLgorICoKKyAqIEBwYXJhbVtpbl0gIHN0ciAgICB0aGUgc3RyaW5nIHRvIHBhcnNlLgorICogQHBhcmFtW291dF0gcmVzdWx0IHJlZmVyZW5jZSB0byBvYmplY3Qgd2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdC4KKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgY29udmVyc2lvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlLgorICovCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgY29udmVydFRvPHN0ZDo6c3RyaW5nLCBkb3VibGU+KGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIGRvdWJsZSAmcmVzdWx0KQoreworICAgIGlmICghZGV0YWlsczo6Q29udmVydGVyPHN0ZDo6c3RyaW5nLCBkb3VibGU+OjpydW4oc3RyLCByZXN1bHQpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoc3RkOjphYnMocmVzdWx0KSA9PSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkgfHwKKyAgICAgICAgcmVzdWx0ID09IHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6cXVpZXRfTmFOKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFNwZWNpYWxpemF0aW9uIGZvciBib29sZWFuIG9mIGNvbnZlcnRUbyB0ZW1wbGF0ZSBmdW5jdGlvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNhbWUgcGFyYWRpZ20gdGhhbiBpdCdzIGdlbmVyaWMgdmVyc2lvbi4KKyAqIFRoaXMgZnVuY3Rpb24gYWNjZXB0cyB0byBwYXJzZSBib29sZWFuIGFzICIwLzEiIG9yICJmYWxzZS90cnVlIiBvcgorICogIkZBTFNFL1RSVUUiLgorICogVGhlIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGlzIG1hZGUgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGJlaGF2aW91ciBvZgorICogc3RyaW5nIHN0cmVhbXMgd2hlbiBwYXJzaW5nIGJvb2xlYW4gdmFsdWVzIGlzIG5vdCBzdWZmaWNpZW50IHRvIGZpdCBvdXIKKyAqIHJlcXVpcmVtZW50cy4gSW5kZWVkLCBwYXJzaW5nICJ0cnVlIiB3aWxsIGNvcnJlY3RseSBwYXJzZSB0aGUgdmFsdWUsIGJ1dCB0aGUKKyAqIGVuZCBvZiBzdHJlYW0gaXMgbm90IHJlYWNoZWQgd2hpY2ggbWFrZXMgdGhlIHNzLmVvZigpIGZhaWxzIGluIHRoZSBnZW5lcmljCisgKiBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAcGFyYW1baW5dICBzdHIgICAgdGhlIHN0cmluZyB0byBwYXJzZS4KKyAqIEBwYXJhbVtvdXRdIHJlc3VsdCByZWZlcmVuY2UgdG8gb2JqZWN0IHdoZXJlIHRvIHN0b3JlIHRoZSByZXN1bHQuCisgKgorICogQHJldHVybiB0cnVlIGlmIGNvbnZlcnNpb24gd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZS4KKyAqLwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIGNvbnZlcnRUbzxzdGQ6OnN0cmluZywgYm9vbD4oY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgYm9vbCAmcmVzdWx0KQoreworICAgIGlmIChzdHIgPT0gIjAiIHx8IHN0ciA9PSAiRkFMU0UiIHx8IHN0ciA9PSAiZmFsc2UiKSB7CisgICAgICAgIHJlc3VsdCA9IGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoc3RyID09ICIxIiB8fCBzdHIgPT0gIlRSVUUiIHx8IHN0ciA9PSAidHJ1ZSIpIHsKKyAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIFNwZWNpYWxpemF0aW9uIGZvciBib29sZWFuIHRvIHN0cmluZyBvZiBjb252ZXJ0VG8gdGVtcGxhdGUgZnVuY3Rpb24uCisgKgorICogVGhpcyBmdW5jdGlvbiBmb2xsb3dzIHRoZSBzYW1lIHBhcmFkaWdtIHRoYW4gaXQncyBnZW5lcmljIHZlcnNpb24uCisgKiBUaGlzIGZ1bmN0aW9uIGFyYml0cmFyaWx5IGRlY2lkZXMgdG8gcmV0dXJuICJmYWxzZS90cnVlIi4KKyAqIEl0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgc3BlY2lhbGl6YXRpb24gZnJvbSBzdHJpbmcgdG8gYm9vbGVhbi4KKyAqCisgKiBAcGFyYW1baW5dICBpc1NldCAgYm9vbGVhbiB0byBjb252ZXJ0IHRvIGEgc3RyaW5nLgorICogQHBhcmFtW291dF0gcmVzdWx0IHJlZmVyZW5jZSB0byBvYmplY3Qgd2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdC4KKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgY29udmVyc2lvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlLgorICovCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgY29udmVydFRvPGJvb2wsIHN0ZDo6c3RyaW5nPihjb25zdCBib29sICZpc1NldCwgc3RkOjpzdHJpbmcgJnJlc3VsdCkKK3sKKyAgICByZXN1bHQgPSBpc1NldCA/ICJ0cnVlIiA6ICJmYWxzZSI7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogU3BlY2lhbGl6YXRpb24gZm9yIHN0cmluZyB0byBzdHJpbmcgb2YgY29udmVydFRvIHRlbXBsYXRlIGZ1bmN0aW9uLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSBkdW1teSBjb252ZXJzaW9uIGZyb20gc3RyaW5nIHRvIHN0cmluZy4KKyAqIEluIGNhc2Ugb2YgY2xpZW50cyB1c2luZyB0ZW1wbGF0ZSBhcyB3ZWxsLCB0aGlzIGltcGxlbWVudGF0aW9uIGF2b2lkcyBhZGRpbmcgZXh0cmEKKyAqIHNwZWNpYWxpemF0aW9uIHRvIGJ5cGFzcyB0aGUgY29udmVyc2lvbiBmcm9tIHN0cmluZyB0byBzdHJpbmcuCisgKgorICogQHBhcmFtW2luXSAgc3RyICAgIHRoZSBzdHJpbmcgdG8gcGFyc2UuCisgKiBAcGFyYW1bb3V0XSByZXN1bHQgcmVmZXJlbmNlIHRvIG9iamVjdCB3aGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0LgorICoKKyAqIEByZXR1cm4gdHJ1ZSBpZiBjb252ZXJzaW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBjb252ZXJ0VG88c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPihjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBzdGQ6OnN0cmluZyAmcmVzdWx0KQoreworICAgIHJlc3VsdCA9IHN0cjsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgdXRpbGl0aWVzCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCmluZGV4IGUxODRkOTcuLmU4ZWYyNGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawpAQCAtMjMsOCArMjMsMTAgQEAKIExPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAogICAgIENhbWVyYVNlcnZpY2UuY3BwIFwKICAgICBDYW1lcmFEZXZpY2VGYWN0b3J5LmNwcCBcCisgICAgQ2FtZXJhRmxhc2hsaWdodC5jcHAgXAogICAgIGNvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAgXAogICAgIGNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmNwcCBcCisgICAgY29tbW9uL0NhbWVyYU1vZHVsZS5jcHAgXAogICAgIGNvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuY3BwIFwKICAgICBhcGkxL0NhbWVyYUNsaWVudC5jcHAgXAogICAgIGFwaTEvQ2FtZXJhMkNsaWVudC5jcHAgXApAQCAtNDAsNyArNDIsNiBAQAogICAgIGFwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcCBcCiAgICAgYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvcjMuY3BwIFwKICAgICBhcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAgXAotICAgIGFwaV9wcm8vUHJvQ2FtZXJhMkNsaWVudC5jcHAgXAogICAgIGRldmljZTIvQ2FtZXJhMkRldmljZS5jcHAgXAogICAgIGRldmljZTMvQ2FtZXJhM0RldmljZS5jcHAgXAogICAgIGRldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAgXApAQCAtNTIsNiArNTMsNyBAQAogICAgIGRldmljZTMvU3RhdHVzVHJhY2tlci5jcHAgXAogICAgIGd1aS9SaW5nQnVmZmVyQ29uc3VtZXIuY3BwIFwKICAgICB1dGlscy9DYW1lcmFUcmFjZXMuY3BwIFwKKyAgICB1dGlscy9BdXRvQ29uZGl0aW9uTG9jay5jcHAgXAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTOj0gXAogICAgIGxpYnVpIFwKQEAgLTYwLDYgKzYyLDcgQEAKICAgICBsaWJiaW5kZXIgXAogICAgIGxpYmN1dGlscyBcCiAgICAgbGlibWVkaWEgXAorICAgIGxpYm1lZGlhdXRpbHMgXAogICAgIGxpYmNhbWVyYV9jbGllbnQgXAogICAgIGxpYmd1aSBcCiAgICAgbGliaGFyZHdhcmUgXApAQCAtNzAsNiArNzMsNyBAQAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgc3lzdGVtL21lZGlhL2NhbWVyYS9pbmNsdWRlIFwKICAgICBzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSBcCisgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKICAgICBleHRlcm5hbC9qcGVnCiAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRGV2aWNlRmFjdG9yeS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFEZXZpY2VGYWN0b3J5LmNwcAppbmRleCBiZmVmNTBlLi42NTg5ZTI3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFEZXZpY2VGYWN0b3J5LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFEZXZpY2VGYWN0b3J5LmNwcApAQCAtNDgsNiArNDgsNyBAQAogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18xOgogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgorICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18zOgogICAgICAgICAgICAgZGV2aWNlID0gbmV3IENhbWVyYTNEZXZpY2UoY2FtZXJhSWQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFGbGFzaGxpZ2h0LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MGJiOWQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFGbGFzaGxpZ2h0LmNwcApAQCAtMCwwICsxLDg4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhRmxhc2hsaWdodCIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworI2luY2x1ZGUgImNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oIgorI2luY2x1ZGUgIkNhbWVyYUZsYXNobGlnaHQuaCIKKyNpbmNsdWRlICJndWkvSUdyYXBoaWNCdWZmZXJDb25zdW1lci5oIgorI2luY2x1ZGUgImd1aS9CdWZmZXJRdWV1ZS5oIgorI2luY2x1ZGUgImNhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmgiCisjaW5jbHVkZSAiQ2FtZXJhRGV2aWNlRmFjdG9yeS5oIgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYW1lcmFGbGFzaGxpZ2h0IGltcGxlbWVudGF0aW9uIGJlZ2lucworLy8gdXNlZCBieSBjYW1lcmEgc2VydmljZSB0byBjb250cm9sIGZsYXNoZmxpZ2h0LgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitDYW1lcmFGbGFzaGxpZ2h0OjpDYW1lcmFGbGFzaGxpZ2h0KENhbWVyYU1vZHVsZSYgY2FtZXJhTW9kdWxlLAorICAgICAgICBjb25zdCBjYW1lcmFfbW9kdWxlX2NhbGxiYWNrc190JiBjYWxsYmFja3MpIDoKKyAgICAgICAgbUNhbWVyYU1vZHVsZSgmY2FtZXJhTW9kdWxlKSwKKyAgICAgICAgbUNhbGxiYWNrcygmY2FsbGJhY2tzKSwKKyAgICAgICAgbUZsYXNobGlnaHRNYXBJbml0aWFsaXplZChmYWxzZSkgeworfQorCitDYW1lcmFGbGFzaGxpZ2h0Ojp+Q2FtZXJhRmxhc2hsaWdodCgpIHsKK30KKworc3RhdHVzX3QgQ2FtZXJhRmxhc2hsaWdodDo6Y3JlYXRlRmxhc2hsaWdodENvbnRyb2woY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpIHsKKyAgICBBTE9HVigiJXM6IGNyZWF0aW5nIGEgZmxhc2ggbGlnaHQgY29udHJvbCBmb3IgY2FtZXJhICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgIGlmIChtRmxhc2hDb250cm9sICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgaWYgKG1DYW1lcmFNb2R1bGUtPmdldE1vZHVsZUFwaVZlcnNpb24oKSA+PSBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfNCkgeworICAgICAgICBtRmxhc2hDb250cm9sID0gbmV3IE1vZHVsZUZsYXNoQ29udHJvbCgqbUNhbWVyYU1vZHVsZSwgKm1DYWxsYmFja3MpOworICAgICAgICBpZiAobUZsYXNoQ29udHJvbCA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IGNhbm5vdCBjcmVhdGUgZmxhc2ggY29udHJvbCBmb3IgbW9kdWxlIGFwaSB2Mi40KyIsCisgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQzMl90IGRldmljZVZlcnNpb24gPSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDsKKworICAgICAgICBpZiAobUNhbWVyYU1vZHVsZS0+Z2V0TW9kdWxlQXBpVmVyc2lvbigpID49CisgICAgICAgICAgICAgICAgICAgIENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl8wKSB7CisgICAgICAgICAgICBjYW1lcmFfaW5mbyBpbmZvOworICAgICAgICAgICAgcmVzID0gbUNhbWVyYU1vZHVsZS0+Z2V0Q2FtZXJhSW5mbygKKyAgICAgICAgICAgICAgICAgICAgYXRvaShTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKSksICZpbmZvKTsKKyAgICAgICAgICAgIGlmIChyZXMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBnZXQgY2FtZXJhIGluZm8gZm9yIGNhbWVyYSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGV2aWNlVmVyc2lvbiA9IGluZm8uZGV2aWNlX3ZlcnNpb247CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGV2aWNlVmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMCkgeworICAgICAgICAgICAgQ2FtZXJhRGV2aWNlQ2xpZW50Rmxhc2hDb250cm9sICpmbGFzaENvbnRyb2wgPQorICAgICAgICAgICAgICAgICAgICBuZXcgQ2FtZXJhRGV2aWNlQ2xpZW50Rmxhc2hDb250cm9sKCptQ2FtZXJhTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptQ2FsbGJhY2tzKTsKKyAgICAgICAgICAgIGlmICghZmxhc2hDb250cm9sKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUZsYXNoQ29udHJvbCA9IGZsYXNoQ29udHJvbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1GbGFzaENvbnRyb2wgPQorICAgICAgICAgICAgICAgICAgICBuZXcgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2woKm1DYW1lcmFNb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbUNhbGxiYWNrcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYUZsYXNobGlnaHQ6OnNldFRvcmNoTW9kZShjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgYm9vbCBlbmFibGVkKSB7CisgICAgaWYgKCFtRmxhc2hsaWdodE1hcEluaXRpYWxpemVkKSB7CisgICAgICAgIEFMT0dFKCIlczogZmluZEZsYXNoVW5pdHMoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhpcyBtZXRob2QuIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIEFMT0dWKCIlczogc2V0IHRvcmNoIG1vZGUgb2YgY2FtZXJhICVzIHRvICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCksIGVuYWJsZWQpOworCisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgaWYgKG1PcGVuZWRDYW1lcmFJZHMuaW5kZXhPZihjYW1lcmFJZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgLy8gVGhpcyBjYXNlIGlzIG5lZWRlZCB0byBhdm9pZCBzdGF0ZSBjb3JydXB0aW9uIGR1cmluZyB0aGUgZm9sbG93aW5nIGNhbGwgc2VxdWVuY2U6CisgICAgICAgIC8vIENhbWVyYVNlcnZpY2U6OnNldFRvcmNoTW9kZSBmb3IgY2FtZXJhIElEIDAgYmVnaW5zLCBkb2VzIHRvcmNoIHN0YXR1cyBjaGVja3MKKyAgICAgICAgLy8gQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBmb3IgY2FtZXJhIElEIDAgYmVnaW5zLCBjYWxscyBwcmVwYXJlRGV2aWNlT3BlbiwgZW5kcworICAgICAgICAvLyBDYW1lcmFTZXJ2aWNlOjpzZXRUb3JjaE1vZGUgZm9yIGNhbWVyYSBJRCAwIGNvbnRpbnVlcywgY2FsbHMKKyAgICAgICAgLy8gICAgICAgIENhbWVyYUZsYXNobGlnaHQ6OnNldFRvcmNoTW9kZQorCisgICAgICAgIC8vIFRPRE86IE1vdmUgdG9yY2ggc3RhdHVzIGNoZWNrcyBhbmQgc3RhdGUgdXBkYXRlcyBiZWhpbmQgdGhpcyBDYW1lcmFGbGFzaGxpZ2h0IGxvY2sKKyAgICAgICAgLy8gdG8gYXZvaWQgb3RoZXIgc2ltaWxhciByYWNlIGNvbmRpdGlvbnMuCisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhIGRldmljZSAlcyBpcyBpbiB1c2UsIGNhbm5vdCBzZXQgdG9yY2ggbW9kZS4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gLUVCVVNZOworICAgIH0KKworICAgIGlmIChtRmxhc2hDb250cm9sID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGVuYWJsZWQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCisgICAgICAgIHJlcyA9IGNyZWF0ZUZsYXNobGlnaHRDb250cm9sKGNhbWVyYUlkKTsKKyAgICAgICAgaWYgKHJlcykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICByZXMgPSAgbUZsYXNoQ29udHJvbC0+c2V0VG9yY2hNb2RlKGNhbWVyYUlkLCBlbmFibGVkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvLyBpZiBmbGFzaCBjb250cm9sIGFscmVhZHkgZXhpc3RzLCB0dXJuaW5nIG9uIHRvcmNoIG1vZGUgbWF5IGZhaWwgaWYgaXQncworICAgIC8vIHRpZWQgdG8gYW5vdGhlciBjYW1lcmEgZGV2aWNlIGZvciBtb2R1bGUgdjIuMyBhbmQgYmVsb3cuCisgICAgcmVzID0gbUZsYXNoQ29udHJvbC0+c2V0VG9yY2hNb2RlKGNhbWVyYUlkLCBlbmFibGVkKTsKKyAgICBpZiAocmVzID09IEJBRF9JTkRFWCkgeworICAgICAgICAvLyBmbGFzaCBjb250cm9sIGlzIHRpZWQgdG8gYW5vdGhlciBjYW1lcmEgZGV2aWNlLCBuZWVkIHRvIGNsb3NlIGl0IGFuZAorICAgICAgICAvLyB0cnkgYWdhaW4uCisgICAgICAgIG1GbGFzaENvbnRyb2wuY2xlYXIoKTsKKyAgICAgICAgcmVzID0gY3JlYXRlRmxhc2hsaWdodENvbnRyb2woY2FtZXJhSWQpOworICAgICAgICBpZiAocmVzKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIHJlcyA9IG1GbGFzaENvbnRyb2wtPnNldFRvcmNoTW9kZShjYW1lcmFJZCwgZW5hYmxlZCk7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgQ2FtZXJhRmxhc2hsaWdodDo6ZmluZEZsYXNoVW5pdHMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHN0YXR1c190IHJlczsKKyAgICBpbnQzMl90IG51bUNhbWVyYXMgPSBtQ2FtZXJhTW9kdWxlLT5nZXROdW1iZXJPZkNhbWVyYXMoKTsKKworICAgIG1IYXNGbGFzaGxpZ2h0TWFwLmNsZWFyKCk7CisgICAgbUZsYXNobGlnaHRNYXBJbml0aWFsaXplZCA9IGZhbHNlOworCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgIGJvb2wgaGFzRmxhc2ggPSBmYWxzZTsKKyAgICAgICAgU3RyaW5nOCBpZCA9IFN0cmluZzg6OmZvcm1hdCgiJWQiLCBpKTsKKworICAgICAgICByZXMgPSBjcmVhdGVGbGFzaGxpZ2h0Q29udHJvbChpZCk7CisgICAgICAgIGlmIChyZXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGNyZWF0ZSBmbGFzaCBjb250cm9sIGZvciAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgaWQuc3RyaW5nKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gbUZsYXNoQ29udHJvbC0+aGFzRmxhc2hVbml0KGlkLCAmaGFzRmxhc2gpOworICAgICAgICAgICAgaWYgKHJlcyA9PSAtRVVTRVJTIHx8IHJlcyA9PSAtRUJVU1kpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBjaGVjayBpZiBjYW1lcmEgJXMgaGFzIGEgZmxhc2ggdW5pdC4gU29tZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FtZXJhIGRldmljZXMgbWF5IGJlIG9wZW5lZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBjaGVjayBpZiBjYW1lcmEgJXMgaGFzIGEgZmxhc2ggdW5pdC4gJXMiCisgICAgICAgICAgICAgICAgICAgICAgICAiICglZCkiLCBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpLCBzdHJlcnJvcigtcmVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1GbGFzaENvbnRyb2wuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBtSGFzRmxhc2hsaWdodE1hcC5hZGQoaWQsIGhhc0ZsYXNoKTsKKyAgICB9CisKKyAgICBtRmxhc2hsaWdodE1hcEluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQ2FtZXJhRmxhc2hsaWdodDo6aGFzRmxhc2hVbml0KGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKSB7CisgICAgc3RhdHVzX3QgcmVzOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHJldHVybiBoYXNGbGFzaFVuaXRMb2NrZWQoY2FtZXJhSWQpOworfQorCitib29sIENhbWVyYUZsYXNobGlnaHQ6Omhhc0ZsYXNoVW5pdExvY2tlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCkgeworICAgIGlmICghbUZsYXNobGlnaHRNYXBJbml0aWFsaXplZCkgeworICAgICAgICBBTE9HRSgiJXM6IGZpbmRGbGFzaFVuaXRzKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoaXMgbWV0aG9kLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3NpemVfdCBpbmRleCA9IG1IYXNGbGFzaGxpZ2h0TWFwLmluZGV4T2ZLZXkoY2FtZXJhSWQpOworICAgIGlmIChpbmRleCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSAlcyBub3QgcHJlc2VudCB3aGVuIGZpbmRGbGFzaFVuaXRzKCkgd2FzIGNhbGxlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gbUhhc0ZsYXNobGlnaHRNYXAudmFsdWVBdChpbmRleCk7Cit9CisKK3N0YXR1c190IENhbWVyYUZsYXNobGlnaHQ6OnByZXBhcmVEZXZpY2VPcGVuKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKSB7CisgICAgQUxPR1YoIiVzOiBwcmVwYXJlIGZvciBkZXZpY2Ugb3BlbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgaWYgKCFtRmxhc2hsaWdodE1hcEluaXRpYWxpemVkKSB7CisgICAgICAgIEFMT0dFKCIlczogZmluZEZsYXNoVW5pdHMoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhpcyBtZXRob2QuIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGlmIChtQ2FtZXJhTW9kdWxlLT5nZXRNb2R1bGVBcGlWZXJzaW9uKCkgPCBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfNCkgeworICAgICAgICAvLyBmcmFtZXdvcmsgaXMgZ29pbmcgdG8gb3BlbiBhIGNhbWVyYSBkZXZpY2UsIGFsbCBmbGFzaCBsaWdodCBjb250cm9sCisgICAgICAgIC8vIHNob3VsZCBiZSBjbG9zZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGlibGUgc3VwcG9ydC4KKyAgICAgICAgbUZsYXNoQ29udHJvbC5jbGVhcigpOworCisgICAgICAgIGlmIChtT3BlbmVkQ2FtZXJhSWRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBub3RpZnkgdG9yY2ggdW5hdmFpbGFibGUgZm9yIGFsbCBjYW1lcmFzIHdpdGggYSBmbGFzaAorICAgICAgICAgICAgaW50IG51bUNhbWVyYXMgPSBtQ2FtZXJhTW9kdWxlLT5nZXROdW1iZXJPZkNhbWVyYXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGhhc0ZsYXNoVW5pdExvY2tlZChTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgaSkpKSB7CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja3MtPnRvcmNoX21vZGVfc3RhdHVzX2NoYW5nZShtQ2FsbGJhY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiJWQiLCBpKS5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT1JDSF9NT0RFX1NUQVRVU19OT1RfQVZBSUxBQkxFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBjbG9zZSBmbGFzaCBjb250cm9sIHRoYXQgbWF5IGJlIG9wZW5lZCBieSBjYWxsaW5nIGhhc0ZsYXNoVW5pdExvY2tlZC4KKyAgICAgICAgbUZsYXNoQ29udHJvbC5jbGVhcigpOworICAgIH0KKworICAgIGlmIChtT3BlbmVkQ2FtZXJhSWRzLmluZGV4T2YoY2FtZXJhSWQpID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIG1PcGVuZWRDYW1lcmFJZHMuYWRkKGNhbWVyYUlkKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYUZsYXNobGlnaHQ6OmRldmljZUNsb3NlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCkgeworICAgIEFMT0dWKCIlczogZGV2aWNlICVzIGlzIGNsb3NlZCIsIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQuc3RyaW5nKCkpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIGlmICghbUZsYXNobGlnaHRNYXBJbml0aWFsaXplZCkgeworICAgICAgICBBTE9HRSgiJXM6IGZpbmRGbGFzaFVuaXRzKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoaXMgbWV0aG9kLiIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbU9wZW5lZENhbWVyYUlkcy5pbmRleE9mKGNhbWVyYUlkKTsKKyAgICBpZiAoaW5kZXggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjb3VsZG4ndCBmaW5kIGNhbWVyYSAlcyBpbiB0aGUgb3BlbmVkIGxpc3QiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1PcGVuZWRDYW1lcmFJZHMucmVtb3ZlQXQoaW5kZXgpOworICAgIH0KKworICAgIC8vIENhbm5vdCBkbyBhbnl0aGluZyB1bnRpbCBhbGwgY2FtZXJhcyBhcmUgY2xvc2VkLgorICAgIGlmIChtT3BlbmVkQ2FtZXJhSWRzLnNpemUoKSAhPSAwKQorICAgICAgICByZXR1cm4gT0s7CisKKyAgICBpZiAobUNhbWVyYU1vZHVsZS0+Z2V0TW9kdWxlQXBpVmVyc2lvbigpIDwgQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzQpIHsKKyAgICAgICAgLy8gbm90aWZ5IHRvcmNoIGF2YWlsYWJsZSBmb3IgYWxsIGNhbWVyYXMgd2l0aCBhIGZsYXNoCisgICAgICAgIGludCBudW1DYW1lcmFzID0gbUNhbWVyYU1vZHVsZS0+Z2V0TnVtYmVyT2ZDYW1lcmFzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaGFzRmxhc2hVbml0TG9ja2VkKFN0cmluZzg6OmZvcm1hdCgiJWQiLCBpKSkpIHsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tzLT50b3JjaF9tb2RlX3N0YXR1c19jaGFuZ2UobUNhbGxiYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiJWQiLCBpKS5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRPUkNIX01PREVfU1RBVFVTX0FWQUlMQUJMRV9PRkYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorLy8gQ2FtZXJhRmxhc2hsaWdodCBpbXBsZW1lbnRhdGlvbiBlbmRzCisKKworRmxhc2hDb250cm9sQmFzZTo6fkZsYXNoQ29udHJvbEJhc2UoKSB7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTW9kdWxlRmxhc2hDb250cm9sIGltcGxlbWVudGF0aW9uIGJlZ2lucworLy8gRmxhc2ggY29udHJvbCBmb3IgY2FtZXJhIG1vZHVsZSB2Mi40IGFuZCBhYm92ZS4KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworTW9kdWxlRmxhc2hDb250cm9sOjpNb2R1bGVGbGFzaENvbnRyb2woQ2FtZXJhTW9kdWxlJiBjYW1lcmFNb2R1bGUsCisgICAgICAgIGNvbnN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzX3QmIGNhbGxiYWNrcykgOgorICAgIG1DYW1lcmFNb2R1bGUoJmNhbWVyYU1vZHVsZSkgeworfQorCitNb2R1bGVGbGFzaENvbnRyb2w6On5Nb2R1bGVGbGFzaENvbnRyb2woKSB7Cit9CisKK3N0YXR1c190IE1vZHVsZUZsYXNoQ29udHJvbDo6aGFzRmxhc2hVbml0KGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBib29sICpoYXNGbGFzaCkgeworICAgIGlmICghaGFzRmxhc2gpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAqaGFzRmxhc2ggPSBmYWxzZTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICBjYW1lcmFfaW5mbyBpbmZvOworICAgIHN0YXR1c190IHJlcyA9IG1DYW1lcmFNb2R1bGUtPmdldENhbWVyYUluZm8oYXRvaShjYW1lcmFJZC5zdHJpbmcoKSksCisgICAgICAgICAgICAmaW5mbyk7CisgICAgaWYgKHJlcyAhPSAwKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGE7CisgICAgbWV0YWRhdGEgPSBpbmZvLnN0YXRpY19jYW1lcmFfY2hhcmFjdGVyaXN0aWNzOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBmbGFzaEF2YWlsYWJsZSA9CisgICAgICAgICAgICBtZXRhZGF0YS5maW5kKEFORFJPSURfRkxBU0hfSU5GT19BVkFJTEFCTEUpOworICAgIGlmIChmbGFzaEF2YWlsYWJsZS5jb3VudCA9PSAxICYmIGZsYXNoQXZhaWxhYmxlLmRhdGEudThbMF0gPT0gMSkgeworICAgICAgICAqaGFzRmxhc2ggPSB0cnVlOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTW9kdWxlRmxhc2hDb250cm9sOjpzZXRUb3JjaE1vZGUoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgZW5hYmxlZCkgeworICAgIEFMT0dWKCIlczogc2V0IGNhbWVyYSAlcyB0b3JjaCBtb2RlIHRvICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCksIGVuYWJsZWQpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHJldHVybiBtQ2FtZXJhTW9kdWxlLT5zZXRUb3JjaE1vZGUoY2FtZXJhSWQuc3RyaW5nKCksIGVuYWJsZWQpOworfQorLy8gTW9kdWxlRmxhc2hDb250cm9sIGltcGxlbWVudGF0aW9uIGVuZHMKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYW1lcmFEZXZpY2VDbGllbnRGbGFzaENvbnRyb2wgaW1wbGVtZW50YXRpb24gYmVnaW5zCisvLyBGbGFzaCBjb250cm9sIGZvciBjYW1lcmEgbW9kdWxlIDw9IHYyLjMgYW5kIGNhbWVyYSBIQUwgdjItdjMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworQ2FtZXJhRGV2aWNlQ2xpZW50Rmxhc2hDb250cm9sOjpDYW1lcmFEZXZpY2VDbGllbnRGbGFzaENvbnRyb2woCisgICAgICAgIENhbWVyYU1vZHVsZSYgY2FtZXJhTW9kdWxlLAorICAgICAgICBjb25zdCBjYW1lcmFfbW9kdWxlX2NhbGxiYWNrc190JiBjYWxsYmFja3MpIDoKKyAgICAgICAgbUNhbWVyYU1vZHVsZSgmY2FtZXJhTW9kdWxlKSwKKyAgICAgICAgbUNhbGxiYWNrcygmY2FsbGJhY2tzKSwKKyAgICAgICAgbVRvcmNoRW5hYmxlZChmYWxzZSksCisgICAgICAgIG1NZXRhZGF0YShOVUxMKSwKKyAgICAgICAgbVN0cmVhbWluZyhmYWxzZSkgeworfQorCitDYW1lcmFEZXZpY2VDbGllbnRGbGFzaENvbnRyb2w6On5DYW1lcmFEZXZpY2VDbGllbnRGbGFzaENvbnRyb2woKSB7CisgICAgZGlzY29ubmVjdENhbWVyYURldmljZSgpOworICAgIGlmIChtTWV0YWRhdGEpIHsKKyAgICAgICAgZGVsZXRlIG1NZXRhZGF0YTsKKyAgICB9CisKKyAgICBtU3VyZmFjZS5jbGVhcigpOworICAgIG1TdXJmYWNlVGV4dHVyZS5jbGVhcigpOworICAgIG1Qcm9kdWNlci5jbGVhcigpOworICAgIG1Db25zdW1lci5jbGVhcigpOworCisgICAgaWYgKG1Ub3JjaEVuYWJsZWQpIHsKKyAgICAgICAgaWYgKG1DYWxsYmFja3MpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogbm90aWZ5IHRoZSBmcmFtZXdvcmsgdGhhdCB0b3JjaCB3YXMgdHVybmVkIG9mZiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBtQ2FsbGJhY2tzLT50b3JjaF9tb2RlX3N0YXR1c19jaGFuZ2UobUNhbGxiYWNrcywKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkLnN0cmluZygpLCBUT1JDSF9NT0RFX1NUQVRVU19BVkFJTEFCTEVfT0ZGKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50Rmxhc2hDb250cm9sOjppbml0aWFsaXplU3VyZmFjZSgKKyAgICAgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gJmRldmljZSwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKKyAgICBzdGF0dXNfdCByZXM7CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZtUHJvZHVjZXIsICZtQ29uc3VtZXIpOworCisgICAgbVN1cmZhY2VUZXh0dXJlID0gbmV3IEdMQ29uc3VtZXIobUNvbnN1bWVyLCAwLCBHTENvbnN1bWVyOjpURVhUVVJFX0VYVEVSTkFMLAorICAgICAgICAgICAgdHJ1ZSwgdHJ1ZSk7CisgICAgaWYgKG1TdXJmYWNlVGV4dHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgaW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7CisgICAgcmVzID0gbVN1cmZhY2VUZXh0dXJlLT5zZXREZWZhdWx0QnVmZmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIHJlcyA9IG1TdXJmYWNlVGV4dHVyZS0+c2V0RGVmYXVsdEJ1ZmZlckZvcm1hdChmb3JtYXQpOworICAgIGlmIChyZXMpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBtU3VyZmFjZSA9IG5ldyBTdXJmYWNlKG1Qcm9kdWNlciwgLyp1c2VBc3luYyovIHRydWUpOworICAgIGlmIChtU3VyZmFjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1TdXJmYWNlLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsCisgICAgICAgICAgICBIQUxfREFUQVNQQUNFX1VOS05PV04sIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzAsICZtU3RyZWFtSWQpOworICAgIGlmIChyZXMpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICByZXMgPSBkZXZpY2UtPmNvbmZpZ3VyZVN0cmVhbXMoKTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50Rmxhc2hDb250cm9sOjpnZXRTbWFsbGVzdFN1cmZhY2VTaXplKAorICAgICAgICBjb25zdCBjYW1lcmFfaW5mbyYgaW5mbywgaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCkgeworICAgIGlmICghd2lkdGggfHwgIWhlaWdodCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGludDMyX3QgdyA9IElOVDMyX01BWDsKKyAgICBpbnQzMl90IGggPSAxOworCisgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGE7CisgICAgbWV0YWRhdGEgPSBpbmZvLnN0YXRpY19jYW1lcmFfY2hhcmFjdGVyaXN0aWNzOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBzdHJlYW1Db25maWdzID0KKyAgICAgICAgICAgIG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHJlYW1Db25maWdzLmNvdW50OyBpICs9IDQpIHsKKyAgICAgICAgaW50MzJfdCBmbXQgPSBzdHJlYW1Db25maWdzLmRhdGEuaTMyW2ldOworICAgICAgICBpZiAoZm10ID09IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9GT1JNQVRTX0lNUExFTUVOVEFUSU9OX0RFRklORUQpIHsKKyAgICAgICAgICAgIGludDMyX3Qgd3cgPSBzdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyAxXTsKKyAgICAgICAgICAgIGludDMyX3QgaGggPSBzdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyAyXTsKKworICAgICAgICAgICAgaWYgKHcgKiBoID4gd3cgKiBoaCkgeworICAgICAgICAgICAgICAgIHcgPSB3dzsKKyAgICAgICAgICAgICAgICBoID0gaGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBpZiBzdHJlYW0gY29uZmlndXJhdGlvbiBpcyBub3QgZm91bmQsIHRyeSBhdmFpbGFibGUgcHJvY2Vzc2VkIHNpemVzLgorICAgIGlmIChzdHJlYW1Db25maWdzLmNvdW50ID09IDApIHsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzID0KKyAgICAgICAgICAgIG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1BST0NFU1NFRF9TSVpFUyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMuY291bnQ7IGkgKz0gMikgeworICAgICAgICAgICAgaW50MzJfdCB3dyA9IGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzLmRhdGEuaTMyW2ldOworICAgICAgICAgICAgaW50MzJfdCBoaCA9IGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzLmRhdGEuaTMyW2kgKyAxXTsKKyAgICAgICAgICAgIGlmICh3ICogaCA+IHd3ICogaGgpIHsKKyAgICAgICAgICAgICAgICB3ID0gd3c7CisgICAgICAgICAgICAgICAgaCA9IGhoOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHcgPT0gSU5UMzJfTUFYKSB7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisKKyAgICAqd2lkdGggPSB3OworICAgICpoZWlnaHQgPSBoOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnRGbGFzaENvbnRyb2w6OmNvbm5lY3RDYW1lcmFEZXZpY2UoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKSB7CisgICAgY2FtZXJhX2luZm8gaW5mbzsKKyAgICBzdGF0dXNfdCByZXMgPSBtQ2FtZXJhTW9kdWxlLT5nZXRDYW1lcmFJbmZvKGF0b2koY2FtZXJhSWQuc3RyaW5nKCkpLCAmaW5mbyk7CisgICAgaWYgKHJlcyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGdldCBjYW1lcmEgaW5mbyBmb3IgY2FtZXJhICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UgPQorICAgICAgICAgICAgQ2FtZXJhRGV2aWNlRmFjdG9yeTo6Y3JlYXRlRGV2aWNlKGF0b2koY2FtZXJhSWQuc3RyaW5nKCkpKTsKKyAgICBpZiAoZGV2aWNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICByZXMgPSBkZXZpY2UtPmluaXRpYWxpemUobUNhbWVyYU1vZHVsZSk7CisgICAgaWYgKHJlcykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICByZXMgPSBnZXRTbWFsbGVzdFN1cmZhY2VTaXplKGluZm8sICZ3aWR0aCwgJmhlaWdodCk7CisgICAgaWYgKHJlcykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICByZXMgPSBpbml0aWFsaXplU3VyZmFjZShkZXZpY2UsIHdpZHRoLCBoZWlnaHQpOworICAgIGlmIChyZXMpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBtQ2FtZXJhSWQgPSBjYW1lcmFJZDsKKyAgICBtU3RyZWFtaW5nID0gKGluZm8uZGV2aWNlX3ZlcnNpb24gPD0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzEpOworICAgIG1EZXZpY2UgPSBkZXZpY2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudEZsYXNoQ29udHJvbDo6ZGlzY29ubmVjdENhbWVyYURldmljZSgpIHsKKyAgICBpZiAobURldmljZSAhPSBOVUxMKSB7CisgICAgICAgIG1EZXZpY2UtPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgbURldmljZS5jbGVhcigpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworCisKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudEZsYXNoQ29udHJvbDo6aGFzRmxhc2hVbml0KGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAorICAgICAgICBib29sICpoYXNGbGFzaCkgeworICAgIEFMT0dWKCIlczogY2hlY2tpbmcgaWYgY2FtZXJhICVzIGhhcyBhIGZsYXNoIHVuaXQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgcmV0dXJuIGhhc0ZsYXNoVW5pdExvY2tlZChjYW1lcmFJZCwgaGFzRmxhc2gpOworCit9CisKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudEZsYXNoQ29udHJvbDo6aGFzRmxhc2hVbml0TG9ja2VkKAorICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgYm9vbCAqaGFzRmxhc2gpIHsKKyAgICBpZiAoIWhhc0ZsYXNoKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgY2FtZXJhX2luZm8gaW5mbzsKKyAgICBzdGF0dXNfdCByZXMgPSBtQ2FtZXJhTW9kdWxlLT5nZXRDYW1lcmFJbmZvKAorICAgICAgICAgICAgYXRvaShjYW1lcmFJZC5zdHJpbmcoKSksICZpbmZvKTsKKyAgICBpZiAocmVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gZ2V0IGNhbWVyYSBpbmZvIGZvciBjYW1lcmEgJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhOworICAgIG1ldGFkYXRhID0gaW5mby5zdGF0aWNfY2FtZXJhX2NoYXJhY3RlcmlzdGljczsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgZmxhc2hBdmFpbGFibGUgPQorICAgICAgICAgICAgbWV0YWRhdGEuZmluZChBTkRST0lEX0ZMQVNIX0lORk9fQVZBSUxBQkxFKTsKKyAgICBpZiAoZmxhc2hBdmFpbGFibGUuY291bnQgPT0gMSAmJiBmbGFzaEF2YWlsYWJsZS5kYXRhLnU4WzBdID09IDEpIHsKKyAgICAgICAgKmhhc0ZsYXNoID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudEZsYXNoQ29udHJvbDo6c3VibWl0VG9yY2hFbmFibGVkUmVxdWVzdCgpIHsKKyAgICBzdGF0dXNfdCByZXM7CisKKyAgICBpZiAobU1ldGFkYXRhID09IE5VTEwpIHsKKyAgICAgICAgbU1ldGFkYXRhID0gbmV3IENhbWVyYU1ldGFkYXRhKCk7CisgICAgICAgIGlmIChtTWV0YWRhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICByZXMgPSBtRGV2aWNlLT5jcmVhdGVEZWZhdWx0UmVxdWVzdCgKKyAgICAgICAgICAgICAgICBDQU1FUkEzX1RFTVBMQVRFX1BSRVZJRVcsIG1NZXRhZGF0YSk7CisgICAgICAgIGlmIChyZXMpIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1aW50OF90IHRvcmNoT24gPSBBTkRST0lEX0ZMQVNIX01PREVfVE9SQ0g7CisgICAgbU1ldGFkYXRhLT51cGRhdGUoQU5EUk9JRF9GTEFTSF9NT0RFLCAmdG9yY2hPbiwgMSk7CisgICAgbU1ldGFkYXRhLT51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX09VVFBVVF9TVFJFQU1TLCAmbVN0cmVhbUlkLCAxKTsKKworICAgIHVpbnQ4X3QgYWVNb2RlID0gQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT047CisgICAgbU1ldGFkYXRhLT51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FFX01PREUsICZhZU1vZGUsIDEpOworCisgICAgaW50MzJfdCByZXF1ZXN0SWQgPSAwOworICAgIG1NZXRhZGF0YS0+dXBkYXRlKEFORFJPSURfUkVRVUVTVF9JRCwgJnJlcXVlc3RJZCwgMSk7CisKKyAgICBpZiAobVN0cmVhbWluZykgeworICAgICAgICByZXMgPSBtRGV2aWNlLT5zZXRTdHJlYW1pbmdSZXF1ZXN0KCptTWV0YWRhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlcyA9IG1EZXZpY2UtPmNhcHR1cmUoKm1NZXRhZGF0YSk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKworCisKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudEZsYXNoQ29udHJvbDo6c2V0VG9yY2hNb2RlKAorICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgYm9vbCBlbmFibGVkKSB7CisgICAgYm9vbCBoYXNGbGFzaCA9IGZhbHNlOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHN0YXR1c190IHJlcyA9IGhhc0ZsYXNoVW5pdExvY2tlZChjYW1lcmFJZCwgJmhhc0ZsYXNoKTsKKworICAgIC8vIHByZS1jaGVjaworICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgIC8vIGludmFsaWQgY2FtZXJhPworICAgICAgICBpZiAocmVzKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICAvLyBubyBmbGFzaCB1bml0PworICAgICAgICBpZiAoIWhhc0ZsYXNoKSB7CisgICAgICAgICAgICByZXR1cm4gLUVOT1NZUzsKKyAgICAgICAgfQorICAgICAgICAvLyBhbHJlYWR5IG9wZW5lZCBmb3IgYSBkaWZmZXJlbnQgZGV2aWNlPworICAgICAgICBpZiAobURldmljZSAhPSBOVUxMICYmIGNhbWVyYUlkICE9IG1DYW1lcmFJZCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobURldmljZSA9PSBOVUxMIHx8IGNhbWVyYUlkICE9IG1DYW1lcmFJZCkgeworICAgICAgICAvLyBkaXNhYmxpbmcgdGhlIHRvcmNoIG1vZGUgb2YgYW4gdW4tb3BlbmVkIG9yIGRpZmZlcmVudCBkZXZpY2UuCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBkaXNhYmxpbmcgdGhlIHRvcmNoIG1vZGUgb2YgY3VycmVudGx5IG9wZW5lZCBkZXZpY2UKKyAgICAgICAgZGlzY29ubmVjdENhbWVyYURldmljZSgpOworICAgICAgICBtVG9yY2hFbmFibGVkID0gZmFsc2U7CisgICAgICAgIG1DYWxsYmFja3MtPnRvcmNoX21vZGVfc3RhdHVzX2NoYW5nZShtQ2FsbGJhY2tzLAorICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCksIFRPUkNIX01PREVfU1RBVFVTX0FWQUlMQUJMRV9PRkYpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaWYgKG1EZXZpY2UgPT0gTlVMTCkgeworICAgICAgICByZXMgPSBjb25uZWN0Q2FtZXJhRGV2aWNlKGNhbWVyYUlkKTsKKyAgICAgICAgaWYgKHJlcykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcyA9IHN1Ym1pdFRvcmNoRW5hYmxlZFJlcXVlc3QoKTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgbVRvcmNoRW5hYmxlZCA9IHRydWU7CisgICAgbUNhbGxiYWNrcy0+dG9yY2hfbW9kZV9zdGF0dXNfY2hhbmdlKG1DYWxsYmFja3MsCisgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgVE9SQ0hfTU9ERV9TVEFUVVNfQVZBSUxBQkxFX09OKTsKKyAgICByZXR1cm4gT0s7Cit9CisvLyBDYW1lcmFEZXZpY2VDbGllbnRGbGFzaENvbnRyb2wgaW1wbGVtZW50YXRpb24gZW5kcworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2wgaW1wbGVtZW50YXRpb24gYmVnaW5zCisvLyBGbGFzaCBjb250cm9sIGZvciBjYW1lcmEgbW9kdWxlIDw9IHYyLjMgYW5kIGNhbWVyYSBIQUwgdjEKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2w6OkNhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sKAorICAgICAgICBDYW1lcmFNb2R1bGUmIGNhbWVyYU1vZHVsZSwKKyAgICAgICAgY29uc3QgY2FtZXJhX21vZHVsZV9jYWxsYmFja3NfdCYgY2FsbGJhY2tzKSA6CisgICAgICAgIG1DYW1lcmFNb2R1bGUoJmNhbWVyYU1vZHVsZSksCisgICAgICAgIG1DYWxsYmFja3MoJmNhbGxiYWNrcyksCisgICAgICAgIG1Ub3JjaEVuYWJsZWQoZmFsc2UpIHsKKworfQorCitDYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbDo6fkNhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sKCkgeworICAgIGRpc2Nvbm5lY3RDYW1lcmFEZXZpY2UoKTsKKworICAgIG1TdXJmYWNlLmNsZWFyKCk7CisgICAgbVN1cmZhY2VUZXh0dXJlLmNsZWFyKCk7CisgICAgbVByb2R1Y2VyLmNsZWFyKCk7CisgICAgbUNvbnN1bWVyLmNsZWFyKCk7CisKKyAgICBpZiAobVRvcmNoRW5hYmxlZCkgeworICAgICAgICBpZiAobUNhbGxiYWNrcykgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBub3RpZnkgdGhlIGZyYW1ld29yayB0aGF0IHRvcmNoIHdhcyB0dXJuZWQgb2ZmIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIG1DYWxsYmFja3MtPnRvcmNoX21vZGVfc3RhdHVzX2NoYW5nZShtQ2FsbGJhY2tzLAorICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWQuc3RyaW5nKCksIFRPUkNIX01PREVfU1RBVFVTX0FWQUlMQUJMRV9PRkYpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbDo6c2V0VG9yY2hNb2RlKAorICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgYm9vbCBlbmFibGVkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgLy8gcHJlLWNoZWNrCisgICAgc3RhdHVzX3QgcmVzOworICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgIGJvb2wgaGFzRmxhc2ggPSBmYWxzZTsKKyAgICAgICAgcmVzID0gaGFzRmxhc2hVbml0TG9ja2VkKGNhbWVyYUlkLCAmaGFzRmxhc2gpOworICAgICAgICAvLyBpbnZhbGlkIGNhbWVyYT8KKyAgICAgICAgaWYgKHJlcykgeworICAgICAgICAgICAgLy8gaGFzRmxhc2hVbml0TG9ja2VkKCkgcmV0dXJucyBCQURfSU5ERVggaWYgbURldmljZSBpcyBjb25uZWN0ZWQgdG8KKyAgICAgICAgICAgIC8vIGFub3RoZXIgY2FtZXJhIGRldmljZS4KKyAgICAgICAgICAgIHJldHVybiByZXMgPT0gQkFEX0lOREVYID8gQkFEX0lOREVYIDogLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICAvLyBubyBmbGFzaCB1bml0PworICAgICAgICBpZiAoIWhhc0ZsYXNoKSB7CisgICAgICAgICAgICByZXR1cm4gLUVOT1NZUzsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobURldmljZSA9PSBOVUxMIHx8IGNhbWVyYUlkICE9IG1DYW1lcmFJZCkgeworICAgICAgICAvLyBkaXNhYmxpbmcgdGhlIHRvcmNoIG1vZGUgb2YgYW4gdW4tb3BlbmVkIG9yIGRpZmZlcmVudCBkZXZpY2UuCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBkaXNhYmxpbmcgdGhlIHRvcmNoIG1vZGUgb2YgY3VycmVudGx5IG9wZW5lZCBkZXZpY2UKKyAgICAgICAgZGlzY29ubmVjdENhbWVyYURldmljZSgpOworICAgICAgICBtVG9yY2hFbmFibGVkID0gZmFsc2U7CisgICAgICAgIG1DYWxsYmFja3MtPnRvcmNoX21vZGVfc3RhdHVzX2NoYW5nZShtQ2FsbGJhY2tzLAorICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCksIFRPUkNIX01PREVfU1RBVFVTX0FWQUlMQUJMRV9PRkYpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgcmVzID0gc3RhcnRQcmV2aWV3QW5kVG9yY2goKTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgbVRvcmNoRW5hYmxlZCA9IHRydWU7CisgICAgbUNhbGxiYWNrcy0+dG9yY2hfbW9kZV9zdGF0dXNfY2hhbmdlKG1DYWxsYmFja3MsCisgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgVE9SQ0hfTU9ERV9TVEFUVVNfQVZBSUxBQkxFX09OKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sOjpoYXNGbGFzaFVuaXQoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBib29sICpoYXNGbGFzaCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICByZXR1cm4gaGFzRmxhc2hVbml0TG9ja2VkKGNhbWVyYUlkLCBoYXNGbGFzaCk7Cit9CisKK3N0YXR1c190IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sOjpoYXNGbGFzaFVuaXRMb2NrZWQoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBib29sICpoYXNGbGFzaCkgeworICAgIGlmICghaGFzRmxhc2gpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXM7CisgICAgaWYgKG1EZXZpY2UgPT0gTlVMTCkgeworICAgICAgICByZXMgPSBjb25uZWN0Q2FtZXJhRGV2aWNlKGNhbWVyYUlkKTsKKyAgICAgICAgaWYgKHJlcykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjYW1lcmFJZCAhPSBtQ2FtZXJhSWQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyICpmbGFzaE1vZGUgPQorICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfRkxBU0hfTU9ERVMpOworICAgIGlmIChmbGFzaE1vZGUgJiYgc3Ryc3RyKGZsYXNoTW9kZSwgQ2FtZXJhUGFyYW1ldGVyczo6RkxBU0hfTU9ERV9UT1JDSCkpIHsKKyAgICAgICAgKmhhc0ZsYXNoID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICAqaGFzRmxhc2ggPSBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sOjpzdGFydFByZXZpZXdBbmRUb3JjaCgpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICByZXMgPSBtRGV2aWNlLT5zdGFydFByZXZpZXcoKTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogc3RhcnQgcHJldmlldyBmYWlsZWQuICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgbVBhcmFtZXRlcnMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9GTEFTSF9NT0RFLAorICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6RkxBU0hfTU9ERV9UT1JDSCk7CisKKyAgICByZXR1cm4gbURldmljZS0+c2V0UGFyYW1ldGVycyhtUGFyYW1ldGVycyk7Cit9CisKK3N0YXR1c190IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sOjpnZXRTbWFsbGVzdFN1cmZhY2VTaXplKAorICAgICAgICBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0KSB7CisgICAgaWYgKCF3aWR0aCB8fCAhaGVpZ2h0KSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaW50MzJfdCB3ID0gSU5UMzJfTUFYOworICAgIGludDMyX3QgaCA9IDE7CisgICAgVmVjdG9yPFNpemU+IHNpemVzOworCisgICAgbVBhcmFtZXRlcnMuZ2V0U3VwcG9ydGVkUHJldmlld1NpemVzKHNpemVzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIFNpemUgcyA9IHNpemVzW2ldOworICAgICAgICBpZiAodyAqIGggPiBzLndpZHRoICogcy5oZWlnaHQpIHsKKyAgICAgICAgICAgIHcgPSBzLndpZHRoOworICAgICAgICAgICAgaCA9IHMuaGVpZ2h0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHcgPT0gSU5UMzJfTUFYKSB7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisKKyAgICAqd2lkdGggPSB3OworICAgICpoZWlnaHQgPSBoOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbDo6aW5pdGlhbGl6ZVByZXZpZXdXaW5kb3coCisgICAgICAgIHNwPENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlPiBkZXZpY2UsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgc3RhdHVzX3QgcmVzOworICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmbVByb2R1Y2VyLCAmbUNvbnN1bWVyKTsKKworICAgIG1TdXJmYWNlVGV4dHVyZSA9IG5ldyBHTENvbnN1bWVyKG1Db25zdW1lciwgMCwgR0xDb25zdW1lcjo6VEVYVFVSRV9FWFRFUk5BTCwKKyAgICAgICAgICAgIHRydWUsIHRydWUpOworICAgIGlmIChtU3VyZmFjZVRleHR1cmUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIGludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOworICAgIHJlcyA9IG1TdXJmYWNlVGV4dHVyZS0+c2V0RGVmYXVsdEJ1ZmZlclNpemUod2lkdGgsIGhlaWdodCk7CisgICAgaWYgKHJlcykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICByZXMgPSBtU3VyZmFjZVRleHR1cmUtPnNldERlZmF1bHRCdWZmZXJGb3JtYXQoZm9ybWF0KTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgbVN1cmZhY2UgPSBuZXcgU3VyZmFjZShtUHJvZHVjZXIsIC8qdXNlQXN5bmMqLyB0cnVlKTsKKyAgICBpZiAobVN1cmZhY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3QobVN1cmZhY2UuZ2V0KCksIE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQSk7CisgICAgaWYgKHJlcykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25uZWN0IHRvIG5hdGl2ZSB3aW5kb3ciLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHJldHVybiBkZXZpY2UtPnNldFByZXZpZXdXaW5kb3cobVN1cmZhY2UpOworfQorCitzdGF0dXNfdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbDo6Y29ubmVjdENhbWVyYURldmljZSgKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpIHsKKyAgICBzcDxDYW1lcmFIYXJkd2FyZUludGVyZmFjZT4gZGV2aWNlID0KKyAgICAgICAgICAgIG5ldyBDYW1lcmFIYXJkd2FyZUludGVyZmFjZShjYW1lcmFJZC5zdHJpbmcoKSk7CisKKyAgICBzdGF0dXNfdCByZXMgPSBkZXZpY2UtPmluaXRpYWxpemUobUNhbWVyYU1vZHVsZSk7CisgICAgaWYgKHJlcykgeworICAgICAgICBBTE9HRSgiJXM6IGluaXRpYWxpemluZyBjYW1lcmEgJXMgZmFpbGVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvLyBuZWVkIHRvIHNldCBfX2dldF9tZW1vcnkgaW4gc2V0X2NhbGxiYWNrcygpLgorICAgIGRldmljZS0+c2V0Q2FsbGJhY2tzKE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworCisgICAgbVBhcmFtZXRlcnMgPSBkZXZpY2UtPmdldFBhcmFtZXRlcnMoKTsKKworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICByZXMgPSBnZXRTbWFsbGVzdFN1cmZhY2VTaXplKCZ3aWR0aCwgJmhlaWdodCk7CisgICAgaWYgKHJlcykgeworICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBnZXQgc21hbGxlc3Qgc3VyZmFjZSBzaXplIGZvciBjYW1lcmEgJXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHJlcyA9IGluaXRpYWxpemVQcmV2aWV3V2luZG93KGRldmljZSwgd2lkdGgsIGhlaWdodCk7CisgICAgaWYgKHJlcykgeworICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBpbml0aWFsaXplIHByZXZpZXcgd2luZG93IGZvciBjYW1lcmEgJXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIG1DYW1lcmFJZCA9IGNhbWVyYUlkOworICAgIG1EZXZpY2UgPSBkZXZpY2U7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbDo6ZGlzY29ubmVjdENhbWVyYURldmljZSgpIHsKKyAgICBpZiAobURldmljZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBtUGFyYW1ldGVycy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZMQVNIX01PREUsCisgICAgICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzOjpGTEFTSF9NT0RFX09GRik7CisgICAgbURldmljZS0+c2V0UGFyYW1ldGVycyhtUGFyYW1ldGVycyk7CisgICAgbURldmljZS0+c3RvcFByZXZpZXcoKTsKKyAgICBzdGF0dXNfdCByZXMgPSBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KG1TdXJmYWNlLmdldCgpLAorICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19BUElfQ0FNRVJBKTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIEFMT0dXKCIlczogbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdCBmYWlsZWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgfQorICAgIG1EZXZpY2UtPnNldFByZXZpZXdXaW5kb3coTlVMTCk7CisgICAgbURldmljZS0+cmVsZWFzZSgpOworCisgICAgcmV0dXJuIE9LOworfQorLy8gQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2wgaW1wbGVtZW50YXRpb24gZW5kcworCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFGbGFzaGxpZ2h0LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFGbGFzaGxpZ2h0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ1ZmU4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuaApAQCAtMCwwICsxLDIyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFGTEFTSExJR0hUX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFGTEFTSExJR0hUX0gKKworI2luY2x1ZGUgImhhcmR3YXJlL2NhbWVyYV9jb21tb24uaCIKKyNpbmNsdWRlICJ1dGlscy9LZXllZFZlY3Rvci5oIgorI2luY2x1ZGUgInV0aWxzL1NvcnRlZFZlY3Rvci5oIgorI2luY2x1ZGUgImd1aS9HTENvbnN1bWVyLmgiCisjaW5jbHVkZSAiZ3VpL1N1cmZhY2UuaCIKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIgorI2luY2x1ZGUgImRldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIEZsYXNoQ29udHJvbEJhc2UgaXMgYSBiYXNlIGNsYXNzIGZvciBmbGFzaCBjb250cm9sLiBJdCBkZWZpbmVzIHRoZSBmdW5jdGlvbnMKKyAqIHRoYXQgYSBmbGFzaCBjb250cm9sIGZvciBlYWNoIGNhbWVyYSBtb2R1bGUvZGV2aWNlIHZlcnNpb24gc2hvdWxkIGltcGxlbWVudC4KKyAqLworY2xhc3MgRmxhc2hDb250cm9sQmFzZSA6IHB1YmxpYyB2aXJ0dWFsIFZpcnR1YWxMaWdodFJlZkJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+Rmxhc2hDb250cm9sQmFzZSgpOworCisgICAgICAgIC8vIFdoZXRoZXIgYSBjYW1lcmEgZGV2aWNlIGhhcyBhIGZsYXNoIHVuaXQuIENhbGxpbmcgdGhpcyBmdW5jdGlvbiBtYXkKKyAgICAgICAgLy8gY2F1c2UgdGhlIHRvcmNoIG1vZGUgdG8gYmUgdHVybmVkIG9mZiBpbiBIQUwgdjEgZGV2aWNlcy4gSWYKKyAgICAgICAgLy8gcHJldmlvdXNseS1vbiB0b3JjaCBtb2RlIGlzIHR1cm5lZCBvZmYsCisgICAgICAgIC8vIGNhbGxiYWNrcy50b3JjaF9tb2RlX3N0YXR1c19jaGFuZ2UoKSBzaG91bGQgYmUgaW52b2tlZC4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBoYXNGbGFzaFVuaXQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgKmhhc0ZsYXNoKSA9IDA7CisKKyAgICAgICAgLy8gc2V0IHRoZSB0b3JjaCBtb2RlIHRvIG9uIG9yIG9mZi4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlZCkgPSAwOworfTsKKworLyoqCisgKiBDYW1lcmFGbGFzaGxpZ2h0IGNhbiBiZSB1c2VkIGJ5IGNhbWVyYSBzZXJ2aWNlIHRvIGNvbnRyb2wgZmxhc2hmbGlnaHQuCisgKi8KK2NsYXNzIENhbWVyYUZsYXNobGlnaHQgOiBwdWJsaWMgdmlydHVhbCBWaXJ0dWFsTGlnaHRSZWZCYXNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIENhbWVyYUZsYXNobGlnaHQoQ2FtZXJhTW9kdWxlJiBjYW1lcmFNb2R1bGUsCisgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21vZHVsZV9jYWxsYmFja3NfdCYgY2FsbGJhY2tzKTsKKyAgICAgICAgdmlydHVhbCB+Q2FtZXJhRmxhc2hsaWdodCgpOworCisgICAgICAgIC8vIEZpbmQgYWxsIGZsYXNoIHVuaXRzLiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBvdGhlciBtZXRob2RzLiBBbGwKKyAgICAgICAgLy8gY2FtZXJhIGRldmljZXMgbXVzdCBiZSBjbG9zZWQgd2hlbiBpdCdzIGNhbGxlZCBiZWNhdXNlIEhBTCB2MSBkZXZpY2VzCisgICAgICAgIC8vIG5lZWQgdG8gYmUgb3BlbmVkIHRvIHF1ZXJ5IGF2YWlsYWJsZSBmbGFzaCBtb2Rlcy4KKyAgICAgICAgc3RhdHVzX3QgZmluZEZsYXNoVW5pdHMoKTsKKworICAgICAgICAvLyBXaGV0aGVyIGEgY2FtZXJhIGRldmljZSBoYXMgYSBmbGFzaCB1bml0LiBCZWZvcmUgZmluZEZsYXNoVW5pdHMoKSBpcworICAgICAgICAvLyBjYWxsZWQsIHRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgZmFsc2UuCisgICAgICAgIGJvb2wgaGFzRmxhc2hVbml0KGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKTsKKworICAgICAgICAvLyBzZXQgdGhlIHRvcmNoIG1vZGUgdG8gb24gb3Igb2ZmLgorICAgICAgICBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgZW5hYmxlZCk7CisKKyAgICAgICAgLy8gTm90aWZ5IENhbWVyYUZsYXNobGlnaHQgdGhhdCBjYW1lcmEgc2VydmljZSBpcyBnb2luZyB0byBvcGVuIGEgY2FtZXJhCisgICAgICAgIC8vIGRldmljZS4gQ2FtZXJhRmxhc2hsaWdodCB3aWxsIGZyZWUgdGhlIHJlc291cmNlcyB0aGF0IG1heSBjYXVzZSB0aGUKKyAgICAgICAgLy8gY2FtZXJhIG9wZW4gdG8gZmFpbC4gQ2FtZXJhIHNlcnZpY2UgbXVzdCBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlCisgICAgICAgIC8vIG9wZW5pbmcgYSBjYW1lcmEgZGV2aWNlLgorICAgICAgICBzdGF0dXNfdCBwcmVwYXJlRGV2aWNlT3Blbihjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCk7CisKKyAgICAgICAgLy8gTm90aWZ5IENhbWVyYUZsYXNobGlnaHQgdGhhdCBjYW1lcmEgc2VydmljZSBoYXMgY2xvc2VkIGEgY2FtZXJhCisgICAgICAgIC8vIGRldmljZS4gQ2FtZXJhRmxhc2hsaWdodCBtYXkgaW52b2tlIGNhbGxiYWNrcyBmb3IgdG9yY2ggbW9kZQorICAgICAgICAvLyBhdmFpbGFibGUgZGVwZW5kaW5nIG9uIHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgc3RhdHVzX3QgZGV2aWNlQ2xvc2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIC8vIGNyZWF0ZSBmbGFzaGxpZ2h0IGNvbnRyb2wgYmFzZWQgb24gY2FtZXJhIG1vZHVsZSBBUEkgYW5kIGNhbWVyYQorICAgICAgICAvLyBkZXZpY2UgQVBJIHZlcnNpb25zLgorICAgICAgICBzdGF0dXNfdCBjcmVhdGVGbGFzaGxpZ2h0Q29udHJvbChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCk7CisKKyAgICAgICAgLy8gbUxvY2sgc2hvdWxkIGJlIGxvY2tlZC4KKyAgICAgICAgYm9vbCBoYXNGbGFzaFVuaXRMb2NrZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpOworCisgICAgICAgIHNwPEZsYXNoQ29udHJvbEJhc2U+IG1GbGFzaENvbnRyb2w7CisgICAgICAgIENhbWVyYU1vZHVsZSAqbUNhbWVyYU1vZHVsZTsKKyAgICAgICAgY29uc3QgY2FtZXJhX21vZHVsZV9jYWxsYmFja3NfdCAqbUNhbGxiYWNrczsKKyAgICAgICAgU29ydGVkVmVjdG9yPFN0cmluZzg+IG1PcGVuZWRDYW1lcmFJZHM7CisKKyAgICAgICAgLy8gY2FtZXJhIGlkIC0+IGlmIGl0IGhhcyBhIGZsYXNoIHVuaXQKKyAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgYm9vbD4gbUhhc0ZsYXNobGlnaHRNYXA7CisgICAgICAgIGJvb2wgbUZsYXNobGlnaHRNYXBJbml0aWFsaXplZDsKKworICAgICAgICBNdXRleCBtTG9jazsgLy8gcHJvdGVjdCBDYW1lcmFGbGFzaGxpZ2h0IEFQSQorfTsKKworLyoqCisgKiBGbGFzaCBjb250cm9sIGZvciBjYW1lcmEgbW9kdWxlIHYyLjQgYW5kIGFib3ZlLgorICovCitjbGFzcyBNb2R1bGVGbGFzaENvbnRyb2wgOiBwdWJsaWMgRmxhc2hDb250cm9sQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICBNb2R1bGVGbGFzaENvbnRyb2woQ2FtZXJhTW9kdWxlJiBjYW1lcmFNb2R1bGUsCisgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21vZHVsZV9jYWxsYmFja3NfdCYgY2FsbGJhY2tzKTsKKyAgICAgICAgdmlydHVhbCB+TW9kdWxlRmxhc2hDb250cm9sKCk7CisKKyAgICAgICAgLy8gRmxhc2hDb250cm9sQmFzZQorICAgICAgICBzdGF0dXNfdCBoYXNGbGFzaFVuaXQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgKmhhc0ZsYXNoKTsKKyAgICAgICAgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBib29sIGVuYWJsZWQpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgQ2FtZXJhTW9kdWxlICptQ2FtZXJhTW9kdWxlOworCisgICAgICAgIE11dGV4IG1Mb2NrOworfTsKKworLyoqCisgKiBGbGFzaCBjb250cm9sIGZvciBjYW1lcmEgbW9kdWxlIDw9IHYyLjMgYW5kIGNhbWVyYSBIQUwgdjItdjMKKyAqLworY2xhc3MgQ2FtZXJhRGV2aWNlQ2xpZW50Rmxhc2hDb250cm9sIDogcHVibGljIEZsYXNoQ29udHJvbEJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgQ2FtZXJhRGV2aWNlQ2xpZW50Rmxhc2hDb250cm9sKENhbWVyYU1vZHVsZSYgY2FtZXJhTW9kdWxlLAorICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzX3QmIGNhbGxiYWNrcyk7CisgICAgICAgIHZpcnR1YWwgfkNhbWVyYURldmljZUNsaWVudEZsYXNoQ29udHJvbCgpOworCisgICAgICAgIC8vIEZsYXNoQ29udHJvbEJhc2UKKyAgICAgICAgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBib29sIGVuYWJsZWQpOworICAgICAgICBzdGF0dXNfdCBoYXNGbGFzaFVuaXQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgKmhhc0ZsYXNoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIC8vIGNvbm5lY3QgdG8gYSBjYW1lcmEgZGV2aWNlCisgICAgICAgIHN0YXR1c190IGNvbm5lY3RDYW1lcmFEZXZpY2UoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpOworICAgICAgICAvLyBkaXNjb25uZWN0IGFuZCBmcmVlIG1EZXZpY2UKKyAgICAgICAgc3RhdHVzX3QgZGlzY29ubmVjdENhbWVyYURldmljZSgpOworCisgICAgICAgIC8vIGluaXRpYWxpemUgYSBzdXJmYWNlCisgICAgICAgIHN0YXR1c190IGluaXRpYWxpemVTdXJmYWNlKHNwPENhbWVyYURldmljZUJhc2U+JiBkZXZpY2UsIGludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpOworCisgICAgICAgIC8vIHN1Ym1pdCBhIHJlcXVlc3QgdG8gZW5hYmxlIHRoZSB0b3JjaCBtb2RlCisgICAgICAgIHN0YXR1c190IHN1Ym1pdFRvcmNoRW5hYmxlZFJlcXVlc3QoKTsKKworICAgICAgICAvLyBnZXQgdGhlIHNtYWxsZXN0IHN1cmZhY2Ugc2l6ZSBvZiBJTVBMRU1FTlRBVElPTl9ERUZJTkVECisgICAgICAgIHN0YXR1c190IGdldFNtYWxsZXN0U3VyZmFjZVNpemUoY29uc3QgY2FtZXJhX2luZm8mIGluZm8sIGludDMyX3QgKndpZHRoLAorICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpoZWlnaHQpOworCisgICAgICAgIC8vIHByb3RlY3RlZCBieSBtTG9jaworICAgICAgICBzdGF0dXNfdCBoYXNGbGFzaFVuaXRMb2NrZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgKmhhc0ZsYXNoKTsKKworICAgICAgICBDYW1lcmFNb2R1bGUgKm1DYW1lcmFNb2R1bGU7CisgICAgICAgIGNvbnN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzX3QgKm1DYWxsYmFja3M7CisgICAgICAgIFN0cmluZzggbUNhbWVyYUlkOworICAgICAgICBib29sIG1Ub3JjaEVuYWJsZWQ7CisgICAgICAgIENhbWVyYU1ldGFkYXRhICptTWV0YWRhdGE7CisgICAgICAgIC8vIFdPUktBUk9VTkQ6IHdpbGwgYmUgc2V0IHRvIHRydWUgZm9yIEhBTCB2MiBkZXZpY2VzIHdoZXJlCisgICAgICAgIC8vIHNldFN0cmVhbWluZ1JlcXVlc3QoKSBuZWVkcyB0byBiZSBjYWxsIGZvciB0b3JjaCBtb2RlIHNldHRpbmdzIHRvCisgICAgICAgIC8vIHRha2UgZWZmZWN0LgorICAgICAgICBib29sIG1TdHJlYW1pbmc7CisKKyAgICAgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gbURldmljZTsKKworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJvZHVjZXI7CisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+ICBtQ29uc3VtZXI7CisgICAgICAgIHNwPEdMQ29uc3VtZXI+IG1TdXJmYWNlVGV4dHVyZTsKKyAgICAgICAgc3A8U3VyZmFjZT4gbVN1cmZhY2U7CisgICAgICAgIGludDMyX3QgbVN0cmVhbUlkOworCisgICAgICAgIE11dGV4IG1Mb2NrOworfTsKKworLyoqCisgKiBGbGFzaCBjb250cm9sIGZvciBjYW1lcmEgbW9kdWxlIDw9IHYyLjMgYW5kIGNhbWVyYSBIQUwgdjEKKyAqLworY2xhc3MgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2wgOiBwdWJsaWMgRmxhc2hDb250cm9sQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICBDYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbChDYW1lcmFNb2R1bGUmIGNhbWVyYU1vZHVsZSwKKyAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbW9kdWxlX2NhbGxiYWNrc190JiBjYWxsYmFja3MpOworICAgICAgICB2aXJ0dWFsIH5DYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbCgpOworCisgICAgICAgIC8vIEZsYXNoQ29udHJvbEJhc2UKKyAgICAgICAgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBib29sIGVuYWJsZWQpOworICAgICAgICBzdGF0dXNfdCBoYXNGbGFzaFVuaXQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgKmhhc0ZsYXNoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIC8vIGNvbm5lY3QgdG8gYSBjYW1lcmEgZGV2aWNlCisgICAgICAgIHN0YXR1c190IGNvbm5lY3RDYW1lcmFEZXZpY2UoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpOworCisgICAgICAgIC8vIGRpc2Nvbm5lY3QgYW5kIGZyZWUgbURldmljZQorICAgICAgICBzdGF0dXNfdCBkaXNjb25uZWN0Q2FtZXJhRGV2aWNlKCk7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgcHJldmlldyB3aW5kb3cKKyAgICAgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZVByZXZpZXdXaW5kb3coc3A8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U+IGRldmljZSwKKyAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7CisKKyAgICAgICAgLy8gc3RhcnQgcHJldmlldyBhbmQgZW5hYmxlIHRvcmNoCisgICAgICAgIHN0YXR1c190IHN0YXJ0UHJldmlld0FuZFRvcmNoKCk7CisKKyAgICAgICAgLy8gZ2V0IHRoZSBzbWFsbGVzdCBzdXJmYWNlCisgICAgICAgIHN0YXR1c190IGdldFNtYWxsZXN0U3VyZmFjZVNpemUoaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCk7CisKKyAgICAgICAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCisgICAgICAgIHN0YXR1c190IGhhc0ZsYXNoVW5pdExvY2tlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgYm9vbCAqaGFzRmxhc2gpOworCisgICAgICAgIENhbWVyYU1vZHVsZSAqbUNhbWVyYU1vZHVsZTsKKyAgICAgICAgY29uc3QgY2FtZXJhX21vZHVsZV9jYWxsYmFja3NfdCAqbUNhbGxiYWNrczsKKyAgICAgICAgc3A8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U+IG1EZXZpY2U7CisgICAgICAgIFN0cmluZzggbUNhbWVyYUlkOworICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzIG1QYXJhbWV0ZXJzOworICAgICAgICBib29sIG1Ub3JjaEVuYWJsZWQ7CisKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbVByb2R1Y2VyOworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiAgbUNvbnN1bWVyOworICAgICAgICBzcDxHTENvbnN1bWVyPiBtU3VyZmFjZVRleHR1cmU7CisgICAgICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlOworCisgICAgICAgIE11dGV4IG1Mb2NrOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKaW5kZXggYTE0NDc1My4uODM5MWYyNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKQEAgLTE3LDkgKzE3LDE0IEBACiAjZGVmaW5lIExPR19UQUcgIkNhbWVyYVNlcnZpY2UiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2xpbWl0cz4KICNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8Y3RpbWU+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0FwcE9wc01hbmFnZXIuaD4KQEAgLTI3LDYgKzMyLDggQEAKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc0luZm9TZXJ2aWNlLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmFTZXJ2aWNlUHJveHkuaD4KICNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgpAQCAtMzQsNiArNDEsNyBAQAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvQmF0dGVyeU5vdGlmaWVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KQEAgLTQ1LDcgKzUzLDYgQEAKICNpbmNsdWRlICJDYW1lcmFTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiYXBpMS9DYW1lcmFDbGllbnQuaCIKICNpbmNsdWRlICJhcGkxL0NhbWVyYTJDbGllbnQuaCIKLSNpbmNsdWRlICJhcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuaCIKICNpbmNsdWRlICJhcGkyL0NhbWVyYURldmljZUNsaWVudC5oIgogI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRyYWNlcy5oIgogI2luY2x1ZGUgIkNhbWVyYURldmljZUZhY3RvcnkuaCIKQEAgLTY2LDI1ICs3Myw0OCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXN0YXRpYyBpbnQgZ2V0Q2FsbGluZ1BpZCgpIHsKLSAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotfQotCi1zdGF0aWMgaW50IGdldENhbGxpbmdVaWQoKSB7Ci0gICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLX0KLQogZXh0ZXJuICJDIiB7CiBzdGF0aWMgdm9pZCBjYW1lcmFfZGV2aWNlX3N0YXR1c19jaGFuZ2UoCiAgICAgICAgIGNvbnN0IHN0cnVjdCBjYW1lcmFfbW9kdWxlX2NhbGxiYWNrcyogY2FsbGJhY2tzLAogICAgICAgICBpbnQgY2FtZXJhX2lkLAogICAgICAgICBpbnQgbmV3X3N0YXR1cykgewogICAgIHNwPENhbWVyYVNlcnZpY2U+IGNzID0gY29uc3RfY2FzdDxDYW1lcmFTZXJ2aWNlKj4oCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBDYW1lcmFTZXJ2aWNlKj4oY2FsbGJhY2tzKSk7CisKKyAgICBjcy0+b25EZXZpY2VTdGF0dXNDaGFuZ2VkKHN0YXRpY19jYXN0PGNhbWVyYV9kZXZpY2Vfc3RhdHVzX3Q+KGNhbWVyYV9pZCksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmFfZGV2aWNlX3N0YXR1c190PihuZXdfc3RhdHVzKSk7Cit9CisKK3N0YXRpYyB2b2lkIHRvcmNoX21vZGVfc3RhdHVzX2NoYW5nZSgKKyAgICAgICAgY29uc3Qgc3RydWN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzKiBjYWxsYmFja3MsCisgICAgICAgIGNvbnN0IGNoYXIqIGNhbWVyYV9pZCwKKyAgICAgICAgaW50IG5ld19zdGF0dXMpIHsKKyAgICBpZiAoIWNhbGxiYWNrcyB8fCAhY2FtZXJhX2lkKSB7CisgICAgICAgIEFMT0dFKCIlcyBpbnZhbGlkIHBhcmFtZXRlcnMuIGNhbGxiYWNrcyAlcCwgY2FtZXJhX2lkICVwIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGNhbGxiYWNrcywgY2FtZXJhX2lkKTsKKyAgICB9CisgICAgc3A8Q2FtZXJhU2VydmljZT4gY3MgPSBjb25zdF9jYXN0PENhbWVyYVNlcnZpY2UqPigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQ2FtZXJhU2VydmljZSo+KGNhbGxiYWNrcykpOwogCi0gICAgY3MtPm9uRGV2aWNlU3RhdHVzQ2hhbmdlZCgKLSAgICAgICAgY2FtZXJhX2lkLAotICAgICAgICBuZXdfc3RhdHVzKTsKKyAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpUb3JjaFN0YXR1cyBzdGF0dXM7CisgICAgc3dpdGNoIChuZXdfc3RhdHVzKSB7CisgICAgICAgIGNhc2UgVE9SQ0hfTU9ERV9TVEFUVVNfTk9UX0FWQUlMQUJMRToKKyAgICAgICAgICAgIHN0YXR1cyA9IElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlRPUkNIX1NUQVRVU19OT1RfQVZBSUxBQkxFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVE9SQ0hfTU9ERV9TVEFUVVNfQVZBSUxBQkxFX09GRjoKKyAgICAgICAgICAgIHN0YXR1cyA9IElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlRPUkNIX1NUQVRVU19BVkFJTEFCTEVfT0ZGOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVE9SQ0hfTU9ERV9TVEFUVVNfQVZBSUxBQkxFX09OOgorICAgICAgICAgICAgc3RhdHVzID0gSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VE9SQ0hfU1RBVFVTX0FWQUlMQUJMRV9PTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIlVua25vd24gdG9yY2ggc3RhdHVzICVkIiwgbmV3X3N0YXR1cyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY3MtPm9uVG9yY2hTdGF0dXNDaGFuZ2VkKAorICAgICAgICBTdHJpbmc4KGNhbWVyYV9pZCksCisgICAgICAgIHN0YXR1cyk7CiB9CiB9IC8vIGV4dGVybiAiQyIKIApAQCAtOTQsMTM0ICsxMjQsMjk0IEBACiAvLyBzaG91bGQgYmUgb2sgZm9yIG5vdy4KIHN0YXRpYyBDYW1lcmFTZXJ2aWNlICpnQ2FtZXJhU2VydmljZTsKIAotQ2FtZXJhU2VydmljZTo6Q2FtZXJhU2VydmljZSgpCi0gICAgOm1Tb3VuZFJlZigwKSwgbU1vZHVsZSgwKQoteworQ2FtZXJhU2VydmljZTo6Q2FtZXJhU2VydmljZSgpIDogbUV2ZW50TG9nKERFRkFVTFRfRVZFTlRfTE9HX0xFTkdUSCksIG1BbGxvd2VkVXNlcnMoKSwKKyAgICAgICAgbVNvdW5kUmVmKDApLCBtTW9kdWxlKDApLCBtRmxhc2hsaWdodCgwKSB7CiAgICAgQUxPR0koIkNhbWVyYVNlcnZpY2Ugc3RhcnRlZCAocGlkPSVkKSIsIGdldHBpZCgpKTsKICAgICBnQ2FtZXJhU2VydmljZSA9IHRoaXM7CiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1BWF9DQU1FUkFTOyArK2kpIHsKLSAgICAgICAgbVN0YXR1c0xpc3RbaV0gPSBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfUFJFU0VOVDsKLSAgICB9Ci0KICAgICB0aGlzLT5jYW1lcmFfZGV2aWNlX3N0YXR1c19jaGFuZ2UgPSBhbmRyb2lkOjpjYW1lcmFfZGV2aWNlX3N0YXR1c19jaGFuZ2U7CisgICAgdGhpcy0+dG9yY2hfbW9kZV9zdGF0dXNfY2hhbmdlID0gYW5kcm9pZDo6dG9yY2hfbW9kZV9zdGF0dXNfY2hhbmdlOworCisgICAgbVNlcnZpY2VMb2NrV3JhcHBlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8V2FpdGFibGVNdXRleFdyYXBwZXI+KCZtU2VydmljZUxvY2spOwogfQogCiB2b2lkIENhbWVyYVNlcnZpY2U6Om9uRmlyc3RSZWYoKQogewotICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6Om9uRmlyc3RSZWYiKTsKKyAgICBBTE9HSSgiQ2FtZXJhU2VydmljZSBwcm9jZXNzIHN0YXJ0aW5nIik7CiAKICAgICBCbkNhbWVyYVNlcnZpY2U6Om9uRmlyc3RSZWYoKTsKIAotICAgIGlmIChod19nZXRfbW9kdWxlKENBTUVSQV9IQVJEV0FSRV9NT0RVTEVfSUQsCi0gICAgICAgICAgICAgICAgKGNvbnN0IGh3X21vZHVsZV90ICoqKSZtTW9kdWxlKSA8IDApIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBsb2FkIGNhbWVyYSBIQUwgbW9kdWxlIik7CisgICAgLy8gVXBkYXRlIGJhdHRlcnkgbGlmZSB0cmFja2luZyBpZiBzZXJ2aWNlIGlzIHJlc3RhcnRpbmcKKyAgICBCYXR0ZXJ5Tm90aWZpZXImIG5vdGlmaWVyKEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKSk7CisgICAgbm90aWZpZXIubm90ZVJlc2V0Q2FtZXJhKCk7CisgICAgbm90aWZpZXIubm90ZVJlc2V0Rmxhc2hsaWdodCgpOworCisgICAgY2FtZXJhX21vZHVsZV90ICpyYXdNb2R1bGU7CisgICAgaW50IGVyciA9IGh3X2dldF9tb2R1bGUoQ0FNRVJBX0hBUkRXQVJFX01PRFVMRV9JRCwKKyAgICAgICAgICAgIChjb25zdCBod19tb2R1bGVfdCAqKikmcmF3TW9kdWxlKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGxvYWQgY2FtZXJhIEhBTCBtb2R1bGU6ICVkICglcykiLCBlcnIsIHN0cmVycm9yKC1lcnIpKTsKKyAgICAgICAgbG9nU2VydmljZUVycm9yKCJDb3VsZCBub3QgbG9hZCBjYW1lcmEgSEFMIG1vZHVsZSIsIGVycik7CiAgICAgICAgIG1OdW1iZXJPZkNhbWVyYXMgPSAwOworICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGVsc2UgewotICAgICAgICBBTE9HSSgiTG9hZGVkIFwiJXNcIiBjYW1lcmEgbW9kdWxlIiwgbU1vZHVsZS0+Y29tbW9uLm5hbWUpOwotICAgICAgICBtTnVtYmVyT2ZDYW1lcmFzID0gbU1vZHVsZS0+Z2V0X251bWJlcl9vZl9jYW1lcmFzKCk7Ci0gICAgICAgIGlmIChtTnVtYmVyT2ZDYW1lcmFzID4gTUFYX0NBTUVSQVMpIHsKLSAgICAgICAgICAgIEFMT0dFKCJOdW1iZXIgb2YgY2FtZXJhcyglZCkgPiBNQVhfQ0FNRVJBUyglZCkuIiwKLSAgICAgICAgICAgICAgICAgICAgbU51bWJlck9mQ2FtZXJhcywgTUFYX0NBTUVSQVMpOwotICAgICAgICAgICAgbU51bWJlck9mQ2FtZXJhcyA9IE1BWF9DQU1FUkFTOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bWJlck9mQ2FtZXJhczsgaSsrKSB7Ci0gICAgICAgICAgICBzZXRDYW1lcmFGcmVlKGkpOwotICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1Nb2R1bGUtPmNvbW1vbi5tb2R1bGVfYXBpX3ZlcnNpb24gPj0KLSAgICAgICAgICAgICAgICBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfMSkgewotICAgICAgICAgICAgbU1vZHVsZS0+c2V0X2NhbGxiYWNrcyh0aGlzKTsKLSAgICAgICAgfQorICAgIG1Nb2R1bGUgPSBuZXcgQ2FtZXJhTW9kdWxlKHJhd01vZHVsZSk7CisgICAgQUxPR0koIkxvYWRlZCBcIiVzXCIgY2FtZXJhIG1vZHVsZSIsIG1Nb2R1bGUtPmdldE1vZHVsZU5hbWUoKSk7CisgICAgZXJyID0gbU1vZHVsZS0+aW5pdCgpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBpbml0aWFsaXplIGNhbWVyYSBIQUwgbW9kdWxlOiAlZCAoJXMpIiwgZXJyLAorICAgICAgICAgICAgc3RyZXJyb3IoLWVycikpOworICAgICAgICBsb2dTZXJ2aWNlRXJyb3IoIkNvdWxkIG5vdCBpbml0aWFsaXplIGNhbWVyYSBIQUwgbW9kdWxlIiwgZXJyKTsKIAotICAgICAgICBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjbGVhckdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKLQotICAgICAgICBpZiAobU1vZHVsZS0+Y29tbW9uLm1vZHVsZV9hcGlfdmVyc2lvbiA+PSBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfMikgewotICAgICAgICAgICAgc2V0VXBWZW5kb3JUYWdzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBDYW1lcmFEZXZpY2VGYWN0b3J5OjpyZWdpc3RlclNlcnZpY2UodGhpcyk7CisgICAgICAgIG1OdW1iZXJPZkNhbWVyYXMgPSAwOworICAgICAgICBkZWxldGUgbU1vZHVsZTsKKyAgICAgICAgbU1vZHVsZSA9IG51bGxwdHI7CisgICAgICAgIHJldHVybjsKICAgICB9Ci19CiAKLUNhbWVyYVNlcnZpY2U6On5DYW1lcmFTZXJ2aWNlKCkgeworICAgIG1OdW1iZXJPZkNhbWVyYXMgPSBtTW9kdWxlLT5nZXROdW1iZXJPZkNhbWVyYXMoKTsKKyAgICBtTnVtYmVyT2ZOb3JtYWxDYW1lcmFzID0gbU51bWJlck9mQ2FtZXJhczsKKworICAgIG1GbGFzaGxpZ2h0ID0gbmV3IENhbWVyYUZsYXNobGlnaHQoKm1Nb2R1bGUsICp0aGlzKTsKKyAgICBzdGF0dXNfdCByZXMgPSBtRmxhc2hsaWdodC0+ZmluZEZsYXNoVW5pdHMoKTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIC8vIGltcG9zc2libGUgYmVjYXVzZSB3ZSBoYXZlbid0IG9wZW4gYW55IGNhbWVyYSBkZXZpY2VzLgorICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGZpbmQgZmxhc2ggdW5pdHMuIik7CisgICAgfQorCisgICAgaW50IGxhdGVzdFN0cmFuZ2VDYW1lcmFJZCA9IElOVF9NQVg7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtYmVyT2ZDYW1lcmFzOyBpKyspIHsKLSAgICAgICAgaWYgKG1CdXN5W2ldKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY2FtZXJhICVkIGlzIHN0aWxsIGluIHVzZSBpbiBkZXN0cnVjdG9yISIsIGkpOworICAgICAgICBTdHJpbmc4IGNhbWVyYUlkID0gU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGkpOworCisgICAgICAgIC8vIEdldCBjYW1lcmEgaW5mbworCisgICAgICAgIHN0cnVjdCBjYW1lcmFfaW5mbyBpbmZvOworICAgICAgICBib29sIGhhdmVJbmZvID0gdHJ1ZTsKKyAgICAgICAgc3RhdHVzX3QgcmMgPSBtTW9kdWxlLT5nZXRDYW1lcmFJbmZvKGksICZpbmZvKTsKKyAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFJlY2VpdmVkIGVycm9yIGxvYWRpbmcgY2FtZXJhIGluZm8gZm9yIGRldmljZSAlZCwgY29zdCBhbmQiCisgICAgICAgICAgICAgICAgICAgICIgY29uZmxpY3RpbmcgZGV2aWNlcyBmaWVsZHMgc2V0IHRvIGRlZmF1bHRzIGZvciB0aGlzIGRldmljZS4iLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGkpOworICAgICAgICAgICAgaGF2ZUluZm8gPSBmYWxzZTsKICAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBzdXBwb3J0CisgICAgICAgIGlmIChoYXZlSW5mbykgeworICAgICAgICAgICAgaWYgKGNoZWNrQ2FtZXJhQ2FwYWJpbGl0aWVzKGksIGluZm8sICZsYXRlc3RTdHJhbmdlQ2FtZXJhSWQpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgZGVsZXRlIG1Nb2R1bGU7CisgICAgICAgICAgICAgICAgbU1vZHVsZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRGVmYXVsdHMgdG8gdXNlIGZvciBjb3N0IGFuZCBjb25mbGljdGluZyBkZXZpY2VzCisgICAgICAgIGludCBjb3N0ID0gMTAwOworICAgICAgICBjaGFyKiogY29uZmxpY3RpbmdfZGV2aWNlcyA9IG51bGxwdHI7CisgICAgICAgIHNpemVfdCBjb25mbGljdGluZ19kZXZpY2VzX2xlbmd0aCA9IDA7CisKKyAgICAgICAgLy8gSWYgdXNpbmcgcG9zdC0yLjQgbW9kdWxlIHZlcnNpb24sIHF1ZXJ5IHRoZSBjb3N0ICsgY29uZmxpY3RpbmcgZGV2aWNlcyBmcm9tIHRoZSBIQUwKKyAgICAgICAgaWYgKG1Nb2R1bGUtPmdldE1vZHVsZUFwaVZlcnNpb24oKSA+PSBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfNCAmJiBoYXZlSW5mbykgeworICAgICAgICAgICAgY29zdCA9IGluZm8ucmVzb3VyY2VfY29zdDsKKyAgICAgICAgICAgIGNvbmZsaWN0aW5nX2RldmljZXMgPSBpbmZvLmNvbmZsaWN0aW5nX2RldmljZXM7CisgICAgICAgICAgICBjb25mbGljdGluZ19kZXZpY2VzX2xlbmd0aCA9IGluZm8uY29uZmxpY3RpbmdfZGV2aWNlc19sZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnNldDxTdHJpbmc4PiBjb25mbGljdGluZzsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb25mbGljdGluZ19kZXZpY2VzX2xlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb25mbGljdGluZy5lbXBsYWNlKFN0cmluZzgoY29uZmxpY3RpbmdfZGV2aWNlc1tpXSkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBzdGF0ZSBmb3IgZWFjaCBjYW1lcmEgZGV2aWNlCisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1DYW1lcmFTdGF0ZXNMb2NrKTsKKyAgICAgICAgICAgIG1DYW1lcmFTdGF0ZXMuZW1wbGFjZShjYW1lcmFJZCwgc3RkOjptYWtlX3NoYXJlZDxDYW1lcmFTdGF0ZT4oY2FtZXJhSWQsIGNvc3QsCisgICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0aW5nKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUZsYXNobGlnaHQtPmhhc0ZsYXNoVW5pdChjYW1lcmFJZCkpIHsKKyAgICAgICAgICAgIG1Ub3JjaFN0YXR1c01hcC5hZGQoY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlRPUkNIX1NUQVRVU19BVkFJTEFCTEVfT0ZGKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtTW9kdWxlLT5nZXRNb2R1bGVBcGlWZXJzaW9uKCkgPj0gQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzEpIHsKKyAgICAgICAgbU1vZHVsZS0+c2V0Q2FsbGJhY2tzKHRoaXMpOwogICAgIH0KIAogICAgIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNsZWFyR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpOwotICAgIGdDYW1lcmFTZXJ2aWNlID0gTlVMTDsKKworICAgIGlmIChtTW9kdWxlLT5nZXRNb2R1bGVBcGlWZXJzaW9uKCkgPj0gQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzIpIHsKKyAgICAgICAgc2V0VXBWZW5kb3JUYWdzKCk7CisgICAgfQorCisgICAgQ2FtZXJhRGV2aWNlRmFjdG9yeTo6cmVnaXN0ZXJTZXJ2aWNlKHRoaXMpOworCisgICAgQ2FtZXJhU2VydmljZTo6cGluZ0NhbWVyYVNlcnZpY2VQcm94eSgpOwogfQogCi12b2lkIENhbWVyYVNlcnZpY2U6Om9uRGV2aWNlU3RhdHVzQ2hhbmdlZChpbnQgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV3U3RhdHVzKQotewordm9pZCBDYW1lcmFTZXJ2aWNlOjpwaW5nQ2FtZXJhU2VydmljZVByb3h5KCkgeworICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBzbS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEuY2FtZXJhLnByb3h5IikpOworICAgIGlmIChiaW5kZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPElDYW1lcmFTZXJ2aWNlUHJveHk+IHByb3h5QmluZGVyID0gaW50ZXJmYWNlX2Nhc3Q8SUNhbWVyYVNlcnZpY2VQcm94eT4oYmluZGVyKTsKKyAgICBwcm94eUJpbmRlci0+cGluZ0ZvclVzZXJVcGRhdGUoKTsKK30KKworQ2FtZXJhU2VydmljZTo6fkNhbWVyYVNlcnZpY2UoKSB7CisgICAgaWYgKG1Nb2R1bGUpIHsKKyAgICAgICAgZGVsZXRlIG1Nb2R1bGU7CisgICAgICAgIG1Nb2R1bGUgPSBudWxscHRyOworICAgIH0KKyAgICBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjbGVhckdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKKyAgICBnQ2FtZXJhU2VydmljZSA9IG51bGxwdHI7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6b25EZXZpY2VTdGF0dXNDaGFuZ2VkKGNhbWVyYV9kZXZpY2Vfc3RhdHVzX3QgIGNhbWVyYUlkLAorICAgICAgICBjYW1lcmFfZGV2aWNlX3N0YXR1c190IG5ld1N0YXR1cykgewogICAgIEFMT0dJKCIlczogU3RhdHVzIGNoYW5nZWQgZm9yIGNhbWVyYUlkPSVkLCBuZXdTdGF0dXM9JWQiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgY2FtZXJhSWQsIG5ld1N0YXR1cyk7CiAKLSAgICBpZiAoY2FtZXJhSWQgPCAwIHx8IGNhbWVyYUlkID49IE1BWF9DQU1FUkFTKSB7CisgICAgU3RyaW5nOCBpZCA9IFN0cmluZzg6OmZvcm1hdCgiJWQiLCBjYW1lcmFJZCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPENhbWVyYVN0YXRlPiBzdGF0ZSA9IGdldENhbWVyYVN0YXRlKGlkKTsKKworICAgIGlmIChzdGF0ZSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlczogQmFkIGNhbWVyYSBJRCAlZCIsIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKChpbnQpZ2V0U3RhdHVzKGNhbWVyYUlkKSA9PSBuZXdTdGF0dXMpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBTdGF0ZSB0cmFuc2l0aW9uIHRvIHRoZSBzYW1lIHN0YXR1cyAweCV4IG5vdCBhbGxvd2VkIiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAodWludDMyX3QpbmV3U3RhdHVzKTsKKyAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXMgb2xkU3RhdHVzID0gc3RhdGUtPmdldFN0YXR1cygpOworCisgICAgaWYgKG9sZFN0YXR1cyA9PSBzdGF0aWNfY2FzdDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXM+KG5ld1N0YXR1cykpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdGF0ZSB0cmFuc2l0aW9uIHRvIHRoZSBzYW1lIHN0YXR1cyAlI3ggbm90IGFsbG93ZWQiLCBfX0ZVTkNUSU9OX18sIG5ld1N0YXR1cyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICAvKiBkb24ndCBkbyB0aGlzIGluIHVwZGF0ZVN0YXR1cwotICAgICAgIHNpbmNlIGl0IGlzIGFsc28gY2FsbGVkIGZyb20gY29ubmVjdCBhbmQgd2UgY291bGQgZ2V0IGludG8gYSBkZWFkbG9jayAqLwogICAgIGlmIChuZXdTdGF0dXMgPT0gQ0FNRVJBX0RFVklDRV9TVEFUVVNfTk9UX1BSRVNFTlQpIHsKLSAgICAgICAgVmVjdG9yPHNwPEJhc2ljQ2xpZW50PiA+IGNsaWVudHNUb0Rpc2Nvbm5lY3Q7CisgICAgICAgIGxvZ0RldmljZVJlbW92ZWQoaWQsIFN0cmluZzg6OmZvcm1hdCgiRGV2aWNlIHN0YXR1cyBjaGFuZ2VkIGZyb20gJWQgdG8gJWQiLCBvbGRTdGF0dXMsCisgICAgICAgICAgICAgICAgbmV3U3RhdHVzKSk7CisgICAgICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnRUb0Rpc2Nvbm5lY3Q7CiAgICAgICAgIHsKLSAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1TZXJ2aWNlTG9jayk7CisgICAgICAgICAgICAvLyBEb24ndCBkbyB0aGlzIGluIHVwZGF0ZVN0YXR1cyB0byBhdm9pZCBkZWFkbG9jayBvdmVyIG1TZXJ2aWNlTG9jaworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKIAotICAgICAgICAgICAvKiBSZW1vdmUgY2FjaGVkIHBhcmFtZXRlcnMgZnJvbSBzaGltIGNhY2hlICovCi0gICAgICAgICAgIG1TaGltUGFyYW1zLnJlbW92ZUl0ZW0oY2FtZXJhSWQpOworICAgICAgICAgICAgLy8gU2V0IHRoZSBkZXZpY2Ugc3RhdHVzIHRvIE5PVF9QUkVTRU5ULCBjbGllbnRzIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gY29ubmVjdAorICAgICAgICAgICAgLy8gdG8gdGhpcyBkZXZpY2UgdW50aWwgdGhlIHN0YXR1cyBjaGFuZ2VzCisgICAgICAgICAgICB1cGRhdGVTdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9QUkVTRU5ULCBpZCk7CiAKLSAgICAgICAgICAgLyogRmluZCBhbGwgY2xpZW50cyB0aGF0IHdlIG5lZWQgdG8gZGlzY29ubmVjdCAqLwotICAgICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50ID0gbUNsaWVudFtjYW1lcmFJZF0ucHJvbW90ZSgpOwotICAgICAgICAgICBpZiAoY2xpZW50LmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgIGNsaWVudHNUb0Rpc2Nvbm5lY3QucHVzaF9iYWNrKGNsaWVudCk7Ci0gICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFJlbW92ZSBjYWNoZWQgc2hpbSBwYXJhbWV0ZXJzCisgICAgICAgICAgICBzdGF0ZS0+c2V0U2hpbVBhcmFtcyhDYW1lcmFQYXJhbWV0ZXJzKCkpOwogCi0gICAgICAgICAgIGludCBpID0gY2FtZXJhSWQ7Ci0gICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbVByb0NsaWVudExpc3RbaV0uc2l6ZSgpOyArK2opIHsKLSAgICAgICAgICAgICAgIHNwPFByb0NsaWVudD4gY2wgPSBtUHJvQ2xpZW50TGlzdFtpXVtqXS5wcm9tb3RlKCk7Ci0gICAgICAgICAgICAgICBpZiAoY2wgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgIGNsaWVudHNUb0Rpc2Nvbm5lY3QucHVzaF9iYWNrKGNsKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBjbGllbnQgZnJvbSB0aGUgbGlzdCBvZiBhY3RpdmUgY2xpZW50cworICAgICAgICAgICAgY2xpZW50VG9EaXNjb25uZWN0ID0gcmVtb3ZlQ2xpZW50TG9ja2VkKGlkKTsKKworICAgICAgICAgICAgLy8gTm90aWZ5IHRoZSBjbGllbnQgb2YgZGlzY29ubmVjdGlvbgorICAgICAgICAgICAgY2xpZW50VG9EaXNjb25uZWN0LT5ub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVELAorICAgICAgICAgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFze30pOwogICAgICAgICB9CiAKLSAgICAgICAgLyogbm93IGRpc2Nvbm5lY3QgdGhlbS4gZG9uJ3QgaG9sZCB0aGUgbG9jawotICAgICAgICAgICBvciB3ZSBjYW4gZ2V0IGludG8gYSBkZWFkbG9jayAqLworICAgICAgICBBTE9HSSgiJXM6IENsaWVudCBmb3IgY2FtZXJhIElEICVzIGV2aWN0ZWQgZHVlIHRvIGRldmljZSBzdGF0dXMgY2hhbmdlIGZyb20gSEFMIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpKTsKIAotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNsaWVudHNUb0Rpc2Nvbm5lY3Quc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnQgPSBjbGllbnRzVG9EaXNjb25uZWN0W2ldOwotCi0gICAgICAgICAgICBjbGllbnQtPmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhlIHJlbW90ZSBhcHAgd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byBjYWxsIG1ldGhvZHMgb24gdGhlCi0gICAgICAgICAgICAgKiBjbGllbnQgc2luY2UgdGhlIGNsaWVudCBQSUQgd2lsbCBiZSByZXNldCB0byAwCi0gICAgICAgICAgICAgKi8KKyAgICAgICAgLy8gRGlzY29ubmVjdCBjbGllbnQKKyAgICAgICAgaWYgKGNsaWVudFRvRGlzY29ubmVjdC5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBFbnN1cmUgbm90IGluIGJpbmRlciBSUEMgc28gY2xpZW50IGRpc2Nvbm5lY3QgUElEIGNoZWNrcyB3b3JrIGNvcnJlY3RseQorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihnZXRDYWxsaW5nUGlkKCkgIT0gZ2V0cGlkKCksCisgICAgICAgICAgICAgICAgICAgICJvbkRldmljZVN0YXR1c0NoYW5nZWQgbXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgY2FtZXJhIHNlcnZpY2UgcHJvY2VzcyEiKTsKKyAgICAgICAgICAgIGNsaWVudFRvRGlzY29ubmVjdC0+ZGlzY29ubmVjdCgpOwogICAgICAgICB9CiAKLSAgICAgICAgQUxPR1YoIiVzOiBBZnRlciB1bnBsdWcsIGRpc2Nvbm5lY3RlZCAlenUgY2xpZW50cyIsCi0gICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2xpZW50c1RvRGlzY29ubmVjdC5zaXplKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChvbGRTdGF0dXMgPT0gSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzOjpTVEFUVVNfTk9UX1BSRVNFTlQpIHsKKyAgICAgICAgICAgIGxvZ0RldmljZUFkZGVkKGlkLCBTdHJpbmc4Ojpmb3JtYXQoIkRldmljZSBzdGF0dXMgY2hhbmdlZCBmcm9tICVkIHRvICVkIiwgb2xkU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICBuZXdTdGF0dXMpKTsKKyAgICAgICAgfQorICAgICAgICB1cGRhdGVTdGF0dXMoc3RhdGljX2Nhc3Q8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzPihuZXdTdGF0dXMpLCBpZCk7CiAgICAgfQogCi0gICAgdXBkYXRlU3RhdHVzKAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzPihuZXdTdGF0dXMpLCBjYW1lcmFJZCk7Ci0KIH0KIAordm9pZCBDYW1lcmFTZXJ2aWNlOjpvblRvcmNoU3RhdHVzQ2hhbmdlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VG9yY2hTdGF0dXMgbmV3U3RhdHVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1Ub3JjaFN0YXR1c011dGV4KTsKKyAgICBvblRvcmNoU3RhdHVzQ2hhbmdlZExvY2tlZChjYW1lcmFJZCwgbmV3U3RhdHVzKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpvblRvcmNoU3RhdHVzQ2hhbmdlZExvY2tlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VG9yY2hTdGF0dXMgbmV3U3RhdHVzKSB7CisgICAgQUxPR0koIiVzOiBUb3JjaCBzdGF0dXMgY2hhbmdlZCBmb3IgY2FtZXJhSWQ9JXMsIG5ld1N0YXR1cz0lZCIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLnN0cmluZygpLCBuZXdTdGF0dXMpOworCisgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VG9yY2hTdGF0dXMgc3RhdHVzOworICAgIHN0YXR1c190IHJlcyA9IGdldFRvcmNoU3RhdHVzTG9ja2VkKGNhbWVyYUlkLCAmc3RhdHVzKTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogY2Fubm90IGdldCB0b3JjaCBzdGF0dXMgb2YgY2FtZXJhICVzOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLnN0cmluZygpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoc3RhdHVzID09IG5ld1N0YXR1cykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmVzID0gc2V0VG9yY2hTdGF0dXNMb2NrZWQoY2FtZXJhSWQsIG5ld1N0YXR1cyk7CisgICAgaWYgKHJlcykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBzZXQgdGhlIHRvcmNoIHN0YXR1cyIsIF9fRlVOQ1RJT05fXywgKHVpbnQzMl90KW5ld1N0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIFVwZGF0ZSBiYXR0ZXJ5IGxpZmUgbG9nZ2luZyBmb3IgZmxhc2hsaWdodAorICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobVRvcmNoVWlkTWFwTXV0ZXgpOworICAgICAgICBhdXRvIGl0ZXIgPSBtVG9yY2hVaWRNYXAuZmluZChjYW1lcmFJZCk7CisgICAgICAgIGlmIChpdGVyICE9IG1Ub3JjaFVpZE1hcC5lbmQoKSkgeworICAgICAgICAgICAgaW50IG9sZFVpZCA9IGl0ZXItPnNlY29uZC5zZWNvbmQ7CisgICAgICAgICAgICBpbnQgbmV3VWlkID0gaXRlci0+c2Vjb25kLmZpcnN0OworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyJiBub3RpZmllcihCYXR0ZXJ5Tm90aWZpZXI6OmdldEluc3RhbmNlKCkpOworICAgICAgICAgICAgaWYgKG9sZFVpZCAhPSBuZXdVaWQpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgVUlEIGhhcyBjaGFuZ2VkLCBsb2cgdGhlIHN0YXR1cyBhbmQgdXBkYXRlIGN1cnJlbnQgVUlEIGluIG1Ub3JjaFVpZE1hcAorICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VE9SQ0hfU1RBVFVTX0FWQUlMQUJMRV9PTikgeworICAgICAgICAgICAgICAgICAgICBub3RpZmllci5ub3RlRmxhc2hsaWdodE9mZihjYW1lcmFJZCwgb2xkVWlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXR1cyA9PSBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpUT1JDSF9TVEFUVVNfQVZBSUxBQkxFX09OKSB7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmaWVyLm5vdGVGbGFzaGxpZ2h0T24oY2FtZXJhSWQsIG5ld1VpZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGl0ZXItPnNlY29uZC5zZWNvbmQgPSBuZXdVaWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBVSUQgaGFzIG5vdCBjaGFuZ2VkLCBsb2cgdGhlIHN0YXR1cworICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0dXMgPT0gSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VE9SQ0hfU1RBVFVTX0FWQUlMQUJMRV9PTikgeworICAgICAgICAgICAgICAgICAgICBub3RpZmllci5ub3RlRmxhc2hsaWdodE9uKGNhbWVyYUlkLCBvbGRVaWQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmaWVyLm5vdGVGbGFzaGxpZ2h0T2ZmKGNhbWVyYUlkLCBvbGRVaWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN0YXR1c0xpc3RlbmVyTG9jayk7CisgICAgICAgIGZvciAoYXV0byYgaSA6IG1MaXN0ZW5lckxpc3QpIHsKKyAgICAgICAgICAgIGktPm9uVG9yY2hTdGF0dXNDaGFuZ2VkKG5ld1N0YXR1cywgU3RyaW5nMTZ7Y2FtZXJhSWR9KTsKKyAgICAgICAgfQorICAgIH0KK30KKwogaW50MzJfdCBDYW1lcmFTZXJ2aWNlOjpnZXROdW1iZXJPZkNhbWVyYXMoKSB7Ci0gICAgcmV0dXJuIG1OdW1iZXJPZkNhbWVyYXM7CisgICAgcmV0dXJuIGdldE51bWJlck9mQ2FtZXJhcyhDQU1FUkFfVFlQRV9CQUNLV0FSRF9DT01QQVRJQkxFKTsKK30KKworaW50MzJfdCBDYW1lcmFTZXJ2aWNlOjpnZXROdW1iZXJPZkNhbWVyYXMoaW50IHR5cGUpIHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBDQU1FUkFfVFlQRV9CQUNLV0FSRF9DT01QQVRJQkxFOgorICAgICAgICAgICAgcmV0dXJuIG1OdW1iZXJPZk5vcm1hbENhbWVyYXM7CisgICAgICAgIGNhc2UgQ0FNRVJBX1RZUEVfQUxMOgorICAgICAgICAgICAgcmV0dXJuIG1OdW1iZXJPZkNhbWVyYXM7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygiJXM6IFVua25vd24gY2FtZXJhIHR5cGUgJWQsIHJldHVybmluZyAwIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0eXBlKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KIH0KIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Z2V0Q2FtZXJhSW5mbyhpbnQgY2FtZXJhSWQsCkBAIC0yMzYsMTIgKzQyNiwyMSBAQAogCiAgICAgc3RydWN0IGNhbWVyYV9pbmZvIGluZm87CiAgICAgc3RhdHVzX3QgcmMgPSBmaWx0ZXJHZXRJbmZvRXJyb3JDb2RlKAotICAgICAgICBtTW9kdWxlLT5nZXRfY2FtZXJhX2luZm8oY2FtZXJhSWQsICZpbmZvKSk7CisgICAgICAgIG1Nb2R1bGUtPmdldENhbWVyYUluZm8oY2FtZXJhSWQsICZpbmZvKSk7CiAgICAgY2FtZXJhSW5mby0+ZmFjaW5nID0gaW5mby5mYWNpbmc7CiAgICAgY2FtZXJhSW5mby0+b3JpZW50YXRpb24gPSBpbmZvLm9yaWVudGF0aW9uOwogICAgIHJldHVybiByYzsKIH0KIAoraW50IENhbWVyYVNlcnZpY2U6OmNhbWVyYUlkVG9JbnQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpIHsKKyAgICBlcnJubyA9IDA7CisgICAgc2l6ZV90IHBvcyA9IDA7CisgICAgaW50IHJldCA9IHN0b2koc3RkOjpzdHJpbmd7Y2FtZXJhSWQuc3RyaW5nKCl9LCAmcG9zKTsKKyAgICBpZiAoZXJybm8gIT0gMCB8fCBwb3MgIT0gY2FtZXJhSWQuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Z2VuZXJhdGVTaGltTWV0YWRhdGEoaW50IGNhbWVyYUlkLCAvKm91dCovQ2FtZXJhTWV0YWRhdGEqIGNhbWVyYUluZm8pIHsKICAgICBzdGF0dXNfdCByZXQgPSBPSzsKQEAgLTM0Nyw3ICs1NDYsNyBAQAogCiAgICAgaW50IGZhY2luZzsKICAgICBzdGF0dXNfdCByZXQgPSBPSzsKLSAgICBpZiAobU1vZHVsZS0+Y29tbW9uLm1vZHVsZV9hcGlfdmVyc2lvbiA8IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl8wIHx8CisgICAgaWYgKG1Nb2R1bGUtPmdldE1vZHVsZUFwaVZlcnNpb24oKSA8IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl8wIHx8CiAgICAgICAgICAgICBnZXREZXZpY2VWZXJzaW9uKGNhbWVyYUlkLCAmZmFjaW5nKSA8PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMSApIHsKICAgICAgICAgLyoqCiAgICAgICAgICAqIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG1vZGUgZm9yIG9sZCBIQUxzOgpAQCAtMzY4LDEzICs1NjcsMzkgQEAKICAgICAgICAgICogTm9ybWFsIEhBTCAyLjErIGNvZGVwYXRoLgogICAgICAgICAgKi8KICAgICAgICAgc3RydWN0IGNhbWVyYV9pbmZvIGluZm87Ci0gICAgICAgIHJldCA9IGZpbHRlckdldEluZm9FcnJvckNvZGUobU1vZHVsZS0+Z2V0X2NhbWVyYV9pbmZvKGNhbWVyYUlkLCAmaW5mbykpOworICAgICAgICByZXQgPSBmaWx0ZXJHZXRJbmZvRXJyb3JDb2RlKG1Nb2R1bGUtPmdldENhbWVyYUluZm8oY2FtZXJhSWQsICZpbmZvKSk7CiAgICAgICAgICpjYW1lcmFJbmZvID0gaW5mby5zdGF0aWNfY2FtZXJhX2NoYXJhY3RlcmlzdGljczsKICAgICB9CiAKICAgICByZXR1cm4gcmV0OwogfQogCitpbnQgQ2FtZXJhU2VydmljZTo6Z2V0Q2FsbGluZ1BpZCgpIHsKKyAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworfQorCitpbnQgQ2FtZXJhU2VydmljZTo6Z2V0Q2FsbGluZ1VpZCgpIHsKKyAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworfQorCitTdHJpbmc4IENhbWVyYVNlcnZpY2U6OmdldEZvcm1hdHRlZEN1cnJlbnRUaW1lKCkgeworICAgIHRpbWVfdCBub3cgPSB0aW1lKG51bGxwdHIpOworICAgIGNoYXIgZm9ybWF0dGVkVGltZVs2NF07CisgICAgc3RyZnRpbWUoZm9ybWF0dGVkVGltZSwgc2l6ZW9mKGZvcm1hdHRlZFRpbWUpLCAiJW0tJWQgJUg6JU06JVMiLCBsb2NhbHRpbWUoJm5vdykpOworICAgIHJldHVybiBTdHJpbmc4KGZvcm1hdHRlZFRpbWUpOworfQorCitpbnQgQ2FtZXJhU2VydmljZTo6Z2V0Q2FtZXJhUHJpb3JpdHlGcm9tUHJvY1N0YXRlKGludCBwcm9jU3RhdGUpIHsKKyAgICAvLyBGaW5kIHRoZSBwcmlvcml0eSBmb3IgdGhlIGNhbWVyYSB1c2FnZSBiYXNlZCBvbiB0aGUgcHJvY2VzcyBzdGF0ZS4gIEhpZ2hlciBwcmlvcml0eSBjbGllbnRzCisgICAgLy8gd2luIGZvciBldmljdGlvbnMuCisgICAgaWYgKHByb2NTdGF0ZSA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBSZWNlaXZlZCBpbnZhbGlkIHByb2Nlc3Mgc3RhdGUgJWQgZnJvbSBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlISIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBwcm9jU3RhdGUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBJTlRfTUFYIC0gcHJvY1N0YXRlOworfQorCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpnZXRDYW1lcmFWZW5kb3JUYWdEZXNjcmlwdG9yKC8qb3V0Ki9zcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzYykgewogICAgIGlmICghbU1vZHVsZSkgewogICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBoYXJkd2FyZSBtb2R1bGUgZG9lc24ndCBleGlzdCIsIF9fRlVOQ1RJT05fXyk7CkBAIC0zODcsMTIgKzYxMiwxMiBAQAogCiBpbnQgQ2FtZXJhU2VydmljZTo6Z2V0RGV2aWNlVmVyc2lvbihpbnQgY2FtZXJhSWQsIGludCogZmFjaW5nKSB7CiAgICAgc3RydWN0IGNhbWVyYV9pbmZvIGluZm87Ci0gICAgaWYgKG1Nb2R1bGUtPmdldF9jYW1lcmFfaW5mbyhjYW1lcmFJZCwgJmluZm8pICE9IE9LKSB7CisgICAgaWYgKG1Nb2R1bGUtPmdldENhbWVyYUluZm8oY2FtZXJhSWQsICZpbmZvKSAhPSBPSykgewogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCiAgICAgaW50IGRldmljZVZlcnNpb247Ci0gICAgaWYgKG1Nb2R1bGUtPmNvbW1vbi5tb2R1bGVfYXBpX3ZlcnNpb24gPj0gQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzApIHsKKyAgICBpZiAobU1vZHVsZS0+Z2V0TW9kdWxlQXBpVmVyc2lvbigpID49IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl8wKSB7CiAgICAgICAgIGRldmljZVZlcnNpb24gPSBpbmZvLmRldmljZV92ZXJzaW9uOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGRldmljZVZlcnNpb24gPSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDsKQEAgLTQwNSwxOSArNjMwLDYgQEAKICAgICByZXR1cm4gZGV2aWNlVmVyc2lvbjsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6ZmlsdGVyT3BlbkVycm9yQ29kZShzdGF0dXNfdCBlcnIpIHsKLSAgICBzd2l0Y2goZXJyKSB7Ci0gICAgICAgIGNhc2UgTk9fRVJST1I6Ci0gICAgICAgIGNhc2UgLUVCVVNZOgotICAgICAgICBjYXNlIC1FSU5WQUw6Ci0gICAgICAgIGNhc2UgLUVVU0VSUzoKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIC1FTk9ERVY7Ci19Ci0KIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmZpbHRlckdldEluZm9FcnJvckNvZGUoc3RhdHVzX3QgZXJyKSB7CiAgICAgc3dpdGNoKGVycikgewogICAgICAgICBjYXNlIE5PX0VSUk9SOgpAQCAtNDMzLDEzICs2NDUsMTMgQEAKICAgICB2ZW5kb3JfdGFnX29wc190IHZPcHMgPSB2ZW5kb3JfdGFnX29wc190KCk7CiAKICAgICAvLyBDaGVjayBpZiB2ZW5kb3Igb3BlcmF0aW9ucyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQKLSAgICBpZiAobU1vZHVsZS0+Z2V0X3ZlbmRvcl90YWdfb3BzID09IE5VTEwpIHsKKyAgICBpZiAoIW1Nb2R1bGUtPmlzVmVuZG9yVGFnRGVmaW5lZCgpKSB7CiAgICAgICAgIEFMT0dJKCIlczogTm8gdmVuZG9yIHRhZ3MgZGVmaW5lZCBmb3IgdGhpcyBkZXZpY2UuIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIEFUUkFDRV9CRUdJTigiY2FtZXJhMy0+Z2V0X21ldGFkYXRhX3ZlbmRvcl90YWdfb3BzIik7Ci0gICAgbU1vZHVsZS0+Z2V0X3ZlbmRvcl90YWdfb3BzKCZ2T3BzKTsKKyAgICBtTW9kdWxlLT5nZXRWZW5kb3JUYWdPcHMoJnZPcHMpOwogICAgIEFUUkFDRV9FTkQoKTsKIAogICAgIC8vIEVuc3VyZSBhbGwgdmVuZG9yIG9wZXJhdGlvbnMgYXJlIHByZXNlbnQKQEAgLTQ2Nyw1NCArNjc5LDEwNCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjppbml0aWFsaXplU2hpbU1ldGFkYXRhKGludCBjYW1lcmFJZCkgewotICAgIGludCBwaWQgPSBnZXRDYWxsaW5nUGlkKCk7Ci0gICAgaW50IHVpZCA9IGdldENhbGxpbmdVaWQoKTsKLSAgICBzdGF0dXNfdCByZXQgPSB2YWxpZGF0ZUNvbm5lY3QoY2FtZXJhSWQsIHVpZCk7Ci0gICAgaWYgKHJldCAhPSBPSykgewotICAgICAgICAvLyBFcnJvciBhbHJlYWR5IGxvZ2dlZCBieSBjYWxsZWUKLSAgICAgICAgcmV0dXJuIHJldDsKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6Om1ha2VDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCisgICAgICAgIGNvbnN0IHNwPElJbnRlcmZhY2U+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nMTYmIHBhY2thZ2VOYW1lLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgaW50IGZhY2luZywgaW50IGNsaWVudFBpZCwgdWlkX3QgY2xpZW50VWlkLCBpbnQgc2VydmljZVBpZCwgYm9vbCBsZWdhY3lNb2RlLAorICAgICAgICBpbnQgaGFsVmVyc2lvbiwgaW50IGRldmljZVZlcnNpb24sIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLAorICAgICAgICAvKm91dCovc3A8QmFzaWNDbGllbnQ+KiBjbGllbnQpIHsKKworICAgIC8vIFRPRE86IFVwZGF0ZSBDYW1lcmFDbGllbnRzICsgSEFMIGludGVyZmFjZSB0byB1c2Ugc3RyaW5ncyBmb3IgQ2FtZXJhIElEcworICAgIGludCBpZCA9IGNhbWVyYUlkVG9JbnQoY2FtZXJhSWQpOworICAgIGlmIChpZCA9PSAtMSkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgY2FtZXJhIElEICVzLCBjYW5ub3QgY29udmVydCB0byBpbnRlZ2VyLiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgYm9vbCBuZWVkc05ld0NsaWVudCA9IGZhbHNlOwotICAgIHNwPENsaWVudD4gY2xpZW50OworICAgIGlmIChoYWxWZXJzaW9uIDwgMCB8fCBoYWxWZXJzaW9uID09IGRldmljZVZlcnNpb24pIHsKKyAgICAgICAgLy8gRGVmYXVsdCBwYXRoOiBIQUwgdmVyc2lvbiBpcyB1bnNwZWNpZmllZCBieSBjYWxsZXIsIGNyZWF0ZSBDYW1lcmFDbGllbnQKKyAgICAgICAgLy8gYmFzZWQgb24gZGV2aWNlIHZlcnNpb24gcmVwb3J0ZWQgYnkgdGhlIEhBTC4KKyAgICAgICAgc3dpdGNoKGRldmljZVZlcnNpb24pIHsKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOgorICAgICAgICAgICAgaWYgKGVmZmVjdGl2ZUFwaUxldmVsID09IEFQSV8xKSB7ICAvLyBDYW1lcmExIEFQSSByb3V0ZQorICAgICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+IHRtcCA9IHN0YXRpY19jYXN0PElDYW1lcmFDbGllbnQqPihjYW1lcmFDYi5nZXQoKSk7CisgICAgICAgICAgICAgICAgKmNsaWVudCA9IG5ldyBDYW1lcmFDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwgaWQsIGZhY2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBDYW1lcmEyIEFQSSByb3V0ZQorICAgICAgICAgICAgICAgIEFMT0dXKCJDYW1lcmEgdXNpbmcgb2xkIEhBTCB2ZXJzaW9uOiAlZCIsIGRldmljZVZlcnNpb24pOworICAgICAgICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzA6CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMToKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgorICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18zOgorICAgICAgICAgICAgaWYgKGVmZmVjdGl2ZUFwaUxldmVsID09IEFQSV8xKSB7IC8vIENhbWVyYTEgQVBJIHJvdXRlCisgICAgICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD4gdG1wID0gc3RhdGljX2Nhc3Q8SUNhbWVyYUNsaWVudCo+KGNhbWVyYUNiLmdldCgpKTsKKyAgICAgICAgICAgICAgICAqY2xpZW50ID0gbmV3IENhbWVyYTJDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwgaWQsIGZhY2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkLCBsZWdhY3lNb2RlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIENhbWVyYTIgQVBJIHJvdXRlCisgICAgICAgICAgICAgICAgc3A8SUNhbWVyYURldmljZUNhbGxiYWNrcz4gdG1wID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PElDYW1lcmFEZXZpY2VDYWxsYmFja3MqPihjYW1lcmFDYi5nZXQoKSk7CisgICAgICAgICAgICAgICAgKmNsaWVudCA9IG5ldyBDYW1lcmFEZXZpY2VDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICBmYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBTaG91bGQgbm90IGJlIHJlYWNoYWJsZQorICAgICAgICAgICAgQUxPR0UoIlVua25vd24gY2FtZXJhIGRldmljZSBIQUwgdmVyc2lvbjogJWQiLCBkZXZpY2VWZXJzaW9uKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEEgcGFydGljdWxhciBIQUwgdmVyc2lvbiBpcyByZXF1ZXN0ZWQgYnkgY2FsbGVyLiBDcmVhdGUgQ2FtZXJhQ2xpZW50CisgICAgICAgIC8vIGJhc2VkIG9uIHRoZSByZXF1ZXN0ZWQgSEFMIHZlcnNpb24uCisgICAgICAgIGlmIChkZXZpY2VWZXJzaW9uID4gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzAgJiYKKyAgICAgICAgICAgIGhhbFZlcnNpb24gPT0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzApIHsKKyAgICAgICAgICAgIC8vIE9ubHkgc3VwcG9ydCBoaWdoZXIgSEFMIHZlcnNpb24gZGV2aWNlIG9wZW5lZCBhcyBIQUwxLjAgZGV2aWNlLgorICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD4gdG1wID0gc3RhdGljX2Nhc3Q8SUNhbWVyYUNsaWVudCo+KGNhbWVyYUNiLmdldCgpKTsKKyAgICAgICAgICAgICpjbGllbnQgPSBuZXcgQ2FtZXJhQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHRtcCwgcGFja2FnZU5hbWUsIGlkLCBmYWNpbmcsCisgICAgICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkLCBsZWdhY3lNb2RlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE90aGVyIGNvbWJpbmF0aW9ucyAoZS5nLiBIQUwzLnggb3BlbiBhcyBIQUwyLngpIGFyZSBub3Qgc3VwcG9ydGVkIHlldC4KKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGNhbWVyYSBIQUwgdmVyc2lvbiAleDogSEFMICV4IGRldmljZSBjYW4gb25seSBiZSIKKyAgICAgICAgICAgICAgICAgICAgIiBvcGVuZWQgYXMgSEFMICV4IGRldmljZSIsIGhhbFZlcnNpb24sIGRldmljZVZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK1N0cmluZzggQ2FtZXJhU2VydmljZTo6dG9TdHJpbmcoc3RkOjpzZXQ8dXNlcmlkX3Q+IGludFNldCkgeworICAgIFN0cmluZzggcygiIik7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yICh1c2VyaWRfdCBpIDogaW50U2V0KSB7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgcy5hcHBlbmRGb3JtYXQoIiVkIiwgaSk7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcy5hcHBlbmRGb3JtYXQoIiwgJWQiLCBpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gczsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6aW5pdGlhbGl6ZVNoaW1NZXRhZGF0YShpbnQgY2FtZXJhSWQpIHsKKyAgICBpbnQgdWlkID0gZ2V0Q2FsbGluZ1VpZCgpOwogCiAgICAgU3RyaW5nMTYgaW50ZXJuYWxQYWNrYWdlTmFtZSgibWVkaWEiKTsKLSAgICB7ICAgLy8gU2NvcGUgZm9yIHNlcnZpY2UgbG9jawotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOwotICAgICAgICBpZiAobUNsaWVudFtjYW1lcmFJZF0gIT0gTlVMTCkgewotICAgICAgICAgICAgY2xpZW50ID0gc3RhdGljX2Nhc3Q8Q2xpZW50Kj4obUNsaWVudFtjYW1lcmFJZF0ucHJvbW90ZSgpLmdldCgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2xpZW50ID09IE5VTEwpIHsKLSAgICAgICAgICAgIG5lZWRzTmV3Q2xpZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldCA9IGNvbm5lY3RIZWxwZXJMb2NrZWQoLypvdXQqL2NsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjYW1lcmFDbGllbnQqL05VTEwsIC8vIEVtcHR5IGJpbmRlciBjYWxsYmFja3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsUGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkKTsKLQotICAgICAgICAgICAgaWYgKHJldCAhPSBPSykgewotICAgICAgICAgICAgICAgIC8vIEVycm9yIGFscmVhZHkgbG9nZ2VkIGJ5IGNhbGxlZQotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2xpZW50ID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGNvbm5lY3QgdG8gY2xpZW50IGNhbWVyYSBkZXZpY2UuIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmc4IHJhd1BhcmFtcyA9IGNsaWVudC0+Z2V0UGFyYW1ldGVycygpOwotICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzIHBhcmFtcyhyYXdQYXJhbXMpOwotICAgICAgICBtU2hpbVBhcmFtcy5hZGQoY2FtZXJhSWQsIHBhcmFtcyk7CisgICAgU3RyaW5nOCBpZCA9IFN0cmluZzg6OmZvcm1hdCgiJWQiLCBjYW1lcmFJZCk7CisgICAgc3RhdHVzX3QgcmV0ID0gTk9fRVJST1I7CisgICAgc3A8Q2xpZW50PiB0bXAgPSBudWxscHRyOworICAgIGlmICgocmV0ID0gY29ubmVjdEhlbHBlcjxJQ2FtZXJhQ2xpZW50LENsaWVudD4oc3A8SUNhbWVyYUNsaWVudD57bnVsbHB0cn0sIGlkLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVEKSwgaW50ZXJuYWxQYWNrYWdlTmFtZSwgdWlkLCBBUElfMSwKKyAgICAgICAgICAgIGZhbHNlLCB0cnVlLCB0bXApKSAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yICVkICglcykgaW5pdGlhbGl6aW5nIHNoaW0gbWV0YWRhdGEuIiwgX19GVU5DVElPTl9fLCByZXQsIHN0cmVycm9yKHJldCkpOworICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KLQotICAgIC8vIENsb3NlIGNsaWVudCBpZiBvbmUgd2FzIG9wZW5lZCBzb2xlbHkgZm9yIHRoaXMgY2FsbAotICAgIGlmIChuZWVkc05ld0NsaWVudCkgewotICAgICAgICBjbGllbnQtPmRpc2Nvbm5lY3QoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Z2V0TGVnYWN5UGFyYW1ldGVyc0xhenkoaW50IGNhbWVyYUlkLApAQCAtNTMwLDQyICs3OTIsNTUgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBzc2l6ZV90IGluZGV4ID0gLTE7Ci0gICAgeyAgIC8vIFNjb3BlIGZvciBzZXJ2aWNlIGxvY2sKKyAgICBTdHJpbmc4IGlkID0gU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGNhbWVyYUlkKTsKKworICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBwYXJhbWV0ZXJzCisgICAgeworICAgICAgICAvLyBTY29wZSBmb3Igc2VydmljZSBsb2NrCiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7Ci0gICAgICAgIGluZGV4ID0gbVNoaW1QYXJhbXMuaW5kZXhPZktleShjYW1lcmFJZCk7Ci0gICAgICAgIC8vIFJlbGVhc2Ugc2VydmljZSBsb2NrIHNvIGluaXRpYWxpemVTaGltTWV0YWRhdGEgY2FuIGJlIGNhbGxlZCBjb3JyZWN0bHkuCi0KLSAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICpwYXJhbWV0ZXJzID0gbVNoaW1QYXJhbXNbaW5kZXhdOworICAgICAgICBhdXRvIGNhbWVyYVN0YXRlID0gZ2V0Q2FtZXJhU3RhdGUoaWQpOworICAgICAgICBpZiAoY2FtZXJhU3RhdGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNhbWVyYSBJRDogJXMiLCBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgQ2FtZXJhUGFyYW1ldGVycyBwID0gY2FtZXJhU3RhdGUtPmdldFNoaW1QYXJhbXMoKTsKKyAgICAgICAgaWYgKCFwLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgKnBhcmFtZXRlcnMgPSBwOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgcmV0ID0gaW5pdGlhbGl6ZVNoaW1NZXRhZGF0YShjYW1lcmFJZCk7Ci0gICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwotICAgICAgICBpZiAocmV0ICE9IE9LKSB7Ci0gICAgICAgICAgICAvLyBFcnJvciBhbHJlYWR5IGxvZ2dlZCBieSBjYWxsZWUKLSAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgcmV0ID0gaW5pdGlhbGl6ZVNoaW1NZXRhZGF0YShjYW1lcmFJZCk7CisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICAvLyBFcnJvciBhbHJlYWR5IGxvZ2dlZCBieSBjYWxsZWUKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvLyBDaGVjayBmb3IgcGFyYW1ldGVycyBhZ2FpbgorICAgIHsKKyAgICAgICAgLy8gU2NvcGUgZm9yIHNlcnZpY2UgbG9jaworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOworICAgICAgICBhdXRvIGNhbWVyYVN0YXRlID0gZ2V0Q2FtZXJhU3RhdGUoaWQpOworICAgICAgICBpZiAoY2FtZXJhU3RhdGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNhbWVyYSBJRDogJXMiLCBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLQotICAgICAgICB7ICAgLy8gU2NvcGUgZm9yIHNlcnZpY2UgbG9jawotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKLSAgICAgICAgICAgIGluZGV4ID0gbVNoaW1QYXJhbXMuaW5kZXhPZktleShjYW1lcmFJZCk7Ci0KLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaW5kZXggPCAwLCAiaW5kZXggc2hvdWxkIGhhdmUgYmVlbiBpbml0aWFsaXplZCIpOwotCi0gICAgICAgICAgICAqcGFyYW1ldGVycyA9IG1TaGltUGFyYW1zW2luZGV4XTsKKyAgICAgICAgQ2FtZXJhUGFyYW1ldGVycyBwID0gY2FtZXJhU3RhdGUtPmdldFNoaW1QYXJhbXMoKTsKKyAgICAgICAgaWYgKCFwLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgKnBhcmFtZXRlcnMgPSBwOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIEFMT0dFKCIlczogUGFyYW1ldGVycyB3ZXJlIG5vdCBpbml0aWFsaXplZCwgb3Igd2VyZSBlbXB0eS4gIERldmljZSBtYXkgbm90IGJlIHByZXNlbnQuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjp2YWxpZGF0ZUNvbm5lY3QoaW50IGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppbm91dCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGNsaWVudFVpZCkgY29uc3Qgeworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6dmFsaWRhdGVDb25uZWN0TG9ja2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCAvKmlub3V0Ki9pbnQmIGNsaWVudFVpZCkKKyAgICAgICAgY29uc3QgewogCiAgICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CiAKQEAgLTU3NCwxNjAgKzg0OSwyNzggQEAKICAgICB9IGVsc2UgewogICAgICAgICAvLyBXZSBvbmx5IHRydXN0IG91ciBvd24gcHJvY2VzcyB0byBmb3J3YXJkIGNsaWVudCBVSURzCiAgICAgICAgIGlmIChjYWxsaW5nUGlkICE9IGdldHBpZCgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChwaWQgJWQpIHJlamVjdGVkIChkb24ndCB0cnVzdCBjbGllbnRVaWQpIiwKLSAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCk7CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIHJlamVjdGVkIChkb24ndCB0cnVzdCBjbGllbnRVaWQgJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCwgY2xpZW50VWlkKTsKICAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgfQogICAgIH0KIAogICAgIGlmICghbU1vZHVsZSkgewotICAgICAgICBBTE9HRSgiQ2FtZXJhIEhBTCBtb2R1bGUgbm90IGxvYWRlZCIpOworICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIHJlamVjdGVkIChjYW1lcmEgSEFMIG1vZHVsZSBub3QgbG9hZGVkKSIsCisgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCk7CiAgICAgICAgIHJldHVybiAtRU5PREVWOwogICAgIH0KIAotICAgIGlmIChjYW1lcmFJZCA8IDAgfHwgY2FtZXJhSWQgPj0gbU51bWJlck9mQ2FtZXJhcykgewotICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChwaWQgJWQpIHJlamVjdGVkIChpbnZhbGlkIGNhbWVyYUlkICVkKS4iLAotICAgICAgICAgICAgY2FsbGluZ1BpZCwgY2FtZXJhSWQpOworICAgIGlmIChnZXRDYW1lcmFTdGF0ZShjYW1lcmFJZCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIHJlamVjdGVkIChpbnZhbGlkIGNhbWVyYSBJRCAlcykiLCBjYWxsaW5nUGlkLAorICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CiAgICAgfQogCisgICAgLy8gQ2hlY2sgZGV2aWNlIHBvbGljeSBmb3IgdGhpcyBjYW1lcmEKICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgcHJvcGVydHlfZ2V0KCJzeXMuc2VjcG9saWN5LmNhbWVyYS5kaXNhYmxlZCIsIHZhbHVlLCAiMCIpOworICAgIGNoYXIga2V5W1BST1BFUlRZX0tFWV9NQVhdOworICAgIHVzZXJpZF90IGNsaWVudFVzZXJJZCA9IG11bHRpdXNlcl9nZXRfdXNlcl9pZChjbGllbnRVaWQpOworICAgIHNucHJpbnRmKGtleSwgUFJPUEVSVFlfS0VZX01BWCwgInN5cy5zZWNwb2xpY3kuY2FtZXJhLm9mZl8lZCIsIGNsaWVudFVzZXJJZCk7CisgICAgcHJvcGVydHlfZ2V0KGtleSwgdmFsdWUsICIwIik7CiAgICAgaWYgKHN0cmNtcCh2YWx1ZSwgIjEiKSA9PSAwKSB7CiAgICAgICAgIC8vIENhbWVyYSBpcyBkaXNhYmxlZCBieSBEZXZpY2VQb2xpY3lNYW5hZ2VyLgotICAgICAgICBBTE9HSSgiQ2FtZXJhIGlzIGRpc2FibGVkLiBjb25uZWN0IFggKHBpZCAlZCkgcmVqZWN0ZWQiLCBjYWxsaW5nUGlkKTsKKyAgICAgICAgQUxPR0UoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAoUElEICVkKSByZWplY3RlZCAoY2FtZXJhICVzIGlzIGRpc2FibGVkIGJ5IGRldmljZSAiCisgICAgICAgICAgICAgICAgInBvbGljeSkiLCBjYWxsaW5nUGlkLCBjYW1lcmFJZC5zdHJpbmcoKSk7CiAgICAgICAgIHJldHVybiAtRUFDQ0VTOwogICAgIH0KIAotICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlN0YXR1cyBjdXJyZW50U3RhdHVzID0gZ2V0U3RhdHVzKGNhbWVyYUlkKTsKKyAgICAvLyBPbmx5IGFsbG93IGNsaWVudHMgd2hvIGFyZSBiZWluZyB1c2VkIGJ5IHRoZSBjdXJyZW50IGZvcmVncm91bmQgZGV2aWNlIHVzZXIsIHVubGVzcyBjYWxsaW5nCisgICAgLy8gZnJvbSBvdXIgb3duIHByb2Nlc3MuCisgICAgaWYgKGNhbGxpbmdQaWQgIT0gZ2V0cGlkKCkgJiYgKG1BbGxvd2VkVXNlcnMuZmluZChjbGllbnRVc2VySWQpID09IG1BbGxvd2VkVXNlcnMuZW5kKCkpKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKFBJRCAlZCkgcmVqZWN0ZWQgKGNhbm5vdCBjb25uZWN0IGZyb20gIgorICAgICAgICAgICAgICAgICJkZXZpY2UgdXNlciAlZCwgY3VycmVudGx5IGFsbG93ZWQgZGV2aWNlIHVzZXJzOiAlcykiLCBjYWxsaW5nUGlkLCBjbGllbnRVc2VySWQsCisgICAgICAgICAgICAgICAgdG9TdHJpbmcobUFsbG93ZWRVc2Vycykuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgcmV0dXJuIGNoZWNrSWZEZXZpY2VJc1VzYWJsZShjYW1lcmFJZCk7Cit9CisKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmNoZWNrSWZEZXZpY2VJc1VzYWJsZShjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCkgY29uc3QgeworICAgIGF1dG8gY2FtZXJhU3RhdGUgPSBnZXRDYW1lcmFTdGF0ZShjYW1lcmFJZCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaWYgKGNhbWVyYVN0YXRlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAoUElEICVkKSByZWplY3RlZCAoaW52YWxpZCBjYW1lcmEgSUQgJXMpIiwgY2FsbGluZ1BpZCwKKyAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKworICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlN0YXR1cyBjdXJyZW50U3RhdHVzID0gY2FtZXJhU3RhdGUtPmdldFN0YXR1cygpOwogICAgIGlmIChjdXJyZW50U3RhdHVzID09IElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19OT1RfUFJFU0VOVCkgewotICAgICAgICBBTE9HSSgiQ2FtZXJhIGlzIG5vdCBwbHVnZ2VkIGluLCIKLSAgICAgICAgICAgICAgICIgY29ubmVjdCBYIChwaWQgJWQpIHJlamVjdGVkIiwgY2FsbGluZ1BpZCk7CisgICAgICAgIEFMT0dFKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKFBJRCAlZCkgcmVqZWN0ZWQgKGNhbWVyYSAlcyBpcyBub3QgY29ubmVjdGVkKSIsCisgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCwgY2FtZXJhSWQuc3RyaW5nKCkpOwogICAgICAgICByZXR1cm4gLUVOT0RFVjsKICAgICB9IGVsc2UgaWYgKGN1cnJlbnRTdGF0dXMgPT0gSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX0VOVU1FUkFUSU5HKSB7Ci0gICAgICAgIEFMT0dJKCJDYW1lcmEgaXMgZW51bWVyYXRpbmcsIgotICAgICAgICAgICAgICAgIiBjb25uZWN0IFggKHBpZCAlZCkgcmVqZWN0ZWQiLCBjYWxsaW5nUGlkKTsKKyAgICAgICAgQUxPR0UoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAoUElEICVkKSByZWplY3RlZCwgKGNhbWVyYSAlcyBpcyBpbml0aWFsaXppbmcpIiwKKyAgICAgICAgICAgICAgICBjYWxsaW5nUGlkLCBjYW1lcmFJZC5zdHJpbmcoKSk7CiAgICAgICAgIHJldHVybiAtRUJVU1k7CiAgICAgfQotICAgIC8vIEVsc2UgZG9uJ3QgY2hlY2sgZm9yIFNUQVRVU19OT1RfQVZBSUxBQkxFLgotICAgIC8vICAtLSBJdCdzIGRvbmUgaW1wbGljaXRseSBpbiBjYW5Db25uZWN0VW5zYWZlIC93IHRoZSBtQnVzeSBhcnJheQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotYm9vbCBDYW1lcmFTZXJ2aWNlOjpjYW5Db25uZWN0VW5zYWZlKGludCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIHJlbW90ZUNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiAmY2xpZW50KSB7Ci0gICAgU3RyaW5nOCBjbGllbnROYW1lOChjbGllbnRQYWNrYWdlTmFtZSk7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7Cit2b2lkIENhbWVyYVNlcnZpY2U6OmZpbmlzaENvbm5lY3RMb2NrZWQoY29uc3Qgc3A8QmFzaWNDbGllbnQ+JiBjbGllbnQsCisgICAgICAgIGNvbnN0IENhbWVyYVNlcnZpY2U6OkRlc2NyaXB0b3JQdHImIGRlc2MpIHsKIAotICAgIGlmIChtQ2xpZW50W2NhbWVyYUlkXSAhPSAwKSB7Ci0gICAgICAgIGNsaWVudCA9IG1DbGllbnRbY2FtZXJhSWRdLnByb21vdGUoKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAocmVtb3RlQ2FsbGJhY2sgPT0gY2xpZW50LT5nZXRSZW1vdGUoKSkgewotICAgICAgICAgICAgICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAocGlkICVkKSAodGhlIHNhbWUgY2xpZW50KSIsCi0gICAgICAgICAgICAgICAgICAgICBjYWxsaW5nUGlkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ET1NDOiBuZWVkIHRvIHN1cHBvcnQgMSByZWd1bGFyIGNsaWVudCwKLSAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSBzaGFyZWQgY2xpZW50cyBoZXJlCi0gICAgICAgICAgICAgICAgQUxPR1coIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAocGlkICVkKSByZWplY3RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAiIChleGlzdGluZyBjbGllbnQpLiIsIGNhbGxpbmdQaWQpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBNYWtlIGEgZGVzY3JpcHRvciBmb3IgdGhlIGluY29taW5nIGNsaWVudAorICAgIGF1dG8gY2xpZW50RGVzY3JpcHRvciA9IENhbWVyYVNlcnZpY2U6OkNhbWVyYUNsaWVudE1hbmFnZXI6Om1ha2VDbGllbnREZXNjcmlwdG9yKGNsaWVudCwgZGVzYyk7CisgICAgYXV0byBldmljdGVkID0gbUFjdGl2ZUNsaWVudE1hbmFnZXIuYWRkQW5kRXZpY3QoY2xpZW50RGVzY3JpcHRvcik7CisKKyAgICBsb2dDb25uZWN0ZWQoZGVzYy0+Z2V0S2V5KCksIHN0YXRpY19jYXN0PGludD4oZGVzYy0+Z2V0T3duZXJJZCgpKSwKKyAgICAgICAgICAgIFN0cmluZzgoY2xpZW50LT5nZXRQYWNrYWdlTmFtZSgpKSk7CisKKyAgICBpZiAoZXZpY3RlZC5zaXplKCkgPiAwKSB7CisgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAtIGNsaWVudHMgc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIHJlbW92ZWQgaW4gZGlzY29ubmVjdAorICAgICAgICBmb3IgKGF1dG8mIGkgOiBldmljdGVkKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgc3RhdGU6IENsaWVudCBmb3IgY2FtZXJhICVzIHdhcyBub3QgcmVtb3ZlZCBpbiBkaXNjb25uZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpLT5nZXRLZXkoKS5zdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlczogSW52YWxpZCBzdGF0ZSBmb3IgQ2FtZXJhU2VydmljZSwgY2xpZW50cyBub3QgZXZpY3RlZCBwcm9wZXJseSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICB9Cit9CisKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmhhbmRsZUV2aWN0aW9uc0xvY2tlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50IGNsaWVudFBpZCwKKyAgICAgICAgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGNvbnN0IHNwPElCaW5kZXI+JiByZW1vdGVDYWxsYmFjaywgY29uc3QgU3RyaW5nOCYgcGFja2FnZU5hbWUsCisgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgc3A8QmFzaWNDbGllbnQ+KiBjbGllbnQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxyZXNvdXJjZV9wb2xpY3k6OkNsaWVudERlc2NyaXB0b3I8U3RyaW5nOCwgc3A8QmFzaWNDbGllbnQ+Pj4qIHBhcnRpYWwpIHsKKworICAgIHN0YXR1c190IHJldCA9IE5PX0VSUk9SOworICAgIHN0ZDo6dmVjdG9yPERlc2NyaXB0b3JQdHI+IGV2aWN0ZWRDbGllbnRzOworICAgIERlc2NyaXB0b3JQdHIgY2xpZW50RGVzY3JpcHRvcjsKKyAgICB7CisgICAgICAgIGlmIChlZmZlY3RpdmVBcGlMZXZlbCA9PSBBUElfMSkgeworICAgICAgICAgICAgLy8gSWYgd2UgYXJlIHVzaW5nIEFQSTEsIGFueSBleGlzdGluZyBjbGllbnQgZm9yIHRoaXMgY2FtZXJhIElEIHdpdGggdGhlIHNhbWUgcmVtb3RlCisgICAgICAgICAgICAvLyBzaG91bGQgYmUgcmV0dXJuZWQgcmF0aGVyIHRoYW4gZXZpY3RlZCB0byBhbGxvdyBNZWRpYVJlY29yZGVyIHRvIHdvcmsgcHJvcGVybHkuCisKKyAgICAgICAgICAgIGF1dG8gY3VycmVudCA9IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldChjYW1lcmFJZCk7CisgICAgICAgICAgICBpZiAoY3VycmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgYXV0byBjbGllbnRTcCA9IGN1cnJlbnQtPmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKGNsaWVudFNwLmdldCgpICE9IG51bGxwdHIpIHsgLy8gc2hvdWxkIG5ldmVyIGJlIG5lZWRlZAorICAgICAgICAgICAgICAgICAgICBpZiAoIWNsaWVudFNwLT5jYW5DYXN0VG9BcGlDbGllbnQoZWZmZWN0aXZlQXBpTGV2ZWwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiQ2FtZXJhU2VydmljZSBjb25uZWN0IGNhbGxlZCBmcm9tIHNhbWUgY2xpZW50LCBidXQgd2l0aCBhIGRpZmZlcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBBUEkgbGV2ZWwsIGV2aWN0aW5nIHByaW9yIGNsaWVudC4uLiIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNsaWVudFNwLT5nZXRSZW1vdGUoKSA9PSByZW1vdGVDYWxsYmFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0koIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAoUElEICVkKSAoc2Vjb25kIGNhbGwgZnJvbSBzYW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGFwcCBiaW5kZXIsIHJldHVybmluZyB0aGUgc2FtZSBjbGllbnQpIiwgY2xpZW50UGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpjbGllbnQgPSBjbGllbnRTcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtQ2xpZW50W2NhbWVyYUlkXS5jbGVhcigpOwotICAgIH0KIAotICAgIC8qCi0gICAgbUJ1c3kgaXMgc2V0IHRvIGZhbHNlIGFzIHRoZSBsYXN0IHN0ZXAgb2YgdGhlIENsaWVudCBkZXN0cnVjdG9yLAotICAgIGFmdGVyIHdoaWNoIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCB0aGUgQ2xpZW50IGRlc3RydWN0b3IgaGFzIGZpbmlzaGVkICgKLSAgICBpbmNsdWRpbmcgYW55IGluaGVyaXRlZCBkZXN0cnVjdG9ycykKKyAgICAgICAgLy8gUmV0dXJuIGVycm9yIGlmIHRoZSBkZXZpY2Ugd2FzIHVucGx1Z2dlZCBvciByZW1vdmVkIGJ5IHRoZSBIQUwgZm9yIHNvbWUgcmVhc29uCisgICAgICAgIGlmICgocmV0ID0gY2hlY2tJZkRldmljZUlzVXNhYmxlKGNhbWVyYUlkKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KIAotICAgIFdlIG9ubHkgbmVlZCB0aGlzIGZvciBhIENsaWVudCBzdWJjbGFzc2VzIHNpbmNlIHdlIGRvbid0IGFsbG93Ci0gICAgbXVsdGlwbGUgQ2xlbnRzIHRvIGJlIG9wZW5lZCBjb25jdXJyZW50bHksIGJ1dCBtdWx0aXBsZSBCYXNpY0NsaWVudAotICAgIHdvdWxkIGJlIGZpbmUKLSAgICAqLwotICAgIGlmIChtQnVzeVtjYW1lcmFJZF0pIHsKLSAgICAgICAgQUxPR1coIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAocGlkICVkLCBcIiVzXCIpIHJlamVjdGVkIgotICAgICAgICAgICAgICAgICIgKGNhbWVyYSAlZCBpcyBzdGlsbCBidXN5KS4iLCBjYWxsaW5nUGlkLAotICAgICAgICAgICAgICAgIGNsaWVudE5hbWU4LnN0cmluZygpLCBjYW1lcmFJZCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CisgICAgICAgIC8vIEdldCBjdXJyZW50IGFjdGl2ZSBjbGllbnQgUElEcworICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IG93bmVyUGlkcyhtQWN0aXZlQ2xpZW50TWFuYWdlci5nZXRBbGxPd25lcnMoKSk7CisgICAgICAgIG93bmVyUGlkcy5wdXNoX2JhY2soY2xpZW50UGlkKTsKIAotICAgIHJldHVybiB0cnVlOwotfQorICAgICAgICAvLyBVc2UgdGhlIHZhbHVlICtQUk9DRVNTX1NUQVRFX05PTkVYSVNURU5ULCB0byBhdm9pZCB0YWtpbmcKKyAgICAgICAgLy8gYWRkcmVzcyBvZiBQUk9DRVNTX1NUQVRFX05PTkVYSVNURU5UIGFzIGEgcmVmZXJlbmNlIGFyZ3VtZW50CisgICAgICAgIC8vIGZvciB0aGUgdmVjdG9yIGNvbnN0cnVjdG9yLiBQUk9DRVNTX1NUQVRFX05PTkVYSVNURU5UIGRvZXMKKyAgICAgICAgLy8gbm90IGhhdmUgYW4gb3V0LW9mLWNsYXNzIGRlZmluaXRpb24uCisgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gcHJpb3JpdGllcyhvd25lclBpZHMuc2l6ZSgpLCArUFJPQ0VTU19TVEFURV9OT05FWElTVEVOVCk7CiAKLXN0YXR1c190IENhbWVyYVNlcnZpY2U6OmNvbm5lY3RIZWxwZXJMb2NrZWQoCi0gICAgICAgIC8qb3V0Ki8KLSAgICAgICAgc3A8Q2xpZW50PiYgY2xpZW50LAotICAgICAgICAvKmluKi8KLSAgICAgICAgY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKLSAgICAgICAgaW50IGNhbWVyYUlkLAotICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgIGludCBjbGllbnRVaWQsCi0gICAgICAgIGludCBjYWxsaW5nUGlkLAotICAgICAgICBpbnQgaGFsVmVyc2lvbiwKLSAgICAgICAgYm9vbCBsZWdhY3lNb2RlKSB7CisgICAgICAgIC8vIEdldCBwcmlvcml0ZXMgb2YgYWxsIGFjdGl2ZSBQSURzCisgICAgICAgIFByb2Nlc3NJbmZvU2VydmljZTo6Z2V0UHJvY2Vzc1N0YXRlc0Zyb21QaWRzKG93bmVyUGlkcy5zaXplKCksICZvd25lclBpZHNbMF0sCisgICAgICAgICAgICAgICAgLypvdXQqLyZwcmlvcml0aWVzWzBdKTsKIAotICAgIGludCBmYWNpbmcgPSAtMTsKLSAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IGdldERldmljZVZlcnNpb24oY2FtZXJhSWQsICZmYWNpbmcpOworICAgICAgICAvLyBVcGRhdGUgYWxsIGFjdGl2ZSBjbGllbnRzJyBwcmlvcml0aWVzCisgICAgICAgIHN0ZDo6bWFwPGludCxpbnQ+IHBpZFRvUHJpb3JpdHlNYXA7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3duZXJQaWRzLnNpemUoKSAtIDE7IGkrKykgeworICAgICAgICAgICAgcGlkVG9Qcmlvcml0eU1hcC5lbXBsYWNlKG93bmVyUGlkc1tpXSwgZ2V0Q2FtZXJhUHJpb3JpdHlGcm9tUHJvY1N0YXRlKHByaW9yaXRpZXNbaV0pKTsKKyAgICAgICAgfQorICAgICAgICBtQWN0aXZlQ2xpZW50TWFuYWdlci51cGRhdGVQcmlvcml0aWVzKHBpZFRvUHJpb3JpdHlNYXApOwogCi0gICAgaWYgKGhhbFZlcnNpb24gPCAwIHx8IGhhbFZlcnNpb24gPT0gZGV2aWNlVmVyc2lvbikgewotICAgICAgICAvLyBEZWZhdWx0IHBhdGg6IEhBTCB2ZXJzaW9uIGlzIHVuc3BlY2lmaWVkIGJ5IGNhbGxlciwgY3JlYXRlIENhbWVyYUNsaWVudAotICAgICAgICAvLyBiYXNlZCBvbiBkZXZpY2UgdmVyc2lvbiByZXBvcnRlZCBieSB0aGUgSEFMLgotICAgICAgICBzd2l0Y2goZGV2aWNlVmVyc2lvbikgewotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzA6Ci0gICAgICAgICAgICBjbGllbnQgPSBuZXcgQ2FtZXJhQ2xpZW50KHRoaXMsIGNhbWVyYUNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICBmYWNpbmcsIGNhbGxpbmdQaWQsIGNsaWVudFVpZCwgZ2V0cGlkKCksIGxlZ2FjeU1vZGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMDoKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8xOgotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgotICAgICAgICAgICAgY2xpZW50ID0gbmV3IENhbWVyYTJDbGllbnQodGhpcywgY2FtZXJhQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgIGZhY2luZywgY2FsbGluZ1BpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSwgbGVnYWN5TW9kZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIC0xOgotICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY2FtZXJhIGlkICVkIiwgY2FtZXJhSWQpOworICAgICAgICAvLyBHZXQgc3RhdGUgZm9yIHRoZSBnaXZlbiBjYW1lcmFJZAorICAgICAgICBhdXRvIHN0YXRlID0gZ2V0Q2FtZXJhU3RhdGUoY2FtZXJhSWQpOworICAgICAgICBpZiAoc3RhdGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAoUElEICVkKSByZWplY3RlZCAobm8gY2FtZXJhIGRldmljZSB3aXRoIElEICVzKSIsCisgICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjYW1lcmFJZC5zdHJpbmcoKSk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiVW5rbm93biBjYW1lcmEgZGV2aWNlIEhBTCB2ZXJzaW9uOiAlZCIsIGRldmljZVZlcnNpb24pOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQSBwYXJ0aWN1bGFyIEhBTCB2ZXJzaW9uIGlzIHJlcXVlc3RlZCBieSBjYWxsZXIuIENyZWF0ZSBDYW1lcmFDbGllbnQKLSAgICAgICAgLy8gYmFzZWQgb24gdGhlIHJlcXVlc3RlZCBIQUwgdmVyc2lvbi4KLSAgICAgICAgaWYgKGRldmljZVZlcnNpb24gPiBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCAmJgotICAgICAgICAgICAgaGFsVmVyc2lvbiA9PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCkgewotICAgICAgICAgICAgLy8gT25seSBzdXBwb3J0IGhpZ2hlciBIQUwgdmVyc2lvbiBkZXZpY2Ugb3BlbmVkIGFzIEhBTDEuMCBkZXZpY2UuCi0gICAgICAgICAgICBjbGllbnQgPSBuZXcgQ2FtZXJhQ2xpZW50KHRoaXMsIGNhbWVyYUNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICBmYWNpbmcsIGNhbGxpbmdQaWQsIGNsaWVudFVpZCwgZ2V0cGlkKCksIGxlZ2FjeU1vZGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gT3RoZXIgY29tYmluYXRpb25zIChlLmcuIEhBTDMueCBvcGVuIGFzIEhBTDIueCkgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LgotICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY2FtZXJhIEhBTCB2ZXJzaW9uICV4OiBIQUwgJXggZGV2aWNlIGNhbiBvbmx5IGJlIgotICAgICAgICAgICAgICAgICAgICAiIG9wZW5lZCBhcyBIQUwgJXggZGV2aWNlIiwgaGFsVmVyc2lvbiwgZGV2aWNlVmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzApOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgICAgIC8vIE1ha2UgZGVzY3JpcHRvciBmb3IgaW5jb21pbmcgY2xpZW50CisgICAgICAgIGNsaWVudERlc2NyaXB0b3IgPSBDYW1lcmFDbGllbnRNYW5hZ2VyOjptYWtlQ2xpZW50RGVzY3JpcHRvcihjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICBzcDxCYXNpY0NsaWVudD57bnVsbHB0cn0sIHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXRlLT5nZXRDb3N0KCkpLAorICAgICAgICAgICAgICAgIHN0YXRlLT5nZXRDb25mbGljdGluZygpLAorICAgICAgICAgICAgICAgIGdldENhbWVyYVByaW9yaXR5RnJvbVByb2NTdGF0ZShwcmlvcml0aWVzW3ByaW9yaXRpZXMuc2l6ZSgpIC0gMV0pLCBjbGllbnRQaWQpOworCisgICAgICAgIC8vIEZpbmQgY2xpZW50cyB0aGF0IHdvdWxkIGJlIGV2aWN0ZWQKKyAgICAgICAgYXV0byBldmljdGVkID0gbUFjdGl2ZUNsaWVudE1hbmFnZXIud291bGRFdmljdChjbGllbnREZXNjcmlwdG9yKTsKKworICAgICAgICAvLyBJZiB0aGUgaW5jb21pbmcgY2xpZW50IHdhcyAnZXZpY3RlZCwnIGhpZ2hlciBwcmlvcml0eSBjbGllbnRzIGhhdmUgdGhlIGNhbWVyYSBpbiB0aGUKKyAgICAgICAgLy8gYmFja2dyb3VuZCwgc28gd2UgY2Fubm90IGRvIGV2aWN0aW9ucworICAgICAgICBpZiAoc3RkOjpmaW5kKGV2aWN0ZWQuYmVnaW4oKSwgZXZpY3RlZC5lbmQoKSwgY2xpZW50RGVzY3JpcHRvcikgIT0gZXZpY3RlZC5lbmQoKSkgeworICAgICAgICAgICAgQUxPR0UoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAoUElEICVkKSByZWplY3RlZCAoZXhpc3RpbmcgY2xpZW50KHMpIHdpdGggaGlnaGVyIgorICAgICAgICAgICAgICAgICAgICAiIHByaW9yaXR5KS4iLCBjbGllbnRQaWQpOworCisgICAgICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50U3AgPSBjbGllbnREZXNjcmlwdG9yLT5nZXRWYWx1ZSgpOworICAgICAgICAgICAgU3RyaW5nOCBjdXJUaW1lID0gZ2V0Rm9ybWF0dGVkQ3VycmVudFRpbWUoKTsKKyAgICAgICAgICAgIGF1dG8gaW5jb21wYXRpYmxlQ2xpZW50cyA9CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldEluY29tcGF0aWJsZUNsaWVudHMoY2xpZW50RGVzY3JpcHRvcik7CisKKyAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCIlcyA6IERFTklFRCBjb25uZWN0IGRldmljZSAlcyBjbGllbnQgZm9yIHBhY2thZ2UgJXMgIgorICAgICAgICAgICAgICAgICAgICAiKFBJRCAlZCwgcHJpb3JpdHkgJWQpIGR1ZSB0byBldmljdGlvbiBwb2xpY3kiLCBjdXJUaW1lLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgcGFja2FnZU5hbWUuc3RyaW5nKCksIGNsaWVudFBpZCwKKyAgICAgICAgICAgICAgICAgICAgZ2V0Q2FtZXJhUHJpb3JpdHlGcm9tUHJvY1N0YXRlKHByaW9yaXRpZXNbcHJpb3JpdGllcy5zaXplKCkgLSAxXSkpOworCisgICAgICAgICAgICBmb3IgKGF1dG8mIGkgOiBpbmNvbXBhdGlibGVDbGllbnRzKSB7CisgICAgICAgICAgICAgICAgbXNnLmFwcGVuZEZvcm1hdCgiXG4gICAtIEJsb2NrZWQgYnkgZXhpc3RpbmcgZGV2aWNlICVzIGNsaWVudCBmb3IgcGFja2FnZSAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICIoUElEICUiIFBSSWQzMiAiLCBwcmlvcml0eSAlIiBQUklkMzIgIikiLCBpLT5nZXRLZXkoKS5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzh7aS0+Z2V0VmFsdWUoKS0+Z2V0UGFja2FnZU5hbWUoKX0uc3RyaW5nKCksIGktPmdldE93bmVySWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGktPmdldFByaW9yaXR5KCkpOworICAgICAgICAgICAgICAgIEFMT0dFKCIgICBDb25mbGljdHMgd2l0aDogRGV2aWNlICVzLCBjbGllbnQgcGFja2FnZSAlcyAoUElEICUiCisgICAgICAgICAgICAgICAgICAgICAgICBQUklkMzIgIiwgcHJpb3JpdHkgJSIgUFJJZDMyICIpIiwgaS0+Z2V0S2V5KCkuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4e2ktPmdldFZhbHVlKCktPmdldFBhY2thZ2VOYW1lKCl9LnN0cmluZygpLCBpLT5nZXRPd25lcklkKCksCisgICAgICAgICAgICAgICAgICAgICAgICBpLT5nZXRQcmlvcml0eSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTG9nIHRoZSBjbGllbnQncyBhdHRlbXB0CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9nTG9jayk7CisgICAgICAgICAgICBtRXZlbnRMb2cuYWRkKG1zZyk7CisKKyAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGF1dG8mIGkgOiBldmljdGVkKSB7CisgICAgICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50U3AgPSBpLT5nZXRWYWx1ZSgpOworICAgICAgICAgICAgaWYgKGNsaWVudFNwLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgc3RhdGU6IE51bGwgY2xpZW50IGluIGFjdGl2ZSBjbGllbnQgbGlzdC4iLCBfX0ZVTkNUSU9OX18pOworCisgICAgICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMKKyAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlczogSW52YWxpZCBzdGF0ZSBmb3IgQ2FtZXJhU2VydmljZSwgbnVsbCBjbGllbnQgaW4gYWN0aXZlIGxpc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICBtQWN0aXZlQ2xpZW50TWFuYWdlci5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dFKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IGV2aWN0aW5nIGNvbmZsaWN0aW5nIGNsaWVudCBmb3IgY2FtZXJhIElEICVzIiwKKyAgICAgICAgICAgICAgICAgICAgaS0+Z2V0S2V5KCkuc3RyaW5nKCkpOworICAgICAgICAgICAgZXZpY3RlZENsaWVudHMucHVzaF9iYWNrKGkpOworCisgICAgICAgICAgICAvLyBMb2cgdGhlIGNsaWVudHMgZXZpY3RlZAorICAgICAgICAgICAgbG9nRXZlbnQoU3RyaW5nODo6Zm9ybWF0KCJFVklDVCBkZXZpY2UgJXMgY2xpZW50IGhlbGQgYnkgcGFja2FnZSAlcyAoUElEIgorICAgICAgICAgICAgICAgICAgICAiICUiIFBSSWQzMiAiLCBwcmlvcml0eSAlIiBQUklkMzIgIilcbiAgIC0gRXZpY3RlZCBieSBkZXZpY2UgJXMgY2xpZW50IGZvciIKKyAgICAgICAgICAgICAgICAgICAgIiBwYWNrYWdlICVzIChQSUQgJWQsIHByaW9yaXR5ICUiIFBSSWQzMiAiKSIsCisgICAgICAgICAgICAgICAgICAgIGktPmdldEtleSgpLnN0cmluZygpLCBTdHJpbmc4e2NsaWVudFNwLT5nZXRQYWNrYWdlTmFtZSgpfS5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgaS0+Z2V0T3duZXJJZCgpLCBpLT5nZXRQcmlvcml0eSgpLCBjYW1lcmFJZC5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUuc3RyaW5nKCksIGNsaWVudFBpZCwKKyAgICAgICAgICAgICAgICAgICAgZ2V0Q2FtZXJhUHJpb3JpdHlGcm9tUHJvY1N0YXRlKHByaW9yaXRpZXNbcHJpb3JpdGllcy5zaXplKCkgLSAxXSkpKTsKKworICAgICAgICAgICAgLy8gTm90aWZ5IHRoZSBjbGllbnQgb2YgZGlzY29ubmVjdGlvbgorICAgICAgICAgICAgY2xpZW50U3AtPm5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQsCisgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMoKSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBjb25uZWN0RmluaXNoVW5zYWZlKGNsaWVudCwgY2xpZW50LT5nZXRSZW1vdGUoKSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICAvLyB0aGlzIGlzIHByb2JhYmx5IG5vdCByZWNvdmVyYWJsZS4uIG1heWJlIHRoZSBjbGllbnQgY2FuIHRyeSBhZ2FpbgotICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIC8vIERvIG5vdCBob2xkIG1TZXJ2aWNlTG9jayB3aGlsZSBkaXNjb25uZWN0aW5nIGNsaWVudHMsIGJ1dCByZXRhaW4gdGhlIGNvbmRpdGlvbiBibG9ja2luZworICAgIC8vIG90aGVyIGNsaWVudHMgZnJvbSBjb25uZWN0aW5nIGluIG1TZXJ2aWNlTG9ja1dyYXBwZXIgaWYgaGVsZAorICAgIG1TZXJ2aWNlTG9jay51bmxvY2soKTsKKworICAgIC8vIENsZWFyIGNhbGxlciBpZGVudGl0eSB0ZW1wb3JhcmlseSBzbyBjbGllbnQgZGlzY29ubmVjdCBQSUQgY2hlY2tzIHdvcmsgY29ycmVjdGx5CisgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisKKyAgICAvLyBEZXN0cm95IGV2aWN0ZWQgY2xpZW50cworICAgIGZvciAoYXV0byYgaSA6IGV2aWN0ZWRDbGllbnRzKSB7CisgICAgICAgIC8vIERpc2Nvbm5lY3QgaXMgYmxvY2tpbmcsIGFuZCBzaG91bGQgb25seSBoYXZlIHJldHVybmVkIHdoZW4gSEFMIGhhcyBjbGVhbmVkIHVwCisgICAgICAgIGktPmdldFZhbHVlKCktPmRpc2Nvbm5lY3QoKTsgLy8gQ2xpZW50cyB3aWxsIHJlbW92ZSB0aGVtc2VsdmVzIGZyb20gdGhlIGFjdGl2ZSBjbGllbnQgbGlzdAogICAgIH0KIAotICAgIG1DbGllbnRbY2FtZXJhSWRdID0gY2xpZW50OwotICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAoaWQgJWQsIHRoaXMgcGlkIGlzICVkKSIsIGNhbWVyYUlkLAotICAgICAgICAgZ2V0cGlkKCkpOworICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogCi0gICAgcmV0dXJuIE9LOworICAgIGZvciAoY29uc3QgYXV0byYgaSA6IGV2aWN0ZWRDbGllbnRzKSB7CisgICAgICAgIEFMT0dWKCIlczogV2FpdGluZyBmb3IgZGlzY29ubmVjdCB0byBjb21wbGV0ZSBmb3IgY2xpZW50IGZvciBkZXZpY2UgJXMgKFBJRCAlIiBQUklkMzIgIikiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaS0+Z2V0S2V5KCkuc3RyaW5nKCksIGktPmdldE93bmVySWQoKSk7CisgICAgICAgIHJldCA9IG1BY3RpdmVDbGllbnRNYW5hZ2VyLndhaXRVbnRpbFJlbW92ZWQoaSwgREVGQVVMVF9ESVNDT05ORUNUX1RJTUVPVVRfTlMpOworICAgICAgICBpZiAocmV0ID09IFRJTUVEX09VVCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBUaW1lZCBvdXQgd2FpdGluZyBmb3IgY2xpZW50IGZvciBkZXZpY2UgJXMgdG8gZGlzY29ubmVjdCwgIgorICAgICAgICAgICAgICAgICAgICAiY3VycmVudCBjbGllbnRzOlxuJXMiLCBfX0ZVTkNUSU9OX18sIGktPmdldEtleSgpLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICBtQWN0aXZlQ2xpZW50TWFuYWdlci50b1N0cmluZygpLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBSZWNlaXZlZCBlcnJvciB3YWl0aW5nIGZvciBjbGllbnQgZm9yIGRldmljZSAlcyB0byBkaXNjb25uZWN0OiAlcyAoJWQpLCAiCisgICAgICAgICAgICAgICAgICAgICJjdXJyZW50IGNsaWVudHM6XG4lcyIsIF9fRlVOQ1RJT05fXywgaS0+Z2V0S2V5KCkuc3RyaW5nKCksIHN0cmVycm9yKC1yZXQpLAorICAgICAgICAgICAgICAgICAgICByZXQsIG1BY3RpdmVDbGllbnRNYW5hZ2VyLnRvU3RyaW5nKCkuc3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGV2aWN0ZWRDbGllbnRzLmNsZWFyKCk7CisKKyAgICAvLyBPbmNlIGNsaWVudHMgaGF2ZSBiZWVuIGRpc2Nvbm5lY3RlZCwgcmVsb2NrCisgICAgbVNlcnZpY2VMb2NrLmxvY2soKTsKKworICAgIC8vIENoZWNrIGFnYWluIGlmIHRoZSBkZXZpY2Ugd2FzIHVucGx1Z2dlZCBvciBzb21ldGhpbmcgd2hpbGUgd2Ugd2VyZW4ndCBob2xkaW5nIG1TZXJ2aWNlTG9jaworICAgIGlmICgocmV0ID0gY2hlY2tJZkRldmljZUlzVXNhYmxlKGNhbWVyYUlkKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAqcGFydGlhbCA9IGNsaWVudERlc2NyaXB0b3I7CisgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0KApAQCAtNzM4LDQ3ICsxMTMxLDIwIEBACiAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgc3A8SUNhbWVyYT4mIGRldmljZSkgewogCi0gICAgU3RyaW5nOCBjbGllbnROYW1lOChjbGllbnRQYWNrYWdlTmFtZSk7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgc3RhdHVzX3QgcmV0ID0gTk9fRVJST1I7CisgICAgU3RyaW5nOCBpZCA9IFN0cmluZzg6OmZvcm1hdCgiJWQiLCBjYW1lcmFJZCk7CisgICAgc3A8Q2xpZW50PiBjbGllbnQgPSBudWxscHRyOworICAgIHJldCA9IGNvbm5lY3RIZWxwZXI8SUNhbWVyYUNsaWVudCxDbGllbnQ+KGNhbWVyYUNsaWVudCwgaWQsIENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQsCisgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgY2xpZW50VWlkLCBBUElfMSwgZmFsc2UsIGZhbHNlLCAvKm91dCovY2xpZW50KTsKIAotICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgRSAocGlkICVkIFwiJXNcIiwgaWQgJWQpIiwgY2FsbGluZ1BpZCwKLSAgICAgICAgICAgIGNsaWVudE5hbWU4LnN0cmluZygpLCBjYW1lcmFJZCk7Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSB2YWxpZGF0ZUNvbm5lY3QoY2FtZXJhSWQsIC8qaW5vdXQqL2NsaWVudFVpZCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIGlmKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICBsb2dSZWplY3RlZChpZCwgZ2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKSwKKyAgICAgICAgICAgICAgICBTdHJpbmc4Ojpmb3JtYXQoIiVzICglZCkiLCBzdHJlcnJvcigtcmV0KSwgcmV0KSk7CisgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCi0KLSAgICBzcDxDbGllbnQ+IGNsaWVudDsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7Ci0gICAgICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnRUbXA7Ci0gICAgICAgIGlmICghY2FuQ29ubmVjdFVuc2FmZShjYW1lcmFJZCwgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihjYW1lcmFDbGllbnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqL2NsaWVudFRtcCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUJVU1k7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2xpZW50LmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRldmljZSA9IHN0YXRpY19jYXN0PENsaWVudCo+KGNsaWVudFRtcC5nZXQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0dXMgPSBjb25uZWN0SGVscGVyTG9ja2VkKC8qb3V0Ki9jbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsaW5nUGlkKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotCi0gICAgfQotICAgIC8vIGltcG9ydGFudDogcmVsZWFzZSB0aGUgbXV0ZXggaGVyZSBzbyB0aGUgY2xpZW50IGNhbiBjYWxsIGJhY2sKLSAgICAvLyAgICBpbnRvIHRoZSBzZXJ2aWNlIGZyb20gaXRzIGRlc3RydWN0b3IgKGNhbiBiZSBhdCB0aGUgZW5kIG9mIHRoZSBjYWxsKQotCiAgICAgZGV2aWNlID0gY2xpZW50OwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmNvbm5lY3RMZWdhY3koCkBAIC03ODksOCArMTE1NSwxMCBAQAogICAgICAgICAvKm91dCovCiAgICAgICAgIHNwPElDYW1lcmE+JiBkZXZpY2UpIHsKIAorICAgIFN0cmluZzggaWQgPSBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgY2FtZXJhSWQpOworICAgIGludCBhcGlWZXJzaW9uID0gbU1vZHVsZS0+Z2V0TW9kdWxlQXBpVmVyc2lvbigpOwogICAgIGlmIChoYWxWZXJzaW9uICE9IENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQgJiYKLSAgICAgICAgICAgIG1Nb2R1bGUtPmNvbW1vbi5tb2R1bGVfYXBpX3ZlcnNpb24gPCBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfMykgeworICAgICAgICAgICAgYXBpVmVyc2lvbiA8IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl8zKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIEVpdGhlciB0aGUgSEFMIHZlcnNpb24gaXMgdW5zcGVjaWZpZWQgaW4gd2hpY2ggY2FzZSB0aGlzIGp1c3QgY3JlYXRlcwogICAgICAgICAgKiBhIGNhbWVyYSBjbGllbnQgc2VsZWN0ZWQgYnkgdGhlIGxhdGVzdCBkZXZpY2UgdmVyc2lvbiwgb3IKQEAgLTc5OCwxNDIgKzExNjYsMjUgQEAKICAgICAgICAgICogdGhlIG9wZW5fbGVnYWN5IGNhbGwKICAgICAgICAgICovCiAgICAgICAgIEFMT0dFKCIlczogY2FtZXJhIEhBTCBtb2R1bGUgdmVyc2lvbiAleCBkb2Vzbid0IHN1cHBvcnQgY29ubmVjdGluZyB0byBsZWdhY3kgSEFMIGRldmljZXMhIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Nb2R1bGUtPmNvbW1vbi5tb2R1bGVfYXBpX3ZlcnNpb24pOworICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYXBpVmVyc2lvbik7CisgICAgICAgIGxvZ1JlamVjdGVkKGlkLCBnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLAorICAgICAgICAgICAgICAgIFN0cmluZzgoIkhBTCBtb2R1bGUgdmVyc2lvbiBkb2Vzbid0IHN1cHBvcnQgbGVnYWN5IEhBTCBjb25uZWN0aW9ucyIpKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIFN0cmluZzggY2xpZW50TmFtZTgoY2xpZW50UGFja2FnZU5hbWUpOwotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIHN0YXR1c190IHJldCA9IE5PX0VSUk9SOworICAgIHNwPENsaWVudD4gY2xpZW50ID0gbnVsbHB0cjsKKyAgICByZXQgPSBjb25uZWN0SGVscGVyPElDYW1lcmFDbGllbnQsQ2xpZW50PihjYW1lcmFDbGllbnQsIGlkLCBoYWxWZXJzaW9uLCBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgIGNsaWVudFVpZCwgQVBJXzEsIHRydWUsIGZhbHNlLCAvKm91dCovY2xpZW50KTsKIAotICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgbGVnYWN5IEUgKHBpZCAlZCBcIiVzXCIsIGlkICVkKSIsIGNhbGxpbmdQaWQsCi0gICAgICAgICAgICBjbGllbnROYW1lOC5zdHJpbmcoKSwgY2FtZXJhSWQpOwotCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gdmFsaWRhdGVDb25uZWN0KGNhbWVyYUlkLCAvKmlub3V0Ki9jbGllbnRVaWQpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICBpZihyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgbG9nUmVqZWN0ZWQoaWQsIGdldENhbGxpbmdQaWQoKSwgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSksCisgICAgICAgICAgICAgICAgU3RyaW5nODo6Zm9ybWF0KCIlcyAoJWQpIiwgc3RyZXJyb3IoLXJldCksIHJldCkpOworICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIHNwPENsaWVudD4gY2xpZW50OwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKLSAgICAgICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudFRtcDsKLSAgICAgICAgaWYgKCFjYW5Db25uZWN0VW5zYWZlKGNhbWVyYUlkLCBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGNhbWVyYUNsaWVudCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovY2xpZW50VG1wKSkgewotICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKLSAgICAgICAgfSBlbHNlIGlmIChjbGllbnQuZ2V0KCkgIT0gTlVMTCkgewotICAgICAgICAgICAgZGV2aWNlID0gc3RhdGljX2Nhc3Q8Q2xpZW50Kj4oY2xpZW50VG1wLmdldCgpKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXR1cyA9IGNvbm5lY3RIZWxwZXJMb2NrZWQoLypvdXQqL2NsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFDbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdQaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsVmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmxlZ2FjeU1vZGUqL3RydWUpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgLy8gaW1wb3J0YW50OiByZWxlYXNlIHRoZSBtdXRleCBoZXJlIHNvIHRoZSBjbGllbnQgY2FuIGNhbGwgYmFjawotICAgIC8vICAgIGludG8gdGhlIHNlcnZpY2UgZnJvbSBpdHMgZGVzdHJ1Y3RvciAoY2FuIGJlIGF0IHRoZSBlbmQgb2YgdGhlIGNhbGwpCi0KICAgICBkZXZpY2UgPSBjbGllbnQ7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0RmluaXNoVW5zYWZlKGNvbnN0IHNwPEJhc2ljQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgcmVtb3RlQ2FsbGJhY2spIHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBjbGllbnQtPmluaXRpYWxpemUobU1vZHVsZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBpbml0aWFsaXplIGNsaWVudCBmcm9tIEhBTCBtb2R1bGUuIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgaWYgKHJlbW90ZUNhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgcmVtb3RlQ2FsbGJhY2stPmxpbmtUb0RlYXRoKHRoaXMpOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Y29ubmVjdFBybygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJUHJvQ2FtZXJhQ2FsbGJhY2tzPiYgY2FtZXJhQ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJUHJvQ2FtZXJhVXNlcj4mIGRldmljZSkKLXsKLSAgICBpZiAoY2FtZXJhQ2IgPT0gMCkgewotICAgICAgICBBTE9HRSgiJXM6IENhbGxiYWNrIG11c3Qgbm90IGJlIG51bGwiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIFN0cmluZzggY2xpZW50TmFtZTgoY2xpZW50UGFja2FnZU5hbWUpOwotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOwotCi0gICAgTE9HMSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdFBybyBFIChwaWQgJWQgXCIlc1wiLCBpZCAlZCkiLCBjYWxsaW5nUGlkLAotICAgICAgICAgICAgY2xpZW50TmFtZTguc3RyaW5nKCksIGNhbWVyYUlkKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSB2YWxpZGF0ZUNvbm5lY3QoY2FtZXJhSWQsIC8qaW5vdXQqL2NsaWVudFVpZCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHNwPFByb0NsaWVudD4gY2xpZW50OwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKLSAgICAgICAgewotICAgICAgICAgICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudDsKLSAgICAgICAgICAgIGlmICghY2FuQ29ubmVjdFVuc2FmZShjYW1lcmFJZCwgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoY2FtZXJhQ2IpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki9jbGllbnQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGludCBmYWNpbmcgPSAtMTsKLSAgICAgICAgaW50IGRldmljZVZlcnNpb24gPSBnZXREZXZpY2VWZXJzaW9uKGNhbWVyYUlkLCAmZmFjaW5nKTsKLQotICAgICAgICBzd2l0Y2goZGV2aWNlVmVyc2lvbikgewotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzA6Ci0gICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIGlkICVkIHVzZXMgSEFMdjEsIGRvZXNuJ3Qgc3VwcG9ydCBQcm9DYW1lcmEiLAotICAgICAgICAgICAgICAgICAgY2FtZXJhSWQpOwotICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMDoKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8xOgotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgotICAgICAgICAgICAgY2xpZW50ID0gbmV3IFByb0NhbWVyYTJDbGllbnQodGhpcywgY2FtZXJhQ2IsIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgZmFjaW5nLCBjYWxsaW5nUGlkLCBjbGllbnRVaWQsIGdldHBpZCgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgLTE6Ci0gICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBjYW1lcmEgaWQgJWQiLCBjYW1lcmFJZCk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiVW5rbm93biBjYW1lcmEgZGV2aWNlIEhBTCB2ZXJzaW9uOiAlZCIsIGRldmljZVZlcnNpb24pOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY29ubmVjdEZpbmlzaFVuc2FmZShjbGllbnQsIGNsaWVudC0+Z2V0UmVtb3RlKCkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0KLSAgICAgICAgbVByb0NsaWVudExpc3RbY2FtZXJhSWRdLnB1c2goY2xpZW50KTsKLQotICAgICAgICBMT0cxKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0UHJvIFggKGlkICVkLCB0aGlzIHBpZCBpcyAlZCkiLCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICBnZXRwaWQoKSk7Ci0gICAgfQotICAgIC8vIGltcG9ydGFudDogcmVsZWFzZSB0aGUgbXV0ZXggaGVyZSBzbyB0aGUgY2xpZW50IGNhbiBjYWxsIGJhY2sKLSAgICAvLyAgICBpbnRvIHRoZSBzZXJ2aWNlIGZyb20gaXRzIGRlc3RydWN0b3IgKGNhbiBiZSBhdCB0aGUgZW5kIG9mIHRoZSBjYWxsKQotICAgIGRldmljZSA9IGNsaWVudDsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0RGV2aWNlKApAQCAtOTQyLDExMCArMTE5MywxNzggQEAKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICBpbnQgY2xpZW50VWlkLAogICAgICAgICAvKm91dCovCi0gICAgICAgIHNwPElDYW1lcmFEZXZpY2VVc2VyPiYgZGV2aWNlKQoteworICAgICAgICBzcDxJQ2FtZXJhRGV2aWNlVXNlcj4mIGRldmljZSkgewogCi0gICAgU3RyaW5nOCBjbGllbnROYW1lOChjbGllbnRQYWNrYWdlTmFtZSk7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgc3RhdHVzX3QgcmV0ID0gTk9fRVJST1I7CisgICAgU3RyaW5nOCBpZCA9IFN0cmluZzg6OmZvcm1hdCgiJWQiLCBjYW1lcmFJZCk7CisgICAgc3A8Q2FtZXJhRGV2aWNlQ2xpZW50PiBjbGllbnQgPSBudWxscHRyOworICAgIHJldCA9IGNvbm5lY3RIZWxwZXI8SUNhbWVyYURldmljZUNhbGxiYWNrcyxDYW1lcmFEZXZpY2VDbGllbnQ+KGNhbWVyYUNiLCBpZCwKKyAgICAgICAgICAgIENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQsIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRVaWQsIEFQSV8yLCBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgICAvKm91dCovY2xpZW50KTsKIAotICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3REZXZpY2UgRSAocGlkICVkIFwiJXNcIiwgaWQgJWQpIiwgY2FsbGluZ1BpZCwKLSAgICAgICAgICAgIGNsaWVudE5hbWU4LnN0cmluZygpLCBjYW1lcmFJZCk7Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSB2YWxpZGF0ZUNvbm5lY3QoY2FtZXJhSWQsIC8qaW5vdXQqL2NsaWVudFVpZCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIGlmKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICBsb2dSZWplY3RlZChpZCwgZ2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKSwKKyAgICAgICAgICAgICAgICBTdHJpbmc4Ojpmb3JtYXQoIiVzICglZCkiLCBzdHJlcnJvcigtcmV0KSwgcmV0KSk7CisgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCi0gICAgc3A8Q2FtZXJhRGV2aWNlQ2xpZW50PiBjbGllbnQ7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOwotICAgICAgICB7Ci0gICAgICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50OwotICAgICAgICAgICAgaWYgKCFjYW5Db25uZWN0VW5zYWZlKGNhbWVyYUlkLCBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihjYW1lcmFDYiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqL2NsaWVudCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGZhY2luZyA9IC0xOwotICAgICAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IGdldERldmljZVZlcnNpb24oY2FtZXJhSWQsICZmYWNpbmcpOwotCi0gICAgICAgIHN3aXRjaChkZXZpY2VWZXJzaW9uKSB7Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDoKLSAgICAgICAgICAgIEFMT0dXKCJDYW1lcmEgdXNpbmcgb2xkIEhBTCB2ZXJzaW9uOiAlZCIsIGRldmljZVZlcnNpb24pOwotICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOwotICAgICAgICAgICAvLyBUT0RPOiBkb24ndCBhbGxvdyAyLjAgIE9ubHkgYWxsb3cgMi4xIGFuZCBoaWdoZXIKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8wOgotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzE6Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18xOgotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzI6Ci0gICAgICAgICAgICBjbGllbnQgPSBuZXcgQ2FtZXJhRGV2aWNlQ2xpZW50KHRoaXMsIGNhbWVyYUNiLCBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIGZhY2luZywgY2FsbGluZ1BpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIC0xOgotICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY2FtZXJhIGlkICVkIiwgY2FtZXJhSWQpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoIlVua25vd24gY2FtZXJhIGRldmljZSBIQUwgdmVyc2lvbjogJWQiLCBkZXZpY2VWZXJzaW9uKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbm5lY3RGaW5pc2hVbnNhZmUoY2xpZW50LCBjbGllbnQtPmdldFJlbW90ZSgpKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICAgICAgLy8gdGhpcyBpcyBwcm9iYWJseSBub3QgcmVjb3ZlcmFibGUuLiBtYXliZSB0aGUgY2xpZW50IGNhbiB0cnkgYWdhaW4KLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLQotICAgICAgICBMT0cxKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0RGV2aWNlIFggKGlkICVkLCB0aGlzIHBpZCBpcyAlZCkiLCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICBnZXRwaWQoKSk7Ci0KLSAgICAgICAgbUNsaWVudFtjYW1lcmFJZF0gPSBjbGllbnQ7Ci0gICAgfQotICAgIC8vIGltcG9ydGFudDogcmVsZWFzZSB0aGUgbXV0ZXggaGVyZSBzbyB0aGUgY2xpZW50IGNhbiBjYWxsIGJhY2sKLSAgICAvLyAgICBpbnRvIHRoZSBzZXJ2aWNlIGZyb20gaXRzIGRlc3RydWN0b3IgKGNhbiBiZSBhdCB0aGUgZW5kIG9mIHRoZSBjYWxsKQotCiAgICAgZGV2aWNlID0gY2xpZW50OworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6c2V0VG9yY2hNb2RlKGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCwgYm9vbCBlbmFibGVkLAorICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgY2xpZW50QmluZGVyKSB7CisgICAgaWYgKGVuYWJsZWQgJiYgY2xpZW50QmluZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiB0b3JjaCBjbGllbnQgYmluZGVyIGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBTdHJpbmc4IGlkID0gU3RyaW5nOChjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgaW50IHVpZCA9IGdldENhbGxpbmdVaWQoKTsKKworICAgIC8vIHZlcmlmeSBpZCBpcyB2YWxpZC4KKyAgICBhdXRvIHN0YXRlID0gZ2V0Q2FtZXJhU3RhdGUoaWQpOworICAgIGlmIChzdGF0ZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogY2FtZXJhIGlkIGlzIGludmFsaWQgJXMiLCBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzIGNhbWVyYVN0YXR1cyA9IHN0YXRlLT5nZXRTdGF0dXMoKTsKKyAgICBpZiAoY2FtZXJhU3RhdHVzICE9IElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19QUkVTRU5UICYmCisgICAgICAgICAgICBjYW1lcmFTdGF0dXMgIT0gSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9BVkFJTEFCTEUpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYW1lcmEgaWQgaXMgaW52YWxpZCAlcyIsIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtVG9yY2hTdGF0dXNNdXRleCk7CisgICAgICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlRvcmNoU3RhdHVzIHN0YXR1czsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gZ2V0VG9yY2hTdGF0dXNMb2NrZWQoaWQsICZzdGF0dXMpOworICAgICAgICBpZiAocmVzKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGdldHRpbmcgY3VycmVudCB0b3JjaCBzdGF0dXMgZmFpbGVkIGZvciBjYW1lcmEgJXMiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpUT1JDSF9TVEFUVVNfTk9UX0FWQUlMQUJMRSkgeworICAgICAgICAgICAgaWYgKGNhbWVyYVN0YXR1cyA9PSBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX0FWQUlMQUJMRSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogdG9yY2ggbW9kZSBvZiBjYW1lcmEgJXMgaXMgbm90IGF2YWlsYWJsZSBiZWNhdXNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW1lcmEgaXMgaW4gdXNlIiwgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiB0b3JjaCBtb2RlIG9mIGNhbWVyYSAlcyBpcyBub3QgYXZhaWxhYmxlIGR1ZSB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdWZmaWNpZW50IHJlc291cmNlcyIsIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiAtRVVTRVJTOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgICAvLyBVcGRhdGUgVUlEIG1hcCAtIHRoaXMgaXMgdXNlZCBpbiB0aGUgdG9yY2ggc3RhdHVzIGNoYW5nZWQgY2FsbGJhY2tzLCBzbyBtdXN0IGJlIGRvbmUKKyAgICAgICAgLy8gYmVmb3JlIHNldFRvcmNoTW9kZQorICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobVRvcmNoVWlkTWFwTXV0ZXgpOworICAgICAgICBpZiAobVRvcmNoVWlkTWFwLmZpbmQoaWQpID09IG1Ub3JjaFVpZE1hcC5lbmQoKSkgeworICAgICAgICAgICAgbVRvcmNoVWlkTWFwW2lkXS5maXJzdCA9IHVpZDsKKyAgICAgICAgICAgIG1Ub3JjaFVpZE1hcFtpZF0uc2Vjb25kID0gdWlkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gU2V0IHRoZSBwZW5kaW5nIFVJRAorICAgICAgICAgICAgbVRvcmNoVWlkTWFwW2lkXS5maXJzdCA9IHVpZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXR1c190IHJlcyA9IG1GbGFzaGxpZ2h0LT5zZXRUb3JjaE1vZGUoaWQsIGVuYWJsZWQpOworCisgICAgaWYgKHJlcykgeworICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgdG9yY2ggbW9kZSBvZiBjYW1lcmEgJXMgdG8gJWQgZmFpbGVkLiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpLCBlbmFibGVkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIHVwZGF0ZSB0aGUgbGluayB0byBjbGllbnQncyBkZWF0aAorICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobVRvcmNoQ2xpZW50TWFwTXV0ZXgpOworICAgICAgICBzc2l6ZV90IGluZGV4ID0gbVRvcmNoQ2xpZW50TWFwLmluZGV4T2ZLZXkoaWQpOworICAgICAgICBCYXR0ZXJ5Tm90aWZpZXImIG5vdGlmaWVyKEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKSk7CisgICAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgICAgICBpZiAoaW5kZXggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICBtVG9yY2hDbGllbnRNYXAuYWRkKGlkLCBjbGllbnRCaW5kZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtVG9yY2hDbGllbnRNYXAudmFsdWVBdChpbmRleCktPnVubGlua1RvRGVhdGgodGhpcyk7CisgICAgICAgICAgICAgICAgbVRvcmNoQ2xpZW50TWFwLnJlcGxhY2VWYWx1ZUF0KGluZGV4LCBjbGllbnRCaW5kZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xpZW50QmluZGVyLT5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICAgICAgfSBlbHNlIGlmIChpbmRleCAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgbVRvcmNoQ2xpZW50TWFwLnZhbHVlQXQoaW5kZXgpLT51bmxpbmtUb0RlYXRoKHRoaXMpOworICAgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIENhbWVyYVNlcnZpY2U6Om5vdGlmeVN5c3RlbUV2ZW50KGludDMyX3QgZXZlbnRJZCwgY29uc3QgaW50MzJfdCogYXJncywgc2l6ZV90IGxlbmd0aCkgeworICAgIHN3aXRjaChldmVudElkKSB7CisgICAgICAgIGNhc2UgSUNhbWVyYVNlcnZpY2U6OlVTRVJfU1dJVENIRUQ6IHsKKyAgICAgICAgICAgIGRvVXNlclN3aXRjaCgvKm5ld1VzZXJJZHMqL2FyZ3MsIC8qbGVuZ3RoKi9sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBJQ2FtZXJhU2VydmljZTo6Tk9fRVZFTlQ6CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogUmVjZWl2ZWQgaW52YWxpZCBzeXN0ZW0gZXZlbnQgZnJvbSBzeXN0ZW1fc2VydmVyOiAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgZXZlbnRJZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KIAotc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6YWRkTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+JiBsaXN0ZW5lcikgeworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6YWRkTGlzdGVuZXIoY29uc3Qgc3A8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CiAgICAgQUxPR1YoIiVzOiBBZGQgbGlzdGVuZXIgJXAiLCBfX0ZVTkNUSU9OX18sIGxpc3RlbmVyLmdldCgpKTsKIAotICAgIGlmIChsaXN0ZW5lciA9PSAwKSB7CisgICAgaWYgKGxpc3RlbmVyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzOiBMaXN0ZW5lciBtdXN0IG5vdCBiZSBudWxsIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOwogCi0gICAgVmVjdG9yPHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+ID46Oml0ZXJhdG9yIGl0LCBlbmQ7Ci0gICAgZm9yIChpdCA9IG1MaXN0ZW5lckxpc3QuYmVnaW4oKTsgaXQgIT0gbUxpc3RlbmVyTGlzdC5lbmQoKTsgKytpdCkgewotICAgICAgICBpZiAoSUludGVyZmFjZTo6YXNCaW5kZXIoKml0KSA9PSBJSW50ZXJmYWNlOjphc0JpbmRlcihsaXN0ZW5lcikpIHsKLSAgICAgICAgICAgIEFMT0dXKCIlczogVHJpZWQgdG8gYWRkIGxpc3RlbmVyICVwIHdoaWNoIHdhcyBhbHJlYWR5IHN1YnNjcmliZWQiLAotICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBsaXN0ZW5lci5nZXQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU3RhdHVzTGlzdGVuZXJMb2NrKTsKKyAgICAgICAgZm9yIChhdXRvJiBpdCA6IG1MaXN0ZW5lckxpc3QpIHsKKyAgICAgICAgICAgIGlmIChJSW50ZXJmYWNlOjphc0JpbmRlcihpdCkgPT0gSUludGVyZmFjZTo6YXNCaW5kZXIobGlzdGVuZXIpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBUcmllZCB0byBhZGQgbGlzdGVuZXIgJXAgd2hpY2ggd2FzIGFscmVhZHkgc3Vic2NyaWJlZCIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBsaXN0ZW5lci5nZXQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgbUxpc3RlbmVyTGlzdC5wdXNoX2JhY2sobGlzdGVuZXIpOwogICAgIH0KIAotICAgIG1MaXN0ZW5lckxpc3QucHVzaF9iYWNrKGxpc3RlbmVyKTsKIAogICAgIC8qIEltbWVkaWF0ZWx5IHNpZ25hbCBjdXJyZW50IHN0YXR1cyB0byB0aGlzIGxpc3RlbmVyIG9ubHkgKi8KICAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBtKG1TdGF0dXNNdXRleCkgOwotICAgICAgICBpbnQgbnVtQ2FtcyA9IGdldE51bWJlck9mQ2FtZXJhcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNhbXM7ICsraSkgewotICAgICAgICAgICAgbGlzdGVuZXItPm9uU3RhdHVzQ2hhbmdlZChtU3RhdHVzTGlzdFtpXSwgaSk7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1DYW1lcmFTdGF0ZXNMb2NrKTsKKyAgICAgICAgZm9yIChhdXRvJiBpIDogbUNhbWVyYVN0YXRlcykgeworICAgICAgICAgICAgLy8gVE9ETzogVXBkYXRlIGJpbmRlciB0byB1c2UgU3RyaW5nMTYgZm9yIGNhbWVyYSBJRHMgYW5kIHJlbW92ZTsKKyAgICAgICAgICAgIGludCBpZCA9IGNhbWVyYUlkVG9JbnQoaS5maXJzdCk7CisgICAgICAgICAgICBpZiAoaWQgPT0gLTEpIGNvbnRpbnVlOworCisgICAgICAgICAgICBsaXN0ZW5lci0+b25TdGF0dXNDaGFuZ2VkKGkuc2Vjb25kLT5nZXRTdGF0dXMoKSwgaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSW1tZWRpYXRlbHkgc2lnbmFsIGN1cnJlbnQgdG9yY2ggc3RhdHVzIHRvIHRoaXMgbGlzdGVuZXIgb25seSAqLworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1Ub3JjaFN0YXR1c011dGV4KTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVG9yY2hTdGF0dXNNYXAuc2l6ZSgpOyBpKysgKSB7CisgICAgICAgICAgICBTdHJpbmcxNiBpZCA9IFN0cmluZzE2KG1Ub3JjaFN0YXR1c01hcC5rZXlBdChpKS5zdHJpbmcoKSk7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25Ub3JjaFN0YXR1c0NoYW5nZWQobVRvcmNoU3RhdHVzTWFwLnZhbHVlQXQoaSksIGlkKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiBPSzsKIH0KLXN0YXR1c190IENhbWVyYVNlcnZpY2U6OnJlbW92ZUxpc3RlbmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiYgbGlzdGVuZXIpIHsKKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6cmVtb3ZlTGlzdGVuZXIoY29uc3Qgc3A8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CiAgICAgQUxPR1YoIiVzOiBSZW1vdmUgbGlzdGVuZXIgJXAiLCBfX0ZVTkNUSU9OX18sIGxpc3RlbmVyLmdldCgpKTsKIAogICAgIGlmIChsaXN0ZW5lciA9PSAwKSB7CkBAIC0xMDU1LDExICsxMzc0LDEzIEBACiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOwogCi0gICAgVmVjdG9yPHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+ID46Oml0ZXJhdG9yIGl0OwotICAgIGZvciAoaXQgPSBtTGlzdGVuZXJMaXN0LmJlZ2luKCk7IGl0ICE9IG1MaXN0ZW5lckxpc3QuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgaWYgKElJbnRlcmZhY2U6OmFzQmluZGVyKCppdCkgPT0gSUludGVyZmFjZTo6YXNCaW5kZXIobGlzdGVuZXIpKSB7Ci0gICAgICAgICAgICBtTGlzdGVuZXJMaXN0LmVyYXNlKGl0KTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TdGF0dXNMaXN0ZW5lckxvY2spOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtTGlzdGVuZXJMaXN0LmJlZ2luKCk7IGl0ICE9IG1MaXN0ZW5lckxpc3QuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgIGlmIChJSW50ZXJmYWNlOjphc0JpbmRlcigqaXQpID09IElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKSkgeworICAgICAgICAgICAgICAgIG1MaXN0ZW5lckxpc3QuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMTA2OSwxMCArMTM5MCw3IEBACiAgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Z2V0TGVnYWN5UGFyYW1ldGVycygKLSAgICAgICAgICAgIGludCBjYW1lcmFJZCwKLSAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgIFN0cmluZzE2KiBwYXJhbWV0ZXJzKSB7CitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpnZXRMZWdhY3lQYXJhbWV0ZXJzKGludCBjYW1lcmFJZCwgLypvdXQqL1N0cmluZzE2KiBwYXJhbWV0ZXJzKSB7CiAgICAgQUxPR1YoIiVzOiBmb3IgY2FtZXJhIElEID0gJWQiLCBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkKTsKIAogICAgIGlmIChwYXJhbWV0ZXJzID09IE5VTEwpIHsKQEAgLTExMjcsNiArMTQ0NSw3IEBACiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzI6CisgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18zOgogICAgICAgICBBTE9HVigiJXM6IENhbWVyYSBpZCAlZCB1c2VzIEhBTDMuMiBvciBuZXdlciwgc3VwcG9ydHMgYXBpMS9hcGkyIGRpcmVjdGx5IiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkKTsKICAgICAgICAgcmV0dXJuIE9LOwpAQCAtMTE0MSwxNDAgKzE0NjAsMjgxIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIENhbWVyYVNlcnZpY2U6OnJlbW92ZUNsaWVudEJ5UmVtb3RlKGNvbnN0IHdwPElCaW5kZXI+JiByZW1vdGVCaW5kZXIpIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKLSAgICBMT0cxKCJDYW1lcmFTZXJ2aWNlOjpyZW1vdmVDbGllbnRCeVJlbW90ZSBFIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7Ci0KLSAgICAvLyBEZWNsYXJlIHRoaXMgYmVmb3JlIHRoZSBsb2NrIHRvIG1ha2UgYWJzb2x1dGVseSBzdXJlIHRoZQotICAgIC8vIGRlc3RydWN0b3Igd29uJ3QgYmUgY2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZC4KK3ZvaWQgQ2FtZXJhU2VydmljZTo6cmVtb3ZlQnlDbGllbnQoY29uc3QgQmFzaWNDbGllbnQqIGNsaWVudCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7Ci0KLSAgICBpbnQgb3V0SW5kZXg7Ci0gICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudCA9IGZpbmRDbGllbnRVbnNhZmUocmVtb3RlQmluZGVyLCBvdXRJbmRleCk7Ci0KLSAgICBpZiAoY2xpZW50ICE9IDApIHsKLSAgICAgICAgLy8gRm91bmQgb3VyIGNhbWVyYSwgY2xlYXIgYW5kIGxlYXZlLgotICAgICAgICBMT0cxKCJyZW1vdmVDbGllbnQ6IGNsZWFyIGNhbWVyYSAlZCIsIG91dEluZGV4KTsKLQotICAgICAgICBzcDxJQmluZGVyPiByZW1vdGUgPSBjbGllbnQtPmdldFJlbW90ZSgpOwotICAgICAgICBpZiAocmVtb3RlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHJlbW90ZS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1DbGllbnRbb3V0SW5kZXhdLmNsZWFyKCk7Ci0gICAgfSBlbHNlIHsKLQotICAgICAgICBzcDxQcm9DbGllbnQ+IGNsaWVudFBybyA9IGZpbmRQcm9DbGllbnRVbnNhZmUocmVtb3RlQmluZGVyKTsKLQotICAgICAgICBpZiAoY2xpZW50UHJvICE9IE5VTEwpIHsKLSAgICAgICAgICAgIC8vIEZvdW5kIG91ciBjYW1lcmEsIGNsZWFyIGFuZCBsZWF2ZS4KLSAgICAgICAgICAgIExPRzEoInJlbW92ZUNsaWVudDogY2xlYXIgcHJvICVwIiwgY2xpZW50UHJvLmdldCgpKTsKLQotICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoY2xpZW50UHJvLT5nZXRSZW1vdGVDYWxsYmFjaygpKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICBmb3IgKGF1dG8mIGkgOiBtQWN0aXZlQ2xpZW50TWFuYWdlci5nZXRBbGwoKSkgeworICAgICAgICBhdXRvIGNsaWVudFNwID0gaS0+Z2V0VmFsdWUoKTsKKyAgICAgICAgaWYgKGNsaWVudFNwLmdldCgpID09IGNsaWVudCkgeworICAgICAgICAgICAgbUFjdGl2ZUNsaWVudE1hbmFnZXIucmVtb3ZlKGkpOwogICAgICAgICB9CiAgICAgfQotCi0gICAgTE9HMSgiQ2FtZXJhU2VydmljZTo6cmVtb3ZlQ2xpZW50QnlSZW1vdGUgWCAocGlkICVkKSIsIGNhbGxpbmdQaWQpOwogfQogCi1zcDxDYW1lcmFTZXJ2aWNlOjpQcm9DbGllbnQ+IENhbWVyYVNlcnZpY2U6OmZpbmRQcm9DbGllbnRVbnNhZmUoCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3cDxJQmluZGVyPiYgY2FtZXJhQ2FsbGJhY2tzUmVtb3RlKQotewotICAgIHNwPFByb0NsaWVudD4gY2xpZW50UHJvOworYm9vbCBDYW1lcmFTZXJ2aWNlOjpldmljdENsaWVudElkQnlSZW1vdGUoY29uc3Qgd3A8SUJpbmRlcj4mIHJlbW90ZSkgeworICAgIGNvbnN0IGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IGludCBzZXJ2aWNlUGlkID0gZ2V0cGlkKCk7CisgICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIC8vIEFjcXVpcmUgbVNlcnZpY2VMb2NrIGFuZCBwcmV2ZW50IG90aGVyIGNsaWVudHMgZnJvbSBjb25uZWN0aW5nCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBdXRvQ29uZGl0aW9uTG9jaz4gbG9jayA9CisgICAgICAgICAgICAgICAgQXV0b0NvbmRpdGlvbkxvY2s6OndhaXRBbmRBY3F1aXJlKG1TZXJ2aWNlTG9ja1dyYXBwZXIpOwogCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtYmVyT2ZDYW1lcmFzOyArK2kpIHsKLSAgICAgICAgVmVjdG9yPHNpemVfdD4gcmVtb3ZlSWR4OwogCi0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbVByb0NsaWVudExpc3RbaV0uc2l6ZSgpOyArK2opIHsKLSAgICAgICAgICAgIHdwPFByb0NsaWVudD4gY2wgPSBtUHJvQ2xpZW50TGlzdFtpXVtqXTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3A8QmFzaWNDbGllbnQ+PiBldmljdGVkOworICAgICAgICBmb3IgKGF1dG8mIGkgOiBtQWN0aXZlQ2xpZW50TWFuYWdlci5nZXRBbGwoKSkgeworICAgICAgICAgICAgYXV0byBjbGllbnRTcCA9IGktPmdldFZhbHVlKCk7CisgICAgICAgICAgICBpZiAoY2xpZW50U3AuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRGVhZCBjbGllbnQgc3RpbGwgaW4gbUFjdGl2ZUNsaWVudE1hbmFnZXIuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICBtQWN0aXZlQ2xpZW50TWFuYWdlci5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVtb3RlID09IGNsaWVudFNwLT5nZXRSZW1vdGUoKSAmJiAoY2FsbGluZ1BpZCA9PSBzZXJ2aWNlUGlkIHx8CisgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdQaWQgPT0gY2xpZW50U3AtPmdldENsaWVudFBpZCgpKSkgeworICAgICAgICAgICAgICAgIG1BY3RpdmVDbGllbnRNYW5hZ2VyLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICBldmljdGVkLnB1c2hfYmFjayhjbGllbnRTcCk7CiAKLSAgICAgICAgICAgIHNwPFByb0NsaWVudD4gY2xTdHJvbmcgPSBjbC5wcm9tb3RlKCk7Ci0gICAgICAgICAgICBpZiAoY2xTdHJvbmcgIT0gTlVMTCAmJiBjbFN0cm9uZy0+Z2V0UmVtb3RlKCkgPT0gY2FtZXJhQ2FsbGJhY2tzUmVtb3RlKSB7Ci0gICAgICAgICAgICAgICAgY2xpZW50UHJvID0gY2xTdHJvbmc7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNsU3Ryb25nID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAvLyBtYXJrIHRvIGNsZWFuIHVwIGRlYWQgcHRyCi0gICAgICAgICAgICAgICAgcmVtb3ZlSWR4LnB1c2goaik7CisgICAgICAgICAgICAgICAgLy8gTm90aWZ5IHRoZSBjbGllbnQgb2YgZGlzY29ubmVjdGlvbgorICAgICAgICAgICAgICAgIGNsaWVudFNwLT5ub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcygpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vIHJlbW92ZSBzdGFsZSBwdHJzIChpbiByZXZlcnNlIHNvIHRoZSBpbmRpY2VzIGRvbnQgY2hhbmdlKQotICAgICAgICBmb3IgKHNzaXplX3QgaiA9IChzc2l6ZV90KXJlbW92ZUlkeC5zaXplKCkgLSAxOyBqID49IDA7IC0taikgewotICAgICAgICAgICAgbVByb0NsaWVudExpc3RbaV0ucmVtb3ZlQXQocmVtb3ZlSWR4W2pdKTsKKyAgICAgICAgLy8gRG8gbm90IGhvbGQgbVNlcnZpY2VMb2NrIHdoaWxlIGRpc2Nvbm5lY3RpbmcgY2xpZW50cywgYnV0IHJldGFpbiB0aGUgY29uZGl0aW9uIGJsb2NraW5nCisgICAgICAgIC8vIG90aGVyIGNsaWVudHMgZnJvbSBjb25uZWN0aW5nIGluIG1TZXJ2aWNlTG9ja1dyYXBwZXIgaWYgaGVsZAorICAgICAgICBtU2VydmljZUxvY2sudW5sb2NrKCk7CisKKyAgICAgICAgLy8gRG8gbm90IGNsZWFyIGNhbGxlciBpZGVudGl0eSwgcmVtb3RlIGNhbGxlciBzaG91bGQgYmUgY2xpZW50IHByb2NjZXNzCisKKyAgICAgICAgZm9yIChhdXRvJiBpIDogZXZpY3RlZCkgeworICAgICAgICAgICAgaWYgKGkuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGktPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICB9CisgICAgICAgIC8vIFJlYWNxdWlyZSBtU2VydmljZUxvY2sKKyAgICAgICAgbVNlcnZpY2VMb2NrLmxvY2soKTsKIAotICAgIHJldHVybiBjbGllbnRQcm87CisgICAgfSAvLyBsb2NrIGlzIGRlc3Ryb3llZCwgYWxsb3cgZnVydGhlciBjb25uZWN0IGNhbGxzCisKKyAgICByZXR1cm4gcmV0OwogfQogCi1zcDxDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudD4gQ2FtZXJhU2VydmljZTo6ZmluZENsaWVudFVuc2FmZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwPElCaW5kZXI+JiBjYW1lcmFDbGllbnQsIGludCYgb3V0SW5kZXgpIHsKLSAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50OwogCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtYmVyT2ZDYW1lcmFzOyBpKyspIHsKKy8qKgorICogQ2hlY2sgY2FtZXJhIGNhcGFiaWxpdGllcywgc3VjaCBhcyBzdXBwb3J0IGZvciBiYXNpYyBjb2xvciBvcGVyYXRpb24KKyAqLworaW50IENhbWVyYVNlcnZpY2U6OmNoZWNrQ2FtZXJhQ2FwYWJpbGl0aWVzKGludCBpZCwgY2FtZXJhX2luZm8gaW5mbywgaW50ICpsYXRlc3RTdHJhbmdlQ2FtZXJhSWQpIHsKIAotICAgICAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBoYXZlIGFscmVhZHkgZGlzY29ubmVjdGVkIChvciB0aGlzIGlzCi0gICAgICAgIC8vIGp1c3QgYW5vdGhlciB1bnVzZWQgY2FtZXJhKS4KLSAgICAgICAgaWYgKG1DbGllbnRbaV0gPT0gMCkgY29udGludWU7CisgICAgLy8gQXNzdW1lIGFsbCBkZXZpY2VzIHByZS12My4zIGFyZSBiYWNrd2FyZC1jb21wYXRpYmxlCisgICAgYm9vbCBpc0JhY2t3YXJkQ29tcGF0aWJsZSA9IHRydWU7CisgICAgaWYgKG1Nb2R1bGUtPmdldE1vZHVsZUFwaVZlcnNpb24oKSA+PSBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfMAorICAgICAgICAgICAgJiYgaW5mby5kZXZpY2VfdmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMykgeworICAgICAgICBpc0JhY2t3YXJkQ29tcGF0aWJsZSA9IGZhbHNlOworICAgICAgICBzdGF0dXNfdCByZXM7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGNhcHM7CisgICAgICAgIHJlcyA9IGZpbmRfY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5KAorICAgICAgICAgICAgaW5mby5zdGF0aWNfY2FtZXJhX2NoYXJhY3RlcmlzdGljcywKKyAgICAgICAgICAgIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTLAorICAgICAgICAgICAgJmNhcHMpOworICAgICAgICBpZiAocmVzICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogVW5hYmxlIHRvIGZpbmQgY2FtZXJhIGNhcGFiaWxpdGllcyBmb3IgY2FtZXJhIGRldmljZSAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQpOworICAgICAgICAgICAgY2Fwcy5jb3VudCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBzLmNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjYXBzLmRhdGEudThbaV0gPT0KKyAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfQkFDS1dBUkRfQ09NUEFUSUJMRSkgeworICAgICAgICAgICAgICAgIGlzQmFja3dhcmRDb21wYXRpYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotICAgICAgICAvLyBQcm9tb3RlIG1DbGllbnQuIEl0IGNhbiBmYWlsIGlmIHdlIGFyZSBjYWxsZWQgZnJvbSB0aGlzIHBhdGg6Ci0gICAgICAgIC8vIENsaWVudDo6fkNsaWVudCgpIC0+IGRpc2Nvbm5lY3QoKSAtPiByZW1vdmVDbGllbnRCeVJlbW90ZSgpLgotICAgICAgICBjbGllbnQgPSBtQ2xpZW50W2ldLnByb21vdGUoKTsKKyAgICBpZiAoIWlzQmFja3dhcmRDb21wYXRpYmxlKSB7CisgICAgICAgIG1OdW1iZXJPZk5vcm1hbENhbWVyYXMtLTsKKyAgICAgICAgKmxhdGVzdFN0cmFuZ2VDYW1lcmFJZCA9IGlkOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpZCA+ICpsYXRlc3RTdHJhbmdlQ2FtZXJhSWQpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogTm9ybWFsIGNhbWVyYSBJRCAlZCBoaWdoZXIgdGhhbiBzdHJhbmdlIGNhbWVyYSBJRCAlZC4gIgorICAgICAgICAgICAgICAgICAgICAiVGhpcyBpcyBub3QgYWxsb3dlZCBkdWUgYmFja3dhcmQtY29tcGF0aWJpbGl0eSByZXF1aXJlbWVudHMiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLCAqbGF0ZXN0U3RyYW5nZUNhbWVyYUlkKTsKKyAgICAgICAgICAgIGxvZ1NlcnZpY2VFcnJvcigiSW52YWxpZCBvcmRlciBvZiBjYW1lcmEgZGV2aWNlcyIsIEVOT0RFVik7CisgICAgICAgICAgICBtTnVtYmVyT2ZDYW1lcmFzID0gMDsKKyAgICAgICAgICAgIG1OdW1iZXJPZk5vcm1hbENhbWVyYXMgPSAwOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KIAotICAgICAgICAvLyBDbGVhbiB1cCBzdGFsZSBjbGllbnQgZW50cnkKLSAgICAgICAgaWYgKGNsaWVudCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtQ2xpZW50W2ldLmNsZWFyKCk7CitzdGQ6OnNoYXJlZF9wdHI8Q2FtZXJhU2VydmljZTo6Q2FtZXJhU3RhdGU+IENhbWVyYVNlcnZpY2U6OmdldENhbWVyYVN0YXRlKAorICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCkgY29uc3QgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDYW1lcmFTdGF0ZT4gc3RhdGU7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtQ2FtZXJhU3RhdGVzTG9jayk7CisgICAgICAgIGF1dG8gaXRlciA9IG1DYW1lcmFTdGF0ZXMuZmluZChjYW1lcmFJZCk7CisgICAgICAgIGlmIChpdGVyICE9IG1DYW1lcmFTdGF0ZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIHN0YXRlID0gaXRlci0+c2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0ZTsKK30KKworc3A8Q2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ+IENhbWVyYVNlcnZpY2U6OnJlbW92ZUNsaWVudExvY2tlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCkgeworICAgIC8vIFJlbW92ZSBmcm9tIGFjdGl2ZSBjbGllbnRzIGxpc3QKKyAgICBhdXRvIGNsaWVudERlc2NyaXB0b3JQdHIgPSBtQWN0aXZlQ2xpZW50TWFuYWdlci5yZW1vdmUoY2FtZXJhSWQpOworICAgIGlmIChjbGllbnREZXNjcmlwdG9yUHRyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzOiBDb3VsZCBub3QgZXZpY3QgY2xpZW50LCBubyBjbGllbnQgZm9yIGNhbWVyYSBJRCAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBzcDxCYXNpY0NsaWVudD57bnVsbHB0cn07CisgICAgfQorCisgICAgcmV0dXJuIGNsaWVudERlc2NyaXB0b3JQdHItPmdldFZhbHVlKCk7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6ZG9Vc2VyU3dpdGNoKGNvbnN0IGludDMyX3QqIG5ld1VzZXJJZCwgc2l6ZV90IGxlbmd0aCkgeworICAgIC8vIEFjcXVpcmUgbVNlcnZpY2VMb2NrIGFuZCBwcmV2ZW50IG90aGVyIGNsaWVudHMgZnJvbSBjb25uZWN0aW5nCisgICAgc3RkOjp1bmlxdWVfcHRyPEF1dG9Db25kaXRpb25Mb2NrPiBsb2NrID0KKyAgICAgICAgICAgIEF1dG9Db25kaXRpb25Mb2NrOjp3YWl0QW5kQWNxdWlyZShtU2VydmljZUxvY2tXcmFwcGVyKTsKKworICAgIHN0ZDo6c2V0PHVzZXJpZF90PiBuZXdBbGxvd2VkVXNlcnM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICBpZiAobmV3VXNlcklkW2ldIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBCYWQgdXNlciBJRCAlZCBnaXZlbiBkdXJpbmcgdXNlciBzd2l0Y2gsIGlnbm9yaW5nLiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbmV3VXNlcklkW2ldKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBuZXdBbGxvd2VkVXNlcnMuaW5zZXJ0KHN0YXRpY19jYXN0PHVzZXJpZF90PihuZXdVc2VySWRbaV0pKTsKKyAgICB9CisKKworICAgIGlmIChuZXdBbGxvd2VkVXNlcnMgPT0gbUFsbG93ZWRVc2VycykgeworICAgICAgICBBTE9HVygiJXM6IFJlY2VpdmVkIG5vdGlmaWNhdGlvbiBvZiB1c2VyIHN3aXRjaCB3aXRoIG5vIHVwZGF0ZWQgdXNlciBJRHMuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGxvZ1VzZXJTd2l0Y2gobUFsbG93ZWRVc2VycywgbmV3QWxsb3dlZFVzZXJzKTsKKworICAgIG1BbGxvd2VkVXNlcnMgPSBzdGQ6Om1vdmUobmV3QWxsb3dlZFVzZXJzKTsKKworICAgIC8vIEN1cnJlbnQgdXNlciBoYXMgc3dpdGNoZWQsIGV2aWN0IGFsbCBjdXJyZW50IGNsaWVudHMuCisgICAgc3RkOjp2ZWN0b3I8c3A8QmFzaWNDbGllbnQ+PiBldmljdGVkOworICAgIGZvciAoYXV0byYgaSA6IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldEFsbCgpKSB7CisgICAgICAgIGF1dG8gY2xpZW50U3AgPSBpLT5nZXRWYWx1ZSgpOworCisgICAgICAgIGlmIChjbGllbnRTcC5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IERlYWQgY2xpZW50IHN0aWxsIGluIG1BY3RpdmVDbGllbnRNYW5hZ2VyLiIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChjYW1lcmFDbGllbnQgPT0gY2xpZW50LT5nZXRSZW1vdGUoKSkgewotICAgICAgICAgICAgLy8gRm91bmQgb3VyIGNhbWVyYQotICAgICAgICAgICAgb3V0SW5kZXggPSBpOwotICAgICAgICAgICAgcmV0dXJuIGNsaWVudDsKKyAgICAgICAgLy8gRG9uJ3QgZXZpY3QgY2xpZW50cyB0aGF0IGFyZSBzdGlsbCBhbGxvd2VkLgorICAgICAgICB1aWRfdCBjbGllbnRVaWQgPSBjbGllbnRTcC0+Z2V0Q2xpZW50VWlkKCk7CisgICAgICAgIHVzZXJpZF90IGNsaWVudFVzZXJJZCA9IG11bHRpdXNlcl9nZXRfdXNlcl9pZChjbGllbnRVaWQpOworICAgICAgICBpZiAobUFsbG93ZWRVc2Vycy5maW5kKGNsaWVudFVzZXJJZCkgIT0gbUFsbG93ZWRVc2Vycy5lbmQoKSkgeworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KKworICAgICAgICBldmljdGVkLnB1c2hfYmFjayhjbGllbnRTcCk7CisKKyAgICAgICAgU3RyaW5nOCBjdXJUaW1lID0gZ2V0Rm9ybWF0dGVkQ3VycmVudFRpbWUoKTsKKworICAgICAgICBBTE9HRSgiRXZpY3RpbmcgY29uZmxpY3RpbmcgY2xpZW50IGZvciBjYW1lcmEgSUQgJXMgZHVlIHRvIHVzZXIgY2hhbmdlIiwKKyAgICAgICAgICAgICAgICBpLT5nZXRLZXkoKS5zdHJpbmcoKSk7CisKKyAgICAgICAgLy8gTG9nIHRoZSBjbGllbnRzIGV2aWN0ZWQKKyAgICAgICAgbG9nRXZlbnQoU3RyaW5nODo6Zm9ybWF0KCJFVklDVCBkZXZpY2UgJXMgY2xpZW50IGhlbGQgYnkgcGFja2FnZSAlcyAoUElEICUiCisgICAgICAgICAgICAgICAgUFJJZDMyICIsIHByaW9yaXR5ICUiIFBSSWQzMiAiKVxuICAgLSBFdmljdGVkIGR1ZSB0byB1c2VyIHN3aXRjaC4iLAorICAgICAgICAgICAgICAgIGktPmdldEtleSgpLnN0cmluZygpLCBTdHJpbmc4e2NsaWVudFNwLT5nZXRQYWNrYWdlTmFtZSgpfS5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBpLT5nZXRPd25lcklkKCksIGktPmdldFByaW9yaXR5KCkpKTsKKwogICAgIH0KIAotICAgIG91dEluZGV4ID0gLTE7Ci0gICAgcmV0dXJuIE5VTEw7CisgICAgLy8gRG8gbm90IGhvbGQgbVNlcnZpY2VMb2NrIHdoaWxlIGRpc2Nvbm5lY3RpbmcgY2xpZW50cywgYnV0IHJldGFpbiB0aGUgY29uZGl0aW9uCisgICAgLy8gYmxvY2tpbmcgb3RoZXIgY2xpZW50cyBmcm9tIGNvbm5lY3RpbmcgaW4gbVNlcnZpY2VMb2NrV3JhcHBlciBpZiBoZWxkLgorICAgIG1TZXJ2aWNlTG9jay51bmxvY2soKTsKKworICAgIC8vIENsZWFyIGNhbGxlciBpZGVudGl0eSB0ZW1wb3JhcmlseSBzbyBjbGllbnQgZGlzY29ubmVjdCBQSUQgY2hlY2tzIHdvcmsgY29ycmVjdGx5CisgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisKKyAgICBmb3IgKGF1dG8mIGkgOiBldmljdGVkKSB7CisgICAgICAgIGktPmRpc2Nvbm5lY3QoKTsKKyAgICB9CisKKyAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKworICAgIC8vIFJlYWNxdWlyZSBtU2VydmljZUxvY2sKKyAgICBtU2VydmljZUxvY2subG9jaygpOwogfQogCi1DYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudCogQ2FtZXJhU2VydmljZTo6Z2V0Q2xpZW50QnlJZFVuc2FmZShpbnQgY2FtZXJhSWQpIHsKLSAgICBpZiAoY2FtZXJhSWQgPCAwIHx8IGNhbWVyYUlkID49IG1OdW1iZXJPZkNhbWVyYXMpIHJldHVybiBOVUxMOwotICAgIHJldHVybiBtQ2xpZW50W2NhbWVyYUlkXS51bnNhZmVfZ2V0KCk7Cit2b2lkIENhbWVyYVNlcnZpY2U6OmxvZ0V2ZW50KGNvbnN0IGNoYXIqIGV2ZW50KSB7CisgICAgU3RyaW5nOCBjdXJUaW1lID0gZ2V0Rm9ybWF0dGVkQ3VycmVudFRpbWUoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9nTG9jayk7CisgICAgbUV2ZW50TG9nLmFkZChTdHJpbmc4Ojpmb3JtYXQoIiVzIDogJXMiLCBjdXJUaW1lLnN0cmluZygpLCBldmVudCkpOwogfQogCi1NdXRleCogQ2FtZXJhU2VydmljZTo6Z2V0Q2xpZW50TG9ja0J5SWQoaW50IGNhbWVyYUlkKSB7Ci0gICAgaWYgKGNhbWVyYUlkIDwgMCB8fCBjYW1lcmFJZCA+PSBtTnVtYmVyT2ZDYW1lcmFzKSByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gJm1DbGllbnRMb2NrW2NhbWVyYUlkXTsKK3ZvaWQgQ2FtZXJhU2VydmljZTo6bG9nRGlzY29ubmVjdGVkKGNvbnN0IGNoYXIqIGNhbWVyYUlkLCBpbnQgY2xpZW50UGlkLAorICAgICAgICBjb25zdCBjaGFyKiBjbGllbnRQYWNrYWdlKSB7CisgICAgLy8gTG9nIHRoZSBjbGllbnRzIGV2aWN0ZWQKKyAgICBsb2dFdmVudChTdHJpbmc4Ojpmb3JtYXQoIkRJU0NPTk5FQ1QgZGV2aWNlICVzIGNsaWVudCBmb3IgcGFja2FnZSAlcyAoUElEICVkKSIsIGNhbWVyYUlkLAorICAgICAgICAgICAgY2xpZW50UGFja2FnZSwgY2xpZW50UGlkKSk7CiB9CiAKLXNwPENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50PiBDYW1lcmFTZXJ2aWNlOjpnZXRDbGllbnRCeVJlbW90ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8SUJpbmRlcj4mIGNhbWVyYUNsaWVudCkgewotCi0gICAgLy8gRGVjbGFyZSB0aGlzIGJlZm9yZSB0aGUgbG9jayB0byBtYWtlIGFic29sdXRlbHkgc3VyZSB0aGUKLSAgICAvLyBkZXN0cnVjdG9yIHdvbid0IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrIGhlbGQuCi0gICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudDsKLQotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7Ci0KLSAgICBpbnQgb3V0SW5kZXg7Ci0gICAgY2xpZW50ID0gZmluZENsaWVudFVuc2FmZShjYW1lcmFDbGllbnQsIG91dEluZGV4KTsKLQotICAgIHJldHVybiBjbGllbnQ7Cit2b2lkIENhbWVyYVNlcnZpY2U6OmxvZ0Nvbm5lY3RlZChjb25zdCBjaGFyKiBjYW1lcmFJZCwgaW50IGNsaWVudFBpZCwKKyAgICAgICAgY29uc3QgY2hhciogY2xpZW50UGFja2FnZSkgeworICAgIC8vIExvZyB0aGUgY2xpZW50cyBldmljdGVkCisgICAgbG9nRXZlbnQoU3RyaW5nODo6Zm9ybWF0KCJDT05ORUNUIGRldmljZSAlcyBjbGllbnQgZm9yIHBhY2thZ2UgJXMgKFBJRCAlZCkiLCBjYW1lcmFJZCwKKyAgICAgICAgICAgIGNsaWVudFBhY2thZ2UsIGNsaWVudFBpZCkpOwogfQogCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpIHsKK3ZvaWQgQ2FtZXJhU2VydmljZTo6bG9nUmVqZWN0ZWQoY29uc3QgY2hhciogY2FtZXJhSWQsIGludCBjbGllbnRQaWQsCisgICAgICAgIGNvbnN0IGNoYXIqIGNsaWVudFBhY2thZ2UsIGNvbnN0IGNoYXIqIHJlYXNvbikgeworICAgIC8vIExvZyB0aGUgY2xpZW50IHJlamVjdGVkCisgICAgbG9nRXZlbnQoU3RyaW5nODo6Zm9ybWF0KCJSRUpFQ1QgZGV2aWNlICVzIGNsaWVudCBmb3IgcGFja2FnZSAlcyAoUElEICVkKSwgcmVhc29uOiAoJXMpIiwKKyAgICAgICAgICAgIGNhbWVyYUlkLCBjbGllbnRQYWNrYWdlLCBjbGllbnRQaWQsIHJlYXNvbikpOworfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OmxvZ1VzZXJTd2l0Y2goY29uc3Qgc3RkOjpzZXQ8dXNlcmlkX3Q+JiBvbGRVc2VySWRzLAorICAgICAgICBjb25zdCBzdGQ6OnNldDx1c2VyaWRfdD4mIG5ld1VzZXJJZHMpIHsKKyAgICBTdHJpbmc4IG5ld1VzZXJzID0gdG9TdHJpbmcobmV3VXNlcklkcyk7CisgICAgU3RyaW5nOCBvbGRVc2VycyA9IHRvU3RyaW5nKG9sZFVzZXJJZHMpOworICAgIC8vIExvZyB0aGUgbmV3IGFuZCBvbGQgdXNlcnMKKyAgICBsb2dFdmVudChTdHJpbmc4Ojpmb3JtYXQoIlVTRVJfU1dJVENIIHByZXZpb3VzIGFsbG93ZWQgdXNlcnM6ICVzICwgY3VycmVudCBhbGxvd2VkIHVzZXJzOiAlcyIsCisgICAgICAgICAgICBvbGRVc2Vycy5zdHJpbmcoKSwgbmV3VXNlcnMuc3RyaW5nKCkpKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpsb2dEZXZpY2VSZW1vdmVkKGNvbnN0IGNoYXIqIGNhbWVyYUlkLCBjb25zdCBjaGFyKiByZWFzb24pIHsKKyAgICAvLyBMb2cgdGhlIGRldmljZSByZW1vdmFsCisgICAgbG9nRXZlbnQoU3RyaW5nODo6Zm9ybWF0KCJSRU1PVkUgZGV2aWNlICVzLCByZWFzb246ICglcykiLCBjYW1lcmFJZCwgcmVhc29uKSk7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6bG9nRGV2aWNlQWRkZWQoY29uc3QgY2hhciogY2FtZXJhSWQsIGNvbnN0IGNoYXIqIHJlYXNvbikgeworICAgIC8vIExvZyB0aGUgZGV2aWNlIHJlbW92YWwKKyAgICBsb2dFdmVudChTdHJpbmc4Ojpmb3JtYXQoIkFERCBkZXZpY2UgJXMsIHJlYXNvbjogKCVzKSIsIGNhbWVyYUlkLCByZWFzb24pKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpsb2dDbGllbnREaWVkKGludCBjbGllbnRQaWQsIGNvbnN0IGNoYXIqIHJlYXNvbikgeworICAgIC8vIExvZyB0aGUgZGV2aWNlIHJlbW92YWwKKyAgICBsb2dFdmVudChTdHJpbmc4Ojpmb3JtYXQoIkRJRUQgY2xpZW50KHMpIHdpdGggUElEICVkLCByZWFzb246ICglcykiLCBjbGllbnRQaWQsIHJlYXNvbikpOworfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OmxvZ1NlcnZpY2VFcnJvcihjb25zdCBjaGFyKiBtc2csIGludCBlcnJvckNvZGUpIHsKKyAgICBTdHJpbmc4IGN1clRpbWUgPSBnZXRGb3JtYXR0ZWRDdXJyZW50VGltZSgpOworICAgIGxvZ0V2ZW50KFN0cmluZzg6OmZvcm1hdCgiU0VSVklDRSBFUlJPUjogJXMgOiAlZCAoJXMpIiwgbXNnLCBlcnJvckNvZGUsIHN0cmVycm9yKGVycm9yQ29kZSkpKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6b25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksCisgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7CisKKyAgICBjb25zdCBpbnQgcGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IGludCBzZWxmUGlkID0gZ2V0cGlkKCk7CisKICAgICAvLyBQZXJtaXNzaW9uIGNoZWNrcwogICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICBjYXNlIEJuQ2FtZXJhU2VydmljZTo6Q09OTkVDVDoKLSAgICAgICAgY2FzZSBCbkNhbWVyYVNlcnZpY2U6OkNPTk5FQ1RfUFJPOgogICAgICAgICBjYXNlIEJuQ2FtZXJhU2VydmljZTo6Q09OTkVDVF9ERVZJQ0U6Ci0gICAgICAgIGNhc2UgQm5DYW1lcmFTZXJ2aWNlOjpDT05ORUNUX0xFR0FDWToKLSAgICAgICAgICAgIGNvbnN0IGludCBwaWQgPSBnZXRDYWxsaW5nUGlkKCk7Ci0gICAgICAgICAgICBjb25zdCBpbnQgc2VsZl9waWQgPSBnZXRwaWQoKTsKLSAgICAgICAgICAgIGlmIChwaWQgIT0gc2VsZl9waWQpIHsKKyAgICAgICAgY2FzZSBCbkNhbWVyYVNlcnZpY2U6OkNPTk5FQ1RfTEVHQUNZOiB7CisgICAgICAgICAgICBpZiAocGlkICE9IHNlbGZQaWQpIHsKICAgICAgICAgICAgICAgICAvLyB3ZSdyZSBjYWxsZWQgZnJvbSBhIGRpZmZlcmVudCBwcm9jZXNzLCBkbyB0aGUgcmVhbCBjaGVjawogICAgICAgICAgICAgICAgIGlmICghY2hlY2tDYWxsaW5nUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FNRVJBIikpKSB7CkBAIC0xMjg1LDI5ICsxNzQ1LDI2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBCbkNhbWVyYVNlcnZpY2U6Ok5PVElGWV9TWVNURU1fRVZFTlQ6IHsKKyAgICAgICAgICAgIGlmIChwaWQgIT0gc2VsZlBpZCkgeworICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB3ZSdyZSBiZWluZyBjYWxsZWQgYnkgc3lzdGVtX3NlcnZlciwgb3Igc2ltaWxhciBwcm9jZXNzIHdpdGgKKyAgICAgICAgICAgICAgICAvLyBwZXJtaXNzaW9ucyB0byBub3RpZnkgdGhlIGNhbWVyYSBzZXJ2aWNlIGFib3V0IHN5c3RlbSBldmVudHMKKyAgICAgICAgICAgICAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9TRU5EX1NZU1RFTV9FVkVOVFMiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHVpZCA9IGdldENhbGxpbmdVaWQoKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlBlcm1pc3Npb24gRGVuaWFsOiBjYW5ub3Qgc2VuZCB1cGRhdGVzIHRvIGNhbWVyYSBzZXJ2aWNlIGFib3V0IHN5c3RlbSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGV2ZW50cyBmcm9tIHBpZD0lZCwgdWlkPSVkIiwgcGlkLCB1aWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gQm5DYW1lcmFTZXJ2aWNlOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiB9CiAKLS8vIFRoZSByZWFzb24gd2UgbmVlZCB0aGlzIGJ1c3kgYml0IGlzIGEgbmV3IENhbWVyYVNlcnZpY2U6OmNvbm5lY3QoKSByZXF1ZXN0Ci0vLyBtYXkgY29tZSBpbiB3aGlsZSB0aGUgcHJldmlvdXMgQ2xpZW50J3MgZGVzdHJ1Y3RvciBoYXMgbm90IGJlZW4gcnVuIG9yIGlzCi0vLyBzdGlsbCBydW5uaW5nLiBJZiB0aGUgbGFzdCBzdHJvbmcgcmVmZXJlbmNlIG9mIHRoZSBwcmV2aW91cyBDbGllbnQgaXMgZ29uZQotLy8gYnV0IHRoZSBkZXN0cnVjdG9yIGhhcyBub3QgYmVlbiBmaW5pc2hlZCwgd2Ugc2hvdWxkIG5vdCBhbGxvdyB0aGUgbmV3IENsaWVudAotLy8gdG8gYmUgY3JlYXRlZCBiZWNhdXNlIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIHByZXZpb3VzIENsaWVudCB0byB0ZWFyIGRvd24KLS8vIHRoZSBoYXJkd2FyZSBmaXJzdC4KLXZvaWQgQ2FtZXJhU2VydmljZTo6c2V0Q2FtZXJhQnVzeShpbnQgY2FtZXJhSWQpIHsKLSAgICBhbmRyb2lkX2F0b21pY193cml0ZSgxLCAmbUJ1c3lbY2FtZXJhSWRdKTsKLQotICAgIEFMT0dWKCJzZXRDYW1lcmFCdXN5IGNhbWVyYUlkPSVkIiwgY2FtZXJhSWQpOwotfQotCi12b2lkIENhbWVyYVNlcnZpY2U6OnNldENhbWVyYUZyZWUoaW50IGNhbWVyYUlkKSB7Ci0gICAgYW5kcm9pZF9hdG9taWNfd3JpdGUoMCwgJm1CdXN5W2NhbWVyYUlkXSk7Ci0KLSAgICBBTE9HVigic2V0Q2FtZXJhRnJlZSBjYW1lcmFJZD0lZCIsIGNhbWVyYUlkKTsKLX0KLQogLy8gV2Ugc2hhcmUgdGhlIG1lZGlhIHBsYXllcnMgZm9yIHNodXR0ZXIgYW5kIHJlY29yZGluZyBzb3VuZCBmb3IgYWxsIGNsaWVudHMuCiAvLyBBIHJlZmVyZW5jZSBjb3VudCBpcyBrZXB0IHRvIGRldGVybWluZSB3aGVuIHdlIHdpbGwgYWN0dWFsbHkgcmVsZWFzZSB0aGUKIC8vIG1lZGlhIHBsYXllcnMuCkBAIC0xMzc2LDcgKzE4MzMsNiBAQAogCiAgICAgbVJlbW90ZUNhbGxiYWNrID0gY2FtZXJhQ2xpZW50OwogCi0gICAgY2FtZXJhU2VydmljZS0+c2V0Q2FtZXJhQnVzeShjYW1lcmFJZCk7CiAgICAgY2FtZXJhU2VydmljZS0+bG9hZFNvdW5kKCk7CiAKICAgICBMT0cxKCJDbGllbnQ6OkNsaWVudCBYIChwaWQgJWQsIGlkICVkKSIsIGNhbGxpbmdQaWQsIGNhbWVyYUlkKTsKQEAgLTEzOTgsNyArMTg1NCw3IEBACiAgICAgICAgIGludCBjYW1lcmFJZCwgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgaW50IGNsaWVudFBpZCwgdWlkX3QgY2xpZW50VWlkLAogICAgICAgICBpbnQgc2VydmljZVBpZCk6Ci0gICAgICAgIG1DbGllbnRQYWNrYWdlTmFtZShjbGllbnRQYWNrYWdlTmFtZSkKKyAgICAgICAgbUNsaWVudFBhY2thZ2VOYW1lKGNsaWVudFBhY2thZ2VOYW1lKSwgbURpc2Nvbm5lY3RlZChmYWxzZSkKIHsKICAgICBtQ2FtZXJhU2VydmljZSA9IGNhbWVyYVNlcnZpY2U7CiAgICAgbVJlbW90ZUJpbmRlciA9IHJlbW90ZUNhbGxiYWNrOwpAQCAtMTQxNywxMCArMTg3MywyNSBAQAogfQogCiB2b2lkIENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50OjpkaXNjb25uZWN0KCkgewotICAgIEFMT0dWKCJCYXNpY0NsaWVudDo6ZGlzY29ubmVjdCIpOwotICAgIG1DYW1lcmFTZXJ2aWNlLT5yZW1vdmVDbGllbnRCeVJlbW90ZShtUmVtb3RlQmluZGVyKTsKKyAgICBpZiAobURpc2Nvbm5lY3RlZCkgeworICAgICAgICBBTE9HRSgiJXM6IERpc2Nvbm5lY3QgY2FsbGVkIG9uIGFscmVhZHkgZGlzY29ubmVjdGVkIGNsaWVudCBmb3IgZGV2aWNlICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIG1DYW1lcmFJZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbURpc2Nvbm5lY3RlZCA9IHRydWU7OworCisgICAgbUNhbWVyYVNlcnZpY2UtPnJlbW92ZUJ5Q2xpZW50KHRoaXMpOworICAgIG1DYW1lcmFTZXJ2aWNlLT5sb2dEaXNjb25uZWN0ZWQoU3RyaW5nODo6Zm9ybWF0KCIlZCIsIG1DYW1lcmFJZCksIG1DbGllbnRQaWQsCisgICAgICAgICAgICBTdHJpbmc4KG1DbGllbnRQYWNrYWdlTmFtZSkpOworCisgICAgc3A8SUJpbmRlcj4gcmVtb3RlID0gZ2V0UmVtb3RlKCk7CisgICAgaWYgKHJlbW90ZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJlbW90ZS0+dW5saW5rVG9EZWF0aChtQ2FtZXJhU2VydmljZSk7CisgICAgfQogCiAgICAgZmluaXNoQ2FtZXJhT3BzKCk7CisgICAgQUxPR0koIiVzOiBEaXNjb25uZWN0ZWQgY2xpZW50IGZvciBjYW1lcmEgJWQgZm9yIFBJRCAlZCIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBtQ2xpZW50UGlkKTsKKwogICAgIC8vIGNsaWVudCBzaG91bGRuJ3QgYmUgYWJsZSB0byBjYWxsIGludG8gdXMgYW55bW9yZQogICAgIG1DbGllbnRQaWQgPSAwOwogfQpAQCAtMTQzMyw2ICsxOTA0LDI0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitTdHJpbmcxNiBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudDo6Z2V0UGFja2FnZU5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1DbGllbnRQYWNrYWdlTmFtZTsKK30KKworCitpbnQgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ6OmdldENsaWVudFBpZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNsaWVudFBpZDsKK30KKwordWlkX3QgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ6OmdldENsaWVudFVpZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNsaWVudFVpZDsKK30KKworYm9vbCBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudDo6Y2FuQ2FzdFRvQXBpQ2xpZW50KGFwaUxldmVsIGxldmVsKSBjb25zdCB7CisgICAgLy8gRGVmYXVsdHMgdG8gQVBJMi4KKyAgICByZXR1cm4gbGV2ZWwgPT0gQVBJXzI7Cit9CisKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50OjpzdGFydENhbWVyYU9wcygpIHsKICAgICBpbnQzMl90IHJlczsKICAgICAvLyBOb3RpZnkgYXBwIG9wcyB0aGF0IHRoZSBjYW1lcmEgaXMgbm90IGF2YWlsYWJsZQpAQCAtMTQ0OCwxNyArMTkzNywyNCBAQAogICAgIHJlcyA9IG1BcHBPcHNNYW5hZ2VyLnN0YXJ0T3AoQXBwT3BzTWFuYWdlcjo6T1BfQ0FNRVJBLAogICAgICAgICAgICAgbUNsaWVudFVpZCwgbUNsaWVudFBhY2thZ2VOYW1lKTsKIAotICAgIGlmIChyZXMgIT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9BTExPV0VEKSB7CisgICAgaWYgKHJlcyA9PSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0VSUk9SRUQpIHsKICAgICAgICAgQUxPR0koIkNhbWVyYSAlZDogQWNjZXNzIGZvciBcIiVzXCIgaGFzIGJlZW4gcmV2b2tlZCIsCiAgICAgICAgICAgICAgICAgbUNhbWVyYUlkLCBTdHJpbmc4KG1DbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCkpOwogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCisgICAgaWYgKHJlcyA9PSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0lHTk9SRUQpIHsKKyAgICAgICAgQUxPR0koIkNhbWVyYSAlZDogQWNjZXNzIGZvciBcIiVzXCIgaGFzIGJlZW4gcmVzdHJpY3RlZCIsCisgICAgICAgICAgICAgICAgbUNhbWVyYUlkLCBTdHJpbmc4KG1DbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCkpOworICAgICAgICAvLyBSZXR1cm4gdGhlIHNhbWUgZXJyb3IgYXMgZm9yIGRldmljZSBwb2xpY3kgbWFuYWdlciByZWplY3Rpb24KKyAgICAgICAgcmV0dXJuIC1FQUNDRVM7CisgICAgfQorCiAgICAgbU9wc0FjdGl2ZSA9IHRydWU7CiAKICAgICAvLyBUcmFuc2l0aW9uIGRldmljZSBhdmFpbGFiaWxpdHkgbGlzdGVuZXJzIGZyb20gUFJFU0VOVCAtPiBOT1RfQVZBSUxBQkxFCiAgICAgbUNhbWVyYVNlcnZpY2UtPnVwZGF0ZVN0YXR1cyhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX0FWQUlMQUJMRSwKLSAgICAgICAgICAgIG1DYW1lcmFJZCk7CisgICAgICAgICAgICBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgbUNhbWVyYUlkKSk7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xNDcxLDE5ICsxOTY3LDE2IEBACiAgICAgICAgICAgICAgICAgbUNsaWVudFBhY2thZ2VOYW1lKTsKICAgICAgICAgbU9wc0FjdGl2ZSA9IGZhbHNlOwogCi0gICAgICAgIC8vIE5vdGlmeSBkZXZpY2UgYXZhaWxhYmlsaXR5IGxpc3RlbmVycyB0aGF0IHRoaXMgY2FtZXJhIGlzIGF2YWlsYWJsZQotICAgICAgICAvLyBhZ2FpbgorICAgICAgICBhdXRvIHJlamVjdGVkID0ge0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19OT1RfUFJFU0VOVCwKKyAgICAgICAgICAgICAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfRU5VTUVSQVRJTkd9OwogCi0gICAgICAgIFN0YXR1c1ZlY3RvciByZWplY3RTb3VyY2VTdGF0ZXM7Ci0gICAgICAgIHJlamVjdFNvdXJjZVN0YXRlcy5wdXNoX2JhY2soSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9QUkVTRU5UKTsKLSAgICAgICAgcmVqZWN0U291cmNlU3RhdGVzLnB1c2hfYmFjayhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfRU5VTUVSQVRJTkcpOwotCi0gICAgICAgIC8vIFRyYW5zaXRpb24gdG8gUFJFU0VOVCBpZiB0aGUgY2FtZXJhIGlzIG5vdCBpbiBlaXRoZXIgb2YgYWJvdmUgMgotICAgICAgICAvLyBzdGF0ZXMKKyAgICAgICAgLy8gVHJhbnNpdGlvbiB0byBQUkVTRU5UIGlmIHRoZSBjYW1lcmEgaXMgbm90IGluIGVpdGhlciBvZiB0aGUgcmVqZWN0ZWQgc3RhdGVzCiAgICAgICAgIG1DYW1lcmFTZXJ2aWNlLT51cGRhdGVTdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX1BSRVNFTlQsCi0gICAgICAgICAgICAgICAgbUNhbWVyYUlkLAotICAgICAgICAgICAgICAgICZyZWplY3RTb3VyY2VTdGF0ZXMpOworICAgICAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiJWQiLCBtQ2FtZXJhSWQpLCByZWplY3RlZCk7CiAKKyAgICAgICAgLy8gTm90aWZ5IGZsYXNobGlnaHQgdGhhdCBhIGNhbWVyYSBkZXZpY2UgaXMgY2xvc2VkLgorICAgICAgICBtQ2FtZXJhU2VydmljZS0+bUZsYXNobGlnaHQtPmRldmljZUNsb3NlZCgKKyAgICAgICAgICAgICAgICBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgbUNhbWVyYUlkKSk7CiAgICAgfQogICAgIC8vIEFsd2F5cyBzdG9wIHdhdGNoaW5nLCBldmVuIGlmIG5vIGNhbWVyYSBvcCBpcyBhY3RpdmUKICAgICBpZiAobU9wc0NhbGxiYWNrICE9IE5VTEwpIHsKQEAgLTE1MjYsMjYgKzIwMTksMTUgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1NdXRleCogQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpnZXRDbGllbnRMb2NrRnJvbUNvb2tpZSh2b2lkKiB1c2VyKSB7Ci0gICAgcmV0dXJuIGdDYW1lcmFTZXJ2aWNlLT5nZXRDbGllbnRMb2NrQnlJZCgoaW50KShpbnRwdHJfdCkgdXNlcik7Ci19Ci0KLS8vIFByb3ZpZGUgY2xpZW50IHBvaW50ZXIgZm9yIGNhbGxiYWNrcy4gQ2xpZW50IGxvY2sgcmV0dXJuZWQgZnJvbSBnZXRDbGllbnRMb2NrRnJvbUNvb2tpZSBzaG91bGQKLS8vIGJlIGFjcXVpcmVkIGZvciB0aGlzIHRvIGJlIHNhZmUKLUNhbWVyYVNlcnZpY2U6OkNsaWVudCogQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpnZXRDbGllbnRGcm9tQ29va2llKHZvaWQqIHVzZXIpIHsKLSAgICBCYXNpY0NsaWVudCAqYmFzaWNDbGllbnQgPSBnQ2FtZXJhU2VydmljZS0+Z2V0Q2xpZW50QnlJZFVuc2FmZSgoaW50KShpbnRwdHJfdCkgdXNlcik7Ci0gICAgLy8gT0s6IG9ubHkgQ2FtZXJhQ2xpZW50IGNhbGxzIHRoaXMsIGFuZCB0aGV5IGFscmVhZHkgY2FzdCBhbnl3YXkuCi0gICAgQ2xpZW50KiBjbGllbnQgPSBzdGF0aWNfY2FzdDxDbGllbnQqPihiYXNpY0NsaWVudCk7Ci0KLSAgICAvLyBUaGlzIGNvdWxkIGhhcHBlbiBpZiB0aGUgQ2xpZW50IGlzIGluIHRoZSBwcm9jZXNzIG9mIHNodXR0aW5nIGRvd24gKHRoZQotICAgIC8vIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZSBpcyBnb25lLCBidXQgdGhlIGRlc3RydWN0b3IgaGFzbid0IGZpbmlzaGVkCi0gICAgLy8gc3RvcHBpbmcgdGhlIGhhcmR3YXJlKS4KLSAgICBpZiAoY2xpZW50ID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgLy8gZGVzdHJ1Y3Rpb24gYWxyZWFkeSBzdGFydGVkLCBzbyBzaG91bGQgbm90IGJlIGFjY2Vzc2VkCi0gICAgaWYgKGNsaWVudC0+bURlc3RydWN0aW9uU3RhcnRlZCkgcmV0dXJuIE5VTEw7Ci0KLSAgICByZXR1cm4gY2xpZW50OworLy8gUHJvdmlkZSBjbGllbnQgc3Ryb25nIHBvaW50ZXIgZm9yIGNhbGxiYWNrcy4KK3NwPENhbWVyYVNlcnZpY2U6OkNsaWVudD4gQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpnZXRDbGllbnRGcm9tQ29va2llKHZvaWQqIHVzZXIpIHsKKyAgICBTdHJpbmc4IGNhbWVyYUlkID0gU3RyaW5nODo6Zm9ybWF0KCIlZCIsIChpbnQpKGludHB0cl90KSB1c2VyKTsKKyAgICBhdXRvIGNsaWVudERlc2NyaXB0b3IgPSBnQ2FtZXJhU2VydmljZS0+bUFjdGl2ZUNsaWVudE1hbmFnZXIuZ2V0KGNhbWVyYUlkKTsKKyAgICBpZiAoY2xpZW50RGVzY3JpcHRvciAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBzcDxDbGllbnQ+eworICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENsaWVudCo+KGNsaWVudERlc2NyaXB0b3ItPmdldFZhbHVlKCkuZ2V0KCkpfTsKKyAgICB9CisgICAgcmV0dXJuIHNwPENsaWVudD57bnVsbHB0cn07CiB9CiAKIHZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50Ojpub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLApAQCAtMTU1Nyw3ICsyMDM5LDEwIEBACiB2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6ZGlzY29ubmVjdCgpIHsKICAgICBBTE9HVigiQ2xpZW50OjpkaXNjb25uZWN0Iik7CiAgICAgQmFzaWNDbGllbnQ6OmRpc2Nvbm5lY3QoKTsKLSAgICBtQ2FtZXJhU2VydmljZS0+c2V0Q2FtZXJhRnJlZShtQ2FtZXJhSWQpOworfQorCitib29sIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6Y2FuQ2FzdFRvQXBpQ2xpZW50KGFwaUxldmVsIGxldmVsKSBjb25zdCB7CisgICAgcmV0dXJuIGxldmVsID09IEFQSV8xOwogfQogCiBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6Ok9wc0NhbGxiYWNrOjpPcHNDYWxsYmFjayh3cDxCYXNpY0NsaWVudD4gY2xpZW50KToKQEAgLTE1NzMsMzAgKzIwNTgsMTM4IEBACiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICAgICAgICAgICAgICAgICAgSVByb0NhbWVyYQorLy8gICAgICAgICAgICAgICAgICBDYW1lcmFTdGF0ZQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1DYW1lcmFTZXJ2aWNlOjpQcm9DbGllbnQ6OlByb0NsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKLSAgICAgICAgY29uc3Qgc3A8SVByb0NhbWVyYUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAotICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgIGludCBjYW1lcmFJZCwKLSAgICAgICAgaW50IGNhbWVyYUZhY2luZywKLSAgICAgICAgaW50IGNsaWVudFBpZCwKLSAgICAgICAgdWlkX3QgY2xpZW50VWlkLAotICAgICAgICBpbnQgc2VydmljZVBpZCkKLSAgICAgICAgOiBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudChjYW1lcmFTZXJ2aWNlLCBJSW50ZXJmYWNlOjphc0JpbmRlcihyZW1vdGVDYWxsYmFjayksCi0gICAgICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIGNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsCi0gICAgICAgICAgICAgICAgY2xpZW50UGlkLCAgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKQotewotICAgIG1SZW1vdGVDYWxsYmFjayA9IHJlbW90ZUNhbGxiYWNrOworQ2FtZXJhU2VydmljZTo6Q2FtZXJhU3RhdGU6OkNhbWVyYVN0YXRlKGNvbnN0IFN0cmluZzgmIGlkLCBpbnQgY29zdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzZXQ8U3RyaW5nOD4mIGNvbmZsaWN0aW5nKSA6IG1JZChpZCksCisgICAgICAgIG1TdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX1BSRVNFTlQpLCBtQ29zdChjb3N0KSwgbUNvbmZsaWN0aW5nKGNvbmZsaWN0aW5nKSB7fQorCitDYW1lcmFTZXJ2aWNlOjpDYW1lcmFTdGF0ZTo6fkNhbWVyYVN0YXRlKCkge30KKworSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzIENhbWVyYVNlcnZpY2U6OkNhbWVyYVN0YXRlOjpnZXRTdGF0dXMoKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN0YXR1c0xvY2spOworICAgIHJldHVybiBtU3RhdHVzOwogfQogCi1DYW1lcmFTZXJ2aWNlOjpQcm9DbGllbnQ6On5Qcm9DbGllbnQoKSB7CitDYW1lcmFQYXJhbWV0ZXJzIENhbWVyYVNlcnZpY2U6OkNhbWVyYVN0YXRlOjpnZXRTaGltUGFyYW1zKCkgY29uc3QgeworICAgIHJldHVybiBtU2hpbVBhcmFtczsKIH0KIAotdm9pZCBDYW1lcmFTZXJ2aWNlOjpQcm9DbGllbnQ6Om5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCi0gICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgewotICAgIG1SZW1vdGVDYWxsYmFjay0+bm90aWZ5Q2FsbGJhY2soQ0FNRVJBX01TR19FUlJPUiwgQ0FNRVJBX0VSUk9SX1JFTEVBU0VELCAwKTsKK3ZvaWQgQ2FtZXJhU2VydmljZTo6Q2FtZXJhU3RhdGU6OnNldFNoaW1QYXJhbXMoY29uc3QgQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKSB7CisgICAgbVNoaW1QYXJhbXMgPSBwYXJhbXM7Cit9CisKK2ludCBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFTdGF0ZTo6Z2V0Q29zdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNvc3Q7Cit9CisKK3N0ZDo6c2V0PFN0cmluZzg+IENhbWVyYVNlcnZpY2U6OkNhbWVyYVN0YXRlOjpnZXRDb25mbGljdGluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNvbmZsaWN0aW5nOworfQorCitTdHJpbmc4IENhbWVyYVNlcnZpY2U6OkNhbWVyYVN0YXRlOjpnZXRJZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUlkOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICAgICAgICAgICAgIENsaWVudEV2ZW50TGlzdGVuZXIKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnRFdmVudExpc3RlbmVyOjpvbkNsaWVudEFkZGVkKAorICAgICAgICBjb25zdCByZXNvdXJjZV9wb2xpY3k6OkNsaWVudERlc2NyaXB0b3I8U3RyaW5nOCwKKyAgICAgICAgc3A8Q2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ+PiYgZGVzY3JpcHRvcikgeworICAgIGF1dG8gYmFzaWNDbGllbnQgPSBkZXNjcmlwdG9yLmdldFZhbHVlKCk7CisgICAgaWYgKGJhc2ljQ2xpZW50LmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgQmF0dGVyeU5vdGlmaWVyJiBub3RpZmllcihCYXR0ZXJ5Tm90aWZpZXI6OmdldEluc3RhbmNlKCkpOworICAgICAgICBub3RpZmllci5ub3RlU3RhcnRDYW1lcmEoZGVzY3JpcHRvci5nZXRLZXkoKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGJhc2ljQ2xpZW50LT5nZXRDbGllbnRVaWQoKSkpOworICAgIH0KK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnRFdmVudExpc3RlbmVyOjpvbkNsaWVudFJlbW92ZWQoCisgICAgICAgIGNvbnN0IHJlc291cmNlX3BvbGljeTo6Q2xpZW50RGVzY3JpcHRvcjxTdHJpbmc4LAorICAgICAgICBzcDxDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudD4+JiBkZXNjcmlwdG9yKSB7CisgICAgYXV0byBiYXNpY0NsaWVudCA9IGRlc2NyaXB0b3IuZ2V0VmFsdWUoKTsKKyAgICBpZiAoYmFzaWNDbGllbnQuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBCYXR0ZXJ5Tm90aWZpZXImIG5vdGlmaWVyKEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKSk7CisgICAgICAgIG5vdGlmaWVyLm5vdGVTdG9wQ2FtZXJhKGRlc2NyaXB0b3IuZ2V0S2V5KCksCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihiYXNpY0NsaWVudC0+Z2V0Q2xpZW50VWlkKCkpKTsKKyAgICB9Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgICAgICAgICBDYW1lcmFDbGllbnRNYW5hZ2VyCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NhbWVyYVNlcnZpY2U6OkNhbWVyYUNsaWVudE1hbmFnZXI6OkNhbWVyYUNsaWVudE1hbmFnZXIoKSB7CisgICAgc2V0TGlzdGVuZXIoc3RkOjptYWtlX3NoYXJlZDxDbGllbnRFdmVudExpc3RlbmVyPigpKTsKK30KKworQ2FtZXJhU2VydmljZTo6Q2FtZXJhQ2xpZW50TWFuYWdlcjo6fkNhbWVyYUNsaWVudE1hbmFnZXIoKSB7fQorCitzcDxDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudD4gQ2FtZXJhU2VydmljZTo6Q2FtZXJhQ2xpZW50TWFuYWdlcjo6Z2V0Q2FtZXJhQ2xpZW50KAorICAgICAgICBjb25zdCBTdHJpbmc4JiBpZCkgY29uc3QgeworICAgIGF1dG8gZGVzY3JpcHRvciA9IGdldChpZCk7CisgICAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gc3A8QmFzaWNDbGllbnQ+e251bGxwdHJ9OworICAgIH0KKyAgICByZXR1cm4gZGVzY3JpcHRvci0+Z2V0VmFsdWUoKTsKK30KKworU3RyaW5nOCBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFDbGllbnRNYW5hZ2VyOjp0b1N0cmluZygpIGNvbnN0IHsKKyAgICBhdXRvIGFsbCA9IGdldEFsbCgpOworICAgIFN0cmluZzggcmV0KCJbIik7CisgICAgYm9vbCBoYXNBbnkgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8mIGkgOiBhbGwpIHsKKyAgICAgICAgaGFzQW55ID0gdHJ1ZTsKKyAgICAgICAgU3RyaW5nOCBrZXkgPSBpLT5nZXRLZXkoKTsKKyAgICAgICAgaW50MzJfdCBjb3N0ID0gaS0+Z2V0Q29zdCgpOworICAgICAgICBpbnQzMl90IHBpZCA9IGktPmdldE93bmVySWQoKTsKKyAgICAgICAgaW50MzJfdCBwcmlvcml0eSA9IGktPmdldFByaW9yaXR5KCk7CisgICAgICAgIGF1dG8gY29uZmxpY3RpbmcgPSBpLT5nZXRDb25mbGljdGluZygpOworICAgICAgICBhdXRvIGNsaWVudFNwID0gaS0+Z2V0VmFsdWUoKTsKKyAgICAgICAgU3RyaW5nOCBwYWNrYWdlTmFtZTsKKyAgICAgICAgdXNlcmlkX3QgY2xpZW50VXNlcklkID0gMDsKKyAgICAgICAgaWYgKGNsaWVudFNwLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gU3RyaW5nOHtjbGllbnRTcC0+Z2V0UGFja2FnZU5hbWUoKX07CisgICAgICAgICAgICB1aWRfdCBjbGllbnRVaWQgPSBjbGllbnRTcC0+Z2V0Q2xpZW50VWlkKCk7CisgICAgICAgICAgICBjbGllbnRVc2VySWQgPSBtdWx0aXVzZXJfZ2V0X3VzZXJfaWQoY2xpZW50VWlkKTsKKyAgICAgICAgfQorICAgICAgICByZXQuYXBwZW5kRm9ybWF0KCJcbihDYW1lcmEgSUQ6ICVzLCBDb3N0OiAlIiBQUklkMzIgIiwgUElEOiAlIiBQUklkMzIgIiwgUHJpb3JpdHk6ICUiCisgICAgICAgICAgICAgICAgUFJJZDMyICIsICIsIGtleS5zdHJpbmcoKSwgY29zdCwgcGlkLCBwcmlvcml0eSk7CisKKyAgICAgICAgaWYgKGNsaWVudFNwLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldC5hcHBlbmRGb3JtYXQoIlVzZXIgSWQ6ICVkLCAiLCBjbGllbnRVc2VySWQpOworICAgICAgICB9CisgICAgICAgIGlmIChwYWNrYWdlTmFtZS5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgcmV0LmFwcGVuZEZvcm1hdCgiQ2xpZW50IFBhY2thZ2UgTmFtZTogJXMiLCBwYWNrYWdlTmFtZS5zdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXQuYXBwZW5kKCIsIENvbmZsaWN0aW5nIENsaWVudCBEZXZpY2VzOiB7Iik7CisgICAgICAgIGZvciAoYXV0byYgaiA6IGNvbmZsaWN0aW5nKSB7CisgICAgICAgICAgICByZXQuYXBwZW5kRm9ybWF0KCIlcywgIiwgai5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0LmFwcGVuZCgifSkiKTsKKyAgICB9CisgICAgaWYgKGhhc0FueSkgcmV0LmFwcGVuZCgiXG4iKTsKKyAgICByZXQuYXBwZW5kKCJdXG4iKTsKKyAgICByZXR1cm4gcmV0OworfQorCitDYW1lcmFTZXJ2aWNlOjpEZXNjcmlwdG9yUHRyIENhbWVyYVNlcnZpY2U6OkNhbWVyYUNsaWVudE1hbmFnZXI6Om1ha2VDbGllbnREZXNjcmlwdG9yKAorICAgICAgICBjb25zdCBTdHJpbmc4JiBrZXksIGNvbnN0IHNwPEJhc2ljQ2xpZW50PiYgdmFsdWUsIGludDMyX3QgY29zdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzZXQ8U3RyaW5nOD4mIGNvbmZsaWN0aW5nS2V5cywgaW50MzJfdCBwcmlvcml0eSwgaW50MzJfdCBvd25lcklkKSB7CisKKyAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxyZXNvdXJjZV9wb2xpY3k6OkNsaWVudERlc2NyaXB0b3I8U3RyaW5nOCwgc3A8QmFzaWNDbGllbnQ+Pj4oCisgICAgICAgICAgICBrZXksIHZhbHVlLCBjb3N0LCBjb25mbGljdGluZ0tleXMsIHByaW9yaXR5LCBvd25lcklkKTsKK30KKworQ2FtZXJhU2VydmljZTo6RGVzY3JpcHRvclB0ciBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFDbGllbnRNYW5hZ2VyOjptYWtlQ2xpZW50RGVzY3JpcHRvcigKKyAgICAgICAgY29uc3Qgc3A8QmFzaWNDbGllbnQ+JiB2YWx1ZSwgY29uc3QgQ2FtZXJhU2VydmljZTo6RGVzY3JpcHRvclB0ciYgcGFydGlhbCkgeworICAgIHJldHVybiBtYWtlQ2xpZW50RGVzY3JpcHRvcihwYXJ0aWFsLT5nZXRLZXkoKSwgdmFsdWUsIHBhcnRpYWwtPmdldENvc3QoKSwKKyAgICAgICAgICAgIHBhcnRpYWwtPmdldENvbmZsaWN0aW5nKCksIHBhcnRpYWwtPmdldFByaW9yaXR5KCksIHBhcnRpYWwtPmdldE93bmVySWQoKSk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE2MTgsNyArMjIxMSw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7Ci0gICAgU3RyaW5nOCByZXN1bHQ7CisgICAgU3RyaW5nOCByZXN1bHQoIkR1bXAgb2YgdGhlIENhbWVyYSBTZXJ2aWNlOlxuIik7CiAgICAgaWYgKGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIikpID09IGZhbHNlKSB7CiAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlBlcm1pc3Npb24gRGVuaWFsOiAiCiAgICAgICAgICAgICAgICAgImNhbid0IGR1bXAgQ2FtZXJhU2VydmljZSBmcm9tIHBpZD0lZCwgdWlkPSVkXG4iLApAQCAtMTYzNywxOSArMjIzMCwyMiBAQAogICAgICAgICBpZiAoIW1Nb2R1bGUpIHsKICAgICAgICAgICAgIHJlc3VsdCA9IFN0cmluZzg6OmZvcm1hdCgiTm8gY2FtZXJhIG1vZHVsZSBhdmFpbGFibGUhXG4iKTsKICAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworCisgICAgICAgICAgICAvLyBEdW1wIGV2ZW50IGxvZyBmb3IgZXJyb3IgaW5mb3JtYXRpb24KKyAgICAgICAgICAgIGR1bXBFdmVudExvZyhmZCk7CisKICAgICAgICAgICAgIGlmIChsb2NrZWQpIG1TZXJ2aWNlTG9jay51bmxvY2soKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCi0gICAgICAgIHJlc3VsdCA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhIG1vZHVsZSBIQUwgQVBJIHZlcnNpb246IDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgbU1vZHVsZS0+Y29tbW9uLmhhbF9hcGlfdmVyc2lvbik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkNhbWVyYSBtb2R1bGUgQVBJIHZlcnNpb246IDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgbU1vZHVsZS0+Y29tbW9uLm1vZHVsZV9hcGlfdmVyc2lvbik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkNhbWVyYSBtb2R1bGUgbmFtZTogJXNcbiIsCi0gICAgICAgICAgICAgICAgbU1vZHVsZS0+Y29tbW9uLm5hbWUpOwotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJDYW1lcmEgbW9kdWxlIGF1dGhvcjogJXNcbiIsCi0gICAgICAgICAgICAgICAgbU1vZHVsZS0+Y29tbW9uLmF1dGhvcik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIk51bWJlciBvZiBjYW1lcmEgZGV2aWNlczogJWRcblxuIiwgbU51bWJlck9mQ2FtZXJhcyk7CisgICAgICAgIHJlc3VsdCA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhIG1vZHVsZSBIQUwgQVBJIHZlcnNpb246IDB4JXhcbiIsIG1Nb2R1bGUtPmdldEhhbEFwaVZlcnNpb24oKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkNhbWVyYSBtb2R1bGUgQVBJIHZlcnNpb246IDB4JXhcbiIsIG1Nb2R1bGUtPmdldE1vZHVsZUFwaVZlcnNpb24oKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkNhbWVyYSBtb2R1bGUgbmFtZTogJXNcbiIsIG1Nb2R1bGUtPmdldE1vZHVsZU5hbWUoKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkNhbWVyYSBtb2R1bGUgYXV0aG9yOiAlc1xuIiwgbU1vZHVsZS0+Z2V0TW9kdWxlQXV0aG9yKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJOdW1iZXIgb2YgY2FtZXJhIGRldmljZXM6ICVkXG4iLCBtTnVtYmVyT2ZDYW1lcmFzKTsKKyAgICAgICAgU3RyaW5nOCBhY3RpdmVDbGllbnRTdHJpbmcgPSBtQWN0aXZlQ2xpZW50TWFuYWdlci50b1N0cmluZygpOworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJBY3RpdmUgQ2FtZXJhIENsaWVudHM6XG4lcyIsIGFjdGl2ZUNsaWVudFN0cmluZy5zdHJpbmcoKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkFsbG93ZWQgdXNlcnM6XG4lc1xuIiwgdG9TdHJpbmcobUFsbG93ZWRVc2Vycykuc3RyaW5nKCkpOwogCiAgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IGRlc2MgPSBWZW5kb3JUYWdEZXNjcmlwdG9yOjpnZXRHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CiAgICAgICAgIGlmIChkZXNjID09IE5VTEwpIHsKQEAgLTE2NjQsMTEgKzIyNjAsMjEgQEAKICAgICAgICAgICAgIGRlc2MtPmR1bXAoZmQsIC8qdmVyYm9zaXR5Ki8yLCAvKmluZGVudGF0aW9uKi80KTsKICAgICAgICAgfQogCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bWJlck9mQ2FtZXJhczsgaSsrKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlZCBzdGF0aWMgaW5mb3JtYXRpb246XG4iLCBpKTsKKyAgICAgICAgZHVtcEV2ZW50TG9nKGZkKTsKKworICAgICAgICBib29sIHN0YXRlTG9ja2VkID0gdHJ5TG9jayhtQ2FtZXJhU3RhdGVzTG9jayk7CisgICAgICAgIGlmICghc3RhdGVMb2NrZWQpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhU3RhdGVzIGluIHVzZSwgbWF5IGJlIGRlYWRsb2NrZWRcbiIpOworICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGF1dG8mIHN0YXRlIDogbUNhbWVyYVN0YXRlcykgeworICAgICAgICAgICAgU3RyaW5nOCBjYW1lcmFJZCA9IHN0YXRlLmZpcnN0OworICAgICAgICAgICAgcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXMgaW5mb3JtYXRpb246XG4iLCBjYW1lcmFJZC5zdHJpbmcoKSk7CiAgICAgICAgICAgICBjYW1lcmFfaW5mbyBpbmZvOwogCi0gICAgICAgICAgICBzdGF0dXNfdCByYyA9IG1Nb2R1bGUtPmdldF9jYW1lcmFfaW5mbyhpLCAmaW5mbyk7CisgICAgICAgICAgICAvLyBUT0RPOiBDaGFuZ2UgZ2V0Q2FtZXJhSW5mbyArIEhBTCB0byB1c2UgU3RyaW5nIGNhbWVyYUlkcworICAgICAgICAgICAgc3RhdHVzX3QgcmMgPSBtTW9kdWxlLT5nZXRDYW1lcmFJbmZvKGNhbWVyYUlkVG9JbnQoY2FtZXJhSWQpLCAmaW5mbyk7CiAgICAgICAgICAgICBpZiAocmMgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIEVycm9yIHJlYWRpbmcgc3RhdGljIGluZm9ybWF0aW9uIVxuIik7CiAgICAgICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CkBAIC0xNjc3LDEzICsyMjgzLDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmZhY2luZyA9PSBDQU1FUkFfRkFDSU5HX0JBQ0sgPyAiQkFDSyIgOiAiRlJPTlQiKTsKICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIE9yaWVudGF0aW9uOiAlZFxuIiwgaW5mby5vcmllbnRhdGlvbik7CiAgICAgICAgICAgICAgICAgaW50IGRldmljZVZlcnNpb247Ci0gICAgICAgICAgICAgICAgaWYgKG1Nb2R1bGUtPmNvbW1vbi5tb2R1bGVfYXBpX3ZlcnNpb24gPAotICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzApIHsKKyAgICAgICAgICAgICAgICBpZiAobU1vZHVsZS0+Z2V0TW9kdWxlQXBpVmVyc2lvbigpIDwgQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzApIHsKICAgICAgICAgICAgICAgICAgICAgZGV2aWNlVmVyc2lvbiA9IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGRldmljZVZlcnNpb24gPSBpbmZvLmRldmljZV92ZXJzaW9uOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIERldmljZSB2ZXJzaW9uOiAweCV4XG4iLCBkZXZpY2VWZXJzaW9uKTsKKworICAgICAgICAgICAgICAgIGF1dG8gY29uZmxpY3RpbmcgPSBzdGF0ZS5zZWNvbmQtPmdldENvbmZsaWN0aW5nKCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBSZXNvdXJjZSBDb3N0OiAlZFxuIiwgc3RhdGUuc2Vjb25kLT5nZXRDb3N0KCkpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgQ29uZmxpY3RpbmcgRGV2aWNlczoiKTsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIGlkIDogY29uZmxpY3RpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICVzIiwgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY29uZmxpY3Rpbmcuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiIE5PTkUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiXG4iKTsKKworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgRGV2aWNlIHZlcnNpb246ICUjeFxuIiwgZGV2aWNlVmVyc2lvbik7CiAgICAgICAgICAgICAgICAgaWYgKGRldmljZVZlcnNpb24gPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzApIHsKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBEZXZpY2Ugc3RhdGljIG1ldGFkYXRhOlxuIik7CiAgICAgICAgICAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwpAQCAtMTY5MiwxOSArMjMwOSwzOCBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnMgcCA9IHN0YXRlLnNlY29uZC0+Z2V0U2hpbVBhcmFtcygpOworICAgICAgICAgICAgICAgIGlmICghcC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCIgIENhbWVyYTEgQVBJIHNoaW0gaXMgdXNpbmcgcGFyYW1ldGVyczpcbiAgICAgICAgIik7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICBwLmR1bXAoZmQsIGFyZ3MpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudCA9IG1DbGllbnRbaV0ucHJvbW90ZSgpOwotICAgICAgICAgICAgaWYgKGNsaWVudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCIgIERldmljZSBpcyBjbG9zZWQsIG5vIGNsaWVudCBpbnN0YW5jZVxuIik7CisgICAgICAgICAgICBhdXRvIGNsaWVudERlc2NyaXB0b3IgPSBtQWN0aXZlQ2xpZW50TWFuYWdlci5nZXQoY2FtZXJhSWQpOworICAgICAgICAgICAgaWYgKGNsaWVudERlc2NyaXB0b3IgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFN0cmluZzg6OmZvcm1hdCgiICBEZXZpY2UgJXMgaXMgY2xvc2VkLCBubyBjbGllbnQgaW5zdGFuY2VcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBoYXNDbGllbnQgPSB0cnVlOwotICAgICAgICAgICAgcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCIgIERldmljZSBpcyBvcGVuLiBDbGllbnQgaW5zdGFuY2UgZHVtcDpcbiIpOworICAgICAgICAgICAgcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCIgIERldmljZSAlcyBpcyBvcGVuLiBDbGllbnQgaW5zdGFuY2UgZHVtcDpcblxuIiwKKyAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiQ2xpZW50IHByaW9yaXR5IGxldmVsOiAlZFxuIiwgY2xpZW50RGVzY3JpcHRvci0+Z2V0UHJpb3JpdHkoKSk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJDbGllbnQgUElEOiAlZFxuIiwgY2xpZW50RGVzY3JpcHRvci0+Z2V0T3duZXJJZCgpKTsKKworICAgICAgICAgICAgYXV0byBjbGllbnQgPSBjbGllbnREZXNjcmlwdG9yLT5nZXRWYWx1ZSgpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiQ2xpZW50IHBhY2thZ2U6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGNsaWVudC0+Z2V0UGFja2FnZU5hbWUoKSkuc3RyaW5nKCkpOwogICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisKICAgICAgICAgICAgIGNsaWVudC0+ZHVtcENsaWVudChmZCwgYXJncyk7CiAgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhdGVMb2NrZWQpIG1DYW1lcmFTdGF0ZXNMb2NrLnVubG9jaygpOworCiAgICAgICAgIGlmICghaGFzQ2xpZW50KSB7CiAgICAgICAgICAgICByZXN1bHQgPSBTdHJpbmc4Ojpmb3JtYXQoIlxuTm8gYWN0aXZlIGNhbWVyYSBjbGllbnRzIHlldC5cbiIpOwogICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CkBAIC0xNzI4LDExMiArMjM2NCwxNDMgQEAKICAgICAgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotLyp2aXJ0dWFsKi92b2lkIENhbWVyYVNlcnZpY2U6OmJpbmRlckRpZWQoCi0gICAgY29uc3Qgd3A8SUJpbmRlcj4gJndobykgewordm9pZCBDYW1lcmFTZXJ2aWNlOjpkdW1wRXZlbnRMb2coaW50IGZkKSB7CisgICAgU3RyaW5nOCByZXN1bHQgPSBTdHJpbmc4KCJcblByaW9yIGNsaWVudCBldmVudHMgKG1vc3QgcmVjZW50IGF0IHRvcCk6XG4iKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2dMb2NrKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IG1FdmVudExvZykgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgICVzXG4iLCBtc2cuc3RyaW5nKCkpOworICAgIH0KKworICAgIGlmIChtRXZlbnRMb2cuc2l6ZSgpID09IERFRkFVTFRfRVZFTlRfTE9HX0xFTkdUSCkgeworICAgICAgICByZXN1bHQuYXBwZW5kKCIgIC4uLlxuIik7CisgICAgfSBlbHNlIGlmIChtRXZlbnRMb2cuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICBbbm8gZXZlbnRzIHlldF1cbiIpOworICAgIH0KKyAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworCisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6aGFuZGxlVG9yY2hDbGllbnRCaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYWwobVRvcmNoQ2xpZW50TWFwTXV0ZXgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRvcmNoQ2xpZW50TWFwLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtVG9yY2hDbGllbnRNYXBbaV0gPT0gd2hvKSB7CisgICAgICAgICAgICAvLyB0dXJuIG9mZiB0aGUgdG9yY2ggbW9kZSB0aGF0IHdhcyB0dXJuZWQgb24gYnkgZGVhZCBjbGllbnQKKyAgICAgICAgICAgIFN0cmluZzggY2FtZXJhSWQgPSBtVG9yY2hDbGllbnRNYXAua2V5QXQoaSk7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBtRmxhc2hsaWdodC0+c2V0VG9yY2hNb2RlKGNhbWVyYUlkLCBmYWxzZSk7CisgICAgICAgICAgICBpZiAocmVzKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiB0b3JjaCBjbGllbnQgZGllZCBidXQgY291bGRuJ3QgdHVybiBvZmYgdG9yY2g6ICIKKyAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Ub3JjaENsaWVudE1hcC5yZW1vdmVJdGVtc0F0KGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qdmlydHVhbCovdm9pZCBDYW1lcmFTZXJ2aWNlOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pIHsKIAogICAgIC8qKgotICAgICAgKiBXaGlsZSB0ZW1wdGluZyB0byBwcm9tb3RlIHRoZSB3cDxJQmluZGVyPiBpbnRvIGEgc3AsCi0gICAgICAqIGl0J3MgYWN0dWFsbHkgbm90IHN1cHBvcnRlZCBieSB0aGUgYmluZGVyIGRyaXZlcgorICAgICAgKiBXaGlsZSB0ZW1wdGluZyB0byBwcm9tb3RlIHRoZSB3cDxJQmluZGVyPiBpbnRvIGEgc3AsIGl0J3MgYWN0dWFsbHkgbm90IHN1cHBvcnRlZCBieSB0aGUKKyAgICAgICogYmluZGVyIGRyaXZlcgogICAgICAgKi8KIAotICAgIEFMT0dWKCJqYXZhIGNsaWVudHMnIGJpbmRlciBkaWVkIik7CisgICAgbG9nQ2xpZW50RGllZChnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoIkJpbmRlciBkaWVkIHVuZXhwZWN0ZWRseSIpKTsKIAotICAgIHNwPEJhc2ljQ2xpZW50PiBjYW1lcmFDbGllbnQgPSBnZXRDbGllbnRCeVJlbW90ZSh3aG8pOworICAgIC8vIGNoZWNrIHRvcmNoIGNsaWVudAorICAgIGhhbmRsZVRvcmNoQ2xpZW50QmluZGVyRGllZCh3aG8pOwogCi0gICAgaWYgKGNhbWVyYUNsaWVudCA9PSAwKSB7Ci0gICAgICAgIEFMT0dWKCJqYXZhIGNsaWVudHMnIGJpbmRlciBkZWF0aCBhbHJlYWR5IGNsZWFuZWQgdXAgKG5vcm1hbCBjYXNlKSIpOworICAgIC8vIGNoZWNrIGNhbWVyYSBkZXZpY2UgY2xpZW50CisgICAgaWYoIWV2aWN0Q2xpZW50SWRCeVJlbW90ZSh3aG8pKSB7CisgICAgICAgIEFMT0dWKCIlczogSmF2YSBjbGllbnQncyBiaW5kZXIgZGVhdGggYWxyZWFkeSBjbGVhbmVkIHVwIChub3JtYWwgY2FzZSkiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgQUxPR1coIkRpc2Nvbm5lY3RpbmcgY2FtZXJhIGNsaWVudCAlcCBzaW5jZSB0aGUgYmluZGVyIGZvciBpdCAiCi0gICAgICAgICAgImRpZWQgKHRoaXMgcGlkICVkKSIsIGNhbWVyYUNsaWVudC5nZXQoKSwgZ2V0Q2FsbGluZ1BpZCgpKTsKLQotICAgIGNhbWVyYUNsaWVudC0+ZGlzY29ubmVjdCgpOwotCisgICAgQUxPR0UoIiVzOiBKYXZhIGNsaWVudCdzIGJpbmRlciBkaWVkLCByZW1vdmluZyBpdCBmcm9tIHRoZSBsaXN0IG9mIGFjdGl2ZSBjbGllbnRzIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CiB9CiAKLXZvaWQgQ2FtZXJhU2VydmljZTo6dXBkYXRlU3RhdHVzKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlN0YXR1cyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdHVzVmVjdG9yICpyZWplY3RTb3VyY2VTdGF0ZXMpIHsKLSAgICAvLyBkbyBub3QgbG9jayBtU2VydmljZUxvY2sgaGVyZSBvciBjYW4gZ2V0IGludG8gYSBkZWFkbG9jayBmcm9tCi0gICAgLy8gIGNvbm5lY3QoKSAtPiBQcm9DbGllbnQ6OmRpc2Nvbm5lY3QgLT4gdXBkYXRlU3RhdHVzCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN0YXR1c011dGV4KTsKLQotICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlN0YXR1cyBvbGRTdGF0dXMgPSBtU3RhdHVzTGlzdFtjYW1lcmFJZF07Ci0KLSAgICBtU3RhdHVzTGlzdFtjYW1lcmFJZF0gPSBzdGF0dXM7Ci0KLSAgICBpZiAob2xkU3RhdHVzICE9IHN0YXR1cykgewotICAgICAgICBBTE9HVigiJXM6IFN0YXR1cyBoYXMgY2hhbmdlZCBmb3IgY2FtZXJhIElEICVkIGZyb20gMHgleCB0byAweCV4IiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwgKHVpbnQzMl90KW9sZFN0YXR1cywgKHVpbnQzMl90KXN0YXR1cyk7Ci0KLSAgICAgICAgaWYgKG9sZFN0YXR1cyA9PSBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX1BSRVNFTlQgJiYKLSAgICAgICAgICAgIChzdGF0dXMgIT0gSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX1BSRVNFTlQgJiYKLSAgICAgICAgICAgICBzdGF0dXMgIT0gSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX0VOVU1FUkFUSU5HKSkgewotCi0gICAgICAgICAgICBBTE9HVygiJXM6IEZyb20gTk9UX1BSRVNFTlQgY2FuIG9ubHkgdHJhbnNpdGlvbiBpbnRvIFBSRVNFTlQiCi0gICAgICAgICAgICAgICAgICAiIG9yIEVOVU1FUkFUSU5HIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIG1TdGF0dXNMaXN0W2NhbWVyYUlkXSA9IG9sZFN0YXR1czsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZWplY3RTb3VyY2VTdGF0ZXMgIT0gTlVMTCkgewotICAgICAgICAgICAgY29uc3QgU3RhdHVzVmVjdG9yICZyZWplY3RMaXN0ID0gKnJlamVjdFNvdXJjZVN0YXRlczsKLSAgICAgICAgICAgIFN0YXR1c1ZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSByZWplY3RMaXN0LmJlZ2luKCk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogU29tZXRpbWVzIHdlIHdhbnQgdG8gY29uZGl0aW9uYWxseSBkbyBhIHRyYW5zaXRpb24uCi0gICAgICAgICAgICAgKiBGb3IgZXhhbXBsZSBpZiBhIGNsaWVudCBkaXNjb25uZWN0cywgd2Ugd2FudCB0byBnbyB0byBQUkVTRU5UCi0gICAgICAgICAgICAgKiBvbmx5IGlmIHdlIHdlcmVuJ3QgYWxyZWFkeSBpbiBOT1RfUFJFU0VOVCBvciBFTlVNRVJBVElORy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgZm9yICg7IGl0ICE9IHJlamVjdExpc3QuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgICAgICAgICBpZiAob2xkU3RhdHVzID09ICppdCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IFJlamVjdGluZyBzdGF0dXMgdHJhbnNpdGlvbiBmb3IgQ2FtZXJhIElEICVkLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgc2luY2UgdGhlIHNvdXJjZSBzdGF0ZSB3YXMgd2FzIGluIG9uZSBvZiB0aGUgYmFkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzdGF0ZXMuIiwgX19GVU5DVElPTl9fLCBjYW1lcmFJZCk7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0dXNMaXN0W2NhbWVyYUlkXSA9IG9sZFN0YXR1czsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogUHJvQ2xpZW50cyBsb3NlIHRoZWlyIGV4Y2x1c2l2ZSBsb2NrLgotICAgICAgICAgICogLSBEb25lIGJlZm9yZSB0aGUgQ2FtZXJhQ2xpZW50IGNhbiBpbml0aWFsaXplIHRoZSBIQUwgZGV2aWNlLAotICAgICAgICAgICogICBzaW5jZSB3ZSB3YW50IHRvIGJlIGFibGUgdG8gY2xvc2UgaXQgYmVmb3JlIHRoZXkgZ2V0IHRvIGluaXRpYWxpemUKLSAgICAgICAgICAqLwotICAgICAgICBpZiAoc3RhdHVzID09IElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19OT1RfQVZBSUxBQkxFKSB7Ci0gICAgICAgICAgICBWZWN0b3I8d3A8UHJvQ2xpZW50PiA+IHByb0NsaWVudHMobVByb0NsaWVudExpc3RbY2FtZXJhSWRdKTsKLSAgICAgICAgICAgIFZlY3Rvcjx3cDxQcm9DbGllbnQ+ID46OmNvbnN0X2l0ZXJhdG9yIGl0OwotCi0gICAgICAgICAgICBmb3IgKGl0ID0gcHJvQ2xpZW50cy5iZWdpbigpOyBpdCAhPSBwcm9DbGllbnRzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICAgICAgc3A8UHJvQ2xpZW50PiBwcm9DbCA9IGl0LT5wcm9tb3RlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHByb0NsLmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvQ2wtPm9uRXhjbHVzaXZlTG9ja1N0b2xlbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFZlY3RvcjxzcDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiA+Ojpjb25zdF9pdGVyYXRvciBpdDsKLSAgICAgICAgZm9yIChpdCA9IG1MaXN0ZW5lckxpc3QuYmVnaW4oKTsgaXQgIT0gbUxpc3RlbmVyTGlzdC5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAgKCppdCktPm9uU3RhdHVzQ2hhbmdlZChzdGF0dXMsIGNhbWVyYUlkKTsKLSAgICAgICAgfQotICAgIH0KK3ZvaWQgQ2FtZXJhU2VydmljZTo6dXBkYXRlU3RhdHVzKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlN0YXR1cyBzdGF0dXMsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKSB7CisgICAgdXBkYXRlU3RhdHVzKHN0YXR1cywgY2FtZXJhSWQsIHt9KTsKIH0KIAotSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzIENhbWVyYVNlcnZpY2U6OmdldFN0YXR1cyhpbnQgY2FtZXJhSWQpIGNvbnN0IHsKLSAgICBpZiAoY2FtZXJhSWQgPCAwIHx8IGNhbWVyYUlkID49IE1BWF9DQU1FUkFTKSB7Ci0gICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjYW1lcmEgSUQgJWQiLCBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkKTsKLSAgICAgICAgcmV0dXJuIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19VTktOT1dOOwordm9pZCBDYW1lcmFTZXJ2aWNlOjp1cGRhdGVTdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzIHN0YXR1cywgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXM+IHJlamVjdFNvdXJjZVN0YXRlcykgeworICAgIC8vIERvIG5vdCBsb2NrIG1TZXJ2aWNlTG9jayBoZXJlIG9yIGNhbiBnZXQgaW50byBhIGRlYWRsb2NrIGZyb20KKyAgICAvLyBjb25uZWN0KCkgLT4gZGlzY29ubmVjdCAtPiB1cGRhdGVTdGF0dXMKKworICAgIGF1dG8gc3RhdGUgPSBnZXRDYW1lcmFTdGF0ZShjYW1lcmFJZCk7CisKKyAgICBpZiAoc3RhdGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXM6IENvdWxkIG5vdCB1cGRhdGUgdGhlIHN0YXR1cyBmb3IgJXMsIG5vIHN1Y2ggZGV2aWNlIGV4aXN0cyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBNdXRleDo6QXV0b2xvY2sgYWwobVN0YXR1c011dGV4KTsKLSAgICByZXR1cm4gbVN0YXR1c0xpc3RbY2FtZXJhSWRdOworICAgIC8vIFVwZGF0ZSB0aGUgc3RhdHVzIGZvciB0aGlzIGNhbWVyYSBzdGF0ZSwgdGhlbiBzZW5kIHRoZSBvblN0YXR1c0NoYW5nZWRDYWxsYmFja3MgdG8gZWFjaAorICAgIC8vIG9mIHRoZSBsaXN0ZW5lcnMgd2l0aCBib3RoIHRoZSBtU3RhdHVzU3RhdHVzIGFuZCBtU3RhdHVzTGlzdGVuZXJMb2NrIGhlbGQKKyAgICBzdGF0ZS0+dXBkYXRlU3RhdHVzKHN0YXR1cywgY2FtZXJhSWQsIHJlamVjdFNvdXJjZVN0YXRlcywgW3RoaXNdCisgICAgICAgICAgICAoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlN0YXR1cyBzdGF0dXMpIHsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfRU5VTUVSQVRJTkcpIHsKKyAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdG9yY2ggc3RhdHVzIGlmIGl0IGhhcyBhIGZsYXNoIHVuaXQuCisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1Ub3JjaFN0YXR1c011dGV4KTsKKyAgICAgICAgICAgICAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpUb3JjaFN0YXR1cyB0b3JjaFN0YXR1czsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0VG9yY2hTdGF0dXNMb2NrZWQoY2FtZXJhSWQsICZ0b3JjaFN0YXR1cykgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgIE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICAgICAgICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlRvcmNoU3RhdHVzIG5ld1RvcmNoU3RhdHVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPT0gSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX1BSRVNFTlQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlRPUkNIX1NUQVRVU19BVkFJTEFCTEVfT0ZGIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpUT1JDSF9TVEFUVVNfTk9UX0FWQUlMQUJMRTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRvcmNoU3RhdHVzICE9IG5ld1RvcmNoU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvblRvcmNoU3RhdHVzQ2hhbmdlZExvY2tlZChjYW1lcmFJZCwgbmV3VG9yY2hTdGF0dXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU3RhdHVzTGlzdGVuZXJMb2NrKTsKKworICAgICAgICAgICAgZm9yIChhdXRvJiBsaXN0ZW5lciA6IG1MaXN0ZW5lckxpc3QpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZWZhY3RvciBzdGF0dXMgbGlzdGVuZXJzIHRvIHVzZSBzdHJpbmdzIGZvciBDYW1lcmEgSURzIGFuZCByZW1vdmUgdGhpcy4KKyAgICAgICAgICAgICAgICBpbnQgaWQgPSBjYW1lcmFJZFRvSW50KGNhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICBpZiAoaWQgIT0gLTEpIGxpc3RlbmVyLT5vblN0YXR1c0NoYW5nZWQoc3RhdHVzLCBpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpnZXRUb3JjaFN0YXR1c0xvY2tlZCgKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlRvcmNoU3RhdHVzICpzdGF0dXMpIGNvbnN0IHsKKyAgICBpZiAoIXN0YXR1cykgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzc2l6ZV90IGluZGV4ID0gbVRvcmNoU3RhdHVzTWFwLmluZGV4T2ZLZXkoY2FtZXJhSWQpOworICAgIGlmIChpbmRleCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAvLyBpbnZhbGlkIGNhbWVyYSBJRCBvciB0aGUgY2FtZXJhIGRvZXNuJ3QgaGF2ZSBhIGZsYXNoIHVuaXQKKyAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIH0KKworICAgICpzdGF0dXMgPSBtVG9yY2hTdGF0dXNNYXAudmFsdWVBdChpbmRleCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpzZXRUb3JjaFN0YXR1c0xvY2tlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VG9yY2hTdGF0dXMgc3RhdHVzKSB7CisgICAgc3NpemVfdCBpbmRleCA9IG1Ub3JjaFN0YXR1c01hcC5pbmRleE9mS2V5KGNhbWVyYUlkKTsKKyAgICBpZiAoaW5kZXggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VG9yY2hTdGF0dXMmIGl0ZW0gPQorICAgICAgICAgICAgbVRvcmNoU3RhdHVzTWFwLmVkaXRWYWx1ZUF0KGluZGV4KTsKKyAgICBpdGVtID0gc3RhdHVzOworCisgICAgcmV0dXJuIE9LOwogfQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCmluZGV4IGZkMmEyZWUuLjM5MDVkNjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFTRVJWSUNFX0gKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFTRVJWSUNFX0gKIAorI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPGJpbmRlci9BcHBPcHNNYW5hZ2VyLmg+CkBAIC0yNyw4ICsyOCw2IEBACiAKICNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYS5oPgogI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8Y2FtZXJhL0lQcm9DYW1lcmFVc2VyLmg+Ci0jaW5jbHVkZSA8Y2FtZXJhL0lQcm9DYW1lcmFDYWxsYmFja3MuaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KICNpbmNsdWRlIDxjYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oPgpAQCAtMzYsOSArMzUsMTggQEAKICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oPgogCiAjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KKyNpbmNsdWRlICJDYW1lcmFGbGFzaGxpZ2h0LmgiCiAKLS8qIFRoaXMgbmVlZHMgdG8gYmUgaW5jcmVhc2VkIGlmIHdlIGNhbiBoYXZlIG1vcmUgY2FtZXJhcyAqLwotI2RlZmluZSBNQVhfQ0FNRVJBUyAyCisjaW5jbHVkZSAiY29tbW9uL0NhbWVyYU1vZHVsZS5oIgorI2luY2x1ZGUgIm1lZGlhL1JpbmdCdWZmZXIuaCIKKyNpbmNsdWRlICJ1dGlscy9BdXRvQ29uZGl0aW9uTG9jay5oIgorI2luY2x1ZGUgInV0aWxzL0NsaWVudE1hbmFnZXIuaCIKKworI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTU4LDYgKzY2LDI0IEBACiAgICAgY2xhc3MgQ2xpZW50OwogICAgIGNsYXNzIEJhc2ljQ2xpZW50OwogCisgICAgLy8gVGhlIGVmZmVjdGl2ZSBBUEkgbGV2ZWwuICBUaGUgQ2FtZXJhMiBBUEkgcnVubmluZyBpbiBMRUdBQ1kgbW9kZSBjb3VudHMgYXMgQVBJXzEuCisgICAgZW51bSBhcGlMZXZlbCB7CisgICAgICAgIEFQSV8xID0gMSwKKyAgICAgICAgQVBJXzIgPSAyCisgICAgfTsKKworICAgIC8vIFByb2Nlc3Mgc3RhdGUgKG1pcnJvcnMgZnJhbWV3b3Jrcy9iYXNlL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXIuamF2YSkKKyAgICBzdGF0aWMgY29uc3QgaW50IFBST0NFU1NfU1RBVEVfTk9ORVhJU1RFTlQgPSAtMTsKKworICAgIC8vIDMgc2Vjb25kIGJ1c3kgdGltZW91dCB3aGVuIG90aGVyIGNsaWVudHMgYXJlIGNvbm5lY3RpbmcKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBERUZBVUxUX0NPTk5FQ1RfVElNRU9VVF9OUyA9IDMwMDAwMDAwMDA7CisKKyAgICAvLyAxIHNlY29uZCBidXN5IHRpbWVvdXQgd2hlbiBvdGhlciBjbGllbnRzIGFyZSBkaXNjb25uZWN0aW5nCisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3QgREVGQVVMVF9ESVNDT05ORUNUX1RJTUVPVVRfTlMgPSAxMDAwMDAwMDAwOworCisgICAgLy8gRGVmYXVsdCBudW1iZXIgb2YgbWVzc2FnZXMgdG8gc3RvcmUgaW4gZXZpY3Rpb24gbG9nCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBERUZBVUxUX0VWRU5UX0xPR19MRU5HVEggPSAxMDA7CisKICAgICAvLyBFdmVudCBsb2cgSUQKICAgICBzdGF0aWMgY29uc3QgaW50IFNOX0VWRU5UX0xPR19JRCA9IDB4NTM0ZTQ1NTQ7CiAKQEAgLTY5LDEyICs5NSwxNyBAQAogCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgLy8gSEFMIENhbGxiYWNrcwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgb25EZXZpY2VTdGF0dXNDaGFuZ2VkKGludCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV3U3RhdHVzKTsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG9uRGV2aWNlU3RhdHVzQ2hhbmdlZChjYW1lcmFfZGV2aWNlX3N0YXR1c190IGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9kZXZpY2Vfc3RhdHVzX3QgbmV3U3RhdHVzKTsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG9uVG9yY2hTdGF0dXNDaGFuZ2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VG9yY2hTdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXR1cyk7CiAKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAvLyBJQ2FtZXJhU2VydmljZQorICAgIHZpcnR1YWwgaW50MzJfdCAgICAgZ2V0TnVtYmVyT2ZDYW1lcmFzKGludCB0eXBlKTsKICAgICB2aXJ0dWFsIGludDMyX3QgICAgIGdldE51bWJlck9mQ2FtZXJhcygpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRDYW1lcmFJbmZvKGludCBjYW1lcmFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENhbWVyYUluZm8qIGNhbWVyYUluZm8pOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGludCBjYW1lcmFJZCwKQEAgLTkxLDExICsxMjIsNiBAQAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8SUNhbWVyYT4mIGRldmljZSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3RQcm8oY29uc3Qgc3A8SVByb0NhbWVyYUNhbGxiYWNrcz4mIGNhbWVyYUNiLAotICAgICAgICAgICAgaW50IGNhbWVyYUlkLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGludCBjbGllbnRVaWQsCi0gICAgICAgICAgICAvKm91dCovCi0gICAgICAgICAgICBzcDxJUHJvQ2FtZXJhVXNlcj4mIGRldmljZSk7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3REZXZpY2UoCiAgICAgICAgICAgICBjb25zdCBzcDxJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiYgY2FtZXJhQ2IsCiAgICAgICAgICAgICBpbnQgY2FtZXJhSWQsCkBAIC0xMTMsNiArMTM5LDExIEBACiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBTdHJpbmcxNiogcGFyYW1ldGVycyk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFRvcmNoTW9kZShjb25zdCBTdHJpbmcxNiYgY2FtZXJhSWQsIGJvb2wgZW5hYmxlZCwKKyAgICAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiBjbGllbnRCaW5kZXIpOworCisgICAgdmlydHVhbCB2b2lkIG5vdGlmeVN5c3RlbUV2ZW50KGludDMyX3QgZXZlbnRJZCwgY29uc3QgaW50MzJfdCogYXJncywgc2l6ZV90IGxlbmd0aCk7CisKICAgICAvLyBPSyA9IHN1cHBvcnRzIGFwaSBvZiB0aGF0IHZlcnNpb24sIC1FT1BOT1RTVVBQID0gZG9lcyBub3Qgc3VwcG9ydAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3VwcG9ydHNDYW1lcmFBcGkoCiAgICAgICAgICAgICBpbnQgY2FtZXJhSWQsIGludCBhcGlWZXJzaW9uKTsKQEAgLTEyNSw3ICsxNTYsNiBAQAogCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgLy8gQ2xpZW50IGZ1bmN0aW9uYWxpdHkKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHJlbW92ZUNsaWVudEJ5UmVtb3RlKGNvbnN0IHdwPElCaW5kZXI+JiByZW1vdGVCaW5kZXIpOwogCiAgICAgZW51bSBzb3VuZF9raW5kIHsKICAgICAgICAgU09VTkRfU0hVVFRFUiA9IDAsCkBAIC0xNDMsMjcgKzE3MywyMSBAQAogCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgLy8gU2hhcmVkIHV0aWxpdGllcwotICAgIHN0YXRpYyBzdGF0dXNfdCAgICAgZmlsdGVyT3BlbkVycm9yQ29kZShzdGF0dXNfdCBlcnIpOwogICAgIHN0YXRpYyBzdGF0dXNfdCAgICAgZmlsdGVyR2V0SW5mb0Vycm9yQ29kZShzdGF0dXNfdCBlcnIpOwogCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgLy8gQ2FtZXJhQ2xpZW50IGZ1bmN0aW9uYWxpdHkKIAotICAgIC8vIHJldHVybnMgcGxhaW4gcG9pbnRlciBvZiBjbGllbnQuIE5vdGUgdGhhdCBtQ2xpZW50TG9jayBzaG91bGQgYmUgYWNxdWlyZWQgdG8KLSAgICAvLyBwcmV2ZW50IHRoZSBjbGllbnQgZnJvbSBkZXN0cnVjdGlvbi4gVGhlIHJlc3VsdCBjYW4gYmUgTlVMTC4KLSAgICB2aXJ0dWFsIEJhc2ljQ2xpZW50KiBnZXRDbGllbnRCeUlkVW5zYWZlKGludCBjYW1lcmFJZCk7Ci0gICAgdmlydHVhbCBNdXRleCogICAgICBnZXRDbGllbnRMb2NrQnlJZChpbnQgY2FtZXJhSWQpOwotCiAgICAgY2xhc3MgQmFzaWNDbGllbnQgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdGlhbGl6ZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSkgPSAwOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRpYWxpemUoQ2FtZXJhTW9kdWxlICptb2R1bGUpID0gMDsKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBkaXNjb25uZWN0KCk7CiAKICAgICAgICAgLy8gYmVjYXVzZSB3ZSBjYW4ndCB2aXJ0dWFsbHkgaW5oZXJpdCBJSW50ZXJmYWNlLCB3aGljaCBicmVha3MKICAgICAgICAgLy8gdmlydHVhbCBpbmhlcml0YW5jZQogICAgICAgICB2aXJ0dWFsIHNwPElCaW5kZXI+IGFzQmluZGVyV3JhcHBlcigpID0gMDsKIAotICAgICAgICAvLyBSZXR1cm4gdGhlIHJlbW90ZSBjYWxsYmFjayBiaW5kZXIgb2JqZWN0IChlLmcuIElQcm9DYW1lcmFDYWxsYmFja3MpCisgICAgICAgIC8vIFJldHVybiB0aGUgcmVtb3RlIGNhbGxiYWNrIGJpbmRlciBvYmplY3QgKGUuZy4gSUNhbWVyYURldmljZUNhbGxiYWNrcykKICAgICAgICAgc3A8SUJpbmRlcj4gICAgICAgICBnZXRSZW1vdGUoKSB7CiAgICAgICAgICAgICByZXR1cm4gbVJlbW90ZUJpbmRlcjsKICAgICAgICAgfQpAQCAtMTczLDYgKzE5NywyMiBAQAogICAgICAgICAvLyBJbnRlcm5hbCBkdW1wIG1ldGhvZCB0byBiZSBjYWxsZWQgYnkgQ2FtZXJhU2VydmljZQogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZHVtcENsaWVudChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpID0gMDsKIAorICAgICAgICAvLyBSZXR1cm4gdGhlIHBhY2thZ2UgbmFtZSBmb3IgdGhpcyBjbGllbnQKKyAgICAgICAgdmlydHVhbCBTdHJpbmcxNiBnZXRQYWNrYWdlTmFtZSgpIGNvbnN0OworCisgICAgICAgIC8vIE5vdGlmeSBjbGllbnQgYWJvdXQgYSBmYXRhbCBlcnJvcgorICAgICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpID0gMDsKKworICAgICAgICAvLyBHZXQgdGhlIFVJRCBvZiB0aGUgYXBwbGljYXRpb24gY2xpZW50IHVzaW5nIHRoaXMKKyAgICAgICAgdmlydHVhbCB1aWRfdCBnZXRDbGllbnRVaWQoKSBjb25zdDsKKworICAgICAgICAvLyBHZXQgdGhlIFBJRCBvZiB0aGUgYXBwbGljYXRpb24gY2xpZW50IHVzaW5nIHRoaXMKKyAgICAgICAgdmlydHVhbCBpbnQgZ2V0Q2xpZW50UGlkKCkgY29uc3Q7CisKKyAgICAgICAgLy8gQ2hlY2sgd2hhdCBBUEkgbGV2ZWwgaXMgdXNlZCBmb3IgdGhpcyBjbGllbnQuIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2gKKyAgICAgICAgLy8gc3VwZXJjbGFzcyB0aGlzIGNhbiBiZSBjYXN0IHRvLgorICAgICAgICB2aXJ0dWFsIGJvb2wgY2FuQ2FzdFRvQXBpQ2xpZW50KGFwaUxldmVsIGxldmVsKSBjb25zdDsKICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgIEJhc2ljQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiByZW1vdGVDYWxsYmFjaywKQEAgLTE5OSw2ICsyMzksNyBAQAogICAgICAgICBwaWRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRQaWQ7CiAgICAgICAgIHVpZF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudFVpZDsgICAgICAvLyBpbW11dGFibGUgYWZ0ZXIgY29uc3RydWN0b3IKICAgICAgICAgcGlkX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VydmljZVBpZDsgICAgIC8vIGltbXV0YWJsZSBhZnRlciBjb25zdHJ1Y3RvcgorICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EaXNjb25uZWN0ZWQ7CiAKICAgICAgICAgLy8gLSBUaGUgYXBwLXNpZGUgQmluZGVyIGludGVyZmFjZSB0byByZWNlaXZlIGNhbGxiYWNrcyBmcm9tIHVzCiAgICAgICAgIHNwPElCaW5kZXI+ICAgICAgICAgICAgICAgICAgICAgbVJlbW90ZUJpbmRlcjsgICAvLyBpbW11dGFibGUgYWZ0ZXIgY29uc3RydWN0b3IKQEAgLTIwNywxMCArMjQ4LDYgQEAKICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgICAgICAgICBzdGFydENhbWVyYU9wcygpOwogICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaENhbWVyYU9wcygpOwogCi0gICAgICAgIC8vIE5vdGlmeSBjbGllbnQgYWJvdXQgYSBmYXRhbCBlcnJvcgotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIG5vdGlmeUVycm9yKAotICAgICAgICAgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCi0gICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSA9IDA7CiAgICAgcHJpdmF0ZToKICAgICAgICAgQXBwT3BzTWFuYWdlciAgICAgICAgICAgICAgICAgICBtQXBwT3BzTWFuYWdlcjsKIApAQCAtMjgyLDE0ICszMTksMTYgQEAKICAgICAgICAgICAgIHJldHVybiBhc0JpbmRlcih0aGlzKTsKICAgICAgICAgfQogCi0gICAgcHJvdGVjdGVkOgotICAgICAgICBzdGF0aWMgTXV0ZXgqICAgICAgICBnZXRDbGllbnRMb2NrRnJvbUNvb2tpZSh2b2lkKiB1c2VyKTsKLSAgICAgICAgLy8gY29udmVydCBjbGllbnQgZnJvbSBjb29raWUuIENsaWVudCBsb2NrIHNob3VsZCBiZSBhY3F1aXJlZCBiZWZvcmUgZ2V0dGluZyBDbGllbnQuCi0gICAgICAgIHN0YXRpYyBDbGllbnQqICAgICAgIGdldENsaWVudEZyb21Db29raWUodm9pZCogdXNlcik7Ci0KICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgbm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKTsKIAorICAgICAgICAvLyBDaGVjayB3aGF0IEFQSSBsZXZlbCBpcyB1c2VkIGZvciB0aGlzIGNsaWVudC4gVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSB3aGljaAorICAgICAgICAvLyBzdXBlcmNsYXNzIHRoaXMgY2FuIGJlIGNhc3QgdG8uCisgICAgICAgIHZpcnR1YWwgYm9vbCBjYW5DYXN0VG9BcGlDbGllbnQoYXBpTGV2ZWwgbGV2ZWwpIGNvbnN0OworICAgIHByb3RlY3RlZDoKKyAgICAgICAgLy8gQ29udmVydCBjbGllbnQgZnJvbSBjb29raWUuCisgICAgICAgIHN0YXRpYyBzcDxDYW1lcmFTZXJ2aWNlOjpDbGllbnQ+IGdldENsaWVudEZyb21Db29raWUodm9pZCogdXNlcik7CisKICAgICAgICAgLy8gSW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3IKIAogICAgICAgICAvLyAtIFRoZSBhcHAtc2lkZSBCaW5kZXIgaW50ZXJmYWNlIHRvIHJlY2VpdmUgY2FsbGJhY2tzIGZyb20gdXMKQEAgLTI5Nyw5MiArMzM2LDI5NCBAQAogCiAgICAgfTsgLy8gY2xhc3MgQ2xpZW50CiAKLSAgICBjbGFzcyBQcm9DbGllbnQgOiBwdWJsaWMgQm5Qcm9DYW1lcmFVc2VyLCBwdWJsaWMgQmFzaWNDbGllbnQgeworICAgIC8qKgorICAgICAqIEEgbGlzdGVuZXIgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBMSVNURU5FUiBpbnRlcmZhY2UgZm9yIHVzZSB3aXRoIGEgQ2xpZW50TWFuYWdlciwgYW5kCisgICAgICogaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisgICAgICogICAgdm9pZCBvbkNsaWVudFJlbW92ZWQoY29uc3QgQ2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPiYgZGVzY3JpcHRvcik7CisgICAgICogICAgdm9pZCBvbkNsaWVudEFkZGVkKGNvbnN0IENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4mIGRlc2NyaXB0b3IpOworICAgICAqLworICAgIGNsYXNzIENsaWVudEV2ZW50TGlzdGVuZXIgewogICAgIHB1YmxpYzoKLSAgICAgICAgdHlwZWRlZiBJUHJvQ2FtZXJhQ2FsbGJhY2tzIFRDYW1DYWxsYmFja3M7CisgICAgICAgIHZvaWQgb25DbGllbnRBZGRlZChjb25zdCByZXNvdXJjZV9wb2xpY3k6OkNsaWVudERlc2NyaXB0b3I8U3RyaW5nOCwKKyAgICAgICAgICAgICAgICBzcDxDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudD4+JiBkZXNjcmlwdG9yKTsKKyAgICAgICAgdm9pZCBvbkNsaWVudFJlbW92ZWQoY29uc3QgcmVzb3VyY2VfcG9saWN5OjpDbGllbnREZXNjcmlwdG9yPFN0cmluZzgsCisgICAgICAgICAgICAgICAgc3A8Q2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ+PiYgZGVzY3JpcHRvcik7CisgICAgfTsgLy8gY2xhc3MgQ2xpZW50RXZlbnRMaXN0ZW5lcgogCi0gICAgICAgIFByb0NsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxJUHJvQ2FtZXJhQ2FsbGJhY2tzPiYgcmVtb3RlQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgIGludCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAotICAgICAgICAgICAgICAgIGludCBjbGllbnRQaWQsCi0gICAgICAgICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkKTsKKyAgICB0eXBlZGVmIHN0ZDo6c2hhcmVkX3B0cjxyZXNvdXJjZV9wb2xpY3k6OkNsaWVudERlc2NyaXB0b3I8U3RyaW5nOCwKKyAgICAgICAgICAgIHNwPENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50Pj4+IERlc2NyaXB0b3JQdHI7CiAKLSAgICAgICAgdmlydHVhbCB+UHJvQ2xpZW50KCk7CisgICAgLyoqCisgICAgICogQSBjb250YWluZXIgY2xhc3MgZm9yIG1hbmFnaW5nIGFjdGl2ZSBjYW1lcmEgY2xpZW50cyB0aGF0IGFyZSB1c2luZyBIQUwgZGV2aWNlcy4gIEFjdGl2ZQorICAgICAqIGNsaWVudHMgYXJlIHJlcHJlc2VudGVkIGJ5IENsaWVudERlc2NyaXB0b3Igb2JqZWN0cyB0aGF0IGNvbnRhaW4gc3Ryb25nIHBvaW50ZXJzIHRvIHRoZQorICAgICAqIGFjdHVhbCBCYXNpY0NsaWVudCBzdWJjbGFzcyBiaW5kZXIgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLgorICAgICAqCisgICAgICogVGhpcyBjbGFzcyBtYW5hZ2VzIHRoZSBldmljdGlvbiBiZWhhdmlvciBmb3IgdGhlIGNhbWVyYSBjbGllbnRzLiAgU2VlIHRoZSBwYXJlbnQgY2xhc3MKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBpbiB1dGlscy9DbGllbnRNYW5hZ2VyIGZvciB0aGUgc3BlY2lmaWNzIG9mIHRoaXMgYmVoYXZpb3IuCisgICAgICovCisgICAgY2xhc3MgQ2FtZXJhQ2xpZW50TWFuYWdlciA6IHB1YmxpYyByZXNvdXJjZV9wb2xpY3k6OkNsaWVudE1hbmFnZXI8U3RyaW5nOCwKKyAgICAgICAgICAgIHNwPENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50PiwgQ2xpZW50RXZlbnRMaXN0ZW5lcj4geworICAgIHB1YmxpYzoKKyAgICAgICAgQ2FtZXJhQ2xpZW50TWFuYWdlcigpOworICAgICAgICB2aXJ0dWFsIH5DYW1lcmFDbGllbnRNYW5hZ2VyKCk7CiAKLSAgICAgICAgY29uc3Qgc3A8SVByb0NhbWVyYUNhbGxiYWNrcz4mIGdldFJlbW90ZUNhbGxiYWNrKCkgewotICAgICAgICAgICAgcmV0dXJuIG1SZW1vdGVDYWxsYmFjazsKLSAgICAgICAgfQorICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIGEgc3Ryb25nIHBvaW50ZXIgdG8gdGhlIGFjdGl2ZSBCYXNpY0NsaWVudCBmb3IgdGhpcyBjYW1lcmEgSUQsIG9yIGFuIGVtcHR5CisgICAgICAgICAqIGlmIG5vbmUgZXhpc3RzLgorICAgICAgICAgKi8KKyAgICAgICAgc3A8Q2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ+IGdldENhbWVyYUNsaWVudChjb25zdCBTdHJpbmc4JiBpZCkgY29uc3Q7CiAKLSAgICAgICAgLyoqKgotICAgICAgICAgICAgSVByb0NhbWVyYSBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgKioqLwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgY29ubmVjdChjb25zdCBzcDxJUHJvQ2FtZXJhQ2FsbGJhY2tzPiYgY2FsbGJhY2tzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGV4Y2x1c2l2ZVRyeUxvY2soKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBleGNsdXNpdmVMb2NrKCkgPSAwOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZXhjbHVzaXZlVW5sb2NrKCkgPSAwOworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGN1cnJlbnQgc3RhdGUuCisgICAgICAgICAqLworICAgICAgICBTdHJpbmc4IHRvU3RyaW5nKCkgY29uc3Q7CiAKLSAgICAgICAgdmlydHVhbCBib29sICAgICAgICAgIGhhc0V4Y2x1c2l2ZUxvY2soKSA9IDA7CisgICAgICAgIC8qKgorICAgICAgICAgKiBNYWtlIGEgQ2xpZW50RGVzY3JpcHRvciBvYmplY3Qgd3JhcHBpbmcgdGhlIGdpdmVuIEJhc2ljQ2xpZW50IHN0cm9uZyBwb2ludGVyLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIERlc2NyaXB0b3JQdHIgbWFrZUNsaWVudERlc2NyaXB0b3IoY29uc3QgU3RyaW5nOCYga2V5LCBjb25zdCBzcDxCYXNpY0NsaWVudD4mIHZhbHVlLAorICAgICAgICAgICAgICAgIGludDMyX3QgY29zdCwgY29uc3Qgc3RkOjpzZXQ8U3RyaW5nOD4mIGNvbmZsaWN0aW5nS2V5cywgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICBpbnQzMl90IG93bmVySWQpOwogCi0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgY2FsbGVlIGdldHMgYSBjb3B5IG9mIHRoZSBtZXRhZGF0YS4KLSAgICAgICAgdmlydHVhbCBpbnQgICAgICAgICAgIHN1Ym1pdFJlcXVlc3QoY2FtZXJhX21ldGFkYXRhX3QqIG1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZyA9IGZhbHNlKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBjYW5jZWxSZXF1ZXN0KGludCByZXF1ZXN0SWQpID0gMDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIE1ha2UgYSBDbGllbnREZXNjcmlwdG9yIG9iamVjdCB3cmFwcGluZyB0aGUgZ2l2ZW4gQmFzaWNDbGllbnQgc3Ryb25nIHBvaW50ZXIgd2l0aAorICAgICAgICAgKiB2YWx1ZXMgaW50aWFsaXplZCBmcm9tIGEgcHJpb3IgQ2xpZW50RGVzY3JpcHRvci4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBEZXNjcmlwdG9yUHRyIG1ha2VDbGllbnREZXNjcmlwdG9yKGNvbnN0IHNwPEJhc2ljQ2xpZW50PiYgdmFsdWUsCisgICAgICAgICAgICAgICAgY29uc3QgQ2FtZXJhU2VydmljZTo6RGVzY3JpcHRvclB0ciYgcGFydGlhbCk7CiAKLSAgICAgICAgLy8gQ2FsbGJhY2tzIGZyb20gY2FtZXJhIHNlcnZpY2UKLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG9uRXhjbHVzaXZlTG9ja1N0b2xlbigpID0gMDsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpOwotCi0gICAgICAgIHNwPElQcm9DYW1lcmFDYWxsYmFja3M+IG1SZW1vdGVDYWxsYmFjazsKLSAgICB9OyAvLyBjbGFzcyBQcm9DbGllbnQKKyAgICB9OyAvLyBjbGFzcyBDYW1lcmFDbGllbnRNYW5hZ2VyCiAKIHByaXZhdGU6CiAKKyAgICAvKioKKyAgICAgKiBDb250YWluZXIgY2xhc3MgZm9yIHRoZSBzdGF0ZSBvZiBlYWNoIGxvZ2ljYWwgY2FtZXJhIGRldmljZSwgaW5jbHVkaW5nOiBJRCwgc3RhdHVzLCBhbmQKKyAgICAgKiBkZXBlbmRlbmNpZXMgb24gb3RoZXIgZGV2aWNlcy4gIFRoZSBtYXBwaW5nIG9mIGNhbWVyYSBJRCAtPiBzdGF0ZSBzYXZlZCBpbiBtQ2FtZXJhU3RhdGVzCisgICAgICogcmVwcmVzZW50cyB0aGUgY2FtZXJhIGRldmljZXMgYWR2ZXJ0aXNlZCBieSB0aGUgSEFMIChhbmQgYW55IFVTQiBkZXZpY2VzLCB3aGVuIHdlIGFkZAorICAgICAqIHRob3NlKS4KKyAgICAgKgorICAgICAqIFRoaXMgY29udGFpbmVyIGRvZXMgTk9UIHJlcHJlc2VudCBhbiBhY3RpdmUgY2FtZXJhIGNsaWVudC4gIFRoZXNlIGFyZSByZXByZXNlbnRlZCB1c2luZworICAgICAqIHRoZSBDbGllbnREZXNjcmlwdG9ycyBzdG9yZWQgaW4gbUFjdGl2ZUNsaWVudE1hbmFnZXIuCisgICAgICovCisgICAgY2xhc3MgQ2FtZXJhU3RhdGUgeworICAgIHB1YmxpYzoKKyAgICAgICAgLyoqCisgICAgICAgICAqIE1ha2UgYSBuZXcgQ2FtZXJhU3RhdGUgYW5kIHNldCB0aGUgSUQsIGNvc3QsIGFuZCBjb25mbGljdGluZyBkZXZpY2VzIHVzaW5nIHRoZSB2YWx1ZXMKKyAgICAgICAgICogcmV0dXJuZWQgaW4gdGhlIEhBTCdzIGNhbWVyYV9pbmZvIHN0cnVjdCBmb3IgZWFjaCBkZXZpY2UuCisgICAgICAgICAqLworICAgICAgICBDYW1lcmFTdGF0ZShjb25zdCBTdHJpbmc4JiBpZCwgaW50IGNvc3QsIGNvbnN0IHN0ZDo6c2V0PFN0cmluZzg+JiBjb25mbGljdGluZyk7CisgICAgICAgIHZpcnR1YWwgfkNhbWVyYVN0YXRlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0aGUgc3RhdHVzIGZvciB0aGlzIGRldmljZS4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBtZXRob2QgYWNxdWlyZXMgbVN0YXR1c0xvY2suCisgICAgICAgICAqLworICAgICAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXMgZ2V0U3RhdHVzKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgc3RhdHVzIGZvciB0aGlzIGNhbWVyYSBkZXZpY2UsIHVubGVzcyB0aGUgZ2l2ZW4gc3RhdHVzCisgICAgICAgICAqIGlzIGluIHRoZSBnaXZlbiBsaXN0IG9mIHJlamVjdGVkIHN0YXR1cyBzdGF0ZXMsIGFuZCBleGVjdXRlIHRoZSBmdW5jdGlvbiBwYXNzZWQgaW4KKyAgICAgICAgICogd2l0aCBhIHNpZ25hdHVyZSBvblN0YXR1c1VwZGF0ZUxvY2tlZChjb25zdCBTdHJpbmc4JiwgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzKQorICAgICAgICAgKiBpZiB0aGUgc3RhdHVzIGhhcyBjaGFuZ2VkLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBpZGVtcG90ZW50LCBhbmQgd2lsbCBub3QgcmVzdWx0IGluIHRoZSBmdW5jdGlvbiBwYXNzZWQgdG8KKyAgICAgICAgICogb25TdGF0dXNVcGRhdGVMb2NrZWQgYmVpbmcgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIGZvciB0aGUgc2FtZSBhcmd1bWVudHMuCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGFxdWlyZXMgbVN0YXR1c0xvY2suCisgICAgICAgICAqLworICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBGdW5jPgorICAgICAgICB2b2lkIHVwZGF0ZVN0YXR1cyhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXMgc3RhdHVzLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzPiByZWplY3RTb3VyY2VTdGF0ZXMsCisgICAgICAgICAgICAgICAgRnVuYyBvblN0YXR1c1VwZGF0ZWRMb2NrZWQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIGxhc3Qgc2V0IENhbWVyYVBhcmFtZXRlcnMgb2JqZWN0IGdlbmVyYXRlZCBmcm9tIHRoZSBpbmZvcm1hdGlvbiByZXR1cm5lZCBieQorICAgICAgICAgKiB0aGUgSEFMIGZvciB0aGlzIGRldmljZSAob3IgYW4gZW1wdHkgQ2FtZXJhUGFyYW1ldGVycyBvYmplY3QgaWYgbm9uZSBoYXMgYmVlbiBzZXQpLgorICAgICAgICAgKi8KKyAgICAgICAgQ2FtZXJhUGFyYW1ldGVycyBnZXRTaGltUGFyYW1zKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgQ2FtZXJhUGFyYW1ldGVycyBmb3IgdGhpcyBkZXZpY2UuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHNldFNoaW1QYXJhbXMoY29uc3QgQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSByZXNvdXJjZV9jb3N0IGFkdmVydGlzZWQgYnkgdGhlIEhBTCBmb3IgdGhpcyBkZXZpY2UuCisgICAgICAgICAqLworICAgICAgICBpbnQgZ2V0Q29zdCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gYSBzZXQgb2YgdGhlIElEcyBvZiBjb25mbGljdGluZyBkZXZpY2VzIGFkdmVydGlzZWQgYnkgdGhlIEhBTCBmb3IgdGhpcyBkZXZpY2UuCisgICAgICAgICAqLworICAgICAgICBzdGQ6OnNldDxTdHJpbmc4PiBnZXRDb25mbGljdGluZygpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIElEIG9mIHRoaXMgY2FtZXJhIGRldmljZS4KKyAgICAgICAgICovCisgICAgICAgIFN0cmluZzggZ2V0SWQoKSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IFN0cmluZzggbUlkOworICAgICAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXMgbVN0YXR1czsgLy8gcHJvdGVjdGVkIGJ5IG1TdGF0dXNMb2NrCisgICAgICAgIGNvbnN0IGludCBtQ29zdDsKKyAgICAgICAgc3RkOjpzZXQ8U3RyaW5nOD4gbUNvbmZsaWN0aW5nOworICAgICAgICBtdXRhYmxlIE11dGV4IG1TdGF0dXNMb2NrOworICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzIG1TaGltUGFyYW1zOworICAgIH07IC8vIGNsYXNzIENhbWVyYVN0YXRlCisKICAgICAvLyBEZWxheS1sb2FkIHRoZSBDYW1lcmEgSEFMIG1vZHVsZQogICAgIHZpcnR1YWwgdm9pZCBvbkZpcnN0UmVmKCk7CiAKLSAgICAvLyBTdGVwIDEuIENoZWNrIGlmIHdlIGNhbiBjb25uZWN0LCBiZWZvcmUgd2UgYWNxdWlyZSB0aGUgc2VydmljZSBsb2NrLgotICAgIHN0YXR1c190ICAgICAgICAgICAgdmFsaWRhdGVDb25uZWN0KGludCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmlub3V0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGNsaWVudFVpZCkgY29uc3Q7CisgICAgLy8gQ2hlY2sgaWYgd2UgY2FuIGNvbm5lY3QsIGJlZm9yZSB3ZSBhY3F1aXJlIHRoZSBzZXJ2aWNlIGxvY2suCisgICAgc3RhdHVzX3QgdmFsaWRhdGVDb25uZWN0TG9ja2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCAvKmlub3V0Ki9pbnQmIGNsaWVudFVpZCkgY29uc3Q7CiAKLSAgICAvLyBTdGVwIDIuIENoZWNrIGlmIHdlIGNhbiBjb25uZWN0LCBhZnRlciB3ZSBhY3F1aXJlIHRoZSBzZXJ2aWNlIGxvY2suCi0gICAgYm9vbCAgICAgICAgICAgICAgICBjYW5Db25uZWN0VW5zYWZlKGludCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgcmVtb3RlQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8QmFzaWNDbGllbnQ+ICZjbGllbnQpOworICAgIC8vIEhhbmRsZSBhY3RpdmUgY2xpZW50IGV2aWN0aW9ucywgYW5kIHVwZGF0ZSBzZXJ2aWNlIHN0YXRlLgorICAgIC8vIE9ubHkgY2FsbCB3aXRoIHdpdGggbVNlcnZpY2VMb2NrIGhlbGQuCisgICAgc3RhdHVzX3QgaGFuZGxlRXZpY3Rpb25zTG9ja2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBpbnQgY2xpZW50UGlkLAorICAgICAgICBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgY29uc3Qgc3A8SUJpbmRlcj4mIHJlbW90ZUNhbGxiYWNrLCBjb25zdCBTdHJpbmc4JiBwYWNrYWdlTmFtZSwKKyAgICAgICAgLypvdXQqLworICAgICAgICBzcDxCYXNpY0NsaWVudD4qIGNsaWVudCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHJlc291cmNlX3BvbGljeTo6Q2xpZW50RGVzY3JpcHRvcjxTdHJpbmc4LCBzcDxCYXNpY0NsaWVudD4+PiogcGFydGlhbCk7CiAKLSAgICAvLyBXaGVuIGNvbm5lY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgaW5pdGlhbGl6ZSBjbGllbnQgYW5kIHRyYWNrIGl0cyBkZWF0aAotICAgIHN0YXR1c190ICAgICAgICAgICAgY29ubmVjdEZpbmlzaFVuc2FmZShjb25zdCBzcDxCYXNpY0NsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIHJlbW90ZUNhbGxiYWNrKTsKKyAgICAvLyBTaW5nbGUgaW1wbGVtZW50YXRpb24gc2hhcmVkIGJldHdlZW4gdGhlIHZhcmlvdXMgY29ubmVjdCBjYWxscworICAgIHRlbXBsYXRlPGNsYXNzIENBTExCQUNLLCBjbGFzcyBDTElFTlQ+CisgICAgc3RhdHVzX3QgY29ubmVjdEhlbHBlcihjb25zdCBzcDxDQUxMQkFDSz4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50IGhhbFZlcnNpb24sCisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGludCBjbGllbnRVaWQsIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLAorICAgICAgICAgICAgYm9vbCBsZWdhY3lNb2RlLCBib29sIHNoaW1VcGRhdGVPbmx5LCAvKm91dCovc3A8Q0xJRU5UPiYgZGV2aWNlKTsKIAotICAgIHZpcnR1YWwgc3A8QmFzaWNDbGllbnQ+ICBnZXRDbGllbnRCeVJlbW90ZShjb25zdCB3cDxJQmluZGVyPiYgY2FtZXJhQ2xpZW50KTsKLQorICAgIC8vIExvY2sgZ3VhcmRpbmcgY2FtZXJhIHNlcnZpY2Ugc3RhdGUKICAgICBNdXRleCAgICAgICAgICAgICAgIG1TZXJ2aWNlTG9jazsKLSAgICAvLyBlaXRoZXIgYSBDbGllbnQgb3IgQ2FtZXJhRGV2aWNlQ2xpZW50Ci0gICAgd3A8QmFzaWNDbGllbnQ+ICAgICBtQ2xpZW50W01BWF9DQU1FUkFTXTsgIC8vIHByb3RlY3RlZCBieSBtU2VydmljZUxvY2sKLSAgICBNdXRleCAgICAgICAgICAgICAgIG1DbGllbnRMb2NrW01BWF9DQU1FUkFTXTsgLy8gcHJldmVudCBDbGllbnQgZGVzdHJ1Y3Rpb24gaW5zaWRlIGNhbGxiYWNrcworCisgICAgLy8gQ29uZGl0aW9uIHRvIHVzZSB3aXRoIG1TZXJ2aWNlTG9jaywgdXNlZCB0byBoYW5kbGUgc2ltdWx0YW5lb3VzIGNvbm5lY3QgY2FsbHMgZnJvbSBjbGllbnRzCisgICAgc3RkOjpzaGFyZWRfcHRyPFdhaXRhYmxlTXV0ZXhXcmFwcGVyPiBtU2VydmljZUxvY2tXcmFwcGVyOworCisgICAgLy8gUmV0dXJuIE5PX0VSUk9SIGlmIHRoZSBkZXZpY2Ugd2l0aCBhIGdpdmUgSUQgY2FuIGJlIGNvbm5lY3RlZCB0bworICAgIHN0YXR1c190IGNoZWNrSWZEZXZpY2VJc1VzYWJsZShjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCkgY29uc3Q7CisKKyAgICAvLyBDb250YWluZXIgZm9yIG1hbmFnaW5nIGN1cnJlbnRseSBhY3RpdmUgYXBwbGljYXRpb24tbGF5ZXIgY2xpZW50cworICAgIENhbWVyYUNsaWVudE1hbmFnZXIgbUFjdGl2ZUNsaWVudE1hbmFnZXI7CisKKyAgICAvLyBNYXBwaW5nIGZyb20gY2FtZXJhIElEIC0+IHN0YXRlIGZvciBlYWNoIGRldmljZSwgbWFwIGlzIHByb3RlY3RlZCBieSBtQ2FtZXJhU3RhdGVzTG9jaworICAgIHN0ZDo6bWFwPFN0cmluZzgsIHN0ZDo6c2hhcmVkX3B0cjxDYW1lcmFTdGF0ZT4+IG1DYW1lcmFTdGF0ZXM7CisKKyAgICAvLyBNdXRleCBndWFyZGluZyBtQ2FtZXJhU3RhdGVzIG1hcAorICAgIG11dGFibGUgTXV0ZXggbUNhbWVyYVN0YXRlc0xvY2s7CisKKyAgICAvLyBDaXJjdWxhciBidWZmZXIgZm9yIHN0b3JpbmcgZXZlbnQgbG9nZ2luZyBmb3IgZHVtcHMKKyAgICBSaW5nQnVmZmVyPFN0cmluZzg+IG1FdmVudExvZzsKKyAgICBNdXRleCBtTG9nTG9jazsKKworICAgIC8vIEN1cnJlbnRseSBhbGxvd2VkIHVzZXIgSURzCisgICAgc3RkOjpzZXQ8dXNlcmlkX3Q+IG1BbGxvd2VkVXNlcnM7CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBjYW1lcmEgY2FwYWJpbGl0aWVzLCBzdWNoIGFzIHN1cHBvcnQgZm9yIGJhc2ljIGNvbG9yIG9wZXJhdGlvbgorICAgICAqLworICAgIGludCBjaGVja0NhbWVyYUNhcGFiaWxpdGllcyhpbnQgaWQsIGNhbWVyYV9pbmZvIGluZm8sIGludCAqbGF0ZXN0U3RyYW5nZUNhbWVyYUlkKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY2FtZXJhIHN0YXRlIGZvciBhIGdpdmVuIGNhbWVyYSBpZC4KKyAgICAgKgorICAgICAqIFRoaXMgYWNxdWlyZXMgbUNhbWVyYVN0YXRlc0xvY2suCisgICAgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPENhbWVyYVNlcnZpY2U6OkNhbWVyYVN0YXRlPiBnZXRDYW1lcmFTdGF0ZShjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBFdmljdCBjbGllbnQgd2hvJ3MgcmVtb3RlIGJpbmRlciBoYXMgZGllZC4gIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNsaWVudCB3YXMgaW4gdGhlIGFjdGl2ZQorICAgICAqIGxpc3QgYW5kIHdhcyBkaXNjb25uZWN0ZWQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBhY3F1aXJlcyBtU2VydmljZUxvY2suCisgICAgICovCisgICAgYm9vbCBldmljdENsaWVudElkQnlSZW1vdGUoY29uc3Qgd3A8SUJpbmRlcj4mIGNhbWVyYUNsaWVudCk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIGNsaWVudCBmcm9tIHRoZSBhY3RpdmUgY2xpZW50cyBsaXN0OyBkb2VzIG5vdCBkaXNjb25uZWN0IHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBhY3F1aXJlcyBtU2VydmljZUxvY2suCisgICAgICovCisgICAgdm9pZCByZW1vdmVCeUNsaWVudChjb25zdCBCYXNpY0NsaWVudCogY2xpZW50KTsKKworICAgIC8qKgorICAgICAqIEFkZCBuZXcgY2xpZW50IHRvIGFjdGl2ZSBjbGllbnRzIGxpc3QgYWZ0ZXIgY29uZmxpY3RpbmcgY2xpZW50cyBoYXZlIGRpc2Nvbm5lY3RlZCB1c2luZyB0aGUKKyAgICAgKiB2YWx1ZXMgc2V0IGluIHRoZSBwYXJ0aWFsIGRlc2NyaXB0b3IgcGFzc2VkIGluIHRvIGNvbnN0cnVjdCB0aGUgYWN0dWFsIGNsaWVudCBkZXNjcmlwdG9yLgorICAgICAqIFRoaXMgaXMgdHlwaWNhbGx5IGNhbGxlZCBhdCB0aGUgZW5kIG9mIGEgY29ubmVjdCBjYWxsLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgd2l0aCBtU2VydmljZUxvY2sgaGVsZC4KKyAgICAgKi8KKyAgICB2b2lkIGZpbmlzaENvbm5lY3RMb2NrZWQoY29uc3Qgc3A8QmFzaWNDbGllbnQ+JiBjbGllbnQsIGNvbnN0IERlc2NyaXB0b3JQdHImIGRlc2MpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW50ZWdlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBjYW1lcmEgSUQgc3RyaW5nLCBvciAtMSBvbiBmYWlsdXJlLgorICAgICAqLworICAgIHN0YXRpYyBpbnQgY2FtZXJhSWRUb0ludChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBzaW5nbGUgY2xpZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGNhbWVyYSBpZCBmcm9tIHRoZSBsaXN0IG9mIGFjdGl2ZSBjbGllbnRzLgorICAgICAqIElmIG5vbmUgZXhpc3RzLCByZXR1cm4gYW4gZW1wdHkgc3Ryb25ncG9pbnRlci4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIHdpdGggbVNlcnZpY2VMb2NrIGhlbGQuCisgICAgICovCisgICAgc3A8Q2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ+IHJlbW92ZUNsaWVudExvY2tlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCk7CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgYSBub3RpZmljYXRpb24gdGhhdCB0aGUgY3VycmVudCBkZXZpY2UgdXNlciBoYXMgY2hhbmdlZC4KKyAgICAgKi8KKyAgICB2b2lkIGRvVXNlclN3aXRjaChjb25zdCBpbnQzMl90KiBuZXdVc2VySWQsIHNpemVfdCBsZW5ndGgpOworCisgICAgLyoqCisgICAgICogQWRkIGFuIGV2ZW50IGxvZyBtZXNzYWdlLgorICAgICAqLworICAgIHZvaWQgbG9nRXZlbnQoY29uc3QgY2hhciogZXZlbnQpOworCisgICAgLyoqCisgICAgICogQWRkIGFuIGV2ZW50IGxvZyBtZXNzYWdlIHRoYXQgYSBjbGllbnQgaGFzIGJlZW4gZGlzY29ubmVjdGVkLgorICAgICAqLworICAgIHZvaWQgbG9nRGlzY29ubmVjdGVkKGNvbnN0IGNoYXIqIGNhbWVyYUlkLCBpbnQgY2xpZW50UGlkLCBjb25zdCBjaGFyKiBjbGllbnRQYWNrYWdlKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhbiBldmVudCBsb2cgbWVzc2FnZSB0aGF0IGEgY2xpZW50IGhhcyBiZWVuIGNvbm5lY3RlZC4KKyAgICAgKi8KKyAgICB2b2lkIGxvZ0Nvbm5lY3RlZChjb25zdCBjaGFyKiBjYW1lcmFJZCwgaW50IGNsaWVudFBpZCwgY29uc3QgY2hhciogY2xpZW50UGFja2FnZSk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gZXZlbnQgbG9nIG1lc3NhZ2UgdGhhdCBhIGNsaWVudCdzIGNvbm5lY3QgYXR0ZW1wdCBoYXMgYmVlbiByZWplY3RlZC4KKyAgICAgKi8KKyAgICB2b2lkIGxvZ1JlamVjdGVkKGNvbnN0IGNoYXIqIGNhbWVyYUlkLCBpbnQgY2xpZW50UGlkLCBjb25zdCBjaGFyKiBjbGllbnRQYWNrYWdlLAorICAgICAgICAgICAgY29uc3QgY2hhciogcmVhc29uKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhbiBldmVudCBsb2cgbWVzc2FnZSB0aGF0IHRoZSBjdXJyZW50IGRldmljZSB1c2VyIGhhcyBiZWVuIHN3aXRjaGVkLgorICAgICAqLworICAgIHZvaWQgbG9nVXNlclN3aXRjaChjb25zdCBzdGQ6OnNldDx1c2VyaWRfdD4mIG9sZFVzZXJJZHMsCisgICAgICAgIGNvbnN0IHN0ZDo6c2V0PHVzZXJpZF90PiYgbmV3VXNlcklkcyk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gZXZlbnQgbG9nIG1lc3NhZ2UgdGhhdCBhIGRldmljZSBoYXMgYmVlbiByZW1vdmVkIGJ5IHRoZSBIQUwKKyAgICAgKi8KKyAgICB2b2lkIGxvZ0RldmljZVJlbW92ZWQoY29uc3QgY2hhciogY2FtZXJhSWQsIGNvbnN0IGNoYXIqIHJlYXNvbik7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gZXZlbnQgbG9nIG1lc3NhZ2UgdGhhdCBhIGRldmljZSBoYXMgYmVlbiBhZGRlZCBieSB0aGUgSEFMCisgICAgICovCisgICAgdm9pZCBsb2dEZXZpY2VBZGRlZChjb25zdCBjaGFyKiBjYW1lcmFJZCwgY29uc3QgY2hhciogcmVhc29uKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhbiBldmVudCBsb2cgbWVzc2FnZSB0aGF0IGEgY2xpZW50IGhhcyB1bmV4cGVjdGVkbHkgZGllZC4KKyAgICAgKi8KKyAgICB2b2lkIGxvZ0NsaWVudERpZWQoaW50IGNsaWVudFBpZCwgY29uc3QgY2hhciogcmVhc29uKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhIGV2ZW50IGxvZyBtZXNzYWdlIHRoYXQgYSBzZXJpb3VzIHNlcnZpY2UtbGV2ZWwgZXJyb3IgaGFzIG9jY3VyZWQKKyAgICAgKi8KKyAgICB2b2lkIGxvZ1NlcnZpY2VFcnJvcihjb25zdCBjaGFyKiBtc2csIGludCBlcnJvckNvZGUpOworCisgICAgLyoqCisgICAgICogRHVtcCB0aGUgZXZlbnQgbG9nIHRvIGFuIEZECisgICAgICovCisgICAgdm9pZCBkdW1wRXZlbnRMb2coaW50IGZkKTsKKwogICAgIGludCAgICAgICAgICAgICAgICAgbU51bWJlck9mQ2FtZXJhczsKLQotICAgIHR5cGVkZWYgd3A8UHJvQ2xpZW50PiB3ZWFrX3Byb19jbGllbnRfcHRyOwotICAgIFZlY3Rvcjx3ZWFrX3Byb19jbGllbnRfcHRyPiBtUHJvQ2xpZW50TGlzdFtNQVhfQ0FNRVJBU107Ci0KLSAgICAvLyBuZWVkcyB0byBiZSBjYWxsZWQgd2l0aCBtU2VydmljZUxvY2sgaGVsZAotICAgIHNwPEJhc2ljQ2xpZW50PiAgICAgZmluZENsaWVudFVuc2FmZShjb25zdCB3cDxJQmluZGVyPiYgY2FtZXJhQ2xpZW50LCBpbnQmIG91dEluZGV4KTsKLSAgICBzcDxQcm9DbGllbnQ+ICAgICAgIGZpbmRQcm9DbGllbnRVbnNhZmUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8SUJpbmRlcj4mIGNhbWVyYUNhbGxiYWNrc1JlbW90ZSk7Ci0KLSAgICAvLyBhdG9taWNzIHRvIHJlY29yZCB3aGV0aGVyIHRoZSBoYXJkd2FyZSBpcyBhbGxvY2F0ZWQgdG8gc29tZSBjbGllbnQuCi0gICAgdm9sYXRpbGUgaW50MzJfdCAgICBtQnVzeVtNQVhfQ0FNRVJBU107Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBzZXRDYW1lcmFCdXN5KGludCBjYW1lcmFJZCk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBzZXRDYW1lcmFGcmVlKGludCBjYW1lcmFJZCk7CisgICAgaW50ICAgICAgICAgICAgICAgICBtTnVtYmVyT2ZOb3JtYWxDYW1lcmFzOwogCiAgICAgLy8gc291bmRzCiAgICAgTWVkaWFQbGF5ZXIqICAgICAgICBuZXdNZWRpYVBsYXllcihjb25zdCBjaGFyICpmaWxlKTsKQEAgLTM5MSw0NSArNjMyLDY0IEBACiAgICAgc3A8TWVkaWFQbGF5ZXI+ICAgICBtU291bmRQbGF5ZXJbTlVNX1NPVU5EU107CiAgICAgaW50ICAgICAgICAgICAgICAgICBtU291bmRSZWY7ICAvLyByZWZlcmVuY2UgY291bnQgKHJlbGVhc2UgYWxsIE1lZGlhUGxheWVyIHdoZW4gMCkKIAotICAgIGNhbWVyYV9tb2R1bGVfdCAqbU1vZHVsZTsKKyAgICBDYW1lcmFNb2R1bGUqICAgICBtTW9kdWxlOwogCi0gICAgVmVjdG9yPHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+ID4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lckxpc3Q7CisgICAgLy8gR3VhcmRlZCBieSBtU3RhdHVzTGlzdGVuZXJNdXRleAorICAgIHN0ZDo6dmVjdG9yPHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+PiBtTGlzdGVuZXJMaXN0OworICAgIE11dGV4ICAgICAgIG1TdGF0dXNMaXN0ZW5lckxvY2s7CiAKLSAgICAvLyBndWFyZCBvbmx5IG1TdGF0dXNMaXN0IGFuZCB0aGUgYnJvYWRjYXN0aW5nIG9mIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXIKLSAgICBtdXRhYmxlIE11dGV4ICAgICAgIG1TdGF0dXNNdXRleDsKLSAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXMKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXNMaXN0W01BWF9DQU1FUkFTXTsKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgdGhlIHN0YXR1cyBmb3IgdGhlIGdpdmVuIGNhbWVyYSBpZCAoaWYgdGhhdCBkZXZpY2UgZXhpc3RzKSwgYW5kIGJyb2FkY2FzdCB0aGUKKyAgICAgKiBzdGF0dXMgdXBkYXRlIHRvIGFsbCBjdXJyZW50IElDYW1lcmFTZXJ2aWNlTGlzdGVuZXJzIGlmIHRoZSBzdGF0dXMgaGFzIGNoYW5nZWQuICBBbnkKKyAgICAgKiBzdGF0dXNlcyBpbiByZWplY3RlZFNvdXJjZVN0YXRlcyB3aWxsIGJlIGlnbm9yZWQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGlkZW1wb3RlbnQuCisgICAgICogVGhpcyBtZXRob2QgYWNxdWlyZXMgbVN0YXR1c0xvY2sgYW5kIG1TdGF0dXNMaXN0ZW5lckxvY2suCisgICAgICovCisgICAgdm9pZCB1cGRhdGVTdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzIHN0YXR1cywgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzPiByZWplY3RlZFNvdXJjZVN0YXRlcyk7CisgICAgdm9pZCB1cGRhdGVTdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzIHN0YXR1cywgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpOwogCi0gICAgLy8gUmVhZCB0aGUgY3VycmVudCBzdGF0dXMgKGxvY2tzIG1TdGF0dXNNdXRleCkKLSAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0YXR1cyhpbnQgY2FtZXJhSWQpIGNvbnN0OworICAgIC8vIGZsYXNobGlnaHQgY29udHJvbAorICAgIHNwPENhbWVyYUZsYXNobGlnaHQ+IG1GbGFzaGxpZ2h0OworICAgIC8vIGd1YXJkIG1Ub3JjaFN0YXR1c01hcAorICAgIE11dGV4ICAgICAgICAgICAgICAgIG1Ub3JjaFN0YXR1c011dGV4OworICAgIC8vIGd1YXJkIG1Ub3JjaENsaWVudE1hcAorICAgIE11dGV4ICAgICAgICAgICAgICAgIG1Ub3JjaENsaWVudE1hcE11dGV4OworICAgIC8vIGd1YXJkIG1Ub3JjaFVpZE1hcAorICAgIE11dGV4ICAgICAgICAgICAgICAgIG1Ub3JjaFVpZE1hcE11dGV4OworICAgIC8vIGNhbWVyYSBpZCAtPiB0b3JjaCBzdGF0dXMKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpUb3JjaFN0YXR1cz4gbVRvcmNoU3RhdHVzTWFwOworICAgIC8vIGNhbWVyYSBpZCAtPiB0b3JjaCBjbGllbnQgYmluZGVyCisgICAgLy8gb25seSBzdG9yZSB0aGUgbGFzdCBjbGllbnQgdGhhdCB0dXJucyBvbiBlYWNoIGNhbWVyYSdzIHRvcmNoIG1vZGUKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBzcDxJQmluZGVyPj4gbVRvcmNoQ2xpZW50TWFwOworICAgIC8vIGNhbWVyYSBpZCAtPiBbaW5jb21pbmcgdWlkLCBjdXJyZW50IHVpZF0gcGFpcgorICAgIHN0ZDo6bWFwPFN0cmluZzgsIHN0ZDo6cGFpcjxpbnQsIGludD4+IG1Ub3JjaFVpZE1hcDsKIAotICAgIHR5cGVkZWYgVmVjdG9yPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlN0YXR1cz4gU3RhdHVzVmVjdG9yOwotICAgIC8vIEJyb2FkY2FzdCB0aGUgbmV3IHN0YXR1cyBpZiBpdCBjaGFuZ2VkIChsb2NrcyB0aGUgc2VydmljZSBtdXRleCkKLSAgICB2b2lkICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1cygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdHVzVmVjdG9yICpyZWplY3RTb3VyY2VTdGF0ZXMgPSBOVUxMKTsKKyAgICAvLyBjaGVjayBhbmQgaGFuZGxlIGlmIHRvcmNoIGNsaWVudCdzIHByb2Nlc3MgaGFzIGRpZWQKKyAgICB2b2lkIGhhbmRsZVRvcmNoQ2xpZW50QmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmd2hvKTsKKworICAgIC8vIGhhbmRsZSB0b3JjaCBtb2RlIHN0YXR1cyBjaGFuZ2UgYW5kIGludm9rZSBjYWxsYmFja3MuIG1Ub3JjaFN0YXR1c011dGV4CisgICAgLy8gc2hvdWxkIGJlIGxvY2tlZC4KKyAgICB2b2lkIG9uVG9yY2hTdGF0dXNDaGFuZ2VkTG9ja2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAorICAgICAgICAgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VG9yY2hTdGF0dXMgbmV3U3RhdHVzKTsKKworICAgIC8vIGdldCBhIGNhbWVyYSdzIHRvcmNoIHN0YXR1cy4gbVRvcmNoU3RhdHVzTXV0ZXggc2hvdWxkIGJlIGxvY2tlZC4KKyAgICBzdGF0dXNfdCBnZXRUb3JjaFN0YXR1c0xvY2tlZChjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCwKKyAgICAgICAgICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlRvcmNoU3RhdHVzICpzdGF0dXMpIGNvbnN0OworCisgICAgLy8gc2V0IGEgY2FtZXJhJ3MgdG9yY2ggc3RhdHVzLiBtVG9yY2hTdGF0dXNNdXRleCBzaG91bGQgYmUgbG9ja2VkLgorICAgIHN0YXR1c190IHNldFRvcmNoU3RhdHVzTG9ja2VkKGNvbnN0IFN0cmluZzggJmNhbWVyYUlkLAorICAgICAgICAgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VG9yY2hTdGF0dXMgc3RhdHVzKTsKIAogICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IGltcGxlbWVudGF0aW9uCiAgICAgdmlydHVhbCB2b2lkICAgICAgICBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pOwogCiAgICAgLy8gSGVscGVycwogCi0gICAgYm9vbCAgICAgICAgICAgICAgICBpc1ZhbGlkQ2FtZXJhSWQoaW50IGNhbWVyYUlkKTsKLQogICAgIGJvb2wgICAgICAgICAgICAgICAgc2V0VXBWZW5kb3JUYWdzKCk7CiAKICAgICAvKioKLSAgICAgKiBBIG1hcHBpbmcgb2YgY2FtZXJhIGlkcyB0byBDYW1lcmFQYXJhbWV0ZXJzIHJldHVybmVkIGJ5IHRoYXQgY2FtZXJhIGRldmljZS4KLSAgICAgKgotICAgICAqIFRoaXMgY2FjaGUgaXMgdXNlZCB0byBnZW5lcmF0ZSBDYW1lcmFDaGFyYWN0ZXJpc3RpYyBtZXRhZGF0YSB3aGVuIHVzaW5nCi0gICAgICogdGhlIEhBTDEgc2hpbS4KLSAgICAgKi8KLSAgICBLZXllZFZlY3RvcjxpbnQsIENhbWVyYVBhcmFtZXRlcnM+ICAgIG1TaGltUGFyYW1zOwotCi0gICAgLyoqCiAgICAgICogSW5pdGlhbGl6ZSBhbmQgY2FjaGUgdGhlIG1ldGFkYXRhIHVzZWQgYnkgdGhlIEhBTDEgc2hpbSBmb3IgYSBnaXZlbiBjYW1lcmFJZC4KICAgICAgKgogICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgpAQCAtNDUyLDI1ICs3MTIsMTk5IEBACiAgICAgICovCiAgICAgc3RhdHVzX3QgICAgICAgICAgICBnZW5lcmF0ZVNoaW1NZXRhZGF0YShpbnQgY2FtZXJhSWQsIC8qb3V0Ki9DYW1lcmFNZXRhZGF0YSogY2FtZXJhSW5mbyk7CiAKKyAgICBzdGF0aWMgaW50IGdldENhbGxpbmdQaWQoKTsKKworICAgIHN0YXRpYyBpbnQgZ2V0Q2FsbGluZ1VpZCgpOworCiAgICAgLyoqCi0gICAgICogQ29ubmVjdCBhIG5ldyBjYW1lcmEgY2xpZW50LiAgVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIHdoaWxlIGhvbGRpbmcgdGhlCi0gICAgICogbXV0ZXggZm9yIG1TZXJ2aWNlTG9jay4KLSAgICAgKgotICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAqIEdldCB0aGUgY3VycmVudCBzeXN0ZW0gdGltZSBhcyBhIGZvcm1hdHRlZCBzdHJpbmcuCiAgICAgICovCi0gICAgc3RhdHVzX3QgICAgICAgICAgICBjb25uZWN0SGVscGVyTG9ja2VkKAotICAgICAgICAgICAgLypvdXQqLwotICAgICAgICAgICAgc3A8Q2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgLyppbiovCi0gICAgICAgICAgICBjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAotICAgICAgICAgICAgaW50IGNhbWVyYUlkLAotICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgaW50IGNsaWVudFVpZCwKLSAgICAgICAgICAgIGludCBjYWxsaW5nUGlkLAotICAgICAgICAgICAgaW50IGhhbFZlcnNpb24gPSBDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVELAotICAgICAgICAgICAgYm9vbCBsZWdhY3lNb2RlID0gZmFsc2UpOworICAgIHN0YXRpYyBTdHJpbmc4IGdldEZvcm1hdHRlZEN1cnJlbnRUaW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNhbWVyYSBldmljdGlvbiBwcmlvcml0eSBmcm9tIHRoZSBjdXJyZW50IHByb2Nlc3Mgc3RhdGUgZ2l2ZW4gYnkgQWN0aXZpdHlNYW5hZ2VyLgorICAgICAqLworICAgIHN0YXRpYyBpbnQgZ2V0Q2FtZXJhUHJpb3JpdHlGcm9tUHJvY1N0YXRlKGludCBwcm9jU3RhdGUpOworCisgICAgc3RhdGljIHN0YXR1c190IG1ha2VDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBzcDxJSW50ZXJmYWNlPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzE2JiBwYWNrYWdlTmFtZSwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgICAgICBpbnQgZmFjaW5nLCBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsIGludCBzZXJ2aWNlUGlkLCBib29sIGxlZ2FjeU1vZGUsCisgICAgICAgICAgICBpbnQgaGFsVmVyc2lvbiwgaW50IGRldmljZVZlcnNpb24sIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLAorICAgICAgICAgICAgLypvdXQqL3NwPEJhc2ljQ2xpZW50PiogY2xpZW50KTsKKworICAgIHN0YXR1c190IGNoZWNrQ2FtZXJhQWNjZXNzKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKTsKKworICAgIHN0YXRpYyBTdHJpbmc4IHRvU3RyaW5nKHN0ZDo6c2V0PHVzZXJpZF90PiBpbnRTZXQpOworCisgICAgc3RhdGljIHZvaWQgcGluZ0NhbWVyYVNlcnZpY2VQcm94eSgpOworCiB9OwogCit0ZW1wbGF0ZTxjbGFzcyBGdW5jPgordm9pZCBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFTdGF0ZTo6dXBkYXRlU3RhdHVzKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlN0YXR1cyBzdGF0dXMsCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAorICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzPiByZWplY3RTb3VyY2VTdGF0ZXMsCisgICAgICAgIEZ1bmMgb25TdGF0dXNVcGRhdGVkTG9ja2VkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN0YXR1c0xvY2spOworICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlN0YXR1cyBvbGRTdGF0dXMgPSBtU3RhdHVzOworICAgIG1TdGF0dXMgPSBzdGF0dXM7CisKKyAgICBpZiAob2xkU3RhdHVzID09IHN0YXR1cykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoIiVzOiBTdGF0dXMgaGFzIGNoYW5nZWQgZm9yIGNhbWVyYSBJRCAlcyBmcm9tICUjeCB0byAlI3giLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgb2xkU3RhdHVzLCBzdGF0dXMpOworCisgICAgaWYgKG9sZFN0YXR1cyA9PSBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX1BSRVNFTlQgJiYKKyAgICAgICAgKHN0YXR1cyAhPSBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfUFJFU0VOVCAmJgorICAgICAgICAgc3RhdHVzICE9IElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19FTlVNRVJBVElORykpIHsKKworICAgICAgICBBTE9HVygiJXM6IEZyb20gTk9UX1BSRVNFTlQgY2FuIG9ubHkgdHJhbnNpdGlvbiBpbnRvIFBSRVNFTlQgb3IgRU5VTUVSQVRJTkciLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIG1TdGF0dXMgPSBvbGRTdGF0dXM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTb21ldGltZXMgd2Ugd2FudCB0byBjb25kaXRpb25hbGx5IGRvIGEgdHJhbnNpdGlvbi4KKyAgICAgKiBGb3IgZXhhbXBsZSBpZiBhIGNsaWVudCBkaXNjb25uZWN0cywgd2Ugd2FudCB0byBnbyB0byBQUkVTRU5UCisgICAgICogb25seSBpZiB3ZSB3ZXJlbid0IGFscmVhZHkgaW4gTk9UX1BSRVNFTlQgb3IgRU5VTUVSQVRJTkcuCisgICAgICovCisgICAgZm9yIChhdXRvJiByZWplY3RTdGF0dXMgOiByZWplY3RTb3VyY2VTdGF0ZXMpIHsKKyAgICAgICAgaWYgKG9sZFN0YXR1cyA9PSByZWplY3RTdGF0dXMpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogUmVqZWN0aW5nIHN0YXR1cyB0cmFuc2l0aW9uIGZvciBDYW1lcmEgSUQgJXMsICBzaW5jZSB0aGUgc291cmNlICIKKyAgICAgICAgICAgICAgICAgICAgInN0YXRlIHdhcyB3YXMgaW4gb25lIG9mIHRoZSBiYWQgc3RhdGVzLiIsIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgbVN0YXR1cyA9IG9sZFN0YXR1czsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG9uU3RhdHVzVXBkYXRlZExvY2tlZChjYW1lcmFJZCwgc3RhdHVzKTsKK30KKworCit0ZW1wbGF0ZTxjbGFzcyBDQUxMQkFDSywgY2xhc3MgQ0xJRU5UPgorc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Y29ubmVjdEhlbHBlcihjb25zdCBzcDxDQUxMQkFDSz4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgaW50IGhhbFZlcnNpb24sIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwgaW50IGNsaWVudFVpZCwKKyAgICAgICAgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgbGVnYWN5TW9kZSwgYm9vbCBzaGltVXBkYXRlT25seSwKKyAgICAgICAgLypvdXQqL3NwPENMSUVOVD4mIGRldmljZSkgeworICAgIHN0YXR1c190IHJldCA9IE5PX0VSUk9SOworICAgIFN0cmluZzggY2xpZW50TmFtZTgoY2xpZW50UGFja2FnZU5hbWUpOworICAgIGludCBjbGllbnRQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisKKyAgICBBTE9HSSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBjYWxsIChQSUQgJWQgXCIlc1wiLCBjYW1lcmEgSUQgJXMpIGZvciBIQUwgdmVyc2lvbiAlcyBhbmQgIgorICAgICAgICAgICAgIkNhbWVyYSBBUEkgdmVyc2lvbiAlZCIsIGNsaWVudFBpZCwgY2xpZW50TmFtZTguc3RyaW5nKCksIGNhbWVyYUlkLnN0cmluZygpLAorICAgICAgICAgICAgKGhhbFZlcnNpb24gPT0gLTEpID8gImRlZmF1bHQiIDogc3RkOjp0b19zdHJpbmcoaGFsVmVyc2lvbikuY19zdHIoKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oZWZmZWN0aXZlQXBpTGV2ZWwpKTsKKworICAgIHNwPENMSUVOVD4gY2xpZW50ID0gbnVsbHB0cjsKKyAgICB7CisgICAgICAgIC8vIEFjcXVpcmUgbVNlcnZpY2VMb2NrIGFuZCBwcmV2ZW50IG90aGVyIGNsaWVudHMgZnJvbSBjb25uZWN0aW5nCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBdXRvQ29uZGl0aW9uTG9jaz4gbG9jayA9CisgICAgICAgICAgICAgICAgQXV0b0NvbmRpdGlvbkxvY2s6OndhaXRBbmRBY3F1aXJlKG1TZXJ2aWNlTG9ja1dyYXBwZXIsIERFRkFVTFRfQ09OTkVDVF9USU1FT1VUX05TKTsKKworICAgICAgICBpZiAobG9jayA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIHJlamVjdGVkICh0b28gbWFueSBvdGhlciBjbGllbnRzIGNvbm5lY3RpbmcpLiIKKyAgICAgICAgICAgICAgICAgICAgLCBjbGllbnRQaWQpOworICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEVuZm9yY2UgY2xpZW50IHBlcm1pc3Npb25zIGFuZCBkbyBiYXNpYyBzYW5pdHkgY2hlY2tzCisgICAgICAgIGlmKChyZXQgPSB2YWxpZGF0ZUNvbm5lY3RMb2NrZWQoY2FtZXJhSWQsIC8qaW5vdXQqL2NsaWVudFVpZCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHNoaW0gcGFyYW1ldGVycyBhZnRlciBhY3F1aXJpbmcgbG9jaywgaWYgdGhleSBoYXZlIGFscmVhZHkgYmVlbiB1cGRhdGVkIGFuZAorICAgICAgICAvLyB3ZSB3ZXJlIGRvaW5nIGEgc2hpbSB1cGRhdGUsIHJldHVybiBpbW1lZGlhdGVseQorICAgICAgICBpZiAoc2hpbVVwZGF0ZU9ubHkpIHsKKyAgICAgICAgICAgIGF1dG8gY2FtZXJhU3RhdGUgPSBnZXRDYW1lcmFTdGF0ZShjYW1lcmFJZCk7CisgICAgICAgICAgICBpZiAoY2FtZXJhU3RhdGUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGlmICghY2FtZXJhU3RhdGUtPmdldFNoaW1QYXJhbXMoKS5pc0VtcHR5KCkpIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnRUbXAgPSBudWxscHRyOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cmVzb3VyY2VfcG9saWN5OjpDbGllbnREZXNjcmlwdG9yPFN0cmluZzgsIHNwPEJhc2ljQ2xpZW50Pj4+IHBhcnRpYWw7CisgICAgICAgIGlmICgocmV0ID0gaGFuZGxlRXZpY3Rpb25zTG9ja2VkKGNhbWVyYUlkLCBjbGllbnRQaWQsIGVmZmVjdGl2ZUFwaUxldmVsLAorICAgICAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGNhbWVyYUNiKSwgY2xpZW50TmFtZTgsIC8qb3V0Ki8mY2xpZW50VG1wLAorICAgICAgICAgICAgICAgIC8qb3V0Ki8mcGFydGlhbCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNsaWVudFRtcC5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlIGZvciBBUEkxIE1lZGlhUmVjb3JkZXIgd2hlcmUgdGhlIGV4aXN0aW5nIGNsaWVudCBpcyByZXR1cm5lZAorICAgICAgICAgICAgZGV2aWNlID0gc3RhdGljX2Nhc3Q8Q0xJRU5UKj4oY2xpZW50VG1wLmdldCgpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGdpdmUgZmxhc2hsaWdodCBhIGNoYW5jZSB0byBjbG9zZSBkZXZpY2VzIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgbUZsYXNobGlnaHQtPnByZXBhcmVEZXZpY2VPcGVuKGNhbWVyYUlkKTsKKworICAgICAgICAvLyBUT0RPOiBVcGRhdGUgZ2V0RGV2aWNlVmVyc2lvbiArIEhBTCBpbnRlcmZhY2UgdG8gdXNlIHN0cmluZ3MgZm9yIENhbWVyYSBJRHMKKyAgICAgICAgaW50IGlkID0gY2FtZXJhSWRUb0ludChjYW1lcmFJZCk7CisgICAgICAgIGlmIChpZCA9PSAtMSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNhbWVyYSBJRCAlcywgY2Fubm90IGdldCBkZXZpY2UgdmVyc2lvbiBmcm9tIEhBTC4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZmFjaW5nID0gLTE7CisgICAgICAgIGludCBkZXZpY2VWZXJzaW9uID0gZ2V0RGV2aWNlVmVyc2lvbihpZCwgLypvdXQqLyZmYWNpbmcpOworICAgICAgICBzcDxCYXNpY0NsaWVudD4gdG1wID0gbnVsbHB0cjsKKyAgICAgICAgaWYoKHJldCA9IG1ha2VDbGllbnQodGhpcywgY2FtZXJhQ2IsIGNsaWVudFBhY2thZ2VOYW1lLCBjYW1lcmFJZCwgZmFjaW5nLCBjbGllbnRQaWQsCisgICAgICAgICAgICAgICAgY2xpZW50VWlkLCBnZXRwaWQoKSwgbGVnYWN5TW9kZSwgaGFsVmVyc2lvbiwgZGV2aWNlVmVyc2lvbiwgZWZmZWN0aXZlQXBpTGV2ZWwsCisgICAgICAgICAgICAgICAgLypvdXQqLyZ0bXApKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBzdGF0aWNfY2FzdDxDTElFTlQqPih0bXAuZ2V0KCkpOworCisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoY2xpZW50LmdldCgpID09IG51bGxwdHIsICIlczogQ2FtZXJhU2VydmljZSBpbiBpbnZhbGlkIHN0YXRlIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworCisgICAgICAgIGlmICgocmV0ID0gY2xpZW50LT5pbml0aWFsaXplKG1Nb2R1bGUpKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgaW5pdGlhbGl6ZSBjbGllbnQgZnJvbSBIQUwgbW9kdWxlLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgc3A8SUJpbmRlcj4gcmVtb3RlQ2FsbGJhY2sgPSBjbGllbnQtPmdldFJlbW90ZSgpOworICAgICAgICBpZiAocmVtb3RlQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmVtb3RlQ2FsbGJhY2stPmxpbmtUb0RlYXRoKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVXBkYXRlIHNoaW0gcGFyZW1ldGVycyBmb3IgbGVnYWN5IGNsaWVudHMKKyAgICAgICAgaWYgKGVmZmVjdGl2ZUFwaUxldmVsID09IEFQSV8xKSB7CisgICAgICAgICAgICAvLyBBc3N1bWUgd2UgaGF2ZSBhbHdheXMgcmVjZWl2ZWQgYSBDbGllbnQgc3ViY2xhc3MgZm9yIEFQSTEKKyAgICAgICAgICAgIHNwPENsaWVudD4gc2hpbUNsaWVudCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2xpZW50Kj4oY2xpZW50LmdldCgpKTsKKyAgICAgICAgICAgIFN0cmluZzggcmF3UGFyYW1zID0gc2hpbUNsaWVudC0+Z2V0UGFyYW1ldGVycygpOworICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVycyBwYXJhbXMocmF3UGFyYW1zKTsKKworICAgICAgICAgICAgYXV0byBjYW1lcmFTdGF0ZSA9IGdldENhbWVyYVN0YXRlKGNhbWVyYUlkKTsKKyAgICAgICAgICAgIGlmIChjYW1lcmFTdGF0ZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgY2FtZXJhU3RhdGUtPnNldFNoaW1QYXJhbXMocGFyYW1zKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgdXBkYXRlIHNoaW0gcGFyYW1ldGVycyBmb3IgY2FtZXJhICVzLCBubyBzdWNoIGRldmljZSBleGlzdHMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHNoaW1VcGRhdGVPbmx5KSB7CisgICAgICAgICAgICAvLyBJZiBvbmx5IHVwZGF0aW5nIGxlZ2FjeSBzaGltIHBhcmFtZXRlcnMsIGltbWVkaWF0ZWx5IGRpc2Nvbm5lY3QgY2xpZW50CisgICAgICAgICAgICBtU2VydmljZUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBjbGllbnQtPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlTG9jay5sb2NrKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGFkZCBjbGllbnQgdG8gYWN0aXZlIGNsaWVudHMgbGlzdAorICAgICAgICAgICAgZmluaXNoQ29ubmVjdExvY2tlZChjbGllbnQsIHBhcnRpYWwpOworICAgICAgICB9CisgICAgfSAvLyBsb2NrIGlzIGRlc3Ryb3llZCwgYWxsb3cgZnVydGhlciBjb25uZWN0IGNhbGxzCisKKyAgICAvLyBJbXBvcnRhbnQ6IHJlbGVhc2UgdGhlIG11dGV4IGhlcmUgc28gdGhlIGNsaWVudCBjYW4gY2FsbCBiYWNrIGludG8gdGhlIHNlcnZpY2UgZnJvbSBpdHMKKyAgICAvLyBkZXN0cnVjdG9yIChjYW4gYmUgYXQgdGhlIGVuZCBvZiB0aGUgY2FsbCkKKyAgICBkZXZpY2UgPSBjbGllbnQ7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKaW5kZXggY2Q4MDhkYi4uMTY5NTMwOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCkBAIC02Nyw3ICs2Nyw3IEBACiAgICAgbUxlZ2FjeU1vZGUgPSBsZWdhY3lNb2RlOwogfQogCi1zdGF0dXNfdCBDYW1lcmEyQ2xpZW50Ojppbml0aWFsaXplKGNhbWVyYV9tb2R1bGVfdCAqbW9kdWxlKQorc3RhdHVzX3QgQ2FtZXJhMkNsaWVudDo6aW5pdGlhbGl6ZShDYW1lcmFNb2R1bGUgKm1vZHVsZSkKIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogSW5pdGlhbGl6aW5nIGNsaWVudCBmb3IgY2FtZXJhICVkIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwpAQCAtMTIxLDcgKzEyMSw4IEBACiAgICAgICAgIH0KICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjogeworICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgorICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18zOiB7CiAgICAgICAgICAgICBzcDxac2xQcm9jZXNzb3IzPiB6c2xQcm9jID0KICAgICAgICAgICAgICAgICAgICAgbmV3IFpzbFByb2Nlc3NvcjModGhpcywgbUNhcHR1cmVTZXF1ZW5jZXIpOwogICAgICAgICAgICAgbVpzbFByb2Nlc3NvciA9IHpzbFByb2M7CkBAIC0xNjcsMTEgKzE2OCw5IEBACiAKIHN0YXR1c190IENhbWVyYTJDbGllbnQ6OmR1bXBDbGllbnQoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CiAgICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiQ2xpZW50MlslZF0gKCVwKSBDbGllbnQ6ICVzIFBJRDogJWQsIGR1bXA6XG4iLAotICAgICAgICAgICAgbUNhbWVyYUlkLAorICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkNsaWVudDJbJWRdICglcCkgUElEOiAlZCwgZHVtcDpcbiIsIG1DYW1lcmFJZCwKICAgICAgICAgICAgIChnZXRSZW1vdGVDYWxsYmFjaygpICE9IE5VTEwgPwogICAgICAgICAgICAgICAgICAgICAoSUludGVyZmFjZTo6YXNCaW5kZXIoZ2V0UmVtb3RlQ2FsbGJhY2soKSkuZ2V0KCkpIDogTlVMTCksCi0gICAgICAgICAgICBTdHJpbmc4KG1DbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCksCiAgICAgICAgICAgICBtQ2xpZW50UGlkKTsKICAgICByZXN1bHQuYXBwZW5kKCIgIFN0YXRlOiAiKTsKICNkZWZpbmUgQ0FTRV9BUFBFTkRfRU5VTSh4KSBjYXNlIHg6IHJlc3VsdC5hcHBlbmQoI3ggIlxuIik7IGJyZWFrOwpAQCAtNTM0LDcgKzUzMyw3IEBACiAgICAgaWYgKCAocmVzID0gY2hlY2tQaWQoX19GVU5DVElPTl9fKSApICE9IE9LKSByZXR1cm4gcmVzOwogCiAgICAgc3A8SUJpbmRlcj4gYmluZGVyOwotICAgIHNwPEFOYXRpdmVXaW5kb3c+IHdpbmRvdzsKKyAgICBzcDxTdXJmYWNlPiB3aW5kb3c7CiAgICAgaWYgKGJ1ZmZlclByb2R1Y2VyICE9IDApIHsKICAgICAgICAgYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVyUHJvZHVjZXIpOwogICAgICAgICAvLyBVc2luZyBjb250cm9sbGVkQnlBcHAgZmxhZyB0byBlbnN1cmUgdGhhdCB0aGUgYnVmZmVyIHF1ZXVlIHJlbWFpbnMgaW4KQEAgLTU0Niw3ICs1NDUsNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEyQ2xpZW50OjpzZXRQcmV2aWV3V2luZG93TChjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyLAotICAgICAgICBzcDxBTmF0aXZlV2luZG93PiB3aW5kb3cpIHsKKyAgICAgICAgc3A8U3VyZmFjZT4gd2luZG93KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CiAKQEAgLTY3MSw3ICs2NzAsNyBAQAogICAgIHN0YXR1c190IHJlczsKICAgICBpZiAoIChyZXMgPSBjaGVja1BpZChfX0ZVTkNUSU9OX18pICkgIT0gT0spIHJldHVybiByZXM7CiAKLSAgICBzcDxBTmF0aXZlV2luZG93PiB3aW5kb3c7CisgICAgc3A8U3VyZmFjZT4gd2luZG93OwogICAgIGlmIChjYWxsYmFja1Byb2R1Y2VyICE9IDApIHsKICAgICAgICAgd2luZG93ID0gbmV3IFN1cmZhY2UoY2FsbGJhY2tQcm9kdWNlcik7CiAgICAgfQpAQCAtNzY5LDE2ICs3NjgsMjIgQEAKICAgICAvLyBmaXJzdCBjYXB0dXJlIGxhdGVuY3kgb24gSEFMMyBkZXZpY2VzLCBhbmQgcG90ZW50aWFsbHkgb24gc29tZSBIQUwyCiAgICAgLy8gZGV2aWNlcy4gU28gY3JlYXRlIGl0IHVuY29uZGl0aW9uYWxseSBhdCBwcmV2aWV3IHN0YXJ0LiBBcyBhIGRyYXdiYWNrLAogICAgIC8vIHRoaXMgaW5jcmVhc2VzIGdyYWxsb2MgbWVtb3J5IGNvbnN1bXB0aW9uIGZvciBhcHBsaWNhdGlvbnMgdGhhdCBkb24ndAotICAgIC8vIGV2ZXIgdGFrZSBhIHBpY3R1cmUuCisgICAgLy8gZXZlciB0YWtlIGEgcGljdHVyZS4gRG8gbm90IGVudGVyIHRoaXMgbW9kZSB3aGVuIGpwZWcgc3RyZWFtIHdpbGwgc2xvdworICAgIC8vIGRvd24gcHJldmlldy4KICAgICAvLyBUT0RPOiBGaW5kIGEgYmV0dGVyIGNvbXByb21pc2UsIHRob3VnaCB0aGlzIGxpa2VseSB3b3VsZCBpbnZvbHZlIEhBTAogICAgIC8vIGNoYW5nZXMuCiAgICAgaW50IGxhc3RKcGVnU3RyZWFtSWQgPSBtSnBlZ1Byb2Nlc3Nvci0+Z2V0U3RyZWFtSWQoKTsKLSAgICByZXMgPSB1cGRhdGVQcm9jZXNzb3JTdHJlYW0obUpwZWdQcm9jZXNzb3IsIHBhcmFtcyk7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgcHJlLWNvbmZpZ3VyZSBzdGlsbCBpbWFnZSAiCi0gICAgICAgICAgICAgICAgInN0cmVhbTogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICByZXR1cm4gcmVzOworICAgIC8vIElmIGpwZWcgc3RyZWFtIHdpbGwgc2xvdyBkb3duIHByZXZpZXcsIG1ha2Ugc3VyZSB3ZSByZW1vdmUgaXQgYmVmb3JlIHN0YXJ0aW5nIHByZXZpZXcKKyAgICBpZiAocGFyYW1zLnNsb3dKcGVnTW9kZSkgeworICAgICAgICBtSnBlZ1Byb2Nlc3Nvci0+ZGVsZXRlU3RyZWFtKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gdXBkYXRlUHJvY2Vzc29yU3RyZWFtKG1KcGVnUHJvY2Vzc29yLCBwYXJhbXMpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgcHJlLWNvbmZpZ3VyZSBzdGlsbCBpbWFnZSAiCisgICAgICAgICAgICAgICAgICAgICJzdHJlYW06ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CiAgICAgfQogICAgIGJvb2wganBlZ1N0cmVhbUNoYW5nZWQgPSBtSnBlZ1Byb2Nlc3Nvci0+Z2V0U3RyZWFtSWQoKSAhPSBsYXN0SnBlZ1N0cmVhbUlkOwogCkBAIC0xNDU4LDkgKzE0NjMsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBTdGFydGluZyBwaWN0dXJlIGNhcHR1cmUiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7Ci0KICAgICAgICAgaW50IGxhc3RKcGVnU3RyZWFtSWQgPSBtSnBlZ1Byb2Nlc3Nvci0+Z2V0U3RyZWFtSWQoKTsKLSAgICAgICAgcmVzID0gdXBkYXRlUHJvY2Vzc29yU3RyZWFtKG1KcGVnUHJvY2Vzc29yLCBsLm1QYXJhbWV0ZXJzKTsKKyAgICAgICAgLy8gc2xvd0pwZWdNb2RlIHdpbGwgY3JlYXRlIGpwZWcgc3RyZWFtIGluIENhcHR1cmVTZXF1ZW5jZXIgYmVmb3JlIGNhcHR1cmluZworICAgICAgICBpZiAoIWwubVBhcmFtZXRlcnMuc2xvd0pwZWdNb2RlKSB7CisgICAgICAgICAgICByZXMgPSB1cGRhdGVQcm9jZXNzb3JTdHJlYW0obUpwZWdQcm9jZXNzb3IsIGwubVBhcmFtZXRlcnMpOworICAgICAgICB9CisKICAgICAgICAgLy8gSWYgdmlkZW8gc25hcHNob3QgZmFpbCB0byBjb25maWd1cmVTdHJlYW0sIHRyeSBvdmVycmlkZSB2aWRlbyBzbmFwc2hvdCBzaXplIHRvCiAgICAgICAgIC8vIHZpZGVvIHNpemUKICAgICAgICAgaWYgKHJlcyA9PSBCQURfVkFMVUUgJiYgbC5tUGFyYW1ldGVycy5zdGF0ZSA9PSBQYXJhbWV0ZXJzOjpWSURFT19TTkFQU0hPVCkgewpAQCAtMTU2NCw2ICsxNTcyLDkgQEAKICAgICAgICAgICAgIHJldHVybiBjb21tYW5kUGluZ0woKTsKICAgICAgICAgY2FzZSBDQU1FUkFfQ01EX1NFVF9WSURFT19CVUZGRVJfQ09VTlQ6CiAgICAgICAgICAgICByZXR1cm4gY29tbWFuZFNldFZpZGVvQnVmZmVyQ291bnRMKGFyZzEpOworICAgICAgICBjYXNlIENBTUVSQV9DTURfU0VUX1ZJREVPX0ZPUk1BVDoKKyAgICAgICAgICAgIHJldHVybiBjb21tYW5kU2V0VmlkZW9Gb3JtYXRMKGFyZzEsCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGFuZHJvaWRfZGF0YXNwYWNlPihhcmcyKSk7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HRSgiJXM6IFVua25vd24gY29tbWFuZCAlZCAoYXJndW1lbnRzICVkLCAlZCkiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNtZCwgYXJnMSwgYXJnMik7CkBAIC0xNzE1LDYgKzE3MjYsNTEgQEAKICAgICByZXR1cm4gbVN0cmVhbWluZ1Byb2Nlc3Nvci0+c2V0UmVjb3JkaW5nQnVmZmVyQ291bnQoY291bnQpOwogfQogCitzdGF0dXNfdCBDYW1lcmEyQ2xpZW50Ojpjb21tYW5kU2V0VmlkZW9Gb3JtYXRMKGludCBmb3JtYXQsCisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFzcGFjZSkgeworICAgIGlmIChyZWNvcmRpbmdFbmFibGVkTCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBFcnJvciBzZXR0aW5nIHZpZGVvIGZvcm1hdCBhZnRlciAiCisgICAgICAgICAgICAgICAgInJlY29yZGluZyB3YXMgc3RhcnRlZCIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHJldHVybiBtU3RyZWFtaW5nUHJvY2Vzc29yLT5zZXRSZWNvcmRpbmdGb3JtYXQoZm9ybWF0LCBkYXRhc3BhY2UpOworfQorCit2b2lkIENhbWVyYTJDbGllbnQ6Om5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgeworICAgIGludDMyX3QgZXJyID0gQ0FNRVJBX0VSUk9SX1VOS05PV047CisgICAgc3dpdGNoKGVycm9yQ29kZSkgeworICAgICAgICBjYXNlIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQ6CisgICAgICAgICAgICBlcnIgPSBDQU1FUkFfRVJST1JfUkVMRUFTRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfREVWSUNFOgorICAgICAgICAgICAgZXJyID0gQ0FNRVJBX0VSUk9SX1VOS05PV047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfU0VSVklDRToKKyAgICAgICAgICAgIGVyciA9IENBTUVSQV9FUlJPUl9TRVJWRVJfRElFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVFVRVNUOgorICAgICAgICBjYXNlIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVNVTFQ6CisgICAgICAgIGNhc2UgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0JVRkZFUjoKKyAgICAgICAgICAgIEFMT0dXKCIlczogUmVjZWl2ZWQgcmVjb3ZlcmFibGUgZXJyb3IgJWQgZnJvbSBIQUwgLSBpZ25vcmluZywgcmVxdWVzdElkICUiIFBSSWQzMiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBlcnJvckNvZGUsIHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZXJyID0gQ0FNRVJBX0VSUk9SX1VOS05PV047CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBBTE9HRSgiJXM6IEVycm9yIGNvbmRpdGlvbiAlZCByZXBvcnRlZCBieSBIQUwsIHJlcXVlc3RJZCAlIiBQUklkMzIsIF9fRlVOQ1RJT05fXywgZXJyb3JDb2RlLAorICAgICAgICAgICAgICByZXN1bHRFeHRyYXMucmVxdWVzdElkKTsKKworICAgIFNoYXJlZENhbWVyYUNhbGxiYWNrczo6TG9jayBsKG1TaGFyZWRDYW1lcmFDYWxsYmFja3MpOworICAgIGlmIChsLm1SZW1vdGVDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIGwubVJlbW90ZUNhbGxiYWNrLT5ub3RpZnlDYWxsYmFjayhDQU1FUkFfTVNHX0VSUk9SLCBlcnIsIDApOworICAgIH0KK30KKworCiAvKiogRGV2aWNlLXJlbGF0ZWQgbWV0aG9kcyAqLwogdm9pZCBDYW1lcmEyQ2xpZW50Ojpub3RpZnlBdXRvRm9jdXModWludDhfdCBuZXdTdGF0ZSwgaW50IHRyaWdnZXJJZCkgewogICAgIEFMT0dWKCIlczogQXV0b2ZvY3VzIHN0YXRlIG5vdyAlZCwgbGFzdCB0cmlnZ2VyICVkIiwKQEAgLTE4NTIsNiArMTkwOCwxNiBAQAogICAgIG1DYXB0dXJlU2VxdWVuY2VyLT5ub3RpZnlBdXRvRXhwb3N1cmUobmV3U3RhdGUsIHRyaWdnZXJJZCk7CiB9CiAKK3ZvaWQgQ2FtZXJhMkNsaWVudDo6bm90aWZ5U2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApIHsKKyAgICAodm9pZClyZXN1bHRFeHRyYXM7CisgICAgKHZvaWQpdGltZXN0YW1wOworCisgICAgQUxPR1YoIiVzOiBTaHV0dGVyIG5vdGlmaWNhdGlvbiBmb3IgcmVxdWVzdCBpZCAlIiBQUklkMzIgIiBhdCB0aW1lICUiIFBSSWQ2NCwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgdGltZXN0YW1wKTsKKyAgICBtQ2FwdHVyZVNlcXVlbmNlci0+bm90aWZ5U2h1dHRlcihyZXN1bHRFeHRyYXMsIHRpbWVzdGFtcCk7Cit9CisKIGNhbWVyYTI6OlNoYXJlZFBhcmFtZXRlcnMmIENhbWVyYTJDbGllbnQ6OmdldFBhcmFtZXRlcnMoKSB7CiAgICAgcmV0dXJuIG1QYXJhbWV0ZXJzOwogfQpAQCAtMTg5MCw2ICsxOTU2LDM5IEBACiAgICAgcmV0dXJuIG1TdHJlYW1pbmdQcm9jZXNzb3ItPnN0b3BTdHJlYW0oKTsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhMkNsaWVudDo6Y3JlYXRlSnBlZ1N0cmVhbUwoUGFyYW1ldGVycyAmcGFyYW1zKSB7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgaW50IGxhc3RKcGVnU3RyZWFtSWQgPSBtSnBlZ1Byb2Nlc3Nvci0+Z2V0U3RyZWFtSWQoKTsKKyAgICBpZiAobGFzdEpwZWdTdHJlYW1JZCAhPSBOT19TVFJFQU0pIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHJlcyA9IG1TdHJlYW1pbmdQcm9jZXNzb3ItPnRvZ2dsZVBhdXNlU3RyZWFtKC8qcGF1c2UqL3RydWUpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IHBhdXNlIHN0cmVhbWluZzogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHJlcyA9IG1EZXZpY2UtPmZsdXNoKCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIGZsdXNoIGRldmljZTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIElkZWFsbHkgd2UgZG9uJ3QgbmVlZCB0aGlzLCBidXQgY3VycmVudCBjYW1lcmEgZGV2aWNlCisgICAgLy8gc3RhdHVzIHRyYWNraW5nIG1lY2hhbmlzbSBkZW1hbmRzIGl0LgorICAgIHJlcyA9IG1EZXZpY2UtPndhaXRVbnRpbERyYWluZWQoKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBXYWl0aW5nIGRldmljZSBkcmFpbiBmYWlsZWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICB9CisKKyAgICByZXMgPSB1cGRhdGVQcm9jZXNzb3JTdHJlYW0obUpwZWdQcm9jZXNzb3IsIHBhcmFtcyk7CisgICAgcmV0dXJuIHJlczsKK30KKwogY29uc3QgaW50MzJfdCBDYW1lcmEyQ2xpZW50OjprUHJldmlld1JlcXVlc3RJZFN0YXJ0OwogY29uc3QgaW50MzJfdCBDYW1lcmEyQ2xpZW50OjprUHJldmlld1JlcXVlc3RJZEVuZDsKIGNvbnN0IGludDMyX3QgQ2FtZXJhMkNsaWVudDo6a1JlY29yZGluZ1JlcXVlc3RJZFN0YXJ0OwpAQCAtMTk2Myw3ICsyMDYyLDcgQEAKICAgICAgICAgICAgIHJldHVybiB3aWR0aCAqIGhlaWdodCAqIDI7CiAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg6CiAgICAgICAgICAgICByZXR1cm4gd2lkdGggKiBoZWlnaHQgKiA0OwotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkFXX1NFTlNPUjoKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JBVzE2OgogICAgICAgICAgICAgcmV0dXJuIHdpZHRoICogaGVpZ2h0ICogMjsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dFKCIlczogVW5rbm93biBwcmV2aWV3IGZvcm1hdDogJXgiLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaAppbmRleCBhYmVlNzk3Li43ZTdhMjg0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaApAQCAtNzcsNiArNzcsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgcGFyYW1zKTsKICAgICB2aXJ0dWFsIFN0cmluZzggICAgICAgICBnZXRQYXJhbWV0ZXJzKCkgY29uc3Q7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2VuZENvbW1hbmQoaW50MzJfdCBjbWQsIGludDMyX3QgYXJnMSwgaW50MzJfdCBhcmcyKTsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7CiAKICAgICAvKioKICAgICAgKiBJbnRlcmZhY2UgdXNlZCBieSBDYW1lcmFTZXJ2aWNlCkBAIC05NCw3ICs5Niw3IEBACiAKICAgICB2aXJ0dWFsIH5DYW1lcmEyQ2xpZW50KCk7CiAKLSAgICBzdGF0dXNfdCBpbml0aWFsaXplKGNhbWVyYV9tb2R1bGVfdCAqbW9kdWxlKTsKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplKENhbWVyYU1vZHVsZSAqbW9kdWxlKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCkBAIC0xMDYsNiArMTA4LDggQEAKIAogICAgIHZpcnR1YWwgdm9pZCBub3RpZnlBdXRvRm9jdXModWludDhfdCBuZXdTdGF0ZSwgaW50IHRyaWdnZXJJZCk7CiAgICAgdmlydHVhbCB2b2lkIG5vdGlmeUF1dG9FeHBvc3VyZSh1aW50OF90IG5ld1N0YXRlLCBpbnQgdHJpZ2dlcklkKTsKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5U2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOwogCiAgICAgLyoqCiAgICAgICogSW50ZXJmYWNlIHVzZWQgYnkgaW5kZXBlbmRlbnQgY29tcG9uZW50cyBvZiBDYW1lcmEyQ2xpZW50LgpAQCAtMTI3LDYgKzEzMSw5IEBACiAKICAgICBzdGF0dXNfdCBzdG9wU3RyZWFtKCk7CiAKKyAgICAvLyBGb3IgdGhlIHNsb3dKcGVnTW9kZSB0byBjcmVhdGUganBlZyBzdHJlYW0gd2hlbiBwcmVjYXB0dXJlIHNlcXVlbmNlIGlzIGRvbmUKKyAgICBzdGF0dXNfdCBjcmVhdGVKcGVnU3RyZWFtTChjYW1lcmEyOjpQYXJhbWV0ZXJzICZwYXJhbXMpOworCiAgICAgc3RhdGljIHNpemVfdCBjYWxjdWxhdGVCdWZmZXJTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgIGludCBmb3JtYXQsIGludCBzdHJpZGUpOwogCkBAIC0xNDMsMTIgKzE1MCwxNSBAQAogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQXV0b2ZvY3VzTGFiZWw7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtUYWtlcGljdHVyZUxhYmVsOwogCisgICAgLy8gVXNlZCB3aXRoIHN0cmVhbSBJRHMKKyAgICBzdGF0aWMgY29uc3QgaW50IE5PX1NUUkVBTSA9IC0xOworCiBwcml2YXRlOgogICAgIC8qKiBJQ2FtZXJhIGludGVyZmFjZS1yZWxhdGVkIHByaXZhdGUgbWVtYmVycyAqLwogICAgIHR5cGVkZWYgY2FtZXJhMjo6UGFyYW1ldGVycyBQYXJhbWV0ZXJzOwogCiAgICAgc3RhdHVzX3Qgc2V0UHJldmlld1dpbmRvd0woY29uc3Qgc3A8SUJpbmRlcj4mIGJpbmRlciwKLSAgICAgICAgICAgIHNwPEFOYXRpdmVXaW5kb3c+IHdpbmRvdyk7CisgICAgICAgICAgICBzcDxTdXJmYWNlPiB3aW5kb3cpOwogICAgIHN0YXR1c190IHN0YXJ0UHJldmlld0woUGFyYW1ldGVycyAmcGFyYW1zLCBib29sIHJlc3RhcnQpOwogICAgIHZvaWQgICAgIHN0b3BQcmV2aWV3TCgpOwogICAgIHN0YXR1c190IHN0YXJ0UmVjb3JkaW5nTChQYXJhbWV0ZXJzICZwYXJhbXMsIGJvb2wgcmVzdGFydCk7CkBAIC0xNjUsNiArMTc1LDcgQEAKICAgICBzdGF0dXNfdCBjb21tYW5kRW5hYmxlRm9jdXNNb3ZlTXNnTChib29sIGVuYWJsZSk7CiAgICAgc3RhdHVzX3QgY29tbWFuZFBpbmdMKCk7CiAgICAgc3RhdHVzX3QgY29tbWFuZFNldFZpZGVvQnVmZmVyQ291bnRMKHNpemVfdCBjb3VudCk7CisgICAgc3RhdHVzX3QgY29tbWFuZFNldFZpZGVvRm9ybWF0TChpbnQgZm9ybWF0LCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UpOwogCiAgICAgLy8gQ3VycmVudCBjYW1lcmEgZGV2aWNlIGNvbmZpZ3VyYXRpb24KICAgICBjYW1lcmEyOjpTaGFyZWRQYXJhbWV0ZXJzIG1QYXJhbWV0ZXJzOwpAQCAtMTc0LDkgKzE4NSw2IEBACiAgICAgdm9pZCAgICAgc2V0UHJldmlld0NhbGxiYWNrRmxhZ0woUGFyYW1ldGVycyAmcGFyYW1zLCBpbnQgZmxhZyk7CiAgICAgc3RhdHVzX3QgdXBkYXRlUmVxdWVzdHMoUGFyYW1ldGVycyAmcGFyYW1zKTsKIAotICAgIC8vIFVzZWQgd2l0aCBzdHJlYW0gSURzCi0gICAgc3RhdGljIGNvbnN0IGludCBOT19TVFJFQU0gPSAtMTsKLQogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9jZXNzb3JUPgogICAgIHN0YXR1c190IHVwZGF0ZVByb2Nlc3NvclN0cmVhbShzcDxQcm9jZXNzb3JUPiBwcm9jZXNzb3IsIFBhcmFtZXRlcnMgcGFyYW1zKTsKICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvY2Vzc29yVCwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcAppbmRleCBkMWI5MjllLi45ZTZlZDRlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwCkBAIC01OSw3ICs1OSw3IEBACiAgICAgTE9HMSgiQ2FtZXJhQ2xpZW50OjpDYW1lcmFDbGllbnQgWCAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBjYW1lcmFJZCk7CiB9CiAKLXN0YXR1c190IENhbWVyYUNsaWVudDo6aW5pdGlhbGl6ZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSkgeworc3RhdHVzX3QgQ2FtZXJhQ2xpZW50Ojppbml0aWFsaXplKENhbWVyYU1vZHVsZSAqbW9kdWxlKSB7CiAgICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CiAgICAgc3RhdHVzX3QgcmVzOwogCkBAIC03NSw3ICs3NSw3IEBACiAgICAgc25wcmludGYoY2FtZXJhX2RldmljZV9uYW1lLCBzaXplb2YoY2FtZXJhX2RldmljZV9uYW1lKSwgIiVkIiwgbUNhbWVyYUlkKTsKIAogICAgIG1IYXJkd2FyZSA9IG5ldyBDYW1lcmFIYXJkd2FyZUludGVyZmFjZShjYW1lcmFfZGV2aWNlX25hbWUpOwotICAgIHJlcyA9IG1IYXJkd2FyZS0+aW5pdGlhbGl6ZSgmbW9kdWxlLT5jb21tb24pOworICAgIHJlcyA9IG1IYXJkd2FyZS0+aW5pdGlhbGl6ZShtb2R1bGUpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IHVuYWJsZSB0byBpbml0aWFsaXplIGRldmljZTogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtOTksMTIgKzk5LDcgQEAKIAogLy8gdGVhciBkb3duIHRoZSBjbGllbnQKIENhbWVyYUNsaWVudDo6fkNhbWVyYUNsaWVudCgpIHsKLSAgICAvLyB0aGlzIGxvY2sgc2hvdWxkIG5ldmVyIGJlIE5VTEwKLSAgICBNdXRleCogbG9jayA9IG1DYW1lcmFTZXJ2aWNlLT5nZXRDbGllbnRMb2NrQnlJZChtQ2FtZXJhSWQpOwotICAgIGxvY2stPmxvY2soKTsKICAgICBtRGVzdHJ1Y3Rpb25TdGFydGVkID0gdHJ1ZTsKLSAgICAvLyBjbGllbnQgd2lsbCBub3QgYmUgYWNjZXNzZWQgZnJvbSBjYWxsYmFjay4gc2hvdWxkIHVubG9jayB0byBwcmV2ZW50IGRlYWQtbG9jayBpbiBkaXNjb25uZWN0Ci0gICAgbG9jay0+dW5sb2NrKCk7CiAgICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiQ2FtZXJhQ2xpZW50Ojp+Q2FtZXJhQ2xpZW50IEUgKHBpZCAlZCwgdGhpcyAlcCkiLCBjYWxsaW5nUGlkLCB0aGlzKTsKIApAQCAtMTIwLDExICsxMTUsMTEgQEAKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKIAotICAgIHNpemVfdCBsZW4gPSBzbnByaW50ZihidWZmZXIsIFNJWkUsICJDbGllbnRbJWRdICglcCkgUElEOiAlZFxuIiwKKyAgICBzaXplX3QgbGVuID0gc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQ2xpZW50WyVkXSAoJXApIHdpdGggVUlEICVkXG4iLAogICAgICAgICAgICAgbUNhbWVyYUlkLAogICAgICAgICAgICAgKGdldFJlbW90ZUNhbGxiYWNrKCkgIT0gTlVMTCA/CiAgICAgICAgICAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGdldFJlbW90ZUNhbGxiYWNrKCkpLmdldCgpIDogTlVMTCksCi0gICAgICAgICAgICBtQ2xpZW50UGlkKTsKKyAgICAgICAgICAgIG1DbGllbnRVaWQpOwogICAgIGxlbiA9IChsZW4gPiBTSVpFIC0gMSkgPyBTSVpFIC0gMSA6IGxlbjsKICAgICB3cml0ZShmZCwgYnVmZmVyLCBsZW4pOwogCkBAIC02ODEsNiArNjc2LDEzIEBACiAgICAgICAgICAgICAgICAgTE9HMSgibG9ja0lmTWVzc2FnZVdhbnRlZCglZCk6IHdhaXRlZCBmb3IgJWQgbXMiLAogICAgICAgICAgICAgICAgICAgICBtc2dUeXBlLCBzbGVlcENvdW50ICogQ0hFQ0tfTUVTU0FHRV9JTlRFUlZBTCk7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIG1lc3NhZ2VzIGFyZSBubyBsb25nZXIgZW5hYmxlZCBhZnRlciBhY3F1aXJpbmcgbG9jaywgcmVsZWFzZSBhbmQgZHJvcCBtZXNzYWdlCisgICAgICAgICAgICBpZiAoKG1Nc2dFbmFibGVkICYgbXNnVHlwZSkgPT0gMCkgeworICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoc2xlZXBDb3VudCsrID09IDApIHsKQEAgLTcwNiwyNiArNzA4LDEzIEBACiAvLyAgICAgIChvdGhlcnMpICAgICAgICAgICAgICAgICAgICAgICAgYy0+ZGF0YUNhbGxiYWNrCiAvLyBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAKIC8vICAgICAgKG90aGVycykgICAgICAgICAgICAgICAgICAgICAgICBjLT5kYXRhQ2FsbGJhY2tUaW1lc3RhbXAKLS8vCi0vLyBOT1RFOiB0aGUgKkNhbGxiYWNrIGZ1bmN0aW9ucyBncmFiIG1Mb2NrIG9mIHRoZSBjbGllbnQgYmVmb3JlIHBhc3NpbmcKLS8vIGNvbnRyb2wgdG8gaGFuZGxlKiBmdW5jdGlvbnMuIFNvIHRoZSBoYW5kbGUqIGZ1bmN0aW9ucyBtdXN0IHJlbGVhc2UgdGhlCi0vLyBsb2NrIGJlZm9yZSBjYWxsaW5nIHRoZSBJQ2FtZXJhQ2xpZW50J3MgY2FsbGJhY2tzLCBzbyB0aG9zZSBjYWxsYmFja3MgY2FuCi0vLyBpbnZva2UgbWV0aG9kcyBpbiB0aGUgQ2xpZW50IGNsYXNzIGFnYWluIChGb3IgZXhhbXBsZSwgdGhlIHByZXZpZXcgZnJhbWUKLS8vIGNhbGxiYWNrIG1heSB3YW50IHRvIHJlbGVhc2VSZWNvcmRpbmdGcmFtZSkuIFRoZSBoYW5kbGUqIGZ1bmN0aW9ucyBtdXN0Ci0vLyByZWxlYXNlIHRoZSBsb2NrIGFmdGVyIGFsbCBhY2Nlc3NlcyB0byBtZW1iZXIgdmFyaWFibGVzLCBzbyBpdCBtdXN0IGJlCi0vLyBoYW5kbGVkIHZlcnkgY2FyZWZ1bGx5LgogCiB2b2lkIENhbWVyYUNsaWVudDo6bm90aWZ5Q2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBpbnQzMl90IGV4dDEsCiAgICAgICAgIGludDMyX3QgZXh0Miwgdm9pZCogdXNlcikgewogICAgIExPRzIoIm5vdGlmeUNhbGxiYWNrKCVkKSIsIG1zZ1R5cGUpOwogCi0gICAgTXV0ZXgqIGxvY2sgPSBnZXRDbGllbnRMb2NrRnJvbUNvb2tpZSh1c2VyKTsKLSAgICBpZiAobG9jayA9PSBOVUxMKSByZXR1cm47Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGFsb2NrKCpsb2NrKTsKLQotICAgIENhbWVyYUNsaWVudCogY2xpZW50ID0KLSAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYUNsaWVudCo+KGdldENsaWVudEZyb21Db29raWUodXNlcikpOwotICAgIGlmIChjbGllbnQgPT0gTlVMTCkgcmV0dXJuOworICAgIHNwPENhbWVyYUNsaWVudD4gY2xpZW50ID0gc3RhdGljX2Nhc3Q8Q2FtZXJhQ2xpZW50Kj4oZ2V0Q2xpZW50RnJvbUNvb2tpZSh1c2VyKS5nZXQoKSk7CisgICAgaWYgKGNsaWVudC5nZXQoKSA9PSBudWxscHRyKSByZXR1cm47CiAKICAgICBpZiAoIWNsaWVudC0+bG9ja0lmTWVzc2FnZVdhbnRlZChtc2dUeXBlKSkgcmV0dXJuOwogCkBAIC03NDQsMTMgKzczMyw4IEBACiAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhUHRyLCBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqbWV0YWRhdGEsIHZvaWQqIHVzZXIpIHsKICAgICBMT0cyKCJkYXRhQ2FsbGJhY2soJWQpIiwgbXNnVHlwZSk7CiAKLSAgICBNdXRleCogbG9jayA9IGdldENsaWVudExvY2tGcm9tQ29va2llKHVzZXIpOwotICAgIGlmIChsb2NrID09IE5VTEwpIHJldHVybjsKLSAgICBNdXRleDo6QXV0b2xvY2sgYWxvY2soKmxvY2spOwotCi0gICAgQ2FtZXJhQ2xpZW50KiBjbGllbnQgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhQ2xpZW50Kj4oZ2V0Q2xpZW50RnJvbUNvb2tpZSh1c2VyKSk7Ci0gICAgaWYgKGNsaWVudCA9PSBOVUxMKSByZXR1cm47CisgICAgc3A8Q2FtZXJhQ2xpZW50PiBjbGllbnQgPSBzdGF0aWNfY2FzdDxDYW1lcmFDbGllbnQqPihnZXRDbGllbnRGcm9tQ29va2llKHVzZXIpLmdldCgpKTsKKyAgICBpZiAoY2xpZW50LmdldCgpID09IG51bGxwdHIpIHJldHVybjsKIAogICAgIGlmICghY2xpZW50LT5sb2NrSWZNZXNzYWdlV2FudGVkKG1zZ1R5cGUpKSByZXR1cm47CiAgICAgaWYgKGRhdGFQdHIgPT0gMCAmJiBtZXRhZGF0YSA9PSBOVUxMKSB7CkBAIC03ODIsMTMgKzc2Niw4IEBACiAgICAgICAgIGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIsIHZvaWQqIHVzZXIpIHsKICAgICBMT0cyKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoJWQpIiwgbXNnVHlwZSk7CiAKLSAgICBNdXRleCogbG9jayA9IGdldENsaWVudExvY2tGcm9tQ29va2llKHVzZXIpOwotICAgIGlmIChsb2NrID09IE5VTEwpIHJldHVybjsKLSAgICBNdXRleDo6QXV0b2xvY2sgYWxvY2soKmxvY2spOwotCi0gICAgQ2FtZXJhQ2xpZW50KiBjbGllbnQgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhQ2xpZW50Kj4oZ2V0Q2xpZW50RnJvbUNvb2tpZSh1c2VyKSk7Ci0gICAgaWYgKGNsaWVudCA9PSBOVUxMKSByZXR1cm47CisgICAgc3A8Q2FtZXJhQ2xpZW50PiBjbGllbnQgPSBzdGF0aWNfY2FzdDxDYW1lcmFDbGllbnQqPihnZXRDbGllbnRGcm9tQ29va2llKHVzZXIpLmdldCgpKTsKKyAgICBpZiAoY2xpZW50LmdldCgpID09IG51bGxwdHIpIHJldHVybjsKIAogICAgIGlmICghY2xpZW50LT5sb2NrSWZNZXNzYWdlV2FudGVkKG1zZ1R5cGUpKSByZXR1cm47CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oCmluZGV4IGVkYTFhOWYuLjE3OTk5YTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaApAQCAtNjgsNyArNjgsNyBAQAogICAgICAgICAgICAgYm9vbCBsZWdhY3lNb2RlID0gZmFsc2UpOwogICAgIH5DYW1lcmFDbGllbnQoKTsKIAotICAgIHN0YXR1c190IGluaXRpYWxpemUoY2FtZXJhX21vZHVsZV90ICptb2R1bGUpOworICAgIHN0YXR1c190IGluaXRpYWxpemUoQ2FtZXJhTW9kdWxlICptb2R1bGUpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuY3BwCmluZGV4IGVhZGFhMDAuLjVmNGZiMjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmNwcApAQCAtNTUsNyArNTUsNyBAQAogfQogCiBzdGF0dXNfdCBDYWxsYmFja1Byb2Nlc3Nvcjo6c2V0Q2FsbGJhY2tXaW5kb3coCi0gICAgICAgIHNwPEFOYXRpdmVXaW5kb3c+IGNhbGxiYWNrV2luZG93KSB7CisgICAgICAgIHNwPFN1cmZhY2U+IGNhbGxiYWNrV2luZG93KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CiAKQEAgLTExNSw3ICsxMTUsNyBAQAogICAgICAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOwogICAgICAgICBtQ2FsbGJhY2tDb25zdW1lciA9IG5ldyBDcHVDb25zdW1lcihjb25zdW1lciwga0NhbGxiYWNrSGVhcENvdW50KTsKICAgICAgICAgbUNhbGxiYWNrQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIG1DYWxsYmFja0NvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoIkNhbWVyYTJDbGllbnQ6OkNhbGxiYWNrQ29uc3VtZXIiKSk7CisgICAgICAgIG1DYWxsYmFja0NvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoIkNhbWVyYTItQ2FsbGJhY2tDb25zdW1lciIpKTsKICAgICAgICAgbUNhbGxiYWNrV2luZG93ID0gbmV3IFN1cmZhY2UocHJvZHVjZXIpOwogICAgIH0KIApAQCAtMTIzLDcgKzEyMyw3IEBACiAgICAgICAgIC8vIENoZWNrIGlmIHN0cmVhbSBwYXJhbWV0ZXJzIGhhdmUgdG8gY2hhbmdlCiAgICAgICAgIHVpbnQzMl90IGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodCwgY3VycmVudEZvcm1hdDsKICAgICAgICAgcmVzID0gZGV2aWNlLT5nZXRTdHJlYW1JbmZvKG1DYWxsYmFja1N0cmVhbUlkLAotICAgICAgICAgICAgICAgICZjdXJyZW50V2lkdGgsICZjdXJyZW50SGVpZ2h0LCAmY3VycmVudEZvcm1hdCk7CisgICAgICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsICZjdXJyZW50Rm9ybWF0LCAwKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEVycm9yIHF1ZXJ5aW5nIGNhbGxiYWNrIG91dHB1dCBzdHJlYW0gaW5mbzogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLApAQCAtMTU0LDggKzE1NCw4IEBACiAgICAgICAgICAgICAgICAgcGFyYW1zLnByZXZpZXdXaWR0aCwgcGFyYW1zLnByZXZpZXdIZWlnaHQsCiAgICAgICAgICAgICAgICAgY2FsbGJhY2tGb3JtYXQsIHBhcmFtcy5wcmV2aWV3Rm9ybWF0KTsKICAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obUNhbGxiYWNrV2luZG93LAotICAgICAgICAgICAgICAgIHBhcmFtcy5wcmV2aWV3V2lkdGgsIHBhcmFtcy5wcmV2aWV3SGVpZ2h0LAotICAgICAgICAgICAgICAgIGNhbGxiYWNrRm9ybWF0LCAmbUNhbGxiYWNrU3RyZWFtSWQpOworICAgICAgICAgICAgICAgIHBhcmFtcy5wcmV2aWV3V2lkdGgsIHBhcmFtcy5wcmV2aWV3SGVpZ2h0LCBjYWxsYmFja0Zvcm1hdCwKKyAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX0pGSUYsIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzAsICZtQ2FsbGJhY2tTdHJlYW1JZCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBjcmVhdGUgb3V0cHV0IHN0cmVhbSBmb3IgY2FsbGJhY2tzOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsCkBAIC0zOTUsNyArMzk1LDcgQEAKIAogICAgICAgICBoZWFwSWR4ID0gbUNhbGxiYWNrSGVhcEhlYWQ7CiAKLSAgICAgICAgbUNhbGxiYWNrSGVhcEhlYWQgPSAobUNhbGxiYWNrSGVhcEhlYWQgKyAxKSAmIGtDYWxsYmFja0hlYXBDb3VudDsKKyAgICAgICAgbUNhbGxiYWNrSGVhcEhlYWQgPSAobUNhbGxiYWNrSGVhcEhlYWQgKyAxKSAlIGtDYWxsYmFja0hlYXBDb3VudDsKICAgICAgICAgbUNhbGxiYWNrSGVhcEZyZWUtLTsKIAogICAgICAgICAvLyBUT0RPOiBHZXQgcmlkIG9mIHRoaXMgY29weSBieSBwYXNzaW5nIHRoZSBncmFsbG9jIHF1ZXVlIGFsbCB0aGUgd2F5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5oCmluZGV4IDdmZGMzMjkuLmEyOTA1MzYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5oCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pOwogCiAgICAgLy8gU2V0IHRvIE5VTEwgdG8gZGlzYWJsZSB0aGUgZGlyZWN0LXRvLWFwcCBjYWxsYmFjayB3aW5kb3cKLSAgICBzdGF0dXNfdCBzZXRDYWxsYmFja1dpbmRvdyhzcDxBTmF0aXZlV2luZG93PiBjYWxsYmFja1dpbmRvdyk7CisgICAgc3RhdHVzX3Qgc2V0Q2FsbGJhY2tXaW5kb3coc3A8U3VyZmFjZT4gY2FsbGJhY2tXaW5kb3cpOwogICAgIHN0YXR1c190IHVwZGF0ZVN0cmVhbShjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMpOwogICAgIHN0YXR1c190IGRlbGV0ZVN0cmVhbSgpOwogICAgIGludCBnZXRTdHJlYW1JZCgpIGNvbnN0OwpAQCAtNzMsNyArNzMsNyBAQAogICAgIGludCBtQ2FsbGJhY2tTdHJlYW1JZDsKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtDYWxsYmFja0hlYXBDb3VudCA9IDY7CiAgICAgc3A8Q3B1Q29uc3VtZXI+ICAgIG1DYWxsYmFja0NvbnN1bWVyOwotICAgIHNwPEFOYXRpdmVXaW5kb3c+ICBtQ2FsbGJhY2tXaW5kb3c7CisgICAgc3A8U3VyZmFjZT4gICAgICAgIG1DYWxsYmFja1dpbmRvdzsKICAgICBzcDxDYW1lcmEySGVhcD4gICAgbUNhbGxiYWNrSGVhcDsKICAgICBpbnQgbUNhbGxiYWNrSGVhcElkOwogICAgIHNpemVfdCBtQ2FsbGJhY2tIZWFwSGVhZCwgbUNhbGxiYWNrSGVhcEZyZWU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAKaW5kZXggOTg0OWY0ZC4uNWY3ZmQ3NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcApAQCAtNDMsNiArNDMsOCBAQAogICAgICAgICBtTmV3RnJhbWVSZWNlaXZlZChmYWxzZSksCiAgICAgICAgIG1OZXdDYXB0dXJlUmVjZWl2ZWQoZmFsc2UpLAogICAgICAgICBtU2h1dHRlck5vdGlmaWVkKGZhbHNlKSwKKyAgICAgICAgbUhhbE5vdGlmaWVkU2h1dHRlcihmYWxzZSksCisgICAgICAgIG1TaHV0dGVyQ2FwdHVyZUlkKC0xKSwKICAgICAgICAgbUNsaWVudChjbGllbnQpLAogICAgICAgICBtQ2FwdHVyZVN0YXRlKElETEUpLAogICAgICAgICBtU3RhdGVUcmFuc2l0aW9uQ291bnQoMCksCkBAIC0xMDYsNiArMTA4LDE2IEBACiAgICAgfQogfQogCit2b2lkIENhcHR1cmVTZXF1ZW5jZXI6Om5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CisgICAgaWYgKCFtSGFsTm90aWZpZWRTaHV0dGVyICYmIHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQgPT0gbVNodXR0ZXJDYXB0dXJlSWQpIHsKKyAgICAgICAgbUhhbE5vdGlmaWVkU2h1dHRlciA9IHRydWU7CisgICAgICAgIG1TaHV0dGVyTm90aWZ5U2lnbmFsLnNpZ25hbCgpOworICAgIH0KK30KKwogdm9pZCBDYXB0dXJlU2VxdWVuY2VyOjpvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0ICZyZXN1bHQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogTmV3IHJlc3VsdCBhdmFpbGFibGUuIiwgX19GVU5DVElPTl9fKTsKQEAgLTMzNSw2ICszNDcsMTEgQEAKICAgICB9IGVsc2UgewogICAgICAgICBuZXh0U3RhdGUgPSBTVEFOREFSRF9TVEFSVDsKICAgICB9CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CisgICAgICAgIG1TaHV0dGVyQ2FwdHVyZUlkID0gbUNhcHR1cmVJZDsKKyAgICAgICAgbUhhbE5vdGlmaWVkU2h1dHRlciA9IGZhbHNlOworICAgIH0KICAgICBtU2h1dHRlck5vdGlmaWVkID0gZmFsc2U7CiAKICAgICByZXR1cm4gbmV4dFN0YXRlOwpAQCAtNDg3LDYgKzUwNCwxNyBAQAogICAgICAqICAtIHJlY29yZGluZyAoaWYgcmVjb3JkaW5nIGVuYWJsZWQpCiAgICAgICovCiAgICAgb3V0cHV0U3RyZWFtcy5wdXNoKGNsaWVudC0+Z2V0UHJldmlld1N0cmVhbUlkKCkpOworCisgICAgaW50IGNhcHR1cmVTdHJlYW1JZCA9IGNsaWVudC0+Z2V0Q2FwdHVyZVN0cmVhbUlkKCk7CisgICAgaWYgKGNhcHR1cmVTdHJlYW1JZCA9PSBDYW1lcmEyQ2xpZW50OjpOT19TVFJFQU0pIHsKKyAgICAgICAgcmVzID0gY2xpZW50LT5jcmVhdGVKcGVnU3RyZWFtTChsLm1QYXJhbWV0ZXJzKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSyB8fCBjbGllbnQtPmdldENhcHR1cmVTdHJlYW1JZCgpID09IENhbWVyYTJDbGllbnQ6Ok5PX1NUUkVBTSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IGNhbm5vdCBjcmVhdGUganBlZyBzdHJlYW0gZm9yIHNsb3dKcGVnIG1vZGU6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjbGllbnQtPmdldENhbWVyYUlkKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIERPTkU7CisgICAgICAgIH0KKyAgICB9CisKICAgICBvdXRwdXRTdHJlYW1zLnB1c2goY2xpZW50LT5nZXRDYXB0dXJlU3RyZWFtSWQoKSk7CiAKICAgICBpZiAobC5tUGFyYW1ldGVycy5wcmV2aWV3Q2FsbGJhY2tGbGFncyAmCkBAIC01NDEsNiArNTY5LDcgQEAKICAgICAgICAgICAgIHJldHVybiBET05FOwogICAgICAgICB9CiAgICAgfQorCiAgICAgLy8gVE9ETzogQ2FwdHVyZSBzaG91bGQgYmUgYXRvbWljIHdpdGggc2V0U3RyZWFtaW5nUmVxdWVzdCBoZXJlCiAgICAgcmVzID0gY2xpZW50LT5nZXRDYW1lcmFEZXZpY2UoKS0+Y2FwdHVyZShjYXB0dXJlQ29weSk7CiAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtNTYwLDYgKzU4OSwzMSBAQAogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOwogCisKKyAgICAvLyBXYWl0IGZvciBzaHV0dGVyIGNhbGxiYWNrCisgICAgd2hpbGUgKCFtSGFsTm90aWZpZWRTaHV0dGVyKSB7CisgICAgICAgIGlmIChtVGltZW91dENvdW50IDw9IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJlcyA9IG1TaHV0dGVyTm90aWZ5U2lnbmFsLndhaXRSZWxhdGl2ZShtSW5wdXRNdXRleCwga1dhaXREdXJhdGlvbik7CisgICAgICAgIGlmIChyZXMgPT0gVElNRURfT1VUKSB7CisgICAgICAgICAgICBtVGltZW91dENvdW50LS07CisgICAgICAgICAgICByZXR1cm4gU1RBTkRBUkRfQ0FQVFVSRV9XQUlUOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1IYWxOb3RpZmllZFNodXR0ZXIpIHsKKyAgICAgICAgaWYgKCFtU2h1dHRlck5vdGlmaWVkKSB7CisgICAgICAgICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwoY2xpZW50LT5nZXRQYXJhbWV0ZXJzKCkpOworICAgICAgICAgICAgLyogd2FybmluZzogdGhpcyBhbHNvIGxvY2tzIGEgU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzICovCisgICAgICAgICAgICBzaHV0dGVyTm90aWZ5TG9ja2VkKGwubVBhcmFtZXRlcnMsIGNsaWVudCwgbU1zZ1R5cGUpOworICAgICAgICAgICAgbVNodXR0ZXJOb3RpZmllZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1UaW1lb3V0Q291bnQgPD0gMCkgeworICAgICAgICBBTE9HVygiVGltZWQgb3V0IHdhaXRpbmcgZm9yIHNodXR0ZXIgbm90aWZpY2F0aW9uIik7CisgICAgICAgIHJldHVybiBET05FOworICAgIH0KKwogICAgIC8vIFdhaXQgZm9yIG5ldyBtZXRhZGF0YSByZXN1bHQgKG1OZXdGcmFtZSkKICAgICB3aGlsZSAoIW1OZXdGcmFtZVJlY2VpdmVkKSB7CiAgICAgICAgIHJlcyA9IG1OZXdGcmFtZVNpZ25hbC53YWl0UmVsYXRpdmUobUlucHV0TXV0ZXgsIGtXYWl0RHVyYXRpb24pOwpAQCAtNTY5LDE1ICs2MjMsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gQXBwcm94aW1hdGlvbiBvZiB0aGUgc2h1dHRlciBiZWluZyBjbG9zZWQKLSAgICAvLyAtIFRPRE86IHVzZSB0aGUgaGFsMyBleHBvc3VyZSBjYWxsYmFjayBpbiBDYW1lcmEzRGV2aWNlIGluc3RlYWQKLSAgICBpZiAobU5ld0ZyYW1lUmVjZWl2ZWQgJiYgIW1TaHV0dGVyTm90aWZpZWQpIHsKLSAgICAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKGNsaWVudC0+Z2V0UGFyYW1ldGVycygpKTsKLSAgICAgICAgLyogd2FybmluZzogdGhpcyBhbHNvIGxvY2tzIGEgU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzICovCi0gICAgICAgIHNodXR0ZXJOb3RpZnlMb2NrZWQobC5tUGFyYW1ldGVycywgY2xpZW50LCBtTXNnVHlwZSk7Ci0gICAgICAgIG1TaHV0dGVyTm90aWZpZWQgPSB0cnVlOwotICAgIH0KLQogICAgIC8vIFdhaXQgdW50aWwganBlZyB3YXMgY2FwdHVyZWQgYnkgSnBlZ1Byb2Nlc3NvcgogICAgIHdoaWxlIChtTmV3RnJhbWVSZWNlaXZlZCAmJiAhbU5ld0NhcHR1cmVSZWNlaXZlZCkgewogICAgICAgICByZXMgPSBtTmV3Q2FwdHVyZVNpZ25hbC53YWl0UmVsYXRpdmUobUlucHV0TXV0ZXgsIGtXYWl0RHVyYXRpb24pOwpAQCAtNTkxLDYgKzYzNiw3IEBACiAgICAgICAgIHJldHVybiBET05FOwogICAgIH0KICAgICBpZiAobU5ld0ZyYW1lUmVjZWl2ZWQgJiYgbU5ld0NhcHR1cmVSZWNlaXZlZCkgeworCiAgICAgICAgIGlmIChtTmV3RnJhbWVJZCAhPSBtQ2FwdHVyZUlkKSB7CiAgICAgICAgICAgICBBTE9HVygiTWlzbWF0Y2hlZCBjYXB0dXJlIGZyYW1lIElEczogRXhwZWN0ZWQgJWQsIGdvdCAlZCIsCiAgICAgICAgICAgICAgICAgICAgIG1DYXB0dXJlSWQsIG1OZXdGcmFtZUlkKTsKQEAgLTY2Nyw3ICs3MTMsNiBAQAogICAgICAgICBzcDxDYW1lcmEyQ2xpZW50PiAmLypjbGllbnQqLykgewogICAgIHN0YXR1c190IHJlczsKICAgICBBVFJBQ0VfQ0FMTCgpOwotCiAgICAgd2hpbGUgKCFtTmV3Q2FwdHVyZVJlY2VpdmVkKSB7CiAgICAgICAgIHJlcyA9IG1OZXdDYXB0dXJlU2lnbmFsLndhaXRSZWxhdGl2ZShtSW5wdXRNdXRleCwga1dhaXREdXJhdGlvbik7CiAgICAgICAgIGlmIChyZXMgPT0gVElNRURfT1VUKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaAppbmRleCBkNDJhYjEzLi4xMDI1MmZiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmgKQEAgLTYyLDYgKzYyLDEwIEBACiAgICAgLy8gTm90aWZpY2F0aW9ucyBhYm91dCBBRSBzdGF0ZSBjaGFuZ2VzCiAgICAgdm9pZCBub3RpZnlBdXRvRXhwb3N1cmUodWludDhfdCBuZXdTdGF0ZSwgaW50IHRyaWdnZXJJZCk7CiAKKyAgICAvLyBOb3RpZmljYXRpb25zIGFib3V0IHNodXR0ZXIgKGNhcHR1cmUgc3RhcnQpCisgICAgdm9pZCBub3RpZnlTaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOworCiAgICAgLy8gTm90aWZpY2F0aW9uIGZyb20gdGhlIGZyYW1lIHByb2Nlc3NvcgogICAgIHZpcnR1YWwgdm9pZCBvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0ICZyZXN1bHQpOwogCkBAIC05NSw3ICs5OSwxMCBAQAogICAgIHNwPE1lbW9yeUJhc2U+IG1DYXB0dXJlQnVmZmVyOwogICAgIENvbmRpdGlvbiBtTmV3Q2FwdHVyZVNpZ25hbDsKIAotICAgIGJvb2wgbVNodXR0ZXJOb3RpZmllZDsKKyAgICBib29sIG1TaHV0dGVyTm90aWZpZWQ7IC8vIEhhcyBDYXB0dXJlU2VxdWVuY2VyIHNlbnQgc2h1dHRlciB0byBDbGllbnQKKyAgICBib29sIG1IYWxOb3RpZmllZFNodXR0ZXI7IC8vIEhhcyBIQUwgc2VudCBzaHV0dGVyIHRvIENhcHR1cmVTZXF1ZW5jZXIKKyAgICBpbnQzMl90IG1TaHV0dGVyQ2FwdHVyZUlkOyAvLyBUaGUgY2FwdHVyZUlkIHdoaWNoIGlzIHdhaXRpbmcgZm9yIHNodXR0ZXIgbm90aWZpY2F0aW9uCisgICAgQ29uZGl0aW9uIG1TaHV0dGVyTm90aWZ5U2lnbmFsOwogCiAgICAgLyoqCiAgICAgICogSW50ZXJuYWwgdG8gQ2FwdHVyZVNlcXVlbmNlcgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwCmluZGV4IDI3NzIyNjcuLmJkOTc4NmYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAKQEAgLTg3LDcgKzg3LDcgQEAKICAgICAgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKICAgICAgICAgbUNhcHR1cmVDb25zdW1lciA9IG5ldyBDcHVDb25zdW1lcihjb25zdW1lciwgMSk7CiAgICAgICAgIG1DYXB0dXJlQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIG1DYXB0dXJlQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMkNsaWVudDo6Q2FwdHVyZUNvbnN1bWVyIikpOworICAgICAgICBtQ2FwdHVyZUNvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoIkNhbWVyYTItSnBlZ0NvbnN1bWVyIikpOwogICAgICAgICBtQ2FwdHVyZVdpbmRvdyA9IG5ldyBTdXJmYWNlKHByb2R1Y2VyKTsKICAgICB9CiAKQEAgLTExNSw3ICsxMTUsNyBAQAogICAgICAgICAvLyBDaGVjayBpZiBzdHJlYW0gcGFyYW1ldGVycyBoYXZlIHRvIGNoYW5nZQogICAgICAgICB1aW50MzJfdCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQ7CiAgICAgICAgIHJlcyA9IGRldmljZS0+Z2V0U3RyZWFtSW5mbyhtQ2FwdHVyZVN0cmVhbUlkLAotICAgICAgICAgICAgICAgICZjdXJyZW50V2lkdGgsICZjdXJyZW50SGVpZ2h0LCAwKTsKKyAgICAgICAgICAgICAgICAmY3VycmVudFdpZHRoLCAmY3VycmVudEhlaWdodCwgMCwgMCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBFcnJvciBxdWVyeWluZyBjYXB0dXJlIG91dHB1dCBzdHJlYW0gaW5mbzogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKQEAgLTE0NSw3ICsxNDUsOCBAQAogICAgICAgICAvLyBDcmVhdGUgc3RyZWFtIGZvciBIQUwgcHJvZHVjdGlvbgogICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShtQ2FwdHVyZVdpbmRvdywKICAgICAgICAgICAgICAgICBwYXJhbXMucGljdHVyZVdpZHRoLCBwYXJhbXMucGljdHVyZUhlaWdodCwKLSAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0JMT0IsICZtQ2FwdHVyZVN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0JMT0IsIEhBTF9EQVRBU1BBQ0VfSkZJRiwKKyAgICAgICAgICAgICAgICBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wLCAmbUNhcHR1cmVTdHJlYW1JZCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBjcmVhdGUgb3V0cHV0IHN0cmVhbSBmb3IgY2FwdHVyZTogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmgKaW5kZXggMjA0MGIzMC4uZmJkYWUxMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5oCkBAIC03MCw4ICs3MCw4IEBACiAKICAgICBpbnQgbUNhcHR1cmVTdHJlYW1JZDsKICAgICBzcDxDcHVDb25zdW1lcj4gICAgbUNhcHR1cmVDb25zdW1lcjsKLSAgICBzcDxBTmF0aXZlV2luZG93PiAgbUNhcHR1cmVXaW5kb3c7Ci0gICAgc3A8TWVtb3J5SGVhcEJhc2U+ICAgIG1DYXB0dXJlSGVhcDsKKyAgICBzcDxTdXJmYWNlPiAgICAgICAgbUNhcHR1cmVXaW5kb3c7CisgICAgc3A8TWVtb3J5SGVhcEJhc2U+IG1DYXB0dXJlSGVhcDsKIAogICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcAppbmRleCA0ZjRjZmIwLi40NDJlYjc1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCkBAIC02NSwxNSArNjUsMjkgQEAKICAgICBjb25zdCBTaXplIE1BWF9QUkVWSUVXX1NJWkUgPSB7IE1BWF9QUkVWSUVXX1dJRFRILCBNQVhfUFJFVklFV19IRUlHSFQgfTsKICAgICAvLyBUcmVhdCB0aGUgSC4yNjQgbWF4IHNpemUgYXMgdGhlIG1heCBzdXBwb3J0ZWQgdmlkZW8gc2l6ZS4KICAgICBNZWRpYVByb2ZpbGVzICp2aWRlb0VuY29kZXJQcm9maWxlcyA9IE1lZGlhUHJvZmlsZXM6OmdldEluc3RhbmNlKCk7Ci0gICAgaW50MzJfdCBtYXhWaWRlb1dpZHRoID0gdmlkZW9FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlclBhcmFtQnlOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmMudmlkLndpZHRoLm1heCIsIFZJREVPX0VOQ09ERVJfSDI2NCk7Ci0gICAgaW50MzJfdCBtYXhWaWRlb0hlaWdodCA9IHZpZGVvRW5jb2RlclByb2ZpbGVzLT5nZXRWaWRlb0VuY29kZXJQYXJhbUJ5TmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5jLnZpZC5oZWlnaHQubWF4IiwgVklERU9fRU5DT0RFUl9IMjY0KTsKLSAgICBjb25zdCBTaXplIE1BWF9WSURFT19TSVpFID0ge21heFZpZGVvV2lkdGgsIG1heFZpZGVvSGVpZ2h0fTsKKyAgICBWZWN0b3I8dmlkZW9fZW5jb2Rlcj4gZW5jb2RlcnMgPSB2aWRlb0VuY29kZXJQcm9maWxlcy0+Z2V0VmlkZW9FbmNvZGVycygpOworICAgIGludDMyX3QgbWF4VmlkZW9XaWR0aCA9IDA7CisgICAgaW50MzJfdCBtYXhWaWRlb0hlaWdodCA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbmNvZGVycy5zaXplKCk7IGkrKykgeworICAgICAgICBpbnQgd2lkdGggPSB2aWRlb0VuY29kZXJQcm9maWxlcy0+Z2V0VmlkZW9FbmNvZGVyUGFyYW1CeU5hbWUoCisgICAgICAgICAgICAgICAgImVuYy52aWQud2lkdGgubWF4IiwgZW5jb2RlcnNbaV0pOworICAgICAgICBpbnQgaGVpZ2h0ID0gdmlkZW9FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlclBhcmFtQnlOYW1lKAorICAgICAgICAgICAgICAgICJlbmMudmlkLmhlaWdodC5tYXgiLCBlbmNvZGVyc1tpXSk7CisgICAgICAgIC8vIFRyZWF0IHdpZHRoL2hlaWdodCBzZXBhcmF0ZWx5IGhlcmUgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGRpZmZlcmVudAorICAgICAgICAvLyBwcm9maWxlIG1pZ2h0IHJlcG9ydCBtYXggc2l6ZSBvZiBkaWZmZXJlbnQgYXNwZWN0IHJhdGlvCisgICAgICAgIGlmICh3aWR0aCA+IG1heFZpZGVvV2lkdGgpIHsKKyAgICAgICAgICAgIG1heFZpZGVvV2lkdGggPSB3aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGVpZ2h0ID4gbWF4VmlkZW9IZWlnaHQpIHsKKyAgICAgICAgICAgIG1heFZpZGVvSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICB9CisgICAgfQorICAgIC8vIFRoaXMgaXMganVzdCBhbiB1cHBlciBib3VuZCBhbmQgbWF5IG5vdCBiZSBhbiBhY3R1YWxseSB2YWxpZCB2aWRlbyBzaXplCisgICAgY29uc3QgU2l6ZSBWSURFT19TSVpFX1VQUEVSX0JPVU5EID0ge21heFZpZGVvV2lkdGgsIG1heFZpZGVvSGVpZ2h0fTsKIAogICAgIHJlcyA9IGdldEZpbHRlcmVkU2l6ZXMoTUFYX1BSRVZJRVdfU0laRSwgJmF2YWlsYWJsZVByZXZpZXdTaXplcyk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKLSAgICByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKE1BWF9WSURFT19TSVpFLCAmYXZhaWxhYmxlVmlkZW9TaXplcyk7CisgICAgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhWSURFT19TSVpFX1VQUEVSX0JPVU5ELCAmYXZhaWxhYmxlVmlkZW9TaXplcyk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKIAogICAgIC8vIFNlbGVjdCBpbml0aWFsIHByZXZpZXcgYW5kIHZpZGVvIHNpemUgdGhhdCdzIHVuZGVyIHRoZSBpbml0aWFsIGJvdW5kIGFuZApAQCAtMTgyLDkgKzE5Niw5IEBACiAgICAgICAgICAgICAgICAgc3VwcG9ydGVkUHJldmlld0Zvcm1hdHMgKz0KICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1lVVjQyMFNQOwogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgLy8gTm90IGFkdmVydGl6aW5nIEpQRUcsIFJBV19TRU5TT1IsIGV0YywgZm9yIHByZXZpZXcgZm9ybWF0cworICAgICAgICAgICAgLy8gTm90IGFkdmVydGl6aW5nIEpQRUcsIFJBVzE2LCBldGMsIGZvciBwcmV2aWV3IGZvcm1hdHMKICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOgotICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JBV19TRU5TT1I6CisgICAgICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkFXMTY6CiAgICAgICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQkxPQjoKICAgICAgICAgICAgICAgICBhZGRDb21tYSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtODc1LDE1ICs4ODksMzAgQEAKICAgICBwcmV2aWV3Q2FsbGJhY2tPbmVTaG90ID0gZmFsc2U7CiAgICAgcHJldmlld0NhbGxiYWNrU3VyZmFjZSA9IGZhbHNlOwogCisgICAgU2l6ZSBtYXhKcGVnU2l6ZSA9IGdldE1heFNpemUoZ2V0QXZhaWxhYmxlSnBlZ1NpemVzKCkpOworICAgIGludDY0X3QgbWluRnJhbWVEdXJhdGlvbk5zID0gZ2V0SnBlZ1N0cmVhbU1pbkZyYW1lRHVyYXRpb25OcyhtYXhKcGVnU2l6ZSk7CisKKyAgICBzbG93SnBlZ01vZGUgPSBmYWxzZTsKKyAgICBpZiAobWluRnJhbWVEdXJhdGlvbk5zID4ga1Nsb3dKcGVnTW9kZVRocmVzaG9sZCkgeworICAgICAgICBzbG93SnBlZ01vZGUgPSB0cnVlOworICAgICAgICAvLyBTbG93IGpwZWcgZGV2aWNlcyBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIHNuYXBzaG90IHdpdGhvdXQKKyAgICAgICAgLy8gc2xvd2luZyBkb3duIHByZXZpZXcuCisgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgdmlkZW8gc2l6ZSB2aWRlbyBzbmFwc2hvdCBvbmx5PworICAgICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9WSURFT19TTkFQU0hPVF9TVVBQT1JURUQsCisgICAgICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzOjpGQUxTRSk7CisgICAgfQorCiAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwogICAgIHByb3BlcnR5X2dldCgiY2FtZXJhLmRpc2FibGVfenNsX21vZGUiLCB2YWx1ZSwgIjAiKTsKLSAgICBpZiAoIXN0cmNtcCh2YWx1ZSwiMSIpKSB7CisgICAgaWYgKCFzdHJjbXAodmFsdWUsIjEiKSB8fCBzbG93SnBlZ01vZGUpIHsKICAgICAgICAgQUxPR0koIkNhbWVyYSAlZDogRGlzYWJsaW5nIFpTTCBtb2RlIiwgY2FtZXJhSWQpOwogICAgICAgICB6c2xNb2RlID0gZmFsc2U7CiAgICAgfSBlbHNlIHsKICAgICAgICAgenNsTW9kZSA9IHRydWU7CiAgICAgfQogCisgICAgQUxPR0koIiVzOiB6c2xNb2RlOiAlZCBzbG93SnBlZ01vZGUgJWQiLCBfX0ZVTkNUSU9OX18sIHpzbE1vZGUsIHNsb3dKcGVnTW9kZSk7CisKICAgICBsaWdodEZ4ID0gTElHSFRGWF9OT05FOwogCiAgICAgc3RhdGUgPSBTVE9QUEVEOwpAQCAtMjA4NiwxMiArMjExNSw3IEBACiAKICAgICBkZWxldGVbXSByZXFNZXRlcmluZ0FyZWFzOwogCi0gICAgLyogZG9uJ3QgaW5jbHVkZSBqcGVnIHRodW1ibmFpbCBzaXplIC0gaXQncyB2YWxpZCBmb3IKLSAgICAgICBpdCB0byBiZSBzZXQgdG8gKDAsMCksIG1lYW5pbmcgJ25vIHRodW1ibmFpbCcgKi8KLSAgICBDcm9wUmVnaW9uIGNyb3AgPSBjYWxjdWxhdGVDcm9wUmVnaW9uKCAoQ3JvcFJlZ2lvbjo6T3V0cHV0cykoCi0gICAgICAgICAgICBDcm9wUmVnaW9uOjpPVVRQVVRfUFJFVklFVyAgICAgfAotICAgICAgICAgICAgQ3JvcFJlZ2lvbjo6T1VUUFVUX1ZJREVPICAgICAgIHwKLSAgICAgICAgICAgIENyb3BSZWdpb246Ok9VVFBVVF9QSUNUVVJFICAgICkpOworICAgIENyb3BSZWdpb24gY3JvcCA9IGNhbGN1bGF0ZUNyb3BSZWdpb24oLypwcmV2aWV3T25seSovIGZhbHNlKTsKICAgICBpbnQzMl90IHJlcUNyb3BSZWdpb25bNF0gPSB7CiAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGNyb3AubGVmdCksCiAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGNyb3AudG9wKSwKQEAgLTIyNTMsNyArMjI3Nyw3IEBACiAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg6ICAgLy8gUkdCQTg4ODgKICAgICAgICAgICAgIGZtdCA9IENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9SR0JBODg4ODsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkFXX1NFTlNPUjoKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JBVzE2OgogICAgICAgICAgICAgQUxPR1coIlJhdyBzZW5zb3IgcHJldmlldyBmb3JtYXQgcmVxdWVzdGVkLiIpOwogICAgICAgICAgICAgZm10ID0gQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX0JBWUVSX1JHR0I7CiAgICAgICAgICAgICBicmVhazsKQEAgLTI1ODksNyArMjYxMyw3IEBACiAgICAgQUxPR19BU1NFUlQoeCA+PSAwLCAiQ3JvcC1yZWxhdGl2ZSBYIGNvb3JkaW5hdGUgPSAnJWQnIGlzIG91dCBvZiBib3VuZHMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIihsb3dlciA9IDApIiwgeCk7CiAKLSAgICBDcm9wUmVnaW9uIHByZXZpZXdDcm9wID0gY2FsY3VsYXRlQ3JvcFJlZ2lvbihDcm9wUmVnaW9uOjpPVVRQVVRfUFJFVklFVyk7CisgICAgQ3JvcFJlZ2lvbiBwcmV2aWV3Q3JvcCA9IGNhbGN1bGF0ZUNyb3BSZWdpb24oLypwcmV2aWV3T25seSovIHRydWUpOwogICAgIEFMT0dfQVNTRVJUKHggPCBwcmV2aWV3Q3JvcC53aWR0aCwgIkNyb3AtcmVsYXRpdmUgWCBjb29yZGluYXRlID0gJyVkJyAiCiAgICAgICAgICAgICAgICAgICAgICJpcyBvdXQgb2YgYm91bmRzICh1cHBlciA9ICVmKSIsIHgsIHByZXZpZXdDcm9wLndpZHRoKTsKIApAQCAtMjYwNSw3ICsyNjI5LDcgQEAKICAgICBBTE9HX0FTU0VSVCh5ID49IDAsICJDcm9wLXJlbGF0aXZlIFkgY29vcmRpbmF0ZSA9ICclZCcgaXMgb3V0IG9mIGJvdW5kcyAiCiAgICAgICAgICIobG93ZXIgPSAwKSIsIHkpOwogCi0gICAgQ3JvcFJlZ2lvbiBwcmV2aWV3Q3JvcCA9IGNhbGN1bGF0ZUNyb3BSZWdpb24oQ3JvcFJlZ2lvbjo6T1VUUFVUX1BSRVZJRVcpOworICAgIENyb3BSZWdpb24gcHJldmlld0Nyb3AgPSBjYWxjdWxhdGVDcm9wUmVnaW9uKC8qcHJldmlld09ubHkqLyB0cnVlKTsKICAgICBBTE9HX0FTU0VSVCh5IDwgcHJldmlld0Nyb3AuaGVpZ2h0LCAiQ3JvcC1yZWxhdGl2ZSBZIGNvb3JkaW5hdGUgPSAnJWQnIGlzICIKICAgICAgICAgICAgICAgICAib3V0IG9mIGJvdW5kcyAodXBwZXIgPSAlZikiLCB5LCBwcmV2aWV3Q3JvcC5oZWlnaHQpOwogCkBAIC0yNjIwLDEyICsyNjQ0LDEyIEBACiB9CiAKIGludCBQYXJhbWV0ZXJzOjpub3JtYWxpemVkWFRvQ3JvcChpbnQgeCkgY29uc3QgewotICAgIENyb3BSZWdpb24gcHJldmlld0Nyb3AgPSBjYWxjdWxhdGVDcm9wUmVnaW9uKENyb3BSZWdpb246Ok9VVFBVVF9QUkVWSUVXKTsKKyAgICBDcm9wUmVnaW9uIHByZXZpZXdDcm9wID0gY2FsY3VsYXRlQ3JvcFJlZ2lvbigvKnByZXZpZXdPbmx5Ki8gdHJ1ZSk7CiAgICAgcmV0dXJuICh4ICsgMTAwMCkgKiAocHJldmlld0Nyb3Aud2lkdGggLSAxKSAvIDIwMDA7CiB9CiAKIGludCBQYXJhbWV0ZXJzOjpub3JtYWxpemVkWVRvQ3JvcChpbnQgeSkgY29uc3QgewotICAgIENyb3BSZWdpb24gcHJldmlld0Nyb3AgPSBjYWxjdWxhdGVDcm9wUmVnaW9uKENyb3BSZWdpb246Ok9VVFBVVF9QUkVWSUVXKTsKKyAgICBDcm9wUmVnaW9uIHByZXZpZXdDcm9wID0gY2FsY3VsYXRlQ3JvcFJlZ2lvbigvKnByZXZpZXdPbmx5Ki8gdHJ1ZSk7CiAgICAgcmV0dXJuICh5ICsgMTAwMCkgKiAocHJldmlld0Nyb3AuaGVpZ2h0IC0gMSkgLyAyMDAwOwogfQogCkBAIC0yNzY5LDYgKzI3OTMsMTcgQEAKICAgICByZXR1cm4gbWF4U2l6ZTsKIH0KIAorUGFyYW1ldGVyczo6U2l6ZSBQYXJhbWV0ZXJzOjpnZXRNYXhTaXplKGNvbnN0IFZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiAmc2l6ZXMpIHsKKyAgICBTaXplIG1heFNpemUgPSB7LTEsIC0xfTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChzaXplc1tpXS53aWR0aCA+IG1heFNpemUud2lkdGggfHwKKyAgICAgICAgICAgICAgICAoc2l6ZXNbaV0ud2lkdGggPT0gbWF4U2l6ZS53aWR0aCAmJiBzaXplc1tpXS5oZWlnaHQgPiBtYXhTaXplLmhlaWdodCApKSB7CisgICAgICAgICAgICBtYXhTaXplID0gc2l6ZXNbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1heFNpemU7Cit9CisKIFZlY3RvcjxQYXJhbWV0ZXJzOjpTdHJlYW1Db25maWd1cmF0aW9uPiBQYXJhbWV0ZXJzOjpnZXRTdHJlYW1Db25maWd1cmF0aW9ucygpIHsKICAgICBjb25zdCBpbnQgU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSA9IDQ7CiAgICAgY29uc3QgaW50IFNUUkVBTV9GT1JNQVRfT0ZGU0VUID0gMDsKQEAgLTI3ODMsNyArMjgxOCw3IEBACiAKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVTdHJlYW1Db25maWdzID0KICAgICAgICAgICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMpOwotICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuY291bnQ7IGkrPSBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdmFpbGFibGVTdHJlYW1Db25maWdzLmNvdW50OyBpKz0gU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSkgewogICAgICAgICBpbnQzMl90IGZvcm1hdCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9GT1JNQVRfT0ZGU0VUXTsKICAgICAgICAgaW50MzJfdCB3aWR0aCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9XSURUSF9PRkZTRVRdOwogICAgICAgICBpbnQzMl90IGhlaWdodCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9IRUlHSFRfT0ZGU0VUXTsKQEAgLTI3OTQsMTEgKzI4MjksNTIgQEAKICAgICByZXR1cm4gc2NzOwogfQogCitpbnQ2NF90IFBhcmFtZXRlcnM6OmdldEpwZWdTdHJlYW1NaW5GcmFtZUR1cmF0aW9uTnMoUGFyYW1ldGVyczo6U2l6ZSBzaXplKSB7CisgICAgaWYgKG1EZXZpY2VWZXJzaW9uID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgIGNvbnN0IGludCBTVFJFQU1fRFVSQVRJT05fU0laRSA9IDQ7CisgICAgICAgIGNvbnN0IGludCBTVFJFQU1fRk9STUFUX09GRlNFVCA9IDA7CisgICAgICAgIGNvbnN0IGludCBTVFJFQU1fV0lEVEhfT0ZGU0VUID0gMTsKKyAgICAgICAgY29uc3QgaW50IFNUUkVBTV9IRUlHSFRfT0ZGU0VUID0gMjsKKyAgICAgICAgY29uc3QgaW50IFNUUkVBTV9EVVJBVElPTl9PRkZTRVQgPSAzOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVTdHJlYW1NaW5EdXJhdGlvbnMgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdmFpbGFibGVTdHJlYW1NaW5EdXJhdGlvbnMuY291bnQ7IGkrPSBTVFJFQU1fRFVSQVRJT05fU0laRSkgeworICAgICAgICAgICAgaW50NjRfdCBmb3JtYXQgPSBhdmFpbGFibGVTdHJlYW1NaW5EdXJhdGlvbnMuZGF0YS5pNjRbaSArIFNUUkVBTV9GT1JNQVRfT0ZGU0VUXTsKKyAgICAgICAgICAgIGludDY0X3Qgd2lkdGggPSBhdmFpbGFibGVTdHJlYW1NaW5EdXJhdGlvbnMuZGF0YS5pNjRbaSArIFNUUkVBTV9XSURUSF9PRkZTRVRdOworICAgICAgICAgICAgaW50NjRfdCBoZWlnaHQgPSBhdmFpbGFibGVTdHJlYW1NaW5EdXJhdGlvbnMuZGF0YS5pNjRbaSArIFNUUkVBTV9IRUlHSFRfT0ZGU0VUXTsKKyAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb24gPSBhdmFpbGFibGVTdHJlYW1NaW5EdXJhdGlvbnMuZGF0YS5pNjRbaSArIFNUUkVBTV9EVVJBVElPTl9PRkZTRVRdOworICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IgJiYgd2lkdGggPT0gc2l6ZS53aWR0aCAmJiBoZWlnaHQgPT0gc2l6ZS5oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZHVyYXRpb247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBWZWN0b3I8U2l6ZT4gYXZhaWxhYmxlSnBlZ1NpemVzID0gZ2V0QXZhaWxhYmxlSnBlZ1NpemVzKCk7CisgICAgICAgIHNpemVfdCBzdHJlYW1JZHggPSBhdmFpbGFibGVKcGVnU2l6ZXMuc2l6ZSgpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2YWlsYWJsZUpwZWdTaXplcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGF2YWlsYWJsZUpwZWdTaXplc1tpXS53aWR0aCA9PSBzaXplLndpZHRoICYmCisgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUpwZWdTaXplc1tpXS5oZWlnaHQgPT0gc2l6ZS5oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1JZHggPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzdHJlYW1JZHggIT0gYXZhaWxhYmxlSnBlZ1NpemVzLnNpemUoKSkgeworICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QganBlZ01pbkR1cmF0aW9ucyA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0pQRUdfTUlOX0RVUkFUSU9OUyk7CisgICAgICAgICAgICBpZiAoc3RyZWFtSWR4IDwganBlZ01pbkR1cmF0aW9ucy5jb3VudCkgeworICAgICAgICAgICAgICAgIHJldHVybiBqcGVnTWluRHVyYXRpb25zLmRhdGEuaTY0W3N0cmVhbUlkeF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR0UoIiVzOiBjYW5ub3QgZmluZCBtaW4gZnJhbWUgZHVyYXRpb24gZm9yIGpwZWcgc2l6ZSAlZHglZCIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNpemUud2lkdGgsIHNpemUuaGVpZ2h0KTsKKyAgICByZXR1cm4gLTE7Cit9CisKIFNvcnRlZFZlY3RvcjxpbnQzMl90PiBQYXJhbWV0ZXJzOjpnZXRBdmFpbGFibGVPdXRwdXRGb3JtYXRzKCkgewogICAgIFNvcnRlZFZlY3RvcjxpbnQzMl90PiBvdXRwdXRGb3JtYXRzOyAvLyBOb24tZHVwbGljYXRlZCBvdXRwdXQgZm9ybWF0cwogICAgIGlmIChtRGV2aWNlVmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgewogICAgICAgICBWZWN0b3I8U3RyZWFtQ29uZmlndXJhdGlvbj4gc2NzID0gZ2V0U3RyZWFtQ29uZmlndXJhdGlvbnMoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgc2NzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2NzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBjb25zdCBTdHJlYW1Db25maWd1cmF0aW9uICZzYyA9IHNjc1tpXTsKICAgICAgICAgICAgIGlmIChzYy5pc0lucHV0ID09IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUKSB7CiAgICAgICAgICAgICAgICAgb3V0cHV0Rm9ybWF0cy5hZGQoc2MuZm9ybWF0KTsKQEAgLTI4MDYsNyArMjg4Miw3IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVGb3JtYXRzID0gc3RhdGljSW5mbyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfRk9STUFUUyk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZUZvcm1hdHMuY291bnQ7IGkrKykgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2YWlsYWJsZUZvcm1hdHMuY291bnQ7IGkrKykgewogICAgICAgICAgICAgb3V0cHV0Rm9ybWF0cy5hZGQoYXZhaWxhYmxlRm9ybWF0cy5kYXRhLmkzMltpXSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0yODE3LDcgKzI4OTMsNyBAQAogICAgIFZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiBqcGVnU2l6ZXM7CiAgICAgaWYgKG1EZXZpY2VWZXJzaW9uID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CiAgICAgICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBzY3MgPSBnZXRTdHJlYW1Db25maWd1cmF0aW9ucygpOwotICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBzY3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzY3Muc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIGNvbnN0IFN0cmVhbUNvbmZpZ3VyYXRpb24gJnNjID0gc2NzW2ldOwogICAgICAgICAgICAgaWYgKHNjLmlzSW5wdXQgPT0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQgJiYKICAgICAgICAgICAgICAgICAgICAgc2MuZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgewpAQCAtMjgzMSw3ICsyOTA3LDcgQEAKICAgICAgICAgY29uc3QgaW50IEhFSUdIVF9PRkZTRVQgPSAxOwogICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVKcGVnU2l6ZXMgPQogICAgICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfSlBFR19TSVpFUyk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZUpwZWdTaXplcy5jb3VudDsgaSs9IEpQRUdfU0laRV9FTlRSWV9DT1VOVCkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2YWlsYWJsZUpwZWdTaXplcy5jb3VudDsgaSs9IEpQRUdfU0laRV9FTlRSWV9DT1VOVCkgewogICAgICAgICAgICAgaW50IHdpZHRoID0gYXZhaWxhYmxlSnBlZ1NpemVzLmRhdGEuaTMyW2kgKyBXSURUSF9PRkZTRVRdOwogICAgICAgICAgICAgaW50IGhlaWdodCA9IGF2YWlsYWJsZUpwZWdTaXplcy5kYXRhLmkzMltpICsgSEVJR0hUX09GRlNFVF07CiAgICAgICAgICAgICBTaXplIHN6ID0ge3dpZHRoLCBoZWlnaHR9OwpAQCAtMjg0MSw4ICsyOTE3LDcgQEAKICAgICByZXR1cm4ganBlZ1NpemVzOwogfQogCi1QYXJhbWV0ZXJzOjpDcm9wUmVnaW9uIFBhcmFtZXRlcnM6OmNhbGN1bGF0ZUNyb3BSZWdpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyczo6Q3JvcFJlZ2lvbjo6T3V0cHV0cyBvdXRwdXRzKSBjb25zdCB7CitQYXJhbWV0ZXJzOjpDcm9wUmVnaW9uIFBhcmFtZXRlcnM6OmNhbGN1bGF0ZUNyb3BSZWdpb24oYm9vbCBwcmV2aWV3T25seSkgY29uc3QgewogCiAgICAgZmxvYXQgem9vbUxlZnQsIHpvb21Ub3AsIHpvb21XaWR0aCwgem9vbUhlaWdodDsKIApAQCAtMjg2Niw5MCArMjk0MSw0NSBAQAogICAgICAgICAgIG1heERpZ2l0YWxab29tLmRhdGEuZlswXSwgem9vbUluY3JlbWVudCwgem9vbVJhdGlvLCBwcmV2aWV3V2lkdGgsCiAgICAgICAgICAgcHJldmlld0hlaWdodCwgZmFzdEluZm8uYXJyYXlXaWR0aCwgZmFzdEluZm8uYXJyYXlIZWlnaHQpOwogCi0gICAgLyoKLSAgICAgKiBBc3N1bXB0aW9uOiBPbiB0aGUgSEFMIHNpZGUgZWFjaCBzdHJlYW0gYnVmZmVyIGNhbGN1bGF0ZXMgaXRzIGNyb3AKLSAgICAgKiByZWN0YW5nbGUgYXMgZm9sbG93czoKLSAgICAgKiAgIGNyb3BSZWN0ID0gKHpvb21MZWZ0LCB6b29tUmlnaHQsCi0gICAgICogICAgICAgICAgICAgICB6b29tV2lkdGgsIHpvb21IZWlnaHQgKiB6b29tV2lkdGggLyBvdXRwdXRXaWR0aCk7Ci0gICAgICoKLSAgICAgKiBOb3RlIHRoYXQgaWYgem9vbVdpZHRoID4gYnVmZmVyV2lkdGgsIHRoZSBuZXcgY3JvcEhlaWdodCA+IHpvb21IZWlnaHQKLSAgICAgKiAgICAgICh3ZSBjYW4gdGhlbiBnZXQgaW50byB0cm91YmxlIGlmIHRoZSBjcm9wSGVpZ2h0ID4gYXJyYXlIZWlnaHQpLgotICAgICAqIEJ5IHNlbGVjdGluZyB0aGUgem9vbVJhdGlvIGJhc2VkIG9uIHRoZSBzbWFsbGVzdCBvdXRwdXRSYXRpbywgd2UKLSAgICAgKiBndWFyYW50ZWUgdGhpcyB3aWxsIG5ldmVyIGhhcHBlbi4KLSAgICAgKi8KKyAgICBpZiAocHJldmlld09ubHkpIHsKKyAgICAgICAgLy8gQ2FsY3VsYXRlIGEgdGlnaHQgY3JvcCByZWdpb24gZm9yIHRoZSBwcmV2aWV3IHN0cmVhbSBvbmx5CisgICAgICAgIGZsb2F0IHByZXZpZXdSYXRpbyA9IHN0YXRpY19jYXN0PGZsb2F0PihwcmV2aWV3V2lkdGgpIC8gcHJldmlld0hlaWdodDsKIAotICAgIC8vIEVudW1lcmF0ZSBhbGwgcG9zc2libGUgb3V0cHV0IHNpemVzLCBzZWxlY3QgdGhlIG9uZSB3aXRoIHRoZSBzbWFsbGVzdAotICAgIC8vIGFzcGVjdCByYXRpbwotICAgIGZsb2F0IG1pbk91dHB1dFdpZHRoLCBtaW5PdXRwdXRIZWlnaHQsIG1pbk91dHB1dFJhdGlvOwotICAgIHsKLSAgICAgICAgZmxvYXQgb3V0cHV0U2l6ZXNbXVsyXSA9IHsKLSAgICAgICAgICAgIHsgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHByZXZpZXdXaWR0aCksCi0gICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihwcmV2aWV3SGVpZ2h0KSB9LAotICAgICAgICAgICAgeyBzdGF0aWNfY2FzdDxmbG9hdD4odmlkZW9XaWR0aCksCi0gICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0Pih2aWRlb0hlaWdodCkgfSwKLSAgICAgICAgICAgIHsgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGpwZWdUaHVtYlNpemVbMF0pLAotICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4oanBlZ1RodW1iU2l6ZVsxXSkgfSwKLSAgICAgICAgICAgIHsgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHBpY3R1cmVXaWR0aCksCi0gICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihwaWN0dXJlSGVpZ2h0KSB9LAotICAgICAgICB9OworICAgICAgICAvKiBFbnN1cmUgdGhhdCB0aGUgd2lkdGgvaGVpZ2h0IG5ldmVyIGdvIG91dCBvZiBib3VuZHMKKyAgICAgICAgICogYnkgc2NhbGluZyBhY3Jvc3MgYSBkaWZmZW50IGRpbWVuc2lvbiBpZiBhbiBvdXQtb2YtYm91bmRzCisgICAgICAgICAqIHBvc3NpYmlsaXR5IGV4aXN0cy4KKyAgICAgICAgICoKKyAgICAgICAgICogZS5nLiBpZiB0aGUgcHJldmlld3JhdGlvIDwgYXJyYXlyYXRpbyBhbmQgZS5nLiB6b29tcmF0aW8gPSAxLjAsIHRoZW4gYnkKKyAgICAgICAgICogY2FsY3VsYXRpbmcgdGhlIHpvb21XaWR0aCBmcm9tIHpvb21IZWlnaHQgd2UnbGwgYWN0dWFsbHkgZ2V0IGEKKyAgICAgICAgICogem9vbWhlaWdodCA+IGFycmF5aGVpZ2h0CisgICAgICAgICAqLworICAgICAgICBmbG9hdCBhcnJheVJhdGlvID0gMS5mICogZmFzdEluZm8uYXJyYXlXaWR0aCAvIGZhc3RJbmZvLmFycmF5SGVpZ2h0OworICAgICAgICBpZiAocHJldmlld1JhdGlvID49IGFycmF5UmF0aW8pIHsKKyAgICAgICAgICAgIC8vIEFkanVzdCB0aGUgaGVpZ2h0IGJhc2VkIG9uIHRoZSB3aWR0aAorICAgICAgICAgICAgem9vbVdpZHRoID0gIGZhc3RJbmZvLmFycmF5V2lkdGggLyB6b29tUmF0aW87CisgICAgICAgICAgICB6b29tSGVpZ2h0ID0gem9vbVdpZHRoICoKKyAgICAgICAgICAgICAgICAgICAgcHJldmlld0hlaWdodCAvIHByZXZpZXdXaWR0aDsKIAotICAgICAgICBtaW5PdXRwdXRXaWR0aCA9IG91dHB1dFNpemVzWzBdWzBdOwotICAgICAgICBtaW5PdXRwdXRIZWlnaHQgPSBvdXRwdXRTaXplc1swXVsxXTsKLSAgICAgICAgbWluT3V0cHV0UmF0aW8gPSBtaW5PdXRwdXRXaWR0aCAvIG1pbk91dHB1dEhlaWdodDsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgaSA8IHNpemVvZihvdXRwdXRTaXplcykgLyBzaXplb2Yob3V0cHV0U2l6ZXNbMF0pOwotICAgICAgICAgICAgICsraSkgewotCi0gICAgICAgICAgICAvLyBza2lwIG92ZXIgb3V0cHV0cyB3ZSBkb24ndCB3YW50IHRvIGNvbnNpZGVyIGZvciB0aGUgY3JvcCByZWdpb24KLSAgICAgICAgICAgIGlmICggISgoMSA8PCBpKSAmIG91dHB1dHMpICkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmbG9hdCBvdXRwdXRXaWR0aCA9IG91dHB1dFNpemVzW2ldWzBdOwotICAgICAgICAgICAgZmxvYXQgb3V0cHV0SGVpZ2h0ID0gb3V0cHV0U2l6ZXNbaV1bMV07Ci0gICAgICAgICAgICBmbG9hdCBvdXRwdXRSYXRpbyA9IG91dHB1dFdpZHRoIC8gb3V0cHV0SGVpZ2h0OwotCi0gICAgICAgICAgICBpZiAobWluT3V0cHV0UmF0aW8gPiBvdXRwdXRSYXRpbykgewotICAgICAgICAgICAgICAgIG1pbk91dHB1dFJhdGlvID0gb3V0cHV0UmF0aW87Ci0gICAgICAgICAgICAgICAgbWluT3V0cHV0V2lkdGggPSBvdXRwdXRXaWR0aDsKLSAgICAgICAgICAgICAgICBtaW5PdXRwdXRIZWlnaHQgPSBvdXRwdXRIZWlnaHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFuZCB0aGVuIHVzZSB0aGlzIG91dHB1dCByYXRpbyBpbnN0ZWFkIG9mIHByZXZpZXcgb3V0cHV0IHJhdGlvCi0gICAgICAgICAgICBBTE9HVigiRW51bWVyYXRpbmcgb3V0cHV0IHJhdGlvICVmID0gJWYgLyAlZiwgbWluIGlzICVmIiwKLSAgICAgICAgICAgICAgICAgIG91dHB1dFJhdGlvLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0LCBtaW5PdXRwdXRSYXRpbyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBBZGp1c3QgdGhlIHdpZHRoIGJhc2VkIG9uIHRoZSBoZWlnaHQKKyAgICAgICAgICAgIHpvb21IZWlnaHQgPSBmYXN0SW5mby5hcnJheUhlaWdodCAvIHpvb21SYXRpbzsKKyAgICAgICAgICAgIHpvb21XaWR0aCA9IHpvb21IZWlnaHQgKgorICAgICAgICAgICAgICAgICAgICBwcmV2aWV3V2lkdGggLyBwcmV2aWV3SGVpZ2h0OwogICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogRW5zdXJlIHRoYXQgdGhlIHdpZHRoL2hlaWdodCBuZXZlciBnbyBvdXQgb2YgYm91bmRzCi0gICAgICogYnkgc2NhbGluZyBhY3Jvc3MgYSBkaWZmZW50IGRpbWVuc2lvbiBpZiBhbiBvdXQtb2YtYm91bmRzCi0gICAgICogcG9zc2liaWxpdHkgZXhpc3RzLgotICAgICAqCi0gICAgICogZS5nLiBpZiB0aGUgcHJldmlld3JhdGlvIDwgYXJyYXlyYXRpbyBhbmQgZS5nLiB6b29tcmF0aW8gPSAxLjAsIHRoZW4gYnkKLSAgICAgKiBjYWxjdWxhdGluZyB0aGUgem9vbVdpZHRoIGZyb20gem9vbUhlaWdodCB3ZSdsbCBhY3R1YWxseSBnZXQgYQotICAgICAqIHpvb21oZWlnaHQgPiBhcnJheWhlaWdodAotICAgICAqLwotICAgIGZsb2F0IGFycmF5UmF0aW8gPSAxLmYgKiBmYXN0SW5mby5hcnJheVdpZHRoIC8gZmFzdEluZm8uYXJyYXlIZWlnaHQ7Ci0gICAgaWYgKG1pbk91dHB1dFJhdGlvID49IGFycmF5UmF0aW8pIHsKLSAgICAgICAgLy8gQWRqdXN0IHRoZSBoZWlnaHQgYmFzZWQgb24gdGhlIHdpZHRoCi0gICAgICAgIHpvb21XaWR0aCA9ICBmYXN0SW5mby5hcnJheVdpZHRoIC8gem9vbVJhdGlvOwotICAgICAgICB6b29tSGVpZ2h0ID0gem9vbVdpZHRoICoKLSAgICAgICAgICAgICAgICBtaW5PdXRwdXRIZWlnaHQgLyBtaW5PdXRwdXRXaWR0aDsKLQogICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEFkanVzdCB0aGUgd2lkdGggYmFzZWQgb24gdGhlIGhlaWdodAorICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGdsb2JhbCBjcm9wIHJlZ2lvbiB3aXRoIGEgc2hhcGUgbWF0Y2hpbmcgdGhlIGFjdGl2ZQorICAgICAgICAvLyBhcnJheS4KKyAgICAgICAgem9vbVdpZHRoID0gZmFzdEluZm8uYXJyYXlXaWR0aCAvIHpvb21SYXRpbzsKICAgICAgICAgem9vbUhlaWdodCA9IGZhc3RJbmZvLmFycmF5SGVpZ2h0IC8gem9vbVJhdGlvOwotICAgICAgICB6b29tV2lkdGggPSB6b29tSGVpZ2h0ICoKLSAgICAgICAgICAgICAgICBtaW5PdXRwdXRXaWR0aCAvIG1pbk91dHB1dEhlaWdodDsKICAgICB9Ci0gICAgLy8gY2VudGVyaW5nIHRoZSB6b29tIGFyZWEgd2l0aGluIHRoZSBhY3RpdmUgYXJlYQorCisgICAgLy8gY2VudGVyIHRoZSB6b29tIGFyZWEgd2l0aGluIHRoZSBhY3RpdmUgYXJlYQogICAgIHpvb21MZWZ0ID0gKGZhc3RJbmZvLmFycmF5V2lkdGggLSB6b29tV2lkdGgpIC8gMjsKICAgICB6b29tVG9wID0gKGZhc3RJbmZvLmFycmF5SGVpZ2h0IC0gem9vbUhlaWdodCkgLyAyOwogCiAgICAgQUxPR1YoIkNyb3AgcmVnaW9uIGNhbGN1bGF0ZWQgKHg9JWQseT0lZCx3PSVmLGg9JWYpIGZvciB6b29tPSVkIiwKICAgICAgICAgKGludDMyX3Qpem9vbUxlZnQsIChpbnQzMl90KXpvb21Ub3AsIHpvb21XaWR0aCwgem9vbUhlaWdodCwgdGhpcy0+em9vbSk7CiAKLQogICAgIENyb3BSZWdpb24gY3JvcCA9IHsgem9vbUxlZnQsIHpvb21Ub3AsIHpvb21XaWR0aCwgem9vbUhlaWdodCB9OwogICAgIHJldHVybiBjcm9wOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKaW5kZXggZTYyOGE3ZS4uOTcyZDAwNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCkBAIC0xNjYsNiArMTY2LDkgQEAKICAgICBib29sIHByZXZpZXdDYWxsYmFja1N1cmZhY2U7CiAKICAgICBib29sIHpzbE1vZGU7CisgICAgLy8gV2hldGhlciB0aGUganBlZyBzdHJlYW0gaXMgc2xvd2VyIHRoYW4gMzBGUFMgYW5kIGNhbiBzbG93IGRvd24gcHJldmlldy4KKyAgICAvLyBXaGVuIHNsb3dKcGVnTW9kZSBpcyB0cnVlLCB6c2xNb2RlIG11c3QgYmUgZmFsc2UgdG8gYXZvaWQgc2xvd2luZyBkb3duIHByZXZpZXcuCisgICAgYm9vbCBzbG93SnBlZ01vZGU7CiAKICAgICAvLyBPdmVyYWxsIGNhbWVyYSBzdGF0ZQogICAgIGVudW0gU3RhdGUgewpAQCAtMTkwLDYgKzE5Myw4IEBACiAgICAgc3RhdGljIGNvbnN0IGludCBNQVhfSU5JVElBTF9QUkVWSUVXX0hFSUdIVCA9IDEwODA7CiAgICAgLy8gQXNwZWN0IHJhdGlvIHRvbGVyYW5jZQogICAgIHN0YXRpYyBjb25zdCBDT05TVEVYUFIgZmxvYXQgQVNQRUNUX1JBVElPX1RPTEVSQU5DRSA9IDAuMDAxOworICAgIC8vIFRocmVzaG9sZCBmb3Igc2xvdyBqcGVnIG1vZGUKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrU2xvd0pwZWdNb2RlVGhyZXNob2xkID0gMzM0MDAwMDBMTDsgLy8gMzMuNCBtcwogCiAgICAgLy8gRnVsbCBzdGF0aWMgY2FtZXJhIGluZm8sIG9iamVjdCBvd25lZCBieSBzb21lb25lIGVsc2UsIHN1Y2ggYXMKICAgICAvLyBDYW1lcmEyRGV2aWNlLgpAQCAtMjcxLDIxICsyNzYsMTYgQEAKICAgICAvLyBpZiB2aWRlbyBzbmFwc2hvdCBzaXplIGlzIGN1cnJlbnRseSBvdmVycmlkZGVuCiAgICAgYm9vbCBpc0pwZWdTaXplT3ZlcnJpZGRlbigpOwogCi0gICAgLy8gQ2FsY3VsYXRlIHRoZSBjcm9wIHJlZ2lvbiByZWN0YW5nbGUgYmFzZWQgb24gY3VycmVudCBzdHJlYW0gc2l6ZXMKKyAgICAvLyBDYWxjdWxhdGUgdGhlIGNyb3AgcmVnaW9uIHJlY3RhbmdsZSwgZWl0aGVyIHRpZ2h0bHkgYWJvdXQgdGhlIHByZXZpZXcKKyAgICAvLyByZXNvbHV0aW9uLCBvciBhIHJlZ2lvbiBqdXN0IGJhc2VkIG9uIHRoZSBhY3RpdmUgYXJyYXk7IGJvdGggdGFrZQorICAgIC8vIGludG8gYWNjb3VudCB0aGUgY3VycmVudCB6b29tIGxldmVsLgogICAgIHN0cnVjdCBDcm9wUmVnaW9uIHsKICAgICAgICAgZmxvYXQgbGVmdDsKICAgICAgICAgZmxvYXQgdG9wOwogICAgICAgICBmbG9hdCB3aWR0aDsKICAgICAgICAgZmxvYXQgaGVpZ2h0OwotCi0gICAgICAgIGVudW0gT3V0cHV0cyB7Ci0gICAgICAgICAgICBPVVRQVVRfUFJFVklFVyAgICAgICAgID0gMHgwMSwKLSAgICAgICAgICAgIE9VVFBVVF9WSURFTyAgICAgICAgICAgPSAweDAyLAotICAgICAgICAgICAgT1VUUFVUX0pQRUdfVEhVTUJOQUlMICA9IDB4MDQsCi0gICAgICAgICAgICBPVVRQVVRfUElDVFVSRSAgICAgICAgID0gMHgwOCwKLSAgICAgICAgfTsKICAgICB9OwotICAgIENyb3BSZWdpb24gY2FsY3VsYXRlQ3JvcFJlZ2lvbihDcm9wUmVnaW9uOjpPdXRwdXRzIG91dHB1dHMpIGNvbnN0OworICAgIENyb3BSZWdpb24gY2FsY3VsYXRlQ3JvcFJlZ2lvbihib29sIHByZXZpZXdPbmx5KSBjb25zdDsKIAogICAgIC8vIENhbGN1bGF0ZSB0aGUgZmllbGQgb2YgdmlldyBvZiB0aGUgaGlnaC1yZXNvbHV0aW9uIEpQRUcgY2FwdHVyZQogICAgIHN0YXR1c190IGNhbGN1bGF0ZVBpY3R1cmVGb3ZzKGZsb2F0ICpob3JpekZvdiwgZmxvYXQgKnZlcnRGb3YpIGNvbnN0OwpAQCAtMzgyLDE1ICszODIsMjMgQEAKICAgICAgICAgaW50MzJfdCBoZWlnaHQ7CiAgICAgICAgIGludDMyX3QgaXNJbnB1dDsKICAgICB9OworCiAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIGV4dHJhY3QgYXZhaWxhYmxlIHN0cmVhbSBjb25maWd1cmF0aW9uCiAgICAgLy8gT25seSB2YWxpZCBzaW5jZSBkZXZpY2UgSEFMIHZlcnNpb24gMy4yCiAgICAgLy8gcmV0dXJucyBhbiBlbXB0eSBWZWN0b3IgaWYgZGV2aWNlIEhBTCB2ZXJzaW9uIGRvZXMgc3VwcG9ydCBpdAogICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBnZXRTdHJlYW1Db25maWd1cmF0aW9ucygpOwogCisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCBtaW5pbXVtIGZyYW1lIGR1cmF0aW9uIGZvciBhIGpwZWcgc2l6ZQorICAgIC8vIHJldHVybiAtMSBpZiBpbnB1dCBqcGVnIHNpemUgY2Fubm90IGJlIGZvdW5kIGluIHN1cHBvcnRlZCBzaXplIGxpc3QKKyAgICBpbnQ2NF90IGdldEpwZWdTdHJlYW1NaW5GcmFtZUR1cmF0aW9uTnMoUGFyYW1ldGVyczo6U2l6ZSBzaXplKTsKKwogICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgbm9uLWR1cGxpY2F0ZWQgYXZhaWxhYmxlIG91dHB1dCBmb3JtYXRzCiAgICAgU29ydGVkVmVjdG9yPGludDMyX3Q+IGdldEF2YWlsYWJsZU91dHB1dEZvcm1hdHMoKTsKICAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IGF2YWlsYWJsZSBvdXRwdXQganBlZyBzaXplcwogICAgIFZlY3RvcjxTaXplPiBnZXRBdmFpbGFibGVKcGVnU2l6ZXMoKTsKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IG1heGltdW0gc2l6ZSBpbiBpbnB1dCBTaXplIHZlY3Rvci4KKyAgICAvLyBUaGUgbWF4aW11bSBzaXplIGlzIGRlZmluZWQgYnkgY29tcGFyaW5nIHdpZHRoIGZpcnN0LCB3aGVuIHdpZHRoIHRpZXMgY29tcGFyaW5nIGhlaWdodC4KKyAgICBTaXplIGdldE1heFNpemUoY29uc3QgVmVjdG9yPFNpemU+JiBzaXplcyk7CiAKICAgICBpbnQgbURldmljZVZlcnNpb247CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcAppbmRleCAxNDZkNTcyLi42NmQ3YjAwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcApAQCAtMjUsMTEgKzI1LDEyIEBACiAjZGVmaW5lIEFMT0dWViguLi4pICgodm9pZCkwKQogI2VuZGlmCiAKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8Z3VpL0J1ZmZlckl0ZW0uaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CiAKICNpbmNsdWRlICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIgogI2luY2x1ZGUgImFwaTEvQ2FtZXJhMkNsaWVudC5oIgpAQCAtNTEsNyArNTIsMTAgQEAKICAgICAgICAgbVJlY29yZGluZ1N0cmVhbUlkKE5PX1NUUkVBTSksCiAgICAgICAgIG1SZWNvcmRpbmdGcmFtZUF2YWlsYWJsZShmYWxzZSksCiAgICAgICAgIG1SZWNvcmRpbmdIZWFwQ291bnQoa0RlZmF1bHRSZWNvcmRpbmdIZWFwQ291bnQpLAotICAgICAgICBtUmVjb3JkaW5nSGVhcEZyZWUoa0RlZmF1bHRSZWNvcmRpbmdIZWFwQ291bnQpCisgICAgICAgIG1SZWNvcmRpbmdIZWFwRnJlZShrRGVmYXVsdFJlY29yZGluZ0hlYXBDb3VudCksCisgICAgICAgIG1SZWNvcmRpbmdGb3JtYXQoa0RlZmF1bHRSZWNvcmRpbmdGb3JtYXQpLAorICAgICAgICBtUmVjb3JkaW5nRGF0YVNwYWNlKGtEZWZhdWx0UmVjb3JkaW5nRGF0YVNwYWNlKSwKKyAgICAgICAgbVJlY29yZGluZ0dyYWxsb2NVc2FnZShrRGVmYXVsdFJlY29yZGluZ0dyYWxsb2NVc2FnZSkKIHsKIH0KIApAQCAtNjAsNyArNjQsNyBAQAogICAgIGRlbGV0ZVJlY29yZGluZ1N0cmVhbSgpOwogfQogCi1zdGF0dXNfdCBTdHJlYW1pbmdQcm9jZXNzb3I6OnNldFByZXZpZXdXaW5kb3coc3A8QU5hdGl2ZVdpbmRvdz4gd2luZG93KSB7CitzdGF0dXNfdCBTdHJlYW1pbmdQcm9jZXNzb3I6OnNldFByZXZpZXdXaW5kb3coc3A8U3VyZmFjZT4gd2luZG93KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CiAKQEAgLTE1MSw3ICsxNTUsNyBAQAogICAgICAgICAvLyBDaGVjayBpZiBzdHJlYW0gcGFyYW1ldGVycyBoYXZlIHRvIGNoYW5nZQogICAgICAgICB1aW50MzJfdCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQ7CiAgICAgICAgIHJlcyA9IGRldmljZS0+Z2V0U3RyZWFtSW5mbyhtUHJldmlld1N0cmVhbUlkLAotICAgICAgICAgICAgICAgICZjdXJyZW50V2lkdGgsICZjdXJyZW50SGVpZ2h0LCAwKTsKKyAgICAgICAgICAgICAgICAmY3VycmVudFdpZHRoLCAmY3VycmVudEhlaWdodCwgMCwgMCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBFcnJvciBxdWVyeWluZyBwcmV2aWV3IHN0cmVhbSBpbmZvOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtMTgyLDcgKzE4Niw4IEBACiAgICAgaWYgKG1QcmV2aWV3U3RyZWFtSWQgPT0gTk9fU1RSRUFNKSB7CiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1QcmV2aWV3V2luZG93LAogICAgICAgICAgICAgICAgIHBhcmFtcy5wcmV2aWV3V2lkdGgsIHBhcmFtcy5wcmV2aWV3SGVpZ2h0LAotICAgICAgICAgICAgICAgIENBTUVSQTJfSEFMX1BJWEVMX0ZPUk1BVF9PUEFRVUUsICZtUHJldmlld1N0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBDQU1FUkEyX0hBTF9QSVhFTF9GT1JNQVRfT1BBUVVFLCBIQUxfREFUQVNQQUNFX1VOS05PV04sCisgICAgICAgICAgICAgICAgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCwgJm1QcmV2aWV3U3RyZWFtSWQpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIGNyZWF0ZSBwcmV2aWV3IHN0cmVhbTogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTI3OSw2ICsyODQsNDYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IFN0cmVhbWluZ1Byb2Nlc3Nvcjo6c2V0UmVjb3JkaW5nRm9ybWF0KGludCBmb3JtYXQsCisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSkgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbShtTXV0ZXgpOworCisgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IE5ldyByZWNvcmRpbmcgZm9ybWF0L2RhdGFzcGFjZSBmcm9tIGVuY29kZXI6ICVYLCAlWCIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgZm9ybWF0LCBkYXRhU3BhY2UpOworCisgICAgbVJlY29yZGluZ0Zvcm1hdCA9IGZvcm1hdDsKKyAgICBtUmVjb3JkaW5nRGF0YVNwYWNlID0gZGF0YVNwYWNlOworICAgIGludCBwcmV2R3JhbGxvY1VzYWdlID0gbVJlY29yZGluZ0dyYWxsb2NVc2FnZTsKKyAgICBpZiAobVJlY29yZGluZ0Zvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpIHsKKyAgICAgICAgbVJlY29yZGluZ0dyYWxsb2NVc2FnZSA9IEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUjsKKyAgICB9IGVsc2UgeworICAgICAgICBtUmVjb3JkaW5nR3JhbGxvY1VzYWdlID0gR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOOworICAgIH0KKworICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBOZXcgcmVjb3JkaW5nIGdyYWxsb2MgdXNhZ2U6ICUwOFgiLCBfX0ZVTkNUSU9OX18sIG1JZCwKKyAgICAgICAgICAgIG1SZWNvcmRpbmdHcmFsbG9jVXNhZ2UpOworCisgICAgaWYgKHByZXZHcmFsbG9jVXNhZ2UgIT0gbVJlY29yZGluZ0dyYWxsb2NVc2FnZSkgeworICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogUmVzZXR0aW5nIHJlY29yZGluZyBjb25zdW1lciBmb3IgbmV3IHVzYWdlIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkKTsKKworICAgICAgICBpZiAoaXNTdHJlYW1BY3RpdmUobUFjdGl2ZVN0cmVhbUlkcywgbVJlY29yZGluZ1N0cmVhbUlkKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENoYW5naW5nIHJlY29yZGluZyBmb3JtYXQgd2hlbiAiCisgICAgICAgICAgICAgICAgICAgICJyZWNvcmRpbmcgc3RyZWFtIGlzIGFscmVhZHkgYWN0aXZlISIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgbUlkKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorCisgICAgICAgIHJlbGVhc2VBbGxSZWNvcmRpbmdGcmFtZXNMb2NrZWQoKTsKKworICAgICAgICBtUmVjb3JkaW5nQ29uc3VtZXIuY2xlYXIoKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IFN0cmVhbWluZ1Byb2Nlc3Nvcjo6dXBkYXRlUmVjb3JkaW5nUmVxdWVzdChjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0YXR1c190IHJlczsKQEAgLTMzOSw5ICszODQsMTAgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIHVpbnQzMl90IGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodDsKKyAgICB1aW50MzJfdCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQsIGN1cnJlbnRGb3JtYXQ7CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgY3VycmVudERhdGFTcGFjZTsKICAgICByZXMgPSBkZXZpY2UtPmdldFN0cmVhbUluZm8obVJlY29yZGluZ1N0cmVhbUlkLAotICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsIDApOworICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsICZjdXJyZW50Rm9ybWF0LCAmY3VycmVudERhdGFTcGFjZSk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogRXJyb3IgcXVlcnlpbmcgcmVjb3JkaW5nIG91dHB1dCBzdHJlYW0gaW5mbzogIgogICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsCkBAIC0zNDksOCArMzk1LDExIEBACiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCi0gICAgaWYgKG1SZWNvcmRpbmdDb25zdW1lciA9PSAwIHx8IGN1cnJlbnRXaWR0aCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvV2lkdGggfHwKLSAgICAgICAgICAgIGN1cnJlbnRIZWlnaHQgIT0gKHVpbnQzMl90KXBhcmFtcy52aWRlb0hlaWdodCkgeworICAgIGlmIChtUmVjb3JkaW5nQ29uc3VtZXIgPT0gMCB8fAorICAgICAgICAgICAgY3VycmVudFdpZHRoICE9ICh1aW50MzJfdClwYXJhbXMudmlkZW9XaWR0aCB8fAorICAgICAgICAgICAgY3VycmVudEhlaWdodCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvSGVpZ2h0IHx8CisgICAgICAgICAgICBjdXJyZW50Rm9ybWF0ICE9ICh1aW50MzJfdCltUmVjb3JkaW5nRm9ybWF0IHx8CisgICAgICAgICAgICBjdXJyZW50RGF0YVNwYWNlICE9IG1SZWNvcmRpbmdEYXRhU3BhY2UpIHsKICAgICAgICAgKm5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgICB9CiAgICAgKm5lZWRzVXBkYXRlID0gZmFsc2U7CkBAIC0zNzksNyArNDI4LDcgQEAKICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CiAgICAgICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CiAgICAgICAgIG1SZWNvcmRpbmdDb25zdW1lciA9IG5ldyBCdWZmZXJJdGVtQ29uc3VtZXIoY29uc3VtZXIsCi0gICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSLAorICAgICAgICAgICAgICAgIG1SZWNvcmRpbmdHcmFsbG9jVXNhZ2UsCiAgICAgICAgICAgICAgICAgbVJlY29yZGluZ0hlYXBDb3VudCArIDEpOwogICAgICAgICBtUmVjb3JkaW5nQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7CiAgICAgICAgIG1SZWNvcmRpbmdDb25zdW1lci0+c2V0TmFtZShTdHJpbmc4KCJDYW1lcmEyLVJlY29yZGluZ0NvbnN1bWVyIikpOwpAQCAtMzkxLDggKzQ0MCwxMSBAQAogICAgIGlmIChtUmVjb3JkaW5nU3RyZWFtSWQgIT0gTk9fU1RSRUFNKSB7CiAgICAgICAgIC8vIENoZWNrIGlmIHN0cmVhbSBwYXJhbWV0ZXJzIGhhdmUgdG8gY2hhbmdlCiAgICAgICAgIHVpbnQzMl90IGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodDsKKyAgICAgICAgdWludDMyX3QgY3VycmVudEZvcm1hdDsKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgY3VycmVudERhdGFTcGFjZTsKICAgICAgICAgcmVzID0gZGV2aWNlLT5nZXRTdHJlYW1JbmZvKG1SZWNvcmRpbmdTdHJlYW1JZCwKLSAgICAgICAgICAgICAgICAmY3VycmVudFdpZHRoLCAmY3VycmVudEhlaWdodCwgMCk7CisgICAgICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsCisgICAgICAgICAgICAgICAgJmN1cnJlbnRGb3JtYXQsICZjdXJyZW50RGF0YVNwYWNlKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEVycm9yIHF1ZXJ5aW5nIHJlY29yZGluZyBvdXRwdXQgc3RyZWFtIGluZm86ICIKICAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwKQEAgLTQwMCw3ICs0NTIsMTAgQEAKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGN1cnJlbnRXaWR0aCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvV2lkdGggfHwKLSAgICAgICAgICAgICAgICBjdXJyZW50SGVpZ2h0ICE9ICh1aW50MzJfdClwYXJhbXMudmlkZW9IZWlnaHQgfHwgbmV3Q29uc3VtZXIpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50SGVpZ2h0ICE9ICh1aW50MzJfdClwYXJhbXMudmlkZW9IZWlnaHQgfHwKKyAgICAgICAgICAgICAgICBjdXJyZW50Rm9ybWF0ICE9ICh1aW50MzJfdCltUmVjb3JkaW5nRm9ybWF0IHx8CisgICAgICAgICAgICAgICAgY3VycmVudERhdGFTcGFjZSAhPSBtUmVjb3JkaW5nRGF0YVNwYWNlIHx8CisgICAgICAgICAgICAgICAgbmV3Q29uc3VtZXIpIHsKICAgICAgICAgICAgIC8vIFRPRE86IFNob3VsZCB3YWl0IHRvIGJlIHN1cmUgcHJldmlvdXMgcmVjb3JkaW5nIGhhcyBmaW5pc2hlZAogICAgICAgICAgICAgcmVzID0gZGV2aWNlLT5kZWxldGVTdHJlYW0obVJlY29yZGluZ1N0cmVhbUlkKTsKIApAQCAtNDIzLDcgKzQ3OCw4IEBACiAgICAgICAgIG1SZWNvcmRpbmdGcmFtZUNvdW50ID0gMDsKICAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obVJlY29yZGluZ1dpbmRvdywKICAgICAgICAgICAgICAgICBwYXJhbXMudmlkZW9XaWR0aCwgcGFyYW1zLnZpZGVvSGVpZ2h0LAotICAgICAgICAgICAgICAgIENBTUVSQTJfSEFMX1BJWEVMX0ZPUk1BVF9PUEFRVUUsICZtUmVjb3JkaW5nU3RyZWFtSWQpOworICAgICAgICAgICAgICAgIG1SZWNvcmRpbmdGb3JtYXQsIG1SZWNvcmRpbmdEYXRhU3BhY2UsCisgICAgICAgICAgICAgICAgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCwgJm1SZWNvcmRpbmdTdHJlYW1JZCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBjcmVhdGUgb3V0cHV0IHN0cmVhbSBmb3IgcmVjb3JkaW5nOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsCkBAIC03MTgsMTIgKzc3NCwxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1SZWNvcmRpbmdIZWFwID09IDApIHsKLSAgICAgICAgICAgIGNvbnN0IHNpemVfdCBidWZmZXJTaXplID0gNCArIHNpemVvZihidWZmZXJfaGFuZGxlX3QpOworICAgICAgICAgICAgc2l6ZV90IHBheWxvYWRTaXplID0gc2l6ZW9mKFZpZGVvTmF0aXZlTWV0YWRhdGEpOwogICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IENyZWF0aW5nIHJlY29yZGluZyBoZWFwIHdpdGggJXp1IGJ1ZmZlcnMgb2YgIgogICAgICAgICAgICAgICAgICAgICAic2l6ZSAlenUgYnl0ZXMiLCBfX0ZVTkNUSU9OX18sIG1JZCwKLSAgICAgICAgICAgICAgICAgICAgbVJlY29yZGluZ0hlYXBDb3VudCwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1SZWNvcmRpbmdIZWFwQ291bnQsIHBheWxvYWRTaXplKTsKIAotICAgICAgICAgICAgbVJlY29yZGluZ0hlYXAgPSBuZXcgQ2FtZXJhMkhlYXAoYnVmZmVyU2l6ZSwgbVJlY29yZGluZ0hlYXBDb3VudCwKKyAgICAgICAgICAgIG1SZWNvcmRpbmdIZWFwID0gbmV3IENhbWVyYTJIZWFwKHBheWxvYWRTaXplLCBtUmVjb3JkaW5nSGVhcENvdW50LAogICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhMkNsaWVudDo6UmVjb3JkaW5nSGVhcCIpOwogICAgICAgICAgICAgaWYgKG1SZWNvcmRpbmdIZWFwLT5tSGVhcC0+Z2V0U2l6ZSgpID09IDApIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVjb3JkaW5nIiwKQEAgLTc0Niw3ICs4MDIsNyBAQAogICAgICAgICAgICAgbVJlY29yZGluZ0hlYXBGcmVlID0gbVJlY29yZGluZ0hlYXBDb3VudDsKICAgICAgICAgfQogCi0gICAgICAgIGlmICggbVJlY29yZGluZ0hlYXBGcmVlID09IDApIHsKKyAgICAgICAgaWYgKG1SZWNvcmRpbmdIZWFwRnJlZSA9PSAwKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogTm8gZnJlZSByZWNvcmRpbmcgYnVmZmVycywgZHJvcHBpbmcgZnJhbWUiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCk7CiAgICAgICAgICAgICBtUmVjb3JkaW5nQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoaW1nQnVmZmVyKTsKQEAgLTc2NiwxMyArODIyLDE1IEBACiAgICAgICAgICAgICAgICAgbVJlY29yZGluZ0hlYXAtPm1CdWZmZXJzW2hlYXBJZHhdLT5nZXRNZW1vcnkoJm9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKIAotICAgICAgICB1aW50OF90ICpkYXRhID0gKHVpbnQ4X3QqKWhlYXAtPmdldEJhc2UoKSArIG9mZnNldDsKLSAgICAgICAgdWludDMyX3QgdHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlOwotICAgICAgICAqKCh1aW50MzJfdCopZGF0YSkgPSB0eXBlOwotICAgICAgICAqKChidWZmZXJfaGFuZGxlX3QqKShkYXRhICsgNCkpID0gaW1nQnVmZmVyLm1HcmFwaGljQnVmZmVyLT5oYW5kbGU7Ci0gICAgICAgIEFMT0dWVigiJXM6IENhbWVyYSAlZDogU2VuZGluZyBvdXQgYnVmZmVyX2hhbmRsZV90ICVwIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwKLSAgICAgICAgICAgICAgICBpbWdCdWZmZXIubUdyYXBoaWNCdWZmZXItPmhhbmRsZSk7CisgICAgICAgIFZpZGVvTmF0aXZlTWV0YWRhdGEgKnBheWxvYWQgPSByZWludGVycHJldF9jYXN0PFZpZGVvTmF0aXZlTWV0YWRhdGEqPigKKyAgICAgICAgICAgICh1aW50OF90KiloZWFwLT5nZXRCYXNlKCkgKyBvZmZzZXQpOworICAgICAgICBwYXlsb2FkLT5lVHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXI7CisgICAgICAgIHBheWxvYWQtPnBCdWZmZXIgPSBpbWdCdWZmZXIubUdyYXBoaWNCdWZmZXItPmdldE5hdGl2ZUJ1ZmZlcigpOworICAgICAgICBwYXlsb2FkLT5uRmVuY2VGZCA9IC0xOworCisgICAgICAgIEFMT0dWVigiJXM6IENhbWVyYSAlZDogU2VuZGluZyBvdXQgQU5XQnVmZmVyICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgcGF5bG9hZC0+cEJ1ZmZlcik7CisKICAgICAgICAgbVJlY29yZGluZ0J1ZmZlcnMucmVwbGFjZUF0KGltZ0J1ZmZlciwgaGVhcElkeCk7CiAgICAgICAgIHJlY29yZGluZ0hlYXAgPSBtUmVjb3JkaW5nSGVhcDsKICAgICB9CkBAIC04MDUsNDIgKzg2Myw0MiBAQAogICAgICAgICAgICAgICAgIGhlYXAtPmdldEhlYXBJRCgpLCBtUmVjb3JkaW5nSGVhcC0+bUhlYXAtPmdldEhlYXBJRCgpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICB1aW50OF90ICpkYXRhID0gKHVpbnQ4X3QqKWhlYXAtPmdldEJhc2UoKSArIG9mZnNldDsKLSAgICB1aW50MzJfdCB0eXBlID0gKih1aW50MzJfdCopZGF0YTsKLSAgICBpZiAodHlwZSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkgeworCisgICAgVmlkZW9OYXRpdmVNZXRhZGF0YSAqcGF5bG9hZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VmlkZW9OYXRpdmVNZXRhZGF0YSo+KAorICAgICAgICAodWludDhfdCopaGVhcC0+Z2V0QmFzZSgpICsgb2Zmc2V0KTsKKworICAgIGlmIChwYXlsb2FkLT5lVHlwZSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBSZWNvcmRpbmcgZnJhbWUgdHlwZSBpbnZhbGlkIChnb3QgJXgsIGV4cGVjdGVkICV4KSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHR5cGUsCi0gICAgICAgICAgICAgICAga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UpOworICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBwYXlsb2FkLT5lVHlwZSwKKyAgICAgICAgICAgICAgICBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIC8vIFJlbGVhc2UgdGhlIGJ1ZmZlciBiYWNrIHRvIHRoZSByZWNvcmRpbmcgcXVldWUKLQotICAgIGJ1ZmZlcl9oYW5kbGVfdCBpbWdIYW5kbGUgPSAqKGJ1ZmZlcl9oYW5kbGVfdCopKGRhdGEgKyA0KTsKLQogICAgIHNpemVfdCBpdGVtSW5kZXg7CiAgICAgZm9yIChpdGVtSW5kZXggPSAwOyBpdGVtSW5kZXggPCBtUmVjb3JkaW5nQnVmZmVycy5zaXplKCk7IGl0ZW1JbmRleCsrKSB7CiAgICAgICAgIGNvbnN0IEJ1ZmZlckl0ZW0gaXRlbSA9IG1SZWNvcmRpbmdCdWZmZXJzW2l0ZW1JbmRleF07CiAgICAgICAgIGlmIChpdGVtLm1CdWYgIT0gQnVmZmVySXRlbUNvbnN1bWVyOjpJTlZBTElEX0JVRkZFUl9TTE9UICYmCi0gICAgICAgICAgICAgICAgaXRlbS5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlID09IGltZ0hhbmRsZSkgewotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaXRlbS5tR3JhcGhpY0J1ZmZlci0+Z2V0TmF0aXZlQnVmZmVyKCkgPT0gcGF5bG9hZC0+cEJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQorCiAgICAgaWYgKGl0ZW1JbmRleCA9PSBtUmVjb3JkaW5nQnVmZmVycy5zaXplKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGZpbmQgYnVmZmVyX2hhbmRsZV90ICVwIGluIGxpc3Qgb2YgIgorICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgZmluZCByZXR1cm5lZCBBTlcgQnVmZmVyICVwIGluIGxpc3Qgb2YgIgogICAgICAgICAgICAgICAgICJvdXRzdGFuZGluZyBidWZmZXJzIiwgX19GVU5DVElPTl9fLCBtSWQsCi0gICAgICAgICAgICAgICAgaW1nSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBwYXlsb2FkLT5wQnVmZmVyKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIEFMT0dWVigiJXM6IENhbWVyYSAlZDogRnJlZWluZyBidWZmZXJfaGFuZGxlX3QgJXAiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICBtSWQsIGltZ0hhbmRsZSk7CisgICAgQUxPR1ZWKCIlczogQ2FtZXJhICVkOiBGcmVlaW5nIHJldHVybmVkIEFOVyBidWZmZXIgJXAgaW5kZXggJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICBtSWQsIHBheWxvYWQtPnBCdWZmZXIsIGl0ZW1JbmRleCk7CiAKICAgICByZXMgPSBtUmVjb3JkaW5nQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIobVJlY29yZGluZ0J1ZmZlcnNbaXRlbUluZGV4XSk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIGZyZWUgcmVjb3JkaW5nIGZyYW1lICIKLSAgICAgICAgICAgICAgICAiKGJ1ZmZlcl9oYW5kbGVfdDogJXApOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgIG1JZCwgaW1nSGFuZGxlLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAiKFJldHVybmVkIEFOVyBidWZmZXI6ICVwKTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBtSWQsIHBheWxvYWQtPnBCdWZmZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIG1SZWNvcmRpbmdCdWZmZXJzLnJlcGxhY2VBdChpdGVtSW5kZXgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5oCmluZGV4IDI0NzQwNjIuLmUwY2FkM2EgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmgKQEAgLTQzLDcgKzQzLDcgQEAKICAgICBTdHJlYW1pbmdQcm9jZXNzb3Ioc3A8Q2FtZXJhMkNsaWVudD4gY2xpZW50KTsKICAgICB+U3RyZWFtaW5nUHJvY2Vzc29yKCk7CiAKLSAgICBzdGF0dXNfdCBzZXRQcmV2aWV3V2luZG93KHNwPEFOYXRpdmVXaW5kb3c+IHdpbmRvdyk7CisgICAgc3RhdHVzX3Qgc2V0UHJldmlld1dpbmRvdyhzcDxTdXJmYWNlPiB3aW5kb3cpOwogCiAgICAgYm9vbCBoYXZlVmFsaWRQcmV2aWV3V2luZG93KCkgY29uc3Q7CiAKQEAgLTUzLDYgKzUzLDggQEAKICAgICBpbnQgZ2V0UHJldmlld1N0cmVhbUlkKCkgY29uc3Q7CiAKICAgICBzdGF0dXNfdCBzZXRSZWNvcmRpbmdCdWZmZXJDb3VudChzaXplX3QgY291bnQpOworICAgIHN0YXR1c190IHNldFJlY29yZGluZ0Zvcm1hdChpbnQgZm9ybWF0LCBhbmRyb2lkX2RhdGFzcGFjZV90IGRhdGFzcGFjZSk7CisKICAgICBzdGF0dXNfdCB1cGRhdGVSZWNvcmRpbmdSZXF1ZXN0KGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcyk7CiAgICAgLy8gSWYgbmVlZHNVcGRhdGUgaXMgc2V0IHRvIHRydWUsIGEgdXBkYXRlUmVjb3JkaW5nU3RyZWFtIGNhbGwgd2l0aCBwYXJhbXMgd2lsbCByZWNyZWF0ZQogICAgIC8vIHJlY29yZGluZyBzdHJlYW0KQEAgLTEwNiw3ICsxMDgsNyBAQAogICAgIGludDMyX3QgbVByZXZpZXdSZXF1ZXN0SWQ7CiAgICAgaW50IG1QcmV2aWV3U3RyZWFtSWQ7CiAgICAgQ2FtZXJhTWV0YWRhdGEgbVByZXZpZXdSZXF1ZXN0OwotICAgIHNwPEFOYXRpdmVXaW5kb3c+IG1QcmV2aWV3V2luZG93OworICAgIHNwPFN1cmZhY2U+IG1QcmV2aWV3V2luZG93OwogCiAgICAgLy8gUmVjb3JkaW5nLXJlbGF0ZWQgbWVtYmVycwogICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtXYWl0RHVyYXRpb24gPSA1MDAwMDAwMDsgLy8gNTAgbXMKQEAgLTExNSw3ICsxMTcsNyBAQAogICAgIGludCBtUmVjb3JkaW5nU3RyZWFtSWQ7CiAgICAgaW50IG1SZWNvcmRpbmdGcmFtZUNvdW50OwogICAgIHNwPEJ1ZmZlckl0ZW1Db25zdW1lcj4gbVJlY29yZGluZ0NvbnN1bWVyOwotICAgIHNwPEFOYXRpdmVXaW5kb3c+ICBtUmVjb3JkaW5nV2luZG93OworICAgIHNwPFN1cmZhY2U+ICBtUmVjb3JkaW5nV2luZG93OwogICAgIENhbWVyYU1ldGFkYXRhIG1SZWNvcmRpbmdSZXF1ZXN0OwogICAgIHNwPGNhbWVyYTI6OkNhbWVyYTJIZWFwPiBtUmVjb3JkaW5nSGVhcDsKIApAQCAtMTI3LDYgKzEyOSwxOCBAQAogICAgIFZlY3RvcjxCdWZmZXJJdGVtPiBtUmVjb3JkaW5nQnVmZmVyczsKICAgICBzaXplX3QgbVJlY29yZGluZ0hlYXBIZWFkLCBtUmVjb3JkaW5nSGVhcEZyZWU7CiAKKyAgICBzdGF0aWMgY29uc3QgaW50IGtEZWZhdWx0UmVjb3JkaW5nRm9ybWF0ID0KKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKKyAgICBpbnQgbVJlY29yZGluZ0Zvcm1hdDsKKworICAgIHN0YXRpYyBjb25zdCBhbmRyb2lkX2RhdGFzcGFjZSBrRGVmYXVsdFJlY29yZGluZ0RhdGFTcGFjZSA9CisgICAgICAgICAgICBIQUxfREFUQVNQQUNFX0JUNzA5OworICAgIGFuZHJvaWRfZGF0YXNwYWNlIG1SZWNvcmRpbmdEYXRhU3BhY2U7CisKKyAgICBzdGF0aWMgY29uc3QgaW50IGtEZWZhdWx0UmVjb3JkaW5nR3JhbGxvY1VzYWdlID0KKyAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUjsKKyAgICBpbnQgbVJlY29yZGluZ0dyYWxsb2NVc2FnZTsKKwogICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCk7CiAKICAgICBzdGF0dXNfdCBwcm9jZXNzUmVjb3JkaW5nRnJhbWUoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAKaW5kZXggMTg2Y2U2Yy4uMGI3OWIzMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAKQEAgLTEzOSw3ICsxMzksNyBAQAogICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19DQU1FUkFfWlNMLAogICAgICAgICAgICAga1pzbEJ1ZmZlckRlcHRoKTsKICAgICAgICAgbVpzbENvbnN1bWVyLT5zZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKHRoaXMpOwotICAgICAgICBtWnNsQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMkNsaWVudDo6WnNsQ29uc3VtZXIiKSk7CisgICAgICAgIG1ac2xDb25zdW1lci0+c2V0TmFtZShTdHJpbmc4KCJDYW1lcmEyLVpzbENvbnN1bWVyIikpOwogICAgICAgICBtWnNsV2luZG93ID0gbmV3IFN1cmZhY2UocHJvZHVjZXIpOwogICAgIH0KIApAQCAtMTQ3LDcgKzE0Nyw3IEBACiAgICAgICAgIC8vIENoZWNrIGlmIHN0cmVhbSBwYXJhbWV0ZXJzIGhhdmUgdG8gY2hhbmdlCiAgICAgICAgIHVpbnQzMl90IGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodDsKICAgICAgICAgcmVzID0gZGV2aWNlLT5nZXRTdHJlYW1JbmZvKG1ac2xTdHJlYW1JZCwKLSAgICAgICAgICAgICAgICAmY3VycmVudFdpZHRoLCAmY3VycmVudEhlaWdodCwgMCk7CisgICAgICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsIDAsIDApOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogRXJyb3IgcXVlcnlpbmcgY2FwdHVyZSBvdXRwdXQgc3RyZWFtIGluZm86ICIKICAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sCkBAIC0xODUsOCArMTg1LDggQEAKICAgICAgICAgICAgICAgICAoaW50KUNBTUVSQTJfSEFMX1BJWEVMX0ZPUk1BVF9aU0wgOgogICAgICAgICAgICAgICAgIChpbnQpSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOwogICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShtWnNsV2luZG93LAotICAgICAgICAgICAgICAgIHBhcmFtcy5mYXN0SW5mby5hcnJheVdpZHRoLCBwYXJhbXMuZmFzdEluZm8uYXJyYXlIZWlnaHQsCi0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgJm1ac2xTdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgcGFyYW1zLmZhc3RJbmZvLmFycmF5V2lkdGgsIHBhcmFtcy5mYXN0SW5mby5hcnJheUhlaWdodCwgc3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX1VOS05PV04sIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzAsICZtWnNsU3RyZWFtSWQpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgY3JlYXRlIG91dHB1dCBzdHJlYW0gZm9yIFpTTDogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5oCmluZGV4IDVmNTBkN2IuLjU4NzBiZDMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmgKQEAgLTEwMSw3ICsxMDEsNyBAQAogICAgIGludCBtWnNsU3RyZWFtSWQ7CiAgICAgaW50IG1ac2xSZXByb2Nlc3NTdHJlYW1JZDsKICAgICBzcDxCdWZmZXJJdGVtQ29uc3VtZXI+IG1ac2xDb25zdW1lcjsKLSAgICBzcDxBTmF0aXZlV2luZG93PiAgICAgIG1ac2xXaW5kb3c7CisgICAgc3A8U3VyZmFjZT4gICAgICAgICAgICBtWnNsV2luZG93OwogCiAgICAgc3RydWN0IFpzbFBhaXIgewogICAgICAgICBCdWZmZXJJdGVtIGJ1ZmZlcjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IzLmNwcAppbmRleCA0NzBhNmQ2Li42OTYyMGFjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yMy5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvcjMuY3BwCkBAIC0xNTAsNyArMTUwLDcgQEAKICAgICAgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIHBhcmFtZXRlcnMgaGF2ZSB0byBjaGFuZ2UKICAgICAgICAgdWludDMyX3QgY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0OwogICAgICAgICByZXMgPSBkZXZpY2UtPmdldFN0cmVhbUluZm8obVpzbFN0cmVhbUlkLAotICAgICAgICAgICAgICAgICZjdXJyZW50V2lkdGgsICZjdXJyZW50SGVpZ2h0LCAwKTsKKyAgICAgICAgICAgICAgICAmY3VycmVudFdpZHRoLCAmY3VycmVudEhlaWdodCwgMCwgMCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBFcnJvciBxdWVyeWluZyBjYXB0dXJlIG91dHB1dCBzdHJlYW0gaW5mbzogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcAppbmRleCA4ZjJkM2NjLi44NGMwYzNlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCkBAIC02NSwxMyArNjUsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlcnZpY2VQaWQpIDoKICAgICBDYW1lcmEyQ2xpZW50QmFzZShjYW1lcmFTZXJ2aWNlLCByZW1vdGVDYWxsYmFjaywgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIGNhbWVyYUZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsIHNlcnZpY2VQaWQpLAorICAgIG1JbnB1dFN0cmVhbSgpLAogICAgIG1SZXF1ZXN0SWRDb3VudGVyKDApIHsKIAogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR0koIkNhbWVyYURldmljZUNsaWVudCAlZDogT3BlbmVkIiwgY2FtZXJhSWQpOwogfQogCi1zdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmluaXRpYWxpemUoY2FtZXJhX21vZHVsZV90ICptb2R1bGUpCitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmluaXRpYWxpemUoQ2FtZXJhTW9kdWxlICptb2R1bGUpCiB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CkBAIC0xMzQsNiArMTM1LDE1IEBACiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogU2VudCBudWxsIHJlcXVlc3QuIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0LT5tSXNSZXByb2Nlc3MpIHsKKyAgICAgICAgICAgIGlmICghbUlucHV0U3RyZWFtLmNvbmZpZ3VyZWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogbm8gaW5wdXQgc3RyZWFtIGlzIGNvbmZpZ3VyZWQuIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbWluZykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBzdHJlYW1pbmcgcmVwcm9jZXNzIHJlcXVlc3RzIG5vdCBzdXBwb3J0ZWQuIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGEocmVxdWVzdC0+bU1ldGFkYXRhKTsKQEAgLTE4Miw2ICsxOTIsMTAgQEAKICAgICAgICAgbWV0YWRhdGEudXBkYXRlKEFORFJPSURfUkVRVUVTVF9PVVRQVVRfU1RSRUFNUywgJm91dHB1dFN0cmVhbUlkc1swXSwKICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbUlkcy5zaXplKCkpOwogCisgICAgICAgIGlmIChyZXF1ZXN0LT5tSXNSZXByb2Nlc3MpIHsKKyAgICAgICAgICAgIG1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfSU5QVVRfU1RSRUFNUywgJm1JbnB1dFN0cmVhbS5pZCwgMSk7CisgICAgICAgIH0KKwogICAgICAgICBtZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0lELCAmcmVxdWVzdElkLCAvKnNpemUqLzEpOwogICAgICAgICBsb29wQ291bnRlcisrOyAvLyBsb29wQ291bnRlciBzdGFydHMgZnJvbSAxCiAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBDcmVhdGluZyByZXF1ZXN0IHdpdGggSUQgJWQgKCVkIG9mICV6dSkiLApAQCAtMjU1LDEzICsyNjksMzMgQEAKIAogc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpiZWdpbkNvbmZpZ3VyZSgpIHsKICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcy4KLSAgICBBTE9HRSgiJXM6IE5vdCBpbXBsZW1lbnRlZCB5ZXQuIiwgX19GVU5DVElPTl9fKTsKKyAgICBBTE9HVigiJXM6IE5vdCBpbXBsZW1lbnRlZCB5ZXQuIiwgX19GVU5DVElPTl9fKTsKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6ZW5kQ29uZmlndXJlKCkgewotICAgIEFMT0dWKCIlczogZW5kaW5nIGNvbmZpZ3VyZSAoJXp1IHN0cmVhbXMpIiwKLSAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVN0cmVhbU1hcC5zaXplKCkpOworc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjplbmRDb25maWd1cmUoYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkKSB7CisgICAgQUxPR1YoIiVzOiBlbmRpbmcgY29uZmlndXJlICglZCBpbnB1dCBzdHJlYW0sICV6dSBvdXRwdXQgc3RyZWFtcykiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSW5wdXRTdHJlYW0uY29uZmlndXJlZCA/IDEgOiAwLCBtU3RyZWFtTWFwLnNpemUoKSk7CisKKyAgICAvLyBTYW5pdGl6ZSB0aGUgaGlnaCBzcGVlZCBzZXNzaW9uIGFnYWluc3QgbmVjZXNzYXJ5IGNhcGFiaWxpdHkgYml0LgorICAgIGlmIChpc0NvbnN0cmFpbmVkSGlnaFNwZWVkKSB7CisgICAgICAgIENhbWVyYU1ldGFkYXRhIHN0YXRpY0luZm8gPSBtRGV2aWNlLT5pbmZvKCk7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICAgICAgYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgKytpKSB7CisgICAgICAgICAgICB1aW50OF90IGNhcGFiaWxpdHkgPSBlbnRyeS5kYXRhLnU4W2ldOworICAgICAgICAgICAgaWYgKGNhcGFiaWxpdHkgPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfQ09OU1RSQUlORURfSElHSF9TUEVFRF9WSURFTykgeworICAgICAgICAgICAgICAgIGlzQ29uc3RyYWluZWRIaWdoU3BlZWRTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghaXNDb25zdHJhaW5lZEhpZ2hTcGVlZFN1cHBvcnRlZCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFRyeSB0byBjcmVhdGUgYSBjb25zdHJhaW5lZCBoaWdoIHNwZWVkIGNvbmZpZ3VyYXRpb24gb24gYSBkZXZpY2UiCisgICAgICAgICAgICAgICAgICAgICIgdGhhdCBkb2Vzbid0IHN1cHBvcnQgaXQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQogCiAgICAgc3RhdHVzX3QgcmVzOwogICAgIGlmICggKHJlcyA9IGNoZWNrUGlkKF9fRlVOQ1RJT05fXykgKSAhPSBPSykgcmV0dXJuIHJlczsKQEAgLTI3MCw3ICszMDQsNyBAQAogCiAgICAgaWYgKCFtRGV2aWNlLmdldCgpKSByZXR1cm4gREVBRF9PQkpFQ1Q7CiAKLSAgICByZXR1cm4gbURldmljZS0+Y29uZmlndXJlU3RyZWFtcygpOworICAgIHJldHVybiBtRGV2aWNlLT5jb25maWd1cmVTdHJlYW1zKGlzQ29uc3RyYWluZWRIaWdoU3BlZWQpOwogfQogCiBzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmRlbGV0ZVN0cmVhbShpbnQgc3RyZWFtSWQpIHsKQEAgLTI4NCwxOSArMzE4LDI1IEBACiAKICAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHJldHVybiBERUFEX09CSkVDVDsKIAotICAgIC8vIEd1YXJkIGFnYWluc3QgdHJ5aW5nIHRvIGRlbGV0ZSBub24tY3JlYXRlZCBzdHJlYW1zCisgICAgYm9vbCBpc0lucHV0ID0gZmFsc2U7CiAgICAgc3NpemVfdCBpbmRleCA9IE5BTUVfTk9UX0ZPVU5EOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVN0cmVhbU1hcC5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAoc3RyZWFtSWQgPT0gbVN0cmVhbU1hcC52YWx1ZUF0KGkpKSB7Ci0gICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KIAotICAgIGlmIChpbmRleCA9PSBOQU1FX05PVF9GT1VORCkgewotICAgICAgICBBTE9HVygiJXM6IENhbWVyYSAlZDogSW52YWxpZCBzdHJlYW0gSUQgKCVkKSBzcGVjaWZpZWQsIG5vIHN0cmVhbSAiCi0gICAgICAgICAgICAgICJjcmVhdGVkIHlldCIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlYW1JZCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgaWYgKG1JbnB1dFN0cmVhbS5jb25maWd1cmVkICYmIG1JbnB1dFN0cmVhbS5pZCA9PSBzdHJlYW1JZCkgeworICAgICAgICBpc0lucHV0ID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IHRyeWluZyB0byBkZWxldGUgbm9uLWNyZWF0ZWQgc3RyZWFtcworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdHJlYW1NYXAuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChzdHJlYW1JZCA9PSBtU3RyZWFtTWFwLnZhbHVlQXQoaSkpIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5kZXggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhICVkOiBJbnZhbGlkIHN0cmVhbSBJRCAoJWQpIHNwZWNpZmllZCwgbm8gc3RyZWFtICIKKyAgICAgICAgICAgICAgICAgICJjcmVhdGVkIHlldCIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlYW1JZCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gQWxzbyByZXR1cm5zIEJBRF9WQUxVRSBpZiBzdHJlYW0gSUQgd2FzIG5vdCB2YWxpZApAQCAtMzA3LDI0ICszNDcsMjcgQEAKICAgICAgICAgICAgICAgIiBhbHJlYWR5IGNoZWNrZWQgYW5kIHRoZSBzdHJlYW0gSUQgKCVkKSBzaG91bGQgYmUgdmFsaWQuIiwKICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVhbUlkKTsKICAgICB9IGVsc2UgaWYgKHJlcyA9PSBPSykgewotICAgICAgICBtU3RyZWFtTWFwLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwotCisgICAgICAgIGlmIChpc0lucHV0KSB7CisgICAgICAgICAgICBtSW5wdXRTdHJlYW0uY29uZmlndXJlZCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVN0cmVhbU1hcC5yZW1vdmVJdGVtc0F0KGluZGV4KTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiByZXM7CiB9CiAKLXN0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6Y3JlYXRlU3RyZWFtKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIpCitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmNyZWF0ZVN0cmVhbShjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uICZvdXRwdXRDb25maWd1cmF0aW9uKQogewogICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQUxPR1YoIiVzICh3ID0gJWQsIGggPSAlZCwgZiA9IDB4JXgpIiwgX19GVU5DVElPTl9fLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpOwogCiAgICAgc3RhdHVzX3QgcmVzOwogICAgIGlmICggKHJlcyA9IGNoZWNrUGlkKF9fRlVOQ1RJT05fXykgKSAhPSBPSykgcmV0dXJuIHJlczsKIAogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKIAorCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gYnVmZmVyUHJvZHVjZXIgPSBvdXRwdXRDb25maWd1cmF0aW9uLmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOwogICAgIGlmIChidWZmZXJQcm9kdWNlciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCIlczogYnVmZmVyUHJvZHVjZXIgbXVzdCBub3QgYmUgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC0zNjgsMjUgKzQxMSwzMyBAQAogICAgICAgICAgICAgKGNvbnN1bWVyVXNhZ2UgJiBhbGxvd2VkRmxhZ3MpICE9IDA7CiAKICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBJSW50ZXJmYWNlOjphc0JpbmRlcihidWZmZXJQcm9kdWNlcik7Ci0gICAgc3A8QU5hdGl2ZVdpbmRvdz4gYW53ID0gbmV3IFN1cmZhY2UoYnVmZmVyUHJvZHVjZXIsIHVzZUFzeW5jKTsKKyAgICBzcDxTdXJmYWNlPiBzdXJmYWNlID0gbmV3IFN1cmZhY2UoYnVmZmVyUHJvZHVjZXIsIHVzZUFzeW5jKTsKKyAgICBBTmF0aXZlV2luZG93ICphbncgPSBzdXJmYWNlLmdldCgpOwogCi0gICAgLy8gVE9ETzogcmVtb3ZlIHcsaCxmIHNpbmNlIHdlIGFyZSBpZ25vcmluZyB0aGVtCisgICAgaW50IHdpZHRoLCBoZWlnaHQsIGZvcm1hdDsKKyAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2U7CiAKLSAgICBpZiAoKHJlcyA9IGFudy0+cXVlcnkoYW53LmdldCgpLCBOQVRJVkVfV0lORE9XX1dJRFRILCAmd2lkdGgpKSAhPSBPSykgeworICAgIGlmICgocmVzID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfV0lEVEgsICZ3aWR0aCkpICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBGYWlsZWQgdG8gcXVlcnkgU3VyZmFjZSB3aWR0aCIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgbUNhbWVyYUlkKTsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9Ci0gICAgaWYgKChyZXMgPSBhbnctPnF1ZXJ5KGFudy5nZXQoKSwgTkFUSVZFX1dJTkRPV19IRUlHSFQsICZoZWlnaHQpKSAhPSBPSykgeworICAgIGlmICgocmVzID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfSEVJR0hULCAmaGVpZ2h0KSkgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEZhaWxlZCB0byBxdWVyeSBTdXJmYWNlIGhlaWdodCIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgbUNhbWVyYUlkKTsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9Ci0gICAgaWYgKChyZXMgPSBhbnctPnF1ZXJ5KGFudy5nZXQoKSwgTkFUSVZFX1dJTkRPV19GT1JNQVQsICZmb3JtYXQpKSAhPSBPSykgeworICAgIGlmICgocmVzID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfRk9STUFULCAmZm9ybWF0KSkgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEZhaWxlZCB0byBxdWVyeSBTdXJmYWNlIGZvcm1hdCIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgbUNhbWVyYUlkKTsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CisgICAgaWYgKChyZXMgPSBhbnctPnF1ZXJ5KGFudywgTkFUSVZFX1dJTkRPV19ERUZBVUxUX0RBVEFTUEFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGludCo+KCZkYXRhU3BhY2UpKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEZhaWxlZCB0byBxdWVyeSBTdXJmYWNlIGRhdGFTcGFjZSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgbUNhbWVyYUlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CiAKICAgICAvLyBGSVhNRTogcmVtb3ZlIHRoaXMgb3ZlcnJpZGUgc2luY2UgdGhlIGRlZmF1bHQgZm9ybWF0IHNob3VsZCBiZQogICAgIC8vICAgICAgIElNUExFTUVOVEFUSU9OX0RFRklORUQuIGIvOTQ4NzQ4MgpAQCAtMzk5LDE0ICs0NTAsMTcgQEAKIAogICAgIC8vIFJvdW5kIGRpbWVuc2lvbnMgdG8gdGhlIG5lYXJlc3QgZGltZW5zaW9ucyBhdmFpbGFibGUgZm9yIHRoaXMgZm9ybWF0CiAgICAgaWYgKGZsZXhpYmxlQ29uc3VtZXIgJiYgIUNhbWVyYURldmljZUNsaWVudDo6cm91bmRCdWZmZXJEaW1lbnNpb25OZWFyZXN0KHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICBmb3JtYXQsIG1EZXZpY2UtPmluZm8oKSwgLypvdXQqLyZ3aWR0aCwgLypvdXQqLyZoZWlnaHQpKSB7CisgICAgICAgICAgICBmb3JtYXQsIGRhdGFTcGFjZSwgbURldmljZS0+aW5mbygpLCAvKm91dCovJndpZHRoLCAvKm91dCovJmhlaWdodCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBObyBzdHJlYW0gY29uZmlndXJhdGlvbnMgd2l0aCB0aGUgZm9ybWF0ICUjeCBkZWZpbmVkLCBmYWlsZWQgdG8gY3JlYXRlIHN0cmVhbS4iLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZm9ybWF0KTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBpbnQgc3RyZWFtSWQgPSAtMTsKLSAgICByZXMgPSBtRGV2aWNlLT5jcmVhdGVTdHJlYW0oYW53LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsICZzdHJlYW1JZCk7CisgICAgcmVzID0gbURldmljZS0+Y3JlYXRlU3RyZWFtKHN1cmZhY2UsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgZGF0YVNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRwdXRDb25maWd1cmF0aW9uLmdldFJvdGF0aW9uKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtSWQpOwogCiAgICAgaWYgKHJlcyA9PSBPSykgewogICAgICAgICBtU3RyZWFtTWFwLmFkZChiaW5kZXIsIHN0cmVhbUlkKTsKQEAgLTQ0MCwxMSArNDk0LDY1IEBACiB9CiAKIAorc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpjcmVhdGVJbnB1dFN0cmVhbShpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgIGludCBmb3JtYXQpIHsKKworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR1YoIiVzICh3ID0gJWQsIGggPSAlZCwgZiA9IDB4JXgpIiwgX19GVU5DVElPTl9fLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpOworCisgICAgc3RhdHVzX3QgcmVzOworICAgIGlmICggKHJlcyA9IGNoZWNrUGlkKF9fRlVOQ1RJT05fXykgKSAhPSBPSykgcmV0dXJuIHJlczsKKworICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKKyAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHJldHVybiBERUFEX09CSkVDVDsKKworICAgIGlmIChtSW5wdXRTdHJlYW0uY29uZmlndXJlZCkgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQWxyZWFkeSBoYXMgYW4gaW5wdXQgc3RyZWFtICIKKyAgICAgICAgICAgICAgICAiIGNvbmZpZ3VyYXRpb24uIChJRCAlemQpIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsCisgICAgICAgICAgICAgICAgbUlucHV0U3RyZWFtLmlkKTsKKyAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgIH0KKworICAgIGludCBzdHJlYW1JZCA9IC0xOworICAgIHJlcyA9IG1EZXZpY2UtPmNyZWF0ZUlucHV0U3RyZWFtKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgJnN0cmVhbUlkKTsKKyAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgIG1JbnB1dFN0cmVhbS5jb25maWd1cmVkID0gdHJ1ZTsKKyAgICAgICAgbUlucHV0U3RyZWFtLndpZHRoID0gd2lkdGg7CisgICAgICAgIG1JbnB1dFN0cmVhbS5oZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIG1JbnB1dFN0cmVhbS5mb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgIG1JbnB1dFN0cmVhbS5pZCA9IHN0cmVhbUlkOworCisgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBTdWNjZXNzZnVsbHkgY3JlYXRlZCBhIG5ldyBpbnB1dCBzdHJlYW0gSUQgJWQiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZWFtSWQpOworCisgICAgICAgIHJldHVybiBzdHJlYW1JZDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmdldElucHV0QnVmZmVyUHJvZHVjZXIoCisgICAgICAgIC8qb3V0Ki9zcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqcHJvZHVjZXIpIHsKKyAgICBzdGF0dXNfdCByZXM7CisgICAgaWYgKCAocmVzID0gY2hlY2tQaWQoX19GVU5DVElPTl9fKSApICE9IE9LKSByZXR1cm4gcmVzOworCisgICAgaWYgKHByb2R1Y2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CisgICAgaWYgKCFtRGV2aWNlLmdldCgpKSByZXR1cm4gREVBRF9PQkpFQ1Q7CisKKyAgICByZXR1cm4gbURldmljZS0+Z2V0SW5wdXRCdWZmZXJQcm9kdWNlcihwcm9kdWNlcik7Cit9CisKIGJvb2wgQ2FtZXJhRGV2aWNlQ2xpZW50Ojpyb3VuZEJ1ZmZlckRpbWVuc2lvbk5lYXJlc3QoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCi0gICAgICAgIGludDMyX3QgZm9ybWF0LCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgaW5mbywKKyAgICAgICAgaW50MzJfdCBmb3JtYXQsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGluZm8sCiAgICAgICAgIC8qb3V0Ki9pbnQzMl90KiBvdXRXaWR0aCwgLypvdXQqL2ludDMyX3QqIG91dEhlaWdodCkgewogCiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IHN0cmVhbUNvbmZpZ3MgPQorICAgICAgICAgICAgKGRhdGFTcGFjZSA9PSBIQUxfREFUQVNQQUNFX0RFUFRIKSA/CisgICAgICAgICAgICBpbmZvLmZpbmQoQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TKSA6CiAgICAgICAgICAgICBpbmZvLmZpbmQoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUyk7CiAKICAgICBpbnQzMl90IGJlc3RXaWR0aCA9IC0xOwpAQCAtNTgwLDYgKzY4OCw2OCBAQAogICAgIHJldHVybiBtRGV2aWNlLT5mbHVzaChsYXN0RnJhbWVOdW1iZXIpOwogfQogCitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OnByZXBhcmUoaW50IHN0cmVhbUlkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOworCisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgaWYgKCAocmVzID0gY2hlY2tQaWQoX19GVU5DVElPTl9fKSApICE9IE9LKSByZXR1cm4gcmVzOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOworCisgICAgLy8gR3VhcmQgYWdhaW5zdCB0cnlpbmcgdG8gcHJlcGFyZSBub24tY3JlYXRlZCBzdHJlYW1zCisgICAgc3NpemVfdCBpbmRleCA9IE5BTUVfTk9UX0ZPVU5EOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVN0cmVhbU1hcC5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoc3RyZWFtSWQgPT0gbVN0cmVhbU1hcC52YWx1ZUF0KGkpKSB7CisgICAgICAgICAgICBpbmRleCA9IGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpbmRleCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBBTE9HVygiJXM6IENhbWVyYSAlZDogSW52YWxpZCBzdHJlYW0gSUQgKCVkKSBzcGVjaWZpZWQsIG5vIHN0cmVhbSAiCisgICAgICAgICAgICAgICJjcmVhdGVkIHlldCIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlYW1JZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gQWxzbyByZXR1cm5zIEJBRF9WQUxVRSBpZiBzdHJlYW0gSUQgd2FzIG5vdCB2YWxpZCwgb3Igc3RyZWFtIGFscmVhZHkKKyAgICAvLyBoYXMgYmVlbiB1c2VkCisgICAgcmVzID0gbURldmljZS0+cHJlcGFyZShzdHJlYW1JZCk7CisKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OnRlYXJEb3duKGludCBzdHJlYW1JZCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKKworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGlmICggKHJlcyA9IGNoZWNrUGlkKF9fRlVOQ1RJT05fXykgKSAhPSBPSykgcmV0dXJuIHJlczsKKworICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKKworICAgIC8vIEd1YXJkIGFnYWluc3QgdHJ5aW5nIHRvIHByZXBhcmUgbm9uLWNyZWF0ZWQgc3RyZWFtcworICAgIHNzaXplX3QgaW5kZXggPSBOQU1FX05PVF9GT1VORDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdHJlYW1NYXAuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKHN0cmVhbUlkID09IG1TdHJlYW1NYXAudmFsdWVBdChpKSkgeworICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaW5kZXggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgQUxPR1coIiVzOiBDYW1lcmEgJWQ6IEludmFsaWQgc3RyZWFtIElEICglZCkgc3BlY2lmaWVkLCBubyBzdHJlYW0gIgorICAgICAgICAgICAgICAiY3JlYXRlZCB5ZXQiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZWFtSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEFsc28gcmV0dXJucyBCQURfVkFMVUUgaWYgc3RyZWFtIElEIHdhcyBub3QgdmFsaWQgb3IgaWYgdGhlIHN0cmVhbSBpcyBpbgorICAgIC8vIHVzZQorICAgIHJlcyA9IG1EZXZpY2UtPnRlYXJEb3duKHN0cmVhbUlkKTsKKworICAgIHJldHVybiByZXM7Cit9CisKIHN0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKICAgICByZXR1cm4gQmFzaWNDbGllbnQ6OmR1bXAoZmQsIGFyZ3MpOwogfQpAQCAtNTkwLDE5ICs3NjAsMjMgQEAKICAgICAgICAgICAgIG1DYW1lcmFJZCwKICAgICAgICAgICAgIChnZXRSZW1vdGVDYWxsYmFjaygpICE9IE5VTEwgPwogICAgICAgICAgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihnZXRSZW1vdGVDYWxsYmFjaygpKS5nZXQoKSA6IE5VTEwpICk7Ci0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBDdXJyZW50IGNsaWVudDogJXMgKFBJRCAlZCwgVUlEICV1KVxuIiwKLSAgICAgICAgICAgIFN0cmluZzgobUNsaWVudFBhY2thZ2VOYW1lKS5zdHJpbmcoKSwKLSAgICAgICAgICAgIG1DbGllbnRQaWQsIG1DbGllbnRVaWQpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgQ3VycmVudCBjbGllbnQgVUlEICV1XG4iLCBtQ2xpZW50VWlkKTsKIAogICAgIHJlc3VsdC5hcHBlbmQoIiAgU3RhdGU6XG4iKTsKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgICAgUmVxdWVzdCBJRCBjb3VudGVyOiAlZFxuIiwgbVJlcXVlc3RJZENvdW50ZXIpOworICAgIGlmIChtSW5wdXRTdHJlYW0uY29uZmlndXJlZCkgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgICAgQ3VycmVudCBpbnB1dCBzdHJlYW0gSUQ6ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBtSW5wdXRTdHJlYW0uaWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgICBObyBpbnB1dCBzdHJlYW0gY29uZmlndXJlZC5cbiIpOworICAgIH0KICAgICBpZiAoIW1TdHJlYW1NYXAuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgICBDdXJyZW50IHN0cmVhbSBJRHM6XG4iKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgIEN1cnJlbnQgb3V0cHV0IHN0cmVhbSBJRHM6XG4iKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RyZWFtTWFwLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgICAgICBTdHJlYW0gJWRcbiIsIG1TdHJlYW1NYXAudmFsdWVBdChpKSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQuYXBwZW5kKCIgICAgTm8gc3RyZWFtcyBjb25maWd1cmVkLlxuIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgICBObyBvdXRwdXQgc3RyZWFtcyBjb25maWd1cmVkLlxuIik7CiAgICAgfQogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgIC8vIFRPRE86IHByaW50IGR5bmFtaWMvcmVxdWVzdCBzZWN0aW9uIGZyb20gbW9zdCByZWNlbnQgcmVxdWVzdHMKQEAgLTYzOSw4ICs4MTMsMTMgQEAKICAgICB9CiB9CiAKLS8vIFRPRE86IHJlZmFjdG9yIHRoZSBjb2RlIGJlbG93IHRoaXMgd2l0aCBJUHJvQ2FtZXJhVXNlci4KLS8vIGl0J3MgMTAwJSBjb3B5LXBhc3RlZCwgc28gbGV0cyBub3QgY2hhbmdlIGl0IHJpZ2h0IG5vdyB0byBtYWtlIGl0IGVhc2llci4KK3ZvaWQgQ2FtZXJhRGV2aWNlQ2xpZW50Ojpub3RpZnlQcmVwYXJlZChpbnQgc3RyZWFtSWQpIHsKKyAgICAvLyBUaHJlYWQgc2FmZS4gRG9uJ3QgYm90aGVyIGxvY2tpbmcuCisgICAgc3A8SUNhbWVyYURldmljZUNhbGxiYWNrcz4gcmVtb3RlQ2IgPSBnZXRSZW1vdGVDYWxsYmFjaygpOworICAgIGlmIChyZW1vdGVDYiAhPSAwKSB7CisgICAgICAgIHJlbW90ZUNiLT5vblByZXBhcmVkKHN0cmVhbUlkKTsKKyAgICB9Cit9CiAKIHZvaWQgQ2FtZXJhRGV2aWNlQ2xpZW50OjpkZXRhY2hEZXZpY2UoKSB7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKaW5kZXggYmJlZGI3MC4uNDg2ZTY4YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmg+CiAKICNpbmNsdWRlICJDYW1lcmFTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5oIgpAQCAtMjYsOCArMjcsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBDYW1lcmFEZXZpY2VDbGllbnRCYXNlIDoKLSAgICAgICAgcHVibGljIENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50LCBwdWJsaWMgQm5DYW1lcmFEZXZpY2VVc2VyCitzdHJ1Y3QgQ2FtZXJhRGV2aWNlQ2xpZW50QmFzZSA6IHB1YmxpYyBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudCwgcHVibGljIEJuQ2FtZXJhRGV2aWNlVXNlcgogewogICAgIHR5cGVkZWYgSUNhbWVyYURldmljZUNhbGxiYWNrcyBUQ2FtQ2FsbGJhY2tzOwogCkBAIC03OCwxNiArNzgsMTkgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgYmVnaW5Db25maWd1cmUoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5kQ29uZmlndXJlKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBlbmRDb25maWd1cmUoYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkID0gZmFsc2UpOwogCiAgICAgLy8gUmV0dXJucyAtRUJVU1kgaWYgZGV2aWNlIGlzIG5vdCBpZGxlCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGRlbGV0ZVN0cmVhbShpbnQgc3RyZWFtSWQpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGNyZWF0ZVN0cmVhbSgKLSAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJ1ZmZlclByb2R1Y2VyKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgY3JlYXRlU3RyZWFtKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJm91dHB1dENvbmZpZ3VyYXRpb24pOworCisgICAgLy8gQ3JlYXRlIGFuIGlucHV0IHN0cmVhbSBvZiB3aWR0aCwgaGVpZ2h0LCBhbmQgZm9ybWF0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBjcmVhdGVJbnB1dFN0cmVhbShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQpOworCisgICAgLy8gR2V0IHRoZSBidWZmZXIgcHJvZHVjZXIgb2YgdGhlIGlucHV0IHN0cmVhbQorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBnZXRJbnB1dEJ1ZmZlclByb2R1Y2VyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKnByb2R1Y2VyKTsKIAogICAgIC8vIENyZWF0ZSBhIHJlcXVlc3Qgb2JqZWN0IGZyb20gYSB0ZW1wbGF0ZS4KICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgY3JlYXRlRGVmYXVsdFJlcXVlc3QoaW50IHRlbXBsYXRlSWQsCkBAIC0xMDUsNiArMTA4LDEyIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGZsdXNoKC8qb3V0Ki8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CiAKKyAgICAvLyBQcmVwYXJlIHN0cmVhbSBieSBwcmVhbGxvY2F0aW5nIGl0cyBidWZmZXJzCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIHByZXBhcmUoaW50IHN0cmVhbUlkKTsKKworICAgIC8vIFRlYXIgZG93biBzdHJlYW0gcmVzb3VyY2VzIGJ5IGZyZWVpbmcgaXRzIHVudXNlZCBidWZmZXJzCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIHRlYXJEb3duKGludCBzdHJlYW1JZCk7CisKICAgICAvKioKICAgICAgKiBJbnRlcmZhY2UgdXNlZCBieSBDYW1lcmFTZXJ2aWNlCiAgICAgICovCkBAIC0xMTksNyArMTI4LDcgQEAKICAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkKTsKICAgICB2aXJ0dWFsIH5DYW1lcmFEZXZpY2VDbGllbnQoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBpbml0aWFsaXplKGNhbWVyYV9tb2R1bGVfdCAqbW9kdWxlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgaW5pdGlhbGl6ZShDYW1lcmFNb2R1bGUgKm1vZHVsZSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCkBAIC0xMzMsNiArMTQyLDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKTsKICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5U2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsIG5zZWNzX3QgdGltZXN0YW1wKTsKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5UHJlcGFyZWQoaW50IHN0cmVhbUlkKTsKIAogICAgIC8qKgogICAgICAqIEludGVyZmFjZSB1c2VkIGJ5IGluZGVwZW5kZW50IGNvbXBvbmVudHMgb2YgQ2FtZXJhRGV2aWNlQ2xpZW50LgpAQCAtMTYxLDE0ICsxNzEsMjMgQEAKIAogICAgIC8vIEZpbmQgdGhlIGNsb3Nlc3QgZGltZW5zaW9ucyBmb3IgYSBnaXZlbiBmb3JtYXQgaW4gYXZhaWxhYmxlIHN0cmVhbSBjb25maWd1cmF0aW9ucyB3aXRoCiAgICAgLy8gYSB3aWR0aCA8PSBST1VORElOR19XSURUSF9DQVAKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBST1VORElOR19XSURUSF9DQVAgPSAxMDgwOworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IFJPVU5ESU5HX1dJRFRIX0NBUCA9IDE5MjA7CiAgICAgc3RhdGljIGJvb2wgcm91bmRCdWZmZXJEaW1lbnNpb25OZWFyZXN0KGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IGZvcm1hdCwKLSAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvLCAvKm91dCovaW50MzJfdCogb3V0V2lkdGgsIC8qb3V0Ki9pbnQzMl90KiBvdXRIZWlnaHQpOworICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgaW5mbywKKyAgICAgICAgICAgIC8qb3V0Ki9pbnQzMl90KiBvdXRXaWR0aCwgLypvdXQqL2ludDMyX3QqIG91dEhlaWdodCk7CiAKLSAgICAvLyBJR3JhcGhpY3NCdWZmZXJQcm9kdWNlciBiaW5kZXIgLT4gU3RyZWFtIElECisgICAgLy8gSUdyYXBoaWNzQnVmZmVyUHJvZHVjZXIgYmluZGVyIC0+IFN0cmVhbSBJRCBmb3Igb3V0cHV0IHN0cmVhbXMKICAgICBLZXllZFZlY3RvcjxzcDxJQmluZGVyPiwgaW50PiBtU3RyZWFtTWFwOwogCi0gICAgLy8gU3RyZWFtIElECisgICAgc3RydWN0IElucHV0U3RyZWFtQ29uZmlndXJhdGlvbiB7CisgICAgICAgIGJvb2wgY29uZmlndXJlZDsKKyAgICAgICAgaW50MzJfdCB3aWR0aDsKKyAgICAgICAgaW50MzJfdCBoZWlnaHQ7CisgICAgICAgIGludDMyX3QgZm9ybWF0OworICAgICAgICBpbnQzMl90IGlkOworICAgIH0gbUlucHV0U3RyZWFtOworCisgICAgLy8gUmVxdWVzdCBJRAogICAgIFZlY3RvcjxpbnQ+IG1TdHJlYW1pbmdSZXF1ZXN0TGlzdDsKIAogICAgIGludDMyX3QgbVJlcXVlc3RJZENvdW50ZXI7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpX3Byby9Qcm9DYW1lcmEyQ2xpZW50LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0NWM3ZC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlByb0NhbWVyYTJDbGllbnQiCi0jZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+Ci0KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KLQotI2luY2x1ZGUgImFwaV9wcm8vUHJvQ2FtZXJhMkNsaWVudC5oIgotI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLXVzaW5nIG5hbWVzcGFjZSBjYW1lcmEyOwotCi0vLyBJbnRlcmZhY2UgdXNlZCBieSBDYW1lcmFTZXJ2aWNlCi0KLVByb0NhbWVyYTJDbGllbnQ6OlByb0NhbWVyYTJDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElQcm9DYW1lcmFDYWxsYmFja3M+JiByZW1vdGVDYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRQaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlcnZpY2VQaWQpIDoKLSAgICBDYW1lcmEyQ2xpZW50QmFzZShjYW1lcmFTZXJ2aWNlLCByZW1vdGVDYWxsYmFjaywgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgY2FtZXJhSWQsIGNhbWVyYUZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsIHNlcnZpY2VQaWQpCi17Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBBTE9HSSgiUHJvQ2FtZXJhICVkOiBPcGVuZWQiLCBjYW1lcmFJZCk7Ci0KLSAgICBtRXhjbHVzaXZlTG9jayA9IGZhbHNlOwotfQotCi1zdGF0dXNfdCBQcm9DYW1lcmEyQ2xpZW50Ojppbml0aWFsaXplKGNhbWVyYV9tb2R1bGVfdCAqbW9kdWxlKQotewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgc3RhdHVzX3QgcmVzOwotCi0gICAgcmVzID0gQ2FtZXJhMkNsaWVudEJhc2U6OmluaXRpYWxpemUobW9kdWxlKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgU3RyaW5nOCB0aHJlYWROYW1lOwotICAgIG1GcmFtZVByb2Nlc3NvciA9IG5ldyBGcmFtZVByb2Nlc3NvckJhc2UobURldmljZSk7Ci0gICAgdGhyZWFkTmFtZSA9IFN0cmluZzg6OmZvcm1hdCgiUEMyLSVkLUZyYW1lUHJvYyIsIG1DYW1lcmFJZCk7Ci0gICAgbUZyYW1lUHJvY2Vzc29yLT5ydW4odGhyZWFkTmFtZS5zdHJpbmcoKSk7Ci0KLSAgICBtRnJhbWVQcm9jZXNzb3ItPnJlZ2lzdGVyTGlzdGVuZXIoRlJBTUVfUFJPQ0VTU09SX0xJU1RFTkVSX01JTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfUFJPQ0VTU09SX0xJU1RFTkVSX01BWF9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypsaXN0ZW5lciovdGhpcyk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLVByb0NhbWVyYTJDbGllbnQ6On5Qcm9DYW1lcmEyQ2xpZW50KCkgewotfQotCi1zdGF0dXNfdCBQcm9DYW1lcmEyQ2xpZW50OjpleGNsdXNpdmVUcnlMb2NrKCkgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKLSAgICBTaGFyZWRDYW1lcmFDYWxsYmFja3M6OkxvY2sgbChtU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzKTsKLQotICAgIGlmICghbURldmljZS5nZXQoKSkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotCi0gICAgaWYgKCFtRXhjbHVzaXZlTG9jaykgewotICAgICAgICBtRXhjbHVzaXZlTG9jayA9IHRydWU7Ci0KLSAgICAgICAgaWYgKG1SZW1vdGVDYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtUmVtb3RlQ2FsbGJhY2stPm9uTG9ja1N0YXR1c0NoYW5nZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvQ2FtZXJhQ2FsbGJhY2tzOjpMT0NLX0FDUVVJUkVEKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFMT0dWKCIlczogZXhjbHVzaXZlIGxvY2sgYWNxdWlyZWQiLCBfX0ZVTkNUSU9OX18pOwotCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBoYXZlIGEgUEVSTUlTU0lPTl9ERU5JRUQgY2FzZSBmb3Igd2hlbiBzb21lb25lIGVsc2Ugb3ducyB0aGUgbG9jawotCi0gICAgLy8gZG9uJ3QgYWxsb3cgcmVjdXJzaXZlIGxvY2tpbmcKLSAgICBBTE9HVygiJXM6IGV4Y2x1c2l2ZSBsb2NrIGFscmVhZHkgZXhpc3RzIC0gcmVjdXJzaXZlIGxvY2tpbmcgaXMgbm90IgotICAgICAgICAgICJhbGxvd2VkIiwgX19GVU5DVElPTl9fKTsKLQotICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKLX0KLQotc3RhdHVzX3QgUHJvQ2FtZXJhMkNsaWVudDo6ZXhjbHVzaXZlTG9jaygpIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7Ci0gICAgU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzOjpMb2NrIGwobVNoYXJlZENhbWVyYUNhbGxiYWNrcyk7Ci0KLSAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLQotICAgIC8qKgotICAgICAqIFRPRE86IHRoaXMgc2hvdWxkIGFzeW5jaHJvbm91c2x5ICd3YWl0JyB1bnRpbCB0aGUgbG9jayBiZWNvbWVzIGF2YWlsYWJsZQotICAgICAqIGlmIGFub3RoZXIgY2xpZW50IGFscmVhZHkgaGFzIGFuIGV4Y2x1c2l2ZSBsb2NrLgotICAgICAqCi0gICAgICogb25jZSB3ZSBoYXZlIHByb3BlciBzaGFyaW5nIHN1cHBvcnQgdGhpcyB3aWxsIG5lZWQgdG8gZG8KLSAgICAgKiBtb3JlIHRoYW4ganVzdCByZXR1cm4gaW1tZWRpYXRlbHkKLSAgICAgKi8KLSAgICBpZiAoIW1FeGNsdXNpdmVMb2NrKSB7Ci0gICAgICAgIG1FeGNsdXNpdmVMb2NrID0gdHJ1ZTsKLQotICAgICAgICBpZiAobVJlbW90ZUNhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1SZW1vdGVDYWxsYmFjay0+b25Mb2NrU3RhdHVzQ2hhbmdlZChJUHJvQ2FtZXJhQ2FsbGJhY2tzOjpMT0NLX0FDUVVJUkVEKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFMT0dWKCIlczogZXhjbHVzaXZlIGxvY2sgYWNxdWlyZWQiLCBfX0ZVTkNUSU9OX18pOwotCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICAvLyBkb24ndCBhbGxvdyByZWN1cnNpdmUgbG9ja2luZwotICAgIEFMT0dXKCIlczogZXhjbHVzaXZlIGxvY2sgYWxyZWFkeSBleGlzdHMgLSByZWN1cnNpdmUgbG9ja2luZyBpcyBub3QgYWxsb3dlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIF9fRlVOQ1RJT05fXyk7Ci0gICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOwotfQotCi1zdGF0dXNfdCBQcm9DYW1lcmEyQ2xpZW50OjpleGNsdXNpdmVVbmxvY2soKSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwotICAgIFNoYXJlZENhbWVyYUNhbGxiYWNrczo6TG9jayBsKG1TaGFyZWRDYW1lcmFDYWxsYmFja3MpOwotCi0gICAgLy8gZG9uJ3QgYWxsb3cgdW5sb2NraW5nIGlmIHdlIGhhdmUgbm8gbG9jawotICAgIGlmICghbUV4Y2x1c2l2ZUxvY2spIHsKLSAgICAgICAgQUxPR1coIiVzOiBjYW5ub3QgdW5sb2NrLCBubyBsb2NrIHdhcyBoZWxkIGluIHRoZSBmaXJzdCBwbGFjZSIsCi0gICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgbUV4Y2x1c2l2ZUxvY2sgPSBmYWxzZTsKLSAgICBpZiAobVJlbW90ZUNhbGxiYWNrICE9IE5VTEwgKSB7Ci0gICAgICAgIG1SZW1vdGVDYWxsYmFjay0+b25Mb2NrU3RhdHVzQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9DYW1lcmFDYWxsYmFja3M6OkxPQ0tfUkVMRUFTRUQpOwotICAgIH0KLSAgICBBTE9HVigiJXM6IGV4Y2x1c2l2ZSBsb2NrIHJlbGVhc2VkIiwgX19GVU5DVElPTl9fKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotYm9vbCBQcm9DYW1lcmEyQ2xpZW50OjpoYXNFeGNsdXNpdmVMb2NrKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKLSAgICByZXR1cm4gbUV4Y2x1c2l2ZUxvY2s7Ci19Ci0KLXZvaWQgUHJvQ2FtZXJhMkNsaWVudDo6b25FeGNsdXNpdmVMb2NrU3RvbGVuKCkgewotICAgIEFMT0dWKCIlczogUHJvQ2xpZW50IGxvc3QgZXhjbHVzaXZpdHkgKGlkICVkKSIsCi0gICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwotICAgIFNoYXJlZENhbWVyYUNhbGxiYWNrczo6TG9jayBsKG1TaGFyZWRDYW1lcmFDYWxsYmFja3MpOwotCi0gICAgaWYgKG1FeGNsdXNpdmVMb2NrICYmIG1SZW1vdGVDYWxsYmFjay5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgIG1SZW1vdGVDYWxsYmFjay0+b25Mb2NrU3RhdHVzQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9DYW1lcmFDYWxsYmFja3M6OkxPQ0tfU1RPTEVOKTsKLSAgICB9Ci0KLSAgICBtRXhjbHVzaXZlTG9jayA9IGZhbHNlOwotCi0gICAgLy9UT0RPOiB3ZSBzaG91bGQgbm90IG5lZWQgdG8gZGV0YWNoIHRoZSBkZXZpY2UsIG1lcmVseSByZXNldCBpdC4KLSAgICBkZXRhY2hEZXZpY2UoKTsKLX0KLQotc3RhdHVzX3QgUHJvQ2FtZXJhMkNsaWVudDo6c3VibWl0UmVxdWVzdChjYW1lcmFfbWV0YWRhdGFfdCogcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1pbmcpIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7Ci0KLSAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHJldHVybiBERUFEX09CSkVDVDsKLQotICAgIGlmICghbUV4Y2x1c2l2ZUxvY2spIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLQotICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhKHJlcXVlc3QpOwotCi0gICAgaWYgKCFlbmZvcmNlUmVxdWVzdFBlcm1pc3Npb25zKG1ldGFkYXRhKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotCi0gICAgaWYgKHN0cmVhbWluZykgewotICAgICAgICByZXR1cm4gbURldmljZS0+c2V0U3RyZWFtaW5nUmVxdWVzdChtZXRhZGF0YSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2UtPmNhcHR1cmUobWV0YWRhdGEpOwotICAgIH0KLQotICAgIC8vIHVucmVhY2hhYmxlLiB0aHggZ2NjIGZvciBhIHVzZWxlc3Mgd2FybmluZwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJvQ2FtZXJhMkNsaWVudDo6Y2FuY2VsUmVxdWVzdChpbnQgcmVxdWVzdElkKSB7Ci0gICAgKHZvaWQpcmVxdWVzdElkOwotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKLQotICAgIGlmICghbURldmljZS5nZXQoKSkgcmV0dXJuIERFQURfT0JKRUNUOwotCi0gICAgaWYgKCFtRXhjbHVzaXZlTG9jaykgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogaW1wbGVtZW50Ci0gICAgQUxPR0UoIiVzOiBub3QgZnVsbHkgaW1wbGVtZW50ZWQgeWV0IiwgX19GVU5DVElPTl9fKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IFByb0NhbWVyYTJDbGllbnQ6OmRlbGV0ZVN0cmVhbShpbnQgc3RyZWFtSWQpIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dWKCIlcyAoc3RyZWFtSWQgPSAweCV4KSIsIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOwotCi0gICAgc3RhdHVzX3QgcmVzOwotICAgIGlmICggKHJlcyA9IGNoZWNrUGlkKF9fRlVOQ1RJT05fXykgKSAhPSBPSykgcmV0dXJuIHJlczsKLQotICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKLQotICAgIGlmICghbURldmljZS5nZXQoKSkgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIG1EZXZpY2UtPmNsZWFyU3RyZWFtaW5nUmVxdWVzdCgpOwotCi0gICAgc3RhdHVzX3QgY29kZTsKLSAgICBpZiAoKGNvZGUgPSBtRGV2aWNlLT53YWl0VW50aWxEcmFpbmVkKCkpICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogd2FpdFVudGlsRHJhaW5lZCBmYWlsZWQgd2l0aCBjb2RlIDB4JXgiLCBfX0ZVTkNUSU9OX18sIGNvZGUpOwotICAgIH0KLQotICAgIHJldHVybiBtRGV2aWNlLT5kZWxldGVTdHJlYW0oc3RyZWFtSWQpOwotfQotCi1zdGF0dXNfdCBQcm9DYW1lcmEyQ2xpZW50OjpjcmVhdGVTdHJlYW0oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBidWZmZXJQcm9kdWNlciwKLSAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCi0gICAgICAgICAgICAgICAgICAgICAgaW50KiBzdHJlYW1JZCkKLXsKLSAgICBpZiAoc3RyZWFtSWQpIHsKLSAgICAgICAgKnN0cmVhbUlkID0gLTE7Ci0gICAgfQotCi0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBBTE9HVigiJXMgKHcgPSAlZCwgaCA9ICVkLCBmID0gMHgleCkiLCBfX0ZVTkNUSU9OX18sIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCk7Ci0KLSAgICBzdGF0dXNfdCByZXM7Ci0gICAgaWYgKCAocmVzID0gY2hlY2tQaWQoX19GVU5DVElPTl9fKSApICE9IE9LKSByZXR1cm4gcmVzOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwotCi0gICAgaWYgKCFtRGV2aWNlLmdldCgpKSByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0KLSAgICBzcDxJQmluZGVyPiBiaW5kZXI7Ci0gICAgc3A8QU5hdGl2ZVdpbmRvdz4gd2luZG93OwotICAgIGlmIChidWZmZXJQcm9kdWNlciAhPSAwKSB7Ci0gICAgICAgIGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKGJ1ZmZlclByb2R1Y2VyKTsKLSAgICAgICAgd2luZG93ID0gbmV3IFN1cmZhY2UoYnVmZmVyUHJvZHVjZXIpOwotICAgIH0KLQotICAgIHJldHVybiBtRGV2aWNlLT5jcmVhdGVTdHJlYW0od2luZG93LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JZCk7Ci19Ci0KLS8vIENyZWF0ZSBhIHJlcXVlc3Qgb2JqZWN0IGZyb20gYSB0ZW1wbGF0ZS4KLS8vIC0tIENhbGxlciBvd25zIHRoZSBuZXdseSBhbGxvY2F0ZWQgbWV0YWRhdGEKLXN0YXR1c190IFByb0NhbWVyYTJDbGllbnQ6OmNyZWF0ZURlZmF1bHRSZXF1ZXN0KGludCB0ZW1wbGF0ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGEqKiByZXF1ZXN0KQotewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQUxPR1YoIiVzICh0ZW1wbGF0ZUlkID0gMHgleCkiLCBfX0ZVTkNUSU9OX18sIHRlbXBsYXRlSWQpOwotCi0gICAgaWYgKHJlcXVlc3QpIHsKLSAgICAgICAgKnJlcXVlc3QgPSBOVUxMOwotICAgIH0KLQotICAgIHN0YXR1c190IHJlczsKLSAgICBpZiAoIChyZXMgPSBjaGVja1BpZChfX0ZVTkNUSU9OX18pICkgIT0gT0spIHJldHVybiByZXM7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7Ci0KLSAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHJldHVybiBERUFEX09CSkVDVDsKLQotICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhOwotICAgIGlmICggKHJlcyA9IG1EZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KHRlbXBsYXRlSWQsICZtZXRhZGF0YSkgKSA9PSBPSykgewotICAgICAgICAqcmVxdWVzdCA9IG1ldGFkYXRhLnJlbGVhc2UoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi1zdGF0dXNfdCBQcm9DYW1lcmEyQ2xpZW50OjpnZXRDYW1lcmFJbmZvKGludCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGEqKiBpbmZvKQotewotICAgIGlmIChjYW1lcmFJZCAhPSBtQ2FtZXJhSWQpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKLQotICAgIGlmICghbURldmljZS5nZXQoKSkgcmV0dXJuIERFQURfT0JKRUNUOwotCi0gICAgQ2FtZXJhTWV0YWRhdGEgZGV2aWNlSW5mbyA9IG1EZXZpY2UtPmluZm8oKTsKLSAgICAqaW5mbyA9IGRldmljZUluZm8ucmVsZWFzZSgpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcm9DYW1lcmEyQ2xpZW50OjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgewotICAgIHJldHVybiBCYXNpY0NsaWVudDo6ZHVtcChmZCwgYXJncyk7Ci19Ci0KLXN0YXR1c190IFByb0NhbWVyYTJDbGllbnQ6OmR1bXBDbGllbnQoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiUHJvQ2FtZXJhMkNsaWVudFslZF0gKCVwKSBQSUQ6ICVkLCBkdW1wOlxuIiwKLSAgICAgICAgICAgIG1DYW1lcmFJZCwKLSAgICAgICAgICAgIChnZXRSZW1vdGVDYWxsYmFjaygpICE9IE5VTEwgPwotICAgICAgICAgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihnZXRSZW1vdGVDYWxsYmFjaygpKS5nZXQoKSA6IE5VTEwpLAotICAgICAgICAgICAgbUNsaWVudFBpZCk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICBTdGF0ZTpcbiIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotCi0gICAgLy8gVE9ETzogcHJpbnQgZHluYW1pYy9yZXF1ZXN0IHNlY3Rpb24gZnJvbSBtb3N0IHJlY2VudCByZXF1ZXN0cwotICAgIG1GcmFtZVByb2Nlc3Nvci0+ZHVtcChmZCwgYXJncyk7Ci0gICAgcmV0dXJuIGR1bXBEZXZpY2UoZmQsIGFyZ3MpOwotfQotCi0vLyBJUHJvQ2FtZXJhVXNlciBpbnRlcmZhY2UKLQotdm9pZCBQcm9DYW1lcmEyQ2xpZW50OjpkZXRhY2hEZXZpY2UoKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuOwotCi0gICAgQUxPR1YoIkNhbWVyYSAlZDogU3RvcHBpbmcgcHJvY2Vzc29ycyIsIG1DYW1lcmFJZCk7Ci0KLSAgICBtRnJhbWVQcm9jZXNzb3ItPnJlbW92ZUxpc3RlbmVyKEZSQU1FX1BST0NFU1NPUl9MSVNURU5FUl9NSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9QUk9DRVNTT1JfTElTVEVORVJfTUFYX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypsaXN0ZW5lciovdGhpcyk7Ci0gICAgbUZyYW1lUHJvY2Vzc29yLT5yZXF1ZXN0RXhpdCgpOwotICAgIEFMT0dWKCJDYW1lcmEgJWQ6IFdhaXRpbmcgZm9yIHRocmVhZHMiLCBtQ2FtZXJhSWQpOwotICAgIG1GcmFtZVByb2Nlc3Nvci0+am9pbigpOwotICAgIEFMT0dWKCJDYW1lcmEgJWQ6IERpc2Nvbm5lY3RpbmcgZGV2aWNlIiwgbUNhbWVyYUlkKTsKLQotICAgIC8vIFdPUktBUk9VTkQ6IEhBTCByZWZ1c2VzIHRvIGRpc2Nvbm5lY3Qgd2hpbGUgdGhlcmUncyBzdHJlYW1zIGluIGZsaWdodAotICAgIHsKLSAgICAgICAgbURldmljZS0+Y2xlYXJTdHJlYW1pbmdSZXF1ZXN0KCk7Ci0KLSAgICAgICAgc3RhdHVzX3QgY29kZTsKLSAgICAgICAgaWYgKChjb2RlID0gbURldmljZS0+d2FpdFVudGlsRHJhaW5lZCgpKSAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiB3YWl0VW50aWxEcmFpbmVkIGZhaWxlZCB3aXRoIGNvZGUgMHgleCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgIGNvZGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQ2FtZXJhMkNsaWVudEJhc2U6OmRldGFjaERldmljZSgpOwotfQotCi12b2lkIFByb0NhbWVyYTJDbGllbnQ6Om9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQmIHJlc3VsdCkgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKLSAgICBTaGFyZWRDYW1lcmFDYWxsYmFja3M6OkxvY2sgbChtU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzKTsKLQotICAgIGlmIChtUmVtb3RlQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICBDYW1lcmFNZXRhZGF0YSB0bXAocmVzdWx0Lm1NZXRhZGF0YSk7Ci0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV90KiBtZXRhID0gdG1wLnJlbGVhc2UoKTsKLSAgICAgICAgQUxPR1YoIiVzOiBtZXRhID0gJXAgIiwgX19GVU5DVElPTl9fLCBtZXRhKTsKLSAgICAgICAgbVJlbW90ZUNhbGxiYWNrLT5vblJlc3VsdFJlY2VpdmVkKHJlc3VsdC5tUmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgbWV0YSk7Ci0gICAgICAgIHRtcC5hY3F1aXJlKG1ldGEpOwotICAgIH0KLX0KLQotYm9vbCBQcm9DYW1lcmEyQ2xpZW50OjplbmZvcmNlUmVxdWVzdFBlcm1pc3Npb25zKENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSkgewotCi0gICAgY29uc3QgaW50IHBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLSAgICBjb25zdCBpbnQgc2VsZlBpZCA9IGdldHBpZCgpOwotICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5OwotCi0gICAgLyoqCi0gICAgICogTWl4aW4gZGVmYXVsdCBpbXBvcnRhbnQgc2VjdXJpdHkgdmFsdWVzCi0gICAgICogLSBhbmRyb2lkLmxlZC50cmFuc21pdCA9IGRlZmF1bHRlZCBPTgotICAgICAqLwotICAgIENhbWVyYU1ldGFkYXRhIHN0YXRpY0luZm8gPSBtRGV2aWNlLT5pbmZvKCk7Ci0gICAgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9MRURfQVZBSUxBQkxFX0xFRFMpOwotICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgKytpKSB7Ci0gICAgICAgIHVpbnQ4X3QgbGVkID0gZW50cnkuZGF0YS51OFtpXTsKLQotICAgICAgICBzd2l0Y2gobGVkKSB7Ci0gICAgICAgICAgICBjYXNlIEFORFJPSURfTEVEX0FWQUlMQUJMRV9MRURTX1RSQU5TTUlUOiB7Ci0gICAgICAgICAgICAgICAgdWludDhfdCB0cmFuc21pdERlZmF1bHQgPSBBTkRST0lEX0xFRF9UUkFOU01JVF9PTjsKLSAgICAgICAgICAgICAgICBpZiAoIW1ldGFkYXRhLmV4aXN0cyhBTkRST0lEX0xFRF9UUkFOU01JVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEudXBkYXRlKEFORFJPSURfTEVEX1RSQU5TTUlULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zbWl0RGVmYXVsdCwgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gV2UgY2FuIGRvIGFueXRoaW5nIQotICAgIGlmIChwaWQgPT0gc2VsZlBpZCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJtaXNzaW9uIGNoZWNrIHNwZWNpYWwgZmllbGRzIGluIHRoZSByZXF1ZXN0Ci0gICAgICogLSBhbmRyb2lkLmxlZC50cmFuc21pdCA9IGFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkFfRElTQUJMRV9UUkFOU01JVAotICAgICAqLwotICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0xFRF9UUkFOU01JVCk7Ci0gICAgaWYgKGVudHJ5LmNvdW50ID4gMCAmJiBlbnRyeS5kYXRhLnU4WzBdICE9IEFORFJPSURfTEVEX1RSQU5TTUlUX09OKSB7Ci0gICAgICAgIFN0cmluZzE2IHBlcm1pc3Npb25TdHJpbmcgPQotICAgICAgICAgICAgU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkFfRElTQUJMRV9UUkFOU01JVF9MRUQiKTsKLSAgICAgICAgaWYgKCFjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHBlcm1pc3Npb25TdHJpbmcpKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgdWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgICAgICAgICAgQUxPR0UoIlBlcm1pc3Npb24gRGVuaWFsOiAiCi0gICAgICAgICAgICAgICAgICAiY2FuJ3QgZGlzYWJsZSB0cmFuc21pdCBMRUQgcGlkPSVkLCB1aWQ9JWQiLCBwaWQsIHVpZCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpX3Byby9Qcm9DYW1lcmEyQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJkODY5ZC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX1BST0NBTUVSQTJDTElFTlRfSAotI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX1BST0NBTUVSQTJDTElFTlRfSAotCi0jaW5jbHVkZSAiQ2FtZXJhU2VydmljZS5oIgotI2luY2x1ZGUgImNvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuaCIKLSNpbmNsdWRlICJjb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaCIKLSNpbmNsdWRlICJkZXZpY2UyL0NhbWVyYTJEZXZpY2UuaCIKLSNpbmNsdWRlICJjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIElNZW1vcnk7Ci0vKioKLSAqIEltcGxlbWVudHMgdGhlIGJpbmRlciBJUHJvQ2FtZXJhVXNlciBBUEksCi0gKiBtZWFudCBmb3IgSEFMMi1sZXZlbCBwcml2YXRlIEFQSSBhY2Nlc3MuCi0gKi8KLWNsYXNzIFByb0NhbWVyYTJDbGllbnQgOgotICAgICAgICBwdWJsaWMgQ2FtZXJhMkNsaWVudEJhc2U8Q2FtZXJhU2VydmljZTo6UHJvQ2xpZW50PiwKLSAgICAgICAgcHVibGljIGNhbWVyYTI6OkZyYW1lUHJvY2Vzc29yQmFzZTo6RmlsdGVyZWRMaXN0ZW5lcgotewotcHVibGljOgotICAgIC8qKgotICAgICAqIElQcm9DYW1lcmFVc2VyIGludGVyZmFjZSAoc2VlIElQcm9DYW1lcmFVc2VyIGZvciBkZXRhaWxzKQotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBleGNsdXNpdmVUcnlMb2NrKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGV4Y2x1c2l2ZUxvY2soKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZXhjbHVzaXZlVW5sb2NrKCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgaGFzRXhjbHVzaXZlTG9jaygpOwotCi0gICAgLy8gTm90ZSB0aGF0IHRoZSBjYWxsZWUgZ2V0cyBhIGNvcHkgb2YgdGhlIG1ldGFkYXRhLgotICAgIHZpcnR1YWwgaW50ICAgICAgICAgICBzdWJtaXRSZXF1ZXN0KGNhbWVyYV9tZXRhZGF0YV90KiBtZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZyA9IGZhbHNlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgY2FuY2VsUmVxdWVzdChpbnQgcmVxdWVzdElkKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBkZWxldGVTdHJlYW0oaW50IHN0cmVhbUlkKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBjcmVhdGVTdHJlYW0oCi0gICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBidWZmZXJQcm9kdWNlciwKLSAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgIGludCogc3RyZWFtSWQpOwotCi0gICAgLy8gQ3JlYXRlIGEgcmVxdWVzdCBvYmplY3QgZnJvbSBhIHRlbXBsYXRlLgotICAgIC8vIC0tIENhbGxlciBvd25zIHRoZSBuZXdseSBhbGxvY2F0ZWQgbWV0YWRhdGEKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgY3JlYXRlRGVmYXVsdFJlcXVlc3QoaW50IHRlbXBsYXRlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhKiogcmVxdWVzdCk7Ci0KLSAgICAvLyBHZXQgdGhlIHN0YXRpYyBtZXRhZGF0YSBmb3IgdGhlIGNhbWVyYQotICAgIC8vIC0tIENhbGxlciBvd25zIHRoZSBuZXdseSBhbGxvY2F0ZWQgbWV0YWRhdGEKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZ2V0Q2FtZXJhSW5mbyhpbnQgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YSoqIGluZm8pOwotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlIHVzZWQgYnkgQ2FtZXJhU2VydmljZQotICAgICAqLwotCi0gICAgUHJvQ2FtZXJhMkNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKLSAgICAgICAgICAgIGNvbnN0IHNwPElQcm9DYW1lcmFDYWxsYmFja3M+JiByZW1vdGVDYWxsYmFjaywKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGludCBjYW1lcmFJZCwKLSAgICAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCi0gICAgICAgICAgICBpbnQgY2xpZW50UGlkLAotICAgICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAotICAgICAgICAgICAgaW50IHNlcnZpY2VQaWQpOwotICAgIHZpcnR1YWwgflByb0NhbWVyYTJDbGllbnQoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBpbml0aWFsaXplKGNhbWVyYV9tb2R1bGVfdCAqbW9kdWxlKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZHVtcENsaWVudChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotCi0gICAgLy8gQ2FsbGJhY2tzIGZyb20gY2FtZXJhIHNlcnZpY2UKLSAgICB2aXJ0dWFsIHZvaWQgb25FeGNsdXNpdmVMb2NrU3RvbGVuKCk7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2UgdXNlZCBieSBpbmRlcGVuZGVudCBjb21wb25lbnRzIG9mIFByb0NhbWVyYTJDbGllbnQuCi0gICAgICovCi0KLXByb3RlY3RlZDoKLSAgICAvKiogRmlsdGVyZWRMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKi8KLSAgICB2aXJ0dWFsIHZvaWQgb25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCYgcmVzdWx0KTsKLQotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBkZXRhY2hEZXZpY2UoKTsKLQotcHJpdmF0ZToKLSAgICAvKiogSVByb0NhbWVyYVVzZXIgaW50ZXJmYWNlLXJlbGF0ZWQgcHJpdmF0ZSBtZW1iZXJzICovCi0KLSAgICAvKiogUHJldmlldyBjYWxsYmFjayByZWxhdGVkIG1lbWJlcnMgKi8KLSAgICBzcDxjYW1lcmEyOjpGcmFtZVByb2Nlc3NvckJhc2U+IG1GcmFtZVByb2Nlc3NvcjsKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBGUkFNRV9QUk9DRVNTT1JfTElTVEVORVJfTUlOX0lEID0gMDsKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBGUkFNRV9QUk9DRVNTT1JfTElTVEVORVJfTUFYX0lEID0gMHg3ZmZmZmZmZkw7Ci0KLSAgICAvKiogVXRpbGl0eSBtZW1iZXJzICovCi0gICAgYm9vbCBlbmZvcmNlUmVxdWVzdFBlcm1pc3Npb25zKENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSk7Ci0KLSAgICAvLyBXaGV0aGVyIG9yIG5vdCB3ZSBoYXZlIGFuIGV4Y2x1c2l2ZSBsb2NrIG9uIHRoZSBkZXZpY2UKLSAgICAvLyAtIGlmIG5vIHdlIGNhbid0IG1vZGlmeSB0aGUgcmVxdWVzdCBxdWV1ZS4KLSAgICAvLyBub3RlIHRoYXQgY3JlYXRpbmcvZGVsZXRpbmcgc3RyZWFtcyB3ZSBvd24gaXMgc3RpbGwgT0sKLSAgICBib29sIG1FeGNsdXNpdmVMb2NrOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcAppbmRleCAyNGFjZmJmLi5mZGI4MDFlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKQEAgLTc4LDcgKzc4LDcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgotc3RhdHVzX3QgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+Ojppbml0aWFsaXplKGNhbWVyYV9tb2R1bGVfdCAqbW9kdWxlKSB7CitzdGF0dXNfdCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46OmluaXRpYWxpemUoQ2FtZXJhTW9kdWxlICptb2R1bGUpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogSW5pdGlhbGl6aW5nIGNsaWVudCBmb3IgY2FtZXJhICVkIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgIFRDbGllbnRCYXNlOjptQ2FtZXJhSWQpOwpAQCAtMjgwLDYgKzI4MCwxNCBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+Cit2b2lkIENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6bm90aWZ5UHJlcGFyZWQoaW50IHN0cmVhbUlkKSB7CisgICAgKHZvaWQpc3RyZWFtSWQ7CisKKyAgICBBTE9HVigiJXM6IFN0cmVhbSAlZCBub3cgcHJlcGFyZWQiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KIGludCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46OmdldENhbWVyYUlkKCkgY29uc3QgewogICAgIHJldHVybiBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkOwogfQpAQCAtMzM3LDcgKzM0NSw2IEBACiAgICAgbVJlbW90ZUNhbGxiYWNrLmNsZWFyKCk7CiB9CiAKLXRlbXBsYXRlIGNsYXNzIENhbWVyYTJDbGllbnRCYXNlPENhbWVyYVNlcnZpY2U6OlByb0NsaWVudD47CiB0ZW1wbGF0ZSBjbGFzcyBDYW1lcmEyQ2xpZW50QmFzZTxDYW1lcmFTZXJ2aWNlOjpDbGllbnQ+OwogdGVtcGxhdGUgY2xhc3MgQ2FtZXJhMkNsaWVudEJhc2U8Q2FtZXJhRGV2aWNlQ2xpZW50QmFzZT47CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgKaW5kZXggNzdhZTRmYy4uZDY2ZTExYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEyQ0xJRU5UX0JBU0VfSAogCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhTW9kdWxlLmgiCiAjaW5jbHVkZSAiY2FtZXJhL0NhcHR1cmVSZXN1bHQuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMzUsNyArMzYsNyBAQAogICAgIHR5cGVkZWYgdHlwZW5hbWUgVENsaWVudEJhc2U6OlRDYW1DYWxsYmFja3MgVENhbUNhbGxiYWNrczsKIAogICAgIC8qKgotICAgICAqIEJhc2UgYmluZGVyIGludGVyZmFjZSAoc2VlIElDYW1lcmEvSVByb0NhbWVyYVVzZXIgZm9yIGRldGFpbHMpCisgICAgICogQmFzZSBiaW5kZXIgaW50ZXJmYWNlIChzZWUgSUNhbWVyYS9JQ2FtZXJhRGV2aWNlVXNlciBmb3IgZGV0YWlscykKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgY29ubmVjdChjb25zdCBzcDxUQ2FtQ2FsbGJhY2tzPiYgY2FsbGJhY2tzKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgZGlzY29ubmVjdCgpOwpAQCAtNTUsNyArNTYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkKTsKICAgICB2aXJ0dWFsIH5DYW1lcmEyQ2xpZW50QmFzZSgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGluaXRpYWxpemUoY2FtZXJhX21vZHVsZV90ICptb2R1bGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBpbml0aWFsaXplKENhbWVyYU1vZHVsZSAqbW9kdWxlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZHVtcENsaWVudChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCiAgICAgLyoqCkBAIC03MSw3ICs3Miw3IEBACiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUF1dG9FeHBvc3VyZSh1aW50OF90IG5ld1N0YXRlLCBpbnQgdHJpZ2dlcklkKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgbm90aWZ5QXV0b1doaXRlYmFsYW5jZSh1aW50OF90IG5ld1N0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmlnZ2VySWQpOwotCisgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeVByZXBhcmVkKGludCBzdHJlYW1JZCk7CiAKICAgICBpbnQgICAgICAgICAgICAgICAgICAgZ2V0Q2FtZXJhSWQoKSBjb25zdDsKICAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oCmluZGV4IGQyNmUyMGMuLmNkMjU5NDkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYURldmljZUJhc2UuaApAQCAtMjksNiArMjksOCBAQAogI2luY2x1ZGUgImhhcmR3YXJlL2NhbWVyYTMuaCIKICNpbmNsdWRlICJjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaCIKICNpbmNsdWRlICJjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oIgorI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFNb2R1bGUuaCIKKyNpbmNsdWRlICJndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQ1LDcgKzQ3LDcgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIGludCAgICAgIGdldElkKCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKGNhbWVyYV9tb2R1bGVfdCAqbW9kdWxlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKENhbWVyYU1vZHVsZSAqbW9kdWxlKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0KCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgPSAwOwpAQCAtOTksMTcgKzEwMSwyMiBAQAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lb3V0KSA9IDA7CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gb3V0cHV0IHN0cmVhbSBvZiB0aGUgcmVxdWVzdGVkIHNpemUgYW5kIGZvcm1hdC4KKyAgICAgKiBDcmVhdGUgYW4gb3V0cHV0IHN0cmVhbSBvZiB0aGUgcmVxdWVzdGVkIHNpemUsIGZvcm1hdCwgcm90YXRpb24gYW5kIGRhdGFzcGFjZQogICAgICAqCi0gICAgICogSWYgZm9ybWF0IGlzIENBTUVSQTJfSEFMX1BJWEVMX0ZPUk1BVF9PUEFRVUUsIHRoZW4gdGhlIEhBTCBkZXZpY2Ugc2VsZWN0cwotICAgICAqIGFuIGFwcHJvcHJpYXRlIGZvcm1hdDsgaXQgY2FuIGJlIHF1ZXJpZWQgd2l0aCBnZXRTdHJlYW1JbmZvLgotICAgICAqCi0gICAgICogSWYgZm9ybWF0IGlzIEhBTF9QSVhFTF9GT1JNQVRfQ09NUFJFU1NFRCwgdGhlIHNpemUgcGFyYW1ldGVyIG11c3QgYmUKLSAgICAgKiBlcXVhbCB0byB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgYnVmZmVycyB0byBhbGxvY2F0ZSBmb3IgdGhlIHN0cmVhbS4gRm9yCi0gICAgICogb3RoZXIgZm9ybWF0cywgdGhlIHNpemUgcGFyYW1ldGVyIGlzIGlnbm9yZWQuCisgICAgICogRm9yIEhBTF9QSVhFTF9GT1JNQVRfQkxPQiBmb3JtYXRzLCB0aGUgd2lkdGggYW5kIGhlaWdodCBzaG91bGQgYmUgdGhlCisgICAgICogbG9naWNhbCBkaW1lbnNpb25zIG9mIHRoZSBidWZmZXIsIG5vdCB0aGUgbnVtYmVyIG9mIGJ5dGVzLgogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlU3RyZWFtKHNwPEFOYXRpdmVXaW5kb3c+IGNvbnN1bWVyLAotICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwgaW50ICppZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlU3RyZWFtKHNwPFN1cmZhY2U+IGNvbnN1bWVyLAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKKyAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCkgPSAwOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGlucHV0IHN0cmVhbSBvZiB3aWR0aCwgaGVpZ2h0LCBhbmQgZm9ybWF0LgorICAgICAqCisgICAgICogUmV0dXJuIHZhbHVlIGlzIHRoZSBzdHJlYW0gSUQgaWYgbm9uLW5lZ2F0aXZlIGFuZCBhbiBlcnJvciBpZiBuZWdhdGl2ZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUlucHV0U3RyZWFtKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICBpbnQzMl90IGZvcm1hdCwgLypvdXQqLyBpbnQzMl90ICppZCkgPSAwOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGFuIGlucHV0IHJlcHJvY2VzcyBzdHJlYW0gdGhhdCB1c2VzIGJ1ZmZlcnMgZnJvbSBhbiBleGlzdGluZwpAQCAtMTIxLDcgKzEyOCw4IEBACiAgICAgICogR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgZ2l2ZW4gc3RyZWFtLgogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3RyZWFtSW5mbyhpbnQgaWQsCi0gICAgICAgICAgICB1aW50MzJfdCAqd2lkdGgsIHVpbnQzMl90ICpoZWlnaHQsIHVpbnQzMl90ICpmb3JtYXQpID0gMDsKKyAgICAgICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90ICpmb3JtYXQsIGFuZHJvaWRfZGF0YXNwYWNlICpkYXRhU3BhY2UpID0gMDsKIAogICAgIC8qKgogICAgICAqIFNldCBzdHJlYW0gZ3JhbGxvYyBidWZmZXIgdHJhbnNmb3JtCkBAIC0xNTAsNyArMTU4LDExIEBACiAgICAgICogLSBCQURfVkFMVUUgaWYgdGhlIHNldCBvZiBzdHJlYW1zIHdhcyBpbnZhbGlkIChlLmcuIGZtdHMgb3Igc2l6ZXMpCiAgICAgICogLSBJTlZBTElEX09QRVJBVElPTiBpZiB0aGUgZGV2aWNlIHdhcyBpbiB0aGUgd3Jvbmcgc3RhdGUKICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXMoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zKGJvb2wgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCA9IGZhbHNlKSA9IDA7CisKKyAgICAvLyBnZXQgdGhlIGJ1ZmZlciBwcm9kdWNlciBvZiB0aGUgaW5wdXQgc3RyZWFtCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclByb2R1Y2VyKAorICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKnByb2R1Y2VyKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYSBtZXRhZGF0YSBidWZmZXIgd2l0aCBmaWVsZHMgdGhhdCB0aGUgSEFMIGRldmljZSBiZWxpZXZlcyBhcmUKQEAgLTE4OCw2ICsyMDAsNyBAQAogICAgICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5SWRsZSgpID0gMDsKICAgICAgICAgdmlydHVhbCB2b2lkIG5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmcmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBub3RpZnlQcmVwYXJlZChpbnQgc3RyZWFtSWQpID0gMDsKIAogICAgICAgICAvLyBSZXF1aXJlZCBvbmx5IGZvciBBUEkxCiAgICAgICAgIHZpcnR1YWwgdm9pZCBub3RpZnlBdXRvRm9jdXModWludDhfdCBuZXdTdGF0ZSwgaW50IHRyaWdnZXJJZCkgPSAwOwpAQCAtMjcwLDYgKzI4MywxNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCkgPSAwOwogCiAgICAgLyoqCisgICAgICogUHJlcGFyZSBzdHJlYW0gYnkgcHJlYWxsb2NhdGluZyBidWZmZXJzIGZvciBpdCBhc3luY2hyb25vdXNseS4KKyAgICAgKiBDYWxscyBub3RpZnlQcmVwYXJlZCgpIG9uY2UgYWxsb2NhdGlvbiBpcyBjb21wbGV0ZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmUoaW50IHN0cmVhbUlkKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBGcmVlIHN0cmVhbSByZXNvdXJjZXMgYnkgZHVtcGluZyBpdHMgdW51c2VkIGdyYWxsb2MgYnVmZmVycy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHRlYXJEb3duKGludCBzdHJlYW1JZCkgPSAwOworCisgICAgLyoqCiAgICAgICogR2V0IHRoZSBIQUwgZGV2aWNlIHZlcnNpb24uCiAgICAgICovCiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXREZXZpY2VWZXJzaW9uKCkgPSAwOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYU1vZHVsZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhTW9kdWxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTRkZmUwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYU1vZHVsZS5jcHAKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYU1vZHVsZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIkNhbWVyYU1vZHVsZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3ZvaWQgQ2FtZXJhTW9kdWxlOjpkZXJpdmVDYW1lcmFDaGFyYWN0ZXJpc3RpY3NLZXlzKAorICAgICAgICB1aW50MzJfdCBkZXZpY2VWZXJzaW9uLCBDYW1lcmFNZXRhZGF0YSAmY2hhcnMpIHsKKyAgICAvLyBIQUwxIGRldmljZXMgc2hvdWxkIG5vdCByZWFjaCBoZXJlCisgICAgaWYgKGRldmljZVZlcnNpb24gPCBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMCkgeworICAgICAgICBBTE9HVigiJXM6IENhbm5vdCBkZXJpdmUga2V5cyBmb3IgSEFMIHZlcnNpb24gPCAyLjAiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEtleXMgYWRkZWQgaW4gSEFMMy4zCisgICAgaWYgKGRldmljZVZlcnNpb24gPCBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMykgeworICAgICAgICBjb25zdCBzaXplX3QgTlVNX0RFUklWRURfS0VZU19IQUwzXzMgPSA1OworICAgICAgICBWZWN0b3I8dWludDhfdD4gY29udHJvbE1vZGVzOworICAgICAgICB1aW50OF90IGRhdGEgPSBBTkRST0lEX0NPTlRST0xfQUVfTE9DS19BVkFJTEFCTEVfVFJVRTsKKyAgICAgICAgY2hhcnMudXBkYXRlKEFORFJPSURfQ09OVFJPTF9BRV9MT0NLX0FWQUlMQUJMRSwgJmRhdGEsIC8qY291bnQqLzEpOworICAgICAgICBkYXRhID0gQU5EUk9JRF9DT05UUk9MX0FXQl9MT0NLX0FWQUlMQUJMRV9UUlVFOworICAgICAgICBjaGFycy51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FXQl9MT0NLX0FWQUlMQUJMRSwgJmRhdGEsIC8qY291bnQqLzEpOworICAgICAgICBjb250cm9sTW9kZXMucHVzaChBTkRST0lEX0NPTlRST0xfTU9ERV9BVVRPKTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGVudHJ5ID0gY2hhcnMuZmluZChBTkRST0lEX0NPTlRST0xfQVZBSUxBQkxFX1NDRU5FX01PREVTKTsKKyAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMSB8fCBlbnRyeS5kYXRhLnU4WzBdICE9IEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0RJU0FCTEVEKSB7CisgICAgICAgICAgICBjb250cm9sTW9kZXMucHVzaChBTkRST0lEX0NPTlRST0xfTU9ERV9VU0VfU0NFTkVfTU9ERSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBPbmx5IGFkdmVydGlzZSBDT05UUk9MX09GRiBtb2RlIGlmIDNBIG1hbnVhbCBjb250cm9scyBhcmUgc3VwcG9ydGVkLgorICAgICAgICBib29sIGlzTWFudWFsQWVTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgYm9vbCBpc01hbnVhbEFmU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgIGJvb2wgaXNNYW51YWxBd2JTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgZW50cnkgPSBjaGFycy5maW5kKEFORFJPSURfQ09OVFJPTF9BRV9BVkFJTEFCTEVfTU9ERVMpOworICAgICAgICBpZiAoZW50cnkuY291bnQgPiAwKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkuZGF0YS51OFtpXSA9PSBBTkRST0lEX0NPTlRST0xfQUVfTU9ERV9PRkYpIHsKKyAgICAgICAgICAgICAgICAgICAgaXNNYW51YWxBZVN1cHBvcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbnRyeSA9IGNoYXJzLmZpbmQoQU5EUk9JRF9DT05UUk9MX0FGX0FWQUlMQUJMRV9NT0RFUyk7CisgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChlbnRyeS5kYXRhLnU4W2ldID09IEFORFJPSURfQ09OVFJPTF9BRl9NT0RFX09GRikgeworICAgICAgICAgICAgICAgICAgICBpc01hbnVhbEFmU3VwcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVudHJ5ID0gY2hhcnMuZmluZChBTkRST0lEX0NPTlRST0xfQVdCX0FWQUlMQUJMRV9NT0RFUyk7CisgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChlbnRyeS5kYXRhLnU4W2ldID09IEFORFJPSURfQ09OVFJPTF9BV0JfTU9ERV9PRkYpIHsKKyAgICAgICAgICAgICAgICAgICAgaXNNYW51YWxBd2JTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzTWFudWFsQWVTdXBwb3J0ZWQgJiYgaXNNYW51YWxBZlN1cHBvcnRlZCAmJiBpc01hbnVhbEF3YlN1cHBvcnRlZCkgeworICAgICAgICAgICAgY29udHJvbE1vZGVzLnB1c2goQU5EUk9JRF9DT05UUk9MX01PREVfT0ZGKTsKKyAgICAgICAgfQorCisgICAgICAgIGNoYXJzLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQVZBSUxBQkxFX01PREVTLCBjb250cm9sTW9kZXMpOworCisgICAgICAgIGVudHJ5ID0gY2hhcnMuZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX1JFUVVFU1RfS0VZUyk7CisgICAgICAgIC8vIEhBTDMuMiBkZXZpY2VzIHBhc3NpbmcgZXhpc3RpbmcgQ1RTIHRlc3Qgc2hvdWxkIGFsbCBzdXBwb3J0IGFsbCBMU0MgbW9kZXMgYW5kIExTQyBtYXAKKyAgICAgICAgYm9vbCBsZW5zU2hhZGluZ01vZGVTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmRhdGEuaTMyW2ldID09IEFORFJPSURfU0hBRElOR19NT0RFKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbnNTaGFkaW5nTW9kZVN1cHBvcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBWZWN0b3I8dWludDhfdD4gbHNjTW9kZXM7CisgICAgICAgIFZlY3Rvcjx1aW50OF90PiBsc2NNYXBNb2RlczsKKyAgICAgICAgbHNjTW9kZXMucHVzaChBTkRST0lEX1NIQURJTkdfTU9ERV9GQVNUKTsKKyAgICAgICAgbHNjTW9kZXMucHVzaChBTkRST0lEX1NIQURJTkdfTU9ERV9ISUdIX1FVQUxJVFkpOworICAgICAgICBsc2NNYXBNb2Rlcy5wdXNoKEFORFJPSURfU1RBVElTVElDU19MRU5TX1NIQURJTkdfTUFQX01PREVfT0ZGKTsKKyAgICAgICAgaWYgKGxlbnNTaGFkaW5nTW9kZVN1cHBvcnRlZCkgeworICAgICAgICAgICAgbHNjTW9kZXMucHVzaChBTkRST0lEX1NIQURJTkdfTU9ERV9PRkYpOworICAgICAgICAgICAgbHNjTWFwTW9kZXMucHVzaChBTkRST0lEX1NUQVRJU1RJQ1NfTEVOU19TSEFESU5HX01BUF9NT0RFX09OKTsKKyAgICAgICAgfQorICAgICAgICBjaGFycy51cGRhdGUoQU5EUk9JRF9TSEFESU5HX0FWQUlMQUJMRV9NT0RFUywgbHNjTW9kZXMpOworICAgICAgICBjaGFycy51cGRhdGUoQU5EUk9JRF9TVEFUSVNUSUNTX0lORk9fQVZBSUxBQkxFX0xFTlNfU0hBRElOR19NQVBfTU9ERVMsIGxzY01hcE1vZGVzKTsKKworICAgICAgICBlbnRyeSA9IGNoYXJzLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUyk7CisgICAgICAgIFZlY3RvcjxpbnQzMl90PiBhdmFpbGFibGVDaGFyc0tleXM7CisgICAgICAgIGF2YWlsYWJsZUNoYXJzS2V5cy5zZXRDYXBhY2l0eShlbnRyeS5jb3VudCArIE5VTV9ERVJJVkVEX0tFWVNfSEFMM18zKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBhdmFpbGFibGVDaGFyc0tleXMucHVzaChlbnRyeS5kYXRhLmkzMltpXSk7CisgICAgICAgIH0KKyAgICAgICAgYXZhaWxhYmxlQ2hhcnNLZXlzLnB1c2goQU5EUk9JRF9DT05UUk9MX0FFX0xPQ0tfQVZBSUxBQkxFKTsKKyAgICAgICAgYXZhaWxhYmxlQ2hhcnNLZXlzLnB1c2goQU5EUk9JRF9DT05UUk9MX0FXQl9MT0NLX0FWQUlMQUJMRSk7CisgICAgICAgIGF2YWlsYWJsZUNoYXJzS2V5cy5wdXNoKEFORFJPSURfQ09OVFJPTF9BVkFJTEFCTEVfTU9ERVMpOworICAgICAgICBhdmFpbGFibGVDaGFyc0tleXMucHVzaChBTkRST0lEX1NIQURJTkdfQVZBSUxBQkxFX01PREVTKTsKKyAgICAgICAgYXZhaWxhYmxlQ2hhcnNLZXlzLnB1c2goQU5EUk9JRF9TVEFUSVNUSUNTX0lORk9fQVZBSUxBQkxFX0xFTlNfU0hBRElOR19NQVBfTU9ERVMpOworICAgICAgICBjaGFycy51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUywgYXZhaWxhYmxlQ2hhcnNLZXlzKTsKKworICAgICAgICAvLyBOZWVkIHVwZGF0ZSBhbmRyb2lkLmNvbnRyb2wuYXZhaWxhYmxlSGlnaFNwZWVkVmlkZW9Db25maWd1cmF0aW9ucyBzaW5jZSBIQUwzLjMKKyAgICAgICAgLy8gYWRkcyBiYXRjaCBzaXplIHRvIHRoaXMgYXJyYXkuCisgICAgICAgIGVudHJ5ID0gY2hhcnMuZmluZChBTkRST0lEX0NPTlRST0xfQVZBSUxBQkxFX0hJR0hfU1BFRURfVklERU9fQ09ORklHVVJBVElPTlMpOworICAgICAgICBpZiAoZW50cnkuY291bnQgPiAwKSB7CisgICAgICAgICAgICBWZWN0b3I8aW50MzJfdD4gaGlnaFNwZWVkQ29uZmlnOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgaSArPSA0KSB7CisgICAgICAgICAgICAgICAgaGlnaFNwZWVkQ29uZmlnLmFkZChlbnRyeS5kYXRhLmkzMltpXSk7IC8vIHdpZHRoCisgICAgICAgICAgICAgICAgaGlnaFNwZWVkQ29uZmlnLmFkZChlbnRyeS5kYXRhLmkzMltpICsgMV0pOyAvLyBoZWlnaHQKKyAgICAgICAgICAgICAgICBoaWdoU3BlZWRDb25maWcuYWRkKGVudHJ5LmRhdGEuaTMyW2kgKyAyXSk7IC8vIGZwc19taW4KKyAgICAgICAgICAgICAgICBoaWdoU3BlZWRDb25maWcuYWRkKGVudHJ5LmRhdGEuaTMyW2kgKyAzXSk7IC8vIGZwc19tYXgKKyAgICAgICAgICAgICAgICBoaWdoU3BlZWRDb25maWcuYWRkKDEpOyAvLyBiYXRjaFNpemVfbWF4LiBkZWZhdWx0IHRvIDEgZm9yIEhBTDMuMgorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhcnMudXBkYXRlKEFORFJPSURfQ09OVFJPTF9BVkFJTEFCTEVfSElHSF9TUEVFRF9WSURFT19DT05GSUdVUkFUSU9OUywKKyAgICAgICAgICAgICAgICAgICAgaGlnaFNwZWVkQ29uZmlnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEFsd2F5cyBhZGQgYSBkZWZhdWx0IGZvciB0aGUgcHJlLWNvcnJlY3Rpb24gYWN0aXZlIGFycmF5IGlmIHRoZSB2ZW5kb3IgY2hvb3NlcyB0byBvbWl0IHRoaXMKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgZW50cnkgPSBjaGFycy5maW5kKEFORFJPSURfU0VOU09SX0lORk9fUFJFX0NPUlJFQ1RJT05fQUNUSVZFX0FSUkFZX1NJWkUpOworICAgIGlmIChlbnRyeS5jb3VudCA9PSAwKSB7CisgICAgICAgIFZlY3RvcjxpbnQzMl90PiBwcmVDb3JyZWN0aW9uQXJyYXk7CisgICAgICAgIGVudHJ5ID0gY2hhcnMuZmluZChBTkRST0lEX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFKTsKKyAgICAgICAgcHJlQ29ycmVjdGlvbkFycmF5LmFwcGVuZEFycmF5KGVudHJ5LmRhdGEuaTMyLCBlbnRyeS5jb3VudCk7CisgICAgICAgIGNoYXJzLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9JTkZPX1BSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFLCBwcmVDb3JyZWN0aW9uQXJyYXkpOworICAgIH0KKworICAgIHJldHVybjsKK30KKworQ2FtZXJhTW9kdWxlOjpDYW1lcmFNb2R1bGUoY2FtZXJhX21vZHVsZV90ICptb2R1bGUpIHsKKyAgICBpZiAobW9kdWxlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYW1lcmEgaGFyZHdhcmUgbW9kdWxlIG11c3Qgbm90IGJlIG51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBhc3NlcnQoMCk7CisgICAgfQorCisgICAgbU1vZHVsZSA9IG1vZHVsZTsKKyAgICBtQ2FtZXJhSW5mb01hcC5zZXRDYXBhY2l0eShnZXROdW1iZXJPZkNhbWVyYXMoKSk7Cit9CisKK0NhbWVyYU1vZHVsZTo6fkNhbWVyYU1vZHVsZSgpCit7CisgICAgd2hpbGUgKG1DYW1lcmFJbmZvTWFwLnNpemUoKSA+IDApIHsKKyAgICAgICAgY2FtZXJhX2luZm8gY2FtZXJhSW5mbyA9IG1DYW1lcmFJbmZvTWFwLmVkaXRWYWx1ZUF0KDApOworICAgICAgICBpZiAoY2FtZXJhSW5mby5zdGF0aWNfY2FtZXJhX2NoYXJhY3RlcmlzdGljcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlX2NhbWVyYV9tZXRhZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KGNhbWVyYUluZm8uc3RhdGljX2NhbWVyYV9jaGFyYWN0ZXJpc3RpY3MpKTsKKyAgICAgICAgfQorICAgICAgICBtQ2FtZXJhSW5mb01hcC5yZW1vdmVJdGVtc0F0KDApOworICAgIH0KK30KKworaW50IENhbWVyYU1vZHVsZTo6aW5pdCgpIHsKKyAgICBpZiAoZ2V0TW9kdWxlQXBpVmVyc2lvbigpID49IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl80ICYmCisgICAgICAgICAgICBtTW9kdWxlLT5pbml0ICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIG1Nb2R1bGUtPmluaXQoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitpbnQgQ2FtZXJhTW9kdWxlOjpnZXRDYW1lcmFJbmZvKGludCBjYW1lcmFJZCwgc3RydWN0IGNhbWVyYV9pbmZvICppbmZvKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUNhbWVyYUluZm9Mb2NrKTsKKyAgICBpZiAoY2FtZXJhSWQgPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjYW1lcmEgSUQgJWQiLCBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLy8gT25seSBvdmVycmlkZSBzdGF0aWNfY2FtZXJhX2NoYXJhY3RlcmlzdGljcyBmb3IgQVBJMiBkZXZpY2VzCisgICAgaW50IGFwaVZlcnNpb24gPSBtTW9kdWxlLT5jb21tb24ubW9kdWxlX2FwaV92ZXJzaW9uOworICAgIGlmIChhcGlWZXJzaW9uIDwgQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzApIHsKKyAgICAgICAgcmV0dXJuIG1Nb2R1bGUtPmdldF9jYW1lcmFfaW5mbyhjYW1lcmFJZCwgaW5mbyk7CisgICAgfQorCisgICAgc3NpemVfdCBpbmRleCA9IG1DYW1lcmFJbmZvTWFwLmluZGV4T2ZLZXkoY2FtZXJhSWQpOworICAgIGlmIChpbmRleCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAvLyBHZXQgY2FtZXJhIGluZm8gZnJvbSByYXcgbW9kdWxlIGFuZCBjYWNoZSBpdAorICAgICAgICBjYW1lcmFfaW5mbyByYXdJbmZvLCBjYW1lcmFJbmZvOworICAgICAgICBpbnQgcmV0ID0gbU1vZHVsZS0+Z2V0X2NhbWVyYV9pbmZvKGNhbWVyYUlkLCAmcmF3SW5mbyk7CisgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IHJhd0luZm8uZGV2aWNlX3ZlcnNpb247CisgICAgICAgIGlmIChkZXZpY2VWZXJzaW9uIDwgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzApIHsKKyAgICAgICAgICAgIC8vIHN0YXRpY19jYW1lcmFfY2hhcmFjdGVyaXN0aWNzIGlzIGludmFsaWQKKyAgICAgICAgICAgICppbmZvID0gcmF3SW5mbzsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEgbTsKKyAgICAgICAgbSA9IHJhd0luZm8uc3RhdGljX2NhbWVyYV9jaGFyYWN0ZXJpc3RpY3M7CisgICAgICAgIGRlcml2ZUNhbWVyYUNoYXJhY3RlcmlzdGljc0tleXMocmF3SW5mby5kZXZpY2VfdmVyc2lvbiwgbSk7CisgICAgICAgIGNhbWVyYUluZm8gPSByYXdJbmZvOworICAgICAgICBjYW1lcmFJbmZvLnN0YXRpY19jYW1lcmFfY2hhcmFjdGVyaXN0aWNzID0gbS5yZWxlYXNlKCk7CisgICAgICAgIGluZGV4ID0gbUNhbWVyYUluZm9NYXAuYWRkKGNhbWVyYUlkLCBjYW1lcmFJbmZvKTsKKyAgICB9CisKKyAgICBhc3NlcnQoaW5kZXggIT0gTkFNRV9OT1RfRk9VTkQpOworICAgIC8vIHJldHVybiB0aGUgY2FjaGVkIGNhbWVyYSBpbmZvCisgICAgKmluZm8gPSBtQ2FtZXJhSW5mb01hcFtpbmRleF07CisgICAgcmV0dXJuIE9LOworfQorCitpbnQgQ2FtZXJhTW9kdWxlOjpvcGVuKGNvbnN0IGNoYXIqIGlkLCBzdHJ1Y3QgaHdfZGV2aWNlX3QqKiBkZXZpY2UpIHsKKyAgICByZXR1cm4gZmlsdGVyT3BlbkVycm9yQ29kZShtTW9kdWxlLT5jb21tb24ubWV0aG9kcy0+b3BlbigmbU1vZHVsZS0+Y29tbW9uLCBpZCwgZGV2aWNlKSk7Cit9CisKK2ludCBDYW1lcmFNb2R1bGU6Om9wZW5MZWdhY3koCisgICAgICAgIGNvbnN0IGNoYXIqIGlkLCB1aW50MzJfdCBoYWxWZXJzaW9uLCBzdHJ1Y3QgaHdfZGV2aWNlX3QqKiBkZXZpY2UpIHsKKyAgICByZXR1cm4gbU1vZHVsZS0+b3Blbl9sZWdhY3koJm1Nb2R1bGUtPmNvbW1vbiwgaWQsIGhhbFZlcnNpb24sIGRldmljZSk7Cit9CisKK2ludCBDYW1lcmFNb2R1bGU6OmdldE51bWJlck9mQ2FtZXJhcygpIHsKKyAgICByZXR1cm4gbU1vZHVsZS0+Z2V0X251bWJlcl9vZl9jYW1lcmFzKCk7Cit9CisKK2ludCBDYW1lcmFNb2R1bGU6OnNldENhbGxiYWNrcyhjb25zdCBjYW1lcmFfbW9kdWxlX2NhbGxiYWNrc190ICpjYWxsYmFja3MpIHsKKyAgICByZXR1cm4gbU1vZHVsZS0+c2V0X2NhbGxiYWNrcyhjYWxsYmFja3MpOworfQorCitib29sIENhbWVyYU1vZHVsZTo6aXNWZW5kb3JUYWdEZWZpbmVkKCkgeworICAgIHJldHVybiBtTW9kdWxlLT5nZXRfdmVuZG9yX3RhZ19vcHMgIT0gTlVMTDsKK30KKwordm9pZCBDYW1lcmFNb2R1bGU6OmdldFZlbmRvclRhZ09wcyh2ZW5kb3JfdGFnX29wc190KiBvcHMpIHsKKyAgICBpZiAobU1vZHVsZS0+Z2V0X3ZlbmRvcl90YWdfb3BzKSB7CisgICAgICAgIG1Nb2R1bGUtPmdldF92ZW5kb3JfdGFnX29wcyhvcHMpOworICAgIH0KK30KKworaW50IENhbWVyYU1vZHVsZTo6c2V0VG9yY2hNb2RlKGNvbnN0IGNoYXIqIGNhbWVyYV9pZCwgYm9vbCBlbmFibGUpIHsKKyAgICByZXR1cm4gbU1vZHVsZS0+c2V0X3RvcmNoX21vZGUoY2FtZXJhX2lkLCBlbmFibGUpOworfQorCitzdGF0dXNfdCBDYW1lcmFNb2R1bGU6OmZpbHRlck9wZW5FcnJvckNvZGUoc3RhdHVzX3QgZXJyKSB7CisgICAgc3dpdGNoKGVycikgeworICAgICAgICBjYXNlIE5PX0VSUk9SOgorICAgICAgICBjYXNlIC1FQlVTWToKKyAgICAgICAgY2FzZSAtRUlOVkFMOgorICAgICAgICBjYXNlIC1FVVNFUlM6CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAtRU5PREVWOworfQorCit1aW50MTZfdCBDYW1lcmFNb2R1bGU6OmdldE1vZHVsZUFwaVZlcnNpb24oKSB7CisgICAgcmV0dXJuIG1Nb2R1bGUtPmNvbW1vbi5tb2R1bGVfYXBpX3ZlcnNpb247Cit9CisKK2NvbnN0IGNoYXIqIENhbWVyYU1vZHVsZTo6Z2V0TW9kdWxlTmFtZSgpIHsKKyAgICByZXR1cm4gbU1vZHVsZS0+Y29tbW9uLm5hbWU7Cit9CisKK3VpbnQxNl90IENhbWVyYU1vZHVsZTo6Z2V0SGFsQXBpVmVyc2lvbigpIHsKKyAgICByZXR1cm4gbU1vZHVsZS0+Y29tbW9uLmhhbF9hcGlfdmVyc2lvbjsKK30KKworY29uc3QgY2hhciogQ2FtZXJhTW9kdWxlOjpnZXRNb2R1bGVBdXRob3IoKSB7CisgICAgcmV0dXJuIG1Nb2R1bGUtPmNvbW1vbi5hdXRob3I7Cit9CisKK3ZvaWQqIENhbWVyYU1vZHVsZTo6Z2V0RHNvKCkgeworICAgIHJldHVybiBtTW9kdWxlLT5jb21tb24uZHNvOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYU1vZHVsZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYU1vZHVsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ODIyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhTW9kdWxlLmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFNT0RVTEVfSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQU1PRFVMRV9ICisKKyNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKy8qKgorICogQSB3cmFwcGVyIGNsYXNzIGZvciBIQUwgY2FtZXJhIG1vZHVsZS4KKyAqCisgKiBUaGlzIGNsYXNzIHdyYXBzIGNhbWVyYV9tb2R1bGVfdCByZXR1cm5lZCBmcm9tIEhBTCB0byBwcm92aWRlIGEgd3JhcHBlZAorICogZ2V0X2NhbWVyYV9pbmZvIGltcGxlbWVudGF0aW9uIHdoaWNoIENhbWVyYVNlcnZpY2UgZ2VuZXJhdGVzIHNvbWUKKyAqIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3Mga2V5cyBkZWZpbmVkIGluIG5ld2VyIEhBTCB2ZXJzaW9uIG9uIGFuIG9sZGVyIEhBTC4KKyAqLworY2xhc3MgQ2FtZXJhTW9kdWxlIHsKK3B1YmxpYzoKKyAgICBDYW1lcmFNb2R1bGUoY2FtZXJhX21vZHVsZV90ICptb2R1bGUpOworICAgIHZpcnR1YWwgfkNhbWVyYU1vZHVsZSgpOworCisgICAgLy8gTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgY29uc3RydWN0aW9uCisgICAgLy8gUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBOT19JTklUIG9uIGZhaWx1cmUKKyAgICBpbnQgaW5pdCgpOworCisgICAgaW50IGdldENhbWVyYUluZm8oaW50IGNhbWVyYUlkLCBzdHJ1Y3QgY2FtZXJhX2luZm8gKmluZm8pOworICAgIGludCBnZXROdW1iZXJPZkNhbWVyYXModm9pZCk7CisgICAgaW50IG9wZW4oY29uc3QgY2hhciogaWQsIHN0cnVjdCBod19kZXZpY2VfdCoqIGRldmljZSk7CisgICAgaW50IG9wZW5MZWdhY3koY29uc3QgY2hhciogaWQsIHVpbnQzMl90IGhhbFZlcnNpb24sIHN0cnVjdCBod19kZXZpY2VfdCoqIGRldmljZSk7CisgICAgaW50IHNldENhbGxiYWNrcyhjb25zdCBjYW1lcmFfbW9kdWxlX2NhbGxiYWNrc190ICpjYWxsYmFja3MpOworICAgIGJvb2wgaXNWZW5kb3JUYWdEZWZpbmVkKCk7CisgICAgdm9pZCBnZXRWZW5kb3JUYWdPcHModmVuZG9yX3RhZ19vcHNfdCogb3BzKTsKKyAgICBpbnQgc2V0VG9yY2hNb2RlKGNvbnN0IGNoYXIqIGNhbWVyYV9pZCwgYm9vbCBlbmFibGUpOworICAgIHVpbnQxNl90IGdldE1vZHVsZUFwaVZlcnNpb24oKTsKKyAgICBjb25zdCBjaGFyKiBnZXRNb2R1bGVOYW1lKCk7CisgICAgdWludDE2X3QgZ2V0SGFsQXBpVmVyc2lvbigpOworICAgIGNvbnN0IGNoYXIqIGdldE1vZHVsZUF1dGhvcigpOworICAgIC8vIE9ubHkgdXNlZCBieSBDYW1lcmFNb2R1bGVGaXh0dXJlIG5hdGl2ZSB0ZXN0LiBEbyBOT1QgdXNlIGVsc2V3aGVyZS4KKyAgICB2b2lkICpnZXREc28oKTsKKworcHJpdmF0ZToKKyAgICAvLyBEZXJpdmUgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBrZXlzIGRlZmluZWQgYWZ0ZXIgSEFMIGRldmljZSB2ZXJzaW9uCisgICAgc3RhdGljIHZvaWQgZGVyaXZlQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzS2V5cyh1aW50MzJfdCBkZXZpY2VWZXJzaW9uLCBDYW1lcmFNZXRhZGF0YSAmY2hhcnMpOworICAgIHN0YXR1c190IGZpbHRlck9wZW5FcnJvckNvZGUoc3RhdHVzX3QgZXJyKTsKKworICAgIGNhbWVyYV9tb2R1bGVfdCAqbU1vZHVsZTsKKyAgICBLZXllZFZlY3RvcjxpbnQsIGNhbWVyYV9pbmZvPiBtQ2FtZXJhSW5mb01hcDsKKyAgICBNdXRleCBtQ2FtZXJhSW5mb0xvY2s7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCmluZGV4IDE5MzVjMmIuLjdmMTRjZDQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKQEAgLTg5LDI0ICs4OSwyMiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3RhdHVzX3QgaW5pdGlhbGl6ZShod19tb2R1bGVfdCAqbW9kdWxlKQorICAgIHN0YXR1c190IGluaXRpYWxpemUoQ2FtZXJhTW9kdWxlICptb2R1bGUpCiAgICAgewogICAgICAgICBBTE9HSSgiT3BlbmluZyBjYW1lcmEgJXMiLCBtTmFtZS5zdHJpbmcoKSk7Ci0gICAgICAgIGNhbWVyYV9tb2R1bGVfdCAqY2FtZXJhTW9kdWxlID0gcmVpbnRlcnByZXRfY2FzdDxjYW1lcmFfbW9kdWxlX3QgKj4obW9kdWxlKTsKICAgICAgICAgY2FtZXJhX2luZm8gaW5mbzsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gY2FtZXJhTW9kdWxlLT5nZXRfY2FtZXJhX2luZm8oYXRvaShtTmFtZS5zdHJpbmcoKSksICZpbmZvKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gbW9kdWxlLT5nZXRDYW1lcmFJbmZvKGF0b2kobU5hbWUuc3RyaW5nKCkpLCAmaW5mbyk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CiAKICAgICAgICAgaW50IHJjID0gT0s7Ci0gICAgICAgIGlmIChtb2R1bGUtPm1vZHVsZV9hcGlfdmVyc2lvbiA+PSBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfMyAmJgorICAgICAgICBpZiAobW9kdWxlLT5nZXRNb2R1bGVBcGlWZXJzaW9uKCkgPj0gQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzMgJiYKICAgICAgICAgICAgIGluZm8uZGV2aWNlX3ZlcnNpb24gPiBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCkgewogICAgICAgICAgICAgLy8gT3BlbiBoaWdoZXIgdmVyc2lvbiBjYW1lcmEgZGV2aWNlIGFzIEhBTDEuMCBkZXZpY2UuCi0gICAgICAgICAgICByYyA9IGNhbWVyYU1vZHVsZS0+b3Blbl9sZWdhY3kobW9kdWxlLCBtTmFtZS5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChod19kZXZpY2VfdCAqKikmbURldmljZSk7CisgICAgICAgICAgICByYyA9IG1vZHVsZS0+b3BlbkxlZ2FjeShtTmFtZS5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaHdfZGV2aWNlX3QgKiopJm1EZXZpY2UpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmMgPSBDYW1lcmFTZXJ2aWNlOjpmaWx0ZXJPcGVuRXJyb3JDb2RlKG1vZHVsZS0+bWV0aG9kcy0+b3BlbigKLSAgICAgICAgICAgICAgICBtb2R1bGUsIG1OYW1lLnN0cmluZygpLCAoaHdfZGV2aWNlX3QgKiopJm1EZXZpY2UpKTsKKyAgICAgICAgICAgIHJjID0gbW9kdWxlLT5vcGVuKG1OYW1lLnN0cmluZygpLCAoaHdfZGV2aWNlX3QgKiopJm1EZXZpY2UpOwogICAgICAgICB9CiAgICAgICAgIGlmIChyYyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBvcGVuIGNhbWVyYSAlczogJWQiLCBtTmFtZS5zdHJpbmcoKSwgcmMpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTIvQ2FtZXJhMkRldmljZS5jcHAKaW5kZXggZDExNThkNi4uYzljOTkwYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuY3BwCkBAIC01Myw3ICs1Myw3IEBACiAgICAgcmV0dXJuIG1JZDsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6aW5pdGlhbGl6ZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSkKK3N0YXR1c190IENhbWVyYTJEZXZpY2U6OmluaXRpYWxpemUoQ2FtZXJhTW9kdWxlICptb2R1bGUpCiB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXM6IEluaXRpYWxpemluZyBkZXZpY2UgZm9yIGNhbWVyYSAlZCIsIF9fRlVOQ1RJT05fXywgbUlkKTsKQEAgLTY4LDggKzY4LDcgQEAKIAogICAgIGNhbWVyYTJfZGV2aWNlX3QgKmRldmljZTsKIAotICAgIHJlcyA9IENhbWVyYVNlcnZpY2U6OmZpbHRlck9wZW5FcnJvckNvZGUobW9kdWxlLT5jb21tb24ubWV0aG9kcy0+b3BlbigKLSAgICAgICAgJm1vZHVsZS0+Y29tbW9uLCBuYW1lLCByZWludGVycHJldF9jYXN0PGh3X2RldmljZV90Kio+KCZkZXZpY2UpKSk7CisgICAgcmVzID0gbW9kdWxlLT5vcGVuKG5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8aHdfZGV2aWNlX3QqKj4oJmRldmljZSkpOwogCiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBvcGVuIGNhbWVyYSAlZDogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKQEAgLTg3LDcgKzg2LDcgQEAKICAgICB9CiAKICAgICBjYW1lcmFfaW5mbyBpbmZvOwotICAgIHJlcyA9IG1vZHVsZS0+Z2V0X2NhbWVyYV9pbmZvKG1JZCwgJmluZm8pOworICAgIHJlcyA9IG1vZHVsZS0+Z2V0Q2FtZXJhSW5mbyhtSWQsICZpbmZvKTsKICAgICBpZiAocmVzICE9IE9LICkgcmV0dXJuIHJlczsKIAogICAgIGlmIChpbmZvLmRldmljZV92ZXJzaW9uICE9IGRldmljZS0+Y29tbW9uLnZlcnNpb24pIHsKQEAgLTI0MSw4ICsyNDAsOSBAQAogICAgIHJldHVybiBtUmVxdWVzdFF1ZXVlLndhaXRGb3JEZXF1ZXVlKHJlcXVlc3RJZCwgdGltZW91dCk7CiB9CiAKLXN0YXR1c190IENhbWVyYTJEZXZpY2U6OmNyZWF0ZVN0cmVhbShzcDxBTmF0aXZlV2luZG93PiBjb25zdW1lciwKLSAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwgaW50ICppZCkgeworc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Y3JlYXRlU3RyZWFtKHNwPFN1cmZhY2U+IGNvbnN1bWVyLAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAorICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSAvKmRhdGFTcGFjZSovLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CiAgICAgQUxPR1YoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKQEAgLTMxNSw3ICszMTUsOCBAQAogCiAKIHN0YXR1c190IENhbWVyYTJEZXZpY2U6OmdldFN0cmVhbUluZm8oaW50IGlkLAotICAgICAgICB1aW50MzJfdCAqd2lkdGgsIHVpbnQzMl90ICpoZWlnaHQsIHVpbnQzMl90ICpmb3JtYXQpIHsKKyAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LAorICAgICAgICB1aW50MzJfdCAqZm9ybWF0LCBhbmRyb2lkX2RhdGFzcGFjZSAqZGF0YVNwYWNlKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXM6IEUiLCBfX0ZVTkNUSU9OX18pOwogICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKQEAgLTMzNiw2ICszMzcsNyBAQAogICAgIGlmICh3aWR0aCkgKndpZHRoID0gKCpzdHJlYW1JKS0+Z2V0V2lkdGgoKTsKICAgICBpZiAoaGVpZ2h0KSAqaGVpZ2h0ID0gKCpzdHJlYW1JKS0+Z2V0SGVpZ2h0KCk7CiAgICAgaWYgKGZvcm1hdCkgKmZvcm1hdCA9ICgqc3RyZWFtSSktPmdldEZvcm1hdCgpOworICAgIGlmIChkYXRhU3BhY2UpICpkYXRhU3BhY2UgPSBIQUxfREFUQVNQQUNFX1VOS05PV047CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC00MTUsNyArNDE3LDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYTJEZXZpY2U6OmNvbmZpZ3VyZVN0cmVhbXMoKSB7CitzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpjb25maWd1cmVTdHJlYW1zKGJvb2wgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKIApAQCAtNjE4LDYgKzYyMCwxOCBAQAogICAgIHJldHVybiB3YWl0VW50aWxEcmFpbmVkKCk7CiB9CiAKK3N0YXR1c190IENhbWVyYTJEZXZpY2U6OnByZXBhcmUoaW50IHN0cmVhbUlkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogdW5pbXBsZW1lbnRlZCIsIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6dGVhckRvd24oaW50IHN0cmVhbUlkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogdW5pbXBsZW1lbnRlZCIsIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKwogdWludDMyX3QgQ2FtZXJhMkRldmljZTo6Z2V0RGV2aWNlVmVyc2lvbigpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHJldHVybiBtRGV2aWNlVmVyc2lvbjsKQEAgLTE1ODEsNCArMTU5NSwxOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorLy8gY2FtZXJhIDIgZGV2aWNlcyBkb24ndCBzdXBwb3J0IHJlcHJvY2Vzc2luZworc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Y3JlYXRlSW5wdXRTdHJlYW0oCisgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwgaW50ICppZCkgeworICAgIEFMT0dFKCIlczogY2FtZXJhIDIgZGV2aWNlcyBkb24ndCBzdXBwb3J0IHJlcHJvY2Vzc2luZyIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCisvLyBjYW1lcmEgMiBkZXZpY2VzIGRvbid0IHN1cHBvcnQgcmVwcm9jZXNzaW5nCitzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpnZXRJbnB1dEJ1ZmZlclByb2R1Y2VyKAorICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqcHJvZHVjZXIpIHsKKyAgICBBTE9HRSgiJXM6IGNhbWVyYSAyIGRldmljZXMgZG9uJ3Qgc3VwcG9ydCByZXByb2Nlc3NpbmciLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTIvQ2FtZXJhMkRldmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmgKaW5kZXggNGRlZjhhZS4uMzRjMWRlZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmgKQEAgLTQzLDcgKzQzLDcgQEAKICAgICAgKiBDYW1lcmFEZXZpY2UgaW50ZXJmYWNlCiAgICAgICovCiAgICAgdmlydHVhbCBpbnQgICAgICBnZXRJZCgpIGNvbnN0OwotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKENhbWVyYU1vZHVsZSAqbW9kdWxlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3QoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKICAgICB2aXJ0dWFsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvKCkgY29uc3Q7CkBAIC01NiwxNiArNTYsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xlYXJTdHJlYW1pbmdSZXF1ZXN0KGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgd2FpdFVudGlsUmVxdWVzdFJlY2VpdmVkKGludDMyX3QgcmVxdWVzdElkLCBuc2Vjc190IHRpbWVvdXQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlU3RyZWFtKHNwPEFOYXRpdmVXaW5kb3c+IGNvbnN1bWVyLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlU3RyZWFtKHNwPFN1cmZhY2U+IGNvbnN1bWVyLAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKKyAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVJbnB1dFN0cmVhbSgKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsIGludCAqaWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlUmVwcm9jZXNzU3RyZWFtRnJvbVN0cmVhbShpbnQgb3V0cHV0SWQsIGludCAqaWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3RyZWFtSW5mbyhpbnQgaWQsCi0gICAgICAgICAgICB1aW50MzJfdCAqd2lkdGgsIHVpbnQzMl90ICpoZWlnaHQsIHVpbnQzMl90ICpmb3JtYXQpOworICAgICAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LAorICAgICAgICAgICAgdWludDMyX3QgKmZvcm1hdCwgYW5kcm9pZF9kYXRhc3BhY2UgKmRhdGFTcGFjZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1UcmFuc2Zvcm0oaW50IGlkLCBpbnQgdHJhbnNmb3JtKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGRlbGV0ZVN0cmVhbShpbnQgaWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVsZXRlUmVwcm9jZXNzU3RyZWFtKGludCBpZCk7CiAgICAgLy8gTm8tb3Agb24gSEFMMiBkZXZpY2VzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zKGJvb2wgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCA9IGZhbHNlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyUHJvZHVjZXIoCisgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqcHJvZHVjZXIpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlRGVmYXVsdFJlcXVlc3QoaW50IHRlbXBsYXRlSWQsIENhbWVyYU1ldGFkYXRhICpyZXF1ZXN0KTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHdhaXRVbnRpbERyYWluZWQoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE5vdGlmeUNhbGxiYWNrKE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lcik7CkBAIC03OSw2ICs4NSwxMCBAQAogICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpidWZmZXIsIHdwPEJ1ZmZlclJlbGVhc2VkTGlzdGVuZXI+IGxpc3RlbmVyKTsKICAgICAvLyBGbHVzaCBpbXBsZW1lbnRlZCBhcyBqdXN0IGEgd2FpdAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgLy8gUHJlcGFyZSBhbmQgdGVhckRvd24gYXJlIG5vLW9wcworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZShpbnQgc3RyZWFtSWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgdGVhckRvd24oaW50IHN0cmVhbUlkKTsKKwogICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0RGV2aWNlVmVyc2lvbigpOwogICAgIHZpcnR1YWwgc3NpemVfdCBnZXRKcGVnQnVmZmVyU2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSBjb25zdDsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKaW5kZXggOTY0ZmEzNS4uNjdiZDIyZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCkBAIC01OCwxMSArNTgsMTQgQEAKIAogQ2FtZXJhM0RldmljZTo6Q2FtZXJhM0RldmljZShpbnQgaWQpOgogICAgICAgICBtSWQoaWQpLAorICAgICAgICBtSXNDb25zdHJhaW5lZEhpZ2hTcGVlZENvbmZpZ3VyYXRpb24oZmFsc2UpLAogICAgICAgICBtSGFsM0RldmljZShOVUxMKSwKICAgICAgICAgbVN0YXR1cyhTVEFUVVNfVU5JTklUSUFMSVpFRCksCisgICAgICAgIG1TdGF0dXNXYWl0ZXJzKDApLAogICAgICAgICBtVXNlUGFydGlhbFJlc3VsdChmYWxzZSksCiAgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cygxKSwKICAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlcigwKSwKKyAgICAgICAgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlcigwKSwKICAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIoMCksCiAgICAgICAgIG1MaXN0ZW5lcihOVUxMKQogewpAQCAtODcsNyArOTAsNyBAQAogICogQ2FtZXJhRGV2aWNlQmFzZSBpbnRlcmZhY2UKICAqLwogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjppbml0aWFsaXplKGNhbWVyYV9tb2R1bGVfdCAqbW9kdWxlKQorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6aW5pdGlhbGl6ZShDYW1lcmFNb2R1bGUgKm1vZHVsZSkKIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CkBAIC0xMDcsOSArMTEwLDggQEAKICAgICBjYW1lcmEzX2RldmljZV90ICpkZXZpY2U7CiAKICAgICBBVFJBQ0VfQkVHSU4oImNhbWVyYTMtPm9wZW4iKTsKLSAgICByZXMgPSBDYW1lcmFTZXJ2aWNlOjpmaWx0ZXJPcGVuRXJyb3JDb2RlKG1vZHVsZS0+Y29tbW9uLm1ldGhvZHMtPm9wZW4oCi0gICAgICAgICZtb2R1bGUtPmNvbW1vbiwgZGV2aWNlTmFtZS5zdHJpbmcoKSwKLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxod19kZXZpY2VfdCoqPigmZGV2aWNlKSkpOworICAgIHJlcyA9IG1vZHVsZS0+b3BlbihkZXZpY2VOYW1lLnN0cmluZygpLAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxod19kZXZpY2VfdCoqPigmZGV2aWNlKSk7CiAgICAgQVRSQUNFX0VORCgpOwogCiAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtMTI4LDcgKzEzMCw3IEBACiAgICAgfQogCiAgICAgY2FtZXJhX2luZm8gaW5mbzsKLSAgICByZXMgPSBDYW1lcmFTZXJ2aWNlOjpmaWx0ZXJHZXRJbmZvRXJyb3JDb2RlKG1vZHVsZS0+Z2V0X2NhbWVyYV9pbmZvKAorICAgIHJlcyA9IENhbWVyYVNlcnZpY2U6OmZpbHRlckdldEluZm9FcnJvckNvZGUobW9kdWxlLT5nZXRDYW1lcmFJbmZvKAogICAgICAgICBtSWQsICZpbmZvKSk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKIApAQCAtMTY0LDkgKzE2NiwxNyBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAotICAgIC8qKiBTdGFydCB1cCByZXF1ZXN0IHF1ZXVlIHRocmVhZCAqLworICAgIGJvb2wgYWVMb2NrQXZhaWxhYmxlID0gZmFsc2U7CisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGFlTG9ja0F2YWlsYWJsZUVudHJ5OworICAgIHJlcyA9IGZpbmRfY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5KGluZm8uc3RhdGljX2NhbWVyYV9jaGFyYWN0ZXJpc3RpY3MsCisgICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfQUVfTE9DS19BVkFJTEFCTEUsICZhZUxvY2tBdmFpbGFibGVFbnRyeSk7CisgICAgaWYgKHJlcyA9PSBPSyAmJiBhZUxvY2tBdmFpbGFibGVFbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgYWVMb2NrQXZhaWxhYmxlID0gKGFlTG9ja0F2YWlsYWJsZUVudHJ5LmRhdGEudThbMF0gPT0KKyAgICAgICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfQUVfTE9DS19BVkFJTEFCTEVfVFJVRSk7CisgICAgfQogCi0gICAgbVJlcXVlc3RUaHJlYWQgPSBuZXcgUmVxdWVzdFRocmVhZCh0aGlzLCBtU3RhdHVzVHJhY2tlciwgZGV2aWNlKTsKKyAgICAvKiogU3RhcnQgdXAgcmVxdWVzdCBxdWV1ZSB0aHJlYWQgKi8KKyAgICBtUmVxdWVzdFRocmVhZCA9IG5ldyBSZXF1ZXN0VGhyZWFkKHRoaXMsIG1TdGF0dXNUcmFja2VyLCBkZXZpY2UsIGFlTG9ja0F2YWlsYWJsZSk7CiAgICAgcmVzID0gbVJlcXVlc3RUaHJlYWQtPnJ1bihTdHJpbmc4Ojpmb3JtYXQoIkMzRGV2LSVkLVJlcVF1ZXVlIiwgbUlkKS5zdHJpbmcoKSk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBTRVRfRVJSX0woIlVuYWJsZSB0byBzdGFydCByZXF1ZXN0IHF1ZXVlIHRocmVhZDogJXMgKCVkKSIsCkBAIC0xNzYsMTIgKzE4NiwxNSBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAorICAgIG1QcmVwYXJlclRocmVhZCA9IG5ldyBQcmVwYXJlclRocmVhZCgpOworCiAgICAgLyoqIEV2ZXJ5dGhpbmcgaXMgZ29vZCB0byBnbyAqLwogCiAgICAgbURldmljZVZlcnNpb24gPSBkZXZpY2UtPmNvbW1vbi52ZXJzaW9uOwogICAgIG1EZXZpY2VJbmZvID0gaW5mby5zdGF0aWNfY2FtZXJhX2NoYXJhY3RlcmlzdGljczsKICAgICBtSGFsM0RldmljZSA9IGRldmljZTsKLSAgICBtU3RhdHVzID0gU1RBVFVTX1VOQ09ORklHVVJFRDsKKworICAgIGludGVybmFsVXBkYXRlU3RhdHVzTG9ja2VkKFNUQVRVU19VTkNPTkZJR1VSRUQpOwogICAgIG1OZXh0U3RyZWFtSWQgPSAwOwogICAgIG1EdW1teVN0cmVhbUlkID0gTk9fU1RSRUFNOwogICAgIG1OZWVkQ29uZmlnID0gdHJ1ZTsKQEAgLTIwMyw2ICsyMTYsMTcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBjb25maWdzID0KKyAgICAgICAgICAgIG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUyk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvbmZpZ3MuY291bnQ7IGkgKz0gNCkgeworICAgICAgICBpZiAoY29uZmlncy5kYXRhLmkzMltpXSA9PSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQgJiYKKyAgICAgICAgICAgICAgICBjb25maWdzLmRhdGEuaTMyW2kgKyAzXSA9PQorICAgICAgICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfSU5QVVQpIHsKKyAgICAgICAgICAgIG1TdXBwb3J0ZWRPcGFxdWVJbnB1dFNpemVzLmFkZChTaXplKGNvbmZpZ3MuZGF0YS5pMzJbaSArIDFdLAorICAgICAgICAgICAgICAgICAgICBjb25maWdzLmRhdGEuaTMyW2kgKyAyXSkpOworICAgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yNzUsNyArMjk5LDcgQEAKICAgICAgICAgICAgIG1IYWwzRGV2aWNlID0gTlVMTDsKICAgICAgICAgfQogCi0gICAgICAgIG1TdGF0dXMgPSBTVEFUVVNfVU5JTklUSUFMSVpFRDsKKyAgICAgICAgaW50ZXJuYWxVcGRhdGVTdGF0dXNMb2NrZWQoU1RBVFVTX1VOSU5JVElBTElaRUQpOwogICAgIH0KIAogICAgIEFMT0dWKCIlczogWCIsIF9fRlVOQ1RJT05fXyk7CkBAIC0zNDksNyArMzczLDcgQEAKICAgICAvLyBHZXQgbWF4IGpwZWcgc2l6ZSAoYXJlYS13aXNlKS4KICAgICBTaXplIG1heEpwZWdSZXNvbHV0aW9uID0gZ2V0TWF4SnBlZ1Jlc29sdXRpb24oKTsKICAgICBpZiAobWF4SnBlZ1Jlc29sdXRpb24ud2lkdGggPT0gMCkgewotICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgZmluZCBmaW5kIHZhbGlkIGF2YWlsYWJsZSBqcGVnIHNpemVzIGluIHN0YXRpYyBtZXRhZGF0YSEiLAorICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgZmluZCB2YWxpZCBhdmFpbGFibGUganBlZyBzaXplcyBpbiBzdGF0aWMgbWV0YWRhdGEhIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQpAQCAtMzc2LDYgKzQwMCwyMSBAQAogICAgIHJldHVybiBqcGVnQnVmZmVyU2l6ZTsKIH0KIAorc3NpemVfdCBDYW1lcmEzRGV2aWNlOjpnZXRQb2ludENsb3VkQnVmZmVyU2l6ZSgpIGNvbnN0IHsKKyAgICBjb25zdCBpbnQgRkxPQVRTX1BFUl9QT0lOVD00OworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBtYXhQb2ludENvdW50ID0gbURldmljZUluZm8uZmluZChBTkRST0lEX0RFUFRIX01BWF9ERVBUSF9TQU1QTEVTKTsKKyAgICBpZiAobWF4UG9pbnRDb3VudC5jb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBmaW5kIG1heGltdW0gZGVwdGggcG9pbnQgY2xvdWQgc2l6ZSBpbiBzdGF0aWMgbWV0YWRhdGEhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNzaXplX3QgbWF4Qnl0ZXNGb3JQb2ludENsb3VkID0gc2l6ZW9mKGFuZHJvaWRfZGVwdGhfcG9pbnRzKSArCisgICAgICAgICAgICBtYXhQb2ludENvdW50LmRhdGEuaTMyWzBdICogc2l6ZW9mKGZsb2F0KSAqIEZMT0FUU19QRVJfUE9JTlQ7CisgICAgcmV0dXJuIG1heEJ5dGVzRm9yUG9pbnRDbG91ZDsKK30KKworCisKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICAodm9pZClhcmdzOwpAQCAtNDA3LDYgKzQ0Niw4IEBACiAgICAgICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgIEVycm9yIGNhdXNlOiAlc1xuIiwgbUVycm9yQ2F1c2Uuc3RyaW5nKCkpOwogICAgIH0KICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICBTdHJlYW0gY29uZmlndXJhdGlvbjpcbiIpOworICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgIE9wZXJhdGlvbiBtb2RlOiAlcyBcbiIsIG1Jc0NvbnN0cmFpbmVkSGlnaFNwZWVkQ29uZmlndXJhdGlvbiA/CisgICAgICAgICAgICAiQ09OU1RSQUlORUQgSElHSCBTUEVFRCBWSURFTyIgOiAiTk9STUFMIik7CiAKICAgICBpZiAobUlucHV0U3RyZWFtICE9IE5VTEwpIHsKICAgICAgICAgd3JpdGUoZmQsIGxpbmVzLnN0cmluZygpLCBsaW5lcy5zaXplKCkpOwpAQCAtODAyLDEzICs4NDMsMTQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OmNyZWF0ZVN0cmVhbShzcDxBTmF0aXZlV2luZG93PiBjb25zdW1lciwKLSAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwgaW50ICppZCkgeworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y3JlYXRlU3RyZWFtKHNwPFN1cmZhY2U+IGNvbnN1bWVyLAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCisgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwotICAgIEFMT0dWKCJDYW1lcmEgJWQ6IENyZWF0aW5nIG5ldyBzdHJlYW0gJWQ6ICVkIHggJWQsIGZvcm1hdCAlZCIsCi0gICAgICAgICAgICBtSWQsIG1OZXh0U3RyZWFtSWQsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCk7CisgICAgQUxPR1YoIkNhbWVyYSAlZDogQ3JlYXRpbmcgbmV3IHN0cmVhbSAlZDogJWQgeCAlZCwgZm9ybWF0ICVkLCBkYXRhc3BhY2UgJWQgcm90YXRpb24gJWQiLAorICAgICAgICAgICAgbUlkLCBtTmV4dFN0cmVhbUlkLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24pOwogCiAgICAgc3RhdHVzX3QgcmVzOwogICAgIGJvb2wgd2FzQWN0aXZlID0gZmFsc2U7CkBAIC04NDEsMTcgKzg4MywyNSBAQAogCiAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbT4gbmV3U3RyZWFtOwogICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7Ci0gICAgICAgIHNzaXplX3QganBlZ0J1ZmZlclNpemUgPSBnZXRKcGVnQnVmZmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgaWYgKGpwZWdCdWZmZXJTaXplIDw9IDApIHsKLSAgICAgICAgICAgIFNFVF9FUlJfTCgiSW52YWxpZCBqcGVnIGJ1ZmZlciBzaXplICV6ZCIsIGpwZWdCdWZmZXJTaXplKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIHNzaXplX3QgYmxvYkJ1ZmZlclNpemU7CisgICAgICAgIGlmIChkYXRhU3BhY2UgIT0gSEFMX0RBVEFTUEFDRV9ERVBUSCkgeworICAgICAgICAgICAgYmxvYkJ1ZmZlclNpemUgPSBnZXRKcGVnQnVmZmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIGlmIChibG9iQnVmZmVyU2l6ZSA8PSAwKSB7CisgICAgICAgICAgICAgICAgU0VUX0VSUl9MKCJJbnZhbGlkIGpwZWcgYnVmZmVyIHNpemUgJXpkIiwgYmxvYkJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBibG9iQnVmZmVyU2l6ZSA9IGdldFBvaW50Q2xvdWRCdWZmZXJTaXplKCk7CisgICAgICAgICAgICBpZiAoYmxvYkJ1ZmZlclNpemUgPD0gMCkgeworICAgICAgICAgICAgICAgIFNFVF9FUlJfTCgiSW52YWxpZCBwb2ludCBjbG91ZCBidWZmZXIgc2l6ZSAlemQiLCBibG9iQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotCiAgICAgICAgIG5ld1N0cmVhbSA9IG5ldyBDYW1lcmEzT3V0cHV0U3RyZWFtKG1OZXh0U3RyZWFtSWQsIGNvbnN1bWVyLAotICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGpwZWdCdWZmZXJTaXplLCBmb3JtYXQpOworICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGJsb2JCdWZmZXJTaXplLCBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24pOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG5ld1N0cmVhbSA9IG5ldyBDYW1lcmEzT3V0cHV0U3RyZWFtKG1OZXh0U3RyZWFtSWQsIGNvbnN1bWVyLAotICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uKTsKICAgICB9CiAgICAgbmV3U3RyZWFtLT5zZXRTdGF0dXNUcmFja2VyKG1TdGF0dXNUcmFja2VyKTsKIApAQCAtODg5LDcgKzkzOSw4IEBACiAKIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Z2V0U3RyZWFtSW5mbyhpbnQgaWQsCi0gICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwgdWludDMyX3QgKmZvcm1hdCkgeworICAgICAgICB1aW50MzJfdCAqd2lkdGgsIHVpbnQzMl90ICpoZWlnaHQsCisgICAgICAgIHVpbnQzMl90ICpmb3JtYXQsIGFuZHJvaWRfZGF0YXNwYWNlICpkYXRhU3BhY2UpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwpAQCAtOTIwLDcgKzk3MSw3IEBACiAgICAgaWYgKHdpZHRoKSAqd2lkdGggID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0V2lkdGgoKTsKICAgICBpZiAoaGVpZ2h0KSAqaGVpZ2h0ID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0SGVpZ2h0KCk7CiAgICAgaWYgKGZvcm1hdCkgKmZvcm1hdCA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldEZvcm1hdCgpOwotCisgICAgaWYgKGRhdGFTcGFjZSkgKmRhdGFTcGFjZSA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldERhdGFTcGFjZSgpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMTAxMCwxNiArMTA2MSwzNSBAQAogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y29uZmlndXJlU3RyZWFtcygpIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmNvbmZpZ3VyZVN0cmVhbXMoYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXM6IEUiLCBfX0ZVTkNUSU9OX18pOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKKyAgICBpZiAobUlzQ29uc3RyYWluZWRIaWdoU3BlZWRDb25maWd1cmF0aW9uICE9IGlzQ29uc3RyYWluZWRIaWdoU3BlZWQpIHsKKyAgICAgICAgbU5lZWRDb25maWcgPSB0cnVlOworICAgICAgICBtSXNDb25zdHJhaW5lZEhpZ2hTcGVlZENvbmZpZ3VyYXRpb24gPSBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkOworICAgIH0KKwogICAgIHJldHVybiBjb25maWd1cmVTdHJlYW1zTG9ja2VkKCk7CiB9CiAKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmdldElucHV0QnVmZmVyUHJvZHVjZXIoCisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpwcm9kdWNlcikgeworICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgaWYgKHByb2R1Y2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgaWYgKG1JbnB1dFN0cmVhbSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICByZXR1cm4gbUlucHV0U3RyZWFtLT5nZXRJbnB1dEJ1ZmZlclByb2R1Y2VyKHByb2R1Y2VyKTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y3JlYXRlRGVmYXVsdFJlcXVlc3QoaW50IHRlbXBsYXRlSWQsCiAgICAgICAgIENhbWVyYU1ldGFkYXRhICpyZXF1ZXN0KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKQEAgLTEwNjIsOSArMTEzMiw5IEBACiAgICAgICAgIG1IYWwzRGV2aWNlLCB0ZW1wbGF0ZUlkKTsKICAgICBBVFJBQ0VfRU5EKCk7CiAgICAgaWYgKHJhd1JlcXVlc3QgPT0gTlVMTCkgewotICAgICAgICBTRVRfRVJSX0woIkhBTCBpcyB1bmFibGUgdG8gY29uc3RydWN0IGRlZmF1bHQgc2V0dGluZ3MgZm9yIHRlbXBsYXRlICVkIiwKLSAgICAgICAgICAgICAgICB0ZW1wbGF0ZUlkKTsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICBBTE9HSSgiJXM6IHRlbXBsYXRlICVkIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBjYW1lcmEgZGV2aWNlIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0ZW1wbGF0ZUlkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgKnJlcXVlc3QgPSByYXdSZXF1ZXN0OwogICAgIG1SZXF1ZXN0VGVtcGxhdGVDYWNoZVt0ZW1wbGF0ZUlkXSA9IHJhd1JlcXVlc3Q7CkBAIC0xMTA2LDYgKzExNzYsMTMgQEAKICAgICByZXR1cm4gcmVzOwogfQogCisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6aW50ZXJuYWxVcGRhdGVTdGF0dXNMb2NrZWQoU3RhdHVzIHN0YXR1cykgeworICAgIG1TdGF0dXMgPSBzdGF0dXM7CisgICAgbVJlY2VudFN0YXR1c1VwZGF0ZXMuYWRkKG1TdGF0dXMpOworICAgIG1TdGF0dXNDaGFuZ2VkLmJyb2FkY2FzdCgpOworfQorCiAvLyBQYXVzZSB0byByZWNvbmZpZ3VyZQogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6aW50ZXJuYWxQYXVzZUFuZFdhaXRMb2NrZWQoKSB7CiAgICAgbVJlcXVlc3RUaHJlYWQtPnNldFBhdXNlZCh0cnVlKTsKQEAgLTExMzYsMjMgKzEyMTMsNDAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OndhaXRVbnRpbFN0YXRlVGhlblJlbG9jayhib29sIGFjdGl2ZSwKLSAgICAgICAgbnNlY3NfdCB0aW1lb3V0KSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjp3YWl0VW50aWxTdGF0ZVRoZW5SZWxvY2soYm9vbCBhY3RpdmUsIG5zZWNzX3QgdGltZW91dCkgewogICAgIHN0YXR1c190IHJlcyA9IE9LOwotICAgIGlmIChhY3RpdmUgPT0gKG1TdGF0dXMgPT0gU1RBVFVTX0FDVElWRSkpIHsKLSAgICAgICAgLy8gRGVzaXJlZCBzdGF0ZSBhbHJlYWR5IHJlYWNoZWQKLSAgICAgICAgcmV0dXJuIHJlczsKKworICAgIHNpemVfdCBzdGFydEluZGV4ID0gMDsKKyAgICBpZiAobVN0YXR1c1dhaXRlcnMgPT0gMCkgeworICAgICAgICAvLyBDbGVhciB0aGUgbGlzdCBvZiByZWNlbnQgc3RhdHVzZXMgaWYgdGhlcmUgYXJlIG5vIGV4aXN0aW5nIHRocmVhZHMgd2FpdGluZyBvbiB1cGRhdGVzIHRvCisgICAgICAgIC8vIHRoaXMgc3RhdHVzIGxpc3QKKyAgICAgICAgbVJlY2VudFN0YXR1c1VwZGF0ZXMuY2xlYXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBJZiBvdGhlciB0aHJlYWRzIGFyZSB3YWl0aW5nIG9uIHVwZGF0ZXMgdG8gdGhpcyBzdGF0dXMgbGlzdCwgc2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUKKyAgICAgICAgLy8gZmlyc3QgZWxlbWVudCB0aGF0IHRoaXMgbGlzdCB3aWxsIGNoZWNrIHJhdGhlciB0aGFuIGNsZWFyaW5nIHRoZSBsaXN0LgorICAgICAgICBzdGFydEluZGV4ID0gbVJlY2VudFN0YXR1c1VwZGF0ZXMuc2l6ZSgpOwogICAgIH0KIAorICAgIG1TdGF0dXNXYWl0ZXJzKys7CisKICAgICBib29sIHN0YXRlU2VlbiA9IGZhbHNlOwogICAgIGRvIHsKLSAgICAgICAgbVJlY2VudFN0YXR1c1VwZGF0ZXMuY2xlYXIoKTsKKyAgICAgICAgaWYgKGFjdGl2ZSA9PSAobVN0YXR1cyA9PSBTVEFUVVNfQUNUSVZFKSkgeworICAgICAgICAgICAgLy8gRGVzaXJlZCBzdGF0ZSBpcyBjdXJyZW50CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCiAgICAgICAgIHJlcyA9IG1TdGF0dXNDaGFuZ2VkLndhaXRSZWxhdGl2ZShtTG9jaywgdGltZW91dCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIGJyZWFrOwogCi0gICAgICAgIC8vIENoZWNrIHN0YXRlIGNoYW5nZSBoaXN0b3J5IGR1cmluZyB3YWl0Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVJlY2VudFN0YXR1c1VwZGF0ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgLy8gVGhpcyBpcyBpbXBvc3NpYmxlLCBidXQgaWYgbm90LCBjb3VsZCByZXN1bHQgaW4gc3VidGxlIGRlYWRsb2NrcyBhbmQgaW52YWxpZCBzdGF0ZQorICAgICAgICAvLyB0cmFuc2l0aW9ucy4KKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdGFydEluZGV4ID4gbVJlY2VudFN0YXR1c1VwZGF0ZXMuc2l6ZSgpLAorICAgICAgICAgICAgICAgICIlczogU2tpcHBpbmcgc3RhdHVzIHVwZGF0ZXMgaW4gQ2FtZXJhM0RldmljZSwgbWF5IHJlc3VsdCBpbiBkZWFkbG9jay4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgICAgLy8gRW5jb3VudGVyZWQgZGVzaXJlZCBzdGF0ZSBzaW5jZSB3ZSBiZWdhbiB3YWl0aW5nCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSBzdGFydEluZGV4OyBpIDwgbVJlY2VudFN0YXR1c1VwZGF0ZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIGlmIChhY3RpdmUgPT0gKG1SZWNlbnRTdGF0dXNVcGRhdGVzW2ldID09IFNUQVRVU19BQ1RJVkUpICkgewogICAgICAgICAgICAgICAgIHN0YXRlU2VlbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMTYwLDYgKzEyNTQsOCBAQAogICAgICAgICB9CiAgICAgfSB3aGlsZSAoIXN0YXRlU2Vlbik7CiAKKyAgICBtU3RhdHVzV2FpdGVycy0tOworCiAgICAgcmV0dXJuIHJlczsKIH0KIApAQCAtMTE3Miw3ICsxMjY4LDggQEAKICAgICAgICAgQUxPR1coIiVzOiBSZXBsYWNpbmcgb2xkIGNhbGxiYWNrIGxpc3RlbmVyIiwgX19GVU5DVElPTl9fKTsKICAgICB9CiAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgbVJlcXVlc3RUaHJlYWQtPnNldE5vdGlmeUNhbGxiYWNrKGxpc3RlbmVyKTsKKyAgICBtUmVxdWVzdFRocmVhZC0+c2V0Tm90aWZpY2F0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworICAgIG1QcmVwYXJlclRocmVhZC0+c2V0Tm90aWZpY2F0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTMxOCw2ICsxNDE1LDY1IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6cHJlcGFyZShpbnQgc3RyZWFtSWQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBQcmVwYXJpbmcgc3RyZWFtICVkIiwgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVhbUlkKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKworICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbTsKKyAgICBzc2l6ZV90IG91dHB1dFN0cmVhbUlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtSWQpOworICAgIGlmIChvdXRwdXRTdHJlYW1JZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBkb2VzIG5vdCBleGlzdCIsIHN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChvdXRwdXRTdHJlYW1JZHgpOworCisgICAgaWYgKHN0cmVhbS0+aXNVbnByZXBhcmFibGUoKSB8fCBzdHJlYW0tPmhhc091dHN0YW5kaW5nQnVmZmVycygpICkgeworICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGhhcyBhbHJlYWR5IGJlZW4gYSByZXF1ZXN0IHRhcmdldCIsIHN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAobVJlcXVlc3RUaHJlYWQtPmlzU3RyZWFtUGVuZGluZyhzdHJlYW0pKSB7CisgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgaXMgYWxyZWFkeSBhIHRhcmdldCBpbiBhIHBlbmRpbmcgcmVxdWVzdCIsIHN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByZXR1cm4gbVByZXBhcmVyVGhyZWFkLT5wcmVwYXJlKHN0cmVhbSk7Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OnRlYXJEb3duKGludCBzdHJlYW1JZCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFRlYXJpbmcgZG93biBzdHJlYW0gJWQiLCBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZWFtSWQpOworICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgLy8gVGVhcmRvd24gY2FuIG9ubHkgYmUgYWNjb21wbGlzaGVkIG9uIGRldmljZXMgdGhhdCBkb24ndCByZXF1aXJlIHJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzLAorICAgIC8vIHNpbmNlIHdlIGNhbm5vdCBjYWxsIHJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzIGV4Y2VwdCByaWdodCBhZnRlciBjb25maWd1cmVfc3RyZWFtcy4KKyAgICBpZiAobUhhbDNEZXZpY2UtPmNvbW1vbi52ZXJzaW9uIDwgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gdGVhciBkb3duIHN0cmVhbXMgb24gZGV2aWNlIEhBTCB2JXgiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUhhbDNEZXZpY2UtPmNvbW1vbi52ZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtOworICAgIHNzaXplX3Qgb3V0cHV0U3RyZWFtSWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW1JZCk7CisgICAgaWYgKG91dHB1dFN0cmVhbUlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGRvZXMgbm90IGV4aXN0Iiwgc3RyZWFtSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KG91dHB1dFN0cmVhbUlkeCk7CisKKyAgICBpZiAoc3RyZWFtLT5oYXNPdXRzdGFuZGluZ0J1ZmZlcnMoKSB8fCBtUmVxdWVzdFRocmVhZC0+aXNTdHJlYW1QZW5kaW5nKHN0cmVhbSkpIHsKKyAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBpcyBhIHRhcmdldCBvZiBhIGluLXByb2dyZXNzIHJlcXVlc3QiLCBzdHJlYW1JZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIHN0cmVhbS0+dGVhckRvd24oKTsKK30KKwogdWludDMyX3QgQ2FtZXJhM0RldmljZTo6Z2V0RGV2aWNlVmVyc2lvbigpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CkBAIC0xMzQxLDkgKzE0OTcsNyBAQAogICAgICAgICB9CiAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBOb3cgJXMiLCBfX0ZVTkNUSU9OX18sIG1JZCwKICAgICAgICAgICAgICAgICBpZGxlID8gImlkbGUiIDogImFjdGl2ZSIpOwotICAgICAgICBtU3RhdHVzID0gaWRsZSA/IFNUQVRVU19DT05GSUdVUkVEIDogU1RBVFVTX0FDVElWRTsKLSAgICAgICAgbVJlY2VudFN0YXR1c1VwZGF0ZXMuYWRkKG1TdGF0dXMpOwotICAgICAgICBtU3RhdHVzQ2hhbmdlZC5zaWduYWwoKTsKKyAgICAgICAgaW50ZXJuYWxVcGRhdGVTdGF0dXNMb2NrZWQoaWRsZSA/IFNUQVRVU19DT05GSUdVUkVEIDogU1RBVFVTX0FDVElWRSk7CiAKICAgICAgICAgLy8gU2tpcCBub3RpZnlpbmcgbGlzdGVuZXIgaWYgd2UncmUgZG9pbmcgc29tZSB1c2VyLXRyYW5zcGFyZW50CiAgICAgICAgIC8vIHN0YXRlIGNoYW5nZXMKQEAgLTEzOTEsNiArMTU0NSwxMSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIC8vIENoZWNrIGlmIHN0cmVhbSBpcyBiZWluZyBwcmVwYXJlZAorICAgICAgICBpZiAobUlucHV0U3RyZWFtLT5pc1ByZXBhcmluZygpKSB7CisgICAgICAgICAgICBDTE9HRSgiUmVxdWVzdCByZWZlcmVuY2VzIGFuIGlucHV0IHN0cmVhbSB0aGF0J3MgYmVpbmcgcHJlcGFyZWQhIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCiAgICAgICAgIG5ld1JlcXVlc3QtPm1JbnB1dFN0cmVhbSA9IG1JbnB1dFN0cmVhbTsKICAgICAgICAgbmV3UmVxdWVzdC0+bVNldHRpbmdzLmVyYXNlKEFORFJPSURfUkVRVUVTVF9JTlBVVF9TVFJFQU1TKTsKQEAgLTE0MjMsNiArMTU4MiwxMSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIC8vIENoZWNrIGlmIHN0cmVhbSBpcyBiZWluZyBwcmVwYXJlZAorICAgICAgICBpZiAoc3RyZWFtLT5pc1ByZXBhcmluZygpKSB7CisgICAgICAgICAgICBDTE9HRSgiUmVxdWVzdCByZWZlcmVuY2VzIGFuIG91dHB1dCBzdHJlYW0gdGhhdCdzIGJlaW5nIHByZXBhcmVkISIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAogICAgICAgICBuZXdSZXF1ZXN0LT5tT3V0cHV0U3RyZWFtcy5wdXNoKHN0cmVhbSk7CiAgICAgfQpAQCAtMTQzMSw2ICsxNTk1LDE3IEBACiAgICAgcmV0dXJuIG5ld1JlcXVlc3Q7CiB9CiAKK2Jvb2wgQ2FtZXJhM0RldmljZTo6aXNPcGFxdWVJbnB1dFNpemVTdXBwb3J0ZWQodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgeworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtU3VwcG9ydGVkT3BhcXVlSW5wdXRTaXplcy5zaXplKCk7IGkrKykgeworICAgICAgICBTaXplIHNpemUgPSBtU3VwcG9ydGVkT3BhcXVlSW5wdXRTaXplc1tpXTsKKyAgICAgICAgaWYgKHNpemUud2lkdGggPT0gd2lkdGggJiYgc2l6ZS5oZWlnaHQgPT0gaGVpZ2h0KSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y29uZmlndXJlU3RyZWFtc0xvY2tlZCgpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0YXR1c190IHJlczsKQEAgLTE0NTgsNyArMTYzMyw5IEBACiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFN0YXJ0aW5nIHN0cmVhbSBjb25maWd1cmF0aW9uIiwgX19GVU5DVElPTl9fLCBtSWQpOwogCiAgICAgY2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbiBjb25maWc7Ci0KKyAgICBjb25maWcub3BlcmF0aW9uX21vZGUgPSBtSXNDb25zdHJhaW5lZEhpZ2hTcGVlZENvbmZpZ3VyYXRpb24gPworICAgICAgICAgICAgQ0FNRVJBM19TVFJFQU1fQ09ORklHVVJBVElPTl9DT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREUgOgorICAgICAgICAgICAgQ0FNRVJBM19TVFJFQU1fQ09ORklHVVJBVElPTl9OT1JNQUxfTU9ERTsKICAgICBjb25maWcubnVtX3N0cmVhbXMgPSAobUlucHV0U3RyZWFtICE9IE5VTEwpICsgbU91dHB1dFN0cmVhbXMuc2l6ZSgpOwogCiAgICAgVmVjdG9yPGNhbWVyYTNfc3RyZWFtX3QqPiBzdHJlYW1zOwpAQCAtMTUyOSw3ICsxNzA2LDcgQEAKIAogICAgICAgICAvLyBSZXR1cm4gc3RhdGUgdG8gdGhhdCBhdCBzdGFydCBvZiBjYWxsLCBzbyB0aGF0IGZ1dHVyZSBjb25maWd1cmVzCiAgICAgICAgIC8vIHByb3Blcmx5IGNsZWFuIHRoaW5ncyB1cAotICAgICAgICBtU3RhdHVzID0gU1RBVFVTX1VOQ09ORklHVVJFRDsKKyAgICAgICAgaW50ZXJuYWxVcGRhdGVTdGF0dXNMb2NrZWQoU1RBVFVTX1VOQ09ORklHVVJFRCk7CiAgICAgICAgIG1OZWVkQ29uZmlnID0gdHJ1ZTsKIAogICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogU3RyZWFtIGNvbmZpZ3VyYXRpb24gZmFpbGVkIiwgX19GVU5DVElPTl9fLCBtSWQpOwpAQCAtMTU3NiwxMSArMTc1Myw4IEBACiAKICAgICBtTmVlZENvbmZpZyA9IGZhbHNlOwogCi0gICAgaWYgKG1EdW1teVN0cmVhbUlkID09IE5PX1NUUkVBTSkgewotICAgICAgICBtU3RhdHVzID0gU1RBVFVTX0NPTkZJR1VSRUQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbVN0YXR1cyA9IFNUQVRVU19VTkNPTkZJR1VSRUQ7Ci0gICAgfQorICAgIGludGVybmFsVXBkYXRlU3RhdHVzTG9ja2VkKChtRHVtbXlTdHJlYW1JZCA9PSBOT19TVFJFQU0pID8KKyAgICAgICAgICAgIFNUQVRVU19DT05GSUdVUkVEIDogU1RBVFVTX1VOQ09ORklHVVJFRCk7CiAKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogU3RyZWFtIGNvbmZpZ3VyYXRpb24gY29tcGxldGUiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CiAKQEAgLTE2ODgsNyArMTg2Miw3IEBACiAgICAgbUVycm9yQ2F1c2UgPSBlcnJvckNhdXNlOwogCiAgICAgbVJlcXVlc3RUaHJlYWQtPnNldFBhdXNlZCh0cnVlKTsKLSAgICBtU3RhdHVzID0gU1RBVFVTX0VSUk9SOworICAgIGludGVybmFsVXBkYXRlU3RhdHVzTG9ja2VkKFNUQVRVU19FUlJPUik7CiAKICAgICAvLyBOb3RpZnkgdXBzdHJlYW0gYWJvdXQgYSBkZXZpY2UgZXJyb3IKICAgICBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKQEAgLTE3MDYsMTIgKzE4ODAsMTQgQEAKICAqLwogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpyZWdpc3RlckluRmxpZ2h0KHVpbnQzMl90IGZyYW1lTnVtYmVyLAotICAgICAgICBpbnQzMl90IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzLCBib29sIGhhc0lucHV0KSB7CisgICAgICAgIGludDMyX3QgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXMsIGJvb2wgaGFzSW5wdXQsCisgICAgICAgIGNvbnN0IEFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlX3QgJmFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5GbGlnaHRMb2NrKTsKIAogICAgIHNzaXplX3QgcmVzOwotICAgIHJlcyA9IG1JbkZsaWdodE1hcC5hZGQoZnJhbWVOdW1iZXIsIEluRmxpZ2h0UmVxdWVzdChudW1CdWZmZXJzLCByZXN1bHRFeHRyYXMsIGhhc0lucHV0KSk7CisgICAgcmVzID0gbUluRmxpZ2h0TWFwLmFkZChmcmFtZU51bWJlciwgSW5GbGlnaHRSZXF1ZXN0KG51bUJ1ZmZlcnMsIHJlc3VsdEV4dHJhcywgaGFzSW5wdXQsCisgICAgICAgICAgICBhZVRyaWdnZXJDYW5jZWxPdmVycmlkZSkpOwogICAgIGlmIChyZXMgPCAwKSByZXR1cm4gcmVzOwogCiAgICAgcmV0dXJuIE9LOwpAQCAtMTg4Nyw3ICsyMDYzLDYgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotCiB2b2lkIENhbWVyYTNEZXZpY2U6OnJldHVybk91dHB1dEJ1ZmZlcnMoCiAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpvdXRwdXRCdWZmZXJzLCBzaXplX3QgbnVtQnVmZmVycywKICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApIHsKQEAgLTE5NDYsOCArMjEyMSwxMiBAQAogCiAgICAgLy8gU2FuaXR5IGNoZWNrIC0gaWYgd2UgaGF2ZSB0b28gbWFueSBpbi1mbGlnaHQgZnJhbWVzLCBzb21ldGhpbmcgaGFzCiAgICAgLy8gbGlrZWx5IGdvbmUgd3JvbmcKLSAgICBpZiAobUluRmxpZ2h0TWFwLnNpemUoKSA+IGtJbkZsaWdodFdhcm5MaW1pdCkgeworICAgIGlmICghbUlzQ29uc3RyYWluZWRIaWdoU3BlZWRDb25maWd1cmF0aW9uICYmIG1JbkZsaWdodE1hcC5zaXplKCkgPiBrSW5GbGlnaHRXYXJuTGltaXQpIHsKICAgICAgICAgQ0xPR0UoIkluLWZsaWdodCBsaXN0IHRvbyBsYXJnZTogJXp1IiwgbUluRmxpZ2h0TWFwLnNpemUoKSk7CisgICAgfSBlbHNlIGlmIChtSXNDb25zdHJhaW5lZEhpZ2hTcGVlZENvbmZpZ3VyYXRpb24gJiYgbUluRmxpZ2h0TWFwLnNpemUoKSA+CisgICAgICAgICAgICBrSW5GbGlnaHRXYXJuTGltaXRIaWdoU3BlZWQpIHsKKyAgICAgICAgQ0xPR0UoIkluLWZsaWdodCBsaXN0IHRvbyBsYXJnZSBmb3IgaGlnaCBzcGVlZCBjb25maWd1cmF0aW9uOiAlenUiLAorICAgICAgICAgICAgICAgIG1JbkZsaWdodE1hcC5zaXplKCkpOwogICAgIH0KIH0KIApAQCAtMTk1NSwyMCArMjEzNCwzMiBAQAogdm9pZCBDYW1lcmEzRGV2aWNlOjpzZW5kQ2FwdHVyZVJlc3VsdChDYW1lcmFNZXRhZGF0YSAmcGVuZGluZ01ldGFkYXRhLAogICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzICZyZXN1bHRFeHRyYXMsCiAgICAgICAgIENhbWVyYU1ldGFkYXRhICZjb2xsZWN0ZWRQYXJ0aWFsUmVzdWx0LAotICAgICAgICB1aW50MzJfdCBmcmFtZU51bWJlcikgeworICAgICAgICB1aW50MzJfdCBmcmFtZU51bWJlciwKKyAgICAgICAgYm9vbCByZXByb2Nlc3MsCisgICAgICAgIGNvbnN0IEFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlX3QgJmFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlKSB7CiAgICAgaWYgKHBlbmRpbmdNZXRhZGF0YS5pc0VtcHR5KCkpCiAgICAgICAgIHJldHVybjsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsKG1PdXRwdXRMb2NrKTsKIAogICAgIC8vIFRPRE86IG5lZWQgdG8gdHJhY2sgZXJyb3JzIGZvciB0aWdodGVyIGJvdW5kcyBvbiBleHBlY3RlZCBmcmFtZSBudW1iZXIKLSAgICBpZiAoZnJhbWVOdW1iZXIgPCBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyKSB7Ci0gICAgICAgIFNFVF9FUlIoIk91dC1vZi1vcmRlciBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSBzdWJtaXR0ZWQhICIKKyAgICBpZiAocmVwcm9jZXNzKSB7CisgICAgICAgIGlmIChmcmFtZU51bWJlciA8IG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIpIHsKKyAgICAgICAgICAgIFNFVF9FUlIoIk91dC1vZi1vcmRlciByZXByb2Nlc3MgY2FwdHVyZSByZXN1bHQgbWV0YWRhdGEgc3VibWl0dGVkISAiCiAgICAgICAgICAgICAgICAgIihnb3QgZnJhbWUgbnVtYmVyICVkLCBleHBlY3RpbmcgJWQpIiwKLSAgICAgICAgICAgICAgICBmcmFtZU51bWJlciwgbU5leHRSZXN1bHRGcmFtZU51bWJlcik7Ci0gICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICBmcmFtZU51bWJlciwgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZnJhbWVOdW1iZXIgPCBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyKSB7CisgICAgICAgICAgICBTRVRfRVJSKCJPdXQtb2Ytb3JkZXIgY2FwdHVyZSByZXN1bHQgbWV0YWRhdGEgc3VibWl0dGVkISAiCisgICAgICAgICAgICAgICAgICAgICIoZ290IGZyYW1lIG51bWJlciAlZCwgZXhwZWN0aW5nICVkKSIsCisgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXIgKyAxOwogICAgIH0KLSAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXIgKyAxOwogCiAgICAgQ2FwdHVyZVJlc3VsdCBjYXB0dXJlUmVzdWx0OwogICAgIGNhcHR1cmVSZXN1bHQubVJlc3VsdEV4dHJhcyA9IHJlc3VsdEV4dHJhczsKQEAgLTIwMDAsNiArMjE5MSw4IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICBvdmVycmlkZVJlc3VsdEZvclByZWNhcHR1cmVDYW5jZWwoJmNhcHR1cmVSZXN1bHQubU1ldGFkYXRhLCBhZVRyaWdnZXJDYW5jZWxPdmVycmlkZSk7CisKICAgICAvLyBWYWxpZCByZXN1bHQsIGluc2VydCBpbnRvIHF1ZXVlCiAgICAgTGlzdDxDYXB0dXJlUmVzdWx0Pjo6aXRlcmF0b3IgcXVldWVkUmVzdWx0ID0KICAgICAgICAgICAgIG1SZXN1bHRRdWV1ZS5pbnNlcnQobVJlc3VsdFF1ZXVlLmVuZCgpLCBDYXB0dXJlUmVzdWx0KGNhcHR1cmVSZXN1bHQpKTsKQEAgLTIxNzgsNyArMjM3MSw4IEBACiAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGE7CiAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSByZXN1bHQtPnJlc3VsdDsKICAgICAgICAgICAgICAgICBzZW5kQ2FwdHVyZVJlc3VsdChtZXRhZGF0YSwgcmVxdWVzdC5yZXN1bHRFeHRyYXMsCi0gICAgICAgICAgICAgICAgICAgIGNvbGxlY3RlZFBhcnRpYWxSZXN1bHQsIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgY29sbGVjdGVkUGFydGlhbFJlc3VsdCwgZnJhbWVOdW1iZXIsIGhhc0lucHV0QnVmZmVySW5SZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yMzQwLDcgKzI1MzQsOCBAQAogCiAgICAgICAgICAgICAvLyBzZW5kIHBlbmRpbmcgcmVzdWx0IGFuZCBidWZmZXJzCiAgICAgICAgICAgICBzZW5kQ2FwdHVyZVJlc3VsdChyLnBlbmRpbmdNZXRhZGF0YSwgci5yZXN1bHRFeHRyYXMsCi0gICAgICAgICAgICAgICAgci5wYXJ0aWFsUmVzdWx0LmNvbGxlY3RlZFJlc3VsdCwgbXNnLmZyYW1lX251bWJlcik7CisgICAgICAgICAgICAgICAgci5wYXJ0aWFsUmVzdWx0LmNvbGxlY3RlZFJlc3VsdCwgbXNnLmZyYW1lX251bWJlciwKKyAgICAgICAgICAgICAgICByLmhhc0lucHV0QnVmZmVyLCByLmFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlKTsKICAgICAgICAgICAgIHJldHVybk91dHB1dEJ1ZmZlcnMoci5wZW5kaW5nT3V0cHV0QnVmZmVycy5hcnJheSgpLAogICAgICAgICAgICAgICAgIHIucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpLCByLnNodXR0ZXJUaW1lc3RhbXApOwogICAgICAgICAgICAgci5wZW5kaW5nT3V0cHV0QnVmZmVycy5jbGVhcigpOwpAQCAtMjM3NCw4ICsyNTY5LDkgQEAKIAogQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6UmVxdWVzdFRocmVhZCh3cDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQsCiAgICAgICAgIHNwPFN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIsCi0gICAgICAgIGNhbWVyYTNfZGV2aWNlX3QgKmhhbDNEZXZpY2UpIDoKLSAgICAgICAgVGhyZWFkKGZhbHNlKSwKKyAgICAgICAgY2FtZXJhM19kZXZpY2VfdCAqaGFsM0RldmljZSwKKyAgICAgICAgYm9vbCBhZUxvY2tBdmFpbGFibGUpIDoKKyAgICAgICAgVGhyZWFkKC8qY2FuQ2FsbEphdmEqL2ZhbHNlKSwKICAgICAgICAgbVBhcmVudChwYXJlbnQpLAogICAgICAgICBtU3RhdHVzVHJhY2tlcihzdGF0dXNUcmFja2VyKSwKICAgICAgICAgbUhhbDNEZXZpY2UoaGFsM0RldmljZSksCkBAIC0yMzg3LDExICsyNTgzLDEyIEBACiAgICAgICAgIG1MYXRlc3RSZXF1ZXN0SWQoTkFNRV9OT1RfRk9VTkQpLAogICAgICAgICBtQ3VycmVudEFmVHJpZ2dlcklkKDApLAogICAgICAgICBtQ3VycmVudFByZUNhcHR1cmVUcmlnZ2VySWQoMCksCi0gICAgICAgIG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXIoTk9fSU5fRkxJR0hUX1JFUEVBVElOR19GUkFNRVMpIHsKKyAgICAgICAgbVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlcihOT19JTl9GTElHSFRfUkVQRUFUSU5HX0ZSQU1FUyksCisgICAgICAgIG1BZUxvY2tBdmFpbGFibGUoYWVMb2NrQXZhaWxhYmxlKSB7CiAgICAgbVN0YXR1c0lkID0gc3RhdHVzVHJhY2tlci0+YWRkQ29tcG9uZW50KCk7CiB9CiAKLXZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6c2V0Tm90aWZ5Q2FsbGJhY2soCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnNldE5vdGlmaWNhdGlvbkxpc3RlbmVyKAogICAgICAgICBOb3RpZmljYXRpb25MaXN0ZW5lciAqbGlzdGVuZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOwogICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwpAQCAtMjUzMiw2ICsyNzI5LDIxIEBACiAgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKICAgICAgICAgZm9yIChSZXF1ZXN0TGlzdDo6aXRlcmF0b3IgaXQgPSBtUmVxdWVzdFF1ZXVlLmJlZ2luKCk7CiAgICAgICAgICAgICAgICAgIGl0ICE9IG1SZXF1ZXN0UXVldWUuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIC8vIEFib3J0IHRoZSBpbnB1dCBidWZmZXJzIGZvciByZXByb2Nlc3MgcmVxdWVzdHMuCisgICAgICAgICAgICBpZiAoKCppdCktPm1JbnB1dFN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QgaW5wdXRCdWZmZXI7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gKCppdCktPm1JbnB1dFN0cmVhbS0+Z2V0SW5wdXRCdWZmZXIoJmlucHV0QnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlczogJWQ6IGNvdWxkbid0IGdldCBpbnB1dCBidWZmZXIgd2hpbGUgY2xlYXJpbmcgdGhlIHJlcXVlc3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaXN0OiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gKCppdCktPm1JbnB1dFN0cmVhbS0+cmV0dXJuSW5wdXRCdWZmZXIoaW5wdXRCdWZmZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6ICVkOiBjb3VsZG4ndCByZXR1cm4gaW5wdXQgYnVmZmVyIHdoaWxlIGNsZWFyaW5nIHRoZSByZXF1ZXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpc3Q6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFNldCB0aGUgZnJhbWUgbnVtYmVyIHRoaXMgcmVxdWVzdCB3b3VsZCBoYXZlIGhhZCwgaWYgaXQKICAgICAgICAgICAgIC8vIGhhZCBiZWVuIHN1Ym1pdHRlZDsgdGhpcyBmcmFtZSBudW1iZXIgd2lsbCBub3QgYmUgcmV1c2VkLgogICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3RJZCBhbmQgYnVyc3RJZCBmaWVsZHMgd2VyZSBzZXQgd2hlbiB0aGUgcmVxdWVzdCB3YXMKQEAgLTI1ODAsNiArMjc5Miw2NSBAQAogICAgIG1SZXF1ZXN0U2lnbmFsLnNpZ25hbCgpOwogfQogCisKKy8qKgorICogRm9yIGRldmljZXMgPD0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIsIEFFX1BSRUNBUFRVUkVfVFJJR0dFUl9DQU5DRUwgaXMgbm90IHN1cHBvcnRlZCBzbworICogd2UgbmVlZCB0byBvdmVycmlkZSBBRV9QUkVDQVBUVVJFX1RSSUdHRVJfQ0FOQ0VMIHRvIEFFX1BSRUNBUFRVUkVfVFJJR0dFUl9JRExFIGFuZCBBRV9MT0NLX09GRgorICogdG8gQUVfTE9DS19PTiB0byBzdGFydCBjYW5jZWxsaW5nIEFFIHByZWNhcHR1cmUuIElmIEFFIGxvY2sgaXMgbm90IGF2YWlsYWJsZSwgaXQgc3RpbGwgb3ZlcnJpZGVzCisgKiBBRV9QUkVDQVBUVVJFX1RSSUdHRVJfQ0FOQ0VMIHRvIEFFX1BSRUNBUFRVUkVfVFJJR0dFUl9JRExFIGJ1dCBkb2Vzbid0IGFkZCBBRV9MT0NLX09OIHRvIHRoZQorICogcmVxdWVzdC4KKyAqLwordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpoYW5kbGVBZVByZWNhcHR1cmVDYW5jZWxSZXF1ZXN0KHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0KSB7CisgICAgcmVxdWVzdC0+bUFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlLmFwcGx5QWVMb2NrID0gZmFsc2U7CisgICAgcmVxdWVzdC0+bUFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlLmFwcGx5QWVQcmVjYXB0dXJlVHJpZ2dlciA9IGZhbHNlOworCisgICAgaWYgKG1IYWwzRGV2aWNlLT5jb21tb24udmVyc2lvbiA+IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBhZVByZWNhcHR1cmVUcmlnZ2VyID0KKyAgICAgICAgICAgIHJlcXVlc3QtPm1TZXR0aW5ncy5maW5kKEFORFJPSURfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX1RSSUdHRVIpOworICAgIGlmIChhZVByZWNhcHR1cmVUcmlnZ2VyLmNvdW50ID4gMCAmJgorICAgICAgICAgICAgYWVQcmVjYXB0dXJlVHJpZ2dlci5kYXRhLnU4WzBdID09IEFORFJPSURfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX1RSSUdHRVJfQ0FOQ0VMKSB7CisgICAgICAgIC8vIEFsd2F5cyBvdmVycmlkZSBDQU5DRUwgdG8gSURMRQorICAgICAgICB1aW50OF90IGFlUHJlY2FwdHVyZVRyaWdnZXIgPSBBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9UUklHR0VSX0lETEU7CisgICAgICAgIHJlcXVlc3QtPm1TZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FFX1BSRUNBUFRVUkVfVFJJR0dFUiwgJmFlUHJlY2FwdHVyZVRyaWdnZXIsIDEpOworICAgICAgICByZXF1ZXN0LT5tQWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGUuYXBwbHlBZVByZWNhcHR1cmVUcmlnZ2VyID0gdHJ1ZTsKKyAgICAgICAgcmVxdWVzdC0+bUFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlLmFlUHJlY2FwdHVyZVRyaWdnZXIgPQorICAgICAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX1RSSUdHRVJfQ0FOQ0VMOworCisgICAgICAgIGlmIChtQWVMb2NrQXZhaWxhYmxlID09IHRydWUpIHsKKyAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGFlTG9jayA9IHJlcXVlc3QtPm1TZXR0aW5ncy5maW5kKEFORFJPSURfQ09OVFJPTF9BRV9MT0NLKTsKKyAgICAgICAgICAgIGlmIChhZUxvY2suY291bnQgPT0gMCB8fCAgYWVMb2NrLmRhdGEudThbMF0gPT0gQU5EUk9JRF9DT05UUk9MX0FFX0xPQ0tfT0ZGKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCBhZUxvY2sgPSBBTkRST0lEX0NPTlRST0xfQUVfTE9DS19PTjsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LT5tU2V0dGluZ3MudXBkYXRlKEFORFJPSURfQ09OVFJPTF9BRV9MT0NLLCAmYWVMb2NrLCAxKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LT5tQWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGUuYXBwbHlBZUxvY2sgPSB0cnVlOworICAgICAgICAgICAgICAgIHJlcXVlc3QtPm1BZVRyaWdnZXJDYW5jZWxPdmVycmlkZS5hZUxvY2sgPSBBTkRST0lEX0NPTlRST0xfQUVfTE9DS19PRkY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogT3ZlcnJpZGUgcmVzdWx0IG1ldGFkYXRhIGZvciBjYW5jZWxsaW5nIEFFIHByZWNhcHR1cmUgdHJpZ2dlciBhcHBsaWVkIGluCisgKiBoYW5kbGVBZVByZWNhcHR1cmVDYW5jZWxSZXF1ZXN0KCkuCisgKi8KK3ZvaWQgQ2FtZXJhM0RldmljZTo6b3ZlcnJpZGVSZXN1bHRGb3JQcmVjYXB0dXJlQ2FuY2VsKAorICAgICAgICBDYW1lcmFNZXRhZGF0YSAqcmVzdWx0LCBjb25zdCBBZVRyaWdnZXJDYW5jZWxPdmVycmlkZV90ICZhZVRyaWdnZXJDYW5jZWxPdmVycmlkZSkgeworICAgIGlmIChhZVRyaWdnZXJDYW5jZWxPdmVycmlkZS5hcHBseUFlTG9jaykgeworICAgICAgICAvLyBPbmx5IGRldmljZXMgPD0gdjMuMiBzaG91bGQgaGF2ZSB0aGlzIG92ZXJyaWRlCisgICAgICAgIGFzc2VydChtRGV2aWNlVmVyc2lvbiA8PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMik7CisgICAgICAgIHJlc3VsdC0+dXBkYXRlKEFORFJPSURfQ09OVFJPTF9BRV9MT0NLLCAmYWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGUuYWVMb2NrLCAxKTsKKyAgICB9CisKKyAgICBpZiAoYWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGUuYXBwbHlBZVByZWNhcHR1cmVUcmlnZ2VyKSB7CisgICAgICAgIC8vIE9ubHkgZGV2aWNlcyA8PSB2My4yIHNob3VsZCBoYXZlIHRoaXMgb3ZlcnJpZGUKKyAgICAgICAgYXNzZXJ0KG1EZXZpY2VWZXJzaW9uIDw9IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKTsKKyAgICAgICAgcmVzdWx0LT51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FFX1BSRUNBUFRVUkVfVFJJR0dFUiwKKyAgICAgICAgICAgICAgICAmYWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGUuYWVQcmVjYXB0dXJlVHJpZ2dlciwgMSk7CisgICAgfQorfQorCiBib29sIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnRocmVhZExvb3AoKSB7CiAKICAgICBzdGF0dXNfdCByZXM7CkBAIC0yNjcxLDI5ICsyOTQyLDExIEBACiAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwogICAgIH0KIAotICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90IGlucHV0QnVmZmVyOwogICAgIHVpbnQzMl90IHRvdGFsTnVtQnVmZmVycyA9IDA7CiAKICAgICAvLyBGaWxsIGluIGJ1ZmZlcnMKLQogICAgIGlmIChuZXh0UmVxdWVzdC0+bUlucHV0U3RyZWFtICE9IE5VTEwpIHsKLSAgICAgICAgcmVxdWVzdC5pbnB1dF9idWZmZXIgPSAmaW5wdXRCdWZmZXI7Ci0gICAgICAgIHJlcyA9IG5leHRSZXF1ZXN0LT5tSW5wdXRTdHJlYW0tPmdldElucHV0QnVmZmVyKCZpbnB1dEJ1ZmZlcik7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIC8vIENhbid0IGdldCBpbnB1dCBidWZmZXIgZnJvbSBncmFsbG9jIHF1ZXVlIC0gdGhpcyBjb3VsZCBiZSBkdWUgdG8KLSAgICAgICAgICAgIC8vIGRpc2Nvbm5lY3RlZCBxdWV1ZSBvciBvdGhlciBwcm9kdWNlciBtaXNiZWhhdmlvciwgc28gbm90IGEgZmF0YWwKLSAgICAgICAgICAgIC8vIGVycm9yCi0gICAgICAgICAgICBBTE9HRSgiUmVxdWVzdFRocmVhZDogQ2FuJ3QgZ2V0IGlucHV0IGJ1ZmZlciwgc2tpcHBpbmcgcmVxdWVzdDoiCi0gICAgICAgICAgICAgICAgICAgICIgJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKLSAgICAgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1MaXN0ZW5lci0+bm90aWZ5RXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsZWFuVXBGYWlsZWRSZXF1ZXN0KHJlcXVlc3QsIG5leHRSZXF1ZXN0LCBvdXRwdXRCdWZmZXJzKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9CisgICAgICAgIHJlcXVlc3QuaW5wdXRfYnVmZmVyID0gJm5leHRSZXF1ZXN0LT5tSW5wdXRCdWZmZXI7CiAgICAgICAgIHRvdGFsTnVtQnVmZmVycyArPSAxOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJlcXVlc3QuaW5wdXRfYnVmZmVyID0gTlVMTDsKQEAgLTI3MTEsMTEgKzI5NjQsMTMgQEAKICAgICAgICAgICAgIC8vIGVycm9yCiAgICAgICAgICAgICBBTE9HRSgiUmVxdWVzdFRocmVhZDogQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIsIHNraXBwaW5nIHJlcXVlc3Q6IgogICAgICAgICAgICAgICAgICAgICAiICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7Ci0gICAgICAgICAgICBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtTGlzdGVuZXItPm5vdGlmeUVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFUVVFU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcyk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKKyAgICAgICAgICAgICAgICBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLT5ub3RpZnlFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVRVUVTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcyk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2xlYW5VcEZhaWxlZFJlcXVlc3QocmVxdWVzdCwgbmV4dFJlcXVlc3QsIG91dHB1dEJ1ZmZlcnMpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0yNzM1LDcgKzI5OTAsOCBAQAogCiAgICAgcmVzID0gcGFyZW50LT5yZWdpc3RlckluRmxpZ2h0KHJlcXVlc3QuZnJhbWVfbnVtYmVyLAogICAgICAgICAgICAgdG90YWxOdW1CdWZmZXJzLCBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcywKLSAgICAgICAgICAgIC8qaGFzSW5wdXQqL3JlcXVlc3QuaW5wdXRfYnVmZmVyICE9IE5VTEwpOworICAgICAgICAgICAgLypoYXNJbnB1dCovcmVxdWVzdC5pbnB1dF9idWZmZXIgIT0gTlVMTCwKKyAgICAgICAgICAgIG5leHRSZXF1ZXN0LT5tQWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGUpOwogICAgIEFMT0dWVigiJXM6IHJlZ2lzdGVyZWQgaW4gZmxpZ2h0IHJlcXVlc3RJZCA9ICUiIFBSSWQzMiAiLCBmcmFtZU51bWJlciA9ICUiIFBSSWQ2NAogICAgICAgICAgICAiLCBidXJzdElkID0gJSIgUFJJZDMyICIuIiwKICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKQEAgLTI3ODQsNiArMzA0MCwxMiBAQAogICAgICAgICBuZXh0UmVxdWVzdC0+bVNldHRpbmdzLnVubG9jayhyZXF1ZXN0LnNldHRpbmdzKTsKICAgICB9CiAKKyAgICAvLyBVbnNldCBhcyBjdXJyZW50IHJlcXVlc3QKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CisgICAgICAgIG1OZXh0UmVxdWVzdC5jbGVhcigpOworICAgIH0KKwogICAgIC8vIFJlbW92ZSBhbnkgcHJldmlvdXNseSBxdWV1ZWQgdHJpZ2dlcnMgKGFmdGVyIHVubG9jaykKICAgICByZXMgPSByZW1vdmVUcmlnZ2VycyhtUHJldlJlcXVlc3QpOwogICAgIGlmIChyZXMgIT0gT0spIHsKQEAgLTI4MDUsNiArMzA2NywzMyBAQAogICAgIHJldHVybiBtTGF0ZXN0UmVxdWVzdDsKIH0KIAorYm9vbCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjppc1N0cmVhbVBlbmRpbmcoCisgICAgICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+JiBzdHJlYW0pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOworCisgICAgaWYgKG1OZXh0UmVxdWVzdCAhPSBudWxscHRyKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcyA6IG1OZXh0UmVxdWVzdC0+bU91dHB1dFN0cmVhbXMpIHsKKyAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gcykgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmVhbSA9PSBtTmV4dFJlcXVlc3QtPm1JbnB1dFN0cmVhbSkgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvJiByZXF1ZXN0IDogbVJlcXVlc3RRdWV1ZSkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHMgOiByZXF1ZXN0LT5tT3V0cHV0U3RyZWFtcykgeworICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBzKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyZWFtID09IHJlcXVlc3QtPm1JbnB1dFN0cmVhbSkgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvJiByZXF1ZXN0IDogbVJlcGVhdGluZ1JlcXVlc3RzKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcyA6IHJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zKSB7CisgICAgICAgICAgICBpZiAoc3RyZWFtID09IHMpIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJlYW0gPT0gcmVxdWVzdC0+bUlucHV0U3RyZWFtKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6Y2xlYW5VcEZhaWxlZFJlcXVlc3QoCiAgICAgICAgIGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QgJnJlcXVlc3QsCkBAIC0yODE0LDE1ICszMTAzLDE4IEBACiAgICAgaWYgKHJlcXVlc3Quc2V0dGluZ3MgIT0gTlVMTCkgewogICAgICAgICBuZXh0UmVxdWVzdC0+bVNldHRpbmdzLnVubG9jayhyZXF1ZXN0LnNldHRpbmdzKTsKICAgICB9Ci0gICAgaWYgKHJlcXVlc3QuaW5wdXRfYnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgcmVxdWVzdC5pbnB1dF9idWZmZXItPnN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUjsKLSAgICAgICAgbmV4dFJlcXVlc3QtPm1JbnB1dFN0cmVhbS0+cmV0dXJuSW5wdXRCdWZmZXIoKihyZXF1ZXN0LmlucHV0X2J1ZmZlcikpOworICAgIGlmIChuZXh0UmVxdWVzdC0+bUlucHV0U3RyZWFtICE9IE5VTEwpIHsKKyAgICAgICAgbmV4dFJlcXVlc3QtPm1JbnB1dEJ1ZmZlci5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7CisgICAgICAgIG5leHRSZXF1ZXN0LT5tSW5wdXRTdHJlYW0tPnJldHVybklucHV0QnVmZmVyKG5leHRSZXF1ZXN0LT5tSW5wdXRCdWZmZXIpOwogICAgIH0KICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcXVlc3QubnVtX291dHB1dF9idWZmZXJzOyBpKyspIHsKICAgICAgICAgb3V0cHV0QnVmZmVycy5lZGl0SXRlbUF0KGkpLnN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUjsKICAgICAgICAgbmV4dFJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLmVkaXRJdGVtQXQoaSktPnJldHVybkJ1ZmZlcigKICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnNbaV0sIDApOwogICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CisgICAgbU5leHRSZXF1ZXN0LmNsZWFyKCk7CiB9CiAKIHNwPENhbWVyYTNEZXZpY2U6OkNhcHR1cmVSZXF1ZXN0PgpAQCAtMjkwNSw3ICszMTk3LDMxIEBACiAgICAgICAgIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyID0gbUZyYW1lTnVtYmVyKys7CiAgICAgICAgIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmFmVHJpZ2dlcklkID0gbUN1cnJlbnRBZlRyaWdnZXJJZDsKICAgICAgICAgbmV4dFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMucHJlY2FwdHVyZVRyaWdnZXJJZCA9IG1DdXJyZW50UHJlQ2FwdHVyZVRyaWdnZXJJZDsKKworICAgICAgICAvLyBTaW5jZSBSZXF1ZXN0VGhyZWFkOjpjbGVhcigpIHJlbW92ZXMgYnVmZmVycyBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sCisgICAgICAgIC8vIGdldCB0aGUgcmlnaHQgYnVmZmVyIGhlcmUgYmVmb3JlIHVubG9ja2luZyBtUmVxdWVzdExvY2sKKyAgICAgICAgaWYgKG5leHRSZXF1ZXN0LT5tSW5wdXRTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICAgICAgcmVzID0gbmV4dFJlcXVlc3QtPm1JbnB1dFN0cmVhbS0+Z2V0SW5wdXRCdWZmZXIoJm5leHRSZXF1ZXN0LT5tSW5wdXRCdWZmZXIpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIC8vIENhbid0IGdldCBpbnB1dCBidWZmZXIgZnJvbSBncmFsbG9jIHF1ZXVlIC0gdGhpcyBjb3VsZCBiZSBkdWUgdG8KKyAgICAgICAgICAgICAgICAvLyBkaXNjb25uZWN0ZWQgcXVldWUgb3Igb3RoZXIgcHJvZHVjZXIgbWlzYmVoYXZpb3IsIHNvIG5vdCBhIGZhdGFsCisgICAgICAgICAgICAgICAgLy8gZXJyb3IKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbid0IGdldCBpbnB1dCBidWZmZXIsIHNraXBwaW5nIHJlcXVlc3Q6IgorICAgICAgICAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLT5ub3RpZnlFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVRVUVTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQorCisgICAgaGFuZGxlQWVQcmVjYXB0dXJlQ2FuY2VsUmVxdWVzdChuZXh0UmVxdWVzdCk7CisKKyAgICBtTmV4dFJlcXVlc3QgPSBuZXh0UmVxdWVzdDsKKwogICAgIHJldHVybiBuZXh0UmVxdWVzdDsKIH0KIApAQCAtMzE1Miw2ICszNDY4LDEzOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorLyoqCisgKiBQcmVwYXJlclRocmVhZCBpbm5lciBjbGFzcyBtZXRob2RzCisgKi8KKworQ2FtZXJhM0RldmljZTo6UHJlcGFyZXJUaHJlYWQ6OlByZXBhcmVyVGhyZWFkKCkgOgorICAgICAgICBUaHJlYWQoLypjYW5DYWxsSmF2YSovZmFsc2UpLCBtQWN0aXZlKGZhbHNlKSwgbUNhbmNlbE5vdyhmYWxzZSkgeworfQorCitDYW1lcmEzRGV2aWNlOjpQcmVwYXJlclRocmVhZDo6flByZXBhcmVyVGhyZWFkKCkgeworICAgIFRocmVhZDo6cmVxdWVzdEV4aXRBbmRXYWl0KCk7CisgICAgaWYgKG1DdXJyZW50U3RyZWFtICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUN1cnJlbnRTdHJlYW0tPmNhbmNlbFByZXBhcmUoKTsKKyAgICAgICAgQVRSQUNFX0FTWU5DX0VORCgic3RyZWFtIHByZXBhcmUiLCBtQ3VycmVudFN0cmVhbS0+Z2V0SWQoKSk7CisgICAgICAgIG1DdXJyZW50U3RyZWFtLmNsZWFyKCk7CisgICAgfQorICAgIGNsZWFyKCk7Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OlByZXBhcmVyVGhyZWFkOjpwcmVwYXJlKHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+JiBzdHJlYW0pIHsKKyAgICBzdGF0dXNfdCByZXM7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICByZXMgPSBzdHJlYW0tPnN0YXJ0UHJlcGFyZSgpOworICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgLy8gTm8gcHJlcGFyYXRpb24gbmVlZGVkLCBmaXJlIGxpc3RlbmVyIHJpZ2h0IG9mZgorICAgICAgICBBTE9HVigiJXM6IFN0cmVhbSAlZCBhbHJlYWR5IHByZXBhcmVkIiwgX19GVU5DVElPTl9fLCBzdHJlYW0tPmdldElkKCkpOworICAgICAgICBpZiAobUxpc3RlbmVyKSB7CisgICAgICAgICAgICBtTGlzdGVuZXItPm5vdGlmeVByZXBhcmVkKHN0cmVhbS0+Z2V0SWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSBpZiAocmVzICE9IE5PVF9FTk9VR0hfREFUQSkgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIE5lZWQgdG8gcHJlcGFyZSwgc3RhcnQgdXAgdGhyZWFkIGlmIG5lY2Vzc2FyeQorICAgIGlmICghbUFjdGl2ZSkgeworICAgICAgICAvLyBtUnVubmluZyB3aWxsIGNoYW5nZSB0byBmYWxzZSBiZWZvcmUgdGhlIHRocmVhZCBmdWxseSBzaHV0cyBkb3duLCBzbyB3YWl0IHRvIGJlIHN1cmUgaXQKKyAgICAgICAgLy8gaXNuJ3QgcnVubmluZworICAgICAgICBUaHJlYWQ6OnJlcXVlc3RFeGl0QW5kV2FpdCgpOworICAgICAgICByZXMgPSBUaHJlYWQ6OnJ1bigiQzNQcmVwVGhyZWFkIiwgUFJJT1JJVFlfQkFDS0dST1VORCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHN0YXJ0IHByZXBhcmVyIHN0cmVhbTogJWQgKCVzKSIsIF9fRlVOQ1RJT05fXywgcmVzLCBzdHJlcnJvcigtcmVzKSk7CisgICAgICAgICAgICBpZiAobUxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgbUxpc3RlbmVyLT5ub3RpZnlQcmVwYXJlZChzdHJlYW0tPmdldElkKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBtQ2FuY2VsTm93ID0gZmFsc2U7CisgICAgICAgIG1BY3RpdmUgPSB0cnVlOworICAgICAgICBBTE9HVigiJXM6IFByZXBhcmVyIHN0cmVhbSBzdGFydGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICB9CisKKyAgICAvLyBxdWV1ZSB1cCB0aGUgd29yaworICAgIG1QZW5kaW5nU3RyZWFtcy5wdXNoX2JhY2soc3RyZWFtKTsKKyAgICBBTE9HVigiJXM6IFN0cmVhbSAlZCBxdWV1ZWQgZm9yIHByZXBhcmluZyIsIF9fRlVOQ1RJT05fXywgc3RyZWFtLT5nZXRJZCgpKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UHJlcGFyZXJUaHJlYWQ6OmNsZWFyKCkgeworICAgIHN0YXR1c190IHJlczsKKworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKworICAgIGZvciAoY29uc3QgYXV0byYgc3RyZWFtIDogbVBlbmRpbmdTdHJlYW1zKSB7CisgICAgICAgIHN0cmVhbS0+Y2FuY2VsUHJlcGFyZSgpOworICAgIH0KKyAgICBtUGVuZGluZ1N0cmVhbXMuY2xlYXIoKTsKKyAgICBtQ2FuY2VsTm93ID0gdHJ1ZTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpQcmVwYXJlclRocmVhZDo6c2V0Tm90aWZpY2F0aW9uTGlzdGVuZXIoTm90aWZpY2F0aW9uTGlzdGVuZXIgKmxpc3RlbmVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworfQorCitib29sIENhbWVyYTNEZXZpY2U6OlByZXBhcmVyVGhyZWFkOjp0aHJlYWRMb29wKCkgeworICAgIHN0YXR1c190IHJlczsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1DdXJyZW50U3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIEVuZCB0aHJlYWQgaWYgZG9uZSB3aXRoIHdvcmsKKyAgICAgICAgICAgIGlmIChtUGVuZGluZ1N0cmVhbXMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlczogUHJlcGFyZXIgc3RyZWFtIG91dCBvZiB3b3JrIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAvLyB0aHJlYWRMb29wIF9tdXN0IG5vdF8gcmUtYWNxdWlyZSBtTG9jayBhZnRlciBpdCBzZXRzIG1BY3RpdmUgdG8gZmFsc2U7IHdvdWxkCisgICAgICAgICAgICAgICAgLy8gY2F1c2UgZGVhZGxvY2sgd2l0aCBwcmVwYXJlKCkncyByZXF1ZXN0RXhpdEFuZFdhaXQgdHJpZ2dlcmVkIGJ5ICFtQWN0aXZlLgorICAgICAgICAgICAgICAgIG1BY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEdldCBuZXh0IHN0cmVhbSB0byBwcmVwYXJlCisgICAgICAgICAgICBhdXRvIGl0ID0gbVBlbmRpbmdTdHJlYW1zLmJlZ2luKCk7CisgICAgICAgICAgICBtQ3VycmVudFN0cmVhbSA9ICppdDsKKyAgICAgICAgICAgIG1QZW5kaW5nU3RyZWFtcy5lcmFzZShpdCk7CisgICAgICAgICAgICBBVFJBQ0VfQVNZTkNfQkVHSU4oInN0cmVhbSBwcmVwYXJlIiwgbUN1cnJlbnRTdHJlYW0tPmdldElkKCkpOworICAgICAgICAgICAgQUxPR1YoIiVzOiBQcmVwYXJpbmcgc3RyZWFtICVkIiwgX19GVU5DVElPTl9fLCBtQ3VycmVudFN0cmVhbS0+Z2V0SWQoKSk7CisgICAgICAgIH0gZWxzZSBpZiAobUNhbmNlbE5vdykgeworICAgICAgICAgICAgbUN1cnJlbnRTdHJlYW0tPmNhbmNlbFByZXBhcmUoKTsKKyAgICAgICAgICAgIEFUUkFDRV9BU1lOQ19FTkQoInN0cmVhbSBwcmVwYXJlIiwgbUN1cnJlbnRTdHJlYW0tPmdldElkKCkpOworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW5jZWxsaW5nIHN0cmVhbSAlZCBwcmVwYXJlIiwgX19GVU5DVElPTl9fLCBtQ3VycmVudFN0cmVhbS0+Z2V0SWQoKSk7CisgICAgICAgICAgICBtQ3VycmVudFN0cmVhbS5jbGVhcigpOworICAgICAgICAgICAgbUNhbmNlbE5vdyA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXMgPSBtQ3VycmVudFN0cmVhbS0+cHJlcGFyZU5leHRCdWZmZXIoKTsKKyAgICBpZiAocmVzID09IE5PVF9FTk9VR0hfREFUQSkgcmV0dXJuIHRydWU7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAvLyBTb21ldGhpbmcgYmFkIGhhcHBlbmVkOyB0cnkgdG8gcmVjb3ZlciBieSBjYW5jZWxsaW5nIHByZXBhcmUgYW5kCisgICAgICAgIC8vIHNpZ25hbGxpbmcgbGlzdGVuZXIgYW55d2F5CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkIHJldHVybmVkIGVycm9yICVkICglcykgZHVyaW5nIHByZXBhcmUiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgbUN1cnJlbnRTdHJlYW0tPmdldElkKCksIHJlcywgc3RyZXJyb3IoLXJlcykpOworICAgICAgICBtQ3VycmVudFN0cmVhbS0+Y2FuY2VsUHJlcGFyZSgpOworICAgIH0KKworICAgIC8vIFRoaXMgc3RyZWFtIGhhcyBmaW5pc2hlZCwgbm90aWZ5IGxpc3RlbmVyCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIGlmIChtTGlzdGVuZXIpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBTdHJlYW0gJWQgcHJlcGFyZSBkb25lLCBzaWduYWxpbmcgbGlzdGVuZXIiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgbUN1cnJlbnRTdHJlYW0tPmdldElkKCkpOworICAgICAgICBtTGlzdGVuZXItPm5vdGlmeVByZXBhcmVkKG1DdXJyZW50U3RyZWFtLT5nZXRJZCgpKTsKKyAgICB9CisKKyAgICBBVFJBQ0VfQVNZTkNfRU5EKCJzdHJlYW0gcHJlcGFyZSIsIG1DdXJyZW50U3RyZWFtLT5nZXRJZCgpKTsKKyAgICBtQ3VycmVudFN0cmVhbS5jbGVhcigpOworCisgICAgcmV0dXJuIHRydWU7Cit9CiAKIC8qKgogICogU3RhdGljIGNhbGxiYWNrIGZvcndhcmRpbmcgbWV0aG9kcyBmcm9tIEhBTCB0byBpbnN0YW5jZQpAQCAtMzE2MSw2ICszNjA5LDcgQEAKICAgICAgICAgY29uc3QgY2FtZXJhM19jYXB0dXJlX3Jlc3VsdCAqcmVzdWx0KSB7CiAgICAgQ2FtZXJhM0RldmljZSAqZCA9CiAgICAgICAgICAgICBjb25zdF9jYXN0PENhbWVyYTNEZXZpY2UqPihzdGF0aWNfY2FzdDxjb25zdCBDYW1lcmEzRGV2aWNlKj4oY2IpKTsKKwogICAgIGQtPnByb2Nlc3NDYXB0dXJlUmVzdWx0KHJlc3VsdCk7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgKaW5kZXggZWM4ZGMxMC4uNTI4NzA1OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgKQEAgLTczLDcgKzczLDcgQEAKICAgICB2aXJ0dWFsIGludCAgICAgIGdldElkKCkgY29uc3Q7CiAKICAgICAvLyBUcmFuc2l0aW9ucyB0byBpZGxlIHN0YXRlIG9uIHN1Y2Nlc3MuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKGNhbWVyYV9tb2R1bGVfdCAqbW9kdWxlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemUoQ2FtZXJhTW9kdWxlICptb2R1bGUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY29ubmVjdCgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpOwogICAgIHZpcnR1YWwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGluZm8oKSBjb25zdDsKQEAgLTk0LDggKzk0LDkgQEAKICAgICAvLyBBY3R1YWwgc3RyZWFtIGNyZWF0aW9uL2RlbGV0aW9uIGlzIGRlbGF5ZWQgdW50aWwgZmlyc3QgcmVxdWVzdCBpcyBzdWJtaXR0ZWQKICAgICAvLyBJZiBhZGRpbmcgc3RyZWFtcyB3aGlsZSBhY3RpdmVseSBjYXB0dXJpbmcsIHdpbGwgcGF1c2UgZGV2aWNlIGJlZm9yZSBhZGRpbmcKICAgICAvLyBzdHJlYW0sIHJlY29uZmlndXJpbmcgZGV2aWNlLCBhbmQgdW5wYXVzaW5nLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlU3RyZWFtKHNwPEFOYXRpdmVXaW5kb3c+IGNvbnN1bWVyLAotICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwgaW50ICppZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVTdHJlYW0oc3A8U3VyZmFjZT4gY29uc3VtZXIsCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAorICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUlucHV0U3RyZWFtKAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKICAgICAgICAgICAgIGludCAqaWQpOwpAQCAtMTA4LDEzICsxMDksMTYgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVJlcHJvY2Vzc1N0cmVhbUZyb21TdHJlYW0oaW50IG91dHB1dElkLCBpbnQgKmlkKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3RyZWFtSW5mbyhpbnQgaWQsCi0gICAgICAgICAgICB1aW50MzJfdCAqd2lkdGgsIHVpbnQzMl90ICpoZWlnaHQsIHVpbnQzMl90ICpmb3JtYXQpOworICAgICAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LAorICAgICAgICAgICAgdWludDMyX3QgKmZvcm1hdCwgYW5kcm9pZF9kYXRhc3BhY2UgKmRhdGFTcGFjZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1UcmFuc2Zvcm0oaW50IGlkLCBpbnQgdHJhbnNmb3JtKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVsZXRlU3RyZWFtKGludCBpZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZWxldGVSZXByb2Nlc3NTdHJlYW0oaW50IGlkKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtcygpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtcyhib29sIGlzQ29uc3RyYWllZEhpZ2hTcGVlZCA9IGZhbHNlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyUHJvZHVjZXIoCisgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqcHJvZHVjZXIpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVEZWZhdWx0UmVxdWVzdChpbnQgdGVtcGxhdGVJZCwgQ2FtZXJhTWV0YWRhdGEgKnJlcXVlc3QpOwogCkBAIC0xMzUsOSArMTM5LDE0IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlKGludCBzdHJlYW1JZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHRlYXJEb3duKGludCBzdHJlYW1JZCk7CisKICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldERldmljZVZlcnNpb24oKTsKIAogICAgIHZpcnR1YWwgc3NpemVfdCBnZXRKcGVnQnVmZmVyU2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSBjb25zdDsKKyAgICBzc2l6ZV90IGdldFBvaW50Q2xvdWRCdWZmZXJTaXplKCkgY29uc3Q7CiAKICAgICAvLyBNZXRob2RzIGNhbGxlZCBieSBzdWJjbGFzc2VzCiAgICAgdm9pZCAgICAgICAgICAgICBub3RpZnlTdGF0dXMoYm9vbCBpZGxlKTsgLy8gdXBkYXRlcyBmcm9tIFN0YXR1c1RyYWNrZXIKQEAgLTE0NSw5ICsxNTQsMTEgQEAKICAgcHJpdmF0ZToKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90ICAgICAgICBrRHVtcExvY2tBdHRlbXB0cyAgPSAxMDsKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90ICAgICAgICBrRHVtcFNsZWVwRHVyYXRpb24gPSAxMDAwMDA7IC8vIDAuMTAgc2VjCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCAgICAgICAga0luRmxpZ2h0V2FybkxpbWl0ID0gMjA7CiAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3QgICAgICAga1NodXRkb3duVGltZW91dCAgID0gNTAwMDAwMDAwMDsgLy8gNSBzZWMKICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCAgICAgICBrQWN0aXZlVGltZW91dCAgICAgPSA1MDAwMDAwMDA7ICAvLyA1MDAgbXMKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90ICAgICAgICBrSW5GbGlnaHRXYXJuTGltaXQgPSAyMDsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90ICAgICAgICBrSW5GbGlnaHRXYXJuTGltaXRIaWdoU3BlZWQgPSAyNTY7IC8vIGJhdGNoIHNpemUgMzIgKiBwaXBlIGRlcHRoIDgKKwogICAgIHN0cnVjdCAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RUcmlnZ2VyOwogICAgIC8vIG1pbmltYWwganBlZyBidWZmZXIgc2l6ZTogMjU2S0IgKyBibG9iIGhlYWRlcgogICAgIHN0YXRpYyBjb25zdCBzc2l6ZV90ICAgICAgIGtNaW5KcGVnQnVmZmVyU2l6ZSA9IDI1NiAqIDEwMjQgKyBzaXplb2YoY2FtZXJhM19qcGVnX2Jsb2IpOwpAQCAtMTY4LDYgKzE3OSw5IEBACiAgICAgLy8gQ2FtZXJhIGRldmljZSBJRAogICAgIGNvbnN0IGludCAgICAgICAgICAgICAgICAgIG1JZDsKIAorICAgIC8vIEZsYWcgaW5kaWNhdGluZyBpcyB0aGUgY3VycmVudCBhY3RpdmUgc3RyZWFtIGNvbmZpZ3VyYXRpb24gaXMgY29uc3RyYWluZWQgaGlnaCBzcGVlZC4KKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICBtSXNDb25zdHJhaW5lZEhpZ2hTcGVlZENvbmZpZ3VyYXRpb247CisKICAgICAvKioqKiBTY29wZSBmb3IgbUxvY2sgKioqKi8KIAogICAgIGNhbWVyYTNfZGV2aWNlX3QgICAgICAgICAgKm1IYWwzRGV2aWNlOwpAQCAtMTc4LDYgKzE5MiwxNCBAQAogCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgbURldmljZVZlcnNpb247CiAKKyAgICBzdHJ1Y3QgU2l6ZSB7CisgICAgICAgIHVpbnQzMl90IHdpZHRoOworICAgICAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgICAgIFNpemUodWludDMyX3QgdyA9IDAsIHVpbnQzMl90IGggPSAwKSA6IHdpZHRoKHcpLCBoZWlnaHQoaCl7fQorICAgIH07CisgICAgLy8gTWFwIGZyb20gZm9ybWF0IHRvIHNpemUuCisgICAgVmVjdG9yPFNpemU+ICAgICAgICAgICAgICAgbVN1cHBvcnRlZE9wYXF1ZUlucHV0U2l6ZXM7CisKICAgICBlbnVtIFN0YXR1cyB7CiAgICAgICAgIFNUQVRVU19FUlJPUiwKICAgICAgICAgU1RBVFVTX1VOSU5JVElBTElaRUQsCkBAIC0xODUsNyArMjA3LDExIEBACiAgICAgICAgIFNUQVRVU19DT05GSUdVUkVELAogICAgICAgICBTVEFUVVNfQUNUSVZFCiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1czsKKworICAgIC8vIE9ubHkgY2xlYXIgbVJlY2VudFN0YXR1c1VwZGF0ZXMsIG1TdGF0dXNXYWl0ZXJzIGZyb20gd2FpdFVudGlsU3RhdGVUaGVuUmVsb2NrCiAgICAgVmVjdG9yPFN0YXR1cz4gICAgICAgICAgICAgbVJlY2VudFN0YXR1c1VwZGF0ZXM7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1c1dhaXRlcnM7CisKICAgICBDb25kaXRpb24gICAgICAgICAgICAgICAgICBtU3RhdHVzQ2hhbmdlZDsKIAogICAgIC8vIFRyYWNraW5nIGNhdXNlIG9mIGZhdGFsIGVycm9ycyB3aGVuIGluIFNUQVRVU19FUlJPUgpAQCAtMjE3LDEzICsyNDMsMjQgQEAKIAogICAgIC8qKioqIEVuZCBzY29wZSBmb3IgbUxvY2sgKioqKi8KIAorICAgIHR5cGVkZWYgc3RydWN0IEFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlIHsKKyAgICAgICAgYm9vbCBhcHBseUFlTG9jazsKKyAgICAgICAgdWludDhfdCBhZUxvY2s7CisgICAgICAgIGJvb2wgYXBwbHlBZVByZWNhcHR1cmVUcmlnZ2VyOworICAgICAgICB1aW50OF90IGFlUHJlY2FwdHVyZVRyaWdnZXI7CisgICAgfSBBZVRyaWdnZXJDYW5jZWxPdmVycmlkZV90OworCiAgICAgY2xhc3MgQ2FwdHVyZVJlcXVlc3QgOiBwdWJsaWMgTGlnaHRSZWZCYXNlPENhcHR1cmVSZXF1ZXN0PiB7CiAgICAgICBwdWJsaWM6CiAgICAgICAgIENhbWVyYU1ldGFkYXRhICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nczsKICAgICAgICAgc3A8Y2FtZXJhMzo6Q2FtZXJhM1N0cmVhbT4gICAgICAgICAgbUlucHV0U3RyZWFtOworICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCAgICAgICAgICAgICBtSW5wdXRCdWZmZXI7CiAgICAgICAgIFZlY3RvcjxzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRTdHJlYW1zOwogICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzICAgICAgICAgICAgICAgICBtUmVzdWx0RXh0cmFzOworICAgICAgICAvLyBVc2VkIHRvIGNhbmNlbCBBRSBwcmVjYXB0dXJlIHRyaWdnZXIgZm9yIGRldmljZXMgZG9lc24ndCBzdXBwb3J0CisgICAgICAgIC8vIENPTlRST0xfQUVfUFJFQ0FQVFVSRV9UUklHR0VSX0NBTkNFTAorICAgICAgICBBZVRyaWdnZXJDYW5jZWxPdmVycmlkZV90ICAgICAgICAgICBtQWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGU7CiAgICAgfTsKICAgICB0eXBlZGVmIExpc3Q8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gUmVxdWVzdExpc3Q7CiAKQEAgLTI0NSw2ICsyODIsMTMgQEAKICAgICB2aXJ0dWFsIENhbWVyYU1ldGFkYXRhIGdldExhdGVzdFJlcXVlc3RMb2NrZWQoKTsKIAogICAgIC8qKgorICAgICAqIFVwZGF0ZSB0aGUgY3VycmVudCBkZXZpY2Ugc3RhdHVzIGFuZCB3YWtlIGFsbCB3YWl0aW5nIHRocmVhZHMuCisgICAgICoKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIG1Mb2NrIGhlbGQuCisgICAgICovCisgICAgdm9pZCBpbnRlcm5hbFVwZGF0ZVN0YXR1c0xvY2tlZChTdGF0dXMgc3RhdHVzKTsKKworICAgIC8qKgogICAgICAqIFBhdXNlIHByb2Nlc3NpbmcgYW5kIGZsdXNoIGV2ZXJ5dGhpbmcsIGJ1dCBkb24ndCB0ZWxsIHRoZSBjbGllbnRzLgogICAgICAqIFRoaXMgaXMgZm9yIHJlY29uZmlndXJpbmcgb3V0cHV0cyB0cmFuc3BhcmVudGx5IHdoZW4gYWNjb3JkaW5nIHRvIHRoZQogICAgICAqIENhbWVyYURldmljZUJhc2UgaW50ZXJmYWNlIHdlIHNob3VsZG4ndCBuZWVkIHRvLgpAQCAtMzIzLDExICszNjcsMTEgQEAKICAgICAgKi8KICAgICBib29sICAgICAgICAgICAgICAgdHJ5TG9ja1NwaW5SaWdodFJvdW5kKE11dGV4JiBsb2NrKTsKIAotICAgIHN0cnVjdCBTaXplIHsKLSAgICAgICAgaW50IHdpZHRoOwotICAgICAgICBpbnQgaGVpZ2h0OwotICAgICAgICBTaXplKGludCB3LCBpbnQgaCkgOiB3aWR0aCh3KSwgaGVpZ2h0KGgpe30KLSAgICB9OworICAgIC8qKgorICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYW4gaW5wdXQgc2l6ZSBmb3IgaW1wbGVtZW50YXRpb24gZGVmaW5lZAorICAgICAqIGZvcm1hdCBpcyBzdXBwb3J0ZWQuCisgICAgICovCisgICAgYm9vbCBpc09wYXF1ZUlucHV0U2l6ZVN1cHBvcnRlZCh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KTsKIAogICAgIC8qKgogICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIGxhcmdlc3QgSnBlZyByZXNvbHV0aW9uIChpbiBhcmVhKQpAQCAtMzYxLDkgKzQwNSwxMCBAQAogCiAgICAgICAgIFJlcXVlc3RUaHJlYWQod3A8Q2FtZXJhM0RldmljZT4gcGFyZW50LAogICAgICAgICAgICAgICAgIHNwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIsCi0gICAgICAgICAgICAgICAgY2FtZXJhM19kZXZpY2VfdCAqaGFsM0RldmljZSk7CisgICAgICAgICAgICAgICAgY2FtZXJhM19kZXZpY2VfdCAqaGFsM0RldmljZSwKKyAgICAgICAgICAgICAgICBib29sIGFlTG9ja0F2YWlsYWJsZSk7CiAKLSAgICAgICAgdm9pZCAgICAgc2V0Tm90aWZ5Q2FsbGJhY2soTm90aWZpY2F0aW9uTGlzdGVuZXIgKmxpc3RlbmVyKTsKKyAgICAgICAgdm9pZCAgICAgc2V0Tm90aWZpY2F0aW9uTGlzdGVuZXIoTm90aWZpY2F0aW9uTGlzdGVuZXIgKmxpc3RlbmVyKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogQ2FsbCBhZnRlciBzdHJlYW0gKHJlKS1jb25maWd1cmF0aW9uIGlzIGNvbXBsZXRlZC4KQEAgLTQyNyw2ICs0NzIsMTIgQEAKICAgICAgICAgICovCiAgICAgICAgIENhbWVyYU1ldGFkYXRhIGdldExhdGVzdFJlcXVlc3QoKSBjb25zdDsKIAorICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdHJlYW0gaXMgYSB0YXJnZXQgb2YgYW55IHF1ZXVlZCBvciByZXBlYXRpbmcKKyAgICAgICAgICogY2FwdHVyZSByZXF1ZXN0CisgICAgICAgICAqLworICAgICAgICBib29sIGlzU3RyZWFtUGVuZGluZyhzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiYgc3RyZWFtKTsKKwogICAgICAgcHJvdGVjdGVkOgogCiAgICAgICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCk7CkBAIC00NjgsNiArNTE5LDkgQEAKICAgICAgICAgLy8gSWYgdGhlIGlucHV0IHJlcXVlc3QgaXMgaW4gbVJlcGVhdGluZ1JlcXVlc3RzLiBNdXN0IGJlIGNhbGxlZCB3aXRoIG1SZXF1ZXN0TG9jayBob2xkCiAgICAgICAgIGJvb2wgaXNSZXBlYXRpbmdSZXF1ZXN0TG9ja2VkKGNvbnN0IHNwPENhcHR1cmVSZXF1ZXN0Pik7CiAKKyAgICAgICAgLy8gSGFuZGxlIEFFIHByZWNhcHR1cmUgdHJpZ2dlciBjYW5jZWwgZm9yIGRldmljZXMgPD0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIuCisgICAgICAgIHZvaWQgaGFuZGxlQWVQcmVjYXB0dXJlQ2FuY2VsUmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCk7CisKICAgICAgICAgd3A8Q2FtZXJhM0RldmljZT4gIG1QYXJlbnQ7CiAgICAgICAgIHdwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+ICBtU3RhdHVzVHJhY2tlcjsKICAgICAgICAgY2FtZXJhM19kZXZpY2VfdCAgKm1IYWwzRGV2aWNlOwpAQCAtNDgyLDYgKzUzNiwxMCBAQAogICAgICAgICBDb25kaXRpb24gICAgICAgICAgbVJlcXVlc3RTaWduYWw7CiAgICAgICAgIFJlcXVlc3RMaXN0ICAgICAgICBtUmVxdWVzdFF1ZXVlOwogICAgICAgICBSZXF1ZXN0TGlzdCAgICAgICAgbVJlcGVhdGluZ1JlcXVlc3RzOworICAgICAgICAvLyBUaGUgbmV4dCByZXF1ZXN0IGJlaW5nIHByZXBwZWQgZm9yIHN1Ym1pc3Npb24gdG8gdGhlIEhBTCwgbm8gbG9uZ2VyCisgICAgICAgIC8vIG9uIHRoZSByZXF1ZXN0IHF1ZXVlLiBSZWFkLW9ubHkgZXZlbiB3aXRoIG1SZXF1ZXN0TG9jayBoZWxkLCBvdXRzaWRlCisgICAgICAgIC8vIG9mIHRocmVhZExvb3AKKyAgICAgICAgc3A8Y29uc3QgQ2FwdHVyZVJlcXVlc3Q+IG1OZXh0UmVxdWVzdDsKIAogICAgICAgICBib29sICAgICAgICAgICAgICAgbVJlY29uZmlndXJlZDsKIApAQCAtNTEyLDYgKzU3MCw5IEBACiAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICBtQ3VycmVudFByZUNhcHR1cmVUcmlnZ2VySWQ7CiAKICAgICAgICAgaW50NjRfdCAgICAgICAgICAgIG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXI7CisKKyAgICAgICAgLy8gV2hldGhlciB0aGUgZGV2aWNlIHN1cHBvcnRzIEFFIGxvY2sKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgIG1BZUxvY2tBdmFpbGFibGU7CiAgICAgfTsKICAgICBzcDxSZXF1ZXN0VGhyZWFkPiBtUmVxdWVzdFRocmVhZDsKIApAQCAtNTM0LDcgKzU5NSw2IEBACiAgICAgICAgIC8vIElmIHRoaXMgcmVxdWVzdCBoYXMgYW55IGlucHV0IGJ1ZmZlcgogICAgICAgICBib29sIGhhc0lucHV0QnVmZmVyOwogCi0KICAgICAgICAgLy8gVGhlIGxhc3QgbWV0YWRhdGEgdGhhdCBmcmFtZXdvcmsgcmVjZWl2ZXMgZnJvbSBIQUwgYW5kCiAgICAgICAgIC8vIG5vdCB5ZXQgc2VuZCBvdXQgYmVjYXVzZSB0aGUgc2h1dHRlciBldmVudCBoYXNuJ3QgYXJyaXZlZC4KICAgICAgICAgLy8gSXQncyBhZGRlZCBieSBwcm9jZXNzX2NhcHR1cmVfcmVzdWx0IGFuZCBzZW50IHdoZW4gZnJhbWV3b3JrCkBAIC01NDcsNiArNjA3LDkgQEAKICAgICAgICAgLy8gdGhlIHNodXR0ZXIgZXZlbnQuCiAgICAgICAgIFZlY3RvcjxjYW1lcmEzX3N0cmVhbV9idWZmZXJfdD4gcGVuZGluZ091dHB1dEJ1ZmZlcnM7CiAKKyAgICAgICAgLy8gVXNlZCB0byBjYW5jZWwgQUUgcHJlY2FwdHVyZSB0cmlnZ2VyIGZvciBkZXZpY2VzIGRvZXNuJ3Qgc3VwcG9ydAorICAgICAgICAvLyBDT05UUk9MX0FFX1BSRUNBUFRVUkVfVFJJR0dFUl9DQU5DRUwKKyAgICAgICAgQWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGVfdCBhZVRyaWdnZXJDYW5jZWxPdmVycmlkZTsKIAogCiAgICAgICAgIC8vIEZpZWxkcyB1c2VkIGJ5IHRoZSBwYXJ0aWFsIHJlc3VsdCBvbmx5CkBAIC01NjgsMzggKzYzMSwyMyBAQAogICAgICAgICAgICAgICAgIHJlcXVlc3RTdGF0dXMoT0spLAogICAgICAgICAgICAgICAgIGhhdmVSZXN1bHRNZXRhZGF0YShmYWxzZSksCiAgICAgICAgICAgICAgICAgbnVtQnVmZmVyc0xlZnQoMCksCi0gICAgICAgICAgICAgICAgaGFzSW5wdXRCdWZmZXIoZmFsc2UpeworICAgICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVyKGZhbHNlKSwKKyAgICAgICAgICAgICAgICBhZVRyaWdnZXJDYW5jZWxPdmVycmlkZSh7ZmFsc2UsIDAsIGZhbHNlLCAwfSl7CiAgICAgICAgIH0KIAotICAgICAgICBJbkZsaWdodFJlcXVlc3QoaW50IG51bUJ1ZmZlcnMpIDoKLSAgICAgICAgICAgICAgICBzaHV0dGVyVGltZXN0YW1wKDApLAotICAgICAgICAgICAgICAgIHNlbnNvclRpbWVzdGFtcCgwKSwKLSAgICAgICAgICAgICAgICByZXF1ZXN0U3RhdHVzKE9LKSwKLSAgICAgICAgICAgICAgICBoYXZlUmVzdWx0TWV0YWRhdGEoZmFsc2UpLAotICAgICAgICAgICAgICAgIG51bUJ1ZmZlcnNMZWZ0KG51bUJ1ZmZlcnMpLAotICAgICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVyKGZhbHNlKXsKLSAgICAgICAgfQotCi0gICAgICAgIEluRmxpZ2h0UmVxdWVzdChpbnQgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyBleHRyYXMpIDoKKyAgICAgICAgSW5GbGlnaHRSZXF1ZXN0KGludCBudW1CdWZmZXJzLCBDYXB0dXJlUmVzdWx0RXh0cmFzIGV4dHJhcywgYm9vbCBoYXNJbnB1dCwKKyAgICAgICAgICAgICAgICBBZVRyaWdnZXJDYW5jZWxPdmVycmlkZSBhZVRyaWdnZXJDYW5jZWxPdmVycmlkZSkgOgogICAgICAgICAgICAgICAgIHNodXR0ZXJUaW1lc3RhbXAoMCksCiAgICAgICAgICAgICAgICAgc2Vuc29yVGltZXN0YW1wKDApLAogICAgICAgICAgICAgICAgIHJlcXVlc3RTdGF0dXMoT0spLAogICAgICAgICAgICAgICAgIGhhdmVSZXN1bHRNZXRhZGF0YShmYWxzZSksCiAgICAgICAgICAgICAgICAgbnVtQnVmZmVyc0xlZnQobnVtQnVmZmVycyksCiAgICAgICAgICAgICAgICAgcmVzdWx0RXh0cmFzKGV4dHJhcyksCi0gICAgICAgICAgICAgICAgaGFzSW5wdXRCdWZmZXIoZmFsc2UpeworICAgICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVyKGhhc0lucHV0KSwKKyAgICAgICAgICAgICAgICBhZVRyaWdnZXJDYW5jZWxPdmVycmlkZShhZVRyaWdnZXJDYW5jZWxPdmVycmlkZSl7CiAgICAgICAgIH0KKyAgICB9OwogCi0gICAgICAgIEluRmxpZ2h0UmVxdWVzdChpbnQgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyBleHRyYXMsIGJvb2wgaGFzSW5wdXQpIDoKLSAgICAgICAgICAgICAgICBzaHV0dGVyVGltZXN0YW1wKDApLAotICAgICAgICAgICAgICAgIHNlbnNvclRpbWVzdGFtcCgwKSwKLSAgICAgICAgICAgICAgICByZXF1ZXN0U3RhdHVzKE9LKSwKLSAgICAgICAgICAgICAgICBoYXZlUmVzdWx0TWV0YWRhdGEoZmFsc2UpLAotICAgICAgICAgICAgICAgIG51bUJ1ZmZlcnNMZWZ0KG51bUJ1ZmZlcnMpLAotICAgICAgICAgICAgICAgIHJlc3VsdEV4dHJhcyhleHRyYXMpLAotICAgICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVyKGhhc0lucHV0KXsKLSAgICAgICAgfQotfTsKICAgICAvLyBNYXAgZnJvbSBmcmFtZSBudW1iZXIgdG8gdGhlIGluLWZsaWdodCByZXF1ZXN0IHN0YXRlCiAgICAgdHlwZWRlZiBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSW5GbGlnaHRSZXF1ZXN0PiBJbkZsaWdodE1hcDsKIApAQCAtNjA3LDcgKzY1NSw4IEBACiAgICAgSW5GbGlnaHRNYXAgICAgICAgICAgICBtSW5GbGlnaHRNYXA7CiAKICAgICBzdGF0dXNfdCByZWdpc3RlckluRmxpZ2h0KHVpbnQzMl90IGZyYW1lTnVtYmVyLAotICAgICAgICAgICAgaW50MzJfdCBudW1CdWZmZXJzLCBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhcywgYm9vbCBoYXNJbnB1dCk7CisgICAgICAgICAgICBpbnQzMl90IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzLCBib29sIGhhc0lucHV0LAorICAgICAgICAgICAgY29uc3QgQWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGVfdCAmYWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGUpOwogCiAgICAgLyoqCiAgICAgICogRm9yIHRoZSBwYXJ0aWFsIHJlc3VsdCwgY2hlY2sgaWYgYWxsIDNBIHN0YXRlIGZpZWxkcyBhcmUgYXZhaWxhYmxlCkBAIC02MjUsMTIgKzY3NCw1OSBAQAogICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICAgYm9vbCBpbnNlcnQzQVJlc3VsdChDYW1lcmFNZXRhZGF0YSAmcmVzdWx0LCBpbnQzMl90IHRhZywgY29uc3QgVCogdmFsdWUsCiAgICAgICAgICAgICB1aW50MzJfdCBmcmFtZU51bWJlcik7CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSByZXN1bHQgbWV0YWRhdGEgZm9yIGNhbmNlbGxpbmcgQUUgcHJlY2FwdHVyZSB0cmlnZ2VyIGFwcGxpZWQgaW4KKyAgICAgKiBoYW5kbGVBZVByZWNhcHR1cmVDYW5jZWxSZXF1ZXN0KCkuCisgICAgICovCisgICAgdm9pZCBvdmVycmlkZVJlc3VsdEZvclByZWNhcHR1cmVDYW5jZWwoQ2FtZXJhTWV0YWRhdGEqIHJlc3VsdCwKKyAgICAgICAgICAgIGNvbnN0IEFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlX3QgJmFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlKTsKKwogICAgIC8qKgogICAgICAqIFRyYWNraW5nIGZvciBpZGxlIGRldGVjdGlvbgogICAgICAqLwogICAgIHNwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IG1TdGF0dXNUcmFja2VyOwogCiAgICAgLyoqCisgICAgICogVGhyZWFkIGZvciBwcmVwYXJpbmcgc3RyZWFtcworICAgICAqLworICAgIGNsYXNzIFByZXBhcmVyVGhyZWFkIDogcHJpdmF0ZSBUaHJlYWQsIHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgeworICAgICAgcHVibGljOgorICAgICAgICBQcmVwYXJlclRocmVhZCgpOworICAgICAgICB+UHJlcGFyZXJUaHJlYWQoKTsKKworICAgICAgICB2b2lkIHNldE5vdGlmaWNhdGlvbkxpc3RlbmVyKE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lcik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFF1ZXVlIHVwIGEgc3RyZWFtIHRvIGJlIHByZXBhcmVkLiBTdHJlYW1zIGFyZSBwcm9jZXNzZWQgYnkKKyAgICAgICAgICogYSBiYWNrZ3JvdW5kIHRocmVhZCBpbiBGSUZPIG9yZGVyCisgICAgICAgICAqLworICAgICAgICBzdGF0dXNfdCBwcmVwYXJlKHNwPGNhbWVyYTM6OkNhbWVyYTNTdHJlYW1JbnRlcmZhY2U+JiBzdHJlYW0pOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYW5jZWwgYWxsIGN1cnJlbnQgYW5kIHBlbmRpbmcgc3RyZWFtIHByZXBhcmF0aW9uCisgICAgICAgICAqLworICAgICAgICBzdGF0dXNfdCBjbGVhcigpOworCisgICAgICBwcml2YXRlOgorICAgICAgICBNdXRleCBtTG9jazsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpOworCisgICAgICAgIC8vIEd1YXJkZWQgYnkgbUxvY2sKKworICAgICAgICBOb3RpZmljYXRpb25MaXN0ZW5lciAqbUxpc3RlbmVyOworICAgICAgICBMaXN0PHNwPGNhbWVyYTM6OkNhbWVyYTNTdHJlYW1JbnRlcmZhY2U+ID4gbVBlbmRpbmdTdHJlYW1zOworICAgICAgICBib29sIG1BY3RpdmU7CisgICAgICAgIGJvb2wgbUNhbmNlbE5vdzsKKworICAgICAgICAvLyBPbmx5IGFjY2Vzc2VkIGJ5IHRocmVhZExvb3AgYW5kIHRoZSBkZXN0cnVjdG9yCisKKyAgICAgICAgc3A8Y2FtZXJhMzo6Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gbUN1cnJlbnRTdHJlYW07CisgICAgfTsKKyAgICBzcDxQcmVwYXJlclRocmVhZD4gbVByZXBhcmVyVGhyZWFkOworCisgICAgLyoqCiAgICAgICogT3V0cHV0IHJlc3VsdCBxdWV1ZSBhbmQgY3VycmVudCBIQUwgZGV2aWNlIDNBIHN0YXRlCiAgICAgICovCiAKQEAgLTYzOCw4ICs3MzQsMTAgQEAKICAgICBNdXRleCAgICAgICAgICAgICAgICAgIG1PdXRwdXRMb2NrOwogCiAgICAgLyoqKiogU2NvcGUgZm9yIG1PdXRwdXRMb2NrICoqKiovCi0KKyAgICAvLyB0aGUgbWluaW1hbCBmcmFtZSBudW1iZXIgb2YgdGhlIG5leHQgbm9uLXJlcHJvY2VzcyByZXN1bHQKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXI7CisgICAgLy8gdGhlIG1pbmltYWwgZnJhbWUgbnVtYmVyIG9mIHRoZSBuZXh0IHJlcHJvY2VzcyByZXN1bHQKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXI7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlcjsKICAgICBMaXN0PENhcHR1cmVSZXN1bHQ+ICAgbVJlc3VsdFF1ZXVlOwogICAgIENvbmRpdGlvbiAgICAgICAgICAgICAgbVJlc3VsdFNpZ25hbDsKQEAgLTY2OCw3ICs3NjYsOCBAQAogICAgIC8vIHBhcnRpYWwgcmVzdWx0cywgYW5kIHRoZSBmcmFtZSBudW1iZXIgdG8gdGhlIHJlc3VsdCBxdWV1ZS4KICAgICB2b2lkIHNlbmRDYXB0dXJlUmVzdWx0KENhbWVyYU1ldGFkYXRhICZwZW5kaW5nTWV0YWRhdGEsCiAgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzICZyZXN1bHRFeHRyYXMsCi0gICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSAmY29sbGVjdGVkUGFydGlhbFJlc3VsdCwgdWludDMyX3QgZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgJmNvbGxlY3RlZFBhcnRpYWxSZXN1bHQsIHVpbnQzMl90IGZyYW1lTnVtYmVyLAorICAgICAgICAgICAgYm9vbCByZXByb2Nlc3MsIGNvbnN0IEFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlX3QgJmFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlKTsKIAogICAgIC8qKioqIFNjb3BlIGZvciBtSW5GbGlnaHRMb2NrICoqKiovCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcAppbmRleCA2NjU2YjA5Li5lY2I4YWM4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwCkBAIC0yOCw3ICsyOCw3IEBACiAKIENhbWVyYTNEdW1teVN0cmVhbTo6Q2FtZXJhM0R1bW15U3RyZWFtKGludCBpZCkgOgogICAgICAgICBDYW1lcmEzSU9TdHJlYW1CYXNlKGlkLCBDQU1FUkEzX1NUUkVBTV9PVVRQVVQsIERVTU1ZX1dJRFRILCBEVU1NWV9IRUlHSFQsCi0gICAgICAgICAgICAgICAgLyptYXhTaXplKi8wLCBEVU1NWV9GT1JNQVQpIHsKKyAgICAgICAgICAgICAgICAvKm1heFNpemUqLzAsIERVTU1ZX0ZPUk1BVCwgRFVNTVlfREFUQVNQQUNFLCBEVU1NWV9ST1RBVElPTikgewogCiB9CiAKQEAgLTg3LDcgKzg3LDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6Z2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpIHsKK3N0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6Z2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpIGNvbnN0IHsKICAgICAqdXNhZ2UgPSBEVU1NWV9VU0FHRTsKICAgICByZXR1cm4gT0s7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaAppbmRleCAzZTQyNjIzLi4zYTNkYmY0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgKQEAgLTc1LDYgKzc1LDggQEAKICAgICBzdGF0aWMgY29uc3QgaW50IERVTU1ZX1dJRFRIID0gMzIwOwogICAgIHN0YXRpYyBjb25zdCBpbnQgRFVNTVlfSEVJR0hUID0gMjQwOwogICAgIHN0YXRpYyBjb25zdCBpbnQgRFVNTVlfRk9STUFUID0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOworICAgIHN0YXRpYyBjb25zdCBhbmRyb2lkX2RhdGFzcGFjZSBEVU1NWV9EQVRBU1BBQ0UgPSBIQUxfREFUQVNQQUNFX1VOS05PV047CisgICAgc3RhdGljIGNvbnN0IGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3QgRFVNTVlfUk9UQVRJT04gPSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wOwogICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBEVU1NWV9VU0FHRSA9IEdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVI7CiAKICAgICAvKioKQEAgLTg3LDcgKzg5LDcgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlUXVldWVMb2NrZWQoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpIGNvbnN0OwogCiB9OyAvLyBjbGFzcyBDYW1lcmEzRHVtbXlTdHJlYW0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKaW5kZXggY2M2NjQ1OS4uMjNiMWM0NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCkBAIC0zMCw5ICszMCwxMCBAQAogbmFtZXNwYWNlIGNhbWVyYTMgewogCiBDYW1lcmEzSU9TdHJlYW1CYXNlOjpDYW1lcmEzSU9TdHJlYW1CYXNlKGludCBpZCwgY2FtZXJhM19zdHJlYW1fdHlwZV90IHR5cGUsCi0gICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHNpemVfdCBtYXhTaXplLCBpbnQgZm9ybWF0KSA6CisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHNpemVfdCBtYXhTaXplLCBpbnQgZm9ybWF0LAorICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24pIDoKICAgICAgICAgQ2FtZXJhM1N0cmVhbShpZCwgdHlwZSwKLSAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBtYXhTaXplLCBmb3JtYXQpLAorICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIG1heFNpemUsIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiksCiAgICAgICAgIG1Ub3RhbEJ1ZmZlckNvdW50KDApLAogICAgICAgICBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQoMCksCiAgICAgICAgIG1IYW5kb3V0T3V0cHV0QnVmZmVyQ291bnQoMCksCkBAIC02NiwxMyArNjcsMTggQEAKIHZvaWQgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIGNvbnN0IHsKICAgICAodm9pZCkgYXJnczsKICAgICBTdHJpbmc4IGxpbmVzOworCisgICAgdWludDMyX3QgY29uc3VtZXJVc2FnZSA9IDA7CisgICAgc3RhdHVzX3QgcmVzID0gZ2V0RW5kcG9pbnRVc2FnZSgmY29uc3VtZXJVc2FnZSk7CisgICAgaWYgKHJlcyAhPSBPSykgY29uc3VtZXJVc2FnZSA9IDA7CisKICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIFN0YXRlOiAlZFxuIiwgbVN0YXRlKTsKLSAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIERpbXM6ICVkIHggJWQsIGZvcm1hdCAweCV4XG4iLAorICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgRGltczogJWQgeCAlZCwgZm9ybWF0IDB4JXgsIGRhdGFzcGFjZSAweCV4XG4iLAogICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06OndpZHRoLCBjYW1lcmEzX3N0cmVhbTo6aGVpZ2h0LAotICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06OmZvcm1hdCk7CisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0LCBjYW1lcmEzX3N0cmVhbTo6ZGF0YV9zcGFjZSk7CiAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBNYXggc2l6ZTogJXp1XG4iLCBtTWF4U2l6ZSk7Ci0gICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBVc2FnZTogJWQsIG1heCBIQUwgYnVmZmVyczogJWRcbiIsCi0gICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6dXNhZ2UsIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycyk7CisgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBDb21iaW5lZCB1c2FnZTogJWQsIG1heCBIQUwgYnVmZmVyczogJWRcbiIsCisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6dXNhZ2UgfCBjb25zdW1lclVzYWdlLCBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMpOwogICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgRnJhbWVzIHByb2R1Y2VkOiAlZCwgbGFzdCB0aW1lc3RhbXA6ICUiIFBSSWQ2NCAiIG5zXG4iLAogICAgICAgICAgICAgbUZyYW1lQ291bnQsIG1MYXN0VGltZXN0YW1wKTsKICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIFRvdGFsIGJ1ZmZlcnM6ICV6dSwgY3VycmVudGx5IGRlcXVldWVkOiAlenVcbiIsCkBAIC0xNTUsMTMgKzE2MSwxMSBAQAogCiAgICAgLy8gSW5mb3JtIHRyYWNrZXIgYWJvdXQgYmVjb21pbmcgYnVzeQogICAgIGlmIChtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQgPT0gMCAmJiBtU3RhdGUgIT0gU1RBVEVfSU5fQ09ORklHICYmCi0gICAgICAgICAgICBtU3RhdGUgIT0gU1RBVEVfSU5fUkVDT05GSUcpIHsKKyAgICAgICAgICAgIG1TdGF0ZSAhPSBTVEFURV9JTl9SRUNPTkZJRyAmJiBtU3RhdGUgIT0gU1RBVEVfUFJFUEFSSU5HKSB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBBdm9pZCBhIHNwdXJpb3VzIElETEUtPkFDVElWRS0+SURMRSB0cmFuc2l0aW9uIHdoZW4gdXNpbmcgYnVmZmVycwogICAgICAgICAgKiBiZWZvcmUvYWZ0ZXIgcmVnaXN0ZXJfc3RyZWFtX2J1ZmZlcnMgZHVyaW5nIGluaXRpYWwgY29uZmlndXJhdGlvbgotICAgICAgICAgKiBvciByZS1jb25maWd1cmF0aW9uLgotICAgICAgICAgKgotICAgICAgICAgKiBUT0RPOiBJTl9DT05GSUcgYW5kIElOX1JFQ09ORklHIGNoZWNrcyBvbmx5IG1ha2Ugc2Vuc2UgZm9yIDxIQUwzLjIKKyAgICAgICAgICogb3IgcmUtY29uZmlndXJhdGlvbiwgb3IgZHVyaW5nIHByZXBhcmUgcHJlLWFsbG9jYXRpb24KICAgICAgICAgICovCiAgICAgICAgIHNwPFN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIgPSBtU3RhdHVzVHJhY2tlci5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChzdGF0dXNUcmFja2VyICE9IDApIHsKQEAgLTE3Niw5ICsxODAsMTEgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6Z2V0QnVmZmVyUHJlY29uZGl0aW9uQ2hlY2tMb2NrZWQoKSBjb25zdCB7Ci0gICAgLy8gQWxsb3cgZGVxdWV1ZSBkdXJpbmcgSU5fW1JFXUNPTkZJRyBmb3IgcmVnaXN0cmF0aW9uCisgICAgLy8gQWxsb3cgZGVxdWV1ZSBkdXJpbmcgSU5fW1JFXUNPTkZJRyBmb3IgcmVnaXN0cmF0aW9uLCBpbgorICAgIC8vIFBSRVBBUklORyBmb3IgcHJlLWFsbG9jYXRpb24KICAgICBpZiAobVN0YXRlICE9IFNUQVRFX0NPTkZJR1VSRUQgJiYKLSAgICAgICAgICAgIG1TdGF0ZSAhPSBTVEFURV9JTl9DT05GSUcgJiYgbVN0YXRlICE9IFNUQVRFX0lOX1JFQ09ORklHKSB7CisgICAgICAgICAgICBtU3RhdGUgIT0gU1RBVEVfSU5fQ09ORklHICYmIG1TdGF0ZSAhPSBTVEFURV9JTl9SRUNPTkZJRyAmJgorICAgICAgICAgICAgbVN0YXRlICE9IFNUQVRFX1BSRVBBUklORykgewogICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2FuJ3QgZ2V0IGJ1ZmZlcnMgaW4gdW5jb25maWd1cmVkIHN0YXRlICVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgbVN0YXRlKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMjM5LDEzICsyNDUsMTEgQEAKIAogICAgIG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudC0tOwogICAgIGlmIChtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQgPT0gMCAmJiBtU3RhdGUgIT0gU1RBVEVfSU5fQ09ORklHICYmCi0gICAgICAgICAgICBtU3RhdGUgIT0gU1RBVEVfSU5fUkVDT05GSUcpIHsKKyAgICAgICAgICAgIG1TdGF0ZSAhPSBTVEFURV9JTl9SRUNPTkZJRyAmJiBtU3RhdGUgIT0gU1RBVEVfUFJFUEFSSU5HKSB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBBdm9pZCBhIHNwdXJpb3VzIElETEUtPkFDVElWRS0+SURMRSB0cmFuc2l0aW9uIHdoZW4gdXNpbmcgYnVmZmVycwogICAgICAgICAgKiBiZWZvcmUvYWZ0ZXIgcmVnaXN0ZXJfc3RyZWFtX2J1ZmZlcnMgZHVyaW5nIGluaXRpYWwgY29uZmlndXJhdGlvbgotICAgICAgICAgKiBvciByZS1jb25maWd1cmF0aW9uLgotICAgICAgICAgKgotICAgICAgICAgKiBUT0RPOiBJTl9DT05GSUcgYW5kIElOX1JFQ09ORklHIGNoZWNrcyBvbmx5IG1ha2Ugc2Vuc2UgZm9yIDxIQUwzLjIKKyAgICAgICAgICogb3IgcmUtY29uZmlndXJhdGlvbiwgb3IgZHVyaW5nIHByZXBhcmUgcHJlLWFsbG9jYXRpb24KICAgICAgICAgICovCiAgICAgICAgIEFMT0dWKCIlczogU3RyZWFtICVkOiBBbGwgYnVmZmVycyByZXR1cm5lZDsgbm93IGlkbGUiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgbUlkKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmgKaW5kZXggYTM1YzI5MC4uZjU3MjdlOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmgKQEAgLTMzLDcgKzMzLDggQEAKICAgICAgICAgcHVibGljIENhbWVyYTNTdHJlYW0gewogICBwcm90ZWN0ZWQ6CiAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpbnQgaWQsIGNhbWVyYTNfc3RyZWFtX3R5cGVfdCB0eXBlLAotICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgc2l6ZV90IG1heFNpemUsIGludCBmb3JtYXQpOworICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgc2l6ZV90IG1heFNpemUsIGludCBmb3JtYXQsCisgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24pOwogCiAgIHB1YmxpYzoKIApAQCAtODMsNyArODQsNyBAQAogCiAgICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0SW5wdXRCdWZmZXJDb3VudExvY2tlZCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpIGNvbnN0ID0gMDsKIAogICAgIHN0YXR1c190IGdldEJ1ZmZlclByZWNvbmRpdGlvbkNoZWNrTG9ja2VkKCkgY29uc3Q7CiAgICAgc3RhdHVzX3QgcmV0dXJuQnVmZmVyUHJlY29uZGl0aW9uQ2hlY2tMb2NrZWQoKSBjb25zdDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcAppbmRleCA5YzFlMjhiLi4yNTA0YmZkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCkBAIC0yOSw4ICsyOSw4IEBACiAKIENhbWVyYTNJbnB1dFN0cmVhbTo6Q2FtZXJhM0lucHV0U3RyZWFtKGludCBpZCwKICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCkgOgotICAgICAgICBDYW1lcmEzSU9TdHJlYW1CYXNlKGlkLCBDQU1FUkEzX1NUUkVBTV9JTlBVVCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1heFNpemUqLzAsIGZvcm1hdCkgeworICAgICAgICBDYW1lcmEzSU9TdHJlYW1CYXNlKGlkLCBDQU1FUkEzX1NUUkVBTV9JTlBVVCwgd2lkdGgsIGhlaWdodCwgLyptYXhTaXplKi8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgSEFMX0RBVEFTUEFDRV9VTktOT1dOLCBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wKSB7CiAKICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgewogICAgICAgICBBTE9HRSgiJXM6IEJhZCBmb3JtYXQsIEJMT0Igbm90IHN1cHBvcnRlZCIsIF9fRlVOQ1RJT05fXyk7CkBAIC02NSw4ICs2NSw4IEBACiAgICAgYXNzZXJ0KG1Db25zdW1lciAhPSAwKTsKIAogICAgIEJ1ZmZlckl0ZW0gYnVmZmVySXRlbTsKLSAgICByZXMgPSBtQ29uc3VtZXItPmFjcXVpcmVCdWZmZXIoJmJ1ZmZlckl0ZW0sIC8qd2FpdEZvckZlbmNlKi9mYWxzZSk7CiAKKyAgICByZXMgPSBtQ29uc3VtZXItPmFjcXVpcmVCdWZmZXIoJmJ1ZmZlckl0ZW0sIC8qd2FpdEZvckZlbmNlKi9mYWxzZSk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2FuJ3QgYWNxdWlyZSBuZXh0IG91dHB1dCBidWZmZXI6ICVzICglZCkiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTE2Miw2ICsxNjIsMjEgQEAKICAgICByZXR1cm4gcmV0dXJuQW55QnVmZmVyTG9ja2VkKGJ1ZmZlciwgLyp0aW1lc3RhbXAqLzAsIC8qb3V0cHV0Ki9mYWxzZSk7CiB9CiAKK3N0YXR1c190IENhbWVyYTNJbnB1dFN0cmVhbTo6Z2V0SW5wdXRCdWZmZXJQcm9kdWNlckxvY2tlZCgKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpwcm9kdWNlcikgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBpZiAocHJvZHVjZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0gZWxzZSBpZiAobVByb2R1Y2VyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBpbnB1dCBzdHJlYW0gaXMgY29uZmlndXJlZCIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgKnByb2R1Y2VyID0gbVByb2R1Y2VyOworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM0lucHV0U3RyZWFtOjpkaXNjb25uZWN0TG9ja2VkKCkgewogCiAgICAgc3RhdHVzX3QgcmVzOwpAQCAtMTcyLDYgKzE4Nyw4IEBACiAKICAgICBhc3NlcnQobUJ1ZmZlcnNJbkZsaWdodC5zaXplKCkgPT0gMCk7CiAKKyAgICBtQ29uc3VtZXItPmFiYW5kb24oKTsKKwogICAgIC8qKgogICAgICAqICBuby1vcCBzaW5jZSB3ZSBjYW4ndCBkaXNjb25uZWN0IHRoZSBwcm9kdWNlciBmcm9tIHRoZSBjb25zdW1lci1zaWRlCiAgICAgICovCkBAIC0yMTIsMTAgKzIyOSwxNyBAQAogICAgICAgICByZXMgPSBwcm9kdWNlci0+cXVlcnkoTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTLCAmbWluVW5kZXF1ZXVlZEJ1ZmZlcnMpOwogICAgICAgICBpZiAocmVzICE9IE9LIHx8IG1pblVuZGVxdWV1ZWRCdWZmZXJzIDwgMCkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENvdWxkIG5vdCBxdWVyeSBtaW4gdW5kZXF1ZXVlZCBidWZmZXJzIChlcnJvciAlZCwgYnVmQ291bnQgJWQpIiwKLSAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCByZXMsIG1pblVuZGVxdWV1ZWRCdWZmZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHJlcywgbWluVW5kZXF1ZXVlZEJ1ZmZlcnMpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgICAgICBzaXplX3QgbWluQnVmcyA9IHN0YXRpY19jYXN0PHNpemVfdD4obWluVW5kZXF1ZXVlZEJ1ZmZlcnMpOworCisgICAgICAgIGlmIChjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMgPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiAlZDogSEFMIHNldHMgbWF4X2J1ZmZlciB0byAwLiBNdXN0IGJlIGF0IGxlYXN0IDEuIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKwogICAgICAgICAvKgogICAgICAgICAgKiBXZSBwcm9taXNlIG5ldmVyIHRvICdhY3F1aXJlJyBtb3JlIHRoYW4gY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzCiAgICAgICAgICAqIGF0IGFueSBvbmUgdGltZS4KQEAgLTIzMiw2ICsyNTYsOCBAQAogICAgICAgICBtQ29uc3VtZXIgPSBuZXcgQnVmZmVySXRlbUNvbnN1bWVyKGNvbnN1bWVyLCBjYW1lcmEzX3N0cmVhbTo6dXNhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdGFsQnVmZmVyQ291bnQpOwogICAgICAgICBtQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEzLUlucHV0U3RyZWFtLSVkIiwgbUlkKSk7CisKKyAgICAgICAgbVByb2R1Y2VyID0gcHJvZHVjZXI7CiAgICAgfQogCiAgICAgcmVzID0gbUNvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyU2l6ZShjYW1lcmEzX3N0cmVhbTo6d2lkdGgsCkBAIC0yNTEsNyArMjc3LDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYTNJbnB1dFN0cmVhbTo6Z2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpIHsKK3N0YXR1c190IENhbWVyYTNJbnB1dFN0cmVhbTo6Z2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpIGNvbnN0IHsKICAgICAvLyBQZXIgSEFMMyBzcGVjLCBpbnB1dCBzdHJlYW1zIGhhdmUgMCBmb3IgdGhlaXIgaW5pdGlhbCB1c2FnZSBmaWVsZC4KICAgICAqdXNhZ2UgPSAwOwogICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCmluZGV4IGZkMTdmNGYuLjlmM2RlMTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaApAQCAtNDksNiArNDksNyBAQAogICBwcml2YXRlOgogCiAgICAgc3A8QnVmZmVySXRlbUNvbnN1bWVyPiBtQ29uc3VtZXI7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbVByb2R1Y2VyOwogICAgIFZlY3RvcjxCdWZmZXJJdGVtPiBtQnVmZmVyc0luRmxpZ2h0OwogCiAgICAgLyoqCkBAIC02OCwxMSArNjksMTMgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyTG9ja2VkKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqYnVmZmVyKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybklucHV0QnVmZmVyTG9ja2VkKAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJQcm9kdWNlckxvY2tlZCgKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpwcm9kdWNlcik7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0TG9ja2VkKCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSBjb25zdDsKIAogfTsgLy8gY2xhc3MgQ2FtZXJhM0lucHV0U3RyZWFtCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCmluZGV4IDc3YWQ1MDMuLjhjNjExZDUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcApAQCAtMzIsMTAgKzMyLDExIEBACiBuYW1lc3BhY2UgY2FtZXJhMyB7CiAKIENhbWVyYTNPdXRwdXRTdHJlYW06OkNhbWVyYTNPdXRwdXRTdHJlYW0oaW50IGlkLAotICAgICAgICBzcDxBTmF0aXZlV2luZG93PiBjb25zdW1lciwKLSAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCkgOgorICAgICAgICBzcDxTdXJmYWNlPiBjb25zdW1lciwKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uKSA6CiAgICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIENBTUVSQTNfU1RSRUFNX09VVFBVVCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1heFNpemUqLzAsIGZvcm1hdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXhTaXplKi8wLCBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24pLAogICAgICAgICBtQ29uc3VtZXIoY29uc3VtZXIpLAogICAgICAgICBtVHJhbnNmb3JtKDApLAogICAgICAgICBtVHJhY2VGaXJzdEJ1ZmZlcih0cnVlKSB7CkBAIC00NywxMCArNDgsMTEgQEAKIH0KIAogQ2FtZXJhM091dHB1dFN0cmVhbTo6Q2FtZXJhM091dHB1dFN0cmVhbShpbnQgaWQsCi0gICAgICAgIHNwPEFOYXRpdmVXaW5kb3c+IGNvbnN1bWVyLAotICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBzaXplX3QgbWF4U2l6ZSwgaW50IGZvcm1hdCkgOgorICAgICAgICBzcDxTdXJmYWNlPiBjb25zdW1lciwKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgc2l6ZV90IG1heFNpemUsIGludCBmb3JtYXQsCisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbikgOgogICAgICAgICBDYW1lcmEzSU9TdHJlYW1CYXNlKGlkLCBDQU1FUkEzX1NUUkVBTV9PVVRQVVQsIHdpZHRoLCBoZWlnaHQsIG1heFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24pLAogICAgICAgICBtQ29uc3VtZXIoY29uc3VtZXIpLAogICAgICAgICBtVHJhbnNmb3JtKDApLAogICAgICAgICBtVHJhY2VGaXJzdEJ1ZmZlcih0cnVlKSB7CkBAIC02OSwxMCArNzEsMTIgQEAKIAogQ2FtZXJhM091dHB1dFN0cmVhbTo6Q2FtZXJhM091dHB1dFN0cmVhbShpbnQgaWQsIGNhbWVyYTNfc3RyZWFtX3R5cGVfdCB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0KSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbikgOgogICAgICAgICBDYW1lcmEzSU9TdHJlYW1CYXNlKGlkLCB0eXBlLCB3aWR0aCwgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWF4U2l6ZSovMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiksCiAgICAgICAgIG1UcmFuc2Zvcm0oMCkgewogCiAgICAgLy8gU3ViY2xhc3NlcyBleHBlY3RlZCB0byBpbml0aWFsaXplIG1Db25zdW1lciB0aGVtc2VsdmVzCkBAIC0xNTMsMzMgKzE1Nyw5IEBACiAgICAgQUxPR19BU1NFUlQob3V0cHV0LCAiRXhwZWN0ZWQgb3V0cHV0IHRvIGJlIHRydWUiKTsKIAogICAgIHN0YXR1c190IHJlczsKLSAgICBzcDxGZW5jZT4gcmVsZWFzZUZlbmNlOwogCi0gICAgLyoqCi0gICAgICogRmVuY2UgbWFuYWdlbWVudCAtIGNhbGN1bGF0ZSBSZWxlYXNlIEZlbmNlCi0gICAgICovCi0gICAgaWYgKGJ1ZmZlci5zdGF0dXMgPT0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SKSB7Ci0gICAgICAgIGlmIChidWZmZXIucmVsZWFzZV9mZW5jZSAhPSAtMSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IEhBTCBzaG91bGQgbm90IHNldCByZWxlYXNlX2ZlbmNlKCVkKSB3aGVuICIKLSAgICAgICAgICAgICAgICAgICJ0aGVyZSBpcyBhbiBlcnJvciIsIF9fRlVOQ1RJT05fXywgbUlkLCBidWZmZXIucmVsZWFzZV9mZW5jZSk7Ci0gICAgICAgICAgICBjbG9zZShidWZmZXIucmVsZWFzZV9mZW5jZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVhc3NpZ24gcmVsZWFzZSBmZW5jZSBhcyB0aGUgYWNxdWlyZSBmZW5jZSBpbiBjYXNlIG9mIGVycm9yCi0gICAgICAgICAqLwotICAgICAgICByZWxlYXNlRmVuY2UgPSBuZXcgRmVuY2UoYnVmZmVyLmFjcXVpcmVfZmVuY2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdGltZXN0YW1wKG1Db25zdW1lci5nZXQoKSwgdGltZXN0YW1wKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IEVycm9yIHNldHRpbmcgdGltZXN0YW1wOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLQotICAgICAgICByZWxlYXNlRmVuY2UgPSBuZXcgRmVuY2UoYnVmZmVyLnJlbGVhc2VfZmVuY2UpOwotICAgIH0KLQorICAgIC8vIEZlbmNlIG1hbmFnZW1lbnQgLSBhbHdheXMgaG9ub3IgcmVsZWFzZSBmZW5jZSBmcm9tIEhBTAorICAgIHNwPEZlbmNlPiByZWxlYXNlRmVuY2UgPSBuZXcgRmVuY2UoYnVmZmVyLnJlbGVhc2VfZmVuY2UpOwogICAgIGludCBhbndSZWxlYXNlRmVuY2UgPSByZWxlYXNlRmVuY2UtPmR1cCgpOwogCiAgICAgLyoqCkBAIC0yMTMsNiArMTkzLDEzIEBACiAgICAgICAgICAgICBtVHJhY2VGaXJzdEJ1ZmZlciA9IGZhbHNlOwogICAgICAgICB9CiAKKyAgICAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190aW1lc3RhbXAobUNvbnN1bWVyLmdldCgpLCB0aW1lc3RhbXApOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRXJyb3Igc2V0dGluZyB0aW1lc3RhbXA6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCiAgICAgICAgIHJlcyA9IGN1cnJlbnRDb25zdW1lci0+cXVldWVCdWZmZXIoY3VycmVudENvbnN1bWVyLmdldCgpLAogICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9vZihidWZmZXIuYnVmZmVyLCBBTmF0aXZlV2luZG93QnVmZmVyLCBoYW5kbGUpLAogICAgICAgICAgICAgICAgIGFud1JlbGVhc2VGZW5jZSk7CkBAIC0yMjIsNiArMjA5LDEzIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgbUxvY2subG9jaygpOworCisgICAgLy8gT25jZSBhIHZhbGlkIGJ1ZmZlciBoYXMgYmVlbiByZXR1cm5lZCB0byB0aGUgcXVldWUsIGNhbiBubyBsb25nZXIKKyAgICAvLyBkZXF1ZXVlIGFsbCBidWZmZXJzIGZvciBwcmVhbGxvY2F0aW9uLgorICAgIGlmIChidWZmZXIuc3RhdHVzICE9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUikgeworICAgICAgICBtU3RyZWFtVW5wcmVwYXJhYmxlID0gdHJ1ZTsKKyAgICB9CisKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIGNsb3NlKGFud1JlbGVhc2VGZW5jZSk7CiAgICAgfQpAQCAtMjM1LDYgKzIyOSw3IEBACiAgICAgKHZvaWQpIGFyZ3M7CiAgICAgU3RyaW5nOCBsaW5lczsKICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICBTdHJlYW1bJWRdOiBPdXRwdXRcbiIsIG1JZCk7CisgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBDb25zdW1lciBuYW1lOiAlc1xuIiwgbUNvbnN1bWVyTmFtZS5zdHJpbmcoKSk7CiAgICAgd3JpdGUoZmQsIGxpbmVzLnN0cmluZygpLCBsaW5lcy5zaXplKCkpOwogCiAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6ZHVtcChmZCwgYXJncyk7CkBAIC0yODQsNiArMjc5LDggQEAKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKKyAgICBtQ29uc3VtZXJOYW1lID0gbUNvbnN1bWVyLT5nZXRDb25zdW1lck5hbWUoKTsKKwogICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X3VzYWdlKG1Db25zdW1lci5nZXQoKSwgY2FtZXJhM19zdHJlYW06OnVzYWdlKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbmZpZ3VyZSB1c2FnZSAlMDh4IGZvciBzdHJlYW0gJWQiLApAQCAtMzIzLDggKzMyMCwxNyBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAorICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGF0YV9zcGFjZShtQ29uc3VtZXIuZ2V0KCksCisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6ZGF0YV9zcGFjZSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtIGRhdGFzcGFjZSAlI3ggZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmEzX3N0cmVhbTo6ZGF0YV9zcGFjZSwgbUlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKICAgICBpbnQgbWF4Q29uc3VtZXJCdWZmZXJzOwotICAgIHJlcyA9IG1Db25zdW1lci0+cXVlcnkobUNvbnN1bWVyLmdldCgpLAorICAgIHJlcyA9IHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3cqPihtQ29uc3VtZXIuZ2V0KCkpLT5xdWVyeSgKKyAgICAgICAgICAgIG1Db25zdW1lci5nZXQoKSwKICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfTUlOX1VOREVRVUVVRURfQlVGRkVSUywgJm1heENvbnN1bWVyQnVmZmVycyk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBxdWVyeSBjb25zdW1lciB1bmRlcXVldWVkIgpAQCAtMzk1LDE0ICs0MDEsMjggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OmdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSB7CitzdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgY29uc3QgewogCiAgICAgc3RhdHVzX3QgcmVzOwogICAgIGludDMyX3QgdSA9IDA7Ci0gICAgcmVzID0gbUNvbnN1bWVyLT5xdWVyeShtQ29uc3VtZXIuZ2V0KCksCisgICAgcmVzID0gc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvdyo+KG1Db25zdW1lci5nZXQoKSktPnF1ZXJ5KG1Db25zdW1lci5nZXQoKSwKICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQ09OU1VNRVJfVVNBR0VfQklUUywgJnUpOwotICAgICp1c2FnZSA9IHU7CiAKKyAgICAvLyBJZiBhbiBvcGFxdWUgb3V0cHV0IHN0cmVhbSdzIGVuZHBvaW50IGlzIEltYWdlUmVhZGVyLCBhZGQKKyAgICAvLyBHUkFMTE9DX1VTQUdFX0hXX0NBTUVSQV9aU0wgdG8gdGhlIHVzYWdlIHNvIEhBTCBrbm93cyBpdCB3aWxsIGJlIHVzZWQKKyAgICAvLyBmb3IgdGhlIFpTTCB1c2UgY2FzZS4KKyAgICAvLyBBc3N1bWUgaXQncyBmb3IgSW1hZ2VSZWFkZXIgaWYgdGhlIGNvbnN1bWVyIHVzYWdlIGRvZXNuJ3QgaGF2ZSBhbnkgb2YgdGhlc2UgYml0cyBzZXQ6CisgICAgLy8gICAgIDEuIEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRQorICAgIC8vICAgICAyLiBHUkFMTE9DX1VTQUdFX0hXX1JFTkRFUgorICAgIC8vICAgICAzLiBHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSCisgICAgLy8gICAgIDQuIEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUgorICAgIGlmIChjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCAmJgorICAgICAgICAgICAgKHUgJiAoR1JBTExPQ19VU0FHRV9IV19URVhUVVJFIHwgR1JBTExPQ19VU0FHRV9IV19SRU5ERVIgfCBHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSIHwKKyAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUikpID09IDApIHsKKyAgICAgICAgdSB8PSBHUkFMTE9DX1VTQUdFX0hXX0NBTUVSQV9aU0w7CisgICAgfQorCisgICAgKnVzYWdlID0gdTsKICAgICByZXR1cm4gcmVzOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oCmluZGV4IGJlMjc4YzUuLjk0MWQ2OTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oCkBAIC0zOCwxNSArMzgsMTcgQEAKICAgICAvKioKICAgICAgKiBTZXQgdXAgYSBzdHJlYW0gZm9yIGZvcm1hdHMgdGhhdCBoYXZlIDIgZGltZW5zaW9ucywgc3VjaCBhcyBSQVcgYW5kIFlVVi4KICAgICAgKi8KLSAgICBDYW1lcmEzT3V0cHV0U3RyZWFtKGludCBpZCwgc3A8QU5hdGl2ZVdpbmRvdz4gY29uc3VtZXIsCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0KTsKKyAgICBDYW1lcmEzT3V0cHV0U3RyZWFtKGludCBpZCwgc3A8U3VyZmFjZT4gY29uc3VtZXIsCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAorICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uKTsKIAogICAgIC8qKgogICAgICAqIFNldCB1cCBhIHN0cmVhbSBmb3IgZm9ybWF0cyB0aGF0IGhhdmUgYSB2YXJpYWJsZSBidWZmZXIgc2l6ZSBmb3IgdGhlIHNhbWUKICAgICAgKiBkaW1lbnNpb25zLCBzdWNoIGFzIGNvbXByZXNzZWQgSlBFRy4KICAgICAgKi8KLSAgICBDYW1lcmEzT3V0cHV0U3RyZWFtKGludCBpZCwgc3A8QU5hdGl2ZVdpbmRvdz4gY29uc3VtZXIsCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBzaXplX3QgbWF4U2l6ZSwgaW50IGZvcm1hdCk7CisgICAgQ2FtZXJhM091dHB1dFN0cmVhbShpbnQgaWQsIHNwPFN1cmZhY2U+IGNvbnN1bWVyLAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgc2l6ZV90IG1heFNpemUsIGludCBmb3JtYXQsCisgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24pOwogCiAgICAgdmlydHVhbCB+Q2FtZXJhM091dHB1dFN0cmVhbSgpOwogCkBAIC02NCw3ICs2Niw4IEBACiAKICAgcHJvdGVjdGVkOgogICAgIENhbWVyYTNPdXRwdXRTdHJlYW0oaW50IGlkLCBjYW1lcmEzX3N0cmVhbV90eXBlX3QgdHlwZSwKLSAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQpOworICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKKyAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbik7CiAKICAgICAvKioKICAgICAgKiBOb3RlIHRoYXQgd2UgcmVsZWFzZSB0aGUgbG9jayBicmllZmx5IGluIHRoaXMgZnVuY3Rpb24KQEAgLTc4LDcgKzgxLDcgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY29ubmVjdExvY2tlZCgpOwogCi0gICAgc3A8QU5hdGl2ZVdpbmRvdz4gbUNvbnN1bWVyOworICAgIHNwPFN1cmZhY2U+IG1Db25zdW1lcjsKICAgcHJpdmF0ZToKICAgICBpbnQgICAgICAgICAgICAgICBtVHJhbnNmb3JtOwogCkBAIC04Niw2ICs4OSw5IEBACiAKICAgICBib29sIG1UcmFjZUZpcnN0QnVmZmVyOwogCisgICAgLy8gTmFtZSBvZiBTdXJmYWNlIGNvbnN1bWVyCisgICAgU3RyaW5nOCAgICAgICAgICAgbUNvbnN1bWVyTmFtZTsKKwogICAgIC8qKgogICAgICAqIEludGVybmFsIENhbWVyYTNTdHJlYW0gaW50ZXJmYWNlCiAgICAgICovCkBAIC05Niw3ICsxMDIsNyBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVRdWV1ZUxvY2tlZCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgY29uc3Q7CiAKIH07IC8vIGNsYXNzIENhbWVyYTNPdXRwdXRTdHJlYW0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKaW5kZXggM2MwZTkwOC4uMjUyN2ZkNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCkBAIC00Niw3ICs0Niw4IEBACiAKIENhbWVyYTNTdHJlYW06OkNhbWVyYTNTdHJlYW0oaW50IGlkLAogICAgICAgICBjYW1lcmEzX3N0cmVhbV90eXBlIHR5cGUsCi0gICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHNpemVfdCBtYXhTaXplLCBpbnQgZm9ybWF0KSA6CisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHNpemVfdCBtYXhTaXplLCBpbnQgZm9ybWF0LAorICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24pIDoKICAgICBjYW1lcmEzX3N0cmVhbSgpLAogICAgIG1JZChpZCksCiAgICAgbU5hbWUoU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEzU3RyZWFtWyVkXSIsIGlkKSksCkBAIC01OCw2ICs1OSw4IEBACiAgICAgY2FtZXJhM19zdHJlYW06OndpZHRoID0gd2lkdGg7CiAgICAgY2FtZXJhM19zdHJlYW06OmhlaWdodCA9IGhlaWdodDsKICAgICBjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0ID0gZm9ybWF0OworICAgIGNhbWVyYTNfc3RyZWFtOjpkYXRhX3NwYWNlID0gZGF0YVNwYWNlOworICAgIGNhbWVyYTNfc3RyZWFtOjpyb3RhdGlvbiA9IHJvdGF0aW9uOwogICAgIGNhbWVyYTNfc3RyZWFtOjp1c2FnZSA9IDA7CiAgICAgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzID0gMDsKICAgICBjYW1lcmEzX3N0cmVhbTo6cHJpdiA9IE5VTEw7CkBAIC04NCw2ICs4NywxMCBAQAogICAgIHJldHVybiBjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0OwogfQogCithbmRyb2lkX2RhdGFzcGFjZSBDYW1lcmEzU3RyZWFtOjpnZXREYXRhU3BhY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhbWVyYTNfc3RyZWFtOjpkYXRhX3NwYWNlOworfQorCiBjYW1lcmEzX3N0cmVhbSogQ2FtZXJhM1N0cmVhbTo6c3RhcnRDb25maWd1cmF0aW9uKCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwpAQCAtMTAyLDExICsxMDksNyBAQAogICAgICAgICAgICAgLy8gb2xkVXNhZ2Uvb2xkTWF4QnVmZmVycwogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIGNhc2UgU1RBVEVfQ09ORklHVVJFRDoKLSAgICAgICAgICAgIGlmIChzdHJlYW1fdHlwZSA9PSBDQU1FUkEzX1NUUkVBTV9JTlBVVCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGNvbmZpZ3VyZSBhbiBpbnB1dCBzdHJlYW0gdHdpY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFzT3V0c3RhbmRpbmdCdWZmZXJzTG9ja2VkKCkpIHsKKyAgICAgICAgICAgIGlmIChoYXNPdXRzdGFuZGluZ0J1ZmZlcnNMb2NrZWQoKSkgewogICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGNvbmZpZ3VyZSBzdHJlYW07IGhhcyBvdXRzdGFuZGluZyBidWZmZXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xODcsNiArMTkwLDExIEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKKyAgICAvLyBSZXNldCBwcmVwYXJlZCBzdGF0ZSwgc2luY2UgYnVmZmVyIGNvbmZpZyBoYXMgY2hhbmdlZCwgYW5kIGV4aXN0aW5nCisgICAgLy8gYWxsb2NhdGlvbnMgYXJlIG5vIGxvbmdlciB2YWxpZAorICAgIG1QcmVwYXJlZCA9IGZhbHNlOworICAgIG1TdHJlYW1VbnByZXBhcmFibGUgPSBmYWxzZTsKKwogICAgIHN0YXR1c190IHJlczsKICAgICByZXMgPSBjb25maWd1cmVRdWV1ZUxvY2tlZCgpOwogICAgIGlmIChyZXMgIT0gT0spIHsKQEAgLTIzNyw2ICsyNDUsMTgwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitib29sIENhbWVyYTNTdHJlYW06OmlzVW5wcmVwYXJhYmxlKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgcmV0dXJuIG1TdHJlYW1VbnByZXBhcmFibGU7Cit9CisKK3N0YXR1c190IENhbWVyYTNTdHJlYW06OnN0YXJ0UHJlcGFyZSgpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgb25seSBjYWxsZWQgd2hlbiB0aGUgc3RyZWFtIGlzIGNvbmZpZ3VyZWQgYWxyZWFkeS4KKyAgICBpZiAobVN0YXRlICE9IFNUQVRFX0NPTkZJR1VSRUQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbid0IHByZXBhcmUgc3RyZWFtIGlmIHN0cmVhbSBpcyBub3QgaW4gQ09ORklHVVJFRCAiCisgICAgICAgICAgICAgICAgInN0YXRlICVkIiwgX19GVU5DVElPTl9fLCBtSWQsIG1TdGF0ZSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGNhbid0IGJlIGNhbGxlZCBpZiB0aGUgc3RyZWFtIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGZpbGxlZAorICAgIC8vIGJ1ZmZlcnMKKyAgICBpZiAobVN0cmVhbVVucHJlcGFyYWJsZSkgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2FuJ3QgcHJlcGFyZSBzdHJlYW0gdGhhdCdzIGFscmVhZHkgaW4gdXNlIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAoZ2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgPiAwKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW4ndCBwcmVwYXJlIHN0cmVhbSB0aGF0IGhhcyBvdXRzdGFuZGluZyBidWZmZXJzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAobVByZXBhcmVkKSByZXR1cm4gT0s7CisKKyAgICBzaXplX3QgYnVmZmVyQ291bnQgPSBnZXRCdWZmZXJDb3VudExvY2tlZCgpOworCisgICAgbVByZXBhcmVkQnVmZmVycy5pbnNlcnRBdChjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCgpLCAvKmluZGV4Ki8wLCBidWZmZXJDb3VudCk7CisgICAgbVByZXBhcmVkQnVmZmVySWR4ID0gMDsKKworICAgIG1TdGF0ZSA9IFNUQVRFX1BSRVBBUklORzsKKworICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7Cit9CisKK2Jvb2wgQ2FtZXJhM1N0cmVhbTo6aXNQcmVwYXJpbmcoKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHJldHVybiBtU3RhdGUgPT0gU1RBVEVfUFJFUEFSSU5HOworfQorCitzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpwcmVwYXJlTmV4dEJ1ZmZlcigpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgb25seSBjYWxsZWQgd2hlbiB0aGUgc3RyZWFtIGlzIHByZXBhcmluZworICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfUFJFUEFSSU5HKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW4ndCBwcmVwYXJlIGJ1ZmZlciBpZiBzdHJlYW0gaXMgbm90IGluIFBSRVBBUklORyAiCisgICAgICAgICAgICAgICAgInN0YXRlICVkIiwgX19GVU5DVElPTl9fLCBtSWQsIG1TdGF0ZSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAvLyBHZXQgbmV4dCBidWZmZXIgLSB0aGlzIG1heSBhbGxvY2F0ZSwgYW5kIHRha2UgYSB3aGlsZSBmb3IgbGFyZ2UgYnVmZmVycworICAgIHJlcyA9IGdldEJ1ZmZlckxvY2tlZCggJm1QcmVwYXJlZEJ1ZmZlcnMuZWRpdEl0ZW1BdChtUHJlcGFyZWRCdWZmZXJJZHgpICk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogVW5hYmxlIHRvIGFsbG9jYXRlIGJ1ZmZlciAlZCBkdXJpbmcgcHJlcGFyYXRpb24iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBtUHJlcGFyZWRCdWZmZXJJZHgpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBtUHJlcGFyZWRCdWZmZXJJZHgrKzsKKworICAgIC8vIENoZWNrIGlmIHdlIHN0aWxsIGhhdmUgYnVmZmVycyBsZWZ0IHRvIGFsbG9jYXRlCisgICAgaWYgKG1QcmVwYXJlZEJ1ZmZlcklkeCA8IG1QcmVwYXJlZEJ1ZmZlcnMuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgfQorCisgICAgLy8gRG9uZSB3aXRoIHByZXBhcmUgLSBtYXJrIHN0cmVhbSBhcyBzdWNoLCBhbmQgcmV0dXJuIGFsbCBidWZmZXJzCisgICAgLy8gdmlhIGNhbmNlbFByZXBhcmUKKyAgICBtUHJlcGFyZWQgPSB0cnVlOworCisgICAgcmV0dXJuIGNhbmNlbFByZXBhcmVMb2NrZWQoKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6Y2FuY2VsUHJlcGFyZSgpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgcmV0dXJuIGNhbmNlbFByZXBhcmVMb2NrZWQoKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6Y2FuY2VsUHJlcGFyZUxvY2tlZCgpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG9ubHkgY2FsbGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBtaWQtcHJlcGFyaW5nLgorICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfUFJFUEFSSU5HKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW4ndCBjYW5jZWwgcHJlcGFyZSBzdHJlYW0gaWYgc3RyZWFtIGlzIG5vdCBpbiAiCisgICAgICAgICAgICAgICAgIlBSRVBBUklORyBzdGF0ZSAlZCIsIF9fRlVOQ1RJT05fXywgbUlkLCBtU3RhdGUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgLy8gUmV0dXJuIGFsbCB2YWxpZCBidWZmZXJzIHRvIHN0cmVhbSwgaW4gRVJST1Igc3RhdGUgdG8gaW5kaWNhdGUKKyAgICAvLyB0aGV5IHdlcmVuJ3QgZmlsbGVkLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVByZXBhcmVkQnVmZmVySWR4OyBpKyspIHsKKyAgICAgICAgbVByZXBhcmVkQnVmZmVycy5lZGl0SXRlbUF0KGkpLnJlbGVhc2VfZmVuY2UgPSAtMTsKKyAgICAgICAgbVByZXBhcmVkQnVmZmVycy5lZGl0SXRlbUF0KGkpLnN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUjsKKyAgICAgICAgcmV0dXJuQnVmZmVyTG9ja2VkKG1QcmVwYXJlZEJ1ZmZlcnNbaV0sIDApOworICAgIH0KKyAgICBtUHJlcGFyZWRCdWZmZXJzLmNsZWFyKCk7CisgICAgbVByZXBhcmVkQnVmZmVySWR4ID0gMDsKKworICAgIG1TdGF0ZSA9IFNUQVRFX0NPTkZJR1VSRUQ7CisKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjp0ZWFyRG93bigpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgb25seSBjYWxsZWQgd2hlbiB0aGUgc3RyZWFtIGlzIGNvbmZpZ3VyZWQuCisgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9DT05GSUdVUkVEKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW4ndCB0ZWFyIGRvd24gc3RyZWFtIGlmIHN0cmVhbSBpcyBub3QgaW4gIgorICAgICAgICAgICAgICAgICJDT05GSUdVUkVEIHN0YXRlICVkIiwgX19GVU5DVElPTl9fLCBtSWQsIG1TdGF0ZSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAvLyBJZiBhbnkgYnVmZmVycyBoYXZlIGJlZW4gaGFuZGVkIHRvIHRoZSBIQUwsIHRoZSBzdHJlYW0gY2Fubm90IGJlIHRvcm4gZG93bi4KKyAgICBpZiAoZ2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgPiAwKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW4ndCB0ZWFyIGRvd24gYSBzdHJlYW0gdGhhdCBoYXMgb3V0c3RhbmRpbmcgYnVmZmVycyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgLy8gRnJlZSBidWZmZXJzIGJ5IGRpc2Nvbm5lY3RpbmcgYW5kIHRoZW4gcmVjb25uZWN0aW5nIHRvIHRoZSBidWZmZXIgcXVldWUKKyAgICAvLyBPbmx5IHVudXNlZCBidWZmZXJzIHdpbGwgYmUgZHJvcHBlZCBpbW1lZGlhdGVseTsgYnVmZmVycyB0aGF0IGhhdmUgYmVlbiBmaWxsZWQKKyAgICAvLyBhbmQgYXJlIHdhaXRpbmcgdG8gYmUgYWNxdWlyZWQgYnkgdGhlIGNvbnN1bWVyIGFuZCBidWZmZXJzIHRoYXQgYXJlIGN1cnJlbnRseQorICAgIC8vIGFjcXVpcmVkIHdpbGwgYmUgZnJlZWQgb25jZSB0aGV5IGFyZSByZWxlYXNlZCBieSB0aGUgY29uc3VtZXIuCisKKyAgICByZXMgPSBkaXNjb25uZWN0TG9ja2VkKCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBpZiAocmVzID09IC1FTk9UQ09OTikgeworICAgICAgICAgICAgLy8gcXVldWUgaGFzIGJlZW4gZGlzY29ubmVjdGVkLCBub3RoaW5nIGxlZnQgdG8gZG8sIHNvIGV4aXQgd2l0aCBzdWNjZXNzCisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IFVuYWJsZSB0byBkaXNjb25uZWN0IHRvIHRlYXIgZG93biBidWZmZXJzOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgbVN0YXRlID0gU1RBVEVfSU5fQ09ORklHOworCisgICAgcmVzID0gY29uZmlndXJlUXVldWVMb2NrZWQoKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbmZpZ3VyZSBzdHJlYW0gJWQgcXVldWU6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgbVN0YXRlID0gU1RBVEVfRVJST1I7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLy8gUmVzZXQgcHJlcGFyZWQgc3RhdGUsIHNpbmNlIHdlJ3ZlIHJlY29ubmVjdGVkIHRvIHRoZSBxdWV1ZSBhbmQgY2FuIHByZXBhcmUgYWdhaW4uCisgICAgbVByZXBhcmVkID0gZmFsc2U7CisgICAgbVN0cmVhbVVucHJlcGFyYWJsZSA9IGZhbHNlOworCisgICAgbVN0YXRlID0gU1RBVEVfQ09ORklHVVJFRDsKKworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6Z2V0QnVmZmVyKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqYnVmZmVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CkBAIC0zMzksNiArNTIxLDEzIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6Z2V0SW5wdXRCdWZmZXJQcm9kdWNlcihzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqcHJvZHVjZXIpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKworICAgIHJldHVybiBnZXRJbnB1dEJ1ZmZlclByb2R1Y2VyTG9ja2VkKHByb2R1Y2VyKTsKK30KKwogdm9pZCBDYW1lcmEzU3RyZWFtOjpmaXJlQnVmZmVyTGlzdGVuZXJzTG9ja2VkKAogICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXImIC8qYnVmZmVyKi8sIGJvb2wgYWNxdWlyZWQsIGJvb2wgb3V0cHV0KSB7CiAgICAgTGlzdDx3cDxDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXI+ID46Oml0ZXJhdG9yIGl0LCBlbmQ7CkBAIC00MTMsMTUgKzYwMiwxMyBAQAogICAgICAgICAgICAgQUxPR0UoIiVzOiByZWdpc3Rlcl9zdHJlYW1fYnVmZmVycyBpcyBkZXByZWNhdGVkIGluIEhBTDMuMjsgIgogICAgICAgICAgICAgICAgICAgICAibXVzdCBiZSBzZXQgdG8gTlVMTCBpbiBjYW1lcmEzX2RldmljZTo6b3BzIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dEKCIlczogU2tpcHBpbmcgTlVMTCBjaGVjayBmb3IgZGVwcmVjYXRlZCByZWdpc3Rlcl9zdHJlYW1fYnVmZmVycyIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIiVzOiByZWdpc3Rlcl9zdHJlYW1fYnVmZmVycyB1c2luZyBkZXByZWNhdGVkIGNvZGUgcGF0aCIsIF9fRlVOQ1RJT05fXyk7CiAgICAgfQogCisgICAgQUxPR1YoIiVzOiByZWdpc3Rlcl9zdHJlYW1fYnVmZmVycyB1c2luZyBkZXByZWNhdGVkIGNvZGUgcGF0aCIsIF9fRlVOQ1RJT05fXyk7CisKICAgICBzdGF0dXNfdCByZXM7CiAKICAgICBzaXplX3QgYnVmZmVyQ291bnQgPSBnZXRCdWZmZXJDb3VudExvY2tlZCgpOwpAQCAtNDc3LDYgKzY2NCw4IEBACiAgICAgICAgIHJldHVybkJ1ZmZlckxvY2tlZChzdHJlYW1CdWZmZXJzW2ldLCAwKTsKICAgICB9CiAKKyAgICBtUHJlcGFyZWQgPSB0cnVlOworCiAgICAgcmV0dXJuIHJlczsKIH0KIApAQCAtNDk4LDYgKzY4NywxMCBAQAogICAgIEFMT0dFKCIlczogVGhpcyB0eXBlIG9mIHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IGlucHV0IiwgX19GVU5DVElPTl9fKTsKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CitzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpnZXRJbnB1dEJ1ZmZlclByb2R1Y2VyTG9ja2VkKHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpwcm9kdWNlcikgeworICAgIEFMT0dFKCIlczogVGhpcyB0eXBlIG9mIHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IGlucHV0IiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CiAKIHZvaWQgQ2FtZXJhM1N0cmVhbTo6YWRkQnVmZmVyTGlzdGVuZXIoCiAgICAgICAgIHdwPENhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lcj4gbGlzdGVuZXIpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKaW5kZXggZDBlMTMzNy4uYmFiMjE3NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKQEAgLTU3LDggKzU3LDE1IEBACiAgKiAgICByZS1yZWdpc3RlcmluZyBidWZmZXJzIHdpdGggSEFMLgogICoKICAqICBTVEFURV9DT05GSUdVUkVEOiBTdHJlYW0gaXMgY29uZmlndXJlZCwgYW5kIGhhcyByZWdpc3RlcmVkIGJ1ZmZlcnMgd2l0aCB0aGUKLSAqICAgIEhBTC4gVGhlIHN0cmVhbSdzIGdldEJ1ZmZlci9yZXR1cm5CdWZmZXIgd29yay4gVGhlIHByaXYgcG9pbnRlciBtYXkgc3RpbGwgYmUKLSAqICAgIG1vZGlmaWVkLgorICogICAgSEFMIChpZiBuZWNlc3NhcnkpLiBUaGUgc3RyZWFtJ3MgZ2V0QnVmZmVyL3JldHVybkJ1ZmZlciB3b3JrLiBUaGUgcHJpdgorICogICAgcG9pbnRlciBtYXkgc3RpbGwgYmUgbW9kaWZpZWQuCisgKgorICogIFNUQVRFX1BSRVBBUklORzogVGhlIHN0cmVhbSdzIGJ1ZmZlcnMgYXJlIGJlaW5nIHByZS1hbGxvY2F0ZWQgZm9yIHVzZS4gIE9uCisgKiAgICBvbGRlciBIQUxzLCB0aGlzIGlzIGRvbmUgYXMgcGFydCBvZiBjb25maWd1cmF0aW9uLCBidXQgaW4gbmV3ZXIgSEFMcworICogICAgYnVmZmVycyBtYXkgYmUgYWxsb2NhdGVkIGF0IHRpbWUgb2YgZmlyc3QgdXNlLiBCdXQgc29tZSB1c2UgY2FzZXMgcmVxdWlyZQorICogICAgYnVmZmVyIGFsbG9jYXRpb24gdXBmcm9udCwgdG8gbWlubWl6ZSBkaXNydXB0aW9uIGR1ZSB0byBsZW5ndGh5IGFsbG9jYXRpb24KKyAqICAgIGR1cmF0aW9uLiAgSW4gdGhpcyBzdGF0ZSwgb25seSBwcmVwYXJlTmV4dEJ1ZmZlcigpIGFuZCBjYW5jZWxQcmVwYXJlKCkKKyAqICAgIG1heSBiZSBjYWxsZWQuCiAgKgogICogVHJhbnNpdGlvbiB0YWJsZToKICAqCkBAIC04Miw2ICs4OSwxMiBAQAogICogICAgU1RBVEVfQ09ORklHVVJFRCAgICAgPT4gU1RBVEVfQ09OU1RSVUNURUQ6CiAgKiAgICAgICAgV2hlbiBkaXNjb25uZWN0KCkgaXMgY2FsbGVkIGFmdGVyIG1ha2luZyBzdXJlIHN0cmVhbSBpcyBpZGxlIHdpdGgKICAqICAgICAgICB3YWl0VW50aWxJZGxlKCkuCisgKiAgICBTVEFURV9DT05GSUdVUkVEICAgICA9PiBTVEFURV9QUkVQQVJJTkc6CisgKiAgICAgICAgV2hlbiBzdGFydFByZXBhcmUgaXMgY2FsbGVkIGJlZm9yZSB0aGUgc3RyZWFtIGhhcyBhIGJ1ZmZlcgorICogICAgICAgIHF1ZXVlZCBiYWNrIGludG8gaXQgZm9yIHRoZSBmaXJzdCB0aW1lLgorICogICAgU1RBVEVfUFJFUEFSSU5HICAgICAgPT4gU1RBVEVfQ09ORklHVVJFRDoKKyAqICAgICAgICBXaGVuIHN1ZmZpY2llbnQgcHJlcGFyZU5leHRCdWZmZXIgY2FsbHMgaGF2ZSBiZWVuIG1hZGUgdG8gYWxsb2NhdGUKKyAqICAgICAgICBhbGwgc3RyZWFtIGJ1ZmZlcnMsIG9yIGNhbmNlbFByZXBhcmUgaXMgY2FsbGVkLgogICoKICAqIFN0YXR1cyBUcmFja2luZzoKICAqICAgIEVhY2ggc3RyZWFtIGlzIHRyYWNrZWQgYnkgU3RhdHVzVHJhY2tlciBhcyBhIHNlcGFyYXRlIGNvbXBvbmVudCwKQEAgLTExOSw5ICsxMzIsMTAgQEAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIHN0cmVhbSdzIGRpbWVuc2lvbnMgYW5kIGZvcm1hdAogICAgICAqLwotICAgIHVpbnQzMl90ICAgICAgICAgZ2V0V2lkdGgoKSBjb25zdDsKLSAgICB1aW50MzJfdCAgICAgICAgIGdldEhlaWdodCgpIGNvbnN0OwotICAgIGludCAgICAgICAgICAgICAgZ2V0Rm9ybWF0KCkgY29uc3Q7CisgICAgdWludDMyX3QgICAgICAgICAgZ2V0V2lkdGgoKSBjb25zdDsKKyAgICB1aW50MzJfdCAgICAgICAgICBnZXRIZWlnaHQoKSBjb25zdDsKKyAgICBpbnQgICAgICAgICAgICAgICBnZXRGb3JtYXQoKSBjb25zdDsKKyAgICBhbmRyb2lkX2RhdGFzcGFjZSBnZXREYXRhU3BhY2UoKSBjb25zdDsKIAogICAgIC8qKgogICAgICAqIFN0YXJ0IHRoZSBzdHJlYW0gY29uZmlndXJhdGlvbiBwcm9jZXNzLiBSZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBzdHJlYW0ncwpAQCAtMTY2LDYgKzE4MCw4NyBAQAogICAgIHN0YXR1c190ICAgICAgICAgY2FuY2VsQ29uZmlndXJhdGlvbigpOwogCiAgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHN0cmVhbSBoYXMgYWxyZWFkeSBiZWNvbWUgaW4tdXNlIChoYXMgcmVjZWl2ZWQKKyAgICAgKiBhIHZhbGlkIGZpbGxlZCBidWZmZXIpLCB3aGljaCBkZXRlcm1pbmVzIGlmIGEgc3RyZWFtIGNhbiBzdGlsbCBoYXZlCisgICAgICogcHJlcGFyZU5leHRCdWZmZXIgY2FsbGVkIG9uIGl0LgorICAgICAqLworICAgIGJvb2wgICAgICAgICAgICAgaXNVbnByZXBhcmFibGUoKTsKKworICAgIC8qKgorICAgICAqIFN0YXJ0IHN0cmVhbSBwcmVwYXJhdGlvbi4gTWF5IG9ubHkgYmUgY2FsbGVkIGluIHRoZSBDT05GSUdVUkVEIHN0YXRlLAorICAgICAqIHdoZW4gbm8gdmFsaWQgYnVmZmVycyBoYXZlIHlldCBiZWVuIHJldHVybmVkIHRvIHRoaXMgc3RyZWFtLgorICAgICAqCisgICAgICogSWYgbm8gcHJlcGFydGlvbiBpcyBuZWNlc3NhcnksIHJldHVybnMgT0sgYW5kIGRvZXMgbm90IHRyYW5zaXRpb24gdG8KKyAgICAgKiBQUkVQQVJJTkcgc3RhdGUuIE90aGVyd2lzZSwgcmV0dXJucyBOT1RfRU5PVUdIX0RBVEEgYW5kIHRyYW5zaXRpb25zCisgICAgICogdG8gUFJFUEFSSU5HLgorICAgICAqCisgICAgICogVGhpcyBjYWxsIHBlcmZvcm1zIG5vIGFsbG9jYXRpb24sIHNvIGlzIHF1aWNrIHRvIGNhbGwuCisgICAgICoKKyAgICAgKiBSZXR1cm5zOgorICAgICAqICAgIE9LIGlmIG5vIG1vcmUgYnVmZmVycyBuZWVkIHRvIGJlIHByZWFsbG9jYXRlZAorICAgICAqICAgIE5PVF9FTk9VR0hfREFUQSBpZiBjYWxscyB0byBwcmVwYXJlTmV4dEJ1ZmZlciBhcmUgbmVlZGVkIHRvIGZpbmlzaAorICAgICAqICAgICAgICBidWZmZXIgcHJlLWFsbG9jYXRpb24sIGFuZCB0cmFuc2l0aW9ucyB0byB0aGUgUFJFUEFSSU5HIHN0YXRlLgorICAgICAqICAgIE5PX0lOSVQgaW4gY2FzZSBvZiBhIHNlcmlvdXMgZXJyb3IgZnJvbSB0aGUgSEFMIGRldmljZQorICAgICAqICAgIElOVkFMSURfT1BFUkFUSU9OIGlmIGNhbGxlZCB3aGVuIG5vdCBpbiBDT05GSUdVUkVEIHN0YXRlLCBvciBhCisgICAgICogICAgICAgIHZhbGlkIGJ1ZmZlciBoYXMgYWxyZWFkeSBiZWVuIHJldHVybmVkIHRvIHRoaXMgc3RyZWFtLgorICAgICAqLworICAgIHN0YXR1c190ICAgICAgICAgc3RhcnRQcmVwYXJlKCk7CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGUgc3RyZWFtIGlzIG1pZC1wcmVwYXJpbmcuCisgICAgICovCisgICAgYm9vbCAgICAgICAgICAgICBpc1ByZXBhcmluZygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQ29udGludWUgc3RyZWFtIGJ1ZmZlciBwcmVwYXJhdGlvbiBieSBhbGxvY2F0aW5nIHRoZSBuZXh0CisgICAgICogYnVmZmVyIGZvciB0aGlzIHN0cmVhbS4gIE1heSBvbmx5IGJlIGNhbGxlZCBpbiB0aGUgUFJFUEFSRUQgc3RhdGUuCisgICAgICoKKyAgICAgKiBSZXR1cm5zIE9LIGFuZCB0cmFuc2l0aW9ucyB0byB0aGUgQ09ORklHVVJFRCBzdGF0ZSBpZiBhbGwgYnVmZmVycworICAgICAqIGFyZSBhbGxvY2F0ZWQgYWZ0ZXIgdGhlIGNhbGwgY29uY2x1ZGVzLiBPdGhlcndpc2UgcmV0dXJucyBOT1RfRU5PVUdIX0RBVEEuCisgICAgICoKKyAgICAgKiBUaGlzIGNhbGwgYWxsb2NhdGVzIG9uZSBidWZmZXIsIHdoaWNoIG1heSB0YWtlIHNldmVyYWwgbWlsbGlzZWNvbmRzIGZvcgorICAgICAqIGxhcmdlIGJ1ZmZlcnMuCisgICAgICoKKyAgICAgKiBSZXR1cm5zOgorICAgICAqICAgIE9LIGlmIG5vIG1vcmUgYnVmZmVycyBuZWVkIHRvIGJlIHByZWFsbG9jYXRlZCwgYW5kIHRyYW5zaXRpb25zCisgICAgICogICAgICAgIHRvIHRoZSBDT05GSUdVUkVEIHN0YXRlLgorICAgICAqICAgIE5PVF9FTk9VR0hfREFUQSBpZiBtb3JlIGNhbGxzIHRvIHByZXBhcmVOZXh0QnVmZmVyIGFyZSBuZWVkZWQgdG8gZmluaXNoCisgICAgICogICAgICAgIGJ1ZmZlciBwcmUtYWxsb2NhdGlvbi4KKyAgICAgKiAgICBOT19JTklUIGluIGNhc2Ugb2YgYSBzZXJpb3VzIGVycm9yIGZyb20gdGhlIEhBTCBkZXZpY2UKKyAgICAgKiAgICBJTlZBTElEX09QRVJBVElPTiBpZiBjYWxsZWQgd2hlbiBub3QgaW4gQ09ORklHVVJFRCBzdGF0ZSwgb3IgYQorICAgICAqICAgICAgICB2YWxpZCBidWZmZXIgaGFzIGFscmVhZHkgYmVlbiByZXR1cm5lZCB0byB0aGlzIHN0cmVhbS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCAgICAgICAgIHByZXBhcmVOZXh0QnVmZmVyKCk7CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWwgc3RyZWFtIHByZXBhcmF0aW9uIGVhcmx5LiBJbiBjYXNlIGFsbG9jYXRpb24gbmVlZHMgdG8gYmUKKyAgICAgKiBzdG9wcGVkLCB0aGlzIG1ldGhvZCB0cmFuc2l0aW9ucyB0aGUgc3RyZWFtIGJhY2sgdG8gdGhlIENPTkZJR1VSRUQgc3RhdGUuCisgICAgICogQnVmZmVycyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgd2l0aCBwcmVwYXJlTmV4dEJ1ZmZlciByZW1haW4gdGhhdCB3YXksCisgICAgICogYnV0IGEgbGF0ZXIgdXNlIG9mIHByZXBhcmVOZXh0QnVmZmVyIHdpbGwgcmVxdWlyZSBqdXN0IGFzIG1hbnkKKyAgICAgKiBjYWxscyBhcyBpZiB0aGUgZWFybGllciBwcmVwYXJlIGF0dGVtcHQgaGFkIG5vdCBleGlzdGVkLgorICAgICAqCisgICAgICogUmV0dXJuczoKKyAgICAgKiAgICBPSyBpZiBjYW5jZWxsYXRpb24gc3VjY2VlZGVkLCBhbmQgdHJhbnNpdGlvbnMgdG8gdGhlIENPTkZJR1VSRUQgc3RhdGUKKyAgICAgKiAgICBJTlZBTElEX09QRVJBVElPTiBpZiBub3QgaW4gdGhlIFBSRVBBUklORyBzdGF0ZQorICAgICAqICAgIE5PX0lOSVQgaW4gY2FzZSBvZiBhIHNlcmlvdXMgZXJyb3IgZnJvbSB0aGUgSEFMIGRldmljZQorICAgICAqLworICAgIHN0YXR1c190ICAgICAgICBjYW5jZWxQcmVwYXJlKCk7CisKKyAgICAvKioKKyAgICAgKiBUZWFyIGRvd24gbWVtb3J5IGZvciB0aGlzIHN0cmVhbS4gVGhpcyBmcmVlcyBhbGwgdW51c2VkIGdyYWxsb2MgYnVmZmVycworICAgICAqIGFsbG9jYXRlZCBmb3IgdGhpcyBzdHJlYW0sIGJ1dCBsZWF2ZXMgaXQgcmVhZHkgZm9yIG9wZXJhdGlvbiBhZnRlcndhcmQuCisgICAgICoKKyAgICAgKiBNYXkgb25seSBiZSBjYWxsZWQgaW4gdGhlIENPTkZJR1VSRUQgc3RhdGUsIGFuZCBrZWVwcyB0aGUgc3RyZWFtIGluCisgICAgICogdGhlIENPTkZJR1VSRUQgc3RhdGUuCisgICAgICoKKyAgICAgKiBSZXR1cm5zOgorICAgICAqICAgIE9LIGlmIHRlYXJkb3duIHN1Y2NlZWRlZC4KKyAgICAgKiAgICBJTlZBTElEX09QRVJBVElPTiBpZiBub3QgaW4gdGhlIENPTkZJR1VSRUQgc3RhdGUKKyAgICAgKiAgICBOT19JTklUIGluIGNhc2Ugb2YgYSBzZXJpb3VzIGVycm9yIGZyb20gdGhlIEhBTCBkZXZpY2UKKyAgICAgKi8KKyAgICBzdGF0dXNfdCAgICAgICB0ZWFyRG93bigpOworCisgICAgLyoqCiAgICAgICogRmlsbCBpbiB0aGUgY2FtZXJhM19zdHJlYW1fYnVmZmVyIHdpdGggdGhlIG5leHQgdmFsaWQgYnVmZmVyIGZvciB0aGlzCiAgICAgICogc3RyZWFtLCB0byBoYW5kIG92ZXIgdG8gdGhlIEhBTC4KICAgICAgKgpAQCAtMjA0LDYgKzI5OSwxMCBAQAogICAgICAqLwogICAgIHN0YXR1c190ICAgICAgICAgcmV0dXJuSW5wdXRCdWZmZXIoY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIpOwogCisgICAgLy8gZ2V0IHRoZSBidWZmZXIgcHJvZHVjZXIgb2YgdGhlIGlucHV0IGJ1ZmZlciBxdWV1ZS4KKyAgICAvLyBvbmx5IGFwcGx5IHRvIGlucHV0IHN0cmVhbXMuCisgICAgc3RhdHVzX3QgICAgICAgICBnZXRJbnB1dEJ1ZmZlclByb2R1Y2VyKHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpwcm9kdWNlcik7CisKICAgICAvKioKICAgICAgKiBXaGV0aGVyIGFueSBvZiB0aGUgc3RyZWFtJ3MgYnVmZmVycyBhcmUgY3VycmVudGx5IGluIHVzZSBieSB0aGUgSEFMLAogICAgICAqIGluY2x1ZGluZyBidWZmZXJzIHRoYXQgaGF2ZSBiZWVuIHJldHVybmVkIGJ1dCBub3QgeWV0IGhhZCB0aGVpcgpAQCAtMjU4LDEzICszNTcsMTUgQEAKICAgICAgICAgU1RBVEVfQ09OU1RSVUNURUQsCiAgICAgICAgIFNUQVRFX0lOX0NPTkZJRywKICAgICAgICAgU1RBVEVfSU5fUkVDT05GSUcsCi0gICAgICAgIFNUQVRFX0NPTkZJR1VSRUQKKyAgICAgICAgU1RBVEVfQ09ORklHVVJFRCwKKyAgICAgICAgU1RBVEVfUFJFUEFSSU5HCiAgICAgfSBtU3RhdGU7CiAKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwogCiAgICAgQ2FtZXJhM1N0cmVhbShpbnQgaWQsIGNhbWVyYTNfc3RyZWFtX3R5cGUgdHlwZSwKLSAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHNpemVfdCBtYXhTaXplLCBpbnQgZm9ybWF0KTsKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHNpemVfdCBtYXhTaXplLCBpbnQgZm9ybWF0LAorICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uKTsKIAogICAgIC8qKgogICAgICAqIEludGVyZmFjZSB0byBiZSBpbXBsZW1lbnRlZCBieSBkZXJpdmVkIGNsYXNzZXMKQEAgLTI4Myw2ICszODQsOSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuSW5wdXRCdWZmZXJMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlcik7CiAgICAgdmlydHVhbCBib29sICAgICBoYXNPdXRzdGFuZGluZ0J1ZmZlcnNMb2NrZWQoKSBjb25zdCA9IDA7CisgICAgLy8gR2V0IHRoZSBidWZmZXIgcHJvZHVjZXIgb2YgdGhlIGlucHV0IGJ1ZmZlciBxdWV1ZS4gT25seSBhcHBseSB0byBpbnB1dCBzdHJlYW1zLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJQcm9kdWNlckxvY2tlZChzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqcHJvZHVjZXIpOworCiAgICAgLy8gQ2FuIHJldHVybiAtRU5PVENPTk4gd2hlbiB3ZSBhcmUgYWxyZWFkeSBkaXNjb25uZWN0ZWQgKG5vdCBhbiBlcnJvcikKICAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3RMb2NrZWQoKSA9IDA7CiAKQEAgLTMwMywxMyArNDA3LDE3IEBACiAKICAgICAvLyBHZXQgdGhlIHVzYWdlIGZsYWdzIGZvciB0aGUgb3RoZXIgZW5kcG9pbnQsIG9yIHJldHVybgogICAgIC8vIElOVkFMSURfT1BFUkFUSU9OIGlmIHRoZXkgY2Fubm90IGJlIG9idGFpbmVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSBjb25zdCA9IDA7CiAKICAgICAvLyBUcmFja2luZyBmb3IgaWRsZSBzdGF0ZQogICAgIHdwPFN0YXR1c1RyYWNrZXI+IG1TdGF0dXNUcmFja2VyOwogICAgIC8vIFN0YXR1cyB0cmFja2VyIGNvbXBvbmVudCBJRAogICAgIGludCBtU3RhdHVzSWQ7CiAKKyAgICAvLyBUcmFja2luZyBmb3Igc3RyZWFtIHByZXBhcmUgLSB3aGV0aGVyIHRoaXMgc3RyZWFtIGNhbiBzdGlsbCBoYXZlCisgICAgLy8gcHJlcGFyZU5leHRCdWZmZXIgY2FsbGVkIG9uIGl0LgorICAgIGJvb2wgbVN0cmVhbVVucHJlcGFyYWJsZTsKKwogICBwcml2YXRlOgogICAgIHVpbnQzMl90IG9sZFVzYWdlOwogICAgIHVpbnQzMl90IG9sZE1heEJ1ZmZlcnM7CkBAIC0zMjQsNiArNDMyLDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhY3F1aXJlZCwgYm9vbCBvdXRwdXQpOwogICAgIExpc3Q8d3A8Q2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyPiA+IG1CdWZmZXJMaXN0ZW5lckxpc3Q7CiAKKyAgICBzdGF0dXNfdCAgICAgICAgY2FuY2VsUHJlcGFyZUxvY2tlZCgpOworCisgICAgLy8gVHJhY2tpbmcgZm9yIFBSRVBBUklORyBzdGF0ZQorCisgICAgLy8gU3RhdGUgb2YgYnVmZmVyIHByZWFsbG9jYXRpb24uIE9ubHkgdHJ1ZSBpZiBlaXRoZXIgcHJlcGFyZU5leHRCdWZmZXIKKyAgICAvLyBoYXMgYmVlbiBjYWxsZWQgc3VmZmljaWVudCBudW1iZXIgb2YgdGltZXMsIG9yIHN0cmVhbSBjb25maWd1cmF0aW9uCisgICAgLy8gaGFkIHRvIHJlZ2lzdGVyIGJ1ZmZlcnMgd2l0aCB0aGUgSEFMCisgICAgYm9vbCBtUHJlcGFyZWQ7CisKKyAgICBWZWN0b3I8Y2FtZXJhM19zdHJlYW1fYnVmZmVyX3Q+IG1QcmVwYXJlZEJ1ZmZlcnM7CisgICAgc2l6ZV90IG1QcmVwYXJlZEJ1ZmZlcklkeDsKKwogfTsgLy8gY2xhc3MgQ2FtZXJhM1N0cmVhbQogCiB9OyAvLyBuYW1lc3BhY2UgY2FtZXJhMwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaAppbmRleCBkYTk4OWNkLi5jMDg2ZWFmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaApAQCAtNDUsNiArNDUsNyBAQAogICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0V2lkdGgoKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRIZWlnaHQoKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBpbnQgICAgICBnZXRGb3JtYXQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBhbmRyb2lkX2RhdGFzcGFjZSBnZXREYXRhU3BhY2UoKSBjb25zdCA9IDA7CiAKICAgICAvKioKICAgICAgKiBTdGFydCB0aGUgc3RyZWFtIGNvbmZpZ3VyYXRpb24gcHJvY2Vzcy4gUmV0dXJucyBhIGhhbmRsZSB0byB0aGUgc3RyZWFtJ3MKQEAgLTg5LDYgKzkwLDgyIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBjYW5jZWxDb25maWd1cmF0aW9uKCkgPSAwOwogCiAgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHN0cmVhbSBoYXMgYWxyZWFkeSBiZWNvbWUgaW4tdXNlIChoYXMgcmVjZWl2ZWQKKyAgICAgKiBhIHZhbGlkIGZpbGxlZCBidWZmZXIpLCB3aGljaCBkZXRlcm1pbmVzIGlmIGEgc3RyZWFtIGNhbiBzdGlsbCBoYXZlCisgICAgICogcHJlcGFyZU5leHRCdWZmZXIgY2FsbGVkIG9uIGl0LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCAgICAgaXNVbnByZXBhcmFibGUoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBzdHJlYW0gcHJlcGFyYXRpb24uIE1heSBvbmx5IGJlIGNhbGxlZCBpbiB0aGUgQ09ORklHVVJFRCBzdGF0ZSwKKyAgICAgKiB3aGVuIG5vIHZhbGlkIGJ1ZmZlcnMgaGF2ZSB5ZXQgYmVlbiByZXR1cm5lZCB0byB0aGlzIHN0cmVhbS4KKyAgICAgKgorICAgICAqIElmIG5vIHByZXBhcnRpb24gaXMgbmVjZXNzYXJ5LCByZXR1cm5zIE9LIGFuZCBkb2VzIG5vdCB0cmFuc2l0aW9uIHRvCisgICAgICogUFJFUEFSSU5HIHN0YXRlLiBPdGhlcndpc2UsIHJldHVybnMgTk9UX0VOT1VHSF9EQVRBIGFuZCB0cmFuc2l0aW9ucworICAgICAqIHRvIFBSRVBBUklORy4KKyAgICAgKgorICAgICAqIFJldHVybnM6CisgICAgICogICAgT0sgaWYgbm8gbW9yZSBidWZmZXJzIG5lZWQgdG8gYmUgcHJlYWxsb2NhdGVkCisgICAgICogICAgTk9UX0VOT1VHSF9EQVRBIGlmIGNhbGxzIHRvIHByZXBhcmVOZXh0QnVmZmVyIGFyZSBuZWVkZWQgdG8gZmluaXNoCisgICAgICogICAgICAgIGJ1ZmZlciBwcmUtYWxsb2NhdGlvbiwgYW5kIHRyYW5zaXRpb25zIHRvIHRoZSBQUkVQQVJJTkcgc3RhdGUuCisgICAgICogICAgTk9fSU5JVCBpbiBjYXNlIG9mIGEgc2VyaW91cyBlcnJvciBmcm9tIHRoZSBIQUwgZGV2aWNlCisgICAgICogICAgSU5WQUxJRF9PUEVSQVRJT04gaWYgY2FsbGVkIHdoZW4gbm90IGluIENPTkZJR1VSRUQgc3RhdGUsIG9yIGEKKyAgICAgKiAgICAgICAgdmFsaWQgYnVmZmVyIGhhcyBhbHJlYWR5IGJlZW4gcmV0dXJuZWQgdG8gdGhpcyBzdHJlYW0uCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFByZXBhcmUoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGUgc3RyZWFtIGlzIG1pZC1wcmVwYXJpbmcuCisgICAgICovCisgICAgdmlydHVhbCBib29sICAgICBpc1ByZXBhcmluZygpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIENvbnRpbnVlIHN0cmVhbSBidWZmZXIgcHJlcGFyYXRpb24gYnkgYWxsb2NhdGluZyB0aGUgbmV4dAorICAgICAqIGJ1ZmZlciBmb3IgdGhpcyBzdHJlYW0uICBNYXkgb25seSBiZSBjYWxsZWQgaW4gdGhlIFBSRVBBUkVEIHN0YXRlLgorICAgICAqCisgICAgICogUmV0dXJucyBPSyBhbmQgdHJhbnNpdGlvbnMgdG8gdGhlIENPTkZJR1VSRUQgc3RhdGUgaWYgYWxsIGJ1ZmZlcnMKKyAgICAgKiBhcmUgYWxsb2NhdGVkIGFmdGVyIHRoZSBjYWxsIGNvbmNsdWRlcy4gT3RoZXJ3aXNlIHJldHVybnMgTk9UX0VOT1VHSF9EQVRBLgorICAgICAqCisgICAgICogUmV0dXJuczoKKyAgICAgKiAgICBPSyBpZiBubyBtb3JlIGJ1ZmZlcnMgbmVlZCB0byBiZSBwcmVhbGxvY2F0ZWQsIGFuZCB0cmFuc2l0aW9ucworICAgICAqICAgICAgICB0byB0aGUgQ09ORklHVVJFRCBzdGF0ZS4KKyAgICAgKiAgICBOT1RfRU5PVUdIX0RBVEEgaWYgbW9yZSBjYWxscyB0byBwcmVwYXJlTmV4dEJ1ZmZlciBhcmUgbmVlZGVkIHRvIGZpbmlzaAorICAgICAqICAgICAgICBidWZmZXIgcHJlLWFsbG9jYXRpb24uCisgICAgICogICAgTk9fSU5JVCBpbiBjYXNlIG9mIGEgc2VyaW91cyBlcnJvciBmcm9tIHRoZSBIQUwgZGV2aWNlCisgICAgICogICAgSU5WQUxJRF9PUEVSQVRJT04gaWYgY2FsbGVkIHdoZW4gbm90IGluIENPTkZJR1VSRUQgc3RhdGUsIG9yIGEKKyAgICAgKiAgICAgICAgdmFsaWQgYnVmZmVyIGhhcyBhbHJlYWR5IGJlZW4gcmV0dXJuZWQgdG8gdGhpcyBzdHJlYW0uCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlTmV4dEJ1ZmZlcigpID0gMDsKKworICAgIC8qKgorICAgICAqIENhbmNlbCBzdHJlYW0gcHJlcGFyYXRpb24gZWFybHkuIEluIGNhc2UgYWxsb2NhdGlvbiBuZWVkcyB0byBiZQorICAgICAqIHN0b3BwZWQsIHRoaXMgbWV0aG9kIHRyYW5zaXRpb25zIHRoZSBzdHJlYW0gYmFjayB0byB0aGUgQ09ORklHVVJFRCBzdGF0ZS4KKyAgICAgKiBCdWZmZXJzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aXRoIHByZXBhcmVOZXh0QnVmZmVyIHJlbWFpbiB0aGF0IHdheSwKKyAgICAgKiBidXQgYSBsYXRlciB1c2Ugb2YgcHJlcGFyZU5leHRCdWZmZXIgd2lsbCByZXF1aXJlIGp1c3QgYXMgbWFueQorICAgICAqIGNhbGxzIGFzIGlmIHRoZSBlYXJsaWVyIHByZXBhcmUgYXR0ZW1wdCBoYWQgbm90IGV4aXN0ZWQuCisgICAgICoKKyAgICAgKiBSZXR1cm5zOgorICAgICAqICAgIE9LIGlmIGNhbmNlbGxhdGlvbiBzdWNjZWVkZWQsIGFuZCB0cmFuc2l0aW9ucyB0byB0aGUgQ09ORklHVVJFRCBzdGF0ZQorICAgICAqICAgIElOVkFMSURfT1BFUkFUSU9OIGlmIG5vdCBpbiB0aGUgUFJFUEFSSU5HIHN0YXRlCisgICAgICogICAgTk9fSU5JVCBpbiBjYXNlIG9mIGEgc2VyaW91cyBlcnJvciBmcm9tIHRoZSBIQUwgZGV2aWNlCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBjYW5jZWxQcmVwYXJlKCkgPSAwOworCisgICAgLyoqCisgICAgICogVGVhciBkb3duIG1lbW9yeSBmb3IgdGhpcyBzdHJlYW0uIFRoaXMgZnJlZXMgYWxsIHVudXNlZCBncmFsbG9jIGJ1ZmZlcnMKKyAgICAgKiBhbGxvY2F0ZWQgZm9yIHRoaXMgc3RyZWFtLCBidXQgbGVhdmVzIGl0IHJlYWR5IGZvciBvcGVyYXRpb24gYWZ0ZXJ3YXJkLgorICAgICAqCisgICAgICogTWF5IG9ubHkgYmUgY2FsbGVkIGluIHRoZSBDT05GSUdVUkVEIHN0YXRlLCBhbmQga2VlcHMgdGhlIHN0cmVhbSBpbgorICAgICAqIHRoZSBDT05GSUdVUkVEIHN0YXRlLgorICAgICAqCisgICAgICogUmV0dXJuczoKKyAgICAgKiAgICBPSyBpZiB0ZWFyZG93biBzdWNjZWVkZWQuCisgICAgICogICAgSU5WQUxJRF9PUEVSQVRJT04gaWYgbm90IGluIHRoZSBDT05GSUdVUkVEIHN0YXRlCisgICAgICogICAgTk9fSU5JVCBpbiBjYXNlIG9mIGEgc2VyaW91cyBlcnJvciBmcm9tIHRoZSBIQUwgZGV2aWNlCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCB0ZWFyRG93bigpID0gMDsKKworICAgIC8qKgogICAgICAqIEZpbGwgaW4gdGhlIGNhbWVyYTNfc3RyZWFtX2J1ZmZlciB3aXRoIHRoZSBuZXh0IHZhbGlkIGJ1ZmZlciBmb3IgdGhpcwogICAgICAqIHN0cmVhbSwgdG8gaGFuZCBvdmVyIHRvIHRoZSBIQUwuCiAgICAgICoKQEAgLTEyOCw2ICsyMDUsMTMgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybklucHV0QnVmZmVyKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyKSA9IDA7CiAKICAgICAvKioKKyAgICAgKiBHZXQgdGhlIGJ1ZmZlciBwcm9kdWNlciBvZiB0aGUgaW5wdXQgYnVmZmVyIHF1ZXVlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2Qgb25seSBhcHBsaWVzIHRvIGlucHV0IHN0cmVhbXMuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclByb2R1Y2VyKHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpwcm9kdWNlcikgPSAwOworCisgICAgLyoqCiAgICAgICogV2hldGhlciBhbnkgb2YgdGhlIHN0cmVhbSdzIGJ1ZmZlcnMgYXJlIGN1cnJlbnRseSBpbiB1c2UgYnkgdGhlIEhBTCwKICAgICAgKiBpbmNsdWRpbmcgYnVmZmVycyB0aGF0IGhhdmUgYmVlbiByZXR1cm5lZCBidXQgbm90IHlldCBoYWQgdGhlaXIKICAgICAgKiByZWxlYXNlIGZlbmNlIHNpZ25hbGVkLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5jcHAKaW5kZXggODEzMzBlYS4uZWVmY2I0NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNac2xTdHJlYW0uY3BwCkBAIC0xMTQsMTMgKzExNCwxNSBAQAogICAgICAgICBpbnQgYnVmZmVyQ291bnQpIDoKICAgICAgICAgQ2FtZXJhM091dHB1dFN0cmVhbShpZCwgQ0FNRVJBM19TVFJFQU1fQklESVJFQ1RJT05BTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiwgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCksCiAgICAgICAgIG1EZXB0aChidWZmZXJDb3VudCkgewogCiAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CiAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CiAgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKICAgICBtUHJvZHVjZXIgPSBuZXcgUmluZ0J1ZmZlckNvbnN1bWVyKGNvbnN1bWVyLCBHUkFMTE9DX1VTQUdFX0hXX0NBTUVSQV9aU0wsIGJ1ZmZlckNvdW50KTsKKyAgICBtUHJvZHVjZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMi1ac2xSaW5nQnVmZmVyQ29uc3VtZXIiKSk7CiAgICAgbUNvbnN1bWVyID0gbmV3IFN1cmZhY2UocHJvZHVjZXIpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9BdXRvQ29uZGl0aW9uTG9jay5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9BdXRvQ29uZGl0aW9uTG9jay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlZTk2NQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0F1dG9Db25kaXRpb25Mb2NrLmNwcApAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkF1dG9Db25kaXRpb25Mb2NrLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworV2FpdGFibGVNdXRleFdyYXBwZXI6OldhaXRhYmxlTXV0ZXhXcmFwcGVyKE11dGV4KiBtdXRleCkgOiBtTXV0ZXh7bXV0ZXh9LCBtU3RhdGV7ZmFsc2V9IHt9CisKK1dhaXRhYmxlTXV0ZXhXcmFwcGVyOjp+V2FpdGFibGVNdXRleFdyYXBwZXIoKSB7fQorCisvLyBMb2NrcyBtYW5hZ2VyLW93bmVkIG11dGV4CitBdXRvQ29uZGl0aW9uTG9jazo6QXV0b0NvbmRpdGlvbkxvY2soY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFdhaXRhYmxlTXV0ZXhXcmFwcGVyPiYgbWFuYWdlcikgOgorICAgICAgICBtTWFuYWdlcnttYW5hZ2VyfSwgbUF1dG9Mb2Nre21hbmFnZXItPm1NdXRleH0ge30KKworLy8gVW5sb2NrcyBtYW5hZ2VyLW93bmVkIG11dGV4CitBdXRvQ29uZGl0aW9uTG9jazo6fkF1dG9Db25kaXRpb25Mb2NrKCkgeworICAgIC8vIFVuc2V0IHRoZSBjb25kaXRpb24gYW5kIHdha2UgZXZlcnlvbmUgdXAgYmVmb3JlIHJlbGVhc2luZyBsb2NrCisgICAgbU1hbmFnZXItPm1TdGF0ZSA9IGZhbHNlOworICAgIG1NYW5hZ2VyLT5tQ29uZGl0aW9uLmJyb2FkY2FzdCgpOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8QXV0b0NvbmRpdGlvbkxvY2s+IEF1dG9Db25kaXRpb25Mb2NrOjp3YWl0QW5kQWNxdWlyZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFdhaXRhYmxlTXV0ZXhXcmFwcGVyPiYgbWFuYWdlciwgbnNlY3NfdCB3YWl0VGltZSkgeworCisgICAgaWYgKG1hbmFnZXIgPT0gbnVsbHB0ciB8fCBtYW5hZ2VyLT5tTXV0ZXggPT0gbnVsbHB0cikgeworICAgICAgICAvLyBCYWQgaW5wdXQsIHJldHVybiBudWxsCisgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8QXV0b0NvbmRpdGlvbkxvY2s+e251bGxwdHJ9OworICAgIH0KKworICAgIC8vIEFjcXVpcmUgc2NvcGVkIGxvY2sKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QXV0b0NvbmRpdGlvbkxvY2s+IHNjb3BlZExvY2sobmV3IEF1dG9Db25kaXRpb25Mb2NrKG1hbmFnZXIpKTsKKworICAgIC8vIEZpZ3VyZSBvdXQgd2hhdCB0aW1lIGluIHRoZSBmdXR1cmUgd2Ugc2hvdWxkIGhpdCB0aGUgdGltZW91dAorICAgIG5zZWNzX3QgZmFpbFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykgKyB3YWl0VGltZTsKKworICAgIC8vIFdhaXQgdW50aWwgd2UgdGltZW91dCwgb3Igc3VjY2VzcworICAgIHdoaWxlKG1hbmFnZXItPm1TdGF0ZSkgeworICAgICAgICBzdGF0dXNfdCByZXQgPSBtYW5hZ2VyLT5tQ29uZGl0aW9uLndhaXRSZWxhdGl2ZSgqKG1hbmFnZXItPm1NdXRleCksIHdhaXRUaW1lKTsKKyAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgLy8gVGltZWQgb3V0IG9yIHdoYXRldmVyLCByZXR1cm4gbnVsbAorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxBdXRvQ29uZGl0aW9uTG9jaz57bnVsbHB0cn07CisgICAgICAgIH0KKyAgICAgICAgd2FpdFRpbWUgPSBmYWlsVGltZSAtIHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKKyAgICB9CisKKyAgICAvLyBTZXQgdGhlIGNvbmRpdGlvbiBhbmQgcmV0dXJuCisgICAgbWFuYWdlci0+bVN0YXRlID0gdHJ1ZTsKKyAgICByZXR1cm4gc2NvcGVkTG9jazsKK30KKworc3RkOjp1bmlxdWVfcHRyPEF1dG9Db25kaXRpb25Mb2NrPiBBdXRvQ29uZGl0aW9uTG9jazo6d2FpdEFuZEFjcXVpcmUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxXYWl0YWJsZU11dGV4V3JhcHBlcj4mIG1hbmFnZXIpIHsKKworICAgIGlmIChtYW5hZ2VyID09IG51bGxwdHIgfHwgbWFuYWdlci0+bU11dGV4ID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gQmFkIGlucHV0LCByZXR1cm4gbnVsbAorICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPEF1dG9Db25kaXRpb25Mb2NrPntudWxscHRyfTsKKyAgICB9CisKKyAgICAvLyBBY3F1aXJlIHNjb3BlZCBsb2NrCisgICAgc3RkOjp1bmlxdWVfcHRyPEF1dG9Db25kaXRpb25Mb2NrPiBzY29wZWRMb2NrKG5ldyBBdXRvQ29uZGl0aW9uTG9jayhtYW5hZ2VyKSk7CisKKyAgICAvLyBXYWl0IHVudGlsIHdlIHRpbWVvdXQsIG9yIHN1Y2Nlc3MKKyAgICB3aGlsZShtYW5hZ2VyLT5tU3RhdGUpIHsKKyAgICAgICAgc3RhdHVzX3QgcmV0ID0gbWFuYWdlci0+bUNvbmRpdGlvbi53YWl0KCoobWFuYWdlci0+bU11dGV4KSk7CisgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIC8vIFRpbWVkIG91dCBvciB3aGF0ZXZlciwgcmV0dXJuIG51bGwKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8QXV0b0NvbmRpdGlvbkxvY2s+e251bGxwdHJ9OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2V0IHRoZSBjb25kaXRpb24gYW5kIHJldHVybgorICAgIG1hbmFnZXItPm1TdGF0ZSA9IHRydWU7CisgICAgcmV0dXJuIHNjb3BlZExvY2s7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9BdXRvQ29uZGl0aW9uTG9jay5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQXV0b0NvbmRpdGlvbkxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTNlYWZjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQXV0b0NvbmRpdGlvbkxvY2suaApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaWZuZGVmIEFORFJPSURfU0VSVklDRV9VVElMU19TQ09QRURfQ09ORElUSU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWSUNFX1VUSUxTX1NDT1BFRF9DT05ESVRJT05fSAorCisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFdhaXRhYmxlTXV0ZXhXcmFwcGVyIGNhbiBiZSB1c2VkIHdpdGggQXV0b0NvbmRpdGlvbkxvY2sgdG8gY29uc3RydWN0IHNjb3BlZCBsb2NrcyBmb3IgdGhlCisgKiB3cmFwcGVkIE11dGV4IHdpdGggdGltZW91dHMgZm9yIGxvY2sgYWNxdWlzaXRpb24uCisgKi8KK2NsYXNzIFdhaXRhYmxlTXV0ZXhXcmFwcGVyIHsKKyAgICBmcmllbmQgY2xhc3MgQXV0b0NvbmRpdGlvbkxvY2s7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0IHRoZSBDb25kaXRpb25NYW5nZXIgd2l0aCB0aGUgZ2l2ZW4gTXV0ZXguCisgICAgICovCisgICAgV2FpdGFibGVNdXRleFdyYXBwZXIoTXV0ZXgqIG11dGV4KTsKKworICAgIHZpcnR1YWwgfldhaXRhYmxlTXV0ZXhXcmFwcGVyKCk7Citwcml2YXRlOgorICAgIE11dGV4KiBtTXV0ZXg7CisgICAgYm9vbCBtU3RhdGU7CisgICAgQ29uZGl0aW9uIG1Db25kaXRpb247Cit9OworCisvKioKKyAqIEF1dG9Db25kaXRpb25Mb2NrIGlzIGEgc2NvcGVkIGxvY2sgc2ltaWxhciB0byBNdXRleDo6QXV0b2xvY2ssIGJ1dCBhbGxvd3MgdGltZW91dHMgdG8gYmUKKyAqIHNwZWNpZmllZCBmb3IgbG9jayBhY3F1aXNpdGlvbi4KKyAqCisgKiBBdXRvQ29uZGl0aW9uTG9jayBpcyB1c2VkIHdpdGggYSBXYWl0YWJsZU11dGV4V3JhcHBlciB0byBsb2NrL3VubG9jayB0aGUgV2FpdGFibGVNdXRleFdyYXBwZXIncworICogd3JhcHBlZCBNdXRleCwgYW5kIHdhaXQvc2V0L3NpZ25hbCB0aGUgV2FpdGFibGVNdXRleFdyYXBwZXIncyB3cmFwcGVkIGNvbmRpdGlvbi4gVG8gdXNlIHRoaXMsCisgKiBjYWxsIEF1dG9Db25kaXRpb25Mb2NrOjp3YWl0QW5kQWNxdWlyZSB0byBnZXQgYW4gaW5zdGFuY2UuICBUaGlzIHdpbGw6CisgKiAgICAgIC0gTG9jayB0aGUgZ2l2ZW4gV2FpdGFibGVNdXRleFdyYXBwZXIncyBtdXRleC4KKyAqICAgICAgLSBXYWl0IGZvciB0aGUgV2FpdGFibGVNdXRleFdyYXBwZXIncyBjb25kaXRpb24gdG8gYmVjb21lIGZhbHNlLCBvciB0aW1lb3V0LgorICogICAgICAtIFNldCB0aGUgV2FpdGFibGVNdXRleFdyYXBwZXIncyBjb25kaXRpb24gdG8gdHJ1ZS4KKyAqCisgKiBXaGVuIHRoZSBBdXRvQ29uZGl0aW9uTG9jayBnb2VzIG91dCBvZiBzY29wZSBhbmQgaXMgZGVzdHJveWVkLCB0aGlzIHdpbGw6CisgKiAgICAgIC0gU2V0IHRoZSBXYWl0YWJsZU11dGV4V3JhcHBlcidzIGNvbmRpdGlvbiB0byBmYWxzZS4KKyAqICAgICAgLSBTaWduYWwgdGhyZWFkcyB3YWl0aW5nIG9uIHRoaXMgY29uZGl0aW9uIHRvIHdha2V1cC4KKyAqICAgICAgLSBSZWxlYXNlIFdhaXRhYmxlTXV0ZXhXcmFwcGVyJ3MgbXV0ZXguCisgKi8KK2NsYXNzIEF1dG9Db25kaXRpb25Mb2NrIGZpbmFsIHsKK3B1YmxpYzoKKyAgICBBdXRvQ29uZGl0aW9uTG9jaygpID0gZGVsZXRlOworICAgIEF1dG9Db25kaXRpb25Mb2NrKGNvbnN0IEF1dG9Db25kaXRpb25Mb2NrJiBvdGhlcikgPSBkZWxldGU7CisgICAgQXV0b0NvbmRpdGlvbkxvY2sgJiBvcGVyYXRvcj0oY29uc3QgQXV0b0NvbmRpdGlvbkxvY2smKSA9IGRlbGV0ZTsKKworICAgIH5BdXRvQ29uZGl0aW9uTG9jaygpOworCisgICAgLyoqCisgICAgICogTWFrZSBhIG5ldyBBdXRvQ29uZGl0aW9uTG9jayBmcm9tIGEgZ2l2ZW4gV2FpdGFibGVNdXRleFdyYXBwZXIsIHdhaXRpbmcgdXAgdG8gd2FpdFRpbWUKKyAgICAgKiBuYW5vc2Vjb25kcyB0byBhY3F1aXJlIHRoZSBXYWl0YWJsZU11dGV4V3JhcHBlcidzIHdyYXBwZWQgbG9jay4KKyAgICAgKgorICAgICAqIFJldHVybiBhbiBlbXB0eSB1bmlxdWVfcHRyIGlmIHRoaXMgZmFpbHMsIG9yIGEgdGltZW91dCBvY2N1cnMuCisgICAgICovCisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxBdXRvQ29uZGl0aW9uTG9jaz4gd2FpdEFuZEFjcXVpcmUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8V2FpdGFibGVNdXRleFdyYXBwZXI+JiBtYW5hZ2VyLCBuc2Vjc190IHdhaXRUaW1lKTsKKworICAgIC8qKgorICAgICAqIE1ha2UgYSBuZXcgQXV0b0NvbmRpdGlvbkxvY2sgZnJvbSBhIGdpdmVuIFdhaXRhYmxlTXV0ZXhXcmFwcGVyLCB3YWl0aW5nIGluZGVmaW5pdGVseSB0bworICAgICAqIGFjcXVpcmUgdGhlIFdhaXRhYmxlTXV0ZXhXcmFwcGVyJ3Mgd3JhcHBlZCBsb2NrLgorICAgICAqCisgICAgICogUmV0dXJuIGFuIGVtcHR5IHVuaXF1ZV9wdHIgaWYgdGhpcyBmYWlscy4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEF1dG9Db25kaXRpb25Mb2NrPiB3YWl0QW5kQWNxdWlyZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxXYWl0YWJsZU11dGV4V3JhcHBlcj4mIG1hbmFnZXIpOworcHJpdmF0ZToKKyAgICBBdXRvQ29uZGl0aW9uTG9jayhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8V2FpdGFibGVNdXRleFdyYXBwZXI+JiBtYW5hZ2VyKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxXYWl0YWJsZU11dGV4V3JhcHBlcj4gbU1hbmFnZXI7CisgICAgTXV0ZXg6OkF1dG9sb2NrIG1BdXRvTG9jazsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1NFUlZJQ0VfVVRJTFNfU0NPUEVEX0NPTkRJVElPTl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DbGllbnRNYW5hZ2VyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DbGllbnRNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FlNThkNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NsaWVudE1hbmFnZXIuaApAQCAtMCwwICsxLDY0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWSUNFX1VUSUxTX0VWSUNUSU9OX1BPTElDWV9NQU5BR0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWSUNFX1VUSUxTX0VWSUNUSU9OX1BPTElDWV9NQU5BR0VSX0gKKworI2luY2x1ZGUgPHV0aWxzL0NvbmRpdGlvbi5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZXNvdXJjZV9wb2xpY3kgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioKKyAqIFRoZSBDbGllbnREZXNjcmlwdG9yIGNsYXNzIGlzIGEgY29udGFpbmVyIGZvciBhIGdpdmVuIGtleS92YWx1ZSBwYWlyIGlkZW50aWZ5aW5nIGEgc2hhcmVkCisgKiByZXNvdXJjZSwgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGNvc3QsIHByaW9yaXR5LCBvd25lciBJRCwgYW5kIGNvbmZsaWN0aW5nIGtleXMgbGlzdCB1c2VkCisgKiBpbiBkZXRlcm1pbmluZyBldmljdGlvbiBiZWhhdmlvci4KKyAqCisgKiBBc2lkZSBmcm9tIHRoZSBwcmlvcml0eSwgdGhlc2UgdmFsdWVzIGFyZSBpbW11dGFibGUgb25jZSB0aGUgQ2xpZW50RGVzY3JpcHRvciBoYXMgYmVlbgorICogY29uc3RydWN0ZWQuCisgKi8KK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUU+CitjbGFzcyBDbGllbnREZXNjcmlwdG9yIGZpbmFsIHsKK3B1YmxpYzoKKyAgICBDbGllbnREZXNjcmlwdG9yKGNvbnN0IEtFWSYga2V5LCBjb25zdCBWQUxVRSYgdmFsdWUsIGludDMyX3QgY29zdCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PEtFWT4mIGNvbmZsaWN0aW5nS2V5cywgaW50MzJfdCBwcmlvcml0eSwgaW50MzJfdCBvd25lcklkKTsKKyAgICBDbGllbnREZXNjcmlwdG9yKEtFWSYmIGtleSwgVkFMVUUmJiB2YWx1ZSwgaW50MzJfdCBjb3N0LCBzdGQ6OnNldDxLRVk+JiYgY29uZmxpY3RpbmdLZXlzLAorICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwgaW50MzJfdCBvd25lcklkKTsKKworICAgIH5DbGllbnREZXNjcmlwdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGtleSBmb3IgdGhpcyBkZXNjcmlwdG9yLgorICAgICAqLworICAgIGNvbnN0IEtFWSYgZ2V0S2V5KCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIGZvciB0aGlzIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgY29uc3QgVkFMVUUmIGdldFZhbHVlKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvc3QgZm9yIHRoaXMgZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICBpbnQzMl90IGdldENvc3QoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcHJpb3JpdHkgZm9yIHRoaXMgZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICBpbnQzMl90IGdldFByaW9yaXR5KCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG93bmVyIElEIGZvciB0aGlzIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgaW50MzJfdCBnZXRPd25lcklkKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4ga2V5IGlzIGluIHRoaXMgZGVzY3JpcHRvcidzIGNvbmZsaWN0aW5nIGtleXMgbGlzdC4KKyAgICAgKi8KKyAgICBib29sIGlzQ29uZmxpY3RpbmcoY29uc3QgS0VZJiBrZXkpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgYWxsIGNvbmZsaWN0aW5nIGtleXMgZm9yIHRoaXMgZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICBzdGQ6OnNldDxLRVk+IGdldENvbmZsaWN0aW5nKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHByb2lyaXR5IGZvciB0aGlzIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgdm9pZCBzZXRQcmlvcml0eShpbnQzMl90IHByaW9yaXR5KTsKKworICAgIC8vIFRoaXMgY2xhc3MgaXMgb3JkZXJlZCBieSBrZXkKKyAgICB0ZW1wbGF0ZTxjbGFzcyBLLCBjbGFzcyBWPgorICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIDwgKGNvbnN0IENsaWVudERlc2NyaXB0b3I8SywgVj4mIGEsIGNvbnN0IENsaWVudERlc2NyaXB0b3I8SywgVj4mIGIpOworCitwcml2YXRlOgorICAgIEtFWSBtS2V5OworICAgIFZBTFVFIG1WYWx1ZTsKKyAgICBpbnQzMl90IG1Db3N0OworICAgIHN0ZDo6c2V0PEtFWT4gbUNvbmZsaWN0aW5nOworICAgIGludDMyX3QgbVByaW9yaXR5OworICAgIGludDMyX3QgbU93bmVySWQ7Cit9OyAvLyBjbGFzcyBDbGllbnREZXNjcmlwdG9yCisKK3RlbXBsYXRlPGNsYXNzIEssIGNsYXNzIFY+Citib29sIG9wZXJhdG9yIDwgKGNvbnN0IENsaWVudERlc2NyaXB0b3I8SywgVj4mIGEsIGNvbnN0IENsaWVudERlc2NyaXB0b3I8SywgVj4mIGIpIHsKKyAgICByZXR1cm4gYS5tS2V5IDwgYi5tS2V5OworfQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFPgorQ2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPjo6Q2xpZW50RGVzY3JpcHRvcihjb25zdCBLRVkmIGtleSwgY29uc3QgVkFMVUUmIHZhbHVlLCBpbnQzMl90IGNvc3QsCisgICAgICAgIGNvbnN0IHN0ZDo6c2V0PEtFWT4mIGNvbmZsaWN0aW5nS2V5cywgaW50MzJfdCBwcmlvcml0eSwgaW50MzJfdCBvd25lcklkKSA6IG1LZXl7a2V5fSwKKyAgICAgICAgbVZhbHVle3ZhbHVlfSwgbUNvc3R7Y29zdH0sIG1Db25mbGljdGluZ3tjb25mbGljdGluZ0tleXN9LCBtUHJpb3JpdHl7cHJpb3JpdHl9LAorICAgICAgICBtT3duZXJJZHtvd25lcklkfSB7fQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFPgorQ2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPjo6Q2xpZW50RGVzY3JpcHRvcihLRVkmJiBrZXksIFZBTFVFJiYgdmFsdWUsIGludDMyX3QgY29zdCwKKyAgICAgICAgc3RkOjpzZXQ8S0VZPiYmIGNvbmZsaWN0aW5nS2V5cywgaW50MzJfdCBwcmlvcml0eSwgaW50MzJfdCBvd25lcklkKSA6CisgICAgICAgIG1LZXl7c3RkOjpmb3J3YXJkPEtFWT4oa2V5KX0sIG1WYWx1ZXtzdGQ6OmZvcndhcmQ8VkFMVUU+KHZhbHVlKX0sIG1Db3N0e2Nvc3R9LAorICAgICAgICBtQ29uZmxpY3Rpbmd7c3RkOjpmb3J3YXJkPHN0ZDo6c2V0PEtFWT4+KGNvbmZsaWN0aW5nS2V5cyl9LCBtUHJpb3JpdHl7cHJpb3JpdHl9LAorICAgICAgICBtT3duZXJJZHtvd25lcklkfSB7fQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFPgorQ2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPjo6fkNsaWVudERlc2NyaXB0b3IoKSB7fQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFPgorY29uc3QgS0VZJiBDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+OjpnZXRLZXkoKSBjb25zdCB7CisgICAgcmV0dXJuIG1LZXk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUU+Citjb25zdCBWQUxVRSYgQ2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPjo6Z2V0VmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1WYWx1ZTsKK30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRT4KK2ludDMyX3QgQ2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPjo6Z2V0Q29zdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNvc3Q7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUU+CitpbnQzMl90IENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT46OmdldFByaW9yaXR5KCkgY29uc3QgeworICAgIHJldHVybiBtUHJpb3JpdHk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUU+CitpbnQzMl90IENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT46OmdldE93bmVySWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Pd25lcklkOworfQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFPgorYm9vbCBDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+Ojppc0NvbmZsaWN0aW5nKGNvbnN0IEtFWSYga2V5KSBjb25zdCB7CisgICAgaWYgKGtleSA9PSBtS2V5KSByZXR1cm4gdHJ1ZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHggOiBtQ29uZmxpY3RpbmcpIHsKKyAgICAgICAgaWYgKGtleSA9PSB4KSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFPgorc3RkOjpzZXQ8S0VZPiBDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+OjpnZXRDb25mbGljdGluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNvbmZsaWN0aW5nOworfQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFPgordm9pZCBDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+OjpzZXRQcmlvcml0eShpbnQzMl90IHByaW9yaXR5KSB7CisgICAgbVByaW9yaXR5ID0gcHJpb3JpdHk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorICogQSBkZWZhdWx0IGNsYXNzIGltcGxlbWVudGluZyB0aGUgTElTVEVORVIgaW50ZXJmYWNlIHVzZWQgYnkgQ2xpZW50TWFuYWdlci4KKyAqLwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRT4KK2NsYXNzIERlZmF1bHRFdmVudExpc3RlbmVyIHsKK3B1YmxpYzoKKyAgICB2b2lkIG9uQ2xpZW50QWRkZWQoY29uc3QgQ2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPiYgZGVzY3JpcHRvcik7CisgICAgdm9pZCBvbkNsaWVudFJlbW92ZWQoY29uc3QgQ2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPiYgZGVzY3JpcHRvcik7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFPgordm9pZCBEZWZhdWx0RXZlbnRMaXN0ZW5lcjxLRVksIFZBTFVFPjo6b25DbGllbnRBZGRlZCgKKyAgICAgICAgY29uc3QgQ2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPiYgLypkZXNjcmlwdG9yKi8pIHt9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUU+Cit2b2lkIERlZmF1bHRFdmVudExpc3RlbmVyPEtFWSwgVkFMVUU+OjpvbkNsaWVudFJlbW92ZWQoCisgICAgICAgIGNvbnN0IENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4mIC8qZGVzY3JpcHRvciovKSB7fQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioKKyAqIFRoZSBDbGllbnRNYW5hZ2VyIGNsYXNzIHdyYXBzIGFuIExSVS1vcmRlcmVkIGxpc3Qgb2YgYWN0aXZlIGNsaWVudHMgYW5kIGltcGxlbWVudHMgZXZpY3Rpb24KKyAqIGJlaGF2aW9yIGZvciBoYW5kbGluZyBzaGFyZWQgcmVzb3VyY2UgYWNjZXNzLgorICoKKyAqIFdoZW4gYWRkaW5nIGEgbmV3IGRlc2NyaXB0b3IsIGV2aWN0aW9uIGJlaGF2aW9yIGlzIGFzIGZvbGxvd3M6CisgKiAgIC0gS2V5cyBhcmUgdW5pcXVlLCBhZGRpbmcgYSBkZXNjcmlwdG9yIHdpdGggdGhlIHNhbWUga2V5IGFzIGFuIGV4aXN0aW5nIGRlc2NyaXB0b3Igd2lsbAorICogICAgIHJlc3VsdCBpbiB0aGUgbG93ZXItcHJpb3JpdHkgb2YgdGhlIHR3byBiZWluZyByZW1vdmVkLiAgUHJpb3JpdHkgdGllcyByZXN1bHQgaW4gdGhlCisgKiAgICAgTFJVIGRlc2NyaXB0b3IgYmVpbmcgZXZpY3RlZCAodGhpcyBtZWFucyB0aGUgaW5jb21pbmcgZGVzY3JpcHRvciBiZSBhZGRlZCBpbiB0aGlzIGNhc2UpLgorICogICAtIEFueSBkZXNjcmlwdG9ycyB3aXRoIGtleXMgdGhhdCBhcmUgaW4gdGhlIGluY29taW5nIGRlc2NyaXB0b3IncyAnY29uZmxpY3Rpbmcga2V5cycgbGlzdAorICogICAgIHdpbGwgYmUgcmVtb3ZlZCBpZiB0aGV5IGhhdmUgYW4gZXF1YWwgb3IgbG93ZXIgcHJpb3JpdHkgdGhhbiB0aGUgaW5jb21pbmcgZGVzY3JpcHRvcjsKKyAqICAgICBpZiBhbnkgaGF2ZSBhIGhpZ2hlciBwcmlvcml0eSwgdGhlIGluY29taW5nIGRlc2NyaXB0b3IgaXMgcmVtb3ZlZCBpbnN0ZWFkLgorICogICAtIElmIHRoZSBzdW0gb2YgYWxsIGRlc2NyaXB0b3JzJyBjb3N0cywgaW5jbHVkaW5nIHRoZSBpbmNvbWluZyBkZXNjcmlwdG9yJ3MsIGlzIG1vcmUgdGhhbgorICogICAgIHRoZSBtYXggY29zdCBhbGxvd2VkIGZvciB0aGlzIENsaWVudE1hbmFnZXIsIGRlc2NyaXB0b3JzIHdpdGggbm9uLXplcm8gY29zdCwgZXF1YWwgb3IgbG93ZXIKKyAqICAgICBwcmlvcml0eSwgYW5kIGEgZGlmZmVyZW50IG93bmVyIHdpbGwgYmUgZXZpY3RlZCBpbiBMUlUgb3JkZXIgdW50aWwgZWl0aGVyIHRoZSBjb3N0IGlzIGxlc3MKKyAqICAgICB0aGFuIHRoZSBtYXggY29zdCwgb3IgYWxsIGRlc2NyaXB0b3JzIG1lZXRpbmcgdGhpcyBjcml0ZXJpYSBoYXZlIGJlZW4gZXZpY3RlZCBhbmQgdGhlCisgKiAgICAgaW5jb21pbmcgZGVzY3JpcHRvciBoYXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkuICBPdGhlcndpc2UsIHRoZSBpbmNvbWluZyBkZXNjcmlwdG9yIGlzCisgKiAgICAgcmVtb3ZlZCBpbnN0ZWFkLgorICovCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFLCBjbGFzcyBMSVNURU5FUj1EZWZhdWx0RXZlbnRMaXN0ZW5lcjxLRVksIFZBTFVFPj4KK2NsYXNzIENsaWVudE1hbmFnZXIgeworcHVibGljOgorICAgIC8vIFRoZSBkZWZhdWx0IG1heGltdW0gImNvc3QiIGFsbG93ZWQgYmVmb3JlIGV2aWN0aW5nCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IERFRkFVTFRfTUFYX0NPU1QgPSAxMDA7CisKKyAgICBDbGllbnRNYW5hZ2VyKCk7CisgICAgQ2xpZW50TWFuYWdlcihpbnQzMl90IHRvdGFsQ29zdCk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBnaXZlbiBDbGllbnREZXNjcmlwdG9yIHRvIHRoZSBtYW5hZ2VkIGxpc3QuICBDbGllbnREZXNjcmlwdG9ycyBmb3IgY2xpZW50cyB0aGF0CisgICAgICogYXJlIGV2aWN0ZWQgYnkgdGhpcyBhY3Rpb24gYXJlIHJldHVybmVkIGluIGEgdmVjdG9yLgorICAgICAqCisgICAgICogVGhpcyBtYXkgcmV0dXJuIHRoZSBDbGllbnREZXNjcmlwdG9yIHBhc3NlZCBpbiBpZiBpdCB3b3VsZCBiZSBldmljdGVkLgorICAgICAqLworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+Pj4gYWRkQW5kRXZpY3QoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4mIGNsaWVudCk7CisKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIG1hcCBjb250YWluaW5nIG93bmVyIChwaWQpIC0+IHByaW9yaXR5IG1hcHBpbmdzLCB1cGRhdGUgdGhlIHByaW9yaXR5IG9mIGVhY2gKKyAgICAgKiBDbGllbnREZXNjcmlwdG9yIHdpdGggYW4gb3duZXIgaW4gdGhpcyBtYXBwaW5nLgorICAgICAqLworICAgIHZvaWQgdXBkYXRlUHJpb3JpdGllcyhjb25zdCBzdGQ6Om1hcDxpbnQzMl90LGludDMyX3Q+JiBvd25lclByaW9yaXR5TGlzdCk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYWxsIENsaWVudERlc2NyaXB0b3JzLgorICAgICAqLworICAgIHZvaWQgcmVtb3ZlQWxsKCk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW5kIHJldHVybiB0aGUgQ2xpZW50RGVzY3JpcHRvciB3aXRoIGEgZ2l2ZW4ga2V5LgorICAgICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+PiByZW1vdmUoY29uc3QgS0VZJiBrZXkpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBnaXZlbiBDbGllbnREZXNjcmlwdG9yLgorICAgICAqLworICAgIHZvaWQgcmVtb3ZlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+PiYgdmFsdWUpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgdmVjdG9yIG9mIHRoZSBDbGllbnREZXNjcmlwdG9ycyB0aGF0IHdvdWxkIGJlIGV2aWN0ZWQgYnkgYWRkaW5nIHRoZSBnaXZlbgorICAgICAqIENsaWVudERlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBUaGlzIG1heSByZXR1cm4gdGhlIENsaWVudERlc2NyaXB0b3IgcGFzc2VkIGluIGlmIGl0IHdvdWxkIGJlIGV2aWN0ZWQuCisgICAgICovCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+PiB3b3VsZEV2aWN0KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+JiBjbGllbnQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgdmVjdG9yIG9mIGFjdGl2ZSBDbGllbnREZXNjcmlwdG9ycyB0aGF0IHByZXZlbnQgdGhpcyBjbGllbnQgZnJvbSBiZWluZyBhZGRlZC4KKyAgICAgKi8KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4+IGdldEluY29tcGF0aWJsZUNsaWVudHMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4mIGNsaWVudCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSB2ZWN0b3IgY29udGFpbmluZyBhbGwgY3VycmVudGx5IGFjdGl2ZSBDbGllbnREZXNjcmlwdG9ycy4KKyAgICAgKi8KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4+IGdldEFsbCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgdmVjdG9yIGNvbnRhaW5pbmcgYWxsIGtleXMgb2YgY3VycmVudGx5IGFjdGl2ZSBDbGllbnREZXNjcmlwdG9ycy4KKyAgICAgKi8KKyAgICBzdGQ6OnZlY3RvcjxLRVk+IGdldEFsbEtleXMoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHZlY3RvciBvZiB0aGUgb3duZXIgdGFncyBvZiBhbGwgY3VycmVudGx5IGFjdGl2ZSBDbGllbnREZXNjcmlwdG9ycyAoZHVwbGljYXRlcworICAgICAqIHdpbGwgYmUgcmVtb3ZlZCkuCisgICAgICovCisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gZ2V0QWxsT3duZXJzKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIENsaWVudERlc2NyaXB0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4ga2V5LCBvciBhbiBlbXB0eSBzaGFyZWQgcG9pbnRlcgorICAgICAqIGlmIG5vbmUgZXhpc3RzLgorICAgICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+PiBnZXQoY29uc3QgS0VZJiBrZXkpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQmxvY2sgdW50aWwgdGhlIGdpdmVuIGNsaWVudCBpcyBubyBsb25nZXIgaW4gdGhlIGFjdGl2ZSBjbGllbnRzIGxpc3QsIG9yIHRoZSB0aW1lb3V0CisgICAgICogb2NjdXJyZWQuCisgICAgICoKKyAgICAgKiBSZXR1cm5zIE5PX0VSUk9SIGlmIHRoaXMgc3VjY2VlZGVkLCAtRVRJTUVET1VUIG9uIGEgdGltZW91dCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uCisgICAgICogZmFpbHVyZS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCB3YWl0VW50aWxSZW1vdmVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+PiBjbGllbnQsCisgICAgICAgICAgICBuc2Vjc190IHRpbWVvdXQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjdXJyZW50IGxpc3RlbmVyIGZvciBjbGllbnQgYWRkL3JlbW92ZSBldmVudHMuCisgICAgICoKKyAgICAgKiBUaGUgbGlzdGVuZXIgaW5zdGFuY2UgbXVzdCBpbmhlcml0IGZyb20gdGhlIExJU1RFTkVSIGNsYXNzIGFuZCBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZworICAgICAqIG1ldGhvZHM6CisgICAgICogICAgdm9pZCBvbkNsaWVudFJlbW92ZWQoY29uc3QgQ2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPiYgZGVzY3JpcHRvcik7CisgICAgICogICAgdm9pZCBvbkNsaWVudEFkZGVkKGNvbnN0IENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4mIGRlc2NyaXB0b3IpOworICAgICAqCisgICAgICogVGhlc2UgY2FsbGJhY2sgbWV0aG9kcyB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBDbGllbnRNYW5hZ2VyJ3MgbG9jayBoZWxkLCBhbmQgc2hvdWxkCisgICAgICogbm90IGNhbGwgYW55IGZ1cnRoZXIgQ2xpZW50TWFuYWdlciBtZXRob2RzLgorICAgICAqCisgICAgICogVGhlIG9uQ2xpZW50UmVtb3ZlZCBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgY2xpZW50IGhhcyBiZWVuIHJlbW92ZWQgb3IgZXZpY3RlZAorICAgICAqIGZyb20gdGhlIENsaWVudE1hbmFnZXIgdGhhdCB0aGlzIGV2ZW50IGxpc3RlbmVyIGhhcyBiZWVuIGFkZGVkIHRvLiBUaGUgb25DbGllbnRBZGRlZAorICAgICAqIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBjbGllbnQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIENsaWVudE1hbmFnZXIgdGhhdCB0aGlzCisgICAgICogZXZlbnQgbGlzdGVuZXIgaGFzIGJlZW4gYWRkZWQgdG8uCisgICAgICovCisgICAgdm9pZCBzZXRMaXN0ZW5lcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TElTVEVORVI+JiBsaXN0ZW5lcik7CisKK3Byb3RlY3RlZDoKKyAgICB+Q2xpZW50TWFuYWdlcigpOworCitwcml2YXRlOgorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgdmVjdG9yIG9mIHRoZSBDbGllbnREZXNjcmlwdG9ycyB0aGF0IHdvdWxkIGJlIGV2aWN0ZWQgYnkgYWRkaW5nIHRoZSBnaXZlbgorICAgICAqIENsaWVudERlc2NyaXB0b3IuICBJZiByZXR1cm5JbmNvbXBhdGlibGVDbGllbnRzIGlzIHNldCB0byB0cnVlLCBpbnN0ZWFkLCByZXR1cm4gdGhlCisgICAgICogdmVjdG9yIG9mIENsaWVudERlc2NyaXB0b3JzIHRoYXQgYXJlIGhpZ2hlciBwcmlvcml0eSB0aGFuIHRoZSBpbmNvbWluZyBjbGllbnQgYW5kCisgICAgICogZWl0aGVyIGNvbmZsaWN0IHdpdGggdGhpcyBjbGllbnQsIG9yIGNvbnRyaWJ1dGUgdG8gdGhlIHJlc291cmNlIGNvc3QgaWYgdGhhdCB3b3VsZAorICAgICAqIHByZXZlbnQgdGhlIGluY29taW5nIGNsaWVudCBmcm9tIGJlaW5nIGFkZGVkLgorICAgICAqCisgICAgICogVGhpcyBtYXkgcmV0dXJuIHRoZSBDbGllbnREZXNjcmlwdG9yIHBhc3NlZCBpbi4KKyAgICAgKi8KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4+IHdvdWxkRXZpY3RMb2NrZWQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4mIGNsaWVudCwKKyAgICAgICAgICAgIGJvb2wgcmV0dXJuSW5jb21wYXRpYmxlQ2xpZW50cyA9IGZhbHNlKSBjb25zdDsKKworICAgIGludDY0X3QgZ2V0Q3VycmVudENvc3RMb2NrZWQoKSBjb25zdDsKKworICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CisgICAgbXV0YWJsZSBDb25kaXRpb24gbVJlbW92ZWRDb25kaXRpb247CisgICAgaW50MzJfdCBtTWF4Q29zdDsKKyAgICAvLyBMUlUgb3JkZXJlZCwgbW9zdCByZWNlbnQgYXQgZW5kCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+PiBtQ2xpZW50czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TElTVEVORVI+IG1MaXN0ZW5lcjsKK307IC8vIGNsYXNzIENsaWVudE1hbmFnZXIKKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRSwgY2xhc3MgTElTVEVORVI+CitDbGllbnRNYW5hZ2VyPEtFWSwgVkFMVUUsIExJU1RFTkVSPjo6Q2xpZW50TWFuYWdlcigpIDoKKyAgICAgICAgQ2xpZW50TWFuYWdlcihERUZBVUxUX01BWF9DT1NUKSB7fQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFLCBjbGFzcyBMSVNURU5FUj4KK0NsaWVudE1hbmFnZXI8S0VZLCBWQUxVRSwgTElTVEVORVI+OjpDbGllbnRNYW5hZ2VyKGludDMyX3QgdG90YWxDb3N0KSA6IG1NYXhDb3N0KHRvdGFsQ29zdCkge30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRSwgY2xhc3MgTElTVEVORVI+CitDbGllbnRNYW5hZ2VyPEtFWSwgVkFMVUUsIExJU1RFTkVSPjo6fkNsaWVudE1hbmFnZXIoKSB7fQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFLCBjbGFzcyBMSVNURU5FUj4KK3N0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+Pj4KK0NsaWVudE1hbmFnZXI8S0VZLCBWQUxVRSwgTElTVEVORVI+Ojp3b3VsZEV2aWN0KAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4mIGNsaWVudCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gd291bGRFdmljdExvY2tlZChjbGllbnQpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFLCBjbGFzcyBMSVNURU5FUj4KK3N0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+Pj4KK0NsaWVudE1hbmFnZXI8S0VZLCBWQUxVRSwgTElTVEVORVI+OjpnZXRJbmNvbXBhdGlibGVDbGllbnRzKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4mIGNsaWVudCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gd291bGRFdmljdExvY2tlZChjbGllbnQsIC8qcmV0dXJuSW5jb21wYXRpYmxlQ2xpZW50cyovdHJ1ZSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUUsIGNsYXNzIExJU1RFTkVSPgorc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+PgorQ2xpZW50TWFuYWdlcjxLRVksIFZBTFVFLCBMSVNURU5FUj46OndvdWxkRXZpY3RMb2NrZWQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+PiYgY2xpZW50LAorICAgICAgICBib29sIHJldHVybkluY29tcGF0aWJsZUNsaWVudHMpIGNvbnN0IHsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+Pj4gZXZpY3RMaXN0OworCisgICAgLy8gRGlzYWxsb3cgbnVsbCBjbGllbnRzLCByZXR1cm4gaW5wdXQKKyAgICBpZiAoY2xpZW50ID09IG51bGxwdHIpIHsKKyAgICAgICAgZXZpY3RMaXN0LnB1c2hfYmFjayhjbGllbnQpOworICAgICAgICByZXR1cm4gZXZpY3RMaXN0OworICAgIH0KKworICAgIGNvbnN0IEtFWSYga2V5ID0gY2xpZW50LT5nZXRLZXkoKTsKKyAgICBpbnQzMl90IGNvc3QgPSBjbGllbnQtPmdldENvc3QoKTsKKyAgICBpbnQzMl90IHByaW9yaXR5ID0gY2xpZW50LT5nZXRQcmlvcml0eSgpOworICAgIGludDMyX3Qgb3duZXIgPSBjbGllbnQtPmdldE93bmVySWQoKTsKKworICAgIGludDY0X3QgdG90YWxDb3N0ID0gZ2V0Q3VycmVudENvc3RMb2NrZWQoKSArIGNvc3Q7CisKKyAgICAvLyBEZXRlcm1pbmUgdGhlIE1SVSBvZiB0aGUgb3duZXJzIHRpZWQgZm9yIGhhdmluZyB0aGUgaGlnaGVzdCBwcmlvcml0eQorICAgIGludDMyX3QgaGlnaGVzdFByaW9yaXR5T3duZXIgPSBvd25lcjsKKyAgICBpbnQzMl90IGhpZ2hlc3RQcmlvcml0eSA9IHByaW9yaXR5OworICAgIGZvciAoY29uc3QgYXV0byYgaSA6IG1DbGllbnRzKSB7CisgICAgICAgIGludDMyX3QgY3VyUHJpb3JpdHkgPSBpLT5nZXRQcmlvcml0eSgpOworICAgICAgICBpZiAoY3VyUHJpb3JpdHkgPj0gaGlnaGVzdFByaW9yaXR5KSB7CisgICAgICAgICAgICBoaWdoZXN0UHJpb3JpdHkgPSBjdXJQcmlvcml0eTsKKyAgICAgICAgICAgIGhpZ2hlc3RQcmlvcml0eU93bmVyID0gaS0+Z2V0T3duZXJJZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGhpZ2hlc3RQcmlvcml0eSA9PSBwcmlvcml0eSkgeworICAgICAgICAvLyBTd2l0Y2ggYmFjayBvd25lciBpZiB0aGUgaW5jb21pbmcgY2xpZW50IGhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eSwgYXMgaXQgaXMgTVJVCisgICAgICAgIGhpZ2hlc3RQcmlvcml0eU93bmVyID0gb3duZXI7CisgICAgfQorCisgICAgLy8gQnVpbGQgZXZpY3Rpb24gbGlzdCBvZiBjbGllbnRzIHRvIHJlbW92ZQorICAgIGZvciAoY29uc3QgYXV0byYgaSA6IG1DbGllbnRzKSB7CisgICAgICAgIGNvbnN0IEtFWSYgY3VyS2V5ID0gaS0+Z2V0S2V5KCk7CisgICAgICAgIGludDMyX3QgY3VyQ29zdCA9IGktPmdldENvc3QoKTsKKyAgICAgICAgaW50MzJfdCBjdXJQcmlvcml0eSA9IGktPmdldFByaW9yaXR5KCk7CisgICAgICAgIGludDMyX3QgY3VyT3duZXIgPSBpLT5nZXRPd25lcklkKCk7CisKKyAgICAgICAgYm9vbCBjb25mbGljdGluZyA9IChjdXJLZXkgPT0ga2V5IHx8IGktPmlzQ29uZmxpY3Rpbmcoa2V5KSB8fAorICAgICAgICAgICAgICAgIGNsaWVudC0+aXNDb25mbGljdGluZyhjdXJLZXkpKTsKKworICAgICAgICBpZiAoIXJldHVybkluY29tcGF0aWJsZUNsaWVudHMpIHsKKyAgICAgICAgICAgIC8vIEZpbmQgZXZpY3RlZCBjbGllbnRzCisKKyAgICAgICAgICAgIGlmIChjb25mbGljdGluZyAmJiBjdXJQcmlvcml0eSA+IHByaW9yaXR5KSB7CisgICAgICAgICAgICAgICAgLy8gUHJlLWV4aXN0aW5nIGNvbmZsaWN0aW5nIGNsaWVudCB3aXRoIGhpZ2hlciBwcmlvcml0eSBleGlzdHMKKyAgICAgICAgICAgICAgICBldmljdExpc3QuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBldmljdExpc3QucHVzaF9iYWNrKGNsaWVudCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGV2aWN0TGlzdDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmxpY3RpbmcgfHwgKCh0b3RhbENvc3QgPiBtTWF4Q29zdCAmJiBjdXJDb3N0ID4gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGN1clByaW9yaXR5IDw9IHByaW9yaXR5KSAmJgorICAgICAgICAgICAgICAgICAgICAhKGhpZ2hlc3RQcmlvcml0eU93bmVyID09IG93bmVyICYmIG93bmVyID09IGN1ck93bmVyKSkpIHsKKyAgICAgICAgICAgICAgICAvLyBBZGQgYSBwcmUtZXhpc3RpbmcgY2xpZW50IHRvIHRoZSBldmljdGlvbiBsaXN0IGlmOgorICAgICAgICAgICAgICAgIC8vIC0gV2UgYXJlIGFkZGluZyBhIGNsaWVudCB3aXRoIGhpZ2hlciBwcmlvcml0eSB0aGF0IGNvbmZsaWN0cyB3aXRoIHRoaXMgb25lLgorICAgICAgICAgICAgICAgIC8vIC0gVGhlIHRvdGFsIGNvc3QgaW5jbHVkaW5nIHRoZSBpbmNvbWluZyBjbGllbnQncyBpcyBtb3JlIHRoYW4gdGhlIGFsbG93YWJsZQorICAgICAgICAgICAgICAgIC8vICAgbWF4aW11bSwgYW5kIHRoZSBjbGllbnQgaGFzIGEgbm9uLXplcm8gY29zdCwgbG93ZXIgcHJpb3JpdHksIGFuZCBhIGRpZmZlcmVudAorICAgICAgICAgICAgICAgIC8vICAgb3duZXIgdGhhbiB0aGUgaW5jb21pbmcgY2xpZW50IHdoZW4gdGhlIGluY29taW5nIGNsaWVudCBoYXMgdGhlCisgICAgICAgICAgICAgICAgLy8gICBoaWdoZXN0IHByaW9yaXR5LgorICAgICAgICAgICAgICAgIGV2aWN0TGlzdC5wdXNoX2JhY2soaSk7CisgICAgICAgICAgICAgICAgdG90YWxDb3N0IC09IGN1ckNvc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBGaW5kIGNsaWVudHMgcHJldmVudGluZyB0aGUgaW5jb21pbmcgY2xpZW50IGZyb20gYmVpbmcgYWRkZWQKKworICAgICAgICAgICAgaWYgKGN1clByaW9yaXR5ID4gcHJpb3JpdHkgJiYgKGNvbmZsaWN0aW5nIHx8ICh0b3RhbENvc3QgPiBtTWF4Q29zdCAmJiBjdXJDb3N0ID4gMCkpKSB7CisgICAgICAgICAgICAgICAgLy8gUHJlLWV4aXN0aW5nIGNvbmZsaWN0aW5nIGNsaWVudCB3aXRoIGhpZ2hlciBwcmlvcml0eSBleGlzdHMKKyAgICAgICAgICAgICAgICBldmljdExpc3QucHVzaF9iYWNrKGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gSW1tZWRpYXRlbHkgcmV0dXJuIHRoZSBpbmNvbXBhdGlibGUgY2xpZW50cyBpZiB3ZSBhcmUgY2FsY3VsYXRpbmcgdGhlc2UgaW5zdGVhZAorICAgIGlmIChyZXR1cm5JbmNvbXBhdGlibGVDbGllbnRzKSB7CisgICAgICAgIHJldHVybiBldmljdExpc3Q7CisgICAgfQorCisgICAgLy8gSWYgdGhlIHRvdGFsIGNvc3QgaXMgdG9vIGhpZ2gsIHJldHVybiB0aGUgaW5wdXQgdW5sZXNzIHRoZSBpbnB1dCBoYXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkKKyAgICBpZiAodG90YWxDb3N0ID4gbU1heENvc3QgJiYgaGlnaGVzdFByaW9yaXR5T3duZXIgIT0gb3duZXIpIHsKKyAgICAgICAgZXZpY3RMaXN0LmNsZWFyKCk7CisgICAgICAgIGV2aWN0TGlzdC5wdXNoX2JhY2soY2xpZW50KTsKKyAgICAgICAgcmV0dXJuIGV2aWN0TGlzdDsKKyAgICB9CisKKyAgICByZXR1cm4gZXZpY3RMaXN0OworCit9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUUsIGNsYXNzIExJU1RFTkVSPgorc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+PgorQ2xpZW50TWFuYWdlcjxLRVksIFZBTFVFLCBMSVNURU5FUj46OmFkZEFuZEV2aWN0KAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4mIGNsaWVudCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBhdXRvIGV2aWN0ZWQgPSB3b3VsZEV2aWN0TG9ja2VkKGNsaWVudCk7CisgICAgYXV0byBpdCA9IGV2aWN0ZWQuYmVnaW4oKTsKKyAgICBpZiAoaXQgIT0gZXZpY3RlZC5lbmQoKSAmJiAqaXQgPT0gY2xpZW50KSB7CisgICAgICAgIHJldHVybiBldmljdGVkOworICAgIH0KKworICAgIGF1dG8gaXRlciA9IGV2aWN0ZWQuY2JlZ2luKCk7CisKKyAgICBpZiAoaXRlciAhPSBldmljdGVkLmNlbmQoKSkgeworCisgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbHB0cikgbUxpc3RlbmVyLT5vbkNsaWVudFJlbW92ZWQoKippdGVyKTsKKworICAgICAgICAvLyBSZW1vdmUgZXZpY3RlZCBjbGllbnRzIGZyb20gbGlzdAorICAgICAgICBtQ2xpZW50cy5lcmFzZShzdGQ6OnJlbW92ZV9pZihtQ2xpZW50cy5iZWdpbigpLCBtQ2xpZW50cy5lbmQoKSwKKyAgICAgICAgICAgIFsmaXRlcl0gKHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+PiYgY3VyQ2xpZW50UHRyKSB7CisgICAgICAgICAgICAgICAgaWYgKGN1ckNsaWVudFB0ci0+Z2V0S2V5KCkgPT0gKCppdGVyKS0+Z2V0S2V5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaXRlcisrOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSksIG1DbGllbnRzLmVuZCgpKTsKKyAgICB9CisKKyAgICBpZiAobUxpc3RlbmVyICE9IG51bGxwdHIpIG1MaXN0ZW5lci0+b25DbGllbnRBZGRlZCgqY2xpZW50KTsKKyAgICBtQ2xpZW50cy5wdXNoX2JhY2soY2xpZW50KTsKKyAgICBtUmVtb3ZlZENvbmRpdGlvbi5icm9hZGNhc3QoKTsKKworICAgIHJldHVybiBldmljdGVkOworfQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFLCBjbGFzcyBMSVNURU5FUj4KK3N0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+Pj4KK0NsaWVudE1hbmFnZXI8S0VZLCBWQUxVRSwgTElTVEVORVI+OjpnZXRBbGwoKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIHJldHVybiBtQ2xpZW50czsKK30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRSwgY2xhc3MgTElTVEVORVI+CitzdGQ6OnZlY3RvcjxLRVk+IENsaWVudE1hbmFnZXI8S0VZLCBWQUxVRSwgTElTVEVORVI+OjpnZXRBbGxLZXlzKCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBzdGQ6OnZlY3RvcjxLRVk+IGtleXMobUNsaWVudHMuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGkgOiBtQ2xpZW50cykgeworICAgICAgICBrZXlzLnB1c2hfYmFjayhpLT5nZXRLZXkoKSk7CisgICAgfQorICAgIHJldHVybiBrZXlzOworfQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFLCBjbGFzcyBMSVNURU5FUj4KK3N0ZDo6dmVjdG9yPGludDMyX3Q+IENsaWVudE1hbmFnZXI8S0VZLCBWQUxVRSwgTElTVEVORVI+OjpnZXRBbGxPd25lcnMoKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIHN0ZDo6c2V0PGludDMyX3Q+IG93bmVyczsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGkgOiBtQ2xpZW50cykgeworICAgICAgICBvd25lcnMuZW1wbGFjZShpLT5nZXRPd25lcklkKCkpOworICAgIH0KKyAgICByZXR1cm4gc3RkOjp2ZWN0b3I8aW50MzJfdD4ob3duZXJzLmJlZ2luKCksIG93bmVycy5lbmQoKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUUsIGNsYXNzIExJU1RFTkVSPgordm9pZCBDbGllbnRNYW5hZ2VyPEtFWSwgVkFMVUUsIExJU1RFTkVSPjo6dXBkYXRlUHJpb3JpdGllcygKKyAgICAgICAgY29uc3Qgc3RkOjptYXA8aW50MzJfdCxpbnQzMl90PiYgb3duZXJQcmlvcml0eUxpc3QpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgZm9yIChhdXRvJiBpIDogbUNsaWVudHMpIHsKKyAgICAgICAgYXV0byBqID0gb3duZXJQcmlvcml0eUxpc3QuZmluZChpLT5nZXRPd25lcklkKCkpOworICAgICAgICBpZiAoaiAhPSBvd25lclByaW9yaXR5TGlzdC5lbmQoKSkgeworICAgICAgICAgICAgaS0+c2V0UHJpb3JpdHkoai0+c2Vjb25kKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRSwgY2xhc3MgTElTVEVORVI+CitzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4gQ2xpZW50TWFuYWdlcjxLRVksIFZBTFVFLCBMSVNURU5FUj46OmdldCgKKyAgICAgICAgY29uc3QgS0VZJiBrZXkpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgZm9yIChjb25zdCBhdXRvJiBpIDogbUNsaWVudHMpIHsKKyAgICAgICAgaWYgKGktPmdldEtleSgpID09IGtleSkgcmV0dXJuIGk7CisgICAgfQorICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4obnVsbHB0cik7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUUsIGNsYXNzIExJU1RFTkVSPgordm9pZCBDbGllbnRNYW5hZ2VyPEtFWSwgVkFMVUUsIExJU1RFTkVSPjo6cmVtb3ZlQWxsKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobUxpc3RlbmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpIDogbUNsaWVudHMpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lci0+b25DbGllbnRSZW1vdmVkKCppKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtQ2xpZW50cy5jbGVhcigpOworICAgIG1SZW1vdmVkQ29uZGl0aW9uLmJyb2FkY2FzdCgpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFLCBjbGFzcyBMSVNURU5FUj4KK3N0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+PiBDbGllbnRNYW5hZ2VyPEtFWSwgVkFMVUUsIExJU1RFTkVSPjo6cmVtb3ZlKAorICAgIGNvbnN0IEtFWSYga2V5KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworCisgICAgc3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+IHJldDsKKworICAgIC8vIFJlbW92ZSBldmljdGVkIGNsaWVudHMgZnJvbSBsaXN0CisgICAgbUNsaWVudHMuZXJhc2Uoc3RkOjpyZW1vdmVfaWYobUNsaWVudHMuYmVnaW4oKSwgbUNsaWVudHMuZW5kKCksCisgICAgICAgIFt0aGlzLCAma2V5LCAmcmV0XSAoc3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+JiBjdXJDbGllbnRQdHIpIHsKKyAgICAgICAgICAgIGlmIChjdXJDbGllbnRQdHItPmdldEtleSgpID09IGtleSkgeworICAgICAgICAgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbHB0cikgbUxpc3RlbmVyLT5vbkNsaWVudFJlbW92ZWQoKmN1ckNsaWVudFB0cik7CisgICAgICAgICAgICAgICAgcmV0ID0gY3VyQ2xpZW50UHRyOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9KSwgbUNsaWVudHMuZW5kKCkpOworCisgICAgbVJlbW92ZWRDb25kaXRpb24uYnJvYWRjYXN0KCk7CisgICAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRSwgY2xhc3MgTElTVEVORVI+CitzdGF0dXNfdCBDbGllbnRNYW5hZ2VyPEtFWSwgVkFMVUUsIExJU1RFTkVSPjo6d2FpdFVudGlsUmVtb3ZlZCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+IGNsaWVudCwKKyAgICAgICAgbnNlY3NfdCB0aW1lb3V0KSBjb25zdCB7CisgICAgc3RhdHVzX3QgcmV0ID0gTk9fRVJST1I7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworCisgICAgYm9vbCBpc1JlbW92ZWQgPSBmYWxzZTsKKworICAgIC8vIEZpZ3VyZSBvdXQgd2hhdCB0aW1lIGluIHRoZSBmdXR1cmUgd2Ugc2hvdWxkIGhpdCB0aGUgdGltZW91dAorICAgIG5zZWNzX3QgZmFpbFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykgKyB0aW1lb3V0OworCisgICAgd2hpbGUgKCFpc1JlbW92ZWQpIHsKKyAgICAgICAgaXNSZW1vdmVkID0gdHJ1ZTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpIDogbUNsaWVudHMpIHsKKyAgICAgICAgICAgIGlmIChpID09IGNsaWVudCkgeworICAgICAgICAgICAgICAgIGlzUmVtb3ZlZCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpc1JlbW92ZWQpIHsKKyAgICAgICAgICAgIHJldCA9IG1SZW1vdmVkQ29uZGl0aW9uLndhaXRSZWxhdGl2ZShtTG9jaywgdGltZW91dCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aW1lb3V0ID0gZmFpbFRpbWUgLSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFLCBjbGFzcyBMSVNURU5FUj4KK3ZvaWQgQ2xpZW50TWFuYWdlcjxLRVksIFZBTFVFLCBMSVNURU5FUj46OnNldExpc3RlbmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMSVNURU5FUj4mIGxpc3RlbmVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworfQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFLCBjbGFzcyBMSVNURU5FUj4KK3ZvaWQgQ2xpZW50TWFuYWdlcjxLRVksIFZBTFVFLCBMSVNURU5FUj46OnJlbW92ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+JiB2YWx1ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICAvLyBSZW1vdmUgZXZpY3RlZCBjbGllbnRzIGZyb20gbGlzdAorICAgIG1DbGllbnRzLmVyYXNlKHN0ZDo6cmVtb3ZlX2lmKG1DbGllbnRzLmJlZ2luKCksIG1DbGllbnRzLmVuZCgpLAorICAgICAgICBbdGhpcywgJnZhbHVlXSAoc3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+JiBjdXJDbGllbnRQdHIpIHsKKyAgICAgICAgICAgIGlmIChjdXJDbGllbnRQdHIgPT0gdmFsdWUpIHsKKyAgICAgICAgICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGxwdHIpIG1MaXN0ZW5lci0+b25DbGllbnRSZW1vdmVkKCpjdXJDbGllbnRQdHIpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9KSwgbUNsaWVudHMuZW5kKCkpOworICAgIG1SZW1vdmVkQ29uZGl0aW9uLmJyb2FkY2FzdCgpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFLCBjbGFzcyBMSVNURU5FUj4KK2ludDY0X3QgQ2xpZW50TWFuYWdlcjxLRVksIFZBTFVFLCBMSVNURU5FUj46OmdldEN1cnJlbnRDb3N0TG9ja2VkKCkgY29uc3QgeworICAgIGludDY0X3QgdG90YWxDb3N0ID0gMDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHggOiBtQ2xpZW50cykgeworICAgICAgICAgICAgdG90YWxDb3N0ICs9IHgtPmdldENvc3QoKTsKKyAgICB9CisgICAgcmV0dXJuIHRvdGFsQ29zdDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfTsgLy8gbmFtZXNwYWNlIHJlc291cmNlX3BvbGljeQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfU0VSVklDRV9VVElMU19FVklDVElPTl9QT0xJQ1lfTUFOQUdFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5tawppbmRleCA5NWYyZmVmLi4wMzQzOGJmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQubWsKQEAgLTEwLDQgKzEwLDYgQEAKIAogTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQogCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcyMjMwZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyMSBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFJlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwIFNlcnZpY2VMb2cuY3BwCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlibWVkaWEgbGlic3RhZ2VmcmlnaHQgbGliYmluZGVyIGxpYnV0aWxzIGxpYmxvZworCitMT0NBTF9NT0RVTEU6PSBsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlCisKK0xPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9pbmNsdWRlCisKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzkwNzU0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5jcHAKQEAgLTAsMCArMSw0NjUgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTUsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiUmVzb3VyY2VNYW5hZ2VyU2VydmljZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIlJlc291cmNlTWFuYWdlclNlcnZpY2UuaCIKKyNpbmNsdWRlICJTZXJ2aWNlTG9nLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgU3RyaW5nOCBnZXRTdHJpbmcoY29uc3QgVmVjdG9yPFQ+ICZpdGVtcykgeworICAgIFN0cmluZzggaXRlbXNTdHI7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7ICsraSkgeworICAgICAgICBpdGVtc1N0ci5hcHBlbmRGb3JtYXQoIiVzICIsIGl0ZW1zW2ldLnRvU3RyaW5nKCkuc3RyaW5nKCkpOworICAgIH0KKyAgICByZXR1cm4gaXRlbXNTdHI7Cit9CisKK3N0YXRpYyBib29sIGhhc1Jlc291cmNlVHlwZShTdHJpbmc4IHR5cGUsIFZlY3RvcjxNZWRpYVJlc291cmNlPiByZXNvdXJjZXMpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc291cmNlcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAocmVzb3VyY2VzW2ldLm1UeXBlID09IHR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgaGFzUmVzb3VyY2VUeXBlKFN0cmluZzggdHlwZSwgUmVzb3VyY2VJbmZvcyBpbmZvcykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5mb3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKGhhc1Jlc291cmNlVHlwZSh0eXBlLCBpbmZvc1tpXS5yZXNvdXJjZXMpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBSZXNvdXJjZUluZm9zJiBnZXRSZXNvdXJjZUluZm9zRm9yRWRpdCgKKyAgICAgICAgaW50IHBpZCwKKyAgICAgICAgUGlkUmVzb3VyY2VJbmZvc01hcCYgbWFwKSB7CisgICAgc3NpemVfdCBpbmRleCA9IG1hcC5pbmRleE9mS2V5KHBpZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAvLyBuZXcgcGlkCisgICAgICAgIFJlc291cmNlSW5mb3MgaW5mb3NGb3JQaWQ7CisgICAgICAgIG1hcC5hZGQocGlkLCBpbmZvc0ZvclBpZCk7CisgICAgfQorCisgICAgcmV0dXJuIG1hcC5lZGl0VmFsdWVGb3IocGlkKTsKK30KKworc3RhdGljIFJlc291cmNlSW5mbyYgZ2V0UmVzb3VyY2VJbmZvRm9yRWRpdCgKKyAgICAgICAgaW50NjRfdCBjbGllbnRJZCwKKyAgICAgICAgY29uc3Qgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50LAorICAgICAgICBSZXNvdXJjZUluZm9zJiBpbmZvcykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5mb3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKGluZm9zW2ldLmNsaWVudElkID09IGNsaWVudElkKSB7CisgICAgICAgICAgICByZXR1cm4gaW5mb3MuZWRpdEl0ZW1BdChpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBSZXNvdXJjZUluZm8gaW5mbzsKKyAgICBpbmZvLmNsaWVudElkID0gY2xpZW50SWQ7CisgICAgaW5mby5jbGllbnQgPSBjbGllbnQ7CisgICAgaW5mb3MucHVzaF9iYWNrKGluZm8pOworICAgIHJldHVybiBpbmZvcy5lZGl0SXRlbUF0KGluZm9zLnNpemUoKSAtIDEpOworfQorCitzdGF0dXNfdCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgLyogYXJncyAqLykgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKworICAgIFN0cmluZzggcmVzdWx0OworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworCisgICAgaWYgKGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIikpID09IGZhbHNlKSB7CisgICAgICAgIHJlc3VsdC5mb3JtYXQoIlBlcm1pc3Npb24gRGVuaWFsOiAiCisgICAgICAgICAgICAgICAgImNhbid0IGR1bXAgUmVzb3VyY2VNYW5hZ2VyU2VydmljZSBmcm9tIHBpZD0lZCwgdWlkPSVkXG4iLAorICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKKyAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOworICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlJlc291cmNlTWFuYWdlclNlcnZpY2U6ICVwXG4iLCB0aGlzKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgcmVzdWx0LmFwcGVuZCgiICBQb2xpY2llczpcbiIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICBTdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzOiAlZFxuIiwgbVN1cHBvcnRzTXVsdGlwbGVTZWN1cmVDb2RlY3MpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgU3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWM6ICVkXG4iLCBtU3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKworICAgIHJlc3VsdC5hcHBlbmQoIiAgUHJvY2Vzc2VzOlxuIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTWFwLnNpemUoKTsgKytpKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICBQaWQ6ICVkXG4iLCBtTWFwLmtleUF0KGkpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgICAgIGNvbnN0IFJlc291cmNlSW5mb3MgJmluZm9zID0gbU1hcC52YWx1ZUF0KGkpOworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGluZm9zLnNpemUoKTsgKytqKSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgICAgICBDbGllbnQ6XG4iKTsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgICAgSWQ6ICVsbGRcbiIsIChsb25nIGxvbmcpaW5mb3Nbal0uY2xpZW50SWQpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgICAgIE5hbWU6ICVzXG4iLCBpbmZvc1tqXS5jbGllbnQtPmdldE5hbWUoKS5zdHJpbmcoKSk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICAgICAgICAgIFZlY3RvcjxNZWRpYVJlc291cmNlPiByZXNvdXJjZXMgPSBpbmZvc1tqXS5yZXNvdXJjZXM7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgICAgICAgIFJlc291cmNlczpcbiIpOworICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCByZXNvdXJjZXMuc2l6ZSgpOyArK2spIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgICAgICAgJXNcbiIsIHJlc291cmNlc1trXS50b1N0cmluZygpLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmVzdWx0LmFwcGVuZCgiICBFdmVudHMgbG9ncyAobW9zdCByZWNlbnQgYXQgdG9wKTpcbiIpOworICAgIHJlc3VsdC5hcHBlbmQobVNlcnZpY2VMb2ctPnRvU3RyaW5nKCIgICAgIiAvKiBsaW5lUHJlZml4ICovKSk7CisKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK1Jlc291cmNlTWFuYWdlclNlcnZpY2U6OlJlc291cmNlTWFuYWdlclNlcnZpY2UoKQorICAgIDogbVByb2Nlc3NJbmZvKG5ldyBQcm9jZXNzSW5mbygpKSwKKyAgICAgIG1TZXJ2aWNlTG9nKG5ldyBTZXJ2aWNlTG9nKCkpLAorICAgICAgbVN1cHBvcnRzTXVsdGlwbGVTZWN1cmVDb2RlY3ModHJ1ZSksCisgICAgICBtU3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWModHJ1ZSkge30KKworUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6UmVzb3VyY2VNYW5hZ2VyU2VydmljZShzcDxQcm9jZXNzSW5mb0ludGVyZmFjZT4gcHJvY2Vzc0luZm8pCisgICAgOiBtUHJvY2Vzc0luZm8ocHJvY2Vzc0luZm8pLAorICAgICAgbVNlcnZpY2VMb2cobmV3IFNlcnZpY2VMb2coKSksCisgICAgICBtU3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjcyh0cnVlKSwKKyAgICAgIG1TdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYyh0cnVlKSB7fQorCitSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjp+UmVzb3VyY2VNYW5hZ2VyU2VydmljZSgpIHt9CisKK3ZvaWQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6Y29uZmlnKGNvbnN0IFZlY3RvcjxNZWRpYVJlc291cmNlUG9saWN5PiAmcG9saWNpZXMpIHsKKyAgICBTdHJpbmc4IGxvZyA9IFN0cmluZzg6OmZvcm1hdCgiY29uZmlnKCVzKSIsIGdldFN0cmluZyhwb2xpY2llcykuc3RyaW5nKCkpOworICAgIG1TZXJ2aWNlTG9nLT5hZGQobG9nKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBvbGljaWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFN0cmluZzggdHlwZSA9IHBvbGljaWVzW2ldLm1UeXBlOworICAgICAgICBTdHJpbmc4IHZhbHVlID0gcG9saWNpZXNbaV0ubVZhbHVlOworICAgICAgICBpZiAodHlwZSA9PSBrUG9saWN5U3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjcykgeworICAgICAgICAgICAgbVN1cHBvcnRzTXVsdGlwbGVTZWN1cmVDb2RlY3MgPSAodmFsdWUgPT0gInRydWUiKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IGtQb2xpY3lTdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYykgeworICAgICAgICAgICAgbVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjID0gKHZhbHVlID09ICJ0cnVlIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6YWRkUmVzb3VyY2UoCisgICAgICAgIGludCBwaWQsCisgICAgICAgIGludDY0X3QgY2xpZW50SWQsCisgICAgICAgIGNvbnN0IHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudCwKKyAgICAgICAgY29uc3QgVmVjdG9yPE1lZGlhUmVzb3VyY2U+ICZyZXNvdXJjZXMpIHsKKyAgICBTdHJpbmc4IGxvZyA9IFN0cmluZzg6OmZvcm1hdCgiYWRkUmVzb3VyY2UocGlkICVkLCBjbGllbnRJZCAlbGxkLCByZXNvdXJjZXMgJXMpIiwKKyAgICAgICAgICAgIHBpZCwgKGxvbmcgbG9uZykgY2xpZW50SWQsIGdldFN0cmluZyhyZXNvdXJjZXMpLnN0cmluZygpKTsKKyAgICBtU2VydmljZUxvZy0+YWRkKGxvZyk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgUmVzb3VyY2VJbmZvcyYgaW5mb3MgPSBnZXRSZXNvdXJjZUluZm9zRm9yRWRpdChwaWQsIG1NYXApOworICAgIFJlc291cmNlSW5mbyYgaW5mbyA9IGdldFJlc291cmNlSW5mb0ZvckVkaXQoY2xpZW50SWQsIGNsaWVudCwgaW5mb3MpOworICAgIC8vIFRPRE86IGRvIHRoZSBtZXJnZSBpbnN0ZWFkIG9mIGFwcGVuZC4KKyAgICBpbmZvLnJlc291cmNlcy5hcHBlbmRWZWN0b3IocmVzb3VyY2VzKTsKK30KKwordm9pZCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpyZW1vdmVSZXNvdXJjZShpbnQgcGlkLCBpbnQ2NF90IGNsaWVudElkKSB7CisgICAgU3RyaW5nOCBsb2cgPSBTdHJpbmc4Ojpmb3JtYXQoCisgICAgICAgICAgICAicmVtb3ZlUmVzb3VyY2UocGlkICVkLCBjbGllbnRJZCAlbGxkKSIsCisgICAgICAgICAgICBwaWQsIChsb25nIGxvbmcpIGNsaWVudElkKTsKKyAgICBtU2VydmljZUxvZy0+YWRkKGxvZyk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgc3NpemVfdCBpbmRleCA9IG1NYXAuaW5kZXhPZktleShwaWQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1YoInJlbW92ZVJlc291cmNlOiBkaWRuJ3QgZmluZCBwaWQgJWQgZm9yIGNsaWVudElkICVsbGQiLCBwaWQsIChsb25nIGxvbmcpIGNsaWVudElkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgUmVzb3VyY2VJbmZvcyAmaW5mb3MgPSBtTWFwLmVkaXRWYWx1ZUF0KGluZGV4KTsKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGluZm9zLnNpemUoKTsgKytqKSB7CisgICAgICAgIGlmIChpbmZvc1tqXS5jbGllbnRJZCA9PSBjbGllbnRJZCkgeworICAgICAgICAgICAgaiA9IGluZm9zLnJlbW92ZUF0KGopOworICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFmb3VuZCkgeworICAgICAgICBBTE9HVigiZGlkbid0IGZpbmQgY2xpZW50Iik7CisgICAgfQorfQorCit2b2lkIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OmdldENsaWVudEZvclJlc291cmNlX2woCisgICAgICAgIGludCBjYWxsaW5nUGlkLCBjb25zdCBNZWRpYVJlc291cmNlICpyZXMsIFZlY3RvcjxzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Pj4gKmNsaWVudHMpIHsKKyAgICBpZiAocmVzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBjbGllbnQ7CisgICAgaWYgKGdldExvd2VzdFByaW9yaXR5QmlnZ2VzdENsaWVudF9sKGNhbGxpbmdQaWQsIHJlcy0+bVR5cGUsICZjbGllbnQpKSB7CisgICAgICAgIGNsaWVudHMtPnB1c2hfYmFjayhjbGllbnQpOworICAgIH0KK30KKworYm9vbCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpyZWNsYWltUmVzb3VyY2UoCisgICAgICAgIGludCBjYWxsaW5nUGlkLCBjb25zdCBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gJnJlc291cmNlcykgeworICAgIFN0cmluZzggbG9nID0gU3RyaW5nODo6Zm9ybWF0KCJyZWNsYWltUmVzb3VyY2UoY2FsbGluZ1BpZCAlZCwgcmVzb3VyY2VzICVzKSIsCisgICAgICAgICAgICBjYWxsaW5nUGlkLCBnZXRTdHJpbmcocmVzb3VyY2VzKS5zdHJpbmcoKSk7CisgICAgbVNlcnZpY2VMb2ctPmFkZChsb2cpOworCisgICAgVmVjdG9yPHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+PiBjbGllbnRzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgICAgICBjb25zdCBNZWRpYVJlc291cmNlICpzZWN1cmVDb2RlYyA9IE5VTEw7CisgICAgICAgIGNvbnN0IE1lZGlhUmVzb3VyY2UgKm5vblNlY3VyZUNvZGVjID0gTlVMTDsKKyAgICAgICAgY29uc3QgTWVkaWFSZXNvdXJjZSAqZ3JhcGhpY01lbW9yeSA9IE5VTEw7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzb3VyY2VzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBTdHJpbmc4IHR5cGUgPSByZXNvdXJjZXNbaV0ubVR5cGU7CisgICAgICAgICAgICBpZiAocmVzb3VyY2VzW2ldLm1UeXBlID09IGtSZXNvdXJjZVNlY3VyZUNvZGVjKSB7CisgICAgICAgICAgICAgICAgc2VjdXJlQ29kZWMgPSAmcmVzb3VyY2VzW2ldOworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IGtSZXNvdXJjZU5vblNlY3VyZUNvZGVjKSB7CisgICAgICAgICAgICAgICAgbm9uU2VjdXJlQ29kZWMgPSAmcmVzb3VyY2VzW2ldOworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IGtSZXNvdXJjZUdyYXBoaWNNZW1vcnkpIHsKKyAgICAgICAgICAgICAgICBncmFwaGljTWVtb3J5ID0gJnJlc291cmNlc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGZpcnN0IHBhc3MgdG8gaGFuZGxlIHNlY3VyZS9ub24tc2VjdXJlIGNvZGVjIGNvbmZsaWN0CisgICAgICAgIGlmIChzZWN1cmVDb2RlYyAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoIW1TdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzKSB7CisgICAgICAgICAgICAgICAgaWYgKCFnZXRBbGxDbGllbnRzX2woY2FsbGluZ1BpZCwgU3RyaW5nOChrUmVzb3VyY2VTZWN1cmVDb2RlYyksICZjbGllbnRzKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtU3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWdldEFsbENsaWVudHNfbChjYWxsaW5nUGlkLCBTdHJpbmc4KGtSZXNvdXJjZU5vblNlY3VyZUNvZGVjKSwgJmNsaWVudHMpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vblNlY3VyZUNvZGVjICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICghbVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjKSB7CisgICAgICAgICAgICAgICAgaWYgKCFnZXRBbGxDbGllbnRzX2woY2FsbGluZ1BpZCwgU3RyaW5nOChrUmVzb3VyY2VTZWN1cmVDb2RlYyksICZjbGllbnRzKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGNsaWVudHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIC8vIGlmIG5vIHNlY3VyZS9ub24tc2VjdXJlIGNvZGVjIGNvbmZsaWN0LCBydW4gc2Vjb25kIHBhc3MgdG8gaGFuZGxlIG90aGVyIHJlc291cmNlcy4KKyAgICAgICAgICAgIGdldENsaWVudEZvclJlc291cmNlX2woY2FsbGluZ1BpZCwgZ3JhcGhpY01lbW9yeSwgJmNsaWVudHMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNsaWVudHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBoZXJlLCBydW4gdGhlIHRoaXJkIHBhc3MgdG8gZnJlZSBvbmUgY29kZWMgd2l0aCB0aGUgc2FtZSB0eXBlLgorICAgICAgICAgICAgZ2V0Q2xpZW50Rm9yUmVzb3VyY2VfbChjYWxsaW5nUGlkLCBzZWN1cmVDb2RlYywgJmNsaWVudHMpOworICAgICAgICAgICAgZ2V0Q2xpZW50Rm9yUmVzb3VyY2VfbChjYWxsaW5nUGlkLCBub25TZWN1cmVDb2RlYywgJmNsaWVudHMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNsaWVudHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBoZXJlLCBydW4gdGhlIGZvdXJ0aCBwYXNzIHRvIGZyZWUgb25lIGNvZGVjIHdpdGggdGhlIGRpZmZlcmVudCB0eXBlLgorICAgICAgICAgICAgaWYgKHNlY3VyZUNvZGVjICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlIHRlbXAoU3RyaW5nOChrUmVzb3VyY2VOb25TZWN1cmVDb2RlYyksIDEpOworICAgICAgICAgICAgICAgIGdldENsaWVudEZvclJlc291cmNlX2woY2FsbGluZ1BpZCwgJnRlbXAsICZjbGllbnRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChub25TZWN1cmVDb2RlYyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZSB0ZW1wKFN0cmluZzgoa1Jlc291cmNlU2VjdXJlQ29kZWMpLCAxKTsKKyAgICAgICAgICAgICAgICBnZXRDbGllbnRGb3JSZXNvdXJjZV9sKGNhbGxpbmdQaWQsICZ0ZW1wLCAmY2xpZW50cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY2xpZW50cy5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gZmFpbGVkQ2xpZW50OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2xpZW50cy5zaXplKCk7ICsraSkgeworICAgICAgICBsb2cgPSBTdHJpbmc4Ojpmb3JtYXQoInJlY2xhaW1SZXNvdXJjZSBmcm9tIGNsaWVudCAlcCIsIGNsaWVudHNbaV0uZ2V0KCkpOworICAgICAgICBtU2VydmljZUxvZy0+YWRkKGxvZyk7CisgICAgICAgIGlmICghY2xpZW50c1tpXS0+cmVjbGFpbVJlc291cmNlKCkpIHsKKyAgICAgICAgICAgIGZhaWxlZENsaWVudCA9IGNsaWVudHNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1hcC5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgUmVzb3VyY2VJbmZvcyAmaW5mb3MgPSBtTWFwLmVkaXRWYWx1ZUF0KGkpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBpbmZvcy5zaXplKCk7KSB7CisgICAgICAgICAgICAgICAgaWYgKGluZm9zW2pdLmNsaWVudCA9PSBmYWlsZWRDbGllbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgaiA9IGluZm9zLnJlbW92ZUF0KGopOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKytqOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmb3VuZCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgIEFMT0dWKCJkaWRuJ3QgZmluZCBmYWlsZWQgY2xpZW50Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKGZhaWxlZENsaWVudCA9PSBOVUxMKTsKK30KKworYm9vbCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpnZXRBbGxDbGllbnRzX2woCisgICAgICAgIGludCBjYWxsaW5nUGlkLCBjb25zdCBTdHJpbmc4ICZ0eXBlLCBWZWN0b3I8c3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4+ICpjbGllbnRzKSB7CisgICAgVmVjdG9yPHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+PiB0ZW1wOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1hcC5zaXplKCk7ICsraSkgeworICAgICAgICBSZXNvdXJjZUluZm9zICZpbmZvcyA9IG1NYXAuZWRpdFZhbHVlQXQoaSk7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaW5mb3Muc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgIGlmIChoYXNSZXNvdXJjZVR5cGUodHlwZSwgaW5mb3Nbal0ucmVzb3VyY2VzKSkgeworICAgICAgICAgICAgICAgIGlmICghaXNDYWxsaW5nUHJpb3JpdHlIaWdoZXJfbChjYWxsaW5nUGlkLCBtTWFwLmtleUF0KGkpKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBzb21lIGhpZ2hlci9lcXVhbCBwcmlvcml0eSBwcm9jZXNzIG93bnMgdGhlIHJlc291cmNlLAorICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHJlcXVlc3QgY2FuJ3QgYmUgZnVsZmlsbGVkLgorICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0QWxsQ2xpZW50c19sOiBjYW4ndCByZWNsYWltIHJlc291cmNlICVzIGZyb20gcGlkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLnN0cmluZygpLCBtTWFwLmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ZW1wLnB1c2hfYmFjayhpbmZvc1tqXS5jbGllbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICh0ZW1wLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dWKCJnZXRBbGxDbGllbnRzX2w6IGRpZG4ndCBmaW5kIGFueSByZXNvdXJjZSAlcyIsIHR5cGUuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2xpZW50cy0+YXBwZW5kVmVjdG9yKHRlbXApOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OmdldExvd2VzdFByaW9yaXR5QmlnZ2VzdENsaWVudF9sKAorICAgICAgICBpbnQgY2FsbGluZ1BpZCwgY29uc3QgU3RyaW5nOCAmdHlwZSwgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gKmNsaWVudCkgeworICAgIGludCBsb3dlc3RQcmlvcml0eVBpZDsKKyAgICBpbnQgbG93ZXN0UHJpb3JpdHk7CisgICAgaW50IGNhbGxpbmdQcmlvcml0eTsKKyAgICBpZiAoIW1Qcm9jZXNzSW5mby0+Z2V0UHJpb3JpdHkoY2FsbGluZ1BpZCwgJmNhbGxpbmdQcmlvcml0eSkpIHsKKyAgICAgICAgQUxPR0UoImdldExvd2VzdFByaW9yaXR5QmlnZ2VzdENsaWVudF9sOiBjYW4ndCBnZXQgcHJvY2VzcyBwcmlvcml0eSBmb3IgcGlkICVkIiwKKyAgICAgICAgICAgICAgICBjYWxsaW5nUGlkKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIWdldExvd2VzdFByaW9yaXR5UGlkX2wodHlwZSwgJmxvd2VzdFByaW9yaXR5UGlkLCAmbG93ZXN0UHJpb3JpdHkpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGxvd2VzdFByaW9yaXR5IDw9IGNhbGxpbmdQcmlvcml0eSkgeworICAgICAgICBBTE9HRSgiZ2V0TG93ZXN0UHJpb3JpdHlCaWdnZXN0Q2xpZW50X2w6IGxvd2VzdCBwcmlvcml0eSAlZCB2cyBjYWxsZXIgcHJpb3JpdHkgJWQiLAorICAgICAgICAgICAgICAgIGxvd2VzdFByaW9yaXR5LCBjYWxsaW5nUHJpb3JpdHkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFnZXRCaWdnZXN0Q2xpZW50X2wobG93ZXN0UHJpb3JpdHlQaWQsIHR5cGUsIGNsaWVudCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpnZXRMb3dlc3RQcmlvcml0eVBpZF9sKAorICAgICAgICBjb25zdCBTdHJpbmc4ICZ0eXBlLCBpbnQgKmxvd2VzdFByaW9yaXR5UGlkLCBpbnQgKmxvd2VzdFByaW9yaXR5KSB7CisgICAgaW50IHBpZCA9IC0xOworICAgIGludCBwcmlvcml0eSA9IC0xOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1hcC5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAobU1hcC52YWx1ZUF0KGkpLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBubyBjbGllbnQgb24gdGhpcyBwcm9jZXNzLgorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFoYXNSZXNvdXJjZVR5cGUodHlwZSwgbU1hcC52YWx1ZUF0KGkpKSkgeworICAgICAgICAgICAgLy8gZG9lc24ndCBoYXZlIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgdHlwZQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaW50IHRlbXBQaWQgPSBtTWFwLmtleUF0KGkpOworICAgICAgICBpbnQgdGVtcFByaW9yaXR5OworICAgICAgICBpZiAoIW1Qcm9jZXNzSW5mby0+Z2V0UHJpb3JpdHkodGVtcFBpZCwgJnRlbXBQcmlvcml0eSkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJnZXRMb3dlc3RQcmlvcml0eVBpZF9sOiBjYW4ndCBnZXQgcHJpb3JpdHkgb2YgcGlkICVkLCBza2lwcGVkIiwgdGVtcFBpZCk7CisgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBwaWQgZnJvbSBtTWFwPworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBpZCA9PSAtMSB8fCB0ZW1wUHJpb3JpdHkgPiBwcmlvcml0eSkgeworICAgICAgICAgICAgLy8gaW5pdGlhbCB0aGUgdmFsdWUKKyAgICAgICAgICAgIHBpZCA9IHRlbXBQaWQ7CisgICAgICAgICAgICBwcmlvcml0eSA9IHRlbXBQcmlvcml0eTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocGlkICE9IC0xKSB7CisgICAgICAgICpsb3dlc3RQcmlvcml0eVBpZCA9IHBpZDsKKyAgICAgICAgKmxvd2VzdFByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgfQorICAgIHJldHVybiAocGlkICE9IC0xKTsKK30KKworYm9vbCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjppc0NhbGxpbmdQcmlvcml0eUhpZ2hlcl9sKGludCBjYWxsaW5nUGlkLCBpbnQgcGlkKSB7CisgICAgaW50IGNhbGxpbmdQaWRQcmlvcml0eTsKKyAgICBpZiAoIW1Qcm9jZXNzSW5mby0+Z2V0UHJpb3JpdHkoY2FsbGluZ1BpZCwgJmNhbGxpbmdQaWRQcmlvcml0eSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludCBwcmlvcml0eTsKKyAgICBpZiAoIW1Qcm9jZXNzSW5mby0+Z2V0UHJpb3JpdHkocGlkLCAmcHJpb3JpdHkpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gKGNhbGxpbmdQaWRQcmlvcml0eSA8IHByaW9yaXR5KTsKK30KKworYm9vbCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpnZXRCaWdnZXN0Q2xpZW50X2woCisgICAgICAgIGludCBwaWQsIGNvbnN0IFN0cmluZzggJnR5cGUsIHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+ICpjbGllbnQpIHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU1hcC5pbmRleE9mS2V5KHBpZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HRSgiZ2V0QmlnZ2VzdENsaWVudF9sOiBjYW4ndCBmaW5kIHJlc291cmNlIGluZm8gZm9yIHBpZCAlZCIsIHBpZCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBjbGllbnRUZW1wOworICAgIHVpbnQ2NF90IGxhcmdlc3RWYWx1ZSA9IDA7CisgICAgY29uc3QgUmVzb3VyY2VJbmZvcyAmaW5mb3MgPSBtTWFwLnZhbHVlQXQoaW5kZXgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5mb3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgVmVjdG9yPE1lZGlhUmVzb3VyY2U+IHJlc291cmNlcyA9IGluZm9zW2ldLnJlc291cmNlczsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCByZXNvdXJjZXMuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZXNbal0ubVR5cGUgPT0gdHlwZSkgeworICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZXNbal0ubVZhbHVlID4gbGFyZ2VzdFZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGxhcmdlc3RWYWx1ZSA9IHJlc291cmNlc1tqXS5tVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGNsaWVudFRlbXAgPSBpbmZvc1tpXS5jbGllbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNsaWVudFRlbXAgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiZ2V0QmlnZ2VzdENsaWVudF9sOiBjYW4ndCBmaW5kIHJlc291cmNlIHR5cGUgJXMgZm9yIHBpZCAlZCIsIHR5cGUuc3RyaW5nKCksIHBpZCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAqY2xpZW50ID0gY2xpZW50VGVtcDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NjkzNzMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTUsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpZm5kZWYgQU5EUk9JRF9SRVNPVVJDRU1BTkFHRVJTRVJWSUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9SRVNPVVJDRU1BTkFHRVJTRVJWSUNFX0gKKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSA8bWVkaWEvSVJlc291cmNlTWFuYWdlclNlcnZpY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBTZXJ2aWNlTG9nOworc3RydWN0IFByb2Nlc3NJbmZvSW50ZXJmYWNlOworCitzdHJ1Y3QgUmVzb3VyY2VJbmZvIHsKKyAgICBpbnQ2NF90IGNsaWVudElkOworICAgIHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudDsKKyAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gcmVzb3VyY2VzOworfTsKKwordHlwZWRlZiBWZWN0b3I8UmVzb3VyY2VJbmZvPiBSZXNvdXJjZUluZm9zOwordHlwZWRlZiBLZXllZFZlY3RvcjxpbnQsIFJlc291cmNlSW5mb3M+IFBpZFJlc291cmNlSW5mb3NNYXA7CisKK2NsYXNzIFJlc291cmNlTWFuYWdlclNlcnZpY2UKKyAgICA6IHB1YmxpYyBCaW5kZXJTZXJ2aWNlPFJlc291cmNlTWFuYWdlclNlcnZpY2U+LAorICAgICAgcHVibGljIEJuUmVzb3VyY2VNYW5hZ2VyU2VydmljZQoreworcHVibGljOgorICAgIHN0YXRpYyBjaGFyIGNvbnN0ICpnZXRTZXJ2aWNlTmFtZSgpIHsgcmV0dXJuICJtZWRpYS5yZXNvdXJjZV9tYW5hZ2VyIjsgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisKKyAgICBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlKCk7CisgICAgUmVzb3VyY2VNYW5hZ2VyU2VydmljZShzcDxQcm9jZXNzSW5mb0ludGVyZmFjZT4gcHJvY2Vzc0luZm8pOworCisgICAgLy8gSVJlc291cmNlTWFuYWdlclNlcnZpY2UgaW50ZXJmYWNlCisgICAgdmlydHVhbCB2b2lkIGNvbmZpZyhjb25zdCBWZWN0b3I8TWVkaWFSZXNvdXJjZVBvbGljeT4gJnBvbGljaWVzKTsKKworICAgIHZpcnR1YWwgdm9pZCBhZGRSZXNvdXJjZSgKKyAgICAgICAgICAgIGludCBwaWQsCisgICAgICAgICAgICBpbnQ2NF90IGNsaWVudElkLAorICAgICAgICAgICAgY29uc3Qgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50LAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPE1lZGlhUmVzb3VyY2U+ICZyZXNvdXJjZXMpOworCisgICAgdmlydHVhbCB2b2lkIHJlbW92ZVJlc291cmNlKGludCBwaWQsIGludDY0X3QgY2xpZW50SWQpOworCisgICAgLy8gVHJpZXMgdG8gcmVjbGFpbSByZXNvdXJjZSBmcm9tIHByb2Nlc3NlcyB3aXRoIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhlIGNhbGxpbmcgcHJvY2VzcworICAgIC8vIGFjY29yZGluZyB0byB0aGUgcmVxdWVzdGVkIHJlc291cmNlcy4KKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgYW55IHJlc291cmNlIGhhcyBiZWVuIHJlY2xhaW1lZCwgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuCisgICAgdmlydHVhbCBib29sIHJlY2xhaW1SZXNvdXJjZShpbnQgY2FsbGluZ1BpZCwgY29uc3QgVmVjdG9yPE1lZGlhUmVzb3VyY2U+ICZyZXNvdXJjZXMpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+UmVzb3VyY2VNYW5hZ2VyU2VydmljZSgpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdDsKKworICAgIC8vIEdldHMgdGhlIGxpc3Qgb2YgYWxsIHRoZSBjbGllbnRzIHdobyBvd24gdGhlIHNwZWNpZmllZCByZXNvdXJjZSB0eXBlLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgYW55IGNsaWVudCBiZWxvbmdzIHRvIGEgcHJvY2VzcyB3aXRoIGhpZ2hlciBwcmlvcml0eSB0aGFuIHRoZQorICAgIC8vIGNhbGxpbmcgcHJvY2Vzcy4gVGhlIGNsaWVudHMgd2lsbCByZW1haW4gdW5jaGFuZ2VkIGlmIHJldHVybnMgZmFsc2UuCisgICAgYm9vbCBnZXRBbGxDbGllbnRzX2woaW50IGNhbGxpbmdQaWQsIGNvbnN0IFN0cmluZzggJnR5cGUsCisgICAgICAgICAgICBWZWN0b3I8c3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4+ICpjbGllbnRzKTsKKworICAgIC8vIEdldHMgdGhlIGNsaWVudCB3aG8gb3ducyBzcGVjaWZpZWQgcmVzb3VyY2UgdHlwZSBmcm9tIGxvd2VzdCBwb3NzaWJsZSBwcmlvcml0eSBwcm9jZXNzLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgdGhlIGNhbGxpbmcgcHJvY2VzcyBwcmlvcml0eSBpcyBub3QgaGlnaGVyIHRoYW4gdGhlIGxvd2VzdCBwcm9jZXNzCisgICAgLy8gcHJpb3JpdHkuIFRoZSBjbGllbnQgd2lsbCByZW1haW4gdW5jaGFuZ2VkIGlmIHJldHVybnMgZmFsc2UuCisgICAgYm9vbCBnZXRMb3dlc3RQcmlvcml0eUJpZ2dlc3RDbGllbnRfbChpbnQgY2FsbGluZ1BpZCwgY29uc3QgU3RyaW5nOCAmdHlwZSwKKyAgICAgICAgICAgIHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+ICpjbGllbnQpOworCisgICAgLy8gR2V0cyBsb3dlc3QgcHJpb3JpdHkgcHJvY2VzcyB0aGF0IGhhcyB0aGUgc3BlY2lmaWVkIHJlc291cmNlIHR5cGUuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBmYWlsZWQuIFRoZSBvdXRwdXQgcGFyYW1ldGVycyB3aWxsIHJlbWFpbiB1bmNoYW5nZWQgaWYgZmFpbGVkLgorICAgIGJvb2wgZ2V0TG93ZXN0UHJpb3JpdHlQaWRfbChjb25zdCBTdHJpbmc4ICZ0eXBlLCBpbnQgKnBpZCwgaW50ICpwcmlvcml0eSk7CisKKyAgICAvLyBHZXRzIHRoZSBjbGllbnQgd2hvIG93bnMgYmlnZ2VzdCBwaWVjZSBvZiBzcGVjaWZpZWQgcmVzb3VyY2UgdHlwZSBmcm9tIHBpZC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIGZhaWxlZC4gVGhlIGNsaWVudCB3aWxsIHJlbWFpbiB1bmNoYW5nZWQgaWYgZmFpbGVkLgorICAgIGJvb2wgZ2V0QmlnZ2VzdENsaWVudF9sKGludCBwaWQsIGNvbnN0IFN0cmluZzggJnR5cGUsIHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+ICpjbGllbnQpOworCisgICAgYm9vbCBpc0NhbGxpbmdQcmlvcml0eUhpZ2hlcl9sKGludCBjYWxsaW5nUGlkLCBpbnQgcGlkKTsKKworICAgIC8vIEEgaGVscGVyIGZ1bmN0aW9uIGJhc2ljYWxseSBjYWxscyBnZXRMb3dlc3RQcmlvcml0eUJpZ2dlc3RDbGllbnRfbCBhbmQgYWRkIHRoZSByZXN1bHQgY2xpZW50CisgICAgLy8gdG8gdGhlIGdpdmVuIFZlY3Rvci4KKyAgICB2b2lkIGdldENsaWVudEZvclJlc291cmNlX2woCisgICAgICAgIGludCBjYWxsaW5nUGlkLCBjb25zdCBNZWRpYVJlc291cmNlICpyZXMsIFZlY3RvcjxzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Pj4gKmNsaWVudHMpOworCisgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKKyAgICBzcDxQcm9jZXNzSW5mb0ludGVyZmFjZT4gbVByb2Nlc3NJbmZvOworICAgIHNwPFNlcnZpY2VMb2c+IG1TZXJ2aWNlTG9nOworICAgIFBpZFJlc291cmNlSW5mb3NNYXAgbU1hcDsKKyAgICBib29sIG1TdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzOworICAgIGJvb2wgbVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9SRVNPVVJDRU1BTkFHRVJTRVJWSUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1NlcnZpY2VMb2cuY3BwIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvU2VydmljZUxvZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkxZTc5NwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1NlcnZpY2VMb2cuY3BwCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTUsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU2VydmljZUxvZyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgIlNlcnZpY2VMb2cuaCIKKworc3RhdGljIGNvbnN0IHNpemVfdCBrRGVmYXVsdE1heE51bSA9IDEwMDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitTZXJ2aWNlTG9nOjpTZXJ2aWNlTG9nKCkgOiBtTWF4TnVtKGtEZWZhdWx0TWF4TnVtKSwgbUxvZ3MobU1heE51bSkge30KK1NlcnZpY2VMb2c6OlNlcnZpY2VMb2coc2l6ZV90IG1heE51bSkgOiBtTWF4TnVtKG1heE51bSksIG1Mb2dzKG1NYXhOdW0pIHt9CisKK3ZvaWQgU2VydmljZUxvZzo6YWRkKGNvbnN0IFN0cmluZzggJmxvZykgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICB0aW1lX3Qgbm93ID0gdGltZSgwKTsKKyAgICBjaGFyIGJ1Zls2NF07CisgICAgc3RyZnRpbWUoYnVmLCBzaXplb2YoYnVmKSwgIiVtLSVkICVUIiwgbG9jYWx0aW1lKCZub3cpKTsKKyAgICBtTG9ncy5hZGQoU3RyaW5nODo6Zm9ybWF0KCIlcyAlcyIsIGJ1ZiwgbG9nLnN0cmluZygpKSk7Cit9CisKK1N0cmluZzggU2VydmljZUxvZzo6dG9TdHJpbmcoY29uc3QgY2hhciAqbGluZVByZWZpeCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGxvZyA6IG1Mb2dzKSB7CisgICAgICAgIGFkZExpbmUobG9nLnN0cmluZygpLCBsaW5lUHJlZml4LCAmcmVzdWx0KTsKKyAgICB9CisgICAgaWYgKG1Mb2dzLnNpemUoKSA9PSBtTWF4TnVtKSB7CisgICAgICAgIGFkZExpbmUoIi4uLiIsIGxpbmVQcmVmaXgsICZyZXN1bHQpOworICAgIH0gZWxzZSBpZiAobUxvZ3Muc2l6ZSgpID09IDApIHsKKyAgICAgICAgYWRkTGluZSgiW25vIGV2ZW50cyB5ZXRdIiwgbGluZVByZWZpeCwgJnJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgU2VydmljZUxvZzo6YWRkTGluZShjb25zdCBjaGFyICpsb2csIGNvbnN0IGNoYXIgKnByZWZpeCwgU3RyaW5nOCAqcmVzdWx0KSBjb25zdCB7CisgICAgaWYgKHByZWZpeCAhPSBOVUxMKSB7CisgICAgICAgIHJlc3VsdC0+YXBwZW5kKHByZWZpeCk7CisgICAgfQorICAgIHJlc3VsdC0+YXBwZW5kKGxvZyk7CisgICAgcmVzdWx0LT5hcHBlbmQoIlxuIik7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1NlcnZpY2VMb2cuaCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1NlcnZpY2VMb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmYxNmViCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvU2VydmljZUxvZy5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTUsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWSUNFTE9HX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWSUNFTE9HX0gKKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlICJtZWRpYS9SaW5nQnVmZmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgU2VydmljZUxvZyA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICBTZXJ2aWNlTG9nKCk7CisgICAgU2VydmljZUxvZyhzaXplX3QgbWF4TnVtKTsKKworICAgIHZvaWQgYWRkKGNvbnN0IFN0cmluZzggJmxvZyk7CisgICAgU3RyaW5nOCB0b1N0cmluZyhjb25zdCBjaGFyICpsaW5lUHJlZml4ID0gTlVMTCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgc2l6ZV90IG1NYXhOdW07CisgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKKyAgICBSaW5nQnVmZmVyPFN0cmluZzg+IG1Mb2dzOworCisgICAgdm9pZCBhZGRMaW5lKGNvbnN0IGNoYXIgKmxvZywgY29uc3QgY2hhciAqcHJlZml4LCBTdHJpbmc4ICpyZXN1bHQpIGNvbnN0OworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9TRVJWSUNFTE9HX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvQW5kcm9pZC5tayBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjRlZjBkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNTQgQEAKKyMgQnVpbGQgdGhlIHVuaXQgdGVzdHMuCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0CisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgIFJlc291cmNlTWFuYWdlclNlcnZpY2VfdGVzdC5jcHAgXAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgbGliYmluZGVyIFwKKyAgbGlibG9nIFwKKyAgbGlibWVkaWEgXAorICBsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlIFwKKyAgbGlidXRpbHMgXAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIFwKKyAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlciBcCisKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCisKK0xPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKKworaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IFNlcnZpY2VMb2dfdGVzdAorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICBTZXJ2aWNlTG9nX3Rlc3QuY3BwIFwKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgIGxpYmxvZyBcCisgIGxpYm1lZGlhIFwKKyAgbGlicmVzb3VyY2VtYW5hZ2Vyc2VydmljZSBcCisgIGxpYnV0aWxzIFwKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgIGZyYW1ld29ya3MvYXYvaW5jbHVkZSBcCisgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIgXAorCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvciAtV2FsbAorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQorCitMT0NBTF8zMl9CSVRfT05MWSA6PSB0cnVlCisKK2luY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0LmNwcCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjQ5ZGRjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlX3Rlc3QuY3BwCkBAIC0wLDAgKzEsNTQyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlJlc291cmNlTWFuYWdlclNlcnZpY2VfdGVzdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlICJSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgiCisjaW5jbHVkZSA8bWVkaWEvSVJlc291cmNlTWFuYWdlclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVJlc291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFSZXNvdXJjZVBvbGljeS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUHJvY2Vzc0luZm9JbnRlcmZhY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgaW50NjRfdCBnZXRJZChzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBjbGllbnQpIHsKKyAgICByZXR1cm4gKGludDY0X3QpIGNsaWVudC5nZXQoKTsKK30KKworc3RydWN0IFRlc3RQcm9jZXNzSW5mbyA6IHB1YmxpYyBQcm9jZXNzSW5mb0ludGVyZmFjZSB7CisgICAgVGVzdFByb2Nlc3NJbmZvKCkge30KKyAgICB2aXJ0dWFsIH5UZXN0UHJvY2Vzc0luZm8oKSB7fQorCisgICAgdmlydHVhbCBib29sIGdldFByaW9yaXR5KGludCBwaWQsIGludCAqcHJpb3JpdHkpIHsKKyAgICAgICAgLy8gRm9yIHRlc3RpbmcsIHVzZSBwaWQgYXMgcHJpb3JpdHkuCisgICAgICAgIC8vIExvd2VyIHRoZSB2YWx1ZSBoaWdoZXIgdGhlIHByaW9yaXR5LgorICAgICAgICAqcHJpb3JpdHkgPSBwaWQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUZXN0UHJvY2Vzc0luZm8pOworfTsKKworc3RydWN0IFRlc3RDbGllbnQgOiBwdWJsaWMgQm5SZXNvdXJjZU1hbmFnZXJDbGllbnQgeworICAgIFRlc3RDbGllbnQoaW50IHBpZCwgc3A8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4gc2VydmljZSkKKyAgICAgICAgOiBtUmVjbGFpbWVkKGZhbHNlKSwgbVBpZChwaWQpLCBtU2VydmljZShzZXJ2aWNlKSB7fQorCisgICAgdmlydHVhbCBib29sIHJlY2xhaW1SZXNvdXJjZSgpIHsKKyAgICAgICAgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50KHRoaXMpOworICAgICAgICBtU2VydmljZS0+cmVtb3ZlUmVzb3VyY2UobVBpZCwgKGludDY0X3QpIGNsaWVudC5nZXQoKSk7CisgICAgICAgIG1SZWNsYWltZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoInRlc3RfY2xpZW50Iik7CisgICAgfQorCisgICAgYm9vbCByZWNsYWltZWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUmVjbGFpbWVkOworICAgIH0KKworICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIG1SZWNsYWltZWQgPSBmYWxzZTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5UZXN0Q2xpZW50KCkge30KKworcHJpdmF0ZToKKyAgICBib29sIG1SZWNsYWltZWQ7CisgICAgaW50IG1QaWQ7CisgICAgc3A8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4gbVNlcnZpY2U7CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGVzdENsaWVudCk7Cit9OworCitzdGF0aWMgY29uc3QgaW50IGtUZXN0UGlkMSA9IDMwOworc3RhdGljIGNvbnN0IGludCBrVGVzdFBpZDIgPSAyMDsKKworc3RhdGljIGNvbnN0IGludCBrTG93UHJpb3JpdHlQaWQgPSA0MDsKK3N0YXRpYyBjb25zdCBpbnQga01pZFByaW9yaXR5UGlkID0gMjU7CitzdGF0aWMgY29uc3QgaW50IGtIaWdoUHJpb3JpdHlQaWQgPSAxMDsKKworY2xhc3MgUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3B1YmxpYzoKKyAgICBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCgpCisgICAgICAgIDogbVNlcnZpY2UobmV3IFJlc291cmNlTWFuYWdlclNlcnZpY2UobmV3IFRlc3RQcm9jZXNzSW5mbykpLAorICAgICAgICAgIG1UZXN0Q2xpZW50MShuZXcgVGVzdENsaWVudChrVGVzdFBpZDEsIG1TZXJ2aWNlKSksCisgICAgICAgICAgbVRlc3RDbGllbnQyKG5ldyBUZXN0Q2xpZW50KGtUZXN0UGlkMiwgbVNlcnZpY2UpKSwKKyAgICAgICAgICBtVGVzdENsaWVudDMobmV3IFRlc3RDbGllbnQoa1Rlc3RQaWQyLCBtU2VydmljZSkpIHsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBzdGF0aWMgYm9vbCBpc0VxdWFsUmVzb3VyY2VzKGNvbnN0IFZlY3RvcjxNZWRpYVJlc291cmNlPiAmcmVzb3VyY2VzMSwKKyAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxNZWRpYVJlc291cmNlPiAmcmVzb3VyY2VzMikgeworICAgICAgICBpZiAocmVzb3VyY2VzMS5zaXplKCkgIT0gcmVzb3VyY2VzMi5zaXplKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc291cmNlczEuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZXMxW2ldICE9IHJlc291cmNlczJbaV0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgZXhwZWN0RXFSZXNvdXJjZUluZm8oY29uc3QgUmVzb3VyY2VJbmZvICZpbmZvLCBzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBjbGllbnQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gJnJlc291cmNlcykgeworICAgICAgICBFWFBFQ1RfRVEoY2xpZW50LCBpbmZvLmNsaWVudCk7CisgICAgICAgIEVYUEVDVF9UUlVFKGlzRXF1YWxSZXNvdXJjZXMocmVzb3VyY2VzLCBpbmZvLnJlc291cmNlcykpOworICAgIH0KKworICAgIHZvaWQgdmVyaWZ5Q2xpZW50cyhib29sIGMxLCBib29sIGMyLCBib29sIGMzKSB7CisgICAgICAgIFRlc3RDbGllbnQgKmNsaWVudDEgPSBzdGF0aWNfY2FzdDxUZXN0Q2xpZW50Kj4obVRlc3RDbGllbnQxLmdldCgpKTsKKyAgICAgICAgVGVzdENsaWVudCAqY2xpZW50MiA9IHN0YXRpY19jYXN0PFRlc3RDbGllbnQqPihtVGVzdENsaWVudDIuZ2V0KCkpOworICAgICAgICBUZXN0Q2xpZW50ICpjbGllbnQzID0gc3RhdGljX2Nhc3Q8VGVzdENsaWVudCo+KG1UZXN0Q2xpZW50My5nZXQoKSk7CisKKyAgICAgICAgRVhQRUNUX0VRKGMxLCBjbGllbnQxLT5yZWNsYWltZWQoKSk7CisgICAgICAgIEVYUEVDVF9FUShjMiwgY2xpZW50Mi0+cmVjbGFpbWVkKCkpOworICAgICAgICBFWFBFQ1RfRVEoYzMsIGNsaWVudDMtPnJlY2xhaW1lZCgpKTsKKworICAgICAgICBjbGllbnQxLT5yZXNldCgpOworICAgICAgICBjbGllbnQyLT5yZXNldCgpOworICAgICAgICBjbGllbnQzLT5yZXNldCgpOworICAgIH0KKworICAgIC8vIHRlc3Qgc2V0IHVwCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gICBwaWQgICAgICAgICAgICAgICAgcHJpb3JpdHkgICAgICAgICBjbGllbnQgICAgICAgICAgIHR5cGUgICAgICAgICAgICAgICBudW1iZXIKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgIGtUZXN0UGlkMSgzMCkgICAgICAzMCAgICAgICAgICAgICAgIG1UZXN0Q2xpZW50MSAgICAgc2VjdXJlIGNvZGVjICAgICAgIDEKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGhpYyBtZW1vcnkgICAgIDIwMAorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaGljIG1lbW9yeSAgICAgMjAwCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gICBrVGVzdFBpZDIoMjApICAgICAgMjAgICAgICAgICAgICAgICBtVGVzdENsaWVudDIgICAgIG5vbi1zZWN1cmUgY29kZWMgICAxCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBoaWMgbWVtb3J5ICAgICAzMDAKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZXN0Q2xpZW50MyAgICAgc2VjdXJlIGNvZGVjICAgICAgIDEKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGhpYyBtZW1vcnkgICAgIDEwMAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHZvaWQgYWRkUmVzb3VyY2UoKSB7CisgICAgICAgIC8vIGtUZXN0UGlkMSBtVGVzdENsaWVudDEKKyAgICAgICAgVmVjdG9yPE1lZGlhUmVzb3VyY2U+IHJlc291cmNlczE7CisgICAgICAgIHJlc291cmNlczEucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoU3RyaW5nOChrUmVzb3VyY2VTZWN1cmVDb2RlYyksIDEpKTsKKyAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMSwgZ2V0SWQobVRlc3RDbGllbnQxKSwgbVRlc3RDbGllbnQxLCByZXNvdXJjZXMxKTsKKyAgICAgICAgcmVzb3VyY2VzMS5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShTdHJpbmc4KGtSZXNvdXJjZUdyYXBoaWNNZW1vcnkpLCAyMDApKTsKKyAgICAgICAgVmVjdG9yPE1lZGlhUmVzb3VyY2U+IHJlc291cmNlczExOworICAgICAgICByZXNvdXJjZXMxMS5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShTdHJpbmc4KGtSZXNvdXJjZUdyYXBoaWNNZW1vcnkpLCAyMDApKTsKKyAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMSwgZ2V0SWQobVRlc3RDbGllbnQxKSwgbVRlc3RDbGllbnQxLCByZXNvdXJjZXMxMSk7CisKKyAgICAgICAgLy8ga1Rlc3RQaWQyIG1UZXN0Q2xpZW50MgorICAgICAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gcmVzb3VyY2VzMjsKKyAgICAgICAgcmVzb3VyY2VzMi5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShTdHJpbmc4KGtSZXNvdXJjZU5vblNlY3VyZUNvZGVjKSwgMSkpOworICAgICAgICByZXNvdXJjZXMyLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKFN0cmluZzgoa1Jlc291cmNlR3JhcGhpY01lbW9yeSksIDMwMCkpOworICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa1Rlc3RQaWQyLCBnZXRJZChtVGVzdENsaWVudDIpLCBtVGVzdENsaWVudDIsIHJlc291cmNlczIpOworCisgICAgICAgIC8vIGtUZXN0UGlkMiBtVGVzdENsaWVudDMKKyAgICAgICAgVmVjdG9yPE1lZGlhUmVzb3VyY2U+IHJlc291cmNlczM7CisgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MyksIG1UZXN0Q2xpZW50MywgcmVzb3VyY2VzMyk7CisgICAgICAgIHJlc291cmNlczMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoU3RyaW5nOChrUmVzb3VyY2VTZWN1cmVDb2RlYyksIDEpKTsKKyAgICAgICAgcmVzb3VyY2VzMy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShTdHJpbmc4KGtSZXNvdXJjZUdyYXBoaWNNZW1vcnkpLCAxMDApKTsKKyAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMiwgZ2V0SWQobVRlc3RDbGllbnQzKSwgbVRlc3RDbGllbnQzLCByZXNvdXJjZXMzKTsKKworICAgICAgICBjb25zdCBQaWRSZXNvdXJjZUluZm9zTWFwICZtYXAgPSBtU2VydmljZS0+bU1hcDsKKyAgICAgICAgRVhQRUNUX0VRKDJ1LCBtYXAuc2l6ZSgpKTsKKyAgICAgICAgc3NpemVfdCBpbmRleDEgPSBtYXAuaW5kZXhPZktleShrVGVzdFBpZDEpOworICAgICAgICBBU1NFUlRfR0UoaW5kZXgxLCAwKTsKKyAgICAgICAgY29uc3QgUmVzb3VyY2VJbmZvcyAmaW5mb3MxID0gbWFwW2luZGV4MV07CisgICAgICAgIEVYUEVDVF9FUSgxdSwgaW5mb3MxLnNpemUoKSk7CisgICAgICAgIGV4cGVjdEVxUmVzb3VyY2VJbmZvKGluZm9zMVswXSwgbVRlc3RDbGllbnQxLCByZXNvdXJjZXMxKTsKKworICAgICAgICBzc2l6ZV90IGluZGV4MiA9IG1hcC5pbmRleE9mS2V5KGtUZXN0UGlkMik7CisgICAgICAgIEFTU0VSVF9HRShpbmRleDIsIDApOworICAgICAgICBjb25zdCBSZXNvdXJjZUluZm9zICZpbmZvczIgPSBtYXBbaW5kZXgyXTsKKyAgICAgICAgRVhQRUNUX0VRKDJ1LCBpbmZvczIuc2l6ZSgpKTsKKyAgICAgICAgZXhwZWN0RXFSZXNvdXJjZUluZm8oaW5mb3MyWzBdLCBtVGVzdENsaWVudDIsIHJlc291cmNlczIpOworICAgICAgICBleHBlY3RFcVJlc291cmNlSW5mbyhpbmZvczJbMV0sIG1UZXN0Q2xpZW50MywgcmVzb3VyY2VzMyk7CisgICAgfQorCisgICAgdm9pZCB0ZXN0Q29uZmlnKCkgeworICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+bVN1cHBvcnRzTXVsdGlwbGVTZWN1cmVDb2RlY3MpOworICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+bVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjKTsKKworICAgICAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZVBvbGljeT4gcG9saWNpZXMxOworICAgICAgICBwb2xpY2llczEucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2VQb2xpY3koCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGtQb2xpY3lTdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoInRydWUiKSkpOworICAgICAgICBwb2xpY2llczEucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2VQb2xpY3koCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGtQb2xpY3lTdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYyksCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCJmYWxzZSIpKSk7CisgICAgICAgIG1TZXJ2aWNlLT5jb25maWcocG9saWNpZXMxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPm1TdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5tU3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMpOworCisgICAgICAgIFZlY3RvcjxNZWRpYVJlc291cmNlUG9saWN5PiBwb2xpY2llczI7CisgICAgICAgIHBvbGljaWVzMi5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZVBvbGljeSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoa1BvbGljeVN1cHBvcnRzTXVsdGlwbGVTZWN1cmVDb2RlY3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiZmFsc2UiKSkpOworICAgICAgICBwb2xpY2llczIucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2VQb2xpY3koCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGtQb2xpY3lTdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYyksCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCJ0cnVlIikpKTsKKyAgICAgICAgbVNlcnZpY2UtPmNvbmZpZyhwb2xpY2llczIpOworICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPm1TdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzKTsKKyAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPm1TdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYyk7CisgICAgfQorCisgICAgdm9pZCB0ZXN0UmVtb3ZlUmVzb3VyY2UoKSB7CisgICAgICAgIGFkZFJlc291cmNlKCk7CisKKyAgICAgICAgbVNlcnZpY2UtPnJlbW92ZVJlc291cmNlKGtUZXN0UGlkMiwgZ2V0SWQobVRlc3RDbGllbnQyKSk7CisKKyAgICAgICAgY29uc3QgUGlkUmVzb3VyY2VJbmZvc01hcCAmbWFwID0gbVNlcnZpY2UtPm1NYXA7CisgICAgICAgIEVYUEVDVF9FUSgydSwgbWFwLnNpemUoKSk7CisgICAgICAgIGNvbnN0IFJlc291cmNlSW5mb3MgJmluZm9zMSA9IG1hcC52YWx1ZUZvcihrVGVzdFBpZDEpOworICAgICAgICBjb25zdCBSZXNvdXJjZUluZm9zICZpbmZvczIgPSBtYXAudmFsdWVGb3Ioa1Rlc3RQaWQyKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBpbmZvczEuc2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBpbmZvczIuc2l6ZSgpKTsKKyAgICAgICAgLy8gbVRlc3RDbGllbnQyIGhhcyBiZWVuIHJlbW92ZWQuCisgICAgICAgIEVYUEVDVF9FUShtVGVzdENsaWVudDMsIGluZm9zMlswXS5jbGllbnQpOworICAgIH0KKworICAgIHZvaWQgdGVzdEdldEFsbENsaWVudHMoKSB7CisgICAgICAgIGFkZFJlc291cmNlKCk7CisKKyAgICAgICAgU3RyaW5nOCB0eXBlID0gU3RyaW5nOChrUmVzb3VyY2VTZWN1cmVDb2RlYyk7CisgICAgICAgIFN0cmluZzggdW5rbm93VHlwZSA9IFN0cmluZzgoInVua25vd1R5cGUiKTsKKyAgICAgICAgVmVjdG9yPHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+ID4gY2xpZW50czsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5nZXRBbGxDbGllbnRzX2woa0xvd1ByaW9yaXR5UGlkLCB0eXBlLCAmY2xpZW50cykpOworICAgICAgICAvLyBzb21lIGhpZ2hlciBwcmlvcml0eSBwcm9jZXNzIChlLmcuIGtUZXN0UGlkMikgb3ducyB0aGUgcmVzb3VyY2UsIHNvIGdldEFsbENsaWVudHNfbAorICAgICAgICAvLyB3aWxsIGZhaWwuCisgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+Z2V0QWxsQ2xpZW50c19sKGtNaWRQcmlvcml0eVBpZCwgdHlwZSwgJmNsaWVudHMpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPmdldEFsbENsaWVudHNfbChrSGlnaFByaW9yaXR5UGlkLCB1bmtub3dUeXBlLCAmY2xpZW50cykpOworICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+Z2V0QWxsQ2xpZW50c19sKGtIaWdoUHJpb3JpdHlQaWQsIHR5cGUsICZjbGllbnRzKSk7CisKKyAgICAgICAgRVhQRUNUX0VRKDJ1LCBjbGllbnRzLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShtVGVzdENsaWVudDMsIGNsaWVudHNbMF0pOworICAgICAgICBFWFBFQ1RfRVEobVRlc3RDbGllbnQxLCBjbGllbnRzWzFdKTsKKyAgICB9CisKKyAgICB2b2lkIHRlc3RSZWNsYWltUmVzb3VyY2VTZWN1cmUoKSB7CisgICAgICAgIFZlY3RvcjxNZWRpYVJlc291cmNlPiByZXNvdXJjZXM7CisgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShTdHJpbmc4KGtSZXNvdXJjZVNlY3VyZUNvZGVjKSwgMSkpOworICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoU3RyaW5nOChrUmVzb3VyY2VHcmFwaGljTWVtb3J5KSwgMTUwKSk7CisKKyAgICAgICAgLy8gIyMjIHNlY3VyZSBjb2RlYyBjYW4ndCBjb2V4aXN0IGFuZCBzZWN1cmUgY29kZWMgY2FuIGNvZXhpc3Qgd2l0aCBub24tc2VjdXJlIGNvZGVjICMjIworICAgICAgICB7CisgICAgICAgICAgICBhZGRSZXNvdXJjZSgpOworICAgICAgICAgICAgbVNlcnZpY2UtPm1TdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzID0gZmFsc2U7CisgICAgICAgICAgICBtU2VydmljZS0+bVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjID0gdHJ1ZTsKKworICAgICAgICAgICAgLy8gcHJpb3JpdHkgdG9vIGxvdworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0xvd1ByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtNaWRQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisKKyAgICAgICAgICAgIC8vIHJlY2xhaW0gYWxsIHNlY3VyZSBjb2RlY3MKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgICAgICB2ZXJpZnlDbGllbnRzKHRydWUgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCB0cnVlIC8qIGMzICovKTsKKworICAgICAgICAgICAgLy8gY2FsbCBhZ2FpbiBzaG91bGQgcmVjbGFpbSBvbmUgbGFyZ2VzdCBncmFwaGljIG1lbW9yeSBmcm9tIGxvd2VzdCBwcm9jZXNzCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyhmYWxzZSAvKiBjMSAqLywgdHJ1ZSAvKiBjMiAqLywgZmFsc2UgLyogYzMgKi8pOworCisgICAgICAgICAgICAvLyBub3RoaW5nIGxlZnQKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICB9CisKKyAgICAgICAgLy8gIyMjIHNlY3VyZSBjb2RlY3MgY2FuJ3QgY29leGlzdCBhbmQgc2VjdXJlIGNvZGVjIGNhbid0IGNvZXhpc3Qgd2l0aCBub24tc2VjdXJlIGNvZGVjICMjIworICAgICAgICB7CisgICAgICAgICAgICBhZGRSZXNvdXJjZSgpOworICAgICAgICAgICAgbVNlcnZpY2UtPm1TdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzID0gZmFsc2U7CisgICAgICAgICAgICBtU2VydmljZS0+bVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjID0gZmFsc2U7CisKKyAgICAgICAgICAgIC8vIHByaW9yaXR5IHRvbyBsb3cKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtMb3dQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrTWlkUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworCisgICAgICAgICAgICAvLyByZWNsYWltIGFsbCBzZWN1cmUgYW5kIG5vbi1zZWN1cmUgY29kZWNzCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyh0cnVlIC8qIGMxICovLCB0cnVlIC8qIGMyICovLCB0cnVlIC8qIGMzICovKTsKKworICAgICAgICAgICAgLy8gbm90aGluZyBsZWZ0CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gIyMjIHNlY3VyZSBjb2RlY3MgY2FuIGNvZXhpc3QgYnV0IHNlY3VyZSBjb2RlYyBjYW4ndCBjb2V4aXN0IHdpdGggbm9uLXNlY3VyZSBjb2RlYyAjIyMKKyAgICAgICAgeworICAgICAgICAgICAgYWRkUmVzb3VyY2UoKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5tU3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjcyA9IHRydWU7CisgICAgICAgICAgICBtU2VydmljZS0+bVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjID0gZmFsc2U7CisKKyAgICAgICAgICAgIC8vIHByaW9yaXR5IHRvbyBsb3cKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtMb3dQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrTWlkUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworCisgICAgICAgICAgICAvLyByZWNsYWltIGFsbCBub24tc2VjdXJlIGNvZGVjcworICAgICAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIHRydWUgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKworICAgICAgICAgICAgLy8gY2FsbCBhZ2FpbiBzaG91bGQgcmVjbGFpbSBvbmUgbGFyZ2VzdCBncmFwaGljIG1lbW9yeSBmcm9tIGxvd2VzdCBwcm9jZXNzCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyh0cnVlIC8qIGMxICovLCBmYWxzZSAvKiBjMiAqLywgZmFsc2UgLyogYzMgKi8pOworCisgICAgICAgICAgICAvLyBjYWxsIGFnYWluIHNob3VsZCByZWNsYWltIGFub3RoZXIgbGFyZ2VzdCBncmFwaGljIG1lbW9yeSBmcm9tIGxvd2VzdCBwcm9jZXNzCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyhmYWxzZSAvKiBjMSAqLywgZmFsc2UgLyogYzIgKi8sIHRydWUgLyogYzMgKi8pOworCisgICAgICAgICAgICAvLyBub3RoaW5nIGxlZnQKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICB9CisKKyAgICAgICAgLy8gIyMjIHNlY3VyZSBjb2RlY3MgY2FuIGNvZXhpc3QgYW5kIHNlY3VyZSBjb2RlYyBjYW4gY29leGlzdCB3aXRoIG5vbi1zZWN1cmUgY29kZWMgIyMjCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZFJlc291cmNlKCk7CisgICAgICAgICAgICBtU2VydmljZS0+bVN1cHBvcnRzTXVsdGlwbGVTZWN1cmVDb2RlY3MgPSB0cnVlOworICAgICAgICAgICAgbVNlcnZpY2UtPm1TdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYyA9IHRydWU7CisKKyAgICAgICAgICAgIC8vIHByaW9yaXR5IHRvbyBsb3cKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtMb3dQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgICAgICAvLyBvbmUgbGFyZ2VzdCBncmFwaGljIG1lbW9yeSBmcm9tIGxvd2VzdCBwcm9jZXNzIGdvdCByZWNsYWltZWQKKyAgICAgICAgICAgIHZlcmlmeUNsaWVudHModHJ1ZSAvKiBjMSAqLywgZmFsc2UgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKworICAgICAgICAgICAgLy8gY2FsbCBhZ2FpbiBzaG91bGQgcmVjbGFpbSBhbm90aGVyIGdyYXBoaWMgbWVtb3J5IGZyb20gbG93ZXN0IHByb2Nlc3MKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCB0cnVlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisKKyAgICAgICAgICAgIC8vIGNhbGwgYWdhaW4gc2hvdWxkIHJlY2xhaW0gYW5vdGhlciBncmFwaGljIG1lbW9yeSBmcm9tIGxvd2VzdCBwcm9jZXNzCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyhmYWxzZSAvKiBjMSAqLywgZmFsc2UgLyogYzIgKi8sIHRydWUgLyogYzMgKi8pOworCisgICAgICAgICAgICAvLyBub3RoaW5nIGxlZnQKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICB9CisKKyAgICAgICAgLy8gIyMjIHNlY3VyZSBjb2RlY3MgY2FuIGNvZXhpc3QgYW5kIHNlY3VyZSBjb2RlYyBjYW4gY29leGlzdCB3aXRoIG5vbi1zZWN1cmUgY29kZWMgIyMjCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZFJlc291cmNlKCk7CisgICAgICAgICAgICBtU2VydmljZS0+bVN1cHBvcnRzTXVsdGlwbGVTZWN1cmVDb2RlY3MgPSB0cnVlOworICAgICAgICAgICAgbVNlcnZpY2UtPm1TdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYyA9IHRydWU7CisKKyAgICAgICAgICAgIFZlY3RvcjxNZWRpYVJlc291cmNlPiByZXNvdXJjZXM7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoU3RyaW5nOChrUmVzb3VyY2VTZWN1cmVDb2RlYyksIDEpKTsKKworICAgICAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgICAgIC8vIHNlY3VyZSBjb2RlYyBmcm9tIGxvd2VzdCBwcm9jZXNzIGdvdCByZWNsYWltZWQKKyAgICAgICAgICAgIHZlcmlmeUNsaWVudHModHJ1ZSAvKiBjMSAqLywgZmFsc2UgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKworICAgICAgICAgICAgLy8gY2FsbCBhZ2FpbiBzaG91bGQgcmVjbGFpbSBhbm90aGVyIHNlY3VyZSBjb2RlYyBmcm9tIGxvd2VzdCBwcm9jZXNzCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyhmYWxzZSAvKiBjMSAqLywgZmFsc2UgLyogYzIgKi8sIHRydWUgLyogYzMgKi8pOworCisgICAgICAgICAgICAvLyBubyBtb3JlIHNlY3VyZSBjb2RlYywgbm9uLXNlY3VyZSBjb2RlYyB3aWxsIGJlIHJlY2xhaW1lZC4KKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCB0cnVlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RSZWNsYWltUmVzb3VyY2VOb25TZWN1cmUoKSB7CisgICAgICAgIFZlY3RvcjxNZWRpYVJlc291cmNlPiByZXNvdXJjZXM7CisgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShTdHJpbmc4KGtSZXNvdXJjZU5vblNlY3VyZUNvZGVjKSwgMSkpOworICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoU3RyaW5nOChrUmVzb3VyY2VHcmFwaGljTWVtb3J5KSwgMTUwKSk7CisKKyAgICAgICAgLy8gIyMjIHNlY3VyZSBjb2RlYyBjYW4ndCBjb2V4aXN0IHdpdGggbm9uLXNlY3VyZSBjb2RlYyAjIyMKKyAgICAgICAgeworICAgICAgICAgICAgYWRkUmVzb3VyY2UoKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5tU3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMgPSBmYWxzZTsKKworICAgICAgICAgICAgLy8gcHJpb3JpdHkgdG9vIGxvdworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0xvd1ByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtNaWRQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisKKyAgICAgICAgICAgIC8vIHJlY2xhaW0gYWxsIHNlY3VyZSBjb2RlY3MKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgICAgICB2ZXJpZnlDbGllbnRzKHRydWUgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCB0cnVlIC8qIGMzICovKTsKKworICAgICAgICAgICAgLy8gY2FsbCBhZ2FpbiBzaG91bGQgcmVjbGFpbSBvbmUgZ3JhcGhpYyBtZW1vcnkgZnJvbSBsb3dlc3QgcHJvY2VzcworICAgICAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIHRydWUgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKworICAgICAgICAgICAgLy8gbm90aGluZyBsZWZ0CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gIyMjIHNlY3VyZSBjb2RlYyBjYW4gY29leGlzdCB3aXRoIG5vbi1zZWN1cmUgY29kZWMgIyMjCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZFJlc291cmNlKCk7CisgICAgICAgICAgICBtU2VydmljZS0+bVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjID0gdHJ1ZTsKKworICAgICAgICAgICAgLy8gcHJpb3JpdHkgdG9vIGxvdworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0xvd1ByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKworICAgICAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgICAgIC8vIG9uZSBsYXJnZXN0IGdyYXBoaWMgbWVtb3J5IGZyb20gbG93ZXN0IHByb2Nlc3MgZ290IHJlY2xhaW1lZAorICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyh0cnVlIC8qIGMxICovLCBmYWxzZSAvKiBjMiAqLywgZmFsc2UgLyogYzMgKi8pOworCisgICAgICAgICAgICAvLyBjYWxsIGFnYWluIHNob3VsZCByZWNsYWltIGFub3RoZXIgZ3JhcGhpYyBtZW1vcnkgZnJvbSBsb3dlc3QgcHJvY2VzcworICAgICAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIHRydWUgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKworICAgICAgICAgICAgLy8gY2FsbCBhZ2FpbiBzaG91bGQgcmVjbGFpbSBhbm90aGVyIGdyYXBoaWMgbWVtb3J5IGZyb20gbG93ZXN0IHByb2Nlc3MKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCBmYWxzZSAvKiBjMiAqLywgdHJ1ZSAvKiBjMyAqLyk7CisKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgbGVmdAorICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyAjIyMgc2VjdXJlIGNvZGVjIGNhbiBjb2V4aXN0IHdpdGggbm9uLXNlY3VyZSBjb2RlYyAjIyMKKyAgICAgICAgeworICAgICAgICAgICAgYWRkUmVzb3VyY2UoKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5tU3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMgPSB0cnVlOworCisgICAgICAgICAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gcmVzb3VyY2VzOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKFN0cmluZzgoa1Jlc291cmNlTm9uU2VjdXJlQ29kZWMpLCAxKSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgICAgICAvLyBvbmUgbm9uIHNlY3VyZSBjb2RlYyBmcm9tIGxvd2VzdCBwcm9jZXNzIGdvdCByZWNsYWltZWQKKyAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIHRydWUgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKworICAgICAgICAgICAgLy8gbm8gbW9yZSBub24tc2VjdXJlIGNvZGVjLCBzZWN1cmUgY29kZWMgZnJvbSBsb3dlc3QgcHJpb3JpdHkgcHJvY2VzcyB3aWxsIGJlIHJlY2xhaW1lZAorICAgICAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgICAgIHZlcmlmeUNsaWVudHModHJ1ZSAvKiBjMSAqLywgZmFsc2UgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKworICAgICAgICAgICAgLy8gY2xlYW4gdXAgY2xpZW50IDMgd2hpY2ggc3RpbGwgbGVmdAorICAgICAgICAgICAgbVNlcnZpY2UtPnJlbW92ZVJlc291cmNlKGtUZXN0UGlkMiwgZ2V0SWQobVRlc3RDbGllbnQzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RHZXRMb3dlc3RQcmlvcml0eUJpZ2dlc3RDbGllbnQoKSB7CisgICAgICAgIFN0cmluZzggdHlwZSA9IFN0cmluZzgoa1Jlc291cmNlR3JhcGhpY01lbW9yeSk7CisgICAgICAgIHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudDsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5nZXRMb3dlc3RQcmlvcml0eUJpZ2dlc3RDbGllbnRfbChrSGlnaFByaW9yaXR5UGlkLCB0eXBlLCAmY2xpZW50KSk7CisKKyAgICAgICAgYWRkUmVzb3VyY2UoKTsKKworICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPmdldExvd2VzdFByaW9yaXR5QmlnZ2VzdENsaWVudF9sKGtMb3dQcmlvcml0eVBpZCwgdHlwZSwgJmNsaWVudCkpOworICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+Z2V0TG93ZXN0UHJpb3JpdHlCaWdnZXN0Q2xpZW50X2woa0hpZ2hQcmlvcml0eVBpZCwgdHlwZSwgJmNsaWVudCkpOworCisgICAgICAgIC8vIGtUZXN0UGlkMSBpcyB0aGUgbG93ZXN0IHByaW9yaXR5IHByb2Nlc3Mgd2l0aCBrUmVzb3VyY2VHcmFwaGljTWVtb3J5LgorICAgICAgICAvLyBtVGVzdENsaWVudDEgaGFzIHRoZSBsYXJnZXN0IGtSZXNvdXJjZUdyYXBoaWNNZW1vcnkgd2l0aGluIGtUZXN0UGlkMS4KKyAgICAgICAgRVhQRUNUX0VRKG1UZXN0Q2xpZW50MSwgY2xpZW50KTsKKyAgICB9CisKKyAgICB2b2lkIHRlc3RHZXRMb3dlc3RQcmlvcml0eVBpZCgpIHsKKyAgICAgICAgaW50IHBpZDsKKyAgICAgICAgaW50IHByaW9yaXR5OworICAgICAgICBUZXN0UHJvY2Vzc0luZm8gcHJvY2Vzc0luZm87CisKKyAgICAgICAgU3RyaW5nOCB0eXBlID0gU3RyaW5nOChrUmVzb3VyY2VHcmFwaGljTWVtb3J5KTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5nZXRMb3dlc3RQcmlvcml0eVBpZF9sKHR5cGUsICZwaWQsICZwcmlvcml0eSkpOworCisgICAgICAgIGFkZFJlc291cmNlKCk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPmdldExvd2VzdFByaW9yaXR5UGlkX2wodHlwZSwgJnBpZCwgJnByaW9yaXR5KSk7CisgICAgICAgIEVYUEVDVF9FUShrVGVzdFBpZDEsIHBpZCk7CisgICAgICAgIGludCBwcmlvcml0eTE7CisgICAgICAgIHByb2Nlc3NJbmZvLmdldFByaW9yaXR5KGtUZXN0UGlkMSwgJnByaW9yaXR5MSk7CisgICAgICAgIEVYUEVDVF9FUShwcmlvcml0eTEsIHByaW9yaXR5KTsKKworICAgICAgICB0eXBlID0gU3RyaW5nOChrUmVzb3VyY2VOb25TZWN1cmVDb2RlYyk7CisgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5nZXRMb3dlc3RQcmlvcml0eVBpZF9sKHR5cGUsICZwaWQsICZwcmlvcml0eSkpOworICAgICAgICBFWFBFQ1RfRVEoa1Rlc3RQaWQyLCBwaWQpOworICAgICAgICBpbnQgcHJpb3JpdHkyOworICAgICAgICBwcm9jZXNzSW5mby5nZXRQcmlvcml0eShrVGVzdFBpZDIsICZwcmlvcml0eTIpOworICAgICAgICBFWFBFQ1RfRVEocHJpb3JpdHkyLCBwcmlvcml0eSk7CisgICAgfQorCisgICAgdm9pZCB0ZXN0R2V0QmlnZ2VzdENsaWVudCgpIHsKKyAgICAgICAgU3RyaW5nOCB0eXBlID0gU3RyaW5nOChrUmVzb3VyY2VHcmFwaGljTWVtb3J5KTsKKyAgICAgICAgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50OworICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPmdldEJpZ2dlc3RDbGllbnRfbChrVGVzdFBpZDIsIHR5cGUsICZjbGllbnQpKTsKKworICAgICAgICBhZGRSZXNvdXJjZSgpOworCisgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5nZXRCaWdnZXN0Q2xpZW50X2woa1Rlc3RQaWQyLCB0eXBlLCAmY2xpZW50KSk7CisgICAgICAgIEVYUEVDVF9FUShtVGVzdENsaWVudDIsIGNsaWVudCk7CisgICAgfQorCisgICAgdm9pZCB0ZXN0SXNDYWxsaW5nUHJpb3JpdHlIaWdoZXIoKSB7CisgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+aXNDYWxsaW5nUHJpb3JpdHlIaWdoZXJfbCgxMDEsIDEwMCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPmlzQ2FsbGluZ1ByaW9yaXR5SGlnaGVyX2woMTAwLCAxMDApKTsKKyAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPmlzQ2FsbGluZ1ByaW9yaXR5SGlnaGVyX2woOTksIDEwMCkpOworICAgIH0KKworICAgIHNwPFJlc291cmNlTWFuYWdlclNlcnZpY2U+IG1TZXJ2aWNlOworICAgIHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IG1UZXN0Q2xpZW50MTsKKyAgICBzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBtVGVzdENsaWVudDI7CisgICAgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gbVRlc3RDbGllbnQzOworfTsKKworVEVTVF9GKFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0LCBjb25maWcpIHsKKyAgICB0ZXN0Q29uZmlnKCk7Cit9CisKK1RFU1RfRihSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCwgYWRkUmVzb3VyY2UpIHsKKyAgICBhZGRSZXNvdXJjZSgpOworfQorCitURVNUX0YoUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QsIHJlbW92ZVJlc291cmNlKSB7CisgICAgdGVzdFJlbW92ZVJlc291cmNlKCk7Cit9CisKK1RFU1RfRihSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCwgcmVjbGFpbVJlc291cmNlKSB7CisgICAgdGVzdFJlY2xhaW1SZXNvdXJjZVNlY3VyZSgpOworICAgIHRlc3RSZWNsYWltUmVzb3VyY2VOb25TZWN1cmUoKTsKK30KKworVEVTVF9GKFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0LCBnZXRBbGxDbGllbnRzX2wpIHsKKyAgICB0ZXN0R2V0QWxsQ2xpZW50cygpOworfQorCitURVNUX0YoUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QsIGdldExvd2VzdFByaW9yaXR5QmlnZ2VzdENsaWVudF9sKSB7CisgICAgdGVzdEdldExvd2VzdFByaW9yaXR5QmlnZ2VzdENsaWVudCgpOworfQorCitURVNUX0YoUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QsIGdldExvd2VzdFByaW9yaXR5UGlkX2wpIHsKKyAgICB0ZXN0R2V0TG93ZXN0UHJpb3JpdHlQaWQoKTsKK30KKworVEVTVF9GKFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0LCBnZXRCaWdnZXN0Q2xpZW50X2wpIHsKKyAgICB0ZXN0R2V0QmlnZ2VzdENsaWVudCgpOworfQorCitURVNUX0YoUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QsIGlzQ2FsbGluZ1ByaW9yaXR5SGlnaGVyX2wpIHsKKyAgICB0ZXN0SXNDYWxsaW5nUHJpb3JpdHlIaWdoZXIoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9TZXJ2aWNlTG9nX3Rlc3QuY3BwIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9TZXJ2aWNlTG9nX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNzI0OTkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1NlcnZpY2VMb2dfdGVzdC5jcHAKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTZXJ2aWNlTG9nX3Rlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAiU2VydmljZUxvZy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFNlcnZpY2VMb2dUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgU2VydmljZUxvZ1Rlc3QoKSA6IG1TZXJ2aWNlTG9nKG5ldyBTZXJ2aWNlTG9nKDMpKSB7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgc3A8U2VydmljZUxvZz4gbVNlcnZpY2VMb2c7Cit9OworCitURVNUX0YoU2VydmljZUxvZ1Rlc3QsIGFkZFRoZW5Ub1N0cmluZykgeworICAgIFN0cmluZzggbG9nU3RyaW5nOworCisgICAgbVNlcnZpY2VMb2ctPmFkZChTdHJpbmc4KCJsb2cxIikpOworICAgIGxvZ1N0cmluZyA9IG1TZXJ2aWNlTG9nLT50b1N0cmluZygpOworICAgIEVYUEVDVF9UUlVFKGxvZ1N0cmluZy5jb250YWlucygibG9nMSIpKTsKKyAgICBBTE9HVigidG9TdHJpbmc6XG4lcyIsIGxvZ1N0cmluZy5zdHJpbmcoKSk7CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrVGVzdExvZ1ByZWZpeFtdID0gInRlc3Rsb2dwcmVmaXg6ICI7CisgICAgbG9nU3RyaW5nID0gbVNlcnZpY2VMb2ctPnRvU3RyaW5nKGtUZXN0TG9nUHJlZml4KTsKKyAgICBFWFBFQ1RfVFJVRShsb2dTdHJpbmcuY29udGFpbnMoa1Rlc3RMb2dQcmVmaXgpKTsKKyAgICBFWFBFQ1RfVFJVRShsb2dTdHJpbmcuY29udGFpbnMoImxvZzEiKSk7CisgICAgQUxPR1YoInRvU3RyaW5nOlxuJXMiLCBsb2dTdHJpbmcuc3RyaW5nKCkpOworCisgICAgbVNlcnZpY2VMb2ctPmFkZChTdHJpbmc4KCJsb2cyIikpOworICAgIGxvZ1N0cmluZyA9IG1TZXJ2aWNlTG9nLT50b1N0cmluZygpOworICAgIEVYUEVDVF9UUlVFKGxvZ1N0cmluZy5jb250YWlucygibG9nMSIpKTsKKyAgICBFWFBFQ1RfVFJVRShsb2dTdHJpbmcuY29udGFpbnMoImxvZzIiKSk7CisgICAgQUxPR1YoInRvU3RyaW5nOlxuJXMiLCBsb2dTdHJpbmcuc3RyaW5nKCkpOworCisgICAgbVNlcnZpY2VMb2ctPmFkZChTdHJpbmc4KCJsb2czIikpOworICAgIGxvZ1N0cmluZyA9IG1TZXJ2aWNlTG9nLT50b1N0cmluZygpOworICAgIEVYUEVDVF9UUlVFKGxvZ1N0cmluZy5jb250YWlucygibG9nMSIpKTsKKyAgICBFWFBFQ1RfVFJVRShsb2dTdHJpbmcuY29udGFpbnMoImxvZzIiKSk7CisgICAgRVhQRUNUX1RSVUUobG9nU3RyaW5nLmNvbnRhaW5zKCJsb2czIikpOworICAgIEFMT0dWKCJ0b1N0cmluZzpcbiVzIiwgbG9nU3RyaW5nLnN0cmluZygpKTsKKworICAgIG1TZXJ2aWNlTG9nLT5hZGQoU3RyaW5nOCgibG9nNCIpKTsKKyAgICBsb2dTdHJpbmcgPSBtU2VydmljZUxvZy0+dG9TdHJpbmcoKTsKKyAgICBFWFBFQ1RfRkFMU0UobG9nU3RyaW5nLmNvbnRhaW5zKCJsb2cxIikpOworICAgIEVYUEVDVF9UUlVFKGxvZ1N0cmluZy5jb250YWlucygibG9nMiIpKTsKKyAgICBFWFBFQ1RfVFJVRShsb2dTdHJpbmcuY29udGFpbnMoImxvZzMiKSk7CisgICAgRVhQRUNUX1RSVUUobG9nU3RyaW5nLmNvbnRhaW5zKCJsb2c0IikpOworICAgIEFMT0dWKCJ0b1N0cmluZzpcbiVzIiwgbG9nU3RyaW5nLnN0cmluZygpKTsKKworICAgIG1TZXJ2aWNlTG9nLT5hZGQoU3RyaW5nOCgibG9nNSIpKTsKKyAgICBsb2dTdHJpbmcgPSBtU2VydmljZUxvZy0+dG9TdHJpbmcoKTsKKyAgICBFWFBFQ1RfRkFMU0UobG9nU3RyaW5nLmNvbnRhaW5zKCJsb2cxIikpOworICAgIEVYUEVDVF9GQUxTRShsb2dTdHJpbmcuY29udGFpbnMoImxvZzIiKSk7CisgICAgRVhQRUNUX1RSVUUobG9nU3RyaW5nLmNvbnRhaW5zKCJsb2czIikpOworICAgIEVYUEVDVF9UUlVFKGxvZ1N0cmluZy5jb250YWlucygibG9nNCIpKTsKKyAgICBFWFBFQ1RfVFJVRShsb2dTdHJpbmcuY29udGFpbnMoImxvZzUiKSk7CisgICAgQUxPR1YoInRvU3RyaW5nOlxuJXMiLCBsb2dTdHJpbmcuc3RyaW5nKCkpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9BbmRyb2lkLm1rIGIvc2VydmljZXMvcmFkaW8vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWU1NjY2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvcmFkaW8vQW5kcm9pZC5tawpAQCAtMCwwICsxLDM2IEBACisjIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworCitMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgIFwKKyAgICBSYWRpb1NlcnZpY2UuY3BwCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVM6PSBcCisgICAgbGlidWkgXAorICAgIGxpYmxvZyBcCisgICAgbGlidXRpbHMgXAorICAgIGxpYmJpbmRlciBcCisgICAgbGliY3V0aWxzIFwKKyAgICBsaWJtZWRpYSBcCisgICAgbGliaGFyZHdhcmUgXAorICAgIGxpYnJhZGlvIFwKKyAgICBsaWJyYWRpb19tZXRhZGF0YQorCitMT0NBTF9NT0RVTEU6PSBsaWJyYWRpb3NlcnZpY2UKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmFkaW8vUmFkaW9SZWdpb25zLmggYi9zZXJ2aWNlcy9yYWRpby9SYWRpb1JlZ2lvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzM1YjhhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvcmFkaW8vUmFkaW9SZWdpb25zLmgKQEAgLTAsMCArMSwyMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfUkFESU9fUkVHSU9OU19ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfUkFESU9fUkVHSU9OU19ICisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBSQURJT19CQU5EX0xPV0VSX0ZNX0lUVTEgICAgODc1MDAKKyNkZWZpbmUgUkFESU9fQkFORF9VUFBFUl9GTV9JVFUxICAgIDEwODAwMAorI2RlZmluZSBSQURJT19CQU5EX1NQQUNJTkdfRk1fSVRVMSAgMTAwCisKKyNkZWZpbmUgUkFESU9fQkFORF9MT1dFUl9GTV9JVFUyICAgIDg3OTAwCisjZGVmaW5lIFJBRElPX0JBTkRfVVBQRVJfRk1fSVRVMiAgICAxMDc5MDAKKyNkZWZpbmUgUkFESU9fQkFORF9TUEFDSU5HX0ZNX0lUVTIgIDIwMAorCisjZGVmaW5lIFJBRElPX0JBTkRfTE9XRVJfRk1fSkFQQU4gICAgNzYwMDAKKyNkZWZpbmUgUkFESU9fQkFORF9VUFBFUl9GTV9KQVBBTiAgICA5MDAwMAorI2RlZmluZSBSQURJT19CQU5EX1NQQUNJTkdfRk1fSkFQQU4gIDEwMAorCisjZGVmaW5lIFJBRElPX0JBTkRfTE9XRVJfRk1fT0lSVCAgICA2NTgwMAorI2RlZmluZSBSQURJT19CQU5EX1VQUEVSX0ZNX09JUlQgICAgNzQwMDAKKyNkZWZpbmUgUkFESU9fQkFORF9TUEFDSU5HX0ZNX09JUlQgIDEwCisKKyNkZWZpbmUgUkFESU9fQkFORF9MT1dFUl9MVyAgICAgICAgIDE1MworI2RlZmluZSBSQURJT19CQU5EX1VQUEVSX0xXICAgICAgICAgMjc5CisjZGVmaW5lIFJBRElPX0JBTkRfU1BBQ0lOR19MVyAgICAgICA5CisKKyNkZWZpbmUgUkFESU9fQkFORF9MT1dFUl9NV19JVVQxICAgIDUzMQorI2RlZmluZSBSQURJT19CQU5EX1VQUEVSX01XX0lUVTEgICAgMTYxMQorI2RlZmluZSBSQURJT19CQU5EX1NQQUNJTkdfTVdfSVRVMSAgOQorCisjZGVmaW5lIFJBRElPX0JBTkRfTE9XRVJfTVdfSVVUMiAgICA1NDAKKyNkZWZpbmUgUkFESU9fQkFORF9VUFBFUl9NV19JVFUyICAgIDE2MTAKKyNkZWZpbmUgUkFESU9fQkFORF9TUEFDSU5HX01XX0lUVTIgIDEwCisKKyNkZWZpbmUgUkFESU9fQkFORF9MT1dFUl9TVyAgICAgICAgIDIzMDAKKyNkZWZpbmUgUkFESU9fQkFORF9VUFBFUl9TVyAgICAgICAgIDI2MTAwCisjZGVmaW5lIFJBRElPX0JBTkRfU1BBQ0lOR19TVyAgICAgICA1CisKKworI2lmbmRlZiBBUlJBWV9TSVpFCisjZGVmaW5lIEFSUkFZX1NJWkUoYSkgKHNpemVvZihhKSAvIHNpemVvZigoYSlbMF0pKQorI2VuZGlmCisKK2NvbnN0IHJhZGlvX2JhbmRfY29uZmlnX3Qgc0tub3duUmVnaW9uQ29uZmlnc1tdID0geworICAgIHsgICAvLyBGTSBJVFUgMQorICAgICAgICBSQURJT19SRUdJT05fSVRVXzEsCisgICAgICAgIHsKKyAgICAgICAgUkFESU9fQkFORF9GTSwKKyAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9GTV9JVFUxLAorICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9GTV9JVFUxLAorICAgICAgICAgICAgMSwKKyAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfRk1fSVRVMX0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICBSQURJT19ERUVNUEhBU0lTXzUwLAorICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgIFJBRElPX1JEU19XT1JMRCwKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSwKKyAgICB7ICAgLy8gRk0gQW1lcmljYXMKKyAgICAgICAgUkFESU9fUkVHSU9OX0lUVV8yLAorICAgICAgICB7CisgICAgICAgIFJBRElPX0JBTkRfRk0sCisgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfRk1fSVRVMiwKKyAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfRk1fSVRVMiwKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX0ZNX0lUVTJ9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgUkFESU9fREVFTVBIQVNJU183NSwKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICBSQURJT19SRFNfVVMsCisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0sCisgICAgeyAgIC8vIEZNIEphcGFuCisgICAgICAgIFJBRElPX1JFR0lPTl9KQVBBTiwKKyAgICAgICAgeworICAgICAgICBSQURJT19CQU5EX0ZNLAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX0ZNX0pBUEFOLAorICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9GTV9KQVBBTiwKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX0ZNX0pBUEFOfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFJBRElPX0RFRU1QSEFTSVNfNTAsCisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgUkFESU9fUkRTX1dPUkxELAorICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9LAorICAgIHsgICAvLyBGTSBLb3JlYQorICAgICAgICBSQURJT19SRUdJT05fS09SRUEsCisgICAgICAgIHsKKyAgICAgICAgUkFESU9fQkFORF9GTSwKKyAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9GTV9JVFUxLAorICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9GTV9JVFUxLAorICAgICAgICAgICAgMSwKKyAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfRk1fSVRVMX0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICBSQURJT19ERUVNUEhBU0lTXzc1LAorICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgIFJBRElPX1JEU19XT1JMRCwKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSwKKyAgICB7ICAgLy8gRk0gT0lSVAorICAgICAgICBSQURJT19SRUdJT05fT0lSVCwKKyAgICAgICAgeworICAgICAgICBSQURJT19CQU5EX0ZNLAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX0ZNX09JUlQsCisgICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX0ZNX09JUlQsCisgICAgICAgICAgICAxLAorICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19GTV9PSVJUfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFJBRElPX0RFRU1QSEFTSVNfNTAsCisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgUkFESU9fUkRTX1dPUkxELAorICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9LAorICAgIHsgICAvLyBGTSBVUyBIRCByYWRpbworICAgICAgICBSQURJT19SRUdJT05fSVRVXzIsCisgICAgICAgIHsKKyAgICAgICAgICAgIFJBRElPX0JBTkRfRk1fSEQsCisgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfRk1fSVRVMiwKKyAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfRk1fSVRVMiwKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX0ZNX0lUVTJ9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgUkFESU9fREVFTVBIQVNJU183NSwKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICBSQURJT19SRFNfVVMsCisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0sCisgICAgeyAgIC8vIEFNIExXCisgICAgICAgIFJBRElPX1JFR0lPTl9JVFVfMSwKKyAgICAgICAgeworICAgICAgICAgICAgUkFESU9fQkFORF9BTSwKKyAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9MVywKKyAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfTFcsCisgICAgICAgICAgICAxLAorICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19MV30sCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9LAorICAgIHsgICAvLyBBTSBTVworICAgICAgICBSQURJT19SRUdJT05fSVRVXzEsCisgICAgICAgIHsKKyAgICAgICAgICAgIFJBRElPX0JBTkRfQU0sCisgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfU1csCisgICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX1NXLAorICAgICAgICAgICAgMSwKKyAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfU1d9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSwKKyAgICB7ICAgLy8gQU0gTVcgSVRVMQorICAgICAgICBSQURJT19SRUdJT05fSVRVXzEsCisgICAgICAgIHsKKyAgICAgICAgICAgIFJBRElPX0JBTkRfQU0sCisgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfTVdfSVVUMSwKKyAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfTVdfSVRVMSwKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX01XX0lUVTF9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSwKKyAgICB7ICAgLy8gQU0gTVcgSVRVMgorICAgICAgICBSQURJT19SRUdJT05fSVRVXzIsCisgICAgICAgIHsKKyAgICAgICAgICAgIFJBRElPX0JBTkRfQU0sCisgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfTVdfSVVUMiwKKyAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfTVdfSVRVMiwKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX01XX0lUVTJ9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfTsKKworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1JBRElPX1JFR0lPTlNfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmFkaW8vUmFkaW9TZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL3JhZGlvL1JhZGlvU2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QwZjVmMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3JhZGlvL1JhZGlvU2VydmljZS5jcHAKQEAgLTAsMCArMSw5MDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlJhZGlvU2VydmljZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPHN5c3RlbS9yYWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9yYWRpb19tZXRhZGF0YS5oPgorI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvcmFkaW8uaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgorI2luY2x1ZGUgIlJhZGlvU2VydmljZS5oIgorI2luY2x1ZGUgIlJhZGlvUmVnaW9ucy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBjaGFyIGtSYWRpb1R1bmVyQXVkaW9EZXZpY2VOYW1lW10gPSAiUmFkaW8gdHVuZXIgc291cmNlIjsKKworUmFkaW9TZXJ2aWNlOjpSYWRpb1NlcnZpY2UoKQorICAgIDogQm5SYWRpb1NlcnZpY2UoKSwgbU5leHRVbmlxdWVJZCgxKQoreworICAgIEFMT0dJKCIlcyIsIF9fRlVOQ1RJT05fXyk7Cit9CisKK3ZvaWQgUmFkaW9TZXJ2aWNlOjpvbkZpcnN0UmVmKCkKK3sKKyAgICBjb25zdCBod19tb2R1bGVfdCAqbW9kOworICAgIGludCByYzsKKyAgICBzdHJ1Y3QgcmFkaW9faHdfZGV2aWNlICpkZXY7CisKKyAgICBBTE9HSSgiJXMiLCBfX0ZVTkNUSU9OX18pOworCisgICAgcmMgPSBod19nZXRfbW9kdWxlX2J5X2NsYXNzKFJBRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgUkFESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0ZNLCAmbW9kKTsKKyAgICBpZiAocmMgIT0gMCkgeworICAgICAgICBBTE9HRSgiY291bGRuJ3QgbG9hZCByYWRpbyBtb2R1bGUgJXMuJXMgKCVzKSIsCisgICAgICAgICAgICAgIFJBRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgInByaW1hcnkiLCBzdHJlcnJvcigtcmMpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICByYyA9IHJhZGlvX2h3X2RldmljZV9vcGVuKG1vZCwgJmRldik7CisgICAgaWYgKHJjICE9IDApIHsKKyAgICAgICAgQUxPR0UoImNvdWxkbid0IG9wZW4gcmFkaW8gaHcgZGV2aWNlIGluICVzLiVzICglcykiLAorICAgICAgICAgICAgICBSQURJT19IQVJEV0FSRV9NT0RVTEVfSUQsICJwcmltYXJ5Iiwgc3RyZXJyb3IoLXJjKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGRldi0+Y29tbW9uLnZlcnNpb24gIT0gUkFESU9fREVWSUNFX0FQSV9WRVJTSU9OX0NVUlJFTlQpIHsKKyAgICAgICAgQUxPR0UoIndyb25nIHJhZGlvIGh3IGRldmljZSB2ZXJzaW9uICUwNHgiLCBkZXYtPmNvbW1vbi52ZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0cnVjdCByYWRpb19oYWxfcHJvcGVydGllcyBoYWxQcm9wZXJ0aWVzOworICAgIHJjID0gZGV2LT5nZXRfcHJvcGVydGllcyhkZXYsICZoYWxQcm9wZXJ0aWVzKTsKKyAgICBpZiAocmMgIT0gMCkgeworICAgICAgICBBTE9HRSgiY291bGQgbm90IHJlYWQgaW1wbGVtZW50YXRpb24gcHJvcGVydGllcyIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmFkaW9fcHJvcGVydGllc190IHByb3BlcnRpZXM7CisgICAgcHJvcGVydGllcy5oYW5kbGUgPQorICAgICAgICAgICAgKHJhZGlvX2hhbmRsZV90KWFuZHJvaWRfYXRvbWljX2luYygmbU5leHRVbmlxdWVJZCk7CisKKyAgICBBTE9HSSgibG9hZGVkIGRlZmF1bHQgbW9kdWxlICVzLCBoYW5kbGUgJWQiLCBwcm9wZXJ0aWVzLnByb2R1Y3QsIHByb3BlcnRpZXMuaGFuZGxlKTsKKworICAgIGNvbnZlcnRQcm9wZXJ0aWVzKCZwcm9wZXJ0aWVzLCAmaGFsUHJvcGVydGllcyk7CisgICAgc3A8TW9kdWxlPiBtb2R1bGUgPSBuZXcgTW9kdWxlKGRldiwgcHJvcGVydGllcyk7CisgICAgbU1vZHVsZXMuYWRkKHByb3BlcnRpZXMuaGFuZGxlLCBtb2R1bGUpOworfQorCitSYWRpb1NlcnZpY2U6On5SYWRpb1NlcnZpY2UoKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgcmFkaW9faHdfZGV2aWNlX2Nsb3NlKG1Nb2R1bGVzLnZhbHVlQXQoaSktPmh3RGV2aWNlKCkpOworICAgIH0KK30KKworc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpsaXN0TW9kdWxlcyhzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyAqcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpCit7CisgICAgQUxPR1YoImxpc3RNb2R1bGVzIik7CisKKyAgICBBdXRvTXV0ZXggbG9jayhtU2VydmljZUxvY2spOworICAgIGlmIChudW1Nb2R1bGVzID09IE5VTEwgfHwgKCpudW1Nb2R1bGVzICE9IDAgJiYgcHJvcGVydGllcyA9PSBOVUxMKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzaXplX3QgbWF4TW9kdWxlcyA9ICpudW1Nb2R1bGVzOworICAgICpudW1Nb2R1bGVzID0gbU1vZHVsZXMuc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZXMuc2l6ZSgpICYmIGkgPCBtYXhNb2R1bGVzOyBpKyspIHsKKyAgICAgICAgcHJvcGVydGllc1tpXSA9IG1Nb2R1bGVzLnZhbHVlQXQoaSktPnByb3BlcnRpZXMoKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBSYWRpb1NlcnZpY2U6OmF0dGFjaChyYWRpb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJUmFkaW9DbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd2l0aEF1ZGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVJhZGlvPiYgcmFkaW8pCit7CisgICAgQUxPR1YoIiVzICVkIGNvbmZpZyAlcCB3aXRoQXVkaW8gJWQiLCBfX0ZVTkNUSU9OX18sIGhhbmRsZSwgY29uZmlnLCB3aXRoQXVkaW8pOworCisgICAgQXV0b011dGV4IGxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICByYWRpby5jbGVhcigpOworICAgIGlmIChjbGllbnQgPT0gMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzc2l6ZV90IGluZGV4ID0gbU1vZHVsZXMuaW5kZXhPZktleShoYW5kbGUpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3A8TW9kdWxlPiBtb2R1bGUgPSBtTW9kdWxlcy52YWx1ZUF0KGluZGV4KTsKKworICAgIGlmIChjb25maWcgPT0gTlVMTCkgeworICAgICAgICBjb25maWcgPSBtb2R1bGUtPmdldERlZmF1bHRDb25maWcoKTsKKyAgICAgICAgaWYgKGNvbmZpZyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoIiVzIHJlZ2lvbiAlZCB0eXBlICVkIiwgX19GVU5DVElPTl9fLCBjb25maWctPnJlZ2lvbiwgY29uZmlnLT5iYW5kLnR5cGUpOworCisgICAgcmFkaW8gPSBtb2R1bGUtPmFkZENsaWVudChjbGllbnQsIGNvbmZpZywgd2l0aEF1ZGlvKTsKKworICAgIGlmIChyYWRpbyA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKworc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tSZXRyaWVzID0gNTA7CitzdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1NsZWVwID0gNjAwMDA7CisKK3N0YXRpYyBib29sIHRyeUxvY2soTXV0ZXgmIG11dGV4KQoreworICAgIGJvb2wgbG9ja2VkID0gZmFsc2U7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrRHVtcExvY2tSZXRyaWVzOyArK2kpIHsKKyAgICAgICAgaWYgKG11dGV4LnRyeUxvY2soKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgbG9ja2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHVzbGVlcChrRHVtcExvY2tTbGVlcCk7CisgICAgfQorICAgIHJldHVybiBsb2NrZWQ7Cit9CisKK3N0YXR1c190IFJhZGlvU2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpIHsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICBpZiAoY2hlY2tDYWxsaW5nUGVybWlzc2lvbihTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKSkgPT0gZmFsc2UpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiUGVybWlzc2lvbiBEZW5pYWw6IGNhbid0IGR1bXAgUmFkaW9TZXJ2aWNlIik7CisgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGJvb2wgbG9ja2VkID0gdHJ5TG9jayhtU2VydmljZUxvY2spOworICAgICAgICAvLyBmYWlsZWQgdG8gbG9jayAtIFJhZGlvU2VydmljZSBpcyBwcm9iYWJseSBkZWFkbG9ja2VkCisgICAgICAgIGlmICghbG9ja2VkKSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJSYWRpb1NlcnZpY2UgbWF5IGJlIGRlYWRsb2NrZWRcbiIpOworICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobG9ja2VkKSBtU2VydmljZUxvY2sudW5sb2NrKCk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpvblRyYW5zYWN0KAorICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICByZXR1cm4gQm5SYWRpb1NlcnZpY2U6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKK30KKworCisvLyBzdGF0aWMKK3ZvaWQgUmFkaW9TZXJ2aWNlOjpjYWxsYmFjayhyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQsIHZvaWQgKmNvb2tpZSkKK3sKKyAgICBDYWxsYmFja1RocmVhZCAqY2FsbGJhY2tUaHJlYWQgPSAoQ2FsbGJhY2tUaHJlYWQgKiljb29raWU7CisgICAgaWYgKGNhbGxiYWNrVGhyZWFkID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYWxsYmFja1RocmVhZC0+c2VuZEV2ZW50KGhhbEV2ZW50KTsKK30KKworLyogc3RhdGljICovCit2b2lkIFJhZGlvU2VydmljZTo6Y29udmVydFByb3BlcnRpZXMocmFkaW9fcHJvcGVydGllc190ICpwcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhZGlvX2hhbF9wcm9wZXJ0aWVzX3QgKmhhbFByb3BlcnRpZXMpCit7CisgICAgbWVtc2V0KHByb3BlcnRpZXMsIDAsIHNpemVvZihzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcykpOworICAgIHByb3BlcnRpZXMtPmNsYXNzX2lkID0gaGFsUHJvcGVydGllcy0+Y2xhc3NfaWQ7CisgICAgc3RybGNweShwcm9wZXJ0aWVzLT5pbXBsZW1lbnRvciwgaGFsUHJvcGVydGllcy0+aW1wbGVtZW50b3IsCisgICAgICAgICAgICBSQURJT19TVFJJTkdfTEVOX01BWCk7CisgICAgc3RybGNweShwcm9wZXJ0aWVzLT5wcm9kdWN0LCBoYWxQcm9wZXJ0aWVzLT5wcm9kdWN0LAorICAgICAgICAgICAgUkFESU9fU1RSSU5HX0xFTl9NQVgpOworICAgIHN0cmxjcHkocHJvcGVydGllcy0+dmVyc2lvbiwgaGFsUHJvcGVydGllcy0+dmVyc2lvbiwKKyAgICAgICAgICAgIFJBRElPX1NUUklOR19MRU5fTUFYKTsKKyAgICBzdHJsY3B5KHByb3BlcnRpZXMtPnNlcmlhbCwgaGFsUHJvcGVydGllcy0+c2VyaWFsLAorICAgICAgICAgICAgUkFESU9fU1RSSU5HX0xFTl9NQVgpOworICAgIHByb3BlcnRpZXMtPm51bV90dW5lcnMgPSBoYWxQcm9wZXJ0aWVzLT5udW1fdHVuZXJzOworICAgIHByb3BlcnRpZXMtPm51bV9hdWRpb19zb3VyY2VzID0gaGFsUHJvcGVydGllcy0+bnVtX2F1ZGlvX3NvdXJjZXM7CisgICAgcHJvcGVydGllcy0+c3VwcG9ydHNfY2FwdHVyZSA9IGhhbFByb3BlcnRpZXMtPnN1cHBvcnRzX2NhcHR1cmU7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoc0tub3duUmVnaW9uQ29uZmlncyk7IGkrKykgeworICAgICAgICBjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqYmFuZCA9ICZzS25vd25SZWdpb25Db25maWdzW2ldLmJhbmQ7CisgICAgICAgIHNpemVfdCBqOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgaGFsUHJvcGVydGllcy0+bnVtX2JhbmRzOyBqKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpoYWxCYW5kID0gJmhhbFByb3BlcnRpZXMtPmJhbmRzW2pdOworICAgICAgICAgICAgc2l6ZV90IGs7CisgICAgICAgICAgICBpZiAoYmFuZC0+dHlwZSAhPSBoYWxCYW5kLT50eXBlKSBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChiYW5kLT5sb3dlcl9saW1pdCA8IGhhbEJhbmQtPmxvd2VyX2xpbWl0KSBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChiYW5kLT51cHBlcl9saW1pdCA+IGhhbEJhbmQtPnVwcGVyX2xpbWl0KSBjb250aW51ZTsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBoYWxCYW5kLT5udW1fc3BhY2luZ3M7IGsrKykgeworICAgICAgICAgICAgICAgIGlmIChiYW5kLT5zcGFjaW5nc1swXSA9PSBoYWxCYW5kLT5zcGFjaW5nc1trXSkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoayA9PSBoYWxCYW5kLT5udW1fc3BhY2luZ3MpIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGJhbmQtPnR5cGUgPT0gUkFESU9fQkFORF9BTSkgYnJlYWs7CisgICAgICAgICAgICBpZiAoKGJhbmQtPmZtLmRlZW1waGFzaXMgJiBoYWxCYW5kLT5mbS5kZWVtcGhhc2lzKSA9PSAwKSBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChoYWxCYW5kLT5mbS5yZHMgPT0gMCkgYnJlYWs7CisgICAgICAgICAgICBpZiAoKGJhbmQtPmZtLnJkcyAmIGhhbEJhbmQtPmZtLnJkcykgIT0gMCkgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGogPT0gaGFsUHJvcGVydGllcy0+bnVtX2JhbmRzKSBjb250aW51ZTsKKworICAgICAgICBBTE9HSSgiY29udmVydFByb3BlcnRpZXMoKSBBZGRpbmcgYmFuZCB0eXBlICVkIHJlZ2lvbiAlZCIsCisgICAgICAgICAgICAgIHNLbm93blJlZ2lvbkNvbmZpZ3NbaV0uYmFuZC50eXBlICwgc0tub3duUmVnaW9uQ29uZmlnc1tpXS5yZWdpb24pOworCisgICAgICAgIG1lbWNweSgmcHJvcGVydGllcy0+YmFuZHNbcHJvcGVydGllcy0+bnVtX2JhbmRzKytdLAorICAgICAgICAgICAgICAgJnNLbm93blJlZ2lvbkNvbmZpZ3NbaV0sCisgICAgICAgICAgICAgICBzaXplb2YocmFkaW9fYmFuZF9jb25maWdfdCkpOworICAgIH0KK30KKworI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiUmFkaW9TZXJ2aWNlOjpDYWxsYmFja1RocmVhZCIKKworUmFkaW9TZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6Q2FsbGJhY2tUaHJlYWQoY29uc3Qgd3A8TW9kdWxlQ2xpZW50PiYgbW9kdWxlQ2xpZW50KQorICAgIDogbU1vZHVsZUNsaWVudChtb2R1bGVDbGllbnQpLCBtTWVtb3J5RGVhbGVyKG5ldyBNZW1vcnlEZWFsZXIoMTAyNCAqIDEwMjQsICJSYWRpb1NlcnZpY2UiKSkKK3sKK30KKworUmFkaW9TZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6fkNhbGxiYWNrVGhyZWFkKCkKK3sKKyAgICBtRXZlbnRRdWV1ZS5jbGVhcigpOworfQorCit2b2lkIFJhZGlvU2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6Om9uRmlyc3RSZWYoKQoreworICAgIHJ1bigiUmFkaW9TZXJ2aWNlIGNiayIsIEFORFJPSURfUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsKK30KKworYm9vbCBSYWRpb1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjp0aHJlYWRMb29wKCkKK3sKKyAgICB3aGlsZSAoIWV4aXRQZW5kaW5nKCkpIHsKKyAgICAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnk7CisgICAgICAgIHNwPE1vZHVsZUNsaWVudD4gbW9kdWxlQ2xpZW50OworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhbGxiYWNrTG9jayk7CisgICAgICAgICAgICB3aGlsZSAobUV2ZW50UXVldWUuaXNFbXB0eSgpICYmICFleGl0UGVuZGluZygpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIkNhbGxiYWNrVGhyZWFkOjp0aHJlYWRMb29wKCkgc2xlZXAiKTsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tDb25kLndhaXQobUNhbGxiYWNrTG9jayk7CisgICAgICAgICAgICAgICAgQUxPR1YoIkNhbGxiYWNrVGhyZWFkOjp0aHJlYWRMb29wKCkgd2FrZSB1cCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV2ZW50TWVtb3J5ID0gbUV2ZW50UXVldWVbMF07CisgICAgICAgICAgICBtRXZlbnRRdWV1ZS5yZW1vdmVBdCgwKTsKKyAgICAgICAgICAgIG1vZHVsZUNsaWVudCA9IG1Nb2R1bGVDbGllbnQucHJvbW90ZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChtb2R1bGVDbGllbnQgIT0gMCkgeworICAgICAgICAgICAgbW9kdWxlQ2xpZW50LT5vbkNhbGxiYWNrRXZlbnQoZXZlbnRNZW1vcnkpOworICAgICAgICAgICAgZXZlbnRNZW1vcnkuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUmFkaW9TZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6ZXhpdCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DYWxsYmFja0xvY2spOworICAgIHJlcXVlc3RFeGl0KCk7CisgICAgbUNhbGxiYWNrQ29uZC5icm9hZGNhc3QoKTsKK30KKworc3A8SU1lbW9yeT4gUmFkaW9TZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6cHJlcGFyZUV2ZW50KHJhZGlvX2hhbF9ldmVudF90ICpoYWxFdmVudCkKK3sKKyAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeTsKKworICAgIHNpemVfdCBoZWFkZXJTaXplID0KKyAgICAgICAgICAgIChzaXplb2Yoc3RydWN0IHJhZGlvX2V2ZW50KSArIHNpemVvZih1bnNpZ25lZCBpbnQpIC0gMSkgL3NpemVvZih1bnNpZ25lZCBpbnQpOworICAgIHNpemVfdCBtZXRhZGF0YVNpemUgPSAwOworICAgIHN3aXRjaCAoaGFsRXZlbnQtPnR5cGUpIHsKKyAgICBjYXNlIFJBRElPX0VWRU5UX1RVTkVEOgorICAgIGNhc2UgUkFESU9fRVZFTlRfQUZfU1dJVENIOgorICAgICAgICBpZiAocmFkaW9fbWV0YWRhdGFfY2hlY2soaGFsRXZlbnQtPmluZm8ubWV0YWRhdGEpID09IDApIHsKKyAgICAgICAgICAgIG1ldGFkYXRhU2l6ZSA9IHJhZGlvX21ldGFkYXRhX2dldF9zaXplKGhhbEV2ZW50LT5pbmZvLm1ldGFkYXRhKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFJBRElPX0VWRU5UX01FVEFEQVRBOgorICAgICAgICBpZiAocmFkaW9fbWV0YWRhdGFfY2hlY2soaGFsRXZlbnQtPm1ldGFkYXRhKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZXZlbnRNZW1vcnk7CisgICAgICAgIH0KKyAgICAgICAgbWV0YWRhdGFTaXplID0gcmFkaW9fbWV0YWRhdGFfZ2V0X3NpemUoaGFsRXZlbnQtPm1ldGFkYXRhKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHNpemVfdCBzaXplID0gaGVhZGVyU2l6ZSArIG1ldGFkYXRhU2l6ZTsKKyAgICBldmVudE1lbW9yeSA9IG1NZW1vcnlEZWFsZXItPmFsbG9jYXRlKHNpemUpOworICAgIGlmIChldmVudE1lbW9yeSA9PSAwIHx8IGV2ZW50TWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICBldmVudE1lbW9yeS5jbGVhcigpOworICAgICAgICByZXR1cm4gZXZlbnRNZW1vcnk7CisgICAgfQorICAgIHN0cnVjdCByYWRpb19ldmVudCAqZXZlbnQgPSAoc3RydWN0IHJhZGlvX2V2ZW50ICopZXZlbnRNZW1vcnktPnBvaW50ZXIoKTsKKyAgICBldmVudC0+dHlwZSA9IGhhbEV2ZW50LT50eXBlOworICAgIGV2ZW50LT5zdGF0dXMgPSBoYWxFdmVudC0+c3RhdHVzOworCisgICAgc3dpdGNoIChldmVudC0+dHlwZSkgeworICAgIGNhc2UgUkFESU9fRVZFTlRfQ09ORklHOgorICAgICAgICBldmVudC0+Y29uZmlnLmJhbmQgPSBoYWxFdmVudC0+Y29uZmlnOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJBRElPX0VWRU5UX1RVTkVEOgorICAgIGNhc2UgUkFESU9fRVZFTlRfQUZfU1dJVENIOgorICAgICAgICBldmVudC0+aW5mbyA9IGhhbEV2ZW50LT5pbmZvOworICAgICAgICBpZiAobWV0YWRhdGFTaXplICE9IDApIHsKKyAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKWV2ZW50ICsgaGVhZGVyU2l6ZSwgaGFsRXZlbnQtPmluZm8ubWV0YWRhdGEsIG1ldGFkYXRhU2l6ZSk7CisgICAgICAgICAgICAvLyByZXBsYWNlIG1ldGEgZGF0YSBwb2ludGVyIGJ5IG9mZnNldCB3aGlsZSBpbiBzaGFyZWQgbWVtb3J5IHNvIHRoYXQgcmVjZWl2aW5nIHNpZGUKKyAgICAgICAgICAgIC8vIGNhbiByZXN0b3JlIHRoZSBwb2ludGVyIGluIGRlc3RpbmF0aW9uIHByb2Nlc3MuCisgICAgICAgICAgICBldmVudC0+aW5mby5tZXRhZGF0YSA9IChyYWRpb19tZXRhZGF0YV90ICopaGVhZGVyU2l6ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFJBRElPX0VWRU5UX1RBOgorICAgIGNhc2UgUkFESU9fRVZFTlRfQU5URU5OQToKKyAgICBjYXNlIFJBRElPX0VWRU5UX0NPTlRST0w6CisgICAgICAgIGV2ZW50LT5vbiA9IGhhbEV2ZW50LT5vbjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSQURJT19FVkVOVF9NRVRBREFUQToKKyAgICAgICAgbWVtY3B5KChjaGFyICopZXZlbnQgKyBoZWFkZXJTaXplLCBoYWxFdmVudC0+bWV0YWRhdGEsIG1ldGFkYXRhU2l6ZSk7CisgICAgICAgIC8vIHJlcGxhY2UgbWV0YSBkYXRhIHBvaW50ZXIgYnkgb2Zmc2V0IHdoaWxlIGluIHNoYXJlZCBtZW1vcnkgc28gdGhhdCByZWNlaXZpbmcgc2lkZQorICAgICAgICAvLyBjYW4gcmVzdG9yZSB0aGUgcG9pbnRlciBpbiBkZXN0aW5hdGlvbiBwcm9jZXNzLgorICAgICAgICBldmVudC0+bWV0YWRhdGEgPSAocmFkaW9fbWV0YWRhdGFfdCAqKWhlYWRlclNpemU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUkFESU9fRVZFTlRfSFdfRkFJTFVSRToKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gZXZlbnRNZW1vcnk7Cit9CisKK3ZvaWQgUmFkaW9TZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6c2VuZEV2ZW50KHJhZGlvX2hhbF9ldmVudF90ICpldmVudCkKKyB7CisgICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gcHJlcGFyZUV2ZW50KGV2ZW50KTsKKyAgICAgaWYgKGV2ZW50TWVtb3J5ID09IDApIHsKKyAgICAgICAgIHJldHVybjsKKyAgICAgfQorCisgICAgIEF1dG9NdXRleCBsb2NrKG1DYWxsYmFja0xvY2spOworICAgICBtRXZlbnRRdWV1ZS5hZGQoZXZlbnRNZW1vcnkpOworICAgICBtQ2FsbGJhY2tDb25kLnNpZ25hbCgpOworICAgICBBTE9HVigiJXMgRE9ORSIsIF9fRlVOQ1RJT05fXyk7Cit9CisKKworI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiUmFkaW9TZXJ2aWNlOjpNb2R1bGUiCisKK1JhZGlvU2VydmljZTo6TW9kdWxlOjpNb2R1bGUocmFkaW9faHdfZGV2aWNlKiBod0RldmljZSwgcmFkaW9fcHJvcGVydGllcyBwcm9wZXJ0aWVzKQorIDogbUh3RGV2aWNlKGh3RGV2aWNlKSwgbVByb3BlcnRpZXMocHJvcGVydGllcyksIG1NdXRlKHRydWUpCit7Cit9CisKK1JhZGlvU2VydmljZTo6TW9kdWxlOjp+TW9kdWxlKCkgeworICAgIG1Nb2R1bGVDbGllbnRzLmNsZWFyKCk7Cit9CisKK3N0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlOjpkdW1wKGludCBmZCBfX3VudXNlZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgeworICAgIFN0cmluZzggcmVzdWx0OworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3A8UmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ+IFJhZGlvU2VydmljZTo6TW9kdWxlOjphZGRDbGllbnQoY29uc3Qgc3A8SVJhZGlvQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1ZGlvKQoreworICAgIEFMT0dWKCJhZGRDbGllbnQoKSAlcCBjb25maWcgJXAgcHJvZHVjdCAlcyIsIHRoaXMsIGNvbmZpZywgbVByb3BlcnRpZXMucHJvZHVjdCk7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIHNwPE1vZHVsZUNsaWVudD4gbW9kdWxlQ2xpZW50OworICAgIGludCByZXQ7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2R1bGVDbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtTW9kdWxlQ2xpZW50c1tpXS0+Y2xpZW50KCkgPT0gY2xpZW50KSB7CisgICAgICAgICAgICAvLyBjbGllbnQgYWxyZWFkeSBjb25uZWN0ZWQ6IHJlamVjdAorICAgICAgICAgICAgcmV0dXJuIG1vZHVsZUNsaWVudDsKKyAgICAgICAgfQorICAgIH0KKyAgICBtb2R1bGVDbGllbnQgPSBuZXcgTW9kdWxlQ2xpZW50KHRoaXMsIGNsaWVudCwgY29uZmlnLCBhdWRpbyk7CisKKyAgICBzdHJ1Y3QgcmFkaW9faGFsX2JhbmRfY29uZmlnIGhhbENvbmZpZzsKKyAgICBoYWxDb25maWcgPSBjb25maWctPmJhbmQ7CisKKyAgICAvLyBUdW5lciBwcmVlbXB0aW9uIGxvZ2ljOgorICAgIC8vIFRoZXJlIGlzIGEgbGltaXRlZCBhbW91bnQgb2YgdHVuZXJzIGFuZCBhIGxpbWl0ZWQgYW1vdW50IG9mIHJhZGlvIGF1ZGlvIHNvdXJjZXMgcGVyIG1vZHVsZS4KKyAgICAvLyBUaGUgbWluaW11bSBpcyBvbmUgdHVuZXIgYW5kIG9uZSBhdWRpbyBzb3VyY2UuCisgICAgLy8gVGhlIG51bWJlcnMgb2YgdHVuZXJzIGFuZCBzb3VyY2VzIGFyZSBpbmRpY2F0ZWQgaW4gdGhlIG1vZHVsZSBwcm9wZXJ0aWVzLgorICAgIC8vIE5PVEU6IGN1cnJlbnQgZnJhbWV3b3JrIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgb25lIHJhZGlvIGF1ZGlvIHNvdXJjZS4KKyAgICAvLyBJdCBpcyBwb3NzaWJsZSB0byBvcGVuIG1vcmUgdGhhbiBvbmUgdHVuZXIgYXQgYSB0aW1lIGJ1dCBvbmx5IG9uZSB0dW5lciBjYW4gYmUgY29ubmVjdGVkCisgICAgLy8gdG8gdGhlIHJhZGlvIGF1ZGlvIHNvdXJjZSAoQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSKS4KKyAgICAvLyBUaGUgYmFzZSBydWxlIGlzIHRoYXQgYSBuZXdseSBjb25uZWN0ZWQgdHVuZXIgYWx3YXlzIHdpbnMsIGkuZS4gYWx3YXlzIGdldHMgYSB0dW5lcgorICAgIC8vIGFuZCBjYW4gdXNlIHRoZSBhdWRpbyBzb3VyY2UgaWYgcmVxdWVzdGVkLgorICAgIC8vIElmIGFub3RoZXIgY2xpZW50IGlzIHByZWVtcHRlZCwgaXQgaXMgbm90aWZpZWQgYnkgYSBjYWxsYmFjayB3aXRoIFJBRElPX0VWRU5UX0NPTlRST0wKKyAgICAvLyBpbmRpY2F0aW5nIGxvc3Mgb2YgY29udHJvbC4KKyAgICAvLyAtIElmIHRoZSBuZXdseSBjb25uZWN0ZWQgY2xpZW50IHJlcXVlc3RzIHRoZSBhdWRpbyBzb3VyY2UgKGF1ZGlvID09IHRydWUpOgorICAgIC8vICAgIC0gaWYgYW4gYXVkaW8gc291cmNlIGlzIGF2YWlsYWJsZQorICAgIC8vICAgICAgICAgIG5vIHByb2JsZW0KKyAgICAvLyAgICAtIGlmIG5vdDoKKyAgICAvLyAgICAgICAgICB0aGUgb2xkZXN0IGNsaWVudCBpbiB0aGUgbGlzdCB1c2luZyBhdWRpbyBpcyBwcmVlbXB0ZWQuCisgICAgLy8gLSBJZiB0aGUgbmV3bHkgY29ubmVjdGVkIGNsaWVudCBkb2VzIG5vdCByZXF1ZXN0IHRoZSBhdWRpbyBzb3VyY2UgKGF1ZGlvID09IGZhbHNlKToKKyAgICAvLyAgICAtIGlmIGEgdHVuZXIgaXMgYXZhaWxhYmxlCisgICAgLy8gICAgICAgICAgbm8gcHJvYmxlbQorICAgIC8vICAgIC0gaWYgbm90OgorICAgIC8vICAgICAgICAgIFRoZSBvbGRlc3QgY2xpZW50IG5vdCB1c2luZyBhdWRpbyBpcyBwcmVlbXB0ZWQgZmlyc3QgYW5kIGlmIG5vbmUgaXMgZm91bmQgdGhlCisgICAgLy8gICAgICAgICAgdGhlIG9sZGVzdCBjbGllbnQgdXNpbmcgYXVkaW8gaXMgcHJlZW1wdGVkLgorICAgIC8vIEVhY2ggdGltZSBhIHR1bmVyIHVzaW5nIHRoZSBhdWRpbyBzb3VyY2UgaXMgb3BlbmVkIG9yIGNsb3NlZCwgdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGlzCisgICAgLy8gbm90aWZpZWQgb2YgdGhlIGNvbm5lY3Rpb24gb3IgZGlzY29ubmVjdGlvbiBvZiBBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIuCisKKyAgICBzcDxNb2R1bGVDbGllbnQ+IG9sZGVzdFR1bmVyOworICAgIHNwPE1vZHVsZUNsaWVudD4gb2xkZXN0QXVkaW87CisgICAgc2l6ZV90IGFsbG9jYXRlZFR1bmVycyA9IDA7CisgICAgc2l6ZV90IGFsbG9jYXRlZEF1ZGlvID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2R1bGVDbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtTW9kdWxlQ2xpZW50c1tpXS0+Z2V0VHVuZXIoKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAobU1vZHVsZUNsaWVudHNbaV0tPmF1ZGlvKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAob2xkZXN0QXVkaW8gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBvbGRlc3RBdWRpbyA9IG1Nb2R1bGVDbGllbnRzW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhbGxvY2F0ZWRBdWRpbysrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAob2xkZXN0VHVuZXIgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBvbGRlc3RUdW5lciA9IG1Nb2R1bGVDbGllbnRzW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhbGxvY2F0ZWRUdW5lcnMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IHN0cnVjdCByYWRpb190dW5lciAqaGFsVHVuZXI7CisgICAgc3A8TW9kdWxlQ2xpZW50PiBwcmVlbXRlZENsaWVudDsKKyAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgaWYgKGFsbG9jYXRlZEF1ZGlvID49IG1Qcm9wZXJ0aWVzLm51bV9hdWRpb19zb3VyY2VzKSB7CisgICAgICAgICAgICBBTE9HX0FTU0VSVChvbGRlc3RBdWRpbyAhPSAwLCAiYWRkQ2xpZW50KCkgYWxsb2NhdGVkQXVkaW8vb2xkZXN0QXVkaW8gbWlzbWF0Y2giKTsKKyAgICAgICAgICAgIHByZWVtdGVkQ2xpZW50ID0gb2xkZXN0QXVkaW87CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYWxsb2NhdGVkQXVkaW8gKyBhbGxvY2F0ZWRUdW5lcnMgPj0gbVByb3BlcnRpZXMubnVtX3R1bmVycykgeworICAgICAgICAgICAgaWYgKGFsbG9jYXRlZFR1bmVycyAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQob2xkZXN0VHVuZXIgIT0gMCwgImFkZENsaWVudCgpIGFsbG9jYXRlZFR1bmVycy9vbGRlc3RUdW5lciBtaXNtYXRjaCIpOworICAgICAgICAgICAgICAgIHByZWVtdGVkQ2xpZW50ID0gb2xkZXN0VHVuZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKG9sZGVzdEF1ZGlvICE9IDAsICJhZGRDbGllbnQoKSBhbGxvY2F0ZWRBdWRpby9vbGRlc3RBdWRpbyBtaXNtYXRjaCIpOworICAgICAgICAgICAgICAgIHByZWVtdGVkQ2xpZW50ID0gb2xkZXN0QXVkaW87CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHByZWVtdGVkQ2xpZW50ICE9IDApIHsKKyAgICAgICAgaGFsVHVuZXIgPSBwcmVlbXRlZENsaWVudC0+Z2V0VHVuZXIoKTsKKyAgICAgICAgcHJlZW10ZWRDbGllbnQtPnNldFR1bmVyKE5VTEwpOworICAgICAgICBtSHdEZXZpY2UtPmNsb3NlX3R1bmVyKG1Id0RldmljZSwgaGFsVHVuZXIpOworICAgICAgICBpZiAocHJlZW10ZWRDbGllbnQtPmF1ZGlvKCkpIHsKKyAgICAgICAgICAgIG5vdGlmeURldmljZUNvbm5lY3Rpb24oZmFsc2UsICIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldCA9IG1Id0RldmljZS0+b3Blbl90dW5lcihtSHdEZXZpY2UsICZoYWxDb25maWcsIGF1ZGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWRpb1NlcnZpY2U6OmNhbGxiYWNrLCBtb2R1bGVDbGllbnQtPmNhbGxiYWNrVGhyZWFkKCkuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYWxUdW5lcik7CisgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgIEFMT0dWKCJhZGRDbGllbnQoKSBzZXRUdW5lciAlcCIsIGhhbFR1bmVyKTsKKyAgICAgICAgbW9kdWxlQ2xpZW50LT5zZXRUdW5lcihoYWxUdW5lcik7CisgICAgICAgIG1Nb2R1bGVDbGllbnRzLmFkZChtb2R1bGVDbGllbnQpOworICAgICAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgICAgIG5vdGlmeURldmljZUNvbm5lY3Rpb24odHJ1ZSwgIiIpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJhZGRDbGllbnQoKSBET05FIG1vZHVsZUNsaWVudCAlcCIsIG1vZHVsZUNsaWVudC5nZXQoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coIiVzIG9wZW5fdHVuZXIgZmFpbGVkIHdpdGggZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHJldCk7CisgICAgICAgIG1vZHVsZUNsaWVudC5jbGVhcigpOworICAgIH0KKworICAgIHJldHVybiBtb2R1bGVDbGllbnQ7Cit9CisKK3ZvaWQgUmFkaW9TZXJ2aWNlOjpNb2R1bGU6OnJlbW92ZUNsaWVudChjb25zdCBzcDxNb2R1bGVDbGllbnQ+JiBtb2R1bGVDbGllbnQpIHsKKyAgICBBTE9HVigicmVtb3ZlQ2xpZW50KCkiKTsKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgaW50IHJldDsKKyAgICBzc2l6ZV90IGluZGV4ID0gLTE7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2R1bGVDbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtTW9kdWxlQ2xpZW50c1tpXSA9PSBtb2R1bGVDbGllbnQpIHsKKyAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbmRleCA9PSAtMSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbU1vZHVsZUNsaWVudHMucmVtb3ZlQXQoaW5kZXgpOworICAgIGNvbnN0IHN0cnVjdCByYWRpb190dW5lciAqaGFsVHVuZXIgPSBtb2R1bGVDbGllbnQtPmdldFR1bmVyKCk7CisgICAgaWYgKGhhbFR1bmVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1Id0RldmljZS0+Y2xvc2VfdHVuZXIobUh3RGV2aWNlLCBoYWxUdW5lcik7CisgICAgaWYgKG1vZHVsZUNsaWVudC0+YXVkaW8oKSkgeworICAgICAgICBub3RpZnlEZXZpY2VDb25uZWN0aW9uKGZhbHNlLCAiIik7CisgICAgfQorCisgICAgbU11dGUgPSB0cnVlOworCisgICAgaWYgKG1Nb2R1bGVDbGllbnRzLmlzRW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVHVuZXIgcmVhbGxvY2F0aW9uIGxvZ2ljOgorICAgIC8vIFdoZW4gYSBjbGllbnQgaXMgcmVtb3ZlZCBhbmQgd2FzIGNvbnRyb2xsaW5nIGEgdHVuZXIsIHRoaXMgdHVuZXIgd2lsbCBiZSBhbGxvY2F0ZWQgdG8gYQorICAgIC8vIHByZXZpb3VzbHkgcHJlZW1wdGVkIGNsaWVudC4gVGhpcyBjbGllbnQgd2lsbCBiZSBub3RpZmllZCBieSBhIGNhbGxiYWNrIHdpdGgKKyAgICAvLyBSQURJT19FVkVOVF9DT05UUk9MIGluZGljYXRpbmcgZ2FpbiBvZiBjb250cm9sLgorICAgIC8vIC0gSWYgYSBwcmVlbXB0ZWQgY2xpZW50IGlzIHdhaXRpbmcgZm9yIGFuIGF1ZGlvIHNvdXJjZSBhbmQgb25lIGJlY29tZXMgYXZhaWxhYmxlOgorICAgIC8vICAgIEFsbG9jYXRlIHRoZSB0dW5lciB0byB0aGUgbW9zdCByZWNlbnRseSBhZGRlZCBjbGllbnQgd2FpdGluZyBmb3IgYW4gYXVkaW8gc291cmNlCisgICAgLy8gLSBJZiBub3Q6CisgICAgLy8gICAgQWxsb2NhdGUgdGhlIHR1bmVyIHRvIHRoZSBtb3N0IHJlY2VudGx5IGFkZGVkIGNsaWVudC4KKyAgICAvLyBFYWNoIHRpbWUgYSB0dW5lciB1c2luZyB0aGUgYXVkaW8gc291cmNlIGlzIG9wZW5lZCBvciBjbG9zZWQsIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBpcworICAgIC8vIG5vdGlmaWVkIG9mIHRoZSBjb25uZWN0aW9uIG9yIGRpc2Nvbm5lY3Rpb24gb2YgQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSLgorCisgICAgc3A8TW9kdWxlQ2xpZW50PiB5b3VuZ2VzdENsaWVudDsKKyAgICBzcDxNb2R1bGVDbGllbnQ+IHlvdW5nZXN0Q2xpZW50QXVkaW87CisgICAgc2l6ZV90IGFsbG9jYXRlZFR1bmVycyA9IDA7CisgICAgc2l6ZV90IGFsbG9jYXRlZEF1ZGlvID0gMDsKKyAgICBmb3IgKHNzaXplX3QgaSA9IG1Nb2R1bGVDbGllbnRzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGlmIChtTW9kdWxlQ2xpZW50c1tpXS0+Z2V0VHVuZXIoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAobU1vZHVsZUNsaWVudHNbaV0tPmF1ZGlvKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoeW91bmdlc3RDbGllbnRBdWRpbyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHlvdW5nZXN0Q2xpZW50QXVkaW8gPSBtTW9kdWxlQ2xpZW50c1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICh5b3VuZ2VzdENsaWVudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHlvdW5nZXN0Q2xpZW50ID0gbU1vZHVsZUNsaWVudHNbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1Nb2R1bGVDbGllbnRzW2ldLT5hdWRpbygpKSB7CisgICAgICAgICAgICAgICAgYWxsb2NhdGVkQXVkaW8rKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWxsb2NhdGVkVHVuZXJzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HX0FTU0VSVChhbGxvY2F0ZWRUdW5lcnMgKyBhbGxvY2F0ZWRBdWRpbyA8IG1Qcm9wZXJ0aWVzLm51bV90dW5lcnMsCisgICAgICAgICAgICAgICAgInJlbW92ZUNsaWVudCgpIHJlbW92ZWQgY2xpZW50IGJ1dCBubyB0dW5lciBhdmFpbGFibGUiKTsKKworICAgIEFMT0dfQVNTRVJUKCFtb2R1bGVDbGllbnQtPmF1ZGlvKCkgfHwgYWxsb2NhdGVkQXVkaW8gPCBtUHJvcGVydGllcy5udW1fYXVkaW9fc291cmNlcywKKyAgICAgICAgICAgICAgICAicmVtb3ZlQ2xpZW50KCkgcmVtb3ZlZCBhdWRpbyBjbGllbnQgYnV0IG5vIHR1bmVyIHdpdGggYXVkaW8gYXZhaWxhYmxlIik7CisKKyAgICBpZiAoYWxsb2NhdGVkQXVkaW8gPCBtUHJvcGVydGllcy5udW1fYXVkaW9fc291cmNlcyAmJiB5b3VuZ2VzdENsaWVudEF1ZGlvICE9IDApIHsKKyAgICAgICAgeW91bmdlc3RDbGllbnQgPSB5b3VuZ2VzdENsaWVudEF1ZGlvOworICAgIH0KKworICAgIEFMT0dfQVNTRVJUKHlvdW5nZXN0Q2xpZW50ICE9IDAsICJyZW1vdmVDbGllbnQoKSByZW1vdmVkIGNsaWVudCBubyBjYW5kaWRhdGUgZm91bmQgZm9yIHR1bmVyIik7CisKKyAgICBzdHJ1Y3QgcmFkaW9faGFsX2JhbmRfY29uZmlnIGhhbENvbmZpZyA9IHlvdW5nZXN0Q2xpZW50LT5oYWxDb25maWcoKTsKKyAgICByZXQgPSBtSHdEZXZpY2UtPm9wZW5fdHVuZXIobUh3RGV2aWNlLCAmaGFsQ29uZmlnLCB5b3VuZ2VzdENsaWVudC0+YXVkaW8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFkaW9TZXJ2aWNlOjpjYWxsYmFjaywgbW9kdWxlQ2xpZW50LT5jYWxsYmFja1RocmVhZCgpLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFsVHVuZXIpOworCisgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgIHlvdW5nZXN0Q2xpZW50LT5zZXRUdW5lcihoYWxUdW5lcik7CisgICAgICAgIGlmICh5b3VuZ2VzdENsaWVudC0+YXVkaW8oKSkgeworICAgICAgICAgICAgbm90aWZ5RGV2aWNlQ29ubmVjdGlvbih0cnVlLCAiIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlOjpzZXRNdXRlKGJvb2wgbXV0ZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtdXRlICE9IG1NdXRlKSB7CisgICAgICAgIG1NdXRlID0gbXV0ZTsKKyAgICAgICAgLy9UT0RPIG5vdGlmaWZ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyIG9mIG1lZGlhIGFjdGl2aXR5IG9uIHJhZGlvIGF1ZGlvIGRldmljZQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlOjpnZXRNdXRlKGJvb2wgKm11dGUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAqbXV0ZSA9IG1NdXRlOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCitjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKlJhZGlvU2VydmljZTo6TW9kdWxlOjpnZXREZWZhdWx0Q29uZmlnKCkgY29uc3QKK3sKKyAgICBpZiAobVByb3BlcnRpZXMubnVtX2JhbmRzID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAmbVByb3BlcnRpZXMuYmFuZHNbMF07Cit9CisKK3ZvaWQgUmFkaW9TZXJ2aWNlOjpNb2R1bGU6Om5vdGlmeURldmljZUNvbm5lY3Rpb24oYm9vbCBjb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MpIHsKKyAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICBBdWRpb1N5c3RlbTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA/IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsIGtSYWRpb1R1bmVyQXVkaW9EZXZpY2VOYW1lKTsKKyAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKK30KKworI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQiCisKK1JhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpNb2R1bGVDbGllbnQoY29uc3Qgc3A8TW9kdWxlPiYgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJUmFkaW9DbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1ZGlvKQorIDogbU1vZHVsZShtb2R1bGUpLCBtQ2xpZW50KGNsaWVudCksIG1Db25maWcoKmNvbmZpZyksIG1BdWRpbyhhdWRpbyksIG1UdW5lcihOVUxMKQoreworfQorCit2b2lkIFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpvbkZpcnN0UmVmKCkKK3sKKyAgICBtQ2FsbGJhY2tUaHJlYWQgPSBuZXcgQ2FsbGJhY2tUaHJlYWQodGhpcyk7CisgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUNsaWVudCktPmxpbmtUb0RlYXRoKHRoaXMpOworfQorCitSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6fk1vZHVsZUNsaWVudCgpIHsKKyAgICBpZiAobUNsaWVudCAhPSAwKSB7CisgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1DbGllbnQpLT51bmxpbmtUb0RlYXRoKHRoaXMpOworICAgICAgICBtQ2xpZW50LmNsZWFyKCk7CisgICAgfQorICAgIGlmIChtQ2FsbGJhY2tUaHJlYWQgIT0gMCkgeworICAgICAgICBtQ2FsbGJhY2tUaHJlYWQtPmV4aXQoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpkdW1wKGludCBmZCBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpIHsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmRldGFjaCgpIHsKKyAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIHNwPE1vZHVsZUNsaWVudD4gc3Ryb25nTWUgPSB0aGlzOworICAgIHsKKyAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgICAgICBpZiAobUNsaWVudCAhPSAwKSB7CisgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQ2xpZW50KS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICAgICAgICAgIG1DbGllbnQuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzcDxNb2R1bGU+IG1vZHVsZSA9IG1Nb2R1bGUucHJvbW90ZSgpOworICAgIGlmIChtb2R1bGUgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1vZHVsZS0+cmVtb3ZlQ2xpZW50KHRoaXMpOworfQorCityYWRpb19oYWxfYmFuZF9jb25maWdfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6aGFsQ29uZmlnKCkgY29uc3QKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIG1Db25maWcuYmFuZDsKK30KKworY29uc3Qgc3RydWN0IHJhZGlvX3R1bmVyICpSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6Z2V0VHVuZXIoKSBjb25zdAoreworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gbVR1bmVyOworfQorCit2b2lkIFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpzZXRUdW5lcihjb25zdCBzdHJ1Y3QgcmFkaW9fdHVuZXIgKnR1bmVyKQoreworICAgIEFMT0dWKCIlcyAlcCIsIF9fRlVOQ1RJT05fXywgdGhpcyk7CisKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgbVR1bmVyID0gdHVuZXI7CisgICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICByYWRpb19oYWxfZXZlbnRfdCBldmVudDsKKyAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfQ09OVFJPTDsKKyAgICBldmVudC5zdGF0dXMgPSAwOworICAgIGV2ZW50Lm9uID0gbVR1bmVyICE9IE5VTEw7CisgICAgbUNhbGxiYWNrVGhyZWFkLT5zZW5kRXZlbnQoJmV2ZW50KTsKKyAgICBBTE9HVigiJXMgRE9ORSIsIF9fRlVOQ1RJT05fXyk7CisKK30KKworc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OnNldENvbmZpZ3VyYXRpb24oY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpCit7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOworCisgICAgaWYgKG1UdW5lciAhPSBOVUxMKSB7CisgICAgICAgIHN0cnVjdCByYWRpb19oYWxfYmFuZF9jb25maWcgaGFsQ29uZmlnOworICAgICAgICBoYWxDb25maWcgPSBjb25maWctPmJhbmQ7CisgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdCltVHVuZXItPnNldF9jb25maWd1cmF0aW9uKG1UdW5lciwgJmhhbENvbmZpZyk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1Db25maWcgPSAqY29uZmlnOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUNvbmZpZyA9ICpjb25maWc7CisgICAgICAgIHN0YXR1cyA9PSBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6Z2V0Q29uZmlndXJhdGlvbihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZykKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICBpZiAobVR1bmVyICE9IE5VTEwpIHsKKyAgICAgICAgc3RydWN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZyBoYWxDb25maWc7CisgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdCltVHVuZXItPmdldF9jb25maWd1cmF0aW9uKG1UdW5lciwgJmhhbENvbmZpZyk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1Db25maWcuYmFuZCA9IGhhbENvbmZpZzsKKyAgICAgICAgfQorICAgIH0KKyAgICAqY29uZmlnID0gbUNvbmZpZzsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpzZXRNdXRlKGJvb2wgbXV0ZSkKK3sKKyAgICBzcDxNb2R1bGU+IG1vZHVsZTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBpZiAobVR1bmVyID09IE5VTEwgfHwgIW1BdWRpbykgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIG1vZHVsZSA9IG1Nb2R1bGUucHJvbW90ZSgpOworICAgICAgICBpZiAobW9kdWxlID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgfQorICAgIG1vZHVsZS0+c2V0TXV0ZShtdXRlKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpnZXRNdXRlKGJvb2wgKm11dGUpCit7CisgICAgc3A8TW9kdWxlPiBtb2R1bGU7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgbW9kdWxlID0gbU1vZHVsZS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChtb2R1bGUgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1vZHVsZS0+Z2V0TXV0ZShtdXRlKTsKK30KKworc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OnNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKQoreworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKG1UdW5lciAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdCltVHVuZXItPnNjYW4obVR1bmVyLCBkaXJlY3Rpb24sIHNraXBTdWJDaGFubmVsKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OnN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKQoreworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKG1UdW5lciAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdCltVHVuZXItPnN0ZXAobVR1bmVyLCBkaXJlY3Rpb24sIHNraXBTdWJDaGFubmVsKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OnR1bmUodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBzdWJDaGFubmVsKQoreworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKG1UdW5lciAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdCltVHVuZXItPnR1bmUobVR1bmVyLCBjaGFubmVsLCBzdWJDaGFubmVsKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmNhbmNlbCgpCit7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAobVR1bmVyICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KW1UdW5lci0+Y2FuY2VsKG1UdW5lcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpnZXRQcm9ncmFtSW5mb3JtYXRpb24oc3RydWN0IHJhZGlvX3Byb2dyYW1faW5mbyAqaW5mbykKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmIChtVHVuZXIgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpbVR1bmVyLT5nZXRfcHJvZ3JhbV9pbmZvcm1hdGlvbihtVHVuZXIsIGluZm8pOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6aGFzQ29udHJvbChib29sICpoYXNDb250cm9sKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKKyAgICAqaGFzQ29udHJvbCA9IG1UdW5lciAhPSBOVUxMOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6b25DYWxsYmFja0V2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkKK3sKKyAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCB8fCBldmVudE1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPElSYWRpb0NsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgICAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmFkaW9fZXZlbnRfdCAqZXZlbnQgPSAocmFkaW9fZXZlbnRfdCAqKWV2ZW50TWVtb3J5LT5wb2ludGVyKCk7CisgICAgICAgIHN3aXRjaCAoZXZlbnQtPnR5cGUpIHsKKyAgICAgICAgY2FzZSBSQURJT19FVkVOVF9DT05GSUc6CisgICAgICAgICAgICBtQ29uZmlnLmJhbmQgPSBldmVudC0+Y29uZmlnLmJhbmQ7CisgICAgICAgICAgICBldmVudC0+Y29uZmlnLnJlZ2lvbiA9IG1Db25maWcucmVnaW9uOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNsaWVudCA9IG1DbGllbnQ7CisgICAgfQorICAgIGlmIChjbGllbnQgIT0gMCkgeworICAgICAgICBjbGllbnQtPm9uRXZlbnQoZXZlbnRNZW1vcnkpOworICAgIH0KK30KKworCit2b2lkIFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpiaW5kZXJEaWVkKAorICAgIGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8gX191bnVzZWQpIHsKKyAgICBBTE9HVygiY2xpZW50IGJpbmRlciBkaWVkIGZvciBjbGllbnQgJXAiLCB0aGlzKTsKKyAgICBkZXRhY2goKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvU2VydmljZS5oIGIvc2VydmljZXMvcmFkaW8vUmFkaW9TZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmZWRhNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3JhZGlvL1JhZGlvU2VydmljZS5oCkBAIC0wLDAgKzEsMjExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1JBRElPX1NFUlZJQ0VfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1JBRElPX1NFUlZJQ0VfSAorCisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisvLyNpbmNsdWRlIDxiaW5kZXIvQXBwT3BzTWFuYWdlci5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JQXBwT3BzQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxyYWRpby9JUmFkaW9TZXJ2aWNlLmg+CisjaW5jbHVkZSA8cmFkaW8vSVJhZGlvLmg+CisjaW5jbHVkZSA8cmFkaW8vSVJhZGlvQ2xpZW50Lmg+CisjaW5jbHVkZSA8c3lzdGVtL3JhZGlvLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvcmFkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZW1vcnlIZWFwQmFzZTsKKworY2xhc3MgUmFkaW9TZXJ2aWNlIDoKKyAgICBwdWJsaWMgQmluZGVyU2VydmljZTxSYWRpb1NlcnZpY2U+LAorICAgIHB1YmxpYyBCblJhZGlvU2VydmljZQoreworICAgIGZyaWVuZCBjbGFzcyBCaW5kZXJTZXJ2aWNlPFJhZGlvU2VydmljZT47CisKK3B1YmxpYzoKKyAgICBjbGFzcyBNb2R1bGVDbGllbnQ7CisgICAgY2xhc3MgTW9kdWxlOworCisgICAgc3RhdGljIGNoYXIgY29uc3QqIGdldFNlcnZpY2VOYW1lKCkgeyByZXR1cm4gIm1lZGlhLnJhZGlvIjsgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBSYWRpb1NlcnZpY2UoKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5SYWRpb1NlcnZpY2UoKTsKKworICAgIC8vIElSYWRpb1NlcnZpY2UKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RNb2R1bGVzKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBhdHRhY2gocmFkaW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElSYWRpb0NsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdpdGhBdWRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJUmFkaW8+JiByYWRpbyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKworCisgICAgY2xhc3MgTW9kdWxlIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSB7CisgICAgcHVibGljOgorCisgICAgICAgTW9kdWxlKHJhZGlvX2h3X2RldmljZSogaHdEZXZpY2UsCisgICAgICAgICAgICAgIHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzIHByb3BlcnRpZXMpOworCisgICAgICAgdmlydHVhbCB+TW9kdWxlKCk7CisKKyAgICAgICAgICAgICAgIHNwPE1vZHVsZUNsaWVudD4gYWRkQ2xpZW50KGNvbnN0IHNwPElSYWRpb0NsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1ZGlvKTsKKworICAgICAgICAgICAgICAgdm9pZCByZW1vdmVDbGllbnQoY29uc3Qgc3A8TW9kdWxlQ2xpZW50PiYgbW9kdWxlQ2xpZW50KTsKKworICAgICAgICAgICAgICAgc3RhdHVzX3Qgc2V0TXV0ZShib29sIG11dGUpOworCisgICAgICAgICAgICAgICBzdGF0dXNfdCBnZXRNdXRlKGJvb2wgKm11dGUpOworCisgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisKKyAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9faHdfZGV2aWNlICpod0RldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1Id0RldmljZTsgfQorICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzIHByb3BlcnRpZXMoKSBjb25zdCB7IHJldHVybiBtUHJvcGVydGllczsgfQorICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqZ2V0RGVmYXVsdENvbmZpZygpIGNvbnN0IDsKKworICAgIHByaXZhdGU6CisKKyAgICAgICB2b2lkIG5vdGlmeURldmljZUNvbm5lY3Rpb24oYm9vbCBjb25uZWN0ZWQsIGNvbnN0IGNoYXIgKmFkZHJlc3MpOworCisgICAgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOyAgICAgICAgICAvLyBwcm90ZWN0cyAgbU1vZHVsZUNsaWVudHMKKyAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2h3X2RldmljZSAgKm1Id0RldmljZTsgICAgIC8vIEhBTCBoYXJkd2FyZSBkZXZpY2UKKyAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgbVByb3BlcnRpZXM7ICAgIC8vIGNhY2hlZCBoYXJkd2FyZSBtb2R1bGUgcHJvcGVydGllcworICAgICAgICBWZWN0b3I8IHNwPE1vZHVsZUNsaWVudD4gPiAgICBtTW9kdWxlQ2xpZW50czsgLy8gbGlzdCBvZiBhdHRhY2hlZCBjbGllbnRzCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIG1NdXRlOyAgICAgICAgICAvLyByYWRpbyBhdWRpbyBzb3VyY2Ugc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdW5tdXRlZCwgYXVkaW8gaXMgcm91dGVkIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0cHV0IGRldmljZSBzZWxlY3RlZCBmb3IgbWVkaWEgdXNlIGNhc2UuCisgICAgfTsgLy8gY2xhc3MgTW9kdWxlCisKKyAgICBjbGFzcyBDYWxsYmFja1RocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworICAgIHB1YmxpYzoKKworICAgICAgICBDYWxsYmFja1RocmVhZChjb25zdCB3cDxNb2R1bGVDbGllbnQ+JiBtb2R1bGVDbGllbnQpOworCisgICAgICAgIHZpcnR1YWwgfkNhbGxiYWNrVGhyZWFkKCk7CisKKworICAgICAgICAvLyBUaHJlYWQgdmlydHVhbHMKKyAgICAgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKTsKKworICAgICAgICAvLyBSZWZCYXNlCisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkZpcnN0UmVmKCk7CisKKyAgICAgICAgICAgICAgICB2b2lkIGV4aXQoKTsKKworICAgICAgICAgICAgICAgIHZvaWQgc2VuZEV2ZW50KHJhZGlvX2hhbF9ldmVudF90ICpoYWxFdmVudCk7CisgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4gcHJlcGFyZUV2ZW50KHJhZGlvX2hhbF9ldmVudF90ICpoYWxFdmVudCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICB3cDxNb2R1bGVDbGllbnQ+ICAgICAgbU1vZHVsZUNsaWVudDsgICAgLy8gY2xpZW50IG1vZHVsZSB0aGUgdGhyZWFkIGJlbG9uZ3MgdG8KKyAgICAgICAgQ29uZGl0aW9uICAgICAgICAgICAgIG1DYWxsYmFja0NvbmQ7ICAgIC8vIGNvbmRpdGlvbiBzaWduYWxlZCB3aGVuIGEgbmV3IGV2ZW50IGlzIHBvc3RlZAorICAgICAgICBNdXRleCAgICAgICAgICAgICAgICAgbUNhbGxiYWNrTG9jazsgICAgLy8gcHJvdGVjdHMgbUV2ZW50UXVldWUKKyAgICAgICAgVmVjdG9yPCBzcDxJTWVtb3J5PiA+IG1FdmVudFF1ZXVlOyAgICAgIC8vIHBlbmRpbmcgY2FsbGJhY2sgZXZlbnRzCisgICAgICAgIHNwPE1lbW9yeURlYWxlcj4gICAgICBtTWVtb3J5RGVhbGVyOyAgICAvLyBzaGFyZWQgbWVtb3J5IGZvciBjYWxsYmFjayBldmVudAorICAgIH07IC8vIGNsYXNzIENhbGxiYWNrVGhyZWFkCisKKyAgICBjbGFzcyBNb2R1bGVDbGllbnQgOiBwdWJsaWMgQm5SYWRpbywKKyAgICAgICAgICAgICAgICAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgeworICAgIHB1YmxpYzoKKworICAgICAgIE1vZHVsZUNsaWVudChjb25zdCBzcDxNb2R1bGU+JiBtb2R1bGUsCisgICAgICAgICAgICAgIGNvbnN0IHNwPElSYWRpb0NsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgIGJvb2wgYXVkaW8pOworCisgICAgICAgdmlydHVhbCB+TW9kdWxlQ2xpZW50KCk7CisKKyAgICAgICAvLyBJUmFkaW8KKyAgICAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCk7CisKKyAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldENvbmZpZ3VyYXRpb24oY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpOworCisgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDb25maWd1cmF0aW9uKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKTsKKworICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TXV0ZShib29sIG11dGUpOworCisgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNdXRlKGJvb2wgKm11dGUpOworCisgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzY2FuKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViQ2hhbm5lbCk7CisKKyAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKTsKKworICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdHVuZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHN1YkNoYW5uZWwpOworCisgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjYW5jZWwoKTsKKworICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvZ3JhbUluZm9ybWF0aW9uKHN0cnVjdCByYWRpb19wcm9ncmFtX2luZm8gKmluZm8pOworCisgICAgICAgdmlydHVhbCBzdGF0dXNfdCBoYXNDb250cm9sKGJvb2wgKmhhc0NvbnRyb2wpOworCisgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisKKyAgICAgICAgICAgICAgIHNwPElSYWRpb0NsaWVudD4gY2xpZW50KCkgY29uc3QgeyByZXR1cm4gbUNsaWVudDsgfQorICAgICAgICAgICAgICAgd3A8TW9kdWxlPiBtb2R1bGUoKSBjb25zdCB7IHJldHVybiBtTW9kdWxlOyB9CisgICAgICAgICAgICAgICByYWRpb19oYWxfYmFuZF9jb25maWdfdCBoYWxDb25maWcoKSBjb25zdDsKKyAgICAgICAgICAgICAgIHNwPENhbGxiYWNrVGhyZWFkPiBjYWxsYmFja1RocmVhZCgpIGNvbnN0IHsgcmV0dXJuIG1DYWxsYmFja1RocmVhZDsgfQorICAgICAgICAgICAgICAgdm9pZCBzZXRUdW5lcihjb25zdCBzdHJ1Y3QgcmFkaW9fdHVuZXIgKnR1bmVyKTsKKyAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb190dW5lciAqZ2V0VHVuZXIoKSBjb25zdDsKKyAgICAgICAgICAgICAgIGJvb2wgYXVkaW8oKSBjb25zdCB7IHJldHVybiBtQXVkaW87IH0KKworICAgICAgICAgICAgICAgdm9pZCBvbkNhbGxiYWNrRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50KTsKKworICAgICAgIHZpcnR1YWwgdm9pZCBvbkZpcnN0UmVmKCk7CisKKworICAgICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IGltcGxlbWVudGF0aW9uCisgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pOworCisgICAgcHJpdmF0ZToKKworICAgICAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICAgICAgbUxvY2s7ICAgICAgICAgICAvLyBwcm90ZWN0cyBtQ2xpZW50LCBtQ29uZmlnIGFuZCBtVHVuZXIKKyAgICAgICAgd3A8TW9kdWxlPiAgICAgICAgICAgICAgICAgIG1Nb2R1bGU7ICAgICAgICAgLy8gVGhlIG1vZHVsZSB0aGlzIGNsaWVudCBpcyBhdHRhY2hlZCB0bworICAgICAgICBzcDxJUmFkaW9DbGllbnQ+ICAgICAgICAgICAgbUNsaWVudDsgICAgICAgICAvLyBldmVudCBjYWxsYmFjayBiaW5kZXIgaW50ZXJmYWNlCisgICAgICAgIHJhZGlvX2JhbmRfY29uZmlnX3QgICAgICAgICBtQ29uZmlnOyAgICAgICAgIC8vIGN1cnJlbnQgYmFuZCBjb25maWd1cmF0aW9uCisgICAgICAgIHNwPENhbGxiYWNrVGhyZWFkPiAgICAgICAgICBtQ2FsbGJhY2tUaHJlYWQ7IC8vIGV2ZW50IGNhbGxiYWNrIHRocmVhZAorICAgICAgICBjb25zdCBib29sICAgICAgICAgICAgICAgICAgbUF1ZGlvOworICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fdHVuZXIgICAgKm1UdW5lcjsgICAgICAgIC8vIEhBTCB0dW5lciBpbnRlcmZhY2UuIE5VTEwgaW5kaWNhdGVzIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNsaWVudCBkb2VzIG5vdCBoYXZlIGNvbnRyb2wgb24gYW55CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHVuZXIKKyAgICB9OyAvLyBjbGFzcyBNb2R1bGVDbGllbnQKKworCisgICAgc3RhdGljIHZvaWQgY2FsbGJhY2socmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50LCB2b2lkICpjb29raWUpOworCitwcml2YXRlOgorCisgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKTsKKworICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRQcm9wZXJ0aWVzKHJhZGlvX3Byb3BlcnRpZXNfdCAqcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYWRpb19oYWxfcHJvcGVydGllc190ICpoYWxQcm9wZXJ0aWVzKTsKKyAgICBNdXRleCAgICAgICAgICAgICAgIG1TZXJ2aWNlTG9jazsgICAvLyBwcm90ZWN0cyBtTW9kdWxlcworICAgIHZvbGF0aWxlIGludDMyX3QgICAgbU5leHRVbmlxdWVJZDsgIC8vIGZvciBtb2R1bGUgSUQgYWxsb2NhdGlvbgorICAgIERlZmF1bHRLZXllZFZlY3RvcjwgcmFkaW9faGFuZGxlX3QsIHNwPE1vZHVsZT4gPiBtTW9kdWxlczsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfUkFESU9fU0VSVklDRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCmluZGV4IDA4MWFmZjcuLjlkZTZmZTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCkBAIC03ODcsNiArNzg3LDcgQEAKICAgICAgICAgICAgICAgICBtSHdEZXZpY2UtPnN0b3BfcmVjb2duaXRpb24obUh3RGV2aWNlLCBtb2RlbC0+bUhhbmRsZSk7CiAgICAgICAgICAgICAgICAgLy8ga2VlcCBtb2RlbCBpbiBBQ1RJVkUgc3RhdGUgc28gdGhhdCBldmVudCBpcyBwcm9jZXNzZWQgYnkgb25DYWxsYmFja0V2ZW50KCkKICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9waHJhc2VfcmVjb2duaXRpb25fZXZlbnQgcGhyYXNlRXZlbnQ7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZwaHJhc2VFdmVudCwgMCwgc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3BocmFzZV9yZWNvZ25pdGlvbl9ldmVudCkpOwogICAgICAgICAgICAgICAgIHN3aXRjaCAobW9kZWwtPm1UeXBlKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NT0RFTF9UWVBFX0tFWVBIUkFTRToKICAgICAgICAgICAgICAgICAgICAgcGhyYXNlRXZlbnQubnVtX3BocmFzZXMgPSBtb2RlbC0+bUNvbmZpZy5udW1fcGhyYXNlczsKZGlmZiAtLWdpdCBhL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcCBiL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcAppbmRleCA3NWY2OGI4Li5lMTRhNzcxIDEwMDY0NAotLS0gYS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKKysrIGIvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCkBAIC00MCw2ICs0MCw4IEBACiAgICAgU0VUX0NBUFRVUkVfU1RBVEUsCiB9OwogCisjZGVmaW5lIE1BWF9JVEVNU19QRVJfTElTVCAxMDI0CisKIGNsYXNzIEJwU291bmRUcmlnZ2VySHdTZXJ2aWNlOiBwdWJsaWMgQnBJbnRlcmZhY2U8SVNvdW5kVHJpZ2dlckh3U2VydmljZT4KIHsKIHB1YmxpYzoKQEAgLTExNiwxMCArMTE4LDE4IEBACiAgICAgICAgIGNhc2UgTElTVF9NT0RVTEVTOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNvdW5kVHJpZ2dlckh3U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bU1vZHVsZXNSZXEgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaWYgKG51bU1vZHVsZXNSZXEgPiBNQVhfSVRFTVNfUEVSX0xJU1QpIHsKKyAgICAgICAgICAgICAgICBudW1Nb2R1bGVzUmVxID0gTUFYX0lURU1TX1BFUl9MSVNUOworICAgICAgICAgICAgfQogICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bU1vZHVsZXMgPSBudW1Nb2R1bGVzUmVxOwogICAgICAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgKm1vZHVsZXMgPQogICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgKiljYWxsb2MobnVtTW9kdWxlc1JlcSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvcikpOworICAgICAgICAgICAgaWYgKG1vZHVsZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE5PX01FTU9SWSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbGlzdE1vZHVsZXMobW9kdWxlcywgJm51bU1vZHVsZXMpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG51bU1vZHVsZXMpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVzYW1wbGVyX3Rvb2xzL0FuZHJvaWQubWsgYi90b29scy9yZXNhbXBsZXJfdG9vbHMvQW5kcm9pZC5tawppbmRleCBlOGNiZTM5Li5iNThlNGNkIDEwMDY0NAotLS0gYS90b29scy9yZXNhbXBsZXJfdG9vbHMvQW5kcm9pZC5taworKysgYi90b29scy9yZXNhbXBsZXJfdG9vbHMvQW5kcm9pZC5tawpAQCAtMSw2ICsxLDYgQEAKICMgQ29weXJpZ2h0IDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogIwotIyBBbmRyb2lkLm1rIGZvciByZXNhbXBsZXJfdG9vbHMgCisjIEFuZHJvaWQubWsgZm9yIHJlc2FtcGxlcl90b29scwogIwogCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Jlc2FtcGxlcl90b29scy9maXIuY3BwIGIvdG9vbHMvcmVzYW1wbGVyX3Rvb2xzL2Zpci5jcHAKaW5kZXggNjJlZGRjYS4uZmU0ZDIxMiAxMDA2NDQKLS0tIGEvdG9vbHMvcmVzYW1wbGVyX3Rvb2xzL2Zpci5jcHAKKysrIGIvdG9vbHMvcmVzYW1wbGVyX3Rvb2xzL2Zpci5jcHAKQEAgLTY2LDE5ICs2NiwyMCBAQAogCiBzdGF0aWMgdm9pZCB1c2FnZShjaGFyKiBuYW1lKSB7CiAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAidXNhZ2U6ICVzIFstaF0gWy1kXSBbLXMgc2FtcGxlX3JhdGVdIFstYyBjdXQtb2ZmX2ZyZXF1ZW5jeV0gWy1uIGhhbGZfemVyb19jcm9zc2luZ3NdIgorICAgICAgICAgICAgInVzYWdlOiAlcyBbLWhdIFstZF0gWy1EXSBbLXMgc2FtcGxlX3JhdGVdIFstYyBjdXQtb2ZmX2ZyZXF1ZW5jeV0gWy1uIGhhbGZfemVyb19jcm9zc2luZ3NdIgogICAgICAgICAgICAgIiBbLWYge2Zsb2F0fGZpeGVkfGZpeGVkMTZ9XSBbLWIgYmV0YV0gWy12IGRCRlNdIFstbCBsZXJwXVxuIgotICAgICAgICAgICAgIiAgICAgICAlcyBbLWhdIFstZF0gWy1zIHNhbXBsZV9yYXRlXSBbLWMgY3V0LW9mZl9mcmVxdWVuY3ldIFstbiBoYWxmX3plcm9fY3Jvc3NpbmdzXSIKKyAgICAgICAgICAgICIgICAgICAgJXMgWy1oXSBbLWRdIFstRF0gWy1zIHNhbXBsZV9yYXRlXSBbLWMgY3V0LW9mZl9mcmVxdWVuY3ldIFstbiBoYWxmX3plcm9fY3Jvc3NpbmdzXSIKICAgICAgICAgICAgICIgWy1mIHtmbG9hdHxmaXhlZHxmaXhlZDE2fV0gWy1iIGJldGFdIFstdiBkQkZTXSAtcCBNL05cbiIKICAgICAgICAgICAgICIgICAgLWggICAgdGhpcyBoZWxwIG1lc3NhZ2VcbiIKICAgICAgICAgICAgICIgICAgLWQgICAgZGVidWcsIHByaW50IGNvbW1hLXNlcGFyYXRlZCBjb2VmZmljaWVudCB0YWJsZVxuIgorICAgICAgICAgICAgIiAgICAtRCAgICBnZW5lcmF0ZSBleHRyYSBkZWNsYXJhdGlvbnNcbiIKICAgICAgICAgICAgICIgICAgLXAgICAgZ2VuZXJhdGUgcG9seS1waGFzZSBmaWx0ZXIgY29lZmZpY2llbnRzLCB3aXRoIHNhbXBsZSBpbmNyZW1lbnQgTS9OXG4iCiAgICAgICAgICAgICAiICAgIC1zICAgIHNhbXBsZSByYXRlICg0ODAwMClcbiIKICAgICAgICAgICAgICIgICAgLWMgICAgY3V0LW9mZiBmcmVxdWVuY3kgKDIwNDc4KVxuIgogICAgICAgICAgICAgIiAgICAtbiAgICBudW1iZXIgb2YgemVyby1jcm9zc2luZ3Mgb24gb25lIHNpZGUgKDgpXG4iCiAgICAgICAgICAgICAiICAgIC1sICAgIG51bWJlciBvZiBsZXJwaW5nIGJpdHMgKDQpXG4iCiAgICAgICAgICAgICAiICAgIC1tICAgIG51bWJlciBvZiBwb2x5cGhhc2VzIChyZWxhdGVkIHRvIC1sLCBkZWZhdWx0IDE2KVxuIgotICAgICAgICAgICAgIiAgICAtZiAgICBvdXRwdXQgZm9ybWF0LCBjYW4gYmUgZml4ZWQtcG9pbnQgb3IgZmxvYXRpbmctcG9pbnQgKGZpeGVkKVxuIgorICAgICAgICAgICAgIiAgICAtZiAgICBvdXRwdXQgZm9ybWF0LCBjYW4gYmUgZml4ZWQsIGZpeGVkMTYsIG9yIGZsb2F0IChmaXhlZClcbiIKICAgICAgICAgICAgICIgICAgLWIgICAga2Fpc2VyIHdpbmRvdyBwYXJhbWV0ZXIgYmV0YSAoNy44NjUgWy04MGRCXSlcbiIKICAgICAgICAgICAgICIgICAgLXYgICAgYXR0ZW51YXRpb24gaW4gZEJGUyAoMClcbiIsCiAgICAgICAgICAgICBuYW1lLCBuYW1lCkBAIC05Nyw3ICs5OCw4IEBACiAgICAgZG91YmxlIEZzID0gNDgwMDA7CiAgICAgZG91YmxlIEZjID0gMjA0Nzg7CiAgICAgZG91YmxlIGF0dGVuID0gMTsKLSAgICBpbnQgZm9ybWF0ID0gMDsKKyAgICBpbnQgZm9ybWF0ID0gMDsgICAgIC8vIDA9Zml4ZWQsIDE9ZmxvYXQKKyAgICBib29sIGRlY2xhcmF0aW9ucyA9IGZhbHNlOwogCiAgICAgLy8gaW4gb3JkZXIgdG8ga2VlcCB0aGUgZXJyb3JzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluZWFyCiAgICAgLy8gaW50ZXJwb2xhdGlvbiBvZiB0aGUgY29lZmZpY2llbnRzIGJlbG93IHRoZSBxdWFudGl6YXRpb24gZXJyb3IKQEAgLTE1OCwxMSArMTYwLDE0IEBACiAKICAgICBpbnQgTSA9IDEgPDwgNDsgLy8gbnVtYmVyIG9mIHBoYXNlcyBmb3IgaW50ZXJwb2xhdGlvbgogICAgIGludCBjaDsKLSAgICB3aGlsZSAoKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICI6aGRzOmM6bjpmOmw6bTpiOnA6djp6OiIpKSAhPSAtMSkgeworICAgIHdoaWxlICgoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgIjpoZHM6YzpuOmY6bDptOmI6cDp2Ono6RCIpKSAhPSAtMSkgewogICAgICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgICAgICBkZWJ1ZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdEJzoKKyAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnMgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAncCc6CiAgICAgICAgICAgICAgICAgaWYgKHNzY2FuZihvcHRhcmcsICIldS8ldSIsICZwb2x5TSwgJnBvbHlOKSAhPSAyKSB7CiAgICAgICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwpAQCAtMjI1LDI0ICsyMzAsMjYgQEAKICAgICBmb3IgKGludCBpID0gTS0xIDsgaTsgaT4+PTEsIG56KyspOwogICAgIC8vIGdlbmVyYXRlIHRoZSByaWdodCBoYWxmIG9mIHRoZSBmaWx0ZXIKICAgICBpZiAoIWRlYnVnKSB7Ci0gICAgICAgIHByaW50ZigiLy8gY21kLWxpbmU6ICIpOwotICAgICAgICBmb3IgKGludCBpPTEgOyBpPGFyZ2MgOyBpKyspIHsKLSAgICAgICAgICAgIHByaW50ZigiJXMgIiwgYXJndltpXSk7CisgICAgICAgIHByaW50ZigiLy8gY21kLWxpbmU6Iik7CisgICAgICAgIGZvciAoaW50IGk9MCA7IGk8YXJnYyA7IGkrKykgeworICAgICAgICAgICAgcHJpbnRmKCIgJXMiLCBhcmd2W2ldKTsKICAgICAgICAgfQogICAgICAgICBwcmludGYoIlxuIik7Ci0gICAgICAgIGlmICghcG9seXBoYXNlKSB7Ci0gICAgICAgICAgICBwcmludGYoImNvbnN0IGludDMyX3QgUkVTQU1QTEVfRklSX1NJWkUgICAgICAgICAgID0gJWQ7XG4iLCBOKTsKLSAgICAgICAgICAgIHByaW50ZigiY29uc3QgaW50MzJfdCBSRVNBTVBMRV9GSVJfSU5UX1BIQVNFUyAgICAgPSAlZDtcbiIsIE0pOwotICAgICAgICAgICAgcHJpbnRmKCJjb25zdCBpbnQzMl90IFJFU0FNUExFX0ZJUl9OVU1fQ09FRiAgICAgICA9ICVkO1xuIiwgbnpjKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByaW50ZigiY29uc3QgaW50MzJfdCBSRVNBTVBMRV9GSVJfU0laRSAgICAgICAgICAgPSAlZDtcbiIsIDIqbnpjKnBvbHlOKTsKLSAgICAgICAgICAgIHByaW50ZigiY29uc3QgaW50MzJfdCBSRVNBTVBMRV9GSVJfTlVNX0NPRUYgICAgICAgPSAlZDtcbiIsIDIqbnpjKTsKKyAgICAgICAgaWYgKGRlY2xhcmF0aW9ucykgeworICAgICAgICAgICAgaWYgKCFwb2x5cGhhc2UpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoImNvbnN0IGludDMyX3QgUkVTQU1QTEVfRklSX1NJWkUgICAgICAgICAgID0gJWQ7XG4iLCBOKTsKKyAgICAgICAgICAgICAgICBwcmludGYoImNvbnN0IGludDMyX3QgUkVTQU1QTEVfRklSX0lOVF9QSEFTRVMgICAgID0gJWQ7XG4iLCBNKTsKKyAgICAgICAgICAgICAgICBwcmludGYoImNvbnN0IGludDMyX3QgUkVTQU1QTEVfRklSX05VTV9DT0VGICAgICAgID0gJWQ7XG4iLCBuemMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGYoImNvbnN0IGludDMyX3QgUkVTQU1QTEVfRklSX1NJWkUgICAgICAgICAgID0gJWQ7XG4iLCAyKm56Yypwb2x5Tik7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJjb25zdCBpbnQzMl90IFJFU0FNUExFX0ZJUl9OVU1fQ09FRiAgICAgICA9ICVkO1xuIiwgMipuemMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFmb3JtYXQpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoImNvbnN0IGludDMyX3QgUkVTQU1QTEVfRklSX0NPRUZfQklUUyAgICAgID0gJWQ7XG4iLCBuYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgICBwcmludGYoInN0YXRpYyAlcyByZXNhbXBsZUZJUltdID0geyIsICFmb3JtYXQgPyAiaW50MzJfdCIgOiAiZmxvYXQiKTsKICAgICAgICAgfQotICAgICAgICBpZiAoIWZvcm1hdCkgewotICAgICAgICAgICAgcHJpbnRmKCJjb25zdCBpbnQzMl90IFJFU0FNUExFX0ZJUl9DT0VGX0JJVFMgICAgICA9ICVkO1xuIiwgbmMpOwotICAgICAgICB9Ci0gICAgICAgIHByaW50ZigiXG4iKTsKLSAgICAgICAgcHJpbnRmKCJzdGF0aWMgJXMgcmVzYW1wbGVGSVJbXSA9IHsiLCAhZm9ybWF0ID8gImludDMyX3QiIDogImZsb2F0Iik7CiAgICAgfQogCiAgICAgaWYgKCFwb2x5cGhhc2UpIHsKQEAgLTI2MCwxMiArMjY3LDE1IEBACiAgICAgICAgICAgICAgICAgaWYgKCFmb3JtYXQpIHsKICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB5aSA9IHRvaW50KHksIDFVTEw8PChuYy0xKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChuYyA+IDE2KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIjB4JTA4eCwgIiwgaW50MzJfdCh5aSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIweCUwOHgsIiwgaW50MzJfdCh5aSkpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIweCUwNHgsICIsIGludDMyX3QoeWkpJjB4ZmZmZik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIjB4JTA0eCwiLCBpbnQzMl90KHlpKSYweGZmZmYpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlLjlnJXMgIiwgeSwgZGVidWcgPyAiLCIgOiAiZiwiKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlLjlnJXMiLCB5LCBkZWJ1ZyA/ICIsIiA6ICJmLCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaiAhPSBuemMtMSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAiKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTI4MywyMyArMjkzLDIyIEBACiAgICAgICAgICAgICAgICAgaWYgKCFmb3JtYXQpIHsKICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB5aSA9IHRvaW50KHksIDFVTEw8PChuYy0xKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChuYyA+IDE2KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIjB4JTA4eCwgIiwgaW50MzJfdCh5aSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIweCUwOHgsIiwgaW50MzJfdCh5aSkpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIweCUwNHgsICIsIGludDMyX3QoeWkpJjB4ZmZmZik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIjB4JTA0eCwiLCBpbnQzMl90KHlpKSYweGZmZmYpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlLjlnJXMiLCB5LCBkZWJ1ZyA/ICIiIDogImYiKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlLjlnJXMiLCB5LCBkZWJ1ZyA/ICIsIiA6ICJmLCIpOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyAmJiAoaT09bnpjLTEpKSB7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsICIpOworICAgICAgICAgICAgICAgIGlmIChpICE9IG56Yy0xKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICghZGVidWcpIHsKKyAgICBpZiAoIWRlYnVnICYmIGRlY2xhcmF0aW9ucykgewogICAgICAgICBwcmludGYoIlxufTsiKTsKICAgICB9CiAgICAgcHJpbnRmKCJcbiIpOwo=